iriya-ufo's blog

Curiosity was simply the first derivative of knowledge.

Middleman-s3_sync で Colorize のエラーがでた

静的サイト開発に便利な middleman を使って Amazon S3 バケットにデプロイする際、middleman-s3_sync という gem を使っていましたが、エラーがでました。

/Users/iriya/project/rabbitcare/rabbitcare-site/vendor/bundle/ruby/2.1.0/gems/padrino-support-0.12.4/lib/padrino-support/core_ext/string/colorize.rb:22:in `colorize': undefined method `light_green' for String::Colorizer:Class (NoMethodError)

ここを見るとどうやら colorize という gem でもう使われていないメソッドを呼び出しているようでした。

0.7.4 のバージョンならOKということなので、Gemfile に以下を追記して $ bundle update で直りました。

1
2
# Avoid deployment error
gem "colorize", "0.7.4"
$ bundle update colorize

Brew のアップグレードで Rails プロジェクトなどが動かなくなったら

brew をちょくちょくアップグレードしてると古い rails プロジェクトが動作しなくなったりします。直接的な影響ではなく間接的に影響して動作しなくなっています。よくあるのは keg-only なパッケージによる影響です。

エラーの例

openssl 周りでエラーが起こっているのだと思われます。brew でインストールした openssl のバージョンが上がったのでしょう。

/Users/iriya/.rbenv/versions/2.0.0-p353/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require': dlopen(/Users/iriya/.rbenv/versions/2.0.0-p353/lib/ruby/2.
0.0/x86_64-darwin11.4.2/openssl.bundle, 9): Symbol not found: _SSLv2_client_method (LoadError)

解決方法は関係ありそうな brew のパッケージをリンクし直すことです。上記例なら openssl です。そして openssl は keg-only なパッケージですので force をつけることに注意します。また OS に元々入ってる openssl を使っていないかも確かめましょう。

$ brew link openssl --force
$ which openssl            # openssl の呼び出し元を調べます
$ openssl version          # バージョンを調べます
$ /usr/bin/openssl version # システムにインストールされているバージョンを調べます

ここで一度エラーが起こった内容のコマンドをもう一度実行してみます。例えば rails の起動とか gem のインストールとかです。動けばOK。もし動かなかったら ruby の再インストールをします。ここでは rbenv を使っている前提です。

$ CONFIGURE_OPTS="--with-readline-dir=/usr/local --with-openssl-dir=/usr/local" rbenv install 2.0.0-p353

これでもう一度実行してみましょう。直ってるはずです。え?直ってない?自力で解決してください。

PostgreSQL の基本

環境は Mac でやってますが Linux でもほぼ同じです。

インストールから初期設定まで

Mac なので brew でインストールします。

$ brew install postgresql

最初にデータベースの初期化をします。

$ initdb /usr/local/var/postgres -E utf8

試しに PostgreSQL サーバーの起動を確認してみます。

$ postgres -D /usr/local/var/postgres

起動に問題なければ、環境変数の設定をします。.zshrc とか .bashrc とかに追記してください。

export PGDATA=/usr/local/var/postgres

マシン立ち上げと同時に起動しておくようにします。Linux だとディストリビューションによるので割愛します。

$ cp /usr/local/Cellar/postgresql/9.*.*/homebrew.mxcl.postgresql.plist ~/Library/LaunchAgents/
$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

これで準備ができました。

データベース準備の基本

データベースの一覧を取得します。

$ psql -l

デフォルトで postgres , template0 , template1 のデータベースが用意されています。

ユーザーの作成をしてみましょう。

$ createuser -a alice

データベースの作成をしてみましょう。

$ createdb -E UTF8 -O alice alice_db

作成したデータベースに接続してみましょう。

$ psql -U alice alice_db
psql (9.3.2)
Type "help" for help.

alice_db=#

このようにDB名のプロンプトに切り替わったら成功です。

基本のコマンド

psql で使う基本的なコマンドです。"バックスラッシュ + 1文字"というコマンドはなかなか覚えられないですね。英語の先頭文字と結びつけて覚えるのが近道です。

