Kaizen Chat とは

Kaizen Platform 内でユーザー同士がコミュニケーションを取ることができるサービス。

  • Kaizen Platform のユーザー
    • カスタマー
      Kaizen Platform と契約し、 A/B テストツールや Growth Hacker によるサイト改善のデザイン案を募集
    • Growth Hacker
      募集に応じてカスタマーサイトのデザインを改善するデザイン案を投稿
    • Kaizen Platform 社員
      カスタマーと Growth Hacker の間の調整役

Kaizen Platform 内のユーザーが外部のツールや電話を利用して行っていた伝言ゲーム的なコミュニケーションを置き換えて、直接コミュニケーションを取ってもらうようになることが目標。

サーバーサイド 2.5 人、フロントエンド 2 人で 2 ヶ月くらいで作った。

構成

数多く存在しているマイクロサービスの中の一つとして実装。

フロントエンド

  • React
  • 多分他にもバズワード的な仕組み・フレームワークを使ってる(後で調べて書きます)

バックエンド

  • Ruby 2.3
  • Rails 5
  • MySQL 5.7
  • Sidekiq
  • Redis
  • Pusher (SaaS)

Rails 5 で開発

Rails 5 は Release Candidate だったが利用することに。

リリース直後に Rails 5 出て将来的に Rails 4 から Rails 5 へのアップデートにリソースを割くの避けたかった。(別の Rails アプリを 3 から 4 に上げたときには大変だった…)

Rails 5 で開発して困ったこと

あんまりないが強いて挙げるとすれば以下。

  • 個人的に好きで前職の頃から使ってた gem ( モデル層のバリデーションのテスト書くのが楽になる accept_values_for ) が Rails 5 対応してなかったので Pull Request 送ったりなど
  • ActiveResorces など Rails 5 対応が遅かった gem もあったが github 直接参照して対応版がリリースされたら rubygems.org を見るように変えるなど(普通です)
  • 社内の Rails プロジェクトで共通して使ってる gem を Rails 5 対応させるなど

WebSocket は Pusher (SaaS) を利用

Pusher を使った。 ActionCable 使って自前実装するのは考えなかった。

  • Rails 5 なら ActionCable では????
    • 急なアクセス増などを考えて SaaS を使うことに
    • WebSocket に関してはインフラのことを考えなくてよくなる
    • 無理に自前実装せず、少々金がかかったとしても、外のリソースを利用できるときは SaaS を使う(社風)
      大人の事情で使えない、とかがないのがよい
  • フロントエンド側も Pusher から SDK が提供されており楽できた(はず)
Pusher との通信の詳細
  • CRUD のうち Read だけ Pusher 経由で行う
  • Pusher は Create/Update/Delete も担えるけど Rails アプリと Pusher とクライアントの間のデータの流れを一方向にしたかった

図

感想

Sidekiq 速い

  • 社内で初めて Sidekiq を導入したけど速かった
  • Thread で並行処理をするのでスレッドセーフな作りにしないといけない(利用 gem 含む)
  • capistrano-sidekiq が sidekiq 本体と機能かぶってるところがあるのがちょっと残念

マイクロサービス間の通信が課題

  • マイクロサービス間でなるべく疎結合になるように、相手のサービス側の DB を直接参照しないように頑張る(気合い)
  • スピードが遅くなってしまうところはキャッシュする

BFF 的な考え方必要

  • ActiveModelSerializers 使ってると Serializer が乱立して収集付かなくなる
  • Frontend から必要なフィールド渡してもらってそれをシュバッと返すおシャンティな API にしていきたい

今後

  • モバイルクライアントの開発
    チャットなのに携帯電話で返信できないとかダメですよね…
  • 通知の充実
    チャットなのに通知こなくて気がつけないとかダメですよね…
  • 画像ハンドリングの充実
    負荷やジョブとの戦いに突入します。

Kaizen はチャットの会社じゃないので、自分たちがチャットの機能を作ることはどんな意味があるのか、ということを考えながら機能追加していきたいですね。

なお Kaizen Chat は Kaizen Platform にアカウントをお持ちの方でしたらどなた様でも無料でご利用いただけますのでもしよかったら触ってみてください。僕にファンレターを送ることも出来ます。

