2016年振り返り

今日(12/27)、仕事納めでした。今年は色々なことがあった気がします。

まず、転職しました。転職自体は5月頃からぼちぼち考え始めて、実際に内定貰ったのは9月終わり頃でした。 といっても、この間ずっと就活してたわけではなくて、2社ほど訪問した後は8月終わり頃まで空白期間がありました。 就活やめた理由は、webアプリケーションの中でもフロントエンド寄りの仕事があったからです。javascriptマークアップの知識をつけたかったこともあり、しばらく留まりました。 金を貰いながらひどいコードを沢山書いてしまいましたが色々と覚えられたのでよかったです。 就活再開したのは、やはり昔から(比較的)得意なデータ分析を仕事にしたかったからです。仕事は好き嫌いより得意なことを選ぶのが良いと思います。 前職のマネージャーに相談したところ、「そんな仕事は無い」的なことを言われたので転職を決めました。 1ヶ月くらいで複数企業から内定いただいて一番向いてそうなところの就職を決めました。12月から今の職場で働いています。

次に、引っ越しをしました。以前は、ひょんなことから港区西麻布とかいう高級な場所に家を借りてしまい割に合わなさを感じていたので、転職を機に引っ越しました。 今回は、賃貸で初体験となる1LDKにしました(以前は、1Rか1K)。1LDKにすると、色々と良いことがありました。まず、寝室と食事する場所を分離することができます。以前の1Kの家では、食事用の机を置くスペースが無く、カップ麺などを食べる時はPCやモニタが置かれているデスクを使っていました。PCにカップ麺の汁が飛ばないようにとかコーヒーをこぼさないようにとか小さいことに気をつけないといけないためとてもストレスでした。一方、汚れたら拭けば良いくらいの食事専用の机があるとストレスも溜まらず捗ります。 また、風呂・トイレ・洗面台が分離されました。1Kに住んでたころは洗面台と風呂が一緒になってて、歯を磨くだけでも風呂場に行かないといけないのが面倒でした。 その他、浴室乾燥機が付きました。天候を気にせず乾かすことができてとても便利です。1つ不満があるとすれば、家賃が高いです。

次に、普通免許を取得しました。と、いう話をすると大体「今更免許かよ」的な反応をされるのですが、今更取りました。社会人になってから4年ほど経過しています。 時期は10月で、転職のタイミングで取得した有給消化期間を使いました。合宿に行って若者に混ざりつつ2週間で取得しました。 今年あったイベントでは、免許合宿が一番きつかったです。きつい理由は色々とあるのですが、一言でいうと閉塞感がきつかったです。 学科の授業は1分でも遅刻すると欠席扱いとか、仮免試験は脱輪すると失格とか、常に延泊の恐怖がつきまといます。また、ホテルは4畳ほどの狭い部屋でPCと繋ぐためのモニタも作業用のデスクも無いため、日々の楽しみであるインターネットも満足にできませんでした(幸い、wifiは無料のものが使えました)。仮免取得後の路上教習では、教官から罵声を浴びせられる日々でした。どうしてこんなに辛い思いをしなければならないのか、金はあるからいっそのこと新幹線の切符を買って逃げ出してしまえば楽になるのではないか、といったことを考えたりもしました。実際、毎年何人かは途中でホテルからチェックアウトして音信普通になる人がいるそうです。 無事、卒業検定をパスした日には大変でありながらも振り返れば充実した日々を思い出し…となるわけもなく、もう二度とやりたくない、二度とこんなところに来るかと思いながら東京に帰りました。金も時間も精神力も体力も使う辛い体験でした。 (※とはいえ、個人差があるようです。免許持ってる妹に「普通に仕事するより辛い」という話をしたら「それは無い」的なことを言われました。自分が東京でよほどぬるい仕事をしているか、免許合宿耐性が無かったかだと思います。)

2017年は、もうちょっと将来のことを真面目に考える年にしたいです。今年も親から孫の顔が見たい的なことを言われるのかと思うと憂鬱です。

新しいtwitterアプリを作ろうとすると、電話番号認証が必要になったらしい

