OmniAICreator/Qiita-1.07M huggingface dataset:
【備忘録】CakePHPのよく使うコマンド

# はじめに

こんにちは、エンジニアのkeitaMaxです。

CakePHPのよく使うコマンドを備忘録として残していきます。

# マイグレーション

### マイグレーションファイルを作成

```
bin/cake bake migration CreateArticles created modified
```

### マイグレーションファイルを実行

```
bin/cake migrations migrate
```

### マイグレーションファイルのロールバック

```
bin/cake migrations rollback
```

# コントローラ

### コントローラの作成

```
bin/cake bake controller articles
```

# モデル

### モデルの作成

```
bin/cake bake model articles
```

# テスト

## PHPUnit

### 全部実行する
```
vendor/bin/phpunit
```

### 特定のファイルだけ実行する
`tests/TestCase/Controller/ArticlesControllerTest.php`ファイルだけ実行したい場合
```
vendor/bin/phpunit tests/TestCase/Controller/ArticlesControllerTest.php 
```

### 特定のファイルの一つの関数だけ実行する
`tests/TestCase/Controller/ArticlesControllerTest.php`ファイルの`testIndex`だけ実行したい場合
```
vendor/bin/phpunit tests/TestCase/Controller/ArticlesControllerTest.php --filter testIndex
```

## CodeSniffer

### 実行

```
composer cs-check
```

### 自動修正

```
composer cs-fix
```


## PHPStan

### 実行
```
composer stan
```

# おわりに

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！
Javaで「文字列を数値に変換する」の動作を確認してみた

# 概要

Javaで「文字列を数値に変換する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/string/index12.html

# 実装

以下のファイルを作成しました。
```JSample12_1.java
class JSample12_1{
  public static void main(String[] args){
    String si = "42";
    String sd = "2.84";
    String sb = "false";

    int i = Integer.parseInt(si);
    double d = Double.parseDouble(sd);
    boolean b = Boolean.parseBoolean(sb);

    System.out.println(i);
    System.out.println(d);
    System.out.println(b);
  }
}
```

```JSample12_2.java
class JSample12_2{
  public static void main(String[] args){
    String si = "42";
    String sd = "2.84";
    String sb = "false";

    int i = Integer.valueOf(si).intValue();
    double d = Double.valueOf(sd).doubleValue();
    boolean b = Boolean.valueOf(sb).booleanValue();

    System.out.println(i);
    System.out.println(d);
    System.out.println(b);
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample12_1.java 
$ java JSample12_1 
42
2.84
false
```

```
$ javac JSample12_2.java 
$ java JSample12_2 
42
2.84
false
```

# まとめ

何かの役に立てばと。
.gitkeep で空のディレクトリを Git 管理する

# はじめに
この記事では、空のディレクトリを Git 管理する方法について記載します。

# 背景
開発の初期段階などでは、ファイルの作成は後にしてディレクトリだけ先に作成したいということが発生し得ます。
ただ、Git の管理対象はファイルです。そのため、以下のように空のディレクトリを作成しただけでは、管理対象にはなりません。

```powershell
mkdir src
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/8c406bff-93f5-2b6f-fdfd-cef59952e09c.png)


# .gitkeep で空のディレクトリを Git 管理する
空のディレクトリに `.gitkeep` ファイルを追加すると、Git 管理できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/fca42ceb-1b7f-9982-2e35-ad2573a8217e.png)
【論文毎日読んでみる1】Transformerが発表された論文 "Attention is All You Need" (Vaswani et al., 2017)

# 読んだ論文
本記事は以下の論文を読んだ際に記録した要約とメモです。
[Vaswani, Ashish, et al. "Attention is all you need." Advances in neural information processing systems 30 (2017).](https://proceedings.neurips.cc/paper/2017/file/3f5ee243547dee91fbd053c1c4a845aa-Paper.pdf)

この論文は、Transformerアーキテクチャの基礎を築いたもので、現在の多くのLLMの基盤となっています。
特に、注意機構がどのようにデータを処理し、関連性を見出すかについての理解が経済学におけるデータ分析にも応用可能です。

# 要約とメモ
## 1. introduction
リカレントニューラルネットワーク（RNN）は、シーケンスデータを扱うために設計されたニューラルネットワークの一種です。特に、長短期記憶（LSTM）やゲーティッドリカレントユニット（GRU）は、言語モデリングや機械翻訳などにおける最先端のアプローチとして知られています。RNNの強みは、繰り返される事象の予測や、時間的な依存関係を持つデータの処理に適していることです。具体的な応用例には、機械翻訳、時系列予測、自然言語処理、音声認識などがあります。

## 2. Background
従来のRNNや畳み込みニューラルネットワーク（CNN）において、長距離依存関係を学習するための計算量が増加する問題があります。Transformerモデルは、これらの問題を解決するために、完全に自己注意機構に依存した最初のモデルとして提案されました。


## 3. モデルアーキテクチャ
モデルに関する説明（読み飛ばしちゃった）
興味のある方は原論文を参照してください。

## 4. なぜ自己注意なのか
自己注意層の目的は、リカレント層や畳み込み層などと同じ
とはいえm自己注意を使う理由がある
1. レイヤーごとの総計算量
1. 並列化できる計算量
1. ネットワーク内の長距離依存関係感のパスの長さ
1. 副次的な利点として、解釈しやすいモデルになりやすいかも

## 5. training
- WMT 2014英独翻訳タスクとWMT 2014英仏翻訳タスクを実施
- NVIDIA P100 GPUを8台搭載した1台のマシンでモデルを学習させた。(3.5日学習にかかった)
![スクリーンショット 2024-06-28 4.30.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/846404/2c86744c-d70f-92ee-219a-522ed97d1846.png)
- BLEUスコアで評価
    - BLEUスコア（Bilingual Evaluation Understudy）は、機械翻訳システムの性能を評価するために広く用いられる自動評価指標の一つです
    - BLEUスコアは、生成された翻訳と人間が作成した参照翻訳との一致度を定量的に測定します
    - BLEUスコアは0から1の範囲で表され、1に近いほど生成された翻訳が参照翻訳と一致していることを示します。

## 6. Result
- WMT 2014英独翻訳タスクでは、Transformerモデルがこれまでの最良のモデルを上回る結果を示しました。英仏翻訳タスクでも、非常に高いBLEUスコアを達成しました。

## 7. conclusion
- 本研究では、(エンコーダ・デコーダのアーキテクチャで最も一般的に使用される)リカレント層を、多頭の自己注意に置き換えた完全に注意に基づく最初のシーケンス変換モデルであるTransformerを発表した
- モデルの学習と評価に使用したコードは、https://github.com/tensorflow/tensor2tensorで公開されている。
Qiita1本目で目標宣言してみる

# 現在の自分について
都内のSESでJavaのシステムエンジニアをしています。
運用保守の案件で、主に設計書の修正や検証を行う機会が多いです。
ただ残念ながら今の現場や今の仕事では自分がやりたいと思えるような経験を積むことは難しいと感じて正直焦っています。
例えば、自分のやりたい開発スタイルはアジャイルなのに現場はウォーターフォールで製造より設計書作成に時間をかけている状況だったり、プロダクト開発について学びたいけど開発できる機会がほとんどないなど。。。

個人的にはエンジニアの1~3年目にどのような経験をするかで今後のキャリアが決まってくると思っているので、現状を変えたいと思っています。


# 今年中に叶えたいこと
2024年の12月ごろまでに、個人開発でリリースをしてユーザーを得ることができる技術力を持ちたいです。
実は今年中と期限があるのは個人的な事情からなのですが、私には4年ほど遠距離（海外）の彼がいます。
その彼と相談をして、今年中には私が世界中のどこからでも働けるような状態になって、一緒に生活をしようということになりました。
この目標を叶えるために、技術力を磨き世界中のどこでも通用するような技術力を身につけるという手段を選びました。

決めたのが今年の初めあたりなのですが、その後どうすればいいのかわからずモヤモヤしてインプット沼を続けていました。
そんなことをして数ヶ月経った時に、[渡邉 臣](https://qiita.com/Sicut_study)さんの記事に出会いました。
記事を読んだ人はわかるかもしれないですが、いかにインプットではなくアウトプットが大切かをいつも説明されています。
その記事を読んで「私に足りないのはこれだ！」となり、JISOUの無料コーチングに申し込み、今に至ります。


# 将来のなりたい姿
エンジニアになるきっかけとも関係があるのですが、自分のプロダクトで人の悩みを解決していきたい、社会に変化を起こしたいと考えています。
そのために個人開発をどんどん加速させて、お金を払ってでも使いたい！と思ってもらえるようないいプロダクト作りをしたいと思っています。
目標を叶えるための手段は一旦次の設定でいきます。
### 短期目標（3ヶ月)
JISOUでの課題にとにかく集中してアウトプットをしまくります。
私の尊敬する人が「量は質を凌駕する」とおっしゃっていました。最初の3ヶ月は質ではなく量にこだわってどんどんアウトプットしていきたいと思います。Qiita記事数で言うとJISOUでは100記事目標があるのでそこを目指します。

### 中期目標（半年）
半年後には自分のプロダクトをどんどんリリースしてユーザーの反応を確認できるような状況になります。
自分の技術にも自信ができてきて、多くの学びを得られるような理想の仕事についている状態を叶えます。

### 長期目標（1年）
技術力を高める活動をどんどん加速させていき、来年の今頃には、自分のプロダクトからお金を得る仕組みづくりができている状況を実現させます。

# おわりに
正直上記の目標は結構大変だと予想してます。
ただ個人的にはモヤモヤしているよりも、本気で何かやっていこうと決めて動いていける機会があることにすごくワクワクしている状況です。
今回出会うことができた[渡邉 臣](https://qiita.com/Sicut_study)さんが運営するJISOUではそういう本気の気持ちをすごく応援してくれます。
これからQiitaでJISOUでの経験など発信していく予定なのでよろしくお願いします！

# JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
実践的なカリキュラムで、あなたのエンジニアとしてのキャリアを最短で飛躍させましょう！
興味のある方は、ぜひホームページからお気軽にカウンセリングをお申し込みください！
▼▼▼

https://projisou.jp/
2024/6/28主にITとかセキュリティの記事

「FileCatalyst Workflow」に深刻な脆弱性 - PoCも公開
https://www.security-next.com/158894

ファイル転送製品「MOVEit Gateway」に認証回避の脆弱性
https://www.security-next.com/158898

国内狙う攻撃キャンペーン「Blotless」 - 再侵入防ぐ対策を
https://www.security-next.com/158929

ネットワーク監視ツール「WhatsUp Gold」にRCEなど複数脆弱性
https://www.security-next.com/158902

「VMware ESXi」や「VMware vCenter Server」にDoS脆弱性
https://www.security-next.com/158909

WordPress向けメールマーケプラグインにSQLi脆弱性
https://www.security-next.com/158904

千葉大が迷惑メールの踏み台に - ホスティング事業者の通知で発覚
https://www.security-next.com/158860

サイト掲載した表計算ファイルに個人情報 - 浜松市
https://www.security-next.com/158858

「ローコード開発ツール」のセキュリティガイドライン策定支援サービス
https://www.security-next.com/158865

防止不可能　「ソフトウエアサプライチェーン攻撃」の脅威
有名ソフトにバックドア(6/27)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/041800013/061800078/

Google CloudがユーザーのITインフラを誤削除
「復元不可能な全面削除」は起こり得る　バックアップの再点検を(6/27)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/041800012/061800252/

どうする「脱VMware」、ユーザー企業が検討する主な移行先は3種類(6/27)
https://xtech.nikkei.com/atcl/nxt/column/18/02864/062400006/

リクルートにサイバー攻撃、「通常とは異なる多数のアクセスを受けた」(6/26)
https://xtech.nikkei.com/atcl/nxt/news/24/01071/

英国の冤罪事件、公聴会が大詰めに　システムを開発した富士通の責任は(6/26)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600008/062000170/
ITパスポート データベース設計

・主キー
行を一意に識別するための列
同一の値は存在しないこと（一意性制約）
値が空（NULL）でないこと

・複合キー
複数の列を組み合わせて主キーとすること

・外部キー
他の表の主キーを参照する列
リレーション
表同士の関係付け

・インデックス
検索を高速に行う目的で、必要に応じて設定して利用する索引

・E-R図
対象世界を構築する実体（エンティティ）と実体間の関連（リレーションシップ）を視覚的に表した図
M5UnitV2でクロスコンパイルすると"no version information available"

## 概要

M5UnitV2でクロスコンパイル環境を構築し、生成されたバイナリーを実行すると、
" /usr/lib/libstdc++.so.6: no version information available"エラーが表示されます。これの対応の仕方を説明します。

## 現象

M5UnitV2のクロスコンパイル環境で、以下のソースコードをビルドします。

```main.cpp
#include <iostream>
using namespace std;
int main() {
    cout<<"Hello UnitV2 World"<<endl;
    return 0;
}
```
[UnitV2Framework](https://github.com/m5stack/UnitV2Framework)で書かれている、
クロスコンパイル環境でgcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihfでクロスコンパイルを行います。

```
$ /opt/gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ main.cpp -o main_0
```

このバイナリーをM5UnitV2で実行すると、"/usr/lib/libstdc++.so.6: no version information available"という表示がでてきました。

```
unitv2% ./main_0
./main_0: /usr/lib/libstdc++.so.6: no version information available (required by                            ./main_0)
./main_0: /usr/lib/libstdc++.so.6: no version information available (required by                            ./main_0)
Hello UnitV2 World
```

このエラーメッセージ「/lib/libstdc++.so.6: no version information available (required by ./hello-world)」は、実行しようとしているプログラム ./main_0 が依存している libstdc++.so.6 ライブラリのバージョンが、プログラムがコンパイルされたときに使用されたものと異なるか、またはUnitV2の中でバージョン情報が見つからないことを示しています。

## 対策：静的リンクの使用

プログラムを再コンパイルして libstdc++ を静的にリンクすることで、異なるシステム間でのライブラリのバージョン違いによる問題を避けることができます。 -static-libstdc++というオプションをつけます。

```
 /opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ main.cpp -o main -static-libstdc++
 ```

このバイナリーをM5UnitV2で実行して、エラー表示が出なくなることを確認しました。

 ```
