WebサービスをRailsで1週間程度で作ってみた:技術編1

さて、前回の続きです。
khondalit.hatenablog.com


今回はスクレイピングに必要なYoutube周りの話となります。

作ったサービス

落語の動画をまとめています。
http://sqale.yoseba.org/

技術

開発したいものは前回に決めているので、まずは技術の選定から。

フレームワーク

Sinatoraとか他にも使ったことのあるフレームワークはいくつもありますが、仕事の延長もあってRailsを選択しました。
このレベルだとちょっとフルスタックすぎる気もしますが、gemもRails前提が多いですしね。
Ruby以外のフレームワークもありですが、Ruby以外だと過去互換性が弱い言語やセキュリティがアレだったりしますし...

個人開発ですと、なるべくメンテが少ないほうが嬉しいです。仕事だと毎日時間を使えますけど、そこまでコストは掛けれないですし。
RubyRails界隈はアップデートが多いのですが、このサイト自体は機能的にかなり少ないですしテストを書く余裕もあるかと思います。

DataBase

個人だとPostgreSQLを使うことも多いのですが、今回はMySQL
これはレンタルサーバーとかまで考えるとまだまだMySQLが強いですしね。

サーバ

はじめはHerokuを考えていましたが、Sqaleを選択しました。
Herokuは制限が多かったりしますが、Sqaleは日本語というのも大きな理由。
Sqaleはメール使えないとかメモリが少ないとかありますが、まあさほど大きくないサービスですしこれで良しとしましょう。
MySQLを選択したのもSqaleも影響しています。

個人開発だとこれぐらいのサーバーで動作するのを前提にアイディアを出したほうが良いかもしれません。
風呂敷を広げても完成しませんし、制限がある前提で考えるぐらいで調度良かったです。

Gem

今回のメイン機能はYoutubeAPIです。
YoutubeAPIを使用するGemはyoutube_itが有名だと思います。
github.com


ただ最終更新が1年以上前で、現状のYoutubeAPIでは使い物にならないようです。
代わりのGemを探していた所Ytというのを見つけましたので、ありがたく採用することに。
github.com

APIキーの取得

Google Developers ConsoleからYoutubeDataAPIのキーを所得しておきましょう。
console.developers.google.com

APIキーの設定

Yt.configuration.api_key = "APIのキー"

検索

検索も非常に簡単です。

videos = Yt::Collections::Videos.new
videos.where(q:"落語").each do |video|
  p video.title
  p video.id
end

IDから取得

IDが分かっていれば動画単体でも取得できます。

video = Yt::Video.new(id:"youtubeの動画ID")
p video.title
p video.description

詳しい使い方はこちらから
fullscreen.github.io


これでYoutubeからスクレイピングする準備が整いました。
あとは、落語家名なり演目名なりでひたすら検索、DBへの保存を行えば良いでしょう。


今回大変だったのはyoutube_itが死んでいたことです。
このGem数年前に試しに使ってみて問題がなく普通に使えていたのですが、久しぶりに使ってみるとまったく動かず対応するのにそれなりに時間を使いました。
Gemの便利な所でもあり不便な所でもありますね。

WebサービスをRailsで1週間程度で作ってみた

ここ半年以上やる気が出ず、仕事はやることやって定時で帰宅という状況でした。
やっとなんとかプライベートでのやる気も戻ってきましたので、長年やりたかった個人でのWeb開発をしてリリースができました。

プロジェクトが開発停止

実は去年ぐらいにはある程度まで完成していたアプリがあります。
マスターデータだけで数GBという結構大き目のデータを扱う予定でしたが、gemが開発停止になっていたり、時間ややる気の問題で開発停止に追い込まれました。


やる気が消えた原因が2つありまして、1つがgemの開発停止。もう1つがデザイン。
gemは仕方がないですが、デザインが本当に辛かったです。


私自身はもうプログラムで10年以上はお給料を頂いていますので、プログラム自体はなんとでもできる自信はあります。
ただ、デザインは本当に辛いです。Bootstrapを使っても非常に出来が悪い物しか出来ないですし、そもそもパーツの配置すら難しいという自分の低い技術レベル。Bootstrapだと大分楽ではありますが。

公開されているテンプレートを探してもTOPページ等の特定のページのみで他のページも考えるとちぐはぐになって統一感が出せないし...。
最近ですとスマホ対応も求められてそれも辛い所です。
そして仕事が忙しくなり開発はめでたく中止となりました。

そして新たな開発

