OmniAICreator/Qiita-1.07M huggingface dataset:
Fivetranと外部ログサービス（Azure LogAnaytics）を連携する方法について

Fivetranでログ管理する方法をまとめました。

ログ管理するにはDestinationで外部ログサービスと連携する必要があります。

今回はログサービスにAzureを使います。
まずAzureでLog Analyticsワークスペースを作成しましょう。

![スクリーンショット 2024-03-02 22.16.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449065/0d835243-4358-e867-80eb-51a14ad89cc1.png)

Bashスクリプトを作成しました。

```bash
# Fivetran APIキーに置き換える
API_KEY=$FIVETRAN_API_KEY
API_SECRET_KEY=$FIVETRAN_API_SECRET_KEY

# APIエンドポイント
URL="https://api.fivetran.com/v1/external-logging"

# リクエストボディ
BODY='{
  "group_id": "herring_idealness",
  "service": "azure_monitor_log",
  "enable": true,
  "config": {
    "workspace_id": "17aff66f-0d28-4253-b303-91af9a2ee91e",
    "primary_key": "xxxxxxxxxxxxxxxx"
  }
}'

# APIリクエストの実行
curl -X POST "$URL" \
     -u "$API_KEY:$API_SECRET_KEY" \
     -H "Content-Type: application/json" \
     -d "$BODY" | jq
```

workspace_idとprimary_keyはLog Analyticsワークスペースのエージェントから確認できます。

![スクリーンショット 2024-03-02 22.23.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449065/c72397e6-0e37-7a29-d980-b583fa43834a.png)

またgroup_idについてはDestinationで確認できます。
詳しい確認方法は[FivetranとSnowflakeをAPI連携する方法について
](https://qiita.com/Ryuto_S/items/013abe18b93df98172ed)で紹介しています。

実行結果

```bash
~# ./post-external-logging.sh 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   513  100   236  100   277    215    253  0:00:01  0:00:01 --:--:--   468
{
  "code": "Success",
  "message": "External logging service has been added",
  ...
```

DestinationのExternal Loggingを確認するとAzureと連携されているのが分かりますね！

![スクリーンショット 2024-03-02 23.46.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449065/528bc250-8dcf-26f1-c479-05a06c03918f.png)

以上でログを管理できるようになりました。

## まとめ
Fivetranをログを管理するには外部サービスを使いましょう。
使用できるサービスはリファレンスに載っています。

詳しくはFivetranリファレンスを確認ください。
https://fivetran.com/docs/rest-api/log-service-management
ムームードメインで取得したドメインをさくらサーバーに登録して無料SSL設定する流れ

備忘録として記録に残す

1. ムームードメインでドメインを取得
1. ムームードメインのコントロールパネル→ドメイン管理内のドメイン操作→ドメイン一覧をクリック
1. 取得したドメインをクリック
1. ネームサーバー設定変更ボタンをクリック
1. GMOペポパ以外のネームサーバを使用するを選択して、ネームサーバ1に「ns1.dns.ne.jp」、ネームサーバ2に「ns2.dns.ne.jp」を入力してネームサーバ設定変更ボタンをクリック
1. さくらのレンタルサーバーにログイン
1. ドメイン/SSL→ドメイン/SSL→ドメイン新規登録をクリック
1. 「他社で取得したドメインを移管せずに使う」の追加ボタンをクリック
1. ムームードメインで取得したドメインを入力して追加ボタンをクリック
1. サーバー情報→サーバー情報をクリック
1. ホスト名とIPアドレスのIPv4のIPアドレスをメモ帳に記録しておく
1. ムームードメインのコントロールパネルに戻り、ドメイン管理内のドメイン操作→ムームーDNSをクリック
1. 取得したドメインの行の「変更」ボタンをクリック
1. 設定2でサブドメインには何も入れず、種別は「A」にして、内容は先ほど記録したIPアドレスを入力
1. 入力欄を追加をクリックして、サブドメインには何も入れず、種別は「MX」にして、内容は先ほど記録したホスト名を入力
1. 「セットアップ情報変更」ボタンをクリック
1. さくらのレンタルサーバーに戻って、ドメイン/SSL→ドメイン/SSL→取得したドメインの行の「設定」をクリックして「SSL設定」をクリック
1. 「登録設定を始める」をクリック
1. Let’s Encrypt (無料SSL)の「利用する」をクリック
1. Let’s Encryptの利用ポリシーにご同意いただける場合チェックをいれ「無料SSLを設定する」をクリック
1. 「ただいま無料SSL証明書の発行手続き中です。」と表示される
1. しばらく時間（5~10分くらい?）が経ったらSSL設定された独自ドメインの出来上がり！！


おまけ
ドメイン/SSL→ドメイン/SSL→取得したドメインの行の「設定」をクリックして「基本設定」をクリックして「HTTPSに転送する」にチェックを入れて保存しておいた方が良いかもね
【MySQL】データベースのAUTO_INCREMENTの開始位置をSQLで指定する方法

## 【MySQL】データベースのAUTO_INCREMENTの開始位置をSQLで指定する方法

your_tableをA_Iを使っている自分のテーブル名に置き換えて実行すると指定した数値からA_Iが開始される。

```sql:SQL
ALTER TABLE your_table AUTO_INCREMENT = 1;
```

:tangerine:
VSCode+MicroPico でMicroPythonのプログラムをPico (W)に書き込み実行する手順

Visual Studio Code (VSCode)の[Extentions](https://zenn.dev/ymasaoka/articles/10-extensions-useful-to-start-using-vscode)にMicrioPicoを導入し、Raspberry Pi Pico (W) (Pico W) でMicroPythonのプログラムを作成し、実行するとき、MicroPythonのREPL(対話的な実行環境, Read Evel Print Loop, terminalに>>>のプロンプトが出ている状態)でRun ボタンをクリックすると実行するのですが、このままでは、VSCodeを動かしているPCとPico Wを切り離し、Pico Wの電源を入れると、動きません。

Pico Wをプログラム書き込み元のPCから切り離し、Pico Wの電源投入時に自動的にプログラムが実行できるようにする場合、以下の手順で、MicroPythonプログラムをPico Wに書き込み・実行が成功できたので、記録します。

## 手順
1. Pico Wで電源On時に自動的に走らせたいプログラムを、main.pyという名前で保存
2. Pico WをVSCodeを動かしているPCにUSBケーブルで接続。VSCode画面下の状態表示が Pico Connectedになるのを待つ
3. 1.のプログラムを表示している(active)の状態で、VSCodeのメニューのView -> Command Pallet ->MicroPico: Upload current fileを選び、プログラムを Pico Wに書き込み
4. View-> Command Pallet -> MicroPico: Run current file on Pico を選ぶ
5. USBケーブルをPCから抜き、電源に差し替えると、書き込んだプログラム(main.py)が Pico Wで実行される

#参考
1. [Raspberry Pi Picoの使い方：はんだ付け、開発環境（Thonny Python IDE or VS Code）を導入しLチカする方法を解説](https://www.handsonplus.com/electronic-works/get-started-raspberrypipico/?fbclid=IwAR0XfCH3Kq4VnT2mFgf-GJWAnYNo4-DAkMCL4qBDmuN8uim5pJQVwlQU7yU)
2. [Raspberry Pi Pico WH + MicroPython + 電子ペーパーで、自分好みの卓上カレンダーを作る](https://qiita.com/h53/items/7e6f2bb9edd89bed9126)
FivetranとSnowflakeをAPI連携する方法について

SnowflakeとFivetranをAPI連携する方法をまとめました。

FivetranにDestinationを作成します。
接続先はSnowflakeです。

Bashスクリプトを作成しました。

```bash
# FivetranのAPIキーとシークレットを設定
API_KEY=$FIVETRAN_API_KEY
API_SECRET_KEY=$FIVETRAN_API_SECRET_KEY

# APIエンドポイント
URL="https://api.fivetran.com/v1/destinations"

# リクエストボディ
BODY='{
    "group_id": "conserve_syringe",
    "service": "snowflake",
    "region":"AZURE_JAPANEAST",
    "time_zone_offset":"-9",
    "config": {
        "host":"<組織名>.<リージョン>.snowflakecomputing.com",
        "port":443,
        "database":"SNOWFLAKE_DEV",
        "auth":"PASSWORD",
        "user":"RyutoS",
        "password":"xxxxxxxxxxx"
    }
}'

# APIリクエストの実行
curl -X POST "$URL" \
     -u "$API_KEY:$API_SECRET_KEY" \
     -H "Content-Type: application/json" \
     -d "$BODY" | jq
```

group_idはDestinationから確認できます。

![スクリーンショット 2024-03-02 23.24.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449065/440deb0b-69c7-a2a3-659a-8495ecf4e22d.png)

実行結果

```bash
~# ./post-destination.sh 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1276  100   911  100   365     51     20  0:00:18  0:00:17  0:00:01   239
{
  "code": "Success",
  "message": "Destination has been created",
  ...
```

Fivetranを確認するとSnowflakeに接続されたDestinationが作成されているのが分かりますね。

![スクリーンショット 2024-03-02 23.30.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449065/6117180f-b4a6-7736-fe35-8b6e2fd78ff8.png)

## まとめ

今回はAPIを使ってFivetranとSnowflakeを連携する方法を紹介しました。

Destinationの連携はAPIだけでなくダッシュボードでもできます。
詳しい設定方法は[FivetranとSnowflakeを連携するには？ダッシュボードとAPIそれぞれ手順を紹介](https://tellingbook.com/integrate-fivetran-snowflake/)で紹介しているのでぜひご覧ください！
Windows11 OSバージョンの確認

__1.　キーボードで「windows+R」を押下し、「winver」と入力する。__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664791/967eec59-1de1-4ab2-2de7-abe7b1c9d5f3.png)



__2.OKを押すとwindowsバージョンの情報が記載されたウィンドウが表示される。__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664791/5fc7e13e-99d4-399b-cc79-45c10880c30b.png)
[no.002] なぜAWSアカウント（=rootユーザ）が危険なのか


# なぜAWSアカウント（=rootユーザ）が危険なのか

AWS初学者向け。

AWSの学習では、rootユーザではなく、作成したIAMユーザーを使いましょう。

rootユーザだけを使って学習を続けることは、以下サイトのとおり、危険です。

- 参考サイト
    - なぜAWSのrootユーザの利用が危険なのか？〜アカウント作成後の運用方法についてまとめてみた〜
    - https://dev.classmethod.jp/articles/rootuser-risk/
【AWSまとめ】プライベートサブネットのEC2にVSCodeからSSH接続する方法

ここでは、プライベートサブネットに配置されたEC2にVSCodeからSSH接続する方法を整理します。

プライベートサブネットのEC2インスタンスへのSSH接続自体の方法は、以下のリンク先で紹介してます。VSCodeへの設定は**リンク先の設定が済んでいることを前提としています。**

https://qiita.com/GORIN/items/2a73787d1a4b79f834cc

## やること
1. VSCodeへのRemote-SSHのインストール
2. Configファイルを編集する
3. SSH接続する

## VSCodeへのRemote-SSHのインストール
ExtensionsでRemote-SSHを検索し、インストールする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/7765c509-cdcc-8316-7e65-3830ee573031.png)

## Configファイルを編集する。

まず、左下の><を押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/06bfd4a2-d6b2-4998-5415-ed91720f5ed0.png)

次に、Connect to Hostを選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/425ca88c-3146-ab51-63ea-64b7695748f8.png)

