blog.tmp.tokyo

No Promises Await at Journey's End

RubyPicoでRuby三昧(1) Web APIをたたく

仕事ではエンジニアでありながらWordやExcelばかり使ってテクニカルな文章を年明けくらいまで書かないといけないので、自己啓発的にプログラミング。

久々にRubyを触ってみました。とは言っても家に帰るとベッドで寝てしまうので通勤時間でやります。

RubyPico

RubyPico

  • ongaeshi
  • 仕事効率化
  • 無料

こういう素晴らしいアプリがあるんですよ。「おんがえし (id:tuto0621)」さんのブログを拝見していて知りました。iPhoneXでもばっちり動きます。

ちょっと上下が足りてませんが。iPhoneだけでRubyが実行できます。PythonのPythonistaと同じアプリですが、RubyPicoは無料です。お金とっていいレベルなので通勤電車でプログラミングしたい人は入れておくべきです。

iPhoneXの画面サイズに対応してほしいなぁ〜。とさりげなく。

スクショにコードが貼ってありますが、抜粋しておくとこんな感じ。

# 駅データ.jp から山手線の路線データを取得する
# これはすぐできるのでコメント
#url = "http://www.ekidata.jp/api/l/11302.json"

# どこかわからないけど山手線データ
url = "http://express.heartrails.com/api/json?method=getStations&line=JR"

# URLの最後に日本語で「山手線」と付与するので、
# 日本語だけエンコード
m = URI.encode_www_form_component("山手線")

# 二番目の引数は適当
# 省略したら怒られた (ㆀ˘・з・˘)
json = Browser.post(url + m, json:"")

# コンソールに表示
puts json

という感じのごくごく簡単なコードです。Web APIというのが近年結構増えてきて、様々なデータをURL叩いてもらえます。この例だと山手線の路線データを取ります。

変動要素のないデータはプログラムで抱え持てばいいのですが、練習ですので路線データを取ってきてます。

「駅データ.jp」というサイトのAPIでJSONデータを取得してみたのですが、なんか形式が気に入らなくてパースできなかったので、もう一つの方にしてみました。

http://express.heartrails.com/api/json?method=getStations&line=JR山手線

というのが公開されているURLなのですが、ラストが日本語なのでエンコードします。あまり考えないタイプなので、

URI.encode_www_form_component("http://express.heartrails.com/api/json?method=getStations&line=JR山手線")

としたらなんかあちこち変換されてダメだったので、貼ったコードのように「山手線」だけを変換してくっつけてみました。

小手先の技術だけなら誰にも負けない。

あとはpostで送るだけなのですが、net/http が使えないみたいだったので Browser を使いました。コメントにも書いた通り二番目の引数がよくわからなかったので空文字に。

実行すると。

{"response":{"station":[{"postal":"1080075","x":139.738535,"next":"大崎","prev":"田町","y":35.628135,"line":"JR山手線","prefecture":"東京都","name":"品川"},{"postal":"1410032","x":139.728246,"next":"五反田","prev":"品川","y":35.61994,"line":"JR山手線","prefecture":"東京都","name":"大崎"},

というデータが返ってきました(上のは一部だけ抜粋)。これであとはJSONで扱うだけです。

#
# 山手線の路線データを取得して
# 駅名を表示するプログラム
#
class YamanoteLine

    #
    # URLを取得する
    #
    def get_url
      
        # どこかわからないけど山手線データ
        url = "http://express.heartrails.com/api/json?method=getStations&line=JR"
        # URLの最後に日本語で「山手線」と付与するので、
        # 日本語だけエンコード
        m = URI.encode_www_form_component("山手線")
        return url + m
    end

    #
    # 路線データを取得
    #
    def get_json
      
        # 二番目の引数は適当
        # 省略したら怒られた (ㆀ˘・з・˘)
        json = Browser.post(get_url(), 
                            json:"")
        return JSON.parse(json)
    end
 
    #
    # 取得したデータを編集
    #
    def edit_json
        pjson = get_json()
        response = pjson['response']
        station = response['station']
        station.each do |val|
            puts val['name']
        end
    end
end

# 起動処理
line = YamanoteLine.new
line.edit_json()

Rubyのリハビリも兼ねているので、クラスを作ってメソッドを作りました。あまり意味のあるメソッド分割ではないのですが、まあとりあえず。

JSONデータをパースしてハッシュにしたものを順次取り出すようにしてみました。これを動かすと、

品川
大崎
五反田
目黒
恵比寿
渋谷
原宿
代々木
新宿
新大久保
高田馬場
目白
池袋
大塚
巣鴨
駒込
田端
西日暮里
日暮里
鶯谷
上野
御徒町
秋葉原
神田
東京
有楽町
新橋
浜松町
田町

と、品川から一周回って田町まで取れていますね。これをどう活用するかは謎ですが、いずれ品川と田町の間に新駅ができたらプログラムを直さずに実行すると新しい駅を含んだ情報が取れるはずです。

今回はここまで。