OmniAICreator/Qiita-1.07M huggingface dataset:
Mahout in Action - Recommender Memo

###introduction
Mahout in Action の第1章レコメンデーションを読んで、
実装するのに必要なクラス,メソッド等をあげた。
このレベルでの理解で実装がいろいろ試せそう。

##DataModel
* FileDataModel(File);
* GenericBooleanPrefDataModel(GenericBooleanPrefDataModel.toDataMap(FileDataModel(File)));
* GroupLensDataModel(File);
* PlusAnonymousUserDataModel ... ラッパークラス

##DataModelBuilder
* buildDataModel(FastByIDMap<PreferenceArray>); ... 内部実装を必要とする

##UserSimilarity
* CachingUserSimilarity ... ラッパークラス
* PearsonCorrelationSimilarity(DataModel); ... cos類似度も兼ねている
* PearsonCorrelationSimilarity(DataModel, 閾値);
* EuclideanDistanceSimilarity(DataModel);
* LogLikelihoodSimilarity(DataModel);
* SpearmanCorrelationSimilarity(DataModel);
* TanimotoCoefficientSimilarity

######ItemSimilarity

##UserNeighborhood
* NearestNUserNeighborhood(近傍ユーザ数, UserSimilarity, DataModel);
* ThresholdUserNeighborhood(閾値, UserSimilarity, DataModel);

##Recommender
* GenericUserBasedRecommender(DataModel, UserNeighborhood, UserSimilarity);
* GenericItemBasedRecommender(DataModel, ItemSimilarity);
* SlopeOneRecommender(DataModel);
* SVDRecommender(DataModel, ALSWRFactorizer); ... ALSWRFactorizerについては説明なし
* refresh(null); ... 再読み込み、再計算、状態の更新
* recommend(long ユーザID, int 推薦個数);
* recommend(long ユーザID, int 推薦個数, IDRescorer);

##RecommenderBuilder
* buildRecommender(DataModel); ... 内部実装を必要とする

##RecommenderEvaluator
* AverageAbsoluteDifferenceRecommenderEvaluator();<br>
... 実際の値から推定値の差をそれぞれのアイテムで算出し、平均を取る
* evaluate(RecommenderBuilder, null, DataModel,<br> 全体に対して何割を学習データに当てるか, 評価させるデータの割合);
* RMSRecommederEvaluator(); ... 二乗平均平方根(差を二乗した平均の平方根を取る)

##RecommenderIRStatsEvaluator
* GenericRecommenderIRStatsEvaluator();

##IRStatistics
* RecommenderIRStatsEvaluator.evaluate(RecommenderBuilder, null, DataModel, null, TopN, 閾値, 1.0);
* getPrecision();
* getRecall();

##Preference
* GenericPreference(long ユーザID, long アイテムID, float 評価値);

##PreferenceArray
* GenericPreferenceArray(ユーザ数);
* setUserID(リファレンスID, long ユーザID);
* setItemID(リファレンスID, long アイテムID);
* setValue(リファレンスID, float 評価値);
* get(プリファレンスID);

######FastByIDMap
######FastIDSet

######LoadEvaluator.runLoad(Recommender);
######RandomUtils.useTestSeed(); ... 常に同じ結果を再現
Launch Arguments を使った一つ上の NSLocalizedString

