クフでダローバルな日記

タフでもグローバルもない

学科内bot作成ハッカソンを開催したので知見を共有します

「学科内 bot作成 ハッカソン」季語: ハッカソン(夏)

学科の希望者を募ってTwitter botを作るハッカソン的なものを開催しました。 ハッカソンと言っても参加者の多くは授業でプログラミングをしているくらいなので大層なものではないのですが、企画者として色々と学びや反省点があったのでノウハウの共有も兼ねてまとめます。

個人的にこれは大事だと思ったことは強調しておくので、参考にしていただければ幸いです。

企画するまで

僕の所属する電子情報工学科では、一応情報系の名を冠する学科ということもあり、学科に配属された当時から「みんなでハッカソンとかしてみたいな」的な話が一部でありました。 が、そもそも全員が実際に開発した経験があるわけではないなどの理由から特に実現することもなくその話は流れて行きました。

しかし、先学期に転機が訪れました。というのもこの学科では、実験の一環として6~7月に学科全員が2人1チームでそれぞれ独自のIP電話を(C言語で)作って発表するという恒例行事があるため、全員が一応開発経験を積むことになります。 作ったものを人前で発表するという経験は僕もなかったのですがとても楽しく、皆も楽しんでいたようなのでまたやってみようと思い、ハッカソンを企画・開催することにしました。

企画段階

参加者はtwitterや学科のslack上で募り、ある程度の人数が集まりそうだということで開催を決定しました。

googleからハッカソン 運営ガイドというものが公開されており、これを読み込むことで企画側としてのイメージを固めていきました。 ハッカソン開催を考えている人は是非読んでみることをオススメします。

教室を借りるための書類が必要だったりしてちょっと面倒だったのですが、お世話になっている先生のご協力を賜ったため割とスムーズに進みました。 開催場所は先述の運営ガイドに則り、

  • プロジェクター有り
  • 十分なコンセント有り
  • 机同士が向かい合った会議室のような部屋ではなく、一つの机に2,3人の教室のような部屋

としました。 チームで開発するハッカソンではこれらが必須条件なのではないかと思います。

準備段階

実際に準備を始めた段階で想定された主な困難は以下のようなものでした。

  1. 一日で完成させる自信のある人が少ない
  2. アイディア出しが大変そう
  3. メンターの数が少ない
  4. そもそも企画者の僕がハッカソンに参加したことがない

それぞれどう解決したかをまとめます。

一日で完成させる自信のある人が少ない

授業でC言語使った経験しかない人も多かったのですが、とにかく全員が作ってみるのが大事だと思ったので全員に完成を目指してもらうことにしました。 そのために、

  • 作るものをtwitter botに限定する
  • 言語もrubyに限定する
  • 動かすのはheroku上とする

細かい限定をかけることで、全員の足並みをそろえることにしました。 この条件は実は普段僕がbotを作る際にやっているものであり、実際に参加者が作り始める前に僕からノウハウを教えることで、スムーズに開発を開始できたのではないかと思います。

アイディア出しが大変そう

botを作ったことがあればtwitter APIを使って何ができて何ができないのかわかるので作りたいものの困難さも大雑把にイメージできますが、初めてbotを作る際には大変だろうということで、参加者への事前アンケートでアイディアを聞いておくことにしました。

その上で、回答として出てきたアイディアそれぞれに対して「自分だったらこんな感じで作る」「これはちょっと難しいかも」といったアドバイスをこちらから供給してみました。 どれほど参加者の役に立ったのかは分かりませんが、企画者が開発を始める前にアドバイスをすると開発を始めるのが楽になるのではないかと思います。

メンターの数が少ない

僕一人でメンターをするつもりだったのですが、さすがにキツそうなのでB4の先輩に手伝っていただくことにしました。圧倒的感謝。

参加人数が14人だったのでメンターは二人で何とかなりましたが、だいたい5,6人に一人くらいはメンターがいた方が良いのではないかと思います。まだ一回しか開催していないので印象でしかありませんが。

そもそも企画者の僕がハッカソンに参加したことがない

ハッカソンに参加したことがなくても、ハッカソンは開催できるという前例を作ったのでみなさん気軽に開催してみてください。先述のハッカソン運営ガイドは素晴らしいです。読み込みましょう。

開催直前〜当日

事前課題

さすがに当日だけでは間に合わなさそうなので全員に以下の事前課題を課しました。

  • 最低限の環境構築(UNIX環境)
  • herokuへの登録
  • rubyの基礎の勉強

