seizemu's diary

ぶろぐ

UQmobileすごいはこれ!

こんにちは。

 

いきなりですが・・・

UQmobileすごい!今までの格安SIMのイメージが払拭された!!

 

try UQmobileにトライしたんですが、ほんともう何これちょうど良い速度!

昼間でも10Mbpsくらい出るし、ウチみたいな僻地でもつながる!そうつながる!

さすがauのサブブランド!

 

今はdocomo回線とIIJ回線の二回線使ってるんですが、IIJ回線が昼間に1Mbpsくらいしか出ないんで雲泥の差ですよこれは。

 

具体的にdocomo回線からUQ mobileへの乗り換え考えてみます!

もういい、わかった。やる気でないからその時やりたいことだけやる。

 まえの投稿からすこし勉強とかして、そのあと全然プログラミングしていないんですが、もういいです。

 

 プログラミングの勉強して仕事にしたいとも思ってたけどもういいです。

 

 プログラミング言語の需要とか色々考えてこれ勉強しないととか考えてましたけど(素人なりに)、もういいです。

 

 そんなこと考えてたら楽しくなくなっちゃいました。

 

 プログラミングは完全に趣味の方向にシフトしていこうと思います。

 

 飽きたらやめ、興味がわいたら触る。

 

 そんな感じで行こうと思います。

 

 昨年、実家に帰ってきてから僕にも色々趣味と呼べるものが出てきました。

 

 そこで、このブログでは僕の趣味で学んだことや面白いと思ったことなど書いていこうと思います。

 

 もうフリーダムな感じで!!!!

 

 ということで、よろしくお願いします(^_^;)

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

 

プログラムの処理内容

 プログラムの処理はだいたい以下のようになっています。

  1. wikipediaのアクセス数に関するファイルが置かれているwebベージから、ファイルをダウンロード
  2. ダウンロードしたファイルの形式がgzipなのでgzファイルを解凍
  3. 解凍したファイルからデータを読み込む
  4. 読み込んだデータをアクセス数で降順にソートしてデータベースに格納
  5. データベースからSQLで各項目ごとのアクセス数を集計
  6. 集計されたデータを降順にソート
  7. ソートされたデータを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

 

アドバイスとか、こっちの方がいいよとかあったら、ツッコんでいただけるとありがたいです。

 

指定したurlのバイナリファイルを保存するRubyスクリプト

 はい、こんにちは。

 バイナリファイルを自動的にダウンロードしたいと思い、ヤッつけで書いてみました。

 ちなみに、自動化はまだ出来ていません。なのでほんとにダウンロードするだけです。

 ソース中にURLをコピペで指定するようになってます。

 

 実際にダウンロードできるか確かめるために画像を使ったのでスクリプトのファイル名がimage_download.rbになってますが他の形式のファイルでも使えると思います。

書いてみて勉強になったことや驚いたこと

  • open-uri便利すぎる!
  • splitメソッド便利すぎる!
  • こんな書き方でもいけるの?!?!

 open-uriというライブラリを読み込むことでURLでファイルを指定することができます。便利ですねー。

 最初URLからファイル名を抜き出すためにrindexメソッドで最後の"/"の位置を割り出して、その位置からファイル名だけをとり出そうと思ってたんですがsplitメソッドのおかげで一発!!便利ですねー

 それで一番驚いたのがコードの6行目でsplitメソッドで分割した文字列をその場で指定して変数に代入できたこと!こんな書き方もできるんですねー。もしやと思ったら出来ました。ほほーーーーー

 

力不足

 このスクリプトには同じファイルがあった場合にどうするかとか例外が出た時にどうするかとか書いてないです。なので書き足さなければ。

 あとググったらこんな記事がRuby - ファイルをWebからダウンロードして保存する - Qiita

 めっちゃ短い。そして綺麗。えっ、basenameメソッド!?!?。ブロック使ってる。ははーーー

 ってことで参考にするならリンク先の方がいいとおもいます。

 まあ、勉強になったからよしとしよう!!!

