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.7k
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
Reframing the Agile Manifesto
koic
5
4k
The NotImplementedError Problem in Ruby
koic
1
2.1k
Exploring RuboCop with MCP
koic
0
7k
Ruby and LLM Ecosystem 2nd
koic
1
2.3k
STYLE
koic
1
2.2k
Ruby and LLM Ecosystem
koic
3
13k
Write Code Every Day
koic
1
2.7k
Bliki (ja), and the Cathedral, and the Bazaar
koic
7
3.3k
Welcome to the LLM Club
koic
0
430
Other Decks in Programming
See All in Programming
LoopHub - ローカルで動く GitHub で、AI と共同開発
jugyo
0
440
Can LLMs Replicate 4 Years of Compose Migration? Exploring the boundaries of automation with 279 XML files from a real product
makun
0
130
書籍「プロフェッショナルAI駆動開発」紹介スライド
juntaromatsumoto
0
1k
AIに既存システムを理解させる技術 ~レガシーを見捨てないハーネスエンジニアリング入門~
ochtum
0
210
スマート反転とウェブアクセシビリティ
camiha
0
130
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
110
GKE アップグレード前に知っておきたい Blue/Green と PDB の関係
stkk
0
160
PHPプロジェクトの結合バランスを可視化する #php_night
kajitack
0
230
AIと壁打ちしながら進めるコスト管理
fufuhu
2
1.9k
不幸な GC
chencmd
0
890
高専キャリア LT 発表内容
crysta1221
6
5.6k
デプロイ直後のレイテンシスパイクを調べたら、 Railsの仕様にたどり着いた
nhsykym
0
110
Featured
See All Featured
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
320
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.1k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
920
Making the Leap to Tech Lead
cromwellryan
135
10k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
560
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
400
Navigating Weather and Climate Data
rabernat
0
510
Product Roadmaps are Hard
iamctodd
55
13k
Build your cross-platform service in a week with App Engine
jlugia
234
19k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
230
Fireside Chat
paigeccino
42
4k
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