PFIインターン

去年の8,9月の2ヶ月間,PFIインターンとしてお世話になってました.
遅くなってしまいましたが,簡単にまとめてみます.

インターンの申し込みまで

最初の面接は,結構緊張して行ったけど,割りと和やかな雰囲気だった.課題問題は,行列を使った解き方をしたら,そんな解き方をしている人は他にいなかったということだった.

結果のメールが届いた時には,採用してもらったあまり理由は分からなかった.後から聞いた所では,機械学習とかだけでなく,ロボットとかユビキタスとか辺りにも興味を持っているということがよかったらしい.機械学習とかユビキタス的なことの両方に興味を持っている人は意外と少ないらしい?. 今年は他のインターンの人も,バイオとか機械学習じゃない自然言語処理とか,PFIの中にない技術を持っている人を採ったらしい.

そういえば,今年は,去年よりも席が少なくて募集も多かったようで,選考が大変だったそう.選びきれないということで,2回面接した.1回目と2回目で特に質問が変わったとかは無かった気がする.

インターン中にやったこと

PFIとNTT研究所で開発しているJubatusという機械学習フレームワークでセンサーデータを使ってみようという感じでした.無線で椅子につけた加速度センサのデータをJubatusの送って動きを予測したり,時系列的なデータを処理できるようにしたりしました.(Jubatusなのにデータ量自体は全然大きくなかったですけど).メンターは柏原さん,Jubatus副メンターは海野さんでした.
最終発表の様子がustreamでさらされてます.
http://www.ustream.tv/recorded/25760407
(後半の方です)

感想

ソフトウェア開発経験

志望理由に書いてたこと.柏原さんは結構そこら辺を意識して指導してくれたらしい.TDDとか,ヴァージョン管理とか,コードレビューなどなど.ソフトウェア開発では当たり前なことばっかりだろうけど,僕の研究室では,ちゃんとやってる人いないし(名前すら知らない人も居そう),部分的には一人でやってたりするけど,一人だけで適切にできている気がしない.短期間だったので全部経験は出来なかったけど,隣の席でテストが通らないとか,チケットがどうとか,設計がどうとかという話を聞いて,ソフトウェア開発流れの一端がみれた気がする.

焦り

それぞれの分野で有名人や技術力の高い人ばっかり.さらにそんな人達が常に勉強し続けている.そのための機会もたくさん作られていて,社外に公開しているPFIセミナーとかはもちろん,社内勉強会とか,読書会とかもある.情報も集まりやすい.しかも,全体的に若い人が多い.少し年上どころか,同い年の人も.これにはすごい焦りを感じた.

いろんな人が近い

エンジニアとリサーチャーかが近い.というか境目がよくわからなかった.営業とかそういうのもはっきり決まっているわけでは無いみたいで,社員の人はだいたいみんなお客さんのところに行っていた.みんなが最低限の技術的知識や情報を共有している.これは人数が多くない組織だからっていうのもあると思うし,そこを意識してマネジメントしているというのもあるみたい.話が通じやすいし,わからないことを聞いたらすぐに帰ってくるというとても作業しやすい環境でした.

まとめ

これから就活が始まるので,どういう働き方がしたいかという参考になった.他にもあの企業のOBの人やあの企業にインターンに行った人とかの話も聞くこともできた.
いろんなことを勉強することもできたし,なによりすごく楽しかった.

最小コスト法に基づく簡単な日本語入力システム

大学の講義の課題で作りました.
さっきレポートも出したので,ここにも書いてしまう.
講義のページ: https://sites.google.com/site/kudoutokyoislecture/
書いたソース: http://bitbucket.org/ryoma_kawajiri/minimum_japanese_ime

標準入力からひらがなを一行受け取ったら,
変換結果をスペースで区切りで出力します.
引数で最大の探索個数を指定できます.

辞書の検索には,TRIE木をMarisaという実装を使いました.
辞書はMozcのデータセットを使って,
最小コストに基づいて変換します.
探索はA*で.
詳しくは,講義のページを見て下さい

実行例

