OmniAICreator/Qiita-1.07M huggingface dataset:
Windows11 最新の 24H2 が  Windows Update に表示されない方へ

# はじめに

米国時間2024年10月1日 に 24H2（OSビルド：26100.1882）が正式にリリースされました。
Preview版 24H2（OSビルド：26100.1742）をインストールしていたPCには、Windows Updateで 24H2（正式版）が表示され、アップグレードができましたが、23H2（OSビルド：22631.4317）のPCでは、Windows Updateに 24H2 が表示されません。

いつになったら表示されるのでしょうか？
待っていられないので、24H2（正式版）を表示させてアップグレードしたいと思います。

_Windows11要件を満たしているPCが前提です。_


# Windows Updateで 24H2 を表示させる方法

### 1. 「ローカルグループポリシーエディター」を開く

Win+R で「ファイル名を指定して実行」を開き、`gpedit.msc` を入力して「OK」

![win04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/ea3094be-4dc5-9f3b-3352-79a2ee8dd494.png)



### 2. 「ローカルグループポリシーエディター」で設定する


#### 2.1 「管理用テンプレート」をクリック

![win05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/309e8e2b-1e87-4e68-c9dc-8d3c84687f51.png)


#### 2.2 「Windows コンポーネント」をクリック

![win06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/60f3f7d8-fdcd-9760-e4d1-1ff9bc0c5dc0.png)


#### 2.3 「Windows Update」をクリック

![win07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/08008bf2-c5e5-96f1-68be-1ec2566987c6.png)


#### 2.4 「Windows Update から提供される更新プログラムの管理」をクリック

![win08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/ed41a99f-0684-8b46-1c29-f0bc17c99aa5.png)


#### 2.4 「ターゲット機能更新プログラムのバージョンを選択する」を開く

右ペインの「ターゲット機能更新プログラムのバージョンを選択する」をダブルクリック

![win09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/df36d4a3-ff2b-c69b-83fc-025c89d0a458.png)


```text:英語バージョンの場合
Local Group Policy Editor
　→ Computer Configuration
　　→ Administrative Templates
　　　→ Windows Components
　　　　→ Windows Update
　　　　　→ Manage updates offered from Windows Update

Select the target Feature Update version
```

#### 2.5 「ターゲット機能更新プログラムのバージョンを選択する」ダイアログで設定する

![win10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/80864158-52b6-1d07-6376-9a1ef791fba4.png)


- 「有効(E)」をクリック
- 「`Windows 11`」を入力
- 「`24H2`」を入力
- 右下の「適用(A)」をクリック

![win11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/85a60663-3179-0832-78d0-52bce843c033.png)


#### 2.6 「設定」の「Windows Update」で「更新プログラムのチェック」をクリック

![win12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/8de45df6-f160-8dcb-22c8-5d69b5a7d055.png)

#### 2.7 「Windows 11, version 24H2」が表れ、ダウンロードがはじまる

<font color=red><b>注意</b></font>「ダウンロード&インストール」ボタンが現れずに直ちにダウンロードが開始された

![win13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/0a3f46db-73ab-68d5-f064-c5ff8e6792b0.png)


### 3. 戻しておく

念の為、「未構成(C)」をクリックして戻しておく

![win10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/80864158-52b6-1d07-6376-9a1ef791fba4.png)



# 再起動すると、24H2 にアップグレードされる

![win14-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/fdd179ee-278a-c3c4-91e7-a40569de69b5.png)


#### 24H2（OSビルド：26100.2033）にアップグレードされました

