OmniAICreator/Qiita-1.07M huggingface dataset:
dockerでrailsする


dockerはインストールしといてください。
データベースはmysqlとし、railsのコンテナとは分けて動かします。

##データベース
```bash
$ docker run --name local-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:latest
```

##プロジェクトの作成
```bash
$ docker run --rm -it -v "$(pwd)":/usr/src/app -w /usr/src/app rails rails new webapp -d mysql
```

##Dockerfileの作成
```bash
$ cd webapp
$ vi Dockerfile
```

```Dockerfile
FROM rails:onbuild
```
Dockerfileにこの1行を書いてください。

##dockerイメージのビルド
```bash
$ docker build -t my-rails-app .
```

##database.yml修正
username、passwordは適宜修正してください。

```conf/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: my-secret-pw
  host: db
```

##マイグレーション
```bash
$ docker run --rm -it -v $(pwd):/usr/src/app --link local-mysql:db my-rails-app bash
$ bin/rake db:create db:migrate
$ exit
```

`rails`や`rake`コマンドを打つ必要がある場合に使います。

##起動
```bash
$ docker run --rm -it -p 8080:3000 -v $(pwd):/usr/src/app --link local-mysql:db my-rails-app
```

http://localhost:8080 or http://host-ip:8080 でアクセスできます。

##[おまけ]コンテナが増えまくったら
以下のコマンドで消せます。(runしているコンテナは消えません)

```bash
$ sudo docker rm `sudo docker ps -a -q`
```
swiftでCoreMotionで加速度取得

```swift
import UIKit
import CoreMotion

class ViewController: UIViewController {
    let myMotionManager = CMMotionManager()

    override func viewDidLoad() {
        super.viewDidLoad()

        // 加速度取得間隔
        myMotionManager.accelerometerUpdateInterval = 0.2

        myMotionManager.startAccelerometerUpdatesToQueue(NSOperationQueue.mainQueue(), withHandler: {(accelerometerData:CMAccelerometerData!, error:NSError!) -> Void in
            NSLog("x=%f", accelerometerData.acceleration.x)
            NSLog("y=%f", accelerometerData.acceleration.y)
            NSLog("z=%f", accelerometerData.acceleration.z)
        })
    }
}
```
Pythonのモジュールをつくる


nodeのパッケージシステムのように気軽に作ろうとしたら意外と面倒くさかったので。


## プロジェクトの作成

適当なディレクトリを作る。

`mkdir mymodule && cd $_`

virtualenvかdirenvを使ってシステムのpythonとディレクトリ内のpythonを隔離する。

virtualenvの場合は `virtualenv env`
direnvの場合は `direnv edit .` してから開いたエディタで `layout python` とする。
`pip freeze` してwsgirefしか出なかったら環境構築は完了。
システムのpipとは隔離されているので必要なモジュールを自由にpip installしてよい。


## ディレクトリ構成

```
.
├── .gitignore
├── LICENSE
├── MANIFEST.in
├── README.md
├── mymodule.py
├── setup.py
└── tests
    └── myplugin_test.py
```

### .gitignore

