SlideShare a Scribd company logo
1 of 36
Download to read offline
The plan of Aniki 2.0
id:karupanerura
YAPC::Fukuoka 2017 HAKATA
おことわり
• AnikiというORMの2.0に向けたロードマップ
に関するトークです
• ORMやAnikiに関心が知識があると面白いと
おもいます
• 今すぐ cpanm Aniki しましょう
• 裏は福岡のITの未来の話をやってます
だれ
• id:karupanerura (Twitter/Hatena/Github)
• Japan Perl Association / DeNA Co,.Ltd.
• Perl/XS/Go/Crystal/Swift/Java/etc..
• CPAN Author (PAUSE:KARUPA)
• Gotanda.pm / Mackerel UG Organizer
あじぇんだ
• Anikiとは
• Aniki 1.0まで
• Aniki 2.0から
• まとめ
Anikiとは
YAPC::Hokkaido 2016 Sapporo
https://speakerdeck.com/karupanerura/lai-rigaifalsearuorm-aniki-che-di-jie-shuo
Aniki採用企業
• 名前出していいのかわからないけど何社か導
入してくれているところがあると聞いてます
• 弊社ではまだ使ってるところないらしい
• 自分のプロジェクトは自分が入ったときに
はTengだった
Aniki 2.0
…の前に
おさらい
ORMにありがちな問題
• よくわからないクエリの発行
• N+1問題を作りがち
• (大量の行を取得したとき)重い
• 行Objectのライフサイクルが長くなりがち
• 複数DBと相性が悪い
つらい
酒のみたい
つらいけど問題と向き合う
よくわからないクエリの発行
• 大概、オブジェクトの操作に寄せすぎ
• プログラムとしてはキレイになる
• パフォーマンスを考慮したコードを書くに
はORMの深い知識が必要になって基本的に
ハードルが高くて難しい
• 操作とその副作用のクエリが暗黙的
N+1問題を作りがち
• N+1問題を知らないひとはぐぐって!
• 大概ORMの機能の無理解や誤解から起きる
• 関連レコードをprefetchする機能を使うべき
• とはいえTengなどサポートの無いORMもある
• prefetchから何が起こるかイメージしにくい
(大量の行を取得したとき)重い
• 大量のオブジェクトの生成はしんどい
• 大量のメモリアロケーション
• プールにないことが多い
• 当たり前体操
• 1行づつfetchすればちょっとマシな場合も
行Objectのライフサイクル
• 長くなりがち
• なんで長くなりがちかってmutableだから
• setしてsetしてsaveとかやりがち
• 状態引き回すことになりがち
• ライフサイクル長いと状態が見えにくくなっ
てバグ仕込みがち
複数DBとの相性が悪い
• そもそも複数DBが辛い
• シャーディングとかシャーディングとか…
• Slaveとのレプリ遅延も辛い
• トランザクションまたぎが辛い
• 大概、トランザクション管理の関係が問題で
DBと一対一の関係にしているORMが多そう
Aniki 1.0
Aniki 1.0
• SQLに寄ったクエリ発行ベースのAPI
• N+1が起きてからprefetchを仕込めな設計
• 大量のデータは生データで扱え(suppress_*)
• 行オブジェクトがImmutable
• 複数Slaveには対応
解決しきれていない
問題がある
Aniki 2.0
コンセプト
• 「使いやすい」から「改善しやすい」へ
• ORMが持っている問題をもっと少なく
• もっと開発者が楽になれて
• DBの問題に対処しやすいように
• コードもわかりやすいように
新機能
• シャーディング/複数DB支援
• Lint機能
• Phantom Row Object
• Iteratorサポート
※構想です
気が変わって方針転換する可能性があります
シャーディング/複数DB支援
• クラスタ/シャード/スレーブ管理
• たぶん汎用的なモジュールとして切り出す
• schemaに対するDSLも提供したい
• DSL見ただけで系統やシャードの切り方が
分かったら素敵では???
Lint機能
• N+1問題を検出
• prefetchするべきかどうかはエンジニアが
判断するしかなかった→自動でやりたい
• 生SQLと行Objectの対応がまずったら警告
• 静的検査したいけどそこまではできないかも
Phantom Row Object
• MutableなRowの代わりの概念(idea)
• Rowから魂(Phantom)を抜き出す
• Phantomは実体を持たないので柔軟(?)
• Phantomには干渉はできても見えない
• Phantomをこねくり回してDBに反映!
Iteratorサポート
• DBD::mysqlでは基本的にレスポンスをすべて
ローカルにバッファする
• mysql_use_resultで制御
• もう少しわかりやすいAPIを提供したい
• メモリアロケーションが少なくなる工夫をし
たい
まとめ
まとめ
• ORMはパーフェクトじゃない
• つらみはたくさん
• とはいえつらみと向き合って変えていくこと
が必要
• Aniki 1.0まででもある程度解消した
• Aniki 2.0ではもっとつらみを減らしたい
ざっつ
おーる
えにーくえっしょん?
Q. いつ2.0だすの
A. 2018年前半には…
(やる気しだい)
Q. 一番やる気ある機能は?
A. Lint作ってる
Anikiは開発者を
絶賛募集しております
あなたとAniki
いますぐcontribute!
さんきゅーふぉありすにんぐ
ベストトークよろ