環境構築段階ではやはり人によってはエラーが出まくっていたようなのでサポートが必須だなと感じました。 だからといって全員揃ってやっているとエラーの出た人が律速段階になってしまいがちなので難しいところです。 今回の場合はslackでエラーコードを貼ってもらいながら解決できたので、そういったコミュニケーションツールの選択も重要だと思います

herokuへの登録はまぁスムーズだったのですが、最近herokuの無料プランの使用が変更されてしまったので僕も勝手がわからないところがありました。 開催者側は最新の情報にキャッチアップしておくべきであると思います。今回の 反省点の 一つです。

rubyの基礎の勉強についてですが、やはりこれが一番の負担になっていたように感じます。全員に書籍を買わせるわけにも行かなかったのでとりあえずドットインストールを紹介したのですが、後でよく考えてみるとオブジェクト指向プログラミング等は今回のハッカソンにはオーバースペックなところがあったかもしれません。 紹介する教材選びももっと慎重にすべきでした

スライド・テンプレート・メンタリング

先述したとおり、今回のハッカソンでは僕のノウハウを伝えるべくスライドを作成したのですが、なかなか時間が取れなかったために、メンタリング段階で質問されるまで後回しにしたものも有りました。 当然ですがスライド作成は早めにやりましょう。

スライドを作る際に意識したことは

  • 難しそうという意識を取り除く
  • 皆が使いそうなものは具体的に教えてしまう(ツイートする方法など)
  • 調べ方を教える

です。伝わったかは分かりませんが。 特に3つ目の「調べ方」についてはハッカソンにかぎらず開発の仕方を教えるのであれば必須ですね。すべてを教えることはできません。

ちなみに「難しそうという意識を取り除く」ために、今回僕は「twitter botとはinput/outputのいずれかもしくは両方がtwitterであるプログラムにすぎない」という名言を生み出しました。どうぞ使ってください。

twitter botの場合は特に顕著ですが、認証部分・定期的実行などは誰でもほぼ一致するので、githubでテンプレートとなるものを公開してみんなにpullして貰う形で進めました。 自分でもこれは良い選択だったと思っています。

実際に開発が始まるとやはり同じような質問が頻繁に出てくるので、FAQをタイムリーに更新して共有したほうが良かったかもしれません。

発表

みんな時間がなさそうなので口頭での発表で済ませましたが、後々のことを考えるとその場で終わってしまうのではなく、webとかで公開できるようにスライドを必須にすべきだったかもしれません。 参加者は全員僕が想像していたよりもすごいものを作ってきたので、ただ「楽しかった」で終わるのではなく、その後に繋がるような処置をしておくべきでした。

終了後

Google先生曰く、ハッカソン後の飲み会は必須とのことです。お互いを讃え合いましょう。ちなみに僕は疲れでめっちゃ酔いました。

終了後も質問は受け付けていました。どうやらその後もbot作成を続けてくれている人も多いらしく、嬉しい限りです。

ただ、開催者側に対するフィードバックを得るのを忘れていたので、開催後すぐにでも事後アンケートを行うべきだったと反省しています。 普段授業後のアンケートとか答えるの面倒くさいと思っていましたが、開催側へのフィードバックも大切なんですね。

まとめ

  • 参加者のレベルに合わせた準備を行う
  • 開催する以上は責任をもって教える
  • 双方のフィードバックを大切にする
  • 開催するのは楽しい

参加してくれた人達と手伝ってくれた方々、ありがとうございました(o_ _)o

自分と同じようなエントリをはてブしている人を探すwebサービスを作りました

お詫び(2015.6.29 12:38追記)

はてなアカウントでのログインの際にwrite権限を要求していましたが、ご指摘の通りこの仕組では全く必要ないものなので削除しました。申し訳ありませんでした。
また、自分が表示されてしまう不具合があるようなのですが、原因が分かり次第修正いたします。

動機

はてブでブクマしたりコメントしてると、「この人自分がブクマする時よく見るな……」っていう人いますよね?
それはダジャレの人とかカッコいいメガネの人のように目立つ人だけじゃなく、有名ブックマカーではなくても似たような嗜好の人はいるわけです。
ところで、はてブにはよく使われているとはあまり言えない「お気に入り」機能があるわけで、逆にそういった人達をお気に入りに登録していけば「人気エントリ」や「新着エントリ」よりも更に自分向けの情報が流れてくるのではないか?という思いから、このwebアプリを作ってみました。
名づけて"Hateneighbor"です。
Hateneighbor
はてな村のご近所さん」と言う意味で名づけました。

