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
%q is for Quine
Search
Koichi ITO
December 19, 2022
Programming
1.6k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
%q is for Quine
Koichi ITO
December 19, 2022
More Decks by Koichi ITO
See All by Koichi ITO
The NotImplementedError Problem in Ruby
koic
1
700
Exploring RuboCop with MCP
koic
0
5.2k
Ruby and LLM Ecosystem 2nd
koic
1
2.2k
STYLE
koic
0
2.2k
Ruby and LLM Ecosystem
koic
3
13k
Write Code Every Day
koic
1
2.6k
Bliki (ja), and the Cathedral, and the Bazaar
koic
7
3.1k
Welcome to the LLM Club
koic
0
410
RuboCop: Modularity and AST Insights
koic
3
5.7k
Other Decks in Programming
See All in Programming
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
120
[2026年度第1回ORセミナー] 計画最適化ベンチャーと競技プログラミング人材
terryu16
0
250
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
530
Modding RubyKaigi for Myself
yui_knk
0
910
Developing with AI Agents — Codex, Claude Code & Cowork Practical Guide
x5gtrn
PRO
0
1.1k
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
120
Observability in Practice:Grafana 與 Edge Device SRE 的那些事
blueswen
0
160
A2UI という光を覗いてみる
satohjohn
1
120
Lemonade + Foundry Toolkit でお手軽アプリ開発
seosoft
1
320
TAKTでAI駆動開発の品質を設計する
j5ik2o
6
1.2k
Swiftのレキシカルスコープ管理
kntkymt
0
220
正しくソフトウェアを作る、前提を疑うための認知の視点 / doubt-premise
minodriven
20
6.4k
Featured
See All Featured
Agile that works and the tools we love
rasmusluckow
331
21k
KATA
mclloyd
PRO
35
15k
Testing 201, or: Great Expectations
jmmastey
46
8.2k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
71
40k
Accessibility Awareness
sabderemane
1
140
Mind Mapping
helmedeiros
PRO
1
240
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4k
Making Projects Easy
brettharned
120
6.7k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.1k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.5k
Unsuck your backbone
ammeep
672
58k
Transcript
2VJOFجຊจܕͷಡΈॱ %q is for Quine !LPJD
w ઈٕϓϩάϥϛϯάͷ w ଏੈͷརӹͱؔͷͳ͍ͳ͠ ࠓͷͳ͠
53*$,࡞ΑΓ ࢲͷ͖ͳٕ࡞ $ruby.is_a?(Object){|oriented| language} IUUQTHJUIVCDPNUSJDUSJDLCMPCNBTUFSVOBLFOUSZSC VTBL࡞
53*$,ۚ ઈٕ࡞ UPNQOH࡞ IUUQTUXJUUFSDPNUPNQOHTUBUVT
3VCZ,BJHJͷ หεϙϯαʔΑΓ &4. *ODͷΞεΩʔΞʔτ࡞ GLJOP࡞ IUUQTHJTUHJUIVCDPNGLJOPDFCFFBFBBBBGDFpMFFTN@CFOUPSC w FWBM X
ͱ͍͏ఆੴ͕ΘΕ͍ͯΔ w ͜͏͍ٕͬͨͷجૅΛֶΔॻ੶͋Δʁ
ٕज़ධࣾ
w ιϑτΣΞ։ൃͷϓϩΛࢦͨ͢Ί ͷॻ੶Ͱͳ͍ w ϓϩάϥϛϯάͷ࣮༻ੑͱ͍͏ࡶ೦Λ ΕΔ͜ͱͰɺϓϩάϥϛϯάຊདྷͷ ָ͠͞Λ࠶ൃݟ͢Δ͖͔͚ͬʹͳΔ w ஶऀͷ3VCZίϛολʔNBNF͞Μ 8PSME/P*0$$$1MBZFS
͋ͳͨͷΒͳ͍ઈٕϓϩάϥϛϯάͷੈք
Ͱ͖Δ͚ͩฏқʹ Ͱ͖Δ͚ͩղʹ ࣮༻తʹ ඇ࣮༻తʹ ઈٕϓϩάϥϛϯά ͓ࣄͷϓϩάϥϛϯά ͋ͳͨͷΒͳ͍ઈٕϓϩάϥϛϯάͷੈք
2VJOF
w ࣗࣗΛධՁͯ͠ɺࣗࣗΛग़ྗ͢Δ ϓϩάϥϜͰ͢ 2VJOFͱʁ % ruby -e 'eval s=%q(puts %(eval
s=%q(#{s})))' eval s=%q(puts %(eval s=%q(#{s})))
ࠓճࡐͱ͢Δجຊจܕ eval s=%q(puts %(eval s=%q(#{s})))
lͲͷΑ͏ʹಈ͔͘ɺ ߟ͑ͯΈ͍ͯͩ͘͞ IUUQTUXJUUFSDPNNPSJNPSJIPHFTUBUVT ʰ͋ͳͨͷΒͳ͍ઈٕϓϩάϥϛϯάͷੈքʱQΑΓ ʰͲ͏ॻ͘ʱͳΒ͵ʰͲ͏ಡΉʱͱ͍ͬͨײ͡Ͱɺ ͍ͪಡऀͱͯ͠ߟ͑ͯΈ·ͨ͠
FWBMͷલʹҾͷೖ͕ߦΘΕ·͢ ࠷ॳͷΩʔϙΠϯτ eval s=%q(puts %(eval s=%q(#{s})))
ೖ͞Ε͍ͯΔͷRͱ͍͏γϯάϧΫΥʔτ૬ͷૉ ͳจࣈྻϦςϥϧͰ͢ɻ͜͜Ͱจࣈྻʹࣜల։͕ॻ͔Ε ͍ͯ·͕͢ɺγϯάϧΫΥʔτͳͷͰࣜల։͞Εͣɺͦͷ ··ͷจࣈྻͱͯ͠ѻΘΕ·͢ɻ ͍͠ͷจࣈྻ eval s=%q(puts %(eval s=%q(#{s})))
ه๏Λ ಡΈସ͑Δ IUUQTUXJUUFSDPNNPSJNPSJIPHFTUBUVT ઈٕϓϩάϥϚʔޚ༻ୡͬΆ͍ ه๏Λ Α͘ݟΔޓΫΥʔτʹಡΈସ͑ͯΈ·͠ΐ͏ RJTGPS2VJOF
͔͜͜Βه๏׳Ε͍ͯ͠ͳ͍ਓͷͨΊศٓతʹɺ͜ͷ จࣈྻΛಉٛͷΫΥʔτه๏ͰಡΈସ͑ͯΈ·͠ΐ͏ɻ ·ͣҰ൪֎ଆͷRه๏ΛγϯάϧΫΥʔτʹ͠·͢ɻ RͷಡΈସ͑ -eval s=%q(puts %(eval s=%q(#{s}))) +eval s='puts
%(eval s=%q(#{s}))' গ͠ಡΈ͘͢ͳͬͨʁ
ه๏ΛμϒϧΫΥʔτʹ͠·͢ɻ ه๏ͷಡΈସ͑ -eval s='puts %(eval s=%q(#{s}))' +eval s='puts "eval s=%q(#{s})"'
͏গ͠ಡΈ͘͢ͳͬͨʁ
ΤεέʔϓͰಡΈͮΒ͘ͳΔͷͰ͕͢ɺଆ ͷRγϯάϧΫΥʔτʹஔ͖͑·͢ɻ RͷಡΈସ͑ -eval s='puts "eval s=%q(#{s})"' +eval s='puts "eval
s=\'#{s}\'"' ͍ͭ͘ॏͶͯΤεέʔϓෆཁͳͨΊ ઈٕϓϩάϥϚʔޚ༻ୡΒ͍͠
શମͱͯ͠γϯάϧΫΥʔτͰғ·Εͨɺࣜల ։ΛධՁ͠ͳ͍ͨͩͷจࣈྻͰ͢ɻ܁Γฦ͠ʹͳ Γ·͕͢ɺ͜ͷஈ֊Ͱ\T^ධՁ͞Ε·ͤΜɻ ಡΈସ͑ͨ͠จࣈྻΛݟͯΈ·͠ΐ͏ eval s='puts "eval s=\'#{s}\'"'
͜͜ͰϩʔΧϧมTʹγϯάϧΫΥʔτ Ϧςϥϧͷจࣈྻ͕ೖ͞Ε·͢ɻ 2VJOFͷશମ૾ʹ͍͖ͬͯ·͠ΐ͏ eval s='puts "eval s=\'#{s}\'"'
ೖޙʹFWBMʹೖͨ͠จࣈྻΛධՁ͠· ͢ɻͳ͓͜ͷ࣌ͰϩʔΧϧมTʹจࣈ ྻ͕ೖ͞Ε͍ͯ·͢ɻ ҾΛFWBMͰධՁ͢Δ eval s='puts "eval s=\'#{s}\'"'
FWBM͞ΕΔ༰ͱͯ͠ɺ͜͜·Ͱݟ͖ͯͨจ ࣈྻΛจʹͯ͠ݟͯΈ·͠ΐ͏ɻ FWBMͰධՁ͞ΕΔจ eval s='puts "eval s=\'#{s}\'"'
QVUT͢Δ༰͜͜ͰධՁ͞ΕΔμϒϧ ΫΥʔτจࣈྻͰ͢ɻ ͯࣜ͞ల։\T^ʹೖΔʁ ඪ४ग़ྗ͢ΔจࣈྻͷΈཱͯ eval s='puts "eval s=\'#{s}\'"'
μϒϧΫΥʔτࣜల։͞ΕΔͷͰɺ\T^ʹFWBMධ Ձલʹจࣈྻೖ͍ͯ͠ΔϩʔΧϧมT͕ల։͞Ε· ͢ɻϩʔΧϧมTʹೖ͍ͬͯΔจࣈྻΛ࠶ܝ͠·͢ɻ ϩʔΧϧมTͷจࣈྻίϨ eval s='puts "eval s=\'#{s}\'"'
͜ͷจࣈྻΛࣜల։ʹೖΕͯΈ·͠ΐ͏ɻ ˞ͨͩ͠μϒϧΫΥʔτจࣈྻͷΤεέʔϓ͕ෆ ͍ͯ͠Δ͜ͷίʔυಈ͖·ͤΜɻ࣍ϖʔδͰ ϩʔΧϧมTʹΑΔࣜల։ -"eval s=\'#{s}\'" +"eval s=\'puts "eval s=\'#{s}\'"\'"
ࣜͷల։ޙͳͷͰɺҙຯ߹͍తʹγϯάϧ ΫΥʔτʹஔ͖͑·͢ɻ ϩʔΧϧมTʹΑΔࣜల։ -"eval s=\'puts "eval s=\'#{s}\'"\'" +'eval s=\'puts "eval
s=\'#{s}\'"\''
ϓϩάϥϜࣗΛ࠶ؼతʹग़ྗ͍ͯ͠Δ͜ͱ͕Θ͔Γ·͢ɻ࣍ ϖʔδ͔ΒɺศٓతʹΫΥʔτஔ͍ͯͨ͠෦Λɺຊདྷͷ ه๏ʹ͠·͠ΐ͏ɻ QVUTग़ྗ͞ΕΔจࣈྻͷݪܕ puts 'eval s=\'puts "eval s=\'#{s}\'"\''
·ͣଆͷγϯάϧΫΥʔτΛRʹ͠· ͢ɻ ಡΈସ͑ΛRʹ͢ -"eval s=\'puts "eval s=\'#{s}\'"\'" +"eval s=\'puts "eval
s=%q(#{s})"\'"
࣍ʹμϒϧΫΥʔτΛه๏ʹ͠·͢ɻ ಡΈସ͑Λه๏ʹ͢ -"eval s=\'puts "eval s=%q(#{s})"\'" +"eval s=\'puts %(eval s=%q(#{s}))\'"
࠷ޙʹ֎ଆͷγϯάϧΫΥʔτΛRʹ͠·͢ɻ ه๏͍ͭ͘ॏͶͯόοΫεϥογϡෆཁͱ͍͏ ͜ͱͰɺ2VJOFͷΠσΟΦϜͱͳ͍ͬͯΔΑ͏Ͱ͢ɻ ಡΈସ͑ΛRʹ͢ -"eval s=\'puts %(eval s=%q(#{s}))\'" +"eval s=%q(puts
%(eval s=%q(#{s})))" େࣄͳ͜ͱͳͷͰ͏Ұ
ࡐͷ2VJOFΛ࠶ܝ eval s=%q(puts %(eval s=%q(#{s}))) 2VJOFͷίʔυϦʔςΟϯά͕Ұप͠·ͨ͠ɻ ධՁ͞ΕΔಡΈॱͰ͕ಈ͘Α͏ʹͳΓ·͔ͨ͠ʁ લϖʔδ·Ͱݟ͖ͯͨจࣈྻ࠷ॳʹݟͨ 2VJOFͦͷͷͰ͢ɻ
w SVCZίϚϯυΛ࣮ߦͯ͠ɺࡐͷجຊจ ܕΛ࣮ߦͯ͠Έ·͠ΐ͏ɻ 2VJOFͷ࣮ߦ % ruby -e 'eval s=%q(puts %(eval
s=%q(#{s})))' eval s=%q(puts %(eval s=%q(#{s})))
w ࣗࣗͷग़ྗΛ࠶ධՁͨ݁͠Ռࣗ ࣗͰ͢ 2VJOFͷ࣮ߦ % ruby -e 'eval s=%q(puts %(eval
s=%q(#{s})))' \ | ruby eval s=%q(puts %(eval s=%q(#{s})))
w ࣗࣗͷग़ྗΛ࠶ʑධՁͨ݁͠Ռࣗ ࣗͰ͢ 2VJOFͷ࣮ߦ % ruby -e 'eval s=%q(puts %(eval
s=%q(#{s})))' \ | ruby | ruby eval s=%q(puts %(eval s=%q(#{s})))
w ࣗࣗͷग़ྗΛ࠶ʑʑධՁͨ݁͠Ռ ࣗࣗͰ͢ 2VJOFͷ࣮ߦ % ruby -e 'eval s=%q(puts %(eval
s=%q(#{s})))' \ | ruby | ruby | ruby eval s=%q(puts %(eval s=%q(#{s})))
ࠓճࡐͱͨ͠جຊจܕ eval s=%q(puts %(eval s=%q(#{s}))) ͜ͷ2VJOFͷઆ໌͜͜·ͰͰ͢
Կͷʹཱͨͳ͍ ϓϩάϥϜΛָ͠ΉจԽ IUUQTXXXZPVUVCFDPNXBUDI W5#ON((VV
l ख़ͨ͠จԽɺྫ͑ԻָͰָේΛٯ͞ʹͯ͠ ͘͜ͱ͕Ͱ͖ΔԻָͱ͔ͦ͏͍͏ͷ͕͋ͬ ͯɺ தུ ख़ͨ͠จԽʹ͜͏͍͓ͬͨ༡ͼ ͕ൃల͍ͯͯ͠ɺϓϩάϥϛϯάͱ͍͏ ख़ͨ͠จԽʹͳ͍ͬͯΔͱ͍͑ΔΜͰ͔͢Ͷ !LJOBCB
w ஶऀͷԕ౻ NBNF ͞Μ 8PSME/P*0$$$1MBZFS w ୭͕ॻ͍ͨॻ੶ɺॏཁ w ʑͷٕ͕հ͞Ε͍ͯΔ w
ϓϩάϥϛϯάͷਂ७ਮͳ ָ͠͞Λࢥ͍ฦ͖͔͚ͬ͢ʹͳ Δ͔ ͋ͳͨͷΒͳ͍ઈٕϓϩάϥϛϯάͷੈք
% cat esm_bento.rb | tee /dev/stderr | ruby | grep
--color . eval( %w( put s(([ 2*7, 2*31 ,1,3 *3*5 ,2*2 *2*2 *3]. map{ |c|c .to_ s(5*7 ).gs ub("1 "," \s") .upca se}. zip( [2*5* 61*1 801, 2*5*3 931, 811* 1871, 2*11 *350 27,7* 11*1 259* 20389 *764 171].map{|c|c.to_s(2*2*3*3)}))*""))*"") Enjoy Ruby with Agile Development https://gist.github.com/fkino/c4e73594b0e9eaea9621a273aa1fc6e8