OmniAICreator/Qiita-1.07M huggingface dataset:
Cygwin 上の zsh compinit の insecure directories 警告を抑止する

# 概要

Cygwin 上で zsh を使おうとすると

```
zsh compinit: insecure directories, run compaudit for list.
Ignore insecure directories and continue [y] or abort compinit [n]?
```

のような鬱陶しいメッセージが出ることがあるのでこれを抑止する。
（一応 Cygwin 環境以外にも適用できる方法のはず。）

# 解法

`compaudit` で表示されたディレクトリを `chmod g-w` する。ただし、グループが「なし」になっていると何も起こらないので事前に `chgrp` しておく**（ここが Cygwin (Windows) 特有の問題）**（ここではとりあえず Users グループを利用する）。

```
% compaudit
There are insecure directories:
/usr/share/zsh/site-functions
/usr/share/zsh/5.0.6/functions
/usr/share/zsh
/usr/share/zsh/5.0.6
% cd /usr/share/zsh
% chgrp -R Users .
% chmod -R g-w .
% compaudit
```

# 別解

.zshrc 内の `compinit` に `-u` オプション（シェルスクリプトが安全かどうかのチェックをしないオプション）を付ける。

```
autoload -Uz compinit
compinit -u
```

セキュリティ的に怪しい気もする（そこまで気にする必要があるのかどうかはよくわからないが）。.zshrc を他マシンでも使い回しているので個人的には微妙。

# 参考