unitv2% ./main
Hello UnitV2 World
```

デメリットとして、ファイルサイズが大きくなる弊害が発生します。

|Name|Type|ファイルサイズ|
|---|---|---|
|main_0|-static-libstdc++なし|0.013MB|
|main|-static-libstdc++あり　|6.449MB|


## 参考

M5UnitV2のクロスコンパイル環境を構築する手順
https://qiita.com/nnn112358/items/9e15450265b689300216
発表原稿を作るときに考えていること

## この記事の概要

私はそれなりの頻度で登壇しています。
外部向けの登壇だけでなく、社内向けに勉強会を開くこともあり、よく人前で話しています。

何度もやっているうちに、自分なりの原稿の作り方のコツが掴めてきたので記事にしました。

## 最初にまとめ

- イベント概要や参加者の属性を理解する
- 結論や要点は多めに伝える
- 修飾語を削る
- 実際に声に出してみる
- ページ送りのタイミングと文章の切れ目を揃える

要約すると、誰向けにどんな話をするのか、全体の構成はどうするのか、と大きな単位から考えます。
そして、方向性が定ったら細かな表現や話し方をブラッシュアップしていきます。

## イベント概要や参加者の属性を理解する

同じようなトピックを話すにしても、イベントの雰囲気によって適切な話し方は変わってきます。

例えば初心者向けであれば**分かりやすい言葉**を使い、**日常のものごとに例える**と導入がスムーズです。

しかし玄人が多い場合に上記のような説明をすると、親切ではなく冗長な話として受け取られやすいです。
**正しい専門用語**を使い、**最初から核心**を話す方がウケは良いです。

社内だけとか、仲のいいメンバーでのクローズな勉強会の場合も、また違った雰囲気があります。

背景を細かく話すよりは「いつものやつ」といったハイコンテクストさで「**気になったら後から聞いてよ**」くらいの方が面白い話にしやすいです。

このように、まずは誰が参加するのかを理解し、そこにあわせた方針を定めるのを重要視しています。

## 結論や要点は多めに伝える

ビジネスの現場だとよく「結論から話せ」と言われます。
登壇の場合は、最初に言うのも重要ですが、随所に散りばめるのもまた重要です。

特に、難しめの話題や、長丁場の発表の際は殊更です。
時間が長いと「**で、今話しているものが最後にはどうなるの？**」と不安がる聴衆も多いです。

ひと段落ついたタイミングで「**ここまでが、結論の 3 要素のうち 1 つ目に繋がってくるんですよ**」なんて補足を入れると、分かりやすかったと言っていただきやすいです。

一例として、こんな構成を挙げます。

- 最初に結論を伝える
- 細かな話をする
- 間で一度結論に触れ、後半の方向性を示す
- 細かな話をする
- 最後にまとめで結論

LT くらい短い時間の場合、ここまですると冗長かもしれません。
ただ、その場合でも最初と最後に結論を伝えるのは効果的です。

## 修飾語を削る

修飾語が増えると一文が長くなって、聴衆は「結局何の話？」と困惑してしまいます。

どれだけ綿密に仕上げても、現場では「ちょっと」「割と」「どちらかと言えば」みたいな言葉を付け足してしまうものです。
ですから、原稿を考える時点ではバッサリと削るくらいが丁度良いのでしょう。

特に、予防線を張るための修飾語は減らします。

以下のようなフレーズを聞いたことはありませんか？

「**今回のアプローチは、すべてとは言いませんが、XX など結構たくさんの場面で、ある一定は効果的だと思います。**」

何か言っているようで言っておらず、ストレートに伝わりづらいです。
次のように変えた方が理解してもらいやすいです。

「**今回のアプローチは特に XX の場面で効果的です。**」

ただ言い切れば良いという訳ではなく、簡潔に言い切れるよう内容を整理するのが重要です。

副次的な話ですが、修飾語の少ない発表ができていると、強調したい箇所を伝えやすくなります。
デフォルトでは修飾語なし、強調したいときは十分に間をとって「とっっっても」などと表現すると、緩急がつきます。

:::note
SNS などでは「ある程度知識がつき、ジャンルに精通してくると、どんなものごとも言い切れない。あからさまに言い切っている人は怪しいと思え。」といった意見をよく見ます。

1 つの正しさだとは思いますが、登壇者としては明快に言い切れるよう心がけるのも、また 1 つの正しさだと思います。

「歯切れの悪い言い方しかできないから話すトピックや構成を見直そう」という心構えは、より良い発表を作る手助けになります。
:::

## 実際に声に出してみる

テキストやスライドの内容を発表当日初めて声に出した（と思われる）人はよくいます。

話しながら「いや違うな、こっちじゃなくて……先に……」なんて独り言を言っている人、いますよね。
あれはきっと、初めて声に出している人です。

文章としてはよく整理できたと思っても、声に出すとしっくり来ない場合は多いです。
原稿を作りながら、ときどき声に出してみて推敲すると防ぎやすいので、毎回行っています。

関連して、できるだけ録音もした方が良いです。
文章の最後の方は毎回モゴモゴ言っているとか、セクションによって声量が違いすぎるとか、ほぼ間違いなく改善ポイントが見つかります。

## ページ送りのタイミングと文章の切れ目を揃える

一息に言いたい言葉なのに途中でページ送りが挟まるとか、話は進んでいるのにページは止まったままとかだと、リズムが悪いです。

どれくらい話したら、どこでページを送るか？という観点も含めて原稿化しておくと、リズムが悪い場所も生まれづらいです。

私の場合、段落と段落の間に 1 行あけているとき = ページ送りのタイミングとしています。
原稿を見て、視覚的にも「長々と話しすぎだ」「しょっちゅうページをめくり過ぎだ」と分かります。

関連して、ページ送りと文章のタイミングをチェックしておくと、スライドを行ったり来たりするのが防げます。
よく、スライドを遡って説明して、戻ってきて、また遡って……と発表している人がいますよね。

聴衆からしたらかなり認知負荷が高く、辞めるべき行為なので、あわせてチェックしておきましょう。

## まとめ

- イベント概要や参加者の属性を理解する
- 結論や要点は多めに伝える
- 修飾語を削る
- 実際に声に出してみる
- ページ送りのタイミングと文章の切れ目を揃える
「Amazon Bedrock 生成AIアプリ開発入門」 レビュー #Bedrock開発入門

## はじめに
このたび、AWS コミュニティで活躍されている @minorun365 さん、@moritalous さん、@hedgehog051 さんが執筆された「Amazon Bedrock 生成AIアプリ開発入門」を読了いたしましたので、レビューをさせていただきます。

:::note info
著者の @minorun365 さんより書籍をご恵贈いただきました。この記事はその書評を個人の見解として述べるものです。
:::

![IMG_0409.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2988434/2f93f83b-15e8-c365-4a91-d320195efb19.jpeg)

本レビューが皆様の参考になれば幸いです。
## Amazon Bedrock 生成AIアプリ開発入門
2024年6月26日に発売されています！

https://www.sbcr.jp/product/4815626440/
## 本書の特徴

本書の特徴として、特に以下の2つの特徴が際立っていると感じました。

### 1. 初心者にもやさしい

カラフルな図表を多用したり、なるべく平易な言葉で説明しようとする意図が感じられたため、Amazon Bedrockの初心者だけでなく、生成AI技術の初心者にも配慮された構成になっていると感じました。

また、各章に用意されているハンズオン資料も丁寧にに作られており、AWSの操作経験が少ない方でも、実装を最後まで完遂できるよう工夫されていると感じました。

### 2. 高い網羅性

重要度の高い項目にのみフォーカスするというよりか、網羅性を意識して書かれていると感じました。
例えば、AWS上で使用できるRAG（Retrieval-Augmented Generation）用の検索サービスについては、11種類も解説されています。
そのため、本書は読み物としてだけでなく、辞書的な参考資料としても使えると思います。
## 対象読者
本書は以下のような方々が読むと特に役に立つと思いました。
### 1. Amazon Bedrockや生成AI技術の初心者の方
前述の通り、予備知識が少なくても読みやすく、実践的に学習できると思います。
### 2. Amazon Bedrockに多少触れたことがあり、RAGやエージェントの実装に興味がある方
RAGやAIエージェントをAWS環境で実装するためのハンズオン資料やGitHubリポジトリのソースコードが用意されているので、すぐに実装に取り組めます。
### 3. Amazon Bedrockを本番環境で運用している人
基本的な知識はあるものの、現在運用中のアプリケーションに他にどんな選択肢があるか、どんな機能を追加すべきなのかを検討する際の参考資料として活用できます。
## 本書の対象から外れる可能性がある読者
逆に、以下のような目的をお持ちの方は、必ずしも期待に沿わない可能性があります。
### 1. クラウドベンダー間での生成AIサービスを比較検討したい方
本書は、Amazon Bedrockに焦点を当てており、Azure OpenAI ServiceやGoogle Cloud Vertex AIなど、他のクラウドベンダーが提供する生成AIサービスとの詳細な比較は含まれていません。
### 2. OSS含めた生成AIアプリケーションのベストプラクティスを求める方
本書ではAWS環境での「おすすめの構成」は紹介されていますが、LangChainなどのOSSフレームワークを含めたエコシステム全体での最適なアーキテクチャについては、十分な情報が得られない可能性があります。
## 読者別おすすめの読み方
基本的には、最初から読み進めることをお勧めしますが、効率的に学習したい場合や、目的が明確な場合は、以下のような読み方をお勧めします。
### Amazon Bedrockや生成AI技術の初心者の方
まずは、「ハンズオン」タグが付いた項（例：2.10、3.5、3.6、4.2など）から始めることで、実際に手を動かしながら学習することをおすすめします。
その後、そのハンズオンを行った章を、最初の段落からに読み進めると、触れた概念や用語の理解を体深めることができると思います。
### Amazon Bedrockに多少触れたことがあり、RAGやエージェントの実装に興味がある方
RAGについては第4章から、エージェントについては第5章から読み始めてみて、興味のある技術をすぐに実装することができます。
### Amazon Bedrockを本番環境で運用している人
前述で申し上げた通り必要に応じて辞書的に使うことをお勧めします。例えば、
- AWSで実装可能なRAGのパターンの確認したい：第4章
- Amazon Bedrockの機能を網羅的に確認したい：第6章
- Amazon Bedrockと他サービスとの連携方法の確認したい：第7章

などなど

私はどちらかと言えば「Amazon Bedrockを本番環境で運用している人」に該当するので、この本は辞書的な使い方をしながら長い付き合いをしていくと思います。

## さいごに
この本についてはここで紹介しきれない良い点もたくさんあります！

また、この本の出版により、コミュニティ全体でのAmazon Bedrockの利用が促進され、技術力がさらに発展することを期待しています！

そのようなコミュニティ全体の発展に寄与するであろう貢献をしてくださった著者の方々にもあらためて感謝を申し上げます。

ありがとうございました！
Railsで検索機能実装に役立つおすすめ記事一覧(Ransack)

# RailsアプリケーションでRansackを使用して検索機能を実装する際に参考にした記事をまとめました。

## 1. [activerecord-hackery/ransack (GitHub)](https://github.com/activerecord-hackery/ransack)
Ransackの公式リポジトリです。まずはこれを見てみるといいと思います。

## 2. [Ransackを使った検索機能の実装（Qiita）](https://qiita.com/nojinoji/items/e1b174220da8c81a1756)
Qiitaユーザーによる実際の使用例が紹介されています。具体的なコード例が豊富です。

## 3. [Ransackの基本的な使い方（Pikawaka）](https://pikawaka.com/rails/ransack)
基本的な使い方や設定方法が分かりやすくまとめられており、読みやすい。

## 4. [Rails7とRansackでのインスタント検索機能（プログ）](https://plog.kobacchi.com/rails7-ransack-instant-search/)
Rails 7での検索機能の実装方法が詳しく解説されています。最新のRailsバージョンを使っている方に最適です。


以上！参考にしてみて下さい！！
AWS アカウントの MFA（他要素認証）の設定方法

# AWS MFA （多要素認証）の設定

以下の手順で MFA を追加
1. AWS にログイン
1. 検索バーに IAM と入力
![77b15e5d02cfeaa5767557761fe4d224.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357904/0adbde36-acd4-0e7f-0882-d656ea1dba4b.png)
1. サービス > IAM を選択
1. IAM ダッシュボードが開くので、右側の Quick Links の中にある `自分の認証情報` を選択
![e8a2031e29b175330ff3f5909b597d78.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357904/f7c696ca-558d-bcd3-1711-12060e364db6.png)
1. 認証情報一覧の中に `他要素認証（MFA）` という項目があるので、その中の `MFA デバイスの割り当て` を選択
![292dc4728fea593508538872d33c49cf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357904/c3106eaf-56b7-6746-221d-1401da76f5ca.png)
1. MFA device name に任意の名前を入力（使える文字列であれば何を入力しても大丈夫です）
![4f9c5eac7d13e7807676e91240ee13a4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357904/09f40943-38bf-82a0-d595-21628aee1feb.png)
1. MFA device を下記のどちらかを選択して `次へ` を選択
・パスキーまたはセキュリティキー
・認証アプリケーション
![53695035e67f2ad4cd4a7890a6ecba40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357904/b537dc8c-472a-acdb-4922-29d0c61c216a.png)

## `パスキーまたはセキュリティキー` を選択した場合
1. iCloud キーチェーンなど利用可能な項目が表示されるので、自分が利用したいものを選択
![a0455357c1e9a22bf53221d9bca1f23c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357904/64f8658a-1ed3-9e08-b897-445a54d27f49.png)
※ 権限があれば確認画面を経て自動的に登録されます

## `認証アプリケーション` を選択した場合
1. 仮想認証アプリケーションのインストール
    * 利用可能リスト: https://aws.amazon.com/jp/iam/features/mfa/
![be88932a79c29cc032e0acfc7cce005b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357904/f14461b2-8e6b-e2d3-5dee-751936d427f6.png)
※ すでにインストールされている場合は不要
※ 特にこだわりが無ければ `Google Authenticator` をインストール
1. 開かれたページの QR コードを表示を選択
![6e2bf6c39693b4a6b05949f9f0caaef9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357904/67881f47-cf07-0544-53b5-041a41eb0561.png)
1. 表示された QR コードを仮想認証アプリケーションで読み込む
    * PC 画面上
![45c4b2656cb70f623f204337a2a64a24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357904/09a7b83e-eb1f-03fe-ddd7-eabe27d26e15.png)
    * スマホ画面上 (Google Authenticator)
![d964fa3a2d8fa32d28d75b6cc70a81f3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357904/5261ea98-8360-78b5-da95-098c40c7eee8.png)
1. `MFA コード1` に表示されている6桁の認証コードを入力
1. 仮想認証アプリケーションに表示されている MFA コードが変更になるのを待つ
1. `MFA コード2` に変更された認証コードを入力
1. `MFA を追加` を選択

# 認証の確認
1. 一度ログアウトして、再度ログイン
1. 無事ログインできたら登録完了です

# NOTE
## MFA の登録ができない場合
MFA の設定権限が無い場合は下記リンクと共に AWS の権限管理をしている人に設定をお願いしましょう
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_examples_iam_mfa-selfmanage.html

## MFA のリスクヘッジ
可能であれば複数のMFAを登録しておくことをおすすめします
例えばパスキーを登録したが iCloud の同期ができていなくて他PCでログインできなくなる可能性もあるでしょう
そういった場合に他の手段を残しておくと安心できます
Sales CloudにTableau Pulseを埋め込んでみた

## 前提
・Salesforce管理者権限
・Tableau Lightning Web コンポーネントとシームレスな認証の構成
## 参考ヘルプ
https://help.tableau.com/current/online/ja-jp/lwc_seamless_auth.htm
## 手順
### 1.Salesforce側でTableau組み込みを設定
①Salesforceホーム画面の歯車→「設定」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/3d2d33f3-73b6-916a-d3f8-c81050717801.png)
②検索ボックスからTableauと入力し、「Tableau組み込み」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/7868ece8-6ea8-361f-afff-45220a8f0e47.png)
③
トークンベースのシングルサインオン認証を有効化：☑︎
Tableauユーザー ID 項目を選択：Tableauに渡すユーザ識別子を選択(Salesforce と Tableau でユーザー アイデンティティに一致するフィールドを選択)
発行者URL、JWKS URIをメモ帳にコピーしておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/1c60a4f3-59e9-beec-92eb-3b487fbb69e1.png)

### 2.Tableau Cloud側で連携アプリを設定
①Tableau Cloudの「設定」→「連携アプリ」→「新しい連携アプリ」→「OAuth2.0信頼」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/fa057ed2-66b1-7968-daf9-65be63a9c824.png)
②以下の情報を設定し、作成をクリック
発行URL：1-③でコピーした発行者URLをペスト
JWKS URI：1-③でコピーしたJWKS URIをペスト
接続済みアプリを有効にする：☑︎
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/e80ebb10-a8d8-fc9c-19dd-20d81ad87e86.png)
### 3.Salesforceに信頼できるURLを追加
以下のURLを信頼済みに登録する必要がある
https://*.tableau.com
https://*.online.tableau.com
①Salesforceアプリで、右上の歯車→「設定」を選択
②左側のクイック検索バーに「CSP」と入力
③「信頼ずみURL」を選択
④「新規信頼済みURL」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/86379c5b-12a9-8f64-ca84-f3ec339e2e8c.png)
⑤「API」と「URL」を入力
⑥「CSPコンテキスト」：[すべて]
⑦「CSPディレクティブ：すべてのボックスをオン
⑧「保存」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/4326b38e-75c6-4e1e-78e1-ad50d095b02b.png)
⑨同じ手順で、2つのURLを全部登録
### 4.Tabelau CloudのPulseをSalesforceへ埋め込む(Tableau Cloud側)
①Tableau Cloudから埋め込みたいPulseを開く
②URL欄のURLをコピーしておく
### 5.Tabelau CloudのPulseをSalesforceへ埋め込む(Salesforce側)
①レコードページの歯車→「編集ページ」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/6f9c14a5-e5b2-14c5-a940-209ff2932a43.png)
②コンポーネントからtableauを入力し、「Tableau Pulse」を画面にドラックアンドドロップする
③右側のTableau Pulse設定で、以下を設定し、「保存」をクリック
Tableau PulseのURL：4-②の「URLのコピー」
サイトID：手順2で作成したOAuth2.0のアプリを開き、サイトIDをコピー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/55ae11ba-d7d4-8852-ce16-57c0f2b13593.png)
④「保存」→「有効化」をクリック
⑤レコードページを表示し、Tableau Pulseが表示されてることを確認
以上
Githubにおける半パブリックなシェアリンク

卒論の憂さ晴らしにちょいと記事を書く。

# 目的
相手がGithubアカウントを持っていなくてもリンクを共有するだけでレポジトリが見れるようにしたい。

> 例えばESなどで成果物(プライベートレポジトリ)をシェアしなきゃいけない際に、相手がgithubのアカウントを持っているかわからない状態でもレポジトリのシェアをリンク一つで出来るようにしたい。など



## 解決策
とりあえずの解決策↓

https://gitfront.io/

なおGistでもいい場合は、Secret Gistを使えば良い。


## 不満点
[Gitfront.io](https://gitfront.io/)だとセキュリティ的に心配、かつコミット履歴や分析などが見れない。


# 参考文献
https://stackoverflow.com/questions/31264165/can-i-share-my-private-github-repository-by-link#:~:text=Add%20a%20comment-,62,-Use%20https%3A//gitfront
CoreMP135で動画を再生する

## 概要
CoreMP135には、ディスプレイとスピーカが内蔵されています。
CoreMP135のディスプレイとスピーカを使って、動画を再生してみました。大きな動画を扱う場合は、CoreMP135は動画の処理性能が高くはないので、事前に動画のサイズをディスプレイにあわせて縮小して必要があります。

CoreMP135には、debianをインストールしておきます。

[CoreMP135のdebianをビルドする](
https://qiita.com/nnn112358/items/44921e2470353653058e)

## FFmpegで動画のリサイズ

CoreMP135のディスプレイ解像度は320x240なので、DebianにFFmpegをインストールして、ビデオの解像度を320x240に変更します。

### Step 1: FFmpegのインストール

1. 動画を編集するツールFFmpegをapt でインストールします。

   ```
   sudo apt install ffmpeg
   ```

### Step 2: 動画の解像度を変更

FFmpegを使ってビデオファイルの解像度を320x240に変更するには、次のコマンドを実行します。ここでは`input.mp4`が元のビデオファイル名、`output.mp4`が変換後のファイル名です。

```
ffmpeg -i input.mp4 -vf "scale=320:240" output.mp4
```

このコマンドの説明：
- `-i input.mp4`: 入力ファイルを指定します。
- `-vf "scale=320:240"`: ビデオフィルターを使用してビデオの解像度を320x240に変更します。
- `output.mp4`: 出力ファイルの名前です。

これで、指定したビデオファイルの解像度が320x240に変更されました。

## mplayerで動画の再生

### Step 1: MPlayerのインストール

Linux用のメディアプレーヤーであるMPlayerをインストールします。

```
$ sudo apt install mplayer
```
### Step 2: 動画を再生
MPlayerを使用して、出力先にCoreMP135のLCDデバイスファイル(/dev/fb1)を指定し、動画のサイズが異なる場合にはサイズ320:240にスケーリングしながらビデオファイルを再生します：

```
$ mplayer -volume 10 -vo fbdev2:/dev/fb1 -vf scale=320:240 output.mp4

