Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
%q is for Quine
Koichi ITO
December 19, 2022
Programming
0
410
%q is for Quine
Koichi ITO
December 19, 2022
Tweet
Share
More Decks by Koichi ITO
See All by Koichi ITO
Engineering Manager in Action
koic
4
1.1k
RuboCop Under a Microscope
koic
9
1.7k
Practices of an Engineering Manager: Working in The Read World
koic
7
3.1k
Company as a Product
koic
0
710
Make RuboCop Super Fast
koic
3
4.3k
Contribution Hatching: By RuboCop
koic
1
1.6k
The three great virtues are important
koic
13
3k
Formula of Software Estimation
koic
10
3.3k
RuboCop in 2021: Stable and Beyond
koic
0
1.2k
Other Decks in Programming
See All in Programming
子育てとEMと転職と
_atsushisakai
1
340
はてなリモートインターンシップ2022 Web API 講義資料
hatena
0
150
低レイヤーから始める GUI
fadis
18
9.3k
はてなリモートインターンシップ2022 フロントエンドブートキャンプ 講義資料
hatena
0
120
Hono v3 - Do Everything, Run Anywhere, But Small, And Faster
yusukebe
4
130
Glance App Widgetでウィジェットを作ろう / MoT TechTalk #15
mot_techtalk
0
120
OSSから学んだPR Descriptionの書き方
fugakkbn
4
130
Amebaブログの会員画面システム刷新の道程
ryotasugawara
1
230
Circuit⚡
monaapk
0
200
tidy_rpart
bk_18
0
580
Becoming an Android Librarian (Android World Wide 2023 Jan)
skydoves
1
170
23年のJavaトレンドは?Quarkusで理解するコンテナネイティブJava
tatsuya1bm
1
120
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
299
110k
Build your cross-platform service in a week with App Engine
jlugia
221
17k
Pencils Down: Stop Designing & Start Developing
hursman
114
10k
Building a Scalable Design System with Sketch
lauravandoore
451
31k
Optimizing for Happiness
mojombo
365
64k
Building Better People: How to give real-time feedback that sticks.
wjessup
346
17k
The Illustrated Children's Guide to Kubernetes
chrisshort
22
42k
Music & Morning Musume
bryan
37
4.6k
Reflections from 52 weeks, 52 projects
jeffersonlam
338
18k
How to Ace a Technical Interview
jacobian
270
21k
A Philosophy of Restraint
colly
193
15k
Support Driven Design
roundedbygravity
88
8.9k
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࡞ IUUQTHJTUHJUIVCDPNGLJOPDFCFFBFBBBBGDFpMF
[email protected]
SC 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