OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntuに最新のnginxをインストールする

ubunutの初期リポジトリからapt-getでnginxをインストールすると、残念ながらだいぶ遅れたnginxがインストールされます。

> 2016/3/12 本稿の手順をansibleで書いた場合の参考例を追加しました。

# マニュアルインストール編
最新版をインストールするには、以下の3つがあります。

1. ソースからコンパイル
2. PPAからインストール
3. 公式nginxをリポジトリに追加

1はconfigureとか色々とやることが多いので2か3を使いたいところです。
また、PPAは正直何が混入されているかわからないので、最終的には3の公式の最新版を使いたい訳です。

ということで、今回は、3の方法でインストールする方法です。

```bash
# (1) nginxサイトが配布するPGPキーを追加
curl http://nginx.org/keys/nginx_signing.key | sudo apt-key add -

# (2) リポジトリを一覧に追加
VCNAME=`cat /etc/lsb-release | grep DISTRIB_CODENAME | cut -d= -f2` && sudo -E sh -c "echo \"deb http://nginx.org/packages/ubuntu/ $VCNAME nginx\" >> /etc/apt/sources.list"
VCNAME=`cat /etc/lsb-release | grep DISTRIB_CODENAME | cut -d= -f2` && sudo -E sh -c "echo \"deb-src http://nginx.org/packages/ubuntu/ $VCNAME nginx\" >> /etc/apt/sources.list"

# (3) アップデート後、nginxをインストール
sudo apt-get update
sudo apt-get install nginx
```

> **NOTE** 
~~(2)のリポジトリを追加するコマンド内にある"trusty"はお使いのOSに応じ、下表を参考に任意のOSコード名を設定してください。~~
上記コマンドでOSコード名を自動取得するように修正しました。OSのバージョンを気にせず、コピペでご利用いただけます。
 
|OSバージョン|コード名  |
|:--------:|:-------:|
|10.04     | lucid   |
|12.04     | precise |
|14.04     | trusty  |
|14.10     | Utopic  |
|15.04     | vivid   |
|15.10     | wily    |
|16.04     | xenial  |
|16.10     | Yakkety |
|17.04     | Zesty   | 

# Ansible編
ansibleを使うとOSの情報が取得できるので以下のようなYMLファイルでインストールできます。ANYHOSTのところはよしなに書き換えてください。
ansible便利ですね。

```
- hosts: ANYHOST
  become: yes
  vars:
    nginx_pgp_url: http://nginx.org/keys/nginx_signing.key
    nginx_repository_url: http://nginx.org/packages/ubuntu/
  tasks:
    - name : Add official nginx PGP key
      apt_key: url={{nginx_pgp_url}} state=present
    - name : Add official nginx repository
      lineinfile : >
        dest=/etc/apt/sources.list
        line='{{item}} {{nginx_repository_url}} {{ansible_distribution_release}} nginx'
      with_items:
        - deb
        - deb-src
    - name : Run apt-get update
      apt: update_cache=yes
    - name : Install nginx
      apt : name=nginx state=present

```
MySQLのデータベースを初期化する

# MySQL を初期化する方法

MySQLが起動しなくて、にっちもさっちにいかなかった場合の初期化方法をメモします
ちなみに、これやるとデータベースからデータから、アカウントからすべて消えてしまいますので注意！！！

## 操作手順

## プロセスが起動しているか確認

```bash

# ps -efw | grep -i mysql
root     12787     1  0 06:20 pts/0    00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --pid-file=/var/lib/mysql/server01.s-quad.com.pid
mysql    13041 12787  0 06:20 pts/0    00:00:14 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/lib/mysql/server01.s-quad.com.err --pid-file=/var/lib/mysql/gate02.s-quad.com.pid --socket=/var/lib/mysql/mysql.sock --port=3306
root     13203  8766  0 07:53 pts/0    00:00:00 grep -i mysql
```

## サービスの停止

### 通常のサービス停止手順

```bash

# /etc/init.d/mysql stop
Shutting down MySQL... SUCCESS! 
```

### サービスの停止ができなかったら、全部KILL!!

```
# killall mysqld
```

## 既存のデータフォルダを気休めバックアップ（気休め）

```
# cd /var/lib
# cp -arf mysql/ mysql_backup/

```

## mysql/ の中身を全部消す！！

```bash

# cd /var/lib/mysql; 
# rm -rf *
```

## MySQLの初期化を行う

めらめらとコンソールからなにやらメッセージが出てきます

```
# su - mysql 
$ mysql_install_db --datadir=/var/lib/mysql
```

## MySQLの起動

初期化が終わりましたらMySQLを起動します

```bash

$ exit
# /etc/init.d/mysql start
Starting MySQL. SUCCESS!
# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 10.0.12-MariaDB-log MariaDB Server

Copyright (c) 2000, 2014, Oracle, SkySQL Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

```
CentOS7 のインストール環境をローカルに閉じる

# 概要
毎回 net-install をするのも面倒ですし、ここらへんで内包化しておきたいなぁと思ったのでやりました。
本当は早いところ image 化したいけども諸事情により断念。コツコツ行くとします。

# 前提
* httpd で公開できること
* インストールのソースになる場所を boot サーバと呼ぶことにします
* 今回は pxe boot サーバに相乗りさせる形で作ってたりします

# 実施内容
## 内部の boot サーバ上での作業

* ISO イメージを wget します 

``` 
$ sudo wget ftp://ftp.jaist.ac.jp/pub/Linux/CentOS/7/isos/x86_64/CentOS-7.0-1406-x86_64-DVD.iso
```

* ISO をマウントします
	* ディレクトリは環境に合わせて変更してください

```bash:/etc/fstab
/usr/iso/CentOS-7.0-1406-x86_64-DVD.iso /mnt/centos7 iso9660 rw,ro,loop 0 0
```

```
# mount -a
```
* ディレクトリとして見えていることを確認します。

```
$ pwd
/mnt/centos7
$ ls
CentOS_BuildTag  EULA  LiveOS    RPM-GPG-KEY-CentOS-7          TRANS.TBL  isolinux
EFI              GPL   Packages  RPM-GPG-KEY-CentOS-Testing-7  images     repodata
```

## 適当な KVM ホストで virt-install を実行します
* 下記の内容は環境に合わせて変更してください。
* ks ファイルがなければ、手動インストールになると思います。

```
virt-install \
    --connect=qemu:///system \
    --name=hogehoge \
    --hvm \
    --accelerate \
    --disk path=/var/lib/libvirt/images/hogehgoe.img,size=40,device=disk,bus=virtio,format=raw \
    --vcpus=1 \
    --ram=2048 \
    --location http://hogehoge.com/centos7 \
    --network bridge=br0,model=virtio \
    --keymap=ja \
    --os-type=linux \
    --os-variant rhel7 \
    --extra-args='ks=http://hogehoge.com/anakonda-ks.txt console=tty0 console=ttyS0,115200n8'
fi
```
* 手元の環境では無事インストール完了まで自動で流れました。



# 所感
* 簡単に実現できて良かったです。
* なんだかんだ使用するマシンはある時期の ISO をベースとするので大事ですね。
* 最後に、とてつもなく適当な手順ですいません。ただの備忘録です。
* もう少し kickstart 側をいじって yum.repos.d のケアくらいはしておかないとですね。
iOS8の磨りガラス（曇りガラス）機能の挙動について調べてみた


## はじめに

