話題の日本酒「ソースコード」を読んで(飲んで)みた
こんにちは、AWS事業本部@福岡オフィスのべこみん(@beco_minn)です。
早速ですが皆さん、日本酒は好きですか?私はほぼ毎週近所の酒屋さんに買いに行くぐらい大好きです。
つい最近、こんな日本酒がSNSで話題になっていました。
「自分好み」を読み解いてシステムエンジニアに捧ぐ日本酒
クリアな飲み口に、豊かなお米の旨みが溢れ出る上質な味わい。料理と合わせても、様々な温度帯でも楽しめる1本に、思わず誰もが「自分好みの楽しみ方」を探してしまう。「読み解きたくなるロジック」が詰め込まれた、システムエンジニアたちに飲んでほしい純米吟醸酒です。
とのこと。
はい、買いました。ラベルのソースコードが気になったというのもあるんですが、純粋に味が気になったので買ってみました。
本記事では味の感想含め、ラベルの内容についても触れたいと思います。
飲んでみた
コードの解読前にまずは飲んでみます。お酒は飲んでなんぼですからね。
純米吟醸、クリアな飲み口、という情報通り、酸味と辛味を程よく感じるスッキリとした飲み口のお酒でした。香りが物凄く華やかというわけではなく、非常に飲みやすいお酒です。
私は普段甘めのお酒が好きなんですが、こういうお酒も良いですね。
コードを読んでみた
早速本題です。日本酒は美味しかったですが、肝心のラベルには何が書いてあるのでしょうか。
ここからは ネタバレ が含まれますので、実際に自分でコードを読んでみたい方はここでブラウザバックして下さい。
ラベルを剥がす
まず最初に私はラベルの写真を撮り、iPhoneのアプリ等で文字列を読み起こそうと思いました。
しかし、瓶が湾曲しているため全ての範囲を画像に収めることが出来ません。
そこでラベルを剥がすことにしました。私は普段気に入ったお酒は瓶ごとコレクションしているのですが、ラベルを剥がしてコレクションする方も多いですね。
ということで上記記事を参考に、濡らしたラベル部分にラップを巻きつけ10分ほど待った後、慎重にラベルを剥がしました。
↓↓↓
綺麗に剥がれましたね。それでは解読してみましょう。
解読する
剥がしたラベル画像を良い感じにiPhoneで加工し、読み取りやすくしてみます。
しかしこの状態でもiPhoneで私がよく使っている文字起こしアプリ等では上手く文字列を読み取ることが出来ませんでした。具体的には、!や[]が1や0として認識されてしまうのです。
ということでGoogleドライブに画像を突っ込み、簡単に文字起こしをしてみます。画像ファイルをドライブにアップロードし、そのファイルから アプリで開く→Googleドキュメント を選択するだけです。詳細は下記をご参照ください。
文字起こししたものが以下です。
※ネタバレ回避のため、コード全文は記載しません。
記述されているのはどうやらJavaScriptで、3つのconsole.log()で何かを吐き出しているようです。
かなり文字起こしの精度は高いですが、まだまだ不要な改行やミスがあるようです。ここからはコードの意味を考えつつ手作業で修正していきます。
主に出てきているものは
- String.fromCodePoint()
- !![]
- join("")
- ~~[]
でしょうか。
まずは最初のString.fromCodePoint()を調べます。
どうやらString.fromCodePoint()は、Unicodeのコードポイントを指定することで、それに対する文字列を出力することが出来るようですね。コードポイントは整数で指定するようですが、上記コードでは数字は見当たりません。
しかし、!![] というのは空配列︎(true)に論理否定演算子が2つ付いたもの、つまり true です。
また、その複数のtrue値が加算され、2つの値︎(6,7)がjoin("")されています。
つまり、最初のfromCodePoint()の中身を整数にすると、 fromCodePoint("67")となるのです。
このfromCodePoint("67")を実行すると、C
という文字が出力されます。
最後に ~~[] です。
~ はビット否定演算子と呼ばれるもので、オペランドの各ビットを反転します。
実際にconsole.log()等で出力すると分かりますが、 ~[]は -1
となり、~~[]は 0
となります。
上記をもとに、真心を込めた手作業でコードを修正します。
コードを実行すると、同じ内容の文字列が3回出力されました。
しかし、内容はスペルミス。これは何かが隠されているのでしょうか。
コードを読んでみて
ということで無事コードを実行出来ました。
実際にコードの文字起こし等をする前までは「機械的に難読化しただけだな」と思っていたんですが、より可読性(人間にとっても機械にとっても)を下げるために下記の点を工夫して作られたラベルではないかと私は思いました。
- !や[]を多用し、誤読を誘う
- 途中の文字を白文字にする
少なくとも、「簡単に画像からの文字起こしはさせないぞ」という強い気持ちを感じました。
また、本記事執筆中に商品ページを改めて眺めていると、こんなレビューが。
飲み方のペアリング情報を見ると。。
まだまだ何かが隠されていそうです。
追記 2023/02/13: 真の答え
実はソースコードにはまだ隠された答えがありました。答えに辿り着くと、良いものが貰えます。
答えを知りたい方は、是非ソースコードを読んで(飲んで)みて下さい。
おまけ追記: 使用されている言語について
ありがたいことに本記事投稿後、Xで「これJSF**kじゃん」というコメントを頂きました。(一部伏せ字にしてます)
これじゃん。
今回は [
、]
、(
、)
、!
、+
の6文字だけというわけじゃないですが、既に難読プログラミング言語として名称が付いていたんですね。勉強になりました。
最後に
ソースコードはエンジニアなら皆でワイワイ楽しく飲める美味しいお酒でした。こういうテーマのあるお酒は良いですね。ついラベル買いしちゃいます。
ちなみにおつまみはソース繋がりでたこ焼きでした。
それでは皆さんも健康に気を付けながら良い日本酒ライフを。
以上、べこみんでした。