OmniAICreator/Qiita-1.07M huggingface dataset:
Composerの概要、Composerを使うまでの手順

# 概要
* [The Right PHP](http://ja.phptherightway.com/#composer_%E3%81%A8_packagist)参照

# インストール方法
## 前提
* PHP 5.3.2+以上（Composerは頻繁にアップデートされているそうなので要チェック）
* Composerを使うためのphp.iniの設定
 * extension=php_openssl.dllのコメントを外して有効化する

## 手順
* [Installation - Windows](https://getcomposer.org/doc/00-intro.md#installation-windows)を参照（Windows以外は他のセクションを参照）

# 使い方
インストール後は`php composer.phar install`の代わりに`composer install`で使えるようになる

##例えばTwigを使う
コマンド`composer require twig/twig:1.*`
→`composer.json`ファイルがなければ勝手に作られる

##コマンドの実行結果
```
daichi>composer require twig/twig:1.*
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing twig/twig (v1.15.0)
	Downloading: 100%

Writing lock file
Generating autoload files
```

`test.php`を作成する

```php
<?php
require 'vendor/autoload.php';

$loader = new Twig_Loader_String();
$twig = new Twig_Environment($loader);

echo $twig->render('Hello {{ name }}!', array('name' => 'Fabien'));
```

実行結果
`Hello Fabien!`
focuslight の docker imageを多数起動するansible playbookを書く

# focuslightをdockerを利用して多数起動する

[focuslight](https://github.com/tagomoris/focuslight)という
[GrowthForecast](http://kazeburo.github.io/GrowthForecast/)とのAPI互換を持つ
Ruby実装のツールがリリースされていたことを最近知り、興味が合ったのでdocker image化してみた。

[docker indexに登録済み](https://index.docker.io/u/futoase/docker-focuslight/)なので、
dockerで使いたいという方は以下の手順で試せる。

```
> docker pull futoase/docker-focuslight
> docker run -p 3000:80 -d futoase/docker-focuslight
```

で、最近chefの代わりに使いたいなと思って気になってる[ansible](https://github.com/ansible/ansible)の練習がてら
focuslightを1つのインスタンス内で多数起動させる、
というansible playbookを書いてみた。

# ansible playbook ソース

[ソースはここにあります。](https://github.com/Substanz/multiple-focuslight)

# 動作を確認するための下準備

MacOS X であるなら、以下の手順を踏めば終わり。

- [Vagrantのdmgパッケージ](http://www.vagrantup.com/)をインストールする
- ```brew install ansible``` を実行しansibleをインストールしておく

# 動作テスト

以下の手順でリポジトリからソースを取ってきて
コマンドを実行すれば終わるようにしてある。

```
> vagrant up --provision
```

ansible playbook内で、
以下のホスト名とVagrantで立ちあげたゲストマシンの
IPアドレスを結びつけるために/etc/hostsに書き出す。

```
sudo echo "192.168.33.200 focuslight focuslight2 focuslight3 focuslight4 focuslight5" >> /etc/hosts
```

## 出来上がりイメージ

こんな形でfocuslight, Vagrant boxの環境ができあがる。

![focuslight.png](https://qiita-image-store.s3.amazonaws.com/0/3985/42954749-9a63-5f97-084d-ac9828420d15.png)

focuslight個別のdocker container内で
nginxでリバースプロキシを利用するようにしている。

# アクセスしてみる

早速それぞれのfocuslightインスタンスに対してアクセスしてみる。

```
> open http://focuslight/
```

![スクリーンショット 2014-02-10 19.58.56.png](https://qiita-image-store.s3.amazonaws.com/0/3985/cc72834a-9c22-0d76-4141-62d54c00b6e6.png)

```
> open http://focuslight2/
```

![スクリーンショット 2014-02-10 19.59.30.png](https://qiita-image-store.s3.amazonaws.com/0/3985/26c4283e-2b82-5369-e579-d79a213f3d17.png)

# 別々のdocker containerに保存されているか確認する

curlコマンドでhttp://focuslight/のAPIを叩いてみる。

```
> curl -F number=10 http://focuslight/api/socialgame/member/register
```

![スクリーンショット 2014-02-10 22.25.30.png](https://qiita-image-store.s3.amazonaws.com/0/3985/a39f1cf8-dc82-3c17-5fdd-eb88002a471c.png)

うまくいった。

http://focuslight2/のAPIを叩いてみる。

```
> curl -F number=200 http://focuslight2/api/mainichi/ga/nichiyoubi
```

![スクリーンショット 2014-02-10 23.05.57.png](https://qiita-image-store.s3.amazonaws.com/0/3985/b7e0fc67-3a80-d581-3b52-ef9c0efab0c3.png)


別々のdocker imageを利用して立ちあげたdocker containerに対して
APIを叩いても大丈夫なようだ。

一応Vagrantホスト側のディレクトリをdocker focuslight containerで
立ちあげているdockerマシンの/root/focuslight/dataディレクトリとして
使える形でansible playbookで作成している。
ので、docker containerを再起動してもデータが消えることはない。

# dockerで複数のアプリケーションを立てる意味

immutable infrastructureとか言われてて、
dockerが注目されてる。

アプリケーションのデプロイに関する事前動作確認でも、
staging環境をサーバ単位では用意せず
productionとあいのりした形で準備できるかもしれない。

または今回のfocuslightのような
データのグラフ可視化ソフトウェアについて
サービス別(ゲームだとしたらタイトル別)に
docker containerを立てることで
タイトル別のグラフはdocker container別に管理することが
できるようにする、とか。MySQL DBの切り分けとか
考えなくて良いと思うし。

# ansibleを利用する意味

chefで最初サーバの冪等性を保証する形で
レシピを書いていたけど、適応するレシピの量が多いとゴテゴテしてきてしまう。
notifiesを利用して実行順序保証がだるい。

ansibleが最適解かはわからないものの、
今のところは良いんじゃないかなと思った。
tmuxを使いこなそう（ウインドウ、ペイン、セッション、アタッチ、デタッチ）


tmux使ってますか？
いまだに使いこなせていない方も多いのではないでしょうか。
もちろん私もその一人です。

今回は改めてtmuxの使い方を調べてみたのでまとめておきます。

## 複数の画面や領域を使いこなす

まずは単発のtmuxをうまいこと使うための方法です。

tmuxにはウインドウとペインという概念があります。
ウインドウは簡単に言うと **ある一つの画面** のことです。ペインは **ある一つの領域** といったところでしょうか。

### ウインドウ

#### ウインドウ追加

まずはtmuxを起動します。

```
$ tmux
```

tmuxが起動したら`PREFIX  c`と素早く押してみてください。
`PREFIX`はデフォルトでは`Ctrl-b`です。（変更の仕方は[こちらの記事](http://qiita.com/shoma2da/items/a82b0be38f10954a45ba)などをご覧ください）

#### ウインドウ切り替え

複数のウインドウを作成したらウインドウを切り替えてみましょう。

これにはいくつかの方法があります。

* `PREFIX n`：次のウインドウに切り替え(next)
* `PREFIX p`：前のウインドウに切り替え(previous)
* `PREFIX 数字`：番号を指定してウインドウを切り替え
* `PREFIX w`：ウインドウ一覧を表示。その後`Ctrl-p`や`Ctrl-n`でウインドウを選択して`Enter`

#### ウインドウ名変更

それぞれのウインドウには名前が付けられます。デフォルトでは`bash`あたりになっているのではないでしょうか。

適当なウインドウ内で`PREFIX ,`(カンマ)を押してみましょう。
入力すると画面下のバーにカーソルが移動してウインドウ名の変更ができます。

#### ウインドウ終了

ウインドウの終了は基本的には`exit`コマンドを使います。

```
$ exit
```

exitが使えず強制的に終了させたい場合があるかもしれません。
その場合は`PREFIX &`を使いましょう。

### ペイン

#### ペイン分割する

ペインは縦横それぞれ、更に再帰的に何度でも分割できます。
どこかのウインドウ内で以下のコマンドを入力してみてください。

* 縦：`PREFIX %`
* 横：`PREFIX "`

#### ペイン切り替え

ペイン分割したらペイン間を行き来してみましょう。
コマンドは`PREFIX o`です。

#### ペイン終了

終了についてはウインドウの終了とほぼ同じ操作です。
基本的には`exit`コマンドを使用しますが、それが出来ない場合は`PREFIX x`です。

## セッションを使いこなす

tmuxを一つ起動した単位＝セッションといいます。
セッションは一時的にコンソールから切り離してバックグラウンドで残しておいて後から繋ぎ直す、といったことができます。

### セッションの作成

普通に`tmux`すれば１つセッションを作成しています。

```
$ tmux
```

セッションに名前を付けておくこともできます。

```
$ tmux new -s my_session
```

### デタッチ

コンソールから切り離すことをデタッチといいます。デタッチされたセッションはバックグラウンドで生き続けます。

デタッチは`PREFIX d`でできます。

### セッションの確認

存在しているセッション一覧を確認することが出来ます。

```
$ tmux ls
```


### アタッチ

デタッチしたセッションを再度繋ぎ直すことをアタッチと言います。
直前のセッションは以下のようにアタッチ出来ます。

```
$ tmux a
```

セッション名を指定してアタッチもできます。

```
$ tmux a -t セッション名
```

`-t`オプションにつづいてセッション名を指定します。
成功すればバックグラウンドにあったセッションの作業をデタッチ時そのままの状態で継続できます。

### セッション名の変更

任意のタイミングでセッション名は変更できます。

```
$ tmux rename -t 変更前セッション名 変更後セッション名
```

すでにセッション内にいるときは`Prefix + $`でリネームできます。


### セッションの削除

セッションを終了します。

```
$ tmux kill-session -t セッション名
```

全て終了する場合はserverごと落としましょう。

```
$ tmux kill-server
```

## 最後に

今回はtmuxの使い方をまとめました。
慣れるととても便利で手放せないものになるでしょう。

プログラマたるもの常に効率良く作業していきたいものですね。

[shoma2daをフォロー](https://twitter.com/intent/user?screen_name=shoma2da)

<a href="http://www.amazon.co.jp/gp/product/4894712741/ref=as_li_ss_il?ie=UTF8&camp=247&creative=7399&creativeASIN=4894712741&linkCode=as2&tag=shoma2da-22"><img border="0" src="http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4894712741&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=shoma2da-22" ></a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=shoma2da-22&l=as2&o=9&a=4894712741" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
JavaScript - カードUIフレームワーク的なものを作ってみた

#こんなカードUIテンプレートが欲しかった
+ JavaScript製
+ レスポンシブデザインである
+ ウィンドウの表示領域の横幅に合わせてカードが自動でセンタリングされる
+ デザインの設定が簡単
+ カードの高さが表示するまでわからずバラバラでもキレイに並べられる
+ カードがクリックされたときの動作も設定できる
+ 主要モダンブラウザ互換性を保っている
+ PCでもスマホでもタブレットでもしっかり表示できる
+ Chrome Apps のUIでも使える
+ 最近ハマっている[monaca](http://monaca.mobi/ja/)（HTML5モバイルアプリ開発プラットフォーム）で開発しているアプリのUIとしても使いたい

#つくってみた - griddles.js
実際にJavaScriptで書いてみました。簡単な使い方もGitHubのページでまとめてあります。

+ ソースコード: [View on GitHub](https://github.com/daiz713/griddles)
+ デモページ: [デモ1](http://goo.gl/MPmI3A), [デモ2(最新)](http://griddles-card.appspot.com/)

#できるようになったこと
+ 画面の横幅に応じてカードを綺麗に整列表示
+ 写真などの事前に縦幅がわからないカードの表示
+ カードがクリックされた時の挙動の設定
+ Chrome, Firefox, Safari, Opera, IE10 での表示
+ PC, スマートフォン, タブレット での表示
+ 自動でXMLHttpRequestでの画像の読み込み（Chromeアプリで使用）
+ 1回あたりのカード読み込みの制限 [(詳細)](http://daiiz.hatenablog.com/entry/2014/04/05/220100)
+ カードを表示するストリームの本数の上限値の設定 [(詳細)](http://daiiz.hatenablog.com/entry/2014/04/05/220100)
+ カードの幅を広くする指定 [(詳細)](http://daiiz.hatenablog.com/entry/2014/04/05/220100)
+ [Mobile Chrome Apps](https://github.com/MobileChromeApps/mobile-chrome-apps) に対応
+ カードを上から追加する機能 [(詳細)](http://daiiz.hatenablog.com/entry/2014/06/07/094317)
+ portrait設定とlandscape設定 [(詳細)](http://daiiz.hatenablog.com/entry/2014/06/07/094317)
+ サイド・ナビゲーション導入 [(詳細)](http://daiiz.hatenablog.com/entry/2014/07/10/083336)
+ フローティングカード機能 [(詳細)](http://daiiz.hatenablog.com/entry/2014/07/10/083336)

# GriddlesJSを用いた自作アプリ
+ [Chrome拡張機能 「スクラップブック」](https://chrome.google.com/webstore/detail/%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%83%E3%83%97%E3%83%96%E3%83%83%E3%82%AF/cmdlmijeafbbbbfmnhkmjmijmeejnnmo)

# 追記
+ Playground: [Griddles Playground](http://goo.gl/w7G7Uy)

##　2014年8月2日
+ GriddlesJS(beta)の開発は現在も継続中です。今年の11月にはベータ版を卒業することを目指しています。ご試用頂いたご感想・バグのご報告・機能追加のご要望などお待ちしています！
   + リリースノート（開発ブログ）：http://daiiz.hatenablog.com/archive/category/griddles

##　2014年9月11日
+ 最新版を公開しました。
   + リリースノート（開発ブログ）：http://daiiz.hatenablog.com/entry/2014/09/11/221828
DjangoのModelのFieldカスタマイズいろいろ

■文字列Char

```
title = models.CharField(max_length=200)
```

■文字列Text

```
body = models.TextField()
```

■DateTime & 初期値設定

```
pub_date = models.DateTimeField('date published',default=datetime.datetime.now() )
```

■Int & リスト選択

```
CategoryChoices = (
    (1, 'DESIGN'),
    (2, 'TECH'),
    (3, 'ENTERTAINMENT'),
    (4, 'SOCIAL'),
    (5, 'BUSINESS'),
    (6, 'TRAVEL'),
)

category = models.IntegerField(choices=CategoryChoices)
```
パターンにマッチする行と、それに続く一定の行数を取り除く

```sh
awk 'BEGIN{n=0} /PATTERN/{n=NR+NUM} (NR>n){print}'
```

`grep -v` と `grep -A NUM` の合わせ技をやりたかったのですが、思ったようにできなかったので。

例）

```sh
$ cat sample
     1	01 ABC
     2	   DEF
     3	   GHI
     4	   JKL
     5	02 ABC
     6	   DEF
     7	   GHI
     8	   JKL
     9	03 ABC
    10	   DEF
    11	   GHI
    12	   JKL
    13	04 ABC
    14	   DEF
    15	   GHI
    16	   JKL
    17	05 ABC
    18	   DEF
    19	   GHI
    20	   JKL
```

03 にマッチする行と，それに続く3行を取り除きます。

```sh
$ cat sample | awk 'BEGIN{n=0} /03/{n=NR+3} (NR>n){print}'
     1	01 ABC
     2	   DEF
     3	   GHI
     4	   JKL
     5	02 ABC
     6	   DEF
     7	   GHI
     8	   JKL
    13	04 ABC
    14	   DEF
    15	   GHI
    16	   JKL
    17	05 ABC
    18	   DEF
    19	   GHI
    20	   JKL
```

BEGINブロックはなくても・・・、でも個人的には付ける派です。
/03/ のブロックと (NR>n) のブロックを入れ替えると結果が変わります。

`grep -B` や `grep -C` と `grep -v` の合わせ技は・・・どうやったらいいんでしょう？
iPadのSafariで、数字の羅列に勝手にリンクが貼られることがある

iOSのSafariなど、一部ブラウザでは数字の羅列を電話番号と認識して、自動的にリンクにする機能がある。
下記のメタ情報を追加することで回避できる。

```html
<meta name="format-detection" content="telephone=no">
```
View.attributesを取得・設定するメソッド

View.attributesがよく分からなかったので、下記のようなattr()メソッドを作ってました。

```js
var HogeView = Backbone.View.extend({
  attributes: {
    foo: 0
  },
  attr: function(key, val){
    if(val == null){ return this.attributes[key]; }
    this.attributes[key] = val;
  }
});

var hoge = new HogeView();
hoge.attr('foo', 10);
hoge.attr('foo'); // 10
```
datasetの絡みだったので、$(elm).data()でもよかったのかもしれなかったですが。
でも取得は出来ても、設定は$(elm).attr()じゃないとダメっぽかったので。

```js
{
  attr: function(key, val){
    if(!this.attributes.hasOwnProperty(key)){
      throw new Error('HogeView not has ' + key + ' attribute!');
    }
    if(val == null){ return this.attributes[key]; }
    this.attributes[key] = val;
  }
}
```

こうしてやると、View.attributesにない項目は取得もできないし設定もできなくなりますね。
Go言語の誰も知らないし知らなくていい文法2つ

[The Go Programming Language Specification - The Go Programming Language](http://golang.org/ref/spec#Goto_statements)を眺めていたら、Go言語には色んな文法があるんだなぁ、と気付いたのでメモがてらに書いておきます。

##goto文

スパゲティメーカーとして名高いgoto文ですが、ひっそりとGo言語にも存在するようです。

使い方はよくある普通のgotoと同じく、

```go
package main

import "fmt"

func main() {
	s := 0
	i := 1
	LOOP:
		if i > 100 {
			goto BREAK
		}
		s += i
		i += 1
		goto LOOP
	BREAK:
		fmt.Println(s)
}
```

みたいな感じです。1から100までの数字を足すだけのコードなんですけど既にgotoに慣れてない人には辛いコードになっているような気がします。

ちなみに、goto文を使ってif文やfor文の中へ潜り込むとかいう危険なことは出来ないみたいです。観念してください。

(ふと思い出しましたが、PHPかLuaにもgoto文ありましたね……)

使いどころは分かりません。goyaccが吐くコードでは使われてましたけど…。
どなたか教えて下さい。

##fallthrough文

この単語を見てピンとくる人はどんな構文だか分かるだろうし、ピンとこない人には分からないであろう構文。

JavaScriptとかC言語なんかだと、switch文というのは、こんな風に明示的に`break`してやらないといけない。

```js
switch (x) {
case 1:
  //do somethig if x is equal to 1
  break;
case 2:
  //do something if x is equal to 2
  break;
case 3:
  //do something if x is equal to 3
  break;
default:
  //otherwise
}
```

それに対して、Go言語のswitch文は自動的に`break`するようになっている。

……んだけど、時々ごくまれに`break`しないで次の`case`に進んで欲しいときがあります。
そんなときに、`fallthrough`を使うことができます。

具体的には……どういうときなんでしょうね？　実際に`fallthrough`を使う例が上手く浮かんでこないので、適当に作為的なサンプルを載せておきます。

```go
package main

import "fmt"

func main() {
	var x int
	fmt.Scanf("%d", &x)
	switch x {
	case 1, 2, 3, 4:
		fmt.Println("1, 2, 3, 4")
		fallthrough
	case 5, 6, 7, 8:
		fmt.Println("5, 6, 7, 8")
		fallthrough
	default:
		fmt.Println("default")
	}
}

```

数値を受けとって、その値に応じてswitch文で分岐するだけの単純なプログラムです。

ただ、`case 1, 2, 3, 4:`と`case 5, 6, 7, 8:`の部分には`fallthrough`があるので、その`case`にマッチした場合、その下の`case`も実行されることになります。

ちなみにfallthrough文‘case‘の最後の文としてしか記述することができず(if文の中などもダメ！)、最後の`case`に`fallthrough`があると(意味ないから)エラーになるので注意してください。

#まとめ？

goto文もfallthrough文も、覚えておけば使う日があるかもしれませんが、知らなかったら知らなかったでどうにかなるような気もします。
……要するに、この記事には一体どんな意味があったのやら。
MySQLの記事まとめ

サーバー未経験者がソーシャルゲームを通して知ったサーバーの事
http://www.slideshare.net/manabukoga39/ss-31004722

解析まで10分！最強のMySQLチューニングツール「Jet Profiler」
http://engineer.blog.lancers.jp/2012/08/jet-profiler/
実践デバッグ技法を読んでの気付き vol.1 coreファイルについて


# coreファイルについて

[実践デバッグ技法](http://www.oreilly.co.jp/books/9784873114064/)を読んでの気付きというなの備忘録。


## coreファイルとは

UNIX系OSにおいて、プログラムがエラーにより不正終了する際に、
メモリやレジスタの内容をディスクに記録すること。
もしくは記録したファイル。

[参照：e-Words コアダンプより](http://e-words.jp/w/E382B3E382A2E38380E383B3E38397.html)

## coreファイルを出力するサンプルプログラム

sigsegv.c

```
#include <stdio.h>

int main( void )
{
  char* c = 0;
  printf( "%s/n", *c );

  return 0;
}
```

## coreファイルの出力確認

**【コマンド】**

```
$ ulimit -a
```

**【出力結果】**
` core file size          (blocks, -c) 0` ※※※ **「0」**の場合は出力されません。
` data seg size           (kbytes, -d) unlimited` 
` file size               (blocks, -f) unlimited` 
` max locked memory       (kbytes, -l) unlimited` 
` max memory size         (kbytes, -m) unlimited` 
` open files                      (-n) 256` 
` pipe size            (512 bytes, -p) 1` 
` stack size              (kbytes, -s) 8192` 
` cpu time               (seconds, -t) unlimited` 
` max user processes              (-u) 709` 
` virtual memory          (kbytes, -v) unlimited` 


## coreファイルの出力設定

**【コマンド】**

```
$ ulimit -c unlimited
```

**【出力結果】**
` core file size          (blocks, -c) unlimited` ※※※ 先程、「0」だったものが、 **unlimited** となっている
` data seg size           (kbytes, -d) unlimited` 
` file size               (blocks, -f) unlimited` 
` max locked memory       (kbytes, -l) unlimited` 
` max memory size         (kbytes, -m) unlimited` 
` open files                      (-n) 256` 
` pipe size            (512 bytes, -p) 1` 
` stack size              (kbytes, -s) 8192` 
` cpu time               (seconds, -t) unlimited` 
` max user processes              (-u) 709` 
` virtual memory          (kbytes, -v) unlimited` 


## サンプルプログラムのコンパイル

**【コマンド】**

```
$ gcc -g sigsegv.c -o sigsegv.out
```

## サンプルプログラムの実行（coreファイルを出力してみる）

**【コマンド】**

```
$ ./sigsegv.out
```

**【実行結果】**

` drwxrwxr-t@  3 root    admin   102B  2 10 20:55 .` 
` drwxr-xr-x  29 root    wheel   1.0K  4  4  2013 ..` 
` -r--------   1 ****    admin   351M  2 10 20:55 core.1378`
Quaternionの数学的理解メモその1


金谷一朗氏の本の読書ノートから

#クォータニオンとは

クォータニオンは回転軸（三次元ベクトル）と回転角を表現できる。

```math
A=(w;\quad x\quad y\quad z)=(w;\quad v)
```

みたいに表記されるが、ベクトルと角度がそのまま入っているわけではなくて、ベクトルが(x y z)、角度がθの時は

```math
A=\left( \cos { \frac { \theta  }{ 2 }  } ;x\sin { \frac { \theta  }{ 2 }  } \quad y\sin { \frac { \theta  }{ 2 }  } \quad z\sin { \frac { \theta  }{ 2 }  }  \right) 
```

という様になっている。
回転の合成はクォータニオン同士を掛けあわせることで実現し、

```math
A=(a;\quad U)\\ B=(b;\quad V)\\ AB=(ab-U・V;\quad aV+bU+U×V)
```

となる。
なぜこのような計算で表すことが出来るのか、ということをメモしておく。

#前準備：二次元上の回転
##定義
###複素代数

```math
[[a,b]]≡a+ib\quad (a,b∈R)
```

と定義する

また Z=[[a,b]] の時

**共役**

```math
 Z^{ * } ≡ [[ a,-b ]]
```

**ノルム**

```math
\left\| Z \right\| ≡\sqrt { a^{ 2 }+b^{ 2 } } 
```

**逆数**

```math
Z^{ -1 } ≡ \frac { Z^{ * } }{ \left\| Z \right\|^2  } 
```

**指数**

```math
expZ ≡ \sum _{ i=0 }^{ \infty  }{ \frac { Z^{ i } }{ i! }  }
```

とする。

###行列

**指数**

```math
expM≡\sum _{ i=0 }^{ \infty  }{ \frac { M^{ i } }{ i! }  } \quad (M^{ 0 }≡E)
```

##複素数の行列表示

```math
I^2=-E
```

となる行列Iを考える。ここでは

```math
I≡\begin{bmatrix} 0 & 1 \\ -1 & 0 \end{bmatrix}
```

とする。また次の行列を考える。

```math
[[ a,b ]]_{ M } ≡ aE+bI \quad (a,b∈R)
```

これは[[a,b]]と演算規則は同じであり、つまり同じものと見ることが出来る。よってオイラーの公式もそのまま成り立つ。

```math
exp(I\theta )=E\cos { \theta  } +I\sin { \theta  } 
```

##二次元の回転行列
時計回りを正とすると以下のように書ける

```math
\begin{pmatrix} x' \\ y' \end{pmatrix}=\begin{pmatrix} \cos { \theta  }  & \sin { \theta  }  \\ -\sin { \theta  }  & \cos { \theta  }  \end{pmatrix}\begin{pmatrix} x \\ y \end{pmatrix}
```

この時回転行列T(θ)は

```math
T(\theta ) = [[ \cos{ \theta } ,\sin{ \theta } ]]_{ M }
```

と書けることが分かる。

##複素平面上での回転
X=[[a,b]]のとき

```math
[[ a',b' ]] = [[ \cos { \theta } ,\sin { \theta } ]] [[ a,b ]]
```

と書ける。回転行列と違い、回転するものとされるものが同格になっていることがわかる。

[Quaternionの数学的理解メモ その２](http://qiita.com/__takamoto/items/bf8b2ed43879ed5d90be)
DockerでimportしたイメージをrunするときはCMDがなくなっているので注意


Dockerのコンテナをexportする機能は便利ですが、エクスポートしたtarにはDockerfileがついてこないので、インポートしたイメージをrunするときに注意する必要がある。

```
cat コンテナ.tar | docker import - <repository> 
docker run <image_id>
```

これだとうまく動かない。下記のようなエラーが出る。

```
2014/02/10 19:19:25 Error: create: No command specified
```

DockerfileにあるCMDを後ろにつけて実行するとうまく

```
docker run <image_id> <CMD>
```

また、VOLUME や WORKDIR を Dockerfile で指定している場合は下記のように run のオプションとして渡して上げる必要がある

```
docker run -v /contaienr/vol:/host/vol:rw -w /container/workdir <image_id> <CMD>
```

@reoring
Rails, Ruby 2.1.0, PostgreSQL, RSpec, Cucumber, PhaontomJS, HipChatの組み合わせでwerckerを使って気軽にCIする


今年の頭にWantedlyのCIサーバはJenkinsから[wercker](http://wercker.com/)になりました。βテスト中ということもあってGitHubのprivateレポジトリに対しても無料で使えるのですが、僕らの規模だと十分実用的に使えて満足しています。

個人プロジェクトでカジュアルにCIしたい時などにもオススメ。

ちなみに、Herokuなどへのdeploymentも自動化できるのですが、そのあたりのContinuous Deploymentまわりの機能は使っていません。

基本的には`wercker.yml`をレポジトリ直下に作成するだけで設定できます。実際に使っている`wercker.yml`が以下にあるので参照してください。

CircleCIだとレポジトリの内容から設定ファイルもある程度自動生成してくれたりして便利なのですが(例えば、RailsでRSpec使ってることを検出してそれ用の設定ファイルを自動生成してくれる)、そのあたりの初回の使い勝手に関してはwerckerはまだ成熟してない印象ですね。



```yaml
box: fliplingo/ubuntu12.04-ruby2.1.0@0.0.1
# Build definition
# See the Rails section on the wercker devcenter:
# http://devcenter.wercker.com/articles/languages/ruby/rails-heroku.html
# You will want to define your database as follows:
services:
  - wercker/postgresql
# See more about services on our devcenter:
# http://devcenter.wercker.com/articles/services/
build:
    # The steps that will be executed on build
    steps:
        - script:
            name: set timezone
            code: |
                export TZ="Asia/Tokyo"
        # A step that executes `bundle install` command
        - bundle-install
        # A custom script step, name value is used in the UI
        # and the code value contains the command that get executed
        - script:
            name: echo ruby information
            code: |
                echo "ruby version $(ruby --version) running"
                echo "from location $(which ruby)"
                echo -p "gem list: $(gem list)"
        # Add more steps here:
        # A step that prepares the database.yml using the database in services
        - rails-database-yml
        # Install phantomjs
        - aussiegeek/install-phantomjs@0.0.3
        # Initialize test database
        - script:
            name: set up db
            code: |
                RAILS_ENV='test' bundle exec rake db:create
                RAILS_ENV='test' bundle exec rake db:schema:load
        # Run rspec
        - script:
            name: rspec
            code: bundle exec rspec
        # Run cucumber
        - script:
            name: cucumber
            code: bundle exec cucumber
    after-steps:
        # Send a message to a HipChat room
        - wercker/hipchat-notify@1.0.2:
            token: $HIPCHAT_TOKEN
            room-id: 64340
```

ポイント

- 公式のBoxだとRuby 2.0.0なので、Ruby 2.1.0を使うためにコミュニティのBoxを使う。
- HipChatへの通知は`after-steps`でやらないとfailしたときに通知されない。access tokenをwercker側で環境変数に設定する必要がある
メモ：開発に便利なカラーピッカープラグイン

# インストール

`~/Library/ColorPickers/` に .colorPicker を放り込んでアプリを再起動。
標準カラーピッカーにタブが増える。

# プラグイン

## ANTETYPE Color Picker
[ANTETYPE Color Picker](http://www.antetype.com/blog/2010/07/a-goodie-to-sweeten-the-waiting-antetype-color-picker/)
![](http://i2.wp.com/www.antetype.com/blog/wp-content/uploads/2010/07/AntetypeColorPicker.jpg)

Photoshop 風。
HSB, RGB, 16進数で指定可能。

## Developer Color Picker]
[Developer Color Picker](http://panic.com/~wade/picker/)
![](http://panic.com/~wade/picker/screenshot.png)

Panic 謹製。
NSColor / UIColor の Objective-C コード、CGColor の C コードで出力可能。

## ColorNamePicker
[ColorNamePicker](http://members.casema.nl/joachim/)
![](http://members.casema.nl/joachim/Images/screenshot2.png)

RGB, 16進数、色名で指定可能。
NSDictionaryのTips

たまに忘れるのでメモ、どんどん増やすかも

## キー(添字)が存在するか確認する
allKeysメソッドを使ってキーの配列を取得し、そのキー配列に対象となるオブジェクト(検索するキー)があるかどうか比較するだけ

```objectivec
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                            @"value1", @"key1",
                            @"value2", @"key2",
                            @"value3", @"key3",
                            nil];
if (dictionary[@"key1"]) {
    // 存在する場合の処理
}
```
UINavigationBarのBackボタンのタイトルを変える


備忘録として。
UINavigationControllerにViewControllerをpushすると
自動的に前画面のタイトルがBackボタンのタイトルに設定されるが
これを変えたい場合は、画面遷移する前に設定しておく必要がある。


```objectivec
//次の画面に遷移するボタン
- (void)actionButtonNextViewController:(id)sender
{
    
    UIBarButtonItem *backBarButtonItem= [[UIBarButtonItem alloc] initWithTitle:@"戻る"
                                                                         style:UIBarButtonItemStylePlain 
																		target:nil
                                                                        action:nil];

	//遷移する前にタイトルを設定しておく
    [self.navigationItem setBackBarButtonItem:backBarButtonItem];
    
	//画面遷移
    [self performSegueWithIdentifier:@"NextViewController" sender:self];
}
```
「haskellの数値のなんか」を型クラスを使わずに


[haskellの数値のなんか](http://qiita.com/yomi322/items/bf5b1d872b2caed6d2e2)のコードを自分なりに書きなおしてみた。
型クラスはあまり使いこなせないので、変換関数を作ってかます方針で。 型変換の条件はわかりやすくなったと思う。

```haskell
module Main where

import Data.Ratio
import Numeric

data Foo = FooInteger Integer
    | FooRational Rational
    | FooDouble Double
    deriving (Show)

addFoo :: Foo -> Foo -> Foo
addFoo (FooInteger x) (FooInteger y) =
    FooInteger $ x + y
addFoo (FooInteger x) (FooRational y) =
    FooRational $ fromInteger x + y
addFoo (FooRational x) (FooInteger y) =
    FooRational $ x + fromInteger y
addFoo (FooRational x) (FooRational y) =
    FooRational $ x + y
addFoo (FooInteger x) (FooDouble y) =
    FooDouble $ fromInteger x + y
addFoo (FooDouble x) (FooInteger y) =
    FooDouble $ x + fromInteger y
addFoo (FooRational x) (FooDouble y) =
    FooDouble $ fromRat x + y
addFoo (FooDouble x) (FooRational y) =
    FooDouble $ x + fromRat y
addFoo (FooDouble x) (FooDouble y) =
    FooDouble $ x + y

-- 以下新規コード

toD :: Foo -> Double
toD (FooInteger v) = fromInteger v
toD (FooRational v) = fromRat v
toD (FooDouble v) = v

toR :: Foo -> Rational
toR (FooInteger v) = fromInteger v
toR (FooRational v) = v

addFoo' :: Foo -> Foo -> Foo
addFoo' x@(FooDouble _) y = FooDouble $ toD x + toD y
addFoo' x y@(FooDouble _) = FooDouble $ toD x + toD y
addFoo' x@(FooRational _) y = FooRational $ toR x + toR y
addFoo' x y@(FooRational _) = FooRational $ toR x + toR y
addFoo' (FooInteger x) (FooInteger y) = FooInteger $ x + y

main :: IO ()
main = do
    let x = FooInteger 3
    let y = FooRational (3%4)
    let z = FooDouble 2.0
    print "original version"
    print $ addFoo x x
    print $ addFoo x y
    print $ addFoo x z
    print $ addFoo y y
    print $ addFoo y z
    print $ addFoo z z
    print "my version"
    print $ addFoo' x x
    print $ addFoo' x y
    print $ addFoo' x z
    print $ addFoo' y y
    print $ addFoo' y z
    print $ addFoo' z z
```
初めてのAndroid ☆


当方の環境

- Mac OSX 10.9.1
- Ecripse / Version: Kepler Service Release 1 / Build id: 20130919-0819

実行するまでは http://izeef.web.fc2.com/develop/android/hello_eclipse.html を参考にしてやった。


## なんかはまる その1

実行すると`The connection to adb is down, and a severe error has occured.`とか`Please ensure that adb is correctly located at '../android-sdks/platform-tools/adb' and can be executed.`言われる

```sh
> adb kill-server
> ../android-sdks/platform-tools/adb start-server
```

で対応できる。何で必要なのかいまいちわからん

## なんかはまる その2

実行すると `Could not find HelloWorld.apk!` と言われる。

よくわからん。debug.keystoreなんてねーぞ。

## 解決

http://developer.android.com/develop/index.html
からSDKをダウンロードして内包されてるEcripseを使ったらいけた☆……orz


## 参考

http://izeef.web.fc2.com/develop/android/hello_eclipse.html
http://pororoca255.blog133.fc2.com/blog-entry-72.html
http://android.keicode.com/basics/quick-start-create-project.php
http://stackoverflow.com/questions/4778113/android-eclipse-could-not-find-apk
http://stackoverflow.com/questions/4072706/the-connection-to-adb-is-down-and-a-sever-error-has-occured
http://happanosasa.seesaa.net/article/188108357.html
Reveal.js、Markdown、Githubでスライドを作成する。


PowerPoint2003から2013になってちょっと戸惑いを隠せない。。。
ありきたりなスライドテンプレートもなんか嫌だし。。。

と思っていたところ、markdownでWebスライドが作れることを発見しました。
GithubでWebページを公開する方法を発見、SublimeTextも入れたので、ちょっとWebスライドを作ってみます。

完成サンプル
[http://budougumi0617.github.io/reveal.js-myMaster/](http://budougumi0617.github.io/reveal.js-myMaster/)

![slide.png](https://qiita-image-store.s3.amazonaws.com/0/20175/1cb16919-5230-62f9-6179-65d7de7b7161.png "slide.png")


#作り方
Reveal.jsというJavaScriptライブラリを利用します。

* GitHubから[reveal.js](https://github.com/hakimel/reveal.js/)のプロジェクトzipをGET
* index.htmlをテキストエディタで開く。
* `<div class="slides">`タグ内の`<section>`内容を削除
* 後述のオプション付き`<section>`を記載する
* `<section>`内にMarkdownでゴリゴリ書く

これだけ！！

---

#Markdown用のsection定義。

以下の`<section>`定義でmarkdownを使用してスライドが書けます。
もちろん、通常の`<section>`定義で`HTML`を利用してスライドを作成することも可能です。
`---`を入れることで右に次のページを作成。
`--`を入れることで下に次のページを作成。

```html
<section data-markdown
    data-separator="\n---\n$"
    data-vertical="\n--\n">
    <script type="text/template">
ここにmarkdownを記載していく。
    </script>
</section>
```

たとえコードタグ内でも、markdown記載中に`</script>`がでるとバグる点だけ気をつけてください。

Markdown記述部分を別ファイルにしておけばindex.htmlは使いまわすことも可能です。

```html
<section data-markdown="./md/firstpage.md"
    data-separator="\n---\n$"
    data-vertical="\n--\n">
    <script type="text/template">
    </script>
</section>
```

---

#編集後はGithubで公開

あとはGithubで新規のリポジトリ作成。
clone,init後にzipの中身を全てコピーして、gh-pagesブランチにpushすればGithub上にスライドが公開できます。
＃今回コミットはSourceTreeで行なったので、コマンドログは割愛。

---

#その他

`<iframe>`で埋め込みしたいときなどはおとなしくHTML使う必要があります。
その他Reveal.jsの詳細な使い方はGitHubの[README.md](https://github.com/hakimel/reveal.js/)を参照してください。

ちなみにブラウザでスライド確認中は、`esc`か`o`でスライドを一覧表示にできるのですが、
ViChrome使っていると競合して動かないので注意。
`Ctrl + esc`でViChromeをエマージェンシーモードにしてから`o`で一覧表示ができます。


---
#参考

今回は以下の情報を参考にさせていただきました！

本家のデモ
[http://lab.hakim.se/reveal-js/#/](http://lab.hakim.se/reveal-js/#/)

なんかかっこいいプレゼンテーションテンプレートを探しているならreveal.js使ってみろって
[http://qiita.com/ryurock/items/9c6de36b9d6a716e7992](http://qiita.com/ryurock/items/9c6de36b9d6a716e7992)

reveal.js+Markdown
[http://qiita.com/siguremon/items/c717eca388070215712c](http://qiita.com/siguremon/items/c717eca388070215712c)

reveal.jsで格好いいプレゼンを作ってみた
[http://d.hatena.ne.jp/zebevogue/20121110/1352521622](http://d.hatena.ne.jp/zebevogue/20121110/1352521622)
MongoDBでのERROR: child process failed, exited with error number 100エラー


MongoDBを起動するときのエラーです．`forkオプション`を付けて永続的に起動させようとしてましたが，パソコンが急に落ちてしまい，再起動したら`ERROR: child process failed, exited with error number 100`という表示が...

```エラー
$ mongod --fork --logpath mongolog/log.txt --nojournal --noprealloc --dbpath mongolog/db
note: noprealloc may hurt performance in many applications
about to fork child process, waiting until server is ready for connections.
forked process: 3081
all output going to: /Users/ryousuke/Sites/node/APPFOG/poitabi/mongolog/log.txt
log file [/Users/ryousuke/Sites/node/APPFOG/poitabi/mongolog/log.txt] exists; copied to temporary file [/Users/ryousuke/Sites/node/APPFOG/poitabi/mongolog/log.txt.2014-02-10T09-12-44]
ERROR: child process failed, exited with error number 100

```

スタックオーバーフローに同じ様な質問がありました．
[Mongodb service wont start - Stack Overflow](http://stackoverflow.com/questions/18524925/mongodb-service-wont-start)
`--repair`とオプションを付けてみるといいっぽいことが書いてたので試してみます．

```--repair付き
$ mongod --fork --logpath mongolog/log.txt --nojournal --noprealloc --dbpath mongolog/db --repair
note: noprealloc may hurt performance in many applications
about to fork child process, waiting until server is ready for connections.
forked process: 3225
all output going to: /Users/ryousuke/Sites/node/APPFOG/poitabi/mongolog/log.txt
log file [/Users/ryousuke/Sites/node/APPFOG/poitabi/mongolog/log.txt] exists; copied to temporary file [/Users/ryousuke/Sites/node/APPFOG/poitabi/mongolog/log.txt.2014-02-10T09-19-28]

child process started successfully, parent exiting
```
successfullyって単語が見えると安心しますね．
再度通常通り起動させてみます．

```成功!
$ mongod --fork --logpath mongolog/log.txt --nojournal --noprealloc --dbpath mongolog/db
note: noprealloc may hurt performance in many applications
about to fork child process, waiting until server is ready for connections.
forked process: 3242
all output going to: /Users/ryousuke/Sites/node/APPFOG/poitabi/mongolog/log.txt
log file [/Users/ryousuke/Sites/node/APPFOG/poitabi/mongolog/log.txt] exists; copied to temporary file [/Users/ryousuke/Sites/node/APPFOG/poitabi/mongolog/log.txt.2014-02-10T09-20-11]
child process started successfully, parent exiting
```

ウマく起動してくれました!
文字リテラルはシングルクォートを使用する

`var str = "str";`
↓　　↓　　↓
`var str = 'str';`
HTMLやCSSでは、ダブルクォートが使用される事が多いため、DOM操作をする際に混同しないよう、JavaScriptではシングルクォートを使用する。
AFNetworkingのリクエストにCookieとUserAgentを設定する




```objectivec:testGet
- (void)testGet
{
	NSString* url = @"http://hoge.com/get.hoge";
    
    AFHTTPRequestOperationManager* manager = [AFHTTPRequestOperationManager manager];
    
    NSError* error = nil;
    NSMutableURLRequest *request = [manager.requestSerializer requestWithMethod:@"GET"
                                                                      URLString:url
                                                                     parameters:nil
                                                                          error:&error];
    
    if( error ){
        return;
    }
    
    NSArray* availableCookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage]cookiesForURL:
                                 [NSURL URLWithString:[NSString stringWithFormat:@"http://hoge.com]]];
    NSDictionary* headers = [NSHTTPCookie requestHeaderFieldsWithCookies:availableCookies];
    
    
    [request setAllHTTPHeaderFields:headers];
    [request setValue:@"UserAgent文字列" forHTTPHeaderField:@"User-Agent"];
    
    AFHTTPRequestOperation *operation = [manager HTTPRequestOperationWithRequest:request
                                     success:^(AFHTTPRequestOperation *operation, id responseObject)
    {
        NSLog(@"Cookie:%@",request.allHTTPHeaderFields[@"Cookie"]);
        NSLog(@"UserAgent:%@",request.allHTTPHeaderFields[@"User-Agent"]);
    }
	failure:^(AFHTTPRequestOperation *operation, NSError *error)
    {   
        NSLog(@"NG");
    }];
    
	// 実行
    [manager.operationQueue addOperation:operation];
}
```

もっと簡単な書き方がある気がする。。
UIWebViewに独自のUserAgentを設定する


UIWebViewのインスタンスを生成した後にUserAgentの設定をしようとしても反映されません。

実際に使うWebViewを生成する前に設定処理を書きます。


```objectivec:AppDelegate
- (BOOL)application:(UIApplication *)application
        didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{   
    //デフォルトのUserAgentを取得するために、サイズゼロのUIWebViewのインスタンスを生成
    UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectZero];

	//デフォルトのUserAgentを取得
    NSString *userAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
    
    //デフォルトのUserAgentに独自の文字列を追加
    NSString *customUserAgent = [userAgent stringByAppendingString:@"付加したい文字列"];
    
    //UserAgent再設定
    NSDictionary *dictionary = @{@"UserAgent":customUserAgent};
    [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];

	return YES;
}
```
NSArray+Where


**※修正。pluckとwhereを間違えてましたorz**
Underscore.jsにarray.whereというとても便利なメソッドがある。

```javascript
_.where(listOfPlays, {author: "Shakespeare", year: 1611});
//=> [{title: "Cymbeline", author: "Shakespeare", year: 1611},
    {title: "The Tempest", author: "Shakespeare", year: 1611}]
```

あまりにも便利すぎるのでObjective-Cでも使いたくなったので実装した。
多分n番煎じだと思う。
cocoaにはvalueForKeyPath:という便利なアクセッサがあるので、入れ子になったNSDictionaryやオブジェクトなどのプロパティも比較できる。

```objectivec:NSArray+Where.h
@interface NSArray (Where)

- (NSArray*)whereUsingSelector:(SEL)selector value:(id)value;
- (NSArray*)whereForKeyPath:(NSString*)keyPath comparingSelector:(SEL)selector value:(id)value;

@end

```
```objectivec:NSArray+Where.m
#import <objc/message.h>

@implementation NSArray (Where)

- (NSArray *)whereUsingSelector:(SEL)selector value:(id)value
{
    return [self whereForKeyPath:nil comparingSelector:selector value:value];
}

- (NSArray *)whereForKeyPath:(NSString *)keyPath comparingSelector:(SEL)selector value:(id)value
{
    NSMutableArray *array = [NSMutableArray arrayWithCapacity:self.count];
    for (id obj in self) {
        id target = keyPath ? [obj valueForKeyPath:keyPath] : obj;
        if ([target respondsToSelector:selector]){
            if(objc_msgSend(target, selector, value)) {
                [array addObject:target];
            }
        }
    }
    return [NSArray arrayWithArray:array];
}

@end

```

こんな感じで使えます。

```objectivec:NSARray+WhereTests.m
- (void)testBasic
{
    NSArray *a = @[@"a",@"b",@"c",@"ab",@"cd",@"a"];
    NSArray *p = [a whereUsingSelector:@selector(isEqualToString:) value:@"a"];
    XCTAssert(p.count == 2, );
    for (NSString *s in p) {
        XCTAssert([s isEqualToString:@"a"], );
    }
}

- (void)testKeyPath
{
    NSArray *a = @[
  @{@"hoge": @"hogeval"},
  @{@"fuga" : @"fugaval"},
  @{@"var" : @"varval"},
  @{@"hoga" : @"hogaval"},
  @{@"hoge": @"hogeval2"}
  ];
    NSArray *p1 = [a whereUsingSelector:@selector(objectForKey:) value:@"hoge"];
    XCTAssert(p1.count == 2, @"key hogeを持っているのは一つだけ");
    NSArray *p2 = [a whereUsingSelector:@selector(isKindOfClass:) value:[NSDictionary class]];
    XCTAssert(p2.count == a.count, @"全部辞書形");
    NSArray *p3 = [a whereForKeyPath:@"hoge" comparingSelector:@selector(isEqualToString:) value:@"hogeval"];
    XCTAssert(p3.count == 1, @"key hogeの値がhogevalなのは1つだけ");
}
```
PS1の設定


`.bash_profile`に以下のように書いてます。

```
PS1="\[\033[1;34m\][\u@\h \w]\n\\$ \[\033[0m\]"
```

表示されるのは全て青文字で以下のような形です。

```
[user@host dir]
$ #ここに文字入力
```

色変更と改行で入力箇所をすぐさま見つけられるようになってます。
EC2内部で別サーバへのアクセス


EC2上にRailsが動くアプリサーバとバッチサーバがあり、アプリケーションサーバからバッチサーバに対してGETリクエストを投げたい。

EC2のインスタンスは再起動するとプライベートIPが変更されてしまうので、そのIPを書いて置くことはできない。

思いついたのは次の手段

- VPCで構築しプライベートIPを固定
- ElasticIPを割り当て、Public DNSでアクセス
- nsloolup Public DNSからプライベートIPを逆引き

EC2内部からPublic DNS経由でアクセスすると、プライベートIPを返してくれる。

https://github.com/cloudfoundry-community/bosh-bootstrap/issues/100

そのため、2番にした。

1番は、別の人が環境構築するので時間がかかるので保留。3番も実装できたけど、2番の方が手軽。
MagicalRecordの仕様変更

仕様変更ってほどでもないですが、2/5にpodspecがちょっと変わったみたいです。

CocoaPods経由でMagicalRecordをインストールしていて、かつMR_SHORTHANDを使って省略形でメソッド呼び出しするコードを書いている人は、Podfileを書き換える必要があるようです。

いままでは
```pod 'MagicalRecord'
```
と書いていたところを、
```pod 'MagicalRecord/Shorthand'
```
に書き換えます。
これでpod installした上で、XXX-Prefix.pchで今までどおり #define MR_SHORTHAND 1 とでも書いておけばOKです。

まあ以下の議論でもあるとおりMR_SHORTHANDはv3.0でdeprecatedになるらしく、今回のライブラリ分割は互換性を維持するための対処らしいので、MR_SHORTHANDを使っているひとは早めに移行しておいたほうがよさそうですね（俺氏）
https://github.com/CocoaPods/Specs/commit/9e7d7aa808ed19c4e6ea1e9647cd2a7668560886#commitcomment-5290889
https://github.com/CocoaPods/Specs/blob/master/MagicalRecord/2.2/MagicalRecord.podspec

メインのリポジトリのほうにはpodspecの変更が反映されてないのはどういうこと。。
https://github.com/magicalpanda/MagicalRecord/blob/develop/MagicalRecord.podspec
grunt-connect-rewriteを使うときにハマったこと


フロントの開発とサーバサイドの開発とで、実装上パスが異なってしまう場合が発生してしまったため、grunt-connect-rewrite（https://github.com/viart/grunt-connect-rewrite ）を使ってみたのですが、そのときハマってしまったのでメモ。


##### 忙しい人のための要約

grunt-connect-rewriteの`from`を記述するときにエスケープシーケンスを使いたい場合は、バックスラッシュを二重に記述する。

```js:
{
	from: 'path\\?hoge=(.*)$',
	to: '/$1.html'
}
```

要約ここまで

##### 解説
---

rulesを記述するときは、下記のとおりに書くと思うのですが、

```js:Gruntfile.js
connect: {
	rules: [
		{
			from: 'path'
			to: 'path'
		}
	]
}

```

この`from`は内部的に正規表現で処理されているため、正規表現が当然使えます。

例えば、

```js:
{
	from: '/js/(.*)$',
	to: '/js/new/$1'
}
```

という感じ。このときは、`/js/`ディレクトリ以下のファイルを、ファイル名やディレクトリ構成をそのままに、`/new/`フォルダ以下に転送する、という感じになります。

ところで普通`/`はエスケープするところですが、上記ではエスケープしていません。このへんは内部的にうまいことエスケープしているらしいです。

しかし、今回`?`を使おうと思ったところ、そこでエラーが発生。エスケープをちゃんと書けばいいのかな？と思って

```js:
{
	from: 'path\?hoge=(.*)$',
	to: '/$1.html'
}
```

みたいに変更してもエラーが発生。悩んでいろいろ試した末、

```js:
{
	from: 'path\\?hoge=(.*)$',
	to: '/$1.html'
}
```
という風に二重にバックスラッシュをつけてエスケープしてみたところ、正常にエスケープできました。

内部的にエスケープを自動で付加してるのが原因なのかな。
PerlのワンライナーでMySQLのSlow LogをParseする、もしくはPerlで複数行の正規表現マッチの話

# 元のスローログ

大体こんな感じで出力されてると思います。

```
# Time: 140210  15:00:00
# User@Host: ...
# Query_time: 1.99999 ...
...
```

# ワンライナー

grep -A2とかやって複数行出力すると、```--```で区切られて出力されます。これを利用してます。

-0777は-nオプションの1行つづ取り出すのを無効にするためにつけてます。大きいファイルだときついかもしれません。

この出力を3行ずつでsplitして、```/s```で```.```を改行にもマッチさせるようにし、TimeとQuery_timeをパースしてそれぞれ一行にして出力させます。

```pl
$ cat mysql_slow.log | grep Time -A2 | perl -0777 -nE 'for(split(/--/,$_)){if(/Time: (?<date>.+?) (?<time>.+?)\n.*Query_time: (?<response>.+?) /s){say "20$+{date} $+{time}\t$+{response}"}}'
```

# 出力結果

```
20140210  15:00:00       1.999999
20140210  15:00:30       2.888888
20140210  15:01:00       3.777777
```
メモ：No known instance method for selector 'respondsToSelector:' が出る場合

デリゲートパターンと `-respondsToSelector:` を使ったコードのビルド時に `No known instance method for selector 'respondsToSelector:'` 警告が出る場合、プロトコルの定義に問題がある可能性あり。
今回は `<NSObject>` の記述を忘れていた。

```objc
@protocol MYSugoiDelegate <NSObject>
…
@end
```
CocoaPodsでマージエラー

pod installしたらエラーが出るようになった。

```bash
$ pod install                                                                                                                                                                                                                     (master)
Analyzing dependencies
[!] The version of CocoaPods used to generate the lockfile is higher that the one of the current executable. Incompatibility issues might arise.
[!] Pod::Executable pull

CONFLICT (rename/add): Rename hoge
...

Automatic merge failed; fix conflicts and then commit the result.
From https://github.com/CocoaPods/Specs

 + 748cc34...afb2540 master     -> origin/master  (forced update)

 * [new branch]      ChatCore   -> origin/ChatCore

 * [new branch]      json_podspecs -> origin/json_podspecs

 * [new branch]      post_install -> origin/post_install
```

調べたら、libgit2のバグらしい。
http://blog.cocoapods.org/Repairing-Our-Broken-Specs-Repository/
2014/1/30の記事なので割と最近か。
対処法は以下のコマンドを打つ。

```bash
$ pod repo remove master
$ pod setup
```

これでpod installが動くようになった。
Firefox OS アプリのバリデータ（app-validator）をローカル環境で実行する方法

# 概要
Firefox OS のアプリ作成時に便利なバリデータを Mozilla さんが公開されています。

 https://marketplace.firefox.com/developers/validator

HostedアプリをURL指定で、Packagedアプリをzipファイルをアップロードすることでチェックしてくれます。
このバリデーターをローカル環境にインストールして実行できるようにします。


# 環境
* Mac OSX 10.7.5

# インストール手順
github に app-validator のインストール方法が記載されていますのでこちらに沿って実行していきます。

https://github.com/mozilla/app-validator

## python をインストール
app-validator は python で動いていますので、まずpythonをインストールします。
ここでは brew を使用してpythonをインストールしています。

```
$ brew update
$ brew upgrade
$ brew install python
```

> 余談
> Mac OS 10.9 (Mavericks)にアップグレードしてからbrewでエラーが出るようになってしまってましたが
> 下記のコマンドでエラーを回避できるようになりました。
> brew update でのエラーを修正
> 
```
$ cd /usr/local
$ git fetch origin
$ git reset —hard origin/master
```

## swig をインストール
swig を brew でインストールします。（swig がないとインストールでエラーとなりました）

```
$ brew install swig
```


## Firefox OS App Validator をインストール
githubからソースコードをcloneします。
> ここでは `/git` ディレクトリにて `git clone` を実行しています。

```
$ cd /git
$ git clone git://github.com/mozilla/app-validator.git
```

pipを使ってパッケージをインストールします。

```
$ pip install git+git://github.com/ametaireau/M2Crypto.git
```

app-validatorの依存パッケージをpipを使ってインストールします。

```
$ cd /git/app-validator/
$ sudo pip install -r requirements.txt
```

python で app-validator を実行できるようになりました。

```
$ cd /git/app-validator/
$ python app-validator
```

インストールします。

```
$ cd /git/app-validator/
$ sudo python setup.py install
```

app-validator のインストールが成功し、実行できるようになりました。

```
$ app-validator --help
```

helpの実行結果

```
usage: app-validator [-h] [-o {text,json}] [-v] [--boring] [--unlisted]
                     [--timeout TIMEOUT] [--acorn]
                     package

Run tests on a web app.

positional arguments:
  package               The path of the package you're testing

optional arguments:
  -h, --help            show this help message and exit
  -o {text,json}, --output {text,json}
                        The output format that you expect
  -v, --verbose         If the output format supports it, makes the analysis
                        summary include extra info.
  --boring              Activating this flag will remove color support from
                        the terminal.
  --unlisted            Indicates that the app will not be listed on the
                        Firefox Marketplace.
  --timeout TIMEOUT     The amount of time before validation is terminated
                        with a timeout exception.
  --acorn               Uses Acorn instead of Spidermonkey for JS parsing.
                        Requirees Node and Acorn.
```

引数にわたす packaged アプリはディレクトリ指定ができず zip 圧縮されている必要があるようです。
Gitリポジトリへのpush時にrubocopでコードチェックを実行

# Gitリポジトリへのpush時にrubocopでコードチェックを実行

## 0. 動機

Gitのpre-commitフックで、コードチェックをかけるのは、個々人の設定に依存してしまうので、リモートへのpush時にもコードチェックをかけたい。

## 1. 下準備

Gitリポジトリのユーザー環境に、コードチェックに使用する`rubocop`をインストールする。

## 2. 対象のプロジェクトでの修正

コードのpush前に、チェックを実行させるので、`Git`のpre-receiveフックを作成する。

pre-receiveフックのスクリプトの方針は、下記。

* プルリクエスト方式で開発を行っているので、ブランチが存在しない状態でもpushされるので、その場合は、プルリクエストをおこすベースの開発ブランチとの差分を対象にコードチェックする
* 差分が大量に発生するケースについては、ブランチ指定でコードチェック自体を行わないように指定できるようにする

pre-receiveフックのスクリプトに指定する内容は、下記(GitLabで、動作させる為に、環境変数の対応を行っているので、適宜、調整)。

```bash
#!/bin/bash

UNCHECK_BRANCH=(master staging)
DEV_BASE_BRANCH="dev"

exists_branch() {
  git show-ref --verify --quiet refs/heads/${1}
  status=$?
  return $status
}

check_code() {
    TEMPDIR=`mktemp -d`
    # マージリクエスト系のように、ブランチが存在しない時は、開発用ベースブランチを使用する
    if exists_branch ${4}; then
      oldrev=$(git rev-parse ${1})
    else
      oldrev=$(git rev-parse refs/heads/${DEV_BASE_BRANCH})
    fi
    newrev=$(git rev-parse ${2})
    for file in $(git diff ${oldrev} ${newrev} --name-only | grep '\.rb$' | grep -v 'schema\.rb'); do
      object=`git ls-tree --full-name -r ${newrev} | egrep "(\s)${file}\$" | awk '{ print $3 }'`
      if [ -z ${object} ]; then continue; fi
      mkdir -p "${TEMPDIR}/`dirname ${file}`" &> /dev/null
      git cat-file blob ${object} > ${TEMPDIR}/${file}
    done;
    # 開発用ブランチにあるrubocopの定義ファイルをコピー
    git show refs/heads/${DEV_BASE_BRANCH}:.rubocop.yml > ${TEMPDIR}/.rubocop.yml
    # GitLab経由のマージリクエスト処理時の環境変数を指定しない状態で実行する
    DEFAULT_RUBYOPT=${RUBYOPT}
    DEFAULT_GEM_PATH=${GEM_PATH}
    unset RUBYOPT GEM_PATH
    # rubocopの実行
    rubocop -c ${TEMPDIR}/.rubocop.yml ${TEMPDIR}
    RET_VALUE=$?
    RUBYOPT=${DEFAULT_RUBYOPT}
    GEM_PATH=${DEFAULT_GEM_PATH}
    rm -rf ${TEMPDIR} &> /dev/null
    return ${RET_VALUE}
}

while read oldrev newrev refname
do
  branch_name=$(basename ${refname})
  if [[ -z $(echo "${UNCHECK_BRANCH[@]:0}" | grep -o ${branch_name}) ]]; then
    check_code ${oldrev} ${newrev} ${reframe} ${branch_name}
    exit $?
  else
    exit 0
  fi
done
```

pre-receiveフック用のスクリプトを作成したら、フック用のスクリプトに実行権限を付与する。

```bash
$ chmod +x pre-receive
```
EC2上にdrone.ioのオープンソース版を載せてみる

↓このエントリに触発され、DigitalOceanではなくEC2上に載せれるか試した結果。結論としては動いた。
[Droneのオープンソース版を試してみました。 - Yosssi's blog](http://yosssi.hatenablog.com/entry/2014/02/08/161500)

簡単に手順をまとめる

EC2インスタンスの作成
===

* 動作保証はUbuntu 12.04LTS or 13.04なので今回は12.04LTSを選択
    * AMIは http://cloud-images.ubuntu.com/precise/current/ より選択
* instance_typeはt1.micro
* Service Hookを受けとれるように、security_groupでGitHubからの80ポートアクセスの許可を入れるのを忘れないようにする
    * GitHubのIPはここを参照 [What IP addresses does GitHub use that I should whitelist? · GitHub Help](https://help.github.com/articles/what-ip-addresses-does-github-use-that-i-should-whitelist)

dockerのインストール
===

* 基本的には公式サイトの通りに実行
    * [Requirements and Installation on Ubuntu Linux - Docker Documentation](http://docs.docker.io/en/latest/installation/ubuntulinux/)

```shell-session
sudo apt-get update
sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring
sudo reboot

curl -s https://get.docker.io/ubuntu/ | sudo sh
```

ただし、このままだと再起動時などにdroneからdockerへ繋がらなくなることがあったので、接続待ち受けポートの設定をしておく

```shell-session:/etc/default/docker
DOCKER_OPTS="-H tcp://0.0.0.0:4243"
```

droneのインストール
====

これも公式の通りでOK
[drone/drone](https://github.com/drone/drone)

```shell-session
wget http://downloads.drone.io/latest/drone.deb
sudo dpkg -i drone.deb
sudo start drone
```

droneが起動したら http://(hostname)/install から初期設定を行う

注意する点
===

1. ディスク容量はすぐ一杯になるのであらかじめ大目に取っておく
2. swapを設定すればt1.microでも動いたが、実用に耐えうるかは疑問
3. droneはdocker imageの中でgit cloneを行うのでimageの中にgitを入れておく必要がある
browserify (browser-pack) はどんなコードを出力するのか？

## はじめに

[browserify](https://github.com/substack/node-browserify)は、CommonJSスタイルで書かれたJavaScript (Node.js)のコードをクライアントで実行可能な形式に変換するライブラリです。ここではbrowserifyがビルドの際に用いている[browser-pack](https://github.com/substack/browser-pack)が、与えられたコードをどんなコードを出力するのかを見ていきます。browser-packのバージョンは6.0.1。

## 入力

Readmeにある以下のjsonを試してみる。この形式はちょうど[module-deps](https://github.com/substack/module-deps)の出力結果と同じもので、browserifyも内部でmodule-depsを利用している。内容は

* 各モジュールを一意に指すID
* コードの本体
* 各モジュールが依存する（内部で`require()`を使って呼び出している）モジュールのパスとID
* そのモジュールがエントリポイントかどうか

の4種類。

```json
[
  {
    "id": "a1b5af78",
    "source": "console.log(require('./foo')(5))",
    "deps": { "./foo": "b8f69fa5" },
    "entry": true
  },
  {
    "id": "b8f69fa5",
    "source": "module.exports = function(n) { return n * 111 }",
    "deps": {}
  }
]
```

## 出力

関数`outer()`を即時実行するコードがビルドされているのが見てとれる。`index.js`を読むとわかるのだが、関数定義はすでに`prelude.js`に書かれており、入力したjsonの情報は関数`outer()`に与える引数の形に整形されている（なお実際のビルドには`prelude.js`を圧縮・難読化した`_prelude.js`が`npm prepublish`時に生成され、そちらが使用される）。

```javascript
(function outer(modules, cache, entry) {

  var previousRequire = typeof require == "function" && require;

  function newRequire(name, jumped) {
    if (!cache[name]) {
      if (!modules[name]) {
        var currentRequire = typeof require == "function" && require;
        if (!jumped && currentRequire) return currentRequire(name, true);

        if (previousRequire) return previousRequire(name, true);
        var err = new Error('Cannot find module \'' + name + '\'');
        err.code = 'MODULE_NOT_FOUND';
        throw err;
      }
      var m = cache[name] = { exports: {} };
      modules[name][0].call(m.exports, function (x){
        var id = modules[name][1][x];
        return newRequire(id ? id : x);
      }, m, m.exports, outer, modules, cache, entry);
    }
    return cache[name].exports;
  }
  
  for (var i = 0; i < entry.length; i++) newRequire(entry[i]);

  return newRequire;

})({
  "a1b5af78": [function(require, module, exports) { console.log(require('./foo')(5)); }, { "./foo": "b8f69fa5" }],
  "b8f69fa5": [function(require, module, exports) { module.exports = function (n) { return n * 111; }; }, {}]
}, {}, ["a1b5af78"]);
```

## 理解のためのメモ

* 関数`outer()`は関数`newRequire()`を返す。ちなみにbrowserifyの`-r`オプションでモジュールを外部から利用できるようにすると、この結果がグローバル変数`require`に代入され（先頭に`require = `のついたコードがビルドされるだけ）、外から`require()`が呼び出せるようになる。
* また`outer()`は`newRequire()`を返す傍ら、エントリポイントのそれぞれに対して`newRequire()`を実行する。
* 同じモジュールを複数回`require()`する場合はキャッシュを利用して再度評価されるのを防ぐ。
* 関数`outer()`の引数で各モジュールのコードが`function(require, module, exports) { ... }`にラップされることで、クライアントサイドでも`require()`や`module`、`exports`が参照できるようになっている。
Hibernate Searchで要素を形態素解析しない設定

Hibernate Searchでインデックスしてるカラムについて
たとえば日付やEnumなどの要素は形態素解析されてほしくない。

```java:Entityの設定
@Column(name="expired_at")
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentLocalDate")
@Field
@FieldBridge(impl=LocalDateBridge.class)
private LocalDate expiredAt;
```

これでexpiredAt が 「2014-02-09」 だとすると

```java:Entityの設定
org.hibernate.search.SearchException: The from parameter leads to several terms when analyzed: 2014, 02, 09,
```
というように解析されてしまう

↓

@Fieldアノテーションに、analyzeのパラメータを設定する。

```java:analyzeのパラメータを設定
@Field(analyze = Analyze.NO)
// Hibernate Search 4系
```