ソースコードという名前のエンジニア向け日本酒が発売、ラベルにコードが書いてある…のを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)が、これは完全に勘違いしていた。 »
「パソコン・インターネット」カテゴリの記事
- Google ColabのJulia言語でFPUT問題(Fermi–Pasta–Ulam–Tsingou、非線形結合した振動子が最初に与えたモードに戻る再帰現象)をDifferentialEquations.jlの2階の常微分方程式ソルバーDynamicalODEProblemでシンプレクティック8次のKahanLi8で計算、振動子の動きも動画にしてみる。(2025.05.22)
- PythonでFDTD法で電磁界シミュレーションできるopenEMSを使う(2)例題にあるマイクロストリップパッチアンテナ(MSA)を計算する。Sパラメータや入力インピーダンスだけでなく近傍界から遠方界の変換で指向性も計算できる。電流分布も動画で見る。給電はLumpedポートが使える。(2025.05.19)
- PythonでFDTD法で電磁界シミュレーションできるopenEMSを使う(1)例題にあるマイクロストリップラインのノッチフィルタ(スタブ)を動かして電磁界分布を動画で見てみる。CSXCADでモデルは確認できるし、ParaViewで電磁界分布が見られる。Sパラメータも計算できる。(2025.05.14)
「日記・コラム・つぶやき」カテゴリの記事
- 高周波・RFニュース2025年5月23日 HUBER+SUHNERが76-81GHzのミリ波レーダ向け3D waveguide antenna発表、Silicon LabsがIoT向けシリーズ3 SoC発表、GSMAがM360ユーラシアでAIと5Gのイノベーションと協業について発表、ロームがAIサーバー向けMOSFET発表(2025.05.23)
- 高周波・RFニュース 2025年5月22日 三星電機(SEMCO)が165℃対応の車載インダクタ発表、KYOCERA AVXがリップル電流についての技術文書発行、QualcommとXiaomiの契約15年目、OmdiaがNokiaをPrivate 5Gの2025の王者と決定(2025.05.22)
- Google ColabのJulia言語でFPUT問題(Fermi–Pasta–Ulam–Tsingou、非線形結合した振動子が最初に与えたモードに戻る再帰現象)をDifferentialEquations.jlの2階の常微分方程式ソルバーDynamicalODEProblemでシンプレクティック8次のKahanLi8で計算、振動子の動きも動画にしてみる。(2025.05.22)
- 高周波・RFニュース 2025年5月21日 TDKが0201のRFインダクタ発表、InfineonがUWBのFiraコンソーシアムの理事会に、ubloxがロボット用GNSSモジュール発表、FibocomがMediaTekのT930を使った5Gモジュール発表、Motolora Edge 60 Pro分解動画(2025.05.21)
« 富の分布(最初に同じお金を持っていて、任意の2人でじゃんけんで勝った人が負けた人から1つもらうとだんだん指数分布になる)をPythonでGIFアニメにしてみた。 | トップページ | Pythonの高周波用ライブラリscikit-rfを含んだコードをPyinstallerでEXE化するときFileNotFoundError が出て動かない…が何とかなった。がファイルサイズがでかい…あとspecファイルにonefileしようとしてこれもハマる(option(s) not allowed)が、これは完全に勘違いしていた。 »
コメント