-volume 30: 音量を30%に設定します。
-vo fbdev2:/dev/fb1: ビデオ出力をフレームバッファデバイス/dev/fb1に設定します。
-vf scale=320:240: ビデオフィルターを使用してビデオの解像度を320x240に変更します。
output.mp4: 再生したいビデオファイルのパスです。
```

## 最後に

CoreMP135では、ビデオ出力をHDMI(/dev/fb0)に設定すると、HDMIから動画再生を行うことができます。
量子エンジニア(アニーリング式)勉強会メモ #2

量子エンジニア(アニーリング式)第2回の勉強会メモです。第1回のメモは以下。

https://qiita.com/y-vectorfield/items/25b2ac76dbf3a0f6e923

# 単一の量子ビットを1にする

```python
H = 0
H += (q[0] - 1)**2
```

```python:別記法
H += -q[0]
```

# 単一の量子ビットを0にする

```python
H = 0
H += (q[0] - 0)**2
```

```python:別記法
H = 0
H += q[0]
```

# イジング変数への変換

```python
z = 2*q - 1
```

# Reference
https://github.com/tytansdk/tytan_tutorial
【参加日記#02】Gemini API デベロッパー コンペティション

～[前回](https://qiita.com/arc-lab-jp/items/b781468a600dd6eb08d2)までのあらすじ～
Gemini API デベロッパー コンペティションに参加してみよう！と思いたち、登録後に、作るアプリが決められずにまずは公式ドキュメントを読み始めました。

# 1.入門チュートリアル(Getting started tutorials)

各開発環境に分かれて解説されているのだが・・・何にしようかな

ん？？

>生成 AI モデルを初めて使用する場合は、クイックスタートを試す前に、コンセプト ガイドと Gemini API の概要を確認することをお勧めします 。

はい、素直に読みますよ。

## 1.1 [コンセプト ガイド](https://ai.google.dev/gemini-api/docs/models/generative-models?hl=ja)
生成モデルについて(About generative models)って頁に飛びます。
ここは、生成AIを使ってる人からすれば聞いたことがある内容が書かれてる。
モデルパラメータという項目は、アプリ開発時に直接かかわる情報なので後で見返すことになるだろう。

## 1.2 [Gemini API の概要](https://ai.google.dev/gemini-api/docs/api-overview) 
開発言語ごとに、APIとのいろいろな対話方法のサンプルが記載されてる。
ここも後で必ず見返すとこだろうね。うん、大事。

## 1.3 結局、開発言語はどれ？
あまり悩んでもしょうがないので、サクッとDartに決定！
webアプリなら、とりあえずデバイスに依存しないからね。
とはいえやったことない言語である。
それでもなんとかなるよ、たぶん（笑）

というわけで、また[次回](https://qiita.com/arc-lab-jp/items/fdfc6908f6d90a9b8b85)
CoreMP135の起動時のbeep音を止める

## 概要
CoreMP135の起動時に、かなり大きい音でBeep音がなります。ややうっとおしいため、Beep音を止める方法を紹介します。


## CoreMP135起動時のbeep音を止める(buildroot)

CoreMP135の起動時に呼び出される設定ファイル /etc/rc.localをエディタvimで開きます。
tinyplayの行をコメントアウトすることでbeep音が止まります。

```
$ vim /etc/rc.local
```


```/etc/rc.local
#!/bin/sh
[ "$1" == "stop" ] && exit 0
modprobe fb_ili9342c
FRAMEBUFFER=`cat /proc/fb | grep ili9342c | awk '{print "/dev/fb"$1}'` fbv /usr/local/m5stack/logo.jpg &> /dev/null &
echo 1 4 1 7 > /proc/sys/kernel/printk
# tinyplay /usr/local/m5stack/logo.wav &> /dev/null &
```

## CoreMP135起動時のbeep音を止める(debian)

debianでは、CoreMP135の起動時に呼び出される設定ファイル /etc/rc.localから、/usr/local/m5stack/init.shを呼び出していますので、このファイルをエディタvimで開きます。
tinyplayの行をコメントアウトすることでbeep音が止まります。


```
$ vim /usr/local/m5stack/init.sh
```

``` /etc/rc.local
#!/bin/sh
[ "$1" == "stop" ] && exit 0
[ -f '/usr/local/m5stack/init.sh' ] && /usr/local/m5stack/init.sh 2>&1 > /dev/null &
```

```/usr/local/m5stack/init.sh
#!/bin/bash
. /usr/local/m5stack/bashrc
printf "q\r\n" | fbv /usr/local/m5stack/logo.jpg 2>&1 > /dev/null &
/usr/local/m5stack/lt8618sxb_mcu_config 2>&1 > /dev/null &
echo 1 4 1 7 > /proc/sys/kernel/printk
# tinyplay /usr/local/m5stack/logo.wav 2>&1 > /dev/null &
```


## CoreMP135のOSビルド時に起動時のbeep音を止める

OSビルド時に起動時のbeep音を止めるように設定します。
CoreMP135_buildroot-external-stをgitで取得します。

```
git clone https://github.com/m5stack/CoreMP135_buildroot-external-st.git
```

buildrootでは、
"board/m5stack/coremp135/overlay/etc/rc.local"がCoreMP135での"/etc/rc.local"になります。"board/m5stack/overlay/etc/rc.local"にも同じファイルがありますが、こちらは、先に書き込まれる酔うので、以下のファイルに上書きされているようです。要は反映されないようです。

```
vim board/m5stack/coremp135/overlay/etc/rc.local
```

tinyplayの行をコメントアウトします。

```
#!/bin/sh
[ "$1" == "stop" ] && exit 0
modprobe fb_ili9342c
FRAMEBUFFER=`cat /proc/fb | grep ili9342c | awk '{print "/dev/fb"$1}'` fbv /usr/local/m5stack/logo.jpg &> /dev/null &
echo 1 4 1 7 > /proc/sys/kernel/printk
# tinyplay /usr/local/m5stack/logo.wav &> /dev/null &
```

debianでは、"tools/overlay_debian12/etc/rc.local"がCoreMP135での"/etc/rc.local"になります。そして、"tools/overlay_debian12/usr/local/m5stack/init.sh"が
CoreMP135での"/usr/local/m5stack/init.sh"になります。


```
$ vim tools/overlay_debian12/usr/local/m5stack/init.sh
```

```
#!/bin/sh
[ "$1" == "stop" ] && exit 0
modprobe fb_ili9342c
FRAMEBUFFER=`cat /proc/fb | grep ili9342c | awk '{print "/dev/fb"$1}'` fbv /usr/local/m5stack/logo.jpg &> /dev/null &
echo 1 4 1 7 > /proc/sys/kernel/printk
# tinyplay /usr/local/m5stack/logo.wav &> /dev/null &
```
R で複数行のコメント（意外な実装）

文字列を定義するのに普通 " を使う人は ' を，その逆の人は　" を使って（エスケープするのはやぶさかではないという人・場合はどちらでも），以下のようにします。
実行文だけを含むだけでなく，なんでも書けます。

まずは，関数定義の中での話。

```R
b = function(x) {
'
	これはコメントです
    エラーも出ません
	以下も全部実行されません
	print("foo")
	print(x)
'
	return(x +　1)
}
```
```R
> b(8)
[1] 9
```

トップレベルだと文字列がエコーバックされてしまうので，適当な変数に代入してごまかします。
変数名としては意味のあるものを使ってもいいですけど，　[.] なんか目立たなくていいかも。

```R
x = 1
.='
	これはコメントです
	以下も全部実行されません
	print("foo")
	print(x)
	x = x + 100000
    エコーバックもされません
