OmniAICreator/Qiita-1.07M huggingface dataset:
mongoexport で日付の条件を指定する方法


mongodbのユーティリティツールとして mongoexport があります．
mongoexport は，いわゆるダンプコマンドで，mongodbに接続して csv もしくは json 形式でファイル保存することができます．


## 簡単な使い方

```bash
$ mongoexport -h $MONGO_HOST --db $MONGO_DBNAME --collection $COLLECTION_NAME -o output.json
```

という感じで使います．これで指定したコレクションのjson形式のファイルが output.json として保存されます．


## query オプション

mongoexport のオプションのひとつとして --query があります．
export の条件を指定できるもので，find などで利用する query とほぼ同様の形式で指定できます．

例えば name が "taro" のレコードのみを export したいときは

```bash
$ mongoexport -h $MONGO_HOST --db $MONGO_DBNAME --collection $COLLECTION_NAME -o output.json --query '{"name": "taro"}' 
```

となります．

## 日付型の範囲指定をしたい！！！！

通常のmongo shell などで find で日付範囲をするときは

```
db.hogehoge.find({"created_at": {"$gte" : ISODate("2011-11-01T00:00:00+09:00"), "$lte" : ISODate("2013-11-02T00:00:00+09:00")}})
```

のように ISODate をかませて使います．なのでmongoexportでも同様に

```
--query '{"created_at":{"$gte": ISODate("2011-11-01T00:00:00+09:00"), "$lte" : ISODate("2013-11-02T00:00:00+09:00")}}'
```

とクエリを追加して実行したのですが

```
assertion: 16619 code FailedToParse: FailedToParse: Bad characters in value: offset:25
```

というエラーが！！

## 解決策: new Date で実行する

どうやら ISODate は使えないようでした．
そこで次のように new Date() で指定して実行します．引数はUNIXTIME（単位: **ミリ秒** ）なので注意してください．

```
--query '{"created_at":{"$gte": new Date(1320073200000), "$lte" : new Date(1383318000000)}}'
```

unixtime をコマンドラインで導くには date コマンドでこんな感じでいけます．

```bash
$ date -d '2011-11-01T00:00:00+09:00' '+%s'000
1320073200000
```




## 参考

http://www.buraktas.com/mongoexport-query-with-using-date/
.uniqの逆がしたい！

配列の中で重複しているものだけ抜き出す方法

```
arr = [1,2,3,4,5,6,7,8,9,1,2,3,4]
arr.uniq = [1,2,3,4,5,6,7,8,9]
```
はできる。

[1,2,3,4]だけ抽出したいときは

```
arr.select{|a| arr.index(a)!=arr.rindex(a)}.uniq
```

でできる
BasicTeX2013から2014への移行


brewでインストールしたBasicTeX2013を使っていました.
2014のインストールは

```
brew cask install basictex
```

とするだけでした.
`/user/local/texlive`に`2014basic`, `2014basic`が共存しています.

