去年買ってよかったアイテム ベスト3

BIBILAB はだけない着る毛布

僕が買ったんだけど、2 週間後には妻も買ってました。

それ以前はロング半纏 (膝まであるヤツ) を着て満足してたけど、完全に世界が違う。暖房要らず。

iRing

2 万円弱の 7〜8inch タブレットを買って、ガラスが割れたら買い換える運用をしている。なんと去年は iRing を導入した結果割ってない。いつも 8 ヶ月ぐらいで買い換えてたのに。

カードケータイ KY-01L

前の記事がコレじゃん。

onk.hatenablog.jp

電話が受けられるモバイルルータとして大活躍。会社や家に置きっぱなしだったケータイを持ち歩けるようになりました。(今まで持っていたケータイとは何だったのか……)

こちらからは以上です。

カードケータイ KY-01L を買った

いやー、ようやく! ようやく僕の使い方に完全にジャストフィットしたケータイが出てくれたんじゃないか。

ここ数年、ずっとガラケー+ 7〜8インチタブレットを組み合わせる生活をしていて、今は

を使っていた。

ガラホなのは、1 年前に、ちょうど帰省の直前にガラケーを紛失したので docomo ショップに駆け込んだのが理由。重さが倍になってしまって、持ち歩くのが億劫で苦しんでいた。

7〜8インチタブレットが好きなのは感覚の問題で

  • 電子書籍をヘビーユーズしているので小説/技術書/マンガが読みやすいディスプレイサイズが欲しい
  • コードが読めるサイズだとノート PC が無くてもコードレビューができる
  • あまり周りに利用者が居ないのでちょうど良いデバッグ端末になる
  • ゲームをタブレットで遊ぶと迫力があって楽しい
  • ギリギリ尻ポケットに入る

が魅力なのです。

というわけで、ケータイに求めるのは Wi-Fi モデルのタブレットでできないことで、つまり通話とテザリングと (タブレットが無い緊急時に) Web が見られることの 3 点。まさにその用途だけに特化したものが出てくれるとは思ってもみなかった。最高では!?

一つだけ諦めたのはキャリアメールで、これはタブレットから IMAP で行うよう切り替えた。最近はサーバ落ちたときにもメール通知という手段を使わなくなってきたし、だいたい家と会社の往復しかしてないし、数十分放置して問題になるような SPoF もほとんど無いし、もう諦めても良いだろう。。

マルチテナントで ActiveSupport::CurrentAttributes を使おうと考えた

マルチテナントのアプリケーションを作っていて、サブドメインでアクセスしたらそのテナントのデータを表示したい。

apartment gem を使うのが一般的だと思うが、 builderscon tokyo 2018つらくないマルチテナンシーを求めて: 全て見せます! SmartHR データベース移行プロジェクトの裏側 という発表を聞いたので、せっかくなら organization_id を全テーブルに持たせる感じのデータ構造にしようと考えた。

以下のような作戦です。

(1) サブドメインを rack middleware で見て、 ActiveSupport::CurrentAttributes に保存する

class OrganizationInjector
  def initialize(app)
    @app = app
  end

  def call(env)
    req = ActionDispatch::Request.new(env)
    Current.organization = Organization.find_by!(subdomain: req.subdomain)
    @app.call(env)
  end
end

(2) モデルでは default_scope で制御する

class Article < AR::Base
  default_scope { Current.organization && where(organization: Current.organization) }
end

というわけで

となりました。

検索して全部見る

使っていくぞ!!! と叫んでコードを書き出して、ふと

Current.organization 作るんだったら current_user じゃなくて Current.user でも良いなぁ」

と思ったので、GitHub でひたすら ActiveSupport::CurrentAttributes を使っているコードを検索して、検索結果を 100 ページまで全部見た。

このときに、ちょっとでも参考になる可能性があるな、と思ったらとりあえず ghq get して 中を読む ようにしているんだけど、その過程で 3 つの良い出会いがあった。

(今回は検索結果 100 ページで中を見たのは 17 レポジトリなので、異常に S/N 比が悪い。検索力が低い……。

operator_recordable に出会った

https://github.com/yujideveloper/operator_recordable

と以前から妄想していた、record_with_operator の AS::CurrentAttributes 版があるのを知った。

動く実装がなくなって久しいので完全に最高。

rectify に出会った

https://github.com/andypike/rectify

導入しやすい trailblazer みたいなヤツです。

個人的には Rectify::Command の記法と、テストの stub 方法が充実しているのが気に入った。 まだ日本語の記事無いっぽいので狙い目。コードリーディング会で読むのにちょうど良いサイズだと思う。

動画も見た。 http://andypike.com/blog/conferences/rubyc-2016/

このレールは良いレールなので選んでも良いなぁ。

rails_multitenant に出会った

https://github.com/salsify/rails-multitenant

グローバルな変数に入れて default_scope でやるって発想は完全に同じで、 実装方法が AS::CurrentAttributes ではなく自前なのが違う。

グローバルなコンテキストに GlobalContextRegistry って名前を付けてるのが最高。触ると危ないヤツは危ないことが分かる名前であるべきだ。(なので AS::CurrentAttributes のクラス名は Current ではない方がヨサソウ)

中身は Thread.current ですね。

https://github.com/salsify/rails-multitenant/blob/v0.10.0/lib/rails_multitenant/global_context_registry.rb

自分で Thread.current 扱ってるよりもみんなの目を通ったコードの方が安全だろう、というのが AS::CurrentAttributes を使おうと思ったキッカケなので、gemify されてるならコレにしようかな。サクッと読める (すぐ自前に乗り換えられる) サイズなのも良い。

salsify は salsify_rubocop がとても似た音楽性を持っていて好きな会社なので、gem を使えて嬉しい。

全部見た結果

という印象です。他の使い道がある場合は教えて欲しい。

「試用期間が明けたらブログ書くぞ」と思っていたが 3 ヶ月前に終わっていた

京都への観光旅行で終わってしまうと怖いと思って明けるまで待っていたんだけど、どうも有休発生と混同していたっぽい。 よく考えたら半年って長いよね。

というわけで株式会社はてなに入社していました。

マンガチームで GigaViewer というマンガビューワを作っています。 また CTO 室を兼務し、生産性向上に向けての取り組みを行っています。

さぁ日記書くぞ!