コマンド説明
¥qpsqlを終了
¥dテーブルやシーケンスの一覧を全て表示
¥dtテーブルの一覧を表示
¥dsシーケンスの一覧を表示
¥zアクセス権を含めてテーブルの一覧を表示
¥lデータベースの一覧を表示
¥iファイルに書かれたSQL文を読み込んで実行

素晴らしいサイト

PostgreSQL を練習するのにすばらしいサイトがありますので紹介します。こちらです。 PostgreSQL Exercises

Vim 小技集

自分のための覚書

編集

:%s/:\(\w\+\) =>/\1:/g  # hash の書き方を置換 #正規表現
Ctrl+v jjjj I           # 4行コメントアウト(,#)
Ctrl+v jjjj d           # 4行コメントイン(,#)
Ctrl+v jjjj c aaaa      # 4行置換
viwy                    # カーソル位置の単語を yank
viwp                    # カーソル位置の単語を yank している内容で上書き
cw                      # カーソル位置から単語の最後までを書き換える
viwu                    # カーソル位置の単語を undercase
viwU                    # カーソル位置の単語を UPPERCASE
viw~                    # カーソル位置の単語を undercase <-> UPPERCASE 入れ替え
viw!nkf -Z4             # カーソル位置の行を半角カタカナ

カーソル移動

0                       # 行の先頭へ
^                       # 行の空白以外の先頭へ
$                       # 行の末尾へ
w                       # 次の単語の先頭へ
f*                      # 次の*へ           (例 df"->"まで削除)
t*                      # 次の*の前へ       (例 dt"->"の前まで削除)
viw                     # 現在のカーソル位置の単語を選択
vi"                     # 現在のカーソル位置の"の中を選択
va"                     # 現在のカーソル位置の"の外を選択

モード