Configure SSH Host...を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/c1d83569-1d8e-5a4d-e27f-16fb685740ad.png)

Configファイルを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/0a699739-5c2a-f426-3514-025b97d3f2c0.png)

Configファイルで以下のように、ファイルを編集する。

~~~
Host ホスト名(どんな文字列でもOK)
    HostName インスタンスID
    User ユーザー名
    Port 22
    IdentityFile C:\Users\ユーザー\秘密鍵のファイル
    ProxyCommand "AWS CLIのプログラムパス" ec2-instance-connect open-tunnel --instance-id %h
~~~

以下が、私の環境での設定例です。
~~~
Host GORIN
    HostName i-0a508e8f2f0eea205
    User ubuntu
    Port 22
    IdentityFile C:\Users\ユーザー\GORIN.pem
    ProxyCommand "C:\Program Files\Amazon\AWSCLIV2\aws.exe" ec2-instance-connect open-tunnel --instance-id %h
~~~

VSCodeの画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/f927cf84-87a1-cfc6-feb1-5e5d5765db24.png)

## SSH接続する。

Configファイルを編集し終わったら、次にもう一度、左下の><を押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/06bfd4a2-d6b2-4998-5415-ed91720f5ed0.png)

すると、Configファイルにて設定したHost名(ここでは、GORIN)が表示されているので、それを押下する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/f8877523-4975-2148-0f77-3086444c2107.png)

Opening Remoteと出たらSSH接続を試みている最中であることを意味。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/890dcecf-bb19-1b69-dd9a-c369391601a9.png)


EC2のAMIでOSを選ぶ。（ここでは、Linuxを選択）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/cdbe7809-cb5a-f930-ef6d-41e44e4acd8f.png)

左下が、SSH:ホスト名になっていたら、OK

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/4dbe5238-6404-0c96-cc37-1a9ea098b640.png)

ここまで来たら、Terminalを出せば、EC2インスタンスに接続していることがわかります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/3c6aa1a7-84a9-331e-1ef4-eaf07bb74670.png)

以上です！
ABC343をPythonで（A～E）

AtCoder Beginner Contest 343の解答等のまとめ

https://atcoder.jp/contests/abc343

# A問題
$0 + 0$のときに1を返して、それ以外は0でいい
```python:A
print(0 if sum(map(int, input().split()))>0 else 1)
```
# B問題
各行で1になっているところをすべて返せばいい
```python:B
for _ in range(int(input())):
    s = list(map(int, input().split()))
    lst = [i + 1 for i, s_i in enumerate(s) if s_i == 1]
    print(*lst)
```
# C問題
3乗して$N$以下の数は高々$10 ^ 6$なのでそれぞれで回文か調べればよい
```python:C
n = int(input())
i = 0
ans = 0
while i ** 3 <= n:
    s = str(i ** 3)
    if s == s[::-1]:
        ans = i ** 3
    i += 1

print(ans)
```
# D問題
それぞれのスコアと各スコアの個数と種類数をメモできるようにして順番にやっていく
```python:D
n, t = map(int, input().split())

score = [0] * n
d = {0: n}
ans = 1
for _ in range(t):
    a, b = map(int, input().split())
    a -= 1

    d[score[a]] -= 1
    if d[score[a]] == 0:
        ans -= 1
    score[a] += b
    if score[a] not in d:
        d[score[a]] = 0
    d[score[a]] += 1
    if d[score[a]] == 1:
        ans += 1

    print(ans)
```
# E問題
- 考察と感想
1つを 0,0,0 に固定してそれぞれ$\pm7$ぐらいを全探索すればいいのはすぐに分かったが式の導出に40分ぐらい費やしたうえでTLEしたのでいったんFへ

考察はあっていたがPythonだと計算量を結構削らないと間に合わない
解説にある$[-1, 7]$で回しても間に合わなかったのでmain関数に入れて実行したら間に合った（グローバル変数にアクセスするのに時間がかかるというのを以前見かけたので）


```python:E
def main():
    v = list(map(int, input().split()))
    t = 9
    count = 0
    for A in range(t ** 3):
        a1, b1, c1 = A // t ** 2 - 1, A // t % t - 1, A % t - 1
        for B in range(t ** 3):
            a2, b2, c2 = B // t ** 2 - 1, B // t % t - 1, B % t - 1
            count += 1
            if a2 < a1 and b2 < b1 and c2 < c1:
                continue

            tri = max((min(0, a1, a2) + 7 - max(0, a1, a2)), 0) * max((min(0, b1, b2) + 7 - max(0, b1, b2)), 0) * max(
                (min(0, c1, c2) + 7 - max(0, c1, c2)), 0)

            dub01 = max((min(0, a1) + 7 - max(0, a1)), 0) * max((min(0, b1) + 7 - max(0, b1)), 0) * max(
                (min(0, c1) + 7 - max(0, c1)), 0) - tri
            dub02 = max((min(0, a2) + 7 - max(0, a2)), 0) * max((min(0, b2) + 7 - max(0, b2)), 0) * max(
                (min(0, c2) + 7 - max(0, c2)), 0) - tri
            dub12 = max((min(a1, a2) + 7 - max(a1, a2)), 0) * max((min(b1, b2) + 7 - max(b1, b2)), 0) * max(
                (min(c1, c2) + 7 - max(c1, c2)), 0) - tri

            sol0 = 7 ** 3 - dub01 - dub02 - tri
            sol1 = 7 ** 3 - dub01 - dub12 - tri
            sol2 = 7 ** 3 - dub02 - dub12 - tri

            if v == [sol0 + sol1 + sol2, dub01 + dub02 + dub12, tri]:
                print("Yes")
                print(0, 0, 0, a1, b1, c1, a2, b2, c2)
                exit()

    print("No")


if __name__=="__main__":
    main()
```

# F問題
- 考察と感想
rangeAskのセグ木に「区間内で最大のものの値、←の個数、2番目の値、←の個数」を持たせればいける
と思って実装したけどTLE
記憶デバイスのパスの変更の仕方

# マウントのパスが変わる

SSDやHHDを使っているが、PCの再起動を行うとパスが変わっている
さいあく、、これではマウントに失敗して毎回パスを変更しなければいけない😢
↑この解決方法知りたい

### 私の場合の例
- GTGが元の名前で再起動をしたら数字がついてGTG1になり、その後も数字が増えていき、今はGTG15まで来ました
- この現象がssdでも発生しました
(GTGがHDDの名前、ssdはSSDのこと)

```
$ ls media/hina/
GTG  GTG1  GTG10  GTG11  GTG12  GTG13  GTG14  GTG15  GTG2  GTG3  GTG4  GTG5  GTG6  GTG7  GTG8  GTG9  ssd  ssd1
```

## SSDやHDDのある場所を確認する

↓```root```に移動するコマンド
```
$ cd /
```

ここで```ls```などを使用してSSDやHDDの存在する位置(パス)を確認する

## 目的
今回は```media/hina/ssd1/```これがターゲットとして名前を```ssd1```から```ssd```変更にします

## やり方
1. まずはどのデバイスがどこにマウントされているのか確認

    ↓実行結果の一部
    ```
    $ df -Th
    Filesystem     Type      Size  Used Avail Use% Mounted on
    /dev/sda1      ext4      5.5T  2.2T  3.1T  41% /media/hina/GTG15
    /dev/nvme0n1   ext4      3.6T  608G  2.9T  18% /media/hina/ssd1
    ```

2. 今回はssd1にマウントされているので、これを解除(ディスクのアンマウント)
    ```
    $ unmount "アンマウントしたいディレクトリのパス"

    # 今回の例
    $ umount /media/hina/ssd1/
    ```
