OmniAICreator/Qiita-1.07M huggingface dataset:
Qwenで実現するAIエージェント開発！Model Studioハンズオンイベント参加レポート

# 参加の経緯 
今年に入っての**3日間の眠れぬ夜**は過ぎ去っていたものの、来年度の「プログラミング演習」の授業内容の大幅なアップデートに向き合いつつも、具体的な講義内容を作成していく前のなんだかグダグダしている期間を過ごす中で、株式会社レッジさんからのメールにあった「**Qwenで実現するAIエージェント開発！Model Studioハンズオンイベント**」に目がいった。

https://ledge-ai.the-ai.jp/articles/alibaba_cloud_hands-on_2025

そもそも「単なる知識獲得のための情報戦（における消耗戦）」からは脱却しようと心に決めつつも、「学生の方がAI friendlyなのでは」「既に圧倒的なAI格差が生まれているのでは」という恐怖心は未だ存在している中で、「この状況でQwenもか」とも思いつつ、一歩踏み出して参加することに。



# 得られたもの
**1.ビジネスパーソンとして、一市民として、社会の他の方々とAIとの関係性が現在どのようなものなのかをとても生々しい理解**
 ハンズオンは、個人ワークの形態にて、AlibabaCloudさんの講師陣の方によって、終始非常に丁寧なプロセスで進められたが、20名強の参加者の方々のそれぞれのリアクションや細かな反応によって、AIとの関係性がそれぞれ垣間見ることをできた気がする。
また、ハンズオン後に開催されたネットワーキングにおいては、「正直なところ、今AIってどうですか（=うまく使えていて、うまく結果を出せていますか）？」の様な対話やコミュニケーションが多く、嘘偽りなく率直に不安等を吐露しその共有？もでき、マウンティングなど皆無で、この様な機会というのが本イベントのもう一つの独自の価値であったと考える。

**2.QwenとModel Studioの一通りの理解と活用**
実施内容：（仮想）AppleストアのカスタマーサポートにおけるAIエージェントの構築
プロセス：以下の通り（各ステップ、丁寧すぎる位に各参加者に配慮していた）
　Step 1: ログイン
　Step 2: ModelStudioの準備
　Step 3: Qwenの動作をテスト
　Step 4: ナレッジを作成
　Step 5: AIアプリケーションを作成
　Step 6: AIアプリケーションを削除

 AIエージェントの構築といっても、アプリケーションのテンプレートが存在していて、それを活用すればよかったので、特に躓くところは無かった。また、理論的に実践的にも比較できるほどの知見を持ち合わせているわけではないが、日本語の処理能力において違和感を感じることもなく、チャットボットを構築することができた。

 **3.AIとの共知能社会に向き合うための、またそれを築いていく為の関係性**
実はコロナ禍前の2019年にとある縁にて、Alibabaの本社を訪れていた。そのことと美大でテクノロジー×デザイン×ビジネスの統合をコラボレーションの観点で教育する中で思い切りAI friendlyに舵を切ろう（と考えています、そして困ってもいます）という二点をベースにAlibaba Cloudさん、レッジさんの方々とコミュニケーションを行う中で、在りたい共創関係も目指していけるような感覚を（勝手に）得ることができた。「大学教育においてAIとはなにか」という大きな問いに対して、各大学（組織）が答えていくことは勿論、ある種の過渡期（混乱期）においては、各教員がそれに対して、自ら学び実践しながら答えていくことも必要だと考えている。その中で、Alibaba Cloudさんの考え方は勿論、各メンバーの人間性にも触れることができたのは非常に有難い機会であった。やはり非常に優秀な人材の集団という印象であり、「正直なところ日本や日本企業・市場をどう捉えているのか」についても聞いてみたかった。

![IMG_8945.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157300/eeff7791-ea39-4642-8d15-b9f0a0fa4459.jpeg)

![IMG_8925.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157300/ef1cc16a-c9d5-4b58-bc7e-98baf7e76edf.jpeg)
懐かしい

![IMG_7503.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157300/72e32fb1-a5a0-4458-bc7a-29ac3e22ee8e.jpeg)
そしてレッジさんのオフィスもとても素敵だった。



# 今後について
自身の研究やビジネスに対しても得るものはありそうなので、QwenやModel Studioについても、AI理解と活用を拡げるような形で時間を見つけては触っていきたい。また、本当に何が正解かが分からない正に今の大学教育におけるプログラミングやAI×デザイン×ビジネスの講義や実践、また産官学民連携プロジェクトに対して、考え方のレベルにおいてもインパクトを得られる様に活用していきたい。
【Bash】バックグラウンド実行（fg、bg）の事

## はじめに
bashでプロセス管理について書いてみました。
bassで作業する時、プロセス管理は基本的な事項の一つです。
長時間実行されるタスクを効率的に管理する方法は生産性を大幅に向上させます。
この記事では、Bashでのプロセスのフォアグラウンドとバックグラウンドでの実行、及びそれらの間での切り替え方法について詳しく説明します。

### 動作環境
執筆時点での情報ですが、以下の環境で動作確認を行なっています。
Ubuntu 24.04.1 LTS
bash 5.2.21

## 1. プロセスの基本概念

Unixベースのシステムでは、実行中のプログラムは「プロセス」と呼ばれます。
各プロセスには一意のプロセスID（PID）が割り当てられ、システムによって管理されます。
Bashでは、これらのプロセスを管理するための「ジョブ制御」機能が提供されています。

## 2. フォアグラウンドとバックグラウンドの違い

### フォアグラウンドプロセス
- ターミナルを占有します。
- 入力を直接受け取り、出力を直接表示します。
- Ctrl+Cで中断できます。
- プロセスが完了するまで新しいコマンドを入力できません。

### バックグラウンドプロセス
- ターミナルを占有しません。
- 他のコマンドと並行して実行されます。
- 通常、出力はターミナルに表示されますが、入力は受け付けません。
- プロンプトが即座に返されるため、他のコマンドを続けて実行できます。

## 3. バックグラウンドでのプロセス実行

### コマンドをバックグラウンドでの起動

コマンドの末尾に`&`を追加することで、プロセスをバックグラウンドで実行できます。

```bash
$ long_running_command &
[1] 1234
```
この出力の`[1]`はジョブ番号で、`1234`はプロセスIDです。

### 実行中のプロセスをバックグラウンドに移動

プロセスがすでにフォアグラウンドで実行されている場合：

1. `Ctrl+Z`でプロセスを一時停止する
2. `bg`コマンドでバックグラウンドでの実行を再開する

```bash
$ long_running_command
^Z
[1]+  Stopped                 long_running_command
$ bg
[1]+ long_running_command &
```

## 4. ジョブ制御コマンド: `jobs`, `fg`, `bg`

### jobs

`jobs`コマンドは現在のターミナルで実行されているすべてのジョブ（プロセス）を表示します。

```bash
$ jobs
[1]-  Running                 sleep 100 &
[2]+  Stopped                 vim document.txt
```

出力の`+`記号は、`fg`や`bg`コマンドを引数なしで実行した場合にデフォルトで操作される「カレントジョブ」を示します。`-`記号は「次のカレントジョブ」を示します。

### fg

`fg`コマンドはバックグラウンドプロセスをフォアグラウンドに移動します。

```bash
# ジョブ番号を指定してフォアグラウンドに移動
$ fg %1

# デフォルトでカレントジョブ（+マークのジョブ）が対象になる
$ fg
```

### bg

`bg`コマンドは停止したプロセスをバックグラウンドで再開します。

```bash
# ジョブ番号を指定してバックグラウンドで再開
$ bg %2

# デフォルトでカレントジョブが対象になる
$ bg
```

## 5. 実用的な例

### 例1: 長時間実行されるコマンドをバックグラウンドで実行

```bash
# バックグラウンドで圧縮を実行
$ tar -czf archive.tar.gz large_directory &
[1] 1234

# 他の作業を続ける
$ ls -la
$ cd another_directory

# ジョブの状態を確認
$ jobs
[1]+  Running                 tar -czf archive.tar.gz large_directory &
```

### 例2: フォアグラウンドプロセスをバックグラウンドに移動

```bash
# エディタを起動
$ vim large_file.txt

# Ctrl+Zで一時停止
^Z
[1]+  Stopped                 vim large_file.txt

# 他のコマンドを実行
$ ls -la

# 必要に応じてvimをフォアグラウンドに戻す
$ fg
```

### 例3: 複数のバックグラウンドジョブの管理

```bash
$ sleep 100 &
[1] 1234
$ sleep 200 &
[2] 1235
$ sleep 300 &
[3] 1236

$ jobs
[1]   Running                 sleep 100 &
[2]-  Running                 sleep 200 &
[3]+  Running                 sleep 300 &

# ジョブ2をフォアグラウンドに移動
$ fg %2

# Ctrl+Cで中断
^C

$ jobs
[1]-  Running                 sleep 100 &
[3]+  Running                 sleep 300 &
```

## 6. プロセス管理の高度なテクニック

### nohup: ログアウト後もプロセスを実行し続ける

通常、ユーザーがログアウトすると、そのユーザーが開始したバックグラウンドプロセスも終了します。
`nohup`コマンドを使用すると、ログアウト後もプロセスを実行し続けることができます。

```bash
$ nohup long_running_command &
[1] 1234
nohup: ignoring input and appending output to 'nohup.out'
```
標準出力と標準エラーは、デフォルトで`nohup.out`ファイルにリダイレクトされます。

### disown: プロセスをシェルのジョブ制御から切り離す

`disown`コマンドを使用すると、実行中のバックグラウンドプロセスをシェルのジョブ制御から切り離すことができます。

```bash
$ long_running_command &
[1] 1234
$ disown %1
```
これにより、シェルセッションを終了しても、プロセスは実行され続けます。

## さいごに
Bashでのプロセス管理は効率的なコマンドライン作業のための強力なツールになります。
この記事で紹介した`&`、`jobs`、`fg`、`bg`などのコマンドを使う事で、複数のタスクを効率的に管理し、生産性を向上させることが出来るでしょう。
デジタル名刺（NFC名刺カード）を作成した話

# デジタル名刺（NFC名刺カード）を作成した話

## 背景
仕事での名刺交換は、通常、会社が支給する紙名刺を使用することが一般的です。
多くの企業では、内容が変わるたびに新しい名刺が支給されます。  

