狐に騙され覚書

あぁこれ便利だなってことを忘れてもいいように覚書。主にプログラミング言語主体ですよ。

AngularAttack2017 参加レポート(前編)

概要

4/22 0:00 AM (UTC) - 4/23 23:59 PM (UTC) にかけて、AngularAttack というオンラインハッカソンに参加しました。 その名の通り、angular というフレームワークを用いたハッカソンです。 http://www.angularattack.com/

基本的に登録からフィードバック、表彰に至るまで全て英語で行われるので、インプットはもちろんアウトプットも英語でできないといけませんでした。 昨年から始まってまだ開催は2回目らしいので、今後参加者や参加地域が増えるに従って国際化も進むかもしれません。

フィードバックフェーズでどんなチームが出ているのか見てみましたが、多くはやはり San Francisco からで、たまにインドなどからちらほらといった感じでした。 プロダクトが完成してフィードバックまで参加したのは 125チームらしいです。 僕の知る限りでは、日本人は他にいませんでした(見落としてたら教えてください)。

成果物(Entry)

Angular (RxJS) + firebase database で YouTube の同期的動画再生サービスを作りました。 YouTube にデモ用の動画をあげています。 https://www.youtube.com/watch?v=xDqUWYbzO5Q&cc_load_policy=1

ホスト側(画面左)で動画を再生、停止、シークすると、それに追随して右側のブラウザでも動画が操作されます。

実際に動くものは以下の URL から触れます(が、たまに動かないです、あと利用規約とかプライバシーポリシーとか書いてないので、あくまでプレゼン用という体です)。 http://www.angularattack.com/entries/290-whitegold/launch

バグがあるなーというのはわかっているんですが、レギュレーション上、期間を過ぎてのコミットができないので(ペナルティが与えられるため)、そのまま放置しています。 ホスト(動作を共有したい側)のブラウザを再読込すると直ることがあります。

全体の流れ

登録から表彰までの流れを簡単に書きます。 ほとんどは普通のハッカソンと同じだと思いますが、フィードバックフェーズが新鮮でした。

  • 参加登録(チーム名を決める)
  • レギュレーション等の発表
  • github private repository に招待される
  • ハッカソン開始、プログラミング
  • アピールフェーズ
  • フィードバックフェーズ
  • 入賞者発表
  • 表彰

参加登録

ハッカソンの 2ヶ月くらい前に告知があります。 twitter とかを追っていると良いです。 https://twitter.com/angularattack

確か githubgoogle でログインして、チーム名を決めただけです。 5分くらいで終わります(英語が読めれば)。

レギュレーション等の発表

ハッカソン開始前にそのプロダクト専用のコード書いてはいけませんとか、バックエンドサーバーを使いたい場合にはどうするとか、普通のハッカソンと同じようなルールです。 ただし、全てオンラインで行われるため、時間制限に関してはかなりシビアだと思います(例えば時間外のリポジトリへのコミットにペナルティをつけたり)。

プライベートリポジトリへの招待

運営側が用意した空っぽのリポジトリに招待されます。 プロダクトのコードはリポジトリのコードと完全に一致していないといけません。

ハッカソン開始、プログラミング

このフェーズはプログラミングするだけです。 ただし基準は UTC なので、日本では朝9時から始まります。この一年で最も健全な土日でした。

たまに公式 slack上で技術的な質問をしている人がいたりしました。 日常的に angular を使っている人が多いのか、質問自体の総数は少なかったです。 質問の質も割と高かったかと思います。

アピールフェーズ

48h なので、プロダクトもそれなりに複雑なものができあがります。 そのため、他のチームやジャッジにアピールするためのページを用意しなければなりませんでした。 書かなければならない内容は、

  • アプリケーションの URL(自動)
  • Githubリポジトリの URL(自動)
  • チーム名(自動)
  • チームの情報
  • プロダクト(Entry)名
  • スクリーンショット
  • 簡単な説明
  • 詳しい説明
  • 操作手順 Y* ouTube の URL
  • 使ったリソース(Angular とか firebase とか)

です。(自動)と書いているところは自動で入ります。 アプリケーションの動作サーバーは、ジャッジに対して管理者権限が渡せるところであればどこでも構わないというものでした。 firebase hosting とか heroku を使っている人が多かったです。

フィードバックフェーズ

このフェーズでは、ハッカソンの参加者、ジャッジ、一般の人がそれぞれのプロダクト(Entry)を評価します。

評価軸は、

の3軸で、それぞれ 5点満点で評価されます。 大体 3.5点が平均になるようにしてねと言われますが、ジャッジの中にはそれを知らずになのか、かなり低い評価を付けている人もいて、一時期 slack が荒れていました。