3.　```/$ df -Th```でアンマウントされたかを確認
    アンマウントに成功していたら、表示されていないはず

4. 変更したい名前になるようにマウント
    ```
    $ sudo mount "ディスクのパス" "マウントするディレクトリのパス"
    
    # 今回の例
    $ sudo mount /dev/nvme0n1 /media/hina/ssd/
    ```
5. ```df -Th```で希望通りにマウントされていることを確認
    ```
    $ df -Th
    Filesystem     Type      Size  Used Avail Use% Mounted on
    /dev/nvme0n1   ext4      3.6T  608G  2.9T  18% /media/hina/ssd
    ```

### df-Thで出てこないとき
これを実行する
    ```sudo blkid```
これで出てくれば、パソコンにはつながっている(物理的に壊れたとかではない)

マウントだけすればよし

## おわり
お疲れ様です😢
【Tips】AlmaLinux9のVMにてNICが追加できない？

# 概要

**結論、VMに対してNICを追加するとき、VMを必ずシャットダウンさせる。**
参考サイト

https://www.suse.com/ja-jp/support/kb/doc/?id=000019383

- virt-managerから追加する
- cockpitから追加する。
- コマンドで追加する。

の3通りでAlmaLinuxのホストからNICの追加しようとした所、以下の文面が出てNICが追加できなかったという報告があった。
```
ERROR Error attempting device hotplug: internal error: No more available PCI slots
```
しかし自分が手順通りに再現しようとしても、上記のエラー文は出てこなかった。
そこで色々試してみたところ、**VMを起動させたままNICを追加しようとすると、上記の文が表示される事を確認できた。**

## 環境
ホスト：AlmaLinux9.2
ゲスト：AlmaLinux9.3
## cockpitの画面

また、追加できるパターンもあったが、その場合は一時的なネットワークインターフェースの編集は許可されていない旨の表示がされる。また、このNICはVMをシャットダウンすると消えてしまうため、正常なNICの付与ではない事が確認できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/ccb5256d-b21c-2429-2243-b57cd21b32d0.png)


## その後
その後、NICを追加しようとしても上記エラー文の報告はない。
作業当時にVMを起動していたかどうかを確認する明文がなかったため、この事象は作業者がVMをダウンし忘れた可能性が高いという事で落ち着いている。
人工知能業界のトップーChatGPTに関するの基本的なコンセプト

## GPTの由来
* G Generative  【文法と意味の規則を生成する自然言語テキスト】
* P Pre-trained 【大規模なテキストデータに基づく事前トレーニングにより、それをより賢くします】
* T Transformer 【Transformerアーキテクチャを使用して、テキストを順次処理します】

## AI関連の三つの重要なコンセプト
* ChatGPT 【代表的な大規模言語生成モデルの一つ】
* LLM 【Large Language Model 大量のデータトレーニングを経て高品質な人工言語を生成できる神経ネットワークモデル】
* AIGC【Artificial Intelligence Generated Content 人工知能アルゴリズムによって生成されたテキスト、画像など、さまざまなタイプのデジタルコンテンツ】

## ChatGPTの能力には、どのようなものがありますか
- 擬人化し、まるで実際の人間のようにおしゃべりし、さまざまな種類の質問に答えることができます
- 現在の人間の世界のあらゆる分野の知識を理解し、いわば「天文学を知り、地理を知る」に相当します
- 表現力があり、中立的で客観的、安全な言語表現の能力を有しています

## 各世代のGPTのトレーニング量
| OpenAI | 学習資材 | パラメータ数 |
|:-----------|------------:|:------------:|
| GPT1     | 5GB      | 1.17億      |
| GPT2     | 40GB      | 15億       |
| ChatGPT       | 45TB+        | 1750億+         |

## 大規模な生成モデルの方法
- 事前トレーニング：言語モデルに知識と「分割統治法」の問題処理アプローチを組み込むこと
- テンプレート指針：人工でラベル付けされた例を言語モデルに入力する
- 創造性ガイド：ChatGPTに対して最後の創造性ガイドを行う

## ChatGPTを迅速に学習する方法
- ChatGPTを使用して文書やコードを生成し、仕事のタスクを完了することを積極的に試してみてくださ
- AIコミュニティの最新情報に積極的に関心を寄せ、さまざまなAIアプリケーションを体験してみてください
- ChatGPTをシーンに結びつけて使用することはできます。たとえば、ChatGPTを授業アシスタントとして使用することが考えられます。この場面では、以下のような使い方ができます：

1. Q&Aサポート： 学生はChatGPTに質問をすることで、授業内容や宿題、概念に関する回答を得ることができます
2. 概念の説明： ChatGPTは複雑な概念をわかりやすい言葉で説明することができ、学生が授業材料をより理解しやすくします
3. 創造的思考： ChatGPTの生成能力を活かし、学生に創造的な質問を促したり、面白いディスカッションに参加したりすることで、思考を促進します
4. 練習補助： ChatGPTは追加の演習問題や質問回答を提供し、学生が学んだ知識を定着させるのに役立ちます
5. 言語サポート： 学生はChatGPTを使用して文章を向上させ、言語アドバイスを得ることで、表現力を高めることができます
6. 自己学習： ChatGPTを自己学習のツールとして活用し、学生が授業外でも学科サポートを得られるようにします
WebSocketをローカルで試す

仕事でwebsocketを使って試験をする必要があるということで、やり方を事前に調べておこうと思いました。

## ローカルでwsを立ち上げる
* まず、node.jsをインストールしておき、npm install wsにてwebsocketをインストールします
```
// グローバルの場合は-g を付ける
npm install ws
```

* 以下の処理を 例）server.jsとして保存します
```js
const WebSocket = require('ws');

// WebSocketサーバーを作成し、ポート8080でリッスンします
const wss = new WebSocket.Server({ port: 8080 });

// 接続時の処理
wss.on('connection', function connection(ws) {
  console.log('新しいクライアントが接続しました');

  // メッセージを受信した時の処理
  ws.on('message', function incoming(message) {
    console.log('受信したメッセージ: %s', message);

    // メッセージをクライアントに送信
    ws.send('サーバーからのメッセージ: ' + message);
  });

  // クライアントとの接続が切断された時の処理
  ws.on('close', function close() {
    console.log('クライアントが接続を切断しました');
  });
});

```

* ターミナルで以下のコマンドを入力して、サーバーを起動します
```
node server.js
// 当然ですが、cdでserver.jsを配置しているフォルダに移動してから実行する
```

* 以下のサイトでサーバーが立ち上がっているか確認しましょう
https://develop.miugle.info/websocket/

入力欄に「ws://localhost:8080」と入力して、「接続」ボタンをクリックすることで、
接続開始が表示されてから、「接続完了」と表示されればOKです。

## 動作を確認する
* 次にchromeの開発ツールのコンソールなどで以下のソースコードを実行します
```js
const ws = new WebSocket('ws://localhost:8080');

// サーバーからのメッセージを受け取った時の処理
ws.onmessage = function(event) {
  console.log('サーバーからのメッセージ: ', event.data);
};

// サーバーにメッセージを送信
ws.onopen = function(message) {
  ws.send('クライアントからのメッセージ :'+ message);
};
```
* ws.send('aa');をコンソールログで実行することで、サーバー側のログには「受信したメッセージ: aa」と表示されます
* そしてサーバー側では、クライアントから受け取ったメッセージを「サーバーからのメッセージ: ' + クライアントから送られてきたメッセージ」という形で返すようにしていますので、ブラウザのコンソールには「サーバーからのメッセージ:  サーバーからのメッセージ: aa」として出力されます
* コンソールで、ws.close()とすることで、接続が切れて、サーバー側の出力に、「クライアントが接続を切断しました」と表示されます
Pythonで小数点以下の桁数を1行で取得する

Decimalクラスを使用すれば小数点以下の桁数をスマートに取得できます。
```python
from decimal import Decimal
value = 10.1234
print(Decimal(str(value)).as_tuple().exponent) # -4を出力
```

桁数がマイナス値となるので絶対値に変換すれば使いやすい。
```python
from decimal import Decimal
count_decimal_places = lambda value: abs(Decimal(str(value)).as_tuple().exponent)
print(count_decimal_places(10.1234))  # 4を出力
```

#### なぜマイナスか？
Decimalクラスにおけるexponentの値は、数値が標準形式で表された際の10のべき乗を表します。
この場合、10.1234は小数点以下4桁を持っているため、Decimal表現では10の-4乗（つまり、0.0001）を乗じることでこの数値を表します。
【随時更新】VSCodeで作業効率を爆上げするkeyboard shortcuts

VSCodeで開発する際に作業効率を上げるためのshortcutsをまとめていきます。
随時更新予定です。

## サイドバー
**サイドバー開閉**: `cmd + b`
**Explorer選択**: `cmd + shift + E`
**Explorerで移動（上）**: `k`
**Explorerで移動（下）**: `j`
**Explorerからファイル選択**: `o`
**Explorerからファイル選択（タブを新規で作成）**: `l`
**ディレクトリ開閉**: `l`
**Search選択**: `cmd + shift + F`
**Extensions選択**: `cmd + shift + X`
**ファイル名変更**: `Enter`