'
x = x + 1
print(x)
# [1] 2 が出力される
```
複雑なテクスチャーを Blender で作る

## この記事の概要

何かしらの場面で、テクスチャー画像が欲しくなるときはあると思います。

意外と簡単に、かつ量産できそうなやり方を見つけたので記事にしてみました。

無料の 3DCG ソフトである Blender を使う方法です。

## 準備するもの

Blender だけです。

持っていない人[ダウンロードページ](https://www.blender.org/download/)から手に入れましょう。

## 完成形

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/7c1a30af-ad52-e8b7-5bcb-e5e16854ac59.jpeg)

こういったランダムな模様を割と簡単にたくさん作れます。

## 準備

まずは Bledner を起動して、下準備をします。

1. Plane を配置する
1. 真上に Camera を設置する
1. 真上に Spot Light を設置する

このとき、World も Plane も`#000`、にしておきます。

Light はとりあえずバカみたいに大きな Power を設定すれば大丈夫です。
ここでは 100,000W にしています。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/f4ebd289-09ae-2d26-326f-85c25355fcd5.jpeg)

## ノードを組む

### 色を変える

Light を選んで Shader Editor を開いて、Emmision の色を`#f00`にします。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/aeed07b3-9390-416c-f120-8d632b869246.jpeg)