ある程度作り終わるまではてブ公式に「おすすめユーザー」機能があることを知らなかったのは秘密……
一応差別化のために何が共通か表示するようにしたので許していただきたい……

何をするか

はてブアカウントでログインすると、自分のブックマーク最新20件を取得し、それらをブックマークしている人、及びそれらの関連エントリをブックマークしている人を探します。
フォローボタンも付いているので、簡単にフォローも出来ます。
また、共通ブックマークも一覧して見ることが出来ます。

技術的なもろもろ

いつも通り、ruby+sinatraをherokuで動かしています。
デザインとかもいつも通りbootstrap頼りですが、今までよりはそれなりに綺麗に出来たのではないかと思っています。(まだ思い通りに動いていないところは多いですが……特にmobile……)

途中、heroku上だと処理に時間がかかりすぎて勝手にtimeoutされる事に気づいて発狂したのですが、gem parallelを使うことで解決することが出来ました。これまでrubyで並列処理したことはなかったのですが、簡単な上に超便利なので一人感動してました。

はてなapiとかについては、今回もはてブAPIでwebサービスを作りたい全ての人に向けて書きましたを参考にさせていただきました。
今回もJSONとかRSSを取得してrubyでハッシュとして処理することが多かったので、@HatenastarRankを作った時の記事と似たようなことをしています。swimath2.hatenablog.com

個人的な開発記録

実は先日はてなインターンに応募させていただいたのですが、今まではてなapiを使って作ったものが@しかなかったので、せっかくだしwebサービスでも使ってみようと思ったことも動機の一つです。

作っている途中にお気に入り機能があることに気付き絶望したので一週間ほど間が開いたのですが、実際に組んでいたのは2,3日程度だと思います。

  1. 1日目にログイン→類似ユーザーのリストアップ、簡単なwebアプリ化
  2. 2日目にデザインをまともにして情報を増やす
  3. 3日目に細かい修正

って感じで進めました。

ノートにおおまかなデザインを描いてそれに従って作っていく、というごく一般的な手法を初めてとったのですが、当然のように開発がめっちゃ楽になりました。
正直汚すぎて載せたくないですが、参考のために載せときます。
f:id:SWIMATH2:20150628150654j:plain
こんだけ適当でも捗るよ、って感じで見てください。

先日作ったtop - 偶然俳句ツイートwebもherokuで動かしているためか謎バグが発生するので、そろそろvpsawsに手を出さないといけないなと感じています。

本題とはあまり関係ないですが、最近bashzshに変えてaliasとかバンバン使うようにしたらかなり快適にgitとか使えるようになった気がします。
こういった小さな面倒を楽にする方法を追求することもエンジニアになるなら必要なのではないかと感じました。

大学の課題の合間を縫ってどうにか完成させたのですが、まだまだ満足のいかないところは多いので、今後も機能を追加していこうと思います。
ご不満、ご要望がある場合は、このブログのコメントでもはてブのコメントでも、喜んで拝見するので書いていただけると幸いです。

アイコン

f:id:SWIMATH2:20150628152954p:plain
HとNで家っぽくするつもりでしたが、時間無かったので適当になりました。デザインのお勉強もそのうちしてみたい気もします。

主に参考にさせていただいたサイト

syncer.jp
Consumer key を取得して OAuth 開発をはじめよう - Hatena Developer Center
morizyun.github.io

Sinatraを使ってtwitter連携のwebアプリを作ってみた記録

ちょっと前に書いた記事を公開し忘れていたので公開します。

-----------------------------------
こんにちは。もうすぐクリスマスですね。

先月くらいにSinatraを勉強してみて、先週ようやくWebアプリらしいものを作れたので、これから勉強しようと思ってる人の参考になればと思いここまでの記録をしておこうと思います。

1.Sinatraを始めたきっかけ
もともとWebサービスには興味があって、Ruby on Railsを今までも何度か勉強していたんですが、「何度か」という言葉からわかるように始める度に挫折をしていました。当時はなぜ挫折していたのかも自分でわかっていなかったのですが、今考えると

  1. そもそもhtmlを使ってページを作ったことがあまり無い
  2. 自動化されすぎていて何をやっているのかわからない
  3. └→どうしてRailsが便利なのかわからない
  4. 作りたいもの・作れるもののイメージが湧かない

というのが原因だったのだと思います。html手打ち→phpRoRという時代の流れを見てきた方々にとってはRoRの便利さも分かりやすいのでしょうが、僕のような物心ついた頃にはSNSが流行していたゆとり世代にはいまいちぴんとこないものです。

