OmniAICreator/Qiita-1.07M huggingface dataset:
Railsの多対多モデルの触り方、三種

# はじめに

RDBを使っていると当然、多対多のモデルは出てきます。
触り方にはいくつかあるので投稿することにしました。

# サンプル

例として、`User`クラス、`UserGroup`クラスがあり、中間テーブルとして`UserGrouping`を作成したという前提で話を続けます。

```rb
AR = ActiveRecord::Baes
class User < AR
  has_many :user_groups
end
class UserGroup < AR
  has_many :user_groups
end
class UserGrouping < AR
  belongs_to :user
  belongs_to :user_group
end
```

ではUserGroupに属するUser一覧を取得するにはどうすればよいでしょうか。

## has_many though

この方法がRailsの推奨だと思われます。

- メリット
    - 資料が多い
    - ActiveRecord::Relationが返るので、再利用しやすい
- デメリット
    - リレーションが深くなると has_many though が中継箇所全てに出てきて邪魔
    - リレーションの途中で条件文などを挟めない

```rb
class UserGroup
  has_many :users, through: :user_groupings
end

user_group = UserGroup.first
users = user_group.users
```

## ActiveRecordのサブクエリ

ActiveRecordでSQLのサブクエリをシミュレートします。
発行されるSQLは他と違います（後述）

- メリット
    - ActiveRecord::Relationが返るので、再利用しやすい
- デメリット
    - SQLを意識して組み立てる必要がある

```rb
user_group = UserGroup.first
user_ids = UserGrouping.where(user_group_id: user_group.id).select(:user_id)
users = User.where(id: user_ids)
```

## SQLビルダー

ActiveRecordが内部で使っているというArelTableを使います。
SQLを書くのとほぼ変わらないのでそれなりの知識が必要です。

- メリット
    - SQLを組み立てるので`not`も`or`も自由自在
    - arelのクエリを返すメソッド同士を組み合わせて新しいクエリを作れる
- デメリット
    - ActiveRecord::Relationが返らない

```rb
user_group = UserGroup.first

t_u   = User.arel_table
t_ugg = UserGrouping.arel_table
query = 
  t_u.project(Arel.star)
    .join(t_ugg).on(t_u[:id].eq t_ugg[:user_id])
    .where(t_ugg[:user_group_id].eq user_group.id)
users = User.find_by_sql(query)
```

# おまけ

(1), (3)の方法では`JOIN`のSQLが発行され、(2)の方法では `IN`が使われます。

```sql
SELECT "users".*
FROM "users"
INNER JOIN "user_groupings"
  ON "users"."id" = "user_groupings"."user_id"
WHERE "user_groupings"."user_group_id" = 1
```

```sql
SELECT "users".*
FROM "users"
WHERE "users"."id" IN (
  SELECT user_id
  FROM "user_groupings"
  WHERE "user_groupings"."user_group_id" = 1
)
```

JOINを用いる場合、今回は中間テーブルがひとつだけど、２つ以上になると 同じIDを持つ行が複数行抽出されるので注意しないといけません。
私の経験では、外側は`IN`を用いたサブクエリ、サブクエリ内ではJOINでガンガンつなぐというのが一番書きやすかったです。
Railsでrake db:migrateの直後にrake db:migrate:redoを実行しよう

小ネタ備忘録

`rake db:migrate:redo` (= `rake db:rollback` + `rake db:migrate`) が何のためにあるのか最近までよくわかってなかったけど、
小さなマイグレーションで、 `rake db:rollback` の確認忘れを防ぐために最初に `rake db:migrate` が通ったらすぐに `rake db:migrate:redo` を実行する習慣をつけるとよさそう。

追記
Rails Best Practicesに同じことが書いてあった。

Double-check your migrations
http://rails-bestpractices.com/posts/32-double-check-your-migrations
イベント駆動型モデルでの並行処理設計の良い書籍とかないんですかね

