2014ありぺい日記へっぽこプログラマの日記2014年2月20日木曜日タイトル変更とドメイン設定しましたブログタイトルを「ありんこ日記」から「ありぺい日記」に変更しました。aripei.comを取得したので、ブログをサブドメインのblog.aripei.comにして運用する事にしました。なると他のアカウントとかも@aripeiにしたくなるところだが、だいたいすでに取られてる...。Coderに参戦したが、例のごとく最終問題のみ解けなかったので復習した。今回はGumiとIaとMayuというボーカロイドが音楽アルバムを作りますという若干Geekyなお題でした。以下のような入力値が与えられた時に、すべての曲が必ず一名以上に歌われるようなアルバムのパターンは何種類あるかという問題です(一つの曲を複数人で歌うのはOK)。1C1で6パターンとなります。各曲に対して、各一名ずつ歌う場合(3パターン)、各二名ずつ歌う場合(3パターン)、三人全員が歌う場合(1パターン)の合計7パターンあります。7のS乗回試行して条件を満たすものをカウントすればよいのですが、Sが50の場合には1.798465e+42回ほど試行する事になるので残念ながら僕が死ぬまでには計算が終わらなそうです。この手の問題はどうやら以下の二種類の方法で解けるようです。場合分けをして数学的に解く動的計画法で解く前者は場合分けを行ってCombinationを駆使して解く方法、後者は分割統治法とメモ化と呼ばれる手法を使って問題を細分化して同じパターンの部分をキャッシュしながら解く方法です。Coderでは動的計画法は必須知識らしく、他の多くの問題に応用可能なようなので今回はこちらで解いてみました。各項が以下の漸化式で求められるという事に気づく必要があります。こちらは前述の通り各曲に対して7パターン存在するということからも分かると思います。sであるとかの確認をして、この漸化式を満たして、s/g/i/mのパターンをキャッシュしてあげるようなプログラムを実装すればよいです。できあがりは以下のようなコードになりました。このレベルの問題を30分で完璧に解くのはまだまだ無理だなぁ。あ、ちなみに1000000007で割ってるのは問題文に数値がでかすぎるのでこの値の剰余をとるようにって書いてあったから。3が解けなくて悔しかったので復習してみた。問題は要約するとN個のノードからなる有効グラフが渡された時にステップ数Lからなる経路の数が多項式P(L)で表されるか判別するプログラムを書くというのが問題です。本番では英語だし若干複雑なので理解するのに若干時間がかかりましたが...。入力値は個々のエッジを表すYとNの文字の羅列が以下のようにStringのArrayとして渡される。配列長と文字数はグラフの頂点の数と同じです。String[]{"NYN","NNY","YNN"};また、出力は多項式解が存在する場合には"Bounded"、存在しない場合には"Unbounded"をリターンするだけです。この問題は本番時にはコード以前にそもそもどういうアルゴリズムにすれば解けるのかが思いつきませんでした。終了後に以下のようにホワイトボードを使って精査したらやっとひらめいた。Polynomial(多項式解なし)でPがPolynomial(多項式解あり)を表しています。循環して自分に戻ってくるような経路を二つ以上もつノードがある場合に多項式解がなくなるようです。赤のラインで循環を示しているのですが、このラインが一つのノードから2つ以上出ている場合に多項式解がなくなります。N)乗」になるはずです。いう訳でMが1の場合には多項式解、Mが2以上の時には多項式では解けないはず。ルールさえ分かってしまえばコードはこんな感じで簡単に書けました。単純に一つ一つのノードをイテレートして循環が2つ以上ないか確認するだけです。3に費やせる時間は30分程度しかありません。本番でこのレベルの問題がでたらかなりラッキーじゃないと時間内に解ける気がしませんね。2を片付けることを目標とするか。忘れかけたJavaをググりながら書いているので、この辺りのTipsが身に付けば早く解けるようになってもう少しスコアがあがるはず。Lab)ではデータサイエンス系の開発言語をPythonに統一しておりまして、社員達がNumPy、SciPy、pandasなどなどを目下勉強中です。データサイエンティストも積極採用中なのですが、応募者全員に以下のデータ解析タスクをGitHubから提出するという課題を課しています。Requestも多く来ていて嬉しい限りです。Cambridge大学の学生もどんどん応募してきてくれています。:)これが採用に非常に有効で、まずランダムにCVを送りまくっている応募者や、最低限のスキルの身に付いていない応募者のフィルタリングが非常に効率的に行えます。基本的にはこのプログラミングタスクの提出をしていない応募者のCVは一切確認しません。どの言語が得意なのか、どんなライブラリの扱いに慣れているか、どのように考えて分析を進めているのかなどなど、やはりコードを見ると非常に効率よく応募者のスキルを知る事ができます。Applicationの開発に集中しないといけないという言い訳があり、自分ではデータ解析部分に殆ど触れておらずデータサイエンティストに任せっきりにしていました。採用活動をバンバンしている手前、それじゃいかんなと反省して、週末にちょっと時間をみつけて自分でもPythonでデータ解析をしてみました。環境設定まずはCanopyをインストールしました。こちらはPythonでのデータ解析に利用されるライブラリ群(NumPy、SciPy、Matplotlib、pandasなどなど)に加えてIPythonが搭載された統合環境です。これをインストールするだけで必要なツールが一気に揃うので、Macを使っている方には非常にお薦めです。Notebookにまとめると便利です。Web上でInteractiveにコードの実行が出来、かつDescriptionなども加えられて自分の分析がNotebookとしてまとめられるので分析結果の公開が非常にやり易いです。以下のように実行すると、Plotに必要なライブラリが読み込まれ、かつ結果のグラフ等の出力がHTMLに出力されて便利です。inlineUIはこんな感じ。Consumptionsに取り組みました。クラスタリングを行うタスクです。触るということもありやっぱデータの扱いに慣れておらず、半日近くかけてなんとか以下の処理だけ済ませました。Viewerというサービスで公開できて便利です。僕の分析はこちらから見られます。最低要件だけはなんとか済ませたというレベルなので、暇を見つけてちょっとかっこ良く分析するかな。単純に平均から標準偏差を足して引いてしてるだけの分類がダサいので。共有2014年1月17日金曜日HerokuからS3へアクセスするRakeを作ってみたS3に置かれたデータファイルを取得し、それを読み込みデータを更新するというRakeタスクを作って、Herokuのスケジューラでバッチタスクとして登録してみました。Uploads)を参照しながら進めました。Rakeの設定Rakeのタスクはrailsコマンドでlib/tasks以下に生成される。lib/tasks/loader.rakeとりあえずこんな感じで作って。endend実行できる。loader:testtestRSpecもこんな感じで書けました。generatorはないっぽいけどspec/tasks以下とかに置けばよいのでは。Ruby)を見ながら設定したら思いのほか簡単にできました。ローカルから走らせる場合には環境変数に設定するかRakeコマンドに引数として渡す事もできます。yyyまぁ、以下のようにrailsのconfigに置いちゃっても良いみたいだけど。ちなみにこれは接続に失敗した時に表示されるAWSライブラリのエラーメッセージです。file.Rubyからのアクセスには、まず以下のGemを追加します。1.32.0"そうすると上で設定した環境変数を引っ張って下記のように接続からBucketの取得までできます。AWS::S3.new.buckets[ENV['S3_BUCKET']]すると以下のように、key名のprefixでS3上のオブジェクトを取得したりデータを読み込んだりできます。オブジェクトの詳細な扱いとかはAWS::S3のクラスドキュメントにまとまっています。SchedulerとClockworkなどのGemを利用する方法があるらしい。Effortサービスらしいが、とりあえずこっちの方が簡単そうなのでこちらで実装してみました。Schedulerのアドオンを追加すると以下のような感じで簡単にJobの登録ができます。実行後に以下のようにログを確認できます。completeところで、Herokuのログってdefaultだと1500行までしか保持してくれないんですね。アドオン導入しないとな。Papertrailでしょうか。Labというイギリスのケンブリッジにあるスタートアップ企業でプロジェクトマネジメントやシステム設計から開発までしています。2007年に新卒でJPモルガン証券に入社し債券リサーチやリスク管理システムの開発に携わる。2012年4月からグリーでSNSアプリやMessengerアプリの開発に従事。2013年8月より現職。