>100 Views
February 12, 25
スライド概要
DeNA TechCon 2025 DeNA Tech Community Lightning Talks Speaker #6
DeNAでは、言語や技術領域を軸とした、技術コミュニティ活動が活発に行われています。このセッションは各技術コミュニティに所属するエンジニアが各言語・技術領域に関するLightning Talk セッションを行います。
◆ チャンネル登録はこちら↓
https://www.youtube.com/c/denatech?sub_confirmation=1
◆ X(旧Twitter)
https://x.com/denaxtech
◆ DeNA Engineering
https://engineering.dena.com/
◆ DeNA Engineer Blog
https://engineering.dena.com/blog/
◆ DeNA × AI Day ‖ DeNA TechCon 2025 公式サイト
https://techcon2025.dena.dev/
DeNA が社会の技術向上に貢献するため、業務で得た知見を積極的に外部に発信する、DeNA 公式のアカウントです。DeNA エンジニアの登壇資料をお届けします。
Ruby で Quine を書いてみる DeNA.rb 東正太 1 © DeNA Co., Ltd.
あずま しょうた ⾃⼰紹介 東 正太 所属:ゲームサービス事業本部 開発運営統括部第三技術部 サーバーグループ 趣味:バレーボール 2 © DeNA Co., Ltd.
RubyKaigi 2024 (沖縄) に参加しました 3 © DeNA Co., Ltd.
RubyKaigi 2024 で気になった講演 出典:https://rubykaigi.org/2024/presentations/tompng.html#day1 4 © DeNA Co., Ltd.
僕も Quine をやってみたい! 5 © DeNA Co., Ltd.
Quine とは ソースコードと実⾏結果が同じになるプログラムのこと class Greeter def initialize(name) @name = name end 6 コード 実⾏ class Greeter def initialize(name) @name = name end def greet puts "Hello, #{@name}!" # 複雑な処理 # ... puts "Nice to meet you!" end end def greet puts "Hello, #{@name}!" # 複雑な処理 # ... puts "Nice to meet you!" end end greeter = Greeter.new("Alice") greeter.greet greeter = Greeter.new("Alice") greeter.greet 実⾏結果 実⾏結果 © DeNA Co., Ltd.
Quine を書く ʻhoge’ を出⼒する Ruby プログラム 実⾏結果 実⾏結果 コード puts 'hoge' 7 実⾏ hoge © DeNA Co., Ltd.
Quine を書く ʻhoge’ を出⼒する Ruby プログラム 実⾏結果 実⾏結果 コード puts 'hoge' 実⾏ hoge ⼀致しない ⼀致しない 8 © DeNA Co., Ltd.
Quine を書く 実⾏結果を実⾏可能なコードにする 実⾏結果 実⾏結果 コード ??? 9 実⾏ puts 'hoge' © DeNA Co., Ltd.
Quine を書く 実⾏結果を実⾏可能なコードにする 実⾏結果 実⾏結果 コード puts 'puts \'hoge\'' 10 実⾏ puts 'hoge' © DeNA Co., Ltd.
Quine を書く 実⾏結果を実⾏可能なコードにする 実⾏結果 実⾏結果 コード puts 'puts \'hoge\'' 実⾏ puts 'hoge' ⼀致しない 11 © DeNA Co., Ltd.
Quine を書く 実⾏結果を実⾏可能なコードにする 実⾏結果 実⾏結果 コード puts 'puts \'puts \\\'hoge\\\'\'' 実⾏ puts 'puts \'hoge\'' puts 'puts \'puts \\\'hoge\\\'\'' puts 'puts \'puts \\\'puts \\\\\\\'hoge\\\\\\\'\\\'\'' ⼀致しない 12 © DeNA Co., Ltd.
Quine を書く 解決⽅法:⽂字列の⼀部を変数においてプログラムで⽂字列を書き換えて 出⼒する 実⾏結果 実⾏結果 コード s = "hoge"; puts s 13 実⾏ hoge © DeNA Co., Ltd.
Quine を書く 解決⽅法:⽂字列の⼀部を変数においてプログラムで⽂字列を書き換えて 出⼒する 実⾏結果 実⾏結果 コード s = "s = \"hoge\"; puts s"; puts s 14 実⾏ s = "hoge"; puts s © DeNA Co., Ltd.
Quine を書く 解決⽅法:⽂字列の⼀部を変数においてプログラムで⽂字列を書き換えて 出⼒する 実⾏結果 実⾏結果 コード s = "s = hoge; puts s.sub(\"hoge\", s.dump)"; puts s.sub("hoge", s.dump) 実⾏ s = "s = hoge; puts s.sub(\"hoge\", s.dump)"; puts s.sub("hoge", s.dump) ⼀致 15 © DeNA Co., Ltd.
Quine を⾃作してきました! 16 © DeNA Co., Ltd.
⾃作 Quine $s="De NA Te chC 02 5D eNA Te ch Co NA Te chCon 2025 De NA Te ec hC on 20 25 DeNA Te ch 5D eN A";eval $t =(( %q(eval l\ $t \ \ =( (\ %q (# #n2025 DeNAT ec hC on 20 17 on2025 De NATec n2 02 5D eN ch Con20 25DeN ATechC on 2025D eNATe Co n2 02 5D eN AT ec hC on 20 25 De (( %w(puts (" \$ s= \" "+ $s +" $t )) )) )# )* "" )) #T ec hC on 20 25 DeNAT echCo n2 02 5DeNA TechC on 20 hCon2 025D eNATe chCon2 AT ec hC on 20 25 De ch Co n2 02 5DeNAT NAT ec hC on2 02 \" ;" +% (e va 25 De NA Te ch Co 25DeNA Tech Con2025 De))) © DeNA Co., Ltd.
⾃作 Quine $s="De NA Te chC 02 5D eNA Te ch Co NA Te chCon 2025 De NA Te ec hC on 20 25 DeNA Te ch 5D eN A";eval $t =(( %q(eval l\ $t \ \ =( (\ %q (# #n2025 DeNAT ec hC on 20 on2025 De NATec n2 02 5D eN ch Con20 25DeN ATechC on 2025D eNATe Co n2 02 5D eN AT ec hC on 20 25 De (( %w(puts (" \$ s= \" "+ $s +" $t )) )) )# )* "" )) #T ec hC on 20 25 DeNAT echCo n2 02 5DeNA TechC on 20 hCon2 025D eNATe chCon2 AT ec hC on 20 25 De ch Co n2 02 5DeNAT NAT ec hC on2 02 \" ;" +% (e va 25 De NA Te ch Co 25DeNA Tech Con2025 De))) 実⾏ $s="De NA Te chC 02 5D eNA Te ch Co NA Te chCon 2025 De NA Te ec hC on 20 25 DeNA Te ch 5D eN A";eval $t =(( %q(eval l\ $t \ \ =( (\ %q (# #n2025 DeNAT ec hC on 20 18 on2025 De NATec n2 02 5D eN ch Con20 25DeN ATechC on 2025D eNATe Co n2 02 5D eN AT ec hC on 20 25 De (( %w(puts (" \$ s= \" "+ $s +" $t )) )) )# )* "" )) #T ec hC on 20 25 DeNAT echCo n2 02 5DeNA TechC on 20 hCon2 025D eNATe chCon2 AT ec hC on 20 25 De ch Co n2 02 5DeNAT NAT ec hC on2 02 \" ;" +% (e va 25 De NA Te ch Co 25DeNA Tech Con2025 De))) © DeNA Co., Ltd.
Quine が書ける Ruby 以外の⾔語
Python
Go
C
s = 's = %r\nprint(s %% s)'
print(s % s)
package main
import "fmt"
func main() {
s := `package main
import "fmt"
func main() {
s := %c%s%c
fmt.Printf(s, 96, s, 96)
}`
fmt.Printf(s, 96, s, 96)
}
#include <stdio.h>
JavaScript
(function f() {
const s = '(' + f.toString() + ')();';
console.log(s);
})();
19
int main() {
char *s = "#include <stdio.h>%c%cint
main() {%c char *s = %c%s%c;%c
printf(s, 10, 10, 10, 34, s, 34, 10, 10);%c
return 0;%c}%c";
printf(s, 10, 10, 10, 34, s, 34, 10, 10,
10);
return 0;
}
© DeNA Co., Ltd.
最後に… 20 © DeNA Co., Ltd.
DeNA.rb の After Event について 21 © DeNA Co., Ltd.