OmniAICreator/Qiita-1.07M huggingface dataset:
キーウィンドウが移動しないパネルを作る (NSFontPanelみたいな)


#目的
タイトルが長いけど、NSFontPanel (もしくは NSColorPanel)みたいな挙動をする NSPanelを作りたい。

メモ.appなんかでフォントパネルを操作してみると以下のような動きをする。

* アクティブなのは常にメインウィンドウ (タイトルバーの文字がグレーアウトしていない)
* パネルの上をクリックしてもパネルがアクティブにならない
* パネルのタイトルバーをクリックするとパネルがアクティブになる
* 非アクティブ状態でもパネル上のテーブルやボタンなどの部品は操作できる

![フォント_と_メモ_—_フォントパネルの挙動.png](https://qiita-image-store.s3.amazonaws.com/0/3847/138021d4-4251-959a-8aa2-bc18d7e2e2de.png 
"フォント_と_メモ_—_フォントパネルの挙動.png")

これをどう作るか、という話

#方法
大げさに書いているが実際のところは簡単だった。

* パネルのサブクラスを作る (MyPanelとか)
* インターフェースビルダで配置したパネルの Custom Classを MyPanelにする
* MyPanelの awakeFromNibの中などで setBecomesKeyOnlyIfNeeded: メソッドを呼ぶ

```objectivec:MyPanelで実装
-(void)awakeFromNib
{
    [self setBecomesKeyOnlyIfNeeded:YES];
}
```

これだけ。

http://cocoaapi.hatenablog.com/entry/00000226/recID37326 によれば

```becomesKeyOnlyIfNeeded
必要な時だけキーウインドウになるかを返します。
初期設定はNOを返します。
```

とのこと。


「アクティブなウィンドウ = キーウィンドウ」という理解でいいんだろうか。確かにキーイベントを受け取るのはアクティブなウィンドウだから合ってる気がする。

#ソース
[TODO]

-
###補足1

setBecomesKeyOnlyIfNeededは本来 NSViewの needsPanelToBecomeKeyメソッドと対で使うものらしい。

http://cocoaapi.hatenablog.com/entry/00021017/NSView_needsPanelToBecomeKey

```needsPanelToBecomeKey
パネルがキーウインドウになるかを制御する
サブクラスでオーバーライドして使います。
```

「パネルの中にあるビューから要求を受けた時だけアクティブになる」ということ。今回は要求を出すビューがないからパネルがアクティブにならない。

フォントパネルの右上にあるフォントサイズ指定の NSTextFieldをクリックすると、パネルがアクティブになる。数値を入力するためにパネルがキーウィンドウになったということだが、おそらく NSTextFieldの needsPanelToBecomeKeyは YESを返すようになっているんだと推測できる。

###補足2:カスタムビューをパネルに乗せるとき
この方法で独自のUI部品をパネルに載せて使いたいときは、NSViewの acceptsFirstMouseメソッドをオーバーライドする。これを使うことで、パネルのアクティブ化だけに使われていた最初のマウスイベントもビューに通知されるようになる。逆に、これを実装しとかないとUI部品に対するクリックイベントを拾ってもらえない。

```objectivec
-(BOOL)acceptsFirstMouse:(NSEvent *)theEvent
{
    return YES;
}
```

http://cocoaapi.hatenablog.com/entry/00000222/recID37084

```acceptsFirstMouse
アクティブでない時、マトリックスをマウスダウンしたときに呼ばれます。
サブクラスでオーバーライドします。YESを返すと、アクティブでない時、マトリックスをクリックすると、アプリケーションはアクティブになりウインドウは前面にきて、マトリックスがクリックされメッセージを送信します。NOを返すとアプリケーションはアクティブになり、ウインドウは前面になりますが、マトリックスをクリックしません。
```
DatabaseCleanerでテストデータをロールバックする


テストごとにテストデータをロールバックしたく、色々と試して、以下で動作した。

```
before :suite do
  DatabaseCleaner.strategy = :transaction
  DatabaseCleaner.clean_with(:truncation, only: %w|hoge piyo fuga|)
end

before :each do
  DatabaseCleaner.start

  @hoge = FactoryGirl.create(:hoge)
  @piyo = FactoryGirl.create(:piyo)
  @fuga = FactoryGirl.create(:fuga)
end

after :each do
  DatabaseCleaner.clean
end
```

`:all`ではダメらしい。
Micro-Benchmarking Considered Harmful (in Multithreaded Parallelism)

みたいなタイトルで何か書いてみようと思ったら、既に[先駆者](http://blogs.microsoft.co.il/sasha/2009/05/08/micro-benchmarking-considered-harmful/ 
)が居られるよう（対象領域が違うけど）。

以下適当な散文。

## 言いたかったこと
マルチスレッド並列化においては、「Lock/Unlock処理だけの反復処理で速度性能を計測し、同期機構の優劣を評価する」とか「並列処理ライブラリの性能評価と称して、数列の総和演算のような軽量タスクを用いて議論する」といった、マイクロベンチマーク結果にはほとんど意味がない。それどころか、真に受けて現実のマルチスレッド処理に素直に適用すると、おそらく予想に反する悲惨な結果になるだろう。

## 「Lock/Unlock処理だけの反復処理で速度性能を計測し、同期機構の優劣を評価する」
はこんなの：

```c
// 計測開始
for (/*100万回くらいループ*/) {
  lock(mutex);
  unlock(mutex);
}
// 計測終了
```

Lock/Unlock処理の目的は複数スレッド間の排他制御であり、単一スレッド動作での評価に正当な理由がない。単に“軽い”Lock/Unlock処理を良しとするなら、ユーザーランドで完結するスピンロック機構が自明な最適解となるだろう。このようなスピンロック処理はOSカーネルスケジューラの外側で行われること、またマルチコア環境でキャッシュコヒーレンスプロトコルの輻輳が予想されるため、実タスク処理へ単純適用すると深刻なスケーラビリティ問題を引き起こすことが想像に難くない。
一般的にLock/Unlock処理自体の処理負荷は、そもそも並列化の対象とするタスク処理負荷に比べて無視できるほど十分小さい。もしそうでないなら、そもそもロックの粒度、すなわち並列処理におけるデータ分割やタスク分割といった並列化構造の設計が適切でない。そのようなユースケース向け代替案としては、アトミックな変数操作も一つの選択肢である。
排他制御機構の選択においては、並列に処理されるタスク間の論理的な相互作用、OSによるスレッドスケジューリング、メモリキャッシュ制御などに着目すべきであり、マイクロベンチマーク評価結果に振り回されるべきでない。

## 「並列処理ライブラリの性能評価と称して、数列の総和演算のような軽量タスクを用いて議論する」
はこんなの：

```c
// 計測開始
int sum = 0;
#pragma omp parallel for reduction(+:sum)
for (int i = 0; i < /*大きな値*/; i++) {
  sum += i;
};
// 計測終了
```

まさに並列化処理設計のアンチパターンそのもの。並列処理には常に並列化オーバヘッドが存在する。オーバーヘッドがゼロコストという無意味な仮定を置くならば、単に最小単位までタスク分解を行えば、理論上は最大パフォーマンス・最大スケーラビリティをもたらすだろう。
現実世界においては、常にタスク負荷とオーバーヘッド負荷のトレードオフ問題であり、並列化対象のタスク粒度には大きな関心を払うべきである。実際の対象問題からかけ離れたタスクを用いて評価を行うことに何ら意味がなく、このような不適切なマイクロベンチマーク評価結果に振り回されるべきでない。

## みたいな話。
オチは特にない。
Packerで作ったAMIをAWS CLIでパーミッション変更

<!-- too_old -->
> **この記事は最終更新から1年以上経過しています。** 気をつけてね。

まあPacker限定ではないんですがメモ書き程度で。
作ったAMIを他所に使わせる場合に使う、例えばAWS MarketPlaceとか。

とりあえずpackerでAMIのIDができたとします。

```
==> amazon-ebs: Stopping the source instance...
==> amazon-ebs: Waiting for the instance to stop...
==> amazon-ebs: Creating the AMI: Example AMI
    amazon-ebs: AMI: ami-xxxxxxxx
==> amazon-ebs: Waiting for AMI to become ready..
```


`ec2 describe-images`でSnapShotのIDをいただきます。

```shell:
$ aws ec2 describe-images --image-ids 'ami-xxxxxxxx' [--profile name]

{
    "Images": [
        {
            "VirtualizationType": "hvm", 
            "Name": "Example AMI", 
            "Hypervisor": "xen", 
            "ImageId": "ami-xxxxxxxx", 
            "State": "available", 
            "BlockDeviceMappings": [
                {
                    "DeviceName": "/dev/sda1", 
                    "Ebs": {
                        "DeleteOnTermination": true, 
                        "SnapshotId": "snap-xxxxxxxx",    ## SnapshotのID
                        "VolumeSize": 8, 
                        "VolumeType": "gp2", 
                        "Iops": 24
                    }
                }, 
                {
                    "DeviceName": "/dev/sdb", 
                    "VirtualName": "ephemeral0"
                }, 
                {
                    "DeviceName": "/dev/sdc", 
                    "VirtualName": "ephemeral1"
                }
            ], 
            "Architecture": "x86_64", 
            "ImageLocation": "6xxxxxxxx/Example AMI", 
            "RootDeviceType": "ebs", 
            "OwnerId": "6xxxxxxx", 
            "RootDeviceName": "/dev/sda1", 
            "Public": false, 
            "ImageType": "machine"
        }
    ]
}

```