More Related Content

What's hot

RubyとRailsのおいしい使い方
RubyとRailsのおいしい使い方RubyとRailsのおいしい使い方
RubyとRailsのおいしい使い方Satomi Tsujita
 
わんくま同盟札幌#2 Lチカ卒業後の進路
わんくま同盟札幌#2 Lチカ卒業後の進路わんくま同盟札幌#2 Lチカ卒業後の進路
わんくま同盟札幌#2 Lチカ卒業後の進路Tsutomu Sakaguchi
 
Rails5β + herokuで遊んでみた
Rails5β +  herokuで遊んでみたRails5β +  herokuで遊んでみた
Rails5β + herokuで遊んでみたshota miyazaki
 
Pythonによる4足歩行ロボットの制御と強化学習による歩行動作獲得の実例 #pyconjp
 Pythonによる4足歩行ロボットの制御と強化学習による歩行動作獲得の実例 #pyconjp Pythonによる4足歩行ロボットの制御と強化学習による歩行動作獲得の実例 #pyconjp
Pythonによる4足歩行ロボットの制御と強化学習による歩行動作獲得の実例 #pyconjpHideyuki TAKEI
 
RubyMotion もくもく会 in Osaka 活動報告
RubyMotion もくもく会 in Osaka 活動報告RubyMotion もくもく会 in Osaka 活動報告
RubyMotion もくもく会 in Osaka 活動報告Sotaro Omura
 
IPアドレスのおねだん
IPアドレスのおねだんIPアドレスのおねだん
IPアドレスのおねだんKei Onimaru
 
DSLについて語るときに僕の語ること
DSLについて語るときに僕の語ることDSLについて語るときに僕の語ること
DSLについて語るときに僕の語ることTomohiro Nishimura
 
Functional Programming in Scala #4-1
Functional Programming in Scala #4-1Functional Programming in Scala #4-1
Functional Programming in Scala #4-1Yoshihiro Shimizu
 

What's hot (8)

RubyとRailsのおいしい使い方
RubyとRailsのおいしい使い方RubyとRailsのおいしい使い方
RubyとRailsのおいしい使い方
 
わんくま同盟札幌#2 Lチカ卒業後の進路
わんくま同盟札幌#2 Lチカ卒業後の進路わんくま同盟札幌#2 Lチカ卒業後の進路
わんくま同盟札幌#2 Lチカ卒業後の進路
 
Rails5β + herokuで遊んでみた
Rails5β +  herokuで遊んでみたRails5β +  herokuで遊んでみた
Rails5β + herokuで遊んでみた
 
Pythonによる4足歩行ロボットの制御と強化学習による歩行動作獲得の実例 #pyconjp
 Pythonによる4足歩行ロボットの制御と強化学習による歩行動作獲得の実例 #pyconjp Pythonによる4足歩行ロボットの制御と強化学習による歩行動作獲得の実例 #pyconjp
Pythonによる4足歩行ロボットの制御と強化学習による歩行動作獲得の実例 #pyconjp
 
RubyMotion もくもく会 in Osaka 活動報告
RubyMotion もくもく会 in Osaka 活動報告RubyMotion もくもく会 in Osaka 活動報告
RubyMotion もくもく会 in Osaka 活動報告
 
IPアドレスのおねだん
IPアドレスのおねだんIPアドレスのおねだん
IPアドレスのおねだん
 
DSLについて語るときに僕の語ること
DSLについて語るときに僕の語ることDSLについて語るときに僕の語ること
DSLについて語るときに僕の語ること
 
Functional Programming in Scala #4-1
Functional Programming in Scala #4-1Functional Programming in Scala #4-1
Functional Programming in Scala #4-1
 

