Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
食べログで動いている自作ライブラリのお話
Search
Tsukasa OISHI
December 10, 2009
Programming
0
310
食べログで動いている自作ライブラリのお話
Tsukasa OISHI
December 10, 2009
Tweet
Share
More Decks by Tsukasa OISHI
See All by Tsukasa OISHI
怖くないメモリ肥大化
tsukasa_oishi
1
91
SLI/SLO をストリーム アラインドチームに導入した話
tsukasa_oishi
0
180
JITをたどるとそこはYARVの中
tsukasa_oishi
0
570
The Cacher in the Rye
tsukasa_oishi
1
5.9k
ISeqで遊ぼう
tsukasa_oishi
0
5.1k
Rubyを30倍速くした話
tsukasa_oishi
0
1.2k
はてブ砲をくらったときのお話
tsukasa_oishi
0
2.1k
奥さんとプログラミングを両立させる方法
tsukasa_oishi
0
79
MiyazakiResistanceを作ってみたよ
tsukasa_oishi
0
980
Other Decks in Programming
See All in Programming
Compose Multiplatform × AI で作る、次世代アプリ開発支援ツールの設計と実装
thagikura
0
160
アルテニア コンサル/ITエンジニア向け 採用ピッチ資料
altenir
0
110
AI Coding Agentのセキュリティリスク:PRの自己承認とメルカリの対策
s3h
0
230
250830 IaCの選定~AWS SAMのLambdaをECSに乗り換えたときの備忘録~
east_takumi
0
390
基礎から学ぶ大画面対応(Learning Large-Screen Support from the Ground Up)
tomoya0x00
0
1.7k
AIと私たちの学習の変化を考える - Claude Codeの学習モードを例に
azukiazusa1
10
4.3k
Amazon RDS 向けに提供されている MCP Server と仕組みを調べてみた/jawsug-okayama-2025-aurora-mcp
takahashiikki
1
110
AIでLINEスタンプを作ってみた
eycjur
1
230
そのAPI、誰のため? Androidライブラリ設計における利用者目線の実践テクニック
mkeeda
2
320
Oracle Database Technology Night 92 Database Connection control FAN-AC
oracle4engineer
PRO
1
460
2025 年のコーディングエージェントの現在地とエンジニアの仕事の変化について
azukiazusa1
24
12k
JSONataを使ってみよう Step Functionsが楽しくなる実践テクニック #devio2025
dafujii
1
530
Featured
See All Featured
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
8
530
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
The Invisible Side of Design
smashingmag
301
51k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Gamification - CAS2011
davidbonilla
81
5.4k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
139
34k
Building a Modern Day E-commerce SEO Strategy
aleyda
43
7.6k
Why Our Code Smells
bkeepers
PRO
339
57k
Intergalactic Javascript Robots from Outer Space
tanoku
272
27k
Balancing Empowerment & Direction
lara
3
620
Designing for humans not robots
tammielis
253
25k
Transcript
食べログで動 食べログで動 いている自作 いている自作 ライブラリの ライブラリの お話 お話
おおいしつかさ tsukasa_oishi@twitter http://www.kaeruspoon.net/ 食べログ iPhone
自作ライブラリ
既存のものではダメなのか ・必要な機能を持つライブラリがない ・食べログのニーズに微妙に合わない ・開発が止まっている
自作 ・必要な機能を持つライブラリがない →ないなら作ればいい ・食べログのニーズに微妙に合わない →欲している仕様にぴったり ・開発が止まっている →開発者が自分、または同僚
食べログで動いている 自作ライブラリ ActsAsReadonlyable改 ActsAsS tateMachine改 TabelogThread MiyazakiResistance TabelogA sync DrySumpException Disgu iseToBusinessCode WordScoop TcHash EnhancedColumnType ExceptionLogger
食べログで動いている 自作ライブラリ ActsAsReadonlyable改 ActsAsS tateMachine改 TabelogThread MiyazakiResistance TabelogA sync DrySumpException Disgu iseToBusinessCode WordScoop TcHash EnhancedColumnType ExceptionLogger
ActsAsReadonlyable改
ActsAsReadonlyableとは master slave2 slave1 CUD R R AP
障害が起こると master slave2 slave1 CUD R AP
Webサーバーが死んでも大丈夫 APサーバが死んでも大丈夫 DBサーバが死ぬとサービスに影響あり
Webサーバーが死んでも大丈夫 APサーバが死んでも大丈夫 DBサーバが死んでも大丈夫 当然こうしたい
障害が起こると master slave2 slave1 CUD R AP
自動切り離し MySQL::ConnectionError発生 コネクションプール群から該当 サーバのプールを除外 リトライ
運用も楽に メンテナンス等でも 気軽にDBを落とせる ようになった
TabelogAsync
TabelogAsyncとは ▪非同期処理ライブラリ ・backgroundrbが暴走する ・Mongrelを通したくない ・堅牢性はそれほど必要ない ▪仮名のまま ・公開するときはカッコいい名前に
Rails側 TabelogAsync::Thrower.send( :class => :async_log, :args => “good” ) lib/worker
class AsyncLog < TabelogAsync::WorkerBase def do_work(args) logger.info args end end
当初の設計思想 軽くてすぐに終わって同期する必要のない 大量の処理をさばく 重い処理は従来通りbackgroundrbで
いつの間にか 気軽に使えるので重い処理も回すように なった シングルスレッドなので遅延が数時間レベ ルにまで拡大 いくら非同期でも遅れすぎ
Rails Rinda TabelogAsync normal heavy Rinda
WordScoop
WordScoopとは ▪キーワード検索ライブラリ ・はてなダイアリーキーワード ・高速 ・軽量 ・HTML対応 ▪命名 ・奥さん
登録 5 μs 検索 3 ms
高速 ▪キーワード登録 1.399998 s (1語 : 0.000005 s) ▪キーワード検索(1000回) 3.519995
s (1回 : 0.003520 s) 軽量 インデックス構築後 56Mバイト キーワード数 262380語 検索対象文字数 8789字
使い方
キーワード登録 Index = WordScoop.new(['クリスマス', '鍋']) キーワード追加 Index << 'はくさい' キーワード検索
index.search(“クリスマスは鍋にしようか。鍋には はくさいだよね”)
キーワード登録 Index = WordScoop.new(['クリスマス', '鍋']) キーワード追加 Index << 'はくさい' キーワード検索
index.search(“クリスマスは鍋にしようか。鍋には はくさいだよね”) #=> ['クリスマス', '鍋', '鍋', 'はくさい']
HTML変換URLの登録 index.link_url = %Q|<a href="http://cookpad.com/レシピ/%s">%s</a>| HTML文章への自動リンク付与 index.filter_html(“クリスマスは鍋にしようか”)
HTML変換URLの登録 index.link_url = %Q|<a href="http://cookpad.com/レシピ/%s">%s</a>| HTML文章への自動リンク付与 index.filter_html(“クリスマスは鍋にしようか”) #=> %Q|<a href=”http://cookpad.com/レシピ/クリスマス”>
クリスマス</a>は<a href=”http://cookpad.com/レシピ/鍋“> 鍋</a>にしようか|
gem install word_scoop
今後の機能追加予定 ▪検索をさらに高速に ・HTMLの自動リンクアルゴリズム の改良 ・AhoCorasick(エイホ-コラシック)法 の採用 ▪さらに軽量に
・DoubleArrayの採用
まとめ
自作 ・必要な機能を持つライブラリがない →ないなら作ればいい ・食べログのニーズに微妙に合わない →欲している仕様にぴったり ・開発が止まっている →開発者が自分、または同僚
ライブラリが充実すると、開発・運用 ともに楽になる 作る課程も楽しい この世界に貢献ができる ライブラリを作ると みんなが幸せになる
コミットログは英語で
おしまい thanks!