tlmgrで使用するパッケージをインストールし, フォントの設定を行いました.
あとは基本的に昔やった方法[[proxy対応]brewとtlmgrによるTeX環境構築 (ヒラギノ, times埋め込み設定)](http://qiita.com/yyamnk/items/2da2791bcee82643984f)でOK.

簡単.
phpの参照渡しはメモリを食うって本当？


# はじめ
phpでむやみに参照渡しすると、メモリ食うという。
↓ここら辺で検証されているが、果たしてphp5.4でも状況は変わらないのか検証したい。
http://tanakahisateru.hatenablog.jp/entry/2013/12/12/012728
http://qiita.com/dkkoma/items/7fd216795ee2b90d90c6

# 検証環境
- linux
- PHP 5.4.17 (cli) (built: Aug 21 2013 18:22:59) 

# ソースコード
参考にしているソースそのままだが、下記。

```php
<?php
function profile($funcname)
{
    $bigarray = range(1, 1000000);

    echo $funcname . "\n";

    if ($funcname) {
        $start = microtime(true);
        $ret = $funcname($bigarray, 500000);
        $end = microtime(true);
    } else {
        $start = microtime(true);
        $end = microtime(true);
    }

    echo "  caller memory: " . number_format(memory_get_usage()) . "\n";
    echo "  time: " . (($end - $start) * 1000) . "(ms)\n";
    unset($bigarray);
    unset($ret);
}

ob_start();
profile(null); // ウォームアップ
ob_end_clean();
// 参照なし
function nop_noref($arr)
{
    echo "  callee memory: " . number_format(memory_get_usage()) . "\n";
    return $arr;
}

// 参照渡しのみ
function nop_ref_arg(&$arr)
{
    echo "  callee memory: " . number_format(memory_get_usage()) . "\n";
    return $arr;
}

// 参照渡し+参照返し
function &nop_ref_both(&$arr)
{
    echo "  callee memory: " . number_format(memory_get_usage()) . "\n";
    return $arr;
}

// 参照渡しでreturnしない
function nop_ref_arg_noreturn(&$arr)
{
    echo "  callee memory: " . number_format(memory_get_usage()) . "\n";
}

profile('nop_noref');
profile('nop_ref_arg');
profile('nop_ref_both');
profile('nop_ref_arg_noreturn');

```

# 検証結果

% php -d memory_limit=-1 /tmp/reference.php 

```
nop_noref
  callee memory: 144,624,128
  caller memory: 144,624,128
  time: 0.053167343139648(ms)
nop_ref_arg
  callee memory: 144,624,208
  caller memory: 241,012,984
  time: 277.83894538879(ms)
nop_ref_both
  callee memory: 144,624,160
  caller memory: 144,624,160
  time: 0.052928924560547(ms)
nop_ref_arg_noreturn
  callee memory: 144,624,256
  caller memory: 144,624,304
  time: 0.041007995605469(ms)
```

各関数のechoの後に
$arr = [];を追記してから実行した結果

```
nop_noref
  callee memory: 144,624,856
  caller memory: 241,013,776
  time: 99.42102432251(ms)
nop_ref_arg
  callee memory: 144,624,920
  caller memory: 241,013,904
  time: 97.761869430542(ms)
nop_ref_both
  callee memory: 144,624,960
  caller memory: 144,625,096
  time: 0.056028366088867(ms)
nop_ref_arg_noreturn
  callee memory: 144,625,040
  caller memory: 144,625,224
  time: 0.038862228393555(ms)
```

# 所感
~~参照渡しが必ずしも遅いわけではない。~~
~~参照渡ししていない場合は、巨大な配列を関数に渡したタイミングでコピーが行われるが、
参照渡ししている場合は、巨大な配列のコピーが行われない。~~
~~ただし、参照渡しの罠として
関数内部で値を操作すると巨大な配列のコピーが行われるため激遅いプンプン丸になる。
値だけじゃなくて、関数自体が参照渡しに対する操作であることを
定義してあげるといいのだ。~~

~~とはいえ、参照渡しはどこで値が書き換わるか分からない。
状態は、クラスのメンバー変数に設け
状態の変化は、それを意図したメソッドを持つオブジェクトでのみ起こるようにすることで
状態の変化（値の書き換え）がどこで行われるか明確にするのが理想だ。~~
[コメント](#comment-c432a5c14d49c1a36f43)を御覧ください。


ってなわけで
ぽっこぽこ、参照渡しをしているソースコードの改修にとりかかる・・・。~~




# 参考サイト
http://php.net/manual/ja/language.types.array.php
http://php.net/manual/ja/features.gc.refcounting-basics.php
http://keicode.com/cgi/object-in-php-5.php
http://keicode.com/cgi/object-in-php-5-reference.php
optionタグをクリックして発火させたい関数があるときeventバインディングを使う（KnockoutJSを用いて)

割とよくやってしまう（いや結構少ないかもだけど・・・）と思われるポカをやってしまったので忘れないうちにメモ。

selectタグ中のoptionタグをクリックしたら実行される関数をknockoutでバインディングしたいと思ったら、eventバインディングを使う。

```html:ok.html
<select data-bind="event : $root.hoge">
    <option>hoge</option>
    <option>fuga</option>
</select>
```

間違っても以下のようにしてはいけない。

```html:bad.html
<select>
    <option data-bind="click : $root.hoge">hoge</option>
    <option data-bind="click : $root.hoge">fuga</option>
</select>
```

これでも実はちゃんと動くブラウザがある。IEとfirefoxは動いてしまう。ところがChromeでは動かないのである。
**どうやらChromeはoptionタグにclickイベントを付けられないようだ**（ちゃんと調べてないけど上のが動かなかったから少なくとも何か邪魔をしてくれるのだろう）。

ので、eventバインディングを使って発火させるようにしましょう。同じ関数名を書かない分こちらの方がスマートで良いとも思われます。

:blush:
tmuxの使い方



##参照
[tmuxを使い始めたので基本的な機能の使い方とかを整理してみた](http://kanjuku-tomato.blogspot.jp/2014/02/tmux.html)
基本的に上記のサイトの劣化版  
上記サイトのほうが詳しい。ただ見返す分には少し不便なので、必要な分だけ抜き取ってみた。


##tmuxの概要
tmuxは端末多重化ソフトウェアである。  
これを使うことでターミナルを複数開くことなく、プログラムを走らせたり出来るし、ペインを使うことで作業の効率化が計れる。  
(iterm2だとそこまで複数のターミナルを開くことは辛くないんだが、たぶんまだわかっていない利点があるのだろう。)  
tmuxはバックグラウンドでも働くので、ネットワークが切れても再開可能なのが一番の利点かな。もしくはやりたいことごとに使い分けが可能か。  
サーバーに入れておくと一つのssh接続で複数の端末が扱えれるし切断しても大丈夫。

>tmuxを使うことによるメリット  
	1つの端末で複数の擬似端末を起動可能  
	複数の端末を立ち上げずに、tmux上の擬似端末を切り替えてオペレーション可能  
	起動した仮想端末を画面分割して使用可能  
	他のファイルを参照したりログ出力を参照しながらオペレーション可能  
	起動した仮想端末上でコピペが可能  
	マウスを使わず、tmux内でキーボードのみでのコピペが可能  
	起動した仮想端末のデタッチ(切り離し)/アタッチ(接続)が可能  
	tmux実行端末とのネットワークが切れても問題なく、異なる環境から同じtmuxセッションへ接続可能  


とのこと


##tmuxの構成要素
###設定ファイル
設定ファイルは```~/.tmux.conf```にある。なければ作成。  
新規セッションの時に呼び込まれる。

###プロセス構成
tmuxにはサーバーとクライアントがある。  

+ tmuxサーバ(セッション)
	- tmux起動時に生成される、tmuxセッションを管理しているプロセス
+ tmuxクライアント(pty/仮想端末)
	- tmuxセッションへ接続(アタッチ)しているプロセス(pty)

###画面構成要素

+ セッション(Session)
	- tmuxに管理される仮想端末全体を指す
	- 各セッションは1つ以上のウィンドウを持つ
+ ウィンドウ(Window)
	- tmuxセッション内に開かれている1つの仮想端末の画面全体を指す
	- ウィンドウは1つ以上のペインを持つ
+ ペイン(Pane)
	- 分割されたウィンドウの単位を指す
	- ペインそれぞれが独立した擬似端末となる

##インストール

```
% brew install tmux
```

##基本操作
どのキーがどの操作に対応しているかは `prefix + ?` を入力することで確認できる。（もしくはターミナルで `tmux list-keys`）

###Prefixキー
起動中のtmuxを操作するには、多くの場合tmuxの制御を行うことを示すためのプレフィックスキー`prefix`(デフォルト設定値)を入力し、それに続いて実行したい操作に対応するコマンドキーを入力する形でtmuxの内部コマンドを実行することになる。  
prefixと書いてあったら`prefix`を入力していると読み替えて良い。(prefixは変えることが出来、自分の場合`ctrl-t`にしている。tmux使いは常により良いprefixキーを探していると言っても良い。[こんな記事](http://qiita.com/hnw/items/02113da3476f29df768b)があるので気に入ったprefixを探そう!)



###起動

```
% tmux
```
or

```terminal
% tmux new-session
```

###セッションの確認

```
% tmux ls
0: 1 windows (created Wed Oct  1 09:24:15 2014) [102x31]
1: 2 windows (created Wed Oct  1 09:24:44 2014) [126x32] (attached)
```

###セッションのデタッチ
tmuxから抜ける場合これを使う。  
```prefix```+```d```

###セッションのアタッチ
デタッチしたセッションをもう一度使う場合  

```
% tmux attach  #直近のセッションにアタッチする。
or
% tmux attach -t 0
```
-tオプションで任意のセッションをアタッチすることが出来る。

###セッションの削除

```
% tmux kill-session (-t 0)
```
すべて削除するには

```
% tmux kill-server
```

###セッションのリネーム
```prefix```+ ```$```  


##ウィンドウの操作

###新規ウィンドウ

```prefix```+ ```c```  
画面下に0:zsh- に続いて 1:zsh*と表示されますが、これがそれぞれウィンドウを示す。  
現在選択されているウィンドウには * と表示されており、それ以外のウィンドウには - と表示される。  
ウィンドウ名は `prefix + :rename-window [window name]` で指定できる。
もしくは`prefix+,`
  
###ウィンドウの切り替え

```prefix```+ ```ウィンドウ番号```で切り替え可能。
また、```prefix```+```n```で次の番号、```prefix```+```p```で前の番号にいける。

###ウィンドウの一覧表示
```prefix```+ ```w```  
ここで選択することで切り替えることも可能

###ウィンドウの削除
```prefix```+ ```&```

##ペインの操作

###水平分割
```prefix```+ ```"```

###垂直分割
```prefix```+ ```%```

###ペイン間の移動
```prefix```+ ```o```  
また、```prefix```+ ```q```でペイン上に数字が表示されるのでその間に数字を入力すると移動できる。

###ペインの分割解除
```prefix```+ ```x```


##tmux.confの設定

###ウィンドウの移動
```C-t```+space+[ウィンドウ番号] で移動できるようにする。

```
nbind space
bind space command-prompt "select-window -t '%%'"
```

##その他

+ [これで再起動しても大丈夫！tmux-resurrectの導入](http://qiita.com/vintersnow/items/4e1eb42c08cc2bfd77dd)
+ [tmuxのmouseオプションが2.1で変更されていた](http://qiita.com/vintersnow/items/b5803876a1de279b201a)
ベイズ主義の考え方とその例

ベイズの定理を利用した統計学では事前確率という考え方を仮定して計算をおこないます。このようにあいまいな人の主観をもとにした確率を扱うので、このような確率を主観確率と言うこともあります。

## 頻度主義とベイズ主義

学年全体から 5 名の生徒を選び、そのテストの点数を調べます。

### 頻度主義

* 学年全体のテストの成績に対して唯一無二の「平均得点」を想定する。
* 唯一無二の平均得点を持つ母集団からたまたまサンプルが得られたものと考える。
* たまたま選び出した 5 人の平均がサンプルとして与えられている。

このような考え方では、 5 人のサンプルはいつでも繰り返し何度も得られることを想定しています。このため、これを「頻度主義」と言います。

### ベイズ主義

* 唯一無二の「平均得点」は追求しない。
* そのかわり平均得点の確率分布を調べる。
* いま手元に得られたサンプルを唯一のデータとして扱う。
* これらから「平均得点」の確率分布を計算し、統計情報として扱う。

従来の統計 (頻度主義) がデータを確率変数として扱うのに対し、ベイズ主義では母数を確率変数としてその確率分布を調べるところが異なります。

20 世紀の統計の世界においてはフィッシャーやネイマンといった先人によって「厳密ではない」とされベイズ主義は冬の時代を迎えました。しかし今日においては情報、金融、医療、心理学、人工知能などさまざまな分野でベイズ統計が応用されています。

いままで古典的な統計を主に追って来ましたが、最近流行の機械学習などを手に付けるにあたりベイズ統計学の考え方を避けて通ることはできないと思われます。

## ベイズのパラドックス

以前に[モンティ・ホール問題](http://qiita.com/ynakayama/items/1e1693503e27ce33e0a0)を紹介しましたが、ベイズ統計のからむクイズやパラドックスは他にもあります。

```
狼であることが疑われている村人が三人います。
狼は二人います。
この村の占い師は二人を殺害 (吊るす) 予定です。
※ 誰を処刑するかは占い師が決定します。
※ この占い師が人間であることはすでに確定しています。

村人 A は今夜吊るされる予定なのは誰か占い師にたずねました。
占い師は村人 B であると回答しました。

質問する前は村人 A B C のうち
誰が助かるのかわかりませんでしたから
助かる確率は 1/3 でした。

質問の解答を得たあと
村人 A はこれで残り処刑されるのは村人 C または自分なので
助かる確率が 1/2 になったと喜びました。
```

はたしてこの村人 A の計算は正しいでしょうか？

### 事前確率

三人の村人のうち二人は処刑され一人は助かります。このことから

```math
P(A) = P(B) = P(C) = \frac 1 3
```

となります。

### 事後確率

もし A が助かるなら、占い師は村人 B または C が殺される確率を半々で言うわけです。

```math
P(S_b|A) = P(S_c|A) = \frac 1 2
```

また二人処刑され、占い師はうそをつかないので

```math
P(S_b|B) = 0 \\
P(S_b|C) = 1
```

求める確率は P(A|Sn) ですのでこれを[ベイズの定理](http://ja.wikipedia.org/wiki/%E3%83%99%E3%82%A4%E3%82%BA%E3%81%AE%E5%AE%9A%E7%90%86)にあてはめますと

```math
\frac {1/2 × 1/3 (= A の生存率)} {1/2 × 1/3 + 0 × 1/3 (= B の生存率) + 1 × 1/3 (= C の生存率)} = \frac 1 3
```

となりますから 1/3 のままです。

ここで重要なのはモンティ・ホール問題では主体的に選択肢を選び直すことができた点です。この問題では村人が処刑される人を変える権利がない前提になっていますので、確率も 1/3 のまま変わりません。

## まとめ

頻度主義とベイズ主義のちがい、またベイズ的な考え方の計算例について説明しました。
BEAR.Sunday 学習記録(6) Formその1

ようやくフォームやテンプレートのあたりに入ってきました。そこで、「[BEAR.Sundayでコンタクトフォームを作ってみる](http://blog.a-way-out.net/blog/2014/08/14/bear-sunday-contact-form-4-aura-form/)」を真似て Aura/Input/Form を使ってフォームを表示してみようとしました。

これが例によってまた大ハマリ。リソースの `onGet()` でちょっと特殊なことをやっていたせいなのですが。

Aura.Input をインターセプトするために、BEAR.Package には AuraFormTrait という便利な Trait が用意されていて、これを使うと Aura.Input 用の `invoke()` を書かなくて済みます。

`AuraFormTrait::invoke()` のおおまかな処理を説明しますと、

* GET の場合は、入力フォームを表示するため`onGet()`を呼びます。
* POST の場合はバリデーションを行い（`$this->form->filter()`）、通れば元の ResourceObject の onPut/onPost/onDelete などの処理を続行します（`$invocation->proceed()`）。DBなどに保存する処理が続くでしょう。
* バリデーションを通らなければ、エラーメッセージをセットして、`onGet()`を呼びます。もう一回見直して入力しろ、と入力フォームを表示するわけですね。

んで何が問題だったかというと、`invoke()` 内で `onGet()` を呼ぶときに、引数なしで呼ぶので、期待していた `ResourceObject::onGet()`の引数が null になってしまいました。

フォームを表示するときに引数を渡すこともそんなに無いかもしれませんが、例えば「カテゴリ：動物」内に記事を作る、ってときに `category_id=3` なんてのを渡したり、ページAの子ページを作るときに、`parent_id=56` なんてのを渡したりすることがありますが、こういったパラメタが渡せなくなってしまいます。

あれ、でもこれ、今まで POST（新規投稿）で考えていたけど、更新や削除の時に渡す Primary Key な $id も無くなっちゃう？　何か作り方を間違えているような気もしますね ^ ^;; そのような場合は AuraFormTrait を使わずに自前で処理を書くべきなのかな。
Rocketeerのdeployタスクでデプロイ先にComposerをインストールさせない


Composer便利ですけど、Rocketeerでデプロイするのに、デプロイ先に無条件で勝手に入れちゃうのもどうなんだろう？って人向けに。

.rocketeer/strategies.phpを以下のように書き換えると、Composerのインストールとかアップデートがされなくなります。

```php

/* 
'composer'     => array(
	'install' => function (Composer $composer, $task) {
		return $composer->install([], ['--no-interaction' => null, '--no-dev' => null, '--prefer-dist' => null]);
	},
	'update'  => function (Composer $composer) {
		return $composer->update();
	},
,
*/
'composer'     => array(),

```

単純にコメントアウトしただけじゃだめで、空配列で上書きしてあげる必要があるっぽかったです。
AS3で類似した画像を判定


・画像比較をして差分を取得
・差分に対してグレースケール、ブラーのフィルタをかける
・指定のしきい値を超えた部分を黒く塗りつぶす
・黒く塗りつぶした箇所があれば差異ありと判定

```as3
/** グレースケール用フィルタ */
private static var GRAY_SCALE_FILTER:ColorMatrixFilter = new ColorMatrixFilter(
	[
	0.3086, 0.6094, 0.0820, 0, 0,
	0.3086, 0.6094, 0.0820, 0, 0,
	0.3086, 0.6094, 0.0820, 0, 0,
	0, 0, 0, 1, 0
	] );
/** ブラー用フィルタ */
private static var BLUR_FILTER:BlurFilter = new BlurFilter( 10, 10 );

/**
* 画像の差異をチェックする
* @param item1 ベース画像
* @param item2 比較対象の画像
* @param threshold しきい値 0~1.0
* @return true:差異あり false:差異なし
*/
public function diff( item1:BitmapData, item2:BitmapData, threshold:Number ):Boolean {
	// 画像の比較
	var result:Object = item1.compare( item2 );
	if ( result is BitmapData ) {
		var bmpdResult:BitmapData = result as BitmapData;
		// 差分に対してグレースケール、ブラーのフィルタを適応する
		bmpdResult.applyFilter( bmpdResult, bmpdResult.rect, new Point(), GRAY_SCALE_FILTER );
		bmpdResult.applyFilter( bmpdResult, bmpdResult.rect, new Point(), BLUR_FILTER );

		// 指定されたしきい値と比較してイメージ内のピクセル値をテストし、テストに適合したピクセルに新しいカラー値を設定します
		var container:BitmapData = new BitmapData( item1.width, item1.height, true, 0x000000 );
		var changedPixels:Number = container.threshold( bmpdResult, bmpdResult.rect, new Point(), ">", threshold * 0xFFFFFFFF, 0xFF000000, 0xFFFFFFFF, false );

		if ( changedPixels > 0 ) {
			// しきい値を超えたピクセルが存在しない場合は差異なしとする
			return true;
		}
		return false;
	}

	if ( result == 0 ) {
		// 画像自体に差異なし
		return false;
	} else {
		// -3:幅が違う  -4:高さが違う
	return true;
	}
}
```
iOS開発する上で絶対に押さえておく8つの項目


## レスポンスはキャッシュされる
* NSURLConnectionでもAFNetworkingでも、レスポンスは設定によってはキャッシュされます
* httpのレスポンスコードを正しく返す必要があります。
* サーバーからのjsonのレスポンス、画像のキャッシュの設定をしっかりみる必要があります
* 特に、普段返さないエラーページやメンテナンスページの設定を確認する必要あり

## バージョンコントロール
* 下位バージョンをサポートしないことで、インストールがかなり落ちます。
* 一度間違えて、7.1のときに7.0以降でなく7.1以降という設定でリリースして3割ほどインストールが落ちました
* cocoapodを利用している場合は、Podfileに書いているバージョンとprojectのバージョンに違いがあるかも注意する必要があります。
* 特定の7.0.2だけviewが崩れる問題などもありました

## iOSの細かい設定の違い
### カレンダーの設定の違い
* 和暦とタイ仏暦が存在します
* iOS内部でNSDateにより日付を保持している場合は問題が表面に出ることはありませんが、文字列としてフォーマットし表示しようとした場合や、Webサーバーなど外部とのやりとりの際に問題が表面化することがあります
 * （iOSの書式設定に依存しますが）和暦の場合は2014年ではなく平成26年のように出力されます
 * （iOSの書式設定に依存しますが）タイ仏暦の場合は2014年ではなく仏歴2557年のように出力されます

### キーボードのsplit keyboardの処理
* iPadの場合split keyboardというものがある。
* 他のキーボードとnotificationのタイミングなどが異なるので注意が必要


## 気づきにくいバグのポイント
### sharedInstanceやviewDidLoadでセットしているviewで問題が起きる
* sharedInstanceを利用してデータの受け渡しをしている場合、バグがあると、古いデータを利用して動作して問題が起きることが起きる。
* 例えば、Aさんにメッセージしようとすると、Bさんにメッセージしてしまう
* データの受け渡しはバグになりにくいように設計する。sharedInstanceを使った受け渡しはなるべくさける。notificationも常に使うことは絶対にしない。
* コミュニケーションパターンってのがある。これに従うとよい
* http://www.objc.io/issue-7/communication-patterns.html

## 異常系でクラッシュしやすいポイント
### NSDictonaryやNSNumberにnilが入る
* blockの中の変数など解放されてたまにnilが入るケースもある。
* viewのプロパティには注意が必要
* サーバーからのデータに必ず値が入るか、入っていなくても動作するようにするか、決める&テストを書いておく必要がある

### KVOでたまに落ちる
* 注意しないと結構クラッシュしやすい
* FacebookのKVOControllerがおすすめ
* https://github.com/facebook/KVOController

### ネットワークを接続中の操作
* 他のviewに移動する
* 他のアクションを実行するとか気をつける必要あり

### 新規ユーザのテスト
* データ依存の問題に最も気づきにくい
* 選択肢などなるべく一度はすべてのケースでテストしたほうがよい

### Crashlyticsは必ず入れておく

## 表示がおかしくなるポイント
### ScrollViewの上部の位置
* versionによっても問題起きやすい
* 複数配置していても問題起きやすい

### データが0件のときのテスト
* なにも表示されない問題が起きる
* 開発中に気づきにくいポイントになりやすい

### セルの再利用
* tableViewやcollectionViewではセルを再利用している
* データがない場合でもデータがないということを再代入する
* imageの読み込み中のcellを再利用してしまうのはよくしてしまう

## アプリの起動方法
### 通知から開く
* 通知から開く際に、アプリを起動してない・アプリを起動しているという二つのケースがある
* 特にアプリを起動しているときは、例えばモダルビューを開いているときに通知を開くなどのケースを忘れやすい
* ログインしてないユーザが通知からアクセスするとかも注意必要
* 起動中の通知もある

### url schemaから開く
* セキュリティ的にバグにならないか
* 当たり前だけど、APIとしても常にどういうデータがきても大丈夫なように設計する

### バックグラウンドフェッチから起動
* ライフサイクルが異なる

## iPhoneの機種
* 機種依存の問題もありえるためできるだけ機種ごとにテストするほうがいいです。

## その他iOS関連で書いている記事
* iOS開発に加わって最初に学んで欲しいこと http://qiita.com/reikubonaga/items/3ebe6fe29ce8d7c84291
* iOS開発する上で絶対に押さえておく8つの項目 http://qiita.com/reikubonaga/items/44b459db5d6f130a4fc6 
* iOS開発していて気がついたら一杯のハードディスクを20GB以上軽くする方法！ http://qiita.com/reikubonaga/items/48987d35fb10b7de6bcc
* Swiftプロジェクトに入る前に読んだことまとめ http://qiita.com/reikubonaga/items/2a754c02534f8e7f97c2
* StoryboardとContainerを多用した開発のメリットとデメリット http://qiita.com/reikubonaga/items/2e88ddda1ac0868a2729
* iOSの環境変数(Configuration, Build Settings, Plist)で知っておくべきこと http://qiita.com/reikubonaga/items/53ac1818b3f56fc91504
* awakeFromNibとinitWithFrameとinitWithCoderの使い方 http://qiita.com/reikubonaga/items/cb52dea471cfe1640773

## インターン生・未経験者向け投稿
以下も同じように、これからスキルを身につけたい人向けに開発インターンで役立つことを書いています。
* rails開発に加わる前に学んで欲しいこと http://qiita.com/reikubonaga/items/60b4f6ee0a86ed06e83b
* 開発インターンで気をつける5つのポイント http://qiita.com/reikubonaga/items/d00c179957d57f48bf73
* 初めてコードレビューされる人のためのpull requestとcommitの作り方 http://qiita.com/reikubonaga/items/e3b3b19c14d4ef4efb95
ノムリエのOSS奮闘記

# はじめに
* キーワードは、「Java」、「クラウド」、「OSS」、「世界遺産(!?)」
* それらにまつわる自己研鑽・奮闘記を自己満足的に整理・記録する目的
* 1つの投稿を都度アップデートする方針
* 技術的に目新しい内容はなく、簡潔かつ再利用が基本（ほとんどがQiita記事の引用。元記事の執筆者の方々には御礼申し上げますm(__)m）
* お勉強目的なので、色々無駄なこと・非実用的なことあるかも（と前置きしつつ、コメント/フィードバックはWelcome!!）
* ゆえに、投稿の内容の正しさ、および本投稿から発生した直接的、又は間接的ないかなる損害についても責任を負いかねるのですwww
* 現時点のゴールは下図（書いた本人以外読み解けないw やっているうちにこれすらブレるかもしれない）

![GOAL](https://qiita-image-store.s3.amazonaws.com/0/48232/41b15ba4-40b6-c10f-8ef6-76ea9544f87e.jpeg)

***
# 1. Vagrant/VirtualBoxをインストールする下準備の巻
新しいノートPCをゲット!!
真っ先にカスタマイズしたのが。。。ちょびっとBIOSイジってVT Enabled!?
というのも。。。Vagrant&VirtualBoxを入れるため☆
[WindowsのVagrantで64 bit OSが起動しないとき](http://qiita.com/rch850/items/ba254063df4a9ff15354)

***
# 2. Windows7にVirtualBox,Vagrantを入れ、Dockerご試食の巻
Gitクライアントも必要だね。
http://msysgit.github.io/

[Windows7にVirtualBox,Vagrantを入れ、Dockerを試してみる](http://qiita.com/tenten0213/items/52f2706d63defd7b4854)
うわー、Docker、はやーいっっっ♪（echoですがw、OS?コンテナ?起動のオーバーヘッド含んでいるはず）

DockerホストにSSHログインする方法として、Git Bashから「vagrant ssh」もできたのだが、Dockerコンテナ内でviとかやるとなぜかレイアウトがヒドいことになる。。。

***
# 3. DockerコンテナにSSHログインの巻
[Dockerで立てたコンテナにsshで接続する](http://shibayu36.hatenablog.com/entry/2013/12/07/233510)
意外にこれが成功せず。。。一本道だと思っていたのだが。。。多分、Dockerのバージョン差異か、NW周りの設定不足か、SSHの理解不足か。。。

ちなみに発生しているエラーは、超お馴染みなヤツ：
「Read from socket failed: Connection reset by peer」

***
# [閑話休題] Dockerのもやもやが少し晴れる記事
ところで、Dokcerは、
* 『Dockerのコンテナを立てる時は一つフォアグラウンドで動いているジョブがないとコンテナが消えてしまう』
* 『Dockerではプロセスを起動させるコマンドを一つしか選択出来ない』
とのことを遅ればせながら識る。
そうなんだー！意外と制約強い気が。。。？

とはいえ、裏ワザはあるみたいで...
[Dockerコンテナ上で複数プロセス実行する方法(Supervisor)](http://yss44.hatenablog.com/entry/2014/01/05/031736)
ゴール成就のためにはこのテのワザが必須。

「A process per container」と「Role-based container」はやはり議論の的。後者が推奨みたい。
[Dockerに関する誤謬(仮題)](https://devopsu.com/blog/docker-misconceptions/)

***
# 4. Dockerコンテナにnsenterログインの巻
[CoreOSのnsenterを使ってDockerコンテナに入る](http://qiita.com/spesnova/items/8121615d4634500a331c)
SSHログインに失敗していた自分には朗報♪

自分のCoreOSにも「docker-enter」はないので、「nsenter」を実行。
ついにDockerコンテナにログイン!!
`$ CID=$(docker ps -l -q)
 $ PID=$(docker inspect --format {{.State.Pid}} $CID)
 $ sudo nsenter --target $PID --mount --uts --ipc --net --pid`

=>【10/20追記】ここでBreaking Newsがっっっ
[Docker 1.3からは「Docker exec」でログイン可能になる!!](http://qiita.com/spesnova/items/8121615d4634500a331c)

***
# 5. Knife-Solo/Chef-Soloをインストールの巻
VirtualBox VM上（Dockerコンテナの外）にKnife-Solo/Chef-Soloをインストールしてみる。
目論んでいるのは、
・Knife-Solo：AWS IaaS VMをリモートでセッティングするのだ！
・Chef-Solo：VirtualBox VM上で、Jenkins他をインストールするCookbookを作るのだ！

CentOS上でのKnife-Soloのインストールは簡単至極（だと思っていた...）：

[Rubyを全く知らない素人のワタクシがCentOSにknife-soloをインストールする手順](http://qiita.com/smd8122/items/d9ae4c6c45cecf5bcabf)
※タイトルに惹かれてしまいました。ワタクシと同じ境遇☆「"rubyこわい","gemこわい","rakeこわい"」

ところが...CoreOSで開始したのが仇に。yumすら入っていない...
http://japan.zdnet.com/os/sp/35050567/3/
→「FastPatch」を使え、と。
→kexec？（https://coreos.com/using-coreos/updates/）

※Knife-SoloをインストールするとChef-Soloが漏れなくついてくる。
※神業「sahara」はWindows上のVagrantでは使えず (-_-)

***
いやー初回から実にご無沙汰でした。。。豪州でワインを飲みまくっておりました☆
今日はココまで。。。（So much for today...） ※2014年11月3日
***
Excel VBAでZabbixAPIへアクセスしてみた

ZabbixのデータをEXCELに書き出したくて、VBAでZabbixAPIへアクセスしてみました。


#サンプル

https://github.com/usiusi360/ZabbixAPI_with_VBA_demo/archive/master.zip


#### 使い方
ZabbixのWebGUIのURLを入力します。URLの最後に「/」スラッシュが必要です。
パスワードにダブルクォーテーションを含む場合、直前にバックスラッシュを付ける必要があります。

#### 制限
GETのみです。
eventとか表示すると終わらないので、300レコードでリミットが掛かるようにしてあります。


# 参考

#### VBAでWEBアクセス
VBAでWebページを取得する方法
http://so-zou.jp/software/tech/programming/vba/sample/web.htm

[VBA]Excel VBAでHTTP通信
http://outofmem.tumblr.com/post/63052619242/vba-excel-vba-http

#### VBAでJSONデータをパース

ExcelのVBAでJSON形式のデータを解析する
http://symfoware.blog68.fc2.com/blog-entry-579.html

VBAでJSONを扱う VBAでJSONを扱うについて
http://javascript.dohow.jp/advance/jsonvba.shtml

[VBA]VBAでjsonをパースする
http://outofmem.tumblr.com/post/63355773212/vba-vba-json
numpyを使用してある条件の要素を含む列or行を削除

numpy.whereとnumpy.deleteを組み合わせて使う

```
>>> v = np.array(range(25)).reshape(5,5)
>>> v
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])
>>> np.delete(v, np.where(v>22)[1], 1)
array([[ 0,  1,  2],
       [ 5,  6,  7],
       [10, 11, 12],
       [15, 16, 17],
       [20, 21, 22]])
>>> np.delete(v, np.where(v>18)[0], 1)
array([[ 0,  1,  2],
       [ 5,  6,  7],
       [10, 11, 12],
       [15, 16, 17],
       [20, 21, 22]])
>>> np.delete(v, np.where(v>18)[0], 0)
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
>>>
GitHub上の削除忘れブランチ一覧をJIRAのチケットを見て取得する

JIRAのチケットをクローズしてもGitHubのブランチを削除するのを忘れるので、毎月棚卸しと称して削除対象のブランチを洗い出すためのスクリプト

## 内容

GitHub上のブランチ一覧を取得する。
ブランチに紐付いているチケット(ブランチの命名規則でわかる)がオープンしてるか？
オープンしてなければ削除対象ブランチとみなす

前提条件

* Git-flowで開発している(featureブランチなどを切ってる)
* ブランチ名が feature/チケット番号-<適当な文字列>になってる

```show_delete_branch.rb
## At first, gem install highline
require 'rubygems'
require 'optparse'
require 'net/http'
require 'json'
require 'set'
require 'uri'
require 'highline/import'

def get_branches(config)
  ghe_host='GHE_HOST'
  ghe_api_uri='/api/v3/repos/<organization>'
  # リポジトリ名
  ghe_repos=%w/rep1 rep2/
  exclude_branches = Set.new(['master', 'develop'])
  ## get braches
  branches = Set.new
  ghe_repos.each {|repo| 
    https = Net::HTTP::new(ghe_host, 443)
    https.use_ssl = true

    https.start{|http|
      req = Net::HTTP::Get.new("#{ghe_api_uri}/#{repo}/branches")
      req.basic_auth config[:user], config[:password]
      response = http.request(req)
      JSON.parse(response.body).each {|obj|
        branches.add(obj['name']) unless exclude_branches.include?(obj['name'])
      }
    }
  }

  return branches
end


def get_tickets(config)
  jira_host = 'JIRA_HOST'
  jira_api_uri ='/rest/api/2/search'
  query_string = {jql: 'project = <PROJECT_NAME> AND status in (Open, "In Progress", Reopened, Resolved)',
                maxResults: '1000'}.map{|key,value|
    "#{key}=#{URI.encode(value)}"
  }.join('&')

  ## JIRA ticket 
  open_tickets = Set.new
  https = Net::HTTP::new(jira_host, 443)
  https.use_ssl = true
  https.start{|http|
    req = Net::HTTP::Get.new("#{jira_api_uri}?#{query_string}")
    req.basic_auth config[:user], config[:password]
    response = http.request(req)
    (JSON.parse(response.body))['issues'].each {|obj|
      open_tickets.add obj['key']
    }
  }
urn open_tickets 
end

# チケット番号のprefix
TICKET_PREFIX=''
# TODO exlude repos
config = {}
opts = OptionParser.new
opts.on("-u VAL", "--user VAL", "user name") { |v| config[:user] = v}
opts.on("-p VAL", "--password VAL", "password") { |v| config[:password] = v}
opts.parse!(ARGV)

config[:password] = ask('Enter password:'){|e| e.echo = false} unless config[:password]

delete_branches = []
branches = get_branches config
tickets = get_tickets config

branch_regex_pattern = %r#(feature|hotfix)/(\d+)(-(.*))+#
branches.each{|branch| 
  # releaseブランチは基本削除
  if branch =~ /release.*/
    delete_branches.push branch
  elsif branch =~ /(feature|hotfix).*/
     m = branch_regex_pattern.match branch
     # 閉じたチケット
      delete_branches.push branch unless m && tickets.include?("#{TICKET_PREFIX}#{m[2]}")
  else
    # 命名法則外のチケット(多分削除しても大丈夫)
    puts "unexpected branch name #{branch}"
  end
}

delete_branches.each {|v|
  puts v
}
```
bashで標準入出力とかのリダイレクト

bashで標準入出力，標準エラー出力をリダイレクトするときのお話．
よくふわっと使っていた`2>&1`とかの&の意味とか知りたくてちょっと調べました．
##リダイレクトとは
コマンド実行前に，コマンドの入出力を置き換えできる．また，シェルの実行環境に対してファイルをオープン，クローズできたりする．
基本的にリダイレクトは左から右に評価される．


###入力のリダイレクト
`[n]<file`
fileがオープンされて，ファイルディスクリプタnに読み込まれる．
nが指定されていないと標準入力(ファイルディスクリプタ0)に読み込む．
###出力のリダイレクト
`[n]>file`
fileがオープンされて，ファイルディスクリプタnに読み込まれる．
nが指定されていないと標準出力(ファイルディスクリプタ1)に読み込む．
fileが存在しない場合は作成される．fileが指定されてないとシンタックスエラー．

ちなみに`[n]>>file`こうすると追記になる．


###ファイルディスクリプタの複製(Duplicate)
`[n]<&word`
こうすると，入力ディスクリプタの複製を行なう．wordが1桁以上の数値に展開されるとnはそのディスクリプタのコピーとなる．wordが入力のために開かれたファイルディスクリプタを指していない場合はエラーとなる．
nが特に指定されなかった場合，標準入力(0)に複製される．fileに`-`が指定された場合，ファイルディスクリプタnはクローズされる．

`[n]>&word`
こちらでは出力ディスクリプタの複製を行なう．エラーとかは入力ディスクリプタの複製と同様．
nが特に指定されなかった場合，標準出力(1)に複製される．
nが指定されず，かつwordが1桁以上の数値に展開できなかった場合，標準出力と標準エラー出力がword(ファイル)にリダイレクトされる．

##動作確認
以上のことを踏まえて、以下の様なプログラムで動作を確認してみる．


```c:test.c
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    fprintf(stdout, "stdout!\n");
    fprintf(stderr, "stderr!\n");
    exit(0);
}
```

```Bash
$ ./a.out
stdout!
stderr!
//デフォルトで標準エラー出力は標準出力にリダイレクトされている．

$ ./a.out > hoge 2>&1　
$ cat hoge
stderr!
stdout!
//左から評価される．(1)標準出力はhogeにリダイレクト (2)標準エラー出力には標準出力のファイルディスクリプタ(=hogeへの書き込み)をコピー

$ ./a.out 2>&1 > huga
stderr!
$ cat huga
stdout!
//左から評価される．(1)標準エラー出力には標準出力のファイルディスクリプタ(=画面に表示)をコピー (2)標準出力はfugaにリダイレクト

$ ./a.out > piyo 
stderr!
$ cat piyo
stdout!
//何も指定していないので標準出力だけがpiyoにリダイレクトされる

$ ./a.out >&hogehoge
$ cat hogehoge
stderr!
stdout!
//標準出力と標準エラー出力を両方hogehogeにリダイレクト．>&とhogehogeの間にスペースがあってもいい
```

おわり
##参考
```
$ man bash
```
Railsでマテリアルデザイン

## やりたいこと
Railsで気軽にマテリアルデザイン使ってみたい

## どうやるか
bootstrap-material-designを使う

## やりかた

### 前提
- nodeが入っていること

### app作成
```zsh
rails new piyo
```

```rb:Gemfile
gem 'therubyracer',  platforms: :ruby
gem 'less-rails'
gem 'twitter-bootstrap-rails', github: 'seyhunak/twitter-bootstrap-rails', branch: 'bootstrap3'
gem 'simple_form', '~> 3.1.rc1'
```

```zsh
% bundle
% rails g bootstrap:install less
% rails g simple_form:install --bootstrap
% rails g bootstrap:layout application fluid
% rails g scaffold Post title body:text
% rake db:migrate
% rails g bootstrap:themed Posts
% rails s
```

### インストール
```zsh
% npm install -g bower
% echo '{"directory":"vendor/assets/bower_components"}' > .bowerrc
% bower i bootstrap-material-design
```

### css
```css:application.css
 *= require bootstrap-material-design/dist/css/material
```

```scss:posts.css.scss
@import "bootstrap-material-design/dist/css/material";
```

### 使用前
![使用前.png](https://qiita-image-store.s3.amazonaws.com/0/54295/00f99101-ab70-f6cd-f515-8e3027a5fcef.png)


### 使用後
![使用後.png](https://qiita-image-store.s3.amazonaws.com/0/54295/7604a3d8-a0dd-52be-ff38-29796bb5ead9.png)

## 感想
お手軽にできていいですね！
Tabとかはまだ対応していないみたいです。

## 参考
[bootstrap-material-design](https://github.com/FezVrasta/bootstrap-material-design)

## 2014/11/03追記

[gemが提供されてました](https://github.com/Aufree/bootstrap-material-design)


### app作成
```zsh
rails new fuga
```

```diff:Gemfile
gem 'therubyracer',  platforms: :ruby
gem 'less-rails'
gem 'twitter-bootstrap-rails', github: 'seyhunak/twitter-bootstrap-rails', branch: 'bootstrap3'
gem 'simple_form', '~> 3.1.rc1'
+ gem 'bootstrap-material-design'
```

```zsh
% bundle
% rails g bootstrap:install less
% rails g simple_form:install --bootstrap
% rails g bootstrap:layout application fluid
% rails g scaffold Post title body:text
% rake db:migrate
% rails g bootstrap:themed Posts
% rails s
```

```diff:application.js
+//= require bootstrap-material-design
```

```diff:application.css
- *= require bootstrap-material-design/dist/css/material
+ *= require bootstrap-material-design
```
Java8のDateTimeFormatterで文字列を日時にパースする

JodaTimeを使わなくて良くなるのかなー。
28/Aug/2014:18:55:57 +0900
という文字列を変換する場合のサンプル。

```java:sample.java
public class TimeConverter {
  public LocalDateTime convert(String datetime) {
    // 月の省略形は変換マッピングを指定する必要あり
    Map<Long, String> monthMap = new HashMap<>();
    monthMap.put(1L, "Jny");
    monthMap.put(2L, "Feb");
    monthMap.put(3L, "Mch");
    monthMap.put(4L, "Apr");
    monthMap.put(5L, "May");
    monthMap.put(6L, "Jun");
    monthMap.put(7L, "Jul");
    monthMap.put(8L, "Aug");
    monthMap.put(9L, "Sep");
    monthMap.put(10L, "Oct");
    monthMap.put(11L, "Nov");
    monthMap.put(12L, "Dec");

    DateTimeFormatterBuilder formatterBuilder = new DateTimeFormatterBuilder();
    formatterBuilder.appendValue(ChronoField.DAY_OF_MONTH);
    formatterBuilder.appendLiteral("/");
    formatterBuilder.appendText(ChronoField.MONTH_OF_YEAR, monthMap);
    formatterBuilder.appendLiteral("/");
    formatterBuilder.appendValue(ChronoField.YEAR);
    formatterBuilder.appendLiteral(":");
    formatterBuilder.appendValue(ChronoField.HOUR_OF_DAY);
    formatterBuilder.appendLiteral(":");
    formatterBuilder.appendValue(ChronoField.MINUTE_OF_HOUR);
    formatterBuilder.appendLiteral(":");
    formatterBuilder.appendValue(ChronoField.SECOND_OF_MINUTE);
    formatterBuilder.appendLiteral(" ");
    formatterBuilder.appendOffset("+HHmm", "UTC");
    DateTimeFormatter formatter = formatterBuilder.toFormatter();

    return LocalDateTime.from(formatter.parse(datetime));
  }
}
メモ：NGUIのUILabelの文字送り

せっかく教えてもらったので埋もれないようにメモ
http://qiita.com/otmb/items/711efe39c4149a70ffa1

http://www.tasharen.com/ngui/docs/class_typewriter_effect.html


■普段はFalseにしておいて、セットする前にTrueにしないとダメっぽい！！

TypeWriterMode.enabled = true;

// 台詞をセット.
StoryText.text = "あいうえお"
cURL コマンドの読み方


スクレイピングしたり，APIを試しに叩いたりするときに curl コマンドを使うことってありますよね？

Wikipediaによると curlコマンドを開発しているプロジェクトの名前も cURL というらしく，このコマンドラインツールのcurlとライブラリとしてのlibcurlが主な成果物らしいです．

php, perl をはじめとして多くの言語にも libcurl をバインドした通信を行うための関数群があると思います．

さて，このよくお世話になっている curl ですがなんて読みますかね？```しーゆーあーるえる```？ ```かーる```？

ちなみに自分は ```しーゆーあーるえる``` 派でして，個人的には ```カール``` って聞くと，RIAプラットフォームの製品名を思いつきます．
http://www.curlap.com/


正しい読み方が気になったので調べてみると･･･[公式サイト](http://curl.haxx.se/docs/faq.html#What_is_cURL)で言及されていました．

```
We pronounce curl with an initial k sound. It rhymes with words like girl and earl. 
```

```k ではじまって，かつガールやアールのような感じで```とのことです（意訳）．つまり```カール```！！
ご丁寧に発音のwavファイルまで用意されてました．

```
This is a short WAV file to help you:

 http://media.merriam-webster.com/soundc11/c/curl0001.wav
```

というわけで正しくは```カール```ですね！

とはいえ，```ping``` を```ピン```といったり，```ピング```と言ったりするのと同様に周囲の人たちと通じる言葉を使っていきたいと思います．
Ubuntu14.04にgollumをインストール


Gitlabを使っていて、プロジェクト外のものもgollumで書き溜めて行きたいと思い、インストールしてみた。

インストール時にいろいろとうまくいかなかったけど、最終的には下記でインストールできた。

```
sudo apt-get install ruby ruby-dev make zlib1g-dev libicu-dev g++ libtiff5-dev
sudo gem install gollum
```

gollumの起動

```
gollum /hoge/gollum.git --allow-uploads --mathjax --port 80 2>/tmp/gollum.log &
```

```http://ipアドレス/``` でアクセスし動作確認

***
参考サイト

* [Ubuntu 14.04 server Gollum install steps](https://github.com/gollum/gollum/issues/834)
Browserify使ってる時に、newを使用してインスタンスを生成する


# これが本流？

```javascript:/path/to/models/user.js
module.exports = (function(){
  function User(){
    this.name = 'youkaiantena';
  }

  User.prototype.myName = function(){
    return this.name;
  };

  return User;
})();
```

```javascript:/path/to/app.js
var myClasses  = myClasses || {};
myClasses.User = require('./models/user');

var app  = app || {};
app.user = new myClasses.User('youkaiantena');

console.log(app.user.myName());
```

# やってみたけど色々とダメだと思われるやつら

## `new`したやつ返せば良いんじゃない？？

```javascript:/path/to/models/user.js
var User = (function(){
  function User(){
    this.name = 'youkaiantena';
  }

  User.prototype.myName = function(){
    return this.name;
  };

  return User;
})();

module.exports = (function(){
  return new User();
})();
```

```javascript:/path/to/app.js
var app = app || {};
app.user = require('./models/user')'

console.log(app.user.myName());
```

出来た！
が、そもそもダメだろこれは。。。

## `factory`メソッド追加して、それ呼んでみるとか？？

```javascript:/path/to/models/user.js
module.exports = (function(){
  function User(name){
    this.name = name;
  }

  User.prototype.myName = function(){
    return this.name;
  };

  User.prototype.factory = function(name){
    return new User(message);
  }

  return User;
})();
```

```javascript:/path/to/app.js
var myClasses  = myClasses || {};
myClasses.User = require('./models/user');

var app   = app || {};

app.user = myClasses.User.factory('youkaiantena');

console.log(app.user.myName());
```

ダメ。
prototypeに追加したメソッドが存在しない事になってた。
というか、なんでこれ考えたのか謎。。。

## factoryクラス作ってそっちで`new`したやつ返すとか？

文字列から動的にオブジェクト作んのどうやるの？？、、、evalしかないの？？
factoryクラス内でUserをnewしてみたら、そんなやつ知らないって言われた、、、

# 結論（とりあえず）

本流？と思われる形でやってく事にした。
何か良い方法あったら教えていただけるとありがたいです。
Exif付き画像の傾きを調整して表示したい

カメラで撮影した画像にExif付加されてて、プレビュー画面で90度回転しちゃってるよ。。
なんてことありませんか？私はあります。

そこで画像の扱いを勝手良くしてくれるライブラリ、UniversalImageLoader
キャッシュの管理や、読み込み時のアニメーションなどなど、便利機能満載です。

Exif付き画像も一つオプションを設定するだけて簡単に補正（90度回転してる画像は−90度回転してくれる、みたいなヤツ）してくれます。

```java:awesome

/* ... blahblah ... */

DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
        .showImageOnLoading(R.color.bsm_gray)
        .bitmapConfig(Bitmap.Config.RGB_565)
        .cacheInMemory(true)
        .cacheOnDisk(true)
        .imageScaleType(ImageScaleType.EXACTLY)
        .displayer(new FadeInBitmapDisplayer(100))
        .considerExifParams(true) // <- これ
        .build();

/* ... blahblah ... */
```

`considerExifParams(true)`をDisplayImageOptionsインスタンスを作るときに追加するだけです。

自力でExif読み込んで回転させるメソッドなりユーティリティクラスを作る前にUniversalImageLoaderを使うことを検討してみてはいかがでしょうか。
私はこのオプションに気が付かず、危うくユーティリティクラスを作りそうになりました(=^・^=)

メモ：実装はこんな感じ
https://github.com/nostra13/Android-Universal-Image-Loader/commit/0655534d0701b9e7f09c7d0738a1420cd49ce217#diff-3d05e83ea020774bcad1a52b1a5ea653R67
maven-release-pluginのいくつかの設定についてメモ


これもすぐ忘れるやつ. 公式ドキュメントの一部を意訳して保存しておく.

# mvn release:prepare

公式ドキュメント
http://maven.apache.org/maven-release/maven-release-plugin/examples/prepare-release.html
http://maven.apache.org/maven-release/maven-release-plugin/prepare-mojo.html

## このコマンドは何をするのか

* Check that there are no uncommited changes in the source
未コミットの変更が無いかチェックする

* Check that there are no SNAPSHOT dependencies
依存関係の中にSNAPSHOTの参照か無いかチェックする

* Change the version in the POMs from x-SNAPSHOT to a new version (you will be prompted for the versions to ues)
pomに書かれたバージョンをx-SNAPSHOTから新しいバージョンに変更する（バージョンは指定する事ができる）

* Transform the SCM information in the POM to include the final destination of the tag
（確認中…）

* Run the project tests against the modified POMs to confirm everything is in working order
変更後のpomで動作確認のためにテストを実行する

* Commit the modified POMs
変更されたpomをコミットする

* Tag the code in the SCM with a version name (this will be prompted for)
バージョン名で,SCMにタグを作成する

* Bump the version in the POMs to a new value y-SNAPSHOT (these values will also be prompted for)
pomのバージョンをy-SNAPSHOTに変更する（このバージョンも指定することができる）

* Commit the modified POMs
変更したpomをコミットする

### 補足

releaseVersionというパラメータを与えることで,リリースバージョンを指定できる.
同様に次の開発バージョンも,developmentVersionというパラメータで指定できる.

# mvn release:perform

公式ドキュメント
http://maven.apache.org/maven-release/maven-release-plugin/examples/perform-release.html
http://maven.apache.org/maven-release/maven-release-plugin/perform-mojo.html

## このコマンドは何をするのか

* Checkout from an SCM URL with optional tag
SCMから特定のタグ（のバージョン）をチェックアウトする

* Run the predefined Maven goals to release the project (by default, deploy site-deploy)
事前に定義されていたMavenのゴールを実行し,リリースを行う


こちらからは以上です.
Dockerコンテナからホストへファイルをコピーする

`docker cp`コマンドを使う場合にはまりそうなポイントがあるのでメモ

詳しくはこちら
http://docs.docker.com/reference/commandline/cli/#cp

## コンテナ⇒ホストへファイルコピーしてみる
`/test.txt`ファイルを作成するコンテナ立ち上げる

```bash
$ docker run -i -P centos:centos7 touch /test.txt
```

コンテナIDを調べ、`docker diff`コマンドで`/test.txt`が追加されたことを確認する
http://docs.docker.com/reference/commandline/cli/#diff

```bash
$ docker ps -al
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
3143f962866d        centos:centos7      touch /test.txt     8 seconds ago       Exited (0) 8 seconds ago                       hopeful_pare

$ docker diff 3143f962866d
A /test.txt
```

`docker cp`コマンドでコンテナ内の`/test.txt`をホストの`/test.txt`へコピー

```bash
$ docker cp 3143f962866d:/test.txt /test.txt
```

正しくコピーできたかどうかを確認

```bash
$ ls -al /
....
drwxr-xr-x   2 root root  4096 10月  2 14:49 2014 test.txt
....
```
ん？　あれ？

```bash
$ ls -al /test.txt/
-rw-r--r--   1 root root    0 10月  2 14:48 2014 test.txt
```

そう、、、`/test.txt`ディレクトリの中に`test.txt`がコピーされてしまうんです
ホスト側のパスはディレクトリだとはマニュアルには書いてない気がするんだけども。。。

再度、パラメータを変更し`docker cp`コマンドを実行し確認

```bash
$ docker cp 3143f962866d:/test.txt /
$ ls -al /
....
-rw-r--r--   1 root root    0 10月  2 14:51 2014 test.txt
....
```

めでたく目的の場所へファイルがコピーされました。
RSpec使ってERBに対するspecをどう書くか？

RSpec使ってERBに対するspecをどう書くのか模索してみて、最低限の書き方は自分なりに理解できたのでまとめておこうと思います。

## 自分の環境

こんな感じです

- 環境
  - Mac OS X 10.9.4
  - ruby 2.1.0
    - Rails 4.0.1
    - rspec-rails 2.13.1
    - factory_girl_rails 4.2.1

## 一応前提として

- RSpecの概念がざっくりわかってる
- RSpec使ったテストの実行方法を知ってる
- FactoryGirlでテストデータが登録済である

という感じで以下書いてます。

FactoryGirlのテストデータはこんなのを準備してあるということで説明していきます

```rb
FactoryGirl.define do
  # 一部省略
  factory :event do
    name 'サンプルイベント : サンプル１（北海道）'
    price_man 10000
    price_woman 8000
    price_boy 5000
    price_girl 4000
  end
end
```

## まずはひな形となるspecを生成する

app/views/events/show.html.erbというファイルがあったとします。その場合には以下のようにして、ひな形となるspecを作ります。

```shell-session
./bin/rails g rspec:view events show
```

spec/views/events/show.html.erb_spec.rbが自動的に生成されます

## show.html.erb_spec.rbを編集する

ひな形をベースにして、以下のように編集します。

```ruby
require 'spec_helper'

describe "events/show" do
  before do
    @event = FactoryGirl.build(:event)
    @event.save

  end

  it "イベント情報の名前の表示が行える" do
    assign(:event, @event)
    render :template => "events/show.html.erb"
    expect(rendered).to match /サンプルイベント : サンプル１（北海道）/
  end
```

編集が完了したら

```sh
./bin/bundle exec rspec spec/views/events/show.html.erb_spec.rb
```

という感じでテスト実行します。


レンダリングされたHTMLの中に**サンプルイベント : サンプル１（北海道）**という文字が含まれてるかどうかが to match /xxx/という所で評価されて、問題なければテストがパスするという感じになってます

## ハマった所

実際に自分が今仕事で関わってるものは、今回ここで示してるものと当然ことなってて、２つほどハマったことがあったのでそれをまとめておこうと思います。※まだ理解が浅いから、きっと近いうちにまた同じことでハマりそうなんで^^;

### before doの記述

このERBを呼び出すapp/controllers/events_controller.rbでのshowメソッドの処理は

```ruby
  def show
    @calendar = EventCalendar.new(@event, calendar_options(params[:year], params[:month]))
    # その他処理
  end
  # 中略
  private
  def calendar_options(year, month)
    {
      year: year,
      month: month
    }
  end
```

みたいな感じになっています。そのため、上記で書いた

```ruby
  before do
    @event = FactoryGirl.build(:event)
    @event.save

  end
```

というものだけでは、app/views/events/show.html.erbの描画をするのに必要なオブジェクトが不足してるため

```ruby
  before do
    @event = FactoryGirl.build(:event)
    @calendar = EventCalendar.new(@event, {year:2014, month:10})
    @event.save
  end
```

という処理が必要というのがすぐわからず地味にはまりました。

### to_match内の記述

RSpec使ってERBに対するspecをどう書いていいのかわからず、ひとまず

- [rspec-railsのview-specsの所](https://github.com/rspec/rspec-rails#view-specs)
- [Project: RSpec Rails 3.1](https://www.relishapp.com/rspec/rspec-rails/docs/view-specs/view-spec)

を参考にしてました。

後者のやつは3.x系の話っぽいけど、説明は自分としてはわかりやすく大枠はこれでつかめたのですが、to_match内の記述をどう書いていいのかさっぱりわかりませんでした。。

具体的には、こんなサンプルが上記サイトにあって

```ruby
require "rails_helper"

RSpec.describe "rendering the widget template" do
  it "displays the widget" do
    assign(:widget, Widget.create!(:name => "slicer"))

    render :template => "widgets/widget.html.erb"

    expect(rendered).to match /slicer/
  end
end
```

実際のERBにこんなのがあったとして、なんで、match /slicer/ ってなるのかが理解できませんでした。


```erb
<h2><%= @widget.name %></h2>
```

slicer っていうのがどっから出てきた単語かが最初すぐにわからなかったのと、match /xxx/ という記法って何だろうって疑問だったのですが、失敗したテストの画面を眺めていたら

「もしかして、match / 実際にHTMLとして描画される内容/ という意味なのか！」

と気づけて、そこからいっきに道が開けた感じになりました。
Struts2の自動型変換（アノテーション登録編）

# Struts2の自動型変換機能

Struts2では、Actionクラスのフィールドにリクエストパラメータが格納されます。このとき、フィールドの型をString以外にすると、Struts2は自動的にその型へ変換を試みます。

## Struts2標準で自動型変換を行える型

以下の型は、特に設定は不要です。

|型の分類|よく使う型|
|:---|:---|
|プリミティブ|int,long|
|数値|Integer,BigDecimal|
|配列|String[]|
|コレクション|List,Map|

これらの自動型変換は、Actionクラスのフィールドと、Actionクラスからネストしたフィールドに対しても有効です。

## 標準以外で型変換を行うには

次の方法があります。

1. xwork-conversion.properties に 自動型変換するクラスを宣言する
2. Actionクラスごとのpropertiesファイルまたはアノテーションで、フィールド別に型変換クラスを宣言する

前者の方法は [Struts2の自動型変換(2014 summer version)](http://qiita.com/alpha_pz/items/478f963b7d2d5e9e2da6) にて紹介しています。
今回は後者で、アノーテションを使った記載方法です。

## アノテーションで定義する

アノテーションで定義する方法は、Actionクラスに定義するか、またはActionクラスのフィールドからネストしたクラスにて定義します。

例えば、Actionクラスにパラメータを格納するフィールドを用意した場合は、次のようになります。

```java:SampleVO.java
@Conversion(
	conversions = {
		@TypeConversion(converter="lumi.converter.BigDecimalConverter" , key="age" )
	}
)
@Data
public class SampleVO implements Serializable {
	private String username;
	private BigDecimal age;
}
```

@TypeConversionがもつ属性は、次の2つを指定します。

|属性名|内容|
|:---|:---|
|converter|型変換の実装クラス名|
|key|フィールド名|

## 型変換が失敗した場合

フィールドの型変換が失敗した場合、Struts2は項目エラー(FieldError)として扱います。つまりValidationの1つですので、Validation定義をしておくと**型変換に失敗しても、入力値を復元して表示できます**。

先ほどの例に、Validationの記述を追加します。

```java:SampleVO.java
@Conversion(
	conversions = {
		@TypeConversion(converter="lumi.converter.BigDecimalConverter" , key="age" )
	}
)
@Validations(
	conversionErrorFields = {
		@ConversionErrorFieldValidator(fieldName="age" , key="age.type.mismatch" , repopulateField=true)
	}
)
@Data
public class SampleVO implements Serializable {
	private String username;
	private BigDecimal age;
}
```

@ConversionErrorFieldValidatorの属性に型変換のパラメータ、メッセージならびに repopulateField=trueを記載することで、元のパラメータを再描画します。
JSON のストリームを Ruby で reduce するコマンド書いた

2014-10-03 03:30 追記
jr として gem にして公開しました。

* [jq 風に Ruby で JSON をフィルタするツール jr を作った](http://blog.yuyat.jp/archives/2533)
* [GitHub: yuya-takeyama/jr](https://github.com/yuya-takeyama/jr)

---

最近はログをとりあえず行指向の JSON に保存している、という方も多いと思います。
そしてそれを [jq](http://stedolan.github.io/jq/) でフィルタしたりしている方も多いことでしょう。

問題はその結果に対して、何らかの集計処理を行いたいときです。
jq も `reduce` サポートしているようなのですが、どうやって書いていいかわからない。
というか、Ruby で書きたい。

そう思って、以下のようなコマンドを作ってみました。
仮に `reduce-json` と名づけます。
なお、この Ruby スクリプトのライセンスは The MIT License とします。

```rb
#!/usr/bin/env ruby
require 'yajl'

inputs = ARGV[2] ? ARGV[2..-1].map {|f| open f } : [STDIN]

json_enumerator = Enumerator.new do |yielder|
  inputs.each do |input|
    Yajl::load(input) do |d|
      yielder.yield d
    end
  end
end

puts Yajl::Encoder.encode(eval "json_enumerator.reduce(#{ARGV[0]}) #{ARGV[1]}")
```

Yajl が `Enumerable` を返してくれなくてちょっと困ったのですが、あっさり解決できました。
Ruby 凄い。

## 使い方

まずは上記の Ruby スクリプトを `reduce-json` として保存して、`chmod +x` します。

以下のようなアクセスログがあるとして、そこから各ユーザのアクセス数を集計してみましょう。
これを `access_log.json` として保存したとします。

```json
{"user_id":1,"path":"/"}
{"user_id":2,"path":"/home"}
{"user_id":3,"path":"/my"}
{"user_id":1,"path":"/articles"}
{"user_id":1,"path":"/home"}
{"user_id":3,"path":"/"}
{"user_id":2,"path":"/articles/1"}
{"user_id":4,"path":"/my"}
{"user_id":1,"path":"/"}
{"user_id":2,"path":"/"}
```

そして以下のコマンドを実行します。
コマンドの第一引数が `Enumerable#reduce` の第一引数 (つまり初期値) で、第二引数はコードブロックです。
入力は第三引数にファイル名を渡すこともできますし、パイプから標準入力を受け取ることもできます。

```
$ ./reduce-json '{}' '{|acc, log| user_id = log["user_id"]; acc[user_id] = 0 unless acc[user_id]; acc[user_id] += 1; acc }' access_log.json
{"1":4,"2":3,"3":2,"4":1}
```

各ユーザごとのアクセス数が JSON として取得できました。
結果は JSON なので、`jq` に渡すこともできます。

```
$ ./reduce-json '{}' '{|acc, log| user_id = log["user_id"]; acc[user_id] = 0 unless acc[user_id]; acc[user_id] += 1; acc }' access_log.json | jq '.'
{
  "1": 4,
  "2": 3,
  "3": 2,
  "4": 1
}
```

簡単なスクリプトですが、UNIX 哲学にもとづいたクールなツールっぽいですね。

## 配布について

せっかくなので週末にでも Gem として配布できる状態にしておこうと思います。
それまでに、こういう実装がいいんじゃないかとか、こういうオプションが必要なんじゃないかとかあったらコメントください。
あと名前とか。
AWS初心者でも出来るDeep Security as a Service(DSaaS)にAWS EC2インスタンスを登録する方法

どもども、IT業界3ヵ月目、ケンイちです。
Deep Security as a Service(DSaaS)にAWS EC2インスタンスを登録する機会があったので、自分なりに手順を纏めてみました。

---

### 準備編
-
#### AWSのSecurityGroupの設定
DSaaSにインスタンスを登録するには、まずAWSのSecurityGroupの設定をさわる必要があります。
何をするのかというと、TCP4118のポートを解放。
これは、Deep Security Managerから、Deep Security Agent / Deep Security Virtual Appliance / Deep Security Relayへ通信するために4118のポートを開ける必要があるからです。
じゃあ、早速SecurityGroupをさわってみましょう。


#### AWSにログインし、EC2のDashboardにあるSecurity Groupsを選択し、InboundのEditを行います。
![Security Group.png](https://qiita-image-store.s3.amazonaws.com/0/55533/b8645e38-fa39-8503-6de7-47aeded2dabf.png)


#### DSaaSに登録するインスタンスのSecurity GroupsをTCP4118を解放したSecurity Groupsに変更します。
1. EC2のDashboardにあるInstancesをクリック
2. DSaaSに登録するインスタンスを選択
3. ActionsからChange Security Groupsを選択
4. TCP4118を解放したSecurity Groupsを選択

![Change Security Group.png](https://qiita-image-store.s3.amazonaws.com/0/55533/7199400f-6737-049e-474c-6fc82d71cde6.png)
これで、インスタンスをDSaaSに登録する準備が整いました。


### DSaaS編
-
では、DSaaSをさわってみましょう。
#### DSaaSへの登録
DSaaSのページ (http://www.trendmicro.com/us/business/saas/deep-security-as-a-service/) を開くと「Free trial」があるので、クリックして登録！
![Free trialポチ.png](https://qiita-image-store.s3.amazonaws.com/0/55533/2c22adde-d25e-c5fe-f9c1-b4e10857624d.png)


別窓が開くので入力！(言語は日本語が選択できますね。)
![Free trial入力.png](https://qiita-image-store.s3.amazonaws.com/0/55533/be30e63d-66a6-1dee-3795-476af1de47c8.png)
登録が完了したら、メールが飛んできます。（私は5分後くらいにメールが届きました。）

#### DSaaSへのサインイン
では、実際にDSaaSにサインインしてみましょう！
サインインページ (https://app.deepsecurity.trendmicro.com/SignIn.screen?session=invalidate) へ移動し、サインインします。
![サインイン.png](https://qiita-image-store.s3.amazonaws.com/0/55533/9a6eed6d-989c-d321-8323-6b6c189e815d.png)


サインインできたら上部メニューからコンピュータを選択しましょう
![選択.png](https://qiita-image-store.s3.amazonaws.com/0/55533/2a9616ca-9cb5-8938-d49f-df2ba63154ed.png)


ここで、インスタンスを登録していくので、新規〜新規コンピュータを選択しましょう。
![新規ポチ.png](https://qiita-image-store.s3.amazonaws.com/0/55533/dcfdd309-4a14-3dff-881f-ad12cc220676.png)


そうすると、ホスト名の入力と、ポリシーの選択を求められます。
ホスト名は、上記で設定したインスタンスのPublic DNSを入力します。
ポリシーについては、一旦Base Policyを選択しました。


順々に進めていくと、登録が完了され、コンピュータに追加したインスタンスが表示されます。
![登録完了.png](https://qiita-image-store.s3.amazonaws.com/0/55533/97f7774b-6e7c-bcd2-ca44-e460021faaad.png)


これで、DSaaSにインスタンスを登録することができました。

---

### まとめ
-
正直、最初は何をどうすれば良いのかサッパリ分かりませんでした。
DSaaSの日本語ページではアカウントの作成もサインインも出来ませんでしたから。
USのページを見つけるまで、とてもイライラしたのを覚えています笑
おそらくガイドも英語のみで、日本語のものは未だ用意されていないのでしょう。
※ もしかしたら日本語のページはあって、発見できていないだけかもしれませんが、、、
ですが、DSaaSのアカウント作成/ログインが完了したら、とても簡単にインスタンスを登録することができました。

引き続き、DSaaSを色々と弄っていきたいと思います。
Unity+VuforiaがiPhone6+でクラッシュする


## 症状

Unity4.5.4 & Xcode6.0.1の環境で、Vuforia(AR用アセット）を使ったプロジェクトをiPhone6+で実行しようとしたところ、アプリの起動途中にクラッシュする。

## 解決方法

Xcode上で、Info.plistにUIInterfaceOrientationキーを追加すると良いらしい。

>参考： https://developer.vuforia.com/forum/unity-3-extension-technical-discussion/unity-454-and-vuforia-ios

![スクリーンショット 2014-10-02 14.36.45.png](https://qiita-image-store.s3.amazonaws.com/0/20722/750636bf-7275-819a-1ddc-ccdc4c475cfd.png "スクリーンショット 2014-10-02 14.36.45.png")

Info.plistをダブルクリックして表示したら、どのキーでもよいのでマウスオーバーすると、"+"と"-"ボタンが表示されるので"+"をクリック。

![スクリーンショット 2014-10-02 14.38.07.png](https://qiita-image-store.s3.amazonaws.com/0/20722/f08fcf48-a5c4-2529-1836-f49e84fd87dc.png "スクリーンショット 2014-10-02 14.38.07.png")

キーの値に、UIInterfaceOrientationを入力する。

![スクリーンショット 2014-10-02 14.37.43.png](https://qiita-image-store.s3.amazonaws.com/0/20722/87cb1887-1ca2-7fb8-667e-54ba49f1b938.png "スクリーンショット 2014-10-02 14.37.43.png")

あとは、右端にある上下の三角をクリックすると、選択できる項目が表示されるので、アプリにあったものを選択すれば、クラッシュしなくなる。
PHP7調査(2)コンパイル時にASTを構築するようになった

PHP7から内部的にAST（抽象構文木）が実装されるよ！とのこと。反対票ゼロでPHP7への採用が決まっています。

https://wiki.php.net/rfc/abstract_syntax_tree

## 構文解析とコンパイルの分離

PHPでは構文解析にYACCを利用しています。YACCでの構文解析は、概念的には構文木を辿るような処理なのですが、これまでのPHPでは実装として木構造を構築することはせず、構文解析をしながら即座にopcodeを作り出すような処理をしていました。

このようなつくりが原因で、これまでのPHPではYACCレベルの文法が冗長になったり、PHP文法に一見無意味な制約ができたりしていました。

PHP7からは一度ASTを作りあげてからopcodeの生成を行うため、パーサーや最適化の実装がシンプルになって保守性が上がったり、これまで技術的な理由で不可能だったスマートな文法が導入しやすくなると期待できます。

ソースコードを見たい方のために実装箇所も紹介しておきます。現時点では、`Zend/zend_language_parser.y`でASTを作り、それを元に`Zend/zend_compile.c`の`zend_compile_top_stmt()`でopcode生成するという処理になっています。

## OPcacheとの関係

いまのところ、コンパイル時に作られるASTはOPcacheの最適化フェーズとは完全に切り離されています。OPcacheがopcodeの最適化をする時点では、コンパイル時に作ったASTは破棄されているようです。

OPcacheの最適化処理でASTが使えれば今より高度な最適化ができるはずなので、少しもったいない気がします。

## 今後の可能性

ASTをuser landから見えるようにするextensionも作れるよね、なんて話も出ています。PHP7公開までに間に合うといいですね。

もしこれが作られると、文法チェッカなどのツールが発達する可能性がありそうです。これまでも[nikic/PHP-Parser](https://github.com/nikic/PHP-Parser/)のようにPHPレイヤでASTを作る試みはありましたが、あまり使われていない印象があります。PHPの標準関数としてサポートされれば可能性が広がるのではないでしょうか。
【備忘録】Swiftでアプリからサファリを起動する方法

初投稿だから投稿の仕方や記事の書き方を間違えていたらすみません。
自分用備忘録です。
Objective-Cでアプリからサファリを起動する方法はいろいろと見つかるけど、Swiftでは見つからなかったのでメモ。たぶん私の検索能力が低いだけで、すでに書いてらっしゃる方はいると思いますが。。。


```
    let url = NSURL(string:"http://qiita.com")
    let app:UIApplication = UIApplication.sharedApplication()
    app.openURL(url)
```

これだけです。