やりたいことを勝手にやる

プログラミング周りでやりたいことをやる

エゴサーチサービス開発 (その3)

次の目標は twitter ポーリング。heroku cron -> twitter API と進む。

Hreoku cron 設定

初期アプリ作成

とりあえず前回どおりrails init した。sqlite は heroku に入らないのでそのあたりの調整も忘れずに。

アプリ設定

アプリの設定はデフォルトなのでいろいろな設定を変更する。

アプリリネーム

Heroku コンソールでアプリをリネームした。アプリ名は世界で unique なのでかぶると "使われてるよ" と言われてリネームに失敗する。
アプリ名をリネームすると git の Heroku 側レポジトリが変わるのでドキュメントを参考にしてローカルの設定を変更した。最後は正しく変更されているかの確認。

$ git remote rm heroku
$ heroku git:remote -a newname
$ git push heroku master

変更後のアプリ URL (Mysql の設定がすんでいないからかまだエラー) :
https://search-myself.herokuapp.com/

Dyno type をアップデート (しなかった)

Dyno type が free のときは cron が使えないはずなので Dyno type を Hobby ($7/month) にアップデートする。

その前に Heroku にクレジットカード情報を登録せんとどうにもならないはず。"dashbord に行け" と言われるものの dashbord のどこを触ればいいかわからなかったが右上に見える人っぽいアイコンをクリックしたらアカウント設定に行けるのでここで課金情報を登録するらしい。

といったところでダッシュボードを見てみると

  • "Free" でも 1 worker 使える
  • "Hobby" にするとアプリと woker で 1 dyno ずつかかる (つまり 14$/month)

ということに気が付いたので ver.1.0 ができるまでは free で使うことにする。

定期実行設定

定期実行は "Heroku Scheduler" という add-on になっているらしい。

  1. アプリケーションのダッシュボードの "Resources" タブに行く
  2. "Add-ons" のところに "Scheduler" とか入力したら "Heroku Scheduler" が出てくるので選択する
  3. あらわれた "Heroku Scheduler" をクリックすると設定画面に行くので好きなように設定する
    1. 設定項目はコマンドと Dyno サイズと実行頻度 (日ごと、時間ごと、10 分ごと)

scheduler ならワーカーはなんのためにあるんだろう?⇒どうやらバックグラウンドジョブを処理するためにあるみたい。定期実行できなくはないんだろうけど、ちょっと使い方が違う。

定期実行してみる

公式ドキュメントを参考にしながらタスクの定期実行をしてみる。

定期実行タスク

タスクはなんでもよいみたいだが rails がアプリなので rake を起動タスクにする

$ rake search

テスト的に以下の rake ジョブファイルを lib/tasks/scheduler.rake においてみる。なにが起こるかは一晩寝てから確認。

desc "Test scheduled task"
task :search => :environment do
  puts "test scheduled task"
end
Gemfile 修正
  • 手元では rake が Javascript ランタイムがないために動かない
  • Heroku では therubyracer を入れると reject される

ということでローカル実行するときには therubyracer を使うことにした。
theruburacer は group :development, :test にあっても Heroku に reject されたので、ローカル実行する前にコメントアウトを外すしかなさそう。

ログ

ログは以下のコマンドで確認できるらしいが、現時点では一度も実行されていないからか scheduler のプロセスがなかった。

# scheduler のプロセスを確認
$ heroku ps
# そのプロセスのログを見る
$ heroku logs --ps scheduler.X
公式ドキュメントからの注意点
  • 長い (数分を超える) タスクは実行できない。その場合はタスクをバックグラウンドジョブにせよ
  • best-effort となる。実行時間は前後する場合があり、かつ無保証

bash for windows TIPS

  • Windows から作ったファイルは bash からは見えない
  • bash で作ったファイルを Windows で編集するのは OK

したがってファイルを追加するときには bash で touch してファイルを作成する必要がある。

エゴサーチサービス開発 (その2)

この前の続きから。Heroku を使ってみる。

Heroku

サインアップ

別に大したことはない。必要事項を埋めて送信するだけ。メイン言語 (プログラム的) を選ぶのがちょっと変わったところか?

メールによるアカウント確認もよくあるやつ。これを最初にやり始めたのは誰なんだろうか?

テストアプリ作成

とりあえずアプリを作ってみる。Ruby で適当なアプリを作ろう...と思って "Ruby" をぽちっと押すとチュートリアルが出てきた。読んでみる。必要な ruby は 2.2.5 か...更新しとかないと。

↓で更新したので戻ってきた。

Heroku CLI 導入

チュートリアルで出てきたコマンドを実行して Heroku CLI をインストールした。

$ sudo add-apt-repository "deb https://cli-assets.heroku.com/branches/stable/apt ./"
$ curl -L https://cli-assets.heroku.com/apt/release.key | sudo apt-key add -
$ sudo apt-get update
$ sudo apt-get install heroku
$ hroku login
サンプルアプリ用意