「今年1年終わった」みたいな記事を書いた(2014年、振り返り - risuo's blog)ばかりですが、タイトルの件が気になったので書いてみます。

twitterのアプリケーション登録をしようとしたものの…

ずっと前に作ったまま放置してあったアカウントがあったので、久しぶりにbotでも作ろうかと思って、 Twitter Developers でアプリ登録しようとしていました。登録するには、まずApplication Managementのページに行きます。

f:id:risuoku:20141227191347p:plain

ここで、"Create New App"した後、フォームが出てくるので各種情報を埋めて送信すると、新しくアプリを登録できます。

f:id:risuoku:20141227191751p:plain

…できるはずでした (´・ω・`)

You must add your mobile phone to your Twitter profile before creating an application.

とのことです。これ、いつからなんでしょうね…

電話番号認証とDigits

ところで、少し前にTwitterが新規登録に電話番号認証を導入したとのことで、観測範囲では話題になっていました。


乗っ取り対策? 複数アカウント排除? Twitterが新規登録に電話番号認証を導入… - NAVER まとめ

Twitter、登録時の電話番号認証を「テスト中」 - ITmedia ニュース

認証に使われてるサービスは"Digits"と呼ばれているらしいです。
Digits | Twitter Developers
なお、DigitsそのものはTwitterに限らず広くモバイルアプリのログインをパスワード不要の簡単なものにするサービスのもよう。それを今回、自社サービスの認証システムとして導入を進めているというところでしょうか。

そして、アカウントの新規登録だけでなくアプリケーション登録にもこの仕組みが使われているらしい、ということが今回わかりました。

普通に使うぶんには大して困らないはずですが、特殊な使い方をしている一部の人達の間で阿鼻叫喚が起きてるかもしれません。

2014年、振り返り

今年も残すところあとわずかとなってきました。
2014年、何やってたかなとぼんやり振り返ってみたのですがまず、仕事では2年目になりました。チーム異動早々、ruby全く書いたことないのにruby系の炎上案件に巻き込まれたり(しかも基本1人でなんとかしないといけない系でした)、提案した案はことごとくボツになったり、何故か別チームの火消しやったりと人並みの苦労とか社会の厳しさみたいなものは経験したかもしれません(?)
プライベートではそうですね、やはり技術面で足りないと感じることが多かったので色々と技術系の本を読み漁ったり実際動かしたりしてました、仕事ではないのに。

過去を振り返ってみる時、本というのは形として残りつつも経験になるので他人と共有しやすいという面があると思います。

ということで、今回は思い出に残った本をいくつか紹介します(アマゾンのリンク貼ってますが、単にどういう本か確認するための簡単な手段を提供するのが目的です)

初めて読んだ本

1. 実践ハイパフォーマンスMySQL 第3版
タイトルの通り、MySQLでハイパフォーマンスを出すためのノウハウが書かれた本です。単にMySQLのことのみならず、実際に必要になる知識が書かれてます。結構分厚いですがマニアックな知識が大量に乗ってるという感じではなく、基本的なことを丁寧に説明してあります。

実践ハイパフォーマンスMySQL 第3版

実践ハイパフォーマンスMySQL 第3版

2. オブジェクト指向入門 第2版 原則・コンセプト
古い本ですが、オブジェクト指向について徹底的に書かれてます。個人的に、手続きVSデータ、のあたりは読みごたえありました。そうか、そう見ればいいのかと思わされます。

オブジェクト指向入門 第2版 原則・コンセプト (IT Architect’Archive クラシックモダン・コンピューティング)

オブジェクト指向入門 第2版 原則・コンセプト (IT Architect’Archive クラシックモダン・コンピューティング)

3. エリック・エヴァンスドメイン駆動設計
有名なDDD本。「雰囲気はわかるけど雰囲気しかわかった気がしない」と自分の周りでは評判です。「リファクタリングしつつドメイン知識に磨きをかけていくこと」というのが印象に残ってます。

エリック・エヴァンスのドメイン駆動設計

エリック・エヴァンスのドメイン駆動設計

4. Scalaスケーラブルプログラミング第2版
Scala関連の本と言えばとりあえずこれですかね。ちなみに、今年はScala初オレオレプロジェクトとしてボンバーマンオンラインのクローンを作ろうとしたのですがオンラインゲーム作るための知識の不足を感じていったんpendingしてます。

Scalaスケーラブルプログラミング第2版

Scalaスケーラブルプログラミング第2版

5. 増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編
数学ガール」で有名な結城浩さんの著作です。マルチスレッド扱うための基本パターンをJavaを使いつつ解説してあります。FutureやActorなんかの有名パターンの解説も載ってます。

と、ここまで書いておいてまだまだあることに気付いたのですが全部書いてると大変すぎるのでこのへんで… 次は読み直した本です

読み直した本

6. 詳解UNIXプログラミング
いわゆるAPUEですね。UNIXシステムの基本に立ち返りたくなった時、たまに読み直してましたがとりあえずman読むでもいいかも?あと、内容が結構古い。個人的には、次のステップとしてLinuxカーネル2.6解読室が気になってます。

Linuxカーネル2.6解読室

Linuxカーネル2.6解読室

詳解UNIXプログラミング

詳解UNIXプログラミング

  • 作者: W.リチャードスティーヴンス,W.Richard Stevens,大木敦雄
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2000/12
  • メディア: 単行本
  • 購入: 8人 クリック: 103回
  • この商品を含むブログ (41件) を見る

7. UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI
ネットワークプログラミングに必要なノウハウが書かれています。かなり分厚い本です。vol1ではネットワークライブラリの使い方の説明がメインで、ライブラリの実装については軽く触れる程度です。例えば、TCP的にFINを送る方法はわかりますがその実現方法まではこの本だけではわかりません。

UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI

UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI

  • 作者: W.リチャードスティーヴンス,W.Richard Stevens,篠田陽一
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 1999/07
  • メディア: 単行本
  • 購入: 8人 クリック: 151回
  • この商品を含むブログ (37件) を見る

8. CPUの創り方
結構前に買ってちょっと読んで放置してたらしいので読み返してます。かなりアナログなところから解説されており読み応えあります。ラーメンタイマ作るのにこんなに手間がかかるのか… と思わされます。

CPUの創りかた

CPUの創りかた

と、ここまで書いておいて直ぐ終わるだろうともくろんでいましたが意外と時間がかかって大変なことに気付きました… まだありますが技術ネタはこれで終了します。

非技術系

振り返ってみて、新しい本はほとんど買ってなくて学生時代読んでたものを読み返したりとかしてました。

9. ギリシア神話(上)(下)
ギリシア神話は学生時代ハマりました。色々なアニメやゲームの元ネタになってたり、西洋古典文学にも元ネタとして出てくることが多く背景知識として知っておくと色々捗りそうだと思ったのがきっかけだった気がします。以前、ギリシアの白地図に各地で祭られてる神様の名前とか縁のある王族の名前とか書きこんで熱心に覚えた記憶があるのですが、久しぶりに読み直すと大体頭から抜けてました。

ギリシア神話〈上〉 (新潮文庫)

ギリシア神話〈上〉 (新潮文庫)

10. 近代絵画史(上)(下)
学生時代、芸術にかぶれてたころ熱心に読んでました。19世紀初頭から近代までの雰囲気がわかった気分になれます。同じ著者による「名画を見る眼」「続・名画を見る眼」もオススメです。

名画を見る眼 (岩波新書)

名画を見る眼 (岩波新書)

11. 風と共に去りぬ(1)~(5)
南北戦争ネタの超有名作。新調文庫で全5巻あって長いのでじっくり読めます。上手く言えないのですが、「悲しいけどこれ、戦争なのよね」みたいな感想です。

風と共に去りぬ (1) (新潮文庫)

風と共に去りぬ (1) (新潮文庫)


というところで、2015年もよろしくお願いします。

2色木(赤黒木)を実装してみた

タイトルのとおりです。
アルゴリズムイントロダクションを読んで理解したことを実装してみたら、想像以上にパフォーマンスが出たので紹介します。
アルゴリズム的な面白さは特に無いです。
言語はC++です。作成した2色木はC++のstd::mapライクなインタフェースを備えています。

ソースの場所→ https://github.com/risuoku/oreore/blob/master/algorithm_introduction/src/data_structure/rb_tree.h
検証用→ https://github.com/risuoku/oreore/tree/master/algorithm_introduction/test/data_structure/rb_tree

やったこと

  • std::pairなデータを生成。データ数は5000000。
  • oreore::map, std::map, std::tr1::unordered_map それぞれに対して生成したデータをinsert, findして、処理に必要な時間を調べた
  • oreore名前空間に入ってるmapが今回作成したものです

なぜmapなのか

処理系依存だと思いますが、std::mapは大体2色木で実装されているそうです。
*1
なので、今回作成した2色木もmapと名付けました。

結果

下に示すグラフのとおりです。
縦軸が処理にかかった時間(sec)で、もちろん小さいほど良いです。
oreoreは機能が単純だからか、stdより処理が高速です。
メモリ使用量については、vmstatで簡単に見た程度ですが、どれも大差ありませんでした。unordered mapが若干少なかったかもしれません。
unorderd_mapは2色木ではありませんがインタフェースが同じなため一応比較しました。
実用的には、unordered_mapを使うといいのかもしれません。

f:id:risuoku:20130713190535p:plain

数学的基礎とデータ構造 (アルゴリズムイントロダクション)

数学的基礎とデータ構造 (アルゴリズムイントロダクション)

  • 作者: T.コルメン,R.リベスト,C.シュタイン,C.ライザーソン,Thomas H. Cormen,Clifford Stein,Ronald L. Rivest,Charles E. Leiserson,浅野哲夫,岩野和生,梅尾博司,山下雅史,和田幸一
  • 出版社/メーカー: 近代科学社
  • 発売日: 2007/03
  • メディア: 単行本
  • 購入: 13人 クリック: 378回
  • この商品を含むブログ (60件) を見る

*1:http://research.preferred.jp/2011/07/stllike-containers/

PRML勉強会で発表する気分になってみる@自宅

爆弾低気圧から身を守るため勉強会は延期となってしまいましたが、資料をUPします。(爆弾ならしょうがないですね><)


ソフトマージンSVM

今回の自分の担当範囲では、ソフトマージンSVMが登場します。
今回、予習するうえで最も時間がかかったのは、資料の中でさらっと流してる感じのWorking Set Selection(WSS) の部分です。SVMは、結局のところ二次計画問題を解くという話になるのですが、時間的・空間的リソースの観点から、汎用のQPソルバー*1では問題があります(変数がM個の二次計画問題を解くには、一般にO(M^3)の時間がかかることが知られています)。そこで、効率的な計算手法が必要となります。例えば、SVMの有名な実装であるlibsvmではSMOという手法が使われているのですが、SMOのパフォーマンスを決めるための重要なコンポーネントがWSSです。libsvmの開発ドキュメントではWSSについて詳細な解説があり、がんばって読んだのですが、結局自分の頭では今日までに理解することはできませんでした(泣)
余力があれば、今後リベンジしたいです。

参考にしたドキュメント・サイトなど

*1:QPはquadratic programming の略です

パラメトリックとノンパラメトリックの狭間

※この記事は、Machine Learning Advent Calendar 2012(http://qiita.com/advent-calendar/2012/machinelearning)の10日目用に書かれています。

はじめに

Machine Learning Advent Calendar 2012の10日目を担当します、@risuoku です。
今回は、数ある機械学習手法の中で、以下の2つに焦点を当て、いくつかのアプローチを紹介します。

  1. 回帰分析
  2. クラスタリング

特に、パラメトリックな手法とノンパラメトリックな手法の違いや、それぞれの特徴の理解を目指しています。
また、@risuokuはPRMLをよりどころに機械学習を勉強してきました。なので、この本の影響を強く受けていることを初めにお伝えしておきます。

回帰分析

「形」の発見

突然ですが、以下の画像から、どんな知識が得られるでしょうか?

続きを読む

電卓自作した話

最近、プログラムというものがどういう仕組みで実行されるに至るのかに興味あって、言語処理系について調べていました。
研究室の先輩なんかは、「あーそれやったわー。数年前にやったわー。数年前やったなー」とか言ってた気がするので、たいした話ではないと思うんですが、個人的には初めての試みだったので結構楽しかったです。
(狭義の)言語処理というのは要するに、ソースコードを読んで、①最小単位(トークン)に分割 ②構文解析③実行(③はもっと細かく分けるべきだと思いますが)しているだけなんですね。
もっと難解なことをやってるイメージがあったので意外でした。
正規表現やら文脈自由文法、およびこれらを処理するためのアルゴリズムの話はそれはそれで面白いのですが、どうせなら動くものをみたいと思い、手始めに電卓を自作しました。

字句解析プログラム生成にはflex構文解析プログラム生成にはbisonを使いました。
ソースはこんな感じ。(https://github.com/risuoku/oreore/tree/master/dentaku
四則演算と、演算の優先度を変更するための括弧が使えます。
ビルドしてから引数無しで実行すると、標準入力から入力を受け付け、結果を標準出力に出力します。
電卓というからには当たり前なのですが、3+2*3は9を出力するのであって15ではありません。逆に、(3+2)*3は15を出力します。

ただ、色々手抜きがあって、例えば各数値はC言語のdoubleで値を保持しているので常に小数で出力されます。あと、bisonを実行するとshift/reduce conflictがおきたり、gccすると警告でたりします。

実は、もう少し言語処理系っぽいものを作ろうとしたのですが、ちょっとforやらifやら入るだけでかなり複雑になるので途中で挫折しました。いつかリベンジしたいです。