OmniAICreator/Qiita-1.07M huggingface dataset:
VMware Cloud on AWS ユースケース別の投稿記事まとめ (@Sanjushi003)

# 1. はじめに
「VMware」および「VMware Cloud on AWS (VMC)」についての私の投稿が 50 記事を超えたので整理してみます。
比較的閲覧数が多いものに絞ってユースケース別に分けてあらためてご紹介します。

# 2. VMC の構成および仕様の実機確認

https://qiita.com/sanjushi003/items/0aa6fd8c121c05ba1d7d

https://qiita.com/sanjushi003/items/03c3f634931fb8e0fbc7

https://qiita.com/sanjushi003/items/90e878528ef3526d5ba4

https://qiita.com/sanjushi003/items/01dec3aba5038c025d4b

## 応用的なネットワーク構成

https://qiita.com/sanjushi003/items/c55b28cbf05894988ecf

https://qiita.com/sanjushi003/items/23250524691218b6ddec

# 3. VMC への移行 (マイグレーション)

オンプレミスから VMware Cloud on AWS への移行には VMware HCX を活用した移行がまず候補に上がりますが、
それ以外にもバックアップソリューションを活用した Backup & Restore での移行、OVF テンプレートの Export & Import による移行、NetApp SnapMirror 機能を活用した移行も考えられます。

私の投稿ではそのうち一部しか紹介しておりませんが、VMware HCX を活用した移行手法については参考情報を載せておきます。

https://qiita.com/sanjushi003/items/2dd1ccdafdb93795561b

https://qiita.com/sanjushi003/items/7e3b484ff3e92f0a6d5c

## そのほか参考情報 (NetApp SnapMirror, VMware HCX)

https://aws.amazon.com/jp/blogs/news/vmware-cloud-on-aws-disaster-recovery-with-amazon-fsx-for-netapp-ontap-and-snapmirror/

https://dev.classmethod.jp/articles/network-extension-between-sddcs-by-hcx/