jqでフィルタの例、スクリプトに組み込むなら。

```shell
$ aws ec2 describe-images --image-ids 'ami-xxxxxxxx'  --profile mp  | jq '.Images[0].BlockDeviceMappings[0].Ebs.SnapshotId'
"snap-cxxxxxxx"

```

## オーナー変更

AMIとSnapshotにAWS MarketPlaceさん向けのパーミッションを付けます。

AMIは`ec2 modify-image-attribute`で`--launch-permission`にAddします。


```shell:
$ aws ec2 modify-image-attribute --image-id ami-xxxxxxxx --launch-permission "{\"Add\": [{\"UserId\":\"67xxxxxxxxxx\"}]}" [--profile name]
{
    "return": "true"
}
```

Snapshotは`ec2 modify-snapshot-attribute`で`--create-volume-permission`にAddします。

```shell:
$ aws ec2 modify-snapshot-attribute --snapshot-id snap-xxxxxxxx --create-volume-permission "{\"Add\": [{\"UserId\":\"67xxxxxxxxxx\"}]}"  [--profile name]
{
    "return": "true"
}
```

これでOK。

----

追記：これを応用したBashスクリプトをGistにおきました。


https://gist.github.com/sawanoboly/b0a6d7289ad5e88177d7

<script src="https://gist.github.com/sawanoboly/b0a6d7289ad5e88177d7.js"></script>
FluentdでApacheのエラーログを収集する正規表現

Apache のエラーログを in_tail プラグインで収集する設定サンプルを紹介します。

## fluent.conf (td-agent.conf)

#### fluentd < v0.10.53 OR td-agent < v1.1.21

```apache
<source>
  type   tail
  path   /var/log/httpd/error_log
  format /^(\[(?<time>[^\]]*)\] \[(?<level>[^\]]+)\] (\[client (?<host>[^\]]*)\] )?(?<message>.*)|(?<message>.*))$/
  time_format %a %b %d %H:%M:%S %Y
  tag    apache.error
  pos_file /var/log/td-agent/apache_error.pos
</source>

# 送り先を Fluentd の標準ログへ出力します
<match apache.error>
  type stdout
</match>
```

#### fluentd >= v0.10.53 (2014/08/21) OR td-agent v1.1.21 (or later) OR td-agent v2

```apache
<source>
  type   tail
  path   /var/log/httpd/error_log
  format apache_error
  tag    apache.error
  pos_file /var/log/td-agent/apache_error.pos
</source>

# 送り先を Fluentd の標準ログへ出力します
<match apache.error>
  type stdout
</match>
```

## Apache の error_log サンプル

こちらは CentOS 6 にインストールした Apache 2 から出力されるエラーログです。

```bash
$ sudo tail -f /var/log/httpd/error_log
[Tue Aug 05 15:48:43 2014] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Tue Aug 05 15:48:43 2014] [notice] Digest: generating secret for digest authentication ...
[Tue Aug 05 15:48:43 2014] [notice] Digest: done
[Tue Aug 05 15:48:43 2014] [notice] Apache/2.2.15 (Unix) DAV/2 configured -- resuming normal operations
[Tue Aug 05 15:48:56 2014] [error] [client ::1] Directory index forbidden by Options directive: /var/www/html/
```

## 取り込まれた error_log のサンプル

`type stdout`と設定したので、 構造化されたログは Fluentd の標準出力へ次のように出力されます。

実際には out_forward プラグインを用いて、ログの集約をする Fluentdインスタンス（Aggregator）へ送り、適宜ログの保存や活用を行いましょう。

```bash
$ sudo tail -f /var/log/td-agent/td-agent.log
2014-08-05 15:48:43 +0900 apache.error: {"level":"notice","message":"suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)"}
2014-08-05 15:48:43 +0900 apache.error: {"level":"notice","message":"Digest: generating secret for digest authentication ..."}
2014-08-05 15:48:43 +0900 apache.error: {"level":"notice","message":"Digest: done"}
2014-08-05 15:48:43 +0900 apache.error: {"level":"notice","message":"Apache/2.2.15 (Unix) DAV/2 configured -- resuming normal operations"}
2014-08-05 15:48:56 +0900 apache.error: {"level":"error","host":"::1","message":"Directory index forbidden by Options directive: /var/www/html/"}
```
nohupを使ってログアウト後もコマンド実行するようにする


sshでサーバにログインして処理時間が長いコマンドを実行すると、sshが途中で切れて処理自体も終了することがあるかと思います。そんな時に便利なのがnohupコマンドです。

これを使えば、ログアウトした後もバックグラウンドでコマンドされるので、長い処理でも最後まで実行されます。

実際の使い方はこんな感じです。下のような使い方でlogファイルを指定します。&でバックグラウンドで実行。

```bash:
$ ssh username@host
/* サーバにログイン*/
$ nohup コマンド &

$ nohup find / -name 'test*' > result.log &
```


参考記事

http://www.codereading.com/nb/ignore-the-hangup-signal.html
http://itref.fc2web.com/unix/shell.html
【備忘録】EclipseでのAndroidアプリ開発環境構築(Windows 7)

##はじめに
職業訓練でインストールしましたが、忘れないための自分用メモです。サイト調べればたくさんいいサイトが出てきますが、検索して余計なことをしないためにここに書きます。
(2014/09/12現在)
###インストールの手順
下記の作業が必要になります。
1. Javaのダウンロード(もしかしたらこれは不要?)
2. Eclipseのダウンロード
3. EclipseにADTの取り込み
4. SDK Managerの設定
5. 仮想端末の設定

##自宅の開発環境
* OS : Windows7 Ultimate SP1
* CPU : AMD Phenom II x6 (64bit)

##Javaのインストール
###JDKのダウンロード
1. OracleのサイトからJDKver7のダウンロードする。サイトのURLはhttp://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html (サイトが改変される可能性があるので、GoogleでOracle JDK ダウンロードとかで検索して探す)
2. [Java SE 7u67](http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html)のページでJava SE Development Kit 7u67 Demos and Samples Downloadsで所定のものを選んでダウンロード(自分の環境では Windows x64 版)

###JDKのインストール
1. ダウロードしたらインストール 今回は略。
2. PATHにjavacやjavaがあるbinフォルダのパスを追加。