Viewers also liked

TIme::Moment+Time::Strptime=
TIme::Moment+Time::Strptime=TIme::Moment+Time::Strptime=
TIme::Moment+Time::Strptime=karupanerura
 
The Crystal language *recently* update
The Crystal language *recently* updateThe Crystal language *recently* update
The Crystal language *recently* updatekarupanerura
 
Optimize perl5 code for perfomance freaks
Optimize perl5 code for perfomance freaksOptimize perl5 code for perfomance freaks
Optimize perl5 code for perfomance freakskarupanerura
 

Viewers also liked (6)

TIme::Moment+Time::Strptime=
TIme::Moment+Time::Strptime=TIme::Moment+Time::Strptime=
TIme::Moment+Time::Strptime=
 
The Crystal language *recently* update
The Crystal language *recently* updateThe Crystal language *recently* update
The Crystal language *recently* update
 
DateTimeX::Moment
DateTimeX::MomentDateTimeX::Moment
DateTimeX::Moment
 
router-simple.cr
router-simple.crrouter-simple.cr
router-simple.cr
 
Optimize perl5 code for perfomance freaks
Optimize perl5 code for perfomance freaksOptimize perl5 code for perfomance freaks
Optimize perl5 code for perfomance freaks
 
Aniki has come
Aniki has comeAniki has come
Aniki has come
 

Similar to The plan of Aniki 2.0

perlで挑むごみ集取カレンダー
perlで挑むごみ集取カレンダーperlで挑むごみ集取カレンダー
perlで挑むごみ集取カレンダーShigetaka Yachi
 
関東地方で北海道を味わおう~上京した皆様へ~
関東地方で北海道を味わおう~上京した皆様へ~関東地方で北海道を味わおう~上京した皆様へ~
関東地方で北海道を味わおう~上京した皆様へ~洋史 東平
 
Two sides of Python Engineer Training Book in PyCon mini Sapporo
Two sides of Python Engineer Training Book in PyCon mini SapporoTwo sides of Python Engineer Training Book in PyCon mini Sapporo
Two sides of Python Engineer Training Book in PyCon mini SapporoTakanori Suzuki
 
Code for Sapporoのこれまでとこれから
Code for SapporoのこれまでとこれからCode for Sapporoのこれまでとこれから
Code for SapporoのこれまでとこれからYusuke Suzuki
 
メイキング・オブ・ザ・さっぽろ保育園マップ
メイキング・オブ・ザ・さっぽろ保育園マップメイキング・オブ・ザ・さっぽろ保育園マップ
メイキング・オブ・ザ・さっぽろ保育園マップYusuke Suzuki
 

Similar to The plan of Aniki 2.0 (6)

perlで挑むごみ集取カレンダー
perlで挑むごみ集取カレンダーperlで挑むごみ集取カレンダー
perlで挑むごみ集取カレンダー
 
関東地方で北海道を味わおう~上京した皆様へ~
関東地方で北海道を味わおう~上京した皆様へ~関東地方で北海道を味わおう~上京した皆様へ~
関東地方で北海道を味わおう~上京した皆様へ~
 
Two sides of Python Engineer Training Book in PyCon mini Sapporo
Two sides of Python Engineer Training Book in PyCon mini SapporoTwo sides of Python Engineer Training Book in PyCon mini Sapporo
Two sides of Python Engineer Training Book in PyCon mini Sapporo
 
Code for Sapporoのこれまでとこれから
Code for SapporoのこれまでとこれからCode for Sapporoのこれまでとこれから
Code for Sapporoのこれまでとこれから
 
メイキング・オブ・ザ・さっぽろ保育園マップ
メイキング・オブ・ザ・さっぽろ保育園マップメイキング・オブ・ザ・さっぽろ保育園マップ
メイキング・オブ・ザ・さっぽろ保育園マップ
 
NaraとOSMとFOSS4G
NaraとOSMとFOSS4GNaraとOSMとFOSS4G
NaraとOSMとFOSS4G
 

More from karupanerura

Technology for reduce of mistakes - うっかりをなくす技術
Technology for reduce of mistakes - うっかりをなくす技術Technology for reduce of mistakes - うっかりをなくす技術
Technology for reduce of mistakes - うっかりをなくす技術karupanerura
 
Why we use mruby with Perl5?
Why we use mruby with Perl5?Why we use mruby with Perl5?
Why we use mruby with Perl5?karupanerura
 
