OmniAICreator/Qiita-1.07M huggingface dataset:
Maplat を使ってみた。（作業メモ）

## 1. Maplat を使ってみた。
Maplatは、不正確に描かれた古地図や絵地図の上に正確なGPS現在位置を表示したり、正確な地図と重ね合わりするWebサイトを作ることができるオープンソースライブラリです。実際に使って見ようと思うと、CODEが？な非エンジニアには？なことが多いです。しかし、CODEをよく見ると、パズルを解く感じでいじれます。
## 2. Maplatのインストール
### ⑴ IIS(ローカルサーバ）立ち上げ
WINDOWS系を使っている方は、ローカルサーバを使うと、公開前に実際の作動状況が分かるので便利です。
IISのインストール方法は、検索してみてください。
インストールに成功すると、http://localhost で何か出ます。
### ⑵ Maplatのダウンロード
https://github.com/code4history/Maplat

から、example.zip　をダウンロードします。
### ⑶  Maplatのインストール
先ほどダウンロードしたexample.zipを展開して、公開するホルダに貼り付ければ、サンプルは動きます。
### ⑷ Maplatのインストールの参考とする場所

https://github.com/code4history/Maplat

https://www.maplat.jp/

## 3. 背景地図の追加
### ⑴ 背景地図を追加したいとき
地理院地図のオルソ画像を追加する例を記載します。
#### ➀ apps/sample.jsonの編集　
　appsフォルダの`sample.json`に次の内容を追加します。
```json:sample.json
        {
            "mapID": "ort",
            "label" : "オルソ",
            "setting_file" : "maps/ort.json"  
        },
```
#### ➁ maps/ort.json　の追加
`"maptype": "base",`とすることで、ベースマップになります。
```json:ort.json
{
    "title" : "電子国土基本図（オルソ画像）",
    "maptype": "base",
    "url": "https://cyberjapandata.gsi.go.jp/xyz/ort/{z}/{x}/{y}.jpg",
    "maxZoom": 18,
    "attr":"国土地理院",
    "description":"<a href=\"https://maps.gsi.go.jp/development/ichiran.html\">https://maps.gsi.go.jp/development/ichiran.html</a><br>国土地理院の「電子国土基本図（オルソ画像）」"
}
```
#### ➂ tmbs/ort.jpg　の追加
tmbsフォルダに`ort.jpg`に追加します。
画像のサイズは、52×52ピクセル　にします。

---
これで、ベースマップにオルソ追加することができました。
お試しください
ストレスとリフレクソロジー

# はじめに
最近、ストレスが起因すると思われる疾患に罹っていたようで、自分のストレスとの向き合い方について書いておこうと思いました。雑記です。

# Who am i ?
しがないエンジニアです。

# 想定読者
特になし。

# 背景
最近、メンタルクリニックに行ったところ、どうやら自律神経失調症と思わしき症状と診断されました。なんとなく調子が悪いものの、具体的にここが悪いとかそういった所はない。ただダルい。そういった症状です。あとやたらとトイレが近くなる。通勤の際に４回～５回お腹を下してトイレに駆け込んだり、メンタルのアップダウンがやたらと激しく、寝ても寝た感じが全くせず、次の日にダルさがきてしまう。寝られないため睡眠薬やアルコールの量が増えるという悪循環。もしかしたら仕事のパフォーマンスも落ちていたかもしれません。おそらくですが、普段何気なく感じているものが自分のストレスになっていたことに加えて、寒暖の差や環境の変化が要因になっていたと考えられます。そんなときに私の症状を緩和してくれたのが、アロマテラピーとマッサージです。俗に言うリフレクソロジーというやつ。お医者さんのオススメで行ってみました。

https://beauty.hotpepper.jp/genre/kgkw002/

整骨院さんなどで行っているスポーツマッサージも良いと思っているのですが、ストレスが起因する場合はリフレクソロジーの方が良いのではないかと考えています。整骨院さんの場合は、保険が効くところが良いところですね！リフレクソロジーの場合は少し高いですが、整骨院さんの保険診療の場合は受診できるコースが限られてしまうため、正直あまり変わらないかなという印象です。

# リフレクソロジーのススメ
リフレクソロジーですが、お店に行くとアロマの香りでリラックスしながらマッサージを受けつつ、マッサージ師の方とお話ができます。私はデスクワーカーなので、椅子に座りっぱなしでノートパソコンを眺めていたことが原因で猫背になってしまうので、肩と腰をメインにマッサージしてもらいました。すごく良くなりました。マッサージは現代社会にとって欠かせないものですね。
ただ、マッサージだけではなく、アロマの効能もあったと思います。アロマは心を落ち着ける効果があるため、ちゃんとしたエッセンシャルオイルを使えばそこそこのリラックス効果が期待できます。アロマテラピーですが、勉強してみると中々に奥が深いです。基本的なことはアロマテラピー検定などの本が書店やアマゾンに売っているので、それを勉強するのが手っ取り早いと思います。私が買った本を紹介します。

https://www.amazon.co.jp/1-E5-9B-9E-E3-81-A7-E5-8F-97-E3-81-8B-E3-82-8B-E3-82-A2-E3-83-AD-E3-83-9E-E3-83-86-E3-83-A9-E3-83/dp/4415233449/ref=dp_ob_title_bk

アロマテラピー検定自体は私の場合は仕事とは無関係なので、今のところ受験は考えてません。ただこの本は本当に初心者向けに書かれていて、アロマテラピーを気軽に楽しむ入門書としても最適かなと思いました。余力があればどこかで勉強したことをまとめてみようかな。。

# 最後に
アロマテラピーだけでなく、誰かに話しを聞いてもらいながらリラックスするのがストレス緩和に良いのかもしれませんね。アルコールで無理矢理ストレスを発散させる方法もあるかもしれませんが、自分のストレスの原因をアロマテラピー的観点から考察するということもありかなと思いました。少なくとも気合と根性でストレス解消を試みる方法はナンセンスですね（逆にストレスがたまる）。
VSCodeのフォント設定手順

VSCodeのフォントの設定で手こずったので、備忘録として書いておきます。

# 手順
## 1. フォントダウンロード・インストール
ネットで検索して、好きなフォントをダウンロードする。
今回は見た目がなんとなく気に入ったのでUDEV Gothicのフォントを使います。
https://github.com/yuru7/udev-gothic

案内に従ってzipファイルを解凍
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822364/f95d3ed3-9c5e-3c43-88a3-d51c07852174.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822364/03247dbc-bffb-46e7-e141-82f5cfa8cb8c.png)

たくさんある中から、実際に使うものをダブルクリックして開く。
UDEVGothicJPDOC-Regular.ttf
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822364/c3134776-94dc-0e23-9e75-4c4554f65d33.png)
インストールボタン押下

## 2. フォントファミリの確認
エクスプローラでインストールできてることを確認
C:\Windows\Fonts

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822364/b975f4c2-816a-2e46-a9a2-806d6a0378fe.png)

ここで、フォントファミリを表示してコピーしておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822364/d4ee73c9-b099-bfc3-6f57-d7a77bd5e46b.png)

## 3. VSCodeでフォント設定
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822364/01d30fca-954e-8a96-a2af-3504d04fccfa.png)


設定を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822364/f86f4d9a-19df-45da-f8a3-20a4282b1ef7.png)

フォント設定を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822364/3fdbc630-bd3d-b72c-f44d-5c534e15eb05.png)

先ほど調べたファミリ名をシングルクォートで囲って入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822364/7125b911-d6d5-22aa-1a3d-5128814778de.png)

## 4. 設定完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822364/fa19145e-8906-f85b-150c-b05f85d57754.png)

反映されない場合はPCを再起動すれば反映されるはず。

# ハマりポイント
ファミリ名って何？
初めてフォントをいじったので、何もかもがわからなくて辛かったです。

再起動しないと反映されなかったから困った。いくつかのサイトだと設定ファイルを書き換えればすぐに反映されると書いてあったんだけどな、フォントをインストールした段階で再起動が必要なのかも。
痒いとこに手が届くMATLAB関数【figure保存を1click】

:::note 
### 痒いとこに手が届くMATLAB関数
日々のMATLABライフをちょっと便利にするツールを作成し発信することを目指して投稿をはじめてみました。他のMATLABユーザーさんの作業効率化の一助になれば幸いです！
:::

# モチベーション

MATLABでfigureを保存するのって、地味に面倒じゃないですか？

毎回`saveas`コマンドを打つのも面倒だし、figureのウィンドウから「ファイル」→「名前をつけて保存」→「フォルダ・ファイル名指定」といった具合に毎回設定し直すのも面倒くさい。


そこで、GUIで簡単にfigureを保存できるツールを作ってみました！

## ソースコード

GitHubで公開しています！もしよければ使ってみてください！

