OmniAICreator/Qiita-1.07M huggingface dataset:
git merge v rebase という、、

YouTubeで素敵な動画を見つけたので、普段やっているGitの運用フローの整理してみました。

なお、素敵な動画はこちらです。

https://www.youtube.com/watch?v=txqtxlj4LtU

ちなみに、動画で紹介されていた方法については下記を使っています。

- main <-- featureの場合は、mergeします
- feature <-- mainの場合は、rebaseします

これに加えて、featureブランチ内の修正もrebaseで行うことがありますが、この辺りをフローで整理してみました。

## やっていること

### Step1. featureブランチを作成してPushまで

まず、mainブランチからfeatureブランチを作成して、その中で作業します。
作業が終わったら、featureブランチをリモート(GitHubなど)にpushします。
これは一般的なフローと変わらないと思います。

```shell: bash
# featureブランチ作成
$ git checkout -b featureA

# 作業を行う
$ vim somefile.txt

# 変更をステージングしてコミット
$ git add somefile.txt
$ git commit -m "feat: Add new feature"

# featureブランチをリモートにpush
$ git push origin featureA
```

:::note info
動画ではswitchコマンドを使っていましたが、checkoutを使っています。
gitのドキュメントには試験的なコマンドって書いてありますが、どちらでもいいのかと思います。
:::

### Step2. プルリクエストの発行＆レビュー

次に、pushしたブランチからプルリクエストを発行してレビューを依頼します。
ここも、一般的な方法と同じだと思います。

ただ、一度でOKになることは少なく、レビュー指摘がくるので、次のステップの内容を実施します。

### Step3. レビュー指摘の修正

レビューの指摘内容をローカルのfeatureブランチ内で修正して、コミット＆pushします。
再度レビューしてもらい、OKになるまでこのステップを繰り返します。

```shell: bash
# 変更をステージングして追加コミット
$ vim somefile.txt
$ git add somefile.txt
$ git commit -m "fix: Fix review comments"

# 修正をリモートにpush
$ git push origin featureA
```

### Step4. レビューがOKになったら（mergeはしません）

レビューがOKになったら、次はfeatureブランチをきれいにします。
mainブランチにマージするため、rebaseを使って、コミットの粒度やコミットメッセージなどをきれいにします。

```shell: bash
# リベースを開始
$ git rebase -i HEAD~5

# インタラクティブ リベース画面が表示される
# ここで、reword, squash, editなどを実施
```

具体的には、以下のようなことをやっています。

- **squash/fixup: 修正コミットの統合**
    - レビュー指摘で修正したコミットは、最初の機能追加のコミットの考慮漏れであったりするので、これらの関係するコミットを１つにします
    - レビュー指摘内容はPRに残るので、コミット履歴に残ってもあまり意味がないですからね
- **edit: コミットの分割**
    - XX機能の追加というコミットの中に、余分なスペースを削除した修正が入っていたりするとコミット内容と異なる修正を実施しているので、機能追加と軽微な修正という２つのコミットに分割します
    - こういう不要な修正の影響でコンフリクトが発生するので適切な範囲に分割します
- **reword: コミットメッセージの修正**
    - Issue番号などコミットメッセージに記載しなければならない内容が不足している場合はコミットメッセージを書き換えます

:::note info
- 修正量が少ないような場合は、Step3～4をまとめてやったりします
- この手順のrebaseは、動画内のrebaseとは異なっています
:::

リベースが終わったら、変更内容をリモートにpushします。
この時、注意が必要で、リベースによりローカルとリモートでcommit hashが変わるため、force optionが必要です

```shell: bash
# リベース後のコミットをリモートに強制push
$ git push origin featureA --force-with-lease
```

### Step5. 最終レビュー＆マージ

最終レビューでは、修正内容に加え、コミットの粒度、コミットメッセージが適切かを確認します。
問題があれば、再度4にもどってやり直しますが、問題がなければ、featureブランチからmainブランチにマージされます。

## rebaseはいつするか？

動画内でも紹介されていましたが、featureブランチ作成からmainブランチへのマージまでの期間が長くなる場合、mainブランチに他のコミットが入ることがあります。

このとき、pushやPR発行前にrebaseして同期をとっています。

具体的には、Step1や3、4のタイミングで、featureブランチをrebaseしています。
ここでのrebaseはcommit履歴をmainの最新にして、その後ろにfeature向けの修正が入るようにしています。

```shell: bash
# ローカルのmainブランチをremoteと同期
$ git checkout main
$ git pull origin main

# featureブランチをrebase
$ git checkout featureA
$ git rebase main
```

## 運用フローの考え方

mainブランチは、プルリクエスト以外で直接変更を加えることはなく、一度マージされたものも基本的には取り消しません。
もし取り消す場合は、専用のコミットを作成してPRでマージ（revert）する運用が一般的だと思います。

そのため、mainブランチを後から変更することは困難になりますが、不要なコミットなどはきれいにしたいので、マージ前のfeatureブランチで修正を実施するというフローになっています。

featureブランチは、一時的なものであり、マージ条件を満たすまではいくらでも改変(rebase)できるというルールにしているため、featureブランチのpushは、force optionが必要になり、ここは改善が必要な箇所で悩ましいところです。
sudo必要なコマンドをcronで実行

sudo が必要なコマンドは普通に記載しても実行出来ないらしい。

一度rootユーザになる
~~~
$ sudo su
~~~

それから処理を記載する

~~~
$ crontab -e
#処理
~~~

当然かも知れないがファイルなどを出力した場合は、rootユーザでしかいじれない状態になっているので他のユーザでいじりたいなら権限を与える必要がある。
MBR→GPT変換（Windowアップグレード）

# MBR→GPT変換した（Windowアップグレード）

__記事の内容__

ストレージの形式をMBRからGPTに変換し、Windows10をWindows11にアップグレードした

__前提__

Windows10からWindows11に更新する際にはいくつかの要件があり、それが満たせていないとPCがアップグレードできません（クリーンインストールなら回避する方法はありますが）特にストレージの形式がMBRのままだとその要件のうち「UEFI」「SecureBoot」「GPT」の３つの項目を満たすことが不可能となっているので、データを引き継ぎつつWin11にアップグレードするにはMBRからGPTに変換する必要があります。

__注意__
事前にデータのバックアップは取っておいてください。
あくまで私個人がアップグレードしたやり方です。何かあっても責任は取りません。

__やり方__

Windowsの回復オプションにあるコマンドプロンプトから行います。更新するSSD以外は外してしまった方が分かりやすいです。Windows内のコマンドプロンプトから実行してる人もいるようですが私は失敗しました。

「設定」→「更新とセキュリティ」→「回復」→「PCの起動をカスタマイズ」→「今すぐ再起動」→「トラブルシューティング」→「詳細」→「コマンドプロンプト」→管理者アカウントが出たらサインイン（私は失敗したので後述する別の方法でコマンドプロンプト起動しました。）

___コマンドプロンプトが起動できない場合___

私は面倒でしたが別の方法でコマンドプロンプトを起動しました。
Win公式からisoファイルをダウンロードし、起動ディスクを作成します。PCに差して起動ディスクを起動したのちインストールには進まず「修復」のほうに進み、そこでコマンドプロンプトを起動します。

___更新可能か確認___
~~~
mbr2gpt /validate
~~~

「MBR2GPT: Validation completed successfully」と出たら更新可能

__更新可能ならconvert___
~~~
mbr2gpt /convert
~~~

あとはBIOS(UEFI)の設定を変更するだけです。

恐らく「CSM」が有効になっているので無効にして設定を保存したら再起動します。その後、BIOSのモードを「UEFI」に変更し、「secure boot」を有効にしてください。

これでWindowsに入ると更新可能になっているはずです。
🐇【Playwright】セレクターってなに？

## 📌Playwrightで自動テストを作ろう！ 
「ボタンをクリックするコードを書こう！」…ん？ **セレクターってなに？** 🤯  

---

**セレクター（Selector）** とは、

**PlaywrightがWebページ上の特定の要素（ボタン・テキスト・入力欄など）を探すための指定方法！** 

例えば、動物園のチケット購入ページで「購入する」ボタンをクリックする場合：

```tsx
await page.click('button:has-text("購入する")');
```

この `"button:has-text("購入する")"` **がセレクター** で、

Playwrightは **「購入する」ボタンを探してクリックする** という動作をする。

---

## **✅ セレクターの種類（どれを使うべき？）**

セレクターにはいくつかの種類がある。 **状況によって適切なセレクターを選ぶのが重要！**

### **1️⃣ `getByRole()` → 一番推奨！**

👉 **ボタン・入力欄・リンクなどの「役割」で探す**

```tsx
await page.getByRole('button', { name: '購入する' }).click();
```

✅ **メリット:** ユーザーが認識する **ボタンの名前** で指定できるので、**UI変更に強い！**

---

### **2️⃣ `locator()` → 汎用的なセレクター**

👉 **特定のテキストを含む要素を探す**

```tsx
await page.locator('text=購入する').click();
```

✅ **メリット:** `text=◯◯` を使うと、表示されている **テキスト** を基準に選択できる。

❌ **デメリット:** **ページの構造が変わると影響を受けやすい。**

---

### **3️⃣ CSSセレクター → `querySelector()` と同じ書き方**

👉 **HTMLのクラス・ID を使って指定**

```tsx
await page.click('.ticket-button');  // クラスで指定
await page.click('#confirm-purchase'); // IDで指定
```

✅ **メリット:** **ボタンの名前が変わっても動く**

❌ **デメリット:** **HTML構造が変わると壊れる。**

---

### **4️⃣ XPath → できるだけ使わない！**

👉 **HTMLツリーの階層をたどる方法（複雑）**

```tsx
await page.click('//button[contains(text(), "購入する")]');
```

✅ **メリット:** **非常に細かく要素を特定できる。**

❌ **デメリット:** **可読性が低く、メンテしづらい。（使うのは最後の手段！）**

---

## **✅ どのセレクターを使うべき？**

