OmniAICreator/Qiita-1.07M huggingface dataset:
AWSを基本からまとめてみた【VPC】

## 記事の概要

- AWSを利用する際に重要な要素であるVPC（Amazon Web Service Virtual Private Cloud）をAWSを初めて利用する人向けに基本的な概念や要素について解説


## AWS VPC（Amazon Web Service Virtual Private Cloud）

- AWS VPCとは、ユーザー専用のプライベートなクラウド環境を提供するサービスのこと
- AWS VPCの強みは、ネットワーク設定を簡単にカスタマイズすることが出来る点


## リージョン

- リージョン（Region）とは、クラウドサービスのデータセンターが置かれているエリアのこと
- ap-northeast-1 (東京リージョン)
- ap-northeast-3 (大阪リージョン)

## Availability

- 同じリージョン内にある独立したデータセンタのことで、1つのリージョン内には必ず2つ以上のAZがある

## subnet

- サブネットとは、VPCのIPアドレスの範囲を指し、AWSリソースをサブネットに割り当てることで、それらのAWSリソースは、サブネットのネットワーク内で起動させることができる

- VPCのアドレスレンジ帯は/16 ~ /28の範囲で作れ、範囲を超えるとエラーになる

##### (1) Public subnet

- インターネット接続可
- ルートテーブルにインターネットゲートウェイへのルーティング有

##### (2) Private subnet

- インターネット接続不可
- ルートテーブルにインターネットゲートウェイへのルーティング無

## Route table

- Route tableとは、VPCを利用する場合は一連のルールに従い、ルートと呼ばれるネットワーク経路を選択し、そのルールの記載されたテーブルのことで、ゲートウェイからのネットワークトラフィックをトラフィックに応じて経路設定する

- サブネットに関連づけて使用する

- サブネットから外に出る通信をどこに向けて発信するかを決めるルールを定義する

- ルールと呼ばれるルールで構成される
※ サブネット: 


## Internet gateway

- VPC内のAWSリソースとインターネットを繋げる
- 自動でスケールし、可用性が高い
- サブネットのルートテーブルを設定し使用する

## NAT gateway

- Public subnetからインターネット接続を可能とする
- アウトバウンド(発信)はできるが、インバウンド（受信）はできない

## ENI (Elastic network interface)

- 仮想ネットワークインターフェース
- EC2インスタンスのIPアドレスはENIに付与される
- 同じAZ内のインスタンスにアタッチ/デタッチでできる
- インスタンスに複数のENIをアタッチできる

## Public IP address

- AWSのIPアドレスプールより割り当てられる
- インスタンスが再起動、停止、終了した場合このアドレスは解放される

## Elastic IP address

- インスタンスにアタッチ/デタッチ可能で静的なパブリックIPアドレス
- インスタンスが再起動、停止、終了しても同一アドレス

## Security group

- AWSの仮想ファイアーウォールサービス


## Network ACL

- サブネット単位で設定するファイアーウォール



