鉄分は大事。(特にヘム鉄)

こっち→ https://brookbach.com

ISUCON6予選に参加して学生枠7位で通過しました

きっかけ

参加しようと思ったきっかけは8月の終わりに見たpixivの記事

インターンで知り合った仲間と一緒にISUCONを戦ってみませんか? - pixiv inside

インターン生向けのISUCON CM - Qiita

 

 去年, 一昨年ぐらいからこの時期にISUCONやってるのは知ってて, でも自分のスキルじゃなぁとか一緒に参加してくれる人がいないなーとか考えてて面白そうだと思いつつスルーしてた

 

 今年は上の記事を見て, せっかくだから参加しようと思い, 誰か誘ってみることにした.  去年ぐらいからいくつかインターンにいってて, 一番長く(2週間)やったインターンのメンバーが今もtwitterで交流あったので, 思い切って誘ってみた

 

 二人とも, 興味はあるけどwebは全然詳しくないよーとのことだったので, なんとかなるよとか適当なことをいって参加決定した.

 ちなみにみんな学年は同じだが大学はバラバラ, 得意分野もmayokoが競プロでoshiumiがゲームプログラムで自分が広く浅くやってたりでバラバラ

前日まで

 上記の感じから, ミドルウェアとかデータベースまわりは自分がやり, アプリの遅い部分についてみんなで考えながらやっていくのが良いと思った. また, 相談して言語はRubyで行くことにした

 

ので, ちょろちょろと測定の仕方とかを去年の過去問とかブログから情報収集した

 

 学生枠なら, 必要最低限の設定と運営側が用意した一番のボトルネックを改善できれば通過できるんじゃ無いかなーと見積もっていて, これは実際正解だった

 

 1週間前ぐらいからmatsuuさんが作成Azureに過去問をワンクリックでデプロイする神ツールを使って練習してた

github.com

 

 他のチームメンバーはRubyは軽く使ったことあるぐらいだったので, App.rbのコードリーディングを行い, とりあえずどんな感じかわかるようにした.

 

 3日前ぐらいから, 測定ツールの結果から改善するところをみつけて, 解説を見ながらどうすればいいか理解する練習をした.

 

前日はpixivのisuconを立てて練習した.  ボトルネック見つける→どう改善すればいいか考える, っていう流れを練習できたので良かった

本番

 8時半ぐらいにヒカリエに集合して軽く打ち合わせ, 大体の流れとか, インターンの景品もらってない話とか, TGSどうだったかとかそんな話をしてた

 

10時~

Azureにデプロイ, 初期設定を行う

デプロイ後, 初期設定を行い, その間にメンバーにアプリを見ていてもらった

なんか2つあるっぽいけどなにこれ?どこ見れば良いの?みたいな声が飛んでいた

とりあえずベンチを通し, 0点だったけどPASSはしてたのでたぶんどっかが遅すぎて点数とれてないんだろうなと思った

 

その後, 諸々のログ設定を行う.  練習はしといたんだけど, スロークエリログが生成されなかったりstackprofのログが生成されなかったりして詰まってた. 

 

11時~

11:20分頃にnginxのアクセスログとstackprofがとれたのでSlackに流す, ルートページがめちゃ重でやばいと認識, さらにhtmlifyが9割ぐらい時間消費してたのでここやーと見つける

 

その後, コードを一通りながめて何やってるか理解, SELECT * 消しとかクエリ大文字にしたりとかをチームメンバーに頼み, nginxの静的ファイル配信をちゃちゃっと書く. この時点でベンチ回したら正の点が出て一安心した

 

htmlifyどうするよみたいなのを相談し, とりあえず何やってるか理解しようと思いpryを使って一行ずつ追っていった

 

キーワード見つけてハッシュしてリンクに置き換えをやっているので, リンクに置き換えた後のテキストをカラムに保存してしまえばいいのでは, となり実装を開始

 

12時 ~

12:40分頃に, 置換したテキストをカラムに保存する実装が完成, デプロイ

ベンチを回してみたところ, 12000点ぐらい出て暫定五位になった

方針間違って無くて安心, ここでもう終わりで良いよとかみんなでいってた

 

13時~

スロークエリログは結局あきらめてmyprofilerで簡単なログを取ることにした, データベース小さかったので今回はあんまりデータベースメインじゃ無いんだなとか思ってこれ以上ここで頑張るのをやめた

 