また Kaizen Platform, Inc. は本日( 2016-09-08 )から開催されている RubyKaigi 2016 にブースを出しておりますので CTO (リクルート時代に chouseisan 作ってた)やエンジニアと話してみたい人、 Kaizen Platform ロゴ入り手ぬぐいが欲しい人、僕のアイコンのステッカーが欲しい人はお気軽にお越しください。

乗るしかない、このビッグウェーブに、という感じで Let's Encrypt を使って無料の証明書をゲットし、ブログを https で公開するようにした。

証明書の設定とか難しそうで敬遠してたのだけど、実際やってみると思ったより簡単だったが、いくつかはまりポイントあったので書いておきます。

自サイト内の 'http://' を 'https://' に書き換える

CSS やテンプレート内で http://hogehoge.com となっているところを //hogehoge.com に変える。本文中の画像の URL も 'https://' に書き換える。ちまちました作業。 Amazon の画像の URL も https に対応したドメインに変えないといけない。

S3 に独自ドメイン当てて使っている場合、ここも証明書がいる

画像は S3 から配信していて、独自ドメイン( resources.portalshit.net )を当てて使ってたんだけど、ブログ本体を SSL にしたのに画像配信サーバーとの通信が非 SSL なので mixed content といって怒られる。

S3 単体で独自ドメインを使って SSL 通信することはできないので、 CloudFront を経由して CloudFront に Let's Encrypt で作った証明書を登録して使う。この S3/CloudFront 用の証明書の発行・登録のプロセスが若干面倒くさい。更新のときに手順忘れてそうで心配。 Let's Encrypt プラグインを使うようにした方がよさそう。

他、 Route53 で CNAME 当てて S3 に向けていたのを CloudFront を向くように変える必要もあり。

個人ブログごときで CloudFront を使うことになるとは思わなかった。

Lokka の管理画面が SSL 通信に対応してない

やっと mixed content の警告消えて記事を書こうとしたら、なんと管理画面が SSL 非対応でブログにログインできない。 Padrino の url メソッドが protocol の指定を出来ないようだった。オーバーライドとか試してみたけどうまくいかなくて困ってたところ、 rack-ssl-enforcer という gem を発見した。こいつを RACK_ENV=production のときだけ use するようにして乗り切った。 'http://' となってるのを Rack 層でえいやっと 'https://' に書き換えてくれる。

感想

Let's Encrypt 、本当に簡単で最高便利だと思った。オレオレ証明書発行するより楽っぽい。いい世の中になったと思う。ただ有効期限が短いので更新を忘れないようにしないといけない。更新の自動化までやってしまいたい。

ウェブサーバーを Nginx から H2O に変えるのとかまでは手が回ってないので自動更新と一緒にやりたい。

ローストビーフ

最近ほとんど毎週ローストビーフ作って食べてる。近所に激安スーパーのルミエールという店があって、オーストラリア産の牛もも肉が150円/100gくらいで売ってる。めっちゃ安い。

オーストラリア産の牛肉は脂身が少なくてさしとか皆無なので普通に焼いて食べるには固すぎるけど、ローストビーフのような真ん中はレアの状態で、かつうすーくスライスして食べるのにはちょうどよい。

前もローストビーフについての記事書いてるけど(ローストビーフうまい)、最近知見がたまって味が安定してきたので改めて書いておく。

材料

  • 牛もも肉ブロック
  • こしょう
  • にんにく
  • 国産牛の牛脂(あれば)
  • 赤ワイン(あれば)

道具

大体以下がそろってるとよい。

  • パン切り包丁
  • 鉄のフライパン
  • 250℃で焼けるオーブン

手順

  1. 肉を買ってきて塩とこしょうをすり込み、スライスしたにんにくをはっつけてラップでくるんで冷蔵庫で1時間くらい寝かせる
    • 塩はちょっと引くくらい振った方がよい
  2. 冷蔵庫から取り出して鉄のフライパンを熱し、白い煙が出てくるくらいまで温まったら油をひいて一気に焼く
    • テフロンでこれやると多分すぐフライパンがダメになる
  3. 表面すべてに焼き色がついたら赤ワインかける
    • 赤ワインなければ省略してもよい
  4. ワインの水気がなくなったら火から離す
  5. オーブンに入れて 250 ℃で 16 分くらい焼く
  6. オーブンから取り出してすぐには切らずに 10 分から 20 分くらいアルミホイルにくるんで休ませる
    • すぐに切ると肉汁が出できてダメ

