OmniAICreator/Qiita-1.07M huggingface dataset:
[solved] LINE Bot with AWS ECS and API Gateway

Have been working for a few hours on `AWS API Gateway` and `LINE BOT`, however, I noticed `LINE BOT` is having problem calling `API Gateway`, there is no access log in `CloudWatch Logs` from `AWS Lambda`.

However, if I run my docker web service in `AWS ECS` behind `ELB` with my `RapidSSL` certificate attached onto `ELB`, it works like a charm!

<img width="1019" alt="螢幕快照 2016-04-10 上午11.49.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/120752/a6dc6217-bad7-b3ba-22ae-3e585057e489.png">

I have tried to attach the same `RapidSSL` certificate to [AWS API Gateway Custom Domain Name](http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-custom-domains.html) but still no luck. I believe the certificate is good. `LINE BOT` should have some problem visiting `API Gateway`

<img width="447" alt="螢幕快照 2016-04-10 上午11.51.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/120752/e5e7cdf6-ae09-825d-42ca-3d9d2d7f5fa9.png">

I do hope `LINE` Corp can help on this, as it is very important to build LINE BOT in a `serverless` fashion.


UPDATE:
Issue solved, please check [here](https://twitter.com/pahudnet/status/719810172168892416)
vmwareで簡易インストールを利用しない

備忘録として投稿します。
素人の学生ですが今回vmwareを利用してubuntu14.04をインストールしたところ次のような問題が起きました。

**・キーボードレイアウトがうまくいかない**
**・日本語入力がうまくいかない**

このどちらも設定を調べて変更しても自分の環境ではうまくいかなかったので対処方法を載せておきます。
原因は次の一点でなおることができました。
※あくまで自分の環境で

**・vmwareの簡易インストールを利用しない**

vmwareで仮想マシンの登録をする際にあらかじめisoファイルでosを落としておくのが通常の流れだと思います。
その流れだと新しい仮想マシンの登録の際にisoファイルを選択することになるとおもいます。
しかし、後で選択するという選択肢が一番下にあります。これを選択していつものように設定を進めていくと仮想マシンの登録を終えることができます。
その後、isoファイルの選択を行うことで簡易インストールの問題を回避することができます。一回仮想マシンをシャットダウン後vmwareの設定からdvdなんとかって
項目からisoファイルを参照。

※さらに簡易インストールをしないと新たな問題が発生します。

**・解像度が自動設定されない**

原因はたしかではありませんが簡易インストールを回避することでvmwaretools（なんか自動設定してくれるようなもの？）がインストールされず
手動でやらなくてはいけない。
これは事例がたくさんあるので検索すると良い。

これで春から新たな開発（勉強？）環境ができたはず
ちなみに解決までに半日かかった。
チームに積極的にコミットするためのプラクティス（開発チームのマネジメントについて


[アジャイル開発とスクラム~顧客・技術・経営をつなぐ協調的ソフトウェア開発マネジメント](http://www.amazon.co.jp/%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E9%96%8B%E7%99%BA%E3%81%A8%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%A0~%E9%A1%A7%E5%AE%A2%E3%83%BB%E6%8A%80%E8%A1%93%E3%83%BB%E7%B5%8C%E5%96%B6%E3%82%92%E3%81%A4%E3%81%AA%E3%81%90%E5%8D%94%E8%AA%BF%E7%9A%84%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%88-%E5%B9%B3%E9%8D%8B-%E5%81%A5%E5%85%90/dp/4798129704)を読んでます。

#Overview

朝会しますって時に、「今日朝会なしで！」というチャットがきて、なんかやばいと思いました。プラクティスに関する理解を共有する必要性を感じたのでまとめることにします。

#デイリースクラム

プロジェクトが悪い状況に陥らないためには、起こりうる障害に警鐘を鳴らしチームに共有する必要があるのです。そのためには毎日短時間のミーティングをします。このミーティングをデイリースクラムといいます。

デイリースクラムはタスクをあぶりだしたり、作業のリマインド、開発者同士の進捗確認、障害に対する危機感の違いを共有する場として機能します。また、作業項目や課題は[Trello](https://trello.com/)で`タスクかんばん`をつくり見ながらやると効果的です。

ミーティングでは以下の三つについて話しあいます。

- 前日やったこと
- 今日やること
- 障害になっていること

決まった場所と時刻と時間を設定し、習慣化するのがポイント。
また「今日はAmazonが家に届くので定時ダッシュします」みたいなタスクかんばんにCardを作成する必要のないことも言っておくことで、気持ち良くダッシュすることができます。自分の作業に透明性を持つことが重要となります。朝会がないなんてことはありえないです。

#タスクかんばん

![スクリーンショット 2016-04-10 10.27.02.png](https://qiita-image-store.s3.amazonaws.com/0/118226/8d87dcda-1c57-09e7-69e7-1f222c00a7e9.png "スクリーンショット 2016-04-10 10.27.02.png")



プロジェクトの状況を[Trello](https://trello.com/)を使ってタスクを確認できるようにしています。プロジェクトのbordで見ながらタスクの状態を確認する。（Trelloの機能についての説明は省略します。）

またそれぞれのタスクにおいてCardにステータスのLabelを設定し、視覚的にわかりやすくする。Labelの役割は以下の感じで設定しています。

- `Doing`　カードの担当者が現在着手している
- `Done`　カードの担当者が対応した
他のメンバーによるAcceptを待っている状態
- `Pending`　仕様等をプロダクトオーナーに確認しないといけない
Due Dateを設定すべき。
- `Problem`　着手するにあたって解決しなくてはいけない問題があり作業着手できない
担当者以外もこのラベルに注意し、問題解決に取り組まなくてはいけない
- `Issue` 議論するべき内容
- `Accept`　作業の完了を作業者以外の人が確認した状態
コメントで誰がAcceptしたか記載しておくと良い
確認できればだれでもこのラベルをつかってよい

Labelの色がしばらく変わらない場合は項目の粒度に問題がある場合があるのでその項目を見直し細分化することで作業の進捗を把握するといいかもしれないです。２−３時間以内で完了する粒度がいいようです。
`chrome://settings/`　で起動時にアサインされているプロジェクトのボードを表示するようにしておくのが個人的にオススメです。

#KTP(ふりかえり）
フェーズが終了したらKPTを行います。これはKeep,Try,Problemの頭文字で良かったこと、悪かったこと、改善点を話し合います。
今後のプロジェクトの活動に役立てるのが本質なのでリスト等の資料を作ることはmustではありません。出前のラーメンとかミスド食べながらとか、本来はそんなゆるい雰囲気で話し合うのがいいようです。

例として前回社内でしたKPTで上がった項目の一部を記載します。主にPTの部分

- API開発の遅れでアプリ開発着手が遅れる
	- テストサーバーのデータが予告なしに削除されることとかがあったのでスタブサーバーを設置し、常に同じ値を返すAPIを作成する
	- モバイル開発用テストサーバーとウェブ開発用テストサーバーで分けて欲しい。
- Bugの報告
	- 端末情報、スクリーンショットと再現方法を記載する。
- API周りの動作確認
サーバーにちゃんとリクエストできてるか確認できるように、ブラウザでサーバーログを確認できるようにしたい。そうすることで、不具合の特定を絞り込める。
- 会議がとにかく長い
	- ホストを設定しアジェンダを作成。会議中で上がった項目は目的の議題の話し合いの後にする。 そこで「うーん」て考えない。
- テストデータの作成をアプリ開発側でできるようにしたい
	- データ作成フローを共有してもらう

#技術的な気づきを他のプロジェクトのメンバーに共有する
プログラマーはQiitaを積極的に活用し、知見を共有しましょう。もちろん社外秘なことは公開してはいけないけれど、社外秘なことはビジネスロジック的なことだったり運用のフローだったりもするので、共有されても「？？？」な内容なので、上手に抽出することで（そう心がけることで）共有したことをうまく伝えられるような気がします。

#とりえあずおわりに
プラクティスの解説の部分について主に書きました。プラクティスやツールの導入の際はアジャイルの概念の理解がスムーズに導入するために役に立つと思います。やはりコンテキストの共有が一番だと個人的に思います。（なので社内で読んでない人は、2章くらいまでは最低でも読んでほしいです）

#追記
デイリースクラムを短時間で終わらせるためのTipsをTwitterで見かけましたのでリンクを貼っておきますね
https://twitter.com/agenteo/status/718540533346373632
MAMPでエラーログを確認する

PHPでコードを書いていたら、画面が真っ白になってしまった。。。
私のようなペーペーにはよくあることです。
そんなときに使えるエラーログの確認方法の1つをまとめました。
**エラーを起こしている場所が分かれば、修正方針も立てやすくなります。**
ご参考にしていただければ嬉しく思います。
（試してはいませんが、XAMPPでも同様の手順だと思います。）
# エラーログを吐いている場所を見つける
MAMPでPHPのエラーログを吐いている（出力している）ファイルは、`php_error.log`です。
他にもデフォルトで`appache_error.log`、`mysql_error.log`があります。
まずはこのファイルのあるディレクトリまで移動します。
**ターミナルでの操作になります**

```sh
$ cd MAMP/
$ cd logs/
$ ls
```

`MAMP`ディレクトリ直下の`logs`ディレクトリの中にあります。
`ls`にて`logs`の中にあるファイルを見ると、`php_error.log`があったと思います。
`php_error.log`には、エラーログが発生した場合、リアルタイムでその情報が更新されていきます。
**このファイルを`tail -f`コマンドを使って追従します。**
# エラーログをリアルタイムで追う
`tail`コマンドは、対象のファイルの末尾10行を表示します。
そのオプションである`-f`は、ファイルが更新されても常に追い続けてくれるものです。
（詳しくはこちらをご参考ください。→<a href="http://qiita.com/sakito/items/7f65e16f10b3d754f307" target="__blank">tailコマンドのオプション「f」と「F」</a>）

```sh
$ tail -f php_error.log
```

すると、直近10件のエラーログが表示されると思います。
<img src="https://qiita-image-store.s3.amazonaws.com/0/118817/a08cacd8-f3ea-9821-67e0-099b242cea6e.png" width=500px>

試しに適当にエラーを発生させてみましょう。
すると、画面の内容が更新されるはずです（ターミナルは`tail -f`した画面のままで開いておいてください。）。

ただ、大量にエラーログが発生すると、「どこからどこまでが修正前で、どこからが修正後か分からない」ということになります。
<img src="https://qiita-image-store.s3.amazonaws.com/0/118817/a57a5ebf-7ffe-45fb-5c4b-1356d224c028.png" width=500px>

クセとして、**エラーログを確認したら、`enter`キーで改行するようにしましょう**。
改行してもファイルに悪影響はありません。
ただ、改行した場所から次のエラーログを出力していくだけです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/118817/a2ad37bc-a8b6-d1a0-717a-af2bd769ea33.png" width=500px>
↑少し見やすくなったと思います。
スペースより上が修正前、スペースより下が修正後に発生したエラーです。
# おわりに
MAMPに限らず、多くの開発環境、フレームワークではログを発生させる仕組みがあります。
（私も多くを知っているわけではありませんが。）
まずは、どこでエラーログを出力しているか確認して、のぞいてみましょう。
（そのときに`tail -f`コマンドが使えます。）
rsyncにやられっぱなしなのでまとめ

ラジオをOSXの「Audio Hijack」にてエアチェックして録音する日常。
番組名のフォルダを日本語でつけていて、ファイルを大量にバックアップする際上手く行かず休日を難度も削られたので、再度忘れてトラブりそうなところをメモ。
（試している時点でのOSは、`EL Capitan １０．１１．４`。他のOSでどうなるかは知りません。）


#failed: No Such file or directory (2)
`--delete`を書く場所を間違えていただけ。
ソースディレクトリの手前に書きなおしたら動いた
別の場所に書くと`--delete`もパスの一部みたいに見られるのかしらん？

**NG**
`rsync -av --delete --iconv=UTF-8Mac,UTF-8 /src/ /target`
**OK**
`rsync -av --iconv=UTF-8Mac,UTF-8 --delete /src/ /target`
たまたま、ではないよなぁ。多分。


#処理経過の文字化け
`--iconv=UTF8-MAC,UTF-8`
上記オプションで解消。だが、そもそもOSにインストールされていた`rsync`のバージョンが古くて使えなかったので、インストールから。

```
$ brew tap homebrew/dupes
$ brew install libiconv
$ brew install rsync
``` 
```
$ /usr/local/bin/rsync --version
rsync  version 3.1.2  protocol version 30
```

> [Macの濁点ファイルをなんとかする](http://qiita.com/esfpp/items/e360aa290d8da2b3b981)

助かりました(^_^;)b


#/usr/bin　　Operation not permitted
/usr/binでリネームしようとしたらOperation not permittedとつれない返事。

>[Mac OS X 10.11 EI CapitanでOperation not permittedが出た時の解決法](http://www.starlod.net/mac-os-x-10-11-ei-capitan-operation-not-
permitted.html)

なるほど…
でも、そこまで必死に変更から守るって事は、無理にイジらない方が良いのかね？　生真面目に`/use/local/bin/rsync`でも問題無いので、そちらで使う。

#NTFSの外付けドライブ同士のrsyncでのコピー
`-a`オプションがファイルオーナーの云々で宜しくないとか。
なので`-rlpt`。経過も表示したいので`-rlptv`。
正直違いは分からんけど、一応こちらにしておこうか。


#rsync error: some files could not be transferred (code 23)
上記の諸々を解消したら、見出しにあるcode 23のエラーが出なくなった。
一番単純はoptionの書き位置の問題な気もするが、解決したのでまぁ良し。

見知ったOSだと思っていても、一歩ウラに周ったら知らない人が一杯働いていた的なサムシング。
想像深追いすると気持ち悪くなるので、ここらへんで。
# ITエンジニアのための機械学習理論入門 （第2章）


## 2.1 多項式近似と最小二乗法による推定
 * 回帰分析のもっとも基礎となる最小二乗法の解説
     * 最小二乗法は目的変数とそれに対する設計変数が与えられた時に、その目的変数と求められた関数との二乗誤差を最小化する最適化手法
     * このとき関数は重み付きの多項式として決定される
         * 調整するパラメータとして、次数と重み
     * 各重みを決定し、与えられているデータとの誤差を計算する
         * 誤差は得られた多項式と与えられたデータ（トレーニングデータ）との差分
             * 二乗誤差を1/2した値
     * この誤差を最小化する
 * 上記の重みの計算は解析的にいけるらしい
     * 誤差関数を偏微分した時に０となると仮定する（だから微分可能じゃないと使えないのかな・・・？）
     * summationを行列に変形する（内積とみる）
     * 式変形を行い重みを求める式にしてあげる
 * 最初に得られるデータはそのまま使えないので、データを整形（クレンジング）し、どのデータを特徴変数とするかは自分で決める必要がある。
 * 平方根平均事情誤差（RMSE）
     * 出来上がった多項式が実際にどの程度トレーニングセットと離れているかをみる指標
     * RMSEが低いからといってその多項式が正確とは限らない
         * トレーニングセットに対しては正確でも汎用性があるとは限らない
             * オーバーフィッティングしている可能性がある
 * 正確な次数について
     * チューニングするパラメータの次数を変えて複数試した際にどの次数を選択するか
         * 得られた多項式を描画したときにそれ「っぽい」のがあるけど、定量的にとらないと
             * 変数が一つとか２つとかなら描画できるけど、次元が膨大になったら・・・？

## オーバーフィッティングの検出
 * 前述にあるオーバーフィッティングをどのように検出するのか
 * 与えられたデータをトレーニング用と検出用（テスト用）のデータにわける
     * 学習（ここで言うと多項式をもとめる）ためにトレーニングデータを用いて、構築された多項式の評価用にテストデータを用いる感じ
     * ここでテストデータにトレーニングデータを混ぜることは絶対にダメ
         * 学習する事の本質はビジネスに活かすことにある
         * 混ぜてしまい正確な評価が行えないことは場合によってはビジネスに対して負の影響を生んでしまう
 * テストデータで多項式を評価するときは、多項式の設計に用いたRMSEを使う
     * 次数を変えていったときにテストデータにおけるRMSEの値はどうなるかを評価
 * 次数を増やしていきトレーニングデータではRMSEが下がったとしても、テストデータで同じ傾向になるとは限らない
     * 逆に誤差が上昇することもある→オーバーフィッティング
 * クロスバリデーション
     * 検証を行うための手法の一つ
     * データセットをいくつかに分割（例えば５つ）
     * どれか一つをテストデータ、それ以外をトレーニングデータに分割
     * 分割データすべてがテストデータとして学習を繰り返し行う
     * 得られた複数の結果（ここでは５つ）を総合して検証
 * データ数によるオーバーフィッティングの違い
     * オーバーフィッティングは与えられるサンプル数＜次数により強く起きる
         * サンプル数＞次数でももちろん発生する
     * サンプル数を増やすことでオーバーフィッティングを緩和できる
     * サンプル数が膨大なら次数も際限なく増やせばいい、ということはない
         * 次数を上げていくとどこかでRMSEが減少しなくなる
IoTでOAuth2

[Yahoo!BOXのAPIがクローズ](http://developer.yahoo.co.jp/changelog/2016-03-31-box3.html)されてしかたが無く[DropBoxの認証系の処理](https://www.dropbox.com/developers-v1/core/docs)を書いていたので、ついでにIoTなデバイスにTokenを渡す方法を試してみた。セキュリティ的なところとかまったく考えていないので、こういう事ができる程度のメモです。

もちろんFreeBSDが動作しているRT3050なデバイスにshttpdをビルドして置いておく。httpsするためにlibsslも必要でした。[ZRouter](http://qiita.com/yamori813/items/2fc5b14648029bb4730f)にはprofiles/contribにshttpd 1.42が入っています。[shttpd](https://sourceforge.net/projects/shttpd/)は[mongoose](https://code.google.com/archive/p/mongoose/)というプロジェクトに移ったようだ。
mongooseの方はソースのダウンロードが、comなサイトに誘導されるので、プロジェクトを売ってしまって、商用ライセンスとGPLなライセンスが変わってしまったのかもしれない。

httpsできる軽い実装をいろいろ探してみたのだが、shttpdが一番手頃のようだ。mrubyでも[httpなサーバ](https://github.com/matsumoto-r/mruby-simplehttpserver)の実装はあるが、今のところhttpsはサポートされていないようだ。

証明書はオレオレ証明書をpemで作り、秘密鍵のpemとcatしておく。

```
$ shttpd -ssl_cert shttpd.pem -ports 80,443s
shttpd 1.42 started on port(s) 80,443s, serving .
```

shttpdはgoogleで検索してもほとんど情報が引っかからない。。。sslの場合portsの番号の後ろにsを付けるのが分からず少しはまった。


以下のHTMLを置いておく

```
<HTML>
<BODY>
<A HREF="https://www.dropbox.com/1/oauth2/authorize?client_id=himitu&re
sponse_type=code&redirect_uri=https://10.0.1.8/oauth2.cgi&state=morimori">
DROPBOX OAuth2</A>
</BODY>
</HTML>
```

このリンクを叩くとDropBoxに飛んでログインしていれば承認のページに遷移する。

![スクリーンショット（2016-04-10 12.47.33）.png](https://qiita-image-store.s3.amazonaws.com/0/104066/251109a3-c0d7-59fa-07b8-16d0a66e8b86.png)

DropBoxのMy appsの登録ページのRedirect URIsにhttps&#58;//10.0.1.8/oauth2.cgiを追加しておくことも忘れずに。

![スクリーンショット（2016-04-10 11.29.30）.png](https://qiita-image-store.s3.amazonaws.com/0/104066/c5de5578-34ad-8a9b-8037-f51f40912746.png)

おおよその流れはこんな感じ。

![OAuth2.png](https://qiita-image-store.s3.amazonaws.com/0/104066/32e548c7-909b-3334-1189-de4a45a4fe64.png)

後はoauth2.cgiに渡されたURIのcodeを使ってBearer Tokenを拾ってAPIをアクセスする。

https://blogs.dropbox.com/developers/2013/07/using-oauth-2-0-with-the-core-api/

app secretは簡単に見えるようなところには置かないようにしなければなりません。

OAuth2の良いところはOAutheではSHA1などのハッシュ処理が必要だったのが無いことがあります。
Ansibleでswap領域を設定する


CentOS 7で動作確認しています。

- 物理メモリと同等のスワップ領域を設定する
- 何回実行しても大丈夫

という特長があります。


```yaml
---
- set_fact:
    swap_file_path: /swapfile
- command: dd if=/dev/zero of={{ swap_file_path }} bs={{ ansible_memtotal_mb }} count=1M
  args:
    creates: '{{ swap_file_path }}'
- file:
    path: '{{ swap_file_path }}'
    mode: '0600'
- command: file {{ swap_file_path }}
  register: swap_file_test
- command: mkswap {{ swap_file_path }}
  when: swap_file_test.stdout.find('swap file') == -1
- command: swapon {{ swap_file_path }}
  when: ansible_swaptotal_mb < 1
- mount:
    name: swap
    src: '{{ swap_file_path }}'
    fstype: swap
    opts: defaults
    passno: '0'
    dump: '0'
    state: present
```

物理メモリの2倍にしたかったら、 `{{ ansible_memtotal_mb }}` のところを `{{ ansible_memtotal_mb * 2 }}` とかにすればいいと思います。

## 参考文献

- [AnsibleでEC2のインスタンスにSwapを設定する - blog.tnantoka.com](http://blog.tnantoka.com/posts/79)
- [amazon web services - Add swap memory with ansible - Stack Overflow](http://stackoverflow.com/questions/24765930/add-swap-memory-with-ansible)
これからPHPでLINE Botづくりを始める人向けの簡易スターターキット


出遅れましたが、とりいそぎ Heroku で無料で始められるようにまとめてみました.
下のボタンを押すと、すぐに動かせます. Silex を使っています.

[![Deploy](https://www.herokucdn.com/deploy/button.svg)](http://bit.ly/linebot-test-deploy)

動かし方は、[リポジトリ](https://github.com/CoachUnited/linebot-test) に含まれる README を読んでください.

やってることは 「[LINE BOT をとりあえずタダで Heroku で動かす - Qiita](http://qiita.com/yuya_takeyama/items/0660a59d13e2cd0b2516)」 の PHP 版ですが、

Bot API のクライアント部分は別ライブラリにまとめて[Packagist に登録しておいた](https://packagist.org/packages/cu/linebot)ので、ご興味の方はそちらを Composer から使ってみてください. Contribute も歓迎です.

# ソースはこちら

* [CoachUnited/linebot-test](https://github.com/CoachUnited/linebot-test) .. スターターキット
* [CoachUnited/linebot-php](https://github.com/CoachUnited/linebot-php) .. LINE Bot API Client for PHP
声に出して読みたい Java ライブラリ -Arrays#asList-

# 概要
Java 標準の [Arrays#asList](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/Arrays.java) について述べます。

# Arrays#asList とは
配列あるいは可変長引数を List に変換するメソッドです。このメソッドで作られる List は unmodifiable です。add や remove を使うと UnsupportedOperationException が発生し、最悪プログラムが終了します。

# 実装を覗く
実際にはどういう実装になっているのかを [GrepCode](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/Arrays.java#Arrays.asList%28java.lang.Object[]%29) で見てみましょう。

```java:Arrays#asList
public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}
```

あれ、これだったら特に問題なく modifiable な List が取得できるのではないでしょうか？

実はこの ArrayList というのは、[java.util.ArrayList](https://docs.oracle.com/javase/jp/8/docs/api/java/util/ArrayList.html) ではありません。上記メソッドのすぐ下を見てみましょう。

```java:Arrays#ArrayList<E>.java
    private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable
    {
        private static final long serialVersionUID = -2764017481108945198L;
        private final E[] a;

        ArrayList(E[] array) {
            a = Objects.requireNonNull(array);
        }
```

何でしょうかこのクラスは……~~紛らわしいから標準クラスと同じ名前付けないでほしいですね。~~
この Arrays#ArrayList は add も remove も Override していないので、それらのメソッドをコールすると super クラス(AbstractList)のメソッドが呼ばれて UnsupportedOperationException が発生します。

## (参考) AbstractList の実装の一部
```java
    public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }

    public E remove(int index) {
        throw new UnsupportedOperationException();
    }
```

# 備考
Modifiable な List の初期化に使いたい場合は下記の通り書けばよいです。

```java
List<String> toList = new ArrayList<>(Arrays.asList("Apple", "Bacon", "Chocolate"));
```

Arrays#asList を使わない場合はこういう書き方もあります。ただ、チェックスタイルの設定次第では警告が表示されます。

```java
List<String> toList = new ArrayList<>(){{add("Apple"); add("Bacon"); add("Chocolate");}};
```

Eclipse Collections の Lists を使うと、このように書けます。

```java
List<String> ofList = Lists.immutable.of("Apple", "Bacon", "Chocolate");
```
声に出して読みたい Java ライブラリ -HashSet-

# 概要
JJUG CCC 2015 Fall の [Eclipse Collections のセッション](http://www.java-users.jp/?page_id=2064#GH-4) ([発表資料](http://www.goldmansachs.com/gs-collections/documents/2015-11-28_JJUG_CCC.pdf))で「Java の HashSet はメモリ効率が悪い」というお話がありました。ふと思い出して、少し調べてみたら実装が興味深かったので、書いてみます。

# java.util.HashSet
* 要素の重複を許可しない Collection 、Set の実装の1つ
* 値は hashCode により一意で保持される……独自に定義した Class のオブジェクトは hashCode を実装しないと意図しない動作をする

## 閑話：hashSet() の簡単な実装
ちゃんとやろうとすると面倒ですが、 [HashCodeBuilder](https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/builder/HashCodeBuilder.html) を使えば簡単に実装できます。

```java
import org.apache.commons.lang3.builder.HashCodeBuilder;

……

@Override
public int hashSet() {
    return HashCodeBuilder.reflectionHashCode(this, true);
}
```

# 衝撃！？ HashSet は Map だった！？
何を言っているのかわからないと思いますので、 [GrepCode](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/HashSet.java#HashSet) から一部ソースを転載していきます。

```java
public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable
{
    static final long serialVersionUID = -5024744406713321676L;

    private transient HashMap<E,Object> map;
```

おや、なぜ Set の中に Map のオブジェクトがあるのでしょうね？もうちょっと見ていきますか。

```java:謎のDummyObject
    // Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();
```
ふむ


```java:HashSet()
    /**
     * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
     * default initial capacity (16) and load factor (0.75).
     */
    public HashSet() {
        map = new HashMap<>();
    }
```

!!!????!?!??!??!??!?!??

```java:HashSet#add()
    /**
     * Adds the specified element to this set if it is not already present.
     * More formally, adds the specified element <tt>e</tt> to this set if
     * this set contains no element <tt>e2</tt> such that
     * <tt>(e==null&nbsp;?&nbsp;e2==null&nbsp;:&nbsp;e.equals(e2))</tt>.
     * If this set already contains the element, the call leaves the set
     * unchanged and returns <tt>false</tt>.
     *
     * @param e element to be added to this set
     * @return <tt>true</tt> if this set did not already contain the specified
     * element
     */
    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }
```

キーに Set の要素、値に空のオブジェクトを突っ込んでいる！？

## どういうことか？
要するに、HashSet は HashMap の Key だけを使う、という実装になっているようです。

## 何が問題なのか？
「あるものを使って実装しているだけじゃない」「『エンジニアは怠惰であれ』っていうでしょ」ええ、そうですね。おっしゃる通りです。

### 結論：メモリが無駄
1. Map の value に使いもしない空のオブジェクトを突っ込んでいる
2. Map は key-value のペア集合だけでなく、EntrySet を内部的に持つ。この実装で使われることはあるか？

なぜこのような実装になったのか、経緯をご存知の方がいらっしゃいましたらご教示くださいますと幸甚です。

# では、どうするか？
メモリ効率が気になるなら [Eclipse Collections の Set 実装](https://github.com/eclipse/eclipse-collections/blob/master/eclipse-collections/src/main/java/org/eclipse/collections/impl/set/mutable/UnifiedSet.java)を使いましょう。

```java
Set<String> strs = Sets.mutable.of("Alice", "Bob", "Charlie");
```
Rubyアプリで静的なデータを管理する

値が変更されないような静的なデータは、MySQLやMongoDBなどのDBに格納するより、起動時にメモリにロードするとパフォーマンスが向上し、管理も簡単になります。

ここで紹介する方法はRailsプロジェクトのみに限らず、Sinatraプロジェクトやその他のRubyプロジェクトでも使用できます。

<i class="fa fa-diamond"></i> settingslogicのインストール
---

settingslogicはYAMLファイルから設定をロードするgemです。Railsアプリだと `Rails.env` の値（`development`、`production`、`test` など）に応じた設定も簡単にロードすることができます。

プロジェクトで使用するには、`Gemfile` に追加します。

```rb:Gemfile
gem 'settingslogic' 
```

<i class='fa fa-database'></i> データの準備
---

データをYAMLで用意します。例として部屋番号とIPアドレスのペアをデータとして格納します。このYAMLファイルでは、全ての環境で `defaults` の値を継承します。

```yaml:config/room_and_ip.yml
defaults: &defaults
  ip_addresses:
    room101: 10.0.0.1
    room102: 10.0.0.2
    room201: 10.0.0.3
    room202: 10.0.0.4

development:
  <<: *defaults

test:
  <<: *defaults

production:
  <<: *defaults
```

<i class="fa fa-briefcase"></i> データを読み込む
---

先ほどのYAMLファイルをプロジェクト起動時に読み込むように設定します。Railsアプリの場合は `initializers` にファイルをロードするスクリプトを追加します。

```rb:config/initializers/room_and_ip.rb
class RoomAndIp < Settingslogic
  source Rails.root.join('config', 'room_and_ip.yml');
  namespace Rails.env
end
```

`Settingslogic` を継承して、ロードする設定を記述します。`source` メソッドでロードするパスを指定します。また `namespace` メソッドで、ロードする名前空間を指定できます。

Railsアプリからデータを参照するのは、クラスメソッドを呼び出します。

```rb
RoomAndIp.ip_addresses["room101"]    # => "10.0.0.1" 
```

Settingslogicは参照するキーが文字列なので、もっともらしいデータアクセスをするには、新たにメソッドを定義すると良いでしょう。

```rb
def ip_by_room(number)
  RoomAndIp.ip_addresses["room#{number}"]
end

ip_by_room(101)    # => "10.0.0.1" 
ip_by_room(999)    # => nil 
```

関連するActionModelのクラス（この例だと `Room` や `IP` モデルなど）のメソッドに追加すると、より自然にデータを関連付けることができます。
Pow(powder) + Yard で rubygemsのドキュメントをローカルで手軽に読む

# 何をするのか

`yard server --gems` と同等のものを、コマンドライン入力なしでブラウザから `yard.ded` にアクセスするだけで見れるようにする

## 前提

環境によってはgemの前にsudo必要だったり色々あるけど、僕はrbenv使ってるので必要ない。適宜読み替えてください。

```
# pow 入れとく
curl get.pow.cx | sh
# powder も入れとく
gem install powder
# yardも入れとく
gem install yard
```

## やること

```
# 適当な所でyardディレクトリを作る。 Documentsとかその辺がオススメ
mkdir yard
cd yard
# config.ru を編集
vim config.ru
```

```config.ru
require "bundler/setup"

require "rack"
require "yard"

# YARD exposes a global `log`, yuck
log.level = Logger::DEBUG

# Global state lololololol
YARD::Server::RackAdapter.setup

# We need to tell YARD what to serve
#
# A little Sinatra app which dynamically browses gems and ruby versions would
# be nice eventually. Perhaps even a way to publish a project directory with a
# Gemfile.lock to expose the project docs and with its bundled gems would be
# cool, too.
libraries = {}

Gem.source_index.find_name('').each do |spec|
  libraries[spec.name] ||= []
  libraries[spec.name] |= [YARD::Server::LibraryVersion.new(spec.name, spec.version.to_s, nil, :gem)]
end

run YARD::Server::RackAdapter.new(libraries)
```

※これはここから拝借してきました
https://github.com/sj26/yard-rack/blob/master/config.ru

```
# yard ディレクトリで
powder link
```

これだけ。
fileIO > Link > オープン中のファイルにアクセスするには？［C#、VB］

.NET TIPS
オープン中のファイルにアクセスするには？［C#、VB］
http://www.atmarkit.co.jp/fdotnet/dotnettips/707shareread/shareread.html

> 「別のプロセスで使用されているため、プロセスはファイル“TestFile.txt”にアクセスできません」

...

> 「ファイル・オープン時の“パラメータ指定が条件にマッチしない”のでファイルにアクセスできません」

...

> FileMode型、FileAccess型、FileShare型の3つのパラメータ
# ITエンジニアのための機械学習理論入門まとめ（第一章）


## 1.1 ビジネスにおけるデータサイエンスの役割
 * データサイエンティストの役割とは
     * データを解析することで得られる事実、ルールからビジネスに活かす
     * ただ事実やルールを得るまでが役割ではない
         * そこからどうやったらビジネスに活かせるのかを推測し提案するまでが役割
             * 抽象的にどうやるとかではなく、具体的にこの項目をどのくらいにしたほうが良いと提案する
     * データを見れるのは当たり前でそこからどのようにビジネスに活かせるかを的確に提案できないとデータサイエンティストではない
 * どうやってルールを推定するのか
     * 現在あるデータに対して無作為に推定すれば良いわけではない
     * 目的に対して有効である変数を正確に把握し、用いる必要がある
         * そのためにも推定する際は自分だけで完結するのではなく、いろいろな人にヒアリングをする必要がある
             * エンジニア、プロデューサー、営業、職種関わりなくヒアリング
     * 変数選択以外のアルゴリズム選択ももちろん考慮する必要がある
         * 要求される知識の幅が非常に広い
         * 上記したようにサービスに関するドメイン知識も必要
             * そのサービスの特異的な特徴は絶対に把握してある必要がある

## 1.2 機械学習の分類
 * アルゴリズムの分類
     * 分類方法は複数ある（アルゴリズムの中身？、得られるデータ）
     * 得られるデータ（もの）で分類すると
         * クラス分類
         * 回帰
         * クラスタリング
 * クラス分類
     * データが属する分類（クラス）が与えられているとき、データを入力するとそのデータがどのようなクラスになるかを判定する手法
     * 決定木やロジスティック回帰が分類される
     * クラスを判定することで、ユーザにどのような施策をとるべきかを決定する判断材料になる
         * そこの施策は別途求める必要ある？
         * そのクラスはどのような特徴があるから、～する必要あるよねー的な
     * ただクラスに分類するだけではなく、そのクラスに分類される確率を求められる
         * クラスA20％、クラスB80%のようにベクトルで表現
 * 回帰
     * 与えられたデータが従う関数を推定する、データを入力するとその説明変数に対応した関数値が求まる
     * 売上予測とかに使うのか？
 * クラスタリング
     * データに対してクラスの分類が与えられていないときに、学習によって各データのクラスターを作成する
     * 特徴ベクトルを見る際に使える
         * 大量のデータにクラスタリングを適用して、どんな傾向、特徴がありそうか発見
             * 類似するユーザをクラスタリングすることでどの変数が効いているのか

## まとめ
 * データを100%説明できるクラス分類だったり、回帰は存在しない
     * その中で最善のものを見つけ、それをもとにビジネスに活かせる施策を提案する
[Rails]whenever上でrakeタスク実行の優先順位(ナイス値)を指定する

Microsoft Azure VM A0 Basic(0.25コア、RAM0.75GB)インスタンス上で、Rails/rakeの重いバッチ処理を動かそうとしたらマシンが応答しなくなってしまいました。

niceを使ってバッチ処理の優先順位を下げてみることにしました。

# 環境

```
$ cat /etc/redhat-release 
CentOS Linux release 7.1.1503 (Core) 
```
```
$ nice --version
nice (GNU coreutils) 8.22
Copyright (C) 2013 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

作者 David MacKenzie。
```
```
$ bundle list | egrep " (rails|whenever) \("
  * rails (4.2.1)
  * whenever (0.9.4)
```

# job_typeを自前で実装する。

[javan/whenever: Cron jobs in Ruby](https://github.com/javan/whenever#define-your-own-job-types) によると、wheneverでは以下4つのjob_typeがデフォルトで設定されています。


```rb
job_type :command, ":task :output"
job_type :rake,    "cd :path && :environment_variable=:environment bundle exec rake :task --silent :output"
job_type :runner,  "cd :path && bin/rails runner -e :environment ':task' :output"
job_type :script,  "cd :path && :environment_variable=:environment bundle exec script/:task :output"
```

これにnice値19を指定したバージョンを作成し、利用します

```rb:config/schedule.rb
job_type :nice_rake, "cd :path && :environment_variable=:environment nice -19 bundle exec rake :task --silent :output"

every '*/20 * * * *' do
  nice_rake "hoge:fuga"
end
```

Nice rake.

## 参考

- [Ruby & Rails: Making sure rake task won’t slow the site down | Running with Ruby - Dev Blog not only for Ruby on Rails fanatics!](http://dev.mensfeld.pl/2014/09/ruby-rails-making-sure-rake-task-wont-slow-the-site-down/)
- [Linuxコマンド集 - 【 nice 】 優先順位を決めてコマンドを実行する：ITpro](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230848/?rt=nocnt)
phpを更新したらphp-fpmのrestartを忘れずに


wordpress等でphp-fpmをサーバーで使っている場合、
phpに新たなモジュールを追加したりphp.iniを更新した場合は、
php-fpmとnginxを再起動することを忘れずに

```
sudo /etc/init.d/php-fpm restart
sudo service nginx restart
```
（翻訳）RubyGems.orgでgemが置き換えられる脆弱性とその緩和策について


## はじめに

この記事は2016年4月6日に公開された [RubyGems.org gem replacement vulnerability and mitigation](http://blog.rubygems.org/2016/04/06/gem-replacement-vulnerability-and-mitigation.html) の日本語訳です。

内容を見る限り、この脆弱性が実際に悪用された可能性は低そうですが、念のためgemの開発者やgemの利用者は一読しておくことをお勧めします。

## 翻訳の方針について

筆者はgem開発やセキュリティ問題にそこまで詳しくないため、一部翻訳に怪しいところがあるかもしれません。
また、翻訳は日本語としての読みやすさを重視してところどころ意訳しています。

もし完全に間違った訳になっていたり、意訳しすぎて原文のニュアンスが変わってしまったりしているところがあれば、コメントや編集リクエスト等でやさしく指摘してやってください。

# （翻訳）RubyGems.orgでgemが置き換えられる脆弱性とその緩和策について

原文： [RubyGems.org gem replacement vulnerability and mitigation](http://blog.rubygems.org/2016/04/06/gem-replacement-vulnerability-and-mitigation.html)

## 要約

RubyGems.org には不具合があり、攻撃者が我々のサーバー上にある .gem ファイルを異なるファイルに置き換えることができました。我々は2016年4月2日に部分的な修正を実施し、4月4日に完全に修正しました。また、2015年2月8日以降にアップロードされたすべての .gem ファイルを検証し、どれも置き換えられていないことを確認しました。gemの名前にダッシュが含まれるもので（例：'blank-blank'）、2015年2月8日以前にアップロードされたものは、作者自身で検証する必要があります。検証する方法は以下で説明しています。

## 詳細

2016年4月2日、RubyGems.org のセキュリティチームは次のような脆弱性の報告を受けました。それは認可されていないユーザーが既存のgemバージョンにおける既存のgemファイルを特定の状況下でアップデートできるというものです。セキュリティチームはその報告を確認し、実際にそういった操作が可能になる不具合を発見しました。我々は4月2日の遅くにこの問題を修正し、前述した攻撃ができなくなったことを確認しました。

さらに詳細な調査をしたところ、前述のパッチでは同じような別の攻撃を防げないことを発見しました。我々は4月4日にこの問題を修正し、こちらも同様に攻撃ができなくなったことを確認しました。

どちらの攻撃手法も、攻撃者は特定のgemのバージョンを狙って我々のS3バケットにある既存の .gem ファイルを置き換えることができるものでした。

また、この攻撃手法で置き換えられたgemファイルは通常の `gem install` コマンドではインストールできないことも確認しました。

## 既存のgemの検証内容

我々はすべてのgemのsha256チェックサムを検証し、いずれも不正に変更されていないことを確認しました。我々は 2015年2月8日以降にアップロードされたgemから [sha256](https://github.com/rubygems/rubygems.org/commit/5243ca33c090fac687ad44ae836b2cd4ac462edc) の計算を開始しました。それ以前にアップロードされたgemはアップロードと同時に計算されたsha256を持っていません。そのため、それ以前に作られたgemについては、我々には検証する方法がありません。

さらに詳しく：

- 2015年2月8日以降にアップロードされたgemは100%検証されています。
- 2015年2月8日以前にアップロードされたgemについては、2015年2月8日以降に変更されていないことを検証しました。

さらに、2つめの攻撃手法においても該当するような事例がないことを確認しました。これはすべてのgemの、すべての日付に対してです。

より詳細な検証項目として、我々は同じファイルで2つ以上のS3オブジェクトバージョンを持つ全てのgemも検証しました。我々は750個以上のgemがS3に複数のバージョンを持っていることを確認しました。我々はそのすべてのオブジェクトバージョンを検証し、オブジェクトの最終更新日付とDB上の作成日付を比較しました。その結果、6つのgemで5秒以上の差異があることを発見しました。さらに、その6つのgemで異なるバージョンに対してチェックサムを計算し、2つのgemだけが異なるチェックサムになっていることがわかりました。我々は手作業でgemの内容を比較し、その内容が安全であることを確認しました。

## 経緯

1件目の脆弱性は[2014年6月11日](https://github.com/rubygems/rubygems.org/commit/87312bcfa5b1b5cef932caae0c90f2cfe9d4e4a2)以降に存在していました。

2件目の脆弱性は RubyGems.org の開設当初から存在していました。

## インパクト

gemの名前にダッシュが含まれるもので（例：'blank-blank'）、2014年6月11日以降、2015年2月8日以前にアップロードされたものは攻撃を受けている可能性があります。（2015年2月8日から2016年4月2日の間にアップロードされたgemはすでに検証済みです。）

## どうすればよいですか？

前述のインパクトに該当するgemのバージョンをアップロードしていた場合は、以下の手順で検証してください。

1. gemをダウンロードする
2. `gem unpack file.gem` を実行する
3. 予期しない変更が含まれていないことを確認する
4. `gem spec file.gem` を実行する
5. gemspecに予期しない変更がないことを確認する

もし予期しない変更が含まれていた場合は `gem yank` （訳注：gemの特定バージョンを削除）し、 [RubyGems.org のセキュリティチーム](mailto:security@rubygems.org) に速やかに連絡してください。また、その際は調査に用いる .gem ファイルも含めてください。

## クレジット

この問題を発見し、詳細なレポートを作成してくれたEric Chapweskeに大変感謝します。David Radcliffe と Arthur Nevesは修正と検証作業に貢献してくれました。Aaron Patterson, Nick Quaranto, André Arko, Samuel Giddins はレビューと検証に貢献してくれました。
WSDM2016読みたい論文


* Multi-view Machines
* Long-tail Vocabulary Dictionary Extraction from the Web
* Hierarchical Label Propagation and Discovery for Machine Generated Email
* Relational Learning with Social Status Analysis
* Your Cart tells You: Inferring Demographic Attributes from Purchase Data
* Towards Modelling Language Innovation Acceptance in Online Social Networks
* Learning Distributed Representations of Data in Community Question Answering for Question Retrieval
* Querying and Tracking Influencers in Social Streams
* Inferring Latent Triggers of Purchases with Consideration of Social Effects and Media Advertisements
* Quantifying Controversy in Social Media
* Relationship Queries on Extended Knowledge Graphs
* Publication date prediction through reverse engineering of the Web
* Transductive Classification on Heterogeneous Information Networks with Edge Betweenness-based Normalization
* Semantic Documents Relatedness using Concept Graph Representation
* Geographic Segmentation via Latent Poisson Factor Model
* Hierarchical Semi-supervised Classification with Incomplete Class Hierarchies
* Mobile App Tagging
* Equality and Social Mobility in Twitter Discussion Groups
* Scaling up Link Prediction with Ensembles
* Representation Learning for Information Diffusion through Social Networks : an Embedded Cascade Model
* Centrality-Aware Link Recommendations
* Personalized PageRank Estimation and Search: A Bidirectional Approach
* On the Efficiency of the Information Networks in Social Media
* Information Evolution in Social Networks
* Distributed Balanced Partitioning via Linear Embedding
* Wiggins: Detecting Valuable Information in Dynamic Networks with Limited Resources
ICWSM2016読みたい論文


* Message Impartiality in Social Media Discussions 
* Distinguishing between Topical and Non-Topical Information Diffusion Mechanisms in Social Media 
* "Will Check-in for Badges": Understanding Bias and Misbehavior on Location-Based Social Networks 
* Sentiment-Based Topic Suggestion for Micro-Reviews 
* Your Age Is No Secret: Inferring Microbloggers' Ages via Content and Interaction Analysis 
* Dynamic Data Capture from Social Media Streams: A Contextual Bandit Approach
* What the Language You Tweet Says about Your Occupation 
* Emotions, Demographics and Sociability in Twitter Interactions 
* Understanding Anti-Vaccination Attitudes in Social Media 
* The Status Gradient of Trends in Social Media 
* Analyzing Personality through Social Media Profile Picture Choice 
* Identifying Platform Effects in Social Media Data 
* The Dynamics of Emotions in Online Interaction 
* Cross Social Media Recommendation 
* TweetGrep: Weakly Supervised Joint Retrieval and Sentiment Analysis of Topical Tweets
N-QueenをSATソルバーで解かせてみてわかったこと

少し前に、[いろいろな言語でN-Queenを実装して速度を計測してみた](http://qiita.com/ryama0/items/ee2593d01dff6ddf0407)というような記事が流れて来ました。ちょうどRuby上でSATを使っていろいろやっていたので、せっかくだからとこれもSATソルバーにかけてみることにしました。

# 第1弾
まずはその時点の`prop_logic-minisat`（Ver. 0.1.0）で解かせてみたところ、8×8にすら数秒かかってしまうありさまでした。

あまりに遅いのでプロファイリングをかけてみたところ、実はSATソルバーにかかっている時間はわずか1%程度しかなく、ほとんどの時間はRubyからMiniSatへ渡すデータの変換に取られていることが判明しました。

とりわけ、新しく出た解の否定条件を追加して何度も繰り返しSATソルバーをかける際に、もとの問題まで解析されてしまうがために、解析時間だけで $O(n^2)$ かかるような事態となっていました。これではSAT以前の段階で日が暮れてしまいますので、まずは「Ruby側での解析を持ち回せる」ようにすることを目的に、`prop_logic`とソルバーの両方に手を入れることにしました。

# 第2弾
ということで、1つの式について条件を追加しつつ繰り返しまわすような場面で、一度解析した結果を使いまわせるようにした、`prop_logic` 0.2.0と`prop_logic-minisat` 0.2.0を作った上で再実行したところ、8×8で1秒以下、12×12で3分弱と、ぐっと高速化しました。

## プロファイリングとチューニング
さすがにMiniSat自体の高速化は難しいですが、Ruby部分のプロファイリングはしっかり行なって、高速化して行きました。

* `#each_sat`内部の否定項生成を効率化（Ver. 0.2.1）
* And/Orの項生成時の判定処理の効率化（Ver. 0.2.2）
* 変数単体の否定時に、余計な処理をバイパス（Ver. 0.2.3）
* 状況判定のチューニング、キャッシュ追加（Ver. 0.2.4）

いろいろやったところで、12×12で2分半ぐらいの速度となっています。

## 遅い要因
これだけやっても、速度は純粋にRubyで書いたコードにすら及ばないような状況です。考えてみたのですが、「汎用のコードが専用のコードに勝てるはずがない」ということと、あとはSATソルバーが本来「あるかないか」を調べるためのツールなので、全パターンの計算のために何度もまわすということがあまり向いていないのかな、とも思いました。

## JRubyでの試験
その過程で、MiniSat側が「毎回モデルを生成している」ということに気づきました。では、一度解いたSATの結果を捨てずにソルバー側で持ちまわすようにしたらどうなるのか気になって来ました。

C++入りのgemは簡単に触れないので、[JRubyからJava製のSat4jを呼んでみる](http://qiita.com/jkr_2255/items/68dbc6a3a4482d9989d8)ことにしました。そして、結果がわかるたびに直接ソルバーへ追加していったところ、MiniSatより4倍以上遅いはずのSat4jを使っているにもかかわらず、12×12で2分40秒程度と、MiniSatと同等の速度を叩きだしました。

MiniSat入りのGemも、将来的にはこの態勢にしたいです。

# 結論

* 処理時間のかかり具合は、実際の挙動をみないと予想もできない
* 専用のプログラムを容易に書けるもの、そして全パターン求めるような場合には、SATソルバーはあまり向いていない
* $O(n^2)$ は恐ろしい

# 使用したコード

```ruby:sat_n_queen.rb
if defined?(JRUBY_VERSION)
    require 'prop_logic/sat4j'
else
    require 'prop_logic/minisat'
end
require 'prop_logic/hash_cache'

$variables = []
cond_arr = []

$size = 12

$size.times do
  $variables << $size.times.map { PropLogic.new_variable }
end

# 横
$variables.each do |row|
  cond_arr << PropLogic.all_or(*row)
  row.combination(2) { |a, b| cond_arr << (~a | ~b) }
end

# 縦
$size.times do |i|
  col = $variables.map { |row| row[i] }
  cond_arr << PropLogic.all_or(*col)
  col.combination(2) { |a, b| cond_arr << (~a | ~b) }
end

# 左上 - 右下
diffs = (-$size + 2)..($size - 2)
diffs.each do |diff|
  start = (diff >= 0) ? 0 : -diff
  count = $size - diff.abs
  line = (start...(start+count)).map { |i| $variables[i][i+diff] }
  line.combination(2) { |a, b| cond_arr << (~a | ~b) }
end

# 左下 - 右上
diffs = (-$size + 2)..($size - 2)
diffs.each do |diff|
  start = (diff >= 0) ? 0 : -diff
  count = $size - diff.abs
  line = (start...(start+count)).map { |i| $variables[i][$size-(i+diff+1)] }
  line.combination(2) { |a, b| cond_arr << (~a | ~b) }
end

$cond = PropLogic.all_and(*cond_arr)
puts $cond.each_sat.count

```
技術英語 > リスニング > Endress+Hauser > The Temperature Law: E+H = degC > Part 2

温度測定の技術に関しての面白そうな動画
http://qiita.com/7of9/items/9ae93cbd2a6fce5cf676
のリスニングの続き

@ Endress+Hauser > The Temperature Law: E+H = degC
https://www.youtube.com/watch?v=vnLyPVAb81s&list=WL&index=45

赤文字ははっきり聞き取れない部分。
青文字はそのように聞き取れるが、文法的にしっくりいかない部分。

(2:03-)
By applying a glass covering, they're been protected from external pollutants that may effect the measurement. However, before this is done, the material is thermally aged. In this way, we increase the long-term stability of the measurements.

(2:22-)
It is important to be able to position these tiny, and highly sensitive primary sensors where extreme temperatures and pressures ,turbulent flows and aggressive media are present in the process. 

(2:40-)
As the sensor only measures its own temperature, it has to take on the temperature of the medium as <font color=red>swiftly</font> as possible. But how can we, on the one hand, <font color=red>ensure</font> perfect protection, and on the other, optimum measurement features such as rapid response time.

(3:02-)
What's needed is intelligent design of all the components used in the measurement point. Endress+Hauser handles this with competence and technology. From thermal calculation through qualified personnel and procedures up to in-house production of all the modules needed.


上記赤の二点はおそらくあっているように思う。

所要時間15分。タイピングが遅いのでこれくらいかかってしまう。
技術英語 > if you ticked the verify option / clear

@ Adam Taylor MicroZed Chronicles - Using the Zynq 101 [Kindle Edition]
Kindle No.429/2129

> if you ticked the verify option

オプションをチェックをつけることを tick で表している。

The IBM Style Guideによると
「チェックをはずす」は clear なのだろう
http://qiita.com/7of9/items/4e2f5eb905c72d15b0eb

> Use "clear", not "deselect" or "unselect" to refer to removing a mark from a check box.
phina.jsでハノイの塔シミュレータ作った


# ハノイの塔シミュレータ

[<img width="320" alt="image" src="https://qiita-image-store.s3.amazonaws.com/0/60690/2db1169a-f7b2-7df3-3259-1440db1aa2f5.png">
runstant](http://goo.gl/35T3eg)

[ハノイの塔シミュレータ](http://goo.gl/35T3eg)


この記事に触発されて作った。
[JavaScriptのゲームエンジン(phina.js)でハノイの塔をシミュレートしてみた！](https://mezashi-world.com/2016-04-03/hanoi-simurator/)
せっかくrunstantを使っているので、短縮URLにできる範囲で書こうと思ったので書いた。
色々機能をつけてるうちに100%超えてしまったが、変数名変えたりして９９．９９％ぐらいに収められた。
MechanizeとNokogiriでリンク先のページをそれぞれスクレイピングするときのメモ（不規則なページを取得するとき）

#問題点

前回はページの取得が、URLが規則性を持っていたので簡単でした。
今回は、取得したいURLが不規則な人名だったため、一覧ページにあるリンクから辿っていく方法でスクレイピングすることにしました。
その際、非常に苦労したし、ドキュメントもいいのが見つからなかったのでメモ。

その際に生じた問題点としては、以下のような感じです。

- リンククリックがうまく行かなかった。
- searchメソッドとlink_withメソッドの振る舞いの違い
- テキスト、URL、class（id）がついていないhtmlから取得する方法

#解決方法

```元のファイル.html
<table class="hoges">
<tr>
  <th class="hoge">名前</th>
  <th class="hoge2"></th>
</tr>
<tr>
  <td class="hoge"><a href="namae_ichi.html">名前１</a></td>
  <td class="hoge2">Namae Ichi</td>
</tr>
```

```scrape.rake
page = agent.get("http://www.example.com")

href_str = page.search('//td[@class="hoge"]/a/@href')[0].text
page = page.link_with(:href => href_str).click

p page.search('div.prof_1').search('table.prof td')[0].text
```

↑　こんな感じ！

（前後に繰り返しがついたり、そもそもmechanizeの最初に書くやつとかは省略してます。）

##困った点

searchでは.clickメソッドが使えないんですね。
あとなんかat_cssメソッドも使えなかった。（これはあれか、次のclassがどのDOMタグについているかっていうことかもしれない）
あと、link_with(:dom_class => hoge ).click　は、aタグにclassがついてないとダメ。今回はtabel と tdにのみclassがついてたので、そこにハマった。
あと、個人的に嬉しかったのは、searchメソッドの重ねがけができるっていう点。

↑　結局この辺はXMLの知識があれば余裕で理解できていたのかもしれない。まだまだ力不足。

あれ、searchの重ねがけができるってことは、
```href_str = page.search('//td[@class="hoge"]/a/@href')[0].text
page = page.link_with(:href => href_str).click```
これももしやXPATHじゃなくてCSSで指定できたってことかな・・・。

（追記）
やってみました。
結論ダメ。
理由は、前提としてsearchで取ってきたデータ（xml？）はclickメソッド使えない。
link.clickするには、平文のhtmlじゃないとダメなんだけど、searchしてきたデータを平文にする方法がない（わからない）。
また、hrefの値を取ってくることも、CSS指定じゃ僕の力ではできなかった。
正規表現もちゃんと勉強しないとなー。苦手意識をなくさないとー。

とりま、今日はここが限界ですた。




# 参考にしたページ

今回の件に至るまでにいろいろ試行錯誤した中で、以下のサイトを参考に／ヒントをもらって解決した。

class Mechanize::Page::Link
http://mechanize.rubyforge.org/Mechanize/Page/Link.html
Nokogiriを使用したクローラーめも
http://qiita.com/Kenya/items/d1a2325a552d11814111
[Mechanize]リンクをクリックする方法いろいろ
http://d.hatena.ne.jp/tomoyamkung/20121020/1350721275

勝手に誤読して勝手にハマったのは次のページ

楽々スクレイピング! Ruby Mechanizeの使い方
http://www.xmisao.com/2013/10/05/ruby-www-mechanize.html

「リンクはMechanize::Page::Linkオブジェクトで、そのclick()を呼びだせばリンク先のページを取得することができる。」って書いてあるので、勝手にclickメソッドを使えばその次の行からクリック後のページになると思い込んでたｗ
違うよね。普通にその結果を変数に入れないと次では使えないよね、っていう。

（追記）
あ、そうか、その後にスクレイピングするからうまくいかないのかなって思った。
http://takuya-1st.hatenablog.jp/entry/20100708/1278617397
↑この記事とか、特に変数に代入しないでフォームの送信とかしてるし。
agent変数は、ちゃんとそっちに行っているのかな？？　って。
でも```p agent.page.search('div.prof_1').search('table.prof td')[0].text```ってやっても狙ったテキストが表示されなかったのよね。

（再追記）
できたし。
普通にagentを頭につけたらできた。
なんでやろ・・・トホホ。どこかで抜けてたのかな。



#雑感など

最近何をするにも一番痛感しているのは、自分のプログラミング基礎力。
文系だし、独学だし、業務でも使ってないからしょうがないけど。
お作法的なこととか、ハマりやすいポイントとか、そういうところでハマることが多い。
まぁ、「基本的なチュートリアル終わったらとにかく作れ」っていう人はそういうところが大事だとわかってるからこその発言なんだろうけど。
ともあれ、そういうところが身になっていけば、いろいろ作れるようになるかも！！楽しみ。

初心者なもので、間違ってたりしたら、どんどんご指摘ください！
アドバイスもお待ちしてます。
Line Bot Api 近くのグルメを教えてくれる婆やを作った

## 今話題のLINE BOT 作ってみました。
アカウント登録はこちら
BUSSINESS LINE
https://business.line.me/services/products/4/introduction

## やったこと
・ポストされた受信コンテンツの取得（ユーザプロフィール・テキスト）
・返信コンテンツ(テキスト・画像・映像・スタンプ)の自動生成と返信
・[Yahoo!デベロッパーネットワーク](http://developer.yahoo.co.jp)や[ぐるなび for Developers](http://api.gnavi.co.jp/api/)で公開されているAPI利用

## できたもの
**位置情報を送ると、近くのおすすめのお店を教えてくれる　もの知りばあやBOT**
![unspecified-2.png](https://qiita-image-store.s3.amazonaws.com/0/120774/9d8c8a19-4bec-70aa-bb6f-8e819fd4d081.png)

隠しコマンド的に、雑談もするよ。
![unspecified-3.png](https://qiita-image-store.s3.amazonaws.com/0/120774/e37ba819-01cc-c2e3-d24c-9387767a6ce7.png)

こちらのQRコードで友達追加できます。
<img width="400" alt="QRスクリーンショット.png" src="https://qiita-image-store.s3.amazonaws.com/0/120774/fde52a06-275e-e815-4b8e-4555c11e8e61.png">
まだ遊んでる最中なので、途中バグったりしたらごめんなさい><

#やったことメモ
## LINE BOT API　でできること
| BOT API | 内容 | わたしがやったとこまでメモ |
|:-----------|:------------|:------------|		
|Sending messages	|メッセージ送信（テキスト、JPG画像、mp4動画、m4a音声、ロケーション、スタンプ）	|音声は使いどころ迷ったので使ってない。それ以外は実装済み。gifもやってみたけどうまく再生されなかった。|
|Sending multiple messages	|上記のメッセージを纏めて複数送信	|複数といっても同じ吹き出しに入るわけではなく、連投される。|
|Sending rich messages	|リッチメッセージ送信（画像の指定した場所をタップすると指定したリンク先を表示）	|苦戦中。|
|Getting message content	|受信したメッセージが画像、動画、及び音声であった場合にそのバイナリデータを取得	|まだ|
|Getting previews of message content	|上記のサムネイル画像を取得	|苦戦中。542エラーがでて取得できない…。|
|Getting user profile information	|ユーザID(MID)をキーにユーザ情報を取得	|ユーザの表示名やプロフ画像が取得できた！|
ConoHa DBサーバー接続用ネットワーク設定 (Ubuntu)

基本的には公式ブログの通りで OK。
https://www.conoha.jp/conoben/archives/9103

# インターフェースの追加

<img width="691" alt="スクリーンショット 2016-04-10 3.01.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/47993/47299a9f-9c8b-0013-b440-bf8716ebbcec.png">

[DBサーバー接続用ネットワーク] 画面をもとに、インターフェースを設定する。

```
$ sudo vi /etc/network/interfaces
```

末尾に以下を追加。

```text:/etc/network/interfaces
# The database network interface
auto eth1
iface eth1 inet static
address {A1}
netmask {A2}
```

| 設定箇所 | 設定内容 |
|:--------|:--------|
| {A1}    | [契約中VPS] の [接続する] 右側の IP。
| {A2}    | [サブネットマスク] の IP。

# 静的ルーティングの設定

ルーティングを設定する。

```
$ sudo vi /etc/network/if-up.d/static-routes
```

使用するリージョンに応じて、ネットワークはそれぞれ以下。

* 東京リージョン: 172.21.74.0/23
* アメリカリージョン: 172.21.92.0/23
* シンガポールリージョン: 172.21.110.0/23

```bash:/etc/network/if-up.d/static-routes
#!/bin/sh
/sbin/route add -net {B1} netmask 255.255.254.0 gw {B2} dev eth1
```

| 設定箇所 | 設定内容 |
|:--------|:--------|
| {B1}    | 使用するリージョンに応じたネットワークアドレス。<br>/23 を除く。
| {B2}    | eth1 のゲートウェイ IP。 <br>{A1} に設定した IP のネットワークの一番右のビットを 1 としたもの。


```
$ sudo chmod +x /etc/network/if-up.d/static-routes
$ sudo /etc/network/if-up.d/static-routes
$ sudo service networking restart
```

これで完了。
職場物語


這一系列的文章會以我在職場上所碰所遇，結合學習到的知識和經驗分享。

- [不會公開捅你的隊友或上級](http://qiita.com/vc7/items/3f686e3cabac6d5eb36a) (2016/08/29)
- [敏捷開發領的點數](http://qiita.com/vc7/items/3ab846bbc683fec8d508) (2016/07/22)
- [尊重和對得起自己的專業](http://qiita.com/vc7/items/e9be4adc7bbb298fad0b) (2016/07/11)
- [聊到履歷要寫些什麼](http://qiita.com/vc7/items/f1781e31d87e11931c6d) (2016/06/15)
- [來嘗試持續重構吧！ 或可以叫做「無情重構」- Merciless Refactoring](http://qiita.com/vc7/items/38d6b40dba58a7a4dcb4) (2016/04/10)
【アルゴリズム】Hash Tableの概要


# 対象読者

- アルゴリズムを勉強したい人
- Javaで実装してみたい人(次回)

Java/アルゴリズム勉強シリーズです。今回はhash tableを勉強したので実装してみます。

Javaのクラスとしては、単一スレッドなど、`synchronization`を気にしないケースではHashtableよりもHashMapの方がよく使われるようです([こちらの記事](http://qiita.com/shunsuke227ono/items/0d737369f60ba0b538ae)で言及しました)。今回はJavaによらず、データ構造の一般論としての `hash table`を指して、記事を書いていきます。次回Javaで実装します。

# hash table

[ハッシュテーブル wikipedia](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB)より

> ハッシュテーブル (hash table) は、キーと値の組（エントリと呼ぶ）を複数個格納し、キーに対応する値をすばやく参照するためのデータ構造。ハッシュ表ともいう。ハッシュテーブルは連想配列や集合の効率的な実装のうち1つである。

## 概要

キーを元に生成されたハッシュ値を添え字とした配列のこと。検索や追加時間を要素数によらず一定時間O(1)で実現することができる。
しかし、ハッシュ関数の選び方によっては(値がうまく散らばってくれると嬉しい)、性能が劣化して、最悪の場合O(n)となってしまう。つまり、keyの特性を見極め、衝突の少ない良いhash関数を選ぶことが重要である。かぶりが一つも存在しないhash関数を`perfect hash function`という。


異なるキーから同じハッシュ値が生成された場合、衝突が起きる。その衝突を扱う方法として、以下の二つの方法が存在する。

- Separate chaining
- Open addressing

`Separate chaining`は衝突を起こしたキー同士を連結リストでつないでいき格納する方法である。
`Open addressing`は衝突が起きると、テーブルの中で空いている別の番地を探す方法である。ハッシュ関数とは別の関数を用いて次の候補隣る番地を求める。

すごく簡略化すると、検索時間的には、`Open addressing`の方がよく、メモリ使用量的には`Seperate chaining`の方がよく節約できるという感じでしょうか。


[hash table wikipedia(英語)](https://en.wikipedia.org/wiki/Hash_table)がとてもよくまとまっていました。

## 二分探索木を使用してhash tableを実装することもできる

ハッシュ値を使用した二分探索木を作り、平衡を保つことで、O(log(n))の検索時間を保証することができます。また、配列において存在する空白の配列の要素などがななるため、メモリ的に節約できます。配列リサイズの必要もありません。

***

hash tableの実装は次回します。
來嘗試持續重構吧！ 或可以叫做「無情重構」- Merciless Refactoring


> 持續重構

我是這樣叫他。

直到今天看了「The Clean Coder」（還只用了幾小時當故事書就看完了 XD），才知道原來這個方法被叫做 **Merciless Refactoring** 。

網路上其實有一些對於無情重構的許多說明，不過在這邊還是想分享我自己的經驗和思維。

## 引子

我其實在日常的開發過程中，一直在做持續重構。

和 Growth 歸納出來的做法一樣：巨大的成功，需要由許多小的成功累積而成。

核心的想法和敏捷開發相似：敏捷開發鼓勵縮短發布時程，透過每一次的週期（或稱迭代/iteration/sprint）改善產品（這邊「產品」就是指程式碼）。而我自己則是習慣把完成每個小重構或 task 完成當成和發布類似的概念。

另外也跟「童子軍精神」一樣：離開營地時，要比到達時還要乾淨。重構就可以幫忙做到這件事。

再來就是還「技術債」：你我應該都有碰過累積太久的技術債，需要花費大量的時間，或是跟 PM 要一段時間來重構吧！那我就可以透過不斷地持續重構，避免慢慢累積技術債，避免要花非常多的時間成本來還債。

## 實務上

### 對專案的影響

之前曾經和主管聊到持續重構這件事情。

當時應該正在做的事情還沒有辦法清楚表達，所以在表明要把持續重構加入開發流程的時候，是有被提醒說不要耽誤到承諾的時程。

後來想一想，其實好像就跟撰寫測試差不多的概念，建議可以把重構加入每個 task  的 Definition of Done （完成的定義）中，在每次 commit 時，把自己的 code 變得更加美好。

當堅持一陣子之後，就會更加自然且順暢的完成持續重構，而不會是「又多一份 DoD 的事項了！」的感覺。

### 花時間練習

一開始一定會卡住 ...

其實重構基本上就是希望自己程式碼的架構能夠改善、降低耦合 bla bla bla 等等。

背後代表的意思大概就是需要有足夠的技術知識，例如 software architecture, design pattern 等等軟體開發（或是工程）上的知識需要補充。

但是當正式專案要去實作自己不熟的 pattern 是很耗時又很危險的，所以就必須在日常生活中不斷練習自己所需要學習的知識到內化，就可以在重構的時候加快處理的速度。

以我自己為例，剛進入業界的時候，很感謝老闆給我時間可以自己琢磨程式上的實作。雖然很感謝，但是在正式專案練功是一件不好的事情。後來就利用下班時間，多看資料或是嘗試不同的架構方式。當熟悉到一定程度之後，再來規劃要如何和合作的同事說明自己的想法以及導入現有或新專案。

### 擁抱改變

其實，擁抱改變對我來說，某種程度上應該是堅持持續重構的結果，而不是一開始的目標。

當累積過逐次重構的改進成果之後，專案本身就會越往漂亮的架構或寫法邁進。要是有做好如「單一職責原則」等的情形下，需要擴充、改變的時候，往往需要的成本真的會低很多很多很多。

我在專案中雖然會多花一點點點點時間堅持做到重構，在當專案需要變更需求時，好幾次都不用花太多的功，就可以完成變更。

## 可以從今天開始做

- 在寫程式的時候，就需要常態地保有如何改善撰寫出的程式碼的心理 (mindset)
- 看你的語言的 design pattern ，並持續的實作練習
- InfoQ 之類的網站上面有許多有關於架構的議程，並去思考和對應目前工作上的實作有什麼可以改善或是參考
- 多參加不同種類和語言的研討會，裡面通常會有通用、不限語言的架構相關議程可以聆聽
- 交流、分享及紀錄自己所學到及嘗試的東西，回饋給社群或公司內部開發團隊。

## 參考

- [Extreme Programming - Refactor Mercilessly](http://www.extremeprogramming.org/rules/refactor.html)
RxSwift/RxCocoa Driver Unitについてまとめてみた。

# Driver Unitについてまとめてみた
川を引き始めて３ヶ月、ようやくDriverについて少しわかってきたので自身の理解を深めるために一度まとめてみた。

# Driver Unitとは
**DriverはUIに特化されている！！**

**Driverの特徴**
1.エラーでストリームが終了しない
2.メインスレッドで行われる
3.サイドエフェクトをシェアする(あまりよくわかっていない)

Driver Unitの一番の特徴はエラーが起きない事です！(正確にはエラーを購読して[ ]を返している)。`Observable`を使っていた場合`Error`か`Completed`でストリームが終了してしまうが、`Driver`(`asDriver`)の場合はエラーが流れてきた場合は適当なものを返して購読を続けてくれます。なのでAPI通信などがエラーだった場合でもストリームが終了する事なく購読が続きます。

#Example

```swift:Sample

@IBOutlet weak var textField: UITextField!
@IBOutlet weak var resultLabel: UILabel!

let result = textField.rx_text
      .flatMapLatest { text in 
          //API通信
      }

result
     .map { $0.description }
     .bindTo(resultLabel.rx_text)
     .addDisposableTo(disposeBag)
      
result
     .bindTo(tableView..rx_itemsWithCellIdentifier("Cell")) { _, result, cell in 
          cell.textLabel?.text = "\(result.totalCount)"
     }
     .addDisposableTo(disposeBag)
```

上記のサンプルだと`flatMapLatest`内でエラーが起こったらストリームが終了してしまい`result`が更新されてもUIは更新されません。そしてAPI通信がメインスレッド以外で行なわれているとクラッシュの原因にもなります！
そして上記の場合だと1つのストリームを二つのUIにバインドしているので2回HTTPリクエストが送られています。

ではこれらの問題をふまえて`sample2`を書いてみましょう

```swift:sample2
@IBOutlet weak var textField: UITextField!
@IBOutlet weak var resultLabel: UILabel!

let result = textField.rx_text
      .flatMapLatest { text in 
          //API通信
            .observeOn(MainScheduler.instance)
            .catchErrorJustReturn([]) 
      }
      .shareReplay(1)

result
     .map { $0.description }
     .bindTo(resultLabel.rx_text)
     .addDisposableTo(disposeBag)
      
result
     .bindTo(tableView..rx_itemsWithCellIdentifier("Cell")) { _, result, cell in 
          cell.textLabel?.text = "\(result.totalCount)"
     }
     .addDisposableTo(disposeBag)

```
`.observeOn(MainScheduler.instance)`を使う事でメインスレッドで行う事を保証し、エラーの時には`.catchErrorJustReturn([])`を使って`[]`を`return`します。`catchError { _ in Observable.empty() }`でもエラーで購読を終了しないようにエラー処理ができる。
1回のリクエストの結果を2つのUIにシェアするためにここでは`.shareReplay(1)` を使って処理をしています。

では最後にDriverを使って同じ処理を行ってみましょう。

```swift:sample2
@IBOutlet weak var textField: UITextField!
@IBOutlet weak var resultLabel: UILabel!

let result = textField.rx_text.asDriver
      .flatMapLatest { text in 
          //API通信
            .asDriver(onErrorJustReturn: [])
      }

result
     .map { $0.description }
     .Drive(resultLabel.rx_text)
     .addDisposableTo(disposeBag)
      
result
     .Drive(tableView..rx_itemsWithCellIdentifier("Cell")) { _, result, cell in 
          cell.textLabel?.text = "\(result.totalCount)"
     }
     .addDisposableTo(disposeBag)

```

#まとめ
**Driverが行う事**
1. `.observeOn(MainScheduler.instance)` メインスレッドで行う
2. `.catchErrorJustReturn(onErrorJustReturn)` 絶対にエラーで購読が終了しない
3. `.shareReplayLatestWhileConnected` サイドエフェクトをシェアする(やっぱりあまり理解できていない)

３つめのサイドエフェクトをシェアするに関する事でなにかありましたらコメントをいただけると幸いです。
【Java】HashMapとHashtableの違い


調べた備忘。

HashMapとHashtableの違いは複数箇所存在するようだ。

1. `Hashtable`は`synchronized`であることにたいして、`HashMap`はそうではない。単一スレッドのケースでは`HashMap`の方が良いパフォーマンスを出す。
2. `Hashtable`は`null`のkey/valueを受けつけない。対して`HashMap`は`null`keyを一つ持てるし、valueとしては`null`をいくらでも持つことができる。
3. `HashMap`のサブクラスである`LinkedHashMap`を使いたいときに`HashMap`であれば置き換えが容易だが、`Hashtable`では面倒。

`synchronization`が重要でないケースは、`HashMap`を使用した方が便利であることが多い。

[Differences between HashMap and Hashtable?

](http://stackoverflow.com/questions/40471/differences-between-hashmap-and-hashtable) ですべて議論されているので参考にする。