Homomorphic encryption(準同型暗号)

上記のツイートをした通りで、Homomorphic encryption、日本語で「準同型暗号」というものがあるそうで、要は暗号化したままのデータで足し算とか掛け算を行うもののようです。

Machine Learning Classification over Encrypted Dataでは病気の判定を機械学習で行う際に、利用者の個人情報を守る観点で暗号化したままトレーニングと判定の両方を行う方法について書いてあるっぽいです。Hadoop界隈でも2, 3年ぐらい前からセキュリティ周りの機能強化みたいな話があって、あまり関係ない話だなーと思っていたのですが、最近は仕事で個人情報とかセキュリティ対策みたいな話が出てくることがあり、ちょっと気になって調べてみました。将来的には暗号化したままデータを扱うというのも普通のことになるんですかねー。

ちなみに、Machine Learning Classification over Encrypted DataについてはO'ReillyのNewslettersのDataに載ってました。毎週10個ぐらいのトピックが送られてきて、タイトル眺めるだけでも流行り?が分かるような気がして気に入ってます。

Rによるやさしい統計学 第1章、第2章

Rによるやさしい統計学

Rによるやさしい統計学

2012年の4月にはAmazonで買っていたみたいなんですが、社内で読書会をやる流れになり、約3年経ってようやくまともに読み始めました。あまりにブログ書いてないので、Evernoteのメモをそのまま貼り付けることにしましたw

前提

  • Mac 10.9.5
  • R 3.1.2

1章

1.3 Rを導入しよう

1.4 Rをさわってみよう

  • Rコンソール
    • 割り算はint同士?でも小数点以下まで計算する
    • tab補完使えた
    • log(2, base=10)
      • 名前付き引数が使える
    • Ctrl+a, Ctrl+eが使える

1.6 Rの使い方のコツ

Rcmdrを起動するまでの軌跡
  • 事前状態はXQuartzをインストールしてない状態。
  • RcmdrパッケージでRcmdrだけインストールして試したら以下のエラーとなった。
> library(Rcmdr)
 要求されたパッケージ splines をロード中です 
 エラー:  パッケージ ‘RcmdrMisc’ が ‘Rcmdr’ によって要求されましたが、見つけられませんでした 
  • [Rパッケージインストーラ]で[依存パッケージも含める]にチェックを入れて再実行したら以下のエラーとなった。
> library(Rcmdr)
 要求されたパッケージ RcmdrMisc をロード中です 
 要求されたパッケージ car をロード中です 
 要求されたパッケージ sandwich をロード中です 
Error :  .onLoad は loadNamespace()'tcltk' に対する)の中で失敗しました、詳細は: 
  call: fun(libname, pkgname) 
  error: X11 library is missing: install XQuartz from xquartz.macosforge.org 
 エラー:  ‘Rcmdr’ に対するパッケージもしくは名前空間のロードが失敗しました 
  • XQuartzが必要なことが判明しインストールした。
  • XQuartz.appを起動してから試すと今度は以下のエラーとなった。
> library(Rcmdr)
Error :  .onAttach は attachNamespace()'Rcmdr' に対する)の中で失敗しました、詳細は: 
  call: structure(.External(.C_dotTclObjv, objv), class = "tclObj") 
  error: [tcl] invalid command name "image".
 
 エラー:  'Rcmdr' に対するパッケージもしくは名前空間のロードが失敗しました 

2章

2.2 本書で用いるデータの説明

> 指導法データ <- read.csv("shidouhou.csv", fileEncoding="CP932")
> 指導法データ
   SID   name sex math stat psych_test stat_test1 stat_test2 method
1    1   大村  男 嫌い 好き         13          6         10      C
2    2   本多  男 嫌い 好き         14         10         13      B
3    3   川崎  男 好き 好き          7          6          8      B
4    4   多村  男 好き 好き         12         10         15      A
5    5   松中  男 嫌い 嫌い         10          5          8      B
6    6 小久保  男 嫌い 嫌い          6          3          6      C
7    7   柴原  男 嫌い 嫌い          8          5          9      A
8    8   井手  男 嫌い 嫌い         15          9         10      D
9    9   田上  男 嫌い 嫌い          4          3          7      D
10  10   松田  男 好き 嫌い         14          3          3      D
11  11   高谷  女 好き 好き          9         11         18      A
12  12   杉内  女 嫌い 好き          6          6         14      A
13  13   和田  女 好き 好き         10         11         18      A
14  14   新垣  女 嫌い 嫌い         12          9         11      C
15  15   大隣  女 嫌い 好き          5          7         12      B
16  16   水田  女 好き 嫌い         12          5          5      D
17  17   斉藤  女 嫌い 嫌い          8          8          7      C
18  18   柳瀬  女 嫌い 嫌い          8          7         12      C
19  19   佐藤  女 嫌い 嫌い         12          7          7      B
20  20   馬原  女 嫌い 嫌い         15          9          7      D

