OmniAICreator/Qiita-1.07M huggingface dataset:
streamによるfluxの実装

【追記1】例外処理を含めた簡単なサンプルも書いてみました。（2015.04.22)
https://gist.github.com/ishiduca/956ee21635bfc40537e7
【追記2】ActionCeatorsでは、ユーザーに直接.writeメソッドに触れさせないようにしました。

簡単なチャットアプリで試してみました。https://github.com/ishiduca/streamed-flux-demo

## モチベーション
データの流れを一方向に保つというのがFluxの肝だろうから、各要素の実装をStreamにしてパイプでつなげればいいんじゃないのか。という発想

## 構成要素
### ActionCreators (Action)

Readableなストリームならなんでも

```js
var es     = require('event-stream')
var assign = require('object-assign')
// ユーザには直接writeメソッドを使わせたくないので
// メソッドを生やしてみる
var actionStream = module.exports = assign(
    es.map(function (payload, cb) {
        cb(null, payload)
    })
  , {
        sendMsg: function (value) {
            this.write({
                actionType: 'user.sendMessage'
              , value: value
             })
        }
    }
)
```

### Dispatcher
Actionから流れてきたデータをStoreに流すだけのストリーム。シングルトン。

```js
var dispatcherStream = module.exports = es.map(function (data, cb) {
    cb(null, data)
})
```

### Store
Dispatcherから流れてきたデータを選別して（、処理が必要な場合は処理して）下流に流すストリーム

```js
var storeStream = module.exports = es.map(function (data) {
    if ('user.sendMessage' === data.actionType) {
        // 加工が必要な場合はこの辺で加工する
         cb(null, data.value)
    } else {
        cb() // 下流に流さない場合
    }
})
```

### View
React.jsとか。

### ActionCreatorsをDispatcherにつなぐ
Actionがひとつの場合は

```js
actionStream.pipe(dispatcherStream)
```
複数ある場合は

```js
es.merge(
    actionStream1
  , actionStream2
  , ...
)
.pipe(dispatcherStream)
```


### DispatcherをStoreにつなぐ

```js
dispatcherStream.pipe(storeStream)
```

### StoreからViewへ

```js
storeStream.on('data', function (message) {
    this.setState({message: message})
}.bind(this))
```

### ViewからActionへ

```js
handleClick: function (ev) {
    actionStream.sendMsg(this.refs.inputMsg.getDOMNode().value)
}
```

## 雑感
### 記述量が多い？
FacebookのFluxチュートリアル（記述量が多いけど、何をやってるのかわかりやすくてよい）を見習って、こちらも途中を端折らず描いてます。

### 心配事
パイプしまくる規模になったら、登録できるイベントの上限にすぐ到達してしまいそう。

### event-streamが便利

ストリームの実装で楽をするのに `event-stream` を使います。
https://www.npmjs.com/package/event-stream
コンプガチャのシミュレーション

全て当確率で出る場合について
nはガチャのアイテム数
snは試行回数

```py3
# -*- coding: utf-8 -*-
import math
import random
import numpy as np
import time

start = time.time()

n = 100
sn = 10000

print("コンプガチャシミュレート (%d アイテム)" % n)
print("論理値            : {0:.5f}".format(sum([float(n) / i for i in range(1, n+1)])))

ress = []
for j in range(sn):
    box = []
    k = 0
    i = 0
    while(i < n):
        k += 1
        r = random.randrange(n)
        if r not in box:
            i += 1
            box.append(r)
    ress.append(k)
res = np.mean(ress)
print("シミュレーション値: {0:.5f} [{1}回]".format(res, sn))
print("- exec time: %d ms-" % (time.time() * 1000 - start * 1000))
```

結果例

```shell-session
コンプガチャシミュレート (100 アイテム)
論理値            : 518.73775
シミュレーション値: 516.38000 [10000回]
- exec time: 7640 ms-
```

```shell-session
コンプガチャシミュレート (10 アイテム)
論理値            : 29.28968
シミュレーション値: 29.32320 [100000回]
- exec time: 2775 ms-
```
EC-CUBE3のURLとファイルの関係（Providerの読み方）

まぁふつうにフレームワークとかさわり慣れてれば当たり前なんだろうけど

EC-CUBE2.13までは、アクセスしているURLと対応したディレクトリにかならずPHPファイルがあり、そこから見ていけば、どこを修正すればいいかが簡単に追うことができた。

EC-CUBE3では、今どきっぽく、ルーティングが採用されたので、アクセスしたURLだけではどこのファイルを触ればいいのか迷う。そんな時の探し方。

## Providerをみる。

管理画面か、顧客画面（フロント）かで以下のどちらかを見ればよい

+ 管理画面
  - src\Eccube\ControllerProvider\AdminControllerProvider.php

+ フロント
  - src\Eccube\ControllerProvider\FrontControllerProvider.php

## Providerに書かれているものの読み方

Providerを見ると以下のような記述がある

```php
// mypage
        $controllers->match('/mypage/', '\\Eccube\\Controller\\MypageController::index')->bind('mypage');
        $controllers->match('/mypage/login.php', '\\Eccube\\Controller\\MypageController::login')->bind('mypage_login');
        $controllers->match('/mypage/change', '\\Eccube\\Controller\\Mypage\\ChangeController::index')->bind('mypage_change');
        $controllers->match('/mypage/change_complete.php', '\\Eccube\\Page\\Mypage\\ChangeComplete')->bind('mypage_change_complete');
        $controllers->match('/mypage/delivery.php', '\\Eccube\\Page\\Mypage\\Delivery')->bind('mypage_delivery');
```

以下は、http://ec-cubeのURL/mypage/ にアクセスした場合の内容が書かれている。

```php
$controllers->match('/mypage/', '\\Eccube\\Controller\\MypageController::index')->bind('mypage');
```

以下は、http://ec-cubeのURL/mypage/change にアクセスした場合の内容が書かれている。

```php
$controllers->match('/mypage/change', '\\Eccube\\Controller\\Mypage\\ChangeController::index')->bind('mypage_change');
```

それぞれ  

```php
$controllers->match('URLのパス', '呼び出されるコントローラークラス::呼びだされるメソッド')->bind('URL generatorなどで利用するショートカット表記'); 

```
のように理解してもらえばいい。

なので、URLからもぐっていきたい場合は、ここをみて呼び出されているコントローラークラスを確認して、開けば良い。上の例ならそれぞれ以下のファイルを見れば良いということになる。


+ /mypage/  
  + src\Eccube\Controller\MypageController.php::index
+ /mypage/change   
  + src\Eccube\Controller\Mypage\ChangeController.php::index


### 参考） 3系のソースに置き換えきっていないもの見分け方

以下はまだ2.13系のままでリファクタが終わっていないもの。（Controllerではなく、Pageになっているところに注目）

```
$controllers->match('/mypage/delivery.php', '\\Eccube\\Page\\Mypage\\Delivery')->bind('mypage_delivery');
```
どどんとふ1.46.00 on CentOS 6.6 & Ruby 2.1.6を出来るだけ最小構成で動かすための覚書

CentOS6.6をftp.riken.jpのリポジトリよりminimum構成でインストールした後の状態から始めます。

コマンドを実行するユーザはrootである前提で書いてますので、それ以外のユーザで実行する場合はsudoしてください。

あとProxyの必要ない環境を前提としていますので、万が一Proxyの内側でやらなければならないという時にはyumとwgetのProxyの設定はご自分で行ってください。

やること
===
sshdのセットアップ
----
準備ではありますが本質ではないので省略します。
PermitRootLogin noとかPortとか設定すれば良いでしょう。

iptablesのセットアップ
----
これも省略します。
sshdが使うポートとapacheが使うポート、ループバック、ESTABLISHEDとRELATEDを許可してあげてあとは全てDROPしてしまって良いでしょう。


rubyのセットアップ
----
まず、色々取ってくるためにwgetをyumで取得します。
URL打つのが面倒だったらLynx(CUIで動くWebブラウザ)使ってしまっても良いかもしれません。
`yum install wget`

Rubyの動作にはyamlが必要なので取得します。
ソースコンパイルしても良いのですが怠けてepelリポジトリから貰ってくることにします。
epel便利だからきっと他にも使うことがあるかもしれないですし。
`cd ~
wget http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm
yum install libyaml-devel`

Ruby2.1.6のソースコードを公式Webからダウンロードします。
CentOSのリポジトリからyumで取得すると未だに1.8.7が落ちてくるのでさすがにちょっと…
取得したらtarで展開してその中に移動します。
`wget http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.6.tar.gz
tar -zxvf ruby-2.1.6.tar.gz
cd ruby-2.1.6`

実はCentOSのminimum構成ってgccが入っていないので取得します。
makeは最初から入ってるのに何故…？
`yum install gcc
./configure
make install`

apacheとどどんとふのセットアップ
----
apacheをインストールします。
どどんとふはzipで配布されているのでunzipも。
`yum install httpd unzip`

