Jekyll2020-02-10T05:03:10+00:00http://blog.deraru.com/feed.xmlRunoLogderaruのブログ。技術系の記事や旅行記、自分の考えなどを書いています。
deraruFindy Tech Camp 2020 Spring に参加して jpx_industry_code Gem を作りました2020-02-10T04:00:00+00:002020-02-10T04:00:00+00:00http://blog.deraru.com/tech/findy-tech-camp-2020-spring<p>日頃からお世話になっている <a href="https://findy-code.io" target="_blank" rel="noopener noreferrer">Findy</a> さんの開発合宿、 Tech Camp 2020 Spring に参加させてもらいました。</p>
<p>今回の開発合宿のテーマは「OSS開発」ということで、OSSに関することであればなんでもOKとなかなか幅広いテーマでした。</p>
<p>当日の朝まで何をするか決め切れていなかったのですが、やはり自分が直近で使いたいものにしようと思い、東証の業種コードのマスターデータ(そう、みなさんご存知の通り PDF ですね!)を手軽に扱えるようにするGemを作ることに。</p>
<p>東証が公表しているマスターデータをコピペで持ってきて、全件取得機能と1件取得機能を実装し、Gemとして公開するまで2時間程度。開発合宿の開発時間としては12時間ほど用意されていたので、残りの時間は作ったGemを使ったデモ用APIの開発、READMEの用意、Spec実装とCI設定、発表用資料作りなどをやり、また八ヶ岳の-10度近い気温を堪能しました。</p>
<p>成果物は <a href="https://github.com/ai-capital/jpx_industry_code" target="_blank" rel="noopener noreferrer">ai-capital/jpx_industry_code: JPX industry code gem</a> においてあります。</p>
<p>参加者それぞれが思い思いのOSS活動をしていて、ちょっとしたハッカソンの雰囲気もあり、とても良い開発合宿に参加させてもらいました。</p>deraru日頃からお世話になっている Findy さんの開発合宿、 Tech Camp 2020 Spring に参加させてもらいました。Foretop, Inc. がシードラウンドの資金調達を行いました2019-05-28T00:00:00+00:002019-05-28T00:00:00+00:00http://blog.deraru.com/announce/foretop-raised-seed-round-funding<p><a href="/announce/serve-as-cto-at-foretop">私がCTOを務める</a> <a href="https://foretop.ai" target="_blank">Foretop, Inc.</a> (Sunnyvale, CA) ですが、この度 <a href="https://prtimes.jp/main/html/rd/p/000000009.000029199.html" target="blank">シードラウンドの資金調達を行いました。</a></p>
<p>SaaS・AIスタートアップの支援に特化したVCである、 <a href="https://reality.vc" target="blank">Reality Accelerator</a> 様にご出資いただきました。</p>
<p>ご出資していただいた Reality Accelerator 様、またそのLLP様に感謝を申し上げるとともに、 Foretop, Inc. のCTOとして、ますますサービスの成長を加速させていかなくてはと、身が引き締まる思いです。</p>
<p>直近では、東京大学の博士課程を間もなく修了見込みの方をデータ分析チームに迎え、これまでとは全く異なるデータ分析ロジックの採用したプロトタイプの開発を始めております。</p>
<p>また、システムアーキテクチャの見直しにより、コア部分以外の開発をベトナムでのオフショア開発に切り替え始めており、 Foretop, Inc. のコア開発に開発チームが集中できる環境の整備を進めております。</p>
<p>1年どころか明日の状況も不確かなベンチャー・スタートアップ業界ではありますが、そういったベンチャー・スタートアップ業界の水先案内人になるようなサービスを、 Foretop, Inc. はデータ分析によって生み出してまいります。</p>
<p>今後とも皆様のご支援、またご指導のほど、よろしくお願いいたします。</p>deraru私がCTOを務める Foretop, Inc. (Sunnyvale, CA) ですが、この度 シードラウンドの資金調達を行いました。Foretop, Inc. (Sunnyvale, CA) のCTOに就任しました2019-04-01T00:00:00+00:002019-04-01T00:00:00+00:00http://blog.deraru.com/announce/serve-as-cto-at-foretop<p>2019年4月1日から縁および紆余曲折あって、 <a href="https://foretop.ai" target="_blank">Foretop, Inc.</a> (Sunnyvale, CA) でCTOを務めることになりました。</p>
<p>最後の雇われ仕事を退職したのが2013年7月なので、約6年ぶりのフルタイムジョブです。といっても、特にこれまでと大きく活動が変わることはありませんが。VISAも無いので日本で仕事しますし。</p>
<p>簡単に Foretop の紹介をすると、膨大なスタートアップや投資データを解析し、将来有望な技術やスタートアップ、あるいは先見性や技術理解度の高い投資家を発見できるようにする、シリコンバレーのスタートアップです。</p>
<p>MVPの開発が終わり、数年以内のExitを目標に再度アクセルを踏み込み始めたフェーズでの参画です。創業社長の思いとプロダクトに惹かれ、徐々に主要なメンバーも集まり始めており、楽しく刺激的な仕事をこなしていきたい気持ちでいっぱいです。</p>
<p>直近のタスクとしては、システム安定化のためのMVPのフルリプレイスを予定しています。ベンチャー投資に興味があってかつ、 Go や React、データ分析や機械学習をやりたい方は是非ご連絡ください。人材は積極的に募集しています。</p>
<p>中長期的なタスクとしては、データ収集、データメンテナンス、データ分析、開発の各チームの組成と、データ分析基盤づくりを抱えています。いずれも取り組みがいのある課題ですので、我こそはというリーダーの方もご連絡ください。</p>
<p>そして最後に、このどスタートアップの段階のCTOを引き受けた僕の最大の仕事は、次のステージで次のCTOにバトンを渡すことだと考えています。世界中のすごい人達に会うのが楽しみです。</p>deraru2019年4月1日から縁および紆余曲折あって、 Foretop, Inc. (Sunnyvale, CA) でCTOを務めることになりました。モデルの既読/未読管理を行う Shiroyagi Gem を作った2017-12-18T15:00:00+00:002017-12-18T15:00:00+00:00http://blog.deraru.com/tech/about-shiroyagi-gem<p>Rails 用の既読/未読管理 Gem は色々ありますが、専用のテーブルが必要だったりとやや重量級の Gem が多かったので、軽量でシンプルな既読/未読管理用の Gem を作りました。</p>
<p>そして作った Gem はいまお手伝いしている Findy さんに寄贈しました。</p>
<p><a href="https://github.com/Findy/shiroyagi">Findy/shiroyagi: Read/Unread status management module for ActiveRecord</a></p>
<p>Shiroyagi の名前の由来は「やぎさんゆうびん」という童謡からとりました。黒ヤギさんが白ヤギさんからの手紙をむしゃむしゃ食べまくる、皆さんご存知の童謡です。</p>
<h1 id="少し解説">少し解説</h1>
<p>できるかぎり小さく、最小限の機能にしたかったので、該当のモデルのレコードが既読状態なのか未読状態なのかのみを管理することにしました。</p>
<p>当初は状態管理用のフラグを作り、既読状態であればフラグを立てるという方式で作り始めましたが、せっかくなので既読状態にした日時が分かるようにし、その日時の有無で状態管理をするようにしました。</p>
<p>結果として <code class="language-plaintext highlighter-rouge">DATETIME</code> 型の <code class="language-plaintext highlighter-rouge">read_at</code> というカラムを既読/未読管理を行いたいモデルのテーブルに追加するという形になりました。</p>
<p>メインのモジュールには既読/未読周りで一般的に使われるであろうメソッドを実装しました。</p>
<ul>
<li>既読状態のレコードを取得する</li>
<li>未読状態のレコードを取得する</li>
<li>既読状態のレコードの件数を取得する</li>
<li>未読状態のレコードの件数を取得する</li>
<li>一括で既読状態にする</li>
<li>一括で未読状態にする</li>
<li>対象のオブジェクトのみを既読状態にする</li>
<li>対象のオブジェクトのみを未読状態にする</li>
<li>対象のオブジェクトが既読状態か調べる</li>
<li>対象のオブジェクトが未読状態か調べる</li>
</ul>
<p>Gem をインストール後、既読/未読管理を行いたいモデルに <code class="language-plaintext highlighter-rouge">DATETIME</code> 型の <code class="language-plaintext highlighter-rouge">read_at</code> カラムを追加し、そのモデルで <code class="language-plaintext highlighter-rouge">include Shiroyagi::ActsAsShiroyagi</code> でモジュールを差し込むことで動作します。</p>
<p><code class="language-plaintext highlighter-rouge">read_at</code> カラムにはインデックスを作った方がいいので、インデックス作成もお忘れなく。</p>
<p>詳しくは <a href="https://github.com/Findy/shiroyagi">リポジトリ</a> をご覧ください。</p>
<h1 id="積み残しとか">積み残しとか</h1>
<p>状態管理用のカラムの名前が <code class="language-plaintext highlighter-rouge">read_at</code> で固定なので、これは設定で変えられるようにしたいです。</p>
<p>あとはカラム追加用のマイグレーションファイルのジェネレータなんかもあったら便利だなーと思ってたりします。</p>
<p>用途が合えばぜひ使ってみてください!</p>deraruRails 用の既読/未読管理 Gem は色々ありますが、専用のテーブルが必要だったりとやや重量級の Gem が多かったので、軽量でシンプルな既読/未読管理用の Gem を作りました。Rails 5.1 からデフォルトになった Primary Key の Bigint に対応する2017-12-14T15:00:00+00:002017-12-14T15:00:00+00:00http://blog.deraru.com/tech/migrate-primary-keys-to-bigint<p>Rails 5.1からデフォルトになった、 Primary Key の Bigint に対応する作業のログです。</p>
<p>DB は MySQL です。</p>
<h1 id="新規テーブルの-primary-key-を-bigint-にせず-integer-にする場合">新規テーブルの Primary Key を Bigint にせず、 Integer にする場合</h1>
<p>新しくテーブルを作る際のマイグレーションファイルで、 <code class="language-plaintext highlighter-rouge">create_table</code> に <code class="language-plaintext highlighter-rouge">id: :integer</code> を渡すように編集します。</p>
<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">CreateDesks</span> <span class="o"><</span> <span class="no">ActiveRecord</span><span class="o">::</span><span class="no">Migration</span><span class="p">[</span><span class="mf">5.1</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">change</span>
<span class="n">create_table</span> <span class="s2">"desks"</span><span class="p">,</span> <span class="ss">id: :integer</span> <span class="k">do</span> <span class="o">|</span><span class="n">t</span><span class="o">|</span>
<span class="n">t</span><span class="p">.</span><span class="nf">string</span> <span class="s2">"name"</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>
<h1 id="既存テーブルの-primary-key-を-integer-から-bigint-にする場合">既存テーブルの Primary Key を Integer から Bigint にする場合</h1>
<h2 id="外部キーが無い場合">外部キーが無い場合</h2>
<p>以下のようなマイグレーションを実行して、既存テーブルの Primary Key を Bigint に移行します。</p>
<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">MigrateChairsPrimaryKeyToBigint</span> <span class="o"><</span> <span class="no">ActiveRecord</span><span class="o">::</span><span class="no">Migration</span><span class="p">[</span><span class="mf">5.1</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">up</span>
<span class="n">change_column</span> <span class="ss">:chairs</span><span class="p">,</span> <span class="ss">:id</span><span class="p">,</span> <span class="ss">:bigint</span><span class="p">,</span> <span class="ss">null: </span><span class="kp">false</span><span class="p">,</span> <span class="ss">auto_increment: </span><span class="kp">true</span>
<span class="k">end</span>
<span class="k">def</span> <span class="nf">down</span>
<span class="n">change_column</span> <span class="ss">:chairs</span><span class="p">,</span> <span class="ss">:id</span><span class="p">,</span> <span class="ss">:integer</span><span class="p">,</span> <span class="ss">null: </span><span class="kp">false</span><span class="p">,</span> <span class="ss">auto_increment: </span><span class="kp">true</span>
<span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>
<h2 id="外部キーが有る場合">外部キーが有る場合</h2>
<p>外部キーが有る場合は、親テーブルの被参照カラムのデータ型と子テーブルの外部キー用のカラムのデータ型を揃える必要があるので、一旦外部キーを削除し、親テーブルの Primary Key を Bigint に移行した後、子テーブルの外部キー用のカラムも Bigint に移行し、その後に外部キーを作り直す必要があります。</p>
<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">MigrateUsersPrimaryKeyToBigint</span> <span class="o"><</span> <span class="no">ActiveRecord</span><span class="o">::</span><span class="no">Migration</span><span class="p">[</span><span class="mf">5.1</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">up</span>
<span class="c1"># 一旦外部キーを削除する</span>
<span class="n">remove_foreign_key</span> <span class="ss">:chairs</span><span class="p">,</span> <span class="ss">:users</span>
<span class="c1"># 親テーブルのPrimary KeyをBigintに変更する</span>
<span class="n">change_column</span> <span class="ss">:users</span><span class="p">,</span> <span class="ss">:id</span><span class="p">,</span> <span class="ss">:bigint</span><span class="p">,</span> <span class="ss">null: </span><span class="kp">false</span><span class="p">,</span> <span class="ss">auto_increment: </span><span class="kp">true</span>
<span class="c1"># 子テーブルの外部キー用のカラムもBigintに変更する</span>
<span class="n">change_column</span> <span class="ss">:chairs</span><span class="p">,</span> <span class="ss">:user_id</span><span class="p">,</span> <span class="ss">:bigint</span><span class="p">,</span> <span class="ss">null: </span><span class="kp">false</span>
<span class="c1"># 外部キーを作り直す</span>
<span class="n">add_foreign_key</span> <span class="ss">:chairs</span><span class="p">,</span> <span class="ss">:users</span>
<span class="k">end</span>
<span class="k">def</span> <span class="nf">down</span>
<span class="n">remove_foreign_key</span> <span class="ss">:chairs</span><span class="p">,</span> <span class="ss">:users</span>
<span class="n">change_column</span> <span class="ss">:chairs</span><span class="p">,</span> <span class="ss">:user_id</span><span class="p">,</span> <span class="ss">:integer</span><span class="p">,</span> <span class="ss">null: </span><span class="kp">false</span>
<span class="n">change_column</span> <span class="ss">:users</span><span class="p">,</span> <span class="ss">:id</span><span class="p">,</span> <span class="ss">:integer</span><span class="p">,</span> <span class="n">null</span><span class="ss">:false</span><span class="p">,</span> <span class="ss">auto_increment: </span><span class="kp">true</span>
<span class="n">add_foreign_key</span> <span class="ss">:chairs</span><span class="p">,</span> <span class="ss">:users</span>
<span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>
<p>なかなか重いデータベースの処理が走るので、データ量が多い場合は一度に全テーブルを移行せず、何度かに分けて移行したほうがよさそうです。</p>
<p>1テーブルですら処理が重い場合は、外部キーと同様にインデックスを削除してからカラム変更を実行し、カラム変更後にインデックスを作り直す、などの対応をしてもよさそうです。</p>deraruRails 5.1からデフォルトになった、 Primary Key の Bigint に対応する作業のログです。SecureRandom を refine して twittersafe_base64 メソッドを追加した2017-12-02T15:00:00+00:002017-12-02T15:00:00+00:00http://blog.deraru.com/tech/twittersafe-base64<p>お手伝い先で URL safe なハッシュ値がついた URL を Twitter に投稿する、という機能がありました。</p>
<p>URL safe なのでなんの問題もなく Twitter に投稿できそうだな。と思っていたのですが問題がありました。</p>
<p>URL の末尾が hyphen で終わると、 hyphen の手前までを URL として認識し、その URL でリンクが作られるので誤ったリンクとなり、クリックすると 404 Not Found になってしまいました。</p>
<p>この問題を解消するために、 Ruby Kaigi 2017 で具体的な使用例を見た Ruby の Refinement を使って <code class="language-plaintext highlighter-rouge">SecureRandom</code> に <code class="language-plaintext highlighter-rouge">.twittersafe_base64</code> というメソッドを定義して、 URL safe でかつ Twitter にも投稿可能なハッシュ値を生成できるようにしました。</p>
<p>具体的なコードはこちら。</p>
<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">require</span> <span class="s1">'securerandom'</span>
<span class="k">module</span> <span class="nn">SecureRandom</span>
<span class="k">module</span> <span class="nn">TwittersafeBase64</span>
<span class="n">refine</span> <span class="no">SecureRandom</span><span class="p">.</span><span class="nf">singleton_class</span> <span class="k">do</span>
<span class="k">def</span> <span class="nf">twittersafe_base64</span><span class="p">(</span><span class="n">n</span><span class="o">=</span><span class="kp">nil</span><span class="p">,</span> <span class="n">padding</span><span class="o">=</span><span class="kp">false</span><span class="p">)</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">urlsafe_base64</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">padding</span><span class="p">)</span>
<span class="n">s</span><span class="p">.</span><span class="nf">tr!</span><span class="p">(</span><span class="s2">"-"</span><span class="p">,</span> <span class="s2">"_"</span><span class="p">)</span>
<span class="n">s</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>
<p><code class="language-plaintext highlighter-rouge">SecureRandom.urlsafe_base64</code> の出力から hyhpen を 取り除き underscore に置き換えているだけです。</p>
<p>これを使ってハッシュ値を生成するように変更して、 Twitter に誤ったリンクが投稿されることはなくなりました。</p>
<p>Refinement で手軽に Ruby の拡張が出来てすごく楽しかったし、実用的なことに使えたので満足でした。</p>deraruお手伝い先で URL safe なハッシュ値がついた URL を Twitter に投稿する、という機能がありました。BlogをTumblrからJekyll on Github pageに移行しました2017-01-01T08:50:54+00:002017-01-01T08:50:54+00:00http://blog.deraru.com/tech/migrate-from-tumblr-to-jekyll-on-github-page<p>あけましておめでとうございます。</p>
<p>移行作業をサボりつつFC2 blog -> Blogger -> Tumblrとブログを変えてきた結果、画像リンクやら埋め込みコードやらコンテンツやらが変になってしまっていた当Blog、性懲りもなく今度はJekyll on Github Pageに移行しました。</p>
<p>Tumblr -> JekyllはGem + スクリプトがあったので、それを使って一括して持ってきましたが、まあ画像やら書式やらは崩れてしまっているので、手直しを加えつつ修正が終わった記事から公開しています。</p>
<p>記事に使う文書(Markdown)と画像をすべて手元のGitリポジトリで管理できることは、ものすごくストレスフリーだなーと感じております。</p>
<p>しかもホスティングの手間もかからないし、お金もかからない。すごい時代になりました。</p>deraruあけましておめでとうございます。Rails 5.1以降のControllerテストについて2016-12-31T08:46:02+00:002016-12-31T08:46:02+00:00http://blog.deraru.com/tech/about-controller-test-after-rails-51<p>Rails 5.0でControllerのSpecを書いていたら、どうやら <code class="language-plaintext highlighter-rouge">assert_template</code>, <code class="language-plaintext highlighter-rouge">assigns</code> は本体から切り離されて、<code class="language-plaintext highlighter-rouge">rails-controller-testing</code> というGemに切り出されたらしいことを知った。</p>
<p>Controllerの単体テストとして、これまではコントローラー内の処理の分岐に応じて以下のSpecを必ず書いてきた。</p>
<ul>
<li>have_http_status を使ったレスポンスコードの確認</li>
<li>render_template を使ったレンダーするViewの確認</li>
<li>assigns を使ったレンダーするViewに渡すデータの確認</li>
</ul>
<p>この内の2つが本体だけでは書けなくなった、というインパクトは大きかった。
じゃあControllerのテストでは何をテストするんだ、と疑問になったので、本体から切り離された背景を調べてみた。</p>
<p>まず、この2つのメソッドは別にRSpecの本体から切り離したわけではないということが分かった。Railsの本体から切り離されていた。
切り離しの議論が行われていたのはこのIssue <a href="https://github.com/rails/rails/issues/18950" target="_blank">Deprecate assigns() and assert_template in controller testing · Issue #18950 · rails/rails</a></p>
<p>すごくいい議論が行われているなーと思いながら、頑張って英語を全部読んだ。</p>
<p>ControllerとViewは切り離せるものではなく、ViewはいうなればControllerのプライベートメソッドみたいなものである。なぜなら、Controllerが返すのはコンパイルされたViewだからだ、という部分は腑に落ちた。
と同時に、RailsでControllerとViewの間で行われるデータの受け渡しのインターフェースが、インスタンス変数になっていることに、ControllerとViewを切り離せない原因の一端がありそうだなーと感じた。</p>
<p>そして将来的には、完全にControllerのテストは無くなるかもしれないと。</p>
<p>レンダーされるViewのテストをしたいならViewの単体テストをすればよく、リクエストからController内の処理の分岐に応じたViewのテストをしたいなら、Request(あるいはFeature)テストをすればいい。</p>
<p>Controllerから見たprivateメソッドたるViewへの受け渡しに使うインスタンス変数のアサインをテストするのは無駄なこと。が、もし本当にController内でアサインしたインスタンス変数のテストをしたい人がいるなら、本体から切り離したGemがあるからそれを使えば、一応できる。
ただし、それをテストするくらいなら、Request(Feature)テストを書くのがいいよねという理解に至った。</p>
<p>海外での事情は知らないが、独自の汚いコントローラが蔓延し、目的が曖昧になった巨大なControllerのテストが存在する実情を考えると、これは正しい方向かもしれないなと思った。</p>deraruRails 5.0でControllerのSpecを書いていたら、どうやら assert_template, assigns は本体から切り離されて、rails-controller-testing というGemに切り出されたらしいことを知った。MySQL User Conference Tokyo 2015に行ってきた2015-12-14T15:00:00+00:002015-12-14T15:00:00+00:00http://blog.deraru.com/tech/mysql-user-conference-tokyo-2015<h1 id="チューニング用メモ">チューニング用メモ</h1>
<ul>
<li>select_type
<ul>
<li>DERIVED
<ul>
<li>tempテーブル作ってる時</li>
</ul>
</li>
</ul>
</li>
<li>filtered
<ul>
<li>絞り込まれる見込みの比率</li>
<li>rows * filteredが見積もり行数</li>
</ul>
</li>
<li>optimizer_trace
<ul>
<li>rows</li>
<li>cost</li>
</ul>
</li>
<li>オプティマイザヒント</li>
<li>パーティションテーブル
<ul>
<li>日時で分けて、データの一括削除</li>
</ul>
</li>
</ul>deraruチューニング用メモ二回続けてShinjukurbに行ってきた2015-07-21T15:00:00+00:002015-07-21T15:00:00+00:00http://blog.deraru.com/tech/shinjukurb<h1 id="microservice化に向けて">microservice化に向けて</h1>
<ul>
<li>スペースマーケット
<ul>
<li>二宮さん</li>
</ul>
</li>
<li>モノリシックなシステムをどうmicro serviceかしていくか</li>
<li>2014/04
<ul>
<li>Rails -> MySQL</li>
</ul>
</li>
<li>2015/02
<ul>
<li>アプリ開発
<ul>
<li>rails -> MySQL, ElasticSerch</li>
</ul>
</li>
</ul>
</li>
<li>2015/06
<ul>
<li>アプリリリース
<ul>
<li>rails(web) -> MySQL, ElasticSerch</li>
<li>rails(app) -> MySQL, ElasticSerch</li>
<li>モデルはそれぞれにある!!1
<ul>
<li>Rails Engineを使ったらどうか
<ul>
<li>Rails Engineくらいgenerateしてみよう!</li>
<li>テスト書きにくい
<ul>
<li>ダミーアプリが必要になる</li>
<li>ほぼ専用なら親側に書いてしまう手もある</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>理想
<ul>
<li>rails(ストレージ不要) -> rails -> MySQL, ElasticSerch</li>
</ul>
</li>
<li>検討
<ul>
<li>Garageみたいなものを独自実装</li>
<li>ActiveResource
<ul>
<li>辛い理由は?
<ul>
<li>めちゃくちゃ使いづらい
<ul>
<li>RESTじゃない!</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>derarumicroservice化に向けて