RailsのCでもVでもない場所でアプリのURIを扱う方法

API を実装していく際にリンク先の URI も加えてあげたい1場合、どこかで URI を生成する必要がある。

Grape で API を書く場合、提供される機能はあくまで endpoint 周りであって、アプリの内部実装は自分でなんとかする必要がある。Grape から使えるとしたら Rails の C でも V でもない場所にせざるを得ない。ということで C でも V でもない場所で URI を扱う方法を調べてみた。

Can Rails Routing Helpers (i.e. mymodel_path(model)) be Used in Models? - Stack Overflow

ということで

Rails.application.routes.url_helpers

を include すれば使えそうだが、その際 include する人は module でなく class でないとダメ っぽい。

これは C や V で利用することを前提に url_for() ができあがっているからか、もしくは自分が独自に作った Helper が super な url_for() を呼び出している際に何かの依存を踏んでいるからかもしれない。ちょっとよく分かっていないけど少なくとも class で include されるようにしておけば安定して動くことが分かった。

[20160731 追記] こんな記事があった。ほぼ考えてることそのまんまだった。

<a
href=”http://postd.cc/sprinkle-some-hateoas-on-your-rails-apis/”>RailsのAPIにHATEOASを散りばめてみる
RESTの拡張、HATEOASの詳解と実装例プログラミングPOSTD</a>
  1. HATEOASですね 

webmockとpactのmock serviceの違い

実はこれまで webmock を使う必要がなかったので試しに API client を書く際に webmock でテストを書いてみた。そんで先日書いてみた Pact の mock service と比べてみた。

それぞれ GitHub 上の README より抜粋したコードを貼りつつメモ。

webmock

GitHub - bblimke/webmock: Library for stubbing and setting expectations on HTTP requests in Ruby.

stub_request(:post, "www.example.com").
  with(body: "abc", headers: { 'Content-Length' => 3 })

webmock は元のクライアントに一切手を加える必要がないのが特徴。

  • その代わりに request 先を正確に指定しないといけない
  • サンプルには書かれていなかったけど User Agent も正しく Header で指定しないとダメっぽい

Pact service consumer

GitHub - realestate-com-au/pact: Enables consumer driven contract testing, providing a mock service and DSL for the consumer project, and interaction playback and verification for the service provider project.

     animal_service.given("an alligator exists").
       upon_receiving("a request for an alligator").
       with(method: :get, path: '/alligator', query: '').
       will_respond_with(
         status: 200,
         headers: {'Content-Type' => 'application/json'},
         body: {name: 'Betty'} )

Pact の mock service は localhost で受け付けるのが前提。

  • consumer の機能で endpoint を切り替える
  • クライアント側のテストだけを考えると service_name も provider state ( given ) も description ( upon receiving ) も RSpec なり Minitest なりのメタデータ以外に指定しないといけないのが面倒
  • request / response はいい具合に抽象化しやすい
    • response を {} と書くとその内容まではチェックしない
    • Pact.each_like({}) とすれば {} の個数もチェックしない

webmock の方がまだまだポピュラーではあると思うが、サービス同士のテストにはやはり Pact の方が書きやすいように思う。Pact は最初の設定(名前決めなど)以外の実際の mocking の部分は結構書きやすいし、response body を厳密に決める必要がないので、provider 側を書く前のテストとしてはとても書きやすいと思った。

Kanazawa.rb Meetup 11 で喋ってきた

「『意識高い』もくもく」なのに合計すると1時間くらい喋ってた。皆さん、邪魔してごめんなさい。

今回喋ったのは

  • できる!Meetupデザイン
  • Git小咄二題

の二つ。

特に Git の方は前回 meetup 10 でみんなが避け気味だったけど実際やるときにはできた方がいい reset –hard と rebase の話を中心にするという大胆な構成。と言ってもそんな難しい話ではない。

  • コミットオブジェクトは自身の参照先を知っている
    • だから Pro Git の図の矢印は人間の感覚の反対方向を向いている。このことは知ってないとダメ。
    • Subversion と違ってコミットオブジェクト自身が関係を持っているのでそれを組み替えることができる。これが rebase
  • rebase はコミットオブジェクトの同一性にこだわらなければ実際の pull/push をスムーズにするのに使えばいいよ
  • reset –hard は rebase の反対向きに使える
    • これを知っていればたぶん stash を使う場面はほとんどなくなる。commit 以外の作法を知るのは面倒なのでもう全部 commit しちゃえばいいよ。

今回は rebase -i は無視。

喋ったあとに軽くディスカッションして、自分はコミットオブジェクトの同一性に何もこだわっていないんだなぁということに気がついた。

diff が合っていればいいし、というか後から読みやすい diff ができた方が嬉しいし、コミットオブジェクトが同一かどうかよりも成果が出る方が重要で、

成果を出すことをためらわなくていいように便利な機能はどんどん使えばいいじゃん

と思っている。ちゃんと動くかどうかはコミットオブジェクトの同一性ではなくテストで保証すべきだ。

