読者です 読者をやめる 読者になる 読者になる

ほつた@はてな

ほつたが技術的な事や個人的な出来事を中心に投稿します。

Ruby+Seleniumを使って動くGoogleカレンダーで図書館の貸出予約状況を管理するスクリプトLiblendrsv(リブレ)をデモ自慢してきました #LLoTnight

イベント Ruby テクノロジー 図書館

なんと先日のLLoTという大きなカンファレンスに初登壇することになり、デモをしてきました。

応募するまで

勉強会のトップランキングを見ていてところ、LLoTを見つけました。 面白そうなので参加しようと見ていたところ、帰ってきたデモ自慢というものを見つけてまだ募集をしていたのです。

ll.jus.or.jp

ちょうど下の方で紹介するLiblendrsvを作り終えて、どこかで発表しようかなと考えていた矢先です。

参考程度に、2005年に行われたデモ自慢参加者を見ると強者だらけでこんなしょぼいもの発表できるわけないだろうと思いながら、応募して見るだけしてみようと思いました。

ll.jus.or.jp

そして、さり気なくデモ自慢に応募したところデモ自慢という言葉の敷居が高かったからか応募人数が少なかったようで自分でもデモをすることが出来ました。 ただ、自分より前の方々はIoTのデモの実機(デバイス)を持ってきて発表をされていて、自分は画面内のデモなので、物凄く肩の身が狭い思いをしました。*1

登壇決定

後々分かったのですが、募集要項の敷居が高すぎたからか応募者が3人しかいなかったようです。*2 LLoTとなんか似てるIoTLTあたりで告知すればデモをしたい、発表をしたいという人がたくさん居たはずなのですが...。

ということでなんと登壇することになりました。

図書館の貸出予約状況が見づらくつい延滞してしまっていた自分がこのままではダメだとRubyで管理するスクリプトを作った結果、Googleカレンダーで返却日や予約取り置き日を手軽に見ることが出来るようになり、見事に延滞しなくなった。また、いつまでに読まなければならないと読書が捗るようになった。ソースコードがかなり酷い(レガシーだ)と思っている。Seleniumを使って動くため、おそらくデモを見てて物凄く面白いと思う。

PROGRAM – LLoT

発表準備

pitというライブラリを使って*3パスワードを書かなくてもいいように修正したりと前日までスクリプトの修正をしていました。

そして、当日の朝に気づいたのですが、前日Macの充電をし忘れて残り数%の状況に気付いたのです。 新宿へ行くまでの間に度々充電することになり、夜の部の直前は、近くのケンタッキーで充電をしつつ発表準備を整えていました。 直前の準備段階でgitディレクトリが消滅していて正常に動作しないため対処をしていたところ、あっという間に時間が過ぎてしまいデモの接続テストに間に合わず、色々準備不足のまま発表を迎えてしまいました。

発表

speakerdeck.com

スクリプトSeleniumを動かすところまでデモをしたものの、その先gitでGithub上にプッシュしてRAW表示させてGoogleカレンダーに表示するまでの肝心なところを頭が真っ白になってしまったからかすっかり忘れてしまいました。 終わった後に気づき、個人的にはデモに失敗してしまったかなと思っています。

デモの恐ろしさ

自分より前の方々は接続不調やデバイストラブルに見舞われて思うように発表が出来なかったり、デモに失敗をされていました。 それを見て、自分も失敗をし、本当にデモというものは恐ろしいものだと痛感しました。

LTは最悪スライドが無くてもアドリブで話せば何とかなりますが、デモは動くものを全て見せなければなりません。 準備を怠れば多分動くと思っていても発表本番では動かないのです。 今回の発表を経て、デモという恐ろしさを自分は初めて身に沁みて知りました。

デモのために改良するだけではなく、事前に何回か動かし、準備をする重要さを思い知りました。

次の機会に向けて

今回はデモという機会を頂けたことに心から感謝しています。

自分はまだ学生なので、今後もこのような発表をする機会があり、デモから逃げることは出来ないと思います。 LTでもそうですが、事前に発表準備を念入りにするのが一番です。

気合を入れて発表原稿を一から丁寧に用意、準備しすぎるのは個人的にあまり良くないと思いますが、メモ程度に何をやるべきなのか箇条書きにして数回事前にデモをやってみる事が重要だと思いました。

Liblendrsv(リブレ)について

f:id:hotu_ta:20160829234737p:plain

Liblendrsv(リブレ)は、全く本の期限を把握しないまま本を読んで延滞してしまう事が度々あって、各図書館のとても見づらいログインページを見て期限を何回も確認するのは面倒だと思い、一週間ほどで軽く作った図書館の期限を管理するスクリプトです。

github.com

Liblendrsvの技術的なこと