最終的に、各Entry内でそれぞれの軸の評価値の平均をとって、その値がその Entry の得点となるような指標でした。ただ、各ジャッジ、参加者は全ての Entry を評価できるわけではないので、誰が評価したかによってバラツキが出るよね?どうするの?ということを slack で聞いています(まだフィードバックフェーズなので進行形です)。

このフィードバックは当然ながら全て英語で行われるので、攻撃しないように、そのプロダクト(その開発者)にとって有益で、快く自分の Entry も評価してくれるように(さらに相手の得点を高くしすぎないように)する必要があり、なかなか神経と知識を使いました。

入賞者発表

フィードバックフェーズが終わると、入賞者の発表に移ります。 賞は以下のような指標で決定します。

  • チーム優勝者(TEAM WINNER)
  • 個人優勝者(SOLO WINNER)
  • イノベーション(INNOVATION)
  • デザイン(DESIGN)
  • 機能性、楽しさ(UTILITY/FUN)
  • 人気(POPULARITY)
  • 優勝者と書いてあるところは、Entry の総合点で競います。
  • 複数人のチームと個人のチームで賞を分けてくれているところに合理性を感じます。

その下のイノベーション、デザイン、機能性、楽しさは、それぞれの指標で最も高いスコアを出した人が選ばれます。

人気は、フィードバックされた数が最も多い人です。 公平性を期すために、自分のチームには投票できなくなってるよと書いてありましたが、実際には、「他のチームの評価を書く -> 僕らのチームの評価も書いてね」という流れが確立していたので、結局人の多いチームが有利でした。

その他

事前にコードを書くのは禁止ですが、コンセプトを練ったりデザインカンプを描いたりすることは可能です。むしろそうするべきです。 参加した人はまぁやっぱり自分も苦労しているのである程度褒めてくれるのですが、そうでない、いわゆるジャッジは、デザインとかも含めてワーワー言ってくるので、勝ち残りたければある程度戦略を持って望むべきかなと思いました(少なくとも一人ではキツイ)。

コメントの中で、「デザインは…ミニマリストだね!」というものがあって、

「あぁ、僕は日本人だからね。ミニマリストは禅の精神を反映しているんだ。」

と返しておきました。ユーモア力も試されます(結果には反映されません)。

前編のまとめ

まだ評価フェーズが終了していないので、前編はここまでにします。 評価方法に関して思うところはありつつも、オンラインハッカソンとしてまとまっていて、非常に楽しい時間でした。

WEBアプリケーションエンジニアが新しい技術を学ぶということ

職業としてのエンジニアになってから 3年が経ったので、主に WEB業界に興味のある方々を対象に、新しい技術を学ぶことについて思うことをつらつらと書いていきます。

その前に

せっかく読んでいただく方の時間を無駄にしないように、定義と対象を書きます。

定義:新しい技術

本稿における「新しい技術」とは、現時点で その人が自在に扱えない技術 のうち、人生の中で 相対的に短い期間で習得可能 なものを言う。

※1「自在に扱える」や「相対的に短い」とは個人の感覚の話になるので、従ってここでいう「新しさ」は個人の感覚に依るものとなります。

対象とするエンジニア

世の中には何種類かのエンジニアが存在します。 例えば技術を鉛筆に例えると、鉛筆を使って本を書くことが専門の人がいたり、木を削って鉛筆を作ることが専門の人がいたり、鉛筆で書いたものを消す消しゴムを作ることが専門の人がいたりします。 ソフトウェアの世界でも同様に、大衆向けアプリケーションを作って多くの人の利便性を追求する人がいたり、アプリケーションを作るためのプログラム言語やフレームワークを開発する人がいたり、はたまたエコシステムなどのミドルウェアを開発する人がいたりします。

表題に挙げた「新しい技術を学ぶことの意義」ということを考えるにあたり、この違いを無視するには差異が大きすぎるので、本稿では「大衆向けアプリケーションを作る人」を対象とします。

なぜこれを書こうと思ったのか

僕個人の、それから会社の技術的方針を示す意味合いが大きいです。 なので、ここに書いてある趣向と異なる人たちを否定しようとかそういう意図は一切ありません。

本編:新しい技術を学ぶということに対して、思うこと

道具箱に入っている工具は多い方が良い

鉛筆を使っていくうちに、芯先が丸くなって書きにくくなったとします。 その時に、道具箱に入っているものがナイフしかなければ、それで削るしかありません。 ナイフはもちろん、他の用途にも広く使える大変優れた発明品ですが、鉛筆を削るのに最適とは言えません。