wikipediaのアクセスランキングを取得するRubyスクリプト

 酒と泪とRubyとRailsとで紹介されていたRuby 概論のスライドが素晴らしかったのでまとめてみた(第1部) を見ながらRubyの学習を進めています。

 このスライドの第7回で紹介されている、wikipediaアクセス解析スクリプトを書いてみました。

 スライドで紹介されているまんまでは面白くないのでちょっと変えています。(ほんとにちょっとなので期待はしないでください)

 

gist9256398

紹介されているスクリプトからの変更点

  •  whileでファイルの読み出しをしているところをeach_lineに変更
  •  unlessとnextを使わずにifを使った

 こんなところですね。

 このスライドではバージョン1.9.3のRubyを使ってて、教科書として楽しいRubyの第3版を使っていました。そのため、参考としているサンプルプログラムが楽しいRubyの第4版とは違うみたい。そこで第4版に載ってるサンプルプログラムを参考にwhileをeach_lineに変更してファイルから1行ずつ読みだすようにしました。

 それから、unlessとnext使わなくてもifでいけんじゃねってことで使ってません。

 もしかしたら、今回使わなかった方法の方が何かメリットがあるのかもしれませんが・・・意味があるのなら知りたいんですが、僕の知識ではわからないです、はい。

 これおかしいよとか、ココはこの方がいいんだよ馬鹿野郎!!とかあったら教えていただけるとありがたいです。

 

 

たのしいRuby 第4版
 

 

CSSフレームワーク"Pure"の記述がイライラしたからRubyの勉強も兼ねてスクリプト書いた!!

 先週の中頃、Rubyの学習を進めている時に、こんなサービスあったらいいなと思いつきました。

 そんでwebサービスモックアップを作ろうってことでHTMLを書き始めた僕です。こんにちわ。

 

 できるだけかっこいいのがいいと思ったんですが、デザインの知識とか皆無なんで(まあ、デザインだけじゃないけど・・・)前から気になっていたyahooのCSSフレームワーク"Pure”を使うことにしました。

 

 最初、webのリンクをHTMLに貼って使おうと思ってたんですが、自分でちょっといじりたいなと思い、ダウンロードしてみたら肝心の記述部が読みにくい!!→ソース

 

 自分でいじるにしてもこれはちょっと・・・・

 

 手でちまちま頑張っても面白くないなと思って、改行して読みやすくするだけのスクリプトを書きました。

 

 内容としてはただ単に正規表現使って、改行とかタブ入れたいとこを指定して文字列を置換するだけ・・・

 

 祝!

 初正規表現

 初gist!

 

 これ書くまでに必要無い配列を定義して代入してみたり、ファイルへの書き込みがうまく行かなかったり(File.writeを変なとこに入れてて消し忘れてた・・・)なかなか苦労しました。

 

 多くの人には小さな一歩に見えるだろうが、初心者の僕には大きな一歩だ!!なんて。

 

 ココこうしたほうがいいんじゃないとかあったら教えていただけるとさいわいです。

 

 

 しかしこれ今の知識だったら手入力で編集したほうが早かったな・・・・

 それから、もともとのCSSの記述方法になんか意味があったんかな?

sublime text 2でvimみたいにhjklで移動できるようにする。

 テキストエディタsublime text 2を使ってるんですが、カーソル移動するときにカーソルキーまで手を伸ばすのが億劫なんです。

 体がでかいもんであんまり動きたくないんですよね。

 ってことで、sublime text 2でvimみたいにhjklで移動できるようにしました。

 参考にしたのはこの記事 Sublime Text を Vim 化 | blog.makitasako.com

 ありがとうございました。

 

 ちなみに僕がsublime text 2を使っている理由はなんかかっこいいからです。Rubyの勉強ができるようにUbuntu13.10にもろもろをインストール - seizemu's diary

 

 ショートカットキーとか全然覚えてない・・・・

 gedit使っとけ!って感じですね。

 まあ、使っていくうちに覚えるさ!!