木曜日, 7月 17, 2025
木曜日, 7月 17, 2025
- Advertisment -
ホームニューステックニュース【ネタ記事】Akamai x UNIQLOのコラボTシャツに書いているコードをJavaでOCRして解読してみる #Bash - Qiita

【ネタ記事】Akamai x UNIQLOのコラボTシャツに書いているコードをJavaでOCRして解読してみる #Bash – Qiita



【ネタ記事】Akamai x UNIQLOのコラボTシャツに書いているコードをJavaでOCRして解読してみる #Bash - Qiita

このページについて

UNIQLOのチャリティTシャツプロジェクト「PEACE FOR ALL」でAkamaiとのコラボTシャツが発売されていた。
そして、そのコラボTシャツにbashスクリプトがデザインされていてどのような意味を持つのか気になったので調べてみた。

Tシャツはこちら ↓

※ 実は今回のコラボは2回目であり、コラボ1回目のTシャツは、安野たかひろさんが愛用されているとある界隈で(?)話題になっていた。直近のYoutubeでも着用されていた
ちなみに、コラボ1回目のTシャツはこちら。 

AkamaiはCDNで有名であるが、CDNだけではなくサイバーセキュリティやクラウドコンピューティングを提供する国際的な企業

https://www.akamai.com/ja/why-akamai

Tシャツのプリントを見てみる

Tシャツを見てみると、長い文字列が書いてありそれをbase64でデコードしてからevalで評価しているようだった。 
つまり長い文字列は、シェルスクリプトがbash64でエンコードものっぽい。

全て目視確認は流石に時間がかかるのでJavaでOCRをしてみる

  • なぜJavaでOCRをするのか?
    → OCRというとPythonのイメージが強かったので、あ、え、て、Javaでやってみようと思った

  • 利用するライブラリは?
    → Googleが開発しているOSSのTesseractというOCRエンジンをラップしたTess4Jを利用する

まずはプロジェクトを作成する

$ mvn -B archetype:generate \
  -DgroupId=com.example.ocr \
  -DartifactId=ocr-demo \
  -DarchetypeArtifactId=maven-archetype-quickstart

tesseractをインストール

Tess4Jは、tesseractをラップしたものになるので、tesseractが必要になるのでインストールする

$ brew install tesseract
$ brew install tesseract-lang

OCRする画像(Tシャツの画像)をresourcesに格納

↓ ディレクトリの構造は以下のようになる

$ tree                                                                                 
.
├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── example
    │   │           └── ocr
    │   │               └── App.java
    │   └── resources
    │       └── imgs
    │           └── akamai.jpg
    └── test
        └── java
            └── com
                └── example
                    └── ocr
                        └── AppTest.java
pom.xml

