OmniAICreator/Qiita-1.07M huggingface dataset:
ファイルのバックアップを自動で保存する Windows アプリケーションを公開してみる

ファイルが保存される度に
バックアップを保存する
アプリケーションを開発したため
皆さんの役に立てればと思い
ソースと本体を公開したいと思います。

[本体はこちら(BOOTH)](https://giftedstyle.booth.pm/items/6169149)
[本体はこちら(Google Drive)](https://drive.google.com/file/d/1xAM3Byw9XW-gTQKeTE0ZRdjjroNZPiJJ/view?usp=sharing)

＜利用規約＞
・自作発言のみ禁止とさせて下さい。
　禁止内容には我々に対し著作権を主張する事を含みます。
・再配布・販売 OK です。
・加工後の再配布・販売も OK です。
・再配布・販売の際に
　独自のライセンスを付与する事も許可します。
　ただし自作発言禁止のルールに関してのみ
　反しないようにお願いします。
・自作発言をしないならば
　アプリケーション名を変えて
　再配布・販売をして頂いてもかまいません。

＜免責事項＞
当アプリケーションのダウンロード、およびご利用に伴い発生した事象については責任を負いかねます。ご利用は自己責任でお願いします。

＜クレジット表記について＞
特に必要ありません。気軽にお使いください。

***

指定した秒ごとに 1 回バックアップを保存します。
各ファイルの指定した個数以上前のデータは削除されます。
バックアップは最後に更新された内容で取ります。

イラストレーター等
1GB 程度の巨大なファイルに適しています。

容量の少ないファイルのバックアップを取る場合は
[ファイルが更新される度に自動でバックアップを保存する Windows アプリケーション](https://qiita.com/uni928/items/ab9a03a666477f502658)
の方をご利用ください。
そちらは 3 作業日以上前のデータは
その日の最終更新データ以外は
削除する機能が盛り込まれております。

あくまでもファイルが保存されている場合に
バックアップを定期的に実行するだけなので
ファイルを保存する機能自体はありません。
Ctrl + S など保存自体は
手動で行う必要があります。

![SephirothBigFileAutoBackUP_image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3752886/e5bf04a8-3d3d-f19e-cdc6-3ec2817b4680.png)
![SephirothBigFileAutoBackUP_image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3752886/02e323c5-30ef-a231-7b3c-b319c66e8bf0.png)

***

操作手順

「ここに自動でバックアップを取りたいファイル orフォルダを
　ドラッグ＆ドロップして下さい。」
と書かれた文字の上あたりに
フォルダ or ファイルをドラッグ＆ドロップする事で
そのフォルダ or ファイルを監視できます。

監視しているファイル・フォルダのみ
自動でバックアップを保存します。

ドラッグ＆ドロップの具体的な手順は以下の通りです。

1. エクスプローラーで監視したいフォルダ or ファイルを選択します。
2. 選択した場所にポインタを合わせて、マウスの左を押しながら、
　「ここに自動でバックアップを取りたいファイル orフォルダを
　　ドラッグ＆ドロップして下さい。」
　の文字の上までドラッグします。
3. マウスの左を離します。 するとそのフォルダ or ファイルが
　監視されます。

監視を終了したい場合は
パスを選択して
「選択中の要素の監視を終了」
を押して下さい。

「バックアップを何個まで作るか」
にはバックアップを何個まで作るかを
数値で指定して下さい。
1GB 程度のファイルを監視する場合は
10 程度に抑える事を推奨します。

「バックアップを何個まで作るか」
に 0 以下の数値を指定すると
バックアップを何個でも
作るようになります。

「何秒に 1 回保存するか」
にはバックアップを
何秒に 1 回保存するかを
数値で指定して下さい。
1GB 程度のファイルを監視する場合は
1800 程度まで大きくする事を推奨します。

***

このアプリケーションの概要

ファイル or フォルダを監視して
その中のファイルの更新があった場合に
自動でバックアップを取ります。

例えば Folder フォルダの中に
index.php があったとすると
Folder フォルダを監視しておけば
index.php が更新された時に
自動でバックアップファイルが生成されます。

バックアップファイルの書式は
更新日_ファイル名.zip です。
例えば 20240401-123021_index.php.zip のような
ファイル名になります。

Folder フォルダを監視している場合は
Folder フォルダと同じ場所に
Folder_BackUP フォルダが生成されて
その中にバックアップが生成されます。

監視しているフォルダの中に
フォルダがあるならば
そのフォルダも監視対象です。
つまり子要素孫要素が対象になります。

プログラミング等で使用する場合は
基本的にフォルダを監視する事を推奨します。

仮に実行時にエラーが出たとしても
監視対象のフォルダ内のデータが
書き換えられることは決してありません。
安心してご利用下さい。

PC 起動時のスタートアップアプリケーションに
登録する事で監視を自動化できます。

***

プロジェクトファイルの配布

プロジェクトファイルは
下記の URL からダウンロードして下さい。
Visual Studio で開くことができます。
[https://drive.google.com/file/d/1YIe348fn_6kQIN5v2CNgl_2n_oNFPT7n/view?usp=sharing](https://drive.google.com/file/d/1YIe348fn_6kQIN5v2CNgl_2n_oNFPT7n/view?usp=sharing)

***

以上ファイルの自動バックアップの
Windows アプリケーションを公開しました。

このアプリケーションを使えば
午前中のデータを拾いたいといった場合に
拾うことができるかもしれません。

このアプリケーションが
皆さんの役に立てたならば嬉しいです。

皆さんの開発の助けになれますように。
閲覧ありがとうございました。
【市民開発者】ローコード開発を行うためのライセンス【Microsoft365】

Microsoft 365ライセンスを使って簡単な社内業務の改善をしたい方向けです！

既にお持ちのライセンスで何ができるかをまとめてみました。

## 1.　業務改善に必要なアプリ一覧
* SharePoint
* Power Apps
* Power Automate

基本はこの3つを使えると改善できることは山ほどあります。

## 2. 必要なMicrosoft 365ライセンス
Microsoft 365にはさまざまなライセンスプランがあり、それぞれのプランで利用できる機能が異なります。以下に、主要なライセンスプランと、それぞれのプランでPowerApps、PowerAutomate、SharePoint、Copilotが利用できるかどうかをまとめました。
Microsoft 365 ライセンスプラン（2024年10月7日現在買うことができるライセンス）と機能対応表
 
| ライセンスプラン                | PowerApps | PowerAutomate | SharePoint | Copilot |
|---------------------------------|-----------|---------------|------------|---------|
| Microsoft 365 Family            | ❌        | ❌            | ❌         | ❌      |
| Microsoft 365 Personal          | ❌        | ❌            | ❌         | ❌      |
| Microsoft 365 Business Basic    | ✅        | ✅            | ✅         | ❌      |
| Microsoft 365 Business Standard | ✅        | ✅            | ✅         | ❌      |
| Microsoft 365 Business Premium  | ✅        | ✅            | ✅         | ❌      |
| Microsoft 365 Apps for Business | ❌        | ❌            | ❌         | ❌      |
| Microsoft 365 E3                | ✅        | ✅            | ✅         | ❌      |
| Microsoft 365 E5                | ✅        | ✅            | ✅         | ✅      |
| Microsoft 365 F3                | ✅        | ✅            | ✅         | ❌      |
| Microsoft 365 A1 (教育機関向け) | ✅        | ✅            | ✅         | ❌      |
| Microsoft 365 A3 (教育機関向け) | ✅        | ✅            | ✅         | ❌      |
| Microsoft 365 A5 (教育機関向け) | ✅        | ✅            | ✅         | ✅      |

※2024年10月14日現在

## 3. Microsoftによる公式ライセンス比較
https://cdn-dynmedia-1.microsoft.com/is/content/microsoftcorp/microsoft/final/ja-jp/microsoft-brand/documents/Power%20Platform%20Licensing%20Guide%20June%202024.pdf

マイクロフトとしても定期的にライセンスガイドを出してくれています。
少し読みづらいですが正しい情報が記載されています。

頻繁に仕様が変わるのでライセンス購入を考えている方はしっかり解読しましょうか。
ラズベリーパイでAIを使った人検知監視カメラを作成してみた。


## イメージ
![20241014_100241.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/3dec5e70-7c74-7c57-7848-35e90ff608aa.jpeg)

## 仕様
カメラの前に人が通ったら写真を撮影する。撮影した画像は自分のLINEに送信される。

## 背景
監視カメラを自作するにあたって、色々なセンサを試しました。
・人感センサ HC-SR501
→4つ買ったけど4つとも誤検知ありで使いものにならなかった。
・超音波センサ HC-SR04
→1つ試したけど誤検知ありで、使えないと判断した。

## AIで人認識させたときだけ撮影する方法でうまく行ったのでやり方を記録します。

### 用意するもの 買うもの
ラズベリーパイ4B
ラズパイ用カメラモジュール（USBカメラでも良い

ラズベリーパイセットアップ環境（パソコン、マウス、キーボード、あればOK

ラズベリーパイの備品（マイクロSD、電源アダプタ、モニター接続用のHDMIなど

### ラズパイセットアップ
セットアップ

https://qiita.com/arisaEN/items/476399577755da1fcd86

IP固定

https://qiita.com/arisaEN/items/78caa649b89a4eb9f92b

samba設定

https://qiita.com/SHIJIMI_EN/items/9904ae0f17b5d329f192

### Gitからプログラムダウンロード

https://github.com/arisaEN/human-detection

CodeからDownloadしてください。

階層は↓参照

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/f9fa803f-894b-a365-98af-0e0af049a0d0.png)




## ライブラリインストール
```
sudo apt update
sudo apt full-upgrade -y
```

```
sudo apt install python3-pip python3-opencv libatlas-base-dev libjasper-dev libqtgui4 libqt4-test -y
sudo apt install libopenjp2-7 libtiff5 -y
sudo apt install python3-picamera2
```

```
sudo apt install python3-numpy python3-requests
```

```
sudo apt update
sudo apt install python3-opencv
```

```
sudo apt update
sudo apt install python3-opencv python3-picamera2 -y
```

```
git config --global http.postBuffer 524288000
git clone git@github.com:raspberrypi/picamera2.git
```
```
sudo apt install alsa-utils
```
```
sudo apt install open-jtalk hts-voice-nitech-jp-atr503-m001
```


## プログラム説明
フォルダpicに撮影した写真が入る。
フォルダmodelは人検知用のモデル
フォルダscriptsに監視カメラ実行用のプログラム入っています。
→human_detection.py 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/03ebabc3-ba52-70c7-38b8-a259c67c9fb0.png)

~~写真のアクセストークンと、base_dirと、save_dirはあなたの環境に合わせてください。~~
~~↓LINEアクセストークン発行~~
~~https://poster.ooo/howto/check-access-token/~~

~~実行すると プレビュー画面が出てきて、カメラの前を人がとおると、バウンディングボックスで人が囲まれ、LINEに写真が送信されます。~~

2025/3 LINE Notifyがサ終するのでdiscord webhookに通知サービスを移行しました。


## ラズパイ起動時にプログラムを実行させる
ターミナル起動
```
cd /etc/systemd/system/
```
```
sudo apt update
sudo apt install nano
```
nanoを使えるようにする
```
sudo nano test.service
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/f0edcc8c-7e77-ae7b-fdeb-02a0c78d7aec.png)
```
[Unit]
Description=Do test
After=network.target

[Service]
ExecStart=/usr/bin/python3 /home/arisa2/human_detection/scripts/human_detection.py
Restart=on-failure

[Install]
WantedBy=multi-user.target
```
これをtest.serviceに書きます。
Description：起動するコマンドの概要を書く（任意のテキスト）

ExecStart：起動するコマンドを書く（上記の例はデスクトップに置いたtest.pyを実行しています。コマンドも含めて絶対パスにする必要があります）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/617bcfd9-2dc6-cca5-892f-52ecc39081ff.png)

Ctrl + O 保存
Enter ファイル名決定
Ctrl + X 戻る

### 起動時に実行する設定
```
sudo systemctl enable test.service
```

### 起動時に実行をやめる設定
```
cd /etc/systemd/system/
```

```
sudo systemctl disable test.service
```
参考↓
https://www.pc-koubou.jp/magazine/52061
vbsの作法 その87

# 概要
vbsの作法、調べてみた。
練習問題やってみた。

# 練習問題
IE11で、タイトルとディスクリプションを取得せよ。

# サンプルコード

```

Dim ws
Set ws = WScript.CreateObject("WScript.Shell")
Dim objIE
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
objIE.Navigate "https://auctions.yahoo.co.jp"
ws.AppActivate("Internet Explorer")

Do While objIE.ReadyState <> 4 Or objIE.Busy = True
    WScript.Sleep 100
Loop

For Each elm In objIE.Document.getElementsByTagName("meta")
	If elm.name = "description" then
		WScript.Echo "Title: " & objIE.Document.Title
		WScript.Echo "description: " & elm.Content
	End If
Next

objIE.Quit
Set objIE = Nothing




```

以上
Ubuntu22.04以降で起きるアプリケーション不具合の解決法

# Ubuntu環境をマルっと更新
とあるライブラリのインストールパッケージを作るために、試していたところいろんな環境をインストールする必要があったので作業後にいろんなカスが溜まってストレージを圧迫しだしたのでユーザーディレクトリをtarでバックアップしてOSをクリアインストールすることにした。

# Ubuntu20.04から22.04に上げたら・・・
このバージョンからXorgではなくxwaylandが採用されているためにSimpleScreenRecorderで何やらエラーが・・・
起動できないというわけではなく、録画しても画面が記録されないという自体に陥った。
原因はWindowsシステムがX-WindowからxWayland？に変更されているのが原因らしい。


# 解決方法
ログイン時パスワード入力画面で右下に出てくる歯車マークを押してUbuntu on Xorgと書かれているところをクリックしてログインする。
これで旧環境が保たれるのでアプリケーションがWraylandに対応するまではこの環境を使う。
EFSのパフォーマンス設定

# 概要
Amazon EFSのパフォーマンスの設定には以下の2種類が存在する。
- パフォーマンスモード
- スループットモード

# パフォーマンスモード
システム作成時のみ設定できる


|モード|用途|
|-|-|
|汎用パフォーマンスモード|一般的な用途向け|
|最大I/Oパフォーマンスモード|ビッグデータの解析などの大容量データや、数千台のクライアントの処理向け|

# スループットモードの種類
運用中に変更可能

|モード|説明|用途|
|-|-|-|
|バーストスループットモード|ストレージの容量に従ってベースライン性能（基本性能）が設定され、一時的に負荷が高くなった場合はベースライン性能の2倍まで性能向上できる|データ量が多い場合|
|プロビジョンドスループットモード|ユーザーが予約した性能をAWSが保証してスループットを提供する|データ量は少ないがアクセス頻度が多い場合|
git statusで表示されるファイルのステータスの色を変更する[Git][gitconfig]

`git status`コマンドを打ったときに表示されるファイルの色が下のように非常に見にくいので色を変更したいなと思い、やり方を調べてみました。

![スクリーンショット 2024-10-01 10.42.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/1f121b64-20c7-2e5a-89d1-88eb1d96b910.png)

# .gitconfigを編集する

`.gitconfig`を編集することで色を変更することができます。

`.gitconfig`はホームディレクトリにあるはずです。

:::note
### `.gitconfig`が見当たらない場合
`.gitconfig`がもしない場合は、ホームディレクトリ配下に作ってください。

Windowsは、`C:\Users\<YourUsername>`
Macは、`~`になります。
:::

`.gitconfig`を以下のように設定します。

```.gitconfig
[color "status"]
	added = yellow
    changed = green
    untracked = cyan
```

すると、下のような感じで色が変更されます。

![スクリーンショット 2024-10-01 10.44.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/9841c7f1-ebc5-d0dd-a191-0d4dd878b71e.png)

色の種類は、 normal、 black、 red、 green、 yellow、 blue、 magenta、 cyan、 white
の９種類です。

また、ファイルのステータスだけでなく、コードの差分や、ブランチ、addやcommitなどのインタラクティブ機能も変えることができます。

```
color.branch 
color.diff
color.interactive
color.status
```

詳しくは下のGitの公式ドキュメントを参照してみてください。

https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%81%AE%E8%A8%AD%E5%AE%9A
【初心者】Git hub使用方法

## やること　
pythonで作ったプログラム(仮想環境以外)をgitにアップロードする。
アップロードしたものを更新する。

## アップロード手順
C:\Users\sharisa\Videos\ラズベリーパイIpad
本日はここの下の階層をGitにアップロードすることとする。

まずgithubにアクセス
https://github.com/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/aac77257-7e9c-59a7-be13-0e25ec396cae.png)

New repositroryを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/6d18a933-591b-02bb-8691-5e934f2dee9f.png)
Repository nameを任意の文字に変更する。日本語は多分ダメ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/708f61b6-e78a-db7d-047a-90e1b62fb505.png)
Publicにすると、公開される
Privateにすると限定公開
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/7761b125-1f54-8b71-e851-4689d61da485.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/d00709b3-48fc-c7e4-52fb-8275c42b969c.png)
青い背景のところでurlが作成されてる。
アップロード作業が終わったらここにアクセスすればソースコードが手に入るようになります。

---------------------------
### 次はコマンドプロンプト

C:\Users\Root\Documents\Githubアップロード\human_detectionフォルダとその中のファイルをGitHubにアップロードする手順です。


```
cd "C:\Users\Root\Documents\Githubアップロード\human_detection"
git init
```


```
git remote add origin https://github.com/arisaE/human_detection.git
```
リモートリポジトリ作成



```
git add .  # 全てのファイルをステージング
git commit -m "Initial commit"  # コミット
```

```
git branch -M main  # ブランチ名をmainに変更（GitHubの標準）
git push -u origin main  # GitHubにプッシュ
```


これでGithubアップロード完了しました。
https://github.com/arisaEN/ras-view

## 更新手順
```
cd "C:\Users\Root\Documents\Githubアップロード\human_detection"
```

```
git status
```
更新されたファイルを確認します。
```
git add .
```
すべての更新されたファイルをステージングします。
```
git commit -m "Updated files with recent changes"
```
変更内容をコミットします。コミットメッセージは自由に記述できます。
```
git push origin main
```
GitHubにプッシュする


## Clone
git cloneとはリモートリポジトリをローカルリポジトリへもってくること。
```
git clone https://github.com/arisaEN/squeegeeZaiko_App_2.git
```

cdコマンドでcloneする場所変えれます。


## 無視設定
無視死体ファイルと同じ階層に.gitignoreというテキストファイル作成




参考

https://qiita.com/inabe49/items/16ee3d9d1ce68daa9fff

## リモートリポジトリ削除
参考

https://qiita.com/yutosa3/items/25ab031c8061e8c9a4c4
Bunで構築したNext.jsアプリケーションをDockerで立ち上げる

今回は、MacのARMアーキテクチャでBunを使い、Next.jsをDocker環境と接続する方法を解説します。Bunは非常に軽量で高速なJavaScriptランタイムですが、ARM環境でBunを使う場合、Dockerとの接続にいくつかの問題が発生することがあります。

まず、Mac環境（ARMアーキテクチャ）でNext.jsプロジェクトをBunを使って作成しました。現在のシステム情報とBunのバージョンは以下の通りです。

```bash
$ uname -m
arm64

$ bun --version
1.1.13
```

このように、ARM環境でBunを実行しているため、Docker環境との接続に一部互換性の問題が生じることがあります。

## 1. Bun環境でNext.jsを作成

まず、Bunを使ってNext.jsのプロジェクトを作成しました。コマンドは以下の通りです。

```bash
/tmp $ bun create next-app frontend
✔ Would you like to use TypeScript? … No / Yes
✔ Would you like to use ESLint? … No / Yes
✔ Would you like to use Tailwind CSS? … No / Yes
✔ Would you like to use `src/` directory? … No / Yes
✔ Would you like to use App Router? (recommended) … No / Yes
✔ Would you like to customize the default import alias (@/*)? … No / Yes
✔ What import alias would you like configured? … @/*
```

以下のdocker-compose.yml内での設定に響いてくるので示しておきます。

## 2. Dockerfileの作成

次に、Bunを使用するためのDockerfileを作成します。以下のDockerfileでは、最新のBun公式イメージを使用しています。

```dockerfile
# 最新のBunの公式イメージを使用
FROM oven/bun:latest

# 作業ディレクトリを設定
WORKDIR /app

# パッケージリストをコピー
COPY package.json ./

# 依存関係のインストール（キャッシュを利用せず最新にするため）
RUN bun install --no-cache

# ソースコードをコピー（必要なファイルだけコピー）
COPY . .

# 開発サーバーを起動
CMD ["bun", "dev"]
```

このDockerfileを使ってDockerコンテナをビルドすることで、Bunを用いたNext.jsアプリケーションの開発環境が整います。

## 3. `docker-compose.yml`の設定

次に、`docker-compose.yml`を設定します。ここでは、ホットリロードを有効にするために`volumes`を使って、ローカルのソースコードをコンテナ内の`/app`ディレクトリにマウントします。

```yaml
services:
  frontend:
    build:
      context: frontend
    ports:
      - "3000:3000"
    volumes:
      - ./frontend:/app
```

この設定により、ローカルで編集したコードがリアルタイムでDockerコンテナに反映されるようになります。

## 4. Linux環境でのSWCエラー問題

この構成でNext.jsを起動すると、以下のようなエラーメッセージに遭遇することがあります。

```bash
frontend-1  |   ▲ Next.js 14.2.11
frontend-1  |   - Local:        http://localhost:3000
frontend-1  |   - Environments: .env.local, .env
frontend-1  | 
frontend-1  |  ✓ Starting...
frontend-1  |  ⚠ Attempted to load @next/swc-linux-arm64-gnu, but it was not installed
frontend-1  |  ⚠ Attempted to load @next/swc-linux-arm64-musl, but it was not installed
frontend-1  |  ⨯ Failed to load SWC binary for linux/arm64, see more info here: https://nextjs.org/docs/messages/failed-loading-swc
frontend-1  | 
frontend-1 exited with code 0
```

これは、Next.jsがLinuxの`arm64`アーキテクチャ用のSWCバイナリを読み込もうとして失敗するために発生します。これを解消するためには、次の対応が必要です。

## 5. `.dockerignore`ファイルの設定

まず、次のファイルやディレクトリを`.dockerignore`に追加します。これにより、ホスト環境の依存関係がDockerコンテナ内で干渉することを防げます。

```dockerignore
node_modules
bun.lockb
.next/
```

これにより、Docker内で新たに依存関係をインストールし直し、環境差による問題を解消できます。

## 6. Volumeの調整

さらに、ソースコードと静的ファイルをDocker環境でホットリロードするため、`docker-compose.yml`に`volumes`として`src`と`public`ディレクトリ、ライブラリの変更を反映させるためのpackage.jsonを指定します。

```yaml
services:
  frontend:
    build:
      context: frontend
    ports:
      - "3000:3000"
    volumes:
      - ./frontend/src:/app/src
      - ./frontend/public:/app/public
      - ./frontend/package.json:/app/package.json
```

この設定により、ローカルの`src`および`public`フォルダがDockerコンテナ内の対応するフォルダにマウントされ、リアルタイムで変更が反映されます。

## 7. 終わりに

この手順に従うことで、BunとNext.jsを使ったDockerベースの開発環境を簡単に構築できます。SWCエラーの対処法を含め、ホットリロード対応のVolume設定を導入することで、開発作業がより快適に進められるでしょう。
EBS ボリュームタイプ

# 概要
EBSボリュームタイプの整理

# 用語の定義
- IOPS：ディスクが1秒間に処理できるI/Oアクセス数。値が大きいほど性能の高いストレージである。﻿
- スループット：特定の期間にネットワークを通過するデータ量、または一定の時間で転送できるデータ量

# ボリュームタイプ
|ボリュームタイプ|主な用途|ボリュームサイズ|最大IOPS|最大スループット|
|-|-|-|-|-|
|汎用SSD(gp2,gp3)|EC2インスタンスのルートボリューム、開発・テスト環境|1GB-16TB|16,000IOPS|(gp2) 250MB/s<br>(gp3) 1,000MB/s|
|プロビジョンドIOPS(io1)|高いI/O性能が必要なシステム|4GB-16TB|64,000IOPS|1,000MB/s|
|プロビジョンドIOPS(io2 Block Express)|io1よりも高性能・高耐久性が必要なシステム|4GB-64TB|256,000IOPS|4,000MB/s|
|スループット最適化HDD(st1)|シーケンシャル（順次）アクセスを行うデータベースやビッグデータ、ログ処理|125GB-16TB|500IOPS|500MB/s|
|Cold HDD|ログやバックアップなど、利用頻度の低いデータの保存|125GB-16TB|250IOPS|250MB/s|
Laravel(ver.11)+Inertia+React(TS)でエラーページをカスタム

公式通りに真似してやったつもりが、やや苦戦したのでメモします。

Inertia.jsの公式のドキュメントを参考に実施します。
https://inertiajs.com/error-handling


## .envの設定
公式には書いてないですが、開発間環境ではなく本番環境に設定を変更します。
.envファイルをこのように書き換えて切り替えます。
APP_ENVをloca→productionにします。
```:.env
#APP_ENV=local
APP_ENV=production
```


## バックエンド側の設定
bootstrapディレクトリにある、"app.phpを公式ドキュメントと同じように編集します"
"->withExceptions(function (Exceptions $exceptions) {})->create();"
の部分がデフォルトでは何も書かれてないのでここにカスタムエラーページへ飛ばす処理を書きます。
公式通りに書けばOKです。
```php:app.php

//省略//


use Illuminate\Http\Request;//カスタムエラーページで使用
use Symfony\Component\HttpFoundation\Response;//カスタムエラーページで使用
use Inertia\Inertia;//カスタムエラーページで使用


//省略//


->withExceptions(function (Exceptions $exceptions) {
        //カスタムエラーページの処理
        $exceptions->respond(function (Response $response, Throwable $exception, Request $request) {
            if (! app()->environment(['local', 'testing']) && in_array($response->getStatusCode(), [500, 503, 404, 403])) {
                return Inertia::render('Error', ['status' => $response->getStatusCode()])
                    ->toResponse($request)
                    ->setStatusCode($response->getStatusCode());
            } elseif ($response->getStatusCode() === 419) {
                return back()->with([
                    'message' => 'The page expired, please try again.',
                ]);
            }
    
            return $response;
        });
    })->create();


```


## フロントエンドエラーページ作成
Pageディレクトリに"Error.tsx"を新規作成します。
そして、中身をこのように編集します。
基本は公式通りですが、typescriptだとエラーが出たので"status"に
型(number)を宣言するように少し書き換えています。
```typescript:Error.tsx
export default function ErrorPage({ status }:{status:number}) {
    const title = {
      503: '503: Service Unavailable',
      500: '500: Server Error',
      404: '404: Page Not Found',
      403: '403: Forbidden',
    }[status] 
  
    const description = {
      503: 'Sorry, we are doing some maintenance. Please check back soon.',
      500: 'Whoops, something went wrong on our servers.',
      404: 'Sorry, the page you are looking for could not be found.',
      403: 'Sorry, you are forbidden from accessing this page.',
    }[status] 
  
    return (
      <div>
        <h1>{title}</h1>
        <div>{description}</div>
      </div>
    )
  }
```

## キャッシュのクリア
これでカスタムエラーページは完成ですが、うまく表示されない時は
以下の3つのコマンド実施し、キャッシュをクリアしてください。
```
php artisan view:clear
php artisan config:clear
php artisan cache:clear
```
以上です。
ラズベリーパイ IPアドレスの固定

## メリット
IP固定すると、リモート接続しやすい。

## やり方

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/98c480ed-b73a-d566-7220-8224b55aa9db.png)
接続を編集するをクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/f48857f4-ff8d-40bc-cce6-094d09fb7657.png)
使ってるWifiもしくはイーサネットを選択して下の歯車押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/f7f4b539-5f57-84a3-1b3b-4e5d8ac60cf2.png)
IPv4を手動に。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/6c476c16-0751-45cb-b578-747c7086fdcf.png)
Addを押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/40edf41f-44ec-d3f1-b06c-9e5f0aa9415c.png)
IPとサブネットマスクとGWを設定したら保存。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/563bf9fe-99be-9cbf-1c0f-b14adf89c919.png)

再起動して確認 

終了。
How to join the samdal👡Network with node using symbol-shoestring.🌺symbol-shoestringを使用した samdal👡NetworkNodeの作り方

Now, I'll show you how to create a samdalNetworkNode using symbol-shoestring.ufufu🌺
symbol-shoestring を使用して samdalNetworkNode を作成する方法を説明しますわ。うふふ🌺
　
　
At first make working directory nemed anything is fine.
最初に、作業ディレクトリを作るの。名前はなんでもいいわ。
```
mkdir xxxxx
```
　
Enter working directory.
作業ディレクトリに入るの。
```
cd xxxxx
```
　
If you already have ca.key.pem, copy it to your working directory.
Or make 'ca.key.pem' for mainAccount.
もう ca.key.pemを持っていたら、作業ディレクトリにコピーしてね。
それか、ca.key.pemを作ってね。
　
Make 'shoestring' directory.
'shoestring'ディレクトリを作るの。
```
mkdir shoestring
```
　
Enter 'shoestring' directory.
'shoestring'ディレクトリに入るの。
```
cd shoestring
```
　
Make configFile 'shoestring.ini' for samdalNetwork.
samdalNetwork用のコンフィグファイル 'shoestring.ini' を作るの。
```
python3 -m shoestring init shoestring.ini --package http://b.dusanjp.com/networks-samdal.zip
```
　
Edit 'shoestring.ini'.
'shoestring.ini' を編集するの。
```
vi shoestring.ini
```
　
Download 'overrides.ini'.
'overrides.ini' をダウンロードするの。
```
wget b.dusanjp.com/samdal/shoestring/overrides.ini
```
　
Edit 'overrides.ini'.
'overrides.ini' を編集するの。
```
vi overrides.ini
```
　
Back to working directory.
作業ディレクトリに戻るわ。
```
cd ../
```
　
Setup the node.
nodeを作成しましょう。
```
python3 -m shoestring setup --ca-key-path ca.key.pem --config shoestring/shoestring.ini --overrides shoestring/overrides.ini --directory . --package http://b.dusanjp.com/networks-samdal.zip
```
　
Sign to 'linking_transaction.dat' that transactionFile to link remote/vrf/votingKey.
remote/vrf/votingKeyにリンクするトランザクションファイル 'linking_transaction.dat' に署名するの。
```
python3 -m shoestring signer --config shoestring/shoestring.ini --ca-key-path ca.key.pem --save linking_transaction.dat
```
　
Announce transaction to link remote/vrf/votingKey.
remote/vrf/votingKeyをリンクするトランザクションをアナウンスするわ。
```
python3 -m shoestring announce-transaction --config shoestring/shoestring.ini --transaction linking_transaction.dat
```
　
Check the status of your mainAccount at http://samdal.dusanjp.com:8080 with browser.
ブラウザで、http://samdal.dusanjp.com:8080 に行って
メインアカウントのリンク状態を確認してね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246298/c10b79ff-87ca-468e-b0f5-18a6b9cc716f.png)
　
　

:::note warn
Note! linking_transaction.dat will become invalid about an hour after the setup command is executed, so please sign and announce as soon as possible.

linking_transaction.datは、setup命令の実行後から約1時間程で
効力を失うから、署名とアナウンスは早めにね！
:::

🌺
DigiCertのルート証明書をCAからG2に変更する方法と、SSL証明書を自動チェックするPerlスクリプトの紹介

# DigiCertのルート証明書をCAからG2に変更する方法と、SSL証明書を自動チェックするPerlスクリプトの紹介

最近、DigiCertのルート証明書がCAからG2へと移行されるというニュースを耳にしました。SSL証明書の更新に伴う管理作業の負担を減らすために、複数ドメインのSSL証明書をチェックし、必要に応じてルート証明書の移行をサポートするPerlスクリプトを作成しました。このスクリプトを紹介しつつ、実際の使い方やポイントについて解説します。

## なぜルート証明書の移行が必要なのか？

DigiCertは近年、CA証明書からG2証明書への移行を進めており、セキュリティの強化と最新の暗号化技術を取り入れるために変更を行っています。多くのWebサイトやサービスがこのルート証明書に依存しており、移行を怠るとユーザーの接続に影響が出る可能性があります。

## スクリプトの機能と構成

このPerlスクリプトは、以下の機能を提供します：

- **SSL証明書の自動チェック**: 複数ドメインに対応し、それぞれの証明書情報を自動的に取得して確認します。
- **プロキシ接続のサポート**: 特定のサブドメインのみプロキシ経由で接続することが可能です。
- **並列処理で高速化**: 複数のドメインを並列で処理し、時間を短縮します。
- **エラーと成功の出力分離**: 成功とエラーの結果を異なるディレクトリに保存して、結果を一目で確認できます。
- **色付きの標準出力**: 成功は緑、エラーは赤で表示し、判別しやすくしています。

## スクリプトの使用方法

### 1. ドメインリストの準備

まず、`domains.txt` というテキストファイルを用意し、確認したいドメインとポートを以下のように1行ずつ記載します。

```
example.com:443
sub.example.com:443
```

### 2. スクリプトの実行

以下のGitHubリポジトリからスクリプトを取得し、Perlで実行します。

[ssl-certificate-checker リポジトリ](https://github.com/kawamurashingo/ssl-certificate-checker.git)

スクリプトは、以下のコマンドで実行できます：

```bash
perl ssl_certificate_checker.pl
```

### 3. 結果の確認

スクリプトは、`output/success/` ディレクトリに成功した結果、`output/error/` ディレクトリにエラーを含む結果を保存します。各ファイルには、証明書の発行者や有効期限などの詳細が記載されています。

### プロキシ設定と並列処理のカスタマイズ

- **プロキシ接続**: スクリプト内の `$proxy_host` と `$proxy_port` を指定することで、特定のサブドメインをプロキシ経由でチェックすることができます。`sub.example.com`の部分を自分の条件に合わせて調整してください。
- **並列処理数**: `$max_processes` で同時に処理するプロセス数を設定できます。デフォルトは5です。

## 終わりに

SSL証明書の更新はセキュリティの維持において重要な要素です。DigiCertのG2証明書への移行が進む中、適切に対応することで、ユーザーに安全な接続環境を提供することができます。このスクリプトは、複数のドメインのSSL証明書を手早くチェックし、更新が必要な場合に迅速に対応する手助けとなるでしょう。

ぜひ、上記のGitHubリポジトリからスクリプトをダウンロードし、証明書管理に役立ててみてください。
【Mac】PDF に 無料 プレビュー アプリで入力フォームに文字が収まらない


Macの標準アプリ「プレビュー」を使って、PDFのフォームに効率的にテキストを入力する方法や、フォントサイズの調整、パスワード保護解除の手順などを詳しく解説します。また、署名の追加やページの結合など、応用的な編集技術についても紹介。プレビューをフル活用するためのポイントを押さえ、PDF編集作業をもっと簡単にしましょう。

<iframe style="max-width: 100%" width="805" height="522" src="https://www.youtube.com/embed/w-lQZ6oSGRc" title="【Mac】PDF に 無料 プレビュー アプリで自在に文字入力する方法 - 入力フォームに文字が収まらない #mac #pdf #居住者証明" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

さらに詳しい内容は、[こちらの記事](https://android.benigumo.com/20241013/mac-pdf/)をご覧ください。

## 1. Macのプレビューアプリとは？

Macに標準搭載されているプレビューアプリは、PDFの閲覧・編集に非常に役立つツールです。特に、PDFファイルへのテキスト入力は、政府の書類やビジネスフォームなど、広く活用されています。

このアプリの利便性は、そのシンプルな操作性と多機能さにあります。通常のPDFビューワー機能に加え、簡単にテキストを追加したり、注釈をつけたりすることが可能です。これにより、専用ソフトを使わずにPDFを編集できるので、多くのユーザーにとって強力なツールとなっています。


## 2. フォーム内テキストの問題と解決策

PDFの入力フォームでは、テキストがフォームにうまく収まらなかったり、フォントサイズが適切に調整されないといった問題がよく発生します。このようなとき、プレビューアプリの「注釈ツール」を使うことで、フォームの制約に縛られず自由にテキストを入力することができます。

![sc 2024-10-14 at 7.36.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588914/52f8a581-8a22-d8a1-c56f-0b4fd88ce054.png)


特に、役所が提供するPDF書類などで起こりがちな問題に対処するには、次のような手順が役立ちます。まず、PDFがパスワード保護されている場合は、Chromeなどのブラウザを使ってその保護を解除する必要があります。これにより、テキストを追加する自由が広がり、適切なサイズで文字を入力することができるようになります。

![sc 2024-10-14 at 7.39.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588914/9b0f3aab-58d4-c965-a07e-c15fef710bd4.png)

## 3. PDF編集の応用技術

プレビューアプリは、単にテキストを入力するだけでなく、PDFのページを結合したり、特定のページを抜き出したりするなど、様々な編集機能を提供しています。また、署名の追加や図形を描く機能も備えており、書類の完成度を高めるために非常に便利です。

たとえば、複数のPDFファイルを一つにまとめたい場合や、特定のページだけを別のドキュメントとして保存したい場合も、プレビューアプリを使えば簡単に作業を完結できます。これにより、PDFの編集作業が大幅に効率化され、手間を減らすことができます。

## まとめ

Macのプレビューアプリは、PDFの編集やテキスト入力において非常に便利で、特に書類作成や修正を頻繁に行う方には欠かせないツールです。シンプルな操作でありながら、多彩な機能を活用することで、作業をより効率的に進めることができます。PDFの編集に関するさらに詳しい情報やステップバイステップの手順は、[こちらの記事](https://android.benigumo.com/20241013/mac-pdf/)をご覧ください。

https://android.benigumo.com/20241013/mac-pdf/

https://zenn.dev/maochanz/articles/0bb8619694afe5
BigQueryて簡単カテゴリ化: RANGE_BUCKET vs CASE WHEN


BigQueryの機能の一つRANGE_BUCKETについてお話しします。この関数は、データソースの差異を効率的に検証し、値の分布を簡単に可視化できるものです。

[Mathematical functions  |  BigQuery  |  Google Cloud](https://cloud.google.com/bigquery/docs/reference/standard-sql/mathematical_functions#range_bucket)

## **RANGE_BUCKETを使うのに必要な引数**

- 値：バケットを見つけたい対象
- 配列：値をグループ化するためのバケット間隔

上記の引数を受け取り、データをカテゴリ化します。

## **RANGE_BUCKETとCASE WHEN文のそれぞれのメリット**

### RANGE_BUCKET

- コードが簡潔で読みやすい
- バケットの範囲を配列で簡単に変更可能
- 大量のバケットを扱う際に効率的

### CASE WHEN

- 条件をより細かく制御可能
- 各バケットに対して異なる処理を適用しやすい
- 複雑な条件分岐を表現しやすい

CASE WHENの方が私は馴染み深いのでCASE WHENを使いますがカテゴリが多く分類をたくさんする必要がある場合には活用しようかなと思いました。

## **RANGE_BUCKET vs CASE WHEN**

以下は、RANGE_BUCKETとCASE WHEN文を比較する簡単な例です：

```sql
-- RANGE_BUCKET を使用した例
SELECT 
  value,
  RANGE_BUCKET(value, [0, 10, 20, 30, 40, 50]) AS bucket
FROM UNNEST([5, 15, 25, 35, 45, 55]) AS value;

-- 同等の CASE WHEN 文
SELECT
  value,
  CASE
    WHEN value < 10 THEN 0
    WHEN value < 20 THEN 1
    WHEN value < 30 THEN 2
    WHEN value < 40 THEN 3
    WHEN value < 50 THEN 4
    ELSE 5
  END AS bucket
FROM UNNEST([5, 15, 25, 35, 45, 55]) AS value;
```

### 結果

range_bucket
![スクリーンショット 2024-10-14 7.05.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673036/ddd4cd2a-9da4-9d71-e0a7-0e364471e6aa.png)

case when文
![スクリーンショット 2024-10-14 7.05.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673036/9ff8e676-6360-f1ca-6902-b5421fa366af.png)
ServiceNowの裏側：各アプリケーションを支える業界標準フレームワーク解説

# 概要
ServiceNowは、企業のIT運用や業務プロセスを効率化する強力なプラットフォームとして知られています。しかし、その優れた機能の背後には、各業界で認められた標準的なフレームワークや方法論が存在することをご存知でしょうか。本記事では、ServiceNowの主要アプリケーションとそれらを支えるフレームワークの関係性を解き明かします。ITILやNIST、PMBOKなど、様々な業界標準がどのようにServiceNowのアプリケーションに組み込まれているのか、その全容を一覧表とともに詳しく解説します。この知識は、ServiceNowの真の力を理解し、より効果的に活用するための重要な鍵となるでしょう。

# フレームワークの重要性
ServiceNowアプリケーションにおけるフレームワークの採用は、単なる理論的基盤以上の意味を持ちます。これらのフレームワークは、長年の実践と研究から生まれた業界のベストプラクティスを体現しており、信頼性の高いソリューションの提供を可能にします。例えば、ITSMにおけるITILの採用は、標準化されたプロセスと共通言語を提供し、組織全体でのIT管理の一貫性を高めます。同様に、GRCにおけるNIST CSFの活用は、包括的なサイバーセキュリティ管理を実現します。これらのフレームワークを基盤とすることで、ServiceNowは理論と実践の橋渡しを行い、ユーザーに対して検証済みの効果的なアプローチを提供しているのです。

# フレームワーク対応表
| アプリケーション名 | フレームワーク名 | フレームワークの概説 |
|:-------------------|:-----------------:|:---------------------|
| APM (Application Portfolio Management) | TOGAF,IT4IT | 一般的なアプリケーションポートフォリオ管理の原則と業界のベストプラクティスを採用 |
| CPG (Cloud Provisioning and Governance) | cloudstack | 組織内のマルチクラウドのオーケストレーションツール |
| CSM (Customer Service Management) | ITIL, CRM原則 | ITサービス管理のベストプラクティス集と顧客関係管理の原則を組み合わせたもの |
| Discovery | ITIL Configuration Management | IT資産と構成項目の識別、制御、検証、報告のためのプロセス |
| Event Management | ITIL Event Management | ITインフラストラクチャのイベントを検出し、意味を理解し、適切な制御行動を決定するプロセス |
| FSM (Field Service Management) | 特定のフレームワークなし | フィールドサービス管理の業界ベストプラクティスと一般的な原則を採用 |
| HAM (Hardware Asset Management) | ISO/IEC 19770 | IT資産管理のための国際標準規格 |
| SAM (Software Asset Management) | ISO/IEC 19770 | IT資産管理のための国際標準規格 |
| ITSM (IT Service Management) | ITIL | ITサービス管理のためのベストプラクティス集 |
| RC (Risk Compliance) | COSO ERM, ISO 31000,NIST CSF | エンタープライズリスク管理と国際的なリスク管理の標準規格 |
| SIR (Security Incident Response) | NIST SP 800-61 | コンピューターセキュリティインシデント対応のためのガイドライン |
| SM (Service Mapping) | ITIL Service Asset and Configuration Management | ITサービスとインフラストラクチャの関係を管理するためのプロセス |
| SP (Service Provider) | ITIL Service Provider | ITサービスの設計、移行、運用、改善を管理するためのプロセスとベストプラクティス |
| SPM (Strategic Portfolio Management) | PMBOK | プロジェクト管理の知識体系ガイド |
| VR (Vulnerability Response) | NIST SP 800-40 | リスク評価と連邦情報システムのためのセキュリティおよびプライバシー管理策のガイドライン |
| TPRM (Third Party Risk Management) | ISO 31000 | リスク管理の国際標準規格 |

# 結び
ServiceNowの各アプリケーションが、業界で認知された標準フレームワークに基づいて設計されていることが明らかになりました。この知識は、ServiceNowを導入または利用する組織にとって極めて重要です。なぜなら、これらのフレームワークを理解することで、アプリケーションの真の力を引き出し、組織のニーズに合わせて最適化することが可能になるからです。さらに、これらの標準的なフレームワークに基づいていることは、ServiceNowの信頼性と有効性の証明でもあります。今後、デジタルトランスフォーメーションを進める上で、ServiceNowとそれを支えるフレームワークの理解は、成功への重要な鍵となるでしょう。この記事が、皆様のServiceNow活用の一助となれば幸いです。
System Manager で CloudWatch Agent をインストール・設定する手順


## はじめに

System Manager を利用した、CloudWatchAgent のインストール、設定手順をよく忘れるので備忘録としてまとめました。

## 全体の前提条件

- EC2 にインストールされている SSM エージェントのバージョンが `2.2.93.0` 以降であること
- EC2 が CloudWatch エンドポイントに接続できること（インターネットに接続できる状態であれば OK）

## インストール編

1. System Manager > Run Command を選択する。
2. 次のドキュメント、パラメータを選択、入力する。ログ等の設定については、お好みで適宜設定すること。
   - コマンドドキュメント: `AWS-ConfigureAWSPackage`
   - コマンド実行のパラメータ
     - Action: install
     - installation Type: Uninstall and reinstall
     - Name: `AmazonCloudWatchAgent`
   - ターゲット: CloudWatchAgent をインストールしたい EC2 を選択する。
3. コマンドのステータスより、ステータスが `成功` になっていることを確認する。

上記の手順で Linux,Windows どちらもインストールできます。

## 設定編

### 前提条件

CloudWatchAgent に適用したい設定内容をパラメータストアに格納していること
以下はパラメータの簡単な例です。

```json:sampleConfig.json
{
  "metrics": {
    "metrics_collected": {
      "mem": {
        "measurement": [
          "mem_used_percent"
        ],
        "metrics_collection_interval": 60
      }
    },
    "append_dimensions": {
      "InstanceId": "${aws:InstanceId}"
    }
  }
}
```

### 設定手順

1. System Manager > Run Command を選択する。
2. 次のドキュメント、パラメータを選択、入力する。ログ等の設定については、お好みで適宜設定すること。
   - コマンドドキュメント: `AmazonCloudWatch-ManageAgent`
   - コマンド実行のパラメータ
     - Action: configure
       - 設定を追加する場合: configure(append)
       - 設定を削除する場合: configure(append)
     - Mode: ec2
     - Optional Configuration Souce: ssm
     - Optional Configuration Location: `<適用したい設定が格納されているパラメータストアの名前>`
     - Optional Restart: yes
   - ターゲット: CloudWatchAgent をインストールしたい EC2 を選択する。
3. コマンドのステータスより、ステータスが `成功` になっていることを確認する。

## 参照

[SSM を使用して CloudWatch エージェントをダウンロード、設定、実行する](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/download-CloudWatch-Agent-on-EC2-Instance-SSM-first.html)
githubにsshで接続する方法

目的
--
GitHubとのSSH接続設定と、ローカルリポジトリをリモートリポジトリに接続してプッシュする流れです。

１.ローカルリポジトリの作成
```bash
# 既にリポジトリがある場合は、不要
git init
```

２.秘密鍵の作成
すでに秘密鍵がある場合は不要です。新しく作成する場合：
```bash
ssh-keygen -t rsa -b 4096 -C "example@example.com" -f ~/.ssh/git_key_test
```

３.SSH接続設定ファイルの編集
SSH接続に使用する秘密鍵を指定するために、~/.ssh/config ファイルを編集します。
```
vi ~/.ssh/config
```

設定内容：
```bash
Host github github.com
  HostName github.com
  IdentityFile ~/.ssh/git_key
  User git
```
※ここで、IdentityFile のパスは、前ステップで生成した秘密鍵のパス（例: ~/.ssh/git_key_test）を指定します。

４.GitHubでSSHキーを登録する
GitHubの「Settings」ページにアクセスします: https://github.com/settings/keys
「SSH and GPG keys」セクションで「New SSH key」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3146038/0f2144fb-1430-9d19-2327-1b6a337473ce.png)
タイトルを入力し、公開鍵（~/.ssh/git_key_test.pubの内容）を貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3146038/a57c23c0-baec-909c-3ecb-b92e608e2340.png)

５. GitHubとのSSH接続確認
次のコマンドで接続確認を行います。
```bash
ssh -T github
```

成功すると、次のようなメッセージが表示されます。
```
Hi your_github_accountname! You've successfully authenticated, but GitHub does not provide shell access.
```

６．リモートリポジトリのSSH形式のURLを取得
GitHubのリポジトリページで、code タブの SSH オプションを選択し、SSH形式のリモートURL（例: git@github.com:username/repository.git）をコピーします。
![スクリーンショット 2024-10-14 034316.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3146038/95085992-aeb2-d5fa-e6b5-0426566b0e65.png)

７. リモートリポジトリを追加
ローカルリポジトリに、リモートリポジトリのURLを追加します。
```
git remote add origin git@github.com:username/repository.git
```

８. リモートリポジトリの確認
リモートリポジトリが正しく追加されているか確認します。
```bash
git remote -v
```

９. リモートリポジトリをクローン
もしまだクローンしていない場合は、リモートリポジトリ全体をクローンします。
```bash
git clone git@github.com:username/repository.git
```

１０. ブランチの確認
クローン後、ローカルに移動して、ブランチを確認します。

```bash
git branch
```


１１. 変更の追加とコミット
ファイルを追加してステージングし、コミットします。
```bash
#現在のブランチを確認する
git add .
git status
git commit -m "初回コミットメッセージ"
```

```bash
git push origin main  # ブランチが `main` の場合
```
2024/10/14主にITとかセキュリティの記事

カシオ、ランサム攻撃で情報漏洩　顧客データ含む恐れ(10/11)
https://www.nikkei.com/article/DGXZQOUC11B630R11C24A0000000/

カシオ、情報漏えいか＝サイバー攻撃で(10/12)
https://news.livedoor.com/article/detail/27354462/

タリーズコーヒー情報漏洩事件に学ぶECサイトのセキュリティ強化策
https://cybersecurity-park.com/3147/

盛岡ガス保有個人情報、流出の可能性　不正利用確認されず(10/12)
https://www.iwate-np.co.jp/article/2024/10/12/171721

【開示事項の経過】当社におけるサイバー攻撃による システムの停止事案に関する調査結果の報告 関通(10/11)
https://www.release.tdnet.info/inbs/140120241011596843.pdf

 【基本情報】独学マラソン ファジング Day 11(10/10)
https://qiita.com/weeding_test_5/items/1f45b3eea48075f6f637

BitLocker（ビットロッカー）が解除できない・回復キーがわからないときの解決法を解説(10/11)
https://cybersecurity-jp.com/contents/data-security/688/

小学生にも理解できる「ブロックチェーン」入門。全国の活用事例を知ろう【親子で学ぶ現代技術】(10/11)
https://hugkum.sho.jp/617946

区立小学校における個人情報の漏洩について(10/11)
https://www.city.taito.lg.jp/kusei/sanka/release/press0610/11_2.html

AWS re:Invent 2024 のヘルスケア業界ガイド(10/11)
https://aws.amazon.com/jp/blogs/news/healthcare-industry-guide-to-aws-reinvent-2024-las-vegas/

次世代型NymVPNの”匿名モード”とは？技術的解説(10/11)
https://qiita.com/pseudonym2/items/36fb0b8497c13018204d

パスワード保存はオフラインでより安全に。150個まで管理できる「PIN-Master」を試してみた(10/12)
https://news.livedoor.com/article/detail/27358269/

生成AIのビジネス活用事例5選から考える、メリット・デメリットとは(10/12)
https://markezine.jp/article/detail/44602

Next.jsで簡単なCRUDアプリを作りながら気になったセキュリティ: Railsの視点から(10/11)
https://zenn.dev/naofumik/articles/c699deb688ac04

HDDは“あれ”で壊れる――劣化でも衝撃でもない「謎の原因」(10/12)
https://techtarget.itmedia.co.jp/tt/news/2410/12/news01.html

minecraftで荒らされたので警察に通報した話(10/11)
https://qiita.com/ganma_/items/8cdc88e573d34077545d

当社におけるランサムウェア被害に伴う サービスの一部停止と情報漏えいに関するお知らせ(10/11)
https://www.release.tdnet.info/inbs/140120241011596755.pdf

サウジアラビアがAIを活用してサイバーセキュリティのリーダーシップを強化する方法
https://www.arabnews.jp/article/saudi-arabia/article_131377/

〈中国「認知戦」の正体に迫る〉流出文書を追った調査報道、ネット空間はすでに戦時にある(10/12)
https://wedge.ismedia.jp/articles/-/35393

島しょ国向けサイバー防御演習、総務省が実施発表(10/11)
https://www.nikkei.com/article/DGXZQOUA079KV0X01C24A0000000/

フィンランドとスウェーデンでサイバー攻撃が日常化、フォータムCEOが報告(10/12)
https://jp.investing.com/news/economy-news/article-93CH-892351
Go言語(Golang)におけるMapとSliceの値渡しに関する考察



```go
func modMap(m map[int]string) { //liststart1
```
- `modMap`という関数を定義しています。この関数は、整数をキー、文字列を値とするマップを受け取ります。

```go
	m[2] = "こんにちは"
```
- マップ`m`のキー`2`に対して、値`"こんにちは"`を設定しています。

```go
	m[3] = "さようなら"
```
- マップ`m`のキー`3`に対して、値`"さようなら"`を設定しています。

```go
	delete(m, 1)
```
- マップ`m`からキー`1`を削除しています。


```go
func modSlice(s []int) {
```
- `modSlice`という関数を定義しています。この関数は、整数のスライスを受け取ります。

```go
	for k, v := range s {
```
- スライス`s`の各要素に対して、インデックス`k`と値`v`を取得するための`for`ループを開始しています。

```go
		s[k] = v * 2
```
- スライス`s`の各要素を2倍にしています。`k`はインデックスで、`v`はその位置の値です。

```go
	s = append(s, 10)
```
- スライス`s`の末尾に`10`を追加していますが、この変更は呼び出し元には反映されません。



```go
func main() { //liststart2
```
- プログラムのエントリーポイントである`main`関数を定義しています。

```go
	m := map[int]string{
```
- 新しいマップ`m`を作成し、整数をキー、文字列を値とする初期値を設定しています。

```go
		1: "1番目",
		2: "2番目",
	}
```
- マップ`m`に2つのキーと値を追加しています。

```go
	modMap(m)
```
- `modMap`関数を呼び出し、マップ`m`を引数として渡しています。この関数内でマップが変更されます。

```go
	fmt.Println(m) // map[2:こんにちは 3:さようなら]
```
- 変更後のマップ`m`を出力しています。表示される内容は、`map[2:こんにちは 3:さようなら]`です。

```go
	s := []int{1, 2, 3}
```
- 整数のスライス`s`を定義し、初期値として`1, 2, 3`を設定しています。

```go
	modSlice(s)
```
- `modSlice`関数を呼び出し、スライス`s`を引数として渡しています。この関数内でスライスが変更されますが、呼び出し元には反映されません。

```go
	fmt.Println(s) // [2 4 6]
```
- スライス`s`を出力していますが、呼び出し後の変更は反映されていないため、元の値`[1 2 3]`が表示されるはずです。

Go言語におけるマップ（map）とスライス（slice）の値渡しについて解説します。

### マップ（map）の値渡し

1. **参照型**:
   - マップは参照型です。これは、マップの変数がマップデータの実体（メモリ内のデータ）を指し示すポインタのように動作することを意味します。
   - したがって、関数にマップを渡すと、その関数内でマップの内容を変更すると、呼び出し元のマップにもその変更が反映されます。

2. **例**:
   ```go
   m := map[int]string{
       1: "1番目",
       2: "2番目",
   }
   modMap(m) // modMap内での変更は呼び出し元にも影響する
   ```
   この場合、`modMap`関数内でマップの要素を変更（追加や削除）すると、`main`関数内の`m`にもその変更が反映されます。

### スライス（slice）の値渡し

1. **参照型だけど再代入は不可**:
   - スライスも参照型です。スライス自体はデータを指し示すポインタを持っており、スライスの内容を変更することはできます。
   - しかし、スライスを関数に渡し、そのスライスを再代入（新しいスライスを作成するなど）すると、呼び出し元のスライスには影響しません。

2. **例**:
   ```go
   s := []int{1, 2, 3}
   modSlice(s) // modSlice内での変更は呼び出し元には影響しない
   ```
   この場合、`modSlice`関数内で`s`の各要素を変更すること（例えば、値を2倍にすること）は可能ですが、`append`で新しい要素を追加した際に`s`を再代入することで新しいスライスを作成すると、呼び出し元の`s`には変更が反映されません。

### まとめ

- **マップ**:
  - 参照型であり、関数内での変更が呼び出し元に反映される。
  
- **スライス**:
  - 参照型ではあるが、スライス自体を再代入すると呼び出し元には反映されない。スライスの内容（要素）は変更可能。
Azure Application Gatewayについて

概要
--
Azure Application Gatewayは、Webアプリケーションへのトラフィックを管理できるL7のロードバランサー

ルーティングの方法
--
・送信元IPアドレスからトラフィックを指定されたサーバへ振り分ける
・リクエストURLパスに基づいて、異なるサーバやサービスにトラフィックを振り分ける
・パスのサーバーセットにトラフィックをルーティング

機能
--
・SSL(Application Gateway～)
バックエンドサーバーに平文または暗号化でトラフィックを渡す設定することができる
恩恵として、暗号化と復号化のオーバーヘッドを省略できるため、サーバの負荷を低減できる

・自動スケーリング(Application Gateway Standard_v2～)
トラフィック負荷パターンをパラメータとして定義することで、スケールアップアップまたはスケールダウンが可能

・ゾーン冗長性(Application Gateway Standard_v2～)
複数の可用性ゾーンを設定可能で、高可用にすることが可能

・静的 VIP(Application Gateway Standard_v2 SKU～)
静的VIPにのみサポート

・WAF
OWASPのコアルールセットを利用し、一般的な既知の脆弱性を悪用した攻撃からWebアプリケーションを保護する

・URLベースルーティング
URLパスへのリクエストに応じて、バックエンドサーバープールにトラフィックをルーティング可能

・複数サイトのホスティング
Application Gatewayのバックエンドサーバープールに、ホスト名またはドメイン名に基づくルーティングが最大100個可能

・リダイレクト
クライアントからの接続要求をhttpsでend-to-endにすることが可能

・セッション アフィニティ
Cookie情報を使用し、応答遅延、パフォーマンスを維持する

詳細は以下
https://learn.microsoft.com/ja-jp/azure/application-gateway/features

アプリケーションゲートウェイの仕組み
--
クライアント⇒DNS⇒アプリケーションゲートウェイ(リスナー)→WAF→バックエンドサーバの順で接続される

正常性確認は、
Go言語におけるSlice、Map、make関数について

### Slice
Sliceは、Go言語における可変長の配列のようなデータ構造です。Sliceは、配列の部分を参照することができ、サイズを動的に変更することができます。

- **宣言と初期化**:
  ```go
  var s []int // nil Slice
  s = []int{1, 2, 3} // 初期化
  ```

- **長さと容量**:
  Sliceには、長さ（要素数）と容量（Sliceが参照する配列の長さ）があり、`len()`と`cap()`関数で取得できます。
  ```go
  len(s) // Sliceの長さ
  cap(s) // Sliceの容量
  ```

- **追加**:
  `append`関数を使って要素を追加できます。
  ```go
  s = append(s, 4) // 4を追加
  ```

### Map
Mapは、キーと値のペアを保持するデータ構造で、ハッシュテーブルを基にしています。特定のキーに関連付けられた値を効率的に検索できます。

- **宣言と初期化**:
  ```go
  var m map[string]int // nil Map
  m = make(map[string]int) // Mapの初期化
  ```

- **要素の追加と取得**:
  ```go
  m["key1"] = 10 // 要素の追加
  value := m["key1"] // 要素の取得
  ```

- **存在確認**:
  値の取得時に、キーの存在を確認することができます。
  ```go
  value, exists := m["key1"] // existsがtrueならキーは存在
  ```

### make関数
`make`関数は、Slice、Map、Channelを初期化するために使用されます。`make`を使うことで、これらのデータ構造を生成し、メモリを確保することができます。

- **Sliceの初期化**:
  ```go
  s := make([]int, 5) // 長さ5のSliceを作成
  ```

- **Mapの初期化**:
  ```go
  m := make(map[string]int) // 空のMapを作成
  ```

- **Channelの初期化**:
  ```go
  ch := make(chan int) // int型のChannelを作成
  ```
Go言語(Golang)における関数とクロージャ



#### 1. **関数の定義と利用**

```go
func makeMult(base int) func(int) int {
    return func(factor int) int {
        return base * factor
    }
}
```
- **`makeMult`関数**:
  - `makeMult`は引数として整数`base`を受け取ります。この関数は、`factor`という整数を引数に持つ無名関数（匿名関数）を返します。
  - この無名関数は、`base`と`factor`の積を計算して返します。

#### 2. **クロージャの特性**

クロージャとは、関数とその関数が定義された環境（スコープ）を束ねたものです。このコードでは、`makeMult`が返す無名関数は、`base`という変数を「閉じ込めて」います。

- **クロージャの動作**:
  - `makeMult`が呼ばれると、新しい無名関数が生成され、`base`の値がその関数に保存されます。
  - この無名関数は、`makeMult`のスコープを超えても`base`にアクセスできます。

#### 3. **実際の動作**

```go
twoBase := makeMult(2)   // 2倍する関数
threeBase := makeMult(3) // 3倍する関数
```
- `twoBase`には`base`が2の無名関数が代入され、`threeBase`には`base`が3の無名関数が代入されます。
- これにより、`twoBase`を呼び出すと2倍、`threeBase`を呼び出すと3倍の計算が行われます。

#### 4. **ループ内での利用**

```go
for i := 0; i <= 5; i++ {
    fmt.Print(i, ": ", twoBase(i), ", ", threeBase(i), "\n")
}
```
- このループでは、`i`が0から5までの値を取り、各値に対して`twoBase`と`threeBase`を呼び出しています。
- それぞれ、`base`が2または3に設定された無名関数が呼び出され、`i`に基づく計算結果が表示されます。

### まとめ

- **関数**: `makeMult`は他の関数を生成するための関数で、特定の動作（乗算）を定義しています。
- **クロージャ**: `makeMult`が返す無名関数は、`base`という変数を閉じ込めており、呼び出したときにその値を利用できます。これにより、異なる基数での乗算を簡単に実現できます。
Swift/BATを用いた光度曲線のプロット方法：matplotlibとplotlyを用いたPythonスクリプト解説

# はじめに

Swift/BAT 衛星の 15-50 keV のエネルギーのライトカーブを生成する簡単な方法を、matplotlib と ploty で紹介します。

プログラムの基礎的な部分は、

https://qiita.com/yamadasuzaku/items/b184118383808cecaa75

と同じなので、こちらを参考にしてください。

google colab でも動かせるようにしています。その場合は、


https://colab.research.google.com/drive/1m-44bPAgTCkXkOw7_fDFAc4kvAaoGcbr?usp=sharing

を参考にしてください。

## データのダウンロード

データのダウンロードは下記から実行します。

https://swift.gsfc.nasa.gov/results/transients/

あるいは、

https://github.com/yamadasuzaku/rksysoft/blob/main/astro/swift/swift_download_data.py

のコードにアドレスを与えればダウンロードできます。

## プロット

https://github.com/yamadasuzaku/rksysoft/blob/main/astro/swift/swift_plot_lc.py

を使います。

- matplotlib を使う場合

``` bash:
python swift_plot_lc.py CygX-1.lc.fits --plotter plotly --highlight 2023-11-03T23:51:04 2023-12-05T14:01:04
```

![CygX-1.lc_matplotlib.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179652/d91129da-5268-0441-d519-c2990e9f20af.png)


- plotly を使う場合

``` bash:
python swift_plot_lc.py CygX-1.lc.fits --plotter plotly --highlight 2023-11-03T23:51:04 2023-12-05T14:01:04
``` 

`--highlight` は fill_between でハイライトしたい場合にだけつければよいです。

![スクリーンショット 2024-10-14 1.58.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179652/2b5e0f8e-bcce-0cde-48a1-7c5284b008f1.png)
【TryHackMe】Toolbox: Vim：Walkthrough

# 概要

TryHackMe「Toolbox: Vim」のWalkthroughです。

https://tryhackme.com/r/room/toolboxvim

# Task2

## **Q1**.*How do we enter "INSERT" mode?*

**A**.**i**

## **Q2**.*How do we start entering text into our new Vim document?*

**A**.**typing**

## **Q3**.*How do we return to command mode?*

**A**.**esc**

## **Q4**.*How do we move the cursor left?*

**A**.**h**

## **Q5**.*How do we move the cursor right?*

**A**.**l**

## **Q6**.*How do we move the cursor up?*

**A**.**k**

## **Q7**.*How do we move the cursor down?*

**A**.**j**

## **Q8**.*How do we jump to the start of a word?*

**A**.**w**

## **Q9**.*How do we jump to the end of a word?*

**A**.**e**

## **Q10**.*How do we insert (before the cursor)*

**A**.**i**

## **Q11**.*How do we insert (at the beginning of the line?)*

**A**.**I**

## **Q12**.*How do we append (after the cursor)*

**A**.**a**

## **Q13**.*How do we append (at the end of the line)*

**A**.**A**

## **Q14**.*How do we make a new line under the current line?*

**A**.**o**

# Task3

## **Q1**.*How do we write the file, but don't exit?*

**A**.**:w**

## **Q2**.*How do we write the file, but don't exit- as root?*

**A**.**:w !sudo tee %**

## **Q3**.*How do we write and quit?*

**A**.**:wq**

## **Q4**.*How do we quit?*

**A**.**:q**

## **Q5**.*How do we force quit?*

**A**.**:q!**

## **Q6**.*How do we save and quit, for all active tabs?*

**A**.**:wqa**

# Task4

## **Q1**.*How do we copy a line?*

**A**.**yy**

## **Q2**.*how do we copy 2 lines?*

**A**.**2yy**

## **Q3**.*How do we copy to the end of the line?*

**A**.**y$**

## **Q4**.*How do we paste the clipboard contents after the cursor?*

**A**.**p**

## **Q5**.*How do we paste the clipboard contents before the cursor?*

**A**.**P**

## **Q6**.*How do we cut a line?*

**A**.**dd**

## **Q7**.*How do we cut two lines?*

**A**.**2dd**

## **Q8**.*How do we cut to the end of the line?*

**A**.**D**

## **Q9**.*How do we cut a character?*

**A**.**x**

# Task5

## **Q1**.*How do we search forwards for a pattern (use "pattern" for your answer)*

**A**.**/pattern**

## **Q2**.*How do we search backwards for a pattern (use "pattern" for your answer)*

**A**.**?pattern**

## **Q3**.*How do we repeat this search in the same direction?*

**A**.**n**

## **Q4**.*How do we repeat this search in the opposite direction?*

**A**.**N**

## **Q5**.*How do we search for "old" and replace it with "new"*

**A**.**:%s/old/new/g**

## **Q6**.*How do we use "grep" to search for a pattern in multiple files?*

**A**.**:vimgrep**
PHPを使ったWebサイトのフォームにreCAPTCHA v3を導入する


今回の記事では、HTMLとPHPで作られたフォームにreCAPTCHA v3を導入する方法を解説していきます。

## reCAPTCHAの管理画面を開く

[reCAPTCHAのページ](https://www.google.com/recaptcha/about/)から管理画面にアクセスします。

![Screenshot 2024-10-14 at 1.32.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/fb2225b6-a1d0-105d-a3c8-241329dd3108.png)


## サイトのURLを登録

ラベルを設定してサイトのドメインを登録します。

![Screenshot 2024-10-14 at 1.33.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/fbddc21f-2142-cb93-fed2-bbcad1e65afb.png)


## サイトキーとシークレットキーを取得

設定を開いてください。

![Screenshot 2024-10-14 at 1.38.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/ec4b919b-b3c4-808e-a2d2-38f9680af8f3.png)

サイトキーとシークレットキーをコピーします。

![Screenshot 2024-10-14 at 1.38.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/acba7fd7-8b0c-6959-a680-6e36c6c1ca81.png)


reCAPTCHAを導入するための準備はこれでOKです。


## head内にreCAPTCHAのスクリプトを入れる

```index.html
<script src="https://www.google.com/recaptcha/api.js?render=ここにサイトキー"></script>
```

## フォーム内にinputタグを追加

```index.html
<input type="hidden" name="recaptcha_response" id="recaptchaResponse">
```


## フォームのHTMLファイルにJavaScriptのコードを追加

```index.html
<script>
  grecaptcha.ready(function() {
      grecaptcha.execute('ここにサイトキー', {action: 'submit'}).then(function(token) {
          var recaptchaResponse = document.getElementById('recaptchaResponse');
          recaptchaResponse.value = token;
      });
  });
</script>
```


## 送信先のPHPファイルにreCAPTCHAスコアを判定する処理を入れる

```form.php
// reCAPTCHAのシークレットキー
$secretKey =  'ここにシークレットキー';

// reCAPTCHAのレスポンス
$recaptcha_response = $_POST['recaptcha_response'];

// APIリクエスト
$verifyResponse = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret={$secretKey}&response={$recaptcha_response}");

// APIレスポンス確認
$responseData = json_decode($verifyResponse);

if ($responseData->score < 0.2) {
    $score = isset($responseData->score) ? $responseData->score : 'No Score';
    echo "invalid request: {$score}<br>"; // 失敗
    exit; // 処理を停止
}
```

今回は以上です。
Go言語(Golang)におけるsort.Sliceについて



### `sort.Slice` の基本

`sort.Slice` は、Goの標準ライブラリ `sort` パッケージに含まれる関数で、スライスを特定の条件に基づいてソートするために使います。スライスと比較関数を引数に取り、スライスの要素をその条件に従って並べ替えます。

### コード

```go
sort.Slice(people, func(i int, j int) bool {
	return people[i].LastName < people[j].LastName
})
```

#### 1. `sort.Slice(people, ...)`

- **people**: ソート対象のスライスです。この場合、`Person` 構造体のスライスです。
- `sort.Slice` は、`people` スライスの順序を変更します。

#### 2. `func(i int, j int) bool { ... }`

- **比較関数**: ソートの基準を定義する無名関数です。
- **引数 `i` と `j`**: スライス内の要素のインデックスを表します。Goのソートアルゴリズムは、要素のインデックスを2つ取得し、どちらが前に来るべきかを判断します。

#### 3. `return people[i].LastName < people[j].LastName`

- **比較ロジック**:
  - `people[i].LastName` と `people[j].LastName` を比較しています。
  - `LastName` がアルファベット順で `i` の方が `j` よりも前に来るべきなら `true` を返します。
  - 逆に、`i` の `LastName` が `j` よりも後に来るべきなら `false` を返します。

### ソートの流れ

1. **初期状態**: `sort.Slice` は、スライス全体をソートするために、比較関数を何度も呼び出します。
2. **比較の実行**: `sort.Slice` は、要素の組み合わせ（`i`, `j`）を選び、比較関数を呼び出します。
3. **順序決定**: 比較関数が `true` を返すと、`people[i]` は `people[j]` の前に来るべきと判断され、順序が調整されます。
4. **繰り返し**: このプロセスがスライス全体に対して行われ、最終的に全ての要素が正しい順序に並べ替えられます。