## エディタ
**開いているファイル選択**: `ctrl + tab`

 ## パネル
 **パネル開閉**: `cmd + j`
 **パネル選択**: `ctrl +  ``
Y-Combinatorでよく寄せられる質問70件

# 問題：

- どのような問題を解決していますか？
- やっていることが終わったら、どのような問題が解決しますか？
- 問題を2つの文で明確に説明できますか？
- 問題を直接経験した経験はありますか？
- この問題を詳しく定義できますか？
- この解決策で誰を最初に助けますか？
- すぐに解決できる問題は何ですか？
- この機能が機能するという最初の兆候をどのように取得できますか？

# 性能:
- 製品の仕組みを理解するために、5〜10の指標を測定していますか？
- 新製品や機能を構築する際に、その機能/製品によって改善できるメトリックは何ですか？
- 会社がどれほどうまくいっているかを示すために、どの数値を追跡しますか？
- 最上位の収益使用量（KPI）は何ですか？
- トップレベルのKPIの達成に貢献する基本的な指標は何ですか？

# 顧客：
- あなたの顧客は誰ですか？
- 理想的な最初の顧客は誰ですか？
- 製品が問題を解決したかどうかはどうすればわかりますか？
- ユーザーにとって問題はどれくらいの頻度で発生しますか？
- 製品で最大の価値を得る人は誰ですか？
- 問題はどれほど深刻ですか？
- 彼らは喜んで支払う意思がありますか？
- お客様が製品をどれだけ簡単に見つけることができますか？
- どの顧客から逃げるべきですか？

# 製品開発：
- 製品開発サイクルはどのくらいですか？
- 製品開発会議でメモを書く人は誰ですか？
- ブレーンストーミングした各アイデアはどのカテゴリに属しますか？
- どのくらい簡単/普通/難しいですか？
- アイデアをどのように再表現しますか？
- アイデアのどの部分が役に立たないまたは難しいか？
- どのアイデアがKPIを最も向上させることができますか？

# 製品:
- 製品は実際に問題を解決していますか？
- 最初にどの顧客を訪れるべきですか？
- 製品の最初のバージョンを喜んで使う人を見つける方法は何ですか？
- 最も切迫した顧客は誰で、どのように話をかけますか？
- あなたの製品がいなかったら中断するビジネスは何ですか？
- 割引または超低価格で開始しますか？

# 出口戦略：
- あなたの出口戦略は何ですか？
- IPO、他社への売却、または経営権の買収（MBO）を検討していますか？
- 選択したExit戦略が会社の価値と創設者の財務結果にどのような影響を与えますか？

# 市場：
- ターゲット市場はどこですか？
- ターゲット市場には製​​品またはサービスが解決できるどんな問題がありますか？
- 目標市場にどのように到達しますか？

# 競争構図：
- 主な競争相手は誰ですか？
- 彼らの強みと弱みは何ですか？
- 彼らの主なマーケティング戦略は何ですか？
- 彼らの価格戦略は何ですか？
- 彼らは市場でどのようにポジショニングしていますか？
- 彼らの成長計画は何ですか？
- あなたの競争の優位性は何ですか？

# 価値提案：
- あなたの価値はどう提案しますか？
- あなたの製品は市場の他の製品とどのように異なりますか？
- あなたの製品で目標市場はどのような利点を経験しますか？
- あなたの価値提案は現実的で達成可能ですか？
- フィードバックを受けるために視聴者を対象にテストしましたか？

# ビジネスモデル：
- ビジネスモデルでどのような問題を解決していますか？
- このモデルのターゲット市場はどこですか？
- どのようにお金を稼ぎますか？
- このモデルの競争構図はどうですか？
- ビジネスをどのように拡張しますか？

# 販売とマーケティング：
- 販売およびマーケティングの目標市場はどこですか？
- ターゲット市場には、製​​品またはサービス販売で解決できる要件がありますか？
- 販売目標市場にどのように到達しますか？
- マーケティングであなたのユニークな販売ポイントは何ですか？
- リードを顧客に切り替えるにはどうすればよいですか？
- 販売とマーケティングの面でビジネスを拡大するための計画は何ですか？
- 販売およびマーケティング予算はいくらですか？

# チーム:
- あなたのチームが世界中の他のどのチームよりも優れているのは何ですか？
- チームが提供する独自のスキルと経験は何ですか？
- これらの強みは、ビジョンを実行するのに役立ちますか？

# 財務見積：
- スタートアップの財務見積はどうですか？
- これらの予測に基づいてどのくらいのお金を調達する必要がありますか？
- 財務上どのくらい速く成長する必要がありますか？
- 予想費用と収益はどれくらいですか？
- どのように収益を出し、収益性を達成しますか？
BashにPowerShellをインストールする方法について

Bash（Ubuntu）にPowerShellをインストールする方法をまとめました。

PowerShellコマンドが使えるか確認します。

```bash
~# pwsh
bash: pwsh: command not found
```

Microsoftリポジトリの公開鍵を追加します。

```bash
wget -q "https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb"
sudo dpkg -i packages-microsoft-prod.deb
```

インストール前にパッケージリストを更新しておきます。

```bash
sudo apt-get update
```

PowerShellをインストールしましょう！

```bash
sudo apt-get install -y powershell
```

`pwsh`コマンドを実行するとPowerShellを起動できます。

```bash
~# pwsh
PowerShell 7.4.1
```

以上でPowerShellをインストールできました。

```PowerShell
PS /root> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      7.4.1
PSEdition                      Core
GitCommitId                    7.4.1
OS                             Ubuntu 22.04.3 LTS
Platform                       Unix
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0
```

## 補足

コマンドがないとエラーが出たときは次のコマンドを実行してください。

```bash
~# wget -q "https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb"
bash: lsb_release: command not found
bash: wget: command not found
```

パッケージリストを更新します。

```bash
~# sudo apt-get update
Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Hit:2 http://security.ubuntu.com/ubuntu jammy-security InRelease
Hit:3 http://archive.ubuntu.com/ubuntu jammy-updates InRelease
Hit:4 http://archive.ubuntu.com/ubuntu jammy-backports InRelease
Reading package lists... Done
```

`wget`コマンドをインストールします。
ファイルをインストールするコマンドラインです。

```
~# sudo apt-get install -y wget
Reading package lists... Done
...
```

`lsb-release`コマンドをインストールします。


```
~# sudo apt-get install -y lsb-release
Reading package lists... Done
```

以上でコマンドが実行できるようになります。
理想と現実の差に絶賛苦悩中のエンジニア２年目

# 目次
[１. はじめに](#1-はじめに)
[２. 自己紹介](#2-自己紹介)
[３. 理想と現実](#3-理想と現実)
[４. 転職活動](#4-転職活動)
[５. 今後について](#5-今後について)
[６. おわりに](#6-おわりに)

# 1. はじめに
本記事を読んでいただき、ありがとうございます。
記事中には、個人の意見が含まれています。
たまに毒のある表現が出てくるかもしれません。
苦手な方は、途中で読むのを止めて、深呼吸して、また戻ってきて下さい。

# 2. 自己紹介
システムエンジニア２年目のヤマネコと申します。
国立大学の情報系の学科を卒業して、現在勤めている会社に新卒で入社しました。
一応大手企業に分類されるところで、SIerです。
誰もが知る有名企業、とかじゃないです。

エンジニアとしてのスペックですが、スーパー凡人です。

**◼︎大学時代**
**・C, Java**
大学の授業で勉強しました。

**・HTML, CSS, JavaScript, Ruby(Rails)** 
Progate, Rails Tutorialとかで独学してました。
Railsでポートフォリオを作って就活でアピールしようとしたのですが、8割くらいのデータが消えてしまって、結局復元できずに終わりました。
かなりヘコみました。まずGitから勉強すべきでしたね。

**・Python**
卒論が強化学習に関する内容だったので、勉強しながら実装してました。

**◼︎現在**
**・Java, SQL, COBOL(笑)**
実務ではSQLを書くことが多いです。Javaはたまに。COBOL(笑)を書くことはほぼないですが、ソースを見ることはあります。母親にこのことを伝えたら、懐かしっ！って言われました。ですよね〜。~~今更覚えてどうすんねん。~~

**・Next.js(TypeScript)**
→ 個人開発しながら勉強してます。難しいけど楽しい。

# 3. 理想と現実
ここから、タイトルにもある「理想と現実」について、それぞれ話したいと思います。
<br>

**◼︎理想**
がっつりプログラミング。Web系。チームで試行錯誤して開発。服装はラフ寄り。

**◼︎現実**
ドキュメント作成多すぎ。テスト結果Excelペタペタ。上流工程多めで開発はBPさんが担当。ビジネスカジュアルとかいうほぼスーツ。ほぼ顧客折衝業。楽しくない。
<br>

理想の内容を全て満たした会社でないとダメ、
というわけではないですが、それにしてもかけ離れてます。
正直、大学で学んだCS知識を少しも活かせていないため、
「何のために大学行ったんだろう」って思うこともありますね。

就活では、なるべく大きい企業の方が、経営が安定していて、福利厚生も充実していることが多いと思ったので、今の会社を選びましたが、もし就活をやり直すなら得られる経験やビジネスモデル（自社開発をしているかどうかなど）を重視しておけばよかったと思います。


# 4. 転職活動
上記のような不満タラタラだったので、1年目の2月くらいに転職活動をしました。
以下の~~ポスト~~ツイートを見ていただきたいのですが、結局辞退してます。
今よりは遥かに理想に近かったので、承諾してたらよかったかな。とかも思いますね。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">最近、転職活動してWeb系自社&amp;受託開発企業から1社内定いただいたのですが辞退しました。<br>モダンな言語が使える環境ではあったんですけど、<br>「試用期間6ヶ月&amp;その期間は契約社員」<br>という条件でした。<br><br>皆さんならどうします？<a href="https://twitter.com/hashtag/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#エンジニアと繋がりたい</a> <a href="https://twitter.com/hashtag/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%88%9D%E5%BF%83%E8%80%85%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#プログラミング初心者と繋がりたい</a></p>&mdash; ヤマネコ (@yamaneko8699) <a href="https://twitter.com/yamaneko8699/status/1647382996423675905?ref_src=twsrc%5Etfw">April 15, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<br>
2月に転勤で別の支社に移動したばかりなので、流石に今は転職は憚られますが、これからの業務内容によっては転職するつもりです。

引越し代や家賃の半分以上を負担してもらってますが、普通に辞めてやります。
（福利厚生はとても良い会社です。助かってます。）

長くいてもレガシー環境で塩漬けになるだけですからね。
茹でガエルになってからでは遅いです。

# 5. 今後について
重複になりますが、もう少し時間が経ってから転職活動をしようと思います。
とは言え、30代になってしまうと、それなりの経験がないと転職できないと思うので、
ポテンシャル、第二新卒のうちに頑張ろうと思います。。

# 6. おわりに
ここまで見ていただき、ありがとうございました。

最後に、絶対同僚はこの記事を見てないと思うので言います。
「これから頑張ろうね」「○○さん、これから期待してるよ。」「○○支社を盛り上げていこう！」とか言われると会社に情が湧いてしまうのでやめて下さいませ。

以上です。
私的 Serverless Framework ベストプラクティス

[Serverless Framework](https://www.serverless.com/framework)の設定で、新しいプロダクトを作るときやレビューするときに気をつけたい点をまとめました。

他の方のベストプラクティスも知りたいです！ ぜひコメントや記事公開してください。

## Serverless Frameworkもpackage.jsonに入れておこう

CLIですがグローバルインストールしないで、ちゃんとpackage.jsonでバージョン管理するようにしましょう。

```bash
npm install -D serverless
```

バージョンの違いで動かなった経験、何度かあります。

## ログの設定をしよう

ログの設定はしっかりしておきましょう。

```yml
provider:
  logRetentionInDays: 14  # ログ保持期間
  tracing:  # x-rayトレースを採る
    apiGateway: true
    lambda: true