これで大体完成。ソースとかは作ってもよいけど、わさび醤油とかで十分うまい。テキトーな焼肉のタレでもよい。

CHANGES

前書いたやり方では下準備のときにニンニクをすりおろして肉に揉み込んでたけど、ニンニクは焦げつくのでフライパンで焼くときによくないことが判明してすり込むのやめた。スライスしてはっつけるくらいでよい。

ハーブ類もなくても良いことに気がついてやめた。畢竟するに我々は日本人なのだから、肉はわさび醤油で食べるのが一番うまい。わさび醤油で食べるときにハーブの香りは邪魔なのである。なくてよい。

また以前はオーブンを使ってなかったけど、オーブンを使わずに表面を焼くだけの作り方では中の方までなかなか火が通らず牛たたきみたいになってしまうのでオーブンを使うようになった。文明の利器は使うべきである。

番外編

バーベキューのときにローストビーフするのも良い。炭火で焼くと中の方までじんわり火が通って最高。↑の手順1のあと、バーベキューの網の上に載せて焼く。網焼きの場合は表面がちょっと焦げ気味になるくらいまで焼くとちょうど良い。いい焼き色になったらアルミホイルで包んで10分から20分くらい休ませる。赤ワインとかぶっかけなくても十分うまい。

薄切りしなければ顎が崩壊

切り分けるときにはパン切り包丁が最高。普通の包丁ではうすーく切ることが出来ない。ローストビーフのうまさは肉の薄さで構成される部分が 5 割くらいあると思う。特にオーストラリア産牛のもも肉のような赤身の中の赤身といえるような脂がほとんどない硬い肉は、薄くないと顎が疲れるだけで食べられたものではない。ローストビーフ用専用包丁もあるっぽいけど高いのでうちはイオンで買った1500円くらいのパン切り包丁使ってる。パンも切れて便利。

焼肉に行くと安いところでも一人3000円くらいは絶対かかるし、お酒飲んだら5000円とか軽く飛んでいくと思う。しかも出てくる肉は合成肉みたいなやつ。それだったら安い肉買ってきて自分で焼くのが良いと思う。とても満足感がある。

追記

記事を書いたあとに調べてみたら、肉に塩を振ってから時間をおくのはダメっぽい。肉は焼く直前に塩を振らないと水分が抜けて固くなってしまうそう。加えて焼く少し前に冷蔵庫から取り出して室温に戻さないとダメっぽい。なのでにんにくのスライスをはっつけつつ室温に戻して、塩とこしょうは焼く直前に振るのが正解だった。

福岡でダンボール捨てるの本当につらい。制度が車を持ってることが前提になってる。古紙やダンボールは通常のゴミ収集では回収してもらえず、公民館や小学校の校舎に併設されているゴミステーションまで捨てにいかなければならない。

かつて中洲で一人暮らししてた頃、ダンボール捨てるために1キロ以上歩いて捨てに行かないといけなかった(車は持ってなかった)。小さいやつならまだしも、大きな家具のダンボールゴミを捨てに行くのはめちゃくちゃつらかった。ダンボールの角で指を切ったりして、泣きながらゴミを捨てに行ってた。

福岡市、大都市圏からの移住を歓迎してるけど、ことダンボールゴミの捨て方に関しては首都圏や近畿圏のような車がなくても成り立つような生活様式ではないので注意が必要。

嫁さんの携帯に知らないクロアチア人から SMS が届いた(文章は英語)。内容を読むと去年俺がクロアチアに忘れてきた iPhone 5 を悪い奴から買ったと書いてある。

嫁さんの携帯に SMS が来たのは、 iPhone なくしたあと紛失モードにしてて、ロック画面に「拾った人はこの番号に連絡してくれ」と表示するようになってたから。

事情知らなくて買ったので盗品だったら返すけど、もし自分が持っててもいいんだったらアクティベーションできなくて困ってるので助けて欲しい、とクロアチア人氏は言う。

もう新しい電話持ってるしクロアチアから日本までの送料高いからいらないので使ってくれ、アクティベーションできるように紛失モード解除するよ、と返す。

何回か Facebook メッセンジャーでやりとりして、最終的に iCloud の Find my iPhone からなくした iPhone を削除してクロアチア人氏が iPhone のアクティベーションに成功した。