| セレクター種類 | 例 | いつ使うべき？ | メリット | デメリット |
| --- | --- | --- | --- | --- |
| `getByRole()` | `getByRole('button', { name: '購入する' })` | **ボタン・入力欄・リンク** | UI変更に強い | たまに動かない |
| `locator()` | `locator('text=購入する')` | **特定のテキスト要素を探す** | 簡単に指定できる | UI変更に弱い |
| CSSセレクター | `.ticket-button` | **クラスやIDがあるとき** | 名前変更に強い | HTML構造が変わると壊れる |
| XPath | `//button[contains(text(), "購入する")]` | **最終手段（複雑な要素）** | どんな要素でも取れる | コードが読みにくい |

---

## **✅ Playwrightでセレクターを調べる方法**

👉 **`npx playwright codegen` を使うと、適切なセレクターを簡単に取得できる！**

### **📌 セレクターを調べる手順**

1️⃣ ターミナルで以下を実行（動物園のチケット購入ページを開く）

```bash
npx playwright codegen https://zoo-tickets.com/purchase
```

2️⃣ **ブラウザが開くので、ボタンをクリック**

3️⃣ **自動生成されたコードを確認！**

- `page.getByRole(...)`
- `page.locator(...)`
- `page.click(...)` などが出る！

4️⃣ **セレクターをコピーして、テストコードに使う！**

---

## **🎯 まとめ**

✅ **セレクターとは？** → **Playwrightが要素を探すための指定方法**

✅ **一番推奨 → `getByRole()`** （ボタンや入力欄を簡単に探せる）

✅ **`npx playwright codegen` を使うと、セレクターを自動取得できる！**
🌎 Amazon Route 53のホストゾーンのNSレコードをお名前.comに登録する方法

# 📌 概要

Amazon Route 53 のホストゾーンで発行された NSレコード を、お名前.com のドメインに登録する方法を解説します 💡

この設定を行うことで、AWS の Route 53 をドメインの DNS サーバー として利用できるようになります 🌍✨

# 📌 事前に準備するもの

##### Route 53 のホストゾーン

まだ Route 53 のホストゾーンを作成していない場合は、以下の手順で Terraform を使用して作成できます。

https://qiita.com/nobumory/items/3655a64763a67e642c6c

##### ドメイン

お名前どっとこむでドメインを取得していない場合は以下を参考に取得します。

https://qiita.com/nobumory/items/fc7396d629f99a054f60

# 📌 ドメイン一覧を確認

お名前.com にログインし 管理画面でドメイン一覧を確認 しましょう ✅

🔹 登録済みのドメインが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860455/88e9334b-8a21-1488-aed1-691cd2628f9d.png)


# 📌 ドメイン詳細を開く

設定したいドメインの 詳細ページ を開きます。
	1.	対象ドメイン を選択 🏷️
	2.	「ネームサーバーの変更」 をクリック 💻🔧

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860455/589ba9ab-0c38-222f-0e92-55b2b5c78abd.png)


# 📌 ネームサーバーを設定する

ネームサーバーの変更画面では、以下の手順で Route 53 の NS レコードを設定します 📝✨

「その他のサービス」 を選択し、手動でネームサーバーを入力できるようにします 🛠️

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860455/7fa9bc2a-9eb6-ee9b-b2fe-c5beb9e22bb2.png)

# 📌 Route 53 の NS レコードを入力

AWS Route 53 で発行された 4つの NS レコード を入力します 🔗
	•	ns-XXXX.awsdns-XX.org
	•	ns-XXXX.awsdns-XX.co.uk
	•	ns-XXXX.awsdns-XX.com
	•	ns-XXXX.awsdns-XX.net

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860455/ddda9278-8bd4-c2c1-845c-9245b62309d3.png)


✅ ポイント
	•	ネームサーバーの入力欄が足りない場合 は 「+」ボタン で追加できます ➕
	•	設定が完了したら「OK」を押しましょう 🆗✅

# 📌 確認モーダル

モーダルが表示されるので「OK」を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860455/199ac2d9-66df-66aa-24f3-7d588b31fcae.png)

# 📌 完了画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860455/9ca71666-cace-23f2-e07a-46f223bb7640.png)

# 📌 DNS 設定が正しく適用されたか確認

（登録反映には1〜72時間程度かかります）

設定が反映されたかを確認するために、以下のコマンドを実行します 🖥️👇

```sh
nslookup -type=NS ドメイン名
```

✅ 成功例

```sh
Server:		xxxxxxxxxxxxx
Address:	xxxxxxxxxxxxx

Non-authoritative answer:
example.com	nameserver = ns-nnnn.awsdns-nn.org.
example.com	nameserver = ns-nnnn.awsdns-nn.co.uk.
example.com	nameserver = ns-nnn.awsdns-nn.com.
example.com	nameserver = ns-nnn.awsdns-nn.net.

Authoritative answers can be found from:
```

1. Route53 のホストゾーンに登録されている4つのNSレコードが表示されていれば 設定成功 🎉
1. まだ古い設定が表示される場合 は、時間を置いて再度チェック 🕒
AWS Amplifyを使ってみる

AWS AmplifyからGitHub選択時にエラーでて困った時やったことのメモ。
AWSのQuickstartより、GitHubのサイトの認証で失敗したらしく。その後何度やってもGitHubの自分のリポジトリが表示されない状態だったので。GitHub側のApplicationsのAWS Amplify (us-west-2)を削除し、再度AWS Amplifyから再設定したら無事リポジトリがリストされた。
GitHub Setting->Applications選択。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/bd4b6430-aa1a-d02a-1bd6-6e26af414586.png" width="50%">
下記画面よりAWS Amplify (us-west-2)を確認。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/97ed3d5f-ae95-dc19-38f2-8689a1e19969.png" width="80%">

AWS Amplifyから下記リポジトリリスト表示。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/3b704788-78d1-8b9b-a0ea-f0e316db7a22.png" width="50%">
無事表示される。
基本情報技術者試験　DRAM、SRAMのまとめ

さて、本日も基本情報技術者試験の続きです。





表題のとおり記憶媒体のまとめをしていきます。





いやほんとね。記憶媒体のところ情報がありすぎてややこしい。




DRAMの特徴とかSRAMの特徴とかフラッシュメモリはどうとか、選択肢選ぶ問題でもどれが答えなんかよくわからん。。




ということで、記憶媒体のことをまとめてみます。




基本情報技術者試験　サンプル問題より




DRAMの特徴はどれか。

ア　書き込み及び消去を一括又はブロック単位でおこなう。

イ　データを保持するためのリフレッシュ操作又はアクセス操作が不要である。

ウ　電源が遮断された状態でも、記憶した情報を保持することができる。

エ　メモリセル構造が単純なので、高集積化することができ、ビット単価を安くできる。




ん～～～。答えどれや？？？




なんとなくDRAMといえば単価が安い、というイメージなのでエかな。




正解みたいですね。




ってか、DRAMってそもそもなんやねん。




ぐぐってみるとどうやら忘れっぽい揮発性メモリだそうです。




そもそも記憶媒体には２種類あるらしい。




ひとつは不揮発性メモリ。これは電気を通していなくても中身がなくならないメモリで、DVDやCDがこれにあたるそう。




もうひとつが今回の問題にあたる揮発性メモリ。これは電気を通していないと中身が消えてしまうメモリのこと。




揮発性メモリの仕組みはメモリ上にある小さい箱のようなところに電気をためておくことでonとoff、つまり1と0を表現するそう。




電気を通さなければ当然箱の中は空になってしまうので、すべて0になる（メモリ上のデータが消える）という仕組みらしい。




その揮発性メモリのなかでも２種類がある。




たまにリフレッシュしてやらないと記憶が消えてしまうDRAMとリフレッシュしなくても通電さえしていればおｋなSARM。




SRAMとDRAMの仕組みの違いを理解しようとすると、非常にややこしい話になりそうなので今回はやめておきます。




SARAMはフリップフロップ回路というものを使ってこれを実現しているのだそう、というところだけは覚えておこう。




とりあえずDRAMはリフレッシュが必要で、SRAMはリフレッシュ不要。SRAMのほうが高性能で読み書きがはやかったりするので、単価も高くなる。




これは覚えやすい。




ややこしいのはDRAMのほうが容量を大きくしやすいというところ。




ここはもう少し掘り下げてみるべ。




DRAMはシンプルなセル構造により高い集積度を実現し、大容量メモリを低コストで提供可能です。一方、SRAMは複雑なセル構造により集積度が低く、同じ面積あたりのメモリ容量が少ないため、コストが高くなります。そのため、SRAMは容量よりも速度が重要な用途に向いています。




引用元：トナリメディア

DRAMとSRAMの違いは？ それぞれの仕組み・特徴・用途を比較




なるほど。DRAMは記憶データをコンデンサの電荷として保持しているのに対して、フリップフロップ回路は電流の流れ方でデータを保持しているためリフレッシュが不要なのだそう。




フリップフロップ回路はどうやら複雑な構造らしく、単に電荷を扱うDRAMよりも大容量の記憶には向いていないと。




というよりたぶんできなくはないんだけど価格が高くなる的なニュアンスなのかな？




そうするとDRAMはSRAMよりも大容量向き、SRAMは小容量で高速な処理が必要な用途向き、ということになりそう。




ちなみにDRAMのDはDynamicのD、SRAMのSはStaticのS。リフレッシュが必要なのはなんとなく動的なほう、と覚えておくと試験にでたときも回答しやすいそうですね。




ここまでをまとめると




DRAM　電荷を蓄えることで記憶を保持しているので高集積化がしやすく、製造単価が安い。時間とともに電荷を保持できなくなるので定期的なリフレッシュが必要。




SRAM　フリップフロップ回路に電気を通し、その論理値を記憶することでデータを保持する。複雑な構造のため大容量化がしにくく、単価も高いが高速の読み書きが可能でリフレッシュも不要。




ということになりそうである。




ま～～～、ここまで覚えておけばさすがに試験で問題解くくらいはできそうじゃない？って思うけどどうなんだろう。




問題に戻ってみると、・・・・・







基本情報技術者試験　サンプル問題より




DRAMの特徴はどれか。

ア　書き込み及び消去を一括又はブロック単位でおこなう。

イ　データを保持するためのリフレッシュ操作又はアクセス操作が不要である。

ウ　電源が遮断された状態でも、記憶した情報を保持することができる。