技術の世界で言う機械学習はまさにそんなメタファーを持ちます。 工学モデルとしてのフィードフォワードニューラルネットワークは任意の(※2)関数を近似できることが知られている非常に強力なツールです。 このニューラルネットワークの中間層(隠れ層とも)を何段も積み重ねた深いネットワーク(DNN: Deep Neural Network)は、 Google などのリーディングカンパニーが示す通り、非常に強力な効果を持ちます。

しかし解こうとしている問題が単純ならば多くの場合、すぐに思いつくソリューションに比べてコストを多く払うことになります。 そのコストと天秤に乗せるのは、次の節で述べる行使の目的です。

※2 厳密には連続である必要があったり有界だったりする必要があります。wikipedia を参考文献とするのはアレですが・・ ref. Universal approximation theorem - Wikipedia

技術の行使には目的が伴う

(本稿で想定する)技術の目的はあくまでユーザーの文化への寄与です。 ユーザーの目的を達成するための経路に乗っていない技術選択はするべきではありません。 この経路を設計する上で必要となるのが、前節で示した道具箱の中身です。 もし道具箱の中身が多様性で溢れているなら、経路選択はより柔軟に行なえます。

ここで注意しなければならないのは、経路は必ず 目的点から 論理展開されていることです。 持っている 道具から 辿っていった目的点への経路は、必ずしも最短とは限りません。

例えば機械学習という道具を持っていたら、四則演算は解くことができるでしょう。 しかし、目的が四則演算であれば、当然ながらそんな大層なツールは不要です。 ただし、そこで機械学習を用いることにより、エンジニアの採用が捗り、 結果として開発が早く進むといったストーリーが描けているのであればその技術を採用する価値はあるかもしれません。

あくまでも、目的が何なのか、そのためにどういう経路が描けるのかをすりあわせておくことが重要と考えています。

新しく手に入れた道具はそれまで持っていたものよりも輝いて見える

消しゴムがすり減ってきて新しく買ってもらったら、古い方はまだ残っているのに使わなくなってしまった、という経験はありませんか? 僕は経済学に明るくないですが、同じものを使い続けているとその限界効用は逓減するので(※3)、新しいものに飛びつきたくなるのではないでしょうか? エンジニアは、システムが完成(※4)することで効用を得ている部分が少なからずありますから、ことエンジニアに関しては限界効用逓減の法則で説明できそう(?)という気がします。

ですが今言及した効用はあくまでも個人の効用の話であり、組織としての効用でないことは注意しなければなりません。組織としての効用はユーザーの体験や文化への寄与、営利団体で言えばその結果として得られる収入に大きく依存します。なので、技術を採用する立場にいる人は、新しい物にバイアスがかかっているという前提の上での、公正な評価、決断をするべきです。

※3 とテレビで林先生がおっしゃっていました ※4 完成とはなんなのかという議論は一旦置いておきます

周りに人が多いと道具を振り回す時に気をつけないといけない

そうは言うものの、組織が大きくなると密度が高くなります。 隣の人との距離は近づき、腕を上げただけで隣の人にぶつかってしまうこともあります。 そうすると徐々に、新しい道具をもらって試すという行動が、個人のときとは比べ物にならないくらい重いものになります。

メタファーばかりで分かりにくいかと思いますが、具体的に言えば、 クラウドサービスを軽く使ってみたいのに申請が必要だったり根回しが必要だったりと、そういうことです。

そういう制約条件の中で生き残っていくのも非常に有意義で、それを楽しいと感じる人も多いことと思います。 ただ、それが窮屈だと感じる人は、技術に対して理解あるスタートアップへの転職をオススメします。

そんなわけで

弊社ではエンジニアを募集中です。 https://corporate.nicogory.co.jp/recruits/engineer

書いてない職種やスキルセットでも、有益であると判断すれば採用させていただく可能性はありますので、お気軽にご連絡ください。

twitter(個人) https://twitter.com/_c_hase

まとめ

(特に法律周りの)文化を変えたい、そのためにはアンテナを広く持ち、新しい技術を取り込みつつもその時々にあった最善の選択でシステムを構築したい!という方を募集中です。 最近オフィスから徒歩30病のところにレストランビルができたので、まずはランチでも。 http://www.gems-daimon.com/

エンジニアは電気羊の夢をみるか?