どどんとふをダウンロードして、unzipで展開します。
`cd ~
wget http://www.dodontof.com/Download/DodontoF_release/DodontoF_Ver.1.46.00_MASTERPIECE.zip
unzip DodontoF_Ver.1.46.00_MASTERPIECE.zip`

どどんとふの必要ファイルを設置します。apacheのvirtual hostとかでDocumentRootを変える必要がある場合は/var/wwwの部分を適宜読み替えてください。
`cd DodontoF_Webset
mv * /var/www/`

これが今回一番のハマりポイントだったんですが、SELinuxの関係でファイルのセキュリティコンテクストを弄らなければならなかったのでそのためのツールをyumから取得します。
`yum install policycoreutils-python`

chownでどどんとふのファイルたちの所有権をapacheに移します。
chconでhttpdが読める様にセキュリティコンテクストを変更します。
`cd /var/www
chown -R apache:apache public_html/ saveData/
chcon -R -t httpd_sys_content_t public_html/ saveData/`

httpdの設定が置いてあるディレクトリに移動し、設定を書き換えます。
`cd /etc/httpd/conf
vi httpd.conf`

以下がその内容。

```httpd.conf
DocumnetRootの変更
DocumentRoot "/var/www/html"
-> DocumentRoot "/var/www/public_html"

CGIスクリプトの有効化と、その拡張子にrbを追加
#AddHandler cgi-script .cgi
-> AddHandler cgi-script .cgi .rb

DocumnetRootの変更に伴う設定対象の修正
<Directory "/var/www/html/">
-> <Directory "/var/www/public_html/">

どどんとふ設置ディレクトリのデフォルトファイルを変更
以下を空いてる場所に追記
<Directory "/var/www/public_html/DodontoF/">
DirectoryIndex DodontoF.swf
</Directory>
```

Rubyバイナリの場所を確認し、DodontoFServer.rbを書き換えます。
文字コードを指定する-KオプションはRubyの1.8系までのもので、今回使う2.1.6では-Eオプションを使うのでそこも修正します。

which ruby
 =>/user/local/bin/ruby
cd /var/www/public_html/DodontoF/
vi DodontoFServer.rb

```DodontoFServer.rbの最初の行
#!/user/local/bin/ruby -Ku
-> #!/user/local/bin/ruby -EUTF-8
```

どどんとふの実行ファイルに実行可能権限を付けます。
`chmod 700 DodontoF*.rb`

httpdをstartします。
`service httpd start`

ここまででとりあえず動くはずです。

が、セキュリティとか色々穴だらけなので実際に公開するにはもう少しいじる必要があるでしょう。
具体的にはDocumentRootにアクセスするとindex.htmlがないのでCentOS+apacheのデフォルトページが表示されてしまう、400番台のエラーページがデフォルトになのでOSとapacheバージョンがばれる、などなど。
[Blender] Blenderのスクリプトを複数ファイルに分割する

最初は機能も限られていてサイズも小さかったBlenderスクリプトのソースファイルが、機能の追加と共にサイズが巨大化してきていませんか？
そんな時は複数のソースファイルに分割しましょう。
とは言っても、Blenderのスクリプトってどうやって分割したら良いかわからない方もいると思うので、Blenderのスクリプトの分割の仕方をまとめておきます。

# ファイル分割前のソース

ファイルを分割する前のサンプルソースファイルを示します。
あくまで例ですので、あまりソースの内容は深く考えていません。

```py:all_in_one.py
import bpy

bl_info = {
# ...
}

class Operator_1(bpy.types.Operator):
    bl_idname = "uv.operator_1"
    bl_label = "Operator 1"
    file_name = "hoge.blend"

    def execute(self, context):
        return{'FINISHED'}

class Operator_2(bpy.types.Operator):
    bl_idname = "uv.operator_2"
    bl_label = "Operator 2"

    def execute(self, context):
        self.report({'INFO'}, Operator_1.file_name)
        return{'FINISHED'}



def menu_func(self, context):
    self.layout.separator()
    self.layout.menu(Operator_1.bl_idname)
    self.layout.menu(Operator_2.bl_idname)


def register():
    bpy.utils.register_module(__name__)
    bpy.types.VIEW3D_MT_uv_map.append(menu_func)

def unregister():
    bpy.utils.unregister_module(__name__)
    bpy.types.VIEW3D_MT_uv_map.remove(menu_func)


if __name__ == "__main__":
    register()
```

# ファイル分割後のソース

クラスごとにファイルを分割したファイルを示します。
このサンプルでは、すべてのファイルが同一ディレクトリに置かれている必要があります。
また、スクリプトが最初に読み込まれる時の処理を記載したファイル名は、`__init__.py`としなくてはなりません。
`__init__.py`の最初に分割したファイルを読み込む処理がありますが、その他は分割しない場合と比べて特に変わったところはありません。
この部分の説明、実を言うとPythonのパッケージと同じであるので、Pythonを知っている人にとっては非常に馴染みのあるものとなっています。

```py:op1.py
import bpy

class Operator_1(bpy.types.Operator):
    bl_idname = "uv.operator_1"
    bl_label = "Operator 1"
    file_name = "hoge.blend"

    def execute(self, context):
        return{'FINISHED'}
```

```py:op2.py
import bpy
from . import op1

class Operator_2(bpy.types.Operator):
    bl_idname = "uv.operator_2"
    bl_label = "Operator 2"

    def execute(self, context):
        self.report({'INFO'}, op1.Operator_1.file_name)
        return{'FINISHED'}
```

```py:__init__.py
bl_info = {
# ...
}

if "bpy" in locals():
    import imp
    imp.reload(op1)
    imp.reload(op2)
else:
    from . import op1
    from . import op2

import bpy

def menu_func(self, context):
    self.layout.separator()
    self.layout.menu(op1.Operator_1.bl_idname)
    self.layout.menu(op2.Operator_2.bl_idname)


def register():
    bpy.utils.register_module(__name__)
    bpy.types.VIEW3D_MT_uv_map.append(menu_func)

def unregister():
    bpy.utils.unregister_module(__name__)
    bpy.types.VIEW3D_MT_uv_map.remove(menu_func)


if __name__ == "__main__":
    register()
```

# 最後に

Blenderスクリプトでファイルを分割する方法を示しました。
Blenderは1つのスクリプトの機能をパッケージのように扱っていると考えれば、Pythonのパッケージの作り方と同じと言えます。
そのため記事にするまでもなかったのかもしれませんが、Blenderスクリプトを作成する方々の参考になればと思います。

# 参考情報

* http://wiki.blender.org/index.php/Dev:2.5/Py/Scripts/Cookbook/Code_snippets/Multi-File_packages
MongoLab の REST API でドキュメントの検索削除方法が特殊だったのでメモ