エ　メモリセル構造が単純なので、高集積化することができ、ビット単価を安くできる。







ア　書き込み及び消去を一括又はブロック単位でおこなう

→これなんや？　




調べてみると、ブロック単位で書き込みや消去をするのはブロックストレージ方式というらしい。代表的なのがハードディスク、SSD、メモリカードなのだそう。

DRAMの特徴にはあてはまらないので答えがアではないことはわかった。




イ　データを保持するためのリフレッシュ操作又はアクセス操作が不要である。




はい、でました。リフレッシュが不要なのはフリップフロップ回路を使用することで電荷を蓄える必要がないSRAMの特徴です。




ウ　電源が遮断された状態でも、記憶した情報を保持することができる。




これも大丈夫ですね。DRAMは電荷を蓄えることで記憶を保持する媒体なので、電源が遮断された状態ではすべての値は０。完全リセットされます。




エ　メモリセル構造が単純なので、高集積化することができ、ビット単価を安くできる。




はい。きました。電荷を蓄えることでonとoffを識別し記憶するDRAMはメモリセル構造が単純です。また、高集積化もしやすい。なのでビット単価が安い。




正解はエです。




基本情報技術者試験ていちいち論理的でないと答えだしづらいわ。




IT業界もうちょいとっつきやすくせんとIT人材不足になるのもあたりまえやで。




愚痴言いだしたら止まらんからこの辺にしとこ。




ほな、今日の分終わりです～。
サーバーサイドなしのReactプロジェクトの作成方法

# はじめに
私はweb開発としてvueを利用していたが、グローバルではreactを利用していることが多々あり実際に業務でも利用する機会が来るのでまずはreactを勉強したいと思った。

# react.devではreact only非推奨
どうやら[react.dev](https://react.dev/)のチュートリアルではNext.jsやRemix等のサーバー機能(サーバーサイドレンダリング、APIなど)を利用することが推奨されていて、reactの静的サイトonlyのプロジェクトの新規作成方法の解説が記載されていない。

# でも、react onlyを触りたい
vueでは静的なプロジェクトは作成でき、開発していたのでreactもやりたい、なので自分なりに調べてみると。
どうやらreactやvue等の開発でも使われているviteを利用してプロジェクトを作成できるようだ。

# 新規プロジェクト作成手順
まず前提として、node.jsとnpm等のパッケージマネージャーが必要となるため今回は導入済みで進めていく。

新規プロジェクトの作成方法は至って簡単。
新しくプロジェクトを作成したいディレクトリに移動して、次のコマンドを実行するだけだ。
```
npm create vite
```
コマンドを実行すると、プロジェクト名を記入するしたり、どのフレームワークを使うかの選択ができる。
samba4.20 on FreeBSD

## 何かと遅れがちなFreeBSD/samba4
* 約一年遅れですが 4.20 出ました。 ports関連のやり取りをみていると 4.21の作業もやってます？的なところがありますが、KERBEROS/SASL-TLSなど新規のコードが増えていることもあるので LDBの修正など作業量から考えるとまだまだ先でしょう。　今年 4.21に追いつけるのかというところ。
 
>> https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=280533

* 正式名称：　Trivial database の TDB も 14.10 出てました。
 >> databases/tdb1410
* LDAPに似たDB ldb も 2.9.2 で　リリースです。 
 >>databases/ldb29

 ## 早速コンパイルー
    
    sudo portmaster -Gdty --no-confirm net/samba420 

 ```
 Installing ldb29-2.9.2...
pkg-static: ldb29-2.9.2 conflicts with ldb28-2.8.2 (installs files into the same place).  Problematic file: /usr/local/bin/ldbedit
*** Error code 1
```
* ports のコンフリクトはまだ荒削りというところで、そのうち治ると思います。ともあれ  pkg remove ldb28 でさくっと外して続行します。
* samba4.x になってから バイナリだけでは何ともならない状況らしく、python環境が必須で、FreeBSDでは、pkg でも普通に 3.9/3.11が混在しますが、portsだったら 3.11に寄せといたほうが面倒がないかと思います。 最新のubuntuで標準になりつつある 3.12はまだ portsに入っていません。こういうところの温度差はまあ仕方ないです。
* 去年も何度か FreeBSDでは、python 系のpkg/portsがいきなり名前替わってしまって、アップグレード時にしばしば自動で進む作業を邪魔します。ﾅﾆｶﾝｶﾞｴﾃﾙﾝﾀﾞと怒鳴りたくなる気持ちを抑えつつ、何とかならんかというところでしたが、よーやくこんなのが出て解決？になったんですかね。
```
        ===>>> No /usr/ports/devel/py-pyproject-hooks exists, and no information
        ===>>> about devel/py-pyproject-hooks can be found in /usr/ports/MOVED

```

* コンパイルは順調に終わってしまいました。

## 4.19 からの更新運用
* workgroup の運用の場合：　あんまり代わり映えしないと思います。というか、そもそも samba4.2? が目指すのは Windows Server 2019  以後のSAMBA3.xプロトコル /ActiveDirectory 環境互換性に重点を置いています。 SAMBA-AD環境が動いているところでのテストが必要ですが、今日のところはトラブルなく移行した機材があることを報告しておきます。

## 2025/04/12 追記:
 現時点での最新版、4.20.7 に更新した結果ですが、ファイルの書き込みができない状態になっています。　pkg　install で一般的なインストール状態でダメになってしまい、4.19に戻せば回復します。　また　4.20環境で新しく AD環境を組むにしても Provisionプロセスが失敗するので、何か必要なオプションが掛けている可能性があります。
 なお、これらは FreeBSD/VNET-jail で行っているものですので、コンテナ制限下でなければ動く可能性はありますが、samba4 のような pythonや、その他のライブラリ依存が多岐に渡るものはコンテナに頼る傾向にあります。
【Rails】データベースから取り出したレコードを特定の順序で並べ替える方法

## orderメソッドを使用する
orderメソッドを使用するとデータベースから取得してきた値を並び替えることができます。
orderメソッドは以下のように使用します。

```ruby
# モデル名.order("並び替えたいカラム名")
User.order("name")

# モデル名.order(:並び替えたいカラム名)
User.order(:name)
```

## 並び替えの順序を指定する

以下のように並び替えの順序を指定できます。

```ruby
モデル名.order("カラム名 DESC")
モデル名.order(カラム名: "DESC")
モデル名.order(カラム名: :desc)
```

`DESC` は降順、 `ASC` は昇順です。 

## 複数のフィールドを指定する

以下のように複数のフィールドを指定することもできます。

```ruby

Book.order(:title, created_at: :desc)
```

## 参考

https://railsguides.jp/v8.0/active_record_querying.html#%E4%B8%A6%E3%81%B3%E9%A0%86
ReactNative/Expo/bunの最新版でアプリ作ってみた

# やったこと

0.76のリアーキテクチャで話題のReactNativeを、Expo / Bun / VS Codeの最速ビルド構成で作ってみた！🚀

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1841759/30c73fe2-a2c7-4f5a-5cca-0fcc107df397.png)

# 前提

以下の環境があること

1. MacOS
2. VS Code
3. Homebrew

# 手順

## 1. Xcodeのインストール