loading ... 
num words: 1360581
done
わたしはがくせいです
11067 私 は 学生 です
11760 わたしは 学生 です
14181 ワタシ は 学生 です
14322 私 は 学制 です
14346 わたし は 学生 です
14475 私 は 学生 デス
14689 渡し は 学生 です
14930 渡し は 学生 です
14932 わたしは 学 性 です
14984 わたしは 額 性 です
すもももももももものうち
26206 李 もも も もも もの うち
26361 李 もも 桃 もも の うち
26458 すもも も もも も もも の うち
26527 李 もも もも もも の うち
26541 すもも も もも も もも の うち
26617 すもも も もも も 桃 の うち
26617 すもも も 桃 も もも の うち
26638 李 モモ も もも もの うち
26640 李 もも もも もも の うち
26700 すもも も もも も 桃 の うち
せいせきはゆうがいいです
18660 成績 は 有 が いい です
18756 成績 は 優 が いい です
18897 成績 は 夕 が いい です
19100 成績 は ゆう が いい です
19108 成績 は 遊 が いい です
19285 成績 は 雄 が いい です
19395 成績 は 有 が いい です
19459 成績 は 優 が いい です
19459 成績 は 有 が 良い です
19555 成績 は 優 が 良い です
ぐーぐるにしゅうしょくしたいです
15694 グーグル に 就職 し たい です
17666 グーグル に 修飾 し たい です
18958 グーグル に 就職 し たい デス
19629 グーグル 似 就職 し たい です
20357 グーグル 二 就職 し たい です
20514 グーグル 煮 就職 し たい です
20556 グーグル に 秋色 し たい です
20589 グーグル に 就職 し たい デス
20726 グーグル に 就職 死体 です
20744 グーグル に 襲職 し たい です
bye

有線LANをさしたら自動的に無線LANを切る設定 (Mac)

うちの研究室では,
有線LANと無線LANを同時に繋ぐのは禁止.
無線LANは,大学のグロバールIPが割り当てられる.
そのマシンを踏めば研究室のネットワークに入れて,
セキュリティ的にやばいという理由.

あとは,WiFiは使ってなくても,
Onになってるだけど電力を使うから,
出来るだけOFFにしておいたほうがいい.
(Bluetoothも)

だから,PCを持ち歩くときは,
いちいち手動で切り替えてたんだけど,
こんなことは自動で出来るようにしたい.
ということで調べたら,もうやっている人がいました.
誰でも考えることは一緒ですね.

参考:
http://www.macworld.com/article/1154976/turnoffairportscripts.html

コマンドラインから,ethernetとかairportをチェックしたりいじったり出来るらしい.
あとは,MacのLaunch Agentの機能を使って,
ethernetの状態が変わったらシェルスクリプトを実行するだけってことみたい.
(Linuxでも同じようなことはできそうですね)

bitbucketにMakefile書いたものも置いておきました.
http://bitbucket.ort/ryoma_kawajiri/toggle_Airport
Lionでしか試してませんが.
入れた後,コマンドラインからlaunchctlでなにかしないと,
すぐには有効にならないみたいです.
僕は,再起動したら出来るようになってました.
(誰か調べてください)
ちなみに,WiFiが切り替わるのに,LANを抜いてから数秒かかります.
(しばらく設定がうまくいったことに気づかなかった)

可変長疎ベクトル var_len_vec

可変長の疎ベクトルをつくってみた.
機械学習とかでは,
特徴量の数が最初から決まってないことがあって,
学習の途中で追加なんてこともあります.

key-value型でデータを保存するようにして,
keyに特徴量の情報を入れられると.

ソースは,bitbucketに置きました.
https://bitbucket.org/ryoma_kawajiri/var_len_vec
templateを使ったheaderだけのコードです.

使い方

unordered_mapとかmapを継承して,
四則演算のoperatorとかを追加して実装しているだけなので,
親のmember functionとかももちろんそのまま使えちゃいます.
keyの型には色々使えます.

var_len_vec<double> v1, v2;

v1[1] = 1.0;
v1["-1<x<=0"] = (-1 < x && x <= 0) ? 1:0;
v1["0<x<=1"] = (0 < x && x <= 1) ? 1:0;
v1["gauss:mu=0:sigma=1"] = exp(-x*x / sigma);

var_len_vec<double> v3 = v1 * v2;
double d1 = inner_product(v1 * v2);
double d2 = v1.sum();

あとは,testコードとかも見てもらえばいいと思います.

仕組み

keyの型が何でもいいのは,
implicit conversion (暗黙的変換?)を使って,
stringに変換しているから.
一意に変換出来れば,どんな方法でも大丈夫.

こんなクラスを作った.

class common_key:
  public std::string{
public:
  // implicit conversion
  template<class Any>
  common_key(const Any & any):
  std::string(to_string(any)) {}

private:
  template<class Any>
  std::string to_string(const Any & any) const
  {
    std::stringstream ss;
    int status = 0;
    ss << abi::__cxa_demangle(typeid(any).name(), 0, 0, &status) 
    // ss << __PRETTY_FUNCTION__
       << " "
       << any;
    return ss.str();
  }
};

あとは,mapとかunordered_mapで使えるように,
hashとかequal_toとかの関数を定義してあげれば良いと.
serializationとかも使えるかと思ったけど,
バージョン情報とかを埋め込まれちゃうから,
一意に決まらないことも.

ただ,typeidでRTTIを使ってて効率が悪い.
型はコンパイル時にわかるからいい方法がないかな?
__PRETTY_FUNCTION__とか使うと,
余計なものがたくさん付いちゃうし悩ましいところ.
特徴量作るときだけだから,とりあえず仕方ない.

