OmniAICreator/Qiita-1.07M huggingface dataset:
ドメイン駆動設計の勉強_値オブジェクト

# はじめに
システム開発をするとき、業務知識を表現するクラスを作成することがあります。
業務知識をシステムの中で表現して、それらを中心とするソフトウェア設計方法を「ドメイン駆動設計(DDD)」といいます。
これらのクラスはUIや外部システムと比べて変更される頻度が少なく、また別プロジェクトでも流用することができます。
業務知識をシステム内で表現するので、変更に強く、複雑な業務のシステムでも理解しやすくなります。

# 業務知識を表現するクラス

例えば、POSなどの売買に関係あるシステムだと「商品」や「値段」などのクラスを作成します。
商品クラスや値段クラスは業務知識を表現するために、以下のような値を保持しています。


| 商品クラス | 値段クラス |
| --- | --- |
| 値段クラス |  値段(整数)　 | 


値段クラスはねだである整数を保持するクラスです。
商品クラスは値段クラスを保持するクラスです。

DDDにおける値段クラスのことを値オブジェクト(Value Object)、
商品クラスのことをエンティティ(Entity)といいます。

今回は値オブジェクトについて書いていきたいと思います。

## 値オブジェクト
値オブジェクトは業務知識を表現して値として扱われるオブジェクトです。
以下のような特徴を持っています。

### 不変

値オブジェクトが保持している値(プロパティ)は変わりません。
intやStringなどと同様に扱います。
これにより、値段クラスのインスタンスの円(整数)がいつの間にか変わっていたということ防ぐことができます。

### 交換可能

値オブジェクトは不変なので、中身を変更するのではなく、
値オブジェクト自体を交換します。
なので、商品クラス内にある値段クラスを変更するときはオブジェクトを入れ替えます。

### 等価性の比較

値オブジェクトは`1 < 2`と同じように比較をすることができます。
== 演算子や hashCode を適切に実装することで等価性を判断できます。
直感的に扱えることと、クラスに新しくプロパティが追加されても値オブジェクトの比較処理を修正するだけでよくなります。

# まとめ
今回は値オブジェクトに関して簡単にまとめました。
業務知識をコードでうまく表現できるようにしていきたいです。
OpenAI Operatorを使ったAppStoreのリリース準備作業の自動化検討

## 概要

少し前に日本でも利用可能になったOpenAIのAIエージェントサービスであるOperatorを使って、モバイルアプリのリリース前に必要となるアプリストアへの登録作業の自動化ができるか試してみたので、そのメモです。

## 何をやったのか

モバイルアプリを実装した後、AppStoreやGoogle Play Store上にアプリを掲載するために、アプリを紹介するテキストや、フィーチャーグラフィック（アプリの魅力などを説明する画像）をはじめとする様々な情報を登録する必要があります。

今回は、Operatorを使ってAppStoreに以下3種類のテキストを登録できるか試してみました。

- プロモーション用テキスト
- 概要
- キーワード

## 結論

- 完璧ではないものの、自動で入力欄を探し出してテキストを入力してもらうことができた
- プロモーション用テキストとキーワードの入力はできたが、概要の入力はなぜかうまくいかなかったので自分で入力する必要があった
- 途中のタスクがうまくいかなかった場合に自分がタスクを実施し、後続のタスクを再度依頼するとうまく進めてくれた
- 全体的に、要求したタスクを完了するまでの時間が人間の3倍ほどかかる感覚。バッチ処理のような感覚でタスクを依頼するのであれば一定有用だが、ある程度スピードを要求されるタスクの場合はまだOperatorでは厳しい印象。

## 詳細

Operatorに、以下のプロンプトで指示しました。${}で囲んだ箇所は任意のテキストが入ります。

```yaml
https://appstoreconnect.apple.com/にアクセスし、${任意のアプリ名}というアプリの審査情報編集画面へ遷移して。
遷移した後、「プロモーション用テキスト」のテキスト入力欄があるので、次の「」で囲まれたテキストを入力して：

「${任意のプロモーション用テキスト}」

その下に「概要」のテキスト入力欄があるので、次の「」で囲まれたテキストを入力して：
「${任意の概要テキスト}」

その下に「キーワード」のテキスト入力欄があるので、次の「」で囲まれたテキストを入力して：
「${任意のキーワードテキスト}」
```

Operatorがブラウザ経由で、指定したAppStoreConnectのURLにアクセスします。
![スクリーンショット 2025-03-23 21.33.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243690/9d9a021e-d6cd-4039-b5f2-a55f80aebaeb.png)

![スクリーンショット 2025-03-23 21.43.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243690/bde97292-f353-4217-b53c-5386bd58aae5.png)

ログインが必要になったので、Operatorから自分が操作を引き継いでログインを実行するように依頼されます。
![スクリーンショット 2025-03-23 21.33.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243690/13170dc2-f39a-4bba-bb9c-7fca0b1ca80e.png)


認証情報を入力してログインを実行しました。

さすがに認証情報をエージェントに渡すのはセキュリティ的にまずいので今はまだ人間が実行する必要がありますが、将来的にはブラウザ側にAIエージェントが認証情報を入力できるようなツールが用意されるなどしてクライアントサイドで完結するようになれば、自動で入力できるようになることもあるかもしれません（とはいえ、2段階認証でどちらにせよ人が介在する必要がありそうですが）。

というわけで、以下の画面にたどり着いたのでここから作業を継続するようにOperatorに依頼します。

一部伏せていますが、アプリは異なる名前で3種類表示されています。
![スクリーンショット 2025-03-23 21.46.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243690/608b24cf-b57d-4135-b596-b6bbc9eff849.png)

プロンプトではアプリ名を指示していましたが、Operatorは指示どおりに適切なアプリのページに遷移しました。

その後、ページを下にスクロールすると今回指示したテキストの入力欄が現れるのですが、そこまではプロンプトに含めていませんでした。

そのためか、Operatorはなぜか最初に左タブの「プロモーションコード」ページに遷移しました。

しかし入力欄が存在しないことに気づいたのか、元のページに戻りました。その後ページを下にスクロールし、無事に入力欄にたどり着きました。

そして「プロモーション用テキスト」を入力した後、「概要」の入力をするものかと待機していたら何秒経っても入力されません。

![スクリーンショット 2025-03-31 19.17.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243690/a9599f67-6d45-429f-ab91-ee0e13dc1dfa.png)

最終的に「プロモーション用テキスト」は自分で入力しました。そして操作を戻すと、「キーワード」は無事Operator側で入力してくれました。

## まとめ

現時点ではまだ信頼できるほどではないものの、プロンプトの改善やモデル・エージェント性能の改善によって将来的にブラウザやデスクトップ上の定型作業を自動化するだけのポテンシャルは感じました。
Cypressをバージョンアップしたら動かなくなった

Cypressで自動テストを作成したがなかなか思った通りに動かなかった…という備忘録作業メモです。

## 原因
テストしたいwebサイトにログインしたあと、他項目で再ログインをするためCookieを保持しておこうと思ったがうまくできていない。

CookieはCypressで提供されている`interface Cookie`を使用して情報を保持しようとしていたが、どうやらここで正常にCookie情報が保持されていないようだった。

過去に`Cypress.Cookie`を利用していた際のCypressバージョンは`13.7.2`、今回試していたバージョンは`14.0.1`だったため、バージョンを戻してみると正常に動作した。

## Cypress.Cookieは使えない？
パッチノートや更新を確認しても`interface Cookie`が廃止された、非推奨となった記載は見当たらない。
https://docs.cypress.io/app/references/changelog#14-0-0
https://docs.cypress.io/app/references/migration-guide

というか`interface Cookie`はバージョン14でも利用されている`setCookie`などの型継承に使われている。
過去のバージョンをインストールして確認していくと、バージョン`13.17.0`では利用できた。
バージョン`14.0.0`では利用できなくなっていたが、その間でのテストの変更点は`package-lock.json`のCypressのバージョンのみ。


とりあえず14.0.0以降でのCookieの保持には`getCookie`や`setCookie`を使うのが一般的なのかも
Cypressのバージョンを更新する際は、意図したとおりのURLにアクセスしログインができているか、Cookieが正常に取得できているか、以前のバージョンとの差異はどこかを確認するようにする。
AWS SSA合格体験記

# はじめに
AWS SSAに合格したのでやったことをまとめておきます
実務でのAWS経験はなく、勉強期間は約半年ほどです
初学者でも内容を理解しつつ進められたと思いますので初学者の皆さんの参考になれば幸いです

# やったこと
### 1. AWSに触れる（2か月）
まずはAWSの基本的なサービスを理解するためにWebサイトを構築してみました
EC2/VPC/RDSを使った基本的な構成ができ、外部にサービスとして提供できるレベルの設定ができることを目標としていました
私の場合はWordPressを使ったブログサービスを立てました
参考となるサイトが多く、アウトプットも使えるものなので技術者の方には特におすすめです

:::note info
AWSには1年間の無料枠が用意されているためほとんどコストをかけずに進めることができると思います
:::

### 2. 参考書に目を通す（1か月）
次に参考書を購入して通読しました。
AWSに触れているので全く触れずに読むよりはすんなり内容を理解できたと思います。
この試験はサービスそのものの内容というより、サービスを活用したアーキテクチャを問う設問が多いためざっくりと内容を理解する程度で問題ないと思います。


👇利用した参考書

https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-%E6%94%B9%E8%A8%82%E7%AC%AC3%E7%89%88-%EF%BC%A1%EF%BC%B7%EF%BC%B3%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-%E4%BD%90%E3%80%85%E6%9C%A8-%E6%8B%93%E9%83%8E/dp/4815617945/ref=sr_1_2_sspa?crid=23WGTUVOX584P&dib=eyJ2IjoiMSJ9.vTqdEc5xa1rCry350MeK333rI5Kp4kDMCjjz2c5vM4x491FU6LCZR7HEAiF7-Uwy820d0cGfkXZ-vhW4msKPdCbMq52IkD9DMsufsYhACtx5-JiWhmnHarrEVZcVk2xeO1_SY6rIDkqWoUrJa7Fk12GLvLzRZSua-VQTlxCgHXjgdWPPoKLb_kdIhyLDOWkBJHifWYq5uZjwsP3I2AaL7JuaUYjOcwmADOjA6md-FmQ7wV-Rt68o5GOpvfShACWENTZnQ1ALe6Z_8AYaik_WNJUmTWYbGirK6T-8mpKZNx4.XejQMVxyfm5D2L12tBNQ-GFLPYknMEbOTiVvEgnHeoE&dib_tag=se&keywords=aws&qid=1743415713&sprefix=aws%2Caps%2C431&sr=8-2-spons&sp_csd=d2lkZ2V0TmFtZT1zcF9hdGY&psc=1