キーワードが追加されたときに, 他のエントリの置換されたテキストを更新しなきゃいけないことに気づく

どうするか相談して, 置換されたときのエントリの総数を保存しておくことにする

 

14時~

とりあえず15000点ぐらいで安定したので, タスクを振り分けながら自分は諸々のconfファイルを拾ってきた秘伝のタレで置き換える作業を始める

 

その後ベンチを回してみたところ, ある時点でユニコーンワーカーが落ちてFAILするという現象にぶち当たる.

 

助けてくれーと叫びつつ原因を探り, ユニコーンUnix domain socketで接続しているのが原因と特定, いろいろいじってみても治らなかったのであきらめてホストとポートで接続するように切り戻し

 

16時〜

htmlifyについて, 自分たちの実装だと初期状態で置換されたテキストを生成する必要があったので, /initializeでそれを行う処理を書いたが5秒以内に終わらずあきらめる

 

17時~

再起動テストを行い, 18000点ぐらい出るのを確認して引き上げ作業を行う

 

ログの設定消し忘れてアプリが落ちたりして, 助けてくれーと叫びながら5分前ぐらいになんとか引き上げ終わる

 

置換されたテキストを生成するため, 終了するまでブラウザからページの更新を行う

 

 

反省点

・htmlifyの解決方法についてもっと考えるべきだった, 他のチームはキャッシュを利用したり, そもそもの置換アルゴリズムを変えていたりしていて, 自分たちのチームはその発想は無かった.

 

mysqlの設定がきちんとうまく反映されなかった. 結局あやふやなままスルーした.

 

・confファイルの設定で時間を取られすぎた, 想定では秘伝のタレをコピペして終わりにするつもりだったのでかなり焦った.  ここで時間を取られてhtmlifyに集中できなかったのが悔やまれる.

 

・合わせて, そのせいであまりタスクを抽出できず, 後半に他のメンバーがやることあんまり無い状態になってしまっていた. 

 

良かった点

・自分が詰まっている間に他のメンバーが諸々を改善してくれていた, チームプレイできて良かった

 

・つまったとき, 悩んだときに, ここは諦めようとか, 妥協しようとかの判断ができた.

 

・一応最低限の改善ができて, 予選を通過することができた. 2万点だと学生枠としてはギリギリかなーと思っていて, 結果が出たときは嬉しかった

 

感想

初めてのISUCONで, とても楽しかった. 予選通過できて良かった.

 

参加したいけど一緒に参加してくれる人がいないみたいなつぶやきは結構あって, その中で自分は一緒に参加してくれる人がいて良かった.

(興味はあるけど・・・みたいな人は多いので, 迷ってる人は勇気を出して誘ってみるといいと思う. 基本的に誘うより誘われたい人の方が多いし, スキルが足りなくても協力すればなんとかなると思う)

 

本戦はさらにグレードアップしたアプリに対して闘うことになると思う,

一ヶ月あるので, 今回の反省を活かし, 足りないところは勉強して, 練習して, 本戦ではもっと良い点が取れるようにしたい.  目指せ100万円

 

 

Sentabe:センサデータベースを作った

概要

ソースコードはこちら

GitHub - keigo-brook/Sentabe: Sensor data base

 

ネットワークに接続されたセンサか ら, 情報を定期的に取得するアプリケ ーションを作成した. また, 情報を取得する期間を, サーバー側で変更できるようにした.

 

アプリケーションのクラス構造は Figure 1 のようになっている.また, Figure 2にアプリケーションのフローを示す.

 

f:id:brookbach:20160715204400p:plain

Figure 1

 

f:id:brookbach:20160715204411p:plain

Figure 2

 

流れの説明

はじめに, Raspberry Pi にてデータを 取得し, それをサーバーに POST する. つぎに, POST リクエストを受け取った サーバーは, この情報を保存する.
さらに次回のデータを取得する時間 (between time)を計算する.
そして, HTTP レスポンスとともにこ の between time を Raspberry Pi に返す.

Between time を受け取った Raspberry Pi は, この情報を元に次にデ ータを取得する時間をセットする.

 

 

サーバサイドはRailsで構築, ViewにはAdminLTEを利用, 

クライアント側なんでもいいけどPythonでとりあえずこんな感じ