Pythonの.gitignoreをベースに、virtualenvを使うならenvディレクトリを追加、direnvを使うなら.direnvを追加。
[gitignore/Python.gitignore](https://github.com/github/gitignore/blob/master/Python.gitignore)

### README.md

本当はmarkdownではなくPyPIで整形して表示されるrestructuredTextの方がいい。

### setup.py

```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import with_statement
from setuptools import setup

with open("README.md") as f:
    long_description = f.read()

setup(
    name="mymodule",
    version="0.1.0",
    description="hogehoge.",
    long_description=long_description,
    author="yourid",
    author_email="youremail",
    url="yoururl",
    py_modules=["mymodule"],
    include_package_data=True,
    install_requires=["Flask"],
    tests_require=["nose"],
    license="MIT",
    keywords="",
    zip_safe=False,
    classifiers=[]
)
```

__py_modules__ は公開するモジュールのファイル名を指定する。
__install_requires__ と __tests_require__ は依存モジュールを書き出す。記事によっては`pip freeze`したものをここに指定していることがあるが、バージョンまで指定されてしまいdependency hellっぽくなるので手動でバージョン指定せずに書くほうが良い。
__classifiers__ は[ここ](https://pypi.python.org/pypi?%3Aaction=list_classifiers)から選ぶ。

### MANIFEST.in

デフォルトだとPythonのファイルしかモジュールに入れてくれないので、特別なテキストファイルとかを入れるためにはこれが必要。今回はREADME.mdを入れるために `include README.md` と書いておく。
requirements.txtとか用意するならそれもここに記述しておく必要がある。

### mymodule.py

モジュール本体。適当に書く。

### tests/

モジュールのテスト。適当に書く。ちゃんと書く。


## テスト

noseを使う。`pip install nose`すれば入る。
実行は`nosetests`


## PyPIとTest PyPIに登録

[Test PyPI](https://testpypi.python.org/pypi)と[PyPI](https://pypi.python.org/pypi)に登録。
ホームディレクトリに.pypircファイルを作って登録情報を書いておく。

```
[distutils]
index-servers =
    pypi
    pypitest

[pypi]
repository: https://pypi.python.org/pypi
username: {{ユーザーネーム}}
password: {{パスワード}}

[pypitest]
repository: https://testpypi.python.org/pypi
username: {{ユーザーネーム}}
password: {{パスワード}}
```

ひと通りモジュールができてテストも完了したら `python setup.py register -r https://testpypi.python.org/pypi`してパッケージを登録した後`python setup.py sdist upload -r https://testpypi.python.org/pypi` でTest PyPIに登録される。テストサイトなのでどんどん登録テストしてよい。
問題なく登録されたら、`pip install --index-url https://testpypi.python.org/simple/ mymodule`でインストールできるようになっている。
システムのPythonとかでちゃんとインストールできるか、importして使えるようになっているかなどのテストしてから本番PyPIに登録する。

`python setup.py register` で本番PyPIにモジュールの登録
`python setup.py sdist upload` で本番PyPIにモジュールのアップロードが出来る。

## おわり

これをつくりました
[airtoxin/plugin-loader](https://github.com/airtoxin/plugin-loader)
MAMP環境でのcakePHP環境構築[備忘録兼チュートリアル？]第一回

自分も始めたばかりなので備忘録兼チュートリアルとして残しておく。
##そもそもcakePHPって？
あんまり書く意味はないが、とりあえず書いとくと
>CakePHPは、Cake Software Foundation, Inc.という団体が開発するPHPのWebアプリケーションフレームワークです。Webアプリケーションの開発用に用意されたものなのですね。こうしたフレームワークはいくつかありますが、CakePHPがもっとも一般に広く使われているといってよいでしょう。  

ということ。  
普通にMVCフレームワークだね。
MVCって何？とかは特に書かないでおく。
[ggr](http://www.objective-php.net/mvc/about)ってことだね。
![MVCってこんなの](http://codezine.jp/static/images/article/104/mvc03.gif)

##cakePHPをダウンロード
[ここ](http://cakephp.org)からDLする。

ダウンロードしたディレクトリの名前を適当に書き換え
webサーバの公開ディレクトリ(Apacheならhtdocs)の下に入れとけばOK！

###サーバ環境
cakePHPを始めるってことはもうサーバ環境は揃ってる認識なので
ここは割愛。
[これ](http://www.9142.net/blog/2013/03/13/mamp/)とかみて環境構築すればいいと思う。

###ディレクトリ構成
* app  
これは開発する人が一番触るとこ。最初はこれ以外さわらないと思っといても間違いじゃない。
* cake  
これはcakePHPが利用するプログラムファイルとかが置かれてるとこ
* lib  
ここはライブラリ群。ユーザはあんまりさわらないとこ
* plugins、vendors  
拡張とか

###appディレクトリの中身

* Config ―― CakePHPで使う各種の設定ファイルがまとめられてる。CakePHPは基本的に命名規則を重視してるが、やはり根本的な部分で設定ファイルは必要。

* Console ―― コンソールプログラムが用意されてる。各種のファイルを自動生成したりするのに使う。

* Controller――これが「コントローラー」のフォルダ。コントローラーのプログラムはこの中に保管。

* Lib ―― ライブラリフォルダ。何らかのライブラリを利用するときに使う。デフォルトではカラ。

* Locale ―― ロケール（国別情報）に関するフォルダ。ここに各国語の対応ファイルを用意することで比較的容易に国際化対応することができる。

* Model ―― これが「モデル」のフォルダ。モデルに関するプログラムはこの中に保管。

* Plugin――プラグインのフォルダ。プラグインを使って拡張するときに利用。デフォルトではカラ。

* Test――テストに関するファイルとか。

* tmp ―― 一時置き場です。プログラムが作成する一時ファイルやログなどのファイルはここにまとめて保存されます。

* Vendor ―― これもプログラムを拡張するときに用いる。デフォルトではカラ。

* View ―― これが「ビュー」のフォルダ。表示に化するファイル類はこの中に、その内容種類別にフォルダ分けして保存。

* webroot ―― ルートで表示されるページのファイル類がまとめられてる。


##早速つかってみる(ここから軽いチュートリアル的な感じ)

###アクセスしてみる！
公開フォルダにぶち込んだら早速ブラウザからアクセスしてみる。
たとえばcakeという名前で公開ディレクトリに入れた場合のURLは下記のようになる

`http://localhost/cake/`

アクセスすると赤とか黄色とか緑のMessageが表示されたはず。
とりあえずは上から順に解決していく。
全部緑になれば問題ない。
![イメージ](http://libro.tuyano.com/img?id=733002)

ちなみに最初上の２項目が赤くエラーになってるが、
「セキュリティソルト」と「セキュリティシード」の警告なので失敗してるわけじゃないので安心していい。

※最初はdb関連でエラーになっていると思うがそれに関しては後述。

##大事なこと
わからなくなったら[ここ](http://book.cakephp.org/2.0/ja/index.html)をみる癖をつけること。
どんな言語でも公式に勝る情報源はない。

##最後
とりあえず今回はここまで。次回controllerから。

※疲れちゃってだいぶ適当になったからいつかもう少し細かく編集するかも。。。
最新versionのgolangをぶち込む方法について

#概要
Ubuntu14.10.0にgolangの最新versionをぶち込む際に困ったので、そのことについて書いていきます。
gvmというrubyでいうとrbenvのようなものを使っていきます。
（普通にsudo apt-get install golangをすると1.2.1が入るはず）

基本的には[このサイト](http://www.hostingadvice.com/how-to/install-golang-on-ubuntu/)を翻訳しただけのものです。


#gvmを入れて、golangの最新版をぶち込む
##1.レポジトリーをローカルにクローンする。


```bash
bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
```
これによって、~/.gvmにレポジトリが作られる。

##2. bashrcでgvmの設定を読み込む

```bash
[[ -s "$HOME/.gvm/scripts/gvm" ]] && source "$HOME/.gvm/scripts/gvm"
```
これでsource ~/.bashrcをするとgvmを実行できるようになる。
ちなみに、gvmを打ってみると

```bash
$ gvm
Usage: gvm [command]

Description:
  GVM is the Go Version Manager

Commands:
  version    - print the gvm version number
  get        - gets the latest code (for debugging)
  use        - select a go version to use
  diff       - view changes to Go root
  implode    - completely remove gvm
  install    - install go versions
  uninstall  - uninstall go versions
  cross      - install go cross compilers
  linkthis   - link this directory into GOPATH
  list       - list installed go versions
  listall    - list available versions
  alias      - manage go version aliases
  pkgset     - manage go packages sets
  pkgenv     - edit the environment for a package set
```
となる。

rbenvと比較すると

```bash
$ rbenv
rbenv 0.4.0
Usage: rbenv <command> [<args>]

Some useful rbenv commands are:
   commands    List all available rbenv commands
   local       Set or show the local application-specific Ruby version
   global      Set or show the global Ruby version
   shell       Set or show the shell-specific Ruby version
   install     Install a Ruby version using ruby-build
   uninstall   Uninstall a specific Ruby version
   rehash      Rehash rbenv shims (run this after installing executables)
   version     Show the current Ruby version and its origin
   versions    List all Ruby versions available to rbenv
   which       Display the full path to an executable
   whence      List all Ruby versions that contain the given executable

See `rbenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/sstephenson/rbenv#readme
```

##3. ぶち込む
rbenv install --listと同じノリで、gvm listallを打つ

```bash
#ちょっと時間かかったあとに
・・・・
   go1.3beta1
   go1.3beta2
   go1.3rc1
   go1.3rc2
   go1.4
   go1.4.1
   go1.4.2
   go1.4beta1
   go1.4rc1
   go1.4rc2
   release.r56
・・・・
```
と出るので、好きなのを入れる。
rbenv install 2.2.1とやるのと同じノリでgvm use go1.4.2を打つ。

##4. 確認する
rbenv versionsと同じノリで、gvm listと打つと

```bash
$ gvm list
gvm gos (installed)
   go1.4.2
   system
```
と出るので、しっかりぶち込まれていることが確認できる。

##5. 使う

rbenv global 2.2.1と同じノリでgvm use go1.4.2と打つ。

```bash
$ go version
go version go1.4.2 linux/amd64
```
でうまく入れられていることを確認。

##6. 余談

```bash
gvm use go1.4.2
```
と~/.bashrcに追記しておくと、毎回ログイン時点で指定したバージョンのgoを使えるようになる。


以上。
Unity2d Scriptで生成したGameObjectを子として登録する。


とあるGameObjectがあり、動的にそのGameObjectに新しいGameObjectを子として登録する方法です。

子としてGameObjectを登録すると、親の座標移動に従って相対的に座標変更できるので、パーティクルとかでGameObjectに一定時間エフェクトを表示する時など便利です。

例では、動的に生成したPrefabを子として登録します。

```
// プレハブを取得
GameObject prefab = (GameObject)Resources.Load("Prefabs/Effects/Prefab名");

Vector2 pos = new Vector2(gameObject.transform.position.x, gameObject.transform.position.y);
// プレハブからインスタンスを生成
GameObject obj = (GameObject)Instantiate(prefab, transform.position, Quaternion.identity);
// 作成したオブジェクトを子として登録
obj.transform.parent = transform;
```

上記Sampleの様に、生成したオブジェクトの、transform.parentに親にしたいオブジェクトのtransformを登録する事で、親子関係にすることが出来ます。

上記Sampleでやっている、Prefabの動的生成については、[こちら](http://project-unknown.hatenablog.com/entry/2015/04/12/225422)の記事に詳細を載せています。
Aureliaドキュメントほんやくろぐ : ES7 decorator の導入

## はじめに

3月の終わり頃、なんかとつぜんのやる気が生まれ、[Aureliaのdocumentation/Japanese](https://github.com/aurelia/documentation/tree/master/Japanese)を翻訳しました。ところが、Aureliaはバージョンアップが早く、しかも結構な量のドキュメントが更新されるので、翻訳の更新にも時間がかかってしまいます。

翻訳更新時に差分はわかりますから、ここに、翻訳時に分かった差分を公開していこうと思います。

## get-started.html の更新 (4/12時点)
### ES7 decoratorの導入

4/12現在のget-started.html (日本語版) には、ES7のdecoratorを将来導入するぜ、みたいなことが書いてありますが、予告通り導入されたようです。(※動かしていません)

現在のget-started.html (日本語版) を読んでいただくとわかりますが、メタデータをスタティックメソッドで定義していました。例えばルータを使うアプリケーションは

```js
import {Router} from 'aurelia-router';
import bootstrap from 'bootstrap';

export class App {
  static inject() { return [Router]; }
  constructor(router) {
    this.router = router;
    this.router.configure(config => {
      config.title = 'Aurelia';
      config.map([
        { route: ['','welcome'], moduleId: 'welcome', nav: true, title:'Welcome' }
      ]);
    });
  }
}
```

と書いていました。これが、decoratorの導入によって、

```js
import {inject} from 'aurelia-framework';
import {Router} from 'aurelia-router';
import 'bootstrap';
import 'bootstrap/css/bootstrap.css!';

@inject(Router)
export class App {
  constructor(router) {
    this.router = router;
    this.router.configure(config => {
      config.title = 'Aurelia';
      config.map([
        { route: ['','welcome'],  moduleId: './welcome',      nav: true, title:'Welcome' }
      ]);
    });
  }
}
```

こうなります。なんでbootstrapの定義の仕方まで変わっているんだろう。。。
これは巷で話題のTS 1.5のdecoratorでも動作する、、、はずです。試してないですけど。gitterでそんな話をしていました。たぶん。

### Bindable decorator

decoratorを導入したことで、今までメタデータで定義していたものをdecoratorで置き換えたようです。元々、カスタムエレメントでカスタム属性を示すために、Behaviorメタデータを使っていました。

```js
import {Behavior} from 'aurelia-framework';

export class NavBar {
  static metadata(){ return Behavior.withProperty('router'); }
}
```

これが、`@bindable` となりました。

```js
import {bindable} from 'aurelia-framework';

export class NavBar {
  @bindable router = null;
}
```

シンプルになりました。null入れるの気持ち悪いですが、デフォルト値が設定できるのかな?

get-started.html ベースの変更点はこんな感じです。今まで結構メタデータであれこれしていたところが全部decoratorベースに置き換わると思うので、docs.html の修正は結構な量になりそうです。。。

翻訳中に分かったものからここに記載していこうと思います。
nginxのssl_engineとAES-NI

# AES-NIとは

IntelやAMD特定のCPU(主にXeon)でサポートされているAESの暗号化/復号を高速に実行するための拡張命令セット。

# ssl_engine

http://nginx.org/en/docs/ngx_core_module.html#ssl_engine

nginxには`ssl_engine`というSSLのハードウェアアクセラレーション機能を利用するためのディレクティブがあります。ちょっと前に社内でこの機能でAES-NI使いたいよね的な話をしていていろいろ調べてたのでまとめてみました。

# AES-NIが使えるかどうか調べる

AES-NIはCPUの拡張命令セットなのでまず利用しているCPUでAES-NIがサポートされている必要があります。Linuxだと`/proc/cpuinfo`の`flags`に`aes`が含まれていなければなりません。また、[Intelのサイト](http://ark.intel.com/search/advanced/?s=t&AESTech=true)でもプロセッサの型番レベルで調べることができます。

```console
$ cat /proc/cpuinfo | grep aes | wc -l
4
$
```

CPUの方はサポートされているのが確認できました。しかし、一方で`openssl`コマンドだと`aes`の文字が見当たりません。

```
$ openssl engine -t -c
(rdrand) Intel RDRAND engine
 [RAND]
     [ available ]
(dynamic) Dynamic engine loading support
     [ unavailable ]
$
```

ダメ元で`ssl_engine`に`aesni`を指定してみましたが、やはりエラーになります。(`no such engine:id=aesni`とか出る)

```
ssl_engine aesni;
```

# わからないのでググってみる

いろいろ調べてみましたが、↓のstackoverflowやOpenSSLのMLアーカイブ(?)に回答っぽいのがありました。

 * [How to config openssl engine aes-ni in nginx](http://stackoverflow.com/questions/28939825/how-to-config-openssl-engine-aes-ni-in-nginx)
 * [having a lot of troubles trying to get AES-NI working](http://openssl.6102.n7.nabble.com/having-a-lot-of-troubles-trying-to-get-AES-NI-working-td44285.html#a44301)

stackoverflowの方の回答を抜粋すると、

```
In OpenSSL >= 1.0.1 AES-NI is enabled by default in the EVP interface, and there is no aesni engine. So in nginx there is no configuration option to enable AES-NI for OpenSSL versions >= 1.0.1 as it is enabled by default in OpenSSL (as long as your CPU supports it). For OpenSSL versions < 1.0.1 there is no official support for AES-NI though there is a patch available.
```

つまりOpenSSLのバージョンが1.0.1以上ならCPUがサポートしていればデフォルトでAES-NIが有効になるよ、ということらしいです。各所で`openssl engine -c -t`でaesniの文字が表示されてればOKという記述を見かけていたので結構ハマったのですが、これはOpenSSLのバージョンが1.0.0の頃の話のようです。

# AES-NI有り/無しでベンチマーク

また、実際`openssl`コマンドではAES-NIの有り/無しでベンチマークを取ってみるとかなり性能に差が出ます。

## AES-NI無し

```console
$ openssl speed aes-256-cbc
...
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-256 cbc      83516.83k    87979.03k    89286.21k    89781.93k    89983.23k
$ 
```

## AES-NI有り

```console
$ openssl speed -evp aes-256-cbc
...
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-256-cbc     410475.75k   431723.92k   434910.46k   438013.77k   437015.89k
$
```

という感じで性能に5倍くらいの差が出ました。


ところで、[Amazon EC2 Instances](http://aws.amazon.com/ec2/instance-types/)によるとEC2では現行世代のインスタンスだとすべてサポートされているようです。

# まとめ

nginxの`ssl_engine`とAES-NIについて解説しました。今のところnginxでAES-NIを利用したい場合、CPUでサポートされていてOpenSSLのバージョンが1.0.1以上なら特に何もしなくても自動的にAES-NIが有効になるので`ssl_engine`はそもそも使わなくてもいいようです。(ただ、`modprobe aes-x86_64`は必要なのかな？)
水面の波紋をセルオートマトンで表現したらAIにならなかった

今回は（残念ながら）バッドプラクティス的な話です。
セルオートマトンで水面を表現してみよう！と思い立ったものの、途中で色々見失ってました。ｗ

##セルオートマトンとは？
座標をブロック（セル）で区切ってブロックの状態を把握しながら動いていくというものです。
また後半にくわしく書きましたがこれはセル同士が影響を与えあっていないという意味でセルオートマトンではないので、「風」としました。

##水面の波紋をセルオートマトン風に表現すると・・・
今回作ったもの
jsdoit : http://jsdo.it/hp0me_/b1Wl

![eee3.gif](https://qiita-image-store.s3.amazonaws.com/0/57193/99c60571-261d-bdd1-5efd-3b610447161d.gif)

##イメージ
それぞれのセル（ブロック）は一つずつがインスタンスです。
セルには状態があって「発火状態 = state」と「現在のステップ = step」があります。全てのステップが終わったら発火状態がリセットされます。あとはこっちで随時発火させていきます。
本当は、発火したら隣のセルを発火させるように書けばよかった・・・反省。。


##コード
実装の詳細はコメントに

```js:sketch.js
//セルのオブジェクト
var cellObj;

//セルを格納する配列（２次元）
var cells = new Array();

//セルの大きさ
var cellSize = 10;

//一行のセルの数
var cellLineNum = 40;
var band;

var canvasSize = cellSize * cellLineNum + 1;
var hamonStep = 1;
var hamonStepMax = Math.floor(cellLineNum/2);
var fixedUpdateFlg = 0;

function setup() {
  createCanvas(canvasSize,canvasSize);
  smooth();

  //２次元配列でセルを格納する
  for(var x = 0; x < cellLineNum; x++){
    cells[x] = new Array();
    for(var y = 0; y < cellLineNum; y++){
      cellObj = new CellClass(cellSize * x,cellSize * y);
      cells[x].push(cellObj);
    }
  }
}

function draw() {
//アップデートを3フレに一回に絞る
if(fixedUpdateFlg == 3){

  background(255);

  //波紋のステップ
  band = hamonStep * 2 - 1;
  for(var x = 0; x<band;x++){
    for(var y = 0; y<band;y++){
      if(x == (band-1) || y == (band-1)){
        cells[x][y].state = 1;
        cells[x+1][y+1].state = 1;
        cells[x][y+1].state = 1;
        cells[x+1][y].state = 1;
      }
    }
  }

  //波紋ステップが最後までいったらやり直す
  if(hamonStep == hamonStepMax)hamonStep = 0;
  hamonStep++;


  //描画
  for(var x = 0; x<cells.length;x++){
    for(var y = 0; y<cells.length;y++){
      cells[x][y].draw();
    }
  }

  fixedUpdateFlg = 0;
}
fixedUpdateFlg ++;
}

function mousePressed() {

}


//セルのクラス
var CellClass = function(x,y){

  this.pos = createVector(x,y);
  this.step = 0;
  //this.colors = [0,50,100,255,100,50,0];
  //this.colors = [255,200,150,100,50,0,50,100,150,100,50,100,150,200,255];

  //波紋の色調整
  this.colors = [255,225,200,175,150,125,100,75,50,25,0,25,50,75,100,125,150,125,100,25,50,75,100,125,150,175,200,225,255];

  //ステート駆動
  this.state = 0; //1で動く


  //ステップが終了したらステートをゼロに戻す
  this.draw = function(){
    if(this.state == 0)return;

    this.step++;
    fill(this.colors[this.step]);
    stroke(1);
    rect(this.pos.x,this.pos.y,cellSize,cellSize);

    if(this.step == (this.colors.length-1)){
      this.step = 0;
      this.state = 0;
    }
  };
};

```

###これは正確にはセルオートマトンじゃない（？）・・・
本来なら水面を描く時には隣の水面の状態を把握して影響されていくというのが綺麗なセルオートマトンだと思いますが、**今回はセルの色はステップに応じて最初から決まっているのでセルオートマトンじゃないと言えるでしょう。**なので「風」とつけてます。

本当は**隣接する水面セルにベクトルを付けて随時チェックする&減衰する**ようにしたら綺麗なセルオートマトンの水面ができます。

##セルオートマトンは設計が鍵
今回のように、最初の段階で隣同士のセルが影響を与えられないように作っていると人口知能っぽいものを作ることができなくなってしまいます。
**セル同士が影響を与えて動いていくように設計する**。これが鉄則ですね。。

逆に言うと**「（プログラミング的に）人工知能とは何か？」という線引きがここで厳然とある**ように感じました。これがあるかないかの違いが大きいです。
cocos2d-jsのシーン切り替えのtransitionが期待通り動かないことがある件

フェードアウト、インで切り替えようとしたところ途中で一瞬全部表示されるという妙な挙動となる。
js版だけでなくどうもcocos2dのクセらしい。
古い情報だが Objective-C 版での事例を参考に対応。参考にしたのは次のページ
[Cocos2D iPhone - removing the black screen between CCTransition](http://stackoverflow.com/questions/9389523/cocos2d-iphone-removing-the-black-screen-between-cctransition "")

エンジンのソースを追いかけたわけでは無いので本当の理由は不明。
ただ遷移後のシーンで開始直後に Menu を用意するケースで発生する模様。（前述の参考リンクでもそれらしきことが書かれている）

 ~~今回は cc.Transition??? を使わずに対応した。~~
cc.Transition??? を使用してシーン遷移を行う（2015/04/15修正）
コードはだいたい次の通り（実際のコードは少々面倒なので説明のための書き方としている）

```javascript:遷移前のレイヤー
checkGameOver: function() {
	if (ゲームーオーバーであれば) {
		this.scheduleOnce(this.onGameOver, 1, "toGameOver");
	}
},
onGameOver: function () {
	cc.LoaderScene.preload(g_gameover_resources, function () {
		cc.audioEngine.stopMusic();
		cc.audioEngine.stopAllEffects();
		var scene = new cc.Scene();
		var layer = new GameOverLayer();
		scene.addChild(layer);
		cc.director.runScene(new cc.TransitionFade(1.2, scene));
	}, this);
},
```

```javascript:遷移後のレイヤー
init: function(score){
	this._super();
	gFadeInMask = new cc.LayerColor(cc.color(0,0,0,255), SCREEN_WIDTH, SCREEN_HEIGHT);
	this.addChild(gFadeInMask, 500);
	gGameOverLayer = this;
},
onEnter: function() {
	this._super();
	var action = cc.fadeTo(0.6, 0);
	gFadeInMask.runAction(cc.sequence([action, cc.callFunc(function() {
		gFadeInMask.removeFromParent(true);
	}, gGameOverLayer)]));
},
```

 ~~参考リンクでの対応事例と違って遷移前のレイヤーでもマスクを用意してフェードアウトを行っている。~~
 ~~自分のやり方が悪いのかcocosのバージョンが違うためなのかは不明だが、同じアプローチではちらつきを解消できなかったため。~~
 ~~（参考リンクでの対応事例は runScene() を呼び出す際に Transition を使用してフェードインアウトを実現しているためもう少しシンプルな記述）~~

 ~~フェードはこれでよいが他のtransitionではどうしたものか。~~ 

##### 2014/04/15
cc.Transition??? を使うスタイルへ修正できた。
実に単純な話で遷移前のレイヤーで update メソッド内から普通の関数コールの形で onGameOver() を呼び出していたのが問題だった。
scheduleOnce() を使用してタスクを遅延実行する形を取ったところ組込み Transition を使うスタイルを無事実現できた。
OCMOCK_ANYではプリミティブ型の引数をモックできない




```
- (id)mocktest:(id)arg1
          arg2:(BOOL)arg2
          arg3:(int)arg3;
```

のようなメソッドを以下のようにしてモックしようとしてもうまくいかない。

```
OCMStub([mock mocktest:OCMOCK_ANY arg2:OCMOCK_ANY arg3:OCMOCK_ANY])
```


オブジェクトをうけとるようにすればよい。

```
- (id)mocktest:(id)arg1
          arg2:(id)arg2
          arg3:(id)arg3;
```
Rails4.2.0 Bootstrapを導入

以下のURLからBootstrapをダウンロードする。
http://getbootstrap.com/getting-started/#download

ダウンロードしたファイルを解凍し、以下の作業を行う。

## bootstrapのcssとjsを配置
「vendor/assets/stylesheets/」に「bootstrap.min.css」を配置
「vendor/assets/javascripts/」に「bootstrap.min.js」を配置

## 配置したファイルをAsset Pipelineのリストに含める
「app/assets/javascripts/application.js」に「//= require bootstrap.min」を追記する。
以下のような記述となる。

```lang:app/assets/javascripts/application.js
// This is a manifest file that'll be compiled into application.js, which will include all the files
// listed below.
//
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
//
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// compiled file.
//
// Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
// about supported directives.
//
//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require bootstrap.min
//= require_tree .
```

「app/assets/stylesheets/application.css」に「 *= require bootstrap.min」を追記する。
以下のような記述となる。

```lang:app/assets/stylesheets/application.css
/*
 * This is a manifest file that'll be compiled into application.css, which will include all the files
 * listed below.
 *
 * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
 * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
 *
 * You're free to add application-wide styles to this file and they'll appear at the bottom of the
 * compiled file so the styles you add here take precedence over styles defined in any styles
 * defined in the other CSS/SCSS files in this directory. It is generally better to create a new
 * file per style scope.
 *
 *= require_tree .
 *= require_self
 *= require bootstrap.min
 */
```

これまでの作業を行うことで、Bootstrapが適用される。
最近の開発ツールいろいろ

他の企業さんは最近どういうツール使ってるの？的なお勉強会に2つほど行ってきたのでそれのめも。
（※実際使用してのレビューではなくただ一覧で並べただけなので大分雑。）


#<i class="fa fa-asterisk"></i>プロジェクト・タスク管理ツール

##[Backlog](http://www.backlog.jp/)
いいね！ボタンがついてたり、ユーザーアイコンの設定・やりとりなどがあったりで、[Redmine](http://redmine.jp/)よりやさしい印象。
一番安いベーシックプラン(1GB1800円〜/月)からあるけど、企業さんだとプレミアプラン（30GB/7800円〜)以上になるのかな。

##[Trello](https://trello.com/)
ToDo、InProgress、Doneなどにわけてリストを作れる。
TrelloにあるタスクをSlackに投げたり、Githubに投げたり...と他と連携して使ってたるところが多い模様。
バグ・機能追加など、ラベル付けして使うとよりいいかんじに。
見積もり工数や実績工数もここに書いてるという企業さんも。

Qiitaタグ:[trello](http://qiita.com/tags/trello)

#<i class="fa fa-asterisk"></i>作業バージョン管理
##[Github](https://github.com/)
リポジトリを非公開にする場合は有料

##[Bitbucket](https://www.atlassian.com/ja/software/bitbucket/overview)
5ユーザーアカウントまでなら無料

#<i class="fa fa-asterisk"></i>チャット形式のコミュニケーションツール

##[Slack](https://slack.com/)
北米発のサービスなので日本語ではないけど、UIきれいなので使っててきもちよさげ

Qiitaタグ:[slack](http://qiita.com/tags/slack)


##[チャットワーク](http://www.chatwork.com/ja/)

まだ1対1のチャットしか使ったことないけど、
・グループチャット 
・タスク管理
・ファイル共有
・ビデオ会議/音声通話
などいろいろできる模様。

フリープランもあるけど、5GB以上使うようであれば有料プラン。
フリーランスさんだとパーソナルプラン（400円/月)
企業さんだとビジネスプラン（2000円〜/月)

Jenkinsの処理結果をチャットワークに投げたり結構他サービスと連携して使う人も多いっぽい。

#<i class="fa fa-asterisk"></i>社内情報共有ツール
会社では[yammer](https://www.yammer.com/)つかってたけど、もう息してないみたいな他人事とは思えないお話もききつつ、おしえてもらったのがこれ

##[Qiita:Team](https://teams.qiita.com/)
社内でポエム共有。

##[DocBase](https://docbase.io/)
今は無料だけど2015年内に有料になるっぽい。　

#<i class="fa fa-asterisk"></i>他、使ってるのを実際みておおーとなったやつ
##[shippable](https://www.shippable.com/)
GithubかBitBucketと連携して使える無料のCIサービス。

##[Zapier](https://zapier.com/)
APIでWebサービス間の処理を自動で連携してくれるサービス。

##[LiveScript](http://livescript.net/)
CoffeeScriptよりすごくなったの。

##[JUnit](http://junit.org/)
Javaで開発されたプログラムのユニットテスト（単体テスト）の自動化を行うためのフレームワーク。
phpunitで環境変数を設定する

phpunit.xml.dist

```xml
<?xml version="1.0" encoding="UTF-8"?>

<phpunit colors="true" bootstrap="./bootstrap.php" >
    <php>
        <!-- 環境変数の設定 -->
       <env name="TEST_ENV" value="true" />
    </php>
</phpunit>
```

こうすると、

```php
var_dump(getenv('TEST_ENV'));
```

とかで値が取れるようになって、テスト or テスト以外の設定変更がちょっとやりやすくなる。

というか、マニュアルに普通に書いてあるのでマニュアル読みましょう的な。。。


https://phpunit.de/manual/current/ja/appendixes.configuration.html#appendixes.configuration.php-ini-constants-variables
「友達リクエストを確認」ボタンを押すと承認される

表題通りの動作。
Facebookで友達リクエストが来たときに、相手のページでは「友達リクエストを確認する」というボタンが出ている。
それとは別に「○○さんを友達として承認しますか？」みたいなのも同じページに出てくるので、承認されないと思いきや、そこにカーソルを合わせると出てくる「確認」を押すと確認どころか承認したことにされて友達状態になるので焦るという話。
ノウハウかどうかは怪しい。将来的に動作が変わる可能性もある。
こういう話は残しておきたい。あとFacebookは承認なら承認って書いておいてほしい。
【VBA】ダイアログを使ってファイルに名前をつけて保存する

VBA初心者では苦労したので備忘録。

## 何を作りたかったのか

Excelで入力された情報を元にCSVファイルを出力。
その際にファイルダイアログを表示して任意でファイル名を選択できる。
デフォルトファイル名はしっかり入る……という単純なもの。
失敗したのはダイアログで選ぶからと思いFileDialog関数に注力してしまった点。
FileDialogでも「名前を付けて保存」はあるのだが……今回の要件は満たせなかった。

## 出来上がったコード

```OutputCSV.xslx
Sub OutputCSV()

    '変数宣言
    Dim filePath As Variant
    Dim DirPath As String
    Dim fileNo As Integer
   
    'ファイルパスを選択する
    Filename = "test_file.csv"
    DirPath = ThisWorkbook.Path
    filePath = Application.GetSaveAsFilename(DirPath & "\" & Filename, "CSV(カンマ区切り)(*.csv),*.csv")
    If filePath = False Then
        Exit Sub
    End If

    '初期値設定
    fileNo = FreeFile 'FreeFile関数で使用可能なファイル番号取得

    'ファイル開く
    Open filePath For Output As #fileNo
   
    '----------------------------------------
    ' CSV出力
    '----------------------------------------
    Write #fileNo, Cells(1, 1), Cells(1, 2), Cells(1, 3)

    'ファイル閉じる
    Close #fileNo
   
    MsgBox "CSVを出力しました"
End Sub
```
Yokohama.rb 2015年4月11日


#レシピブック

## 189

行数を数える方法。
いろいろあるけど、例えばこんなの。

```ruby:to_a.size
File.open( filename, "r:utf-8" ){ |f| f.to_a.size }
```

```ruby:each_line.count
File.open( filename, "r:utf-8" ){ |f| f.each_line.count }
```

```ruby:read.count
File.read( filename, encoding:"utf-8" ).count("\n")
```

```ruby:レシピブック189
File.open( filename, "r:utf-8" ) do |f|
  nil while f.gets
  f.lineno
end
```

で。
どれが速いか。
![Kobito.vd4LAw.png](https://qiita-image-store.s3.amazonaws.com/0/6854/842c9b30-64d3-4a84-2383-5b9a160196a1.png "Kobito.vd4LAw.png")

* read.count が速い。それも5倍ぐらい。
* やっぱり to_a.size が一番遅いけど、大差ない。
* 行数が少ない時は行数を読むよりもファイルの open/close に時間がかかってるんだと思う。

yokohama.rb の時にその場で joker さんがおっしゃっていたけど、オブジェクトの生成コストがあるので、オブジェクトの数が少ないコードが速くなると。read.count は長い文字列を作るだけなので速い。それ以外は行数の数だけオブジェクトができるので遅い。と。
なるほど。

もちろん。read で読みきれないサイズのファイルだった場合は read.count 方式と to_a.size 方式は破綻する。破綻するかどうかの境目は手元の環境では 1GBytes とか。
百MBytesぐらいならあまり気にする必要がない場合が多いと思う。

ちなみに測定に使ったのはこんなコード

```ruby
#coding:utf-8
require "benchmark"

def report( x, name, rep )
  x.report(name) do
    rep.times.map{ |x|
      yield
    }.uniq.tap{ |x| p x }
  end
end

def create_file( filename, size )
  s=[*?a..?z].cycle.take(100).join
  File.open( filename, "w" ) do |f|
    size.times.each do
      f.puts s
    end
  end
end

def measure( size )
  filename = "text.txt"
  create_file( filename, size )
  n=[100, 1310720.0/size ].min.ceil
  t=Benchmark.realtime{ n.times{ File.open( filename, "r:utf-8" ).to_a.size } }
  rep = (3.0/(t/n.to_f)).ceil
  fsize = File.size( filename )
  p [ size, fsize, rep ]
  Benchmark.bmbm do |x|
    report( x, "to_a.size", rep ) do
      File.open( filename, "r:utf-8" ){ |f| f.to_a.size }
    end
    report( x, "each_line.count", rep ) do
      File.open( filename, "r:utf-8" ){ |f| f.each_line.count }
    end
    report( x, "read().count", rep ) do
      File.read( filename, encoding:"utf-8" ).count("\n")
    end
    report( x, "189", rep ) do
      File.open( filename, "r:utf-8" ) do  |f|
        nil while f.gets
        f.lineno
      end
    end
  end
end

1.step(23,2) do |r|
  measure( 1<<r )
end
```

## 190

### seek と sysseek のちがい

未調査

### def 〜 rescue

知らない文法があった。

```
# 平方根で失敗したら 0 を返す
def sqrt_force(x)
  Math.sqrt(x)
rescue Math::DomainError=>e
  return 0
end

p sqrt_force(100) #=> 10
p sqrt_force(-1) #=> 0
```

begin〜rescue がメソッドの最外縁にあると、begin を書かなくて良いというもの。
C++ にも似たようなのがある。

```c++

int hoge( double x )
try{
  //なんか
}
catch( std::exception & e ){
  //エラー処理
}
```

こんなの。ruby とちがって try が必要。
うろ覚えだけど Java にもあったと思う。
追記：上記のように書いたものの、調べたらなさそうな感じ。すいませんでした。

## iPad をセカンドディスプレイに

iPad をセカンドディスプレイにしている方が2名いた。かっこいい。

アプリケーションとハードウェアは下記リンクのものらしい。

app : https://itunes.apple.com/jp/app/duet-display/id935754064
HW : http://www.amazon.co.jp/dp/B00TOCBNLK/

ふたりとも、途中で mac の電池が切れかかっていた。
すごい電池減るらしい。

## LT

gem で GoogleDrive が使えるので便利。
google docs の表計算ソフトなら Excel と違って セル内の式で SQL が使える。すごい。
詳しくは
https://speakerdeck.com/1syo/za-nitukurukpiturufalsesusume ( 雑につくるKPIツールのススメ by TAKAHASHI Kazunari )
を参照のこと。

## 懇親会

Rails を学びたい人は Ruby on Rails チュートリアル ( http://railstutorial.jp/chapters/beginning?version=4.0 ) を読み、実際に写経などを行えばいい。らしい。

基本的なことは全部網羅されていて、出来もよく、素晴らしい。とのこと。

読みます。
ipaファイルが生成されたら自動でDeployGateにアップロードする

# 概要
ipaファイルが生成されたら自動でDeployGateにアップロードする方法です

# 準備

## ファイルの監視
この方法ではファイル監視をして、ipaファイルが生成されたことを検知してdeploygateにアップロードするようにします
どんなファイル監視方法でもいいですが、ここでは最近知った[entr(1)](http://entrproject.org/)を使ってみましょう
entr(1)では、以下のようなコマンドでファイルの監視ができます

```shell-session
$ ls ~/**/*.ipa | entr echo /_
```

これだけでホームディレクトリ以下に*.ipaが生成されたらechoでfile pathが出力されます(/_は特殊な変数でentr(1)が取得したファイルの絶対パスが入ります)

さて、この状態ですでにファイルの監視は完了です
あとはこのfile pathでdeploygateにアップロードするだけですね

## deploygateへのアップロード
どんなアップロードの仕方でもいいのですが、ここではOSXのdesktop notificationを使って通知をしたいので、rubyで[terminal-notifier](https://github.com/alloy/terminal-notifier)を使ってやってみます

```upload.rb
require 'terminal-notifier'
require 'json'

file_path = ARGV[0]
return if file_path == nil

TerminalNotifier.notify("start upload the #{file_path} to deploygate")

json = `curl -F 'file=@#{file_path}' -F 'token=your deploygate token' -F 'message=sample' https://deploygate.com/api/users/your_name/apps`
result = JSON.parse(json)
result_text = "Error: #{result['error']}, Revision: #{result['results']['revision']}"
p result_text

TerminalNotifier.notify(result_text)
```
普通にcurlでアップロードしてます、tokenやyour_nameについては適時書き換えてください
特にcurlな理由はないので、普通にrubyでpostするように書いてもいいと思います
ちなみに、今回curlで書いて思ったのが、これで実行するとcurlの進捗が自動で表示されるので便利だなと思いました
![スクリーンショット 2015-04-12 20.44.32.png](https://qiita-image-store.s3.amazonaws.com/0/6717/c156421b-7c05-5c88-e7df-4460ecd0f7c4.png)

## 監視からアップロードまで
ここまででファイル監視とdeploygateへのアップロードが準備できました
あとはこれを実行するだけですね、こんな感じでできます

```shell-session
$ ls ~/**/*.ipa | entr ruby upload.rb /_
```
二つをただくっつけただけですね、シンプルです

# ipaの生成をしてみる
これで、念願叶ってipaファイルが生成される度に自動でDeployGateへアップロードすることができました
実際にアップロードしてみましょう

適当なアプリをadhocでビルドして、適当なフォルダにexportしましょう
OSXのdesktop notificationが出てきて、アップロードが始まるはずです
![hoge.png](https://qiita-image-store.s3.amazonaws.com/0/6717/3deed1ee-3e75-cbfd-8bf3-db7523ec116c.png)
![スクリーンショット 2015-04-12 20.54.39.png](https://qiita-image-store.s3.amazonaws.com/0/6717/2ef37f8b-085f-bfb9-0904-99b78b300f55.png)

# おわりに
先日から何日か使ってますが、結構便利な気がしてます
ちなみに、ファイル監視してアップロードしてるだけなのでipaだけじゃなくて、Androidのapkでも同じことができます
以下のコマンドでどっちもカバーできるので便利ですね

```shell-session
$ ls ~/**/*.ipa ~/**/*.apk | entr ruby upload.rb /_
```
数値積分 > QMC > Quasi Monte Calro Method

積分の方法は色々あるが、その中でQMCという積分の紹介。

#概要

10年近く前に[lucille](http://lucille.sourceforge.net/cgi-bin/notes/wiki.cgi?page=%BD%E0%A5%E2%A5%F3%A5%C6%A5%AB%A5%EB%A5%ED%CB%A1)というページで初めて知った。

[Prof. Harald Niederreiter](http://www.ricam.oeaw.ac.at/people/page.cgi?firstn=Harald;lastn=Niederreiter)さんの「Random Number Generation and Quasi-Monte Carlo Methods (PDF, 11MB)」に詳しく掲載されている。

積分をする上でモンテカルロ法というのがある。積分するポイントを乱数で取得しながら各地点の値を足しあわせていくことで積分を行う方法である。

モンテカルロ法より少ない回数で積分精度をあげようというのがQMCという手法である。積分のオーダーについては上記のPDFを参照。

QMCではlow-discrepancy sequence(LDS)という数列を用いる。その二次元版は「Halton_sequence」という数列と認識している。


#サンプルコード

以下のサンプルコードで実際に積分してみる。
Halton_sequence()で二次元のLDSを作っているが、今回は一次元のみ使っている。
なお積分範囲は[0,1]となるので、これ以外の積分の場合は[0,1]で得られるLDSを積分の希望範囲へ拡張すればいい。

```c:sample-qmc.c
#include <stdio.h>
#include <math.h>

static void Halton_sequence(int i0, double *px0, double *py0)
{
	// configuration
	const int xbase = 2;
	const int ybase = 3;
	//
	double invxbase, invybase;
	double facx, facy;
	double x0, y0;
	int inp;

	invxbase = 1.0 / (double)xbase;
	facx = 1.0 / (double)xbase;

	invybase = 1.0 / (double)ybase;
	facy = 1.0 / (double)ybase;

	inp = i0;
	x0 = 0.0;
	while (inp > 0) {
		x0 = x0 + (inp % xbase) * invxbase;
		inp = inp / xbase;
		invxbase = invxbase * facx;
	}

	inp = i0;
	y0 = 0.0;
	while (inp > 0) {
		y0 = y0 + (inp % ybase) * invybase;
		inp = inp / ybase;
		invybase = invybase * facy;
	}

	*px0 = x0;
	*py0 = y0;
}

static double myFunc(double x_)
{
	// result [1/4]
	return (x_ * x_ * x_);
}

const static double kAnswer = 1.0/4.0;

int main(void)
{
	double xx, yy;
	int idx;
	double d0;
	int count = 0;
	double res;

	d0 = 0.0;
	for(idx=1; idx<=3000; idx++) {
		count++;
		Halton_sequence(idx, &xx, &yy);

		d0 = d0 + myFunc(xx);
		res = d0 / (double)count;
		printf("%d %f err=%.2f\%\n", idx, res, fabs(res/kAnswer - 1.0)*100);
	}
}
```

```txt:実行結果
1 0.125000 err=50.00%
2 0.070312 err=71.88%
3 0.187500 err=25.00%
...
300 0.245102 err=1.96%
301 0.245453 err=1.82%
302 0.244952 err=2.02%
...
1000 0.248766 err=0.49%
1001 0.248725 err=0.51%
1002 0.248517 err=0.59%
...
2998 0.249347 err=0.26%
2999 0.249531 err=0.19%
3000 0.249448 err=0.22%
```

ガウス積分などと比べて同じ精度では計算する点数が多くなってしまう。
QMCの良いと思う所は、点を増やすときは過去の点そのままが使えるという所。
100個で計算したけど収束していない場合、101個目から計算を続ければいい。ガウス積分やシンプソン積分だとこうはいかない。
そのため、収束精度を設定して、その精度が求まるまで計算を続けるという方法が取れそう。
lodashの特定のメソッドをファイルサイズを抑えつつ使いたい

[lodashが各メソッド毎にモジュールとして分割されていたらしく](https://www.npmjs.com/browse/keyword/lodash-modularized)、特定のメソッドだけを使いたい場合はその分割されたモジュールだけをインストールすれば良いようになったみたいだ。

```console
$ npm install lodash.template
$ node
> require('lodash.template')('<ul><% var i = 0; while (i++ < 5) { %><li><%= i %></li><% } %></ul>')()
'<ul><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul>'
```

lodashの`template()`だけ使いたい場合は`lodash.template`をインストールすれば良い。

```console
$ du -ch node_modules/lodash
...
1.9M total
$ du -ch node_modules/lodash.template
...
228K total
```

ファイルサイズが抑えられて良いかも。

---

[lodash-node](https://github.com/lodash/lodash-node)の他に[lodash-amd](https://github.com/lodash/lodash-amd)というリポジトリもあるのでブラウザ上でもAMDで似たようなことができるみたいだ。
input/textareaでIMEでの変換中にchangeイベントを間引く


```coffee
node = document.querySelector('input#my-query')
_onComposition = false
node.addEventListener 'change', (ev) =>
  return if _onComposition # 変換中
  console.log ev.target.value
      
node.addEventListener 'compositionstart', =>
  _onComposition = true

node.addEventListener 'compositionend', =>
  _onComposition = false
```

[CompositionEvent - Web API インターフェイス | MDN](https://developer.mozilla.org/ja/docs/Web/API/CompositionEvent "CompositionEvent - Web API インターフェイス | MDN")
開眼！JavaScriptの2.6・2.7のまとめ　hasOwnProperty()とin演算子について

開眼！JavaScriptの2.6と2.7のまとめです。

##2.6　hasOwnProperty()を使って、プロパティがプロトタイプチェーン経由ではないことを確認
##2.7　in演算子を使って、オブジェクトがプロパティを保持しているかどうかを確認する
*in演算子は、オブジェクトが指定された名前のプロパティを保持しているかを確認する。
しかしin演算子は、指定したオブジェクト自身が持つプロパティがだけでなくプロトタイプチェーン上で見つかるプロパティの存在も結果をtrue（プロパティを保持している）として返す。
指定したオブジェクト自身が持つプロパティだけを確認する場合はhasOwnProperty()を使用する。*

in演算子を使って、そのオブジェクトが持つプロパティかを確認。

```
var myObject = {foo:'value'};
console.log('foo' in myObject);

console.log('toString' in myObject);
```
結果
true
true →toStringはmyObjectで定義されていないがプロトタイプチェーン上で見つかるプロパティのためtrueになる。

hasOwnProperty()を使って、そのオブジェクト自身が持つプロパティかを確認。

```
var myObject = {foo:'value'};
console.log(myObject.hasOwnProperty('foo'));

console.log(myObject.hasOwnProperty('toString'));
```
結果
true
false →toStringはmyObject自身が保持しているプロパティではないためfalseになる。

ちなみにhasOwnProperty()自身は、プロトタイプチェーン上（Object.prototype）で見つかるプロパティのため下記のような結果になる。

```
var myObject = {foo:'value'};
console.log('hasOwnProperty' in myObject);

console.log(myObject.hasOwnProperty('hasOwnProperty'));
```
結果
true
false
Docker 超入門 〜 Boot2Docker 導入から HelloWorld まで〜

### :black_square_button: boot2docker インストール

```shell-session
brew install boot2docker
```

### :black_square_button: 初期化やら設定やら

```shell-session
boot2docker init
boot2docker start
$(boot2docker shellinit)
```

### :black_square_button:  とりあえず、Hello World

```shell-session
docker run ubuntu echo hello world

hello world
```

### :black_square_button: 番外編：こんなエラー出たら？

```shell-session
FATA[0000] Post http:///var/run/docker.sock/v1.16/containers/create: dial unix /var/run/docker.sock: no such file or directory. Are you trying to connect to a TLS-enabled daemon without TLS?
```

環境変数の初期化を忘れてましたね。。。

```shell-session
$(boot2docker shellinit)
```

で解消。

### :black_square_button:  Special Thanks

[Mac OSXでDocker（インストール編）](http://begirama.hatenablog.com/entry/2014/12/22/022812)

### :black_square_button:  雑記

これぐらいの内容でエントリ書くなよって感じが満載ですが、これは次のエントリを書くための前準備になるので、一応記事として残しますた。。。
こんな記事でもお役にたてれば幸いです。。。
DebianでLXC1.1をコンパイルしてインストール

# はじめに
DebianでLXCをコンパイルしてインストールする情報が殆ど無かったのでまとめてみました。
環境構築した時のメモみたいなものなので、適宜自分の環境に読み替えてください。


# コンパイル・インストール
```zsh
$ git clone git@github.com:lxc/lxc.git -b stable-1.1
$ cd lxc
$ sudo apt-get install autoconf automake pkg-config make gcc libcap-dev
$ sudo apt-get install debootstrap bridge-utils dnsmasq-base chkconfig
$ ./autogen.sh && ./configure  --prefix="" && make && sudo make install
```

# 無理やりだけど自動起動できるように
```zsh
$ sudo ln -s /libexec/lxc/lxc-net /etc/init.d/lxc-net
$ sudo ln -s /libexec/lxc/lxc-containers /etc/init.d/lxc-containers
$ sudo chkconfig lxc-containers on
$ sudo chkconfig lxc-net on
```

# dnsmasqが使えるように
`/etc/default/lxc-net`を編集して、以下を追記

```
USE_LXC_BRIDGE="true"
LXC_DOMAIN="abcang.net"
```

# 名前解決できるように
```zsh
$ sudo apt-get install resolvconf
```

`/etc/resolvconf/resolv.conf.d/head`に`nameserver 10.0.3.1`を追記
`/etc/resolvconf/resolv.conf.d/tail`に`domain abcang.net`を追記

# cgroupをマウント
`/etc/fstab`に以下を追記

```
cgroup  /sys/fs/cgroup  cgroup  defaults  0   0
```

# 一旦再起動
```zsh
$ sudo reboot
```

# コンテナの作成
```zsh
$ sudo lxc-create -t debian -n test
```

# ネットワーク設定
`/var/lib/lxc/test/config`を編集

```
lxc.network.type = empty
```

を削除し、以下を追記

```
lxc.network.type  = veth
lxc.network.link  = lxcbr0
lxc.network.flags = up
```

# 自動起動設定
`/var/lib/lxc/test/config`に以下を追記

```
lxc.start.auto = 1
lxc.start.order = 100
```

# ユーザをバインド
以下のサイトを参考に
http://www.clear-code.com/blog/2014/8/6.html

ただし、ホームディレクトリのマウント方法が少し違い、
`/var/lib/lxc/test/config`に以下のように追記する

```
lxc.mount.entry = /home/abcang home/abcang none bind,create=dir
```

# コンテナの起動
```zsh
$ sudo lxc-start -n test
```

# dnsmasqが動いてるか確認
```zsh
$ ping test -c 1
PING test.abcang.net (10.0.3.102) 56(84) bytes of data.
64 bytes from test.abcang.net (10.0.3.102): icmp_req=1 ttl=64 time=0.033 ms

--- test.abcang.net ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.033/0.033/0.033/0.000 ms
```

# メモ
* `apparmor`の導入は諦めた
* 固定IPにしたかったけど、コンテナを追加するたびにdnsmasqを再起動する必要があるが、あまり運用上再起動させたくないので諦めた
* 何故か`/run/lock/lxc`がファイルとして存在していたため、削除した

# 参考
https://wiki.debian.org/LXC
RDSでcsvファイルをインポートしようとして権限エラーになったときの対応


AWS上で MySQL な RDS を利用していたときに発生してて聞かれて調べた件。

クライアント側でもmysqlコマンドが使えるとき。
csv ファイルをimportしようとし、

```mysql
mysql> LOAD DATA INFILE '/home/simeji/data.csv' INTO TABLE simeji.simeji_test FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n';

>> ERROR 1045 (28000): Access denied for user 'simeji'@'%' (using password: YES)
```

こんな感じで Access denied っておこられてしまいました。

`FILE` 権限がないんだなと思って、つけようと試みてみましたが、そもそも RDS の MySQL はセキュリティ周りの問題で `FILE` をはじめ、いくつかの権限がつけれない模様。

ちょっとしらべてたら、[stack overflow の記事](http://stackoverflow.com/questions/1641160/how-to-load-data-infile-on-amazon-rds) を見つけて `LOAD DATA LOCAL INFILE` ならできそうな感じだったので試してみたらできました。

```mysql
mysql> LOAD DATA LOCAL INFILE '/home/simeji/data.csv' INTO TABLE simeji.simeji_test FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n';
```


参考リンク: [MySQL DB インスタンスからのデータのインポートおよびエクスポート(公式ドキュメント)](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/MySQL.Procedural.Importing.html)
EC2インスタンス起動時にインスタンスストアをRAID0にしてswapと任意のディレクトリにマウント

- c3.largeの16GB*2のディスクを
- RAID0にして
- パーティション切って
- 10Gをアプリ置き場(`/srv/www/*/releases`)、残りをswapにマウントする例

下記をrc.localに追記。

```bash:rc.local
# create and mount instance−store disks as raid0(c3.large)
if [ ! -b /dev/md0 -a -b /dev/xvdb -a -b /dev/xvdc ]
then
    umount /dev/xvd[bc]
    yes | mdadm --create /dev/md0 --level=0 -c256 --raid-devices=2 /dev/xvd[bc]
    echo DEVICE /dev/xvdb /dev/xvdc > /etc/mdadm.conf
    mdadm --detail --scan >> /etc/mdadm.conf
    sfdisk /dev/md0 <<EOT
# partition table of /dev/md0
unit: sectors

/dev/md0p1 : start=     1024, size= 20971520, Id=83
/dev/md0p2 : start= 20972544, size= 42980352, Id=83
EOT
    seq 2 | xargs -I{} blockdev --setra 65536 /dev/md0p{}

    # create and mount xfs for application directory
    APPDIR=$(ls -d /srv/www/*/releases)
    APPDIR_OWNER=upuser

    mkfs.xfs /dev/md0p1 -Kf
    [ -e ${APPDIR}/* ] && rm ${APPDIR}/* -rf
    mount -t xfs -o rw,nodev,noatime,nodiratime,nobarrier,discard /dev/md0p1 ${APPDIR}

    chown ${APPDIR_OWNER}: ${APPDIR}
    sed -i -e '/\/mnt/d' -e '/\/dev\/md0p1/d' /etc/fstab
    echo -e "/dev/md0p1\t${APPDIR}\txfs\trw,nodev,noatime,nodiratime,nobarrier,discard,nofail\t0\t0" >> /etc/fstab

    # create and mount swap
    mkswap /dev/md0p2
    swapon /dev/md0p2
    sed -i '/\/dev\/md0p2/d' /etc/fstab
    echo -e "/dev/md0p2\tnone\tswap\tsw\t0\t0" >> /etc/fstab
fi

# deploy itself to master branch
# su ${APPDIR_OWNER} -lc 'cd /opt/capistrano ; cap production deploy'
```

参考:

- [訳：エフェメラルディスクでRAID0 - aws memo](http://understeer.hatenablog.com/entry/2012/03/22/080938)
関心圏と影響圏


「ソフトウェアの世界でキャリアを築く」というSam Lightstoneによる本がある。

色々おもしろいことが載った本であるが、その中でとくに「これは」と思ったのが、David Vaskevitchによる「影響圏と関心圏」という話。

>関心圏 (Circle of Concern) : あれこれ考えたりするすべての事柄の対象範囲

>影響圏 (Circle of Influence) : 自分でコントロール可能

>力が及ぶ事柄のみに、精神的にも感情的にもエネルギーを費やせば、一層仕事のできる人間になれる。自分がインパクトを与えられる事柄に集中すれば、さらに大きなインパクトを引き起こすことも可能になる。

>あるシニアアーキテクト「私は新聞を一切読まない。実際、社会情勢のすべては自分の影響圏外にあるからだ」


今はたくさんの情報が氾濫している。そのどれもをブックマークしても結局はそれらすべてを読み切る時間がない。

それよりは「影響圏」に絞って情報を整理するようにして、「関心圏」の方はたまにざっと目を通す程度にしておくのが良いと思った。
Windowsで必要ディレクトリだけバックアップするバッチファイル

Windowsでデータ類のある特定フォルダだけの部分的なバックアップがしたい時に楽にできるバッチファイルを紹介します。

* 差分ミラーリングなので変化が無い時はコピーを行わず完了します
* 追加ソフトをインストールする必要はありません

# バッチファイル本体

```bat
SET SRC=C:
SET DST=\\nas01\backup\pc01-c-drive


CALL :backup \Program Files (x86)\Steam\xxxxx\screenshots
CALL :backup \Users\user1\Documents\projects
CALL :backup \Users\user1\tool
CALL :backup \Users\user1\pki
CALL :backup \Users\user1\AppData\Roaming\Thunderbird\profiles\XXX.default
CALL :backup \Windows\System32\drivers\etc
exit /b

:backup
robocopy "%SRC%%*" "%DST%%*" /DCOPY:T /MIR /R:3 /W:5 /XD *@nobackup /XF *@nobackup*
exit /b
```

# 解説

## 先頭2行

```bat
SET SRC=C:
SET DST=\\nas01\backup\pc01-c-drive
```

コピー元（バックアップ対象）とコピー先の起点となるパスを指定します。
外付けHDDで `DST=J:` などとしても良いと思います。
上記のようにネットワークドライブでも大丈夫です。

コピー先にコピー元と同じディレクトリ構造が再現されます。

## バックアップ対象を指定している行

```bat
CALL :backup \Program Files (x86)\Steam\xxxxx\screenshots
```

後にある `:backup` サブルーチンを呼び出します。
ポイントとして、スペースが含まれるパスでも **クォートが不要** になっていますので、パスのコピペが楽になります。

ここをサブルーチン化すればSrc-Dstの組み合わせを変えて複数箇所へのバックアップもできそうです。



## backupサブルーチン本体

```bat
:backup
robocopy "%SRC%%*" "%DST%%*" /DCOPY:T /MIR /R:3 /W:5 /XD *@nobackup /XF *@nobackup*
exit /b
```

robocopyを使っています。rsyncみたいなもので、Windowsに標準インストールされたのはVista以降のようです。

ここで触れて置かなければならないのが `%*` の部分。
呼び出す時にクォートを省いたため、実は `%1` に `\Program`、`%2` に `Files` といったように引数が分割されてしまっているのですが、
もう1回スペースで繋げば元に戻るでしょという事で `%*` で元のパスに戻ることを期待しています。
robocopyに渡す時にはちゃんとクォートで括ります。

オプションは `robocopy /?` に載っていますが使ってるものだけ挙げてみます。

オプション|意味
---|---
`/DCOPY:T`|タイムスタンプをコピー
`/MIR`|空ディレクトリもコピー、コピー元に存在しないファイルをコピー先で削除
`/R:3`|失敗時リトライ3回。デフォルトは100万回!なので実質指定必須。
`/W:5`|リトライ時5秒待機。
`/XD *@nobackup /XF *@nobackup*`|フォルダ名かファイル名に「`@nobackup`」が入っていたら除外

ユーザディレクトリ直下を指定する場合、読み取れないファイルがあるので `NTUSER.DAT*` などの除外も必要になります。

# 運用

このやり方だと適宜パスを追加する必要があり、バックアップの存在を常に意識した方が良いのでタスクスケジューラには登録せず、クイック起動バーにこのbatファイルのショートカットを置いて気が向いた時に実行しています。
あえて手動にすることでハードディスク内を整理する動機付けにもなります。
アイコンは `%SystemRoot%\system32\SHELL32.dll` の中からそれっぽいものを選びます。

更にバッチファイル自身はDropboxに入れています。

バックアップは古くからある命題なのでイメージごとやクラウドなど色々なアプローチがありますが、自分の場合これくらい原始的で素朴なバックアップが肌に合いました。
RubyGemsで require_relative エラーが出る件


[Rubyでディスクの空き容量を取得
](http://shokai.org/blog/archives/6372)
を行おうと思ったが、実行すると下記のようなエラーが出た。

```console:
$ ./test.rb
/var/lib/gems/1.8/gems/sys-filesystem-1.1.4/lib/unix/sys/filesystem.rb:1: undefined method `require_relative' for main:Object (NoMethodError)
	from /usr/lib/ruby/vendor_ruby/1.8/rubygems/custom_require.rb:36:in `gem_original_require'
	from /usr/lib/ruby/vendor_ruby/1.8/rubygems/custom_require.rb:36:in `require'
	from /var/lib/gems/1.8/gems/sys-filesystem-1.1.4/lib/sys/filesystem.rb:4
	from /usr/lib/ruby/vendor_ruby/1.8/rubygems/custom_require.rb:59:in `gem_original_require'
	from /usr/lib/ruby/vendor_ruby/1.8/rubygems/custom_require.rb:59:in `require'
	from ./test.rb:4
```

require-relative で検索すると下記のサイトを発見。
[GitLabを5.0にアップデートしたらpush時にエラーが出るようになった件](http://alligatorswamp.hatenablog.com/entry/2013/03/28/231632)
なるほど。rubyのバージョンが古いのか。一応念のため、確認すると

```console:
$ ruby -v
ruby 1.8.7 (2011-06-30 patchlevel 352) [x86_64-linux]
```

古いので削除し、ruby1.9.1をインストール。

```console:
$ sudo apt-get remove ruby1.8
$ sudo apt-get install ruby1.9.1
```

これで問題無いと思ったが、実行すると今度は下記のエラーが出た。

```console:
$ ./test.rb
/usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- sys/filesystem (LoadError)
	from /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
	from ./test.rb:4:in `<main>'
```
あー…またrubygemsでインストールしなきゃいけないのかと思い、rubygemsでインストールを実行。しかし、

```console:
$ sudo gem install sys-filesystem
Building native extensions.  This could take a while...
ERROR:  Error installing sys-filesystem:
	ERROR: Failed to build gem native extension.

        /usr/bin/ruby1.9.1 extconf.rb
/usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- mkmf (LoadError)
	from /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
	from extconf.rb:4:in `<main>'


Gem files will remain installed in /var/lib/gems/1.9.1/gems/ffi-1.9.8 for inspection.
Results logged to /var/lib/gems/1.9.1/gems/ffi-1.9.8/ext/ffi_c/gem_make.out
```

今度はなんだと思い、調べ、
[`require': no such file to load — mkmf (LoadError)](http://stackoverflow.com/questions/7645918/require-no-such-file-to-load-mkmf-loaderror)
を読み、

```console:
$ sudo apt-get install ruby1.9.1-dev
```
を実行。

```console:
$ ./test.rb
230.3896827697754GB中、94.02987289428711GB使用可能
約230.389GB中、94.029GB使用可能
```

これで無事実行できた。

PS:
後で気づいたけど、ruby1.9.3出てるのね。
ruby1.9.3にしても良かったかも
Copying command output directly into clipboard on Linux

I am a Linux user and wanted to just copy the output of commands such as `pwd` to the system clip board without hassles. Here is how:

### 1) Install xclip with apt-get

```bash
$ sudo apt-get install xclip
```

### 2) Pipe command output to xclip

```bash
$ <your command> | c=tr -d '\n' | xclip -selection clipboard
```
For example, this one-liner

```bash
$ pwd | c=tr -d '\n' | xclip -selection clipboard
```

copies the current directory path into the system-wide clipboard. Without the trailing option ` -selection clipboard`, the content copied will not be available to other applications.

### Command Alias
To make life even easier for lazy people like me, create the alias

```
alias "c=tr -d '\n' | xclip -selection clipboard"
```

in your ~/.bashrc, and use it this way:

```bash
$ pwd | c
```

Now you can paste the output of the command anywhere on your machine :)

Reference:
How can I copy the output of a command directly into my clipboard?
http://stackoverflow.com/a/5130969/1478110