『アンドロイドは電気羊の夢をみるか?』という本がある。
その世界では、ほとんど人と見分けの付かないアンドロイドが何人(何体)も登場する。 彼ら(作中ではそれらと呼ばれる)と人間との区別は、自分以外のものに感情移入できるか否かでなされる。 感情による非合理性が排除された世界において、もし人間の脳がエミュレートできるのであれば、社会全体の向かうべき方向というのも同様にエミュレートすることができて、その帰結として個人が生きる目的というのも定めることができるのだろうか。 つまり、自分は何のために生きるのかという経路を全て示すことができるのだろうか。

さて、2015年も残すところあと僅かとなりました。 僕の人生はおそらく連続的で、2015年にあった色々なことも結局は時間微分可能な1本の線でしかないわけですが、いくつかの変曲点は存在したと自覚しています。 変曲した因子は、物理的な相互作用を伴う外的な因子と、そうでない内的な因子(つまり思想的なもの)とが存在していました。

内的な因子について、評価ってなんだろうというところから始まりました。 社会に出て、自分以外の人から評価されるという状況には多々出くわしてきました。 社内評価、市場価値、自己評価……常に評価され続ける中で、その評価基準ともう一つの基準が同じ方向を向いていないなんてこともままありました。 例えば、市場価値は機械学習(ないしはAI技術)に関する修練を積めば飛躍的に上がることは市場を見れば明らかでしたが、それは僕が社内で評価基準を最大化する方向ではありません。 そんなことは、社会では当たり前のように存在していて、合成ベクトルが成す方向に対して進むのが最良の選択です。 ですが俯瞰してみれば、その評価基準というのはあくまでも局所的な部分空間での話でしかなくて、それを包含する空間ではまた別の評価空間が存在します。 考え出せばキリがなくて、どこかで上界を定めないことには哲学の檻に囚われてしまうばかりかと思います。

そもそも評価というのは何か目的を達成するための道標でしかなくて、お金持ちになりたいとか良い家住みたいというのが僕の人生の目的なのだろうか?というところに行き着きました。 そもそも目的関数が僕の意志と一致していないとわかって、じゃあ何を基準にするかは、とりあえず老衰でこの世を去る直前に、楽しい人生だったと思える生き方というのを定めようと。 世間では夢と言うのかもしれません。

幸いにして、盲目的に培っていた知識や技術は、目的を昇華するにはおよそ十分な基底を形成しています。 せっかくなので、2016年も変曲点たりうるように、楽しんで過ごしたいです。

なんか唐突に終わりますが、言いたいこと書ききったので終わりです。

家に帰るとそこは快適空間(¥8,000)

最近暑いですね。

昼間は外に立っているだけで汗だくになるので、いっそのことタクシーで移動しようかと毎日葛藤しています。 でも真夏日が年間 30日あるとして、そこを全てタクシー移動にすると 60,000円くらい交通費(片道)になるので思いとどまっています。

www.jma.go.jp

さて、こんな日は家に帰っても暑いじゃないですか。 なので、家に帰ったら涼しい部屋が良いです。

端的にいうと、今日言いたいのはそれだけで、家に帰ったら涼しい部屋になっているためのガジェットです。

こちら、IRKit と言って、その名の通り(IR: Infrared / 赤外線)赤外線通信を行って家電を操作するためのものです。 みなさんのご家庭にある家電も IR で操作するものが多いかと思います、テレビとか。

学習リモコンもこの原理で学習していますが、学習リモコンと違うところは wifi に繋ぐとインターネットを介して信号を発信できるところです。

実物 f:id:chase0213:20150804182730j:plain

つまり、スマートフォンがあれば、外からエアコンが操作できるんです! 凄い。

IRKit に関して言えば、iPhone のアプリがそこそこ出ていて、それを使うだけでサクッと使えるようになります。 (動作環境は Amazon さんとかを参考にしてください。)

設定は 5分かからないくらいでしょうか?

こんな感じでリモコンを幾つか登録できます。

f:id:chase0213:20150804182754p:plain

それで、この記事を書いている理由というのが、自慢 5割、宣伝 3割なんですが、残りの 2割はいわゆる IoT への可能性の示唆です。

これはつまり、スマートフォンがあれば赤外線で操作可能な家電が操作できるということを意味しています。 僕最近、Apple Watch 買ったんですけど、ウェアラブル機器を介して生体情報を iPhone に送信、 iPhone はそれに応じてエアコンを付けたり消したり、果てはオーディオシステムを介して自然の音楽を流してオートカウンセリングとかできるようになります。

つまりこれは、インターネットの世界が物理世界に拡張されていると解釈することができて、 WEBエンジニアとしてはわくわくしますよね。