pom.xml

 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    4.0.0
    com.example.ocr
    ocr-demo
    jar
    1.0-SNAPSHOT
    ocr-demo
    
        
            net.sourceforge.tess4j
            tess4j
            5.16.0
        
    

    
        
            
                org.codehaus.mojo
                exec-maven-plugin
                3.5.1
                
                    com.example.ocr.App
                    
                        
                            jna.library.path
                            /opt/homebrew/lib
                        
                    
                
            
        

        
            
                src/main/resources
                
                    **/*
                
            
        
    


App.java
package com.example.ocr;

import java.io.File;
import java.net.URISyntaxException;
import java.net.URL;

import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;

public class App {
    public static void main(String[] args) {
        try {
            URL resourceUrl = App.class.getResource("/imgs/akamai.jpg");
            if (resourceUrl == null) {
                System.err.println("エラー: 画像ファイルが見つかりません。");
                return;
            }

            File imageFile = new File(resourceUrl.toURI());
            ITesseract instance = new Tesseract();
            instance.setDatapath("/usr/local/share/tessdata");
            instance.setLanguage("eng");
            instance.setVariable("user_defined_dpi", "500");
            instance.setOcrEngineMode(1);
            String result = instance.doOCR(imageFile);
            System.out.println("--- OCR結果 ---");
            System.out.println(result);
            System.out.println("---------------");

        } catch (TesseractException | URISyntaxException e) {
            System.err.println("OCR処理中にエラーが発生しました: " + e.getMessage());
        }
    }
}

実行してみる

実行結果は、ところどころ読めていない。
改善点としては、、、

  • 読み込む画像の文字を水平にしたりTシャツの歪みをなくす
  • 画質を上げる
  • グレースケールにする
$ mvn compile exec:java     
--- OCR結果 ---
GABIRIBSSH] eval "$(base64 -d  ‘TyEvY¥mluL2Jhe2gKCiMgQ29uZ3Jhd
HVsYXRpb25zTSBZ7b3UgZm91bmagdGh11GVhc3R1ciB1Z2chIOKdp0+4jwojLOOB3ub
Cge0Bp+0Bq00Bhu0B100B1uDBhOOBVuOBme+8gemac00Ble0C jOOBN+OCteOD1+00
ge0CpOOCuuOCKUimi+0BpOOBkeOBVUOB1+0Bn++8geKdp0+4jwokTyBEZWZpbmUgd
Gh THR1eHQgd68qYWSpbWF@Z0p@ZXhOBSLimaVORUFDReKZpUZPUUKZPUFMTOKZPV
BFOUNF4pm1Rk9S4pm1QUxM4pm1UEVBQQXimaVGT1LimaVBTEzimaVQRUFDReKZpUZ
PUUKZpUFMTOKZpVBFQUNF4pm1Rk9S4pm1QUxM4pm1IgoKIyBHZXQgdGV ybWLUYWwg
761tZW5zaW9ucwpjb2xzPSQodHB1dCBjb2xzKQpsaW51¢z0kKHRwdXQgbG1uZXMpC
gojTENhbGN1bGF@ZSB@aGUgbGVUuZ3RoIGOmIHRoZSBOZXh@CNR1eHRFGVUZSROPS
R7I3R1eHROCgojTEhpZGUgdGh1IGN1enNvegp@cHV@IGNpdm1zCgoj FRY XAgQIRS
TCtDIHRVIHNob3cgdGh1IGN1cnNveiBiZWZvemUgZXhpdGluZwp@cmFwICJecHVeL
GNub3JtOyBleG1@1i BTSUdJT1QKGiMgU2V@IGZyZXF1ZW5jeSBzY2FsawWSnIGZhY3R
vegpmemVxPTAUMgoK IyBJbmZpbm1@ZSBsb29wIGZvciBjb250aW51b3VzIGFuaWiIhd
Glvbgpmb3IgkCggdDewOyA7IHOrPTEgKSk7IGRVCiAGICAJIEV4dHJhYSQgb2511GN
oYXJhY3R1ciBhdCBhIHRpbWUKICAGIGNoYXI9TiR7dGV4dDpe@LCUgdGV4dF9sZWsnd
Gg6MX@iCiAgICAKICAGICMgQ2EsY3VsYXRLIHROZSBhbmdsZSBpbiByYWRpYWSzC1A
gICBhbmdsZT@kKGVjaG8gligkdCkgkiAkZnJlcSIgfCBiYyAtbCkKCiAgICAJIENNb
GN1bGF@ZSB@aGUgc21uZSBVZiB@aGUgYW5nbGUKICAgIHNpbmvfdmFsdWU9JCh1Y2
hvICJzKCRhbmdsZSkiIHwgYmMgLWwpCgogICAglyBDYWxjdWxhdGUgeCBwb3NpdGl
vbiB1c21uZyB@aGUgc21uZSB2YWx1ZQogICAgeDOkKGVjaG8gligkY29scyAvIDIpIC
sgKCRjb2xzIC8gNCkgkiAkc21uZV92YWx1ZSIgfCBiY yAtbCkKICAgIHg9JChwem1u
dGYgIiUuMGYiICIkeCIpCgogICAglyBFbnNicmUgeCBpcyB3aXRoaW4gdGVybW1uY
WwgYm91bmRzCiAgICBpZiAoKCB4IDwgMCApKTsgdGhlbiB4PTA7IGZpCiAgICBpZ1i
AoKCB4ID49IGNVbHMgKSk7IHRoZW4geD@kKChjb2xzIC@gMSkpOyBmaQoKICAgICM
gQ2FsY3VsYXRLIGNVbG9yIGdyYWRpZW5@1GJ1dHd1ZW4gMTIgKGNSYW4pIGFuZCAyM
DagkG9yYW5nZSkKICAGIGNVbG9yX3NBY XJ@PTEyCi AgICBjb2xvel91bmQ9MjA4CLA
St eee
Peroni oe es NAICS Ne ee eed
Wee ca sk ec ee eke Mao et
SSae gICy a6 OBWSLICJcMDMZWzM40z2U7JHtjb2xvenit1ia
gpLiRjaGFyXDAZM1swbSIKCiAgICAjIExpbmUgZmV1ZCB@b
yBtb3Z1IGRvd253Y XJkCiAgICB1Y2hvICIiCgpkb251Cgo= ')" PEACENFORBALE

グレースケール化してからOCRしてみる

  • ↑を適当にこれでグレースケールにする

↑をOCRしてみた結果
G#i/binybashi eval "S$(base64 -d 

↑をOCRしてみた結果
GUNN «eval “S(base64 -d 

結果

目視を利用しながら、OCRをした結果は以下のような結果になった
長すぎて諦めた

調べていたら、↓の記事が出てきた
ユニクロとAkamaiのコラボTシャツに書かれているコードを解読してみる。base64でデコードするとbashのシェルスクリプトが出てきて実行すると♥PEACE♥FOR♥ALL♥FOR♥ALL♥PEACE♥FOR♥ALL♥という文字が色付きで正弦波で流れた。

どうやら、↑に記載がありましたが、↓のようなシェルがencodeされていたみたい

#!/bin/bash

# Congratulations! You found the easter egg! ❤️
# おめでとうございます!隠されたサプライズを見つけました!❤️

# Define the text to animate
text="♥PEACE♥FOR♥ALL♥PEACE♥ FOR♥ALL♥PEACE♥FOR♥ALL♥"

# Get terminal dimensions
cols=$(tput cols)
lines=$(tput lines)

# Calculate the length of the text
text_length=${#text}

# Hide the cursor
tput civis

# Trap CTRL+C to show the cursor before exiting
trap "tput cnorm; exit" SIGINT

# Set freqeency scaling factor
freq=0.2

# Infinite loop for contineous aniiation
for (( t=0; ; t+=1 )); do

    # Extract one character at a time
    char="${text:t % text_length:1}"
   
    # Calculate the angle in radians
    angle=$(echo "($t) * $freq" | bc -l)

    # Calculate the sine of the angle
    sine_value=$(echo "s($angle)" | bc -l)

    # Calculate x position using the sine value
    x=$(echo "($cols / 2) + ($cols / 4) * $sine_value" | bc -l)
    x=$(printf "%.0f" "$x")

    # Ensure x is within terminal bounds
    if (( x )); then x=0; fi
    if (( x >= cols )); then x=$((cols - 1)); fi
    # Calculate color gradient between 12 (cyan) and 208 (orange)
    color_start=12
    color_end=208
    color_range=$((color_end - color_start))
    color=$((color_start + (color_range * t / lines) % color_range))
    # Print the character with 256-color support
    echo -ne "\033[38;5;${color}m"$(tput cup $t $x)"$char\033[0m"

    # Line feed to move downward
    echo ""
   
done

実行してみると、、↓ 「♥PEACE♥FOR♥ALL♥PEACE♥ FOR♥ALL♥PEACE♥FOR♥ALL♥」の文字列が波で出てきた

参考





Source link

Views: 0

RELATED ARTICLES

返事を書く

あなたのコメントを入力してください。
ここにあなたの名前を入力してください

- Advertisment -