iOS7の頃に[iOS7の曇りガラス効果について知っている事まとめ](http://qiita.com/takabosoft/items/22be7eae07d5a3c3663f)などという記事を書いた手前、iOS8で公式に実装された磨りガラス機能（`UIVisualEffectView`）についても何か書くべきだろうと思いまして、いろいろと挙動を調べてみる事にしました。

なお、`UIVisualEffectView`の基本的な使い方に関しては、他の記事などを参考にしてください。

* [4行でBlurView（刷りガラス風）Xcode6&iOS8（SnowHideJPさん）](http://qiita.com/SnowHideJP/items/a83de345d5c2c41ca4d3)
* [[iOS 8] UIVisualEffectViewを使ってすりガラス効果を実現する（クラスメソッドさん）](http://dev.classmethod.jp/references/ios8-uivisualeffectview-ref/)

## 通常の表示

ブラースタイルが３種類定義されていまして、この３種類の中から選ぶようなのですが、それぞれの結果が以下の通りです。

![def.png](https://qiita-image-store.s3.amazonaws.com/0/31347/9452ad71-75d7-c4cb-27a6-ed4469623014.png "def.png")

（各ブラーの背景が違うので比較しづらくてすみません、理由は後述。）

ただ、この３種がなぜ選出されたかはよくわかりません。
私の憶測は以下の通り。

* ExtraLight: `UIToolBar`など標準UIの背景に近い気がする
* Light: ホーム画面のフォルダ開いたときの背景部分に近い気がする
* Dark: 通知センターの背景に近い気がする

試作では背景の写真をスクロール＆ズームできるようにしてあるのですが、iPhone4Sでも結構サクサク動作しているように見えます。
ただ、特にLightで顕著なのですが、スクロール中、ブラービューの内側の境界付近がちらつく感じがするのが気になりました（やや不格好な印象を受けました）。

## 設定の影響は受けるの？

受けます。

設定＞一般＞アクセシビリティ＞コントラストを上げる＞透明度を下げる
（iOS 8.0.2 現在）

![setting.png](https://qiita-image-store.s3.amazonaws.com/0/31347/b216d75d-1bf0-4749-5280-700073c601c9.png "setting.png")

...をオンにした所、以下のような結果になりました。

![contrast.png](https://qiita-image-store.s3.amazonaws.com/0/31347/3ec4a45d-3a72-5c23-71c8-bd2561de5ee6.png "contrast.png")

この辺りは標準UIと同じような仕組みですね。

ただし、標準UIとは違い、設定を変えたからと言って（タスクを切り替えて）即座に反映されるわけではないようです。
おそらく`UIVisualEffectView`を生成した時点での設定が適用されるのではないかと思います。

## 角丸にはできるの？

クリップしてやればできました。

```objc:
    UIBlurEffect *effect = [UIBlurEffect effectWithStyle:style];
    UIVisualEffectView *v = [[UIVisualEffectView alloc] initWithEffect:effect];
    v.layer.cornerRadius = 15; // これ
    v.clipsToBounds = YES; // これ
```

実行結果：
![corner.png](https://qiita-image-store.s3.amazonaws.com/0/31347/38a26281-4f36-ea05-9983-1c07ba3276bc.png "corner.png")

動作速度も特に気になりません。

## 不透明度は変えられるの？

変えられますが、ブラーは掛かりません。

alpha値を0.5にした結果：
![alpha.png](https://qiita-image-store.s3.amazonaws.com/0/31347/57ac9c51-e50e-02b1-cf61-dc2897866262.png "alpha.png")

ログにも何か出ます。

```text:
<UIVisualEffectView 0x15d3a2b0> is being asked to animate its opacity. This will cause the effect to appear broken until opacity returns to 1.
```

ちなみに、CALayer.maskを使って不透明度を変えてみても結果は一緒でした。

また、フェードイン/フェードアウトしてみたのですが、ブラー効果が一時的に無効になったとしても、ぱっと見気がつきませんでした。

## tintColorは効くの？

効きませんでした。

例によって`contentView`上に薄いダミービューを置くしかなさそうです。

```objc:
    UIView *dummy = [[UIView alloc] initWithFrame:v.bounds];
    dummy.backgroundColor = [UIColor colorWithRed:1 green:0.5 blue:0 alpha:0.3];
    [v.contentView addSubview:dummy];
```

実行結果：
![tint.png](https://qiita-image-store.s3.amazonaws.com/0/31347/f4ced931-3398-b84a-7b27-1155b7bc89a6.png "tint.png")

Lightとの組み合わせが相性良さそうですね。

## ぼかし具合は調整できるの？

現時点では出来なさそう。

## ブラー非対応機種ではどう表示されるの？

ブラーに対応していない機種（iPad第三世代）などで実行した所、ちょっと薄い感じの表示になりました。

![ipad3.png](https://qiita-image-store.s3.amazonaws.com/0/31347/1efbddae-ea75-06ce-5769-da849dfc2b79.png "ipad3.png")

## 終わりに

非常に実装しやすく、あまり癖もないようですので、iOS8からは気軽に使っていこうかなと思います。
また、ブラー以外にも増えていくといいですね。
go-mruby で学ぶ cgo と mruby (1)

突然始まった謎のシリーズ。概要をつかむのが主なので不正確だったり読み飛ばしがあります。CとGoとmrubyに関して素人なので、ツッコミはありがたいです。

### `gomruby.h`

- https://github.com/mitchellh/go-mruby/blob/master/gomruby.h

まずは唯一のCヘッダファイルから眺める。 `static inline` で沢山関数も定義されている...。

#### L24 ~

Go で定義された関数と mruby/C の世界をブリッジするところ。

```c
extern mrb_value *go_mrb_func_call(mrb_state*, mrb_value*, mrb_value*);
```

`extern` キーワードを用いると、普通にGoのコード内でCから呼べる関数の中身が書けるっぽい。便利。

```c
static inline mrb_value _go_mrb_func_call(mrb_state *s, mrb_value self)
```

例外を格納する `mrb_value exc` を宣言しつつ上記のgo_mrb_func_callをそのまま呼んでいる。

```c
static inline mrb_func_t _go_mrb_func_t() {
    return &_go_mrb_func_call;
}
```

コメントにある通り、cgoは`mrb_value`の共用体である`mrb_func_t`をうまく扱えないのでこういうやり方をしているらしい。

`go_mrb_func_call` は Go の世界で定義される。 https://github.com/mitchellh/go-mruby/blob/master/func.go#L33 の通り、mrubyで呼ばれる処理本体をGoで定義して、その定義されやつらを格納したテーブルからlookupして呼び出すみたいなことをしている。

あとで見ると思うけど `_go_mrb_func_t()` はGo側でメソッドを定義したら、必ずここを通ることになる。

#### L54 ~

mruby 側で渡されたメソッド引数をGoの世界に転送するところ。

```c
extern void go_get_arg_append(mrb_value*);
```

引数である `mrb_value` を Go の世界にパイプするための入り口。

```c
static inline int _go_mrb_get_args_all(mrb_state *s) {
    mrb_value *argv;
    mrb_value block;
    int argc, i, count;

    count = mrb_get_args(s, "*&", &argv, &argc, &block);
    for (i = 0; i < argc; i++) {
        go_get_arg_append(&argv[i]);
    }

    if (!mrb_nil_p(block)) {
        go_get_arg_append(&block);
    }

    return count;
}
```

書いてある通り。 `mrb_get_args` を用いてそのステートの引数とブロックを取得し、 
`go_get_arg_append` に送り込むなどしている。

この辺の処理、むやみにややこしくなっている気がせんでもないんだけど、引数の受け渡しの制御をGoでやった方が並行処理されたときに安全になるみたいな話があるのかな？

#### L81 ~

こっから先は単純にCでやった方が早いものをCで実装しているだけのようだ。

```c
static inline const char *_go_mrb_calc_send(const char *s)
```

はポインタ演算をして、

```c
static inline void
_go_mrb_parser_set_capture_errors(struct mrb_parser_state *p, mrb_bool v)
```

はGoでbit fieladを扱えないのでラップしている、と言う感じっぽい。


#### L97 ~

あとは、マクロは cgo 経由で呼び出せないので関数と置き換えているところかな？

```c
static inline mrb_aspec _go_MRB_ARGS_ANY() {
    return MRB_ARGS_ANY();
}

static inline mrb_aspec _go_MRB_ARGS_ARG(int r, int o) {
    return MRB_ARGS_ARG(r, o);
}
// ...
```


----

そして、続くかは不明なのであった...
RubyでJSONな配列を比較して差分を取得したい

スマートフォン向けのアプリケーションで例えば

- Web APIから取得したJSON
- あらかじめローカルにあるJSON

という2つを比較して、差分となるJSONだけを取得する方法を過去何度か調べて実装してました。

その時はTitaniumでアプリ開発してて、JavaScriptでの実装を考えていたのですが、今回、Rubyでの実装についてちょっと考える必要があって、近い将来また同じことに悩みそうなのでQiitaにまとめておくことにします。

## 今回のサンプルのデータ構造

ベースとなるJSONが以下のようなものだとします

```rb
master_junre= [
  {id:1,name:"japanese"},
  {id:2,name:"sushi"},
  {id:3,name:"kaisen"},
  {id:4,name:"soba"},
  {id:5,name:"udon"}
]
```

ベースとなるJSONから除外したいJSONが以下のようなものだとします。

```rb
exclude_junre= [
  {id:3,name:"kaisen"}
]
```

## 比較するための前処理

マスターデータの中から除外したいデータを抜き出す前処理としてIDをキーにした配列をそれぞれ生成した上で配列の差集合を実施します。

配列の差集合は[RubyやJavaScriptでの配列の差集合・和集合・積集合](http://qiita.com/taizo/items/bab2db414e83d11b18f8)が参考になりました 

```rb
master_junre_ids = master_junre.map{|o|o[:id]}
exclude_junre_ids = exclude_junre.map{|o|o[:id]}
diff_result = master_junre_ids - exclude_junre_ids
```

この段階で変数diff_resultに格納されてる値を確認するとこのようになってます。

```shell-session
irb(main):059:0> diff_result
=> [1, 2, 4, 5]
```

## 仕上げの処理

配列diff_resultに含まれるIDだけピックアップしていきます。

```rb
r = []
master_junre.each do |o|
  r.push(o) if diff_result.include?(o[:id])
end
```

上記処理で、比較した結果が配列rに格納されてるので、試しに、確認すると以下のように意図した値が格納されてます

```shell-session
irb(main):088:0> r
=> [{:id=>1, :name=>"japanese"}, {:id=>2, :name=>"sushi"}, {:id=>4, :name=>"soba"}, {:id=>5, :name=>"udon"}]
```

## ソースコード全体

念のため以下貼っておきます

```rb

master_junre= [
  {id:1,name:"japanese"},
  {id:2,name:"sushi"},
  {id:3,name:"kaisen"},
  {id:4,name:"soba"},
  {id:5,name:"udon"}
]

exclude_junre= [
  {id:3,name:"kaisen"}
]

master_junre_ids = master_junre.map{|o|o[:id]}
exclude_junre_ids = exclude_junre.map{|o|o[:id]}
diff_result = master_junre_ids - exclude_junre_ids

r = []
master_junre.each do |o|
  r.push(o) if diff_result.include?(o[:id])
end
```
FuelPHPでバリデーション


ちょっと前までjQueryで書いていたバリデーション処理をPHPに移行しました。
フィールド名で処理できるのはよいです。私はこっちのほうが気に入りです。

## 基本

```php
// バリデーションクラスをインスタンス化
$val = Validation::instance();

// emailカラムにバリデートを設定
$val->add('email', 'メールアドレス')
    ->add_rule('required')
    ->add_rule('valid_email');

// 何も引数を指定しなかった場合、デフォルトで$_POSTが引き渡される
if($val->run()){
	// バリデーション成功の場合ここに入ってくる
}else{
	// バリデーション失敗の場合ここに入ってくる
	foreach($val->error as $key=>$value){
		// $key:'email'
		// $value:エラー
		// $value->get_message():エラーメッセージ
	}
}

```

ちなみにデフォルトのvalid_emailの中身は```filter_var($val, FILTER_VALIDATE_EMAIL)```とかで実はあんまりうまくないので、以下の独自バリデーションで上書きしちゃうことをおすすめします。
さっきまでドはまりしていたので自戒も兼ねて。

## 独自バリデーション

ただのクラスなのでどこにでも置けます。個人的にはapp/class/validate/の下に置くのが好き。

``` extension.php

class Validate_Extension {
	// メソッド名に注意
	// _validation_hoge

	public static function _validation_hoge($val){
        Validation::active()->set_message('hoge', 'ほげチェックエラー');
		// 正規表現やデータベースアクセスなどによる操作が可能
       // trueが正常系(書式との一致)。
		return $bool;
	}
	
}

```

### 独自バリデーションの読み込み

```php
// バリデーションクラスをインスタンス化
$val = Validation::instance();
// 拡張バリデーションクラスを呼び出し
$val->add_callable('Validate_Extension');

// ルールとして利用可能に
$val->add('email', 'メールアドレス')
    ->add_rule('required')
    ->add_rule('valid_email')
    ->add_rule('hoge');

// 何も引数を指定しなかった場合、デフォルトで$_POSTが引き渡される
if($val->run()){
	// バリデーション成功の場合ここに入ってくる
}else{
	// バリデーション失敗の場合ここに入ってくる
	foreach($val->error as $key=>$value){
		// $key:'email'
		// $value:エラー
		// $value->get_message():エラーメッセージ
	}
}

```

ところでバリデーション処理ってどこに書くのが正しいのでしょう。
ControllerなのかPresenterなのかModelなのか…。
Mac で簡単にショートカットのチートシートを呼び出すアプリ


mac で簡単にショートカットのチートシートを呼び出すアプリを知ったので、早速導入してみました。

その名も CheatSheet -> [http://www.cheatsheetapp.com/CheatSheet/](http://www.cheatsheetapp.com/CheatSheet/)

こちらの記事で知りました。→　[Macのショートカットをすぐに確認できる神アプリ「CheatSheet」](http://qiita.com/MMMMMonchi/items/dd72e32fc8e69bcdf411)





## brew cask でインストールできます。

```bash
$ brew cask search cheatsheet
==> Exact match
cheatsheet

$ brew cask info cheatsheet
cheatsheet: latest
http://www.cheatsheetapp.com/CheatSheet/
Not installed
https://github.com/caskroom/homebrew-cask/blob/master/Casks/cheatsheet.rb
==> Contents
  CheatSheet.app (link)

$ brew cask install cheatsheet
```

起動して⌘（コマンドキー）を長押し（３秒）すると、現在使っているアプリのショートカットチートシートが表示されます。

例：Kobito編集中にコマンドキーを長押しした場合のチートシート
![kobito_cheatsheet01.jpg](https://qiita-image-store.s3.amazonaws.com/0/46049/698267b5-f168-6a45-c668-961f2d5feefd.jpeg "kobito_cheatsheet01.jpg")

スクリーンショットが取れなかった(消えちゃう)ので、iPhoneで写した写真です。
不鮮明ですが、コマンドキー長押しで、上図のチートシートが表示されます。
ちゃんと、Kobitoのショートカットキーが表示されています。

これがあれば、ショートカットキーを覚えるのも早くなりますね。
JBehaveのstoryで特定文字入りパラメータがある場合の備忘録

JBehaveでstoryからパラメータを渡す際にちょっと困ったのでメモ。


例：

```story:login.story
Scenario:0001 ログインする
When ユーザID xxx@domain.com パスワード hogehoge でログインする
Then TOP画面へ遷移する
```

みないたシナリオを実施したところ、
ユーザIDパラメータが
xxx
で切れてしまった。
恐らく$とかもダメなんじゃないかな。


ちなみに

```
When ユーザID xxx\@domain.com パスワード hogehoge でログインする
When ユーザID <xxx@domain.com> パスワード <hogehoge> でログインする
When ユーザID [xxx@domain.com] パスワード [hogehoge] でログインする
```

でエスケープを試みるもことごとく失敗。
んー困った。


で、いろいろ調べてたんだけど、
そういやExamplesでパラメータ渡しできたっけと思い
試してみたところ無事解決。

```story:login.story
Scenario:0001 ログインする
When ログインID <id> パスワード <pass> でログイン実行
Then TOP画面へ遷移する 

Examples:
|id|pass|
|xxx@domain.com|hogehoge|
```

Examplesに合わせてStepsの呼び出しも公式サイトの通り合わせる

```java:LoginSteps.java
@When("ログインID $id パスワード $pass でログインする")
public void login(@Named("id") String id, @Named("pass") String pass){
…
```


参考
http://jbehave.org/reference/stable/parametrised-scenarios.html



■追伸
Examples:はGivenStoriesで実行するとなぜかこける！
これまた困った。。。

⇒長くなりそうなので別トピックにします。
猫でもわかるemacsのインストール方法(KU情報学科用)

# 猫でもわかるemacsのインストール方法

emacsのインストール方法とか学科の人達に需要がありそうなので書いておきます。

## Linuxの場合
`pacman -S emacs`とか`emerge emacs`とかでできるでしょ？たぶん。

## Windowsの場合
Windowsにはまともなパッケージ管理システムが付属していないので、手動でダウンロードなりインストールなりいろいろしなければなりません。面倒ですね。以下の文章を読んで「面倒臭そうだな……」とか思ったら即座にLinuxに改宗しましょう。どうしてもWindowsを使いたい場合は、以下の指示に従ってください。

### Emacs 24のダウンロード
GNUのサイトから配付されているemacsはIMEと相性が悪いっぽいので、そのへんをいい感じにしてくれるパッチを当てたバージョンを以下のURLからダウンロードします。

[GNUPACK](http://sourceforge.jp/projects/gnupack/)

### 展開、インストール
リンク先のサイトから「ダウンロードファイル一覧」のリンクに飛び、emacs-24.*-********.exeみたいなのが並んでるので一番上のやつをダウンロードして開きます。

解凍先みたいなのが聞かれると思うので必要であれば適当に設定して「解凍」をクリックし、しばらく待ちます。解凍先の場所は後で必要になるので覚えておきましょう。

また、解凍にはけっこう時間がかかると思うので、待ち時間は[このURL](http://www.dmm.com/netgame/feature/kancolle.html)にあるゲームでもして時間を潰しましょう。ちなみに、最初の秘書艦娘は電ちゃんを選ぶのがおすすめです。電ちゃんが大人のお姉さんを目指して毎日牛乳を飲んでいるという裏設定はこの時にしか見ることができません。しっかり覚えておきましょう。

解凍が終わったら先程「解凍先」に指定したフォルダに移ります。解凍先に、「emacs-24.2-252521」みたいな名前のフォルダができてると思うので、それを「emacs24」とかにリネームしてCドライブ直下(C:\)にコピーします。

![20141007-emacs-01.png](https://qiita-image-store.s3.amazonaws.com/0/55949/00c094c0-b7a8-a6d1-79d7-67c9c01827dc.png)
![20141007-emacs-02.png](https://qiita-image-store.s3.amazonaws.com/0/55949/4cba6511-a098-42db-9068-bf1723b96551.png)
![20141007-emacs-03.png](https://qiita-image-store.s3.amazonaws.com/0/55949/3eb681fe-2922-dedd-4f1e-d9fae1e8ed8f.png)


### PATHの設定
もしかしたらPATH通さなくても動くかもしれないけど、念のため。

まずは環境変数の設定画面を出すのですが、これがwindowsのバージョン毎に違うので面倒臭い。Linuxなら全部`export PATH="${PATH}:/path/to/emacs/bin"`で済むのに…

Win8.1なら、「コントロールパネル → システムとセキュリティ → システム → システムの詳細設定」で新しくウィンドウが出てくるので、そのウィンドウの「詳細設定」タブの「環境変数」をクリックすると次のようなウィンドウが出現します。

![20141007-emacs-04.png](https://qiita-image-store.s3.amazonaws.com/0/55949/d24ca6f1-2431-0704-d35d-b66816d4ff72.png)


この「PATH」の部分をダブルクリックすると次のようなウィンドウが出現するので、「変数値」の欄の末尾に「C:\emacs24\bin」と追記します。

![20141007-emacs-05.png](https://qiita-image-store.s3.amazonaws.com/0/55949/8c9653f9-2b45-a862-4833-62cef3fe828f.png)


### 起動
さっきCドライブ直下に保存した「emacs24」フォルダの中の「bin」を開くと、「runemacs.exe」というファイルがあるはずなので、これを開きます。デスクトップにこのファイルのショートカットを作るなりなんなりすると便利かと思います。


設定編は明日あたりにでも。
eclipseでAndroid開発時の .gitignore

http://slumbers99.blogspot.jp/2012/01/eclipse-android-gitignore.html

そのまま使う。毎回調べるよりこっちに残しておいたほうが楽そうなので…

```
# built application files
*.apk
*.ap_
 
# files for the dex VM
*.dex
 
# Java class files
*.class
 
# generated files
bin/
gen/
 
# Local configuration file (sdk path, etc)
local.properties
 
# eclipse settings
.classpath
.project
.settings/
```
Backbone.View的なイベントハンドリングをjQueryのみの開発でも使えるようにした

## きっかけ
Backbone.jsを使うといいところの１つにBackbone.Viewのeventsオブジェクトを使ったイベントハンドリングの手軽さと可読性があると思う。

```
class ItemView extends Backbone.View
  events:
    'click .btn': 'yo'

  initialize: ->
    @setElement(document.querySelectorAll('.yoBox'))

  yo: (e) ->
    e.preventDefault()
    alert 'Yo'
```

上記のようにeventsオブジェクトに ```"[イベント名] [セレクタ]": "[ハンドラ名]"```
というペアを定義しておくと、```setElement``` した時とかに勝手に ```@$el``` に対してイベント登録しておいてくれるやつですね。

これをBackbone.js使うほど大きなjs書かないけどキレイに書きたい！って思った

## jQuery.eventMapping
思ったので、jQueryプラグインを書いた

jQuery.eventMapping - Backbone.js like event mappings
https://gist.github.com/kozo002/3bde4463c54ebe92b1bc


## 使いかた
```events``` と ```$el``` がプロパティに存在していればいいので
素のオブジェクトで使ったりする

```
window.Sample.Modules.YoBox =
  events:
    'click .btn': 'yo'

  initialize: ->
    @$el = $ '.yo-box'
    $.eventMapping(@)

  yo: (e) ->
    e.preventDefault()
    alert 'Yo'
```

## おまけ
イベントを発する要素を直接触りたいときに何度もセレクタを書くのがかったるいので、events内にセレクタと一緒に取得しておけるようにした

"|"で区切ってセレクタの直後に変数名を書いておくだけ

```
window.Sample.Modules.YoBox =
  events:
    'click .btn|yoBtn': 'yo'
```

これで ```@yoBtn.addClass('clicked')```みたいな感じですぐに使える
PowerShellでHipChatにPost


## 他の言語は追加せずに動かしたい、じゃあPowerShell

HipChatはAPIが判りやすいので、いろんなところからシステムの情報をPOSTしたりしたいのですが、Windowsの場合は、システムの制約上rubyやpythonといったスクリプト言語を追加しにくいことがあります。

今回は、PowerShellを使ってPOSTしてみることにしました。

HipChatの[API Documentサイト](https://www.hipchat.com/docs/api/libraries)にもPowerShellのモジュールが掲載されています。

- https://github.com/lholman/hipchat-ps

ただし、こちら、API v1を利用しているので、今回はv2のAPIを試してみました。

## ソースコード
HipChatはAtlassian社のプロダクトなので、折角なのでBitbucketに上げることにしました。

- https://bitbucket.org/akiko_pusu/hipchatps

## 実行時の注意点
- PowerShellスクリプトの実行を許可しておくこと。
- PowerShell v3が使えるようにしておくこと。
 - 一部コマンドレットが、v2では組み込まれていないものがあるため。
 - ConvertTo-Jsonというコマンド。
 - [Windows Management Framework 3.0](http://www.microsoft.com/en-us/download/details.aspx?id=34595) から、環境にあったフレームワークをインストールすること。
 - フレームワーク追加の場合は、OS再起動が要るので注意。

## 利用方法

notify-hipchat.ps1は、モジュール化はしていないので、そのまま引き数を指定して実行するだけになります。環境によっては、プロキシの設定も必要になりますので、-proxy オプションで切り替えてみて下さい。

```
PS C:\Users\xxx> .\notify-hipchat.ps1 -color 'green' -messageText "(successful) Sample text." 
 -roomid xxx -apitoken YOUR_API_TOKEN
```

もう１つの方は、functionを作成、モジュール化してみました。
README.mdを参考にして、インポートの上で、同じ引数で実行できます。

```
C:\PS>Import-Module Import-Module .\Notify-HopChat.psm1
C:\PS>Notify-HipChat -apitoken YOUR_API_TOKEN -roomid NNN -messageText "(successful) Sample text."
```


- オンプレ版のHipChatでも利用可能です。
- room messageの読み取りは未だなので、そのうち用意したいです。


## PowerShell おまけ

- PowerShell version確認
 - $PSVersionTableで確認可能。

```
PS C:\Users\xxx> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      3.0
WSManStackVersion              3.0
SerializationVersion           1.1.0.1
CLRVersion                     4.0.30319.18444
BuildVersion                   6.2.9200.16398
PSCompatibleVersions           {1.0, 2.0, 3.0}
PSRemotingProtocolVersion      2.2
```

- PowerShellのバージョン切り替え
 - powershell.exe -v 2 (Version2.0へ切り替え）

- モジュールを作成する時
 - xxx.ps1 ではなく、xxx.psm1 というファイル名にする。

- モジュールにヘルプやusage (sample)を追加する
 - <#... #> でコメントしたブロックを用意。
 - .PARAMETER パラメータ名 で、その引数の説明を付加出来る。
 - .EXAMPLE で、利用例を載せることができる。

```
Get-Help モジュール名 -examples # .EXAMPLE の部分を出力
Get-Help モジュール名 -detailed # 詳細を出力
```

## 20141010追記

### JSONでAPIを呼ぶならInvokeRestMethod

メッセージをPOSTするのにWebRequetを使っていますが、PowerShell3.0以降が前提ならInvokeRestMethodを使うほうがスッキリして判りやすいです。
サンプルのソースで、Room messageをGETする関数を追加して、こちらはInvokeRestMethodで記載しています。

のちほどPOSTするほうもInvokeRestMethodに修正予定。
Hashのkeyやvalueが数値の時はintegerに変換するメソッド

JSON.parseとかしてきたときに、全部Stringになってしまって困ったので。

    def convert h
      new_hash = Hash.new

      h.each do |k, v|
        if v.class == Hash
          v = convert v
        end

        if k.class == String and k.match(/^[0-9]*$/)
          k = k.to_i
        end

        if v.class == String and v.match(/^[0-9]*$/)
          v = v.to_i
        end

        new_hash[k] = v
      end

      new_hash
    end

new_hash返すところで、new_hash.symbolize_keyとかすると数値以外のkeyがsymbolになって良い感じ
display: none; のDOMに対してtransitionを使う際の注意



例えば、初期状態で

```css
display: none;
opacity: 0;
```

としてあるDOMを、あるイベントによって

```css
display: block;
```

にすると同時にopacityを1へとアニメーションしたい場合。
それをcssのtransitionを使って実現しようとすると、

css:

```css
.hoge{
	display: none;
	opacity: 0;
	transition: opacity 1s linear 0s;
}

.hoge.show{
	display: block;
	opacity: 1;
}
```

と直感的に書いてしまいがちであるが、これではうまく動かない。
なぜならshowがクラス名として付与された時点で初めて

```css
display: block;
```

となり、このタイミングでDOMが生成されているため。
従って、`display: none;` 状態のときの

```css
opacity: 0;
```

というプロパティはtransitionのスタート値とはならず、 0 -> 1 へのアニメーションは走らない。

上記の仕様を実現するには、cssのanimationを使うと良い。

```css
@keyframes show{
	from{
		opacity: 0;
	}
	to{
    	opacity: 1;
	}
}

.hoge{
	display: none;
}

.hoge.show{
	display: block;
	animation: show 1s linear 0s;
}
```

※ベンダープレフィックスは割愛
RACCommandによるタップイベントの処理中にボタンの連打を防止する

ReactiveCocoaを使っている場合、ボタンのタップ処理などはRACCommandを使って処理することが多いかと思いますが、その際ボタンの連打を防止するにはどうするればよいか考えてみました。

```objc
button.rac_command = [[RACCommand alloc] initWithEnabled:button.rac_command.executing.not signalBlock:^RACSignal *(id input) {
    return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        // なが〜い処理

        // 成功時はコッチ
        [subscriber sendNext:nil];
        [subscriber sendCompleted];

        // エラー時はコッチ
        [subscriber sendError:nil];
    }];
}];
```

<del>連打を防止する上で重要なのは1行目のコードです。
これでシグナル(なが〜い処理の部分)の実行状態に応じたシグナルを取得することができます。

<del>なお実行中は「YES」が、実行されていない時は「NO」が返ります。
これをinitWithEnabledに渡してしまうと、処理が停止しているときにボタンが非活性になってしまうので、notプロパティを使い、逆のシグナルを返すようにします。

```objc
button.rac_command.executing.not
```

ちなみに、シグナルの処理結果を得る場合は、以下のように書けばOKです。

```objc
// 成功時の結果を受け取る場合
[button.rac_command.executionSignals.flatten subscribeNext:^(id x) {
    // なが〜い処理の結果が「x」に入っている
}];

// エラー時を受け取る場合
[button.rac_command.errors subscribeNext:^(id x) {
    // なが〜い処理で発生したエラーが「x」に入っている
}];
```

**(2014/10/07 19:54追記)**
よくよく検証してみたら、initWithEnabledにシグナルを渡す必要すらありませんでした。。
なので、以下のコードだけでシグナル実行中のボタンの制御が行われます。

```objc
button.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
    return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        // なが〜い処理

        // 成功時はコッチ
        [subscriber sendNext:nil];
        [subscriber sendCompleted];

        // エラー時はコッチ
        [subscriber sendError:nil];
    }];
}];
```
Rubyでfeedly APIにアクセスする

先日に開催された[西脇.rb&神戸.rb](http://nishiwaki-koberb.doorkeeper.jp/)のプログラミング合宿での自分の課題でfeedly APIを使用したのでメモとして残しておきます。

## アクセストークンの取得
これについては以下のQiitaの記事を参考にさせて頂きました。
- [Feedly APIメモ](http://qiita.com/kawaz/items/5f03dde3c219bdbffc3b)
- [The feedly Cloud APIを読んでみる](http://qiita.com/t-sagiri/items/0ea735f1ee8f1c52eab4)

記事を参考にやっていくと最終的にアクセストークンは以下のような形式で取得できました。

```json
{
  "token_type": "Bearer",
  "expires_in": 604799,
  "access_token": "***",
  "refresh_token": "***",
  "plan": "standard",
  "id": "user_id",
  "provider": "Twitter"
}
```

※ 2015/10/13 追記
アクセストークンの取得が簡単になってブラウザだけで取得できるようになっていました。

- [Feedly APIを使用するためのアクセストークンがかなり簡単に取得できるようになっていた](http://shaunkawano.com/api/%E3%81%B5%E3%81%A8%E6%B0%97%E3%81%A5%E3%81%84%E3%81%9F/%E7%B4%B9%E4%BB%8B/2015/01/05/feedly-obtaining-access-token/)
- [Generating developer access tokens (beta) : Feedly Cloud - Googleグループ](https://groups.google.com/forum/#!msg/feedly-cloud/YHLdeRAkn-c/0N2rk1TyED4J)

補足として、OAuthプロバイダがTwitterだと、アクセストークンの取得URLはTwitterのDMで送られてきます。

## feedly APIのほぼ全機能をサポートするRubyラッパー feedlr
[BestGems](http://bestgems.org/)などで調べると同じ目的のアクティブなGemが3つ見つかるのですが、テストもあってAPIカバー率が高かったのが[feedlr](https://rubygems.org/gems/feedlr)という、なぜかランクが3位のGemでした。

### 使い方
RSSリーダーいう性質上、いろんなID(userId,streamId, entryId, originId, categoryId, tagId)が出てきて、パラメータに渡す時、最初はどのIDを指してるのか少し戸惑いましたが、一度わかってしまえば簡単です。  
詳しくはAPIドキュメントを参考。  
[The feedly Cloud API](http://developer.feedly.com/)


```ruby:client.rb
require 'feedlr'
client = Feedlr::Client.new(oauth_access_token: 'access_token')

# ユーザープロフィールを取得する
profile = client.user_profile

# カテゴリーの一覧を取得する
client.user_categories

# 登録サイト一覧を取得する
client.user_subscriptions

# カテゴリ指定なしのID
category_id = "user/#{profile.id}/category/global.all"

# 指定したカテゴリの最新のエントリーのID一覧(デフォルトで20件)を取得する
entry_ids = client.stream_entries_ids(category_id)['ids']

# 指定したID(複数)のエントリーを取得する
entries = client.user_entries entry_ids

# 指定したカテゴリのエントリー一覧を取得する
stream = client.stream_entries_contents(category_id).items
```

#### Railsで使う場合は
以下のように初期化スクリプトを配置しておけば、

```ruby:config/initializers/feedlr.rb
Feedlr.configure do |config|
  config.oauth_access_token = ENV['FEEDLY_ACCESS_TOKEN']
  config.sandbox = false
  config.logger = Logger.new(STDOUT)
end
```
これだけでインスタンス化できます。

```ruby:client.rb
client = Feedlr::Client.new
```



### まとめ
RSSリーダーを作ろうと考えたことはないのですが、どのような構造でデータを持つべきかなどについても参考になりました。
tree コマンドが無い環境で tree コマンドを実現

# tree コマンドは便利

Linux における tree コマンドは便利ですね。しかし標準コマンドではないため初めて操作するサーバや手軽に tree をインストール出来ない環境だとディレクトリ構造を奇麗にツリー上に表示することが出来ません。
その場合は find や sed を使って tree コマンドを代替しましょう。

## find と sed で代替

```
pwd;find . | sort | sed '1d;s/^\.//;s/\/\([^/]*\)$/|--\1/;s/\/[^/|]*/|  /g'
```


### 実行例
以下のようなディレクトリ構造が(ファイル名・ディレクトリ名にスペースを含む)

```
$ find .
.
./AAA
./AAA/aaa
./B B
./B B/aaa
./B B/bbb
./B B/vvv
./B B/vvv/www
./CCC
./CCC/aaa
./CCC/bbb
./CCC/ccc
./CCC/dd
./CCC/ee ee
./CCC/yyy
./CCC/yyy/iii
./CCC/yyy/iii/eee
./CCC/yyy/iii/eee/foo.txt
./dd
./hoge.txt
```

疑似 tree で

```
$ pwd;find . | sort | sed '1d;s/^\.//;s/\/\([^/]*\)$/|--\1/;s/\/[^/|]*/|  /g'
/Users/yone098/work/yone098
|--AAA
|  |--aaa
|--B B
|  |--aaa
|  |--bbb
|  |--vvv
|  |  |--www
|--CCC
|  |--aaa
|  |--bbb
|  |--ccc
|  |--dd
|  |--ee ee
|  |--yyy
|  |  |--iii
|  |  |  |--eee
|  |  |  |  |--foo.txt
|--dd
|--hoge.txt
```

## alias
alias として `.zshrc` や `.bashrc` などに設定して使ってください

`alias tree="pwd;find . | sort | sed '1d;s/^\.//;s/\/\([^/]*\)$/|--\1/;s/\/[^/|]*/|  /g'"`

:mahjong:
[メモ]MacOSXのVirtualBoxでWindows8.1がゲストOSのVMのHDD容量を増やす方法


Windows8.1をVirtualBox上で使ってたら容量がなくなってしまったときに変更したときのメモ。

ストレージは可変サイズにしておくことが前提

# コマンドラインでストレージのサイズを拡張

VirtualBox.appの中にVBoxManageというコマンドがあるので、
modifyhdで容量を増やせる。

```shell-session:
$ /Applications/VirtualBox.app/Contents/MacOS/VBoxManage modifyhd ~/VirtualBox\ VMs/Windows81/Windows81.vdi --resize 71690
````

VBoxManageのmodifyhdで容量を拡張したいvdiを選んで --resizeで拡張したいサイズを指定
サイズはMB単位なので、1GBは1024(MB)

# ゲストOSを起動して、拡張した容量を使用できるようにする。


コントロールパネル＞管理ツール＞コンピュータの管理＞記憶域＞ディスク管理 を起動
C:ドライブを選択し右クリック(Command+クリック)で「ボリュームの拡張」を選べばよい。
OpenSSHバージョンアップ

###Centos6でOpenSSH5.8をアップデート
**OpenSSHの旧バージョンのを削除**
> yum remove openssh

**openssh5.8ダウンロード**
> cd /usr/local/src/
> wget http://ftp.jaist.ac.jp/pub/OpenBSD/OpenSSH/portable/openssh-5.8p2.tar.gz
> tar zxvf openssh-5.8p2.tar.gz

**specファイルとやらを編集**
> vi openssh-5.8p2/contrib/redhat/openssh.spec

```openssh.spec
%define no_x11_askpass 0
↓
%define no_x11_askpass 1　/* x11_askpassの無効化 */

%define no_gnome_askpass 0
↓
%define no_gnome_askpass 1　/* gnome_askpassの無効化 */

%configure \
    --without-zlib-version-check \　/* 追加(zlibのバージョンチェック無効化) */
    --sysconfdir=%{_sysconfdir}/ssh \
```

**RedHat以外のディストリビューション用のディレクトリを削除**
> cd openssh-5.8p2/contrib/
> rm -Rf aix/ hpux/ caldera/ suse/ cygwin/ solaris/

**openssh-5.8p2.tar.gzにアーカイブ**
> mv openssh-5.8p2.tar.gz openssh-5.8p2.tar.gz.org
> tar czvf openssh-5.8p2.tar.gz openssh-5.8p2/

**RPMパッケージを作成**
> rpmbuild -tb --clean openssh-5.8p2.tar.gz

**作成したRPMパッケージからopensshをインストール**
> rpm -Uvh ~/rpmbuild/RPMS/x86_64/openssh-5.8p2-1.x86_64.rpm
> rpm -Uvh ~/rpmbuild/RPMS/x86_64/openssh-server-5.8p2-1.x86_64.rpm
> rpm -Uvh ~/rpmbuild/RPMS/x86_64/openssh-clients-5.8p2-1.x86_64.rpm

*（環境によって”x86_64″の部分は”i386″などに変更が必要かもです）*

**sshdを自動起動するよう設定**
> chkconfig sshd on

**yumの処理対象からopensshパッケージを除外する**
> echo exclude=openssh* >> /etc/yum.conf

**sshd起動**
> /etc/init.d/sshd start

**プラグインインストール** 

* openssl-devel
* tcp_wrappers-devel（tcp_wrappers）
* pam-devel
* wget
* lsof

####参考
* [title](http://klampa.dyndns.org/wordpress/?p=1303
UIWebViewで縦横自在にスクロールさせる

#要件
`UIWebView`のスクロールは、横スクロールなら左右のみ、縦スクロールなら上下のみと、スクロール開始時にスクロール方向が固定されてしまいます。
これを、方向が固定されずに、（例えばPDFリーダーような）指の軌跡通りにスクロール出来るようにします。

#解説
`UIWebView`の持つ`UIScrollView`のプロパティ設定を指定するだけです。

`UIWebView`を_webViewと定義したなら、以下の記述になります。

```objc:viewDidLoadなどに記述
//スクロール方向をロックしない
_webView.scrollView.directionalLockEnabled = NO;
```

**UIScrollView**
　`-directionalLockEnabled:`
　　YESならば、スクロールし始めた際にスクロール方向をロックし、他の方向（上下なら左右、左右なら上下）にはスクロールしないようにします。
　　NOならば、スクロール方向はロックしません。
　　ただしYES設定であっても、斜め方向にスクロールを開始した場合は、上下・左右どちらにもロックされません。

#補足
タイトルに`UIWebView`とありますが、`UIScrollView`内の話なので`UIWebView`に限らず有効だと思います。
AndroidとCharlesを利用するときに便利なProxy変更アプリ


ProyxアプリのCharlesについては、qiitaで検索してもらえれば、丁寧に書かれているものが沢山あると思います。

今回は、Charlesを使っているがAndroidもパケットキャプチャしたいという場合の便利アプの紹介です。

Proxy Settingsというそのままのアプリ名のアプリがあります。

こちらのアプリを使うと、Proxyを任意に変更できます。
https://play.google.com/store/apps/details?id=com.lechucksoftware.proxy.proxysettings&hl=ja


これを利用しないで、AndroidでProxy設定をしようとすると、WiFi接続時に詳細ボタンを押して、Proyx設定をする以外の方法が無いので、ちょっと不便です。

![Proxy_Settings_-_Google_Play_の_Android_アプリ.jpg](https://qiita-image-store.s3.amazonaws.com/0/44315/e16bdd0c-0f70-ed7b-87ba-2257edf780e2.jpeg "Proxy_Settings_-_Google_Play_の_Android_アプリ.jpg")
[Objective-C] 日付を操作する


## 使うクラス

* NSDate
* NSCalendar
* NSDateComponents

### 3日後の日付を得る

```objc
// 3日後
NSDate *now = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];

NSDateComponents *comp = [[NSDateComponents alloc] init];
comp.day = 3;

NSDate *result = [calendar dateByAddingComponents:comp toDate:date options:0];
NSLog(@"3日後: %@", result);
```

```console
3日後: 2014-08-28 23:53:46 +0000
```

## TimeZone

ちなみに上記の出力を見てみると、`+0000`となっているのが分かります。
実は普通に計算すると「GMT（グリニッジ標準時間：日本と9時間差） の時刻」になってしまいます。
なのでローカルな時間に変換する必要があります。

それについては「[NSDateの現在時刻を日本時間というかlocal時刻で](https://sites.google.com/site/gggatelier/blog/nsdatenoxianzaishikeworibenshijiantoiukalocalshikede)」で書かれていました。

コードを引用させてもらうと、

```objc
NSDate* now = [NSDate dateWithTimeIntervalSinceNow:[[NSTimeZone systemTimeZone] secondsFromGMT]];
```

とすればいいようです。
Dockerを使ってGitLabを立ち上げる

## Dockerを使ってGitLabを立ち上る
使用するイメージはこちら⇒https://registry.hub.docker.com/u/sameersbn/gitlab/
細かい設定はさておき、とりあえずGitLabを立ち上げてデータの永続化をします。

以下、コマンド

```bash
sudo docker run --name=mysql -d \
  -e 'DB_NAME=gitlabhq_production' -e 'DB_USER=gitlab' -e 'DB_PASS=password'\
  -v /opt/docker_data/mysql:/var/lib/mysql \
  sameersbn/mysql:latest

sudo docker run --name=redis -d \
  -v /opt/docker_data/redis:/var/lib/redis \
 sameersbn/redis:latest

sudo docker run --name=gitlab -d \
  --link mysql:mysql \
  --link redis:redisio \
  -e 'GITLAB_PORT=10080' -e 'GITLAB_SSH_PORT=10022'\
  -e 'GITLAB_HOST=gitlab_hostname'\
  -p 10022:22 -p 10080:80 \
  -v /opt/docker_data/gitlab:/home/git/data \
  sameersbn/gitlab:latest

```

`-e 'GITLAB_HOST=gitlab_hostname'\`の部分については各GitLabホストを設定してください。

`http://localhost:10080`でアクセスできます。

初期ユーザのログイン情報は以下の通り
username: root
password: 5iveL!fe
caffeinateコマンドでMacの自動スリープを抑制する

Mountain Lion 以降のMacでは自動スリープを抑制するcaffeinateコマンドが使えます。

## 基本的な使い方

Ctrl + cで終了するまでスリープを抑制します。

```bash
$ caffeinate -i
```

## コマンドオプション

|オプション|効果|
|---------|----|
|-d|ディスプレイの電源を切るのを抑制|
|-i|システムのスリープを抑制|
|-m|ディスクのスリープを抑制|
|-s|AC電源での起動時にシステムがスリープするのを抑制する|
|-u|ユーザがアクティブであることを宣言する（-tと組み合わせる）|

## 特定の時間だけ抑制する場合

指定した秒数だけスリープを抑制します。
以下の場合、1時間抑制します。

```bash
$ caffeinate -u -t 3600
```

## 特定のプロセスが起動中のときだけ抑制する場合

指定したコマンドが起動中の間だけスリープを抑制します。
以下の場合、makeコマンドが実行中の間だけ抑制します。

```bash
$ caffeinate -i make
```
centosサーバ初期設定

## はじめに
ServersMan@VPSでレンタルしたcentos6.5にドットインストールのさくらのVPS入門を参考に初期設定をしていきます。
バージョンは6.5です。

## ログイン
メールで`sshポート番号`と`サーバipアドレス`と`rootユーザのパスワード`が通知されます。

    $ ssh -p [ポート番号] root@[サーバipアドレス]

## アプリケーションの最新化

    $ yum update

## 言語設定
日本語にします。

    $ vi /etc/sysconfig/i18n

```text:i18n
LANG="ja_JP.UTF-8"
SYSFONT="latarcyrheb-sun16"
```

## 作業ユーザ作成

    $ useradd [ユーザ名]
    $ passwd [ユーザ名]

## sudo権限付与

    $ usermod -G wheel [ユーザ名]
    $ visudo

↓のコメントを外す

```text:sudoers    
%wheel  ALL=(ALL)       ALL
```

## 鍵認証の設定
サーバ) 公開鍵ディレクトリを作成（作成ユーザで）

    $ mkdir .ssh
    $ chmod 700 .ssh
    
PC) 公開鍵、秘密鍵を作成して、公開鍵を転送
鍵の名称とパスフレーズを聞かれる。

    $ ssh-keygen -t rsa -v
    $ chmod 600 .ssh/id_rsa.pub
    $ scp -P [ポート番号] id_rsa.pub [ユーザ名]@[サーバipアドレス]:~/.ssh/authorized_keys

## 鍵認証でログイン

    $ ssh -p [ポート番号] [ユーザ名]@[サーバipアドレス]

## ssh設定
rootログイン禁止、パスワードログイン禁止を設定する。

    $ sudo -s
    $ cp /etc/ssh/sshd_config /etc/ssh/sshd_config.org
    $ vi /etc/ssh/sshd_config

↓を設定する

```text:sshd_config
PasswordAuthentication no
PermitRootLogin no
```
sshd再起動

    $ service sshd restart

## ファイアウォール設定

    $ cp /etc/sysconfig/iptables /etc/sysconfig/iptables.org
    $ vi /etc/sysconfig/iptables

↓を設定する

```text:iptables
*filter 
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:SERVICES - [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 4 -j ACCEPT
-A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -j SERVICES
-A INPUT -p udp --sport 53 -j ACCEPT
-A INPUT -p udp --sport 123 --dport 123 -j ACCEPT
-A SERVICES -p tcp --dport [sshポート番号] -j ACCEPT
-A SERVICES -p tcp --dport 80 -j ACCEPT
-A SERVICES -p tcp --dport 443 -j ACCEPT
COMMIT
```

ファイアウォール再起動

    $ service iptables restart

ファイアウォール設定確認

    $ iptables -L

## ntp
ServersMan@VPSでは、ntpを設定しなくても、自動で時刻を合わせてくれるようです。
インストールが必要な場合は、

ntpインストール

    $ yum install ntp

手動時刻合わせ

    $ ntpdate ntp.nict.jp

起動

    $ service ntpd start

自動起動設定

    $ chkconfig ntpd on
Programming Anko

# Anko script

Anko script(あんこすくりぷと)はGolang上で動作するスクリプト言語でGoやjavascriptに似た構文です。
内部的にはGoのReflectionでゴリゴリ動作しているのでいい塩梅で動いてくれます。

## URL

https://github.com/mattn/anko

Playground
http://play-anko.appspot.com/

## 制御構造

### for文

goとjavascriptを混ぜたような感じです

```
for i = 0; i < 10; i ++ {
  print(".")
}

# map type
m = {"foo": "bar", "bar": "baz"}
for key in keys(m) {
  print(key)
}

```
### if文

だいたいgoに準拠した構造です。

```
if condition {
  # do something
} else if condition {
  # do something
} else {
  # do something
}
```

## 関数定義

javascript的な感じです。Goのように戻り値の宣言などはありません。

```
func foo(x) {
  return x + 1
}
```

## Module定義

```
module hoge {
    func huga() {
        print("HOGE")
    }
}

# 実行
hoge.huga()
````

多分module名に関数をまとめる、とかそういう機能。

## コメント

コメントはスクリプト中の#後がコメントとなります。

## map操作

```
a = {"b": "c"}
a.b = "d"
a.x = "x"
print(a)
```

普通にできる

## slice操作

```
a = [1, 2, 3]
```

追加とか削除どうするかよくわからない。まだ無い気がする

## builtin functions

- print
- println
- printf
- panic
- load(path string) 指定したファイルを読み込み実行する
- typeof
- string
- toRune
- toChar
- toBool
- toFloat
- toInt
- toString
- toRunes
- toBytes
- range(begin, end int) begin〜endまでのsliceを作って返す
- keys(value map) mapのkeyのsliceを作って返す
- len
Phantom.jsの高レベルAPIのNightmareを試す

# 検証環境

OSX 10.9.4

# Github Page
http://www.nightmarejs.org/

# Github
https://github.com/segmentio/nightmare

# 使い方（テストケース）
https://github.com/segmentio/nightmare/blob/master/test/index.js

# セットアップ

## Phantom.jsをインストールする

```bash
$ sudo brew update && brew install phantomjs
```

少し時間がかかる

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

```bash
$ brew install npm
```

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

```bash
$ npm install --save nightmare
```

# デモ

## demo.jsを作成

```demo.js
var Nightmare = require('nightmare');
new Nightmare()
  .goto('http://google.co.jp')
  .screenshot('./google.png')
  .run();
```

## 実行

```bash
$ node ./demo.js
```


## スクリーンショットを確認する

```bash
$ open ./google.png
```

![google.png](https://qiita-image-store.s3.amazonaws.com/0/2432/6f9cee90-04ea-96e2-3d14-260450d21d8a.png)
PowerShell をバッチファイルに組み込もうとしたけれども（追記：解決した！）

※ 本文で不明であった原因が後に解決したので、コメントとして追記しました。(2014.10.10)

PowerShell はセキュリティーのため、デフォルトではスクリプトファイルを実行できないようになっている（解除の仕方の理論は知ってる）

自分が使うのにはいいけど、人に配る際、いちいち説明せんといかんのはメンドクサイので、バッチファイルの中に組み込んで、標準入力から実行コードを読み込ませるようにしてみた。
（参考：[Windowsでshebangもどき、またはバッチにスクリプトを埋め込む方法](http://qiita.com/snipsnipsnip/items/50e4ca88e3ce3f8cffda))

```ps1:why.cmd
@more +1 "%~f0" | powershell -Command "-" & exit /b 0
Write-Host 'Step1'
Write-Host 'Step2'
if ( $true ){
    Write-Host 'Step3'
    Write-Host 'Step4'
} else {
    Write-Host 'Step5'
}
Write-Host 'End'
```

```text:実行結果
✏ why.cmd
Step1
Step2
✏
```

if 文以降が何故か実行されない… **なんでじゃろね**

more が悪いのかと思って、tail +2 とかに変えてみたりもしたんだけど、結果は変わらないようだ。あと、これくらいのテスト用スクリプトだと、-Command "～" の中に組み込めるけど、長い奴はそうもいかんしね。別に困ってないけど、困った（どっちだ）
Redmineでチケット一覧をCSVエクスポートしたら行が途中で切れていた件

CSVエクスポートは、画面に見えている全件をエクスポートしてくれるわけではなく、Redmineの設定値で上限が決まっているようです。

## CSVエクスポートの上限を変更する方法

設定 -> チケットトラッキング -> エクスポートするチケット数の上限

で上限を変更できます。
スクリプトでAnimationClipのLoopTimeを変更する

```csharp
using UnityEngine;
using UnityEditor;

public class NewBehaviourScript
{
	[MenuItem("Assets/Enable Loop Time")]
	static void EnableLoopTime ()
	{
		var clip = Selection.activeObject as AnimationClip;
		var serialied = new SerializedObject (clip);
		serialied.FindProperty ("m_AnimationClipSettings.m_LoopTime").boolValue = true;
		serialied.ApplyModifiedProperties ();
	}
}
```
TypeScript 1.1.0 変更点


TypeScriptリファレンスお買い上げありがとうございます！ [Amazon](http://www.amazon.co.jp/gp/product/484433588X?ie=UTF8&camp=1207&creative=8411&creativeASIN=484433588X&linkCode=shr&tag=damenako-22) [達人出版会](http://tatsu-zine.com/books/typescript-reference)

2014/10/07 TypeScript 1.1.0-1 がリリースされました。ぱちぱち。
コンパイラが書き直されて、大幅な高速化と、わかめが見た感じコードベースのスリム化が行われている気がしなくもない、という感じです。

公式の変更点は[Changes between 1.0 and 1.1](https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#changes-between-10-and-11)と[List of minor breaking changes from 1.0](https://github.com/Microsoft/TypeScript/issues/153)を見てください。

[Playground](http://www.typescriptlang.org/Playground/)も既に1.1.0-1ベースにアップデートされているようです。

なお、以下の解説はあまり確認せずIssueやサイトに記載の内容を鵜呑みにして記述しております。

## 言語仕様上の変更

TypeScript 1.0 系の間は、基本的には非互換な変更は導入されないことになっています。[Roadmap](https://github.com/Microsoft/TypeScript/wiki/Roadmap)

[非互換な変更 一覧](https://github.com/Microsoft/TypeScript/issues?q=is%3Aissue+label%3A%22Breaking+Change%22+)
[1.1.0で入った非互換な変更 一覧](https://github.com/Microsoft/TypeScript/issues?q=is%3Aissue+label%3A%22Breaking+Change%22+milestone%3A%22TypeScript+1.1%22+is%3Aclosed) (でもMilestoneに組み込まれてないものが結構ある)

とはいえ、旧来のコンパイラを書き直しあわせてバグが減った結果、既存のコードのコンパイルが通らなくなる場合が僅かながら存在します。
つまり、非互換な変更に引っかかってしまった場合、バグる恐れのあるコードが正常に検出されるようになった、と言えます(改善だー)。
とはいえ、基本的には無修正で1.1.0が利用可能でしょう。

* null や undefined との即値演算がエラーになるようになった。
* null や undefined を即値として使いメソッド呼び出ししようとするとエラーになるようになった。
* [クラスのメンバ初期化時のthisの扱い](https://github.com/Microsoft/TypeScript/issues/641)
* [自分を参照する変数初期化の型推論が賢く](https://github.com/Microsoft/TypeScript/issues/522)
* [オーバーロードの選択が間違われるバグの修正](https://github.com/Microsoft/TypeScript/issues/305)
* [外部モジュールが正しいエイリアスを生成しなかったバグの修正？](https://github.com/Microsoft/TypeScript/issues/152)
* [Enumの値がObject型に代入できるようになった？](https://github.com/Microsoft/TypeScript/issues/151) ほんとか？
* [Enumの値がマイナスの数値でも暗黙的に正しくカウントアップされるようになった](https://github.com/Microsoft/TypeScript/issues/150)
* [クラスのメンバの初期化時にsuperが利用不可になった](https://github.com/Microsoft/TypeScript/issues/149)
* [オブジェクト型リテラル中でセミコロンの自動挿入がサポートされた](https://github.com/Microsoft/TypeScript/issues/148)
* [組み込みのObjectやFunctionの拡張まわりのバグが修正された？](https://github.com/Microsoft/TypeScript/issues/48)

## コンパイラの改善

おっそいおっそい言われていたコンパイルにかかる時間が改善されました。
実測値でだいたい4倍くらい高速になったよ！ということらしいです([公式アナウンスより](http://blogs.msdn.com/b/typescript/archive/2014/10/06/announcing-typescript-1-1-ctp.aspx))。
発表当初は5倍と言っていて、僕の手元で3.8倍くらいだったので、まぁそんな感じかな？という変化ですね。
これでコンパイル時間を理由にScalaをやらないくせにTypeScriptやってるダブスタ野郎と誹られなくて済むぞ！

なお、emitされるコードの効率の改善が行われたようです。
静的解析で不要とわかっているものは出力しない感じになっている。

## 結論

TypeScriptは今日から使うべき言語。
[Xcode]SwiftからXcodeを使う人必見！Xcodeでタブを半角スペース「2」に変更する方法

エディタでは基本、タブ設定を半角スペース「2」で行っているせいか、
xcodeのデフォルトタブ設定に違和感を感じていました。
色々探しても見付けにくかったので、その時の手順を書いておきたいと思います。


### １・「preferences」を選択

![スクリーンショット 2014-10-07 12.06.53.png](https://qiita-image-store.s3.amazonaws.com/0/15812/3d646b1e-29c8-496c-2a45-c9c5caa9a395.png)



### ２・「Text Editing」を選択

![スクリーンショット 2014-10-07 12.04.10.png](https://qiita-image-store.s3.amazonaws.com/0/15812/c3357bdf-0345-6dd8-d679-24d4d26a4890.png)



### ３・「Indentation」を選択し、「Tab width」と「Indent width」を変更

ここがデフォルトだと<b>「4」</b>になっているため、
ここを2に設定します。

![スクリーンショット 2014-10-07 12.04.36.png](https://qiita-image-store.s3.amazonaws.com/0/15812/d02a9892-f804-a5fc-d61c-d8b8d03720e3.png)
[Swift] PFObjectのサブクラス

[Parse](http://parse.com)で使うPFObjectのサブクラス化について.  

[オフィシャルのiOSガイド](https://parse.com/docs/ios_guide#subclasses/iOS)のサブクラスの項にあるように、Objective-C同様、PFObjectのサブクラスは、`PFSubclassing`というプロトコルを実装して、`registerSubclass()`というクラスメソッドを呼ぶことと、`parseClassName()`という同じくクラスメソッドで、DB上に保存される名前を返してあげることが必要. 

```
class Armor : PFObject, PFSubclassing {
  class func load() {
    self.registerSubclass()
  }
  class func parseClassName() -> String! {
    return "Armor"
  }
}
```

であとはプロパティの扱いですが、Objective-Cでは、`@dynamic`なプロパティとして宣言することで、あとはランタイムにsuperclassすなわちPFObjectがよろしくやってくれるという仕組みになっていました. 

```
// Armor.h
@interface Armor : PFObject<PFSubclassing>
+ (NSString *)parseClassName;
@property (retain) NSString *displayName;
@end
 
// Armor.m
@dynamic displayName;

```

それに相当するSwiftでの書き方が分からずに苦戦しました。上記のドキュメントでもその部分はSwiftの記述がありません。それでとりあえず、考えたのは、Computated Property (日本語でなんて訳されてるんだろう) を使う方法

上記の例だと、

```
class Armor : PFObject, PFSubclassing {
    var displayName: String {
        get {
            return objectForKey("displayName") as String
        }
        set {
            setObject(newValue, forKey: "displayName")
        }
    }
}
```

で `objectForKey()  setObject()`という PFObjectのメソッドを呼び出すことで解決できました.
Rails で JSONP を返す


実現するための最小のコードは下記になります。

```rb
render json: some_hash, callback: 'callback_function'
```

コールバック関数名はパラメータで指定したいと思いますので、下記のように `callback_param` メソッドを生やして（ここで `gsub` しているのは任意の Javascript を埋め込まないようにするため）、

```rb
def callback_param
  params[:callback].present? ? params[:callback].gsub(/\W/, '') : nil
end
```

それから下記のように指定しました。

```rb
render json: some_hash, callback: callback_param
```

`callback` の有無によって JSON/JSONP の切り替えをしてくれます。上記の例では `params[:callback]` が `nil` のときは `callback_param` の返り値が `nil` となり、 JSON で返ります。 `Content-Type` の切り替えまでしてくれるようです（ `callback` がないときは `application/json` となり、あるときは `text/javascript` になる）。
【PHP】PHP_EOL

PHP_EOLは改行を表していて、環境によって自動で改行コードを切り替えてくれる。

| OS | 改行コード | 改行コード文字 |
|:--------|--------:|:-:|
| Windows | CRLF    | \r\n |
| Linux,Unix,MACOS10 |  LF | \n |


```php:使い方例
echo 'こんにちわ',PHP_EOL;
```

関係ないけど、echo って「,」区切りで複数出力できるらしい。
Eclipse x gradle-tomcat-plugin の自動リロード

こんな方が対象

 - Gradle と Tomcat と Eclipse を使っている
 - [gradle-tomcat-plugin](https://github.com/bmuschko/gradle-tomcat-plugin) プラグインを使って Gradle から Tomcat を起動している
 - eclipse プラグインを使って .project や .classes を出力している

`build.gradle` で以下の様な設定をすると、`gradle tomcatRun` した後 Eclipse でコードを書き換えてビルドしたときに、Tomcat 側で自動リロードされるようになります。

```groovy:build.gradle
  // eclipse plugin の設定
  eclipse {
    classpath.file {
      beforeMerged { classpath ->
        classpath.entries.clear()
      }
      whenMerged {  cp ->
        // Eclipse のビルドファイルの配置を Tomcat のリロード判定対象と同じようにする。
        // この設定を行うと、tomcatRun で実行中のサーバが、
        // eclipse でビルドが走った時に自動リロードされるようになる。
        cp.entries.findAll { it instanceof SourceFolder && it.path.startsWith("src/main/") }*.output = "src/main/webapp/WEB-INF/classes"
        // Gradle でのテストのために、Gradle の出力先に揃えておく
        cp.entries.findAll { it instanceof SourceFolder && it.path.startsWith("src/test/") }*.output = "build/classes/test"
        cp.entries.findAll { it instanceof SourceFolder && it.path.startsWith("src/test/resources") }*.output = "build/resources/test"
        cp.entries.removeAll { it.kind == "output" }
      }
    }
  }
  // compileJava 等でのクラスファイルの出力先を Tomcat のリロード判定対象と同じようにする。
  sourceSets.main.output.classesDir = 'src/main/webapp/WEB-INF/classes'

  clean {
    // add customized class output path to deletion targets of 'clean' task.
    delete << 'src/main/webapp/WEB-INF/classes'
  }
```

`.gitignore` には `**/WEB-INF/classes` と書いておくのがオススメです。

以下のサイトの情報をつなぎあわせてこんな結論になりました。ありがとうございます。

 - http://www.glamenv-septzen.net/view/1165 - eclipse プラグイン以外についてはこちらの記事を参考にしました。
 - https://github.com/bmuschko/gradle-tomcat-plugin/issues/81 - reloadable が動かないよという gradle-tomcat-plugin の issue。作者から `sourceSets.main.output.classesDir` の書き換えが提示されています。
 - http://stackoverflow.com/questions/17451567/splitting-main-and-test-in-gradles-eclipse-builds - eclipse プラグインのクラスファイル出力先の書き換えについて
Docker調査結果


##Dockerとは
一言でいうと、 **コンテナ型仮想化ソフト**。
Go言語で書かれている。

###コンテナとは

アプリケーションを環境ごと **パッケージング** したもの。
各マシンの基盤と、アプリケーションが動作する基盤を完全に分離させることができるため、どこでも環境ごとアプリケーションを動作させることができるようになる。

###Dockerのうれしさ
####・デプロイが非常に楽になる
Dockerfileにパッケージングする情報を記述しビルドするとことで、まったく同じ環境を構築できる。
上書きDeployではなく、コンテナベースのDeployができる。
####・インフラをコードで管理できるようになる
コンテナはDockerfileにより記述されるため、コードによってインフラを構築できる（Infrastracture as Codeの概念）
####・事故を防げる
通常、サーバーは、どのような設定がなされているか、今どのような状態かを管理し続けなければならないが、Dockerは、状態管理をすることを放棄し、状態管理しないというアプローチを取っている。コロンブスの卵的な発想。
一度サーバーを構築すると、その後はサーバーに変更を加えずに、新しくサーバーを構築していく。
サーバーの中身に変更を加えたい場合は、新しくサーバーを作り、古いサーバーは破棄するという流れを取る。
これにより、動いているサーバーの設定変えたら動かなくなった！やばい！みたいな事故を予め防げる。
各種仮想化技術の発展と、AWSのようなサービスの台頭により急速に広まった考え。
####・効率的なテストができる
Jenkinsと連携することで、Dockerコンテナ立ち上げて環境ごとアプリケーションのテストをすることも自動化して効率的なテストができるようになる。
状態に依存しているようなアプリのテストに向いている。

###VMとコンテナの違い
VMにはVM毎にOSがあり、その上にライブラリやアプリなどがある。
コンテナは、ホストOSの上にDockerエンジンを挟んで、ライブラリやアプリがある。
なので、ホストOSでプロセスを見ると、各コンテナのすべてのプロセスが表示される。
VMと比べてオーバーヘッドが少ない分、高速に動く。


##おまけ
###個人的に面白いと思った用途
>面白い例だなと思ったのはQuipperという会社の例で、Quipperでは、gitでブランチを切ってそれをGitHubにpushするたびに、Herokuでアプリケーションを立ち上げているそうです。
なぜそんなことをするかというと、開発じゃない人に「いまあの機能を開発しています」と言うときに、いままでなら開発用サーバにデプロイした後で見てもらったり、あるいはローカルにプロキシみたいなのを立てて、依頼があれば見せる、という感じだったと思うのですが、この方法だと **git pushするたびにHerokuでアプリが立ち上がってURLが付くので、プロジェクトマネージャみたいな人が機能を確認するときに、いつでもプルリクを見てURLからアプリを見て確認できる。**コミュニケーションが非同期になるのが非常に良くて。
>元リンク：http://www.publickey1.jp/blog/14/immutable_infrastructure_2.html

開発者だけに限らず、関係者もその恩恵に授かれる。


### 作業内容
以下のリンクを参考に動かしてみました。
「初心者による初心者のための Docker ~ Nginx を動かす ~」：
http://qiita.com/kasaharu/items/d4654193d75c67d65226


##参考資料
1. Dockerとはなにか？どこで使うべきか？：http://deeeet.com/writing/2014/05/01/what-is-docker/
2. 最近のインフラ系ツールが多すぎて何が何だかわからない！からの卒業：http://qiita.com/kasaharu/items/59b8d3a76b4a22eab88e
3. Immutable Infrastractureについて：http://apatheia.info/blog/2013/08/10/immutable-infrastructure/
4. 初心者による初心者のための Docker ~ Nginx を動かす ~：http://qiita.com/kasaharu/items/d4654193d75c67d65226
5. 今からでも間に合うDockerの基礎。コンテナとは何か、Dockerfileとは何か。Docker Meetup Tokyo#2：http://www.publickey1.jp/blog/14/dockerdockerfiledocker_meetup_tokyo_2.html
6. これから始める「DockerでかんたんLAMP環境 for CentOS」：http://knowledge.sakura.ad.jp/tech/1811/
7. Docker とは - Docker User Guide：http://qiita.com/zembutsu/items/bbf740839c887835f2ee
8. Immutable Infrastructureはアプリケーションのアーキテクチャを変えていく、伊藤直也氏（前編）：http://www.publickey1.jp/blog/14/immutable_infrastructure_1.html
9. Immutable Infrastructureはアプリケーションのアーキテクチャを変えていく、伊藤直也氏（後編）：http://www.publickey1.jp/blog/14/immutable_infrastructure_2.html