dai-shi色々考えた結果、herokuを使うのが一番手軽だと思い、Ghostをデプロイしてみることにしました。moduleでfile以外の方法も使えるようになったようです。Storageというのがあるようです。個人的には、mongodbをバックエンドにしたstorageとかできないかなと期待します。それを外す方法が分かりませんでした。そこで、通常の方法でデプロイすることにしようと思いました。参考にしたサイトはhttp://www.autodidacts.io/host-a-ghost-blog-on-heroku/です。作業メモの利用価値が低くなってしまいそうでした。これでは再利用性がなくなってしまいます。そこで、方針を戻して、ghost-on-herokuをforkすることにしました。有料アドオンを使っているところをやめて、GMailでメール機能を使えるようにします。Ghostのソースを調べると思っていたように、NodeMailerが使われていたため、簡単そうです。ghost-on-herokuをみようみまねで編集して、ボタンひとつでデプロイできるようにしました。https://github.com/dai-shi/ghost-on-herokuボタンひとつでデプロイできます。動作確認はこれからですが。このherokuのテンプレート機能便利だと思いました。他にはどういう候補があるのか調べてみようと思いました。使えなくなった(もしくは、以前より使いにくくなった)ものもあります。他の候補を調べてみることにしました。条件は、無料で使えるプランがある(一定期間でも)ことです。網羅はできていないと思います。実際に試したわけではなく、サイトから得られる情報をまとめただけです。動作させることができて、dockerのイメージも動かせるそうです。各種データベースも用意されているとのこと。webベースのdashboardで簡単に操作できるようです。trialは14日間です。pricingは、usage-basedとfixedの2種類とのこと。Meteorがサポートされているのも特徴のようです。modulusというコマンドをインストールして、デプロイ作業をするようです。その他必要そうなものはひと通り揃っているように見えます。upすると30日間使える$15分のクレジットがもらえるようです。安い構成でも月に$28.80になるので、30日連続運用はできないことになります。PHPが使えるようです。デフォルトはMySQLですが、他のストレージのadd-onもあります。MongoDBもMongoSoupというのがあるようです。APIが用意されているとのこと。Freeとありますが、実際無料でどこまで使えるか分かりませんでした。小さい構成では、月$9.90のようです。Launcherを使って簡単にStackを構成できるようです。MEANも使えるようです。trialでは、$300分を60日間使えるそうです。FoundryをベースとしたPaaSです。Rubyがあげられています。フリートライアルでは、30日間使えるそうです。現在、アプリ開発コンテストが開催中とのこと。まとめ残念ながら、期間限定なしでfreeで使えるサービスは見つけられませんでした。freemiumは最近は流行りではないのでしょうかね。herokuもfreeの範囲が狭まることになりましたし、厳しい情勢です。dai-shi久しぶりにgunosy-rssのコードをいじりました。URLを変更しました。新しいURLは、http://gunosy-rss.axlight.com/です。Redirectされます。すべてのRSSリーダー/アグリゲータが対応しているということはないでしょう。今後、旧URLではアクセスできなくなることがあるかもしれません。いうのも、herokuの無料枠で動かしているのですが、その条件が変わるためです。将来的にDNSでアクセス先を変更したりすることを想定してのことです。当面はそんな面倒なことをするつもりはありません。rssのttlを設定してみました。今後RSSリーダー/アグリゲータがttl正しく解釈してくれれば、朝の5時以降と夕方の5時以降に取得するようになるはずです。これはもっと早く実装しておけばよかったですね。様子を見た感じだとアクセス頻度がだいぶ減ったように思います。Retry-Afterが返ることも減ったようですし、本家Gunosyへのアクセス負荷も下がるかもしれません。JavaScriptのDateのタイムゾーンが手元とherokuで異なっていて、はまりました。スマートでない方法で解決したのと、もともとのコードがスマートでないので見苦しいですが、ttlの算出周りに興味があればコードを見てみてください。いい書き方があるはずです。他にも今から見ると書き直したい部分があったり、そもそもライブラリのアップデータもしたいのですが、そこまでモチベーションがわきません。そのうち、ついでがあれば。タイムゾーンを設定する方法がありました。app.jsこれでコードはシンプルになりました。herokuと2つコマンドを打つことになると思います。remoteでoriginとherokuが設定されているとして。いう場合に、githubからherokuに自動でデプロイできたら便利でしょう。いくつか解決法はあるようですが、CodeShipというのを使ってみました。http://blog.codeship.io/2013/10/02/how-to-deploy-a-ruby-on-rails-app-from-bitbucket-to-heroku.htmlチュートリアルに沿って言われたとおりに設定するだけでできるようになりました。PUSH時のhookを登録することで実現しているみたいです。鍵の元はCodeShipにあるわけなので、CodeShip側に悪意があればいろいろできちゃいそうですが。CodeShipはデプロイだけではなく、テストもまわせるなど、使いこなせばいろいろできそうです。APIの呼び出しをしていたのですが、不思議なエラーがでてました。addressというエラーです。stackoverflowでも複数のスレッドで話題になっていました。IPが変わってしまっていて、エラーになっているということは分かりました。herokuを使うと、デプロイしてから何時間か経つとIPアドレスが変わるようです。tokenを取得し直す必要があります。これは、OAuthExceptionのときに再取得するようにすればいいのですが、少しはまりました。tokenをクリアしておく必要がありました。tokenを再取得しようとするときに上記のエラーが出ました。Facebook側の問題か、ライブラリ側の問題か難しいところですが、とりあえずは自分で回避するしかないです。参考までにサンプルコードを載せておきます。tokenでも同じかもしれません(未確認)。上記のコードでも回避できずにエラーになったことが一度だけありました。再度調査中ですがその後再現しないので解決できないです。その後安定して動いています。前回の一度起こったエラーはたまたま別の要因があったと思っておきましょう。Pipesは、JavaScriptでフィルターを書く、RSSアグリゲーターです。フィルターJavaScriptはブラウザ上で誰でも書くことができます。バグ入りのコードや、悪意のあるコードも書くことができます。そのような不正なコードにどう対処するかがポイントになります。PipesはNode.jsで動いています。Node.jsにはvmというモジュールがあって、サンドボックス環境を作ることができます。Node.jsを使ったことがある方は分かると思いますが、モジュールを書いてrequireするとexportsしたもの以外は名前が衝突しません。これはrequireでモジュールをロードする時にサンドボックス環境で評価しているからです。Pipesでもこの仕組みを使ってJavaScriptのコードを評価しています。よって、ブラウザ上から入力されたJavaScriptコードによって、サーバ側のNode.jsにアクセスされることはありません。ところが、vmモジュールのマニュアルをよく読むと書いてあるように、このモジュールを使うことで安全になるわけではありません。安全にコードを走らせるためにはサブプロセスを使うように、と書いてあります。いうことかと言うと、Node.jsはシングルスレッドで動作するため、vmでサンドボックス環境を作ったとしてもそこで使用されるリソース(CPUパワーやメモリ)を制限することはできず、リソースを不用意に使われてしまう可能性があります。{}というJavaScriptを走らせるとNode.js全体が固まってしまいます。Pipesでサブプロセスを使うわけにはいきません。(もしかして、使うこと自体はできるのかも?)そこで、無限ループを判定するような仕組みをいれています。counter++;}のようにして、counterが一定値を越えた場合に強制的に止めればよいのです。これで、どの程度の危険が回避できたかは定かではありません。正確にCPUの使用率を測っているわけでもありませんし、メモリについてはノータッチです。それでも、無限ループで固まることは回避できているので、少なくとも悪意のないコードでしたら、問題のない範囲と思っています。将来的に、vmモジュールのサンドボックス環境でリソース制限までしてくれるようにはならないでしょうかね。オープンソースで提供されています。ライセンスの範囲内で自由に使うことができます。慣れている人は説明なしですぐにできると思いますが、どれだけ簡単にできるかを示すため手順を書いておきます。toolbeltがインストールされ、SSH鍵が登録済であることGitHubのアカウントがあること(なければ作る)gitがインストールされていることまず、GitHubからソースコードを取得します。https://github.com/dai-shi/gunosy-rssにアクセスして、右上のForkボタンを押して、自分のリポジトリにします。自分のリポジトリのページに行ってリポジトリのURLを確認します。仮に、git@github.com:<username>/gunosy-rss.gitだったとします。git@github.com:<username>/gunosy-rss.gitをコマンドラインで実行するとダウンロードされます。gunosy-rssでディレクトリを移動します。次に、herokuにアプリケーションを作ります。<appname>を実行するだけです。<appname>は省略も可能です。apps:infoとします。それぞれ、git@heroku.com:<appname>.gitとhttp://<appname>.herokuapp.com/だったとします。SITE_PREFIX=http://<appname>.herokuapp.com/として、環境変数を登録します。git@heroku.com:<appname>.gitとして、リモートリポジトリを登録します。herokuとして、herokuにアップロードして、完了です。http://<appname>.herokuapp.com/<gunosyid>.rssでRSSフィードが生成されます。実は、GitHubのアカウント作らずForkもしなくても、上記のことはできます。requestが送れるようにForkするのが、GitHubらしいのではないでしょうか。<appname>とする必要があるかもしれません。