OmniAICreator/Qiita-1.07M huggingface dataset:
複数アカウントでs3cmdを使う方法


# 結論

1. 設定ファイルを複数作成します。

    ```
    .s3cfg-account1
    .s3cfg-account2
    ```

2. エイリアスを設定します。

     ```~/.bashrc
     alias s31='s3cmd -c ~/.s3cfg-account1'
     alias s32='s3cmd -c ~/.s3cfg-account2'
     ```

    設定は各自利用している設定ファイルを変更して下さい。zshの人は`~/.zshrc`等。


3. 後は設定したエイリアスで複数アカウントのs3へアクセスしましょう。

    ```bash
    $ s31 ls
    2014-12-09 11:05  s3://bucket1
    2015-02-03 12:16  s3://bucket2
    $ s32 ls
    2015-01-07 10:00  s3://bucket3
    2014-11-25 09:04  s3://bucket4
    ``` 

# 詳細

[S3cmd](https://github.com/s3tools/s3cmd#what-is-s3cmd)とは主にAmazon S3をCLIから利用するのに便利なコマンドラインツールです。

```bash
$ s3cmd ls
```
とするとs3のbucket一覧が見れたりします。

```bash
$ s3cmd --configure
```
でAWSのAccessKeyとSecretAccessKeyを設定すれば`~/.s3cfg`が生成されます。

どのアカウントか分かるようにリネームして必要なだけ.s3cfgファイルを作成すれば良いです。

## Tips

`s3cmd --configure`で以下のエラーが出る時の対策

```
ERROR: Test failed: GPG program not found
```

1. GPGをインストール
  
    ```bash
    $ brew install gpg
    ```

2. GPGのpathを取得

    ```bash
    $ which gpg
    /usr/local/bin/gpg
    ```

3. GPGのpathを`s3cmd --configure`で入力

    ```bash
    $ s3cmd --configure
    Path to GPG program [None]: /usr/local/bin/gpg
    ```
Xamarin Studio with Unity


[Unity](http://japan.unity3d.com/) にデフォルトで付属している [MonoDevelop](http://www.monodevelop.com/) という聞きなれない IDE は、日本語入力が出来ないという致命的な問題があるそうです。そのため、MonoDevelop の後継である [Xamarin Studio](http://xamarin.com/studio) を使うと良いらしいので、使い方などをまとめてみることにしました。

随時、更新して行きます。

## Xamarin Studio

- [Advanced IDE For iOS & Android Programming - Xamarin Studio](http://xamarin.com/studio)

## エディタ

### ショートカット

| キー | コマンド |
|:--|:--|
| ⌘ + d | 定義元へ移動する |
| ⌘ + . | 検索する |
| Ctrl + ⌘ + ← | 直前のコードへ戻る |
| Ctrl + ⌘ + → | 直後のコードへ戻る |
| Shift + ⌘ + d | ファイルに移動する |
| Shift + ⌘ + r | 参照元を検索する |
| Option + ⌘ + ↑ | 参照元の検索結果を前へ |
| Option + ⌘ + ↓ | 参照元の検索結果を次へ |

## デバッグ

### タブ

| 名称 | 概要 |
|:--|:--|
| ウォッチ | 指定したローカル変数を表示する |
| ローカル変数 | ローカル変数一覧を表示する |
| ブレークポイント | ブレークポイント一覧を表示する |
| スレッド | スレッド一覧を表示する |
| コールスタック | コールスタックを表示する |
| イミディエイト | コマンドを実行する |

### ショートカット

| キー | 操作 |
|:--|:--|
| ⌘ + U | ステップを外に進める |
| ⌘ + I | ステップを中に進める |
| ⌘ + O | ステップを次に進める |

### 参考

- [unity付属のMonoDevelopが使いにくいのなんとかした件 #unity | 24nwakahana](http://24nwakahana.wordpress.com/2014/11/11/unity%E4%BB%98%E5%B1%9E%E3%81%AEmonodevelop%E3%81%8C%E4%BD%BF%E3%81%84%E3%81%AB%E3%81%8F%E3%81%84%E3%81%AE%E3%81%AA%E3%82%93%E3%81%A8%E3%81%8B%E3%81%97%E3%81%9F%E4%BB%B6-unity/)
- [安井のブログ: [Unity]Unityで開発するときにデバッガを使用する方法](http://yasuiyasuo.blogspot.jp/2013/05/unityunity.html)
- [Unity-Technologies/MonoDevelop.Debugger.Soft.Unity](https://github.com/Unity-Technologies/MonoDevelop.Debugger.Soft.Unity)
- [Unity - Unity Manual](http://docs-jp.unity3d.com/Documentation/Manual/Debugger.html)
- [[Unity] Unity と Monodevelop を繋いでデバッグしよう!! - Qiita](http://qiita.com/phi/items/32c234bc8c31cae7c740)
わんらいなーおさんぽ

# わんらいなーおさんぽ
お仕事中にとあるログのマッチパターンを作ろうとしたときに、特定箇所に現れる文字の種類を出そうとしてワンライナーをひねくりだしたときの思考回路を書いてみます。
シェルのいろんなコマンド覚えるとテキスト処理はほぼコマンドラインで完結できて楽よね。

## ミッション
こんな感じのログがあります。

```sample.log
2015/02/23 17:00:01 [127.0.0.1] [info] [category] [ID1][AJ349_4gq4g0-][userID1] sample log1
2015/02/23 17:00:02 [127.0.0.1] [info] [category] [ID2][Iw3fajn_q2Q21/3f][userID2] sample log2
2015/02/23 17:01:21 [127.0.0.1] [info] [category] [ID19][q3jnm.z0933_q2-2124][userID19] sample log 3
2015/02/23 17:01:09 [127.0.0.1] [info] [category] [ID43][231kjHfuh3u8jq23][userID43] sample log 0004
```

IDとuserIDフィールドに挟まれた[]内に現れるランダムな文字列に現れる文字の種類を出しましょう。
たとえば一行目では[AJ349_4gq4g0-]の部分ね。

## かんがえちゅう
### まず該当部分の周りを抜き出す
いきなりスパッと出そうと思わないで、シェルはどれだけパイプをつないでも結局はシンプルに順番に処理するだけなので、落ち着いて少しずつ不要部分を切っていけばだいじょうぶ。

とりあえず空白で区切ってみよう。ホワイトスペースや特定文字をデリミタとして文字を分解するならawkがべんり。今回の対象部分の塊はスペースで区切って前から６個目にあるのでこんな感じ。

```Bash
~$ cat sample.log | awk '{print $6}'
[ID1][AJ349_4gq4g0-][userID1]
[ID2][Iw3fajn_q2Q21/3f][userID2]
[ID19][q3jnm.z0933_q2-2124][userID19]
[ID43][231kjHfuh3u8jq23][userID43]
```

### もうちょっと抜き出す
ココからさらに真ん中だけが欲しい。
よく見てみるとこの場合は、 ][ をデリミタにすればキレイにいけそうなので、今度はデリミタを指定する-Fオプションをつけてawkを追加。]と[はメタ文字なのでエスケープしてあげましょう。

```bash
~$ cat sample.log | awk '{print $6}' | awk -F"\]\[" '{print $2}'
AJ349_4gq4g0-
Iw3fajn_q2Q21/3f
q3jnm.z0933_q2-2124
231kjHfuh3u8jq23
```

### 分解する
なんとかして１文字１文字を出してuniqすればいいんですが、uniqは行単位なのでまず先に全ての文字を１行に１つずつ出してしまいましょう。
ここではsedを使って全ての文字の後ろに改行をつけてしまいます。

```bash
~$ cat sample.log | awk '{print $6}' | awk -F"\]\[" '{print $2}' | sed -E "s/(.)/\1\n/g"
A
J
3
4
9
_
 ... (略)
```

sed -E がうまく動かない(or そもそも無い)サーバではPerlのワンライナーあたりをこねくり回せばほぼ変わらない手間でサックリ書けます。
むしろ最初からPerl覚えちゃったほうがいろいろ楽かもしれないのは気にしてはいけない。

```bash
~$ cat sample.log | awk '{print $6}' | awk -F"\]\[" '{print $2}' | perl -lne 's/(.)/\1\n/g; print;'
```

### 最後に
コマンドラインでテキスト処理してるとだいたいお約束なのはsort + uniqですね。ついでに単品のxargsを添えれば見やすくなります

```bash
~$ cat sample.log | awk '{print $6}' | awk -F"\]\[" '{print $2}' | sed -E "s/(.)/\1\n/g" | sort | uniq | xargs
- . / 0 1 2 3 4 8 9 A H I J Q _ a f g h j k m n q u w z
```

## 結局何してたのか
sample.logなかんじのフォーマットのログをtd-agentでパターン書いて転送してたんですが、たまにログ抜けるなーと思っていたら、該当部分を ```\[\w*\]``` っていうパターンで書いていたために、```\w```でカバーできない文字が紛れ込んでいてマッチしなかったっていう事案でした。

ついでに、\wって[0-9a-zA-Z]だと思ってたけど地味にアンダースコアも含まれてるのね。

## おさらい
<dl>
<dt>cat</dt>
<dd>ファイル内容を出力するだけの存在。一応複数ファイルを渡すと結合できるという隠し機能がある。</dd>
<dt>awk</dt>
<dd>ワンライナーの強い味方。普段はホワイトスペース区切りの特定の位置を出すくらいだが、その力を理解し使役すればawkスクリプトという霊験あらたかなものを作ることができるようになる。</dd>
<dt>sed</dt>
<dd>テキスト置換の強い味方。便利だけど稀によくサーバにインストールされていない。覚醒させると"全ファイル内を捜索してすべてのマッチした部分を置換する"というマップ兵器が使えるがだいたい暴発してえらいことになる。</dd>
<dt>perl</dt>
<dd>全てを統べる神。最近忘れ去られがち。</dd>
<dt>sort / uniq</dt>
<dd>並べ替えて、重複を削除するというシンプルだが強力な一手。言うなれば魔神剣と虎牙破斬。</dd>
<dt>xargs</dt>
<dd>敵の攻撃を吸収して撃ち出す必殺技。すべて合わせて一気に撃ち出すか一つ一つ撃ち出すかを選べるオプションも搭載されている。</dd>
</dl>
WebAPI The Good Parts 読んで WebAPI設計する上で気になった点

- WebAPI The Good Parts
    - 真新しい内容はないけどなんとなくでやりがちな部分に答えを出しているのがよかった。
    - WebAPIを作ったことはあるけど本気で設計を考えたことなかった、みたいな人にはいい一冊だと思った。

## URLについて
- URLに大文字や小文字を混在させるべきではない
- 単語を繋げなくては行けない場合はハイフンがいい
 - *個人的には_が一般的だと思うんだけど・・・・*
- パラメータやフィールド名で迷ったら、http://www.programmableweb.com/ で似たような事例の単語に合わせるほうが無難
- searchという単語
 - リストの一機能として絞込を提供するならsearchというエンドポイントで切る必要はないね（リストに絞込機能をもたせればいいね）
 - リストは全部返す、検索用はあくまでこれ、という立て付けであればsearchAPIを設けるべき
 - 検索に find という単語は使わないのが一般になってる
- 相対位置指定と絶対位置指定
 - 相対位置指定＝pageとnumber指定のタイプ
 - 絶対位置指定＝ID:xxx以降の20件取得,timestamp:XXX以降の20件、など
 - 絶対位置指定なら検索中に投稿されてもズレが生じない
- OAuth2.0認証つきのAPIで自分のリソースへのアクセスについて
 - いちいち自分のidを取得するステップを踏ませてしまうのではなく、meやselfという文字列を指定するようにするAPIが多い

## LSUDs SSKDs
- LSUDsとSSKDs
 - LSUDs = Large set of unknown developers
    - 不特定の開発者たちに叩かれるAPIのことを指す
 - SSKDs = Small set of known developers
    - 開発者が身内でしかない、身内にしか公開しないAPIのことを指す
 - LSUDsは汎用的に、SSKDsはもっとクライアント寄りに設計する

- オーケストレーション
    - LSUDs→SSKDsへの変換
    - クライアントとWebAPI間に置く
    - WebAPIへリクエストし、各クライアントへ最適化したAPIを提供する
    - オーケストレーション層の開発者＝アプリ（クライアント）の開発者
    - Netflixが発表して浸透している考え方

## Hypermedia API
- HATEOAS（hypermedia as the engine of application state）
    - マーティン・ファウラーの提唱するREST LEVEL3における考え方
    - ハイパーテキストをリンクでつないだもの＝ハイパーメディア
    - APIで操作するリソースにも同じ考えを導入したもの
    - 次にユーザが取る行動をリンクとしてレスポンスに含める
    - たとえばユーザ一覧を返すAPIのリンクには各ユーザの詳細が引けるAPIへのリンクを含める、など
    - クライアントが予めエンドポイントを知らなくてもAPIが叩ける
    - 人間がサイトをたどっていくのと同じ
    - 返ってきたリソースが何なのか、はメディアタイプを使って返している
    - HAL
- エンベロープは不要
    - httpのセマンティクスに乗っているから
- jsonトップレベルを配列にして返さないほうがよい
    - トップレベルをオブジェクトで包めば配列にkey(名前)がつけられるので内容がわかりやすくなる
- メンテナンスは Retry-After ヘッダ
- キャッシュはHTTPキャッシュ RFC7234を使うのもよい
    - ヘッダで時刻を表現する場合はRFC1123を使うこと
    - Last-Modified、ETag  
- クロスオリジンリソース共有 CORS
    - IE8,9は非対応

## バージョニング
- URIのパスでバージョニングが一般的
- メディアタイプでバージョニング
    - githubなど
    - 日付でバージョニングは古くて冗長で流行ってない
    - パラメータでバージョニングだと指定ない場合のバージョンが明確ではない
- BlackOutTest
    - 旧バージョンのAPIを廃止する際に一時的に落としてテストする

## セキュリティ
- XSRF対策
    - 状態を変えるAPIはGETを使わない
    - ワンタイムトークンを使う
- JSONハイジャック
    - scriptタグは同一生成元ポリシーが有効ではない
Nginxの設定内で環境変数を使いたい

Nginx の設定内では環境変数を読み込むことは基本的にできません．しかし lua-nginx-module を使うと環境変数を読み込むことができます．やり方を簡単に紹介します．

```nginx.conf
env PATH;

set_by_lua $upstream 'return os.getenv("PATH")..":9000"';
```

引き継ぎたい環境変数は `env` で指定をする必要があります．指定しないと以下の様なエラーが出ます．

```
[error] 7#0: *1 failed to run set_by_lua*: set_by_lua:1: attempt to concatenate a nil value
stack traceback:
        set_by_lua:1: in function <set_by_lua:1>, ...
```

文字列結合は `..` を使います．一々環境変数を取得するだけで lua が必要なのは手間と言えば手間ですが普通に使えるので機会があれば使ってみてください．
werckerでsbtを使ってビルドする方法

werckerでsbtを使ってビルドしようとすると、JDKもsbt自体もなくて難儀した。
試行錯誤の末、 `sbt test` や `sbt dist` できるような **wercker.yml** が書けた。

## JDK 8をインストールするbuildステップ
どうやらUbuntuが使われているようなので、以下を参考にscriptに追加する。

> [ubuntuでoracle-jdk8をインストールしておく](http://qiita.com/civic/items/daefe465600ca45d6c11)

werckerで自動化する場合は、JDKインストール時に対話的に聞かれる部分をクリアする必要があるので、それも追加。

```yaml
        - script:
            name: install JDK
            code: |
                sudo add-apt-repository -y ppa:webupd8team/java
                sudo apt-get update
                echo debconf shared/accepted-oracle-license-v1-1 select true | sudo debconf-set-selections
                sudo apt-get install oracle-java8-installer
```

## sbtをインストールするbuildステップ
PATHに追加しておかないと、次のステップで実行できないことに注意


```yaml
        - script:
            name: install sbt
            code: |
                mkdir bin
                cd bin
                wget https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/sbt-launch/0.13.7/sbt-launch.jar
                echo 'SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M"' > sbt
                echo 'java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@"' >> sbt
                chmod u+x sbt
                export PATH=$PATH:`pwd`
```

## 全文
```wercker.yml
box: wercker/default
build:
    steps:
        - script:
            name: install JDK
            code: |
                sudo add-apt-repository -y ppa:webupd8team/java
                sudo apt-get update
                echo debconf shared/accepted-oracle-license-v1-1 select true | sudo debconf-set-selections
                sudo apt-get install oracle-java8-installer
        - script:
            name: install sbt
            code: |
                mkdir bin
                cd bin
                wget https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/sbt-launch/0.13.7/sbt-launch.jar
                echo 'SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M"' > sbt
                echo 'java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@"' >> sbt
                chmod u+x sbt
                export PATH=$PATH:`pwd`
        - script:
            name: test
            code: sbt test
        - script:
            name: build
            code: sbt dist
```
「WordPressプラグイン開発のバイブル」を読みながらハマったところ

# 最初に
　「[WordPressプラグイン開発のバイブル](http://www.amazon.co.jp/dp/4797373520)」は、いい本です。WordPressで開発をする人は是非買おう。

　本に書かれていることを愚直に実施したときに、あれ？っと思った箇所をメモします。ほとんど自分自身のスキル不足が原因です。

# 実行環境
- Windows 7 (64bit)
- 「Wordpressプラグイン開発のバイブル」初版
- 2015年2月23日に実施
- 2015年2月24日追記：第１０章の部分。



# ハマったところ
## 【第３章】プラグインの開発環境を作る
### Vagrantのインストール
インストール後、VCCWにてVagrantにセットアップされたOSにログイン使用とした時、初期パスワードがわからなかった。MySQLのID/Passは設定ファイルに記載されているのを見つけられたけど、OSへログインIDなどの記載は見つけられず。

正解は
> ID: vagrant
> Pass: vagrant

vagrantを使ってのインストールは初めてだったのでハマった。
ちなみにセットアップされるOSは、CentOS 6.6でした。


## 【第４章】プラグインの開発環境を作る
### PHP_CodeSniffer関連
VCCWで作られた環境内でやろうとしたら、"permission denied (publickey) "と表示されてgit cloneできず。なんでcloneできないんだろと考えてもVirtualBoxとLANの２重NAT状態だからかなと想像したものの、解決できる手段がないので、別方法の解決方法を探ることに。

バイブル上には
>$ git clone git@github.com:WordPress-Codeing-Standards/com:WordPress-Codeing-Standards.git ～

と書いてあるところを
>$ git clone -b master https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards.git ～

に書き換えて実行。これでgit clone問題 解決。

### WordPress-Coding-Standards が設定されてない
バイブルには 
> phpcs -p -s -v --standard=Wordpress my-plugin.php 

とあるもののアレ？なんかエラーでる。調べてみたら登録が必要な模様。
> phpcs --config-set installed_paths /path/to/wpcs

という感じの登録が必要だった模様。

参考サイト
* http://www.d-wood.com/blog/2014/09/12_6884.html）
* https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards


### はじめてのプラグインを作る
ファイルヘッダを記述するのが思いの外 面倒。素直に３章で紹介されているプラグイン：[Pluginception](https://wordpress.org/plugins/pluginception/)を利用するか、１０章を先に読んでWP-CLIでプラグインのひな形を生成したほうが楽でした。

## 【第１０章】 PHPUnitでプラグインのテスト駆動開発を行う
### PHPUnitテスト用のWordPress環境を準備する(1)

WP-CLIでプラグインのひな形を作ったあとに、素のプラグインをPHPUnitでテストを実行しようとするところで、コマンドラインでPHPUnit専用のWordPressをインストールするところがあります。

> $ bash bin/install-wp-test.sh ～

VCCWの再起動もなにもしていない状態で、このコマンドを実行した時、Wgetで最新版のWordPressを取得するタイミングで/tmp/wordpress.tar.gzにダウンロードできなくて止まってしまうようです。

/tmpをみると、ダウンロード済みのwordpress.tar.gzがrootユーザーでダウンロードされているため、パーミッションのエラーが発生してるようです。同じく/tmp/wordpress-tests-lib/以下もrootユーザーで作成されているのでパーミッションエラーが発生します。

おそらく、VCCWのセットアップ時にroot権限でダウンロードされたものだと思いますので、ざっくりと/tmp/wordpress.tar.gzや/tmp/wordpress-tests-lib/を`sudo rm -rf /tmp/wordpress*`などで削除したほうがスムーズに進められるかも。

### PHPUnitテスト用のWordPress環境を準備する(2)
ページ順に手を動かして学習しているとP223で、PHPUnitテスト用のWordPress環境を準備することになりますが、その後の１０章４項の「ショートコードプラグインをテスト駆動開発で作る」の中でも同じことをしています。VCCWを使っている場合、VCCWにそって話を進めている１０章４項でチャレンジすることをおすすめします。


# 終わりに
まだプラグインを作るところまで進んでいません。ちょっとずつ読み進めていきたい所存。
Capistranoのuploadでリモートとローカルのファイルを比較して上書き確認する

用途としては、サーバー上の設定ファイルをマニュアルで何度も変更して検証する場合や、複数の人がサーバー上の設定ファイルを変更する可能性がある場合など、その後再デプロイするときに設定ファイルの戻し忘れによる事故を防ぐために使う

例は`.env.production`のアップロード ([dotenv-deployment](https://github.com/bkeepers/dotenv-deployment) gem)

```rb
filepath = ...
remote_filepath = "#{shared_path}/.env.production"

if test("[ -f #{remote_filepath} ]")
  local_content = File.read(filepath)
  remote_content = capture("cat #{remote_filepath}")
  if local_content.strip == remote_content.strip
    puts "Skip uploading of #{filepath} because files are identical"
  else
    puts "Diff of #{filepath}"
    puts "--- Local file ---"
    puts local_content.strip.split("\n") - remote_content.strip.split("\n")
    puts "--- Remote file ---"
    puts remote_content.strip.split("\n") - local_content.strip.split("\n")
    puts
    ask(:continue_upload, "Do you continue `deploy:upload_dotenv`? [y/n]")
    if fetch(:continue_upload) == 'y'
      upload!(filepath, remote_filepath)
    end
  end
else
  upload!(filepath, remote_filepath)
end
```

ログの出力例

```
Diff of config/deploy/.env.production
--- Local file ---
FOO=12345678
BAR=abcdefg
--- Remote file ---
FOO=00000000

Please enter continue_upload (Do you continue `deploy:upload_dotenv`? [y/n]): y
DEBUGUploading config/deploy/.env.production 0.0%
INFOUploading config/deploy/.env.production 100.0%
```

あまりきれいだと思わないが、とりあえず動く


---

Capistranoには独自の`ask`メソッドがある
https://github.com/capistrano/capistrano/blob/master/lib/capistrano/configuration.rb

参考：[Writing Capistrano Tasks](http://vladigleba.com/blog/2014/04/10/deploying-rails-apps-part-6-writing-capistrano-tasks/)
Vagrantの実行環境のバージョンアップ

MacBookのOSをバージョンアップしたので、Vagrantとvirtualboxも最新化したときの手順。

###環境###
MacBook 13-inch, Late 2009　Mac OS X Yosemite 10.10.2

| 対象AP | 現 | 新 |
|:-----------|------------:|:------------:|
| Vagrant       |        1.6.5 |     1.7.2     |
| VirtualBox     |      4.2.16 |    4.3.22    |


###手順###
操作はMacBookのターミナルで実施する。

バージョンの確認

```
$ vagrant version
**Installed Version: 1.6.5**
Latest Version: 1.7.2
：
```

vagrantの起動状態を確認する

```
$ vagrant status
Current machine states:

default                   running (virtualbox)
```

起動中（running）の場合は停止する。停止中の場合はアップデートへ進む。

```
$ vagrant halt
==> default: Attempting graceful shutdown of VM...
```

停止（poweroff）したことを確認する。

```
$ vagrant status
Current machine states:

default                   poweroff (virtualbox)
```

アップデートする
　・Vagrant 1.7.2 MAC OS X Universal (32 and 64-bit)　\[[ダウンロード](http://www.vagrantup.com/downloads.html)\]
　・VirtualBox 4.3.22 for OS X hosts  x86/amd64　\[[ダウンロード](https://www.virtualbox.org/wiki/Downloads)\]
　・それぞれダウンロードしたファイルをクリックしインストールを実行する

アップデートされたことを確認する（Installed Version:が1.7.2）

```
$ vagrant version
**Installed Version: 1.7.2**
Latest Version: 1.7.2
```

Vagrantを起動する

```
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
  :
==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> default: to force provisioning. Provisioners marked to run always will still run.
```

エラーなく起動すればバージョンアップは成功。起動状態（running）を確認する。

```
$ vagrant status
Current machine states:

default                   running (virtualbox)
```

ssh接続する

```
$ vagrant ssh
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic-pae i686)
```

リモート接続したことを確認（unameで接続ホストを確認）。

```
$ uname -a
Linux precise32 3.2.0-23-generic-pae #36-Ubuntu SMP Tue Apr 10 22:19:09 UTC 2012 i686 i686 i386 GNU/Linux
```

完了です。
BrowserifyでNodeコアモジュールを置き換える

Browserifyでbundleするとき、`require`したNodeコアモジュールも結合される。ほとんどのコードはブラウザ上でも動くが、IOの発生するモジュールのみ同じインターフェースを持つブラウザ向けモジュールに置換される。

Browserifyの`require`したモジュールを結合する仕組みは、コアモジュールでも同じなので、`-r`オプションで置き換えの対象とすることができる。例えば`require('http')`すると[http-browserify](https://github.com/substack/http-browserify)に置換されるが、これをforkしたモジュールを使ってbundleすることもできる。

```bash
$ npm install MisumiRize/http-browserify
http-browserify@1.7.0 node_modules/http-browserify
├── inherits@2.0.1
└── Base64@0.2.1

$ browserify app.js -r http-browserify:http > bundle.js
```

単純に考えれば`require`の仕組みはコアモジュールとそれ以外とで同じなので、`-r`で何も問題なかった。JavaScriptからだとこう書く。

```js
browserify(['./app.js'])
  .require('http-browserify', {expose: 'http'})
  .bundle(function(err, src) {
    console.log(src);
  });
```
Realm でマイグレーションするときのバージョン問題の対応


# はじめに
Android の Realm のマイグレーションのサンプルコードを見ると、

> The API for migration is currently using internal lower level classes that will be replaced by a new API very soon! Until then you will have to explore and use below example as inspiration.

なんて記述があり、まだまだマイグレーションの API が荒削りなのが現状です。

で、実際にマイグレーションを考えた時に、バージョンの問題にぶつかったのでその時のメモです。
同じ問題に悩んでいる方、これから導入を考えている方などの参考になれば幸いです。

# マイグレーション手順
詳細な手順については、[サンプルコード](https://github.com/realm/realm-java/tree/master/examples/migrationExample/src/main/java/io/realm/examples/realmmigrationexample)を見ていただければわかると思うので割愛します。

下記コードはサンプルコードの抜粋です。マイグレーションは Realm のバージョンを見て、必要な処理を段階的に実行し、最新化するという流れです。

``` Migration.java
public class Migration implements RealmMigration {
    @Override
    public long execute(Realm realm, long version) {

        // Migrate from version 0 to version 1
        if (version == 0) {
            // マイグレーション処理
            version++;
        }

        // Migrate from version 1 to version 2
        if (version == 1) {
            // マイグレーション処理
            version++;
        }

        return version;
    }
}
```

# 問題点

スキーマが進化しつづけようと、インストール時などの初回セットアップ時にはバージョンが 0 となります。そのため、適切なバージョンにアップデートしてあげないといけないのですが、その方法が用意されていません。

## 対応方法
初回起動時、Realm のファイルの存在チェックをして、ファイル生成後に以下のマイグレーションコードを実行してあげれば OK です！

```java
Realm.migrateRealmAtPath(file.getAbsolutePath(), new RealmMigration() {
    @Override
    public long execute(Realm realm, long version) {
        return 2; // 現在のスキーマのバージョンをセットする
    }
});
```

中の人の回答なので、これがいい方法なのかなと思います。
https://github.com/realm/realm-java/issues/886

マイグレーションの API は、現在 v2 を開発中のようなので、動向が気になる方は、以下をチェックするといいと思います。
https://github.com/realm/realm-java/pull/880

# おわりに
[公式 Twitter](https://twitter.com/realm) のメッセージ、GitHub の Issue のどちらもかなりレスポンスが早く、とても好感を持つようになりました。

まだまだ情報が少ない現在ですので、実際に導入されている方がいましたら情報交換させていただけると嬉しいです！
DartのGeneratorでフィボナッチ数列 (同期版)

# はじめに
もうすぐDart 1.9がリースされるので、新規に正式サポートされるGeneratorを使ってフィボナッチ数列を生成してみました。
Dartの最新仕様ECMA-408 2nd EditionのGeneratorには同期版(```sync*```～```yield```)と、非同期版(```async*```～```yield```～```await```)が有ります。
ここではDart 1.9でサポート予定の同期版です。

なお、実行確認は現時点のDev版、version:1.9.0-dev.8.0 (Thu Feb 12 03:13:11 2015) on "windows_x64"、ビルド番号43715で行っています。

# 実装

### フィボナッチ数列生成関数(同期Generator版)
<a href="https://try.dartlang.org/">Try Dart!</a>にはフィボナッチ数を再帰計算で求めるサンプルがありますが、ここではフィボナッチ数列を求めます。
一つ前ともう一つ前の値を覚えておいてループの中で足し算するのが素直ですね。

```dart
Iterable<int> fibo() sync* {
  int lastBut1 = 0;
  int last = 1;
  int ret;

  yield lastBut1;
  yield last;

  while (true) {
    ret = lastBut1 + last;
    lastBut1 = last;
    last = ret;
    yield ret;
  }
}
```
ポイントは```Itarable```、```sync*```と```yield```です。

### コールサイト```Iterable``` ```for```...```in```版
次にGenerator関数を呼び出す側です。
まずはシンプルにIterableならではの```for```...```in```版です。

```dart
const COUNT = 100;

void main() {
  int i = 0;
  for (int f in fibo()) {
    print("fibo($i) = $f");
    i++;
    if (i >= COUNT) break;
  }
}
```
せっかくの```for```...```in```ですが、無限数列なのでループカウンタを導入して適当なところで```break```しています。
ちゃんと```Iterable```として扱えました。

### ```Iterator```版
次はIterator版です。
終了条件にループカウンタが必要なので、これはこれで素直かもしれません。

```dart
  Iterator itr = fibo().iterator;
  for (int i = 0; itr.moveNext() && i < COUNT; i++) {
    print("fibo($i) = ${itr.current}");
  }
```
ところで、DartにC言語でいうところのカンマ演算子は無いんですね。
ということで、```Iterator```の初期化は```for```文の外で行っています。

他方で、```moveNext()```は```false```返したらそれがループ終了条件なので、お作法として```for```文の中、継続条件のところで実行しています。
今回の```moveNext()```は永久に```true```ですけどね。

### ```Iteratable```関数パイプライン版
次は```Iteratable```に戻って、関数パイプラインで実現してみます。
無限数列なのでなんとかして止めなければいけません。
```takeWhile()```というフィルタ関数で```Iterable```を切り詰めると良いようです。

```dart
  int i = 0;
  fibo().takeWhile((_) => i < COUNT).forEach((f) {
    print("fibo($i) = $f");
    i++;
  });
```
Dartはクロージャをサポートするので```takeWhile()```、```forEach()```内でもループカウンタが参照できてます。

### Iteratable関数パイプライン版2
何番目のフィボナッチ数かを表示しなくて良いならば、ループカウンタを省いてずっと簡単に書けます。

```dart
  fibo().take(COUNT).forEach((f) => print("fibo = $f"));
```
実は、というか当然ながら、```take()```内部にはカウンタがあります。
それでも、アプリ側で気にする必要がないのが利点です。

# 感想
やっぱ速いですね。
<a href="https://try.dartlang.org/">Try Dart!</a>の再帰版フィボナッチ数計算プログラムと比べると圧倒的に速いです(体感ですが)。
もっとも、<a href="https://try.dartlang.org/">Try Dart!</a>はO(N²)、本プログラムはO(N)なので比較するのも何ですが。

また、```fibo()```が本質的にループする処理でありながら、ループ終了条件や、得られた値をループ内で利用する処理(今回は```print()```のみ)を分離して、純粋にフィボナッチ数列を求める処理として実装できるのは、やはり素晴らしい。

# おわりに (次は非同期版だ)
非同期版がサポートされた時点でまた紹介します。
今回のデジャブを体験することになりそうです。
Fluentd inputした内容をどこかでマッチさせないと警告ログが出まくる

受け取ったタグは必ず何かにマッチさせましょう。
出力はnullでもよいです。
そもそも不要なインプットをしなければよい話ですが
何らかの理由で必要な際は気をつけてください。

```rb
# 最後に処分
<match **>
    type null
</match>
```
型付きマクロ

多相バリアントと再帰型があれば，静的型付きマクロが実装できる．型推論もできるし，当然ASTを受け取ってASTを返す「真の」Lispのマクロである

```ocaml
type ast = [`id of string | `cons of ast * ast | `abs of [`id of string] * ast | `nil ]
let let1 : 'a -> ast = function
  | `cons(pat, `cons(expr_1, `cons(expr_2, `nil))) -> `cons(`abs(pat,expr_2),`cons(expr_1, `nil))
let rec letn = function
  | `cons(`nil, `cons(expr,`nil)) -> expr
  | `cons(`cons(pat, `cons(expr_1, decls)),`cons(expr_2,`nil)) -> let1 (`cons(pat,`cons(expr_1, `cons((letn (`cons(decls,`cons(expr_2,`nil)))),`nil))))
let x = let1 (`cons(`id "a", `cons(`id "b", `cons(`id "c", `nil))))
let y = letn (`cons(`cons(`id "b", `cons (`id "c", `cons (`id "d", `cons (`id "e", `nil)))), (`cons (`id "a", `nil))))
```

ocamlc -i で推論された型

```ocaml
type ast =
    [ `abs of [ `id of string ] * ast
    | `cons of ast * ast
    | `id of string
    | `nil ]
val let1 :
  [< `cons of
       [ `id of string ] * [< `cons of ast * [< `cons of ast * [< `nil ] ] ] ] ->
  ast
val letn :
  [ `cons of
      ([< `cons of [ `id of string ] * [< `cons of ast * 'a ] | `nil ] as 'a) *
      [ `cons of ast * [ `nil ] ] ] ->
  ast
val x : ast
val y : ast
```

let1 や letn の型を注意深く見て欲しい．
let1 の型は， `(let1 x y z)` と呼び出したとしたら， ``x : [`id of string]`` ``y : ast`` ``z : ast`` である制約になっている．
Emacs で文章書いてる時に意図せず紛れ込んだ一句を探しだす flycheck-ikku

掲題の問題を解決するために作成した [gongo/emacs-ikku](https://github.com/gongo/emacs-ikku) という一句抽出 Emacs Lisp と、これを利用した `flycheck-ikku` を紹介します。

## 経緯

報告書やポエムを書く時に Emacs をお使いの皆様は、やはり普段から自身の言葉にさりげなく一句を含ませていることだと思います。日本の文化に触れること、とても良いと考えております。その気持ちを忘れずに今後ともよろしくお願い致します。

ですが毎回そういうわけにもいきません。報告書に情緒的意味を持たせるつもりもなく、只々あるがままを伝えるつもりだった。ただそれだけですが、難解な日本語を書くとなるとやはり意図せず紛れ込んでしまいます。そしてチェックをした上司からこう言われるわけです。

> 「これ一句じゃん」

俺はそんなことをチェックして欲しいわけじゃない。あるがままを伝え、それをチェックして欲しいだけなのに、つい一句が紛れ込んでしまった所為で話があらぬ方向へ。俺が求めるレビューじゃない。一句だ。一句が紛れ込んでいるのがいけないんだ。

ならば機械的にチェックしよう。

## 解決方法

Emacs には [Flycheck](https://github.com/flycheck/flycheck) というシンタックスチェッカーがあります。Vim でいう `Syntastic` みたいなものでしょうか。簡単に述べると、ファイル保存時 [^1] にそのファイルをチェックし、例えば `php-mode` であれば [PSR-2](http://www.php-fig.org/psr/psr-2/) に沿った書き方をしているか、`go-mode` であればコンパイルできる状態かどうか、などなど。人の意思に干渉されない部分を機械的にチェックしてくれる便利な Emacs Lisp です。

話を前項に戻すと

> 一句が紛れ込んでいるのがいけないんだ。

自身が意図せず書き込んでしまった「一句」を **機械的** にチェックできれば、そしてそれを教えてくれれば、事前に一句をただの現代語に変換し、スムーズなレビュワーへのバトンタッチが可能なのではないか。

## emacs-ikku

flycheck で一句を判断する前段階として、まずは [gongo/emacs-ikku](https://github.com/gongo/emacs-ikku) を作成しました。

```el
(require 'ikku)

(let ((song (ikku/find "ああ古池や蛙飛び込む水の音ああ")))
  (ikku:song-to-string song)) ;; => "古池や 蛙飛び込む 水の音"
```

詳しい使い方は README やソースコード、参考リンクをご参照下さい。

## flycheck-ikku

`emacs-ikku` を flycheck プラグインとして呼び出せるように [emacs-ikku/flycheck-ikku.el](https://github.com/gongo/emacs-ikku/blob/master/flycheck-ikku.el) を作成しました。

### デモ

![ikku.gif](https://qiita-image-store.s3.amazonaws.com/0/6635/bf4f28d1-5f3c-c23a-eebc-34126a793286.gif)

`flycheck-mode` が有効の時に

```
M-x flycheck-select-checker RET ikku-checker
```

を実行すると、現在開いているバッファから一句を探し出し、その部分をハイライトします。

```el
(setq flycheck-highlighting-mode 'columns)
```

とかしておくと、一句の始まりの一語にハイライトされます [^2]

![スクリーンショット 2015-02-23 21.26.01.png](https://qiita-image-store.s3.amazonaws.com/0/6635/a5779c60-0414-40b3-aea2-6c34c78e02d9.png)

もし全ての major-mode でこのチェッカーを発動したい場合は下記を実行していただければ。

```el
(add-to-list 'flycheck-checkers 'ikku-checker)
```

ちなみに今回デモとして使った文章は [感謝駆動開発 TDD (Thanks Driven Development)](http://d.hatena.ne.jp/gongoZ/20110304/1299213582) のものです。4年前にも既に一句を紛れ込ませていたと考えると、感慨深いものがあります。

## SPECIAL THANKS

`emacs-ikku` の中を読んでいただければわかると思いますが [r7kamura/ikku](https://github.com/r7kamura/ikku) のほとんどを Emacs Lisp にコンバートしただけのものとなっております。圧倒的感謝。いつまでもついていきます！ [^3]

## 補足: flycheck チェッカーを作ってはみたものの

他の flycheck ファミリーを見ると、ほぼ外部コマンドに投げたり非同期実行しています [^4]。
現状の `flycheck-ikku` は同期実行なので、もしかしたらテキスト量が増えるとそれだけ固まる可能性があります。いつか非同期にします。多分しません。

## まとめ

無意識に一句詠んでいきましょう。

## おわりに

わたしは一句紛れてても気にしないので多分使いません。

## 参考

- [emacs-ikku / 文章の中から一句を探し出す - Thanks Driven Life](http://gongo.hatenablog.com/entry/2015/02/23/203242)
- [Slackの会話を元に一句詠む - Qiita](http://qiita.com/r7kamura/items/3ef8f4fbe6b722674a96)
- [Flycheck — Modern Emacs syntax checking — Flycheck 0.23-cvs](https://flycheck.readthedocs.org/en/latest/)

[^1]: バッファ変更中に発動する時もある
[^2]: 今のところ、行の中に空白などの mecab が未知語と判断したやつが混ざってるとずれます
[^3]: 判定するロジック更新されたら多分そのまま使います。
[^4]: 通常チェッカー定義に使う `flycheck-define-checker` は外部コマンド前提だったので、今回は `flycheck-define-generic-checker` を使用した
Capistranoで特定のファイルをデプロイ時に削除（除外）する

[Excluding files from being deployed with Capistrano](http://stackoverflow.com/questions/2558249/excluding-files-from-being-deployed-with-capistrano-while-still-under-version-co)
[Capistranoでデプロイ時に特定のファイルをデプロイ対象から外す](http://d.hatena.ne.jp/nekonokataomoi/20141217/1418817374)

`.gitattributes`ファイルを作成

```:.gitattributes
.gitattributes export-ignore
.gitignore export-ignore
features export-ignore
spec export-ignore
```

自分の場合はrbenvの`.rbenv-version`を除外した。
`spec/`とすると除外されないことがあった。`spec`で除外された。
(Gitのバージョンなどで違うかもしれない)
[参考: StackOverflow git archive : export-ignore, ignoring directories](http://stackoverflow.com/questions/21832151/git-archive-export-ignore-ignoring-directories)
ListViewを独自のレイアウト　

あまり参考にならないと思いますが・・・・
ListViewで単なる文字列の羅列でない場合のメモ
並べるのは、画像と文字列です。


@Override


    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 表示させるデータを設定する。
        // データを格納するためのArrayListを宣言
        ArrayList<HashMap<String,Object>> outputArray = new ArrayList<HashMap<String,Object>>();
        // ↑ここがポイント１//HashMapは連想配列とも呼ばれ、要素を格納する時に要素に対応するキーを合わせて登録します。


        int maxLength = 5;

        for( int i = 0; i < maxLength; i++ ) {
            HashMap<String, Object> item = new HashMap<String, Object>();
            // 画像の設定（とりあえず全ての項目に同じ画像を入れています。）
            item.put("image", R.drawable.image1);
            // 文字列の設定（とりあえず、ループのカウンタを表示させています。）
            item.put("name","name1");
            item.put("place","place1");
            // 表示用のArrayListに設定
            outputArray.add(item);
        }

        // 画像表示用に作成したCustomAdapterに、上記ArrayListを設定
        SimpleAdapter myAdapter = new SimpleAdapter(
                this,
                outputArray,
                R.layout.row,  // ここがポイント２
                new String[]{"image","name","place"
                }, // ここがポイント３－１

                new int[]{R.id.image,R.id.name,R.id.place} // ここがポイント３－２
        );

        // ListViewにmyAdapterをセット
        ListView listView = (ListView)findViewById(R.id.myListView);
        listView.setAdapter(myAdapter);

    }
Unity4.6からの新GUI(uGui)の Slider or ScrollBar のパラメタをほかのGameObjectで受け取る

[このサイト](http://wannabe-note.com/998)などをみると、おおむねの使い方はわかります。
が、スライダーの変化量を自分の好きな変数に取り込む、またはスライダーに変化があったときに変化量から何かしたい場合にどうしたらいいのか、情報を見かけなかったのでTIPSを記しておきます。
UnityでC#を始めた、プログラムはUnityで初めて…な人たちの助けになれば幸いです。
とはいえ[こんな本](www.amazon.co.jp/dp/4844364855/)も発売されるようなのでこの情報の賞味期限短そうです・・・

結論からいうとC#のプロパティ（アクセサ）を使います。
以下のようなプロパティを用意し、このスクリプトを任意のGameObjectにアタッチしておきます。


 ```C#:test.cs
using UnityEngine;

public class test : MonoBehaviour
{
	private float	_sliderValue;

	public float sliderValue
	{
		get
		{
			return this._sliderValue;
		}
		set
		{
			this._sliderValue = value;
			
			Debug.Log(this._sliderValue);
			
			// Do Something...
		}
	}
}
```


その後、スライダーorスクロールバーのInspectorから添付画像のように
オブジェクトとプロパティを設定してあげれば、スライダーを動かして値が変化したときに
setが呼ばれるようになります。

このsetの中でなにか処理をするとUpdateで定期実行される処理とカチあったりするかもなので
基本的にはUpdateの中で値を処理してあげたほうがいいかもしれません。


![ss.png](https://qiita-image-store.s3.amazonaws.com/0/61393/069e6788-5c6f-6b2d-9009-941fe5a910d9.png)
rsyncのサンプル例集


Linux環境運用していると、rsyncでファイルだったりディレクトリ同期をする機会多いけどオプションとか忘れる事多いのでメモ
よく使うサンプルを挙げてみた。

##/の意味
まずは、このスラッシュの使い方で久々にやるとまずはまるので整理

|有無|動作|
|---|---|
|有り src/|src配下のファイルが同期対象|
|なし src|srcディレクトリ自体が同期対象|


##オプション一覧
色んなオプションあるけど、適切なものをいつもmanで調べるのでこれを気にまとめとく


|オプション|意味|
|---|---|
|-a|「-rlptgoD」と指定したのと同様の効果。(--recursive --links --perms --times --group --owner --devices)<br>とりあえず基本つけておく|
|-v|処理の経過を表示|
|-r|再帰的にコピー|
|--delete|削除ファイルも同期|
|--existing|更新分のみ(追加は無視される)|
|--exclude|除外対象を指定|
|-e ssh [user@host]|ssh経由での同期|


##よく使うサンプル
だいたいrsync使う場合は、下記パターンのどれかを使って、cronなりshellscriptで回すと思う

######src配下をdst配下へ同期

```
$ rsync -av ./src/ dst

$ll dst
aaa.txt
```

######srcをdst配下へ同期

```
$ rsync -av ./src dst

$ ll dest
src
```

######リモートのsrc配下をローカルのdstに同期

```
$ rsync -av -e ssh  [user]@[host]:./src/ dst
```

######ローカルのsrc配下をリモートdstに同期

```
$ rsync -av -e ssh ./src/ [user]@[host]:dst
```

######特定のファイル(*.log)以外を同期

```
$ rsync -av -e ssh --exclude '*.log' ./src/ [user]@[host]:dst
```

######更新されたファイルのみ同期

```
$ rsync -av -e ssh --existing ./src/ [user]@[host]:dst
```

######ファイルを完全(削除したものも対象)に同期

```
$ rsync -av -e ssh --delete ./src/ [user]@[host]:dst
```
BitnamiのWordPressにStaticPress-S3をインストール


備忘録。ろくに説明なくてごめんなさい。

まずは普通にインストール。

```
$ wget https://github.com/megumiteam/staticpress-s3/archive/master.zip
$ unzip master.zip
$ mv staticpress-s3-master /opt/bitnami/apps/wordpress/htdocs/wp-content/plugins/staticpress-s3
```

で、いいはずなんだけど、これだけだとエラーになってしまうので以下を追記。

```none:/opt/bitnami/php/etc/php.ini
apc.filters="^phar://"
```

でも、結局S3へのアップロードはAWS CLIを使って手動でやることにした。
Realm Tech Talk with JP Simard #2


http://realm.connpass.com/event/11815/

上記イベントのJP Simardさんのプレゼンのメモです。
また、Realmの使い方の詳細はこちらです。
http://qiita.com/okitsutakatomo/items/9134c5fa8bd4384a2acf


# Realm概要
- クライアントサイド向けデータストア。SQLiteに置き換わる可能性のあるプロダクト
- 8ヶ月前ぐらいに公開。iOS/Androidバインディングのみ公開。Coreは非公開
- サーバサイドのDBイノベーションはここ数年かなり活発なのに対し、クライアントはSQLiteがリリースされて以降、全くイノベーションが起こっていない
- JPさんは、SQLiteのコミッターとしてしばらく活動してきたが、SQLiteよりもいいものが作れる気がしたのでRealmを作りはじめた。開発期間：4年
- 発音は「レルム」


# CoreData
- 10年以上前のもの
- 遅い
- 学習コストかかる
- アップルしかつかえない

# SQLite
- CoreDataより早い
- iOSに最適化されている
- クロスプラットフォーム
- 14年以上の開発期間
- 悪いユーザ体験
- 手動のデータマッピングとクエリ

# Other Options
- FMDB
- YapDatabase
- CouchbaseLite
- LevelDB

# パフォーマンス
- Insert
	- 生SQLite > Realm > FMDB > CoreData > YapDatabase
	- Realm は、生SQLiteよりも遅いが、コードのメンテナンス性や書き易さの面を考慮して作っている
-Count, Query
	- Realmダントツ
	- デーブルからRowデータを引っ張るのではなく、ディスクから直接データを引っ張っているので早い

# モデルオブジェクト
- クラスがそのままテーブルになる。モダン

# Thread
- 別スレッドでも書き方は同じ。ただし、オブジェクトがThreadを超えることはできない。

# Notification
- Fine-grain Notifications Coming Soon!!

# Work In Progress
- MultiProcess (appとwatch appでとか）
- Fine-grain Notification
- Async Queries
- Cascading deletes
- Nullable types	
	- null入れられないからいられるようにしたい
- Sync
- Open source Code
		- データベース自体のCoreのオープン化

# Where is Realm used?
- Groupon
- Coinbase
- Buzzfeed
- Macaroni(made in Japan)
- Aplos(made in Japan)

# Q&A
- FetchedResultsControllerみたいなものを用意する予定はあるか？
	- sectionとrowを便利に使える部分は、Realmでもすでにsampleがある。
	- 更新オブジェクトの通知部分は、Fine-grain Notificationで対応される予定。

- Realmはディスクに書き込むから早いと何度か言っていたが、感覚的にはメモリのほうが早いイメージ。どういうこと？
	- 大きな理由は、早くなるから。
	- SQLiteは、一回メモリに展開している。Realmではそのあたり省いて直接ディスクに書いている。

- もし、SQLiteとか似たようなライブラリよりも遅くなるケースはあるか？
	- 一般的な仕様はベンチマークの通り
	- クエリ文の組み立てはRealmが早い
	- SQL次第でパフォーマンスが逆転する可能性もある。
	- Realmは、 **IN句は遅い** 。日々改善している。
- AutoIncrementはないか？
	- 現状ではサポートする予定はない。
Railsで良くコンフリクトするファイルの対処方


Railsの開発初期段階は特に以下のファイルがコンフリクトを起こしたりしませんか？
自分の場合、ルーチンワークと化してるのでまとめました.
もっといい方法あればコメントください :+1:

- `Gemfile`
- `Gemfile.lock`
- `db/schema.rb`

## `Gemfile`, `Gemfile.lock`

Gemのパッケージを増やした時とか以下を実行しています.

```bash
git mergetool Gemfile
git checkout --theirs Gemfile.lock
bundle install
git add Gemfile Gemfile.lock
```

`--theirs` オプションとは別に `--ours` もあります. 分かりやすく図解すると以下のように使い分けます.

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21086/cbc952c2-48a4-a9d3-bcf1-84d14395aecc.png" width="365" alt="git checkout --(ours|theirs)" />


間違えて`bundle update`しないようにしましょう！
`Gemfile.lock`を無視してバージョンあげるので！

## `db/schema.rb`

`db/schema.rb`はDBの状態をダンプしたものです.
これがズレているとアプリ内で正しく認識しない場合があります.

```bash
git checkout --theirs db/schema.rb
rake db:migrate
git add db/schema.rb
```

`db/schema.rb`をマージ/リベース元のファイルに戻して、
`rake db:migrate`でスキーマファイルを更新しています.
オレオレ Kobito カスタム CSS


[Kobito](http://kobito.qiita.com/ja) では、カスタム CSS を適用することで、プレビューの見栄えを自分好みに変更することが出来ます。
今回は、オレオレな Kobito のカスタム CSS を晒します。

## :name_badge: フォント

- [フロップデザイン+](http://www.flopdesign.com/freefont/flopdesignfont.html)
	- コード以外の部分に適用しています。
	- 可愛らしくて、見やすいです。
- Ricty for Powerline
	- コードの部分に適用しています。

## :memo: カスタム CSS

フォントを変更して、見出しの見栄えを少し弄っています。

```css:custom-style.css
/* See Kobito.app/Contents/Resources/markdown.css for predefined style. */

html {
  font-family: "01FLOPDESIGN", sans-serif; }

samp {
  font-family: "01FLOPDESIGN", monospace, serif; }

textarea {
  font-family: "01FLOPDESIGN", inherit; }

body {
  font-family: "01FLOPDESIGN", "Monaco", monospace, Helvetica Neue, Helvetica, "Hiragino Kaku Gothic Pro", "Lucida Grande", Verdana, Arial, Meiryo, sans-serif; }

code {
  font-family: "Ricty for Powerline", "Monaco", monospace, "Courier", "Inconsolata", "Bitstream Vera Sans Mono"; }

.code-frame pre code {
  font-family: "Ricty for Powerline", "Monaco", monospace, "Courier", "Inconsolata", "Bitstream Vera Sans Mono"; }

h1 {
  background: #000000; color: #F8F8F8; padding: 10px; }

h2 {
  border-bottom: solid 5px #000000; padding-left: 10px; }
```

こんな感じで適用されます。
もっと、見栄えが良くて見やすいカスタム CSS 知りたいですね。

![custom-style-preview.png](https://qiita-image-store.s3.amazonaws.com/0/1097/9f15a454-66a2-af9d-a08a-b5e8557d7793.png "custom-style-preview.png")
Nginx(1.6.2), PHP-FPM, PHP(5.6.6), MySQL(5.6.23) [Install]



### nginx

デフォルトでyumでnginxをインストールすると、
1.0.*など最新のものではないので、
リポジトリを登録する必要がある。

登録すべきリポジトリURLは
http://nginx.org/en/linux_packages.html#stable
で確認できる。

使っているのがCentOS6系なので、
http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
となる。

```
sudo rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
```

```
sudo yum -y install nginx
nginx -v

sudo service nginx start
sudo service nginx restart

#nginx自動起動する
chkconfig --list nginx
sudo chkconfig nginx on
```

### FastCGI

```
sudo yum -y install php-fpm
```

http://cross.hvn.to/?p=1874
/etc/php-fpm.d/www.conf
でポートの確認(9000)をし、userとgroupをnginxへ変更する。
引き続き、nginx.confを変更しphpが使えるようにする。

```
sudo service nginx restart
sudo service php-fpm start
```

### PHP

```
sudo yum -y install php php-devel php-common php-gd php-mbstring php-mysql php-pdo php-pear php-xml
```

デフォルトでyumでインストールすると、
5.3系になってしまうので、
リポジトリ登録をして、最新版の5.6系をインストールする。

```
sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
sudo yum --enablerepo=remi,remi-php56 info php
sudo yum --enablerepo=remi,remi-php56 -y update php php-devel php-common php-gd php-mbstring php-mysql php-pdo php-pear php-xml
```

### MySQL

デフォルトでyumでインストールすると、
5.1系になってしまうので、
リポジトリ登録をして、最新版の5.6系をインストールする。

リポジトリのURLは本家から
http://dev.mysql.com/downloads/mysql/

```
wget -q http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-shared-compat-5.6.23-1.el6.x86_64.rpm \
http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-shared-5.6.23-1.el6.x86_64.rpm \
http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-server-5.6.23-1.el6.x86_64.rpm \
http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-client-5.6.23-1.el6.x86_64.rpm \
http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-devel-5.6.23-1.el6.x86_64.rpm
```

```
#MySQLのインストール
sudo yum -y install MySQL-{client,devel,server,shared-compat}-5.6.23-1.el6.x86_64.rpm

#これを最後に
sudo yum -y install MySQL-shared-5.6.23-1.el6.x86_64.rpm

#バージョン
mysql --version
```

設定ファイルは、いままで
`/etc/my.cnf`だったのが、`/usr/my.cnf`に変更。

```
sudo vi /usr/my.cnf
```

```/etc/my.cnf
[mysqld]
character-set-server=utf8

[mysql]
default-character-set=utf8

[mysqldump]
default-character-set=utf8
```


```
sudo /etc/rc.d/init.d/mysql start
```
（コマンドがmysqldからmysqlに変わってた。。）

```
#MySQL自動起動する
chkconfig --list mysql
sudo chkconfig mysql on
```

5.6 では、root ユーザに初期パスワードが設定されており、以下のファイルに書き込まれているので確認します。

```
$ sudo cat /root/.mysql_secret
# The random password set for the root user at Mon Feb 23 07:24:22 2015 (local time): XXXXXXXX
```

上記の「XXXXXXXX」の部分が初期設定されているパスワードになります。

```
#rootユーザーにパスワード設定
SET PASSWORD FOR root@localhost=PASSWORD('root');
```

ルートパスワードを設定したら、
以下のコマンドを実行して、セキュア状態にします。
```
sudo /usr/bin/mysql_secure_installation
```
オープンソースライセンス表記のテンプレート

# Googleアプリの表記に習う

オープンソースソフトウェアをアプリで利用した際に、
どのようにライセンス表記するか、Androidとしてルールはないです。
ただ、Googleが開発したAndroidアプリには(マチマチではあるが)一定のルールがあるように見受けられます。

例えば、以下のようなもの（例：PlayStoreアプリ）
タイトルを除いたこの表記のテンプレートを書き残します。

![スクリーンショット 2015-02-20 0.22.03.png](https://qiita-image-store.s3.amazonaws.com/0/42855/97e82a85-80f7-347a-b9c9-fa0122291a1f.png)

# テンプレとその使い方

ファイル名とそのライセンス文だけ入れ替えれるだけのテンプレのHTMLです。
タイトルは含んでません。

1. 作ったファイルをプロジェクトのassets配下に配置し、
2. ライセンス表記するActivityかDialogかにWebViewを貼り付けておき
3. licenses.htmlを食わせるだけです。  
    ex) `webview.loadUrl("file:///android_asset/lisences.html");`

※２つ以上ある場合は、`<h3>` から `</pre>`タグまでをコピペして増やしていってください。

```html
<html>
<head><style> body { font-family: sans-serif; } pre { background-color: #eeeeee; padding: 1em; white-space: pre-wrap; } </style></head><body>
<h3>Notices for files:</h3><ul>
<li>オープンソースのファイル名(基本的にjarファイル名になるかと思う)</li>
</ul>
<pre>
ここにライセンス文を貼り付ける
</pre>
</body></html>
```

# サンプル

有名なguavaとvolleyのライセンスを表示するサンプルのHTMLです。

```lang:licenses.html
<html>
<head><style> body { font-family: sans-serif; } pre { background-color: #eeeeee; padding: 1em; white-space: pre-wrap; } </style></head><body>
<h3>Notices for files:</h3><ul>
<li>guava-11.0.1.jar</li>
</ul>
<pre>Copyright (C) 2010 The Guava Authors

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
</pre>
<h3>Notices for files:</h3><ul>
<li>volley.jar</li>
</ul>
<pre>Copyright (C) 2011 The Android Open Source Project

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
</pre>
</body></html>
```

# サンプルをWebviewに貼り付けたイメージ

![スクリーンショット 2015-02-20 0.55.33.png](https://qiita-image-store.s3.amazonaws.com/0/42855/2649f039-a31d-fe71-3b27-02e3019f3902.png)
mongooseで列挙体(enum)を利用する


# 使い方

enumはString型に指定する。
バリデーションの設定なので、ここで設定された値以外を入れようとするとエラーになるらしい。

```js:
var userSchema  = mongoose.Schema({
    uid : { type: String, required:true, index: {unique:true} },
    name: { first: String, last: String },
    age : { type: Number, min: 1 },
    gender : { type: String, enum: ['male', 'female', 'neuter'] }
});
```

# 参考

Mongoose学習#1「とりあえず使えるレベル」
http://yone-public.blogspot.jp/2012/11/mongoose1.html

If I never try, I'll never know: Node.jsが面白い件④ MongoDBで遊ぶ 〜Mongoose編その①〜
http://intink.blogspot.jp/2012/12/nodejs-mongodb-mongoose.html

Mongoose Validation v3.8.23
http://mongoosejs.com/docs/validation.html

Mongoose ODM
http://mongoosejs.com/docs/2.7.x/docs/schematypes.html
Python で Project Euler #14「最長のコラッツ数列」

[Problem 14 「最長のコラッツ数列」](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2014)

> 正の整数に以下の式で繰り返し生成する数列を定義する.
>
> ```math
> n → n/2 (n が偶数)\\
> n → 3n + 1 (n が奇数)
> ```
> 13からはじめるとこの数列は以下のようになる.
>
> ```math
> 13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1
> ```
> 13から1まで10個の項になる. この数列はどのような数字からはじめても最終的には 1 になると考えられているが, まだそのことは証明されていない(コラッツ問題)
>
> さて, 100万未満の数字の中でどの数字からはじめれば最長の数列を生成するか.
>
> 注意: 数列の途中で100万以上になってもよい

```py:Python
n = 1000000
seq = range(1, n)

collatz_dict = {1: [1]}

def compute_collatz(i):
  if(i not in collatz_dict):
    if(i % 2 == 0):
      collatz = [i] + compute_collatz(i / 2)
    else:
      collatz = [i] + compute_collatz(3 * i + 1)
    collatz_dict[i] = collatz
  return collatz_dict[i]

collatz_lenghs = {}

for i in seq:
  collatz = compute_collatz(i)
  collatz_lenghs[i] = len(collatz)

max_length = max(collatz_lenghs.values())

max_index = collatz_lenghs.values().index(max_length)
max_length_collatz_key = collatz_lenghs.keys()[max_index]
max_length_collatz = collatz_dict[max_length_collatz_key]

result = max_length_collatz_key

print result
print result == 837799
print max_length
print max_length_collatz[:6]
```

```:結果
837799
True
525
[837799, 2513398, 1256699, 3770098, 1885049, 5655148]
```

ちょっと遅いんだけど、いい方法が思いつかない。
Clean URL設定画面でチェックボックスが表示されない



Clean URLを設定するために、設定ページに移動すると下記のような文言が表示され、
有効にするチェックボックスが表示されない事があります。



>Clean URLs cannot be enabled. If you are directed to this page or to a Page not found (404) error after testing for clean URLs, see the online handbook.



ボタンがあるので押しても


>Drupal The clean URL test failed.



と表示されるだけです。
この問題は、.htaccessが有効でない為である場合が高いです。

ただ、今回ここからはまったのですが、いっこうにClean URLせ設定画面に
有効化のチェックボックスが表示されませんでした。

その場合は、
clean URLで設定画面にアクセスしてください。
"?q="ではだめです！！

http://********/admin/config/search/clean-urls

これで表示されると思います。罠ですかこれは...
AssetBundleManifestの使い方がAPIドキュメントだけじゃよくわからなかった



AssetBundleManifest
http://docs.unity3d.com/500/Documentation/ScriptReference/AssetBundleManifest.html

`new`するだけじゃ使えないし これだけじゃまったく使い方が全くわからんかった

`BuildPipeline.BuildAssetBundles`でABを作ると出力ディレクトリの名前でmanifestファイルが吐かれるので(この情報もどこにあるかよくわかんなかった)

この手の裏技的なものを使わないと使えない情報どうやって得ればいいの...

~~~CSharp

// /tmp/ab_out/にBuildPipeline.BuildAssetBundles　でファイルを吐いていた前提
var abDir = "file:///tmp/ab_out/";
var manifestName = "ab_out";

var wwwManifest = new WWW(abDir + manifestName);
yield return wwwManifest;

AssetBundle manifestBundle = wwwManifest.assetBundle;
AssetBundleManifest manifest = manifestBundle.LoadAsset("AssetBundleManifest") as AssetBundleManifest;

~~~

ここまでやってなんかようやく使えるっぽい？
動的に追加したTextViewのサイズ（幅）を取得する方法

固定配置してるTextViewなら、onCreateでTextViewを宣言してたらgetWidth()で幅を取得出来るが、例えばリストをクリックする度に何文字になるか分からないTextViewを動的に追加するといった実装の場合、追加直後にはgetWidth()では取得結果が0になった。

そのため、やや無理矢理だがTextViewにsetされた文字数などから幅を割り出すことが出来ないかと調べたら、下記の書き方で取得出来た。
<br>

```java
TextView newTextView = (TextView) layoutInflater.inflate(R.layout.hoge, null);
newTextView.setText(dynamic_text);    // 追加したいテキスト

int thisSize = (int)Layout.getDesiredWidth(newTextView.getText(), newTextView.getPaint())
```
DNA相補鎖配列を逆さまに書く

DNA配列をゴニョゴニョ・・・のようなプログラミングをしていると、避けて通れないのが相補鎖、すなわちReverse Complementな塩基配列の扱いです。

BioPythonあたり使われている方は、`Bio.Seq.reverse_complement()`で一撃で求められるのですが、こいつを逆さまに書いて、相補鎖であることを素敵に視覚に訴えるように明示できないかと試してみました。
もちろん画像やらTeXやら使えばいいのですが、テキスト端末で文字を逆さまにしてみたかったので。

実はUnicodeには全アルファベットの逆さま版の文字がある・・・かな、と思って調べている人は世の中に多少はいらっしゃるようですが、残念ながらありません。ただ、果敢にも逆さまにしたアルファベットに似た文字を探し出し、テーブルを作っている人は少なからずいるようで、これら先人の知恵を拝借してやってみます。

```py
In [1]: R = {'A': chr(0x23CA), 'T': chr(0x15C4), 'C': chr(0x2141), 'G': chr(0x2183)}

In [2]: forward = ''.join(random.choice('ATCG') for i in range(50))

In [3]: reverse = ''.join(R[x] for x in forward)

In [4]: print(forward); print(reverse)
CTTAAAGCACTTTGTCTTCTTAGATGGCTAATCTCTCCAAGCGGAGCGGC
⅁ᗄᗄ⏊⏊⏊Ↄ⅁⏊⅁ᗄᗄᗄↃᗄ⅁ᗄᗄ⅁ᗄᗄ⏊Ↄ⏊ᗄↃↃ⅁ᗄ⏊⏊ᗄ⅁ᗄ⅁ᗄ⅁⅁⏊⏊Ↄ⅁ↃↃ⏊Ↄ⅁ↃↃ⅁
```

・・・微妙・・・フォントによっては上下の位置が合わないし・・・
小文字ならどうだろう。

```py
In [5]: r = {'a': chr(0x0287), 't': chr(0x0250), 'c': chr(0x1d77), 'g': chr(0x0254)}

In [6]: forward = ''.join(random.choice('atcg') for i in range(50))

In [7]: reverse = ''.join(r[x] for x in forward)

In [8]: print(forward); print(reverse)
aggcgtcctcgatggcacttggcgccctatggttcggattggtccgcctc
ʇɔɔᵷɔɐᵷᵷɐᵷɔʇɐɔɔᵷʇᵷɐɐɔɔᵷɔᵷᵷᵷɐʇɐɔɔɐɐᵷɔɔʇɐɐɔɔɐᵷᵷɔᵷᵷɐᵷ
```

・・・やめといたほうが良さそうです。
翻訳：Mission Tactics(目標志向戦術)

#出典
http://www.clausewitz.com/readings/mcdp1.pdf
ここのMission Tacticesの章を翻訳します

# なぜ翻訳したし
アメリカ海兵隊はベトナム戦争後の改革が求められた時期に、上位者が下位者に大きな裁量を許すことで、より「素早い」戦争をできるように人事改革をしました。
このあたりは野中先生の著書、アメリカ海兵隊に詳しいです。
これを翻訳することで、上位者が下位者に大きな裁量を許す、アジャイルっぽいマネジメントを考えるときに役に立てばいいなと思ったからです

# 翻訳者の感想(小並感)
上級者は目的を指示するが、手段に関しては拘束しない。　
※ただし統制(control)という概念で手段の幅の制約はある程度なされる
許可を求めて待ちが入る局面を、「想定外の事態が発生した時」に限定することで、高速に任務を遂行することを狙っている
また、後述のIntentによって、各チームが統一や集中を保つことを特に定めている

# 本文
## Mission Tactics
我々は機動戦を実践するために、Mission Tacticsの実践を通して根幹となる手法を確立した
Mission Tacticsはこのような定義である。どのように達成するかの手法を特定のやり方で指定することなく下級者(subordinate)に任務を割り当てる。
我々は下級者から任務完遂の方法指定することをやめ、かわりに義務を果たすための自由裁量を許した。
自由裁量とは状況に応じて必要と思われるあらゆる手段を下級者にゆるすことである。
Mission Tacticsは下級者の行動の自由を信頼する。ただしそれは下級者が適切な指導を受け理解を形作っていることが必要である

Mission Tacticsの利益として上級者(senior)は、 高いレベルの関心ごとに集中する時間をより多く持つことができる。これは下級者の作戦実施の詳細に注意を払う時間を割かずにすむためである。
上級者は、作戦実施の手段を整合性がとれる最低限の程度でのみ定める。
下級者の作戦実行に、上級者が介在するのは例外が発生した時のみである。
我々が望む作戦を高速にすることを可能にするものは作戦実施への自由裁量権である
上級者からの過度の制約による抑圧をしないことで、下級者は状況の変化に対して柔軟に反応することができる。
下級者たちは司令官に対して「自分たちが何を完了したか」を報告するが、許可を得ることを待ったりはしない。

Mission Tacticsは上位者と下位者との業務遂行における取り決めにあたる。
下級者に対して、行動に対する不必要な規定や制約をせず、missionsを完遂するための必要な支援を与えることに、上級者は同意する
下級者が適切な判断と自己判断をもって任務にあたることを可能にすることにたいして、上級者は義務を負う
上級者の意図に一致する振る舞いをすことにたいして、下位者は義務を負う
責任と忠誠をもって、また定められた適当な権限の範囲を逸脱することなく、振舞うことに、下級者は同意する
下級者にtopsightとともに行動することを、Mission Tacticsは要求する
topsightとは、周囲のより大きな状況の一部として下級者はどのように行動するべきかという理解力である
別の言い方をするなら、より上位の目標を達成することに貢献するために、下級者は常に自身よりも高位の視点で考えねばらならない。
　
集中(focus)や統一(unity)なしに、意思決定の判断が部隊ごとにばらばらまま様々な努力がなされることを我々は許可できないことは明白だ
そうすることは我々の能力を分散し、無力化させるからだ。
押し付けられた統制を通した単一的なものでなく、上位者からの指導によって与えられた文脈のもと、調和のとれた各部隊の自己判断と横並びの協調関係によって我々は統一(unity)を得ようとしている

initiative: 自己判断
CentOS7にOracleJDK8を入れる方法

元から入ってるjdkを削除
`yum list installed | grep jdk`
`sudo yum remove java-1.7.0-openjdk.x86_64`
`sudo yum remove java-1.7.0-openjdk-headless.x86_64`

JDK8を入れる
`curl -L -o -H 'Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com; oraclelicense=accept-securebackup-cookie' 'http://download.oracle.com/otn-pub/java/jdk/8u31-b12/jdk-8u31-linux-x64.rpm'`
`sudo rpm -ivh jdk-8u31-linux-x64.rpm`
システムイメージのバックアップで ”クラスが登録されていません (0x80040154)”と出る

新しいマシンを買って、色々いじくる前にバックアップ取る時にはまったので備忘録

バックアップはこんな感じで普通に進めていく
![backup.jpg](https://qiita-image-store.s3.amazonaws.com/0/70267/d68ad216-5767-5da3-bb68-7917d7f5c8e8.jpeg)

そうすると途中でこんな画面が出てくる
![error.png](https://qiita-image-store.s3.amazonaws.com/0/70267/fc7471dd-72fb-45d5-7db9-cee6c8e402c7.png)

なんかまずそうだなーっと思ってバックアップを止めて調べたんだけど、結果的にはOK押した後待ってればいいだけだった
どうもただのバグっぽい

システム イメージ バックアップを作成する Windows の 8.1 0x80040154 エラーが発生します。
http://support.microsoft.com/kb/2934165/ja