IoT自体はバズワードっぽいのでそのうち収束すると思いますが、概念自体は当たり前になるものだと思います。 というわけで、世界の拡大を感じて思わずブログにしたためた今回でした。

うっかりリリースしちゃってた話

おはようございます。 いやー、3連休明けは週末が近くていいですねー。

3連休、僕はと言えば、500エラー検知システム入れたらめっちゃ通知来てて辛い連休を過ごしたんですけどね。

それはともかくとして、本来は先々週こちらで発表するはずだったリリース告知ですが、 いろいろあって先週に延びまして、 またいろいろあって今週やっと見れる形になってきました。

なので、この場をお借りして、2週間遅れのリリース告知とさせていただきます(ワーワー)。

Nicogory

www.nicogory.co.jp

(´-`).。oO(なんか画像のリンク切れてるけどここ何が表示されるんだろう。




何ができるかと言うと、「これって法律上可能なの?」とか「それってどうやって解決したらええねん?」みたいな法律に関する問題の解決手順を調べられます!

それで、せっかくなのでね、なんか自社サービス使って、例えば3連休明けだから有給って絶対取れるんです!?みたいなやつをリンク貼ろうと思ったんですけどね。







f:id:chase0213:20150724064547p:plain







え、なんか「労働」カテゴリ、グレーアウトされてますやん!?







ということでね、引用失敗しました。

ちょっとコンテンツ作る人足りてないなー(チラッ) 興味ある人いないかなー(チラッ)


じゃあ、サービスのコンセプトだけお伝えしておきますね。

例えば、苗字違いで同じ名前の人と結婚することってけっこうありますよね。

そんなとき、結婚したら同姓同名になっちゃうじゃないですか?




「それって、名前変えられるの・・・?」




という疑問が出たときに、




「じゃあ、専門家に相談だっ!」




ってならないですよね。

弁護士さんとかに相談すると、相談するだけで相談料がかかるというのはこの世の常識かと思います。 まぁせっかく日本中の人と繋がれるポータブルデバイス(iPh○neとか)があるんだから、 とりあえず調べるだけ調べてみよっか。

というときに、

https://www.nicogory.co.jp/faqs/937

はいこんな感じです。

ふーん、なんかうまいことやったら変えられるのか。 で、やっぱり専門家に相談するしかないの?

というときに、

https://www.nicogory.co.jp/how_to/23/sub_category

はいこんな感じです。

検索も使えます。 前に話した elasticsearch がフルパワーで動いています。

f:id:chase0213:20150724064502p:plain

で、1点だけ注意ですけど、これらの相談に対して我々が直接回答するわけでもなければ、 専門家を斡旋するわけでもないです。

これらの行為は、弁護士法第七十二条により禁止されています。

(非弁護士の法律事務の取扱い等の禁止) 第七十二条  弁護士又は弁護士法人でない者は、報酬を得る目的で訴訟事件、非訟事件及び審査請求、異議申立て、再審査請求等行政庁に対する不服申立事件その他一般の法律事件に関して鑑定、代理、仲裁若しくは和解その他の法律事務を取り扱い、又はこれらの周旋をすることを業とすることができない。ただし、この法律又は他の法律に別段の定めがある場合は、この限りでない。

http://law.e-gov.go.jp/htmldata/S24/S24HO205.html

なので申し訳ないですが、そういったご相談には乗れませんので、 いたずらにメールとか送ってくるのはやめてくださいね。


で、次何やろうかなーって思ってるんですけど(開発の話)、 とりあえず検索エンジン機械学習に注力しようかなーと。

さっきの検索窓で、「改名」って入れても出ないんですよね。 え?なんで出ないの?ってなるじゃないですか。 これすごいイライラするじゃないですか。

この辺がある意味検索エンジンの弱いところで、インデックスされていない単語はどうやっても検索できないんですよ。 シノニム(同義語)毎日突っ込むのもまぁありっちゃありなんですけど、それってあまり本質的でない気がして。 だってシノニムかどうか判定するの、人間でしょ? 自分で学習してよ、めんどくさいから。

というわけで、自然な発想として機械学習検索エンジンのハイブリッドに帰着するわけです。 なので、誰か手伝ってくれる人募集中です。

リクルーティングURL 貼るの疲れたので、興味のある方は facebook とかで僕に直接連絡ください。 フルコミットであればそれなりの待遇でって浦野っち(CEO)が言ってました。

なんか雑に紹介すると怒られるんで、浦野っちブログ貼っておきますね。

urano.nicogory.pink

それでは今週もお疲れさまでした、あと1日頑張りましょう。

本当はリリース告知だった話

おはようございます。 株式会社Nicogory の技術責任者(CTO)をやってます。

昨日、弊社のリリースイベントを東京大学本郷キャンパスで行わせていただきました。 それで、本当はリリース告知する予定だったんですけど色々あってリリースが来週になりました。

でもなんか書きためてしまっていたし、これ以上放置しても鮮度が下がるので公開します。

転職したこと

2年と少し前に、比較的大手のWEBサービス運営企業へ就職しました。 それから、1年と10ヶ月くらい働いて、今から 5ヶ月くらい前に退職しました。 あまりその辺りの心情について話したことがなかったので、自身への備忘も込めて書きます。

私は高専の出ですが、当学では 5年生(大学 2年生相当)で卒論を書きます。 その後、専攻科に進むと更に 2年間研究をすることになります。 その時に画像処理と機械学習の研究を行っていました。

大学院ではそれとはあまり関係のない、どちらかと言うとグラフ理論寄りの研究をしていたのですが、 ちょうど就職した時期辺りで世の中は人工知能ブームで、 あぁ知ってる知ってる!ということで、オープンソースのプロダクト で遊んだり を検証したりしていました。

人工知能のブームは1950年頃から何度かあるのですが、人工知能という言葉がひとり歩きしてしまい、 実際にできることと理想とのギャップが大きすぎて衰退するという流れを繰り返して来たようです。

松尾豊先生による『人工知能は人間を超えるか』にこのあたりの話が書いてあります。 端的に言えば、人工知能とは何か、今話題の深層学習(Deep Learning)とはどんなもので、何ができて何ができないのかと言ったことを簡潔に書いた本です。 数式は登場せず、専門でない人も読みやすくなっています。

弊社の顧問である中西先生は、もう少し広い枠組みで『スマートデータ・イノベーション』という本を書かれています。 こちらは人工知能だけではなく、ビッグデータや IoT なども合わせて、データとどう向き合っていくかを考えるきっかけに良いと思います。

そもそも人工知能という言葉に私自身あまり積極的ではなくて、ずっと機械学習(または Machine Learning)と言っています。 人工知能という言葉のニュアンスが余りにも広く、専門的な分野では扱いにくいためです。 つまり "人工知能" がもてはやされているということは、一般の人々に訴求するような話題として上がっているので、 例によって実際にできることと理想とのギャップに冬の時代を再び迎えるかもしれません。 ただ、できることが増えている以上、何かそれで楽しいものが作れないかな?と考えるのがエンジニアの本質だと思っているので、 ひっそりと検証したり外部の勉強会に参加したりしていました。

それで、外部の方々、特に共通言語として数学を持つ方々と触れ合ううちに、 「あぁそういえば数学って楽しいよね」 という感覚が戻ってきて、一方で業務内容はと言うと数学が利益に直結する環境ではなかったのでモヤモヤが溜まっていました。 松尾先生が以下の記事でも語られていますが、機械学習の精度を上げることがそのまま売上を向上させるという構造を作り上げた GoogleFacebook は、 この辺りのインセンティブ作りが非常に上手いと思います。

http://www.rieti.go.jp/jp/events/bbl/15060301.html

さて、私個人としては、機械学習関連の検証やアウトプットにそこそこ時間を使ったものの、 周りの反応であったり雰囲気であったりを見て、あっさり会社を辞めました。

ダメなら自分から動いて周りから変えていこう!というのはまぁ確かにもっともなんですが、 ちょうどその頃、数社からお誘いをいただいていたこともあり(特に転職活動していたわけではないんですが)、 そこにエネルギーを使うのであれば、もっとリターンの大きいところはあるし、 職業柄あと5年くらいは食いっぱぐれないだろうなとふんでいたので、その他色々あって決意しまいた。 私は院卒なので、そもそも後先考えずにチャレンジできるのは高々あと 4年くらいだなというもの考えました(矛盾)。

本筋から逸れすぎるので、この辺りでやめます。 聞きたい人はお寿司おごってください。

5ヶ月でやったこと

それで転職してから、開発環境に関してはまぁほぼ何もなかったこともあって、ほぼ丸々作りました。 主要なやったこと一覧は以下の通りです。

Ruby on Rails + AngularJS による WEBアプリケーションの開発

  • 法律相談ポケット執事 『Nicogory』の設計・開発・リリース(来週)

www.youtube.com

  • 株式会社Nicogoryの運営するサービスを横断的に使用できる NicoID の設計・開発・リリース(来週)
  • NiCO MATCHING(士業向け)の設計・開発・リリース
  • コーポレートサイト の設計・開発・リリース
  • NicoSys(士業向け、未リリース)の設計・開発
  • マイクロアプリケーション(モノリシックアプリケーションとの対比)としてのアプリケーション設計(DB、サーバー構成など)

構成管理

  • chef によるサーバー構成管理

私がジョインしたタイミングでは、サーバは構成管理されておらず、そもそも構築手順書も存在しなかったため、 それらを chef で管理するようにしました。

  • serverspec によるサーバー構成テスト

構成管理を抽象化してコードによって管理するため、 正常に動いているように見えて実際には期待通りに動作していないというバグが介入する可能性があります。 したがって、コードによって構成管理されたサーバに対してテストを書くことは自然な流れであるので、serverspec によるテストを導入しました。

  • CircleCI によるテスト自動化

開発速度向上のため、テストを自動的に実行し、その成否をマージの基準の一つとしています。

情報整理

  • 社内redmineサーバー構築
  • ドキュメント管理サービスの選定(esa.io)

社内に情報管理するための基板が存在しなかったため、redmineesa.io を導入しました。

NoSQL DB

  • redis の導入

まずはセッションキャッシュとして、後に各種集計用のオンメモリDBとして使用します。

  • 分散KVS Cassandra検証

RDS以外の DB として最近再度注目されている Cassandra を検証しました。 サービスのスケールに合わせて導入予定です。

検索エンジン

OSSの中で最も勢いのあり、かつ私の使用経験もある elasticsearch を導入しました。

  • fluentd によるサーバーログ転送および集約機構の構築
  • elasticsearch + kibana によるログ可視化

サーバログを始め、各種ログを集約し、集計するための基盤を構築しました。

機械学習

検索エンジンでは行えない、または行いにくい価値をユーザーに提供するための基盤です。 数理最適化手法によるコスト関数最小化にも使用します。

監視

  • nagios によるサーバーおよびサービス死活監視
  • NewRelic によるサーバー死活およびリソースの視覚化、監視
  • slack への各種通知設定

サーバやサービスの死活を監視する機構を設計、導入を行いました。 ダウンタイムを極力減らすことが目的です。

その他

  • hubot による簡易勤怠管理システムの構築、デプロイの一般化、各種集計機能の実装、ごみの日通知機能の開発

エンジニアしかできないことを減らし、リスク分散を行うことを目的としています。 情報の取得障壁をできるだけ減らし(例えばDAU集計のために経営者が SQL を叩くなんて馬鹿げている)、意思決定を迅速に。


我ながら、結構働いたなという感じはあります。

それはそれとして、弊社では上記のような開発環境を持ちあわせています。 私個人としては(つまり弊社の技術方針でもありますが)、 使用している技術を公開するデメリットが大きいと考えられていたのはすでに昔の話で、 現在では公開することのメリットの方が大きいと考えています (もちろんセキュリティ上のリスクや最終的には利益とを天秤にかけた上で載せられる範囲で)。

弊社は、技術に関してはそういう方針ですし、論文を書くことも技術ブログを書くことも推奨しています。

サイバーエージェントのかたは、むしろ「公開しないことのリスク」とおっしゃっています。

seleck.cc


さて、ここから先はリリースしました!うぇーい!みたいな記事になる予定だったのですが、 事情が変わったのでもう淡々と人材募集します。

WEBエンジニアやリサーチャーの方はこちらです。

corporate.nicogory.co.jp

アナリストや法律家の方、SIer の方はこちらです。

corporate.nicogory.co.jp

募集していない職種の方でも、ご興味・ご関心のある方はぜひご連絡ください。 ご質問等々、私個人に facebook とかで聞いていただいても構いません。

はい、余談扱いになってしまいますが、来週またリリース告知します。

人工知能に髪を切らせる

はじめに

釣り気味なタイトルですが、私が実際に髪を切ってくれる人工知能を作ったわけでも、そのアルゴリズムを考案したわけでも、もっと言えば人工知能に関して専門なわけでもないです。

じゃあなぜこんな記事を書こうと思ったかというと、

  • 実際に髪を切ってくれる人工知能を作るためにはどうすれば良いか

と、

  • 機械学習を行って何かをするプロセスを身近な例でなぞってみたい

という自己満足の範疇を出ない欲求からです。

前提

この記事で考えるのは、以下の範囲に留めます。

  • 髪を切るというのはどういうことなのか(理容師、美容師に求めているもの)を考察する
  • 前工程で考察した内容を基に、アルゴリズムのベースとなるアイデアを構築する

つまり、実際に人工知能を作ったり、ましてはロボットアームを使って自分の頭髪を切らせてみるみたいなことはしません。

本題(考察)

本題に入ります。 まずは、髪を切るということを定義します。 厳密に言うと、ただ髪を切るだけでなく、理容室や美容室に行くときに期待することを含意しつつ定義します。

ではまず、なぜ人は髪を切るのかという点について案を列挙します。

  • 髪が伸びてきて、邪魔だから
  • 暑い
  • イメチェン
  • 失恋したから
  • ...

ふーむ、どうしたものかとしばらく眺めていたのですが、あることに気づきます。 髪を切るという行為の目的として、自分をよく見せたいというものと、利便性を追求するものがあるということです。

自分をよく見せたいという目的に関しては、ではどうすれば自分がよく見えるのかということを考えます。 よく見えるための因子は色々あって、例えば自分の顔の骨格、耳の形、肌の色、最近の流行、職業、地域などが挙げられます。

一方、利便性を追求するという目的に関しては、快適な生活を送ることと髪の流さの関係を考えます。 因子は、髪の長さごとの視野の狭まり、聴力の大小、発汗量などが挙げられます。

実際には、このフェーズは非常に重要なフェーズで、目的に対してどんな因子(変数)が存在するのかをできるだけ沢山列挙します。

本題(アルゴリズム概要)

では次に、ユーザーは何をしたら人工知能が勝手に髪を切ってくれるようになるのかを考えます。 端的に言うと、ユーザーが自分の好みや状況を最小限伝えることで、勝手に切って欲しいです。

好みの学習

好みを学習させるためには、とにかくユーザーの好みを表現しなければなりません。 ここで、前ステップでやった因子の列挙が生きてきます。

難しいことは抜きにして、どの因子がそのユーザーにとって大切かを数値で表現してあげればいいわけです。 さて、

髪の長さごとの視野の狭まり、聴力の大小、発汗量など

こちらはなんとか数値で表現できそうな気がしますが、

自分の顔の骨格、耳の形、肌の色、最近の流行、職業、地域など

これはどう表現すれば良いのでしょうか。

形状に関して言えば、特許の関係で非常に使いにくい SIFT特徴量や SURF特徴量、それぞれに互換的な性能を持つ幾つかの特徴量があったりと、先人の知恵が手助けしてくれます。

色は RGB なり HSV なり、Lab色空間(*が付くやつもある)なんてものもあったりして、好きな色空間を選べば良いです。 実際のところ、RGB色空間よりも Lab色空間の方が人間の感覚とマッチしていたりするという論文もあったりするので、ここでも先人の知恵を借りることになります。

職業はある意味特殊ですが、簡単に言うと髪型に対して自由の効く職業とそうでない職業があるのでその辺を考慮して、 また、地域によって髪型や髪色の分布が異なると思うので、それをエネルギー場として定義して数値で表せば良さそうです。

というわけで、なんとなく大体のものは数値で表現できそうなことがわかったので、それらをまとめて(ベクトル化して)k-NN(k Nearest Neighbor)アルゴリズムとかに突っ込むと、自分の興味や状況にあった髪型を取ってこれるようになります。 とっては来れるんですが、そもそも参考となる画像がないと何も起きないので、参考画像にも同じように数値化するプロセスを挟んだ上で、kNN に突っ込んで学習させます。

ね?簡単でしょ? (ただし、正規化・正準化や、次元削減をしたり主成分分析をするプロセスは飛ばしています。)

髪を切る

自分の好みがわかったら、後は人工知能から提示された写真の中から、今の気分のものを選んで切ってもらうだけです。 そこに提示されている写真は、"理論的には"自分の好みにあっていてかつ自分に似合う、さらには流行にも乗っている(かもしれない)髪型なので、それはもう好きに選ぶことができます。

それで、髪を切るというステップは意外と難しくなくて、 絶対に人間の頭が動かないように固定した上で、髪を切る空間座標を与えれば良いです。 ロボットアームは、人間の手よりもはるかに正確に座標をなでることができるので、人間の頭が動かなければなんなく髪型を整えられるはずです。

ふむ。なんかいけそう。

まとめ

というわけで本当にざっとですが、人工知能による美容師ロボットの設計のアイデアの草案を書きました。 何を言いたいかというと、機械学習ツールが誰でも使えるようになったからと言って、誰でも機械学習を使いこなせるわけではないということです。 こういうものはいつも twitter に書いているんですけど、144文字では書けなさそうなのでチラ裏な感じで書いてしまいました。

https://twitter.com/_c_hase

でもなんかこういう未来が来たら楽しそうだなー。