確かに自分が100人からの開発者の上に立つ立場であったら Git の導入にはいろいろ思うところはあるだろうなという気はしている。そして先日 Twitter の timeline で見かけた、だったら Mercurial 使えばいいじゃんという意見には今はすごく納得している。

そして 自分は 自分の膝を撃ち抜く自由が欲しい、と。

これ、Ruby に対して感じる自由と同じだなと気づいた。Rails の人たちが GitHub 使い始めたのが間違いなく大きかったと思うけど、Rubyist の志向と Git ってやっぱり相性がいいのかもしれない。

なんてことを思った週末でした。

※ 攻殻機動隊 S.A.C. 2nd GIG ネタをちゃんと盛り込めたのがいちばんの収穫だったかもしんない。

iPod touch げと

※ ごめんなさい。書いている時点でもう3ヶ月前の話になってしまったorz

1週間前からですかね。iPod touch が欲しくなったのでソッコー買ってしまいました。

もともとポケコンとかこういう小さいデジモノが好きなので、ずいぶん前から欲しいのは欲しかったのですが、基本的には「常に自分の PC に向かっていられる環境 + 移動は車 」の世界に住んでいるのでどうせ使いものにならないだろうという理由で iPhone/iPod touch は見送ってきました。

しかし先日の話の通りRTMを使った方がよさげな状況になってきたので、日本のケータイではなく、かつ PC ではない小型の端末が急速に欲しくなってしまったのです。

以下、例によって twitter ログより。

買う前

09:06:51 >wtnabe< iPod touch にはカメラないのか
11:48:19 >wtnabe< まとめると、カメラ、マイクなし、BluetoothはOS3.0で使
                  えるけどHIDプロファイル非対応。アプリはLDRとRTMがある
                  ので当初の目的は達成できそうな感じではある。
11:48:37 >wtnabe< でもたぶん9月に第3世代出るんだよね < iPod touch
11:52:40 >wtnabe< あとは安けりゃなんでもいいやという気分になってきている
12:06:39 >wtnabe< iPhone/iPod touchのいいところはアクセサリが豊富なとこ
                  ろだな。日本のケータイはケースに入れられないもんね。

買うとき

17:36:07 >wtnabe< iPod touchゲットした。うっかり .@kabakiyo さんに出く
                  わした。
18:16:56 <kabakiyo> @wtnabeに出くわした。エスカレーターの反対側だったの
                    であいさつだけした。

買ってから

17:38:32 >wtnabe< music playerとして使う気がほとんどないのでとりあえず
                  聞ければいいものをプレイリストに突っ込んで同期完了。
17:43:33 >wtnabe< iPhone OS 3.0 ダウンロードおせー。なにこれ。

RTM関連

17:48:25 >wtnabe< もしかしてRTMアプリってproアカウントなら無料になるん
                  じゃなくてproアカウントじゃないと使えないの?
17:52:56 <mootoh> @wtnabe yes
17:55:22 >wtnabe< @mootoh ガーーーーーン。なんて分かりにくい表記だ!
19:30:55 >wtnabe< RTMのプロアカウントはさすがに高いので代替案を探さなけ
                  れば
21:31:32 >wtnabe< mobileme 9800円/年を思えば RTM pro 25ドル/年はやっぱ
                  安いのか? いやいやいや。

翌日のRTM関連

00:01:56 <wtnabe> なるほどそこでmilponなのね。理解した。
06:46:43 >wtnabe< お礼言い忘れてた。ありがとう @mootoh ぼくらには
milpon があるんだね!

Milpon

mootoh が milpon を作っていることは実は以前から知っていました。でもその必要性が分かっていなかったのです。公式アプリが Pro アカウントでないと使えないということを知って初めて理解できたのでした。

アプリの起動とかLDRとかGmailとか

20:21:10 >wtnabe< 追加したアプリの起動方法すら分からんorz
20:21:35 >wtnabe< あ、画面が切り替わるのか
20:34:41 >wtnabe< LDR touch は画像があったり長かったりすると記事間の ↑
                  ↓ での移動が如実に重くなるな。一度記事一覧に戻ると遅
                  くないんだけど。
21:29:04 >wtnabe< gmail もまだちゃんと設定できてないテイタラクっぷり
22:51:09 >wtnabe< gmail じゃなくてその他で設定しなくちゃいけなかったの
                  か。なんだよそれ。

とりあえず結論

16:59:16 >#Twitter@t:wtnabe< ちゅーことで自分的iPod touch三種の神器は
LDR touch, Milpon, Evernoteということで。gmailは同期が遅いのが、
NatuLionはやたらページが長いのが難点。

[追記] Twitterアプリはその後Twitterrificに、初めて買った有料アプリはLimeChatになりました。

喫茶店を開拓したい

カフェって言うな。

いや、別に言ってもいいけど。

基本的に出不精だし、別に家でもいいんだけど、お気に入りの喫茶店を確保したいなぁと以前から思っていて。例えば読書やコードいじりに使えるいい感じの喫茶店。