しかし、個人で勉強会や趣味の集まりに参加する際には、SNSや個人サイトの情報を記載した名刺を作成して交換する人も多いでしょう。
問題は、個人名刺の作成にはコストがかかること。
情報を更新するたびに新しい名刺を発注すると負担が大きくなります。  

さらに、SNSのアカウント情報は頻繁に変わることがあり、一定期間でQRコードが無効になることもあります。
このような背景から、紙の名刺よりも柔軟に情報を更新できるデジタル名刺に興味を持ちました。  

## 気づき 

勉強会やイベントでの名刺交換の主な目的は、相手とSNSでつながることです。
しかし、実際には名刺を交換した後に紙の名刺を見返すことはほとんどありません。
重要なのは、相手のアカウント情報が分かり、簡単にフォローできることです。  

この点を考えると、紙の名刺は必須ではなく、デジタル名刺を使えば効率的に情報を共有できるのではないかと思いました。  

## デジタル名刺サービスの選定

現在、デジタル名刺サービスは複数存在し、プロフィールページを作成し、そのページにリンクするNFCカードを作成できるものもあります。
どのサービスも「プロフィールページへのリンクを設定したNFCカードを届ける」という形式でした。
つまり、NFCカードを自分で用意し、リンクを書き込めば同じものが作れるのでは？と気付き、自作することにしました。  

## デジタル名刺（NFCカード）の自作

デジタル名刺の作成は、以下の2ステップで完了します。  

1. プロフィールページの作成 
2. NFCカードにプロフィールページのURLを設定 

### 1. プロフィールページの作成

プロフィールページを作成するにあたり、ホスティングサービスを以下の3つに絞りました。  

- lit.link
- Gravatar
- 自分でサーバを用意 

最終的に、手軽さと日本での認知度を考慮して「lit.link」を選びました。  

### 2. NFCカードにプロフィールページのURLを設定

プロフィールページが完成したら、そのURLをNFCカードに書き込みます。
手順は以下の通りです。  

1. NFCカードを用意する
2. スマホのNFC書き込みアプリを使い、プロフィールページのURLを登録  
3. スマホで実際に読み取れるかテストする  

これで、NFCカードをスマホにかざすだけでプロフィールページにアクセスできるデジタル名刺が完成しました。  

## デジタル名刺の活用と今後の展開

デジタル名刺の利点は、SNSアカウントの変更やメールアドレスの更新があっても、プロフィールページを修正するだけで済むことです。
すでに作成したNFCカードは変更不要なので、コストの面でも優れています。  

また、次のような活用も考えられます。  

- NFCシールを活用する
  シンプルな紙名刺（名前やアイコンだけ等）にNFCシールを貼り、スマホで読み取れるようにする。  
- アクセス制限付きのプロフィールページを作る
  自分でホスティングし、デジタル名刺経由でアクセスした場合のみ追加情報（電話番号やメールアドレス等）を表示する。
Ubuntuのうるさいビープ音を最速一行で消す

参考：https://level69.net/archives/32947#google_vignette

シェルで以下のコマンドを実行するだけです。
```
sudo sed -i 's/# set bell-style none/set bell-style none/' /etc/inputrc
```
パスワードを求められるので入力して下さい。sudoでないとファイルに書き込む権限がありません。```ls -l /etc/inputrc```とすると、このファイルの権限が-rw-r--r--であることがわかります。
参考：https://qiita.com/yunaimatsu/items/d9a388aa8874e154b925

/etc/inputrc内でコメントアウトされているset bell-style noneという設定の#を消して実行可能にします。#とsetの間に空白があることに注意してください。
sedコマンドで置換します。-iオプションによってファイルを編集することができます。
```
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if SUFFIX supplied)
```
シェルを再起動すると反映されます。これ大事です。シェルを再起動すると反映されます！！！
type-challenges解いてみた 初級 11-Tuple to Object編


# 問題

````md
タプルを受け取り、その各値のkey/valueを持つオブジェクトの型に変換する型を実装します。

例えば：

```ts
const tuple = ['tesla', 'model 3', 'model X', 'model Y'] as const

type result = TupleToObject<typeof tuple> // expected { 'tesla': 'tesla', 'model 3': 'model 3', 'model X': 'model X', 'model Y': 'model Y'}
```
````

与えられた配列の各要素をkey。valueにmapしたオブジェクト型を作成してくださいという問題です。























## 回答

```ts
type TupleToObject<T extends readonly any[]> = {
  [key in T[number]]: key
}
```

`T[number]`がUnionで返されることを知っていれば簡単に解くことができます。

### ちょっと解説

#### **`T[number]`**

配列T各要素のUnion型を取得できます。
なぜこれでUnion型がとれるかというと、単純なタプル型とは以下のような型を持つのと同義であり、
```ts
interface StringNumberPair {
  // specialized properties
  length: 2;
  0: string;
  1: number;
 
  // Other 'Array<string | number>' members...
  slice(start?: number, end?: number): Array<string | number>;
}
```
この型に対してnumber型でインデックスされた値をとりだすからですね。

`['tesla', 'model 3', 'model X', 'model Y']`の場合、

```ts
interface XXX {
  length: 4;
  0: "tesla";
  1: "model 3";
  2: "model X";
  3: "model Y";
}
```
のような型をもつものとみなされ、number型でインデックスされている四つがUnionとして取り出されるわけですね。
ちなみに、以下のように数字を指定すればしっかりその数字に対応した値が返ってきます。

```ts
type A = typeof tuple;
type B = A[1] // type B = "model 3"
```

また、lengthの取得も可能です。

```ts
type A = typeof tuple;
type B = A["length"] // type B = 4
```
ローカルSPMモジュールのテストカバレッジを取得する

# はじめに

ローカルのSPMモジュールに依存しているプロジェクトで、テストを実施した際に、SPMモジュールのテストカバレッジが一部取れていなかった、かつテストコードのカバレッジまで含まれていて、イマイチだったので、その時の対処法を備忘の意味も込めて記事にしました。

# 前提

- Xcode16.2
- Swift6
- プロジェクト構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359094/7569173c-bd78-4eab-a09e-cf5ae15df5ee.png)


- SPM マルチモジュール構成

```swift
// swift-tools-version: 6.0
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: "PackageModule",
    platforms: [.iOS(.v18)],
    products: [
        .library(
            name: "MainFramework",
            targets: ["MainFramework"]
        ),
    ],
    targets: [
        .target(
            name: "MainFramework",
            dependencies: [
                "View",
                "Model"
            ]
        ),
        .target(
            name: "View",
            dependencies: [
                "Core"
            ]
        ),
        .target(
            name: "Model",
            dependencies: [
                "Core"
            ]
        ),
        .target(
            name: "Core"
        ),
        .testTarget(
            name: "ViewTest",
            dependencies: ["View"]
        ),
        .testTarget(
            name: "ModelTest",
            dependencies: ["Model"]
        ),
    ]
)
```

# 遭遇した問題

テスト実行した時に、カバレッジを確認するとテストコードが含まれており、SPM モジュールの一部のプロダクションコードがカバレッジ範囲から外れていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359094/c027811a-487e-430c-8849-5c4834163a88.png)


# 修正方法

## カバレッジ対象のターゲットをプロダクションコードに絞る
edit schemeから紐づいているtestplanの設定を開いて、以下のようにcode coverageの設定を`all targets`から`some targets`にしてテストターゲット以外のカバレッジを取りたいターゲットを指定するようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359094/ba1e1b52-4f5f-49ea-8c8c-2e1a9dee1dc5.png)


## Package.swiftを修正する
`MainFramework`のバンドルに含めるターゲットに、カバレッジを取りたいターゲットを全て含めることで、
カバレッジを取得するターゲットを`MainFramework`に指定した際、バンドルに含めたターゲットもカバレッジ取得の対象になるようです。

```diff_swift
// swift-tools-version: 6.0
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: "PackageModule",
    platforms: [.iOS(.v18)],
    products: [
        .library(
            name: "MainFramework",
-           targets: ["MainFramework"]
+           targets: [
+               "MainFramework",
+               "View",
+               "Model",
+               "Core"
+           ]
        ),
    ],
    ・・・省略
)
```

# 結果
テストコードをのぞいた、SPMモジュールのプロダクションコードのカバレッジを取得できるようになりました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359094/67e89828-f094-458d-86ea-fd89d3201d7d.png)

今回のサンプルコードは以下リポジトリにも挙げているので、手元で確認してみたい方はご参照ください。

https://github.com/stotic-dev/SampleSPMTestCoverageCheck
atcoder_水色精進記録12_ABC224d

# Atcoder水色精進記録
ABC224
D - 8 Puzzle on Graph
https://atcoder.jp/contests/abc224/tasks/abc224_d

# アルゴリズム・データ構造
BFS

# 考察
操作回数の最小化なのでBFSができないか？
考えられる状態数としては、9個の並び替えなので9!=362,880
全状態探索が可能

1-8空きマス(0)の並びをtupleで管理して状態として、訪れたことがある状態をsetで管理。
再度同じ状態に訪れることがないようにqueに足していく。
現在の状態から1手で訪れることが出来る状態は、freeのマスに繋がっている辺の先の値とfreeをswapすれば求めることが可能

# 提出
https://atcoder.jp/contests/abc224/submissions/63346318

# 感想
pythonだとsetにlistが入れれないため、tupleにしたが、解説の文字列にするのは思い浮かばなかった。選択肢の候補には出るようにしたい。
💵 CLINEに賭けてみた 1ドル目 👤

# 前書き
https://zenn.dev/mizchi/articles/all-in-on-cline

日本にReactを広めた第一人者、mizchi師匠がReact以来、再び魂が震えたとのことなので、そこまで言うならと思い触ってみました。

