OmniAICreator/Qiita-1.07M huggingface dataset:
ついconsole.logを使ってしまわないための最初のnode-inspector

Node.js の開発時に`console.log` でスクリプトの中のデータを
確認してしまいがちなのですが、やっぱり [node-inspector](https://github.com/node-inspector/node-inspector) を使ったほうが
効率が良かったりする。

# 使い方

node-inspector をインストール

```bash
$ npm install -g node-inspector
```

`--debug-brk` をつけて実行

```bash
$ node --debug-brk app.js
debugger listening on port 5858
```

node-inspector を実行

```bash
$ node-inspector
Node Inspector v0.7.4
Visit http://127.0.0.1:8080/debug?port=5858 to start debugging.
```

ChromeやSafariなどでwebブラウザでアクセス。

```bash
$ open "http://127.0.0.1:8080/debug?port=5858" # macなら
```

こんな感じで画面が表示される。
s

![node-inspector.png](https://qiita-image-store.s3.amazonaws.com/0/3163/8671508e-e3ff-e6b0-3ecc-f3b745d93ae3.png)

# mochaでも使える

テストフレームワークの[mocha](http://visionmedia.github.io/mocha/)でも使える。
起動時に`--debug-brk`を指定する。

```bash
$ mocha  --debug-brk app.js
debugger listening on port 5858 
```

# grunt経由で使う

[nodemon](https://github.com/remy/nodemon)でexpressを立ち上げながら、node-inspectorを起動する例。

```javascript:Gruntfile.js
  grunt.initConfig({
    nodemon: {
      dev: {
        script: './bin/www',
      },
      options: {
        nodeArgs: ['--debug']
      }
    },
    concurrent: {
      target: {
        tasks: ['nodemon:dev', 'node-inspector'],
        options: {
          logConcurrentOutput: true
        }
      }
    },
    "node-inspector": {
      dev: {
      }
    }
  });


  // plugins
  grunt.loadNpmTasks('grunt-nodemon');
  grunt.loadNpmTasks('grunt-concurrent');
  grunt.loadNpmTasks('grunt-node-inspector');

  // tasks
  grunt.registerTask('serve', ['concurrent:target']);
```

expressもnode-inspectorも起動しっぱなしになるので、平行でタスクを走らせる [grunt-concurrent](https://github.com/sindresorhus/grunt-concurrent)を使っています。
WindowsのあのフォルダはUNIX/Linuxで言えばあそこだ

日頃Windows使っててたまにUNIX系のレシピ読むと「適当なディレクトリ」という記述を見た瞬間に詰みます。料理できない人が「醤油適量」で死ぬくらいの致死率です。

というわけで日頃Windows使ってる人なりにディレクトリの対応表をまとめました。FHSの正確な定義よりはざっくりこんな使われ方だから近いよねで分類しています。
また、UNIX/LinuxのパッケージマネージャにWindowsで相当するのはソフトのインストーラではなく、機能・役割の有効化だと解釈しています。

* 姉妹編つくりました
[ファイルのユーザ権限制御・Windows vs UNIX比較](http://qiita.com/yuba/items/f45a56f8e262572ff9dc)

| Windows|働き| UNIX |
|:-----------|:------------|:------------|
| レジストリ|Windowsのシステム設定・各種ソフトウェアの動作設定はレジストリに保存するのが一般的だが、UNIX系ではソフトウェアごとのテキストベース設定ファイルに保存するのが一般的。OS向けの設定は特に /etc/sysconfig に。| /etc, /etc/sysconfig|
|C:\Windows\System32\drivers\etc|WindowsにもUNIX由来の設定ファイルがあるのでそれ用のディレクトリ…といってもほとんどの開発者にとってはhosts格納専用でしょう。| /etc|
|C:\Windows|コマンド。/binは一般ユーザ用で/sbinは管理用。/usr配下のはこれらの別名のことが多いが、独立していてオプショナルなコマンドを格納している構成もある。ここをいじっていいのはパッケージマネージャだけ。|/bin, /sbin, /usr/bin, /usr/sbin|
|C:\Windows\System32|共有ライブラリ。ここをいじっていいのはパッケージマネージャだけ。|/lib|
|C:\Windows\System32\drivers|ドライバ。UNIX系ではカーネルモジュールの一種としてドライバを位置づける。|/lib/modules/【OSバージョン】|
|C:\Program Files\Common Files|ユーザがインストールした共有ライブラリ|/usr/local/lib|
|C:\Program Files|ユーザがインストールしたプログラム。ディレクトリを作る。|/opt|
|（該当なし。ユーザーが自分で格納用ディレクトリを作ることが多い）|ユーザがインストールしたプログラム。ディレクトリを作らない単体のもの。|/usr/local/bin|
|C:\Users\【ユーザー名】|ユーザーのホームディレクトリ。UNIXでは管理者だけ/home以下でなく/rootというホームディレクトリを持つ。|/home/【ユーザー名】, /root|
|（ユーザーの）スタートアップ<br/><br/>とても深いディレクトリ。コマンド`shell:startup`で開けます。@tukiyo3 さんより|ログイン時に実行されるプログラム。Windowsではショートカットを集めたフォルダだがUNIXではスクリプトファイル。|/home/【ユーザー名】/.bash_profile, .bash_login, .profile<br/>このほか、シェルプログラム起動のたびに実行される .bashrc 。も|
|（全員の）スタートアップ|〃|/etc/profile|
|コントロール パネル\システム\システムの詳細設定\環境変数|DOS時代はAUTOEXEC.BATで設定していた環境変数をWindowsではコントロールパネルで設定するようになりましたが、UNIXではDOSと同じく起動スクリプトで設定します。<br/>注意点としてUNIXの環境変数はDOS/Windowsのものと違い、明示的にexportしたものしか子プロセスに引き継がれません。|/home/【ユーザー名】/.bash_profile, .bash_login, .profile,<br/>/etc/profile|
|C:\Users\【ユーザー名】\AppData\Roaming, Local, LocalLow|アプリが作るデータディレクトリ。WindowsではAppData以下に作られるが、UNIX系ではホームディレクトリ直下。.config以下に作る場合も。|/home/【ユーザー名】,<br/>/home/【ユーザー名】/.config|
|C:\ProgramData|サービスのデータ・ログ|/var|
|C:\inetpub|Webコンテンツ|/var/www|
|C:\Windows\Temp,<br/>C:\Users\【ユーザー名】\AppData\Local\temp|一時ファイル置き場。自動削除はされない。消えてるとしたら誰かがタイマーで消している。|/var/tmp|

で、結局「適当なディレクトリ」ってどこのことですかって？
実行ファイル一本のプログラムを展開するなら /usr/local/bin/ 、ディレクトリ構造持ったアプリを展開するなら /opt/ でいいんじゃないすかね。
scpコマンドでアップロード＆ダウンロード

(例) リモートホストのポート番号22でindex.html を転送する

* ローカルホスト→リモートホストへ転送（アップロード）

```
// ローカルホストで実行
$ scp -P 22 index.html admin@domain.com:/home/admin/htdocs/
```


* リモートホスト→ローカルホストへ転送（ダウンロード）

```
// ローカルホストで実行
$ scp -P 22 admin@domain.com:/home/admin/htdocs/index.html ./

```
リリースされたばかりのRubyGems 2.3.0 の open コマンドを試そうとしたら無かった。

# リリースされたばかりのRubyGems 2.3.0 の open コマンドを試そうとしたら無かった。

## 概要
リリースされたばかりのRubyGems 2.3.0 の open コマンドを試そうとしたら無かった。  
.
.
.
.
.
.
.
.
.
.
.

~~~
　　　　　　　　 ,. -‐'''''""¨¨¨ヽ
　　　　 　 　 (.＿＿_,,,... -ｧァﾌ|　　　　　　　　 　あ…ありのまま 今　起こった事を話すぜ！
　 　 　 　 　 |i i|　 　 }!　}} /／|
　　　　 　 　 |l､{　 　j}　/,,ｨ//｜　　　　　　　『おれはRubyGems 2.3.0 の 
　　　　　　　 i|:!ヾ､_ﾉ／ u {:}//ﾍ　　　　　　　　　　open コマンドを試そうと思ったら無かった』
　　　　　　　 |ﾘ u' }　 ,ﾉ　_,!V,ﾊ |
　　 　 　 ／´fト､_{ﾙ{,ィ'ｅﾗ　, ﾀ人　　　　　　な…　何を言ってるのか　わからねーと思うが
　　　　 /' 　 ヾ|宀| {´,)⌒`/ |<ヽﾄiゝ　　　　　　 おれも何をされたのかわからなかった…
　　　　,ﾞ　 ／ )ヽ iLﾚ 　u' |　| ヾｌﾄﾊ〉
　　 　 |／_／　 ﾊ !ニ⊇　'／:} 　V:::::ヽ　　　　　　　　頭がどうにかなりそうだった…
　　　 /／ 二二二7'T'' ／u'　__ /:::::::/｀ヽ
　　　/'´r　-―一ｧ‐ﾞＴ´　'"´ ／::::／-‐ 　＼　　　　 typo だとか 未アップデート だとか
　　 / // 　 广¨´ 　/'　　 ／:::::／´￣｀ヽ ⌒ヽ　 そんなチャチなもんじゃあ　断じてねえ
　　ﾉ ' /　 ノ:::::`ー-､___／:::::／/ 　 　 　 ヽ　　}
_／｀丶　/::::::::::::::::::::::::::￣`ー-{:::...　　　ｲ  もっと恐ろしいものの片鱗を味わったぜ…
~~~

## 発端

2014/06/10にリリースされたばかりの RubyGems 2.3.0 の open コマンドを使ってみようと思ったのが  
全てのはじまり。  

※リリースフィーチャーは以下に載っています  
http://blog.rubygems.org/2014/06/10/2.3.0-released.html

## まずは gem を update

~~~bash
$ gem update --system
$ gem -v
2.3.0
~~~

## さっそく実行してみる

~~~bash
$ gem open rails
ERROR:  While executing gem ... (Gem::CommandLineError)
    Unknown command open
~~~

あれ？コマンド間違えたかな？  

## ヘルプを確認する

~~~bash
$ gem help open
$ WARNING:  Unknown command open.  Try: gem help commands
~~~

あれ？？？  

~~~bash
$ gem help commands | grep open
~~~

やっぱりない。なぜだ？

## GitHub の RubyGems の Issue を漁る

https://github.com/rubygems/rubygems/issues/789

### espen さんのコメント（2014/06/11 12時33分 ※2.3.0リリース後）

~~~
I'm unable to use this command.

~ gem open rails -e nano
ERROR: While executing gem ... (Gem::CommandLineError)
Unknown command open
~ gem --version
2.3.0
~~~

うん、私と同じ状態だ。

### drbrain さんのレス

~~~
espen This was fixed by 1c9572a
~~~

### 1c9572a のリンク先を見てみる

https://github.com/rubygems/rubygems/commit/1c9572a  

ちょｗコミットコメントｗ  

~~~
Add open to list of builtin commands
This was missed when the open command was added.
~~~

open コマンド追加するの忘れてたとか・・・  

### espenさんのレス

~~~
Awesome, thanks for the quick fix (I also lol'ed about this - sorry).
~~~

### 「lol'ed」ってなんだ？ググる。

http://www.internetslang.com/LOLED-meaning-definition.asp

~~~
LOLED is "Past tense of LOL"
~~~

LOLの過去形？LOLってなんだ？リンクをたどる。

http://www.internetslang.com/LOL-meaning-definition.asp

~~~
The definition of LOL is "Laughing Out Loud"
~~~

大声で笑うか。で、その過去形。「ワロタｗｗｗ」ってことか。

### drbrain さんのレス

~~~
I LOL'd too!
~~~

「おれもワロタｗｗｗ」か。  
機能を丸ごと1つリリースし忘れて笑って済むのは平和で良いですね。  

で、結局修正版はまだリリースされていないようなのでしばらく待ちます。（2014/06/13時点）  
open commandが気になる方は下記にソースコードがあります。  

https://github.com/rubygems/rubygems/blob/master/lib/rubygems/commands/open_command.rb
「Excel列名変換問題」をPHPで解く

http://blog.jnito.com/entry/20111102/1320253815
http://blog.jnito.com/entry/20111231/1325304733

ExcelのA1参照形式(A列B列…)とR1C1参照形式(1列2列…)を相互変換する問題。

上限無しとかいう制限が入っていますが、とりあえず普通にintの範囲で記述します。
あちらの解答例もint越えを全く考慮してないので特に問題ないでしょう。

```php
<?php
	class EXCEL{
	
		/**
		* Excelの列変換、数値から文字列に
		* @param int 「1」みたいな数値
		* @return String 「A」みたいな文字列
		*/
		public function getStr($input){
			$ret = '';
			do{
				$tmp = gmp_div_qr($input, 26);
				$input = gmp_intval($tmp[0]);
				$amari = gmp_intval($tmp[1]);
				// 割り切れる場合は0ではなく26として扱う
				if($amari === 0){
					$input--;
					$amari = 26;
				}
				$ret .= chr($amari+64);
			}while($input);
			
			return strrev($ret);
		}
		
		/**
		* Excelの列変換、文字列から数値に
		* @param String 「A」みたいな文字列
		* @return int 「1」みたいな数値
		*/
		public function getInt($input){
			$digit = strlen($input)-1;
			$ret = 0;
			for($i=0;$i<=$digit;$i++){
				$ret += (ord($input[$digit-$i])-64) * (26**$i);
			}
			return $ret;
		}
		
	}
	
	// 以下はテスト
	$test = [
		[1, 'A'],
		[2, 'B'],
		[3, 'C'],
		[25, 'Y'],
		[26, 'Z'],
		[27, 'AA'],
		[28, 'AB'],
		[51, 'AY'],
		[52, 'AZ'],
		[53, 'BA'],
		[54, 'BB'],
		[256, 'IV'],
		[16384, 'XFD'],
	];

	$excel = new EXCEL();
	foreach($test as $key=>$data){
		$answer = $excel->getStr($data[0]);
		if($answer !== $data[1]){
			print('えらー');
		}
	}
	foreach($test as $key=>$data){
		$answer = $excel->getInt($data[1]);
		if($answer !== $data[0]){
			print('えらー');
		}
	}
```

第1問第2問合わせても30分かかりませんでした。
つうか第2問のほうが簡単で5分くらいで終わったんだが。
まあPerlで解けと言われたら解けませんけどね。

考え方は簡単で、単に26で割っていくだけです。
26で割り切れる場合だけ注意が必要ですが、それ以外は単純にchr()で数値文字を変換すればいいです。
逆に数値にする場合は、26の例外すらも一切不要です。
何の問題もなく完成。

しかしまあ$amariはないな。
[Systemverilog]foreverなタスクをkillして殺す。

##はじめに
以前、もっとキレイな記述をした記憶があるんですが、探しても見つからなかったため、メモ代わりです。

##背景
テストの場合、`always`文は極力使わず`forever`文を使う自分ですが、いったん`forever`文で走らせたタスクのparameterをrandomizeし直したい時があります。
 **何を言っているんだお前は** と言われそうですが、まあテスト担当として未熟なんで軽くやりたいんですよねホント。

##processクラス
で、使うのがprocessクラスです。
これはSystemVerilogにビルドインされているクラスで、タスクで発生したスレッドの制御を行うことができます。主に、`fork`～`join..`とかでタスクを並列実行させてる場合に有効です。とはいっても、これを使っている人、 **あまり見たことない。**
検索すると[この辺](http://www.testbench.in/SV_31_FINE_GRAIN_PROCESS_CONTROL.html)とか出てくるんですが、LRMのサンプルそのまんまなんですよね。

`fork`～`join..`で`forever`文が入ったタスクは、`disable fork`や`disable` *label* でうまく消すことができませんでした。ちょっと調べた限り、そんな例はない。たぶん **誰もやらない。** なので、このクラスのkill functionを使ってみます。

つまりforeverで走らせるんだけど、やりなおしたい、どうにもならない、なんでprocessクラスを使って
![b4f3183d-s.jpg](https://qiita-image-store.s3.amazonaws.com/0/32925/0550ce54-b47e-8d77-9d62-e39b76573cef.jpeg)
ということになるんですな。


##コード
クロック発生させてみました。周波数は1..100ns周期のランダムで始まり、500ns進むと、周波数がランダムに変わります。

```sv:kill.sv
`timescale 1ns/1ps

interface my_if;
  logic clk;
endinterface

class clk_period;

  real             period;
  rand   bit[63:0] bit_period;

  bit[63:0] max_period = $realtobits(100.0);
  bit[63:0] min_period = $realtobits(1.0);

  process p;

  virtual my_if v_myif;

  constraint c_period{ (bit_period > min_period) && (bit_period < max_period) ; }

  function new(virtual my_if m);
    v_myif = m;
  endfunction

  function void post_randomize();
    period = $bitstoreal(bit_period);
    $display("CLK PERIOD == %f", period);
  endfunction

  function logic init_clk(logic clk);
    clk = '0;
    return clk;
  endfunction

  task clkgen(real period);
    v_myif.clk = init_clk(v_myif.clk);
    forever #(period/2.0) v_myif.clk = ~v_myif.clk;
  endtask

  task killer(int ptime);
    wait(p != null);
    #ptime;
    p.kill();
  endtask

  task run(int ptime);
    fork
      begin
        p = process::self();
        clkgen(period);
      end
      killer(ptime);
    join_none
  endtask

endclass

module tb();

  my_if      myif();
  clk_period cp;

  initial begin
    cp = new(myif);
    if(cp.randomize())
      cp.run(500);
    #500;

    cp = new(myif);
    if(cp.randomize())
      cp.run(500);
    #500;

    $finish(1);
  end

endmodule
```

先に書いたようにprocessクラスはSystemVerilogのビルドインなので、コードの中では強調されてませんが、`process`で宣言します。
ぐっと下がって、runタスクにあるself()関数を使い、リソースをゲットします。selfはスコープ演算子を使います。あとはclkgenタスクとkillerタスクが平行で実行されます。
clkgenタスクはクロック発生器です。
killerタスクは、リソースのゲットを待ち、ゲットされたらptime経過後、プロセスを無理やり全部killします。つまりclkgenタスクも消滅します。

##おわりに
コードが全体的に、昔記憶していたものと比べて汚い気がします。
というか、processクラス使わなくても、これくらいならdisable forkができそうな…。
数学ガールの秘密ノート第80回をRubyで実装

https://cakes.mu/posts/6076
今回の秘密ノートは、log10(2)を挟み撃ちで求める内容だった。

今回、円周率をアルキメデスの方法で求めるのと異なり、漸化式の中にifが入る。
これは(平均ではなく)比の平方根を使った変形二分法といえるので、練習を兼ねてRubyで実装してみた。
問題文の制約通り、平方根(と有理数クラス)しか使っていない。

とりあえず、`log10(10**(1233/4096)) < log10(2) < log10(10**(4933/16384))`であり、0.3010までは確認できた。
(0.301029995...と続くので、次に桁を確定するためにはEPSをかなり減らさねばなりません。)

```rb:mathgirl_note80.rb
#!/usr/bin/env ruby
require 'rational'
EPS=0.0001
TARGET=2
l1=1
l2=Rational(0,1)
h1=base=10
h2=Rational(1,1)
# make sure l1<TARGET<h1
raise 'TARGET must be between l1 and h1 (exclusive)' if TARGET<=l1 || h1<=TARGET
d1=h1
d2=h2
while h2-l2>EPS
	d1=Math.sqrt(d1) # √10,√√10,√√√10,...
	d2/=2 # 1/2,1/4,1/8,...
	# Here, l1*d1*d1 == h1
	if l1*d1<TARGET
		l1*=d1
		l2+=d2
	else
		h1/=d1
		h2-=d2
	end
end
puts "#{l2.to_f} (log#{base}(#{base}**(#{l2}))) < log#{base}(#{TARGET}) < #{h2.to_f} (log#{base}(#{base}**(#{h2})))"

# 0.301025390625 (log10(10**(1233/4096))) < log10(2) < 0.30108642578125 (log10(10**(4933/16384)))
```
elasticsearchでindexの設定を更新する

```
PUT /some_index
{
  "settings": {...}
}
```
としてインデックスを作成後、

```
PUT /some_index/_settings
{...}
```

で設定の更新ができると思ったが、errorが発生し更新できなかった。

## 手順
まず、indexをcloseする必要がある。

```
PUT /some_index/_close
```
これで、あとは以下のように更新ができる。

```
PUT /some_index/_settings
{...}
```

終わったらopenする。

```
PUT /some_index/_open
```
TitaniumでiOSアプリとAndroidアプリを開発する時の違い

Titanium v3.2でAlloyを使ってiOSアプリとAndroidアプリを作成した時の違いです。他にもいろいろありそう。。。

## シミュレータ

#### iOS
軽快に動く

#### Android
全然ダメ、やっと動いたと思ったらめちゃ重いし、突然落ちたりするので、実機を繋いでビルドする方がいいです

## 「戻る」ボタンの実装
#### iOS
NavigationWindow(旧：NavigationGroup)が使うと勝手に出てきます。

#### Android
デバイスの戻るボタンを活用します。
何もしないとアプリを終了してしまうので、新規に開くWindowにオプションをつけます。

```html
<Window title="detail" class="container" exitOnClose="false" fullscreen="false">
```
exitOnCloseとfullscreenがポイント


## モジュールのファイル名への制限
app/lib以下に配置した共通モジュールについて

#### iOS
特になし

#### Android
iOS版で動いていたモジュールがなぜか動かずで、ファイル名を変更したら動きました。
どうやら変数名とファイル名がかぶっているとダメっぽいです。


## TableView
clickイベントの取得方法が若干違いました。

#### iOS
問題なく動く

```js:clickイベント
$.myTblView.addEventListener('click', function(e) {
    var name = e.rowData.name
}
```

#### Android
なんか、、、めっちゃ重くてカクカクする。（でも新しい機種ならある程度解消できてるかも）

古い機種対応を考えるとListViewで代用する方がいいです

後TableViewのeditプロパティが使えないので、自前で実装するしかない

```js:clickイベント
$.myTblView.addEventListener('click', function(e) {
    var name = e.row.name
}
```

## プッシュ通知
AppceleratorCloudService（ACS）を使います。

iOSの場合だとプッシュ通知に使う証明書を取得したり、AndroidだとGCMに登録したりの違いがありますが、ここでは省略します。

参考：http://fromkk.me/ti_cloudpush_with_titanium/

違いはデバイストークンを取得するところと、登録するところ
#### iOS

```js:デバイストークン取得サンプル
function getDeviceToken(){
	Titanium.Network.registerForPushNotifications({
		types: [
			Titanium.Network.NOTIFICATION_TYPE_BADGE,
			Titanium.Network.NOTIFICATION_TYPE_ALERT,
			Titanium.Network.NOTIFICATION_TYPE_SOUND
		],
		success:function(e)
		{
			deviceToken = e.deviceToken;
			Pass = deviceToken.substr(0,8);
			
			//デバイストークンとパスワードを元にACSにログインを試みる
			//ログイン失敗したらユーザーがまだないので新規に作成する
			//ここはiOS、Android共通
			loginDefault();
								
		},
		error:function(e)
		{
			alert("Device Token Error: "+e.message);
		},
		callback:function(e)
		{
			alert("push notification received"+JSON.stringify(e.data));
		}
	});
```

#### Android

```js:デバイストークン取得サンプル
function getDeviceToken() {
	var CloudPush = require('ti.cloudpush');
	CloudPush.addEventListener('callback', function(evt) {
		alert(evt.payload);
	});
	CloudPush.addEventListener('trayClickLaunchedApp', function(evt) {
		Ti.API.info('Tray Click Launched App (app was not running)');
	});
	CloudPush.addEventListener('trayClickFocusedApp', function(evt) {
		Ti.API.info('Tray Click Focused App (app was already running)');
	});
	CloudPush.retrieveDeviceToken({
		success: deviceTokenSuccess,
		error: deviceTokenError
	});
	
	function deviceTokenSuccess(e) {
		Ti.API.info('Device Token: ' + e.deviceToken);
		//Alloy.CFG.deviceToken = e.deviceToken;
		deviceToken = e.deviceToken;
		Pass = deviceToken.substr(0,8);
		loginDefault();
		
		CloudPush.enabled = true;
	}
	
	function deviceTokenError(e) {
		alert('Failed to register for push! ' + e.error);
	}
}
```
jsonのDateがlong値の場合の、GsonBuilder対処法

# Android開発序盤で少し悩んだこと
- APIからjson取ってきてgson使ってparse楽勝って思ってた
- そしたら、APIのdateがtimestampなとこでエラった 

```console.log
com.google.gson.JsonSyntaxException: 1402654656000
```
( ´ー｀)ﾌｩｰ．．．GsonBuilderで簡単にformat定義できるかなって思ってた。
でも探したり試したりしたけど、なんか上手くいかない。。
良い方法あるのかもだけど。。

## 解決方法
- 以下のように定義したら上手く変換してくれたヽ(｀▽´)/ 
 
```
Gson gson = new GsonBuilder()
        .registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
            @Override
            public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
                return json == null ? null : new Date(json.getAsLong());
            }
        })
        .create();
```

- もっと良い方法があるのかもしれないが、とりあえずよかたε-(´∀｀*)ﾎｯ

## おまけ
- ググったら解決したけど、fromJsonで  
beanじゃなくてListItem型になった問題の解決

```
// ListResponseはgenerics型のbean
ListResponseDto<ArticleDto> articles = gson.fromJson(body,
        new TypeToken<ListResponseDto<ArticleDto>>() {
        }.getType()
);
```
Cyrus（IMAP）で既読情報が正しく反映されなくなった際の対応

#概要
何かの拍子に、既読情報が正しくCyrus（IMAP）に反映されなくなることが有る。
その場合、既読情報を管理する **.seen** というファイルが壊れている。
基本的にそのファイルを削除してCyrusを再起動すればOK

#方法
１．まずは.seenファイルが置かれている場所を探す。
`/etc/imap.conf`に`configdirectory: /var/lib/imap`という記述があるのでそこに移動。

２．そこに`user`というディレクトリがあるので更にそこに移動。

３．すると以下のようにaからzのディレクトリが有る。

```
linux:/var/lib/imap/user # ls
.  ..  a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z
linux:/var/lib/imap/user # 

```
imapで接続するユーザ名の頭文字のディレクトリに移動。

４．ユーザ名が例えば`koji`の場合、`koji.seen`というファイルが有るはずなので、cyrusを停止後、`koji.seen`を削除して、再度cyrusを起動する。（念の為seenファイルをどこかにバックアップしておいたほうがいいかも？）

```
linux:/var/lib/imap/user/k # /etc/init.d/cyrus stop
linux:/var/lib/imap/user/k # cp koji.seen koji.seen.20140613
linux:/var/lib/imap/user/k # rm koji.seen
linux:/var/lib/imap/user/k # /etc/init.d/cyrus start
```

５．これで終了。念の為Postfixとかメール系のサービスを全部一旦再起動したほうが安心かも。
MATLAB-Sample 【基礎】ディレクトリ/ファイル選択ダイアログ

MATLABでディレクトリの選択やファイルの選択をしたい時のサンプルコード。
前提として、次のようなディレクトリ、ファイル構成になっているものとする。

D:\work\csv_data\data_001_ver1.csv
D:\work\csv_data\data_001_ver2.csv
D:\work\csv_data\data_002_ver1.csv
D:\work\csv_data\memo.txt



# ディレクトリを選択する

`uigetdir`関数を使用する。様々な引数指定が可能だが、通常オープンしたいディレクトリをデフォルトディレクトリとして指定すると思うのでそのパターンを。
ちなみに、

```matlab
> % 第1引数にデフォルトのディレクトリパスを指定。
> % 第2引数にダイアログのタイトルを指定。
> dir_path = uigetdir('D:\\work', 'ほげほげ');
```

表示されるダイアログは次のようになる。

![ディレクトリ選択その1](https://qiita-image-store.s3.amazonaws.com/0/39876/9a2fdeb1-be51-eac0-e89b-0bfd06fe0472.png)

ダイアログ中でディレクトリを移動して「フォルダの選択」ボタンをクリックするとダイアログが閉じる。

![ディレクトリ選択その2](https://qiita-image-store.s3.amazonaws.com/0/39876/f93fea49-3e5f-e33d-ddd7-27b664e545ac.png)
![ディレクトリ選択その3](https://qiita-image-store.s3.amazonaws.com/0/39876/f53ee35a-1503-a86a-f10c-96ddc82d1480.png)

MATLABに制御が戻るので`uigetdir`関数の返り値`dir_path`を確認。

```matlab
> dir_path

dir_path =

D:\work\csv_data

> 
```
というわけで、選択したディレクトリのパスが取得できる。



# ファイルを選択する

`uigetfile`関数を使用する。こちらも様々な引数指定が可能だが、例によって良く使いそうなパターンのみを紹介。
ちなみに、`uigetfile`関数はC、java、C#あたりから来てる人にとってはあまり見慣れない記述の仕方（多値の返却）を行う。
要するに、複数の返り値が返せるよということ。ではさっそく。

```matlab
> % 第1引数：フィルタとなるファイルの拡張子を指定。複数指定したい場合は下記の通り。
> % 第2引数：ダイアログのタイトル文字列。
> % 第3引数：デフォルトで表示するディレクトリパス。
> % 返り値 ：file_nameにはファイル名、ディレクトリパスは次の変数pathに格納される。3番目の値は…よくわからない。すんません。
> [file_name, path, filter_index] = uigetfile({'*.csv', 'CSV files' ; '*.txt', 'Text files'}, 'ふがふが', 'D:\\work\\csv_data\\');
```

そうするとこんな感じでファイル選択ダイアログが表示される。

![ファイル選択その1](https://qiita-image-store.s3.amazonaws.com/0/39876/460150c4-0281-4515-3838-7737ab463e96.png)

第1引数で指定したフィルタアイテムが２つ選択できる状態で表示される。フィルタもちゃんと機能していることが確認できる。
「data_001_ver1.csv」を選択し「開く」ボタンをクリックすると、MATLABに制御が戻ってくる。
返り値を確認。

```matlab
>> file_name

file_name =

data_001_ver1.csv

>> path

path =

D:\work\csv_data\

>> filter_index

filter_index =

     1

> 
```

# 複数のファイルを選択する

単一のファイルだけでなく、複数のファイルを選択することもできる。
キーワードとして`'MultiSelect'`を、キーワードの値として`'on'`を指定する。

```matlab
> % 第4引数：'MultiSelect'を指定。
> % 第5引数：'on'を指定。
> [file_name, path, filter_index] = uigetfile('*.csv', 'ふがふが', 'D:\\work\\csv_data\\', 'MultiSelect', 'on');
```

表示されたダイアログでは複数のファイルが選択できる。（Ctrlキーを押下しながらマウスでファイルを選択。）

![ファイル選択その2](https://qiita-image-store.s3.amazonaws.com/0/39876/35e1015d-e30d-3c06-e584-5cea613802f4.png)


開くボタンをクリックすると、MATLABに制御が戻ってくる。`uigetfile`関数の返り値を確認。

```matlab
> % 返り値を確認すると、`file_name`に複数のファイル名が格納されている。
> file_name

file_name = 

    'data_001_ver1.csv'    'data_002_ver1.csv'

> path

path =

D:\work\csv_data\

> filter_index

filter_index =

     1

> 
```
MYSQLのバックアップとリストア

1.データベースのダンプファイルを生成します。
mysqldump -u[MYSQL_USER_NAME] -p[PASSWORD] [DB_NAME] > [DB_DUMP_FILE_PATH]

2.リストア先のデータベースを作成します。
CREATE DATABASE [DB_NAME] DEFAULT CHARACTER SET utf8;

3.リストア先のデータベースユーザと権限を設定します。
GRANT ALL PRIVILEGES ON [DB_NAME].* TO [MYSQL_USER_NAME]@localhost IDENTIFIED BY '[PASSWORD]';

4.データベースのリストアを行います。
mysql -u[MYSQL_USER_NAME] -p[PASSWORD] [DB_NAME] < [DB_DUMP_FILE_PATH]

以上です。
MySQL Workbenchでクエリー結果が変化しなくなった場合の対処法（クエリキャッシュクリア方法）

　更新されたはずのレコード内容がMySQL Workbnechで確認すると以前のまま！と、ちょっとハマりました。
![スクリーンショット 2014-06-13 20.05.06.png](https://qiita-image-store.s3.amazonaws.com/0/42140/76fff6e8-8bcb-b293-e654-d75a1c97fe46.png)

　原因はクエリキャッシュが古いままだったためのようです。

　以下のSQLを実行することでクエリキャッシュをクリアしたら正常に最新のレコード内容が表示されるようになりました。

```sql
FLUSH TABLES;
```

　クエリキャッシュが更新されないなどといことがあるのでしょうか。極稀の動作のような気もします。
　MySQL Workbenchのバージョンは以下のとおりです。
　version.6.1.2.11661 build 1316


## 参考
[MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.5.5.2 FLUSH 構文](http://dev.mysql.com/doc/refman/5.1/ja/flush.html)
[MySQL :: MySQL 5.1 リファレンスマニュアル :: 4.12 MySQL クエリ キャッシュ](http://dev.mysql.com/doc/refman/5.1/ja/query-cache.html)
CentOSでcronを動かす手順のまとめ

以下サイトを参考にcronがインストールされていない場合はインストールする
http://d.hatena.ne.jp/momiage3dau/20081204/1228388516

## cronを起動する
```
sudo /etc/init.d/crond start
```

## crontabを編集する
```
sudo crontab -e
```

試しに毎分現在時刻をログに書き出す設定を書いてみる

```
*/1 * * * * echo `date +"\%Y/\%m/\%d \%H:\%M:\%S"` >> /tmp/cron.log
```

これでログに現在時刻が書かれていれば正常にcronが動いている

自分の開発環境でcron設定を確認するのに、使えますね
js->cljが効かない。なぜ？

ClojureScriptの標準にある関数`js->clj`はJavaScriptのオブジェクトをClojureScriptのマップに変換したりするものですが、効かないときがあります。

```clj:sample.cljs
(ns sample.core
  (:require [lt.objs.editor :as editor]
            [lt.objs.editor.pool :as pool]))

(def cm (editor/->cm-ed (pool/last-active)))
(def cursor (.getCursor cm))

(js->clj cursor)

```

上のようにカーソルを`js->clj`で変換しようとしてもうまくいかず
`(assoc (js->clj cursor) :a :b)`なんてすると
`Error: No protocol method IAssociative.-assoc defined for type object: [object Object]`と怒られます。

この原因は
https://github.com/clojure/clojurescript/blob/master/src/cljs/cljs/core.cljs
の`js->clj`を見るとわかりますがcondの中の
` (identical? (type x) js/Object)`の条件が厳しいのが原因です。

代わりに

```clj:sample2.cljs
(ns sample.core
  (:require [lt.objs.editor :as editor]
            [lt.objs.editor.pool :as pool]
            [lt.util.cljs :as c]))

(def cm (editor/->cm-ed (pool/last-active)))
(def cursor (.getCursor cm))

(c/js->clj cursor)
```

のように`lt.util.cljs/js->clj`を使うと変換できたりします。

https://github.com/LightTable/LightTable/blob/master/src/lt/util/cljs.cljs を見ると条件が

```clj
                  (or force-obj
                      (identical? x (js/Object x))
                      (identical? (type x) js/Object)
                      (identical? (type x) js/global.Object))
```

になっています。

`js->clj`のオプションには`:keywordize-keys`がありますが、`lt.util.cljs`の方には追加で`:force-obj`オプションもあります。
Gitメモ

以下のような認識でOK？

| Subversion | Git | 説明 |
|:-----------|:------------|:------------|
| チェックアウト | クローン | サーバー上のリポジトリをローカルに落としてくる |
| アップデート | プル | サーバー上の更新されたデータをローカルに落としてくる |
| コミット | プッシュ | プッシュがローカルで更新した内容をサーバーに上げる |
| | コミット | 自分のローカル内でのファイルの更新 |
| | フェッチ | サーバー上の更新情報を調べる |
[ReVIEW Tips] LATEXBuilderで「部（PART）」と付録がある文書のしおりを調整する

Re:VIEWというかLaTeXのtipsです。

LaTeXで部(part)を導入すると、しおりのレベルが1段深くなり、章ではなく部がトップレベルになります。

![shiori1.png](https://qiita-image-store.s3.amazonaws.com/0/4293/b79642bd-2c7e-8ff5-9c34-7ad239e07b07.png)

ここまでは自動に行われるのですが、文書中に付録がある場合に問題が発生します。単純に付録をつけると、前の部の中に入ってしまうのです。

![shiori2.png](https://qiita-image-store.s3.amazonaws.com/0/4293/1aade887-8f1c-342a-490e-12de169d296e.png)

これでは付録になっていません。

この問題を解決するには、スタイルファイルに以下のような記述を追加します。

```latex
\renewcommand{\reviewappendix}{%
  \appendix
  \renewcommand{\thechapter}{\arabic{chapter}}
  \setcounter{secnumdepth}{0}
  \makeatletter
  \def\toclevel@chapter{-1}
  \makeatother
}
```

``\makeatletter``より上の部分については、以前書いた[[ReVIEW Tips] LATEXBuilderで付録の数字を1,2,3...とする](http://qiita.com/takahashim/items/b27245dc9e50f0694e09)をそのまま使っています。

ここで追加したかったのは``\def\toclevel@chapter{-1}``で、この記述でしおりのレベルを一段階上げています。そしてここでは``@``を使っているため、前後に　``\makeatletter``と``\makeatother``を指定しています。

このように``\reviewappendix``を再定義すると、しおりは以下のようになります。

![shiori3.png](https://qiita-image-store.s3.amazonaws.com/0/4293/0b0a6d44-36d1-c877-e0d5-0b9e8e5eb004.png)


ちゃんと付録が部とは別の並びになりました。
Vimがちょっと便利になる5つ起動オプション(おまけあり)

## もしかしたらあなたの役に立つかもな5つの起動オプション

Vimには起動オプションにも様々なものがあります。

詳しくはhelpを見れば書いてありますが、
私がたまに使ったりするものをいくつか簡単にご紹介します。

### 1.行番号を指定して開く 「+{num}」

test.rb の45行目を指定して開く場合

```bash
vim +45 test.rb
```

+45はファイル名の後でもよいです

また、`+` は `-c` でもよいです。(以降全て)


### 2.ファイルを開いたときにコマンドを実行する 「-c」

NERDTreeFindを実行したい場合

```bash
vim test.rb -c NERDTreeFind
````
コマンドにスペースを含むときは "(ダブルクォート)で囲みます


また、これを利用して、ファイルを開いた時に検索もできます。
test.rb の 'test' という文字を検索したい場合は以下です。

```bash
vim test.rb -c /test
```

`-c` で与えたコマンドは指定したファイルが読み込まれたあとに実行されますが、
vimrcを処理する前に実行したいときは `--cmd` を用いることもできます。

viでも利用できますが、viは1つのコマンドしか実行できません。
※vim は 10個までできます

### 3.読み込み専用で開く「-R」

test.rb を ReadOnlyモードで開く

```bash
vim -R test.rb
```

### 4.複数のファイルをタブで分割して開く「-p」

test.rb と hoge.rb をそれぞれ異なるタブで開く

```bash
vim -p test.rb hoge.rb
```

ちなみに `-o` オプションで与えられたファイルを水平分割、`-O` オプションで垂直分割して開くことができます。

同時に開く最大値は `tabpagemax` オプションの値により、デフォルトでは10です。

### 5.vimrcやプラグインを無効にして開く「-u」

人の環境で設定が分けわかんないことになってるときとかに、たまに使います。

```bash
vim -u NONE test.rb
```



## おまけ: よく使わないけどたまに遊んでる機能

### 操作の保存と再現「-w, -s」

操作の保存(vimop.vim に保存する場合)

```bash
vim -w vimop.vim test.rb
```

操作の再現(vimop.txtに保存する場合)

```bash
vim -s vimop.vim moge.rb
```

同じ操作がmoge.rbで再現されます。
※ファイルを閉じるところまで


## まとめ

知らなくても全然Vimは便利に使えますが、個人的にたまに「便利！」って思ってるものを5つ上げてみました。
Vimにはもちろんプラグインとかも色々入れたりしますが、テキストオブジェクトとか基本機能だけでも色々と便利に使えますよね！
Vimを色々使っていきましょう！
CentOSにPythonをインストールする時のメモ

CentOSにPythonをインストールする時のメモ


* インストールにはpyenvを使う。
* VirtualBox 4.3.6 + vagrant 1.6.3 + CentOS 6.5

```
# pyenvのインストール
git clone git://github.com/yyuu/pyenv.git .pyenv
echo 'export PATH="$HOME/.pyenv/bin:$HOME/.pyenv/shims:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile

# インストール出来るPythonバージョンの確認
pyenv install -l

# インストール
pyenv install 3.4.1
pyenv rehash
pyenv global 3.4.1
```
Markdownでプレゼン用スライドをつくる方法いろいろ

勉強会での発表資料を作成するにあたり、まずMarkdownで話そうと思うことを適当にメモしてるうちに、なんか発表資料このままで良くない？と思えてきました。別に **レイアウトや配色のセンスに自信があるわけでもない** し。。

で、最初 "markdown pagination" でググってみるとあまりパッとしたのがなかったのですが、"markdown presentation" にしてみると出るわ出るわ。しかもどれも結構よさげ。

というわけで出てきたものをメモがてら書き留めておきます。結論からいうとググって一番上に出てきた "Remark" が今回の要件に（ほぼ）マッチしていたので、他はまだ使ってません。

##Remark

http://remarkjs.com/

###長所
- <b>GitHubでソース公開されてる</b>
  - 無料
  - ログイン不要
  - 不満があれば自分で修正してpull request送れる


##Swipe

http://beta.swipe.to/markdown/

###長所

- テンプレートやフォントが複数用意されてる（っぽい）

###短所

- 要ログイン（用途によっては長所でもある）


##Docset

http://www.decksetapp.com/

- Mac アプリ
- **19.99ドル**


##Reveal.js

https://github.com/hakimel/reveal.js/

- テキストベースのスライドをつくれる
- たぶんこの中では一番メジャー。日本語での紹介記事もたくさん出てる
  - [reveal.js で Markdown](http://flatbird.github.io/revealjs-markdown/)


##Slidify

http://slidify.org/

- サイトが10ブックマークされてるので国内でちょっと話題になったことがある？
sqlのwhere in って、複数条件(カラム)を指定できるんですね

http://blog.fusic.co.jp/archives/1765

↑postgresの記事ですが、mysqlでも同様に実行できました。

```lang:foo.sql
SELECT *
FROM
test_table
WHERE
(col,co2) IN -- 複数のカラムを指定
  (SELECT  subcol1,subcol2 -- 副問いの戻り値も複数のカラムを指定
   FROM  subtable
   WHERE id > 10 )
```

知らなかったなんて、お恥ずかしい

※手元にあるmysqlはv.5.1.61ですが、v.4.1から使えるらしい

#sqlの仕様として、mysqlのdocでは分かりませんでしたが、sql99から利用可らしい

http://dev.mysql.com/doc/refman/5.1/ja/comparison-operators.html
↑では、分かりませんでしたが、次のurlよれば、sql99から利用できるみたい。

> 私の知る限り、SQLServer（Accessも）以外のRDBMSでは、
> 　WHERE
> 　　(カラム1, カラム2) IN
> 　　　　(SELECT カラムA, カラムB
> 　　　　FROM サブテーブル
> 　　　　WHERE 条件
> 　　　　)
> という「行値構成子」とか「行値式」とかいうSQL99からの書き方が可能ですが、SQLServerではこの書き方ができません。そのため、複数のカラムが条件として必要なときには、SQLServerではEXISTSで書くしかありません。
> http://d.hatena.ne.jp/Sikushima/20100627/1277616745
今回採用したgit運用フロー


## ブランチの種類

| ブランチ名称 | 役割 |備考|
| :----------|-----|----|
|master |常時デプロイしても問題ないブランチ|feature,releaseはmasterから必ず作成|
|feature |開発作業ブランチ|複数人でこのブランチを作成する場合はここから作業ブランチを作成する|
|release |デプロイされるブランチ|本番環境作成したタイミングくらいで作成|
|hotfix|緊急対応のブランチ|リリース後に緊急対応が必要な場合に作成|

githubフローを採用したかったのだが、releaseブランチを複数持つ必要がありgitフローとgithubフローの中間くらいで運用することに決めた。

## 前提

![スクリーンショット 2014-06-13 17.37.11.png](https://qiita-image-store.s3.amazonaws.com/0/14914/944ced26-dd08-b467-19d1-ff05e81f8dc6.png "スクリーンショット 2014-06-13 17.37.11.png")

* github,gitlab,bitbucket等何でも良いのだが、各ブランチ間のマージはgithub等のページ内から行う。

* masterなどをローカルでマージしてpushしない。

* 各ブランチを最終的にrebaseしてリモートにpushすること。

## 実際の操作

### 作業ブランチを作成してmasterにマージするまで

ブランチを作成する。

```console
git checkout -b create_test origin/master
```

なんか作業を行う。

完成したからリモートにpushする。

```console
#diffを見る
git diff

git add -A
git commit

#masterに変更がないか確認する
git fetch

#masterに変更がある場合はrebaseする
git rebase origin/master

git push origin create_test
```

githubにアクセスしてプルリクエスト作成。

![スクリーンショット 2014-06-13 18.33.15.png](https://qiita-image-store.s3.amazonaws.com/0/14914/1b6a3e6a-4f81-cd2b-b4d8-91ffd84303ae.png "スクリーンショット 2014-06-13 18.33.15.png")

差分を確認して問題なければプルリクエスト！

![スクリーンショット 2014-06-13 18.36.00.png](https://qiita-image-store.s3.amazonaws.com/0/14914/510e9e60-1008-d438-f50d-c889ea348c31.png "スクリーンショット 2014-06-13 18.36.00.png")


レビュアーが確認して問題なければマージしてもらう。
問題がある場合はコメントを書いて作業者に修正してもらう。

![スクリーンショット 2014-06-13 18.38.15.png](https://qiita-image-store.s3.amazonaws.com/0/14914/73bae4d0-5514-ab9a-dcf1-22aafc85bcb4.png "スクリーンショット 2014-06-13 18.38.15.png")

レビュアーはマージしたら作業ブランチも削除する。

![スクリーンショット 2014-06-13 18.39.14.png](https://qiita-image-store.s3.amazonaws.com/0/14914/0e763bf0-2d1a-32a1-a42d-e5acf34c0a50.png "スクリーンショット 2014-06-13 18.39.14.png")

削除実行！

![スクリーンショット 2014-06-13 18.41.14.png](https://qiita-image-store.s3.amazonaws.com/0/14914/73f066b1-9f66-b7e9-e0e7-f9231a44d928.png "スクリーンショット 2014-06-13 18.41.14.png")


これでmasterにマージができました。

releaseブランチにマージする場合は管理者（ここでは担当者を決めてる）が確認してｍasterからマージする。
Grunt+jasmine+requirejsでテストする

Gruntでjasmineを動かしてrequireJSでモジュール化されたファイルのテストを行うときのメモ。

使用したgruntのプラグイン

 * [grunt-contrib-jasmine](https://github.com/gruntjs/grunt-contrib-jasmine)
 * [grunt-template-jasmine-requirejs](https://github.com/cloudchen/grunt-template-jasmine-requirejs)

grunt-contrib-jasmineはこれ1つでjasmineでテストする環境が整う。PhantomJSとかもバンドルされているので個別にPhantomJSをインストールしなくてもいい。
grunt-template-jasmine-requirejsはgrunt-contrib-jasmineでrequireJSでモジュール化されたファイルをテストするためのテンプレート。

以下はGruntのタスク。

```js
jasmine: {
        // プロパティ名はテストケース名
        sample: {
          // このテストケースでテストするファイルの指定
          // 一気に指定するとエラーが大量に出るのではじめは1ファイルずつのほうがいいかもしれない
          src: 'src/**/*.js',
          options: {
            // テストケース
            specs: 'spec/*Spec.js',
            // ヘルパー
            helpers: 'spec/*Helper.js',
            // SpecRunnerを残すかどうかの設定
               keepRunner: true,
               //テスト結果のxmlの保存場所
               junit: {
                   path: 'jasmine-test'
               },
               //requireJSのためのテンプレート
               template: require('grunt-template-jasmine-requirejs'),
               templateOptions: {
                   //設定が書かれているファイルを指定
                   requireConfigFile: 'src/config.js',
                   //上書きしたいrequirejsの設定があればここに書く
                   requireConfig: {
                     baseUrl: 'src'
                   }
                 }
          }
        }
    }
```

設定できればJenkinsなんかでテスト結果がみれて便利だと思う。Jenkins使ってなければGruntのwatchタスクでファイルを保存するたびに実行してあげるといいかも。

テストケースはrequirejsを使ってこう書く。

```js
define([必要なモジュールを読み込む], function(必要なモジュール) {
	
	describe("テストケース", function() {
		it("１", function (){
			・・・
		});
		
		it("２", function (){
			・・・
		});
	}); 
});
```

specを書くところですこしはまるかもしれない。
font-family の generic-family プロパティについて

CSS の font-family プロパティは、特定のフォント名を記述する以外にも`generic-family`という一般フォント名を指定することができる。

# generic-family で指定できる値

| 値 | 内容 |
| :-- | :-- |
| serif | セリフ体。いわゆる明朝体。 |
| sans-serif | サンセリフ。いわゆるゴシック体。 |
| monospace | 等幅フォント |
| cursive | 筆記体 |
| fantasy | 装飾の多い文字 |

ただし、これらの指定は、インストールされているフォントからブラウザによって自動的に表示するファミリが選択される。
というわけで、実際にどのようなフォントがセレクトされるのか調査した。

# iOS 7 / Mac X Mavericks

## font-family: serif;

ヒラギノ明朝 Pro W3—111 glyphs

## font-family: san-serif;

ヒラギノ角ゴ Pro W3—111 glyphs

## font-family: monospace;

Osaka—111 glyphs

## font-family: cursive;

ヒラギノ明朝 ProN W3—75 glyphs
Apple Chancery—36 glyphs

## font-family: fantasy;

ヒラギノ角ゴ ProN W3—75 glyphs
Papyrus—36 glyphs

# Windows 7

## font-family: serif;

MS P明朝—111 glyphs

## font-family: san-serif;

MS Pゴシック—111 glyphs

## font-family: monospace;

MS ゴシック—111 glyphs

## font-family: cursive;

MS Pゴシック—75 glyphs
Comic Sans MS—36 glyphs

## font-family: fantasy;

MS Pゴシック—75 glyphs
Impact—36 glyphs


# Android 4

Roboto / モトヤフォントのセリフ・サンセリフが表示される。

# 参考

[font-family - CSS | MDN](https://developer.mozilla.org/ja/docs/Web/CSS/font-family)
PHPのMcrypt関数でencryptしたデータをRubyでdecryptする

過去にPHPでencryptしてDBに突っ込まれたデータを、
今回Rubyでdecryptする際に結構はまったので。

## encrypt
PHP側のコードはだいたいこんな感じ
暗号方式は 3DES ECB だった。

```mcrypt.php
<?php
$mcrypt_key = 'hoge'; #3DESの規定キー長より短い
$plaintext = 'あいうえお'; #マルチバイト文字

$td = mcrypt_module_open(MCRYPT_TRIPLEDES, '', MCRYPT_MODE_ECB, '');
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, $mcrypt_key, $iv);

$ciphertext = mcrypt_generic($td, $plaintext);

# 表示の関係上base64エンコード
echo base64_encode($ciphertext);

```
```
実行結果：QERSswy6yzBsSrZfRxS+ow==
```
ポイントは
* キー長が短い（エラーにならない）
* マルチバイト文字

## decrypt
で、ruby側。バージョンは1.9.3
今回は[ruby-mcrypt](https://github.com/kingpong/ruby-mcrypt)を利用。

```mcrypt.rb
# -*- encoding:utf-8 -*-
require 'mcrypt'
require 'base64'

mcrypt_key = 'hoge'
ciphertext = 'QERSswy6yzBsSrZfRxS+ow=='

crypto = ::Mcrypt.new(:tripledes, :ecb)
# キー長が足りない分は \0 で埋める
if mcrypt_key.length < crypto.key_size
  mcrypt_key = mcrypt_key.ljust(crypto.key_size, "\0")
end
crypto.key = mcrypt_key
crypto.iv = nil
crypto.padding = :zeros

plaintext = crypto.decrypt(::Base64.decode64(ciphertext))
# decrypt結果の文字コード情報をUTF-8にする
p plaintext.force_encoding('utf-8')
```

```
実行結果：あいうえお
```
* キー長が短い場合は \0 で埋める（そのままだとエラーになる）
* decryptの結果は ascii-8bit になってるので適宜encodingの変更をする


## 余談
[OpenSSL::Cipher](http://docs.ruby-lang.org/ja/1.9.3/class/OpenSSL=3a=3aCipher.html)でも試してみた。

キーの\0埋めや最後のforce_encodingはこちらも同様。
ただ、paddingの方式がOpenSSLの場合PKCS#5で固定（？）で
PHPのMcryptは \0 埋めが固定（？）みたいなので、OpenSSL側でのpaddingをせずに自前で除去する必要がありそう。

```openssl.rb
# -*- encoding:utf-8 -*-
require 'openssl'
require 'base64'

mcrypt_key = 'hoge'
ciphertext = 'QERSswy6yzBsSrZfRxS+ow=='

crypto = ::OpenSSL::Cipher.new('des-ede3')
crypto.decrypt
# キー長が足りない分は \0 で埋める
if mcrypt_key.length < crypto.key_len
  mcrypt_key = mcrypt_key.ljust(crypto.key_len, "\0")
end
crypto.key = mcrypt_key
# 明示的にpaddingを無効
crypto.padding = 0

plaintext = crypto.update(::Base64.decode64(ciphertext))
# 末尾の\0を除去し、文字コード情報をUTF-8にする
p plaintext.sub(/\0*\Z/, '').force_encoding('utf-8')
``` 

```
実行結果：あいうえお
```
郵便番号と地名のSomething

フォームなどで郵便番号から住所をひっぱってくるおなじみのアレ
日本郵便で配ってるCSVファイルは昔から色々とカオスなことで有名

そのカオスな部分をクリーニングして公開してくれているありがたい業者さんもありますがもう少しお手軽にならんのかしらということで

Google Maps APIでクエリに郵便番号を入れると地名入りのデータを送ってくれたりするわけですが、地図の表示周りに用途を限定して使うこと、というGoogleさんの使用条件があるのでこれはNG

そこでYahoo!

[YOLP(地図):郵便番号検索API - Yahoo!デベロッパーネットワーク](http://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/zipcodesearch.html)

そのものずばりなAPIがあります
Yahoo! IDとアプリケーションIDの取得が必要だったり、商用は別途相談だったりしますが、わりといい感じです
リバースプロキシで認証したREMOTE_USERを受け側のapacheに渡す

http://notebook99.blog87.fc2.com/blog-entry-64.html
↑こちらのurlを参考。というか写経

#実現したい構成

以下の様な構成で、リバースプロキシ側で認証されたユーザID ( $ENV{REMOTE_USER} )を裏側?のアプリケーションサーバに渡すことが目的。
※通常、revserse proxy と app servserは、別のプロセスで動作しているので、$ENV{REMOTE_USER} のような環境変数は渡すことができません

```
┌RV PROXY────────┐                ┌ APP SERVER ────┐
│※AuthType BASIC├>(REMOTE USER)->│※AuthType NONE │
└────────────────┘                └────────────────┘
```

#まずはリバースプロキシ側で、mod_rewrite & mod_headers を利用

以下は、リバースプロキシ側のhttpd.conf抜粋です。
mod_rewrite と mod_headers で環境変数:REMOTE_USERを、アプリケーションサーバへのリクエストhttpヘッダ:X-Forwarded-User に追加できます。


```
<LocationMatch "/xing_g/">
 AuthType Basic
 AuthName member
 AuthUserFile /home/xing/httpd/.htpasswd
 require valid-user
 ErrorDocument 401 /error/authen-error-xing.html
</LocationMatch>

ProxyRequests Off

<Location /xing_g>
 ProxyPass         http://10.209.15.XXX/XingG/
 ProxyPassReverse  http://10.209.15.XXX/XingG/

 RewriteEngine On
 RewriteCond %{LA-U:REMOTE_USER} (.+)
 RewriteRule . - [E=RU:%1,NS]
 RequestHeader add X-Forwarded-User %{RU}e
</Location>
```

#アプリケーションサーバ側で、 httpヘッダ:X-Forwarded-User を受信


```
RewriteEngine On
RewriteCond %{REMOTE_USER} $^
RewriteCond %{HTTP:X-Forwarded-User} (.+) [NC]
RewriteRule . - [E=REMOTE_USER:%1,NS]
```

先程の http://notebook99.blog87.fc2.com/blog-entry-64.html によれば、裏側のapacheのhttpd.confで上記のように記載することで、X-Forwarded-User を REMOTE_USER として受信できるようですが...
次のようなエラーとなり、この方法は採用しませんでした。
( Options FollowSymLinks を追加することで解消するという情報もありましたが、私の環境では効果がありませんでした)

```
Options FollowSymLinks or SymLinksIfOwnerMatch is off which implies that RewriteRule directive is forbidden: ...
```

#アプリケーションサーバ側で、httpヘッダは大文字化等の変換有り

結局、リバースプロキシ側でセットされたHTTPヘッダ: X-Forwarded-User は、バックエンドのapache (mod_perl)で次のような環境変数で受信することにしました。

```
$ENV{"HTTP_X_FORWARDED_USER"}
```

perlに限った話かもしれませんが、大文字化、ハイフン(-)はアンダースコア(_)、先頭に「HTTP」の文字列 付加等、ヘッダ名が変更されるみたい
二項検定でポケモントレーナーの強さを検定する

# 二項検定をする

A 君と B 君がポケモンで対決をしました。 20 回ほど遊んだ結果として A 君が 17 回勝利し、 B 君が 3 回勝利をしました。

感覚的に A 君のほうが明らかにポケモントレーナーとして強そうですが、果たして統計学的にも同じことが言えるでしょうか。今回は統計解析用の言語である R を利用してこれを仮説検定します。

## 統計解析用言語 R

R は自由なソフトウェアで、無料で使える統計解析用言語です。統計の分野では有償のソフトウェアも [MATLAB](http://www.mathworks.co.jp/products/matlab/) など有名なものがたくさんありますが、いずれもなかなかに高価です。

その点 R は無料で使えますのでなかなか予算の確保できない貧乏な研究者にもやさしいですし、それでいて柔軟で強力な機能を備えていますから、この言語を習得して損することは無いと言っても差し支えないほどです。

さて一連の記事では Python を主に使ってきましたが、純粋に統計解析という観点で Python と R を比較すると、可視化や数値解析の手軽さや豊富さという点で R に軍配が上がるのではないかと筆者は感じています。

今まで Python を使ってきた理由としては、それがグルー言語として万能であること、他の処理と連携する際に統一された言語で全体を記述できることといった点が挙げられます。

したがいまして、純粋に数値解析やその可視化をする必要に迫られるといった場面では R を使うと良いかと思います。

## 帰無仮説と対立仮説の設定

さてまずは仮説の設定です。仮説については[以前に説明した](http://qiita.com/ynakayama/items/1cc7fa06ad4315425c0c)通りですね。この例の場合ではこうなります。

|仮説|説明|
|:--|:--|
|帰無仮説|A 君と B 君の実力は等しい|
|対立仮説|A 君は B 君より強い|

対立仮説では実力が等しくない、ではなく片側検定にあたる A 君が強いかどうかという設定をします。

検定する統計量は A 君の勝利数とします。この場合、 A 君の手持ちのポケモンが何かといったことや、不正が無いかどうかといったことは考慮しません。統計量の実現値は勝利数である 17 です。

## 検定統計量の分布を求める

R の dbinom 関数は n 回の試行中 x 回成功するかを求めることができます。式は dbinom( 成功数, 試行数, 成功確率 ) となります。この場合成功確率は勝つか負けるかしかありませんので 0.5 です。いわゆる二項検定となります。

```r
dbinom (17, 20, 0.5)
#=> [1] 0.001087189
```

もし両者の実力が等しいとすると 17 勝 3 敗となる確率はわずか 0.1% です。この時点で結果が明らかなような気もしなくも無いですがもう少し統計学的観点から調べてみましょう。

前述の dbinom 関数には数値ベクトルを含めることができます。

```r
wins <- 0:20
dbinom(wins, 20, 0.5)
#=>
# [1] 9.536743e-07 1.907349e-05 1.811981e-04 1.087189e-03 4.620552e-03
# [6] 1.478577e-02 3.696442e-02 7.392883e-02 1.201344e-01 1.601791e-01
# [11] 1.761971e-01 1.601791e-01 1.201344e-01 7.392883e-02 3.696442e-02
# [16] 1.478577e-02 4.620552e-03 1.087189e-03 1.811981e-04 1.907349e-05
# [21] 9.536743e-07
```

帰無分布が表示されました。ベクトルは 0 から開始されているので 18 版目の数値 1.087 を見ます。 plot は R のプロッティング関数です。次のように使います。

```r
plot(wins,dbinom(wins, 20, 0.5), type="h")
png("image.png", width = 480, height = 480, pointsize = 12, bg = "white", res = NA)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38501/2ab9e773-882b-b2a1-5415-245392e3ff3f.png)

この図があらわしているのは A 君と B 君の実力が五分である (= 帰無仮説) ときの 0 勝から 20 勝までのそれぞれの確率です。

pbinom 関数は勝利数が x 以下である確率 (= 下側確率) を求めます。片側検定なので下側確率を求めるわけですね。

```r
round(pbinom(wins, 20, 0.5),4)
#=>
# [1] 0.0000 0.0000 0.0002 0.0013 0.0059 0.0207 0.0577 0.1316 0.2517 0.4119
#[11] 0.5881 0.7483 0.8684 0.9423 0.9793 0.9941 0.9987 0.9998 1.0000 1.0000
#[21] 1.0000
```

つまり 13 勝以下となる確率が 94.23% 、 14 勝以下となる確率が 97.93% です。 P 値は 16 勝以下となる確率を求める (17 ではない) ので、次のようになります。

```r
pbinom(16,20,0.5)
#=> [1] 0.9987116
```

これを 1 から引いて求まる P 値 0.001288 は有意水準 0.05 より小さいので帰無仮説が棄却され A 君がおそらく強いであろうと統計学的観点から言えることになります。

## 参考

Rによるやさしい統計学
http://www.amazon.co.jp/dp/4274067106
MacでターミナルからSambaをマウントする

従来はfinderから接続するか、Alfredで徐ろに "smb://192.168.x.x" とか打ち込んで接続していましたが、Lionあたりから "mount_smbfs" なるコマンドが使えるようになっているみたいです。

`````
usage: mount_smbfs [-Nh] [-d mode] [-f mode]
                   //[domain;][user[:password]@]server[/share] path
`````

192.168.10.64 に立ち上がっているSambaの "sites" にユーザー "foo" でアクセスしたければ

`````
$ mount_smbfs //foo@192.168.10.64/sites sites
Password for 192.168.10.64: 
`````

こんな感じにすれば sites ディレクトリにマウントされます。便利。

アンマウントは umount で。

`````
$ umount sites
`````

ちなみにfinderで接続した場合は /Volumes/sites にマウントされます。

## 2017/3/24 追記 : 現在は非推奨

Sierra においては mount_smbfs は非推奨で、mountコマンドでいけるらしいです。
（コメントの情報参照）
画像センシング展2014

センサー/ウェアラブルデバイス開発の情報収集を目的として
6月12日に、パシフィコ横浜で開催された画像センシング展2014に行ってきました。
http://www.adcom-media.co.jp/iss/

とりあえず一通りブースを回ってみましたが、出展内容は
・画像解析によるロボットのピッキング支援
・画像判別によるライン不具合チェック
・3Dカメラ
・顔認識技術
等を組み込んだ製品紹介が多く、特に製造、医療に関連しそうなものばかりでした。
ハードそのものに関わる内容が多く、うーん…畑が違ったかもしれません…

そんな中、アイデア次第ではなかなか面白そうな技術も。
※今、手元に詳細資料が無いため、後日追記/修正するかもしれません。

・3D空間投影システム
愛知のベンチャー企業3Dragonさんが開発しているプロジェクターで裸眼で立体視を可能とする投影システムです。
文字だけだとイメージ難しいかもしれませんが、スターウォーズなどで見た事あるあれです。
デモ機は10センチほどの像を下から照らした光で映す小型のものでしたが、すでに50センチ規模では作成済みらしい。
さらに、2020年オリンピックに向けて部屋全体の規模でスポーツ中継を可能にできるくらいに発展させたいとのことでした。

・視線を利用したUIシステム
視線をモニタ前のセンサーバーで感知し座標を測定。画面のアイコンを見つめただけで選択状態となります。
画面上のカーソルを動かすという動作は行わず、見てキーを押すだけで選択させるというものでした。
本製品はカーソル位置の認識だけでしたが、更に瞬き2回で選択とかも可能なら目だけで簡単な操作は可能になりますね。
Kinectでもある程度似たようなことはできそう。


また、後半にはマイクロソフト社によるセミナー「Kinect for Windows update 2014」を聴いてきました。
時間が限られたためか内容はKinectの簡単な動作デモや事例紹介が殆どでしたが、終わりのほうではKinect v2の情報も。

現行とv2の比較について概要をざっくりまとめると、
・センサー個々の性能は良くなっているが、「できること」は一緒
・センサーの方式により一長一短な部分もあり、用途や好みによって使い分けられる
・そのため、現行機も平行して販売は継続される
とのことです。

性能が良くなったという仕様の詳細については外部サイトでもまとめられています。
（こことか→http://www.buildinsider.net/small/kinectv2cpp/01）

なお、気になる日本でのリリース時期について、
「7月中旬～下旬、マイクロソフトのオンラインストアでオープンβが販売開始」とアナウンスされていました。
オフィスでも現行機との比較ができると良いですね。
Gradleでのプロキシ設定

社内ネットワークでAndroidアプリをGradleビルドする際にプロキシ設定が必要だったのでそのメモ。

#gradlewファイルへの設定
Gradle実行時にUnknownHostExceptionが発生して失敗してしまったので設定しました。

gradlew または gradlew.bat の先頭に以下を追記します。

```
set JAVA_OPTS=-DproxyHost=myproxy.co.jp -DproxyPort=8080 -Dhttp.proxyUser=**** -Dhttp.proxyPassword=**** -Dhttps.proxyUser=**** -Dhttps.proxyPassword=****
```
`gradlew`実行時に、GradleのZIP（gradle-1.xx-all.zip）がない場合は取得に行くので必要となります。
ZIPファイルをダウンロードした後は設定を削除してもOKです。

#gradle.propertiesへの設定
gradlewファイルに設定後も以下のようにプロキシのエラーが発生したので設定しました。
> Failed to get resource: GET. [HTTP HTTP/1.0 407 Proxy Authentication Required: http://repo1.maven.org/maven2/com/android/tools/build/gradle/maven-metadata.xml]
> Error listing versions of com.android.tools.build:gradle using class org.gradle.
> api.internal.artifacts.repositories.resolver.MavenVersionLister$1. Will attempt an alternate way to list versions. This behaviour has been deprecated and is scheduled to be removed in Gradle 2.0
> Failed to get resource: GET. [HTTP HTTP/1.0 407 Proxy Authentication Required: http://repo1.maven.org/maven2/com/android/tools/build/gradle/]

`[ユーザーディレクトリ]/.gradle/gradle.properties`（なければ作成する）に以下のように設定します。

```
systemProp.http.proxyHost=myproxy.co.jp
systemProp.http.proxyPort=8080
systemProp.http.proxyUser=****
systemProp.http.proxyPassword=****
systemProp.https.proxyHost=myproxy.co.jp
systemProp.https.proxyPort=8080
systemProp.https.proxyUser=****
systemProp.https.proxyPassword=****
```
実行時にいろいろアクセスするようです。

#おまけ：ZIPファイルが壊れている場合
gradlewファイルにプロキシ設定をして実行してもダウンロードされたZIPファイルが壊れていてうまく開けないことがありました。
> Exception in thread "main" java.lang.RuntimeException: java.util.zip.ZipException: error in opening zip file
> at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:78)
> at org.gradle.wrapper.Install.createDist(Install.java:47)
> at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:129)
> at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:48)
> Caused by: java.util.zip.ZipException: error in opening zip file
> at java.util.zip.ZipFile.open(Native Method)
> at java.util.zip.ZipFile.<init>(ZipFile.java:214)
> at java.util.zip.ZipFile.<init>(ZipFile.java:144)
> at java.util.zip.ZipFile.<init>(ZipFile.java:158)
> at org.gradle.wrapper.Install.unzip(Install.java:160)
> at org.gradle.wrapper.Install.access$400(Install.java:29)
> at org.gradle.wrapper.Install$1.call(Install.java:70)
> at org.gradle.wrapper.Install$1.call(Install.java:47)
> at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:65)
> ... 3 more

このとき、ZIPファイルを手動でダウンロードして配置したら解決しました。
ダウンロードURLは、`gradle/wrapper/gradle-wrapper.properties`の`distributionUrl`に記述されています。

```
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=http\://services.gradle.org/distributions/gradle-1.xx-all.zip
```
ファイルの配置先は`[ユーザーディレクトリ]/.gradle/wrapper/dists/`です。
Mac OS Xのバージョンをシェルスクリプトで判定

```bash
#!/bin/sh
# to determine what version you use in Mac OS X

VER=`sw_vers -productVersion | awk -F. '{ print $1 "." $2 }'`

case $VER in
    "10.8")
        echo Mountain Lion
        ;;
    "10.9")
        echo Mavericks
        ;;
    "10.10")
        echo Yosemite
        ;;
esac
```
Swift の配列は “immutable” でも値を書き換えられる（追記：仕様変更された）

**追記：** 定数に代入された配列は真に immutable となるよう変更されたとのこと [SwiftのArrayがヤバくなくなった - Qiita](http://qiita.com/aki/items/6c68a69de0c05cb174ea)

The Swift Programming Language 158ページには、変数に代入された配列は “mutable” で、定数に代入された配列は “immutable” だと書いてある。

Objective-C においては、文字通り mutable な`NSMutableArray` は値の書き換えや追加ができる一方、 `NSArray` は値を操作することができない。 Objective-C プログラマはそこから類推して、 Swift の immutable な配列も値を操作できないと考えるかもしれないが、それは誤りである。実際には、 Swift の “immutable” な配列は値を書き換えることができる：

```swift
let a = [1, 2, 3]
a[0] = 42
a // => [42, 2, 3]
```

Swift における “immutable” とは、「配列の長さを変えるメソッド（`mutating func` で定義されたメソッド）の呼び出しが禁止されている」という意味であることに注意（同じく158ページにそう書いてある）。
laravel4 migrate カラム名変更

#migrateでカラム変更

http://laravel4.kore1server.com/docs/schema

```php

Schema::table('table',function($table){
  $table->renameColumn('name', 'value');
});

```
とカラム名を変更しようとしたらエラーがでた。

```
[2014-06-13 07:00:50] production.DEBUG: exception 'Symfony\Component\Debug\Exception\FatalErrorException' with message 'Class 'Doctrine\DBAL\Driver\PDOMySql\Driver' not found' in /path/to/laravel-project/vendor/laravel/framework/src/Illuminate/Database/MySqlConnection.php:59
Stack trace:
#0 [internal function]: Illuminate\Exception\Handler->handleShutdown()
#1 {main} [] []
```

DoctrineのMysqlドライバーがないと。
調べたら本当になかったので、インストールした。

```composer.json
    "require": {
        "laravel/framework": "4.1.*",
        "doctrine/dbal": "~2.3"
    },
```

```zsh
%composer update
%php artisan migrate
```

リネームできた。

OK
Vagrant上のCentOSからmail関数を使ってメールを送る

# VagrantでPHPのmail()を使いたい
タイトル通りです。PHPでmail()関数を使おうと思ったのですが、どうしたらいいかわからなかったので調べたことをメモ。

※PHPって書いてますけどほとんどLinuxの話です（）

## mail()関数の仕様
php.iniにsendmailのパスの設定があります。

```php.ini
[mail function]
sendmail_path = /usr/sbin/sendmail -t -i
```

PHPのmail()関数は、sendmailコマンドを使ってメールを送信するそうです。
つまり、 **sendmailが入ってなければメールを送れません。**

## sendmailが動いているかどうか確認
まずはsendmailにパスが通ってるかどうか確認してみましょう。

```bash
$ whereis sendmail
```

`/usr/sbin/sendmail`が出力されればパスが通っています。
存在しなければ、sendmailのインストールをしましょう。

### sendmailのインストール
参考：http://programming-10000.hatenadiary.jp/entry/20130517/1368803251

```bash
yum install sendmail
yum install sendmail-cf
```

で、yumリポジトリからインストールしましょう。

### sendmailのコピー
sendmailにSMTPの設定が必要です。
が、その前にsendmail.mcやcfを直接弄ってますが、念のためcpしておきましょう。

```bash
$ cd /etc/mail
$ cp -p sendmail.mc sendmail_yyyymmdd.mc
$ cp -p sendmail.cf sendmail_yyyymmdd.cf
```

yyyymmddは年月日を入れておきましょう（言わなくてもわかると思いますが）。

### sendmailの設定
参考：http://makisuke.seesaa.net/article/9381075.html

sendmail.mcを編集してSMTPサーバを設定します。

```bash
$ vi sendmail.mc
```

この中にある`dnl define('SMART_HOST','smtp.your.provider')`の先頭のdnlを削除し、`smtp.your.provider`を`smtp:使用するSMTPサーバドメイン`に変更します。

### sendmail.mcの内容をsendmail.cfに適用
mcはcfのファイルを編集するためのマクロらしいので、mcを使ってcfを書き換える必要があります。

```bash
$ m4 sendmail.mc > sendmail.cf
```

適用したらsendmailを再起動しましょう。

```bash
$ /etc/init.d/sendmail restart
```

### sendmailでメールが送れるか確認
mail()関数を使う前に、sendmailコマンドでメールが送れなければそもそもメールは送れません。

参考：http://d.hatena.ne.jp/shinjo-kou/20110125/1295948242

```bash
$ sendmail 送信先のメールアドレス
From: 送信元のメールアドレス
To: 送信先のメールアドレス
Subject: 件名
（空行）
文面
.（ドットで入力終了）
```

これで送信先メールアドレスにメールが送信できればsendmailの設定は完了です。

### PHPによるメール送信
mail関数はマルチバイトによるメール送信をカバーしてないので注意しましょう。
mail関数の使い方は... **ググって下さい！**（おい）


## ※XAMPP環境の場合
XAMPP環境の人は、`[mail function]`の中に`SMTP = localhost`と書かれている場所があるので、そこをSMTPサーバのドメインに変更すればいけるはず、らしいです。
送れない場合は設定とかいろいろあるそうです。正直よく知りません（）
意外に知らなくて、すごく便利ショートカット sublime text（ショートカットで、プロジェクト（フォルダ）を開く方法）

#便利。。。。。。。
##ショートカットで、プロジェクト（フォルダ）を開く方法

新規にsublime textを開くと、サイドバーが何も無くて、いちいちフォルダをドッラグしていませんか？？？
以下↓
![スクリーンショット 2014-06-13 16.21.49.png](https://qiita-image-store.s3.amazonaws.com/0/25116/7652319d-9cf4-de88-aeee-66ca45a9465f.png)


これをショートカットでフォルダを開けたらいいとめっさおもってググったらあった。。。


これ！！

```
{ "keys": ["super+ctrl+n"], "command": "prompt_add_folder"},
```

`super+ctrl+n`はお好みに。。。。
vagrant コマンド（起動・再起動・シャットダウン等々）備忘録

備忘録ですが良かったら。

# vagrantfile再起動
vagrant reload

# 現状確認
vagrant status

# 一時停止
vagrant suspend

# suspendからの復帰
vagrant resume

# シャットダウン
vagrant halt

# 立ち上げ
vagrant up

# 自分のBoxを作れます。boxを共有できたり。
vagrant package

# ボックスの追加
vagrant box add

# ボックスの初期化
vagrant init

# 消去
vagrant destroy