OmniAICreator/Qiita-1.07M huggingface dataset:
AWS EC2 リージョン別 料金比較

AWSの勉強のため、一番お金がかからないリージョンについて調べてみました。
EC2料金表からコスト比較しました。(他のAWSソリューションも同じ割合かどうかは知りません)

調査日:2015.07.20

# AWS EC2料金比較

|リージョン名|Asia Pacific (Tokyo)|Asia Pacific (Singapore)|Asia Pacific (Sydney)|EU (Frankfurt)|EU (Ireland)|South America (Sao Paulo)|US East (N. Virginia)|US West (N. California)|US West (Oregon)|AWS GovCloud|
|:---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|
|インスタンスタイプ/リージョンコード|ap-northeast-1|ap-southeast-1|ap-southeast-1|eu-central-1|eu-west-1|sa-east-1|us-east-1|us-west-1|us-west-2|us-gov-west-1|
|t2.micro|$0.02|$0.02|$0.02|$0.015|$0.014|$0.027|$0.013|$0.017|$0.013|$0.015|
|t2.small|$0.04|$0.04|$0.04|$0.03|$0.028|$0.054|$0.026|$0.034|$0.026|$0.031|
|t2.medium|$0.08|$0.08|$0.08|$0.06|$0.056|$0.108|$0.052|$0.068|$0.052|$0.062|
|t2.large|$0.16|$0.16|$0.16|$0.12|$0.112|$0.216|$0.104|$0.136|$0.104|$0.124|
|m4.large|$0.183|$0.187|$0.177|$0.15|$0.139|-|$0.126|$0.147|$0.126|-|
|m4.xlarge|$0.366|$0.374|$0.354|$0.3|$0.278|-|$0.252|$0.294|$0.252|-|
|m4.2xlarge|$0.732|$0.748|$0.708|$0.6|$0.556|-|$0.504|$0.588|$0.504|-|
|m4.4xlarge|$1.464|$1.496|$1.416|$1.2|$1.112|-|$1.008|$1.176|$1.008|-|
|m4.10xlarge|$3.66|$3.74|$3.54|$3|$2.78|-|$2.52|$2.94|$2.52|-|
|m3.medium|$0.096|$0.098|$0.093|$0.079|$0.073|$0.095|$0.067|$0.077|$0.067|$0.084|
|m3.large|$0.193|$0.196|$0.186|$0.158|$0.146|$0.19|$0.133|$0.154|$0.133|$0.168|
|m3.xlarge|$0.385|$0.392|$0.372|$0.315|$0.293|$0.381|$0.266|$0.308|$0.266|$0.336|
|m3.2xlarge|$0.77|$0.784|$0.745|$0.632|$0.585|$0.761|$0.532|$0.616|$0.532|$0.672|
|us-east-1を基準とした場合の価格比率|148%|150%|144%|118%|109%|175%|100%|121%|100%|122%|

## 参考

