機械学習, Rails, Androidが好きです - プログラマdogwood008のライフハック

最近のマイブームは機械学習, Ruby on Rails, Android、中でも機械学習を使った金融商品の自動取引に興味があります。

Rails 5 (非beta) でつくる、APIサーバ

Rails 5からAPIモードと呼ばれる機能が使えるようになったと聞いて、APIサーバをサクッと作ってみました。

f:id:dogwood008:20160713001818p:plain,w100
Ruby on Railsよりロゴを引用)

準備

$ mkdir fetch_rss_and_post_hateblog
$ cd fetch_rss_and_post_hateblog
$ echo "gem 'rails', '~>5.0'" > Gemfile
$ mkdir .bundle
$ echo '---                                                                                                                  
BUNDLE_PATH: vendor/bundle
BUNDLE_DISABLE_SHARED_GEMS: 1
BUNDLE_BIN: ./.bin' > .bundle/config
$ sudo yum install -y sqlite-devel # 必要に応じてapt-getなど
$ bundle install

プロジェクトをセットアップ。

$ rails new . --api
$ echo "development:
  secret_key_base: `rake secret`

test:
  secret_key_base: `rake secret`

production:
  secret_key_base: <%= ENV[\"SECRET_KEY_BASE\"] %>" > config/secrets.yml

ここまでの関係ファイルを一旦プッシュ。

$ gibo osx ruby rails vim >> .gitignore
$ git init
$ git remote add origin git://github.com/user/repo.git
$ git push origin master

APIサーバの作成

RSSを取ってきて、title, URL, descriptionを返すAPIサーバを作ってみます。

$ rails g controller post

APIモードで作られているか確認してみる。

$ cd app
$ ls
channels  controllers  jobs  mailers  views

RSSフィードを取ってきて、JSONで表示してみます。

はてブRSSフィードRSS:Parser#parse で取れない件は、 はてなのAPIを使う際に503エラーが出る問題と解決策を参考にしました。

app/controllers/posts_controller.rb

def fetch
  url = 'http://b.hatena.ne.jp/dogwood008/rss'
  ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'
  rss = open(url, 'User-Agent' => ua)
  feed = RSS::Parser.parse(rss)
  rss.close
  items = feed.items.map do |i|
    { link: i.link, title: i.title, desc: i.description, date: i.dc_date }
  end
  render json: items
end

config/routes.rb

Rails.application.routes.draw do
  get '/fetch', to: 'posts#fetch'
end

いざ、実行。

$ rails s -b 0.0.0.0

http://localhost:3000/posts/fetch

[{
  link: "http://brevis.exblog.jp/24515937/",
  title: "トラブルには技術的原因と、マネジメント的原因がある : タイム・コンサルタントの日誌から",
  desc: "【要約と私感】“マネジメント的原因” = 仕組みの原因。手っ取り早く直すには技術的要因を取り除けば良いけど、仕組みがダメならまた似たような失敗をうむ。",
  date: "2016-07-10T15:33:53.000+09:00"
},
  {
  link: "http://qiita.com/teradonburi/items/a382a17e1e0245b7d831",
  title: "AWS料金早見表(サーバレスアーキテクチャ) - Qiita",
  desc: "一度自分で一通りやってみたい感ある。",
  date: "2016-07-10T15:27:49.000+09:00"
}, ...]

ヒューッ!! その他いろいろ作っていきたい。

感想

  • 重い
    • Railsでないといけない理由があるなら良いけど、そうでないなら代替手段を考えても良いかも
    • 今回の使い方は明らかに不向き。DB要らないし。
    • SinatraPadrino も使ってみたい