OmniAICreator/Qiita-1.07M huggingface dataset:
Blenderで流体表現


なんだか色々ハマったりしたのでメモ。
ただ、できてくるとテンションあがるｗ

ちなみに作成に利用したバージョンは2.68aです。

##なにはともあれ準備

まず、流体のシミュレーションを行うにあたって最低2つの要素が必要になります。

1. 流体（液体）
2. 流体をシミューレションする空間
3. 障害物などシミュレーションに必要なものを配置

1は当たり前ですね。2がなんとなく「？」となりますが、流体の計算は非常に高価な演算です。そのため、なんでもかんでも計算してしまうとすぐに計算量がとんでもないことになってしまうので、まずは「ここの中は流体の計算をしますよ」という空間を定義しなければなりません。

3については必須ではありませんが、だいたいの場合に置いてなにかしらの障害物や液体をためておくものがあるでしょう。それを準備します。

##シミュレーション空間 - Domainを作成

まず最初にシミュレーション空間を作成します。
空間は最終的には立方体になるようなので単純にCubeを利用します。
以下のように比較的大きめなものを準備します。

![fluid-sample1.png](https://qiita-image-store.s3.amazonaws.com/0/5616/408e87ac-74dc-7ac1-9ba3-09f9eb0f0f99.png "fluid-sample1.png")

##流体を準備

次に、流体を準備します。
上記で作成したCube内に視点を移動し、Sphereを追加します。（今回はこれにしましたが特に初期形状はなんでも構いません）

![fluid-sample2.png](https://qiita-image-store.s3.amazonaws.com/0/5616/24c23f22-81d9-b27e-159b-258e32f05d5a.png "fluid-sample2.png")

Sphereを選択した状態で「Physics」から、「Fluid（流体）」を選択します。
さらにTypeもFluidにします。これで流体の準備ができました。

##障害物を設置

最後に障害物を設置します。（ちなみに流体シミュレーションではこれ以外にも流体を流し込むオブジェクトや吸収するオブジェクトなど色々なものも配置できますが、今回は基本だけなので割愛します）

![fluid-sample4.png](https://qiita-image-store.s3.amazonaws.com/0/5616/244d5e9b-3fee-7675-f10e-6d7486c6f560.png "fluid-sample4.png")

今回は斜めの板を設置してみました。
これを、流体の障害物に設定します。設定は以下のようにしてください。

![fluid-setting.png](https://qiita-image-store.s3.amazonaws.com/0/5616/0be8eee4-59cc-8008-8d22-f9daa79d384c.png "fluid-setting.png")

Type: Obstacleが障害物、という意味です。
今回はVolume InitializeをBoth、Slip Typeを FreeSlipに設定しました。

##シミュレーションを実行

さて、これで今回のサンプルに必要なものが揃いました。
これらを利用してシミュレーションを実行します。

実行には、最初に準備した「Domain」の設定項目内にある「Bake」を実行することでキーフレームに計算結果が出力されます。

![fluid-sample5.png](https://qiita-image-store.s3.amazonaws.com/0/5616/b5ff6502-0206-0555-485c-80d216c07cff.png "fluid-sample5.png")

計算には結構時間がかかるのでしばらく待ちます。
計算が終わったらAlt+Aでアニメーションさせてみましょう。
初期設定のままだとだいぶポリゴンがあらいですが、しっかりと液体のシミュレーションが行われているのが分かると思います。

##背景を透過させる

今回これを作ろうとした理由は、流体シミュレーションを書き出してコンテンツに合成して使おうと思ったためです。
なので、背景とか色々レンダリングされてしまうと合成に使えないので、以下の設定で背景も透過させます。

![render-setting.png](https://qiita-image-store.s3.amazonaws.com/0/5616/0dfb1252-fb60-6256-f36a-d37bd41e98e7.png "render-setting.png")

Shading内にある「Alpha」を「Transparent」に、書き出しフォーマットをPNGにしてRGBAを選択します。これで背景が透過されてレンダリングされます。

##レンダリングを軽くする
流体は大体の場合において透明でしょう。
ただ、レンダリングは注意しないとだいぶ重い処理になってしまうので、色々試したところ、今回のようなケースの場合は「Renderer」の設定の「Shading」にあるRay tracingをオフ、AlphaをTransparentにすることで透過した質感を残しつつだいぶ素早くレンダリングできることに気がついたのでメモ。テスト用にさっとレンダリング結果を確認できるようにしておくことは試行錯誤を繰り返す上でだいぶ重要。

![renderer-setting.png](https://qiita-image-store.s3.amazonaws.com/0/5616/2a476a97-6487-93c8-194c-93901d67cf86.png "renderer-setting.png")



##参考記事

以下の記事を参考にさせてもらいました。

* [Fluid（フルイド 流体）の簡単なメモ](http://blog.livedoor.jp/hawamo21/archives/7199755.html)
* [Blenderの流体シミュレーション機能](http://cg.xyamu.net/Blender/entry247.html)
EmacsのDiredバッファで 'other-windowのキーバインド設定が有効にならない時

上書いて同じ動作になるようにする。

```

; <C-t>でウィンドウ切り替え
(global-set-key (kbd "C-t") 'other-window)

; Dired用にウィンドウ切り替え設定
(add-hook 'dired-mode-hook
	  (lambda ()
	    (define-key dired-mode-map (kbd "C-t") 'other-window)))


```
[RubyMotion]iOS6と7どちらでもシュミレーターを起動できるようにする

やったこと。

まず、手元のXCodeを5にアップグレードする。
App StoreからXcodeを落としてると思うので、App StoreでXCodeを検索してそのページからアップデートする。

この状態だと6でビルド出来なくなるので、古いSDKを含むXCodeを別途、別のパスに入れないといけない。

https://developer.apple.com/xcode/index.php の

For past versions of Xcode or additional tools— View downloads

のリンクから古いバージョン(4.6.3)を落とす。

XCode5が4.6に上書きされないように一旦退避。

```
mv /Applications/Xcode.app /Applications/Xcode5.0.app
```

で、落として来た4.6.3をXcodeとしてインストールし、

```
mv /Applications/Xcode.app /Applications/Xcode4.6.app
mv /Applications/Xcode5.0.app /Applications/Xcode.app
```

で、Xcode -> Xcode4.6、Xcode5.0 -> Xcodeのようにリネーム。

その後、

```
 ln -s /Applications/Xcode4.6.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk ¥
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.platform/Developer/SDKs/
```

として、4.6のSDKを、5のSDKの中にシンボリックリンクした。

それで、rubymotion用のディレクトリで

```
rake target=6.1
```

これで、iOS6.1用としてシミュレーターを起動できる。


```
rake
```

だけなら、iOS7用で起動される。

参考: http://stackoverflow.com/questions/18423896/is-it-possible-to-install-ios-6-sdk-on-xcode-5
参考: http://satococoa.github.io/blog/2012/12/08/rubymotion-tips/
Pythonのorとandをいっぱいつなげる

pythonのorとandはブール演算子のくせにブール型を返さず、比較した値そのものを返す

```Python
>>> True and False
False
>>> 0 or 1
1
```
##or
x or y
xがTrueならxを返す
xがFalseならyを返す

##and
x and y
xがTrueならyを返す
xがFalseならxを返す

なのでいっぱい繋げて

```Python
>>> 0 and 1 or 1 or 0 and 1
1
>>> 0 and 1 or (1 or 0) and 1
1
>>> 0 and (1 or 1) or 0 and 1
0
```
とか遊べる
評価は括弧の中をした後、前から順番に行われるので

```Python
>>> ((((0 and 1) or 1) or 0) and 1)
1
>>> (((0 and 1) or (1 or 0)) and 1)
1
>>> (((0 and (1 or 1)) or 0) and 1)
0
```
としても同じ
RのクソめんどくさいファイルIO備忘録

文字コードがutf8以外のファイルを読むと化けるってか、そもそも読み込めない。
しかもいちいち/path/to/なんて取得するのもだるい
（日系の企業はデータ名にスペースとか日本語とか入れやがるので。）

だから、csvよみこみの時は、
```data <- read.csv(file( file.choose(), encoding = "Shift-JIS"),header=F)
```
でやると地味に早い。csvの内容知らなくてもすぐに作業に取り掛かれる。
しかもなぜかfile.choose()関数って本で紹介されてないのね。
ちなみにコマンドラインからだとfile.choose()関数は使えないっぽい。
Goでlexerを作る（JSONのコメント削除とミニファイするサンプル）

# なぜ作ったか

[JSON](http://json.org/)はJavaScriptと違ってコメントを含められないのですが、APIドキュメントでサンプルデータを書くときは便宜的にコメントを書いたりします。

そこで、コメントを削除して、ついでにミニファイするユーティリティをライブラリとコマンドラインツールとして作成してみました。

# Goでlexerを作る

Goでlexerを書く手法の一つとして[Lexical Scanning in Go - Rob Pike - YouTube](http://www.youtube.com/watch?v=HxaD_trXwRE)があります。Go標準ライブラリ[text/template](http://golang.org/pkg/text/template/)の[text/template/parse/lex.go](http://golang.org/src/pkg/text/template/parse/lex.go)はこの手法で実装されています。

lexerの状態をstateFnという関数で表すのと、lexerが処理したトークンをchannelでやりとりすることにより、lexerの実装をすっきり書けるのが特徴です。

```go
type stateFn func(*lexer) stateFn
```

# 上のlexerの仕組みをそのまま真似た版

[hnakamur/jsonpreprocess](https://github.com/hnakamur/jsonpreprocess/tree/e6a36e006e4f8b8c145972a867ce474fa8299b4d)のバージョンでは上のlexerの仕組みをそのまま真似た実装となっています。

使い方のサンプル。ミニファイするコマンドラインツールのソースはこちらです。
[jsonpreprocess/minifyjson/main.go at e6a36e006e4f8b8c145972a867ce474fa8299b4d · hnakamur/jsonpreprocess](https://github.com/hnakamur/jsonpreprocess/blob/e6a36e006e4f8b8c145972a867ce474fa8299b4d/minifyjson/main.go)
（このバージョンの時点ではパッケージ名がjsonutilだったので、go getした後にディレクトリ名を変えるか、ソースでjsonutilをjsonpreprocessに変更する必要があります。）

# lexerのinputをstringからio.Readerに変えた版

lexerのinputがstringだと巨大なファイルを読み込むときに内容をメモリ上に読み込まれてしまうのがいまいちです。そこでinputをstringではなくio.Readerにするように改良してみました。
[hnakamur/jsonpreprocess](https://github.com/hnakamur/jsonpreprocess)

使い方のサンプル。ミニファイするコマンドラインツールのソースはこちらです。
[jsonpreprocess/minifyjson/main.go at master · hnakamur/jsonpreprocess](https://github.com/hnakamur/jsonpreprocess/blob/master/minifyjson/main.go)
【JavaScript】power-assert使ってみた

詳しくはこちら
[power-assert使ってみた - 東京Node学園 10時限目に参加してきました](http://nabewata07.hatenablog.com/entry/node.js/power-assert_example)

## power-assertの準備

### npm install
プロジェクトのルートディレクトリにすでにpackage.jsonがあるとします．このとき，プロジェクトのルートディレクトリで以下のコマンドを実行します．

```
$ npm install power-assert grunt-espower --save-dev
```
すると，package.jsonは以下のように追記されるはずです．

```json
 "devDependencies": {
   "power-assert": "~0.1.2",
   "grunt": "~0.4.1",
   "grunt-espower": "~0.1.2"
 }
```

### Gruntfile.jsの準備
gruntのtaskによってpower-assert用のファイルを生成するため，Gruntfile.jsを以下のように記述します．

```js
module.exports = function(grunt) {
  var pkg = grunt.file.readJSON('package.json')
    , taskName
  ;

 grunt.initConfig({
   espower: {
     test: {
       files: [
         {
           expand: true, //Enable dynamic expansion,
           cwd: 'test/', //Src matches are relative to this path
           src: ['**/*.js'], //Actual pattern(s) to match
           dest: 'espowered/', //Destination path prefix
           ext: '.js' //Dest filepaths will have this extension
         }
       ]
     }
   }
 });

 for (taskName in pkg.devDependencies) {
   if (taskName.substr(0, 6) == 'grunt-') {
     grunt.loadNpmTasks(taskName);
   }
 }
};
```

これによって，testディレクトリ以下のテストファイルを基にしてespoweredディレクトリにpower-assert用のテストファイルが作成されるように設定できます．

### テストを書く
以下のテストコードをtestディレクトリにpower_assert_example-test.jsという名前で保存します．

```js
var assert = require('power-assert');

 describe('Array', function(){
   beforeEach(function(){
     this.ary = [1, 2, 3];
   });
   describe('#indexOf()', function(){
     it('should return index when the value is present', function(){
       var zero = 0, two = 2;
       assert(this.ary.indexOf(zero) === two);
     })
   })
 });
```

以上で準備は完了です．

## テストファイル生成と実行
gruntタスクを走らせてテストコードを生成します．

```
$ grunt espower:test
Running "espower:test" (espower) task

Done, without errors.
```

上記のように表示されればタスク実行が正常に完了しています．

テストを走らせてみます．

```
$ mocha espowered/power_assert_example-test.js

  ․

  0 passing (6 ms)
  1 failing

  1) Array #indexOf() should return index when the value is present:
     AssertionError: # (プロジェクトのルートディレクトリ)/test/power_assert_example-test.js:10

      assert(this.ary.indexOf(zero) === two);
                  |   |       |     |   |
                  |   |       |     |   2
                  |   -1      0     false
                  [1,2,3]
（以下略）
```

assertの中身の情報が出力されていて，[1, 2, 3]というaryで呼び出したindexOfというメソッドの結果が-1になっていて右辺の2とは一致せずに失敗していることが分かります．
Berkshelf+knife soloでNew Relicな環境を用意する


New Relic入れるならBerkshelf使おうよということでやってみました。
ちなみにCentOS64に対してLAMP構成を作るって想定です。

1. まずはknife solo initコマンドを実行する  

まずはknife solo initしませう。  

```
$ knife solo init newrelic
```
　
2.  作成されたBerksfileに以下の記述をする

```
$ cd newrelic
$ vim Berksfile

site :opscode

cookbook 'yum'
cookbook 'php'
cookbook 'mysql'
cookbook 'apache2'
cookbook 'newrelic'
```
　
3. knife solo prepareを行う

```
$ knife solo prepare chef@hoge
```
　
4. nodes/hoge.jsonを修正する 
knife solo prepareで、nodes/hoge.jsonというファイルが出来ていると思うので、その中を修正していきたいと思います

```
$ vim nodes/hoge.json

{
    "mysql":{
        "server_debian_password": "hoge",
        "server_root_password":"hoge",
        "server_repl_password":"hoge"
    },
    "newrelic":{
        "server_monitoring": {
            "license":"キー"
        },
        "application_monitoring":{
            "license":"キー"
        }
    },
    "run_list":[
        "yum::remi",
        "yum::epel",
        "mysql::server",
        "apache2",
        "php",
        "newrelic"
    ]
}
```
　
5. いよいよサーバーにインストールするよ！
普通にknife solo cookを使うだけ。

```
$ knife solo cook chef@hoge
```

これだけで簡単にlamp環境の構築からnewrelicのインストールまで出来てしまいます。

## 実際にリポジトリに上がっているものを使ってみる
上の方に書いた手順をgithubにあげておきました。
[berks-newrelic](https://github.com/polidog/berks-newrelic)

で、実際にリポジトリから落としてからどうやって使うかを説明します。

1. リポジトリから取得する

```
$ git clone https://github.com/polidog/berks-newrelic.git
```
　
2. bundle installを実行する
実は今回用意したリポジトリにGemfileを用意したのでbundle installをしてください。

```
$ bundle install
```
　
3. berksコマンドを実行する
.chefディレクトリとかも用意されているので、そのままberksコマンドを実行しましょう。
このとき--pathでcookbooksを指定します。

```
$ bundle exec berks --path=./cookbooks
```
　
4. knife solo prepareを実行する

```
$ bundle exec knife solo prepare root@hoge
```
　
5. nodes/hoge.jsonを編集する
必要に応じて編集すれば良いかと思いますが、基本的なものをnodes/default.jsonという形でよういしています。  
ファイルをコピーして書き替えれば多少は手間が省けます。

```
$ cp nodes/default.json nodes/hoge.json
```

ちなみにいちいちコピーする必要も無い場合は以下のようにもできる
'''
$ 

newrelicのライセンスキーの指定の部分は必ず変更するうようにしてください。
　
6. あとはknife solo cookするだけ！

```
$ knife solo cook root@hoge
```

ちなみにホストとnodeファイルをが違う場合は以下のようにするのもありかも

```
$ knife solo cook root@hoge -N default
```

これで落としてきたリポジトリの物が使えますよー。
404ページが返す(/から と httpから)

[カスタムエラーレスポンス](http://httpd.apache.org/docs/2.2/ja/custom-error.html)より、問題やエラーが発生した時の動作として、Apacheに以下の４つのうち一つの動作を設定することができる
1. Apache 標準の簡単なエラーメッセージを表示
2. 自分で指定したメッセージを表示
3. 問題やエラーの処理をする為に、自サーバ内の URL-path へリダイレクト
4. 問題やエラーの処理をする為に、外部の URL へリダイレクト(最終のステータスコードが、200だ)

ユーザ向け、１番目が、理解にくくて、2番目が表現悪い。
4番目が、ユーザ向けに問題がないけど、検索エンジンに対して、200戻って、記録されたので、悪い。
* [ErrorDocumentを絶対URLで書くのはやめようよ](http://memo.hirosiki.jp/article/52431377.html)
3番目が、一番よい設定はずだ。しかし、404ページが戻るため、そのページに、相対パスを使わないようにしないといけない。絶対パスで、CSSとか、JSとか設定する
例：　/ja/path1/path2に、エラー発生すると、、/ja/404.htmlにCSSファイルが戻らない
AbstractErrorに汎用機能をつけてみた

[前回](http://qiita.com/cocottejs/items/77d93e5902c6deda0bfe)はカスタムエラーを作成する方法を投稿しました。
せっかくなのでこのAbstractErrorに汎用的な機能をつけてみました。
stackを配列に分解したものをinfoプロパティに格納し、エラーが発生した関数名・ファイル・行数・位置を簡単に取得する事が出来るメソッドを追加しました。
メソッドはdepthを指定する事で、スタックトレースをさかのぼる事が出来ます。
depth指定なしで直前のファイル等を取得します。

```js:AbstractError.js

var util = require('util');

var AbstractError = function AbstractError (message) {
	'use strict';
	this.message = message || 'Error';
	this.name    = this.constructor.name;
	Error.captureStackTrace(this, this.constructor);
	// スタックを加工しinfoに追加
	this.info= this.stack
			.split(/[\r\n]+/)
			.reduce(function(x, y){
				var m = y.match(/at (.*) \((.+\.js):([0-9]+):([0-9]+)/);
				if (m) {
					x.push({method: m[1], file: m[2], line: m[3], column: m[4]});
				}
				return x;
			}, []);
};
util.inherits(AbstractError, Error);

// エラーの発生した関数名
AbstractError.prototype.getMethod = function getMethod (depth) {
	var info = this.info[depth || 0];
	return info ? info.method : null;
};

// エラーの発生したファイル
AbstractError.prototype.getFile = function getFile (depth) {
	var info = this.info[depth || 0];
	return info ? info.file : null;
};

// エラーの発生した行数
AbstractError.prototype.getLine = function getLine (depth) {
	var info = this.info[depth || 0];
	return info ? info.line : null;
};

// エラーの発生した位置
AbstractError.prototype.getColumn = function getColumn (depth) {
	var info = this.info[depth || 0];
	return info ? info.column : null;
};

module.exports = exports = AbstractError;

```

使用方法は[前回](http://qiita.com/cocottejs/items/77d93e5902c6deda0bfe)を参考にしてみてください。
osx で `cd /foo/bar/hoge` の状態で Ctrl+w して `cd /foo/bar/` のようにパスを区切り文字として扱う

タイトルが長いですが。

`$ cd /foo/bar/hoge` でCtrl-wで一文字消すと `$ cd` まで戻ってしまって悲しい。
なので一文字だけ戻るように設定しました。

```
# /foo/bar^w -> /foo/
stty werase undef
bind "\C-w":unix-filename-rubout
```

UbuntuとOSXで同じ設定使う部分だけ共有するような emacs の init-loader みたいな仕掛けってないんでしょうかね。
xamlのエラーは分かり難すぎる

WPFなアプリの開発でMVVMタイプの設計で開発をすると避けては通れないのがDataBinding。どうもその筋の人達のブログを見ているとなるべくxaml側の記述で済ませてコードビハインドの部分にはコードを書かない。その代りDataBindingを多用するというのが流行のスタイルの模様。

で、そのスタイルでコードを書いていてどはまりしたのでメモ。

まず、Prismを使用したアプリのVMにこんなコードがありました。

```csharp
        private ObservableCollection<MyData> _myList;
        public ObservableCollection<MyData> MyList
        {
            set
            {
                _myList= value;
                RaisePropertyChanged(() => MyList);
            }

            get
            {
                return _myList;
            }
        }
```

ある日突然このMyDataのRaisePropertyChangedの部分でArgumentNullExceptionが発生する様になりました。今までは全く問題無かったコードなのに！

で、試しにこの部分を

```csharp
RaisePropertyChanged("MyList");
```

こういう風にしてみます。固定の文字列だしnullになる事はありえない。でもやっぱり例外が。

風邪ひいて朦朧とした意識のなかあーでもないこーでもないと考えましたが全くアイディアは浮かばず。ふと、ログを見てみるとbindingエラーが多発しています。

あ、そういえばMyDataのメンバーを変更したけどxamlの方直してなかったなーと。

念の為にそちらを直してみると・・・

**例外出なくなりました・・・orz**

今までってbindingのエラー出てもコンソールに出るだけでこういう現象は無かったので本筋に関係ない部分は後回しにして放置していましたが、基本コンソールに出ているエラーは全部潰すべきですね。

今回のものに限らずxaml部分で何かが起きると全然違う部分でエラーになるので問題点を特定するのに一苦労します。もう少し開発環境を何とかしてもらわないと開発の効率悪いしMS頑張ってもらわないとね。VS2012で開発しているので新しい環境では直っていたりすると嬉しいんだけど・・・あまり期待は出来ないかなぁ・・・。
osx に coffee を入れる

## javascriptをパワーアップ！

`$ brew install node`
`$ sudo npm install -g coffee-script`

最近の node.js は パッケージ管理システムの npm がデフォルトで入るので別に npmを入れる必要はない。

んで 適当なフォルダに coffee/hoge.coffee ってファイルと `js` ってフォルダを作って

`$ coffee -o js -cw coffee` してから hoge.coffee を編集すると勝手にコンパイルされたファイルがjsに入る。
homebrewのFomulaディレクトリのパーミッションエラーの時の対処

こんなエラーが出たら

`Error: Permission denied - /Library/Caches/Homebrew/Formula/node.brewing`

`$ sudo chown -r username /Library/Caches/Homebrew/`

で所有者を変えてしまいましょう。何で勝手に変わるんだろう。

## 参考

Permission denied - /Library/Caches/Homebrew/Formula/nmap.brewing - Stack Overflow
http://stackoverflow.com/questions/17610417/permission-denied-library-caches-homebrew-formula-nmap-brewing
ruby-build の --enable-load-relative オプション

```bash
$ MAKE_OPTS="-j 4" RUBY_CONFIGURE_OPTS="--enable-load-relative" rbenv install 2.0.0-p195
```
のように --enable-load-relative を有効にして ruby をビルドすれば、`~/.rbenv/versions` 以下のディレクトリ名を変更できるようになる。例えば、以下のように haikanko という名前に変更して、haikanko ruby として使うとか。

```bash
$ cp -a ~/.rbenv/versions/2.0.0-p195 ~/.rbenv/versions/haikanko
$ rbenv local haikanko
```

ruby のバージョンをあげても同じ名前で動かせるので、アプリの起動スクリプトの修正が不要になったりする。

合わせて読みたい: [ruby-build(rbenv) でビルド時に名前を指定する](http://qiita.com/sonots/items/dec38779544c632f66f2)
gitignore.ioを使って、コマンドラインから一発で.gitignoreを作成する

※OSX環境での手順です。

まず、gi コマンドとして、bashrcやzshrcに登録します。

```zsh
% echo "function gi() { curl http://gitignore.io/api/\$@ ;}" >> ~/.zshrc && source ~/.zshrc
```

これで、作りたい言語を指定して、giコマンドを発行すると

```zsh
% gi objective-c
```

.gitignoreに書くべき項目がリストアップされます。

```
% gi objective-c
# Generated by http://gitignore.io

### Objective-C ###
# Xcode
.DS_Store
*/build/*
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
profile
*.moved-aside
DerivedData
.idea/
*.hmap
```

これをファイルに出力するようにすれば、コマンドラインから一発で.gitignoreファイルを作成できます。

```zsh
gi objective-c > .gitignore
```

.gitignore作るときは今まで[gitignore.io](http://gitignore.io/)からコピペしてたんですが、これで圧倒的に速く作れるようになりました。
iTunes のインターネットラジオで、現在流れている曲をテキストファイルに保存するシェルスクリプト

シェルスクリプトの練習がてら作ってみました。
ここが変だよというものがあれば、是非聞かせてください。

![songclip.gif](https://qiita-image-store.s3.amazonaws.com/0/11524/41962c75-30ce-df92-cc99-ada03a817eac.gif)

~~~sh:songclip.sh
#!/bin/bash
set -eu

# コマンド名を取得
declare -r COMMAND_NAME=$(basename "$0")

# ストリーム情報を保存するファイル
declare -r SONG_CLIP_FILE="$HOME/Dropbox/document/songclip.txt"

# iTunes からストリーム情報を取得
declare -r SONG_INFO="$(osascript -e '
  if application "iTunes" is running
    tell application "iTunes" to current stream title
  end if
')"

# コマンドの説明
usage() {
  cat << EOD
Usage: $COMMAND_NAME <subcommand>
  now       Display a current stream title
  list      Display the clipped song list
  delete    Delete the song info (only one line)
  purge     Purge the contents of existing file (delete all line)
  help      Display the Usage
EOD
}

# "missing value" か "" ならばエラーメッセージを表示して終了
check_stream() {
  if [ "$SONG_INFO" = "missing value" -o -z "$SONG_INFO" ]; then
    echo "Error: Can't retrieve the cunrent stream title."
    exit 1
  fi
}

# 引数の指定がない場合
if [ "$#" -eq 0 ]; then
  # 現在流れているストリーム情報をファイルに保存
  check_stream
  if grep -qs "$SONG_INFO" "$SONG_CLIP_FILE"; then
    echo "Now Playing the stream title is already exists."
    exit 1
  fi
  echo "$SONG_INFO" >> "$SONG_CLIP_FILE"
  echo "Clipped: $SONG_INFO"
  exit 0
fi

# 第一引数によって処理を分ける
case "$1" in
  "now")
    # 現在流れているストリーム情報を表示
    check_stream
    echo "Now Playing: $SONG_INFO"
    ;;

  "list")
    # 保存した情報を表示
    if [ ! -e "$SONG_CLIP_FILE" ]; then
      echo "$SONG_CLIP_FILE: No such file."
      exit 1
    fi
    cat -n "$SONG_CLIP_FILE"
    ;;

  "delete")
    # 入力された番号の行を削除
    echo -n "Please enter the line number: "
    read line_number
    expr "$line_number" + 1 >/dev/null 2>&1 | true
    if [ "${PIPESTATUS[0]}" -lt 2 ]; then
      file_rows=$(awk 'END { print NR }' "$SONG_CLIP_FILE")
      if [ "$line_number" -ne 0 -a "$line_number" -le "$file_rows" ]; then
        sed -i "" -e "${line_number}d" "$SONG_CLIP_FILE"
        echo "Deleted a line."
        exit 0
      fi
    fi
    echo "There is no such line. Please try again."
    exit 1
    ;;

  "purge")
    # ファイルを空にする
    echo -n "Are you sure you want to empty the file? (yes|no): "
    read purge_answer
    if [ "$purge_answer" = "yes" ]; then
      echo -n > "$SONG_CLIP_FILE"
      echo -n "." && sleep 1 && echo -n "." && sleep 1 && echo -n ". "
      echo "Purged the contents of the file."
    fi
    ;;

  *)
    # Usage を表示
    usage
    exit 1
esac

exit 0
~~~

上記はやや古いものですが、新しいものを GitHub にアップしました。
[https://github.com/jamband/songclip](https://github.com/jamband/songclip)
Rails4メモ　簡易なブログを作る その３

分からなかったら[RailsGuide](http://guides.rubyonrails.org/getting_started.html "RailsGuide")を見る。

config/application.rbのファイルを開く
下記を追加

```rb
config.time_zone = 'Tokyo'
config.active_record.default_timezone = :local
config.active_record.time_zone_aware_attributes = false
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
config.i18n.default_locale = :ja
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
```

<strong>config.time_zone = 'Tokyo'</strong>と
設定することによって
入出力は日本時間で、データベースにUTC時刻が入る。
これをデータベースに日本時間で保存するには
<strong>config.active_record.default_timezone = :local</strong>と
<strong>config.active_record.time_zone_aware_attributes = false</strong>とする。
ローカル時間（JST）に変更する。これで日本時間で保存される。

<strong>config.i18n.default_locale = :ja</strong>を設定することによって、
日本語対応にできる、登録、更新ボタンやエラーを日本語対応にするため、また
他言語対応するために必要。
参考 http://morizyun.github.io/blog/i18n-english-rails-ruby-many-languages/
動画ならhttp://dotinstall.com/lessons/basic_rails/6546

<strong>config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]</strong>
を設定。Model、Viewごとに分けてi18nを設定できるようにする。
config/localesフォルダの下にmodelsフォルダを作る。modelsフォルダの下にファイルを作る。
article.ja.ymlとcomment.ja.ymlを作成。



その後 Gemfileを開く。

```rb:Gemfile
gem 'rails-i18n'
```

を追加。

以上を設定後、サーバーを再起動する
エラーやボタンが自動で日本語化される
ただカラムなどは英語表記なので下記のファイルを設定。

```rb:article.ja.yml
ja:
  activerecord:
    attributes:
      article:
        title: タイトル
        name: 名前
        content: 内容
```

```rb:comment.ja.yml
ja:
  activerecord:
    attributes:
      comment:
        commenter: 名前
        body: 内容
```

ymlファイルはデータを配列のような形で構造的にして分かりやすくデータを整理したもの
詳しくはhttp://www.oiax.jp/rails/for_web_designers/yaml.html を参照。

再びサーバー再起動する。
jQueryでrgb(255,255,255)を#FFFFFF形式に変換

ちょっと仕事で使ったのでメモ。
jQueryで色を指定したり取得したりすると、rgb(xxx,xxx,xxx)の形式になる。
特定の要素の色を取得して、フォームのvalueとして登録したかったので調べた。


```css
.color{
    display:inline-block;
    width:1em;
    height:1em;
    padding:0;
    border: 2px solid #CCC;
    margin-right:6px;
}

.color_000{
    background-color: #000;
}
.color_333{
    background-color: #333;
}
.color_666{
    background-color: #666;
}
.color_999{
    background-color: #999;
}
.color_ccc{
    background-color: #CCC;
}
.color_fff{
    background-color: #FFF;
}
```
こんなCSSで、

```html
<p>
    <a href="#" class="color_000 color"></a>
    <a href="#" class="color_333 color"></a>
    <a href="#" class="color_666 color"></a>
    <a href="#" class="color_999 color"></a>
    <a href="#" class="color_ccc color"></a>
    <a href="#" class="color_fff color"></a>
    <input type="hidden" value="" name="selected_color" class="selected_color" />
</p>
```
なHTMLの場合、

```js
jQuery(function(){
    $(".color").click(function(){
        $(".color").css({"borderColor":"#CCC"});
        $(this).css({"borderColor":"blue"});

        //クリックされた要素の背景色取得
        var bgColor = $(this).css("backgroundColor").toString();
        //背景色の余計な文字列削除
        bgColor = bgColor.replace("rgb(","");
        bgColor = bgColor.replace(")","");
        //文字列分割
        bgColor = bgColor.split(",");
        //10進数を16進数に変換して連結
        bgColor = "#"+parseInt(bgColor[0]).toString(16)+parseInt(bgColor[1]).toString(16)+parseInt(bgColor[2]).toString(16);
        //inputに値を設定
        $(this).nextAll("input[type=hidden]").val(bgColor);
    });
});
```

ミソはココ

```js
parseInt(bgColor[0]).toString(16);
```

parseInt()で文字列（例えば255）を数値に変換。それをtoString(16)で文字列に変換している。「(16)」は16進数に変換って意味。

toString(16)なんて初めて知った...
CocoaPodsでインストール済みのモジュールのバージョンを固定したpodディレクティブ生成


Podfile.lock から sed で抜き出してコピペ

```bash:...
$ cat Podfile.lock | sed -e "s/^  - \(.*\) (\(.*\))/pod \"\1\", \"\2\"/" 
PODS:
pod "AFNetworking", "1.3.2"
pod "JLRoutes", "1.3"
pod "OCMock", "2.2.1"
pod "Reachability", "3.1.1"
pod "RHAddressBook", "1.0.2"
pod "SVWebViewController", "0.1"
```
カメラロールから選択した画像のパスを取得する

カメラロールから取得した画像のパスを取得する方法。
そのパスをCoreDataにNSStringで保存したりします。
UIImagePickerControllerでカメラロールから画像を選択したあと呼ばれるメソッドに、ガチャガチャと書いていきます。

AssetsLibratyを使用するので、フレームワークを追加してヘッダーファイルに

```objc
#import <AssetsLibrary/AssetsLibrary.h>

```
と書いておきましょう。



実装部分は以下です。
今回はheaderImageButtonというUIButtonの背景画像を変えています。
そして、プロパティであるmanagedObjectに画像のパスをつっこんでいます。

```objc
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
	// Pathを取得
	NSURL *referenceURL = [info objectForKey:UIImagePickerControllerReferenceURL];
	// AssetsLibratyを作成
	ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
	[library assetForURL:referenceURL resultBlock:^(ALAsset *asset) {
		// まずassetからバッファをつくる
		ALAssetRepresentation *rep = [asset defaultRepresentation];
		Byte *buffer = (Byte*)malloc(rep.size);
		NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:rep.size error:nil];
		NSData *data = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES]; //これが必要なデータ
		// データからUIImageを作成
		UIImage *imageFromFile = [UIImage imageWithData:data];
		// 画像をセット
		[self.headerImageButton setImage:imageFromFile
								forState:UIControlStateNormal];
		
		// imagePathをmanagedObjectに入れる
		[self.managedObject.imagePath setValue:referenceURL forKey:@"imagePath"];
		NSLog(@"imagePath : %@", referenceURL);
		
		/*
		// サムネイルを使う場合はassetだけで良いのでもっと楽
		// UIImageに変換
        UIImage* thumbnail = [[UIImage alloc] initWithCGImage:[asset thumbnail]];
        // 画像変更
		[self.headerImageButton setImage:thumbnail
								forState:UIControlStateNormal];
		 */
	} failureBlock:^(NSError *error) {
		// error handling
	}];
	
	// モーダルビューを閉じる
	[self dismissViewControllerAnimated:YES completion:nil];
}

```

ちなみに、サムネイルを使う場合はALAssetRepresentationとか書いたりしなくていいので楽です。
[asset thumbnail]で画像が取得できます。
wordpressのパスワード保護で、保持期限をfunctions.phpとアクションフックで変更する

##パスワード保護って便利ですよね
wordpressの記事などで、特定の方に閲覧してもらいたい時などに、
「パスワード保護」を用いてパスワードをこっそり配布する、ということを、よく行っております。

##でもパスワード保持期限は短くしたい
で、そのパスワードをcookieに保持する期限が、デフォルトだと10日。
セキュリティ上の理由で、もっと短くしたい環境もあるでしょう。

で、それをどう実装するか。

##さて、どうやって実装するべきか
日本語の情報では、wp-pass.phpの項目を直接変更してね！とか、
また3.4移行はwp-pass.phpが無いので、wp-login.phpの該当行を直接変更してね！
などが多く見受けられます。実にスマートではないですね。

はい、私も直接変更していました。実にスマートではないですね。

##結論と実例
そこで、functions.phpとアクションフックを用いて、wordpressの本体ファイルに手を付けない形で実装してみました。
以下のサンプルでは、パスワード保持期限を１時間としております。

時間を変更する場合は、「HOUR_IN_SECONDS」の部分を、10分であれば「600」など、秒数を指定してあげると宜しいです。
ちなみに「10 * MINUTE_IN_SECONDS」の方がスマートかも。

間違ってたらご指摘ください。当方では実装できてます。

```php

function custom_postpass_time() {
	require_once ABSPATH . 'wp-includes/class-phpass.php';
	$hasher = new PasswordHash( 8, true );
	setcookie( 'wp-postpass_' . COOKIEHASH, $hasher->HashPassword( wp_unslash( $_POST['post_password'] ) ), time() + HOUR_IN_SECONDS, COOKIEPATH );
	wp_safe_redirect( wp_get_referer() );
	exit();
}
add_action( 'login_form_postpass', 'custom_postpass_time' );

```

参考ページ
Custom Post Password Cookie Expiry Time - Gists - GitHub
https://gist.github.com/3259814


##おまけ：秒数を解りやすく指定できる定数などwordpressには用意されているみたい

便利ですな、これ。

```php

define( 'MINUTE_IN_SECONDS', 60 );
define( 'HOUR_IN_SECONDS',   60 * MINUTE_IN_SECONDS );
define( 'DAY_IN_SECONDS' ,   24 * HOUR_IN_SECONDS   );
define( 'WEEK_IN_SECONDS',    7 * DAY_IN_SECONDS    );
define( 'YEAR_IN_SECONDS',  365 * DAY_IN_SECONDS    );

```

参考ページ
WordPress のコアファイルで見つけたカッコイイ PHP コードの書き方・関数などのまとめ
http://pimpmysite.net/archives/267
ORA-21561が出た場合にチェックする項目

#ORA-21561が出た場合にチェックする項目

/etc/hosts に、自分自身を追記してあるか確認

```
127.0.0.1 localhost localhost.localdomain HOST名 HOST名.ドメイン名
```

これがないと、sqlplusやActiveRecordなどでもエラーになります
objective-c で iOS 7 かどうか判定する （又はマクロでバージョン判定する）

Utilクラスとかを定義して以下のメソッド作っておくと便利。
マイナーバージョンは見てないので、7.1になっても大丈夫（なはず）。

```objc
+ (BOOL)isIOS7
{
    NSArray  *aOsVersions = [[[UIDevice currentDevice]systemVersion] componentsSeparatedByString:@"."];
    NSInteger iOsVersionMajor  = [[aOsVersions objectAtIndex:0] intValue];
    if (iOsVersionMajor == 7)
    {
        return YES;
    }
    
    return NO;
}
```

追記：

マクロで定義する方法もあるそうです。 @skonb さん、ありがとうございます！

```objc
#define SYSTEM_VERSION_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
```
jQueryのAjax関数使用時の注意点

jQueryのAjax関数を使用してhttp送信する際にブラウザごとに挙動が異なるのでメモ。

Firefox基本的に適当に入れると動くのですが、ChromeとSafariがうんともすんとも言わない。
原因となったオプションはこれ。

# async / boolean

>非同期通信フラグ。初期値ではtrue（非同期通信）で、リクエストが投げられてから応答があるまで、ユーザエージェントは非同期に処理を続行します。falseに設定（同期通信）した場合、通信に応答があるまでブラウザはロックされ、操作を受け付けなくなることに注意してください。

とのこと。
非同期じゃうまくいかないってことなのでasyncのオプションをfalseにして同期通信にしてあげるだけ。
IEはasyncオプションを外してあげれば良い。

```js:

$.ajax({
    type : 'post',
    url : 'POST_URL',
    data : data,
    dataType : 'json',
    scriptCharset: 'utf-8',
    async: false,
    success : function(data) {
     },
    error : function(XMLHttpRequest, textStatus, errorThrown) {
    }
});

```
iOS 7 でステータスバーのスタイルを設定する方法

UIViewControllerで以下のメソッドを定義
※ これは定義してもiOS6以下に影響なし

```objc
- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleBlackOpaque;
}
```


viewDidLoadあたりで以下を呼び出し
※ これは呼び出すとiOS 6以下でクラッシュ

```objc
[self setNeedsStatusBarAppearanceUpdate];
```


実際は以下のようにiOS7かどうか判定する

```objc
if ([Util isIOS7])
{
    [self setNeedsStatusBarAppearanceUpdate];
}
```

※ isIOS7メソッドについては以下
http://qiita.com/jazzsasori/items/f243dd7c47151be02384
Audacity 2.0.4 on Mac OS X 10.8.4 が落ちる

結論：Audacityのバグっぽいので、2.0.3 を使おう

https://code.google.com/p/audacity/downloads/detail?name=audacity-macosx-ub-2.0.3.dmg&can=2&q=

- .wavをdrag & drop で開こうとすると落ちる
- .wavを新規に開くと落ちる

みたいな症状が出て困った

http://forum.audacityteam.org/viewtopic.php?f=47&t=74692
forumにも出てるこれだと思う

一部引用
>Alternatively you can go back to Audacity 2.0.3 . Please note that 2.0.3 may still crash occasionally when importing files, but "Open with" and "dropping-on-the-icon" works. 

forumによると、2.0.3でもたまに落ちるらしい。
ブラウザ側で日時指定で表示・非表示を切り替えるスクリプト

某所より要望があったので作りました。

## ソースと使い方

ソースです。jQueryは別途用意してください。

```js
$(document).ready(function() {
  $(".view_timer").each(function(index, target) {
    var startDate = $(this).attr("data-start-date");
    var endDate = $(this).attr("data-end-date");
    var nowDate = new Date();

    if (startDate) {
      startDate = new Date(startDate);
    }
    else {
      startDate = nowDate;
    }
    if (endDate) {
      endDate = new Date(endDate);
    }

    if (startDate <= nowDate && (!endDate || nowDate <= endDate)) {
      $(this).show();
    }
    else {
      $(this).hide();
    }
  });
});

```

htmlではこんな感じで要素に対してclassとdata-start-date, data-end-date属性を設定すると

```html
<span class="view_timer" data-start-date="2013/9/24 10:00" data-end-date="2013/9/30 21:00">HogeHogeFugaFuga</span>
```

data-start-date〜data-end-dateの期間だけ表示されるようになります。
上記の例だと2013年9月24日 AM10時〜2013年9月30日 PM9時まで表示されるようになります。


```html
<span class="view_timer" data-start-date="2013/9/24 10:00">テスト</span>
```

上記のようにdata-start-dateだけ指定するとdata-start-dateで指定された日時から無期限に表示されるようになります。


また、反対に下記のようにdata-end-dateだけ指定すると

```html
<span class="view_timer" data-end-date="2013/9/30 21:00">お試し</span>
```

単純にdata-end-dateで指定された日時以降は表示しないようになります。


## 長所

* jQueryだけで実装してるので静的なHTMLでも使える!

## 短所

* HTMLのソースを覗かれたら丸見え!!
Faker を i18n locale :ja で使うときは Faker::Config.locale を :en にセットしなおすべし

Faker は各種 locale に対応しているので Rails アプリなどで default locale を :ja にセットすると人名のダミーデータが日本語化されたりして便利なのだけど Faker::Internet.email がぶっ壊れてテストデータの email バリデーションエラーが出まくってハマった。

#### default locale :en で使う場合

問題無し。普通はこういう状態を期待する。

```rb
require 'i18n'
I18n.locale # => :en
require 'faker'
Faker::Config.locale # => :en
Faker::Internet.email # => "sanford@jacobsonjohns.com"
```

#### I18n.locale = :ja にセットして使う場合

Faker の locale も :ja になり、 email アドレスの local part / domain part が壊れる (内部的に日本語で "美咲.清水@美咲.com" みたいなデータが作られた上で ascii 範囲外の文字列が削除されていると予想)

```rb
require 'i18n'
I18n.locale # => :en
I18n.locale = :ja
I18n.locale # => :ja
require 'faker'
Faker::Config.locale # => :ja
Faker::Internet.email # => ".@.com"
```

#### i18n.locale = :ja した上で Faker::Config.locale = :en にセットしなおす

期待した振る舞いに戻る。

```rb
require 'i18n'
I18n.locale # => :en
I18n.locale = :ja
I18n.locale # => :ja
require 'faker'
Faker::Config.locale # => :ja
Faker::Config.locale = :en
Faker::Config.locale # => :en
Faker::Internet.email # => "ransom_blanda@auer.name"
```
CentOSに全文検索エンジンelasticsearchをインストールする


* javaインストール

```
sudo yum install java

java -version
java version "1.6.0_24"
```

* elasticsearchをインストール

2013/9/24時点での最新バージョンであるelasticsearch0.90.5をインストールします。

最新バージョンに関しては[公式サイト](http://www.elasticsearch.org/download/)で確認してください。

```
wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.90.5.tar.gz -O elasticsearch.tar.gz
tar -xf elasticsearch.tar.gz
rm elasticsearch.tar.gz
mv elasticsearch-* elasticsearch
```

* 設定変更

elasticsearchで使用するhttpポートを9200に変更します。

```
sudo vi /usr/local/share/elasticsearch/config/elasticsearch.yml

http.port: 9200
```

* kuromojiインストール

形態素解析器を使って日本語検索ができるようにkuromojiプラグインをインストールします。

```
sudo /usr/local/share/elasticsearch/bin/plugin --install elasticsearch/elasticsearch-analysis-kuromoji/1.5.0
```

* 起動スクリプトインストール

```
curl -L http://github.com/elasticsearch/elasticsearch-servicewrapper/tarball/master | tar -xz
mv *servicewrapper*/service /usr/local/share/elasticsearch/bin/
rm -Rf *servicewrapper*
sudo /usr/local/share/elasticsearch/bin/service/elasticsearch install
```

* 起動

```
sudo /etc/init.d/elasticsearch start
```

* 起動確認 & kuromojiがインストールできているか確認

```
curl -XPUT 'http://localhost:9200/test/' -d '
{
    "index":{
        "analysis":{
            "filter":{
                "kuromoji_rf":{
                    "type":"kuromoji_readingform",
                    "use_romaji" : "true"
                },
                "kuromoji_pos" : {
                    "type": "kuromoji_part_of_speech",
                    "enable_position_increment" : "false",
                    "stoptags" : ["# verb-main:", "動詞-自立"]
                },
                "kuromoji_ks" : {
                    "type": "kuromoji_stemmer",
                    "minimum_length" : 6
                }
                
                
            },
            
            "tokenizer" : {
                "kuromoji" : {
                   "type":"kuromoji_tokenizer"
                }
            
            },
            "analyzer" : {
                "kuromoji_analyzer" : {
                    "type" : "custom",
                    "tokenizer" : "kuromoji_tokenizer"
                }
            }
            
        }
    }
}'

# 以下が出力されればok
{"ok":true,"acknowledged":true}
```

* テストindexの削除

```
curl -XDELETE 'http://localhost:9200/test'

# 以下が出力されればok
{"ok":true,"acknowledged":true}
```

以上でインストール完了です。

### 参考
* [elasticsearchのインストール](http://yuheikagaya.hatenablog.jp/entry/2013/07/14/181415)
* [rajraj / es.sh](https://gist.github.com/rajraj/1556657)
* [elasticsearch での Kuromoji の使い方](http://d.hatena.ne.jp/akishin999/20130307/1362611100)
* [elasticsearch/elasticsearch-servicewrapper](https://github.com/elasticsearch/elasticsearch-servicewrapper)
iOSでローカライズ文字列テーブルを分割する


```
NSString *NSLocalizedString(NSString *key, NSString *comment)
```

は ``ja.lproj/Localizable.strings`` が参照される。

```
NSString *NSLocalizedStringFromTable(NSString *key,
   NSString *tableName,
   NSString *comment)
```

ではtableNameにテーブルを指定できる。例えば ``@"MyTable"`` を指定すると ``ja.lproj/MyTable.strings`` を参照する。

例えば以下のように関数を定義しておくと ``MYLocalizedString(NSString *key) `` で呼び出せる。

```c:header
FOUNDATION_EXPORT NSString *MYLocalizedString(NSString *key);
```

```c:objective-c
NSString *MYLocalizedString(NSString *key)
{
    return NSLocalizedStringFromTable(key, @"MyTable", nil);
}
```

文言を含むライブラリを再利用する場合は文字列テーブルを分けておくと使いやすい。
Rubyで複数の変数に別々の値を代入するイディオム

Rubyで複数の変数に配列の値を展開するイディオムやその実行結果を色々調べてみました。

````ruby
# カンマ区切りでxとyに別々の値を代入
x, y = 1, 2 # x => 1, y => 2

# 配列にしても同じ
x, y = [1, 2] # x => 1, y => 2

# 要素数が多いと切り捨てられる
x, y = [1, 2, 3, 4]  # x => 1, y => 2

# 配列とカンマ区切りが並ぶと、xには配列が代入される
x, y = [1, 2], 3, 4 # x => [1, 2], y => 3

# *を付けると配列が展開される(x, y = 1, 2, 3, 4と同じ)
x, y = *[1, 2], 3, 4 # x => 1, y => 2

# x, y = 2, 3, 4と同じ
x, y = *[2], 3, 4 # x => 2, y => 3

# x, y = 3, 4と同じ
x, y = *[], 3, 4 # x => 3, y => 4

# *を付けなければ、xには空の配列が代入される
x, y = [], 3, 4 # x => [], y => 3

# 配列の配列だけなら、*があってもなくても同じ
x, y = [[1, 2], [3, 4]] # x => [1, 2], y => [3, 4]
x, y = *[[1, 2], [3, 4]] # x => [1, 2], y => [3, 4]

# 配列の配列とカンマ区切りの値が混在していると、*の有無で挙動が変わる
x, y = [[1, 2], [3, 4]], 5, 6 # x => [[1, 2], [3, 4]], y => 5
x, y = *[[1, 2], [3, 4]], 5, 6 # x => [1, 2], y => [3, 4]

# 値や配列が一つだと、xにのみ値が入る
x, y = 1 # x => 1, y => nil
x, y = [1] # x => 1, y => nil
x, y = *[1] # x => 1, y => nil

# 配列が空だと、どちらもnilになる
x, y = [] # x => nil, y => nil
x, y = *[] # x => nil, y => nil
````

## なんでこんなこと調べたの？

なんでこんなこと調べたのかというと、ここのコードの意味がよくわからなかったからです。

- [diophore/book-rspec-codebreaker/codebreaker.rb#L19](https://github.com/diophore/book-rspec-codebreaker/blob/master/codebreaker.rb#L19)

````ruby
secret, guess = *[@secret.to_a, guess.to_a].transpose.reject {|s, g| mark >> '+' if s == g }.transpose || [], []
secret.each {|c| mark << '-' if guess.delete_first c }
````

おそらく`|| []`の部分は不要で、こう書いても動作は同じでした。

````ruby
secret, guess = *[@secret.to_a, guess.to_a].transpose.reject {|s, g| mark >> '+' if s == g }.transpose, []
secret.each {|c| mark << '-' if guess.delete_first c }
````

### 最後に", []"が必要な理由

`[@secret.to_a, guess.to_a].transpose.reject {|s, g| mark >> '+' if s == g }.transpose`の部分は通常、`[[1,2],[3,4]]`のような配列の配列が返ってきます。
なので、`secret, guess = *[[1,2], [3, 4]]`となり、`secret = [1,2]`、`guess = [3,4]`となります。

しかし、全ての要素がrejectされると結果は`[]`になります。
すると、`secret, guess = *[]`となり、`secret`も`guess`も`nil`となります。

`secret`が`nil`だと、次の行で`undefined method 'each' for nil:NilClass`のエラーが出るので、`secret, guess = *[], []`として、`secret`に`[]`が代入されるようにしているわけです。

### Be more readable

でもこれだとちょっとトリッキーなので、僕だったらこう書くかな～と思いました。

````ruby
secret, guess = *[@secret.to_a, guess.to_a].transpose.reject {|s, g| mark >> '+' if s == g }.transpose
secret.each {|c| mark << '-' if guess.delete_first c } unless secret.nil?
````

`(secret || []).each`と書くのも良いかもしれませんね。
VagrantでCakePHPを動かそうとした際に躓いたこと


## CakePHPセットアップ時によくあるエラー
CakePHPセットアップ時にapp/tmpの権限がうまく言っていないと下記のエラーが出てしまいます。

```
Warning: _cake_core_ cache was unable to write 'cake_dev_ja' to File cache in /vagrant/lib/Cake/Cache/Cache.php on line 325

Warning: /vagrant/app/tmp/cache/persistent/ is not writable in /vagrant/lib/Cake/Cache/Engine/FileEngine.php on line 386

Fatal error: Uncaught exception 'CacheException' with message 'Cache engine _cake_core_ is not properly configured.' in /vagrant/lib/Cake/Cache/Cache.php:181 Stack trace: #0 /vagrant/lib/Cake/Cache/Cache.php(151): Cache::_buildEngine('_cake_core_') #1 /vagrant/app/Config/core.php(367): Cache::config('_cake_core_', Array) #2 /vagrant/lib/Cake/Core/Configure.php(72): include('/vagrant/app/Co...') #3 /vagrant/lib/Cake/bootstrap.php(177): Configure::bootstrap(true) #4 /vagrant/app/webroot/index.php(92): include('/vagrant/lib/Ca...') #5 {main} thrown in /vagrant/lib/Cake/Cache/Cache.php on line 181
```

app/tmpのパーミッションを777にして実行権限をapacheにも与えてあげる必要があります。

# Vagrantでのファイルパーミッション設定方法
Vagrantのファイルパーミッションはコマンドで直接変更ができないようになっているようで、upする際にパーミッションを決めて上げる必要があるみたいです。

Vagrantfileに下記のコードを追記してグループ権限をapacheにしてあげれば上記のエラーは解決されます。（Chefなどでapache入れてる前提）
```
config.vm.synced_folder "./", "/vagrant", owner: 'vagrant', group: 'apache', mount_options: ['dmode=777', 'fmode=666']
```

ちょっと躓いたのでメモ。
イメージファイルの変換、trim(qemu-img,VBoxManage)

* [vdiイメージのtrim](http://qiita.com/tukiyo3/items/81c572767e96b5750804)

```bash:必ずzero埋めしておく
$ dd if=/dev/zero of=zero bs=4k; rm -f zero
```

```bash:qemu-imgのインストール
$ sudo yum install -y qemu-img
```

## フォーマット変換

```bash:qcow2->qed
qemu-img convert -O qed centos.qcow2 ~/centos.qed
```

```bash:vdi->qcow2
qemu-img convert -O qcow2 windowsxp.vdi ~/windowsxp.qcow2
```

```bash:raw->vdi
VBoxManage convertdd sdb.raw sdb.vdi --format VDI
```

```bash:raw->vmdk
VBoxManage convertdd sdb.raw sdb.vmdk --format VMDK
```

```bash:vdi->raw
VBoxManage clonehd sdb.vdi sdb.raw --format RAW
```


trim
---------------

```bash:qcow2の未使用領域を取り除く
$ qemu-img convert -O qcow2 vm-301-disk-1.qcow2 vm-301-disk-1.qcow2.new
```

```bash:vdi
$ VBoxManage modifyhd sdb.vdi --compact
```

イメージ作成
------------

```bash:
# qemu-img create -f qcow2 vm-107-disk-1.qcow2 500G
# ls -lh
合計 140K
-rw-r--r-- 1 root root 200K 12月 14 07:18 vm-107-disk-1.qcow2
```

## extensionのインストール

* [virtualbox.org • View topic - Console Extension Pack installation](https://forums.virtualbox.org/viewtopic.php?f=7&t=44337)

```
sudo VBoxManage extpack install \
  Oracle_VM_VirtualBox_Extension_Pack-5.0.24-108355.vbox-extpack
```

## サイズを拡張

```
qemu-img resize disk1.qcow2 +7G
qemu-img check -r all disk1.qcow2
qemu-img info disk1.qcow2
```
Gitソースコードリーディング : git cat-file -t を読み解く

`git cat-file -t badcafe`
と打つと、sha1値からオブジェクトタイプを調べてくれます。
これの挙動を追ってみました。

## オブジェクトタイプを検出している箇所
https://github.com/git/git/blob/v1.8.4/sha1_file.c#L1537

```c
int parse_sha1_header(const char *hdr, unsigned long *sizep)
{
	char type[10];
	int i;
	unsigned long size;

	/*
	 * The type can be at most ten bytes (including the
	 * terminating '\0' that we add), and is followed by
	 * a space.
	 */
	i = 0;
	for (;;) {
		char c = *hdr++;
		if (c == ' ')
			break;
		type[i++] = c;
		if (i >= sizeof(type))
			return -1;
	}
	type[i] = 0;

          /*
           * The length must follow immediately, and be in canonical
           * decimal format (ie "010" is not valid).
           */
          size = *hdr++ - '0';
          if (size > 9)
                  return -1;
          if (size) {
                  for (;;) {
                          unsigned long c = *hdr - '0';
                          if (c > 9)
                                  break;
                          hdr++;
                          size = size * 10 + c;
                  }
          }
          *sizep = size;

          /*
           * The length must be followed by a zero byte
           */
          return *hdr ? -1 : type_from_string(type);
  }
```

hdrという名前はおそらくheaderの略です。
この`parse_sha1_header`関数が呼び出される前に、`unpack_sha1_header`関数でオブジェクトファイルのzlib解凍と読み込みがされており、読み出された文字列がhdrに格納されています。

hdrの中身は"blob 12\0"のようなテキストデータで始まっており、これを解析することでオブジェクトのタイプとサイズが得られます。

type文字列には"blob","tree","commit","tag"のいずれかがセットされるようです。
タイプ文字列はこの関数の最後でint型に変換されてreturnされます。
int型の整数は、オブジェクトタイプを表します。

オブジェクトタイプは`cache.h`の323行目あたりで定義されています。
https://github.com/git/git/blob/v1.8.4/cache.h#L323

```c
        OBJ_COMMIT = 1,
        OBJ_TREE = 2,
        OBJ_BLOB = 3,
        OBJ_TAG = 4,
```

## バックトレース
左から、関数名 at ファイル名:行番号　です。

```
#0  parse_sha1_header at sha1_file.c:1620
#1  sha1_loose_object_info at sha1_file.c:2506
#2  sha1_object_info_extended at sha1_file.c:2538
#3  sha1_object_info at sha1_file.c:2573
#4  cat_one_file at builtin/cat-file.c:49
#5  cmd_cat_file at builtin/cat-file.c:396
#6  run_builtin  at git.c:303
#7  handle_internal_command  at git.c:466
#8  run_argv  at git.c:512
#9  main  at git.c:595
```
GitLab 6.1 Community Editionがリリース！

## 主な変更点

1. コミットメッセージを使用してIssueを自動クローズ
1. コミットやコメントで参照されるとIssueに表示
1. IssueとマージリクエストのIDがプロジェクト毎に1番から開始
1. マージリクエストに説明が追加

[[詳細を表示](http://hiroponz.hateblo.jp/entry/2013/09/24/004255)]
RubyでHello World

「どう書く」でお世話になっている鍋谷さんのブログ記事http://d.hatena.ne.jp/Nabetani/20130921
の「Hello World」表示の別解。
鍋谷さんが書いているようにRubyでは色々楽が出来る手段があるので、例えば正規表現リテラルを使って

```rb
r = /Hello World/
r.to_s =~ r
puts $&
```

だけで出来たりします。
それじゃ面白く無いので例外を使って

```rb
Hello rescue print $!.to_s.split.last
World rescue w = $!.to_s.chars.to_a
puts ([]<<w.pop<<w.pop<<w.pop<<w.pop<<w.pop<<w.pop).reverse.join
```

例外のメッセージフォーマットが変わったら破綻しますがrubyのバージョン1.8/1.9/2.0で大丈夫なようです。
iOS 7 でステータスバーを隠す方法

UIViewControllerで以下のメソッドを定義。
デフォルトではNOが返っているらしいので、YESを返すと隠れる。

```objc
- (BOOL)prefersStatusBarHidden
{
    return YES;
}
```

※ iOS 5.0 〜 6.1も一応確認しましたがこちらのメソッド定義しても影響なさそう
「第2回オフラインリアルタイムどう書くの参考問題」をPHPで解く

http://qiita.com/Nabetani/items/9d80de41903775296ca6

画像を回転させる問題です。
絶対に誰も真似しない方法で回答。

```php
<?php

	class ROTATE{
		
		/**
		* 画像を回転させる
		* @param  String 「3:5b8」みたいな文字列
		* @return String 「3:de0」みたいな文字列
		*/
		public function get($input){
			// 入力を2進数に
			list($size, $hex) = explode(':', $input);
			$bit = '';
			$tmp = str_split($hex, 4);
			foreach($tmp as $key=>$val){
				$bit .= sprintf('%0'.(strlen($val)*4).'s', base_convert($val, 16, 2));
			}
			
			// 指定サイズの黒画像を作成
			$image = imagecreatetruecolor($size, $size);
			$dot = imagecolorallocate($image, 0, 0, 1);
			
			// 1のビットに点を打つ
			for($y=0; $y<$size; $y++){
				for($x=0; $x<$size; $x++){
					if($bit[$x+$y*$size]){
						imagesetpixel($image, $x, $y, $dot);
					}
				}
			}
			
			// 画像を回転
			$image = imagerotate($image, 270, 0);
			
			// 色を取得
			$rot = '';
			for($y=0; $y<$size; $y++){
				for($x=0; $x<$size; $x++){
					$rot .= imagecolorat($image, $x, $y);
				}
			}
			imagedestroy($image);
			
			// 16進数にして戻す
			$rot = str_pad($rot, (strlen($bit)), '0', STR_PAD_RIGHT);
			$ret = '';
			$tmp = str_split($rot, 16);
			foreach($tmp as $key=>$val){
				$ret .= sprintf('%0'.(strlen($val)/4).'s', base_convert($val, 2, 16));
			}
			return $size . ':' . $ret;
		}
	}
	
	// テスト
	$test = [
		['3:5b8', '3:de0'],
		['1:8', '1:8'],
		['2:8', '2:4'],
		['2:4', '2:1'],
		['2:1', '2:2'],
		['3:5d0', '3:5d0'],
		['4:1234', '4:0865'],
		['5:22a2a20', '5:22a2a20'],
		['5:1234567', '5:25b0540'],
		['6:123456789', '6:09cc196a6'],
		['7:123456789abcd', '7:f1a206734b258'],
		['7:fffffffffffff', '7:ffffffffffff8'],
		['7:fdfbf7efdfbf0', '7:ffffffffffc00'],
		['8:123456789abcdef1', '8:f0ccaaff78665580'],
		['9:112233445566778899aab', '9:b23da9011d22daf005d40'],
	];

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

実際に画像を作って回転させました。
もちろん、このような回りくどいことをする必要性は皆無です。
単にやってみたかっただけという。

なおbase_convert()のあたりがややこしいのは、16桁以上の16進数をbase_convert()に突っ込むと正しくない値が返ってきてしまうせいです。
そのせいで最後の2サンプルだけ正しく動かなかったという。
knife solo prepare で ERROR: Net::SSH::HostKeyMismatch:

    knife solo prepare vagrant@x.x.x.x

実行した時に

    ERROR: Net::SSH::HostKeyMismatch: fingerprint xxxxxx

なエラーが出る時

`~/.ssh/known_hosts`に接続しようとしているIPの情報が残ってる。削除したら改善

参考: http://d.hatena.ne.jp/thinkAmi/20130410/1365541725
ansibleでshellやcommandを使う時の注意点


1. shell  
shellはリモートノードのシェル(/bin/sh)を通して実行される。
次の文字を使用できる。  
```
$HOME, "<", ">", "|", "&"
```
2. command  
commandは次の文字を使用できない。  
```
$HOME, "<", ">", "|", "&"
```
3. 環境変数の読み込み  
ansibleではtask毎にシェルを起動して実行している(みたい。)  
つまり前のtaskで次のように環境変数を読み込み、次のtaskで利用する…ということができない。

```Bash  
export   KEY=VALUE
or
source ~/perl5/perlbrew/etc/bashrc (perlbrewの場合)
```

perlbrewのインストール手順で、```source  ~/perl5/perlbrew/etc/bashrc```などがあるが、上記のため、そのままでは使用できない。

そこで、bashの読み込み順に着目して、使用する。

```
~/.bashrc  シェル起動毎に読み込む  
~/.bash_profile  システム起動時に読み込む
```

つまり、次のtaskでも使用したい場合は、```~/.bashrc```に環境変数の読み込みなどを定義しておく。
ただし、本来はシステム起動時に読みこめばいいので、最後のTaskなどで削除して```~/bash_profile```で指定したほうがいいかも。
オライリー本「JavaScriptパターン」で紹介されてるプライベートプロパティ（メンバ）は、インスタンス変数じゃなくてクラス変数

オライリーの「JavaScriptパターン」で、コンストラクタを使って生成したインスンタンスでプライベートメンバ（プロパティ）を実現する方法が２つほど紹介されている。

- P98. 「5.3.5 プロトタイプとプライバシー」
- P103. 「5.4.2 コンストラクタを作成するモジュール」

この「プライベートメンバ（プロパティ）」は、 Java でいうところのインスタンス変数ではなく、クラス変数と同じ振る舞いをする。

本をよく読むと、確かに以下のように書いてある。

- P98

>この方法によって同じコンストラクタで作成されたインスタンスはすべて __共通する部分を共有できる__ ようになります。

危うくインスタンス変数だと勘違いしたまま使うところだった。。。


#検証
##「5.3.5 プロトタイプとプライバシー」で紹介されている方法
サンプル：http://jsfiddle.net/opengl_8080/CRG7P/

```js:
function MyClass(name) {
    this.name = name;
}

MyClass.prototype = (function(){
    var message;
    
    return {
        getMessage: function() {
            return this.name + '「' + message + '」';
        },
        setMessage: function(value) {
            message = value;
        }
    };
}());

var hoge = new MyClass('hoge');
hoge.setMessage('嘘だ・・・インスタンス変数だろ・・・これ・・・インスタンス変数に決まってる・・・！');
console.log(hoge.getMessage());

var fuga = new MyClass('fuga');
fuga.setMessage('ところがどっこい・・・インスタンス変数じゃありません・・・！  クラス変数です・・・！ これが現実・・・！');

console.log(hoge.getMessage());
```

```text:実行結果
hoge「嘘だ・・・インスタンス変数だろ・・・これ・・・インスタンス変数に決まってる・・・！」
hoge「ところがどっこい・・・インスタンス変数じゃありません・・・！ クラス変数です・・・！ これが現実・・・！」
```


##「5.4.2 コンストラクタを作成するモジュール」で紹介されている方法
サンプル：http://jsfiddle.net/opengl_8080/r4FFR/

```js:
var MyClass = (function(){
    var _message;
    
    var Constr = function(name) {
        this.name = name;
    };
    
    Constr.prototype = {
        setMessage: function(message) {
            _message = message;
        },
        getMessage: function() {
            return this.name + '「' + _message + '」';
        }
    };
    
    return Constr;
}());

var hoge = new MyClass('hoge');
hoge.setMessage('もしかしてクラス変数ですかーッ！？');
console.log(hoge.getMessage());

var fuga = new MyClass('fuga');
fuga.setMessage('YES! YES! YES! "OH MY GOD"');

console.log(hoge.getMessage());
```

```text:実行結果
hoge「もしかしてクラス変数ですかーッ！？」
hoge「YES! YES! YES! "OH MY GOD"」
```

#じゃあ、どうすればプライベートなインスタンスメンバを定義できるのか？
##インスタンスの数が少ないことが予想される場合
　→　コンストラクタ関数にプライベートメンバも特権メソッドも全部書く。

```js:
function MyClass() {
    var privateMember;

    this.getPrivateMember = function() {
        return privateMember;
    };
}
```

##インスタンス数が多くなることが予想される場合
　→　諦めて全部 public にする。

そもそも、言語仕様で private がサポートされてないのだから、潔く全部 public にすべきなのかもしれない。

#参考
- [O’Reilly Japan - JavaScriptパターン](http://www.oreilly.co.jp/books/9784873114880/)
- [Javascriptでプライベートメンバを使うなら、prototypeは諦める - 部屋とボードゲームと私と酒と泪と男と女](https://sites.google.com/site/jun1sboardgames/programming/javascript-private-members)
- [JavaScriptでstatic／private／publicなメンバ／メソッドをもったクラスのつくりかた | ALUMICAN.NET](http://alumican.net/68)