OmniAICreator/Qiita-1.07M huggingface dataset:
laravelのコンテナとりまとめ


内部挙動を押さえときたかったので。一部日本語が変なのはご愛嬌

目的 

- コンテナ名前解決の仕組みをたどる
- コンストラクタ自動注入の仕組みをたどる

## サービスコンテナ

オブジェクトのかご。オブジェクトに名前つけて突っ込んで後から取り出す。都合のいいグローバル変数みたいな(使い方をしてはイケない)。


## 突っ込みたい人向け

### インスタンスを突っ込む

オブジェクトを作ってから突っ込む。

````
$fooBar = new FooBar(new SomethingElse);

$app->instance('FooBar', $fooBar);
````

### オブジェクトの作り方を突っ込む

オブジェクトの作り方だけ。取り出す人が作ればええやんスタイル。

````
$app->bind('FooBar', function($app) {
    return new FooBar($app['SomethingElse']);
});
````

### オブジェクトの作り方を突っ込む(節約指向)

オブジェクトの作り方だけ。一番最初に取り出した人が作って、後の人は最初の人が作ったやつをもらう。

````
$app->singleton('FooBar', function($app) {
    return new FooBar($app['SomethingElse']);
});
````

## 欲しい人向け

決めた名前で取り出す。

````
$fooBar = $app->make('FooBar');
````

ここまでがざっくり使い方。

## コンテナへの登録:お名前と本体

サービスコンテナには 登録時の名前 `$abstract` と、それに紐づく処理`$concrete` とがある。

`bind`とか`singleton`でいうところの第一引数が`$abstract`で第二引数が`$concrete`。ちなみに`singleton`は`bind`の糖衣構文でしか無く処理はほぼ同じ(sharedフラグを立てるだけ)。

````php
    /**
	 * Register a shared binding in the container.
	 *
	 * @param  string  $abstract
	 * @param  \Closure|string|null  $concrete
	 * @return void
	 */
	public function singleton($abstract, $concrete = null)
	{
		$this->bind($abstract, $concrete, true);
	}
````

`bind`に渡された`$concrete`は、どのような値であっても内部的に全てクロージャに変換される。

## makeによる取り出しで何がおこるか

````
$fooBar = $app->make($abstract);
````

は、内部的には

````
$fooBar = $app->build($concrete);
````

に変換される。
(かなりざっくり端折った。実際にはsingletonキャッシュとかその辺が色いろある。)

bindにより紐付けられた`$abstract`によるコール`make($abstract)`は、紐づけられた`$concrete`によるコール`build($concrete)`となる。
この場合、`bind`による`$concrete`はクロージャに変換される、のルールにより`bind`の引数は必ずクロージャである。

紐付のない`$abstract`によるコール`make($abstract)`は、`build($abstract)`に変換され、これもまた`bind`メソドへと渡される。
このケースの引数はクロージャとは限らない。

## build の実装

`build`はクロージャを受け取って、それを実行する。引数としてコンテナ自信を渡すため、クロージャでは第一引数に`$app`が取れる。

これだけであれば非常にシンプルなのだが、ややこしいのがクロージャでないケース。

`$concrete`は`bind`時に自動的にクロージャに変換される。この変換されるクロージャは概ねこんな感じである。

````
	function($app) use ($concrete)
	{
		return $app->build($concrete);
	}

````

クロージャと言えど`build`をラップしているだけの構成。
自動でクロージャに変換された非クロージャの`$concrete`は、一旦は自動生成されたクロージャとして`build`に解釈されても、次のステップで元の文字列として`build($concrete)`される。


`build`の引数に文字列(クラス名)を与えた場合、当該クラスのインスタンスを生成する。

これはリフレクションを用いたlaravelっぽいコンストラクタ注入自動解決のあれでインスタンスを生成するマンで、タイプヒントに基づくコンテナからのクラス取り出しを連鎖的に自動で行ってくれるもの。

このような理由でコンテナに突っ込んだクラス名は、自動的にコンストラクタ注入が適用されるというわけ。

つまりコンテナ外でも`build`メソドさえコールしてやれば、勝手にコンストラクタ注入してくれる。あまりオススメはしないけど。
技術英語 > as close to the same number as possible > できるだけ近い数で

algorithm nutshellという本に記載されていたフレーズ

as [close] to the same number as possible

希望する数に近づけてほしい時に使えばいい。

ここでcloseの発音はクローズでなく、クロースになると思う。
http://eow.alc.co.jp/search?q=close&ref=sa の【2副】に「[時間・空間的に]近くに」が対応すると思う。
第一回 x86バイナリ入門

PC/AT互換機を使ってるプログラマなら当然、x86バイナリを読めるのでここで書くまでもないわです。でも、もしかしたら忘れてしまった！とかちょっと怪しい！ってプログラマのためにx86バイナリ講座をやってみようかと思います。

まぁ、この記事を読んでる方はqemuをインストールしてるんじゃないかという期待があるので、qemuインストールしておいてね！

今回学ぶバイナリは以下のファイルになっています
http://d-kami.net/bin/color.bin

バイナリエディタで開くと途中からやたらと0が続き0x200付近に0x55 0xAAがあると思います。この位置にこのマジックナンバーがないとqemuで動かなくなるので間違ってもここは編集しないように！実行の仕方は

```
qemu -fda color.bin
```

ですよ！このプログラムはブートセクタに格納され、16bitリアルモードで動きます。説明するまでもなかったですね。それで、このファイルの重要な部分は以下の通り。全部解説すると長くなるので、途中でやめて次回を作ることにしました

```x86:color.bin
B4 00 B0 03 CD 10 B0 12 CD 10 B4 0C BA 00 00 B0
01 B9 00 00 CD 10 83 C1 01 81 F9 80 02 75 F5 83
C2 01 81 FA E0 01 75 E9 EB FE
```

当然読めると思うので解説するまでもないですが...
B4 00はAHレジスタに0を代入する命令です！B4が命令で、00が代入される値で、このように直接数値が書かれているのを即値と呼ばれているらしい。他にディスプレイスメントとかあるけど、とりあえず即値！B4はAHに1バイト即値を代入しろ！って命令です。簡単すぎて説明するまでも無かった。この命令を邪道アセンブリ言語で書くと以下の通りになります。Intel記法なので邪道AT&T記法に慣れてる人は注意が必要です。

```
mov ah, 0x00
```


B0 03はALレジスタに0x03を代入しろという命令です。さっきの命令と似ていますが、世の中自分に似ている人が5人はいるというように、x86には似た命令が沢山あったりします。今回も邪道なアセンブリ言語で書くと以下の通りになります。

```
mov al, 0x03
```

ちなみに、AHレジスタはAXレジスタとかいう16bitレジスタの上位8bit、ALはAXレジスタの下位8bitとなっています。別名的な何かですね。説明してしまってすみません。CD 10が続いています。CDとはBIOS Interrupt Call命令で、BIOSの機能を使える便利な命令ですが、実際にはソフトウェア割り込みとかいう難しい話です。

そんなの無視してBIOS Interrupt Callでの話をします。後ろに続く1バイトがcallされる機能の番号で、この番号とレジスタの値によって、呼ばれる機能が決まります。画面に文字を表示しろ！とかフロッピー(死語)を読み込め！などがあります。今回は0x10の機能を使っています。0x10はグラフィック関係の機能があるようです。そして今回はAHが0x00でALが0x03なのですが！AHが0x00だとVideo Modeの設定というやつで、ALの値にそったビデオモードになるようです。ALが0x03だと半角文字で80x25ぶんの画面にする！って感じらしいです。詳しくはhttp://www.ctyme.com/intr/rb-0069.htm
に載っています。頑張ってよもう！

なんか疲れてきたので、このへんで終わります。次回を楽しみに待っていてください！
iOS64ビット対応

#はじめに
わたしのAppleアカウントのメールでは、2014年末からAppleはiOS用の新規アプリ及び更新を64bitへ移行することアナウンスしていますので、いまさら慌て必要は無いと思いますが...

この記事は、Unity 4.6.3p4とUnity 5.0.0p2に基づいています。

**UnityでのiOS用の64bitプロジェクト作成手順をライトします。right!**