開発は停止したものの、コンセプトは悪くないなぁとは思っていまして、実際ヒットしなくても自分自身で欲しいサービスではあります。
嘆いていてもしかたがありませんし
そこで、練習台になるサービスを作ることとしました。

今回のテーマはWebAPIと落語。
テーマの選択基準はこのあたりでしょうか。

  • WebAPIを使って楽をしたい!
  • WebAPIならYouTube? これだと動画を検索、表示程度なので機能も少なそう...
  • 落語自体はそこそこ好きな方
  • 落語のマスターデータ自体はさほど多くはない(はず...)
  • リリース優先、年内リリース目標、可能ならRubyKaigiまでに!

Webサービス作ってみた系だと、エロ系が割と定番ですがさすがに同じのばかりですと面白くないですし、ライバルが少ない方が良いかもですし...

サイト

URLはこちらになります。
http://sqale.yoseba.org/


開発やこれからのことについては別途投稿するつもりです。
年末年始や夜長な時にいかがでしょうか?

Linux版sophosが暴走

最近開発停止していたとある個人プロジェクトを開発中で忙しかったりします。


khondalit.hatenablog.com
さて、以前このエントリーで紹介したsophosの続報です。
Macだと軽かった(と感じた)sophosをLinuxに入れたのですが、今日は異常に重さを感じtopしてみると、sophosが暴走しておいました。

topの結果がこのようになっています。savscandがsophosのスキャンプロセスです。

23797 root      20   0  808100 189428   6156 S  35.9  1.2   0:03.57 savscand
21320 khondalit   20   0 2091340 824780  28660 S  23.9  5.1 744:01.15 firefox
1383 root      20   0  527656 329868 111560 S  14.0  2.0   2169:05 Xorg
25357 root      20   0  725936 192276   6428 S  13.6  1.2   0:04.28 savscand

出たばかりですし、まだまだという所なんでしょうか。
ひとまずpkillして逃げておきました。

/opt/sophos-av/bin/を覗いてみるとsavupdateというのを発見、どうやらアップデートを行うもののようです。
sophos自体なのかウィルス定義なのかよく分かりませんが、ひとまず実行してみると/opt/sophos-av/以下の日付が色々変更されている様子。
sophos自体のアップデータのようです。
ひとまずこれで様子見でしょうか。Linux自体にはアンチウイルスソフトが少ないので、sophosには期待しているので頑張って欲しいですね。

個人的な、therubyracer + libv8問題の解決方法

便利なRails上で動かすJavaScriptのエンジン。Rails4.2系になっても相変わらずの環境設定の急所ですね。
久しぶりに個人Mac上で環境構築すると、相変わらずMacだと引っかかりました。

検索して出てくるようにインストールのコツはtherubyracerとlibv8のバージョンの組み合わせを最適にすること。
一言で言えば簡単なのですが、正しい組み合わせなど分からずちょっと環境が変わると同じGemfile.lockでもエラーとなる曲者ですね。

で、ふと思いつき新規Railsプロジェクトを作成してbundle installすると問題なくインストールされました!!
ということで、このGemfile.lockからバージョンを抜き出して対象のGemfileにバージョンを指定してやるとすんなりbundle install完了!

ちなみに、今回の環境は以下のとおり。

環境構築にハマっている人はこの方法だといけるかも。

軽いsophosのLinux版が出たので早速試してみる

www.sophos.com

ちなみに、ディストリはMint Linux

sav-linux-free-9.9.tgzがダウンロードされます。

$ tar xvfz sav-linux-free-9.9.tgz
$ cd sophos-av
$ sudo sh install.sh

あとは選択にしたがって進めていきます。
/opt/sophos-av/にインストールされるようです。
インストールが終了するとsavdとsavscandが動いています。

$ ps aux|grep savd
khondalit   19497  0.0  0.0  12708   940 pts/7    S+   08:24   0:00 grep --colour=auto savd
root     28678  0.0  0.0 487864  6192 ?        Sl    5月18   0:01 savd etc/savd.cfg
$ ps aux|grep savscand
root      5494  0.1  1.2 808100 199092 ?       Sl   05:38   0:17 savscand --incident=unix://tmp/incident --namedscan=unix://root@tmp/namedscansprocessor.3 --ondemandcontrol=socketpair://52/54 socketpair://47/48 --threads=5
root      5503  0.1  1.1 725936 194860 ?       Sl   05:38   0:17 savscand --incident=unix://tmp/incident socketpair://40/41 --threads=5
khondalit   19510  0.0  0.0  12712   944 pts/7    S+   08:25   0:00 grep --colour=auto savscand