* [cygwin + zsh を使用時に確認メッセージが出る - nelnalog.note](http://d.hatena.ne.jp/nelnal/20070518/1179463326)
* [zsh, Cygwin and Insecure Directories - WezM.net by Wesley Moore](http://www.wezm.net/technical/2008/09/zsh-cygwin-and-insecure-directories/)
* [[zsh] compinit - ニッキ](http://d.hatena.ne.jp/ywatase/20071103)
cmakeで指定したバージョンのboostを認識させる

# 目的
* Linuxで自分で用意したboostを利用したいが、cmakeは頑なに/usr/libにあるライブラリを利用しようとする問題の解決
* 具体的には、最新のboost(1.57.0)がホームディレクトリにあって、それを利用して[boost.numpy](https://github.com/soyiharu/Boost.NumPy)をビルドしたい

# 環境
CentOS 6.5
boost 1.57.0
python 3.4 (anaconda)
インテルコンパイラ 14.0.1(composer_xe_2013_sp1)

boost.pythonはインテルコンパイラを利用してpython3.4でビルド済み

# 方法
0. /usr/lib64/boostからBoost-relwithdebinfo.cmake  Boost.cmake  BoostConfig.cmake  BoostConfigVersion.cmakeの４つを適当なディレクトリにコピー <br/>
<dl>
<dt>上記のファイルが見つからない場合</dt>
  <dd>一旦は普通にcmakeで設定しBOOST_DIRの項目の項目にあるディレクトリを確認</dd>
  <dd>(cmakeの設定項目を全て表示させるために"Grouped"と"Advanced"のチェックボックスをチェックしてください)</dd>
</dl>
1. BoostConfig.cmakeを編集して利用したいに合わせてバージョン番号やディレクトリを変更
2. cmakeのBOOST_DIRにBoostConfig.cmakeなどがあるディレクトリを指定
3. CMAKE_EXE_LINKER_FLAGSに -lboost_python3 -L(boostのライブラリのパス) を指定

これで問題なくビルドできるはずです。
最後の項目は、Linux環境ではboostのライブラリが自動でリンクされないので、そのための設定です。

# 最後に
XXXConfig.cmakeのような設定ファイルを利用してシステム標準のライブラリを取得するのは、多分、boost以外にもあると思うので、どうやってもcmakeが指定したバージョンのライブラリを認識してくれない場合はご検討ください。
Arduino書き込み時にavrdude: stk500_getsync(): not in sync: resp=0x00

色々な原因で起こるようですがこれでちょっと時間食ったのでメモ
→ハードウェアシリアルピンのRXは配線外しておきましょう
　(Arduino UNO R3ならDigital 0番ピン)
文字列の類似度を計算するgem


表記ゆれを検知する手段として、
2つの文字列の類似度を計算するgemを探していた。

どうやら手法はいくつかあるようで、「3-gram（n-gram）」と
「レーベンシュタイン距離（編集距離）」にてgemを発見することができた。

## trigram gem
3-gramでの類似度を計算してくれる。

```ruby
require 'trigram'

Trigram.compare("giiko_", "giik0") #=> 0.4
Trigram.compare("キャノン", "キヤノン") #=> 0.0
Trigram.compare("twitter", "facebook") #=> 0.0
```

## levenshtein gem

編集距離は「距離」なので遠いほど大きいのだが、
使用者としては0.0〜1.0で近いほど大きい戻値であるとうれしい。

```ruby
require 'levenshtein'

module Levenshtein
  def self.similarity(str1, str2)
    1 - normalized_distance(str1, str2)
  end
end

Levenshtein.similarity("giiko_", "giik0") #=> 0.6666666666666667
Levenshtein.similarity("キャノン", "キヤノン") #=> 0.6
Levenshtein.similarity("twitter", "facebook") #=> 0.0
```

## 速度の比較
Intel Core i5-4288U @ 2.60GHzにて、
ランダムな100文字どうしを比較させる処理が何秒かかるかを、それぞれの方法で計測した。

```rb
require 'trigram'
require 'levenshtein'
require 'benchmark'

def randstr(n)
  s = ("a".."z").to_a
  n.times.map{ s.sample }.join
end

Benchmark.realtime do 
  10000.times{ Trigram.compare(randstr(100), randstr(100)) }
end / 10
# => 0.35059819999999997

Benchmark.realtime do 
  1000.times{ Levenshtein.normalized_distance(randstr(100), randstr(100)) }
end
# => 6.048197
```

文字列生成の時間を無視するとして、1回の試行にかかった平均時間は、
trigramが0.35ms、レーベンシュタイン距離が6.05msであった。
100文字どうしの比較において、両者には約17倍の速度差があるといえる。

そのほか、trigramについてわかったこと（実験コードは上の数字を変えただけなので省略）は

- 処理あたりの実行時間は、文字列長さの合計である n0 + n1（上のコードではn0, n1 = 100, 100）に比例している。
- [a-z]の100文字ではなく[ァ-ン]の100文字を用いると、処理時間が8%増える。



## 関連リンク

#### n-gram
- [Trigram という gem を作りました - milk1000cc's blog](http://milk1000cc.hatenablog.com/entry/2014/06/15/225640)
- [N-gramってなんだ](http://handin.sakura.ne.jp/archives/179)

#### レーベンシュタイン距離
- [編集距離 (Levenshtein Distance) - naoyaのはてなダイアリー](http://d.hatena.ne.jp/naoya/20090329/1238307757)
- [文字列の類似度を測る(1) レーベンシュタイン距離｜Colorless Green Ideas](http://id.fnshr.info/2011/11/27/levenshtein/)

#### その他
- [Feature #2571: 文字列のハミング距離 - ruby-trunk - Ruby Issue Tracking System](https://bugs.ruby-lang.org/issues/2571)
- [類似度と距離 - CatTail Wiki*](http://wikiwiki.jp/cattail/?%CE%E0%BB%F7%C5%D9%A4%C8%B5%F7%CE%A5)

- [Rubyで文字列の類似度を計算する関数を作った - Qiita](http://qiita.com/katco/items/77a9b0a049ed5b8e5650)
Screen Orientation APIを試してみる

:::note info
2023年2月6日: 長らく放置してしまいましたが、現状の仕様に合わせた正しい内容に修正しました。
:::

「[モバイルブラウザで画面の縦長・横長を検出する方法を再確認してみた](http://qiita.com/tomoyukilabs/items/916215e933b8fb0af8ca)」の最後の方で触れましたが、`window.orientation`に代わる、端末の画面の向きを検出するためのAPIとして、新たに[Screen Orientation API](モバイルブラウザで画面の縦長・横長を検出する方法を再確認してみた)の仕様策定が進んでいます。

Internet Explorer 11 (Windows 8以降), Firefox for Android, Chrome for Androidで実装されていますので、早速試してみます。なお、Chrome for Androidの実装はW3Cドラフトの最新版に基づいていますが、Firefoxの実装は[一つ前のバージョンのドラフト](http://www.w3.org/TR/2014/WD-screen-orientation-20140220/)、IE11の実装は[さらに一つ前のバージョンのドラフト](http://www.w3.org/TR/2012/WD-screen-orientation-20121206/)に基づいているようです(2015年1月14日現在)。

本記事では最新版の仕様に限定して説明します。

# 画面の向きを取得

Screen Orientation APIでは、`screen.orientation.type`に画面の向きの状態が文字列として格納されています。具体的には次のような値となります。

* `"portrait-primary"`: 縦長が正面とされている端末の場合は、縦長の向きになっている。横長が正面とされている端末では、時計回りに90度回転した向きになっている。
* `"portrait-secondary"`: 縦長が正面とされている端末の場合は、縦長の逆さ向きになっている。横長が正面とされている端末では、反時計回りに90度回転した向きになっている。
* `"landscape-primary"`: 横長が正面とされている端末の場合は、横長の向きになっている。縦長が正面とされている端末では、時計回りに90度回転した向きになっている。
* `"landscape-secondary"`: 横長が正面とされている端末の場合は、横長の逆さ向きになっている。縦長が正面とされている端末では、反時計回りに90度回転した向きになっている。

また、`window.orientation`を置き換えるプロパティとして、`screen.orientation.angle`が用意されています。この値は、正面の向きであれば`0`となり、ウィンドウが時計回りに90度ずつ回転する毎に(すなわち端末を反時計回りに90度回転させる毎に)、`90`、`180`、`270`となります。`window.orientation`では`-90`となっていたものが`screen.orientation.angle`では`270`に変わっている点にのみ注意が必要です。

# 画面の回転を検出(イベントハンドラ)

画面の回転時に発生するイベントに対するハンドラは`screen.orientation.onchange`に設定することが出来ます。また、`screen.orientation.addEventLister('change', callback);`のように`addEventLister()`/`removeEventLister()`を使うことも可能です。

# 画面の向きのロック及び解除

さらに、Screen Orientation APIでは、新たに画面の向きをロックしたりロックを解除したりするためのメソッドも定義されています。

ロックを実行するためには、ブラウザの画面表示がフルスクリーンに設定されていることが条件となります。例えば、次のうちいずれかの手順を踏む必要があります。

* `webkitRequestFullScreen()`や`mozRequestFullScreen()`、`msRequestFullscreen()`を利用してフルスクリーン表示にする。
* ブラウザのメニューでの操作でフルスクリーンモードにする。
* Chrome for Androidであれば、`<meta name="mobile-web-app-capable" content="yes">`を定義したWebページとしておき、「ホーム画面に追加」でホーム画面にアイコンを追加するとWebアプリとしてフルスクリーン起動できるようにする。
* Firefox for Androidであれば、「[インストール可能なWebアプリ](https://developer.mozilla.org/ja/Apps/Developing/installable_apps_for_Firefox_OS)」としてインストールして起動する。

フルスクリーン表示になっている状態で、Chromeの場合は次のようにすることで、画面の向きをロックすることが可能です。すなわちロックの成功/失敗それぞれの処理をPromiseで記述します。

```js
screen.orientation.lock('landscape').then(
  // ロック成功時
  function() {
    console.log('ロックされました');
  },
  // ロック失敗時
  function() {
    console.log('ロックできませんでした');
  }
);
```

`screen.orientation.lock()`の引数は、1つないし複数の画面の向きを表す文字列です。上記の4種類に加えて、次のような文字列も指定可能です。

* `"portrait"`: `"portrait-primary", "portrait-secondary"`の省略形。
* `"landscape"`: `"landscape-primary", "landscape-secondary"`の省略形。
* `"natural"`: `screen.orientation.angle`の値が`0`となる向きに相当。端末が縦長であれば`portrait-primary`、横長であれば`landscape-primary`に対応。
* `"any"`: 全ての向きへの回転を許可する指定に相当。

ロックの解除は`screen.orientation.unlock()`を利用します。

# むすび

Safari for iOSでもこれが実装されると楽になりますよね...
Atom で Regex Railroad Diagram のインストールに失敗する

#背景
Atom で Regex Railroad Diagram パッケージをインストールしたら、npm ERR! となってしまう。  

**実行環境:**

* Ubuntu 13.10 64bit

#問題の詳細
以下はエラーログ。
- - -
```shell-session
npm ERR! git clone git://github.com/klorenz/regexp Cloning into bare repository '/home/kenta-goto/.atom/.node-gyp/.atom/.apm/_git-remotes/git-github-com-klorenz-regexp-16667da8'...
npm ERR! git clone git://github.com/klorenz/regexp
npm ERR! git clone git://github.com/klorenz/regexp fatal: unable to connect to github.com:
npm ERR! git clone git://github.com/klorenz/regexp github.com[0: 192.30.252.130]: errno=??????????
npm ERR! Error: Command failed: fatal: unable to connect to github.com:
npm ERR! github.com[0: 192.30.252.130]: errno=??????????
npm ERR!
npm ERR!
npm ERR!     at ChildProcess.exithandler (child_process.js:648:15)
npm ERR!     at ChildProcess.emit (events.js:98:17)
npm ERR!     at maybeClose (child_process.js:756:16)
npm ERR!     at Process.ChildProcess._handle.onexit (child_process.js:823:5)
npm ERR! If you need help, you may report this *entire* log,
npm ERR! including the npm and node versions, at:
npm ERR!     <http://github.com/npm/npm/issues>

npm ERR! System Linux 3.11.0-26-generic
npm ERR! command "/usr/local/share/atom/resources/app/apm/node_modules/atom-package-manager/bin/node" "/usr/local/share/atom/resources/app/apm/node_modules/atom-package-manager/node_modules/npm/bin/npm-cli.js" "--globalconfig" "/usr/local/share/atom/resources/app/apm/node_modules/atom-package-manager/.apmrc" "--userconfig" "/home/kenta-goto/.atom/.apmrc" "install" "/home/kenta-goto/.atom/.node-gyp/.atom/.apm/regex-railroad-diagram/0.6.3/package.tgz" "--target=0.18.0" "--arch=x64"
npm ERR! cwd /tmp/apm-install-dir-115014-9607-bbf9y
npm ERR! node -v v0.10.33
npm ERR! npm -v 1.4.4
npm ERR! code 128
npm ERR! git clone git://github.com/klorenz/railroad-diagrams Cloning into bare repository '/home/kenta-goto/.atom/.node-gyp/.atom/.apm/_git-remotes/git-github-com-klorenz-railroad-diagrams-805a9d5a'...
npm ERR! git clone git://github.com/klorenz/railroad-diagrams
npm ERR! git clone git://github.com/klorenz/railroad-diagrams fatal: unable to connect to github.com:
npm ERR! git clone git://github.com/klorenz/railroad-diagrams github.com[0: 192.30.252.130]: errno=??????????
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR!     /tmp/apm-install-dir-115014-9607-bbf9y/npm-debug.log
npm ERR! not ok code 0
```
- - -

シェルからやっても同様のエラー。

```shell-session
$ apm install regex-railroad-diagram
```

apm のバージョンは以下のとおり。

```shell-session
$ apm -v
apm  0.116.0
npm  1.4.4
node 0.10.33
python 2.7.5+
git 1.8.3.2
```


Regex Railroad Diagram 以外のパッケージはいまのところ問題なく入る。
Windows7 でも同様の現象が起きた。
Splunkでインストール済みのHotfixを確認する

まず、下記のインストール済みのHotfixの一覧を作成する必要があります。
`wmic qfe list full /format:csv > hotfix.csv`

メモ帳でhotfix.csvを開くと、下記のような内容となっています。
`Node,Caption,CSName,Description,FixComments,HotFixID,InstallDate,InstalledBy,InstalledOn,Name,ServicePackInEffect,Status
TestPC,Microsoft-Windows-ADRMS-BPA,TestPC,Update,,KB981391,,TestPC\Administrator,11/16/2012,,,
TestPC,Microsoft-Windows-ApplicationServer-BPA,TestPC,Update,,KB981392,,TestPC\Administrator,11/16/2012,,,
TestPC,Microsoft-Windows-DHCP-BPA,TestPC,Update,,KB977236,,TestPC\Administrator,11/16/2012,,,`

CSVファイルはUnicodeで保存されるので、メモ帳の「名前を付けて保存」でUTF-8に変換します。
![a.png](https://qiita-image-store.s3.amazonaws.com/0/65589/de98dfdb-78af-b8bf-a82e-66298acf9124.png)

Splunkのトップページを開いてデータ追加をクリックします。
![a.png](https://qiita-image-store.s3.amazonaws.com/0/65589/43b9d67f-266a-1402-6ca0-b7debfe75f94.png)

データの追加画面でアップロードをクリックします。
![a.png](https://qiita-image-store.s3.amazonaws.com/0/65589/aa20f5bd-6131-e0ac-5441-2c8022b44e62.png)

ファイル選択画面で、下記の区域にhotfix.csvをダラッグ＆ドロップします。
![a.png](https://qiita-image-store.s3.amazonaws.com/0/65589/aea91cd3-1076-571b-2cc2-ff8b30e87915.png)

数百行のCSVファイルなら一瞬でアップロードできます。下記のような完了画面が表示されます。
![a.png](https://qiita-image-store.s3.amazonaws.com/0/65589/3fb75b5d-4870-ce94-747c-a2fbd1f542b0.png)

画面の上側の「次へ」ボタンをクリックして次に進みます。
![a.png](https://qiita-image-store.s3.amazonaws.com/0/65589/f8eabbf2-beb9-ece1-8c41-4fe586bc0781.png)

次のソースタイプ設定画面では、下記のようにPC名、HotFixID等列が自動的に識別できたことを確認できます。
![a.png](https://qiita-image-store.s3.amazonaws.com/0/65589/b9c563f2-0c3b-f3af-5b63-eb6e0018c37f.png)

同じ画面の左側でソースタイプ設定を確認できます。下記のように自動的にビルドインのCSVタイプとして認識されました。CSVの区切り文字をタブ、スペース等に変換することもできます。
![a.png](https://qiita-image-store.s3.amazonaws.com/0/65589/e28776eb-d577-152a-6778-5f5bbcb70f33.png)

しかし、日付は正しく認識されていません。Splunkは日時の項目を発見できなかったので、インポート時の日時を付けました。
![a.png](https://qiita-image-store.s3.amazonaws.com/0/65589/e8b359d8-f439-ec53-3e7e-ccd1230e24d3.png)

この問題を直すには、タイムスタンプを設定する必要があります。下記のようにタイムゾーンを東京に設定し、タイスタンプの形式を%m/%d/%Yの設定します。Timestamp fieldsにはタイスタンプの列のタイトルを設定します。
![a.png](https://qiita-image-store.s3.amazonaws.com/0/65589/e0eb0235-fd54-1cf4-a1bf-d653f12290e4.png)

タイムスタンプの形式はPythonのstrptime()関数と同じです。「詳細」をクリックすれば説明画面が表示されます。%Yは4桁の年、%mは月、%dは日という具合です。

正しく設定すればプレビューの警告が消えるはずです。
![a.png](https://qiita-image-store.s3.amazonaws.com/0/65589/55c121f2-e06d-3ac2-e8ab-8d1e8b97fbd3.png)

画面左側の「名前を付けて保存」ボタンをクリックして、hotfix_csvという名前で今の設定を保存します。次回からSourcetypeドロップダウンリストからこの名前を選択すれば良いです。

画面の上側の次へを３回押して、完了画面まで進み、「Start Searching」ボタンを押します。

これでHotfixのCSVファイルのインポートが完了しました。Splunk検索画面で自由検索と集計ができます。
MagnumCIメモ


## Build Steps


Dependencies installation:

	bundle install --path=vendor/bundle

Before test execution:

	bundle exec rake tmp:create
	curl -o tmp/sample.jpg http://pic.prepics-cdn.com/nikoniko0903/33828338.jpeg
	bundle exec rake db:create
	RAILS_ENV=test bundle exec rake db:migrate

Test suite commands:

	bundle exec rubocop -c .rubocop-custom.yml --rails -D; date
	bundle exec scss-lint -c .scss-lint.yml ./app/assets/stylesheets/; date
	bundle exec code_hunter; date
	bundle exec rake spec:acceptance
	COVERAGE=on bundle exec rake spec
JavaScript 入門メモ [変数参照編]

#はじめに
最近始めた[JavaScript]がよく理解が出来ていないので、これを機会に書いてみようか、と思いまして書く事にしました。
本やサイトで学んだ事を気ままにここに記そうと思います。
ちなみに好きな言語は[C/C++]です。(好きなだけでバリバリはできません・・・。)

#変数の宣言

```example01.js
var a = 5;
console.log(a);
// 5
var a;
console.log(a);
// 5
```

宣言しただけで何も代入をしないと[undefine値]になる。
また、同じ変数をもう１度宣言しても値がクリアされないみたい。
そんな時、こういう形にすればいい！
`var a = a || 5`
イディオムの一種で、変数[a]が既に宣言されていて且つ、値が代入済みであれば何もしないという処理に出来る。
(＊)ここでイディオムという言葉が出てきたので[JavaScript]のイディオムについて調べましたが、書ききれそうにないのでまた別の機会に。

#変数の参照
```example02.js
var a = { x:0, y:1 };
var b = a;
b.x++;
console.log(b.x);
// 2
console.log(a.x);
// 2
```
このように[b]の参照するオブジェクトを変更すると、[a]まで変わりました。これは同じオブジェクトを参照しているからだそうです。
これは忘れて引っかかりそうだ・・・。
また、上とは別に下のものは

```example03.js
var a = { x:0, y:1 };
var b = a;
a = { x:1, y:2 };
console.log(b.x);
// 0
```
参照型変数で行ったことは参照先のオブジェクトの変更で、変数の値の変更ではないみたい。
なので、[b]の値は[0]から変わらなかったということ。
うわぁ・・・、これはややこしい。

#関数の値渡し
```example04.js
// 値を入れ替える
function change(a, b){
	var tmp = a; // tmpに一旦格納しておく
	a = b;
	b = tmp;
}

var hoge = 3;
var piyo = 4;

change(hoge,piyo);	// 値を入れ替える

console.log(hoge, piyo);
// 3, 4
```
[C/C++]をやったことある人はこれをやってしまいそう？（私はやりそう）ですが、これでは先程の話と同様、値は変わらないみたい。
参照演算子やポインタ演算子がある言語では出来るのですが、[JavaScript]にはそのような言語機能がないみたいなのでこの方法では無理。
じゃあどうすればいいんだ・・・？

```example04.js

var hoge = 3;
var piyo = 4;

// 値を入れ替える
var parts = [piyo, hoge];
hoge = parts[0];
piyo = parts[1];

console.log(hoge, piyo);
// 4, 3
```

こうやってやるみたい。
配列を渡して要素を変更したりオブジェクトの参照を渡してプロパティ値を変更。


#終わりに
私と同様、初めたばかりの人の力になれたらと思います。
そして、まだまだ[JavaScript]の道は長そうです・・・。
TwitterSDKのFabricのAndroid Studio Pluginからログアウトする方法

超小ネタですが、困ったのでメモしておきます。
**結論から言うと、`Command+L`または`Ctrl+L`を押すだけです。**

TwitterSDKの[Fabric](https://dev.twitter.com/products/fabric)は、IDEごとにプラグインを用意してくれているので導入が超簡単です。が、一度プラグインでFabricログインするとログアウトボタンがないのでアカウント切り替えしたい時に戸惑います。

![HomeActivity_java_-__app__-_taptrip2-android_-____work_taptrip2-android_.png](https://qiita-image-store.s3.amazonaws.com/0/15267/ecc48f56-c630-a252-bfb5-2f597888e67a.png "HomeActivity_java_-__app__-_taptrip2-android_-____work_taptrip2-android_.png")

プラグインが表示されている時に`Command+L`または`Ctrl+L`を押せばログアウトできます。

参考: [How to log out of the Crashlytics Plugin](http://support.crashlytics.com/knowledgebase/articles/214659-how-to-log-out-of-the-crashlytics-plugin)
MacのPreview.appでvimキーバインドを使って移動

## 概要

- MacのPreview.appでvimのキーバインドを使って移動する方法です。
- Karabinerを使ってPreview.appでのみ有効になるように、キーのリマップを設定します。

## 参考サイト
- http://d.hatena.ne.jp/msnb125/20131026/1382796626
- https://pqrs.org/osx/karabiner/document.html#privatexml

## 手順

- Karabinerのpreferencesを開いて[Misc&Uninstall]タブの [Open private.xml]をクリック。
- private.xmlをエディタで開いて、以下のタグを挿入する。

    ```previm.xml
    <item>
      <name>Vim in Preview</name>
      <identifier>private.app_preview_vimium_in_preview</identifier>
      <only>PREVIEW</only>
      <autogen>__KeyToKey__ KeyCode::J, ModifierFlag::NONE, KeyCode::CURSOR_DOWN</autogen>
      <autogen>__KeyToKey__ KeyCode::K, ModifierFlag::NONE, KeyCode::CURSOR_UP</autogen>
      <autogen>__KeyToKey__ KeyCode::H, ModifierFlag::NONE, KeyCode::CURSOR_LEFT</autogen>
      <autogen>__KeyToKey__ KeyCode::L, ModifierFlag::NONE, KeyCode::CURSOR_RIGHT</autogen>
      <autogen>__KeyToKey__ KeyCode::B, ModifierFlag::CONTROL_L, KeyCode::PAGEUP</autogen>
      <autogen>__KeyToKey__ KeyCode::B, ModifierFlag::CONTROL_R, KeyCode::PAGEUP</autogen>
      <autogen>__KeyToKey__ KeyCode::F, ModifierFlag::CONTROL_L, KeyCode::PAGEDOWN</autogen>
      <autogen>__KeyToKey__ KeyCode::F, ModifierFlag::CONTROL_R, KeyCode::PAGEDOWN</autogen>
    </item>
```

- Karabinerの設定の[Change Key]をクリックし、[Reload XML]をクリックすると上記設定が読み込まれ、[Vim in Preview]というチェック項目が出現します。これにチェックを入れればキーが使えるようになります。

***

ほとんど参考サイトと同じですが変更した箇所が２点あります。

1. Ctrl+F, Ctrl+B をPageDown, PageUpにマップした。
2. JKHLの設定箇所に `ModifierFlag::NONE` をセットした。
  - これが無いと、検索窓などで一文字削除しようとしてCtrl+Hを押すとCtrl+←を押したことになってしまいます。
  - ModifierFlag::NONEをつけているとCtrlやShiftなどが押されていないときだけキーのリマップが有効になります。
AWS（EC2：AMI）でcron実行時にメールを送信する方法

* AWS で SESの設定はしておく
* fromのアドレスの方が設定として先になっているので注意


# メール本文

```
echo body | mail -s "subject" -r 'from@example.com' 'to@example.com'
```

# メール本文に日付

```
date | mail -s "subject" -r 'from@example.com' 'to@example.com'
```
Marionette jsの利点

Marionette.jsはViewにおいてコードの冗長性をなくしてくれる


##Marionette.ItemViewによる削除

```js

var MyView = Backbone.View.extend({
  template: $('#my-view-template').html(),

  render: function(){

    // Underscore.jsのテンプレートをコンパイル
    var compiledTemplate = _.template(this.template);

    // モデルデータを使いテンプレートに描画する
    var data = this.model.toJSON();
    var html = compiledTemplate(data);

    // 描画されたHTMLをビューに埋め込む
    this.$el.html(html);
  }
});

// ビューのインスタンスを生成して、モデルデータを渡す
var Cat = new Person({
  Name: 'Cat',
  email: 'cat@example.com'
});

var myView = new MyView({
  model: Cat
});

myView.render();

$('#content').html(myView.el);


```

Marionette.jsを使うと上のようなViewの定義を以下のように定義できる

```js
 
var MyView = Marionette.ItemView.extend({
  template: '#my-view-template'
});


```

##リージョン管理を使ってDOMの要素のなかのビューを綺麗に管理

```js

var Cat = new Person({
  Name: 'Cat',
  email: 'cat@example.com'
});

var myView = new MyView({
  model: Cat
});

myView.render();

// ビューをDOM上に表示
$('#content').html(myView.el);

```

上記の定義をMarionette.Regionを使用して記述

```js


var myRegion = new Marionette.Region({
  el: '#content'
});
// リージョン内のビューを表示
var myView = new MyView({
  model: Cat
});

myRegion.new(myView)


```
CygwinでGVM使ってGradleをインストールする

CygwinでGVM経由でGradle入れるのにハマったのでメモ。
Oracleを入れている人はもしかしたら同じ事象に遭遇するかも。

## GVM インストール

```bash
$ curl -s get.gvmtool.net | bash
```

プロキシ環境下で実行する場合は、以下を参考に`http_proxy`(小文字)に注意して設定する。
[proxy環境下でGVMを入れる(続き) - ごずろぐ](http://gozuk16.hatenablog.com/entry/2014/05/22/173648)

## Gradle インストール
バージョン指定しない場合、最新の安定版がインストールされる。

```bash
$ gvm install gradle

Downloading: gradle 2.2.1

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0   356    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
100 55.8M  100 55.8M    0     0  7805k      0  0:00:07  0:00:07 --:--:-- 11.2M

Installing: gradle 2.2.1
Done installing!

Do you want gradle 2.2.1 to be set as default? (Y/n): Y

Setting gradle 2.2.1 as default.
```

バージョン確認っと。

```bash
$ gradle -v

------------------------------------------------------------
Gradle 2.2.1
------------------------------------------------------------

Build time:   2014-11-24 09:45:35 UTC
Build number: none
Revision:     6fcb59c06f43a4e6b1bcb401f7686a8601a1fb4a

Groovy:       2.3.6
Ant:          Apache Ant(TM) version 1.9.3 compiled on December 23 2013
JVM:          1.7.0_51 (Oracle Corporation 24.51-b03)
OS:           Windows 7 6.1 amd64
```

### エラーが出た場合
すんなりインストール出来ればいいけど、以下のようなエラーが出たらzip,unzipのパスを確認する。

```bash
$ gvm install gradle

Downloading: gradle 2.2.1

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0   356    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
100 55.8M  100 55.8M    0     0  7855k      0  0:00:07  0:00:07 --:--:-- 12.0M
unzip:  cannot find either /cygdrive/c/Users/tenten0213/.gvm/archives/gradle-2.2.1.zip or /cygdrive/c/Users/tenten0213/.gvm/archives/gradle-2.2.1.zip.zip.

Stop! The archive was corrupt and has been removed! Please try installing again.
```

Oracleのzip,unzipコマンドに向いちゃってる。

```bash
$ which zip
/cygdrive/c/oraclexe/app/oracle/product/11.2.0/server/bin/zip
$ which unzip
/cygdrive/c/oraclexe/app/oracle/product/11.2.0/server/bin/unzip
```

パスを修正するか、(コマンドを持っていなければ)apt-cygでzip,unzipをインストールすれば解決する。

```bash
$ apt-cyg install zip
$ apt-cyg install unzip
```

```bash
$ which zip
/usr/bin/zip
$ which unzip
/usr/bin/unzip
```
iojsでクラス記法を使う

~/projでgit clone して `$HOME/proj/io.js/out/Release` にパスさした。

```
iojs --harmony_arrow_functions --harmony_classes foo.js
```

```javascript
'use strict';

class A {}
class X extends (class extends A{}){
    sayHello(){
        console.log('hello');
    }
}
let createX = () => new X();
const x = createX();

x.sayHello();
```

`'use strict'` が必要
CentOSインストールDVD用iso作成手順

## 概要
kickstartを利用した自動OSインストールDVDの`iso`を作成する手順。なおこのページは`iso`の作成情報のみでkickstartファイルについては書いていない。

## 口上
クラウドなご時世に何言ってんだという感じだが、仕事柄、実サーバにOSをインストールすることが多々ある。USBにイメージを焼く方法をとりたかったが、USBがデバイスとして認識されてしまっていまいちで、またそれを回避する方法に汎用性が無さそうなので結局インストール時のブートデバイスはDVDが最強かなと思った。

## インストールOS
CentOS6.6(64bit)

## 環境
インストールしたいサーバはDHCP環境でeth0を使用する前提

`kickstart`ファイルはインストール時に http://hogehoge.com/ks.cfg から取得するものとする


## 必要なもの
- 作業用サーバ(yumが使えるlinuxサーバがいい)

`iso`をDLするため、自分のPCから繋げる環境だと便利

- 焼くようDVDメディア


## 出来上がる`iso`のファイル名
MY_CentOS-6.6-x86_64-netinstall.iso


## 手順
作業用サーバにログイン

### `iso`を作成するためのコマンドをパッケージでインストール

```shell-session
# yum install mkisofs
```

### 作業ディレクトリ作成(なんでもいいけど適当に`/tmp/ISO_SAGYO`にした)、と移動

```shell-session
# mkdir /tmp/ISO_SAGYO
# cd /tmp/ISO_SAGYO
```

### 元となる`iso`の取得と、その`iso`をマウントするマウントポイントの作成

```shell-session
# curl -O http://ftp.riken.jp/Linux/centos/6.6/isos/x86_64/CentOS-6.6-x86_64-netinstall.iso
# mkdir /tmp/ISO_SAGYO/iso
```

### 元`iso`のマウント

```shell-session
# mount -t iso9660 -o loop,rw /tmp/ISO_SAGYO/CentOS-6.6-x86_64-netinstall.iso /tmp/ISO_SAGYO/iso
```

### 元`iso`のデータを丸ごとコピー

```shell-session
# cp -pr /tmp/ISO_SAGYO/iso /tmp/ISO_SAGYO/MY_CentOS-6.6-x86_64-netinstall
```

### `isolinux.cfg`の書き換え

```shell-session
# vi /tmp/ISO_SAGYO/MY_CentOS-6.6-x86_64-netinstall/isolinux/isolinux.cfg
```

`diff`がこんな感じになるように

```diff
--- /tmp/ISO_SAGYO/iso/isolinux/isolinux.cfg    2014-10-24 23:12:28.000000000 +0900
+++ /tmp/ISO_SAGYO/MY_CentOS-6.6-x86_64-netinstall/isolinux/isolinux.cfg        2015-01-14 13:04:58.613834195 +0900
@@ -1,4 +1,4 @@
-default vesamenu.c32
+default kickstart
 #prompt 1
 timeout 600

@@ -35,4 +35,6 @@
   menu label ^Memory test
   kernel memtest
   append -
-
+label kickstart
+  kernel vmlinuz
+  append initrd=initrd.img ks=http://hogehoge.com/ks.cfg ksdevice=eth0
```

### `iso`の作成

```shell-session
# cd /tmp/ISO_SAGYO/MY_CentOS-6.6-x86_64-netinstall/
# mkisofs -r -l -J -o ../MY_CentOS-6.6-x86_64-netinstall.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table .
```

作成された`iso`

```shell-session
# ls -l /tmp/ISO_SAGYO/MY_CentOS-6.6-x86_64-netinstall.iso
-rw-r--r-- 1 root root 271683584  1月 14 13:11 2015 /tmp/ISO_SAGYO/MY_CentOS-6.6-x86_64-netinstall.iso
```

あとはこの`iso`をローカルPCに落としてDVDに焼けばOK。`windows7`なら`iso`を右クリックから簡単に焼けるはず。

なお作成したDVDはDHCP環境だとOSインストールが自動で進んでしまうので使う時は注意。



## 所感
kickstartファイルについてもqiitaにそのうち掲載しよう


## 参考にさせて頂いたURL
http://www.mk-mode.com/octopress/2010/01/17/17002027/
VMインスタンスの"/"の容量を増やす方法

AWS上で作成したVMインスタンスの"/"容量を増やしたかったのでその方法を調べてみた．

### AMIを選ぶ．

AMIには，テンプレートでPartisionが切られているものと切られていないものがあるので，切られていないものを選ぶ．

lkblkを実行して，特定のドライブ(例：/dev/xvde)の中にツリー構造が表示されればそれはPartitionが切られている．

例えば
>CentOS 6.5 (x86_64) - Release Media

このAMIはPartitionが切られていないが

>CentOS 6 (x86_64) - with Updates

こちらは切られている．
ここで後者を選ぶと/の容量は増やせない．

### VMインスタンス作成時に"/"に必要なサイズのドライブを割り当てる．

デフォルトだと8GBとかになっているので，100GBとか必要なだけ割り当てる．

### VMインスタンス起動後に容量のリサイズを実行する

インスタンス起動後にlsblkを実行して，Partitionが切られていないことを確認し，下記コマンドを実行する

```
resize2fs /dev/xvde
```

/dev/xvdeは割り当てられたドライブの名前(lsblkで確認可能）．

その後，```df -h```とかで"/"の容量が増えてることが確認できればOK．

ちなみに，AMIを選ぶ際にPartitionが切られているものを選んでしまった場合，"/"の容量は初期値のまま変えられないが，別のディレクトリにドライブの残りの容量をマウントすることは可能（勿論fdisk等でPartitionを切ってフォーマットしてマウントという作業が発生する）
MacにJDK7をインストールする

 MacにJDK7をインストールする手順を示します。

## JDK7をダウンロードする。

まずは、JDK7を配布しているページを表示します。

* [Java SE Development Kit 7 Downloads](http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html)

今回は**Java SE Development Kit 7u71**をインストールしていきましょう。
(JDKはセキュリティ対策などで日々アップデートされます。そのたびにバージョンが「7u71」や「7u75」といったふうに上がっていくので、最新版がリリースされている時には適宜読み替えて実施してください)
ページ内の**Java SE Development Kit 7u71**の箇所を表示して、**Accept License Agreement**をチェックしましょう。
そうすると、ファイルがダウンロードできるようになるので、**Mac OS X x64**をダウンロードしてください。

![JDKダウンロード](https://dl.dropboxusercontent.com/u/38513287/Mac%E3%81%ABJava%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/Java_SE_Development_Kit_7_-_Downloads___Oracle_Technology_Network___Oracle.png)

ダウンロードが開始されますので、完了まで待ちます。

## JDKをインストール

**jdk-7u71-macosx-x64.dmg**がダウンロードできたら、ダブルクリックでDMGファイルを開きます。
そうすると、次の図のように表示されるので、中央にあるアイコンをダブルクリックしてください。

![JDKのDMG](https://dl.dropboxusercontent.com/u/38513287/Mac%E3%81%ABJava%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/JDK_7_Update_71.png)

次のように、インストーラが開始されます。

![JDKのインストーラー](https://dl.dropboxusercontent.com/u/38513287/Mac%E3%81%ABJava%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/JDK_7_Update_71_%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB_%E3%81%A8_Mac%E3%81%ABJava%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB_%E3%81%A8_Downloads.png)

あとは、インストーラーに従い、「続ける」や「インストール」を行えばインストールされます。インストール中にパスワードを聞かれることがあるので、その時はMacの管理者のパスワードを入力してください。

以上です。おつかれさまでした。 :smiley:
VBAのFixやIntの計算誤差は浮動小数点レジスタの精度がかかわっている

##問題
Double型のデータをIntやFixで切り捨てた場合に誤差がでます。
浮動小数点なので当然誤差は出ますが、CDblのキャストのタイミングでも誤差が発生します。

ExcelVBAのイミデイトウィンドウで下記を実行してください。

```vbnet
?Fix(0.6# * 10 )
5
?Fix(CDbl(0.6# * 10))
6
```


環境によってはFix関数に渡す前にCDblでキャストした場合と、しない場合で計算結果が変わります。

 **再現環境** 
　Office2010 32bit
　Windows7 64biy
　CPU Intel(R) Core(TM) i5 CPU M450 2.4GHz



##原因
この問題は、下記のページでも議論されています。（このページではVB6が話題ですが、基本的に同じです）

http://hanatyan.sakura.ne.jp/logbbs1/wforum.cgi?mode=allread&no=3276&page=0#3276

この原因には、計算途中の浮動小数点の精度とDouble型の精度に違いがあるために発生しています。

浮動小数点の演算の途中経過が64ビットの仮数を持つ80ビットのレジスタで計算しているが、Dobule型は53ビットの仮数を持つ64bitの浮動小数点なので、結果として誤差が表示してしまいます。

 **「VC++とかで同じようなコードを書いても再現しないじゃないか！やっぱりVBAは壊れているじゃないか！（憤怒）」** と怒る兄貴、姉貴もおられると思いますが、浮動小数点レジスタの仮数を64ビットの仮数で計算するか、53ビットで計算するかはプログラム中で変更することができます。


このことを確認するには、_controlfp_sの関数を実行して調べることができます。

 **\_controlfp_s** 
http://msdn.microsoft.com/ja-jp/library/c9676k6h%28v=vs.80%29.aspx

この関数から取得できる値に\_MCW_PCをマスクした結果で浮動小数点の精度が確認できます。

 **\_MCW_PC (精度制御)** 
	
|Mask|定数|value|
|:---|:---|:----|
|0x00030000|\_PC_24 (24 ビット)<BR>\_PC_53 (53 ビット)<BR>\_PC_64(64 ビット)|0x00020000<BR>0x00010000<BR>0x00000000|

つまり、VC++のデフォルトでは、_MCW_PCの_PC_53がたっている状態であり、53ビットの仮数を持つ64bitの浮動小数点になっているため計算誤差がでないのです。

###VBAでの浮動小数点レジスタの確認方法
残念ながら、VBAで直接、\_controlfp_s関数を呼ぶことはできません。
しかし、VBAではDLLを実行できるので、DLL経由で_controlfp_sを実行することで、確認することができます。

まず、VC++でDLL側のコードを記述します。

```cpp:DLL側のコード
#include <windows.h>
#include <float.h>
int __stdcall GetControlFP() 
{ 
  int err,sts;
  err=_controlfp_s(&sts,0,0 );
  return sts;
} 
int WINAPI DllMain(HINSTANCE hInst, DWORD fdwReason, PVOID pvReserved) 
{ 
    return TRUE; 
} 
```


 **VisualStdio2008SP1 で32bitでコンパイルした結果** 
http://needtec.sakura.ne.jp/vba/checkfloat/VBADll.zip

※もし、64bitのVBAを使用している場合、64bitでビルドして64bitのDLLを作成する必要があります。


作成したDLLをVBAから呼び出します。

```vbnet
Option Explicit
' パスを修正すること
Declare Function GetControlFP Lib "C:\Users\ｘｘｘｘｘ\Documents\Visual Studio 2008\Projects\VBADll\Release\VBADll.dll" () As Long

Public Sub TestCon()
    '
    '  _MCW_PC (精度制御) 0x00030000
    '
    ' _PC_24 (24 ビット)　0x00020000
    ' _PC_53 (53 ビット)　0x00010000
    ' _PC_64 (64 ビット)　0x00000000
    Msgbox hex$(GetControlFP())
End Sub
```

先にあげた検証環境では「C001F」という結果がかえってきました。
これにより、精度制御が\_PC_64ビットであり、浮動小数点の演算の途中経過が64ビットの仮数を持つ80ビットのレジスタで計算していることが確認できました。

##じゃあ、VBAたんは無罪なのね！
・・・じつは、参照しているCOMやDLLなどにより変更される可能性があり、この結果は全ての状況で正しいとは限りません。

たとえば、Jetを使うと途中の精度がかわったりするバグがあったりもします。
http://support.microsoft.com/kb/308702/ja

 **・・・やっぱり壊れているじゃないか!(憤怒)**
jest + gulpでReactのテストを書く


## 問題提起

Reactのテストには、`React.addons.TestUtils`を使ってテストケースを書いて、
jestで実行するのがFacebook標準らしい。

- http://facebook.github.io/react/docs/test-utils.html
- http://facebook.github.io/jest/docs/tutorial-react.html

とりあえずReactの導入段階ではこの仕組みに乗っかってみることになると思います。

ただ、上記のサンプルは実際に使うには以下の点が不十分だと感じました。

- CommandLine/`npm run`で動かすこと前提なので、他のタスクと連携しにくい。
- package.jsonに設定を書くのはなんか嫌だ。

ということで、やっぱりgulpタスクに乗っけないと不便だよね、と思って調べてみました。


また、副産物でこんなことも分かりました。

- jestの各種設定のやり方
  - 公式ドキュメント分かりにくい。。。
- フォルダ構成
  - 単体テストをするときに、javaとかと違って該当ファイルにjumpできない。
  - だったら、テストファイルを距離的に近い所に置きたいよね。


## 構成

```
$ tree .
.
├── gulpfile.js
├── package.json
├── src
│   ├── CheckboxWithLabel.js
│   └── __tests__
│       └── CheckboxWithLabel-test.js
└── test_preprocessor.js
```


### package.json

```json:package.json
{
  "name": "jest-for-react",
  "version": "0.0.1",
  "description": "",
  "main": "index.js",
  "author": "",
  "license": "",
  "dependencies": {
    "react": "*",
    "react-tools": "*"
  },
  "devDependencies": {
    "gulp": "^3.8.10",
    "harmonize": "^1.33.7",
    "jest-cli": "^0.2.1"
  }
}
```

見てわかるとおり、scriptsもなければjestの設定らしきものもないです。

僕的にはpackage.jsonに設定を書くのは嫌なので。

### gulpfile.js

```js:gulpfile.js
var gulp = require('gulp');
var jest = require('jest-cli');
require("harmonize")();

gulp.task('jest', function (callback) {

  var options = {
    rootDir: __dirname,
    scriptPreprocessor: "<rootDir>/test_preprocessor.js",
    unmockedModulePathPatterns: [
      "<rootDir>/node_modules/react"
    ],
    testDirectoryName: "__tests__",
    testFileExtensions: ["js"]
  }

  var onComplete = function (result) {
    callback();
  }
  jest.runCLI({config: options}, __dirname, onComplete);
});
```

設定は`options`オブジェトに書かれています。
どんな設定ができるかは、以下を参考にして下さい。

http://facebook.github.io/jest/docs/api.html#config-options

今回の設定を簡単に言うと、「`__tests__`以下にあるjsファイルをテスト対象にする。」的な感じです。

※ちなみに、`harmonize`をつけないと、`Error: Please run node with the --harmony flag`ってエラーに見舞われます。サンプルコードがES6の仕様を取り込んでるのか、gulpタスクのせいなのか、それ以外の何かなのかは不明です。。。

### test_preprocessor.js

```js:test_preprocessor.js
var ReactTools = require('react-tools');
module.exports = {
  process: function(src) {
    return ReactTools.transform(src);
  }
};
```

ここはサンプルのpreprocessor.jsと同じです。jsxをjsに変換します。
とりあえずトップに置いてますが、どこでもいいと思います。

事前にgulpタスクの方でjsに変換しておくのも考えましたが、こちらのほうが楽そうです。

### src

ソースコードとテストコードが入っています。

（これらは[Tutorial – React](http://facebook.github.io/jest/docs/tutorial-react.html)そのままです。）

先の設定のように、テストコードは`__tests__`以下に置きます。
`__tests__`は何個あっても大丈夫なようです。

ソースコードとテストコードを近い位置に置くことで、見やすくなるし、テストコードのrequireがしやすくなります。

## まとめ

とりあえずgulpでreactのテストができるようになりました。

ただ、まだjestでのmockの扱いとか、jestの何が嬉しいのかを理解していないので、
それは別途調べます。


## 参考資料

- https://github.com/Dakuan/gulp-jest
- http://qiita.com/kimagure/items/1e58e13ee5891abd5c5c
WARNING: db:test:clone is deprecated. The Rails test helper now maintains your test schema automatically, see the release notes for details.が出た時の対処法

Rails4.1にあげたら遭遇した。

```
$rake db:test:clone
WARNING: db:test:clone is deprecated. The Rails test helper now maintains your test schema automatically, see the release notes for details.
```
こんな感じのエラーが出た時は、

```
$rake db:migrate RAILS_ENV=test
```

すればいい。
Oracleコマンドメモ

OracleDBを久しぶりに触る。殆ど忘れているので基本的なことからメモしておく。

###### 表領域作成


    SQL> CREATE TABLESPACE "TABLESPACE_NAME" DATAFILE
    '/path/to/file.dbf' SIZE 8G AUTOEXTEND ON MAXSIZE 24G 
    LOGGING ONLINE PERMANENT BLOCKSIZE 8192 
    EXTENT MANAGEMENT LOCAL AUTOALLOCATE SEGMENT SPACE MANAGEMENT AUTO;


###### テーブル一覧
    SQL> select username from user_users;

###### テーブル一覧
    SQL> select username from all_users;

###### 表領域一覧
    select TABLESPACE_NAME,FILE_NAME from dba_data_files;

###### ユーザ確認
    SQL> select username from all_users where username = 'ichiro';

###### テーブル一覧
    select table_name, tablespace_name, status from user_tables

###### 接続ユーザ所有オブジェクト確認
    select * from user_objects 
    where object_type in ('PROCEDURE','FUNCTION','PACKAGE','PACKAGEBODY','TRIGGER');

###### ストアドプロシージャ実行
    SQL> execute test_procedure;

###### SQL*Plus上でOSコマンド実行
    SQL> !ls -l

###### SQLローダーによるデータインポート

###### テーブルの作成日時を知る
    select object_name, to_char(created,'yyyy/mm/dd hh24:mi:ss') as created from user_objects where object_type = 'TABLE';

###### LOBデータ一覧
    SQL> select segment_name,table_name from dba_lobs where owner = 'ユーザ名';
現役学生と元教え子ちゃんの為のPHP入門#1

#目的
学生さんにPHPを学んでもらうために記述しています。
ついでに、「初心者」さん限定ですが、参考までに
わかってる人たちには不要な記事です。

#インストール
初心者がPHPプログラミングを始めるための基礎知識とインストール (1/2)
http://www.atmarkit.co.jp/ait/articles/1403/07/news028.html

しかし、ローカルサーバー前提ならば一発で済まします。

##Macなら
MAMP
http://www.mamp.info/en/

##Windowsなら
WAMP
http://sourceforge.jp/projects/sfnet_wampserver/releases/

##linuxなら
1.lamp-server
![スクリーンショット 2015-01-14 11.37.26.png](https://qiita-image-store.s3.amazonaws.com/0/33317/6756cfcd-837e-68b3-0627-b6ce2e2e1fc9.png "スクリーンショット 2015-01-14 11.37.26.png")



2.おまけlinuxbrew導入
公式
https://www.digitalocean.com/community/tutorials/how-to-install-and-use-linuxbrew-on-a-linux-vps

longkey1さんの解説サイト
http://longkey1.net/blog/2014/09/14/linuxbrew/
![スクリーンショット 2015-01-14 11.21.56.png](https://qiita-image-store.s3.amazonaws.com/0/33317/55e38f37-5c0e-9e34-0b61-3aa1cd01c66f.png "スクリーンショット 2015-01-14 11.21.56.png")
EmacsのInfo readerを使ってみよう

## はじめに

EmacsのInfo readerを紹介します。Emacs manualに詳細情報があります。詳しい使い方についてはそちらのドキュメントを参照していただき、この記事では、チートシートを用意したいと思います。

EmacsにはInfo documentation systemがあります。Info readerはInfo documentation systemで使用されるツールのことです。Emacsを起動して、F1を押して、Rを押して、Hを押すと、Info documentation systemのドキュメントが表示されます。

この記事を読むことによって、ドキュメントを読むときにノード内を移動したり、ノード間を移動したりが容易になると期待できます。

## nを押す

同じレベルの次のノードに移動します。

## pを押す

同じレベルの前のノードに移動します。

## SPCを押す

画面を下方向にスクロールする。

## DELを押す

画面を上方向にスクロールする。

## bを押す

Beginningを意味しています。
ノードの先頭に移動します。

## ?を押す

Infoモードが提供するコマンドを一覧表示します。

## Ctrlを押しながらl(el)を押す

カーソルがある行を画面の中央に再描画します。

## ]を押す

レベルに関係なく次のノードに移動します。

## [を押す

レベルに関係なく前のノードに移動します。

## mを押す

メニュー経由でノードに移動します。

## TABを押す

メニューのサブトピックに移動します。

## uを押す

Upのノードに移動します。

## lを押す

lastを意味しています。
クロスリファレンスがあったノードに戻ります。
(クロスリファレンス元のノードに移動します。)

## fを押す

クロスリファレンス経由でノードに移動します。
(クロスリファレンス先のノードに移動します。)

## iを押す

インデックスを検索します。
インデックス経由でノードに移動します。

## rを押す

l(el)を押して移動したあとならば、移動元に移動します。

## Lを押す

訪れたノードのリストを表示する。

## dを押す

Directoryノードに移動します。

## tを押す

Topノードに移動します。

## qを押す

Quit。

## あとがき

チートシートはいかがでしたか？ノード、ヘッダー、メニュー、クロスリファレンス、インデックスなどいくつか重要な情報の紹介を省略してしまっていますが、あなたにとってF1が身近な存在になっていたら幸いです。
Bitbucketのコミット内容をTrelloに渡す方法

現在プロジェクト管理を[Trello](https://trello.com)で行っています。
Trelloは動作が軽快かつ、わかりやすいUIで素晴らしいサービスですが、元々が開発向けではないので機能が足りない点がいくつかあります。

今回は[Zapier](https://zapier.com)を利用して、BitbucketのコミットメッセージをTrelloに渡す方法をご紹介します。

## Zapierとは

Zapierは各種Webサービスを連携させるハブサービスです。同じ系統のサービスにIFTTTがあります。
IFTTTに比べZapierのほうがビジネス向けとなっていて、かなりマイナーなサービスまでサポートしています。

参考: Zapierの対応サービス一覧
https://zapier.com/zapbook/apps/

無料で利用できますが、初期状態は処理できるタスクの数が100回/月と制限がかなり厳しいです。
ゲーミフィケーション要素があって、各条件を満たす事により無料でも最大1010回/月(基本100+ボーナス910)までタスク数を増やすことができます。

![46281223b896d96a1fbd94f509cfc47a-1024x668.png](https://qiita-image-store.s3.amazonaws.com/0/42958/f6442bbb-2725-264c-45d0-19874970a4b0.png)

## Zapierでタスクを設定する

下記リンクをクリックして新規タスクを作成してください。設定の手間をいくつか省略できます。
http://zpr.io/qWVt

すでにZapierのアカウントを作成している場合は、TrelloとBitbucketの連携を設定する画面が表示されます。

1から7まで設定項目があるので、順番に設定していきましょう。

1. Choose a trigger and action
何も変更しないでOK。

2. Select a BitBucket account
連携したいBitbucketのアカウントを設定。

3. Select a Trello account
連携したいTrelloのアカウントを設定。連携したアカウントでコミットの通知が行われるので、システム通知用のアカウントなどを作成することをオススメします。

4. Filter BitBucket triggers
[Owner] には所有者のユーザー名(リポジトリの所有者で無い場合のみ入力)
[Repo] にはTrelloと連携したいリポジトリを指定。

5. Match up BitBucket Changeset to Trello Comment
[Board] にはBitbucketと連携したいTrelloのボード名を指定。
[List] は 空欄。
[Card] は [Type a custom value(advanced)] を選択するとフォームにテキストが入力できるようになるので、{{message_tr}}と入力してください。message_trの表示が下記のようになっていればOKです。
![f9fd6ed79dc22083f381184ab83e4748-1024x147.png](https://qiita-image-store.s3.amazonaws.com/0/42958/bb9379c4-652b-3f24-8368-641f99c853f7.png)
[Comment Text] はすでに値がセットされています。[アカウント名] と [リポジトリ名] を連携させたいBitbucketのアカウント名とリポジトリ名に置き換えてください。
![b82af6dcf0f675f08dce21051cff37fa-1024x429.png](https://qiita-image-store.s3.amazonaws.com/0/42958/ad5a556a-a81f-c54d-1e63-9e865f9107f9.png)

6. Test this Zap
テストはスキップしてください。

7.  Name and turn this Zap on
タスク名を入力後、[Turn Zap On] を入力してタスクを保存してください。

## Trelloでカードを作成

タスクの設定が完了したので、BitbucketとTrelloの連携設定が正しいか確認しましょう。
Zapierに設定したTrelloのボードからカードを作成します。

![c473adc6006609447662a4044959e935.png](https://qiita-image-store.s3.amazonaws.com/0/42958/a2934a8f-0f09-1285-fc40-08f74290808e.png)

## カードIDを確認

作成したカードをクリックしてカードIDを確認します。trello.com/c/の後に続く文字列がカードIDです。これをコピーします。

```
https://trello.com/c/[カードID]/
```

## Bitbucketでコミットする

Zapierに設定したbitbucketのリポジトリからコミットします。

コミットメッセージには tr([カードID]) を含めるようにしてください。

例: Trelloとの連携テスト tr(Q67k2ISV)

## TrelloにBitbucketのコミット内容が反映されたか確認

しばらくするとTrelloにBitbucketのコミット内容が反映されます。
Zapierは無料版だと15分間隔で更新、有償プランだと5分間隔で更新されるので、反映まで少しタイムラグが発生します。

![3a6d5989f902eb175a1f7495750ef0e6-1024x437.png](https://qiita-image-store.s3.amazonaws.com/0/42958/5aa7d9ac-894c-cf68-3551-4794b504b184.png)

LinkをクリックするとBitbucketの対象コミットへ移動するので、コミット内容をすぐ確認できます。

以上で設定は完了です。

Trelloは他サービスと連携させることで、幅広いプロジェクトの管理に利用できます。
iOSとAndroidの公式アプリがあるので、スマートフォンからすぐに確認できるのが凄く便利です。
みなさんも利用してみてください。
PHPを使ってAmazon SESでHTMLメールを送信する方法

PHPからAmazonのSES経由でHTMLメールを送信する方法をまとめました。

## SESとは？
Amazonが提供するメール送信サービスです。
既にAWSを利用している場合、EC2やRDSで恩恵を受けているかと思いますが、SESも同様に低コストでスケーラビリティのあるメール送信サービスの実現が可能です。


詳しくは<a title="SES" href="http://aws.amazon.com/jp/ses/faqs/">こちらを</a>
&nbsp;

## 対応リージョン
この記事を書いている2015年1月の段階ではまだ東京リージョンでの展開が無い為、海外のリージョンを使うことになります。

US East (N. Virginia) リージョン
US West (Oregon) リージョン
EU (Ireland) リージョン

が対応しているのでこの３つの中から選択する事になります。
&nbsp;

## 費用
1,000 通当たり 0.10 USDで利用出来ます。

円換算すると

1,000 通で12.05円
(※2015年1月のレート)

1万通送っても120円ちょっとなのでかなり安いですね！
&nbsp;

## PHPからのSESメール送信
ようやく本題です。
SESをPHPから使う方法です。

#### コードを書く前に
AWS SDK for PHP をインストールが必要です。
手順は<a title="aws.pharのインストール" href="http://docs.aws.amazon.com/aws-sdk-php/guide/latest/installation.html#installing-via-phar">AWSのオフィシャルから確認してください</a>
&nbsp;

### コード
<pre>
//AWSSDK読み込み
require "aws.phar";

use Aws\Ses\SesClient,
use Aws\Ses\Exception\SesException,
use Aws\Common\Enum\Region;

//SES利用のイニシャライズ
$client = SesClient::factory(array(
　　'key' =&gt; 'AWSのkey',
　　'secret' =&gt; 'AWSのsecret',
　　'region' =&gt; Region::US_WEST_2, //リージョン指定。US_West_2を利用
));

//HTMLメールの内容
$html_templete = '&lt;b>SESからテスト送信&lt;/b>';

//HTMLメールのbodyと文字コードのセット
$body = array('Data' =&gt; $html_templete,'Charset' =&gt; 'iso-2022-jp');

//SESからメール送信
$mail = $client-&gt;sendEmail(array(

　　//FromとToの設定
　　'Source' =&gt; 'test_from@test.com', //FROMのメールアドレス設定
　　'Destination' =&gt; array(
　　'ToAddresses' =&gt; array('test_to@test.com'), //Toのメールアドレス設定
　　),

　　//件名の設定
　　'Message' =&gt; array(
　　　'Subject' =&gt; array(
　　　'Data' =&gt; 'SESからHTMLメール',
　　),

　　//本文の設定
　　'Body' =&gt; array('Html' =&gt; $body),
　　),
　)
);

//レスポンス受け取り
$response = $mail-&gt;toArray();
$message_id = $response["MessageId"];
$request_id = $response["ResponseMetadata"]["RequestId"];
</pre>

以上となります。
Specs2 でOutOfMemoryError が起きた場合の対処法


# 現象
Specs2 でゴリゴリテストを書いていると、Spec クラスが多くなって、私の環境では下記のような OutOfMemoryError が発生してしまいました。

```
Internal error when running tests: java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-7" java.io.EOFException
        at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2598)
...(snip)...        
```

# 前提
私の環境は下記の通りなので、下記環境を前提にします。

| 環境           | バージョン |
|:--------------:|:--------:|
| Mac OSX        | 10.9.5   |
| Scala          | 2.11.2   |
| sbt(activator) | 0.13.5   |
| Specs2         | 2.13.2   |

# ハマった点
まず初めに PermGen Space が足りてないということなのでプロセスを確認してみます。

```
$ ps auxww | grep java                                                                                                                     
2:uryu            14470 232.2  9.5  4089996 797916 s002  R+   10:44AM   1:27.16 /Library/Java/JavaVirtualMachines/jdk1.7.0_65.jdk/Contents/Home/bin/java -Dactivator.home=/Users/uryu
/workspace/push/push-notification -Xms1024m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256m -Xmx1024m -XX:ReservedCodeCacheSize=128m -Dsbt.log.format=true -Dconfig.file=module/api/c
onf/uryu-local.conf -Dlogger.file=module/api/conf/uryu-local-logger.xml -jar /Users/uryu/workspace/push/push-notification/activator-launch-1.2.10.jar
```

「--XX:MaxPermiSize=256m」となっているのにもかかわらず、
OutOfMemoryErrorになるのかよ…

activator の起動スクリプトを直接書き換えて「--XX:MaxPermiSize=512m」「--XX:MaxPermiSize=1024m」として再度テストを実行しても OutOfMemoryError が発生してしまいました。。

# 解決策
テスト実行中にプロセスを確認してみると

```
$ ps auxww | grep java
2:uryu            14595 100.2 14.3  3989124 1196096 s002  R+   10:45AM   3:38.82 /Library/Java/JavaVirtualMachines/jdk1.7.0_65.jdk/Contents/Home/jre/bin/java -Xmx1024m -classpath /Users/uryu/workspace/push/push-notification/module/api/target/scala-2.11/test-classes
...(snip)...
15:uryu            14470   0.1 11.7  4094620 985032 s002  S+   10:44AM   2:14.19 /Library/Java/JavaVirtualMachines/jdk1.7.0_65.jdk/Contents/Home/bin/java -Dactivator.home=/Users/ury
u/workspace/push/push-notification -Xms1024m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256m -Xmx1024m -XX:ReservedCodeCacheSize=128m -Dsbt.log.format=true -Dconfig.file=module/api/
conf/uryu-local.conf -Dlogger.file=module/api/conf/uryu-local-logger.xml -jar /Users/uryu/workspace/push/push-notification/activator-launch-1.2.10.jar
```

2つプロセスがあります。
テスト用のプロセスは親の activator から Fork された別プロセスだったんですね。(誰かに聞いた気がするけど失念してた)
これじゃあ、いくら activator のプロセスの Perm Size 変更してもテスト実行時は OutOfMemoryError になります。

テストもしくはアプリケーションのjavaOptionを変更／追加したい場合は build.sbt に下記のように記載すると良いようです。

```build.sbt
// activator の javaOptions を引き継ぎたい場合
javaOptions ++= sys.process.javaVmArguments.filter(a => Seq("-Xmx", "-Xms", "-XX").exists(a.startsWith))

or

// 自分で決めちゃう(テスト時のみ)
javaOptions in Test += "--XX:MaxPermSize=256m"
```
業務でよく使うMongoDBコマンドまとめ

今回は業務でよく使うMongoDBのコマンドの一覧をまとめました。

ぜひ、リファレンスとしてブックマークしてご活用ください！

## 検索

### 全件取得する場合

```
db.xxx.find();
```

### 条件(1つ)に該当するレコードのみ取得

```
db.xxx.find({id:1});
```

### 条件(複数)に該当するレコードのみ取得

```
db.xxx.find({id:1, name:'hoge'});
```

カンマで条件を複数指定可能

### ObjectIdで検索

```
db.xxx.find({_id:ObjectId("123f6152b84rw07f4000333b")});
```

### 期間指定

```
db.xxx.find({yyy:{$gte:***,$lte:***}});
```

yyyが$gte:以上, $lte:以下の条件で検索可能


### 多次元配列のレコードを検索

```
db.xxx.find({yyy.zzz:"hogehoge"})
```

配列の中に配列が存在するような、データの場合は「.」でつなげることでアクセス可能

最初はforでループしないといけないかと思いましたが、
これを使えば深い階層のカラムを条件にソートしたりできるので便利です。

### ソート

```
db.xxx.find().sort({yyy:-1});
```

yyyのカラムで降順にソート

```
db.xxx.find().sort({yyy:1});
```

昇順の場合は1を指定する

### データ件数を指定

```
db.xxx.find().limit(10);
```

10件のみ取得する

## 削除

### すべて削除

```
db.xxx.remove();
```

### 条件に該当するレコードのみ削除

```
db.xxx.remove({yyy:"hogehoge"});
```

## データエクスポート

### CSVエクスポート

下記のようにすると、条件に該当するデータの内、--fieldsで指定したカラムのみがCSVに出力される。

```
mongoexport -q 条件 -out [出力ファイル名].csv --csv --fields xx,yy,zz
```

### データベースを指定する場合

```
mongoexport -d [データベース名] -out [出力ファイル名].csv --csv --fields xx,yy,zz
```

### コレクションを指定する場合

```
mongoexport -d [データベース名] -c [コレクション名] -out[出力ファイル名].csv --csv --fields xx,yy,zz
```

### バックアップ

```
mongodump -d [データベース名] -c [コレクション名]
```

### リストア

```
mongorestore -d [データベース名] -c [コレクション名] xxx.bson
```
 
いかがでしたでしょうか？今回ご紹介したコマンド以外にも、

便利なコマンドがMongoDBにはたくさん用意されています。

うちではこんなコマンドをよく使ってるよ！等のご指摘ありましたらぜひコメントで教えてください！
【TravisCI】存在しないRubyのパッチバージョンを指定して実行するとどんな挙動になるのか

# 背景
* .ruby-versionの導入にあたって、CIでも変更加えることあるかなと見ていた
* .travis.ymlの```rvm: 1.9.3```ここが```rvm: `cat .ruby-version````とかにすればよさそう
* 「これTravisCI側が新しいRubyのバージョンをサポートするの遅かったらビルド自体できなくなるんじゃない？」とおもったので調査してみました

# 検証結果
* ```rvm: 1.9.3-p999```で実行
* そんなもんないっていわれてそっこーこけるww

![スクリーンショット 2015-01-14 11.36.26.png](https://qiita-image-store.s3.amazonaws.com/0/19778/052bb025-177a-9521-f723-ecb4d7ed2298.png)

* だが、以下の画面にパッチレベルまで表示してくれるので気をつけて使えば```rvm: `cat .ruby-version````としておくのも親切かもしれない
 * パッチが出る度にTravisCIでサポートされていることを確認した上で、手動で.travis.ymlを編集するのが安全ではあるが手間

![スクリーンショット 2015-01-14 11.45.14.png](https://qiita-image-store.s3.amazonaws.com/0/19778/ba5c5abe-c882-e982-3e37-5d7de3098858.png)


# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
genghisapp


mongo を GUI で操作するツール。
ビューワとしても便利。
異なるサーバもアクセスできる。
認証は使ってないのでわからないです。

http://genghisapp.com/
https://github.com/bobthecow/genghis


## インストール

gem install genghisapp


## 実行

genghisapp


## 表示

http://localhost:5678
DNS drillコマンドのオプションメモ

■はじめに
===

DNS名前解決確認の際、digコマンドを利用する事が多いですが、最近drillコマンドを利用してDNS名前解決確認をする事が増えてきました。

自分用にdrillコマンドの参考サイトや簡単な使い方をメモしてみました。

■参考サイト
===

以下のサイトを参考にさせて頂きました。

http://unbound.jp/ldns/drill/
http://www.atmarkit.co.jp/ait/articles/1412/19/news015.html
http://2014.seccon.jp/dns/dns_basics_in_30minutes.pdf

■drillコマンドの使い方の一例
===

・キャッシュDNSサーバに対して、Aレコードの名前解決を問い合わせる。

```
$ drill (問い合わせたいFQDN) @(キャッシュDNSサーバのIPアドレスやFQDN) A
```

・再帰検索要求を無効にして権威DNSサーバに対して、Aレコードの名前解決を問い合わせる。

```
$ drill -o ra (問い合わせたいFQDN) @(権威DNSサーバのIPアドレスやFQDN) A
```

・再帰検索要求を無効にして権威DNSサーバに対して、逆引きの名前解決を問い合わせる。

```
$ drill -z -o rd -x (198.51.100.XXX) @(権威DNSサーバのIPアドレスやFQDN)
```

・ルートDNSサーバから順番に問い合わせる

```
drill -T (問い合わせたいFQDN) @(キャッシュDNSサーバのIPアドレスやFQDN) 
```

※digでいうところの以下オプションに該当するようです。

```
dig +trace (問い合わせたいFQDN) @(キャッシュDNSサーバのIPアドレスやFQDN)
```
コマンドラインで gem パッケージがインストールされている事を確認したい

bundler がインストールされているかどうか調べたい。

```shell-session
gem list -i -l '^bundler$'
```

これで、bundler がインストールされていたら true と表示して成功する。インストールされていなかったら false と表示して失敗する。

gem 名の指定をただ `bundler` とするだけでは `*-bundler` もひっかかってしまうので正規表現で限定する必要がある。
Gitで特定のキーワードが初めて出現したコミットを探す方法

※コメントにてよりスマートな解決方法を提示して頂いたので、そちらを確認下さい。

git bisect と grep を組み合わせて使います。
下記の通り。

`git log --reverse`

を実行してinitial commitのハッシュ値をメモ。

`git bisect start`

bisect 開始。

`git bisect bad`

HEADをbad(=キーワードが既にある)状態として設定。

`git bisect good <initial commit のハッシュ値>`

initial commitをgood(=キーワードがまだない)状態として設定。

`git bisect run sh -c "! grep -R <キーワード> <検索ディレクトリ>"`

bisect の判定条件として、grepのキーワード検索結果を利用します。
Package Controlのインストール(Mac)

参考
http://keidrun.tumblr.com/post/73033053898/tips-sublime-text-sublime-text
![kobito.1421200301.636562.png](https://qiita-image-store.s3.amazonaws.com/0/59354/d873bc3a-46ab-bf69-ad92-e8d806e2de6d.png "kobito.1421200301.636562.png")


Package ControlはSublime Textに簡単にパッケージを入れるためのパッケージ管理ツールです。


(1)「Package Control」のZIPファイルをダウンロードします。
https://packagecontrol.io/installation#st3
![スクリーンショット 2015-01-14 10.56.06.png](https://qiita-image-store.s3.amazonaws.com/0/59354/3ead50da-dcd9-3fff-0e32-4eccb275e155.png "スクリーンショット 2015-01-14 10.56.06.png")
クリックしたらダウンロードが始まります。


(2)(1)でダウンロードしたファイルを　Contents > MaxOS > Packages の中に入れます。

![スクリーンショット 2015-01-14 11.03.07.png](https://qiita-image-store.s3.amazonaws.com/0/59354/47314eee-30ce-3756-6c0d-5385101d5e56.png "スクリーンショット 2015-01-14 11.03.07.png")


そしてSublimeTextを再起動したらインストールされていると思います。


(3)Package Controlが入っているかSublimeTextで確認する。
SublimeTextを起動して　shift + command + Pキー　で、コマンドパレットを表示します。
![スクリーンショット 2015-01-14 11.06.26.png](https://qiita-image-store.s3.amazonaws.com/0/59354/bfcffa6b-9c15-9e97-f4b1-1b58ef34cbb0.png "スクリーンショット 2015-01-14 11.06.26.png")
こんな感じに入っていたらOKです。
Sails.js(0.10.x)で多言語対応

特に難しい話でもないので簡単にメモ。

## 実装
i18n(InternationalizatioN)の設定。対応言語をlocalsに配列の形で記述して、defaultLocaleにデフォルトの言語を設定。

``` /config/locals/i18n.js
module.exports.i18n = {
 locales: ['en', 'ja'],
 defaultLocale: 'en',

 // updateFiles: false,
 // localesDirectory: '/config/locales'
};
```

`/config/locales/`以下に書く言語ごとのjsonファイルを設置して変換テーブルを作る。

``` /config/locales/en.json
{
  "Hello": "Hello"
}
```

``` /config/locales/ja.json
{
  "Hello": "こんにちは"
}
```

Viewで以下のように記述したら終わり。

``` View/page/start.ejs
<h1><%- __('Hello') %></h1>
```

## テスト
chromeで言語設定を変更する。chromeの設定(URLに`chrome://settings`でいける)から詳細設定を表示して「言語」を選択。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/52054/5e3cb6ad-9a02-548f-b27d-48c809dd30ab.png)

英語を一番上にドラッグして「完了」

![3.png](https://qiita-image-store.s3.amazonaws.com/0/52054/ddb985b7-4052-304c-4f97-db7c0c7c4581.png)

これで英語で表示されるはず。