そこで、まずRailsほど「便利」ではないけど「シンプル」なSinatraを使って、まずはなにか作ってみることを目標にしました。

2.勉強の道程
最初にしたことはやっぱりドットインストールのsinatra入門です。
Sinatra入門 (全17回) - プログラミングならドットインストール
ドットインストールのSinatra入門の素晴らしいところは、これが終われば掲示板を作れるところで、それさえ理解すればちょっと応用することでかなり多くのことに応用できることですね。この場合はSinatra,erb,ActiveRecord,jQueryの使い方を知ることが出来ました。
ちなみに今までドットインストールを試聴するときは純粋に「視聴」していたんですが、動画に合わせてソースコードを写経することでかなり理解も捗ったような気がします。

もともとTwitterbotを作っていた際にHeroku上でTwitterのツイートをDBに保存する術を何となく身に付けていたので、とりあえずDBとの連携の仕方がわかっただけで簡単なwebサービス(?)を作ることが出来ました。https://ynewsretrans-viewer.herokuapp.com/ です。
昔作ったyahoo newsの再翻訳botをまとめて見たり、タグ付け・ふぁぼしたりするサービスです。練習として作ったので大して凝ってませんが、とりあえず一つ作ってみることで何となくSinatraと言うものに対する距離感は縮まったんじゃないかと思います。
ちなみに、これを作るためにjQueryやBootstrapも少し勉強しました。と言っても、この二つは簡単なのでドットインストールとか日本語版のリファレンスを読めば基本的なことはすぐに使えるようになれました。

そして、最近作れたのがTwitter連投チャレンジです。友人や先輩には「邪魔だ」「不快だ」「害悪だ」などとだいぶ不評ですが、これくらいしかモチベーションを維持して作れるものがなかったのでお許し下さい(o_ _)o
OAuthを使ったログインとかの新しい知識は必要でしたが、基本的にRubyでプログラミングしているのと近い感覚なので、結局2,3日でおおまかな部分を完成させることが出来ました。
デザイン面とか超適当ですが、Sinatraとbootstrapとjqueryを使えば簡単なwebアプリならこんな気楽に作れるのかと感動です。

3.感想
今までは自分が楽しむもの・botくらいしか作れなかった自分が、webページを作れるようになっただけで世界がかなり広がったような気がします。Railsに挫折した僕のような人にはSinatraをオススメしたいところです。とはいえ、昨日の学科忘年会で「Railsはもう古い」みたいな噂を聞いて不安に震えています。
また、先ほど「こんな気楽に作れるのか」と言ったばかりですが、実際は悩みどころも多いです。というのも、色々な人に実際に使ってみたところ結構バグが多くて、テストの必要性をひしひしと感じています。やはり今後はrspecとかを使えるようにならなきゃいけないし、その後にRailsをやっと使えるようになるんだろうなって感じます。Railsへの道は長い……

勉強する上で特に参考になったページを羅列させていただきます。
Sinatra入門 (全17回) - プログラミングならドットインストール
簡単Sinatra!WebAPI・OAuth認証を使ってみよう - 角幸一郎 | type IT Academy

リプするとマルコフ連鎖で一句読む機能を@.haiku_searcherに追加しました

お待たせしました。新機能搭載です。

機能としては、@に「詠んで」を含むリプをすると、その人の過去200ツイートを取得し「一次マルコフ連鎖」を用いて俳句/川柳を作るというものです。ちょっとした人工知能(無能?)的なものだと思ってください。

また、「詠んで」に加えて「ちゃんと」も含むリプをすると「二次マルコフ連鎖」を用いるのでそれなりに文章として成立した俳句が出来るはずです。しかし、生成に時間がかかる、結局普通の俳句探索になりがち、あんまり面白くないという理由から、オススメしません。
こんな感じで、普通の俳句が見つけられやすいです。

もちろん、俳句のルールや季語認定の方法などは通常の偶然俳句ツイートbotのものを流用しています。詳しくはこちら↓
swimath2.hatenablog.com

マルコフ連鎖」と言ってもわからない人も多いかと思いますので、ちょっと解説してみようと思います。ちなみにマルコフ連鎖はしゅうまい君(@)や圧縮新聞(@)などでも使われているそうですね。
専門的に習ったわけでは全くなく、ただネット上の情報から知っただけの生半可な知識なので、間違いがあれば指摘していただけると幸いです。

マルコフ連鎖」とは

まず、「マルコフ連鎖」のwikipediaを見てみると

