OmniAICreator/Qiita-1.07M huggingface dataset:
Googleのソフトウェアエンジニアリング ―持続可能なプログラミングを支える技術、文化、プロセス　を読んだまとめ

# Googleのソフトウェアエンジニアリング ―持続可能なプログラミングを支える技術、文化、プロセス

ソフトウェア開発会社としてのGoogleをテーマとし、Googleの開発チームが従う哲学、プロセスを示す書籍。
序盤の、概念・文化についてのところを読んでみた。

1. [ソフトウェアエンジニアリングとは何か](#ソフトウェアエンジニアリングとは何か)
    1. [時間と変化](#時間と変化)
    1. [Hymmの法則](#hymmの法則)
    1. [時間とスケール](#時間とスケール)
    1. [トレードオフとコスト](#トレードオフとコスト)
1. [文化](#文化)
    1. [チームでうまく仕事をするには](#チームでうまく仕事をするには)
        1. [結論](#結論)
1. [ここまで読んでみて](#ここまで読んでみて)

## ソフトウェアエンジニアリングとは何か

### 時間と変化

寿命が短いソフトウェア、プロジェクトについては、その維持をあまり考える必要はない（使い捨て）。

しかし、Google検索、Apacheのように無限に継続すると思われるプロジェクトは、それを維持する中で長期的なアップデートが必要。

### Hymmの法則

Hymmの法則：あるAPIを使用するユーザーが十分いれば、そのシステムのあらゆる観察可能な挙動に対して依存するユーザーが現れる

つまり、十分ユーザーがいれば、変更すること自体がユーザーへの大きな影響となる。（緩和はできるけど根絶はできない）

何も変更しないことを前提とするのも現実的ではない。（セキュリティパッチを適用できないと詰む）

### 時間とスケール

プロジェクトが持続するなかで、人的資源やコンピューティング資源はスケールしていく。

### トレードオフとコスト

Googleレベルの会社だと、開発のコストに社会コスト（社会への影響）を含むことは避けられない。

上記のような観点から、持続可能なコードベースを保持していくための有用なフレームワークを提示したい。

## 文化

### チームでうまく仕事をするには

エンジニアは、未完成の仕事を公開することを嫌がる、怖がる傾向がある（批判されたくない　わかる！）

しかし、それは大きな問題である。

- 間違ってても気付けない
- 自分が消えればプロジェクトが終わる
- 人の目が多ければ多いほど、フィードバックループが得られる

隠れることはリスクが多い！

こういった効果のあるチームを作る方法：謙虚、尊敬、信頼

Google的であること：強力なリーダーシップを表象し、「謙虚、尊敬、信頼」を体現するものとして我々が求める、属性と品行のセット。

フィードバックを尊重する、現状に立ち向かう、ユーザーを第一に置く、チームを思いやる、正義を為す

#### 結論

チームをめぐって、謙虚と信頼と尊敬に根差した健全な文化が必要。リスクを取ってときには失敗もすることが必須となる。人々がそうした失敗を受け入れるには、健全なチーム環境が存在しなければならない。

## ここまで読んでみて

チーム内で個人が分断されている状況では開発・保守はうまくいかないということだと思う。これまでのプロジェクトでの経験でも感じたところ。

関係者同士でピリピリしてコミュニケーションとりづらい状況だといろいろ難しいね…。
localhost: 毎日使っているけれど、その仕組みは意外と知られていない

# はじめに

この記事は、株式会社スピードリンクジャパン Advent Calendar 2024 の6日目の記事です。 

https://qiita.com/advent-calendar/2024/slj

エンジニアであれば、localhostという言葉を何度も耳にしたり、実際に使ったことがあるでしょう。日常的に使われるため、その存在を意識することはほとんどないかもしれません。しかし、`localhost`とは何なのか、どのように機能するのかを深く理解することで、そのシンプルさと便利さに気付くことができます。

この記事では、`localhost`の仕組みについて解説します。

# localhostとは？
`localhost`は、**現在使用しているデバイス自身を指すホスト名**です。簡単に言えば、コンピュータに「自分自身と通信して」と指示を出すための仕組みです。この通信はデバイス内部で完結し、外部ネットワークを経由しません。

例えば、ブラウザで`http://localhost`と入力すると、そのリクエストはコンピュータ内で動作しているウェブサーバー（例: Rails、Django、Node.jsなど）に送信されます。このやり取りは、**ループバックインターフェース (Loopback Interface)** と呼ばれる仮想的なネットワークインターフェースを通じて行われます。

# localhostを支えるループバックインターフェース
ループバックインターフェースは、`localhost`を実現するための仮想的なネットワークインターフェースです。このインターフェースは、Wi-Fiやイーサネットのような物理的なネットワークインターフェースとは異なり、同じマシン内で通信を処理します。これにより、外部ネットワークを経由することなく、デバイス内部での安全かつ効率的な通信が可能となります。

### 1. 予約済みIPアドレス範囲
ループバックインターフェースで使用されるIPアドレスは、OSによって特別に予約されています。

- IPv4: 127.0.0.0/8（通常は127.0.0.1を使用）
- IPv6: ::1

これらのアドレスは外部ネットワークには送信されず、同じコンピュータ内でのみ使用されます。この仕組みにより、外部へのデータ漏洩の心配がなく、安全に通信できます。

### 2. OSのルーティングテーブルによる通信経路の制御
ネットワーク通信の経路は、OSに備わるルーティングテーブルによって管理されています。

`127.0.0.1`や`::1`宛てのリクエストは、物理的なネットワーク（Wi-Fiやイーサネット）を経由せず、直接ループバックインターフェースに送信されます。
他のIPアドレス宛ての通信とは異なり、外部ネットワークへの転送が発生しないため、通信が非常に高速で、外部環境に依存しません。

**ルーティングテーブルの確認方法**

Linux/macOSの場合:

```
netstat -rn
```

または

```
route -n get 127.0.0.1
```

これらのコマンドを使えば、通信がどの経路を通っているのかを確認することができます。


### 3. インターフェース名
ループバックインターフェースは、OSによって特定の名前が付けられています。

- Unix系OS: 通常はlo（loopbackの略）
- Windows: 名前は明示的には表示されませんが、仮想的なネットワークインターフェースとして動作します。

# localhostの仕組み: ステップごとの解説

### 1. ホスト名の解決
localhostにアクセスすると、システムがhostsファイルを確認し、ホスト名をIPアドレスに解決します。

- Linux/macOS: `/etc/hosts`
- Windows: `C:\Windows\System32\drivers\etc\hosts`

**hostsファイルの一般的なエントリ:**
  
```
127.0.0.1 localhost
::1       localhost
```

**hostsファイルの確認方法:**

管理者権限でテキストエディタを開きます。

Linux/macOSの場合:

```
sudo nano /etc/hosts
```

### 2. リクエストのルーティング
`127.0.0.1`または`::1`に解決されると、OSはリクエストを物理ネットワークデバイスを介さずにループバックインターフェース経由で内部ルーティングします。

### 3. アプリケーションのバインディング
ウェブサーバーなどのアプリケーションは、`127.0.0.1`にバインドしてリクエストを受け付けます。
ループバックインターフェースへのバインディングは、ローカル通信のみを許可することでセキュリティを確保します。

### 4. 処理と応答
リクエストはローカルアプリケーションで処理され、応答がループバックインターフェースを通じてクライアント（例: ブラウザ）に返されます。

# 通常のネットワークフローとlocalhostフローの比較
### 通常のネットワークフロー
1. ユーザーが`http://example.com`のようなURLをリクエストします。
2. ホスト名がDNSサーバー(ドメイン名をIPアドレスに変換するシステム)でIPアドレスに解決されます。
3. リクエストは物理ネットワーク（例: Wi-Fi、イーサネット）を介してターゲットサーバーに送信されます。
4. サーバーがリクエストを処理し、応答をネットワーク経由で返します。

### localhostフロー
1. ユーザーが`http://localhost`をリクエストします。
2. ホスト名がhostsファイルで`127.0.0.1`に解決されます。
3. リクエストはループバックインターフェースを通じて内部ルーティングされます。
4. ローカルサーバーがリクエストを処理し、応答を内部的に返します。

### 比較表

|項目|通常のネットワークフロー|localhostフロー|
|---|---|---|
|ホスト名の解決|DNSサーバーを使用|hostsファイルを使用|
|ルーティング|物理ネットワークを介して外部サーバーに送信|ループバックインターフェースを通じて内部的に送信|
|通信速度|ネットワークの遅延に依存|非常に高速（内部通信）|
|セキュリティ|外部リスクにさらされる可能性あり|ローカルマシン内で完結し、安全性が高い|

# 結論
`localhost`は単なるネットワークツールではなく、ローカル開発、テスト、診断の中心的な存在です。ループバックインターフェースを活用することで、`localhost`は安全かつ効率的にデバイス内の通信を可能にします。
毎日のように使われる`localhost`ですが、その仕組み（ループバックインターフェース、hostsファイル、ルーティングテーブルなど）を理解することで、その潜在能力を最大限に活かすことができます。
特徴量エンジニアリング　最終日

特徴量エンジニアリングの最終日です。

今日は

https://www.kaggle.com/code/ryanholbrook/target-encoding

の確認を行います。
特徴量エンジニアリングにおいて、２日目にカテゴリー変数をdummy化したりしましたが、それらは目的変数がない場合でした。今回は目的となる変数がある場合にカテゴリ変数をあつかうtarget encodingについてです。
基本的に原文に従うと引っ掛かりどころは少ない印象です。途中に出てくるCode

```
autos.groupby("make")["price"].transform("mean")
```
は、groupby→transformとつながっています。はじめてみると少し戸惑いますが、groupbyの使用で一般的な形でなので、そのまま覚えてしまって問題ありません。ここではmake-priceの平均を出し、"make_encoded"ラベルの列をつくっています。（平均エンコーディング）これにより、カテゴリ変数だったものを上手にデータとして使えます。
smoothingについては英語を機械翻訳などでしっかりと確認すると特につまづきはないかと思います。

そのあと、MEstimateEncoderがでてきますが、これは上で学んだことを理解したうえで使うscikit-learnの公式実装です。

https://contrib.scikit-learn.org/category_encoders/mestimate.html

によると、Target Encoderをよりシンプルにしたもの（ハイパーパラメータがすくない）です
。 mの値が大きいと、smoothingが急激に変化します。
【Ruby】コードからsleepの特徴を学ぶ

# はじめに 

こんにちは！アメリカの大学で語学を学びながら、独学でソフトウェアエンジニアを目指している者です。

今日は Ruby の `Time` クラスで `Time.now` と `sleep` を使った場合に生じる意外な誤差について解説します。このテーマは、一見すると「時間計測にズレが生じているのは、`Time.now`を処理する時間だから？」と誤解しやすく、とても興味深い話題です。私自身も最初はそう思ったのですが、実際には異なる原因があるようです。詳しく見ていきましょう。

## コード例とその疑問

まずは以下のコードを見てください。

```ruby
t1 = Time.now
sleep 10
t2 = Time.now

p t1 < t2           # => true
p t2 - t1           # => 10.012828
```

ここで疑問になるのは、「`t2 - t1`の結果がちょうど10秒ではなく、`10.012828`のように誤差があるのはなぜなのか？」という点です。

私も最初は「この誤差は `Time.now` の処理にかかる時間なのか？」と思いましたが、実はそうではないようです。この誤差の主な原因について詳しく解説します。

## 誤差の主な原因

### 1. `sleep`の精度

Rubyの`sleep`メソッドは、指定した秒数だけスレッドを停止させますが、この停止が完全に正確に行われるわけではありません。`sleep` の実行時間には、以下のような要因でわずかな誤差が生じます。

- **オペレーティングシステムのスケジューリング**：OSがプロセスのスケジューリングを行う際、処理の順番やタイミングが影響することがあります。そのため、厳密に10秒のスリープであっても、若干の遅延が発生することがあります。
- **プロセス切り替えの時間**：スリープ終了時に、他のプロセスからRubyプロセスに戻るまでのタイムラグがわずかに生じることがあります。

これらの理由から、`sleep 10` の後に計測した時間差が「10秒ぴったり」ではなく、`10.012828`のように少し長くなることがあります。つまり、**今回の誤差の主な原因は、`sleep`の精度によるもの**です。

### 2. `Time.now`の精度

もう一つの要因として、`Time.now`の精度も関係しています。`Time.now` は高精度で現在時刻を取得しますが、そのタイミングによって微小なズレが生じることがあります。このズレは非常に短いため、通常は無視できる程度のものですが、`sleep`による誤差と組み合わさると、結果として数ミリ秒の誤差が生じることがあります。

## `Time.now`の処理時間を計測するには？

`Time.now`の処理にどれくらい時間がかかるのか？を実際に測定したい場合、`Benchmark`ライブラリを使うことで計測できます。

```ruby
require 'benchmark'

execution_time = Benchmark.realtime do
  Time.now
end

puts "Time.nowの処理時間: #{execution_time}秒"
```

### 出力例（環境に依存しますが非常に小さい値になるはずです）：

```
Time.nowの処理時間: 0.000005秒
```

この結果から、`Time.now`の処理時間はほぼ無視できるほど短く、今回の誤差に影響していないことがわかります。

## まとめ

今回のコード例では、`t2 - t1`の結果に含まれる誤差は、主に`sleep`メソッドの精度とOSのスケジューリングによるものであり、`Time.now`の処理時間が主な原因ではありません。`sleep`の仕様により、指定した時間に対してわずかなズレが発生することがあるため、この点を理解しておくことが重要です。

Rubyで時間を扱う際には、このような微妙な誤差が生じる可能性があることを念頭に置き、必要に応じて適切に対処することが求められます。例えば、非常に正確な時間計測が必要な場合には、`Benchmark`ライブラリを使うことが推奨されます。
OCI 2024 Foundations Associate Certification 資格受けました

## 1. OCI Foundations Associate 試験とは？
### 種類と概要
OCI Foundations Associate は、Oracle Cloud Infrastructure（OCI）の基礎知識を問うエントリーレベルの認定資格です。この資格は、クラウドコンピューティングの基本を学びたい人や、OCI のサービスについて理解を深めたい人に最適です。


### 対象となる受験者
初心者向けの資格試験であり、ITに関する基礎知識がある方であればスムーズに取り組めます。クラウドや OCI に全く触れたことがない人でも、適切な学習計画を立てれば十分合格が可能です。

## 2. 勉強時間と試験
試験対策としてはこの講義ビデオだけで十分かと思います。不安な方は、他のサイトで模擬試験を探すと見つかるかと思います（この記事では紹介しません）。

試験の申込みも、この [Oralce Mylearn](https://mylearn.oracle.com/) から行います。このため、まずはアカウントを作成しておきましょう。無料で作成できます。

推奨教材とリソース
効率的な学習のためには、以下の教材を活用します：
Oracle Learning Explorer で無料の「OCI Foundations Associate」を検索して、受講します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3505194/434bbbcb-a581-c932-f7b4-1bfd216fbdd5.png)
コースの勉強時間が7時間ぐらい。

Oracle の公式ドキュメントは、サービスの詳細な使い方を理解するのに役立ちます。
模擬試験:
Udemy、ExamTopics などで提供されている模擬試験を利用し、実際の試験形式に慣れましょう。
試験に出題される主なトピックを把握します。公式サイトに掲載されている試験範囲は次の通りです：
- OCI の基本コンセプト
- クラウドの基本概念や OCI の特徴
- 主要な OCI サービス
- Compute（仮想マシン、ベアメタル）
- Storage（オブジェクトストレージ、ブロックストレージ）
- Networking（VCN、サブネット、セキュリティリスト）
- Autonomous Database、Database Service の概要
- OCI のセキュリティメカニズム（IAM、ポリシー）
- 運用管理ツールとコスト管理
- リソースのモニタリングとコスト管理の基本

### 3. 試験の申し込み方法
OCI Foundations Associate 試験は申し込み必要なし、無償で、すぐに受けられます。
受験回数は 15 回までの制限があります。
学習コンテンツのページ(Oracle Learning)から認定試験の「Get Started」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3505194/7ef8f263-ca8d-9cc4-e047-1774c0f5a1d3.png)
試験時間:60分
質問数:40
合格スコア:65%

このガイドに従うことで、OCI Foundations Associate 2024 試験を効率的に準備し、合格を目指すことができます。応援しています！
「docs.rs書くのめんどくさくない？」をできるだけ楽にした話

# はじめに
こんにちは。細々とプログラミングをしている[sotanengel](https://x.com/sota_eng_prog)です。

以前、[初めてRustのクレートをリリースする](https://qiita.com/sotanengel/items/148c28a8b1e1eb7e51ca)って記事を書いたんですが、
- docs.rsの書き方いちいち調べるのめんどくさい
- フォーマットに準じて書けているのかいるのか分からず、(最も重要な)コーディングの時間が削られる

という体験をしたので、docs.rs形式でいい感じに表示されるようなコメント文をコードに自動挿入するCLIを作成してみました！！

イメージはこんな感じ👀
(コメントすべき位置になんの説明を書くべきか、がいい感じに挿入されている)

| Before                                         | After                                         |
| ---------------------------------------------- | --------------------------------------------- |
| <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1758960/3651e020-635b-f10f-b650-896fc15d4f9b.png" width="300"> | <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1758960/74f727fd-3096-bd76-8d62-45c8497e102d.png" width="300"> |

本記事では使い方をざっくり説明するので、もし使ってみたい方は以下ご覧ください！
具体のコードが気になる方は、以下にリンクを貼っておくのでまずそっちをご覧くださいませ。

https://github.com/sotanengel/gen_docs_template

https://crates.io/crates/gen_docs_template


以下、作成したクレートの使い方・やったことをまとめていきます👀

# 使い方
## 1. クレートをインストールする
以下のコマンドでCLIをインストール。

```bash
cargo install gen_docs_template
```

## 2. Rustのコード内部で実行する
cargoプロジェクト内部で以下のコマンドを実行する。
(srcフォルダ内部のRustコードのファイルにコメントが全て付与されます)

```bash
gen_docs_template
```
## 補足
上記のコマンド以外にも以下の引数をカバーしています👀
(最新の情報は[ライブラリのページ](https://crates.io/crates/gen_docs_template)を参照くださいませ)

| 引数 | 引数の説明     | 実行例       |
| --------- | -------------- | --------------- |
| 引数なし | srcフォルダ内部の全てのrsファイルに対してコメントテンプレートを挿入する | `gen_docs_template` |
| -path  | `hoge`フォルダ内部の全てのrsファイルに対してコメントテンプレートを挿入する | `gen_docs_template -path hoge` |
| hard | 過去のコメント実行履歴を全て無視して、`src`フォルダ内部の全てのrsファイルに対してコメントテンプレートを挿入する | gen_docs_template hard  |

# ⭐️推し⭐️ポイント
技術的にすごいことはしてませんが、自己満でアピりたいところを書きます。

## 1. テンプレート文がどこにあるかわかりやすいようにした
テンプレート文の頭文字を`WIP_`で統一したので、検索機能などを使うことでコメントのつけ忘れを簡単に見つけることができます！

## 2. テンプレート文を一括で選択して消しやすいように`_(アンダーライン)`で繋いだ
アンダーラインで繋ぐと、エディタ上でタブルクリックした時に一括で一行分選択してくれるんですよ、便利だね！

## 3. コメントを付与した履歴ファイルを作成した
`gen_docs_template`コマンドを実行すると、`.gen_doc_his`というファイルが実行ディレクトリ上に作成されます。これにより、一度コメントを付与したファイルにはコメントが付与されなくなります。

## 4. 履歴ファイルをgitの履歴に載せないようにした
今回のライブラリはコメント作成の補助ツールでしかないので、`.gen_doc_his`の差分って必要ないかなと思い、`gen_docs_template`を実行したときに`.gitignore`ファイルに`.gen_doc_his`を追加するようにしました。

# さいごに
自分で使っていくように作成したのですが、もし何かしらバグなど見つけた方はリポジトリのissueで報告いただけますと幸いです！

https://github.com/sotanengel/gen_docs_template/issues
ESP32-H2-MINI-1のMatterファームウェア書き込み

# ESP32-H2-MINI-1
Bluetoothやthread通信に対応しています(Wifiは非対応)
Wifiはできないので逆にthreadでMatter通信していることがわかるモジュールです。

## 使用した回路
今回このような回路を使用しましたがESP32-H2-DevKitM-1を参考にした方がいいと思います。

![ESP-matter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195542/2d3e328a-e683-521e-79d4-b19cf99fae5f.png)

ESP32-H2-DevKitM-1:

https://espressif-docs.readthedocs-hosted.com/projects/esp-dev-kits/en/latest/esp32h2/esp32-h2-devkitm-1/user_guide.html

# 環境構築
公式ドキュメントに沿って個人的に悩んだ部分の補足を追記していきます

https://docs.espressif.com/projects/esp-matter/en/latest/esp32h2/developing.html

## 2.1.1.1 Windows 10
Windows10上でセットアップを行ったのでwslからUSBdeviceへアクセスできるようにします
Ubuntuは22.04が良いです
windowsPowershellにてwslのアップデート
```
wsl --upgrade
```
あとは：

https://learn.microsoft.com/ja-jp/windows/wsl/connect-usb

## 2.2 ESP Matter Setup
apt-getの取得元サーバーを日本のいい感じのサーバーする
```
sudo sed -i.bak -r 's@http://(jp\.)?archive\.ubuntu\.com/ubuntu/?@https://ftp.udx.icscoe.jp/Linux/ubuntu/@g' /etc/apt/sources.list
```
変更しない場合下記commandで失敗するかもしれない
```
sudo apt-get install git gcc g++ pkg-config libssl-dev libdbus-1-dev \
     libglib2.0-dev libavahi-client-dev ninja-build python3-venv python3-dev \
     python3-pip unzip libgirepository1.0-dev libcairo2-dev libreadline-dev
```

## 2.2.2 ESP Matter Component (experimental)
esp-matterの階層で実行
```
idf.py add-dependency "espressif/esp_matter^0.0.2"
```
`idf_component.yml` のインデントスペースが2スペースでなければだめと怒られるので書き換える

## 2.2.4 Flashing the Firmware
`esp-matter/exsample/どれか` の階層で実行
今回は`esp-matter/examples/light`

```
idf.py set-target esp32h2
```
cmakeが3.22だと↑のコマンドがうまくいかなかった
3.16をインストールする。

`idf.py flash monitor`で書き込み実行します。
threadボーダールーターが必要となるので`Google Nest Hub`を使用します。

https://www.matteralpha.com/frequently-asked-questions/complete-list-thread-border-routers



ESP32-H2-DevKitM-1におけるGPIOの設定
sdkconfig.defaults.esp32h2ファイルを見るとDEVKIT向けにLEDとボタンが設定されているのでLEDとスイッチをファイルにあわせて配線すると動きます。

```sdkconfig.defaults.esp32h2
# ESP32-H2-DevKitM-1 Settings
# Buttons
CONFIG_BSP_BUTTONS_NUM=1
CONFIG_BSP_BUTTON_1_TYPE_GPIO=y
CONFIG_BSP_BUTTON_1_GPIO=9
CONFIG_BSP_BUTTON_1_LEVEL=0
# LEDs
CONFIG_BSP_LEDS_NUM=1
CONFIG_BSP_LED_TYPE_RGB=y
CONFIG_BSP_LED_RGB_GPIO=8
CONFIG_BSP_LED_RGB_BACKEND_RMT=y
```


# プロジェクトを立ち上げる
元々いろいろなサンプルプロジェクトがあるので自分にあうものを選択する

https://github.com/espressif/esp-matter/tree/main/examples

一からプロジェクト立ち上げる場合下記チュートリアルが参考になります。

https://mattercoder.com/codelabs/how-to-code-a-matter-app-on-esp32/#0

esp-matterを使用して開発(ほぼしてない)しましたが、直接MatterのSDKを使用して開発する事も可能です。
今回のようにほぼ何も変更する予定がないのであればESP-ZeroCodeで十分です。

https://github.com/project-chip/connectedhomeip
エンティティを整理して気付きを得る

## エンティティを整理する

今日はちょっと中級者向けの話かもしれません。

ここでいうエンティティとは、データの塊を指します。
例えば、ECサイトの売り物をイメージしてみましょう。

食品を売っているとします。食品には、品名、数量、
1セットの数量または重さ、単価、また、品質保持日数、
アレルギー表示、重さ、大きさ、要冷蔵か、などなど、
多数の項目が1個の商品に紐づいていますね。
これを、「商品エンティティ」とします。

#### ＜商品エンティティ＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156898/d91c97ba-30b7-f54c-7967-1ca8c8878668.png)


また、そのあとのデータと組み合わせたい場合、
さらに多くのオプション（水準）が付与されます。
たとえば、天気やお客様の年齢、廃棄率を知りたい、
という要求があるとして、その場合、商品エンティティに
廃棄数量を入れる必要がありますし、お客様エンティティ、
販売環境エンティティが必要になるかもしれません。

## エンティティのライフサイクル
また、エンティティにはそれぞれライフサイクルがあります。
これも、テストで考慮する大事な要素です。商品なら、入荷に始まり、
出荷あるいは廃棄にいたるまでのイベントです。
このライフサイクルに関しては、エンティティとは別にモデリングをするなどして洗い出し、
エンティティの前提条件として、組み合わせたものを使います。
数が多くなる時は、抽象化を行って、数を減らすこともあります。






これらを、因子と水準、という言い方もできます。
商品という因子に対して、品名、単価、数量などの水準、ととらえることもできます。
また、商品ライフサイクルという因子に対して、入荷日、出荷日、廃棄日、などを水準、
とすることもできます。このときに、実際の取り扱いに沿ったものにする必要があるため、
ライフサイクルの洗い出しには注意が必要になるでしょう。
これは、状態遷移図で書くことが多いです。

エンティティをまとめることで、抽象化を行い、仕様を整理し、
出荷済みの商品に売上日が入るなどのコンフリクトを洗い出し、
条件を整理して、組合せテストを作るなどして活用します。

また、こうしたエンティティを整理したものは使い回しができることが多く、
カバレッジを調整しやすいポイントになります。また、データベースのスキーマについて
だけではなく、ライフサイクルなど、実際の動作・仕様が、因子と条件になることも
ポイントの一つです。


## エンティティを整理するには

- マインドマップ
- 伝統のスプレッドシート
- トレーサビリティマトリクス

などのツールがが使えます
これらの説明は、後日に譲ります。

## 整理したエンティティで、組合せテスト！
組み合わせるアイテムは、以下のものなどがあります。
- CRUD ＋ 3
- タイミング・時系列
- テスト環境（クロスブラウザ、ドメイン、他）
- アカウント種別
- エンティティ同士の組み合わせ
- 操作の組み合わせ
などなど


組合せテストの話を詳しく知りたい方は、
- All Pair法
- 直交表

などを調べてください。有名なものなので、たくさん見つかるでしょう。
（ 説明してしまうと、これだけで1ページでは足りないので )
MS Copilot にTerraformコードを書かせてみる

フリーランスエンジニアの[東](https://x.com/roulgonzaress)と申します。
現在は、[株式会社ギブリー様](https://note.com/givery_saiyo/n/neb40f30dc4f2)でお仕事を頂いております。
ここ、4年程は、Kubernetes を活用したプロジェクトに携わらせて頂いております。

## Copilot でTerrfaormコード生成
1. 構成図をアップロードしてTerraformコードを書いてもらいます。
![tf_0.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270447/011a7a29-f69d-889f-1fe4-0285a04c534e.png)

![tf_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270447/cfd89535-fb9c-2ce1-3614-bc9cdb2d17f7.png)

Copilot へのプロンプト
```
添付の構成のTerraformコードをバージョン1.9.5、AzureRM バージョン4.10.0で書いて
```
![tf_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270447/e239db0a-46ce-28c3-5eb8-beaa849eeab5.png)


2. モジュール化するようにプロンプトします。
```
このTerraformコードをモジュール化して
```
![tf_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270447/1ccc6a86-b448-8c7a-7eb8-2930488f064a.png)
![tf_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270447/68ce6a39-c719-78cd-a0e8-09100bb2f133.png)


3. 構成を文章で伝えてTerraformコードを書いてもらいます。
Copilot へのプロンプト
```
フロントにApplication Gateway、バックエンドにAzure Kubernetes Cluster、データb－エスにAzure PostgreSQL Flexble Server構成のTerraformコードをバージョン1.9.5、AzureRM 4.10.0で書いて
```
![tf_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270447/c26813e6-6f78-d87a-0aa3-e48210714642.png)
![uploading...0]()


## 試してみた雑感
- 構成図より、構成を文章で伝えたほうが良い場合もある。
　⇒今回はApplication GatewayをLoadBalnacer、AKSをVMと認識していた。
- 変数の設定などレビューをしっかり行う必要がある
- トークン数が多くなる構成の場合は、最大トークン数を指定して指示する必要がありそう。
　⇒最近は、出力トークン数も大幅に増えてはいるが。
- [AzureRM 4.0 からサブスクリプションIDを指定する必要があるので注意](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/guides/4.0-upgrade-guide#specifying-subscription-id-is-now-mandatory)
```
terraform {
  required_version = ">= 1.9.5"
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "4.10.0"
    }
  }
}

provider "azurerm" {
  features {}
  subscription_id = "00000000-xxxx-xxxx-xxxx-xxxxxxxxxxxx"  #追記
}
```
- パスワードなどの取り扱いに注意が必要
- 初回、terraform init 実行時には、リソースプロバイダーの登録が行われるので強い権限が必要です。
- 今回は for_each を使うような箇所はなかったので、for_each を使うようなものも試せればと思います。
Git mvでファイル移動時に "No such file or directory" エラーが発生した場合の対処法


# はじめに
`git mv` コマンドでファイルを移動しようとした際に "No such file or directory" エラーが発生し、ファイルを移動できないことがありました。本記事ではその原因と対処法について記載します。

# やりたいこと
`git mv` コマンドを使用して既存のPythonファイル（`sample.py`）を別のディレクトリに移動し、同時にファイル名を変更（`index.py`）する。

- 現在のフォルダ構造
```
root
└── sample.py
```

- 目的のフォルダ構造
```
root
└── test/
    └── script/
        └── index.py
```

:::note warn

本記事では`sample.py` がコミットまでされている事を想定しています。

:::


# 発生する事象
以下のコマンドを実行すると、エラーが発生します

```bash
git mv sample.py test/script/index.py

# 実行結果
fatal: renaming 'sample.py' failed: No such file or directory
```

# 原因
移動先のディレクトリ（`test/script`）が存在していないため、ファイルの移動ができない

## 解決手順
１． 移動先のディレクトリを作成
```bash
mkdir -p test/script
```

:::note info

- `-p` オプション：test ディレクトリが存在しなくても、必要な親ディレクトリ（本気でいう test）も同時に作成してくれます。

:::


２. ファイルの移動を実行
```bash
git mv sample.py test/script/index.py
```

# 実行結果の確認

１．statusコマンドで`sample.py`が対象の場所に移動できたか確認します。
```bash
git status
```

２．コマンドを実行すると次のように、ファイルが `renamed` されてることを確認できました。

```bash
git status                    
On branch main
Your branch is up to date with 'origin/main'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        renamed:    sample.py -> test/script/index.py
```


３．実行後のフォルダ構造は次のようになっています。

```
root
└─test
    └─script
            index.py
```
Oracle Apex ログイン方法カスタマイズ

# Oracle Apex ログイン方法カスタマイズ方法
## 目標
APEX 標準のログイン認証（APEX アカウント）を、データベース内のユーザーデータに基づく認証方式に変更する。

## 1. カスタムユーザーデータベースの作成
 - ステップ1: ユーザーテーブルの作成
以下の SQL を使用して、ユーザー情報を保存するテーブルを作成します。

```sql
CREATE TABLE CUSTOM_USERS (
    USER_ID NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    USERNAME VARCHAR2(50) NOT NULL UNIQUE,
    PASSWORD_HASH VARCHAR2(255) NOT NULL,
    FULL_NAME VARCHAR2(100),
    EMAIL VARCHAR2(100),
    CREATED_AT DATE DEFAULT SYSDATE
);
```
 - ステップ2: サンプルデータの追加
テスト用のデータを挿入します。

```sql
INSERT INTO CUSTOM_USERS (USERNAME, PASSWORD_HASH, FULL_NAME, EMAIL)
VALUES ('test_user', DBMS_CRYPTO.HASH(UTL_I18N.STRING_TO_RAW('password123', 'AL32UTF8'), 2), 'テストユーザー', 'test_user@example.com');

COMMIT;
```

注: DBMS_CRYPTO.HASH を使用して、パスワードをハッシュ化します。

## 2.PL/SQL 認証ロジックの作成
認証用関数の作成
以下の PL/SQL 関数を作成して、ユーザー名とパスワードを検証します。

```PL/SQL
コードをコピーする
CREATE OR REPLACE FUNCTION AUTHENTICATE_USER (
    P_USERNAME IN VARCHAR2,
    P_PASSWORD IN VARCHAR2
) RETURN BOOLEAN IS
    L_PASSWORD_HASH VARCHAR2(255);
BEGIN
    -- データベースからパスワードハッシュを取得
    SELECT PASSWORD_HASH
    INTO L_PASSWORD_HASH
    FROM CUSTOM_USERS
    WHERE USERNAME = P_USERNAME;

    -- 入力されたパスワードのハッシュを比較
    IF L_PASSWORD_HASH = DBMS_CRYPTO.HASH(UTL_I18N.STRING_TO_RAW(P_PASSWORD, 'AL32UTF8'), 2) THEN
        RETURN TRUE;
    ELSE
        RETURN FALSE;
    END IF;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        -- ユーザー名が存在しない場合
        RETURN FALSE;
END AUTHENTICATE_USER;
```

## 3. APEXの認証方法の設定
- ステップ1: APEX アプリケーションを開く
APEX にログインします。
認証を変更したいアプリケーションを選択します。

- ステップ2: 認証方式の変更
Shared Components > Authentication Schemes を開きます。
Create をクリックして新しい認証方式を作成します。
Based on a PL/SQL Function を選択。
次の情報を入力:
Name: カスタム認証
Authentication Function Name: return AUTHENTICATE_USER(:P101_USERNAME, :P101_PASSWORD);
変更を保存。
- ステップ3: ログインページのカスタマイズ
ログインページ（通常は Page 101）を編集。
P101_USERNAME と P101_PASSWORD をユーザー名とパスワードの入力項目として設定。
APEX 標準のロジックを削除。
企業との面談を通じて、転職活動をする前にgithubのリポジトリを成長すべきだったと後悔した。

# はじめに

この記事は、転職活動して気づいた「これをやっていれば.../やってよかった」をシェアしようby 転職ドラフト Advent Calendar 2024の13日目の記事です。

タイトルの通り、企業との面談を通じて、転職活動をする前にgithubのリポジトリを成長すべきだったと後悔したことについて書いています。

# 転職活動の概要
細かい活動の記録などはnote（リンクは貼りません）に記載していますので、ここでは簡単に要約を箇条書きで書くにとどめたいと思います。
私は、
* いわゆる超氷河期世代の前半と言われている時に就職活動を行った
* SES企業に就職し２０年間のキャリアを積んだ
* 50代にして初の天職活動を行なった、天職とは、SESから正社員への就職活動を指す。
* 転職活動は、マイナビ転職エージェント、マイナビ転職フェア、type転職フェアなど中心
* ビズリーチは登録するもSES案件ばかりの紹介であったため辞退
* 見事に天職活動成功し、今はハッピーな毎日を送っている

# 転職活動で必要なこと
転職であっても、新卒であっても、必要なことは、自己の能力が、企業が求めているものを満たしているか示すことす。新卒の場合は、おそらく大学名、いわゆる学歴フィルタが主なポイントとなります。しかし転職の時は、大学卒というだけではダメで、職歴などにより自己の能力を示す必要があります。

大企業であれば、大きなプロジェクトを任されて遂行したことを示せばいいですし、
論文を書いて学界で発表したことを示せばいいです。

しかし、そういうキラキラしたものがないときに、５０代となるとリストラされた人ではないのかなどと勘ぐられてしまい、思うように転職活動はできないのが現状です。

# ５０代の方への提案
最近増えてきたベンチャー企業やスタートアップ企業は、５０代の砂礫の人も求めていることがあります。ただしその場合も、自己の能力を示せないといけません。

その時の方法は、githubのリポジトリに自己の成果物を登録していくことです。

ベンチャー企業では、githubの状態を聞かれることが多く、いわゆる葉っぱが多いこと、ポートフォリオとして、pythonなどの業務で必須の言語が使えることなどを示すことが必要となります。他の若手の方と同じように見せていくことができれば、十分面接で戦えます。

昔、ベーマガやCマガ、ソフトデザインに投稿したよというだけでは、自己の能力の照明は難しくありますが、githubにリポジトリがあるだけで自己の能力を示すことができます。

# 最後に

超氷河期世代である50代の方へ、人生１００年時代においてはまだ折り返し地点です。落語家や政治家においてはまだまだひよっこの年代です、これからの人生を楽しむためにも、天職を探すこと挑戦されてはいかがでしょうか。そのためにはまずgithubのリポジトリを成長させることを忘れずに。
Advent of code 2015 を Livebook で楽しむ - まとめ -

## はじめに

Advent of code 2015 を完走しました

すべての回答を Qiita に記事として投稿したので、ここにまとめます

## 回答記事一覧
 
 ### Day 1

 https://qiita.com/RyoWakabayashi/items/2c8206e31560f1e3eae7

 https://qiita.com/RyoWakabayashi/items/393bfaa09fbde0b98627

 ### Day 2

 https://qiita.com/RyoWakabayashi/items/f0219e851d6ce5466bf2

 https://qiita.com/RyoWakabayashi/items/af0f539f04a15b6a4573

 ### Day 3

 https://qiita.com/RyoWakabayashi/items/e97fa04a1f8536ef1acc

 https://qiita.com/RyoWakabayashi/items/56f2e05684578258d7d5

 ### Day 4

 https://qiita.com/RyoWakabayashi/items/b35cd4925350a1106cdb

 ### Day 5

 https://qiita.com/RyoWakabayashi/items/5e727777da78a3717fe9

 ### Day 6

 https://qiita.com/RyoWakabayashi/items/86d380d456ae648c3309

 https://qiita.com/RyoWakabayashi/items/2e07c1dfa96e690a1d84

 ### Day 7

 https://qiita.com/RyoWakabayashi/items/2d31d32cb2f8163254a4

 https://qiita.com/RyoWakabayashi/items/818683e0831e5dadf2b7

 ### Day 8

 https://qiita.com/RyoWakabayashi/items/6a4edaee445b29a8a298

 https://qiita.com/RyoWakabayashi/items/df930f4d909167100d7a

 ### Day 9

 https://qiita.com/RyoWakabayashi/items/f19e9796e71eebcb8bb0

 ### Day 10

 https://qiita.com/RyoWakabayashi/items/3a7fc1927b741fca900a

 ### Day 11

 https://qiita.com/RyoWakabayashi/items/61c3dbce3948623fb326

 ### Day 12

 https://qiita.com/RyoWakabayashi/items/b410edf9ad8b409dd502

 ### Day 13

 https://qiita.com/RyoWakabayashi/items/a77920c48b9463611eb0

 ### Day 14

 https://qiita.com/RyoWakabayashi/items/8e52021ba8baaf8fa725

 ### Day 15

 https://qiita.com/RyoWakabayashi/items/6af8f84a73bd9c653e98

 https://qiita.com/RyoWakabayashi/items/c63ee8db39f49fff14ac

 ### Day 16

 https://qiita.com/RyoWakabayashi/items/0801c797ed31f9c9e344

 ### Day 17

 https://qiita.com/RyoWakabayashi/items/62aab5d95a85ee0e9d98

 ### Day 18

 https://qiita.com/RyoWakabayashi/items/c9bf95b7ec7dda223115

 ### Day 19

 https://qiita.com/RyoWakabayashi/items/4b06d66480b336000dc4

 https://qiita.com/RyoWakabayashi/items/acfa5fd3248f8f74b2cf

 ### Day 20

 https://qiita.com/RyoWakabayashi/items/d86917bac91ae836677f

 ### Day 21

 https://qiita.com/RyoWakabayashi/items/788a3e084cc1c65243e2

 ### Day 22

 https://qiita.com/RyoWakabayashi/items/edfd5fdae38491074eec

 ### Day 23

 https://qiita.com/RyoWakabayashi/items/f5deb58b978a5e3291ef

 ### Day 24

 https://qiita.com/RyoWakabayashi/private/6d3c963358bbda158af2

 ### Day 25

 https://qiita.com/RyoWakabayashi/private/9850a0ec65eefa983aeb

 ## まとめ

 AOC 2024 の肩慣らしとして 2015 をやってみましたが、面白い問題が多くて夢中になりました

 数学やコーディングの勉強にもなったので、プログラミング学習にもオススメです！
paizaラーニング問題集「いびつなリバーシ対戦」を解いてみた

▼問題

https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_pincerattack_boss

▼考え方

1. 前問「いびつなリバーシ対戦（２人）」はプレイヤーが2人でしたが、本問はプレイヤーがn人になります。プレイヤーの番号および石を置く盤面の(y,x)を受けたら、あとは基本的に前問の処理を繰り返せばよいです。

2. 自分以外のプレイヤーの石を挟む必要があるため、そのことを (S[tmp_y][tmp_x] != "#") and (S[tmp_y][tmp_x] != p) で表現しています。 !=p だけでは、石を置くことができない穴の空いているマス(#)も含んでしまうため、このような処理にしています。

https://qiita.com/toytoy24/items/e0c342e3d9dbe1248d7d

▼コード
```py
############### 関数処理 ###############

# reversi_positions: 新しく石を置くことができる(y,x)を求める関数
def reversi_positions(dy, dx):

    # newpositions: 新しく石を置くことができる(y,x)を格納するリスト
    newpositions = []

    # tmp_y,tmp_x: 単位ベクトルを、Yから1つずつ拡大させるための変数
    tmp_y,tmp_x = Y+dy,X+dx

    # 考え方2.
    while (0 <= tmp_y <= H-1) and (0 <= tmp_x <= W-1) and ((S[tmp_y][tmp_x] != "#") and (S[tmp_y][tmp_x] != p)):
        newpositions.append((tmp_y,tmp_x))
        tmp_y,tmp_x = tmp_y+dy,tmp_x+dx
    
    return newpositions if (0 <= tmp_y <= H-1) and (0 <= tmp_x <= W-1) and (S[tmp_y][tmp_x] == p) else []

# set_stones: 石を置き盤面を更新する関数
def set_stones():
    S[Y][X] = p
    for dy, dx in (-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1):
        for y, x in reversi_positions(dy, dx):
            S[y][x] = p

############### メイン関数処理 ###############

H,W,N,n = map(int, input().split())

S = [list(input()) for _ in range(H)]

# 考え方1.
for _ in range(n):
    
    p,Y,X = input().split()
    
    Y,X = int(Y),int(X)
    
    set_stones()

for s in S:
    print(*s, sep="")
```
paizaラーニング問題集「いびつなリバーシ対戦（２人）」を解いてみた

▼問題

https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_pincerattack_step8

▼考え方

1. 前問「いびつなひとりリバーシ」はプレイヤーが1人でしたが、本問はプレイヤーが2人になります。基本は、プレイヤー1人ずつ、前問の処理を繰り返します。n = 1 - nでプレイヤーを交代します。

2. 相手プレイヤーの石を挟む必要があるため、そのことを S[tmp_y][tmp_x] == "BA"[n] で表現しています。

https://qiita.com/toytoy24/items/32dab131519d0d905b9b

▼コード
```py
############### 関数処理 ###############

# reversi_positions: 新しく石を置くことができる(y,x)を求める関数
def reversi_positions(dy, dx):

    # newpositions: 新しく石を置くことができる(y,x)を格納するリスト
    newpositions = []

    # tmp_y,tmp_x: 単位ベクトルを、Yから1つずつ拡大させるための変数
    tmp_y,tmp_x = Y+dy,X+dx

    # 考え方2.
    while (0 <= tmp_y <= H-1) and (0 <= tmp_x <= W-1) and ((S[tmp_y][tmp_x] == ".") or (S[tmp_y][tmp_x] == "BA"[n])):
        newpositions.append((tmp_y,tmp_x))
        tmp_y,tmp_x = tmp_y+dy,tmp_x+dx
    
    return newpositions if (0 <= tmp_y <= H-1) and (0 <= tmp_x <= W-1) and (S[tmp_y][tmp_x] == "AB"[n]) else []

# set_stones: 石を置き盤面を更新する関数
def set_stones():

    S[Y][X] = "AB"[n]

    for dy, dx in (-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1):
        for y, x in reversi_positions(dy, dx):
            S[y][x] = "AB"[n]

############### メイン関数処理 ###############

H,W,N = map(int, input().split())

S = [list(input()) for _ in range(H)]

# n: n=0がプレイヤーA、n=1がプレイヤーBを表す変数
n = 0

# 考え方1.
for _ in range(N*2):
    
    Y,X = map(int, input().split())
    set_stones()
    n = 1 - n

for s in S:
    print(*s, sep="")
```
paizaラーニング問題集「いびつなひとりリバーシ」を解いてみた

▼問題

https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_pincerattack_step7

▼考え方

1. 前問「いびつなひとりリバーシ（１ターン）」は石を1回だけ置く問題でしたが、本問はN回石を置く問題です。前問の処理をN回繰り返せばよいです。

https://qiita.com/toytoy24/items/ca1836237517c3dcb01e

▼コード
```py
############### 関数処理 ###############

# reversi_positions: 新しく石を置くことができる(y,x)を求める関数
def reversi_positions(dy, dx):

    # newpositions: 新しく石を置くことができる(y,x)を格納するリスト
    newpositions = []

    # tmp_y,tmp_x: 単位ベクトルを、Yから1つずつ拡大させるための変数
    tmp_y,tmp_x = Y+dy,X+dx
    
    while (0 <= tmp_y <= H-1) and (0 <= tmp_x <= W-1) and (S[tmp_y][tmp_x] == "."):
        newpositions.append((tmp_y,tmp_x))
        tmp_y,tmp_x = tmp_y+dy,tmp_x+dx
    
    return newpositions if (0 <= tmp_y <= H-1) and (0 <= tmp_x <= W-1) and (S[tmp_y][tmp_x] == "*") else []

# set_stones: 石を置き盤面を更新する関数
def set_stones():
    
    S[Y][X] = "*"
    
    for dy, dx in (-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1):
        for y, x in reversi_positions(dy, dx):
            S[y][x] = "*"

############### メイン関数処理 ###############

H,W,N = map(int, input().split())

S = [list(input()) for _ in range(H)]

# 考え方1.
for i in range(N):
    
    Y,X = map(int, input().split())
    set_stones()

for s in S:
    print(*s, sep="")
```
(QA) ILE RPGを学ぶ際に役立つサイトを教えてください

主題のご質問を頂く事が増えてきました。適時追加したいと思います。

## 1.free-form RPG(フリーフォームRPG, FF RPG)初心者向けハンズオン資料

https://qiita.com/gomAnomalocaris/items/0322634830ccec49e794

## 2.IBM information Center (IBM docs) マニュアル　：　完全自由形式ステートメント

※IBM i 7.5（機械翻訳になりました）
https://www.ibm.com/docs/ja/i/7.5?topic=statements-fully-free-form

※IBM i 7.4（人手翻訳だったかと・・7.5の記述わかり難い場合参考になるかも）
https://www.ibm.com/docs/ja/i/7.4?topic=statements-fully-free-form

上記からC仕様書の命令文は下記に記載があります（7.4）
https://www.ibm.com/docs/ja/i/7.4?topic=operations-operation-codes
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/0fc97a4f-2e81-c0f5-c30d-4b52941253ba.png)



## 3.Coding in Free-Form RPG IV - a beginner's tutorial(英語)

https://wiki.midrange.com/index.php/Coding_in_Free-Form_RPG_IV_-_a_beginner%27s_tutorial

※いまどき色々な機械翻訳でも問題無く読めると思います・・

## 9. 研修コース

きちんと学習したい方向けには研修コースが各社あります

※アイラーニング社
https://www.i-learning.jp/service/it/topics/rpg_as520.html
一律の定型コースです。

※T&Turst社
https://www.tat.co.jp/cor/COR420P.php
各社のニーズに合わせたカスタマイズが可能です。
二輪車に乗ることとその効用

いきなりですが、自転車（ロードバイクでなくクロスバイク）、バイク（オートバイのこと・いちおう大型バイク）の二輪車に乗ることが私の趣味です。

# まず自転車に乗るようになったきっかけは、
コロナで在宅勤務が続いたことで、体力低下やモチベーションの低下を感じ、少しでもそれらの解消を図るべく、当時支給された特定給付金で（それで購入できる範囲で）購入しました。短順に外へ出るだけで、気分がすぐれましたし、適度なスピードを出すことで爽快感を感じることができ、モチベーション回復・気鬱の解消にはなったかなと思います。ただ、老人に片足を突っ込んでいる年齢なので、体力・脚力は伴ないませんでした。それなりの勾配の坂道で、子供を乗せたお母様の電動アシスト付自転車に簡単に追い抜かれるのは当たり前で、女子高生の立ちこぎには、あっという間にちぎられる始末でした。名誉のためにいいますと、4年たった今では、坂道（どのぐらいの勾配かはご想像に任せますが）若干重めのギアで、子供を乗せたお母さんの電アシ自転車を追い抜くぐらいの脚力はつきました（女子高生との闘いはさけています）。メンテナンスに関してできるものは自分でやることをモットーとし、楽しんで作業しています。パンクしたときもチューブの交換で対応しますが、チューブの手持ち在庫がなく、しようがないあめ自転車屋にもっていくと、タイヤまで交換させられて x 万円取られたりと、そういった出来事も含めて楽しんでいます。自転車は思いついたとき、空き時間に気軽に乗れること、機動性の高さが魅力です。

# バイクは、大学生まで中型バイクに乗っていたため、
出戻りしたというのが正解かもしれません。出戻りのきっかけは、自転車に乗ったことです。自転車で、二輪車を運転することの楽しさを思い出してしまい、「学生時代のようにバイクに乗りたい」、「いつか大型二輪に乗ると誓ったはず」との思いが強くよみがえり、コロナ禍にもかかわらず、大型自動二輪教習に通って、何時間かのオーバー・3か月の期間をかけて取得に成功。それから半年後、念願のバイク購入に至りました。やっぱりバイクなので、自転車に比べると（私の脚力の場合）圧倒的にスピードが出ます。スピードによる爽快感は自転車よりも断然上です。また、高速道路に乗ることもできるため、遠出も可能です。休日の朝早くにでかけて、だんだん日がのぼり、朝焼けの景色の変化を感じながら、知らない街を疾走することを楽しんでいます。バイクは、機動性は自転車に劣るものの、遠くまで出かけられることが魅力です。

# しかしながら、自動車と違い、人馬一体化、開放感、爽快感を感じられるのは、自転車、バイク共通で、それは、何物にも代えがたいものです


# ところで、アドベントカレンダーなので、少しは仕事に役に立つということを話さないといけないので、思いつくところを列挙します

# ストレス解消になる
上でも書いていますが、自転車もバイク共に人馬一体感、開放感、爽快感、が得られ、特に春・秋の朝方にのると、気候もあいまって、やっぱり気持ちがいいものです。これがストレス解消に役立っています。ストレスを解消して仕事に励んでいます。

# 適度な疲労感を得られ、それで眠りの質がよくなる？
バイクはかなり危険な乗り物です。一つの判断ミスで重大事故に結びつきます。首都高や逆に渋滞の幹線道路を走るときは、自分でも集中・緊張していることがわかります。まさに手に朝握っているのを感じます。自転車も常に車や歩行者の動向を確認・意識しながら走ってます。二輪車に乗った日は緊張からくる疲労のおかげで、ぐっすり眠れるような気がします。良い仕事は良い睡眠からですね。

# メンテナンスが大事、転じて上流作業が大事
バイク・自転車ともに、出発前点検で、ブレーキがちゃんと効くか、タイヤの溝の山は充分か、空気圧は適性かチェックします。適正でない場合は必要なメンテを行います。それを行うことで、外出先での故障・事故を予防します。それを怠って、出先で故障したらレッカー代、事故った場合は最悪命を失うこともあります。IT業界もよく言われるのは下流で発生したバグのほうが、対応にかかかるコストは高いといわれます。なにごとも上流（二輪車でいうと点検）をしっかり行うこと（コストをかけること）が結果的に損失を減らせるということです。

# 計画的に
ツーリングやサイクリングに行くにあたって、目的の箇所が複数あれば効率よく回れる順序を計画したり、段取りしたり、発生しうる問題をあらかじめ考え、それに対して手当をします。これはプロジェクト計画をたてること、リスク計画を立てることと一緒で仕事に活かせると思います。（最近は計画しないで、適当に走ることも多いですが...）

# 判断力・決断力アップ
ツーリング・サイクリング中に、大雨が降ったり、体調が変化したりする事があります。その場合、乗り続けることは危険をともなうこともあるので、行先を変更したり、あきらめて計画を中止したりします。それを繰り返すことで判断力・決断力が鍛えられるかと思います。


といろいろ、こじつけて書いてきましたが、
## 自転車もバイクも楽しい、なにより、その後に飲むお酒が一番美味しい！！
## それを糧に仕事を頑張っている、ということが一番言いたいことでした。
【プログラマ三大美徳】なぜ怠惰で短気、傲慢なプログラマは成長するのか？

## 1. 怠惰（Laziness）：同じ作業を繰り返さない工夫
手作業で繰り返す処理の多い業務があったとします。このとき、怠惰な精神で
「 :thinking: もっと楽できないか？」
を考えるのは重要です。

サンプルケース：
ログを毎日手動で確認し、エラーを報告する業務があるとします。この作業をスクリプトに置き換え、自動でメール通知を送るよう設定すれば、手間を省けます。怠惰な気持ちから生まれた自動化が、チームの生産性を大幅に向上させます。

https://dankogai.livedoor.blog/archives/50946243.html

## 2. 短気（Impatience）：時間を無駄にしない工夫
新人時代は、作業手順やツールの使い方に不慣れで、余計な時間がかかることがあります。
「 :thinking: どうすればもっと早くできるか？」
という短気な気持ちを活用しましょう。

サンプルケース：
頻繁に参照する設定ファイルが複数のフォルダに分散している場合、それをまとめた「チートシート」を作ることで、作業時間を短縮できます。この簡単な改善でも、短気を活かしてもっと効率よくできないか を意識した行動です。

https://dankogai.livedoor.blog/archives/50951049.html

## 3. 傲慢（Hubris）：他人に見られても恥ずかしくない成果を目指す
新人のうちは、自分のコードがレビューで指摘されることを恐れがちです。しかし、傲慢さを持つことで
「:thinking: もっと良いコードを書けないか」
という内発的動機に変えられます。

サンプルケース：
変数名や関数名を曖昧にしてしまいがちなところを、「これを読んだ人が一目で分かるように」と心がけて改善します。「calculate_x」ではなく「calculate_sales_tax」のように具体的な名前をつけることが、コードの読みやすさを格段に向上させます。
小さな工夫ですが、傲慢な姿勢がコードの品質を上げる助けになります。

https://dankogai.livedoor.blog/archives/50956453.html


## まとめ
「三大美徳」と書くと壮大で高度なイメージがわきますが、「1アクション短くすること」だけを考えてみるとよいかもしれません。
日々の業務で当たり前にやっていることが1アクション短くできればよいのです。些細な改善でも積み重ね、大きな成長につなげていきましょう。

怠惰「 :thinking: もっと楽できないか？」
短気「 :thinking: どうすればもっと早くできるか？」
傲慢「 :thinking: もっと良いコードを書けないか」

## 短気Tips：Googleドキュメントを1秒で新規作成する
弊社ではGoogleワークスペースを使って仕事をしているのですが、各種ファイルの新規作成はだいたい以下のステップです。

1. ドライブを開く
1. 新規を押す
1. 作成する種類のファイルを選択

![CleanShot 2024-12-06 at 07.13.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883/003a88e4-4d2a-b1cb-8ce6-ae2cbdd84a35.png)

![CleanShot 2024-12-06 at 07.14.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883/039434b1-6280-1a02-56ad-6dd453b33b54.png)

「短気」に行きましょう。
1. Chomeのアドレスバーにキーワードを入力してEnter
で済みます。

![CleanShot 2024-12-06 at 07.19.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883/b7a1aee5-3343-b1a2-707d-57021d63d6de.png)


Googleドキュメント
`doc.new`

Googleスプレッドシート
`sheet.new`

Googleスライド
`slide.new`

Googleフォーム
`form.new`
【Svelte 5】devtoolが無いなら$inspectを使えばいいじゃない

Svelteには最新のV5に対応した開発者ツールがまだ存在せず、諦めてVueで開発を進めていたのですが、
先日某所でSvelte有識者の方に「なんか値を追跡できるいい方法ないですかね」と質問したところ、こんな返答が帰ってきました。

「$inspectを使えばstate追跡できるよ」

マジで！？と思って調べてみました。

https://svelte.dev/docs/svelte/$inspect

Runesの新機能はStateとpropsぐらいしか使っていませんでしたがこれは便利、
$inspect()で渡した変数(state含む)を監視し、変更がある度にconsole.logに出力してくれるそうです。
しかも開発者モード限定で動作するので本番リリース向けに削除する必要もなし。

これは便利だと思い早速試してみました。

## Tauriで試してみた。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923046/b21fca06-652f-f86a-e39a-f919091867ea.png" width="75%">

サクッとTauriのデフォルト画面で試してみました。
文字列を入力してGreetボタンを押すと値がrustに送られる奴です。

```svelte:Tauri
<script lang="ts">
  import { invoke } from "@tauri-apps/api/core";

  let name = $state("");
  let greetMsg = $state("");

  async function greet(event: Event) {
    event.preventDefault();
    // Learn more about Tauri commands at https://tauri.app/develop/calling-rust/
    greetMsg = await invoke("greet", { name });
  }
</script>
<form class="row" onsubmit={greet}>
    <input id="greet-input" placeholder="Enter a name..." bind:value={name} />
    <button type="submit">Greet</button>
</form>
```

ボタンを押すとnameの入力値がrust側に渡されてからgreetMsgに帰ってきます。
今回はnameを$inspectで監視してみます。

```svelte:Tauri
<script lang="ts">
  let name = $state("");
  let greetMsg = $state("");

  $inspect(name);
</script>

```
「test」と入力してみる。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923046/27e73a4d-9e2c-3cae-44b0-5e7223494c9a.png" width="75%">

コンソールの出力はこんな感じでした。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923046/ce8a47c3-1a74-6854-ddf0-b52759761ff8.png" width="75%">

vueのv-modelの標準の振る舞いと同じで1文字1文字入力する度にイベントが発火されているんですね。
それを全部検出してくれてます。すごい！

## Svelteで大規模開発も全然いけそうな気がしてきた。
Devtool無いのがかなり抵抗感あったけどここまで簡単に値の追跡が出来るならなんとかなりそうです。
【VSCODE】Prettier - Code formatterの適用



## 1.Prettier - Code formatterインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943997/96836302-158d-9f64-70b6-1fe6b85abd6a.png)

## 2.defaultFormatterの設定を変更
#### 1.Settingsを以下ショートカットで開く
- macOSの場合 : `command + ,`
- windowsの場合 : `ctrl + ,`

#### 2."defaultformatter"と検索。

#### 3."Editor:Default Formatter"項目に`Prettier - Code formatter`選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943997/5a86ce89-ed23-1138-94c3-8d15ec6899f2.png)

## 3.ファイル保存時にフォーマットするように設定

#### 1."Format On Save"と検索

#### 2."Editor:Format On Save"項目のチェックをONにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943997/47e275a6-3bc7-f68d-dcc1-88a08cbad3ef.png)

## 4.SettingsとPluginの反映させるためにReload
#### 1.コマンドパレットを以下ショートカットで開く
- macOSの場合 : `command + shift + P`
- windowsの場合 : `ctrl + shift + P`

#### 2. `Reload Window`と入力しエンター
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943997/5a876dff-f2e3-2b34-c3a8-47da7982421d.png)
動くフォトグラメトリC62の製作経緯から今後の展開 ＋おまけ

# はじめに

3Dスキャン Advent Calendar 2024の6日目の記事にお越しいただきありがとうございます！  
今回は、私が製作しているVRChatのワールド「動くフォトグラメトリC62 26ワールド」について、ご紹介させていただきます。  
「動くフォトグラメトリ」というワールドの魅力を少しでもお伝えできれば幸いです。

ワールドリンク

https://vrchat.com/home/world/wrld_f8f747b8-1973-48d8-8798-cf20e047fc2a/


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212330/72efc592-5df4-082b-be13-007ca7a573a8.png)

https://x.com/VRTAKAYAN/status/1861813570994053218

---

# 製作経緯

今年の6月初め、私は新しいカメラを購入しました。  
その際に「蒸気機関車（SL）」をフォトグラメトリで再現し、VRChatで楽しめるワールドを作りたいと思ったのがこのプロジェクトの始まりです。

その当時のポストはこちらです。  

https://x.com/VRTAKAYAN/status/1802326510180720968

「SLを実際に動かせたら面白そう！」というアイデアが生まれ、製作がスタートしました。

---

# 製作の流れ
今年6月から様々なSLをスキャンして動輪周りがきれいに撮れるやり方を模索
きれいに撮れたら、車輪や機構を細かくメッシュで分けました。

frouさんのSLモデルに設定されているボーンを参考にさせていただきました。  
参考リンクはこちらです：  

https://frou01.booth.pm/items/2887461

9月初めには実際に動かしてみることに成功しました！  
そのときの成果はこちらのポストの動画をぜひご覧ください。  

https://x.com/VRTAKAYAN/status/1830278441788432581

皆さんからたくさんのご意見や応援の声をいただき、少しずつ新しい要素を追加していきました。  
最初は単純にSLを動かすことを目標にしていたのですが、いつの間にか「**SLで旅をする雰囲気**」を再現することにシフトしていきました。

旅行といえば、行き先だけではなく、「向かう道中のワクワク感」や「帰り道で思い出を振り返る時間」も魅力のひとつですよね。  
そんな体験をVRChatで表現できたら素敵だなと思い、この方針で製作を進めています。

---

# 成果物

現在、このワールドでは「SLで旅する雰囲気」を味わっていただけるように、いくつかの仕掛けを作っています。  
例えば、最初の駅を出発してトンネルを抜けると、各駅に観光地ワールドへのポータルが設置されています。  
観光地は日本各地に分かれており、旅行気分を存分に楽しめるように工夫しています。

https://x.com/VRTAKAYAN/status/1839665083527356468

---

# 今後の展開

今後はさらに「旅行に行く・帰る雰囲気」を充実させるため、以下のような機能を追加していく予定です。

- SL運転の自動化  
- 景色の追加  
- ワールドの軽量化（より多くの方が参加できるように）  
- 同期改善などの不具合修正

最近追加されたワールドのセーブ機能を活用して、別のワールドに移動しても戻ってきたときに元の位置からスタートできる仕組みを取り入れたいと思っています。

---

# おまけ・最近していること

### バーチャルでの活動

7日から開催されるバーチャルマーケット2024 Winterの
異世界マルシェ防衛戦線エクリプス - 小広場でブースを出典します！
- SLとファイバリオンの動くフォトグラ展示  
- ワールド紹介がメインですが、SLアバターの公開もしています  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212330/844dc60f-bda9-8c1e-06e1-a796687b65f7.png)

### リアルでの活動

- スタジオ製作のサポート  
  - フォトグラ処理の自動化  
  - LANケーブルの製作 
- その他、未公開のプロジェクトも進行中（間に合うかドキドキしています…！）

https://x.com/VRTAKAYAN/status/1861801424621093270

### ツアーの開催

以前製作したリアル再現ワールドを活用して、大阪・東京それぞれでツアーを開催予定です。  
初めてリアルに参加される方への参考になったり、過去に参加した方には思い出を共有して楽しんでいただける機会にしたいと思っています。

https://x.com/VRC_3DSCAN_CLUB/status/1864595578950439374

---

# 最後に

今月は製作やイベントの準備で忙しい日々が続いていますが、フォトグラメトリを使った成果物をどんどん形にしていく予定です！  
「動くフォトグラ」やイベントに関する質問がありましたら、ぜひコメントをお寄せください。  

これからもどうぞよろしくお願いします！
SQLパズル　p178  42 魚のサンプリング調査の 解法２の学習メモ

# 概要
SQLパズル　p178  42 魚のサンプリング調査の 解法２の学習メモです。
innerjoin とグループ化が理解の肝すね。


# 要件
group_id、fish_name毎の平均取得数【匹/回】を取得したい。
今回の場合だと
group_id=1 fish_name='pike'の平均取得数を取得したい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/8e30552b-1ffc-28eb-1e84-2f2ac99e3f3a.png)


手書きの図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/e8f97d99-8692-de6a-b15b-4c538fe69fe9.png)


# SQL

## DDL
```sql
DROP TABLE IF EXISTS Samples;
CREATE TABLE Samples
(sample_id INTEGER NOT NULL,
 fish_name CHAR(20) NOT NULL,
 found_tally INTEGER NOT NULL,
    PRIMARY KEY (sample_id, fish_name));

DROP TABLE IF EXISTS SampleGroups;
CREATE TABLE SampleGroups
(group_id INTEGER NOT NULL,
 group_descr CHAR(20) NOT NULL,
 sample_id INTEGER NOT NULL,
    PRIMARY KEY (group_id, sample_id));

INSERT INTO Samples VALUES (1, 'minnow', 18);
INSERT INTO Samples VALUES (1, 'pike', 7);
INSERT INTO Samples VALUES (2, 'pike', 4);
INSERT INTO Samples VALUES (2, 'carp', 3);
INSERT INTO Samples VALUES (3, 'carp', 9);

INSERT INTO SampleGroups VALUES (1, 'muddy water', 1);
INSERT INTO SampleGroups VALUES (1, 'muddy water', 2);
INSERT INTO SampleGroups VALUES (2, 'fresh water', 1);
INSERT INTO SampleGroups VALUES (2, 'fresh water', 3);
INSERT INTO SampleGroups VALUES (2, 'fresh water', 2);

```

## 答えのSQL

```sql
-- 42 魚のサンプリング調査　その２
SELECT fish_name,SUM(found_tally) /
                (SELECT COUNT(sample_id)
                   FROM SampleGroups
                WHERE group_id = 1) AS X
FROM Samples SA
    INNER JOIN
	SampleGroups SG
	ON SA.sample_id = SG.sample_id
	WHERE fish_name = 'pike'
		And group_id = 1
		GROUP BY fish_name
	;

--　inner JOIN部分を確認する
SELECT *
FROM Samples SA
    INNER JOIN
	SampleGroups SG
	ON SA.sample_id = SG.sample_id
	;
--　fish_nameに対して部分集合を作る（GROUP句）
-- group_id fish_name毎の 、回数(x_bunbo)、取得匹数（x_bunshi）をSELECT句に加える
SELECT fish_name
	,SUM(found_tally) AS X_bunshi
	,(SELECT COUNT(sample_id)
                   FROM SampleGroups
                WHERE group_id = 1) AS X_bunbo
	,SUM(found_tally) /
                (SELECT COUNT(sample_id)
                   FROM SampleGroups
                WHERE group_id = 1) AS X
FROM Samples SA
    INNER JOIN
	SampleGroups SG
	ON SA.sample_id = SG.sample_id
	WHERE 
	-- group_idを指定しないとSUM(found_tally)が他のgroup_idの値も含めてしまうため。
	group_id = 1
	-- And fish_name = 'pike'
	GROUP BY fish_name
	;



-- 参考
-- WHERE句で結合しても　InnerJoinと同じ結果になる
SELECT *
FROM Samples SA,SampleGroups SG
	WHERE SA.sample_id = SG.sample_id
	;


```

図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/6213d054-71fa-ca89-4a23-771a89977766.png)


参考
InnerJOINの代わりにWHERE句で結合した場合同じ結果になる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/649d11b8-18d1-cb88-a949-cd1f55450069.png)

# 参考

SQLパズル　p178

SQLパズル　サポートページ
https://mickindex.sakura.ne.jp/database/db_support_sqlpuzzle.html#LocalLink-p42

達人に学ぶSQL徹底指南書第２版 該当する問題なし

github差分

https://github.com/RYA234/SQL_Puzzle_Learning/commit/cdb49a1bbe147fb8fa2a0b5d489b55d6a8b8f90c
デザインコンセプトを決めたい

## はじめに
サイト開発をデザインからチャレンジしてみたい！第2弾の記事。

最初は、ムードボードにチャレンジしてみた。
本来であればもっと情報を細かく列挙して検討・整理するものだと思うけれど、
今回は、初挑戦かつ全体的な概要をつかみたいので、大まかに（？）デザインの流れを体験してみる。

https://qiita.com/chimrindayo/items/cb8cdbdb2490fff81289


## デザインコンセプトを考える
今日は参考となるデザインを収集してみる。

前にデザイナーさんと雑談していたときに、「Pinterestとかでデザインのイメージを教えてほしい」と言われたのをふと思い出したので、Pinterestで情報収集にチャレンジしてみる💡


(っ'ヮ'c)＜ なにこれ見てるだけで楽しくて保存する手が止まらない・・・！

すべてが素敵すぎて保存する手が止まらないし、ずっと見ていられる。
でもこれすっごく難しいな、、、

気に入ったものを何個かピンしてみた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667288/2659426f-6ef6-b335-2b87-fc9e1e057ece.png)

今回は私のプロフィールアイコンと同じ8bitっぽく宇宙感のある（？）雰囲気にしていきたいと思う。

## レイアウトを考える
まずは、Figmaを使ってワイヤーフレームをこんな感じで考えてみた。
見やすさに不安は残るが、一旦このレイアウトで実装してみたいと思う。

トップページは、左ペインにプロフィールを表示して、右ペインをカード形式で記事のリンクを表示するイメージする。PCメインで考えるので、SPは後回しにする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667288/afe99e07-8b11-290f-969a-ac332a79792b.png)


記事ページはこんな感じ。
左にカテゴリを表示して、右はサムネイル（MV）と本文の予定。
トップも記事のページも右ペインだけ、スクロールできるイメージ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667288/fa8d5a66-db67-a47a-8303-4e8c73fff5e9.png)

自分で作った後に気づいたけど、RSS Readerと同じようなレイアウトだから意外と見やすいかもしれない💡
マージンとかは、あまり気にして作っていないので、のちに調整する。

## まとめ
今日は、Pinterestで参考となるデザインの収集とワイヤーフレームまで検討してみた。
Pinterestで情報収集したり、色を検討したりするの慣れなくてすごく難しい。
見る人に与える印象や、見やすさ・アクセシビリティとか考えること色々あって勉強になる。

明日は実際のデザインに取りかかる予定！
（金曜なのでいっぱいがんばれそう😊！）
SpresenseでCameraを使って色を判断してみた！

# 初めに
Spresenseを使って、「赤丸とか緑丸とかを判断したい」んだけど、と相談されたので、
ソニーの太田さんの本にあるSementic segmentationを使って認識させようと思ったんだけど、

https://github.com/TE-YoshinoriOota/Spresense-LowPower-EdgeAI

もっと手軽にやって欲しいとのことなので、簡単に中心部の色だけを判断するコードを書いてみました。

# 用意するもの
SpresenseはMainボードとカメラボードのみです！

SPRESENSEメインボード[CXD5602PWBMAIN1]

https://www.switch-science.com/catalog/3900/


SPRESENSE HDRカメラボード[CXD5602PWBCAM2W]

https://www.switch-science.com/products/8080

小さく作れます！

# ブログ（元ネタ）
この記事は、以下のブログにあるものです。

https://spresense.livedoor.blog/archives/37390488.html

# ソースコード

Spresense Arduino の Camera Sampleを使って作ってみます。
基本、CamCBを使って、常時、小さい画像を取り込みながら、
真ん中部分の色が、赤、黄色、緑の範囲に入っているか？を見るというサンプルになります。

なので、loopでは、秒に1回結果を表示するだけ。

```
  switch(current_color){
    case DETECT_RED:
    Serial.println("Detect Red!");
    break;
    case DETECT_YELLOW:
    Serial.println("Detect Yellow!");
    break;
    case DETECT_GREEN:
    Serial.println("Detect Green!");
    break;
    case DETECT_NONE:
    default:
    break;
  }
  sleep(1);
```

CamCBでは、320x240で撮りこまれた画像を、真ん中の96x96だけ切り出し1/8にする。

```
#define OFFSET_X  (112)
#define OFFSET_Y  (72)
#define CLIP_WIDTH  (96)
#define CLIP_HEIGHT  (96)
#define DETECT_WIDTH  (12)
#define DETECT_HEIGHT  (12)

  if (!img.isAvailable()) return;

  // HWでの画像の切り出しと縮小
  CamImage small; 
  CamErr camErr = img.clipAndResizeImageByHW(small
            ,OFFSET_X ,OFFSET_Y 
            ,OFFSET_X+CLIP_WIDTH-1 ,OFFSET_Y+CLIP_HEIGHT-1 
            ,DETECT_WIDTH ,DETECT_HEIGHT);

```

RGBに変換して、色を検出。

```
  // 画像をYUVからRGB565に変換
  small.convertPixFormat(CAM_IMAGE_PIX_FMT_RGB565); 
  uint16_t* sbuf = (uint16_t*)small.getImgBuff();

  int detect_red = 0;
  int detect_yellow = 0;
  int detect_green = 0;

  for(int i=0;i<DETECT_WIDTH;i=i+2){
    for(int j=0;j<DETECT_HEIGHT;j=j+2){
      int k = i*DETECT_HEIGHT+j;
      int red = (sbuf[k] >> 11) & 0x1F;
      int green = (sbuf[k] >> 5) & 0x3F;
      int blue = sbuf[k]  & 0x1F;
//      printf("sbuf[%d]=%04x,r=%02x,g=%02x,b=%02x\n",k,sbuf[k],red,green,blue);
      if(detectRed(red,green,blue)) detect_red++;
      if(detectYellow(red,green,blue)) detect_yellow++;
      if(detectGreen(red,green,blue)) detect_green++;
    }
  }

```

それぞれの色の範囲は、`detectRed`/`detectYellow`/`detectGreen`の中で調整。
全画素を見ずに、1つおきに見ることで処理を軽くして、閾値以上の色が見つかれば表示をしました。

本体のコードはこちらにあります。

https://github.com/Interested-In-Spresense/sketches/tree/master/Camera/ColorDetect


Spresenseは、クリップと縮小、フォーマット変換が簡単にできるので、
この手のコードは楽に書けますよ！
【TryHackMe】Common Attacks：Walkthrough

# 概要

TryHackMe「Common Attacks」のWalkthroughです。

https://tryhackme.com/r/room/commonattacks

# Task2

## **Q1**.*What was the original target of Stuxnet?*

**Hint**.*Check the case study in the task*

**A**.**The Iran Nuclear Programme**

# Task3

## **Q1**.*What is the flag?*

フィッシングメールか正常なメールかを判断する問題を解いてフラグを入手できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/fa4b1781-c4fb-a97d-a05f-611ffa28fc83.png)

**A**.**THM{I_CAUGHT_ALL_THE_PHISH}**

# Task4

## **Q1**.*[Research] What currency did the Wannacry attackers request payment in?*

指定の`Bitcoin`アドレスへ送金するよう記載があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/21f1f128-3c20-cb36-b751-0aafdb999401.png)

**A**.**Bitcoin**

# Task5

## **Q3**.*What is the password?*

パスワードリストを使用してハッシュ値から平文を特定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/4ef3e930-4196-4edd-9471-1da2432e49ed.png)

**A**.**TryHackMe123!**

# Task6

## **Q1**.*Where you have the option, which should you use as a second authentication factor between SMS based TOTPs or Authenticator App based TOTPs (SMS or App)?*

**A**.**App**

# Task8

## **Q1**.*What is the minimum number of up-to-date backups you should make?*

**A**.**3**

## **Q2**.*Of these, how many (at minimum) should be stored in another location?*

**A**.**1**
『CI/CD』について浅く理解する

CI/CDは良く聞くし、自動でテストとかしてリリースしてくれるやつでしょ？ってくらいの理解度ではある。

でも詳しく教えてよって言われたら分からないからまとめてみる

## そもそもCIとCDってなんなのさ？
CI/CDのCIとCDはそれぞれ独立した意味合いを持っている。

・CIは継続的インテグレーション
・CDは継続的デリバリー

それぞれなんなのってのを見ていく

### CI(継続的インテグレーション)
「インテグレーション」つまり、日本語にすると「結合・統合」

ソースコードの変更をメインブランチにマージする事。

目的は、エラーやバグを早期に発見することで、コードの品質を保つことができる。

CIの流れは

1. メインブランチとマージする。
2. コードをビルドしてコンパイルエラーやビルド時の問題が発生しないかを検知する
3. 自動でテストを実行してテストが通るかどうかを確認する

この一連の流れがCI(継続的インテグレーション)の流れとなる。

簡単に言ってしまうと、新しいコードを元のコードとくっつけてちゃんと動くか自動で確認するって感じ。

毎回手動で確認する手間が省けて効率的に開発ができるようになる

### CD(継続的デリバリー)
CI(継続的インテグレーション)でマージ~テストが自動化でき、リリースする準備ができたので、その後は実際にリリースするような流れになるが、その流れを自動化するのがCD(継続的デリバリー)

これによってリリース作業を大幅に短縮することができる
VoiceVox Engineで使える環境変数

VoiceVox Engine（音声合成などのAPIを含むVoiceVoxのエンジン部分）で設定できる環境変数についてまとめました。

## 背景
Docker ComposeなどでVoiceVoxを利用する際に詰まったので、READMEに書いてある環境変数についてまとめて書いてあると便利だと思いました。

### 注意点
- 2024/10現在のREADMEから読み取ったもの
- ほとんどの環境変数は実行時オプションで上書き可能

## 一覧
|変数名|意味|
|---|---|
|VV_DISABLE_MUTABLE_API|1のとき、辞書機能などのデータを変更するAPIを無効化する|
|VV_CPU_NUM_THREADS|音声合成を行うCPUのスレッド数|
|VV_OUTPUT_LOG_UTF8|ログの文字コード。1のときはUTF8に固定、それ以外の場合は環境依存になる|
|VV_PRESET_FILE|プリセットデータが保存されているファイルのパス。指定しない場合、実行ファイルと同じ場所にあるpreset.yamlを検索する。|

## その他
VoiceVoxは現在開発中のライブラリですので、環境変数周りもIssueなどで色々と変更や議論があるようです。

[起動引数・環境変数の詳細な仕様についてdocs/にドキュメントを作りたい #759](https://github.com/VOICEVOX/voicevox_engine/issues/759)
[CORSの設定を環境変数で変えることは可能でしょうか #669](https://github.com/VOICEVOX/voicevox_engine/issues/669)