WebサービスをRailsで1週間程度で作ってみた:技術編2 PaaSなSqale
年も開けて1ヶ月経ちます。もう1/12が過ぎましたね、時間が経つのは早いです。
WebサービスをRailsで1週間程度で作ってみた:技術編1 - khondalitのWebを学ぶブログ
前回の続きです。
今回はサーバについてです。
sakura辺りを借りても良かったのですが、今回はSqaleを借りてみたので軽く感想を書きます。
SqaleはいわゆるPaaSですね。Herokuと同じようなサービスですね。
サーバサイドのコードさえ書けばOSからDBまで用意してくれて個人開発には非常に有り難い存在です。
chefなり自前で用意するのも可能なのですが、リリースまでそれなりに時間がかかりますし最近はそこまで頑張る気力も無いのでありがたく使わせてもらいます。
特徴
gitでデプロイできます。非常に楽ですが、デプロイ後サーバの強制再起動を行っているのか一時的につながらない時間があるようです。
gracefulじゃあないのがちょっと辛いですね。
sshログインもできますし、cronも使い放題です。
最初の2週間はただですので、お試しができるので初心者の方には嬉しいかも。
あと、スケールアウトも可能な点も嬉しい。
逆に辛いところは、DB容量が2GBだったりメモリも512MBなど結構厳しい。
ちょと大きめのサイトを作るには向いてないですね。中小企業のサイトや個人のちょっとしたサイト等、データが小さめのサイト向けでしょうか。
画像等コンテンツを配信する場合には向いてないので諦めるかAmazon S3等別のサービスとの併用となりそうです。
ただファイルはS3でもよいけど、DBを大量に必要とするサービスにはさすがに向いていないようです。
落語の動画をまとめているサイトを公開しています。よろしくお願いします。
sqale.yoseba.org
WebサービスをRailsで1週間程度で作ってみた:技術編1
さて、前回の続きです。
khondalit.hatenablog.com
今回はスクレイピングに必要なYoutube周りの話となります。
作ったサービス
落語の動画をまとめています。
http://sqale.yoseba.org/
技術
開発したいものは前回に決めているので、まずは技術の選定から。
フレームワーク
Sinatoraとか他にも使ったことのあるフレームワークはいくつもありますが、仕事の延長もあってRailsを選択しました。
このレベルだとちょっとフルスタックすぎる気もしますが、gemもRails前提が多いですしね。
Ruby以外のフレームワークもありですが、Ruby以外だと過去互換性が弱い言語やセキュリティがアレだったりしますし...
個人開発ですと、なるべくメンテが少ないほうが嬉しいです。仕事だと毎日時間を使えますけど、そこまでコストは掛けれないですし。
Ruby、Rails界隈はアップデートが多いのですが、このサイト自体は機能的にかなり少ないですしテストを書く余裕もあるかと思います。
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サービス作ってみた系だと、エロ系が割と定番ですがさすがに同じのばかりですと面白くないですし、ライバルが少ない方が良いかもですし...
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版が出たので早速試してみる
ちなみに、ディストリは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を自分で編集して削除するのを忘れずに。