my story blog

JavaScriptとかRubyの技術的なことを書きたい

Yahooキーフレーズ抽出APIのgemを作ってみた

Rubyにもだいぶ慣れてきたので、gemを作ってみることにしました。

作ってみたのはYahooキーフレーズ抽出APIrubyで簡単に使えるgem。

Yahooキーフレーズ抽出APIとは、文章の中から特異なキーワードとそのスコア(100〜0)を最大20件抽出するAPIです。

で、それをruby上で解析したい文字列を渡すと、 キーフレーズとスコアをhashとして結果を返すようにしたのが作ったgemです。

https://rubygems.org/gems/yahoo_keyphrase_api

インストール方法

Gemfileに以下を追加

gem 'yahoo_keyphrase_api'

そして bundle install

またはgemを直接インストール

$ gem install yahoo_keyphrase_api

 

設定

アプリケーションIDをYahooから取得して、 以下の用に設定

require 'yahoo_keyphrase_api'

# and setup
YahooKeyphraseApi::Config.app_id = [application_ID]

使い方

使い方は簡単でKeyPhraseをnewしてextractを呼び出すだけ。 結果はHashieオブジェクトで返します。

ykp = YahooKeyphraseApi::KeyPhrase.new

# extract key phrase
ykp.extract '東京ミッドタウンから国立新美術館まで歩いて5分で着きます。のリクエストに対するレスポンスです。'
 #=> <Hashie::Mash 5分=10 リクエスト=55 国立新美術館=100 東京ミッドタウン=69>

デフォルトではPOSTリクエストにしてますが、引数を変えるとGETリクエストもできます。

ykp.extract('東京ミッドタウンから...', :GET)

Githubはこちら

メモ:作ったgemをリリースするまでの流れ(Qiita)

Controllerでjsonを返す場合に返すカラムを指定したい

RailsでControllerからjsonを返す場合、Modelの戻りをそのまま返すと データとして使わないcreated_dateやupdated_dateも返ってしまうので、無駄な転送が発生してしまう。

もしくは以下のように、jsonのオプションでexceptを使うことによって指定の列を返さないようにできる。

def users
  render json: User.limit(5), except:[:created_date, :updated_date]
end

逆に指定の列のみを返したい場合、onlyを使う

def users
  render json: User.limit(5), except:[:id, :name]
end

AWS S3を使ってRailsのassetをCloud hostさせる

RailsのassetファイルをS3において表示速度を上げる方法。

HerokuはUS(かEU)のAWSがホストになるのでどうしても大きめの画像ファイルの表示しようとすると時間がかかってしまう。 そこで、AmazonS3のTokyoインスタンスを使って、静的なファイルはそちらからダウンロードするようにして画面描画速度を早める方法を書いてみる。

続きを読む

heroku schedulerの使い方(Rails,sinatra)

(qiitaにも書いたけどこっちにも。)

herokuで定期的な処理を行いたい場合、大体はaddonのheroku Schedulerを使うことになると思うので、簡単にまとめてみる。

特徴など

  • タスクは複数登録可能
  • タスクの起動間隔は10分おき、1時間おき、1日おきで選べる。
  • heroku schedulerはベストエフォート型のサービスなので、実行開始時間は多少の遅延したり、スキップされることがあるので注意する
  • 無償でできること
    • プロセスの利用時間は1Dynos = 750時間(/1ヶ月)
    • 24h * 31日 = 744hなので1タスクであれば、1ヶ月フルで利用しても大丈夫(だけど、Webと共有なのでWeb側を使っていれば実際はもっと少なくなる?誰か教えて下さい・・・・)
    • それ以降は1時間あたり$0.05かかる(1ヶ月フル使用で$37.2)

何はともあれaddonを追加

コンソールから

$ heroku addons:add scheduler:standard 

またはaddonページから https://addons.heroku.com/scheduler

※アドオンは無償ですが、オーバーしたプロセスが課金対象になる?のでクレジット登録になります。

スケジュール画面を開く

https://heroku-scheduler.herokuapp.com/dashboard

$ heroku addons:open scheduler

タスクの登録

Railsの場合

lib/tasksの下にrakeファイルを作成

task :test_task => :environment do
    #処理
    puts 'done.'
end

スケジュール管理画面でAdd Job...を選択 TASKにrake test_taskを設定 FREQUENCYに起動間隔を設定。

Sinatraの場合

scheduler用の実行ファイルを作成

# 処理
puts 'done.'

スケジュール管理画面でAdd Job...を選択 TASKにbundle exec ruby task.rbを設定

ログの確認

$ heroku logs --ps scheduler.xxxx 
#(xxxxは実行時に割り当てられたプロセス番号)

公式Doc

https://devcenter.heroku.com/articles/scheduler#defining-tasks