### Texture を繋ぐ 1

ここでは Musgrave Texture を繋いでいます。
また、Mapping と Texture Coordinate も用意して、Texture Coordinate の UV から Mapping の Vector へ繋ぎます。

　![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/1f473f3a-8810-a91f-fe35-705955a2690e.jpeg)

| プロパティ | 値 |
| --- | --- |
| Scale | 20.000 |
| Detail | 1.000 |
| Demension | 1.000 |
| Lacunarity | 1.000 |

### Texture を繋ぐ 2

複雑な見た目にするために Noise Texture を間に挟みます。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/406c6cad-634b-aa44-3198-9004e43b23a0.jpeg)

| プロパティ | 値 |
| --- | --- |
| Scale | 8.000 |
| Detail | 0.000 |
| Roughness | 0.000 |
| Lacunarity | 0.000 |
| Distortion | 0.000 |

### Musgrave Texture と Emission を複製する

複製し、Emission の色を`#0f0`と`#00f`に変えます。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/de154546-716e-d31e-ad32-150c9c53ecf6.jpeg)

### Add Shader で Emission を合成する

Add Shader を 2 つ用意し、すべての Emission を繋ぎます。
また、その際に Musgrave Texture の Scale を少しずつだけ値を変えます。
これにより、色がズレて表情が複雑になります。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/76d52b67-a3cb-4da8-c673-4c1adc9abf16.jpeg)

### 管理しやすいように値を切り出して完成

Value と Add を用意し、Musgrave Texture の Scale に繋ぎます。
これにより、Value を変えるだけですべての色が連動して変わります。　

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/65675982-c9bd-db85-9eb4-42edfb1c0097.jpeg)