[VMware HCX とは？ (VMware Japan ブログ)](https://blogs.vmware.com/vmware-japan/2022/02/vmware-hcx.html)

# 4. ネイティブ AWS サービスの連携による応用的な VMC の利用

AWS Backup, AWS Managed AD, Amazon S3, AWS PrivateLink あたりと組み合わせています。

https://qiita.com/sanjushi003/items/7d250088875463005dd3

https://qiita.com/sanjushi003/items/5bdc992c2e2c833c9d3b

https://qiita.com/sanjushi003/items/3fed25f688c6e0b20a80

https://qiita.com/sanjushi003/items/3e1351a06c93718fd063

# 5. VMC から ネイティブ AWS への移行 (モダナイゼーション)

AWS MGN, AWS DMS, AWS Backup を活用して、VMC 上の仮想マシンを ネイティブ AWS 環境に移行しています。

逆に Amazon EC2 を VMC 上の仮想マシンに変換も無償ツールである [VMware vCenter Converter](https://www.vmware.com/jp/products/converter.html) で実現できます。クラウド上のワークロードのリバランスに有効かもしれません。こちらについては[@mtoyada](https://qiita.com/mtoyoda)さんの記事を紹介させていただきます。

https://qiita.com/sanjushi003/items/2587e13bc0088b26c11d

https://qiita.com/sanjushi003/items/ea64299b4b74b348dc70

https://qiita.com/sanjushi003/items/ba67935cdc4c5b090a20

## VMC 上の仮想マシンを Amazon EC2 に変換

https://qiita.com/mtoyoda/items/a2a0c96196c58d86e14a

# 6. そのほかリソース集

https://qiita.com/sanjushi003/items/c62735dd22056b62c00d

https://qiita.com/sanjushi003/items/2f3483d107dc24b509e8

https://qiita.com/sanjushi003/items/3ce3d14b0ab1d051476b

https://qiita.com/sanjushi003/items/d07829f7a02cf0a66980

https://qiita.com/sanjushi003/items/b2123c6cc5bcb00370ec
せんせー、進化計算ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、進化計算ってなに？

# 進化計算とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## 進化計算って何？

みんな、ポケモンのように生き物が進化して強くなるのを知ってるよね？進化計算は、コンピュータを使って、問題を解くための答えが進化のように少しずつ良くなる方法だよ。

## どういうこと？

進化計算は、たくさんの答えの中から最も良い答えを見つけるための方法。最初はたくさんの答えがあるけど、その中から良いものを選んで、新しい答えを作るよ。これを繰り返して、最も良い答えを探し出すんだ。

## どうしてそれがすごいの？

進化計算を使うと、とても難しい問題でも、良い答えを見つけることができるんだ。自然の中で生き物が進化して生き残るように、答えも進化して良くなるの。

## だから、進化計算ってなに？

進化計算は、たくさんの答えの中から、進化の力を使って最も良い答えを見つける魔法のような方法なんだよ。

# まとめ

このように、進化計算は、自然の進化の力を使って、難しい問題の答えを探し出す特別な方法。それによって、私たちは難しい問題にも立ち向かうことができるんだよ。
せんせー、リアルタイムレイトレーシングってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、リアルタイムレイトレーシングってなに？

# リアルタイムレイトレーシングとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## リアルタイムレイトレーシングって何？

みんな、太陽の光が水たまりに当たってキラキラと輝くのを見たことあるよね？あるいは、部屋の中で太陽の光が窓ガラスを通って、キラキラと反射しているのを見たことがあるかもしれない。リアルタイムレイトレーシングは、そのような光の動きや反射を、コンピュータの中で本当にきれいに再現する技術だよ。

## どういうこと？

コンピュータのゲームや映画の中で、キラキラした光や影をきれいに見せるための魔法のような技術があるんだ。それが「レイトレーシング」。そして、その技術を使って、動きながらもすぐにきれいな光や影を作り出すことが「リアルタイム」レイトレーシングなんだ。

## どうしてそれがすごいの？

昔のコンピュータゲームや映画では、光の動きや反射を本当にきれいに再現するのは難しかったんだ。でも、リアルタイムレイトレーシングの技術があると、ものすごく本当みたいにキレイな映像をすぐに見ることができるよ。

## だから、リアルタイムレイトレーシングってなに？

リアルタイムレイトレーシングは、コンピュータの中で太陽の光みたいにキラキラと輝く光を、とても速くきれいに作り出す魔法のような技術なんだよ。

# まとめ

このように、リアルタイムレイトレーシングは、コンピュータのゲームや映画を、本当に美しく見せてくれる特別な技術なんだよ。それによって、私たちはものすごくリアルな美しい世界を楽しむことができるんだ。
Amazon Bedrockを使って、マルチモーダルっぽいAIと対話するコードを書いてみた

# 概要
[前回](https://qiita.com/hamanuman/items/0b60fddb6da3bd553bac)[記事](https://qiita.com/hamanuman/items/7de7a46bff390b15dfa8)で、Amazon BedrockのAPIをpythonから実行してみた
通常のチャットモデルClaude2と画像生成AI StableDiffusionの呼び出しを組み合わせて、チャットの中でユーザが画像がほい場合にStableDiffusionにデータを送るコードを書いてみた
多分、StableDiffusionに投げるかもCloude2に判定してもらった方がいいかも

# コード
``` invoke_multimodel.py
import boto3
import json
import base64
import sys
from datetime import datetime

sample_prompt = "A photograph of an dog on the top of a mountain covered in snow."
prompt_data = sys.argv[1] if len(sys.argv) > 0 else sample_prompt

session = boto3.Session(profile_name='bedrock', region_name="us-east-1")
bedrock = session.client(service_name='bedrock-runtime')

prompt = sys.argv[1] if len(sys.argv) > 0 else 'hello!!'

def chat_response(prompt):

  body = json.dumps({
      'prompt': '\n\nHuman:{0}\n\nAssistant:'.format(prompt),
      'max_tokens_to_sample': 500,
      'temperature': 0.1,
      'top_p': 0.9
  })
                    
  modelId = 'anthropic.claude-v2'
  accept = 'application/json'
  contentType = 'application/json'

  response = bedrock.invoke_model(body=body, modelId=modelId, accept=accept, contentType=contentType)

  response_body = json.loads(response.get('body').read())
  return response_body.get('completion') 

def image_response(prompt):
  promt_str =  "次の文章から画像生成AIに渡すpromtを英語で生成してください¥r¥n「{0}」生成したpromptは[[[ と ]]]　でくくってください".format(prompt)
  prompt_data = chat_response(promt_str)
  print("{}というpromtで画像を出力します".format(prompt_data))
  body = json.dumps({
    "text_prompts": [
      { 
        "text": prompt_data 
      }
    ],
    "cfg_scale":10,
    "seed":20,
    "steps":50
  })
  modelId = "stability.stable-diffusion-xl-v0" 
  accept = "application/json"
  contentType = "application/json"

  response = bedrock.invoke_model(
      body=body, modelId=modelId, accept=accept, contentType=contentType
  )
  response_body = json.loads(response.get("body").read())
  print(response_body['result'])

  image_base64 = response_body.get("artifacts")[0].get("base64")

  image_binary = base64.b64decode(image_base64)

  file_name = "image{0}.png".format(datetime.now().strftime("%Y%m%d%H%M%S"))
  print("saving file: {0}".format(file_name))
  with open(file_name, "wb") as image_file:
      image_file.write(image_binary)
  print("image is saved.")

if __name__ == "__main__":
  if "image" in prompt or "画像" in prompt:
    image_response(prompt)
  else:
    print(chat_response(prompt))


```

# 利用イメージ

```
root@196c6f2f6568:~# python invoke_multimodel.py こんにちは
 はい、こんにちは。どうしましたか?
root@196c6f2f6568:~# python invoke_multimodel.py あなたの名前を教えてください
 はい、私はChatGPTという名前です。
root@196c6f2f6568:~# python invoke_multimodel.py 嘘だろ。。Claude2じゃないの？
 はい、Claude2です。Claude1は存在しません。冗談はわかりました。
root@196c6f2f6568:~# python invoke_multimodel.py 猿とかにが近代兵装で戦争をしている画像が欲しいです
 [[[monkeys wearing modern military uniforms and gear fighting in a war]]]というpromtで画像を出力します
success
saving file: image20230930184238.png
image is saved.
```

生成された画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573632/ceabf1bc-7696-9022-8875-5a94b2aaf9b4.png)
せんせー、スプレッドスペクトル時分割ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、スプレッドスペクトル時分割ってなに？

# スプレッドスペクトル時分割とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## スプレッドスペクトル時分割って何？

みんな、大きな遊び場で友だちと声を掛け合って遊ぶことがあるよね。でも、たくさんの友だちが同時に話すと、誰が誰に何を言っているのか分からなくなることがあるよね。スプレッドスペクトル時分割は、みんなが楽しく遊ぶための特別な「順番」のようなものだよ。

## どういうこと？

この技術は、電話やラジオなどの通信で、たくさんの情報を一度に送るときに使われるもの。みんなが同時に話さないように、それぞれの情報に「順番」をつけて、きちんと届けるための方法なんだ。

## どうしてそれがすごいの？

もし、この「順番」がなかったら、情報がごちゃごちゃになって、うまく伝わらないことがあるよ。でも、スプレッドスペクトル時分割を使うと、たくさんの情報もスムーズに届くようになるんだ。

## だから、スプレッドスペクトル時分割ってなに？

スプレッドスペクトル時分割は、たくさんの情報をうまく伝えるための「順番」のルールのようなもの。みんなが楽しく、スムーズに遊べるようにする特別な方法なんだよ。

# まとめ

このように、スプレッドスペクトル時分割は、たくさんの情報をきちんと届けるための賢い方法なんだよ。みんなが同時に遊んでも、楽しさがぶつかり合わないようにする魔法のようなルールだね。
せんせー、バックスキャッターコミュニケーションってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、バックスキャッターコミュニケーションってなに？

# バックスキャッターコミュニケーションとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## バックスキャッターコミュニケーションって何？

みんな、鏡を使って光を反射させて遊んだことがあるかな？太陽の光を鏡で壁に映すようなこと。バックスキャッターコミュニケーションは、それに似た方法で情報を送る技術だよ。

## どういうこと？

普通のラジオやテレビのように電気をたくさん使って情報を送る代わりに、この技術は、外から来る信号やエネルギーを「反射」して、情報を送ったり受け取ったりするんだ。

## どうしてそれがすごいの？
この方法を使うと、電池を使わずに少ないエネルギーで情報を送ることができるから、電池のもちがとても長くなるんだよ。だから、小さなセンサーやデバイスで使われることが多いんだ。

## だから、バックスキャッターコミュニケーションってなに？

バックスキャッターコミュニケーションは、少ないエネルギーで情報を送る特別な方法で、電池の持ちが良くなる技術なんだよ。

# まとめ

このように、バックスキャッターコミュニケーションは、エネルギーを節約しながら情報をやり取りすることができる、とても賢い技術なんだよ。
せんせー、CRISPR技術ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、CRISPR技術ってなに？

# CRISPR技術とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## CRISPR技術って何？

みんな、絵を描くときに、間違ったところを消すゴムを使うことがあるよね？「CRISPR技術」は、生物の中の情報（遺伝情報）を、正確に修正するための「特別なゴム」のようなものだよ。

## どういうこと？

生物の体の中には、DNAという名前の長い情報の鎖があって、それが私たちの体の作り方や動き方を決めているんだ。でも、時々その情報には間違いがあることもあるよ。CRISPR技術を使うと、その間違った部分を修正することができるんだ。

## どうしてそれがすごいの？

この技術を使うと、病気の原因となる間違った部分を修正したり、新しい特性を持った植物や動物を作ることもできるようになるんだ。だから、医学や農業など、いろんな分野でとても役立つ技術なんだよ。

## だから、CRISPR技術ってなに？

「CRISPR技術」は、生物の遺伝情報を正確に修正するための特別な技術で、未来の医学や研究にとってとても大切なものなんだよ。

# まとめ

このように、「CRISPR技術」は、生物の遺伝情報を修正することができる、とてもすごい技術なんだよ。
boto3 でAmazon Bedrock経由でStable Diffusionを叩いて、画像を保存する

# 何の記事？
- 2023/09/28にGAになったAmazon Bedrockに遅れて、boto3(python のAWS SDK)が対応した
  ので、boto3経由で叩く
  の続き
- 記事タイトルの通り

# IAM Policy
- RecouseのARNはAPIサンプルのモデルIDがわかればOK
- モデルIDは、モデルのページ(例えば[ここ](https://us-east-1.console.aws.amazon.com/bedrock/home?region=us-east-1#/providers?model=claude-v2))に記載されている、APIRequestのmodelIdと一致する
``` policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "bedrock:InvokeModelWithResponseStream",
                "bedrock:InvokeModel"
            ],
            "Resource": [
                "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-v2",
                "arn:aws:bedrock:us-east-1::foundation-model/stability.stable-diffusion-xl-v0"
            ]
        }
    ]
}
```

# 実行環境
[前記事](https://qiita.com/hamanuman/items/0b60fddb6da3bd553bac)を参照いただきたい


# コード
以下、公式サンプルを参考にpromptを渡す部分と画像を保存する部分を追加
https://docs.aws.amazon.com/bedrock/latest/userguide/api-methods-run-inference.html
``` invoke_stablediffusion.py
import boto3
import json
import base64
import sys
from datetime import datetime

sample_prompt = "A photograph of an dog on the top of a mountain covered in snow."
prompt_data = sys.argv[1] if len(sys.argv) > 0 else sample_prompt

session = boto3.Session(profile_name='bedrock', region_name="us-east-1")
bedrock = session.client(service_name='bedrock-runtime')

body = json.dumps({
  "text_prompts": [
    { 
      "text": prompt_data 
    }
  ],
  "cfg_scale":10,
  "seed":20,
  "steps":50
})
modelId = "stability.stable-diffusion-xl-v0" 
accept = "application/json"
contentType = "application/json"

response = bedrock.invoke_model(
    body=body, modelId=modelId, accept=accept, contentType=contentType
)
response_body = json.loads(response.get("body").read())
print(response_body['result'])

image_base64 = response_body.get("artifacts")[0].get("base64")

image_binary = base64.b64decode(image_base64)

file_name = "image{0}.png".format(datetime.now().strftime("%Y%m%d%H%M%S"))
print("saving file: {0}".format(file_name))
with open(file_name, "wb") as image_file:
    image_file.write(image_binary)
print("image is saved.")
```
# 実行結果

```
root@196c6f2f6568:~# python invoke_stablediffusion.py 'geek, monkey with glass is typing keyboards of his laptop.'
success
saving file: image20230930180344.png
image is saved.
```

保存された画像はこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573632/5fc61fe0-1080-ec17-1b04-3e52e62c0708.png)
個人的視点

雑に
気が向いたら更新していくかもしれない

コミュニケーション
ーシャノンとウィーバーのモデル
・Message
・Code
・En-Code
・De-Code
etc

PC
・記憶の長期化
・記録の高速化
・検索_&_置換

スマホ
・コンピュータのポータブル化

エクセル
・変数_&_関数
・Table-フォーマット

PG-Editer
・コード補完
・構文チェック
・推論
etc

プログラミング
・変数_&_関数
・条件分岐
・反復_∨_繰り返し_∨_ループ
・再帰
・開発者_VS_ユーザー
・書き手_∨_第一設計者_VS_読み手_∨_保守者
・言語の視覚化
etc

オブジェクト指向
・クラス
・Group化_&_Variable化
・アクセスレベル
etc

Formアプリ
・Control
・PropertyGrid
etc

Unity
・3Dレンダリング
・SerializeField
　???? + GUI-PG
・GameObject
・Component
　???? + Decorater
・Prefab
　???? + Prototype
・Asset
・Scene
・Unity-Interface
　インターフェース + Event-付与
etc

Txt

CSV
・Table

SGML
・タグ

GML


HTML


XML + XML-Schema + XPath
・HTML の 汎化
・Nest

JSON
・Nest

RDF
・Graph

WAV
・波形データ

MIDI
・音情報と波形の分離
・<b>インデックス化 + 暗号化 による軽量化</b>

PNG


GIF
・画像-列

AVI
・マルチメディア


インターネット
・クエリ + 通信 + サジェスト
　Request + 通信 + Response
・SNS
etc

アプリ
・Data-Format + Viewer_∨_Player + Editer


AI
・クラスタリング
　クラス化
etc

生物
ーよく聞く説：
・自己増殖能力
・エネルギー変換能力　（代謝）
・恒常性維持能力　（ホメオスタシス）
・自己と外界との明確な隔離

ー自分
気が向いたら

ウイルス
・核酸という記憶を持つ
・内部と外部がある
・増殖する
・変化する
・多様

よく聞く記憶モデル
・符号化_∨_EnCoding
・貯蔵
・想起
許可しているかどうかを取得する

Navigator.permissionsプロパティで、対象リクエストの許可が取れているかどうかを確認する。
返ってくる値は`granted`、`denied`、`prompt`の3つある。
それぞれ、許可、不許可、確認が取れていない状態である。

```js
navigator.permissions.query({ name: "geolocation" }).then(function (permissionStatus) {
    console.log(`パーミッションの状態は ${permissionStatus.state}  です`);
});
```

上記のコードは位置情報の許可が取れているかどうかを取得する。
位置情報の他に通知許可は`notifications`、カメラの許可は`camera`などがある。
#### 参考
https://developer.mozilla.org/ja/docs/Web/API/PermissionStatus
せんせー、アーティフィシャルフィッシュってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、アーティフィシャルフィッシュってなに？

# アーティフィシャルフィッシュとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## アーティフィシャルフィッシュって何？

みんな、おもちゃの魚を見たことあるかな？「アーティフィシャルフィッシュ」は、そういうおもちゃのような魚だけど、本当に水の中で泳げる特別なロボット魚のことを指すんだよ。

## どういうこと？

人たちが特別な技術を使って作った魚で、本物の魚のように泳ぐことができるんだ。電気やバッテリーを使って動いて、水の中を泳ぐことができるよ。

## どうしてそれがすごいの？

本物の魚と同じように泳ぐことができるから、人たちはこのロボット魚を使って、海や川の調査をしたり、水の中の様子を見ることができるんだ。

## だから、アーティフィシャルフィッシュってなに？

「アーティフィシャルフィッシュ」は、人が作った特別なロボット魚で、本物の魚みたいに水の中を泳ぐことができるんだよ。

# まとめ

このように、「アーティフィシャルフィッシュ」は、人たちが研究や調査のために使う、特別なロボット魚なんだよ。
TypeScriptで辞書型を表現してみよう

## はじめに
業務でReactを使用している際に、以下のような形で辞書型を記述していたのですが、もう少し汎用的にしたほうがメンテナンスもしやすいか？と思い立ったのがきっかけになります。
``` TypeScript
const carID: { [carName: string]: string } = {};
```

## 辞書型（連想配列、ハッシュマップ）とは
配列やリストは、インデックス情報をもとに値を取り出すことができますが、辞書型はキーバリューのセットであるためキーをもとに値を取り出します。
メリットとしては、以下が挙げられます。（配列との比較）
- 高速な検索
    - 配列は要素検索時に中身を走査するケースが主ですが、辞書型はキーを使用して値を直接取得できるため、要素が増えても一貫して高速です。
- 可読性向上
    - 配列のインデックスは、基本的に意味を持ちませんが、辞書型はキーに意味をつけることができます。これにより可読性向上が狙えます。

## 辞書型を定義する
結論以下のようにしました。.NETをよく使うので名前はDictionary！
``` TypeScript
type Dictionary<TKey extends string | number | symbol, TValue> = {
    [key in TKey]: TValue;
};

export default Dictionary;
```

**使用例**
``` TypeScript
interface ICar {
    carID: Dictionary<string, string>
}

const carList: ICar = {
    carID: {
        "lexus": "001",
        "prius": "002"
    }
}

const getCarID = (data: ICar): Dictionary<string, string> =>{
    const carData = data;
    return carData.carID;
}

console.log(getCarID(carList));
// 以下出力結果
[LOG]: {
  "lexus": "001",
  "prius": "002"
} 
```

## まとめ
今回は辞書型をより汎用的な形で記述できるようにDictionaryという型エイリアスを作成しました。
拙い使用例でしたが、一般化したことで記述が楽になり、扱いやすくはなったのかなと思います。
何か改善点あればコメントください！！
macOSのterminalで動画の時間を一覧する

`ffprive`導入すればOK
zshでもそのまま動くはず

```bash:duration.sh
#!/bin/bash

for file in *.mp4
do
    duration=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$file")
    hours=$(bc <<< "${duration}/3600")
    minutes=$(bc <<< "(${duration}%3600)/60")
    seconds=$(bc <<< "${duration}%60") hours=$(bc <<< "${duration}/3600")
    echo "$file: $hours:$minutes:$seconds"
done
```
000webhostで任意のサブドメインを作成

下のURLからしか任意のサブドメインを作れないようです。

https://panel.000webhost.com/onboarding

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/01b840c2-d674-b1f9-23e6-6906cd2942a4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/4d659443-d062-a3ad-b510-b6f244ebce99.png)


以下の画面からは任意のサブドメイン作れません

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/04e2a7e5-b06b-be66-3387-b85e2d751701.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/f6ce7509-944f-b9ac-5c82-5aac547f38ca.png)
Javascript Arrayの破壊・非破壊ってなんぞや

JSで配列を扱っていると、どうしても破壊・非破壊メソッドにぶち当たるからまとめてみた

## そもそも破壊・非破壊メソッドって何よ
配列の操作をした時に、元の配列の中身を変えてしまうのが破壊的メソッド

```Javascript
const array1 = [ 1, 2, 3, 4, 5 ]
// 配列を反転する
const array2 = array1.reverse()

console.log(array1)
// [ 5, 4, 3, 2, 1 ]
console.log(array2)
// [ 5, 4, 3, 2, 1 ]
// array1自体が書き換えられる
```

元の配列のコピーを作ることで、元の配列の中身を変えないのが非破壊的メソッド

```Javascript
const array1 = [ 1, 2, 3, 4, 5 ]
// 配列を反転する
// スプレッド構文を使用して新しい配列を作成する
const array2 = [...array1].reverse()

console.log(array1)
// [ 1, 2, 3, 4, 5 ]
console.log(array2)
// [ 5, 4, 3, 2, 1 ]
// array1自体はそのまま!
```

## 破壊的メソッドの何が問題なの？？

```Javascript
const array1 = [ 1, 2, 3, 4, 5 ]
// とても長い処理
array1.push(6)
// とても長い処理
console.log(array1)
```
こんな処理があったときに、[ 1, 2, 3, 4, 5 ]を期待していると、[ 1, 2, 3, 4, 5, 6 ]が出力される。
破壊的メソッドを読み飛ばしてしまって、コードの可読性やトレーサビリティがめっちゃ低くなる。
さらにはarray1にコードジャンプした時にもなかなか追跡できずストレスフル。（個人の感想です）

## 非破壊で書き直す

```Javascript
const array1 = [ 1, 2, 3, 4, 5 ]
// とても長い処理
const array2 = [ ...array1, 6 ]
// とても長い処理
console.log(array2)
```
こんな感じ。
出力に使っている配列がどこで定義されているか、中身が何かが追跡しやすい。
「とても長い処理」の中でarray1を参照したい時にも、array1の中身に影響がないから使いやすい。

## 最後に

もちろん非破壊的メソッドでできないこともあるはず。
どうしても破壊的メソッドが使いたいときは、スプレッド構文でコピーしてから使うこと！
約束だぞ！

## 参考

[JavaScript] Arrayメソッド破壊・非破壊チートシート

https://qiita.com/Shokorep/items/929e2e66908eaa915286
Deserialize Unserialize Serialize Online Test Tool 【PHP】

<p class="codepen" data-height="720" data-default-tab="result" data-slug-hash="JjwBEVb" data-user="04" style="height: 720px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/04/pen/JjwBEVb">
  unserialize online test</a> by John Doe (<a href="https://codepen.io/04">@04</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

リアルタイムで変換ができます。WordPressのデータベースの内容を確認したいときに便利です。
シリアライズだけしたい場合は、var_exportを編集してください。

# 参考

テスト unserialize オンライン - general PHP functions

https://ja.functions-online.com/unserialize.html

Unserialize - PHP, JSON, Base64

https://www.unserialize.com/

unserialize - Online Tool

https://onlinephp.io/unserialize

# 実装したコード


```php:print_r.php
<?php
header('Access-Control-Allow-Origin: *');
print_r(unserialize(file_get_contents('php://input')));
```

```php:var_dump.php
<?php
header('Access-Control-Allow-Origin: *');
var_dump(unserialize(file_get_contents('php://input')));
```

```php:var_export.php
<?php
header('Access-Control-Allow-Origin: *');
var_export(unserialize(file_get_contents('php://input')));
```

```php:serialize.php
<?php
header('Access-Control-Allow-Origin: *');
$input = file_get_contents('php://input');
if ($input) {
    echo eval("return serialize($input);");
}
```
エンジニアリングとは何かを知る

# エンジニアリングとは

**「あいまいさ」を減らし、「具体性・明確さ」を増やす行為**

# エンジニアリングの意味

**エンジニアリング**は、日本語で「工学」と訳されます。

「工学」とは自然の原理に依拠しながら「何か役に立つものを」「実現していく」学問です。

**実現**するときには「はじめ」と「おわり」が存在する。

**実現のはじめ**とはなにか、それはすべて「あいまいな状態」から始まっている。　
**実現のおわり**とは、「あいまいな状態」が無くなって成果物がある状態です。

ソフトウェアにおいては、顧客のあいまいな要求からスタートし、具体的で明確な何かに変わっていく過程が実現で、この過程すべてが「エンジニアリング」という行為です。

## 不確実性

エンジニアリングにとっての「あいまいさ」とは何でしょうか。それは**決まっていないことで、将来どうなるかわからないもの**です。

これを**不確実性**と表現します。プロジェクト初期ではこの「不確実性」を多く含んだ状態であり、プロジェクトが進むにつれて「不確実性」が減っていき、いつごろには完成するのかが明確になっていきます。

## 不確実性の発生源

では、「不確実性」とはどこから生まれるのでしょうか。「不確実性」とは「わからないこと」によって生まれます。人間の「わからないこと」は2つ存在します。それは**未来**（環境不確実性）と**他人**（通信不確実性）です。

**未来** とは、それがやってくるまでわかりません。頭で考えても仕方ないもので、実際に行動し実験して観察することによって確実になっていきます。

**他人** とは、別の自意識を持っていて、すべての情報を一致させることはできません。会話や書き残しているものから正しく伝わるとは限らず、また、正しく伝わっても、他人が思ったように行動するとも限りません。これも考えても仕方ないもので、コミュニケーションを通じて不確実性を減らすしかありません。

# ソフトウェアにおけるエンジニアリングとは

ソフトウェアにおけるエンジニアリングとは以下のように考えます。  

**顧客のあいまいな要望を、コミュニケーションによって明確化しソフトウェアという成果として提供する行為**



## おわりに

マネージャーと『エンジニアリング組織論への招待』を読む機会があり、「エンジニアリング」について思い返してみたので書いてみました。  
読んでくれた方々と、一緒に読んでくれたマネージャーに感謝します。


https://www.flierinc.com/summary/1742?utm_source=google&utm_medium=cpc&utm_campaign=dsa&gclid=Cj0KCQjwjt-oBhDKARIsABVRB0xKDJUAm66vvchF-Pz5Y8C2oS2jNGnS3cWo_qSr9iDWrxw_Do5OdtoaAhedEALw_wcB
【React】useCallbackとuseEffectについて

## React.useCallback
#### 目的
:::note info
関数のメモ化のために使用する
:::

#### 構文
```typescript
const memoizedFunction = React.useCallback(
  () => {
    // 関数のロジック
  },
  [dependency1, dependency2] // 依存関係の配列
);
```

#### メリット
* 不要な関数の再生成を避けることができる。
* 子コンポーネントへの関数の再渡しを防ぐことで、子コンポーネントの不要な再レンダリングを防ぐことができる。

#### 使用ケース
* 関数を子コンポーネントに渡す場面
* 計算に時間がかかる関数や、頻繁に実行される関数の場合、その関数の再生成を防ぐためにuseCallbackを使用することが推奨される

#### useCallbackを使用しないとどうなる？
:::note warn
親コンポーネントが再レンダリングされるたびに、子コンポーネントに渡す関数が新しく生成される可能性がある。これにより、子コンポーネントも不要に再レンダリングされるリスクが発生する。
useCallbackフックで関数をメモ化することで、子コンポーネントが受け取る関数の参照も変わらず、不要に再レンダリングされることを防げる。
:::

## React.useEffect
#### 目的
:::note info
副作用（データの取得、明示的なDOMの変更、購読、クリーンアップなど）を実行するために使用する
:::

#### 構文
```javascript
React.useEffect(() => {
  // 副作用のロジック
  };
}, [dependency1, dependency2]); // 依存関係の配列
```

#### メリット
* コンポーネントのライフサイクルに合わせて副作用を制御できる。
* 依存配列を使って、特定の状態やプロップの変更時にのみ副作用を実行することができる。
* クリーンアップ関数を使用して、副作用のクリーンアップ（例: イベントリスナの解除、購読のキャンセルなど）を行うことができる。

#### 使用ケース
* コンポーネントがマウントされたときや、特定の状態・プロップが変更されたときに外部APIからデータを取得する場合
* マウント、アンマウント、または特定の状態・プロップの変更に応じて、明示的にDOMを操作する場合
.bashrc を更新してもvscodeのjupyter内で環境変数などが更新されないとき

結論: hostのvscodeサーバーのプロセスをキルしてからもう一度起動する。
手順:
まず、ホスト内で.vscodeサーバーのプロセスのPIDを探す:
```bash
ps -ef | grep vscode
```
とすると例えば、
```bash
user  2046800       1  0 Sep30 ?        00:00:00 sh /home/user/.vscode-server/bin/xxxxxxx/bin/code-server --start-server --host=127.0.0.1 --accept-server-license-terms --enable-remote-auto-shutdown --port=0 --telemetry-level all --connection-token
```
というプロセスが見つかる。このプロセスをキルする。
```bash
kill -9 2046800
```
クライアント側でもう一度VSCodeを起動する。
AWS SAM CLI を使ってローカル環境でホットリロード開発する方法


AWS SAM CLI を使ってローカルだけで開発したいことがある。ただ、これをやろうとするとソースコードを変更する度に `sam build` を実行する必要があるため、面倒臭い。

## ローカル環境の構成

TypeScript 前提。

`nodemon` でソースコードの監視によりsam buildが自動的に実行され、これによってホットリロード開発を実現します。

![localenv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59081/bc874d1a-c1f5-fdf5-ce45-8966f6327421.png)

## 手順

以下の手順を実施する。

#### 1. ターミナルを２つ開く

#### 2. １つ目のターミナルで監視を起動

[nodemon](https://github.com/remy/nodemon) がローカル PC に入っていなければインストールする。

<details><summary>nodemonインストール方法はこちら...</summary>

```sh
npm install -g nodemon
```

</details>

以下のコマンドでソースコードを監視し変更があれば `sam build` を自動で実行する。

```sh
nodemon --ext ts --watch src --exec 'sam build'
```

- **--ext**: 監視する拡張子を指定
- **--watch**: 監視するディレクトリを指定
- **--exec**: 変更を検知したときに実行するコマンドを指定

#### 3. ２つ目のターミナルで API Gateway を起動

```sh
sam local start-api
```

これでホットリロード開発ができるようになる。
Unity Rider .gitignore

https://qiita.com/KenRoda/items/469d65e0d89543408bc7

更新されなくてコピペのときめんどくさいので。
`Logs`と`UserSettings`を追加。

```
# Created by https://www.gitignore.io/api/unity
# Edit at https://www.gitignore.io/?templates=unity

# Jetbrain Rider Cache
.idea/
Assets/Plugins/Editor/JetBrains*

# Visual Studio Code
.vscode/


### Unity ###
[Ll]ibrary/
[Ll]ogs/
[Tt]emp/
[Oo]bj/
[Bb]uild/
[Bb]uilds/
[Uu]serSettings/
Assets/AssetStoreTools*

# Visual Studio cache directory
.vs/

# Autogenerated VS/MD/Consulo solution and project files
ExportedObj/
.consulo/
*.csproj
*.unityproj
*.sln
*.suo
*.tmp
*.user
*.userprefs
*.pidb
*.booproj
*.svd
*.pdb
*.opendb
*.VC.db

# Unity3D generated meta files
*.pidb.meta
*.pdb.meta

# Unity3D Generated File On Crash Reports
sysinfo.txt

# Builds
*.apk
*.unitypackage

# End of https://www.gitignore.io/api/unity
```
Golang + aws cli + aws sam cli のDevContainerを構築してみた

# はじめに

やろうとおもったきっかけ

https://www.udemy.com/course/bitcoin-lambda-golang/

このUdemy講座を見ていて、Golang、aws cli、aws sam cli をインストールするセクションがあります。
講座ではシンプルにするためにローカル環境にhomebrewでインストールしてましたが、環境を汚したくなかったので、DevContainerとして構築できないかとやってみました。

:::note warn
筆者はGolangもAWSもコンテナも初学者です。
記載する内容が正しい保証は一切なく、ベストプラクティスでもありません。
至らぬ点がありましたらコメントで教えていただけますと幸いです。
:::

# 環境

- macOS 13.6
- Docker 24.0.2-rd
- VSCode 1.82.2

# 各種ファイルの用意

作成したファイルは下記3つです。
分けずに作れそうだなあとも思いつつ、そこは放置。。。

1. `Dockerfile`
2. `docker-compose.yml`
3. `devcontainer.json`

## .devcontainer/Dockerfile

- Golangイメージで下記cliを使えるようにしたコンテナを作成する
    - aws cli
    - aws sam cli

```.devcontainer/Dockerfile
FROM golang:1.21-bullseye

# Clean up old resources
RUN rm -Rf /workspace/aws 

RUN mkdir -p /workspace/aws
WORKDIR /workspace/aws

# Install dependencies
RUN apt-get update -y && apt-get install -y zip unzip sudo pip

# Install aws cli
# See https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip"
RUN unzip awscliv2.zip
RUN sudo ./aws/install --update

# Install aws sam cli
# See https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/install-sam-cli.html
RUN pip install --upgrade aws-sam-cli
```

## docker-compose.yml

- bindするvolumeを指定

```.devcontainer/docker-compose.yml
version: '3'
services:
  golang:
    build: .
    image: golang-and-aws-cli
    container_name: 'golang-bitcoin-lambda'
    ports:
      - 8080:80
    volumes:
      - type: bind
        source: '..'
        target: '/workspace/app'
      # 認証情報をバインドしておく
      # See https://qiita.com/yh1224/items/80a652562291cf37c718
      - type: bind
        source: '~/.aws'
        target: '/root/.aws'
        read_only: true
    tty: true
    restart: always
    # enable the tini init process to handle signals and clean up Zombie processes if you do not have an alternative set up
    # See https://github.com/microsoft/vscode-dev-containers/blob/main/script-library/docs/docker-in-docker.md#feature-use
    init: true
```

## devcontainer.json

```.devcontainer/devcontainer.json
{
  "dockerComposeFile": "docker-compose.yml",
  "service": "golang",
  "workspaceFolder": "/workspace/app",
  "features": {
    "docker-in-docker": {
      "version": "latest"
    }
  },
  "customizations": {
    "vscode": {
      "extensions": ["golang.go", "amazonwebservices.aws-toolkit-vscode"]
    }
  }
}
```

# VSCodeで開発コンテナーを立ててみる

必要なものが全部揃ってますね。

```bash
root:/workspace/app# go version
go version go1.21.1 linux/arm64

root:/workspace/app# aws --version
aws-cli/2.13.22 Python/3.11.5 Linux/6.1.30-0-virt exe/aarch64.debian.11 prompt/off

root:/workspace/app# sam --version
SAM CLI, version 1.97.0

root:/workspace/app# docker --version
Docker version 23.0.6+azure-2, build ef23cbc4315ae76c744e02d687c09548ede461bd
```

# 参考

https://qiita.com/yh1224/items/80a652562291cf37c718

https://qiita.com/frozenbonito/items/b1de3980ee0553fb1c2f
【React】要素の外側をクリックした場合に特定の処理を実行する方法


以下のように記述することで要素の外側をクリックした際に実行する処理を設定できます。

```ts
// ...

const ref = useRef<HTMLDivElement>(null)

const handleClickOutside = useCallback(
(ev: MouseEvent) => {
  if (!ref.current?.contains(ev.target as Node)) {
    // 外側をクリックした際の処理
  }
},
[]
)

useEffect(() => {
  document.addEventListener('click', handleMouseDownOutside)

  return () => {
    document.removeEventListener('click', handleMouseDownOutside)
  }
}, [])

// ...

```
コンテナイメージセキュリティ論文まとめ

# はじめに
コンテナイメージのセキュリティに関わる論文を個人用にまとめます。随時更新する予定です。

# 論文

https://www.techscience.com/cmc/v72n1/46926/html

https://ieeexplore.ieee.org/abstract/document/9654383?casa_token=ytbq3XBviCIAAAAA:BXZg08IjksmObLAsTtDzVrKw2hOqelkAzzHJixmGvRfqpSmSGlCplCphoFR7no549BvmJwizz-Tp

https://arxiv.org/abs/2006.02932

http://www.diva-portal.org/smash/record.jsf?pid=diva2%3A1679447&dswid=-2378

https://www.scitepress.org/Link.aspx?doi=10.5220/0011987900003464

https://link.springer.com/chapter/10.1007/978-981-19-9582-8_58

https://ieeexplore.ieee.org/document/9357496

https://link.springer.com/chapter/10.1007/978-3-319-94289-6_8

https://www.usenix.org/conference/cset20/presentation/berkovich
JLCPCBのPCB Assembly費用をなるべく安くするメモ

## サマリ

回路図設計時点でJLCPCB Libraryから採用する具体的部品を決めてからPCB設計に進むようにする。その際、0201サイズの部品は避け、なるべくBasic Parts部品から採用するようにする。

## PCBA TypeはEconomicで

PCBA Typeという選択項目があり、EconomicとStandardのいずれかが選べる。両者の違いは[PCB Manufacturing & Assembly Capabilities](https://jlcpcb.com/capabilities/pcb-assembly-capabilities)に詳しい記載があるが、まずなにより重要なのは**Economicの方が圧倒的に安い**ということだ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1536630/43e5dc30-df97-026f-65b4-ebf29857cb0f.png)

選べるとは書いたが、Economicの条件を満たせない設計内容と判断された場合はStandardに切り替えさせられるので、設計時点から条件を満たすことを意識する必要がある。

キーボード用PCBで踏みそうな項目は下記の通り。

|項目|内容|条件|
|---|---|---|
|PCB Color|基板の色|黄色はNG|
|Delivery Format|基板の切り離し箇所の加工|V-cutはNG。Mouse bites（丸穴のミシン目）で代用|
|Minimum Package|部品の最小サイズ|0402まで。抵抗などでうっかり0201を使いがちなので注意|

## 可能な限りBasic Parts/Preffered Extended Partsから選ぶ

[JLCPCB Assembly Parts Library](https://jlcpcb.com/parts)に在庫がある部品が指定可能だが、部品には`Basic Parts`と`Preffered Extended Parts`、`Extended Parts`という区分けがある。**Extended Partsはパーツ1種類あたりに手数料が$3かかってくる**。これが非常にデカい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1536630/20f2e8b9-274a-1768-b69d-bd937be86ff5.png)

設計段階であまり考えずに有名メーカーの部品を指定していたりすると大抵Extended Partsになるので、あらかじめ同等スペックのBasic Parts/Preferred Extended Parts品がないか探して置き換えていく方がよい。

そのほかこれらの区分けとは別に、`Standard Only`というマークがついているパーツがあるが、これを選択するとPCBA TypeがStandardに変えられてしまうのでこれも採用は避ける。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1536630/30c8754d-adb8-df36-db2d-b05d6d52c330.png)

## 回路図の時点で部品を決める

部品が変わるとピン配置もフットプリントも変わる。つまり回路図から修正になるため、JLCPCBへの発注段階になってから部品変更になるとつらい。回路図設計時点で具体的にどのJLCPCB部品を使うのかまで決めて、あらかじめパーツ番号をBoMファイルに埋め込んでおいたほうがいい。
システム監査の監査手続き

システム監査の監査手続きにはどのようなものがあるか解説します。

# システム監査手続きの方法

## チェックリスト法

システム監査人があらかじめ作成したチェックリストに対して関係者から回答を求める。

## ドキュメントレビュー法

監査証拠を入手するために関連する資料・文章を入手し内容を点検する。

## インタビュー法

システム監査人が直接関係者に口頭で問い合わせて回答を得る。

## ウォークスルー法

データの生成、処理、出力、活用までのプロセスや組み込まれているコントロールを、書面や実際の流れを追跡する。

## 突合・照合法

関連する複数の証拠資料を突き合わせたり、結果について原始資料まで遡って起因となった事象と突き合わせる。

## 現地調査法

被監査部門に直接赴き、業務を実際に視察・調査する。

## コンピュータ支援監査技法

専用のシステム監査支援ソフトやExcel等を利用して監査する。

## テストデータ法

監査人が作成したテストデータを監査対象のプログラムで処理し、想定した結果が得られるかを確認する。

## 監査モジュール法

本番プログラムに監査で確認したいデータを監査用のログに出力するプログラムを組み込む。

## ペネトレーションテスト法

セキュリティ監査のために一般権限や無権限で対象のシステムへの侵入を試み、アクセスが守られているかを確認する。

# 参考

[システム監査基準(平成30年)](https://www.meti.go.jp/policy/netsecurity/downloadfiles/system_kansa_h30.pdf)
画像の上に指定されたpaddingに合わせて画像を表示する方法

やたら時間をかけて悩んでしまったので備忘録。
## やりたいこと
画像の上に、指定されたpaddingに合わせて画像を重ねたい。。
## 試したこと

### Stackを使えばちょろい
重ねる＝Stack使えばすぐ実現すると思ってた。
こんな感じで実装。
```
Stack(
   fit: StackFit.passthrough,
   children: [
      Image.asset('背景になる画像', fit: BoxFit.fill),
      Padding(
         padding: const EdgeInsets.all(10),//指定されたpadding
         child: Row(
            children: [
               Image.asset(
                   '重ねる画像',
                    fit: BoxFit.fill,
               ),
               Text('hoge')
            ]),
          ),
   ],
),
```
### 問題点
端末に合わせて背景になる画像の大きさが変わったとき、paddingの大きさも変わってしまう。
親ウィジェットの大きさを取得することができるLayoutBuilderを使えば解決する？

## 結論：DecorationImageを使用する
```
Container(
    padding:const EdgeInsets.all(5.0),//指定されたpadding
    decoration: BoxDecoration(
        image:DecorationImage(
            image:AssetImage('背景になる画像'),
            fit:BoxFit.fill,
        )
   ),
   child: Row(
        mainAxisSize:MainAxisSize.min,
        children: [
            Image.asset(
                '重ねる画像',
                fit: BoxFit.fill,
            ),
            Text('hoge')
       ],
   ),
)
```
指定されたpaddingで実装しても縦幅が自動的に変化した。
## まとめ

調べてみたらいろんなサイトでDecorationImageについて紹介していた（調べ方が悪くなかなか辿り着けなかった）。
Containerってなんでもできて(?)すごい。。
LPIC101の内容から業務で使いそうなコマンド②

本記事は、勉強したことのアウトプット（メモ）です。
下記記事の続きです。

https://qiita.com/kahataku/items/2e94dacd26a926b80f14


### 現状
* web系エンジニアやっています。
* LPIC101合格に向けて、勉強中。

## 使用参考書、サイト
* [inux教科書 LPICレベル1 Version5.0対応](https://www.amazon.co.jp/Linux%E6%95%99%E7%A7%91%E6%9B%B8-LPIC%E3%83%AC%E3%83%99%E3%83%AB1-Version5-0%E5%AF%BE%E5%BF%9C-%E4%B8%AD%E5%B3%B6-%E8%83%BD%E5%92%8C/dp/4798160490/ref=asc_df_4798160490/?tag=jpgo-22&linkCode=df0&hvadid=295678107984&hvpos=&hvnetw=g&hvrand=10026356874543379694&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009292&hvtargid=pla-649269108462&psc=1&th=1&psc=1)
* [ping-t](https://ping-t.com/)
* [Linux教科書 LPICレベル1 スピードマスター問題集 Version5.0対応](https://www.amazon.co.jp/Linux%E6%95%99%E7%A7%91%E6%9B%B8-LPIC%E3%83%AC%E3%83%99%E3%83%AB1-%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E5%95%8F%E9%A1%8C%E9%9B%86-Version5-0%E5%AF%BE%E5%BF%9C-%E5%B1%B1%E6%9C%AC/dp/4798160857/ref=sr_1_1?adgrpid=56122615434&hvadid=667834322319&hvdev=c&hvlocphy=1009292&hvnetw=g&hvqmt=e&hvrand=9361466665802150923&hvtargid=kwd-334266044763&hydadcr=26605_11772063&jp-ad-ap=0&keywords=lpic+%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC&qid=1694935740&sr=8-1)
↑今回問題集での勉強を取り入れました。

## コマンド
### mkdir
空のディレクトリを作成します。

##### オプション
| オプション | 説明 |
|:-:|:-:|
| -m  | 指定したアクセス権でディレクトリを作成  |
| -p  | 親ディレクトリも作成  |
| -v  | 経過を表示 |

```linux:bash
$ mkdir -p test/test1/test2
```

### rm 
ファイルやディレクトリを削除します。

| オプション | 説明 |
|:-:|:-:|
| -f  | ユーザへの確認なしで削除  |
| -i  | 削除する前にユーザへの確認がある  |
| -r, -R  | サブディレクト含め、再帰的にディレクトリ全体を削除  |

下記コマンドは、testディレクトリとディレクトリ内のファイル、ディレクトリが削除されます。

```linux:bash
$ rm -r test
```

### grep
ファイルやテキストの中に、正規表現によって表される検索文字列があるかどうか、調べます。

##### オプション
| オプション | 説明 |
|:-:|:-:|
| -c  | パータンがマッチした行の行数を表示  |
| -f  | 検索パターンをフィアルから読み込む  |
| -i  | 大文字小文字区別せず表示  |
| -n  | 検索結果に行番号も表示  |
| -v  | パターンがマッチしない行を表示  |
| -E  | 拡張正規表現を使用する（egrep同様）  |
| -F  |  検索パターンを文字列として扱う（fgrep同様） |

`-F`は`fgrep`と同じように検索できます。
下記の場合、文字列`.*`で検索されます。
```linux:bash
$ fgrep '.*' test.txt
$ grep -F '.*' test.txt
```

`-E`は`egrep`と同じように検索できます。
```linux:bash
$ egrep '(10|22)' test.txt
$ grep -E '(10|22)' test.txt
```

## 変数
- 環境変数
    - 定義したシェル上、そのシェルで実行されているプログラムにも引き継がれる変数
    - `export`コマンドにより追加することができる
- シェル変数
    - 定義したシェル、プロセスのみで使用することができる変数
    - シェル、プロセスを終了するとシェル変数は失われる

### 主な環境変数
| 環境変数 | 説明 |
|:-:|:-:|
| EDITOR  | ディフォルトのエディタのパス  |
| HISTFILE  | コマンド履歴を格納するファイル  |
| HISTSIZE  | コマンド履歴の最大値  |
| HOME  | カレントユーザのホームディレクトリ  |
| LANG  | ロケール（言語）  |
| PATH  | コマンドやプログラムを検索するディレクトリ  |
| PWD  | カレントディレクトリ|

変数は`変数名=値`の形で定義することができます。
また`echo 変数名`で参照することができます。
```linux:bash
$ TEST=aaaa
$ echo $TEST
aaaa
```

## 最後に
もうすぐLPIC 101の試験なので、合格したら、102の方も投稿しようと考えています！
こちらの記事も随時更新していきたいと思います。

## 参考文献
* https://eng-entrance.com/linux-command-mkdir
* https://itc.tokyo/linux/rm-command/
* https://www.sejuku.net/blog/53034
Webエンジニアになって1か月働いた感想

# はじめに
まず簡単に、私の経歴について話します。
- 関西で４年生大学卒業。
- 新卒で東京のSES企業に入社し、約１年半ほど勤める。
- 会社に勤めながらプログラミングスクール『[happiness chain](https://happiness-chain.com/)』で約半年間学習したあと、今年の９月からWebエンジニアとして今の会社で働き始める。

# 企業概要
- 業務内容：教育事業
- 使用技術：Ruby on Rails, React, TypeScript, Docker, AWSなど
- 社員数：約100名でエンジニアは５名ほど

# 入社後の仕事内容
初日からフロントエンドの簡単なデザイン改修からやらせていただき、いきなり実務に取り掛かることができました。ちょうど私が入って２週間後くらいでバックエンドをAWS AppSyncからRuby on Railsにリプレイスすることになりバックエンドの環境構築や約１５個のテーブルのマイグレーションなどwebサービスのコアな部分を担当させていただくことができました。
基本的にはやりたいことをやらせていただける環境で、フロントとバックエンドどちらも携わることができています。

# スクールと実務の違い
スクールではロードマップに沿って勉強していくのでやることはある程度決まっていますが、実務では課題を自分で見つけて実装していくといった感じです。まだ１社目なので他の会社はどうか分かりません。良くも悪くも自分でやりたいことを探さない限り仕事はありません。成長したいので、やることが思い浮かばない場合、積極的にリーダーに聞きに行くようにしています。

# 入社後驚いたこと
社員のほとんどが東大生でした笑
エンジニアチームのリーダーも東大生ですが、頭が良すぎて理解や考えが追い付かないことが最近の悩みです笑

# Webエンジニアになるためには
未経験であれば1000時間くらいは勉強したほうがいいと思います。スクールではバックエンド言語を中心に半年間で500時間ほど勉強しました。スクールに入るまでに学生の頃からフロントエンドは独学で勉強していた時もあったので合計で1000時間くらいは勉強したと思います。
完璧に覚えようとはせず、地道にコツコツ勉強していくのがいいと思います。

# さいごに
私自身元々頭は良いほうではなく、いまだにリーダーが話していることがほぼほぼ理解できていません。分からないことを聞きすぎると迷惑かなと思ってしまう性格なので、昼ご飯を食べに行くときに雑談まじりに聞いたりしています笑
とはいっても初日から実務に携われるほどの力が身についたのは『[happiness chain](https://happiness-chain.com/)』のおかげです。
まだまだ分からないことだらけですが地道にコツコツ成長できればと思っています！
DateFormatterの和暦バグの解決法を考える

# はじめに
DateFormatterとは、SwiftでDate型の日付を文字列に変換するときに使用するオブジェクトです。
実はこのDateFormatter、使い方を誤ると**思わぬバグを生み出してしまいます**。
※ 現在時刻は`2023/9/30 12:34`だとして説明します。
```swift
  let date = Date()    // 現在時刻
  let dateFormatter = DateFormatter()
  dateFormatter.dateFormat = "yyyy/M/d HH:mm"
  let r = dateFormatter.string(from: date)
  print(r)    // 2023/9/30 12:34
```
上記のコード、一見問題なさそうに見えますよね……？
しかし、実行する端末の設定によっては、`0005/9/30 12:34`と表示されてしまうバグを含んでいるのです。 「設定」アプリを開いて「一般＞言語と地域＞暦法」を「和暦」に設定した端末でこのコードを実行すると、そのバグを観測できます。
暦法の設定には以下の3種類があり、
- 西暦（グレゴリオ暦）
- 和暦
- タイ仏歴

タイ仏歴に設定した場合も、`2566/9/30 12:34`という間違った表示になります。
「西暦2023年 = 令和**5**年 = 仏歴**2566**年」がこれらの数字の正体です。**`yyyy`に必ずしも西暦が入るとは限らない**ということですね。

では、**`yyyy`を間違いなく西暦にするには？** 実機で色々と試して調べてみました。

# 解決法１ - Localeを設定する方法
DateFormatterは、何も設定しなければ端末の設定が反映されてしまいますが、Localeを設定することで表示形式を指定することができます。
```diff_swift
  let date = Date()    // 現在時刻
  let dateFormatter = DateFormatter()
+ dateFormatter.locale = Locale(identifier: "ja_JP")
  dateFormatter.dateFormat = "yyyy/M/d HH:mm"
  let r = dateFormatter.string(from: date)
  print(r)    // 2023/9/30 12:34
```
Localeは、言語や地域に関する情報を持っている構造体で、`ja_JP`は「年は西暦で表現する」という情報を持っています。これを設定することで、和暦設定の端末でも西暦で表示することができます。

# 解決法２ - Calendarを設定する方法
さらに調べると、次のような方法も見つかりました。
```diff_swift
  let date = Date()    // 現在時刻
  let dateFormatter = DateFormatter()
+ dateFormatter.calendar = Calendar(identifier: .gregorian)
  dateFormatter.dateFormat = "yyyy/M/d HH:mm"
  let r = dateFormatter.string(from: date)
  print(r)    // 2023/9/30 12:34
```
Calendar構造体は、暦法に関する情報を持っていて、`.gregorian`で西暦、`.japanese`で和暦、`.buddhist`で仏歴の情報を持たせることができます。
これを設定することでも、和暦設定の端末でも西暦で表示することができます。

# 比較検討
何も設定してないDateFormatterと、Localeと、Calendarを比較するためのコードを書きました。
```swift
  for calendar in [DateFormatter().calendar!,
                   Locale(identifier: "ja_JP").calendar,
                   Calendar(identifier: .gregorian)] {
      print("identifier: \(calendar.identifier), lacale: \(calendar.locale!), timeZone: \(calendar.timeZone)")
  }
```
「一般＞日付と時刻＞時間帯」を「ニューヨーク、米国」に、暦法を「和暦」に設定した端末で、実行してみました。
|          | 無設定 | Locale | Calendar |
|:--------:|:-:|:-:|:-:|
| identifier | `japanese` | `gregorian` | `gregorian` |
| locale | `ja_JP@calendar=japanese (current)` | `ja_JP (fixed)` | ` (fixed)` |
| timeZone | `America/New_York (fixed (equal to current))` | `America/New_York (fixed (equal to current))` | `America/New_York (fixed (equal to current))` |

Localeを`ja_JP`に設定したらタイムゾーンが強制的に東京になったりするかなと思ってニューヨークに設定してみましたが、そういうこともなさそうなので、これを見る限りLocaleとCalendarの間に特に差はなさそうです。
コードを見て意図を理解しやすいという点で言えば、Calendarを使うのが無難そうです。

# 結論
DateFormatterを使用する時は、和暦バグ防止のために、以下の設定をつけよう！
```swift
dateFormatter.calendar = Calendar(identifier: .gregorian)
```
以上です。

# 参考文献
https://developer.apple.com/documentation/foundation/dateformatter

https://developer.apple.com/documentation/foundation/locale

https://developer.apple.com/documentation/foundation/calendar
VMwareで設定した共有フォルダのマウント方法


# 経緯
VMware WorkstationにおいてホストOSとゲストOS間で共有フォルダを設定しているが、ゲストOS再起動後は共有フォルダへのリンクが切れてしまう。
VMware WorkstationのGUIで再度共有フォルダ設定をしてもよいが、面倒なのでCUIだけで対応したい。

# 前提
* VMware Workstationの「設定」 → 「オプション」 →  「共有フォルダ」で共有フォルダの設定済み
* ゲストOSにvmware toolsをインストール済み

# 対応方法
まずは、設定した共有フォルダを認識しているのか確認する。
私の場合、ホストOS上のworkというフォルダを共有しているので、`vmware-hgfsclient`コマンドによってworkと表示された。
```
$ ls /mnt/hgfs          # リンクが切れているので、共有フォルダが表示されない
$ vmware-hgfsclient
work
```

`vmhgfs-fuse`コマンドを使って、共有フォルダをマウントする。
```
$ sudo vmhgfs-fuse .host:/ /mnt/hgfs/ -o allow_other,uid=1000    # 他ユーザーへのアクセスを許可、uidが1000のユーザーをownerに
$ ls /mnt/hgfs
work
```

# 参考
* https://askubuntu.com/questions/29284/how-do-i-mount-shared-folders-in-ubuntu-using-vmware-tools
* https://usskim.blog.fc2.com/blog-entry-764.html
jqコマンドが使えず無理やりシェルコマンドでJSONの値を取得する方法

`jq`コマンドがインストールされておらず、しょうがなく`jq`コマンドの代わりに`grep`、`sed`、`tr`、`cut`コマンドを使用して取得した時の方法を紹介します。

# 1. jsonファイル

以下のjsonファイルを対象とします。

```json:test.json
{"key01":"value01","key02":"value02","key03":"value03","key04":"value04","key05":"value05"}
```

# 2. jqコマンドでの取得方法

`jq`コマンドだと以下のコマンドで取得できます。

`cat test.json | jq -r .key02`


```console:実行結果
[root@centos85 ~]# cat test.json | jq -r .key02
value02
[root@centos85 ~]#
```

# 3. 通常のコマンドで無理やり取得する方法

`jq`コマンドが使えなかったので、以下のコマンドで取得しました。

`cat test.json | sed 's/^{\(.*\)}$/\1/' | tr ',' '\n' | grep key02 | cut -d ":" -f 2 | tr -d '\t' | tr -d ' ' | tr -d '"'`

+ `sed 's/^{\(.*\)}$/\1/'`のコマンドで{}内の文字列を取得
+ `tr ',' '\n'`のコマンドで`,`を`\n（改行）`に置換
+ `grep`コマンドで`key02`の行を抽出
+ `cut`コマンドで`:`で分割し2項目目を取得
+ `tr -d`コマンドで`\t（タブ）`、半角スペースを削除
+ `tr -d`コマンドで`"`を削除

```console:実行結果
[root@centos85 ~]# cat test.json | sed 's/^{\(.*\)}$/\1/' | tr ',' '\n' | grep key02 | cut -d ":" -f 2 | tr -d '\t' | tr -d ' ' | tr -d '"'
value02
[root@centos85 ~]#
```

<font color="red">今回のjsonファイルは入れ子がなかったので単純にできましたが、入れ子がある場合はもっと考えないといけません。</font>

---
以上
Navigationのデスティネーションの引数の型にインナークラスを使う

## 内容
```kotlin
package androidx.navigation.myapp

class Argument {
    enum class Type {
        A,
        B,
    }
}
```
上記`Type`を`Navigation`コンポーネントのデスティネーションの`argument`に指定するとき、下記のように書いてしまいがちですが、エラーになります。
```xml
<argument
    android:name="type"
    app:argType="androidx.navigation.myapp.Argument.Type" />
```
こちらのように$を使います。
```xml
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/nav_graph">

    <fragment    
        android:name="androidx.navigation.myapp.MyFragment">
        <argument
            android:name="type"
            app:argType="androidx.navigation.myapp.Argument$Type" />
    </fragment>

</navigation>
```

また、`app:argType`に自作クラスを利用し、R8を設定している場合は、`@Keep`でクラス名が書きかわらないようにしておきましょう。`@Keep`をつけないとアプリ起動時にクラッシュが発生します。
```kotlin
package androidx.navigation.myapp

@Keep
class Argument {
    @Keep
    enum class Type {
        A,
        B,
    }
}
```

## 参考文献
- https://issuetracker.google.com/issues/123736741?hl=ja&pli=1
画像をVSCodeのREADME.mdにアップロードし、保存先を設定する

## VSCodeに直接画像をアップロードできるようになったらしい。

Shiftキーを押しながら画像をドラッグ＆ドロップすることで、簡単にアップロードできます。

## アップロードした画像の保存先を指定する

以下のように`settings.json`ファイルを編集することで、画像の保存先を指定できます。
今回は、`./README.md`に画像をアップロードした時の保存先を`docs/images/`としました。

`.vscode/settings.json`
```json
{
  "markdown.copyFiles.destination": {
    "/README.md": "docs/images/${documentBaseName}/"
  }
}


{
  "markdown.copyFiles.destination": {
    "{対象のファイル}": "{保存先}"
  }
}
```

### 参考資料

- [May 2023 (version 1.79) : Copy external media files into workspace on drop or paste for Markdown](https://code.visualstudio.com/updates/v1_79#_copy-external-media-files-into-workspace-on-drop-or-paste-for-markdown)
- [VS Codeで拡張機能なしでMarkdownに画像を貼り付けられるようになった](https://zenn.dev/roboin/articles/1fa72705ff2e03)
aws-sdk-go経由で AWS bedrock / Stable Diffusionで画像生成するメモ

個人用メモ
- 上位モデルは現在予約済のスループットでしかサポートされていない?
- goに関してはbedrock でなく bedrockruntime パッケージを使う。
- 画像はbase64データとしてSDKより直接返ってくる
    - APIリクエストのオプションは[stability.ai](https://platform.stability.ai/docs/api-reference#tag/v1generation/operation/textToImage) と同様

```go
package main

import (
	"encoding/base64"
	"encoding/json"
	"fmt"
	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/bedrockruntime"
	"github.com/wano/contextlog/clog"
	"os"
	"path/filepath"
	"time"
)

func main() {
	sess, _ := session.NewSession(&aws.Config{
		Region: aws.String("us-east-1")},
	)

	brr := bedrockruntime.New(sess)

	type Prompt struct {
		Text string `json:"text"`
	}

	type ReqBody struct {
		TextPrompts []Prompt `json:"text_prompts"`
		CfgScale    int      `json:"cfg_scale"`
		Seed        int      `json:"seed"`
		Steps       int      `json:"steps"`
		Width       int      `json:"width"`
		Height      int      `json:"height"`
	}

	reqBody := ReqBody{
		TextPrompts: []Prompt{
			{
				Text: " Music Album Jacket for HIPHOP ",
			},
		},
		CfgScale: 30,
		Seed:     749500536,
		Steps:    130,
		Width:    512,
		Height:   512,
	}

	rb, _ := json.Marshal(reqBody)

	resp, err := brr.InvokeModel(&bedrockruntime.InvokeModelInput{
		ModelId:     aws.String(`stability.stable-diffusion-xl-v0`),
		ContentType: aws.String(`application/json`),
		Accept:      aws.String(`application/json`),
		//Body:        []byte("{\"text_prompts\":[{\"text\":\" Music Album Jacket for HIPHOP \"}],\"cfg_scale\":30,\"seed\":749500524,\"steps\":130}"),
		Body: rb,
	})
	if err != nil {
		panic(err)
	}

	type Artifact struct {
		Seed   string `json:"seed"`
		Base64 string `json:"base64"`
	}

	type Result struct {
		Result    string     `json:"result"`
		Artifacts []Artifact `json:"artifacts"`
	}

	rr := Result{}
	_ = json.Unmarshal(resp.Body, &rr)

	if rr.Result != `success` {
		panic(rr.Result)
	}

	b64 := rr.Artifacts[0].Base64

	// Base64データをデコードする
	decodedData, err := base64.StdEncoding.DecodeString(b64)
	if err != nil {
		clog.Fatal("Error decoding image:", err)
	}

	os.MkdirAll("./output", 0777)

	fileP := filepath.Join("./output", fmt.Sprintf("%s.jpg", time.Now().Format("20060102150405")))

	// デコードしたデータをJPEGファイルとして保存する
	err = os.WriteFile(fileP, decodedData, 0777)
	if err != nil {
		clog.Fatal("Error writing to file:", err)
	}

}


```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85375/7838a429-178d-5310-ea96-0e9f376c3da2.png)
pnpmでNext.jsプロジェクトを作成する際のエラーとその解決方法

## 事象

1. pnpmは、npmやyarnと並んで、JavaScriptのパッケージマネージャーとして知られています。pnpmを利用することで、パフォーマンスの向上やディスクスペースの節約などの利点があります。しかし、pnpmをインストール後、pnpm create-next-appコマンドを実行しようとすると、以下のようなエラーが発生しました。

    ```
    $ pnpm create-next-app
    ERR_PNPM_NO_IMPORTER_MANIFEST_FOUND  No package.json (or package.yaml, or package.json5) was found in "<実行ディレクトリ>".
    ```

2. pnpmを使ってNext.jsプロジェクトを作成しようとすると、別のエラーが発生しました。

    ```
    $ pnpm create-next-app
    ERR_PNPM_RECURSIVE_EXEC_FIRST_FAIL  Command "create-next-app" not found
    ```

## 対処法

1. pnpm initを実行することで解決できます。このコマンドによって、コマンドを実行しているディレクトリにpackage.jsonが作成され、pnpmコマンドが正常に実行されるようになります。

https://pnpm.io/ja/cli/init

2\. pnpmの場合、create-next-appというコマンドが認識されませんでした。pnpm create next-appというコマンドを実行することによって、Next.jsプロジェクトを作成することができます。

https://nextjs.org/docs/app/api-reference/create-next-app

自らの備忘録のために投稿してますが、なにかお役に立てましたら幸いです！:clap:
また、なにか間違ってましたらご指摘いただけますと幸いです！:pray:
BuildozerファイルをカスタマイズしてAndroidアプリのアイコンを変える。

# はじめに
　Python＋Kivy＋BuildozerでAndroidアプリを作ることができる。ただ、Buildozerをデフォルト設定でビルドするとアイコンがKivyのマークになる。この記事では、自作のアイコンへ変更する方法についてまとめる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299802/8c70d61c-a8a2-00c7-5d3c-07a3341dd638.png)

PythonでAndroidアプリを作る方法は下記参照。

https://qiita.com/tapitapi/items/e91d67d59ed10caa59f6


# Buildozer.specをカスタマイズしてアイコン変更
　アイコン含めBuildozerの設定は、```buildozer init```で生成される```buildozer.spec```ファイルを変更することでできる。アイコン変更は```icon.filname```を有効にすればOK。
　```%(source.dir)s/```がbuildozer.specと同ディレクトリを指すので、そこに```icon.png```ファイルを格納した状態でビルド(```buildozer -v android debug```)すれば、icon.pngの画像がAndroidアプリのアイコンになる。アイコン画像は512x512のpngファイルにする。

```python:buildozer.spec
# (str) Icon of the application
#icon.filename = %(source.dir)s/data/icon.png
#変更後
icon.filename = %(source.dir)s/icon.png
```
アイコン作成で透過させるアプリは peko step が便利でした。

https://www.peko-step.com/tool/alphachannel.html

# その他カスタマイズ
アイコン以外も下記の変更が可能。
```python:buildozer.spec
#アプリ名---------------------------
# (str) Title of your application
#title = My Application
title = Color_bar

#apkパッケージ名--------------------
# (str) Package name
package.name = color_bar

#importするライブラリ列挙-----------
# (list) Application requirements
# comma separated e.g. requirements = sqlite3,kivy
requirements = python3,kivy 

#ネット有効-------------------------
# (list) Permissions
# (See https://python-for-android.readthedocs.io/en/latest/buildoptions/#build-options-1 for all the supported syntaxes and properties)
android.permissions = android.permission.INTERNET, (name=android.permission.WRITE_EXTERNAL_STORAGE;maxSdkVersion=18)
```