OmniAICreator/Qiita-1.07M huggingface dataset:
【学習】実践Next.js でPrisma周りでハマったところ

[実践Next.js —— App Routerで進化するWebアプリ開発](https://www.amazon.co.jp/dp/4297140616/ref=sspa_dk_detail_0?psc=1&pd_rd_i=4297140616&pd_rd_w=8VWfD&content-id=amzn1.sym.f293be60-50b7-49bc-95e8-931faf86ed1e&pf_rd_p=f293be60-50b7-49bc-95e8-931faf86ed1e&pf_rd_r=6HSGJTSWS6ADGEPA3RMR&pd_rd_wg=M45ll&pd_rd_r=75430243-0cc2-4570-8fd3-a0012fafa859&s=books&sp_csd=d2lkZ2V0TmFtZT1zcF9kZXRhaWw)
6章のPrisma周りのエラーにハマったので同じような人向けにその解消方法を備忘録として残す。

## マイグレーション
``applications/packages/sns-web-2``の環境構築のため
```
$ npm run db-migrate-dev
```
マイグレーションコマンドを実行したところ以下のようなエラーが出た。
```
Error: P1010: User `root` was denied access on the database `app-db.public
```
権限周りが原因だと思い、docker内部でpostgresを起動しrootユーザを作成、権限付与など色々いじっていたが真因は既にローカル上でpostgresがデフォルトポート5432で起動していたためdocker上ではなくローカル上のpostgresに向けてコマンドが実行されていたことがエラーの原因であった。ローカルのpostgresをkillして解決。

上記を解決した上でもう一度マイグレーションコマンドを実行したところ次のようなエラーが出た。
```
Error: @prisma/client did not initialize yet. Please run "prisma generate" and try to import it again.
```

解消方法は以下のコマンドを実行してprismaクライアントを作成すればok
```
$ npx prisma generate
```
クライアント作成後、再度マイグレーションコマンドを実行したところ、正常に実行され解決。

## ハマったところ
結論から言うと、モノレポ構成についてとprismaについての二つの知識が欠けていたのでエラー解消に時間がかかった。

モノレポではサブディレクトリ側にnode_modulesが作成されないので、そのような状態でもエイリアスが正しく効くのか疑っていた。

また自身のnode_modulesの方を参照する
`applications/packages/sns-api-2`の方は正常にマイグレーションが実行され、かつ`npm run`でTabの補完が効く一方、sns-web-2ではTabの補完が効かなかったのでモノレポ構成に関する設定に誤りがあるのではないかと疑っていた。

## エラーの再現性
なぜこのエラーが起きたのか原因を特定したくて、applicationsディレクトリを削除後、
再度クローンして手順通りにコマンドを実行して再現しようとしたが、同じエラーは発生しなかった。（何それ怖い）
ローカルのポート5432が被っていた状況は再現してないのでそれが関係するかもしれない。また初回では操作ミスで余計にnpm installを実行していたので、そのせいかもしれない。

## prismaについて調べてわかったこと
正常にマイグレーションが実行されると
```
node_modules/.prisma/client/schema.prisma
```
にスキーマファイルが作成される。

sns-api-2だけモノレポ構成から外している理由は同一のprismaを参照している場合、後発の
`prisma migrate dev`によって`node_modules/.prisma`配下のスキーマファイルの内容が上書きされてしまうからだと考えられる。

そう考える理由はsns-web-2の方は`npm install`するが、sns-api-2の方は`npm install`
しない状態でsns-web-2のディレクトリで`npm run db-migrate-dev`を実行`applications/node_modules/.prisma`配下にsns-web-2側の設定でスキーマファイルが完成されるのを確認した後、sns-api-2のディレクトリで`npm run db-migrate-dev`を実行したところ、親ディレクトリのprismaが呼び出されているらしく、マイグレーションが実行され
`
applications/node_modules/.prisma/client/schema.prisma
`
がsns-api-2側の設定で上書きされる挙動をしたことに偶然気づいたからだ。

以上、誰かの役に立てば幸いである。
リーダブルコード（第6章〜第7章）の学び

## はじめに

第6章では「コメントの書き方」がテーマでしたが、本質は「コードを読む人の立場になってコメントを残すこと」に尽きると感じたため、本記事では第7章の学びを整理します。

---

## 第7章での学び

### 条件式の可読性を上げる法則

条件式は、「変化する値を左側に、固定的な比較値を右側に」書くと読みやすくなる、という話。

たとえば、

```c
if (length > 10)
```

の方が、

```c
if (10 < length)
```

よりも読みやすい。

他には例えば、

```c
while (bytes_received < bytes_expected)
```

の方が、

```c
while (bytes_expected > bytes_received)
```

よりも読みやすい。

| 左側（変化する値）       | 右側（固定された比較対象） |
| --------------- | ------------- |
| 調査対象・状況に応じて変わる値 | 基準値・あまり変わらない値 |

このようにすることで、可読性が上がるということ。ものすごく納得した。

---

### `if/else` ブロックの読みやすさを高めるコツ

次のようなルールが紹介されていた。

* 否定形より肯定形を使う。`if (!debug)` よりも `if (debug)` の方がいい。

* 単純な条件は先に書く

* 目立つ・重要な条件を先に書く。条件分岐において、重要な判断材料は先に持ってくると意図が伝わりやすい。

ただし、これらはあくまで「原則」であって、状況に応じて自分で判断が必要とのこと。

---

## おわりに

コードを書いていると、「この書き方で読みやすいのか？」と悩む場面がたまにあります。
迷ったらまたこの内容を読み返して、判断の軸として活用していこうと思います。
数値から文字列への変換

数値 [N] って書いたらエラーがでた。数値ってインデックス取得できないんだね…。

<br>

## 問題概要

2つの数値 `X`, `Y` と、1から始まる位置 `N` が与えられます。`X + Y` の結果の、
`N`文字目の数字を出力する問題.



入力例：

    18471
    -1727
    5

出力例：

    4

条件：
・ -10^12 ≦ X , Y ≦ 10^12
・ 0 ≦ X + Y
・ X + Y の計算結果の桁数は N 以上 13 未満
<br>

https://paiza.jp/works/mondai/string_primer/normal_step5

<br>

## ❌NGコード
```js
const rl = require('readline').createInterface({input:process.stdin});
const lines = [];

rl.on('line',input => lines.push(input));
rl.on('close',()=>{

    const [X,Y,N] = lines.map(Number)
    result = (X + Y);
    console.log(result[N])

});
```
❌ 問題点
数値は配列や文字列じゃないのでインデックスアクセスできない！
→ 文字列化してからインデックスで取り出す必要がある。

<br>

## ✅OKコード
```js
const [X, Y, N] = lines.map(Number);
const sumStr = String(X + Y); // 数値を文字列に変換
console.log(sumStr[N - 1]);   // Nは1-indexなので-1する
```
- `String()`で文字列化
- `N - 1` で0-basedに変換（地味に忘れがち）

## <br><br>✅絶対値バージョン（保険）
```js
const [X, Y, N] = lines.map(Number);
const sumStr = Math.abs(X + Y).toString();
console.log(sumStr[N - 1] ?? '');
```
- 負の数でも安心！`Math.abs()`で符号除去

- `?? ''` で足りない桁を空文字にしておく保険（例：`N` が大きすぎても安心）

<br><br>

## 新しく学んだこと

- 数値[N] は使えない → 文字列化してからインデックス参照

- `Math.abs()` と `.toString()`の合わせ技で符号無視処理。

- 数値→文字列→インデックス参照の流れ。

<Br><br><br>[僕の失敗談(´;ω;｀)と解決法🐈](https://paizabeginner.wordpress.com/2025/05/13/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc%ef%bc%9a%e6%95%b0%e5%80%a4%e3%81%8b%e3%82%89%e6%96%87%e5%ad%97%e5%88%97%e3%81%b8%e3%81%ae%e5%a4%89%e6%8f%9b/)
[2025年最新版]ほんの一瞬だけ使えたら満足なんです。一瞬だけCloudShellのクレデンシャル（アクセスキー）を拝借させていただけませんでしょうか

過去、こちらの記事を投稿させていただいております。

https://qiita.com/moritalous/items/8a548ce1743b0b4f8b6d

イキってパイプしてJQで取るんだぜー的なのを書いてたんですが、、、 **公式コマンドで一発で取れることがわかりました**

```shell:CloudShell
aws configure export-credentials --format env
```

出力

```
export AWS_ACCESS_KEY_ID=*****
export AWS_SECRET_ACCESS_KEY=*****
export AWS_SESSION_TOKEN=*****
export AWS_CREDENTIAL_EXPIRATION=*****
```

これを使いたい環境コピーしたらOK。

:::note
Amazon Q Developer CLIが教えてくれました！
:::
Laravel Job並列処理｜同時実行問題を解消する

## はじめに

実務で経験した課題を記事で記録します。

サーバ1台で稼働している環境での記述です。
スケーラブルなサーバ環境では今回の記事を参考すると想定外の動作につながる可能性が高いです⚠️

## 背景

他社の広告を配信した際は、他社にImpressionを通知する必要があります。
外部Apiをコールするため、通信に時間がかかるためLarvel Jobを利用してバックグラウンドで実行する設計をしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3256444/b90b560e-5a71-425e-98a8-ca5c05ab09c8.png)

## 課題

1. 外部apiをコールするJobなのでボトルネックになる可能性が高い
2. LaravelのJobを並列処理すると同時実行問題が発生する（同じJobを複数回実行してしまう）

## 工夫：並列処理の設定をする

```
php artisan queue:work --queue=send_impression
php artisan queue:work --queue=send_impression
php artisan queue:work --queue=send_impression
```

上記のようにキューワーカーを複数実行することで並列処理ができます。
ですが、同時に同じJobを同時実行する問題が発生します。

そもそもキューワーカーが各々異なるキューを参照するようにすればどうかな？
という考えからキューを分割する設計を考案しました。

```
php artisan queue:work --queue=send_impression1
php artisan queue:work --queue=send_impression2
php artisan queue:work --queue=send_impression3
```

上記のように設定することで同時に同じJobを取得する可能性を０にすることができました。

## 処理のイメージ

### キュー分割前

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3256444/09615427-9cbf-4235-bb2b-8d968ca03666.png)

### キュー分割後

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3256444/776b3a9f-f925-4008-807d-9436e0f27d60.png)

## キュー分散で達成できたこと

- 並列処理によるパフォーマンス向上
- スケーラビリティの向上
- 同時処理問題の解消


#### 以上、ここまで読んで頂いた皆さんありがとうございます！
【Snowflake】【SAS】SASの転置構文をSnowflakeに書き換える方法

## 目的
データを転置することができるSASのTRANSPOSEプロシジャを、Snowflakeで書き換える方法をご紹介します。

### テストデータ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3973221/0e86cafa-e97d-4a3c-ab08-6469cbfd7bdb.png)

今回は上記の縦持ちデータを、以下のように横持ちのデータに変換します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3973221/23b24601-272d-402f-99b1-f8a9bfbcd0ff.png)


### TRANSPOSEプロシジャとは
SASのTRANSPOSEプロシジャは、行と列を入れ替える（縦横変換する）処理です。

端的に言うと、以下の通りです。
・行データを列に変換（= ワイド形式への変換）
・または 列データを行に変換（= ロング形式への変換）


### SASコード
```
PROC TRANSPOSE DATA=TEST_A OUT=TEST_B;
BY 商品コード;
ID 店舗名;
VAR 購入日;
```
#### SASコード解説
BYステートメントにはグループ分けしたいカラムを、
IDステートメントには横持ち後の列名に指定したいカラムを、
VARステートメントには横持ちにしたいカラムを指定することで、
簡単に転置することができます。


### Snowflakeに書き換えるには
上記をSnowflakeで書き換えるには、PIVOTを使います。

### PIVOTとは
SnowflakeのPIVOTは、行データを列に変換する機能です。

端的に言うと、以下の通りです。
・カテゴリの値を列に変換して、集計結果を並べる
・クロス集計のようなイメージ

注意点としては、以下の2点が挙げられます。
・FOR job IN (...)で列名として並べるカテゴリを明示すること
・集計関数（例：SUM、COUNTなど）と一緒に使うこと


### Snowflakeコード
```
CREATE OR REPLACE TABLE TEST_B AS
SELECT * FROM TEST_A
PIVOT(SUM("購入日") FOR "店舗名" IN ('A店', 'B店', 'C店'))
AS p()
ORDER BY "商品コード";
```

#### Snowflakeコード解説
簡単に説明すると、SASコードでBY、ID、VARそれぞれに指定されているカラムを上記のSnowflakeの構文でそれぞれ以下の対応表に沿って書き換えれば再現可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3973221/1d904219-b1b2-4a1e-a94a-519cd15d57e9.png)

## まとめ
SASのTRANSPOSEプロシジャは転置を意味します。
これをSnowflakeで書き換えるには、PIVOTを使えば再現可能です。


## 最後に
本記事ではSASの横持ち構文をSnowflakeで書き換える方法を説明しました。
SASからSnowflakeへコードを書き換える記事はそう多くないと思うので今後もこのような記事を投稿できればと思っております。


## 関連サイト
https://docs.snowflake.com/ja/sql-reference/constructs/pivot

https://documentation.sas.com/doc/ja/pgmsascdc/v_062/proc/p1r2tjnp8ewe3sn1acnpnrs3xbad.htm

## 宣伝
株式会社ジールはMicrosoft Azure やAWS（Amazon Web Services）、Google Cloud Platform（GCP）、Oracle Cloud Infrastructure（OCI）など、多彩なクラウドプラットフォーム構築・運用の知見を有しています。そのため、複数のクラウドサービスを組み合わせるマルチクラウド環境においても、ベンダーロックインを回避し、お客様のご要望に応じた最適なクラウドプラットフォームの構築・運用への対応が可能です。
https://www.zdh.co.jp/products-services/cloud-data/
AWS MGN移行時の静止点の取り方

# 内容
AWS MGNを使用して、オンプレミス環境からAWSへ仮想マシンをリホスト方式で移行します。MGNはブロック単位で継続的にレプリケーションを行います。オンプレミスのサーバでMySQLやSQL Serverなどのデータベースが稼働している場合、静止点（データの整合性が取れた状態）を確保した上でカットオーバー処理を行う必要があります。ここでは、MGNの移行フローを踏まえ、静止点を取るべきポイントを確認します。


# 移行の流れ

[移行ワークフロー](https://docs.aws.amazon.com/ja_jp/mgn/latest/ug/migration-workflow-gs.html)に移行の流れの記載があります。上記手順の中から移行操作とデータ同期の箇所を抜き出すと下記の様な流れになります。「ソースサーバ上の全ての運用サービスを停止」後、カットオーバー処理にて最終同期を実施して切り替えを行います。

* 初期同期の完了を待つ
* テストインスタンスを起動
* テスト完了後、テストインスタンスを終了
* ソースサーバ上の全ての運用サービスを停止
* カットオーバーインスタンスを起動
* カットオーバーの確定処理

# 静止点の取り方
AWS MGNには、データベースの整合性を自動で担保するようなアプリケーション整合性の制御機能はありません。そのため例として、下記の様にユーザ側でアプリケーションの状態を制御し、静止点を確保する対応が必要です。

* WEBサーバのサービス停止
* データベースサービスの停止
* ファイルI/Oを行うサービスの停止

# 移行の検証

移行検証を実施して、ポイントとなる箇所を見ていきます。下記はソースインスタンスにエージェントのインストールを行い、初期同期完了、テストインスタンス起動→テスト完了→テストインスタンス終了を行い、カットオーバーインスタンスの起動準備が出来た状態です。ここから最終同期処理の確認を行います。

![mgn03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/059b680f-9f57-4a1e-a563-d48eb0188116.png)


今回、Amazon Linux上でMariaDBが稼働している環境を想定します。下記の様に静止点を取るためにMariaDBのサービスを停止します。また、自動起動を一時的に無効化しておきます。

```shell
systemctl stop mariadb
systemctl disable mariadb
```

また、同様のポイントで同期が行われているか簡易的に確認するために、テストファイルも作成しておきます。

```shell
touch 20250513.txt
```

サーバの再起動を行います。
```shell
reboot
```


![mgn10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/5326b40e-64d5-4be0-82e2-bfffa64d88d9.png)

レプリケーションステータスを確認します。「最終閲覧日」が再起動後の時間であることを確認します。

「カットオーバーインタンスの起動」を行います。

![mgn04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/6dcf0b3b-069d-4465-bc9b-e346775f3434.png)


カットオーバー後のインスタンスにログイン後、MariaDBの状態が停止中であること、テスト用ファイルが存在することを確認します。

```shell
systemctl status mariadb
○ mariadb.service - MariaDB 10.5 database server
     Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; preset: disabled)