最後に

keyを文字列にしてるので,
最近,流行りのTRIE木とかの実装をラップすると,
効率が良くなるかな.

あと,RTTIを使わないでいい方法を考えてみる.
boostのserializationとかはどうやっているんだろう?

emacsからの投稿hatena-diary-mode

hatena-diary-modeのテストを兼ねた投稿.
インストールは簡単だったし,
とくにハマるところもなかった.

ソースコードとか投稿するときは,
emacsからのほうが楽そう.

参考:
http://hatena-diary-el.sourceforge.jp/


Previewとかは,出来ないのかな?
また,調べてみる.

はてな記法支援はあるみたい.これから試す.
hatenahelper-mode:
http://d.hatena.ne.jp/amt/20060115/HatenaHelperMode

Emacs LaTeX環境

最近,英語で論文を書き始めた.
その時に,emacsLaTeXの環境をいろいろ調べました.
入力支援,スペルチェック,自動ビルド,自動リロード.

基本的にめんどくさがりなので,
自動ビルドや自動リロードは必要.
でも,出来るだけインストール,設定がが簡単に.
ソフトもできるだけパッケージ管理ができるように.
というようなことを考えて,調べました.

それぞれの細かい設定は,ググってもらったほうが詳しいものが出てくるかと.

環境

マシン: Mac OSX Lion 15-inch, Late 2011
パッケージ管理: MacPorts

  • 事前に入れといたもの

基本的にはMacPortsで. ()のなかは,MacPortsでの名前
emacs: Cocoa Emacs 23.4 (emacs-app)
LaTeX一式: pTeX (pTeX)

pTeXのインストールはすごく時間かかる.
そのうちpTeXもバイナリ配布になったりするのかな?

    • インストール
$ sudo port install emacs-app pTeX

入力支援 auctex

MacPortsにはこれしか無かった.
日本人はYaTeX使ってる人のほうが多いかな?
まだ,使いやすいかはわからない.

  • インストール
$ sudo port install auctex

自動で,auctexモードになったり

(require 'tex-site)

スペルチェック aspell, flyspell-mode

英語のスペルは意外と間違う.
日本語だと良さ気なの無いけど,英語だと簡単にインストールができた.
日本語だと形態素解析とか噛ませないといけないのかな?

ispellがスペルチェックするバイナリ..emacsでパスを通しておく.
flyspell-modeで編集中に単語が辞書にないかチェックしてくれる.
自分で単語を~/.aspell.en.pwsに追加登録することもできる.

  • インストール
$ sudo port install aspell aspell-dict-en

パスを通したり,
LaTeXファイル開いた時に,自動でflyspell-modeが起動したりとか.

(setq-default ispell-program-name "/opt/local/bin/aspell") ;; path to aspell
(setq flyspell-issu-welcome-flag nil)
(add-hook 'latex-mode-hook 'flyspell-mode)
(add-hook 'bibtex-mode-hook 'flyspell-mode)
(add-hook 'LaTeX-mode-hook 'flyspell-mode)

自動ビルド omake, async shell

自動ビルドにomakeを使う.非同期シェルで実行.
emacsのコマンドで呼ぶ方法もあるかもしれないけど.

  • インストール
sudo port install omake
  • 使い方

OMakefile, OMakerootを配置.

M-& omake -P --verbose RET

自動リロード DocView

version 23からは,デフォルトでdviやpdfのviewerがついている.

自動リロード,
スクロールしていったらページも切り替わる など

(add-hook 'doc-view-mode-hook 'auto-revert-mode)
(setq doc-view-continuous t)

.emacsの中身

参考までに.emacsの中身

;; auctex useful command tool??
(require 'tex-site)
;; (load "auctex.el" nil t t)
;; (load "preview-latex.el" nil t t)

;; flyspell-mode: spell checker.
;; automatically check while editting
(setq-default ispell-program-name "/opt/local/bin/aspell") ;; path to aspell
(setq flyspell-issu-welcome-flag nil)
(add-hook 'latex-mode-hook 'flyspell-mode)
(add-hook 'bibtex-mode-hook 'flyspell-mode)
(add-hook 'LaTeX-mode-hook 'flyspell-mode)

;; DocView auto-revert-mode
(add-hook 'doc-view-mode-hook 'auto-revert-mode)
(setq doc-view-continuous t)

実行例

あとは,適当にウィンドウに割り振ってください.

最後に

能力を示すものを作らなければならないことに気がついたので,
とりあえず簡単なものを書いてみた.
これからもとりあえず,数だけでも増やしていく.

同じemacs関連では,emacs-evernote-modeの設定を使用としてるんだけど,
まだうまくいっていない.
はてなダイアリーemacsで編集できるのかな?