* [EC2-料金表](http://aws.amazon.com/jp/ec2/pricing/)
* [Regions and Availability Zones](http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html)
* [AWS GovCloud (US) Endpoints](http://docs.aws.amazon.com/govcloud-us/latest/UserGuide/using-govcloud-endpoints.html)

# 結論

|安い順|リージョンコード|割合|
|---:|:---:|---:|
|1|us-east-1|100.0%|
|1|us-west-2|100.0%|
|3|eu-west-1|109.3%|
|4|eu-central-1|117.7%|
|5|us-west-1|120.7%|
|6|AWS GovCloud|122.2%|
|7|ap-southeast-1|144.3%|
|8|ap-northeast-1|147.6%|
|9|ap-southeast-1|149.7%|
|10|sa-east-1|175.2%|

us-east-1(ヴァージニア)か、us-west-2(オレゴン)を使うのがコスト優位のようです。
ap-northeast-1(東京)は約1.5倍かつ、円安(124.1円/$ ※)の影響でお財布には優しくないです。

※2015/07/20 現在
CloudFormationを使って開発・ステージング・本番環境を自動構築する

よければサンプルとしてお使い下さい (\( ˘ω˘)/)
## URL
以下をCloudFormationのStack作成時に指定する。
[https://gist.github.com/Twinuma/f8d9dcd7c31743daf72e](https://gist.github.com/Twinuma/f8d9dcd7c31743daf72e)

## 構築内容説明
### 開発環境
- Tokyoリージョンに作成
- DMZ,TRUSTそれぞれMulti-AZに配備
- RouteTableはinternet gateway用とvpc endpoint用を別途作成
- security groupは、web,db,elbそれぞれ作成
- webのsecuritygroupはhttp,sshのみ許可
- dbはMYSQLをweb securitygroupがアサインされているインスタンスのみ許可
- elbはhttpのみ許可
- ELBも作成済み

### ステージング環境・本番環境
- Tokyoリージョンに作成
- DMZ,TRUST,NATそれぞれMulti-AZに配備
- RouteTableはinternet gateway用とvpc endpoint用、NAT用を別途作成
- security groupは、web,db,elbそれぞれ作成
- webのsecuritygroupはhttp,sshのみ許可
- dbはMYSQLをweb securitygroupがアサインされているインスタンスのみ許可
- elbはhttpのみ許可
- ELBも作成済み

## 構成図
![構成図.png](https://qiita-image-store.s3.amazonaws.com/0/24337/e293e702-6f49-e751-a806-312d0051c4e0.png)
「進捗どうですか」プログラムにおける形態素解析エンジンMeCabの適用

震源はこちら @esehara@github さんの記事。

- [「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるClojure](http://qiita.com/esehara@github/items/c57cafa57aa92dc1e3c2)

派生

- [「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるプログラム](http://elephnote.com/blog/archives/936) C++
- [「進捗・どう・です・か」をHaskellで書いてみた](http://qiita.com/lotz/items/b47913cb27052cf9e127)
- [golang の進捗どうですか](http://qiita.com/mattn/items/4b4ce89396d660a155a9)
- [Elixir - 進捗どうですか？](http://qiita.com/A-gen/items/6a8974d4dc7e3f4695f7)
- [進捗どうですかブーム?にrubyでのっかってみる](http://qiita.com/kataware/items/edc8d0f02a16a21c47dc)
- [進捗どうですかブーム??にPythonでのりかかってみる](http://qiita.com/hisatoshi/items/0ccca55168d58a940661)
- [進捗どうですかブーム???にShellScriptで挑むフリしてExpectに逃げる]
(http://qiita.com/mpyw/items/e5a93e7195d8a8284a1f)
- [進捗どうですかブーム???に Perl でのりかかる](http://qiita.com/b_wind/items/06c56c898a988c2463fe)
- [「進捗・どう・です・か」をPHPで書いてみた](http://qiita.com/kiimiiis/items/2f98e19d00616d95d0ce)
- [bat - 「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるバッチ](http://qiita.com/sawa_tsuka/items/d8d43d4b1f8e7865ad5c)
- [「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるプログラム（C#で挑戦）](http://qiita.com/moto_pipedo/items/e7f924585c762b0da4a7)
- [「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるプログラム（C#/LINQ）](http://qiita.com/shoooo/items/ec84418c37f08ecf7576)

- [真夏の夜の淫夢 - 1145148101919ブームにShellScriptで普通に挑む](http://qiita.com/844196/items/51b5c2cf5449310909f1)
- [危険シェル芸 - 激しい進捗確認の嵐でマシンリソースを高速に喰いつぶすワンライナー](http://qiita.com/neunetneucom/items/dc1f62d22927350e45fe)

## 概要
~~まぁ乗り遅れたよね~~

従来提案された「進捗どうですか」系プログラムはいずれも、題材に扱う文章の形態素を人力で分けて、ソースコードに書き込む必要があります。

ある文章のもつ形態素を機械的に抽出できれば、ソースコードを改変することなく任意の文章でこのプログラムを利用できます。これを可能にする形態素解析オープンソースエンジンとしてMeCabがあります。MeCabを適用することで、好きな文章で「進捗どうですか」プログラムを気軽に実行できます。

## 実装
RubyにはMeCabバインディングの`natto gem`があるのでこれを利用します。[ここ](http://qiita.com/kataware/items/edc8d0f02a16a21c47dc)のコメントを参考に。

```ruby:dou.rb
require "natto"
class Natto::MeCab
  def morphemes(sentence_string)
    # 入力文章の形態素の配列を返却。 "進捗どうですか" => ["進捗","どう","です","か"]
    parse(sentence_string).each_line.map{|s| s[/^(.*?)\t/,1] }.compact
  end
end

input = ARGV[0] || "進捗どうですか"
dic   = Natto::MeCab.new.morphemes(input)
str   = ''

print dic.sample.tap{|c| str << c } until str[-(input.size)..-1] == input
puts "！！！！"
puts
```

## サンプル
![スクリーンショット 2015-07-20 18.20.26.png](https://qiita-image-store.s3.amazonaws.com/0/29945/5cbb839a-265d-5898-5e6d-9b8703a651cd.png)

こちらからは以上です。


## 参考
- [rubyのmecabバインディングnattoを使う](http://qiita.com/k-shogo/items/0f8a98c52913c729c7eb)
homebrewにnodebrewを導入する時の備忘録

Webアプリケーションを作成するにあたり、MacのOS Xオペレーティングシステム上で動作するPackageManagerで動作するhomebrewからnodebrewを導入するにあたってハマった点をメモしておく。

1. YosemiteにUpgradeしたところ、homebrewそのものが動かなくなった。
2. brew install nodebrewとして、nodebrewのインストール自体は上手くいったもののその後の個別のnodeをインストールしようとした時に、node packageのfetchでこけた。

まず、１については今までのMACは標準でRuby1.8が組み込まれていたものの、今回のUpgradeでそれが無くなってしまった事が原因であった。幸いhomebrewはgitで管理されており、gitのマスターブランチを/usr/local（即ちhomebrewのrootディレクトリ)でpullしたところ上手く修正する事ができた。

`git pull origin master`

次に２について

```
ymac:~ yt$ nodebrew install-binary latest
fetch: http://nodejs.org/dist/v0.12.7/node-v0.12.7-darwin-x64.tar.gz
Warning: Failed to create the file
Warning: /usr/local/var/nodebrew/src/v0.12.7/node-v0.12.7-darwin-x64.tar.gz:
Warning: No such file or directory
curl: (23) Failed writing body (0 != 2502)
```

というエラーが表示されてしまった。原因についてはよくわからないが、`brew doctor`で診断したところxCodeのバージョンが古いと言われたため、これを更新したところ無事ダウンロードする事ができた。

他細かい調整として、/usr/local/var/nodebrew以下でnodeのパッケージを管理したいため、.bash_profileに`export NODEBREW_ROOT=/usr/local/var/nodebrew`を記述。これによりhomebrewでの管理対象を/usr/local以下にまとめられ、管理が行いやすくなる。またこのままだとnodeのパスが通らないという問題があるため.bash_profileに合わせて`export PATH=$NODEBREW_ROOT/current/bin:$PATH`を書いておく必要がある。

これにて設定は終了。
cssで画面の中央に表示する。

メモ。
cssでブラウザのウィンドウの中央に表示する。
仕組みとしては、ボックスを作ってそれをただ中央に表示しているだけ。
背景をそれぞれ設定しているので、コピペすると分かりやすいかも。
背景を全体に設定するときは、cssのbody要素にのみ設定するだけで良いみたい。


```lang:html

<div class="centerMiddle">
　　ボックスを画面中央に表示する。
</div>

```


```lang:css

html,body{
	hight: 100%;	/*高さを100％に設定*/
}

body{
	margin: 0;
	padding: 0;
	positiion: relative;
	min-width: 600px;	/*中央配置するボックスの横幅*/
	min-height: 400px;	/*中央配置するボックスの縦幅*/
	background-color:#00bfff;
}

.centerMiddle{
	margin: -200px 0 0 -300px; 	/*縦横半分をネガティブマージンでずらす*/
	position: absolute; 	/*body要素に対して絶対配置*/
	top: 50%;		/*上端を中央に*/
	left: 50%;		/*左端を中央に*/
	width: 600px;	/*横幅*/
	height: 400px;	/*縦幅*/
	background-color:#00ff00;
}

```
Elixir でFizzBuzz


Elixir さわってみた記念にFizzBuzzを書いてみました。

```fizzbuzz.exs
defmodule Fizzbuzz do
  def process(limit) do
    process(1, limit)
  end

  def process(n, limit) when n > limit do
    IO.puts "done."
  end

  def process(n, limit) do
    case n do
      n when rem(n, 15) == 0 ->
        IO.puts "fizzbuzz"
      n when rem(n, 5) == 0 ->
        IO.puts "buzz"
      n when rem(n, 3) == 0 ->
        IO.puts "fizz"
      n ->
        IO.puts n
    end

    process(n + 1, limit)
  end
end

System.argv |> List.first |> String.to_integer |> Fizzbuzz.process
```

[FizzBuzz in Elixir](http://www.leighhalliday.com/fizzbuzz-in-elixir)

パターンマッチをちゃんと勉強しようと思います。
TypeScript の JSX/React サポートを試す

1.5.0-beta には入っていません (2015/07/21 追記: 1.5.3 にも入っていません。 1.6 で入る模様) が、 TypeScript の master ブランチでは、 JSX/React がサポートされています。

* [Decoupled typing for JSX and React](https://github.com/Microsoft/TypeScript/issues/3203)

React/Flux の TodoMVC のサンプルコードを、これを使って TypeScript 化してみました。

コードはこちらから見られます。

* https://github.com/kimamula/ts-react

こちらのサイトの説明を参考にさせていただきました。

* [Typescript and JSX](http://www.jbrantly.com/typescript-and-jsx/)

# ポイント

* JSX を書くときは拡張子を .tsx にする
* component は `React.Component<P, S>` を extends したクラスを作成する
    * `P` は props の型、 `S` は state の型
    * `React.createClass` で作ると、クラス内での `this` の参照がうまく解決できないので避けたほうがよいと思われる
* `getInitialState()` は、 `React.createClass` で作ったクラスでしか機能せず、上記の方法でクラスを作った場合は使えない
    * メソッドを定義するとコンソールに warning が出力され、実際 state が undefined になってしまう
    * constructor で初期化すれば OK (constructor の引数が props なので、 state の初期値が props に依存する場合でも対応可)
* tsc のオプションの `--jsx`
    * `preserve`: jsx の記法のまま (`<div/>` -> `<div/>`)
    * `react`   : react のメソッドを使った記法に変換される (`<div/>` -> `React.createElement("div")`)
    * サンプルコードでは、 JS 変換後に reactify とかするのが面倒だったので、 `--jsx react` しました

# サンプル

一例として、 TodoTextInput.tsx のコードを貼っておきます。

```ts
/// <reference path="../../typings/tsd.d.ts" />
import * as React from 'react';

let ENTER_KEY_CODE = 13;

export interface Props {
    className?: string;
    id?: string;
    placeholder?: string;
    onSave: (value: string) => void;
    value?: string;
}

export default class TodoTextInput extends React.Component<Props, {value: string;}> {

    constructor(props: Props) {
        super(props);
        this.state = { 'value': props.value ? props.value : '' };
    }

    render(): JSX.Element  {
        return (
            <input
                className={this.props.className}
                id={this.props.id}
                placeholder={this.props.placeholder}
                onBlur={() => {
                    this.save();
                }}
                onChange={(event: React.FormEvent) => {
                    this.onChange(event);
                }}
                onKeyDown={(event: React.KeyboardEvent) => {
                    this.onKeyDown(event);
                }}
                value={this.state.value}
                autoFocus={true}
            />
        );
    }

    private save(): void {
        this.props.onSave(this.state.value);
        this.setState({ 'value': '' });
    }

    private onChange(event: React.FormEvent): void {
        this.setState({ 'value': event.target['value'] });
    }

    private onKeyDown(event: React.KeyboardEvent): void {
        if (event.keyCode === ENTER_KEY_CODE) {
            this.save();
        }
    }

}

```

# ちなみに

単に TypeScript の JSX/React サポートを試すだけなら、 component だけ書いておけばよかったわけですが、なぜ Flux 一式書いてみたかというと、 [ts-eventemitter](https://www.npmjs.com/package/ts-eventemitter) という自作ライブラリを試してみたかったからです。

それについては別途記事を書く予定です。 -> 書きました [TypeScript の機能で EventEmitter のイベントの payload を型安全に扱う](http://qiita.com/kimamula/items/82704786af4ef49630fe)
Arduinoで4桁7セグLEDを使った記録

初心者すぎて7セグLEDの配線で毎回悩むので、記録の意味でFritzingで図を描いてみました。

## 使ったパーツ

- Arduino Pro Mini
- ブレッドボード（830穴）
- 200Ω抵抗 x8
- 100KΩ抵抗 x8
- NPNトランジスタ C1815 x4
    - ピンの順序はECB。EBCのトランジスタもあるらしいので注意。
- 4桁7セグLED（カソードコモン）
    - Aitendoで30円で買ったもの
    - データシートが無かったので他の赤色LEDを参考に電流制限抵抗の値を決めた

## 接続の概要

200Ω抵抗はLEDの電流制限抵抗。抵抗値が適当かどうかは後で考察します。

![7seg4digit.png](https://qiita-image-store.s3.amazonaws.com/0/46856/e846b1f8-1ff1-4afd-dccc-188e8ce98b33.png)

9ピンから2ピンを抵抗を介して各セグメント（A..G, DP）に、また10ピンから13ピンをトランジスタを介して1桁目から4桁目にそれぞれ接続しました。

## トランジスタを入れる意味

トランジスタは電流の増幅用です。カソードには最大でLED 8本分の電流が流れるので、Arduinoのデジタルピンを直結すると最大負荷（40mA）を超えてしまう可能性があります。そこで、デジタルピンを直結する代わりにトランジスタを入れます。

トランジスタを入れた場合、直結していた場合とは桁指定の論理が逆になることにも注意が必要です。直結する場合、カソード側は普段はHIGHで、その桁を点灯させる場合のみLOWにします。一方、トランジスタを入れた場合はHIGHにしたときに電流が流れるため、普段はLOWで点灯時はHIGHとなるわけです。

## 測定

この状態で1桁の全セグメントを点灯させた場合にC1815のエミッタに流れる電流を測定したところ、62.6mAでした。この場合トランジスタは必須だと言えるでしょう。LED1個あたり8mA弱の計算なので、もう少し大きい電流を流す余裕がありそうですね。

また、電流制限抵抗を510Ωに変えて同じ測定をしたところ、流れる電流は44.6mAになりました。この7セグLEDの場合、トランジスタを用意できない場合は電流制限抵抗を600Ω付近にすればコモンとピンを直結しても良さそうです。

## ソースコード

この回路を実際に動作させてみましょう。整数でカウントアップするだけのソースを示します。

ここでは7セグLED用ライブラリ[DeanIsMe/SevSeg](https://github.com/DeanIsMe/SevSeg)を利用しています。

`SevSeg::begin()`の第一引数`N_TRANSISTORS`というのがカソードコモンでNPNトランジスタを入れた場合の指定です。トランジスタ無しで直結する場合は`COMMON_CATHODE`を、アノードコモンでPNPトランジスタを入れた場合は`P_TRANSISTORS`がそれぞれ利用できます。

```cpp
#include <SevSeg.h>

SevSeg sevseg; //Instantiate a seven segment object

void setup() {
  byte numDigits = 4;
  byte digitPins[] = {10, 11, 12, 13}; // 左が上位桁
  byte segmentPins[] = {9, 8, 7, 6, 5, 4, 3, 2}; // A..G, DPの順

  sevseg.begin(N_TRANSISTORS, numDigits, digitPins, segmentPins);
}

void loop() {
  int i;
  for (i = 0; i < 10000; i++) {
    sevseg.setNumber(i, 0);
    sevseg.refreshDisplay();
    delay(20);
  }
}
```

## 参考

トランジスタの抵抗の入れ方について参考にしたページが見つからず…。

- [7セグメントLEDの点灯](http://www.cqpub.co.jp/hanbai/books/37/37271/37271_3syo.pdf) (PDF)
Crystalでインラインアセンブラ

0.7.4から(部分的に、というかんじのようですが)インラインアセンブラを使えるようになりました。

https://github.com/manastech/crystal/commit/647ecc773acc89b54c5d73e015a0d671feeb3eac

さっそく試してみます。
環境はx86_64です。

```crystal
def syscall(n : UInt64) : UInt64
  dst :: UInt64
  asm("syscall" : "={rax}"(dst)
      : "rax"(n)
      : "rcx", "r11", "memory"
      : "volatile")
  dst
end
 
GETPID = 39_u64
p syscall(GETPID) == Process.pid  ## => true
```

gcc拡張構文のsyntaxがそのまま使えるので、新しく文法を覚えなくてもよいのがいいですね。
c++ builder XE4, 10.2 Tokyo > IDE > フォームデザインでコンポーネント選択時に移動してしまうのを防ぐ > 右クリックで選択 / Shift押しながら / Ctrlを押しながら

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2
```

フォームデザイン時にコンポーネントのプロパティを変更したいだけなのに、コンポーネント選択時に誤って移動してしまうことがある。

いらっとする。

#対策1 > 右クリック
コンポーネント選択は右クリックすると移動を防げる。代わりにコンテキストメニューが表示される。

気づいたら「なんだ」と思うことだが、誤って移動することがなくなり作業がやりやすくなった。

#対策2 > Shift押しながら左クリック

こちらでも移動することがない。

#対策3 > Ctrlを押しながら左クリック

こちらでも移動しない。
右クリックの場合はコンテキストメニューが表示されてしまうが、Ctrlを押しながらの場合はコンテキストメニューは表示されないので、複数のコンポーネントをインスペクタで順番に見たい時はこちらがいい。
Windows で Jetty で Qiita のように使える Knowledge を動かしてみる

# Knowledge

https://support-project.org/knowledge_info/index で配布している Qiita ライクな Markdown で書ける情報集積 Web アプリです。

Java で書かれているので Servlet コンテナが必要なので例によって Jetty で動かしてみます。

# インストール

## 単純なインストール

war ファイルを jetty.base ディレクトリに置くだけ・・・と思ったら JSP を有効にしなきゃいけないというエラーが出る。色々調べたら jetty.base ディレクトリにある start.ini ファイルに `--module=jsp` と書けば良いらしい。

## データ保存ディレクトリの設定

このままだと「Jettyを実行したユーザのホームフォルダの.knowledge」という、Windows の場合は訳のわからない場所にデータフォルダが作られてしまいます。

そこで、[リリースv0.5.1](https://github.com/support-project/knowledge/releases/tag/v0.5.1) で追加された機能の、環境変数KNOWLEDGE_HOME を使った設定を行います。

http://qiita.com/kounoike/items/37bcd898625c2e16950f に書いたように、Jetty サービスのインストールを行うバッチファイルで`++Environment`と書けば環境変数の設定ができます。
c++ builder > Form1からForm2のコンポーネントをFindComponentで取得する > Form2->FindComponent(...

```txt:動作確認
C++ builder XE4
```

Form1上のコードからForm2上のコンポーネント(Edit1)をFindComponent()で見つける方法。
どうやら以下でいいようだ。

```cpp:Unit1.cpp
// Form1のソース

TEdit *edPtr;

edPtr = (TEdit *)Form2->FindComponent( L"Edit1" );
```

よくわからずに、FindComponent(L"Form2->Edit1")として失敗していた。
canonicalとalternateを挿入するシェルスクリプト

#URL正規化タグを挿入するシェルスクリプト

スマホ用テンプレート(*_sp.html)とPC用テンプレート(*.html)を別途で作成していて
URL正規化タグをいれるの忘れた時にチカラを発揮します。


### 特徴
* titleタグのすぐ下に挿入されます。
* 相対パスで記述されます。
* バックアップをとっているか聞いてきます。(聞いてくるだけでバックアップはしません)
* ブレイクポイント(media screen)を対話型で指定できます。defaultはmedia=only screen and (max-width: 787px)です。


## 使い方
1. 対象のディレクトリにurl_ca.shファイルを保存してください。
2. ターミナルを起動
3. $ cd で対象ディレクトリに移動
4. $ ./url_ca.shで実行

-bashエラーになる時は、
chmod u+x ./url_ca.sh
などをして、実行権限を自身に付与してから再度./url_ca.shを実行してみてください。


## シェルスクリプト
```lang:url_ca.sh
#!/bin/bash
# このファイルを対象フォルダにコピーしてターミナルから実行すると
# *_sp.htmlにはcanonicalが
# *.htmlにはalternateが入ります
COLOR_Y="\033[0;33m"
COLOR_R="\033[0;31m"
COLOR_M="\033[0;35m"
COLOR_OFF="\033[0;m"
LF=$(printf '\\\012_')
LF=${LF%_}
echo -e "${COLOR_M}Hi! it will continue to insert text 'canonical' or 'alternate' in htmls for SEO."
echo -e "Already backed up were taken?${COLOR_OFF} [yes/no]"
read backupYes
case `echo $backupYes | tr y Y` in "" | Y*)
		echo -n -e "${COLOR_Y}OK! and Please enter breakpoint px. default [787]  ${COLOR_OFF}"
		read brakePoint
		defaultBP=787
		if [[ "$brakePoint" = "" ]]; then
			brakePoint=$defaultBP
		fi
		echo -e "${COLOR_Y}OK!! let's run sh!!!!${COLOR_OFF}"

		pchtmls="*[^_sp].html"
		sphtmls="*_sp.html"

		for convertSP in ${sphtmls}
		do
			fileNamePC=${convertSP/_sp./.}
			title="</title>"
			canonical="</title>$LF<link rel=\"canonical\" href=\"$fileNamePC\" >"
			sed -i "" -e "s:$title:$canonical:" ${convertSP}
			echo -e "$convertSP ${COLOR_Y}FINISH!${COLOR_OFF}"
		done

		for convertPC in ${pchtmls}
		do
			mScreen="(max-width\: ${brakePoint}px)"
			fileRenameSP=${convertPC/./_sp.}
			title="</title>"
			alternate="</title>$LF<link rel=\"alternate\" media=\"only screen and $mScreen\" href=\"$fileRenameSP\" >"
			sed -i "" -e "s:$title:$alternate:" ${convertPC}
			echo -e "$convertPC ${COLOR_Y}FINISH!${COLOR_OFF}"
		done
	;;
		*) echo -e "${COLOR_R}Oops!! Do backup now hurry up!!${COLOR_OFF}";;
esac
```
スライド発表資料を作成・公開する方法


##手順

- [reveal.js](https://github.com/hakimel/reveal.js/)を使って資料を作成します

- [GitHub Pages](https://pages.github.com/)に公開します

`Revel.js`を直接使用する場合、テーマであるリポジトリを持ってきて、それを編集し、アップロードして公開する感じになります。後述する方法は、ジェネレーターを使用するため、もう少し手順が簡単になります。


##デモ

http://syui.github.io/slide-test/

## Revel.js

[Revel.js](https://github.com/hakimel/reveal.js/)というのは、簡単には以下の様なイメージ。


> [{
> "package":"bower",
> "build":"grunt",
> "theme":"reveal"
> ]}

###インストールと実行

```bash
$ npm install -g bower yo grunt-cli

$ git clone https://github.com/hakimel/reveal.js/

$ cd reveal.js

$ npm install

$ grunt serve

------------------------------------------------
$ curl http://localhost:8000
```



## generator-reveal

[generator-reveal](https://github.com/slara/generator-reveal)を使うと、`reveal`のテンプレートを`yo`コマンド一発で作成できるようになる。また、GitHub Pagesに上げやすいよう設定ファイルなども作ってくれるのでおすすめ。

> [{
> "generator":"yo",
> "package":"bower",
> "build":"grunt",
> "theme":"reveal"
> ]}

###インストールと実行

```bash
$ npm install -g bower yo grunt-cli generator-reveal

$ sudo yo reveal
# ここではGitHub Pagesに公開する設定を行います

$ sudo yo reveal:slide "Slide Title" --markdown

$ cat slides/list.json
$ vim slides/index.md

$ grunt serve

------------------------------------------------
$ curl http://localhost:9000 
```

### GitHub Pagesとして公開する方法

```bash
$ cat .yo-rc.json
{
  "generator-reveal": {
    "presentationTitle": "Reveal.js and Yeoman is Awesomeness",
    "packageVersion": "0.0.0",
    "useSass": true,
    "deployToGithubPages": true,
    "githubUsername": "syui",
    "githubRepository": "slide-test"
  }

$ grunt serve

$ grunt dist

$ cd dist  

$ git init  
$ git add *
$ ...
# repositoryのmasterにpushする
  
$ git checkout -b gh-pages

$ git push -u origin gh-pages

# 更新とかする際はこのコマンドで行けるかもしれない
$ grunt deploy

# あと、`branch:gh-pages`が有効に動作するには`user.github.io`のリポジトリを`branch:master`で作成しておかなければならないかもしれない
```

##カスタマイズ

見た目がダサいのでシンタックスハイライトを`monokai`に変更し、バックグラウンドカラーを`white`にしてみた
###シンタックスハイライト

templates/_index.html

```html
<link rel="stylesheet" href="bower_components/highlightjs/styles/monokai_sublime.css">
```


###バックグラウンドカラー

```bash
$ cd bower_components/reveal.js/css/theme/

$ cp source/white.scss template/ 
```

css/source/theme.scss

```css
// Theme template ------------------------------
@import "../../bower_components/reveal.js/css/theme/template/white";
//@import "../../bower_components/reveal.js/css/theme/template/theme";
```
TyranoScript書式入門

* [タグリファレンス - ティラノスクリプト｜スマホ対応のノベルゲームエンジン、アプリ化にも対応。](http://tyrano.jp/home/tag)

# 基本書式

## 最初に編集するファイル

* data/scenario/first.ks

## 書式

* `*start` startシーン。ラベルのようなもの。
* `@jump target="*start"` *startに飛ぶ
* `;`コメントアウト
* `[l]` クリックまち
* `[r]` 改行
* `[cm]` 文字クリア
* `[s]` stop

```sh:先頭にタブ入れたら見やすい
@bg storage ="room.jpg"

*start
        ;[position vertical=true]
        [position height=160 top=300]
        このよう記述することもできます。[l][r]
        @jump target="*common"

*common
        こもんです[l][r]
```

## テキスト枠

```sh:画面下に小さく表示
[position height=160 top=300]
```

```sh:全画面表示
[position layer="message0" left=10 top=10 height=450 page=fore visible=true]
```

## 画像

```sh:背景画像(初期値)
@bg storage ="room.jpg"
```

```sh:背景画像変更
[bg storage=rouka.jpg]
```

```sh:キャラクタの表示、非表示
[chara_new name="yuko" storage="normal.png" jname="ゆうこ"]
[chara_show name="yuko"]

[chara_new name="haruko" storage="haruko.png" jname="はるこ"]
[chara_show name="haruko"]

[chara_hide name="yuko"]
[chara_hide name="haruko"]
```

* [簡単キャラクターモード](http://tyrano.jp/adv/next/chara)

```sh:表情
;表情の登録
[chara_face name="yuko" face="angry" storage="newface.png"]
;表情の適応
[chara_mod name="yuko" face="angry"]
```

```sh:560x400の大きさで表示
[image layer=1 page=fore visible=true top=10 left=50 width=560 height=400  storage = builder.png]
[freeimage layer=1]
```

```sh:画像設置(data/fgimage/)
[image layer=1 page=fore visible=true top=200 left=250  storage = kirikiri.png]
[l][r]
[freeimage layer=1]
```

## 効果

```sh:音楽再生
@fadeinbgm time="3000" storage=music.mp3 loop=true
```

```sh:横揺れ
[quake count=5 time=300 hmax=20]
```

```sh:文字
[font color="red"]あかい文字[resetfont]
[font size="40"]大きい文字[resetfont]
```

```sh:ルビ
[ruby text=ふ]振る
```

```sh:タイトル
[title name="ティラノスクリプト解説"]
```

## 動画

* data/video/ に格納。

```
[movie storage="a.mp4" skip=true]
```

firefoxでも強制的に再生を試みたい場合はコメントアウト。Macで再生出来ました。

```diff:tyrano/plugins/kag/kag.tag_ext.js
 //firefoxの場合は再生できない旨、警告
 if($.getBrowser()=="firefox"){
+    //alert("ご利用のブラウザでは、ムービーを再生できません。飛ばします。");
+    //that.kag.ftag.nextOrder();
+    //return;
 }
```

* ブラウザでキャッシュされるため、動画差し替えたあとはキャッシュのクリアしたほうが良い。

# [桜を舞い散るプラグイン](http://tyrano.jp/plugins/detail/3)

* 重たい処理のため、短時間でstopしたほうがよい。

```sh:開始
[call storage="sakura/sakura.ks"]
[sakura_start]
```

```sh:停止
[sakura_stop]
```

## macでwiiコントローラを使う場合

* [wjoy](https://code.google.com/p/wjoy/downloads/list)でMacからコントローラ認識
* [Enjoy2-1.2.1.zip](http://nongraphical.s3-website-us-east-1.amazonaws.com/releases/Enjoy2-1.2.1.zip) でキー割り当て

## 素材

* [SE・効果音素材 | フリーBGM・音楽素材 MusMus](http://musmus.main.jp/se.html)
enumとi18nとactive_decoratorで表示処理がスッキリ


# はじめに
モデルの状態を表す日本語文字列をどこにおくべきか迷ってました。
同僚から[i18n](http://railsguides.jp/i18n.html)と[enum](http://railsguides.jp/4_1_release_notes.html#active-record-enums)と[active_decorator](https://github.com/amatsuda/active_decorator)を使うことを提案されて、試してみたらもやもやが晴れたのでまとめました。

# 環境
* ruby 2.2.1
* rails 4.2.3
* [サンプルソース](https://github.com/ken1flan/rails_enum_i18n_active_decorator_sample)


enumはrails4.1から導入されたので、それ以降ならたぶん大丈夫です。

# なんかもっさりしたコード

```app/models/article.rb
class Article < ActiveRecord::Base
  STATUS_DRAFT = 0
  STATUS_PUBLIC = 1
  STATUS_DISABLED_BY_ADMIN = 2

  STATUS_LABELS = {
    STATUS_DRAFT => "下書き",
    STATUS_PUBLIC => "公開中",
    STATUS_DISABLED_BY_ADMIN => "管理者により非公開中",
  }

  def active?
    status == STATUS_PUBLIC
  end

  def status_label
    STATUS_LABELS[status]
  end
end
```

ステータスを数値型にしています。
ステータス値を意味ある文字列で扱えるように、定数を定義したり、
ビューでの表示用の日本語ラベルを定義したりしています。
いろいろモデルに固まってて、微妙でした。

# 書きなおしたコード

```app/models/article.rb
class Article < ActiveRecord::Base
  enum status: { draft: 0, opened: 1, closed_by_admin: 2 }

  def active?
    opened?
  end
end
```

ステータスをenumで定義して…

```config/application.rb
config.i18n.default_locale = :ja
```

デフォルトのロケールを`ja`にして…

```config/locales/application_ja.yml
ja:
  articles:
    statuses:
      draft: 下書き
      opened: 公開中
      closed_by_admin: 管理者により非公開中
```

モデル内で定義してあった日本語ラベルをi18nに移して…

```Gemfile
gem "active_decorator"
```

[active_decorator](https://github.com/amatsuda/active_decorator)を導入して…

```app/decorators/artcible.rb
module ArticleDecorator
  def status_label
    t("articles.statuses.#{status}")
  end

  def status_labels
    Article.statuses.map {|k, v| [t("articles.statuses.#{k}"), k] }
  end
end
```

ビューでだけ使いそうなラベル表示用のメソッドをdecoratorに移しました。

# 気持ちよくなったところ

* 自分で作らなくても、ステータス設定や問い合わせが`#opened!`や`#opened?`でできること
* 日本語の定数がモデルから排除できたこと
* 表示用のメソッドをモデルから排除できたこと
「文言」の読み方

エンジニアの中に「文言」を「もんげん」と読む人がいることに気づきました。僕は、「もんごん」と読み、「もんげん」には違和感があります。

よく考えてみると、「文言」は4通りの読み方があると思いました。

1. ぶん・げん
* もん・げん
* ぶん・ごん
* もん・ごん

以上が音読みのパターンで、訓読みとして「ふみ・こと」という読み方もあるかもしれません。

## 呉音・漢音

気になって調べてみると、日本語のシステムとして同じ音読みにも大きく「呉音」と「漢音」の2つのタイプがあることが分かりました。あまり多くないそうですが「唐音」というもあるそうです。

```
漢字の読み
├── 訓読み
└── 音読み
    ├── 呉音
    ├── 唐音
    └── 漢音
```

「文」を「もん」、「言」を「ごん」と読むのが呉音、一方の「ぶん」と「げん」は漢音だそうです。そして、熟語を読むときは呉音または漢音のどちらかで読み、呉音と漢音は基本的にまぜないのが日本語の傾向のようです。なので呉音と漢音がまじった「もんげん」や「ぶんごん」に違和感を感じるのはこうした習慣があるからです。ただ「人月(にんげつ)」のように呉音・漢音が混じった単語もあります。


## なぜ複数の読み方があるか

漢字の読み方が一種類であったほうが混乱がなさそうです。では、なぜ複数の読み方があるのか？気になったので調べてみました。

結論から言うと、読み方が中国から日本に伝わった時期が違うのと、中国も方言があって読み方の起源になった地域が違うから、ということでした。

### 呉音

漢字というと奈良時代の遣隋使が日本に持ち帰ったイメージですが、それよりも前の5〜6世紀頃に伝来し日本で定着していた漢字音があって、それを呉音というそうです[^呉音wikipedia]。揚子江下流方面の南方方言からであろうと推定されている[^呉音地域]ということなので、今の上海の近くの方言が呉音のルーツのようです。

![Yangtze_River_-_Google_Maps.png](https://qiita-image-store.s3.amazonaws.com/0/889/2cecb02d-e2de-49e1-29c0-27a1d270417e.png)

呉音は仏教で使われることが多いそうです。「利益」を仏教で「りやく」というのは呉音の影響が強いためです。仏教が日本に伝来したのが5〜6世紀なので、呉音と仏教はもとからセットだったんでしょう。

### 漢音

一方の漢音は、8〜9世紀ごろに遣唐使が持ち帰ったものだそうです。遣唐使の多くが、唐の首都の長安に留学していたので、中国の現在の西安市付近の方言が、漢音のルーツのようです。

![Xi_an__Shaanxi_-_Google_Maps.png](https://qiita-image-store.s3.amazonaws.com/0/889/65969768-79f6-6a63-835b-9f8e0834ac66.png)

その後、792年に漢音を正しい読み方とする勅令が出たり、明治時代に西洋科学の専門用語の翻訳に漢音が使われたため、近代的な漢語は漢音がメジャーになったとのことです。「変化」の読みとして「へんげ」より「へんか」のほうが専門的に感じるのは、こうした歴史的な文脈があるからではないでしょうか。

## 見分け方

呉音・漢音の見分け方が気になり調べてみましたが、[呉音・漢音の見分け方](http://kanjibunka.com/kanji-faq/old-faq/q0075/)にあるとおり、一定の傾向はありそうですが、感覚を養っていく他なさそうな感じがします。





[^呉音wikipedia]: [呉音 - Wikipedia](https://ja.wikipedia.org/wiki/%E5%91%89%E9%9F%B3)
[^呉音地域]: https://kotobank.jp/word/%E5%91%89%E9%9F%B3-63509
2Dの線を描画する【Unity】

いくつか方法があったので、まとめます。
## LineRenderer

空のGameObject → add component → Line Renderer を選択します。
マテリアルを設定すれば色などを設定できるようになります。

```C#:Line.cs
void Start () {
	LineRenderer renderer = gameObject.GetComponent<LineRenderer>();
	// 線の幅
	renderer.SetWidth(0.1f, 0.1f);
	// 頂点の数
	renderer.SetVertexCount(2);
	// 頂点を設定
	renderer.SetPosition(0, Vector3.zero);
	renderer.SetPosition(1, new Vector3(1f, 1f, 0f));
}
```
<img src="https://qiita-image-store.s3.amazonaws.com/0/29966/1f0abd30-0433-25fe-8203-b45d4f34c538.png" alt="スクリーンショット 2015-07-20 14.19.27.png" width="300" />

## GL.LINES

openGLの機能を直接つかって描く方法です。
空のGameObjectに以下のスクリプトを適応します。
lineMaterialには任意のマテリアルをUnity側で設定します。
この方法では線の幅を指定することができないようなので、GL.QUADSでポリゴンを作る必要があります。

```C#:GLLine.cs
public Material    lineMaterial;
void OnRenderObject () {
	lineMaterial (0);
	GL.PushMatrix ();
	GL.MultMatrix (transform.localToWorldMatrix);
	GL.Begin (GL.LINES);
	GL.Vertex3 (0f, 0f, 0f);
	GL.Vertex3 (1f, 1f, 0f);
	GL.End ();
	GL.PopMatrix ();
}
```
<img src="https://qiita-image-store.s3.amazonaws.com/0/29966/93f8c378-2b95-c919-9414-97874f56f6e6.png" alt="スクリーンショット 2015-07-20 14.34.30.png" width="300" />

## Texture2D

これはテクスチャに直接ピクセルを書き込んでいく方法です。
空のGameObject → add component → GUI Texture を選択します。

```C#:TextureLine.cs
void Start () {
	// Texture2Dの作成.
	int width  = 256;
	int height = 256;
	Texture2D texture = new Texture2D(width, height);
	GUITexture tex = GetComponent<GUITexture>();
	tex.texture = texture;
	// テクスチャを真ん中に持ってきます
	Rect rect = new Rect();
	rect.Set(0f, 0f, Screen.width, Screen.height);
	tex.pixelInset = rect;
	
	// テクスチャ描画クラスの作成.
	DrawTexture2D drawTex2D = new DrawTexture2D();
	// テクスチャへ描画開始.
	drawTex2D.Begin(texture);   
	drawTex2D.Clear (new Color(0.0f, 0.0f, 0.0f));
	// 線の描画
	drawTex2D.DrawLine(0, 0, 128, 128, new Color(1f, 0f, 0f));
	// テクスチャへ描画終了.
	drawTex2D.End();
}
```
<img src="https://qiita-image-store.s3.amazonaws.com/0/29966/4d5a1cde-2d0b-5e26-f19b-368a771a8f52.png" alt="スクリーンショット 2015-07-20 14.57.13.png" width="300" />
gitのuser.nameとuser.emailを会社/個人で自動的に切り替える方法


## 想定ユーザー

- 仕事用のコミットとプライベートなコミットはuser.nameとuser.emailを分けたい
- 個人のgitリポジトリでuser.nameとuser.emailを設定するの忘れて会社の設定でコミットしてしまった

上に当てはまる人は幸せになれるかも？

## 設定方法

- よく使う方を--globalで設定しておく（今回は仕事用）

```console
git config --global user.name "Taro Qiita"
git config --global user.email taro@qiita.com
```


- プライベートなgitリポジトリの置き場を作る

```console
mkdir ~/private
```


- `init.templatedir`を--globalで設定する（pre-commitフックを全てのリポジトリに適応するため）

```console
git config --global init.templatedir '~/.git_template'
```

- `~/.git_template/hooks`ディレクトリにpre-commitフックを作る

```shell:~/.git_template/hooks/pre-commit
#!/bin/sh
# ここにプライベートで利用するnameとemailを設定
PRIVATE_NAME="qii-taro"
PRIVATE_EMAIL="qii-taro@gmail.com"
# 上で作ったプライベートな置き場の絶対パス
PRIVATE_DIR="/Users/taro/private"

if [ $(pwd | fgrep "$PRIVATE_DIR") ]; then
  if [ "$(git config user.name)" != "$PRIVATE_NAME" -o "$(git config user.email)" != "$PRIVATE_EMAIL" ]; then
    echo "Git init in private directory. Change user.name and user.email."
    git config user.name "$PRIVATE_NAME"
    git config user.email "$PRIVATE_EMAIL"
  fi
fi
exit 0
```

- 最後にpre-commitファイルに実行権限を付与する

```console
chmod +x ~/.git_template/hooks/pre-commit
```

- 完了！

## 使い方
`~/private`以下に個人用リポジトリを置く。
このなかで`git init`したり`git clone`したリポジトリは、コミット前に勝手に`user.name`と`user.email`が書き換わるようになっている。

すでにあるリポジトリを`~/private`以下に移動させた場合、再度`git init`すればOK。
PHPUnitのインストール

PHPUnitのインストールでどはまりしたので自分用メモを兼ねて

結論としては(※1)
<pre>
wget https://phar.phpunit.de/phpunit.phar
cp phpunit.phar /usr/local/bin/phpunit
chmod +x /usr/local/bin/phpunit
</pre>

いろいろ見ていたら
いろんなサイトで記載されている
「pear.phpunit.de」
に問題がありました。
PEARでの↑配布終了しているようです。(※2)


---
引用元
※1
http://qiita.com/goosys/items/68c491c5996174de0b4f
※2(ページ下部)
http://aipacommander.hatenablog.jp/entry/2015/01/14/221859
PortForwarder 2.9.0 を Visual Studio 2013 でビルドできるようにしてみた

# PortForwarder

Windows 環境でポートフォワーディングする際、 [PortForwarder](http://toh.fuji-climb.org/pf/JP/) を利用している方は多いと思います。

GitHub の [comutt/portforwarder](https://github.com/comutt/portforwarder) に push してあります。

ビルドしたい方は [README.md](https://github.com/comutt/portforwarder/blob/master/README.md) 読んでくださいませ。

一応、 OpenSSL を 0.9.8zg に、 zlib を 1.2.8 にするところまではやっています。（OpenSSH はまだあげてません。）

ビルドしたものは [ここ](https://github.com/comutt/portforwarder/releases/tag/v2.9.1-dev-20150720-b001) からダウンロードできます。

バイナリサイズが2倍以上になってますが、なんで増えてるのかまでは調べていません。一応問題なく動いているようです。
Systemdでjubatus Classifier を起動・停止するカスタムサービスを書いた

オンライン機械学習のjubatusで、Classifierのサーバをsystemdで起動・停止するために、カスタムサービスを書いた。

`/usr/lib/systemd/system/jubatus.service` を以下の内容で作成

```
[Unit]
Description=Jubatus Classifier server daemon
After=network.target

[Service]
ExecStart=/usr/bin/jubaclassifier --configpath /path/to/jubatus_conf.json 

[Install]
WantedBy=multi-user.target
```

なんてことはない、たったこれだけでOK!

起動

```
# systemctl start jubatus
```

停止

```
# systemctl stop jubatus
```

自動起動

```
# systemctl enable jubatus
```
Sinatraを使って問い合わせフォーム（超ざっくり）の仕上げ

# はじめに

1. http://qiita.com/ms2sato/items/7c07b2079b48c49fad2a
1. http://qiita.com/ms2sato/items/eed1e3c929ac8f6195a9
1. http://qiita.com/ms2sato/items/5bd201c84dab858ee501
1. http://qiita.com/ms2sato/items/901d8c5ca77c1133522c 
1. http://qiita.com/ms2sato/items/9b102144f221f9ac5bf8

の続き。

# 各種調整

メール送信を完成させます。それぞれ整えるだけです。

```app.rb
require 'rubygems'
require 'bundler'
Bundler.require

require 'sinatra'
require 'sinatra/reloader'
require 'rest_client'

get '/' do
  erb :index  
end

get '/about' do
  erb :about
end

post '/confirm' do
  @email = params[:email]
  @message = params[:message]
  erb :confirm
end

post '/send_mail' do
  email = params[:email]
  message = params[:message]
  send_message(email, message)  

  erb :thanks
end

def send_message(email, message)
    RestClient.post "https://api:key-[secret...]"\
      "@api.mailgun.net/v3/sandbox[secret...].mailgun.org/messages",
      :from => "お問い合わせ <xxx@xxx.com>",
      :to => "MasashiSato <xxx@xxx.com>",
      :subject => "お問い合わせがきました！",
      :text => "email: #{email}さんからお問い合わせがきました。本文: #{message}"
end
```

```html+erb:views/confirm.erb
<html>
<head>
  <meta charset="UTF-8">
</head>
<body>
  <h1>お問い合わせ内容確認</h1>
  <div>
    <div>
      email: <%=@email%>
    </div>  
    <div>
      本文:
      <p>
        <%=@message%>
      </p>
    </div>    
  </div>
  <form action="send_mail" method="POST">
    <input type="hidden" value="<%=@email%>" name="email">
    <input type="hidden" value="<%=@message%>" name="message">
    <input type="submit" value="送信する">
  </form>
</body>
</html>
```

送信後のページを作成します。

```html+erb:thanks.erb
<html>
<head>
  <meta charset="UTF-8">
</head>
<body>
<h1>ありがとうございました</h1>
<p>送信しました。お返事がくるまでしばらくお待ち下さい。</p>
<p><a href="/">トップへ戻る</a></p>
</body>
</html>
```

# おしまいに

とりあえずここまでで、問い合わせ内容のメール送信ができるようになった。わーい！ただ、とりあえず実装が入っているだけで、セキュリティ面やエラー処理が全くないので実運用には耐えません。ご注意を。
MacにTypeScriptの環境を構築する

仕事で新規プロジェクトの立ち上げをする事になった。

フロントエンドとしては、JavaScriptから逃れるのは難しいけど、
今更、素のJavaScriptも無かろうということで、以前から気になっていたTypeScriptを
採用する事にした。

MacでTypeScriptを使えるようにするには、大きく分けて2ステップが必要になります。

1. Node.jsをインストール
2. npmを使って、TypeScriptをインストール

### 1. Node.jsをインストール

brewを使って、インストールします。

```
genki@iwaboos-MBA:~$ brew install node
==> Downloading https://homebrew.bintray.com/bottles/node-0.12.7.yosemite.bottle
######################################################################## 100.0%
==> Pouring node-0.12.7.yosemite.bottle.tar.gz
==> Caveats

Bash completion has been installed to:
  /usr/local/etc/bash_completion.d
==> Summary
🍺  /usr/local/Cellar/node/0.12.7: 2726 files, 31M
genki@iwaboos-MBA:~$ node -v
v0.12.7
```

インストール後、`node -v`でインストールされたNode.jsのバージョンが表示されれば、
インストール成功、という事になります。

### 2. npmを使って、TypeScriptをインストール

Node.jsのパッケージツールであるnpmを使って、TypeScriptをインストールします。

```
genki@iwaboos-MBA:~$ sudo npm i -g typescript
Password:
/usr/local/bin/tsc -> /usr/local/lib/node_modules/typescript/bin/tsc
typescript@1.4.1 /usr/local/lib/node_modules/typescript
genki@iwaboos-MBA:~$ tsc -v
message TS6029: Version 1.4.1.0
```

node.js同様、インストール後に、```tsc -v```でインストールされたTypeScriptの
バージョンが表示されれば、インストール成功！
&str を String に変換する5つの方法

`&str` を `String` に変換する主なやりかたを紹介する。性能の差は皆無に近いのでどれを使ってもいい。ただし `"str".into()` は使いどころがやや異なる。

## `"str".to_string()`

`std::string::ToString` トレイトに従って `str` が間接的に[^1]実装するメソッド。他の言語にも同名もしくは似た名前のメソッドがあるため、多くの人がまず使うのはこれであろうと思われる。このメソッドは `String::from()` にインライン化される。[^to_string]

## `"str".to_owned()`

`std::borrowed::ToOwned` トレイト[^2]に従って `str` が実装するメソッド。 `"str".to_string()` より1文字短いのが利点といえば利点。

## `String::from("str")`

`std::convert::From<T>` トレイトに従って `String` が実装する関数。メソッドと比べて `str_iter.map(String::from)` のように使えるのが利点。

## `"str".into()`

`std::convert::Into<T>` トレイトに従って `&str` が間接的に[^3]実装するメソッド。 `into()` の返り値の型が `String` と推論可能でなければエラーになるため、使いどころが限られる：

```rust
let s = "str".into();  // s の型が推論できないのでコンパイルエラーになる
println!("{}", s);
```

`into()` が活躍するのは `String` と `&str` のどちらでも引数に取れる関数を書くときだ：

```rust
fn some_string<S: Into<String>>(s: S) -> Option<String> {
    Some(s.into())
}

let s1 = some_string("str");
let s2 = some_string("str".to_string());
assert_eq!(s1, s2);
```

## `format!()`

変換というよりは整形だが、 `&str` から文字列を組み立てるには `format!()` が使える。

```rust
let name = "str";
let hello = format!("hello {name}");
```

[^1]: 次の2つの実装 `impl Display for str` と `impl<T: Display + ?Sized> ToString for T` が存在することによる。

[^2]: `ToOwned` は borrowed なデータを clone して owned なデータを得る手段を一般化するトレイト。

[^3]: 次の2つの実装 `impl<'a> From<&'a str> for String` と `impl<T, U> Into<U> for T where U: From<T>` が存在することによる。

[^to_string]: https://github.com/rust-lang/rust/blob/1.65.0/library/alloc/src/string.rs#L2572-L2574
Apache/Nginx のドキュメントルートを vboxsf にしてるとデータが壊れるのを何とかしたい

Vagrant やらで Virtualbox の共有フォルダを Apache や Nginx の ドキュメントルートに設定していると、
ホスト側からファイルに更新をかけたタイミングで、ゲスト側から見えるデータに謎データが付いたり、
データが欠けたりすることで、PHPが動かなくなったり、HTMLやCSSが崩れたり。
しかもこの状態になるとVMを上げ下げしないと解消せず、開発環境としては非常に困る場面があります。

この現象はそれぞれのソフトウェアの設定により回避できます。

## Apache の場合

サーバー設定ファイル、設定中の VirtualHost ディレクティブ、Directory ディレクティブ の
必要な箇所で下記を指定します。許可されていれば .htaccess でも指定が可能です。

```conf:httpd.conf
EnableSendfile off
```
#### :book: 参考ページ
- http://httpd.apache.org/docs/2.4/ja/mod/core.html#enablesendfile

## Nginx の場合

Nginx の場合は、http、server、location のいずれかの必要な箇所で下記を指定します。

```conf:nginx.conf
sendfile off;
```
#### :book: 参考ページ
- http://nginx.org/en/docs/http/ngx_http_core_module.html#sendfile
- http://smotko.si/nginx-static-file-problem/

## Sendfile とは何者なのか？
カーネルの機能の1つ。「ファイルディスクリプタ間でデータを転送する機能」らしい。。

ザックリと言うと Apache や Nginx では OS(Linuxの場合はKernel)がサポートする場合は、
sendfileという機能を使って、例えば 純粋なHTMLやCSS、画像などの静的ファイルへのアクセスなど、
OS判断で不要な場合は、ファイル読み込みをスキップし、OSでキャッシュしているデータを読むといった、
ファイルキャッシュ機能を提供してくれているらしい。

本来であればこれがうまく働くことでパフォーマンスが上がるはずだけども、
vboxsf を使っている場合は、共有フォルダ内の「ファイルの更新がかかった！」という通知が
うまく行かない場合があるらしく、おかしな状況になってしまうというわけのようである。
引用符で囲まれた範囲を、置換の対象外にする

引用符で囲まれた部分を「`\a(通し番号)`」（`\a` はベル記号で普通のテキストファイルには、まず存在しない）に一旦置換し、「目的の置換」が行った後に元に戻す

```lua
    --- 前処理 ---
    local save={}
    cmdline = cmdline:gsub("((['\"])[^%2]*%2)", function(s,_)
        local i=#save+1
        save[i] = s
        return '\a('..i..')'
    end)

    -- この辺で、目的の置換を行う ---

    --- 後処理 ---
    cmdline = cmdline:gsub("\a%((%d+)%)",function(s)
        return save[s+0]
    end)
```

（追記：これは nyagos の[brace.lua で二重引用符の中の{a,b}まで展開してしまうという不具合の修正](https://github.com/zetamatta/nyagos/commit/833feff04e2f5d132d032138ca6d967bd005f24f)に使った方法。これがないと nyagos でワンライナーなどを動かすのに支障があった）

Lua のパターンで行ったが、他の言語でも正規表現を行えば同等のことは出来る。Perl だと、[wifky.pl](http://wifky.osdn.jp/cgi-bin/index.cgi) という１ファイルの WikiEngine で使ってる。ちょっと引用

#### マスクする関数（wifky.pl の場合、対象が二重引用符の範囲とは限らないので引数で受け取る）

```wifky.pl
 sub verb{
     push( @::later , $_[0] );
     "\a($#::later)";
 }
```

#### マスクを外す関数

```wifky.pl
 sub unverb_textonly{
     ${$_[0]} =~ s/\a\((\d+)\)/
           $1 > $#::later
           ? "(code '$1' not found)"
           : ref($::later[$1]) eq 'CODE' ? $&
           : $::later[$1]/ge;
 }
```
Elixirのcase/cond/if


[Elixir](http://elixir-lang.org/)の[Getting Started](http://elixir-lang.org/getting-started/introduction.html)をやろうと思いまして、そのメモです。

# はじめに
[05. case, cond and if](http://elixir-lang.org/getting-started/case-cond-and-if.html)です。

# case
* 以前に束縛されてる値とマッチさせたい場合はピン演算子`^`を使う

```iex
iex> case {1, 2, 3} do
...> {4, 5, 6} -> "foo"
...> {1, x, 3} -> "bar"
...> _ -> "baz"
...> end
"bar"

iex> x = 1
1
iex> case {1, 2, 3} do
...> {4, 5, 6} -> "foo"
...> {1, ^x, 3} -> "bar"
...> _ -> "baz"
...> end
"baz"
```

* ガードは`when`
* ガード句で使える式には制限がある（[公式サイト](http://elixir-lang.org/getting-started/case-cond-and-if.html)参照）
* ガード句で発生したエラーは無視される
* どれにもマッチしなかった場合はエラーになる

```iex
iex> case {1, 2, 3} do
...> {1, x, 3} when x > 0 ->
...> "hogehoge"
...> _ ->
...> "hagehage"
...> end
"hogehoge"

iex> case 1 do
...> x when hd(x) -> "foo"
...> x -> "bar"
...> end
"bar"

iex> case :ok do
...> :error -> "error"
...> end
** (CaseClauseError) no case clause matching: :ok
```

* 匿名関数でも同じことができる
* 匿名関数では引数の数が同じでなければいけない

```iex
iex> f = fn
...>   x, y when x > y -> x - y
...>   x, y -> y - x
...> end
#Function<12.54118792/2 in :erl_eval.expr/5>
iex> f.(3, 2)
1
iex> f.(2, 3)
1

iex> f = fn
...>   x, y -> x + y
...>   x -> x
...> end
** (CompileError) iex:12: cannot mix clauses with different arities in function definition
    (elixir) src/elixir_translator.erl:17: :elixir_translator.translate/2
```

# cond
* 最初に真になるものを実行する
* 真になる条件式がなければエラーになる

```iex
iex> cond do
...> 2 + 2 == 5 -> "foo"
...> 2 * 2 == 3 -> "bar"
...> 1 + 1 == 2 -> "baz"
...> end
"baz"

iex> cond do
...> 2 + 2 == 5 -> "foo"
...> 2 * 2 == 3 -> "bar"
...> end
** (CondClauseError) no cond clause evaluated to a true value
```

# if and unless
* マクロ (`if/2`、`unless/2`)

```iex
iex> if true do
...>   "This works!"
...> end
"This works!"

iex> unless true do
...>   "This will never be seen"
...> end
nil

iex> if nil do
...>   "hoge"
...> else
...>   "hage"
...> end
"hage"
```

# do/end blocks
* do/endブロックは式のまとまりを`do:`オプションへ渡している
* 実はキーワードリストを最後の引数に渡しているだけ
* キーワードリストはRubyと同じ感じ

```iex
iex> if(false, do: "foo", else: "bar")
"bar"
```


# 参考
* [ガード](https://ja.wikipedia.org/wiki/%E3%82%AC%E3%83%BC%E3%83%89_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0))
Virtualbox の 共有フォルダ を マウント/アンマウント したい

## :arrow_up: マウントする
```sh
# マウント
sudo mount -t vboxsf <共有フォルダ名> <マウント先ディレクトリ>
```

ディレクトリやファイルの権限、パーミッションを設定するときは下記のように `-o` で追加オプションを指定する。
`uid`、`gid` についてはユーザー名は指定できない。

```sh
sudo mount -t vboxsf <共有フォルダ名> <マウント先ディレクトリ> -o uid=$UID,gid=$GID,fmode=644,dmode=755
```

## :arrow_down: アンマウントする
umount するときは `-t vboxsf` に加えて `-i` を指定し、`umount.<TYPE>` のヘルパーを使いに行かないようする。
`-i` がないと `umount.vboxsf` が存在しないので NFSとして扱おうとしてアンマウントできずにコケる。

```sh
# アンマウント
sudo umount -t vboxsf -i <マウント先ディレクトリ>
```

----

- 検証環境は `Virtualbox 5.0`、ゲストは `Fedora 22`
Javaでクローラーを作る（crawler4j）

## はじめに
Javaでクローラーを作るため色々調べていたのですが、crawler4jというオープンソースライブラリが使いやすそうでしたので自分なりにまとめていきたいと思います。

## 導入について
crawler4jは非常に多くのライブラリに依存しているようですので、Mavenなどの依存関係を解決してくれるビルドツールを利用するのがよさそうです。Mavenの場合は以下の記述をpomに足してビルドするだけ。

```xml:pom.xml
    <dependency>
        <groupId>edu.uci.ics</groupId>
        <artifactId>crawler4j</artifactId>
        <version>4.1</version>
    </dependency>
```

## 動かし方について
基本的な動かし方は、以下のGithubページのREADMEに書いてありますので割愛いたします。
https://github.com/yasserg/crawler4j

こちらに書いてあるサンプルコードで私でも簡単に動かすことができました。

## 設定
クローロング先のサイト様に甚大な被害を与えぬよう、最低限の設定値を一覧化します。

| 設定 | 説明 |
|:---------------|:------------|
|crawlStorageFolder|クロール中のワークデータを格納するディレクトリを指定します。|
|resumableCrawling|中断したクロールを再開するかどうかを示すフラグ値。<br>TRUEにした場合、最初から区ローリングを始めたい場合は、ワークディレクトリを手動で削除する必要があるようです。<br>デフォルトFALSE|
|maxDepthOfCrawling|最大のクロールの深さを指定します。<br>たとえば、A - > B - > C - > Dというページ階層があり、Aがシードページ（起点）だったとして、設定値を2にした場合は、Dはクローリング対象となりません。<br>デフォルトは-1に設定されており、無制限を表します。|
|maxPagesToFetch|クロールするページの最大数を指定します。<br>デフォルトは-1に設定されており、無制限を表します。|
|userAgentString|ユーザーエージェントを指定します。デフォルトは以下の値になります。<br>crawler4j (https://github.com/yasserg/crawler4j/)
|politenessDelay|リクエストの間隔を指定します。<br>1.3以降のバージョンでは、デフォルトで200ミリ秒の待機時間を設けているようです。|
|includeHttpsPages|
|includeBinaryContentInCrawling|画像やPDFなどのバイナリデータをクロールするかを指定します|
|maxConnectionsPerHost|1ホストあたりの最大接続数を指定します。<br>ソースを読む限りデフォルト100に設定されています。|
|maxTotalConnections|トータルの最大接続数を指定します。<br>ソースを読む限りデフォルト100に設定されています。|
|socketTimeout|ソケットのタイムアウト値を指定します。<br>ソースを読む限りデフォルト20秒に設定されています。|
|connectionTimeout|ソースを読む限りデフォルト20秒に設定されています。|
|maxOutgoingLinksToFollow|あまりよく分かってませんが、1ページあたりのリンク実行の最大数を示しているように思います。<br>ソースを読む限りデフォルト5000に設定されています。|
|maxDownloadSize|ソースを読む限りデフォルト1048576に設定されています。|
|followRedirects|ページ内のリダイレクト記述に従うべきかどうか。<br>デフォルトTRUEに設定されています。|
|proxyHost|プロキシホストを指定します。|
|proxyPort|プロキシポートを指定します。|
|proxyUsername|プロキシユーザー名を指定します。|
|proxyPassword|プロキシパスワードを指定します。|
ぼくのかんがえたさいきょうの.emacs.d


[Emacs実践入門](http://www.amazon.co.jp/dp/4774150029)に書いてあるものにCaskを導入しただけ。

# ディレクトリ構成
gitで管理しているファイル、ディレクトリは以下のとおり。

```
~/.emacs.d/
├── .gitignore
├── Cask
├── backup
├── conf
├── etc
├── init.el
└── snippets
```

# 各ファイル、ディレクトリの説明
## .gitignore
[gibo](https://github.com/simonwhitaker/gibo)で出力したもの（`$ gibo Emacs`）を書いておく。

```:.gitignore
### https://raw.github.com/github/gitignore/0aeefb48c0ac885a516fb92f7f5bfd7e85ce7a37/Global/Emacs.gitignore

*~
\#*\#
/.emacs.desktop
/.emacs.desktop.lock
*.elc
auto-save-list
tramp
.\#*

# Org-mode
.org-id-locations
*_archive
```

Emacs以外の環境のignoreすべきファイル、ディレクトリは`~/.gitignore`なんかに書いて`.gitconfig`で解決する。

```~/.gitconfig
[core]
        excludesfile = ~/.gitignore
```

## Cask
ここがEmacs実践入門には書いていない部分。
[Cask](https://github.com/cask/cask)はEmacsにおけるbundlerのようなもので、CaskファイルはGemfileにあたるもの。
ここに何のプラグインを入れるか書いておく。

インストール方法とか使い方はこちらをご参考に。
[package.elから Caskに切り替えました - Life is very short](http://d.hatena.ne.jp/syohex/20140424/1398310931)

## backup
バックアップファイル、オートセーブファイルを入れておくためのディレクトリ。
下のようなコードを書いてバックアップファイルをここに保存するように設定する。

```
;; バックアップとオートセーブファイルを~/.emacs.d/backup/へ集める
(add-to-list 'backup-directory-alist
                         (cons "." "~/.emacs.d/backup/"))
(setq auto-save-file-name-transforms
      `((".*" ,(expand-file-name "~/.emacs.d/backup/") t)))
```

上記の設定を書いたままだと`~/.emacs.d/backup`というファイルが無いおとEmacsに注意されるので、`.keep`という空のファイルだけ置いてディレクトリをgit管理下にしている。


## conf
独自の設定を置いておくためのディレクトリ。
`init.el`でinit-loaderを用いてこのディレクトリの中のelispをロードする。
`init-loader`は環境に依存しない設定を2桁の数字から始まる設定ファイルを数字の順番に読み込む(`00-config.el`, `01-view.el`)

## etc
その他のファイルを入れておくためのディレクトリ。

## init.el
Caskでインストールしたプラグインと自身の設定を`init-loader`で読み込むように書いておく。

```
;;; cask
(require 'cask "~/.cask/cask.el")
(cask-initialize)

;;; init-loader.el
(require 'init-loader)
(init-loader-load "~/.emacs.d/conf")
```

## snippets
自分で定義したスニペットを入れておくためのディレクトリ。
設定ファイルにディレクトリ指定をするようにしておく。

```
;; yasnippet
(require 'yasnippet)
(setq yas-snippet-dirs
      '("~/.emacs.d/snippets"))
(yas-global-mode 1)
```

# さいごに
ちょっと前はSublime Textとか、最近はAtomとか流行ってて、さらにMicrosoftがVisual Studio Codeをリリースしたりしたけど、Emacsから乗り換えられないなあと思いながら自分の設定を晒す。
[ytkt/.emacs.d](https://github.com/ytkt/.emacs.d)
[nginx] Amazon Linuxにnginxをインストールする (nginx本家パッケージ)

インストール
=============

```bash:コマンド:
sudo rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
```

```bash:コマンド:
sudo yum install nginx --disablerepo=amzn-main -y
```

```bash:コマンド:
which nginx
```

```bash:結果(例):
/usr/sbin/nginx
```

起動
=============

```bash:コマンド:
sudo service nginx start
```

```bash:コマンド:
sudo chkconfig nginx on
```

```text:/etc/yum.repos.d/nginx.repo:
priority=1
```


アクセス確認
=============


コンテンツディレクトリ作成
==========================

```コマンド:
mkdir -p ${HOME}/`date +%Y%m%d`-handson/main/_build/html
cd ${HOME}/`date +%Y%m%d`-handson/main/_build/html
pwd
```

```結果(例)
/home/ec2-user/20150720-handson/main/_build/html
```


```bash:コマンド:
cat << EOF > /home/ec2-user/20150720-handson/main/_build/html/index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Title</title>
</head>

<body>

<h1>Hello!</h1>
<!-- comment -->

</body>
</html>
EOF

cat /home/ec2-user/20150720-handson/main/_build/html/index.html
```

設定(例)
=======

```text:/etc/nginx/conf.d/default.conf
#root   /usr/share/nginx/html;
root   /home/ec2-user/20150720-handson/main/_build/html;
```

```bash:コマンド:
sudo nginx -t 
```

```text:結果(例):
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
```

```bash:コマンド:
sudo service nginx restart
```

パーミッション変更
===================

```bash:コマンド:
cd ~
chmod 755 .
```

アクセス確認
=============


完了
=======


参考
=========

- EC2のAmazon Linuxでyumから最新のNginxを入れる: http://blog.presentation.bz/26
aws cliがUnauthorizedOperationで返したEncoded authorization failure messageをデコードする


aws cli を使っていて、許可されていない操作に対してアクセスエラーが起きたとき、以下のような形でエンコードされたメッセージが添付されているが、このエンコードされたメッセージは、aws sts decode-authorization-message コマンドでデコードできる。

~~~
A client error (UnauthorizedOperation) occurred when calling the AuthorizeSecurityGroupIngress operation: You are not authorized to perform this operation. Encoded authorization failure message: エンコードされたメッセージ
~~~

~~~
aws sts decode-authorization-message --encoded-message エンコードされたメッセージ 
~~~
QiitaAPI: cliでqiitaの検索結果を取得してみた

## 参考

* [Qiita API v2ドキュメント - Qiita:Developer - Qiita](http://qiita.com/api/v2/docs)

```py:qiita.py
#coding:utf-8

import sys
import urllib
import json

class QiitaApi:
    def __init__(self):
        self.baseurl = "http://qiita.com/api/v2/items?page=1&per_page=20"
    def access(self, url=""):
        response = urllib.urlopen(self.baseurl + url)
        return json.loads(response.read())
    def getSearchResult(self, search_str):
        url = "&query=%s" % (search_str)
        return self.access(url)

def blue(string):
    return "\x1b[34m" + string + "\x1b[39m"

def getItems():
    qapi = QiitaApi()
    for item in qapi.access():
        print item[u'title'] + "\n\t" + blue(item[u'url'])

def getSearchResult():
    qapi = QiitaApi()
    for item in qapi.getSearchResult(sys.argv[1]):
        print item[u'title'] + "\n\t" + blue(item[u'url'])

def check_arg(argv):
    if len(argv) == 1:
        print "usage: %s search_str" % argv[0]
    else:
        return True

if __name__ == "__main__":
    if check_arg(sys.argv) == True:
        getSearchResult()
    else:
        getItems()
```

# 使用例

![1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/82b014d5-a232-b1b3-96f9-d926aed41fae.png)

![2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/e3be5ecc-96a3-916d-b08f-a7c403723918.png)

![3.png](https://qiita-image-store.s3.amazonaws.com/0/25728/0d43a5ea-5555-85aa-dd14-46358bf343d0.png)