最近のカフェっぽいところにも何カ所か行ってみたんだけど、どこの店も都会の店を参考にしているせいか、この辺の店にしてはテーブルの間隔、椅子の間隔が狭い。これが田舎者にはまずカチンとくるわけ。狭いんだよ、と。都会の人は大変だよね。コンビニとかラーメン屋なんか行くと一発で分かるけど、とにかく密度が高い。オレは狭いのきらいなんだよ。田舎もんだからよ。パーソナルスペースが大きいの。隣のやつがこんなに近かったら絶対落ち着かない。

というわけで最近のカフェ系の店で当たりに出会えた試しがない。まぁ基本的に若い女性向けでそもそもちょっと賑やかなのだ。みんなお喋りしてて、落ち着いて本なんか読める感じじゃない。それなら最近大型書店に併設されているコーヒーショップの方が何倍も落ち着く。席もゆったりだ。具体的には Tully's ですが。

それは分かっているんだけど、なんかね、ちょっとこういう書店併設やショッピングセンター内の Tully's は店全体がちょっと手狭で。あんまり落ち着いて本広げたりパソコン広げたりしちゃいけないような気になってしまうのね。そこが実に惜しい。コーヒーの味的にもスターバックスより好きだし、ちゃんと焼き物のカップだし。でもそもそも大型書店併設やショッピングセンター内ってことはタイミングによっては駐車場に車を止めるだけで一苦労だったり、そこから店まで結構距離があったりする。贅沢ですかそうですか。

この前、御経塚サティ内の Tully's にはホットスポットがあったし、あそこがいいのかなぁ。狭めだけど。というか Tully's のサイトにあの店載ってねーよ。少なくともビーンズの店舗より前からあった気がするんですけど!

無線LANのサービスも意外に増えてるし、網羅してるポイントの多いサービスから選んだ方がいいのかしら。むむむ。知らんことばかりだ。

パスワードロック付きUSBメモリ

なんてものを見つけた。Windows でも MacOSX でもパスワードロックが有効っていうのはかなり珍しいと思う。

「高速」って書いてないからスピードはイマイチなのかもしれないけど。

NeoOffice 2.1 調子悪いのはスペルチェックのせいか?

なんか beta の頃の方が安定してた。

どうも正式版になってからファイルを開くときにえらい悩むことがちょくちょくあって、どうにもならないので強制終了すると、次からは起動するたびに回復を試みてまた延々悩むという非常に邪魔くさい動作をする。データの形式が変わったとかそういうことはなくて、以前とまったく同じスタイルのタブ区切りのテキストを読ませているだけである。変わったのは NeoOffice のバージョンだけ。

パッチが出るたびに直ったかと思って期待するんだけど、これと言って何かが良くなってる様子はない。

うちの環境だけの問題なんかなぁ、これ。

まぁ本当にどうにもならないときは awk とかで処理してヨソに回しちゃうんだけどさ。なんだかなぁ。もしかすると Panther だから? それはあるかもなぁ。

あ。

なんか自動スペルチェックを外したらなんとかまともに動くかも。これかっ。これなのか!

説明書ファイル

※ さらに未来の日記を書く。

なるほどこういう名前の商品があるのね。CD や DVD だけが入るファイルってのはたくさんあるけど、あれって自分で焼いたもの以外は整理しにくいしなーと思いながら先日電気屋をフラフラしていたら見つけたもの。

あんまり真面目にカタログと首っ引きで調べる気もなかったし、こういうたまたまの発見は結構嬉しい。

あと、取説だけでなく、パッケージのコピーも入れとくと探しやすくていいかも。取説とメディアだけだと、目で探すときにどれが何かすごく分かりにくそうだから。

こういうモノ系はあまり得意じゃないんだけど、本当はもうちょっと吸収しておかないとまずいよな。

まだイケる

まだ丸くなってないぞ。

まだ怒れる。

まだやれる。

岡村ちゃん逮捕って

あーあー。

しかも覚せい剤って、ものすごく今さらな感じがするよー。

なにやってんだよー。

livedoor Wiki の記法って PukiWiki ライクなのね

http://wiki.livedoor.com/howto.html

こういう一覧は見やすくていいな。縦に長過ぎる説明は見る気にならないし。

見出しとリストとテーブル、引用、文字サイズやカラー指定は明らかに PukiWiki の影響がありますな。

ただ、対応する HTML が強調系で i と strong が並列で扱われてたりとか、なんだか微妙な気が。^ が pre で、空白と > が blockquote に対応するってのも分かったような分からないような。ただ、空白が blockquote になるっつーのはデフォルトのスタイルが適用された状態を想像すると分かりやすいっちゃ分かりやすいので、あぁなるほどなとも思う。改行がそのまま反映されるのもそういう理由なのかな?

段落はないのか。思い切ってるなぁ。まーでも普通に Word しか使ってないような人たちは段落なんて意識してないか?

ドキュメンテーションのため

  • wxRuby のサイトで使っているのは UseModWiki
    • フォーマットはオリジナルな方向か?
    • ファイルベースのシステムの割に diff の取り方とか便利な気がする
  • reStructuredText の Emacs 用 mode
    • ZWiki とかなくてもとりあえずこれがあれば書けるか。
    • docutils の install は setup.py を使えと。

About

例によって個人のなんちゃらです