マルコフ連鎖とは、確率過程の一種であるマルコフ過程のうち、とりうる状態が離散的(有限または可算)なもの(離散状態マルコフ過程)をいう。
...
各時刻において起こる状態変化(遷移または推移)に関して、マルコフ連鎖は遷移確率が過去の状態によらず、現在の状態のみによる系列である。

とあります。要するに「過去どんな変化をしてきたかを気にせず、次どうなるかが今どうなっているかだけで決まる流れ」ということですかね。

まだまだわかりづらいと思うので、実際の日本語を例に解説してみます。
我輩は猫である。吾輩の名前は猫だ。猫だ。」
という文章を考えてみましょう。(文章として正しいか微妙ですが、マルコフ連鎖では文章の意味までは立ち入らないのであまり気にしないでください。)
この文章を形態素解析(品詞分解)してみると「我輩/は/猫/で/ある/。/吾輩/の/名前/は/猫/だ/。/猫/だ/。/」というふうに分解できます。

例えば「吾輩」という言葉の後に来るのは「は」か「の」。「で」のあとに来るのは「ある」だけ。というように調べていきまとめると、次のようになります。(矢印の先が後に来うる品詞)

f:id:SWIMATH2:20150320061854p:plain

この図に、各品詞の出現回数(「我輩」なら2、「猫」なら3)と、それぞれの品詞から次の品詞になる確率(「猫」が3回出たうち次の品詞が「で」となるのは1回、「だ」となるのは2回なので、それぞれの確率は1/3,2/3となります。(赤字))を書き込んだ図が下図となります。

f:id:SWIMATH2:20150320081304p:plain

これがマルコフ連鎖での「状態遷移図」というものであり、この図に従ってある状態から次にどうなるかを確率的に選ぶことが出来るわけです。

この説明じゃまだわからない人も多いかと思いますが、さらにグラフィカルにわかりやすくしたものがあったので紹介させていただきます。
Wokashi: 形態素解析からのマルコフ連鎖を可視化してみた


ちなみに、二次マルコフ連鎖とは一つ前の単語だけでなく、2つ前の単語まで含めた分類をします。
例えば一時マルコフ連鎖では「猫」のあとは「で」が1/3、「だ」が2/3でしたが、二次マルコフ連鎖では「は/猫」のあと「で」が1/2、「だ」が1/2、「。/猫」のあとは必ず「だ」のように、更に細かい分類をします。

細かい分類・分析をするため、一次マルコフ連鎖に比べより日常の言葉が生成されやすいのですが、分岐する方法が少ないということは生成される文章のパターンが少ないということなので、俳句となるものが見つかりづらいという欠点があります。

haiku_searcherの動き

botでは、この図に従って色々な動き方を試し、俳句となるものを見つけます。「スタート地点」を特に決めていないので、色々な品詞から調べ始めます。こんな感じで↓

f:id:SWIMATH2:20150320081346j:plain

ついでに言っておくと、ここでは俳句を探すのに「深さ優先探索」というものを行っています。今回はマルコフ連鎖がメインなので説明は省きますが、アルゴリズムとかに興味ある人は調べてみてください。
ちなみに僕はアルゴリズムとか全く得意じゃないので効率のいい手段が思いつきません。なんか良いのがあったら教えてください。(実装するとは言ってない)

おわりに

せっかく新機能をつけておいてアレなんですが、最近botのツイートが増えすぎてかなり頻繁に規制されているようなので、返信が来ない時は暫く時間を置いてからもう一回リプすると反応してくれるかもしれません。すみません。

っていうか、このbotrubyで書いてherokuで動かしているんですが、同じIPアドレスの二つのappに対してツイート規制が共有されるらしく、どうにか出来ないもんかって悩んでおります。(Twitter::Error::Forbidden: User is over daily status update limit. がめっちゃ出まくります。)何か解決策をご存じの方がいれば教えてくださいお願いします。

それから、緑の卵アイコンという何となく和風なものがたまたま出たのでそのまま使っていますが、せっかくだしアイコンも変えたいのでアイコン募集してます。自分で作るかもですが。フラットデザイン()。

今回の新機能追加にあたってはマルコフ連鎖について解説されている多くのページを参考にしましたが、ソースなどを特に参考にさせていただいたページを挙げておきます。
ググればもっと詳しい情報もでると思うので、興味を持った方はぜひ。
マルコフ連鎖でTwitter BOTを作る - FLYING
マルコフ連鎖で日本語をもっともらしく要約する - ザリガニが見ていた...。
マルコフ連鎖 - Wikipedia