最後は書き出したら、冒頭に載せたのと同じテクスチャーが出来上がります。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/7c1a30af-ad52-e8b7-5bcb-e5e16854ac59.jpeg)

## バリエーション

Noise Texture を Voronoi Texture に変える

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/56abcf40-3759-9a67-33d7-7a718a54779e.jpeg)

Musgrave Texture を Wave Texture に変える

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/b3abfee4-3aa2-63a9-d36e-da5f64396bc0.jpeg)

大した変更をしなくても、かなり様変わりします。

Texture そのものは一緒でも各種オプションを変えるだけでも相当変わりますし、適当にいじっていれば意外と面白いものに出会える気がします。
URPで複数存在するCanvasをRenderTextureに変換[備忘録]

なんかできなかったのが試したらできたので一旦書くだけ書く
# 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374827/2b453c7d-2a67-e98e-8f4e-a02af50cb8a8.png)


# 変更箇所
変更箇所は赤矢印で記しています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374827/368fd06b-e611-90d7-e585-84ff6691cb11.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374827/e09c6631-53c2-fe26-e73a-4ea5ece9b745.png)

同じレイヤーでもキャンバスとカメラを分けることで別の描画結果をRenderTextureに描画することができる
※なお処理負荷は考慮しないものとする

なんで今までできなかったんだろう...？
型推論 autoやvarはAI時代に合わないのでは

# はじめに
以前に[LLMにドキュメントを書かせる](https://qiita.com/taqu/items/30c8adf28db6148cb489)のようなVisual Studioの拡張を作成した.
しばらく運用して見て思ったこと. 検証はしていない, なんの根拠もない.

# 型を付けたほうが精度が上がるのでは
つまり, Genericsで書ける程度のプログラムの説明になるのでは？と思います. というのも, 型名や引数名, 変数名から動作を推定しているような出力をすることがある. 最も確率の高い続きを生成しているのは知っていますが.

次のように実装がなくても, 正解をだしてくることがある.
```cpp
Texture* Compress(const Texture& source, float alphaWeight, bool generateMips, bool sRGB)
{
        return Compress_Internal(source, alphaWeight, generateMips, sRGB);
}
```

型推論, `auto`や`var`を使っても, `srcTexture`などと変数名でしっかり型がわかるようにすればいいのしょうが, そもそもコードを読む人のことを考えずに型推論を乱用するエンジニアが, しっかりとした変数名を付けるとは思えません.

# 事前条件は積極的につける
契約プログラミングですが, `assertion`の内容がドキュメントに反映されることがある.
将来考えたい機能, 単体テストの自動生成でも有用だろう, `assertion`は積極的につけよう.
また, 事後条件もあったほうが単体テストの自動生成に役立つと思うので, 今後付けることを考えたい.

# まとめ
ポエムなので, とくになし.
Rubyバージョンが古くてcocoapodsがインストールできない

# 現象
Flutterセットアップ時、言われるがまま作業していたら `sudo gem install cocoapods` を実行した際に以下のようなエラーに遭遇

```bash
ERROR:  Error installing cocoapods:
        The last version of drb (>= 0) to support your Ruby & RubyGems was 2.0.6. Try installing it with `gem install drb -v 2.0.6` and then running the current command again
        drb requires Ruby version >= 2.7.0. The current ruby version is 2.6.10.210.

```
Rubyのバージョンが古いよって。

# 環境
* Macbook Air M2
* MacOS 14.5

# Rubyバージョンを上げる
## Rubyのバージョンを確認する
```bash
ruby -v
```
このコマンドで表示されるバージョンが2.7.0未満であれば、アップグレードが必要。

## rbenvのインストール
Rubyのバージョン管理ツールであるrbenvをインストールする。

### rbenvとruby-buildのインストール
```bash
curl -fsSL https://github.com/rbenv/rbenv-installer/raw/main/bin/rbenv-installer | bash
```

### zshの設定ファイルを更新
```bash
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(rbenv init -)"' >> ~/.zshrc
source ~/.zshrc
```

### ruby-buildのインストール
```bash
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
```

## Rubyの最新バージョンをインストール
rbenvを使用して、必要なRubyのバージョンをインストールします。

### インストール可能なRubyバージョン一覧を表示
```bash
rbenv install -l
```

### Ruby 2.7.0をインストール
```bash
rbenv install 2.7.0
```

### デフォルトのRubyバージョンを設定
```bash
rbenv global 2.7.0
```

### Rubyのバージョンを再確認
```bash
ruby -v
```

## cocoapodsのインストール
```bash
sudo gem install cocoapods
```

できた！
CoreMP135のdebianをビルドする

## 概要
CoreMP135は、M5Stackが発売するSTM32MP135Dを搭載したLinux搭載したIoT開発キットです。CoreMP135のLinuxOSには,BuildrootとDebianが用意されており、ここでは、Debianをビルドする手順を説明します。


## ビルド手順

Debianをビルドする前に、まず、Buildrootのビルドを行います。
Buildrootのビルドを自動化するスクリプト "creat_coremp135_buidlroot_image.sh" が用意されていますので、これを実行します。

```
git clone https://github.com/m5stack/CoreMP135_buildroot-external-st.git
cd CoreMP135_buildroot-external-st/tools/
./creat_coremp135_buidlroot_image.sh
```

buildrootのビルドが終わったあとに、Debianのビルドを行います。

```
./creat_coremp135_debian12_image.sh
```

tools/build_coremp135_debian12 ディレクトリの下に、M5_CoreMP135_debian12_"日付".imgという名前のイメージファイルが生成されているので、これをMicroSDカードに書き込みます。

生成された、イメージファイルのログインアカウントは以下のようになっています。

|ユーザー|パスワード|
|--------|------|
|root|root|
|debian|temppwd|

また、最初に、時刻が大きくずれているとaptコマンドが使えないため、時刻あわせを行いましょう。

現在のシステム時刻を確認します。

```
$ date
```

システム時刻を手動で設定します（例: 2024年6月28日15時30分00秒に設定する場合）。

```
$ date --set="2024-06-28 15:30:00"
```


## 参照資料

CoreMP135 image burning
https://docs.m5stack.com/en/guide/linux/coremp135/image

CoreMP135_buildroot-external-st
https://github.com/m5stack/CoreMP135_buildroot-external-st

Debian: STM32MP157入門ガイド
https://forum.digikey.com/t/debian-stm32mp157/33606
会話で使える気がする「プログラミング文法」(気がするだけ)

## コレは何？

我々が普段行っているコーディングでは一定のルールを定めてそれに沿ってコーディングすることが一般的である。  

もし、そんなもの私の知ったことではない！という人がいるのであれば、ぜひBrainf*ckでもWhitespaceでも好きな難読言語を書いてほしい。

本記事はそのコーディングルールの大切さがわかるように一般の会話で使うことを想定して考えてみよう。

また、本記事に登場するコードはあくまで自然言語をプログラミング言語的に解釈したものなので、記載されているコードは全て動作しないことを保証する。

## Case1 何が言いたいのかわからない

皆さんはこんな話をすること、もしくはされることはないだろうか？

「昨日、仕事から帰ってきたら、急に雨が降り始めて、コンビニに行こうと思っていたのに、傘が見つからなくて、友達と話している間に、電車も遅れて、夕食の準備ができなかった。」

これはChatGPTに作ってもらった例だが、文章にわかりにくさが伝わってくると思う。

これらは常に時系列順に事実を列挙しているだけであり、聞き取り手にとっては何を伝えたいのかがわかりにくく「一体何を伝えようとしているのだ？」となってしまうでしょう。

### コードで書くとこんな感じ

```ts
昨日(() => {
    仕事から帰宅((自分) => {
        急に雨が降り始める((雨) => {
            自分.思う(自分.行く(コンビニ), () => {
                傘がない(() => {
                    自分.友達と話す((友達) => {
                        電車遅れる(() => {
                            自分.伝える(夕飯の準備ができなかった)
                        })
                    })
                })
            })
        })
    })
})
```

おそらくこのような構文になる。

この時点でプログラミング言語のメリットをあげるのであれば

- インデントがあるおかげで、処理のまとまりが見えやすい
- 最終的に何をしているのか？が一目瞭然
- どこを改善すればいいかがわかりやすい

という点があげられるであろう。

この時点で最終的に伝えたい要素が「なんやかんやあって、夕飯の準備ができなかった」という事がわかる。

### リファクタリング

この時点で主語がどこにあるかがはっきりしたので、以下のようなコードに変換できるだろう。

```ts
自分.伝える(
    夕飯の準備ができなかった,
    理由=昨日の出来事([
        帰宅遅延(理由=[
            コンビニにいけなかった(
                理由=雨が降っていたが傘がない
            ),
            友達と話していた,
            電車遅延,
        ]),
    ])
)
```

まずは伝えるべき内容が1番目に来るのが重要だ。
伝えられた側は「なぜ？」と思う事で聞く準備が整うだろう。

また、前者では物事の過程を表していただけの情報が「なぜ？」と思うことにより理由として立項されるようになるだろう。
理由に関して言えばそれぞれのつながりに意味がなければ、それぞれ同じスコープで扱ったほうがわかりやすいので、List的な扱いをすることにした。

これにより前者より圧倒的にネストが減り、前提条件を覚えるコストがだいぶ減るだろう。

### 会話に戻してみる

つまりコレを会話文に置き換えるなら

「ごめん、夕飯の準備ができなかった。言い訳なんだけど、昨日帰るのが遅れちゃったからなの。急な雨でコンビニに行けなかったし、友達と話すのも長くなっちゃって、それで電車も遅れちゃって。」

という感じになる。

これならおそらくあなたのパートナーが渋々ウーバーイーツを注文する決断も早まるだろう。

## Case2 赤い頭の魚を食べる猫

「赤い頭の魚を食べる猫」という言葉がある。
これは解釈が5通りほどできてしまうというものだ。

https://x.com/nakamurakihiro/status/1230798247989366784

これをコードにすると属性として表現できるため間違いがないだろう。

### コードで表現

```js
let 猫 = {
    頭: {
        色:赤
    },
    行動: (魚) => {
        食べる(魚)
    }
}
```

「頭が赤い猫。その猫は魚を食べている。」
それぞれの特徴が分類ごとにわけられているのであれば、間違いは起こらない。

```js
let 魚 = {
    頭: {
        色: 赤
    }
}
let 猫 = {
    行動: (魚) => {
        食べる(魚)
    }
}
```

「赤い頭の魚、その魚を食べる猫。」
これもそれぞれ分離されているので属性として捉えられる。

```js
let 魚 = {
    色: 赤
}
let 猫 = {
    頭: {
        行動: (魚) => {
            食べる(頭)
        }
    }
}
```

ありえないシチュエーションでもコードであれば聞き返さずに受け取れそうだ。
「赤い魚を猫は頭で食べる。」となりそうだが、自然言語に戻すとこれは違和感のほうが勝っている気がする。

```js
let 魚 = {
    色: 赤
}

let なにか = {
    頭: {
        形状: 猫
    },
    行動: (魚) => {
        食べる(魚)
    }
}
```

「頭が猫のなにかが赤い魚を食べる。」
元の文章からでは生物か無生物か言及されていないので「なにか」とした。

```js
let なにか = {
    頭: {
        形状: 猫,
        色: 赤
    },
    行動: (魚) => {
        食べる(魚)
    }
}
```

「頭が赤い猫の形をしたなにかが魚を食べる。」
こちらも「なにか」である。

### 構造化の恩恵

プログラミング言語は構造化をすることにより、どのスコープであるか？を明示することが容易だ。
これにより、比較的容易にこれらの状態を判別できる。

## とりあえずコレ以上思いつかない

通勤中、唐突に思いついたネタだが、思った以上に例文を探すのが難しかった。

ここから学びを得るとすれば、「プログラム言語は人が読みやすく設計された言語」ということであろう。
おそらく、ここで登場したコード（と呼べるのだろうか？）はプログラマであればノリで読めるのではないだろうか？

つまり何が言いたいかというと、~~EXCELに設計書と言う名のプログラムは可読性が最悪で誰も幸せにならないから今すぐやめろてくれ。~~ プログラミングって楽しいよねーって話でした。
Remix Prisma リレーションの先のリレーション先の情報を取得する方法

## 概要

Remix × Prismaにてリレーションの先のリレーション先の情報を取得する方法を簡単にまとめる。

## 前提

下記のようなテーブルがあるとする。user_tagsテーブルがusersテーブルとtagsテーブルの中間テーブルでusers → user_tagsが1対多となる。
要は一人のユーザーは1つ以上の複数のタグを持つことができる。
当該のRemixプロジェクトはCloudflareのテンプレートを用いて作成されている。

- users

    | カラム名 | データ例 |
    | --- | --- |
    | id | 1 |
    | name | hoge fuga |
    | email | hogefuga@example.com |

- tags

    | カラム名 | データ例 |
    | --- | --- |
    | id | 1 |
    | name | 管理者 |

- user_tags

    | カラム名 | データ例 |
    | --- | --- |
    | user_id | 1 |
    | tag_id | 1 |

## 表示したいデータ

ユーザー一覧画面かなにかで下記の情報がほしいとする。

- ユーザーID
- ユーザー名
- ユーザーメールアドレス
- タグ名（設定されているものすべて）

## 方法

### データの取得

任意のファイルで下記のように記載してデータを取得する。（１つ目のincludeでusers → user_tags間のリレーションを設定、２つ目のincludeでuser_tags → tags間のリレーションを設定）

```ts
import type { LoaderFunctionArgs } from "@remix-run/cloudflare";

export const loader = async ({ context }: LoaderFunctionArgs) => {
  try {
    return await context.db.users.findMany({
        include: {
          user_tags: {
            include: {
              tags: true
            }
          }
        }
      });
  } catch (error) {
    console.error("Failed to load users:", error);
    throw new Response("Internal Server Error", { status: 500 });
  }
}
```

### 取得したデータを展開

下記の様に記載することでリレーション先のリレーション先の情報を展開する事ができる。（単純に一個一個展開してくだけ）
展開時にはschema.prismaで定義されているモデル名（テーブル名）を使うので注意する（`userTag.tags.name`の`tags`の部分とかうっかりして`tag`にしててデータが取れないという事が稀にある）
schema.prismaを更新したら`npx prisma generate`を実行しないと反映されないので注意する。

```ts
<div>
  {jobs.map((user) => (
    <ul>
      <li>{user.id}</li>
      <li>{user.name}</li>
      <li>{user.email}</li>
      {user.user_tags.map(userTag => (
        <li key={userTag.id}>{userTag.tags.name}</li>
      ))}
    </ul>
  ))}
</div>
```
Ubuntuにesp-idfをインストールする

## 概要

UbuntuでESP-IDF (Espressif IoT Development Framework) をインストールする手順を説明します。esp-idfはESP32やM5StackなどのEspressifデバイスで使用される開発環境です。

```
Ubuntu 24.04
```

1. **依存関係のインストール**
   最初に、システムに必要な依存関係をインストールする必要があります。UbuntuやDebianベースのシステムでは、次のコマンドを使います：
   
   ```bash
   sudo apt-get install git wget flex bison gperf python3 python3-pip python3-setuptools cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0
   ```

2. **ESP-IDF のダウンロード**
   Gitを使用してESP-IDFリポジトリをクローンします：
   
```bash
mkdir -p ~/esp
cd ~/esp
git clone -b v5.4.1 --recursive https://github.com/espressif/esp-idf.git   
 ```

3. **環境変数の設定**
   ESP-IDFの環境変数を設定するために、`install.sh` スクリプトを実行します。これにより、ツールチェーンとESP-IDFがインストールされます。
   
   ```bash
   cd ~/esp/esp-idf
   ./install.sh
   ```

4. **ESP-IDFの環境変数をシェルに追加**
   新しいターミナルセッションごとにESP-IDFの環境変数を有効にするため、`export.sh`スクリプトを実行する必要があります。

   ```bash
   . $HOME/esp/esp-idf/export.sh
   ```
   
これを`.bashrc`や`.zshrc`に追加して、シェルが起動するたびに自動的に設定されるようにすることもできます。シェルの設定ファイルに追加するには、以下の行を`.bashrc`や`.zshrc`に追記します。
   
   ```bash
   source $HOME/esp/esp-idf/export.sh
   ```

5. **プロジェクトの作成とビルド**
   ESP-IDFを使用して新しいプロジェクトを作成し、ビルドしてみましょう。例えば、`hello_world`プロジェクトをビルドするには：
   ```bash
   cd ~/esp
   cp -r $IDF_PATH/examples/get-started/hello_world .
   cd hello_world
   idf.py set-target esp32
   idf.py build
   ```

これでESP-IDFがLinuxシステムにインストールされ、プロジェクトの開発を開始できます。ESP-IDFの具体的な使い方やAPIについては、公式のドキュメントやチュートリアルを参考にしてください。

## 参考資料
esp-idf
https://github.com/espressif/esp-idf
CoreMP135のパーティションサイズをMicroSDカードに合わせて拡張する

### 概要

CoreMP135にインストールした直後のBuildrootは、MicroSDカード容量に関わらず、107MBのディスク容量しか確保されていません。最初にこの容量が設定されているのは、様々なサイズのMicroSDカードの容量に対応するためと、MicroSDカードにファームウェアのイメージファイルを書き込む時間を短縮するためです。

CoreMP135には、パーティションサイズ拡張のスクリプトが用意されており、これをCoreMP135にログインした後に、直接実行してsdcardに合わせて自動拡張を行います。再起動することで、CoreMP135のパーティションサイズを拡張することができます。

この手順は、M5_CoreMP135_debian12_20240507 ・ M5_CoreMP135_buildroot_20240508 以降のバージョンのファームウェアで行うことができます。

### ディスク容量を拡張手順

まずは、dfコマンドで、現在の容量を確認します。
107MBのディスク容量しか確保されていません。

```

$ df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root               107.0M     37.0M     61.5M  38% /
devtmpfs                156.0M         0    156.0M   0% /dev
tmpfs                   220.5M         0    220.5M   0% /dev/shm
tmpfs                   220.5M     48.0K    220.5M   0% /tmp
tmpfs                   220.5M     36.0K    220.5M   0% /run
```

/usr/local/m5stackパスにresize_mmc.sh拡張スクリプトが用意されており、CoreMP135にログインした後、これを直接実行して自動拡張を行い、再起動することができます。

```
$ cd /usr/local/m5stack/
$ ./resize_mmc.sh
```

しばらく、パーティション拡張の処理が実行されるので"reboot"と出てくるまで待ちます。
```

Number  Start (sector)    End (sector)  Size       Code  Name
   1              34             200   83.5 KiB    8300  fsbl1
   2             201             367   83.5 KiB    8300  fsbl2
   3             368            3385   1.5 MiB     8300  fip
   4            3386            7481   2.0 MiB     8300  u-boot-env
   5            7482       120881118   57.6 GiB    8300  rootfs
Partition GUID code: 0FC63DAF-8483-4772-8E79-3D69D8477DE4 (Linux filesystem)
Partition unique GUID: 549C80E0-A7FA-42CB-87B7-810481D4D26F
First sector: 7482 (at 3.7 MiB)
Last sector: 120881118 (at 57.6 GiB)
Partition size: 120873637 sectors (57.6 GiB)
Attribute flags: 0000000000000004
Partition name: 'rootfs'
Please restart!
```

再起動した後に、dfコマンドで、容量を確認します。
容量が拡張されていることがわかりました。

```
# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root                54.0G     37.0M     51.7G   0% /
devtmpfs                156.0M         0    156.0M   0% /dev
tmpfs                   220.5M         0    220.5M   0% /dev/shm
tmpfs                   220.5M     48.0K    220.5M   0% /tmp
tmpfs                   220.5M     32.0K    220.5M   0% /run
```


### 参考資料

CoreMP135 partition expansion
https://docs.m5stack.com/en/guide/linux/coremp135/fdisk

/usr/local/m5stack/resize_mmc.sh
https://github.com/m5stack/CoreMP135_buildroot-external-st/blob/st/2023.02.10/board/m5stack/overlay/usr/local/m5stack/resize_mmc.sh
PlateUp!から学ぶ開発生産性

最近PlateUp!というゲームにハマって会社の同期と何度かプレイしていたんですが、その中でこのゲームの本質は開発組織における開発生産性と近しいのでは？という話が出たのでその話をします。

この記事は私の個人ブログにも投稿しています。

https://asunaroblog.net/blog/667d6a6cc034b1bff6bf1d65

# PlateUp!ってなに？
PlateUp!はSteamで販売されているインディーゲームです。
内容としてはレストラン経営をするアクションゲームで、ホール・キッチンのタスクをこなしながら客を捌いていき、稼いだお金で店を拡張することを目指します。（Overcookedにホールの要素が加わっているといえばわかりやすいでしょうか）

そもそものゲーム自体がめちゃめちゃ面白いのでプレイしたこと無い方は開発生産性に興味なくても一度プレイすることを強くおすすめします。

https://store.steampowered.com/app/1599600/_/?l=japanese


# PlateUp!のどこが開発生産性と関係してるの？
このPlateUp!、タイトルがアッパーキャメルケースになっていること以外にも様々な要素がエンジニアリングと関係しています。

## リソース効率よりフロー効率
リソース効率とフロー効率はPlateUp！と開発生産性を比較するうえで最も意識すべき概念です。
PlateUp!ではどれだけ仕事をしようと客に料理（価値）を届けられなければ意味がありません。
早く料理を提供しなければ客は怒ってかえってしまいますし、1人でも客が起こると強制閉店させられます。（シビアすぎる...）
![20240413153705.jpg](https://storage.googleapis.com/p_641d41d3a492e5ac4c9226fe/2fc6e4fe-7909-4da8-888c-00fae62a004c/20240413153705.jpg)

逆に暇な時間があったとしても、客に料理を提供できているならそれでいいのです。
特に複数人で仕事をする際にはどうしても待ちが発生しがちですし、タスクがなくなるときもあります。
そういうときに別のタスクをすると他の人の導線の邪魔をすることになったり、タスクによっては失敗率が高くなったりします。（肉を焦がしたり、焼きすぎたり...）

![37fa990a-ffa7-45ad-82df-5eed827e7d57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576149/0345e6d3-9ebc-f5ab-6c6e-216f5d5d41c8.png)


プロダクト開発でもしばしば同様の現象が起こります。
チームでの開発なので当然営業さんとの調整による待ちやデザイナーからのデザイン待ちはあります。
そんな時に無理にリソースの空きを潰す必要はないのです。
大切なのは顧客にできるだけ早く価値を届けること。
そのためには自分の稼働率を上げることよりもむしろ他メンバーの状況把握に時間を使ったほうがいいことも往々にしてあるのです。

## 4keys
4keysは開発組織におけるパフォーマンスを示す代表的な指標です。

https://newrelic.com/jp/blog/best-practices/what-is-four-keys

4keysは以下の4要素からなっています。
- デプロイ頻度
- リードタイム
- 変更障害率
- 平均修復時間

開発組織における4keysはPlateUp!の以下の4要素に対応すると考えることができます。
- 料理提供頻度
- 一皿の提供スピード
- 作業失敗率（焼きすぎ、間違ったレシピ）
- 失敗で出たゴミを捨ててゴミ出しする時間

上述したフロー効率とリソース効率でも述べたように、リソース効率を高めて料理提供頻度や一皿の提供スピードを上げても作業失敗率が上がっては意味がありません。
また、作業に失敗した時にすぐに復旧できるレイアウトを組んでいないと致命的な遅延を招き、最悪店を潰すことに繋がります。

このようにPlateUp!をプレイしているとこのゲームの攻略法がそのまま開発生産性の文脈にアナロジーとして引用できることに気づきます。

# 私がPlateUp!から学んだこと
## 関心事はなんで増やしちゃいけないの？
プロダクト開発ではしばしば関心事を増やすことを悪と考え、WIP制限などの取り組みが取り入れられることもあります。
これはなぜかといえば、もちろんフロー効率の観点で価値を一つ一つ素早く提供すべきという考え方があるからですが、PlateUp!をプレイしているとこれ以外にも
- 余裕がなくなって失敗率が上がる
- 全体を把握する暇がなくなる

などの弊害があることに気づけます。

## チームの人数によって最適な立ち回りは異なる
一般的にチームメンバーが少なくてもタスクの種類はそれに比例して減ったりはしません。
ですので、チームメンバーが少ないと一人一人の関心事は基本的に増えます。
こういう状態だと各メンバーの稼働率がチーム全体のフロー効率に直結したりします。（スタートアップが激務になりやすいのはこういう側面もあると思います。）

一方でチームメンバーが増えてくると一人一人は専門のタスクに集中するようになり関心事がどんどんと減っていきます。
ですがその分どうしても視野が狭くなって他メンバーに不満を溜め込んだり、全体の目標認識が疎かになったりします。
チームメンバーが増えて自分の専門タスクに集中できるようになっても常に全体が見える余裕は持っていたいものです。

## 結局最後は自動化に行き着く
結局自動化こそフロー効率もリソース効率も向上させる最高の手段です。
自動化さえされれば少ない人数でも多くの価値を顧客に届けることができます。
ただ、自動化には専門知識がいるというのはどこの世界でも変わらないようで...![header.jpg]

https://www.youtube.com/watch?app=desktop&v=cW9c-tzY574

# まとめ
今回はPlateUp!というゲームをやっていて私が気づいたことをつらつらと書きました。
普段の業務でも開発生産性を意識はしていますが、PlateUp!をやっていると別視点で開発生産性を見直せて個人的には大きな学びがありました。

ところでこれだけ色々語っておきながら、実は私はPlateUp!をソロで15日目までクリアできたことがありません。
いつかクリアしたいな～と思いながらのんびりバイトする今日このごろです。
Apple Developerで新規Identifierを追加する方法

:::note info
2024/06/27 時点での情報です。差分、変更、その他気がつきましたらコメント、修正依頼お願いいたします🙇
:::

# やること

## Xcode上で新規アプリの `Bundle Identifier`を確認する
Xcodeを開き、下図のように `TARGETS`を選択し、 `Signing & Capabilities` を見ると確認することができる。
![スクリーンショット 2024-06-27 23.36.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171702/4476cb63-f96a-3760-4368-9b1cfe904528.png)

## Apple Developerの `Certificates, Identifiers & Profiles` を開く
以下のリンクを開きます。 Apple Developerのアカウントでログインしてください。
https://developer.apple.com/account/resources/identifiers/list

## 新しいIDを追加
Identifiersの `+`アイコンをクリックして新しいIDを追加していきます🐣
![スクリーンショット 2024-06-27 23.50.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171702/c49f35ab-0245-f7af-5887-4ed1d93574f4.png)

## `App IDs`を選択
![スクリーンショット 2024-06-27 23.50.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171702/b674f898-3bcf-0218-fc91-59ef69a6b8fb.png)

## Identifierのtypeを選ぶ
`App`を選択する。
![スクリーンショット 2024-06-27 23.50.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171702/e5c5fd73-166f-fd2d-ebb5-f1cf8159fe20.png)

## `Bundle ID`と`Description`を埋める
- Bundle IDには先ほど確認した IDを記入
- Descriptionには適当な説明を入れておく
![スクリーンショット 2024-06-27 23.51.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171702/391f334e-647b-baa0-9d84-a1f5d2932515.png)

## 最終確認
問題がなければ、`Register`をクリックして完了！
![スクリーンショット 2024-06-27 23.51.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171702/03a88909-2b5b-cf28-10b9-973f9115b718.png)