### 3. 試験問題を解く（2か月）
最後に試験問題をひたすら解いていきます。
問題を解いて、間違えた場合は解説を精読したりサービスについて調べたりしていました。
問題文も少し長いので問題慣れをするためにも重要だと思います

👇利用した問題集

https://www.udemy.com/course/aws-associate/?utm_source=aff-campaign&utm_medium=udemyads&LSNPUBID=PPkX79%2Fc*b0&ranMID=47901&ranEAID=PPkX79%2Fc*b0&ranSiteID=PPkX79_c.b0-cpU2oHWrQkSFQTJ.pSgZQQ

# まとめ
AWSに触れること、問題になれることが特に大事だと思います
皆さんの合格をお祈りしています！
TLS/SSLのルート/サーバー/クライアント証明書の作成手順

# 1. ルート証明書の作成

```sh:環境変数の設定
CA_NAMEcc
SUBJECT=/C=JP/ST=***/L=***/O=***/OU=${CA_NAME}/CN=${CA_NAME}
```

```sh:秘密鍵の作成
openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:4096 -out ${CA_NAME}.key
```

```sh:ルート証明書の作成
openssl req -new -x509 \
    -out ${CA_NAME}.crt -key ${CA_NAME}.key \
    -days `expr 365 \* 3` \
    -subj ${SUBJECT}
```

# 2. サーバー署名リクエストの作成

```sh:環境変数の設定
SERVER=*******
SUBJECT=/C=JP/ST=***/L=***/O=***/OU=${SERVER}/CN=${SERVER}
```

```sh:サーバー秘密鍵の作成
openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:4096 -out ${SERVER}.key
```

```sh:サーバー署名リクエストの作成
openssl req -new \
    -out ${SERVER}.csr \
    -key ${SERVER}.key \
    -subj ${SUBJECT}
```

# 3. サーバー証明書の作成

```sh:Extention Fileの作成
cat << 'EOS' > san.txt
> subjectAltName = DNS:***, IP:*.*.*.*
> EOS
```

```sh:インデックスファイルの作成
mkdir /etc/pki/CA
touch /etc/pki/CA/index.txt
```

```sh:サーバー証明書の作成
openssl ca \
    -in ${SERVER}.csr \
    -out ${SERVER}.crt \
    -outdir . \
    -cert ${CA_NAME}.crt \
    -keyfile ${CA_NAME}.key \
    -days `expr 365 \* 3` \
    -extfile san.txt \
    -create_serial -rand_serial
```

# 4. クライアント署名リクエストの作成

```sh:環境変数の設定
CLIENT=*******
SUBJECT=/C=JP/ST=KANAGAWA/L=KAWASAKI/O=mabe/OU=${CLIENT}/CN=${CLIENT}
```

```sh:クライアント秘密鍵の作成
openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:4096 -out ${CLIENT}.key
```

```sh:クライアント署名リクエストの作成
openssl req -new\
    -out ${CLIENT}.csr \
    -key ${CLIENT}.key \
    -subj ${SUBJECT}
```

# 5. クライアント証明書の作成

```sh:クライアント証明書の作成
openssl ca \
    -outdir . \
    -cert ${CA_NAME}.crt \
    -keyfile ${CA_NAME}.key \
    -out ${CLIENT}.crt \
    -days `expr 365 \* 3` \
    -create_serial -rand_serial \
    -infiles ${CLIENT}.csr
```

# 6. クライアント証明書と秘密鍵の格納

```sh:クライアント証明書と秘密鍵の格納
openssl pkcs12 \
    -export -in ${CLIENT}.crt \
    -inkey ${CLIENT}.key \
    -out ${CLIENT}.pfx \
    -name ${CLIENT}
```

インポートする環境によっては ```-legacy``` が必要かも。
『測度・確率・ルベーグ積分』って神本ですよね【読書メモ、勉強メモ】

## この記事は、本の読書メモ・勉強メモです