Sentabe/sentabe_client.py at master · keigo-brook/Sentabe · GitHub

で書いた

 

感想

作りたかったものに対して大きく堅く作りすぎた気がして少し反省している

もっと適当に作って良かった気がする

 

期間を変更するアルゴリズムについては, 現在は別スレッドを立てて時間が来たらそれを起動するようにしている

 

サーバー側は時間を送るだけなのでクライアント側でやり方変えることができる

 

HTTPで通信するので, 結局レスポンスを返さなければならなくて, だから時間を一緒に返しちゃっても良かったけど, UDPを使って送り続ける感じにもできるなーとか

 

センサ側から送るけど, サーバ側でセンサから取得する形にもできるかなとか

 

あと, いつものことながら, 作り終わると作ったものが小さく見えて本当にこれ使うかな?とか考えてしまったりとか

 

使いながら改良していこうと思う

 

修士に進むことになり, もうちょい技術的にスキルアップしたいなーと考えたので現在職探しをしている.  Railsはそこそこ使えると思うけど, ちょっと違うこともやってみたいなーとか考えている.

 

距離センサで情報取得→カメラ+OpenCVで顔検出

はじめに

研究室に転がってたラズパイとセンサを使って何かできないかな、と考えてたらタイトルのやつが思いついたので実装してみた。雑にまとめておく

 

概要

フローチャートはこんなかんじ。

ブラウザでボタンがクリックされたときに、距離センサから距離を取得して、値が閾値内なら写真を取り、顔検出を行います。

 f:id:brookbach:20160616224340p:plain

 

ざっくりとしたブロック図はこんな感じ。

カメラはラズパイ専用のカメラを使います。

ADコンバート用にArduinoをかませました。

f:id:brookbach:20160616224517p:plain

 

 

実装

ハード

距離センサ SHARP2Y0A21F54

Arduino Uno

Raspberry Pi 1 Model B

Raspberyy Pi camera module OV5647

 

ソフト

Webまわり SinatraRuby

カメラ操作、センサ情報取得とか Python

画像処理 OpenCVC++)

 

ソースコードはこちら

RaspberryPiProjects/IsThereNagashima at master · keigo-brook/RaspberryPiProjects · GitHub

 

感想

個々に見てみるとサンプルプログラムレベルなんだけど組み合わせてみたらそれっぽいのできた

 

OpenCV、今回初めて使ったけど理論とか知らなくても簡単に画像処理できてすごい。

理論も含めもう少し勉強してみる

 

センサ+画像処理、他にも何かできないかな

 

 

pixiv 2016 SPRING BOOT CAMPに参加してきたよ

 

はじめに

 3月14日から18日の5日間で行われたpixivのインターンシップ, pixiv 2016 SPRING BOOT CAMPに参加してきたので参加記を書きます.
 f:id:brookbach:20160323192001j:plain

きっかけ

 院試の勉強を家で一人やっていたときに, ツイッターでpixivがインターンやるよっていうのが流れてきた. 
 pixivはイラストたまに見に行くぐらいだけど, 楽しそうだしgithub応募できるし報酬もらえるし試しに応募してみるかーと思って応募した. 
 

めんせつ

 何ができるかとか, どんなことやってきたかとかを聞かれた.  後で聞いた話によると, 何か作ったことがあるっていう経験を重視してたっぽい.  自分はRailsとかRaspberry pi とか使って諸々やってたのでそのことを話した.  人によってはコード面接があったらしい.
 
 正直選考を通るとは思ってなかったので, 通過のメールが来たときは嬉しいと同時にスキル的に大丈夫か不安になった
 

はじまり

 そんなこんなでインターンが始まった
 
 去年まではハッカソン的なインターンだったらしいが, 今年は実際のプロダクトを使って開発する感じだった.  ハッカソンとかだと見栄えの良い部分だけ実装したり間に合わせのコードを書いたりすることもあるが, この形式だと今書いているコードがプロダクトに追加されるので, すごい真剣に開発をすることができたと思う.
 
 それと総合職と技術職でチームを組んで課題に取り組んだ.  今までは技術職重視の採用だったらしいが, 会社の規模が大きくなり総合職じゃなきゃできないこともあるよねみたいになったらしくて総合職の採用もしているらしい.
 
 自分は総合職の女の子と技術職の自分の二人チームだった
 

くわしく