ls
20250513.txt 

```


MariaDBのサービス起動、自動起動を有効化後、「カットオーバーの最終処理」を行います。

```shell
systemctl start mariadb
systemctl enable mariadb
```
DifyからBedrockが呼び出せなかった記録

# やりたかった事
## こちらを参考に
Difyコミュニティ版を起動してみました

https://qiita.com/nidcode/items/b1f4c46bb16a99df02a1

## 困った事
システム設定でBedrockのClaudeモデルが指定できずめちゃくちゃ調べましたがどうあがいても無理でした。<BR>
少なくとも現時点のBedrockのプラグインバージョン`0.0.17`では頑張るだけムダです。

## 結論①
`0.0.17`だと動かない。`0.0.13`だと動きました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351028/51382679-1904-4803-8825-a361b3e08d09.png)

## 結論②
とりあえず`US East(N.Virginia)`でやってみる。
どうもアジアパシフィックだと上手く行かないですね。ISSUEにも上がっていたのでまだこれからかなと？


***

# PROMPT-Xについて
東京・鹿児島・高知の3拠点で、商用時系列データベースCLOUDSHIPと可視化ソフトRealBoardを軸としたIoTプラットフォーム向けソフトウェアの開発・販売を行うメーカーです。IoT関連の開発支援サービスやソリューション開発も提供しています。鹿児島・高知での[開発エンジニア採用](https://www.prompt-x.jp/recruit)を強化中で、PROMPT-Xで働きたいと思える情報発信に努めています。
scripting.dictionaryについて

scripting.dictionaryについて

VBAで用いられるオブジェクト

例

Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")

' 値の追加
dict.Add "名前", "太郎"
dict.Add "年齢", 30

' 値の取得
MsgBox dict("名前")  ' 太郎 と表示される

' 値の変更
dict("年齢") = 31

' キーの存在チェック
If dict.Exists("名前") Then
    MsgBox "名前があります"
End If

' キーの削除
dict.Remove "年齢"

' 全件ループ（キーと値を出力）
Dim key As Variant
For Each key In dict.Keys
    Debug.Print key & "：" & dict(key)
Next


連想配列としてキーと値のペアを扱うオブジェクト
Pythonでいうdict、JavaScriptでいう、｛｝。
🚀【第1回】AIで見積もり革命？Vibe Codingでプロジェクト見積もりを自動化してみた

#### 自己紹介

海外のオフショア開発会社でCTOを務めています。
最近のAIトレンドにより、ソフトウェア開発の在り方は大きく進化しています。
当社でも「Vibe Coding」をキーワードに、AIエージェントを開発プロセスに積極的に取り入れる研究を進めています。
今回は、Vibe CodingでAI見積もりシステムを実装できたから、その取り組みや経験について共有したいと思います。

__ソフトウェア開発の「見積もり」__ に悩んだこと、ありませんか？

- 「この要件、何人日かかる？」

- 「どれぐらいのチームなら納期に間に合う？」

- 「過去の似た案件から見積もりたいけど、探すの面倒…」

そんな悩みを抱えるPMやBA、そして開発チームに向けて、
今回はAI × Vibe Codingを活用した、プロジェクト見積もりの自動化システムを紹介します！

### 💡 なぜ今、「AIで見積もり」なのか？
現場では、見積もりが「勘」と「経験」に依存しがちです。
しかし、今やAIがコードを書き、設計を提案し、プロダクトの形まで示してくれる時代。

それならば、プロジェクト見積もりだってAIにやらせてみようじゃないか！

### 🔧 Vibe Codingとは？
Vibe Codingは、自然言語での指示から設計・コード生成までをサポートする
次世代のAI開発支援環境です。

- 会話ベースでの開発
- Contextを保持したまま設計支援
- モデル同士の連携（例：要件定義 → 設計 → コード）も可能

実際に、私はこのVibe Codingを活用して、
__「要件を入力 → AIがプロトタイプ」__ というシステムを作りました。

⚙️ どんなことができるのか？
今回のシリーズでは、以下のようなことを深掘りしていきます：

| テーマ                     | 内容                               |
| ----------------------- | -------------------------------- |
| Agile開発とVibe Codingの親和性 | 小さく作ってすぐに試せる、AIによる反復開発のリアル       |
| アイデアからプロトタイプまでの爆速開発     | PMが考えた構想が、1時間後には動くものに？           |
| Cursor・Windsurfとの比較     | 他のAIツールと比べてVibeは何が違うのか？          |
| 実際に使ってわかった課題            | 精度のブレ、Prompt設計の難しさ、Contextの限界とは？ |
| AIで見積もりの精度はどこまでいける？     | ストーリーポイント・人的リソース・コストを自動算出してみた結果… |


### 🛠️ 今回の成果物（チラ見せ）
#### 💬 入力：
> ECサイトの注文管理システムを作りたい。管理画面・APIが必要で、CSVアップロードも可能にして欲しいです

#### 🤖 出力（AI）：

>- 機能一覧
>- 開発ステップ
>- チーム構成
>- 各タスクの工数

「これは…PMの仕事が半分になるのでは？」
というレベルまで仕上がってきています。

### 📚 次回予告
次回は、__「Agile開発 × Vibe Coding」__ について詳しく紹介します。

- Vibe Codingで実現する「超短サイクル開発」とは？
- ユーザーストーリーがそのまま設計に？！
- 実際のコラボレーション風景を公開！

### AI見積もりシステムの主な流れの結果をスクリーンショットしてみます。ご覧でください。
#### 案件作成
![p1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4086206/6c58b64f-9c5f-4955-8e4b-e7d9cf2007a9.png)
#### 案件詳細
![p2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4086206/421e820f-13cf-41cb-a2e8-d616b625419f.png)
#### 案件の要件定義入力
![srs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4086206/a90fe29b-15a8-441f-a1e7-1b373c72ef98.png)
#### AIで見積もり中
![ai-est.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4086206/350a9e7b-27c2-485c-a111-31c4377b5797.png)
#### AI生成した見積もりをプレビュー
![ai-prev.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4086206/7f004e71-15f5-4980-bd71-d1949f95ffae.png)
#### 見積もり手動で編集
![est-edit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4086206/77d7ad6d-6782-4d49-aed5-71e2c336d9fe.png)
#### 見積もり合計（工数と単価）
![gokei.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4086206/21571e23-8127-4ec9-9e89-722d3309e3d9.png)

### 🙌 最後に
FastAPI、NextJS15、Dockerを利用して、このMVPは昔３〜４人月で対応する期間かかると思いますが、Cursor又はWindsurfで１〜２人週ができました。
このシリーズでは、現場で実際に試しているリアルな知見を共有していきます。
AI時代のプロジェクトマネジメントに興味のある方、ぜひ質問・リクエストもコメントでお気軽に！
今さら聞けない！JavaScriptのvar, let, const完全ガイド

JavaScriptで変数を宣言する方法には `var`, `let`, `const` の3種類があります。  
それぞれの違いを理解して使い分けることは、JavaScriptを扱う上でとても重要です。

この記事では、これら3つの違いを具体的なコードと一緒に、初心者にもわかりやすく解説します！

# ✅ 結論からざっくりまとめ！

| 宣言方法 | 再代入 | 再宣言 | スコープ         | 巻き上げ（Hoisting）         |
|----------|--------|--------|------------------|-------------------------------|
| `var`    | できる | できる | 関数スコープ      | される（初期値は`undefined`） |
| `let`    | できる | できない | ブロックスコープ | されるがTDZにより使えない    |
| `const`  | できない | できない | ブロックスコープ | されるがTDZにより使えない    |

> 💡 基本的には `const` を使い、必要に応じて `let`。`var` は避けましょう。

---

## 🔍 `var` の特徴

### 関数スコープ
`var`で宣言した変数は、**関数の中でしかスコープが制限されません**。

```js
function testVar() {
  if (true) {
    var message = 'hello';
  }
  console.log(message); // → 'hello'（if文の外でも使える）
}
```
### 再宣言できる
```js
var a = 1;
var a = 2;
console.log(a); // → 2（エラーにならない）
```
### 巻き上げ（Hoisting）される
```js
console.log(num); // → undefined（エラーではない）
var num = 10;
```
## 🔍 let の特徴
### ブロックスコープ
letはブロック（{}）ごとにスコープが分かれます。

```js
if (true) {
  let value = 'block scoped';
}
console.log(value); // → ReferenceError（外からは見えない）
```
### 再宣言はできない
```js
let x = 5;
let x = 10; // → エラー：Identifier 'x' has already been declared
```
### Hoistingされるが「使えない」＝TDZに注意
```js
console.log(foo); // → ReferenceError
let foo = 'bar';
```
⏰ TDZ（Temporal Dead Zone）とは、「宣言されるまで変数が“死んでいる”状態」です。

## 🔍 const の特徴
### 基本的には let と同じだが、再代入できない
```js
const PI = 3.14;
PI = 3.14159; // → TypeError
```
### オブジェクトや配列の中身は変更可能
```js
const arr = [1, 2, 3];
arr.push(4); // OK！
console.log(arr); // → [1, 2, 3, 4]

const obj = { name: 'Alice' };
obj.name = 'Bob'; // OK！
```
❗ constは「再代入できない」であって、「中身が不変」ではありません！

# ✅ どれを使うべき？
- const を基本に使う（変更しない変数）
- 変更が必要な場合は let を使う
- var は原則使わない（古いコードにはまだ残っている）

# 終わりに
ここまで読んでいただきありがとうございます。
javascriptは勉強を始めたばかりなので間違い等あればコメントで教えていただけますと幸いです。
新人君『.zshrcと.zprofileって何が違うんですか？』に即答できるようになる記事

# はじめに

みなさんは何のshellを使っていますか？
私はzshを使っているのですが、もし新人君の環境構築のお手伝いをするときに、

**櫻井さん、.zshrcと.zprofileの違いって何なんですか？？**

と質問されたら自信を持って答えることができそうになかったので備忘録として記載しておきます。

# 結論

主な違いは設定ファイルの読み込みタイミングです。

| ファイル名     | 読み込まれるタイミング                             | 書いたほうが良い設定|
|:--------------|:-------------------------------------------|:-------------------------------------------|
| .zprofile      | ログインシェルの起動時 (PC起動の際のログイン時)      | システム全体に影響がある設定（環境変数・PATHの追加など）|
| .zshrc         | インタラクティブシェルの起動時 (ターミナルを開いた時) | シェルのカスタマイズの設定（エイリアス、プロンプト、プラグイン）|


# 補足

.zshrcや.zprofileの設定ファイルのほかに以下のような設定ファイルもあるようです。

| ファイル名     | 読み込まれるタイミング                             |
|:--------------|:-------------------------------------------|
| .zshenv      | すべてのシェル起動時      |
| .zlogin      | ログインシェルが終了する直前 |
| .zlogout     | ログアウト時 |


# 最後に

もし、新人君にタイトルのように質問されたら、この記事のリンクをぶん投げようと思います:innocent: (嘘です。優しく教えます！)


モチベーションになりますので、いいね:thumbsup:や、ストックいただけると、とても嬉しいです
最後まで読んでいただきありがとうございました！！:bow:


# 参考文献

https://zsh.sourceforge.io/Doc/Release/Files.html
Naoco、TI電卓販売終了／カシオ決算発表

Qiitaにニュース記事解説を載せるのはご法度かもしれないが、関数電卓に関するニュースが2つ続いたため記事化する。

## NaocoがTI電卓の販売を終了、ケニスが引き継ぐ
ふと思い立ってNaocoのサイトを見に行ったところ、「2025.5.8 TI, Vernierの業務は終了致しました。」の文字が。衝撃。

https://www.naoco.com/index.htm

![naoco1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/29810913-8ad0-4eb1-8a16-2bc766a8032e.png)


誘導通りケニスのページに行ったところ、自社通販サイト「りかなび」でTI電卓の販売を行っていた。

https://www.rikanavi.com/S

![naoco2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/9921f939-d264-432a-a167-42dbff10b275.png)

販売機種は以下の通り。
- BAII Plus/Plus Professional
- TI-Nspire CXII/CXII CAS/教師ソフト
- TI-84 Plus/Plus CE Python

主だった現行機種は引き続き買えそうである。一安心。

## カシオ、関数電卓の販売台数が前年度比100万台減
カシオが5月13日に決算発表を行い、2024年度の関数電卓販売台数を公表した。
資料によると、2025年3月期（2024年度）の販売台数は2100万台。2024年3月期（2023年度）の2203万台と比較して103万台減（-4.7%）となった。
![casio202503-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/70cad6d4-c11d-4a6e-b45d-6b0c453c8533.png)

https://www.casio.co.jp/ir/library/results/

過去5年間の推移は以下の通り。
| 2020年度[^1] | 2021年度[^2] | 2022年度[^3] | 2023年度[^3] | 2024年度[^4] |
|:-:|:-:|:-:|:-:|:-:|
| 1340万台 | 1780万台 | 2220万台 | 2203万台 | 2100万台 |

2021年度から2022年度にかけての激増があり、横ばい後の100万台減なので評価が難しいが、旧ClassWiz(EX)販売打ち切りによるCWへの移行誘導はあまりうまくいっていないと考えられる。また、[フィリピンの公的試験で一部カシオ機の使用禁止が続いている](https://www.philstar.com/nation/2018/04/26/1809641/prc-bans-2-calculator-models-during-licensure-exams)（改造電卓を持ち込んだ受験者の問題でカシオに落ち度はないと考えられているが）ことがどの程度影響を与えているかも気になる。

なお資料には、関数電卓「欧州は堅調」「一部の新興国で通貨安の影響を受け、減収」、New ClassWiz「売上拡大」「使用エリアを拡大」の記載がある。

[で、初代ClassWiz(EX)のクローン機って正直どうなのよ？](https://qiita.com/harycurl/items/2eaad9f4d87b8315ada0)の記事で触れた通り、各国でEXクローンを製造するメーカーが立ち上がっている。また、[衝撃のClassWiz CWクローン、deli D992CN Pro関数電卓を買ってみた](https://qiita.com/harycurl/items/c3f7f6b759fbb1ebf191)のように、すでにClassWiz CWのクローン機が作られ、しかも機能が追加され比較的安価に販売されるようになっている。

低価格帯市場で大きなシェアを誇るカシオは、使いやすい過去モデル（EX等）のクローン機との戦い、低価格で機能追加もあるCWクローン機との戦いを強いられていくことになる。

模造品対策に固執して落日となっていくのか、利用者視点を取り戻して販売台数を回復することができるか。電子辞書事業縮小を発表したカシオにとって試練の年になりそうだ。

[^1]: [統合報告書 2021](https://www.casio.co.jp/content/dam/casio/global/corporate/ir/library/annual/2021/Integrated_2021_s.pdf)
[^2]: [2022年3月期 決算概要](https://www.casio.co.jp/content/dam/casio/global/corporate/ir/library/results/setumei22_all.pdf)
[^3]: [2024年3月期 決算説明会](https://www.casio.co.jp/content/dam/casio/global/corporate/ir/library/results/2024/setumei24_all.pdf)
[^4]: [2025年3月期 決算概要](https://www.casio.co.jp/content/dam/casio/global/corporate/ir/library/results/2025/setumei25_all.pdf)
UnityバージョンにおけるPhotonの同期処理の違いについて

## 背景
以前のUnity(具体的にこのバージョンまでというのはわかりません)では、Photon側の処理が遅く、`Start()` メソッド内で `PhotonNetwork.IsConnected` を確認してからプレイヤーのプレハブを生成していました。この順序により、プレイヤーが正しく同期されるようになっていました。しかし、最近のUnityでは、マルチスレッドや非同期処理の挙動が変更され、PhotonとUnityの処理順がより独立化されました。その結果、`Start()` メソッド内でプレイヤーのプレハブを早い段階で生成すると、同期ずれが発生し、クライアント側のプレイヤーが見えなくなる(ホストのみ姿がみえ)という問題が発生しました。


```csharp:(問題が発生したコード)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun; //Photonサーバーの情報を使用するため

public class GameManager : MonoBehaviourPunCallbacks //Photon viewやPunを使用するため
{
    public static GameManager Instance { get; private set; }
    [SerializeField] GameObject playerPrefab;

    // Start is called before the first frame update
    void Start()
    {
        if(PhotonNetwork.IsConnected && PhotonNetwork.IsMasterClient) //サーバーに接続していたら
        {
            if(playerPrefab!=null)
            {
                Vector3 spawnPosition = new Vector3(0f, 0f, 0f);
                PhotonNetwork.Instantiate(playerPrefab.name, spawnPosition, Quaternion.identity); //Photonを介した生成
            }
        }
    }
}
```

## 問題の詳細
最近のUnityでは、非同期処理がより厳密に管理されるようになり、`Start()` メソッド内でPhotonの同期処理を待たずにプレイヤーのプレハブが生成される場合があります。このタイミングの違いが原因で、プレイヤーオブジェクトの生成がPhotonのネットワーク同期処理よりも先行し、クライアント間で表示されるプレイヤーが異なったり、最終的にプレイヤーが見えなくなる現象が発生します。

## 影響
この問題は、プレイヤーが他のクライアントに表示されない、または同期が取れない状態を引き起こします。具体的には、プレイヤーの位置や動きが他のクライアントに反映されない、または一時的に見えなくなるという現象が発生します。特に、`Start()` メソッド内でプレイヤーオブジェクトの生成と同期処理を行う場合、この同期のタイミングが非常に重要です。

## 解決策
###### 各クライアントが自分のプレイヤを生成する
具体的には、OnJoinedRoom() メソッド内で PhotonNetwork.IsMasterClient が false の場合に、SpawnPlayer() を呼び出して、各クライアントが自分のプレイヤーを生成しています。このようにすることで、マスタークライアント以外のクライアントがプレイヤーの生成を行うことになります。さらに、プレイヤーの生成に PhotonNetwork.Instantiate を使っているので、他のクライアントにもそのプレイヤーオブジェクトが同期されます。

```csharp:(問題が発生したコードに付け足したコード)
    public override void OnJoinedRoom()
    {
        if (!PhotonNetwork.IsMasterClient)
        {
            // 各クライアントが自分のプレイヤを生成する
            SpawnPlayer();
        }
    }
    
    void SpawnPlayer()
        {
            if (playerPrefab != null && PhotonNetwork.IsConnected)
            {
                Vector3 spawnPosition = new Vector3(0f, 0f, 0f);
                PhotonNetwork.Instantiate(playerPrefab.name, spawnPosition, Quaternion.identity);
            }
        }
```

## 結論
UnityのバージョンにおけるPhotonとUnityの処理順の変更により、プレイヤーオブジェクトの生成タイミングが重要になりました。`Start()` メソッド内での処理順序に依存するのではなく、非同期処理を利用して適切な同期タイミングでプレイヤーオブジェクトを生成することが、同期ずれを防ぐために効果的な解決策となると思います。
【Copilot Studio】1000件のDataverse情報を読めるか検証【画像付き】

## 以前200件までは検索出来た
https://qiita.com/ChatSKY/items/5c40a4a61bde128af8d0

 ※言語は英語、オーケストレーション機能を有効

## 1000件を投入して検証してみる
予想としては、抽出できると思いますが、検証します！

## 結果
10件（12件中）しかしゅつりょくさなかｔｔ


↓ 1000件のサウナを投入
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/d04b7237-ddf1-49cf-a76e-7ef7e77c2d8e.png)

↓ そのうち「小田急線 下北沢駅」が最寄りのサウナは12件
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/d8ff9a07-ae3d-41a4-8dc8-3a639db86fa1.png)

↓ チャットボットとの会話結果
10件しか取得できなかった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/8d3ef996-6135-45f0-ae9b-e8fea74aea17.png)
pythonでやってしまってハマったこと②

# Threadの隠れメソッドの話
pythonでは、**Thread**クラスを継承して独自のスレッドを実装することができます。
そこで、汎用的に使用できるワーカースレッドのベースクラスを作成しました。

内容は大体、以下のような感じです。
```python:Worker.py
import time
from queue import Queue
from threading import Event, Thread
from abc import abstractmethod

class Worker(Thread):
    def __init__(self, pipe_name, exit_msg='exit'):
        super().__init__()
        self._stop = Event()
        self._queue = Queue()
        # ここに名前付きパイプの初期化処理
        self._pipe = PipeWatch(pipe_name, exit_msg=exit_msg, self._queue, self._stop)
        # PipeWatchは名前付きパイプを非同期に読みexit_msgが来たら_stop.set()します
        # それ以外は、_queueに追加して、本クラスのサブクラスで読み込ませる
    
    @abstractmethod
    def onStart(self):
        pass# サブクラスはオーバーライドしてFalseを返せばスレッドは終わる
    @abstractmethod
    def loop(self):
        pass# サブクラスはオーバーライドしてFalseを返せばスレッドは終わる
    @abstractmethod
    def onException(self, ex):
        pass# 例外はサブクラスのオーバーライドで処理させる
    @abstractmethod
    def onClosing(self):
        pass# 閉塞はサブクラスのオーバーライドで処理させる
    def dequeue(self):
        _data = None
        if not self._queue.empty():
            _data = self._queue()
        return _data
    def enqueue(self, data):
        if self._queue.put(data)
    def start(self):
        super().start()
        self._pipe.start() 
    def run(self):
        try:
            if self.onStart() != False:
                while not self._stop.is_set():
                    if self.loop() == False:
                        break
                    time.sleep(0.1)
        except BaseException as ex:
            self.onException(ex)
        finally:
            self.onClosing()
            self._pipe.stop()
            
```
このクラスの大体の仕様は、
* スレッドは、異なる.pyファイルに書かれていても、通信が行えるイメージ
* スレッド間の通信には、ソケットは使わず、名前付きパイプを使用する
* 両方が開かれてないとブロックされる名前付きパイプではなく、非ブロッキングモードでオープンし、必要なときに操作を取消できる
 

このクラスのサブクラスを実装して動かしたところ、期待した動作をするようになりましたが、スレッド終了時に、終了せずにいつまでも終わらないという問題が発生しました。
そして、よく見ると、以下のようなエラーメッセージが出ています。
```bash:Terminal
File "/usr/lib/python3.11/threading.py", line 1134, in _wait_for_tstate_lock
self._stop()
		TypeError: 'Event' object is not callable
```
最初は訳が分かりませんでした。
でも、``/usr/lib/python3.11/threading.py`` を開いてみて原因が分かりました。
pythonのスレッドモジュールには、ドキュメントには書かれていない、
```Thread._stop()``` というメソッドが存在していたのです。

私のコードには、以下のような記述があります。
```python:Worker.py 抜粋
class Worker(Thread):
    def __init__(self, pipe_name, exit_msg='exit'):
        super().__init__()
        self._stop = Event()    # <-これ！これが原因です。
        self._queue = Queue()
```
pythonのthreadingモジュールはスレッドを停止させるときに、
``Thread._stop()`` を呼んでいたのです。
でも、そこは、私がイベントとして``_stop`` を使ってしまっていたのです。
だから、
```bash:Terminal
		TypeError: 'Event' object is not callable