『測度・確率・ルベーグ積分』原啓介
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281138/59bb01e3-adba-4a38-9031-a7d738eaf70c.png)
本へのリンクは[こちら](https://www.buchinuku.work/entry/2024/10/18)


* この本に興味がある人
* 測度論的確率論に興味がある人
向けの内容です。

測度論、最初は意味わからないですよね〜
測度論のちょうどいい具体例として、確率論がピッタリだと思います。

この本はとてもわかりやすいです。
精読します。

**定期的に更新していきます！！**


## 1 確率と測度

確率とは全体の測度が1であるような測度である。

### 測度の本質はσ-加法性である

**σ-加法性（完全加法性）**
互いに素な（重なりがない）可算個の集合 $A_1, A_2, A_3, \dots$ に対して、
$$
\mu\left(\bigcup_{i=1}^{\infty} A_i\right) = \sum_{i=1}^{\infty} \mu(A_i)
$$
が成立すること。

>測度とは，長さ，面積，体積のような概念を抽象化したものだが，その本質がこのσ-加法性である．つまり，たかだか可算個の重なりのない図形をあわせた図形の長さ（面積，体積など）は，それぞれの長さなどの和になるべきであり，そして大事なことはそれだけである（可算個であることが重要．非可算の場合は加法性を保証しない）．


### 標本と事象の違いに注意
>標本と事象の違いに注意せよ．ある標本 $ω∈Ω$ に対して，その標本だけからなる集合 $\{ ω \}$ は，$ \{ ω \}∈F$ ならば事象であり，したがってその確率を考えられるが，標本 $ ω $ 自体は $ Ω $ の元であって部分集合ではないので，$ F $ の元ではありえず，その確率も考えられない．


### 「ボレル集合族上のルベーグ測度」と「（ルベーグ可測集合上の）ルベーグ測度」の関係

違いは「完備性」である。
ただし、常に、測度空間は完備にできる。

#### 測度空間の完備性
```
測度空間の零集合の部分集合が常に可測であるとき、この測度空間は完備であるという
```
「ボレル集合族上のルベーグ測度」は完備ではない。これを完備化したものが、「（ルベーグ可測集合上の）ルベーグ測度」である。

「完備性」は確率論で起こるような測度0の集合に興味をもつ場合に問題となる。


## 2 積分と期待値

### 確率変数の気持ち
確率変数によって、一つの確率的な問題が確率空間の上に実現される。
確率空間は確率概念を準備するためにあり、具体的な問題は確率変数によって記述する。
そして、確率変数の気持ちのには２つの立場がある。

### 確率変数の二つの立場
* Ωを具体的に定め、その上に確率変数を設定する立場
* 任意のΩに対し、確率変数からΩの中身を設定する立場

後者の立場の気持ち

>直観的にいえば、標本空間の点を1つ定めることで，確定的な世界が1つ決まる．そして、確率変数を定めることで，その世界の何に注目するかが決まる。たとえば、上で定義したサイコロの目の確率変数は$ ω∈Ω$ 対して、その世界でサイコロの目が何かを答える関数である。こちらの立場では、$ Ω$ は考えようとしている個別の問題とは関係なく、あらゆる確率的な問題の背後にあるランダムネスの源泉としての，あまねくすべての可能性を表現する集合であり、そして確率変数がその標本空間に1つの問題の意味を与える.





## 3 収束と極限のおさらい

## 4 道具としての積分論　収束定理とフビニの定理
### キーワード
* 各点収束
* 概収束
* 単調収束定理
* ファトゥの補題
* 優収束定理
* 有界収束定理
* フビニの定理

### 収束定理　極限と積分の交換はいつ可能か

## 5 ラドン-ニコディムの定理と条件つき期待値

### キーワード
* 条件つき期待値
* 条件つき確率
* ベイズの定理
* 絶対連続性
* 符号つき測度
* ラドン-ニコディムの定理

### 条件つき期待値とその意味
「条件つき」という概念を「情報が与えられた」と解釈する。つまり、σ加法族がモデルの情報を持っていると考える。

>σ-加法族の観点から条件つき期待値をみると, 確率変数を情報の「ふるい」にかけて新しい確率変数を作る操作, または, 「ふるい」の目ごとに平均して粗くする操作だと考えられる.

条件つき期待値は、確率変数の積分値が等しいことを使って定義される。この積分値の一意的存在を保証するのが、「ラドン-ニコディムの定理」である。

条件つき期待値は、値ではなく確率変数であることに注意する。
そして、条件つき確率は、条件つき期待値によって定義される。

ある部分集合上での可測関数の積分によって、新しい測度を構成できる。
このとき、逆から考えると、2つの測度の間にどんな関係があれば、上の条件を満たす可測関数が存在するだろうか。ここで、２つの測度の関係からある関数の一意な存在を保証するのが「ラドン-ニコディムの定理」である。


## 6 いろいろな不等式

## 7 確率論の基本

## 関連記事
https://www.buchinuku.work/entry/2024/10/18

https://www.buchinuku.work/entry/2024/4/25
bq queryコマンドで、「宛先データセット」指定なしで作成したスケジュールドクエリをWeb-UIで編集すると、ハマる

## CLIとWeb-UIで非互換動作がある問題
* BigQuery CLIの `bq query` で登録した内容は、微妙にWeb-UIと互換性がない。
* 宛先データセットのオプション引数なしで登録したスケジュールドクエリは、宛先データセットが「-」としてWeb-UIに表示される。
* しかし、サービスアカウントを貼り替えるために「編集」ボタンを押すと、宛先データセットが必須オプションになってしまい、保存できなくなる。
* どんな宛先データセットを指定してもクエリが失敗するようになってしまう。

エラーメッセージ
```
Dataset specified in the query ('') is not consistent with Destination dataset 'データセット名'.
```

## 回避策

サービスアカウントなどの関連情報を、最初の `bq query` 実行時に完璧に設定する。
設定変更するときは、Web-UIは諦めてbqコマンドで再登録する。

環境変数 `CLOUDSDK_AUTH_IMPERSONATE_SERVICE_ACCOUNT` にサービスアカウントを指定すれば、そのサービスアカウントで `bq query` を実行してくれるので、それを利用する。

## なんなのこの仕様

ぐんにょり
ターミナルでGitHubの情報を表示する方法 for MacOS

こんにちは，としきふです．
2025年，毎月投稿3ヶ月目です．

今回は，タイトル通り，ターミナルでGitHubの情報を表示する方法を共有しようと思います．
これをすることで，いちいち
```shell
git branch
```
しなくて良くなります．

なぜなら見た目がこのようになるからです．
```shell
┝ hello-rust <master> (25-03-31 17:18:42)
% ここにコマンドが打ち込まれる
```

また，ささやかな機能としてそのブランチの状態(pullできる・特殊なgit状態など)で色も変化するようにしたいと思います．

# 実装
## 完成イメージ
改めて，設定後は以下のようなスタイルになります．

```
┝ hello-rust <master> (25-03-31 17:18:42)
% ここにコマンドが打ち込まれる
```

- `main`：現在の Git ブランチ
- 色付きで変更状態を表示（ステージ済みなら緑，未ステージなら赤）
- 日付・時刻表示

## 設定ファイル
変更の適応は簡単です．以下のコードを `.zshrc` の最後にコピペしてください👇

```zsh
# Git ブランチと変更状態をプロンプトに表示する設定
autoload -Uz vcs_info
setopt prompt_subst

# Git 状態の色付け設定
zstyle ':vcs_info:git:*' check-for-changes true
zstyle ':vcs_info:git:*' stagedstr "%F{green}"    # ステージ済み → 緑
zstyle ':vcs_info:git:*' unstagedstr "%F{red}"    # 未ステージ → 赤
zstyle ':vcs_info:*' formats "%F{blue} %c%u<%b>%f" # 通常の表示形式
zstyle ':vcs_info:*' actionformats '%B%F{yellow} [%b|%a]%f%b' # マージ中などの表示

# プロンプトの見た目設定
PROMPT=$'\n''%F{cyan}┝ %f%U%c$vcs_info_msg_0_ (%D %*)%u'$'\n''%B%F{cyan}%#%f%b '

# プロンプト表示の直前に Git 状態を取得
precmd(){ vcs_info }
``` 
:::note info
**.zshrcに編集を加える方法**
下記を実行し，vimエディタを開きます．
```zsh
vi ~/.zshrc
```
`i`を一回押し，入力モードにすることで編集可能になります．
:::

:::note info
**vimエディタの脱出方法**
`esc`を押したのち，`:wq`＋`enter`を押す．
:::

## 各設定の解説

### `autoload -Uz vcs_info`

`vcs_info` は Git/SVN などのバージョン管理情報をプロンプトに表示する zsh 組み込み機能です．  
このコマンドで有効化しています．

---

### `setopt prompt_subst`

`PROMPT` 変数内での変数展開（たとえば `$vcs_info_msg_0_`）を有効にします．

---

### Git 情報の表示形式（zstyle）

| 設定 | 意味 |
|------|------|
| `check-for-changes true` | 変更があるかを検出する |
| `stagedstr "%F{green}"` | ステージ済み変更を緑色で表示 |
| `unstagedstr "%F{red}"` | ステージされていない変更を赤色で表示 |
| `formats "%F{blue} %c%u<%b>%f"` | 通常の表示：<ブランチ名>（色付き） |
| `actionformats '%B%F{yellow} [%b|%a]%f%b'` | マージ中などの特殊な状態：太字・黄色で表示 |

---

### プロンプトの見た目（PROMPT）

```zsh
PROMPT=$'\n''%F{cyan}┝ %f%U%c$vcs_info_msg_0_ (%D %*)%u'$'\n''%B%F{cyan}%#%f%b '
```

表示される内容：

- **1行目**：
  - `┝`：プロンプト記号
  - `<ブランチ名>`：Git 情報（色付き）
  - `(%D %*)`：日付と時刻
- **2行目**：
  - `%#`：一般ユーザーなら `%`、root なら `#`

## まとめ

この設定を入れることで，Git のブランチと状態がプロンプトに自動で表示され，作業効率がグッと上がります！

zsh を使っている方は，ぜひ `.zshrc` に追加してみてください．
見た目もわかりやすく，ターミナルでの作業がちょっと楽しくなりますよ😊

## おまけ：より高機能な代替

より多機能な Git 表示を求めるなら [`powerlevel10k`](https://github.com/romkatv/powerlevel10k) などのテーマもおすすめです
リポジトリパターンについて

# リポジトリパターンとは
リポジトリパターンはデータアクセスロジックをビジネスロジックから分離するデザインパターンです。
図にすると以下のようなイメージで、ドメイン層からデータの永続化に関する情報リポジトリクラスに移動します。またリポジトリクラスのインターフェースを切り、ドメイン層に置くことで、ドメイン層とインフラストラクチャ層の依存関係が逆転し、ドメイン層は永続化の関心事から分離されます。

　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267761/62537e57-d892-49ed-9787-6c6793ef6e72.png)

リポジトリパターンのメリットは一般的に以下のような内容が挙げられます。
* ビジネスロジックとデータアクセスロジックを明確に分離できる
* モックリポジトリを使用することで、データアクセス層に依存せずドメインロジックをテストできる
* ドメイン層がインフラストラクチャ層に依存せず、両方がドメイン層で定義されたインターフェースに依存する

もちろん単体でも意味のあるデザインパターンなのですが、DDDの集約と組み合わせることでより良い効果を生み出します。
# 集約とリポジトリパターン
まず集約の簡単な説明を下記に記載します。
> 関連するオブジェクト（エンティティ、バリューオブジェクト）の集まりで、データの一貫性と整合性を保つための明確な境界を定義します。集約ルートは集約への唯一の入り口で、エンティティ（状態の変化があるもの）の変更を唯一許された存在です。

集約ルートにおけるデータの一貫性と整合性はデータベースのトランザクションのイメージではなく、集約全体として常に真であるべき条件をイメージして欲しいです。エンティティやバリューオブジェクト間を跨いで存在するビジネスロジックを含んだバリデーションという理解が個人的にしっくりきます。

それでこの集約が、DDDにおいて永続化の単位になります。しかし、集約は複雑なビジネスロジックを表現する為のもので、永続化や永続化された情報からの復元という関心ごとを持ちたくありません。そこで集約とリポジトリを1対1で持というのがDDDにおけるリポジトリパターンの設計です。

リポジトリは永続化の際は集約の内容をDBにマッピングし永続化を行い、取得の際はDBから読み取った内容を元に集約を再構築します。
これにより、集約（オブジェクト）があたかもメモリ上に存在するかのように扱うことが出来ます。
# 総括
個人的にリポジトリパターン単体だと理解が難しいかったのですが、DDDの集約とセットで考えたら比較的理解が進みました。リポジトリパターンで悩まれている方の力になれれば幸いです。
P1P2P3 単純梁 問題9A) P124「材料力学演習(20221021)」をsympyでやってみたい。

(2025-04-03)・タイトルが間違っていたので直しました。問題8A)→問題9A)