2.4 データの視覚的表現

> 指導法 <- t(指導法データ["method"])
> 指導法
       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20]
method "C"  "B"  "B"  "A"  "B"  "C"  "A"  "D"  "D"  "D"   "A"   "A"   "A"   "C"   "B"   "D"   "C"   "C"   "B"   "D"  
> table(指導法)
指導法
A B C D 
5 5 5 5 
  • hist関数はフォントファミリーを指定しないと日本語が文字化けする。
    • hist(心理学テスト, family="HiraKakuProN-W3")
    • http://www.karada-good.net/analyticsr/r-58/
    • hist関数のヘルプにfamily引数の記述はなかったが[...]の所に[graphical parameters]のリンクがあって、[Set or Query Graphical Parameters]の中にfamilyに関する記述があった

2.10 標準化

  • z得点(z score)というか標準化はscale関数で出来る。
    • t(scale(指導法データ["stat_test1"]))
    • scale関数は列を処理する。書籍では行を処理する例であったため、最初scale(t(指導法データ["stat_test1"]))にしたら全部NaNになったw
    • http://rtutorialseries.blogspot.jp/2012/03/r-tutorial-series-centering-variables.html
    • http://www.statmethods.net/management/functions.html
      • ここでscale関数がz得点に使えるのが分かった。関数が端的にまとまっていてよさげ
    • t(scale(指導法データ["stat_test1"],center = FALSE, scale = FALSE))にすると当然だが値が全く変化しない
      • falseは参照エラーになる。TRUE/FALSEが最初から用意されているグローバル定数らしい
> t(scale(指導法データ["stat_test1"]))
                 [,1]     [,2]       [,3]     [,4]       [,5]      [,6]       [,7]      [,8]      [,9]     [,10]    [,11]      [,12]
stat_test1 -0.3883216 1.164965 -0.3883216 1.164965 -0.7766432 -1.553286 -0.7766432 0.7766432 -1.553286 -1.553286 1.553286 -0.3883216
              [,13]     [,14] [,15]      [,16]     [,17] [,18] [,19]     [,20]
stat_test1 1.553286 0.7766432     0 -0.7766432 0.3883216     0     0 0.7766432
attr(,"scaled:center")
stat_test1 
         7 
attr(,"scaled:scale")
stat_test1 
  2.575185 
> t(scale(指導法データ["stat_test1"],center = FALSE, scale = FALSE))
           [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20]
stat_test1    6   10    6   10    5    3    5    9    3     3    11     6    11     9     7     5     8     7     7     9
> scale(t(指導法データ["stat_test1"]))
           [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20]
stat_test1  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
attr(,"scaled:center")
 [1]  6 10  6 10  5  3  5  9  3  3 11  6 11  9  7  5  8  7  7  9