最初 SMS が来たとき、嫁さんは気持ち悪がって無視しようとしたけど、俺は自分の iPhone を誰かが引き継いで使ってくれようとしてるのがなんか嬉しかった。

それにしてもなくしたのは一年以上前なのに何で今頃連絡きたのか謎。あくまで想像だけど、クロアチアで iPhone なくしたときバスの中に忘れてきたので、一年間はバス会社か現地警察が落し物として保管してくれてて、保管期限が過ぎて売りにだされて市場に出回り、転売を経て件のクロアチア人氏の手元に渡ったのだと思う(落としたのはクロアチア南端のドゥブロヴニクだったけど、 SMS を送ってきたクロアチア人氏は首都ザグレブ在住だった)。もし想像通りだとしたら、クロアチアはやっぱり良いところだなぁという感じがする(秩序があるという意味で)。ギリシャだったら一瞬でブラックマーケットに流れてると思う。

au の SIM ロックがかかってるのでそのままでは使うことは出来ないと思うけど、遠く離れたクロアチアで自分の iPhone が余生を過ごすと思うと何だか幸せな気持ちになってきた。幸せな余生を送って欲しい。

糖質制限やって(糖質制限で脱デブ成功しました)、体重は9kgくらい落ちた。現在だいたい71kgくらいで、休みの日に食べ過ぎたりすると73kgくらいになることもあるけど、71kg前後をキープできている。BMIも24前後で真人間。

糖質制限をやってよかったのは、白米や麺やパンを腹一杯食べなくても満足感を得られるということを体に覚えさせられたことだった。これさえ頭がわかっていれば太ることはないと思う。肉や乳製品をたくさん食べても、炭水化物を食べなければ不思議と体重は増えない。

糖質制限、なんといっても金がかかる。カロリーや満腹感を得るためには炭水化物が一番経済的だということがよくよくわかった。納豆のような安いタンパク質でも、それだけで空腹を満たそうとするとかなりたくさん食べなければならず、結構な金額になる。

炭水化物ばかり食べることで太ったり糖尿病になったりする。経済的に余裕があり糖質以外で空腹を満たすことができる金持ちの方が太らず糖尿病にもならず健康でいられる。

貧者の糖質制限としてはピーナッツが良い。ピーナッツはアーモンドやくるみ、カシューナッツで構成されるミックスナッツよりも糖質が多いが、ミックスナッツは何しろ高い。Amazonでまとめ買いしても結構する。100gで300円前後が相場。ピーナッツだど100gで100円くらいでコンビニやスーパーで買える。このくらいだと気軽に買えてよい。ピーナッツは糖質が多いとはいえ、100gも食べれば腹一杯になるので食べ過ぎることがない。結果的に糖質の摂取量を少なく抑えられる。とはいえミックスナッツはうまいのでお金持ってる人はミックスナッツ食べましょう。

Google Reader 死んだ後、 The Old Reader 使ってる。 Feedly は高すぎてとてもじゃないけど使えなかった。無料で使うという手もあるけど、自分にとってフィードリーダーは気になるブログを放り込んどいて斜め読みし、後からおぼろげな記憶を頼りにキーワード検索して情報にアクセスする場所なので、全文検索できなかったら意味なかった。なので当然有料プランを利用することになる。

The Old Reader のプレミアムアカウントは安くて、初年度は年間 10 ドルで使える。見た目もスッキリしていてその名の通り古き良き Google Reader を彷彿とさせる。前 Feedly をちょっと試したときは UI がリッチすぎて重く使いたいという気にさせられなかった。このくらいシンプルな方がフィードのコンテンツを読むという用途には向いてると思う。購読対象のブログの UI がリッチすぎるので中身だけ手っ取り早く読みたくてフィードリーダーを使っているのだから、フィードリーダー自体の UI がリッチになっていったら本末転倒感ある。少なくとも自分にとっては。

The Old Reader はフィードの更新間隔がクソで、プレミアムアカウントのユーザーが登録しているフィードは 30 分おきにフィードをフェッチするとあるんだけど、全然そんなことなくて、平気で 4 時間遅れたりする。偏りがあって、頻繁に更新されるブログのフィードは頻繁にチェックされるけど、頻繁に更新されないブログのフィードはあまりチェックされないみたい。クローラーのつくりとしては正しいのかもだけど、利用者としては不満が残るなぁ。