/etc/init.d/にもそれらしき起動スクリプトがインストールされています。

$ ls /etc/init.d/|grep sav
sav-protect*
sav-rms*
sav-web*

Mac等とは違いメニューが無いようですがまあ問題ないのでしょう。
ぱっと見た感じ、ログはどうやら/opt/sophos-av/log/に出るようです。

Macでは軽くて気に入って使ってますので、当分使ってみようと思います。

nanocでsitemapを自動生成する

nanocについては以前書いていた記事が2012/1/24なので3年ぶり?でしょうか。
そもそも色々忙しすぎてこのサイト自体更新してないわけですが、最近は多少時間が取れるようになってhttp://linuxc.infoを更新を少しづつしています。
そしてふとgoogle webmaster toolを入れてsitemapが必要らしいので調べるとnanocで自動生成出来るとの事で早速試してみました。

builder

gemでbuilderが必要なのでインストールしてください。

helperのXMLSitemapを使用する

nanocにはhelperという追加の機能があります。
またnanoc自体がデフォルトで幾つかのhelperを持っていますが、XMLSitemapはこのデフォルトのhelperです。

lib/default.rbに以下を追加します。

include Nanoc3::Helpers::XMLSitemap
URLの設定

config.yamlにURLを追加します。nanocはURL自体は知らなくても問題ないですがsitemapを作る場合には必要です。
自分の場合はhttp://linuxc.infoにします。
この時注意事項として最後のスラッシュ'/'は必要ありません。あっても問題ないですがsitemapに http://linuxc.info//startup/ となってちょっとださいです。

config.yaml

base_url: http://linuxc.info
content/sitemap.xml

content/sitemap.xmlを作ります。この内容をそのままコピペで。

<%= xml_sitemap :items => @items.reject{ |i| i[:is_hidden] || i.binary? } %>
Rules

Rulesにsitemapを作るルールを追加します。
どうも既存のcompile、routeよりも前に追加する必要があるようです。

Rules

compile 'sitemap' do
    filter :erb
end

route 'sitemap' do
    item.identifier.chop + '.xml'
end
compile

あとはいつもの様にcompileしてエラーがでなければOK。
作成されたsitemapをアップロードしましょう。
ちなみに、content以下には存在しているけど公開していないコンテントがあれば、これもsitemapに追加されるので注意!
output/sitemap.xmlを自分で編集して削除するのを忘れずに。

Rails環境でのドキュメントの自動化

仕事しているとドキュメント大事ですよね。
いつ人の移動があるか分からないし、新しく追加されても忙しいと説明する時間もなかったり。
そういう管理しているのが問題なのですがそれはそれとして、やぱっぱりドキュメントはあるに越したことはないです。

ということで、仕様書とかは別にしても現状の成果物に対してのドキュメントの自動化を行っています。
ドキュメントを作りたいけど忙しい方たちはこれを行うだけでも大分楽になるかと。

YARD/RDoc

昔からよくあるソースコードから作るドキュメント。
DoxygenJavaDocなどのRubyバージョンですね。
適切なコメントを書くと、クラスとそのメソッドのドキュメントを作成してくれます。

Rdocは便利なのですが、YARDの方が一貫性があるなどより良い感じですので、こちらを採用しています。
最悪コメントを書かなくてもとりあえずのドキュメント化はしてくるようですし、

rails-erd


voormedia/rails-erd · GitHub
DataBaseからER図を自動生成してくれます。
これがあると無いとでは大違いですね。

schemadoc


rubylibs/schemadoc · GitHub
こちらはDatabaseからテーブルとカラムの一覧をjsonで出力してくれます。
Railsのダメなところはtable宣言を見たい場合は、Databaseを直接見るぐらいしか方法がないことです。
migrationは運営していくにつれて増加しますしカラムの変更を行うと複数のmigrationファイルが増えていって理解不可能、modelを見てもテーブルの状態は書いていないです。
gemでmodelに出してくれるものもあるようですが、マネージャー等からするとドキュメントはやっぱり別途必要。
ということで、schemadocだと自動生成してくれるのでおすすめです。

autodoc


r7kamura/autodoc · GitHub
Web API用ドキュメント自動生成ツール
APIRSpecに少しの修正を行えば、RSpecを実行するだけでドキュメントが生成されます。
素晴らしい!


これだけでプロジェクトのドキュメント管理が大分楽になります。
面倒な作業は自動化をしてプログラムに集中するようにしています。
自動化バンザイ!