---
title: 【DeNA TechCon 2025】Ruby で Quine を書いてみる
tags:  #dena techcon 2025  
author: [DeNA_Tech](https://convert.docswell.com/user/DeNA_Tech)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/3EKQLLWRED.jpg?width=480
description: 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/
published: February 12, 25
canonical: https://convert.docswell.com/s/DeNA_Tech/ZDN3QG-techcon2025-green-1800-6
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/3EKQLLWRED.jpg)

Ruby で Quine を書いてみる
DeNA.rb 東正太
1
© DeNA Co., Ltd.


# Page. 2

![Page Image](https://bcdn.docswell.com/page/L73P331GE5.jpg)

あずま しょうた
⾃⼰紹介
東 正太
所属：ゲームサービス事業本部
開発運営統括部第三技術部
サーバーグループ
趣味：バレーボール
2
© DeNA Co., Ltd.


# Page. 3

![Page Image](https://bcdn.docswell.com/page/87DL44XNEG.jpg)

RubyKaigi 2024 (沖縄) に参加しました
3
© DeNA Co., Ltd.


# Page. 4

![Page Image](https://bcdn.docswell.com/page/VJP2MMPNJ8.jpg)

RubyKaigi 2024 で気になった講演
出典：https://rubykaigi.org/2024/presentations/tompng.html#day1
4
© DeNA Co., Ltd.


# Page. 5

![Page Image](https://bcdn.docswell.com/page/2EVD992YEQ.jpg)

僕も Quine をやってみたい！
5
© DeNA Co., Ltd.


# Page. 6

![Page Image](https://bcdn.docswell.com/page/57GYZZRW7L.jpg)

Quine とは
ソースコードと実⾏結果が同じになるプログラムのこと
class Greeter
def initialize(name)
@name = name
end
6
コード
実⾏
class Greeter
def initialize(name)
@name = name
end
def greet
puts &quot;Hello, #{@name}!&quot;
# 複雑な処理
# ...
puts &quot;Nice to meet you!&quot;
end
end
def greet
puts &quot;Hello, #{@name}!&quot;
# 複雑な処理
# ...
puts &quot;Nice to meet you!&quot;
end
end
greeter = Greeter.new(&quot;Alice&quot;)
greeter.greet
greeter = Greeter.new(&quot;Alice&quot;)
greeter.greet
実⾏結果
実⾏結果
© DeNA Co., Ltd.


# Page. 7

![Page Image](https://bcdn.docswell.com/page/4EQMLLVQJP.jpg)

Quine を書く
ʻhoge’ を出⼒する Ruby プログラム
実⾏結果
実⾏結果
コード
puts &#039;hoge&#039;
7
実⾏
hoge
© DeNA Co., Ltd.


# Page. 8

![Page Image](https://bcdn.docswell.com/page/KJ4VDDMYE1.jpg)

Quine を書く
ʻhoge’ を出⼒する Ruby プログラム
実⾏結果
実⾏結果
コード
puts &#039;hoge&#039;
実⾏
hoge
⼀致しない
⼀致しない
8
© DeNA Co., Ltd.


# Page. 9

![Page Image](https://bcdn.docswell.com/page/LE13ZZ8NJG.jpg)

Quine を書く
実⾏結果を実⾏可能なコードにする
実⾏結果
実⾏結果
コード
???
9
実⾏
puts &#039;hoge&#039;
© DeNA Co., Ltd.


# Page. 10

![Page Image](https://bcdn.docswell.com/page/GEWP99GMJ2.jpg)

Quine を書く
実⾏結果を実⾏可能なコードにする
実⾏結果
実⾏結果
コード
puts &#039;puts \&#039;hoge\&#039;&#039;
10
実⾏
puts &#039;hoge&#039;
© DeNA Co., Ltd.


# Page. 11

![Page Image](https://bcdn.docswell.com/page/47ZK99LM73.jpg)

Quine を書く
実⾏結果を実⾏可能なコードにする
実⾏結果
実⾏結果
コード
puts &#039;puts \&#039;hoge\&#039;&#039;
実⾏
puts &#039;hoge&#039;
⼀致しない
11
© DeNA Co., Ltd.


# Page. 12

![Page Image](https://bcdn.docswell.com/page/YJ6QKKW5JV.jpg)

Quine を書く
実⾏結果を実⾏可能なコードにする
実⾏結果
実⾏結果
コード
puts &#039;puts \&#039;puts
\\\&#039;hoge\\\&#039;\&#039;&#039;
実⾏
puts &#039;puts \&#039;hoge\&#039;&#039;
puts &#039;puts \&#039;puts
\\\&#039;hoge\\\&#039;\&#039;&#039;
puts &#039;puts \&#039;puts \\\&#039;puts
\\\\\\\&#039;hoge\\\\\\\&#039;\\\&#039;\&#039;&#039;
⼀致しない
12
© DeNA Co., Ltd.


# Page. 13

![Page Image](https://bcdn.docswell.com/page/GJ5RPPMG74.jpg)

Quine を書く
解決⽅法：⽂字列の⼀部を変数においてプログラムで⽂字列を書き換えて
出⼒する
実⾏結果
実⾏結果
コード
s = &quot;hoge&quot;; puts s
13
実⾏
hoge
© DeNA Co., Ltd.


# Page. 14

![Page Image](https://bcdn.docswell.com/page/9E2D669DER.jpg)

Quine を書く
解決⽅法：⽂字列の⼀部を変数においてプログラムで⽂字列を書き換えて
出⼒する
実⾏結果
実⾏結果
コード
s = &quot;s = \&quot;hoge\&quot;; puts
s&quot;; puts s
14
実⾏
s = &quot;hoge&quot;; puts s
© DeNA Co., Ltd.


# Page. 15

![Page Image](https://bcdn.docswell.com/page/D7Y2994M7M.jpg)

Quine を書く
解決⽅法：⽂字列の⼀部を変数においてプログラムで⽂字列を書き換えて
出⼒する
実⾏結果
実⾏結果
コード
s = &quot;s = hoge; puts
s.sub(\&quot;hoge\&quot;,
s.dump)&quot;; puts
s.sub(&quot;hoge&quot;, s.dump)
実⾏
s = &quot;s = hoge; puts
s.sub(\&quot;hoge\&quot;,
s.dump)&quot;; puts
s.sub(&quot;hoge&quot;, s.dump)
⼀致
15
© DeNA Co., Ltd.


# Page. 16

![Page Image](https://bcdn.docswell.com/page/VEN8LLY3J8.jpg)

Quine を⾃作してきました！
16
© DeNA Co., Ltd.


# Page. 17

![Page Image](https://bcdn.docswell.com/page/Y79K44PP73.jpg)

⾃作 Quine
$s=&quot;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&quot;;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 (&quot;
\$
s= \&quot;
&quot;+
$s +&quot;
$t
))
))
)# )*
&quot;&quot; ))
#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
\&quot;
;&quot; +% (e
va
25
De NA Te
ch
Co
25DeNA
Tech Con2025 De)))
© DeNA Co., Ltd.


# Page. 18

![Page Image](https://bcdn.docswell.com/page/G78RQQDXED.jpg)

⾃作 Quine
$s=&quot;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&quot;;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 (&quot;
\$
s= \&quot;
&quot;+
$s +&quot;
$t
))
))
)# )*
&quot;&quot; ))
#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
\&quot;
;&quot; +% (e
va
25
De NA Te
ch
Co
25DeNA
Tech Con2025 De)))
実⾏
$s=&quot;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&quot;;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 (&quot;
\$
s= \&quot;
&quot;+
$s +&quot;
$t
))
))
)# )*
&quot;&quot; ))
#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
\&quot;
;&quot; +% (e
va
25
De NA Te
ch
Co
25DeNA
Tech Con2025 De)))
© DeNA Co., Ltd.


# Page. 19

![Page Image](https://bcdn.docswell.com/page/L7LKXXMNER.jpg)

Quine が書ける Ruby 以外の⾔語
Python
Go
C
s = &#039;s = %r\nprint(s %% s)&#039;
print(s % s)
package main
import &quot;fmt&quot;
func main() {
s := `package main
import &quot;fmt&quot;
func main() {
s := %c%s%c
fmt.Printf(s, 96, s, 96)
}`
fmt.Printf(s, 96, s, 96)
}
#include &lt;stdio.h&gt;
JavaScript
(function f() {
const s = &#039;(&#039; + f.toString() + &#039;)();&#039;;
console.log(s);
})();
19
int main() {
char *s = &quot;#include &lt;stdio.h&gt;%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&quot;;
printf(s, 10, 10, 10, 34, s, 34, 10, 10,
10);
return 0;
}
© DeNA Co., Ltd.


# Page. 20

![Page Image](https://bcdn.docswell.com/page/4EM2LLYQEW.jpg)

最後に…
20
© DeNA Co., Ltd.


# Page. 21

![Page Image](https://bcdn.docswell.com/page/PERMKK9K79.jpg)

DeNA.rb の After Event について
21
© DeNA Co., Ltd.


