日記

日本語の勉強のためのブログ

「JavaScriptとして実行できるアスキーアート」を自動生成する

作成したデモはこちら
https://kalaxity.github.io/jsfuck-asciify/

概要

「プログラムのソースコードとしても動作するアスキーアート」を作成する試みがある。

非常に面白い試みではあるが、現状はこうしたAAを 完全自動 で、そして 手軽に 生成する仕組みは存在しない。

※厳密にいえば、上記記事のようにJupyter Notebook上で作成する方法は存在する。しかしこれはPythonの実行環境を別途用意する必要があり、手軽さには欠ける。 また、必要に応じてコードを微修正する必要もある。

そこで今回は、これを完全自動化するWebサイトの作成を目標とする。

完成品

完成したWebサイトはGithub上で公開しており、自由に使用できる。

https://kalaxity.github.io/jsfuck-asciify/

ユーザが(1)画像と(2)JavaScriptプログラムを入力すると、AA化された画像の1文字1文字にプログラムが割り当てられ、「JavaScriptプログラムとして動作するAA」が自動で出力される。


以下に、作成時の苦労や今後の改善点をまとめる。

自動作成の手順

自動作成は以下の3つの手順からなる。

  1. 画像からアスキーアートを作成する
  2. プログラムをアスキーアートに適した構造に書き換える(空白・改行が入っても実行できる形式に直す)
  3. アスキーアートとプログラムを1文字1文字対応させる

ここで問題となるのは以下の2点である。

  1. どうやってプログラムに空白・改行が入っても実行できるようにするか
  2. どうやってアスキーアートとプログラムの文字列長を揃えるか

問題1. プログラム内の空白・改行を無視するには?

一般にプログラムは空白や改行が混入すると正しく実行できない。そのため、空白が入っても問題なく実行できる形式に直す(つまり「空白耐性」をもたせる)必要がある。

今回は簡単に空白耐性をもたせるために、「JSFuck」という難読プログラミング言語を用いる。 JSFuckは+![]()の6文字のみを用いたJavaScriptプログラムであり、用いる文字の特性上、どこに空白・改行が含まれても問題なく実行できる。そのため、任意のJavaScriptプログラムをJSFuckに変換すれば、空白耐性をもったプログラムを簡単に生成することができる。

問題2. AAとプログラムの文字数を合わせるには?

文字列長を揃える方法は以下の2つが考えられる。

  1. AAを調整:AA自体のサイズを調整し、プログラムの文字列長に合わせる
  2. プログラムを調整:プログラムを何かしらの方法で水増しあるいは削減する

今回はこの両方を採用する。 つまり、まず前者で大雑把にサイズを揃え、残りの差を後者(具体的には//による水増し)で厳密に調整する方針をとった。

現状の問題

  1. プログラム長が長すぎ → jsfuckの文字セットを拡張or別の難読化手法を使用
  2. プログラム長の最適な調整方法を探す必要がある
  3. 2値化の閾値が適当 → ユーザが調整できるようにしたい