##Eclipseのインストール
###Eclipseのダウンロード
1. [Pleiades - Eclipse プラグイン日本語化プラグイン](http://mergedoc.sourceforge.jp/)へ行く。
2. 「Eclipse 4.3.2 Kepler Pleiades All in One」をクリック
3. Java Full Editionをダウンロード 自分の環境では64bit版をダウンロード

###Eclipseのインストール
1. インストールといってもzipファイルを解凍するだけ。注意点はファイル名が長いのでリネームして、自分の好きな場所に格納する。

##EclipseへAndroidの開発環境をインストールする
###EclipseからAndorid開発環境のインストール
1. ヘルプ(H)から新規ソフトウェアのインストールをクリック。インストール画面が表示される。
2. 「インストール」ウィンドウの追加(A)をクリック。
3. 「リポジトリーの追加」ウィンドウで名前(N)にADT(なんでもいい)、 ロケーション(L)にhttps://dl-ssl.google.com/android/eclipse/を追加してOK
4. 開発ツールのチェックボックスをチェックしてOK
5. いろいろメッセージが表示されるが、すべて同意するにしてすすめる。

##Android SDK ManagerからSDKのダウンロード、インストール
書きかけ中。ここは早めに書くようにします。

##仮想端末の設定
書きかけ中

###注意点
学校で購入した教科書通り作業したら失敗した。
失敗した方法はGoogleのサイトからSDKをダウンロードして実行したのだが、なぜかうまく行かなかった。

##最後に
まずはテキストのみで記載しておきます。余力ができたら画像をはりつける予定。
最後に読んでくださってる方感謝です。
monit のデバッグ

[Rails3 で resque を使う #2 - worker を daemon として起動し、monit で監視](http://blog.twiwt.org/e/232155)

ここにあるような「resque ＋ daemon-spawn <-- monit」の環境を作成してたんだけど、resque ＋ daemon-spawn のプロセスを kill しても monit からの再起動に失敗していて困ってました。
何が困っていたかというと monit のログには「failed to start」としか出てなくてですね・・・何がどう悪いのか全く掴めなかったわけです。
どうにかデバッグ出来ないものかと調べていて下記を見つけました。

[Debugging monit](http://stackoverflow.com/questions/3356476/debugging-monit) 

もろもろの情報を吐き出すスクリプトを作成して、それを monit に噛ませればデバッグ情報が取得できるよ、とあったのでそのようにしてみました。

```bash:monit-wrapper.sh
#!/bin/sh
{
  echo "MONIT-WRAPPER date"
  date
  echo "MONIT-WRAPPER env"
  env
  echo "MONIT-WRAPPER $@"
  $@
  R=$?
  echo "MONIT-WRAPPER exit code $R"
} >/tmp/monit.log 2>&1
```

```text:monit.conf
start program = "/home/xxx/monit-wrapper.sh ..."
```

もろもろの情報を出力してみると、どうやら環境変数 HOME が設定されていないのが原因っぽかったので、それを設定してあげることで無事 monit から起動できるようになりました。
monit のデバッグは大変だな。。。
kimonoでお手軽スクレイピング


##【悲報】kimonoサービス終了のお知らせ

[WebスクレイパーサービスKimono LabsがPalantirに買収され、サービスは2月末に閉鎖へ](http://jp.techcrunch.com/2016/02/16/20160215palantir-acquires-kimono-labs-for-its-web-scraping-service/)

+ 2016/02/29を持って、Kimonoのクラウドサービスは閉鎖
+ OS XとWindows用の無料のデスクトップバージョンは引き続き利用可能


##kimonoって何？
[kimono : Turn websites into structured APIs from your browser in seconds](https://www.kimonolabs.com/)

kimonoはウェブページをスクレイピングしてAPI化してくれるサービスです。しかもめっちゃ簡単に。

>Kimono Labs が開発したサービス Kimono を使えば、同サービスにログインした状態で、対象のウェブサイトの欲しいデータをマウスカーソルでなぞるだけで、CSV や JSON 形式でデータを取り込める API を作成できる。コーディングの知識は一切不要だ。ウェブサイトのデータを取り込みに行く頻度も設定できるので、外部サービスを開発するユーザは、Kimono で作成した API を参照して最新のデータが容易に取得できるというわけだ。

（引用：[マウスでなぞるだけで、あらゆるデータ取得をAPI化——Y Com出身のスタートアップKimono Labsにインタビュー - THE BRIDGE（ザ・ブリッジ）](http://thebridge.jp/2014/08/conversation-with-kimono-labs-ryan-rowe-pratap-ranade) ）

##実際にやってみる

kimonoにはChrome ExtensionとBookmarkletが用意されているので、それを用いてブラウザで色々いじっていきます。
使い方はこちらの公式の動画説明を見ればわかると思います。
[kimono : Learn ](https://www.kimonolabs.com/learn/videos)

今回は[Perfumeのホームぺージ](http://www.perfume-web.jp/)の新着更新情報を引っ張ってくるAPIを作ってみました。
https://www.kimonolabs.com/apis/3l7g6jsu


管理画面では、スクレイピングの頻度やらの設定ができたり、言語ごとの呼び出し例や、サイトに埋め込む用のデザイン編集とかもできたりする親切設計です。

![API Detail.png](https://qiita-image-store.s3.amazonaws.com/0/19111/249344e9-7e80-5591-74c6-65112b10514e.png "API Detail   9yt65j80.png")



ちなみに、ターミナルで叩いてみるとこんな感じ。
	
	$curl --include --request GET "https://www.kimonolabs.com/api/3l7g6jsu?	apikey=keafFlX15guur0jXLtJlvdmuUtfzMqQV"
	HTTP/1.1 200 OK
	Content-Type: application/json; charset=utf-8
	Date: Fri, 12 Sep 2014 06:33:13 GMT
	Etag: "297771755"
	Vary: Accept-Encoding
	X-Powered-By: Express
	Content-Length: 2645
	Connection: keep-alive
	
	{
  		"name": "Perfume News",
  		"count": 6,
  		"frequency": "Every 15 mins",
  		"version": 4,
  		"newdata": false,
  		"lastrunstatus": "success",
  		"thisversionrun": "Fri Sep 12 2014 05:17:05 GMT+0000 (UTC)",
  		"lastsuccess": "Fri Sep 12 2014 06:17:29 GMT+0000 (UTC)",
  		"nextrun": "Fri Sep 12 2014 06:47:29 GMT+0000 (UTC)",
  		"results": {
   		"collection1": [
      		{
        		"title": {
          		"text": "Perfume 5th Tour 2014「ぐるんぐるん」supported by チョコラ ＢＢ\n宮城セキスイハイムスーパーアリーナ公演　ステージサイド席の追加販売決定！！",
          		"href": "http://www.perfume-web.jp/news/individual.php?id=253"
        		},
        		"date": {
          		"text": "2015.08.19",
          		"href": "http://www.perfume-web.jp/news/individual.php?id=253"
        		}
      		},
      		{
        		"title": {
          		"text": "Perfume 全米デビュー決定！！",
          		"href": "http://www.perfume-web.jp/news/individual.php?id=249"
        		},
        		"date": {
          		"text": "2014.09.11",
          		"href": "http://www.perfume-web.jp/news/individual.php?id=249"
        		}
      		},
		   ・・・・

##Auth APIだって作れるよ

ログインが必要なページの情報も、kimonoは対応できるんです。

1. Auth modeをクリックすると、シークレットウィンドウが立ち上がる
2. Navigation modeをクリックした後、ログイン画面までページ遷移
3. ログインIDを入力するフォームを選択
4. ログインPassを入力するフォームを選択
5. Submitボタンを選択
6. ID/Passの情報を教えてあげる

すると、Seleniumっぽい感じで、kimonoがID/Passをぬるぬるっと入力してくれてログイン成功です。
その後は、さっきやったのと同じ様に進めていけばOKです。
[Scala]implicit parameterを使ったDI

ScalaでDIを行う方法はいろいろありますが、最近お気に入りのDIのやりかたの紹介です。

implicit defと、implicit parameterを組み合わせて必要なコンポーネントの受け渡しをコンパイラーに任せてしまいます。

利点

* Scalaの標準機能のみで簡単に実装できてライブラリ不要
* 全てコードで記述できるので、XML地獄や新しいDSLを覚える必要がない
* 使いたいコンポーネントをコンストラクタに追加するだけで使えて楽

欠点

* コンストラクターDIしか出来ない

## 手順

1. インジェクションしたいコンポーネントをimplicit defで列挙したクラス(トレイト)を作る
1. コンポーネントを使うクラスで、使いたいコンポーネントをimplicit parameterで定義
1. コンポーネントを使うクラスを生成する際にコンポーネントを列挙したクラスのフィールドをimportする

のが、実装の大まかな流れになります。

## サンプルコード

では、早速サンプルコードを。

### 基本部分


```scala:Repositories.scala
trait Repositories{
  // DIしたいコンポーネントをimplicit defで列挙
  implicit def userRepo : UserRepository
  implicit def mailService : MailService
}
```

```scala:UserRepository.scala

// DIで渡したいコンポーネントの定義
trait UserRepository{
  def getUser(id : Long) : Option[UserDAO]
}

case class UserDAO(id : Long){
  //...implements
}
```

```scala:UserFacade.scala

// 使用したいコンポーネントを、コンストラクタのimplicit parameterに指定する
class UserFacade()(implicit userRepo : UserRepository){

  def changeNickname(id : Long,nickname : String) : Optino[UserDAO]= {
    userRepo.getUser(id).map(_.setAndSaveNickname(nickname))
  }
} 


```

```scala:Factory.scala

class Factory(repos : Repositories){
  
  // コンポーネントを列挙したクラスのフィールドをimportしてやる
  import repos._

  lazy val userFacade = new UserFacade() // 勝手に必要なコンポーネントが渡される
}


```

### 使い方

```scala:Production.scala
object RepositoriesForProduction extends Repositories{
  // lazy valにしておくと、不要なコンポーネントが初期化されない
  lazy val userRepo = new TrueImplementedUserRepository()
  lazy val mailService = new TrueImplmentedMailService()
}
val factory = new Factory(RepositoriesForProduction )
val userFacade = factory.userFacade
userFacade.changeNickname(1,"クドリャフカ")
```


```scala:Test.scala

object RepositoriesForTest extends Repositories{
  // テスト用の場合は、mock化したコンポーネント
  lazy val userRepo = mock[UserRepository]
  lazy val mailService = mock[MailService]
}
// 初期化の方法は変わらず
val factory = new Factory(RepositoriesForTest)
val userFacade = factory.userFacade
userFacade.changeNickname(1,"クドリャフカ")
```


といった感じになります。

## 補足

あと、先ほど利点で挙げた「使いたいコンポーネントをコンストラクタに書くだけでいい」という事を補足しておきます。
例えば、「パスワードリセットして通知メールを送る」機能を追加するとします。
その場合、UserFacade.scalaだけを次のように修正します。

```scala:UserFacade.scala

// メール機能を使いたいのでMailServiceを追加
class UserFacade()(implicit userRepo : UserRepository,mailService : MailService){

  def changeNickname(id : Long,nickname : String) : Optino[UserDAO]= {
    userRepo.getUser(id).map(_.setAndSaveNickname(nickname))
  }
  
  def resetPassword() = {
    userRepo.getUser(id).foreach( user => {
      val newPassword = user.resetPassword() // resetPassword()は実装済みとする
      emailService.sendTo(user,"パスワードリセット",s"新しいパスワードは${newPassword}です")
    })
  }
} 


```

これだけで初期化部分の修正なしに、UserFacadeでEmailServiceを使えるようになります。
rails 日付や時刻の正当性を validation する


##やりたいこと
2014-9-31 などを弾きたい。

##結論から
ActiveModel::EachValidator を使った Custom Validator を追加します。

##gem を使わない理由
+ gem を使わなくても良いくらいの規模。
+ rails のバージョンアップに伴う、gem バージョンアップの負債が増えるのがいやだった。
+ 例えば rails v4.1.5 で validates_timeliness を使うと、以下のような deprecated なエラーが出るようになった。

```stderr
class MyValidator < ActiveModel::Validator
  def initialize(options={})
    super
    options[:class].send :attr_accessor, :custom_attribute
  end
end
. (called from <class:Miko> at /Users/mikosan/mikosan_no_path/mikofuku.rb:1)
W, [2014-09-12T13:52:35.984731 #6011]  WARN -- : DEPRECATION WARNING: The `Validator#setup` instance method is deprecated and will be removed on Rails 4.2. Do your setup in the constructor instead:

class MyValidator < ActiveModel::Validator
  def initialize(options={})
    super
    options[:class].send :attr_accessor, :custom_attribute
  end
end
. (called from <class:Miko> at /Users/mikosan/mikosan_no_path/mikofuku.rb:1)
```

##書いたもの
日付の正当性をチェックします。
フォーマットは YYYY/MM/DD（例：2014/9/12） に固定します。
※もしフレキシブルにする場合には、4行目や7行目へ適宜手を入れて下さい。

```ruby:app/validators/date_validator.rb
class DateValidator < ActiveModel::EachValidator

  def validate_each(record, attribute, value)
    record.errors[attribute] << I18n.t('errors.messages.invalid_date_format') unless /\A\d{1,4}\-\d{1,2}\-\d{1,2}\Z/ =~ value

    begin
      (y,m,d) = value.split('-')
      Time.local(y, m, d, 0, 0, 0)
    rescue
      record.errors[attribute] << I18n.t('errors.messages.invalid_date')
    end
  end

end
```

対応するエラーメッセージを登録します。

```yaml:config/locales/ja.yml
ja:
  ...
  errors:
    messages:
      invalid_date: の指定が不正です。
      invalid_date_format: の形式が不正です。
```

呼び出す側は通常の CustomValidator と同じく、

```ruby:app/models/hoge.rb
class Hoge
  include ActiveModel::Model
  attr_accessor :assigned_date

  validates :assigned_date, date: true

end
```
などと記述して、Controller 側で ```valid?``` することで呼び出せます。

##とはいえ...
フォーマットが固定なのは不便ですし、何も考えずにぼーんと日付っぽい文字列を渡して validation してもらいたい気持ちもあるのでその辺りの実装を盛り込んでおきたい気もします。
しかし、そこまでするなら gem にしたほうが良いのでは？とも思います。
ひとまずはここに落ち着きましたが、うーん。

##時刻は？
上記日付の validation を流用すれば簡単に作れますので、割愛します。
js定期処理


jsで定期的に実行する方法。
地味に詰まったのでメモ


```javascript:javascript
var StartTimer, StopTimer, Timer, time, timerID;

time = 0;
timerID = 0;

StartTimer = function() {
  timerID = setInterval(Timer/*定期的に呼び出す関数名*/, 1000/*呼び出す間隔*/);
};

StopTimer = function() {
  clearInterval(timerID);
};

Timer = function() {
  time = time + 1;
  console.log(time);
  if (time > 180) {
    StopTimer();
    return alert("タイマー");
  }
};

StartTimer();
```
validateで引っかかった際にModelから複数のエラーメッセージを受け取ってくる

[前回](http://qiita.com/te2ka/items/25c8d3d2763a1ab97b1a)の記事に対してとある人から「複数のエラーメッセージを一気に見せてくれた方がユーザにとってはありがたいんじゃない？」と言われたので複数のエラーメッセージを取ってこれるようにしました．

## ソースコード
※ここに載せているソースコードは一部です．[github](https://github.com/YukiTETSUKA/testModel)で公開しているので興味のある方はどうぞ．

```javascript:app/models/user.js
extendModel: function(Model) {
  _.extend(Model.prototype, {
    /* validateプロパティだけど呼び出す時はisValid() */
    validate: function(attrs){
      this.errorMsg.length = 0;
      for(var key in attrs){
        var value = attrs[key];
        switch(key){
          case 'name':
            if(value.length <= 0 || 20 < value.length){
              this.errorMsg.push('名前は１文字以上20文字以下です');
            }
            break;
          case 'age':
            if(value.length <= 0 || isNaN(value)){
              this.errorMsg.push('年齢は数字のみです');
            }
            break;
          case 'email':
            if(!(/^[A-Za-z0-9]+[\w-]+@[\w\.-]+\.\w{2,}$/.test(value))){
              this.errorMsg.push('Eメールが正しくありません');
            }
            break;
        }
      }
      if(this.errorMsg.length) return 'Error';
    },
    errorMsg: []
  });
  return Model;
}
```

こんな感じにerrorMsgを配列にして，validateに引っかかったらエラーメッセージをpushしていくようにしました．
あと，何度もvalidateに引っかかるとエラーメッセージがどんどん蓄積されてしまうので，this.errorMsg.length = 0てな感じで毎回配列を初期化しています．
errorMsgの型を変更したのでcontroller側も1行変更しましたが，1行なのでここには載せません．

## ゆるぼ
lengthプロパティを0にして初期化するのはどうなのでしょうか？
「そのような初期化よりもこっちの初期化の方がいいよ」といった方法があれば教えてください．
Ruby の Proc とその周辺

時々こんな感じで Proc クラスが登場します。

```rb:Proc.new
hello_proc = Proc.new {|name| p "Hello #{name}!"}
hello_proc.call 'Andy' # =>"Hello Andy!"
```

これは proc メソッドや lambda メソッド、「->」を用いても同じことができます。

```rb:procメソッド
hello_proc = proc {|name| p "Hello #{name}!" }
hello_proc.call 'Andy' # =>"Hello Andy!"
```

```rb:lambdaメソッド
hello_proc = lambda {|name| p "Hello #{name}!" }
hello_proc.call 'Andy' # =>"Hello Andy!"
```

```rb:「->」
hello_proc = ->(name) {p "Hello #{name}!" }
hello_proc.call 'Andy' # =>"Hello Andy!"
```

「->」が一番良く見かける方法ですね。
Gitのコミッタを修正したい。

「しまった！職場なのに適当に設定してたら私用メールアドレスでGitのコミットしてしまった！！！」

みたいな経験ありませんか？自分は両方のパターンを経験しましたorz

そのような不幸な事故を起こした時に変更する方法、およびそれを再発しないための方法を備忘録的に書いておきます。

# コミッターをリポジトリごとに設定する

普段は

```shell-session:global
$ git config --global user.name deflis
$ git config --global user.email deflis@home.example.com
```

のように設定すると思いますが、ここの--globalを消すことでリポジトリごとに設定することが出来ます。

```shell-session:local
$ git config user.name deflis
$ git config user.email deflis@coop.example.com
```

手間は増えますが、会社メアドを晒すような事故が減らせるので一手間加えてでもやりましょう。

# 過去のコミットのコミッターを修正する

## 一つ前のコミットを修正する

```shell-session:bad
$ git commit --amend
```

上のことをやってからamendすれば問題ないだろう、と普通は考えてしまうのですが、ダメです。
Authorに前のアカウントが残ってしまいます。

なので、正しいやり方は

```shell-session:bad
$ git commit --amend --author="my_name <my_name@example.com>"
```

というように、authorを別途指定するのが正しいやり方です。

## 複数のコミットを修正する

### rebase -i を使う方法

```shell-session:rebase
$ git rebase -i
```

で書き換えたいコミットをすべてedit指定します。そして、上の手順でamendします。
正直めんどくさいですが、確実です。

### filter-branch を使う方法

後で書きます。
Ruby の case 文

case 文、よく使いますよね。
case 文では when で指定した値に一致するかどうかを「===」演算子を使って比較しています。

```rb:case文
case name
when 'Andy'
  p 'Are you Andy?'
when 'Bob'
  p 'Are you Bob?'
else
  p 'Who are you?'
end
```

if 文に直すとこんな感じです。

```rb:if文
if 'Andy' === name
  p 'Are you Andy?'
elsif 'Bob' === name
  p 'Are you Bob?'
else
  p 'Who are you?'
end
```

「===」は左辺が数値や文字列の場合は「==」として、正規表現の場合は「=~」として、Range の場合は ~~include? として（？）~~ [include?／member? として](http://rurema.clear-code.com/1.9.3/method/Range/i/=3d=3d=3d.html) 比較してくれます。
そのことが case 文の柔軟性を生んでいるんですね。

```rb:case文（正規表現）
case name
when /Andy|Bob/
  p "Are you #{name}?"
else
  p 'Who are you?'
end
```

```rb:case文（範囲）
case age
when 0..12
  p 'You are a child.'
when 13..19
  p 'You are a teen-ager.'
else
  p 'You are an adult.'
end
```

case 文で意識することはないですが、「===」は結果を true／false で、「=~」は結果をマッチした位置（インデックス）で返すという違いはあるので、合わせて把握しておきましょう。
[ひとりごと]GUNDAM構成を考え直す

ちょっと前に
LAMPは終わってこれからはGUNDAM (Github, Ubuntu, Node.js, Dropbox, AWS, MongoDB)だ！なんて話がありました。
もう2年半も前なんですね。

http://togetter.com/li/272441

で，ふと思うと

- Git
- Node.js
- MongoDB
- Docker
- AWS

あとは，U…？
【iOS】iTunesConnect(2014/9) スクリーンショット作成の注意点

iTunesConnectの変更でスクリーンショット回りの変更点も多いので
取り急ぎ対応したメモを公開します。
 
**必要なサイズ**

|対象| 	解像度(px)|	サイズ(pt)|	備考|
|:------------:|:------------:|:------------:|:------------:|
|iPhone4S|	960x640|	960x640||	 
|iPhone5|	1136x640|	1136x640||	 
|iPhone6|	1334x750|	1334x750||	 
|iPhone6 plus|	1920x1080|	2208x1242|	これだけ解像度に対しx1.15|
|iPad|	1024x768|	1024x768||	 

iPhone6 plus向けに作ってiPhone6/5はただのリサイズでほぼ行ける。(2ptくらい引き延ばしなどあるが)
iPhone4SとiPadは独自調整必要。iPhone4S作ってからiPad作る方が結果的には楽。

縦960→1024の方が横640→768よりも変化率が少ないのと、
iPadを入れる場合はいずれにせよ横幅を取るので、横に合わせると詰む。

**ファイル形式**
透明部分にチェックが入っていると弾かれるので注意。
![tomei 2.png](https://qiita-image-store.s3.amazonaws.com/0/41027/b86d9a88-0202-6533-c9bc-8e158028ad75.png)

**ファイル名**
日本語が混ざっているとエラーを返す（サイズがおかしいです、等、意図しないエラーで返される）ので、入れない。
ファイル名に日本語入れるなんて…！って皆様は気にしないで大丈夫です。

**動画（Appビデオプレビュー）**
500MB以内でCM動画をUPできる（for iPhone6）のだけど
iPhone6を使っている所を撮影しないと意味がなさそう…そのうち加筆します
iPXEでCentOS5,6インストーラをboot

* CD or USB、ネットワークなどからブートする。
* TFTPサーバを建てなくてもhttp://経由でイメージのダウンロードが可能。
* CentOS7はネットワークブート途中で止まった・・・
* イメージサイズは1MBと小さい。

## カスタムISOイメージを作成できる。

[ROM-o-matic.eu | Generate iPXE images | open source network boot firmware](https://rom-o-matic.eu/)

## コマンドリファレンス

[iPXE - open source boot firmware [cmd]](http://ipxe.org/cmd)


## ソース

```bash:netboot.pxe
#!ipxe
    dhcp
    set dns 8.8.8.8

#env
    set img_server http://ftp.riken.jp/Linux/centos
    set cent_boot_opt_msg Enter boot option (ex: ks=http://192.168.11.2:8000/sample.ks)

:boot_menu
menu
    item centos7_x86_64  Boot CentOS 7_x86_64
    item centos6_x86_64  Boot CentOS 6_x86_64
    item centos6_i386    Boot CentOS 6_i386
    item centos5_x86_64  Boot CentOS 5_x86_64
    item centos5_i386    Boot CentOS 5_i386
    #
    item ipxe_config     Enter iPXE config
    item ipxe_shell      Enter iPXE shell

choose --default config --timeout 30000 target && goto ${target}

:ipxe_shell
    shell
    goto boot_menu

:ipxe_config
    config
    goto boot_menu

###########
# centos
###########
:centos7_x86_64
    echo ${cent_boot_opt_msg} && read cent_bootopt
    initrd ${img_server}/7/os/x86_64/isolinux/initrd.img
    kernel ${img_server}/7/os/x86_64/isolinux/vmlinuz ${cent_bootopt}
    boot
:centos6_x86_64
    echo ${cent_boot_opt_msg} && read cent_bootopt
    initrd ${img_server}/6/os/x86_64/isolinux/initrd.img
    kernel ${img_server}/6/os/x86_64/isolinux/vmlinuz ${cent_bootopt}
    boot
:centos5_x86_64
    echo ${cent_boot_opt_msg} && read cent_bootopt
    initrd ${img_server}/5/os/x86_64/isolinux/initrd.img
    kernel ${img_server}/5/os/x86_64/isolinux/vmlinuz ${cent_bootopt}
    boot

:centos6_i386
    echo ${cent_boot_opt_msg} && read cent_bootopt
    initrd ${img_server}/6/os/i386/isolinux/initrd.img
    kernel ${img_server}/6/os/i386/isolinux/vmlinuz ${cent_bootopt}
    boot
:centos5_i386
    echo ${cent_boot_opt_msg} && read cent_bootopt
    initrd ${img_server}/5/os/i386/isolinux/initrd.img
    kernel ${img_server}/5/os/i386/isolinux/vmlinuz ${cent_bootopt}
    boot
```

# ISOイメージ作成方法

上のスクリプトを貼り付けてProseed押すとisoがダウンロードできる。

![0.png](https://qiita-image-store.s3.amazonaws.com/0/25728/d5aa8d52-6777-1452-1efb-6503d716588d.png)


# 起動方法

![1.1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/a8386859-28e6-bb08-146a-4f7a194e1ec5.png)


![1.2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/13ca5c1e-c112-a62f-a0b5-a8c226fcf16b.png)


![1.3.png](https://qiita-image-store.s3.amazonaws.com/0/25728/84db01a4-2878-fef5-db7b-64b442308f26.png)


![3centos7.png](https://qiita-image-store.s3.amazonaws.com/0/25728/3e79a2cc-c770-7ea4-7e77-1306aa8c5dae.png)


![1.5.png](https://qiita-image-store.s3.amazonaws.com/0/25728/fcddeaa7-586e-761f-8f2c-68131e9c6550.png)


![1.4.png](https://qiita-image-store.s3.amazonaws.com/0/25728/a92982f4-c580-0c17-3503-386527015b65.png)
Railsのビューでcase文を書く時の注意事項

Railsのビューでcase文を書く時の注意事項。
これを守らないとSyntaxErrorが発生してしまう。
通常であれば、

```rb
<%case @value%>
   <%when "case1"%>
   <%when "case2"%>
<%end%>
```

としたくなるが、こう書くとSyntaxErrorになってしまうので、

```rb
<%case @value
when "case1"%>
   <%when "case2"%>
<%end%>
```

参照
http://blog.digital-squad.net/article/111020699.html
Zsh + peco + ghq で一工夫したらリポジトリへの移動とインポートがとても楽になった

ghq便利なんですが、サブコマンドいらないなと思って、ちょっとしたラッパーを書きました。
`$ r`でリポジトリ管理に必要なことがだいたい出来るのでよいです。

- `$ r (repository name)` : そのリポジトリに移動
- `$ r` : ghqでインポートしたリポジトリをpecoで選択
- `$ r [tab]` : ghqでインポートしたリポジトリ一覧が補完される
- `$ r git@github.com:peco/peco.git` : インポートしてなかったらインポートする

動く様子

![de2.gif](https://qiita-image-store.s3.amazonaws.com/0/8422/494e22dd-d957-6c69-ba47-ed2a96fea868.gif)

下記の関数と補完を`.zshrc`に追加すれば動きます。

Zshの関数:

```zsh
function repo(){
  local result=""
  local choice=""
  local dest=""

  if [ "$1" =~ "^(git|http)" ] ; then
    ghq get $1
    return
  fi

  if [ -z $1 ]; then
    choice=$(ghq list --unique | peco)
    if [ -z $choice ]; then
      echo "No repo was chosen"
    else
      result=$choice
    fi
  else
    result=$1
  fi

  dest=`ghq list --exact --full-path $result`

  if [ "$dest" == "" ] ; then
    echo "Not found"
  else
    cd $dest
  fi
}
```


補完:

```zsh
function _repo {
  _values $(ghq list --unique)
}

compdef _repo repo

alias r='repo'
```

本当は`$ r`でインポートした後にそこに移動したいんだけど、URIのパースが面倒なのでやっていない。
git filter-branch でディレクトリを移動する

動作確認のために次のようにリポジトリを作ります。

```console
$ mkdir aaa
$ touch aaa/.htaccess
$ touch aaa/"空 白"
$ touch aaa/$'改\n行'
$ touch aaa/$'寿司\xF0\x9F\x8D\xA3 \xF0\x9F\x8D\xA3\n\xF0\x9F\x8D\xA3'
$ git init
$ git add .
$ git commit -m first
$ git ls-files
aaa/.htaccess
"aaa/寿司? ?\n?"
"aaa/改\n行"
aaa/空 白
```

`git filter-branch` で aaa ディレクトリを bbb に変更します。

```text
$ git filter-branch -f --tree-filter '
  [ ! -d aaa ] || {
    [ -d bbb ] || mkdir bbb;
    find aaa -mindepth 1 -print0 | xargs -0 -i mv -v {} bbb;
  }
' HEAD
```

移動出来ました。

```console
$ git ls-files
bbb/.htaccess
"bbb/寿司寿司寿司? ?\n?"
"bbb/改\n行"
bbb/空 白
```
Androidアプリを逆コンパイル

逆コンパイルしての解析が仕事です。
セキュリティ関連ではなく、悪の領域です。
Androidのapkを逆コンパイルする手順を超軽く紹介します。

##１．apkをPCにコピー##
マニフェストにてバックアップ可なら普通にバックアップできますが、
そうではないならルート化が必要です。

##２．apkをzipにして展開##
おなじみ、apkの正体はzipファイルです。
拡張子を変更して展開して下さい。

この段階でアセットなどは普通に覗くことができます。
画像データ等は普通に存在しますが、res.values.stringsなどは普通には覗けません。

##３．プログラムデータをJavaプログラムデータに変換##
apkではJavaプログラム本体であるjarは　**classes.dex**　です。
これをjarに変換するには　**dex2jar**　を使用します。
dex2jar.sh ./classes.dex

##４．jarを逆コンパイル##
ソースコードの解析最終段階逆コンパイルです。
###Java Decompiler###
一番楽なのはGUIの　**Java Decompiler**　を使用することです。
これはjarをドロップするだけで、簡単に逆コンパイル結果を見れ、**非常に可視的に変換**してくれます。
ただ、**全く逆コンパイルできない部分**が存在することも多々あり、
更に厄介なのはちゃんと逆コンパイルできていないのにエラーも出さずに、
***変なコードになってしまう***ことも多々あります。
###jad###
そういった時に役に立つのが　**jad**　です。
これはコンソールで動作します。
**逆コンパイルされたソースは非可視的**です。
が、**Java Decompilerで逆コンパイルを断念された部分も出来る限りの力で出来るだけ逆コンパイルしてくれます。**
はじめにjarを展開しておいて、以下のコマンドです。
生成されるファイルの拡張子は　jad　ですが、javaファイルなのでこれを　java　に変えてください。（そういったオプションもあるかもしれませんが）
jad -r \*\*/\*.class

##５．リソースを覗く##
例えば、　res.values.strings　等のリソースは　**resources.arsc**　に格納されています。
これの解析には　**aapt**　を使用します。
aapt　はSDKに付属されています。
aapt dump --values resources android.apk resource.arsc > v.txt
Xcode6 GMへ移行する時に変更した箇所

現在開発しているプロジェクトを、Xcode6 beta5 から Xcode6 GM seed に置き換えた際にコンパイルエラーになった箇所です。
主にOptionalに関する箇所でエラーになりました。

* NSNotification.userInfo

```swift:
notification.userInfo[UIKeyboardFrameEndUserInfoKey]
↓
notification.userInfo![UIKeyboardFrameEndUserInfoKey]
```

* UITableView(UICollectionViewもほぼ同様)

```swift:
func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int
↓
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
```

```swift:
func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!)
↓
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
```

```swift:
func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!
↓
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
```

* NavigationController

```swift:
self.navigationController.viewControllers
↓
self.navigationController!.viewControllers
```

* TabBarController

```swift:
self.tabBarController.selectedIndex 
↓
self.tabBarController!.selectedIndex 
```

* prepareForSegue

```swift:
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!)
↓
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!)
```

* UIStoryboard

```swift:
let controller = self.storyboard.instantiateViewControllerWithIdentifier("Hoge") as HogeViewController
↓
let controller = self.storyboard!.instantiateViewControllerWithIdentifier("Hoge") as HogeViewController
```

* init

```swift:
required init(coder aDecoder: NSCoder!) {・・・}
↓
required init(coder aDecoder: NSCoder) {・・・}
```

* objectForKey

```swift:
let jsonObject:AnyObject

let number1 = jsonObject.objectForKey("data").objectForKey("num") as Int
↓
let number1 = jsonObject.objectForKey("data")!.objectForKey("num") as Int
```

```swift:
let jsonObject:AnyObject

let array = jsonObject.objectForKey("data") ? Hoge.create(jsonObject.objectForKey("tags")) : Array()
↓
let array = jsonObject.objectForKey("data") != nil ? Hoge.create(jsonObject.objectForKey("tags")) : Array()
```

これら以外は案外すんなり動いてくれました。
AIRでNativeProcessを使おうとしたら Error #3219



メモ。

NatvieProcessを使うAdobeAIRアプリで、
FlashBuilder上だとうまく動くのにビルドして.appにしたら動かない。

	#3219: The NativeProcess could not be started. 'Not supported in current profile.'

原因はパッケージングの時にAIRインストーラにしていたこと。
ネイティブAIRインストーラにしたら動作した。
Login Shell を 変更する方法


ターミナル起動時のShellを bash から zsh にしたーい．zsh から bash に戻したーいなんてことがあるかもしれないのでメモ．

```
chsh - change your login shell
```

といコマンドがあります．
詳しくは [man](http://linuxjm.sourceforge.jp/html/shadow/man1/chsh.1.html) を参考にしてもらうとして，こんな感じで使うようです

```bash:bashに設定する
$ chsh -s /bin/bash
```

引数無しだと対話的に変更できるみたいです．
[あるある]ページネーションのスペルはpagenationではない

- ◯ pag"i"nation
- ☓ pag"e"nation

たまに見かけるし、自分も手癖的につい間違いがちなのでメモ。（することで覚える的な）
英語的に、なんで変化するのかは忘れました。

# ※追記

コメントいただいて確認したところ、発音もページネーションではなくて「パジネイション」あるいは「パージネイション」というオチでした。

http://ejje.weblio.jp/content/pagination
Array.| メソッドを使いたく無い

## `Array.|` メソッド

Array の `|` メソッドは与えられた引数であるArrayとの和集合を求めるために使います。

```ruby
[1, 2, 3] | [2, 3, 4]                                                                                                        
=> [1, 2, 3, 4]
```

ですが、この`|`というのは、コードの中に入ると中々読みづらく、ブロック等の仮引数と見間違えることもしばしば・・・

そこで、このメソッドを使わない理由を考えました。

## 読みづらい

これは前述の通りです。

## 遅い

これが実証できれば、大手を振って利用を止められます。
簡単なベンチマークを取ってみました。

### 代替処理

和集合ということは、2つのArrayを加えて、重複を弾けばOKです。
それをそのままRubyのコードに置き換えると、


```ruby
([1, 2, 3] + [2, 3, 4]).uniq
=> [1, 2, 3, 4]
```

こういうことです。2つに限ったことではありません。複数個で試してみると、

```ruby
[1, 2, 3] | [2, 3, 4] | [3, 4, 5] | [4, 5, 6]                                                                                 
=> [1, 2, 3, 4, 5, 6]

([1, 2, 3] + [2, 3, 4] + [3, 4, 5] + [4, 5, 6]).uniq                                                                          
=> [1, 2, 3, 4, 5, 6]
```

間違い無いですね。

### 2個のArrayでの比較

それぞれにBenchmarkを取ってみます。まずは2対のArrayの和集合。

```ruby
Benchmark.measure do
  1000000.times do
    [1, 2, 3] | [2, 3, 4]
  end
end
=> #<Benchmark::Tms:0x007fe500ba98d8
 @cstime=0.0,
 @cutime=0.0,
 @label="",
 @real=1.924258,
 @stime=0.010000000000000009,
 @total=1.9000000000000006,
 @utime=1.8900000000000006>

Benchmark.measure do
  1000000.times do
    ([1, 2, 3] + [2, 3, 4]).uniq
  end
end
=> #<Benchmark::Tms:0x007fe50279a7b8
 @cstime=0.0,
 @cutime=0.0,
 @label="",
 @real=2.730523,
 @stime=0.030000000000000027,
 @total=2.55,
 @utime=2.5199999999999996>
```

うーん、ちょっと遅いですね。
この場合は、1.5倍位遅いのと可読性が高い（と個人的に思っている）のとを天秤に掛けて考える感じでしょう。

### 4個のArrayでの比較

次に4つのArrayの和集合を確認してみます。

```ruby
Benchmark.measure do
  1000000.times do
    [1, 2, 3] | [2, 3, 4] | [3, 4, 5] | [4, 5, 6]
  end
end
=> #<Benchmark::Tms:0x007fe505000158
 @cstime=0.0,
 @cutime=0.0,
 @label="",
 @real=5.570456,
 @stime=0.010000000000000009,
 @total=5.57,
 @utime=5.5600000000000005>

Benchmark.measure do
  1000000.times do
    ([1, 2, 3] + [2, 3, 4] + [3, 4, 5] + [4, 5, 6]).uniq                                                                      
  end                                                                                                                         
end
=> #<Benchmark::Tms:0x007fe5014d5cb8
 @cstime=0.0,
 @cutime=0.0,
 @label="",
 @real=4.201799,
 @stime=0.010000000000000009,
 @total=4.190000000000001,
 @utime=4.1800000000000015>
```

今度は逆転しました。`|`演算子では、演算の度に重複を弾いているので、纏めて重複を弾く後者の処理の方が早くなったと思われます。

## 結論

処理速度の面では、少数のArrayの連結では`|`メソッド、多数では`+`メソッドと`uniq`メソッドの併用が有利です。

ただ、そこまで大きな差は無いので、可読性等を考慮して利用を決めて良さそうです。

掲題の通り、私は`|`メソッドが読みづらいと感じているので、`+`メソッドと`uniq`メソッドの併用で統一しようと思います。
Serfで既存の自動化スクリプト群を叩けるようにして、複数台構成に対応した。

#Background
現在、とあるベンダー製品の運用をしている。そのベンダー製品というのが、今どき珍しく、single instanceでしか動かないという仕様で、そのくせにトラブりまくるという感じである。そのトラブルに対応するために、threaddumpやらheapdumpやら、自動再起動などの、様々な運用を自動化するスクリプトをたくさん作って対応していた
そうしたら、最近になって複数台構成にできるようにアップデートしてきた。自動化スクリプト群はsingle instance用に書かれているものばかりなので、複数台での運用の自動化の際に、それぞれが持っているsingle instance用のスクリプトを、なんらかのコマンドで同時に叩く、ということをしたかった。

#Serf
そこでSerfさんですよ。Serfをつかって、eventが送られた際に、任意のスクリプトをすべてのサーバで叩くという構成をつくった。
#serf-handler.sh
```bash
#!/bin/sh
HANDLER_DIR="/path/to/scripts"
if [ "$SERF_EVENT" = "user" ]; then
    EVENT="tarr-$SERF_USER_EVENT"
elif [ "$SERF_EVENT" = "query" ]; then
    case ${SERF_QUERY_NAME} in
        "uptime")
            uptime;;
         * )
            EVENT="tarr-$SERF_QUERY_NAME";;
    esac
else
    EVENT=$SERF_EVENT
fi
HANDLER="$HANDLER_DIR/$EVENT"
[ -f "$HANDLER" -a -x "$HANDLER" ] && exec "$HANDLER" || :
```
`/path/to/scripts/`というdirectoryに自動化スクリプトが置かれていて、prefixが`tarr-`になっている。例えば、`tarr-autosnapshot.sh`のような感じだ。serfのイベントがきたら、ここのスクリプトを叩けるようにした。

#agentの起動
```bash
$ /path/to/serf/serf agent -node=cdc-node1 -bind=xxx.xxx.64.7 -event-handler=/path/to/scripts/serf-handler.sh > /path/to/serf/log/serf.log.`date +%Y%m%d%H%M%S` 2>&1 &
[1] 6118
 
$ /path/to/serf/serf agent -node=cdc-node2 -bind=xxx.xxx.64.8 -event-handler=/path/to/scripts/serf-handler.sh  > /path/to/serf/log/serf.log.`date +%Y%m%d%H%M%S` 2>&1 &
[1] 27281
```
こんな感じで、必要なサーバでそれぞれ立ち上げていく。その後、joinしておく。

```bash
$ ./serf members
cdc-node1  xxx.xxx.64.7:7946  alive
$ ./serf join xxx.xxx.64.8
Successfully joined cluster by contacting 1 nodes.
$ ./serf members
cdc-node1  xxx.xxx.64.7:7946  alive
cdc-node2  xxx.xxx.64.8:7946  alive
```

# event/queryの発行
好きなサーバに入って、serfにイベントを発行したら、すべてのサーバに伝播されて、スクリプトが実行される。

```bash
$ ./serf query status
Query 'status' dispatched
Ack from 'cdc-node1'
Response from 'cdc-node1': hogehoge201: alive: 19304
Ack from 'cdc-node2'
Response from 'cdc-node2': hogehoge202: alive: 13417
Total Acks: 2
Total Responses: 2
```

応答時間の短いスクリプトは、queryで投げると結果が帰ってきて便利。

```bash
$ ./serf event threaddump-long
Event 'threaddump-long' dispatched! Coalescing enabled: true
```

裏で長時間動くようなスクリプトはeventとして発行する。これで、これまで一台構成用に動かしていた自動化スクリプトを複数台でも動くようにできた。
Vimで全角スペース以外の文字もハイライトする

Vimで、全角スペースをハイライトする方法はよく見かけるのに、それ以外の文字についてもハイライトする方法が見つけられずに苦労してたところ、なんとか実現出来たので置いておく。

```vim:.vimrc
" 全角文字をハイライト表示
function! Zenkaku()
    highlight Zenkaku cterm=reverse ctermfg=DarkMagenta gui=reverse guifg=DarkMagenta
endfunction

if has('syntax')
    augroup Zenkaku
        autocmd!
        autocmd ColorScheme       * call Zenkaku()
        autocmd VimEnter,WinEnter * let w:m1 = matchadd("Zenkaku", '[　０１２３４５６７８９]')
        autocmd VimEnter,WinEnter * let w:m2 = matchadd("Zenkaku", '[ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚ]')
        autocmd VimEnter,WinEnter * let w:m3 = matchadd("Zenkaku", '[ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ]')
    augroup END
    call Zenkaku()
endif

```

ハイライトさせたい文字については、1行で書いても良かったけど、可読性を考えてある程度の塊で分けてみた。

---

P.S

```vim
 * let w:m1
```

上記部分の意味が良く分かっていないので、教えて頂けたら幸いです。
【Github, Gitlab】コミットメッセージにissueクローズを書き忘れたときの対処法

# コミットメッセージに書き忘れたのにpushしちゃった

GitLabのissueをコミットメッセージでクローズする
http://qiita.com/gotohiro55/items/aac51b2b3b0a8b37cebb

上記記事で書かれているように，コミットメッセージの頭に Closes #XX などと記入すると，masterへマージされたときに自動的にissueをCloseしてくれます．
でも，よくやっちゃうんですよね．コミットメッセージにクローズしたい issue 書き忘れるの．

## はじめに

もともとGitlabを対象にこの記事を書いていたのですが，Githubでもできそうだったので，そちらも対象にしています．
https://github.com/blog/1506-closing-issues-via-pull-requests

実際に試しているのはGitlab7.0です．何か間違いがあればご指摘ください．

## 方法1. 履歴を書き換える

git commit --amend でコミットメッセージを再編集してから， git push -f で強制pushする

でも，これはやっぱり非推奨です．
開発ワークフローによっては git push -f が禁止されているところもありますし．

## 方法2. Merge Request(Github名 Pull Request)のDescriptionに記載する

じつはMerge Request(Pull Request)のDescriptionに同様に書くことで，同様の処理を行うことができます．

![00.png](https://qiita-image-store.s3.amazonaws.com/0/51949/c5c0816e-c1ef-14a8-af9b-01734cd06494.png)

※ topic ブランチから develop ブランチへの Merge Request(Pull Request)

---

![01.png](https://qiita-image-store.s3.amazonaws.com/0/51949/b6d953f8-a439-5aaa-1538-7a62e4325774.png)

※ develop ブランチから master への Merge Request(Pull Request)
Close issues の一覧に #93 含まれているのが分かります．

## けつろん！

あせらずおちついて Merge Request(Pull Request) に Closes
sshをEC2のタグからpercol経由でよしなにする


掲題の通り辛くなってきたので、雑ですが書きました。

## require

- AWS CLI
- percol
- zsh

## Install AWS Cli

http://docs.aws.amazon.com/cli/latest/userguide/installing.html

```bash
$ sudo pip install awscli
```

Locale周りの設定していなかったのでlocal設定をする

```bash
$ vim ~/.zshrc
export LC_ALL=ja_JP.UTF-8
```

configure


```bash
# Configuration
$ aws configure
AWS Access Key ID: YOUR_AWS_ACCSS_KEY_ID
AWS Secret Access Key: YOUR_SECRET_ACCSS_KEY
Default region name [us-west-2]: いんすたんすのあるりーじょん
Default output format [None]: text
```

## ssh-login with ec2 via percol

```bash
# ec2-ip
function ec2-ip() {
  instances | percol | awk '{ print $1 }'
}

function instances() {
  instances=( $(aws ec2 describe-instances \
    --query 'Reservations[*].Instances[*].[Tags[?Key==`Name`].Value[],PublicIpAddress]' \
    --output text) )

  for i in `seq 1 ${#instances[@]}`; do
    if [ `expr $i % 2` -eq 0 ]; then
      echo ${instances[$i-1]} ${instances[$i]}
    fi
  done
}

# ec2-ssh
function ec2-ssh() {
  ssh webadmin@`ec2-ip` -p2222 -i ~/.ssh/id_rsa
}
```
Cocos Code IDEのシミュレーターのデフォルト設定


| 実行環境 | 
|:-----------|
| Cocos Code IDE Mac OS X 1.0.0-RC1 |
| Cocos2d-x V3.2 |
| Lua言語 |

Cocos Code IDE Mac OS X 1.0.0-RC1で実行時のシミュレーターのデフォルト設定を変えたかったので調べてみました。

Macで実行しました。Windowsはわかりません。
iOSシミュレーターのことではないです。Macのアプリとして実行されるやつです。
ここでの方法はプロジェクトごとに作業が必要です。

## やりたいこと

1. 横画面から縦画面にしたい
2. 画面サイズを変えたい
3. iPhone6も選択できるようにしたい
4. 起動時に[Control]メニューの[Keep Window Top]のチェックを外したい。
5. 起動時に[View]メニューの[Zoom Out(50%)]に設定したい。

## 1と2と3について

プロジェクトに含まれるconfig.jsonの設定で可能でした。

1は"isLandscape": false
2は"width"と"height"を変更すると"simulator_screen_size"の中から同じものを探すのではないかと推測しています。
3は"simulator_screen_size"にiPhone6を追加しました。

```json:config.json
{
  "init_cfg": {
    "isLandscape": false,
中略
    "width": 960,
    "height": 640,
中略
  },
  "simulator_screen_size": [
中略
    {
      "title": "iPhone 6 (1334x750)",
      "width": 1334,
      "height": 750
    },
    {
      "title": "iPhone 6 Plus (1920x1080)",
      "width": 1920,
      "height": 1080
    },
以下略
```

setDesignResolutionSizeの幅と高さも変えてあげます。言語はLuaです。

```lua:main.lua
中略
cc.Director:getInstance():getOpenGLView():setDesignResolutionSize(320,480,0)
```

## 4と5について

設定等がみつかりませんでした。runtime/macディレクトリ内の拡張子appファイルを実行しているようなので、これを新しく作ることで対応ができました。簡単にできましたが、ビルドするので時間がかかります。
ただし、ここでの方法よりもっといい方法があるかもしれません。

（以下メモ書きのようなものでわかりにくいかもしれません。すいません。）

準備として先にプロジェクトを右クリック、[Cocos Tools]の[Add Native Code Suuport...]を実行しておきます。
すると[プロジェクトのディレクトリ]/frameworks/にいろいろファイルを作ってくれます。

シミュレーターの設定を変えるために[プロジェクトのディレクトリ]/frameworks/runtime-src/proj.is_mac/mac/SimulatorApp.mmを修正します。

```c++:SimulatorApp.mm(変更前)
中略
105行目くらい
g_windTop = true;
以下略
```

```c++:SimulatorApp.mm(変更後)
中略
g_windTop = false; // 修正 [Keep Window Top]にしない
frameZoomFactor = 0.5; // 追加 [Zoom Out(50%)]にする
以下略
```

プロジェクトを右クリック、[Cocos Tools]の[Build Custom Runtimes...]で[Next]を押したあとの[Build Mac Runtime]にチェックを入れて[Generate]をクリックしてビルドします。初回は時間がかかります。

新しく[プロジェクト名].appファイルが[プロジェクトのディレクトリ]/runtime/mac/にできたと思いますので、上部にある[Debug Configurations]ボタンを押して、[Mac OSX]の[Runtime path]に作成されたappを選択すれば完了。

ここで作成した拡張子appのファイルですが、他のプロジェクトでもコピーして使い回しが出来ました。中身は一緒なんですかね？
Selenium IDE 2.6.0はMacOSX Firefox 32.0では動かない

# 共有事項！
* Selenium IDE 2.6.0はMacOSX Firefox 32.0では動かない

# FirefoxのバージョンアップをしたらSelenium IDEが真っ白に！
* 2014/0912現在のFifefoxの最新版32.0にバージョンアップしたらSelenium IDEが使えなくなった
* Windowsではこの問題は発生していません！
* Selenium IDEの立ち上げ自体は成功していて、ウィンドウも出るが何も表示されない
* メニューからテストケースを開いたりできるが、表示が一切ない

# ググるとみなさんも同じ状況になっている模様だった
* http://forums.mozillazine.org/viewtopic.php?f=23&t=2859533
* https://code.google.com/p/selenium/issues/detail?id=7873

# で、どうすればいいの？
* 結局、Firefoxのバージョンを31.0に戻すのが一番と！
* issueみてたらmるあがっていた
* 似たようなバグは１月後に対応されていることもあったので、2014年10月頃にはなおってるかもしれないです
* ただ、テストツールのためにブラウザのバージョン下げるというのは好ましくないんですよね〜
* 最新のSelenium IDEではだめだからテストツールの方のバージョンを下げて対応できるとかならまだ良いのですが

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

archlinuxやcentos7にはnetstatが標準では入っていない。


```bash:TCPのLISTEN一覧
$ ss -t -a
State      Recv-Q Send-Q      Local Address:Port          Peer Address:Port
LISTEN     0      128                     *:ssh                      *:*
ESTAB      0      0          192.168.12.65:ssh        192.168.12.104:51286
LISTEN     0      128                    :::ssh                     :::*
```

```bash:UDPのLISTEN一覧
$ ss -u -a
State      Recv-Q Send-Q      Local Address:Port          Peer Address:Port ```
fetchAllで返ってくる配列のかたちのあれこれ


```
$query  = $this->db->query($sql, $params);
$result = $query->fetchAll();
```

この`fetchAll()`の中身によって配列の形が異なる。


### なにもなし または PDO::FETCH_ASSOC
```
array
  0 => 
    array
      'code' => string '1' (length=1)
      'number' => string '2' (length=1)
      'number_2' => string '' (length=0)
  1 => 
    array
      'code' => string '123A-R' (length=6)
      'number' => string '3' (length=1)
      'number_2' => string '' (length=0)
  2 => 
    array
      'code' => string '99999' (length=5)
      'number' => string '4' (length=1)
      'number_2' => string '1' (length=1)
```
これを最初のカラム（`code`）の値でくくってあげたかったけど迷子になってしまったので議事録。

-

### PDO::FETCH_COLUMN|PDO::FETCH_GROUP

```
array
  1 => 
    array
      0 => 
        array
          'number' => string '2' (length=1)
  '123A-R' => 
    array
      0 => 
        array
          'number' => string '3' (length=1)
  99999 => 
    array
      0 => 
        array
          'number' => string '4' (length=1)
```
これでいけると思ってたのに、なぜか2つめのカラムの情報が落ちちゃった。。なぜ？？？
空かどうかとか関係あるのかな？？？？


### PDO::FETCH_COLUMN

```
array
  0 => string '1' (length=1)
  1 => string '123A-R' (length=6)
  2 => string '99999' (length=5)
```


### PDO::FETCH_GROUP

```
array
  1 => 
    array
      0 => 
        array
          'number' => string '2' (length=1)
          'number_2' => string '' (length=0)
  '123A-R' => 
    array
      0 => 
        array
          'number' => string '3' (length=1)
          'number_2' => string '' (length=0)
  99999 => 
    array
      0 => 
        array
          'number' => string '4' (length=1)
          'number_2' => string '' (length=0)
```
やりたかったのはこれ。
（ほんとは、2階層目の0も要らないから省きたいんだけど）

http://php.net/manual/ja/pdostatement.fetchall.php
PHPのマニュアル読んだけどよくわからなかった・・・ちゃんと調べなきゃー

## 追記

コメントいただいている内容です。

> （ほんとは、2階層目の0も要らないから省きたいんだけど）

上記への対応方法

```
$result = array_map('current', $query->fetchAll(PDO::FETCH_GROUP));
```

結果

```
array
  1 => 
    array
      'number' => string '2' (length=1)
      'number_2' => string '' (length=0)
  '123A-R' => 
    array
      'number' => string '3' (length=1)
      'number_2' => string '' (length=0)
  99999 => 
    array
      'number' => string '4' (length=1)
      'number_2' => string '' (length=0)
```

やりたいことができました！ありがとうございます！！

###### 最後に一言

後から自分の記事を見直すと例に使っているコードもデータも結果の書き方もすごくわかりにくいですね。次に活かします。
配列の”中身”をいい感じに文字列化する拡張メソッド


オブジェクトの配列をToString()しても "Hoge[]"とかあまり意味のない文字列が返ってくるので以下のような拡張メソッドを用意して、配列の各要素に対してToString()できるようにした。

さらに、string.Join() もメソッドチェーンで使えるようにしたら、コード書くときスムーズ。

```csharp:Extensions.cs
static class Extensions {
	public static string[] ToStrings(this object[] objectArray) {
		return Array.ConvertAll<object, string>(objectArray, o => o.ToString()); 
	}
	
	public static string Join(this string[] stringArray, string separator = ",") {
		return string.Join (separator, stringArray);
	}
}
```

# 使用例

以下のように使える

```csharp:example
Hoge[] objArray = GetSomeArray();
Debug.Log(objArray.ToStrings().Join());

```
[mysql] ダンプ・リストアする時にzcatコマンドを使って容量の圧迫を抑える


mysqlのデータをダンプしてリストアしたい時にデータベースの容量が大きいと容量圧迫してしまう。そんなときgzファイルでdumpしたファイルを一度展開するのではなく、zcatコマンドを使って展開しながらリストアすると便利。

### dump

```
mysqldump -u username -ppassword database_name | gzip > dumpfile.sql.gz
```

### restore

```
zcat dumpfile.sql.gz | mysql -u username -ppassword database_name
```