1日目 オリエン、課題発表

 自分はBOOTH改善というチームで, twitterを使ってBOOTHの商品を宣伝してください, みたいなお題だった.  他のチームも大テーマは決まっているが詳細までは決まっておらず, 総合職と技術職で相談しながら課題に取り組んでいった
 
 自己紹介とかした後, 課題に取り組み始めた.  結構ざっくりしたお題だったので, 総合職が分析しているのに口を挟みつつ技術職の自分は環境構築を進めていた.
 
 環境構築が終わった後は何を作るか, どこまで実装したら良いかとか相談しながら考えてた 

2日目  講義, 仕様考える

 

 午前中, 総合職, 技術職分かれてそれぞれ講義がいくつかあった.  開発についてとか, セキュリティについてとか参考になった. 
 
 その後, 課題に取り組んだ.
 一日目の時点ではtwitterでのつぶやきを完全に自動化しようという感じだったんだけど, いくつかつぶやいてみてそれは無理だとわかった(自然言語処理とかやることになって難しすぎる)ので, 文言や写真の選択は人間がやり, それを簡単にできるようなサポートをするシステムを作ろうとなった
 
 ここでだいたいやることがかたまり, 総合職はどのようなツイートがいいのか分析し, 技術職がそれを元にツイートしやすいシステムを作ると役割分担ができたのでそこからはひたすら開発していった.

上みたいな感じでツイートしながら分析してた

3日目 全体会議, 全社ランチ

 午前中にラジオ体操,全体会議があって, pixivの最近の動向とかすごい内部の情報を見ることができた.  この会社がどんなことを考えて今どう動いているかがわかり面白かった
 
 お昼は全社ランチ.  ゲストとか来てすごい人数だった.  すごい一体感があった. ランチの席はランダムで, 自分のテーブルは新卒の人とかバイトの人とか集まってて色々話聞けて良かった.
 
 夕方から会社説明会に参加した. 説明会の雰囲気が全然堅苦しくなくてびっくりした
 
 それから開発を始めた.
 3日目はこんな感じであまり開発できなかったので, 少し遅くまで残って実装してた.  大体の人が帰ってたけど, 社内ではビール飲んでたり, 趣味のコーディングしてたり, ゲームしてたり, 仕事してたりといろんな人がいて面白かった.  その感じが高校のときの部活の後に似ていると思った.
 

4日目 実装

f:id:brookbach:20160323185107j:plain 総合職の方と仕様について打ち合わせしながらひたすら実装していた.  夜ぐらいには8割方完成して, レビューの開始をした

5日目 レビュー, 発表

f:id:brookbach:20160323190651p:plain 
 

 

午前中に一通り実装が終わり, レビューをしてもらった後, 14時ぐらいにデプロイできた.  余裕ができたのでお昼ご飯食べながらエンジニアの人たちの話に混じったりしてた(楽しかった)
 
 そっから発表準備をして, 15:30から発表をした.  
 発表が終わった後, みんなで打ち上げに行った. 他のチームの人とか, メンターの方とかと色々話できて楽しかった

かんそう

 5日間, 開発楽しすな日々だった.
 pixivは堅苦しい雰囲気が全くなくて, 楽しい職場だと思った.  働くとしたらこういう職場が良いと思った.
 個人としては, 作成したものをデプロイできて良かった.  土台となる部分の実装を早めにすませて細かい部分の調整をするという感じで開発していったのが良かったと思う.  あとこっそりしこんでた発表終わりのツイートが意外とうけて嬉しかった
 
 
f:id:brookbach:20160323190755p:plain

2016年1月に読んだ本まとめ

 今年の目標として本を(文庫で)100冊読む, というのを決めたので, 早速今月から本を読み始めた.  今月は8冊読めた.  はじめてみて思ったけど毎月10冊近く読むのって意識しないとできない.

今月読んだ本

  1. 理科系の作文技術
  2. コンピュータネットワークセキュリティ
  3. カラマーゾフの兄弟(中)
  4. カラマーゾフの兄弟(下)
  5. 車輪の下
  6. ハッカーと画家
  7. ご冗談でしょう, ファインマンさん(上)
  8. 青の炎

 

 以下, 軽い感想

 

 理科系の作文技術
理科系の作文技術 (中公新書 (624))

