UNIQLO Akamai Tシャツコード - Goによる平行処理 -

## 概要

ユニクロがAkamaiというインターネット企業とコラボしてTシャツをデザインしました。

Tシャツのデザインは、Go言語のプログラムをモチーフにしています。
しかし、それはそのプログラムは、Go言語の一部が欠落しているプログラムでした。

そこで、AIの力を借りて、足りない部分を補って、動くコードとして復元しました。

すると、ミニナムなサーバープログラムが復元されました。

以下に、復元方法と、プログラムの簡単な説明をしていきたいと思います。

![T-Shirt_View](https://user-images.githubusercontent.com/36861752/233776272-a1f52816-824f-43df-96c3-61dfe6fa02b7.png)

## 復元手順

まず、Tシャツのコードを、パソコンに読み込む必要があります。

そこで、スマホでTシャツの写真を撮って、スマホの写真から文字を抽出する機能を使って、プログラムをテキスト化しました。

ちなみに、これも文字を認識する画像認識AIの一種です。

次に、自力でコードを組み立てようとしましたが、これは一部に欠損のあるプログラムであることが分かりました。

そこで、ChatGPTに、画像から抽出した文字列を、プログラムとして復元するように依頼しました。

すると、ほぼ完全な状態でChatGPTがコードを、動く状態で復元してくれました。

ここで初めて、私がどのように動くのかということを解析して、これは簡易的なサーバープログラムであることが分かりました。

また、Go言語のプログラムらしく、ゴルーチンを用いた平行処理も取り入れられていて、サーバーに処理をリクエストすると平行的に処理してくれることも判明しました。

![Code_View](https://user-images.githubusercontent.com/36861752/233776315-c24c45c7-0a59-48e5-9bc0-df95942e7a3c.jpg)

## コード

```Go
func main() {
	controlChannel := make(chan ControlMessage)
	workerCompleteChan := make(chan bool)
	pollChannel := make(chan chan bool)
	workerActive := false

	go func() {
		for {
			select {
			case respChan := <-pollChannel:
				respChan <- workerActive
			case msg := <-controlChannel:
				workerActive = true
				go doStuff(msg, workerCompleteChan)
			case status := <-workerCompleteChan:
				workerActive = status
			}
		}
	}()

	http.HandleFunc("/admin", func(w http.ResponseWriter, r *http.Request) {
		r.ParseForm()
		count, err := strconv.ParseInt(r.FormValue("count"), 10, 32)
		if err != nil {
			log.Printf("Error parsing count: %v", err)
			return
		}
		msg := ControlMessage{
			Target: r.FormValue("target"),
			Count:  int(count),
		}
		controlChannel <- msg
		fmt.Fprintf(w, "Control message issued for Target %s\n", html.EscapeString(r.FormValue("target")))
	})

	http.HandleFunc("/status", func(w http.ResponseWriter, r *http.Request) {
		reqChan := make(chan bool)
		pollChannel <- reqChan
		timeout := time.NewTimer(5 * time.Second)
		select {
		case result := <-reqChan:
			if result {
				fmt.Fprintln(w, "ACTIVE")
			} else {
				fmt.Fprintln(w, "INACTIVE")
			}
		case <-timeout.C:
			fmt.Fprintln(w, "TIMEOUT")
		}
	})

	log.Fatal(http.ListenAndServe(":8080", nil))
}
```

## プログラムの実行

次は実行方法です。図を用いて動かし方を紹介します。

まず、左側のコンソールでプログラムを起動し、簡易的なサーバーとして見立てます。
次に、右側のコンソールを起動し、サーバーにリクエストする準備をします。

試しに、起動しただけの状態でステータスリクエストを行うと、'INACTIVE'が応答されます。
そして、POSTで処理をリクエストした後に、ステータスリクエストを行うと、'ACTIVE'が応答されます。

処理リクエストは、ゴルーチンらしく複数受け付けられます。
複数処理をリクエストすると、サーバー側の処理が加速していくのが確認出来るはずです。

<iframe width="560" height="315" src="https://www.youtube.com/embed/X79GUhR_wN0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

## コマンド Memo
### サーバー側
~ $ go build -o Akamai Akamai.go  
~ $ ./Akamai  
Target: Akamai T-Shirt A , Count: 0  
Target: Akamai T-Shirt A , Count: 1  
Target: Akamai T-Shirt A , Count: 2  
Target: Akamai T-Shirt A , Count: 3  
Target: Akamai T-Shirt B , Count: 0  
Target: Akamai T-Shirt A , Count: 4  
Target: Akamai T-Shirt B , Count: 1  

### クライアント側
~ $ curl http://localhost:8080/status  
INACTIVE  
~ $ curl -X POST -d "target=Akamai T-Shirt A &count=30" http://localhost:8080/admin  
Control message issued for Target Akamai T-Shirt A   
~ $ curl -X POST -d "target=Akamai T-Shirt B &count=30" http://localhost:8080/admin  
Control message issued for Target Akamai T-Shirt B   
~ $ curl -X POST -d "target=Akamai T-Shirt C &count=30" http://localhost:8080/admin  
Control message issued for Target Akamai T-Shirt C   
~ $ curl http://localhost:8080/status  
ACTIVE  

## GitHub
https://github.com/GL-Kageyama/UNIQLO_Akamai_T-shirt_Code

## Twitter
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ユニクロがAkamaiとコラボしたTシャツを出したのですが、Akamaiはインターネット企業のため、Goのコードがデザインされています。<br><br>そしてこれは一部が欠損したGoのコードだということに気づきました。<br><br>そこでChatGPTを使いながら、欠損を補って動かすことに成功しました。<a href="https://twitter.com/hashtag/UNIQLO?src=hash&amp;ref_src=twsrc%5Etfw">#UNIQLO</a> <a href="https://twitter.com/hashtag/Akamai?src=hash&amp;ref_src=twsrc%5Etfw">#Akamai</a> <a href="https://t.co/UYHjodXWgS">pic.twitter.com/UYHjodXWgS</a></p>&mdash; GL-Kageyama (@GL_Kageyama) <a href="https://twitter.com/GL_Kageyama/status/1649734945823428610?ref_src=twsrc%5Etfw">April 22, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>