[MongoLab](https://mongolab.com) の [REST API](http://docs.mongolab.com/restapi/) をPHPから利用してて、ドキュメントの削除で、検索してマッチしたもの（例えば指定日時より古いもの全部とか）を削除したいんだけど、一筋縄ではいかなかったのでメモ。
（自サーバーインストール型の普通のMongoDBとは違うかもしれないのでご注意を）

最初に試したのは以下のようなプログラム

```php:失敗例その1
$query = array(
    'date' => array(
        '$lt' => '20xx-xx-xx xx:xx:xx' // この日時より古いものを削除したい
    )
);
$url = 'https://api.mongolab.com/api/1/databases/[db名]/collections/[collection名]';
$url .= '?apiKey=[APIキー]';
$url .= '&q='.urlencode(json_encode($query));

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
$res = curl_exec($ch);
curl_close($ch);
```

これだと「_DELETE not allowed._」というメッセージが返ってきた。
ちなみにドキュメントの`_id`がわかってて、1件だけ削除する場合は以下（`DELETE`メソッド）で問題ない。

```php
$url = 'https://api.mongolab.com/api/1/databases/[db名]/collections/[collection名]/[_id値]';
$url .= '?apiKey=[APIキー]';

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$res = curl_exec($ch);
curl_close($ch);
```

[DELETEのリファレンス](http://docs.mongolab.com/restapi/#delete-documents)を読んだところ、どうやら検索しつつ削除する場合は`PUT`メソッドでないといけないっぽい感じなので、以下を試してみた。

```php:失敗例その2
$query = array(
    'date' => array(
        '$lt' => '20xx-xx-xx xx:xx:xx'
    )
);
$url = 'https://api.mongolab.com/api/1/databases/[db名]/collections/[collection名]';
$url .= '?apiKey=[APIキー]';
$url .= '&q='.urlencode(json_encode($query));

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT'); // ここをPUTにしただけ
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$res = curl_exec($ch);
curl_close($ch);
```

これだと、なぜか全ドキュメントが消えてしまった。
たぶんPUTしてるのにデータがゼロなので「データなし」で上書きしたっぽい？よくわからない。

結局いろいろと試して、どうやらPOSTでなんらかのデータは送らないといけないようだったので、最終的に以下のような形になった。

```php:成功例
$query = array(
    'date' => array(
        '$lt' => '20xx-xx-xx xx:xx:xx'
    )
);
$url = 'https://api.mongolab.com/api/1/databases/[db名]/collections/[collection名]';
$url .= '?apiKey=[APIキー]';
$url .= '&q='.urlencode(json_encode($query));

$data = json_encode(array());// 空のデータを送る必要がある
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
    'Content-Length: '.strlen($data)
));
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$res = curl_exec($ch);
curl_close($ch);
```

なんだか腑に落ちない仕様だった・・・
Railsで前後のレコードを取得したいとき


例えば、グループなどに投稿された記事の詳細で「次へ」や「前へ」などのボタンを付けたかったのですが、若干悩んでしまったのでまとめておきたいと思います。

記事の一覧のコントローラをこんなに感じにします。

```ruby:app/controllers/posts_controller.rb
class PostsController < ApplicationController
  def index(group_id)
    @group = Group.find(group_id)
    @posts = @group.posts.order('published_at desc, id desc')
  end
end
```

Postモデルにメソッドを追加します。

```ruby:app/models/post.rb
class Interview < ActiveRecord::Base
  belongs_to :group

  def previous
    group.posts.order('published_at desc, id desc').where('published_at <= ? and id < ?', published_at, id).first
  end

  def next
    group.posts.order('published_at desc, id desc').where('published_at >= ? and id > ?', published, id).reverse.first
  end  
```

あとは、ビューでモデルのメソッドを呼びます。

```erb
<%= link_to '前へ', group_post(@group, @post.previous) if @post.previous %>
<%= link_to '次へ', group_post(@group, @post.next) if @post.next %>
```
WEB+DB PRESS vol.86 で Docker の特集を書かせて頂きました


![Kobito.cOi7gA.png](https://qiita-image-store.s3.amazonaws.com/0/20833/60c424d7-f75c-1a14-1067-177285d86844.png "Kobito.cOi7gA.png")

## 概要

[WEB+DB PRESS vol.86](http://gihyo.jp/magazine/wdpress/archive/2015/vol86) に「Docker実戦投入」という特集記事を書かせていただきました :book: 
Docker 特集以外だと、チーム開発の心得、Atom エディタ、React.js、Ruby コーディングアンチパターンと面白そうな記事が並んでます:star2: 
2015年04月23日発売です。

## Docker 特集の内容紹介
記事は 34 ページで、目次は以下です。

* 第1章：Docker入門
 * 成り立ちから学ぶ基本と全体像
* 第2章：Dockerを活かすための原則
 * 実戦投入に向けて押さえておきたい勘所
* 第3章：ビルド環境の構築とDockerイメージのビルド
 * 本番運用を見据えたイメージの作り方
* 第4章：本番環境の構築とDockerコンテナのデプロイ
 * Capistrano，Swarmによるオーケストレーションの実践
* 第5章：Docker運用ノウハウ
 * CI，モニタリング，ログ管理，メンテナンス

対象読者は Docker 中級者です。「Docker の基本は一通り抑えたので、ローカル環境を超えて実戦で使ってみたい」という方の何かしらの参考になればと思います。

また、Docker 界隈は変化が非常に速いので、Docker の機能や Docker を取り巻くツール群の使い方ばかりを紹介することは避けました。それよりも、できるだけ今後も廃れない **Docker / コンテナベースのインフラにおける考え方** みたいなものを大事にして書いています。

### 第1章 Docker入門
1 章のテーマは Docker の基本です。2 章以降は実戦的な内容になるのですが、1 章だけは特集の入り口として初めて Docker を触る人向けに書いています。紙幅的に基本を全て網羅するのが厳しかったこともあり、Web 上に既に多々存在している入門記事に詳細は譲るとして、Docker の成り立ちから **Docker が何を解決しようとしているのか** を知る、という Docker の根底にあるものを説明しています。（もちろん Docker の構成要素や基本的なコマンドについても解説しています）

### 第2章 Dockerを活かすための原則
2 章では、特集全体で繰り返し述べる **Docker / コンテナベースのインフラにおける考え方** を書いています。これは自分が Wantedly で Heroku から AWS + Docker を使った自前環境に移行して半年以上運用してきた経験から、ここは良かったな、ここは良くなかったなということをベースにまとめています。

### 第3章 ビルド環境の構築とDockerイメージのビルド
3 章のテーマは Docker イメージのビルドです。

* 何をコンテナとして動かすかの選定
* Docker レジストリの選定
* ビルド環境の構築
* Dockerfile の書き方ベストプラクティス
* Docker Compose を使ったイメージのビルド
 
といった内容が書いてあります。

### 第4章 本番環境の構築とDockerコンテナのデプロイ
4 章は一番苦労した章でコンテナのオーケストレーション、デプロイがテーマです。紙面でも触れていますが、コンテナのオーケストレーションやデプロイ部分は本当に色々なツールが次々に出てきていて、成熟しきってない分野です。正直な話、これがベストプラクティスだとは中々言えない中で記事を書く必要があり、本当に悩みました。デプロイなどはインフラのサイズや、企業独特のニーズとかが密に絡むのである程度柔軟性が必要だと思ってます。なので現実的な案として Capistrano の例と、未来を感じる Docker Swarm の例 2 つを取り上げています。(fleet について書きたかったな)

### 第5章 Docker運用ノウハウ
5 章のテーマは運用です。

* Infrataster を使ったコンテナのテスト、
* GitHub + Wercker を使ったコンテナの CI
* Datadog や Mackerel を使ったモニタリング
* logspout や fluentd を使ったコンテナのログ収集
* パフォーマンスチューニング
* セキュリティ
* ホストマシンのメンテナンス

について書いています。

### 幻の第6章

* ダイナミックオーケストレーション
* サービスディスカバリ
* ダイナミックルーティング
* スケジューラ
* データを持つコンテナの取り扱い

みたいな話を書こうと思っていましたが、時間的にも紙幅的にも知見的にも不十分で断念しました。今後がんばる。

## 執筆裏話
### GitHub での執筆作業
執筆作業は GitHub で行いました。とてもやりやすかったです。記事完成までに直接 @inao さんにお会いしたのは 1 回限りで、それ以外は全て Issue と Pull Request で進めました。最終的に @inao さんと 2 人で 1000 コミット超えていたりします。

### Docker 界隈変化速い
執筆中に Docker 本体のバージョンが上がったり、Swarm や Machine の 0.1 が出たり、Lattice みたいにオーケストレーションツール候補がまた増えたりして大変でしたが可能な限り最新のを載っけてます（と言ってるそばから Docker 1.6 になったし、Swarm, Compose も 0.2 になったし...）

### 30 ページを超える文章を書くということ
読者として読んでる時は何気なく読んでいましたが、いざ書く側になると大変でした。
30 ページを超える記事の全体のまとまりを考えたり、わかりやすい文章、分量の調整など、普段は中々やらないことなので。「CoreOS とは」という節を書いた後まるごと削っていたりします...
そして、編集者の存在が当然ですが大きかったです。

## 謝辞
Docker に詳しい方は他に多々いらっしゃる中で、ご縁があってこういう機会を頂けたことにすごく感謝しています。WEB+DB PRESS に寄稿するというのは自分のエンジニアとしての目標の 1 つだったので、今回それを達成することができました。そして非常に良い経験になりました。一緒に特集を作り上げ、長期間サポートして頂いた @inao さん、執筆でちょっと余裕がなかった自分を暖かく見守ってくれた同僚の皆様、ありがとうございました！ :smiley:
JYaml でお手軽 DI


本来、YAML パーサーとして用いられる *JYaml* を使ってお手軽 DI （依存性の注入）を試してみます。

---
## 依存性の注入先

まずは、依存性の注入先を作成


``` java:Process.java

/**
 * 依存性注入用の I/F.
 */
public interface Process {
    public void process();
}

```
```java:Configuration.java
/**
 * Yaml を読み込むクラス.
 */
public class Configuration {
    public Process p1;
    public Process p2;
    public Process p3;
}

```

## 実行コード

続いて、これを実行するメソッドを次のように定義

```java:main.java

/**
 * テストメソッド.
 */
public static void main(String[] args) throws Throwable {

    Configuration configuration = Yaml.loadType(new File("configuration.yml"), Configuration.class);

    configuration.p1.process();
    configuration.p2.process();
    configuration.p3.process();
}

````
**Yaml.loadType で YAML ファイルをロードしていますが、この際に依存性が注入されます**

## 実装クラスの用意

そして Process I/F を実装したクラスを用意

```java:StrPrinter.java

/**
 * 文字列を出力するクラス.
 */
public static class StrPrinter implements Process {
    public String str;

    @Override
    public void process() {
        System.out.println(str);
    }
}

```

```java:NumberPrinter.java
/**
 * 数値を出力するクラス.
 */
public static class NumberPrinter implements Process {
    public Integer number;

    @Override
    public void process() {
        System.out.println(number);
    }
}

````

## YAML の用意

依存性を定義した YAML ファイルを用意

```text:configuration.yml

p1: !StrPrinter
    str: 八 足す
p2: !StrPrinter
    str: Ⅱ は
p3: !NumberPrinter
    number: 10

```

## 実行

先ほどのテストメソッドを実行すると以下のように結果が出力される。

```text:実行結果

八 足す
Ⅱ は
10

```

---
## あとがき

Process I/F の実装方法次第でもっと色々できます。
また、JYaml を使っているので、フィールド値の追加も簡単にだったり、
今回は引数なし、戻り値なしで簡単に作りましたが、
ジェネリクスなどで各々用意すると、さらに幅が広がります。

奥が深いですね:smile:
Itamaeをアップグレード


# Goal

* Itamae v1.2.13からtemplateやremote_fileがソースファイルを推測して配備してくれるようになった
* source :auto(デフォルト)でタスクを実行するとソースファイル推測機能が使える
* この機能を使うためItamaeをv1.2.13にアップグレードする

# Reference

* https://github.com/itamae-kitchen/itamae/commit/1ff453368971b481821d1058034a768493f4326c
* 推奨のディレクトリ構成は以下を参照
	* https://github.com/itamae-kitchen/itamae/wiki/Best-Practice

# gemを更新

```
gem list itamae
  # itamae (1.1.4)

gem update itamae
  # itamae (1.2.13,1.1.4)

gem uninstall itamae -v '1.1.4'
  # 古い方を消しておく
```

# vagrant-itamaeを使っている場合

vagrantプラグインのvagrant-itamaeが使うitamaeは`gem install`したitamaeとは別の場所にインストールされているので、`gem uninstall`で消しても`vagrant provision`では古いitamaeが使われてしまう. 
vagrant-itamaeプラグインを一度消してインストールし直すとよい.

```
vagrant plugin list
  # vagrant-itamae (0.1.0)
  # installされてることを確認

ls -l ~/.vagrant.d/gems/gems/
  # itamae-1.1.4
  # vagrant.dディレクトリのgems以下に古いバージョンのitamaeが入っていることを確認しておく

vagrant plugin uninstall vagrant-itamae
vagrant plugin install vagrant-itamae

ls -l /Users/metheglin/.vagrant.d/gems/gems/
  # itamae-1.2.13
  # vagrant.dディレクトリのgems以下のitamaeが更新されたことを確認
```
IEで.epsファイルをダウンロードしようとすると拡張子が変わる

# 事象

ダウンロードというかただのURLリンクなんだけど、IEでWebサーバ上の静的ファイルにaタグ等でリンク（http://[host]/test.eps）を貼ってクリックすると、ダウンロード時のファイル名拡張子が「.eps」から「__.ps__」になる。

一応環境

* Apache/2.2.15 (Red Hat)
* IE11
* Windows7

![image](https://qiita-image-store.s3.amazonaws.com/0/73766/3f488239-bdad-25fb-4f61-4010169f2a95.png)

HTTP応答ヘッダのContent-Typeは「application/postscript」。
Content-Dispositionの設定は無し。


# 原因？

どこの設定が反映されているのかと調べてみると、レジストリらしい。
HKEY_CLASSES_ROOT\Mime\Database\Content Type\application/postscript

![image](https://qiita-image-store.s3.amazonaws.com/0/73766/f81f886c-d9f2-6e4f-a6f0-226c28e4d83e.png)

# 対処

上記レジストリを「.eps」に変えればサーバ上のファイル名のままダウンロードできるが、自分だけ対応できてもしょうがないのでサーバ側の設定を変える。
以下apacheです。

.htaccessやhttpd.conf内の、設定を反映したい範囲（Directory内等）に以下を記述。

```apache
<Files *.eps>
  ForceType application/octet-stream
  Header set Content-Disposition attachment
</Files>
```

とりあえずepsだけでよかったのでこうしたが、複数の拡張子に適用したい場合は[FilesMatchディレクティブ](http://httpd.apache.org/docs/2.2/ja/mod/core.html#filesmatch)を使う。
【形態素解析】Mecabに新しい辞書を追加する方法

##環境
Mac
Mecabインストール済

##手順
### 1 キーワードファイルをダウンロードし、CSVファイルを作成
#### 1-1 キーワードファイルダウンロード

```
# はてなキーワード
curl -L http://d.hatena.ne.jp/images/keyword/keywordlist_furigana.csv | iconv -f euc-jp -t utf-8 > keywordlist_furigana.csv
# Wikipedia
curl -L http://dumps.wikimedia.org/jawiki/latest/jawiki-latest-all-titles-in-ns0.gz | gunzip > jawiki-latest-all-titles-in-ns0
```

####1-2 名詞を抜き出して CSV ファイルにする
```sample.rb
require 'csv'

original_data = {
  wikipedia: 'jawiki-latest-all-titles-in-ns0',
  hatena: 'keywordlist_furigana.csv'
}

CSV.open("custom.csv", 'w') do |csv|
  original_data.each do |type, filename|
    next unless File.file? filename
    open(filename).each do |title|
      title.strip!

      next if title =~ %r(^[+-.$()?*/&%!"'_,]+)
      next if title =~ /^[-.0-9]+$/
      next if title =~ /曖昧さ回避/
      next if title =~ /_\(/
      next if title =~ /^PJ:/
      next if title =~ /の登場人物/
      next if title =~ /一覧/

      title_length = title.length

      if title_length > 3
        score = [-36000.0, -400 * (title_length ** 1.5)].max.to_i
        csv << [title, nil, nil, score, '名詞', '一般', '*', '*', '*', '*', title, '*', '*', type]
      end
    end
  end
end
```

其の後、sample.rbを実行する

```
ruby sample.rb
```

###2 ユーザー辞書を作成し、追加する
こうして出来た CSV ファイルを元に mecab-dict-index コマンドでユーザー辞書 custom.dic を作ります。

```
/usr/local/libexec/mecab/mecab-dict-index -d /usr/local/lib/mecab/dic/ipadic -u custom.dic -f utf-8 -t utf-8 custom.csv
```

ここで、custom.dicができていることを確認してください。

其の後、ターミナルで、/usr/local/lib/mecab/dic/ipadicに移動し、

```
$ sudo vi dicrc
```
を実行し、

最後に、custom.dicのディレクトリを作成します。

```dicrc
userdic = 「作成した辞書のディレクトリの場所」
```

を入れます。

## 結果
以下のコードを実装してみます。

```sample01.py
#coding:utf-8
import MeCab
tagger = MeCab.Tagger("-Ochasen")
result = tagger.parse("クラウド")
print result
```

はじめ、辞書を追加しない際には、「クラウド」が、

```
クラ	クラ	クラ	名詞-固有名詞-一般		
ウド	ウド	ウド	名詞-一般
```

なっていたのに対し、

```
クラウド		クラウド	名詞-一般
```

になりました。

これができていれば完了です。
お疲れさまでした。
UIScrollView vs UIPageViewController


UIScrollViewでpageingEnabled=YESするのとUIPageViewControllerで似たようなことができるので、どっちを使うべきか迷ってたんだけど、

* UIScrollViewでそういうUIをつくるのは難しい
* UIPageViewControllerならtransition styleを選べる

という意見を見つけたので、UIPageViewControllerに一本化することにした。

http://stackoverflow.com/questions/15279601/scrolling-app-uipageviewcontroller-vs-uiscrollview

確かにiOS4の頃からやってるプロジェクトでUIScrollViewで実装してさらに自前でContainerViewControllerを実装してたりとか随分と大変なことをやっているので、UIPageViewControllerに一本化していこうな。

ちなみにUIPageViewControllerの導入については以下の記事がわかりやすかったです。
http://hyoromo.hatenablog.com/entry/20130406/1365274911
Mixpanel のデータをエクスポートする時の Tips


Mixpanel でデータを収集している時、Mixpanel で提供されている機能以外でも分析等したい時があります。そんな時は、Mixpanel API として提供されているデータのエクスポートを使うと便利です。

その時に気をつけるポイントを幾つかメモしておきます。

## ユーザのデータを取り出したい

イベントのデータは`export`メソッドで取れますが、ユーザのデータは`engage`メソッドで取得します。

```rb

require "rubygems"
require 'mixpanel_client'

client = Mixpanel::Client.new(
  api_key:    'key',
  api_secret: 'secret'
)

params = {
  where: "properties[\"Some Property\"] == \"something\""
}

data = client.request('engage', params)

puts data
```

`where`パラメータには、フィルタをかけるための条件を入力します。`properties[]`の`[]`の中に、ダブルクオートで囲ってプロパティ名を入れた文字列をパラメータにする必要があるので、ダブルクオートを忘れずにエスケープシーケンスで入れておきます。

## プロパティ名の指定方法

地味に引っかかるのが、自分で定義したプロパティと、Mixpanel がはじめから持っているプロパティで指定方法が違う点です。自分で定義したプロパティはそのままですが、Mixpanel がはじめから持っているプロパティは、$を先頭につけてスネークケースにします。

```rb

require "rubygems"
require 'mixpanel_client'

client = Mixpanel::Client.new(
  api_key:    'key',
  api_secret: 'secret'
)

params = {
  where: "properties[\"$city\"] >= \"something\""
}

data = client.request('engage', params)

puts data
```

## 異なる場所から同時に同じアプリケーションについてリクエストできない

詳しくはドキュメントにもなさそうですが、同じアプリケーションに対するリクエストを異なる場所から同時に実行すると、片方がエラーとなってしまうようです。
RailsのViewHelperでプルダウンにdata-bindする

忘れがちなのでメモ

```ruby:
      = select :target, :ym, ['key1'=>'val1','key2'=>'val2','key3'=>'val3'], {selected: 'key2',include_blank: 'こちらからお選びください'},{data:{bind: "value: selected_month,event: {change: move_other_month}"} }
```
knockout.jsのdata-bindで使用。selectedやincludedなどの定義とbindの定義を別々のhash引数として渡してやるところがミソ
Swift で CustomCell を作る


こちらを参考に進めたが一部ハマったので、メモ
http://qiita.com/BigSea/items/9aa35b95e5d4d1dc8a52


StoryboardからLabelとUIImageViewを結びつける必要がありますのやり方がわからなかった。

Custom Class の Class に変更
http://ndinc.d.pr/1jX27/3c7ivKPf

Indentifier を CustomCell にする
http://ndinc.d.pr/16XcL/1PlfBqk7


その後

```
    @IBOutlet weak var name: UILabel!
    @IBOutlet weak var iconImage: UIImageView!
```
と UIImageView を紐付け。

ほかはそのまま出来ました。ありがとうございます。
CentOSでPostgresの環境でRailsアプリを動かす時に出会ったエラー


## Ident authentication failed for user

```
FATAL: Ident authentication failed for user
```

テストのサーバなので許しまくった…いいのか？

```
# "local" is for Unix domain socket connections only
local   all         all                               trust
# IPv4 local connections:
host    all         all         127.0.0.1/32          trust
# IPv6 local connections:
host    all         all         ::1/128               trust #ここぽい
```


## エンコーディングのエラー

```
PG::InvalidParameterValue: ERROR:  new encoding (UTF8) is incompatible with the encoding of the template database (SQL_ASCII)
HINT:  Use the same encoding as in the template database, or use template0 as template.
```

下記のようにエンコーディング指定する

```
CREATE DATABASE "test_development" encoding 'UTF-8' TEMPLATE template0;
```
【AngularJS】$resourceでmetadataをいいカンジに扱う

# $resourceでmetadataをいいカンジに扱う
## TL;DR

```javascript
'transformResponse': function (data, headersGetter) {
  var result = angular.fromJson(data);
  result.data.$metadata = result._metadata;
  return result.data;
},
'interceptor': {
  'response': function (response) {
    response.resource.$metadata = response.data.$metadata;
    return response.resource;
  }
}
```

## WHAT
以下の様なレスポンスを返すAPIがあるとする．

```json
{
  "data": [
    { "id": 1, "content": "kokoro pyonpyon" },
    { "id": 2, "content": "Ah^~ my heart will be hopping^~" }
  ],
  "_metadata": {
    "total": 53,
    "nextPage": 2
  }
}
```

普通に`transformResposne`通すだけだと，`_metadata`が落ちてしまう．
あとのコールバックで`_metadata`を利用したいのでそれは困る．

## HOW
`transformResponse`の返り値に`$metadata`をつっこみ，`interceptor`内で`resource`に押し付ける．

```javascript
var app = angular.module('app', ['ngResource']);

app.factory('Post', [
  '$resource',
  function ($resource) {
    var endpoint = 'api/v1/posts/:id';
    var params = {};
    var actions = {
      'query': {
        'method': 'GET',
        'isArray:' true,
        'transformResponse': function (data, headersGetter) {
          var result = angular.fromJson(data);
          result.data.$metadata = result._metadata;
          return result.data;
        },
        'interceptor': {
          'response': function (response) {
            response.resource.$metadata = response.data.$metadata;
            return response.resource;
          }
        }
      }
    };

    $resource(endpoint, params, actions);
  }
]);
```

### 動作の流れ

上記のコードでは，デフォルトの代わりに利用する`interceptor`を定義している．
[src/ngResource/resource.js#L558-L559 from angular/angular.js](https://github.com/angular/angular.js/blob/master/src/ngResource/resource.js#L558-L559)

```javascript
// src/ngResource/resource.js#L558-L559
var responseInterceptor = action.interceptor && action.interceptor.response ||
  defaultResponseInterceptor;
```

デフォルトの`interceptor`（`defaultResponseInterceptor`）では`response.resource`を返すようになっている．
[src/ngResource/resource.js#L497-L499 from angular/angular.js](https://github.com/angular/angular.js/blob/master/src/ngResource/resource.js#L497-L499)

```javascript
// src/ngResource/resource.js#L497-L499
function defaultResponseInterceptor(response) {
  return response.resource;
}
```

`response.resource`にはAPIのレスポンスを`Resource`でラップしたものが入っていて，それが最終的に呼び出し元に返される．
ということで，`response.resource`に`$metadata`を押し付けておけば後から取り出してほげほげできるというわけ．

![image](https://qiita-image-store.s3.amazonaws.com/0/14845/5623a012-68c8-3d29-1cd7-460ab6644823.png)

Railsでいう`index`ライクな，リストを返すAPIが上記の形式（`{ "data": [...], "_metadata": {...} }`）で統一されているならば，`transformResponse`や`injector`をうまくサービス化してDRYにできるかもしれない．
`transformResponse`と`interceptor`を使いこなしたイケてるコードを書こう．

# REF
* [Metadata passthrough for ngResource queries - JSFiddle](http://jsfiddle.net/wortzwei/bez79/)
* [AngularJS: API: $resource](https://docs.angularjs.org/api/ngResource/service/$resource)
ニフクラ mobile backendの署名処理をPHPで実装してみた

ニフクラ mobile backendではREST APIを提供しています。そのためSDKを提供しているプラットフォーム（iOS/Android/JavaScript/node.js/Unity）以外の言語からでもデータを操作したり、プッシュ通知を作成するといったことが可能です。

別な言語からニフクラ mobile backendを操作する際に最大のネックになりそうなのがシグネチャを作成する処理になるかと思います。そこで[REST API リファレンス : シグネチャの生成方法 | ニフクラ mobile backend](http://mbaas.nifcloud.com/doc/rest/common/signature.html)を参考にPHPで実装してみました。

## 答え

```php
<?php

$method = 'GET';
$fqdn   = 'mbaas.api.nifcloud.com';
$api_version = '2013-09-01';
$path        = 'classes/TestClass';
$hash = [];
$hash['where'] = json_encode(array("testKey" => "testValue"));
$timestamp = "2013-12-02T02:44:35.452Z";

// 日付はこんな感じで
// $timestamp = date(DATE_ISO8601, time());

$application_key = '6145f91061916580c742f806bab67649d10f45920246ff459404c46f00ff3e56';
$client_key      = '1343d198b510a0315db1c03f3aa0e32418b7a743f8e4b47cbff670601345cf75';

$header_string  = "SignatureMethod=HmacSHA256&";
$header_string .= "SignatureVersion=2&";
$header_string .= "X-NCMB-Application-Key=".$application_key . "&";
$header_string .= "X-NCMB-Timestamp=".$timestamp . "&";
$header_string .= http_build_query($hash);

$signature_string  = $method . "\n";
$signature_string .= $fqdn . "\n";
$signature_string .= "/" . $api_version . "/" . $path ."\n";
$signature_string .= $header_string;

echo base64_encode(hash_hmac("sha256", $signature_string, $client_key, true)); 
echo "\n";

```

このコードでドキュメントに書かれているシグネチャが生成されます。

## データはJSONで

連想配列からjson_encode関数を使ってJSONにエンコードします。

```php
$hash['where'] = json_encode(array("testKey" => "testValue"));
```

その上でURLエンコードします。この辺りは関数が多い、PHPの良さが活かせます。

```php
$header_string .= http_build_query($hash);
```

## シグネチャ用文字列の生成

基本的に文字列を順番にくっつけるだけです。$header_stringはキーの自然順序付け、昇順となっています。なので大文字→小文字、かつA→Zの順番になっています。

さらにリクエストメソッドやAPIパスなどをつけて完成です。この辺りは関数の引数に指定しておくのが良さそうです。

## シグネチャ生成

シグネチャはクライアントキーを使って、HmacSHA256でエンコードし、さらにその結果をBase64でエンコードしています。

```php
echo base64_encode(hash_hmac("sha256", $signature_string, $client_key, true));
```

最後の引数のtrueは hash_hmac がデフォルトで16進数値で返却するようになっているため、RAWデータでの出力を指定するものです。

----

正しいシグネチャさえ生成できれば、ニフクラ mobile backendの操作は難しくありません。サーバサイドと連携させれば、より柔軟なシステム構成が実現するはずです（プッシュ通知だけ使うなど）。

[サーバー開発不要！アプリ開発をよりスマートに、スピーディに。 | ニフクラ mobile backend](http://mbaas.nifcloud.com/)
"第30回オフラインリアルタイムどう書くの問題" 解いてみた

# 概要
Nabetaniさんの「とある世界のタクシー料金」問題をRubyで解いてみました。
元記事はこちらから
[http://qiita.com/Nabetani/items/c70417d384720a3339d6](http://qiita.com/Nabetani/items/c70417d384720a3339d6 "第30回オフラインリアルタイムどう書くの問題")

# 実装

Rubyで解いてますが、解き方自体はどの言語でも良さそうな感じの実装です。
(どちらの都市でも200m毎に料金加算なので使ってない定数は放置)

```rb:taxi_fee.rb

# encoding: sjis
# 
# とある世界のタクシー料金を計算する
# Author:: lithtle
# Created_At:: 2015-04-21
# Link:: http://nabetani.sakura.ne.jp/hena/ord30taxi/

# 都市の地点と経路
CITY = {
	enlightened: [:A, :B, :C, :AB, :AC, :BG, :CF, :BC],
	registance: [:D, :E, :F, :G, :AD, :CD, :DE, :DF, :EG, :FG]
}.freeze

# 各地点間の距離
DISTANTCE = {
	AB: 1090,
	AC: 180,
	AD: 540,
	BC: 960,
	BG: 1270,
	CD: 400,
	CF: 200,
	DE: 720,
	DF: 510,
	EG: 1050,
	FG: 230
}.freeze

# 各都市でのタクシー設定
TAXI_SETTING = {
	enlightened: {min_dist: 995, min_fee: 400, per_meter: 200, per_fee: 60},
	registance: {min_dist: 845, min_fee: 350, per_meter: 200, per_fee: 50}
}.freeze

# 経路から都市を判定する
# == Args
# _route_: 経路または地点、文字列
# == Returns
# 覚醒派か開放派か
def get_city(route)
	if CITY[:enlightened].any?{ |e| e == route.to_sym || e == route.reverse.to_sym }
		:enlightened
	elsif CITY[:registance].any?{ |e| e == route.to_sym || e == route.reverse.to_sym }
		:registance
	else
		raise "未定義の経路指定"
	end
end

# とある世界のタクシー料金を求める
# == Args
# _route_: 料金を計算したいルート
# == Returns
# 料金
def get_taxi_fee(route)
	n = 2
	start_point = route[0]

	# 各地点の累積距離を求める
	route = route.scan(/\w/).each_cons(n).map(&:join) # => ["AB", "BC", "CD"]
	each_dist = route.map{ |e| DISTANTCE[e.to_sym] || DISTANTCE[e.reverse.to_sym] } # => [100, 200, 300]
	integrated_distantce =  each_dist.collect.with_index{ |e, i| each_dist[0..i].reduce(:+) } # => [100, 300, 600]

	# 初期設定(初乗り運賃、初乗り料金)を求める
	running_disatnce, total_fee = [
		TAXI_SETTING[get_city(start_point)][:min_dist],
		TAXI_SETTING[get_city(start_point)][:min_fee]
	]

	# タクシー⊂（＾ω＾）⊃ﾌﾞｰﾝ
	total_distance = integrated_distantce[-1]
	while running_disatnce < total_distance
		# 到着したら終了
		if running_disatnce > total_distance
			break
		end

		# 現在位置からどちらの都市かを判定し運賃を加算
		current_pos = route[integrated_distantce.find_index{ |e| e > running_disatnce }]
		total_fee += TAXI_SETTING[get_city(current_pos)][:per_fee]

		# 200m すすむ
		running_disatnce += 200
	end

	total_fee
end

# てすと
def test
	DATA.read.split("\n").map{ |e|
		e.gsub(/\s+/, ",").split(",")
	}.each do |item|
		i, route, expect = item
		actual = get_taxi_fee(route)
		ok = actual == expect.to_i ? "ok" : "ng"
		puts "%2d: %-10s => res: %5s == %-5s : exp => %s" % [i.to_i, route, actual, expect, ok]
	end
end

if $0 == __FILE__
	test
end

__END__
0 	ADFC 	510
1 	CFDA 	500
2 	AB 	460
3 	BA 	460
4 	CD 	400
5 	DC 	350
6 	BG 	520
7 	GB 	530
8 	FDA 	450
9 	ADF 	450
10 	FDACB 	750
11 	BCADF 	710
12 	EDACB 	800
13 	BCADE 	810
14 	EGFCADE 	920
15 	EDACFGE 	910
16 	ABCDA 	960
17 	ADCBA 	1000
18 	BADCFGB 	1180
19 	BGFCDAB 	1180
20 	CDFC 	460
21 	CFDC 	450
22 	ABGEDA 	1420
23 	ADEGBA 	1470
24 	CFGB 	640
25 	BGFC 	630
26 	ABGEDFC 	1480
27 	CFDEGBA 	1520
28 	CDFGEDABG 	1770
29 	GBADEGFDC 	1680
```

# その他
都市名がingress由来ということにさっぱり気づきませんでした。書いてる途中にふと気になって調べてみたらingressのページがでてきたため、いそいでコードに修正を加えました。
Bootstrap使ってる場合に、スマホでの見た目をPCビューにする方法


全然需要ないかもだけど、自分用メモとして。

Bootstrap使っててレスポンシブしたくないなぁ、って時は、
[こんな感じ](http://getbootstrap.com/getting-started/#disable-responsive)でやればいいと書いてある。

1, Viewportを削除
2, .containerのwidthを固定（例：width: 960px !important;）
3, Bootstrapのテンプレートであるスマホ用のハンバーガーメニューは削除
4, グリッドレイアウトを使う場合は全て .col-xs-* を使う


これでスマホで見た時にPCビューになります。
3は別にやらなくても対応できた。


Googleがスマホ対応しないと怒るよって言われている時代に、
なんか事情があってスマホ対応できない人がいたらご参考までに。
fatal:multiple stage entries for merged fileでgit操作ができなくなった時の対処法

Gitでコミットしようとして、git statusで確認後、git addをしたら下記のエラーが表示された。

```console
fatal: multiple stage entries for merged file 'filePath/~~~'
```

その後、git checkout、git commit、git status、git addなどなど、ほとんどのgitコマンドが効かなくなってしまって焦ったので、対処法を記す。


```console
rm .git/index

git add -A
git commit
```
<br>
どうやらindexファイルがおかしなことになっているようなので、indexファイルを削除。
その後、新しく作成されたファイル、削除されたファイルの情報、ファイルの変更を インデックスに追加。

何故このエラーが出るようになってしまったのかが気になるが、これで元通りに作業出来るようになった。
GitHubへの公開鍵の登録

[KosenVenture](http://www.kosen-venture.com/)開発チームに新たにジョインする高専生のためのメモとして書いたものですが、せっかくなので公開しておきます。

# 0. 前提条件

- Githubに登録済み
- MacまたはLinux（Windowsは対象外。それ以外を使うような変態は公開鍵の登録くらい自分でできる）

# 1. 鍵ペアを作成する

以下のコマンドを実行する。いろいろ聞かれるけど全部何もせずにEnterを押せば良い

```bash
$ ssh-keygen -t ed25519
```

また、`cat`等を使用して、生成された**公開鍵**をクリップボードにコピーしておく。

```bash
$ cat ~/.ssh/id_ed25519.pub
```

# 2. GitHubに登録する

[Github](https://github.com)にアクセスする。

ページ右上の <i class="fa fa-cog"></i> から設定画面にアクセスする。
 
![3e064f5c446a5303d8349d86925e8b3c.png](https://qiita-image-store.s3.amazonaws.com/0/59571/4c04db0e-0c4a-82b6-4f9c-0ba7c1302e64.png)

左メニューの**SSH Keys**を選択する。

![ad3807432d51f47023786d1375c67f83.png](https://qiita-image-store.s3.amazonaws.com/0/59571/6869cdec-307a-755c-0206-6f8e6f797eeb.png)

すると、SSH設定画面に切り替わるので、**Add SSH Key** と書かれたボタンをクリックする

![c21a5ab8909915ee6acbde2fa82fadcb.png](https://qiita-image-store.s3.amazonaws.com/0/59571/b95b05fe-84b0-2caa-3e71-e68d5884b6c8.png)

SSH鍵を追加するためのフォームが表示される。

Titleはただの名前なので自由につけて良いが、あとから見た時にどの鍵なのかわかるようにすること（鍵は複数登録できる）

Keyには、クリップボードにある公開鍵をはりつける。

SSH鍵は追加または削除しかできないので、入力ミスに注意する。

![abed479f45b79eeb9f55f9a744c16d12.png](https://qiita-image-store.s3.amazonaws.com/0/59571/f861e27e-d871-075a-42a9-54b3bf322dfc.png)

最後に、**Add Key**と書かれた緑のボタンをクリックする。

# 3 確認

以下のコマンドを使用して、正しくSSH鍵が追加されたか確認すること

```bash
$ ssh -T git@github.com
```

その際、以下の様な警告が出るが、yesとすれば良い。

```
The authenticity of host 'github.com (207.97.227.239)' can't be established.
RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)?
```

正しく追加されていれば、以下の様なメッセージが表示される（{username}はユーザー名）

```
Hi {username}! You've successfully authenticated, but GitHub does not
provide shell access.
```

# 参考

- [Generating SSH keys - User Documentation](https://help.github.com/articles/generating-ssh-keys/)
Apple Watchアプリ作成、申請時の注意点まとめ

今回、アプリをApple Watchに対応しました。

その時にいくつかはまったことがあったので、メモがてら残しておきます。

##画像は@2x画像で用意する
Apple WatchはRetinaディスプレイなので、当然なのですが、@3x画像が使えませんでした。

Images.xcassetsで画像を追加するときに@3xの指定もできましたが、指定を@2xで。

![スクリーンショット 2015-04-16 17.38.16.jpg](https://qiita-image-store.s3.amazonaws.com/0/40009/1dbb94a3-a84d-d252-6488-f6f6dd55157e.jpeg)

@3xで画像を設定すると、なぜか画像が小さく表示されました。
大きいサイズで設定しておけばいいかなーとか思っていたら、そうでもないようです。

画像サイズはそのままで@3x→@2xへリネームしたら、画像サイズそのままで表示されました。


##アプリのバージョンを合わせる
Extension同様にApple Watchアプリにもアプリのバージョンが存在します。

「WatchKit Extension」「WatchKit App」それぞれにInfo.plistがあります。

![スクリーンショット_2015-04-16_17_48_02.jpg](https://qiita-image-store.s3.amazonaws.com/0/40009/7c2aaeef-007d-985c-7ad3-b35fc575341d.jpeg)

このVersion（CFBundleShortVersionString）、Build（CFBundleVersion）をiOSアプリ側と同じにする必要があるようです。
デフォルトではバージョンが1になっているのですが、ここを書き換えてアプリのバージョンを同じにしましょう。
（同じでない場合はエラーになって、ビルドできませんでした）

##Apple Watch用のアイコンは透過させてはいけない
Apple Watch用のアイコンはいくつかあります。

![スクリーンショット 2015-04-16 17.52.54.jpg](https://qiita-image-store.s3.amazonaws.com/0/40009/db241774-a187-d86e-223f-9122fdf6c31d.jpeg)

ここで設定するアイコンはアプリのアイコン同様に透過させてはいけません。
透過させたアイコンを使用して、申請をするとエラーということで、バイナリ申請ができませんでした。

>Invalid Icon - The watch application 'XXXXXXXXXX.app/PlugIns/XXXXXXXXXX WatchKit Extension.appex/XXXXXXXXXX WatchKit App.app' contains an icon file 'XXXXXXXXXX.app/PlugIns/XXXXXXXXXX WatchKit Extension.appex/XXXXXXXXXX WatchKit App.app/AppIcon29x29@3x.png' with an alpha channel. Icons should not have an alpha channel.

透過させているアイコンを差し替えてもう一度申請してください、というメールが届いて、バイナリは受け取ってもらえませんでした。

ちなみに、Apple Watch用のアイコンのサイズ一覧はこちら。

|| Apple Watch (38mm) | Apple Watch (42mm) |
|-----------|------------|------------|
|Notification Center icon|48 px|55 px|
|Long-Look notification icon|80 px|88 px|
|Home Screen icon|80 px|80 px|
|Short-Look icon|172 px|196 px|

また、iOS側で使用するアプリ用のアイコンはこちら。

|-| @2x | @3x |
|:-----------|:------------|:------------|
|App icon|58 px|87 px|

・参考：https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/WatchHumanInterfaceGuidelines/IconandImageSizes.html

通知に対応していないアプリもあるかと思いますが、追加しておいたほうがよさそうです。


##WatchKit Extension, WatchKit App用のProvisioning Profileが必要
これもApplication Extension同様にProvisioning Profileが必要です。

それぞれApp IDを登録して、Provisioning Profileを作成しましょう。
これをしていないと申請できません。


##Apple Watchでの時計アプリは現時点では全てリジェクト対象
もう言っていますが、これです。

最初から若干リジェクトの対象かな…と思っていたら、まさにそうでした。
自分がパパッと作ったアプリはリジェクト対象となりました。

時計以外に特に他の機能を付けていないというのも理由になるのかもしれませんが、時計アプリはリジェクト対象となるようです。


##AdHoc配布をする際にはApple WatchのUDIDをProvisioningProfileに追加する必要がある
作成中のアプリをAdHoc配布でテスターの人に確認をしてもらう際にProvisioningProfileにApple WatchのUDIDが含まれていないとインストールができません。

iPhoneにはインストールができても、Apple Watchにはインストールができないという状況になってしまいます。

Apple Watchを持っているテスターの人にテストをしてもらう際には事前にUDIDを確認しましょう。

UDIDを確認する方法は以下に書きました。

http://qiita.com/takashings/items/f979fbe80740dab4023b



ひとまず、今回のアプリでハマったことを並べてみました。
いくつかApple Watch対応のアプリを作る予定なので、その際に躓いたらこちらに追加しようと思います。

>**2015年4月28日(火)**：「AdHoc配布をする際にはApple WatchのUDIDをProvisioningProfileに追加する必要がある」を追加しました
IEのSeleniumでID指定時のみNoSuchElementExceptionが出る時の応急処置

Selenium WebDriverでIE11の自動テストを試したところ、<b>idで指定した時だけ</b>エレメントが見つからないエラー(NoSuchElementException)が出てしまった。

他の指定方法(:cssや:name)だと問題なかったので、
もともとあったラッパーを下記のように変えてみたら動いた。

```lang:helpers.rb
def find(how, what)
  if how == :id
    how = :css
    what = "#" + what
  end
  @driver.find_element(how, what)
end
```

つまり
(:id, "xxx")を
(:css, "#xxx")
に変えてしまうという力技です。

根本的な解決方法あれば知りたいですが、とりあえずこれでやってます。
Sublime Text windows編

##windowsでsublime textを使用する

[sublime text2のダウンロード](http://www.sublimetext.com/2)

* 32bit版か64bit版を選択しリンクをクリック。
* zipファイルがダウンロードされたら解凍。
* sublime text2を起動
* [設定の変更](http://dev.classmethod.jp/tool/html-corder-sublime-text-2-customize/)-リンク先の大見出し「主な設定」を参照

##日本語入力可

[プラグインのインストール](http://blog.yujigraffiti.com/2013/04/sublime-text-2aptitudeapt-get.html)-リンク先の手順通りに行えばOK

上記の方法でダメだった場合

[上記以外のやり方](http://ameblo.jp/natu-days/entry-11805330510.html)-リンク先の手順通りに行えばOK

「Package Control」は設定出来たけど日本語入力packageがインストールできない場合

[手動ダウンロード](http://webkikaku.co.jp/staff/software/windows-sublime-text-2/)-リンク先の大見出し「インストール方法」を参照


指定のフォルダにpackageをセットしてsublime Text2を再起動。
prawnとprawn-tableでPDF

pdfでテーブルを出力する際にprawn + prawn-tableを使用している
のでサンプル

# Gem準備

``` ruby:Gemfile
source 'https://rubygems.org'
gem 'prawn'
gem 'param-table'
```

# pdf用のクラス作成
僕の場合はpdfごとにクラス作るようにしています。

``` ruby:hoge_hoge.rb
  HogeHoge < Prawn::Document
    def initialize
      # 用紙サイズと向きを指定
      super(page_size: 'A3', page_layout: :landscape)
      render_table
    end
    
    private
    
    def render_table
    end
  end 
```
# 出力
railsのコントローラーとかから

``` ruby:hoges_controller.rb
def action
  send_data PDF::HogeHoge.new.render, filename: "hoge.pdf", type: 'application/pdf'
end
```

この時点では真っ白だと思うので、tableを書いていきます。

# テーブルを書く
サンプルなので適当に

``` ruby:hoge_hoge.rb
def render_table
  data = [['column1', 'column2'], ['value1_1', 'value1_2'], ['value2_1', 'value2_2']]
  table data
end
```
これだけでPDFをテーブルに出力できるようになります。

# その他

## テーブルが複数ページにまたがる場合

  ``` ruby
  table data, header: true
  ```
  をつけとくと、テーブルがページをまたがってもヘッダをつけてくれる
  
  ``` ruby
    render_table
    number_pages('<page> / <total>', at: [bounds.right - 50, 0])
  ```
  こうしとけば各ページにページ番号もつけれます。

## テーブルのスタイルまわり

テーブルの5行ごとに下線を太くしたい

``` ruby
  table data, header: true do |t|
    t.before_rendering_page do |page|
      0.step(page.row_count, 5) do |i|
        page.row(i).border_bottom_width = 3
      end
    end
  end
```

上記だとページがまたがっても大丈夫

テーブル全体でスタイル指定したい

``` ruby
table data, cell_style: { size: 18 }
```

セルごとに細かくスタイル指定したい

``` ruby
data = [
 make_cell(content: 'aaa', align: :center, valign: :center, size: 10),
 { content: 'bbb', size: 20 }
]
```
とかでOK


# 参考サイト

* [prawnpdf/prawn](https://github.com/prawnpdf/prawn)
* [prawnpdf/prawn-table](https://github.com/prawnpdf/prawn-table)
各種バージョンをコマンドで確認（OS・Apache・MySQL・Nginx・PHP）


## OSのバージョン
```
cat /etc/redhat-release
```

## Apacheのバージョン
```
httpd -V
```

## MySQLのバージョン

```
mysql --version
```

## Nginxのバージョン
```
nginx -V
```

## PHPのバージョン

```
php -v
```
telnetコマンド

#telnetコマンド
*個人的な授業のメモです*

##telnetコマンドとは
####　離れたところにあるホスト（サーバーやネットワーク機器）を手元の端末から遠隔操作するために、ネットワーク接続するためのコマンドである。

　わざわざホストがある場所に行かなくても、telnetコマンドで接続したホスト上でアプリケーション・ソフトを実行したり、そのホストを管理したりすることができる。Webサーバーやメール・サーバーなどを新しく構築したときに、設定を確認したり、**正しく動作していることを調べたりするときにもtelnetコマンドを使って接続してみるとよい。****トラブルが発生したときにも**、telnetコマンドで接続することで、動作ログやアクセス・ログを調べたり、ソフトをデバッグしたりといったことができる。メーラーなどのクライアント・ソフトの動作がおかしいときにtelnetコマンドを実行することで、ネットワークの接続を確認してみたり、代替手段としてメールを送信したりといったことが可能だ。
　**telnetコマンドはそれ自体がホストを遠隔操作するコマンドというわけではない。遠隔操作のための環境を整えるコマンドである。**

##実行方法
```Bash
$ telnet
```
でtelnetを起動

```Bash
telnet>`サブコマンド`
```
サブコマンドを打てるようになった！
####↑この状態を`コマンド・モード`といいます。
※サブコマンドとは下の表

| 主なサブコマンド | 意味 |
|:-----------|------------|
| open <ホスト名><ポート番号>       |        指定したホストとポート番号に接続する。既定のポート番号は23 |
| close     |      現在の接続を終了する |
| display       |        現在の設定状態を表示する |
| quit         |          telnetコマンドの実行を終了する |
| set logfile<ファイル名>       |       指定したファイルに出力する |
| set codeset<コード名>    |     日本語の文字コードを指定する |
| set localecho    |     入力した文字列を表示する |
| unset    |     setオプションの設定を解除する |
　

```Bash
telnet>open `IPアドレス`
```
を実行することで、端末からホストへの**パイプ**が出来上がった！
####↑この状態を`セッション・モード`といいます。
セッション・モードでは、画面表示や入力形式が接続先のホストのものとなる。(**あたかもそのホストの前にいるように操作ができる**)

###モードの切り替え方法
セッション・モードからコマンド・モード
`ctrl + ]`
コマンド・モードからセッション・モード
`Enter`

　
####このようにtelnetコマンドでは、コマンド・モードでホストへのパイプを作り、セッション・モードでホストを遠隔操作します。
c++ builder XE4 > IndyTextEncoding()の戻り値の型 > Idglobal::_di_IIdTextEncoding

```txt:動作確認
C++ Builder XE4
```

IndyTextEncoding()の戻り値を格納する型としては以下のように定義しておくようだ。

```
#include <idglobal.hpp>

Idglobal::_di_IIdTextEncoding m_encSJIS;

m_encSJIS = IndyTextEncoding(932);
```

IdGlobal.hpp に定義されているIndyTextEncoding()の定義から知った。
プルリクエストごとに、変更されたファイルの一覧から情報を得る

## `git diff --stat` のフォーマットからファイル一覧を得る

```console
$ git diff --stat=256 origin/master..HEAD
 test/lib/populus/test_configuration.rb | 36 ++++++++++++++++++++++++++++++++++++
 test/lib/test_populus.rb               |  7 +++++++
 2 files changed, 43 insertions(+)
```

`git diff --stat` のフィールドは、空白で分割すると１番目がファイルパス、４番目が追加削除の様子、になるのでそれを利用できる。

長いファイル名だとtruncateされるので `--stat=256` みたいに横幅を明示すると良さそう。

```ruby
# origin/master..${current SHA1} みたいなのを渡す
@range = ARGV[0]
data = `git diff --stat=256 --no-color #{@range}`
rolenames = data.lines
  .map {|l| l.strip.split(/\s+/) }
  .select {|r| r[3].include? '+' }
  .map {|r| detect_foobar_from_filename(r[0]) }
  .compact
  .flatten
```

`detect_foobar_from_filename` で、例えばファイル名からPuppetやChefのロールを検出することができそう。手元では、ロールを導出して最後に計算してgit diffから一番影響を与えるロールを検出し、そのロールだけテストするみたいなことをやった。

### パッペット事例のご紹介

以下、思いっきりPuppetの事例だが、みんな Puppet 使ってると思うし、あとディレクトリ構成は [名著](http://www.amazon.co.jp/%E5%85%A5%E9%96%80Puppet-Automate-Your-Infrastructure-%E6%A0%97%E6%9E%97%E5%81%A5%E5%A4%AA%E9%83%8E-ebook/dp/B00CL92JC0) の構成を前提にしたものとしているのでそのまま使えると思う。え、あのディレクトリ構成を守ってないんですか......。

```ruby
@range = ARGV[0]
data = `git diff --stat=256 --no-color #{@range}`

detect_role_from_filename = lambda {|filename|
  case filename
  when %r<^roles/([_a-z]+)/.*$>
    # ロールのマニフェスト直接変更の場合は10ポイント
    [$1] * 10
  when %r<^spec/([_a-z]+)/.*\.rb$>
    # 関連するspecの変更の場合は5ポイント
    # この辺の傾斜は徐々に調整するといいのでは
    if $1 != 'support' # serverspecサポート用のファイルを除外する
      [$1] * 5
    else
      nil
    end
  when %r<^modules/([_a-z]+)/.*>
    # そのほか、普通のモジュールは
    # 影響度を雑に計算している
    `git grep 'include ::#{$1}' roles/`
      .lines
      .map{|l| l.split('/')[1] }
      .uniq
  else
    nil # detection failed
  end
}

rolenames = data.lines
  .map {|l| l.strip.split(/\s+/) }
  # ファイル削除の場合は無視
  .select {|r| r[3].include? '+' }
  .map {|r| detect_role_from_filename.(r[0]) }
  .compact
  .flatten

# group_by みたいなんを自分でやってる...
stats = rolenames.inject({}) { |dst, record|
  dst[record] ||= 0
  dst[record] += 1
  dst
}

$stderr.puts "Summary: #{stats.inspect}"

# TODO: 同率の場合辞書順...
detected = stats.max_by{|(k, v)| v }

if detected
  $stderr.puts "Detected: role #{detected.inspect}"
  puts detected[0]
else
  $stderr.puts "No role detected. Fall back to testing against <base>"
  puts 'base'
end

# おしまい
exit
```

以下のように、stdoutに最終的に `www` みたいなロールを吐き出すようになっていて、シェルスクリプト内部で変数にアサインできる。

```console
$ role=$( script/get_role_by_change.rb origin/master..a123bc45 )
=> stderr: Summary: {"www"=>5, "log"=>3}
=> stderr: Detected: role ["www", 5]
=> `www' is assigned to $role
```

関係ないとこをテストして厭っぽいとか時間かかりすぎるとか、よくあると思うので、こういうハックをして乗り切るのも一興だと思う。
.adgaファイルをemacsで開いてもagda2-modeが自動的に起動しない時にすべきこと

**以下の内容を確認**

- Agdaがインストールされているか
- `agda-mode setup`は済んでいるか
- `auto-mode-alist`に`agda2-mode`が追加されているか

それでもダメなら

- 拡張子が`.adga`になってないかを確認


# 根本的な解決策

emacsの設定ファイルに次の一行を追加

```el:
(setq auto-mode-alist (append '(("\\.adga$" . agda2-mode)) auto-mode-alist))
```

# 根本的でない解決策
`mv myfirst.adga myfirst.agda` を実行