attr(,"scaled:scale")
 [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

2014年振り返り

もう年が明けてますが、2014年について振り返っておきます。

  • スマフォ向けWebアプリを作った
  • アジャイルデータサイエンスの付録を書いた
  • fullbokをがっつり使ってみた
  • EMRを触った

ちなみに、去年は年末年始に仕事があってタイミングを逃して振り返りを書けませんでした。今年はその反省を活かして振り返りを書けて良かったです(今年も年末に仕事自体はしてたんですが、同僚のおかげで去年よりも忙しくなかったというのもあります。同僚の◯◯さん、ほんとありがとうございます!おかげさまで今年は嫁の実家に正月の挨拶に行けましたm(__)m)。

スマフォ向けWebアプリを作った

クライアント側はCreateJSを使ったCanvasベースのWebアプリで、サーバー側はNode.jsで、通信はSocket.IOみたいなものを1年ほどメンテしていました。どちらも他の方にベースを作ってもらったので私自身がスクラッチから作ったわけではないのですが、なるほどなーという感じでした。

クライアント側の開発にはMiddleman, Haml, SCSS, CoffeeScriptも使っていて、色々便利になってるなーという印象でした。まぁ、CoffeeScriptはあまり好きになれず、結局生成されたJS眺めてデバッグしてましたがw

当然実機のテストもするわけでiOSAndroidそれぞれテストして複数端末対応の厳しさを実感したりしました。iOS系はブラウザの挙動自体は安定してたんですが、端末によってアスペクト比が違ったり、iOSのバージョンによってSafariの描画領域のサイズが違ったり、横向きの場合のどうするかとか色々悩まされました。Androidに関しては標準ブラウウザがまともに動かなかったり、端末によって利用できる音声フォーマットに差があったり、そもそもスペックが低くてfpsの調整したりとかしてました。

インフラ構築/運用の部分もメンテしていて、やはり他の方にCloudFormationのテンプレートを作成してもらったのですが、これまた便利だなーという感じでした。S3やCloudFrontの使い方についても覚えたりした感じで、一部は会社のブログに書いたりしてました。

アジャイルデータサイエンスの付録を書いた

縁あってアジャイルデータサイエンスの付録を書かせていただきました。
「アジャイルデータサイエンス」の付録を寄稿しました | Developers.IO

付録を書く上で本文を原著で読んだのはいい経験でした。仕事上、英語のドキュメントをちょこっと読むことはありますが、あれだけまとまった分量のものを読んだ経験はなかったので、読もうと思えば読めるという自信?を持てました。まぁ、面倒なのでほぼ辞書は引かずに読める範囲をフィーリングで読んでたので理解度は怪しいですが(^_^;)一応、社内向けにConfluenceに要約書いたり、Pigのコードについても読み込んだりして、色々勉強になりました。

付録のFluentdに関しても使ったことはあっても特に詳しいわけではなかったので、ドキュメントをがっつり読んだりソースをちょこちょこ読んで理解が深まって良かったです。あとFluentdはほんとネット上のリソースが充実しているので、何を書いたものか悩ましかったりしました。

fullbokをがっつり使ってみた

負荷試験用にJMeterクラスタを構築できるfullbokというツールがあるんですが、こちらを使ってCloudFrontへ負荷試験やったりしました。
CM re:Growth 2014 Tokyoで負荷試験ツールであるfullbokについて話しました #cmdevio | Developers.IO

OriginがAMS(Adobe Media Server)でHDSとかHLSについて調べたりしました。あと、CloudFrontに関してはかなり詳しくなった気がします。

EMRを触った

Hadoop好きと名乗ってたりするのですが、おかげさまでEMRの導入支援案件をやったりしました。あと、何度かHadoop関係の勉強会に参加したりしました。

その割にはHadoop関連のブログは上の5本しか書いていないわけで、今年はもうちょっと書いていこうと考えています。

前述は Groveの温度センサーをEdisonにつないでみた | Developers.IOというエントリーを書いた際に思ったことなんですが、やはりHadoop関係は中途半端に知っているだけにブログを書きづらかったというのがありました(ブログのエントリー数が少ないのはそもそも仕事の忙しさに負けているというのもあるのですが)。ですが、全くHadoopやEMRを知らない人向けにブログを書くのは、それはそれで意味があることかなーと思い、今年はHadoopやEMR関連のエントリーを書いていくつもりです。

まとめ

振り返ってみると今年も色々と勉強したなーと思います。今年は定年(35歳)になりますが、おかげさまで毎年成長を感じられていますし、今後も学びたいことだらけだったりします。目標という意味では毎年思うのですが、今年こそはもうちょっとアウトプットを増やせるといいかなーと思ってます。

Linuxのプロセス名とは

ちょっと前の話なんですが、職場でZabbixの監視にプロセス名とコマンドラインが使えて、psコマンドでコマンドラインはとれるけどプロセス名はどうするんだとなりました。結局、同僚から/proc/${pid}/statusに入ってるNameでいいと聞いたのですが、もっと簡単に取れる方法はないのでしょうか。。ありました!。ちなみにWindowsはwmicコマンドで両方一気に取れました。

Linux

2014-08-11訂正: psコマンドでまとめて取れました。 @heroweenさんありがとうございます!

ps axww -o comm,args

まずはコマンドライン。psコマンドで取得できます。

ps auxww | grep キーワード

次にプロセス名は/procで確認できましたが、psコマンドと同様にキーワードから取得する方法はないんでしょうか。。

grep Name /proc/プロセスID/status

Windows

wmicコマンドでプロセス名とコマンドラインが一気に取れます。

wmic process where "name like \"%キーワード%\"" get name,commandline

実践 機械学習 〜レコメンデーションにおけるイノベーション〜

実践 機械学習 〜レコメンデーションにおけるイノベーション〜を読みました。60ページぐらいで1時間もかからず読むことが出来ます。内容は機械学習アルゴリズムの紹介ではなく、機械学習によるレコメンデーションの全体像を掴むことが出来るような内容でした。機械学習とはどういうもので、実際に構築するにはこういう要素が必要で、チューニングにはこういう手法があるといった内容です。そのため、機械学習に関する予備知識がなくともざっくり読めるのではないかと思います。

  • 機械学習とレコメンデーションとは
  • 正確さと開発コストのトレードオフを意識する必要がある。
  • 言動ではなく行動が重要。好みなどを回答するのは一部のユーザーであり、既に偏っている。そうではなくて、各ユーザーの実際の行動(参照ページ、リンクのクリック、スクロールなど)が重要であり、それらの情報を収集できるようにWebサイトを作っておく必要がある。
  • 履歴マトリクス、共起マトリクス、インジケーターマトリクス
    • インジケータマトリクスはMahoutのRowSimilarityJobを利用して作成する
  • レコメンデーションエンジンの実装にSolrを利用する。
    • ドキュメントのフィールドに共起インジケータを追加することでSolrクエリの結果をそのままレコメンデーションデータとして利用できる。
  • 音楽レコメンダーを例に実装の詳細について解説
  • ディザリングとアンチフラッド
  • マルチモーダルとクロスレコメンデーション

原書であるPractical Machine Learningも入手していたんですが、結局読まずにいたら日本語訳版も無料で公開されたので読んでみました。ありがたいはなしです。あと、先日のHadoop Conference Japan 2014でも本書に関するセッションがあったようです。動画とスライドが公開されています(このセッションも興味があったんですが、Prestoの方に参加しました)。

個人的にヒットしたのはどこまで正確さを求めるかという部分でした。

そのための重要なスキルは、「良いというの は、どのくらい良いのか?」という質問に答えることができる、というスキルです。

最近、仲間内でMahoutイン・アクションを読み合っているのですが、そこでも正確さの話が出ていて、その値はいいのか悪いのかみたいな話がありました。本書を読んで、自分自身の過去の経験も振り返り、正確さは本質ではないのだなーと思いました。結局、どれほど値が良くても、それをビジネス的に活かす部分まで繋げられていなければ、単に値がいいけどそれで?という話になるなーと(もちろん、モデルができていて、正確さを1%向上すると利益が0.5%向上するみたいなケースは絶対額にもよりますが正確さを上げることにリソースを割いた方がよいと思います)。

あと、RowSimilarityJobでインジケータマトリクスを作成するには「ログの対数尤度比検定(log likelihood ratio test = LLR)」を利用すると書いてあったのですが、これは具体的にはRowSimilarityJobクラスを実行する際の引数として--similarityClassnameオプションを指定する際にDistributedLoglikelihoodVectorSimilarityクラスを指定するということを指すようです。最初にmahout 0.5のRowSimilarityJobのJavaDocを読んだ際に--similarityClassnameオプションを見落としてて、どうやってインジケータマトリクスが作れるのか理解できずに1時間ほどググったりして悩んでましたorz(最終的にこのMLにたどり着いて複数実装がありそうなことに気づき、ローカルに入れていたmahoutのソースを確認したらDistributedVectorSimilarityインタフェースの実装が大量に見つかりました。。)

ちなみに、本書を読んで一番良かったのは、このブログを書くために色々調べたり、振り返ったことだと思います。やはりブログを書くのは重要ですねw

はてなブログに引っ越しました

いまさらなんですが、はてなブログに引っ越しました。
http://n3104.hatenablog.com/

何回か書いてみてからどうするか決めれば良いと思っていたので、実際には3月末からはてなブログ側で書いています(といっても、この日記を書く時点で3エントリーしかありませんが)。とりあえず暫くははてなブログで書いてみる予定です。

RDS for MySQLでEvent Schedulerを利用する

結論から書くと、Parameter Groupsでevent_schedulerを[ON]にするだけです。
http://stackoverflow.com/questions/14940910/creating-mysql-events-in-amazon-rds

event_schedulerのデフォルトは[engine-default]になっていました。この状態だと[OFF]扱いのようです。

mysql> SHOW GLOBAL VARIABLES LIKE 'event_scheduler';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | OFF   |
+-----------------+-------+
1 row in set (0.01 sec)

Event Schedulerはその名の通り、SQLを任意のタイミングで実行できるスケジューラーです。こんな機能あるんですね、知りませんでした(゚д゚)!
http://dev.mysql.com/doc/refman/5.6/en/events.html

cronのような一定間隔の実行も出来ますし、特定の日時に一回だけの実行もできます。どんな感じで設定するかはCREATE EVENT Syntaxを見るとイメージがわくと思います。 http://dev.mysql.com/doc/refman/5.6/en/create-event.html

ちなみに、event_schedulerがOFFでもイベント自体の登録は可能でした。あと、Event Schedulerは専用のスレッドが動作するので SHOW PROCESSLIST\G で存在を確認できたりします。
http://dev.mysql.com/doc/refman/5.6/en/events-configuration.html

既に登録済みのイベントは SHOW EVENTS\G で確認したり出来ます。 http://dev.mysql.com/doc/refman/5.6/en/show-events.html

参考
[MySQL] イベントスケジューラの起動と停止 - グローバル変数event_scheduler | idocsq.net

※一部の方へ
あっちのブログに書くのは結構大変なので、さらっと書けるんだけどEvernoteに貯めとくのもな~という内容はこちらのブログに書いていくつもりです。