[GitHubリポジトリへのリンク](https://github.com/MyMatTool/figCapture.git)

## どんなものを作ったのか？
100聞は一見にしかず。とりあえずデモです！
<img src="https://github.com/user-attachments/assets/9066912c-5b7f-4b6f-9c2f-64154b5a9288" width="70%">

## 使い方
基本的にGUI上の操作で完結できます。
1.  コマンドウィンドウで`figCapture`と入力してEnter
2.  GUIが起動するので、UI上で以下のパラメータを設定
    - ファイル形式　（`png`、`eps`、`pdf`など）
    - 保存場所　　　（既定値は現在のディレクトリ）
    - ファイル名　　（既定値は現在の日時から自動生成）
3.  Captureボタンをクリックしてfigureを保存

#### ※ファイル名について
デフォルトのファイル名には、GUIを起動した日時が含まれるので、基本的にファイル名が重複する心配はありません。ファイル名が重複した場合は上書きしないよう番号を付加して保存する仕様になっています。

#### ※保存対象のfigureについて
保存するfigureは内部で`gcf`で取得しています。ですので、最後にプロットしたfigureもしくは、最後にカーソルで選択したfigureになります。


## 実装の中身の話
MATLABでクラス定義を行う際、値の管理はどうしていますか？
普通はクラスのプロパティに保存しますよね？
でも、このGUIツールでは少し違う方法を使っています。
設定は`config.json`ファイルに保存！

#### なぜそんなことをするのか？
それは、毎回GUIを起動するたびに設定し直すのが面倒だからです。
`config.json`に保存しておけば、MATLABを再起動しても前回の設定がそのまま使えます！（私は数値解析結果を保存する用のフォルダを作成して、自動的にそこに保存されるようにしています）

#### ざっくりの実装内容
以下のような仕組みで実現しています。
* クラスのプロパティはDependent属性で定義
* プロパティに値を設定する場合は、setメソッドで`config.json`にデータを保存
* プロパティの値を取得する場合は、getメソッドで`config.json`の内容を読み取り

これで、ユーザーは`config.json`を意識せずに、普通にプロパティにアクセスできます。
「毎回設定しなくてもいいように、設定をファイルに保存する仕組みを作った」ということですね！



## コマンド実行にも対応！

GUIを起動して使ってもらうのが便利ですが、スクリプト実行中にfigureを保存したい場合もあるかと思います。
保存場所や拡張子、ファイル名の指定など、GUIでできることはコマンドでも実行できます。
具体的には、`figCapture`クラスの静的メソッドを呼び出すことで、GUIを起動せずにfigureを保存できます。

#### ファイルの保存場所を設定
`setPath`メソッドを使えば、保存先のフォルダを指定できます。パスを指定しない場合は、GUIが起動してフォルダを選択できます。
```matlab
>> figCapture.setPath('/mypath') % 保存したいパス名をchar型またはstring型で指定
>> figCapture.setPath;            % 引数がない場合は保存場所を設定するGUIが起動
```

#### 保存する拡張子を設定
`setExtension`メソッドで保存するファイルの拡張子を設定できます。複数の拡張子を指定することも可能です。拡張子を指定しない場合は拡張子を設定するGUIが起動します。
```matlab
>> figCapture.setExtension({'eps','pdf'}); % 拡張子をcellまたはstring配列で指定
>> figCapture.setExtension;                % 引数がない場合は拡張子を設定するGUIが起動
```

#### figureを保存
`capture`メソッドでfigureを保存します。ファイル名を指定しない場合は、日時ベースのファイル名で保存されます。
```matlab
%configに保存されている設定内容（保存場所・拡張子）でfigureを保存
>> figCapture.capture('filename'); % 指定したファイル名で保存
>> figCapture.capture;             % 日時の値から自動的に命名して保存
```

これらのコマンドを使えば、スクリプトから figCapture の機能をフル活用できます！
静的メソッドで設定した内容は、次にGUIを起動した際の初期設定になります。
逆に、GUIで一度設定しておけば、その内容が静的メソッドにも適用されます。
これも`config.json`でデータ管理をしている恩恵ですね。
tailscaleでVPN環境

# 目的
スマホからフリーwifi等に接続した際セキュアな通信を行いたい
# 環境
・S23FE Androidスマホ
・ipad pro 11インチ gen3
・Linuxサーバー（desk mini A300 ryzen_2400G 16GB）
・So-net光　V6プラス
・DS118　synology NAS
# 手段
①Ikev2
②WireGuard
③openVPN
④tailscale　←　今回はこれ
＊①②は試したものの上手く出来ずアドバイスをいただいた中で提案されたtailscaleで実装。
③はもともとsynology NASの機能を使って実装は出来てたものの通信の切り替わりで接続が維持できなかったのがイヤで他の手段を探していた。
# 結果
実装は出来たものの幾つか分かった事がある。

|          | NAS openVPN | NAS tailsclae | Linux tailscale |
| :------: | :---------: | :-----------: | :-------------: |
| 通信速度 |      ◎      |       △       |       〇        |
| 再接続性 |      ×      |       ◎       |        ◎        |
|  安定性  |      ◎      |       ×       |        ◎        |
|  機器数  |     １      |      １       |       ２        |
|   電力   |    不明     |     不明      | 11w（アイドル） |

・通信速度
元々出来ていたopenVPNの方が早い。ただし極端に劣るこのではない。
(通信速度結果だがちゃんとメモってなかったのでだいたいこんな感じです)
通常 200mbps　
openVPN 200mbps
NAS tailsclae 80mbps
Linux tailscale 160mbps
またmineoのかけ放題plusの1.5Mbpsも同様に多少openVPNより低下した。

・安定性
synology NASでもtailscaleを実装したが挙動が不安定。
通信速度の確認でスピードテストをした後、他のwebページを開こうとすると通信が切れている。
synology NASのGUIを開いてみてもその時はレスポンスが悪く固まっているような状態。

・機器数
NASでの安定性が良ければ余分な電力を増やさずに運用できたのになぁ。
ビジー状態にも感じるので上位機種でSSDキャッシュがあれば行けたのかぁ。
（NASパフォーマンスではCPU、メモリ共にまだ余裕はありそうに見えたのでこれを試してみたい:grin:）

・電力
基本はマシンのアイドル状態での使用（ログインしてなくてもVPNにできた）
スマートプラグの機能で確認した。
NASの電力は不明だがカタログスペック的には１１W以下で運用されていると思う。

# 実装を終えて
tailscaleの実装は意外と簡単にできた。
途中NASにも実装できると知り多少手間取ったが勉強になった。
運用してちょっと微妙な感じになった。
キャリアwifiにも接続できるようにしていたがVPN有効にすると通信ができなくなる。（もしくは遅い）そうするとVPNを切るかキャリアwifiを切るかになり結局は任意のタイミングで自分でVPNを切り替えないといけない。
つまり再接続性は自分の運用にとってマストではなかった事になる:cry:
でもこの実装をする為に色々やれて面白かったし自分の知識が増えてよかった。
新しいプログラミング言語を作ってみたい！

こんな言語を作ってみたい！

※S nand 引数1 引数2だけが初期設定されています。
| コマンド | 引数        | 意味 |
|:--------|:------------|:------------:|
| V       | タイプ 名前                                |変数を作成<br>タイプ N→1,0　I入力　O出力　F関数|                             |関数を作成 |
| S       | 関数名 引数1 引数2 引数3 ...　　引数n 変数名 |変数に関数の結果を入れる(変数)|
| E       | 無し |関数の終わり|

# NOT
```nandy
V F not
V I input
V O out
S nand input input out
```
# AND
```nandy
V F not
V I input
V O out
S nand input input out
↑前提

V F and
V I input_1
V I input_2
V O out
V N nand
S nand input_1 input_2 not_and
S not not_and out
```

一応チューリング完全なので、
隙間時間で作ってみます！
Vercelでのデプロイ記録

モノレポ構成のアプリで、フロントエンドをVercelでデプロイしました。
AWSに比べたらめちゃくちゃ簡単でしたが、参考にした記事をまとめておきます。
フロントエンドの開発環境はReact×Viteです。

https://qiita.com/KokiSakano/items/0d872a46ac8a7ae519f8

https://qiita.com/tkms13/items/4f6b0a96bed1dab0217f


## ハマったところ
開発環境では画像が表示されるのに本番環境では表示されない事象が発生。

vercel.jsonでにimagesへのルーティングに関する記述を追加したところ、無事に表示された。
```
{
  "routes": [
    {
      "src": "/images/(.*)",
      "dest": "/images/$1"
    },
    {
      "src": "/assets/(.*)",
      "dest": "/assets/$1"
    },
    {
      "src": "/(.*)",
      "dest": "/index.html"
    }
  ]
}
```


下記の記事はpublicフォルダにimageを保管する方法。

https://qiita.com/only/items/311a0dec256ecfd5d8c9
Qiitaをはじめました

# はじめに
- [アウトプット大全](https://amzn.asia/d/izxXu40) を読みました
- 気付かされることが非常に多かった
- 特に、**CHAPTER5 その4 情報発信する** を読み
- 情報発信をはじめてみることにしました
- はじめての情報発信は、この章の内容をまとめたものです
- 本で学んだ、**要約、気づき、行動** の自己アレンジで書いてみます

# 要約
- 情報発信のデメリットとメリットの比率は **1:20**
    - デメリットもたしかにある
    - が、メリットが圧倒的に多い
- フィードバック効果が大きい
    - 人に読んでもらうので、誤りや下手なことは書けない
    - 緊張感があるからこそ、アウトプットの質が飛躍的に成長する
- 情報と人が集まる
    - 間違いや勘違いを指摘してもらえる
    - 違った意見、知らない情報を教えてもらえる
    - 多くの人と知り合え、交友関係も深まる
- 社内の評価が上がる
    - 社内の人も発信を見てくれる
    - 勉強熱心な人、〇〇な分野に詳しい人、というのが知れ渡る
    - 努力が適切に評価してもらえる
- 取材や仕事の依頼が来る
    - 本の依頼、仕事の依頼がくるかもしれない
    - 副収入のチャンス
- 承認欲求、満足感が得られる
    - 情報発信は社会貢献とも言える


# ビフォー
- 情報発信にはメリットは無いと考えていた
- 誹謗中傷、炎上が怖かった



# 気づき
:::note warn
- 確かにデメリットはゼロではない
- が、それ以上のメリットが圧倒的に多い
:::


# 行動
- [x] Qiita用に新しくGoogleアカウントを作る
- [x] Qiitaのアカウントを新規で作る
- [x] 記事を投稿してみる
AWSの構築記録

AWS構築で役立った記事をまとめ、今後、同様の構築を行う際の調査時間を省くためにまとめます。 
構築の大枠は下記の記事を読んで完了できました。
操作の細かい疑問点は検索したらすぐ出てきたので網羅はしていないです。

現在の掲載内容です。随時追加していきます。
- VPC
- ECS
- Aurora
- SES
- 運用コスト削減
- ECRのイメージ再プッシュ

https://kacfg.com/vpc/

https://qiita.com/tatsuya11bbs/items/3466dd0c6b84731fe62e

https://qiita.com/yakisobapan/items/a59f402dd56fcf86b16b

https://qiita.com/yu-yama-sra/items/980d8b79d5b548a1b731

https://qiita.com/haraitai00/items/5a3cc3b6550428f759be

# コストの削減について
リソースに対する費用が月額６万くらいになってしまったのでコスト削減を検討。
RDSとECSの起動と停止をスケジューリングしてコスト削減を実現。

https://qiita.com/generokenken/items/78b7b68e118d8f312962

## ハマったところ。
### ECRへのイメージ再プッシュ
バックエンドを更新しデプロイしたが本番環境で反映されず。
ECRのイメージを確認するとプッシュ日時が更新されていなかった。
キャッシュを無効化して下記のコマンドでデプロイしたら成功した。
<>内は自分のid等を入れて実行してください。
```
デプロイコマンド

# AWSログイン
aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <account_id>.dkr.ecr.<region>.amazonaws.com

# Dockerイメージをビルド
docker build --no-cache --platform linux/amd64 -t <account_id>.dkr.ecr.<region>.amazonaws.com/<repository_name>:<tag> .

# ECRにプッシュ
docker push <account_id>.dkr.ecr.<region>.amazonaws.com/<repository_name>:<tag>

# ECSサービスを再デプロイ
aws ecs update-service --cluster <cluster_name> --service <service_name> --force-new-deployment

```
[Unity 2022.3] Vector3Intを使わない方が楽な理由

# はじめに
結論から言えば、Vector3IntはVector3を使ったほうが楽です。
たとえ整数しか格納されない場合でも何らかの演算する場合には面倒なことになります。
この記事は私がVector3Intを使ったときに困惑したことを解説する記事です。
なぜ使わないほうが楽なのか、早速見ていきましょう。

# 1. Matrix4x4と演算が不可能
ベクトルの回転や平行移動をするのに行列(Matrix4x4)を使うことがあります。
私の場合、グリッド上の位置ベクトルを90度回転するときにMatrix4x4.MultiplyPoint3x4(Vector3)を使用しようと考えました。
しかし、Vector3Intの場合これを使うことはできません。
引数がVector3Intの場合のメソッドが定義されておらず、Vector3への型変換も用意されていないためです。
Vector3Intは構造体なので、派生クラスを作って型変換を用意することはできません。
そのため、先ほどのような90度回転を実装する場合、以下のどれかを行う必要があります。

* Utilityクラスを作ってベクトル要素を直接いじるようなコードを書く
* Vector3Intに以下のどちらかの[拡張メソッド](https://tsubakit1.hateblo.jp/entry/2019/10/23/225252)を定義する
    * 回転用のメソッド
    * Vector3Int->Vector3の[型変換オペレーター](https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/user-defined-conversion-operators)

正直面倒くさいです。
前者はあまりきれいな解決策ではありません。Utilityクラスの肥大化や乱立を招き可読性を損なう可能性があるため、できれば元の構造体内にメソッドを定義したいです。
後者は他のプロジェクトにコードを持ち出した際に予期せぬバグを生んだり、コンパイルエラーが起きてほしいところで起きなくなったりと副作用があり少し怖いです。

# 2. 浮動小数点数による掛け算や割り算が不可能
スカラー演算はint型にだけ定義されています。
返す値はVector3で良いので融通が利くようにしてほしかった。
解決策は先ほどとほぼ同様です。

# 3. 型変換が貧弱
9割方の悩みはこれに尽きます。これまでに挙げていた問題もこれができれば容易に解決策を出すことができたでしょう。
ここで問題視している型変換は、Vector3Int->Vector3です。
私はVector3Intを使用することを考えていた時、この型変換はできるものだろうと考えていました。
実際調べたところ以下のリファレンスページにて型変換できるという風に書かれていたため、これを受け止めてコーディングをしていきました。

https://docs.unity3d.com/ja/2021.2/ScriptReference/Vector3Int-operator_Vector3Int.html

しかし、いざコンパイルしようとすると型変換ができないと怒られます。

```:エラーログ
Cannot implicitly convert type 'UnityEngine.Vector3Int' to 'UnityEngine.Vector3'
```

先ほどのページを調べると、どうやらUnity 2021.2の日本語版にしか型変換の記述がないようです。
ドキュメントはしっかりと確かめなければならないという教訓になりました。

しかし、Vector3->Vector3Intであれば丸める必要があるので型変換がないのも理解できますが、今回の変換はただ単にすべての要素をint->floatに変換するだけで済むため、なぜ削除されたのか不明です。
動作を軽くするためでしょうか。
Vector3を引数に要求するメソッド、関数に対して代替的に引数として利用できなくなるため使い道が狭まります。

解決策としては[拡張メソッド](https://tsubakit1.hateblo.jp/entry/2019/10/23/225252)で[型変換オペレーター](https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/user-defined-conversion-operators)を用意することです。

# おわりに
ここまで書いてきましたが、基本的にはベクトルとしての演算が必要になる場合にのみ問題が発生します。
そのため、データの読み書きだけで一切の演算を行わない場合や、要素を使った演算だけを行う場合にはVector3よりも良い型となる可能性があります。
しかし、後から機能追加などによりベクトル演算が必要になることも考えられるため、その辺を踏まえて使用するか、それとも型変換を用意するかを決めるとよいでしょう。
同様のことがBoundsIntなどにも言えます。

以上です。良いUnityライフを！
【SAA】AWS KMS

# 目的
AWSサービスの暗号化としてAWS KMSを学習したので、それについてまとめる。
SAA資格取得を志すどなたかの参考になれば嬉しい。

# AWS KMSの概要
AWSにおける暗号化方法は次の二つがあるが、特に奥深いのはCMKsの方である。
- **AWSマネージド型キー(AWS Managed Keys)**
暗号化キーの生成から管理、暗号化・複合化を全てAWSでやってくれる暗号化方法である。カスタムができない一方でAWSにおけるデフォルトの暗号化方法である。
- **カスタムマネージド型キー(Customer Managed Keys; CMKs)**
暗号化からキーの管理までユーザーが行う暗号化方法である。暗号化のタイミングや暗号化するデータ、暗号化キーそのものも全てユーザーがカスタマイズできる。詳しくは次項。

# Customer Managed Keys; CMKs
CMKsではエンベロープ暗号化方式が採用されている。ここでは具体的な暗号化方法の流れとルートキーの生成方法について解説する。
## エンベロープ暗号化方式
より簡潔には、データ管理のセキュリティをより強固にするために考案された暗号化方式で、データを暗号化する暗号化キー(データキー)をさらに別のキー(ルートキー)を使って暗号化する方式である。


| 比較項目  | ルートキー                                | データキー                             |
|-----------|-------------------------------------------|----------------------------------------|
| 役割      | データキーを生成、暗号化、復号する         | データを暗号化、復号する               |
| 生成方法  | KMS APIによる生成                         | KMS APIによる生成                     |
| 管理場所  | AWS KMS（AWS内部で永続化される）          | ユーザーの管理場所（AWS内部で永続化されない） |
| エクスポート | 不可                                      | 可                                      |
| キー       | AWSが管理、ユーザーはルートキーIDのみを使用 | ユーザーがキー本体を扱う               |


### データの暗号化・復号化
1. キーの生成@AWS内部
    1. ユーザーはAWS KMS APIでCreateKeyを実行し、ルートキーが生成されるがユーザーはそのもの事態を知ることはできず、ルートキーIDを返却される。ルートキーはAWS内部で管理される。
    1. ユーザーはルートキーIDを指定してAWS KMS APIでGenerateDataKeyを実行し、データキーを生成する。
1. データの暗号化@ローカル
    1. 生成されたデータキー(平文)でデータ(平文)を元に暗号化されたデータ(暗号)を生成する
    1. ルートキーでデータキー(平文)を元に暗号化されたデータキー(暗号)を生成する
    1. **データ(平文)とデータキー(平文)を削除する** ←ここ重要
1. データの復号化@ローカル
    1. ルートキーでデータキー(暗号)を元にルートキー(平文)を復元する
    1. 復元したデータキー(平文)でデータ(暗号)を元にデータ(平文)を復元する

## ルートキーの生成元(キーマテリアルオリジン)
ルートキーの生成元をユーザーは次の4つから選ぶことができる。
- **KMS**：最も推奨される方法でルートキーの生成、管理をAWSが行うデフォルト設定
- **外部（キーマテリアルのインポート）**：外部で生成したルートキーをKMSにインポートして使用する方法。独自のセキュリティ要件を持っているプロジェクトや企業の場合に使われたりする。ルートキー自体はAWSが管理する。
- **AWS CloudHSM キーストア**：ユーザーがHSMインスタンスを生成し、そこでルートキーの生成と管理を行う方法。セキュリティ要求が高いシステム向けに、HSMデバイス上で鍵を生成・管理するため、より物理的に強固な保護を提供する。
- **外部キーストア**：企業が独自に運用するキーストアをAWS KMSと連携させる方法で、完全に自社管理のインフラやセキュリティモデルを使用する場合に採用される。

※ここでキーストアとは下記である。
- 鍵の安全な保存： 鍵が漏洩しないよう、暗号化された形で保存。
- 鍵のアクセス管理： 誰がその鍵にアクセスできるのかを制御。
- 鍵のライフサイクル管理： 鍵の生成、更新、削除、ローテーションなどを行う。
- 鍵の操作： 暗号化や復号化など、鍵を使った操作を安全に行う。

キーマテリアルオリジンがKMSの場合はルートキーのローテーションを設定することができる。要するにルートキーの有効期限を設定し、ルートキーの有効期限が切れると新しいルートキーを発行し、自動的に新しいルートキーで暗号化してくれるようになる。ただし、古いルートキーによって暗号化されたデータキーはそのまま古いルートキーによって複合することができる。

# まとめ
SAAの試験対策レベルですがとっかかりで理解するには十分な内容かと思う。
図も作ってもっと分かりやすくしときます。
ぷよぷよsteam版でAIを動かしたい

![スクリーンショット 2024-10-09 22.05.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900427/8ce41d48-9b49-f992-e0a7-e85bd2cf3976.png)


![puyopuyo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900427/1fdf8221-96c5-fcfa-3a52-383422a6fdc3.gif)
　ぷよぷよプログラミングAI学習システムは、中高生の自己調整学習に向けて開発されました。
　どうやって、Chromebookで、１０分で、素敵な人工知能を作れるのでしょうか？
　秘密は、３つ。
　１　jupyter liteで、webクライアントがpythonコードを実行
　２　超軽量な機械学習フレームワークdezeroを採用
　３　ぷよぷよのstageとactionがコンパクト

　ama氏のように、ぷよぷよeスポーツsteam版で作ったAIがpythonで動くようにしていきます。（まだ途中）


### Github&X

https://github.com/Lunanaedu/jupyterlite-puyopuyo

https://github.com/Lunanaedu/puyopuyo-kai

https://x.com/educationai_ai

### ぷよぷよプログラミングAI学習用まとめ

https://qiita.com/educational-ai/items/50c0fa689c01794d145e


# ぷよぷよeスポーツSteam版

Steam版のぷよぷよeスポーツはこちら（有料）

https://store.steampowered.com/app/971620/_e/?l=japanese


# ぷよぷよAIをsteam版で動かす

steam版ぷよぷよeスポーツでのぷよぷよAI・amaの導入方法[オフライン対戦]

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

# pyautogui
ぷよぷよsteam版の画像を取り込んで、範囲を指定すれば、フィールド情報を取得できるようになった。範囲を自動設定する比率を調査中(10/14)


**[Python]PyAutoGUIとは？できることや使い方を解説**
マウス操作やキーボード操作を自動化するためのライブラリ
インストール方法や使い方が記載されている

https://one-div.com/programming/python/what-is-pyautogui

# vgamepad
ローカル実行で複数プレイヤーとやるなら、ゲームパッドが必要


**仮想ゲームパッド「VGAMEPAD」**
Windowsタブレットで簡単に使える無料のゲームパッド


http://www.realpotsystems.com/bazzone/vgamepad
[laravel11]デフォルトのmarkdown(html)メール使おうとしたら表記が崩れる

## 何が起きた？
[公式リファレンス](https://readouble.com/laravel/11.x/ja/notifications.html)のmarkdownの部分に従ってメールを作成したところ下記図のようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/2b96114d-7728-51c6-fe4e-59061ce24b9f.png)

症状としては、一部のタグが文字列として認識されてしまっている状況です。

該当箇所は以下の通りなのですが皆さんは何が悪いか分かりますか？（筆者にはわかりませんでした。。。）

```:誤っているbladeファイル
<x-mail::message>
（〜前略〜）
    # 無料トライアルの登録が完了しました！

    <x-mail::button :url="url('/login')">
        ログイン画面を開く
    </x-mail::button>

    ※既にログイン済みの場合はトップページが開かれます。

    ※このメールに対して覚えがない場合は、そのままお読み捨てください。
（〜後略〜）
</x-mail::message>
```

## 結論
**htmlを使う記述にインデントが入っている**からでした。

```:正しいbladeファイル
<x-mail::message>
（〜前略〜）
    # 無料トライアルの登録が完了しました！

{{-- インデントを削除した --}}
<x-mail::button :url="url('/login')">
    ログイン画面を開く
</x-mail::button>

    ※既にログイン済みの場合はトップページが開かれます。

    ※このメールに対して覚えがない場合は、そのままお読み捨てください。
（〜後略〜）
</x-mail::message>
```

おそらくmarkdownを実装するときの裏仕様なのだと思うのですが、公式を調べた限りではそんなこと書いておらず、筆者は２時間ほど虚無を彷徨いました。

なのでみなさんが同じ部分でつまづかないようになればと思いこの記事を書きました。

## 解決につながった記事
ちなみに筆者は[こちらの記事](https://teratail.com/questions/235006)のおかげで解決できました。
AWS Storage Gatewayのゲートウェイタイプ

# 概要
AWS Storage Gatewayのゲートウェイタイプを整理する

# ゲートウェイタイプ
以下の3種類が存在する

- ファイルゲートウェイ
- ボリュームゲートウェイ
- テープゲートウェイ

### ファイルゲートウェイ
オンプレミスのファイルをAWSのストレージに保存する。
オンプレミスシステムからのアクセス速度を維持しつつ、オンプレミスのファイルをバックアップしたいケースで使用する。

#### ストレージサービスごとの比較 
|ストレージサービス|概要|対応しているプロトコル|
|-|-|-|
|S3|S3を共有ストレージとする|NFS、SMB|
|FSx|FSx for Windows File Serverをファイル共有ストレージとして使用する|SMB|

### ボリュームゲートウェイ
オンプレミスのディスク内のデータを一部、または全て残しつつ、iSCSIプロトコルでディスクデータをS3に保存する。
ユースケースとしては、災害対策がある。

#### ストレージサービスごとの比較 
|ボリューム|概要|
|-|-|
|キャッシュ型|全てのデータをS3に残しつつ、高頻度にアクセスするデータはローカルにコピーする|
|保管型|全てのデータをローカルに保存しつつ、S3上へデータのスナップショットを保存する|


### テープゲートウェイ
物理型のストレージにデータをバックアップする既存のアプリケーションを使用しながら、仮想化されたテープ型ストレージ(S3)にデータをバックアップする
VSCode Neovim使用時、エラー箇所をホバーしなければエラー内容が確認できない問題

# 問題点
VSCode Neovimの拡張機能が便利だが、エラーが出ている際、内容を表示するためにマウスカーソルでホバーする必要があり面倒だった。

↓下線部にマウスカーソルを合わせないとエラーが見られない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3909914/397d7506-44dd-9604-3b80-4ee6e324414c.png)


# 理想
テキストカーソル（キャレット）を該当箇所に移動した際、エラーがホバーメニューで表示されてほしい。

# 解決策
### - 対策①
VSCodeの拡張機能[Error Lens](https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens)を利用する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3909914/9f8987d2-f074-5c13-ffce-70676d029037.png)
- メリット
    - エラーが横に表示されるため見やすい
- デメリット
    - エラーが画面からはみ出してしまうと見にくい（折返しで表示できたりしないのだろうか？）

### - 対策②
ホバーメニューを表示するためのショートカットキーを利用する。

新たにショートカットを追加しようと思ったら、すでにVSCode Neovimの拡張機能によって設定されていた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3909914/9208d70a-ce57-5503-cb3e-d1ef83b8422b.png)

該当箇所にテキストカーソル（キャレット）を移動 & `Shift + K`でエラーを表示できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3909914/ad83db9e-2c56-a6d7-2896-f1df3581427c.png)
ポータブル3Dスキャナーとは

3D技術の普及に伴い、ポータブル3Dスキャナーは様々な業界で人気を集めています。軽量で使いやすく、高速で高精度の3Dモデルを生成できる点が注目されています。この記事では、ポータブル3Dスキャナーの定義、動作原理、応用シーン、そして現代技術における重要性について解説します。

ポータブル3Dスキャナーとは？
ポータブル3Dスキャナーとは、手持ち操作可能な小型デバイスで、物体の表面をスキャンして対応する3Dモデルを生成するための機器です。従来のデスクトップスキャナーと比較して、ポータブルスキャナーは小型で軽量、携帯しやすく、現場での使用に適しています。通常、これらはレーザーまたは構造光技術を利用してスキャンを行い、物体の形状と詳細を素早く取得できます。
![edc1577830cf1b7fd2c07601c74b9d0b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/de271eec-cd7b-b405-1583-a91a61f43870.png)
https://www.revopoint3d.jp/products/all-in-one-3d-scanner-miracoplus

動作原理
ポータブル3Dスキャナーは主にレーザーまたは構造光技術に依存しています。これらの技術は、物体の表面に光を照射し、その反射光の変化をカメラでキャプチャして、物体の表面形状を測定します。レーザースキャナーはレーザービームを照射し、その反射時間を計算して物体との距離を特定するため、複雑な幾何学構造にも適しています。構造光スキャナーは、一連の格子パターンを照射し、それらのパターンが物体表面でどのように変形するかに基づいて正確な3Dデータを生成します。

どちらの技術を使用する場合でも、ポータブル3Dスキャナーの核心的な利点は、スキャン速度が速く、操作が簡単で、さまざまな環境で効率的に作業できることです。

応用シーン
ポータブル3Dスキャナーはさまざまな分野で広く使用されています：

リバースエンジニアリング：製造業では、ポータブル3Dスキャナーをリバースエンジニアリングに使用し、既存の部品の正確な3Dデータを迅速に取得して改良や複製を行います。

![5000c5a4bcebdd7ed6b8b8357df0e181.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/17e2115f-f768-0972-fab5-c00c2ea45473.png)
文化財の保護：文化財の修復やデジタル保存の過程で、ポータブル3Dスキャナーは貴重な文化財の詳細なデータを捉え、展示、修復、または保存のためのデジタルモデルを作成することができます。
![68bba7360d41e26735c1f441c2ddd387.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/2d18f5c3-2197-2384-36aa-da66a5d53e67.png)

医療業界：医療分野では、患者の体の部分の3Dモデルを迅速に取得し、義肢や口腔医療機器、その他の医療機器をカスタマイズするために使用されます。

建築測量：建築家やエンジニアは、ポータブル3Dスキャナーを使用して建物の構造をスキャンし、施工、修繕、または仮想展示用の3Dモデルを生成します。

ポータブル3Dスキャナーの利点
従来の3Dスキャニング機器と比較して、ポータブル3Dスキャナーには明らかな利点があります：

携帯性：小型で軽量なため、さまざまな場面で使用可能です。例えば、屋外でのスキャンや現場測定にも適しています。

効率性：スキャン速度が速く、高精度の3Dデータを迅速に生成でき、操作手順や時間の削減が可能です。

柔軟性：小型部品から大型建築物まで、さまざまなサイズや形状の物体に対応できます。

簡単な操作：複雑な技術的背景がなくても、一般のユーザーでもすぐに操作を習得できます。

結論
ポータブル3Dスキャナーは、その携帯性、高効率、使いやすさによって、多くの業界で不可欠なツールとなっています。製造業、文化財保護、医療、建築測量など、さまざまな分野で強力な機能を発揮しています。今後、技術の進歩に伴い、ポータブル3Dスキャナーはさらに多くの分野でデジタル化と革新を支援する重要なツールとしての役割を果たすことでしょう。
web言語で利用される〇〇ケース(命名規則)まとめ

## よく使われる命名規則一覧

- **キャメルケース**(ローワーキャメルケース)
- **アッパーキャメルケース**(パスカルケース)
- **パスカルケース**(アッパーキャメルケース)
- **ケバブケース**
- **スネークケース**(ローワースネークケース)
- **アッパースネークケース**

## キャメルケース(camelCase)

- 別名 : ローワーキャメルケース(lowerCamelCase)
- 説明 : 最初の単語が小文字で始まり、2単語目以降の単語の最初の文字が大文字
- 利用例 : 変数名や関数名
- 覚え方 : キャメル(ラクダ)の背中のこぶをイメージ

## アッパーキャメルケース(UpperCamelCase)

- 別名 : パスカルケース(PascalCase)
- 説明 : すべての単語の最初の文字が大文字
- 利用例 : クラス名や型名
- 覚え方 : キャメルケースのアッパー(大文字)と覚える

## パスカルケース(PascalCase)

- 別名 : アッパーキャメルケース(UpperCamelCase)
- 説明 : すべての単語の最初の文字が大文字
- 利用例 : クラス名や型名
- 覚え方 : Pascalは人の名前だから最初は大文字と覚える

## ケバブケース(kebab-case)

- 別名 : なし
- 説明 : すべての文字が小文字で、単語の区切りにハイフン`-`
- 利用例 : HTMLやCSSのクラス名、ファイル名、URLパス
- 覚え方 : ケバブの串に見立てて、単語がハイフンで串刺しになっているイメージ

## スネークケース(snake_case)

- 別名 : ローワースネークケース(lower_snake_case)
- 説明 : すべての単語が小文字で、単語の区切りにアンダースコア`_`
- 利用例 : 変数名、関数名、SQLのカラム名
- 覚え方 : スネーク(蛇)が地面を這う姿をイメージ

## アッパースネークケース(UPPER_SNAKE_CASE)

- 別名 : なし
- 説明 : すべての単語が大文字で、単語の区切りにアンダースコア`_`
- 利用例 : 定数
- 覚え方 : スネークケースのアッパー(大文字)と覚える

## おまけ

**ローワーケース(lowercase)**
- すべて小文字

**アッパーケース(UPPERCASE)**
- すべて大文字
VSCodeでReact/Viteのプロジェクトをデバッグする

# VSCodeでReact/Viteのプロジェクトをデバッグする

今まで、Reactをデバッグするときは、
* `npm run dev`で開発サーバを起動
* ターミナルに表示されたURLを `ctrl+click`でブラウザを開く
* `F12`キーで、デバッグツールを起動して、`console.log`で値を確認

といった感じでした。

これでもいいのですが、コード上にブレークポイントを置いて、`F5`キーで実行としたかったので、やってみました
ちょくちょく使いそうなので、メモっておきます。
デバッガの終了にあわせて、開発サーバも停止したいのですが、気が向いたときに対応します。

## 手順

* `.vscode`フォルダに`launch.json`と`tasks.json`を配置する
* F5キーで開発サーバとブラウザ／デバッガが立ち上がる
* デバッグする
* デバッガ終了する
* 開発サーバを停止する


## launch.json

```json
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "chrome",
      "request": "launch",
      "name": "Launch Chrome against localhost",
      "url": "http://localhost:5173",
      "webRoot": "${workspaceFolder}",
      "preLaunchTask": "npm-run-dev"
    }
  ],
  "compounds": [
    {
      "name": "Start Dev Server and Debug",
      "configurations": ["Launch Chrome against localhost"],
      "preLaunchTask": "npm-run-dev",
      "stopAll": true
    }
  ]
}
```

## tasks.json

```json
{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "npm-run-dev",
      "type": "npm",
      "script": "dev",
      "detail": "Start development server",
      "isBackground": true,
      "problemMatcher": [
        {
          "pattern": [
            {
              "regexp": ".",
              "file": 1,
              "location": 2,
              "message": 3
            }
          ],
          "background": {
            "activeOnStart": true,
            "beginsPattern": ".",
            "endsPattern": ".*Local:.*"
          }
        }
      ]
    }
  ]
}
```
【初めてのNext.js】モダンな技術を使ってテックブログを作る

# はじめに
今回はNext.jsを使ってQiitaとMicroCMSから記事を閲覧できるテックブログサイトを作りました。Next.jsの他にもtailwindやdaisyUI、turbopackなど新しい技術をたくさん使ったのでそれらの初感や気づきなどをまとめていきます。
# 作ったもの
こんな感じでQiitaとMicroCMSからapi経由で記事を取得しています。今回はこのサイト内から記事を投稿したり削除したりするような機能は特に作ってないです。当たり前ですがSSRを利用したので要素の表示速度がCSRの時と全然違いました。

![スクリーンショット 2024-10-09 21.59.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3279945/62c587a8-1274-09db-4866-e34d581dc9cf.png)

# 新しく取り入れた技術と初感
### Next.js
ReactのフレームワークとしてNext.jsを学習しました。ルーティング機能がデフォルトで用意されていたりページごとhtmlの生成タイミングを制御できるので、ある程度の規模のアプリケーションであれば必須になる気がしました。ただモダンな技術ゆえにバージョンによって結構書き方が違ったりするので、検索やaiを使う際はその辺りも指定してあげる必要があると思います。

https://nextjs.org/docs
### Turbopack
Reactのみを使っていたときはviteで環境構築していましたが、今回はTurbopackを利用しました。そこまで規模が大きいものを作っているわけではないからかviteとの違いや恩恵はあまり感じませんでした。

https://turbo.build/pack/docs/why-turbopack
### TailWindCSS, DaisyUI
今まではChakraUIメインでデザインを作ってきましたが今回はTailwindを導入しました。ChakraUIに慣れていたのではじめはTailwindを使うメリットがいまいちわかりませんでしたが、cssの影響範囲を最小限にできたり、普通にcssを書くよりも記述量を減らせたり、コンポーネントに縛られないためカスタマイズしやすいなどのメリットがあるみたいです。今回はあまり使いませんでしたがDaisyUIを使えばbuttonやcardなどTailwindベースのコンポーネントを利用することもできます。

https://tailwindcss.com/docs/installation

https://daisyui.com/

### Vercel
元々firebaseでホスティングする予定でしたが、簡単で無料かつNext.jsと相性の良いVercelでホスティングしました。ただ商用アプリにする場合はfirebaseの方がコスパは良いみたいです。

https://vercel.com/docs
### QiitaとMicroCMSのAPI
記事取得の際に利用。ネットに情報がたくさん落ちていたり、docもわかりやすいので簡単に導入できました。

https://qiita.com/api/v2/docs

https://document.microcms.io/tutorial/next/next-app-router-getting-started


# 大変だったこと
今回はとにかく新しい技術への適応がとても大変でした。Turbopackでの環境構築から始まりSSRやSSGの理解、Tailwindでのスタイリングやvercelでのcicdなど慣れないことばかりでしたが公式docやネット記事を参考になんとか乗り越えれました(いまだに公式docには慣れないですが)。正直まだ全然使い慣れてるとは言えないので、これからも手を動かして技術に対する理解を深めていきたいと思います。

# おわりに
新しい技術がたくさん出てきてなかなか苦労しましたが、色々触れて楽しかったです。

# JISOUのメンバー募集中
プログラミングコーチングJISOUではメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？

気になる方はぜひHPからライン登録お願いします:point_down:

https://projisou.jp
[SAPUI5]モジュールパス取得について – 非推奨APIから推奨APIへの移行ガイド


## はじめに
皆さま、お疲れ様です。
SAPUI5の開発が進む中、過去に使われていた一部のAPIが非推奨となり、よりモダンな形式に置き換えられています。
今回はその中でも jQuery.sap.getModulePath から sap.ui.require.toUrl への移行方法について解説します。

## 背景
現在の案件では、モジュールのパスを取得するために jQuery.sap.getModulePath を利用していました。
このAPIは簡単にパスを生成できる便利なものですが、現在は sap.ui.require.toUrl が推奨されています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500270/fe05dda3-4c07-1ed3-9273-ee00da0b7b5e.png" width=80%>

:::note warn
バージョン 1.58 以降は非推奨です。
:::

## なぜ移行しないといけないのか？
1. 非推奨APIのリスク
非推奨のAPIを使い続けると、将来のバージョンアップで動作しなくなる可能性があります。

2. モダンなAPIでの開発の利点
sap.ui.require.toUrl を使うと、より シンプル で 直感的なコード が書けます。保守性や可読性の向上にもつながります。

## サンプルコード
### 従来の方法 (jQuery.sap.getModulePath)
```
let PathTest1=jQuery.sap.getModulePath("XXX.API0999","/model/sampleData.json");
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500270/4f171f29-3eb1-6596-0d9c-edcc1dae7987.png">

このように、指定したモジュールパス取得することができました。
ただし、 バージョン1.58以降 はこの方法が非推奨のため、他の方法に置き換える必要があります。

### 新しい方法 (sap.ui.require.toUrl)
SAPのAPIリファレンスでは、以下のように sap.ui.require.toUrl を使うことが推奨されています。
```
let PathTest2=sap.ui.require.toUrl("XXX/API0999/model/sampleData.json");
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500270/4f171f29-3eb1-6596-0d9c-edcc1dae7987.png">

このコードをコンソールで実行して確認すると、同じパスが取得できることが分かります。

## 最後に
この記事では、 jQuery.sap.getModulePath から sap.ui.require.toUrl への移行方法を具体例とともに解説しました。
これにより、将来のバージョンアップに備えた保守性の高いコードが書けるようになります。

この記事が、皆さまの開発に少しでもお役に立てれば幸いです。

## 参考サイト
・APIリファレンス - jQuery.sap.getModulePath
https://sapui5.hana.ondemand.com/sdk/#/api/jQuery.sap%23overview
・APIリファレンス - sap.ui.require.toUrl
https://sapui5.hana.ondemand.com/sdk/#api/sap.ui%23methods/sap.ui.require.toUrl
SAP CISで条件に応じたIdPの切り替え設定 – すべての条件を満たさない場合の対応策

## お疲れ様です。

今回は、前回紹介した IdP（Identity Provider）の仕分け に関する続編です。
お客様から、「すべての条件を満たさない場合、別のIdPへ遷移させたい」という要望が寄せられました。
この課題に対してどのように対応できるか、一旦できることを整理してみました。

前回の記事
https://qiita.com/ken_83/items/2a235f30301e7f8b5732。

## 事前準備
以下の前提条件を満たしている必要があります。

・SAP CIS が構築済みであること
・前回の記事 に目を通していること

## 実装（IPアドレス）
以下の手順に沿って、IPアドレスベースの認証ルールを設定します。

1. SAP CIS にログインします。
2. 「Application & Resource」→「Applications」を選択します。
3. 対象のアプリケーションを選択します。
4. 「Trust」→「Conditional Authentication」を選択します。
5. 「Conditional Authentication」の画面を開きます。
6. 「Default Authenticating Identity Provider」の「Default Identity Provider」に [Identity Authentication] を設定します。
7. 「Authentication Rules」→「Add Rule」を押下します。
8. 「Identity Provider」を押下し、設定する IdP を選択します。
9. 「conditions below」の IP Range に「0.0.0.0/0」を設定します。
10. このルールの 優先順位 を 最下位 に設定します。
11. 「OK」ボタンを押下して保存します。

## 最後に
「すべての条件を満たさない場合に備えた設定」は、SAP CISにおいて特定の設定オプションが存在しないため、非常に難航しました。
VPNを利用して特定のIPアドレスからのみアクセスするという案は検討しやすかったものの、 「0.0.0.0/0」 を使うというシンプルな解決策はすぐには思いつきませんでした。

このようにすることで、 条件を満たさないすべてのアクセス に対しても IdPの振り分け を柔軟に設定することが可能です。
意外とネットに情報がないSupabaseの困りごとメモ（2024/10/14現在）

# はじめに
みなさんSupabase使ってますか？
私はSupabaseを本業で使っているわけではないですが、個人開発や副業では利用していて便利さを痛感しているところです。

タイトル通り意外とSupabaseの情報って世の中になかったりするので、使っている中で私が困ったことと解決法をまとめていきます。

# ①：ローカル開発環境がWindowsで立ち上がらない。
`supabase start`した後、下記のエラーで開発環境が立ち上がらないことがあります。
```
supabase_vector_project container is not ready: unhealthy
```

こちらに関しては下記のissueで同様の問題が報告されています。
https://github.com/supabase/cli/issues/2588

記事内に指摘されているようにDockerの設定で下記項目のチェックを入れれば一応このエラーは出なくなりますが、
この設定を有効にするとセキュリティ的にあまりよろしくないです。
![スクリーンショット 2024-10-14 172438.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303906/2a35e220-575e-7fbd-6d25-bd12f7bcddba.png)

なので、暫定的にanalyticsを無効にする対応のほうが良いのではと思っています。
`config.toml`のanalytics欄を更新しましょう。
```config.toml
[analytics]
enabled = false # trueからfalseに変更
port = 54327
# Configure one of the supported backends: `postgres`, `bigquery`.
backend = "postgres"
```

# ②：debianにself-hostingできない
debianのVMインスタンスを立ち上げてそこにセルフホスティングしようとしたとき、
なぜか下記issueと同じ問題が発生しました。
https://github.com/orgs/supabase/discussions/20211

対応方法が不明なので修正されるまでは別のOSを利用したほうが良いと思います。

# ③：Windowsでsupabase link時にSASL Authentication failedが発生
Windowsだと下記実行後にデータベースのパスワード入力がうまくいかず、間違ったパスワードとして扱われてしまうことがあります。
```
supabase link --project-ref ${プロジェクトID}
```

同様の問題は下記issueで挙げられています。
https://github.com/supabase/cli/issues/1760


Powershellを利用せず、コマンドプロンプトで実行することで暫定的に解決できます。


# まとめ
皆さんが困ったときにこの記事からサクッと解決できたらうれしいです。
ありがとうございました。
[Windows] DockerでLaravel開発環境を構築

## Dockerを学ぶべきか
- 導入現場は50%未満くらい。でもモダンな開発現場だともっと高い
- 便利だし、技術的加点にもなるので学ぶのはオススメ

## Dockerとは
>Dockerは、コンテナ技術を利用してアプリケーションを効率的にデプロイ、スケール、および管理するためのプラットフォームです。Dockerは、ソフトウェアを「コンテナ」と呼ばれる独立したユニットにパッケージ化します。このコンテナは、アプリケーションコード、ランタイム、ライブラリ、および依存関係をすべて含んでおり、どの環境でも一貫して動作します

#### 例えば
複数人で開発する際に、メンバー間や本番環境で、開発環境（PHPのバージョンやDB、OS等）が異なると上手く動かない。
→ Dockerを使えば、コンテナにまとめて同じ環境を渡すことで簡単に環境を揃えることができる！

## 重要な5つの用語
1. Dockerイメージ
コンテナという料理を作るために必要なレシピのようなもの
2. Dockerコンテナ
PCの中で動く仮想環境の空間。この中にプリケーションを動かす環境を作る
3. Dockerレポジトリ
Dockerのイメージが並んでいる棚。Webプラットフォーム
ここから必要なものをとってきてイメージを定義する
4. Docker Compose
複数のDockerコンテナを1度に操作できるツール。
複数コンテナを作り、それらを連携しながらアプリケーションを作っていく
5. Dockerボリューム
データを入れて保存しておける領域。データを永続化・コンテナ間で共有できる
![Docker用語.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1830892/a5f83ddb-4a5f-dbb7-7a34-00c06dd3cb67.png)
## 今回は、比較的手軽に環境構築できる「Laravel Sail」を使う
Laravel Sailとは、ターミナルでコマンド実行するだけで、DockerでLaravel環境を一発で作ってくれる便利なコマンドラインツール。
- 事前にDocker をインストールする必要がある
- さらにWindowsの場合は「WSL」というLinux実行環境も必要

→詳細は[こちら](https://skillhub.jp/blogs/366#skillhub-subchapter-1-1)

## 環境構築手順
※環境：Windows、Laravel10

1. WSL（Windows上でLinuxを動作させるための実行環境）の導入

2. Docker Desktopのインストールし、起動

3. Laravel Sailをインストール
3-1. [Laravelの公式サイト](https://laravel.com/docs/10.x/installation)を開く
3-2. Installation > Sail on Windowsの箇所に記載されているコマンドをコピーして実行（プロジェクト名は適宜変更）
~~~
curl -s https\://laravel.build/プロジェクト名 | bash
~~~
※ただしこのコマンドではLaravelが最新バージョンになってしまう。
もし任意のバージョンを使用したい場合は後でバージョン変更すること

3-3. Ubuntuを開き、ホームディレクトリ（home\ユーザ名）に移動
3-4. 上記コマンドでLaravelプロジェクトを作成
　→ プロジェクトの作成が始まるのでしばらく待つ
 
5. 下記コマンドで、Laravel Sailを使用してDockerコンテナを起動
~~~
./vendor/bin/sail up
~~~

6. http://localhost/ にアクセスしてLaravel起動画面が表示されていれば成功
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1830892/7c1506bd-f3ba-4f0b-dc41-5af139088016.png" width="50%">


## 【番外編】Breezeでログイン画面を簡単に作成
Breezeライブラリのインストール
~~~
./vendor/bin/sail composer require laravel/breeze --dev
~~~

プロジェクトにBreeze（認証機能など）を導入
~~~
./vendor/bin/sail artisan breeze:install
~~~

## 日本語化

## 参考リンク一覧
- [Docker知らないとWeb開発を任せられない？Dockerは初学者に必須？](https://youtu.be/_H1d7DuzC_c?si=lF9sQm9aKKN8Z0sZ)

- [世界一わかりやすいDocker入門！爆速で開発環境を作る方法](https://youtu.be/YfaB3PJv1f0?si=9Rvb3FFWpPjTAqOj)

- [Laravel 10 + Breezeでログイン画面を簡単に作成しよう](https://youtu.be/OZ2ks5wJiZ0?si=gWxGWM26wGLbH0t8)

- [Docker超入門講座 合併版 | ゼロから実践する4時間のフルコース](https://youtu.be/lZD1MIHwMBY?si=V-lMhL2uKXFuaILc)

- [sail upしたときにsessionsテーブルがないというエラーが出たときの対処法](https://zenn.dev/aki_artisan/articles/sail-error-sessions)
ミニPCの仮想ゲストをブリッジ接続＆gitlab構築

# 概要
前回作成したミニPC

https://qiita.com/itohdaigo/items/b7480df7f25a69461602

に対して、新たにブリッジ接続するための設定を行い、仮想ホスト以外のPCからアクセスできるようにする。
さらに、それで作った仮想ゲスト(Almalinux9.3)にdockerを構築し、その上でgitlabを構築できるようにする。完成後の構成図は以下の通り。

![スクリーンショット 2024-10-14 17.04.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/4b72a6ca-43ab-bf26-706f-19bf8032d155.png)


# KVMゲストを、外部（仮想ホスト以外）からアクセスできるようにする。
以下の手順を参考にする。なお、外部とはいってもグローバルIPはつけないので、自宅のネットワーク環境内部にある、他のVMなどからのアクセスという意味である。

https://qiita.com/yoshiyasu1111/items/8d07a4fd55116fba07f7

デフォルトでvirbr0という名前のブリッジが作成されているが、NAT接続されているため、外部から仮想ゲストに対してアクセスする事ができない。
新しくbr0をいう名前のブリッジを作成してホストと同じネットワークに接続していく。

また、ゲストを作成するときに`permission denied`が再度出力されたので、以下の手順を試して、無事にゲストを作成する事ができた。ここで変えたのは`/etc/libvirt/qemu.conf`の変更と、libvirtの再起動だけであるが。

https://qiita.com/engishoma/items/695fea4656876f93317d

# dockerのインストール。
これは単純。以下のコマンドを実行する。
```
sudo yum install docker
```


## Gitlabを立てる
以下の手順を参考にする。

https://qiita.com/suzukihi724/items/55de461d8cdfa3459f11

まずは、SELinuxを無効にする。
```
vi /etc/selinux/config
```
```:編集内容
SELINUX=disabled
```
その後、再起動させる。
```
sudo reboot
```
そして、まずは以下のコマンドを実行し、gitlabの構築に使うストレージとなるディレクトリを作成する。
```
mkdir -p /srv/gitlab/config
mkdir -p /srv/gitlab/logs
mkdir -p /srv/gitlab/data
```

その後、以下のコマンドを実行すれば、gitlabを使えるようになる。
ここではdockerホストの
- 80番ポート
- 443番ポート
- 2222番ポート
を使っている。22番を本来sshで使うが、かぶりにより立ち上げる事ができなかったので、2222にしている。（普段のSSHとかぶっているのであろう。）

```
sudo docker run --detach \
  --hostname gitlab.example.com \
  --publish 443:443 --publish 80:80 --publish 2222:22 \
  --name gitlab \
  --restart always \
  --volume $GITLAB_HOME/config:/etc/gitlab \
  --volume $GITLAB_HOME/logs:/var/log/gitlab \
  --volume $GITLAB_HOME/data:/var/opt/gitlab \
  gitlab/gitlab-ee:latest
```

5分ほど待つと、立ち上がるのがわかる。
```
[root@my-docker setup]# docker ps
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
CONTAINER ID  IMAGE                              COMMAND          CREATED      STATUS                PORTS                                                           NAMES
e8bddaad9405  docker.io/gitlab/gitlab-ee:latest  /assets/wrapper  2 hours ago  Up 2 hours (healthy)  0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:2222->22/tcp  gitlab
[root@my-docker setup]# 
[root@my-docker setup]# 
```

以下のコマンドを実行し、gitlabの初期パスワードを確認する。（コンテナのログの中に含まれているらしい。）
```
 sudo docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
```
ユーザー名:root
パスワード:先ほどのコマンドから取得したもの
で、ログインできる。
![スクリーンショット 2024-10-14 16.11.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/1b85f53d-5f5a-7d2f-89d9-a2014676ab37.png)

ログインするとこのような形でちゃんとダッシュボードに入れるのがわかる。

![スクリーンショット 2024-10-14 16.36.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/711e1e3c-25c8-1856-d521-a75394af03e6.png)
プリンシプルオブプログラミングを読んで

## はじめに

本記事は[プリンシプルオブプログラミング](https://www.shuwasystem.co.jp/book/9784798046143.html)を読み、重要な箇所をまとめた内容です。
プリンシプルオブプログラミングはプログラミングに関する様々な原則、アンチパターンなどが記載されている書籍です。
全500ページほどと、かなりのボリュームですがエンジニア・プログラマーとして働くために抑えておきたい知識が詰まっているため、ぜひ1度読んで見ることをお勧めします。

## 前提〜プログラミングの変わらぬ真実〜

- プログラミングにシルバーバレットはない
    - どんな時にも使える万能なものはなく、その時のケースによって必要なもの、最適なものは異なる
- コードは変更されると思って記述する
    - コードを記述するときよりも保守の時間のほうが長い
    - 変更に強く読みやすいコードを心がける
- 目的を意識する
- コードを読む側の視点になってコードを書く
- コードについて
    - 読みやすく
    - シンプルに
    - 柔軟に変更できるように
    - 似た内容は同じ箇所に
    - 繰り返しは最小限に
    - ロジックとデータは近くに
        - どちらかを修正するときはもう一方も修正することがあるため
    - コードに一貫性・対称性を持たせる
        - スネークケースで統一するなどぱっと見で規則性がわかるように

## 原則〜プログラミングのガイドライン〜

- KISS
    - コードはシンプルに
- DRY(Dont Repeat Yourself)
    - 繰り返しはやめよう
- YAGNI
    - 多分必要になるだろうと思ってコードを書かず、必要になった時に書く
- PIE
    - 読みやすいコードに
    - 書きやすいより読みやすいを優先に
- SLAP
    - コードのレベルを合わせよう
    - 似たようなコードは同じ箇所に固める
- OCP
    - 拡張に対して開いている・修正に対して閉じているを意識して設計する

## 思想〜プログラミングのイデオロギー〜

- アーキテクチャ根底技法
    - 抽象
    - カプセル化
    - 情報隠蔽
    - パッケージ化
    - 関心の分離
    - 充足性・完全性・プリミティブ性
    - ポリシーと実装の分離
    - インタフェースと実装の分離
    - 参照の一点性
        - 変数の再代入は行わず、宣言され定義されるのは1回限りにする
    - 分割統治
- アーキテクチャ非機能要件
    - 変更容易性
    - 相互運用性
    - 効率性
    - 信頼性
    - テスト容易性
    - 再利用性
- 7つの設計原理
    - 単純原理
    - 同型原理
    - 対称原理
    - 階層原理
    - 透明原理
    - 明証原理
        - ロジックは明瞭に
    - 線形原理
        - 処理の流れは直線に、分岐の少ないコードに
- UNIX思想
    - モジュール化の原則
    - 明確性の原則
    - 組み立て部品の原則
    - 分離の原則
    - 単純性の原則
    - 倹約の原則
        - 大きなコードは書かない
    - 透明性の原則
    - 安定性の原則
    - 表現性の原則
    - 驚き最小の原則
        - 一般的な慣例に従う
        - このインタフェースならこう使うだろう
    - 沈黙の原則
        - 重要な情報のみを表示出力する
    - 修復の原則
        - 修復に失敗したら処理は継続せずその時点でエラーにする
    - 経済性の原則
    - 生成の原則
    - 最適化の原則
    - 多様性の原則
        - プログラミングに正解はないのでより良いやり方を求め続ける
    - 拡張性の原則
- UNIX哲学
    - 小は美なり
    - レバレッジ・ソフトウエア
        - 既存のソフトウェア、ライブラリを活用する
    - 1つ1仕事
    - シェルスクリプト活用
        - シェルスクリプトはプラットフォーム専用のバイナリにコンパイルする必要がないため、グルー言語として使える
    - 即行プロトタイプ
    - 対話インタフェース回避
    - 効率性より移植性
    - フィルタ化
        - フィルタは入力に何かしらの処理をし、その結果を出力すること
        - すべてのソフトウェアはフィルタであるべき
    - データはテキスト
        - バイナリファイルよりテキストファイル
- UNIX哲学小定理
    - 環境カスタマイイズ
    - 軽薄短小カーネル
    - 小文字使用
    - 森林保護
        - 紙のデータは利用しない
    - 沈黙は金
    - 並列思考
    - 部品コラボレーション
    - 90パーセント解
    - 劣るが優る
    - 階層思考

## 視点〜プログラマの観る角度〜

- モジュールは凝縮度を高く
- 疎遠に
- 可逆性を持つ
- 急がば回れ

## 手法〜プログラマの道具箱〜

- かもしれないと考えてプログラミングする
- 開発したソフトウェアは自分で使ってみる
- 誰かもしくはゴムのアヒルのようなものに向かって説明することで自己理解が深まる

## 法則〜プログラミングのアンチパターン

- 状況や背景を明確に
- すでにあるものは利用する

## まとめ

最初の原則にあるようにプログラミングにシルバーバレットは存在しません。また、原則の中には相反するものもあり、状況に応じて適切な選択が異なるため、必ずしもすべての原則を満たす必要はありません。

プロジェクトによっては、一般的な原則よりも特定の方針を重視する場合があります。そのため、基本的にはプロジェクトの慣習に従うことが重要です。

今回のプリンシプルオブプログラミングに記載されている原則に加えて、各プログラミング言語には独自のコーディング規則があります。これらの規則にも従うべきでしょう。

https://qiita.com/moaible/items/134329123074337913fb
Ubuntu で日本語キーボードと Bluetooth 英語キーボードを共存させつつ、 Caps キーを Ctrl キーに変換する

0\. 前説

Linux ノートPCを使い込んでいくと、だんだんキーボードに不満を感じるようになります。
また、膝にノートPCを載せて使うのもしんどかったりします。
そこで、サブのキーボードが欲しくなります。
Aliexpress を眺めていると、安価な Bluetooth 日本語キーボードを幾つか見つけましたので、ものは試しにと買ってみました。
よぉ〜っく見ると、これは日本語キーボード風に見せた英語キーボードでした。「0」キーの右隣が「-/=」なら日本語キーボード、「-/_」なら英語キーボードです。
全くの不良品を掴まされた訳ではありませんし、返品もかなり面倒です。
折角ですので、これを機に英語キーボードにも少しずつ慣れてみることとしました。
軽くてブラインドタッチもさほど支障がありませんし、何より安い。
気に入らなければ類似の英語キーボードを物色すれば良いことですし。
という訳で、

1\. 目的

+ ノートPC標準装備の日本語キーボード
と
+ Bluetooth 英語キーボード

を共存させつつ、日本語入力もできるように構成し、なお且つ、 Caps キーを Ctrl キーに変更する、といったことを実現しようと頑張ったところ、だいぶハマりましたのでここにメモを記しておきます。

2\. 前提条件

なお、環境は Ubuntu 系限定です。また、 X.org 環境です。 Wayland ではありません。
RedHat 系はやるなとは言いませんが、日本語入力環境の構築からだいぶ苦労すると思いますのでお薦めしません。少なくとも私は嫌になって辞めました。
参考までに、実行環境:
Dell Vostro 3578
CPU: Core i3-8130U
Memory: 4GB
SSD: 128GB
OS: Ubuntu 24.04 LTS

3\. 結論から申し上げますと

+ 予め mozc と fcitx5 をインストールしておく
+ fcitx5 設定で英語キーボードレイアウトを追加する
Ctrl+Space で、日本語キーボード / mozc / 英語キーボードを切り替えることができます。(ちょっとめんどいけど)
![スクリーンショット_2024-10-14_16-29-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628083/a04ba9de-21c8-b74a-ca17-1efea234965c.png)
+ $ setxkbmap -option ctrl:nocaps を実行

これでOKです。
そして逆に

4\. やってはいけないことは

+ $ xmodmap ~/.Xmodmap でCapsキーを変更する

です。
これでハマりました。

5\. 聞いてくださいよ、どんな風にハマったか。

xmodmap を実行すると、
日本語キーボードの時は Caps キーが正常に Ctrl キーに変わってくれますが、
英語キーボードの時は何故か Caps キーが Shift キーになってしまいます。なのに Caps+Space でキーボードの切り替えができるという。なんなんだ一体。
スキャンコードか何かがおかしいのかと思い、 xev で確認してみても、日本語キーボードと英語キーボードでスキャンコードもキーコードも全く変わらず。
だいぶ悩みましたが、
https://wiki.archlinux.jp/index.php/%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E5%85%A5%E5%8A%9B
https://wiki.archlinux.jp/index.php/Xorg/%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E8%A8%AD%E5%AE%9A
http://www.est.hi-ho.ne.jp/suikodow/linux/xkboptions.htm
を参考に、ものは試しにと $ setxkbmap -option ctrl:nocaps を実行したところ、あっさり解決。

6\. 因みに

(1) ログイン時に mozc が自動起動しない場合には

~/.config/autostart/ に、以下の内容を記述した fcitx5.desktop を作成します。
```
[Desktop Entry]
Type=Application
Exec=fcitx5
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name[en_US]=fcitx5
Name=fcitx5
Comment[en_US]=Start fcitx5
Comment=Start fcitx5
```
(2) Remmina で Caps キーを Ctrl キーに変換するには

[Remminaの設定] - [RDP] - [Keyboard scancode remapping] に "0x3a=0x1d" を記入。
![スクリーンショット_2024-10-14_16-45-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628083/ea68c3d8-642c-2d0d-67ac-6de17928a13e.png)
です。 ~/.config/remmina/remmina.pref には
```
(snip)
rdp_use_client_keymap=0
rdp_disable_smooth_scrolling=0
rdp_reconnect_attempts=
rdp_kbd_remap=0x3a=0x1d
rdp_quality_0=6F
rdp_quality_1=7
rdp_quality_2=1
rdp_quality_9=80
rdp_deviceScaleFactor=0
rdp_desktopScaleFactor=0
rdp_desktopOrientation=0
(snip)
```
という値が記述されていました。
一見、関係ないように見えるかもしれませんが、 Caps キーを Ctrl キーに変換する際、 RDP クライアントが鬼門でした。これもだいぶハマりました。
VirtualBoxを使用して、windows11にUbuntuをインストールする。

本記事では、Windows上でVirtualBoxをインストールする方法を記述していきます。
まず、こちらのサイトにアクセスしてください。
https://www.oracle.com/jp/virtualization/technologies/vm/downloads/virtualbox-downloads.html
上記のサイトからプラットフォームがwindowsのインストーラーをダウンロードし、ファイルを開いてください。
すると、以下のような画面が表示されると思います。
    
![スクリーンショット (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3909672/15ef4ffa-1116-c10f-eb77-eebd40eff435.png)
    
設定は基本的にデフォルトで問題ないので、以下のようにinstallと表示される画面までnextを押してください。
インストールを開始して、完了後、Finishをクリックすれば、インストールは完了です。
次に、インストールされたVirtualBoxをクリックし、起動してください。
すると、以下のような画面が表示されると思います。
    
![スクリーンショット (17).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3909672/a581a471-4851-cc95-04b1-d557b79cf12a.png)
    
「新規」をクリックすると、仮想マシンの名前と、OSを選択する画面が表示されます。
名前は好きなものを入力してください。
ISOイメージは別途ダウンロードしなければ選択できないので、以下のサイトから「ubuntu-ja-22.04-desktop-amd64.iso.torrent」をダウンロードし、選択してください。
https://ftp.kddilabs.jp/Linux/packages/ubuntu-jp/release-cd/releases/jammy/
ISOイメージの選択が完了したら、タイプ（T）を「Linux」、subtypeを「Oracle Linux」、バージョン（V)を「Oracle Linux（64bit)」に設定してください。
その後、メインメモリー、プロセッサ数、ディスクサイズの設定画面が表示されますが、値が低いと仮想マシンの動作が遅くなるので、可能な限り高く設定することを推奨します。私は、メインメモリーを11070MB、プロセッサーを6、ビデオメモリーを128MBに設定しています。
「完了」を選択すると、仮想マシンの完成です。
　
参考文献
水野源著、小林準監（2022）『Linuxをマスターしたい人のための実践Ubuntu』、日経印刷株式会社
LangGraphでChatHistoryを入れる

## やりたいこと

LangGraphに過去のChat Historyもいれて解答生成したい

## 公式ドキュメント

https://langchain-ai.github.io/langgraph/how-tos/memory/manage-conversation-history/

こちらを読むと `MessagesState` でやっているのですが、任意のGraphでも可能です。(よくよく考えてみると当たり前ですが‥)

## Steps

### step1: `chat_history` をStateに追加

例.

```py
class GraphState(TypedDict):
    """
    Represents the state of our graph.

    Attributes:
        question: question
        generation: LLM generation
        documents: list of documents
        chat_history: list of messages
    """

    question: str
    generation: str
    documents: List[str]
    chat_history: List[BaseMessage]
```

### step2: Promptに `MessagesPlaceholder("chat_history")` を入れる

Chainで過去のメッセージを使いたいところに`MessagesPlaceholder("chat_history")` を入れる

```py
from langchain_core.prompts import MessagesPlaceholder
# Generate
messages = (
    [
        ("system", generate_prompt_template),
        MessagesPlaceholder("chat_history"),
    ]
)

# messages = [("system", generate_prompt_template)] # chat_historyなしの場合
generate_prompt = ChatPromptTemplate.from_messages(messages=messages)
rag_chain = generate_prompt | chat | StrOutputParser()
```

### step3: invoke時に `chat_history`を渡す

```py
inputs = {"question": "Resource Lockについて教えてください。", "chat_history": []}
res = app.invoke(inputs, stream_mode="values")
```
~未経験・知識ほぼナシからセキュリティエンジニアになる人！~『きっかけはネット広告からでした｛Level１｝』

初めまして!
この記事を見てくれたということは、あなたもIT未経験もしくはセキュリティエンジニアを目指す同志、はたまた「なんだこいつ、面白そうなやつならフォローしてみるか」と、休憩の間に暇つぶしを見つけた経験者様なのでしょうか。

改めまして、自己紹介させていただきます。
Itoshinと申します。IT未経験の30代！現在ほぼ無職（朝だけ委託業務）。
中程度の難聴持ち（障害者認定はされないのだ）で、視覚優位タイプであります。
同じようなハンデ持ちの経験者様がいたら、是非近況をお聞きしたいです。
運動は得意、"つまらない"勉強は苦手！（いかに面白がれるかが肝心です）
最近のルーティンは｛筋トレ・Youtube・振り返り｝
面白いYouTubeチャンネルがあったら教えてください！
セキュリティ芸人のアスースン・オンラインさん最近よく観てます。
セキュリティエンジニアになるため、基礎知識から半年ほどリモート受講も可能な講座を受け始めたばかりですが、興味のあることを学ぶ時間というのは代えがたい充実感がありますね！
なにぶん初心者なもので、Qiitaをどのように活用して良いかまだよく分かっていません。
「これやってみるといいよ！」「ふーん、面白いじゃん。」などご意見、反応いただけたら継続の力になります。
どうぞこれからよろしくお願いします('◇')ゞ

私と同じくIT未経験、20代というキャリア形成のために最も有利な期間が終わってしまい、自分の個性を活かせる同世代とはなんとなく差が付いたなぁと感じるけど、
「まだだ！まだ終わらんよ！」と言えるあきらめの悪く、変化を求める同志諸君がいるとしたら、よりシンパシーと今後を共に応援し合えるよう、聞かれそうな質問を今日は答えていこうと思う。

Q.なぜセキュリティエンジニアになろうと思ったのか
A.内的要因としては［（ホワイト）ハッカーに少なからず憧れがあったから］、
実写ドラマにもなった、主人公がホワイトハッカーで活躍する漫画の影響もあったかもしれない。他にも年齢や体力に依存しないスキルを身に着けたいと考えるようになったのも理由。
外的要因としては［たまたま、国が第四次産業革命の一つとしてサイバーセキュリティ人材の育成を挙げており、その助けとなる補助金政策があったから］と、
［よく観るYouTubeやネットサーフィンでIT訓練学校のネット広告をかなり前から気になっていたから］。情弱と思われてもいい。大事なのは共に学習する人がいるコミュニティに属することだった。

Q.Qiitaで発信しようと思ったきっかけ
A.Qiita自体は以前から認知はしていたのだけど、活用方法やそもそものIT知識の勉強の仕方が分からなかった。前問の訓練学校のキャリアカウンセラー（以下略　Kさん）に最初の相談面接にて
Kさん「Qiitaって知ってる？」
私「クイタ...？（クリタに聞き間違えたかな？そんな人いたっけ？）クイタさんなんておられましたっけ...？」

...我ながら、サイトの存在を認知していたにも拘わらず、よくもこんな天然ボケをかましたものである。難聴で聞き間違いは多々あるものの、正確に聴き取っててもなお、よく誤変換することがある・・・。
だからこそ、聞き返すことは大事だ。

そんなこんなで改めて再認識したQiitaの活用方法の一つとして、教えていただいたのが以下だった。

・講座外学習で不明点があった際の質問板として、既知の人を頼る使い方。
（Yahoo!知恵袋みたいな感じでいいのかも）

・自分の学習したことをアウトプットする日誌のような使い方。
（他人に説明できるくらいの『言語化』ができるようになることが特に重要！）

・いざ就職活動の際に採用担当者への自己PRする記録にする使い方。
（継続して学習内容や近況をテキストで残しておくと、成長推移や継続力、取り組む姿勢、任せられそうな分野など採用者側が"深く知りたい"ことをアピールできる）

他にもあったら是非ご教授願いたい。

（そういえば、この記事書き始めて2時間くらい経ってしまったけど、皆1記事にどれくらい時間掛けているのだろう。個人的には30分程度に抑えて書き上げられるようにして、学習時間を削らないようにしたいな。そうか！スキマ時間にスマホで書いたらどうだろう？まぁやってみよう！）

【本日の課題】
・記事制作時間を２時間から1時間以内へ
・次回からは学習アウトプット
・アップペースをどうするか
（毎日はキツそう・・・。でも、ほぼ毎日勉強だしな～。とりあえず軽いのを3週間続けることを意識してみよう。ダメそうなら1.5日に1回。）

初めての投稿なのに、長文になってしまった気がする。
読んでくださり、ありがとう。
Have a great day!:thumbsup:
Git で squash merge後にmergeされたコミットを含むbranchがコンフリクトするのを解決する

# 問題

`feature-branch-a` から生やした `feature-branch-b` で開発中に、`feature-branch-a` が `main`にマージされると `feature-branch-b`が`main`とコンフリクトする。

特にSquash Mergeを使っていると起こる

# 解決方法

自分のローカルに `feature-branch-a`が残っていれば、以下の用にすることで、`feature-branch-a`と`feature-branch-b`の差分を`origin/main`に乗せることができる。

```
g rebase --onto origin/main feature-branch-a feature-branch-b
```

# その他

feature branchでなくても、自分が作業していたPRをマージした後に、同じbranch上で続けて作業コミットを載せてしまい、これもPR作成時にコンフリクトが発生する。

この場合は上のやり方をブランチで見ていると修正方法がわからなくなるが、このケースは以下のようにすれば解決できる。

```
g rebase --onto origin/main <すでにマージされ済みの最新のCommit> my-branch
```

解釈としては、以下のように

:::note info
「`1つ目指定したcommit or branch`と`2つ目指定したcommit or branch`の差分を`origin/main`に乗せる」とおぼえておけば迷わなくなる
:::


```
g rebase --onto origin/main <すでにマージされ済みの最新のCommit> <自分の作業しているbranch or 載せたい最新のCommit>
```

# Ref

- https://journal.lampetty.net/entry/resolve-squash-merge-conflict
- https://qiita.com/sotarok/items/07c6b2cca5ed2f9a53a6