# オリジナル
[問題9A) P124](http://zairikiweb.starfree.jp/zai_enshuh/zai_enshuh_ver.3.3.pdf#page=129)[　＜「材料力学演習(20221021)一括(ver.3.3)」を勉強したい。#sympy](https://qiita.com/mrrclb48z/items/c3274daf5f7a99cfe027#%E4%BD%9C%E6%A5%AD%E4%B8%AD%E7%A7%81%E3%81%AE%E8%A7%A3%E7%AD%94sympy)

？？？タブレット等で、pdfを開く事ができないかも。？？？　

:::note info
[基本例題4.18 P97 simple beam,a downward point load 2
](https://qiita.com/mrrclb48z/items/f633da5f4c8e3f6a7a8d)
:::

# sympyで
・ver0.1
```python
# ver0.1
from sympy import *
var('P1,P2,P3,a,b,c,d,x,RA')
MAC    =RA*x             ;FAC=diff(MAC,x)
MCD    =MAC-P1*(x-a)     ;FCD=diff(MCD,x)
MDE    =MCD-P2*(x-a-b)   ;FDE=diff(MDE,x)
MEB    =MDE-P3*(x-a-b-c) ;FEB=diff(MEB,x)
RA_sol =solve(Eq(MEB.subs({x:a+b+c+d}),0),RA)[0]  #;print("#",RA_sol)
RA_sol1=(RA_sol).simplify()                       ;print("#",RA_sol1)
RA_sol2=(RA_sol).collect(P1).collect(P2)          ;print("#",RA_sol2)
print("#",P1+P2+P3-RA) 
# (P1*b + P1*c + P1*d + P2*c + P2*d + P3*d)/(a + b + c + d)
# (P1*(b + c + d) + P2*(c + d) + P3*d)/(a + b + c + d)
# P1 + P2 + P3 - RA
```
# sympyのBeamで作図
・ver0.2
　作図だけ。値はテキトー。BMDは?省略です。いい値を教えて下さい。
　矢印を消したらダメかもしれません。
```python
# ver0.4
from sympy import *
from sympy.physics.continuum_mechanics.beam import Beam
from sympy import symbols
E , I      =symbols('E , I ')
var('R1,R2,x')
def extract_elements_with_symbol(data_list):
  """
  リストの要素のうち、最初の要素がsympyのSymbolである要素を抽出する関数。

  Args:
    data_list: 要素がタプルのリスト。

  Returns:
    最初の要素がsympyのSymbolである要素のリスト。
  """
  result = []
  for item in data_list:
    if isinstance(item[0], Symbol):
      result.append(item)
  return result
def myRemoveDrawShow(b):
  for item in extract_elements_with_symbol(b.applied_loads):
      b.remove_load(item[0], item[1],item[2])
  p = b.draw()  
  p.show() 
  return
# #######################################
P1,P2,P3,a,b,c,d=1,1,1,1,1,1,1
AC,AD,AE,AB     =a,a+b,a+b+c,a+b+c+d
b = Beam(AB, E, I)
b.apply_load   (R1, 0,-1)
# b.apply_load   (P1,a+b,-1)
b.apply_load   (P1,AC,-1)
b.apply_load   (P2,AD,-1)
b.apply_load   (P3,AE,-1)
b.apply_load   (R2,AB,-1)
# b.solve_for_reaction_loads(R1, R2)
# # # #######################################
# b.plot_shear_force()
# # b.plot_bending_moment()
b.apply_support (0 ,"pin" )
b.apply_support (AB,"roller")
myRemoveDrawShow(b)
# # p = b.draw()  
# # p.show() 
```

![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/7298a079-07e6-44a2-a96e-a5bee47a20f8.png)

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

# いつもと違うおすすめです。
#### 参考文献

~~＞一部に等分布荷重を受ける単純支持はり~~
~~＞JSME p89~~

~~ちょっと違うかも~~ 
~~＞張出しばり 1)~~
~~＞構造力学公式集 表5.5 張出しばりの公式　p154~~
Windows 11移行作業① - 計画を立てよう編

# Windows 11移行作業① - 計画を立てよう編

みなさ～～～～ん！社用PCのWindows 11化は進んでいますか～～～～～！？！？

## 1. 弊社のPC構成

- **総PC台数**：多分370台くらい
- **現在のOS**：全台Windows 10（古いOSが必要なシステムなし）
- **Windows 11の要件を満たしていないPC**：20台くらい
- **アップデート対象PC**：約350台
- **新規購入PC**：50台くらい
- **作業担当者**：私だけ

なんか前より台数増えてる気がするんですけど、気にしない気にしない。

## 2. 計画を立てよう

とりあえず、なんとなくで進めてもどうしようもないので、計画を立てることにしました。

### 私の立てた最強の計画

#### **全体編**
1. 計画を立てよう ← **今ここ！**
2. 準備作業をしよう

#### **アップデートの場合**
1. パイロットユーザーに展開しよう
2. 問い合わせをもらって調整しよう
3. 全社に展開しよう

#### **新規購入PCの場合**
1. 要件を決めよう
2. マスターを作ろう
3. マスターイメージを展開しよう

## 3. 計画の具体的な手順を考える

「計画を立てよう！」と言っても、具体的に何をやればいいのかあんまり思いつかないんですよね。

そんなときに役立ったのが　はい、ドン

[SCSK：Windows 11移行プロジェクトチェックシート](https://www.scskminori.co.jp/column/6199/)
（※ダウンロードは要会員登録）

SCSKくんがWindows 11移行のチェックシートをまとめてくれていたので、これを無理やりExcelにして使うことにしました。

意外と一人じゃ思いつかないこと多いな～と実感。

このシートの一覧に追加で、自社環境に即したやることを増やしていきました。

## 4. まとめ

まじで今回内容がないようなんですけど、こんな感じで進めてます。

次回は **「事前準備として何を行ったか」** を書きます！

では～
[golang] 遅延評価、即時評価を理解する。

# 目的
遅延評価、即時評価を理解する。

# 検証
``` main.go
package main

import (
	"fmt"
	"time"
)

//go:noinline
func Demo() func(int) {
	aaa := 333
	bbb := 444

	closure := func(n int) {
		fmt.Println("クロージャの中で見る aaa: ", aaa)
		fmt.Println("クロージャの中で見る n: ", n)
	}

	defer func(n int) {
		fmt.Println("deferの中で見る aaa: ", aaa)
		fmt.Println("deferの中で見る bbb: ", n)
	}(bbb)

	aaa = 666
	bbb = 888

	closure(bbb)

	go func() {
		time.Sleep(time.Second * 3)
		aaa = 1000
	}()

	return closure
}

//go:noinline
func main() {
	myfunc := Demo()
	myfunc(100)
	time.Sleep(time.Second * 5)
	myfunc(200)
}

```
```
~/praprago$ go run main.go
クロージャの中で見る aaa:  666
クロージャの中で見る n:  888
deferの中で見る aaa:  666
deferの中で見る bbb:  444
クロージャの中で見る aaa:  666
クロージャの中で見る n:  100
クロージャの中で見る aaa:  1000
クロージャの中で見る n:  200
```

注目すべきは、`./main.go:10:2: moved to heap: aaa` の部分です。
クロージャが return されるので、それに備えて、`aaa` をヒープにエスケープしてます。
```
~/praprago$ go build -gcflags "-m=1" main.go
# command-line-arguments
./main.go:13:13: can inline Demo.func1
./main.go:18:8: can inline Demo.func2
./main.go:18:2: can inline Demo.deferwrap1
./main.go:28:5: can inline Demo.func3
./main.go:26:9: inlining call to Demo.func1
./main.go:26:9: inlining call to fmt.Println
./main.go:26:9: inlining call to fmt.Println
./main.go:14:14: inlining call to fmt.Println
./main.go:15:14: inlining call to fmt.Println
./main.go:19:14: inlining call to fmt.Println
./main.go:20:14: inlining call to fmt.Println
./main.go:10:2: moved to heap: aaa
./main.go:13:13: func literal escapes to heap
./main.go:14:14: ... argument does not escape
./main.go:14:15: "クロージャの中で見る aaa: " escapes to heap
./main.go:14:55: aaa escapes to heap
./main.go:15:14: ... argument does not escape
./main.go:15:15: "クロージャの中で見る n: " escapes to heap
./main.go:15:53: n escapes to heap
./main.go:18:8: func literal does not escape
./main.go:19:14: ... argument does not escape
./main.go:19:15: "deferの中で見る aaa: " escapes to heap
./main.go:19:45: aaa escapes to heap
./main.go:20:14: ... argument does not escape
./main.go:20:15: "deferの中で見る bbb: " escapes to heap
./main.go:20:45: n escapes to heap
./main.go:26:9: ... argument does not escape
./main.go:26:9: "クロージャの中で見る aaa: " escapes to heap
./main.go:26:9: aaa escapes to heap
./main.go:26:9: ... argument does not escape
./main.go:26:9: "クロージャの中で見る n: " escapes to heap
./main.go:26:9: n escapes to heap
./main.go:28:5: func literal escapes to heap
```
【EC2】Permissions 0644 for 'xxx.pem' are too open. It is required that your private key files are NOT accessible by others. This private key will be ignored.の解決方法

# はじめに
今回は、`EC2`インスタンスを起動し、`SSH`接続しようとした際に発生したエラーと、その解決方法について記録します。

# 現象
`EC2`サーバーに`SSH`コマンドで接続しようとすると、以下のエラーが表示されました。

```bash
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '[秘密鍵].pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "[秘密鍵].pem": bad permissions
[ユーザー]@[IPアドレス]: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

```
# 解決方法
秘密鍵ファイルのパーミッションが「0644」となっており、他のユーザーが閲覧できる状態になっていることが問題でした。

下記のコマンドで秘密鍵のパーミッションを「400」に変更します。

```
chmod 400 ~/.ssh/xxx.pem
```
再度、`SSH`接続を試すと問題なくログインできました。

# 終わりに
今後も学習を進めながら、得た知識を共有していきます！

#  参考
『Permissions 0644 for 'sample_rsa' are too open.　解決方法』　Qiita

https://qiita.com/yyy752/items/32f66d877de41655b7bb
初めて見つけたバグ、覚えてますか？

QAを始めて一番最初に見つけたバグって何だったか、覚えていますか？  
そして、それを今振り返ってみると、どう感じますか？

---

## 僕が初めて見つけたバグ

僕が初めて報告したバグは、ゲームのダイアログ内の「脱字」でした。  
初めて指摘した時は、それがすごく嬉しかったのを今でも覚えています。
修正されたのはしばらく後でしたが、「自分がバグを見つけられた！」という達成感が確かにあったんですよね。

でも、今そのバグを振り返ってみると、「あれは細かい指摘だったな」と思います。
もちろん放置していいものではないし違和感の解消には繋がったかもしれないけど、
事業やユーザー体験に対してインパクトが大きいかと言われると…という感じ。

---

## 経験を積むと「見るバグ」も変わってくる

QAとして経験を積むにつれて、見るべきバグや注力するポイントが変わってきました。  
たとえば、今だったら単なる誤字脱字よりも、クラッシュバグや、ユーザーからみた導線の不備などにより目が向きます。

そうなってくると、誤字脱字のような軽微なバグはスルーしたり、後回しにしてしまうことも正直あります。
でも、それって（おそらくですが）決して珍しいものではなく、QAエンジニアとして変化している証でもあるのかなと。

---

## 組織に必要なのは「視点の多様性」

ただし、だからといって軽微なバグを軽視し続けるのは良くないとも思っています。

重要なのは、「見る視点の違う人がチームの中にいる状態」と
「その人々が常に循環している状態」を保つこと。  

クリティカルなバグに注力する人がいる一方で、細かいUIのズレや誤字脱字を指摘してくれる人もいる。
そんな役割分担が自然と生まれている状態が理想です。

もっと言うと、ジュニアのメンバーがまず細かいところを見ていって、
経験を積んでいく中でより深くクリティカルな領域にシフトしていく。  
そしてまた新しく入ってきたメンバーが軽微なバグを見ていく。  

この「視点の入れ替わり」こそが、QA組織における**新陳代謝**だと思うんですよね。
この循環が続くことが、健全で持続可能なチームの在り方なのかなと感じています。

---

## おわりに

皆さんは、最初に見つけたバグを今改めて見つけたら、どう感じるでしょうか？

そのとき自分がどんな視点を持っていたかを思い出してみることで、
「自分がどれだけ経験を積んできたか」を実感できると思います。

そして、今どんな視点でバグや品質に向き合っているのか。  
それを次の世代にどうバトンリレーしていくのか。  
そんなことを考えるきっかけになるといいなと思っています。
✨AWSを完全マスター！🚀初心者から上級者までおすすめの4つの講座🌟

こんにちは、韓国在住のsanaです！

AWSに興味があるけど、どこから始めればいいか分からない？👀
今回は、初心者から中級者向けにぴったりのAWS講座を4つご紹介します！💻
実際に役立つスキルを身につけて、クラウドの世界をマスターしよう！✨

💡これらの講座では、AWSのネットワーク設定からセキュリティ強化、パフォーマンス最適化、そしてPythonを活用したアプリケーション作成まで幅広い内容を学べます！🌐🔒⚡

初心者でも安心して始められ、実務で役立つスキルを身につけながら、AWSの機能を深く理解できます！🎯
また、無期限で視聴可能なので、何度でも復習して自分のペースで学習できるのも嬉しいポイント！📚💡
あなたもAWSの達人になって、クラウドの世界を自由に操ろう！🌟
購入後は無期限で視聴可能なので、何度でも繰り返し学習できます！📚

ぜひチェックして、あなたのAWSスキルをアップデートしよう！💪✨
今週も頑張りましょう～　ファイティン～！



おすすめ講義


https://u.inf.run/3QX1Ku0

https://u.inf.run/3FKJwcR

https://u.inf.run/443GqKM

https://u.inf.run/3Y9aroO
自己注意機構（Self-Attention）とは？

## はじめに
ChatGPTのような大規模言語モデル（LLM）で活躍する「transformerアーキテクチャ」。その中心となる技術が自己注意機構（Self-Attention）です。
この記事では、自己注意機構の基本概念と仕組みについて簡単に説明していこうと思います。

## 自己注意機構（Self-Attention）とは？
自己注意機構（Self-Attention）とは、データの各要素が他の要素との関連性を動的に計算し、重要な情報を強調する技術です。

特徴と利点
✅ 長距離の関係性を把握
→ 文章や時系列データ内のすべての要素間の関係を一度に計算。長い文章でも重要な単語同士の関連を捉えられる。

✅ 並列処理が可能
→ RNNのような逐次処理とは異なり、一度に全単語を処理できるため、高速に計算できる。

✅ 文脈を深く理解
→ 各単語の意味を前後の単語との関係から学習し、より自然な言語理解を実現。

## 仕組み
自己注意機構は「クエリ（Query）」「キー（Key）」「値（Value）」の3つの要素を用いて動作します。

(1) 3つの主要要素
クエリ（Q, Query）：「何を探しているか」

キー（K, Key）：「自分が何を持っているか」

値（V, Value）：「持っている情報」

例えば、「私は昨日、東京で美味しいラーメンを食べた」という文があったとします。
「食べた」にとって重要な単語は「ラーメン」です。この関連性を計算するのが自己注意機構の役割です。

(2) 自己注意の計算手順
① クエリとキーの内積を計算し、関連度（注意スコア）を求める
→ 「食べた」が他の単語（「私は」「東京」「ラーメン」など）とどれくらい関係があるかを計算。

② SoftMax関数を適用し、注意係数（重み）を得る
→ 関連度が高い単語に高い重みを与え、不要な単語の影響を減らす。

③ 注意係数を値に適用し、加重和を計算（新しい特徴量として出力）
→ 「食べた」にとって特に重要な単語（「ラーメン」）の情報が強調される。

このようにして、自己注意機構は入力データの中から「本当に重要な情報」を抽出し、モデルが適切に文脈を理解できるようにします。

5. まとめ
✅ 自己注意機構とは、データの各要素間の関係性を動的に計算する技術。
✅ 長距離依存関係を捉え、並列処理が可能なため高速な計算ができる。


参考
- https://huggingface.co/docs/transformers/index
- https://arxiv.org/abs/1706.03762
SharePoint の listItem を driveItem として操作する

Graph api (OneDrive & SharePoint Online かも?) から操作するときに困ったのでメモ。

ブラウザから作ったものが driveItem だと思っていたら listItem だった。

## 要点

ドキュメントライブラリの listItem は `site/{site-id}/list/{list-id}/drive` で指定すれば driveItem として操作できる。

## sharepoint フォルダについて

## OneDrive & SharePoint Online

API が提供されている。大体 Microsoft Graph API と同じ。

アプリからの操作なので、Entra 管理画面でアプリを登録して、権限設定を実施しておく。

### 操作概要

各フォルダや各ファイルにIDが振られているので、それを取ってきておいて、ID指定で操作する。

`site` API でサイトのIDをとって、`site/{site-id}/lists` でリストのIDをとって、`site/{site-id}/drive` でドライブのIDをとって、
取得したIDを使って適宜操作していく。

## listItem と driveItem

ブラウザ操作でドキュメントライブラリを作ると、listItem になった。

ドキュメントライブラリなら[listItem は driveItem として扱われる](https://learn.microsoft.com/en-us/onedrive/developer/rest-api/resources/listitem?view=odsp-graph-online#relationships)みたいな記載はある。

### 困ったこと

listItem としての操作でフォルダを作ろうとすると、`files and folders should only be added to a documentlibrary via the onedrive api` エラーが出る。

listItem の操作は OneDrive API ではないよという記載なので、listItem が SharePoint 管理で driveItem が OneDrive 管理っぽい。

### 解決

`site/{site-id}/list/{list-id}/drive` で driveItem として操作できる。
新人エンジニアはミスの責任を取るべきか

今X上でとあるポストが物議を醸しています

https://x.com/c_a_p_engineer/status/1906218132160835759

**「若い（新人の）エンジニアが、バグや障害に対して責任を取るべきか」**
これに対して、意見は以下の2つに割れているように感じました

1. 新人エンジニアのミスは、上司、もしくは会社に帰属するものである。従って新人エンジニアがバグや障害に対して責任を取る必要はない
2. 起こしたミスが自分には関係がないというスタンスでは仕事が回らず、上司も全てのチェックを漏れなく行うことは現実的にふかのう。従って新人エンジニアもバグや障害に対して責任を取る必要はある

皆さんはどちらの意見が正しいと思いますか？

## 責任を「感じる」と、責任を「取る」の違い
この議論をするために、まず **責任を「取る」** の定義を決めておく必要があります。

責任を「取る」とは、（私の定義では）以下2つのことを言います。
1. 起こっている問題に対して、解決策を考えて、事態を収束させること
1. 同様の問題が起こらないように再発防止策を考え、フローを最適化すること

逆に以下のことは責任を「取る」ことにはなりません
1. 起こった問題に対して、非難される矢面に立つこと
1. 起こった問題の原因は自分だと、罪悪感を感じること

2は、便宜上、責任を「感じる」とでも言っておきましょう。

## 2つの意見は矛盾するのか

さて、責任を「取る」の定義を決めるとわかる通り、**この2つの意見は矛盾しません。**

（当人に事態を収束させる能力があるかに関わらず、）責任を「感じる」のはスタンスの問題であり、自由です。
新人といえど、ミスが起こらないように開発フローを遵守し、起こってしまったミスに対しては、その後の対応をキャッチアップし、再発防止に努める姿勢は必要でしょう。

一方で、実際に責任を「取る」（= 事態を収束し、再発防止策を考える）のは、上司、ないしは会社の役目です。
決められたフローを守った上で起きたミスに関して、上司や会社が、該当者に個人的な責任追及をするのは間違っていると言えるでしょう。

## その他
この意見の内容は以下の本に書いてあることを参考にしました。
ご興味ある方はぜひ。

[悩まない人の考え方](https://www.amazon.co.jp/%E3%80%8C%E6%82%A9%E3%81%BE%E3%81%AA%E3%81%84%E4%BA%BA%E3%80%8D%E3%81%AE%E8%80%83%E3%81%88%E6%96%B9-%E2%94%80%E2%94%80-1%E6%97%A51%E3%81%A4%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E4%B8%80%E7%94%9F%E6%82%A9%E3%81%BE%E3%81%AA%E3%81%84%E6%9C%80%E5%BC%B7%E3%82%B9%E3%82%AD%E3%83%AB30-%E6%9C%A8%E4%B8%8B%E5%8B%9D%E5%AF%BF/dp/447812051X)
openapi2aspidaで意図せずDefineMethodsが生成された話

## 環境
- Node.js: v16.20.2
- TypeScript: v4.2.4
- aspida: v1.7.1

## 経緯
先日openapi2aspidaを使用してAPIクライアントを生成した際、以下のようなimport文が生成されました。

```typescript
import type { DefineMethods } from "aspida";
```

しかし、このプロジェクトではaspida v1.7.1を使用しており、`DefineMethods`型が存在しないため、当然エラーが発生しました。

```
Cannot find export 'DefineMethods' from module 'aspida'
```


## 原因
直接的な原因はpackage.jsonに記載しているscriptでnpxを使用していることでした。
npxはローカルにインストールされていないパッケージを実行する場合、最新バージョンをダウンロードして実行します。

```json
"build:api": "rm -rf ./api && npx openapi2aspida -i http://localhost:4001/docs-json"
```

これにより最新のopenapi2aspidaを使用してしまい、このプロジェクトのaspidaには存在しないDefineMethods型を前提に生成してしまっていたようです。


## 解決策
openapi2aspidaをdevDependenciesに追加し、scriptを変更する。

```json
"scripts": {
  "build:api": "rm -rf ./api && openapi2aspida -i http://localhost:4001/docs-json",
}

"devDependencies": {
  "openapi2aspida": "0.23.2"
}
```

このようにopenapi2aspidaのバージョンを指定することで、無事生成できるようになりました。

## まとめ
`npx`は便利ですが、長期間放置していると今回のように意図しないタイミングでバージョンが上がってしまうため気をつけましょう。（n敗）
Copilot演習シナリオ：OJT受け入れ準備をする

#### Copilot無償版
新卒入社シーズンがやってきました。各社とも受入や研修の準備でてんやわんやかと思います。
全体的な研修は、人事部などが主導して実施されるので問題なく進むでしょう。
その後、各部門で新人を受け入れ、OJTを行う日が来ることでしょう。

先輩諸君、OJTの準備は整っていますか？
部門の業務を教えるのは、部門に所属している先輩方の業務ですよね？
Copilotと一緒に、準備をしてみましょうか。

### 演習シナリオ
あなたは非鉄金属業界の営業担当者です。
新卒入社員を2名受け入れ、そのOJTを担当することになりました。
カリキュラム、スケジュール、アカウントなどの準備をする必要があります。

### 演習手順
**1.Copilotの起動**
https://copilot.microsoft.com/

**2.プロンプトの実行**
次のプロンプトをコピーしてCopilotのプロンプトウインドウに張り付け、実行してください。
"""で囲われている入力部分を、みなさんのタスクに置き換えるとよりイメージしやすくなります。
~~~
#背景
わたしは非鉄金属業界の営業担当者です。
新卒入社員を2名受け入れ、そのＯＪＴを担当することになりました。
カリキュラム、スケジュール、アカウントなどの準備をする必要があります。
#命令
新入社員向けのOJT計画を生成してください。
#入力
"""
OJT期間の始まりは、2025年6月1日です。
OJT期間は15営業日（日本の土日祝日を除く）で09:00から18:00です。
はじまりの30分と終わりの30分は、朝礼と日報の作成時間とします。
OJTで教える事柄は次のとおりです。
組織説明、部門のミッション説明。
日報の入力方法、共有ファイルの置き場、スケジュール管理ソフト（outlook）、顧客情報の管理手法。
予算管理手法、稟議申請手法、見積作成手法、エスカレーション手法。
"""
#出力
時間割（午前、午後）と研修内容がわかるスケジュール表（テキストフォーマット）として生成してください。
~~~
**3.生成結果の修正**
研修スケジュールの概要が作成されました。
空白の時間帯がめだちますので、各部門の業務内容にそって修正を加えてください。
または、Copilotに対して次のプロンプトを入力して、補完しましょう。
~~~
生成されたスケジュールに、次の検収内容を含めてください。
・業務内容A
・業務内容B
・業務内容C
~~~
この演習はこれで終了です。
みなさまのタスクに応用してみてください。
VB.NETでテキストボックスの自動改行を実装する ~句読点・括弧の処理~

## はじめに
VBのテキストボックスで自動改行を実装しようと始めた前回からの続きです。
前回の記事は以下からご確認ください。

https://qiita.com/basketta/items/9262c08cd515bdb1d5b9

## 第2章：句読点や括弧の調整

よりWordっぽくなるように前回実装した改行処理に行頭・行末禁止文字を実装していきます。
具体的には、文の途中で改行が発生した際に、句読点や括弧が行頭ではなく行末に来るように処理を追加します。

```diff_visual_basic
Private Function InsertLineBreaks(input As String, maxChars As Integer) As String
    Dim result As New List(Of String)()
    Dim currentLine As New System.Text.StringBuilder()
    Dim maxChars As Integer = 50 ' 一行当たりの最大文字数を設定
    
    For i As Integer = 0 To input.Length - 1
        ' テキストボックス内の文字を一文字ずつ変数に追加する
        currentLine.Append(input(i))
        
        ' 現在の行が最大文字数に達した場合
        If currentLine.Length >= maxChars Then
+           If Not "。、」』）)】].,;；:：　 /→⇒←⇔".Contains(input(i + 1)) Then
                ' リストに現在の行の文字列を追加する
                result.Add(currentLine.ToString())
                currentLine.Clear()
+           End If
        End If
    Next

    ' 残った文字列を追加
    If currentLine.Length > 0 Then
        result.Add(currentLine.ToString())
    End If

    ' 結果を改行で連結して返す
    Return String.Join(vbCrLf, result)
End Function
```

改行をした際に指定した文字（句読点や括弧の終わり）が行頭になる場合、最大文字数に達した場合の処理をさせないようにしました。

続いて、行末禁止文字を実装していきます。

```diff_visual_basic
' 現在の行が最大文字数に達した場合
If currentLine.Length >= maxChars Then
-   If Not "。、」』）)】].,;；:：　 /→⇒←⇔".Contains(input(i + 1)) Then
+   If "「（(【『[".Contains(currentLine(currentLine.Length - 1)) Then
+       ' 1. 現在の行の最後の文字が括弧（「 など）の場合、改行前に取り除く
+       Dim lastChar As Char = currentLine(currentLine.Length - 1)
+       currentLine.Remove(currentLine.Length - 1, 1)

+       ' 2. 現在の行をリストに追加
+       result.Add(currentLine.ToString())
+       currentLine.Clear()

+       ' 3. 括弧を次の行の最初に追加
+       currentLine.Append(lastChar)
+   ElseIf Not "。、」』）)】].,;；:：　 /→⇒←⇔".Contains(input(i + 1)) Then
        ' リストに現在の行の文字列を追加する
        result.Add(currentLine.ToString())
        currentLine.Clear()
    End If
End If
```

改行をした際に指定した文字（括弧の開始）が行末になる場合、指定した文字の手前までをリストに追加し、変数*currentLine*をクリア、指定した文字は再度変数*currentLine*に追加します。

行頭・行末禁止文字の実装により、よりWordライクなテキストボックスになりました。

次回は改行を挿入した後の注意点やバックスペースの処理についてまとめていきます。
あれれー？react-router の loader、実体と型が別人格！？型参照トラブル解決編

すみません、釣りです :rolling_eyes: Gemini に某ちびっこ探偵団の名台詞を使ってタイトルを生成してみたんですが、いまいちですね。

# はじめに

JISOU というコミュニティに参加しており、react-router を使って課題に取り組んでいたのですが気づきがあったので備忘録です。

# 何が起きたのか

ルーティングは `app/routes.ts` を使って定義しました。

```ts
import { type RouteConfig, route } from "@react-router/dev/routes";

export default [
  route("home", "routes/home.tsx"),
  route("individuals", "routes/individuals.tsx"),
  route("blogs", "routes/blogs.tsx"), 
] satisfies RouteConfig;
```

`routes/individuals.tsx` には次のような loader を定義しました。

```ts
export async function loader() {
  return { qiitaItems: qiita.fetchItems() }
}
```

同じように `routes/blogs.tsx` には次のような loader を定義しました。

```ts
export async function loader() {
  return { microcmsItems: microcms.fetchContents() }
}
```

イケてる定義かはさておき、`routes/blogs.tsx` のなかで loader を呼び出そうとすると、エラーになりました。

```ts

export default function blogs({ loaderData }: Route.ComponentProps) {
  let { microcmsItems } = loaderData
  ...
}
```

```ts
// formatted by Gemini
Property 'microcmsItems' does not exist on type '{
  qiitaItems: Promise<
    {
      id: string;
      title: string;
      url: string;
      thumbnail: string;
      created_at: string;
    }[]
  >;
}'.
```

# どこがわるかったのか

react-router の型定義は `.react-router/types/app/routes/+types` に出力します。これを **適切なパスを指定する** 必要があります。つまり `routes/blogs.tsx` では

```ts
import type { Route } from "./+types/blogs";
```

と参照する必要があります。これを別コンポーネントを指定すると、わたしが直面したエラーになります。

# どうしておきたのか

`routes/individuals.tsx` を作ったあとで **同じ画面構成だしコピペちゃえ** と `routes/blogs.tsx` を作りました。運転免許を取得したての人がよく事故るケースに近いですね。「あ、おれ運転（react-router）得意かも」で事故る。

# 事故防止？の方法もあるには、ある

`useLoaderData` を使いましょう。ドキュメントによると次のようにあり、ファイルにある `loader` を使って型を参照してくれます。

> 最も近いルートのloaderからシリアライズされたデータを返します。

引用：https://remix-docs-ja.techtalk.jp/hooks/use-loader-data

```ts
export default function blogs() {
  let { microcmsItems } = useLoaderData<typeof loader>();
  ...
}
```

# おわりに

コピペ絶対だめ :ng:
Laravelについて

## Laravelとは？
LaravelはPHPでWeb開発をする際に用いられるフレームワーク。

## Laravelの特徴
LaravelはMVCモデルというソフトウェアのデザインパターンを採用している。

Model：データベースに対してデータの登録、取得、更新、削除などを行う。
View：ブラウザに表示される画面の作成を行う。
Controller：ユーザーからの要求に対して、ModelとViewの連携を行う。







## Composerでパッケージ管理できる
LaravelはComposerというパッケージ管理システムを使用している。これは、開発の際に必要となるパッケージやライブラリを管理、インストールする機能を持つツール。
あらゆるライブラリを使用時にほかのライブラリもインストールしなければならないといった依存性の問題が起こる場合があるが、Composerがあればコマンドツールで必要なライブラリをまとめてインストールしてくれるので便利。


## データベースの操作が簡単
Laravelには、データベースとモデルにリレーションを持たせることで、データ操作を簡単にするエロクアントORMとデータ変更などをMVCモデルのモデル側から行うことでデータベースの管理を簡単にするマイグレーションが備わっているので、データベースの接続た作成なども、少ない記述量で済む。



## artisanコマンドで作業量を減らせる
Larevelには、独自のartizanコマンドツールが備わっている。これを利用することでデータベース管理やサーバの起動、ファイルの作成といったコマンドライン上で行えるようになり、Web開発や業務システムの開発も少ないコードで効率的に行える。



## 簡単にバリデーションの設定ができる

Laravelでは簡単な設定でバリデーションを行える。


## 軽量なBladeテンプレートを持っている
LaravelはViewに、Bladeテンプレートという軽量なテンプレートエンジンを採用している。
専用ストレージ機器の内部構造の4要素

これまでの投稿ではサーバ(仮想マシンを含む)とストレージのデータのやりとりの仕様について取り上げてきた。
今回は専用ストレージ機器の物理的な内部構造について記述していきたい。いつものようにかなりスタンダードなお話になる。

## 目次
- ストレージ機器の4要素
- フロントエンドの仕組み
- キャッシュの仕組み
- バックエンドの仕組み
- 物理ディスクの仕組み

## ストレージ機器の4要素

・フロントエンド(ポート＆コントローラ)
・キャッシュ
・バックエンド(ポート＆コントローラ)
・物理ディスク

この4要素の構造、何かに似ていないだろうか。サーバ機器である。
物理ディスクはもちろん、キャッシュはメモリが使われ、フロントエンドとバックエンドの両コントローラの中の人はCPUである。

専用ストレージ機器は、データの読み書きだけに特化したサーバ、ということができる(細かい箇所を見ていけば明確に異なる部分は多々あるが今回の投稿においてはそういうことにしておく)。

ではこれからこのストレージ機器の4要素を各々見ていきたい。

## フロントエンドの仕組み

こちらはホストとストレージの橋渡しをするインターフェースである。ポートとコントローラ、この2つの要素で構成されており、可用性を高めるためにコントローラ複数搭載されていて、各コントローラは複数のポートを備えている。

たくさんのホストからの接続を想定しているため汎用的なサーバ機器よりもストレージ機器の方がフロントエンドポートの数は多く搭載できる仕様になっている。
※例：サーバ5台で仮想化クラスタを形成して、1台の大容量ストレージ機器を共有ストレージとして活用するケースなど

フロントエンドポートでネットワーク接続されたホスト、またはDAS方式による直接接続されたホストからアクセスされる。そのアクセスされる際に利用されるプロトコルとしてFCやiSCSIなどがある。

フロントエンドポートで受け取ったアクセス、データはまずフロントエンドコントローラにて処理される。フロントエンドでポートからコントローラへ渡されるものは基本的に書き込みデータである。
フロントエンドコントローラはこの書き込みデータを内部のデータバスを通じてキャッシュとやりとりをする。書き込みデータはキャッシュに渡される。それが完了するとフロントエンドコントローラからホストへ確認応答メッセージが送信される。

以上のように、フロントエンドは接続されたホストとキャッシュの間でデータのやりとりを行なう箇所である。


## キャッシュの仕組み

ここではホストからのI/Oリクエストにかかる処理の時間を短縮するため、データを一時的に格納する場所である。このキャッシュがあることでストレージ機器のパフォーマンス向上に寄与する。
物理ディスクにHDDを置いたと仮定する。HDDはストレージシステムのドライブの中では低速な部類に入るためデータアクセスには数ミリ秒かかる。一方、キャッシュでのデータアクセスは非常に高速で1ミリ秒もかからないケースが多い。

キャッシュを置いた専用ストレージでは、書き込みデータをいったんキャッシュに配置されてその後にディスクに書き込みがされる。
キャッシュはフロントエンドとバックエンドに挟まれており、前述した書き込みデータに配置だけでなく受け渡すための読み取りデータも配置される。

このキャッシュは仕様に見るべき点が数多くあり、これはまた別の機会の投稿で詳細に触れていきたい。今回はストレージ機器の要素の一つとしての紹介に留めておく。

## バックエンドの仕組み

こちらはキャッシュと物理ディスクとの橋渡しをするインターフェースである。フロントエンドと同様にポートとコントローラ、この2つの要素で構成されている。
可用性確保のため、バックエンド側のコントローラも複数搭載しているのが基本仕様のはずだが、ベンダーによって様々である。複数搭載の場合はコントローラやポートに障害が発生した場合に物理ディスクへの代替パスの提供がある。負荷分散という効果も併せ持った仕様だ。

バックエンドはキャッシュと物理ディスク間でデータ転送する役割を持つ。フロンドエンドからキャッシュに渡った書き込みデータは、そこからバックエンドに転送されて更に物理ディスクに転送される。
このバックエンドコントローラと物理ディスクの間で使用されているプロトコル、インターフェースは主なものとしてSAS、SATA、NVMeなどがあり、まれにFCでの接続も見られる。
物理ディスクと接続するプロトコル、インターフェースについては以下の過去投稿で題材にしているのでよろしければ。

https://qiita.com/cruel_summer/items/32d09bf3dfba28732ed9

また仮想メモリ(物理ディスクの一部領域を一時的なメモリの領域として活用する機能)の制御もこのバックエンドコントローラで処理することもできる。

## 物理ディスクの仕組み

バックエンドコントローラに接続されたストレージ機器の要素の中では最終目的地となる。
ディスクの種類は様々なものがあるが、基本的にHDDとSSDでバックエンド側で記載したインターフェースがサポートされている。ディスクを複数本束ねてRAID構成を作成したり、また種類の違うドライブ同士を混在に組み合わせて利用することもできる。SSDをキャッシュとして使い、HDDを実際のデータ格納として利用できる機能としてNetAppのflashpoolが代表的なものとして紹介した。

以上が、ストレージ機器を構成する4要素のそれぞれの役割・仕組みについて記述した。見れば見るほど仕組み自体はサーバそのものである。
ストレージ機器に使われるインターフェースやプロトコルについて、フロントエンドで使われているものとバックエンドで使われているものの区別がつかなかった時期があったので、同じことで苦しんでいる人のサポートができれば幸いだ。

## ひとりごと

プロ野球が開幕した。
学生時代の友人や仕事仲間とは雑談の中でプロ野球の話で盛り上がることが多く、今年もいろいろなネタを提供されるはず。

自分は特に贔屓のチームを作らずにどの球団のファンとも話せるので、気楽な立場で雑談ができるのが強み？である。
本当は観戦しに球場に足を運びたい気持ちもあるが、今年は忙しいから無理そうかな。テレビやネット中継で楽しむことにする。
Cloudfront でのリファラー制限（Cloudfront Functions を使って）

今回は Cloudfront Functions でやってみました。もともと使っていたので、少しの追記で済みました[^1]。

WAF との比較をまとめようかとも思ったのですが、[比較している方がいらっしゃったのでそちらを見てください](https://qiita.com/mitzi2funk/items/90b3dc81df864d6c0574)。

cloudfront function に送られてくるイベントの中身を調べるのに苦労しましたが、[ここ](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/functions-event-structure.html)とかを参考に作成。

terraform を使う場合のサンプルを抜粋して載せます。

## Cloudfront について

Cloudfront はキャッシュを利用した CDN で、利用者はまずキャッシュサーバーにアクセスします。
リクエストしたコンテンツについて、キャッシュがあって TTL (Time To Live, キャッシュが残る時間) 以内のものはキャッシュが返されます。
キャッシュが無かったりTTLが切れたコンテンツへのアクセスはオリジンへの問い合わせがされます。

アクセスの流れは下図のようになります。

![cloudfront.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740774/2677d88b-b666-46a0-1d78-ebfa5a0390de.png)

## Cloudfront Functions について

Cloudfront Functions を使うと、上図の水色部分でデータの加工ができます。

キャッシュサーバーへのアクセス (viewer request) がインターネットからの入り口になります。

今回実装したいリファラー制限についても、viewer request で対処すればよいだろう、という算段です。

オリジンに直接アクセスされた場合は当然ながら Cloudfront Function は働かないので、
オリジンに対しても Cloudfront からのリクエストだけを許容するように設定しておくと良いですね。[^3]

## ソースコード

```js
// viewer request
function handler(event) {
    var request = event.request;
    var uri = request.uri;
    var headers = request.headers;

    if (!(uri == '/')) {
        if (!(headers['referer'] &&
            headers['referer'].value.includes('target-domain.example.com'))) {
                var response = {
                    statusCode: 403,
                    statusDescription: 'UnAuthorized',
                };
            return response;
        }
    }

    // SPA のための処理
    // 拡張子がある場合を除き、ルートにアクセスさせる
    if (!uri.includes('.')) {
        request.uri = "/index.html";
    }

    return request;
}
```

作るときはヘッダーの中身を調べるのに苦労しましたが、処理は単純なので関数も単純です。

## おわりに

コンソールを使う場合は、Cloudfront のページの「関数」から関数を作って「発行」して、ディストリビューションの設定で関数の紐づけをすればよかったと思います。


[^1]: ウェブページを SPA で作っていて、viewer request で SPA 用のルーティングをしています。今回はそこに追記しています。viewer response でセキュリティヘッダーを追加したりもしています。
[^2]: オリジンに対しても、Cloudfront からのアクセスだけを許可するようにしておくと万全ですね。
viewer request で 301 を返すようにしてリダイレクトさせることもできます。
[^3]: オリジンがELBの場合は、Cloudfront でカスタムヘッダーを付与し、ELB の方でもカスタムヘッダーがあるリクエストだけを許可する、というやり方が公式で紹介されています。
🌟 Google Gemini 2.5 Pro: The Next Evolution in Multimodal AI

2025年、Google DeepMindは「Gemini 2.5 Pro」を発表し、他のLLMとは比較にならないほどの多機能性とマルチモーダル性を携えた深い知性AIプラットフォームとして世界に上り出た。

このブログでは、Gemini 2.5 Proの技術紹介、構成、ユースケース、共同構築API、他のAIモデルとの比較、そして岐震なコード例を含めながら、その未来性を彼端に描いていく。

---

## ▶️ Gemini 2.5 Proとは何か

Gemini 2.5 Proは、Google DeepMindが開発した次世代マルチモーダル大型言語モデルであり、特に下記の機能を特徴としている:

- 文字 + 画像 + コード + データの実時解析
- 複雑な問題解決能力
- 自然言語でのメタ計算と実行
- マルチコンテクストの理解 (文脈、相調、方合、統計算出、進行管理)
- 機械学習 + 文脈棚型合成の高級融合

---

## ⚙️ 技術構成

### マルチモーダルパイプライン

Gemini 2.5 Proは、次のようなモデュールを同時に取り込むことができる:

- **Text encoder** : BERT + PaLM hybrid transformer
- **Image encoder** : ViT-4 基盤のDINOv3-style encoder
- **Audio encoder** : WaveNet encoder
- **Code encoder** : Gemini-Code fine-tuned tokenizer + AST encoder
- **Memory module** : Attention-based long-term cache

### 統合デコーダイング

Gemini 2.5 Proは、各モダリティの特徴を一緒に理解し、上下文や分野を跡を追ってリンクする「分析跡モデル」を損なわずに実行できる。

---

## 📊 ベンチマークな性能

| 機能 | Gemini 2.0 | GPT-4 | Gemini 2.5 Pro |
|--------|--------------|--------|-------------------|
| 多モーダル | ほぼ文字メイン | 画像 + 文字 | 文字 + 画像 + コード + DB |
| 文脈長度 | 約32k | 約128k | → 1M+文脈 cache |
| ファインチューニング | NG | 一部実装 | 箇所ありの理解 |
| 実時性 | 低 | 中 | 高 (再生性完成) |
| この段階 | v1.5 | v4 | v2.5+Fusion attention |

---

## ✨ ユースケース

- 大型コードの読解とデバッグ
- 図表データの理解とレポート化
- メタ計算と解決策の合成
- 学習計画、日記合成
- 起業支援 (code + pitch + idea generation)
- 研究者用の文献理解

---

## ⚖️ 比較対話: GPT-4 vs Claude 3 vs Gemini 2.5

| モデル | 完成度 | 解析能力 | 複雑計算 | 多モーダル |
|--------|------------|----------------|---------------|-------------|
| GPT-4 | → 完成度高 | 中々 | 高級分野不向き | 半形 |
| Claude 3 | 感性高い | 言語解析強 | 軟行動理解強 | 文字+image |
| Gemini 2.5 | 完成度高 + cache | 計算、DB解析に強い | 未来予測、分析強 | 全方体 |

---

## 🚀 実装サンプル

### Python APIでの利用

```python
from gemini_sdk import GeminiClient

client = GeminiClient(api_key="YOUR_API_KEY")

# マルチモーダルデータを混合
response = client.generate(
    text="Explain Einstein's theory with visuals",
    image="./einstein_diagram.jpg",
    code_context="def relativity(...):"
)
print(response.result)
```

---

## 🔐 値段 & 公開

- Gemini 2.5 Pro API : 2025年10月末より正式掲載
- 日本語完全対応
- Pro plan は $30/mo から開始

---

## ✨ 結論: これは「思考」できるAI

Gemini 2.5 Proは、単にテキストを生成するのではなく、想議、分析、統合的解析をエンジンにより行う、「新時代の思考AI」の元稿と言える。

GPTやClaudeとの違いは「文脈を跡を追う」力。

Geminiの時代は始まった。

---

最新APIの使い方、メタ計算プロンプトの作り方も詳しく解説予定ですので、フォローをお忘れなく🚀
[Linux][command] ファイルシステム管理_パラメータ管理_tune2fs

# ファイルシステムのパラメータ管理
## tune2fsコマンド
- `tune2fs`: tune (ext2) file system
~~~terminal:
# tune2fs [オプション] デバイス名 
~~~

| オプション | 英語の由来 | 説明 |
|:--|:--|:--|
| (default) | tune (ext2) file system | `-c` は `-1`（無制限）、`-i` は `0`（無効）、`-j` はなし（ext2 のまま）、`-L` は変更なし |
| `-c 回数` | check mount count | 指定回数マウントされた後に `fsck` を実行するよう設定 |
| `-i 時間 [d\|m\|w]` | interval between checks | 指定期間ごとに `fsck` を実行するよう設定（`d=日, w=週, m=月`）<br>単位がない場合は`d=日`となる |
| `-j` | journal | ext2 ファイルシステムにジャーナルを追加し ext3/4 に変換 |
| `-L ラベル名` | label | ファイルシステムのラベル（名前）を設定・変更 |

# Ping-t
- [3224_tune2fs -c](https://mondai.ping-t.com/question_subjects/31/question_sessions/32477286/progressing_questions/497681635)
- [3225_tune2fs -i](https://mondai.ping-t.com/question_subjects/31/question_sessions/32581786/progressing_questions/499228227?result=true)
- [3226_tune2fs -j](https://mondai.ping-t.com/question_subjects/31/question_sessions/31602419/progressing_questions/484263621)
- [3301_tune2fs -L](https://mondai.ping-t.com/question_subjects/31/question_sessions/30205245/progressing_questions/462752075)
- [37120_tune2fs -i](https://mondai.ping-t.com/question_subjects/31/question_sessions/31602419/progressing_questions/484263615)
Dart（Flutter）の const / final を完全理解

Flutterで開発を始めたばかりの方が最初につまずきやすいのが、`const` と `final` の違い。  
JavaScript（JS）に慣れていると、同じようなキーワードに見えて実はまったく性質が異なるので注意が必要です。

この記事では、**Dartにおける `const` / `final` の違い**を丁寧に解説し、**JavaScriptとの比較**も交えて整理します！

---

## ✅ `const` と `final` の違い（Dart編）

| キーワード | 再代入 | 中身変更 | 決定タイミング | 代表的な用途 |
|------------|--------|----------|----------------|----------------|
| `const`    | ❌ 不可 | ❌ 不可 | コンパイル時（コード書いた時点） | 完全な定数（ID、ラベルなど） |
| `final`    | ❌ 不可 | ✅ 可   | 実行時（アプリ起動中に決定）     | 一度だけ代入したいけど動的な値（日時、引数など） |

---

### ▶️ `const` の特徴

- 定数として**完全に固定**
- コンパイル時にすべての値が決まっている必要がある
- **中身すら変更不可**（immutable）

```dart
const pi = 3.14;

const List<String> names = ['Alice', 'Bob'];
names.add('Charlie'); // ❌ エラー：変更できない
```


### ▶️ `final` の特徴

- 一度だけ値を代入可能（再代入はできない）  
- 実行時に初期化可能なので、柔軟性がある  
- **中身は変更可能**（mutable）

```dart
final now = DateTime.now(); // 実行時に決まる

final List<String> names = ['Alice', 'Bob'];
names.add('Charlie'); // ✅ OK：中身は変更できる
```

JSで言うところのconstがfinalに近い感じで
Flutterのconstは別の言語のconst(変更不可の厳密な定義)と同じ感じみたいですね


## Flutter開発でよく使うパターン：`static const`

Flutterでは、アプリ内で共通の設定やIDを扱う場合に、`static const` を使って定数を定義するのが一般的なようです。

```dart
class AppConfig {
  static const String appName = 'MyApp';
  static const int maxUsers = 100;
}
```
このように static const を使えば、どこからでも以下のようにアクセスできます：

```dart
print(AppConfig.appName); // → "MyApp"
```

厳密に管理したい値は`const`を使っていくイメージみたいですね
Flutterでのデータ管理をする場合は上記のようにClassの中にstatic constで定義していくのがいいみたいです！
Clineのカスタムインストラクション(Custom Instructions)の設定

1 Custom Instructionsの設定:

1 公式ガイド（Memory Bankのセットアップ） にある Custom Instructions for Memory Bank の部分をコピーします。
https://docs.cline.bot/improving-your-prompting-skills/cline-memory-bank


2 VS Code上でClineの設定を開く

Cmd + Shift + P → Cline: Open Settings

または、拡張機能一覧からClineを選び、「Settings」→「Custom Instructions」

補足：後述の初期化コマンドを実行しても…
initialize memory bank を実行すると、必要なMarkdownファイル群が memory-bank フォルダに生成されますが、

その際も、Clineはまだそのファイル群を参照するようにはなっていません。

参照させるには、「Custom Instructions」が必要です。


2 memory-bankディレクトリの作成:

プロジェクトのルートディレクトリにmemory-bankというフォルダを作成します。​

3 Memory Bankの初期化:

Act Clineのチャットインターフェースでinitialize memory bankと入力します。​

これにより、memory-bankフォルダ内に以下のMarkdownファイルが自動生成されます：​


```projectbrief.md
プロジェクトが何を実現しようとしているのか
誰のために、どんな価値を提供するのか
全体像やビジョン、スコープを簡潔に記述
```

```productContext.md
製品が属する市場、ターゲットユーザー、競合との関係性
ビジネス的な目的（収益化・SEO・流入増など）
サービスの立ち位置や特性
```


```activeContext.md– 現在の作業・状況
役割：今チームや開発者が注力しているタスクや課題
現在進行中の機能やバグ修正
技術的な課題や検討中のテーマ
短期的なゴールやスプリント内容
```


```systemPatterns.md– システム設計・コード方針
役割：採用している設計方針・アーキテクチャ・命名規則など
MVC、クリーンアーキテクチャ、DIなどの採用有無
デザインパターン、ミドルウェア構成
命名規則やディレクトリ構造のルール
```

```techContext.md– 使用技術とツール
役割：使っている言語・フレームワーク・ライブラリ・開発環境の情報
PHP / WordPress / MySQL / RSSフィードなど
外部ライブラリやAPI
ローカル開発環境やCI/CDツールの構成
```

```progress.md – 進捗記録・変更履歴
役割：最近の更新、マイルストーン、今後の予定
いつどんな機能が追加されたか
バグ修正や技術的改善の履歴
次の予定や計画
```

4 clinerulesファイルの作成:

newsサイトを例に出す

プロジェクトのルートディレクトリに.clinerulesというファイルを作成し、プロジェクト固有のルールやガイドラインを記述します。​

このファイルには、コーディング規約や設計パターンなど、Clineが参照すべき情報を含めます。 ​

```.clinerules
## プロジェクト概要

例
本プロジェクトは、WordPressベースで運用されているニュースサイト（xxxxxxxxxxxxx.jp）です。  
目的は、記事を生成・管理し、連携先ニュースサイト（例：x、y）へRSSフィードとして提供することです。

## RSSフィード構成
RSS出力は `news/feed/` 以下で管理されており、以下の連携先が存在します：

- https://xxxxxxxxxxxxx.jp/feed/rss_x.xml
- https://xxxxxxxxxxxxx.jp/feed/rss_y.xml

## 配信制御（限定配信）
記事ごとに配信対象か判定するため、`news_postmeta` テーブルに `meta_key = _transfer_limited_delivery` を設定しています。

news_postmetaにて個別の配信設定を行います
const LIMITED_DELIVERY_NEWS_MEDIA = 1; // xへのRSS限定配信対象
const LIMITED_DELIVERY_NEWS_MEDIA = 2; // yへのRSS限定配信対象
const LIMITED_DELIVERY_NEWS_MEDIA = 3; // xyへのRSS限定配信対象

値の付与はWordPress管理画面でUIから行われ、値の処理は Config.php や const.php にて定義されています

```


5 Custom Instructionsの適用:

Clineのチャットインターフェースでfollow your custom instructionsと入力し、設定したカスタムインストラクションを適用します。​


これにより、ClineはMemory Bankの内容を読み込み、プロジェクトのコンテキストを理解した上で作業を進めることができます。​


6 Memory Bankの更新:

作業の進捗やプロジェクトの変更点を反映させるため、適宜update memory bankと入力してMemory Bankを更新します。​


これにより、Clineは最新のプロジェクト状況を把握し、適切なサポートを提供します。​