[KB5044284](https://support.microsoft.com/ja-jp/topic/october-8-2024-kb5044284-os-build-26100-2033-6baf4a06-9763-4d9b-ba8a-f25ba6ed477b)が反映済みのようです。

![win15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/320beb04-c142-1b09-3799-60fc11dd4f31.png)




<br><br>**以上**
【初心者】初めてのLPコーディングは学びだらけ！

## 初めてLPコーディングしてみて
初めてのLPデザインを終え、ついにコーディング！
躓いては解決するをとにかく繰り返しまくったので、今回学んだこと、躓いたポイントをまとめることで、皆さんの学習の一助になりましたら〜幸いです！
## 学んだこと
### ⚫︎デフォルトでmarginが指定されてることがある！
今回コード書き始めて、
「なんだっ！絶妙に2~3pxくらい余白があるぞ…！」
とツイートしたら、
「あ〜デフォでmarginついてるから、`margin:0;`指定しないとね」
とAiちゃまに教えていただきました。
ほほ〜そうなんですね！初知りメモメモ。
### ⚫︎背景をグラデーションにする
前回フラットデザインとマテリアルデザインについて書きましたが、今回FVの背景デザインにグラデーションを使用することになりました。
[グラデーション設定方法はこの記事で読めます](https://developer.mozilla.org/ja/docs/Web/CSS/CSS_images/Using_CSS_gradients)
グラデーションの向きや角度も簡単に指定することができるんです〜！

### ⚫︎ボタンをaタグで実装する
ボタンは画像を貼り付けて、画像に対してaタグをくっつけるものだと思ったのですが、aタグでボタンも作れるんですね−！
```
.cta a{
    color: #333;
    display: block;
    width: auto;
    height: auto;
    font-size: 3.6rem;
    letter-spacing: 0.05em;
    text-align: center;
    text-decoration: none;
    background-color: #F3BD00;
    margin: 0 auto;
    position: relative;
    top: 0;
    border-radius: 5px;
    box-shadow: 2px 4px 0px #7C6100;
    padding: 3rem;
}
```

### ⚫︎プロフィールのように画像を小さく丸く切り抜く
[この記事がわかりやすかった！](https://kouhekikyozou.com/css_image_round)

### ⚫︎要素の上に要素を重ねて配置する方法
2つの要素A,Bがあって、
AをBの上に配置したい場合は、`z-index`を使えば楽々でしたー！
```
A{

`position:relative;`

`z-index: 0;`

}

B{

`position:relative;`

`z-index: 1;`

}
```
を指定する

## 躓きPOINT
### position:relativeで子要素を移動させた時に生じる余白を消す
`position:relative;`で画像を移動させたら、元々画像が配置されていた位置に余白ができてしまいました。
そこで調べてみると、

:::note info
`position:relative;`を使用した場合

要素は元の位置から指定された距離だけ移動しますが、元の位置はそのまま残ります。つまり、要素の実際の位置は移動しますが、スペースは元の位置を占有し続けます。
:::
だそうです…！へ〜初知り。
<b>position:absoluteはスペースは元の位置を占有しない</b>ので、
親要素に`position:relative;`を指定して、 
子要素に`position:absolute;`を指定すれば、余白を消すことができました〜！⭐️

### ⚫︎口コミをスライダーで表示させた時に、次のコンテンツが侵食して余白が入ってしまった。
![スクリーンショット 2024-10-11 18.16.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896340/6c440635-002e-f1ea-be54-aafa7b569de2.png)

`width:100%;`を指定したり、`margin:0;`を指定したりしても無くならなかったこの余白。解決方法は・・・

:::note info
mainタグで囲んでmainタグにoverflow:hidden;を入れる！
:::
bodyに入れてしまうとそもそもスライダー機能が発揮できないので、bodyに入れるのではなく、mainタグで囲むのがポイントだそうです、！素晴らしすぎる大発見…！
この大発見をご教示してくださったM・N氏からの解説を貼り付けます！
### M・N氏より

:::note info
`overflow:hidden;について`
はみ出しとかスクロールを制御する時に使うって認識ですー。
bodyにいれちゃうと、画面内にはみ出さないように制御するのでスクロールできなくなっちゃうのですよねー。
特定の要素にいれると、その親要素の範囲（今回はbody）からのはみ出しを制御するだけなので、ページ全体（body）のスクロールには影響しないってゆう。
:::
なんとありがたいお言葉。今回はこの言葉のおかげで記事がバシッと締まりましたな〜(((o(*ﾟ▽ﾟ*)o)))

## まとめ
まだまだ知らないことだらけだ〜〜〜と思いますが、こんな感じで毎回知識を貯めていけば、もっとコーディングがスムーズになるんだろうなと！明るい未来がチラ見えしました！
わからないことはまず調べてインプット、そして得た知識をアウトプット。
徐々にできてきてるので、引き続き頑張ります！
次回はセレクタの並び方やコードの美しさにも気をつけたいなと思っております！
最後までお読みいただきありがとうございました〜！
複素数


### 複素数とは
複素数とは、実数と虚数を組み合わせた数のことです。一般的に、複素数は次のように表されます。

$\[ z = a + bi \]$

ここで、  
- $\( a \)$ は実数部分（実部）  
- $\( b \)$ は虚数部分（虚部）  
- $\( i \)$ は虚数単位で、$\( i^2 = -1 \)$ という特性を持っています。

### 例
例えば、$\( z = 3 + 4i \)$ という複素数では、実部は 3、虚部は 4 です。

### 複素数の演算
1. **加算**：
   複素数同士を足す時は、実部同士、虚部同士を足します。
   $\[
   (a + bi) + (c + di) = (a+c) + (b+d)i
   \]$

2. **減算**：
   複素数同士を引く時も同様です。
   $\[
   (a + bi) - (c + di) = (a-c) + (b-d)i
   \]$

3. **乗算**：
   複素数を掛ける時は、分配法則を使います。
   $\[
   (a + bi)(c + di) = ac + adi + bci + bdi^2 = (ac - bd) + (ad + bc)i
   \]$

4. **除算**：
   複素数を割る時は、共役を使って分母を実数にします。
   $\[
   \frac{a + bi}{c + di} = \frac{(a + bi)(c - di)}{c^2 + d^2} = \frac{(ac + bd) + (bc - ad)i}{c^2 + d^2}
   \]$

### 複素平面
複素数は、実数部分を x 軸、虚数部分を y 軸とする平面（複素平面）で表すことができます。例えば、$\( 3 + 4i \)$ は、x 軸の 3、y 軸の 4 の位置に点を持ちます。
ファントムトークンとは何か

# 概要
ファントムトークンはOauthで使用できるデザインパターンの一つです
複数種類のトークンを組み合わせることでセキュリティ、パフォーマンスに配慮しながら認可処理を行うことができます


# 前提知識
この記事には前提としてOauth, OIDCの知識が必要です
この部分についてはこの記事の範囲外のため別の記事を閲覧してください

## アクセストークンの種類について
Oauthで使用されるアクセストークンには以下2つの種類があります

* Opaque Token
    * 不透明化トークン
* Structured token
    * 構造化トークン

### Opaque Token
こちらは無意味な文字列をアクセストークンとして使用します
トークン単体では意味を持たず、使用するには認可サーバに問い合わせを行う必要があります
仕組み上漏洩してもトークンを無効化するだけでよいためセキュリティ的に有利です
ですが、必ず認可サーバの呼び出しをする必要があるためリソース的には不利です
```
gtoeQ2d8vkTDprVK
```


### Structured Token
これはJWTのように情報が埋め込まれているtokenです
問い合わせを行わなくても情報を取得することが可能のためサービス単体で認可処理を行うことができます
ですが、トークンそのものに情報が埋め込まれているため流失のリスクがあります
```
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
```

```実際のclaim
{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}
```

*** 
それぞれ有利不利があるため要件に応じて選択する必要があります


# ファントムトークンとは何か
ファントムトークンとはOpaque TokenとStructure Tokenの利点を組み合わせた方法です
マイクロサービスで構築されたサービスで利用されます

* 認証サーバはOpaque TokenとStructure Tokenのペアを作成します
* クライントに対してはOpaque Tokenを渡します
* リクエストを送る際にはプロキシサーバーを経由し、ここでOpaque TokenとStructure Tokenの交換を行います
* プロキシサーバはStructure Tokenとともにマイクロサービスにリクエストを転送します

![Opaque Token](https://curity.io/images/resources/architect/api-security/phantom-token-flow.svg?v=20210412)

> https://curity.io/resources/learn/phantom-token-pattern/

この方法を使用するとセキュリティ、パフォーマンスを両立することが可能です
* クライアントにはOpaque Tokenを渡すためセキュリティ的に有利です
* マイクロサービスに対してはStructure Tokenを渡すためパフォーマンス的に有利です

# 実例
擬似的なコードで交換のイメージを掲載します

## 前提条件
ここではtokenはすでに取得済みと想定します

構成図は以下です
![構成図.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251141/fa5c68a2-97ca-9c15-dc2e-a153ff42cc44.png)

## リクエスト詳細
### リクエスト開始

クライアントは通常の方法でリクエストを送付します
``` request
POST https://demo.com/api/resource/create
Authorization: Bearer opaque-token
Content-Type: application/json

{
 "book": "demo"
}

```

### 受け取ったProxy Server
Proxy ServerではStructured Tokenとの交換を行い、Authorization Headerを書き換え各APIに転送します

方法としては特に決められていないため例を挙げておきます

* Token introspectionを使用して確認を行い、取得したIDTokenをアクセストークンをして代用
* Token Exchangeを使用してJWTトークンと交換

### Micro Service
受け取ったMicro Serviceは公開されているJWKセットを元に署名検証を行います
``` request
POST https://demo.com/api/resource/create
Authorization: Bear structured-token
Content-Type: application/json

{
 "book": "demo"
}
```

# 所管
認証認可関連の開発を行うときはRFCの仕様書を主に読むことが多いため、それ以外の設計手法を知ることができて勉強になりました
公式発表以外の情報を知るためにも勉強会やイベントに積極的に参加をしたいと思います
新RPGの目次

[旧RPGの目次](https://qiita.com/hijpa/items/056acaa13e935590fdc2)


[pygameでRPG（描画メイン）](https://qiita.com/hijpa/items/29ddbdb3edd91402dda2)

キーハンドラー　カーソル画像の作成　描画メイン　コマンドのみ

[pygameでRPG（早い順）](https://qiita.com/hijpa/items/efd1a31b2193d7b0b220)

簡易コード　早い順　コードと変数の説明

[pygameでRPG（ダメージ計算）](https://qiita.com/hijpa/items/c27d187ee5fa58f5f178)


ダメージ計算

[pygameでRPG（モンスターの描画）](https://qiita.com/hijpa/items/9099de75723a1408338b)

モンスターの描画　モンスターを消す　ダメージエフェクト

[pygameでRPG（戦闘たたかう）](https://qiita.com/hijpa/items/7afecb524626899dbc17)

戦闘たたかう

[pygameでRPG（まほう）](https://qiita.com/hijpa/items/5c92f57e0acae72796c2)

まほう

[pygameでRPG（レベルアップ）](https://qiita.com/hijpa/items/ac112ee76befbfdda536)

文字上昇　ステータス上昇　レベルアップ

[pygameでRPG（パーティー）](https://qiita.com/hijpa/items/12fa40d7f17fbe3aee40)

パーティ
連続で攻撃するエラーを修正

[pygameでRPG（戦闘画面）](https://qiita.com/hijpa/items/cb758ca12dd44118fcc0)

戦闘画面（敵３体）
Ubuntu 24においてDash-to-panelで非表示にしたDockがロックスクリーンに表示されてしまう

## 同様の問題

- [Ubuntu 24.04 and dash to panel extension - ask Ubuntu](https://askubuntu.com/questions/1518891/ubuntu-24-04-and-dash-to-panel-extension)

1. Ubuntu DockをDash-to-panelというエクステンションを使って、置き換えています
1. サスペンドすると、ロックスクリーンに、Dash-to-panelで置き換えているはずのDockが表示されてしまう

ということを言っています。

## 解法

同じページで解法が提示されています。しかし、この解法は、ちょっと分かりづらいので、書き直します。

1. Extension Managerで、Dash-to-panelをオフにします
1. rebootします（たぶんこれが必要だけど、もとのページには書いていない）
1. Extension Managerで、Ubuntu Dockをオフにします（ここももとのページでは「settingで」と書いてあるので、混乱しますが、Ubuntu DockはExtension Managerで管理します）
1. Extension Managerで、Dash-to-panelをオンにします

これでロックスクリーンからDockを消せます。
Qiita の kbd タグの見た目調整 by CSS (User style)

## 背景

キーボードのショートカットなど Qiita にメモしたりしてますが、  
[`kbd` タグ](https://developer.mozilla.org/ja/docs/Web/HTML/Element/kbd)にスタイルが当たってなくて微妙だったので User style を書きました。

User style は Google Chrome だと [Stylus](https://chromewebstore.google.com/detail/stylus/clngdbkpkpeebahjckkjfobafhncgmne) か [Stylish](https://chromewebstore.google.com/detail/stylish-custom-themes-for/fjnbnpbmkenffdnngjfgmeleoegfcffe) を入れると Qiita とか好きな Web サイトに適用できます。   
(ワーニングが出てますが、動くうちは Stylus 推奨です)

GitHub のスタイルが目に慣れてるので参考にしつつ、
Bootstrap などもサクッと眺めて以下のように調整しました。

```css
kbd {
    --font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;

    box-shadow: 0 1px #00000029;
    border-radius: 4px;
    border: solid 1px #d8dee4;
    padding: .2em .4em .3em;

    background: #f6f8fa;
    color: #1f2328;
    vertical-align: middle;
    font: .75em/1 var(--font-family);
}
```

_参考ページ_

- [キーボード ショートカット - GitHub Docs](https://docs.github.com/ja/get-started/accessibility/keyboard-shortcuts)
- [User input — Reboot · Bootstrap v5.3](https://getbootstrap.com/docs/5.3/content/reboot/#user-input)
- [\<kbd\>: キーボード入力要素 - HTML: ハイパーテキストマークアップ言語 | MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Element/kbd)

使えそうだったらご利用くださいませ。
[LogicCircuit] 論理回路

# 

# 参考リンク
- [R4A23](https://www.fe-siken.com/kakomon/22_haru/q26.html)
- [R2A23](https://www.ap-siken.com/kakomon/02_aki/q23.html)
- [R5S21](https://www.fe-siken.com/kakomon/24_aki/q22.html)
- [R5A23](https://www.fe-siken.com/kakomon/30_haru/q23.html)
納期調整の時に気をつけた方がよい検収処理について

こんにちは、Kaneyasuです。
今回は、スケジュールの延期交渉をする場合に気をつけた方がよい「検収処理」についてお話しします。

# 検収処理とは

検収処理とは、発注者（クライアント）側が、納品された商品やサービスが契約や仕様書に基づいているかを確認し、受け入れるかどうかを判断する一連のプロセスを指すビジネス用語です。
単に検収と言うこともあります。

主にビジネスやプロジェクトにおいて、発注した成果物やサービスが適切に提供され、品質や数量が期待に合致しているかどうかを検証する重要な手続きです。

一般的に、検収処理の完了をもって、発注者は契約に基づいて支払いを行います。
IT業界でよく見られる請負契約型のシステム開発においては、受け入れテストがOKとなった時点で検収処理が完了し、支払いが行われることが一般的です。

逆に、検収処理が完了しない限り、支払いが行われないということもあります。

# 検収処理が完了しないと開発にかかったコストが回収できない

システム開発では、日々の作業にかかるコストが発生します。
このコストは、検収処理が完了して支払いが行われることで回収されるため、それまでは資金を調達して支払いを行う必要があります。
資金の調達方法は会社によって異なり、蓄えていた資金を使う会社もあれば、銀行から借り入れる会社もあります。
いずれにせよ、将来の収益を前借りして支払いを行うことになるのです。

個人で例えるなら、クレジットカードを使って買い物をするようなものです。
したがって、検収処理が予定通り進まず支払いが遅れると、資金繰りに影響が出る可能性があります。

# 納期の交渉と検収処理

システム開発でスケジュール遅延が発生した場合、QCD（品質、コスト、納期）のどれかを調整して対応することが一般的です。
納期を調整する場合、私の経験では「本当に使い始めるのはいつか？」「すぐに必要な機能とそうでないものはどれか？」といった観点でスケジュールを組み替えます。

ここで注意すべきは、一般的に検収処理はすべての機能が揃っていることが前提だということです。
納期の調整をするということは、多くの場合、検収処理の時期も遅れることを意味します。
これを念頭に置かないと、クライアントとの納期調整ができても、社内でその検収処理の遅れ（＝コスト回収の遅延）が許容されないことがあります。

筆者も一度、これを軽視してしまい、とんでもなく叱られたことがあります。
（その節は大変申し訳ありませんでした。。。）

みなさんは私と同じ過ちを繰り返さないよう、常に頭の片隅で検収処理のことを考えながら日々のプロジェクトを進めてくださいね。
対話型生成AIでコスパ良く　次世代エンジニアのプロンプトのコツ

# 業務への活用
 今年あたりから、対話型生成AIの信ぴょう性の高まりに伴いコーディングや資料作成の業務に活用した知見のメモ。
# 様々な対話型生成AI
昨年2023年のChat GPTを筆頭に今日では各社が様々な対話型生成AIを提供しており、
ほとんどは一定の範囲内であれば無料で利用可能。

#### Chat GPT（Open AI）
 対話型生成AIの火付け役。OpenAIとMicrosotとの提携により今後どうなるか疑問。
#### Microsoft Copilot（Microsoft）
 昨年から、Windowsユーザを対象にタスクバーから簡単にアクセスできるようになり、基本無料無制限。ただ、ややレスポンスが遅い。
#### Github Copilot（Microsoft）
 自動で複数ファイルをもとに、コーディング予測・解説をしてくれるそうなので、他サービスでは必要だったコードのコピペが不要に。基本有料。
#### Gemini（Google）
 今後、あらゆるGoogleサービスに組み込まれる予定。
#### perplexity（Perplexity AI, Inc.）
 通常はxx年まで、と決まった期間を学習モデルにするのに対して、こちらは最新の情報を反映するよう重視されている。Google検索時に上部へ出てくるSearch Labsに似ている。
#### Claude（Anthropic社）
 元OpenAI社員が独立し作っていることもあり、引き続き期待大。
#### Meta Llama（Meta社）
 OSSの大規模言語モデル。日本語には特化していないが、今後の発展に期待。

個人的にはClaudeをよく利用。
ClaudeはChatGPTのIQを超えているそう。

# 基本編
いずれのサービスも欲しい情報を正確に得るためのプロンプト構成力が必要。
基本は以下の３点。

### 前提条件を明確に
使用している<font color="Red">言語</font>や<font color="Red">バージョン</font>、<font color="Red">フレームワーク</font>など。
バージョンによっては、書き方が大きく異なっている場合もあるため事前に宣言することが重要。

### 順序
プロンプトは<font color="Red">冒頭を重視して読み込む傾向がある</font>ため、冒頭に依頼内容を置き、そのあとにコードといった参考内容を書くことが重要。
> 以下のTypescriptのコードにコメントを付与して

等。
### エラー文はコピペ
まれに、回答に基づいてコーディングをしてもバージョン違いなどでエラーを吐くことがある。
その場合は、エラー文で再度質問すると、謝罪とともに回答を訂正してくれる。


# 応用編
### 添付資料に使う図の出力
Mermaid形式で図を出力してもらう。
> Linux上にNext.jsをデプロイする場合の構成図をMermaidで作成して

出力された以下文字羅列を　https://www.mermaidchart.com/ にてコピペすることで、資料に張り付けるための構成図や遷移図を簡単に作成することが可能。

```
graph TD
    A[クライアント] -->|HTTPリクエスト| B[Nginx リバースプロキシ]
    B -->|プロキシパス| C[Node.js サーバー]
    C -->|実行| D[Next.jsアプリケーション]
    D -->|ビルド| E[静的ファイル]
    D -->|サーバーサイドレンダリング| F[動的コンテンツ]
    C -->|接続| G[(データベース)]
    H[PM2 プロセスマネージャ] -->|管理| C
    I[Linux OS] -->|ホスト| B
    I -->|ホスト| C
    I -->|ホスト| G
    I -->|ホスト| H
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3906735/b7ab0fc7-48ea-4aa1-ccf6-77c2e749b561.png" width=100%>

### 小芝居
「～になりきって」というペルソナパターンの複数人版。
> 対話型生成AIの問題点について２人を仮定して議論して

すると、Aさん・Bさんという架空の人物を想定して、勝手に議論を進めてくれるため、
新たな問題提起や、それぞれの立場に応じた問題提起、複数人でのプレゼン時の参考となる。

### 逆質問
反転インタラクションパターンという。
> Linux上にNext.jsをデプロイするために必要な情報を質問して、十分な情報が得られたら回答を作成してください。

すると、カスタマイズ可能な項目を逆質問してくれるので、検討材料になったり、正確なシステム構成を行うことができる。

> １．使用するLinuxディストリビューション: どのLinuxディストリビューションを使用していますか？（例：Ubuntu、CentOS、Debianなど）
> ２．サーバー環境: デプロイ先のサーバーはどのような環境ですか？（例：VPS、クラウドサーバー、オンプレミスサーバーなど）
> ３．Node.jsのバージョン: 使用するNode.jsのバージョンは何ですか？
> ４．データベース: Next.jsアプリケーションで使用するデータベースはありますか？（例：MySQL、PostgreSQL、MongoDBなど）
> ５．デプロイ方法: どのようなデプロイ方法を考えていますか？（例：手動デプロイ、CI/CDパイプライン、Dockerなど）


# まとめ
ここ１年で、業務で使っていた・使えそうだと感じたものは以上の通り。
ここで紹介していない、ファクトチェック関連で様々プロンプトパターンがあるが、今後の精度向上に伴い不要となるのではないだろうか？
リファクタリングについては、洗練されたコードを投げた場合、１か所でしか使わないにもかかわらず、いささか細かく関数化しすぎな印象があるためあまりおすすめしない。


# 参考文献
書籍「生成AI時代の新プログラミング実践ガイド」
【備忘録】自分が緑コーダーになるためのアルゴリズム復習

# はじめに
今週から半年ぶりにAtCoderに参加していこうと思う。
それにあたり、茶コーダーの自分が緑コーダーになるために身につけるべきアルゴリズムについてまとめる。
復習のために、すでに覚えているものも書いていく。

本当に自分用でただのメモなので、読者様のお役に立たないとは思いますが、ぜひ最後までお付き合いください :bow: 

## 1. 全探索
順番に全部探索していくヤーツ。
工夫した全探索もあるから下に書いてく↓

### bit全探索
変数が取りうる値が2つしかないときに使える全探索。
過去に自分が記事を書いていたので省略
[【bit全探索】誰でも理解できるアルゴリズム解説](https://qiita.com/mm-saito-1204/items/3feabbed2ba7bc9d06bd)

### 順列全探索
順列を全列挙して探索する。
でも全列挙するとTLEになることがある。
並び方が決まっていて、その前後などを出せば解決することが多いイメージ。
C++のnext_permutation使えば一発。

## 2. 累積和・しゃくとり法
区間系の問題に使える。
左から順に、そこまでの合計を記録した配列を用意するヤーツ。
累積和の配列で、条件を満たすなら区間を広げ、満たさないなら区間を狭めるみたいな使い方できる。

## 3. 高速素数判定
めっちゃ出るイメージ
「xが合成数ならば、√x以下の約数を持つ」という性質を使う
昔はこれ知ってるだけでたまに茶問題解けたな。
参考：[最速の素数判定プログラム C# Java C++](https://qiita.com/asksaito/items/76b71602dd956b79dbf7#%E6%9C%80%E9%80%9F%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%AE%E8%AA%AC%E6%98%8E)

## 4. 座標圧縮
全然使わないけど、知ってたら即答できる系アルゴリズム
二次元配列で、何もない場所、みたいなのが存在する時に使える。
これも昔記事を書いていたので省略
[【座標圧縮】誰でも理解できるアルゴリズム解説](https://qiita.com/mm-saito-1204/items/7ee43bc83c9bc766535b)

## 5. ダイクストラ法
有向グラフの最短距離に使う。
都度その場所に行くまでの最短コストを記録して探索していく。
このアルゴリズム使う問題に本番で出会ったことがない！出現頻度は低そう。

## 6. Union-Find木
木だからトップからダウンまで高速で探索できる。
グループ機能付きキーバリュー構造みたいな感じ？
UnionFindのクラスと関数作っておくだけで、これ使うってわかれば解ける。
↑問題によっては一工夫しないと解けないっぽい(全部のアルゴリズムそうかも)

## 7. DSF・BFS
深さ優先探索と幅優先探索ですね。
グラフで何かを探索したり、最短経路を求めたりで使いますね。
深い位置に答えがある時は深さ、浅い箇所に答えがある時は幅を利用するイメージ
再帰とキュー理解してればどっちも実装できる。

## 8. DP
動的計画法。これだけが理解できない。
フロッグ問題とかナップサック問題が有名で、それは理解できるしコードも書けるんだけど、他に全く応用できない。
誰か教えて欲しい...

説明見てみると、１つの問題を複数問題に分割して考えるみたいなことあるけど、なんとなくしか理解できない。

ここがいちばんの課題な気がします...
勉強してできるようになったらここ編集します！！！

## Ex. 数学的知識
アルゴリズムとか知らなくても、数学の知識があれば解ける問題って多いですよね。
私は数I・Aで終わった人間なので数学系がでたら詰みます。
ここも課題ですね。

# 終わりに
この記事書いて気づいたけど、ネットで調べて出てくる緑に必要なアルゴリズム、DP以外は全部理解してる気がする。
DPと数学知識が課題かな。。。

死ぬ気で頑張って今年中に緑目指します！！！
![スクリーンショット 2024-10-11 17.15.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705701/f72aa2a0-4397-39ce-90bb-b308d2ad014c.png)


# 参考文献
- [Qiita - 最速の素数判定プログラム C# Java C++](https://qiita.com/asksaito/items/76b71602dd956b79dbf7#%E6%9C%80%E9%80%9F%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%AE%E8%AA%AC%E6%98%8E)
- [Qiita - AtCoder緑になるまでに勉強した基本的なアルゴリズムやデータ構造まとめ](https://qiita.com/Takayoshi_Makabe/items/65f20edbd970070419f4#%E3%83%80%E3%82%A4%E3%82%AF%E3%82%B9%E3%83%88%E3%83%A9)
- [アルゴ式 - Union-Find とは](https://algo-method.com/descriptions/132)
[tips][shell] 特定ファイル名のファイル数をカウントするコマンドメモ

# `*.cpp`ファイルを数える

```shell
% find ./ -name "*.cpp" | wc -l
```

## 特定ディレクトリ

さらに、次のような構成で、root直下にいるとき、hogeディレクトリで絞り込みたいとき。

root/
　├ bin/
　├ etc/
　├ usr/
　│　└ local/
　│　　　└ bin/
　└ lib/hoge/foo.cpp
　└ lib/hoge/bar.cpp
　└ lib/hoge/baz.cpp
  

grep
```shell
% find ./ -name "*.cpp" | grep hoge | wc -l
```

output
```
3
```
ブラウザバックで広告を表示させるスクリプト

ブラウザバック時に全画面でマスクページを表示させるスクリプト
表示させたい場所にスクリプトを読み込む

使用例：
WordPressに組み込むならheader.phpあたりをカスタマイズして
WEBページの<head>でスクリプトを読み込むようにすれば実装可能

```HTML
<script src="script.js"></script>
```

※ファイル名、ファイルパスは自分の環境に合わせて

### 使用例：index.php
```HTML
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ブラウザバックで全画面広告表示</title>
    <link rel="stylesheet" href="styles.css">
    <script src="script.js"></script>
</head>
```
### script.js
```JS
window.onload = function () {
    history.pushState(null, null, window.location.href);
};

window.onpopstate = function () {
    document.getElementById('fullscreen-ad').style.display = 'block';
    history.pushState(null, null, window.location.href);
};

function closeAd() {
    document.getElementById('fullscreen-ad').style.display = 'none';
}
```
### CSSサンプル
```css
#fullscreen-ad {
    display: none;
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-color: rgba(0, 0, 0, 0.8);
    z-index: 1000;
    color: white;
    text-align: center;
    padding-top: 20%;
    font-size: 2em;
}

#close-ad {
    cursor: pointer;
    background-color: white;
    color: black;
    padding: 10px;
    border-radius: 5px;
    margin-top: 20px;
    font-size: 0.8em;
}
```
### スクリーンショット
上記のサンプルソースでこのような表示になります。
![5ca66f2cef169a3ebd82e9eb032c98ed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520459/d89fe500-eeed-ddaa-906a-bfa15399e814.png)

### 注意点
このソースだと全ての「戻る」で全面広告が表示されるため、自サイト以外で条件分岐しないと回遊率が悪くなると思います。
XnConvert を使用しての画像サイズの変更

ffmpegでスライドショーにするとき画像のサイズが奇数だとエラーがおきるときがあります。再現性未チェック。偶数サイズに一括返還するためのスクリプトです

コマンド モードで XnConvert を使用して画像のサイズを変更できます。XnConvert は強力なバッチ画像コンバーターおよびサイズ変更ツールです。以下は、バッチ スクリプトを使用して XnConvert で奇数次元の画像を偶数次元にサイズ変更する方法の例です。

まず、XnConvert がインストールされており、コマンド ラインからアクセスできることを確認します。

XnConvert を使用して画像のサイズを変更する PowerShell スクリプトは次のとおりです。

```powershell
# 画像のリストを取得
$imageFiles = Get-ChildItem -Filter *.jpg

# XnConvertのパスを指定
$xnconvertPath = "C:\Path\To\XnConvert\xnconvert.exe"

# 画像のリサイズ
foreach ($image in $imageFiles) {
    # 画像のサイズを取得
    $size = ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=p=0:s=x $image.FullName
    $width, $height = $size -split "x"

    # 幅と高さが奇数の場合は偶数にリサイズ
    if ($width % 2 -ne 0) { $width++ }
    if ($height % 2 -ne 0) { $height++ }

    # XnConvertコマンドを実行して画像をリサイズ
    & $xnconvertPath -in "$($image.FullName)" -out "$($image.FullName)" -resize $width $height
}

Write-Output "All images have been checked and resized if necessary."
```

このスクリプトは、ディレクトリ内のすべてのJPEG画像ファイルをチェックし、幅または高さが奇数の場合は偶数にリサイズして上書きします。`$xnconvertPath`をXnConvertの実際のパスに置き換えてください。
ドキュメントベースアプリのValidate時に遭遇したエラー

# Validate時に出たエラー
![スクリーンショット 2024-10-11 15.22.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202602/0acaa838-2d58-fa4e-941d-88d79de1bc39.png)
内容を見ると、アプリで扱うドキュメントに関するエラーのようです。

ドキュメントに関する設定はこんなふうにしていました。
![スクリーンショット 2024-10-11 16.40.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202602/27b2bc9c-06e1-53fa-8bfb-112daab6e6fb.png)
最初から用意されているTypeはほったらかし。
扱いたいのはCSVファイルなので、それを追加しました。

まずは、TypeにNameがないというエラーがあるので、それを追加してみます。
エラーが一つ減りました。
![スクリーンショット 2024-10-11 16.46.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202602/eeee4e7d-fc6d-c61f-6a2b-9c124bccc730.png)
![スクリーンショット 2024-10-11 16.46.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202602/a06703c6-6aba-ebb4-71c4-9df0776419b6.png)
次は、メッセージ内に`example.plain-text`があり、これはデフォルトで用意されたドキュメントに記載されてますね。
そのほかにも`com.example`があったりするので、その辺を修正していきます。
![スクリーンショット 2024-10-11 16.55.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202602/8da26587-853e-c6d1-6f40-f0bfe7c08c72.png)

こちらのサイトが役に立ちました。
[[AppStore][Xcode] AppStore へのアップロード時に出るエラーの解決方法](https://software.small-desk.com/development/2023/07/04/appstore-error-howtosolve/)
RailsのコントローラーとDB作成

# railsでコントローラーを作るには
```
rails generate controller コントローラー名 アクション名1 アクション名2 ...
```
とする。
コントローラー名は必ずしも複数形でなくても動作しますが、慣習的に複数形にします。
アクション名は、実際に作成されるビュー（ファイル）の名前に対応します。
例
```
rails generate controller users index
```
これでUsersControllerが作成され、indexアクションとshowアクションが追加されます。
app/views/users/index.html.erb と app/views/users/show.html.erb が生成されます。

# railsでDBを作成するには
```
rails generate model モデル カラム名:データ型
```
モデル名は単数形で、先頭を大文字にします。
データ型としては、string, integer, text, boolean などが使われます。
# データ型の選び方
string は短いテキスト（255文字以内）に使います。
integer は数値（整数）を扱うときに使用します。
text は長い文章や大規模なテキストデータを格納する場合に使用します。
boolean は論理値（trueかfalse）を使いたい場合に選びます。


例
```
rails generate model User name:string email:string
```
これでUserモデルと、それに対応するusersテーブルが生成され、nameとemailカラムが追加されます。

その後、データベースに変更を反映させるには以下のコマンドを使います：

```
rails db:migrate
```

# 既存のテーブルにカラムだけを追加するには
マイグレーションファイルの名前はなんでもいいが、変更がわかるような名前が望ましい
```
rails generate migration add_user_id_to_posts
```
その後、生成されたマイグレーションファイルを開いて、add_columnを使用して次のようにカラムを追加します。
```
add_column :テーブル名(複数系小文字),:追加したいカラム名,:データ型
```

例:
```
add_column :posts,:user_id,:integer
```
のように変更する
最後に、データベースの変更を適用するために再び以下のコマンドを実行します:

```
rails db:migrate
```
JuliaのGlobal Fitパッケージの紹介

さあ、始めましょう！これはJulia言語でのグローバルフィットの例です。指定されたパラメータ $x_0 = 1.8$ と $\gamma = 0.002$、およびドメイン $ \text{dom} = \text{Domain}(1.77:0.0005:1.81) $ を使用します。

### ステップバイステップの例

1. **GModelFit.jlのインストール

   ```julia
   using Pkg
   Pkg.add("GModelFit")
   ```

2. **共有するパラメータを指定しつつモデルを規定する**:

   ```julia
   using GModelFit

   # Define the domain
   dom = Domain(1.77:0.0005:1.81)

   # Define a shared parameter for the width
   shared_gamma = Parameter(:gamma, 0.002)

   # Define the model for the real part with shared gamma
   model_real = Model(dom, :real => GModelFit.Lorentzian(1.8, shared_gamma))

   # Define the model for the imaginary part with shared gamma
   model_imag = Model(dom, :imag => GModelFit.Lorentzian(1.8, shared_gamma))

   # Combine both models
   combined_model = Model(dom, :main => SumReducer(:real, :imag))
   ```

3. **データを生成する**

   ```julia
   # Example data (replace with your actual data)
   x = 1.77:0.0005:1.81
   real_data = 1 ./ ((x .- 1.8).^2 .+ 0.002^2) .+ 0.1 .* randn(length(x))
   imag_data = 1 ./ ((x .- 1.8).^2 .+ 0.002^2) .+ 0.1 .* randn(length(x))

   # Create Measures
   data_real = Measures(dom, real_data, 0.1 .* ones(length(x)))
   data_imag = Measures(dom, imag_data, 0.1 .* ones(length(x)))

   # Combine data
   combined_data = vcat(data_real, data_imag)
   ```

4. **モデルフィット**:
   ```julia
   best, res = fit(combined_model, combined_data)
   ```

5. **結果のプロット**:
   ```julia
   using Plots

   plot(x, real_data, label="Real Data", lw=2)
   plot!(x, imag_data, label="Imaginary Data", lw=2)
   plot!(x, best[:real], label="Fitted Real", lw=2, linestyle=:dash)
   plot!(x, best[:imag], label="Fitted Imaginary", lw=2, linestyle=:dash)
   ```

### 説明しよう！
- **モデル定義**: 実部と虚部の両方に共通のパラメータを持つローレンツモデルを定義する。 \(\gamma\).
- **データ生成**: 実数部と虚数部の両方に合成データを生成しますが、ノイズも追加します。
- **回帰分析**: 結合モデルを結合データに適合させます。
- **プロット**: 実数データと虚数データをフィッティング結果とともに視覚化します。

### 可視化

フィッティング結果の視覚化は次のとおりです。Jupyterに上のコードを貼り付けて実行してみてください
Jupyterノートブックのメニューから古い Julia を削除するにはどうすればいいですか?

Jupyter Notebook メニューから古い Julia カーネルを削除するには、次の手順に従います。

1. **インストールされているカーネルをすべて一覧表示する**:
   ターミナルを開いて次のコマンドを実行すると、インストールされているすべてのJupyterカーネルのリストが表示されます。
   
   ```bash
   jupyter kernelspec list
   ```

2. **削除したいカーネルを特定する**:
   リストから削除したいJuliaカーネルの名前を探します。次のような名前です。 `julia-1.x`.

3. **不要なカーネルをアンインストールする**:
   特定のカーネルをアンインストールするには、次のコマンドを実行します:

   ```bash
   jupyter kernelspec uninstall unwanted-kernel
   ```
   `unwanted-kernel` を、削除したいカーネルの実際の名前に置き換えます。 (e.g., `julia-1.x`).

これにより、Jupyter Notebookメニューから古いJuliaカーネルが削除されます。
WebPとは？簡単に解説！


## WebPって何？
**WebP**は、Googleが開発した画像フォーマットです。
従来のJPEGやPNGよりも**ファイルサイズが小さい**のが特徴で、Webページの読み込みを速くするためによく使われます。

## WebPのポイント

1. **画像が軽くなる**  
   WebPを使うと、画像の**ファイルサイズを小さく**できます。これにより、Webサイトが速く表示され、モバイルデータの節約にもなります。

2. **透明な画像もOK**  
   WebPは、PNGのように**透過**画像にも対応しています。透明なロゴやアイコンも使いやすいです。


3. **アニメーションもできる**  
   GIFのような動く画像（アニメーション）もWebPで作れますが、WebPのほうが**ファイルサイズが小さい**ので、Webサイトの表示がさらに速くなります。

## WebPの使い方

### 1. どのブラウザで使えるの？
以下のブラウザでWebPが使えます：

- Google Chrome（バージョン17以降）
- Firefox（バージョン65以降）
- Safari（バージョン14以降）
- Edge（バージョン18以降）

### 2. WebPへの変換方法
WebPに変換するには、以下の方法が便利です：

- **オンラインツール**: [Squoosh](https://squoosh.app/)などを使うと、簡単にWebPに変換できます。
![スクリーンショット 2024-10-11 16.08.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884985/74ce8b5f-6dfa-f764-b344-e0a6e7787f57.png)

## WebPの注意点

### 1. 古いブラウザでは見られないかも
WebPは、古いブラウザでは表示できません。
そのため、JPEGやPNGを**フォールバック**として用意しておくことが大切です。

#### ※フォールバックとは？
   フォールバックとは、ブラウザが特定のフォーマットに対応していない場合に、別のフォーマットを表示する仕組みです。
   例えば、WebPに対応していないブラウザでは、JPEGやPNGを用意することで、画像が正しく表示されます。

   #### フォールバックの実装例：

   ```html
   <picture>
     <source srcset="photo.avif" type="image/avif" />
     <source srcset="photo.webp" type="image/webp" />
     <img src="photo.jpg" alt="photo" />
   </picture>
   ```


---

## 他の画像フォーマットとの比較も参考までに📝

| 形式       | 特徴                              | ファイルサイズ    | 透明性対応 | アニメーション対応 |
|------------|-----------------------------------|-------------------|------------|--------------------|
| **WebP**   | 高圧縮率、画質維持                | 最小               | 対応         | 対応                 |
| **JPEG**   | 写真向け、非可逆圧縮               | 中程度             | 非対応      | 非対応               |
| **PNG**    | 透過画像対応、可逆圧縮             | 大きい              | 対応         | 非対応               |
| **GIF**    | アニメーション画像向け              | 大きい              | 対応         | 対応                 |



## まとめ

WebPは、**小さなファイルサイズ**で**高画質**の画像を表示できる便利なフォーマットです。
Webサイトの表示速度を速くし、モバイルデータの節約にも役立ちます。
互換性のために、JPEGやPNGも併用することを忘れずに！


## 参考資料

- [SEDesignの記事: WebPと他の画像形式の違いとは？変換方法やメリットを解説](https://www.sedesign.co.jp/marketing-blog/what-is-the-difference-between-webp-and-others)
- [Google Developers: WebP](https://developers.google.com/speed/webp?hl=ja)
- [MDN Web Docs: `<picture>`要素](https://developer.mozilla.org/ja/docs/Web/HTML/Element/picture)
[SQL] [DML] 副問合せ

# 一覧
|SQL文|詳細|
|:--|:--|
|EXISTS|副問合せからの導出値があれば真、なければ偽を返す（結果の有無のみ）|
||`SELECT * FROM A WHERE EXISTS()`|
|NOT EXITS|副問合せからの導出値がなければ真、なければ偽を返す（結果の有無のみ）|
||`SELECT * FROM A WHERE NOT NOT EXISTS()`|

# 参考リンク
- [R5A29_NOT EXISTS](https://www.db-siken.com/kakomon/22_haru/am2_14.html)
Javaのバージョンごとの違いとは？バージョン番号の意味は？

<br>

# ■ はじめに

この記事では、Javaのバージョンについて簡単に解説していきます。<br>
Javaには1.0や5、11といったように様々なバージョンがあり、バージョンが上がるごとに新機能の追加や改善が行われています。<br>
開発においてどのバージョンを使うべきか、またバージョンのアップデートを行うメリットやデメリットについても紹介していきます。

# ■ 目次
<br>

1. [Javaのバージョンとは？](#1-javaのバージョンとは)
2. [主なバージョンの違い](#2-主なバージョンの違い)
3. [バージョン番号の変遷について](#3-バージョン番号の変遷について)
4. [古いバージョンを使い続けるリスク](#4-古いバージョンを使い続けるリスク)
5. [最新バージョンへのアップデートのメリット](#5-最新バージョンへのアップデートのメリット)
6. [まとめ](#6-まとめ)

# 1. Javaのバージョンとは？
<br>

初めてJavaがリリースされたのは1995年。
以来、多くのバージョンがリリースされてきました。
新しいバージョンには新機能や最適化が含まれており、効率的かつ安全にコーディングできるよう進化しています。
<br>

**主要なバージョンの流れ**
|バージョン|更新年|大まかな更新内容|
|:---|:---|:---|
|Java 1.0|1995年|初期バージョン|
|Java 5|2004年|ジェネリクス[^1]やアノテーション[^2]の導入|
|Java 8|2014年|ラムダ式やStream APIなどの大規模な機能追加|
|Java 11|2018年|LTS[^3]バージョン いくつかのAPIの改善と新機能追加|
|Java 17|2021年|より効率的なパフォーマンスとセキュリティ強化|
|Java 21|2023年|最新のLTSバージョン|

# 2. 主なバージョンの違い
<br>

ここでは、上記の表から代表的なバージョンの違いを見ていきます。

### Java 8
- ラムダ式、Stream API の導入により、コードが短くなり、機能的プログラミングが容易に
- `Optional` クラスが導入され、`null` チェックがより簡単に

### Java 11
- LTS（Long-Term Support）バージョンで、企業向けプロジェクトでよく採用される
- `var` を使った型推論の導入により、コードがシンプルに
- Java EE の一部機能が削除

### Java 17
- レコードクラスやシールクラスの導入により、コードの可読性と安全性が向上
- ゼロコストのエスケープ解析により、メモリ管理が最適化
- さらにセキュリティ面の強化

### Java 21
最新バージョンのため詳細は後日別記事にてまとめます。

# 3. バージョン番号の変遷について
<br>
元々Javaのバージョンの表記はJava 1.0や1.1、1.2など、初期のリリースは「1.x」としてリリースされていました。
しかしJava 1.5以降、「`Java 5`」としてリリースされ、急にバージョン番号が飛んだように見えます。

これはバージョン番号を単純化し、開発者やユーザーにとってはバージョンを「1.5」などの形式で表記するより
よりシンプルな「`Java 5`」の方が理解しやすいと考えられたからのようです。

また大きなバージョン番号にすることで、他の言語や技術と比較した際に進化が感じられるようにしたというのも
表記を変更した理由の1つになっているようです。

そのためJava 1.5以降、内部的には「1.5.x」のような、より細かいバージョン番号が保持されているようですが、
外部向けには「`Java 5`」などが使われるようになり、今の「`Java 17`」のような表記となっているのです。


# 4. 古いバージョンを使い続けるリスク
<br>

Javaの古いバージョンを使い続けることは、いくつかのリスクが存在します。

- **セキュリティの問題**
    - 古いバージョンでは、既知の脆弱性が修正されないため、攻撃に対して脆弱になる
    <br>
    
- **新しいライブラリの非対応**
    - 新しいバージョンで追加されたAPIやライブラリが使えないため、開発の効率が低下する
    <br>
    
- **サポート切れ**
    - LTSでないバージョンはサポート期間が短いため、定期的なアップデートが必須になる
    <br>

上記のようなリスクはありますが膨大なシステムの場合にはバージョンアップにも多大な費用が必要になるため、
止むおえず古いバージョンのまま運用するといったことも珍しくはありません。

# 5. 最新バージョンへのアップデートのメリット
<br>
Javaの最新バージョンにアップデートすることで、以下のようなメリットが得られます。

- **パフォーマンスの向上**
    - 最新バージョンでガベージコレクタの最適化や新しいメモリ管理手法が導入され、処理速度が向上
    <br>
    
- **新機能の利用**
    - 新しいバージョンでより効率的なコーディングが可能になる機能やAPIが追加される
    <br>
    
- **セキュリティ強化**
    - 最新バージョンは常に最新のセキュリティパッチが適用されるため、セキュリティリスクを軽減可能

# 6. まとめ
<br>

- Javaは定期的に新しいバージョンがリリースされており、各バージョンで新機能や改善が行われている
  - Java 8ではラムダ式やStream API
  - Java 11ではLTSサポートや型推論、Java 17ではレコードクラスの導入など
<br>

- バージョン番号が1.xから連番にならなかった理由は、ユーザーフレンドリーな表記にするため
  - Java 1.5は「Java 5」として、以降のバージョンも同様に「Java 6」「Java 7」などの表記になった
<br>

- 古いバージョンを使い続けると、セキュリティリスクや新しいライブラリの非対応などの問題が発生する。
<br>

- 最新バージョンにアップデートすることでパフォーマンスやセキュリティが向上し、新機能が利用できる。
  - ただし、アップデート時には既存のコードなどとの互換性の確認が必要。

[^1]:Listの宣言時に`<` と `>`で囲むことで型を指定できる機能
[^2]:コンパイラの警告メッセージを出なくさせたり、プログラムを実行する環境に合わせて動作を変える` @ ` の注釈のこと
[^3]: long-term support の略で、長期のサポートを意味する
サロゲートペアでWindows10でサポートしない絵文字を表示する

## はじめに

普段はMac環境で開発をしているため、Windows環境について考えることがあまりない。しかし最近、Windows 10で特定の絵文字が正しく表示されない問題があることに気づいた。
色々調べて、ユニコードに「サロゲートペア」という概念があり、このサロゲートペアを用いることで問題を解決できたため、記事として残してみた。

## サロゲートペアとは

サロゲートペア(Surrogate Pair)は、直訳するとSurrogate(代理)のペアである。

### 何が代理？

これはUTF-16エンコーディングで使用される概念で、1つの文字を表現するために2つの16ビットコードユニットを使用する方法である。

例えば以下の地球の絵文字は一文字に見えるが、実際は長さ2の文字になっている。

```js
const emoji = "🌍";
console.log(emoji.length); // 出力: 2
```

### なぜ必要？

Unicodeは世界中のすべての文字を表現するために作られたけど、当初は16ビット（65,536文字）で十分だと考えられていた。

しかし、絵文字のような新しい文字が追加されるにつれて16ビットでは数が足りなくなって、サロゲートペアが導入されたことになる。

## JavaScriptでのサロゲートペア

JavaScriptでは文字列をUTF-16でエンコードする。

例えば以下のような使い方ができる。

```javascript
// サロゲートペアかどうかを確認する関数
function isSurrogatePair(str, index) {
  const firstCode = str.charCodeAt(index);
  if (firstCode > 0xD7FF && firstCode < 0xDC00) {
    const secondCode = str.charCodeAt(index + 1);
    return secondCode > 0xDBFF && secondCode < 0xE000;
  }
  return false;
}

// サロゲートペアかどうかを確認する関数
//（Intl.Segmenterを使用を利用するとマジックナンバーを使わずに実装できる）
const isSurrogatePairIntl = str => [...new Intl.Segmenter('ja', {granularity: 'grapheme'}).segment(str)].length !== str.length;

// コードポイントをサロゲートペアに変換
function toSurrogatePair(codePoint) {
  codePoint -= 0x10000;
  const highSurrogate = (codePoint >> 10) | 0xD800;
  const lowSurrogate = (codePoint & 0x3FF) | 0xDC00;
  return String.fromCharCode(highSurrogate, lowSurrogate);
}

```

## Windows 10での問題

Windows 10でサポートされていない絵文字を表示しようとすると、「□」（tofuと呼ばれる）（かわいい）のような四角い文字が出力される。かわいいけど、絵文字の代わりに出されると文字化けになるため、せめて絵文字を見せていきたい。

### 代替文字出力のコード

ということでサロゲートペアを利用して、Unicodeを対応している場合はそのまま表示し、対応しない場合は代替の文字を表示するロジックを組んでみた。

```javascript
// 絵文字がサポートされているか確認
function isEmojiSupported(emoji) {
  const canvas = document.createElement('canvas');
  const ctx = canvas.getContext('2d');
  ctx.font = '1px sans-serif';
  
  const emojiWidth = ctx.measureText(emoji).width;
  const fallbackWidth = ctx.measureText('□').width;
  
  return emojiWidth !== fallbackWidth;
}

// 絵文字の代替マッピング（コードポイントを使用）
const emojiReplacements = {
  0x1FAE5: 0x1F636, // 🫥 (点線の顔) -> 😶 (無表情の顔)
  0x1FAE0: 0x1F643, // 🫠 (溶ける顔) -> 🙃 (逆さまの顔)
};

// 絵文字の表示
function renderEmoji(str) {
  let result = '';
  for (let i = 0; i < str.length; i++) {
    if (isSurrogatePair(str, i)) {
      let codePoint = str.codePointAt(i);
      let emoji = String.fromCodePoint(codePoint);
      if (!isEmojiSupported(emoji) && emojiReplacements[codePoint]) {
        result += toSurrogatePair(emojiReplacements[codePoint]);
      } else {
        result += emoji;
      }
      i++; // サロゲートペアの2番目の部分をスキップ
    } else {
      result += str[i];
    }
  }
  return result;
}
```

## おわりに

もうWindows 11が出ているとは言え、WindowsでUnicode12までしか対応しないのはおかしいと思う。
個人アプリだと特に手元にWindowsの実証環境がないので、定期的に対応してほしい。
外壁塗装の見積りをする前に確認しておきたいこと

事前に聞いておきたいこと

・見積もりは無料かどうか？
塗装の見積もりは、無料で行っている業者さんがほとんどですが、有料の場合もないとはいえません。電話などで事前に無料かどうかを確認してから、お願いした方がよいでしょう。

・断れるか？
見積もりをしたらその業者で工事をしないといけないということはありませんが、事前に確認しておいた方がよいでしょう。それと同時に、他の業者でも見積もりをとって比較検討する旨もあわせてお伝えした方がよいと思います。

事前に準備しておいた方がいいもの

・お家の図面
お家の図面があるとより正確な寸法がでますし、図面からわかることも多々あるので、業者さんに見せれるのであればコピーをしておいて渡すとよいと思います。

・家の周囲の簡単なかたずけ
業者さんは、現状の壁などの状況を確認するために、家の四方をぐるっと見て回ります。物などがあれば通れるようにしておいた方がいいと思います。

・メモ
事前に聞きたいことなどをメモしておくとよいでしょう。また業者から参考になる情報もあるかも知れませんので、メモを事前に準備してその時に書き留めれるようにしておかれるといいと思います。

その他の注意事項

・予算は言わない方がいい
業者さんによっては、予算を聞かれるケースがありますが、塗装の場合は予算を聞かれても答えない方がいいと思います。予算はあると思いますが、予算にあわせた無理な塗装を提案されることがあるかもしれません。

・返事の期限は自分にあわせた方がよい
返事の期限を迫られることがあります。返事の期限は自分の検討スケジュールにあったものであれば問題ありませんが、業者さんのキャンペーンの都合や締め切りの都合で返事をくださいといわれるケースがあります。業者の返事の期限にあわせられない場合は、検討したいのでそれまでに返事はできないとはっきりと言って待ってもらうか、業者が待てないようならお断りをした方がいいと思います。キャンペーンといってもセールスの演出の場合が多いです。

南大阪ペイントセンターでは外壁塗装をお考えの方向けに、お役立ちコラムを掲載しています。
ホームページもぜひご覧いただけると幸いです。

大阪で外壁塗装や屋根塗装をお考えなら【公式】南大阪ペイントセンターへ
https://www.my-painter.com/
ターミナルの Mac と Windows の対応

(Mac と Windows の操作の対応についてのメモです)

## ショートカットキー

操作 | ショートカットキー | 〃 (Mac)
-|-|-
ターミナルを起動 | <kbd>@</kbd> w/ <kbd>Ctrl</kbd> | <kbd>T</kbd> w/ <kbd>Ctrl</kbd> + <kbd>Option</kbd>
新しいターミナル | <kbd>@</kbd> w/ <kbd>Ctrl</kbd> + <kbd>Shift</kbd> |
〃 (分割) | <kbd>5</kbd> w/ <kbd>Ctrl</kbd> + <kbd>Shift</kbd> |
入力の先頭に移動 | <kbd>A</kbd> w/ <kbd>Ctrl</kbd> <br> or <br> <kbd>&lt;</kbd> w/ <kbd>Fn</kbd> | <kbd>A</kbd> w/ <kbd>Ctrl</kbd>
後続の入力クリア | (`Allow Chords` 無効で <kbd>K</kbd> w/ <kbd>Ctrl</kbd> [^1]) | <kbd>K</kbd> w/ <kbd>Ctrl</kbd>
画面をクリア | <kbd>L</kbd> w/ <kbd>Ctrl</kbd> | <kbd>K</kbd> w/ <kbd>⌘</kbd>

[^1]: ref: [【Tips】Visual Studio CodeのターミナルでCtrl + kを使いたいときは「Allow Chords」を無効にする](https://note.com/moba_gadgets_x/n/n2d9d43d066a4)

## コマンド

操作 | 入力 | 〃 (Mac)
-|-|-
ディレクトリを開く | `start [path]` [^2] <br> or <br> `explorer.exe [path]` | `open [path]`

[^2]: ref: [Windows Terminal で Mac の open と同等なディレクトリを開くコマンド](https://www.perplexity.ai/search/windows-terminal-te-mac-no-ope-hidH6QWcTPmRljnQ1xa7Gw#0)
Mac aws-cli の設定情報が記載されている場所

## 概要

Mac OSにてaws-cliの`$ aws configure`を実行した時に入力できる内容がどこに記載されているのかをメモ的にまとめておく。

## 記載場所

`~/.aws`の直下に`config`と`credentials`に情報が記載されている。

configにはデフォルトリージョンやデフォルトアウトプットの情報が
credentialsにはアクセスキーやシークレットキーの情報が

記載されている。
Neovimでschema.prismaにシンタックスハイライトをつけるプラグイン

ちょっとした備忘録。

Neovimにてschema.prismaを編集しようとすると色がない・・・
シンタックスハイライトをつけるプラグインを発見。

https://github.com/prisma/vim-prisma


プラグイン追加。
```
return{
  {
    "prisma/vim-prisma"
  }
}
```
Terraform provider につけたエイリアスを外したい、がterraform コマンドでできなかった

# provider のalies
terraform provider にはエイリアスをつけることができる。
リソース記述の中のprovider 変数にエイリアス付きで渡してあげることで、デフォルトのprovider とは別のアクセス情報を使ってリソース作成ができる。
# やりたかったこと
エイリアスをつけたprovider を使って、サービス上にリソースを作っていた。
しかし、アクセス情報を分ける必要がなくなったため、デフォルトのprovider だけで良くなった。
すでにリソースは作ってしまっているので、存在しているリソースに紐づいているエイリアス付きprovider をデフォルトのprovider に置き換えたい。
何かいいコマンドないかな〜〜〜
-> ```terraform state replace-provider``` が使えそう！

https://developer.hashicorp.com/terraform/cli/commands/state/replace-provider
```
terraform state replace-provider <置き換え元のprovider> <置き換え先のprovider>
```

# 問題
早速 ```terraform state replace-provider``` を使った。

```
terraform state replace-provider <provider_A>.alias <provider_A>
```
-> エラーが起こってしまった。(エラーメッセージの控えを紛失しました...すみません。)
どうも、エイリアスの変更には```terraform state replace-provider``` は使えないらしい。残念。

# やったこと
- terraform state ファイルを開き、```[<provider_A>].alias``` として記載されているリソース全てを```[<provider_A>]```に書き換えた
- コード内のprovider の記載についてもalias を削除したデフォルトにした
- リソース記述の```provider = <provider_A>.alias``` の記載を削除した

その後、terraform planを実行するとno change となった。
【最新版】JavaでArrayIndexOutOfBoundsExceptionっていうエラーが出たときの対処法

# はじめに
こんにちは。RaimuProjectのやむぅです。
今回は、Javaのコーディング中に起きたエラー「java.lang.ArrayIndexOutOfBoundsException」の解説や対処法についてお話ししていきます。
どんな不具合なのか、どうやって調査・対処すればいいの？という人向けに書いたものです。ぜひ読んで見ていただけると嬉しいです。


※ ちょこっと紹介！
現役エンジニアの僕が教える、フルスタックエンジニアを目指せるスクールを運営しています。
プログラミング初心者の方やリスキリングを考えている方にぜひ！

https://programing-factory.raimuproject.com/lp

# 開発環境
今回僕のMacを使っています。
そのためショートカットキーを使う際、WindowsのPCを使う人は以下のように変換して記事を見てください。
| Mac | Windows |
|:-----------|------------:|
| ⌘(Cmd)       | Ctrl        |
| ⌥(Option)     | Alt      |
| ⇧(Shift)       | Shift        |

:::note warn
ex)コピーのショートカット:
Mac → ⌘ + c
Windows → Ctrl + c
:::

# エラー発生
Javaのプログラムを実行したらこんなエラーが発生した。
```
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
	at testJava.Main.main(Main.java:8)
```
## エラーの意味
`java.lang.ArrayIndexOutOfBoundsException`は、配列の有効範囲外のインデックスにアクセスしようとしたときに発生する例外です。簡単に言うと「●番目の要素なんてないよ」というエラーです。具体的には、今回のエラーは配列の長さが3なのに`インデックス3(4個目)`にアクセスしようとしたため、このエラーが発生しています。Javaの配列インデックスは0から始まるので、長さ3の配列にアクセス可能なインデックスは`0, 1, 2`です。

## 原因と調べ方
まずこのエラーの原因は、配列の範囲外にアクセスしていることです。今回では、配列の長さが3であるにもかかわらず、インデックス3(存在しない4個目)にアクセスしようとしていることが問題です。

では次に調べ方ですが、まずはエラーメッセージを見ていきましょう。
エラーメッセージの確認:このメッセージでいうと`testJava.Main.main(Main.java:8)`の部分を見て、エラーが発生した箇所の8行目を確認します。
配列の範囲の確認: 8行目のコードを見て、どの配列にアクセスしようとしているのか、その配列の長さとアクセスしているインデックスが適切か確認します。

確認する方法として、一番シンプルかつ初心者向けのやり方としては、配列の長さを出力して確認するといいでしょう。

## 対処法
対処法は状況と場合によっていろいろありますが、配列にアクセスする前に、そのインデックスが有効かを確認します。例えば、このように`if`文を使ってインデックスが範囲内かどうかをチェックできます。
```java
int[] array = {1, 2, 3};

int index = 3;
if (index < array.length) { // ←配列の範囲内(配列の長さ未満なこと)チェック
    System.out.println(array[index]);
} else {
    System.out.println("範囲外ですよ。");
}
```

# 最後に
この記事では、プログラミングをやり始めた初心者から実際にエンジニアとして働いた時の実務のコーディング中に発生したエラーやバグの調査方法から対処法、基礎的な知識をできる限り**さっくり**と**わかりやすく**解説しています。


# その他
現役エンジニアの僕が教える、
* チャット質問で悩み解決
* 週一で1 on 1メンタリング実施あり
* 実務レベルの高難易度課題 & レビューあり
* あなた専用のロードマップを一緒に作成
* 案件や実務のエンジニアのリアルが学べる & 体験できる
* 未経験から4ヶ月で<font color="OrangeRed">フルスタックエンジニア</font>を目指せる

こんな内容が学べる・経験できるプログラミングスクールです。
プログラミング初心者の方やリスキリングを考えている方にぜひ！

https://programing-factory.raimuproject.com/lp
UITableViewのあるセルをデフォルトで選択状態にしたい

## はじめに
UITableViewのあるセルをデフォルトで選択状態にしたい時は、２つの方法がある。
# 方法1
`selectRow(at: , animated: , scrollPosition: )`を使う。

```swift
final class ~~Controller: UIViewController {
    @IBOutlet private weak var controlSpeedTableView: UITableView!
    let indexPath = IndexPath(row: 0, section: 0)
    
    self.controlSpeedTableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
}
```
使い方のイメージはこんな感じ。
シンプルに選択状態をセットするなら、これ使う。

# 方法2
`tableView(_:didSelectRowAt:)`メソッドを呼ぶ。

```swift
extension ~~Controller: UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        // cellを選んだ時の処理
    }
}

final class ~~Controller: UIViewController {
    @IBOutlet private weak var controlSpeedTableView: UITableView!
    
    let indexPath = IndexPath(row: 0, section: 0)
    self.tableView(self.controlSpeedTableView, didSelectRowAt: indexPath)
}
```
使い方のイメージはこんな感じ。
選択時に追加処理があるなら、これ使う。

## 終わりに
delegate設定を忘れずに...
SlackAppの作り方

# これは何？

仕事で「なんらかのプログラムからSlackに通知する」ということを良くやるのですが(ほとんどがI
Incoming Webhooksを利用)、その都度「SlackAppの作成って何するんだっけ？」って思うので、備忘録。

テキストだけの記載ですが、2024/10/11時点ではこの指示通りでわかるはず！

# 1.Slack Appの作成
* Slack API: [Your Apps](https://api.slack.com/apps)にアクセスし、「Create New App」をクリックします
* 「From scratch」を選び、AppName（例: "GAS to Slack Notifier"、”テスト用App”とか）を入力
* ワークスペースを選択し、「Create App」をクリックします

# 2.OAuth & Permissionsの設定
* 「Features」セクションの「OAuth & Permissions」をクリックします
* ページ中ほどの「Scopes」の下にある「Bot Token Scopes」の部分で、「Add an OAuth Scope」をクリックします
* 「chat:write」スコープを追加します。これにより、アプリがチャネルにメッセージを送信する権限が付与されます


# 3.AppHomeの設定
「Features」セクションの「App Home」をクリックします。
「App Display Name」を Editし、「Display Name (Bot Name)」と「Default Name」を設定します
「Add」を押す

# 4.Incoming Webhooksの有効化
* 「Features」セクションで、「Incoming Webhooks」を選択します
* 「Activate Incoming Webhooks」を「On」にします
* ページ下部の「Add New Webhook to Workspace」をクリックします
* メッセージを送信するチャンネルを選び、「許可する」をクリックします
* Webhook URLが生成されるので、これを使ってプログラムからSlackに通知できます
yoomバグじゃないの？


yoomを使ってジョブカンのデータをSalesforceに連携しています。
今回作成するSalesforce側のオブジェクトですが、取引先オブジェクトと主従関係のカスタムオブジェクトとして作成しました。なんと主従関係が表示されません。

もしやと思い、参照関係に変更したら、出てきました。

ついでに所有者Idまで出てきたよ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/29a8484f-49e7-5ddc-54d2-131306870c39.png)

テストした時のログをみたらAPIのバージョンがv52.0だし、正直今一つ信用できません。

v52.0ってSummer 21なんだけど...
七五三とクリスマスは祝日ではない

# 七五三とクリスマスが祝日になった
Googleカレンダーにて七五三とクリスマスが祝日になっていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192137/03b55c6e-fddc-66d5-eace-4ad9fd3e86ab.png)

これはGoogleの仕様変更によるもので、「日本の祝日」カレンダーの設定で「祝日のみ」を選択すれば変わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192137/2e1029f2-517f-2346-a52f-45dff6755069.png)

以下の投稿が参考になりました。ありがとうございます！

https://x.com/tkiyama/status/1830149754657128464

# JSライブラリ「date-holidays」も影響ある
世界の祝日が取得できるdate-holidaysも同様の動きをしており、七五三とクリスマスが祝日になっていました。
## date-holidays
https://github.com/commenthol/date-holidays/tree/master

## 七五三が祝日になっている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192137/970ca6c2-90e8-75ff-34a1-9a19b9445624.png)
[GitHub](https://github.com/commenthol/date-holidays/blob/65b10b7b38585320e111696bf88a4b2461416c88/data/countries/JP.yaml#L317)

# 対策
「type: observance」の祝日を除外すれば対応できます。運用中のシステムでは[isHoliday API](https://github.com/commenthol/date-holidays-parser/blob/master/docs/Holidays.md#holidaysisholidaydate)を利用していますが、戻り値のHolidaysの配列にtypeが入っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192137/11b7c91f-8e70-8cf3-e796-34b9b1e27ac8.png)

## 対策コード
配列からtypeを射影して、observancが入っていなければ祝日ではないとします。
```javascript
    // 祝日判定をする。observance（七五三、クリスマス）は祝日から除外する
    const holidayDetail = jpHolidays.isHoliday(date)
    const isHoliday = holidayDetail
      ? !holidayDetail.map((h) => h.type).includes("observance")
      : false
```

## 結果
平日になりました:cry:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192137/f30dcf8d-8531-e1fc-24d1-89c5101c885e.png)

# まとめ
七五三とクリスマスも祝日であってほしい。
[SQL] [DCL] アクセス権限の付与・削除

# 一覧
|SQL文|詳細|
|:--|:--|
|GRANT|`users`tableの`user1`に特定の権限(`SELECT`、`INSERT`)を付与する|
||`GRANT SELECT, INSERT ON users TO user1;`|
|REVOKE|`users`tableの`user1`から特定の権限(`SELECT`)を削除する|
||`REVOKE INSERT ON users FROM use1;B`|


# 参考リンク
- [R2F26_GRANT](https://www.ap-siken.com/kakomon/26_aki/q25.html)
スマートホームの主要通信規格について

# はじめに

現在自宅を新築しており、IoTエンジニアとしては、暮らしを便利にするためのスマートホームのことが非常に気になっています。
スマートホーム用の機器(デバイス)を検索すると、さまざまな通信規格があるようなので、まずは、スマートホームの代表的な通信規格について整理してみました。

## 1. Wi-Fi

- 特徴：高速、広範囲、既存のネットワークインフラを利用可能
　　　スマートホーム向けに作られた規格ではない
- メリット：高帯域幅、広く普及
- デメリット：比較的高い消費電力、接続デバイス数に制限
- 用途：カメラ、スマートTV、スマートスピーカーなど

## 2. Bluetooth Low Energy (BLE)

- 特徴：低消費電力、短距離通信
　　　スマートホーム向けに作られた規格ではない
- メリット：省電力、スマートフォンとの直接接続が容易
- デメリット：通信範囲が限られる、メッシュネットワーク構築が複雑
- 用途：スマートロック、健康機器、近接センサーなど

## 3. Z-Wave

- 特徴：低消費電力、長距離通信、双方向通信可能
- メリット：壁や障害物を通過しやすい(メッシュ化)、互換性が高い
- デメリット：通信速度が比較的遅い、デバイスの種類が限られる
- 用途：ドアロック、温度調節器、照明制御など

## 4. Zigbee

- 特徴：低消費電力、メッシュネットワーク(ツリー化も可能)
- メリット：低遅延、多数のデバイスを接続可能
- デメリット：Wi-Fiより通信速度が遅い、専用のハブが必要
- 用途：照明制御、温度センサー、モーションセンサーなど

## 5. Thread

- 特徴：IPv6対応、低消費電力、メッシュネットワーク
- メリット：セキュリティが高い、スケーラビリティが良好
- デメリット：比較的新しい技術のため、対応デバイスが限られる
- 用途：照明、センサー、サーモスタットなど

## 6. Matter

- 特徴：複数の通信プロトコルをサポート（Wi-Fi、BLE、Thread、Ethernet）
- メリット：高い相互運用性、主要テック企業のサポート
- デメリット：まだ新しく、普及途上
- 用途：様々なスマートホームデバイス全般

## 比較表

| 規格 | 通信範囲 | 消費電力 | 速度 | メッシュ対応 | 主な用途 |
|-----|---------|---------|------|------------|---------|
| Wi-Fi | 長距離 | 高 | 高速 | × | 高帯域幅デバイス |
| BLE | 短距離 | 低 | 中速 | ○ | 近接デバイス |
| Z-Wave | 長距離 | 低 | 低速 | ○ | ホームオートメーション |
| Zigbee | 中距離 | 低 | 中速 | ○ | センサー、制御機器 |
| Thread | 中距離 | 低 | 中速 | ○ | IoTデバイス全般 |
| Matter | 規格による | 規格による | 規格による | ○ | 多様なデバイス |

## まとめ

スマートホームの通信規格は、それぞれ異なる特徴とメリット/デメリットを持っています。
Wi-FiやBLEは広く普及していますが、Z-Wave、Zigbee、Threadなどのスマートホーム向けに設計された規格は低消費電力やメッシュネットワーク機能(遮蔽物に強い)の観点で優れています。
また最近では、新しい通信企画「Matter」が誕生し、異なる規格間の相互運用性を高めることを目指しており、様々なデバイスがシームレスに連携できる世界の実現可能性が高まっています。
スマートホームでは、使用するデバイスの種類や要求される能力によって適切な通信規格を選択することが大切です。例えば、バッテリー駆動のセンサーには低消費電力のZigbeeやZ-Waveが適していますが、高画質のセキュリティカメラには通信速度の速いWi-Fiが適しています。

今回、通信規格の整理を行うことで、最新の規格である「Matter」に興味を持ちました。
次回はMatterについて、もう少し深掘りしていきたいと思います。
コマンドライン上で Ruby の String#gsub を使ってファイルの内容の置換を行う

## やりたいこと

- コマンドライン上でファイルの内容を置換したい
  - ワンライナーで行いたい
  - 正規表現を使いたい

## 方法

```shell-session
$ cat ~/Downloads/yoyo.rb
class Yoyo
  MATERIALS = {
    :a6061 => 'アルミ合金 (A6061)',
    :a7075 => 'アルミ合金 (A7075)'
  }.freeze
end

$ ruby -i -e 'gets(nil).gsub(%r{:(\w+) => (.+)$}) { "#{$1}: #{$2}" }.then { puts(_1) }' ~/Downloads/yoyo.rb

$ cat ~/Downloads/yoyo.rb
class Yoyo
  MATERIALS = {
    a6061: 'アルミ合金 (A6061)',
    a7075: 'アルミ合金 (A7075)'
  }.freeze
end
```

## 解説

### ruby コマンドのオプションについて

[Ruby の起動 (Ruby 3.3 リファレンスマニュアル)](https://docs.ruby-lang.org/ja/latest/doc/spec=2frubycmd.html) より

> -e script
> **コマンドラインからスクリプトを指定します。**-e オプションを付けた時には引数からスクリプトファイル名を取りません。

> -i[extension]
> **引数で指定されたファイルの内容を置き換える (in-place edit)** ことを指定します。元のファイルは拡張子をつけた形で保存されます。拡張子を省略するとバックアップは行われず、変更されたファイルだけが残ります。

### Kernel.#gets について

[Kernel.#gets (Ruby 3.3 リファレンスマニュアル)](https://docs.ruby-lang.org/ja/latest/method/Kernel/m/gets.html) より

> gets(rs = $/) -> String | nil[permalink][rdoc][edit]
> ARGF から一行読み込んで、それを返します。行の区切りは引数 rs で指定した文字列になります。**rs に nil を指定すると行区切りなしとみなしてファイルの内容をすべて読み込みます。**

## バージョン情報

```shell-session
$ ruby -v
ruby 3.3.5 (2024-09-03 revision ef084cc8f4) [arm64-darwin23]
```