ソースコードという名前のエンジニア向け日本酒が発売、ラベルにコードが書いてある…のをBingのAIチャットに解読してもらった。基本、JavaScriptを難読化していて、+!![]は1、~~[]は0、joinで数字をまとめてfromCodePointでUnicode文字にして出力している。
エンジニア向け日本酒「ソースコード」発売 ラベルには“ソースコード”で隠しメッセージ
という記事を見た。なんだこのラベル…JavaScriptであるということだけはわかるが…
ということでBingのAIチャットに聞いてみた。
javasciriptのこのコードの解説をしてください。
console.log(String.fromCodePoint([!![]+!![]+!![]+!![]+!![]+!![],!![]+!![]+!![]+!![]+!![]+!![]+!![],].join("")))
こんにちは、これはCopilotです。JavaScriptのコードについてお尋ねですね。😊
このコードは、次のような処理を行っています。
!![]は、空の配列を論理否定演算子!で二回否定することで、trueに変換します。trueは数値に変換すると1になります。したがって、!![]+!![]+!![]+!![]+!![]+!![]は1+1+1+1+1+1と同じで、6になります。- 同様に、
!![]+!![]+!![]+!![]+!![]+!![]+!![]は1+1+1+1+1+1+1と同じで、7になります。 [!![]+!![]+!![]+!![]+!![]+!![],!![]+!![]+!![]+!![]+!![]+!![]+!![],]は、[6,7]という配列を作ります。.join("")は、配列の要素を文字列に変換して、引数で指定した文字列(この場合は空文字列)で連結します。したがって、[6,7].join("")は"67"という文字列になります。String.fromCodePointは、引数で指定したコードポイントに対応する文字列を返します。コードポイントとは、文字を表す数値のことです。例えば、String.fromCodePoint(65)は"A"という文字列になります。- このコードでは、
String.fromCodePoint("67")という引数を渡しています。この場合、"67"は数値に変換されて67になります。そして、コードポイント67に対応する文字は"C"です。 console.logは、引数で指定した値をコンソールに出力します。コンソールとは、ブラウザの開発者ツールにある画面のことです。- したがって、
console.log(String.fromCodePoint([!![]+!![]+!![]+!![]+!![]+!![],!![]+!![]+!![]+!![]+!![]+!![]+!![],].join("")))は、"C"という文字列をコンソールに出力します。
このコードは、JavaScriptの特徴を利用して、わざと分かりづらく書かれたものです。実際には、console.log("C")と書けば同じ結果になります。
ではこのコードを解説してください。
console.log(String.fromCodePoint([+!![],+!![],~~[],].join("")))
このコードも前のコードと同様に、JavaScriptの特徴を利用して、わざと分かりづらく書かれたものです。次のような処理を行っています。
+!![]は、空の配列を論理否定演算子!で二回否定することで、trueに変換し、さらに単項プラス演算子+で数値に変換します。したがって、+!![]は1になります。~~[]は、空の配列をビット単位の否定演算子~で二回否定することで、0に変換します。ビット単位の否定演算子は、数値を32ビットの符号付き整数に変換してから、ビットを反転します。空の配列は数値に変換すると0になり、そのビットを反転しても0になります。[+!![],+!![],~~[],]は、[1,1,0]という配列を作ります。.join("")は、配列の要素を文字列に変換して、引数で指定した文字列(この場合は空文字列)で連結します。したがって、[1,1,0].join("")は"110"という文字列になります。String.fromCodePointは、引数で指定したコードポイントに対応する文字列を返します。このコードでは、String.fromCodePoint("110")という引数を渡しています。この場合、"110"は数値に変換されて110になります。そして、コードポイント110に対応する文字は"n"です。console.logは、引数で指定した値をコンソールに出力します。- したがって、
console.log(String.fromCodePoint([+!![],+!![],~~[],].join("")))は、"n"という文字列をコンソールに出力します。
このコードは、console.log("n")と書けば同じ結果になります。
なるほど…というかこれメッセージが現れるだけなのか?とりあえず最初の5文字だけは見えた。瓶がじゃまで…
Congr
追記:
Pythonでこの難読JavaScriptのコードを再現するコードを書いて(何をしていることやら)
ラベルと見比べた結果、
Congratulations!
を繰り返してるな…
…いや違う!
ネタバレは避けるがまだ先があった!
ソースコードという名前の日本酒。
— tomo (@tonagai) February 9, 2024
ラベルに難読JavaScriptが書いてあって、Congratulations!
だと推定したが違ってた!実はわざと間違っていて、それを公式ページのあるところのコンソール画面を解読するとどこかをクリックするように指示され…
最終的にお得に。https://t.co/If4UyledLJ https://t.co/BHiDiWPI3x pic.twitter.com/wuJTY6aNuy
ヒントはこれ。
ソースコードという名前の日本酒の隠しメッセージのヒントを同じ難読JavaScriptで書いてみた。 pic.twitter.com/udonqQDNk1
— tomo (@tonagai) February 13, 2024
« 富の分布(最初に同じお金を持っていて、任意の2人でじゃんけんで勝った人が負けた人から1つもらうとだんだん指数分布になる)をPythonでGIFアニメにしてみた。 | トップページ | Pythonの高周波用ライブラリscikit-rfを含んだコードをPyinstallerでEXE化するときFileNotFoundError が出て動かない…が何とかなった。がファイルサイズがでかい…あとspecファイルにonefileしようとしてこれもハマる(option(s) not allowed)が、これは完全に勘違いしていた。 »
「パソコン・インターネット」カテゴリの記事
- Excelで1つのセルに複数の値を入れられるリストやセル内配列、ネストした配列という新機能が使えるようになっていた。例にあったデータ数が行ごとに違うときに使うのがよさそうなのでネイピア数の級数での計算をやってみた。(2026.10.07)
- JevのAPI互換のtev1(Ollama経由で利用)を使って、バンドパスフィルタの測定Sパラメータを読み込みスペックと比較して、単にG/NG判定だけでなく重大度や容認度をスコアとして出してくれるアプリrf_jev_judge.pyを作った。(2026.10.05)
- RF Weekly Digest 2026/9/28-10/4 (Codex(GPT-6 Astra)によるRF情報週刊まとめ)(2026.10.04)
「日記・コラム・つぶやき」カテゴリの記事
- 高周波・RFニュース 2026年10月9日 IEEE Microwave Magazineにリコンフィギュラブルフロントエンド記事、Keysightがレイヤー1オートメーションスイッチ発表、GSMAがインドで3つのレポート発行、MinewのSOSボタンにNordicのSoC採用など(2026.10.09)
- 高周波・RFニュース 2026年10月8日 SkyworksがQorvoとの合併を完了、iFixitがApple Watch Series12とUltra4を分解・60GHzアンテナあり、TDKが2GHz対応車載インダクタ発表、KeysightがADS等にAIエージェント搭載、Mini-Circuitsのバトラーマトリクス解説(2026.10.08)
- 1980~2026年のノーベル物理学賞を素粒子・宇宙と物性・基礎に分けてプロット。昔は2つの分野は交互に獲る、という感じだったが去年まで5年連続物性・基礎だった。今年はアイスキューブニュートリノ観測所での成果ということで久しぶりに素粒子・宇宙。(2026.10.06)
- 高周波・RFニュース 2026年10月6日 QorvoがBAWベースのCバンドフロントエンドとXバンドフロントエンド発表、太陽誘電が低直流抵抗のメタル系パワーインダクタ発表、アンリツとキャンドックスシステムズが60GHz評価システム発表、QualcommとHuaweiが特許ライセンス契約(2026.10.06)
« 富の分布(最初に同じお金を持っていて、任意の2人でじゃんけんで勝った人が負けた人から1つもらうとだんだん指数分布になる)をPythonでGIFアニメにしてみた。 | トップページ | Pythonの高周波用ライブラリscikit-rfを含んだコードをPyinstallerでEXE化するときFileNotFoundError が出て動かない…が何とかなった。がファイルサイズがでかい…あとspecファイルにonefileしようとしてこれもハマる(option(s) not allowed)が、これは完全に勘違いしていた。 »







コメント