```

おまじないだと思って定型文的に入れています。

## ゴミを残さない設定をしておこう

自動的に作られるデプロイメントバケットですが、気がついたら大量にできてたりします。アカウントで1つあれば十分なので、あらかじめバケットを作っておいて、以下のように既存バケットを使う設定にしておくのがおすすめです。

```yml
provider:
  deploymentBucket:
    # デプロイファイルの置き場に既存バケットcom.serverless.000000000.deploysを使用
    name: com.serverless.${aws:accountId}.deploys
```

同じく、Lambdaのバージョン管理もオフで良いと思います。これが有効だとAWS管理コンソールからLambdaを古いバージョンに切り替えができるのですが、正直この機能を使ったことはないありません。レポジトリの状況とデプロイしているものが乖離するので使わない方が良いと思います。むしろ、このバージョン管理が原因でLambdaコードストレージ（[Lambda クォータ](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/gettingstarted-limits.html)）のサイズ制限に引っかかってデプロイの妨げになることが多かったり[^1]。

[^1]: Lambdaのバージョン管理を使いたい場合は[Serverless Prune Plugin](https://www.serverless.com/plugins/serverless-prune-plugin)というのがあるので、そちらを導入すると良いでしょう。

```yml
provider:
  versionFunctions: false
```

## 権限は必要最低限にしよう

権限は必要最低限のものを与えましょう。

:::note alert
悪い例
:::

```yml
provider:
  iam:
    role:
      statements:
        - Effect: Allow
          Action:
            - s3:ListBucket
          Resource:
            - arn:aws:s3:::*
```

:::note info
良い例
:::

```yml
provider:
  iam:
    role:
      statements:
        - Effect: Allow
          Action:
            - s3:ListBucket
          Resource:
            - arn:aws:s3:::my-example-bucket
            - ${cf:myStack.bucketName}