heroku チュートリアルにはサンプルアプリがあったが自力で用意した。久しぶりの rails だったので結構忘れてるな...

  1. rails new --skip-spring --skip-listen で初期化。このオプションがないとBash for Windows では動かないとのこと
    • spring: コマンド高速化, listen: ファイル変更フックらしいのでなくても正しい rails として動くはず
    • β版だから仕方ないね。開発は進んでいるみたいなんだが一般ユーザーに降りてくるのはだいぶ先になりそう
  2. Gemfile で therubyracer のコメントを外し、bundle install し直す
    • Javascript の実行環境が必要となるため。node をいれてみたがうまく動かなかった...
  3. Controller 作って
  4. Model 作って
  5. erb ファイル編集して
  6. config/rootes.rb 編集して完成
heroku にデプロイ

git を使ってデプロイするので最初に git repository を作っておく。

$ git init
$ git add
$ git commit -m "test app"

こうしておいて heroku のアプリ作成とデプロイが可能になる。(git repository 作成と逆になると heroku の git repository が設定されない)

$ heroku create
$ git push heroku master

で OK...と思ったが sqlite3 は使えないとのお達しだったので

  • Gemfile 修正
    • sqlite3 を test, development 専用にする
    • mysql2 を 追加
  • mysql-server, libmysqlclient-dev を apt-get
    • ローカルの budle install を通すため mysql-server は必要ないかもしれない
  • bundle install
    • ただの Gemfile の確認だが...

とした上で再度 push したらデプロイできた。

heroku で Mysql を使う

これを忘れてた...アプリを消しちゃったので後回し。

Ruby 環境構築 on Windows

今の Windows に入っている ruby は 2.1.5 で古いのでアップデートが必要となっている。 (なので↑のメイン作業前にやっている)。

Bash for Windows 導入

なんかさらに回り道しているみたいだが...Ruby 使うんなら rbenv がいいよね...ということで Windows で rbenv 使えないかと探してみたが、Windows で rbenv っぽいものを作ってた 人が "Bash for Windows 使え" とのことなので Bash を入れた。

やらなきゃいけなかったことのアウトラインは

  • "Windows の機能の有効化" で "Linux Subsystem for Linux" を有効化
  • Windows の設定で開発者向け機能を有効化
  • コマンドプロンプトで "bash" と入力して bash インストール
  • ホスト名設定 (そのままでは sudo すると "ホスト HOMEWIN8 の名前解決ができません" と警告されるため)
  • リポジトリ取得先の変更 (デフォルトだと海外サーバにとりに行くため)
Bash for Windows メモ
  • ベースは Ubuntu
  • カレントディレクトリのパスに日本語があるとコマンドプロンプトが見づらくなる
  • cmd ウィンドウ外 (普通の Windows) からのコピペをするには cmd を "簡易編集モード" にしたうえで Ctrl+V ではなくマウスの右クリックが必要となる
  • Linuxディレクトリは Windows 上では %localappdata%\lxss (つまり c:\Users\\AppData\Local\lxss) にある
    • Local までいっても lxss は表示されないが勇気をもってフォルダ名を打ち込めば lxss フォルダの中に入れる
    • システムファイルは %localappdata%\lxss\rootfs にある
    • 各ユーザーのホームディレクトリは %localappdata%\lxss\home\ にある

git 導入

なにはなくとも git は必要。apt-get から導入した。git config --global もしておく。

$ sudo apt-get install git
$ git config --global user.email "<mail address>"
$ git config --global user.name "<name>"

ruby (+rails) 導入

まずは rbenv を導入する。ただし apt-get で入れると ruby 2.0.0-dev までしかインストールできないので git から入手する。 ruby-build がないと何もできないので ruby-build も忘れずに。

rbenv インストールコマンドは参考サイト通りに打った。使用する ruby のバージョンは rails 5.0.1 が 2.2.2 以上、Heroku では 2.2.5 ということなので 2.2.5 を入れた。ruby のインストールは途中で止まったんじゃないかと思うぐらい時間がかかった。
最後のほうの rails ディレクトリ作るあたりは rails 専用の ruby 環境を準備するため。rails いれちゃうとかなり環境を汚すはずなので global には入れないことにする。

$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile

$ rbenv install 2.2.5
$ mkdir rails
$ cd rails
$ rbenv local 2.2.5
$ ruby --version
ruby 2.2.5p319 (2016-04-26 revision 54774) [x86_64-linux]

ここまで用意したので rails を入れる...の前に sqlite でいいので SQL を入れておく。

$ sudo apt-get install sqlite
$ gem install rails
$ gem install bundler

ひとこと