今回はiPhoneのエミュレーター上で開発したアプリの動作を確認したいので、[Xcode](https://apps.apple.com/jp/app/xcode/id497799835?mt=12)をインストールしてください。

インストールが完了したら、iOSのコンポーネントもインストールしておきましょう！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1841759/eb45c086-12e3-96b8-e4a2-7059f6ff5ea6.png" alt="image" width="400">


（すでにXcodeをインストール済みの方は[こちらの記事](https://qiita.com/kawabata324/items/b5f060503c82b8cab825)の方法でiOSが追加されているかを確認・必要に応じてアップデートしてください）

合計10GB以上あるので、ダウンロードを進めながら、次以降の作業を進めましょう！

## 2. Watchmanのインストール

Facebookが開発したファイル監視ツール[Watchman](https://github.com/facebook/watchman)。

React NativeやExpoでの開発時にファイルの変更を素早く検出し、適切な処理（ホットリロードやバンドルの再生成）を行うために使われるものなので、必須！

```bash
brew install watchman
```

## 3. Bunのインストール（任意）

ご存知、爆速パッケージ管理・ランタイムの[Bun](https://bun.sh/)にReactNative/Expoも対応しているので、今回はBunを使ったプロジェクトを作成します。（npm/pnpm/yarnが良い人はスキップ）

以降のコマンドは`bun ~~`で記述するので、適宜 `npm/pnpm/yarn ~~`に読み替えてください。

```bash
$ brew install oven-sh/bun/bun
```

## 4. プロジェクトの作成

いよいよReactNative/Expoアプリを作成していく

```bash
$ bun create expo {プロジェクト名}
```

`✅ Your project is ready!`となったら、以下を実行して…

```bash
# プロジェクトファイルに移動
$ cd {プロジェクト名}
# CLIからiOSエミュレータを起動するために必要な設定（パスワード聞かれる）
$ sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
# iOSでアプリを実行
$ bun run ios
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1841759/3cd1bbca-639b-6b2b-462e-e20d5faa4959.png)
### 🎉 おめでとうございます！🎊

# 今回の学び

Expoを利用した、ReactNativeのデファクトスタンダードを試してみました！

ビルドツールをbunにしたからなのか、Watchmanが優秀だからなのか、ホットリロードも爆速で、めちゃめちゃ開発体験が良かったです！

CreateExpoStackや[database.build](https://database.build/)など、使ってみたい技術がまだたくさんあるので、ワクワクが止まらない！🎶

# studio CLOTOについて

私たち **studio CLOTO** は、【21世紀を「学び」で創る】ために[GROWTHEUM](https://growtheum.studio-cloto.jp/)などのサービス開発を進める駆け出しスタートアップです！

WebXR・ReactNativeなどの開発情報を今後も公開していく予定なので、ぜひフォローしてください！

https://x.com/studio_CLOTO

https://note.com/studio_cloto/n/n22575ed8f1c5

https://growtheum.studio-cloto.jp/
razer blade stealth に Ubuntu をインストール

# 主要ポイント
　（略）


## 前提
　iso
　　https://ubuntu.com/download/desktop 
　　　Image名:ubuntu-20.04.3-desktop-amd64.iso
　PC
　　RZ09-03102 (razer blade stealth 13inch 2020)
　参考
　　https://ubuntu.com/tutorials/install-ubuntu-desktop#1-overview
　　　↑関連ページの内容を確認する


## .isoファイルをダウンロード＆checksumを確認
```
$ openssl [kind of checksum] [.iso filename] | grep [checksum]
```
↑出力の情報がWebサイト記載のチェックサム情報と一致することを確認する


## インストール用USBを作成
```
例
　$ dd if=ubuntu-20.04.3-desktop-amd64.iso of=/dev/sdX conv=fsync bs=[size]
```

## 必要に応じて、インストール先のBIOSをアップデート
参考
　Razer Blade Stealth 13 (2020) BIOS Updater Guide BIOSv0104.pdf
```
Win> RazerUpdater_v1.1.1.2_LY325-BIOSv0104v2.exe
```


## USBから起動してインストール
　（略）


## ディスク関連を確認
```
$ sudo gdisk -l /dev/nvme0n1
```
　※参考情報を一部抜粋
　　976.0 MiB   EF00
　　190.7 GiB   8300
　　15.3 GiB    8200
　　190.7 GiB   8300
　　15.3 GiB    8200
```
$ sudo fdisk -l
```
　※参考情報を一部抜粋
　　/dev/nvme0n1p1 976M EFI System
　　/dev/nvme0n1p2 190.7G Linux filesystem
　　/dev/nvme0n1p3 15.3G Linux swap
　　/dev/nvme0n1p4 190.7G Linux filesystem
　　/dev/nvme0n1p5 15.3G Linux swap


## 必要に応じて、キーボード周りを確認＆トライ＆エラー
```
$ uname -v
```
```
例
　#140~20.04.1-Ubuntu SMP Wed Dec 18 21:35:34 UTC 2024
```
下記の必要なものがあれば、取捨選択のうえ実施
```
sudo add-apt-repository ppa:openrazer/stable
sudo apt update
sudo apt install openrazer-meta
sudo add-apt-repository ppa:polychromatic/stable
sudo apt update
sudo apt install polychromatic
```

## タイムゾーンを設定
　（略）


## 必要に応じて、日本語入力に対応
```
$ apt install ibus-mozc
```

## 必要に応じて、ブラウザ設定
　（略）


## その他、必要に応じて、取捨選択のうえ実施
```
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install -y vim
sudo apt-get install -y git
sudo apt-get install -y jenkins
sudo apt-get install -y net-tools
sudo apt-get install -y python-pip
sudo apt-get install -y jq
sudo apt-get install -y hexchat
sudo apt-get install -y irssi
sudo apt-get install -y rtl-sdr
sudo apt-get install -y lynx
sudo apt-get install -y venv
sudo apt-get install -y virtualenv
sudo apt-get install -y python-openpyxl
sudo apt-get install -y virtualbox
```


# サイトポリシー
当ページをご利用いただくにあたっては、以下の事項に全て同意いただけた場合に限り、ご利用いただけます。
なお、当ページの利用規定を予告なしに変更する場合がありますので、ご了承ください。

### 本ページの目的と利用者責任について
当ページは関連情報の整理を主目的としています。
当ページに掲載された内容のご活用は、ご活用者の責任において行われるものとします。
当ページで提供する情報の内容について、掲載した情報の内容が正確であるか？有用であるか？更新時期が適切かどうか？などを一切保証をするものではありません。
また、掲載された情報をご利用いただいた結果、万一、ご利用者が何らかのトラブル、被害、損失、損害等が発生したとしても、一切責任を負うものではありません。
なお、当ページに掲載されている情報等につきましては、予告なく変更、又は削除されることがありますので、あらかじめご了承ください。
Canvaがなかなか味のあることをしていた

# はじめに
こんばんは。

**Canva**というサイトをご存知でしょうか？

文書その他の作成がテンプレートベースで出来る（たりする）サイトです。
**↑非常に適当な解説です:P**

私は、愛用させていただいております。

Canvaでプレゼン資料を作ると**気持ちイイ**んですよね。

**褒められる**ますから。

# 本文

エンジニア（らしからぬ人間だとしても）であれば、普段ドーパミンを分泌させるために使っているサイトの中身を覗いてみたくなるものです。

[Ctrl] + [Shift] + [I]

を気づいたら押してるんですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674822/1fd741fd-2002-f7c5-dee9-64a767f090a8.png)

感じますか？

:::note info
<details><summary>補足</summary>
「わかりますか？」より「感じますか？」のほうがかっこいいので、採用させていただきました。
</details>
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674822/07267de1-d4be-ff96-1d75-eef7944114db.png)

**感じますね？**

なんと、Canvaサイトのコンソールには求人広告（？）が掲載されていました！


# 最後に

**ってだけですね。**

でも、私はこれを見つけた時、**とても興奮したので**今回、記事の作成に至りました。

こういうのがあるだけで、その企業に対しての好感度がバク上がりしますよね:-)

以上です。

最後まで読んでくださり、ありがとうございました！

:::note info
他にも同じように、面白いことしてるサイトなどご存知でしたら、コメント欄にて共有してくださると。嬉しいです（私が @_@∮）
:::
#0031（2024/02/01）`id_ed25519` の `25519` の意味とは？

# `id_ed25519` の `25519` の意味とは？

## `Ed25519` とは？
`Ed25519` は、**EdDSA（Edwards-curve Digital Signature Algorithm）** の一種であり、  
**Curve25519** という楕円曲線を基盤とした公開鍵暗号方式。

## `25519` の意味
`25519` は、Ed25519 の基盤となる **楕円曲線 Curve25519 の名前** に由来する。  
この数字は、Curve25519 の数論的性質に関係しており、特に以下の要素を示す：

- **素数 2²⁵⁵ - 19 を基にした曲線**
  - `p = 2²⁵⁵ - 19`（約 `1.1579 × 10⁷⁷` という非常に大きな素数）
  - 255 ビットの長さを持つ（安全性を高める）
  - 高速な演算と高いセキュリティを両立

## `Ed25519` の特徴
- **安全性が高い**（従来の DSA, ECDSA よりも耐量子性が向上）
- **高速な署名・検証処理**
- **鍵長が短い（256ビット）**
- **固定長の署名（64バイト）**
- **バッファオーバーフロー耐性がある**

## GitHub での `id_ed25519`
- `id_ed25519` は、GitHub で SSH 認証を行うための秘密鍵の標準的なファイル名
- `id_rsa`（RSA 方式）よりも **Ed25519 の方が推奨** される（より高速・安全）

## まとめ
- `25519` は、**Ed25519 の基盤となる Curve25519 の素数 2²⁵⁵ - 19 に由来**
- 高速かつ高セキュリティな暗号方式であり、GitHub などで推奨される SSH 鍵形式
Webサイトのボタンの色を変えるABテストの設計と分析方法

今日は、技術質問の対策にもなるように、「Webサイトのボタンの色を変更するABテストを設計してください。どの指標を観察しますか？」という質問が来たという想定で、考えていきます。
※この記事は、ChatGPTの出力を基に作成しています。

## 1. 最終ゴールの設定
最初のステップは、テストを実施する理由を明確にすることです。  
ゴールが明確でなければ、どの指標を追いかけるべきかも見失います。

**今回の例：ECサイトで購入率を改善する**  
最終的なゴールは、ユーザーが「購入する」「問い合わせる」などの具体的なアクションを増やすことです。

---

## **2. 観察するべき指標の設定**
ゴールにたどり着くために、直接的な指標と間接的な指標を設けます。

### **主要な指標（KPI）**
- **一次指標（直接的なゴールを測る）**  
  - 購入率やコンバージョン率（例: 購入数 ÷ 訪問者数）

### **補助的な指標（間接的に影響を与える）**
- ボタンのクリック率
- ページの滞在時間
- 離脱率
- セッション継続率

これらの指標を観察することで、テスト結果の多面的な分析が可能になります。

---

## **3. 仮説の設定：なぜ色を変えるのか？**
次に、**なぜボタンの色を変えると成果が出るのか？** を具体的に仮説として立てます。

**仮説の例：**
1. ボタンの色が目立つことで、ユーザーの認識率が向上する。
2. 認識率が高まれば、ボタンのクリック率が増える。
3. クリック率が増加すれば、最終的な購入率や問い合わせ率も向上する。

このように仮説をMECE（漏れなく重複なく）に整理し、どのプロセスで効果が出るかを予測します。

---

## **4. 実験の設計方法**
### **A/Bグループの設定**
- **Aグループ（現状のボタン色）:** 変更前の通常の色  
- **Bグループ（新しいボタン色）:** 仮説に基づいた色（例えば、赤や緑など）

### **ランダムに分割する**
訪問者をランダムにA/Bの各グループへ振り分けることで、バイアスを排除します。

### **サンプルサイズの計算**
サンプルサイズが小さいと偶然による偏りが出やすくなるため、事前に統計的な有意性を確保できる人数を算出しましょう。通常、パワーアナリシスを使用して必要なサンプル数を計算します。

---

## **5. データ収集とモニタリング**
ABテスト実施中は、以下のデータを収集しながらモニタリングを行います：

- **一次指標:** コンバージョン率（例：購入率や問い合わせ率）
- **二次指標:** ボタンのクリック率、離脱率、平均購入単価など

これにより、色の変更が最終的な行動だけでなく、途中のユーザー行動にもどのように影響を与えたかが分かります。

---

## **6. 結果の分析**
テスト終了後に得られたデータを分析し、統計的な有意差を判断します。

- **有意差の確認:** カイ二乗検定やt検定を使って、A/Bグループ間のコンバージョン率の差が偶然のものかどうかを調べます。
- **p値:** 一般的には、p値が0.05未満であれば有意差があると判断します。

---

## **7. 結果の解釈とアクション**
- **ケース1:** 新しいボタン色でコンバージョン率が有意に上昇 → 新しいボタン色を正式に採用する。
- **ケース2:** 有意差がない → 他の要因（ボタンの文言、位置、形状など）を変えて次のABテストを実施する。

---

## **8. 改善の継続：次のテストに進む**
今回のテスト結果を踏まえ、さらなる改善ポイントを探ります。たとえば、次回はボタンのテキスト、サイズ、配置、アニメーション効果などもテストの対象にできます。

---

## **まとめ**
ABテストを設計するときは、次のステップで進めることで、論理的かつ効率的な改善が可能です：

1. KPIと補助指標の設定
2. 仮説の構築（MECEに考える）
3. 実験の設計（ランダム分割とサンプルサイズの考慮）
4. データ収集と分析
5. 結果の解釈と次のアクション

このように、テスト→改善→次のテストというサイクルを繰り返すことで、データに基づいたWebサイトの最適化が実現できます。
🌎お名前.comのドメイン登録

# 📌 IDとパスワードを入力してログイン 

お名前.comのログインページで ID（会員ID or メールアドレス） と パスワード を入力してログインしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860455/ecab5f9e-23a6-6a7c-558d-533df5a83051.png)

# 📌 サイドバーから「ドメイン登録」へ進む

左側の サイドバー から 「ドメイン」 をクリックすると、吹き出しメニューが表示されるので 「ドメイン登録」 をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860455/07c464c6-c924-1047-3216-53b84b809425.png)

# 📌 希望するドメイン名を入力する

検索バーに、取得したいドメイン名を入力します。
例：my-awesome-site など

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860455/18c74866-52ca-47a9-90c0-76c66fed6bd2.png)

# 📌 トップレベルドメインを選択する

「.com」「.net」「.jp」などのトップレベルドメインを選択しましょう。
お好みのドメインを選んだら、次へ進みます。

![mosaic_20250201210932.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860455/cdb5ee38-c33f-6749-1354-440abf470b34.png)

# ⚙️ サーバー利用設定を選択する 

利用方法を選択します。

Amazon Route 53 などを利用する場合「すでにサーバーをお持ちの方はこちら」を選択しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860455/d22cf0b6-1646-8105-5d32-4e941d99f8a7.png)

# 📌 確認画面

内容を確認して問題なければ、「次へ」をクリックして進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860455/6d6181aa-067b-5a7d-1706-a8bb40919a74.png)

# 📌 申し込み確認画面

申し込み内容を確認し、間違いがなければ 「申し込む」 をクリック！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860455/8702ab30-3de2-2a16-96ea-d5e4369381ea.png)

# 📌 完了画面

お疲れさまでした、これでドメイン登録が完了です💪

新しいドメインを活用して、素敵なウェブサイトを作りましょう🚀✨

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860455/6d9d4dc6-5e63-cff3-d1b4-92ed4db2b7b9.png)
#0030（2024/02/01）ソケット通信とはなにか

# ソケット通信とは

## 概要
ソケット通信（Socket Communication）とは、ネットワークを介してプロセス間通信（IPC: Inter-Process Communication）を行うための技術の一つ。  
特に、TCP/IP や UDP/IP を利用してデータの送受信を行う際に用いられる。

## ソケットの基本概念
ソケット（Socket）は、ネットワーク通信を行う際の **エンドポイント（端点）** を指す。  
通信を行うには、**ソケットを作成し、適切なプロトコル（TCP/UDP）を用いて接続・データ送受信を行う** 必要がある。

### ソケットの主要な役割
1. **通信の確立:** クライアントとサーバー間での接続確立  
2. **データ送受信:** バイトストリームやパケットのやり取り  
3. **通信の終了:** ソケットを閉じてリソースを解放  

## TCP ソケットと UDP ソケットの違い
| 項目 | TCP ソケット | UDP ソケット |
|------|------------|------------|
| **プロトコル** | TCP（Transmission Control Protocol） | UDP（User Datagram Protocol） |
| **接続の確立** | 必要（3-way handshake） | 不要 |
| **データ転送方式** | ストリーム指向（順序保証あり） | データグラム指向（順序保証なし） |
| **信頼性** | 高い（パケットの確認応答、再送制御あり） | 低い（パケットロスが発生しやすい） |
| **速度** | 遅め（信頼性のための処理が多い） | 速い（制御が少ないため） |
| **用途** | Web通信（HTTP/HTTPS）、ファイル転送（FTP）、メール（SMTP/IMAP）など | 音声・動画ストリーミング（VoIP）、DNS、オンラインゲーム など |

## ソケット通信の基本的な流れ（TCP）
1. **サーバー側**
   - `socket()` を使ってソケットを作成
   - `bind()` でIPアドレスとポートを指定
   - `listen()` で接続待機
   - `accept()` でクライアントからの接続を受け入れる

2. **クライアント側**
   - `socket()` でソケットを作成
   - `connect()` でサーバーに接続要求を送る

3. **データ通信**
   - `send()` / `recv()` を使ってデータの送受信

4. **通信終了**
   - `close()` でソケットを閉じる

## ソケット通信の応用例
- **Webサーバーとブラウザの通信**（HTTP, HTTPS）
- **オンラインゲームのリアルタイム通信**
- **IoT デバイスのデータ送信**
- **ストリーミング配信（動画・音声）**
- **チャットアプリ（WebSocketを利用）**

## まとめ
ソケット通信は、ネットワークを介したデータ通信の基盤となる技術であり、  
TCP・UDP などのプロトコルと組み合わせて **用途に応じた効率的な通信** を実現する。

特に、**TCPは信頼性重視、UDPは速度重視** の特性を持つため、  
目的に応じて適切なプロトコルを選択することが重要。
ABC390Eを解いた【動的計画法】


筆者はレート800前後の茶～緑コーダ

ABC390当日にACできなかったE問題を解いていく
    
https://atcoder.jp/contests/abc390/tasks/abc390_e


# 実装コード

動的計画法で各栄養素の摂取量を動的計画法で計算しながら、
カロリーX取った場合の最小値最大値を貪欲法で求める。

```python:main.py
from bisect import bisect_left, bisect_right, insort_left, insort_right
from collections import defaultdict, Counter, deque
from functools import reduce, lru_cache
from itertools import product, accumulate, groupby, combinations
import sys
import os
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rI1(): return (int(sys.stdin.readline().rstrip())-1)
def rLI1(): return list(map(lambda a:int(a)-1,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
IS_LOCAL = int(os.getenv("ATCODER", "0"))==0
err = (lambda *args, **kwargs: print(*args, **kwargs, file=sys.stderr)) if IS_LOCAL else (lambda *args, **kwargs: None)

def main():
    N, X = rLI()
    
    L = [0]*N
    
    for i in range(N):
        L[i] = rLI()
    
    dp = [[-float('inf') for _ in range(X+1)]for j in range(3)]
    for i in range(3):
        dp[i][0] = 0
    for V,a,c in L:
        v = V-1
        # err(v,a,c)
        for j in range(X,c-1,-1):
            # if X < 100:err(v,i,cur,j,dp[i][cur][j],dp[i][cur][j-c]+a,max(dp[i][cur][j],dp[i][cur][j-c]+a))
            dp[v][j] = max(dp[v][j],dp[v][j-c]+a)
    M = [list(accumulate(dp[i],max)) for i in range(3)]
    s = [0]*3
    # if X < 100:err(cur, [(j,[dp[i][cur][j] for i in range(3)]) for j in range(X+1)])        
    # for j in range(X+1):
    #     if X < 100:err(j,[M[i][j] for i in range(3)])
    for c in range(X):
        m = [M[i][si] for i,si in enumerate(s)]
        mm = min(m)
        mi = m.index(mm)
        # if X < 100:err(c,mi,s,m)
        s[mi] += 1
    print(min([M[i][si] for i,si in enumerate(s)]))

    
if __name__ == '__main__':
    main()

```

# まとめ

動的計画法の設定がうまくいかず、WA、TLEを繰り返した。
式をうまく組み立てられるようになりたい。
【NCA試験対策】Nutanixの重要用語を整理してみた

# 1.はじめに
Nutanix認定アソシエイト試験を受けることになったので、試験対策として勉強した内容をまとめた記事になります。

:::note warn
本記事ではAOS/AHV/CVMとは？といった必須用語に関する知識は身に着けていることを前提としています。
:::

# 2.NCA試験とは
形式は以下の通り。半年程のNutanixの経験があれば合格できるレベルの試験とのことです。

> 多項目選択式 50 問 
制限時間：90分
対応言語：英語、日本語
 受験料：1回につき99米ドル（2025/1/9申し込み時点で15700円）

確認できる範囲だと、現在3種類のNutanix認定アソシエイト試験があります。
今回はネット上に情報が豊富にあったNAC65を受験しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691986/f3e8ea26-2692-0c2a-dde2-30a0c0b5c104.png)

:::note warn
2024年度からNCA610が受験可能
:::

興味がある方は、以下のページを参考に申込してみてください。
https://infraapp.blogspot.com/2024/12/nutanix-professional2025.html

# 3.重要用語
以下、試験で押さえておくべき用語になります。基本的な用語から、少しマニアックな用語まで、さまざまです。

* **DSF(Distributed File System)**
分散ストレージファブリック、あるいは分散ストレージシステムと呼ばれる、各ノードのローカルディスクを束ねてクラスター全体で共通の共有ストレージプールを構成する機能。
共有ストレージプールからAHVのストレージ領域として提供するため、「ストレージコンテナ」を作成する。
その他の機能として以下を提供。（KeyWord）
　- 圧縮、重複排除、イレイジャーコーディング、高可用性（RF）、耐障害性（Availability Domains）
<br>

* **Witness VM**
Nutanixは原則3ノード構成であるが、2ノード構成でクラスタを組むことも可能。
 その場合は、片系がdownした際のスプリットブレインを回避するための監視サーバー（Witness VM）が必要になる。
 ※参考
  [Nutanix 2ノードクラスターの電源管理をオムロンUPSで解決](https://licensecounter.jp/engineer-voice/blog/articles/20240930_nutanix_xc-4000.html)
<br>

* **ADS**
AHVに搭載されているVMの自動配置機能。高負荷のVMが集中することで、AHVホストのCPU使用率が高まるといったリソース競合が発生しうる場合にVMを移動する。
Nutanix Vloumesでのボリュームグループの負荷分散にも利用されている。
<br>

* **ゴミ箱機能**
VM削除後、24時間以内であれば復活させることができる機能。デフォルトで有効。
※参考
[VMゴミ箱機能の設定方法](https://infraapp.blogspot.com/2020/08/aos5181.html)
:::note 
現在はPrismからも操作可能
:::
<br>

* **SSR** 
セルフサービスリストアの略。PrismからPD（プロテクションドメイン）などで取得したスナップショットをもとにVMリストアを行うと、全データが過去の時点までリストアされるのでリストアする必要のないデータまで過去時点に戻ってしまうが、SSRの場合はVM上のアプリケーション管理者が、PDで取得したローカルスナップショットのvDISKをOS画面からマウントすることで、欲しいデータのみをリストアすることが可能。
※参考
[「セルフサービスリストア（SSR）」とは](https://licensecounter.jp/engineer-voice/blog/articles/20200410_nutanix_ssr.html)
<br>

* **Flashモード**
VMの仮想ディスクをSSDに固定する機能。（全てのデータがSSDに配置されるわけではない。）
SSDにVMをピン止めするという意味から、「ピニング」とも呼ばれる。
※参考
[Flashモードとは](https://infraapp.blogspot.com/2019/12/flash.html)
<br>

* **IPAM** 
ゲストOSのネットワーク設定をDHCPによるIPアドレス管理機能を提供。
クラスターの中で、Acropolis Masterの役割を持つCVMが本機能を提供。仮想ネットワークを作成する際に、「IP アドレス管理を可能にする」にチェックを入れて有効化する。
<br>

* **エージェントVM**
VMが稼働しているAHVノードがダウンした場合、他のノードで再起動されないように設定したVM。
ADSによるマイグレーションは行われない。
<br>

* **ESXiホストのストレージコンテナ化**
AHVの場合は、ストレージコンテナをそのまま仮想マシンのvDISKの配置先として利用できるが、ESXiの場合は"NFS"データストアとしてマウントする。
[ESXiホストのストレージをコンテナにマウントする方法](https://tomomartin.hateblo.jp/entry/2021/12/15/045915)
<br>

* **Phoenix ISO**
Nutanixのイメージングに必要なバイナリを1つのISOにしたもの。CVMやAHVの復旧の際に使用することがあるが、基本的には使用することはない。
[Phoenixの使いどころ](https://infraapp.blogspot.com/2020/12/phoenix.html)
<br>

* **Pulse**
統計情報をNutanix側に提供する機能。「insights.nutanix.com」宛に443/TCPのポートを利用してHTTPSの通信を行う。AOSバージョンからクラスター全体の情報、ハードウェアの情報などいわゆる構成情報とパフォーマンス情報を中心に送信される。仮想マシンの名称やIPアドレス情報は、難読化することが可能。
[Nutanixを裏から支えるInsightsとPulseのご紹介](https://licensecounter.jp/engineer-voice/blog/articles/20220922_nutanixpulse.html)
<br>

* **Cluster Runway**
いつCPUが枯渇するかやいつストレージの容量が足りなくなるかなどを推測する機能。
Prism CentralのPrismProライセンスが必要。
[PrismCentalの使いどころ（その10） いつまで利用できるかのリソースを確認する](https://infraapp.blogspot.com/2018/09/prismcental10.html)
基本情報技術者試験　二進法の問題

引き続き情報技術者試験の勉強進めてます。




２進法の問題ってほんと難しいですね。




全部10進法だったらすごい楽なのに、新しく２進法の計算とか１６進数の計算とか覚えないといけないからほんと大変です。これって実務で使うのかなっていう内容がほとんどです。実際は計算機に数字入れてパソコンが勝手に進数変換とかしてくれるからあんま手作業で解くことないんやないのって思う。




たとえばこの問題。

基本情報技術者試験　サンプル問題より

負数を２の補数で表すとき、８ビットの２進正数ｎに対しーｎを求める式はどれか。

ここで＋は加算を表し、ORはビットごとの論理和、XORはビットごとの排他的論理和を表す。




ア　（ｎ　ＯＲ　１００００００００）＋０００００００１

イ　（ｎ　ＯＲ　１１１１１１１０）＋１１１１１１１１

ウ　（ｎ　ＸＯＲ　１０００００００）＋１１１１１１１１

エ　（ｎ　ＸＯＲ　１１１１１１１１）＋０００００００１







もうね。問題文がわからなさすぎる。




まず負数はなんとなくわかる。マイナスの数でしょ。２の補数？ってなんぞや。




２の補数で表す＝補数表現。

負数を２の補数で表すので、すべてのビットを反転した後に、１を足すことで正負を表す。




ん～～～。わからん。




まずすべてのビットを反転？ってなんやねん。




たとえば

００１０１０１０１０　を

１１０１０１０１０１　にする。




これは教科書的には１の補数表現というものらしい。




うん。なんでこっから１足すんや？




てか補数ってなんや？




引用ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

補数とは「
n進数の数に足した和が
nのべき乗になるような数」である

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

１０進数でいうと、

５５＋４５＝１００（１０の２乗）

１６５０＋３５０＝１０００（１０の３乗）　

における４５とか３５０のことらしい。




ふ～ん。




ほうほう。そしてたとえば




１１００　の補数は　００１１

１００１　の補数は　０１１０　になるらしい。




計算してみよう。




()内は乗数

　１　１　０　０

＊２(3)２(2)２(1)２(0)

ーーーーー

８＋４＋０＋０＝１２




　０　０　１　１

＊２(3)２(2)２(1)２(0)

ーーーーー

　０＋０＋２＋１＝３




？？？




３は１２の補数？ってどういうことや？




そういうことやないんか？




１５って２進数でいうと、




１５/２＝７　あまり１

７/２＝３　　あまり１

３/２＝１　　あまり１

１/２＝０　　あまり１




うん。１１１１になった。




もう一回定義をみると、




引用ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

補数とは「n進数の数に足した和がnのべき乗になるような数」である

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

ん～～？？




よく見てみると、




引用ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

「n進数の数に足した和＝nのべき乗から1引いた数」になる数も一種の補数

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー




ややこしいねん！




補数１個にしとけや。




なんで２つ定義安念。




こっちを減基数に基づくらしい。




で、２進数の世界では、




この減基数に基づく補数を１の補数（ある２進数を反転させた値）




ぴったり桁上がりが起きる補数のことを２の補数




というらしい。




で、２の補数の計算方法は、




２進数の０と１を反転させて、１を足す。




これだけ。




つまり、




１１００　を

００１１　にして、

１を足す。




　００１１

＋０００１

ーーーーーー

　０１００




０１００　＝　４（１０）

１１００　＝　１２（１０）

足して１６は２進数の２の４乗なので、０１００は１１００の補数である、

ということになるんか。




ほ～ん、こらようできとるわ。




で、よくわからんけど補数を使えば、マイナスを表現できる、と教科書には書いてある。

もう考えるのめんどくさいから、シンプルに覚えよ。




今回の問題を見てみると、




負数を２の補数で表すとき、８ビットの２進正数ｎに対しーｎを求める式はどれか。

ここで＋は加算を表し、ORはビットごとの論理和、XORはビットごとの排他的論理和を表す。




ア　（ｎ　ＯＲ　１００００００００）＋０００００００１

イ　（ｎ　ＯＲ　１１１１１１１０）＋１１１１１１１１

ウ　（ｎ　ＸＯＲ　１０００００００）＋１１１１１１１１

エ　（ｎ　ＸＯＲ　１１１１１１１１）＋０００００００１




２の補数を使ってｎをーｎとして表現するのは




①ｎを反転

②反転した値に１を足す




の手順やったな。




そうすると、

①ｎを反転させる　には、、、

XORやね。




またでてきたよ。ややこしいやつ。

この１問解くのにどんだけ勉強せなあかんねん。




XOR　＝　排他的集合論理和。




つまり、




AとBの命題があったときに、

A（真）　XOR　B（真）　なら　偽

A（真）　XOR　B（偽）　なら　真

A（偽）　XOR　B（真）　なら　真

A（偽）　XOR　B（偽）　なら　偽　　　　となる。




別の言葉で言い換えると、

A（１）　XOR　B（１）　なら　０

A（１）　XOR　B（０）　なら　１

A（０）　XOR　B（１）　なら　１

A（０）　XOR　B（０）　なら　０　　　　となる。




今回の場合、




ｎを反転させようとすると、




ア　（ｎ　ＯＲ　１００００００００）＋０００００００１

→ｎが１、反転用の数が１（またはｎ０反転用０）のときに反転しない。

イ　（ｎ　ＯＲ　１１１１１１１０）＋１１１１１１１１

→これも同じ。

ウ　（ｎ　ＸＯＲ　１０００００００）＋１１１１１１１１

→ｎが０、反転用が０のときに反転しない。

エ　（ｎ　ＸＯＲ　１１１１１１１１）＋０００００００１

→ｎが０、１ともにすべて反転する。しかも、反転した数字に１を足している。




これで補数が求まる。




うわ～～～、１問が長い。




これから膨大な知識が必要になりそうやわ。




以上。
自己開発に当たる前に確認するべき「webアプリ」の種類

こんにちは、steveです。
エンジニアであれば、一度は自己開発に取り組む機会があると思うのですが、自己開発に当たる時は、何かしらのフレームワークを使うと思います。

フレームワークは、簡単にwebアプリケーションを作成させることができるのが強みですが、それゆえに裏側のwebアプリの仕組みがブラックボックス化して、エンジニアリングの知識が抜けていても作れてしまうようです。

実際に、過去に面接で自分の自己開発を紹介した時、djangoを使っていたということもあり、もの珍しさがあったのか「djangoのクライアント、サーバー間の仕組みってどういう感じなんですか」と聞かれ撃沈したのを覚えています。

**「djangoはHTTPサーバを内包したwebアプリケーション一体型のアプリケーションであるため、webサーバとの連携が必要にならなくて、規模感を抑えて開発できる」**

このような理解があった方が開発もスムーズに進むと思います。

そこで今日は、webアプリケーションの低次元知識と、分類化をしてみたいと思います。

**1.webアプリケーションの通信方法**
--

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840426/f78b23f2-bfaa-3526-42a0-695e78ebaebf.png)

まず、webアプリの通信を「クライアントサイド」と「サーバーサイド」に分類して考えます

**1-1.クライアントの構成要素**

・HTTPクライアント
→urlを受け取り、httpサーバにリクエストを送信
・レンダリングエンジン
→レスポンスとして帰ってきたhtml,cssを画面に表示させる
・javaScriptエンジン
→ブラウザが唯一読解できる言語javaScriptを読解するためのエンジン、各ブラウザに標準搭載されていて、chromeのV8が有名で、その機能をサーバーサイドに応用しようとしたのがNode.jsである

**1-2.サーバーサイドの構成要素**

・HTTPサーバ
→HTTPリクエストを捌くサーバ、基本的にWebサーバに内包されている。　
・webサーバ
→HTTPサーバを内包しており、静的コンテンツを捌く、nginx,Apacheなどが有名
・アプリケーションサーバ
→動的コンテンツを捌く（本記事の内容）

(クライアントサイドとサーバーサイドをつなくのがインターネット、通信の方式がTCP/IPプロトコル)

**2.Webアプリケーションの実行方式**
--

1-2でアプリケーションサーバを紹介させてもらいましたが。その実行方法は多岐に渡ります。

前提として、アプリケーションサーバは、webサーバでは捌けない動的コンテンツを負担します。

HTTPクライアント　→ （インターネット）→　WEbサーバときたリクエストごとにプロセスを駆動させるのが、最初のwebアプリケーションでした。**(プロセス起動型)**

（プロセスというのは、cpuの実行単位です）
コレらは、PHP,Laravel等で対応されました。
CGIができたことにより実現した技術です。
ただ、毎回プロセスを駆動させるのは非常に大変です。
****


新たなアプリケーションの実行方式が**モジュール方式**です

webサーバの中に、プログラミング言語を読み込めるモジュールを入れる方式です。

都度appを駆動させる必要がないので前述の方式より高速です。
こちらは、perl,PHP,rubyで搭載されました。

ここまでは、比較的古い技術で、モダンではありません。規模的にも大きな規模に対応できません

ここからは、比較的大きな規模の開発向けの方法です
webサーバと、webアプリを分離させつつ、常にapp側を起動させる**分離型独立プロセス方式**
アプリケーションサーバの中にwebサーバに内包させることで、開発規模を抑えつつ、大きなアプリを作れる**一体型独立プロセス**です。

djangoはこの後者にあたり、javaのspringbootや、Node.jsもこちらにあたります。

コレらの技術にくわえ、Apacheなどのwebサーバ、DBサーバ、を加えてアプリケーションはできるというわけです
VSCode/CursorでiOS開発を始めよう！SweetPadの設定と利点

## はじめに

iOS開発といえばXcodeが定番ですが、VSCodeやCursorでもiOS開発が可能になってきています。今回は**SweetPad**というツールを使って、VSCode/Cursor上でiOS開発を行う方法をご紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4019/7b94ccaa-85fa-3dac-227f-54a125a8e426.png)

## SweetPadとは

SweetPadは、VSCode上でiOS開発を可能にする拡張機能です。以下のような特徴があります:

- Xcodeビルドシステムとの統合
- コード補完
- デバッグ機能
- シミュレータ/実機での実行
- テスト実行
- コードフォーマット

## セットアップ手順

### 1. 必要な環境

- macOS
- Xcode (最新版推奨)
- VSCode または Cursor
- Homebrew

### 2. SweetPadのインストール

1. VSCodeマーケットプレイスから「[SweetPad ](https://marketplace.visualstudio.com/items?itemName=sweetpad.sweetpad)」を検索してインストール
2. 必要なツールをHomebrewでインストール:

```bash
brew install swift-format
# swiftlintはオプション（必要に応じてインストール）
```

### 3. 設定

VSCodeの.vscode/settings.jsonに以下を追加:

```json
{
  "[swift]": {
    "editor.defaultFormatter": "sweetpad.sweetpad",
    "editor.formatOnSave": true,
  },
}
```

## メリット

1. 軽量な開発環境
2. VSCodeの豊富な拡張機能が使える
3. Git操作が快適
4. マルチプラットフォーム開発がしやすい

## Xcodeとの比較表

| 機能               | SweetPad | Xcode |
|--------------------|----------|-------|
| 起動速度           | ⚡️速い    | 🐢遅い |
| Interface Builder  | ❌不可    | ⭕️可能 |
| 拡張機能           | ⭐️豊富   | △限定的 |
| プロファイリング   | ❌不可    | ⭕️可能 |

## 注意点

- 一部のInterface Builder機能は使えない
- Xcodeプロジェクト作成は従来通りXcodeで行う必要あり
- プロファイリングなどの高度な機能はXcodeを使用

## まとめ

SweetPadを使うことで、VSCode/Cursor上でもiOS開発が可能になります。Xcodeの代替を目指すというよりは、軽量な開発環境として併用するのがおすすめです。特に:

- テキストベースの開発が中心の場合
- クロスプラットフォーム開発をする場合
- VSCodeの環境に慣れている場合

に有効な選択肢となるでしょう。

## こんな開発者におすすめ
- Cursorでエージェントを用いたiOS開発を行いたい場合

に有効な選択肢となるでしょう。

## 参考リンク

- [Sweetpad](https://sweetpad.hyzyla.dev/)
- [GitHub - sweetpad-dev/sweetpad](https://github.com/sweetpad-dev/sweetpad)
Redshiftの制約と解消方法について

Redshiftの制約と解決案をまとめてみました。

## 1. データ分散・配置関連

| 制約                                               | 解消案                                                         |
|---------------------------------------------------|--------------------------------------------------------------|
| ファクトテーブルには1つのディストリビューションキーしか設定できない。 | ディストリビューションキーはデータをRedshiftのノード間でどう分散するかを決めるものです。結合頻度が高いディメンジョンテーブル（顧客情報、製品情報など）のキーを使うと効率的にクエリが実行されます。 |
| ディストリビューションが不均等になる可能性がある（例: 季節変動によるデータ集中）。 | データの分布が偏ると、特定のノードだけに負荷が集中して遅くなります。値の種類（カーディナリティ）が多いカラムをディストリビューションキーにすると偏りを防ぎやすくなります。 |
| フィルタ期間が狭い場合、クエリ負荷が一部のノードに集中する。          | 一定期間だけのデータを絞り込むクエリが多いと、該当するノードに処理が集中します。そこで、フィルタ後に均等に分散されるカラムを使うのが効果的です。        |
| ディメンジョンテーブルがファクトテーブルと同じノードに配置されない場合、クエリ性能が低下する。 | ディメンジョンテーブルを全ノードに複製（ALLディストリビューション）すると、結合が高速になりますが、ストレージを多く消費するため、頻繁に結合される小さなテーブルで使うと良いです。 |


## 2. データ管理・性能関連

| 制約                                               | 解消案                                                         |
|---------------------------------------------------|--------------------------------------------------------------|
| ALLディストリビューションはストレージとロード時間を増加させる。          | 複製するテーブルが大きいと、ストレージが逼迫しロード時間が長くなります。小規模なテーブルにのみ適用してください。 |
| データが大量でクエリ計画が最適化されない場合がある。                    | ソートキーを指定すると、クエリは特定の範囲外のデータをスキップでき、処理が高速化されます。特に日付やIDのようなカラムが効果的です。 |
| 圧縮方式が適切でない場合、クエリ性能が低下する。                         | Redshiftの自動圧縮機能を使えば、最適な圧縮形式が適用され、データサイズの縮小とクエリ高速化が期待できます。 |


## 3. クエリ最適化関連

| 制約                                               | 解消案                                                         |
|---------------------------------------------------|--------------------------------------------------------------|
| クエリが大規模な結合でハッシュ結合により遅くなることがある。            | 結合カラムをソートキーとディストリビューションキーに指定すると、クエリはハッシュ結合よりも高速なソートマージ結合を選択します。 |
| 主キーや外部キーの制約が不足している場合、クエリ最適化が不十分となる可能性がある。 | Redshiftは主キー・外部キー制約を情報として使用してクエリを最適化します。これらを設定することで、効率的なクエリ計画をサポートできます。 |
| カラムサイズを最大値に設定するとストレージ効率が低下する。               | 必要以上に大きなカラムサイズはストレージを無駄に消費します。使用するデータに合ったカラムサイズを設定しましょう。 |



## 参考　以下で用語をまとめています。

https://qiita.com/siam__/items/a83d6206e9aaae297cc9
Redshiftの用語について


Redshiftに関する用語をまとめてみました。

## 1. データ分散・配置関連

| 用語  | 概要  |
|---|---|
| ディストリビューションキー (DISTKEY) | Redshiftでデータを分散配置する際に使用するカラムのキー。 |
| ディストリビューションスタイル | データをノード間にどのように分散するかを定義する方式。 |
| ALLディストリビューション | ディメンジョンテーブル全体をすべてのノードに複製する分散スタイル。 |

## 2. データ構造・設計関連

| 用語              | 概要                                                         |
|-------------------|--------------------------------------------------------------|
| ファクトテーブル   | ディメンジョンテーブルと結合され、主に大量のトランザクションデータを格納するテーブル。 |
| ディメンジョンテーブル | ファクトテーブルと結合され、カテゴリや属性情報を提供するテーブル。           |
| 主キー (Primary Key) | テーブル内で各行を一意に識別するカラム。                        |
| 外部キー (Foreign Key) | 他のテーブルの主キーを参照するカラム。                         |
## 3. クエリ最適化関連

| 用語              | 概要                                                         |
|-------------------|--------------------------------------------------------------|
| ソートキー         | ディスク上でデータを特定の順序で格納する際に指定するカラムのキー。 |
| ソートマージ結合   | ソートされたデータを効率的に結合するためのクエリ最適化手法。       |
| ハッシュ結合       | ハッシュ値を基にテーブルを結合するクエリ手法。                 |

## 4. データ管理・性能関連

| 用語              | 概要                                                         |
|-------------------|--------------------------------------------------------------|
| 自動圧縮          | Redshiftがデータの内容を解析して適切な圧縮エンコーディングを自動的に適用する機能。 |
勉強してきた（つもりだった）エンジニア、アウトプットの大切さに気づく

## 現状の自分
#### 仕事内容
SES企業に入社して4年
金融系の保守
　設計書～ソースの修正
 　たまに新規機能追加で設計書作成、新規実装

#### スキル
　フロントエンド：HTML・CSS・javascript 読める
　バックエンド：Javaが読める・ちょっとした機能追加の実装ができる
　SQL：CRUD読める、書ける

## 勉強はしていたつもり
#### 今までやってきたこと
　毎月3冊は技術書を購入して読む
　Udemyで興味のある動画をまとめ買い、隙間時間に視聴
　Qiitaの投稿チェック
　LeatCodeやpaizaの問題を解く

## きっかけ
　転職活動を機にアウトプットが大切であると気づいたことがきっかけです。（今さらですが…）
　自社開発、受託開発、開発ができるSESなどの企業にひたすらエントリー、いざ面接！
 ⇒あれ…？私技術レベル低くない？コーディングテストボロボロやん…
 　ポートフォリオって何…？Githubで自分の作ったものコミット…？
 ⇒私も個人開発挑戦してみよう、アイデア考えた！いざ開発！
 ⇒何から手をつければわからない、コード書けない…
 
 
 ## 目標
 　短期：自分が作りたいと思ったプロダクトを0→1で作れるようになる
  
　中期：スキルがないからこの仕事ができない、諦めないと…って考えがなくなるくらいのスキルを持つ
 　このプロジェクトやりたいです！って自身を持って言えるエンジニアになる
    
　長期：自分と同じように成長したいと思っていても、上手くいかないと悩んだり、苦しんだりしている人が一人でも少なくなるような存在になる
　LT会やカンファレンスを見る人ではなく発信する人になる
コストを掛けずにAIサービスが作りたい

こんにちは、苔コッコーです。
今回は、ノーコストでAIを使用するサービスを開発する方法をまとめます。
# きっかけ
自分でもAIを使用したサービスを作成してみたかったのですが、中学生でお金がないし調達する宛もないので、生成AIのAPI代やクラウドでGPUを動かす費用、はたまた自分のPCをサーバー化する際の電気代などを負担したくなかったからです。

# Transformer.js
さっそく本題です。Transformer.jsとは、小規模なAIモデルをJavascriptだけで、ローカルで実行できるというものです。WebGPUやCPUを用いて実行されます。もちろんChatGPTやGemini、Claudeのような大規模なLLMは使用できないのですが、特定のタスクに絞ったモデルなら実行することができます。
これを使用して作ってみたのが以下の英文法チェッカーです。

https://kokecoco.github.io/Grammar-Checker/

これは

https://huggingface.co/Xenova/t5-base-grammar-correction

というモデルを使用しています。
正確なパラメーター数はわかりませんでした。

試しに間違えやすいミスを使ってテストしてみました。時制、冠詞のつけ忘れ、前置詞の誤用、三単現のsなどは正しく修正してくれたのですが、代名詞の格、最上級の誤用などは修正できませんでした。やはりパラメーター数が少ないモデルなので、簡易的な用途にしか使用できないようです。
それでも、ないよりは便利なので、コストをできるだけ減らしたい場合には検討してみてはいかがでしょうか。
迷ったらココに戻れ！ゆるっと学ぶPMBOKとプロジェクト成功のコツ

## はじめに

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/89acbbe0-f121-d846-33fd-adb1132365c3.png)

プロジェクトに関わるとき、毎回同じ役割とは限らない。プロジェクトマネージャーだったり、エンジニアだったり、ただのメンバーだったり。でも、どんな立場でも大事なのは「原理・原則を考えながら仕事をすること」。

「そんなのわかってるけど、現実はそう甘くない！」と思うかもしれない。確かにその通り。計画どおりに進まないし、急な仕様変更はあるし、リソースは足りないし。でも、だからこそ**「原理・原則に立ち戻る」** ことが大事になってくる。

では、原理・原則って何なのか？意識すると何が変わるのか？この記事では、プロジェクトマネジメントの世界標準である**PMBOK（Project Management Body of Knowledge）**をもとに、ちょっと肩の力を抜きつつ、大切な考え方を解説します。

---

## PMBOKとは？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/89cb9d2d-2965-b45d-0be3-1508f1d0a512.png)

- **プロジェクトマネジメントのガイドブック**
  - PMI（Project Management Institute）が作ったプロジェクト管理の基本ルール。
  - 世界中で使われているけど、ガチガチのルールじゃなくてフレームワーク。

- **最新版は「原則」を重視**
  - 第7版では「状況に応じて柔軟に考えよう！」という方向性。
  - ルールに縛られるよりも「どうすればうまくいくか？」を考えるのが大事。

- **なぜ知っておくといいのか？**
  - プロジェクトが迷走しにくくなる。
  - どんな役割でも使える共通言語。
  - 仕事の無駄を減らせる。

---

## 困ったときに立ち戻る原理・原則

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/3c854ff8-40f1-323a-17ec-c654eef5c6bc.png)

プロジェクトで迷ったとき、「そもそも何をすべき？」と思ったときに、立ち戻るべき基準があると判断しやすくなる。それがPMBOKで言う「原則」だ。どんなときに、どんな視点で考えると良いのか、具体的なアドバイスをまとめてみた。

### 1. ステークホルダーと協力する

**困ったときの考え方**：
- 「関係者とちゃんと話せているか？」
- 「相手が何を求めているか理解できているか？」

トラブルが起きたら、まずは関係者と対話し、誤解を解消できる余地がないか考えよう。

### 2. 価値を意識する

**困ったときの考え方**：
- 「この作業、本当に価値があるのか？」
- 「プロジェクトの目的に沿った行動ができているか？」

タスクが増えすぎて混乱してきたら、プロジェクトのゴールを改めて確認し、不要な作業を減らせないか見直そう。

### 3. 変化に適応する

**困ったときの考え方**：
- 「この変更はプロジェクトの目的に適しているか？」
- 「対応することで得られるメリットとデメリットは？」

変化は避けられないもの。冷静に分析し、どうすれば一番良い結果を出せるか考えてみよう。

### 4. リスクを管理する

**困ったときの考え方**：
- 「この問題は事前に想定できなかったか？」
- 「次回以降に同じ問題が発生しないようにするには？」

起こってしまった問題を責めるのではなく、未来の対策を考えるのが大事。

### 5. 継続的に学習する

**困ったときの考え方**：
- 「この経験から何を学べるか？」
- 「次に同じことが起こったらどう対処するか？」

失敗しても、それを糧に次のプロジェクトをより良くするための糸口を見つけることが重要。

---

## まとめ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/94b0c433-fa8a-542e-0c6b-f185a7f1cf2b.png)


- PMBOKはプロジェクトをうまく回すためのフレームワーク。
- 迷ったら「原理・原則」に立ち戻ると、判断しやすくなる。
- **困ったときの視点**：「ステークホルダーとの協力」「価値の意識」「適応力」「リスク管理」「継続的な学習」を意識する。
- **完璧を目指さず、できることからちょっとずつやってみよう！**

プロジェクトって思い通りにいかないことばかり。でも、「今の判断、原理・原則に合ってる？」と時々振り返るだけでも、確実に前に進めるはず。まずは、できる範囲で意識してみよう！

## PMBOK第7版における12の原理

![マインドマップ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/eb4a3b1a-4948-eadc-a20c-06e4dfdeda82.png)

| No. | 原理 | 説明 |
|------|------|------|
| 1 | スチュワードシップ | プロジェクト活動において責任を持ち、信頼できる行動をする |
| 2 | チームリーダーシップ | 協力的なプロジェクトチームを構築し、共通の目標を達成する |
| 3 | ステークホルダーの関与 | プロジェクトの成功に向けて、ステークホルダーを積極的に関与させる |
| 4 | 価値の重視 | プロジェクトの成果がもたらす価値を継続的に評価し、調整する |
| 5 | システム思考 | プロジェクトの動的な状況を認識し、適切に対応する |
| 6 | リーダーシップの発揮 | プロジェクトを導くためのリーダーシップを示す |
| 7 | テーラリング | プロジェクトの特性に応じて管理手法を調整する |
| 8 | 品質の組み込み | プロセスと成果物に品質を組み込む |
| 9 | 複雑性の管理 | プロジェクトにおける複雑性を認識し、適切に対処する |
| 10 | リスクの最適化 | リスクに対する対応策を最適化し、機会を最大化する |
| 11 | 適応性と回復力 | 変化に適応し、回復力を持つ |
| 12 | 変革の促進 | 将来の状態を達成するために必要な変革を促進する |

これらの原理は、プロジェクトマネジメントの実践において重要な指針となり、プロジェクトの成功を支える基盤を形成します。
processingでファイルをドラッグアンドドロップ

# はじめに
　Processingで実行中のウィンドウに対して、画像ファイルをドラッグ&ドロップ(drag & drop)(D&D)出来たら便利だなぁと感じましたが、標準の機能にはなく、java機能を呼ぶのも大変そう。便利な「Drop」というライブラリがあったので、その紹介です。

# 環境
MacOS 13.4.1
Processing 4.2
Drop 1.0.2
ライブラリマネージャからインストールする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/86686e49-aaa9-aedc-4573-23c2e1c7ee17.png)

公式ページのI/Oの項目にDropが紹介されている。

https://processing.org/reference/libraries/#i/o

開発者のページは以下にある。

https://transfluxus.github.io/drop/

# コード
実行して開いたウィンドウに、画像ファイルをD&Dすると、その画像を表示する。
最小のコードにしたので、エラー処理などはしていない。

Macのスクリーンショットで生成したpngファイルを使ったが、
ファイル名に「カタカナ、スペース、ピリオド」が含まれていても、正常に動作した。感心する。

```java
import drop.*;

PImage img;

void setup() {
  size(800, 800);
  //SDrop drop = new SDrop(this);
  new SDrop(this);
}

void draw() {
  background(0);
  if (img!=null) {
    image(img, 0, 0);
  }
}

void dropEvent(DropEvent de) {
  String path = de.toString();
  img = loadImage(path);
}
```