```

より細かく設定したい場合、[Serverless IAM Roles Per Function](https://www.serverless.com/plugins/serverless-iam-roles-per-function)を導入するとよいかもしれません。

## データ層はResourcesに含めない

Serverless.ymlの `Resources` ブロックは実質的にCloudFormationテンプレートなので、AWSのリソースならおおよそ何でも作れてしまいます。「やったー！ IaCだー！」と何でもかんでもここに突っ込みたくなるところですが、 S3, DynamoDB, Cognito等々の「データ層」のリソースを記述するのはおすすめしません。こういったものについては serverless.ymlとは独立してCloudFormationテンプレートを用意しましょう。

理由は、いつかは `sls deploy` がコケて、どうしても `sls remove` せざるを得ない状況が訪れるからです[^2]。そうなるとせっかくデータを突っ込んだリソースが消すか、或いは次のデプロイがリソースの重複でコケるかの二択になってしまいます。

[^2]: 正確にはServerless Frameworkがコケるというより、 `Resources` が原因でコケるケースが大半です。CloudFrontのリソースは割とトラブルが起きやすい印象です。なんにせよ「ないことはない」、いつかは起きる可能性がある事象と覚悟しておいたほうがいいでしょう。

データ層だけのCloudFormationスタックを別に用意しておけば、 `sls remove` するときも安心ですし、同じデータ層を参照するやつを２つデプロイして先行リリース環境を作ったりBlue-Green Deploymentだったりといったこともできます。ポイントはステージ名(`--stage hoge`)だけ変更すればいくらでも複製をデプロイしてすぐ使える状況を作っておくことだと思っています。 

`${cf:stackName.outputKey}` で他のスタックのアウトプットを参照できることも活用しましょう。
ブラウザ間の相互互換性を向上させるinteropプロジェクトについて

# 1. 背景

https://ics.media/entry/231120/

こちらの本を読んだ際に [interopプロジェクト](https://wpt.fyi/interop-2024?stable) を知った為です。

can i useとの関係性にも触れたいと思います。

# 2. interopプロジェクトとは

https://wpt.fyi/interop-2024?stable

ウェブの相互運用性を向上させるためのクロスブラウザの取り組みです。
2021年から毎年行われています。

## 2.1. Scoreの見方

### Active Focus Areas

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405182/5722bf79-227d-0680-9813-eb43586a7708.png)

一連の自動テストをし、Focus Areaにおけるウェブ標準への適合性を評価します。
「Active Focus Areas」のスコアは、テストの合格率に基づいて算出されます。
これらのテストの結果は、特定のテストのリストにリンクされた表に記載されています。
「Interop」の列は、すべてのブラウザで合格したテストの割合を表し、総合的な相互運用性を評価します。

### Active Investigations

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405182/37043551-1317-435e-27bc-b4b0eaba8633.png)

Investigation プロジェクトは、Interop チームによって選ばれたグループプロジェクトです。
特に厄介な問題について、ウェブ標準やウェブプラットフォームテストのコミュニティを前進させる作業を行います。
「Active Investigations」のパーセンテージは、プロジェクトの目標に対する進捗を表しています。
プロジェクトのタイトルは、作業が行われている Git リポジトリにリンクしています。詳細は課題をお読みください。

### Dashboard
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405182/d09be278-e628-4145-b4f8-dc969973f068.png)

こちらはActive Focus Areas、INVESTIGATIONSともにtotalスコアは表示しています。

Stableは安定版のブラウザ
Experimentalは試験運用版のブラウザです。

## 3. can i use との関連

後続の3.1で説明しますが、interopプロジェクトとBCDプロジェクトは直接的な関係性はないことがわかりました。

## 3.1. can i use とは
https://caniuse.com/

can i useはHTML,CSS,JavaScriptなどの機能についてどのブラウザ、バージョンでサポートされているかを確認できるサイトです。
can i useは[「browser-compat-data」プロジェクト]()のデータを使用しています。

 テストはBrowserStackで行われています。
 
 https://www.browserstack.com/?ref=caniuse-source&caniuse_source=brand-asset

### browser-compat-data (BCD) プロジェクト

https://github.com/mdn/browser-compat-data?tab=readme-ov-file#mdnbrowser-compat-data

ウェブAPI、JavaScript機能、CSSプロパティなど、ウェブ技術のための機械可読ブラウザ（およびJavaScriptランタイム）互換性データを含んでいます。
ウェブ開発者がクロスブラウザ互換のウェブサイトを簡単に書けるように、ウェブ技術の正確な互換性データを文書化することを目指しています。
BCDは、MDN Web Docs、CanIUse、Visual Studio Code、WebStormなどのWebアプリケーションやソフトウェアで使用されています。

## 3.2. can i use とinteropプロジェクトサイトの使い分け（個人的見解）
以下で考えていますが、違いましたらご指摘お待ちしております。

- interop
    今年、どの機能がクロスブラウザの相互互換に向けて重点的に取り組みがされるのかの動向のチェック

- can i use
    ある機能についてのクロスブラウザの相互互換性、特定のブラウザ、バージョンの対応状況のチェック

# 4. その他
## MDNでも最新のブラウザバージョンでのサポート状況を確認できます。

https://developer.mozilla.org/en-US/docs/Web/CSS/:has#browser_compatibility

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405182/ce25e248-2f77-d098-af7a-e6dae60e4ddf.png)

表示されている表からはIEの対応状況は分かりません。

3.1でも述べましたが、BCDプロジェクトのデータが使われているそうです。
詳細は[こちら](https://developer.mozilla.org/en-US/docs/MDN/Writing_guidelines/Page_structures/Compatibility_tables)

# 5. 参考
- [ウェブブラウザの相互運用性を改善する「Interop」プロジェクトとはどんなものなのか？](https://gigazine.net/news/20240205-interop/)
- [Interop 2024  |  Blog  |  web.dev](https://web.dev/blog/interop-2024)

# 6. 最後に
- interopプロジェクト、BCDプロジェクトと複数プロジェクトがあり困惑しましたが、[web標準](https://developer.mozilla.org/ja/docs/Learn/Getting_started_with_the_web/The_web_and_web_standards#%E3%82%A6%E3%82%A7%E3%83%96%E6%A8%99%E6%BA%96)に向けた取り組みをしている点では共通していると思いました
改めて製作中音ゲーの案を出したい(備忘録)

# はじめに
頭の中に理想があっても、それでは新たなアイデアに繋がりにくい...今更ですが、とりあえず頭にあること書き出します。音ゲーの案が欲しかったりする方は参考にしてください。~~私にそんな画期的なアイデアを思い付く才能は無いのですが。~~
少しずつ更新していきます(多分)

## テーマ
宇宙。これは固定。

## イメージ
レーンがない(内部的には21レーン)ところにノーツが降ってくる音ゲー。基本奥から手前に降らす。空中に降らすかは未定。

## ノーツ
ノーツのデータはDictionaryで管理することにしました。

・タップノーツ　
　普通に叩くやつ。
 
・ロングノーツ
　レーン跨いだり曲線にしたりできるようなやつ。持ち替え許容
　~~List<List<LongData>> みたいな感じにしてロングノーツの始点から終点までひとまとまりにして判定したい。~~
 
・トレースノーツ
　降ってきた時に判定線に触れてれば良いやつ。
  リストのソート忘れずに。.OrderBy

・フリックノーツ
 　降ってきた時に擦れば良いやつ。

ロングノーツ以外は判定線と平行に移動できるように、また判定線の手前から判定線に降らせられるように。見た目だけで叩かなくて良いものも追加←演出に

## 難易度
・Nebula(低)
・Stardust(中)
・Cosmic(高)
・Quantum(超高　一部楽曲のみ)

## 判定
miss, bad, great, perfect
名前は変える

## メモ
~~3DPhigrosみたいにしたい~~
AWS CLF 入門 - モニタリング編

## はじめに
AWS CLF (AWS Certified Cloud Practitioner) を取得した際の学習記録をアウトプットとして以下に記す。

## リンク
[ネットワーク](https://qiita.com/yashiuri/items/31b2c9c3c49c2584cd01)
[セキュリティ](https://qiita.com/yashiuri01/items/73e5310b09ff41912862)
[コンピューティング](https://qiita.com/yashiuri01/items/9eaf71a1590e7815f9ef)
[コンテナ](https://qiita.com/yashiuri01/items/708b57ee179ae29e72a9)
[スケーリング](https://qiita.com/yashiuri01/items/79050093aff66b0f0665)
[ストレージ](https://qiita.com/yashiuri01/items/6d48d81f5a1651dcc999) 
[データベース](https://qiita.com/yashiuri01/items/159ea63b197f7a836d1c)
[メッセージ](https://qiita.com/yashiuri01/items/d98772b540ef2201c4e2)
[モニタリング](https://qiita.com/yashiuri01/items/64f6dbf38603cdb4828a)
[デプロイ](https://qiita.com/yashiuri01/items/85151311897d6afd429c)
[コストとサポート](https://qiita.com/yashiuri01/items/bac23130a43d62677330)
[移行とイノーベーション](https://qiita.com/yashiuri01/items/6e327034a7c50d56ca88)
[AWS用語集](https://qiita.com/yashiuri01/items/bd36c99623ca596b76e4)


## モニタリング
### **Amazon CloudWatch**

- メトリクスの監視及び管理、アラームアクションの設定
- パフォーマンスのモニタリング
    - AWSリソースやAPPから受信したメトリクス(監視対象データ)から自動的にグラフを作成
- Amazon SNSと統合
- CloudWatch アラーム
    - 設定したトリガーに従った通知の送信
    - 定義したルールに基づき自動的に変更
- CloudWatch ダッシュボード
    - 1 つの場所からリソースのすべてのメトリクスにアクセス可能
- メリット
    - 一元的な場所から全てのメトリクスにアクセスできる
    - APP、インフラ、サービスを可視化できる
    - MTTR(Mean Time To Recovery)を短縮し、TCO(Total Cost of Ownership)を改善する
    - アプリケーションと運用リソースの最適化に役立つインサイトを引き出す
- 使用例
    - コストがしきい値を超えた場合にトリガーされる請求アラームが設定できる

### **AWS CloudTrail**

- 全てのアプリケーションとリソースに対するユーザーアクティビティと API コールの履歴全体を確認
    - API コール元の ID
    - API コールの時刻
    - API コール元のソース IP アドレス
- 監査に役立つ
- ログファイル
    - S3バケットへ、記録されたAWS APIコールまたは他のAWSイベントから15分以内に保存
    - サーバー側の暗号化SSE-S3を使用して暗号化 or KMSでのサーバー側暗号化SSE-KMSを使用して暗号化
- AWS CloudTrailイベントでは以下が確認できる
    - 何が起きたか
    - 誰がリクエストを行ったか
    - いつ発生したか
    - どのようにリクエストが作成されたか
- AWS CloudTrail Insights
    - AWS アカウントの異常な API アクティビティを自動的に検出

### **AWS Trusted Advisor**

- AWS 環境を検査し、AWS のベストプラクティスに基づいてリアルタイムの推奨事項を提供
- 5 つのカテゴリにおいて、調査結果を AWS のベストプラクティスと比較
    - コスト最適化 (Cost Optimization)
    - パフォーマンス (Performance)
    - セキュリティ (Security)
    - 耐障害性 (Fault Tolerance)
    - サービスの制限 (Service Limits)
- ダッシュボードでの各カテゴリ
    - 緑のチェックマーク - **問題が検出されなかった**項目
    - オレンジの三角形 - 推奨される**調査**
    - 赤の丸 - 推奨される**アクション**
YOLOv9とDeepSORTを使って物体を追跡してみた

先月、物体検出の分野において、最新のSOTAモデルであるYOLOv9が公開されました。このモデルは、物体検出タスクにおいて優れた性能を発揮することが期待されています。本記事では、YOLOv9とオブジェクトトラッキングの手法であるDeepSORTを組み合わせて物体追跡を行う方法について紹介します。

# 概要
オブジェクトトラッキングは、動画や画像内の物体を時間の経過に沿って追跡する技術です。この技術は、監視カメラの映像分析や自動運転などさまざまな応用分野で利用されています。物体を追跡するためには、まず物体を検出し、その後に物体の動きを追跡する必要があります。

# 物体追跡モデル：DeepSORT
DeepSORTは、オブジェクトトラッキングの分野において非常に人気があり、広く利用されているフレームワークの一つです。検出モデルで検出した物体に対して、ID付与や軌跡推定を行うことで、スムーズな追跡を実現します。

# YOLOv9とDeepSORTでリアルタイム物体追跡
## 環境の準備
必要なリポジトリをダウンロードする。
```
 git clone https://github.com/sujanshresstha/YOLOv9_DeepSORT.git
 cd YOLOv9_DeepSORT
```
## 新しい仮想環境を作成
* Condaを使用する場合:
    ```
    conda env create -f conda.yml
    conda activate yolov9-deepsort
    ```
* pipを使用する場合:
    ```
    python3 -m virtualenv -p python3.11 yolov9-deepsort
    source yolov9-deepsort/bin/activate
    pip install -r requirements.txt
    ```
## 必要なリポジトリとライブラリをダウンロード
```
 git clone https://github.com/WongKinYiu/yolov9.git
 cd yolov9
 pip install -r requirements.txt
```
## YOLOv9モデルの重みをダウンロード
```
 mkdir weights
 wget -P weights https://github.com/WongKinYiu/yolov9/releases/download/v0.1/yolov9-e.pt
```
## 物体を追跡してみましょう。
事前にデモを行う動画を用意します。今回デモ用の動画は./data/test.mp4で出力動画のパスは./output/output.mp4にしました。
```
 python object_tracking.py --video ./data/test.mp4 --output ./output/output.mp4
```

## デモ
![cars2-ezgif.com-video-to-gif-converter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718204/4fd3def2-2ac2-22f5-e05b-80f0c0665d1f.gif)




## その他使用方法

### ビデオファイルの準備:

- ビデオファイルを適切な場所に配置します
- ビデオファイルのパスを更新するか、0に設定してウェブカメラを入力として使用します

### YOLOv9モデルのダウンロード:

- (YOLOv9-S/YOLOv9-M/[YOLOv9-C](https://github.com/WongKinYiu/yolov9/releases/download/v0.1/yolov9-c-converted.pt)/[YOLOv9-E](https://github.com/WongKinYiu/yolov9/releases/download/v0.1/yolov9-e-converted.pt))

### 出力ビデオの設定:

- コード内のoutputフラグを更新して、出力ビデオファイルのパスとファイル名を指定します

### confの閾値の設定:

- オブジェクト検出のconfidenceの閾値を設定するために、confフラグを調整します。この閾値以下の信頼度を持つオブジェクトはフィルタリングされます

### 特定のオブジェクトの検出と追跡:

- コード内のclass_idフラグを変更して、検出のためのクラスIDを指定します。フラグのデフォルト値はNoneに設定されています。人物のみを検出して追跡する場合は、0に設定するか、他のオプションについてはcoco.namesファイルを参照してください

### 特定のオブジェクトの追跡中のぼかし:

- コード内のblur_idフラグを変更して、検出のためのクラスIDを指定します。フラグのデフォルト値はNoneに設定されています

### コードの実行:

```
# オブジェクト追跡の実行
python object_tracking.py --video ./data/test.mp4 --output ./output/output.mp4

# ウェブカメラでオブジェクト追跡の実行 (videoフラグを0に設定)
python object_tracking.py --video 0 --output ./output/webcam.mp4

# 人物の追跡の実行 (class_idフラグを0に設定)
python object_tracking.py --video ./data/test.mp4 --output ./output/output.mp4 --class_id 0

# 特定のオブジェクトをぼかしながらビデオの追跡の実行 (blur_idフラグを0に設定)
python object_tracking.py --video ./data/test.mp4 --output ./output/output.mp4 --blur_id 0
```
## コードリポジトリ
https://github.com/sujanshresstha/YOLOv9_DeepSORT
# まとめ

最後までご覧いただきありがとうございました。
2024年2月に公開されたYOLOシリーズの最新バージョンである「YOLOv9」と「DeepSORT」を用いて物体追跡を試してみました。
CTF初心者によるCpawCTF Writeup Q16

# 問題
16.[Network+Forensic]HTTP Traffic
100pt

HTTPはWebページを閲覧する時に使われるネットワークプロトコルである。
ここに、とあるWebページを見た時のパケットキャプチャファイルがある。
このファイルから、見ていたページを復元して欲しい。

# 解いてみる

　とりあえず与えられたファイルをWiresharkで見てみる．
 
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1144372/9d874eb1-5f16-9ef0-2282-79d54c371e2b.png)

 HTTPでフィルタリングしてみる．

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1144372/70c6a0c4-02ae-5017-9bce-ce0c3a35f979.png)

GETリクエストの項目を見ればURLを得られると予想．
　⇒Request URIを取得([Request URI: http://192.168.75.136/network100/])
　⇒打ち込むがアクセスできない

 パケットキャプチャについて調べるとオブジェクトファイルを保存することができると判明⇒httpでフィルタリングして保存
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1144372/47e67bdb-badd-dbc1-106b-ee27f9946764.png)

network100(1)に拡張子をつけて表示するもボタンが表示されない⇒htmlファイルの通りにjs等を配置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1144372/fd6c8095-424c-3412-00c3-163af257c88a.png)

無事フラグを得られたので終了 cpaw{Y0u_r3st0r3d_7his_p4ge}

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1144372/d9f7c83f-0a33-a235-113a-dbb156270d7d.png)

#得られた知見
・Wiresharkのエクスポート機能
gitでfetchとpushを別リポジトリに設定

### 背景
外部ツールの更新をfetchしつつ、カスタマイズした内容を自分のリポジトリにpushしたかった（手軽に）

### ローカルリポジトリを作成
任意のリポジトリを作成、またはclone
```sh
git clone https://github.com/hoge/fuga
```
もし`shallow clone`している場合は以下で全体を取得
```sh
git fetch --unshallow
```

### リモートリポジトリを確認
```sh
git remote -v
```
```sh
>>> origin  https://github.com/hoge/fuga (fetch)
>>> origin  https://github.com/hoge/fuga (push)
```
この段階ではfetchとpushで同一のurlが設定されているため、push先を別urlに設定する

### push先を別リポジトリに設定
```sh
git remote set-url --push origin https://github.com/piyo
```
### リモートリポジトリを再度確認
```sh
git remote -v
```
```sh
>>> origin  https://github.com/hoge/fuga (fetch)
>>> origin  https://github.com/piyo (push)
```
これで簡単にfetchとpushができるようになった
```sh
git fetch
git push
```

### 番外（remoteコマンドのオプション）
`git remote --help`で見られる
```sh
       git remote [-v | --verbose]
       git remote add [-t <branch>] [-m <master>] [-f] [--[no-]tags] [--mirror=<fetch|push>] <name> <url>
       git remote rename <old> <new>
       git remote remove <name>
       git remote set-head <name> (-a | --auto | -d | --delete | <branch>)
       git remote set-branches [--add] <name> <branch>...
       git remote get-url [--push] [--all] <name>
       git remote set-url [--push] <name> <newurl> [<oldurl>]
       git remote set-url --add [--push] <name> <newurl>
       git remote set-url --delete [--push] <name> <url>
       git remote [-v | --verbose] show [-n] <name>...
       git remote prune [-n | --dry-run] <name>...
       git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]
```
#### TODO
`git remote`コマンドのオプションの詳細説明
【時短術】知らなかったショートカット②(Macの基本ショートカット）



## はじめに
「コード入力する時間を早くするためのショートカット」
第二弾です。
Macでのショートカットも数多くあった。

## 🦁<INS>**結論**</INS>🦁
時間短縮に繋がりそうなショートカットは、まだまだある。
身につけなければいけないことは山ほどある。

## <INS>**一覧**</INS>

## <INS>**新規ファイル作成**</INS>
「cmd + N」

***  

## <INS>**名前をつけて保存**</INS>
「cmd + shift + S」

***  

## <INS>**ファイルを開く**</INS>
「cmd + O」

***  

## <INS>**新規ウィンドウを開く**</INS>
「cmd + shift + N」

***  

## <INS>**アプリケーションの切り替え**</INS>
「cmd + TAB」

***  

## <INS>**アプリケーションを閉じる**</INS>
「cmd + Q」

***  

## <INS>**Mac Spotlight**</INS>
「cmd + space」

***  

## <INS>**関数単語の先頭へ移動**</INS>
「opt + ←」

***  


## <INS>**単語の後尾へ移動**</INS>
「opt + →」

***  


## <INS>**選択**</INS>
「shift + 方向キー」

***  

## <INS>**行を選択**</INS>
「cmd + shift + 方向キー」

***  

## <INS>**単語単位で選択**</INS>
「opt + shift + 左右キー」

***  

## <INS>**一つ後の状態に戻す**</INS>
「cmd + shift + Z」

***  

## <INS>**一つ後の状態に戻す**</INS>
「cmd + shift + Z」

***  

## <INS>**一つ後の状態に戻す**</INS>
「cmd + shift + Z」

***  

## まとめ✍️
直近でも使ったが快適すぎる。
どんどん使って生産性を少しでも上げられるようにものにする。

***  
## 参考にした記事📕
[プログラミング始めるなら必須のショートカットキー72選](https://youtu.be/wf-8HkfMckM?si=TZ0yVhBGpt4mRd5G
before_actionにindexを指定してはいけない

# 初めに
削除機能の実装でエラーに遭遇したので書きます。

# 問題
削除ボタンを押したときに、`Couldn't find Template without an ID`  が起きました。

# 解決方法
before_actionにindexアクションを指定していたので削除しました。

```ruby
# before_action :set_template, only: [:index, :edit, :update, :destroy]
before_action :set_template, only: [:edit, :update, :destroy]

def set_template
    company   = Company.find(params[:company_id])
    @template = company.templates.find(params[:id])
end
```

set_template で何をしているか？

インスタンス変数 @template に /company_id/templates/id を代入して、template個別のidを取得している。

- ターミナルログ

/admin/companies/2/templates（一覧ページ）
Parameters: {"company_id"=>"2"}　

→ idが取得できていない。一覧ページは template個別のidを取得してくる必要が無いからindexを指定しなくていい。

# 終わりに

ターミナルのログを見て解決できることを学びました。
AWS Systems Managerのパラメータストアってなんだっけ

https://qiita.com/naritomo08/items/6e38955145d80c1435bd
この記事を参考にしながらRDSインスタンス作ってたら以下のような記述があった

```
＊DB起動時に実施すること。
aws rds modify-db-instance \
--db-instance-identifier "example-prod-foobar" \
--master-user-password "Passw0rd"

＊以下のコマンドは初期構築のみでよい。
aws ssm put-parameter \
--name "/example/prod/foobar/DB_PASSWORD" \
--type "SecureString" \
--value "Passw0rd"
```

ssmってなんだったっけ？と思い出すために調べてみた結果、こんな用途で使えるらしい。

> AWS Systems Manager パラメータストアは、パスワードなどの機密情報を安全に保管するために使用できます。

> パラメータストアは、AWS Elemental MediaLive で広く使用されています。外部でファイルを取得して保存できるように、ストアは MediaLive に必要なパスワードを保持しています。﻿

> パラメータストアは、データベースの文字列、パスワード、マシンイメージ、ライセンスコードといったデータをパラメータ化し、一元的に管理します。コードからデータを分離してセキュリティ性を高めたり、タグや階層を用いてデータ整理をしたりできます。﻿

> AWS Secrets Manager は、これらの認証情報の安全な管理、さらには API トークン、パスワード、およびその他の認証情報の保管、使用、ローテーション専用です
【AWS】Route 53に外部レジストラで登録したドメインを設定する

# 背景

最近はおうちKubernetesにハマっていて、MetalLBやNginx Ingress Controllerも導入したので、次はカスタムドメインの設定だ！ということでRoute 53に手を出しAWSデビューした次第です。

今回はクラスタに接続する部分は記事のスコープ外で、あくまでも外部ドメインの設定という箇所に絞って進めていきます。

私のドメインはGandi.netで登録していますが、お名前ドットコムやムームードメインなど別のレジストラでも同様に設定できると思います（要出典）

