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
The underground in ActiveRecord::ConnectionAdap...
Search
Koichi ITO
March 10, 2018
Programming
6
3.7k
The underground in ActiveRecord::ConnectionAdapters
沖縄Ruby会議02
http://ruby.okinawa/okrk02/
Koichi ITO
March 10, 2018
Tweet
Share
More Decks by Koichi ITO
See All by Koichi ITO
STYLE
koic
0
980
Ruby and LLM Ecosystem
koic
3
7.3k
Write Code Every Day
koic
1
2.3k
Bliki (ja), and the Cathedral, and the Bazaar
koic
7
2.9k
Welcome to the LLM Club
koic
0
370
RuboCop: Modularity and AST Insights
koic
3
5.3k
Carving the Way to Ruby Engineering
koic
3
1.2k
Beyond the RuboCop Defaults
koic
3
5k
Minify Ruby Code
koic
2
2.5k
Other Decks in Programming
See All in Programming
疑似コードによるプロンプト記述、どのくらい正確に実行される?
kokuyouwind
0
390
コントリビューターによるDenoのすゝめ / Deno Recommendations by a Contributor
petamoriken
0
210
LLM Observabilityによる 対話型音声AIアプリケーションの安定運用
gekko0114
2
430
Grafana:建立系統全知視角的捷徑
blueswen
0
330
Unicodeどうしてる? PHPから見たUnicode対応と他言語での対応についてのお伺い
youkidearitai
PRO
1
2.6k
humanlayerのブログから学ぶ、良いCLAUDE.mdの書き方
tsukamoto1783
0
200
プロダクトオーナーから見たSOC2 _SOC2ゆるミートアップ#2
kekekenta
0
220
Claude Codeと2つの巻き戻し戦略 / Two Rewind Strategies with Claude Code
fruitriin
0
140
MDN Web Docs に日本語翻訳でコントリビュート
ohmori_yusuke
0
650
AIと一緒にレガシーに向き合ってみた
nyafunta9858
0
250
開発者から情シスまで - 多様なユーザー層に届けるAPI提供戦略 / Postman API Night Okinawa 2026 Winter
tasshi
0
210
React 19でつくる「気持ちいいUI」- 楽観的UIのすすめ
himorishige
11
7.5k
Featured
See All Featured
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
0
140
The Invisible Side of Design
smashingmag
302
51k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
0
210
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.3k
Site-Speed That Sticks
csswizardry
13
1.1k
Writing Fast Ruby
sferik
630
62k
Mobile First: as difficult as doing things right
swwweet
225
10k
Being A Developer After 40
akosma
91
590k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
170
Building AI with AI
inesmontani
PRO
1
700
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.9k
Transcript
"DUJWF3FDPSE $POOFDUJPO"EBQUFST ͷԼͷੈ ք ླྀٿେֶֶ෦߸ؗ 4BU ԭೄ3VCZձٞ 5IFVOEFSHSPVOEJO"3$POOFDUJPO"EBQUFST %JWFUPUIFSBJMTSBJMTSFQPTJUPSZ
ג ӬγεςϜϚωδϝϯτ ҏ౻ߒҰ !LPJD
None
None
ࠓͷ
None
None
None
w %JWFUPSBJMTSBJMTSFQP w "3$POOFDUJPO"EBQUFST w 0SBDMFFOIBODFEBEBQUFS w 0SBDMFXJUI3BJMT "HFOEB ˞#BTFEPO3BJMTSD
Dive to rails/rails
None
None
None
None
None
None
AR::ConectionAdapters
w "3ͷϞσϧܦ༝Ͱͷݺͼग़͠ʹର͠ ͯɺ3%#.4͝ͱʹཧʹ͔ͳͬͨ42- ΛΈཱͯͯฦׂ͢ w 3%#.4ͷ༷Λલఏ͢Δɻྫ͑ 0SBDMFͩͱۭจࣈͱ/6--Λ۠ผ͠ ͳ͍ɺHἬࣝผࢠ͕จࣈҎԼ "3$POOFDUJPO"EBQUFST
SBJMTSBJMTͷςετͰΔ3%#.4ͷ ༷ʹΑΔৼΔ͍ͷҧ͍ DVSSFOU@BEBQUFS
rails/rails#29370
WTOJM
Ξμϓλͷࢦఆͱ 3BJMTΛىಈ࣌ͷ ৼΔ͍ʹ͍ͭͯ
w ͝ଘEBUBCBTFZNMʹࢦఆ͢Δ BEBQUFSͱԿͳͷ͔͍·Ұ $POOFDUJPO"EBQUFSͷબ development: adapter: mysql2 development: adapter: postgresql
development: adapter: sqlite3 development: adapter: oracle_enhanced
w EBUBCBTFZNMͰࢦఆͨ͠Ξμϓλ͕ SBJMTDSBJMTTͰཁٻ͞ΕΔἬͷྲྀΕ "33BJMUJFJOJUJBMJ[FS "3$POOFDUJPO)BOEMJOHFTUBCMJTI@DPOOFDUJ PO "3$POOFDUJPO"EBQUFST$POOFDUJPO4QFDJpD BUJPOTQFD FTUBCMJTI@DPOOFDUJPO
"33BJMUJFJOJUJBMJ[FS IUUQTHJUIVCDPNSBJMTSBJMTCMPCWSDBDUJWFSFDPSEMJCBDUJWF@SFDPSESBJMUJFSC-
"3$POOFDUJPO)BOEMJOH FTUBCMJTI@DPOOFDUJPO IUUQTHJUIVCDPNSBJMTSBJMTCMPCWSDBDUJWFSFDPSEMJCBDUJWF@SFDPSEDPOOFDUJPO@IBOEMJOHSC-
"3$POOFDUJPO"EBQUFST $POOFDUJPO4QFDJpDBUJPOTQFD IUUQTHJUIVCDPNSBJMTSBJMTCMPCWSDBDUJWFSFDPSEMJCBDUJWF@SFDPSEDPOOFDUJPO@BEBQUFSTDPOOFDUJPO@TQFDJpDBUJPOSC-
w EBUBCBTFZNMͷࢦఆBEBQUFS ΛݩʹΞμϓλΛSFRVJSF͢Δ "3$POOFDUJPO"EBQUFST $POOFDUJPO4QFDJpDBUJPOTQFD path_to_adapter = "active_record/connection_adapters/#{spec[:adapter]}_adapter" begin require
path_to_adapter rescue LoadError => e (snip) end (snip) adapter_method = "#{spec[:adapter]}_connection" IUUQTHJUIVCDPNSBJMTSBJMTCMPCWSDBDUJWFSFDPSEMJCBDUJWF@SFDPSEDPOOFDUJPO@BEBQUFSTDPOOFDUJPO@TQFDJpDBUJPOSC-- SFRVJSF
SFRVJSF͞ΕΔ$PSFBEBQUFST
w EBUBCBTFZNMͷࢦఆBEBQUFS ΛݩʹίωΫγϣϯϝιου໊Λܾఆ "3$POOFDUJPO"EBQUFST $POOFDUJPO4QFDJpDBUJPOTQFD path_to_adapter = "active_record/connection_adapters/#{spec[:adapter]}_adapter" begin require
path_to_adapter rescue LoadError => e (snip) end (snip) adapter_method = "#{spec[:adapter]}_connection" IUUQTHJUIVCDPNSBJMTSBJMTCMPCWSDBDUJWFSFDPSEMJCBDUJWF@SFDPSEDPOOFDUJPO@BEBQUFSTDPOOFDUJPO@TQFDJpDBUJPOSC-- @DPOOFDUJPO
IUUQTHJUIVCDPNSBJMTSBJMTCMPCWSDBDUJWFSFDPSEMJCBDUJWF@SFDPSEDPOOFDUJPO@BEBQUFSTNZTRM@BEBQUFSSC- @DPOOFDUJPO
IUUQTHJUIVCDPNSBJMTSBJMTCMPCWSDBDUJWFSFDPSEMJCBDUJWF@SFDPSEDPOOFDUJPO@BEBQUFSTNZTRM@BEBQUFSSC- @DPOOFDUJPO %#$MJFOU
w 3VCZΦϒδΣΫτܦ༝Ͱ.Z42-Λૢ࡞͢Δ ΫϥΠΞϯτͱͳΔυϥΠό(FN require "mysql2" client = Mysql2::Client.new( :host =>
"localhost", :username => "root" ) results = client.query( "SELECT * FROM users WHERE group=‘githubbers'" ) results.each do |row| puts row["id"] # row[“id”].is_a? Integer if row["dne"] # non-existant hash entry is nil puts row["dne"] end end .ZTRMHFN IUUQTHJUIVCDPNCSJBONBSJPNZTRMVTBHF
"3ϞσϧͱυϥΠόͷதؒ $POOFDUJPO"EBQUFST "CTUSBDU"EBQUFS $POOFDUJPO "EBQUFST-BZFS "3.PEFM -BZFS %BUBCBTF $MJFOU-BZFS ˞ਤྫ.Z42-Ξμϓλ
(FNpMFʹࢦఆ ͍ͯ͠Δͷ͜Ε $POOFDUJPO"EBQUFST "CTUSBDU.ZTRM"EBQUFS $POOFDUJPO"EBQUFST .ZTRM"EBQUFS HFN NZTRM .Z42- %BUBCBTF -BZFS "3
"3ϞσϧͱυϥΠόͷதؒ $POOFDUJPO "EBQUFST-BZFS "3.PEFM -BZFS %BUBCBTF $MJFOU-BZFS ˞ਤྫ1PTUHSF42-Ξμϓλ (FNpMFʹࢦఆ ͍ͯ͠Δͷ͜Ε
$POOFDUJPO"EBQUFST 1PTUHSF42-"EBQUFS HFN QH 1PTUHSF42- %BUBCBTF -BZFS $POOFDUJPO"EBQUFST "CTUSBDU"EBQUFS "3
"3ϞσϧͱυϥΠόͷதؒ $POOFDUJPO "EBQUFST-BZFS "3.PEFM -BZFS %BUBCBTF $MJFOU-BZFS ˞ਤྫ42-JUFΞμϓλ (FNpMFʹࢦఆ ͍ͯ͠Δͷ͜Ε
$POOFDUJPO"EBQUFST 42-JUF"EBQUFS HFN TRMJUF 42-JUF %BUBCBTF -BZFS $POOFDUJPO"EBQUFST "CTUSBDU"EBQUFS "3
w EBUBCBTFZNMʹج͍ͮͨ $POOFDUJPO"EBQUFSTΛ͏ w $POOFDUJPO"EBQUFSͷઌͷଓ σʔλϕʔευϥΠόHFNͱͳΔ w NZTRM QH TRMJUFͳͲ
"3ͷσʔλϕʔεଓͷߏ
w SBJMTSBJMTϦϙδτϦͰϝϯςφ ϯε͞Ε͍ͯΔΞμϓλΛࢦ͢ w ݱࡏ.Z42- NZTRM 1PTUHSF42-42-JUFͷͭ w 3BJMTͷ$*ϚτϦοΫεʹೖͬͯΔ
$PSFBEBQUFST
w ֎෦(FNͱͯ͠ཁٻ͞ΕΔΞμϓλ w 0SBDMF w 42-4FSWFS w 'JSFCJSE w FUD
FUD SEQBSUZBEBQUFST
w 3BJMTຊମʹόϯυϧ͞Ε͍ͯΔίΞ ΞμϓλҎ֎͜͜ͰSFRVJSFͯ͠Δ "3$POOFDUJPO"EBQUFST $POOFDUJPO4QFDJpDBUJPOTQFD path_to_adapter = "active_record/connection_adapters/#{spec[:adapter]}_adapter" begin require
path_to_adapter rescue LoadError => e (snip) end (snip) adapter_method = "#{spec[:adapter]}_connection" IUUQTHJUIVCDPNSBJMTSBJMTCMPCWSDBDUJWFSFDPSEMJCBDUJWF@SFDPSEDPOOFDUJPO@BEBQUFSTDPOOFDUJPO@TQFDJpDBUJPOSC-- SFRVJSF ࠶ܝ
None
None
Oracle enhanced adapter
Ҏ߱ͷ։ൃऀ
w SBJMTSBJMTʹଘࡏ͍ͯͨ͠ 0SBDMF"EBQUFSͷ֦ு(FN w &EHF3BJMTʹਵ͍ͯ͠Δ w +%#$ΛͬͨଓΛαϙʔτͯ͠Δ w ͭ·Γ+3VCZαϙʔτΛ͍ͯ͠Δ 0SBDMFFOIBODFEBEBQUFS
0$*+%#$
w ੜ͢Δ$POOFDUJPOΛৼΓ͚͍ͯΔ 0SBDMF&OIBODFE$POOFDUJPO IUUQTHJUIVCDPNSTJNPSBDMFFOIBODFECMPCWSDMJCBDUJWF@SFDPSEDPOOFDUJPO@BEBQUFSTPSBDMF@FOIBODFEDPOOFDUJPOSC
w ৼΓ͚ͷλω36#:@&/(*/& 03"$-&@&/)"/$&%@$0//&$5*0/ IUUQTHJUIVCDPNSTJNPSBDMFFOIBODFECMPCWSDMJCBDUJWF@SFDPSEDPOOFDUJPO@BEBQUFSTPSBDMF@FOIBODFEDPOOFDUJPOSC
0$*$POOFDUJPO .3* $POOFDUJPO "EBQUFST-BZFS "3.PEFM -BZFS %BUBCBTF $MJFOU-BZFS ˞ਤྫ0SBDMFFOIBODFE 0SBDMF&OIBODFE
0$*$POOFDJUPO Ͱܨ͍͛ͯΔ $POOFDUJPO"EBQUFST 0SBDMF&OIBODFE"EBQUFS 0SBDMF %BUBCBTF -BZFS (FNpMFʹࢦఆ ͍ͯ͠Δͷ͜Ε HFN SVCZPDJ $POOFDUJPO"EBQUFST "CTUSBDU"EBQUFS "3
+%#$$POOFDUJPO +3VCZ $POOFDUJPO "EBQUFST-BZFS "3.PEFM -BZFS %BUBCBTF $MJFOU-BZFS ˞ਤྫ0SBDMFFOIBODFE 0SBDMF&OIBODFE
+%#$$POOFDJUPO Ͱܨ͍͛ͯΔ $POOFDUJPO"EBQUFST 0SBDMF&OIBODFE"EBQUFS 0SBDMF %BUBCBTF -BZFS $-"441"5)ʹ +"3Λࢦఆ KBS PKECDKBS $POOFDUJPO"EBQUFST "CTUSBDU"EBQUFS "3
w KSVCZBDUJWFSFDPSEKECDBEBQUFS Ͱཧ͞Ε͍ͯΔ <ิ>0SBDMFҎ֎ͷ+%#$αϙʔτ
A development of Oracle enhanced adapter
w */%&9ʹؔ͢Δ5"#-&41"$&Λࢦఆ Ͱ͖ΔΑ͏ʹରԠͨ͠<> w SBJMTECTDIFNBMPBEͷϚϧνΠϯ αʔτʹରԠͨ͠<> w 3VCZ0$*Λ3VCZͷ #JH%FDJNBMରԠ<SVCZPDJ> ࢥ͍ग़ͷύονબ
w */%&9ʹؔ͢Δ5"#-&41"$&Λࢦఆ Ͱ͖ΔΑ͏ʹରԠͨ͠<> w SBJMTECTDIFNBMPBEͷϚϧνΠϯ αʔτʹରԠͨ͠<> w 3VCZ0$*Λ3VCZͷ #JH%FDJNBMରԠ<SVCZPDJ> ͡ΊͯͷΞμϓλύον
rsim/oracle-enhanced#1028
w 0SBDMFͰ5"#-&41"$&Ͱςʔϒϧ ΠϯσοΫεͷอଘྖҬࢦఆ͕Ͱ͖Δ w 0SBDMFFOBIBODFEBEBQUFSͰ EFGBVMU@UBCMFTQBDFTͰࢦఆՄೳ w QSJNBSZLFZʹରͯ͠͏·͘ޮ͔ͳ ͔ͬͨͷͰͨ͠ 5"#-&41"$&ͷࢦఆ
w ࣌ࣗ৴͕ͳ͘*TTVFͰ͓͍ खݩʹϞϯΩʔύον͋ͬͨ
w 54@*/%&9Ͱͳ͘54@%"5"ʹೖͬͯͨ ͷमਖ਼ύον 0QFOB13
"3.JHSBUJPOͷDSBFUF@UBCMFͷ SEQBSUZΞμϓλ࣮ͷมߋ தུ Ճ IUUQTHJUIVCDPNSTJNPSBDMFFOIBODFECMPCWSDMJCBDUJWF@SFDPSEDPOOFDUJPO@BEBQUFSTPSBDMF@FOIBODFETDIFNB@TUBUFNFOUTSC-
w "-5&3*/%&93*-%5"#-&41"$&Λ ࣮ߦ͢ΔϝιουΛఆ͍ٛͯ͠Δ ADSFBUF@UBCMFA͔ΒͷϑοΫ
w ϦϙδτϦΛԣஅͨ͠มߋ͕ඞཁͩͬͨ $*͕ͱ͓Βͳ͍
w 64&34Ͱͳ͘4:45&.ʹอଘ͞Εͯͨ w %&'"6-55"#-&41"$&ͷมߋ w 0SBDMF͚ͷSBJMTEFWCPYͷ13 ZBIPOEBSBJMTEFWCPY
w 3%#.4ͷΞμϓλ։ൃͳͷͰ 3%#.4ʹԠͨ͡։ൃڥΛඋ͢Δ ඞཁ͕͋Δ w ZBIPOEBSBJMTEFWCPY͕ 0SBDMF͚ͷ։ൃڥͱͳΔ w $*ͱ߹Θͤͯ͜ͷڥΛ͏ͷ͕ྑ͍ ։ൃڥͷݟΛಘΔ
Oracle with Rails 6.0
w 3BJMTҎલϓϥΠϚϦΩʔ*%ͷ ࠾൪ʹ͍ͭͯ4&26&/$&Ͱ͍ग़͞ Ε͍ͯΔ w 3BJMTҎ߱0SBDMFDͷ *EFOUJUZ$PMVNOΛ͏ํͰݕ౼ w OFYUWBMͱ͍͏1P$ͷϦϒʔτ 1P$*EFOUJUZ
w 3BJMTҎલͷσϑΥϧτ EFGBVMU@TFRVFODF@TUBSU@WBMVF w 3BJMTҎޙͷσϑΥϧτ EFGBVMU@TFRVFODF@TUBSU@WBMVF ʹͳΓଞͷΞμϓλͱಉ͡ڍಈʹ $IBOHFAEFGBVMU@TFRVFODF@TUBSU@WBMVFA GSPNUP
w SBJMTECTUSVDUVSFEVNQͷࡍ ʹσϑΥϧτͰ7*&8͕μϯϓ͞Ε ΔΑ͏ʹͳΔ &YUSBDUWJFXTUPEC TUSVDUVSFTRMCZEFGBVMU
w 0SBDMF%"5"#"4&-*/,ͱ͍͏ ଞͷ%#ͷσʔλΛҾ͘ػߏ͕͋Γ 3BJMTܥ0SBDMFΞμϓλἬαϙʔτ w 3BJMTҎޙ3BJMTͷෳ%#ର ԠʹͤΔ͜ͱʹͳΓػೳআ͢Δํ SBJMTSBJMTࢀর %SPQEBUBCBTFMJOLTVQQPSU
%SPQEBUBCBTFMJOLTVQQPSU
w "3#BTFDPOOFDUJPOUBCMFTͷ ΓʹؚΊͯΔϚςϏϡʔΛ֎͠ςʔ ϒϧͷΈฦ͢Α͏ʹ͢Δ͔Ͳ͏͔ʁ w 1PTUHSF42-Ξμϓλʹ͓͚Δಉϝ ιου͕ϚςϏϡʔΛฦ͔͢Ͳ͏͔ʹ ΑΔ (JU)VCίϝϯτௐ &YDMVEFANBUFSJBMJ[FE@WJFXTA
GSPNAUBCMFTA
w 0SBDMFD3ҎԼͰΧϥϜ໊ͳ ͲࣝผࢠʹόΠτҎԼͷ੍ݶ͕͋Δ w SBJMTSBJMTͷ"3ͷҰ෦ͷςετ͕ 0SBDMFͰམͪΔ͍ͪཁҼͰ͋Δ w 0SBDMFD3Ҏ্όΠτ ·Ͱͷ֦ு͞ΕΔ͚ͲͲ͏͢Δʁ -POHJEFOUJpFSTTVQQPSU
+3VCZ +%#$TVQQPSUT0SBDMFD PSIJHIFS1%# 1MVHHBCMFEBUBCBTF
Oracle enhanced 6.0 may require Oracle 12c or higher
w ਓྨͰݟ͍ͯΔਓ͕ݶΒΕ͍ͯΔͱ͍͏ $POOFDUJPO"EBQUFSTͷׂͱߏͱ ϦϙδτϦͰͷॴʹ͍ͭͯ͠·ͨ͠ w "SFMपล͍͠ͷͰׂѪ͍ͯ͠·͕͢ɺ ͜ͷ͋ͨΓ৮ΕΔͱ͔ͳΓڧ͍ͱࢥ͍·͢ w LBNJQP͞ΜͱZBIPOEB͞Μ͍͢͝ਓ ͓ΘΓʹ
None