bash コマンドを引用記述にするのにして四苦八苦したあげく、はてな記法で入力する設定があったので変更した。

エゴサーチサービス開発 (その1)

FPGA は使えるまで時間がかかりそうなので待っている間に別のことをする。

最近自分で開発した製品がどう受け入れられているのか気にしないとだめだな、と思うことがあったのでエゴサーチサービスを作ることにする。

やりたいこと

  • 適当なキーワードを登録すると定期的にエゴサーチしてくれる
  • 結果は WEB 上で確認できる & 登録したところに通知

仕様

  • 検索結果の通知は Android アプリで受け取る
  • 検索対象は twitter (とりあえず)
  • 検索は 1 時間ごとに行う
  • ログインは Facebook アカウントのみ (とりあえず)
  • ユーザーの設定項目: twitter 検索キーワード, GCM 通知先
  • アクセスは SSL

構成

Heroku を hobby 設定でつかうのが一番安いはず。

考えた構成

  • Azure: 仕事で使っているのは AWS なので Azure を使ってみたかったが Linux の Web App サービスは publis preview 段階とのこと。しかも Ruby は使えない (PHP, node.js, .Net) 無念...
  • AWS: EC2+RDB+Route53+... 料金がかさむのは目に見えている

おまけ

PaaS 見てると 750 時間無料というのが多かった。ひと月の最大時間は 31*24 = 744 時間なのでこれはほぼインスタンス 1 個分。

 

AWS FPGA 使ってみる (その1)

新年なので新しいことをしようということで FPGA をさわってみる。現物じゃなくて AWSFPGA だが。

 

AWS 登録

まずは AWS に登録した。以下の手順

  1. サインアップしようとしたら英語になったので住所とか名前とかアルファベットにして入力
  2. 請求用のクレジットカードを登録
  3. ブラウザにPIN コードが表示されて電話がかかってくるので PIN コードを電話で入力
  4. サポートプランは Basic を選択

これで登録は終了したので AWS コンソールにサインインする。

IAM ユーザーの設定

そのままではルートユーザーのメールアドレスとパスワードを入力すれば使い放題となるのでルートユーザーには MFA (Multi-Factor Authentication) を設定したうえで普段使うユーザーを IAM に作る。IAM コンソールのガイダンスとIAM のベストプラクティスに従いつつ以下の作業を行った。

  1. ルートアカウントのアクセスキーロック : これは初期状態で行われているはず
  2. ルートアカウントの MFA 有効化 : 仮想 MFA としては Google Authenticator を選択した。QR コードを読み取り後 Google Authenticator のアプリで表示されるコード (一定時間で次のコードが表示される) を 2 連続で入力する
  3. ここで一度ログオフしてログインすると MFA のコードを求められるのでもう一度 Google Authenticator で表示されているコードを入力する
  4. パスワードポリシーを設定する (定期的な更新以外を設定しとけばいいと思う)
  5. IAM ユーザーを作成する (AdministratorAccess ロールをもつ admin グループを作成してそこに追加)
  6. 作成したユーザーはアカウントごとのログインサイトでログインできるのでログインしてみる

CloudWatch で請求額のアラートを設定

AWS を使い始める前に CloudWatch で請求額のアラートを設定するとパケ死せずに安心...かもしれない。請求額のアラートを作成するために請求ダッシュボードと CloudWatch で以下の手順で設定を行った。

  1. 自分のアカウントをクリックすると "請求ダッシュボード" と出てくるのでクリック
  2. 左のタブの "設定" をクリックすると請求アラートの受け取り方法が選べるので "請求アラートを受け取る" にチェックを入れて保存
  3. CloudWatch コンソールを表示する
  4. 左のタブの "アラーム" -> "請求" をクリックする
  5. "アラームの作製" をクリックする
  6. あとは好きなようにアラームを作成する。確認メール ("AWS Notification - Subscription Confirmation") が飛んでくるので確認用 URL をクリックする

6 時間の請求額が 10$, 20$, 50$, 100$ をこえたときにメールが来るように設定しておいた

EC2 インスタンスをたちあげる (F1 インスタンス)

FPGA は Lambda みたいな特定のサービスではなく EC2 インスタンスの 1 クラスになっている (AWS の説明)。まだ Preview 段階なので Preview に申し込みを行ってアクセス権を取得する必要がある。

F1 インスタンスに申し込む

Amazon EC2 F1 Instances の "Sign up for the F1 Preview" をクリックすると申し込みフォームに行けるので適当にうめる。"Preferred Programming Language", "Experience with FPGA Or EDA tools (choose one or more):" といわれましても newbie ですが......という状態だが適当に埋めた。とりあえず submit する。

"連絡するので待つべし" とのこと。

(1/29 追記) : 1/10 に "混んでるから待ってね" と連絡があったきり

参考サイト

IAM 設定