Perlにおけるclass実装パターン
Perlにおけるclass実装パターンPerlにおけるclass実装パターン
Perlにおけるclass実装パターンkarupanerura
 
モジュール開発におけるぼくの試行錯誤
モジュール開発におけるぼくの試行錯誤モジュール開発におけるぼくの試行錯誤
モジュール開発におけるぼくの試行錯誤karupanerura
 
Aniki - The ORM as our great brother.
Aniki - The ORM as our great brother.Aniki - The ORM as our great brother.
Aniki - The ORM as our great brother.karupanerura
 
Perl5 meta programming
Perl5 meta programmingPerl5 meta programming
Perl5 meta programmingkarupanerura
 
mysqlcasual6-next-key-lock
mysqlcasual6-next-key-lockmysqlcasual6-next-key-lock
mysqlcasual6-next-key-lockkarupanerura
 
若手Itエンジニア飲み会-LT
若手Itエンジニア飲み会-LT若手Itエンジニア飲み会-LT
若手Itエンジニア飲み会-LTkarupanerura
 
perl5の日付時刻処理とか
perl5の日付時刻処理とかperl5の日付時刻処理とか
perl5の日付時刻処理とかkarupanerura
 
Yapc asia-2012-lt-thon
Yapc asia-2012-lt-thonYapc asia-2012-lt-thon
Yapc asia-2012-lt-thonkarupanerura
 
ぼくがかんがえたさいきょうのMvc
ぼくがかんがえたさいきょうのMvcぼくがかんがえたさいきょうのMvc
ぼくがかんがえたさいきょうのMvckarupanerura
 

More from karupanerura (20)

Perl5 VS JSON
Perl5 VS JSONPerl5 VS JSON
Perl5 VS JSON
 
KOWAZA for mackerel
KOWAZA for mackerelKOWAZA for mackerel
KOWAZA for mackerel
 
Technology for reduce of mistakes - うっかりをなくす技術
Technology for reduce of mistakes - うっかりをなくす技術Technology for reduce of mistakes - うっかりをなくす技術
Technology for reduce of mistakes - うっかりをなくす技術
 
Why we use mruby with Perl5?
Why we use mruby with Perl5?Why we use mruby with Perl5?
Why we use mruby with Perl5?
 
はかたの塩
はかたの塩はかたの塩
はかたの塩
 
Gotanda.pmの紹介
Gotanda.pmの紹介Gotanda.pmの紹介
Gotanda.pmの紹介
 
すいすいSwift
すいすいSwiftすいすいSwift
すいすいSwift
 
Perlにおけるclass実装パターン
Perlにおけるclass実装パターンPerlにおけるclass実装パターン
Perlにおけるclass実装パターン
 
モジュール開発におけるぼくの試行錯誤
モジュール開発におけるぼくの試行錯誤モジュール開発におけるぼくの試行錯誤
モジュール開発におけるぼくの試行錯誤
 
Aniki - The ORM as our great brother.
Aniki - The ORM as our great brother.Aniki - The ORM as our great brother.
Aniki - The ORM as our great brother.
 
Perl5 meta programming
Perl5 meta programmingPerl5 meta programming
Perl5 meta programming
 
mysqlcasual6-next-key-lock
mysqlcasual6-next-key-lockmysqlcasual6-next-key-lock
mysqlcasual6-next-key-lock
 
dwangocpp1-lt
dwangocpp1-ltdwangocpp1-lt
dwangocpp1-lt
 
engineer-life
engineer-lifeengineer-life
engineer-life
 
若手Itエンジニア飲み会-LT
若手Itエンジニア飲み会-LT若手Itエンジニア飲み会-LT
若手Itエンジニア飲み会-LT
 
Hachioji.pm #40
Hachioji.pm #40Hachioji.pm #40
Hachioji.pm #40
 
Hachioji.pm #39
Hachioji.pm #39Hachioji.pm #39
Hachioji.pm #39
 
perl5の日付時刻処理とか
perl5の日付時刻処理とかperl5の日付時刻処理とか
perl5の日付時刻処理とか
 
Yapc asia-2012-lt-thon
Yapc asia-2012-lt-thonYapc asia-2012-lt-thon
Yapc asia-2012-lt-thon
 
ぼくがかんがえたさいきょうのMvc
ぼくがかんがえたさいきょうのMvcぼくがかんがえたさいきょうのMvc
ぼくがかんがえたさいきょうのMvc
 

The plan of Aniki 2.0