```
と怒られていたのです。
【見てほしいです！】13歳の中学1年生が「放課後AIプログラミング」でジブリ風画像サイト作りに挑戦しました！

はじめまして！今日、13歳になりました！中学1年生です。

学校の授業や、家での勉強の合間の放課後や週末に、プログラミングやAIの勉強をしています。これは、学校の先生が「これからの時代はAIが大事になるから、みんなも少しずつ触れてみよう！」と教えてくれたのがきっかけです。

先生が「何か面白いものを作ってみると、もっと勉強が楽しくなるよ」と言ってくれたので、僕も何か作ってみようと思いました。大好きなジブリの絵みたいなものをAIで作れたらすごいな、と思って、このサイト作りに挑戦することにしたんです。

AIプログラミングは、参考書を読んだり、オンラインの教材を見たりしながら進めました。分からないことだらけで大変だったけど、「よし、頑張ってAIを学んで、自分のアイデアを形にしよう！」と思いながら、毎日少しずつコードを書いていきました。

### 僕が初めて作ったサイトはこちらです！

[https://ghiblifu.com/](https://ghiblifu.com/)

このサイトの名前は「ghiblifu」です。テキストで「こんな絵が描きたい！」って入力すると、AIがそれを読んで、ジブリっぽい雰囲気の画像を生成してくれるように頑張って作りました。これは、AIが文章を理解して（自然言語処理）、そこから絵を描き出す（画像生成）という技術を使っているんだそうです。

まだ完璧じゃないし、プログラミングもAIも始めたばかりで、すごくシンプルだけど、僕が一生懸命勉強して、放課後の時間を使って初めてゼロから作ったサイトです。動いた時は本当に嬉しかったです！

### エンジニアの先輩方！ぜひ使ってみて、アドバイスください！

このサイトを公開したのは、もっと勉強を頑張るために、色々な人に使ってもらって、感想やアドバイスが欲しいからです！

特に、QiitaにはAIやプログラミングに詳しいすごいエンジニアの先輩方がたくさんいると聞きました。僕みたいな中学1年生が作ったサイトでも、もしエンジニアの先輩方が「ちょっと見てやるか」って使ってくれたら、本当に光栄です！

サイトには無料でお試しできる機能があります。ぜひ気軽にアクセスして、「こんな絵が作れるかな？」って試してみてください！

そして、もし可能であれば、

* 使ってみた感想（中学生が作ったにしては頑張ってるね、とかでも嬉しいです！）
* 「ここはもうちょっとこうした方がいいんじゃない？」っていう技術的なアドバイス
* 「このコード、もっと綺麗に書けるよ」とか「こんな考え方もあるよ」っていうプログラミングのヒント
* 見つけたバグの報告
* これからAIやプログラミングを勉強していく僕への**励ましのメッセージ

など、どんなことでも構いませんので、フィードバックをいただけると、これからの勉強のすごく大きな力になります！ この記事へのコメントや、サイトにあるフィードバック機能から、ぜひ声を届けてください。

今回のサイト作りを通して、AIプログラミングはすごく難しくて奥深いけど、自分の想像したものを形にできるのが本当に面白いと感じました。

先生も「これからもどんどん新しい技術が出てくるから、一緒に学んでいこうね」と言ってくれます。僕ももっともっとAIやプログラミングを勉強して、いつか人の役に立つすごいものを作れるようになりたいです。

ghiblifuも、みんなからのフィードバックを元に、少しずつ改善していけたらと思っています。


まだ中学1年生で、プログラミングもAIも初心者ですが、一生懸命作りました。温かい目で使ってみていただけると嬉しいです。

[https://ghiblifu.com/](https://ghiblifu.com/) にアクセスして、ぜひ遊んでみてください！

そして、もしよかったら、記事に「いいね」をくれたり、コメントで応援してくれると、すごく励みになります！

応援よろしくお願いします！
Kubebuilder/controller-runtimeなどでControllerReference(OwnerReference)をセットしたいときに便利なイディオム

この記事では、Kubebuilder/controller-runtimeなどでControllerReference(OwnerReference)をセットしたいときに便利なイディオムについて紹介します。

## 便利なヘルパー関数

次のようなヘルパー関数を定義しておくと、所有権関係の設定が簡単になります：

```go
import (
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

func setOwnerReference(parent *myprojv1.SomeResource, child metav1.Object) {
  child.SetOwnerReferences([]metav1.OwnerReference{
    *metav1.NewControllerRef(parent, parent.GroupVersionKind()),
  })
}
```

この関数は親リソースから子リソースへの所有権関係（ControllerReference）を設定します。親リソース削除時に小リソースを自動削除(いわゆるカスケード削除、GCなんて呼ばれたりするやつ)できたり、`Owns()`で子リソースを監視(watch)できたり便利になります。

## 重要な注意点

`parent.GroupVersionKind()`メソッドは、`client.Get()`などのKubernetesクライアント操作で取得したオブジェクトの場合のみ、正しいGroupVersionKindが設定されていることが保証されます。それ以外の方法（例：新規作成したオブジェクトや、自前でUnmarshalしたオブジェクト）の場合、GroupVersionKindがゼロ値になっている可能性があります。

そのため、より安全な実装としては、明示的にGroupVersionKindを指定する方法が推奨されます：

```go
func setOwnerReference(parent *myprojv1.SomeResource, child metav1.Object) {
  child.SetOwnerReferences([]metav1.OwnerReference{
    *metav1.NewControllerRef(parent, myprojv1.GroupVersion.WithKind("SomeResource")),
  })
}
```

この方法であれば、親オブジェクトの取得方法に関わらず、常に正しいGroupVersionKindが設定されることが保証されます。

ただ、書き方が冗長になるので、「クライアントから取得したオブジェクトしか使わない」というケースでは最初に紹介したイディオムでもいいと思っています。

## ちなみに、ControllerReferenceとOwnerReferenceの違いとは

OwnerReferenceは単にリソース間の所有権関係を示しますが、ControllerReferenceは「Controller」フィールドが`true`に設定された特殊なOwnerReferenceです。OwnerReferenceの一種ということですね。


一つのリソースは複数のOwnerReferenceを持つことができますが、ControllerReferenceは最大で1つしか持てません。

これは、リソースを実際に制御する権限を持つコントローラーは一つだけであるべきという原則に基づいています。この区別により、複数のコントローラーが同一リソースを管理しようとする際の競合を防げるわけです。
SalesforceフローAPI参照名の命名規則

# この記事は何
Salesforceのフローでは要素の一つ一つのAPI参照名を決める必要があります。
同じ組織でフローを作成する人が複数いる場合はルールを決めて、
それに沿った命名をすると保守性が高まります。
私は以下のページを参考に、命名規則を決めています。

https://shunkosa.github.io/lightning-flow-recipes-jp/design-guideline/

なんとなくこんな感じでいつもつけてた、というノリで思い出しつつAPI参照名を決めてしまうと、あとから綴り違うじゃん、とか、命名がぶれていてなんか気持ち悪い、、という気持ちになりそうです。
コピペできるように一覧化しておこうと思います。随時追記していきます。
また、私は転職したばかりで様子をうかがってるのですが、ゆくゆくはチーム内での命名規則統一ができるといいな、とも思っています。その下準備として役立つといいな。

# 命名規則
基本的には要素の種類の英語名から始める。要素名は小文字、「[要素の種類]_」のあとには項目名やアクションの内容を記載する。それは大文字で始める。
| 種別 | コンポーネント名 | 命名規則 |
|:-:|:-:|:-:|
| 要素 | レコードを取得 | 「get_」からはじまる | 
| 要素 | レコードを作成 | 「create_」からはじまる |
| 要素 | レコードを更新 | 「update_」からはじまる |
| 要素 | レコードを削除 | 「delete_」からはじまる |
| 要素 | 割り当て | 「assign_」からはじまる |
| 要素 | ループ | 「loop_」からはじまる |
| 要素 | 画面フロー | 「screen_」からはじまる |
| 要素 | 決定 | 「decision_」からはじまる |
| 要素内 | 決定要素内の結果 | 「outcome_」からはじまる |
| 要素 | コレクション検索条件 |「collection_filter_」からはじまる |
| 要素 | 変換 |「transform_」からはじまる |
| コンポーネント | ルックアップ  | 「lookup_」からはじまる |
| コンポーネント | テキスト | 「text_」からはじまる |
| コンポーネント | データテーブル | 「data_table_」からはじまる |
| コンポーネント | 表示テキスト | 「display_text_」からはじまる |
| コンポーネント | ラジオボタン | 「radio_button_」からはじまる |
| リソース | 定数 | 「constant_」からはじまる |
| リソース | 変数  | 「var_」からはじまる |
| リソース | 数式  | 「formula_」からはじまる |
| リソース | テキストテンプレート  | 「text_template_」からはじまる |
| リソース | 選択肢 | 「choice_」からはじまる |


## 要素の種類名以降の命名で気を付けていること
- 要素中で複数レコードを扱う場合はオブジェクト名＋複数形の「s」をつける
- 変数はデータ型に応じて命名（レコードだったらオブジェクト名+Recordとか）

## 参考


help: 標準フロー画面コンポーネント

https://help.salesforce.com/s/articleView?id=sf.flow_ref_elements_screencmp.htm&language=ja&type=5

help: フロー要素

https://help.salesforce.com/s/articleView?id=platform.flow_ref_elements.htm&type=5
Visual Studio 初心者向け デバッグや開発の効率の向上！ 備忘録

# 紹介
業務でVisual Studio2022を利用して、Webアプリ(VB.Net)を開発しています（歴3年）。あの時知っていれば、と思った知識の共有です。これを利用することで、格段に開発効率を上げることができました。

## 前提
 Visual Studio 2022を利用しています。2022でないと、一部有効でない機能があります（主にホットリロード）。
 VB.Netでの開発を例に取り上げます（C＃でも利用が可能です）。

## 環境
Windows 11 home
Visual Studio Community 2022 17.13.0
VB.NET Framework 4.7.2

## 内容
 [1.スニペット機能](#1スニペット機能)
 [2.デバッグ 一時ブレークポイント](#2デバッグ-一時ブレークポイント)
 [3.デバッグ（条件付きブレークポイント）](#3デバッグ-条件付きブレークポイント)
 [4.ホットリロード](#4ホットリロード)
 [まとめ](#5まとめ)

## 1.スニペット機能
例）LINQを使いたい、ラムダ式を使いたい等々といった場合に、
すぐにコードをかける人は、私の周りではあまりいません（悲しいことに、私自身もそうです）。
ですが、スニペット機能を利用すれば、LINQのひな型のコードをすぐに引っ張り出すことが可能です！


方法
Visual Studio プログラム上で、
Ctrl + K を入力後、Ctrl + xを入力。
そうすると、こんな表示がされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537494/c288a9d8-330f-46fe-ac62-7104008a5081.png)

今回は、LINQを利用したいので、
「データ - LINQ、XML、デザイナー、ADO.NET」
から、選択していくと、利用できるであろうサンプルプログラムが貼り付けられます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537494/4db31454-89ec-49d9-93ce-f7ddbfb899b6.png)

```
'サンプルプログラムの例
        Dim query = From fruit In New String() {"apple", "orange", "pear", "banana"}
                    Where fruit.Length >= 5
                    Select fruit.ToUpper(), fruit.ToLower()

```

※C#では、コードスニペットを利用できますが、
LINQは、含まれていないようですので、自身がスニペットファイルを作成して、登録する必要があるようです。

## 2.デバッグ 一時ブレークポイント
こちらは、C#も利用可能です。
Visual Studioを利用する際、コードの特定の場所で止めるブレークポイントを利用する方法は、知っていると思います。
ですが、私は駆け出しのころ、ブレークポイントをたくさん設定。
先輩にコードを見てもらう際に、すべてが止まってしまう為、
注意をされたことが数回あります。
泣く泣く、すべてのブレークポイントを解除しました。
（「すべてのブレークポイントの解除」は、プロジェクトファイルすべてについて適用されます。）

一時ブレークポイントでは、文字通り一回だけ止めることができます。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537494/21400553-f8cb-4b80-a1bb-298d10c9e45d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537494/d8b7b1a5-3c07-422a-9dcc-3bb86dfc8027.png)


操作方法は、ブレークポイントを設定する際と同様の、左端のバーを右クリック。
一時ブレークポイントの挿入をクリックします。
こうすることで、一度だけ止まるブレークポイントを仕込むことができます。
一度実行された後に、再度右クリックをして、有効にすることも可能です。
また、ブレークポイントに止まらず実行だけする場合は、
デバッグ→「デバッグなしで実行」とすることもできます！

## 3.デバッグ 条件付きブレークポイント

デバッグしていて、特定の条件の時だけブレークポイントを利用したいこともあります。そういった場合も、左端のバーを右クリック。
条件付きブレークポイントの挿入をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537494/72f375d6-d7ac-4eef-8ea9-2538a12a110d.png)

以下の表示がされて、どの条件の時にブレークするかを選べます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537494/49134469-32ea-4710-9001-6876b94f3499.png)


## 4.ホットリロード
Visual Studio 2022から、標準で利用できるようになった機能です。
デバッグをしつつ、コードを修正したい場合に重宝できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537494/8536849c-3637-4826-a15c-80a846c59ca3.png)

デバッグ実行中に、続行の隣にある火のマーク(ホットリロード)。これをクリックすると、
デバッグ中でもコードの修正が行えます。

以下は、デバッグ中にブレークポイントでコードを止めている状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537494/4971e80b-90ad-4ae5-bda1-166c0c45537f.png)
この状態で、pearをpearxに変更して、ホットリロードをクリック。
そうすることで、コードの変更を適用された処理が実行できます。

※もし、ホットリロードが表示されていない場合は、
デバッグ→コード変更を適用を選択してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537494/e08315c6-ccc5-4c20-8fd4-16a832fefdb5.png)

## 5.まとめ
どれも、すぐに利用ができる機能の数々です。
特にスニペットを利用すると、コーディング速度が爆速です！
上手く駆使して、開発をより効率的に進めてみてください！
AWS の icon を plantuml で使う

ふんわりわかったことを書く

https://github.com/awslabs/aws-icons-for-plantuml/tree/v14.0/dist

今だと，この辺りを見ると良さそう．
`!include <awslib/XXXX>` の `XXX` 部分が，`dist` 配下にあると考えるとシンプル．
`.puml` は書かなくていい．[^clang]

[^clang]: C言語っぽい

```plantuml
!include <awslib/AWSCommon>
!include <awslib/Storage/SimpleStorageService>

SimpleStorageService(aaa, bbb, ccc)
```

```
!include <awslib/AWSCommon>
!include <awslib/Storage/SimpleStorageService>

SimpleStorageService(aaa, bbb, ccc)
```

みたいに書ける．

https://github.com/awslabs/aws-icons-for-plantuml/blob/v14.0/dist/Storage/SimpleStorageService.puml [^v19]

[^v19]: まだ 19 はQiita だと使えなそう

を見ると

```puml:Storage/SimpleStorageService.puml

!define SimpleStorageService(e_alias, e_label, e_techn) AWSEntity(e_alias, e_label, e_techn, #7AA116, SimpleStorageService, SimpleStorageService)
```

`SimpleStorageService(e_alias, e_label, e_techn)` この辺が関数定義っぽいので，そんな感じで使えるイメージがある．

`!define` でデフォルト値が指定してあると，省略できそう．

## 細かいこと

大抵先頭が，`e_alias` になっていて，別名を付けられるようになってそう．
それを後で参照するのに使える雰囲気がある．

## Refs

- plantuml 

https://plantuml.com/ja/stdlib#a464d2f6236a5c23

- AWS v14

https://github.com/plantuml/plantuml-stdlib/tree/master/stdlib/awslib

- AWSアイコン一覧

https://github.com/awslabs/aws-icons-for-plantuml/blob/main/AWSSymbols.md

- plantuml 書き方

https://plantuml.com/ja/preprocessing

- gcp

https://github.com/plantuml/plantuml-stdlib/tree/master/stdlib/gcp

https://github.com/Crashedmind/PlantUML-icons-GCP

- tupadr3

https://github.com/tupadr3/plantuml-icon-font-sprites/tree/main
PAFファイルフォーマットについて

## PAFファイルフォーマットとは

Pafファイルフォーマットは、minimap2 が出力するファイル形式の一つである。
Sam形式に非常によく似ているが、Pafはシーケンスデータとクオリティスコアを含まないという特徴がある。

:::note info
このページは、各種AIツールの助けを借りながら人間が書いてます。
:::

## Pafの基本構造

PAFは、タブ区切りのテキストフォーマットで、各行が1つのアライメントを表す。
最低12個の必須フィールドがある。

1. クエリ配列名
1. クエリ配列長
1. クエリ開始座標（0ベース）
1. クエリ終了座標（0ベース）
1. ストランド（+または-）
1. ターゲット配列名
1. ターゲット配列長
1. ターゲット開始座標（0ベース）
1. ターゲット終了座標（0ベース）
1. マッチングした塩基数
1. アライメント長（ギャップを含む）
1. マッピング品質（0-255、255は欠損値） minimap2.1:751-769

## PafファイルとSamファイルの違い

Samと比較すると、次のような特徴がある。

- ヘッダーセクション（@で始まる行）がない
- シーケンスデータ自体を含まない（SEQフィールド）
- クオリティスコアを含まない（QUALフィールド）
- CIGARストリングは必須ではなく、入れたい場合はタグに入れる
- 座標系: PAFは0ベース、SAMは1ベースの座標系を使用

## Pafファイルの操作

Minimap2のリポジトリの中にある[Paftools](https://github.com/lh3/minimap2/tree/master/misc)を利用する。
このツールは、JavaScriptで書かれており、[k8](https://github.com/attractivechaos/k8)という高速軽量なインタープリター上で動作する。k8は、Googleの開発するJavaScriptエンジンのV8にいくつかの機能を追加したものである。

- Bytesオブジェクト：バイナリデータを効率的に扱うためのリサイズ可能なバッファ
- Fileオブジェクト：同期ファイルI/O操作のためのインターフェース
- グローバル関数：`print()`, `warn()`, `exit()`, `load()`などの基本的な関数
- 関数：`k8_read_file()`, `k8_encode()`, `k8_decode()`, `k8_revcomp()`

---

この記事は以上です
【Copilot Studio】Dataverseの件数による精度の違い

件数によって精度が下がるならDataverseの有用性は左右されるので、検証します！

30件、100件、200件と変化させていきます。

シナリオは、「駅名でサウナを検索する」とします！

## 結論
200件までは対応できそう！
以下、検証の結果です


## 30件の場合
問題なく抽出された

データ数：30件
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/ee743fba-1a32-4000-a13a-c8197564985a.png)

「小田急線 下北沢駅」が最寄りのサウナは2件
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/2e1a961e-1944-426b-b714-22293b9710e9.png)

エージェントでテストした結果、同じ2件が回答された
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/37c2e612-b77c-40b9-9130-3cbfd8dbf082.png)

## 100件の場合
問題なく抽出された

データ数：100件
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/90ce4909-2747-4909-8855-0df7d81d9af5.png)

「小田急線 下北沢駅」が最寄りのサウナは4件
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/4796ae92-38ca-4b71-85c8-4cbdba80d2f7.png)

エージェントでテストした結果、同じ4件が回答された
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/9f666de0-30a4-4192-9df9-72bf277bdfd6.png)

## 200件の場合


データ数：200件
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/6f169d37-1cbb-40e9-80bb-601f6c3c7393.png)

「小田急線 下北沢駅」が最寄りのサウナは6件
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/9a2afaa5-b4d7-4da0-a2c3-91133d29737b.png)

エージェントでテストした結果、同じ6件が回答された
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/edd4613f-93b2-4055-ae7f-664a88d25f59.png)


## まとめ
まずは、簡単な検索機能を実施してみました

次に検証してみたいこと
・1000件以上の負荷検証
・長文の中からの単語検索（社内の案件検索にかつｙ）
・長文の中からフリー検索（QA対応などに活用）
静的ページのデプロイやファイル共有に。「Pages Drop」という無料ツールを見つけました


普段、簡単なHTMLページ（例えばAIが生成したもの）をデプロイしたり、デザイン案をいくつかサッと共有したり、ZIPファイルで小さなウェブサイトを公開したりする必要がある時、皆さんはどんなツールを使っていますか？多くの場合、ホスティング費用が高いと感じたり、設定が面倒だと感じたりしますよね。

最近、**[Pages Drop](https://edgeone.ai/pages/drop)** というオンラインの便利ツールを見つけました。なかなか良い感じです。これはファイルをホスティングしたり共有したりするための場所で、何より**完全無料**なのがポイント。使い方もすごく簡単です。

**私が「これ、いいな！」と思ってシェアしたい理由は、主にこんな感じです：**

1.  **無料枠がかなり太っ腹：**
    *   **完全無料**：主要な機能は本当に無料で使えます。
    *   **ファイルアップロード数に制限なし**：HTMLファイル、画像コレクション、プロジェクトのZIPファイルなど、どれだけ多くても心配なくアップロードできます。数に上限はありません！
    *   **1ファイルあたり25MBまで対応**：個々のHTML、画像、ZIPファイルは最大25MBまで。日常的な共有や小規模プロジェクトのデプロイには十分なサイズです。

2.  **デプロイと共有がスピーディー：**
    *   **HTMLをワンクリックでデプロイ**：静的ウェブページやポートフォリオサイト、イベントのランディングページなどを簡単にアップロードするだけで、すぐにアクセス可能なリンクが生成され、あっという間に公開できます。
    *   **画像を即座に共有**：デザイナーのスケッチ、写真家の素晴らしい瞬間、UI/UXの高解像度スクリーンショットなどをアップロードすれば、すぐにプレビューリンクが手に入り、コミュニケーションやプレゼンテーションがより効率的になります。
    *   **ZIPファイルを賢くデプロイ**：HTML、CSS、JavaScript、画像などを含むZIPファイルをアップロードすると、**Pages Drop**が自動的に解凍してデプロイしてくれます。小規模なフロントエンドプロジェクトやパッケージ化されたドキュメント全体を素早く共有でき、相手はリンクを開くだけで完全なコンテンツを閲覧できます。
    *   **快適なアクセス速度**：グローバルアクセラレーション技術のおかげで、訪問者がどこにいても非常に速い読み込み速度を体験でき、コンテンツがすぐに届きます。

3.  **使い方がシンプル：**
    *   **複雑な設定は不要**：このプラットフォームは、面倒なサーバー設定やコマンドライン操作を排除し、直感的でわかりやすいインターフェースを提供しています。
    *   **共有リンクを直接生成**：アップロードが完了すると、すぐに共有可能な公開リンクが取得できます。メールやSNSに埋め込んだり、共同作業者に送信したりするのに非常に便利です。

**[Pages Drop](https://edgeone.ai/pages/drop)は、特にこんな方々におすすめだと感じました：**

*   **デザイナーの方**：ビジュアル案やインタラクティブなプロトタイプをクライアントやチームに素早く共有できます。
*   **フロントエンド開発者の方**：小規模プロジェクトのデモ、テストページ、またはシンプルな静的ブログを簡単にデプロイできます。
*   **学生や教育者の方**：ウェブ関連の課題提出、学習資料やコースプロジェクトの共有が楽になります。
*   **コンテンツクリエイターの方**：シンプルで無料の画像アップローダーやファイル共有ツールが必要な場合にぴったりです。
*   **要するに、静的ファイルを迅速かつ無料でホスティング・共有したいすべての方々です。**
FTPとFTPD

## VSFTP
順番に
```
apt install vsftpd
apt-get update
vim /etc/vsftpd.chroot_list
```
で「vsftpd1」のような接続先を作成する

verifyと修正
```
/var/sbin/vsftpd /etc/vsftpd.conf
```
で修正箇所があれば見つけることもあり
殆どが設定の変更間違いであったり`#`を消してしまったり、
はたまた、ipv4や6で細かな変更が必要であったり。
/etcへvsftpd.chroot_listを作成してもユーザーを追加せずに
adduserもいない状態であるので/home内とかを確認する。

移動後に vsftpd startよりも案外と直接起動
```
/etc/init.d/vsftpd start
```

稼働状況を確認するには systemctl -t service でもわかる他に
```
systemctl status vsftpd
```
もしくは
```
systemctl status vsftpd.service
```
で確認可能。


## LFTP
順番に
```
apt-get -y install lftp
apt-get update
vim /etc/lftp.confの最後の行に下の１行を付け足す
set ssl:verify-certificate no
```

接続設定
```
lftp -u ユーザー http: https: ftp: ~~~ のようなアドレス
```
接続解除
`exit`でlftp終了 `quit` か `close` で解除

よく使用するコマンド
- 接続先
ls, cd, pwd,rm, mrm, rmdir, mkdir, cat
- ローカル
!ls, lcd, !pwd

- ダウンロード
```
get -a lftp.txt
mget -a lftp.html lftp2.html lftp3.html
mirror
```

- アップロード
```
put -a local.txt
mput -a local.txt local2.txt local3.txt
mirror -R
```


## 参照・引用元
Server World 他検索
Viteについて

# 目的

https://ja.vite.dev/guide/

`Vite`（ヴィート）が`React`を使いたい時になぜ必要なのかわからなかったのでメモ。

# `Vite`の役割とは

> 現代の Web プロジェクトのために、より速く無駄のない開発体験を提供することを目的としたビルドツール

1. ローカル開発時のサーバーとなる
    * `Vite`によってファイルを保存すると自動的にブラウザが更新される（そして高速）
        * ない場合は手動でブラウザをリロードする必要あり
1. 本番用のビルドを行う
    * AWSなどのサーバーがある場合、`Vite`自身がサーバーになる必要はない
    * 本番用に最適化したビルド結果（静的ファイル）を生成する
1. モジュールのバンドルを行う
    * ページやコンポーネントを効率的にブラウザに届ける準備をする
        * 具体的には複数のjsファイルをなるべく1つにまとめてくれる
1. `CSS`や画像ファイルを直接インポートし、適切に処理する
    * `React`単体ではUIコンポーネントを構築するライブラリなので、`CSS`ファイルや画像を`JavaScript`にインポートする仕組みがない
1. 環境変数の管理
    * 開発環境と本番環境で異なる環境変数の設定・管理ができる
1. `TypeScript`のサポート
    * 追加の設定なしで`TypeScript`ファイルを使用できる
1. `Vite`経由で追加できるプラグインが豊富
1. JSX変換
    * `JavaScript XML`（`JavaScript`の構文拡張）を`JavaScript`に変換する
```jsx:変換前（JSX）
// React と ReactDOM をインポート
import React from 'react';
import ReactDOM from 'react-dom/client';

// 関数コンポーネント
function Welcome(props) {
  // JSXを使用してh1要素を返す
  return <h1>Hello, {props.name}</h1>;
}
// JSXを使用してWelcomeコンポーネントを呼び出し、nameプロパティを渡す
const element = <Welcome name="Sara" />;
```

```javascript:変換後（JavaScript）
// propsを引数として受け取り、createElementするときにnameプロパティのみ使っている
function Welcome(props) {
  return React.createElement("h1", null, "Hello, ", props.name);
}

// 一つ目のcreateElementとは別に、Reactコンポーネントをつくるため、Welcomeを呼び出して、{ name: "Sara" }をいれたものをelement化
const element = React.createElement(Welcome, { name: "Sara" });

// DOM に描画する部分（appにおける最上位で1回だけ行う）
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(element);
```

# Vite以外のビルドツール

* `Webpack`
* `Next.js`（フレームワークであり、ビルドシステムを内包しているのでNext.js使う時はVite不要）
ストレージのセキュリティについて【ユーザアクセス編】

今回の投稿は少し風味を変えて、セキュリティに着眼した記述にトライしてみる。
ストレージに対するセキュリティの脅威というのは決して小さくない。ネットワークに接続された時点でその脅威にさらされる。

そのようなストレージネットワークを保護するためには具体的な制御が必要となる。
制御を行なう箇所はアクセスパスだ。ストレージリソースにアクセスするためのアクセスパスというものが存在しており、そのアクセスパスを特定し、制御をした場合にはそれを破られないようにしなければならない。

## 主なアクセスパス

通常、ネットワーク環境に置かれたストレージリソースへのアクセスは下記3つに分類される。

・ユーザとしてのアクセス：アプリケーションが保存されているデータにユーザとしてアクセスする
・管理者としてのアクセス：ストレージだけでなく相互に接続された機器も含めた管理者としてデータにアクセスする
・バックアップ(レプリケーション/アーカイブ)へのアクセス：ネットワークだけでなくバックアップ用機器に対してのアクセス

それぞれのアクセスパスでは、どのような注意点や制御を行なえばいいのか、それぞれについて見ていきたい。

## ユーザとしてのアプリケーションへのアクセス

こちらに該当する具体例は、ファイルシステムやデータベースシステムが該当するだろう。
各システムにユーザごとにアクセスを制御する処理を行なう。例えばネットワーク内にホストAとホストBの2ユーザがいて、リソース①とリソース②の2つのアプリケーションがあると例えてみる。

ホストA：リソース①にはアクセスできないが、リソース②にはアクセスが認められている。
ホストB：リソース①にはアクセスが認められているが、リソース②にはアクセスできない。

まずリソースへのアクセスについてアクセスレベルというものがある。機密、制限、公開の3つだ。
機密はユーザからのアクセスはできないレベルのデータである。アクセスできるのは管理者としてのアクセスが必要になるのが一般的だ。次に制限はユーザの中でアクセスの許可・不許可を振り分けるレベルのデータである。ユーザを複数に分けてそれぞれに付与する権限を強弱で制御するやり方だ。上記のホストAとホストBに例えて件はこの制限にまつわるものだ。最後の公開はネットワーク内にいる全ユーザがアクセスできるレベルのデータである。

公開レベルのデータはアクセス許可の判定を行わないタイプのものなので、もし不審なホストがそのネットワーク内に侵入してしまった場合はそのデータにアクセスできてしまうリスクがある。

この制限レベルの例では、ホストAがリソース①にアクセスするためには正規にホストBと同じ権限を付与されるか、資格情報を詐称するか、である。
資格情報を詐称されて不正なデータへのアクセスを防ぐためにはその制御が必要になる。

## ユーザアクセスの制御

ユーザの資格情報の詐称を防ぐための方法としてはまずユーザとホストの認証と承認が挙げられる。
この認証と承認はネットワークの外側で実装されるものである。不審なホストがネットワーク内への侵入を制御するセキュリティとして活用されている側面もある。

このようにまずはホストレベルでのアクセスを制御する動きからスタートする。
ネットワークへの接続する前のホストレベルの認証と承認については、LDAP認証やRADIUS認証などが例に挙げられる。また接続前だけでなく接続している最中でも認証を継続的に行なってくれるものとしてCHAP認証なども存在する。

ホスト認証の制御が完了して正規なネットワーク接続が見られたら、次に行なうべきはデータへのアクセス制御である。
ここで代表的な機能として挙げられるのがアクセス制御リスト(Access Control List)である。ネットワーク内のリソースに対するアクセスの制御リストとして、特定のユーザやグループに対して、どのリソースにどのようなアクセス権を付与するかの定義が行なわれる。
このACLはファイルシステムやデータベースなど様々なリソースタイプで使用できるので、データへのアクセス制御にはまずACLの使用を最優先に考えてもいい。

データへのアクセス制御の他に、スイッチ機器によるゾーニングで特定のストレージ機器へのアクセスを制限させるものもあれば、LUNマスキングのようにストレージ機器へのアクセスがされた後に機器内データの特定の論理領域へのアクセスを制御させる機能もある。

あとはデータの暗号化もアクセス制御の一種として数えられるだろう。このようにネットワーク接続前のホストレベルからデータリソースの一歩手前までに至るいくつものアクセスパスへの制御を行なうことでユーザによるデータアクセスは正常に機能するのである。

少し長くなったので、管理者としてのアクセス、バックアップへのアクセスについては次回の投稿で記述したい。

そして次回のものがこちら。

https://qiita.com/cruel_summer/items/e7c128ab7619e55b1562


## ひとりごと

大型連休が終わり、平日5日間が続く日常が戻ってきた。

6月は祝日がないのはまぁ別に構わないのだが、外出時の服装に最も悩む月。折りたたみ傘も必要になるし、気温も湿気も高くなる日本の夏はやはりいくつになっても慣れない。

今年も冷房の効いた自宅でのんびり過ごす夏になりそう。
TCPとUDPの違いについて

### TCP (Transmission Control Protocol)について

TCP（Transmission Control Protocol）は、インターネット上でデータを**確実**かつ**順番通り**に送るためのルール（プロトコル）の一つです。

例えるなら、TCPは**宅配便**のサービスのようなものです。

* **接続してから送る:** 送る前に、相手に「これから送りますね」と声をかけ（コネクション確立）、準備ができてから荷物を送ります。
* **確実に届ける:** 送った荷物がちゃんと届いたかを確認し、もし届いていなければ再送します。
* **順番通りに届ける:** バラバラに送った荷物も、相手に届くときには元の順番通りに並べ替えてくれます。

このように、TCPは信頼性が高く、順番が重要なデータのやり取りに向いています。例えば、ウェブサイトの閲覧（HTTP/HTTPS）、メールの送受信（SMTP、POP3、IMAP）、ファイルのダウンロード（FTP）などで使われています。

**TCPの主な特徴**

* **コネクション型:** 通信を始める前に、送信側と受信側の間で仮想的な接続を確立します（3ウェイハンドシェイク）。
* **信頼性が高い:** データの到達確認や再送制御などにより、データが確実に相手に届くことを保証します。
* **順番保証:** 送信したデータは、受信側で送信された順序通りに再構成されます。
* **フロー制御:** 受信側の処理能力に合わせて、送信側の送信速度を調整します。
* **輻輳制御:** ネットワークの混雑状況に応じて、送信速度を調整します。




TCP（Transmission Control Protocol）は、その信頼性の高さから、様々なアプリケーションで幅広く利用されています。主な用途としては、以下のようなものがあります。

* **Webブラウジング (HTTP/HTTPS):** ウェブサイトのテキスト、画像、動画などのコンテンツを正確に取得するために使われます。HTTPSはHTTPに暗号化を加えたもので、より安全な通信を実現します。
* **電子メール (SMTP, POP3, IMAP):** メールサーバーとの間でメールを送信（SMTP）、受信（POP3, IMAP）する際に、メッセージが確実に届くようにTCPが利用されます。
* **ファイル転送 (FTP, SFTP):** ファイルをサーバーにアップロードしたり、ダウンロードしたりする際に、データが破損なく正確に転送されるようにTCPが使われます。SFTPはFTPに暗号化を加えたものです。
* **リモートログイン (SSH, Telnet):** 遠隔のコンピュータに安全にログインして操作したり（SSH）、古いシステムでテキストベースの接続を行ったり（Telnet）する際に、コマンドや応答が正確にやり取りされるようにTCPが用いられます。
* **データベース接続:** アプリケーションがデータベースサーバーと通信し、データの読み書きを行う際に、トランザクションの整合性などを保つためにTCPが利用されます。

### UDP (User Datagram Protocol)について

UDP（User Datagram Protocol）は、TCPと同じくインターネット上でデータを送るためのプロトコルですが、TCPとは対照的に、高速性を重視した、よりシンプルな仕組みを持っています。

TCPを宅配便に例えるなら、UDPは**手紙やメール便**のようなイメージです。

* **送るだけ:** 送る前に相手との準備（コネクション確立）をせず、荷物が届いたかの確認もしません。とにかくデータを送るだけです。
* **早く届くかも:** 確認や順番の管理などをしない分、TCPよりも早く相手に届く可能性があります。
* **届かないこともある:** 途中でデータが失われたり、順番が入れ替わったりする可能性がありますが、再送は行いません。

このように、UDPは信頼性よりも速度が重要なデータのやり取りに向いています。例えば、以下のような用途で使われています。

* 動画や音声のストリーミング
* オンラインゲーム
* DNS (Domain Name System)
* VoIP (Voice over IP)

**UDPの主な特徴**

* **コネクションレス型:** 通信を始める前に接続を確立する手続きがありません。
* **信頼性が低い:** データの到達保証や順番の保証、再送制御などがありません。
* **高速:** 事前準備や確認などの処理がないため、TCPよりも高速にデータを送信できます。
* **オーバーヘッドが小さい:** ヘッダ情報などがTCPに比べて小さいため、ネットワークの負荷が低くなります。

### TCPとUDPの比較

| 特徴           | TCP                                  | UDP                                    |
| :------------- | :----------------------------------- | :------------------------------------- |
| 接続           | コネクション型 (接続確立が必要)       | コネクションレス型 (接続不要)           |
| 信頼性         | 高い (到達保証、順番保証、再送制御あり) | 低い (到達保証、順番保証、再送制御なし) |
| 速度           | 比較的遅い                             | 速い                                   |
| オーバーヘッド | 大きい                                 | 小さい                                 |
| 主な用途       | Webブラウジング、メール、ファイル転送   | ストリーミング、オンラインゲーム、DNS     |

どちらのプロトコルを使うかは、アプリケーションの要件によって決まります。信頼性が重要な場合はTCP、速度やリアルタイム性が重要な場合はUDPが選択されることが多いです。