作る際は、Selenium Builderでログインや貸出状況予約状況まで移るところまで記録して、Rubyのコードにエクスポートをし、いくつか変更を加えました。 スクリプト本体は、SeleniumとNokogiriを巧みに使って本のタイトルや期限を取得し、icsファイルを出力しています。 特に、一番大変だったのがicalendarでicsファイルを出力するまでです。

本来E2EのテストルールであるSeleniumを使わない方がいい*4といつも言われるのですが、手軽にこういったスクリプトを作れるので本業で使わない趣味レベルでは十分使えると自分は思っています。

発表後にSeleniumからChromeDriverを呼び出して使うよりもPhantomJSを呼び出して使った方が良いというツイートがありました。

PhantomJSはメジャーで代表的なヘッドレスブラウザ*5で、定評があります。 今回のような簡単なスクリプトでしたら、PhantomJSを呼び出した方が画面表示が無い分、若干の高速化が測れて良いのですが、問題は環境構築の部分でPhantomJSを用意し、呼び出す際にWindowsMacではコードに違いが出てきたり面倒なのであえてやってません...。

物凄く簡単にPhantomJS対応出来ました。*6

そして、PhantomJSはChromeDriverと比べて滅茶苦茶早くて感動しました。*7

うまく動かないところ以外は今後PhantomJSを使っていきたいですね。*8

ところで、詳しくはスライドを見てもらえると分かるのですが、RubySeleniumを使ってicsファイルを出力し、GithubのRawを使ってGoogleカレンダーに渡すというかなり大胆な事をしています。

上の方にも少し書いたのですが、デモ自慢でRubySeleniumを使ってまではデモをしたのですが、実際にicsファイルが出力されてるかとか、GithubのRawを使ってGoogleカレンダーに渡すまでのデモをし忘れてしまったので画像を用いて紹介します。

スクリプトを実行すると、gitディレクトリにicsファイルが生成されます。

f:id:hotu_ta:20160829233145p:plain

gitコマンドを叩いて任意のリポジトリにプッシュします。

f:id:hotu_ta:20160829233331p:plain

f:id:hotu_ta:20160829233344p:plain

GithubのWeb上でiscファイルを開き、Rawをクリックします。

f:id:hotu_ta:20160829233356p:plain

Rawが表示されるので今表示されているURLをコピーします。

f:id:hotu_ta:20160829233449p:plain

他のカレンダーからURLで貼り付けて追加します。

f:id:hotu_ta:20160829233550p:plain

f:id:hotu_ta:20160829233623p:plain

表示されました。

f:id:hotu_ta:20160829233707p:plain

f:id:hotu_ta:20160829233736p:plain

このように、どこでどの本を借りて貸出期限はいつまでなのかGoogleカレンダーで管理できます。

f:id:hotu_ta:20160829233908p:plain

今後

定期的にgitを使ってGithub上にプッシュしないと使えなかったりと物凄く面倒な面もたくさんあるのでいつか楽に誰でも使えるよう暇な時に書き換えたいです。 Heroku上で毎日定期的に動くように出来そうなのでやってみようと思います。

図書館だけではなく、DVDのレンタル期限などに活用できたらいいですね」というお話を先日とあるイベントで聞いてこれはやるしかないと思いました。

いつかWebサービスとしてリリースしたいなと考えています。

またいつかこういうデモや発表する機会があれば改めてデモリベンジしたいです。

まとめ

割りと誰でも簡単にスクリプトを作ることが出来て、身の回りのポチポチ作業を自動化することが出来ます! 初心者の方は特に、C言語やらの勉強をしたり、いきなり敷居の高い事をしてプログラミングに挫折するよりも、こういったスクリプトを作ってみるのが一番楽しくていいと思います。 くれぐれも遊びすぎて日常生活に支障をきたさないように注意して下さい。

そして、Liblendrsv(リブレ)を使ってみたり改良してみたりしてみてください! IssuesやPull Requestsを待ってます。

github.com

*1:会場は少し狭かったのですが、スクリーンは今まで見た勉強会の会場の中で一番大きく、満足のいくデモが出来たかなと思っています。

*2:募集要項が堅苦しかったからなのか敷居が物凄く高そうに見えたからかなのか不明ですが、LLの認知度が物凄く低かったのが一番の要因かもしれません。

*3:hotuta.hatenablog.com

*4:遅い、ネット回線の状況によって失敗する事があり不安定などあって出来れば使わないに越したことは無いと思います。

*5:アバウトに言うと、表向きにブラウザが立ち上がらない、画面が出ないブラウザ

*6:Windowsだとexeの場所を指定して起動するとかゴニョゴニョしないといけなかったのは勘違いでした。:chromeを:phantomjsに書き換えるだけで成功しました。ただ、港区立図書館で発生するalertをどうにかしないとならなくて苦戦しました。

*7:

*8: