Rubyでwikipediaのアクセスランキングを毎日吐き出すTwitterBotを作ろうとして学んだこと
はい、こんにちは。
wikipediaのアクセスランキングを毎日吐き出すTwitterBotを作ろうとしていた僕です。
前にRubyを、酒と泪とRubyとRailsとというwebサイトのRuby 概論のスライドが素晴らしかったのでまとめてみた(第1部)という記事の中で紹介されていたスライドを使って勉強していました。
スライド中で演習にwikipediaのアクセスランキングを取得するスクリプトが紹介されており、これをもとに自分なりに書いてみたんです。wikipediaのアクセスランキングを取得するRubyスクリプト
その後で、このスクリプト使ってTwitterボット作ったら色々勉強になるだろうと思い、TwitterBotの作成にとりかかりました。
そんでシコシコと技術情報を調べながらコードを書いていたんですが・・・すでにwebサイトがありました!!
Wikipedia人気記事ランキング(Hourly - 最新) | visualizing.info
webサービス開発にRubyを使う上で、練習に最適だと選んだ題材だったんですが、すでにwebサイトがあるというのを知ってからモチベーションだだ下がり。
もうあとはcrondとかで毎日スクリプトを実行して、その結果をTwitterでつぶやかせるだけだし(本当はまだ色々課題はあるけどめんどくさい)、勉強で作るんだからいいやってことでBotづくりは中止にしました。
Botづくりは中止しましたが、途中まで出来たプログラムを動くようにしてGithubに公開しました。
どやーーー
そして、勉強したことをブログにメモとして残しておきます。一つの区切りですね。
誰が見るかもよくわかんないですが、なんとなく。公開することでなにかあるかもしれないという安易な期待をこめて。悪い方になにかあるのは勘弁。
公開しているプログラムの処理内容は、「昨日のwikipediaのアクセス数をsqlite3にぶち込んでアクセス数のランキングをyaml形式で保存する」です!
seizemu/wikipedia_access_number_aggregate · GitHub
プログラムの処理内容
プログラムの処理はだいたい以下のようになっています。
- wikipediaのアクセス数に関するファイルが置かれているwebベージから、ファイルをダウンロード
- ダウンロードしたファイルの形式がgzipなのでgzファイルを解凍
- 解凍したファイルからデータを読み込む
- 読み込んだデータをアクセス数で降順にソートしてデータベースに格納
- データベースからSQLで各項目ごとのアクセス数を集計
- 集計されたデータを降順にソート
- ソートされたデータをYAML形式で出力
学んだこと
web上のファイルをRubyでダウンロードする方法
web上にあるファイルのダウンロードにはopen-uriライブラリを使いました。めっちゃ楽ちんですねー。詳しくは→指定したurlのバイナリファイルを保存するRubyスクリプト
Rubyでシェルコマンドを実行する方法
gz形式のファイルを展開するためにgzipコマンドのスクリプト内での実行方法を調べました。
`gzip -d filename`
で実行してくれます。
Rubyでシェルコマンドを実行するためには「`」でコマンドを囲うだけで実行してくれます。他にも方法はあるようですが、書き方が完結なんで気に入ってこの方法を選びました。でも、「’」と見間違えることがあったので他の方法の方がいいのかも。僕の目が腐ってるだけかもしれませんけど。
参考:Rubyで外部コマンドを実行して結果を受け取る方法あれこれ - Qiita
sqlite3の使い方と初歩的なSQL、そしてsqlite3をRubyで使う方法
データを格納するデータベースにはsqlite3を使いました。最初、配列とハッシュでデータを整理しようと思ってたんですが、頭がこんがらがるやら整理できないやらで頭を抱えていました。 そこでデータベースでデータを集計しました。SQLとsqlite3のコマンドで一発!!
データベースの接続と操作はActiveRecordを使ったんですが、ActiveRecordでデータベースを新規作成する方法がわからず、sqlite3のgemをrequireしてデータベースを作ってます。もっと技術の仕組みを理解しないとダメですね。
参考:ActiveRecord入門 (全14回) - プログラミングならドットインストール
データ形式の種類
作ったプログラムでは設定ファイルと出力ファイルをYAML形式で記述するようにしました。
このプログラムを作るまでデータ形式についてあまり良く知らなかったのでとても勉強になった気がします。JSONとかXMLとかYAMLとか、それぞれに個性があるんですねーー
Rubyの組み込みライブラリの使い方
プログラムを作っていく中で配列やハッシュにデータをぶち込む方法を色々知りました。
配列にぶち込むときはpush
メソッド使うとか、ハッシュにキーと値をぶち込むときはstore
メソッド使うとか文字列置換にはsub
メソッドとかgsub
メソッド使うとか、ハッシュにどんなキーがあるかを調べるにはkeys?
メソッド使うとか。
その他にも組み込みクラスのメソッドを必要に応じて、楽しいRubyとかRubyのドキュメントとか使って勉強しました。
Nokogiriの使い方とXpathの書き方
このプログラムではwebページに記載されている情報をもとに、ダウンロードファイルのアップロードの有無を確認しているので、webページから必要な情報を読み込まないといけませんでした。そこで、Nokogiriというgemを使ってHTMLファイルの情報を抽出して使いました。HTMLから情報を抽出することをwebスクレイピングっていうらしいです。はー勉強になった。
参考:Nokogiri を使った Rubyスクレイピング [初心者向けチュートリアル] - 酒と泪とRubyとRailsと
バージョン管理システムの必要性
最初からバージョン管理用にGit入れといて良かったです。ファイルを間違って削除しちゃった時とか、書き方がうまくいかずに前のファイルに戻したい時にとてつもなく役にたちました。Gitがなかったら過去バージョンの管理が確実に破綻していたと思います。
めんどくさがりなんで。
作成から見えてきた課題
わかりにくいぐちゃぐちゃなコードにならないようにする
大抵の場合、数日たつと変数の中に何を入れてるかがわかんなくなっちゃってました(たった200行くらいのコードなんですが)
そのせいでコードを変更する時に、いちいち前に書いたコードの処理を読みなおしてました。途中からはいくつかの処理をメソッドにまとめたんですが、メソッドにまとめても変数名の競合とか初期化位置のせいでエラーが出て色々時間がかかりました。
この時間がもったいないので、もっとわかりやすく、最初からまとまりよく書きたいです。ということで、クラス設計とか仕様設計とか(前に友達に聞いたらそう言っていたのでそのままつかっちゃいます。)、ソフトウェアの開発手法や効率のいい書き方を勉強しようと思います。
web技術の知識が乏しすぎる
結構何もかも知らないことばっかりだったので、調べながら書いてたらめちゃくちゃ時間がかかりました。プログラムを書く中で色々知ることはできたんですが、もっと体系的に学ばないといけませんね。積読していた本を消化していきます。
エラー処理をすっ飛ばしているところがだいぶある
公開しているプログラムは一応動くようにしているんですが、上で書いた技術知識の乏しさのせいで、エラーが出ているところを結構すっ飛ばしてます。エラーの処理はちゃんとやらないといけませんね。まあ、プログラムにどれくらいの信用度が必要かにもよると思いますけど。
師匠不在の効率の悪さ
調べてもよくわからないという時に、相談できる人の存在ってホントにありがたいですね。webプログラミングの知識のある知り合いがいないため、めちゃくちゃ時間とやる気を削がれました。
僕はすでに大学から卒業している身で、webシステムの制作会社に所属しているわけでもないので、先生にすぐアクセスできる大学の環境が改めてありがたいものだったなと思いました。
Rubyのコミュニティーに飛び込む手もあるとは思うんですが、なにぶん技術的に未熟なので、行っていいものか。関西で初心者用のコミュニティーとか無いですかねー。わからないこと相談したいし、いろいろ話して盛り上がりたい。あるかないか調べてみよう。
まとめ
Botの公開まではしませんでしたが、色々勉強になったのでよしとします。
前にブログを書いた日付を確認してみたところ、41日も前だったのでめちゃくちゃ驚きました。月日が経つのが早いですねー
なんでこんなに時間がかかってしまったのか振り返ってみたところ、情報収集に時間をかけすぎなんだと思いました。これからはもっと手を動かすように心がけます。
Githubに公開するにあたり、汚いコードを乗っけるのは恥ずかしいと思って躊躇したんですが、なんか出さないと次の課題にとりかかる上で歯切れが悪いと思い公開することにしました。
信用の薄いコードを公開するのは、それはそれで罪かもと思ったんですが・・・信用の薄いものはそのうち勝手に淘汰されるだろうと高をくくりました・・・
それから、web上の情報を参考にして勉強しているので、自分も公開した方がいいんじゃないかと思ったのも理由の一つです。未熟者なんで全然参考にならないと思いますけど。
web上の先人の方々に感謝!!
Github repository:seizemu/wikipedia_access_number_aggregate · GitHub
アドバイスとか、こっちの方がいいよとかあったら、ツッコんでいただけるとありがたいです。