OmniAICreator/Qiita-1.07M huggingface dataset:
ログインユーザの入力コマンド自動表示

#### はじめに


リモート研修（teams使用)の講師をやっています。複数のUnix未経験者のBash入力コマンドをチェックするため自動で表示確認するものを作成しました。

#### 仕様

1. 生徒の.bashrcのPROMPT_COMMAN変数で生徒の.bash_historyを専用のファイルmmshistへコピーする
2. .bashrcと空の.bash_historyは生徒のアカウントを作るときに組み込む
3. ブラウザアプリでpasswdファイルから該当生徒の専用ファイルmmshistを定期的に読み、コマンドの最新部分から数行分表示する

#### Bashrcの組み込み部分

```shell:bashrc
 1 shopt -s histappend
 2 PROMPT_COMMAND="history -n; history -a; cp .bash_history ${HOME}/mmshist; chmod 666 ${HOME}/mmshist"
 3 unset HISTFILESIZE
 4 HISTSIZE=500
```

#### Webアプリ

```php : commandviewer.php
 1 <?php
 2 $loginkey='student';   /// 表示したいログインID部分 
 3 print "<html><head";
 4 print '<meta http-equiv="Refresh" content="4" >';
 5 print '</head>';
 6 print "<body>";
 7 print "<h2><font color='brown'>Command viewer</h2>";
 8 print "<h4><font color='brown'>Refresh 4 seconds<br>Latest at the bottom<br>{$loginkey}</font></h2>";
 9 $fp=fopen("/etc/passwd","r");
10 $num=0;
11 while ($line = fgets($fp)) {
12   $larr=explode(':',$line);
13   $passname=substr($larr,0,strlen($loginkey));
14   if ($passname == $loginkey) {
15     $num++;
16     $output=null;
17     $rtnval=null;
18     print "<table border='1'>";
19     print "<tr><td><b>Login account: ".$logname."</b></td></tr>";
20     print "</table>";
21     $output=null;
22     $rtnval=null;
23     exec("tail -3 /home/".$logname."/mmshist",$output,$rtnval);
24     foreach ($output as $cmditem){
25       print "$ <font color='brown'><b>".${cmditem}."</b></font><br>";
26     }
27     print "----------------------------------------<br>";
  }
28 }
29 print "</body>";
30 print "</html>";
31 ?>

アプリ説明
* $loginkeyへ表示するログインIDを設定する
* 表示ユーザと同じ長さのログインIDを/etc/passwdファイルから探す
* Refreshタイムは<metaで指定、表示コマンド行はtailコマンドを実行する
* プログラムcommandviewer.phpをWebサーバのドキュメントルートに置き、URL localhost/commandviewer.phpで動作させる
```

#### 表示サンプル
![image-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3714448/2c362d13-6ed1-4675-21ec-664521b784c1.png)

#### 留意事項
* .bash_historyが存在しないと最初のログインで警告が出るので空の.bash_historyを作成しておきます。
* Webアプリからアクセスするディレクトリ、ファイルのパーミッションを考慮します。


#### おわりに

Teamsの共有機能で生徒のunixターミナルを監視していましたが、複数人を切り替えながら行う効率の悪さからこの方式に切り替えました。生徒のエディタで作成した中身のチェックもアプリに手を加えれば出来ます。
YSONについて

YSONはYSON - Simple Object Notationの略で、シンプルなデータシリアライゼーションフォーマットを目的にしたフォーマットです。
YSONはJSONと比較して冗長な構文の要素を削減しています。

実態に以下のYSONは316個のシンボルからできあがっている一方で、

```
name Luke Skywalker
height 1.72
hair_color Blond
birth_year 19 BBY
gender Male
homeworld http://swapi.co/api/planets/1/
films
  http://swapi.co/api/films/1/,
  http://swapi.co/api/films/2/,
  http://swapi.co/api/films/3/,
species
  http://swapi.co/api/species/1/,
father
  name Darth Vader
  height 2.02
  hair_color
```

それと同等のJSONは437個のシンボルで表現できています。

```
{
  "name": "Luke Skywalker",
  "height": 1.72,
  "hair_color": "Blond",
  "birth_year": "19 BBY",
  "gender": "Male",
  "homeworld": "http://swapi.co/api/planets/1/",
  "films": [
    "http://swapi.co/api/films/1/",
    "http://swapi.co/api/films/2/",
    "http://swapi.co/api/films/3/"
  ],
  "species": [
    "http://swapi.co/api/species/1/"
  ],
  "father": {
    "name": "Darth Vader",
    "height": 2.02,
    "hair_color": null
  }
}
```

JSONとYSONを比較すると以下のような違いがあると分かります。

- 文字列を囲むクォートが存在しない
- キーバリューの区切りが `:` ではなく空白
- キーバリューのバリューがnullの場合はキーのみを記載する
- 配列の要素区切り文字は `,` で、オブジェクトの要素区切り文字は改行

出展:

