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

こっち→ https://brookbach.com

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

 

ABC032に参加した

 Atcoderで行われているAtcoderBeginnerContest,通称ABCに参加した。

Welcome to AtCoder Beginner Contest 032 - AtCoder Beginner Contest 032 | AtCoder

 今までいくつかこういうのに参加してたけど、参加記ってめんどくさかったので書いたことなかった。他の人が書いてるのを見て、思考の整理になりそう&後々振り返るときなどに役に立ちそうと思ったので試しに書いてみることにした。

A. 高橋君と青木君の好きな数

 A,B二つの数で割れる,N以上の数を出力せよ、という問題。

 最小公倍数を使って・・・とか考えたが,制約を見て全探索すればいいやと思って妥協して実装した。AC時間は開始6分ぐらい。

a = gets.to_i
b = gets.to_i
n = gets.to_i
ans = n
loop do
 if ans % a == 0 && ans % b == 0
 break
 end
 ans += 1
end
puts ans

B. 高橋君とパスワード

 文字列Sに対して、長さKの部分文字列の数Tを数え上げる問題。

  • K > Sの場合は0を出力した。
  • K ≦ S の場合、見つけた部分文字列を配列Tに保存していく。
    i 文字目から i + K 文字目までの部分文字列 tmp を切り出す。
    これが新しい部分文字列の場合、 T に保存する。
    最後に T の長さを計算する。

AC時間は開始14分ぐらい。

s = gets
k = gets.to_i
t = []
if s.length < k
    puts 0 
else
    for i in 0..(s.length - k - 1)
        tmp = s[i..(i + k - 1)]
        if t.include?(tmp)
            next
        else
            t.push(tmp)
        end
    end
    puts t.length
end

C 列

 長さNの数列S、整数Kがある。Sのうち、すべての要素の値の積がK以下となるような、連続した部分列の最長の長さを求める問題。

 Sに0が含まれる場合、解はNとなる。

 Sに0が含まれ、かつK>0の場合、要素の積がK以下となるような配列sと、その積mを作成する。数を一つ取得するたびにmを再計算する。そして、m>Kの間、先頭の要素をpopしてmを再計算する。この際、sの長さの最大値を保存しておく。

 だいたいの方針は上の通り。再計算に関して、はじめ、数の出入りがあるたびにすべての要素について再計算していてTLEした。考えて、出入りする数に関してだけ計算すれば良いと気づき変更した。変更の際、出入りする要素が0のとき、mがnilのときに注意する必要があった。(2REした)

 尺取り法なるアルゴリズムがあって、それに似たようなものになったと思う。

AC時間は開始65分ぐらい。(一回目の提出は30分ぐらい)

n, k = gets.split.map(&:to_i)
s = []
max = 0
m = 0
n.times do
    s.push(gets.to_i)
    if s[-1] == 0
        max = n
        break
    end
 
    if m == 0 || m == nil
        m = s.inject(:*)
    else
        m *= s[-1]
    end
 
    while m.to_i > k
        t = s.shift
        if t.to_i != 0 && m.to_i != 0
            m /= t
        else
            m = s.inject(:*)
        end
    end
 
    if s.length > max
        max = s.length
    end
end
puts max

D ナップサック問題

 3つの条件があって、それらの条件に応じて適切なアルゴリズムを用いてナップサック問題を解く問題。できなかった。

 ナップサック問題の解法は蟻本を写経したものが手元にあったので、それをコピペしたらいけるやろとか思ってたらそんな甘くなかった。要復習。

 条件によってアルゴリズムが変わるのは面白いと思った。

さいごに

 できれば全完したかったができなかったので悔しい。ただ、まだまだ初心者でやることがたくさんあるのはわかっているので(蟻本、チーター本、ABCの過去問など)、練習を重ねて上達していきたい。

 余談だが、サンプルケースをコピペするのがめんどくさいと思いrubyでそのへんやってくれるatcoder_greedyなるgemを作ったんだが、本番でうまくサンプルを取得してくれなかった。