OmniAICreator/Qiita-1.07M huggingface dataset:
Parallels Desktop にて Windows と Android を同時に起動して、iOS と Android を快適にデバッグする方法


筆者は MacBook にて MacOS X を起動して、Parallles Desktop を使用して、Windows の VM を立ち上げて、Visual Studio で Xamarin を利用しています。AVD で作成した Android のエミュレーターはだいぶ遅くてイライラするので、今回は Parallels Desktop で Android の VM を立ち上げます。

と、文章にするとだいぶ言っていることがわからないと思うので、図にすると次のような感じです。

![xamarin.png](https://qiita-image-store.s3.amazonaws.com/0/31790/4974e190-0879-c19e-993d-766fb0fcace9.png "xamarin.png")

# なぜ GenyMotion ではないの？
GenyMotion は VirtualBox 上で動きます。Parallels Desktop と VirtualBox は同時に使うことができません。

> for Virtual Box:
> No workaround is available. Please try not to use Parallels Desktop and Virtual Box at the same time.

[KB Parallels: Mac reboots when you attempt to launch Parallels Desktop 8/9 and Virtual Box simultaneously](http://kb.parallels.com/en/115966)より

# Parallels Desktop に Android をインストールする。
これはググると既にいろいろなところで解説されているので、詳しく書きません。
簡単に説明すると、[Download - Android-x86 - Porting Android to x86](http://www.android-x86.org/download)から android-x86-4.4-RC2.iso をダウンロードして(Viewというリンクをクリックするとダウンロードが始まる)、後は Parallels Desktop の VM 作成時に ISO をマウントしてインストールします。Linux のインストールとあまり変わりありません。

# adb で Android に接続する
Android が起動したら、`ALT + F1` を押して Console を開いて、`netcfg` を実行します。

![kobito.1406736492.314761.png](https://qiita-image-store.s3.amazonaws.com/0/31790/f8da58ff-a0bc-64fc-a3b7-6acc5e50fb11.png "kobito.1406736492.314761.png")

IPアドレスが確認できたら、Windows の コマンドプロンプトから adb connect [IP アドレス]:5555 を入力します。

![kobito.1406736631.878222.png](https://qiita-image-store.s3.amazonaws.com/0/31790/1a0b5f28-740a-33c2-637a-9deb4bea3fc8.png "kobito.1406736631.878222.png")

このように、`adb devices` に表示されれば成功です。

# Use Fast Deployment を OFF にする
筆者の環境では、Use Fast Deployment が On になっていると次のエラーが発生しました。

![kobito.1406737730.811576.png](https://qiita-image-store.s3.amazonaws.com/0/31790/793d3a34-88c3-e4ef-d136-09e0c9dc9e9a.png "kobito.1406737730.811576.png")

Use Fast Deployment を OFF にすることでエラーは解消され、デバッグすることが出来ました。この設定はプロジェクト設定 - Android Options にあります。

![kobito.1406737824.529595.png](https://qiita-image-store.s3.amazonaws.com/0/31790/d5378bec-dd5e-276c-363a-75ec5e2f7e89.png "kobito.1406737824.529595.png")

iOS と Android のエミュレーターを同時に起動しつつ、Visual Studio でデバッグする画面は次のようになります。Coherence モードにしてると、Mac を使ってるのか、Windows を使っているのか時々よくわからなくなるのが問題ですねｗ

![kobito.1406737552.105499.png](https://qiita-image-store.s3.amazonaws.com/0/31790/686e99f4-e1e2-652d-5a92-dd719b8ab2ca.png "kobito.1406737552.105499.png")
Pillow インストール確認、IOError

pipでPILのインストールができなくてググった結果
現在はPillowを使用するとのこと。

pip install Pillow

で無事にインストールできた。

また動作確認でも少し引っかかったのでメモ。

import Image
img = Image.open("filename")
ここで IOError: cannot identify image file

ふむ。

正しくは
from PIL import Image
img = Image.open("filename")
img.show()

これで動作確認できた。
UnityでVisualStudioをデフォルトのエディタに設定する

**1. メニューの「Edit」にある「Preference」を選択します。**
[[![01.png](https://qiita-image-store.s3.amazonaws.com/0/50022/c18430ce-c577-5038-092c-6c7ce4f9a46c.png)
<br/>
**2. 「External Tools」タブを選び、「External Script Editor」を「Microsoft Visual Studio ◯◯◯」に設定します。**
![02.png](https://qiita-image-store.s3.amazonaws.com/0/50022/c0a86602-31da-a16b-3354-f1cbef29f81e.png)
<br/>
**3.Preferenceウィンドウを閉じて、メニューの「Assets」から「Sync Monodevelop Project」を実行します。**

※最新版Unityは「Assets」から「Assets > Open C# Project」を実行

この設定をすると、.slnファイルなどが作成されます
![03.png](https://qiita-image-store.s3.amazonaws.com/0/50022/59bc98b4-34c8-1e2b-e4dc-045847857f4a.png)
<br/>
以上の設定をすると、Unityからスクリプトをダブルクリックなどで開くたびに、VisualStudioが起動するようになります。
Ansibleの新モジュール replace(置換)を使ってみた。


豚足は焼いて食べるのが常識だと思っていた@volanjaです。

さて、Ansible 1.6で[replace(置換)モジュール](http://docs.ansible.com/replace_module.html)が出ていたので試してみました。
replaceモジュールでは、複数行の置換を行う事ができます。
これまで、複数行の置換をしたい場合はakishin999さんの[Ansible で複数行の文字列置換](http://d.hatena.ne.jp/akishin999/20130817/1376709924)を参考にsedを使うか、[templateモジュール](http://docs.ansible.com/template_module.html)を使ってファイルそのものを入れ替える必要がありました。

templateを使うことがほとんどだったのですが、これで便利になりそうです。

# replaceを試す。
では、akishin999さんの[Ansible で複数行の文字列置換](http://d.hatena.ne.jp/akishin999/20130817/1376709924)を参考に、実際にどのようになるか試してみます。

## 実行環境
$ ansible --version
ansible 1.6.8 (release1.6.8 5a4f39bfbf) last updated 2014/07/30 23:46:08 (GMT +900)

## 対象環境
CentOS 6.4 64bit (virtualbox + vagrantで構築)

## 置換先ファイル
```/tmp/test.conf
foo
bar
baz
bar
bar
bar
foo
```

## ansibleスクリプト
```replace.yml 
---
- hosts: server
  user: root
  tasks:
    - name: replace /tmp/test.conf
      replace: dest=/tmp/test.conf regexp='^bar$' replace='BAR=9999' backup=yes
```

パラメータについては[replace(置換)モジュール](http://docs.ansible.com/replace_module.html)を参照してください。

| parameter | 説明　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 |
|:----------|-----:|
| dest | 対象環境上の置換先ファイル 　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　|
| regexp | 正規表現。pythonの[正規表現ルール](http://docs.python.org/2/library/re.html.)に従います。　　　　　　　　　　　　　　　　　　　　　　　　 |
| replace | 正規表現にマッチした箇所をこの文字列に置換します。指定しない場合はマッチした箇所を削除します。|
| backup |yesの時は置換前にファイルをバックアップします。　　　　　　　　　　　　　　　　　　　　　　　|

``` 
$ cat hosts
[server]
192.168.0.135
```

## 実行
```
$ ansible-playbook replace.yml -i hosts 

PLAY [server] ***************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [192.168.0.135]

TASK: [replace /tmp/test.conf] ************************************************ 
changed: [192.168.0.135]

PLAY RECAP ******************************************************************** 
192.168.0.135              : ok=2    changed=1    unreachable=0    failed=0   


```

## 実行結果
```/tmp/test.conf
foo
BAR=9999
baz
BAR=9999
BAR=9999
BAR=9999
foo
```

## 結論
複数行が置換できたことを確認できました！
おやすみなさいzzzz
テストの種類と技法

テストに触れる機会があり，どんなテストがあるのか調べた際のメモ

#テストの種類

##単体テスト
　**単体テスト**とは，クラスや関数といった単位のプログラムのテストになります，
主に設計通りにこれらが動くかをテストし，論理構造が適切かを確認します．

* 機能確認テスト
    * 1つのモジュールが設計書や仕様書通りに動作することを確認するテスト
* 制御フローテスト
    * プログラムの論理構造に沿って，「命令」や「分岐」などが実行されるかを確認するテスト
* データフローテスト
    * データや変数が「定義」「使用」「消滅」の順に行われているかを確認するテスト

##結合テスト
　**結合テスト**とは，単体テストで検証したプログラムを組みわせて行うテストになります．

* 状態遷移テスト
    * 状態遷移図や状態遷移表に基づいて動作を確認するテスト

##機能テスト
　**機能テスト**とは，結合したプログラムを1つの機能として行うテストです．

* 機能確認テスト

##システムテスト
　**システムテスト**は，個々のプログラムや機能を結合したプログラムが仕様通りに動くかを検証するためのテストです，

* 確認テスト
    * 回帰テスト
        * 修正・変更した後に，変更箇所が正しく動くかを確認するテスト
    * デグレードチェックテスト
        * 修正・変更を行った後に，新たな不具合が生まれていないかを確認するテスト
    * etc.

* 評価テスト
    * セキュリティテスト
        * 悪意のある外部からの攻撃への対応や脆弱性が存在しないかを確認するためのテスト
    * ユーザビリティテスト
        * 操作性，学習性，理解性，見やすさといったユーザーに対しての使いやすさを確認するテスト
    * 障害許容性テスト
        * 障害が発生した場合に指定された機能が維持されていることを確認するテスト

* 負荷テスト
    * 性能テスト
        * 処理能力が仕様を満たしているか確認するテスト
    * ロングランテスト
        * 長時間の連続稼働によって処理能力や稼働率に問題が生じないかを確認するテスト
    * 負荷テスト
        * 極端に高い負荷をかけた状況下での動作を確認するテスト 
    * etc.
    
##ユーザによるテスト

* 受け入れテスト
    * 対象のシステムがユーザーの要求を満たしているのかを確認するテスト
* 運用テスト
    * 実際の操作環境下でシステムが正しく動くかを確認するテスト
* アルファテスト
    * 開発者以外の人が操作して，不具合がないことを確認するテスト
* ベータテスト
    * 発売・リリース前の製品を開発者以外の一般ユーザーが操作して，不具合がないことを確認するテスト

#テスト技法
##ホワイトボックステスト
ホワイトボックステストとは，システムの中身を理解した上でそれらを意識しながら行うテストを指します．
ホワイトボックステストは，主に**単体テスト**で用いられ以下のテストが分類されます．

* ***制御フローテスト***
* ***データフローテスト***

ホワイトボックステストを行うにあたって，論理構造(処理の流れや実行順序)を視覚化する必要があります．
その方法の1つとして，**フローチャート**が挙げられます．

###カバレッジ基準
カバレジ基準とは，着目する要素のことを指し，それらをどれだけ網羅できているかを割合で示します．

1. ステートメントカバレッジ
    2. フローチャート内から要素として，「命令文」を選択した場合
2. デシジョンカバレッジ
    3. フローチャート内から要素として，「分岐した経路」を選択した場合
3. 複合条件カバレッジ
    4. 条件に含まれる全てのパターンを満たす場合

これら全てのカバレッジは選択した経路を，最低一度は通らなくてはなりません．
これらのカバレッジ基準は，下に行くほどテスト回数が多くなります．
また，上位のカバレッジは下位のカバレッジ基準を含んでいるため，上位のカバレッジ基準を満たすと，
必然的に下位カバレッジ基準を満たすことになります．

##ブラックボックステスト
ホワイトボックステストを用いた単体テストが終わると，システムの内部構造を意識しないテストを指します．
主に，**機能テスト**と**システムテスト**に分類されます．

ブラックボックステストでは，以下のような順序をたどりテストを行います．

1. テストの目的を考える
2. 機能を洗い出す
3. テスト観点を抽出する(例：フォームからポストされる値の確認)
5. テスト観点の機能へ割り当てる
    6. 正常系
    7. 異常系
    8. 組み合わせ系
    9. etc.
10. テスト技法を決定する
Android L をインストールしてみる！...そして元に戻す

6/26 に Google より公開された次期 Android バージョン Android L の Preview版
これは、早く触ってみたい！お仕事で開発しているアプリの動作確認をしておかなければ！...と考えつつも、会社の開発/評価で現役で使っている端末にインストールする訳にもいかず、もんもんとして１ヶ月... ようやく気付いた。
Android L インストールしてやりたいことやったら、元に戻せばいいんじゃね!?
ということで、やってみた。
# 本題に入る前に
これをやると、
　1. 端末の保証がきかなくなる
　2. 端末が初期化される
という特典があるので、ご注意ください
# Android L をインストール
### 1. 端末を用意する
　Android L の Preview版イメージが公開されている端末は以下の2つ
　　* Nexus5
　　* Nexus7(2013)
　今回は、Nexus5 でやりました
### 2. Android L のイメージをダウンロードする
　~~http://developer.android.com/preview/setup-sdk.html~~↓に変更になりました。
　http://developer.android.com/preview/index.html
　ここから、インストールする端末に対応したイメージをダウンロード、解凍しておきます
### 3. ブートローダーのアンロック
　1. ブートローダー画面を起動します
　　ブートローダーの起動方法は端末で起動する方法と、adbコマンドから起動する方法があります
　　* 端末から起動
　　　1. 端末をシャットダウンする
　　　2. 電源ボタンとボリュームのマイナスを同時に長押ししてたんまつをきどうする
　　* adb コマンドから起動
　　　`adb reboot bootloader`
　2. アンロックコマンドを実行します
　　　`fastboot oem unlock`
　3. 端末でアンロックの確認が出るので Yes を選択します
　　　データ消去が始まるのでしばらく待ちます
　　　完了したら端末を再起動します
### 4. Android L のイメージをインストールします
　1. ブートローダー画面を起動します
　2. コンソールでダウンロード、解凍しておいたイメージのディレクトリに移動します
　3. flash-all.sh を実行します
　　　`sh flash-all.sh`
　4. しばらく待ったら、完了です
　5. Android L がインストールできました！やりたいことをやりましょう！
# 元に戻す
といっても手順は Android L のインストール手順と同じなので細かい説明は無しで
https://developers.google.com/android/nexus/images
ここから元の OS をダウンロードしてきて上記の手順をおこないましょう

さて、実際にやってみて悩んだことがひとつ… 最初に入ってた OS のバージョンを記録し忘れてました
しかし、とりあえず 4.2 をインストールして端末で OS アップデートをかけてみたら 4.4 に無事アップデートできました
手動で OS を入れても、正規の手順でバージョンアップできるところまで復帰できるみたいですね
よかったよかった
timeコマンドでプログラムの実行時間を知る


作ったスクリプトやプログラムの実行時間を知りたいときに使えるのが`time`コマンドです。timeコマンドの見方と、使い方についてメモを残しておきます。

実行例としてperlとc言語で1から1000000000の総和を計算してみました。

#0. 環境

|システム|バージョン|
|:-----:|:-------|
|Mac OS X|10.9.4|
|perl|v5.16.2|
|clang|clang-503.0.40|

#1. timeコマンドとは
`time`コマンドはコマンド・プログラムを引数としてとり、引数として指定したコマンド・プログラムが実行されるのにどれだけ時間がかかった出力するコマンドです。

具体的に`sleep 10`で試してみましょう。

```bash:
$ time sleep 10

real    0m10.002s
user    0m0.001s
sys     0m0.002s
```

`time`が出力する`real`, `user`, `sys`はそれぞれ次のような意味になります。

|項目|意味|
|:-:|:-:|
|real|プログラムの呼び出しから終了までにかかった実時間（秒）|
|user|プログラム自体の処理時間（秒）（ユーザCPU時間）|
|sys|プログラムを処理するために、OSが処理をした時間（秒）（システム時間）|

なので`sleep 10` はプログラム呼び出しから終了までに10.002秒がかかったが、`sleep 10` 自体の処理には全然CPUが使われていないことがわかります。

（※ここで注意ですが、ネットワークI/Oの待ち時間やディスクI/Oの待ち時間は`real`には反映されますが、`sys`には反映されません。）

#2. 総和プログラムで実行時間の比較

ここでは実例として`perl`と`C言語(clang)`で、1から1000000000まで総和を求めて出力するプログラムの実行時間をそれぞれ求めます。

##2.1 perl

**試したコード**

```perl:cnt.pl
#!/usr/bin/perl
use strict;
use warnings;

my $sum;

foreach my $num (1..1000000000)  
{
    $sum += $num;
}

print $sum;
```

```profile:実行結果
$ time ./cnt.pl 
500000000500000000
real    0m59.037s
user    0m58.997s
sys     0m0.029s
```

約1分ほどかかっています。

##2.2 clang

**試したコード**

```cpp:cnt.c
#include <stdio.h>

int main(void){
    long long int sum = 0;
    long int i;

    for(i=1;i<=1000000000;i++){
       sum +=i;
    }
    printf("%lld", sum);

    return 0;

}

```
```profile:
$ clang cnt.c -o cnt.out
```

```profile:実行結果
$ time ./cnt.out 
500000000500000000
real    0m2.567s
user    0m2.559s
sys     0m0.006s
```
約2.6秒で計算が完了しています。
Rails4.1 with zeusでrspec3使おうとしたらいろいろハマった


Rails4.0.xとrspec2ではいろいろやってましたが久しぶりに新しいアプリ作ってテスト書こうとしたらいろいろハマったのでメモしておきます。

--- 

### 使おうとしてるgem（ツール）

* zeus
* rails(4.1.4)
* rspec-rails(3.0.2)
* capybara(2.4.1) 
* database_rewinder(0.2.0)
* factory_girl_rails(4.4.0)  

  
  
## rspec:install
まず、下記コマンドでrspecに必要なものをgenerateします。

```console
$ bundle exec rails g rspec:install

.rspec
spec/spec_helper.rb
spec/rails_helper.rb

```

rspec-railsの3系からrails_helper.rbというのが作られるようになりました。  
spec/rails_helper.rbにRails特有の設定を書き、spec/spec_helper.rbにRSpecの全体的な設定を書くようにするのが良いようです。

これまで*_spec.rbの先頭に

```
require 'sepc_helper'
```
と書いていたかと思いますが、3系からはそこを

```
require 'rails_helper'
```
に書き換える必要があります。

ちなみにこの時作られる.rspec内のデフォルトの記述の```--warnings```というのが非常に邪魔なログを吐きまくるので消しておくことをオススメします。


  
## rails_helper.rbとspec_helper.rb

さて、ここからがいろいろダルかったのですが、、
だらだら書くと読む気失くなると思うので最終的なrails_helper.rbとspec_helper.rbを載せておきます。

```spec/spec_helper.rb

require 'factory_girl_rails'
require 'database_rewinder'
require 'rspec/rails'

RSpec.configure do |config|
  config.order = 'random'

  config.before(:suite) do
    FactoryGirl.reload
    DatabaseRewinder.clean_all
  end

  config.before(:each) do
    DatabaseRewinder.start
  end

  config.after do
    DatabaseRewinder.clean
  end

  config.include FactoryGirl::Syntax::Methods
end

```


```spec/rails_helper.rb

ENV["RAILS_ENV"] ||= 'test'
require 'spec_helper'
require File.expand_path("../../config/environment", __FILE__)

#require 'rspec/rails'

Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }

ActiveRecord::Migration.maintain_test_schema!

RSpec.configure do |config|
  config.fixture_path = "#{::Rails.root}/spec/fixtures"

  config.use_transactional_fixtures = true

  config.infer_spec_type_from_file_location!
end

```
　

これ、```require 'rspec/rails'```をspec_helper.rbかrails_helper.rbのどちらに書くかで、zeusではしらす時の挙動が変わるというのが超ダルいポイント。。

```console
$ zeus test spec

このコマンドでテストを走らせたいときは
spec/spec_helper.rbにrequire 'rspec/rails'を書く。
```

```console
$ bundle exec rspec

このコマンドでテストを走らせたいときは
spec/rails_helper.rbにrequire 'rspec/rails'を書く。
```

という。。辛たん。
zeusを使ってるかどうかで条件分岐させられるかもですが、調べられてません。
一旦私は普段はzeus頼みでやってるのでこんなかんじで。


## その他ハマったところ。。。

上記の通り書けばいけると思いますが、ハマったポイントを。
どちらでrequireすべきかというところでハマりました。


```
undefined method `configure' for RSpec:Module (NoMethodError)
```

```
spec_helper.rb:21:in `block in <top (required)>': uninitialized constant FactoryGirl (NameError)
```

こういうのはすべてrequireできていないことによるエラーです。
factory_girlやdatabase_reqinderなどをspec_helper.rb内でrequireしているかもう一度確かめてみてください。
受信側の人が電話に応答したら、メッセージや音声ファイルを再生してから通話を開始する。

例えば、こんなことができる。
電話の発信先に電話をかけ、〇〇からの電話です。受ける場合は "1"を、受けたくない場合は "2"を押してください。みたいな処理などに使えます。

【やろうとしていること】
ユーザーA（発信側）が ユーザーB（受信側）に電話をかけます。
この際に、ユーザーB（受信側）にメッセージや音声ファイルの再生はもちろん、
録音させるなど、Twilioで提供している機能を実装することが可能です。
ただ、<Dial>動詞（電話の発信）はネストできません。
 
詳細はこちら！
[TwiML 音声通話(Number)](https://jp.twilio.com/docs/api/twiml/number#attributes-url)
 
【作り方】
① 下の二つのファイルを用意し、お使いのウェブサーバーにアップします。
② Twilioの電話番号のRequest URLに「twilio-dial-number-url.xml」のURLを
　設定します。
③ 「②」で使われたTwilioの電話番号に電話をかけたら！
④ 相手に電話が転送され、相手が電話に出たら「message.xml」に記述されている
　処理が行われ、処理終了後、通話が成立されます。
相手：「twilio-dial-number-url.xml」の5行目に設定されている電話番号（受信先）

【実行方法】
① Twilioの電話番号のRequest URLに「twilio-dial-number-url.xml」を設定。
② 下の二つのファイルを同じ場所に格納（変えたい場合は、4行目の urlを変更）
③ 利用するTwilio電話番号に電話をかけて確かめる！

```xml:twilio-dial-number-url.xml
<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Dial callerId="+8150xxxxyyyy">
        <Number url="message.xml">
            +8180xxxxyyyy
        </Number>
    </Dial>
</Response>
```

```xml:message.xml
<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Say language="ja-jp">〇〇からの電話です。</Say>
</Response>
```

とにかく簡単！是非試してみてください！
Symfony2のTwigでinstanceofを使えるようにする


Twigテンプレート内で`instanceof`を使って分岐する必要があったので、
Twig拡張機能を利用して`instanceof`演算子を作成しました。

## 作る
### 演算子のパーサーを作成
```php:TwigNodeExpressionBinaryInstanceof.php
<?php

namespace MyApp\SomeBundle\Twig\Node\Expression\Binary;

class TwigNodeExpressionBinaryInstanceof extends \Twig_Node_Expression_Binary
{
    /**
     * {@inheritdoc}
     */
    public function compile(\Twig_Compiler $compiler)
    {
        $id = uniqid();

        // 「$some instanceof 'クラス名'」が不可能なので
        // 「(($class = 'クラス名') && ($some instanceof $class))」にする
        $compiler
            ->raw("((\$_{$id} = ")
            ->subcompile($this->getNode('right'))
            ->raw(') && (')
            ->subcompile($this->getNode('left'))
            ->raw(" instanceof \$_{$id}))")
        ;
    }

    /**
     * {@inheritdoc}
     */
    public function operator(\Twig_Compiler $compiler)
    {
        $compiler->raw('');
    }
}
```

### Twig拡張を作成＆演算子を定義
```php:MyTwigExtension.php
<?php

namespace MyApp\SomeBundle\Twig\Extension;

class MyTwigExtension extends \Twig_Extension
{
    /**
     * {@inheritdoc}
     */
    public function getOperators()
    {
        return [
            [/* 単項演算子を定義 */],
            [/* 二項演算子を定義 */
                'instanceof' => [
                    'precedence' => 100,
                    'class' => 'MyApp\SomeBundle\Twig\Node\Expression\Binary\TwigNodeExpressionBinaryInstanceof',
                    'associativity' => \Twig_ExpressionParser::OPERATOR_LEFT
                ],
            ],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'my_twig_extension';
    }
}
```

### Twig拡張をサービスに登録
```yaml:services.yml
services:
    my_app_some.twig.extension:
        class: MyApp\SomeBundle\Twig\MyTwigExtension
        tags:
            - { name: twig.extension }
```

## 使う
Twigテンプレート内の条件式に`instanceof`が使用できます。

```twig:some_template.html.twig
{% if some_variable instanceof 'MyApp\\SomeBundle\\Entity\\SomeEntityClass' %}
    型一致
{% endif %}
```

キャッシュを確認すると下記のように変換されていることがわかります。

```php:11f5066ea180e1890490269413e0673a7e6b69697f9fd625e0b13a7f729b.php
if ((($_53d8f5ab4ca6d = "MyApp\\SomeBundle\\Entity\\SomeEntityClass") && ((isset($context["some_variable"]) ? $context["some_variable"] : $this->getContext($context, "some_variable")) instanceof $_53d8f5ab4ca6d))) {
    echo "型一致";
}
```
Pidgin | Pidgin のインストール (Windows7環境)

# Pidgin | Pidgin のインストール (Windows7環境)

## 概要
Free の chat client 、Pidgin のインストール (Windows7環境)

## 手順
* 公式サイトのダウンロードぺージへ

https://www.pidgin.im/download/

* Windowsを選択して、Download Nowを選択

* Download した exe (pidgin-2.10.9.exe) を実行し、ウィザードに沿ってインストールします

* Pidginを起動すると、アカウントの追加メニューが開くことを確認してインストール完了です

![pidgin_install.png](https://qiita-image-store.s3.amazonaws.com/0/43480/c7a6f0fe-e384-5fea-96f8-e8a920b1bc43.png)

## 参照
* 公式サイト

https://pidgin.im/
RuboCop | Style/SpaceInsideHashLiteralBraces

# RuboCop | Style/SpaceInsideHashLiteralBraces

## 概要

RuboCopの「Style/SpaceInsideHashLiteralBraces」警告について。

ハッシュリテラルに利用するブレース開始直後、ブレース終了直前、空ブレースの間に半角スペースを必要とするかどうかを
設定・チェックする。
デフォルトでは、ブレース開始直後、ブレース終了直前ともに半角スペースが必要。
空ブレースの場合は半角スペースが不要。

## SpaceInsideHashLiteralBraces

### 設定値一覧

|設定対象|対象|内容|デフォルト|
|:-----|:--|:---|:---:|
|EnforcedStyle|space|半角スペースが必要|○|
|EnforcedStyle|no_space|半角スペースが不要|--|
|EnforcedStyleForEmptyBraces|space|空ブレースに半角スペースが必要|--|
|EnforcedStyleForEmptyBraces|no_space|空ブレースに半角スペースが不要|○|

### 検証プログラム

~~~ruby:space_inside_hash_literal_braces.rb
h = { key: :value }
print h
h = {key: :value }
print h
h = { key: :value }
print h
h = {key: :value}
print h
h = {}
print h
h = { }
print h
~~~

### 実行結果 デフォルト の場合

~~~yaml:.rubocop.yml
SpaceInsideHashLiteralBraces:
  EnforcedStyle: space
  EnforcedStyleForEmptyBraces: no_space
~~~

~~~bash
$ rubocop space_inside_hash_literal_braces.rb
Inspecting 1 file
C

Offenses:

space_inside_hash_literal_braces.rb:3:5: C: Space inside { missing.
h = {key: :value }
    ^
space_inside_hash_literal_braces.rb:7:5: C: Space inside { missing.
h = {key: :value}
    ^
space_inside_hash_literal_braces.rb:7:17: C: Space inside } missing.
h = {key: :value}
                ^
space_inside_hash_literal_braces.rb:11:6: C: Space inside empty hash literal braces detected.
h = { }
     ^

1 file inspected, 4 offenses detected
~~~

### 実行結果 EnforcedStyle を no_space, EnforcedStyleForEmptyBraces を space に設定した場合

~~~yaml:.rubocop.yml
SpaceInsideHashLiteralBraces:
  EnforcedStyle: no_space
  EnforcedStyleForEmptyBraces: space
~~~

~~~bash
$ rubocop space_inside_hash_literal_braces.rb
Inspecting 1 file
C

Offenses:

space_inside_hash_literal_braces.rb:1:6: C: Space inside { detected.
h = { key: :value }
     ^
space_inside_hash_literal_braces.rb:1:18: C: Space inside } detected.
h = { key: :value }
                 ^
space_inside_hash_literal_braces.rb:3:17: C: Space inside } detected.
h = {key: :value }
                ^
space_inside_hash_literal_braces.rb:5:6: C: Space inside { detected.
h = { key: :value }
     ^
space_inside_hash_literal_braces.rb:5:18: C: Space inside } detected.
h = { key: :value }
                 ^
space_inside_hash_literal_braces.rb:9:5: C: Space inside empty hash literal braces missing.
h = {}
    ^

1 file inspected, 6 offenses detected
~~~

## 対象コード

https://github.com/bbatsov/rubocop/blob/master/lib/rubocop/cop/style/space_inside_hash_literal_braces.rb
https://github.com/bbatsov/rubocop/blob/master/spec/rubocop/cop/style/space_inside_hash_literal_braces_spec.rb

## 補足

この警告は rubocop -a で修正可能です。

## RuboCopまとめ記事

http://qiita.com/tbpgr/items/edbfecb6a6789dd54f47
[POH3]天才火消しエンジニア霧島 京子

3回目のPOHが開催されてるみたいですね。
https://paiza.jp/poh/kirishima

さすがにこんな無茶な案件に関わったことはありませんが、妙にリアルなところもあって微妙な気分です。

解き方としては01ナップザック的なことになるんだと思うんですが、
たぶんもっと工夫する出来るところがあるんだろうなと思います。

rubyで挑戦してみました。

```rb:poh3.rb
m = gets.chomp.to_i
n = gets.chomp.to_i

dp = Array.new(m + 1,Float::INFINITY)
dp[0] = 0

n.times do
  num, cost = gets.chomp.split(/ /).map(&:to_i)
  
  ndp = Array.new(m + 1, Float::INFINITY)
  ndp[0] = 0
  
  (1 .. m).each do |j|
    prev = j - num
    prev = 0 if prev < 0
    
    non_use = dp[j]
    use = dp[prev] + cost
    if non_use < use
      ndp[j] = non_use
    else
      ndp[j] = use
    end
  end
  dp = ndp
end

puts dp[m]
```

運良く一発で通れました。
Array#minとか使うとすっきりするんですが、やっぱり遅くなるようでした。
が、やっぱり何倍も早い方いますねー。

結果
http://paiza.jp/poh/kirishima/result/09b509fc2be960b0927fcd0101e66d7e

追記1
Float::Infinityより、問題文からの最大値
`INF = 500 * 5000000 + 1`
を代わりに使うとなぜかもうちょっと早くなりました。

http://paiza.jp/poh/kirishima/result/18f79ca13278e82fbc6f0dd556ca0925

追記2　8/3

```rb
INF = 500 * 5000000 + 1
m, n = 2.times.map{gets.chomp.to_i}

dp = [0] + Array.new(m, INF)
n.times do
  num, cost = gets.chomp.split(/ /).map(&:to_i)
  m.downto(1) do |j|
    prev = j - num
    prev = 0 if prev < 0

    use = dp[prev] + cost
    dp[j] = use if use < dp[j]
  end
end

puts dp[m]
```

ちょっと改良してみましたが、どうにも一秒は切れないですねぇ。0.02秒のとかはどうしてるんだろう。
http://paiza.jp/poh/kirishima/result/5ba40ffef2d0c33a666fd0f98e48eaa5
symbolicatecrashが.appや.dSYMを探す仕組み

##symbolicateとは
MacやiOSのクラッシュログは取得した状態ではアプリ固有のシンボル名は記載されません。
そこで、クラッシュログを読みやすくするためにアプリ固有のシンボル名をクラッシュログに付加する必要があるのですが、この処理のことをsymbolicateと呼びます。

##symbolicatecrash
symbolicatecrashというXcodeに付いているスクリプト(perlで書かれています)を使ってsymbolicateすることができます。symbolicateには以下の３つのファイルが必要になります。
・クラッシュログそのものである.crashファイル
・アプリの本体(.app)
・シンボル情報(.dSYM)

symbolicatecrashスクリプトの第一引数はクラッシュログのパスです。しかし、それ以外の引数はオプションです。.appと.app.dSYMは必要であるにもかかわらず、引数に指定する必要がありません。
ではどうやって必要な.appとdSYMを探しているのでしょうか。

##.appと.dSYM
symbolicatecrashスクリプトは.appと.app.dSYMの検索にSpotlightの機能を使用しています。Spotlightのコマンドラインツールであるmdfindとmdlsを使って必要なファイルを探します。
検索の手がかりとするのはXcodeが付加しているメタ情報とクラッシュログに記述されたアプリイメージのIDです。.app.dSYMにはcom_apple_xcode_dsym_uuidsとcom_apple_xcode_dsym_pathsというメタ情報が付加されています。com_apple_xcode_dsym_uuidsにはシンボルを格納している対象のアプリイメージのIDが書き込まれており、mdfindを使うことでクラッシュログの対象となるシンボルを格納した.dSYMを探し出します。
そしてmdlsを使い、.dSYMからcom_apple_xcode_dsym_pathsに含まれるアプリ名を抽出します。抽出したアプリ名を使いmdfindで対象候補のファイルを抽出し、さらに候補ファイルのcom_apple_xcode_dsym_uuidsメタ情報とマッチングすることで正しいアプリイメージを見つけ出します。

##トラブルシューティング
symbolicatecrashはSpotlightの機能とメタ情報をフルに活かして素早く簡潔に正しい.appと.dSYMを探し出しています。しかし、Spotlightに依存しているため対象のファイルがSpotlightのインデックスに載っていない場合やメタ情報が失われてしまった場合などには正しく動作しなくなってしまうという問題があります。
symbolicatecrashがうまく動作しない場合、対象のファイルをmdfindとmdlsを使って検索できることやメタ情報が存在することを確認することで問題が見つかるかもしれません。
Spotlightによる検索が原因でsymbolicatecrashが動作しない場合、mdimportでインデックスを作成するかxattrによるメタ情報の手動での付与で問題が解決する可能性があります。
destructuring-bindとletの速度比較

# はじめに
`destructuring-bind`と`let`で速度比較をしました。


# ソースコード
```
(defmacro with-bench ((&optional (num-repeat 10000000))
                      &body body)
  `(time (loop repeat ,num-repeat do (progn ,@body))))


(defun dbind-test ()
  (let ((list (list 1 2 3)))
    (with-bench ()
      (destructuring-bind (x y z) list
        (+ x y z)))))

(defun let-test ()
  (let ((list (list 1 2 3)))
    (with-bench ()
      (let ((x (first list))
            (y (second list))
            (z (third list)))
        (+ x y z)))))

```
# 結果
- `dbind-test`: 約3.9秒
- `let-test`: 約0.12秒

```
CL-USER> (dbind-test)
Evaluation took:
  3.899 seconds of real time
  3.863381 seconds of total run time (3.829654 user, 0.033727 system)
  99.08% CPU
  9,716,958,684 processor cycles
  4,016 bytes consed

NIL
CL-USER> (dbind-test)
Evaluation took:
  3.914 seconds of real time
  3.878260 seconds of total run time (3.841974 user, 0.036286 system)
  99.08% CPU
  9,751,604,518 processor cycles
  33,072 bytes consed

NIL
CL-USER> (dbind-test)
Evaluation took:
  3.864 seconds of real time
  3.827455 seconds of total run time (3.792557 user, 0.034898 system)
  99.04% CPU
  9,629,652,079 processor cycles
  32,768 bytes consed

NIL
CL-USER> (let-test)
Evaluation took:
  0.125 seconds of real time
  0.108741 seconds of total run time (0.107721 user, 0.001020 system)
  87.20% CPU
  311,094,075 processor cycles
  0 bytes consed

NIL
CL-USER> (let-test)
Evaluation took:
  0.122 seconds of real time
  0.105200 seconds of total run time (0.103102 user, 0.002098 system)
  86.07% CPU
  304,988,627 processor cycles
  0 bytes consed

NIL
CL-USER> (let-test)
Evaluation took:
  0.118 seconds of real time
  0.100798 seconds of total run time (0.100035 user, 0.000763 system)
  85.59% CPU
  293,909,444 processor cycles
  0 bytes consed

NIL
```
gitでプロキシを設定

自分のためのメモ。

### 設定方法
下記コマンドをたたく

```sh:
$git config --global http.proxy http://proxy.example.com:8080
$git config --global https.proxy http://proxy.example.com:8080
```

これにより ~/.gitconfigに下記が追加される。

```txt:.gitconfig
[http]
        proxy = http://proxy.example.com:8080
[https]
        proxy = http://proxy.example.com:8080
[url "https://"]
        insteadOf = git://
```
Template Method パターン


## 概要
デザインパターンのTemplateMethodパターンの練習用の実装とそれに関することをまとめてみました。

## サンプルプログラム
大きな枠組みやロジックを決めるスーパークラスとしてAbstractFilterクラスを定義。サブクラスにOddNumFilter, EvenNumFilterを定義。全体の流れとしては数字の配列を篩いわけて特定の数字の配列（今回は奇数配列、偶数配列）を出力する。

```Java:AbstractFilter.java
import java.util.List;

public abstract class AbstractFilter {
    public abstract List<Integer> filter(int[] numbers);
    public void print(int[] numbers) {
        List<Integer> filterNums = filter(numbers);
        for (Integer num : filterNums) {
            System.out.print(num + " ");
        }
        System.out.println();
    }
}
```

```Java:OddNumFilter.java
import java.util.LinkedList;
import java.util.List;

public class OddNumFilter extends AbstractFilter {
    @Override
    public List<Integer> filter(int[] numbers) {
        List<Integer> result = new LinkedList<Integer>();
        for (int num : numbers) {
            if (num % 2 != 0) {
                result.add((Integer) num);
            }
        }
        return result;
    }
}
```

```Java:EvenNumFilter.java
import java.util.LinkedList;
import java.util.List;

public class EvenNumFilter extends AbstractFilter {
    @Override
    public List<Integer> filter(int[] numbers) {
        List<Integer> result = new LinkedList<Integer>();
        for (int num : numbers) {
            if (num % 2 == 0) {
                result.add(num);
            }
        }
        return result;
    }
}
```

これでおそらくTemplateMethodパターンに乗っ取ったクラス設計になっていると思う。このクラスを使ってメインクラスで実行してみます。

```Java:Main.java
public class Main {
    public static void main(String args[]) {
        int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

        AbstractFilter odd = new OddNumFilter();
        AbstractFilter even = new EvenNumFilter();

        System.out.println("---- 奇数表示 ----");
        odd.print(numbers);

        System.out.println("---- 偶数表示 ----");
        even.print(numbers);
    }
}
```

```Java:Result
---- 奇数表示 ----
1 3 5 7 9 
---- 偶数表示 ----
2 4 6 8 10 
```

うまく数字の配列をフィルターの性質ごとに篩いにかけることが出来ました。

## まとめ
- スーパークラスで大きな枠組みやロジックを決めて、サブクラスで具体的な処理を書くようなデザインパターン。
- ロジック自体はスーパークラスが共通で担っているので、修正が必要な時も修正範囲が少なくすむと考えられる。
- スーパークラスにどこまでの処理を担わせるかは設計する人による。
- JavaのInputStreamクラスはTemplate Methodパターンに乗っ取って設計されている。
Windows 8.1 でHiDPIなIntelliJ IDEA 13.1を使う

IntelliJ IDEA 13.1 は[WindowsやLinuxでも高DPIなディスプレイをサポートしている](http://confluence.jetbrains.com/display/IDEADEV/IDEA+13.1+EAP)らしい。

ということでやってみた。

# 設定追記

"IntelliJをインストールしたディレクトリ\bin"の設定ファイル

* idea64.exe.vmoptions（64ビット版のみ存在？）
* idea.exe.vmoptions

に'-Dis.hidpi=true'という行を加える。

**（追記）**
このオプションの有無で見た目が変わらないことに気づいた……。
海外でも、このオプションが効かないとコメントしている人が何人かいるが、解決策は見当たらなかった。

# ディスプレイのスケーリングによるぼやけを修正

これだけだとぼやけた感じになるので、IntelliJだけスケーリングを無効にする。

1. IntelliJの起動アイコンを右クリック
2. 「プロパティ」をクリック
3. 「互換性」タブをクリック
4. 「高DPI設定では画面のスケーリングを無効にする」をチェック

![ideadpi.PNG](https://qiita-image-store.s3.amazonaws.com/0/50442/2e569afb-7120-28e7-9399-62d082e9c047.png)

# エディタの文字の小ささを直す

IntelliJのエディタの文字が小さすぎるときは次のように直す。

1. メニューのFile→Settings
2. Fontで検索
3. Editor → Colors & Fonts → Fontを開く
4. フォントを見やすい大きさにする
（フォントがの設定ができない場合、Scheme nameのSave Asをクリックして適当な名前で保存するとできるようになる。）

![intellijFont.PNG](https://qiita-image-store.s3.amazonaws.com/0/50442/ed9b9e0f-783f-22ba-f2b8-9b0421f6c0c4.png)

# 結論
オプション'-Dis.hidpi=true'は効かないようだ。
上記のようにするとこまごまとしたアイコン類は小さいままだが、大体のメニューは綺麗に大きく見えるようになる。
NGUIで手軽に円形のゲージ（プログレスバー）を表示する


円形の画像を作成してNGUIのスプライトとして画面に配置

![kobito.1406726611.640327.png](https://qiita-image-store.s3.amazonaws.com/0/8219/5f88190e-332a-08a1-f18c-5f65371014e6.png "kobito.1406726611.640327.png")

スプライトのプロパティを以下のように変更

![kobito.1406726642.769400.png](https://qiita-image-store.s3.amazonaws.com/0/8219/174cdd0d-b9a8-7871-c55b-553217eeaff5.png "kobito.1406726642.769400.png")

* Type を Filled に
* Fill Dir を Radial360 に

これだけ、
インジケーターとして使用するには FillAmount をスクリプトから変更したらおｋ

たとえば、0.3 という値に設定すれば、以下のように 30% の部分まで描画される。

![kobito.1406726807.089845.png](https://qiita-image-store.s3.amazonaws.com/0/8219/28947a17-1771-f13c-cab6-61fc2cd37b0d.png "kobito.1406726807.089845.png")
[Objective-C] NSCodingについてメモ


NSCoding、今さらながら色々問題に当たったので情報整理のためにメモ。

例によって、[今回のサンプルをGitHub](https://github.com/edom18/NSCodingTest)に上げました。

## シリアライズ（アーカイブ）するならNSCodingプロトコルの実装は必須

自作のクラスをシリアライズ（アーカイブ）してファイルに保存するには、`NSCoding`プロトコルで定義されている、以下のふたつのメソッドを実装する必要があります。

```objc
@protocol NSCoding

- (void)encodeWithCoder:(NSCoder *)aCoder;
- (id)initWithCoder:(NSCoder *)aDecoder;

@end
```

`encodeWithCoder:aCoder`メソッドは、シリアライズするタイミングで呼ばれます。
`initWithCoder:aDecoder`メソッドは逆に、デシリアライズするタイミングで呼ばれます。対の関係です。

これらのメソッドの実装は必須です。
実装されていない場合、不正な呼び出しでアプリがクラッシュします。


## 実装する

### encode

実装自体はシンプルです。
シリアライズされる際に、シリアライズに必要な要素を、引数で渡された`NSCoder`オブジェクトの`encode****:forKey:`を呼び出します。

`encode****`の部分には、encodeしたい要素に適切な型を指定します。（e.g. `encodeObject`, `encodeInteger`）

`forKey`によってキーを指定してシリアライズ／デシリアライズすることができます。


#### サンプルコード

```objc
- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeInteger:self.age forKey:@"age"];
}
```


### decode

デシリアライズは逆の処理になります。
取り出す際は、自作クラスのプロパティに、decodeされた情報を保持することで復元が完了します。


#### サンプルコード

```objc
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    if (self) {
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.age  = [aDecoder decodeIntegerForKey:@"age"];
    }
    return self;
}
```

これらの情報は、必要なだけシリアライズ／デシリアライズする必要があります。
（逆に必要ないものを省略すると復元されなくなります）


## データを保存する

データをシリアライズしたら、あとはそれをファイルに保存します。
最終的なサンプルコードは以下の通りです。
*（サンプルは保存してすぐ読み込むだけの意味のないサンプルです）*

```objc

#import "NCTViewController.h"

#import "NCTSample.h"

static NSString *kFileName = @"/hoge.dat";

@implementation NCTViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    [self saveData];
    [self loadData];
}

- (void)loadData
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *directory = paths[0];
    NSString *filePath = [directory stringByAppendingString:kFileName];
    
    NSMutableData *data = [NSMutableData dataWithContentsOfFile:filePath];
    NSKeyedUnarchiver *decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
    NSArray *dataArray = [decoder decodeObjectForKey:@"array"];
    [decoder finishDecoding];
    
    NSLog(@"Data array: %@", dataArray);
}

- (void)saveData
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *directory = paths[0];
    NSString *filePath  = [directory stringByAppendingString:kFileName];
    
    NSMutableArray *dataArray = [NSMutableArray array];
    for (int i = 0; i < 5; i++) {
        NCTSample *data = [[NCTSample alloc] init];
        data.name = [NSString stringWithFormat:@"My name is Bob%d", i];
        data.age  = i;
        [dataArray addObject:data];
    }
    
    NSMutableData *data = [NSMutableData data];
    NSKeyedArchiver *encoder = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    [encoder encodeObject:dataArray forKey:@"array"];
    [encoder finishEncoding];
    
    [data writeToFile:filePath atomically:YES];
}

@end

```
実行時にシェーダを差し替える


通常は、Sprite/Diffuse を使うけど、特定の場面では Sprite/Default を使いたいということがあったのでシェーダを差し替えてみた。

```CSharp:
		// change shader
		var defaultShader = Shader.Find ("Sprites/Default");
		var renderers = ((GameObject)instance).GetComponentsInChildren<SpriteRenderer>();
		foreach (var r in renderers) {
			r.material.shader = defaultShader;
		}

```
Node.jsで知ったopenとstartの違い

# Macはopenコマンドがあって便利だけど
Windowsにだってstartコマンドがあります。

```
start .
```

Macの

```
open .
```

と同じように使える。便利コマンドです。

# Node.jsで違いに気づくことが出来た件

openはそのまま使えるが、startはcmd.exeかまして使う必要がある。
start直だとENOENTのエラーがもれなくついてきた。

```js
var spawn = require('child_process').spawn;
var runstantUrl = "http://phi-jp.github.io/runstant/release/alpha/";
if (process.platform == "darwin") {
  spawn("open", [runstantUrl]);
} else if (process.platform == "win32") {
  spawn("cmd", ["/C","start " +runstantUrl]);
}
```

# まとめ

ターミナルやコマンドプロンプトで使っているだけでは分からないstartとopenの違いがNode.jsでコードを書いてみたら分かりました。

# 追記

- [Node.jsで知ったopenとstartの最大違い #ステマw](http://qiita.com/kjunichi/items/265da74c590ab7d3acc4)

# 関連記事

- [node.jsでWindowsのパスにする - Qiita](http://qiita.com/kjunichi/items/f266602b625e04b1f616)
- [NAN化されたnode-ffiを試した](http://abrakatabura.hatenablog.com/entry/2014/08/27/074427)
- [それでもNode.jsをMacアプリ化するをやる](http://abrakatabura.hatenablog.com/entry/2014/08/24/063115)
- [Node.jsで簡単にGitHubの３Dビューアー用のSTLファイルを作る](http://abrakatabura.hatenablog.com/entry/2014/07/22/213941)
- [MavericksでNodObjCを試すには](http://abrakatabura.hatenablog.com/entry/2013/12/11/114418)
- [Node.jsでパイプを使う外部コマンドを実行するには](http://abrakatabura.hatenablog.com/entry/2014/03/19/074800)
- [Safariのリーディングリストをkindleに送る](http://abrakatabura.hatenablog.com/entry/2013/07/15/082637)
- [Node.jsでコマンドラインアプリを書く　JSONファイル編](http://abrakatabura.hatenablog.com/entry/2013/08/03/111446)
- [Node.js - fs.readFileSyncでエンコードの指定をしないとHogan.jsがつかえなかった件 - Qiita](http://qiita.com/kjunichi/items/fd6e7fc9765318625a75)
- [Node.jsでデバッガを使う際に必要なたった2つのこと](http://abrakatabura.hatenablog.com/entry/2013/12/07/072712)
- [node.jsで大きな数を扱う](http://abrakatabura.hatenablog.com/entry/2014/05/20/072903)
- [node.jsで顔検出してみた](http://abrakatabura.hatenablog.com/entry/2012/08/02/224715)
- [以前やったNode.jsで顔検出を改良した](http://abrakatabura.hatenablog.com/entry/2014/11/09/124922)
- [[soloved]Mavericksでnode-webclがビルドできた](http://abrakatabura.hatenablog.com/entry/2013/10/30/070001)
- [たぶんGTK2をChocolateyのgtk-runtimeで入れても64ビット環境ではダメな件 - non vorrei lavorare](http://abrakatabura.hatenablog.com/entry/2017/05/11/220650)
- [Node.js - koaでhttpsを使う - Qiita](http://qiita.com/kjunichi/items/6feb9b8c4eb1e796e91d)
- [Node.js - express4でセッションを扱うには - Qiita](http://qiita.com/kjunichi/items/3a07194d3743e1b66c08)
- [node.jsでプロキシ環境下でもGoogle URL Shortenerを簡単に利用できた](http://abrakatabura.hatenablog.com/entry/2014/08/02/062229)
- [Node.js/Express4でのシンプルなファイルのアップロード - Qiita](http://qiita.com/kjunichi/items/fe33b6a4e82ac944b487)
- [node.jsでHTTPプロキシ経由でhttpsアクセスするには](http://abrakatabura.hatenablog.com/entry/2013/06/18/111959)
- [Herokuではnode.jsで作ったHttp Proxyが動かせなかった](http://abrakatabura.hatenablog.com/entry/2012/04/21/223913)
- [iPhone4Sの疑似テザリングツールをGitHubに上げた](http://abrakatabura.hatenablog.com/entry/2012/11/07/112132)
- [node.jsでhttpsも使えるHttp proxyを書いている](http://abrakatabura.hatenablog.com/entry/2012/04/19/231210)
- [node.jsが80番ポートで動かない #windows](http://abrakatabura.hatenablog.com/entry/2012/04/16/223118)
TextToSpeech#synthesizeToFile()がandroid.permission.WRITE_EXTERNAL_STORAGEを要求するようになってた

久しぶりに用事があって、[Android API プログラミング・リファレンス](http://www.amazon.co.jp/dp/4839943230)のTextToSpeechのサンプルを使ってみたのですが、一部メソッドが失敗するようになってました。

調べてみると、いつの間にかは知りませんが、```TextToSpeech#synthesizeToFile()```が、android.permission.WRITE_EXTERNAL_STORAGE権限を要求するようになってました。

このメソッドは、読んで字のごとくですが、外部ストレージにスピーチ内容を保存するというものです。外部ストレージにファイルを保存するというものなので当然android.permission.WRITE_EXTERNAL_STORAGE権限が必要なはずなのですが、なぜか執筆当初は権限無しで動作していました。まあ、修正されたのでバグということだと思いますが。

まあ、権限は設定していて損があるものではありませんし、```TextToSpeech#synthesizeToFile()```を使うときは忘れずにandroid.permission.WRITE_EXTERNAL_STORAGE権限をAndroidManifestに設定しておきましょう。というお話しでした。
自動化しててもよく使うGitコマンド集【初心者編】

#gitとは
分散型のソースコード管理システムで、基本的にはSSH認証で利用する事が多い

#よく使うコマンド

##一応ストーリー仕立てで紹介します。
0. 「0.」の最低限知っておきたいコマンドを覚えたら、1.から7.まで見て行きましょう。
1. 「1.」ログを見て、その中から
2. 「2.」任意のコミットIDをマージしたい。だが、マージしたらコンフリクトを起こしてしまったので
3. 「3.」差分が理解できてる方を優先させたい。
4. 「4.」untracked fileができているので解消したい
5. 「5.」色々さわっていたが、ひとまずリモートの変更分を全部反映させたい。
6. 「6.」マージが壊れてしまい、よくわからないので、全部リセットしたい。
7. 「7.」リセットして、新しいブランチを作りたい。

##0. 最低限これだけは知っておきたい

```
$ git clone
$ git init
$ git add　→　git rm --cache ファイル名で消せます
$ git pull
$ git commit
$ git push
```

特に紹介はいらないと思いますが、一応
* cloneでソースをローカルにコピーするか、initでgitプロジェクトを作るかしてから
* addでファイルを索引に追加する
* pullは、リモートの変更分をローカルに取り込みます
* commitでaddしたファイルをローカルブランチにコミットをします
* pushでcommitしたものをリモートブランチにプッシュします

## 1. ログを比較しよう

```
$ git log fileA fileB
```
fileAとfileBを比較したログを出力する

##2. コミットログから、任意のものをマージしたい

```
$ git cherry-pick コミットID
```

任意のコミットをチェックアウトしている現在のブランチに入れます

##3. 衝突した、どうする？

```
# マージ元ソースを優先
$ git theirs fileA fileB ...

# マージ先ソースを優先
$ git ours fileA fileB ...
```

マージした場合、明らかな差異を把握している時になぜかコンフリクトが起きるときがあります。
具体的には、例えば改行コードとかそういう系ですね
そんな時にこのコマンド使えば余裕です。そして、複数指定できるので、1回のコマンドで完結します。

##4. untracked fileってなんだよ

```
# 消えるソース確認
$ git clean --dry-run

#消す
$ git clean -f
```

untracked fileというのが見えたら、まずはcleanで消えてしまうソースを確認します。
問題なかったら-fを指定して消しましょう
物理削除ですが、GUIで消すより全ターミナルで完結するので非常におすすめです。

##5. 一先ず自分の変更は後回しだ

```
# 変更履歴を保存する
$ git stash save "コメント"

# stashしたログが出力
$ git stash list

# 変更履歴を戻す
$ git stash pop stash@{0}
```

自分の変更を後回しにしてとにかくまずリモートを取り込みたいときは、自分の変更分を一旦退避させておいて、リモートをローカルブランチにpullしましょう



##6. もうどうしようもなくなった時

```
# ファイル単位でHEADに戻す
$ git reset HEAD fileA

#ブランチ毎HEADに戻す
$ git reset --hard HEAD
```

全部HEAD状態に戻す。
マージとかしていて、良く分からなくなった時に使います。私は1日に数10回ぐらいresetします

##7. 新しいブランチを作りたくなった

```
$ git checkout -b 名前
```

このコマンドを使って、ローカルに新しくブランチを作る事が出来ます

### 消したくなった時

```
# ローカルブランチを削除
$ git branch -d 名前

# リモートブランチを削除
$ git push origin :名前
```

単純に消すコマンドです。作ったら消したくなるときもくると思います。

#最後に
よく使うコマンドは忘れる事はないですが、ふと使ってない時にど忘れする事もあります。
gitは奥深いので意外と出来ないと思ってたことができたりします。
ぜひあなたもgitマスターへ

##コマンドのインデックス
→http://git-scm.com/book/commands
Resqueでコネクションプールをしない

#問題
Rails は Connection Pooling を前提に作られている。
しかし、サービスの規模が大きくなるとデータベースへの接続数が多くなってしまい、メモリを無駄に消費してしまう。

#解決方法
コネクションプールをやめ、リクエスト毎やワーカ毎等でデータベースへ接続を行う様にする。

## Resque の場合
フォーク後に全てのコネクションをクリアしてしまう。

```rb:config/initializers/resque.rb
# Clear connection pooling
Resque.after_fork do
  ActiveRecord::Base.clear_all_connections!
end
```

以下のコマンドでIP毎のプロセス数を見ておくといいかもしれない。

```bash
$ mysql YOUR_DATABASE -e 'SHOW PROCESSLIST;' | grep -v + | cut -f 3 | cut -d ':' -f 1 | sort | uniq -c
```

上記対応を入れないとワーカ数の 2〜3 倍程度の接続数になる。
対応後は、起動しているワーカ数とおおよそ同じコネクション数になる。

## Web サーバの場合

下記の Gem を入れればサクッとできます。

disable_connection_pooling
https://bitbucket.org/winebarrel/disable_connection_pooling
Ruby でお手軽 UUID 生成 2 題

お手軽な方法を 2 つ紹介します．

## uuidgen コマンドを使う

```ruby
[1] pry(main)> `uuidgen`.chomp
=> "D4DEF89B-1DA7-45CF-9E70-D645170E77CB"
```

Mac OS X で確認しましたが，Linux でも使えると思います．
`uuidgen` コマンドが生成する文字列には改行が含まれるので注意が必要です．

```ruby
[2] pry(main)> `uuidgen`
=> "C4A235F5-7B38-456A-8B85-FD4A27D65BB1\n"
```

## SecureRandom を使う

```ruby
[3] pry(main)> require 'securerandom'
=> true
[4] pry(main)> SecureRandom.uuid.upcase
=> "81897198-DA81-4C5E-B5FF-27D402292868"
```

`upcase` しないと小文字になります．

```ruby
[5] pry(main)> SecureRandom.uuid
=> "8ef917ed-f15e-44f1-86db-4098e3654f0f"
```
ソースコード修正時にファイルエンコーディングがBOM付きUTF-8かどうかをチェックする


どうやら OS X の MonoDevelop でリファクタリング機能を使うと、BOM付きUTF-8がBOM無しで保存されるらしい。
そのままの状態でプロジェクトのリポジトリにコミットしてしまうとWindowsな人から苦情が来るのでコミット前にチェックできるようにしてみた。(ほんとはSVNサーバ側Hookしてコミットさせないのが良いんでしょうね...)

AssetPostprocessorでソースコードの変更を監視して、BOM無しでソースコードが保存された場合にダイアログボックスを表示するエディタ拡張を作ってみた。

```CSharp:SourceFileEncodingChecker.cs
using UnityEditor;
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.IO;

public class SourceFileEcodingChecker : AssetPostprocessor {
	static Regex m_SourceFilePattern;
	
	static SourceFileEcodingChecker() {
		m_SourceFilePattern = new Regex(@".+\.cs");
	}
	
	static void OnPostprocessAllAssets(
		string[] importedAssets,
		string[] deletedAssets,
		string[] movedAssets,
		string[] movedFromAssetPaths) {
		
		var invalidFiles = new List<string>();
		
		foreach (var importedAsset in importedAssets) {
			if (m_SourceFilePattern.IsMatch(importedAsset)) {
				var dataPath = Application.dataPath;
				dataPath = dataPath.Substring(0, dataPath.Length - 7);
				
				var path = System.IO.Path.Combine(dataPath, importedAsset);
				
				Debug.Log ("*** import: " + path);
				
				using(FileStream fs = File.OpenRead(path)) {
					var head = new byte[3];
					fs.Read (head, 0, 3);
					var headStr = System.BitConverter.ToString(head);
					Debug.Log (headStr);
					if (headStr != "EF-BB-BF") {
						invalidFiles.Add(path);
					}
					fs.Close ();
				}
			}
		}
		
		if (invalidFiles.Count > 0) {
			EditorUtility.DisplayDialog(
				"File encoding check error", 
				string.Join ("\n",invalidFiles.ToArray ()),
				"OK"
			);
		}
	}
}

```
バブルソートアルゴリズム（php）

[Wikipediaのバブルソートアルゴリズム](http://ja.wikipedia.org/wiki/%E3%83%90%E3%83%96%E3%83%AB%E3%82%BD%E3%83%BC%E3%83%88)を元に作成
■概要
全ての要素に関して、隣接する要素と比較し順序が逆であれば入れ替える。これを要素数-1回繰り返すことでソートを行なう。
なお、この繰り返しは、入れ替えが起こらなくなった時点で（それ以降は何度繰り返しても変化が起こらなくなるので）中断することができる。

**※サンプルには、上記中断の処理はなし。**

```php:Bubble_Sort.php
<?php

$arr = array(3,2,1,4,15,18,13,99,77,66,1,100,0);

var_dump(bubble_sort($arr));

function bubble_sort($array)
{
    // 要素数回繰り返し
    for($i = 0; $i < count($array); $i++)
    {
        // 要素数-1回繰り返し
        for($n = 1; $n < count($array); $n++)
        {
            // 隣接要素を比較し大小が逆なら入替える
            if($array[$n-1] > $array[$n])
            {
                $temp = $array[$n];
                $array[$n] = $array[$n-1];
                $array[$n-1] = $temp;
            }
        }
    }
    return $array;
}
```
AndroidでHTTPのテスト書くためのMockサーバーについてメモ


## 参考

#### [Java - Webクライアントのテストに使えるシンプルなサーバー - Qiita](http://qiita.com/aya_eiya/items/dbc66dda78384638fb89)

#### [Androidアプリ開発テスト入門（5）：Android Mockを利用してHTTP通信をテストするには (1/3) - ＠IT](http://www.atmarkit.co.jp/ait/articles/1204/13/news144.html)

#### [@IT掲載「Android Mockを利用してHTTP通信をテストするには」サンプルコードのmockito使用版](https://gist.github.com/nowsprinting/4179494)

#### [『良いコードを書く技術』サンプルコード　@agata/goodcode](https://github.com/agata/goodcode)

* [TodoActionTest.java](https://github.com/agata/goodcode/blob/dc33222a478856cfdc6d8f8e87516d63b9a8455c/goodcode08/src/test/java/goodcode/action/TodoActionTest.java)
* [TimelineActionTest.java](https://github.com/agata/goodcode/blob/dc33222a478856cfdc6d8f8e87516d63b9a8455c/goodcode08/src/test/java/goodcode/action/TimelineActionTest.java)

サーブレットのMock便利そうと思ったんだけどseasarに含まれているのでAndroidでは使い難そう。

## ライブラリ

調べればもっとあるんだろうけれど、JavaのHTTPサーバーのMockは以下の3つが良さそうだった。

#### [okhttp/mockwebserver at master · square/okhttp](https://github.com/square/okhttp/tree/master/mockwebserver)
（[mockwebserver - A library for testing HTTP and HTTPS clients. - Google Project Hosting](https://code.google.com/p/mockwebserver/)から移動）

3つの中だと最もシンプルのように見える。
手動だけどsetUpやtearDownでMockサーバー構築破棄できそう。

#### [MockServer](http://www.mock-server.com/)

mavenでMockサーバースタート？

#### [WireMock | WireMock](http://wiremock.org/)

_WireMock’s fluent API_ とか...
でも、JUnit新しいとアノテーションでMockサーバーの起動破棄などもやってくれる？
モックの構成設定と検証がなんか雑然としてるように感じる。
複雑そうに見えて、割とシンプルなのかも。
カテゴリでは +initialize を実装してはいけない

# 結論

カテゴリで +initialize が実装されていると、元の実装が上書きされてしまうため、本来の初期化処理が行われなくなってしまう。

リファレンスにも注意書きがあった。(ref: [NSObject Class Reference](https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/classes/nsobject_class/reference/reference.html#//apple_ref/occ/clm/NSObject/initialize))

> **Special Considerations**
> initialize is invoked only once per class. If you want to perform independent initialization for the class and for categories of the class, you should implement load methods.


# 対策

+load はカテゴリ毎に実装可能なので、+initialize の代わりにこっちを使用する。

ただし、+load が呼ばれた時点では他のクラスの +load が実行されていない (== 初期化が完了していない) 可能性があるので、スーパークラス以外のクラスの利用は注意が必要。

# 経緯

なぜだかメモリ不足時に `-[UIViewController didReceiveMemoryWarning]` が呼ばれず、原因を調べたら UIViewController のカテゴリで +initialize を実装していたのが問題だった。(iOS 7.1 で確認)

(+load はカテゴリでも使えるから +initialize も大丈夫だと思ってたら大丈夫じゃなかった...)
FreeBSDでnginx-rtmp-moduleを使ってストリーミングサーバを構築する

# 概要
nginx-rtmp-moduleを使って、ニコニコ生放送のようなライブストリーミングを可能にするストリーミングサーバを立てる方法です。

# 事前に準備するもの
* FreeBSD 10.0 RELEASEがインストールされたサーバ
* sudo
* wget
* pcre
* git
* vim

ここではコマンドシェルはtcshを使います。

# 構築方法
## 構築する前に
nginxのインストールは[こちら](http://qiita.com/llamakko/items/8da7d6e343759db1e938#comment-39bf7b86a913e97eab67)のコメントの方法を使ったほうが楽にインストールができます。
コメントをしていただいた@owataさんありがとうございました。

## 1. nginxをダウンロードする
現在ログインしているユーザのホームディレクトリに移動します。

```tcsh
cd ~
```

現時点での最新版であるnginx-1.7.3をダウンロードします。

```tcsh
wget http://nginx.org/download/nginx-1.7.3.tar.gz
```

## 2. nginx-rtmp-moduleをダウンロードする

```tcsh
sudo git clone https://github.com/arut/nginx-rtmp-module.git
```

## 3. ダウンロードしたnginxを解凍する

```tcsh
tar zxvf nginx-1.7.3.tar.gz
```

## 4. 解凍したnginxのディレクトリに移動する

```tcsh
cd nginx-1.7.3
```

## 5. nginxをビルド、インストールする

```tcsh
./configure --add-module=/home/ユーザ名/nginx-rtmp-module
make
sudo make install
```

## 6. nginx.confを編集する

```tcsh
sudo vim /usr/local/nginx/conf/nginx.conf
```

既に入っている文字列を全て削除したあと、以下の文字列を入力する。

```text
worker_processes 1;
error_log logs/error.log crit;

events {
    worker_connections 10;
}

rtmp {
    server {
        listen 1935;
        access_log logs/rtmp_access.log;
        ping 10s;
        ping_timeout 10s;
        chunk_size 8192;
        drop_idle_publisher 8s;

        application src {
            live on;
            wait_video on;
        }
    }
}
```

worker_connectionsとchunk_sizeはお好みで。

## 7. nginxを起動する
[Nginx をソースからインストール｜FreeBSD｜@OMAKASE](http://www.omakase.org/freebsd/nginx.html)

上記のサイトを参考にして、nginxのスタートアップスクリプトを作成します。
上記のサイトではスタートアップスクリプトの作成先は/usr/local/rc.d/nginxになっていますが、今回は/etc/rc.d/nginxに作成をしてください。

作成後、/etc/rc.d/nginxのパーミッションを555に変更します。

```tcsh
sudo chmod 555 /etc/rc.d/nginx
```

変更が終わったら、nginxが自動起動するように/etc/rc.confに以下の設定を追加します。

```text
nginx_enable="YES"
```

追加が終わったら、以下のコマンドでnginxを起動してみましょう。

```tcsh
sudo /etc/rc.d/nginx start
```

## 8. テスト配信を行う
Open Broadcaster Softwareなどの配信用のソフトウェアを使用し、テスト配信を行ってください。

ストリーミングサーバのURLは

```text
rtmp://[IPアドレス]/src
```
上記のようになっています。

# 最後に
会員登録をしている人のみが視聴できる、特定の人のみが配信をすることができる、等の設定は、nginx.confの設定とPHPを組み合わせることにより実現できます。
詳しいことは需要があればまた書こうと思います。