12/16 の記事を [@jarinosuke](https://twitter.com/jarinosuke) が書かせて頂きます。

# Localization

多言語対応のアプリを作る時に大変になるのが、全ての言語リソースが用意できた後で、それらを適用したアプリのテストやデバッグです。
大抵の言語は英語より長くなってしまうので、文言が予期せぬかたちで truncate されたりビューのレイアウトが壊れていたりと、単純に言語リソースを用意すれば御終いというわけではありません。
そこで今回は多言語対応を行う際の助けになるであろう手法の一つとして、Launch Arguments を用いた賢いデバッグ方法を紹介します。

# Launch Arguments とは？
![launch_arguments.png](https://qiita-image-store.s3.amazonaws.com/0/4085/390eed52-7727-909a-153c-7bd859fbaa87.png)

Launch Arguments を設定することでアプリの実行中のみ、指定した argument で現在の設定状態を上書きしてくれます。
デバッグやテスト時などに設定をすることで効果を発揮します。
設定は Xcode の Scheme 毎に行うことが出来ます。
具体的な方法はプロジェクトを開いて、左上の Scheme 選択ドロップダウンメニューから Edit Sceheme… を選択します。
指定は先頭に-を置き、そのキー名をスペースを入れずに指定、その後スペースを一つ開けた後に渡したい値を設定します。
Core Data の SQL 出力などがLaunch Argumentsでは有名ですが、実は NSLocalizedString でも便利なものが隠されています。 

# Arguments

3つほど Localization に関する argument を紹介します。

## AppleLanguages
他言語リソースでの表示を確認する時に、実機や iOS Simulator の設定から言語を切り替えていませんか？

```
-AppleLanguages (ja)
```

上記の用に()内に確認したい言語を指定することで、iOS の設定とは独立して言語リソースを設定することが出来ます。

## NSDoubleLocalizedString

プロジェクト開始当初は仕様書には英語や日本語で記されているだけで 、多言語リソースは揃っていないのが普通だと思います。
しかし英語や日本語だけを考えてビューのレイアウトを考えてしまうと、いざ多言語リソースが来た時に大変な事になりかねません。
そんな懸念に対して、 NSDoubleLocalizedString が面白い仕組みを提供してくれています。

```
 -NSDoubleLocalizedString YES
```

上記のように設定すると、NSLocalizedString で設定している文言全てが2倍の長さに変更されます。
これにより、プロジェクト開始時から多言語リソースを想定した2倍の長さの文言にまでは対応できます。

## NSShowNonLocalizedString

多言語対応するうえで、一番怖いのが言語リソースの抜け落ちです。
言語リソースの準備は担当する開発者以外が行う事が多く、受け取ったExcelなどのファイルを Localizable.string に反映したりすることが多いと思われます。
そのような行程が多いせいか、特定言語のみ文言に Localizable.string のキー名がそのまま露出してしまう事故が起きたりする事もあります。
厄介なのがアルファベットだけで構成され意味が分からない言語同士だと、目で確認してもなかなか抜け漏れに気付きにくい点です。

```
-NSShowNonLocalizedString YES
```

上記のように設定すると、抜け落ちている文言を全て大文字にして表示してくれます。なので既に設定されている文言よりは目立つようになり気付きやすいというわけです。
しかし、そもそもの Localizable.string の key を全て大文字で定義してしまっていると、全く効果は得られません笑。

# まとめ

上記のように Localization のための便利な機能も提供されているので、積極的にグローバルなアプリケーションを作って行きましょう。
ちなみに Localization のための Mac アプリもいくつかあり、僕は [Linguan](http://www.cocoanetics.com/apps/linguan/) を使っていますが非常に便利なのでオススメです。

# 参考
[iOS Debugging Magic(Apple Documentation)](https://developer.apple.com/library/ios/technotes/tn2239/_index.html)
[Launch Arguments & Environment Variables(NSHipster)](http://nshipster.com/launch-arguments-and-environment-variables/)
Microsoft Visual Studio Express 2013 for Windows Desktop で初VB！

[Microsoft Visual Studio Express 2013 for Windows Desktop](http://www.microsoft.com/ja-jp/download/details.aspx?id=40787)触ってみた。


Microsoft Visual Studio Express 2013 for Windows Desktopで作成したexeはXPでは実行できない
---------
* .Net Framework 4.5 が[XPにインストール出来ない](http://fnya.cocolog-nifty.com/blog/Windows-Live-Writer/dotNETFW.png)ため実行できない。
  * と思うのですが、ビルドオプションでランタイムバージョンの指定とかで動く気もする。


コマンド実行
---------

```vbnet:
' PATH指定の\は\\ではなく\です。
Dim strCmd = "explorer.exe c:\"
Dim style = AppWinStyle.NormalFocus
Shell(strCmd, style)
```


IE起動
---------

```vbnet:
Dim IE
IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.Navigate("http://google.co.jp")
```

文字のエスケープ
---------

```vbnet:"を""でクォートする
Dim strCmd = "cmd.exe /k echo ""も じ"""
Dim style = AppWinStyle.NormalFocus
Shell(strCmd, style)
```
zsh で Git リポジトリのトップレベル ディレクトリに cd するプラグイン

Git リポジトリの中にいるときに、トップレベルのディレクトリに移動したくなることがある。それを1回のコマンドで簡単にできるようなプラグインを作ったので紹介する。


### このプラグインでできること

[cd-gitroot](https://github.com/mollifier/cd-gitroot) というプラグインを作った。これをインストールすれば `cd-gitroot` というコマンドが使えるようになる。

使っている様子はこんな感じ。

```zsh
# こんな感じで Git リポジトリの中にディレクトリがあったとする
# doc/
# src/
#   |-scripts/
#   `-web/

% cd /home/mollifier/git_repo
% cd src/web
% pwd
/home/mollifier/git_repo/src/web
# リポジトリの奥の方にいる時でも、すぐにトップに移動できる
% cd-gitroot
% pwd
/home/mollifier/git_repo

# 引数を指定するとリポジトリトップからの相対的なパスに移動できる
% cd-gitroot src/scripts
% pwd
/home/mollifier/git_repo/src/scripts

# タブで相対的なパスが補完できる
% cd-gitroot [TAB]
doc/  src/
% cd-gitroot src/[TAB]
scripts/  web/
```


### インストール

まず [https://github.com/mollifier/cd-gitroot](https://github.com/mollifier/cd-gitroot) から cd-gitroot, _cd-gitroot と2つファイルを取ってきて $fpath の通ったところに配置する。その後に `.zshrc` で `autoload` すれば OK。

例えば `$HOME/zsh/functions/cd-gitroot` の下に配置したい場合はこんな感じ。

```zsh
% cd $HOME/zsh/functions
% git clone https://github.com/mollifier/cd-gitroot.git cd-gitroot

# または $HOME/zsh/functions/cd-gitroot ディレクトリを作成して、
# その下に cd-gitroot, _cd-gitroot を置く
```

`~/.zshrc` にこんな感じで書く。

```zsh:.zshrc
fpath=($HOME/zsh/functions/cd-gitroot(N-/) $fpath)

autoload -Uz cd-gitroot
alias cdu='cd-gitroot'
```

最後の `alias` は必須じゃないけど設定しておくと便利(元の名前が長いので)。好きな名前で alias を貼っておこう。

注意としては、`fpath` を設定するところは `autoload -Uz compinit` とやってるとこより前に書くこと。そうじゃないとこのプラグインの補完がうまく動かなくなる。


### 使い方

Git リポジトリの中に入って `cd-gitroot` と打てばリポジトリのトップに移動できる。
引数を指定したらリポジトリトップからの相対的なパスに移動する。
引数のディレクトリはタブで補完できるので、リポジトリの奥の方にいる時でも簡単に他の場所に移動できる。

### 謝辞

このプラグインの元ネタは [id:hitode909](http://hitode909.hatenablog.com/) さんのブログ記事です。

[Gitのリポジトリのトップレベルにcdするコマンド](http://hitode909.hatenablog.com/entry/20100211/1265879271)

タブで補完できたらもっと便利になると思ったので改めてプラグインとして書きました。hitode909 さん、ありがとうございました!
Perltidyで一括置換


例) プロジェクト配下のcgi, pmを一括置換したい。

```sh
find . -name '*.cgi' -o -name '*.pm' | sed 's/.*/perltidy & > &.tdy \&\& mv &.tdy &/' | sh
```

免責:
パーミッションが変わってしまう。。
#perl crashed

Confirmed my OSX's Perl 5.12 and 5.16 has been crashed.

```pl
sub permute (&@) {
	my $code = shift;
	my @a = @_;
	$code->(@a);
}
permute{
	my $a=join('');
	permute{
		my $b=join('');
	}@$a{'hello'}[0];
}split('',@$a{'world'}[0]);
```
Phalconプロジェクト環境で対話シェル

Phalcon に限った話では無いのですが、デバッグ作業やモデルを直接操作して確認したいことがあるとき、PHP の対話シェルがとても便利です。

## PHP の対話シェルとは

↓こんな感じで操作できます。

```php:対話シェル
[user@host ~]$ php -a
Interactive mode enabled

php > echo "Hello, world!\n";
Hello, world!
php > 
```

こんな環境で、Phalcon プロジェクトのモデルやら何やらが直接操作できたらデバッグ作業が捗る、というお話です。

## 使える条件

PHP 5.1.0 以降で、コンパイルオプション `--with-readline` を付けてコンパイルされた PHP 環境

> これが選択できない場合、PEAR で導入できる [php shell](http://jan.kneschke.de/projects/php-shell/) をインストールして使うという方法もあります。

## Phalcon プロジェクト環境で使う

↓例えばこんな塩梅で書いたモデルを直接いじり倒したい

```php
php > $user = Users::findFirst(1);
php > echo $user->getUsername() . "\n";
sukobuto
php > echo $user->setEmail("sukobuto@gmail.com")->save() ? "OK\n" : "NG\n";
OK
php > 
```

という場合、Phalcon なら 設定・ローダー・サービス の3兄弟を読みこめば OK です。
たとえば↓のような読み込みスクリプトを置いておきます。

```php:app/shell.php
/**
 * Read the configuration
 */
$config = include __DIR__ . "/config/config.php";

/**
 * Read auto-loader
 */
include __DIR__ . "/config/loader.php";

/**
 * Read services
 */
include __DIR__ . "/config/services.php";
```

次のように読み込みます。 
また phalcon.so 等を正しく読み込むため、必ず php.ini を指定します。

```shell-session:対話シェルの起動と3兄弟読み込み
[user@host app]$ php -c /etc/php.ini -a
Interactive mode enabled

php > include "shell.php";
php > 
```

## めんどくさがりなあなたは

これだけ置いとけばいいスクリプトを用意しました。
Linux を使っている場合、以下のスクリプトを `app` 配下に置きます。

```bash:app/shell.sh
#!/usr/bin/expect

set timeout 5
spawn php -c /etc/php.ini -a
expect "php > "
send "\$config = include __DIR__ . \"/config/config.php\";\n"
send "include __DIR__ . \"/config/loader.php\";\n"
send "include __DIR__ . \"/config/services.php\";\n";
interact
```

> php.ini の場所が異なる場合はちゃんと書き換えましょう

このスクリプトは `expect` というシェルプログラムで実行されます。
インストール済みでない場合はインストールしましょう。

```shell-session:expectインストール
[user@host app]$ sudo yum install expect
```

```shell-session:実行権限もお忘れなく
[user@host app]$ chmod 700 shell.sh
```

起動すると...

```php
[user@host app]$ ./shell.sh
spawn php -c /etc/php.ini -a
Interactive mode enabled

php > $config = include __DIR__ . "/config/config.php";
php > include __DIR__ . "/config/loader.php";
php > include __DIR__ . "/config/services.php";   // ここまで自動！！
php > 
```

オートローダも問題なく動作します。
心置きなくいじり倒しましょう。

> コメントを下さった localdisk さんの影響でスクリーンキャストを撮ってみました。

![スクリーンキャスト](http://gifzo.net/UbVplOgIYD.gif)

## その他の環境 (CakePHP, Symfony2, etc...) について

よくわかりません。
Phalcon は DI コンテナがシンプルで単純に読みこめばできたので簡単でしたが、ほかのフレームワークだとどうなるのでしょうか...
AtCoder Regular Contest #002 のC問題


hi!
Come to think of it, no one has written in English, but I wonder if scolded?

と英語で書き続けようかとも思ったんですが無理すぎたので諦め。
[http://arc002.contest.atcoder.jp/tasks/arc002_3]
(http://arc002.contest.atcoder.jp/tasks/arc002_3)
ARC #002はもう去年の5月なので結構な昔なのです。なのです。ただ、今夜解き直したら当時の回答が謎の書き方だった割に処理速度負けてて恥ずかしくて死んでしまいたくなりました。

```python:新しい回答.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import sys
import io
import re
import math
 
N=int(raw_input())
c=raw_input()
chk=['AA','AB','AX','AY',
     'BA','BB','BX','BY',
     'XA','XB','XX','XY',
     'YA','YB','YX','YY']
cnt=1000
for i in chk:
    c2=c.replace(i,'L')
    for j in chk:
        c3=c2.replace(j,'R')
        cnt=min(cnt,len(c3))
print cnt
```

chkのリストの中からもれなくLやRに置換しようとしているので2重ループの1周目はiでAAをLに置換したのにjでもAAを探して次にAが残っているかにかかわらずAB、AXと探しに行きます。時間やメモリ制限が緩いおかげでAC通りますね。はい。

では下が1年半前ころに書いたものです。

```python:昔の回答.py
import sys
 
M=raw_input()
N=raw_input()
x=[]
 
N2=N.replace('AA','L');N3=N2.replace('AB','R');x.append(len(N3))
N2=N.replace('AA','L');N3=N2.replace('AX','R');x.append(len(N3))
N2=N.replace('AA','L');N3=N2.replace('AY','R');x.append(len(N3))
N2=N.replace('AA','L');N3=N2.replace('BA','R');x.append(len(N3))
N2=N.replace('AA','L');N3=N2.replace('BB','R');x.append(len(N3))
N2=N.replace('AA','L');N3=N2.replace('BX','R');x.append(len(N3))
#
#ここの間も本気で全組み合わせ列挙してます。本当に。
#
N2=N.replace('YA','L');N3=N2.replace('YY','R');x.append(len(N3))
N2=N.replace('YB','L');N3=N2.replace('YB','R');x.append(len(N3))
N2=N.replace('YB','L');N3=N2.replace('YX','R');x.append(len(N3))
N2=N.replace('YB','L');N3=N2.replace('YY','R');x.append(len(N3))
N2=N.replace('YX','L');N3=N2.replace('YX','R');x.append(len(N3))
N2=N.replace('YX','L');N3=N2.replace('YY','R');x.append(len(N3))
N2=N.replace('YY','L');N3=N2.replace('YY','R');x.append(len(N3))
 
x.sort()
print x[0]
```

手書きで全組み合わせ列挙したのにLで置換した組合せを平気でRでも探しに行ってますね。何をこんなに頑張って書いたんだろうか
GUIアプリケーションの設計：MVVMについて

#MVVMをFormsに適応してみる

##前置き
+ GUIのアプリケーションを作るけど、いつも何か綺麗にコードがまとまらない
+ 画面周りの処理のトラブルがよく発生する

ってことでそろそろちゃんとGUIのパタンを導入してみよう！
対象の環境は、「C# / Forms」
まずは名前がカッコ良いMVVMやってみよー！

##MVVMとは？
GUIを持つアプリケーションを実装するためのパターンである。
MVC(Model・View・Controller)の派生パターンで
MVVM(Model・View・ViewModel)というふうにクラス分けを行う。
WPFで採用されているのが一般的だと思われるが、
今回はFormsのソースに対応させてみる。

##MVVMがやりたいこと
+ View(画面表示処理)とModel(画面表示以外のロジック処理)のコードを疎結合にしたい
+ Viewはユニットテストしづらいため、極力Viewのコード量を減らしたい

##登場人物説明

### Model
+ アプリケーションを作ったきっかけである本来のやるべきこと(ドメイン：問題解決処理)を行う
+ コマンドのこと？

**例）** 掲示板サーバと通信して、スレッド情報を取得したり、レスを書きこんだりする

### View
+ ViewModelを持つ
+ ViewModelが持つプロパティを画面に表示する
+ 画面のイベント(マウスクリックなど)からViewModelが持つコマンドを実行する
+ コマンドを実行後、ViewModelが持っているデータが変化するため、画面更新する

**例）** スレッドビューワ・ボタンなどの配置を決め、ViewModelの処理結果を表示する

### ViewModel

+ いろいろなコマンドを持つ
+ INotifyPropertyChangedを継承する
画面表示用データが変更されたらPropertyChangedEventArgsイベントを実行する

**例）** スレッド更新 / レス書き込みコマンドなど

操作のイベント(クリック、ショートカット入力)からコマンドを実行する
コマンド・・・ICommandインターフェイス(System.Windows.Input名前空間)を実装したクラス

System.Windows.Inputを使うため、「PresentationCore.dll」を参照に追加する

参考・・・[第6回　「コマンド」と「MVVMパターン」](http://www.atmarkit.co.jp/ait/articles/1011/09/news102.html)

##FormsのDataBindの方法
webBrowser.DataBindings.Add("DocumentText", viewModel, "DocumentText");
コントロール.DataBindings.Add(コントロールのプロパティ名, viewModel, viewModelのプロパティ名);

##処理の流れ
`View ⇒(メソッド呼び出し)⇒ ViewModel ⇒(メソッド呼び出し)⇒ ICommand.Executeを実行`
`ICommand ⇒ (NotifyPropertyChanged) ⇒ ViewModel ⇒ (NotifyPropertyChanged) ⇒ View(データバインドで画面の表示が変わる)`

#実装してみた感想
##良かったこと
+ この流れが結構綺麗にまとまっていてModel処理を切り離せられたのがよかった

　　`View → ViewModel ⇔ Model`

+ ViewModelにプロパティと操作がまとまってるから、ユニットテスト組みやすそう

##良く分らなかったこと
+ コマンド(Model)実行後の結果をどうやってViewModelに返すか良く分らなかったので、Model→ViewModel→View　どちらともPropertyChangedで対応した

##ダメだったこと
+ DataBindをWebBrowserに対して行うと、よく分らないタイミング(フォーカスがあたったタイミング？)でドキュメント更新されてしまう
　あんまりDataBind信じれない
+ 結局、Viewが肥大化してしまった
　→　DataBindが使いこなせないこともあって、「描画処理」をViewにゴリゴリかいてしまったことが原因

##参考ソース
[実装してみたソース①](https://github.com/shule517/WPF-MVVM-Sample)
[実装してみたソース②](https://github.com/shule517/PeerstPlayer/archive/MVVM.zip) src\PeerstViewerフォルダが対象
VagrantでAnsibleのPlaybookを作るためのローカル環境を作る


## 環境

* Mac OS X 10.9 (ホストOS)
* Ansible 1.4.1
* VirtualBox 4.3.4
* Vagrant 1.4.0
* Ubuntu 12.04 LTS (Precise) 64bit (ゲストOS)


## 手順

## Ansibleをインストールする

ホストOS上にインストールします。 pip は、MacでHomebrewな環境であれば、`$ brew install python` を実行すればPythonと一緒にインストールされます。

```bash:(ホストOS)
$ sudo pip install ansible
```


### ゲストOS (Ubuntu)のセットアップを行う

```bash:(ホストOS)
$ mkdir vagrant-ansible
$ cd vagrant-ansible
$ vagrant init precise64 http://files.vagrantup.com/precise64.box
```

これで `Vagrantfile` がカレントディレクトリに生成されます。


`$ ssh 192.168.33.10` のようなコマンドでSSHログインできるようにVagrantfileを編集します。

```ruby:Vagrantfile(ホストOS)
config.vm.network :private_network, ip: "192.168.33.10" # この行のコメントを外す
```

`vagrant up` します。

```bash:(ホストOS)
$ vagrant up
```

ホストOSの `~/.ssh/config` に以下を追記します。

```bash:~/.ssh/config(ホストOS)
Host 192.168.33.*
IdentityFile ~/.vagrant.d/insecure_private_key
User vagrant
```

ホストOSから `ssh` コマンドを実行し、ログインできることを確認します。

```bash:(ホストOS)
$ ssh 192.168.33.10                                                                                                                      [~/Desktop/vagrant-ansible]
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic x86_64)

 * Documentation:  https://help.ubuntu.com/
Welcome to your Vagrant-built virtual machine.
Last login: Fri Sep 14 06:23:18 2012 from 10.0.2.2
vagrant@precise64:~$
```


### AnsibleからゲストOSに接続できることを確認する

Ansibleは「インベントリファイル」というファイルに書かれているホストにアクセスします。今回は `hosts` という名前でインベントリファイルを作成し、使用します。

```bash:(ホストOS)
$ echo 192.168.33.10 > hosts
$ ansible 192.168.33.10 -m ping -i hosts
```

以下のような結果が返ってきたら成功です。

```
192.168.33.10 | success >> {
    "changed": false,
    "ping": "pong"
}
```


## 参考

* http://qiita.com/kidachi_/items/e63c1607705178aa257c
* http://yteraoka.github.io/ansible-tutorial/
開発サーバのログをDevtools Terminalで流しとくと便利

- [Devtools Terminal](https://chrome.google.com/webstore/detail/devtools-terminal/leakmhneaibbdapdoienlkifomjceknl)

Railsに限った話じゃないですが、開発時に立てたサーバのログを見ながら作業することがあると思います。そんなときはDevtools Terminalが便利です。

この拡張をインストールするとDeveloper ToolsにTerminalタブが追加されます。で、このタブの中身が端末のエミュレータになっていてるので、その画面の中で `tail -f` とかやっとくわけです。Devtools Terminal自体にはタブ機能がありませんが、その中でscreenとかtmuxを起動してやれば大丈夫です。

![Screen_Shot_2013-12-16_at_12.21.41_AM-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/153/e8a91231-d3ab-ba43-6d73-afe5a57133c9.jpeg)

無論こんなことをしなくても横に端末を並べて置いてそこで表示すればいいといえばいいのですが、画面の横に必ず固定されている、というのが嬉しい感じです。
Riakを運用する上でちょくちょく必要になりそうな小ネタ

## [Multi Backend](http://docs.basho.com/riak/2.0.0pre5/ops/advanced/backends/multi/)
設定次第では、Bucket毎に異なるバックエンドを設定することができる。
一つのRiakノード上で複数種類のバックエンドを動かすことができるので、応用の幅が一気に広がる。
セッションとかはmemory backendにしといて、重要な情報はLevelDBで永続化、とか。

## consoleとattach
riak consoleは、Riakを動かした上でシェルに入るコマンドだ。

```shell
➜  riak git:(a12d5a2) rel/riak/bin/riak console
config is OK
-config /Users/saisa/devel/riak/rel/riak/data/generated.configs/app.2013.12.15.23.32.59.config -args_file /Users/saisa/devel/riak/rel/riak/data/generated.configs/vm.2013.12.15.23.32.59.args -vm_args /Users/saisa/devel/riak/rel/riak/data/generated.configs/vm.2013.12.15.23.32.59.args
Exec:  /Users/saisa/devel/riak/rel/riak/bin/../erts-5.9.3.1/bin/erlexec -boot /Users/saisa/devel/riak/rel/riak/bin/../releases/2.0.0pre7/riak               -config /Users/saisa/devel/riak/rel/riak/data/generated.configs/app.2013.12.15.23.32.59.config -args_file /Users/saisa/devel/riak/rel/riak/data/generated.configs/vm.2013.12.15.23.32.59.args -vm_args /Users/saisa/devel/riak/rel/riak/data/generated.configs/vm.2013.12.15.23.32.59.args              -pa /Users/saisa/devel/riak/rel/riak/bin/../lib/basho-patches -- console
Root: /Users/saisa/devel/riak/rel/riak/bin/..
Erlang R15B03 (erts-5.9.3.1) [source] [64-bit] [smp:8:8] [async-threads:64] [kernel-poll:true] [dtrace]

Eshell V5.9.3.1  (abort with ^G)
(riak@127.0.0.1)1>
```
すでにRiakが動いている場合は、「attachを使え」と言われる。

```shell
➜  riak git:(a12d5a2) rel/riak/bin/riak console
Node is already running - use 'riak attach' instead
```

で、シェルに入ったらRiakのコードに書いている関数を呼ぶこともできる。
例えば

```rel/riak_kv/riak_index.erl
timestamp() ->
    {MegaSeconds,Seconds,MilliSeconds}=os:timestamp(),
    (MegaSeconds * 1000000000000) + (Seconds * 1000000) + MilliSeconds.
```
これの関数をattachして実行する場合、

```shell
➜  riak git:(a12d5a2) rel/riak/bin/riak start
➜  riak git:(a12d5a2) rel/riak/bin/riak attach
Remote Shell: Use "Ctrl-C a" to quit. q() or init:stop() will terminate the riak node.
Erlang R15B03 (erts-5.9.3.1) [source] [64-bit] [smp:8:8] [async-threads:0] [kernel-poll:false] [dtrace]

Eshell V5.9.3.1  (abort with ^G)
(riak@127.0.0.1)1> riak_index:timestamp().
1387118819589664
```
こんな感じ。
ちなみにErlangでは、

```
モジュール名:関数名(引数).
```
で呼ぶ。

オペレーションの際に使う以外に、ソースコードを読みながら「実際どう動いているのかな？」と探ってみるものおもしろい。
ふと思い立ってmac portsを削除した


```
$ sudo port -fp uninstall installed
$ sudo rm -rf /opt/local 
```

良くないことが起こる。何となくそんな気がした

### 起こったこと
- ターミナルが開かない
    - zshが起動できない
- tmuxが起動しない（起動直後に[exited]と出る）
- emacsがどっかいった

### 対応
- zsh、emacsをhomebrewで再インストール

```
$ sudo brew reinstall zsh
$ sudo brew install emacs --cocoa --japanese
$ sudo brew linkapps
```

- デフォルトシェルを変更

```
$ sudo chsh -s /usr/local/Cellar/zsh/5.0.2/bin/zsh mastakeu
```

### そういうわけで
結果、zshは5.0.2、emacsは24.3にアップデートされた
めでたし

と思ったら、emacs24系でhowmのプレビュー（？）的な機能がうまく動かない
2013/12/15時点でテスト版となっているバージョンがemacs24系に対応しているっぽい

[howm](http://howm.sourceforge.jp/index-j.html)

完


### 参考
- [MacPortsのインストール、アンインストール](http://www.happytrap.jp/blogs/2012/12/22/10185/)
- [MacVim(mvim)をHomeBrewでインストールする。](http://takuya-1st.hatenablog.jp/entry/20120114/1326572969)
mrubyでお絵描きプログラミング！10分ではじめるRubyKokuban


絵を書いたり動かしたりをmrubyで簡単に書くことが出来ます。インストールから↓のようなデモを作るまでの簡単なチュートリアルを書いてみました。

![demo](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tuto0621/20131215/20131215152953.gif)

[[本文へジャンプ]](http://ongaeshi.hatenablog.com/entry/rubykokuban-sketch)
BeagleBoardでfluentdを使ってセンサーデータを集めてみた


## 目的
家庭内の電力データを集めたい．できれば集めたデータを利用して消費電力も減らしたい．

## BeagelBoardとは？
ARM（OMAP3）が載ったワンボードPCです．メモリが512MBと割とリッチ（？）です．

## td-agent for BeagleBoard-xM
これは去年の[Kernel/VM Advent Calendar](http://d.hatena.ne.jp/katsyoshi/20121214 “Kenrnel/VM 2012 14”)や[大江戸Ruby会議04](https://speakerdeck.com/katsyoshi/asakusa-dot-rbni-nian-jian-tong-tutarakounatuta “Oedo04”)を見て下さい．

## どういう流れで集めてるの？
![こんなかんじです](http://cdn-ak.f.st-hatena.com/images/fotolife/k/katsyoshi/20131215/20131215231815.png)
Arduinoに付けたセンサーをZigBee（Xbee）で収集マシン（BeagleBoard）に投げます．収集マシンに投げられたら，[fluent-plugin-serialport](https://github.com/katsyoshi/fluent-plugin-serialport)を利用してデータを集めます．集められたデータはサーバにVPNを通してfluentdで送信されます．
データはサーバ側にとりあえずmongodb使って貯めています．そのうちGrowthForecastなど利用して可視化をしたいと考えています．

## 性能は？
これも大江戸Ruby04の資料を見ていただければ…
限界まで利用することはなさそうなので，そのうちfleunt-plugin-jubatusなどを利用してBeagleBoard上でも解析できたらいいなぁと言いつつ1年が経ちました！！！！！(ｷﾘｯ

## おち
このシステム動いてないです．
理由を聞きたい人は@katsyoshiにｻｹを奢って下さい
タイトル，fluentd casual talks#1とかぶってるの書き終わって気がついた…
ゲーム制作9日目!!

#今日のメニュー
・エサの実装

#エサ

エサをクラスとして定義します。
エサはおいしさという変数をもちます。
おいしさが高いほど、より多くの栄養があり、成長が早いです。
おいしさが高いほど見た目も大きくなるようにします。
また、このオブジェクトはプレイヤーとの衝突判定を行い、
衝突した場合にプレイヤーがエサを食べたことにします。
エサは常にフィールド上に一定数あるようにし、
プレイヤーがエサを一つ食べた時点で新しいエサが設置されます。

実装したクラスのソースコードが以下の感じです。

```js
			var Bait=Class.create(Sprite,{
				initialize:function(deliciousness,x,y,pc){
					Sprite.call(this,8,8);
					this.image=game.assets['./img/feed.png'];
					this.x=x;
					this.y=y;
					this.deliciousness=deliciousness;
					this.scaleX=deliciousness/3.0+1;
					this.scaleY=deliciousness/3.0+1;
					this.pc=pc;
					scene.addChild(this);
					this.onenterframe=function(){
						if(this.within(pc,32)){
							pc.createNewNode();
							existBait-=1;
							this.parentNode.removeChild(this);
						}
					}
				}
			});
```

#今日の成果

[今日の成果に飛びます。](https://dl.dropboxusercontent.com/u/35809589/SnakeGame/index.html)
全面青画面がスタート画面です。
画面をクリックすると、ゲームがスタートします。
ゲーム中では左右キーで曲がることができます。
とまることはできません。
(下ボタンで増殖します。)←廃止
緑色の丸がエサです。new!
エサを食べると内部的に値が蓄積され、new!
一定値を超えると増殖します。new!
大きいエサほど値が多く増加します。new!
増殖したからだは時間経過で見た目に変化が現れます。
変化が最終段階に達すると右下の掲示が1増加します。
しかくいキャラがマウスについてきます。ドラッグしている間に移動した位置に移動します。
自分の体および壁に衝突すると、全面緑色のゲームオーバー画面に飛びます。
ゲームオーバー画面で画面をクリックするとスタート画面に戻ります。

#明日の方針

残り時間も少ないので、
まずは体裁を整え一つのゲームとして形にしようと思います。
その後、実装したい機能をつけていこうと思います。
Google Drive にアップしたテキストファイルの見栄えをよくする (2.フォルダアクションの設定)

前回の続きです。

Google Drive のフォルダに対して フォルダアクションをしかけます。

#### フォルダアクションとは
---

フォルダアクションは AppleScript による一種のシステムの監視機能であり、ユーザがフォルダに対して行った変更をきっかけに、あらかじめ定めておいた処理を開始させることができます。

有名どころだと「iTunes ライブラリに自動的に追加」の機能など。
[Apple サポート：「iTunes に自動的に追加」フォルダについて](http://support.apple.com/kb/HT3832?viewlocale=ja_JP)


#### フォルダアクションの追加
---

AppleScriptEditor で AppleScript を書いてシステムに登録する、という方法もありますが、Automator で作成するのがてっとり早く、後々の管理も楽です。

0. Automator を起動
0. ワークフローの選択で、「フォルダアクション」を選択して決定
0. "フォルダアクション"の実行場所を割り当てる。任意のGoogle Drive 上のフォルダ(テキストファイルを配置しようとしているフォルダ)を割り当てましょう
0. "AppleScript を実行" を右ペインにドラッグ & ドロップ
0. AppleScript を編集して保存

作成する AppleScript はこんな感じです。

```applescript

on run {input, parameters}
	
	try
		set addedItemPath to (input's POSIX path)
		set ourSh to "echo " & addedItemPath
		set str2 to do shell script ourSh
		set str1 to "item added.
"
		display dialog str1 & str2
		
		do shell script "cupsfilter " & addedItemPath & " > out.pdf"
		delay 1
		
	on error
		display dialog "can't get file path."
	end try
	
end run
```

指定したフォルダにファイルを追加すると、cupsfilter コマンドで pdf 変換を試みます。要は Unixコマンドなのですが、これを Applescript から使うために `do shell script `しています。

![Screen shot 2013-12-01 at 22.52.40.png](https://qiita-image-store.s3.amazonaws.com/0/8510/2e55f295-ea90-1397-bc67-6b01002148e2.png)

#### 使わないフォルダアクションを削除する
---

以下のアプリケーションを使って、フォルダとスクリプトの紐付けを解除したり、スクリプトを削除することができます。

`/System/Library/CoreServices/Folder Actions Setup.app`

![uploading Screen shot 2013-12-01 at 22.52.40.png...]()


#### 参考
---

Automatorでフォルダアクションをつくる記事(画面キャプチャあり)
[Evernoteにファイルを保存するフォルダアクションの作り方](http://tech.caph.jp/2012/11/17/send-files-to-evernote-folder-action/)
Ceylon三項演算子が無い？

CeylonではC言語系のプログラム言語のほとんどで採用されている
三項演算子の下記の書き方が出来ません。

```ceylon

	value condition = true;
	
	value result = condition ? "True" : "False"; // コンパイルエラー

````

代わりにthen-elseで書くことが出来ます。

```ceylon

	value condition = true;
	
	value result = condition then "True" else "False" ;
	
````


うーん。
微妙にイマイチな。。。

まあ、三項演算子を使うこと事態が賛否あるので
どうなんでしょうね。

変数宣言のときに比較して代入の必要があればいいのかな？
うーん。

って感じでした。
[GroovyとProcessing]X軸方向にスライドする

マウスを左右に移動させると画面を左右にスライドさせる。
動画ではスペースキー押下とマウスを組み合わせているけどProcessingではキー入力中はマウスが動かなかったのでスペースキーの押下でフラグを切り替えることにした。
あと、pushMatrix()とpopMatrix()を書いてても書いてなくても動作に変化はなかったのでその辺のサンプルとしては意味が無い・・・。

```groovy
package episode017

import processing.core.PApplet

class DisplayTest extends PApplet {

    def translation_x =0
    def moveEnabled = false

    def void setup() {
        size(640, 480, P3D)
        frameRate(60)

        // 正射影投影法
        ortho()
    }

    def void draw() {
        background(0, 0, 0)

        pushMatrix()

        if (moveEnabled) translation_x += mouseX - pmouseX

        translate(translation_x, 0, 0)

        stroke(255, 255, 255)
        fill(255, 255, 255)
        rect(400, 300, 50, 50)
        line(100, 100, 200, 200)

        popMatrix()
    }

    def void keyTyped() {
        if (key == ' ') {
            moveEnabled = !moveEnabled
        }
    }

    def static void main(args) {
        PApplet.main('episode017.DisplayTest')
    }
}
```

![grocessingGL017.png](https://qiita-image-store.s3.amazonaws.com/0/17179/38a4eedb-7b29-2c01-6571-7a83e107cf14.png)
openFrameworksでジェスチャ認識


つつみさんがなにやらoFを始めるということで、一日くらい混ぜてもらおうと。
最近いろいろと試しているGRTというジェスチャ解析ライブラリの紹介です。

## ジェスチャ認識とはなんぞや

理系じゃないので、正しくはないですが、ふんわりこんな感じなのかな↓

ジェスチャ認識とは

	1.パソコンに正解パターンを沢山教える。→ Classfication
	2.入力した信号が、どのパターンに似ていたか判定する。→ Recognition

この２つのフェーズに別れてやるらしい。論文を読むと妙に難しい単語で挫けそうになるのだけど。
学習フェーズ、判定フェーズの２つがあるってことを知っておけば、わかりやすくなります。

その上で、素敵なスライドのご紹介。流石MIT
[IAP Workshop: A Hands-On Introduction to Gesture Recognition & Machine Learning](http://www.nickgillian.com/teaching/workshops/iap2013)

そしてこのPDFがとてもまとまっている。
[IAP Session 1] (http://www.nickgillian.com/archive/teaching/workshops/mitiap2013/IAP_Session1.pdf)

本当は検出器に掛ける前に、
カルマンフィルタ、ローパスフィルタやら入力する信号の特性に応じてフィルタリングかけたり、FFTに変換とかいろいろ下ごしらえをするらしい。

アルゴリズムも色いろある。
AdBoostとか、SVMとか…ふむふむ分からん。
僕がよくやりたいパターンだと、9軸センサからジェスチェ認識とかやりたいので、Dynamic Time Warpingがよさげ。

## やってみる。
ジェスチャ認識のライブラリは他に[Wiigee](http://www.wiigee.org/)とか見つかったのですが、アルゴリズムが一種類HMM(隠れマルコフモデル)だけ。上記でも使っているGRTを使ってみます。

GRTソースコードはこちらから。
https://code.google.com/p/gesture-recognition-toolkit/source/checkout

今回実行したプログラムはこちら。
http://www.nickgillian.com/wiki/pmwiki.php/GRT/OpenframeworksDTWExample

**R**キーで、レコード開始。正解パターンを教えます。一文字につき5~10回繰り返す。
![スクリーンショット 2013-12-15 19.00.10.png](https://qiita-image-store.s3.amazonaws.com/0/14330/0c86ea52-f1d5-afa2-80c7-c75079a11ddc.png "スクリーンショット 2013-12-15 19.00.10.png")![スクリーンショット 2013-12-15 19.00.17.png](https://qiita-image-store.s3.amazonaws.com/0/14330/b05a7883-f594-8960-7f83-f886a9f23da1.png "スクリーンショット 2013-12-15 19.00.17.png")

![スクリーンショット 2013-12-15 19.00.57.png](https://qiita-image-store.s3.amazonaws.com/0/14330/65513798-2377-39f8-58ab-63e1016f0e76.png "スクリーンショット 2013-12-15 19.00.57.png")![スクリーンショット 2013-12-15 19.01.12.png](https://qiita-image-store.s3.amazonaws.com/0/14330/4f9cf8a4-0707-9b16-3ef8-c66d07fb2b47.png "スクリーンショット 2013-12-15 19.01.12.png")

![スクリーンショット 2013-12-15 19.02.38.png](https://qiita-image-store.s3.amazonaws.com/0/14330/98125e38-842d-7dbe-8f8b-0fc7d4fa9a52.png "スクリーンショット 2013-12-15 19.02.38.png")![スクリーンショット 2013-12-15 19.02.44.png](https://qiita-image-store.s3.amazonaws.com/0/14330/016e1d13-9755-65a1-d567-90247a9d1a2b.png "スクリーンショット 2013-12-15 19.02.44.png")


**T**キーで教えこむ。
ちょっと待つとリアルタイムで解析するようになります。
全部Rとして認識成功！

![スクリーンショット 2013-12-15 19.05.10.png](https://qiita-image-store.s3.amazonaws.com/0/14330/a9d1571a-f87b-a3f5-9583-4e188d815d01.png "スクリーンショット 2013-12-15 19.05.10.png")![スクリーンショット 2013-12-15 19.05.24.png](https://qiita-image-store.s3.amazonaws.com/0/14330/d235aa28-223a-6e2a-744b-a11f218a6e0c.png "スクリーンショット 2013-12-15 19.05.24.png")![スクリーンショット 2013-12-15 19.04.48.png](https://qiita-image-store.s3.amazonaws.com/0/14330/bac0b6ff-6079-0170-c2de-b1edeb216a7e.png "スクリーンショット 2013-12-15 19.04.48.png")


今回はマウス座標で２次元だったけど、yaw,pitch,rollでの解析とか。加速度での解析とかができそう。

```cpp:testApp.cpp
// line:
trainingData.setNumDimensions( 2 ); // こんかいはx,y
```

## おまけ

GRT部分を単体のアプリケーションにして、OSC経由で使える。Processingのサンプルが含まれてますが、OSC経由なら別にiPhoneの加速度センサだって簡単に。面白いことができそう。
http://www.nickgillian.com/wiki/pmwiki.php/GRT/Download
Ceylonのクラスのメタデータなどの取得（リフレクション）


Ceylonでのクラス情報を取得などをやってみます。

Javaで言うとリフレクションなどですね。


以前の回で作ったカウンタークラスを参照してみます。


```ceylon

class Counter(variable Integer i) {
	
	shared Integer add() {
		return i++;
	}
	shared Integer nowCount {
        return i;
    }
}

````

クラスのメタ情報を参照するときにはこんな感じ

```ceylon


void classRef() {
	
    ClassDeclaration counterClass = `class Counter`;

    print(counterClass);

    for(m in counterClass.memberDeclarations<FunctionDeclaration>()) {
	print(m);
    }
}


````

ClassDeclarationでクラスで定義されている関数やパラメータなどを取得できます。
クラスをバッククオートで囲ってやるとClassDeclarationとして取得することが出来ます。
もちろん宣言されていないクラスなどをしていするとちゃんとコンパイルエラーになってくれます。

関数の情報のときにはこうです

```ceylon

	FunctionDeclaration counterAddMethod = `function Counter.add`;
````

classがfunctionになっただけですね。

#まとめ

こんな感じでクラスのメタデータを使った処理は
フレームワークなどを作るときには使うんじゃないでしょうか。

普通の業務ロジックで使いだすと黒魔術的になってしまい
静的型付言語としての意味がなくなってしまうので
使いどころは絞って使って行きましょうー。
rails3とrails4の速度比較。およびgem springでどのくらいrailsコマンドが早くなるのか。

# 条件


1. `ruby1.9.3p484  rails3.2.13  gem1.8.23`
2. `ruby2.0.0p247  rails3.2.14  gem2.1.0`
3. `ruby2.1.0dev  rails4.0.2  gem2.2.0.preview.1`
で比較を行いました。



何故この選択をしたかというと、
**springの有無による速度差と、バージョンによる速度差を確認したかったからです。**
`gem spring`はrailsがベースにしているgemが2.1.0の際にgemを更新するように警告を発する
（[springで爆速rake生活](http://qiita.com/sgtn/items/a0f1ac313f0fad959299)を参照）ので、
gem2.1.0前後で速度差がどれほどのものか確認したかったからです。


`rails g blog title:string description:string`

```ruby:routes.rb

[ProjectName]::Application.routes.draw do
 resources :blogs
end

```


の条件で


`bundle exec time rake routes`と`bundle exec time spring rake routes`
の実行時間を５回ずつ測定し、その平均を求めました。


# 結果
以下の画像のようになりました。




![Screenshot 2013-12-15 19.23.02.png](https://qiita-image-store.s3.amazonaws.com/0/26475/2d5ea173-644a-465d-68a6-bf6672f5f28b.png)



## 平均実行時間
rails3.2.13/gem1.8.23
springなし 1.25秒
**springあり 0.368秒**
**実行時間削減率 70.56%**

rails3.2.14/gem2.1.0
**springなし 0.992秒**
springあり 0.416秒 
実行時間削減率 58.06%

rails4.0.2/gem2.2.0.preview.1
springなし 1.33秒
springあり 0.494秒
実行時間削減率 62.85%

※太字は３条件の内もっとも優秀なもの

# 雑感

この結果を見るに、rails4はだいぶもっさりなのかなと思えます。
実験の条件次第で変わってくるでしょうが、参考程度にお願いします。

また、springは60~70%の高速化を実現しており、
`rake db:seed`や`rake db:migrate:reset`
ひいては`rails s`や`rails g`や`rspec`などで思考の流れを絶つリスクを下げてくれることでしょう。

# 備考

spring導入方法は
[springで爆速rake生活](http://qiita.com/sgtn/items/a0f1ac313f0fad959299)
を参考にしていただけると幸いです。


#追記

rubyのバージョンが速度に大きく影響している可能性を検証するために
[rubyのバージョンを固定してrailsの速度を比較してみました。](http://qiita.com/sgtn/items/afa1ace4f94120a5c71d)
git mergeでコンフリクトが発生するか前もって調べる方法

利用シーン少なそうですが、mergeを実行する前にコンフリクトが起こるかどうかチェックしたくて調べたのでメモ。

# git merge —no-commit
topic-branchをmasterにマージしようとしてコンフリクトするケースを想定します。

まず試してみたのは--no-commitオプション。

```bash:—no-commit付きでmerge
 (master) ✘ git merge topic-branch --no-commit
Auto-merging src/hello.py
CONFLICT (content): Merge conflict in src/hello.py
Automatic merge failed; fix conflicts and then commit the result.
```

これを付けておくとマージ時に自動コミットがされなくなりますが、コンフリクトが起こる場合もローカルファイルにはマージが実行されてしまいます。

# git format-patch
予めパッチを用意しておくと、マージを適用する前にコンフリクトするかどうかをチェックすることができるようです。

```bash:バッチ作成
(topic-branch) ✘ git format-patch master  --stdout > test.patch #パッチ作成
(topic-branch) ✘ git checkout - 
Switched to branch 'master'
(master) ✘ git apply test.patch --check #パッチが適用できるかチェック
error: patch failed: src/hello.py:6
error: src/hello.py: patch does not apply
```

コンフリクトが起こる場合はエラーが発生するので未然に気づけるように。これならファイルに変更が加わってgit merge —abortする必要もなし。

毎回この手順を踏むのは面倒なのでコマンド一行でチェックできるようにします。

```bash:直前のbranchを現在のbranchにマージできるかチェックする
git format-patch `git rev-parse --abbrev-ref HEAD`..`git rev-parse --abbrev-ref @{-1}` --stdout | git apply --check
```
カレントブランチ(`git rev-parse --abbrev-ref HEAD`)と直前にcheckoutしていたbranch(`git rev-parse --abbrev-ref @{-1}`)間での差分を出力して、パッチが適用できるかチェックしています。

hookとかに入れておけば、マージ先ブランチをcheckoutするタイミングでコンフリクトが発生するかチェックできて便利そう。
EC2 に Qt4.8 をインストールする

EC2 に Qt4.8 をインストールする方法です。
capybara-webkit を利用する場合などに。

*かなり時間がかかる* ので注意してください。
お急ぎの場合には一時的にインスタンスタイプを変更するのが吉です。

+ 依存パッケージをインストール

    ```bash
    sudo yum install -y gcc-c++ libX11-devel \
    fontconfig-devel libXcursor-devel libXext-devel \
    libXfixes libXft-devel libXi-devel libXrandr-devel \
    libXrender-devel
    ```

+ ソースのダウンロード、configure

    *注意: configure に結構時間（m1.small で 50 分程度）かかります*

    ```bash
    wget http://download.qt-project.org/official_releases/qt/4.8/4.8.5/qt-everywhere-opensource-src-4.8.5.tar.gz
    tar xzvf qt-everywhere-opensource-src-4.8.5.tar.gz
    cd qt-everywhere-opensource-src-4.8.5
    ./configure --platform=linux-g++-64
    ```

+ make
    
    *注意: かなり時間（m1.small で 2~30 時間程度）かかります*

    ```bash
    gmake
    gmake install
    ```

+ PATH に追加

   `export PATH=$PATH:/usr/local/Trolltech/Qt-4.8.5/bin/`



参考: [Capybara-webkit | Pedago](http://blog.pedago.com/tag/capybara-webkit/)
paiza POH ec-campaign (Perl/PHP) #paizahack_01

|問題|https://paiza.jp/poh/ec-campaign|
|:--|:--|
|タイム一覧/C++|http://qiita.com/cielavenir/items/a61cfe8390eb16866ae5|
|Python/Ruby(1)|http://qiita.com/cielavenir/items/b10ff4d201150f525062|
|C#/Java/Python/Ruby|http://qiita.com/cielavenir/items/d89e85f069cf570e6786|
|Perl/PHP|http://qiita.com/cielavenir/items/1a650a4c41d7bdd31392|
|JavaScript|http://qiita.com/cielavenir/items/a85b985888fdc15c52b7|
|Go/CoffeeScript/Scala/R/Bash|http://qiita.com/cielavenir/items/79016a0afd30470f440d|
|VB/F#/D|http://qiita.com/cielavenir/items/cb6094bab56253de992c|

Perl
ついに非標準モジュールに手を出してしまいました。

```pl:paizapoh1.pl
#!/usr/bin/perl
use strict;
use warnings;
use feature qw(say);

BEGIN{
	eval qq(use List::BinarySearch qw(binsearch_pos););
	if($@){
		#warn 'falling back to Perl binsearch_pos.';
		sub binsearch_pos (&$\@) {
			my ( $comp, $target, $aref ) = @_;
			my ( $low, $high ) = ( 0, scalar @{$aref} );
			while ( $low < $high ) {
				my $cur = int( ( $low + $high ) / 2 );
				no strict 'refs';  ## no critic(strict)
				local ( ${ caller() . '::a'}, ${ caller() . '::b'} ) = ( $target, $aref->[$cur] );
				if ( $comp->( $target, $aref->[$cur] ) > 0 ) {
					$low = $cur + 1;
				} else {
					$high = $cur;
				}
			}
			return $low;
		}
	}
}

my($n,$d)=split(' ',<>);
my @v=();
for(my $i=0;$i<$n;$i++){push(@v,int($_=<>))};
@v=sort{$a<=>$b}@v;
for(my $i=0;$i<$d;$i++){
	my $m=int(<>);
	my ($r,$j)=(0,0);
	my $idx=binsearch_pos {$a<=>$b} $m-$v[0]+1, @v;
	for(my $k=$idx-1;$j<$k&&$v[$j]+$v[$j+1]<=$m;$j++){
		for(;$v[$j]+$v[$k]>$m;$k--){}
		if($r<$v[$j]+$v[$k]){
			$r=$v[$j]+$v[$k];
			last if($r==$m);
		}
	}
	say $r;
}
```

PHP
その関数どこから拾ってきた…。

```php:paizapoh1.php
#!/usr/bin/php
<?php
//http://www.php.net/array_search#93352
function array_binarysearch($needle, $haystack){
    $high = count( $haystack )-1;
    $low = 0;
    $ret = count($haystack);
    while( $high >= $low ){
        $probe = floor( ( $high + $low ) / 2 );
        $comparison = $haystack[$probe]-$needle;
        if( $comparison <= 0 ){
            $low = $probe+1;
        }else{
			$ret=$high;
            $high = $probe-1;
        }
    }
	return $ret;
}

list($n,$d)=explode(' ',fgets(STDIN));
$v=array();
for($i=0;$i<$n;$i++)array_push($v,intval(fgets(STDIN)));
sort($v);
for($i=0;$i<$d;$i++){
	$m=intval(fgets(STDIN));
	$idx=array_binarysearch($m-$v[0],$v);
	for($r=$j=0,$k=$idx-1;$j<$k&&$v[$j]+$v[$j+1]<=$m;$j++){
		for(;$v[$j]+$v[$k]>$m;)$k--;
		if($r<$v[$j]+$v[$k]){
			$r=$v[$j]+$v[$k];
			if($r==$m)break;
		}
	}
	echo $r.PHP_EOL;
}
?>
```
[Ruby] Slopの使い方(2) onメソッド

`Slop#on(short, long, description, config = {}, &block)`というように呼び出す。

+ short:           短縮形のオプション名
+ long:            オプション名
+ description:  オプションの説明
+ config:          オプションに対する設定
+ block:           オプションが指定されたときに呼び出されるcallback関数

## short / long
オプションの名前は短いものと、長いものを設定することができる。

```rb:slop_sample.rb
require 'slop'

opts = Slop.parse(help: true) do |opt|
  opt.on 'v', 'verbose', 'Enable verbose mode'
end

p opts.verbose?
p opts.v?
```

```shell-session
$ ruby slop_sample.rb -v
# => true
# => true

$ ruby slop_sample.rb --verbose
# => true
# => true
```

## description
オプションの説明。`--help`したときに表示される。

```rb:slop_sample.rb
require 'slop'

opts = Slop.parse(help: true) do |opt|
  opt.on 'v', 'verbose', 'Enable verbose mode'
  opt.on 'V', 'version'
end
```

```shell-session
$ ruby slop_sample.rb --help
# =>
Usage: slop_sample [options]
    -v, --verbose      Enable verbose mode
    -V, --version
    -h, --help         Display this help message.

```

## config
オプションに対する設定で、以下のものがある。

+ :argument
+ :optional_argument
+ :tail
+ :default
+ :callback
+ :delimiter
+ :limit
+ :match
+ :optional
+ :required
+ :as
+ :autocreated

## block
オプションが指定されたときに呼び出されるcallback関数。`Slop.parse`が実行されるときにcallback関数が呼び出される。

```rb:slop_sample.rb
require 'slop'

opts = Slop.parse(help: true) do |opt|
  opt.on 'v', 'verbose', 'Enable verbose mode' do
    puts 'verbose mode on'
  end
  opt.on 'V', 'version' do
    puts 'version is 1.0.0'
  end
end

p opts.verbose?
p opts.version?
```

```shell-session
$ ruby slop_sample.rb --verbose
# =>
verbose mode on
true
false

$ ruby slop_sample.rb --version
# =>
version is 1.0.0
false
true
```
Exposé, Mission ControlでのNSWindowの振る舞いを指定する

![desktop.jpg](https://qiita-image-store.s3.amazonaws.com/0/3603/55445ed9-3e95-9c1c-b61b-2cdf343c13d0.jpeg)

`setCollectionBehavior:`メソッドを用いると、Exposé, Spaces, Mission Control, フルスクリーン時のウインドウの振る舞いをビット演算で指定できる。
一方で`setCanBeVisibleOnAllSpaces:`というメソッドも存在したが、こちらは10.5で非推奨扱いとなっている。

# NSWindowCollectionBehavior

```objc:NSWindowCollectionBehavior
NSWindowCollectionBehaviorDefault
NSWindowCollectionBehaviorCanJoinAllSpaces
NSWindowCollectionBehaviorMoveToActiveSpace

NSWindowCollectionBehaviorManaged
NSWindowCollectionBehaviorTransient
NSWindowCollectionBehaviorStationary

NSWindowCollectionBehaviorParticipatesInCycle
NSWindowCollectionBehaviorIgnoresCycle

NSWindowCollectionBehaviorFullScreenPrimary
NSWindowCollectionBehaviorFullScreenAuxiliary

NSWindowCollectionBehaviorFullScreenAllowsTiling
NSWindowCollectionBehaviorFullScreenDisallowsTiling
```

## 10.5以降

### NSWindowCollectionBehaviorDefault
ウインドウがひとつのスペースに関連づけられる。ウインドウ（アプリ）を選択するとそのウインドウが関連づけられているスペースに移動する。
一般的なウインドウの標準の振る舞い。

### NSWindowCollectionBehaviorCanJoinAllSpaces
ウインドウがすべてのスペースに関連づけられる。スペースを切り替えてもウインドウが表示される。
`NSWindowCollectionBehaviorMoveToActiveSpace` と同時に使用できない。

### NSWindowCollectionBehaviorMoveToActiveSpace
ウインドウ（アプリ）を選択したとき、そのウインドウが関連づけられているスペースに移動しないようにする。代わりにウインドウが現在のスペースに移動してくる。
`NSWindowCollectionBehaviorCanJoinAllSpaces` と同時に使用できない。

## 10.6以降

### NSWindowCollectionBehaviorManaged
ウインドウがExposéに対応する。
NSNormalWindowLevelではこれが標準。

### NSWindowCollectionBehaviorTransient
Exposéのときにウインドウが隠される。モーダルウインドウやユーティリティウインドウ（パネル）でよくある振る舞い。
NSNormalWindowLevelではないときにこれが標準。

### NSWindowCollectionBehaviorStationary
ウインドウはDockやデスクトップのように固定され、Exposéの影響を受けなくなる。タイトルバーを持っていればドラッグによる移動は可能。
Exposé時にも固定で表示される。

### NSWindowCollectionBehaviorParticipatesInCycle
ウインドウは“ウインドウサイクル”の一部になる。具体的には、`command`+`F1`によるウインドウ巡回機能で選択対象になる。

### NSWindowCollectionBehaviorIgnoresCycle
ウインドウは“ウインドウサイクル”の対象外になる。具体的には、`command`+`F1`によるウインドウ巡回機能で選択されなくなる。

## 10.7以降

### NSWindowCollectionBehaviorFullScreenPrimary
フルスクリーン用のボタンがタイトルバー右端に付いて（古い OS X）、フルスクリーンになれるようになる。

### NSWindowCollectionBehaviorFullScreenAuxiliary
フルスクリーンウインドウと同じスペースに表示できる。10.11 だとフルスクリーンが無効化されズームボタンがデフォルトになる。

## 10.11以降

### NSWindowCollectionBehaviorFullScreenAllowsTiling

フルスクリーンの分割表示に対応する。

### NSWindowCollectionBehaviorFullScreenDisallowsTiling

フルスクリーンするが分割表示に対応しない。

# デスクトップに張り付くウインドウの例

```objc
[window setCollectionBehavior:NSWindowCollectionBehaviorCanJoinAllSpaces | NSWindowCollectionBehaviorStationary | NSWindowCollectionBehaviorTransient | NSWindowCollectionBehaviorIgnoresCycle];
[window setLevel:kCGDesktopWindowLevel];
```
これで、スペースの影響を受けず、Exposé (Mission Control)にも現れないウインドウを作ることができる。
なお、ウインドウレベルを `kCGDesktopWindowLevel` 等にしておかないと `NSWindowCollectionBehaviorTransient` を指定してもデスクトップ Exposé のときにウインドウが画面外に飛んでいってしまうようなので、ウインドウレベルを設定しておく必要がある。
Spork導入してRSpec動かそうとした時にActiveRecord::ConnectionNotEstablishedでハマった

##エラー名
`rspec --drb spec` で実行すると下のようなエラーが出た。

```
ActiveRecord::ConnectionNotEstablished
```

##対処法

```
Spork.prefork do
  ENV["RAILS_ENV"] ||= 'test'
  require File.expand_path("../../config/environment", __FILE__)
  require 'rspec/rails'
  require 'rspec/autorun'

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

  RSpec.configure do |config|
    config.fixture_path = "#{::Rails.root}/spec/fixtures"
    config.use_transactional_fixtures = true
    config.infer_base_class_for_anonymous_controllers = false
    config.order = "random"
    config.include Capybara::DSL
    config.expect_with :rspec do |c|
      c.syntax = :expect
    end
  end
end

Spork.each_run do
  ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection  # 多分ここが重要らしい!!
end

```

##ファイルを追加する

```spec/support/shared_connection.rb
class ActiveRecord::Base
  mattr_accessor :shared_connection
  @@shared_connection = nil

  def self.connection
    @@shared_connection || retrieve_connection
  end
end
```

これで動くようになる(^^ゞ!!
Rails4で使用されているRubyGemのバージョンを調べてみた。

*※[springで爆速rake生活](http://qiita.com/shogohciai/items/a0f1ac313f0fad959299)の最後で触れた、
springが推奨するgem本体のバージョン(2.1.0以上)に変更したい問題についての続報になります。*

**結論としては、rails3系ではspringは警告文を出してきてウザいです。rails4系からのspringは警告を出さずに（そして恐らく）速度が上がっているかと思われます**

[springで爆速rake生活](http://qiita.com/shogohciai/items/a0f1ac313f0fad959299)でも触れましたが、`bundle exec time spring rake routes`などを実行すると通常よりも高速にrake routesができていることがわかるのですが、rubygemのバージョンが2.1.0以下だと警告が出て鬱陶しいのが問題でした。

じゃあ警告を消してやろうじゃんということで[ローカルのGemのバージョンを上げ](http://qiita.com/shogohciai/items/235eaf95c5978d182c3b)てもRailsプロジェクトのGemのバージョンは上がらないようです。

なんとかRailsプロジェクト内のGemのバージョンを2.1.0以上に上げたい。

そう思っていろいろやっているうちに下の結果が得られました。

`ruby 2.0.0p247` `Rails 3.2.14`
において

rubyに紐づいたgem

```zsh:zsh

gem -v
#=> "2.0.3"

```

railsに紐づいたgem

```ruby:irb

irb(main):001:0> Gem::VERSION
=> "2.0.3"

```

---

`ruby 2.1.0dev` `Rails 4.0.2`
において
（何故かpryが使えない悲しい #=> bundle execが必要だったか）

rubyに紐づいたgem

```zsh:zsh

gem -v
#=> "2.2.0.preview.1"

```

railsに紐づいたgem

```ruby:irb

irb(main):001:0> Gem::VERSION
=> "2.2.0.preview.1"

```


この結果から分かるのは、railsで使用するgemはそのrailsのバージョンを作るのに使われているgemなので、railsのバージョンを上げなければgemのバージョンは上がらない。つまり、springの警告を消すためにはrails3.2.14以上rails4.0.2以下のrailsを使用する必要があると言うことです。

※厳密にどのrailsバージョンからspringが早くなるかとか、既存のrailsプロジェクトのgemのバージョンを上げられないかとかは面倒なので調べませんが、`Gem::VERSION`がどこからバージョンをとってきているのか深堀したら何かわかるかもしれませんね。
[GroovyとProcessing]透視射影投影法

透視射影投影法で描画する。
Processing公式のサンプルは立方体を描画している。
今回は動画に沿って宇宙っぽいものを描画する。
上キーでスピードアップ、下キーでスピードダウン、スペースキーでスピードを0にしてCキーで初期値に戻る。

動画リスト：[LWJGLのチュートリアル](http://www.youtube.com/playlist?list=PL19F2453814E0E315)
動画は[ココ](http://www.youtube.com/watch?v=vHA2LAhOjJ0)

```groovy
package episode016

import processing.core.PApplet

class DisplayTest extends PApplet {

    def z = 0
    def speed = 0
    def points = []

    def void setup() {
        size(640, 480, P3D)
        frameRate(60)

        10000.times {
            points << [x: random(width), y: random(height), z: random(200) - 200]
        }
    }

    def void draw() {
        background(0, 0, 0)

        perspective(30, width / height, 0.01, 200)

        z += speed
        translate(0, 0, z)

        noSmooth()
        stroke(255, 255, 255)
        strokeWeight(1)
        points.each {
            point((float)it.x, (float)it.y, (float)it.z)
        }
    }

    def void keyPressed() {
        if (keyCode == UP) {
            speed += 1
        }
        if (keyCode == DOWN) {
            speed -= 1
        }
        if (key == ' ') {
            speed = 0
        }
        if (key == 'c') {
            speed = 0
            z = 0
        }
    }

    def static void main(args) {
        PApplet.main('episode016.DisplayTest')
    }
}
```

![grocessingGL016.png](https://qiita-image-store.s3.amazonaws.com/0/17179/bbfd8942-2766-6177-ad6c-79b34286a8d7.png)
Angular.jsで実践 アニメーション

スライドの動きやフリック時の画面遷移、昔アニメーションといえばゲームなイメージでしたが、モバイル端末が登場して以来結構身近なものになりました。

ただ、身近だから簡単というわけでもなく、動作にアニメーションをつけるのは結構面倒。「これちょっとさ、下からひゅっと出てくる感じにしてよ」と言われてそんな簡単じゃないんだよとイラッとすることもあるだろう。
「アニメーションはもうデザインみたいなもんだし、CSSで書いてよろしくやってくれたらな・・・」とJQueryで実装しながら見るはかない夢・・・を現実にしてしまうのが、Angular.jsのng-Animateなのであります！

## 準備
アニメーションを使用するには、angular.js本体意外にangular-animate.jsが必要となります。Googleがホスティングしてくださっているので、ありがたく使わせていただきましょう。
[Google Hosted Library](https://developers.google.com/speed/libraries/devguide#angularjs)
//ajax.googleapis.com/ajax/libs/angularjs/X.Y.Z/angular.min.js
//ajax.googleapis.com/ajax/libs/angularjs/X.Y.Z/angular-animate.js

X.Y.Zはバージョン番号になります。これらをロードした上で、以下宣言をしておけばOK。

```js
  angular.module('app', ['ngAnimate']); //Animateモジュールの導入
```

## CSS定義
以下のようにCSSクラスの定義を行います。

```css
 .demo.ng-enter { }            /* enter 処理の開始値 */
 .demo.ng-enter-active { }     /* enter 処理の終了値 */
 .demo.ng-leave { }            /* leave 処理の開始値 */
 .demo.ng-leave-active { }     /* leave 処理の終了値 */
```

アニメーション実装は[CSS3のtransition](https://developer.mozilla.org/ja/docs/Web/Guide/CSS/Using_CSS_transitions)なので、ブラウザが対応していないと動かない点には注意(業務で使用しているのはIE？それは残念だ)。
以下のようにアニメーションさせたいDOMにクラス(この場合`demo`)を指定することで動作させることができます。実際のCSS3定義より簡単。

```html
 <div ng-view class="demo">Animate!</div>
```

なお、1.2.5の段階ではアニメーションが使用可能なdirectiveは以下のようになっています。

| Directive | Supported Animations |
|:-----------|:------------|
| ngRepeat | enter, leave and move |
| ngView | enter and leave |
| ngInclude | enter and leave |
| ngSwitch | enter and leave |
| ngIf	 | enter and leave |
| ngClass | add and remove |
| ngShow & ngHide | add and remove (the ng-hide class value) |

## 実践
実際作成してみたのがこちら。Animationに必要ないコードはなるべく省きました。

http://jsfiddle.net/icoxfog417/x94jb/

作ってみて気づいた点など。
* アニメーションで使用できる種類(linear/ease-inなど)は、CSS3のtransitionに準拠しています→[参考](http://webdev-nekodama.xii.jp/css/pDetail.php?g=animations&p=animation-timing-function&v=ease-in)
* add/removeなど、要素の追加/削除にのみ反応するようで、単純に表示/非表示が切り替わる際は反応しない
* どんなanimationにしようかな、と思ったときはパワポのアニメーションとかが参考になる。実装は[こちら](http://www.nganimate.org/)に色々なサンプルがあるのでご参考。

最後に、公式ドキュメントは[こちら](http://code.angularjs.org/1.2.5/docs/api/ngAnimate)。
アプリのアイコンを自動生成する


アイコンをプログラムによって生成して、デフォルトの真っ白なアイコンと差し替えた話です。

## 問題意識

開発中のiOSアプリはデフォルトで真っ白な（iOS7から幾何学模様）アイコンですが、開発中のアプリをいくつかインストールすると、ホーム画面に真っ白なアイコンがズラズラと並びます。iOSアプリを開発したことのある方であれば、見慣れた光景かと思います。こういう画面だと、一目でどのアイコンがどのアプリか判断つかないし、なによりiOSらしからぬダサいホーム画面になってしまいます。

一目でどれがどのアプリか分かって、かつ開発中のアプリで覆い尽くされてもホーム画面が華やかに見える状態を目指して、今回のソリューションを考案しました。

## picon

以上のような問題を解決するため、[picon](https://github.com/naoty/picon)というrubygemを作りました。Xcode 5.0以降が必須です。使い方は簡単で以下のとおりです。

```zsh
$ gem install picon
$ cd path/to/project
$ picon generate
```

これでこんな感じになります。

### Before

![picon_before_s.png](https://qiita-image-store.s3.amazonaws.com/0/1044/bd35114d-5177-835d-bf5d-77a68f3d410a.png "picon_before_s.png")

### After

![picon_after_s.png](https://qiita-image-store.s3.amazonaws.com/0/1044/f117fb38-7db7-d1f2-e558-af2c3437d344.png "picon_after_s.png")

piconはアプリのbundle identifier（com.example.SampleApp的なアレ）のハッシュ値に基づいた[identicon](http://en.wikipedia.org/wiki/Identicon)を生成し、デフォルトのアイコンと差し替えます。bundle identifierに基づいているので、アプリ毎にユニークなアイコンが生成されます。もちろんiPadやiOS 7など各解像度に合わせて生成して差し替えてくれます。実装の中身としては、Xcode 5.0から追加されたAsset Catalogという機能を使っています。新しいAsset Catalogを作成し、そこに生成したidenticonを追加して、最後にデフォルトのアイコンのAsset Catalogと入れ替えています。ちょっと強引なやり方をしていますが。

---

デフォルトのアイコンに見飽きたという方は、ぜひお使いください。また、まだまだ完成度は高くないのでpull reqやissueもお待ちしております。
R言語でdata.frameの加工（transform ifelse grepl）

試行錯誤中なのでひどいやりかたをしている可能性はあるので指摘歓迎．

read.csvしてきたdata.frameに対して，加工をいろいろやっている．どうやら文字列操作は素のままではあまり得意じゃないらしいことはわかってきた．文字列比較のための演算子は用意されておらず，grep とか gsub とかを使ってなんとかするっぽい．

適当なdata.frameについて，加工したものを新しいdata.frameに入れるのがセオリーっぽい．ということは，ある条件を満たす場合にフィールドに値を入れて追加するのならこんな感じか．

(transform(iris,ifsetos=ifelse(grepl("setos",Species),"yes", "NA")))

iris の Species で setos で部分文字列マッチ(grepl)したものについて，ifsetos という新たに追加したフィールド（transformによって）に"yes"を追加．マッチしない(elsifで)場合は"NA"を入れておく．

## はまりポイント
- grep 使うと真偽値じゃないものが返ってしまうらしく期待した動作にならずはまった．
- Char型ではなくFactor型になってしまうとelseで元の文字列を返したつもりが数字になってはまる．
- read.csv("hog.csv",as.is=T)
- hoge$hoge <- as.character(hoge$hoge)

多分もっとエレガントな方法はあると思うんだけど，とりあえず．