C-[                     # 挿入モードを抜ける
ESC                     # 挿入モードを抜ける

ウィンドウ

:vs                     # 垂直分割
:sp                     # 水平分割
Ctrl+w w                # 次のウィンドウへ
Ctrl+w [hjkl左下上右]    # ウィンドウの移動
Ctrl+w -                # 高さを小さく  (例 Ctrl+w 10- -> ウィンドウの高さを 10 狭める)
Ctrl+w +                # 高さを大きく
Ctrl+w <                # 幅を小さく
Ctrl+w >                # 幅を大きく
Ctrl+w =                # 自動調整
Ctrl+w r                # 左右・上下のウィンドウを入れ替え
:res 100                # 現在のウィンドウの高さを 100 にする
:vertical res 30        # 現在のウィンドウの横幅を 30 にする

特殊処理

qa                      # マクロ記録開始
q                       # マクロ記録終了 (@a で使用可能)

コマンドラインの履歴

q: または : Ctrl+f       # コマンドラインの履歴
q/                      # 検索
Ctrl+c                  # 履歴をコマンドラインに送る(編集して使えるようになる)

改行文字の変更

:%s/
/
/g                      # /Ctrl+v Ctrl+m/Ctrl+v Enter/

ファイル比較

:vertical diffsplit     # 差分を取りたいファイル
:do (diff obtain)       # もう一方のファイルから差分を取り込む
:dp (diff put)          # もう一方のファイルに差分を取り込ませる

「私は、こんな人になら、金を出す!」読了

ベンチャーキャピタル(以下VC)と一言にいっても、体系は種々あって、大きく2つに分けるとすれば会社組織と投資事業組合があります。著者の村口さんは、組織分業と会議決定を特徴とする会社組織のVCに務めた経験からダイナミックな投資事業を行うことの限界を感じ、ご自身で独立系VCである、日本テクノロジーベンチャーパートナーズを設立され数多くの企業を上場へと導いてきました。そんな村口さんの考えるVCのあり方や起業家とは何か?という問いかけに対する一つの解答がこの本で示されています。

第三章「起業家に立ちはだかる七つの壁」では典型的な失敗シナリオを架空のプロジェクトを基に芝居仕立てにして述べられています。色々参考になることはありますが、例えばプロジェクトの改善でよくみられるPDCAを回すということについて、大企業ではこの方法でうまくいくかもしれないけど、新規事業領域では役に立たないと述べられています。(PDCAにより予算計画統制をする場合に限る) 他にもラウンド毎による資金調達がちぐはぐになっていく過程など詳しく書いてありました。この章だけでも読む価値はあるので気になる方は手にとって読んでみられてはどうでしょうか。

起業家に必要な素質とは何か

初期段階のベンチャーにおいてはVCは事業だけでなく人を観るとよく言われます。それはすなわち起業家に必要な素質を持っている人に対して、VCは投資する(金をだす)ということです。本書を引用しつつ起業家に大切な心構えを自分なりにまとめてみました。

未来に対して真面目な人

何が起こるか分からない不確実な未来に目を向けられること。

顧客を発見し価値を作れる人

常に顧客の体験を観察し続けなければいけない。自分達のサービスを出すのであればそのサービスを使って、顧客の気持ちを理解しようとすること。

1週間で成長できる人

ベンチャーの世界は日進月歩ではなく秒進分歩の成長速度が求められる。1週間でも世界情勢やとりまく環境はがらりと変わっている。その変化についていくこと。

粘り強く、あきらめない人

特に困難に直面したときほど、この気持ちが大切になってきます。勇往邁進すること。

ものごとを俯瞰できる人

ビジネスでは様々な人が複雑に絡み合ってきます。そんな時、自分の立ち位置だけでなく相手の立場にたって物事を考える能力が必要になってきます。

互恵関係を結べる人

競争は物事を発展させる原動力であるが、競争で目をくらませる前に下地となる良好な互恵関係を築き上げ、いい意味での競争を行わないといけない。

組織改革のタイミングを知る人

人の採用と組織作りにはしっかりした事業基盤とタイミングが重要である。

48時間で切り替えられる人

失敗が起こった時、冷静に状況を判断し危機を乗り越えられるよう奮闘すること。

自戒を込めて書きました。これから起業する人も、もう起業してる人も、ぜひ一度読んで参考にされるといいと思います。

Healthcare Hackathon in Tokyo 3rd Report @ Nov. 8

ちょっと遅くなりましたが Healthcare Hackathon に参加したのでレポートを書きます。医療健康分野というテーマに絞った珍しいハッカソンでした。第3回は 2014/11/08 HUB TOKYO (目黒) での開催です。今回は"糖尿病"をテーマに約40名ほどの人たちが参加してました。若干ですがエンジニアの方が多かったです。

1st day

中野智紀先生の公演を聞きました。糖尿病患者はどんな悩みや問題を抱えているのか、これからの地域医療のあり方などについて話してくださいました。一番の驚きは糖尿病治療の98%は患者自身で行われているだそうです。 またいわゆる「言うことを聞かない患者」はなぜそうなってしまうのか?中野先生は以下のような問題があるのではとおっしゃっていました。

  • 良好な自己管理への障害
  • 全ての人は適切なサポートによって良好な行動ができる(現実はサポートが不十分)
  • 抑うつなど気分障害
  • ソーシャルサポートの不良
  • 地域コミュニティーの崩壊
  • 地域で支えあう基板が崩壊した

これらの問題を抜本的に解決するために“とねっと”と呼ばれる地域医療ネットワークシステムを構築されたそうです。とねっとのビジネスモデルは透析がヒントになっているそうで・・・。

チーム作り

アイスブレイクの公演が終わったあとは、ハッカソンのチーム作りです。まず希望者が自分のアイデアを1分でピッチして投票して上位10のアイデアでチームを作るという流れでした。 実際は15のアイデアのピッチで10アイデアが残った後、さらにチーム作りの過程でいくつかのアイデアが合体したりして、以下の6アイデアにまで集約されました。

  • アプリケア
  • メタボクエスト
  • Going my way
  • キッズ版糖尿病手帳
  • TEAM YAMAITACHI
  • メタボハンター

出来上がったチームでしばらく話しあいをして 1st day は終了です。

2nd day

2日目は朝10時から夜19時までという長丁場でした。1日目に結成したチームでブレストとハックの繰り返しでプロトタイプを作っていきます。 私は TEAM YAMAITACHI に所属していました。このアイデアは"患者同士がゆるくつながる匿名SNS"です。コンセプトは患者が自身の想いをSNS上に吐き出すことで心が楽になることを目指したアプリです。 開発にかける時間はほとんどなかったのでモックを作った程度の完成度でした。(他チームも同様) とても良い出来で発表までしましたが、惜しくも入賞には至らなかったです。入賞したのは、「キッズ版糖尿病手帳」と「メタボハンター」でした。

感想

2日間に渡る、私が初めて参加したハッカソンでしたが、とても有意義な時間が過ごせました。一緒にチームとして作業してくれた仲間には感謝しています。ハッカソンはエンジニアにとってとても楽しいイベントなので機会があればまた参加したいですね。

医療系ベンチャー紹介

イベント中に医療系ベンチャーの紹介があったので箇条書き程度でまとめさせてもらいます。

  • zocdoc
  • ドクターからお金をもらって掲載することで患者増
  • diet bet
  • お金をかけてダイエットする。禁煙もある
  • keas
  • treato
  • figure1
  • 医者のインスタグラムバージョン 疾病の写真を掲載している

ヘルステックスタートアップイベントに参加しました

参加者はだいたいこんな感じ。

  • 150人から200人ほど
  • ヘルスケア領域の人たちが 1/3
  • IT業界の人たちが 2/3
  • その他

セッションスペースでは4つのトピックでそれぞれ1時間ほどの話しがありました。以下リストです。

  • なぜ今ヘルステックスタートアップがアツイのか
  • 遺伝子系スタートアップの今とこれから
  • 米国の製品事例に学ぶウェアラブルデバイスでスタートアップするための方法
  • ヘルステックスタートアップはぶっちゃけ儲かるのか?

自分なりに箇条書き程度にまとめました。

なぜ今ヘルステックスタートアップがアツイのか

登壇者: YOSHIZAWA MIYAKO 慶応の看護学部学生 BEENOS や THE_BRIDGE で記事を書いたりしている。 アメリカの流行を追っかけている。

世界中で著名な人たちがヘルステック分野に進出してきている。 例えば Yahoo CEO マリッサメイヤーPayPal創業者 マックスレブチン など。

ヘルステックに投資する VC も増えている。

  • YC
  • KPCB
  • ROCK+HEALTH

ROCK+HEALTH は登竜門的な存在になってきた。

これほどヘルステック分野が熱い理由の一つにオバマケアの影響がある。

  • 保険 --- アメリカの保険は高い
  • 予防医療 --- 金が掛かり過ぎるので予防に興味がある
  • 病院のシステム化

ウェアラブルについての意見

女子大生がつけてみた感想はださい、ただの万歩計だと思った。結局目覚まし代わりなどに使うことに・・・。スマホで取れるデータをどう活用するかというソリューションが必要になってくる。

スマホで健康データを入力することについて

アメリカでは 20% が病院の検査データをスマホで管理しているし、予約も医療費もスマホになってきている。こういったサービスは日本では難しいだろう。情報ポータルは日本でも盛り上がるんじゃないか、ちょっとださいけど。

面白いと思うサービスは?

Seven Cups of Tea — オンラインでセラピストに相談、セラピストは誰でもなれる。 どうでもいい悩みを誰かに話したい?慣れ合い系とかも伸びるかも。

遺伝子系スタートアップの今とこれから

(株)Genequest 提供してるサービス 唾液採集キットで測定、Web で結果閲覧できる。判定できる内容はこんな感じ。

  • 持病リスク
  • 祖先ルーツ
  • 体質
  • 不足しがちな栄養素

(株)FiNC 40名くらいの会社、東大生10人、慶応早稲田10人という風に専門の学生採用に力を入れている。

オンラインでダイエットをサポートするアプリ。 栄養士(120万人)やトレーナーが指導する。

なぜ遺伝子ビジネスは注目されている?

3000億円の解析機器が数10万円になったという技術革新によるところが大きい。今もどんどんと値段が下がっている。

遺伝子ビジネスはどうなるか?

生体情報がスマートフォンに集約されるようになり、自分で自分自身の健康を考えるような時代がやってくる。アメリカやヨーロッパでは遺伝子系サービスは規制が多いため厳しいかもしれない。中国では医療機関を通さないとダメなど。日本は厚生労働省ではなく経済産業省が力を持っているので規制の方向性が強まらないかもしれない。

米国の製品事例に学ぶウェアラブルデバイスでスタートアップするための方法

登壇者: 岡島康憲 元NEC、現在、岩渕技術商事会社 大学、企業向けにハードウェア製造販売をしている。

まず製品群をジャンルに分けて整理、製品を作るためのポイントを紹介して、ビジネス化を支援する仕組みを紹介する。

ハードウェアをジャンルに分けると

  • フィットネス --- スポーツ
  • より適切な動きをする
  • ヘルスケア --- 睡眠、姿勢など
  • より健康的になる
  • メディカル --- 治療、予防、逆流性食道炎の抑制(FDA申請中)
  • 医療行為をサポートする

ヘルスケア系ハードウェアの例

Nike Fuelband の場合

ハード側

  • センサー
  • バッテリー
  • マイコン

アプリ側

  • ログ表示
  • SNS

Nest Learning Thermostat (Nest Labs) の場合

アメリカは部屋がでかいので真ん中に監視デバイスを置くことによって各部屋の温度を自動調整する。

  • ハードウェア視点:AIを搭載し消費電力を下げることができる
  • ユーザー視点:エコロジー!!エコロジー!!かっこいい!

ユーザーはハードのスペックに感心はない

ハードウェア連携サービスを作りたくなった時に考えること

ハードウェア無しでもできないかを自問自答すること。サービスが受け入れられるかどうかのトライアンドエラーを試してみる。ラピッドプロトタイピングは粘土と100均のアイテムでできる。クラウドファンディングはハードを作るためのお金集め、ではなくどれくらいの需要があるかのテストマーケティングをするのがいい。

どうやってアイデア段階のものを製造まで持っていくか?

現状は人づてによるところが大きい。

ヘルステックスタートアップはぶっちゃけ儲かるのか?

登壇者は2人いて対談のような形式だった。

じぶんラボ(株)

登壇者: 田口敬 提供しているサービスはウンログ。 うんちくんが可愛いので女子高生に受けるのではと思った。

うんちから広がるサービス 腸内細菌DNA解析 企業へのプロモーションなど

(株)ウィット

登壇者: 天辰次郎 提供しているサービスはあすけん。

真面目に年配の人に健康管理して欲しいという思いでアプリを出したら、女性に受けたのでピボットした。女性ユーザーが 80% を超えており、ダイエット活用として打ち出している。男性は運動で痩せようとする、食事はサラダだけ食ってりゃいいだろ的な考え。 あすけんの収益源は B to C で広告、課金、物販、リアル、B to B で法人利用、API提供など。

ヘルスケアといえば自分の健康というアイデアが簡単に思い浮かぶが、赤ちゃんや犬など他人への関心という視点でアイデアを出してもいいのではないか?

ブースセクション

ここから先はブース展示していた企業さんの中からいくつか抜粋して紹介します。

Welby

2013年11月にローンチ。 食事を記録して栄養士さんから指導を受けられるサービス。 Web 側は閲覧だけできる。アプリ側で記録する。

MedPeer

医者同士のSNS 具体的なサービスで人気のあるもの

  • 薬剤評価掲示板 --- 価格.com の薬版(ピンポイント広告)
  • 症例相談 --- 医者が医者に相談(クリニックのお医者さんなどが使う)

政治上の問題はないの?

ニックネームで表示されるから大丈夫。

あすけん

写真を取ると栄養士がアドバイスをくれる。 写真の解析をSONYと共同で行っているが精度はまだまだ低い。 現時点ではユーザーが細かくデータを入力する必要がある。 1000人の栄養士と30万人のユーザ。

pharumo

電子版のお薬手帳サービス。 60店舗の薬局で導入済み。

高速検索の Ag を入れてみた

プログラムを書いてると検索という行為一つで大きく生産性が変わることをプログラマーは知っています。僕は今まで grep を使ってた、というか grep しか知らなかったのですが同僚から ag について教えてもらったのでいれてみました。とにかく検索が爆速でびっくりです。

インストールと設定

超カンタンです。

$ brew install ag

検索対象外にしたいファイルやディレクトリを ~/.agignore に書きます。ag はこれができるのがいいですね。

~/.agignore
1
2
3
4
5
6
7
8
9
10
11
12
13
*~
*.swp
*.sql
*.tags*
*.tmp*
*.old
*.pdf
*.log
.git
.svn
jquery-*.js
jquery.js
zsh-completions

補完を有効にする

zsh を使ってるのが前提ですが、ag のオプションの補完ができるようにします。またこれを入れると ag に限らず便利な補完機能がもれなくついてきます。どのようなコマンドの補完があるかはインストールすれば分かります。とりあえず便利なので入れておいて損はない。

$ brew install zsh-completions

以下を ~/.zshrc に追加します。ちなみに僕はここで少し躓いて時間を食ってしまいました。僕は zsh の設定ファイルを分割してそれぞれ読み込むようにしているのですが、autoload の実行が fpath よりも前にされていたので補完機能が働いていませんでした。autoload は fpath の後に書きましょう。

1
2
3
fpath=(~/.zsh/functions/Completion(N-/) /usr/local/share/zsh-completions /usr/local/share/zsh/functions ${fpath})
autoload -U compinit
compinit -u

zcompdump をリビルドします。

$ rm -f ~/.zcompdump; compinit

シェルの再起動で補完が有効になります。

Emacs から ag を使う

さて高速検索の ag ですが、普段使ってるエディターと組み合わせることで真価を発揮します。vim の人はググってもらうとして Emacs ユーザーは helm-ag をインストールすれば幸せになれるんじゃないでしょうか。

インストールはいつもの通り、パッケージリストから探してインストールします。後は特に設定をしないでも使えます。起動は M-x helm-ag です。毎度打つのは面倒なので適当にキーバインドするといいでしょう。

Highlight-symbol が便利

ちょっとした事なんですが、プログラムを書いてると、「このシンボルを目立つようにマーク付けしておきたいなぁ」なんて思うことがあります。関数とか変数とか関係なくちょこっとマークしてそれを常にハイライトしておくんですね。highlight-symbol を使うとこれが実現できそうです。

パッケージリストにあるのでさくっとインストールして下記を .elisp などに書いておけば動きます。(キーバインドはお好みで)

1
2
3
4
5
6
(require 'highlight-symbol)
;; 使いたい色を設定、repeat してくれる
(setq highlight-symbol-colors '("DarkOrange" "DodgerBlue1" "DeepPink1"))
;; キーバインドの設定
(global-set-key (kbd "C-o") 'highlight-symbol-at-point)
(global-set-key (kbd "M-C-o") 'highlight-symbol-remove-all)

Sinatra アプリを Heroku で動かすまで

環境

以下のような環境で動かします。

  • Sinatra
  • Heroku
  • PostgreSQL
  • Unicorn
  • ActiveRecord

初期設定

まず Ruby と Git などの環境を整えます。環境が構築できたら Sinatra で作るアプリ用にディレクトリを作ります。そこで $ bundle init して Gemfile を作成します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
source "https://rubygems.org"
ruby '2.0.0'

gem 'sinatra'
gem 'haml'
gem 'unicorn'
gem 'pg'

# ActiveRecord
gem 'sinatra-activerecord'
gem 'activerecord'

group :development, :test do
  gem 'rake'
  gem 'sinatra-contrib'
  # Foreman
  # To run the app from Procfile.
  gem 'foreman'
end

Gemfile ができたらおなじみの以下コマンドで gem をインストールします。

$ bundle install --path vendor/bundle --without production

Heroku で動かすために

次に Heroku で動作させるために必要な設定を行っていきます。config.ruunicorn.rbProcfile の3つが必要です。ちなみに Gemfile に foreman という gem があったかと思いますが、こいつは Procfile を読み込むことで複数のプロセスを管理できるツールです。こちらに詳しく書いてくれています。

foreman でアプリケーションを動かす

config.ru
1
2
require './main.rb'
run App.new
config/unicorn.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
worker_processes Integer(ENV["WEB_CONCURRENCY"] || 3)
timeout 15
preload_app true

before_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
    Process.kill 'QUIT', Process.pid
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.connection.disconnect!
end

after_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.establish_connection
end
Procfile
1
web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb

ローカルで動作確認

ここで一度ローカルで動かしてみましょう。Sinatra のルートディレクトリにおいて main.rb などの名前でファイルを作成してみます。

main.rb
1
2
3
4
5
6
7
8
require 'sinatra'
require 'sinatra/base'

class App < Sinatra::Base
  get '/' do
    'Hello, World!'
  end
end

foreman という gem で起動してみます。

$ bundle exec foreman start

これで http://localhost:5000 にアクセスすれば Sinatra アプリの動作確認ができるかと思います。

Heroku にデプロイ

ここまでのアプリを一度 Heroku にデプロイしてみましょう。

$ heroku create APP_NAME
$ git add .
$ git commit -m "first commit"
$ git push heroku master

問題がなければ http://APP_NAME.herokuapp.com で公開されているでしょう。

PostgreSQL を使う

さてここからデータベースを使った Sinatra アプリの作成に移ります。上記の Heroku デプロイまでは比較的つまづくことなくできるのですが、DBを使う段階で少し嵌ってしまいました。最初は database.yml を使う方向で実装していたのですが(他のサイトでもそのようにしているところがたくさんある)うまくいきません。というのも Heroku はどうやら database.yml を自動的に作成するらしくそちらの設定がうまくできなかったためです。なので今回は使わない方向で実装しています。

下準備として PostgreSQL でデータベースを作成しておきましょう。ローカルに構築する方法は割愛します。Heroku 上に作成するには以下のようにします。

$ heroku addons:add heroku-postgresql:dev

できたら Rakefile を作成します。

Rakefile
1
2
require './main.rb'
require 'sinatra/activerecord/rake'

次にローカルでマイグレーションファイルを作成します。適当に users テーブルを作ることとします。

$ bundle exec rake db:create_migration NAME="create_users"

db/migrate 配下にマイグレーションファイルが作成されているのでこれを編集します。

1
2
3
4
5
6
7
8
9
10
11
class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :registration_id
      t.string :name
      t.string :email

      t.timestamps
    end
  end
end

データベースに接続

この段階で database.yml に DB の接続情報を設定して作業したのですが、ローカルではうまくいくものの Heroku で動きませんでした。なので DB の接続情報を main.rb ではなく models/ar.rb というファイルに切り出すことにしました。ar.rb を以下のようにしましょう。

models/ar.rb
1
2
3
4
ActiveRecord::Base.establish_connection(ENV['DATABASE_URL'])

class Ar < ActiveRecord::Base
end

ここでのポイントは DATABASE_URL です。Heroku はこの値に設定された URL をデータベース先として接続しにいきます。$ heroku config とすれば確認できます。 またローカルで起動したときには DATABASE_URL はローカルの PostgreSQL に接続して欲しいですね。そのようにするためには .env ファイルを作成してそこに設定すればいいです。.env ファイルは .gitignore に追加しておきましょう。

.env
1
DATABASE_URL='postgresql://user_name:@localhost/db_name'

マイグレーションファイルに従ってデータを作成します。

$ bundle exec rake db:migrate

ここまで問題なくできればローカルの環境は終わりです。最後に Heroku にアップしましょう。

再度 Heroku にデプロイ

さて、いよいよです。コマンドが通ることを祈ってデプロイしてください。

$ git push heroku master

参考

本記事を書くにあたって参考にさせて頂いたサイトです。ありがとうございました。