Rubyで楽しくアートコードを作ろう

こんにちは。24年度新卒の ryoaio です。

1年が経ち、最近は興味のあったPdMとしても活動し始めております。

挑戦できる環境に感謝し、日々成長します🔥

弊社は 関西Ruby会議08 スポンサーです!!

今年6/28(土)開催される関西Ruby会議08。

弊社ingageも協賛し、今年はブースも開きます!🙌

regional.rubykaigi.org

今年の関西Ruby会議のテーマは「Rubyと作ろう」

さて、ブースはどんな内容にしようかな。

せっかくエンジニアが集まるカンファレンス。エンジニアの方に興味を持っていただけるようにしたい。

...ここで松山Ruby会議で魅了されたTRICKが頭をよぎりました。

自分自身のソースコードを出力するプログラム?

「Quine」(クワイン) ja.wikipedia.org

ソースコードと完全に同じ文字列を出力するプログラムのことです。 これを利用することで、一見アートのような見た目で実行できるプログラムコードが作成できます! 実行結果がソースコードになっているので、それをまた実行できる...

まだ読めていないのですが、「あなたの知らない超絶技巧プログラミングの世界」では、こういったTRICKに使えるテクニックが満載のようです。 (2015年発売のものですが、Ruby会議で紹介されるなどまだまだ現役...!) gihyo.jp

今回はこれを使う一歩手前、思い描く見た目通りのプログラムを生成する方法についてご紹介します。

使うRubyのテクニック

「eval」

= 引数で渡された文字列をRubyとして実行する

docs.ruby-lang.org

普段使うことはありませんね。。笑

> eval 'puts "ingage"'
ingage

トップレベルのevalは外からのローカル変数にアクセスできないことがあり、その場合スコープを鑑みてグローバル変数($)を使うと良いです。

「%記法」

docs.ruby-lang.org

こちらは普段Rubyを書いていてもよく使いますが、%wは空白を使って配列を区切ることができます。

%w(foo bar baz)

「join」または「* ""」

%wを使って区切られた配列をくっつけるために使います。

> %w(in g a ge).join("")
ingage

> %w(in g a ge) * ""
ingage

ここまでを合わせると...

> eval(%w(puts "h e l l o")*"")
hello

空白は*""でくっつけて実行されるので、こんな形でもいいわけです。

> eval(%w(p
uts
 "h
   e
    ll
      o
")*"")

hello

...自由度が見えてきましたね。

アスキーアートの形にコードを整形する

アスキーアートはご自身で用意してもいいですし、画像から変換してくれるサイトなどもあります。 [#]だけで表現しておきましょう。

folge.me

次に、実行したいコードを用意します。

eval(%w(code)*"")

↑のcode部分に入ることになるので、空白文字の出力をしたい時などは要注意です。32.chrを使うなどで回避しましょう。

最後に、アスキーアートで表現した#からプログラムを1字ずつ置き換えます。

しかし、そんなことはやっていられませんので、自動化しましょう。

こちらを参考に置き換えを自動化できます。

github.com

ここでコードの長さとアートに必要な文字数が合致しない場合は、なんらかのコードを足したり、コメント(#)を埋めます。

やってみた

できたものがこちら

弊社製品であるRe:lationのロゴで作ってみました。

ingage.jp

irbで実行してみる

簡単な文字列の出力ですが、うまく実行できました✨ この調子で、ブース出展にもなんらかのコードをお披露目したい..!

最後に

ここまでご覧いただきありがとうございました。

業務で使うことはなくとも、「一目見たら中身が気になるようなアートコード」を作れるようになれば、エンジニアが集まるイベントで役に立つこともあるかもしれません...!

何より楽しい。

==

関西Ruby会議08、今から楽しみです...!

ご一緒に盛り上げていきましょう!