ほつた@はてな

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

携帯の契約ならおとくケータイ.netよりもケータイ乗り換え.comがいいかもしれない

携帯の契約

ソフトバンクの携帯を契約しようと考えていた矢先、おとくケータイ.netとケータイ乗り換え.comに問い合わせてみました。

ケータイ乗り換え.comの方がかなりいい条件を出してきました(詳細は後日追記します)。

まずは問い合わせよう!

ケータイ乗り換え.com

おとくケータイ.netと比べてやや遅かったのですが、問い合わせてから、3時間ほどで連絡がありました。 (おとくケータイ.netは1時間位で連絡がありました。)

ケータイ乗り換え.com

申し込み

明日ケータイ乗り換え.comを使って契約してこようと思います。

ケータイ乗り換え.com

【ヤフオク出品自動化】Hack U 2016 名古屋会場で発表してきました #hacku【Double-Au】

Hack U 2016 名古屋会場に参加し、ヤフオクの出品を自動化する自動楽売Double-Au(ダブルオウ)をなんとか実質1人で開発して発表してきました。

先に言っておくと、開発期間中は寝ながら頭の中で開発しないと不安だったりと滅茶苦茶大変でしたが、終わってみるとHack Uは本当に楽しかったと思っています。

  • ヤフオクの出品を自動化するDouble-Au(ダブルオウ)について
  • Hack U 2016にエントリーするまで
  • テーマ自動○○でエントリー開始速攻ポチるものの開発は実質1人
  • 開発期間前半
  • 開発期間中旬
  • 開発期間下旬
  • 前日から当日発表直前まで
  • 発表
  • まとめ
  • 最後に
続きを読む

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

なんと先日の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:

gem install pgでbrew install postgresqlしてARCHFLAGS="-arch x86_64"指定しても全く解決せず数時間も悪戦苦闘した

HerokuでデプロイするとなるとSQLiteが使えず、PostgreSQLを使わなければならなくなる。 Cloud9ではなく、そろそろRubymineで本格的に開発しようとしていてbundle installをしたところ、pgで数時間もハマったのである。

結論

sudoでARCHFLAGを指定してさらに場所を指定すると成功する。

sudo ARCHFLAGS="-arch x86_64" gem install pg -- --with-pg-config=/usr/local/Cellar/postgresql/9.5.3/bin/pg_config

bundle installでコケる

Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

    /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby extconf.rb --with-pg-config=/usr/local/Cellar/postgresql/9.5.3/bin/pg_configARCHFLAGS=-arch x86_64 bundle installz
Using config values from /usr/local/Cellar/postgresql/9.5.3/bin/pg_configARCHFLAGS=-arch
sh: /usr/local/Cellar/postgresql/9.5.3/bin/pg_configARCHFLAGS=-arch: No such file or directory
sh: /usr/local/Cellar/postgresql/9.5.3/bin/pg_configARCHFLAGS=-arch: No such file or directory
checking for libpq-fe.h... no
Can't find the 'libpq-fe.h header
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby
        --with-pg
        --without-pg
        --enable-windows-cross
        --disable-windows-cross
        --with-pg-config
        --with-pg-dir
        --without-pg-dir
        --with-pg-include
        --without-pg-include=${pg-dir}/include
        --with-pg-lib
        --without-pg-lib=${pg-dir}/


Gem files will remain installed in /var/folders/vf/tbdkk_nx5wq0889j7_pdc_pw0000gn/T/bundler20160818-22367-jz3gq8pg-0.18.4/gems/pg-0.18.4 for inspection.
Results logged to /var/folders/vf/tbdkk_nx5wq0889j7_pdc_pw0000gn/T/bundler20160818-22367-jz3gq8pg-0.18.4/gems/pg-0.18.4/ext/gem_make.out

sudo gem install pg -- --with-pg-config=/usr/local/Cellar/postgresql/9.5.3/bin/pg_configでもコケる

sudo gem install pg -- --with-pg-config=/usr/local/Cellar/postgresql/9.5.3/bin/pg_config
Password:
Building native extensions with: '--with-pg-config=/usr/local/Cellar/postgresql/9.5.3/bin/pg_config'
This could take a while...
ERROR:  Error installing pg:
        ERROR: Failed to build gem native extension.

    /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby extconf.rb --with-pg-config=/usr/local/Cellar/postgresql/9.5.3/bin/pg_config
Using config values from /usr/local/Cellar/postgresql/9.5.3/bin/pg_config
checking for libpq-fe.h... yes
checking for libpq/libpq-fs.h... yes
checking for pg_config_manual.h... yes
checking for PQconnectdb() in -lpq... no
checking for PQconnectdb() in -llibpq... no
checking for PQconnectdb() in -lms/libpq... no
Can't find the PostgreSQL client library (libpq)
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby
        --with-pg
        --without-pg
        --enable-windows-cross
        --disable-windows-cross
        --with-pg-config
        --with-pg-dir
        --without-pg-dir
        --with-pg-include
        --without-pg-include=${pg-dir}/include
        --with-pg-lib
        --without-pg-lib=${pg-dir}/
        --with-pqlib
        --without-pqlib
        --with-libpqlib
        --without-libpqlib
        --with-ms/libpqlib
        --without-ms/libpqlib


Gem files will remain installed in /Library/Ruby/Gems/2.0.0/gems/pg-0.18.4 for inspection.
Results logged to /Library/Ruby/Gems/2.0.0/gems/pg-0.18.4/ext/gem_make.out

sudo ARCHFLAGS="-arch x86_64" gem install pgでもコケる

sudo env ARCHFLAGS="-arch x86_64" gem install pg 
Building native extensions.  This could take a while...
ERROR:  Error installing pg:
        ERROR: Failed to build gem native extension.

    /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby extconf.rb
checking for pg_config... no
No pg_config... trying anyway. If building fails, please try again with
 --with-pg-config=/path/to/pg_config
checking for libpq-fe.h... no
Can't find the 'libpq-fe.h header
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby
        --with-pg
        --without-pg
        --enable-windows-cross
        --disable-windows-cross
        --with-pg-config
        --without-pg-config
        --with-pg_config
        --without-pg_config
        --with-pg-dir
        --without-pg-dir
        --with-pg-include
        --without-pg-include=${pg-dir}/include
        --with-pg-lib
        --without-pg-lib=${pg-dir}/


Gem files will remain installed in /Library/Ruby/Gems/2.0.0/gems/pg-0.18.4 for inspection.
Results logged to /Library/Ruby/Gems/2.0.0/gems/pg-0.18.4/ext/gem_make.out

分けわからないので両方やってみたところ成功

結論を参照

参考

qiita.com

まとめ

Railsは環境構築のだるさが物凄い