## 参考サイト
[くろかわこうへいのAWS講座VPC編#1【リージョン、アベイラビリティゾーン、サブネット】](https://www.youtube.com/watch?v=mHi2yFWLz9M)
[AWSのVPCって何？メリットや使えるシーンなど徹底解説！](https://techplay.jp/column/541)
[【初心者向け】AWSのリージョンとアベイラビリティゾーン(AZ)とは？](https://rikeitsushin.com/region-az/)
[AWSのルートテーブルとは？その概念から設定方法まで詳しく解説！](https://and-engineer.com/articles/YNAgFhMAAPVEJWdD)
[くろかわこうへいのAWS講座VPC編#3【セキュリティグループ、ネットワークACL】](https://www.youtube.com/watch?v=wrHDWQEZOiA&t=366s)
Azure Storage の Blob コンテナーに外部 URL から直接ファイルをダウンロードしてみた

Azure Storage の Blob コンテナーにファイルを格納する場合、大抵どこかしらの環境からファイルをアップロードすると思います。例えば、郵便番号の CSV をローカルにダウンロードしてから Blob コンテナーにアップロードする場合を想定します。これが、ローカルにダンロードせずとも、ダウンロード URL から直接 Blob コンテナーに格納できたら、より早く（速く）より簡単だと思います。そこで Azure CLI でどうやってやるのか試してみました。

## 検証用の Blob コンテナーを作成

```bash:bash
prefix=mnrblob
region=japaneast

az group create \
  --name ${prefix}-rg \
  --location $region

az storage account create \
  --name ${prefix} \
  --resource-group ${prefix}-rg \
  --https-only true \
  --sku Standard_LRS

az storage container create \
  --account-name ${prefix} \
  --name test
```

## ローカルにあるファイルをアップロードする例

```bash:bash
LANG=C date > date.txt

az storage blob upload \
  --account-name ${prefix} \
  --container-name test \
  --file date.txt \
  --name date.txt
```

## 郵便番号 CSV の URL を確認

![blob-copy-from-url-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/42139fe2-0860-09f4-fb63-f79d50210e52.png)

## ダウンロード URL から直接 Blob コンテナーに格納する例

```bash:bash
az storage blob copy start \
  --account-name ${prefix} \
  --destination-blob ken_all.zip \
  --destination-container test \
  --source-uri https://www.post.japanpost.jp/zipcode/dl/oogaki/zip/ken_all.zip
```

## Blob コンテナーを確認

![blob-copy-from-url-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/3f8d1691-f329-ed75-c4c9-790303144d85.png)

## 後片付け

```bash:bash
rm date.txt

az group delete \
  --name ${prefix}-rg \
  --yes
```

## 参考

https://www.post.japanpost.jp/zipcode/dl/oogaki-zip.html

https://learn.microsoft.com/ja-jp/cli/azure/storage/blob/copy?view=azure-cli-latest#az-storage-blob-copy-start
Twitter Gerçek Takipçi Hizmeti

 

Twitter Gerçek Takipçi Hizmeti
Twitter gerçektakipçi özelliğine sahip paketleri tercih ediyor olmanız beraberinde önemli avantajları getirecektir. Bir işletmeniz varsa, daha fazla takipçi ve müşteri edinmek, ürün veya hizmetinizi oraya ulaştırmanın en iyi yoludur. İnsanlar çok sayıda takipçiniz olduğunu gördüklerinde sizi takip etmeye daha meyilli olacaklardır. Bunun nedeni, sizi takip eden birçok insan varsa, bunda iyi bir şeyler olması gerektiğine inanmalarıdır.

Twitter gerçektakipçi sadece Twitter platformu için değil diğer sosyal medya platformları açısından da kritik bir öneme sahiptir. Güvenilirinstagram takipçi hizmeti gibi profesyonel bir hizmet alıyor olmak; hızlı bir şekilde gelişim göstermenizin altın anahtarını beraberinde getirecektir. Unutmamak gerekir ki daha fazla takipçiniz olduğunda, işinizin büyüdüğü anlamına gelir.

Twitter Gerçek Takipçi Neden Önemlidir?
Daha fazla takipçi, sosyal medya hesabınızda daha fazla trafik anlamına gelir. İnsanlar, Google Arama Motoru Sonuç Sayfası aracılığıyla web sitenizi bulabileceklerini gördüklerinde, üzerine tıklayacak ve web sitenizi ziyaret edeceklerdir. Web sitenizde daha fazla trafik istiyorsanız, o zaman daha fazla takipçi edinmek sizin için çok iyi bir fikir olacaktır. Bundan dolayı sosyal medyada güçlü olmak; web sitenizi de olumlu yönde etkileyecektir. Bu aşamada Twitter gerçek takipçi hizmetinin önemi bir kez daha karşımıza çıkmaktadır.

Takipçi sayınızın fazla olması; Facebook ve Twitter gibi sosyal medya platformlarında takip ettiğinde bu her ikisine de kendi iş alanlarında bir tür güvenilirlik sağlar. Twitter platformunda takipçi satın almanın temel amacı, Facebook, Twitter ve Instagram gibi sosyal medya platformlarındaki diğer kullanıcılar nezdinde güvenilirliğinizi arttırmaktır. Binlerce hatta milyonlarca takipçisi olan bir işletmenin başarı şansı hiç takipçisi olmayanlara göre daha fazladır.
これだけは覚えておきたいステータスコード

 Web開発において、これだけは覚えておきたいステータスコードまとめ。これが分かれば、最低限、仕事についていける。

# 200系
成功
### 200 OK
リクエストに成功した
### 201 Created
データの作成に成功した。何かレコードを追加するようなAPIのレスポンスに201を設定することがある。

# 300系
別ページに遷移したと思えばOK
### 301 Moved Permanently
### 302 Found

# 400系
リクエストがおかしい。クライアント側に問題がある。
### 400 Bad Request
リクエストパラメータが不正
### 401 Unauthorized
認証情報が不正

### 403 Forbidden
アクセス権限なし（認可不足）
### 404 Not Found
ページが見つからない

# 500系
サーバーエラー
### 500 Internal Server Error
サーバー側がシステムエラー（バグ）
### 502 Bad Gateway
サーバーがダウンしてるかも？ネットワークに問題がありそう

#### 504  Gateway Timeout
サーバーからの応答がない。ネットワークに問題がありそう
recentf の内容(最近開いたファイル達)を ido 等から選ぶ

# recentf-find-file.el

recentf の内容(最近開いたファイル達)を ido 等から選ぶ拡張です.
[2018/03/18](https://qiita.com/s-fubuki/items/7a0548351440b7bcf4f6) に公開してあったものを、久々に使ってみて気になるところを手直ししました[May 4 2024 update].

- 更新順にソートしていたのをやめる
何か理由があったんだと思いますが、何故そうしていたのか今となっては理由不明.

- 重複ファイル名対策
フルパス表示の recentf のメニューと違ってファイル名だけで選ぶことになるので、同名別ディレクトリのファイルは `text.doc<foo>` `text.doc<bar>` 等と親ディレクトリ名を付け足して区別.

- 補完関数のカスタム変数化
[ido-completing-read+](https://github.com/DarwinAwardWinner/ido-completing-read-plus) を入れていれば、そのままでも ido が起動しますが、そうでないと通常の Emacs の補完になります.
が、以下のようにすると入れていなくても ido 補完になります.
未確認ですが、他の補完拡張でも
標準の `completing-read` に対応する関数が用意されていればここにセットして使えると思います.

```emacs-lisp
(setq recentf-find-file-completing-function 'ido-completing-read)
```

# インストール
[github](https://github.com/s-fubuki/recentf-find-file) から DL して `load-path` 上にコピーし `init.el` に以下のように書きます.
2行目以降は環境や必要によって書き換えてください.

```emacs-lisp:init.el
(autoload 'recentf-find-file "recentf-find-file" nil t)
(setq recentf-find-file-completing-function 'ido-completing-read)
(global-set-key "\C-cr" 'recentf-find-file)
```
フラグバイトに使う値ランキング

![SS 192.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png) せっかくなら一般的なやつを使いたい

## やること
ちょっとした通信プロトコルのようなものを作ろうとした時、通信の開始や終了を示すシグナルとなるデータを入れたくなります。
この役割をするデータ値は「フラグバイト」や「フレームデリミタ」というらしいです。
どんな値がメジャーかを調べてみたのでメモにしておきます。

## メジャーな５つのフラグバイト！
ChatGPTにメジャーなものをピックアップしてもらいました。
強引にランクづけしてもらったので順位はあくまでご参考までです。

|順位|HEX|BIN|DEC|
|:-:|:-:|:-:|:-:|
|1|0x7E|01111110|126|
|2|0xFF|11111111|255|
|3|0x55|01010101|85|
|4|0x00|00000000|0|
|5|0xFE|11111110|254|

## 第1位 : 0x7E 

|HEX|BIN|DEC|
|:-:|:-:|:-:|
|0x7E|01111110|126|

ビットパターン「01111110」には他の通常のデータとの混同を避けやすいという合理性があり、また、ビットの並びが特異であるため、フレームの開始や終了を明確に識別しやすいとのことです。

素朴な疑問としてデータ本体の中身に0x7Eが現れたらどう区別するのかという問題がありますが、たとえばPPPでは0x7D（二進数で 01111101）というエスケープバイトで処理されています。0x7Eと0x7Dがデータとして送信される必要がある場合、それぞれ0x7D-0x5Eと 0x7D-0x5D（0x20をXORした値）に置き換えて送信し、受信後にデコードすればOKというわけです。この方式を「バイトスタッフィング」と言うそうです。

用途：HDLC、PPPなどでフレームの開始と終了を示すなど。

## 第2位 : 0xFF 

|HEX|BIN|DEC|
|:-:|:-:|:-:|
|0xFF|11111111|255|

全てのビットが1であるため、非常に識別しやすく、他のデータとの混同が少なく理想的とのことです。
EEPROMやフラッシュメモリなどでメモリやレジスタを初期化する際に0xFFで埋めるシステムが多く、未使用またはリセット状態を示す値としても有効です。
ファームウェアやデバイスドライバなどの低層のプログラムでは、エラーや異常な状態を示すフラグとして使用されることもあるそうです。

用途：JPEGのセグメントマーカー、I2Cでのバスフリー状態など。


## 第3位 : 0x55

|HEX|BIN|DEC|
|:-:|:-:|:-:|
|0x55|01010101|85|

ビットパターン「01010101」は非常に規則的で、交互のパターンがデータ同期の際に役立ち、データストリームのビットクロックを正確に同期させるのに有効とのことです。
規則的なビットパターンは伝送エラーやデータの損傷が発生した場合にその異常を検出しやすく、特に連続したデータストリームで異常がないかを監視するのに適しています。
このパターンをプリアンブル（前置符号）として使用することで、受信機が受信データの開始点を正確に捉え、データのフレーミングエラーを減少させることができます。
フレーム同期や通信テストでも活用されるパターンとのことです。

用途：Ethernetなどで使われるプリアンブルなど。特にネットワーク機器での利用が多い。

## 第4位 : 0x00
|HEX|BIN|DEC|
|:-:|:-:|:-:|
|5|0x00|00000000|0|

ビットパターン「00000000」は、「ヌルバイト」または「ヌルキャラクター」として知られており、多くのプロトコルとシステムにおいて基本的ながら非常に重要な役割を果たすバイトだそうです。
C言語をはじめとする多くのプログラミング言語で、0x00は文字列の終端を示すために使用されます。これにより、プログラムは文字列の終わりを識別し、メモリを超えて読み込むことなく適切に処理を行うことができます。
データパディングやメモリ初期化にも使われることが多いです。

0x00がデータ本体内で現れないようにするテクニックとして、[COBS](https://qiita.com/Ninagawa123/items/ef06007fe6ccb1720dd5)によるエンコード送信などがあります。

## 第5位 : 0xFE
|HEX|BIN|DEC|
|:-:|:-:|:-:|
|0x00|11111110|254|

ビットパターン「11111110」は通信プロトコルにおいて主にデータ通信でのフレーム終端、エラーチェック、または特殊な制御信号として使用されるそうです。
特にシリアル通信では0xFEをフレームの終端を示すマーカーとして使用することがあり、これにより、受信機はデータフレームの終わりを認識し、正確にフレームを区切ることができます。
また、データの完整性を確認するためのエラーチェックにも使用されます。たとえば、データパケットが正しく終了したかどうかを示すために、パケットの最後に0xFEを配置することがあります。
いくつかのプロトコルでは、0xFEを特殊な制御信号やコマンドの開始を示すために使うことがあります。通信中に特定の操作を実行するためのトリガーとなります。

用途：RS-485通信のフレーム終端や特別な制御フレームのマーカーやModbus RTUのデータフレーム終端として。

    
## その他

0x81:HDLC (High-level Data Link Control): HDLCで使用。
0x3C:HTML/XML:マークアップ言語でタグを開始するために使用。
0x1B:ANSIエスケープシーケンス:ターミナルやコンソールでの画面制御など

いろいろ違っていたらすみません。ご指摘ください。
Figure のタイトルや軸ラベルに添字が現れちゃう問題（Interpreter の設定）

プロット作るとき、文字が下付き（添字）になっちゃって困ったことありませんか？ 

解決策を 3 つ

1.  \_ の前に \\ をつけておく
2. Interpreter プロパティを none に変更
3. そもそもデフォルト設定を変更

それぞれ紹介します。

デフォルトで Interpreter プロパティが tex になっているため、アンダースコア（\_）が添字にさせるコードだと解釈されて文字列が表示されるのが原因です。

```matlab
figure
plot(rand(10,3),LineWidth=2)
title('MATLAB_Simulink')
xlabel('X_Label_1')
ylabel('Y_Label_1')
legend(["Data_1st","Data_2nd","Data_3rd"])
fontsize(14,'point')
grid on
```

![figure_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149511/57547ca8-0e71-6ab8-b614-662c0a7c1912.png)


# \_ の前に \\ をつけておく

アンダースコアを無効化するわけですね。チョット面倒ですが \_ の前に \\ をつければそのまま表示されます。


メリットとしては、本当にアンダースコアで添字にしたいものと、そうでないものが混ざっている場合でも気軽に使える点でしょうか。

```matlab
figure
plot(rand(10,3),LineWidth=2)
title('MATLAB_Simulink_{R2024a}') % 例えばこんな感じ
xlabel('X_Label_1')
ylabel('Y_Label_1')
legend(["Data_1st","Data_2nd","Data_3rd"])
fontsize(14,'point')
grid on
```

![figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149511/225c57fe-3236-f011-372f-6d2204b1294b.png)

# Interpreter プロパティを none に変更

tex で解釈させるのが問題であれば、設定を変えれば良い。

```matlab
figure
plot(rand(10,3),LineWidth=2)
title('MATLAB_Simulink',Interpreter='none') % 例えばこんな感じ
xlabel('X_Label_1',Interpreter='none')
ylabel('Y_Label_1',Interpreter='none')
legend(["Data_1st","Data_2nd","Data_3rd"],Interpreter='none')
fontsize(14,'point')
grid on
```

![figure_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149511/16b7127d-c04d-cd50-3542-e8cba0e38cca.png)

# デフォルト設定を変更

いちいち Interpreter = 'none' を設定するのが面倒！そんな時はデフォルトで Interpreter = 'none' で機能するようにしちゃえば良いですね。


ささささささささ（[@pzt9tmeh](https://twitter.com/pzt9tmeh)）さんもコメントくれています。


<blockquote class="twitter\-tweet"><p lang="ja" dir="ltr">こんな感じでグラフィックルートオブジェクトにInterpreterのdefault値を設定したら、都度入れなくてもよくなり快適になりそうです。 <a href="https://t.co/RdPM5G9mYF">pic.twitter.com/RdPM5G9mYF</a></p>&mdash; ささささささささ (@pzt9tmeh) <a href="https://twitter.com/pzt9tmeh/status/1782768872971481476?ref\_src=twsrc%5Etfw">April 23, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf\-8"></script>


要注意な点としては、軸ラベル、タイトル、軸Tickに入れる文字、それぞれでプロパティが違うところです。↓のように 3 つ設定しておけば大体のケースは大丈夫かなと・・。

```matlab
set(groot,DefaultTextInterpreter = 'none') 
set(groot,DefaultLegendInterpreter = 'none') % 凡例部分
set(groot,DefaultAxesTickLabelInterpreter = 'none') % 座標軸の tick ラベル

figure
plot(rand(10,3),LineWidth=2)
title('MATLAB_Simulink')
xlabel('X_Label_1')
ylabel('Y_Label_1')
legend(["Data_1st","Data_2nd","Data_3rd"])
fontsize(14,'point')
grid on
```

![figure_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149511/7969fd8d-4659-7b99-a9f3-409f9f94ae9d.png)


# まとめ

デフォルト値を設定する方法が1番楽でしょうか。MATLAB を再起動するとデフォルト値が出荷時のそれ（本当のデフォルト値）に戻ります。

毎回コードに書くのが面倒という場合は [startup.m ](https://jp.mathworks.com/help/matlab/ref/startup.html)で設定しておくのも手ですが、設定したことを忘れてしまったり、他の人にコードを渡した時に挙動が変わっちゃう可能性がある点は要注意です。
ExperienceCloudの開発

ExperienceCloudってなにそれ・・という状況から、ExperienceCloudのスキルアップできるロードマップです。

全編ほぼ動画なので見やすいかと。

### 【Product紹介-Experience Cloud】Experience Cloudのご紹介

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

### Experience Cloud の基本

https://trailhead.salesforce.com/ja/content/learn/modules/community_cloud_basics

### Experience Cloudとは

https://successjp.salesforce.com/article/NAI-000440

### おうちでゆっくり！エクスペリエンスビルダーサイトを作ってみよう

https://successjp.salesforce.com/article/NAI-000443


ここから下は、開発もしたいっていう方にオススメです。

### Did You Know Series

https://www.youtube.com/playlist?list=PLFNbZmUNjID4VwxlneQOt8YWreQD6F62Y


### How to build LWR sites with Experience Cloud

https://www.youtube.com/playlist?list=PLgIMQe2PKPSJXw3x0cPTJhzNyLBgpZV5a

いかがでしょうか？
動画を見ながら、慣れてきたら手を動かすのがオススメです！
フローから新規ユーザ作成した際の初回ログインメールの作成


[フローから新規ユーザ作成した際の初回ログインメールについて](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ajaLj)



フロー内でユーザーレコードが自動作成されると、登録したメールアドレスに

最初のログインメール「Salesforce へようこそ: アカウントを確認してください」* を送信したいのですが、メールが正しく動作しません。

このメールは、システム管理者が手動で新規ユーザーを追加した際に送信されます。

----------

SFさんの中の人からウエルカムメールはトリガーできなくて答えがありますね。
回避策としてはパスワードのリセットメール程度ですが、避けたいと質問者が答えています。

フロー内のメールを別途送信するしかないですが、同じものは無理です。

このスレッドによれば、新しいユーザーの電子メールを宣言的にトリガーする方法はありません。コードを使用してパスワードをリセットすることはできますが、最初の新規ユーザーの電子メールをトリガーすることはできないと思います。 

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000BsjVfSAJ


回避策になるかもしれない回答があります。

この場合はデータローダーでユーザーを一括登録した後ですが、フローでも同じだと思います。
Apexを使って共通のパスワードを設定してウエルカムメールと同じようなメールということみたいです。

パスワードを（共通のパスワードに）設定します。共通パスワードを設定するには、Apex の知識が少し必要になります。これを参照してください: https://success.salesforce.com/answers?id=90630000000gn9YAAQ

ユーザー認証情報に関するガイダンスと、含めたいカスタム メッセージを含むカスタムのウェルカム メールを送信します。
https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A99eNSAR
ターミナルを便利に！【macOS】

# はじめに

`.zshrc`を編集して、macのターミナルを便利にしましょう。

# `.zshrc`の設定手順

## 1.  エディタで`.zshrc`を開く

好きなやり方で大丈夫です。

`.zshrc`はホームディレクトリ直下にあります。
すでにある場合も、新しく作る場合も、以下のコマンドを実行すれば大丈夫です。

（`vim`など、他のエディタを使いたい方はそれを使って大丈夫です。）

【macOS に入っているnanoエディタで開く】
```zsh
% nano ~/.zshrc
```

【VSCodeで開く（コマンド設定が必要）】
```zsh
% code ~/.zshrc
```

## 2. `.zshrc`の設定

こちらの記事の内容が非常に良いです。補完が超強化されます。
[zsh で git コマンドの補完を有効にする · GitHub](https://gist.github.com/d-kuro/352498c993c51831b25963be62074afa)
- `git`のブランチの自動補完
- オプションのリストを表示・補完など・・・


コードブロックの中身をコピペで大丈夫です。
```
fpath=($(brew --prefix)/share/zsh/site-functions $fpath)

# 補完機能を有効にする
autoload -Uz compinit
compinit -u

# 補完候補に色つける
autoload -U colors
colors
zstyle ':completion:*' list-colors "${LS_COLORS}"

# 単語の入力途中でもTab補完を有効化
setopt complete_in_word
# 補完候補をハイライト
zstyle ':completion:*:default' menu select=1
# キャッシュの利用による補完の高速化
zstyle ':completion::complete:*' use-cache true
# 大文字、小文字を区別せず補完する
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
# 補完リストの表示間隔を狭くする
setopt list_packed
 
# コマンドの打ち間違いを指摘してくれる
setopt correct
SPROMPT="correct: $RED%R$DEFAULT -> $GREEN%r$DEFAULT ? [Yes/No/Abort/Edit] => "
```

他にも、「コマンドに別名をつける」「常に指定したオプションで実行する」こともできます。

- `docker compose exec web bash`コマンドに`dwbash`という別名をつける
- `ls`コマンドを常に`-hlGF`オプションで実行
- `rm`コマンドを実行時（削除時）、常に確認が入るように変更

```
# 別名（エイリアス）を設定
alias dwbash='docker compose exec web bash'

# 別名（エイリアス）でコマンドを上書き
alias ls='ls -hlGF'
alias rm='rm -i'
```

https://qiita.com/kohki_takatama/items/74c617703ee57277318d
# ちなみに `.zshrc` とは

Z shell （<font color="LimeGreen">zsh</font>）の実行（<font color="LimeGreen">r</font>un）コマンド（<font color="LimeGreen">c</font>ommand）の略です。
「zshを起動した時に読み込まれるコマンド」といったイメージ。

### zshとは
2024/04現在 macOSのログインシェル（デフォルトで起動されるシェル）です。

https://wa3.i-3-i.info/word11788.html

> **zsh**とは
> [シェル](https://wa3.i-3-i.info/img/icon_hatena.png "人間様からの入力をコンピュータさんに伝えるプログラム")の種類のひとつ  
> であり  
>   
> 自称「最強」のシェル  
> です。

### `rc`の由来
`runcom`というのが由来のようです。

https://en.wikipedia.org/wiki/RUNCOM

# おわりに

みなさんのターミナルがより便利になったら嬉しいです！

さて、次は何を書こうかしら・・・

# 参考

[zsh で git コマンドの補完を有効にする](https://gist.github.com/d-kuro/352498c993c51831b25963be62074afa)

https://wa3.i-3-i.info/word11788.html

https://en.wikipedia.org/wiki/RUNCOM

[エンジニアなら知っておきたいmacOS環境のキホン コマンド・Docker・サーバなどをイチから解説 | 大津 真 |本 | 通販 | Amazon](https://www.amazon.co.jp/dp/4295015032)
amazon linuxでのgithubファイル展開

<h1>はじめに</h1>
amazon linuxでのgithubファイル展開<br>
aws github 展開　連携

<h1>linux系コマンドでのgithub連携</h1>

今回はamazon linuxを使っています。
<ul>
<li>github ファイル展開 設定
<li>ilnux ssh追加(ssh接続でAWSにログイン)
<li>linux github ファイル展開

</ul>

<h1>github ファイル展開 設定<h1>

<h2>GitHubにログイン</h2>
\Settings<br>
\SSH and GPG keys<br>
\New SSH keyボタン<br>

Settings
![github_ssh1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775234/10f5da44-1696-e83a-5260-925c9979f628.png)
SSH and GPG keys
![github_ssh2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775234/254a6a03-76be-d54d-3d80-84a8bb18d2de.png)
New SSH keyボタン
![github_ssh3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775234/5bcc1067-613f-2f8b-3849-6adbd703cf05.png)

title設定(例：aws-server-ssh)
key ssh pub 

↓sshをaws ec2　で作成します。↓

<h1>ilnux ssh追加(ssh接続でAWSにログイン)</h1>
git inst

```
sudo yum install -y git
```

SSHキーを作成
```
ssh-keygen -t rsa -b 4096
```

ssh pub 参照(github ssh登録用にコピー)
```
cat ~/.ssh/id_rsa.pub
```

title設定(例：aws-server-ssh)
key ssh pub 
ペースト保存

<h1>linux github ファイル展開</h1>

yes回答
```
ssh -T git@github.com
----- yes
```
サクセス時
```
Hi name! You've successfully authenticated, but GitHub does not provide shell access.
```
エラーが出てる場合は、github連携からもう一度確認。

fin
/github連携 終わり
StampS3のI2Cを使い、AQM0802A液晶で文字表示(簡易版)

x 原因は、わからないが液晶がちらつく場合は、ウェートを調整してね!!

目的
I2C液晶のテスト

![o_coq070.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/1237b2af-d3a6-13e3-1cd8-23a3114716ce.jpeg)



arduinoのプログラムと完全に同じ



```c++


//AQM0802A_DEMO1

#include <Wire.h> //I2C library

//i2cバッファー
char data_read[4];

//初期レジスター
char INIT_com[] = {
  0x0, 0x38, //1
  0x0, 0x39, //2
  0x0, 0x4,  //3
  0x0, 0x14, //4
  0x0, 0x70, //5
  0x0, 0x56, //6
  0x0, 0x6C, //7
  0x0, 0x38, //8
  0x0, 0xC   //9
};

//画面のクリアレジスター
char INIT_cls[] = {0x0, 0x1};


//i2c書き込みルーチン
void i2c_lcd_w(char *buff1) {
  Wire.beginTransmission(0x3E);
  Wire.write(buff1[0]);
  Wire.write(buff1[1]);
  Wire.endTransmission();
  delay(2);
}//i2c_lcd_w


void ns_putc(char ch)
{

  data_read[0] = '@';
  data_read[1] = ch;

  //I2Cに送信
  i2c_lcd_w(data_read);

}//ns_putc


void ns_puts(const char *str1)
{

  //文字の中身がゼロか
  while (*str1) {

    //一文字出力
    ns_putc(*str1 ++);

  }//while

}//ns_puts


//カーソルの移動
void setCursor(int col, int rows)
{

  data_read[0] = 0x0;
  data_read[1] = 0x80 +  (rows * 0x40) + col ; //カーソルを移動

  //I2Cに送信
  i2c_lcd_w(data_read);

}//setCursor


//初期化関数
void setup()
{

  //I2Cの初期化
  Wire.begin();

  //液晶の初期化
  for (int ii = 0; ii < 9; ii++) {
    i2c_lcd_w(&INIT_com[ii << 1]);  // ii << 1 = ii * 2
  }//for

  //画面のクリア
  i2c_lcd_w(INIT_cls);

  //表示
  setCursor(0, 0); ns_puts("HELLO");
  setCursor(0, 1); ns_puts("WORLD");

}//setup


//メインループ
void loop()
{}//loop



```
PostgreSQL GroupByの小さな最適化

# GROUP BY の最適化

複数列を集約する場合は、多様性の高い列から集約したほうがクエリ実行速度が速くなります

DB の作成

```
createdb -U postgres sample
psql -U postgres -d sample
```

データの作成

```sql
sample=# create table t_agg (x int, y int, z numeric);
CREATE TABLE
sample=# insert into t_agg select id % 2, id % 10000, random() from generate_series(1, 10000000) as id;
INSERT 0 10000000
sample=# vacuum analyze;
VACUUM
```

実行計画の視認性を上げるために並行クエリを off にします

```sql
sample=# set max_parallel_workers_per_gather to 0;
SET
```

GROUP BY(x -> y)の実行

```sql
sample=# explain analyze select x, y, avg(z) from t_agg group by 1,2;
                                                         QUERY PLAN

----------------------------------------------------------------------------------------------------------------------------
 HashAggregate  (cost=238697.01..238947.86 rows=20068 width=40) (actual time=5686.836..5695.259 rows=10000 loops=1)
   Group Key: x, y
   Batches: 1  Memory Usage: 4881kB
   ->  Seq Scan on t_agg  (cost=0.00..163696.15 rows=10000115 width=19) (actual time=0.505..1001.261 rows=10000000 loops=1)
 Planning Time: 5.708 ms
 Execution Time: 5698.786 ms
(6 行)
```

GROUP BY(y -> x)の実行

```sql
sample=# explain analyze select x, y, avg(z) from t_agg group by 2,1;
                                                        QUERY PLAN

---------------------------------------------------------------------------------------------------------------------------
 HashAggregate  (cost=238697.01..238947.86 rows=20068 width=40) (actual time=4567.695..4574.348 rows=10000 loops=1)
   Group Key: y, x
   Batches: 1  Memory Usage: 4881kB
   ->  Seq Scan on t_agg  (cost=0.00..163696.15 rows=10000115 width=19) (actual time=1.557..741.097 rows=10000000 loops=1)
 Planning Time: 0.114 ms
 Execution Time: 4575.441 ms
(6 行)
```

集計順序を変えると僅かにパフォーマンスが上がります

```sql
sample=# select count(distinct x), count(distinct y) from t_agg;
 count | count
-------+-------
     2 | 10000
(1 行)
```

実行計画に差異はありませんが、多様性の低い列を後に記述したほうがハッシュ集計が効率的に実施されます。

[参考ページ]

https://www.cybertec-postgresql.com/en/speeding-up-group-by-in-postgresql/
BlobField のエラー



+ [Is this Batch Apex error anything I need to address? What happens if I ignore it? I don't think I did anything different yesterday, and I have never seen an overnight error before now, after 15 years!](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007bLXkx)

:::note alert
Message: "First error: [UNKNOWN_EXCEPTION] BlobField : U#433.3fffffff (AsyncApexJob) U#433.13ff (State) got exception Unable to execute HTTP request: Incomplete output stream"

Context: npsp__CRLP_SkewDispatcher_BATCH
:::

:::note
I haven't received an alert email, but I think the connection to Salesforce became unstable a few hours ago. There was also a 503 error.

Temporary performance degradation may be the cause

https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007T4AJjSAN
:::

:::note
BlobField : U⌗15f.3fffffff (Attachment) U⌗15f.aff (Body) got exception Request timed out waiting for connection: [config 200ms, actual 215ms] - SERVER_UNAVAILABLE: Request timed out waiting for connection: [config 200ms, actual 236ms]

BlobField : U⌗15f.3fffffff (Attachment) U⌗15f.aff (Body) got exception Exception by writeBlob: BlobField: Attachment 00PD000000glfYF 
:::

Fileforce について聞いたことはありませんでしたが、 http://highscalability.com/blog/2013/9/23/salesforce-architecture-how-they-handle-13-billion-transacti.htmlを見つけました。
当社は、Amazon の S3 や OpenStacks の Swift プロジェクトと概念が似た、オブジェクト ストレージを提供するサーバー層を維持しています。このシステム Fileforce は、DB 層の負荷を軽減するために内部で開発されました。 Fileforce が導入される前は、すべてのバイナリ ラージ オブジェクト (BLOB) はデータベースに直接保存されていました。 Fileforce がオンラインになると、32 KiB を超えるすべての BLOB が Fileforce に移行されました。サイズが 32 KiB より小さい BLOB はデータベース内に残り続けます。 Fileforce 内のすべての BLOB はデータベース内に参照を持っているため、バックアップから Fileforce データを復元するには、同じ復元ポイントからデータベース バックアップに基づいてデータベース インスタンスを起動する必要があります。

Fileforce には、Fileforce サーバーのディスクシーク負荷を軽減するために開発されたバンドラー機能が含まれています。 32 KB 未満のオブジェクトが 100 個以上データベースに保存されている場合、アプリケーション サーバー上でプロセスが実行され、それらのオブジェクトが 1 つのファイルにバンドルされます。バンドルされたファイルへの参照は、バンドルへのシーク オフセットとともにデータベースに残ります。これは Facebook の Haystack 画像ストレージ システムに似ていますが、オブジェクト ストレージ システムに組み込まれています。

これがリンクしているようです。


# You should only call getBlob[Compressed]LengthField on Blob field Types.

+ [【未解決】Service Report Document Body API Endpoint](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007bL8Cg)
aws ec2 github連携 html server cloud data server 展開(編集中)

aws ec2 タイトル未定 html server cloud deta server展開

後日編集予定
aws ec2　github 連携　完了
aws ec2　html server 完了
aws ec2　cloud data server 後日記載

awsページから ec2 展開

github連携

GitHubにログイン
\Settings
\SSH and GPG keys
\New SSH keyボタン

Settings
![github_ssh1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775234/10f5da44-1696-e83a-5260-925c9979f628.png)
SSH and GPG keys
![github_ssh2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775234/254a6a03-76be-d54d-3d80-84a8bb18d2de.png)
New SSH keyボタン
![github_ssh3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775234/5bcc1067-613f-2f8b-3849-6adbd703cf05.png)

title設定(例：aws-server-ssh)
key ssh pub 

↓sshをaws ec2　で作成します。↓

ssh接続でAWSにログイン
git inst
```
sudo yum install -y git
```
SSHキーを作成
```
ssh-keygen -t rsa -b 4096
```
ssh pub 参照(github ssh登録用にコピー)
```
cat ~/.ssh/id_rsa.pub
```
title設定(例：aws-server-ssh)
key ssh pub 
ペースト保存

github接続

yes回答
```
ssh -T git@github.com
----- yes
```
サクセス時
```
Hi name! You've successfully authenticated, but GitHub does not provide shell access.
```
エラーが出てる場合は、github連携からもう一度確認。

fin
/github連携 終わり

aws ec2 html server 設定
・htmlソフトapacheのインストール
・githubに予めhpファイル(htmlファイル)展開
・aws ec2からgithubにアクセス　hPファイル展開
・aws ec2　セキュリティーに　http　を追加


Apacheのインストール
```
sudo yum install httpd
httpd -v
```
apacheの開始
```
sudo systemctl start httpd
```
このタイミングでaws ec2のパブリックipにアクセスすると、test pageが出てきます。
```
http://aws-ec2パブリックip
```
aws ec2 に/var/www/html/を作成する
```
cd
cd
cd
mkdir -p var/www/html
cd var
cd www
cd html
```
※cdは最上位階層に行くためです。設定しているとどこの階層にいったか忘れて設定することもあるので、cdして最上位階層に戻る癖があった方がよかったりよくなかったり(さっきの階層の方が楽だった)斜線※
^

githubからhpファイルのリポジトリにアクセスして、クローン展開
```
sudo git clone https://github.com/××××××××/××××××××
```
リポジトリのファイルからhp用ファイル移動
```
sudo mv　××××××××/* /var/www/html/
```
ファイル確認
```
ls
```
ウェブサイト確認
aws ec2のパブリックipにアクセス
HP用にgithubに展開したhtmlが確認出来れば終了。

公開されない場合、
aws ec2 html server 設定 から再度展開or確認。

aws ec2 cloud date server 設定
・ec3があるがec2なら無料枠
・htmlをec2で公開したし、出来ればguiで効率的なファイル移動と保存をしたい。
・無料でクラウドサーバーが持てる(ec2無料枠 30gb)

後日記載
Javaで「文の記述と空白や改行の扱い」の動作を確認してみた

# 概要

Javaで「文の記述と空白や改行の扱い」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/const/index4.html

# 実装

以下のファイルを作成しました。
```Hello03.java
class Hello03{
  public static void main(String[] args){
    System.out.println("Hello");
    System.out.println("How are you?");
    System.out.println("Bye");
  }
}
```

以下のコマンドを実行しました。
```
$ javac Hello03.java 
$ java Hello03 
Hello
How are you?
Bye
```

# まとめ

何かの役に立てばと。
昔模様を作るプログラムを作った話

※結構昔に作ったプログラムで下手なのでご容赦ください。
# フラワーオブライフ
ある日(3年以上前)にYouTubeで面白い模様を見たのです。
紹介として「黄金比と円周率を掛け合わせた幾何学模様、それがフラワーオブライフ」と都市伝説系YouTubeで見て、その図形は神社の狛犬とか他世界中に使われているらしく、最近だと日〇レの夜11時のニュースのOPで見れます。
## プログラム
円が見た感じ円の中心から正六角形の頂点に新しく中心を作り円を作るという感じの図形になっています。
```Python3
import numpy as np
import matplotlib.pyplot as plt

def en(theta, cx, cy):
    x = np.array([])
    y = np.array([])
    for i in range(len(cx)):
        x = np.append(x, np.cos(theta)+cx[i])
        y = np.append(y, np.sin(theta)+cy[i])
        line = np.arange(0, 360.1, 0.1)
        plt.plot(np.cos(np.pi*line/180)+cx[i],np.sin(np.pi*line/180)+cy[i],color="#000000")#,color="#c1ab05")
    return x, y


kaku = np.array([0, 60, 120, 180, 240, 300, 360])
thet = np.pi * kaku / 180
x, y = en(thet, [0], [0])
x2 = np.array(y)
y2 = np.array(x)
for i in range(4):
    x, y = en(thet, x, y)
plt.savefig("FlowerofLife")
plt.show()
```
このプログラムを実行すると以下のような図形が出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/a17565d2-f503-4c5e-0c79-d79ddba5b2c1.png)
何とも言えない図形です。

# 麻の葉模様
某アニメを見ていて(第一クールで見るのやめたけど)美しい模様でなおかつフラワーオブライフと似ていると思った模様だと思って作ったものがあります。
## プログラム
今度のプログラムは角度計算以外に辺の長さは正弦定理を使って長さを考えるなど色々と工夫して作りました。
あとキャラクターの色に合わせて背景も変えています。
```Python3
import matplotlib.pyplot as plt
import numpy as np

def neduko(cnt, ctr):
    if cnt == 0:
        return 0
    else:
        cnt = cnt - 1
        tmp = []
        for i in range(6):
            for j in range(len(ctr)):
                tmp.append([ctr[j][0]+np.cos(60*i*np.pi/180), ctr[j][1]+np.sin(60*i*np.pi/180)])
            plt.plot([ctr[:, 0],ctr[:, 0]+np.cos(60*i*np.pi/180)/2], [ctr[:, 1],ctr[:, 1]+np.sin(60*i*np.pi/180)/2], color="#000000")
            plt.plot([ctr[:, 0],ctr[:, 0]+np.cos((60*i+30)*np.pi/180)/np.sqrt(3)], [ctr[:, 1],ctr[:, 1]+np.sin((60*i+30)*np.pi/180)/np.sqrt(3)], color="#000000")
        neduko(cnt, np.array(tmp))

ax = plt.axes()
ax.set_facecolor("#FDE8E9")
neduko(cnt=4, ctr=np.array([[0, 0]]))
plt.show()
```
実行すると以下のような図形が出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/83856e6a-0cc4-b730-05a1-97b2aceb5684.png)

フラワーオブライフと違ってこっちは再帰アルゴリズムをちゃんと使っているので少し見やすくなったかなと。

# まとめ
図形を作るの難しい。
AWS IAMのUserとRoleとPolicyについてふんわりとした説明

# さいしょに
たまにお尋ねされるのでふわっと説明＆現状の認識をまとめています。

# 要素ごとの相関図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570665/aa22b855-f978-2798-b43f-0f1e6e9046d9.png)

# 要素の説明

## User
AWSのアカウントを利用する主体。
人間だったり権限だったりするけれど、AWSを使って何かをしようとする存在を端的に表したもの。
「AWSのアカウント」と言った時に、アカウントではなくIAMのユーザを指す場合があるので文脈を読もう。

なお、AWSをAWSの外部から使うのはUserを通してだけではなく他の方法もある。

## User Group

User一つごとにポリシーあてるのが面倒だからこれでまとめて管理する。

「はい二人で一組を作ってくださーい。」とかいうのは関係がない。

## Policy
AWSのサービスで細かく定めてある**行動**をまとめたもの。
行動＝権限と考えて良い。

後述の適用条件で否定しない場合は許可ベースである。

たとえば人間だとたくさんのアトミックな（原始的な）行動がある。（Actionsで説明）
それらを束ねて〜してもいいというルールにまとめたものがポリシーに相当する。

また、ポリシーには行動だけでなく、適用条件(Conditions)や適用されるサービスやARN(Principal)を指定する項目もある。

適用条件は「髪が青い人は宇宙船を操縦できる」とか。
この場合「髪が青い人」が条件で、「宇宙船の操縦」が行動である。
あまり書かないけれど「髪が青くない人」という条件も書けたと思う。

### Managed Policy
ポリシーの中にはあらかじめAWSさんが用意してくださっているマネージドポリシーというものと、利用者が独自に定義する単なるポリシーがある。
AWSが管理しているからマネージドなポリシーである。
こんな感じのアイコンついてたらそれで、ついてなければ利用者が独自に定義したもの。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570665/c69f4389-6e80-3178-5b07-7a6adccea2b3.png)

### Inline Policy
ちょい付け足しのポリシーでポリシーの一覧にはないけれどUserやRoleで定義できるポリシー。
ポリシーの一覧としては出てこないけれど、これもれっきとしたポリシー。

### Service Original Policy
正式な名前はよくわからないけれど、サービスが持つポリシー。
S3が代表例で、このサービスのポリシーのことをわかるようになれば一人前。

## Role
前述したものも含め一部の例外はあるけれど、AWSのサービスを利用するサービスに対してポリシーをまとめて提供する役割を担う。
つまり、サービスがサービスを利用する時に主に使われるけれど、それだけではない・・

## Actions
`s3:ListBucket` などのサービスごとに定められた細かい行動。

人間で例えると・・下記に該当する・・のかな。

* 「食べる」 human:eat
* 「寝る」 human:sleep
* 「住む」 human:live
* 「息をする」 human:bress
* 「選挙にいく」 human:選挙

「権利、権限」に近いものかもしれない。

# 所感
細かい説明はAWSのドキュメントを読んだり試験を受けたりするといいかもですが、わかってる人向けの文章なので実感がない状態で読んでもよくわからないことが多いと感じます。

利用方法はこの相関図で説明できない例外がそこそこあってややこしいなあと思うけれど、下記の認識をどこまで深められるかだと思います。

* 目的はなにか
* 何の要素があるのか
* 何をしていて
* 何ができるのか

以上をふわっとでもいいので理解していれば、あとは知る人ぞ知る抜け道みたいなものだから、都度覚えていけばよいと思います。

この先はかすれていて読めない。
「5分でできるLINEBot」にローディングアニメーションを追加する

# はじめに
2024/4/17 に、LINEBotに回答待機中のときのローディングアニメーション機能が追加されました！

https://twitter.com/lycorptech_jp/status/1780514963360272783

チャットボットを作っていて、AIに回答を作ってもらっているとどうしても返事待ちの時間があるのでこれはめちゃくちゃありがたいですね！

詳細についてはこちらを確認してください！

https://developers.line.biz/ja/docs/messaging-api/use-loading-indicator/#display-a-loading-animation

というわけで以前書いたこちらの記事に、ローディングアニメーション機能を追加する手順です。

https://qiita.com/cog1t0/items/cc7779345a01192d8f01

# 実装
## まずは下準備
こちらの記事を参考にAI応答するLINEBotをGASで作りましょう。

https://qiita.com/cog1t0/items/cc7779345a01192d8f01

## GASに関数を追加
GASの一番下でいいので、以下のスクリプトをコピペしましょう。

```js
// ローディング機能
function loading(userId) {
  UrlFetchApp.fetch('https://api.line.me/v2/bot/chat/loading/start', {
    'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN,
    },
    'method': 'post',
    'payload': JSON.stringify({
      'chatId': userId,
      'loadingSeconds': 20
    }),
  });
}
```

使わさせていただいている [ライブラリ](https://github.com/kobanyan/line-bot-sdk-gas) にはまだ機能がないようなので、応急処置の対応です。
そのうちプルリクエスト出してみます。

## getAIAnswer関数を呼び出す直前に上記を追加

```js
// 略 ~~~~~~~~~

function doPost(e) {

// 略 ~~~~~~~~~

  // 返信するメッセージを作成
  loading(json.events[0].source.userId) // <= getAIAnswerを呼び出す直前のこの位置に追加 ！！！！！！！！！！！！
  const receivedMessage = json.events[0].message.text;
  messages = getAIAnswer(receivedMessage)

  // line-bot-sdk-gas のライブラリを利用しています ( 
  https://github.com/kobanyan/line-bot-sdk-gas )
  const linebotClient = new LineBotSDK.Client({ channelAccessToken: CHANNEL_ACCESS_TOKEN });

  // メッセージを返信
  try{
    linebotClient.replyMessage(replyToken, messages);
  }catch(e){
    // うまく動作しない場合は、エラーが発生していないか確認してみましょう
    log_to_sheet("A", e)
  }

  return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}
// 略 ~~~~~~~~~
```

## 改めてデプロイしましょう
以上で完成です！
忘れないように改めてデプロイしておきましょう！

# 完成！

https://twitter.com/r19_tech/status/1783924662378107344

わりとさっくりできましたね！
AI応答を作るときには標準で欲しい機能だなと思ったので、以下の記事のGASのテンプレートにはデフォルトで入れておきます！

https://qiita.com/cog1t0/items/cc7779345a01192d8f01
Amazon Web Services基礎からのネットワーク＆サーバー構築 サーバー構築

:::note
<a href="https://amzn.asia/d/3qYbC8Z">Amazon Web Services基礎からのネットワーク＆サーバー構築</a> を実施した際の備忘録です。
:::


※前回はこちら

https://qiita.com/hoge889/items/a509b83039138d160689

## 今回の目標

作成したVPC内にEC2を使って仮想サーバを構築します。
画像でピンク枠に囲われている部分です。

![Amazon Web Services基礎からのネットワーク＆サーバー構築.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764512/c994fcad-a886-6bd1-0d2e-867129f74afa.png)

## インスタンスを作成する

『インスタンスを起動』を押下し、インスタンスの作成を開始します。
各種項目は以下のように設定します。

    名前：HogeServer
    OS：AmazonLinux
    AMI：AmazonLinux2023 AMI
    インスタンスタイプ：t2micro

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764512/d9058759-4fc2-a3f8-cb71-1ad218864ca2.png)

キーペアは新たに『HogeServerKey』を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764512/72a4e4f3-8849-ac33-67ad-a4035a8e135a.png)

:::note alert
作成したキーペアは紛失しない・第三者に漏洩しないこと！
:::

ネットワーク設定では、まず『編集』を押下した後、以下のように設定します。

    VPC：【作成したVPC】
    サブネット：【作成したパブリックサブネット】
    パブリック IP の自動割り当て：有効化

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764512/e876f980-1422-71e1-a557-5f5db4d87c21.png)

セキュリティグループは、名称のみ変更し次へ進みます。
SSH接続の項目があることを確認してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764512/4aa6c0f7-dbb8-dcf2-03ae-50724a6f8d7e.png)

:::note 
警告が気になる人は、自身のIPアドレスからのみアクセスできるように設定しておいてください。
:::

また高度なネットワーク設定では、インスタンスのIPアドレスを手動設定するため、
プライマリIPのみ設定しておきます。

今回は、『10.0.1.10』で設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764512/3e81bc49-7f64-7447-ce13-6fae78e2566b.png)

:::note warn
ネットワークアドレスとブロードキャストアドレスに加えて、VPC内では先頭3つのIPも特殊な用途で予約されているため、サーバーに設定することができません。
:::

ストレージについては、デフォルトのままでOKです。

その後『インスタンスを起動』を押下することで、設定した内容で起動開始します。

問題なければ、数分後ステータスチェックに合格するはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764512/e1d14c4e-896e-30af-f0db-c54b1eb5c5e2.png)

## 作成したインスタンスにSSH接続を行う

普段の業務では Tera Term ですが、せっかくなので Rlogin を使ってみます。

https://qiita.com/murachi1208/items/d6e4ce7ba75f1625fe51

https://qiita.com/tks_00/items/db1dc51523de86f0e362

認証設定で以下の通りに入力します。

    エントリー（上）：【サーバー名】
    プロトコル：ssh
    ホスト名（サーバーIPアドレス）：【EC2インスタンスのパブリックIPアドレス】
    TCPポート：ssh
    ログインユーザー名：ec2-user
    SSH認証鍵：【EC2インスタンスの秘密鍵ファイル】

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764512/f1ab54e2-ff75-52b1-22a1-4a117c9481d1.png)

無事にログインできました。
お疲れさまでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764512/096adb81-e727-d5bb-20ac-0ceaacc31d00.png)

次回はWEBサーバとして公開できるように、サーバーソフトをインストールします。


## 参考文献

<a href="https://amzn.asia/d/3qYbC8Z">Amazon Web Services基礎からのネットワーク＆サーバー構築</a> 

https://aws.amazon.com/jp/vpc/faqs/

https://dev.classmethod.jp/articles/201903_ec2-with-custom-private-ip-address/

https://qiita.com/murachi1208/items/d6e4ce7ba75f1625fe51

https://qiita.com/tks_00/items/db1dc51523de86f0e362
Devise使用時にログイン中のモデルと異なるモデルを編集する方法（CompanyでログインしてStaffの編集・更新）

## 概要
この記事では、RailsアプリケーションでDeviseとCanCanCanを使用して、`Company` と `Staff` という二つのユーザーモデルを効果的に管理する方法を紹介します。
特に、`Company` モデルでログインしている状態で `Staff` モデルのデータを編集できるようにする際に生じた以下のエラーの解消法を詳しく解説します。

```bash
Completed 401 Unauthorized in 0ms (ActiveRecord: 0.0ms | Allocations: 209)
```
※ブラウザでリンクを選択後、アクションに遷移する前に上記のエラーが生じたため、deviseの認証関連が原因ではないかとあたりをつけました。

## 1. 導入
本記事では、企業とその従業員をそれぞれ `Company` と `Staff` モデルで管理するシナリオを想定しています。各モデルはDeviseによって認証が行われ、CanCanCanでアクセス権限が管理されます。この設定を通じて、モデルごとの認証と権限のカスタマイズ方法を学びます。

## 2. 環境設定
このチュートリアルを始める前に、以下のGemがインストールされていることを確認してください。

```ruby
gem 'rails', '~> 6.0.0'
gem 'devise'
gem 'cancancan', '~> 3.0'
```

これらのGemをインストールした後、DeviseとCanCanCanの初期設定を行います。

```bash
rails generate devise:install
rails generate cancan:ability
```

## 3. Deviseのセットアップ
`Company` と `Staff` モデルにDeviseを適用します。まずはモデルを生成し、Deviseのモジュールを追加します。

```bash
rails generate devise Company
rails generate devise Staff
```

次に、`config/routes.rb` でDeviseのルーティングを設定します。

```ruby
devise_for :companies
devise_for :staffs
```

## 4. CanCanCanの権限設定
`Ability` クラスで、`Company` が `Staff` のデータを編集できるように権限を設定します。

```ruby
class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new

    if user.is_a?(Company)
      can :manage, Staff, company_id: user.id
    end

    # その他の権限設定...
  end
end
```

## 5. エラー発生
上記の概要で述べたエラーがここで生じました。
```bash
Completed 401 Unauthorized in 0ms (ActiveRecord: 0.0ms | Allocations: 209)
```
処理開始後にbinding.pryで処理を停止させることができなかったことと、Rails.logger.debugでログ取得をしようとしても何も情報を得られなかったため

- controllerのcontrollerのアクション以前の処理
- CanCanCan関連
- Devise関連

のエラーを疑いました。

## 6. 対策
`Staffs::RegistrationsController` をカスタマイズして解決しました。

```app/controllers/staffs/registrations_controller.rb
class Staffs::RegistrationsController < Devise::RegistrationsController
  before_action :set_staff, only: %i(edit update destroy)
  
  # ↓以下のauthenticate_staff!を追記（protected以下でオーバーライドしたものを使用する）
  before_action :authenticate_staff!, only: %i(edit update destroy) 
  load_and_authorize_resource :class => 'Staff', except: %i(create)
  before_action :configure_permitted_parameters, if: :devise_controller?

  def edit
    @staff = Staff.find(params[:id])
  end

  protected

  # 以下でauthenticate_staff!をオーバーライド
  def authenticate_staff!(opts = {})
    @staff = Staff.find(params[:id])
    unless staff_signed_in? || (company_signed_in? && @staff.company_id == current_company.id)
      redirect_to new_company_session_path, alert: 'アクセス権限がありません。'
    end
  end

  def set_staff
    if resource.present?
      @staff = Staff.find(resource.id)
    end
  end
  # その他の設定...
end

```

## 7. まとめ
DeviseとCanCanCanを用いて複数のモデルに対する認証と権限管理を行う方法を学びました。この技術は、大規模なRailsアプリケーションでのアクセス制御に非常に有効です。
【Ubuntu】windows11上でLinuxベースのOSを動かしたい

# はじめに

### この記事を読むとわかること
* 普段使っているwindowsの仮想環境上で別のOSで動かす方法

### 背景
　自分が普段使っているPC上でLinuxを動かしてみたいと思い、普段のOS上でゲストOSを稼働できるソフトウェアを調べたところ、Oracleが開発しているVirtualBoxが無料でインストールできるとのことで、今回まとめました。

### VirtualBoxのインストール

VirtualBoxの詳しい解説は以下の記事を参考にさせていただきました。

https://www.kagoya.jp/howto/it-glossary/server/virtualbox/

　早速ダウンロードしようと思ったら、VirtualBox 7.0.16 は公式よりアップグレードを控える旨の注意書きがあったため、その前の7.0.14をダウンロードしました。(2024/4/26時点)

![スクリーンショット (52).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774406/58cafe65-5766-2129-9f6b-acdd24beb243.png)

↓過去verのダウンロードリンク
https://www.virtualbox.org/wiki/Download_Old_Builds_7_0

ダウンロードされたexeファイルを実行してインストール完了です。

### Linuxディストリビューションについて
　Linuxは様々な種類のディストリビューションが提供されていますが、今回は以下の要件で決めました。
* 技術が一般的であり、多くの開発現場で普及していること
* ライセンス料が無償であること
* CUI,GUI操作どちらもできること

　以上の観点から今回はUbuntuを使用することにしました。

### 導入
　以下のサイトからUbuntuの日本語Remixをダウンロードしました。4社くらいダウンロード先のURLが添付されていますが(2024/4/26時点)、httpsだったのでKDDI研究所からダウンロードしました。


https://www.ubuntulinux.jp/download

　Ubuntuの.isoファイルがダウンロード出来たら、VirtualBoxを実行して新規を押します。下の画面で仮想マシンの名前とOSを指定します。
 
![スクリーンショット (45).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774406/d3593823-f870-bd26-ad61-a3bca7895e54.png)

　次にマシンのスペックを問われます。
　Ubuntuの公式が推奨するハード要件と、今回の筆者の環境は以下の通りです。

||公式推奨 | ゲストスペック | ホストスペック |
|:-:|:-:|:-:|:-:|
|OS|Ubuntu 22.04 LTS|Ubuntu 22.04 LTS|windows11
|CPU|2GHz2コアプロセッサ以上|3GHz2コアプロセッサ|3GHz6コア12プロセッサ|
|メモリ|4GB以上|5GB|16GB|
|ストレージ|25GB以上|30GB|1TB|

　特に大きな処理をするわけではないですが、とりあえず要求スペック以上に設定しました。

:::note warn
CPU、メモリは後から簡単に変えられますが、ストレージの変更は少々複雑なので、ホスト側を圧迫しない程度に余裕をもった容量を確保することをお勧めします。
:::



　OSのインストールメディアを指定するダイアログが開くので、DVDの欄に先ほどダウンロードしたUbuntuのisoファイルを指定します。

![スクリーンショット (48).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774406/2cfa4809-ced7-ebcb-c2c1-a17e43019fc6.png)


![スクリーンショット (51).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774406/d7a68057-6e2a-531a-bb1a-a1c4d00939b7.png)

　無事Ubuntuのデスクトップ画面が開きました！画面が小さかったので、設定→ディスプレイ→解像度を指定しました。

　最後にデスクトップの真ん中にあるUbuntuのインストールを実行すれば完了です。


# まとめ
　今回はVirtualBoxのインストール～Ubuntuの起動まで行いました。
vTPMありwindows 11のVMのコンソールをvCenter Serverで開くと"この操作を実行する権限が拒否されました。"エラーの解決

# 状況
vTPMを追加したWindows 11のVMのコンソールを、vCenter Serverで開こうとすると、下記のようにエラーとなりコンソール表示ができないユーザが発生。Administratorユーザでは、エラーとならずコンソール表示ができる状況。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354637/3426383c-c75d-7b1e-1f61-9be9a97f9f27.png)

# エラー
## 「REMOTE CONSOLE を起動」の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354637/272ec87d-e800-08b1-1713-89f949d35a7b.png)
> VMware Remote Console
> Unable to connect to the MKS: この操作を実行する権限が拒否されました。

> MKS に接続できません： この操作を実行する権限が拒否されました。

と表示される端末もあった。

## 「WEBコンソールの起動」の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354637/3db62207-ce00-0832-6b61-b5213a0f7bf2.png)
> 仮想マシンの Web コンソールに接続できません。この操作を実行する権限が拒否されました。

# 対処方法
該当ユーザのロールに「暗号化操作」の「直接アクセス」を追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354637/13ab61d2-4128-8689-add1-8af4561345ce.png)

（どこの権限が必要かわからず、探すのに苦労した）
資産運用シミュレーションを Looker Studio + スプレッドシートで可視化してみた

# はじめに
どうも最近資産運用をはじめたKです。そうみなさんご存知の新◯SAです。
将来いくら資産形成するには毎月/毎年いくら積立てたらよいかなどシミュレーションしますよね。

ググるとたくさんシミュレーションサイトが出てきますが、私はこちらのサイトをよく利用しています。
https://money-journey.moneyforward.com/simulation/

そこである日ふと「めんどくさいなコレ」「BIツールでサクッと可視化したい」「notionに埋め込むことができたら便利だな」と思いました。

そこでやってみることにしました。(ツール初心者です)

# 作成手順
細かい手順は他の方の記事を参考にしていただきつつ、ざっくり以下が作成手順になります。
1. 元データをスプレッドシートでつくる
2. [Looker Studio](https://lookerstudio.google.com/) で 手順1 をデータソースにしてグラフをつくる
3. [共有] > [レポートへのリンクを共有] から共有リンクを取得する

# 完成イメージがこちら

https://lookerstudio.google.com/reporting/75287119-3d9b-4e6f-9191-b2ef01b083e6

![資産運用_複利シミュレーション_サンプル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70108/26f00e7a-fd00-2285-e926-d3ba731a2092.png)

# 埋め込みコードも生成できるよ

手順3 の後に [ファイル] > [レポート埋め込み] > 埋め込みを有効にする を有効にすると埋め込みリンクが取得できます。会議資料としてnotionでデータ共有したいときに便利！
https://lookerstudio.google.com/embed/reporting/75287119-3d9b-4e6f-9191-b2ef01b083e6/page/kGNyD

# さいごに
Looker Studio はじめて触ったのでこれから解像度高めていろいろできるようになりたいです。それではまた！

# 参考サイト
- https://qiita.com/specialman9999/items/ebb8ef728570ada85e4a#データの作成方法
- https://support.google.com/looker-studio/answer/7450249#zippy=%2Cこの記事の内容
なんで「デービー」って言うの？（キリンの首が長い本当の理由）

この業界ではDB（データベース）のことを「デービー」と言いますね。[^1]
たまに「ディービー」と正しく発音するのを聞くと、「あ、染まってない人だ」と認識します。

なぜかと若人に聞かれて答えられませんでした。
眠れなくなりそうなので、少しだけ考えてみました。

英文内や製品名にも出てきますので、まずは「DB」自体が和製英語ということはなさそうです。

「データベース」の略だからだろうか。
これは聞かれて最初に答えかけました。
が、だったら「デーベー」だよね、とすぐに気づきました。

昔、ある国際企業のグループ会社にお邪魔すると、皆が「インターフェイス」を「**イ**ンターフェイス」（前にアクセント）と正しく発音していました。
さすがと感心しつつも、気恥ずかしくて郷に従うことはできませんでした。
では「インターネット」は？
気になったのですが、そこは普通に「インターネット」でした。
――余談です。

これも昔、「ディ」が発音できなくて「デズニーランド」というおじさん（今はおじいさん）がいました。
それを揶揄したのか、「デゼニランド」というゲームもありました。
業界黎明期の人たちにとって「ディービー」が言いづらかったのでしょうか。

でも、時代で言うとTV（ティービー）の方が古いと思うんですよね。
「**テ**レビジョン」ですが、「テービー」とは略しません。

あるいは、電話とかで間違えないように「Delta の D」と言ったり、「7月（しちがつ）」を「なながつ」と言ったりする、あの気遣いが歓迎されて定着したのでしょうか。

ただ…
* CD（シー**ディー**）
* DVD（**ディー**ブイディー）
* DDL（**ディー**ディーエル）
* DLL（**ディー**エルエル）
* DCOM（**ディー**コム）
* DX（**ディー**エックス）

どれも「ディー」なんですよね。
なぜ「デービー」だけが特権的地位を得たのでしょうか。[^2]

**わからないで終わらせたくないので、仮にでも結論づけます。**

進化論に「適者生存」という考え方があります。
キリンの首が長いのは、高いところにある木の葉を食べるのに都合がよかったから。
って、誰かに教わったことありませんか？
<font color="Red">実はこれ、ちょっと違うらしいんです。</font>

始まりは突然変異だとして、一世代であんなに伸びたわけはありません。
段階があったわけですが、少しくらい首が長くても木の葉を独占することはできないでしょう。
さらに、心臓と脳に高低差があると、充分な血流が行き届かずに脳貧血を起こす危険性が高まるため、それ自体は生存競争に有利というより、むしろ淘汰される要因になるそうです。

ところが、キリンの後頭部にはワンダーネットと呼ばれる網目状の毛細血管があり、それが脳貧血を防ぐ役割を果たします。
このワンダーネット、首が長くなってから備わったものではありません。
キリンと共通の祖先を持つオカピにもあるのです。

つまり、たまたま運がよかったわけですね。
「適者生存」だけでは説明できません。
「幸者生存」という機構も働いているのです。[^3]

戻りましょう。

1. 誰かが「**デー**ビー」と言い始めた（突然変異）[^4]
1. 「**デー**タ」が広く使われていたため、違和感なく受け入れられた（幸者生存）
1. 使ってみると語呂がよかった（適者生存）

いかがでしょう。
こじつけの感は否めませんが、あながち外れてもいない気がします。

書いてたら0時回ってしまいました。
頭使ったので結局眠れそうにありません。
連休中もお仕事頑張る方にお茶請けとして…。

---
続報です。

[ｄＢ - ぴーさんの部屋](https://www5b.biglobe.ne.jp/~pisan/radio-dB-020.htm)
> ｄＢは、高校や大学の先生などは「デシベル」と読むようですが、無線屋さんは「デービー」と読みます。　

こっちが先かもしれませんね。

[^1]: 世代の問題だったらどうしよう。
[^2]: "T" ならFTP（エフ**テー**ピー）がありますね。
[^3]: 参考文献：吉田 伸夫 著『科学はなぜわかりにくいのか ―現代科学の方法論を理解する』 
[^4]:TV（ティービー）と区別するためかもしれませんね。
【TeX Live】【Linux】TeX Liveのアップグレード

<!--
title:【TeXLive】【Linux】TeXLiveのアップグレード
tags:TeXLive,LaTeX,Linux
-->

# はじめに

TeXLiveは新年度になると新バージョンがリリースされます。
しかし、バージョンのアップグレードは自動で行われることはなく、手動でアップグレードしなければななりません。

アップグレードをしなくても使えないことはありませんが、新規にパッケージのインストールが不可能になるため、基本はアップグレードを行います。

この記事では、そのアップグレード方法について取り上げます。
今回は、2023を2024にアップグレードしたため、適宜読み替えてください。
英語が読める、億劫でない方は、公式サイト[^1]を参照してください。

:::note warn
2024にアップグレードする方法です。そのほかのバージョンへのアップグレードは、確実にできるという保証はございませんのでご注意ください。
:::

# 事前準備

アップグレードのための下準備を行います。

1. `/usr/local/texlive`ディレクトリに移動

    ```
    $ cd /usr/local/texlive
    ```

2. 2024より前のバージョンの環境を引き継ぐために、シンボリックリンクなどもすべてコピー。
    このとき、アップグレード作業が完全に終えるまでは、正常なTeX Liveを残すために、**古いバージョンの消去はしません**

    ```
    # cp -a 2023 2024
    ```

3. `2024/tlpkg/backups`以下のファイルをすべて削除

    ```
    # rm -rf ./2024/tlpkg/backups/*
    ```

4. 旧バージョンディレクトリ（`2023`）以下の各種ファイルの`/usr/local/bin/`のシンボリックリンクを解除

    ```
    # tlmgr path remove
    ```

5. 新バージョンディレクトリ（`2024`）以下の各種ファイルの`/usr/local/bin/`のシンボリックリンクを張る

    ```
    # ./2024/bin/x86_64-linux/tlmgr path add
    ```

6. 手動で追加しているPATHの設定を`2024`に変更（カスタマイズをしていなければこの操作は不要）

# アップグレード

## tlmgrのアップグレード

1. 新バージョンのディレクトリ（`2024`）に移動

    ```
    $ cd /usr/local/texlive/2024
    ```

2. 公式から`tlmgr`のアップグレードスクリプトを入手

    ```
    # wget https://mirror.ctan.org/systems/texlive/tlnet/update-tlmgr-latest.sh
    ```

3. アップグレードスクリプトを実行

    ```
    # sh update-tlmgr-latest.sh -- --upgrade
    ```

## アップデート

1. CTAN更新のために明示的にリポジトリをリセット

    ```
    # tlmgr option repository ctan
    ```

2. tlmgrのアップデート

    ```
    # tlmgr update --self --all
    ```

### LuaLaTeX使用の場合

フォントキャッシュのアップデートを行う。

```
# luaotfload-tool -fu
```

## 動作確認

1. `platex --version`をもちいて、バージョンの確認を行う。
    実行結果の1行目の末尾が、以下のように`TeX Live 2024`と出力されれば成功

    ```bash
    $ platex --version
    e-upTeX 3.141592653-p4.1.1-u1.30-230214-2.6 (utf8.euc) (TeX Live 2024)
    kpathsea version 6.4.0
    ptexenc version 1.4.6
    Copyright 2024 D.E. Knuth.
    There is NO warranty.  Redistribution of this software is
    covered by the terms of both the e-upTeX copyright and
    the Lesser GNU General Public License.
    For more information about these matters, see the file
    named COPYING and the e-upTeX source.
    Primary author of e-upTeX: Japanese TeX Development Community.
    ```

2. アップグレード前にコンパイルしたことがあるファイルをコンパイル。
    正常にコンパイルできれば、アップグレードは成功

# 後処理

アップグレードが成功したら、旧バージョンである2023ディレクトリは不要である。
この段階で、旧バージョンのディレクトリを削除

```
# rm -rf /usr/local/texlive/2023
```

以上で、アップグレード作業は終了です。

# むすび

TeXLiveのアップグレード方法を取り扱いました。

よく使うツールということもあり、自動でアップグレードできるようになるといいですね。

少しでも、私の記事によりあなた方のお手伝いが出来たら幸いです。

# 参考文献

[^1]: [TeX Users Group, "Upgrade - TeX Live," https://tug.org/texlive/upgrade.html, accessed on April 22, 2024](https://tug.org/texlive/upgrade.html)
SpringBootでログアウト実装を間違えてちゃんとログアウトできていなかった（セッション残）

# 間違い

このように **ただログアウトページへのリンクだけ** でした。

```html:
<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
<body>
	<h1>login-success</h1>
	<a th:href="@{/logout}">ログアウト</a>
</body>
</html>
```

こんな動作になってしまっていました。

1. ログアウトのリンクをクリック。
1. その後に再度認証が必要なページのURLへ直接行けてしまった。
1. セッションが残ったまま = ログアウトできていなかった。

# 正しくはこう

SpringBootにはクロスサイトリクエストフォージェリー対策が施されているので、hiddenパラーメーターを送ってあげる必要がありました。
formであればそのhiddenパラーメーターが送られるようになります。
hiddenパラーメーターのタグはコーディング不要です。
formタグを使えばフレームワーク側で勝手に追加してくれます。

```html:
<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
<body>
	<h1>login-success</h1>
	
	<form th:action="@{/logout}" method="POST">
		<!-- aタグのリンクだとクロスサイトリクエストフォージェリー対策のhiddenパラメータが送られず、セッション破棄されないので注意 -->
  		<button type="submit" value="go">ログアウト</button>
	</form>
	
</body>
</html>
```

# この記事やってる時に発見

https://qiita.com/waokitsune/items/d6ef667e1c5ff5f2aac6

# 参考サイトさん

https://qiita.com/alpha_pz/items/e1f60dbf52681c951a08

# バージョン

Microsoft Windows [Version 10.0.22631.3447]
JAVA 17.0.10
Spring Boot v3.1.11