理科系の作文技術 (中公新書 (624))

 

 レポートとかを書くとき, どういうことを意識して, どんな順番で書けばいいのかを書いているHowTo本.  ちょっと内容が古いところもある(手書きで書くのを基本としてたり, 発表がパワポじゃなかったりとか)けど, 参考になる良い本だった.

 

 コンピュータネットワークセキュリティ
コンピュータネットワークセキュリティ

コンピュータネットワークセキュリティ

 

 

 大学のセキュリティ授業の教科書.  授業のために書いたらしい.  ネットワーク上にて, どこからマルウェアなどに感染して, どのように影響が出るかやその対策を一連の流れで解説している. 教科書だが, 複雑な説明がでてくるわけでもなく, とても読みやすい.  ネットワークセキュリティの基本を知りたかったら読むと良いと思う.

 

 カラマーゾフの兄弟(中, 下)

カラマーゾフの兄弟〈中〉 (新潮文庫)

カラマーゾフの兄弟〈中〉 (新潮文庫)

 

 

カラマーゾフの兄弟〈下〉 (新潮文庫)

カラマーゾフの兄弟〈下〉 (新潮文庫)

 

 

 昨年のうちに上巻を読み終わっていて, しばらく放置していたが, 気合いを入れて読んだ.  長かったし読みづらかった…... いろんな人が次々出てきて, それぞれが言いたいことを言っていく.  どの人物も, 現代人の何かしらの問題点を話しているんだと思う.  キリスト教についての西洋人の考え方がまったくわからないので, そこを知っていたらもっと楽しめたのかなと思う.  ただ終盤は面白かった.  個人的にはイワンが好き.

 

車輪の下
車輪の下 (新潮文庫)

車輪の下 (新潮文庫)

 

 

「詩人になるか, でなければ何にもなりたくない」とかいう超名言を残したヘルマン・ヘッセの自伝的小説.  内容は, 優秀故に勉強を詰め込まれすぎてパンクしてしまった少年の話. 途中BLっぽくなったりする.  全体的に暗い.  嫌なら逃げてもいい, ってことを教えてくれる人, 逃げた自分を受け入れてくれる人がいたら主人公は救われたのかなぁ

 

ハッカーと画家
ハッカーと画家 コンピュータ時代の創造者たち

ハッカーと画家 コンピュータ時代の創造者たち

 

 

 Y combinatorのポールグレアムさんが書いたエッセイ集.  順番になってるわけではないので, 好きな章から読んで良いらしい.  読むと意識上がる. 熱いLISP推し, Microsoftディスが面白い.  個人的に一番面白かったのは, 富についての章で, 今までと違う考え方を学ぶことができた.  以下にこの人が書いたエッセイの和訳一覧があるので, 暇なときにでも読んだら面白いと思う.

http://practical-scheme.net/wiliki/wiliki.cgi?naoya_t%3aポール・グレアムのエッセイと和訳一覧

 

 

 ご冗談でしょう, ファインマンさん(上)
ご冗談でしょう、ファインマンさん〈上〉 (岩波現代文庫)

ご冗談でしょう、ファインマンさん〈上〉 (岩波現代文庫)

 

 

 ノーベル賞とった理論物理学者が書いた本.  というと超難しい本のように思われるけど, 全然違う.  研究しながら職場の金庫破りを勉強したりとか, 題名の通り冗談でしょ?ってエピソード満載の逸話集.  Wikipediaにも少し書いてある.  好奇心がすごい人なんだなぁと思った.  ふざけた話の中にたまにためになることが書いてあって非常に面白い.  この人の授業は絶対面白いと思う. 

 

 青の炎
青の炎 (角川文庫)

青の炎 (角川文庫)

 

 

 かわいいクラスメイトと妹がいるイケメン秀才が主人公の推理小説.  これなんてエロゲ  推理小説なのでネタバレ回避のため反転して感想書いておく.

 ジャンルは倒叙小説で, 一歩踏み外した主人公がどんどん追い詰められていき, 最後には燃え尽きたーって感じで終わる.  小説だからアレだけど, 現実ならそうするよりもこうしてほしいなーと思う.(反転したのに結局ぼかす)

貴志先生の作品は, 新世界より, 黒い家に続き3作目. どの話も面白い.

 

今月読んだ本のまとめおわり.  どれも良い本だった.

欲しい本リスト

www.amazon.co.jp