Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
%q is for Quine
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
The Rails Doctrine Decade
koic
2
440
Reframing the Agile Manifesto
koic
5
4.6k
The NotImplementedError Problem in Ruby
koic
1
2.1k
Exploring RuboCop with MCP
koic
0
7.6k
Ruby and LLM Ecosystem 2nd
koic
1
2.3k
STYLE
koic
1
2.2k
Ruby and LLM Ecosystem
koic
3
14k
Write Code Every Day
koic
1
2.7k
Bliki (ja), and the Cathedral, and the Bazaar
koic
7
3.3k
Other Decks in Programming
See All in Programming
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
1
330
AI時代のコードレビューは人に向けるな、仕組みに向けろ
texmeijin
5
3.2k
GemmaをJevのように使ってみる / Use Gemma like Jev
kishida
4
430
Java 27新機能 / Java 27 new features
kishida
2
190
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
510
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
2.6k
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
360
mrbgem 三角測量 開発
ogom
0
160
setup-vp GitLab対応の裏側
naokihaba
0
140
モジュールの視点からSwiftを読み解く #iosdc
s_shimotori
0
290
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
430
Workers Cache を知る
syumai
0
320
Featured
See All Featured
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
2
930
From π to Pie charts
rasagy
1
380
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
850
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
420
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.2k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.3k
Ruling the World: When Life Gets Gamed
codingconduct
0
380
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
450
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.3k
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