# 今回のお題
- [lit.link](https://lit.link/)のようなSNSやらWebサイトをまとめて紹介できるサービスがありますが、あれの自分用ページ。DBやバックエンドなしの静的ペライチサイトとして作る。
- 元々Vue.jsおよびtailwindの学習目的で環境構築だけして放置（コラ）していたので続きをやってもらう。

# 与えたプロンプト
過去のプロンプトの一部しか見れないので、記憶だよりに再現。

```
私（ゆうやみ）に関するポータルサイトを作りたいです。
まず最初に、全てのGit操作はこちらで行うので都度承認を求めてください。
次にファイル編集などで読み書き操作をしていいのは現在のフォルダ(Portal)のみです

- [lit.link](https://lit.link/)のようなSNSリンクまとめサービスを参考に、自分用にWebサイトやSNSリンクをまとめたペライチサイトを作ってください。DBやバックエンドなしの静的ウェブサイトでお願いします。
- TypeScriptとVue.jsの利用は必須です
- デザイン等のライブラリやフレームワークの利用は自由です。なるべくメジャーなものにしてください
- リンクしたいサイトのデータオブジェクト（URLやアイコン、説明等）から動的に画面を生成するアプローチでお願いします。
    - data.jsに作りかけのものがあるので参考にしてください。
- 既にある程度、環境構築済みで作りかけたものがあるので使えるものは使ってください。ライブラリのアップデートや追加等も自由です。
```
確かこんな感じだったかと思います。正直デザインの細かい所は漠然としていたのと、うまく言語化できず、参考元のサービスだけ紹介した形だったので、難しいかなと思ったんですが……。
これで**Auto-approve全部ON**のストロングスタイルでお願いしました。

# 成果物
![u83-portal.web.app_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307259/0ec5efb5-731d-4dc7-83d0-2ad3460d47dd.png)

**これで所要時間8分/1$。**

記事のためにこのバージョンのまま長期公開できればよかったんですけど、firebaseにホスティングしちゃって30日ごとにデプロイし直す必要があり、自動化仕込むのも面倒なのでスクショにしました。まぁアニメーションとかもないので十分分かるかと。
デザインはシンプルすぎますが、リンクは全て正しく遷移できてますし作成完了です。

# 注目点/気になった点
- lit.link等を開いて調べてる様子がなかったので「SNSリンクまとめサービス」という概念自体を知っているっぽい。まぁ海外産も多く10～20ぐらいあるのでおかしくはないか。
- **アイコンのSVGはCLINEが全部作りました。FilmarksとQiitaガッツリ捏造してて草。あとZennを知ってるのか。**
    - 普通に規約とかあるので後で確認して修正なり削除なりしておきます……
- **プロンプトにも関わらず途中1回もコミットしてくれませんでした。** 粒度の指示は出してないとはいえ……
- バージョンアップを自由にしたら中途半端にしかバージョンアップしてくれず、`vite`コマンドは通っても、`vite build`が通らなかった（`vite`コマンドで開発用画面がちゃんと表示できているところで完了と判断されたため）
- このため追加で「全ライブラリできるだけ最新のものにバージョンアップ」を依頼したのですが、2つの問題があり、思ったより時間と手間とお金（**所要時間5~6分/1$**）かかりましたw
    - tailwindcssのv3→v4移行がやや重く、ヘッドレスブラウザでtailwindcssのサイトを開いて、マイグレーションガイドを探し、読み（一部始終が動画で描写されて草）、そこからプログラム修正していた
    - Windows環境なんですけど **コンソールで勝手にコマンド打つけど出力結果が取得できない？中途半端に受け取ってる？** みたいで、バージョンアップ作業でかなり詰まって「おそらくエラーが発生しているようです」等と勝手に判断して遠回りしようとするので、こちらから補助しまくりました

# 総評
- mizchiさんみたいにプロンプトの下準備してないので、改善の余地は全然あると思います
- 今回は初歩的すぎ、ビジネスロジックないので自動テストも無しでマジで表示のためのロジックだけなんですが、vue,tailwindcssほぼ分からん俺なら下手すると1日かかりかねない（レイアウト調整でドハマりしそう）と思うので、これで8分/1$は破格だと思いました
- タスクにもよると思うんですけど、コンソールの出力を取得できないのはちょっと痛いですね……

# 後書き
全部で20ドル課金したのですが、後約18ドル残ってるのでもうちょっと高度なことをやらせてみます。

# 続編
https://qiita.com/u83unlimited/items/6eed8ad679833d6a741b

# 参考
- [ゆうやみポータル](https://u83-portal.web.app/)
- [CLINEが作成したコミット（バージョンアップ前、1回目のタスク）](https://github.com/u83ism/Portal/commit/f8c3297f5072c70ecd5d9d5077ab343f4e33e780)
【Mac】任意のアイコン付きのフォルダアイコンを生成する方法

folderifyを使用すると任意のアイコン付きのフォルダアイコンを生成できます。

https://github.com/lgarron/folderify


## インストール

以下のコマンドでインストールできます。

```terminal
brew install folderify
```

## 使い方

任意のアイコンを用意します。

![8665237_code_development_icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/36131e15-5657-44d7-83fc-c8415c98d7b5.png)

上記のファイルのパスが`~/Desktop/sample.png`で適用するフォルダのパスが`~/Desktop/example`の場合、以下のようにコマンドを実行します。

```terminal
folderify ~/Desktop/sample.png ~/Desktop/example
```

するとフォルダアイコンが以下のように変更されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/33afe516-15fb-4745-89de-4dfb6bfa9b81.png)
EMConf JP 2025 参加レポート – エンジニアリングマネージャーの仕事っておもしろい！

先日、[**EMConf JP 2025**](https://2025.emconf.jp/) に参加してきました。すごく熱量のあるカンファレンスで学びが多かったのでレポートとしてまとめます。

## **1. EMConf JP 2025 とは？**
[**EMConf JP 2025**](https://2025.emconf.jp/) は、エンジニアリングマネージャー（EM）に特化したカンファレンスです。2025年2月27日に新宿で開催され、今年のテーマは「増幅」と「触媒」でした。  

今年が初開催だったにもかかわらず、チケットは即完売。会場は熱気に包まれ、学ぶことに前向きな人たちが集まる最高の空間でした。私はEMとして働き始めて1年が経ち、これまでの経験を振り返りながら学びを深めたいと思い、EM候補の同僚と一緒に参加しました。

https://2025.emconf.jp/

## **2. 印象に残ったセッション紹介**

### [keynote] 広木さん「エンジニアリングマネージャーのロードマップ」

https://hirokidaichi.github.io/presentation/emconf.html

- マネジメントの4つのP（People, Project, Platform, Product）について紹介されました
  - 「ひとりのEMが4つのPすべてをマネジメントできるスーパーマンである必要はない」という言葉に安心しました
  - ですが、必要なものを調達できる力は必要なので、4つそれぞれについて意識していこうと思いました
- 生成AIの進化により、すべてのエンジニアがAIをメンバーに持つ未来が来る可能性が示されました
  - AIエージェントの話は最近よく耳にしますが、具体的な未来像が示され、より現実味を感じました
  - 意思決定は人間の仕事として残るため、今の学びがさらに重要になっていくと実感しました

### 熊谷さん「1行のコードから社会課題の解決へ」

https://speakerdeck.com/9ma3r/emconf2025

- 正直、理解が追いつかない部分もあり、自分の知識不足を痛感しました
  - しかし「知らないことが多いのは伸びしろ！」と前向きに捉えることにしました
  - 特に「事業価値とエンジニアリングの接続」について、自分の言葉で説明できるようになりたいと強く思いました
- 熊谷さんの体系的な資料が大変素晴らしく、繰り返し読んで理解を深めていきたいと感じました

### こにふぁーさん「サバイバルフェーズのエンジニアリングマネジメント」

https://fortee.jp/emconf-2025/proposal/d74c0603-765c-401c-b22a-75645aace27a

- こにふぁーさんのブログ「[Konifar's ZATSU](https://konifar-zatsu.hatenadiary.jp/)」を読んで「完璧なEM」という印象を持っていましたが、今回はリアルな苦労話を聞くことができ、「こにふぁーさんも人間なんだ」と安心しました
- 過去の経験や課題を赤裸々に語り、現場での試行錯誤が身近に感じられました
- 「放置しなければ前に進む」という言葉が印象的でした
  - 例えば「経営方針だからしょうがない」ではなく、EMとして何ができるのかを模索する姿勢が重要だと学びました
- 「未来を示すのがマネジメントの役割」という考えが新鮮でした
  - 1年半後を想像して話すことで、メンバーからも本気の提案が生まれるという事例を聞き、直近視点に偏らず未来を意識したマネジメントを実践したいと思いました

### [Keynote] 岩瀬さん「n=1の経験が紡ぐエンジニアリングマネジメントの可能性」

https://speakerdeck.com/iwashi86/the-possibilities-of-engineering-management-from-n-equals-1-experiences

- カンファレンス全体で紹介された書籍が多く、最後のセッションでも並んだ書影に圧倒されました
  - [スライドの26ページ](https://speakerdeck.com/iwashi86/the-possibilities-of-engineering-management-from-n-equals-1-experiences?slide=26)
- マネージャーの帽子（メンタリング・ティーチング・フィードバック・コーチング）を被り分ける重要性が語られていました
  - 知識としては知っていましたが、実践できているか振り返り、今後意識して取り組みたいです
- ポエムドリブン（思考過程の言語化）を実践したいと思いました
  - マネージャーが何を考えているのかをオープンにすることで、仕事がしやすくなる
  - 言語化の練習も兼ねて、意識的に取り組みたいと思いました
- 生成AIの進化の中で変わらないこと
  - 「学び続けること」と「変化への適応」がEMとしての重要な姿勢であると再認識しました

### 他の登壇スライド紹介

他のセッションもすべて素晴らしかったので、ぜひチェックしてみてください。（パウリさんのまとめ記事がありがたいです！）

https://pauli.hatenablog.com/entry/2025/03/01/182324

## **3. 振り返りでの気づき**

翌日、一緒に参加した同僚と振り返り会を実施しました。Keynoteを中心に、お互いに感じたことや現在のチームに当てはめて考えたことを共有し、社内での伝え方について議論しました。

また、これを機に1on1についてのフィードバックもいただきました。1on1で何でも話せるのは良いことですが、業務の細かい進捗や効率化の話がチームで共有されていないという指摘に納得しました。クローズドな場だけでなく、オープンな場でも議論できる仕組みが必要だと気づきました。今後の改善ポイントとして意識していきます。

## **4. EMの仕事っておもしろい！**

多様な業務に携われることが楽しく、人との関わりから得られる学びも魅力的です。エンジニアが快適な環境で意欲的に働けるよう支援することに、大きなやりがいを感じています。よく「EMって忙しくて大変ですよね」と言われることがあるのですが、それだけじゃなくて「挑戦しがいがあるおもしろい仕事で、少なくとも私は楽しくやってるよ」と積極的に伝えていきたいと思いました。そうやって伝えることで「増幅」と「触媒」につながると考えています。

[**EMConf JP 2025**](https://2025.emconf.jp/)は本当に素晴らしいカンファレンスでした！来年の開催は未定とのことですが、ぜひまた参加したいです。この1年で成長できるように、本を読んだり実践したりして学びを深めていこうと思います。
メモ　.lnkファイルを読みたい　悪意あり

ほぼリンク集。
仕事でもなんでも知らない`.lnk`ファイルは実行してはいけない。ただのリンクではないし、HEXエディターで確認するくらいの覚悟と準備で踏もう。

# 仕様
公式がフォーマットを提供している

https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-shllink/16cb4ca1-9339-4d0c-a68d-bf1d6cc0f943

[ABNF(Augmented BNF for Syntax Specifications)](https://www.rfc-editor.org/rfc/rfc5234.html)で記述する箇所がある
```
SHELL_LINK = SHELL_LINK_HEADER [LINKTARGET_IDLIST] [LINKINFO] 
             [STRING_DATA] *EXTRA_DATA

IDLIST = *ITEMID TERMINALID

STRING_DATA = [NAME_STRING] [RELATIVE_PATH] [WORKING_DIR]
              [COMMAND_LINE_ARGUMENTS] [ICON_LOCATION]


EXTRA_DATA = *EXTRA_DATA_BLOCK TERMINAL_BLOCK
EXTRA_DATA_BLOCK = CONSOLE_PROPS / CONSOLE_FE_PROPS / DARWIN_PROPS /
                   ENVIRONMENT_PROPS / ICON_ENVIRONMENT_PROPS /
                   KNOWN_FOLDER_PROPS / PROPERTY_STORE_PROPS /
                   SHIM_PROPS / SPECIAL_FOLDER_PROPS /
                   TRACKER_PROPS / VISTA_AND_ABOVE_IDLIST_PROPS
```

STRING_DATAのところでアイコンを偽装したりcmdやらpowershellやらを叩いてコマンドライン引数で好き勝手なことしたら危ないという話がある。
`COMMAND_LINE_ARGUMENTS: An optional structure that stores the command-line arguments that
are specified when activating the link target.`

# 脆弱性(?)
powershellとかを叩いて悪いことができる。(↓詳しい)

https://www.cybereason.co.jp/blog/threat-analysis-report/10618/

↓分析

https://unit42.paloaltonetworks.jp/unit42-pulling-back-the-curtains-on-encodedcommand-powershell-attacks/



空白を仕込んでwindowsのGUIから見えないようにするらしい( https://japanese.opswat.com/blog/shortcut-lnk-files-may-contain-malware )
アイコンもnotepad.exeとかのを参照したりして怪しくない風を装う。

それと`-NoProfile`や`-bypass`などで[実行ポリシー]()云々を回避したり、色々なところに置いた文字列をjoinやらsplitしたりで難読化して`コマンドの「有害な」部分を隠すことで、防御側に警告を与える可能性のある文字列を防止することができ`るらしい。
なんか10年以上前からこんな感じらしいしpowershellってすげー。ふざけるな。

やり方（やるな）

https://medium.com/@tommelo/pwned-by-a-shortcut-b21473970944

# リンク
## 読み込む

https://github.com/securifybv/ShellLink

https://note.dokeep.jp/post/csharp-shortcut-file-load/

## 生成（悪意あり）

https://github.com/Octoberfest7/lnk_generator

https://github.com/it-gorillaz/lnk2pwn

↓実行コード自体を埋め込もうとしてるらしい

https://github.com/d4rkiZ/EmbedExeLnk-

↓ `[char] 数字` や環境変数から文字を取ってくる等のPowerShell難読化について

https://binary-pulsar.hatenablog.jp/entry/2018/09/01/000000

↓ 1ライナーのpowershellが書かれているはずなのでオペレーターを知っとくとよさそう

https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_operators?view=powershell-7.5

# AMSIバイパス
やばいコードはAMSIが止めてくれるが、それをバイパスする方法が度々見つかっている。
（もとの.lnkでは文字数制限があるので、文字が置ける外部サイトから難読化済のAMSIバイパスコードを取ってきて実行。その後さらに悪意あるコードを外部から取ってきて実行、みたいな手段があるっぽい）

↓2022年までの争い

https://www.trendmicro.com/ja_jp/research/23/b/detecting-windows-amsi-bypass-techniques.html

↓2025年最新版

https://www.r-tec.net/r-tec-blog-bypass-amsi-in-2025.html

↓4種のやり方（検証目的以外でやるな）

https://note.com/tkusa/n/ndd6ea5960732
AWS認定バッジを並び替えるアプリをAmplify Gen2とReactで開発しました！

# はじめに
AWSの資格を取得すると認定バッチを取得できますが、
登壇時の自己紹介で、バッジを綺麗に並べたいと考えている方も多いのではないでしょうか？

こんな感じ↓
![AWS_Badge.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123043/724e85bf-af37-4d22-8c52-5e8c5f5d03e8.png)

しかし、PowerPointなどで手作業で並べようとしても、微妙に端がずれてしまい、思ったように整列できないことが多いです。(余計な時間がかかる)
なので、私はこれまで以下のサイト様で公開されているアプリを利用していました。
[AWS認定資格を取ったらAWS Badge Alignerでバッジを並べて楽しもう！](https://zenn.dev/alivelimb/articles/20220705-aws-badge-aligner)
しかし、このアプリは数年間更新されておらず、2024年以降の資格には対応していませんでした。

そこで、同様のアプリを作成し、下記に公開しました！

➡ [AWS Badge Display](https://aws-badge.gravitas580.com/)

本記事では、こちらのアプリについて紹介します！

## 開発したアプリケーションのご紹介

このアプリは **React** と **Amplify Gen2** を用いて開発しました。

➡ [GitHubリポジトリ](https://github.com/gravitas580/aws-badge-display)

### 技術選定の理由

- 以前参加したハッカソンで **React** と **Amplify** を使用した経験があったため。
- [参考にしたサイト](https://zenn.dev/alivelimb/articles/20220705-aws-badge-aligner) で、今後の展望として **Amplify** が挙げられていたため。

これらの理由から、この技術を採用して開発しました。

## 使い方

1. [credly](https://info.credly.com/) から自身の保有する資格バッジをダウンロードします。
2. 「ファイルを選択」ボタンをクリックし、ダウンロード済みの資格バッジを選択します。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123043/aa93aa86-d422-4956-b06c-76d54235ef4b.png)
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123043/a3518559-a7e9-4201-934f-20ba21c68e8d.png)
3. 選択ボックスから資格を選択し、好みの順番に並べます。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123043/3ca05e7a-7f74-4793-8edc-c1922f00614b.png)
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123043/0377a92f-c3ea-47d5-920a-7566b5e029a2.png)
4. 「バッジ画像を生成」ボタンをクリックすると、整列されたバッジ画像が生成されます！
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123043/ffab6705-4979-4ac9-91c3-32d516c1979e.png)

生成された画像をダウンロードし、ぜひ活用してみてください！
AWS完全初心者が1人でJAWS DAYSに参加した話

# 自己紹介
はじめまして！ Tsukasaと申します。
私は現在都内のSIer企業に所属しています。会社自体はインドでオフショアしているので日本にいる私が直接手を動かすことはありません。日本の顧客とインドの開発の間に入ってコミュニケーションを取るBE(Bridge Engineer)やプロジェクト管理を行うPM,PMOといった業務がメインとなります。そのためどちらかと言うと技術的なことよりも顧客折衝であったり、語学力やコミュニケーション能力が求められるようなポジションです。

## JAWS DAYSって何？
JAWS DAYSとは、AWSユーザーの集まりであるJAWS-UGが主催している全国のユーザ会の交流イベントです。
日本全国にたくさんの支部があり、AWSを普段の業務でガッツリ使っている方や、私のような完全初心者まで幅広い方々がオンライン/オフラインで学習しています。私自身もJAWS-UG Tokyoのオンライン勉強会に2025年になってから数回参加させていただいています。JAWS DAYSはその日本各地にあるJAWS-UGの団体が一同に同じ会場に集まるというオフラインイベントなのです。2025年は3月1日に東京の池袋にあるサンシャインシティで開催されました。

https://jaws-ug.jp/

https://jawsdays2025.jaws-ug.jp/

## 参加に際して
参加は事前にconnpassでチケットを購入する必要があります。
チケット代は1,500円で数に限りがあるので、なるべく早めに買った方が良いと思います。
自分はイベント開催の2週間くらい前でしたが、残り枚数は多くありませんでした。
イベント直前にはキャンセル待ちのポストがX上で流れてきたので、完売したようでした。
当日池袋駅から会場に向かっている時、サンシャイン60通りでJAWS DAYSののぼりを見つけました。
JAWSはあくまでもボランティアの方々による運営と聞いていたので、こういったのぼりが出ていることに非常に驚きました。物凄いビッグイベントにこれから参加しようとしているんだと思うと急に緊張が走りました。
![KakaoTalk_Photo_2025-03-02-21-29-48 001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/42c2802e-fcba-4ad1-a326-d6475ffcb7f6.jpeg)

会場に到着すると、受付を済まして入場する形となりますが、とにかくスポンサー企業の多さに驚きました。
今回のイベントは先述のように1,500円でしたが、そこに昼食のお弁当に軽食(スタバのコーヒーやお菓子など)、更にはイベント終了後の懇親会で提供されるアルコールや食事まで込みでした。私が言うのも烏滸がましいですが、スポンサー企業の皆様ありがとうございます!
それと同時にこれだけの多くの企業様から協賛を受けている団体なんだなと改めて実感しました。
![KakaoTalk_Photo_2025-03-02-23-20-41.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/1edea606-b482-462c-b74e-65e25d66d1f8.jpeg)



## 実際に参加してみて
結論からお話させていただくと参加して良かったと思います！
ただ、タイトルにあるように完全初心者が1人で参加するのは少々ハードルが高いかなと思います。実際に参加されればわかりますが、周りの方は複数人で参加されている方も多くいらっしゃいました。会社の同僚といらしている方や、AWSのジュニアチャンピオンの団体？の方やいろんなコミュニティに参加されている方々がいらっしゃいました。私自身は1人で参加した上に初心者であるため、技術的な話もすることができないので、中々他の方とお話することはできませんでした。それでも、Xでお世話になっている数人の方と実際にお会いさせていただくことができました。今の自分の課題や今後こういった勉強をやっていくと良いよといったAWSを熟知された方からの直接のアドバイスはありがたかったです！LTも初心者の自分にはまだ難しく、正直現時点での自分の実力や知識とは乖離があったかと思います。ですが、大切なことは、同じようにAWSを学び、志を持った「仲間」がたくさんいるということです。自分を含め業務未経験の初心者がAWSを学習するとなると1人でひたすらパソコンに向かって学習している人が多いと思います。初心者ですと当然躓くことも沢山あると思います。
**それでもオフラインで実際に会場に赴くと自分1人ではないと感じることができます。**
1人で参加してあまり他の方ともお話できませんでしたが、疎外感や場違い感はありませんでした。
今回のJAWS DAYSのテーマが「connecting the dots」ということでAWSを学習している仲間達との繋がりを自分でも感じることができました。そして何よりもモチベーションが上がり、もっと勉強してみたいという気持ちにもなりました。現に今こうして自分自身が経験したことのアウトプット用にQiitaで記事まで書いています(笑)
今これを読んでいる方の中にはJAWSって何？という方や自分と同じようにAWS初心者といった方もいらっしゃるかと思います。少しでもそのような方に今回の経験が伝わればと思います！
読んだ技術書【随時更新】

## 備忘
- 資格向けの参考書は含まず、興味を持って読んだ中で印象に残ったものを載せる


# 2021年
- ITILはじめの一歩 スッキリわかるITILの基本と業務改善のしくみ（最上千佳子、翔泳社、2019年）
→日常生活に落とし込んでITILの説明がされていて分かりやすい。初学者向け

# 2022年
- 記録なし

# 2023年
- 主夫になったプログラマーの奮闘記: ITILを適用し、家事サービスをマネジメント！ケントの実践シリーズ（Kazuyuki Hirano、Kindle、2021年）
→こちらも日常生活に落とし込んだITIL本。分かりやすい。
</br>

- SREサイトリライアビリティエンジニアリングが"ザックリ"「すっきり」分かる本: Googleが実践している新Devops方法論（GGtop.jp、Kindle、2022年）
→新鮮な内容だった。近い将来エンジニアに求められる考え方を学べる。


# 2024年
- なれる！SEシリーズ（夏海公司、Ixy、KADOKAWA、発売年は巻による）
→出版から時間が経過しているがベンチャーSIerを舞台に、ネットワークエンジニアがメインで進む話。ラブコメ要素ありお仕事感が強すぎず楽しく読めた。主人公は実在したら相当仕事できる人。
</br>


# 2025年
-
M5 CoreInk で Hello World

# 背景

毎日見ている情報を、常時表示する専用ディスプレイで確認できたら便利そうだなーと思い、そういったデバイスを作って遊びたいなーとぼんやり考えていました。
天気予報や株価などを表示すると便利かな、と。

## 調べたら M5 CoreInk が良さそう

調べてみたら、M5シリーズにCoreInkという物があるっぽい。

https://www.switch-science.com/products/6735?srsltid=AfmBOoreIggpyDix2vxoMlov7cy3FbzTfAVBlXAZYh_Ew7H7vpTnelde

- 電池内蔵なのでケーブル這わせなくて良い
- Wi-Fiで無線通信できるので、インターネットへの接続が簡単そう
- EInkディスプレイ なので、一度表示すれば電力なしで情報を表示し続けられる

Raspberry Pi Pico や Arduino だとディスプレイを別途用意する必要があり面倒。
M5Stack は電池の持ちがそこまで長くないことを考えると、CoreInk の方が使い勝手が良さそう。
ということで購入。

## 環境構築

M5シリーズは何度か触ったことがあるものの、記憶は遠い彼方に…
開発環境は主に2つあるらしい。

https://haratta-tech-lab.com/m5stack-intro-arduino-vscode/

今回は UI Flow を使ったことがないので、それを試してみることに。
ブラウザ上で動くIDEもあるらしいが、Copilot の支援を受けたいので VS Code を使いたい……。

https://docs.m5stack.com/ja/uiflow2/uiflow_web

と思って調べてみたら、VS Code 上でも開発できる様子。

https://docs.m5stack.com/ja/arduino/m5unified/intro_vscode

チュートリアルに従って、M1 Macに環境を構築していきます。
M5 CoreInk を PC に接続して書き込みすると、Hellow World と表示できました！

このとき、サンプルコードだと COUNT が 1秒に1回 カウントアップされてしまい、EInk に良くない（推奨されるインターバルは 1リフレッシュ15秒間隔）。
そこで、60秒に1回 カウントアップするように書き換えました。

次回、天気予報を表示させてみようと思います。
初心者がAWS Gamedayに参加してみた

<!--
title: 初心者がAWS Gamedayに参加してみた
tags:　AWS,初心者,JAWS DAYS,ポエム
-->

## はじめに
2025/03/01に開催されたJAWS DAYSにて、Gamedayというワークショップに参加しました。

本記事では、Gamedayに参加してみた感想について書きます。（技術の話少なめのポエムです）

## 参加時のスペック
- 新卒入社1年目
- 業務でAWSを扱っている
- AWS資格11種保持（MLA以外）

## AWS Gameday
[AWS GameDay](https://aws.amazon.com/jp/gameday/)は、架空の企業のシステム運用チームとして、
AWS環境で発生する様々なトラブルを解決しながらポイントを競うイベントです。

ほかの参加者の方の記事でも当日の様子が書かれているのでぜひご覧ください。

- GameDay at JAWS DAYS 2025に参戦！！

https://qiita.com/ec2_on_aws/items/fd2a6b0d877d64e588fe

## 結果
- チームとしては残念ながら最下位でした。（とても悔しい）
- 個人としてもチーム全体の成果の10％も貢献できていないように感じます。（めちゃくちゃ悔しい）
- チームメイトの方が優しく教えてくれたおかげで、なんとか理解しながら解き進めることができました。

## 参加して痛感した「知っている」と「使える」の違い
資格勉強を通じて、AWSの各サービスやベストプラクティスについて「知っている」つもりでした。しかし、実際には問題の解決策を見つけたり、その解決策を効果的に実装したりすることが、今の自分にはまだ難しいことが分かりました。「知っている」だけではなく、「使える」ようになるためには、より多くの**アウトプット**が必要であることを実感しました。

## 今後はもっとアウトプットします
色々なサービスを「使える」ようになるために、今後は以下のことに取り組んでいこうと思います。
- ハンズオンの機会を増やす
- ちょっとしたアプリ作る（ちょうど作りたいものがある！）
- やったことの記事を書く
- どこかイベントで登壇してみる

## おわりに
今後は、単に知識を蓄えるだけでなく、実際に手を動かしてAWSのサービスを活用する力を鍛え、次回のGamedayではより貢献できるようになりたいと思います。  
2025年6月のAWS Summit JapanでもGamedayが開催されるそうなので絶対にリベンジします！
(自分用メモ) SQLAlchemy で get, set する列を動的に指定

SQLAlchemy で get, set する列を動的に指定する方法。

# 環境

- Windows 10
- Python 3.8
- SQLAlchemy 1.4.54

    ```
    $ pip freeze
    greenlet==3.1.1
    SQLAlchemy==1.4.54
    ```

# 結論

- `getattr`, `setattr` を使い、属性名を動的に指定できる
- 属性名として、[`Column.key`](https://docs.sqlalchemy.org/en/14/core/metadata.html#sqlalchemy.schema.Column.key) を使用できる

# デモ

Chat-GPT 4o の出力を少し改変した。

```python
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker, declarative_base

# SQLite用のエンジン（実際のアプリでは適宜変更）
engine = create_engine("sqlite:///:memory:", echo=True)
SessionLocal = sessionmaker(bind=engine)

# モデル定義
Base = declarative_base()


class User(Base):
    __tablename__ = "users"

    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(50), nullable=False)
    email = Column(String(100), nullable=False)

    def __repr__(self):
        return f"<User(id={self.id}, name={self.name}, email={self.email})>"


# テーブル作成
Base.metadata.create_all(engine)

# セッション作成
session = SessionLocal()

users = [User(), User()]
users[0].id = 1
users[0].name = "Alice"
users[0].email = "alice@example.com"
users[1].id = 2
users[1].name = "Bob"
users[1].email = "bob@example.com"
session.add_all(users)
session.commit()

# 例として2つのUserを取得 (仮に存在するとする)
user_a = session.query(User).filter_by(id=1).one()
user_b = session.query(User).filter_by(id=2).one()

# User.email のカラムオブジェクト
col = User.email

# `setattr()` を使用して動的に代入
setattr(user_a, col.key, getattr(user_b, col.key))

# 変更をコミット
session.commit()

# 結果確認
updated_user_a = session.query(User).filter_by(name="Alice").one()
print(updated_user_a)  # email が "bob@example.com" に変更されているはず
```

## デモ出力のプロンプト

> sqlalchemy1.4のmodelクラスを1つ例示してください。

> `session.query()` を使用して、User のインスタンスを2つ (user_a, user_b とする) 取得したとします。ここで、user_bのメールアドレスをuser_aにコピーしたければ、通常は `user_a.email = user_b.email` のように email 属性を使用するとすると思います。ですが `col = User.email` を使用して `user_a[col] = user_b[col]` のようにしたいです。できますか。

> 作ってもらった例をデモとして動かしたいので、テーブルを作成するコードも追加してもらえますか。

※レコードを作成するコードは、最後の質問をする前に自分で作っていたので依頼しなかった。
sequence

```
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>test.log</title>
    <script type="module">
        import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.esm.min.mjs';
        mermaid.initialize({ startOnLoad: true });
    </script>
</head>
<body>
    <div class="mermaid">
        sequenceDiagram
            participant T1 as XXX制御
            participant S1 as shm_req
            participant S2 as shm_res
            autonumber
            T1->>S1: 111.111: A=0,B=1,C=0
            Note right of T1: counter = 0<br>aaa = 0<br>ccc=0
            S2->>T1: 111.222: value = 0
    </div>
</body>
</html>
```
三分でわかるC#プログラミングの特徴

C#を触り始めてそろそろ7年くらい経ちますが、これほど滋味に溢れる言語はないでしょう。
今回はC#自体ではなくC#でプログラミングしたときの特徴を解説します。

# 短く書ける
以下の例では9行が1行になっています。
わざわざ関数に切り分ける必要性もなくなりますね。
コード処理の見通しがつきやすく、リファクタリングもしやすいです。
これに限らず、「誰もがよく使う処理は短く書けるようにしよう」という風潮が感じられて快適です。
でもその方法がいっぱいあって果てしないんですけどね……
```csharp
public class Hoge
{
    public List<int> Fuga { get; set; }
}

// 他の言語でよくやるやりかた
public static int CalculatePiyoSumUsingForeach(List<Hoge> list)
{
    int sum = 0;
    foreach (var hoge in list)
    {
        foreach (var x in hoge.Fuga)
        {
            sum += x;
        }
    }
    return sum;
}

// LINQがあるとき
public static int CalculateSumUsingLINQ(List<Hoge> list)
{
    return list.SelectMany(hoge => hoge.Fuga).Sum();
}
```

# 込み入ったことをしようとすると知識が必要
メモリ管理はGCがやっていることもあり基本的には気軽に扱えますが、最適化をするにはSpanを使ったり、await込みの排他処理をするのにSemaphoreSlimを使ったりと、クラスの知識が必要になります。
まあでも一から十までメモリのことを考えさせられる言語でプログラムを書くよりは、一回調べて出来合いのプログラムを調べて使うほうが楽じゃないですか？

# 隙がない
後方互換性が強く、静的型付けであり、ソースジェネレータもあり、属性による高凝集も実現できて、例外によるプログラミングも可能……
他の言語で大規模に運用する場合などにどこかで不満が出てくるものですが、C#においてはこういった不満を感じることがまあないです。
悪くいえば、速度に優れたわけでもなければ初心者がpython以上に始めやすいわけでもないし、リテラルをとるような型を使えるわけでもないですが、一番を突き詰めないことでハイスタンダードにまとまっています。

# その他
Unityで使われることもあり、かなり検索して出てくる記事が充実しています。
Godotでも使えます、嬉しい。
.NET系のやつとの連携が強く、結構やろうと思えばなんでもできます。

# いかがでし
Bluetoothアーキテクチャの理解：ホストとコントローラの違いと構成

本記事では、個人のCore資料の理解と忘備録を兼ねて、Core資料に沿ってこれらの役割や通信の流れについて整理していきたいと思います。
(解釈が誤っている部分があれば指摘いただけると嬉しいです！)

## Bluetoothの2つのシステム
Bluetoothには、Classic(BR/EDR)とLow Energy（LE）の2つの通信方式があります。それぞれ使用するアプリケーションやユースケースによって、適切なBluetoothシステムは異なります。Classic(BR/EDR)は音声や高データレート通信向けで、LEは低消費電力が求められるIoTやセンサーデバイス向けとして棲み分けされてきた印象にあります。
しかし、近年の Bluetooth 5.2以降 では、LE向けに LE Audio などの音声通信規格が追加され、またBLEでより高いデータレートに対応できる仕様も増えています。これにより、今後はBLEが主流になっていくのではないかと個人的に考えています。

#### 両方のシステムをサポートするデバイス
BR/EDRとLEの両方に対応するデバイスは、どちらの方式のデバイスとも通信可能です。ただし、一部のプロファイルやユースケースは、どちらか一方のシステムでしか利用できません。そのため、両方のシステムを実装することで、最も多くのユースケースをカバーできます。

## Bluetoothのコアシステム：ホストとコントローラ

Bluetoothのコアシステムは、下記の図のようにホスト（Host)と コントローラ（Controller)の2つから構成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4024363/5be91fa0-2f06-4148-9335-e5fad4b7f346.png)


Bluetooth BR/EDRの最小実装には、Bluetooth仕様で定義されているLink Layer（LL）、PHY（物理層）、L2CAPと関連するプロトコルに加えて、共通のサービス層プロトコルである サービス・ディスカバリ・プロトコル（SDP） が含まれます。また、全体的なプロファイル要件は Generic Access Profile（GAP） で規定されています。

一方、Bluetooth LEのみの最小実装には、Bluetooth仕様で定義されているLink Layer（LL）、PHY（物理層）とL2CAPと関連するプロトコルに加え、共通のサービス層プロトコルとして セキュリティマネージャー（SM） と アトリビュートプロトコル（ATT） が含まれます。さらに、全体的なプロファイル要件は Generic Attribute Profile（GATT） および Generic Access Profile（GAP） で規定されています。
(※それぞれのプロトコルの役割については別記事でまとめていこうかと考えています。)

Bluetooth BR/EDRとLEの両方をサポートする実装では、上記の両方の最小実装が含まれます。

完全なBluetoothアプリケーションには、Bluetooth仕様で定義されている追加のサービスや上位層プロトコルが必要になりますが、ここでは説明を省略しています。コアシステムのアーキテクチャはSIGのCore資料より抜粋した下記の図に示されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4024363/23ab61f0-b043-4afa-b789-79dbd71dd9f6.png)


### ホスト（Host）

ホストは、Bluetoothのプロトコルスタックの上位層を担当し、アプリケーションとBLE通信を制御します。

- HCI（Host Controller Interface)より上の層を指す
- ATT、GATT、GAP、L2CAP、SMP などのプロトコルを含む
- デバイスの管理や通信プロセスの制御を担当する

### コントローラ（Controller）

コントローラは、Bluetoothの物理通信を担当し、データの送受信を処理します。

- HCIより下の層を指す
- Link Layer（LL）、PHY（物理層）を含む
- 実際の無線通信を担当

---

## 参考資料
https://www.bluetooth.com/ja-jp/specifications/specs/core60-html/
【体験談】JAWS DAYSボランティアスタッフを経験してみて感じたこと

いつも記事を読んでいただきありがとうございます！
モブエンジニア（[@mob-engineer](https://qiita.com/mob_engineer))です！

今回は2025.03.01に参加したJAWS DAYSにボランティアスタッフ（撮影担当）として参加しましたので、その時の経験を形に残す目的で記事として執筆しました。

なるべく、平易な表現で執筆しますので、お気軽に読んでいただければ幸いです。

# 目次
- ボランティアスタッフに参加したきっかけ
- JAWS DAYS前の準備
- JAWS DAYSでの対応
    - Keep：よかったこと
    - Problem：改善すべきこと
    - Try：今後チャレンジすること
- まとめ

## ボランティアスタッフに参加したきっかけ

もともとJAWS-UG関連のイベントには精力的に参加していたため、JAWS DAYSでも何かしらの貢献活動は行っていきたいと思っていました。

そのうえで、ボランティアスタッフの募集がありましたので、**とりあえずやってみよう**の精神でチャレンジしてみたのがきっかけです。

## JAWS DAYS前の準備

2月ごろにボランティアスタッフの役割が発表され、**撮影担当**に任命されました。
そのうえで、**カメラ持っていないから購入しないと**と**イベント前までにある程度カメラ操作に慣れておかないと**と思い、急いでカメラを購入しました。

とりあえず、家電量販店で初心者向きと勧められたカメラを購入しました

https://www.sony.jp/ichigan/products/ZV-E10/?srsltid=AfmBOoqe4cfdVDXJLu1G8iV7UY1csmEmMfzaCxLaekD_iCqenEoXW9BV

そのうえで、時間があるときにカメラ操作をスムーズにできるように撮影活動も行いました。

## JAWS DAYSでの対応

JAWS DAYS内で撮影担当として一応は活動できたと思います。
そのうえで、今回の経験を簡単に振り返ってみたいと思います。

### Keep：よかったこと

- 被写体（登壇者、スタッフ、来場者）をきれいに映すという意識を持てたこと
- イベントでの撮影担当を通じて、撮影担当としての活動に自信を持てたこと
- 純粋に写真撮影に対して興味・関心を持つことができたこと

### Problem：改善すべきこと

- 事前準備（特に予備バッテリーの充電）が不足していたこと
    - 結果として一部撮影できなかったタイミングがあったため
- 撮影に集中しすぎて、登壇内容をあまりキャッチできなかったこと
- 撮影技術に関してもう少し向上させる必要があると思った
    - ここに関しては訓練あるのみかなぁと思いました
- 基本動き回っていたため、後半は少し疲れてしまったこと
    - 体力は本当に大切だなぁと思いました

### Try：今後チャレンジすること

- 事前準備をきちんと行い、カメラ撮影を滞りなく行えるようにする
- 撮影スキルを向上させ、より鮮明な写真撮影を行っていく
- 体力づくりを行っていく（とりあえず1日中歩き回っても疲れないレベル）
- 10月のJAWS FESTAでも（出来れば）撮影担当として活動していく

## まとめ

今回撮影した内容の厳選作業が残っているため、そのあたりを行いつつ、今後もJAWS-UG内のイベントでも撮影する機会があったら積極的に撮影活動を行っていきたいと思います。（個人的に写真撮影が面白かったため、生涯の趣味にしたいと思いました）

登壇内容に関してはアーカイブ配信される予定らしいので、そちらをチェックしながらまとめ記事を書いていこうかなぁと思いました。

最後まで、記事を読んでいただきありがとうございました！！
入門書を二冊やってみること

### 　javaの入門書である「やさしいJava」と「すっきり分かるJava入門編」を二冊やり終えた感想を言います。
　Qiitaの記事で入門書は二冊やってみるのが良いという記事を見て実際にやってみました。
 　やさしいJavaを二周して、PaizaなどでJavaの問題を解いていた中で、理解が曖昧な部分が多くあり、すっきり分かるJavaをやってみました。
  ### 感想は、とてもやってよかったと思っています。
 ##### ※ 私はまだ実務経験がないので、独学の人の意見として聞いてください。
  　一冊目の内容では書いていないことを学ぶことができる点や、共通の内容でも、二冊目を通してでしか発見できなかった知識の曖昧さが分かる点がメリットでした。（参照型の変数がどういう仕組みなのかを自分は学びました。）
   よく結局実務が一番成長するという話があります。ということは、入社する前の段階では、より基礎を固めて実務の内容をより吸収できることが理想だと思うので時間に余裕のある人はやってみるといいかもです！！
【Laravel】大量データを10倍速でCRUD処理する方法

数万件、数十万件のデータを処理する場合、単純な繰り返し処理で１件毎にデータを処理すると、終了までに数時間以上かかってしまうことも珍しくありません。
こういった処理は少し方法を変えるだけで10倍以上の高速化ができる場合があるので、その方法を処理内容別に記載していきます。

## データの作成（Create）

**insertを使う**
`insert()`メソッドを使うことで、大量のレコードを一括で高速に挿入することができます。

```php
$data = [];
for ($i = 0; $i < 1000; $i++) {
    $data[] = ['name' => 'user_name'.$i, 'email' => 'user'.$i.'@example.com'];
}
DB::table('users')->insert($data);
```
※1000件程度であれば上記コードのように一括でinsertを行っても問題無いケースが多いですが、10万件等の大量のデータの場合はメモリ不足等が発生する可能性が有ります。その場合は以下のように分割してinsertを行います。

```php
$data = [];
for ($i = 0; $i < 100000; $i++) {
    $data[] = ['name' => 'user_name' . $i, 'email' => 'user' . $i . '@example.com'];
}

// 1000件ずつに分割してinsert
foreach (array_chunk($data, 1000) as $chunk) {
    DB::table('users')->insert($chunk);
}
```
※上記のように一括作成を行った場合、Observerでモデルのイベント（created等）を設定していても発火しません。イベントの実行が必要な場合はcreateメソッド等で１件ずつ作成する必要が有ります。


## 読み取り（Read）

**chunkを使う**
上述の「データの作成」にも書きましたが、大量のデータを一度にメモリに読み込むとメモリ不足が発生して処理が遅くなることがあります。その場合は`chunk()`メソッドを使ってデータを分割して処理することで高速化できます。

```php
User::where('status', 'active')->chunk(1000, function ($users) {
    foreach ($users as $user) {
        // ユーザーごとに処理
        echo $user->name;
    }
});
```
※chunkメソッドは大量データを分割して取り出すのに便利ですが、処理中にテーブルのデータが変化する可能性がある場合、同じデータが複数回読み込まれる／一部のデータが読み込まれない といった問題が起こり得ます。
そのような状況を避けたい場合は、主キーの順序を考慮してchunkメソッドの代わりにchunkByIdメソッドを使う、あるいは処理前後でテーブル更新を止めておくなどの対応が必要です。


## 更新（Update）

**モデル取得前に一括更新**
モデルを取得してから更新→保存するのではなく、取得前の段階で`update()`メソッドを使えば、特定の条件に合致するレコードを一括で高速に更新することができます。

```php
User::where('status', 'active')->update(['status' => 'inactive']);
```
※上記のように一括更新を行った場合、Observerでモデルのイベント（updated等）を設定していても発火しません。イベントの実行が必要な場合はモデルの取得後に更新処理を行う必要があります。

## 削除（Delete）

**モデル取得前に一括削除**
上述の「更新」と同様に、モデル取得前の段階で`delete()`メソッドを使えば一括で高速に削除することができます。
```php
User::where('created_at', '<', now()->subYear())->delete();
```
※こちらも同様で、上記のように一括削除を行った場合はObserverのイベント（deleted等）が発火しません。イベントの実行が必要な場合はモデル取得後に削除処理を行う必要があります。

---

本記事は以上となります。何かおかしな部分や間違った記述などありましたら教えて頂けると嬉しいです！
AIで作ったTOIECの文章から、生成AIで画像を生成するテスト走行

## AIで作ったTOIECの文章から、生成AIで画像を生成する
英単語帳アプリを作る中で一番大事になる部分、画像の生成をコーディングして実際に動かしてみました。

https://qiita.com/druss1231/items/0e304e37767a4f442d06

## 環境
開発環境：Google Colab
言語：Python
Dockerを使おうとしてみたり、WSL上にPython環境を作ったりしましたが、結局一番楽そうだったので、Google Colabにしました。

## 完成品
最終的に動かしたコード全行です。

```python
from google.colab import userdata
import google.generativeai as genai
import torch
from diffusers import StableDiffusionPipeline

# GEMINIにTOEICっぽい文章を作ってもらう
# 自分が登録したGEMINI_API_KEYを変数に格納
GEMINI_API_KEY = userdata.get("GEMINI_API_KEY")
genai.configure(api_key=GEMINI_API_KEY)
# モデルの選択
model = genai.GenerativeModel("gemini-1.5-flash")
# 生成AIに投げる質問
question = "attendという単語を使ってTOEICに出てきそうな１文を作って。その１文だけ出力して。"
# 回答を変数に格納
response = model.generate_content(question)
# 回答を出力
print(response.text)

# GEMINIから返ってきた回答を基に画像を生成
# 生成したい画像の内容をテキストで指定
input_text = "attend"
# Stable Diffusionのパイプラインを設定
pipeline = StableDiffusionPipeline.from_pretrained(
    "CompVis/stable-diffusion-v1-4", revision="fp16"
).to("cuda")
# 画像生成の実行
generated_image = pipeline(str(response), guidance_scale=7.5).images[0]
# 画像の保存
generated_image.save(f"{input_text}.png")
```

## 解説
流れとしては大きく分けて以下です。
①GEMINI（生成AI）に特定の単語からTOEICっぽい文章を作ってもらう。
②Stable Diffusion（画像生成AI）を使って、①の回答から画像を生成する。

### ①GEMINI（生成AI）に特定の単語からTOEICっぽい文章を作ってもらう。
GEMINIというGoogle先生がだしている生成AIをAPIとして利用し、英単語からTOEICっぽい文章を作ってもらいます。
APIとして利用する方法は以下の記事にわかりやすくまとまっていました。同じ会社だけあって親和性がありますね。

https://qiita.com/zukki2/items/10bfeb1c4330aa18ff87

今回はattend（出席する）を対象としています。今回はテスト走行なのでベタ打ちしていますが、実際の運用ではattendの部分を変数にしてCSVファイルから単語を抜き出してループさせる予定です。

```python
# 生成AIに投げる質問
question = "attendという単語を使ってTOEICに出てきそうな１文を作って。その１文だけ出力して。"
```

「attendという単語を使ってTOEICに出てきそうな１文を作って。」だけで終わらせると「もちろんです！」とか、「TOEICに出てきそうな文を考えました。」とか画像生成AIに読ませるには不要な単語が混じるため、「その１文だけ出力して。」を追加しています。

### ②Stable Diffusion（画像生成AI）を使って、①の回答から画像を生成する。
実装の仕方は下記の記事に詳しく書いてありました。

https://gomafree-tech.com/?p=3527

上記の記事の通りに実装し、後はStable Diffusionに入力する文字列を①で生成した文章が入っている変数を文字列に変換したもの **str(response)** に変えただけです。
```python
generated_image = pipeline(str(response), guidance_scale=7.5).images[0]
```

## 結果
### コンソール
コンソールに出力した文章です。print(response.text)でGEMINIから返ってきたTOEICっぽい文章を確認用に出力している部分ですね。
そのほかにも画像を生成している際になんやかんやをあーだこーだしている（多分ロードとか）の文章とか出力されていますが、割愛します。
```
Please attend the mandatory safety training before operating the machinery.
```
適当翻訳：機械を動かす前に受講必須の安全講習に**出席して**くださいね。

オタクトーク：めっちゃTOEICっぽい！mandatory（必須の）とかもTOEIC頻出単語ですし、会社からの命令っぽいのもビジネス英語のテストという意味でめちゃくちゃTOEICらしいですね。リスニングか長文のメールを読む問題（大問6とか）の中で、採用後の動きとかを説明する感じで出てきて、mandatoryの意味が分からないと解けないぞ！みたいな問題に使われそう…！

### 画像
もたもたしていたところでGPUの使用制限が来たせいなのか、画像が保存できませんでした。。。（いちばんみせたいところなのに）
結果としては画像を見てattendだとは全く想像できない感じの画像になってしまいました。言葉だけで説明するなら、GEMINIが出力してくれた文章が書いてありそうな声明文みたいな感じになっていました。当然文字は読めるものではありません。

## 改善点
今回のテスト走行で下記の課題が見つかりました。

### 環境について
GPUの使用制限とかあるので、課金するかColabをやめるかのどっちかしかないですね。なるべくお金はかけたくないですが、私のGPUで果たして画像生成ができるのかどうか…

### 生成した画像について
画像生成に必要な呪文に対する知識が全くなく、具体的な文章打ち込めば行けるっしょとか甘い期待を抱いていましたが、粉々に粉砕されました。呪文に使えそうな単語を何とか生成するなりなんなりしないと無理そうですね…。A man whoから始まる文章とかにしたら少なくとも人物は登場するのでいい感じの画像になったりするかな…？

## 終わりに
大枠で一応成功はしましたが、生成した画像が想像以上にあれだったので挫折しそうですが、いろいろと試行錯誤してみます。今後はCSVファイルから単語読み込んだりするのにGitを使いたいので、今あるソースもすべてGitにあげていこうかと思います。
Flutterアプリにおける環境ごとの設定管理方法

Flutteアプリ開発において、環境ごとの設定（APIサーバのURLなど）をソースコードのどこに記述するべきかを再検討した。

以前、[Flutterアプリにおける環境ごとの設定管理方法に関する考察](https://qiita.com/pikanji/items/963cd8e9bd84802123dc)を書いた際は、「ビルドターゲットと.envのどちらでも良い」という結論だったが、.envで運用していて「ビルドターゲットの方が.envよりも良い」という事がわかったので改めてまとめた。

# 環境ごとのビルド設定要件
* 異なる環境のバイナリはそれぞれ別アプリとしたい
* 他のビルド設定が結果のバイナリに含まれない
* １箇所の切り替えだけですべて切り替わる

# 利用可能な手段
* Flavor: 使い方次第ではあるが、特にapplication IDなど、ビルド時に決定するプラットフォーム固有の設定のバリエーションを実現するのに向いている。DartコードからFlavorを参照して設定を切り替えることもできるが、実行時に環境別の切り替えをするのは避けたい。
* ビルドタイプ：ビルド方法を制御する。Flavorと似ているが、Flavorが機能や設定を切り替えるのに対し、ビルドタイプは署名方法や難読化などを切り替える。よくあるreleaseとdebugがイメージしやすい。
* ビルドターゲット: エントリーポイントとなるdartファイルを指定する。例えば、設定値だけが異なるmain_{variant}.dart (main_dev.dartやmain_prod.dartなど) を用意することで、このファイルを指定するだけで設定値を変えたアプリがビルドできる。環境ごとに異なるがプラットフォームで共通な設定は、Flavorよりもこちらで切り替えたほうが効率が良い。
* .env: `--dart-define-from-file`で.envファイルを指定する方法。ビルドターゲットとほぼ同じことができ、Flutter公式ではないがわかりやすい。

# 結論
「flavor + ビルドターゲット」の方法がベスト。
flavorとビルドターゲットの組み合わせを指定したビルド設定（コマンドオプション設定）をAndroidStuidoおよびVSCodeのビルド設定として作成してソースツリーにコミットしておく。

# 詳細説明
## 異なる環境のバイナリはそれぞれ別アプリとしたい
### 目的
* 同一デバイスに異なる環境のアプリを同時に入れておきたい（わざわざ削除して再インストールとか非効率なので回避したい）
* デバイス上でもデータが混ざらないようにしたい

### 方法
それぞれに異なるアプリIDを設定することで実現できる。
異なるアプリIDの設定はflavorで実現する。
しかし、flavorで静的に切り替えるものは、プラットフォームごとに記述する必要があり、また記述方法も異なるため、アプリIDなどの最小限のものに留めたい。
なので、flavor以外にもプラットフォーム共通で切り替えたい設定は.envまたはビルドターゲットで実現する。

## 他のビルド設定が結果のバイナリに含まれない
### 目的
* リバースエンジニアリングされても、他の環境の情報は漏洩しない
* 実装・ビルドミスで、誤って異なる情報が使われてしまう可能性を大きく減らせる

### 方法
ビルドターゲットまたは`--dart-define-from-file`で指定する.envや.jsonファイルで実現可能。

[flutter_dotenv](https://pub.dev/packages/flutter_dotenv)等を使用する方法もあるが、こちらはpubspec.ymlに各.envをassetとして登録する必要があり、異なる環境のビルドを作成するたびに手動または自作スクリプトで切り替えるか、環境ごとの.envファイルを作成してプログラム内で動的に使い分ける必要がある。git管理をしているpubspec.ymlを一時的に書き換えるのは一時的なはずの変更を誤ってコミットするなどの事故になりかねないので回避したい。

## １箇所の切り替えだけですべて切り替わる
### 目的
* 間違っても異なる環境の設定が混ざらないよう、常に設定の一貫性が保たれるようにしたい。

### 方法
残念ながら、flavorとビルドターゲットを併用すると、ビルドコマンドでそれぞれを個別にパラメータで指定する必要がある。言い換えると、指定を誤れば、意図しないflavorとビルドターゲットの組み合わせでビルドできてしまう。
これを回避するには、AndroidStudoやVS Codeのビルド設定で事前にビルドコマンドのパラメータを登録しておくと良い。これらのビルド設定は、ソースツリーに含めることができるはず。
例
```
flutter run --flavor dev --target lib/main_dev.dart
flutter run --flavor prod --target lib/main_prod.dart
```

## ビルドターゲット vs .env
.envは人気というか濫用されがちだが、ビルドターゲットの方が良い。
両者とも、任意のファイル名で保存して、ビルドオプションで指定するという点では同じだ。
.envの方が手軽でとっつきやすいが、ビルドターゲットの方がメリットがかなり多く、設定項目が増えたりコードの複雑さが増すほどビルドターゲットでのやり方の方が効率が良い。

実際に.envを使用していたFlutterアプリのプロジェクトでは、設定漏れが発生したり、設定漏れ防止のバリデーション実装が必要だったり、使う時に型を考えたりと、結果的に非効率的であることがわかった。

使い方の説明は[以前の記事](https://qiita.com/pikanji/items/963cd8e9bd84802123dc#%E3%81%9D%E3%82%8C%E3%81%9E%E3%82%8C%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9)に書いている。

### ビルドターゲット
メリット
* 定義だけで型を特定できる
* 必須/任意を型で指定できる
* 必須項目が足りていないとビルドで検知でき、設定漏れミスを防げる
* 公式で言及されている安心感

デメリット
* .dartファイルなので設定があるファイルが見つけにくい
* ロジックと同じファイルで分かりづらい
* 設定がロジックと混ざってカオスになりかねない

### .env
メリット
* 設定がロジックから切り離されている、.dartファイルではないのでわかりやすい。

デメリット
* 非公式。3.7.0以降`--dart-define-from-file`オプションで指定できる様になったが、ドキュメントには書かれていない。また、3.16.0まではbuild.gradleなどから参照できたが現在はできなくしてあるなど、挙動が不明確。
* 設定項目が足りていなくても気づきにくい。
* .envにクレデンシャルを書けば安全とか、コミットすべきではない、という勘違いをする人がいる。[詳しくはこちら](https://qiita.com/pikanji/items/6c5854679ae0fce5d558)。
Contact Form7で送信ボタンをカスタムする方法

Contact Form7では下記のコードを配置している。
```
[acceptance check-box] すべての項目に同意します。 [/acceptance]
[submit class:btn-pink "送信"]
```

修正前のボタンの状態はこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950670/eb70c16d-de48-4314-8287-391825240e08.png)


1\. Contact Form7でデフォルトで設定されているスタイルを無効化する
```CSS
/*デフォルトのスタイルを無効化する*/
input[type="submit"] {
  appearance: none;
  -webkit-appearance: none;
  -moz-appearance: none;
}
```

2\. Contact Form7がデフォルトで出力する｢spinner｣も非表示にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950670/1bc4d3bf-c7bd-4baf-bfc9-aa294b6ee0d5.png)

```CSS
/* Contact Form7がデフォルトで出力する｢spinner｣を非表示 */
span.wpcf7-spinner {
  display: none;
}
```

これらのデフォルトのスタイルを非表示にしておくと、カスタムしやすくなります。

3\. 送信ボタンのCSSを適応する
```CSS
input[type="submit"] {
  font-size: 18px;
  height: 58px;
  width: 291px;
  /* 角を丸くする */
  border-radius: 3px;
  /* テキストを1行に収め、改行しない */
  white-space: nowrap;
  font-weight: bold;
  /* 0.3秒かけて変化 */
  transition: color 0.3s ease, background 0.3s ease, border 0.3s ease;
}
```

下記のようにボタンの大きさや形を変更できました!!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950670/375a3925-9e94-47d9-9d3f-936f048c5cc8.png)
くちあだきみあむはしきぎ

おい！タイトルバグってんぞ！　と思われた皆様。安心してください。バグっておりません。

電気回路を嗜んだ方なら、何かあったときについ口ずさんでしまう復活の呪文（まぁ色んな意味で記憶を呼び起こす呪文なので嘘は言っていない）...　じゃなくて、カラーコードの覚え方について簡単に書いておこうと思います。
最近回路修理していたときにqiitaで探してみたところ発見できなかったため、ニーズがあるかどうかはわからないものの一応書いておこう。。

後述するカラーコード表の色略称（色の読み方の１文字目）を上から順に読むことでタイトルの「くちあだきみあむはしきぎ」という呪文になるわけです。

# カラーコード表
 | 色略称 | 色 | 第一バンド | 第二バンド | 第三バンド | 乗数 | 抵抗値許容差 | その他 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| く | 黒 | 0 | 0 | 0 | 1(=10^0) | - |   |
| ち | 茶 | 1 | 1 | 1 | 10^1  | ±1% |   |
| あ | 赤 | 2 | 2 | 2 | 10^2  | ±2% |   |
| だ | 橙 | 3 | 3 | 3 | 10^3  | ±0.05% | ※ |
| き | 黄 | 4 | 4 | 4 | 10^4  | ±0.02% |   |
| み | 緑 | 5 | 5 | 5 | 10^5  | ±0.5% |   |
| あ | 青 | 6 | 6 | 6 | 10^6  | ±0.25% |   |
| む | 紫 | 7 | 7 | 7 | 10^7  | ±0.1% |   |
| は | 灰 | 8 | 8 | 8 | 10^8  | ±0.01% |   |
| し | 白 | 9 | 9 | 9 | 10^9  | - |   |
| き | 金 | - | - | - | 0.1   | ±5% |   |
| ぎ | 銀 | - | - | - | 0.01  | ±10% |   |

※「橙色」＝「とうしょく」から「と」と略されるケースもある。「だいだいいろ」と読むケースもあり「だ」と略されることが多め。

# 利用方法・利用例
抵抗に記載されている線の本数によって利用方法にバリエーションがあります。　と書いたものの、3線表示・4線表示・5線表示・6線表示がありますが、よく見かけるものは4線表示と5線表示ですので、この２つを例としてピックアップします。
## 4線表示
左から、第一バンド、第二バンド、乗数、抵抗値許容差を当てはめていくことで抵抗値を計算できます。

茶黒橙金の場合、
10×10^3±5%　→　10kΩの抵抗誤差±5%の抵抗

## 5線表示
左から、第一バンド、第二バンド、第三バンド、乗数、抵抗値許容差を当てはめていくことで抵抗値を計算できます。

茶黒黒橙茶の場合、
100×10^3±1%　→　100kΩの抵抗誤差±1%の抵抗

# おわりに

一度覚えてしまうと忘れないものの、覚えるまでは「こんなの覚えられるか」と思っていた自分を思い出しました。
復活の呪文は意味不明な文字になりがちですからね。
ドラクエのぺぺぺぺ...とか。
Contact Form7で送信前に同意チェックボックスを設置する

# チェックボックスの設置
1\. acceptanceを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950670/5dc71481-a270-4d2b-ae6b-165fb5539d8f.png)

2\. 設定したい項目を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950670/4c80e8e5-a68e-4201-851e-2b22af303db2.png)

:::note warn
「This checkbox is optional.」のチェックボックスのチェックは外しておくこと!!
チェックをつけていると任意選択になるので、チェックされてなくても送信ボタンが押せてしまいます
:::

## 送信ボタンの設置
1\. submitを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950670/3adeb921-8885-46d9-ab4e-5a4f31f3fba4.png)

2\. 設定したい項目を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950670/ee818411-2001-47d7-8c36-39f0e966f833.png)

## 送信前に同意チェックボックスの設置完了!!
上記の設定をすることで、
同意チェックボックスにチェックされたら送信ボタンが押せるようになります!!
ぜひ試してみてください。