OmniAICreator/Qiita-1.07M huggingface dataset:
Auto Numbering header in Markdown when previewing on VSCode or MKDocs

# はじめに

資料をMarkdownでする記載する機会が増えた。
Markdownはテキストなので作業環境を問わないところが気に入っている。
ただ、ヘッダのナンバリングは自分でするしかないと思っていた。
改めて、インターネットを検索したところ、CSSをサポートしたMarkdownのPreviewで、ヘッダのオート・ナンバリングできる知見を得たのでメモっておく。

具体的には、以下のURLのCSSをPreviewの設定に取り込むだけ。
[Numbered Headings in Markdown via CSS
](https://gist.github.com/patik/89ee6092c72a9e39950445c01598517a)

# HOWTO on VSCode

## 環境
- [VSCode](https://code.visualstudio.com/)
- [Markdown Preview Enhanced](https://shd101wyy.github.io/markdown-preview-enhanced/#/)

## Markdown Preview EnhancedのCustomize CSSの設定

CSSのカスタマイズの詳細は、[本家のCustomize CSSのWebページ](https://shd101wyy.github.io/markdown-preview-enhanced/#/customize-css)を参照されたい。
以下に、オート・ナンバリングの設定方法をサマライズしておく。

1. F1キーでCommandPalleteを開く
1. CommandPalleteに`Markdown Preview Enhanced: Customize CSS (Workspace)`を入力
1. [Numbered Headings in Markdown via CSS](https://gist.github.com/patik/89ee6092c72a9e39950445c01598517a)の内容をPasteして保存
    ![スクリーンショット 2024-03-24 230213.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59920/d528471c-9339-dac2-3622-522836d7045c.png)

以上で設定は完了。

## 実例

### Markdownドキュメント

```markdown
# Title
## はじめに
このドキュメントは...
## 概要
### 環境
- OS: Windows
- Interpreter: Ruby
- ...
### 提供機能
1. 機能１
1. 機能２
1. ...
```
### Preview結果

![スクリーンショット 2024-03-24 231504.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59920/96a04137-d739-680d-19a4-3fe9d887ee1b.png)

### 後記

[Markdown Preview Enhanced](https://shd101wyy.github.io/markdown-preview-enhanced/#/)のカスタマイズ機能でとりこまれればいいのに。
【Android】Jetpack Composeでのフォント変更【Kotlin】

# 準備
まずは使用したいフォントをダウンロードします。


https://fonts.google.com/specimen/Montserrat

![スクリーンショット 2024-03-22 19.55.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2394054/0ca6860b-f102-f1f8-6379-244723e93da8.png)

ダウンロードしたフォントをAndroidStudio内で使えるように resファイルにfontファイルを作っておきます。
![スクリーンショット 2024-03-22 19.59.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2394054/7a3e8aa0-8027-b780-6866-6d74f5b1e594.png)

この記事の下方にある参考資料のようにフォントをフォイルごとドラック&ドロップで取り込み、JetpackCompose内のTextに使用したところ
フォントを設定した文字の太さをfontWeightで設定していてもフォントが一番細いままで表示されてしまいました。

なのでフォントサイズ毎に取り込んで使ってみたところうまくいきました。
![スクリーンショット 2024-03-24 22.44.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2394054/8afb603a-5b79-376c-e353-d58d32d6f79b.png)

# 実践

``` php:FontMontserrat.kt
object FontMontserrat {
    val fontMontserratMedium = FontFamily(Font(resId = R.font.montserrat_medium)) // W500
    val fontMontserratSemiBold = FontFamily(Font(resId = R.font.montserrat_semibold)) // W600
    val fontMontserratBold = FontFamily(Font(resId = R.font.montserrat_bold)) // W700
    val fontMontserratBlack = FontFamily(Font(resId = R.font.montserrat_black)) // W900
}
```

```php:Screen.kt
    Column(
        modifier = Modifier
            .fillMaxSize()
            .padding(start = 10.dp)
    ) {
        Text(
            modifier = Modifier.padding(top = 20.dp),
            text = "fontMontserratMedium",
            fontSize = 30.sp,
            fontFamily = FontMontserrat.fontMontserratMedium
        )
        Text(
            modifier = Modifier.padding(top = 20.dp),
            text = "fontMontserratSemiBold",
            fontSize = 30.sp,
            fontFamily = FontMontserrat.fontMontserratSemiBold
        )
        Text(
            modifier = Modifier.padding(top = 20.dp),
            text = "fontMontserratBold",
            fontSize = 30.sp,
            fontFamily = FontMontserrat.fontMontserratBold
        )
        Text(
            modifier = Modifier.padding(top = 20.dp),
            text = "fontMontserratBlack",
            fontSize = 30.sp,
            fontFamily = FontMontserrat.fontMontserratBlack
        )
    }
```

![スクリーンショット 2024-03-24 23.14.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2394054/91b388a3-7e7d-4795-3892-3d2407c02292.png)




# 参考

https://magazine.techacademy.jp/magazine/31841

https://appdev-room.com/android-font-custom
TablePlus

## 長時間実行されるSQLで煩わしい

長い時間がかかると分かっているSQLを実行したときに、「Wait」「Reconnect」というダイアログが出てくるのが大層煩わしい。

- Macでは、`⌘ ＋ ,` General → Others → Query time out 
    - デフォルトでは300秒（5分）らしい
        - 0 sでは設定できない
        - 999999999999999999 s で設定した
Roadmap.sh学習（JSON:API）

# このドキュメントについて
Roadmap.shのバックエンドデベロッパーの学習メモです。

# JSON:API

JSON形式のAPI全般のこと、、、ではなく「JSON:API」という名称のWeb APIの仕様のこと
後述する特徴のおかげで効率的にデータを取得できる。

## 特徴
1. **一貫性と予測可能性**:
    - JSON:APIは、APIのレスポンスのデータ構造を一貫して定義し、予測可能な形式でデータを取得できる
    - 開発者がAPIを利用する際に、データの構造やフィールドの命名規則を理解しやすい
　　
2. **リレーションシップのサポート**:
    - 関連するデータを効率的に取得できる仕組みを提供
    - リレーションシップを持つリソース同士を簡単に結びつけることができる
　　
3. **ページネーション**:    
    - 大量のデータをページごとに取得できる
    - ページング情報を含めてデータを返すことで、クライアント側でデータを効率的に表示できる
　　
4. **エラーハンドリング**:    
    - エラーが発生した場合、一貫性のあるエラーレスポンスを返す
    - エラーの詳細情報やステータスコードを含めて、クライアントに適切な情報を提供する
　　
5. **メタデータのサポート**:    
    - メタデータをリクエストやレスポンスに含めることで、追加の情報を提供できる
    - ページネーション情報やリクエスト元の情報などをメタデータとして返すことができる

## 実際の動作について
- 下記のライブラリのデモでJSON:APIを試すことができる
	https://github.com/thomaxxl/safrs
- PythonのFASTAPI向けのJSON:APIライブラリとして[FastAPI-JSONAPI](https://github.com/mts-ai/FastAPI-JSONAPI)というものもある

## 参考
- https://roadmap.sh/backend
- https://jsonapi.org/
- https://www.youtube.com/watch?v=N-4prIh7t38
- https://mts-ai.github.io/FastAPI-JSONAPI/index.html
　　

実際のリクエストやレスポンスについては後日まとめます。
今日はここまで。
ARPフレームをキャプチャする

# 背景
検証環境：docker でルータとクライアントを用意
1.クライアント（ARPリクエスト送る側）cl1
2.ルータ（ARPReply送る側）rt2

目的：通信が開始されるまでの流れの確認
つまり、ARPリクエストを送ってからARPReplyが返ってくるまでの動きを見る

参考文献：「体験しながら学ぶ　ネットワーク技術入門 著/みやたひろし」
体験型で学べる参考書を探していたところに出会った本。机上でのネットワークの概要を抑えているが実戦経験がない人におすすめです。パケットを送ったときにどのような動きをするのかを順番を追って説明してくれているのでこの記事を読んでもっと深い内容を知りたいと思った方はぜひ購入を検討されてはいかがでしょうか。

といったところが背景になります。ここからは検証内容にはいっていきます。
手順は以下の通り。
![arp1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661566/20a062d0-86f6-d283-8a36-bd7127cc4677.png)

![arp2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661566/a4d300d9-3674-4063-b4d5-885de981a3b4.png)

# そもそもARPとは
Address Resolution Protocolの略。MACとIPを変換する役割をもつ。IPアドレスとMACアドレスの対応表があると思えばいいと思います。

# 検証
## ルータ側
最初にipアドレスを確認
```
root@rt1:/# ifconfig net1
net1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.11.254  netmask 255.255.255.0  broadcast 0.0.0.0
        inet6 fe80::bca0:5bff:fefe:2a22  prefixlen 64  scopeid 0x20<link>
        ether 02:42:ac:01:12:54  txqueuelen 1000  (Ethernet)
        RX packets 112  bytes 12377 (12.3 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 87  bytes 10686 (10.6 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
```
次にARPテーブルの確認
```
ip neigh show
```
もし、すでに書き込まれているのなら削除（今回は検証のため）。
```
ip neigh flush all
```
次にtcpdumpコマンドでクライアント側からのARPリクエストを受け付ける状態にする。tcpdumpコマンドは通信の生のデータをキャプチャし、その出力結果を出してくれるツールである。WireShark等のツールで確認できる。-w で出力先ファイル名を指定。-iでネットワークインターフェースを指定できる。

```
root@rt1:/# tcpdump -i net1 -w /tmp/tinet/arp.pcapng arp
tcpdump: listening on net1, link-type EN10MB (Ethernet), capture size 262144 bytes
```

## クライアント側
```
root@cl3:/# ifconfig net0
net0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.11.100  netmask 255.255.255.0  broadcast 0.0.0.0
        inet6 fe80::e0a0:33ff:fe08:d4ce  prefixlen 64  scopeid 0x20<link>
        ether 02:42:ac:01:11:00  txqueuelen 1000  (Ethernet)
        RX packets 89  bytes 10570 (10.5 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 40  bytes 2921 (2.9 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
```
同様にARPテーブルの確認を行い、存在していれば削除する。
```
root@cl3:/# ip neigh show
192.168.11.254 dev net0 lladdr 02:42:ac:01:12:54 STALE
root@cl3:/# ip neigh flush all
root@cl3:/# ip neigh show
```
# ARPテーブルの確認

ここまで準備ができてようやくICMPパケットをクライアント側からルータ側に送る。
```
ping 192.168.11.254
```
適当な時間をおいて、ctrl+Cで中断し、クライアント側とルータ側でARPテーブルを確認すると、
クライアント側は

```
root@cl3:/# ip neigh
192.168.11.254 dev net0 lladdr 02:42:ac:01:12:54 STALE
```
ルータ側は
```
root@rt1:/# ip neigh
192.168.11.100 dev net1 lladdr 02:42:ac:01:11:00 STALE
```
というように、確認ができた。
これで通信の準備が完了し、ICMPパケットが送られるということになる。
C言語構造体の理解のための自分への備忘録

- 構造体
    
    いろいろな変数をまとめた型を構造型(レコード型)といい、フィールド(データ項目)を集めたもので各メンバ(データ型)が異なっていてもよい。一般的には構造体と呼ばれることが多い。
    
    例として、通常の方法で異なるデータ型を宣言
    
    ```c
    #include<stdio.h>
    int main(void){
    
    	int year;       /* 学年 */
    	int clas;       /* クラス */
    	int number;     /* 出席番号 */
    	char name[64];  /* 名前 */
    	double stature; /* 身長 */
    	double weight;  /* 体重 */
    
    }
    ```
    
    次に複数のデータ型をまとめた構造体の場合
    
    ```c
    #include<stdio.h>
    struct student
    {
        int year;       /* 学年 */
        int clas;       /* クラス */
        int number;     /* 出席番号 */
        char name[64];  /* 名前 */
        double stature; /* 身長 */
        double weight;  /* 体重 */
    };
    
    int main(void){
    	struct student data;
      return 0;
    }
    ```
    
    構造体の型を宣言する時にはstruct(ストラクト)とつける。
    
    その次にデータ型となる構造体の型名をつける上記の例だとstudentが構造型のデータ名となる。この型名を一般的に構造体タグ名と呼ばれる。
    
    {}の中にまとめたい変数の型と名前を宣言している。
    
    実際に使うためには、構造体の型の変数を宣言する必要がある為、構造体の型の変数を宣言するには、次のようにしています。
    
    > struct student data;
    > 
    
    始めにstructをつけ、次に構造体の型名のstudent、変数名としてdataを宣言しています。
    
    今後は構造体の型名はstructがないと型として定義できない為、構造体タグ、構造体タグとして宣言された変数を構造体変数と呼びます。
    
    ※関数では、グルーバル領域で、プロトタイプ宣言を行うことで、メイン関数の下に関数を作成しても動作できましたが、構造体タグ**自体**を、関数よりも上に宣言することが一般的らしいです。
    
    そうすることで他の関数が後にきても一番上に構造体タグがある為、どの関数でも利用できるという点があります。
    
    ### 構造体の使い方
    
    構造体変数は、構造体タグで宣言されたすべての型をもっています。
    
    配列の時には、同じ型の変数を番号によって区別していましたが、
    
    > 要素名(変数名):32,45,63のそれぞれを0から始まる要素番号で区別
    int [3] = {32, 45, 63};
    > 
    
    構造体変数では、型に関係なく、すべての**要素を名前によって区別**します。
    
    > 構造体変数名.要素名
    > 
    
    ※ここで、. は**小数点記号**を使用します。カンマではありません。
    
    　**小数点記号**を流用しているだけであって、少数そのものとはまったく関係ありません。
    


構造体タグは配列にアクセスすることも可能です。
以下はその一例です。
```c
#include <stdio.h>

struct student
{
    int year;     
    int suuti[3];
};

int main(void)
{
    struct student data;
    data.year = 10; /* year要素にアクセス */
    //suuti表示
    for(int i = 3; i >= 0; i--){
        scanf("%d", &data.suuti[i]); /* 入力部分 */
    }
    for(int i = 0; i <= 3; i++){
        printf("Hyouzi:%d\n", data.suuti[i]);
    }
    
    //year表示
    printf("%d\n", data.year);

    return 0;
}
```
また初期化する方法としては、上記の例だと、scanf関数で一つずつ要素を追加していきましたが、以下のように構造体の型として初期化する方法もあります。

```c
#include <stdio.h>

struct example {
    int array[3];
    int value;
};

int main() {
    // 構造体配列の宣言と初期化
    struct example ex = {{1, 2, 3}, 0};

    // 初期化された構造体の値を表示
    printf("Array elements: %d, %d, %d\n", ex.array[0], ex.array[1], ex.array[2]);
    printf("Value: %d\n", ex.value);

    return 0;
}

```
基本情報でも、構造型(struct) 構造体タグ名(名前なんでも良い) 変数名で出題される可能性がある為、回は構造体の配列のアクセス方法や、構造体の意味や日本語できた場合の対処もかねて、書いてみました。
また、アウトプットをかねてこれから少しずつ寄稿していこうと思います。

参考文献：　苦しんで覚えるC言語
ハッカソン挑戦記: 技術メンターとしての二日

# はじめに
　[こちら](https://qiita.com/Takaharu_01/items/84421b3f0f1e4950b692)でハッカソンに技術メンターとして参加し、ハッカソン当日以前に開催したRubyに関する勉強会のお話をしました。今回は、ハッカソン当日のお話になります。

# ハッカソン当日の流れ
ハッカソンは二日間ありました。ざっくりのスケジュールは下記のとおりです。
## 一日目
1. 午後から開始
1. 挨拶
1. 開発

## 二日目
1. 午前から開始
1. 開発
1. 発表
1. 懇親会
1. 結果発表

# 所感
　二日間を通して技術的な質問されることが多かったです。質問された時、私は至急解決策を提示しないといけないという謎の使命感に駆られテンパり質問者と共に解決策を調査することがほとんどでした。他技術メンターの方は、解決策の提示ということではなくどちらかというと解決策を見つけるための調査方法や参考記事を共有されており、なるほど！と思いました。<font color="Red">調査方法や参考記事を共有する方法は、質問者が今後少し躓いた際に自分自身で調査し進めることができるようになったり、記事をみながら試してみる癖がついたりする</font>と思うので、今後のメンター対応では意識していきたいと思いました。
　また、今回のメンター対応は一人に対してではなく複数人に対するものでした。しかし、複数人に対するサポートができていない状況だったなと感じました。今後は<font color="Red">全体をバランスよくサポートできるように</font>心掛けていこうと思います。
　今回のハッカソンでは、運営メンバーやメンターで各チームに対して評価を行う必要がありました。評価項目は決まっていましたが、賞を決める評価なので非常に頭を悩ませながら評価しました。普段は評価される側ですが、<font color="Red">評価する側の立場に立ち評価することの難しさ</font>を感じました。

# おわりに
　ハッカソンに技術メンターとして参加し、沢山の気づきや学びがあり非常に良い経験ができたと感じています。もしまたハッカソンのメンターとして参加する際は、今回得た気づきや学びを生かしていきます。また、ハッカソンの参加者にいい刺激をいただき、私自身個人開発に挑戦していきたいと思いました。
PyMCにおいてMCMCサンプリングがとても遅いときに試してもらいたいこと

# はじめに
私はたまにPyMCを使っています。サンプリングが単純なモデルでも遅くなってしまう問題について解決法を調査したところフォーラムで発見しました。

# コード
jupyter notebook用に最初に!をつけてます。

:::note warn
pipなど異なるパッケージ管理ツールを一緒に使うことは推奨されていません。
:::

```python
!echo y | apt-get update
!echo y | apt-get install build-essential
!pip install "pymc>=5" "mkl-service>=2.3.0"
!pip install mamba
!echo y | mamba install m2w64-toolchain blas libpython theano-pymc
```

# 参考
元記事はこちらです。

https://discourse.pymc.io/t/slow-sampling-in-virtual-environment/12084
SC-400をPearson Vueのオンライン試験「OnVUE (オンビュー)」で受験したらとてもよかった

## 概要
Microsoft認定試験のSC-400をPearson Vueのオンライン試験で受験したらとてもよかったので、検討されている方の参考になればと思い記します。

## 使用PC
MacBook Pro (Retina, 15-inch, Mid 2015)
https://support.apple.com/ja-jp/111955
- プロセッサ
2.2GHzクアッドコアIntel Core i7プロセッサ（Turbo Boost使用時最大3.4GHz）、6MB共有L3キャッシ﻿ュ
- メモリ
16GB 1,600MHz DDR3Lオンボードメモリ
- 解像度
2880×1800

## 受験場所
自宅の浴室

## ネットワーク環境
- BIGLOBE光
- 無線接続

## よかった内容
### Microsoft Learn の利用が捗った
いつからか試験中にMicrosoft Learn へ接続できるようになりました。そのため試験中に、念のため確認したいことやさっぱり分からないことを調べるためにとても利用しています。
画面を分割して問題を表示させながらMicrosoft Learn画面も同時に表示させることができるのですが、オンサイトで受験したときのディスプレイではどちらかの表示領域を小さくしないともう片方を満足に表示させることできなかったのですが、今回はそのような調整がほとんど必要ありませんでした。

### 使い慣れたPCのため操作がスムーズ
上述のMicrosoft Learnに関連しますが、やはり使い慣れたPCなのでタイピング速度が違います。またトラックパッドのため画面スクロールも楽です。

### 画面をスクロールせずに全文を確認できた
ディスプレイ自体の大きさというよりは解像度が2880×1800のおかげだったのかもしれません。（詳しくないので分からないですがおかげだったと思うことにしています）

### ネットワーク遅延を感じなかった
受験前にネット記事を調べたら割と見かけたので心配していましたが、体感ではオンサイトと同じように進めることができました。

### 予約を直前でも取れた
オンサイトではまったく空きがない状況でも、試験監督員を英語にすると1時間後に予約枠の空きがあったりしました。
逆に日本語だとオンサイト同様ほぼ空きがない状況だったため今回は英語で受験しました。
今回が特殊だったのかは分かりませんが、チェックインから試験終了まで試験監督員と会話はありませんでした。（そもそもカメラの向こうに人がいたかどうかも不明）。

## 参考
- [Pearson VUEオンライン監督試験：チェックイン手続きの流れ](https://www.pearsonvue.co.jp/Clients/SHL/OnVUE/OnVUE_Check-IN.aspx)
- [Pearson VUEオンライン監督試験成功までの道のり](https://www.pearsonvue.co.jp/Test-takers/onvue/guide)
- [Microsoft 認定資格 オンライン受験方法について](https://www.microsoft.com/ja-jp/events/top/certification)
- [Pearson VUEによるオンライン試験に関して](https://learn.microsoft.com/ja-jp/credentials/certifications/online-exams)
- [認定試験中の Microsoft Learn へのアクセス](https://learn.microsoft.com/ja-jp/credentials/certifications/online-exams)
カーネルとLinuxカーネルについて

## はじめに
カーネルとは、コンピュータのオペレーティングシステム（OS）の中核をなす重要なコンポーネントです。

## カーネルの概要

カーネルは、OSの中核的な部分であり、ハードウェアとソフトウェアの間のインターフェースを提供します。
主な機能には、メモリ管理、プロセス管理、ファイルシステム管理、デバイスドライバなどが含まれます。

## Linuxカーネルの特徴
Linuxカーネルは、Linus Torvaldsによって開発されたオープンソースのカーネルです。
柔軟性と拡張性に優れており、さまざまなハードウェアアーキテクチャやデバイスに対応しています。
コミュニティによる開発とメンテナンスが行われており、世界中の開発者が参加しています。

## Linuxカーネルの重要性
Linuxカーネルは、デバイス、サーバー、組み込みシステムなどで広く使用されています。
柔軟性と信頼性が高く、さまざまな用途において重要な役割を果たしています。

## まとめ
カーネルは、コンピュータのOSにおいて不可欠な部分であり、Linuxカーネルはその中でも特に広く使用されています。Linuxカーネルはオープンソースであり、柔軟性と拡張性に優れ、世界中の開発者によってメンテナンスされています。そのため、今後もさまざまな技術や要求に対応し、進化し続けることが期待されます。

[参考サイト]
・https://www.idcf.jp/words/kernel.html
CCISOという資格についてまとめてみた！

# はじめに

5年くらい前にEC-CouncilからCCISOという資格がローンチされたという話は聞いていましたが、v2が出たみたいなのでまとめてみたいと思います。とは言いつつv1について何も知らないですので、記載ぶりについてはご容赦ください。

# Who am i ?

しがないエンジニアです。EC-Councilの資格はCEH MASTER、LPT MASTER、CHFI、CNDを取得しています。

# この記事の想定読者

 - CCISOについて知りたい方
 - CISSPホルダ
 - その他

# 本題

試験構成を見る限り、EC-CouncilがISC2のCISSPを強く意識しているように思います。いつもの四択問題以外にも何かやらなければいけないことがあるのでしょうか。

https://www.eccouncil.org/train-certify/certified-chief-information-security-officer-cciso/

```
CCISO を取得するには、各ドメインの経験に関係なく、 すべての応募者が5つのCCISO ドメインすべてをカバーする試験に合格する必要があります。
試験は2時間半にわたって行われる150 の多肢選択問題で構成されます。 試験の問題は広範な検討と評価を必要とします。CCISO 試験では3つの認知レベルがテストされます。

レベル1
知識：この認知レベルの質問は、記憶された事実を思い出すために使用されます。 これは、 受験者の情報を記憶する能力を単に認識するだけであるため、 最も基本的な認知レベルであり、 認定資格ではほとんど認められません。 基本的な定義や基準、 具体的な事実を尋ねる際に効果的に使えます。
レベル2
応用：この認知レベルの質問は、特定の概念の応用を理解する受験者の能力を識別するために使用されます。 これは、概念そのものだけでなく、 特定の概念の
理解と正しい適用性を必要とするという意味で、 知識ベースの質問とは異なります。 このタイプの質問では、 実際の質問がステムに提供される前に追加のコンテキストが必要になることがよくあります。
レベル3
分析：この認知レベルの質問は、一連の変数とコンテキストを考慮して問題を特定して解決する受験者の能力を識別するために使用されます。 分析の質問は、概念の適用可能性だけでなく、 特定の制約が与えられた場合にその概念を使用して問題を解決する方法も必要とするという点で、アプリケーションベースの質問とは大きく異なります。
```

ただ、↑のレベル1～3については読んでみてもよくわかりませんでした。

また、下記の記載によると、CCISOという資格はCISSPの次のステップに位置づけられているようです。確かにCISSPは情報セキュリティ専門家（あくまでも経営陣の補佐役）の立場の資格ですが、CCISOはまさしくCISOのための資格という感じですね。情報セキュリティ専門家の人たちが全員CISOを目指すのかどうかはさておき、資格の存在意義は理解できます。

https://www.eccouncil.org/cybersecurity-exchange/executive-management/cciso-vs-cissp/

以下のページを参照する限りですが、CISSPと認定方法自体は差異があるとは思えないです。

https://cert.eccouncil.org/

CCISOのBrueprintは現在v2なのですが、以下に記載があります。

https://ciso.eccouncil.org/wp-content/uploads/2021/07/CCISO-New-Blueprint-v2.pdf

```
ドメイン 1: 
Governance (25%)： ガバナンスに関するトピックが含まれており、組織の情報セキュリティプログラムを設計・実装・維持する能力が評価されます。

ドメイン 2: 
Risk Management, Compliance, and Audit Management (20%)： リスク管理、コンプライアンス、監査管理に関するトピックが含まれています。情報セキュリティリスクを識別・評価・管理し、適切な法令や規制へのコンプライアンスを確保します。

ドメイン 3: 
Program Management and Operations (15%)： プログラム管理と運用に関するトピックが含まれています。情報セキュリティプログラムの運営と管理を行い、業務を効率化します。

ドメイン 4: 
Information Security Core Concepts (15%)： 情報セキュリティの基本概念に関するトピックが含まれています。セキュリティの原則や技術についての理解が評価されます。

ドメイン 5: 
Strategic Planning, Finance, Procurement, and Vendor Management (25%)： 戦略的計画、財務、調達、ベンダー管理に関するトピックが含まれています。情報セキュリティに関する戦略的計画を策定し、資金やリソースを効果的に管理します。
```

ガバナンス、ストラテジとかまさしく経営戦略を決定する人たちが受験する感じがして、若干ワクワク感があります。早く日本に上陸することを期待したいですね。その場合、講師の方はどこかの会社のCISOだったりするのでしょうか？

# 余談

2024年現在で、日本でまだCCISOが受講できるような環境は整っていないと思われます。日本ではようやくCISSPがメジャーな資格になってきており、少しずつ広まり始めたという感じですね。EC-Councilの資格では日本でもCEHがようやく広まってきてるという段階です。

# 最後に

CCISOは維持費として年間100USDもします。CPENT／LPT MASTERよりも低額ではありますが、取得したらそれはそれで維持が大変そうですね。

https://cert.eccouncil.org/blogs/membership.html
SpringBootでEntityを使ってMySQLにレコードインサート（1件、複数件）

# この記事はこれの続きです

https://qiita.com/waokitsune/items/0d4702b97d1ef99c03c1

# Repositoryクラス

変更無しです。

# Serviceクラス

Repositoryクラスの ```save()``` で1レコード分、 ```saveAll()``` で複数レコード分。

```java:UnkoService
package com.example.demo;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;


@Service
@Transactional
public class UnkoService {

	
	@Autowired
    UnkoRepository unkoRepository;

	
    public List<Unko> findAll() {
        return unkoRepository.findAll();
    }
    
    
    public void insertOne(Unko unko) {
    	unkoRepository.save(unko);
    }
    
    
    public void insertAll(List<Unko> list) {
    	unkoRepository.saveAll(list);
    }
    
    
}
```

# Controllerクラス

```java:DemoController.java
package com.example.demo;


import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;


@Controller
public class DemoController {

	
	@Autowired
    UnkoService unko_service;
	
	
	@GetMapping("/")
	public String getIndex(Model model) {
		
		
		//AUTOINCREMENTが設定されているrecord_idは値をセットしなくてOK。
		
		
		//1レコードだけインサート。
		Unko unko_ = new Unko();
		unko_.setTest_val("にゃあ");
		unko_service.insertOne(unko_);
		
		
		//複数レコードインサート。
		List<Unko> insert_list_ = new ArrayList<Unko>();
		
		Unko u_1_ = new Unko();
		u_1_.setTest_val("ほげえ");
		insert_list_.add(u_1_);
		
		Unko u_2_ = new Unko();
		u_2_.setTest_val("ふがあ");
		insert_list_.add(u_2_);
		
		unko_service.insertAll(insert_list_);
		
		
		//全レコード取得してThymeleafの変数にセット。
		model.addAttribute("unko_list", unko_service.findAll());
		
		
		return "/index";
		
		
	}
	
	
}
```

# 実行結果

インサート先のテーブルはあらかじめ全レコード削除した状態で実行しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/84c74e77-57be-34ef-3c86-30411c06fce8.png)

# この記事の続き

https://qiita.com/waokitsune/items/4f73350f54b0474c99b1

# バージョン

Microsoft Windows [Version 10.0.19045.4170]
Spring Boot v3.1.9
モンテカルロ法で円周率を求める

モンテカルロ法は乱数を使って計算する手法です。この記事ではモンテカルロ法で円周率を計算します。動作環境はVisual Studio Community 2022のバージョン17.7.4です。使用言語はC++20です。

# 理論
以下の図のような辺の長さが1の正方形と半径が1、中心角が90°の扇形について考えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3644510/4944f8ff-b5ed-347d-c98d-d8c1f6982ba4.png)
>出典: https://note.com/shimakaze_soft/n/n9547f5c0bae0

この正方形の中のランダムな位置に大量の点を打ちます。点を打っていくと扇形の中に含まれる点と含まれない点が出てきます。モンテカルロ法では、扇形の中の点の総数と正方形の中に打った点の総数の比が、扇形の面積と正方形の面積の比に近似できると考えます。この考えによって以下の式が成り立ちます。
```math
\frac{扇形の中に打った点の合計}{正方形の中に打った点の合計} = \frac{\pi ×1×1×\frac{90}{360}}{1×1}
```
この式から円周率は以下の式で求められます。
```math
\pi = \frac{扇形の中に打った点の合計}{正方形の中に打った点の合計}×4
```

# 実装
以下のコードでモンテカルロ法を用いた円周率の計算が出来ます。

```C++:MonteCarlo.cpp
#include <iostream>
#include <random>
#include <numbers>

int main()
{
	int points = 1000000; //点の合計
	int circlePoints = 0; //扇形の中に入った点の数
	std::random_device rng; //乱数インスタンスの生成
	std::uniform_real_distribution<> dist(0, 1); //0以上1未満の実数の乱数を発生させる

	for (int i = 0; i < points; i++)
	{
		double x = dist(rng); //x座標をランダムで指定
		double y = dist(rng); //y座標をランダムで指定

		if (std::pow(x, 2) + std::pow(y, 2) <= 1)
		{
			circlePoints++; //扇形の中に点があれば1を足す
		}
	}

	double pi = (double)circlePoints / points * 4; //点の数の比から円周率を求める

	std::cout << pi << std::endl; //モンテカルロ法で求めた円周率を表示
    //3.14446
	std::cout << std::numbers::pi << std::endl; //標準ライブラリで定義された円周率を表示
    //3.14159
}
```

扇形の中に点が入っているかどうかは、原点(0, 0)と点の間の距離が扇形の半径1以下であるかどうかで判定しています。
モンテカルロ法による円周率の計算結果は3.14446になっていますが、乱数計算なので実行する度に結果は変わります。しかし複数回実行してもほとんどの場合で約3.14という結果が出ます。このコードでは打った点の合計を1000000にしましたが、点の数を増やせば精度はさらに良くなると考えられます。
C++では標準ライブラリのnumbersに円周率が定数として定義されているので、モンテカルロ法の計算結果と比較してみてください。

# 参考
https://note.com/shimakaze_soft/n/n9547f5c0bae0
https://anko.education/joho/programming/monte_carlo_pi
アウトプットの習慣を身に着けよう！

## 「アウトプット」が大事
40代前半、この度ご縁をいただき転職をしました。
まさかこの歳になってまた転職活動をするとは思わなかったけど・・・・。
新しい会社は、高学歴な方が多く高卒の私はちょっとビビッてましたが
社長がとてもいい方で、この方についていきたいなと素直に思いました。

新しい会社は「アウトプット」を大事にしているということで
私もアウトプットの習慣を身に着けようと思います！
思えば前職では最初に2年間ぐらいは、慕っている上司がいたので
アウトプットや勉強も進んでやってたけど、会社がどんどん崩壊していって
やる気失くしてたのでなんにもやってなかったなと反省・・・・。

### 「アウトプット」のメリットってなに？！
みんなどうやってるのかな？何やってるのかな？
とちあえず、ググってみた！ｗ

[エンジニアがアウトプットするメリットとコツ│現役エンジニア直伝](https://www.sejuku.net/blog/106815)

#### エンジニアがアウトプットすべき理由：圧倒的メリット5つ

①知識・スキルが定着する
>アウトプットすることは同じ内容を繰り返して学習することでもあります。そのため、より知識・スキルが定着し確かなものにすることがます。
実際に、学習定着率が向上するという「ラーニングピラミッド」でも、「他人に教える」ことが知識の定着率が90%だとされています。

②精神的な充実感が増す
>精神的な充実感UPにも繋がります。アウトプットすることは「自分にはこんな知識や経験、スキルがあるのだ」ということを目に見える形で理解できます。

③仕事での評価UP
>「知識やスキルの定着」は複合的な効果を発揮します。より仕事ができるようになったり、積極的な発言・提案は仕事上での評価UPにも貢献します。

④人脈が増える
>あなたのアウトプットする内容に価値を感じ、あなたを信頼してくれる人が増えます。
特に後述する「SNS・ブログ」を通じてアウトプットすると多くのファンの獲得に繋がります。

⑤転職・仕事獲得にも有利に
>あなたのキャリアアップにも重要な役割を果たします。
アウトプットすることで、知識やスキルの定着を促し、エンジニアとしての実力がアップします。より良い会社へ転職したり、より高単価・好条件の案件を獲得できる可能性も上がります。

ふむふむ・・・・。
うーん、もう精神病むとか身体壊すとかじゃなければ転職はもうしたくないかた
⑤はそんなに気にしないけど、②の充実感ていいよね。
新しい会社は前職で使ってなかったツールや技術を使ってるし
Udemyとかで勉強しながら、アウトプットを心がけよう！


#### エンジニア向け・アウトプットの6つのコツ
①ひたすら手を動かす
>定番で確実な方法は「ひたすら手を動かすこと」です。
コードをばりばり書いていく、学んだ技術を使ってサイトやサービスを作ってみる……。実際に目に見える形に落とし込んでいきましょう。
なお、学んだ後にすぐに手を動かすことで、より効果的にアウトプットできます。知識やスキルの定着にもつながりますので、「学んだら即実行」を心がけるといいでしょう。

②SNSやブログで発信する
>SNSやブログを使ってアウトプットするのも、あなたの資産になるので非常におすすめです。
あなたにとって価値のある情報は、他の誰かにとっても価値のある情報です。

③ポートフォリオに落とし込む
>学んだスキルや言語、作品や関わったプロジェクトなどの実績をポートフォリオにまとめておきましょう。
ポートフォリオはあなたの作品集でもあり、クライアントへ自分を売り込むためのプレゼン資料です。アウトプットの練習にもなります。

④人前で話す
>少人数でも構いませんので人前で話すことも経験してみると良いでしょう。
自分以外の誰かに話すことで、相手にきちんと伝わるように自分の頭の中にある情報を整理する力が身につきますし、すぐにフィードバックをもらえるという利点もあります。

⑤正確な情報を出す
>アウトプットする際には、情報源を明らかにしたり、自分で体験した一次情報をもとにするなどして、正確な情報を提供するように心がけましょう。

⑥自分の言葉・見解も交える
>本で読んだ内容などをそのまま話すだけでは、ただコピーするのと同じです。必ず自分の言葉や見解も交えて話すようにしましょう。

自分の性格的には①が一番重要かなぁ・・・。
ひたすら手を動かしながら②と⑤を心がけてやっていこう:relieved:
韓国のAIスタートアップ"UpStage"のLLM:Solarを試しました

先日、韓国のAIスタートアップ企業”UpStage”が自社のLLM"Solar"の最新バージョンがAmazon SageMakerに正式に導入されたことを発表しました。

https://www.aitimes.com/news/articleView.html?idxno=158165

私もSolarを少し試しましたので、今日はSolar、UpStageと韓国語LLMについて少し紹介したいと思います。

## 1.UpStageについて
UpStageは、現在韓国で最も有名なAI企業です。

昨年の年末頃、UpStageが開発したLLM「SOLAR 10.7B」が、HuggingFaceのOSSLLM leaderboardで、一時的に英語と韓国語両方Top1になったことがあります。このモデルは、当時主流だったMistralのMoE（Mixture of Experts）とは異なるアプローチで、独自のトレーニング手法「DUS（Depth Up-Scaling）」を用いて学習されています。DUSを簡単に説明すると、既存のモデルのサイズを大きく（レイヤーの拡張）しながら、追加の学習データを与えてトレーニングを行う手法です。

一般的な継続学習とは少し異なり、レイヤーの拡張しながら事前学習を続けるみたいなイメージです。このやり方によると、比較的小規模なモデルでも、大規模なモデルを上回る性能を発揮することができます。しかもトレーニングのプロセスもそれほど複雑ではありません。

当時のベンチマーク⇩では、Solarは自身の4〜7倍の規模を持つMoEのMixtralや中国のQwenを超える性能を出したために、ちょっと話題になりました。（私はその時Solarが韓国企業のLLMだとは知らず、どこかのアメリカ企業のLLMだと思っていました、、）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/4f044d29-6321-108a-0f6f-8c247ade5aab.png)


# 2.韓国語LLM現状
韓国語のLLMの多くは、基本的にSolarをファインチューニングして作られています。
先週、韓国の情報協会（NIA）が「Ko-LLM」というランキングが発表され、韓国語LLMの性能が評価されました。その結果⇩から見ると、上位にランクインしているのは「XXX-Solar」という名前のLLMがほとんどです。これらは異なる企業が開発したモデルですが、いずれもUpStageのSolarモデルをベースにファインチューニングを行ったものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/3022e231-5ae4-63ee-088d-d56cca9a9d74.png)


# 3.Solarを実際試した感想

昨日私もSolarを試してみて、いくつかの特徴に気づきました。
まず、このモデルは英語と韓国語、両方ともかなり高い性能を持っています。

特に韓国語に関しては、ChatGPTとほとんど遜色ない性能を示しています。わずかな違いとして、Solarの韓国語はまるでネイティブの韓国人が話しているかのように自然で、一方ChatGPTの韓国語は韓国語が上手な外国人が話しているような印象を受けます。

また、SolarはDocument Chatに特化されていて、Document内の韓国語の認識と抽出、そして理解力も非常に優れています。

例えば、以下はUpStageが提供しているサンプルデータの認識結果ですが、一切間違いなく認識できています。（英語の認識精度も非常に高く、ほとんど間違いはありませんが、これはChatGPTでもすでに達成されているレベルなので、それほど特別なことではないです）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/10cc9bb9-1699-7630-803f-8bb3d9849e96.png)

私も適当に韓国語の画像を探して、Solarに渡して試してみました（試しに使ったのはドラえもんの韓国語版マンガの画像です）。OCR機能を使ってみたのですが、こちらも完璧に認識することができました。同じことをChatGPTで試したらうまくできませんでした。（韓国語の文字は非常に似ているために、誤りなく認識することは実はそれほど簡単なことではありません。例えば、일、말、밑などの文字は見た目では非常に似てます）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/88657fc2-3a24-a04f-d315-9e55f68af260.png)

ちなみに、Solarの日本語能力はまだかなり低いレベルです。
⇩のような非常に簡単な質問にも正しく答えることができません。（ただ、先週公開されたAmazon Sagemakerのニュースによると、今年中にSolarに日本語能力を追加する話はありました）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/68628192-cdf3-ed16-bd62-103721472ddd.png)



興味ある方試してみてください⇩：

https://www.upstage.ai/
DartのMap型でkeyからvalueを取るとNull許容型になる挙動を回避する方法

# 概要

DartのMap型`Map<type, type>`を使う場合、何らかの`key`から`value`を取る場面がある。既定では取得した`value`はNull許容型になる。これを回避するためには`??`演算子を使って、`null`だった場合のデフォルト値を定義する。

# 課題

以下のコードではint型の変数`appleNum`に、int?型となった`fruits["apple"]`を代入しようとしているため警告が発生する。

```dart:example.dart
Map<String, int> fruits = {"apple": 1, "banana": 3};
int appleNum = fruits["apple"]; // 警告発生
```

# 原因

これはMap型の挙動で、指定された`key`がない場合は`null`を返す。
そのため`Map<type, type>[key]`で返されるvalueの型は`type?`となる。

```dart:example.dart
Map<String, int> fruits = {"apple": 1, "banana": 3};
// fruits["apple"] -> 1
// fruits["strawberry"] -> null
```

# 回避策

`??`（Null合体演算子）を使用して、`null`が返された場合に代入するデフォルト値を設定する。

以下の例では`strawberry`という`key`はないが、`??`演算子で`null`の代わりに`0`を代入する。このようにすることで、`null`が変数に代入されなくなるため`type?`ではなく`type`を使える。

```dart:example.dart
Map<String, int> fruits = {"apple": 1, "banana": 3};
int appleNum = fruits["apple"] ?? 0; // appleNum = 1
int strawberryNum = fruits["strawberry"] ?? 0;  // strawberryNum = 0
```

# 参考

質問：[Dart null safety - retrieving value from map in a null safe way](https://stackoverflow.com/questions/65235879/dart-null-safety-retrieving-value-from-map-in-a-null-safe-way)
質問者：[SebastianJL](https://stackoverflow.com/users/9874789/sebastianjl)
回答者：[CopsOnRoad](https://stackoverflow.com/users/6618622/copsonroad)
参考にした回答：https://stackoverflow.com/a/67725900

[How do I signal that the return value from a Map is non-nullable?](https://dart.dev/null-safety/faq#how-do-i-signal-that-the-return-value-from-a-map-is-non-nullable)
自分のDiscordのステータスを取得できるapi的なものを使おう

自分のDiscordのステータスを外部から取得したいときに使える、apiもどきを作ったので公開します。
## １.サーバーに参加
まず、ステータスを取得するBOTがいるサーバーに入る必要があります。
(Discordの仕様から、同じサーバーに入っていない他人のステータスは取得できないため。)

↓Discordサーバー↓
https://discord.gg/4WT7WSGfGF
このサーバーに入っている自分以外の人は非表示になっています。
 ## ２.自分のUserIDを取得
 1.左下の設定アイコンをクリック
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2349977/2c0c2b2e-bb41-1e18-8a42-f9da8c914d54.png)
2.アプリの設定から、「詳細設定」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2349977/150906a9-d176-590a-8077-bf7251b2cd24.png)
3.開発者モードをオン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2349977/766c6e2e-aff6-8fbf-496f-b0437dcb5882.png)
4.設定画面を閉じ、自分のアイコンを右クリックして、ユーザーIDをコピー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2349977/e1c6ccbf-01c9-86da-8ff9-3c615b07f664.png)

このユーザーIDは後で必要になります。
## ３．URLにアクセス
`https://my-activity-discord.onrender.com/activity/ここに先ほどのユーザーID/`
これで自分のステータスと、アクティビティーがあればjson形式で返されます。
#
私の使用例は、自分のサイトでステータスを表示しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2349977/27037176-51d3-9a70-6eb4-17e845ca91f1.png)
[skota11.com](https://skota11.com)

これからもよいDiscordライフを！
gitが大文字小文字を識別しない

# 前置き
あるプロジェクトでタイプスクリプトを書いていたら、ローカルでは動くのに、CD/CIでのみビルドが失敗していました
ビルド結果を見るとどうやらインポートしようとしているファイルが見つからないとのこと。
```
Module not found: Can't resolve '../atoms/GameStartButton'
```

ローカルには同盟ファイルが存在していたのでリモートを確認すると、`atoms/gameStartButton`が存在していました。
調べると、gitはデフォルトで大文字小文字を識別しないとのこと

```
git config core.ignorecase false
```
以上のコマンドで検知するようになるとのこと
もしくは、一時的に
```
mv GameStartButton.tsx GameStartButton.tmp.tsx
```
みたいな感じでリネームするとよいとのこと
XMLってなに

# XMLとは

**マークアップ言語**の1つ


## マークアップ言語とは
タグを使って、データの構造・視覚的外観・意味を定義する
→文章を構造化するのが目的

## 文章を構造化するために必要なこと

文章のこの部分は注目してほしいポイントとか、ここからここまでが1段落などのように、文章の1つ1つの要素に対してタグや記号を埋め込んでコンピューターに認識させる必要がある

そもそも、コンピューターは文章をそのままアップロードされても、単語や文脈の意味を理解できない
・見出しはどこからなのか
・どこからが本文なのか
・引用した部分はどこなのか　など


### マークアップ言語の例
・XML
・HTML
・SGML
・RTF　など

# XMLの書き方


```
<book>

<title>  Harry Potter </title>

<author> J. K. Rowling </author>

</book>

```

:::note
XMLタグを利用することで、データの種類がわかりやすい

本に関するデータであることや、本のタイトル、作者のデータであることはタグを見るだけで理解できる
:::

ほとんどのデータ構造を定義するタグを作成できるため、XMLはextensibleと呼ばれている



# XMLの用途

## データ転送

**XMLを使用すると同じデータを異なる形式で保存する2つのシステム間でデータを転送できる**

例えば...

ウェブサイトで日付がMM/DD/YYYY形式で保存しているが、会計システムではDD/MM/YYYY形式で保存しているとして、この場合にXMLを使うとウェブサイトから会計システムにデータを転送できる

開発者は下記に事を自動化するコードを記述できる
1、ウェブサイトのデータをXML形式に変換する
2、XMLデータを会計システム用のデータに変換する
3、会計システム用のデータをXML形式に戻す
4、XMLデータをウェブサイト用のデータに戻す

## ウェブアプリケーション

XMLはウェブページに表示するデータの構造を表現できる

HTMLなどほかのウェブサイトを作るための技術とXMLを連携して、一貫性のある関連データをウェブサイトを訪問してきた人に提供できる

例えば...

洋服を販売するウェブサイトを想像する
サイトを訪問してきた人に対して、すべての服を表示するのではなく、XMLを使用してユーザーの好みに基づいてカスタマイズしたページを作成できる
→タグの<brad>をフィルタリングすることでそのブランドのものだけを表示できたりする



## データタイプ

多くのプログラミング言語が、XMLをデータ型としてサポートしている
そのサポートがあるから、XMLファイルを直接操作するプログラムをほかの言語で記述できる

# XMLとHTMLの違い


前提として2つの共通項はタグで囲まれたデータが含まれていることくらい

|  | XML | HTML |
|:-----------:|:------------:|:------------:|
| 目的       | データの格納や送信       |データの提示と表示         |
| タグ    | ユーザーがタグを作成したり定義できる    | 事前に定義されたタグがある     |
| 構文ルール       | 大文字と小文字を区別する       | 大文字と小文字を区別しない        |



XMLの代わりにHTMLを使用することはできない

HTMLタグでXMLデータを囲んだらウェブページに表示できる
YouTubeのチャンネル登録を一斉解除するJavaScript

## Youtubeのチャンネル登録を整理したかった
* チャンネル登録の要否をひとつずつ判断するのも面倒
* だったら一旦すべてのチャンネル登録解除して本当に必要なものだけ再登録しよう
* デフォルトの機能だと一括チャンネル登録解除はできなかった

## 開発者ツールから簡単に実行できるJavaScript使う
1. 対象のGoolgeアカウントにログインする
1. こちらのURLにアクセスする　https://www.youtube.com/feed/channels 
1. 開発者ツール>Consoleタブに下記のスクリプトを貼り付けて実行

 ```
 function unsubscribeFromAllChannelsWithTextClick() {
    const unsubscribeButtons = document.querySelectorAll('#notification-preference-button > ytd-subscription-notification-toggle-button-renderer-next > yt-button-shape > button > yt-touch-feedback-shape > div > div.yt-spec-touch-feedback-shape__fill');

    let currentIndex = 0; // 現在処理しているチャンネルのインデックス

    function clickByTextContent(tagName, textContent) {
        const elements = document.querySelectorAll(tagName);
        for (let element of elements) {
            if (element.innerText === textContent) {
                element.click();
                return true; // 要素が見つかり、クリックされた
            }
        }
        return false; // 指定されたテキストを持つ要素が見つからなかった
    }

    function processNextChannel() {
        if (currentIndex >= unsubscribeButtons.length) {
            console.log('全てのチャンネルの解除が完了しました。');
            return; // 全てのチャンネルが処理された場合、処理を終了
        }

        unsubscribeButtons[currentIndex].click(); // 「通知設定」ボタンをクリック
        
        setTimeout(() => {
            if (clickByTextContent('yt-formatted-string', '登録解除')) {
                // 「登録解除」テキストを持つ要素がクリックされた後の処理
                setTimeout(() => {
                    document.querySelector('#confirm-button > yt-button-shape > button > yt-touch-feedback-shape > div > div.yt-spec-touch-feedback-shape__fill').click(); // 確認ダイアログの「確認」ボタンをクリック
                    currentIndex++; // 次のチャンネルへインデックスを進める
                    setTimeout(processNextChannel, 100); // 次のチャンネルの処理を開始する
                }, 100);
            } else {
                console.error('「登録解除」テキストを持つ要素が見つかりませんでした。セレクターまたはテキスト内容を確認してください。');
                currentIndex++; // エラーが発生した場合でも次のチャンネルへ進む
                setTimeout(processNextChannel, 100);
            }
        }, 100);
    }

    processNextChannel(); // 最初のチャンネルの処理を開始
}

unsubscribeFromAllChannelsWithTextClick(); // 関数を呼び出して処理を開始
```
SpringBootでEntityで取得したMySQLのレコード値をThymeleafで表示

# この記事はこれの続きです

https://qiita.com/waokitsune/items/177ebd498976595d0567

Entityクラス、Repositoryクラス、Serviceクラスは作成済の想定です。

# Controllerクラス

Modelクラスを使って ```addAttribute()``` でThymeleafで参照する変数にセットするのがポイント。

```java:DemoController
package com.example.demo;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;


@Controller
public class DemoController {

	
	@Autowired
    UnkoService unko_service;
	
	
	@GetMapping("/")
	public String getIndex(Model model) {
		
		
		model.addAttribute("unko_list", unko_service.findAll());
		
		
		return "/index";
		
		
	}
	
	
}
```

# Thymeleafのテンプレートhtml

```th:each``` でループ、 ```th:text``` で変数の値を表示するのがポイント。

```html:index.html
<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
<body>
	
	<table>
        <tr>
            <th>record_id</th>
            <th>test_val</th>
        </tr>
        <tr th:each="unko : ${unko_list}">
			<td><div th:text="${unko.record_id}"></div></td>
			<td><div th:text="${unko.test_val}"></div></td>
        </tr>
    </table>
    
</body>
</html>
```

# 実行結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/a9119831-d6ce-bf36-2b6d-305f2585a0d9.png)

# この記事の続き

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

# バージョン

Microsoft Windows [Version 10.0.19045.4170]
Spring Boot v3.1.9
ipアドレスに対する解析

## 具体例
```
192.168.1.0/24
```
ipv4アドレス：192.168.1.0/24について、<br>
- CIDR（クラスレス・ドメイン間ルーティング）形式を使用して特定のIPネットワークに関する重要な情報が提供されています。<br>
- 192.168.1.0はネットワークアドレスを示し、/24はサブネットマスクの長さを示します。

### 情報解析
#### ネットワークアドレス
192.168.1.0はこのサブネットのネットワークアドレスです。<br>ネットワーク内のどの特定のデバイスにも割り当てられない、ネットワーク自体を一意に識別するために使用されます。

#### サブネットマスク
/24はサブネットマスクで先頭の24ビットが固定されていることを意味し、→ 255.255.255.0。<br>
このサブネット内のすべてのデバイスが最初の24ビットで同じIPアドレスを持ち、最後の(32-24)8ビットが各デバイスに割り当てることができることを意味します。

#### 利用可能なホストアドレス範囲
192.168.0.0/24 ネットワーク範囲内には、256個のアドレス（192.168.0.0から192.168.0.255まで）があり得ます。<br>
しかし、実際には、通常、以下の2つのアドレスはデバイスに割り当てられることはありません：

- ネットワークアドレス（192.168.0.0）：このアドレスはネットワーク自体を識別するために使用されます。この例では、192.168で始まる任意のアドレスの集合を指します。

- ブロードキャストアドレス（192.168.0.255）：このアドレスは192.168.0.0/24ネットワーク内のすべてのデバイスにブロードキャストメッセージを送信するために使用されます。

### プライベートアドレス
192.168.1.0/24はプライベートアドレス空間（192.168.0.0から192.168.255.255まで）に属しています。<br>
プライベートアドレスはインターネット上でユニークではなく、公開ルーティングされません。主にローカルエリアネットワーク（LAN）内で使用されます。<br>
したがって、インターネットに接続するためには、ネットワーク上のデバイスがNAT技術を介して行う必要があります。

## まとめ
192.168.1.0/24は256個のIPアドレスを持つプライベートネットワークを表し、そのうち254個がデバイスに割り当てるために使用できます。<br>
このアドレス範囲は、家庭や小規模オフィスネットワークでよく使用されます。
LogicoolのERGOシリーズのマウスとキーボードを使いこなしたい！

転職をして在宅勤務になるので会社に備品を買ってもらいました！
モニター・イヤホン・キーボード・マウス・椅子を
予算内であればAmazonで好きなのを選んでいい:astonished:　びっくりでした（笑）
そんなに社員にお金かけてくれるの？！（前職とはえらい差・・・比べるのも失礼か・笑）
ということで、Logicool好きなのでマウスとキーボードはLogicoolにしました！

## ERGO LIFT
マウスはこちらERGOシリーズの[Lift](https://www.logicool.co.jp/ja-jp/products/mice/lift-vertical-ergonomic-mouse.910-006488.html)！！

![スクリーンショット 2024-03-24 202005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3075677/d1edbd83-1e41-7722-834a-6851cd765580.png)

>エルゴノミクスとは人と機械の関係を「マン・マシン・システム」として捉え、人と機械の最適な関係づくり、つまり「人と機械の最適化」を目指すものである。

歳とともに肩こりが目にくるようにもなったので、身体と姿勢にいいものを・・・。
あと、手が小さいんです・・・・。なのであまり大きいマウスは手がつるｗｗ
使いこなせているかは微妙ですが、トラックボールタイプのマウスを使っていたので
違和感なく使えています。サイドのボタン（進むとか、戻る）とかあんまり押してない
気がするので意識して使っていきたいと思います！

## ERGO K860
キーボードはERGOシリーズの[K860](hhttps://www.logicool.co.jp/ja-jp/products/keyboards/k860-split-ergonomic.920-010115.html)！！

![スクリーンショット 2024-03-24 203528.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3075677/3a430f1b-8b35-81e3-3a9a-2d5ef07a32be.png)

正直まだ使いこなせていませんｗ
というのも自己流でタイピングしていて、正しいタイピングが身についていないため
ミスタイプも多いし、何より速度が遅いｗｗ
なので、ノートパソコンの使い慣れたキーボードにいきがちですが
せっかく買ってもたったし、慣れれば最高というレビューも多かったので
これを機に正しいタイピングを学ぼうと思いますｗ

### ホームポジション
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3075677/804d27ab-358a-fcbe-c27d-783b167deddb.png)

>打ち終わるたびに、いつもここに指を戻す

これができてない気がする:rolling_eyes:
ひとまず、仕事の効率化と自分の肩のためにも
日曜日の夜はタイピング練習とお勉強の時間にしたいと思います:relaxed:
サブネットマスクを学ぶ

初投稿。
チラ裏でいいんじゃね？というノリで書いてみる。

# 今日の学び：サブネットマスク
IPアドレスをネットワーク部とホスト部の境目を指定しているルール。
IPアドレスは2進数にしたとき、8桁ずつ、4組の数字の体系。
サブネットマスクは1と0で役割を表すから255.255.255.000の場合、
11111111.11111111.11111111.00000000になる。
1の部分がネットワーク部で、0の部分がホスト部。

ネットワーク部は、とあるネットワーク内で1種類に固定されており、ホスト部との組み合わせで、ネットワーク内で一意のIPアドレスが割り当てられる。
例えば、1家庭内にネットワークを構築するとき、1種類のネットワーク部を使う。
スマホやパソコン1台ごとにネットワーク部＋ホスト部で一意となるIPアドレスが割り当てられる。
文字で表すより、YouTubeを見て視覚的に理解したほうが断然理解しやすい。

# 復習
情報処理技術者試験でよく出てくる問題らしい。

サブネットマスク255.255.252.0
IPアドレス172.30.123.45
のときのネットワークアドレスを求める。

まず、サブネットマスクを2進数にする。
サブネットマスクは、11111111.11111111.11111100.00000000。
1組目、2組目、4組目は固定値で確定なので、172.30.???.0。

次に3組目の値からネットワークアドレス部分を計算する。
3組目を2進数にすると、01111011。
下2桁はホスト部なので、ネットワークアドレスに直すと01111000。

2進数の世界での差は11、10進数では3。
10進数の話に戻して、123から3を引いて120。

整理すると、172.30.120.0になる。

QED

# おまけ
① IPアドレス　172.30.123.45
② サブネットマスク　255.255.252.0
③ ネットワークアドレス　172.30.120.0
④ ブロードキャストアドレス　170.30.123.255（③のホスト部をすべて1にする）
⑤ ホストで利用できるIPアドレスの範囲　172.30.120.1～172.30.123.254（③と④の間）

# 個人的にわかりやすかった動画
文系でもわかった。
ついでにセットで見ていたNATの動画も。

https://youtu.be/sR6AUVFiJP4?si=QErpGHrAWOvce8og

https://youtu.be/m-zBkRscNmc?si=AGjaQIx1dTQJLr92

大変助かりました。
makeとgccのインストール方法

以下のElixirの記事を後追いしていたら環境絡みの問題に遭遇

https://qiita.com/piacerex/items/b34598cfc314e3400b3e

mix ecto.migrateをした際に以下のエラーが出力された

>  mix ecto.migrate
==> bcrypt_elixir
mkdir -p "/home/ricky/elixir_auth/bright/_build/dev/lib/bcrypt_elixir/priv"
cc -g -O3 -Wall -Wno-format-truncation -I"/usr/lib/erlang/erts-13.0.4/include" -Ic_src -fPIC -shared  c_src/bcrypt_nif.c c_src/blowfish.c -o "/home/ricky/elixir_auth/bright/_build/dev/lib/bcrypt_elixir/priv/bcrypt_nif.so"
/bin/sh: 1: cc: not found
make: *** [Makefile:33: _lib_name] Error 127
could not compile dependency :bcrypt_elixir, "mix compile" failed. Errors may have been logged above. You can recompile this dependency with "mix deps.compile bcrypt_elixir --force", update it with "mix deps.update bcrypt_elixir" or clean it with "mix deps.clean bcrypt_elixir"
==> bright
** (Mix) Could not compile with "make" (exit status: 2).
You need to have gcc and make installed. If you are using
Ubuntu or any other Debian-based system, install the packages
"build-essential". Also install "erlang-dev" package if not
included in your Erlang/OTP version. If you're on Fedora, run
"dnf group install 'Development Tools'".

どうやらmakeとgccを予め入れておかないとうまくいかないらしい
makeは
> sudo apt install make

通ったけどgccが環境依存か
> sudo apt install build-essential

も
> sudo apt install gcc

でもうまくいかなかった

ubuntuの質問をのぞいたらあった

https://askubuntu.com/questions/942305/i-cant-install-gcc-in-my-ubuntu

> $ sudo apt purge gcc
> $ sudo apt-get autoremove
> $ sudo apt update
> $ sudo apt upgrade
> $ sudo apt full-upgrade
> $ sudo apt install gcc

これでうまくいった
海外の誰かありがとう！

環境
Ubuntu 20.04.6 LTS
Elixir 1.16.2
Erlang/OTP 25
Ruby/Ruby on Railsを習得するためにやったこと まとめ（随時更新）

バックエンド言語「Ruby」およびWebフレームワーク「Ruby on Rails」を習得するためにやったことをここにまとめます。随時更新中！！

---

RubyもインストールしてHello worldしてみる
※参考：[初めてのRuby：インストール確認、REPL、Hello worldまで](http://idr-zz.hatenablog.com/entry/2018/11/20/224131)

6年ぶりのRyby再開計画発動！！Rubyistに、俺はなる！？
※参考：[Rubyistに、俺はなる！？ 6年ぶりのRyby再開計画発動](https://www.i-ryo.com/entry/2024/03/24/201632)

最新版のRubyをGemini先生に助けられながらインストールする
※参考：[【Ruby】最新版Rubyをインストール 〜苦戦の記録〜（ありがとうGemini先生）](https://www.i-ryo.com/entry/2024/03/26/225903)

文字列や計算の出力（putsメソッド、Mathモジュール）
※参考：[【Ruby】文字列や計算の出力（putsメソッド、Mathモジュール）](https://www.i-ryo.com/entry/2024/04/02/073838)

メソッドの定義、実行
※参考：[【Ruby】メソッドの定義、実行（def〜end）](https://www.i-ryo.com/entry/2024/04/04/072437)

クラスとオブジェクトを作成
※参考：[【Ruby】クラスとオブジェクトを作成（class）
](https://www.i-ryo.com/entry/2024/04/06/215310)

条件分岐、反復など（if、each）
※参考：[【Ruby】条件分岐、反復など（if、each）](https://www.i-ryo.com/entry/2024/04/08/072833)

Rails編開始！Codespacesとローカルに環境構築
※参考：[【Rails】Codespacesとローカルに環境構築（Railsチュートリアル1章）](https://www.i-ryo.com/entry/2024/04/14/224835)

hello_appをGitHubにプッシュ & Renderにデプロイ
※参考：[【Rails】hello_appをGitHubにプッシュ & Renderにデプロイ（Railsチュートリアル第1章クリア！）](https://www.i-ryo.com/entry/2024/04/16/000151)

ScaffoldでToyアプリケーションを作る
※参考：[【Rails】ScaffoldでToyアプリケーションを作る（Railsチュートリアル第2章）](https://www.i-ryo.com/entry/2024/05/03/174813)

静的なページを作る
※参考：[【Rails】静的なページを作る（Railsチュートリアル第3章）](https://www.i-ryo.com/entry/2024/05/06/202351)

Rails風味のRuby
※参考：[【Rails】Rails風味のRuby（Railsチュートリアル第4章 学習メモ）
](https://www.i-ryo.com/entry/2024/05/18/144245)

レイアウトを作成
※参考：[【Rails】レイアウトを作成（Railsチュートリアル第5章 学習メモ）](https://www.i-ryo.com/entry/2024/05/21/073527)

ユーザーのモデルを作成
※参考：[【Rails】ユーザーのモデルを作成（Railsチュートリアル第6章 学習メモ）](https://www.i-ryo.com/entry/2024/05/26/193346)

CRUD処理など
※参考：[【Rails】CRUD処理など（Railsチュートリアル第7〜10章の概要メモ）](https://www.i-ryo.com/entry/2024/06/18/065055)

ユーザー登録、ポスト投稿、フォロー機能など
※参考：[【Rails】ユーザー登録、ポスト投稿、フォロー機能など（Railsチュートリアル第11〜14章の概要メモ）](https://www.i-ryo.com/entry/2024/07/21/174532)
Arcというブラウザを1週間くらい使ってみた感想とよく使うショートカット一覧

Arcというブラウザを1週間くらい使ってみたので、

- 少し使ってみた使用感
- よく使うショートカット

を殴り書きですが共有できればと思います。

Arcインストールページ↓

https://arc.net/

## 使用感

### 良かったところ

- URLのコピーがしやすい
- デフォルトでいい感じのキャプチャが取れる
    - 要素ごとにキャプチャが取れる
    - そのまま画像をコピーできる
- AIにページの要約をしてもらえる
    - あんまり使わないかもだけど無料でChatGPT使えるみたいな感じだから良さそう
- デフォルトで簡単にフルサイトスクリーンショットが撮れる
- 横にタブがあることで、他ブラウザのように潰れないのがいい
- ページを全展開せず、プレビューできる
- ページ分割が便利
- 時間が経つとタブをアーカイブしてくれるのがいい
    - 元からタブ整理する人間なのでそこまで気にならなかったが、整理が苦手な人であれば恩恵を受けるかも？
- ブラウザ一つで色々完結する
    - 実際にいくつかアプリケーションからブラウザ移行をした
        - Notion
        - Miro

### 微妙なところ

- キャプチャからそのままEditするときの機能が少なかった
    - Skitch使った方がよりいい感じに修正できる
- 分割しすぎるとさすがに見づらい
    - 縦分割はそんなに使わないかな
    - CSSが微妙になる時がある
- 操作感が他ブラウザと結構違うので慣れるまで結構時間がかかる
    - Favorites / Pinned tabs / Today's tabsの違いとか最初わからない
    - Today's tabsが時間経つとアーカイブされること最初知らなかった
- 設定周りとかほぼ英語なのでむずかしい
- 新しいブラウザを立ち上げるアクションがないので新しいブラウザを立ち上げた感がない
    - Chromeで言うと ⌘+N でニュッて出てくる感じのやつ

### 今後考えていきたい

- Favorites / Pinned tabs / Today's tabsはどう運用するのがいいのか

## ショートカット

- ⇧ + クリック
    - ページのプレビュー表示
- ^ + ⇧ + =
    - Split View
- ^ + ⌥ + ←/→
    - スペース切り替え
- ^ + ⌥ + ↑/↓
    - タブ切り替え
- ⌘ + N
    - 新しいブラウザを作成
- ⌘ + O
    - プレビューを解除して拡張
- ⌘ + T
    - コマンドパレット表示
- ⌘ + S
    - 左のタブバーを隠す
    - 全画面で見たい時とか集中して作業する時に使用します。
    - Splitした状態で少し大きく見たい時とか
- ⌘ + W
    - タブのアーカイブ
- ⌘ + ⇧ + N
    - 新しいシークレットブラウザを作成
- ⌘ + ⇧ + 2
    - スクリーンショット
- ⌘ + ⇧ + C
    - 開いているURLのコピー

### たまに使いそう

- ^ + tab
    - タブの切り替え
- ^ + ⇧ + N
    - Note起動（ArcデフォルトMarkdownメモ機能）
- ^ + ⇧ + E
    - Easel起動（Arcデフォルトフリースタイルメモ機能）
- ^ + 数字
    - 特定スペース切り替え

## 参考にしたサイト

https://coosy.co.jp/blog/about-arc-browser/

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

https://qiita.com/chonchie/items/e2eb04ba52c7ccf65cf1
マイグレーションとmerge の関係性

マイグレーションに記入した
```ruby
class CreatePrototypes < ActiveRecord::Migration[7.0]
  def change
    create_table :prototypes do |t|
      t.string :title
      t.text :catch_copy
      t.text :concept
      t.references :user, null:false, foreign_key: true
      t.timestamps
    end
  end
end

```

上記の通り `t.references :user, null:false, foreign_key: true`
を記述すると
ストロングパラメーターに`merge`を付けることを忘れずにする！！これをせずにいるとうまく遷移できなかった。

具体的に
```ruby
    private 
   def prototype_params
     params.require(:photo).permit(:title, :catch_copy, :concept, :image).merge(user_id: current_user.id)
   end

```
FFMPEGで動画ファイルをAV1に圧縮するバッチファイル（GPU使用）

# 指定されたフォルダのビデオファイルを自動で処理します。

## 主な処理：

１．指定されたフォルダに移動。
２．encode_end と no_encodedフォルダがなければ作成。
３．指定されたフォルダとサブフォルダの .mp4、.mkv、.avi、.mov ファイルを探します。
　　encode_end と no_encoded フォルダの中のファイルは無視。
４．ファイル名に "av1" が含まれていない、かつサイズが500MB以上のファイルをAV1エンコード。
５．エンコード後、元のファイルは encode_end に移動。
６．新しいファイル名には "_av1" が追加。
７．500MB未満のファイルは no_encoded フォルダに移動。

このスクリプトは、ビデオファイルを自動的に新しいフォーマットに変換し、整理することを目的としています。

AV1エンコードのためにRTX4000系がいるかもしれません？
また、以下を変えるとCPU使用に変えられますが重くてやってられないと思います。

ffmpeg -i "%%f" -c:v av1_nvenc -c:a copy "%%~dpf%%~nf_av1.mkv"

```batch:ffmpegで動画ファイルをAV1に変更する。
@echo off
setlocal enabledelayedexpansion

:: Set the directory path
set "folderPath=%~1"

:: Change directory to the specified path
cd /d "%folderPath%"

:: Create directories if they do not exist
if not exist "encode_end" mkdir "encode_end"
if not exist "no_encoded" mkdir "no_encoded"

:: Loop through all video files in the folder and subfolders
for /r "%folderPath%" %%f in (*.mp4 *.mkv *.avi *.mov) do (
    :: Exclude files in encode_end, and no_encoded directories
    echo %%f | findstr /i /v "\\encode_end\\" | findstr /i /v "\\no_encoded\\" > nul
    if !errorlevel! equ 0 (
        :: Check if filename contains "av1"
        echo %%f | findstr /i "av1" > nul
        if !errorlevel! equ 1 (
            :: Get file size
            set "fileSize=%%~zf"
            
            :: Check if file size is 500MB or more
            if !fileSize! geq 524288000 (
                :: Execute FFmpeg command for each file, encode to MKV with AV1 codec and add "_av1" suffix to the file name
                ffmpeg -i "%%f" -c:v av1_nvenc -c:a copy "%%~dpf%%~nf_av1.mkv"
                
                :: Rename the original video file
                ren "%%f" "encode_%%~nxf"
                
                :: Move the renamed file to encode_end directory
                move "%%~dpfencode_%%~nxf" "%folderPath%\encode_end\"
            ) else (
                :: Move files smaller than 500MB to no_encoded directory
                move "%%f" "%folderPath%\no_encoded\"
            )
        )
    )
)

endlocal
cmd /k echo end.

```
Amazon S3のフォルダについて

マネジメントコンソールでS3バケットにアクセスすると、`フォルダの作成`というボタンがあり。
S3にフォルダがあるのは当たり前のようにあると思い込んでしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/50841812-4a02-9355-e4dd-0373b7386c32.png)

[フォルダを使用して Amazon S3 コンソールでオブジェクトを整理する](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/using-folders.html)

しかし上記ドキュメントを読むと、`Amazon S3 はフラットな構造であり、ファイルシステムに見られる階層はありません。`と記載があります。

マネジメントコンソールではフォルダが見えており、階層構造のように感じてしまいますが。

S3はファイルシステムのような階層構造ではなく、フォルダがあるように見せかける仕組みをつかって、フォルダの移行、コピー、削除、フォルダの合計サイズなどが提供されています。

## フォルダの実態について

[フォルダを使用して Amazon S3 コンソールのオブジェクトを整理する](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/using-folders.html)

上記ドキュメントの重要の部分に記載があります。

以下ドキュメントより引用

>Amazon S3 にフォルダを作成すると、S3 は、指定したフォルダ名に設定されたキーを持つ 0 バイトのオブジェクトを作成します。例えば、バケットに photos という名前のフォルダを作成した場合、Amazon S3 コンソールは photos/ キーを使用して 0 バイトのオブジェクトを作成します。コンソールは、フォルダの考え方をサポートするために、このオブジェクトを作成します。

>Amazon S3 コンソールでは、キー名の最後 (末尾) の文字がスラッシュ (/) になっているすべてのオブジェクト (examplekeyname/ など) がフォルダとして扱われます。キー名の末尾の文字が / のオブジェクトは、Amazon S3 コンソールを使用してアップロードすることができません。ただし、Amazon S3 API で名前の末尾が / のオブジェクトは、AWS Command Line Interface (AWS CLI)、AWS SDK、または REST API を使用してアップロードできます。

>名前の末尾が / のオブジェクトは、Amazon S3 コンソールではフォルダとして扱われます。Amazon S3 コンソールには、このようなオブジェクトのコンテンツやメタデータが表示されません。コンソールを使用して名前の末尾が / のオブジェクトをコピーすると、コピー先の場所に新しいフォルダが作成されますが、オブジェクトのデータとメタデータはコピーされません。

上記の記述がすべてですが、S3では　`/` の文字をフォルダの階層構造を表現するために利用しており、末尾が`/`となるオブジェクトはフォルダとして取り扱う事がわかります。

またAmazon S3にフォルダが作成する際に、作成されるオブジェクトは0バイトで`フォルダ名/`といったオブジェクトが作成されていると記載があります。

## マネジメントコンソールで合計サイズを計算するにどう表示されるか

### マネジメントコンソールでフォルダを作成してその配下にファイルを配置した場合

マネジメントコンソールからhelloworldという名前でフォルダを作り、その配下にhelloworld.txtを格納した場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/ea2391d6-212d-33b7-b98d-4bc389992cb2.png)

オブジェクトの合計数が2になっている事がわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/74f6de5e-d917-fdf9-c572-b7fe980b412d.png)

### aws-cliでfoobar.txtのみをアップロードする場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/eeedd180-7941-3a92-b8ee-2e801c349aba.png)

aws-cliを利用し、上記のようにfoobar/foobar1/foobar.txtといった形でアップロードしてみました。

このようにアップロードする事で、フォルダオブジェクトは作成されませんが、マネジメントコンソール上ではうまい事フォルダっぽく表示してくれる状態になります。

この状態で合計サイズを確認してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/12289eca-c838-64ea-c256-9ef93015ab1e.png)

フォルダオブジェクトを作成していないので、オブジェクトの合計数が1となっている事がわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/f7ceb595-e0b7-7b21-c341-b50d0cf6c3da.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/4e222d1c-7070-c75a-3567-ccee9e034de8.png)

上記のような感じでフォルダ2つに、ファイル1つでオブジェクトの合計数が3つになりそうな気がしますが、フォルダオブジェクトは作成していないので実態はオブジェクトの合計数は1になっています。


このようにフォルダオブジェクトが存在するかしないかでオブジェクトの合計数に影響を与えてしまう点は意識しておいた方がよいかと思います。

## 総評

Amazon S3基本の部分となり、情報を取得する際などに意識するケースはある気はします。