※今回はインターネット経由での名前解決を想定しているため、Hosted zoneはPublicの設定になります。

# Hosted zone(ホストゾーン)の作成

1. AWSのポータルにログインしRoute 53を開く
1. 左のサイドメニューからHosted zonesを開く
1. Created hosted zoneのボタンを押す
1. Domain nameに自分のドメイン（サブドメインなし）を入力する
1. Public hosted zoneを選択
1. Create hosted zoneを押してホストゾーンを作成する

# ネームサーバの設定

1. 再びHosted zonesを開いて、前の手順で登録したドメインをクリックする
1. レコード一覧にNSと書かれた行があるので、そこの値（`ns-***.awsdns-***.com.`のような雰囲気のやつ）4つをコピーしてVS Codeなどに貼り付けておく
1. レジストラのドメイン設定画面を開く
1. レジストラ側に外部ネームサーバの設定項目があるので、そこへ上でコピーした4件の値を設定する

# (Optional) サブドメインの設定

1. Hosted zonesの画面で自分のドメインをクリックする
1. Create recordボタンを押して、サブドメインをAレコードとして登録する。値には接続したいサーバのIPアドレスなどを設定する

# 確認作業

※DNSの情報が反映されるまで少々長めの時間がかかります。半日とか1日と言われることもありますが、私の場合は2時間程度で反映が確認できました。

`dig ドメイン名`

を実行して、Route 53から設定したIPアドレスを確認できればOK！
[Spring Boot]GracefulShutdown調査メモ

## GracefulShutdownとは
ざっくりいうとアプリ停止の際に安全に正常終了する仕組みのこと。
リクエストの受付を停止して、処理中のプロセスが完全に終わるまで待ってからアプリを終了する。
リリースの際のデプロイ、Kubernetesのローリングアップデートの場面等で活用。

Spring Boot 2.3以降、[GracefulShutdownが公式で追加](https://spring.io/blog/2020/05/15/spring-boot-2-3-0-available-now)された。

> Graceful shutdown is supported with all four embedded web servers (Jetty, Reactor Netty, Tomcat, and Undertow) and with both reactive and Servlet-based web applications. When a grace period is configured, upon shutdown, the web server will no longer permit new requests and will wait for up to the grace period for active requests to complete.

[公式リファレンス](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#web.graceful-shutdown)
Tomcat利用する場合はバージョン9.0.33以降が必要。

## 設定

application.ymlに以下を追加

```application.yml
server:
  shutdown: graceful
  
spring:
  lifecycle:
    timeout-per-shutdown-phase: 20s #停止までの猶予期間。デフォルトは30s。
```

## 検証
検証用にヘルスチェックにスリープ処理(重い処理の再現)を入れる。
```java
Thread.sleep(10*1000L);
```

上記ヘルスチェックのエンドポイントリクエスト中にシャットダウン。
（今回は[actuator](https://spring.pleiades.io/spring-boot/docs/current/reference/html/actuator.html)の機能で終了させたけどkubectlコマンドでもいいと思う）

```
# コンテナに入る
$ kubectl exec -it ポッド名 -c コンテナ名 -- /bin/bash
 
# シャットダウン
$ curl  -X POST localhost:9090/actuator/shutdown
{"message":"Shutting down, bye..."}
bash-4.2# command terminated with exit code 137 # コンテナから追い出された

# pod確認 → 再起動されてる
$ kubectl get pods
my-pod        2/2     Running   1 (4m50s ago)   67m
```

ヘルスチェックも時間経過後、問題なくレスポンスが返る。
```
{"status":"UP"}
```

ちなみにGracefulShutdownを使用しない状態で同じことをやると502エラーが返る。

```
502 Bad Gateway
```

## 参考
https://zenn.dev/empenguin/articles/c24489ee5241ac
AlfredからChatGPTと会話する

:::note
* `2024/09/05 更新` ChatGPTがドメイン変更していたのですが、いつのまにかクエリパラメータが引き継がれなくなっていたので、URL修正しました
* `2024/11/21` これの進化版の記事書きました。こちらの方が便利だと思います。
[Alfredのデフォルト検索をChatGPTにしたらめっちゃ捗った話](https://qiita.com/zeero/items/9e1eec33c452d405364c)
:::

[Alfred](https://www.alfredapp.com/)からChatGPTに質問投げるのめちゃくちゃ簡単だったのでメモ。

Web Searchで一発だった。

`Alfred Preference` > `Features` > `Web Search` > `Add Custom Search` で `Search URL` のところに以下を設定。

```
https://chatgpt.com/?q={query}
```

こんなパラメータあったのね。

これでわいのChrome固定タブが一つ潰せた :joy:
Honkitで静的サイト生成してみました

# Honkitでホムペつくってみました

いままで、どこかで拾ってきたCSSファイルとタグのベタうちでホムペソースを
かいてました。

数年間ほったらかしてました。アップデートしてませんでした。

そのあいだ、GitHubつかうようになったり、文書もMarkdownで執筆する
ことがおおくなりました。

# このたびホムペを全面改装することに

一念発起して、ぜんめんてきに改装することとしました。せっかくだからMarkdownで
かいて、静的サイト生成できればいいなぁ思いました。

GitBookに興味があったのですが、ふるいバージョンはDeprecatedだし、
どうもウェブサービスとなってるようなので、そこからフォークされた
HonKitにしてみました。

# HonKitのドキュメントをみながら

[ドキュメントのサイト](https://honkit.netlify.app)があるので、それをみながら、やってみました。

Node.jsのインストールなどおこないました。

# いい感じ

いい感じのサイトができました。

# 追記させてください

MermaidのマインドマップってGitHubのUIだとレンダリングされるのだが、プラグインだと非対応
なのです。そこで追加しました↓

# Pluginつかってみた

４種類ほどプラグインをつかってみました。ひとつは`plugin-search-pro-kui`
`plugin-katex`, `honkit-plugin-mermaid`, `simple-mind-map`です。

前者が検索性能をあげるもの、あとのは、数式表示のためのものです。

## plugin installの方法

```
npm i honkit-plugin-katex
npm i gitbook-plugin-search-pro-kui
npm i npm i honkit-plugin-mermaid
npm i gitbook-plugin-simple-mind-map
```

そのあと、book.jsonのなかにこれらを書き加える

```
  "plugins": [
      "-lunr", "-search", "search-pro-kui","katex","mermaid", "simple-mind-map"
    ]
```

そのあと通常どおりにつぎのコマンドを実行

```
npx honkit init
npx honkit serve
```

この段階で、` http://localhost:4000`で生成した静的サイトを閲覧できるようになります

本ばんは ビルドです。

```
npx honkit build . ./docs
```

このように生成される静的サイトのPathを指定しておけば、GitHubPagesやVercelで公開するときに便利です。

## mindmapのこと

{% simplemindmap %}
```markdown
* simplemindmap
    * config book.json
        * plugins
            * others
            * simple-mind-map
        * pluginsConfig
            * others
            * simple-mind-map
                * type
                * preset
                * linkShape
                * autoFit
                * style
    * custom file.md
        * markdown
            * type
            * preset
            * linkShape
            * autoFit
            * style
        * txtmap
        * json
        * mindmup
```
{% endsimplemindmap %}

のようにしてください。この時点でGitHub上でのレンダリングは、あきらめましょう。

# Hokitのドキュメント

https://honkit.netlify.app
Webアクセシビリティ（２）

# はじめに

この記事では話題になっているWebアクセシビリティに関して知り、取り組めるようになることが目的です。
次に、Webアクセシビリティ向上の指針となるガイドラインについて紹介します。

## Webアクセシビリティの標準（WCAG）

Webアクセシビリティは、障害のある人を含むすべての人がWebコンテンツを利用できるようにすることを目的としています。この目標を達成するための国際的な基準であるWCAG（Web Content Accessibility Guidelines）について、その概略と適合レベルに分けて詳しく解説します。

### WCAGの概略

WCAGは、障害を持つ人々がWebコンテンツにアクセスしやすくなるように設計された一連のガイドラインです。これらは、Webコンテンツをよりアクセスしやすくするための具体的な推奨事項を提供し、情報技術の進化に合わせて定期的に更新されます。WCAGは以下の4つの基本原則に基づいています：

1. **知覚可能**：情報はユーザーが知覚できる形で提供されなければなりません。
2. **操作可能**：ユーザーインターフェースは操作可能である必要があります。
3. **理解可能**：情報と操作は理解しやすくなければなりません。
4. **堅牢**：コンテンツは、広範なユーザーエージェントによって解釈可能である必要があります。

### 3つの適合レベルとその内容

WCAGは、適合レベルA、AA、およびAAAの3つのレベルを定めており、それぞれが異なる深さのアクセシビリティ要件を示しています。

- **レベルA**：最も基本的なアクセシビリティ要件を満たします。これは、障害を持つユーザーにとって重大な障壁を取り除く出発点となります。
- **レベルAA**：より高いアクセシビリティ基準を設けています。多くの国では、公共機関のWebサイトがこのレベルの適合を達成することを要求しています。
- **レベルAAA**：最も高度なアクセシビリティ基準を満たすことを目指します。全てのコンテンツがこのレベルに到達することは期待されていませんが、特定のコンテンツで最高レベルのアクセシビリティを目指すことは価値があります。

WCAGの適合レベルを理解し、それに従ってWebコンテンツを設計および開発することは、より多くのユーザーが情報技術の利点を平等に享受できるようにするための重要なステップです。