https://github.com/av/yson
Udemyコース受講メモ:gRPC[C#] Master Class

## 概要
UdemyのgRPC関連の下記コースを受講したメモ。
受講時間は約4時間で、gRPCの概要を掴むのによい。C#以外にもGoやPythonなど他言語向けのコースも用意されている。

 https://www.udemy.com/course/grpc-csharp/?couponCode=PLOYALTY0923

## 内容

### セクション1-3
- Googleで公式にサポートされていない言語であっても、実際は他社やOSSコミュニティでサポートされている言語が多く存在

<table>
    <caption>gRPC vs REST</caption>
    <thead>
        <tr>
            <th>比較項目</th>
            <th>gRPC</th>
            <th>REST</th>
            <th>Notes</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>データフォーマット</td>
            <td>Protocol Buffers</td>
            <td>JSON</td>
            <td>
                <ul><li>Protocol Buffersで定義されたメッセージは、Jsonと比較してデータ量が少なく、バイナリでの通信となるため、CPU負荷が小さく、高速</li></ul>          
                <ul><li>Protocol Buffersはスキーマが固定されているため、JSONと比較するとデータ構造の柔軟性が低い</li></ul>
            </td>
        </tr>
        <tr>
            <td>プロトコル</td>
            <td>HTTP2</td>
            <td>HTTP1</td>
            <td>HTTP2はTCPコネクションを使いまわす、ヘッダーが圧縮されるなどの理由からHTTP1よりも性能がよい</td>
        </tr>
        <tr>
            <td>通信方式</td>
            <td>StreamingやBi directionalをサポート</td>
            <td>Unaryのみをサポート(Request/Responseのみ)</td>
            <td>双方向の通信を行いたい場合はgRPCを選択</td>
        </tr>
        <tr>
            <td>設計</td>
            <td>自由</td>
            <td>GET/POST/UPDATE/DELETE</td>
            <td></td>
        </tr>           
    </tbody>
</table>

### セクション4以降
- Unary, Server Streaming, Client Streaming, Bi-Directional Streamingの全てに関してハンズオン実施

- ソースコードは下記からgit clone可能

https://github.com/Clement-Jean/grpc-csharp-course
 

 ## 参考リンク集

- 公式HP
各プログラミング言語に関する、ソースコードのサンプル、APIレファレンス、Githubのリポジトリが記載されている

https://grpc.io/docs/languages/

- 講師のBlog post

https://clement-jean.github.io/code_download_for_grpc_csharp/

- Microsoftのドキュメント

https://learn.microsoft.com/ja-jp/aspnet/core/grpc/basics?view=aspnetcore-9.0#generated-c-assets
Firebase Remote ConfigでのIndexedDBの利用について

Firebase Remote Config[^1]を使用したウェブ側のABテストについて調査を行ったところ、IndexedDBの利用に関していくつか興味深い点が分かりました。ここでは、その内容を簡潔にまとめます。

---

## 1. Firebase Remote ConfigでIndexedDBの利用

### IndexedDBとは

IndexedDBは、ブラウザに大容量のデータを保存するための仕組みです。Remote Configは、このIndexedDBを活用して一部のデータをローカルに保存しています[^2]。

### IndexedDBに保存されるデータ

Remote Configは、以下の情報をIndexedDBに保存しています：

- **認証用Token**：特定のユーザーセッションに紐づけられたトークン
- **Fetch間隔の設定値**：サーバーにリクエストを送信する頻度を制御する値
- **前回のリクエスト時刻**：サーバーから最後にデータを取得したタイミングを示す値

これらの情報を活用して、サーバーにリクエストを送るべきか判断しています。

### Fetchの流れ

Remote Configは、データ取得時に次のような手順を踏みます：

1. **IndexedDBから情報を取得**  
   - Fetch間隔の設定値と前回リクエスト時刻を確認。  
2. **ローカルデータを使用するか決定**  
   - Fetch間隔内であればIndexedDBのデータを返します。  
   - 間隔を超えていればサーバーにリクエストを送信します。

---

## 2. IndexedDB利用に関する懸念点

### IndexedDBを手動で削除した場合

新しいユーザーと既存ユーザーをトークンによって区別しているため、IndexedDB内のデータ、特に認証用Tokenが削除されると、Remote Configは新たなユーザーとして扱われます。その結果、異なるABテストグループに割り振られる可能性があります。

### ITP（Intelligent Tracking Prevention）の影響

一部のブラウザ（特にSafari）では、ITP（Intelligent Tracking Prevention）と呼ばれる個人情報保護機能が有効です。この機能により、スクリプトで書き込まれたストレージ（IndexedDBを含む）が7日間でクリアされることがあります。

#### ITPとは

ITPは、ユーザーのオンライン行動を追跡されないようにする仕組みです。SafariやWebKitが採用しており、以下のような動作を制御します：

- クッキーやローカルストレージの有効期間を短縮  
- 一部のデータ保存を制限  

#### IndexedDBの保存期間
IndexedDBは理論上、無期限にデータを保存可能です。しかし、ITPの影響でSafariでは保存期間が7日に制限される場合があります。このため、Remote Configのデータが定期的に削除される可能性があるのです[^3][^4]。



---

## 3. 結論

Firebase Remote Configは、簡単にABテストを導入できる非常に便利なツールです。ただし、IndexedDBの利用には注意が必要です。特に、ITPの影響を受けるブラウザ環境では、保存データが短期間で削除され、または手動で削除可能であること考慮してを考慮して運用を設計する必要があります。



[^1]: [Firebase Remote Configとは](https://firebase.google.com/docs/remote-config?hl=ja)
[^2]: [indexDBとは](https://developer.mozilla.org/ja/docs/Web/API/Window/indexedDB)
[^3]: [7-Day Cap on All Script-Writeable Storage
](https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more/#:~:text=7%2DDay%20Cap%20on%20All%20Script%2DWriteable%20Storage)
[^4]: [Is IndexedDB on Safari guaranteed to be persistent?](https://stackoverflow.com/questions/50795409/is-indexeddb-on-safari-guaranteed-to-be-persistent)
ゼロから始めるSnowflake（3/10）

# 認証とアクセス

Snowsight（SnowflakeのWebインターフェース）を利用してデータベースを作成し，データベース，スキーマ，テーブルなどのオブジェクトへのアクセスを管理する方法を学ぶ．

## データベースの新規作成

### Snowsightでデータベースを作成

1. Snowsightのオブジェクトブラウザを開く．
2. **データベース**アイコンを右クリックし、新しいタブで開く．
3. **+ データベース**ボタンをクリックし、データベース名を入力する．
4. **作成**ボタンをクリックする．
5. データベース一覧に作成したデータベースが表示されていることを確認する．

### 作成したデータベースの確認

`SHOW`コマンドを実行して作成したデータベースを確認する．

```sql
USE ROLE <create_db_rl>;
SHOW DATABASES LIKE '%{{your_db}}%';
```

## ロールの切り替えとデータベースの表示確認

1. **ロールを`LEARNER_RL`に変更する．**
   - データベースが表示されなくなる．
2. 再び`CREATE_DB_RL`に切り替える．
   - データベースが再度表示される．

## データベースとスキーマ

- データベースはテーブルやオブジェクトをグループ化する．
- スキーマはデータベース内のサブグループ化に利用される．
- Snowflakeではデータベース作成時に以下の2つのスキーマが自動生成される．
  1. **INFORMATION_SCHEMA**: ビューを保持し，削除や移動が不可．
  2. **PUBLIC**: 空の状態で作成され，自由に編集可能．

## 所有権の移譲

### `PUBLIC`スキーマの所有権移譲

1. `CREATE_DB_RL`ロールを選択．
2. 作成したデータベースの`PUBLIC`スキーマを選択．
3. **所有権を譲渡**をクリック．
4. 転送先として`LEARNER_RL`を選択．

### データベースの所有権移譲

1. 同様の手順でデータベースの所有権を移譲する．
2. **スキーマの所有権移譲を先に行うことが必要**．

## 確認コマンド

所有権移譲後、以下のコマンドを実行して確認する．

```sql
DESCRIBE DATABASE {{your_db}};
```
遅ればせながら最近感動したブレストツール-Mapify

巷で話題になっていた[Mapify](https://mapify.so/ja/app/7c3442fe-92fa-408f-99e9-0a0702db1bc4)を使ってみました。
そうしましたら、、、感動したので簡単な紹介です。
（2024年12月23日時点の情報です。）

# そもそもMapifyとは
MapifyはAIを利用して、様々な情報をマインドマップで表現するツールです。
無料プランでは機能が制限されますが、ドキュメント、記事、動画、Webサイトなど視覚的に整理可能です。

※ [料金について](https://mapify.so/ja/pricing)

<img width=400px alt="スクリーンショット 2024-12-23 13.03.15.png" 
 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321999/498db9d1-6fb4-fb9c-fd70-2ef657f6586e.png" />

執筆時点では年間契約の場合、月間契約に比べ40%オフでした。

# 例えば。

私が、Googleが進めている『[Project JARVIS](https://www.youtube.com/watch?v=zf2aBcaTFcQ)』について調べていたとします。

<img width=400px alt="スクリーンショット 2024-12-23 13.15.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321999/ea63c82d-348f-fdf8-79a5-d8673e1be11e.png" />

調べたいことを、Mapifyに投げます。
AIが頑張って整理してくれるので、少し待ちます。

すると！

<img width=600px alt="GoogleのProject Jarvisについて.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321999/269b8dee-b314-419d-9a2f-ffd7d6200007.png" />

きれいなマインドマップを出力してくれます！
↑上記のマインドマップは出力後、AIとチャットしながら少し追加された情報があるかもしれません。

## 他の表示

ここまでの出力で感動していました。
YoutubeのURLを投げたら、それを解析して整理してくれます。
長々と動画を見る前に、中身を教えてくれます。
自分が整理するメモよりもキレイなメモを残してくれます。

出力周りで嬉しかった点がもう一つありまして、

<img width=300px alt="スクリーンショット 2024-12-23 13.19.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321999/738228e5-d2df-f173-ee6f-bdfac2eb88b8.png" />

マインドマップの他に別のフォーマットで出力することも可能です。
- マインドマップ
- ロジックチャート
- ツリーチャート
- タイムライン
- 特性要因図
- グリッド

試しに、「特性要因図」を選択してエクスポートし直してみます。
<img width=600px alt="GoogleのProject Jarvisについて (1).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321999/52a37c07-823c-0f73-803a-3cdec3ce1830.png" />

ここからカスタマイズも可能です。
情報を整理したい時、資料を作成したい時に非常に便利そうでした。

# 最後に
生成AIを利用したツールの利用で作業効率が格段に上がる可能性は感じています。
GeminiやChatGPTだけでなく、「[Arc](https://arc.net/)」といったツールも含め、追っていければと思います。
OCI Architect Associate 合格したので対策や難易度について紹介

## 最初に
oci Architect Associate 2023(以下oaa)に合格してました。
簡単に学習コンテンツや難易度について紹介していきます。
尚、現行のバージョンは2024になりますが、基本的な対策方法は変わらないかと思います。

# 受験時筆者所持資格
FE,LPICLV1,CCNA,AWS(CLF,SAA,SAP,DVA,DOP),OCI(Foundations Associate)

# 難易度について
体感的にはAWSのCLFとSAAの中間くらいの難易度でした。
学習コンテンツをこなせばそこまで身構える必要はなさそうです。(受験費用が4万近いのでプレッシャーはありますが...)
一か月もあれば十分合格圏内に持っていけるのではないでしょうか。

# 学習コンテンツ
[Become an OCI Architect Associate (2024)日本語](https://mylearn.oracle.com/ou/learning-path/japanese-become-an-oci-architect-associate-2024-/140905)
AWSやAzure経験がある人はociと比較した学習コンテンツもあるため、そちらを見るとより効率よく理解が深まりそうです。
[ociとAWS](https://mylearn.oracle.com/ou/learning-path/oci-for-aws-architects-jp/106871)
[ociとAzure](https://mylearn.oracle.com/ou/learning-path/oci-for-azure-architects-jp/106870)
動画を全て閲覧し、その後は「試験対策」と「練習問題」この二つの正答率を8～9割程度安定して取れるようになれば十分合格できるかと感じます。

また、公式でウェビナーをやっていたりするのでタイミングが合えばそちらも受講されてみてはいかがでしょうか。
# 受験時の注意
30分前からチェックインできるため、焦らないよう余裕をもって入ることを推奨します。
試験時にSecure Browser というソフトのインストールと、起動に特定のソフト(Skypeとか)を終了させる必要があるためです。
全体的な流れは動画があるのでそちらを閲覧することを推奨します。
# 予定
architect professionalも取得しているので後日書きます。
Ubuntu 24.04 on WSL で mDNS の名前解決ができない

Raspberry Pi への ssh アクセス時などに動かないと結構困る mDNS。デフォルトの状態では Ubuntu 24.04 on WSL では動かないようです。

動くようにするには Ubuntu 上の以下のファイル (Windows 上の %userprofile%/.wslconfig)

```
# vi /mnt/c/Users/userName/.wslconfig
```

に以下の設定を追加し Ubuntu を再起動すればよいようです。

```
[wsl2]
dnsTunneling=false
```

Ubuntu という名前のディストリビューションの再起動は以下の

```
C:\Users\userName > wsl -l -v
  NAME      STATE           VERSION
* Ubuntu    Running         2

C:\Users\userName >wsl -d ubuntu --shutdown
C:\Users\userName >wsl
```

再起動後 Ubuntu 上から以下のような感じでホスト名が解決できるか調べる。この場合 c4lab.local というホスト名の IP アドレスが 10.107.100.234 であることがわかる　

```
$ ping -c 1 c4lab.local
PING c4lab.local (10.107.100.234) 56(84) bytes of data.
64 bytes from c4lab.local (10.107.100.234): icmp_seq=1 ttl=63 time=5.12 ms
```

Ubuntu 上で PowerShell を使って[力業](https://qiita.com/ma2shita/items/422c904f39953e75a17f)で解決するという方法もあるらしい。

```
Ubuntu $  powershell.exe "Resolve-DnsName c4lab.local | ConvertTo-Json" | jq -r .[-1].IP4Address
10.107.100.234
```

ちなみに[ここのページ](https://learn.microsoft.com/en-us/windows/wsl/troubleshooting#resolve-local-names-in-wsl)をもとに Ubuntu 上で以下のように libnss-mdns (や avahi-daemon) をインストールすると mDNS での名前解決はできなくなり謎は深まる。

```
# sudo apt-get install libnss-mdns
```

少なくとも私の環境で試す限り以下の設定を行い Ubuntu を再起動すれば動くらしい。

```
~$ cat /mnt/c/Users/userName/.wslconfig
[wsl2]
dnsTunneling=false
```

参考文献:
[mDNS stopped working in WSL2 after Windows 11 Pro update](https://github.com/microsoft/WSL/issues/11022)
Azure Custom Speechで秋田弁専用音声認識モデルを作る

# はじめに

Azure サービスの1つ、Custom Speechを使用して秋田弁を認識する音声認識モデルを開発したので、この記事ではCustom Speechについて紹介したいと思います。

# Azure Custom Speechについて

[Azure Custom Speech](https://learn.microsoft.com/ja-jp/azure/ai-services/speech-service/custom-speech-overview)とは、ユーザが収集したデータを利用して、利用したいシーンに特化した音声認識モデルをトレーニングできるサービスです。


## できること

- 人が多い場所、機械が動いている場所など特定の環境のノイズに特化した音声認識の開発
    - トレーニングしたモデルはバッチの文字起こしはもちろん、リアルタイムでの文字起こしも可能
- トレーニングで使用するデータは、音声データとテキストだけでなく、テキストのみでもOK
    - この場合、語彙のトレーニングができるようです

## 使い方

ここでは、音声+テキストでモデルを開発する手順について書き綴っていきます。

### データ準備

#### 音声データ

形式：WAV
サンプル形式：PCM 16bit
サンプルレート：8000Hz または 16000Hz
1音声ファイルの最大長：トレーニング用は40秒、テスト用は2時間


トレーニングに使用する音声データは長さの合計60分を超える必要があります。

#### テキストデータ

テキストデータは、ファイル名とトランスクリプトをタブで区切ったもので、エンコードはUTF-8（BOM付き）、1行1発話とします。最大サイズは200MBです。


また、テキストは90文字を超える場合は .（ドット）で区切る必要があります。
ただ、文章の途中でドットをいれるのではなく、文章の終わりにいれる必要があります。
（1文90文字を超える文章はそんなに無いと思うので、句点の終わりにドットを入れてしまえばOKだと思います）


データは、後述するテストでも使用するので、トレーニングした音声認識モデルをテストする場合は、トレーニングとは別にデータセットを作成する必要があります。

### アップロード

AzureのSpeech Studioのカスタム音声認識プロジェクトでアップできます。
音声+テキストのデータをzipアーカイブしたものをアップします。

ファイルをアップするとAzure上でファイルの処理が行われ、処理が完了すると閲覧ができるようになります。


注意）処理中にエラーが生じた場合は、エラー対象のファイルをスキップし処理を続行します。処理中にエラーが起こったかどうかは通知が来ないため、データセットの詳細から確認する必要があります。


#### よく遭遇したエラー

- 正規化後のテキストが空になってしまう
    - 記号が入っているとテキストの正規化する過程で空になってしまうことがあるようなので、記号は消してあげてください
- ファイルが見つからない
    - 音声ファイル名とテキストファイル中のファイル名が対応するようにしてください

### トレーニング

トレーニングを行うためには、学習に使用するデータ形式、ベースモデル、使用するデータセットを選択します。

トレーニングにかかった時間は1時間程度でした。


#### Tips

トレーニングに使用できる音声データは40秒以内という制限があります。
もし、データセットに40秒を超える長さの音声データがある場合は、対象のデータはスキップされます。

ちなみに、トレーニングに使用したデータセットすべてが40秒を超えるとエラーが発生し、トレーニングに失敗します。

また、[特定のリージョン](https://learn.microsoft.com/ja-jp/azure/ai-services/speech-service/regions#speech-service)ではトレーニング用の専用ハードウェアが利用でき、トレーニングを高速化することができます。
専用ハードウェアが利用できる別のリージョンでトレーニングを行い、モデルを別のリージョンにコピーをすることで時短、コスト削減ができます。

### テスト

テストでは、2つの音声認識モデルの比較ができます。
テストを行うためには、2つのモデルと、テストで使用するデータセットを選択します。

評価は単語誤り率（WER）、トークン誤り率（TER）で評価されます。


#### 単語誤り率

音声認識した結果のテキスト中に、正解テキストと比較して、余計な単語が入っている回数（挿入）、文字が誤ってしまっている回数（置換）、文字が不足している回数（削除）がどれほど入っているかの割合です。

#### トークン誤り率

日本語の文章では句読点を考慮した単語誤り率と思っていただければいいと思います。

### デプロイ

エンドポイントを作成し、そこにトレーニングした音声認識モデルを紐づけることによって、モデルの利用が可能になります。
デプロイをすると音声認識の利用時間にかかわらず料金が発生するので気をつけてください。

# データについて

秋田弁話者にお願いしてデータ収集をしました。話者は男女、年齢がなるべくばらつくように募集しました。
トレーニング用のデータとして60分、テスト用のデータとして30分のデータを収集することができました。

注意）秋田弁は地域ごとに異なってくるようなのですが、今回はごちゃまぜにしています。

# 結果

ベースモデル（トレーニング前）と比較をした結果が下記の通りで、WERは10%ほど改善しております。

![Screenshot 2024-12-23 at 12.49.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3934497/eef6c589-bd15-4f6d-4d92-b27a1cd38008.png)

# 所感

最低量のデータでトレーニングしてもWERが改善しており驚きでした。
実際の音声認識をさせてみると、トレーニングデータに引っ張られすぎず、かなりマイルドに改善した印象でした。
Nextcloudでoc_files_lockによりファイルが消せなくなる原因追求と解決方法

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

# 0. はじめに

Nextcloudを使っていて、以下のような「ファイルがロックされてしまって消せなくなる」という記事をよく見かけます。

Nextcloudのファイルがロックされて困る – matoken's meme 
https://matoken.org/blog/2018/05/19/nextcloud-files-locked/

Nextcloudで不要なファイルを削除できなくなったとき｜ころQ 
https://note.com/koroq2000/n/nefe57093f4f9

NextcloudでFileが削除できなくなった \[ほほほのほ\] 
https://www.seirios.org/seirios/dokuwiki/doku.php?id=tweet:2022:0111_01

アップロードしたファイルやフォルダが消せなくなりましたが、どうしたら良いですか？ \| Nextcloud by NEXTsystems 
https://solution.next-jp.net/2020/12/08/%e3%82%a2%e3%83%83%e3%83%97%e3%83%ad%e3%83%bc%e3%83%89%e3%81%97%e3%81%9f%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%84%e3%83%95%e3%82%a9%e3%83%ab%e3%83%80%e3%81%8c%e6%b6%88%e3%81%9b%e3%81%aa%e3%81%8f/

しかし、私が管理しているNextcloudではそういったことが起こったことは殆どありません。
(昔あったかもしれない気もしなくもないけど、覚えてないぐらい)

どう言う状況で起こっているのか、再現できていないので幾つかの可能性と共に解決策を考えてみます。

# 1. 原因の想定

## 1-1. oc_files_lockの利用用途

oc_files_lockはファイルの書き込み時にファイルが編集時に、そのファイルが更新されている途中で、別のファイルの更新でファイルが上書きされてしまったりしないために利用します。

例えば、Aさんがデスクトップクライアントでファイルを更新して、アップロードしている途中に、Bさんがウェブサーバーで同じファイルをアップロードすると、Aさんの更新とBさんのファイルの更新が重なってしまうので、先にファイルのアップロードを開始した人に優先権を与えて、後からファイルをアップロードしようとしたり更新している人に待ってもらう、というものです。

一時的な情報に過ぎないので、oc_files_lockのテーブル情報を削除しても問題ありません。

## 1-2. ファイルロックの場所

Nextcloudでは、このファイルロック情報を持つ場所を以下の2種類、どちらかに指定が可能です。

1. データベース(Postgresql、MySQL等)
1. KVS(Memcache、Redis等)

## 3. 記事での利用者の環境

記事で利用されている人は、全て「oc_files_lock」テーブルを操作しています。
つまり、`1-2. ファイルロックの場所`で1を選択しています。

恐らく原因はここにありそうです。

私が管理しているNextcloudでは、`1-2. ファイルロックの場所`は全て2を選択しています。

# 4. 原因想定

データベースはトランザクション等様々な操作を行うものです。KVSとは比較にならないほど重い処理だと言えます。また、Nextcloudがファイルをアップロードするときに書き込むのもデータベースです。

とすると、複数のファイルをアップロードしているときに「毎回ファイルロック情報」がデータベースに書き込まれて、ファイルのアップロードが終了したら、「ファイルロック情報」が削除される処理は、非常に重い処理といえるでしょう。

その場合に、PHPが接続してMySQL等にクエリーを送信してクエリー実行に失敗する事も考えられます。

そのような状況になると、oc_files_lockファイルにロック情報が残ってしまうということは容易に想像できます。

また、KVSをファイルロック情報としている私が管理しているNextcloudでは、同様の問題が発生していないことも鑑みると、データベースによるファイルロック情報の保存には問題があると言えます。

# 5. 解決案

## 5-1. ファイルロック情報のRedisへの移動

一番簡単な解決案は、ファイルロック情報の保存をデータベースからKVSであるRedisに変更する方法でしょう。
これは完全に互換性があり、リスクもなく、非常によくテストされているので一番お薦めです。

設定方法については以下をご参照ください。

Transactional file locking — Nextcloud latest Administration Manual latest documentation

https://docs.nextcloud.com/server/latest/admin_manual/configuration_files/files_locking_transactional.html

```php5
'memcache.locking' => '\OC\Memcache\Redis',
'redis' => array(
     'host' => 'localhost',
     'port' => 6379,
     'timeout' => 0.0,
     'password' => '', // Optional, if not defined no password will be used.
      ),
```


## 5-2. 定期的なロック情報の削除

しかし、VPS等でRedisを自由に動かすことができない場合はどうすればいいでしょうか？

その場合は、データベース上のoc_files_lockテーブルを定期的に削除する方法しか、選択肢がありません。

しかし、全てを全消しするのも懸念がありますので、以下のようなスクリプトを利用して、24時間以上経ったレコードのみを削除するようにしましょう。

https://github.com/rakurtz/cleanup_oc_files_lock

## 5-3. ファイルロックを無効化する

最後の手段としては、ファイルロック情報を保存しないという方法もあります。
しかし、これはそのリスクが分かっている人にのみお勧めする方法で一般的な対応としてはお薦めできません。

```
'filelocking.enabled' => false
```

# 6. まとめ

Nextcloudでよく言われるファイルがロックされてしまって削除できなくなる問題に対して述べました。
上記を参考にして、快適なNextcloudライフをお送りください。
OJT ~ Webアプリの開発 ~

# はじめに
Webアプリを開発していきましょう！

## 開発環境
- Windows 10 PC
- nvm
- Node.js（18.19.0）

## 環境構築

1．nvmのインストール

https://github.com/coreybutler/nvm-windows/releases

nvm-setup.exe を実行

2．コマンドプロンプトを開き、Node.js（18.19.0）をインストール 

$ nvm install 18.19.0

3．Node.js（18.19.0）に切り替え

$ nvm use 18.19.0

4．現在のNode.jsの環境を確認

$ nvm list
＊ 18.19.0

## はじめてのNext.js のアプリケーションを作成

1．アプリケーションのフォルダ（例：s-fujimoto-ojt）を作成

2．コマンドプロンプトでNext.js プロジェクトを作成

$ cd s-fujimoto-ojt-1223
$ npx create-next-app@latest .


? Would you like to use TypeScript? » **Yes**
? Would you like to use ESLint? » **Yes**
? Would you like to use Tailwind CSS? » **Yes**
? Would you like your code inside a `src/` directory? » **No**
? Would you like to use App Router? (recommended) » **Yes**
? Would you like to use Turbopack for `next dev`? » **No**
? Would you like to customize the import alias (`@/*` by default)? » **No**

3．ライブラリのインストール

$ npm install

4．アプリの起動

$ npm run dev 

http://localhost:3000/ にアクセス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/16b17363-7ac1-abb1-2f24-0b93a5e32430.png)

完成です！

## Hello Worldを表示するだけのページを作成

1．Cursor で app\page.tsx を開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/40da7460-888c-7773-2f6c-f3cc7cd2bf1c.png)

2．Ctrl + l でボットに聞く

:::note
「Hello Worldを表示するだけのページにして」
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/bce73714-688e-2b97-83bf-36bf2e8f12fa.png)

3．app\page.tsxを編集

```page.tsx
export default function Home() {
  return (
    <div className="min-h-screen flex items-center justify-center">
      <h1 className="text-4xl font-bold">Hello World</h1>
    </div>
  );
}
```

4．アプリの起動

$ npm run dev 

http://localhost:3000/ にアクセス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/cd57e71c-cb57-77ea-99f9-1104c046944e.png)

完成です！

## Tips

:::note
ボットに「Next.js、TypeScript、TailwindCSSでいい感じにして」と聞くと、いい感じにしてくれます
:::

```page.tsx
export default function Home() {
  return (
    <main className="min-h-screen bg-gradient-to-br from-indigo-500 to-purple-600">
      <div className="container mx-auto px-4 py-16">
        <div className="max-w-3xl mx-auto text-center space-y-8">
          <h1 className="text-6xl font-bold text-white tracking-tight">
            Welcome to My App
          </h1>
          <p className="text-xl text-indigo-100">
            Next.js + Tailwind CSS + TypeScriptで構築された
            モダンなWebアプリケーション
          </p>
          <div className="flex gap-4 justify-center mt-8">
            <button className="px-6 py-3 bg-white text-indigo-600 rounded-lg font-semibold hover:bg-indigo-50 transition-colors">
              はじめる
            </button>
            <button className="px-6 py-3 border-2 border-white text-white rounded-lg font-semibold hover:bg-white/10 transition-colors">
              詳しく見る
            </button>
          </div>
        </div>
      </div>
    </main>
  );
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/d5a83b3f-9ff3-bcca-02c6-d8d318f06f18.png)

お疲れ様でした
名前付きのメソッドを確認する　respond_to?


>respond_to?(name, include_all = false) -> bool
オブジェクトがメソッド name を持つとき真を返します。

>オブジェクトが メソッド name を持つというのは、オブジェクトが メソッド name に応答できることをいいます。

>[PARAM] name:
Symbol または文字列で指定するメソッド名です。

### デフォルトではfalseになる　
>[PARAM] include_all:
private メソッドと protected メソッドを確認の対象に含めるかを true か false で指定します。`省略した場合は false(含めない) を指定`した事になります。
```rb
class F
  def hello
    "Bonjour"
  end
end

class D
  private
  def hello
    "Guten Tag"
  end
end
list = [F.new,D.new]

list.each{|it| puts it.hello if it.respond_to?(:hello)}
#=> Bonjour
```

https://docs.ruby-lang.org/ja/latest/method/Object/i/respond_to=3f.html

>name -> Symbol
このメソッドの名前を返します。

例
```rb
class Foo
  def foo(arg)
    "foo called with arg #{arg}"
  end
end

m = Foo.new.method(:foo) # => #<Method: Foo#foo>
m.name # => :foo
```

https://docs.ruby-lang.org/ja/latest/method/Method/i/name.html
【SQL】DBMSとは

# はじめに

こんにちは、アメリカで独学でエンジニアを目指しているものです。

現在復習でSQLの勉強をしているのですが、DBMSについて改めて復習しようと思いまとめてみました
簡単にまとめているので初心者向け記事となっているのでご了承ください

## DBMSとは

DBMS（DataBase Management System）とは、データベースを管理・運用するためのソフトウェアのことです。
具体的には、以下の機能を担っています。

### データの格納・取得・更新・削除

ユーザーやアプリケーションが必要とするデータを読み書きするための操作を提供します。

### セキュリティ管理

アクセス権限やユーザー管理を通じて、機密情報の保護や不正利用の防止を行います。

### バックアップとリカバリ

障害や誤操作からシステムを守るために、データのバックアップやリカバリ機能を備えています。

### 同時アクセス管理（トランザクション管理）

複数のユーザーが同時にデータを操作しても、データの矛盾が起きないように制御します。

## 代表的なDBMS

DBMSにはさまざまな種類があり、大きく「リレーショナル型（RDBMS）」と「非リレーショナル型（NoSQLなど）」に分けることができます。ここでは、いくつか代表的なものを紹介します。

### リレーショナル型（RDBMS）

- **MySQL**
  - オープンソースでありながら、大規模なサービスでも利用される信頼性の高いDBMS。
- **PostgreSQL**
  - 高度な機能が豊富で、オープンソースとしても多くの企業や研究機関で採用されています。
- **Oracle Database**
  - 大企業向けの高機能かつ高い信頼性を誇る商用DBMS。
- **Microsoft SQL Server**
  - Windows環境との親和性が高く、企業システムでよく使われる商用DBMS。

### 非リレーショナル型（NoSQLなど）

- **MongoDB（ドキュメント指向）**
  - JSON形式でデータを格納し、柔軟なスキーマ設計が可能。大規模データの分散処理にも強みを持つ。
- **Redis（キー・バリュー型）**
  - メモリ上でデータを管理するため、超高速な読み書きが可能。キャッシュやセッション管理でよく使われる。
- **Apache Cassandra（カラム指向）**
  - 拡張性が高く、大量のデータを分散して管理できる。Facebookなど大規模サービスでも採用事例がある。
- **Neo4j（グラフ型）**
  - ノードやリレーションシップといったグラフ構造でデータを保存・検索する。SNSの友人関係など、複雑なネットワーク分析に適している。

## RDBMSとは

上記で紹介したDBMSの中でも、最も一般的なのが\*\*RDBMS（Relational Database Management System）\*\*です。RDBMSでは、データを二次元表（テーブル）で管理するという特徴があります。

### テーブル（表）構造による管理

データは「カラム（列）」と「レコード（行）」からなる二次元表で表現され、シンプルかつ直感的に管理できます。

### SQL（Structured Query Language）による操作

データの検索（SELECT）、追加（INSERT）、更新（UPDATE）、削除（DELETE）などを統一的な文法で行えるため、学習コストに対して強力な操作性を提供します。

### データの整合性を保ちやすい

テーブルを細かく分割してデータ重複を抑える「正規化」や、トランザクションの整合性を保証する「ACID特性」などにより、データの一貫性を高めます。

代表的なRDBMSとしては、MySQL、PostgreSQL、Oracle Database、Microsoft SQL Serverなどが挙げられます。

## DBMSはアプリケーションとデータをつなぐ“仲介役”

### どのように働いているか

DBMSは、アプリケーション（利用者側）とデータ（ストレージ）の間に位置し、データの読み書きを“仲介”する役割を担う存在です。大まかな流れは以下のとおりです。

1. **アプリケーションがDBMSへリクエストを送信**

   - 例：ユーザーが「会員リストを表示する」操作を行うと、アプリケーションは「SELECT \* FROM 会員」というSQL文（RDBMSの場合）やクエリ（NoSQLの場合）をDBMSに送ります。

2. **DBMSがストレージ（ファイルシステムなど）を操作してデータを取得・更新**

   - 受け取ったクエリを解析し、該当データを検索・更新します。

3. **DBMSが処理結果をアプリケーションへ返却**

   - ユーザーが求めるデータや、更新完了の応答が返されます。

4. **アプリケーションがユーザーへ表示や結果の反映を行う**

   - 返却されたデータをユーザーに見やすい形で表示したり、続く処理に利用したりします。

DBMSのおかげで、アプリケーション開発者はストレージ上での細かいデータの読み書きや複雑な処理を意識せずに、安全で整合性のとれたデータアクセスが可能となります。

## まとめ

Ruby on rails を使う際はSQLite3が使えますが、大規模事業の場合はほかのDBMSを使用しなければならないためこれらをまなぶことはとても重要だと思いまとめてみました。

土日の時間をとってデータベース・SQL、Linux、Gitの復習をしているので、再びまとめたいと思ったら記事にしようと思います
有馬記念にO1を使って参加したら大敗した話

2024年12月22日に開催された第69回有馬記念は、競馬ファンにとって年末の一大イベントです。私たちはこのレースにAI予測ツール“O1”を駆使して挑みましたが、結果は大敗。それでも得られた経験から、多くの学びを得ることができました。本記事では、その顛末と反省点、そして次回への改善案についてご紹介します。


## 有馬記念とは
中山競馬場の芝2500メートルで行われる有馬記念は、1年の総決算ともいえるレースです。ファン投票で選ばれた実力馬が集結し、多くのドラマが生まれることで知られています。

しかし今年は、直前に有力馬ドウデュースが競走除外となり、予想が一変する波乱の展開となりました。

## AI予測ツール“O1”による予想

### 予測に使用したデータ
私たちはChatGPTSearchを活用し、以下の情報を収集・分析しました。

- **過去データ**: 有馬記念の先行馬と差し馬の勝率（先行馬60%、差し馬40%）、1～3番人気の信頼性（勝率70%）。
- **出走馬の直近成績**:
  - アーバンシック（3番）: 菊花賞1着、先行力とスタミナが強み。
  - ダノンデサイル（1番）: 日本ダービー1着、末脚の切れ味が注目ポイント。
  - ベラジオオペラ（5番）: 大阪杯1着、中距離戦での安定感。
  - レガレイラ（8番）: 調教評価が高く、伏兵として注目。
  - ジャスティンパレス（11番）: 春天皇賞の経験を活かせるスタミナ型。
- **オッズと注目度**:
  - 人気上位: アーバンシック（1.8倍）、ダノンデサイル（3.0倍）。
  - 伏兵: レガレイラ（15.0倍）。

### 購入馬券と戦略
これらのデータを基に、O1は以下の馬券を提案しました。

1. **三連複ボックス（5頭）**:
   - 的中率と配当のバランス重視。
   - 選んだ馬: アーバンシック、ダノンデサイル、ベラジオオペラ、レガレイラ、ジャスティンパレス。
   - 費用: 10通り×100円＝1,000円。

2. **三連単ボックス（5頭）**:
   - 高配当狙い。
   - 選んだ馬: 同上。
   - 費用: 60通り×100円＝6,000円。

## レース結果と敗因分析

### レース結果
- **1着**: レガレイラ（8番）。
- **2着**: シャフリヤール（16番）。
- **3着**: ダノンデサイル（1番）。

**結果**: 全滅。払い戻しはゼロでした。

### 敗因
1. **シャフリヤール（16番）のノーマーク**  
   GⅠ実績があるものの、最近の成績不振から予想外の2着入り。

2. **ドウデュースの除外の影響**  
   レース展開が大きく変化し、予想の柔軟性が欠如。

3. **資金配分の偏り**  
   三連単ボックスに予算を集中させ、他の選択肢を広げられなかった。


## 改善案と次への課題

### 改善案
1. **直前情報の柔軟な活用**  
   馬場状態や除外馬の情報を反映し、予想の精度を高める。

2. **買い方の多様化**  
   フォーメーションや流しを導入し、予算の効率的な配分を目指す。

3. **リスク分散**  
   高配当狙いと的中率重視を組み合わせたバランスの良い戦略。

### 次への課題
- GⅠ実績馬や伏兵馬を見逃さない視点の強化。
- AIツールの改善によるさらなる精度向上。


## まとめ
AI予測ツール“O1”を駆使して挑んだ有馬記念は、残念ながら大敗に終わりました。しかし、この失敗を通じて競馬予想の奥深さと課題が明確になり、次回へのヒントを得ることができました。

競馬の楽しさは勝ち負けだけではありません。次こそはより賢い予想を実現し、リベンジを果たしたいと思います。

---

### AIツールの活用について
この記事はChatGPTを活用して作成しました。AIによる分析結果と提案を基に執筆しています。

---
多次元ブロックチェーンという未来

## ブロックチェーンの多次元化を考えてみる

現在あるブロックチェーンは2次元的な構成をとっており、世界中に分散して存在しつながりあっているノードも、チェーン上に連なっていくブロックも、横に展開している。サイドチェーンやレイヤー2なども、横軸の展開に見え、平面に閉じ込められている感覚がある。また、最近のブロックチェーン界隈は、大きな変化・進化という点については、鈍化してきているようにも見える。
そこで、ブロックチェーンを多次元構成にすると、最強のブロックチェーンができあがるのではないか、という仮説を立ててみた。

```
[仮説]

ブロックチェーンを多次元構成にすると、最強のブロックチェーンができあがるのではないか?
```
ブロックチェーンの多次元化を考えるにあたり、宇宙物理的な要素や量子力学的な要素は不可欠であり、そういった用語が登場してくるので予めご了承をば。

## 最先端のブロックチェーンは時空を超えるか
まずは、ブロックチェーンの多次元化を図る上で、多次元化させる要素を検討。次の3要素が考えられる。
```
1. space(空間)
2. time(時間)
3. function(機能)
```

それぞれ見ていく。

### 1. space(空間)・・・空間的多次元化
ブロックチェーンネットワークにおける空間は、ノードが存在する物理空間と、一つのブロックチェーン内のデジタル空間と、複数のブロックチェーン同士がつながるデジタル空間とがある。
```
- 物理空間：P2Pネットワークの構成要素であるノードを多次元に分散配置
　　-> 多次元ノード、多次元P2Pネットワーク
- デジタル空間：
　・一つのブロックチェーン内の空間・・・対となる2つのハッシュでフォークさせた量子もつれ的重ね合わせ状態
　・複数のブロックチェーン間の空間・・・空間的・時間的・機能的に異なる次元のブロックチェーン同士をつなぐ
```
※分散化されたデータを量子粒子に変換して「量子ブロック」を作成する「量子ブロックチェーン」は、実際に世界で研究開発が行われている。

一つのブロックチェーン内での多次元化は、「0」と「1」、「YES」と「NO」のようにフォークするため、答えが同時に2つ存在するようになる。これにより、計算や処理を複数同時並行に進めることが可能になる。2つあるため、その瞬間は分岐し定まっていないが、署名・選択・実行がなされたり次のブロックがつながったりするタイミングで定まる。

「**宇宙ノードを建てたい**」と最近特に口にしているのだが、それも、ノードやブロックチェーンネットワークの多次元化の一端である。

### 2. time(時間)・・・時間的多次元化
重力の大小によって時間の進む速さが変化するということが知られている。また、映画「インターステラー」にも出てきたように、多次元領域においては、現在と過去が隣り合わせ、あるいは入り混じっているような状態になる可能性がある。
そこで、
```
- 複数の重力下にノードを配置(多様な時間速度下にノードを配置)
- ノードの同期と同時に、各ノードとの時間差をアンカリングしていく
```
上記のようにすることで、通常一直線の一方向で捉えられている「時間」において多次元化できるものと考える。

### 3. function(機能)・・・機能的多次元化
機能的多次元化についてはまだあまりイメージできていないが、
```
- モジュラー設計
- プラグイン
```
などによって多次元化することができるかもしれない、と思案中である。
今後も引き続き機能的多次元化を深ぼっていく。

ブロックチェーンの重要な構成要素である「ノード」、ノードのつながり合いで構成される「P2Pネットワーク」。
特にノードと時空とは密接な関係があるため、ブロックチェーン多次元化の鍵の一つがそこにあると考えられる。
(いわゆる「原子性」あり。)

## 量子暗号を取り入れる
現在、各国各所で「量子暗号」が研究開発されている。量子暗号は、量子力学における物理法則の原理を使うことによって、データ通信の途中で第三者が盗聴することを完全に防ぐことができる暗号技術である。どんなに高速な計算能力のある量子コンピュータでも、情報理論上絶対に解読することのできない暗号化が可能であるとされている。
```
- 量子鍵配送(Quantum Key Distribution, QKD)
　・BB84プロトコル
　・E91プロトコル
　・CV-QKD
- 量子直接通信
- 量子複数者鍵合意
```
などの種類がある。

## 多次元ブロックチェーンの力
以上から、ブロックチェーンを多次元化すると次のようなメリットがあると考えれられる。
```
1. 機能性の向上
2. スケーラビリティの向上
3. セキュリティ・耐障害性の向上
```
### 1. 機能性の向上
ブロックチェーンが多次元化することで、より多彩なトランザクションやコントラクトの実行や、より便利で効果的なアプリケーションの実行が可能になる。

### 2. スケーラビリティの向上
- ノードが複数の計算や処理を並行して実行できるようになり、ネットワーク全体の処理能力が向上
- ノードを強力に分散させ、ネットワークの安定性を高める

### 3. セキュリティ・耐障害性の向上
- 量子暗号の採用による暗号技術の強化・進化
- ノードの多次元化により、障害点の分散を強力に向上

## 考えられるデメリットと解決策
```
- 複雑性の増大：
　・モジュラー設計によりシステムを小さなモジュールに分割、管理しやすさを確保
　・自動化ツール活用による効率化
 など
```

## 最先端の多次元ブロックチェーンを実現しよう！
![_ae5796c9-1f94-4ab1-aafd-9d88fc2bdfb6.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299944/4cdb2d7c-9133-c307-52bf-4c45dd12aded.jpeg)

以上見てきた通り、デメリットに対する対策を前提にブロックチェーンを多次元化すると、ブロックチェーンの機能や性能が飛躍的に高まり、非常に強固な最先端のブロックチェーンが構築できる。いわゆる「ブロックチェーン vs 量子コンピュータ」に対する答えでもあると考える。
多次元ブロックチェーン上で「多次元トークン」や「多次元ネームスペース」、「多次元トランザクション」を作ることができるようになると思うと、非常に夢が広がる。新たなビジネスやユースケースが創出されるであろう。
「量子ブロックチェーン」や「量子暗号」などに注視しながら、「宇宙ノード」構想もじわじわ進め、ブロックチェーンの多次元化を研究・実験し、実現していこう！
公開鍵暗号


下記の記事の続きです。
[共通鍵暗号](https://qiita.com/tom_S/items/e5c6e183064354fee8b2)

上記の記事でも示しましたが、共通鍵暗号方式では鍵を共有する必要があり、不特定多数の相手と通信を行う時に鍵をどうやって渡すかが問題となっています(鍵配送問題)。
公開鍵暗号方式ではこの鍵配送問題を解決することができるので、この記事で説明していこうと思います。

# 公開鍵暗号とは

暗号化用の鍵と、復号化用の鍵の二つの鍵を使って暗号通信を実現します。

![公開鍵通信.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266944/4aa57a03-a4f1-32b9-b101-0f591b23e6f8.png)

この時、暗号化用の鍵と復号化用の鍵は、1対1で対応してペアになっています。
例えば、公開鍵暗号用の暗号化用の鍵Aと復号化用の鍵Bのペアを作成すると、鍵Aで暗号化したデータは鍵Bでしか復号化できません。
この性質を使って、共通鍵暗号で使用する共通鍵の配送を行います。

## 公開鍵暗号を使った共通鍵の配送

共通鍵暗号の共通鍵の配送は、下記の手順で行います。
1. 公開鍵暗号の暗号化用の鍵を公開しておく(公開鍵にする)
2. 公開されている暗号化用の鍵で、共通鍵を暗号化して送る

もう少し具体的にすると、下記の図のようなイメージです。

![鍵配送.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266944/6e32108f-72dc-39ee-d3f8-dfa4201da518.png)

暗号化用の鍵とペアになっている復号化用の鍵を誰にも渡さない状態(プライベート鍵)にしておけば、
共通鍵を入手できるのは、復号化用の鍵を持っている人間だけになります。
このように共通鍵を通信したい相手のみと共有します。


# ハイブリッド暗号システム

上記で示した、公開鍵暗号で共通鍵を共有し、暗号化通信を行うシステムのことを、ハイブリッド暗号システムと呼ばれることがあります。
実際の共通鍵生成から、鍵交換、暗号化通信までの流れは下記のようになります。

![ハイブリッド暗号システム.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266944/d5e57dba-21df-8a6e-df6d-85430ee74b79.png)

共通鍵は通信の度に生成するしくみとなります(ここで使用する共通鍵をセッション鍵と呼びます)。
全ての通信を公開鍵暗号でやればよいのではと思う方もいらっしゃるかと思いますが、公開鍵暗号は共通鍵暗号より通信速度が遅いという性質があるため、このような方法を取っています。
セッション鍵(共通鍵)は通信の度に変わりますが、公開鍵は通信の度に必ず変わるわけではないので、公開鍵のビット長は長めに設定するのが良いとされています。もちろんセッション鍵も短くて良いというわけではありません。セッション鍵を必要以上に短くすると、ブルートフォースアタックにより破られる可能性もあります。


# 公開鍵暗号の代表的な方式

ここからは公開鍵暗号方式の代表的なものの概要を示します。計算式などは割愛しています(時間があればそれも記事にしたいですが。。。)

## RSA

大きな数の素因数分解を高速で解く方法が現状ないことを利用した暗号方式です。
よく使われるものなので、暗号化と復号化、鍵ペアの作成に関して簡単に説明します。

### RSAの暗号化

次の式で成り立つように暗号化します。

    暗号文 = (平文のE乗) mod N

平文をE乗して、Nで割った時の余りを暗号文とします。このEとNのペアが公開鍵となります(公開鍵は(E,N)と表現します)。

### RSAの復号化

次の式で成り立つように復号化します。

	平文(復号後) = (暗号文のD乗) mod N

平文をD乗して、Nで割った時の余りを暗号文とします。Nは暗号化の時に使用したものと同値です。このDとNがプライベート鍵となります(プライベート鍵は(D,N)と表現します)。

### 鍵ペアの作成方法

下記の手順で作成します。

1. Nを求める
      - 擬似乱数生成器で桁数が大きい素数二つの値p,qを用意し、p×qをNとする
2. L(p-1,q-1の最小公倍数)を求める
3. Eを求める
      - 1<E<Lとなり、EとLの最大公約数が1となる。これと擬似乱数生成器を使って計算する
4. Dを求める
      - 1<D<L、E×D mod L = 1を満たすDを計算する

E,D,Nが大きな値であればあるほど、ブルートフォースアタックによる攻撃は困難になります。

### RSA-OAEP

任意の暗号文を復号化させることによる攻撃(選択暗号文攻撃)への対処のために使用されます。間違った暗号文に対して「ここが間違っている」というレスポンスを期待して行う攻撃に対処するためのものです。

RSA-OAEPは暗号文に認証情報を追加し、これが間違っている場合は一律で「認証エラー」を返し、具体的なエラー内容を返さないことで前述の攻撃の対処を行います。

## ElGamal方式

(平文) mod Nで離散対数を求めるのが困難なことを利用した公開鍵暗号方式です。鍵の長さが平文の二倍になります。

## Rabin方式

(平文) mod Nで平方根を求めるのが困難なことを利用した公開鍵暗号方式です。

## 楕円曲線暗号(ECC)

楕円曲線と呼ばれる曲線を定めて、その曲線の上に乗っている点に対して特殊な乗算によって暗号化します。RSAに比べて鍵のビット数を少なくできるため、利用されることも多いです。


# 公開鍵暗号で防げないこと

man in the middle攻撃(攻撃者が通信の間に入り、仲介することによる攻撃)を防ぐことはできません。これに対処するためには公開鍵の証明書が必要になります。証明書に関しては別の記事で説明しようかと思います。


# 参考文献

- 暗号技術入門 秘密の国のアリス(書籍)
https://cr.hyuki.net/
[Python] Selenium+Adblock

# はじめに
Seleniumでスクレイピングしてるとき、広告があるせいで読み込みに時間がかかってしまう問題がある。
広告さえ無ければ1,2秒で読み込みが終わるため、Adblockを導入したい。
Seleniumには拡張機能を読み込む機能はあるが、色々ややこしいので触りにくい。
そこで、`SeleniumAdblock`というパッケージを紹介する。

# SeleniumAdblock
まず[公式Github](https://github.com/sandrocods/SeleniumAdblock)の指示通りにインストールする。
```
pip install git+https://github.com/sandrocods/SeleniumAdblock.git
```

その後、ChromeDriverに渡すオプションを以下のように設定して実行すると、広告をブロックしてスクレイピングできる。
```python
from selenium import webdriver
import SeleniumAdblock

options = SeleniumAdblock.SeleniumAdblock()._startAdBlock()
options.add_argument('--headless')
options.add_argment('--no-sandbox')
options.add_argment('--remote-debugging-pipe')

driver = webdriver.Chrome(options=options)
driver.get("https://example.com/")
```

実際に試してみると、ブロック無しでnetkeiba.comからレース情報を読み込むと数十秒かかっていたのが、SeleniumAdblockを導入することで数秒で終わるようになった。
効果絶大。

# まとめ
Seleniumでスクレイピングを行っていて広告に悩まされている人は`SeleniumAdblock`を導入してはどうだろうか。
ほぼ全ての広告をブロックできるため、スクレイピング効率が大きく向上するはずだ。
マルチプレイ対応の雑記

こちらは [Applibot Advent Calendar 2024](https://qiita.com/advent-calendar/2024/applibot) 23日目の記事になります。前回の記事は[コチラ](https://qiita.com/mi11km/items/d94c0efa27a5e41b47f7)です。


## はじめに
Unityで作られたゲームのマルチプレイ対応をする時に思ったことなどを雑に書きます。
まず、伝えたいのは将来的にマルチプレイすることは絶対にない場合以外はマルチプレイを考慮して仕様と実装した方が良いです。
[Netcode Facts & Fiction](https://create.unity.com/netcode-facts-and-fiction)
[オンラインゲームのしくみ](https://www.sbcr.jp/product/4797375916/)
> オフラインゲームができれば
後は通信の機能を追加するだけでオンラインゲームにできるだろう。
この一言で通信機能の追加は後回しにされがちです。そして、プロジェクト末期の通信機能を追加する段階で、炎上することがよくあります。この発言は、**大きな間違い**なのです。

[Unreal Engineのドキュメント](https://dev.epicgames.com/documentation/ja-jp/unreal-engine/networking-overview?application_version=4.27)
> 早期のマルチプレイヤーの計画
プロジェクトのどこかの時点でマルチプレイヤー機能が必要になる可能性がある場合は、プロジェクトの最初からマルチプレイヤーを念頭に置いてゲームプレイすべてを構築する必要があります。チームがマルチプレイヤーを作成するための追加手順を常に実装していれば、ゲームプレイを構築するプロセスにかかる手間はシングルプレイヤー ゲームとあまり変わりません。長期的に見れば、プロジェクトでチームがデバッグやサービス提供を行うことが全体として簡単になります。そして、Unreal Engine でマルチプレイヤー用にプログラミングされたゲームプレイは、シングルプレイヤーでも動作します。

> それに対し、ネットワーキングなしで構築済みのコードベースをリファクタリングするには、プロジェクト全体を綿密にチェックして、ほぼすべてのゲームプレイ関数を再プログラミングする必要があり、チーム メンバーは、その時点までは当たり前だと思い込んでいたプログラミングのベスト プラクティスを学び直す必要があります。また、ネットワークの速度や安定性によって生じる技術的なボトルネックに対応する準備もできていないでしょう。

> プロジェクトの終盤でネットワーキングを導入するのは、最初からネットワーキングを計画しておくより大量のリソースを必要とする厄介な作業です。したがって、プロジェクトでマルチプレイヤー機能が必要になることはないと確信している場合以外は、常に マルチプレイヤー用にプログラミングすることを強くお勧めします。

このように先人達が後から追加するのはやめとけと警告しています。
ただ、マルチプレイの実装経験もなく業務で後からマルチプレイ機能を追加することになってから上記の内容を知る人も多いでしょう。

## Tips

### UnityからPure C#へ
まず、Unityにガチガチに依存したコードをC#サーバーで動かせるようにする場合Pure C#にする必要があります。
最初からロジックがPure C#で分離されている場合は問題ありませんが
何も気にせずUnityでクラス追加すると `MonoBehaviour` を継承していると思います。
オフラインゲームが既にある程度できていて今から設計を大きく変更ができない場合は`partial`を使ってクラス分割してロジックだけのPure C#ファイルにして、そのファイルだけサーバー側プロジェクトに共有してください！

```csharp:Hoge.cs
public class Hoge : MonoBehaviour
{
    // 演出用のフィールドやメソッド

    // ロジック用のフィールドやメソッド
}
```
これをこうするだけ、簡単ですね！

```csharp:Hoge.cs
public partial class Hoge : MonoBehaviour
{
    // 演出用のフィールドやメソッド
}
```

```csharp:Hoge.Logic.cs
public partial class Hoge
{
    // ロジック用のフィールドやメソッド
}
```
基本の対応はこれですが、依存してるクラスなど全部分離する必要があるので最初からロジックはPure C#で書いていた方がいいです。
地道な作業と動くようになるまでが大変なので...

### アセットの注意点
AI用のBehavior TreeアセットなどをScriptableObjectで作っている場合、そのままではC#サーバーで使うことができません。
そのためJSONやMessagePackなど他の形式に変換する必要があります。
アセット同士が再起的に参照している場合、Unityでは同じアセットが同じインスタンスになると思います。
しかし他の形式にシリアライズしてC#サーバーでデシリアライズする場合、特に何も気にしないとそれぞれ別のインスタンスになってしまってメモリ的にも影響出てしまいます。また、ロジック以外にフィールドがあるとローカルでは同一インスタンスでサーバー上では別インスタンスになってしまって挙動が変わってしまうので注意してください。

※試してないですが、[MemoryPack](https://github.com/Cysharp/MemoryPack)ならそこら辺を気にせずできるかもしれません

### シングルトンの注意点
staticを使ってSingletonにしている場合に困ることがあります。
クライアントエンジニアが特に気にせず実装するとユーザーは一人、インゲームは一つしかないと思って実装すると思います。
しかし、サーバー上で複数のユーザー、複数のインゲームを動かす場合にその前提でシングルトンを使っていると終わります。
シングルトンを使わないようにするか、必要な単位でDIするようにしましょう。

## おわりに
この記事を読んで、最初からマルチプレイ対応した方が良いと思って貰えたら嬉しいです。

以上、[Applibot Advent Calendar 2024](https://qiita.com/advent-calendar/2024/applibot) 23日目の記事でした。
XSONについて

XSONはeXtensible and Simple Object Notationの略で、現状使われている多くのデータシリアライゼーションフォーマットや設定ファイルのフォーマットを改善して作られたそうです。

XSONには以下の2つの原則があるそうです。基本的にはシンプルな仕様にしつつもユーザーによる拡張を可能にしている点が特徴です。

- 非常にシンプルな基本仕様
- ユーザーがファイルごとに機能を追加できる

XSONのサンプルを以下に示します。仕様がシンプルであるために、雰囲気で読むことができます。

```
/* (This is a multi-line comment)
 * List of servers in an XSON file
 */
servers: {
  //Another comment.
  alpha:  [10.0.0.2, My Home Server]
  bravo:  [10.0.0.7, My Work Server]
  charlie:[10.0.0.9, My Friend's Server]
  aux: {
    //Whitespace around (but not inside) the key or value is ignored
    os        :  Ubuntu
    version   :  22.04 LTS
    start time:  14:03:59:10 //The first colon is used to separate the key and value
  }
}
```

# 記法仕様

## キーバリュー
XSONのキーはコロン `:` で区切られ、要素は改行で区切られます。
文字列にはクォートが不要で任意の数の空白を含むこともできます。

```
key: value
my key: my value
```

1行の中に複数個のコロンがあった場合は一番左のコロンが区切り文字になります。

```
my : character: 0x3A 
```

この例ではキーは `my` でバリューは `character: 0x3A` です。

キーは位置位である必要があり、大文字と小文字は区別されません。
以下の例は同じキーと認識され、解析エラーが発生します。

```
key1: value 1
Key1: value 2
```

キーとバリューの前後の空白は無視されます。つまり、以下の5つは全て同等です。

```
  my long key     : my long value
my long key:my long value
 my long key: my long value
    my long key    :my long value
my long key: my long value
```

## 型の解釈
XSONには型がありません。つまり、型情報は各言語のXSONパーサーによって与えられることになります。

例えば、以下のXSONがあった時に、

```
my magic number: 10
```

読み出し時にパーサーに対して型情報を指定して読み出しを行います。

```
get<string>("my magic number"); //returns '10' as a string variable
get<int>("my magic number"); //returns 10 as a signed integer
get<bool>("my magic number"); //returns 'true'
get<float>("my magic number"); //returns 10.f as a float
```

## 配列
角括弧とカンマを使って配列を定義できます。
末尾のカンマは許容されます。

```
my array: [
  value one,
  value two,
  value three, //trailing comma is allowed
]
```

## オブジェクト
XSONのオブジェクトは波括弧に囲まれたキーバリューのペアです。

```
my key: my string value
my object: {
  property one: true
  property two: false
  property three: {
     key: this is inside yet another object
  }
  property four: [
    this is an array inside an object
  ]
}
```

## コメント
XSONのコメントはC言語と同じような構文です。

```
//This is a single line comment
key: value //This is an in-line comment. This comment is not included in the value.
```

```
/********************************
 * This is a multi line comment *
 ********************************/

/* This is another multi line comment.
 Maybe it would describe the significance of 'key'
 */
key1: value /* You can place multi line comments on one line */
key2: value /* Or you could even make it span
               multiple lines after some XSON text */
```


https://github.com/xson-lang
2024年に開催された各地のPHPカンファレンスの個人的感想

この記事は株式会社うるる（ULURU） Advent Calendar 2024 23日目の記事になります。


2024年12月22日に開催されたPHP Conference Japan 2024の速報版感想及び、今年開催された各地のPHPカンファレンスの参加記録を書いていきたいと思います。

# 自己紹介

NJSSの主にバックエンド開発を担っている一色と申します。今年4月よりLaravelエンジニアとして業務に従事しています。それ以前は、クローラーの保守・運用に従事していました。また、最近はVue.js、TypeScript、CSSなどフロントエンド側にも取り組んでいます。

# 今年参加したPHPカンファレンス

今年は以下に参加しました。

* [PHPカンファレンス北海道2024](https://phpcon.hokkaido.jp/)
* [PHPカンファレンス関西2024](https://2024.kphpug.jp/)
* [PHPカンファレンス香川2024](https://phpcon.kagawa.jp/2024/)
* [PHPカンファレンス福岡2024](https://phpcon.fukuoka.jp/2024/)
* [PHPカンファレンス沖縄2024](https://phpcon.okinawa.jp/)
* [PHP Conference Japan 2024](https://phpcon.php.gr.jp/2024/)

## 全体を通して

今年は地方カンファレンスの復活開催や新規開催があり、開催回数がかなり増えました。

https://qiita.com/akase244/items/34c01fd22f5f20a82408

https://qiita.com/akase244/items/c3f9855275ac77be39b3

昨年地方開催があったのは福岡と沖縄のみで、復活の北海道、関西、新規開催の小田原、香川と一気に増えました。

## 地方カンファレンスの開催は容易なのか？

これに関しては明確にNoと言えます。実は、単純にカンファレンスの準備をすればいいというものではなく、前段階として、主催者個人としての地域とのつながりや、技術コミュニティの立ち上げなどが必要だそうです。なので、これをやらずに構想で終わってしまったものもあるようです。

https://www.docswell.com/s/tomio2480/5MXXE8-phpcon-okinawa

## 良いところの流用

2月のPHP関西では、参加者章をひっくり返すとセッションの時間割が書かれており、個人的にこのシステムは便利でした。このシステムは好評だったようで、6月の福岡でも採用されました。


## 新たな開催モデルを提示した香川

5月のPHP香川は玉藻公園内の披雲閣という、技術系カンファレンスとしてはあまり使用されない会場での実施でした。個人的に良いカンファレンスだと感じました。讃岐うどんのキッチンカーがあり、スポンサーブースを巡ると、トッピングと交換できる仕組みも面白さを感じました。こうした開催モデルは今後の参考になると思います。

# PHP Conference Japan 2024について

（後ほど追記します）

## 印象に残ったセッション振り返り

https://speakerdeck.com/riku929hr/tesutokodonogaidorain-zuo-cheng-karayun-yong-made

https://speakerdeck.com/asumikam/tsukaikonasu-phpunit-phpcon-2024

今回発表セッションは主にテスト関連を中心に回りました。個人的にテストでは関数そのもののチェックに終始して、あまり振る舞い方を意識することは無かったので、そこを気をつけようと思いました。




## スポンサーブースイベント感想

会社の業種が結構ばらけてきた印象を持ちました。問題を用意したり、製品の話をしたりと様々でした。また、景品を用意するなど、今後の参考になりました。

なお、抽選会にも挑みましたがほぼステッカーでした。



## 最後に

実行委員長はじめスタッフの皆さん、楽しいイベントをありがとうございました。2024年のPHP関連の最後のイベント良かったです。


# 2025年のPHP関連のイベント

カンファレンスの最後に発表がありました、2025年も盛りだくさんです。

https://qiita.com/akase244/items/00323a1bfbb6575f0c94


2025年もPHPカンファレンスを楽しみましょう


明日は@swcityさんです
ページングの種類　まとめ

# ページングの種類

## ページクリック
データを固定数のページに分割し、ユーザーがページ番号をクリックして移動する方式。
例：ブラウザ、ECサイト

## 無限スクロール
ユーザーがページをスクロールすることで、自動的に新しいデータが読み込まれる方式。
例：twitter

## ロードモア（Load More）
「もっと見る」ボタンをクリックすることで、追加のデータを読み込む方式。
例：ブラウザ、YouTube

# ページングの処理
## オフセット式
データベースクエリで、特定のオフセットからデータを取得する方式。
例：
``` SQL
OFFSET /*[# mb:p="sizePerPage"]*/ 30 /*[/]*/ * (/*[# mb:p="page"]*/ 100 /*[/]*/ - 1) ROWS
FETCH NEXT /*[# mb:p="sizePerPage"]*/ 30 /*[/]*/ ROWS ONLY
```

## シーク法
前回取得したデータの最後の位置を基準に次のデータを取得する方式。
より効率的で、特にデータが頻繁に更新される場合に有効。
→「ページクリック」方式で使うには工夫が必要
例：
最初の10件を取得
```SQL
select
 *
from
 t_order_item
order by
 t_order_item.order_date desc,
 t_order_item.product_id,
 t_order_item.order_item_id
limit 10
;
```

次の10件を取得
```SQL
select
 *
from
 t_order_item
where
-- 前ページのorder_dateより小さい日付(descなので)なら残す。
( date('2019-04-23') > order_date )
or
-- 前ページのorder_dateと同じ日付で、前ページのproduct_idも大きい(ascなので)なら残す。
( date('2019-04-23') = order_date and 5 < product_id )
or
-- 前ページのorder_dateと同じ日付で、前ページのproduct_idも同じなら、前ページのorder_item_idより大きい(ascなので)なら残す。
( date('2019-04-23') = order_date and 5 = product_id and 53 < order_item_id)
order by
 order_date desc,
 product_id,
 order_item_id
limit 10
```

参考：https://qiita.com/madilloar/items/b4e786a932ef9d4551b9#%E3%82%AA%E3%83%95%E3%82%BB%E3%83%83%E3%83%88%E6%B3%95%E3%81%AE%E7%89%B9%E5%BE%B4
Heroku Router2.0を利用して、herokuアプリをとっととhttp/2化する

今年もやってまいりました。ゆかちゃんの誕生日です。36歳の誕生日を迎えられて、ファン一同胸を熱くしております。

こちらは毎度12/23をダシにして Advent Calendar を書いているしょっさんの自己満足企画です。Heroku Adevent Calendar 23日目は今年もしょっさんです。

---
さて、そんな胸熱展開といえば、我らが Heroku です。Heroku Router2.0がGAしたことで、我々は容易に http/2 を利用することができるようになりました。

https://qiita.com/uikou/items/bfa2b1082ed3b2c558a6

しれっと書いてありますが、これの凄さは「設定だけすれば自動的に http/2 化される」と言うことです。

現行 http/1.1 で書かれているソースコードであろうが、設定さえしてしまえば、Heroku Routerが自動的によしなにやってくれるんです。凄かろうよ？

では試しに私がテスト用でPrivate Space内に持っている https://multi.kashiyuka.info をhttp/2 化しましょう。

元々のサイトはほれこの通り、画像以外は http/1.1 でアクセスしています。
![CleanShot 2024-12-23 at 10.03.15@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37263/a5ac465c-cc11-628c-0a6b-708cc01100ff.png)

そこでおもむろに heroku コマンドを打ちます。

 ```bash
heroku features:enable spaces-http2 -a <アプリ名>
Enabling spaces-http2 for ⬢ <アプリ名>... done
 ```

これだけです。`heroku features:enable spaces-http2` で特定のアプリの `http2` 設定するだけ。
もちろん、SSL化されていることが前提ですが、Private Space の場合なら特定のカスタムドメインがなくとも利用可能です。

さて、この状況から dyno restart したり反映するのを待ってみてからアクセスすると、こう。
![CleanShot 2024-12-23 at 11.39.43@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37263/e2d9ecf4-db65-f91f-fc87-5e5e751ca394.png)
やったぜ。

ソースコードの手直しなく、簡単にすぐに http/2 化が可能です。是非お試しあれ。
Privateサブネットに配置したEC2(Amazon Linux2)からyum installできない

## はじめに
RDSへの接続確認のため、Privateサブネットに配置したEC2インスタンスにMySQLをインストールしようとしたらエラーでハマったので対応方法をまとめる。

## 事象
Privateサブネットに配置したEC2(Amazon Linux2)にMySQLをインストールしようとしたところ、下記のエラーが発生してインストールできない

```
sudo yum -y install mysql

Could not retrieve mirrorlist https://amazonlinux-2-repos-ap-northeast-1.s3.dualstack.ap-northeast-1.amazonaws.com/2/core/latest/x86_64/mirror.list error was
12: Timeout on https://amazonlinux-2-repos-ap-northeast-1.s3.dualstack.ap-northeast-1.amazonaws.com/2/core/latest/x86_64/mirror.list: (28, 'Connection timeout after 5000 ms')


 One of the configured repositories failed (不明),
 and yum doesn't have enough cached data to continue. At this point the only
 safe thing yum can do is fail. There are a few ways to work "fix" this:

     1. Contact the upstream for the repository and get them to fix the problem.

     2. Reconfigure the baseurl/etc. for the repository, to point to a working
        upstream. This is most often useful if you are using a newer
        distribution release than is supported by the repository (and the
        packages for the previous distribution release still work).

     3. Run the command with the repository temporarily disabled
            yum --disablerepo=<repoid> ...

     4. Disable the repository permanently, so yum won't use it by default. Yum
        will then just ignore the repository until you permanently enable it
        again or use --enablerepo for temporary usage:

            yum-config-manager --disable <repoid>
        or
            subscription-manager repos --disable=<repoid>

     5. Configure the failing repository to be skipped, if it is unavailable.
        Note that yum will try to contact the repo. when it runs most commands,
        so will have to try and fail each time (and thus. yum will be be much
        slower). If it is a very temporary problem though, this is often a nice
        compromise:

            yum-config-manager --save --setopt=<repoid>.skip_if_unavailable=true

Cannot find a valid baseurl for repo: amzn2-core/2/x86_64
```

## 原因
Amazon Linux2のyumリポジトリはS3上に存在しているが、そのリポジトリにアクセスできていない。

## 対応方法
s3へのVPCエンドポイントを作成後に`yum install`する。

1. VPC > VPCエンドポイント > エンドポイントを作成を選択
1. タイプは「AWSのサービス」を選択
1. サービス名は`com.amazonaws.ap-northeast-1.s3`、タイプが`GateWay`のものを選択
1. ルートテーブルの設定はEC2インスタンスが含まれるサブネットのルートテーブルを選択

## おわりに
VPCエンドポイントの存在を初めて知った。
GateWayタイプは無料だが、Interfaceタイプは有料らしい。
違いについても機会があれば調べてみたい。

## 参考
https://qiita.com/hf7777hi/items/bce41c613768915bdbb7

https://qiita.com/Masayuki-Goto/items/3ba5c6d07640c605144c
【雑談】未経験新卒二年で転職した男

# 【雑談】新卒二年で転職したその変遷。

これまでの経過で得たもの・変化したものをリストアップしたよ。

## 能力編

### 【IPA資格】
新卒初期の頃は張り切っていたため、資格取得に精を出していた。会社のインセンティブもあったおかげで、モチベを保ちながら効率よく取得することが可能になった。しかし、業務でそんなに使う知識でもないと感じ次第に資格に興味を失くす。  
結果的に転職の際のアピールになる。

### 【行動力】
一年目秋ごろから上司のモラハラ、パワハラ被害を受け、精神的に追い詰められる。  
大学の同期との現状の差を比べてしまい、完全に未来が見えなくなる。  
二年目の夏ごろに母親によって救い出される。それをきっかけに、転職を決意する。  
転職はすんなり成功する。  

動けなかった時期が長かった分、何よりも行動が大事だと痛感した。  
来年はもっとやりたいと思ったことを実現する。

### 【プログラミング諸々】
個人開発やUdemyで興味のある技術を触っては面白がっている。ただし、現場では一度も使わない。  
コードもそんなに書かない。趣味と仕事の半々である。  
業界でどのような技術に自分が面白いと感じるか、アンテナを張っている。

## 意識編

### 【健康意識】
パワハラを受けてから一気に老け込んだ感覚がある。  
老けた分は仕方がないので、せめて予防策を張っておく。  
客先常駐をしていると、不健康な方々がいっぱいいらっしゃるので反面教師にする。  
目下、運動と食べるものには気を付けている。  
後は鏡で自分を見た際に、気分が下がるような顔面は嫌だと感じたから。  
自己肯定感を上げる要素を少しでも増やす。

### 【自宅環境の美意識】
二年目の秋ごろにデバイスの機能美に夢中になる。特にオーディオ。  
同時期に、精神衛生のために部屋の掃除に熱が入り始める。  
気持ちが良いと感じる要素を散りばめておく。

## 総評
- 過去を悔いる二年だった。前を向くまでに二年かかった。
  大変鍛えられた。悩んでしまう根本原因は「未来が見えない」からだった。  
  次の一年は、未来を見据えて行動する。

## 【来年の目標】
- **人生をかけて解消したい社会課題を見つける**  
  IT技術はあくまで技術に過ぎず、どのような課題を解決したいかに目線を合わせたい。

- **大きな賭けをする**  
  人間が面白いと感じるのはリスクに身を投じるときである。  
  リスクの大きい戦いをしていきたい。その時期が長ければ長いほど、人生は面白くなる。