#UnityのBuild Settings
当然のことながらPlatformをiOSにスイッチしてください。
![スクリーンショット 2015-03-02 15.36.04.png](https://qiita-image-store.s3.amazonaws.com/0/25895/fd9e5450-3ba8-db3a-c741-1eedbbfa2a78.png)

Player Settings...ボタンを押し、InspectorのConfigurationのScripting BackendをIL2CPPへ変更し、ArchitectureをUniversalへ変更する。

**Unity 4.6.3p4**
![スクリーンショット 2015-03-28 16.07.53.png](https://qiita-image-store.s3.amazonaws.com/0/25895/5fd20a6a-b041-7e8c-e8ee-673105867fdb.png)
**Unity 5.0.0p2**
![スクリーンショット 2015-03-28 16.21.37.png](https://qiita-image-store.s3.amazonaws.com/0/25895/523ae72d-5665-3bf1-1ce1-e7a615579eb4.png)

から

**Unity 4.6.3p4**
![スクリーンショット 2015-03-28 16.08.47.png](https://qiita-image-store.s3.amazonaws.com/0/25895/ea09611b-54f6-b2f6-38bf-52c473ed81de.png)
**Unity 5.0.0p2**
![スクリーンショット 2015-03-28 16.21.54.png](https://qiita-image-store.s3.amazonaws.com/0/25895/7ce645c8-9133-4f95-2ad9-24bdb6b8ce95.png)

**体感ですが、かなり時間が掛かるようになった印象です。結構、**



だけで解決すれば良いのですが...Prime31のアプリ内課金Assetが対応していないとかあります。解決方法は、[Prime31のドキュメントサイト](https://prime31.com/docs#iosGeneral)にあるらしくP31MonoBridgeを見つけたら消すと言う対応らしいです。


つづきは、Web で...
AndroidStudio で Unity に組み込む用の *.aar をつくるときに classes.jar を除外する

※ `libs` ディレクトリに Unity のライブラリ `classes.jar` ファイルが追加されている前提。

メインモジュール( `app` とか )内の `build.gradle` に以下の内容を追加する。

```build.gradle
android.libraryVariants.all { variant ->
	variant.outputs.each { output ->
		output.packageLibrary.exclude('libs/classes.jar')
	}
}
```

上記の項目は、android ライブラリとしてビルドするようになっていないとエラーになるので注意。
最終的な `build.gradle` は以下のようになる。
※ `android.libraryVariants.all` 以外の部分は各プロジェクトで変わってくると思うのであくまで参考で。


```build.gradle
apply plugin: 'com.android.library'

android {
	compileSdkVersion 22
	buildToolsVersion "22.0.1"
	
	defaultConfig {
        minSdkVersion 9
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
	}
	buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
	}
}

android.libraryVariants.all { variant ->
	variant.outputs.each { output ->
		output.packageLibrary.exclude('libs/classes.jar')
	}
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.0.0'
}
```

## 参考ページ
- http://forum.unity3d.com/threads/does-unity-support-using-aar-package-as-android-plugin-library.272776/
Android-x86-4.4-r2 へ カスタムLinux Kernel導入

## defaultのカーネルで、Radeon表示できました。初回起動時に時間がかかっただけのようです。ごめんなさい。
Android-x86上で、`Terminal`起動して、uname -a`で、入れ替えはできてるようです。
> オリジナル`Linux localhost 3.18.0-android-x86+ #1 SMP PREEMPT Thu Jan 1 15:13:43 CST 2015 i686 GNU/Linux`
> カスタム  `Linux localhost 3.18.0-android-x86+ #1 SMP PREEMPT` ビルド日付 `i686 GNU/Linux`

***

## 経緯
0. Android-x86、プロジェクトにあがってる4.4r2のiso使って、インストールしてみたけど、古いノートぱぴこん(ATI?Radeon?X1400?)で画面が出ない。
0. Linux kernelか !?
0. kernel/arch/x86/configs/android-x86_defconfig を見てみる

```bash:console
~/android-x86$ mkdir ~/tmp_conf
~/android-x86$ cp kernel/arch/x86/configs/android-x86_defconfig ~/tmp_conf/.config
~/android-x86$ make -C kernel O=~/tmp_conf ARCH=x86 menuconfig
```
`Device Drivers` ---> `Graphics support` ---> `Frame buffer Devices` ---> 
>  `< > ATI Radeon display support`

お？

## 手順

0. (カーネルビルド機)
 0. Android 4.4開発環境準備
 0. `android-x86-4.4-r2`ソースコード取得
 0. `android-x86_defconfig` ベースに `[*]built-in`で追加。
 0. カーネルビルド (=> `out/target/product/x86/kernel`)
 0. android-x86-4.4-r2.isoをunetbootinで、USBメモリへ書き込み、再起動しない。
 0. /media/~~ にマウントされたまま残ってたので、フォルダ`etc/`でもつくって、`kernel`をコピー
 0. `sync`を3回くらいやって(おまじない)、`eject`
0. (実機)
 0. USBメモリからHDDにインストール
 0. 最後に再起動せず、`ALT+[F2]`とかやって、別コンソールを出す。
 0. `/mnt` に USBメモリ `/hd`にHDDがマウントされてるので、`kernel`をコピー
 0.  `$ cd /hd/android-4.4-r2/`
 0.  `$ mv kernel kernel.org`
 0.  `$ cp /mnt/etc/kernel .`
 0. `ALT+[F1]`でもどって再起動


## ビルド
* ビルドPC `lubuntu 14.04 (64-bit)`
* Android-x86ビルド環境は、ほかに詳しく書いている方がいるので、そちらを参考に
* ソース取得: repo init ~ & repo sync  => 14GBくらい取得するらしい。寝る前に... 
* カーネルビルド

```bash:console
% source build/envsetup.sh
% lunch android_x86-eng
% make clean 
% time make kernel -j4 ARCH=x86 TARGET_PRODUCT=android_x86 TARGET_KERNEL_CONFIG=~/tmp_conf/.config
```

* 通常のAndroidビルドは、こんな感じ

```bash:console
% source build/envsetup.sh
% lunch android_x86-eng
% time make iso_img TARGET_PRODUCT=android_x86 -j4
```
SJISなgoogle.co.jpからの応答をnode.jsで文字化けさせずに受け取るには

# 背景

https通信でちょっとしたテスト先にgoogle.co.jpを指定して
応答を受けると

```txt
content-type : text/html; charset=Shift_JIS
```

と、古いブラウザを考慮してかシフトJISで返される。

node.jsはUTF-8だと日本語の文字列もあまり気にすることなく
扱えるが、SJISだと話は別。変換ライブラリを使えば、この辺り
面倒見てもらえそうではあるが、とりあえず、素のSJISのまま
HTTPレスポンスを受けてそのままファイルに保存するには
どうするんだっけ？という復習やらリハビリw。

# Content-lengthに頼らないBufferの扱い

Content-lengthが返ってくれば、これを元にBufferを長さ分確保して、
オフセット指定で、詰め込んでいけるが、そうでない場合、
Buffer.concatを使うとBufferに追加する処理ができる。

# node.jsでsjisで受けたレスポンスをそのままファイルにする

```js
var fs = require('fs');
var https = require('https');
options = {
    host: 'www.google.co.jp',
    port: 443,
    path: '/',
};
https.get(options, function(res) {
    console.log('HEADERS: ' + JSON.stringify(res.headers));

    // HTTPヘッダを見てのとおり、sjisなので、utf8指定しても無駄
    //res.setEncoding('utf8');

    // content-lengthがなくても大丈夫
    var content = new Buffer([]);

    res.on('data', function(chunk) {
        content = Buffer.concat([content, chunk]);
    });
    res.on('end', function() {
        // エンコードは黙ってるとutf8にされるので、nullを明示的に指定する。
        fs.writeFileSync("dump_sjis.txt", content, {
            encoding: null
        });
    })
});
```

# Link

- [Node.js - dataイベントで受け取るバッファの文字化け - Qiita](http://qiita.com/shigeki/items/d6e83fa42b3f05c352da)

# 関連投稿

- [Shift-JISのソースをiconvでUtf-8に変換してclangでエラー - Qiita](https://qiita.com/kjunichi/items/518e337d29cc5bf6a70b)

# 関連記事

- [#trouble #unicode #utf8 ハイフンの文字コード #windows](http://abrakatabura.hatenablog.com/entry/2012/04/23/061800)
- [libiconvをemscriptenでjs化し、node.jsで使った](http://abrakatabura.hatenablog.com/entry/2015/04/18/115323)
Haskell を入れ直してYesod をインストールする

既出の記事をまとめただけではあるものの、初心者がそれぞれの記事単体で進めるとハマることもあったのでメモとして残しておく。もし次に書いた要件と同じ境遇の方がいれば、役に立つのではないか。

## 具体的な要件
1. 既にインストールしているHaskell Platform を入れ直して
2. Stackage を活用して依存地獄を回避したい
3. Stackage のバージョンごとに開発を進める可能性もあるのでそれを考慮して
4. Yesod をインストールしたい

## Haskell Platform のアンインストール
Haskell Platform の利用は控えた方が良いという説明がある。
[Wht not Haskell Platform?](http://www.stackage.org/install#why-not-haskell-platform)

> * On Windows, it does not provide a complete environment (missing MSYS).
> * By placing a large number of packages in the global package database, Haskell Platform installations are more easily corrupted.
> * The choice of package versions conflicts with the needs of many commonly used packages.
> * Some of the package versions included with the platform have known and severe bugs, and cannot be reliably upgraded.


ということでHaskell を触り始めたときには何も考えずにHaskell Platform を導入したので、一旦アンインストールする。

[Haskell Platform for Mac OS X](http://code.haskell.org/haskell-platform/src/macos/start.html)
[Haskell Platformをアンインストールして綺麗な環境を取り戻す](http://blog.kzfmix.com/entry/1349341991)

## Stackage の活用と、 Haskell の再インストール

[Stackage](http://www.stackage.org)
[LTS Haskell 2.3, GHC 7.8.4](http://www.stackage.org/lts)
[Haskell for Mac OSX](http://ghcformacosx.github.io)

このメモを書いている時点では、LTS 2. 3のバージョンとなっていてGHC 7.8.4 を使うように指示があるので、そのバージョンのビルドをダウンロードする。落とした.appファイルを実行すると、チェックリスト的な画面が表示されて次の状況を教えてくれるので適宜対処する。

* 環境変数の編集の仕方
* Xcode がインストールされているか
* 実行環境 ( .appファイル以下 ) が一時フォルダなどに置かれていないか
* ghc コマンドにパスが通っているかどうか

## Sandbox と Stackage (LTS Haskell)を組み合わせて使う
この記事にとても詳しく書いてある。
[cabal sandbox + LTS Haskell](http://qiita.com/kawachi/items/203c5458c30fb6c7280e)

ポイントは、

> Stackage のバージョンごとに sandbox を作り、共有すれば良い

というところだ。

## Yesod のインストール
ここまでの準備が終わっていれば、インストールは 一直線 にできる。公式サイトにかいてある通りに進める。

http://www.yesodweb.com/page/quickstart

## 終わりに
本件にはハマった時間も含めて５時間ほどかかった。何がどうハマったかというと、詳しくは忘れてしまったのだが

* `cabal install` の使い方
* GHCの最新版(7.10.1)は利用できない
* sandbox化するタイミング

といったあたりだろうか。中でも `cabal install` については、空のプロジェクトフォルダでは実行できなくて、どうすればよいか迷った。.cabal ファイルが無い状態ではこのコマンドは使えないので、今回のケースではYesodプロジェクトを作ってから実行する必要がある。
FT232RLのドライバがインストールされないのは模造品かも知れない

手持ちのUSB-TTLシリアル変換モジュールのVCCが5Vだったので、ESP8266への3.3V電源供給にArduinoを使っていました。USB-TTLシリアル変換モジュールから直接3.3V電源が引けるととてもコンパクトに収まります。あたらしく購入したFT232RLを搭載した3.3V/5.0V切り替えスイッチ付きモジュールは、なぜかWindows 7 64bitでドライバがインストールされず認識されません。どうも模造品のチップを搭載しているようです。ショップに連絡したところすぐに正規品と交換していただきました。

## FT232RLドライバの模造品対策

[FTDI Removes Driver From Windows Update That Bricked Cloned Chips](http://hardware.slashdot.org/story/14/10/24/1330252/ftdi-removes-driver-from-windows-update-that-bricked-cloned-chips)に記事があります。2014年10月にFT232RLの模造品が市場に多く出回っているため、FTDI社がWindows Updateで配布しているドライバを更新して模造品の場合はインストールされないようにしました。今回購入したUSBシリアル変換モジュールは運悪く、模造品のFT232RLを搭載していたようです。

## 模造品の見分け方

[FT232RL: REAL OR FAKE?](http://hackaday.com/2014/02/19/ft232rl-real-or-fake/)に画像で説明があります。私が購入したFT232RLはチップに`1213-C CN480661`と刻印があり動作しませんでした。デバイスマネージャーのその他のデバイスのところに`FT233R USB UART`が識別されずに残ります。

## 解決方法

[前述のサイト](http://hackaday.com/2014/02/19/ft232rl-real-or-fake/)にはドライバのソースコードをダウンロードしてftdiport.infファイルのPIDを手動で書き換える方法も紹介されています。FTDI社からは最新ドライバ(`v2.12.00`)のソースコードは配布されずインストーラーしか提供されなくなりました。一つ前(`v2.10.00`)で試しましたがうまく認識されませんでした。

ショップに連絡したらすぐに交換してくれましたが、安すぎる輸入品は模造品が混入している可能性があるので注意が必要です。
Bashのプロンプトの変更をリモートで実行する方法（SSH+PS1+>>）

プロンプトの変更を各サーバでログインして、設定変更してってやると、
意外と大変なので、リモート実行でまとめてやっちゃえー
ということで、**最初に、最終形。**

```
ssh user@192.168.33.XX echo 'export PS1=\""\\[\033[1;36m\][\t \h \W]\\\\$ \[\033[0m\]\""' >> ~/.bashrc
```
~/.bashrc
は、このようになります。
![result.png](https://qiita-image-store.s3.amazonaws.com/0/50308/981fe593-64ac-1609-c139-dcbb0d1aa3aa.png)

見た目は、こうなります。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/50308/3142bd0a-71b1-72ba-9c0c-c32cc7ca0a2b.png)


これから、一つずつ説明。
まずは、今のプロンプトの設定がどうなっているか？

```
echo $PS1
[\u@\h \W]\$
```
次に時刻を追加してみた。ユーザー名も、ホスト名もいらないので、削除。

```
export PS1="[\t \W]\\$ "
[17:09:38 ~]# 
```

.bashrcに追加します。

```
vi ~/.bashrc
source ~/.bashrc
```

**なんだかんだで、色がついているほうがコマンドとの区別がわかりやすいので、以下に変更。**

```
export PS1="\[\033[0;36m\][\t \h \W]\\$ \[\033[0m\]"
```

何台ものサーバに設定してまわるのは大変なので、sshと>>リダイレクトで
各サーバに設定する方法です。”（ダブルクォテーション）で四苦八苦しました。

```
ssh user@192.168.33.XX echo 'export PS1=\""\\[\033[1;36m\][\t \h \W]\\\\$ \[\033[0m\]\""' >> ~/.bashrc
```
**色を変えたい場合は、**「1;36」の部分を変えてください。
**表示項目を変えたい場合は、**「\t \h \W」の部分を変えてください。
Enum 搭配 Switch 使用的心得 - 囧

在 Objective-C 裡面我會定義一組 NS_ENUM 用來把 table view 中的 section index 標示用途，換到 Swift 之後也想要用這個方式做，但是嘗試之後發現結果好噁心 ...

<!-- more -->

# In Objective-C

在 Objective-C 之中，覺得渾然天成

``` objc:定義NS_ENUM
typedef NS_ENUM(NSInteger, DemoEnum) {
    DemoEnumZero = 0,
    DemoEnumOne = 1,
    DemoEnumTwo = 2
};
```

情境設定在 table view 相關的 data source 或 delegate methods 使用，會接到一個  section index ：


``` objc:搭配switch使用
NSInteger section = indexPath.section

switch (0) {
    case DemoEnumZero:
        NSLog(@"0");
        break;
    case DemoEnumOne:
        NSLog(@"1");
        break;
    case DemoEnumTwo:
        NSLog(@"2");
        break;
    default:
        break;
}
```

看起來還滿 OK 的，

但是到 Swift 之後世界就變了 ´･ω･`

# In Swift

來到 Swift ，先定義 raw value 型態為 Int 的 enum 

``` swift
enum DemoEnum: Int {
    case Zero = 0
    case One = 1 
    case Two = 2
}
```

當 enum 型態為 Int 時，指定第一個值之後，後面的值會自己遞增上去，因此這裡也是可以不用寫後面兩個 cases 的 raw values

這時候如果用一樣的寫法：

```
let section:Int = indexPath.section
switch section {
case DemoEnum.Zero:
    println("0")
    break
default
    break
}
```

馬上就會看到 Xcode 在抱怨：

![](https://farm9.staticflickr.com/8801/16972503689_995b7dff07_o.png)

> Enum case pattern cannot match values of the non-enum type 'Int'

說我 case 的型態和要比較的型態不一樣，而無法讓我編譯

到這邊為止，如果有看過[文件](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Enumerations.html)，就會知道問題出在哪邊， **是要拿 enum 的 raw value** 來比較，也就是應該要寫成這樣

``` swift
case DemoEnum.Zero.rawValue:
```

這時候眉頭皺了一下，心裡想著這是什麼鬼東東，如果要用的話不是就變成 ...

``` swift
switch section {
case DemoEnum.Zero.rawValue:
    println("0")
case DemoEnum.One.rawValue:
    println("1")
case DemoEnum.Two.rawValue:
    println("2")
default
}
```

寫完之後，手停下來盯著每個 case 後面都要掛的 .rawValue 看，覺得非常噁心 

看來是不能這樣寫，寫完都覺得會討厭自己

後來就是著把取得 raw value 這件事情分離出去一個 method

```
func fetchRaw(theEnum: DemoEnum) -> Int {
    return theEnum.rawValue
}
```

原本的 switch-case 就可以變成這樣，也至少比較易讀了

``` swift
switch section {
case fetchRaw(.Zero):
    println("0")
case fetchRaw(.One):
    println("1")
case fetchRaw(.Two):
    println("2")
default
}
```

如果有什麼建議或疑問，歡迎在下方留言討論 '3`y

## 同步發佈

- [Enum 搭配 Switch 使用的心得 - 囧 - 熊屋 | 技術小記](http://blog.kumaya.co/2015/04/15/enum-and-switch-in-swift/)
Erlang processのheap割り当てサイズの推移

#Erlang processのheap割り当てサイズの推移

Erlang processのメモリ使用量を計ったところ, 同じ値を取ることが多かったので気になって調べてみました.
特に結論やまとめがある訳ではないです^^;;

## 検証コード
```erlang
start() ->
    {ok, Fd} = file:open("result", [write]),
    loop(Fd, []).

loop(Fd, List) ->
    {_, Mem} = erlang:process_info(self(), memory),
    file:write(Fd, <<(integer_to_binary(Mem))/binary, "\n">>),
    loop(Fd, [1 | List]).
```

## 結果
(縦軸：Bytes, 横軸:ループ回数)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44308/cc2a05e2-f4be-96b3-8e77-068ef0530232.png)

![image (1).png](https://qiita-image-store.s3.amazonaws.com/0/44308/80ec842a-a858-f6f9-da1e-c2eebe4bb25e.png)

googleスプレッドシートで作成したら, 下の画像が少し残念な感じになりましたが...
GCが走りつつ, 2～1.5倍程度ずつ増やしていっているようですね.
ReactJS でニコ動検索するデモ作った

若者らしくカッティングエッジなウェッブ系技術である ReactJS を触ってみた。
デモ http://polar-woodland-7018.herokuapp.com/#/ （submit が効かないのでなんか入力して虫眼鏡をクリックしてください）
ソースは[こちら](https://github.com/iwag/react-express-template/tree/search-nicovideo-by)

ニコニコの新検索β API http://search.nicovideo.jp/docs/api/contest.html を叩いています。

元にしたtemplateはこれ https://github.com/iwag/react-express-template/ 。 ただReactJSを 0.13にバージョンアップしたりcjsxじゃなくしたりexpressのコード消したり結構改造してある。
このテンプレート便利だからみんな使うといいと思う。

ほぼはまらなかったのであんまり感想がないが一応雑な感想

* 確かに """ウェブノミライ""" を感じた
* 前知識なしで実質1日（8時間くらい？）でできた。
 * それまでは一人アドベントカレンダーとかチュートリアルもやってなかった。もちろん最近出た本も読んでない。
* 最初 naoyaさんの https://github.com/naoya/React-HBFav を見ながら React Nativeから普通のReactJS に移植してそれからニコニコのAPI叩くように変更した
 * 必要になったらFacebookの[チュートリアル](http://facebook.github.io/react/docs/tutorial.html) を読んだり。
 * 作業時間の半分くらいはデザインというか semantic ui http://semantic-ui.com/ の使い方をあーでもないこーでもないと試行錯誤してた時間…
* 他のフレームワーク（knockoutとかbackboneとかvueとか）を挫折した人間としては、ReactJSが一番わかりやすかった。
 * まあES6とかbrowserfyとか周辺ツールが成熟したというのも大いにありそう
  * 黒魔術化してるような気もしていて、templateではgulpとかwebpackとか使われてるがまったく理解していない

自分みたいなサーバサイドエンジニアでも魂は震えなくてもウェブノミライを感じることはできたので暇があったらちょっと触ってみるといいんじゃないでしょうか。
実行回数をカウントするスクリプト

ちょちょいと書いたスクリプトが本人の与り知らぬところで
いろんな人に使われててびっくり。プログラムのさっぱりの人には有難いらしい。

実行された回数をファイルに書き出して＋＋するだけのスクリプト。

```pl:cnt.pl
#!/usr/bin/perl

my $pwd  = `pwd`; chomp $pwd;
my $file = "$pwd/cnt.txt";
my $i = `cat $file 2>/dev/null`;
$i++;
print "$i\n";

`echo $i > $file`;
```

```bash
$ chmod +x cnt.pl
$ rm -f cnt.txt
$ ./cnt.pl
1
$ ./cnt.pl
2
$ ./cnt.pl
3
```
JSONスキーマはじめの一歩

JSONスキーマと、RubyでJSONスキーマつかってvalidationするやり方を解説します。

[全てがJSONになる - ✘╹◡╹✘](http://r7kamura.hatenablog.com/entry/2014/06/10/023433) を読んでJSON schema良さ気だと思ったけど、まだ使ったことない人向けの記事です。

## JSONスキーマって？
本屋のJSONデータを返すAPIがあったとします。

```json:bookshop.json
{
  "name": "おしゃれな本屋",
  "place": {
    "large_area": "おしゃれな地域",
    "small_area": "おしゃれな街",
    "address": "おしゃれな街のおしゃれな建物",
    "latitude": 33.333,
    "longitude": 33.333
  }
}
```

これに対して、JSONスキーマを用意しておけば、**１つ１つの値の有無や型をチェック**できます。**生成したJSONが意図したものになっているかテストするのに便利**です。

JSONスキーマといいつつJSONだと括弧が多くて冗長なので、**YAMLで書いてJSONに変換するのがおすすめ**です。YAMLだとコメント書けますし。

```yaml:bookshop-schema.yml
---
$schema: "http://json-schema.org/draft-04/schema#"
title: "Bookshop"
type: "object"
required: # 必須のプロパティを定義
  - "name"
  - "place"
properties:
  name:
    type: "string" # "おしゃれな本屋"は文字列
  place:
    type: "object"
    required:
      - "large_area"
      - "small_area"
      - "address"
      - "latitude"
      - "longitude"
    properties:
      large_area:
        type: "string"
      small_area:
        type: "string"
      address:
        type: "string"
      latitude:
        type: "number" # 33.333は数値
      longitude:
        type: "number"
additionalProperties: false
```

## validationはどうやるの？
rubyで説明します。
[ruby-json-schema/json-schema](https://github.com/ruby-json-schema/json-schema)というgemを使います。

```ruby:validation.rb
require 'json-schema'
require 'yaml'

json = File.open('./bookshop.json').read
schema = JSON.dump( YAML::load( File.open('./bookshop-schema.yml').read ) )
p JSON::Validator.fully_validate(schema, json, :strict => false)
```

validationで特にエラーがなかった場合、空の配列が出力されます。
エラーがあった場合は、次のように出力されます。

```rb
["The property '#/name' of type NilClass did not match the following type: string in schema ecf16823-628c-5899-a01c-4978dcd6883b#", "The property '#/place/address' of type Array did not match the following type: string in schema ecf16823-628c-5899-a01c-4978dcd6883b#"]
```

サンプルコードを上げておいたので、詳しくはこちらを。
[sagaraya/json-schema-sample](https://github.com/sagaraya/json-schema-sample)


## JSONスキーマについて補足
### $schemaって？
JSONスキーマの仕様はいくつかのバージョンがあるため、どのバージョンを使うか宣言します。最新は`draft-04`です。

詳しくは [The $schema keyword — Understanding JSON Schema 1.0 documentation](http://spacetelescope.github.io/understanding-json-schema/reference/schema.html#schema) へ。

### どんなキーワードや型が使えるの？

英語ですが、**[JSON Schema Reference — Understanding JSON Schema 1.0 documentation](http://spacetelescope.github.io/understanding-json-schema/reference/index.html) が一番よくまとまってます！**

型については [Type-specific keywords](http://spacetelescope.github.io/understanding-json-schema/reference/type.html) にまとまっていて、それ以外のページにどのようなキーワードが使えるか載ってます。

### 応用
今回はAPIのレスポンスを例に挙げましたが、リクエストパラメータのvalidationにも使えます。また、JSONスキーマからドキュメントを自動生成したり、APIクライアントを自動生成したりできます。JSONスキーマ１つで色々なことができるようになって便利！
[C言語] 時間を扱う


時間を扱うには`time()`関数などを利用します。

## 関数

### time関数

引数の`timer`に、暦時刻を格納します。時刻はグリニッチ標準時（GMT）の1970年 1月 1日の00:00:00 から現在までの経過時間を秒単位です。（エポック秒）
（戻り値も同じものを指します）

`NULL`を指定すると戻り値を返却するのみとなります。

```c
#include <time.h>

time_t time(time_t *timer);
```

### mktime関数

```c
#include <time.h>

time_t mktime(struct tm *timeptr);
```

引数で渡された`struct tm`構造体の情報を元に、1970/1/1 0:00:00からの経過秒数を返します。
`struct tm`構造体は`time.h`の中で以下のように宣言されています。

```c
構造体 tm はtime.h の中で宣言され、以下の情報を含みます
struct tm {
  int tm_sec;      /* 秒 [0-61] 最大2秒までのうるう秒を考慮 */
  int tm_min;      /* 分 [0-59] */
  int tm_hour;     /* 時 [0-23] */
  int tm_mday;     /* 日 [1-31] */
  int tm_mon;      /* 月 [0-11] 0から始まることに注意 */
  int tm_year;     /* 年 [1900からの経過年数] */
  int tm_wday;     /* 曜日 [0:日 1:月 ... 6:土] */
  int tm_yday;     /* 年内の通し日数 [0-365] 0から始まることに注意*/
  int tm_isdst;    /* 夏時間フラグ　[夏時間を採用しているときに正、採用していないときに 0、この情報が得られないときに負] */
};
```

## difftime関数

```c
#include <time.h>

double difftime(time_t time2, time_t time1);
```

`time1`から`time2`までの時間差を秒数で返します。


### localtime関数

```c
#include <time.h>

struct tm *localtime(const time_t *timer);
```

`timer`に格納されているデータを現地時間（日本時間）に変換し、`tm`構造体に格納します。


### asctime関数

```c
#include <time.h>

char *asctime(const struct tm *tblock);
```

`tblock`構造体の時刻を文字列に変換します。


## サンプル

とある日付から経過秒数を取得するサンプルです。

```c
#include <time.h>
#include <stdio.h>
#include <stdlib.h>

int main() {

    char *sample = "2015年04月15日00時43分";
    int year;
    int month;
    int hour;
    int day;
    int min;
    sscanf(sample, "%04d年%02d月%02d日%02d時%02d分", &year, &month, &day, &hour, &min);

    struct tm sampleDate;
    sampleDate.tm_sec   = 0;
    sampleDate.tm_min   = min;
    sampleDate.tm_hour  = hour;
    sampleDate.tm_mday  = day;
    sampleDate.tm_mon   = month - 1;
    sampleDate.tm_year  = year - 1900;
    sampleDate.tm_isdst = -1;

    time_t time = mktime(&sampleDate);

    printf("time: %ld\n", time);

    return 0;
}
```
iso_country_codes gem で ISO 国名コードの国名とコードを取得する #ruby

## <i class="fa fa-code" style="font-size:1em;"></i> 概要
iso_country_codes gem で ISO 国名コードの国名とコードを取得します

## <i class="fa fa-cloud-download" style="font-size:1em;"></i> ISO 国名コードとは？
以下を参照
<i class="fa fa-external-link" style="font-size:1em;"></i> [国名コード - Wikipedia](http://ja.wikipedia.org/wiki/%E5%9B%BD%E5%90%8D%E3%82%B3%E3%83%BC%E3%83%89)

## <i class="fa fa-cloud-download" style="font-size:1em;"></i> インストール

~~~bash
$ gem install iso_country_codes
~~~

## <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
### サンプルコード

~~~ruby
require 'pp'
require 'iso_country_codes'

def show_details(country)
  puts <<-EOS
#{country.name}
	#{country.numeric}
	#{country.alpha2}
	#{country.alpha3}
	#{country.calling}
	#{country.continent}
	#{country.currency}
	#{country.currencies}
  EOS
end

# 日本, パレスチナの ISO 国名コードを取得
[392, 275].each do |code|
  country = IsoCountryCodes.find(code)
  show_details(country)
end

# エラー発生時はブロックに処理を記述できる
begin
  IsoCountryCodes.find(999)
rescue => e
  puts e.message
end

# ISO コードの昇順で ISO 国名コードの全情報を 5 件取得
pp IsoCountryCodes.all.sort_by { |e|e.numeric }.take(5)

# ISO コードの昇順で ISO 国名コード国名とコードを 5 件取得
pp IsoCountryCodes.for_select(:numeric).sort_by { |e|e.last }.take(5)
~~~

* 動作確認

~~~bash
Japan
	392
	JP
	JPN
	+81
	AS
	JPY
	["JPY"]
Palestine, State of
	275
	PS
	PSE
	+970
	AS
	JOD
	["JOD", "NIS"]
No ISO 3166-1 code could be found for '999'.
[#<IsoCountryCodes::Code::AFG:0x000006004c30c8>,
 #<IsoCountryCodes::Code::ALB:0x000006004c29c0>,
 #<IsoCountryCodes::Code::ATA:0x000006004c0c60>,
 #<IsoCountryCodes::Code::DZA:0x000006004c2498>,
 #<IsoCountryCodes::Code::ASM:0x000006004c1e08>]
[["Afghanistan", "004"],
 ["Albania", "008"],
 ["Antarctica", "010"],
 ["Algeria", "012"],
 ["American Samoa", "016"]]
~~~

## <i class="fa fa-eye" style="font-size:1em;"></i> コードリーディング
### Singleton
singleton モジュールを利用しています。

<i class="fa fa-external-link" style="font-size:1em;"></i> <i class="fa fa-github" style="font-size:1em;"></i> [iso_country_codes.rb L5](https://github.com/alexrabarts/iso_country_codes/blob/master/lib/iso_country_codes/code.rb#L5)

## :books: 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [iso_country_codes GitHub](https://github.com/alexrabarts/iso_country_codes)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [iso_country_codes RubyGems](https://rubygems.org/gems/iso_country_codes)
ActiveRecordの読み込みが実際にトリガーされた場所をログに記録するgem

ActiveRecordは必要になるまでDB読み込みをしません。
なのでやたら複雑なビューの中でクエリを弄ったり、コントローラーが肥大化してる状態でひどいSQLがログに流れてくると、パっと見ではどこが原因なのかすぐに分からない。
なので、SQLが実行された時にそれが実際にトリガーされたソースコードの位置も一緒にログに吐いてくれるgemを作りました。

bulletで分からないような、ビューのループの中で直接モデル読んでるみたいなヤバイ箇所を速やかに見つけるためのものです。

[joker1007/activerecord-cause](https://github.com/joker1007/activerecord-cause "joker1007/activerecord-cause")

仕組み的にはActiveRecordのロギングの仕組みを丸パクリしてcaller_locationsを足した感じ。
全ての読み込み位置を表示するわけではなく正規表現でマッチするパスを持ったソースコードの位置のみをログに記録します。
Railsで利用する場合は自動的に`app`直下を対象にしています。

設定はこんな感じ。

```rb
ActiveModel::Cause.match_paths = [Regexp.new(Rails.root.join("lib").to_s)]
```

ログ出力はこんな感じ。

```
D, [2015-04-15T22:13:46.928908 #66812] DEBUG -- :   User Load (0.1ms)  SELECT "users".* FROM "users"
D, [2015-04-15T22:13:46.929038 #66812] DEBUG -- :   User Load (ActiveRecord::Cause)  caused by /Users/joker/srcs/activerecord-cause/spec/activerecord/cause_spec.rb:16:in `block (3 levels) in <top (required)>'
```

追記:
リリース後にRails4.2で動かないバグを発見したので修正してバージョンアップしてます。
3.2環境では完璧に動いていたんで気付いてませんでした。 (御察しください)
ReactNativeでgulpとreact-jadeを使ってみる


あんまりモバイル興味ないのだけど、一応試しておく。要は普通のフロントエンドスタックで実装できるかのテスト

[mizchi/react-native-playground-with-gulp](https://github.com/mizchi/react-native-playground-with-gulp "mizchi/react-native-playground-with-gulp")

これをcloneして、

```shell
npm install react-native-cli -g
sh init.sh
npm install
gulp watch
```

でgulpの監視を開始。あとは xcodeproj 開く。

## 何が出来るようになったか

```jade
View(style=styles.container)
  Text Welcome with gulp
```


みたいなjadeのテンプレートがReactNativeでも使える。

呼び出し側。今回はbabel。coffeeでもよかった。

```js
'use strict';
global.React = global.require('react-native');
let xtend = require('xtend');

let {View, Text} = React;
let template = require('./template');
let styles = React.StyleSheet.create(require('./styles'));

let HelloNative = React.createClass({
  render: function() {
    return template(xtend({}, {View, Text, styles}));
  }
});

React.AppRegistry.registerComponent('HelloNative', () => HelloNative);
```

基本的にプリプロセスしたjsをbrowserifyしてindex.ios.jsにブチ込んてるだけ。

##  ハマったところ

react-native環境で普通のreactをrequireすると死ぬので、react-jade が吐く `typeof React !== "undefined" ? React : require("react")'` みたいなコードがダメ。

仕方ないのでgulp-replaceで次のようなgulpタスク書いて回避した

```coffee
gulp.task 'build:jade', ->
  gulp.src('src/**/*.jade')
    .pipe jade()
    .pipe replace('typeof React !== "undefined" ? React : require("react")', 'React')
    .pipe(gulp.dest('lib'))
```

乱暴な感じがする。

あと browserify が `var React = require('react-native')` は出来ないので、`global.React = global.require('react-native')` として雑に回避したりした。

たぶん、rootのnodeを2つ以上にすると、react-jadeが勝手にdivのrootを追加しようとして死ぬ気がしている。
いつもお世話になっているあのソフトウェアがどの言語で書かれているか調べてみた

「次に勉強するべきはどの言語？」を考えるための材料として、身近にあるソフトウェアが何言語で書かれているかをリストアップしてみました。
リストは完全に私の独断によるもので、特に他意はありません。
アプリケーションよりはミドルウェア寄りな視点になっています。
ジャンル分けも適当です。

|ジャンル|名前|言語|
|---|---|---|
|OS|Linux Kernel|C|
|OS|Windows|C++|
|RDBMS|MySQL|C/C++|
|RDBMS|PostgreSQL|C|
|WebServer|Apache|C|
|WebServer|Nginx|C|
|WebServer|h2o|C|
|KVS|redis|C|
|KVS|memcached|C|
|KVS|tokyotyrant/tokyocabinet|C|
|KVS|kyototycoon|C++|
|DB|MongoDB|C++|
|DB|ElasticSearch|Java|
|Logger|Fluentd|Ruby|
|Tool|Embulk|Java|
|CI|Jenkins|Java|
|PackageManager|yum|python|
|PackageManager|apt|python|
|PackageManager|homebrew|ruby|
|Firewall|firewalld|python|
|Browser|GoogleChrome|C++|
|ImageManipulation|ImageMagick|C|
|VCS|git|C|
|Language|Perl|C|
|Language|PHP|C|
|Language|Ruby|C|
|Language|HHVM/Hack|C++|
|Language|go|go|
|Language|node/v8|C++|
|Tool|Gnu coreutils|C|
|Tool|AWS CLI|python|
|DevTool|peco|go|
|DevTool|ghq|go|
|DevTool|Vagrant|Ruby|
|ProccessManager|supervisord|Python|
|Provisioning|Ansible|Python|
|Provisioning|Chef|Ruby|
|Provisioning|Berkshelf|Ruby|
|Provisioning|ServerSpec|Ruby|
|Container|Docker|go|
|Container|kubernetes|go|
|Container|rkt|go|

## リストアップしてみての感想
* ミドルウェアや言語処理系ではまだまだC言語が広く使われている。特に2014年に登場したh2oがCで書かれているのは特筆するべき。
* 最近のミドルウェア/処理系ではC++を使っているケースもちらほらある。代表例はChrome,MongoDB,node.js,HHVMなど。
* Java製ツールは(自分の身近には)あまり多くない。embulkがJava製なのは要注目。
* 2009-2013年あたりに登場したインフラ系プロダクトではRuby製が多い。ただ最近ではGoに押され気味。
* 2013年以降、Go製のツールが急に増えてきた印象がある。

## 各言語について思うところ
(特定の言語をDisる意図はありません)
### C
既存ミドルウェアでC製のものが多いので、トラブルシューティングをしたりパッチをあてたりするにはC言語とその周辺ツール(make,gdb,lddなど)の知識は必要。
スクリプト言語のモジュールでも、速度が要求されるものはたいていCで実装されている。(PerlのXS、PHPのextension、Rubyのgem)
Linux KernelがC言語で書かれているのは大変重要で、これはこの先も当分変わらなそう。

### C++
MongoDB,node.js,HHVMなどを皆が使っているわけではないので、もし現場でC++製ツールを使っていないなら、勉強せずにスルーしてもいいかもしれない。将来的にgoやrustに取って代わられる可能性が高そう。

### Java
Java製のツールで広く普及してるものといえばJenkinsくらいしか思いつかない。
古き良き言語で若干時代遅れだと思われていたが、Java8でキラキラ感を取り戻した感あるので、今後じわじわくるかもしれない。

### Perl
Perl製のツールって最近あまり聞かない気がする。昔は鯖管=Perlなイメージがあったが、近年はその市場をRuby/Goに奪われた感ある。かなしい。

### PHP
PHP製のツール・ミドルウェアというのはほぼ皆無である。
PhpMyAdminとかWordpressとか「アプリケーション」的なものが多い。
PHPプログラマは他言語を勉強しないとやっていけないが、他言語プログラマはPHPを勉強しなくてもやっていけるのである。
rebuildfmでPHP書ける人が登場しないのはつまりそういうことである。

### Ruby
Infrastructure as code をやるなら多少なりとも読み書きできる必要がある。
Chef/Vagrant/Fluentdの登場で、インフラの言語としてかなり定着してる感ある。DSLの書きやすさ、プラグイン機構の作りやすさが、インフラ系で採用される大きな決め手になったと思われる。

### Python
主要なLinuxディストリビューションに最初から入ってるスクリプト言語は今やpythonだけである。yum/apt/firewalldなどOSのコアに近い部分で縁の下の力持ちとして働いている。
~~が、最近のツールでpython製のものはだいぶ少なくなってきている気がする。~~
~~広く使われているものとしては[aws-cli](https://github.com/aws/aws-cli)があるが、将来的にこれはGo言語で置き換わりそうな気がする。~~
~~pythonは勉強しなくても何とかなるかもしれない。~~

元々欧米では広く使われていた、科学計算ライブラリが豊富、だったところに、機械学習という強い追い風がきたので、今後重要性が高まってきそう。

### Go
2014年以降に書かれたCLIツールはGo製のものが大変多い。CLI分野ではRubyをしのぐ勢いがある。
例えば`hub`コマンドはもともとRuby製だったのがver 2からはGo言語で書きなおされていることがそれを象徴している。
またコンテナ系でよく使われているので、コンテナ技術を深堀りするためには避けては通れない。

### Rust
C,C++言語を置き換えるかのようなコンセプト・可能性がある。将来どこまで勢力を広げるかは未知数。

## 結論
これから自分が勉強するべきなのはC/Go/Ruby/Rustあたりか。
(それとは別にアプリケーション用言語としてJS/Java/Swiftを勉強する必要もある)
webデザイン(編集中)


http://blog.idea-clippin.com/?p=332

http://blog.idea-clippin.com/?p=889

デザインの要素

## レイアウト

### 1. そのページのゴールを決める

なんのためのページ？遷移するとしたらどこに遷移したい？どういう感情の変化をさせたいの？

### 2. 情報の構想もかんがえる
情報階層の深さ
→1ページのサイトなのか、第二階層以降ありグローバルナビゲーションが必要になるのか、など


### 3. 伝えたい情報を、セールスライティングで書く。

タイトル、

ソートできるようにもしたりする。

### 3. テーマに合わせて、レイアウトをざくっと決める。

(tips)自分の伝えたい内容がうまく表現できるレイアウトであれば、特に何でもいい。こだわるけどこだわらない。
![0417_01.gif](https://qiita-image-store.s3.amazonaws.com/0/63876/8681a160-2430-3e82-945f-71d86d23f448.gif "0417_01.gif")

[いろんなレイアウト](https://www.evernote.com/shard/s163/sh/199c071d-81b4-4d29-84d2-97a04d438325/89316d4d92fa31c55f4872a03709378c)

* [webレイアウト種類別](http://liskul.com/cr_webdr8-3599)
* [その他](http://www.41web.jp/blog/2015/01/20/96)
* [その他2]http://www.huffingtonpost.jp/tsutomu-sogitani/ui-design_b_6757738.html
* http://photoshopvip.net/94741
* マガジンレイアウトはキュレーション系（興味を引いて貰う必要ある？）
* カードはタイムライン系(異なるコンテンツ)
* グリッドは商品一覧系（共通のコンテンツ、異なる）

・目的ある?
 -> yes 
・同じジャンルのものから選びたい（商品一覧ページ）
 -> ページネーション + グリッドレイアウト(均一)
・コーポレートサイトならシックに。

・目的ない？
・ふわっと来て、面白いものを見つけたい
 ->SNSのフィードとかならカードレイアウト（ある程度の目的はあるから、若干グリッドに寄せて選びやすく、マガジンとの中間）
 ->SNSのフィードはタイムラインのレイアウト
 ->記事系のキュレーションならマガジン
・プロモーション専用、楽しんでほしい
 -> ブランドならビジュアルインパクト系、ビジュアルを押し出す


### 4.　レイアウトが決まったら、必要な 

右上から、大きさと位置関係、色でレイアウトをうまく決める。

重要なものは大きくするOR色を変えるOR画像などを使うOR強調されやすい位置に置く。

左上から右下に、優先順位に沿って並べる。

## 異なるページのレイアウト

■ページを構成する要素は
マージン、タイトル、本文、見出し、キャプション、色、その他のグラフィック要素

左から右にかけてページの統一感を出すために重要。



## 文字

#### フォント

* ゴシック・・・ポップ、モダン、主張する

新ゴシックは均一
ゴシックBBBは漢字が大きく見える

* 明朝・・・伝統的、真面目、静かな感じ、定着間

明朝の中でもヒラギノはモダン、ひでえいはオールド

* 詳細はレイアウト基本のきの50ページ

#### 文字の大きさ

[16pxにするべき？](https://www.evernote.com/shard/s163/sh/b6ad01f6-c7f6-428d-b42e-d3edac6cffab/64e1729ca5699a0d3df28299e69c7037)


#### 行間、行長。
■業長は
■行間は文字サイズの1.5倍から2倍くらいは必要です。
■行長が長いほど行間はあけた方が読みやすい。
■行間は行長とセットで考える

* tips
本文は意識しなくても読めるやつにすること。

フォント
配色
レイアウトの装飾
挿絵？


なぜこれを入れたか（ユーザビリティの視点と、ペルソナの視点。）

















http://liginc.co.jp/web/design/138869#book6

これ読んでいく
http://www.amazon.co.jp/%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%AE%E6%95%99%E5%AE%A4-%E6%89%8B%E3%82%92%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%88%E3%83%AC%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0-CDROM%E4%BB%98-%E4%BD%90%E8%97%A4-%E5%A5%BD%E5%BD%A6/dp/4844359797/ref=pd_sim_b_2?ie=UTF8&refRID=1C1DR05GTDJTYST2TZKJ
とか

http://www.amazon.co.jp/%E3%83%8E%E3%83%B3%E3%83%87%E3%82%B6%E3%82%A4%E3%83%8A%E3%83%BC%E3%82%BA%E3%83%BB%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%96%E3%83%83%E3%82%AF-%E3%83%95%E3%83%AB%E3%82%AB%E3%83%A9%E3%83%BC%E6%96%B0%E8%A3%85%E5%A2%97%E8%A3%9C%E7%89%88-Robin-Williams/dp/4839928401/ref=pd_cp_b_0

http://www.amazon.co.jp/7%E6%97%A5%E9%96%93%E3%81%A7%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E3%81%99%E3%82%8B%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88%E5%9F%BA%E7%A4%8E%E8%AC%9B%E5%BA%A7-DESIGN-BEGINNER-SERIES-%E8%A6%96%E8%A6%9A%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E7%A0%94%E7%A9%B6%E6%89%80/dp/4881081438/ref=pd_sim_b_5?ie=UTF8&refRID=1C1DR05GTDJTYST2TZKJ

もいい
指定した値が配列要素の何番目か取得する

List::MoreUtilsのfirstidxを使えばよい。
以上終了ではつまらないのでfirstidxの実装をみてみる。

```bash
$ perldoc -m List::MoreUtils
sub firstidx (&@) {
    my $f = shift;
    foreach my $i ( 0 .. $#_ ) {
        local *_ = \$_[$i];
        return $i if $f->();
    }
    return -1;
}
```

localがミソですね。
モジュール入れずに移植するならこんなかんじで呼び出す。

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

my @weeks = qw(Sun Mon Tue Wed Thu Fri Sat);
print firstidx(sub{ $_ eq "Wed"}, @weeks) . "\n";

sub firstidx {
    my $f = shift;
    foreach my $i ( 0 .. $#_ ) {
        local *_ = \$_[$i];
        return $i if $f->();
    }
    return -1;
}
__END__
3
```

# 参考

404 Blog Not Found:perl - 勝手に添削^2 - loop control
http://blog.livedoor.jp/dankogai/archives/50812677.html
How Does Rack Parse Query Params? With Parse_nested_query


今天在读[action_controller_overview](http://guides.rubyonrails.org/v3.2.18/action_controller_overview.html)
的时候,看到rails在解析query string的时候老牛了. 它能够把此类的参数转化为数组:

> GET /clients?ids[]=1&ids[]=2&ids[]=3   

上面就会得到下面的参数:

> params[:ids] will now be ["1", "2", "3"]

想着怎么如此牛逼闪闪, 网上看见这个 [How Does Rack Parse Query Params? With Parse_nested_query](http://codefol.io/posts/How-Does-Rack-Parse-Query-Params-With-parse-nested-query) ,感觉一针见血啊!
gradleからdeploygateへアップロードする

# deploygate

転記元: [Yukiの枝折 - gradleからdeploygateへアップロードする](http://yuki312.blogspot.jp/2015/04/gradledeploygate.html)

## Get Started.

 1. Projectルート直下にあるbuild.gradleにclasspathを追加. 
 2. Moduleのbuild.gradleにdeploygate taskを追加.
 3. deploygate taskのパラメタをカスタマイズ
 4. `gradle uploadDeployGate`でアップロード

### Edit build.gradle

Projectルート直下にあるbuild.gradleにあるclasspathに下記を追加する. 

```groovy
dependencies {
	// ...
    classpath 'com.deploygate:gradle:0.6.2'
}
```

**NOTE:** Module直下のbuild.gradleではない

Module直下にあるbuild.gradleにdeploygate taskを追加する. 
deploygate taskのテンプレートは下記. 

```groovy
apply plugin: 'deploygate'

deploygate {
  userName = "[owner name]"
  token = "[token]"

  apks {
    release {
      sourceFile = file("[apk1 file path]")
    }

    debug {
      sourceFile = file("[apk2 file path]")

      //Below is optional
      message = "test upload2 sample"
      visibility = "public" // default private
      distributionKey = "[distribution_key]"
      releaseNote = "release note sample"
    }
  }
}
```

各パラメータに指定する情報は下記サイトを参照. 
[https://deploygate.com/docs/api](https://deploygate.com/docs/api)

|  Param           |  Description                                    |
|------------------|-------------------------------------------------|
| owner            | アプリの所有者名. Endpoint APIパスの一部で使用される. |
| token            | API Key.                                        |
| sourceFile       | アップロードするアプリバイナリ.                      |
| message          | Push時に付与するメッセージ(optional)                |
| visibility       | 新たにアップするアプリのプライバシー設定(optional)     |

deploygateのEndpoint api uriは次のフォーマットに従う. 
`https://deploygate.com/api/users/[owner name]/apps`

`owner name`は自身のdeploygateユーザページから確認できる. 

`token`には発行されているAPI Keyを指定する. API keyはプロフィール設定から確認可能. 

`sourceFile`にはアップロードするapkバイナリのパスを指定する. 

`message`には任意のメッセージを設定できる. このメッセージはテスタにも公開される. 

`visibility`アプリを新たにアップロードする際に指定できる公開設定. publicかprivate(default)を指定可能. この値は新しくアプリをアップロードする場合に参照され, アプリ更新時には無視される. 

`token`を直接build.gradleに記載しないため, 環境変数やlocal.propertiesを読み込む方法をとるのが一般的である. 
下記は`local.properties`に追加したプロパティ`dev.key.deploygate`をtokenとするサンプル. 

```groovy
deploygate {
    // load local.propertis
    Properties properties = new Properties()
    properties.load(project.rootProject.file('local.properties').newDataInputStream())

    userName = "yuki312"
    token = properties.getProperty('dev.key.deploygate')

    apks {
        release {
            sourceFile = file("./build/outputs/apk/app-release.apk")
        }

        debug {
            sourceFile = file("./build/outputs/apk/app-debug.apk")

            //Below is optional
            message = "test message"
            visibility = "public" // default private
        }
    }
}
```

## Reference

 - [gradle-deploygate-plugin - GitHub](https://github.com/DeployGate/gradle-deploygate-plugin)
 - [delegator = deploygate delegator=class com.deploygate.gradle.plugins.DeployGateExtension](https://github.com/DeployGate/gradle-deploygate-plugin/tree/master/src/main/groovy/com/deploygate/gradle/plugins)
ES6 クイズ

```js
var a = 1;
if (a => 2) {
 console.log('bigger');
} else {
 console.log('smaller')
};

// bigger
```

すでに何人か引っかかったので。

もう 1 パターン追加。

```js
var a = 1, b = 2, c = 3, d = 4;
var f = a => b ? c: d;

// f = ?
```
scala + playインストール@Windows@最小構成


# 結論

* とりあえず、Javaとactivator入れればなんとかなる。
* 最初はとてもとても重いのでひたすら待つ。
* scalaとかsbtで違うバージョン使いたい場合はsbtでなんとかする。


# 手順

## Javaインストール

JDKは8のリンクになっています。
[Oracleの公式サイト](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)
Javaはruntimeだけで良い場合は [この辺](https://java.com/ja/download/)

## activatorインストール

[Play Framework公式](https://www.playframework.com/download)
ダウンロード → 展開 → PATHを通す。

## 初回起動

```
$ activator new
```

とりあえずplay-scala辺りでプロジェクト作っておくとよい、よく使うので。
多分ここでいろいろダウンロードするので30分以上かかる。

## eclipseプロジェクト

```bash
$ cd [new-dir]
$ activator                                               # ここでまた数分かかる
[project] $ eclipse with-source=true with-javadoc=true    # さらに数分、ライブラリソース付きでeclipseプロジェクト化
ElasticBeanstalk の eb コマンド ver3 を試す



## インストール

http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb-cli3-getting-set-up.html#eb_cli3-install-with-pip


```
$ sudo pip install awsebcli

$ eb --version
EB CLI 3.2.2 (Python 2.7.6)

```


## アプリケーションの作成

```
$ cd /path/to/project/

$ eb init ＜アプリ名＞ --platform PHP
```

## 環境(Environment)の作成

```
$ eb create ＜環境名＞ \
    --cname     ＜CNAME＞ \
    --platform  PHP \
    --tier      webserver \
    --vpc.securitygroups ＜securitygroup＞ \
    --instance_profile   ＜IAMロール＞ \
    --keyname            ＜SSHキーの名前＞ \
    --instance_type      t2.micro \

```

# ドキュメント

http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb-cli3.html
Groovyのちょっとしたこと「Grails3.0.xを開発する準備 For Eclipse 4.4」

くっそ悩んだのでメモ。

名前とかは正確ではないのでフィーリングでどうぞ。

Grailsの3.0.xを試してみようと思ってEclipse 4.4の環境をそれ用に整えようとしてみた。

基本的に必要なものは、全部STS（Spring Tool Suite）がくれる。
（ SpringSource Update Site for Eclipse 4.4 - http://dist.springsource.com/release/TOOLS/update/e4.4/ ）

ただし、<strong>Grails IDE Support Featureは使わない</strong>。このGrailsサポートは、2.x系までしか対応していない。

インストールするのは、Gradle IDE Support、GroovyコンパイラFearure 2.4、あと必須なもの。

Groovyサポートのみをインストールしている場合（GECLIPSEを使用している場合）はコンパイラのバージョンが現時点（2015/04/15）では、2.3.xまでしかサポートしていないのでこの際に入れなおす必要がある。

これでEclipseの環境はOK。

Grails 3.0.xに対応の新規のアプリケーションを作るには、gvmか何かでGrails 3.0.x（現時点では3.0.1が最新）をインストールし、

```
grails create-app Grails3PracApp
cd Grails3PracApp
./gradlew eclipse
```

として、アプリケーションを初期化する。

ここでEclipseに戻り、<code>File > Import > <strong>Gradle</strong> > Gradle Project</code>で、Root folderに先ほど作成した<code>Grails3PracApp</code>を入れ、プロジェクトを選択する。

これで準備は完了。

普通にGradleプロジェクトとして開発する感じ。

Grailsのコマンドを打ちたければ、terminalか何かでやるといい。

WindowsだとTelnetServerを有効にして、Eclipse ViewのTerminalでもかなり挙動は怪しいけどまぁいけます。
【CakePHP】Hash

一旦投稿。随時加筆予定。

配列の操作に大活躍。
Setも同様の機能を持っているけど、2.2以降Hashが推奨。

以下のfind('all')の結果を対象に配列操作してみたい。

```
$results = array(
  0 => array(
    'Book' => array(
      'id'=>17,
      'title' => 'CODE COMPLETE 第2版',
      'auther' => 'スティーブマコネル',
    )
  ),
  1 => array(
    'Book' => array(
      'id'=>19,
      'title' => '新装版 リファクタリング',
      'auther' => 'Martin Fowler',
    )
  )
);
```

#配列を作る
例えば、本のタイトルだけで配列を作りたいとき。

```php
$book_list = Hash::extract($results, '{n}.Book.title');
var_dump($book_list);

/*
array(2) {
  [0]=>
  string(1) "CODE COMPLETE 第2版"
  [1]=>
  string(1) "新装版 リファクタリング"
}
*/
```

#連想配列を作る
セレクト用のidとtitleの組合せを作る場合。ただこれならfind('list')でも良い。

```php
$book_list = Hash::combine($results, '{n}.Book.id','{n}.Book.title');
var_dump($book_list);

/*
array(2) {
  [17]=>
  string(1) "CODE COMPLETE 第2版"
  [19]=>
  string(1) "新装版 リファクタリング"
}
*/
```



参考
[CakePHPのarray地獄をHashクラスで生きのこる](http://blog.howtelevision.co.jp/entry/2014/07/04/160309)
[【cakePHP】配列を組み替える便利なHashクラス](http://www.mikame.net/pr/archives/834)
[PostgreSQL] DBレプリケーション環境の構築

# 前提

* PostgreSQL 9.2系 Linux版 (この記事では 9.2.10 を使用しています)
* 各ホストでPostgreSQLのインストールが完了してあること
* マスタ側では、データベースが構築済みであること

# マスタの構築

## 1. 設定の変更

レプリケーション用の設定をします

``` lang:postgresql.conf
hot_standby = on
synchronous_commit = remote_write
wal_level = hot_standby
max_wal_senders = 32     # slaveの数+1は最低限必要
wal_keep_segments = 128
replication_timeout = 20s
wal_receiver_status_interval = 5s
hot_standby_feedback = on
max_standby_streaming_delay = -1
max_standby_archive_delay = -1
```

## 2. スタンバイ系ホストの許可

レプリケーション接続を許可するために、pg_hba.confにスタンバイホストを設定します

``` lang:pg_hba.conf
host    replication   repli_user     ${STANBY_HOSTS}       md5
```

## 3. PostgreSQLを起動

変更した設定を保存した後は、PostgreSQLを起動します

```
 # su - postgres -c "pg_ctl -D ${DB_DATA_DIR} start"
```

## 4. レプリケーション用ユーザの作成

データーベースの管理ユーザー(postgres)や、アクセス用のユーザーとは別にレプリケーション専用のユーザーを作成します。

```
 # su - postgres -c "psql -h ${DB_HOST} -p ${DB_PORT} -c \"CREATE USER repli_user REPLICATION PASSWORD 'password'\""
```

※補足

* ここでは repli_user という名前にしていますが、別の名前でも構いません。別の名前にした場合は pg_basebackup の引数や、 pg_hba.conf、recovery.conf の設定は適宜置き換えてください
* レプリケーションのパスワードは password になってます。適宜読み替えてください

# スタンバイの構築

スタンバイ側はDBが動いていない状態から始めます。(PostgreSQLのプロセスは停止した状態)
以前に動かしていたDBファイルが残っている場合は一旦削除してから行ってください

## 1. マスタからデータベースをダンプ

```
# su - postgres  ← 以降の手順はpostgresユーザーで実行
$ mkdir ${DB_DATA_DIR}
$ chmod 700 ${DB_DATA_DIR}
$ pg_basebackup -p ${DB_PORT} -h ${DB_MASTER_HOST} -U repli_user -D ${DB_DATA_DIR} --xlog --checkpoint=fast --progress
```

※パスワードが聞かれますので、レプリケーションのパスワードを入れてください

## 2. recovery.confの作成

recovery.conf ファイルを ${DB_DATA_DIR} に作成

``` lang:recovery.conf
standby_mode = on
primary_conninfo = 'host=${DB_MASTER_HOST} port=${DB_PORT} user=repli_user password=password application_name=${STANDBY_HOSTNAME}'
```

※補足
マスタとスタンバイの違いは、recovery.confがあるか無いかです。recovery.confを削除すればマスタとして動作するようになります。

## 3. PostgreSQLを起動

PostgreSQLを起動します

```
$ pg_ctl -D ${DB_DATA_DIR} start
```

# レプリケーションが正常に動作していることの確認

マスタ側で pg_stat_replication テーブルの内容を確認します

<pre>
$ psql -x -U ${DB_USER} -d ${DB_NAME} -p ${DB_PORT} -c "SELECT * FROM pg_stat_replication"
</pre>

実行例

<pre>
$ psql -x -U postgres -d testdb -p 5434 -c "SELECT * FROM pg_stat_replication"
-[ RECORD 1 ]----+------------------------------
pid              | 13849
usesysid         | 16402
usename          | repli_user
application_name | vm-2
client_addr      | 192.168.1.2
client_hostname  |
client_port      | 39206
backend_start    | 2015-09-08 07:24:42.168487+09
state            | streaming
sent_location    | 0/70000E0
write_location   | 0/70000E0
flush_location   | 0/70000E0
replay_location  | 0/70000E0
sync_priority    | 1
sync_state       | sync
</pre>

* state が streaming になっていればマスタの更新がリアルタイムにスタンバイに反映されています
* 各_location の値が同じになれば、マスタとスタンバイで完全に同期が取れています
RailsでActiveRecordのデータをhashにする方法

.to_hも.to_hashも使えないので調べてみたら
.attributesで取得できるみたい。

例えば、Userという名前のモデル（usersテーブル）

```rb
user = User.first
user.attributes
# => {"id"=>1,
# "name"=>"なまえ",
# "created_at"=>Mon, 15 Dec 2014 08:22:33 JST +09:00,
# "updated_at"=>Wed, 15 Apr 2015 16:02:45 JST +09:00}
```
Railsでfixtureを分割してテストする

1つのモデルに対して1つのfixtureだとテストがとてもしんどいことがあるので、1つのモデルに対して複数のfixtureを用意してテストする方法。結構強引かも・・・

test/fixtureいかにymlたくさん作ってもいいかもしれないけどグルーピングさせたほうがわかりやすいので、test/fixtures以下にサブディレクトリをきって、そこにymlを配置する。例えばこんな感じ。

```
test/fixtures/admin/admin_users.yml
```

users.ymlが他の場所にもあるとエラーになるので、別の名前(admin_users)をつける。
次にtest_helper.rbの以下をコメントアウト。

```ruby:test_helper.rb
fixtures :all
```
これコメントアウトしないと、サブディレクトリも勝手に読みにいって、いろいろエラーになる。

で、テストコードを以下のようにする。

```ruby:user_controller_test.rb
require 'test_helper'
require "active_record/fixtures"

class UserControllerTest < ActionController::TestCase
  def setup
    directory = Rails.root.join("test", "fixtures", "admin")  #①
    ActiveRecord::FixtureSet.create_fixtures(directory, "adnim_users", :admin_users => User) #②
  end
end
```
①新規にきったサブディレクトリへのパス
②指定したサブディレクトリからymlを読み込んでUserモデルを作成する

もっといいやり方あるんだろうな・・・
UIPickerViewに初期値を設定する

UIPickerViewに初期値を設定しようと思ったが、ググって出てくる方法だと設定出来なくなっているので、自分のために記録しておく。

ググってよく出てくるのが、

```objc
    [pickview setDate: [NSDate alloc] initWithString:"…………"];
```
というものだが、なぜか**NSDate**には**initWithString**は無いと言われる。
なので下記のような方法で設定した。

```objc
    NSString *alarmtime = @"1200";
    NSDateFormatter *df = [[NSDateFormatter alloc] init];
    [df setDateFormat:@"HHmm"];
    NSDate *alarmdate = [df dateFromString:alarmtime];
    [pickview setDate:alarmdate];
```
この方法で正しく初期値を設定出来た。