並行プログラミングの設計に関する本に関して適当にググると 「[並行コンピューティング技法 ―実践マルチコア/マルチスレッドプログラミング](http://www.oreilly.co.jp/books/9784873114354/)」とか「[マルチコアCPUのための並列プログラミング](http://www.shuwasystem.co.jp/products/7980html/1462.html)」とかいったものが出てくる。これらの本の主題は、ソートや探索などの比較的大きな計算問題をどのように並列化して解くか、そしてアルゴリズムを問題の大きさやスレッドの数に対してどうスケールさせるかといふことだ。

しかし、一般的な GUI アプリ開発では、GUI を操作するためのスレッドと他のスレッドとの通信や同期の仕方が問題になる。これがうまく出来てゐないアプリでは、例えば

* 処理を行ってゐる間、アプリが操作を受け付けなくなる
* 処理を開始するボタンを素速く二回クリックしたら、二つの操作の結果が混ざって出力されたり片方の結果しか出力されなかったりする

などといった問題が発生したりする。
この類の問題を起こさないために必要なのは、大きな問題を並列化するアルゴリズムの知見ではなく、イベント駆動型パラダイムにおける通信・同期の方法論だ。さういふ方法論を勉強するのに適切な本や教材を (人に教へるために) 探してゐるのだが、見付からない。

リスナーを登録できる Future やアクターモデルが普及したと言ひがたい現状では、さういふ教材の存在を期待するのは尚早なのだらうか。
引数が 0 or 1 個の関数を呼ぶExコマンドを定義する方法


## やりたいこと

以下の関数を、

```vim
:function! s:Func_arg_zero_or_one(text)
:  if text != ""
:    echo "arg : ".a:text
:  else
:    echo "noarg!"
:  end
:endfunction
```

こんな風にExコマンドから実行したい

```vim
:CallFuncArgZeroOrOne      # echo noarg!
:CallFuncArgZeroOrOne test # echo test
```


## 先に結論

こんな感じになる

```vim
:command! -nargs=? CallFuncArgZeroOrOne call s:Func_arg_zero_or_one(<f-args>)
:function! s:Func_arg_zero_or_one(...)
:  if a:0 >= 1
:    echo "arg : ".a:1
:  else
:    echo "noarg!"
:  end
:endfunction
```

## command! で引数を指定

-nargs オプションを使う

```
属性を指定しなかった場合、ユーザー定義コマンドは引数を取りません
(引数が与えられた場合はエラーになります)。
-nargs属性を指定すると、ユーザー定義コマンドが引数指定できるようになります。次の属性が指定できます:

	-nargs=0    引数を取らない (デフォルト)
	-nargs=1    1個の引数が必要 (空白で区切られない)
	-nargs=*    いくつでも引数を取れる (0個以上)
		    空白で区切られる
	-nargs=?    0 もしくは 1 個の引数が取れる
	-nargs=+    引数が必ず必要。数はいくつでもよい
```

0 or 1個なので、-nargs=? とする

## command! 経由で、function に引数を渡す

&lt;f-args&gt; を使う

```
ユーザー定義コマンドの引数を関数に渡すには、<f-args>("function args")が利用できます。
これはコマンドの引数をスペースやタブ文字で区切り、それぞれの引数を別々にクォート("で囲む)し、カンマで区切ったリストにして<f-args>と置き換えます。
引数がない場合は <f-args> は取り除かれます。
```

## command の内容

こんな感じになる

```vim
:command! -nargs=? CallFuncArgZeroOrOne call s:Func_arg_zero_or_one(<f-args>)
```

が、実は上記コマンドを引数なしで実行するとエラーが発生

```
E119: Not enough arguments for function: Func_arg_zero_or_one
```

### 可変長引数

名前付き引数は、渡されないと例外が発生
そのため、0 or 1 個の引数を渡す場合、可変長引数を利用する

```
最後の引数を "..."にすることで、可変長の引数を使用できる。
関数の中では "a:1" や "a:2" のようにして可変長の引数にアクセスできる。
"a:0" は可変長引数が幾つあるかを示している (0であること、つまり引数がそれ以上ないこともある)。
"a:000" は全引数を持つリスト|List|を示している。Note "a:1" は "a:000[0]" と同じである。
```

関数を以下のように修正

```vim
:function! s:Func_arg_zero_or_one(...)
:  if a:0 >= 1
:    echo "arg : ".a:1
:  else
:    echo "noarg!"
:  end
:endfunction
```

## 参考

- :help
- [Vim-users.jp - Hack #158: ユーザコマンドを定義する](http://vim-users.jp/2010/06/hack158/)
- [Vim エディターのスクリプトの作成: 第 2 回 ユーザー定義関数](http://www.ibm.com/developerworks/jp/linux/library/l-vim-script-2/)
メールのテンプレートでSpringMessageマクロを使う

modelにリクエストコンテキストを渡す必要がある

```java
Map model = templateMailMessage.getModel();
model.put(AbstractTemplateView.SPRING_MACRO_REQUEST_CONTEXT_ATTRIBUTE, new RequestContext(request));
StringWriter writer = new StringWriter();
try {
	Template template = freeMarkerConfig.getConfiguration().getTemplate(path, locale);
	template.process(model, writer);
}
catch (IOException e) {
	throw new MailSendException("テンプレートファイルの読み込みに失敗しました。", e);
}
catch (TemplateException e) {
	throw new MailSendException("テンプレートファイルの解析に失敗しました。", e);
}
```
単体テスト時に動的にリソースのロケールを変更する

resフォルダに`values/strings.xml`と`values-ja/strings.xml`を配置すると、アプリ実行環境のロケールに応じて自動で使い分けてくれるので便利ですね。  
しかし単体テストの際にちゃんとl10nされているのかテストしようとするといちいち端末やエミュレータのロケールを変えるのは不便ですし開発スピードが落ちますので、コードで動的に変更してテストできるようにしてみました。  
リソースを呼び出すために`Context`が必要なので、テストケースは`InstrumentationTestCase`がいいと思われます。  
今回はテスト側でなく本体側に配置したリソースファイルを使い分けるサンプルを載せておきます。

```java

// Test extends InstrumentationTestCase

Context context = getInstrumentation().getTargetContext(); //本体側Contextを取得
Configuration config = context.getResources().getConfiguration(); //Contextのリソース設定を取得
config.locale = Locale.ENGLISH; //リソースに英語ロケールを設定
context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics()); //設定変更を反映
assertEquals("English resource string", context.getString(R.string.sample));
config.locale = Locale.JAPANESE; //リソースに日本語ロケールを設定
context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics()); //設定変更を反映
assertEquals("日本語リソース文字列", context.getString(R.string.sample));
```
海外サイトを翻訳してメール通知するシステムがGASとkimonoで超簡単に出来た


例えばHackerNewsのような海外のWebサイト。
英語が得意ではない僕は、タイトルだけでも読むのにメッチャ時間がかかる。
なのでそれらのサイトを定期的にスクレイピングして、その中身を翻訳して、メールで送ってくれるシステムを作ってみた。

## 作るにあたり使ったもの
・GoogleAppsScript
・kimono（http://www.kimonolabs.com/）

kimonoは登録したWebサイトをスクレイピングして、JSONやらCSVやらXMLで返してくれる素晴らしいWebサービス。
import.ioと同じ？

## 仕組み
1.kimonoでWebサイトをAPI化
2.GASでそのAPIからデータを取得
3.データを翻訳してメール送信して完了

## 具体的な方法
####kimonoでWebサイトをAPI化する方法
まずはkimonoに会員登録してこんなショートカットをブラウザにセット
![スクリーンショット 2014-03-27 11.09.08.png](https://qiita-image-store.s3.amazonaws.com/0/1389/30fd2c86-5d84-2ac8-7bbf-8f17447d0da4.png "スクリーンショット 2014-03-27 11.09.08.png")

次に対象のサイトにアクセス。
サイトが開いた状態でさっきブラウザに保存したショートカットを押すとこんな状態になる。
![スクリーンショット 2014-03-27 11.16.18.png](https://qiita-image-store.s3.amazonaws.com/0/1389/53a67829-2b98-4901-6f8e-7a275146951f.png "スクリーンショット 2014-03-27 11.16.18.png")

ここでAPIにしたい部分をクリック（今回はタイトル部分）するとこんな感じになる。
![スクリーンショット 2014-03-27 11.16.26.png](https://qiita-image-store.s3.amazonaws.com/0/1389/9c72d021-88c5-f180-675f-2146d430a7d6.png "スクリーンショット 2014-03-27 11.16.26.png")

ここで注意。
今タイトルっぽいところは全部黄色くなっているが、実は一番上の1つしかAPI対象になっていない。
全部選択したい場合は2行目以降にあるこのチェックマークを押すと全部選択された状態になる。

![スクリーンショット 2014-03-27 11.19.24.png](https://qiita-image-store.s3.amazonaws.com/0/1389/efd34ee9-c35f-2ccd-bf58-a26d990e1ece.png "スクリーンショット 2014-03-27 11.19.24.png")

を押すと右側のチェックマークが消えてこんな感じになる

![スクリーンショット 2014-03-27 11.15.51.png](https://qiita-image-store.s3.amazonaws.com/0/1389/ed04c99c-eb67-1f58-10bd-7cf5f378dea2.png "スクリーンショット 2014-03-27 11.15.51.png")


他にもAPIには出来るが、今回はこれだけで良かったのでこれで右上のDONEをクリック。
API名とかスクレイピングの頻度を設定して完了。

このAPIはJSON、csv、XML形式でアクセスが可能。
kimonoで作られたアドレスにアクセスしてみると、JSONだとこんなのが返ってくる。
![スクリーンショット 2014-03-27 11.28.51.png](https://qiita-image-store.s3.amazonaws.com/0/1389/e2ea37cf-cd9d-e59f-887e-196023a3e5ca.png "スクリーンショット 2014-03-27 11.28.51.png")
素晴らしいですね。
これでkimonoの設定は終わり。

###GoogleAppsScriptの設定
GASの基本的な作り方はググってもらえれば良いかと。
今回はコードだけ。

```javascript:translate.js
function translateAndSendMailer() {
  var jsonText = UrlFetchApp.fetch("kimonoで発行されたAPIのアドレス").getContentText();
  var results = JSON.parse(jsonText);
  var webTitles = results["results"]["collection1"];
  var mailBody = webTitles.map(function (hash, i, self) {
    return convertToText(hash);
  }).join("\n\n");

  MailApp.sendEmail("送りたいメールアドレス", "メールタイトル", mailBody);

  function convertToText(hash){
    var result = 
       LanguageApp.translate(hash["property1"]["text"], "en", "ja") + "\n" +
          hash["property1"]["href"];
    return result;
  }
}
```

完了。試しに一回送ってみるとこんなメールが届いた。
※kimonoのSSとこのメールのSSは時間が違うため内容の差はご了承ください。
![スクリーンショット 2014-03-27 11.39.04.png](https://qiita-image-store.s3.amazonaws.com/0/1389/8348fdd1-57a8-7f79-5732-5996d63162c9.png "スクリーンショット 2014-03-27 11.39.04.png")
これであとはトリガー設定して、好きな頻度で動くようにする。

これだけでAPIにしてくれたり、翻訳してくれたりメール送ったりkimonoとかGASとか便利すぎて鼻血出る。
でも翻訳がイマイチ何を意味してるかわかりにくいのでそもそも論英語の方が良いんじゃないかって説もなくはない。勉強することにする。。。
日付フォーマット

Javascriptで日付フォーマット用のメソッドを作成してみた。

```js
/**
 * 日付フォーマット
 * 
 * @param {Date} date フォーマット対象
 * @param {String} format フォーマット（省略可）
 * @return {String} フォーマット後文字列
 */
function df(date, format) {
    // 初期化
    var ret = null;
    // パラメータチェック
    if (date && date instanceof Date) {
        // 置換情報列挙
        var infos = [
            { m: "date.getFullYear()", r: /y+/g },
            { m: "date.getMonth() + 1", r: /M+/g },
            { m: "date.getDate()", r: /d+/g },
            { m: "date.getHours()", r: /H+/g },
            { m: "date.getMinutes()", r: /m+/g },
            { m: "date.getSeconds()", r: /s+/g },
            { m: "date.getMilliseconds()", r: /S+/g }
        ];
        // フォーマットチェック
        if (format) {
            // フォーマットを設定
            ret = "" + format;
        } else {
            // フォーマットデフォルト値を設定
            ret = "yyyy-MM-dd HH:mm:ss.SSS";
        }
        // 置換情報分ループ
        for (var i = 0; i < infos.length; i++) {
            // 置換情報チェック
            var matchs = ret.match(infos[i].r);
            if (matchs) {
                // 置換有り
                // 置換値を取得
                var value = eval(infos[i].m);
                // ソート（文字数の多いのからやらないと、誤爆する）
                matchs = matchs.sort();
                // 置換個数分ループ
                for (var j = matchs.length - 1; j >= 0; j--) {
                    // 置換対象文字数チェック
                    if (matchs[j].length == 1) {
                        // 文字数１の場合は、値をそのまま置換
                        ret = ret.split(matchs[j]).join(value);
                    } else {
                        // 文字数が１以上の場合は、0埋め
                        var zero = "";
                        while (zero.length < matchs[j].length) {
                            zero += "0";
                        }
                        ret = ret.split(matchs[j]).join((zero + value)
                            .slice(-matchs[j].length));
                    }
                }
            }
        }
    }
    return ret;
}
```

が・・・、たいしてフォーマットを変えないのであれば
こんなの作ったほうが処理速度が１０倍速いｗｗｗｗｗ

```js
function df2(date) {
    var ret = null;
    if (date && date instanceof Date) {
        ret = date.getFullYear() + "-"
            + ("0" + (date.getMonth() + 1)).slice(-2) + "-"
            + ("0" + date.getDate()).slice(-2) + " "
            + ("0" + date.getHours()).slice(-2) + ":"
            + ("0" + date.getMinutes()).slice(-2) + ":"
            + ("0" + date.getSeconds()).slice(-2) + "."
            + ("00" + date.getMilliseconds()).slice(-3);
    }
    return ret;
}
```
フリーランスなどで仕事のコンテキストを頻繁に切り替える人のためのタブグループ管理


今フリーランスで仕事をしていて
 - A社ではA社のAWSアカウントと業務向けの調べ物とチャットのタブ
 - B社ではB社のGmailのタブ
 - C社ではC社のFacebookチャットとGoogle drive
みたいな仕事のコンテキストごとにすごくたくさんのタブグループがあってこれをどう管理しようか迷った結果、結局Chromeで仕事単位でユーザを作る方法に落ち着いた。

ちょっとしたTIPSとしてはChromeのユーザ管理上同じGoogleアカウントを持つChromeユーザを複数持てない。

そのため、アカウント作成直後のこの画面では自分の場合はほとんど常に「今回はスキップ」を選んでいる。
![kobito.1395891681.017388.png](https://qiita-image-store.s3.amazonaws.com/0/19201/e7505710-3ae6-1f41-98fa-fc56173772bb.png "kobito.1395891681.017388.png")


こんな感じで仕事ごとのユーザを作る。
![kobito.1395891427.500980.png](https://qiita-image-store.s3.amazonaws.com/0/19201/0a464857-38d2-e517-92fc-f8277938037a.png "kobito.1395891427.500980.png")

右上にどのユーザのセッションなのか表示されるので視認性も高い。
![kobito.1395891449.650100.png](https://qiita-image-store.s3.amazonaws.com/0/19201/39ff2244-24b3-ddf0-635f-0def9483e141.png "kobito.1395891449.650100.png")

仕事モードなユーザのセッションではFacebookとかTwitterとかログインしない(一件Facebook必須な仕事があるけどそういう場合のみ例外)などの副次的な効果もあってよい

他の方法としてはProject Tab Managerを使う方法もあるが、自分が今どのセッションを使っているのかすぐわかるという面でユーザを作ったほうが楽な気がしている。

https://chrome.google.com/webstore/detail/project-tab-manager/iapdnheekciiecjijobcglkcgeckpoia?hl=jahttps://chrome.google.com/webstore/detail/project-tab-manager/iapdnheekciiecjijobcglkcgeckpoia?hl=ja
XVimがXcode5.1で動かない件


###問題
Xcode5.1にアップデートするとXVimが動かなくなりました。
XcodeでXVimをコンパイルしてもエラーになりました。


###解決策
調べたところdevlopブランチでは対策済みらしい。

```
cd git/XVim
git checkout develop
git pull
```

でXcodeでXVimをビルドし直せばOK。


そのうちmasterブランチにも反映されるでしょう( ´∀｀)
Groovyでライブラリのjavadocを生成する


あるライブラリのAPIが見たかったが、ネット上にjavadocが公開されてなかった。
とりあえずソースコードのzipを落として解凍する。

javadocコマンドで生成しようとしたけれど、なんか上手くいかないのでGroovyのAntBuilderを使った。
groovy -e で一発生成。

```shellscript:
cd /path/to/sourcedir
groovy -e "new AntBuilder().javadoc(destdir:'javadoc'){fileset(dir:'.')}"
```
Idobataで使えるスタイル指定

IdobataではHook経由でHTMLをPOSTすることができる。style属性はストリップされてしまうんだけど、class属性を指定することができる。メッセージ中に使用されることを意図しているかどうかはわからないけど、下のようなスタイルが使えて結構便利だ。

## Label
角丸のラベルっぽい感じにできる。`label-*` classを使うことで色を変えることができる。

```html
<span class="label">ラベル</span>
<span class="label label-important">ラベル</span> <!-- 色を変える -->
```

|class|サンプル|
|:--|:--|
|`.label`|![.label](https://qiita-image-store.s3.amazonaws.com/0/5218/c14de46c-61b5-065a-0099-e386717b717c.png)|
|`.label.label-important`|![label-important](https://qiita-image-store.s3.amazonaws.com/0/5218/bed3cbcb-7554-be87-90dd-9a8cecd94477.png)|
|`.label.label-warning`|![.label-warning](https://qiita-image-store.s3.amazonaws.com/0/5218/e7491c27-531f-3436-9270-7aaf89d8af37.png)|
|`.label.label-success`|![.label-success](https://qiita-image-store.s3.amazonaws.com/0/5218/ea59e591-a18a-0b61-b38e-6854170e1c38.png)|
|`.label.label-info`|![.label-info](https://qiita-image-store.s3.amazonaws.com/0/5218/dd004ae4-72a5-53ec-b91d-db2d23c8b0ae.png)|
|`.label.label-inverse`|![.label-inverse](https://qiita-image-store.s3.amazonaws.com/0/5218/58289007-6833-0c11-48b4-aeffaa5754f3.png)|

## Badge

左右が半円になっているやつになる。数字を表示するときとかに便利。
background属性を上書きしたいけどbackground-color属性が使われてるので色が反映されない。残念。`.badge-important`だけ他のブロックで指定されてるのは別の要素に使ってるのが偶然効いてるだけのようにみえる。

```html
<span class="badge">ラベル</span>
<span class="badge badge-important">ラベル</span> <!-- 色を変える -->
<span class="badge badge-warning">ラベル</span> <!-- バグなのか仕様なのか色は変わらない -->
```

|class|サンプル|
|:--|:--|
|`.badge`|![.badge](https://qiita-image-store.s3.amazonaws.com/0/5218/401b16e2-1d81-ac81-4943-dd7f04598725.png)|
|`.badge.badge-important`|![.badge-important](https://qiita-image-store.s3.amazonaws.com/0/5218/006079f6-6f20-b587-f56c-738e3aadff9a.png)|
|`.badge.badge-warning`|![.badge](https://qiita-image-store.s3.amazonaws.com/0/5218/401b16e2-1d81-ac81-4943-dd7f04598725.png)|
|`.badge.badge-success`|![.badge](https://qiita-image-store.s3.amazonaws.com/0/5218/401b16e2-1d81-ac81-4943-dd7f04598725.png)|
|`.badge.badge-info`|![.badge](https://qiita-image-store.s3.amazonaws.com/0/5218/401b16e2-1d81-ac81-4943-dd7f04598725.png)|
|`.badge.badge-inverse`|![.badge](https://qiita-image-store.s3.amazonaws.com/0/5218/401b16e2-1d81-ac81-4943-dd7f04598725.png)|

## 絵文字

### Emoji

`:smile:`とかは変換されないようなので、imgタグを使うことで実現する。

```html
<img class="emoji" alt=":smile:" src="/images/emoji/smile.png" height="20" width="20">
```

### FontAwesome

[FontAwesome](http://fortawesome.github.io/Font-Awesome/)の絵文字が使える。

```html
<i class="fa fa-camera-retro">カメラ</i>
```

## その他

### commit-id

コミットIDをmonospaceにするためだけに使われている。

```html
<span class="commit-id">ABCDEF</span>
```

## まとめ

お気に入りのclass指定ですばらしいIdobataライフを！
Railsのマイグレーションファイルでモデルに触ってはいけない

# はじめに

これは migrationファイルのサンプルだが、何が悪いかわかるだろうか。

```rb
class AddNameToUser < ActiveRecord::Migration
  def change
    add_column :users, :name, :string
    User.find_each do |u|
      u.name = u.email.split("@")[0]
    end
  end
end
```

このファイルを使ってマイグレーションした時にはエラーは発生しない。しかし新たな環境にデプロイする時に謎のエラーが発生するかもしれない。

# 原因

`ActiveRecord::Base`を継承したクラスはインスタンスを作成するタイミングで、データベーススキーマを確認する。
上記の例では、`find_each`の中で`users`テーブルのスキーマを確認し、`User`クラスに保存しておく。

このスキーマ情報は各モデルクラスにキャッシュされる。インスタンス化のたびにスキーマを参照するわけにはいかないので当然だろう。
しかしマイグレーション時には、このキャッシュが悪さをする。

さらにユーザに`nick_name`というフィールドを追加することにした。

```rb
class AddNickNameToUser < ActiveRecord::Migration
  def change
    add_column :users, :nick_name, :string
    User.find_each do |u|
      u.nick_name = u.name
    end
  end
end
```

これもおかしなプログラムではない。しかし２つのマイグレーションを連続で実行するとエラーが発生する。
最初の`AddNameToUser`でスキーマがキャッシュされる。この時点では`nick_name`というフィールドは無い。
次の`AddNickNameToUser`でスキーマはキャッシュされており、読み込まない。この結果`User`クラスは`nick_name`フィールドを持たないということになり、代入時にエラーが出る。

# 対応

実際のところ`db:migrate`が失敗に終わっても`AddNameToUser`の直前まではマイグレートが完了している。つまりエラーがでなくなるまで`rake db:migrate`を繰り返し実行すれば問題は回避する。いわゆる「運用でカバー」だ。

しかし問題は解決しておこう。この問題はスキーマがキャッシュされるのが原因なので、キャッシュさせなければよい。つまり、以下のようなコードを書けば良い。

```rb
class AddNameToUser < ActiveRecord::Migration
  # キャッシュされるクラス
  class User < ActiveRecord::Base; end

  def change
    add_column :users, :name, :string
    User.find_each do |u|
      u.name = u.email.split("@")[0]
    end
  end
end
```

こうすることで、スキーマがキャッシュされるのは `AddNameToUser::User` であり、他のマイグレーションには影響を与えない。複数のテーブルを扱うのであれば、その数だけ定義し、`has_many`などのリレーションをはること。

残念ながらmodelのロジックを流用するには面倒だが、定数の利用くらいならできる。

```rb
class AddNameToUser < ActiveRecord::Migration
  class User < ActiveRecord::Base; end

  def change
    add_column :users, :name, :string
    User.find_each do |u|
      u.name = ::User.DEFAULT_NAME
    end
  end
end
```

# まとめ

運用でカバーできるので頑張らなくても良いかもしれない。
しかし、綺麗に一発でマイグレーションできたほうが気持ちが良いし、
bash等のスクリプトで実行する場合 `while` を書く必要が出たりで面倒なので、そういうもんだと思って上記の方法を取るのが良いように思う。
GDまたはImagick拡張でexif情報を削除する

GDだとCOMMENTセクションが勝手につく。

```php:exif1.php
<?php

$gd = imagecreatefromjpeg( "in.jpg" );
$w = imagesx( $gd );
$h = imagesy( $gd );
$gd_out = imagecreatetruecolor( $w, $h );
imagecopyresampled( $gd_out, $gd, 0,0,0,0, $w,$h,$w,$h );
imagejpeg( $gd_out, "out.jpg" );
imagedestroy( $gd );

print_r( exif_read_data( "out.jpg" ) );
// exifにCOMMENTが勝手につく
// [COMMENT] => Array
// (
//  [0] => CREATOR: gd-jpeg v1.0 (using IJG JPEG v80), default quality
// )
```

Imagick拡張使えば何も残らない。

```php:exif2.php
<?php

$im = new \Imagick( "in.jpg" );
$im->stripImage();
$im->writeImage( "out.jpg" );
$im->destroy();

print_r( exif_read_data( "out.jpg" ) );
// exif情報全部消える
```
試験表の作り方

# はじめに

（ここで言う）試験表とは、ソフトウェアの試験項目をExcelにまとめ、テスターが実施時にPASS, FAILを記入し、後から試験結果を参照できるようにしたものである。

Qiitaにはプログラマ層の投稿は多いが、この層の投稿は少ないように見受けられたので、記事を書いてみることにする。

過去の投稿を見ればわかるが、私はこの道（つまり品質保証の）の専門家ではない。おかしなところがあれば、コメントにどんどんツッコミを入れてほしい。

# 作り方

## 項目の列挙

最初にExcelを開いてはいけない。まずはテキストエディタ（メモ帳）を開こう。

試験したい項目をリスト状に列挙する。中項目・小項目があれば bullet の数を増やすなりインデントするなりして、なんでもいいので列挙する。

本当なら「どのような観点でこの項目を挙げたのか」があると良いのだが、一朝一夕にできるものではないと思っているし、ここで議論できるほど私のレベルも高くない。
（コメントでフォローしてくれる奇特な方を募集しています）


例：

```text
- アプリの起動
- ログイン画面
  - ログインできる
  - ユーザIDが間違っていた場合
  - パスワードが間違っていた場合
    - エラー内容
    - フォーカス位置
```

「ログインできる」と「間違っていた場合」が並列にあるのはおかしいが、列挙するときは後回しにしてよい。余計なことを考えると見落としが増えてしまう。

## レビュー

列挙が終わったら、上記のおかしい部分を直した後、チームメンバーとテスト項目をレビューする。
おかしい部分を直すのは後回しにしても良いのだが、レビューアーもおかしなところがあると突っ込みたくなる。雑念をなくすためにも先に直したほうがよいだろう。

ツリー状に列挙されたものを見ると、項目全体のバランスの悪さに目が行くようになる。バランスの悪さとは、何故その試験が不要なのかという疑問へと変わり、レビューしやすい。

## 試験「表」の作成

レビューが通ったら、列挙した項目をExcelに移していく。
この時「試験手順」と「期待動作」を必ず加えること。これがないと実際にどうテストしてよいのかわからず、途方に暮れ、開発者に聞きに行くという残念な流れになってしまう。

他には実施するときのために「試験実施者」「実施日時」「結果（PASS/FAIL）」「備考」などを加える。
「備考」は試験項目に対する備考と、試験結果に対する備考を分けて書けるようにしておくと良いと思っている。

あとは適時「試験番号」や「試験対象（○/×）」などを加えたりする。
試験番号は顧客や開発者間やトラッカーで「何番のバグが……」と言及するときに使える。しかし試験項目は増えたり減ったりするうえに（この時の番号って普通どうするんでしょうか）Excelの行番号もあるので、なくてもどうにかなると思っている。
試験対象は、今回試験するかスキップするかを記入する。試験としては本来これだけのものを確認するが、とある事情によりスキップする、というのを明示できる。項目自体を削るよりよい運用ができるだろう。

## Tips

試験結果をわかりやすくするために、Excelの機能を全力で使うべきである。

試験全体が何件あって、進捗が何％で、PASSが何％で、などといった情報を確認できる別のシートを用意するのがよい。
表のヘッダは固定すべきである。試験実施日の欄にうっかり自分の名前をかいてしまわないように。
PASSの場合は緑、FAILの場合はピンクに自動的に塗る機能がある。試験結果をスクロールしたときFAILが目につくようにやっておくとよい。
セルの結合はせず、繰り返し入力したほうがよい。結合するとスクロール中に見えなくなったり、FAILのものだけフィルタリングした時に変になったりする。

# おわりに

私にとって、プログラムを書いているときは幸せだが、試験表を作っていてもテストを実施していても幸せではない。
しかしサボるとツケが返ってくるのはどちらも一緒で、うまくやれば手間を省けるのも一緒である。
やりたくないことなら時間をかけない方向に努力するのがよいだろう。
numpyで逆順の累計を求める

```py3
import numpy as np

def rcumsum(array, axis=0):
    s = tuple([slice(None,None,-1)] * axis + slice(None))
    return np.cumsum(array.__getitem__(s), axis=axis).__getitem__(s)
```

要するに、np.cumsum(array[:,::-1], axis=1)[:,::-1]などとすれば良いだけの話なのですが、汎用的な処理にするためにスライスオブジェクトを使っています。numpyでは妙にsliceオブジェクトを多用しています。
Eclipse上からPlay runする

EclipseからワンクリックでPlay runする方法のメモ。

[Eclipse 上からコマンドプロンプトを開く - Qiita](http://qiita.com/hoxo_m/items/b0bdea7daa69d741267e)を参考にさせていただきました。

## Eclipseの設定

1.Run->ExternalTools->ExternalTools　Configurationsを開きます。

2.左ペインでProgramを選択してNewを選択します。

3.適当に名前を付けます。

4.Locationにコマンドプロンプトのパスを設定します。以下はWin7の場合です。

>C:\Windows\System32\cmd.exe

5.Argumentsにフォルダを指定してコマンドプロンプト開き、playを起動するコマンドを設定します。
>/c start /d "${project_loc}"
>play run

ここまで設定すると以下のようになります。
![m01_eclipseからplayrun.JPG](https://qiita-image-store.s3.amazonaws.com/0/38582/8398d607-e3fa-5780-3061-87dc14d085dc.jpeg)

6.保存して実行してみます。コマンドプロンプトが起動後、Playが起動したらOK。

## 次回からのPlay run実行
メニューアイコンのRun Last Tool（右向き三角にカバンのアイコン）をクリックします。

![b3355f00-a3f9-6028-ac94-952cfd0fe3c8.jpeg](https://qiita-image-store.s3.amazonaws.com/0/38582/0a154e43-9583-1944-d617-05ff5e18754d.jpeg)

他のコマンドが打ちたいときはコマンドプロンプトからPlayを停止してから打てばOK。
PlayFramwork1.2でBootstrap3.xを使う

# はじめに
PlayFramwork1.2でBootstrap3.xを使う方法のメモ。
Play用に特別なことをしているわけではありませんが一応メモ。

# Bootstrapをダウンロードして解凍する
http://getbootstrap.com/

# PlayプロジェクトのPublic配下に配置する
![Play_Bootstrap.png](https://qiita-image-store.s3.amazonaws.com/0/38582/3105396a-85bd-9612-8713-d5a1647d97ba.png)

# テンプレート（view）でBootstrapを読み込む
[Bootstrap公式のサンプル](http://getbootstrap.com/getting-started/#template)を参考に、テンプレートでBootstrapを読み込みます。

```html:main.html
<!DOCTYPE html>

<html>
    <head>
        <title>#{get 'title' /}</title>
        <meta charset="${_response_encoding}" name="viewport" content="width=device-width, initial-scale=1.0" name="ROBOTS" content="NOINDEX,NOFOLLOW">
        <!-- Bootstrap -->
        <link href="@{'public/bootstrap-3.0.3-dist/dist/css/bootstrap.min.css'}" rel="stylesheet">
        <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
        <script src="@{'public/javascripts/jquery-1.10.2.min.js'}"></script>
        <!-- Include all compiled plugins (below), or include individual files as needed -->
        <script src="@{'public/bootstrap-3.0.3-dist/dist/js/bootstrap.min.js'}"></script>
        <script src="@{'public/javascripts/bootbox.min.js'}"></script>
        <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
        <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
        <!--[if lt IE 9]>
          <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
          <script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
        <![endif]-->
        #{get 'moreStyles' /}
        <link rel="shortcut icon" type="image/png" href="@{'public/images/favicon.png'}">
        #{get 'moreScripts' /}

    </head>
```

# おまけ
bootstrapのカスタマイズは↓のやり方でやっています。
[lessがわからない人のBootstrap簡単カスタマイズ方法 - Qiita](http://qiita.com/maruyam-a/items/c5642a4cb279be75a1b2)
Railsの薄いコントローラー

# はじめに

まず最初に、コードを見てほしい
これは Ruby on Railsで書かれた薄いコントローラーの例である。

※ 薄いコントローラー ＝ ロジックをモデルに押し出しつけ、自分はほとんどコードを持たないコントローラー

```rb
module Api
  class MaterialsController < BaseController
    def index
      render json: handler.find_all
    end
    def show
      render json: handler.find_one(params[:id])
    end
    # ...
    def update
      render json: handler.update(params[:id], params[:material] || {})
    end

  private
    def handler
      MaterialHandler.new(current_user)
    end
  end
end
```

一見すると、「このコード薄いけど何か意味があるの？」「やり過ぎだろ」と思うかもしれない。
しかしこれが私の悩んだ末の結論であり、現在のプロジェクトで実際に動いてるコードである。

# 解説

先に`MaterialHandler`が何をするクラスなのか説明しておこう。
このクラスは`current_user`が素材を閲覧・作成する機能を提供している。具体的には`Material`から複雑なリレーションをたどって`current_user.id`で絞り込む、作成時に`created_by`にユーザIDを突っ込む、などの処理を行っている。

では`XxxHandler`というクラスはどのような役割を果たすのだろうか。
雑な言い方をしてしまうとHandlerは「ついついControllerにかいてしまいがちなロジックの受け皿になるクラス」である。

このようなクラスを用意した理由を綺麗に説明するのは難しいのだが

- ControllerはHTTPに専念してほしい
- Controllerはテストしづらい
- Controllerは再利用できない
- Modelが肥大化するのは嫌だ
- あるModelに複数のモデルにまたがった感心事を書くのはなにか違う気がする

といったところだ。

## ControllerはHTTPに専念

HandlerはRubyのオブジェクトを返す。ControllerはそれをJSONにしクライアントに返す。
Handlerが例外を投げた場合、Controllerはそれに応じたHTTPステータスを返す。（ちなみにそれはBaseController側でやっている）

## Controllerはテストしづらい

RailsのControllerのテストを書いてみればわかるが、実際の感心事に入る前に、ログインや`get :action`やJSONパースなどが入り、正直テストが読みづらい。テストはただでさえ冗長なコードになりやすいので、回避できるのならすべきである

## Controllerは再利用できない

現在のプロジェクトでは、素材(Material)を複数つかってコンテンツを作成できる。このAPIを提供するのが`ContentsController`だ。

```rb
class Api::ContentsController < Api::BaseController
  def add_material
    render json: handler.add_material(params[:id], params[:material_id])
  end
end
```

`ContentsController#add_material` では、あるユーザがあるコンテンツを参照してよいかのチェックに加え、素材の権限チェックも行う必要がある。（でないと本来見れないはずの素材をコンテンツに追加できてしまうので）

もし、権限チェックのロジックをMaterialsControllerに書いたとすると、ContentsControllerからMaterialsControllerのメソッドを呼ぶことになる。やってみればわかるが、Controllerのアクションは `params`から情報を得る前提で書かれているので、再利用が極めて難しい。
ContentHandlerからMaterialHandlerを再利用するのは極めて容易だ。

## Modelが肥大化するのは嫌だ

Railsでロジックをモデルに押し付けていくと、当然モデルは肥大化していく。１万を超えるRailsプロジェクトだと余裕で数百行の巨大モデルができてしまう。
なんらかのルールを決めてロジックは複数ファイルに分割する必要がある。このときルールを曖昧にするとRailsのCoC（設定より規約）つまり「〜が知りたいときは〜を見ればいいのか」という勘が働かなくなってくる。

## あるModelに複数のモデルにまたがった感心事を書くのはなにか違う気がする

あるユーザがある素材を閲覧できるか確認する、このロジックはUserクラスに書くべきか、Materialクラスに書くべきか。この問題はOOPで常に起こる問題である。
経験則上、これはUserでもMaterialでもない新たなクラスを利用するのが良かった。今回はURLに合わせて（つまりController名を合わせて）MaterialHandlerにロジックを書くようにしている。

今回のプロジェクトでは、感心事がMaterialで閉じる場合はMaterialクラスに、他のクラスと協調して動作する場合はMaterialHandlerに書く、というルールで書いている。

## Handlerという語

実際のところHandlerよりManagerのほうが良いように思っている。もっと良い名前があるのかもしれない。
この名前は補完ベースで考えており、`cd a[TAB]ha[TAB]` で `cd app/handlers/` まで補完されて欲しかった。`managers`にすると`mails` と競合しタイプ数が増えるので避けた。

# おわりに

Railsは大変良いWebフレームワークだが、どんなフレームワークを利用してもコードの規模が大きくなるにつれて保守しにくいコードになる。
今回例示したHandlerをそのまま使う必要は無いが、あなたのコードを整理する何かの手助けになれば幸いである。

## おまけ

ちなみに記事中ではいろいろカッコつけてるが、Handlerへの移行が悩んだ末の結果であるため、現在のプロジェクトではAPI部分こそ概ねHandlerだが、一部はModuleに書いてリフレクションとincludeで頑張り、一部はControllerにベタ書きする、といった残念なコードになっている。
時間と工数の兼ね合いもあるので、ゆるしてほしい。
JScriptでODBCのドライバ一覧を表示

```html:listODBC.bat
cscript.exe //Nologo listODBC.js
```

```javascript:listODBC.js
WScript.Echo("BEGIN");
try {
    // 「SWbemLocator」オブジェクト取得
    var locator = new ActiveXObject("WbemScripting.SWbemLocator");

    // 「SWbemServices」オブジェクト取得（ローカルコンピュータ、名前空間が「root\default」）
    var server = locator.ConnectServer(null, "root\\default");

    // 「SWbemObject」オブジェクト取得（「StdRegProv」オブジェクト）
    var object = server.Get("StdRegProv");

    // 「EnumValues」メソッド取得
    var method = object.Methods_.Item("EnumValues");

    // パラメータ用「SWbemObject」オブジェクト生成
    var params = method.InParameters.SpawnInstance_();

    // パラメータ設定
    params.hDefKey = 0x80000002; // HKEY_LOCAL_MACHINE(0x80000002)
    params.sSubKeyName = "SOFTWARE\\ODBC\\ODBCINST.INI\\ODBC Drivers";

    // メソッド実行（結果パラメータ取得）
    var result = object.ExecMethod_(method.Name, params);

    // 結果を出力
    var names = result.sNames.toArray();
    for (var i = 0; i < names.length; i++) {
        WScript.Echo("" + names[i]);
    }
} catch (e) {
    WScript.Echo("Exception(" + (e.number & 0xFFFF) + "):" + e.message);
}
WScript.Echo("END");

WScript.Quit(0);
```
ATOMエディタでカーソル行にアンダーラインをつける


Preferences（```cmd-,```） -> Themes -> 「your stylesheet」リンクから「styles.less」を開く

style.lessに以下を追記

```CSS:style.less
.editor {

  .line, .line-number {
	// カーソル移動するたびにちょっとずれるのが気になる人は
    border-bottom: 1px solid rgba(0, 0, 0, 0);
  }

  .line.cursor-line {
	// カーソル行の背景色
    background: rgba(250, 150, 0, 0.2);
	// カーソル行のアンダーライン
    border-bottom: 1px solid rgba(250, 150, 0, 1);
  }
}

```

単純にカーソル行だけにborder-bottomを指定するとカーソル移動ごとに表示がずれるのが気になったので、全体的にborder-bottomを指定することで対応してみた。この対応だと行間がすこし空いてしまうのがちょっと残念。
タイルゲームを作ってみる

## はじめに

パズドラみたいな動きを実装してみたいと思い、タイルゲーム的なものを作ってみました。得点などのゲーム的な要素がまったく実装できていないので、ゲームとは名ばかりですが、ころころとタイルを動かしてみると、なんとなく和みます。

今回紹介する内容は、前々回の[パレットを作ってみる](http://qiita.com/t-mochizuki/items/842d312f8b0fa99ccdc5)で紹介した内容を利用すると、より楽しめるかと思います。いつものように、どんなものをつくったか？どのようにつくったか？を書いてみたいと思います。

## どんなものをつくったか

![mochi0327.png](https://qiita-image-store.s3.amazonaws.com/0/29884/8ec7610a-1c3a-2b3d-ca83-5b9cdf28017d.png)

## どうやってつくったか

まず、次のコマンドを実行します。

```
$ rbenv exec rails new tilegame
$ cd tilegame
$ rbenv generate controller Bingo sample
```

次に、実装を追加します。まずはビューから実装します。

``` sample.html.erb
<h1>Bingo#sample</h1>
<p>Find me in app/views/bingo/sample.html.erb</p>

<table id="board" style="border-collapse: collapse">
	<tr>
		<td style="background: #F00; width: 50px; height: 50px"></td>
		<td style="background: #0F0; width: 50px; height: 50px"></td>
		<td style="background: #00F; width: 50px; height: 50px"></td>
	</tr>
	<tr>
		<td style="background: #FF0; width: 50px; height: 50px"></td>
		<td style="background: #F0F; width: 50px; height: 50px"></td>
		<td style="background: #0FF; width: 50px; height: 50px"></td>
	</tr>
	<tr>
		<td style="background: #000; width: 50px; height: 50px"></td>
		<td style="background: #FFF; width: 50px; height: 50px"></td>
		<td style="background: #F0F0F0; width: 50px; height: 50px"></td>
	</tr>
</table>
```

次にマウスのポインタが画像の上に移動したときの動きを実装します。

``` bingo.js.coffee
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://coffeescript.org/

class Board
  _onBoard: null
  _oldStyle: null

  _exchange: (newtd) ->
    $oldtd = $("#board td").filter("[style = \"" + @_oldStyle + "\"]")
    newStyle = $(newtd).attr("style")
    $(newtd).attr("style", @_oldStyle)
    $oldtd.attr("style", newStyle)

  _execute: (self, td) ->
      if self._oldStyle?
        self._exchange(td)

  _eventify: ->
    $("#board").hover =>
      @_onBoard = true
    , =>
      @_onBoard = false
      @_oldStyle = null

    self = this

    $("#board td").hover ->
      self._execute(self, @)
      self._oldStyle = $(@).attr("style")
    , ->
    @

  constructor: ->
    @_eventify()

# main
$ ->
  board = new Board()

# /* vim: set sw=2 sts=2 et : */
```

## まとめ

テトリスやぷよぷよみたいな動きを実装できれば、もっとよくなりそうです。
capistrano (2.x) で環境変数を設定する / 確認する

2.x系の話です。

# 設定するには

```default_env``` を使う。

```ruby
set :default_environment, {
  'RAILS_ENV'  => 'target_environment',
  'RAILS_ROOT' => '/path/to/rails/root'
}
```

# 確認するには

`printenv` を `invoke` する。

```shell-session
cap invoke COMMAND=printenv
```

# see also

* [Capistrano: Can I set an environment variable for the whole cap session? - Stack Overflow](http://stackoverflow.com/questions/7602548/capistrano-can-i-set-an-environment-variable-for-the-whole-cap-session)
* [Rails - はじめてのCapistrano - Qiita](http://qiita.com/mosson/items/1a4cfd01cb538f2d8f0e)
UNIX/Linux/MacOSX関係の忘れないメモ

コピペで使えるメモ

# カレントディレクトリ以下のファイルの中身を調べる。
`find . -type f -print | xargs grep "hoge"`


# ディレクトリの総容量を適切なサイズで表示してくれる。
`du -hs`

# IPAddressを抽出する

`ifconfig | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'`

特定のNICの場合
`ifconfig etcd0| grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\} `

Docker inspectの場合

`docker inspect $CONTAINER_ID | grep IPAddress | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'`

# 改行を"\n"に置き換える(MacOSX)
`pbpaste | sed -e :loop -e 'N; $!b loop' -e 's/\n/\\n/g' | pbcopy`
westonアニメーション処理覚書

weston1.4アニメーション処理個人的覚書

* アニメーション処理はsrc/animation.cに集約されている
* `weston_view_animation_run()`でアニメーション処理の登録を行っている
* 1.4現在`weston_view_animation`がanimation.cに定義されているため、新たな種類のアニメーション処理を追加するにはanimation.cに実装するしかない
* 1.4現在animation.cには`weston_fade_run()`,`weston_zoom_run()`,`weston_slide_run()`,`weston_move_scale_run()` が実装されている

## weston_view_animation_run()

`weston_fade_run()`等各種アニメーション登録処理から呼ばれている。


```c:animation.c
        wl_list_insert(&view->geometry.transformation_list,
                       &animation->transform.link);
```
この登録により描画する際にanimaion->transformで指示されたアフィン変換を行ってから描画をおこなう。
描画するごとにanimation->frameに登録されたcallback関数でanimation->transformを変化させることによりアニメーションを実現している。

## 描画毎コールバック関数

```c:animation.c
typedef void (*weston_view_animation_frame_func_t)(struct weston_view_animation *animation);
```

上記`weston_view_animation_run()`にて`weston_view_animation::frame`に登録され描画の際に呼び出される。

`weston_view_animation`は`weston_spring`型のspringメンバを持っており、これはバネの動きを模倣している(`weston_spring_update()`参照)
コールバック関数ではバネの現在位置を表すcurrentメンバを参照してanimation->transformを変形させている。

## アニメーション終了時コールバック関数

```c:conpositor.h
typedef void (*weston_view_animation_done_func_t)(struct weston_view_animation *animation, void *data);
```

アニメーション処理の終了時にもコールバック関数が呼ばれる。
各アニメーション登録関数ではユーザー定義のコールバック関数を引数で指定できる。

viewを移動させるアニメーションを行った場合は終了時コールバック関数の中で、view->geometry.trasformation_listに対して改めて移動終了後の位置にとどまるようmatrixを登録する必要がある。
これは、アニメーション終了時にview->geometry.transformation_listに登録されていたアニメーション用のmatrixが削除されてしまうためで、そのまま何もしないとviewの表示位置が初期位置に戻ってしまう。
Jbuilder利用時のJSONP対応

JbuilderはJSONPに対応していないみたいなので以下のgemを追加で読み込みます。

```lang:Gemfile
gem 'jpbuilder'
```

Jbuilderで作成していた、`show.json.jbuilder`等のファイル拡張子を`show.json.jpbuilder`に変更すれば完了。
Wowza Streaming Engine 4を構築する

### 背景
 * AWS上に、新しいwowzaサーバーの構築方法が2つある
  * awsmarketplaceに、用意されたAMIで、構築する
  * linux EC2インスタンスを立ちって、ここからDLして、構築する

### 事前準備
 * key pair
 * puttygenで、pemをppkに変換した


### awsmarketplaceに、用意されたAMIで構築する
##### 【契約】
 * https://aws.amazon.com/marketplace/pp?sku=5mi4v8z5xvp44xebvj7sd3xmqへアクセス
 * 「Continue」ボタンを押す
 * 「accept terms」ボタンを押す
 
##### 【ECインスタンス起動】
 * AWS コンソール　→　EC2サービス　→　instances　→　create instance
 * step1に、Community AMIsを選択して、「wowza streaming engine 4」で検索し、WowzaStreamingEngine-ebs-byol***の「select」ボタンを押す
  * byolの意味： Bring Your Own License
  * 購入ライセンスとか、開発者むけ版ライセンスとかを使える
 * stpe2に、インスタンスタイプを選択する
 * step3に、availability zone: ap-northeast-1aに変更して、monitoring有効にする
 * step4に、デフォルトで
 * step5に、tags追加
 * step6に、security groupを設定する
 * 「launch」ボタンをクリックして、key pairを選択して、起動する

##### 【ライセンス更新】
* [更新手順](http://qiita.com/alingogo@github/items/a5dd245e5d5858ddf448)を参照して、サーバに入る
* wowza権限をもらって、ライセンスファイルを修正する
```
[ec2-user]$ sudo su wowza
[wowza]$ cd /usr/local/WowzaStreamingEngine/conf
[wowza]$ cp Server.license{,.old}
[wowza]$ vi Server.license
```

* 起動 - ライセンスが通ったことを確認した
```
[ec2-user]$ sudo su
[root bin]# ./startup.sh
......
Configure logging: file:///usr/local/WowzaStreamingEngine/conf/log4j.properties
INFO server server-start Wowza Streaming Engine 4 Trial Edition (Expires: XXX XX, 2014) 4.0.1 build10615 -
INFO server comment - Server License Key: XXXXXX-XXXXX-XXXXX-XXXXX-XXXXX-XXXXX
INFO server comment - Maximum Connections: 10
.....
```

##### 【確認】
 * http://[publicDNS name]:1935へアクセスして、以下のような情報が表示されること
  * Wowza Streaming Engine 4 Trial Edition (Expires: XXX XX, 2014) 4.0.1 build10615
notify-sendでフォーカスのあるモニタに通知が出るようにする


複数モニタを使っているとき、作業してないモニタ側に通知を出されても、気づけないときが多い。

以下のコマンドで現在フォーカスがあるモニタに通知が出るようになる。

```
$ gsettings set com.canonical.notify-osd multihead-mode focus-follow
```

http://askubuntu.com/a/252384
sbtでpublishLocalしたjarを取り込んで開発サイクルを回す

ライブラリやフレームワークの開発なんかをしてて、動作確認は別のプロジェクトから利用したいって時のsbtのノウハウです。
skinny-frameworkでstandaloneのjarを実行するときに、コンテキストパスを指定できるようなパッチを実装した時に役立ちました。

`ライブラリ実装 -> 利用サンプルに取り込み -> 動作確認 -> 最初に戻る`

のサイクルを、ローカルの開発環境内で回すのに便利です。

# ライブラリ側

特別な設定は必要ありません。
何か実装を修正した際に、`sbt publishLocal` することで、ローカルの`~/.ivy2/local` 以下にjarを置くことができます。

### 例

```
$ cd mylib
$ sbt publishLocal
```

# 利用側

普通にライブラリを使うとき通りに、ライブラリの依存バージョンを指定してsbtをたたけば、出来たてほやほやのライブラリを利用できます。

### 例

```Build.scala
libraryDependencies := Seq(
  "kuchitama"    %% "mylib"   % "0.1-SNAPSHOT",
  /// other dependencies
  )
```

# うまく取り込めない時

普通は、publishLocal時にはresolverの設定などは不要なはずなのですが、私の環境ではjarの取得に失敗していました。
原因の切り分けができていないのですが、sbtがライブラリを探しに行くresolverに`~/.ivy2/local`を追加すると取得できました。
`project/Build.scala`を下記のように修正しました。

```Build.scala
resolvers ++= Seq(
      "LocalRepo" at file(Path.userHome.absolutePath + "/.ivy2/local").getAbsolutePath
    )
```

`.sbt`については、未確認ですが、同様にsbtの形式で書けば問題ないハズです。
RubyでStatic Factory Methodぽいやつを実装する


### なぜ使いたかったか

・同じapiに投げるリクエストオブジェクトが、使う人によって内容が変わるから。
・initialize内でif文でスイッチしてもいいけどなんかダサいし、初期化に必要な情報も違ってたから。

### 方法
・デフォルトのnewメソッドの代わりに、自身のクラスのインスタンスを返すクラスメソッドを定義する

### ソース

```rb
class Request
  # 外からnewを呼べなくする(気休め程度...)
  private_class_method :new

  def initialize(hash = {})
	hash.each do |k,v|
	  # 動的にインスタンス変数を設定
	  self.instance_variable_set("@#{k.to_s}", v)
    end
  end

  # hoge用ファクトリ
  def self.new_hoge(title)
	Request.send(:new,
	  {
		title: title
	  }
	)
  end

  # fuga用ファクトリ
  def self.new_fuga(title, text)
	Request.send(:new,
	  {
		title: title,
		text: text
	  }
	)
  end
end
```

### 実行結果

```
>> Request.new
NoMethodError: private method `new' called for Request:Class

>> Request.new_hoge('hoge')
#<Request:0x007fb27463bb80 @title="hoge">

>> Request.new_fuga('fuga', 'this is fuga')
#<Request:0x007fb27634c580 @title="fuga", @text="this is fuga">
```

### まとめ
Rubyは動的になんちゃらする方法が沢山用意されているので、それを使ってなにかできないかと考えるのが楽しいですね。
Vim Advent Calendar 2013 117日目: sudoedit で Vim の多重起動を避ける

この記事は [Vim Advent Calendar 2013](http://atnd.org/events/45072) 117日目の記事になります。


最近、Vim の多重起動を避けるプラグイン、[vim-singleton](https://github.com/thinca/vim-singleton) を使い始めたのですが、凄く便利ですね。

導入は簡単なので、作者の @thinca さんの「[singleton.vim 作った - 永遠に未完成](http://d.hatena.ne.jp/thinca/20120201/1328099090)」をぜひご覧ください。

せっかく便利なので、`sudoedit` でも Vim の多重起動を避けよう！というのがこの記事の主旨です。

まず、vim-singleton には `git commit -v` 等で生成された一時ファイルを編集するために、サーバー側の Vim の編集が終わるまでクライアント側の Vim の終了を待機する、リモート編集という機能があります。

`sudoedit` でも `git commit -v` と同様に編集用の一時ファイルが生成されますので、リモート編集を使えばそれだけで解決しそうなのですが、一つ問題があります。

リモート編集するには対象の一時ファイルを、あらかじめ正規表現で指定しておかなければいけないのですが、`sudoedit` で編集する一時ファイルは正規表現では特定できないのです。

しかし、`sudoedit` は環境変数 `SUDO_EDITOR` で指定したエディタを使用しますので、ここで指定されたエディタが常にリモート編集機能を使うようにすれば何とかなりそうです。

そこで、@thinca さんに vim-singleton のリモート編集機能を強制する方法がないかお尋ねしたところ、

```bash
vim --cmd "let g:singleton#entrasuted_pattern='.'"
```

という方法を教えていただきました。

リモート編集する対象ファイルを全てのファイルにすることで、結果的にどのファイルを編集しても リモート編集になるわけですね。

ですが、これをそのまま、

```bash
export SUDO_EDITOR='vim --cmd "let g:singleton#entrust_pattern='\''.'\''"'
```

のように指定すると、sudoeditが `"let` と `g:singleton#entrust_pattern='.'"` を2つの引数と解釈するために上手く動作しません。

そこで VimScript の変数名の展開を利用して、

```bash
export SUDO_EDITOR='vim --cmd let{"g:singleton#entrust_pattern"}="."'
```

と指定することで、無事リモート編集することができました。

なお、`sudoedit` はエディタの実行前にPATHを書き換えますので、システム標準以外の `vim` を利用する場合は、`SUDO_EDITOR` 内の `vim` をフルパスで指定するようにしてください。

#「`sudo vim` が許されるのは小学生まで」

と婆っちゃが言ってましたので、ぜひ `sudoedit` をご利用ください。

`sudoedit` で [vim-singleton](https://github.com/thinca/vim-singleton) を使う場合は、下記の環境変数を設定するだけです。

```bash
export SUDO_EDITOR='vim --cmd let{"g:singleton#entrust_pattern"}="."'
```
CakePHPのテーブル名「単語の複数形」について

お初です。

#CakePHPのブログチュートリアルで
PHPフレームワークに興味があり、CakePHPをちょっと触ってます。(CakePHP 2.4.6 安定版)
日本人ユーザが多いこともあり日本語の解説ページがなかなか充実していていいですね。
ひとまず親切な[ブログチュートリアル](http://book.cakephp.org/2.0/ja/tutorials-and-examples/blog/part-two.html)があったので、簡単なブログを作成しました。

ブログ自体はスイスイ作れたのですが、一箇所、どうにもモヤモヤしている箇所がありました。
Modelクラスを作成したときに連携されるデータベースのテーブル名です。

#テーブル名は「複数形」なのだが…
[ブログチュートリアル](http://book.cakephp.org/2.0/ja/tutorials-and-examples/blog/part-two.html)では真っ先に"Postモデル"を作るように指示しており、その際に
```
命名規約は、CakePHPでは非常に大切です。 モデルをPostという名前にすることで、CakePHPは自動的に、このモデルはPostsControllerで使用されるのだろう、と考えます。 また、 posts という名前のデータベーステーブルと結びつけられます。
```
と述べています。「考えます。」ってなんだよと思いつつ…。

へー。ふーん。じゃあその[命名規約](http://book.cakephp.org/2.0/ja/getting-started/cakephp-conventions.html)ってどうなってるのっと。

```
モデルのクラス名は単数形でキャメル記法です。 Person、BigPerson、ReallyBigPerson などは規約に合ったモデル名です。

CakePHP のモデルに対応するテーブル名は、複数形でアンダースコア記法です。 上記の例で言えば、テーブル名はそれぞれ、 people 、 big_people 、 really_big_people になります。

ユーティリティライブラリの Inflector を使って、単語の単数形・複数形を判定することができます。 より詳しい情報は、 Inflector を読んでください。
```
へー、テーブル名は複数形なんだ。だからPostモデルを作ると、postsテーブルと連携するんだね。

そこで自分は思いました。果たしてどれだけの人が正しく複数形を認識できているのだろうかと。
**例えば"data"は実は"datum"の複数形である、とか。**（datumなんて日頃見ませんけど）

そこで単数形・複数形を判定しているInflector.phpを覗いてみました。
![e619c1bdbb2d66342343c305d98ba538.png](https://qiita-image-store.s3.amazonaws.com/0/40503/fb5b1c0b-408b-1b5a-4d5e-f734b673a496.png)

なるほど。正規表現でちゃんと面倒見てますね。

#英単語を正しく知っていないとダメ
Child（子供）の複数形がchildrenであることは義務教育を受けていれば知っている人も多いかと思いますが、
- Knife（ナイフ）の複数形はknives (**knifesではない**)
- Apex（頂点）の複数形はapexes (**Apexsではない**)
などなど、英単語には「変化するもの」が存在します。

CakePHPではInflector.phpでしっかり「正しい複数形」に変換をかけた上で、それをテーブル名として指定しているのですね。

**結論：テーブル名は正しい複数形の綴りなのか、注意しましょう。**
自動でCakePHPにテーブル名指定をやってもらってる方は要注意ですね。

#もちろん、テーブル名は好きに決めることもできる
「複数形がわからないとダメなんだぁ…終わった…」なんて不便なことはないです。
例えばScience.phpというModelクラスを作ったとして、その内で

```php
  var $useTable = 'nitroglycerin';
  // $useTableがミソ
```
を書けば、任意のテーブル名（上の例では'nitroglycerin'テーブル）にアクセスできるようになります。

ここはModel.php内の729行目当たりを見るとお分かりかと思います。

おしまい
Bitcoinの中本哲史論文を箇条書きでわかりやすくまとめてみた

以下に移行しました<br><a href="http://block-chain.jp/tech/bitcoin-nakamoto-thesis/" title="Bitcoinの中本哲史論文を箇条書きでわかりやすくまとめてみた">Bitcoinの中本哲史論文を箇条書きでわかりやすくまとめてみた</a>
対象のディレクトリの拡張子一覧を取得する方法と便利コマンド少々

[対象のディレクトリの拡張子一覧を取得する方法と便利コマンド少々
- さよならインターネット](http://blog.kenjiskywalker.org/blog/2014/03/27/get-extension-list/)

- ext-list.sh

```bash
#!/bin/bash

dir=`pwd`
list=`find ${dir} -type f -perm 755`

# not = !
# list=`find ${dir} -type f ! -perm 755`

for file in $list
do
    filename=`basename $file`
    ext=${filename##*.}
    ext_list=("${ext_list[@]}" ${ext})
done

echo ${ext_list[@]} | tr ' ' '\n' | sort | uniq -c | sort -n
```

などというスクリプトを作成しておいて
確認したいディレクトリでそのスクリプトを叩けば取得できます。

__/usr/local/Cellar__で実行したら  

```bash
['-']% sh /tmp/ext-list.sh | tail -n10
   5 1
   5 6
   6 0
   7 py
  10 test
  11 sh
  16 pl
  27 result
  62 so
 116 la
['-']% 
```

こんな感じの結果になりました。

### 便利コマンド

- basename

```bash
['-']% basename /usr/local/bin/zsh
zsh
['-']%
```

- dirname

```bash
['-']% dirname /usr/local/bin/zsh
/usr/local/bin
['-']%
```

- シャープ

```bash
['-']% hoge=/usr/local/Cellar/zsh/5.0.2/lib/zsh/zutil.so
['-']%
['-']% echo ${hoge##*.}
so
['-']% echo ${hoge#*.}
0.2/lib/zsh/zutil.so
['-']%
```

- パーセント

```bash
['-']% hoge=/usr/local/Cellar/zsh/5.0.2/lib/zsh/zutil.so
['-']%
['-']% echo ${hoge%%.*}
/usr/local/Cellar/zsh/5
['-']%
['-']% echo ${hoge%.*}
/usr/local/Cellar/zsh/5.0.2/lib/zsh/zutil
['-']%
```
Bitcoinの初期ブロックチェーンのDLを早くする bootstrap.dat

以下に移行しました<br><a href="http://block-chain.jp/tech/bitcoin-bootstrap-dat/" title="Bitcoinの初期ブロックチェーンのDLを早くする bootstrap.dat">Bitcoinの初期ブロックチェーンのDLを早くする bootstrap.dat</a>
Cgoでポインタのポインタ(e.g. double**)を取る関数にGoのスライスのスライス(e.g. [][]float64)を渡す方法

タイトル長くてごめんなさい

cgoを使ってCの関数をラップをしたい時、特に以下のような状況を想定したときの解法をメモる

* Cの関数はdouble** のようなポインタのポインタを取る
* 結果はスライスのスライス [][]float64 でほしい

### まとめ

**[][]float64 -> []*C.double に変換したあと、(\*\*C.double)(sliceOfSlices[0]) のようにキャストしてCの関数に渡す**

以下、順を追って説明する

### 例

以下のようなCの関数をラップすることを考える

```c
void Test(double** result);
```

### 解決法

まず、返り値としてほしいスライスのスライスを定義する

```go
resultIngo := make([][]float64, length1) 
for i := range resultInGo {
    resultInGo[i] := make([]float64, length2)
}
```

[][]float64を []*C.double に変換する

```go
resultInC := Make2DCArrayAlternative(resultInGo)
```
```
func Make2DCArrayAlternative(matrix [][]float64) []*C.double {
        alternative := make([]*C.double, len(matrix))
        for i := range alternative {
                alternative[i] = (*C.double)(&matrix[i][0])
        }
        return alternative
}
```

Cの関数に渡す

```go
C.Test((**C.double)(resultInC[0]))
```

これで、resultInGo に値が設定される

### ラッパー例

こんな感じでしょうか

```go
func Test() [][]float64 {
    resultIngo := make([][]float64, length1) 
    for i := range resultInGo {
        resultInGo[i] := make([]float64, length2)
    }

    resultInC := Make2DCArrayAlternative(resultInGo)

    C.Test((**C.double)(resultInC[0]))

    return resultInGo
}
```

length1, length2は適宜想像で補って下さい

これで、処理の結果をresultInGoとして、メモリのdeep copyなしに取得できます。めでたしめでたし

### 注意

32bit環境では上手く動かない可能性があります
Re: LINQでIE<T>からランダムに要素を取り出す

[LINQでIE<T>からランダムに要素を取り出す](http://qiita.com/laco0416/items/f2c83091c8b4014e3cda) を見ていて、IEnumerableを2回パスするのは嫌だなあと感じたので、ワンパスバージョンを作成しました。

```csharp
using System;
using System.Collections.Generic;

public static class EnumeratorEx {
  private static readonly Random rand = new Random();

  public static T Random<T>(this IEnumerable<T> arg) {
    T selected = default(T);
    var n = 0;
    foreach (var item in arg) {
      n += 1;
      if (rand.Next(n) == 0) {
        selected = item;
      }
    }
    return selected;
  }
}

public class Test {
  public static void Main() {
    var items = new[]{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
    for (int i = 0; i < 100; i++) {
      Console.Write(items.Random() + ", ");
    }
  }
}
```

1～0まで全部表示されるので、大丈夫そうです。
あと、パフォーマンスは計測していません。
お手軽にWeb開発できるエディタ Brackets

ちょっとしたWebアプリを作りたい・・

そんな時は [Brackets] (http://brackets.io/)がおすすめ！
![rapture_20140327005340.png](https://qiita-image-store.s3.amazonaws.com/0/10713/acf4b7cf-0314-fdbf-e451-22773b37f7d8.png)

特徴
-----
- Windows/Mac/Linux対応 日本語対応
- HTML, CSS, Javascriptを中心にPHP, node.jsなども開発可能
- __コードを編集すると自動でブラウザの表示も変わる”ライブプレビュー"機能__
- 便利な拡張機能たくさん（拡張の開発もjavascriptで簡単にできるらしい）

他にも何かとすごいらしい
詳しくは[公式サイトへGo!] (http://brackets.io/)

インストール方法
------------------
公式サイトからダウンロード＞開いてインストールを
すすめていけば入ります！　コマンドとか不要です！

実際に開発を始める
----------------------

### 1. アプリのフォルダを作って、Bracketsに追加する
![brackets02.png](https://qiita-image-store.s3.amazonaws.com/0/10713/b9c465b4-d2a7-7117-add1-767931488a9f.png)

---

### 2. HTMLファイルを作る
![brackets03.png](https://qiita-image-store.s3.amazonaws.com/0/10713/17a1fe8f-88c9-b6ad-a2d2-f336564068ee.png)

---

### 3. ライブプレビュー開始
![brackets04.png](https://qiita-image-store.s3.amazonaws.com/0/10713/a7f8fe5b-2692-e9e4-11a6-a12cf13a81af.png)

---

### 4. 完了！
![brackets06.png](https://qiita-image-store.s3.amazonaws.com/0/10713/3c0975d7-11e3-48fc-71c1-ffe4616d22b7.png)

CSSを追加しても、Javascriptを追加しても、
このライブプレビューはちゃんと動きます！

快適お手軽Web開発がはかどりますね～

おすすめ拡張機能
-------------------
お手軽開発が目標だったので、拡張機能のことはあまり書くつもりなかったのですが、少しだけ紹介します！

### ■拡張機能を入れる方法
ライブプレビューボタンの下にある拡張機能管理ボタンを押して
以下の画像のとおりにすればOKです。
![brackets08.png](https://qiita-image-store.s3.amazonaws.com/0/10713/38f1e358-7897-89f8-0c1a-0cb1c3964ceb.png)


### ■Emmet (Zen-coding)
HTMLをらくらくに書けるようになるものです！
Brackets以外のエディタでもよく使われている印象ですね！

Emmetを使うと・・

```
div#content>ul>li*3
```
上のような入力をしてTabキーを押すと・・

```html
<div id="content">
    <ul>
        <li></li>
        <li></li>
        <li></li>
    </ul>
</div>
```
このように自動で展開してくれる！

### ■Interactive Linter
Bracketsには元々Javascriptの文法チェッカーが入っています。
ファイルが保存されたとき、エラー項目が下に表示されますが、具体的にどこか調べるのが少し面倒です。

この拡張機能を入れると、リアルタイムでエラーの場所に
赤線を引いてくれます。便利ですねぇ～

![brackets07.png](https://qiita-image-store.s3.amazonaws.com/0/10713/a8616be3-0064-cf1d-974c-d4f02bb12623.png)