OmniAICreator/Qiita-1.07M huggingface dataset:
GitHub Pages & Next.jsで個人サイト作ってつまづいたところ

個人サイトを作ろうとしたときのはなし。

## 登場人物

なわしろ：私。[関西型言語](https://qiita.com/Yametaro)を使う人の影響で言葉がぶれる。

識者：主に Google 先生。

## 経緯

なわしろ「個人サイトが欲しいぞ。面接の時とか見せれたら便利やん」

識者「[GitHub Pages](https://docs.github.com/ja/pages/getting-started-with-github-pages/about-github-pages) をご存知？HTML などの静的なコンテンツをホストしてくれる便利なサービスだよ。なんと 1GB までなら無料。テキストで 1GB 埋めるのはなかなかきついのでブログ書き放題だね」

識者「それから [Next.js](https://nextjs.org/) もご存知？WEB サイトを作る時便利なフレームワークだよ。静的なコンテンツを生成する機能があるから今回役に立つよ」

なわしろ「なんかよさそうだね、それやってみよう」

## Next.js チュートリアル

識者「まず[チュートリアル](https://nextjs.org/learn/foundations/about-nextjs)をやってみようか」

なわしろ「千里の道もチュートリアルやればひとっ飛びやね」

...

なわしろ「でけた！ローカルで動くことを確認したやで」

なわしろ「せっかくだからチュートリアルで作ったサイトを個人サイトに改造してしまおう。モックは[Figma](https://www.figma.com/)で作ってあるんだよね。[デジタル庁のデザインシステム](https://www.digital.go.jp/policies/servicedesign/designsystem)が役に立ったよ」

## つまづき デプロイ時のバージョン設定

なわしろ「さっそく GitHub Pages にデプロイしてみよう」

なわしろ「ギャーッ！エラーが出たーッ！」

```sh
error npm@10.1.0: The engine "node" is incompatible with this module. Expected version "^18.17.0 || >=20.5.0". Got "16.20.2"
```

なわしろ「識者助けて！？」

識者「フムン。node のバージョンがあっていないようだね。18.17.0 以上でなければならないのに、16.20.2 になっている」

なわしろ「GitHub Actions で使われてる node のバージョンが古くていけないってこと？どうすればいいの？」

識者「`workflows/nextjs.yml`を利用してバージョンを指定できる。GitHub Actions 作るとき聞かれるんだけど、さては見落としていたね？」

```diff:workflows/nextjs.yml
-node-version:16
+node-version:18
```

## つまづき next.config.js の設定

なわしろ「ギャーッ！またエラーが出たーッ！」

```sh
remote: Permission to nawashiro/nawashiro.github.io.git denied to github-actions[bot].
```

識者「フムン。権限が足りていないようだね」

なわしろ「権限を要求する操作なんてしてないはず……おかしいな……」

識者「考えられることがあるとすれば、他のリポジトリにアクセスしようとしている、とかかな？」

なわしろ「あっ、`next.config.js`がチュートリアルのときのままだ」

```diff:next.config.js
-repoName = process.env.GITHUB_ACTIONS && "/nextjs-blog-learn";
+repoName = process.env.GITHUB_ACTIONS && "/nawashiro.github.io";
```

## つまづき next.config.js の設定 2

なわしろ「あれ？デプロイはできたけど、css が適用されていない姿のままだ」

識者「コンソールになにかエラーは出ているかい？」

```sh
Uncaught SyntaxError: Unexpected token '<'
```

識者「なぜか js が読み込まれなくて、代わりに index.html が読み込まれている状態だね。`next.config.js`になにかあることが多いよ」

なわしろ「なんもわかんない……とりあえず設定全部消してみよう」

```diff:next.config.js
 /**
 * @type {import('next').NextConfig}
 */
-repoName = process.env.GITHUB_ACTIONS && "nawashiro.github.io";
 module.exports = {
-  basePath: repoName,
-  assetPrefix: repoName,
-  trailingSlash: true,
-  publicRuntimeConfig: {
-    basePath: repoName,
-  },
 };
```

識者「なんかうまくいったね。スタイルが表示されてエラーが消えたよ」

なわしろ「なんで！？」

### basePath

識者「`basePath`だね。これはコードに書かれたパスの前に付け足されるパスを指定する設定だよ。たとえば」

```jsx:home.jsx
<Link href="/home">home</Link>
```

```js:next.config.js
module.exports = {
    basePath: "/example",
};
```

識者「これが出力されると」

```html
<a href="/example/home">home</a>
```

識者「こうなる」

なわしろ「はえー」

### assetPrefix

識者「`assetPrefix`は Next.js 9.5 以降では推奨されていない。古い情報には気を付けたほうがいいよ」

識者「データを流用するとこういうことも起こる。過去の資産に固執せず一から作ったほうが早いこともあるよ」

## まとめ

- GitHub Pages にデプロイするときは`nextjs.yml`をちゃんと確認すること。特にバージョン。
- `next.config.js`もしっかりと確認すること。
- 古い情報に気をつけろ。
- 過去のデータを流用するときも気をつけろ。

次回、og 編へ続く。
例外の事を正しく理解できているのか？

例外の事を正しく理解できているのか？
私は出来ていません。なので勉強しました。

例外って、よく分かりにくい。
どういう時に使うかよく分からない。
実際の業務でもあまり例外という言葉は出てこない。
曖昧な理解でもなんとかなっていた。
という印象を持っていました。

実際にサンプルを書いて動きを見てみて理解しました。

①
メソッド引数にマイナス値を指定するとエラー表示します。
例外ありなしで、どちらもユーザーから見た動きは同じです。

```cs:戻り値エラー
bool CheckPlus_ReigaiNasi(int val)
{
    if (val < 0) return false;
    return true;
}

private void button3_Click(object sender, EventArgs e)
{
    if (!CheckPlus_ReigaiNasi(-1))
    {
        MessageBox.Show("マイナスです", "エラー", MessageBoxButtons.OK);
    }
}
```

```cs:例外エラー
private void button4_Click(object sender, EventArgs e)
{
    try
    {
        CheckPlus_ReigaiAri(-1);
    }
    catch
    {
        MessageBox.Show("マイナスです", "エラー", MessageBoxButtons.OK);
    }
}

void CheckPlus_ReigaiAri(int val)
{
    if (val < 0) throw new Exception();
}
```

②
エラー処理は全て例外にした方がよいのか？
そうしない方が良い理由の１つに、処理速度があるようです。
以下のサンプルを試した所、
例外なし：1ミリ秒、例外あり：16秒かかりました。

```cs:例外なし
Dictionary<int, string> data = new()
{
    { 10,"aaa" },
};

private void button2_Click(object sender, EventArgs e)
{
    var sw = new Stopwatch();
    sw.Start();

    for (int i = 0; i < 1000; i++)
    {
        // data内の数値が無い場合はcontinueします。
        if (!data.Any(v => v.Key == i)) continue;
        var result = data.Where(v => v.Key == i).Single();
    }

    sw.Stop();
    label1.Text = sw.ElapsedMilliseconds.ToString();
}
```

```cs:例外あり
var sw = new Stopwatch();
sw.Start();

for (int i = 0; i < 1000; i++)
{
    try
    {
        // data内の数値が無い場合は例外発生し、以下のcatchでcontinueします。
        var result = data.Where(v => v.Key == i).Single();
    }
    catch
    {
        continue;
    }
}

sw.Stop();
label1.Text = sw.ElapsedMilliseconds.ToString();
```

③
私の不十分な知識で誤解を与えてはいけないので、
最後に大切な事を言いたいのですが。

例外については「.NETのクラスライブラリ設定」という書籍の、
例外の章を読んで下さい！
IBM i駆け出し日記：IBM iの特徴4つを理解する(初心者向け)

# IBM iの特徴ってなんだろう
入社2年目、IBM iを触り始めて9ヶ月ちょっと、ついに1年目の子にIBM iについてレクチャーする機会が先日あり改めてIBM iの良さについて考えてみることに。
そこで奥が深いIBM iの特徴について、新人の子向けにざっくり4つまとめてみました。

# IBM iの特徴
## ① 色々な機能が丸っとOSに包含
IBM iの大きな特徴の1つに**IBM i OSを導入するだけで色々な機能がついてくる**というのがあります。
データベース機能(Db2 for i)だったり、セキュリティ機能だったり、実行管理機能だったりと色々OS組み込みのため、OSとアプリケーション・プログラムさえ用意すれば、システムとしてすぐに利用できる状態にあると言えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/100f26cb-fa61-fd44-31a6-47a861d9ae60.png)

これの何がメリットなのかというと
- 必要機能一式をOS統合しているのでシステムの一元管理が可能
- トラブル発生時はIBM一社で問題切り分けを行なうので、迅速な対応が可能

この2点が大きいのかなと思ってます。

一般的に1つのシステムを動かす際、DB担当の人、OS管理の人、、、みたいに複数人でシステムを見守るイメージがあるのですが、IBM i ではシステムの一元管理が可能なので1-2人の少数精鋭でシステムを見守っていることが多い気がします。(壊れず安定性稼働できる基盤だからという理由もある気がする)

またトラブル時も各担当者と連携しなくてはならない、また各SWベンダーに問い合わせを行わなければならない、、といった手間もなくIBMにさえ問い合わせをすればOK！という仕様になっています。


そしてIBM i を触るとなるとOSに入っている様々な機能を学習することになります。それ故に幅広いIT知識が身につくので、IT初心者が基礎を学ぶ上ではうってつけのOSであると個人的には思っています。


## ② TIMI
TIMI(Technology Independent Machine Interface)はIBM iの設計思想の1つで、ソフトウェアとハードウェアを分離するための仮想化層です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/d6bbca72-5fb7-5a33-f822-c63d3a0ba04c.png)

TIMIの詳細についてはこちら
https://www.i-cafe.info/column/serials/offcon003

ざっくり言うと、TIMIがSWとHWレイヤーを分断しているため、HWのテクノロジー更新がソフトウェアに影響しません。
つまり**HWの更改を行っても、アプリケーションの再構築の必要がありません**。

これってユーザーにとっても便利ですし、IBM i を使い始めるとずっと使っていただける理由はこのテクノロジーが大きいと思っています。




## ③ 単一レベル記憶
単一レベル記憶(Single-level storage, SLS)とは、メモリとディスクを同じアドレッシング方式で管理する方法です。

通常のシステムにおいてメモリとディスク(補助記憶領域)はそれぞれ独立しており、別々のアドレス(データの住所みたいな)で管理されています。そのためデータを探しにいく際は、まずメモリ内を探し、そこにお目当てのデータがなかったら次にディスクへ探しにいきます。行ったり来たりが多いわけです。

一方IBM i はメモリとディスクが同じアドレス方式で管理されているため、OSから見るとこの二つは大きなメモリに見えます。
そのため、**レスポンスが高速**です。
使っている人はその恩恵をよくわかっていると思いますが、多くのユーザーが同時に処理をする場合や、大量データを扱うバッチ業務などにおいては特に他のサーバーよりも高いパフォーマンスを発揮できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/df2d49c4-8fee-f46a-3a81-8ba680837765.png)

単一レベル記憶に関する詳細： https://www.e-bellnet.com/category/column/1612/1612-30.html

## ④ オブジェクト
IBM i に存在する操作対象をオブジェクトと呼びます、これはIBM i における大事な設計思考の一つです。(javaなどにおけるオブジェクト指向と根本的な考え方は似ている気がします)

IBM i 上においてオブジェクトはオブジェクト名＋定義域で構成されています。ちなみに定義域というのは、オブジェクトの属性を表すもの(*PGM,*FILE,*LIBLなど)です。

```WRKOBJ```コマンドで各オブジェクトのタイプ欄でオブジェクトの定義域が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/ae7f5098-9221-bf49-d3ff-a78c4a30b2e9.png)

IBM i のオブジェクトは正式な手順、すなわち```STROBJCVN```などのコマンド操作を行わなければ属性の変更はできません。
これによって**データ(オブジェクト)の誤動作を防ぎ、セキュリティー性の向上を図ることができます。**



逆にデータ属性が簡単に変えられてしまうとどうなるのか、オブジェクト思考のOSではないMac OSを用いて例を挙げてみます。
このようにHello Worldと表示されるプログラムを、勉強の一環としてテキストファイルにメモしたとします。
![png 2023-09-28 at 11.56.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/7976f376-7b04-f2a8-2ad4-1824b6118cfe.png)

Macでは拡張子を変更するだけで、データ属性の変更ができます。
なので名称変更から、テキストファイルの拡張子.txtをApple scriptの拡張子.scptに変更するだけで、プログラムが実行可能な状態になってしまうわけです。

もしこのメモされてるプログラムがデータを全部削除してしまうプログラムだった場合、ユーザーが拡張子を間違えてしまっり、またはシステム上の誤作動で拡張子が書き換えられてしまったりでシステム上のデータが削除される危険性が出てくるわけです。

IBM i のオブジェクト思考はこのような危険性を排除してくれくれるわけです。

またこのオブジェクトの考えがあることによって自然言語に近いコマンド操作、**動詞+操作対象**、ができるとのことみたいです。
CODESYSハンズオン 【チャート：折れ線グラフ】

# はじめに
CODESYSを勉強中です。間違いなどございましたら優しく教えていただけると嬉しいです。

# CODESYSとは

CODESYSは、PLCプログラミング言語の国際標準規格であるIEC 61131-3に準拠したソフトウェアPLCです。

基本的な操作などは以下のページを参考にしました。

https://qiita.com/soup01/items/65c5702bd825fc34506b

# チャート：折れ線グラフを作る

このようなグラフを作っていきます。

![chart2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/fd7a854b-ac3b-5acb-1174-6b0920c1b071.png)

# ハンズオン(画面)

まずはCODESYSを起動して新規プロジェクトを作ってください。
その後にApplication上で右クリック→ビジュアライゼーションを追加します。

![chart0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/cd043ee8-8bd7-bb9f-4642-0f749f92cd40.png)

ビジュアライゼーションをダブルクリックで開き、デカルト座標XYグラフを追加します。

![chart1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/25c6c2cf-2bda-bd2d-7b3a-534f00f75baa.png)

グラフを選択するとプロパティを設定できる画面が表示されると思います。
XYChartをダブルクリックしましょう。
※ここでX軸とY軸の設定ができます。後述のプログラム作成編で「PLC_PRG_ST」を作ります。
X軸：PLC_PRG_ST.DataX
Y軸：PLC_PRG_ST.DataY

![chart5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/803952d9-ebc9-1445-eb3b-950798a2d934.png)

（グラフを選択→右クリック→Configure XYChart Settingからでも同じ設定画面が開きます）

![chart4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/70dc6dd5-b856-9d80-159a-0d4b44180f74.png)

# ハンズオン(プログラムST言語)

グラフに表示するデータを作っていきます。
プログラムはApplication右クリック→オブジェクトの追加→POUです。
プログラム名：PLC_PRG_ST

~~~:変数の定義
PROGRAM PLC_PRG_ST
VAR
	DataX : ARRAY [1..200] OF REAL ;//X軸のデータ
    DataY : ARRAY [1..200] OF REAL ;//Y軸のデータ
    xDoIt : BOOL := FALSE;          //TRUEの時にグラフ更新する
    ix : INT;                       //Forループ用Index
END_VAR
~~~

~~~:プログラム名：PLC_PRG_ST
IF xDoIt THEN
    xDoIt := FALSE;
    FOR ix := 1 TO 200 BY 1 DO
        DataX[ix] := (ix * 0.2) + 0.1;
		DataY[ix] := (ix * 0.1);        
    END_FOR
    xDoIt := TRUE;
END_IF
~~~

作ったプログラムはタスクに追加しましょう。

# ハンズオン(デバッグ)

作成したプログラムを動かすと以下のようなグラフが表示されると思います。
※データの更新にはxDoItをTRUEにする必要があります。




![chart2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/fd7a854b-ac3b-5acb-1174-6b0920c1b071.png)

表示するデータを少し変えてみると...

![chart6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/60b7b5ab-7768-48ea-6199-8d94fae8574f.png)

~~~
IF xDoIt THEN
    xDoIt := FALSE;
    FOR ix := 1 TO 200 BY 1 DO
        DataX[ix] := (ix * 0.2) + 0.1;
		IF ix <= 100 THEN
			DataY[ix] := (ix * 0.1);
		ELSE
			DataY[ix] := DataY[ix-1] - 0.1;
		END_IF        
    END_FOR
    xDoIt := TRUE;
END_IF
~~~

ちゃんと動いてますね。
お疲れ様でした！

いいね　や　コメント　いただけると励みになります。
よろしくお願いいたします。

# 参考ページ

https://content.helpme-codesys.com/ja/CODESYS%20Visualization/_visu_elem_xy_chart.html
Silence is golden.

ディレクトリインデックスで何のプラグインやテーマをインストールしているか隠すことができます。

https://github.com/WordPress/WordPress/blob/master/wp-content/index.php


https://github.com/WordPress/WordPress/blob/master/wp-content/plugins/index.php

https://github.com/WordPress/WordPress/blob/master/wp-content/themes/index.php
wslでelixir その66

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
elixirを1.13.4から1.14.5に上げてみた。

# 手順

- elixirを削除。

```
$ sudo apt remove elixir
[sudo] password for ore:
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
  efibootmgr libefiboot1 libefivar1
Use 'sudo apt autoremove' to remove them.
The following packages will be REMOVED:
  elixir
0 upgraded, 0 newly installed, 1 to remove and 13 not upgraded.
After this operation, 7062 kB disk space will be freed.
Do you want to continue? [Y/n] y
(Reading database ... 48559 files and directories currently installed.)
Removing elixir (1.13.4-1) ...
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...

```
- インストール

```
$ mkdir elixir_
$ cd elixir_
$ wget https://github.com/elixir-lang/elixir/releases/download/v1.14.5/elixir-otp-25.zip
$ unzip elixir-otp-25.zip

$ ls
CHANGELOG.md  LICENSE  Makefile.txt  NOTICE  README.md.txt  VERSION  bin  lib  man

$ cd bin
$ sudo cp elixir elixirc iex mix /usr/local/bin/
$ cd ..
$ cd lib
$ sudo cp -R * /usr/local/lib
$ cd ..
$ cd man
$ sudo cp * /usr/local/man
```

# 確認

```
$ iex --version
Erlang/OTP 25 [erts-13.2] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit:ns]

IEx 1.14.5 (compiled with Erlang/OTP 25)

$ elixir --version
Erlang/OTP 25 [erts-13.2] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit:ns]

Elixir 1.14.5 (compiled with Erlang/OTP 25)
```
- 問題発生

```
$ mix --version
-bash: /usr/bin/mix: No such file or directory
```

- 対処

```
$ which mix
/usr/local/bin/mix

$ sudo ln -s /usr/local/bin/mix /usr/bin/mix

$ mix --version
Erlang/OTP 25 [erts-13.2] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit:ns]

Mix 1.14.5 (compiled with Erlang/OTP 25)

```


以上。
【HTML、CSS】Tableタグ：CSS編：幅を設定してみよう！

🌻Table【CSS編】幅を設定しよう！

・tableにwidthを設定
　→th, tdの幅は自動（等幅ではない）

・th, tdに「違う値のwidth」を設定
　→大きな方に統一される

・行ごとに違う幅にしたい！
　→クラス名を付けよう！

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="NWeMQyx" data-user="tomok7" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/tomok7/pen/NWeMQyx">
  Table：CSS：スタイリングを完成させよう2</a> by tomok7 (<a href="https://codepen.io/tomok7">@tomok7</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2525847/c7c870fd-5230-2dfa-42a6-49d7834cf538.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2525847/e85703d9-a2d9-5eea-0ff1-eda8e09e11b5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2525847/5a83f65b-e001-2860-db9b-bee0a9bd2266.png)
"Node.jsとExpressでのルートハンドラーのモジュール化




## はじめに

Node.jsとExpressを利用したWebアプリケーション開発において、コードの構造化は非常に重要です。この記事では、ルートハンドラーをモジュール化する一例を紹介します。

## ルートハンドラーの設定

まず、以下のコードスニペットは、Expressのルーターを設定し、`/user`エンドポイントに対するGETリクエストがあった際に、`home`関数が呼び出されるようにしています。

```javascript
const { home } = require('../controllers/user');
const express = require('express');
const router = express.Router();

router.get('/user', home);

module.exports = router;
```

## home関数の定義

次に、ルートハンドラーで実行したい`home`関数を別のファイルで定義し、exportすればokです！

```javascript
exports.home = (req, res) => {
  res.json({ user: 'user data' });
};
```



## まとめ

このように、コントローラーを別のファイルで定義し、ルーターでインポートすることによって、コードの再利用性が向上し、メンテナンスも容易になります。これにより、開発者はより効率的かつ効果的にコードの構造化を進めることができます。
GUIを考えてみる‗Ubuntu

♯ 今まではほぼMITで出してたので、何もなかったが

:::note info
社内（誰も仲間いないけど！）向けドキュメントのチラ裏
手順書を兼ねています
:::

**参考にした記事**

https://qiita.com/StrayDog/items/664ac00839a53367f02c

1. Tkinter
1. PyQt
で考えてみました。

:::note info
Qt
セミナー受けたら早速お電話いただきました。
:::

## 見た目
**PyQtの圧勝**
- ROS関連でも関連ツールを使ったので、Windowsみたいにかっこいいかもしれない。
- ただ、GPLライセンスとあり、別に商用（売れるかどうかは別）を考えると手が出ない。

### Flash　も考えてみる

**課題**
- WebベースのGUIフレーム
- 作ろうとしているアプリがWebとの親和性ありどうなのでいいかなぁ。
- Javascriptはあまりというか、スキルがない


# ひとまずQtで作ってみた

https://github.com/mi-kaneyon/CAKO_CHAN

- 見た目いいなぁ
- PyQtがGPLなので、GPLなのか…他の方の例を見るとこのスクリプトはMITで、これはXXでと注釈あり

![cako_chan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2155177/fb31ac60-ac7c-25fd-ee74-26d0947569d1.png)

:::note info
子供向け数字学習ソフトのつもりです。　CAKO（きゃこ）ちゃんが言った数字のマイナス1を選びます。
:::

# 今後の課題
- ライセンスの非商用・商用
- デザイン
- 作りやすさ
WordPressでIntuitive Custom Post Orderが効かないときの対処メモ

直感的に記事などの表示順序並べ替えることができるIntuitive Custom Post Order。
管理画面上は入れ替わっているものの、肝心のサイトでは表示が入れ替わっていない部分があった。その際のメモ。

※ファイルの状態によってまちまちだと思うので「今回はこれで解決した」程度のメモです。要件を書くと果てしないのでファイルの構成などの細かいところの説明は省いています。また、諸事情で子テーマを作成していたため、該当の記述はその子テーマに行っています。
※WordPressとphp初心者なのでなにか間違いがあればご指摘いただけると幸いです！

https://blog.piece-web.jp/wordpress/1702.html

上記サイトによると
> WP_Query や pre_get_posts 等で「orderby」パラメータに、
「menu_order」を設定することで並べ替えが効くようになる場合があります。

とのこと。
が、そもそも上記の記述がうまいこと見つからない…。

ああでもないこうでもないとほかのサイトを見ながらいじり倒している中で、以下のサイトを発見。


https://sologaku.com/wordpress/sort-post-random/#pre_get_posts%E3%81%A7%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E8%A1%A8%E7%A4%BA

functions.phpに以下を追加。
```php
function sortpost_rand($query) {
  if(is_admin() || !$query->is_main_query()){
      return;
  }
  $query->set('orderby', 'rand');
}
add_action('pre_get_posts', 'sortpost_rand');
```
これだと単にランダムに表示されるようになるので、初めに紹介したサイトを参考にorderbyのプロパティにrandをmenu_orderに変更。

```php
function sortpost_rand($query) {
  if(is_admin() || !$query->is_main_query()){
      return;
  }
  $query->set('orderby', 'menu_order');
}
add_action('pre_get_posts', 'sortpost_rand');
```

サイトを確認したところ該当のページにIntuitive Custom Post Orderで並べ替えした内容が反映されていることを確認。

終了！

WordPress自体ど素人なのでどこをいじれば！？状態だったのですが今回は何とか解決。
phpが読み解けるようになりたい…。
powershellで使う Logger class

# powershellで使うログクラスの記録


```powershell
class Logger {
    #-------------------------------------------------------------------------------------
    # ［仕様］
    # ・ログファイルは、日付で保持する。
    # ・ログファイルは、指定ファイル数保持する。超えた場合、超えた分は削除する。
    # ・ログフォーマット：yyyy/MM/dd HH:mm:SS [log-type] [message]
    #-------------------------------------------------------------------------------------

    # variable
    [string] $log_file_dir;
    [string] $log_file_name;
    [string] $log_file_path;
    [int]    $log_file_keep_count;


    # constructor
    Logger([string]$path){
        $this.log_file_dir        = $path;
        $this.log_file_name       = "Log_" + (Get-Date).ToString("yyyyMMdd") + ".log";
        $this.log_file_path       = $this.log_file_dir + "/" + $this.log_file_name;
        $this.log_file_keep_count = 14;
        $this.OldestLogFileRemove();

    }
    Logger([string]$path, [int]$keep_count){
        $this.log_file_dir        = $path;
        $this.log_file_name       = "Log_" + (Get-Date).ToString("yyyyMMdd") + ".log";
        $this.log_file_path       = $this.log_file_dir + "/" + $this.log_file_name;
        $this.log_file_keep_count = $keep_count;
        $this.OldestLogFileRemove();
    }

    
    # method
    [void] OldestLogFileRemove(){
        $file_count = (Get-ChildItem $this.log_file_dir -File).Count;
        if ( $file_count -gt $this.log_file_keep_count ) {
            $oldestFile = Get-ChildItem $this.log_file_dir  | Sort-Object LastWriteTime | Select-Object -First 1;
            Remove-Item $oldestFile.FullName -Force;
            $this.Info("Remove: " +  $oldestFile.FullName);
        }
    }

    [int] WriteLog([string]$log_type,[string]$content){ 
        $text = (Get-Date).ToString("yyyy/MM/dd HH:mm:ss") + " [" + $log_type + "] " + $content;
        # 書き出し
        Write-Output $text | Out-File -FilePath $this.log_file_path -Encoding utf8 -Append;
        return 0;
    }
    [void] Info([string]$message) {
        $this.WriteLog("Info ", $message);
    }
    [void] Error([string]$message) { 
        $this.WriteLog("Error", $message);
    }
    [void] Debug([string]$message) { 
        $this.WriteLog("Debug", $message);
    }

}


$log = New-Object Logger("D:\PowerShell-Script\TEST-FOLDER\LOG");

$log.Info("情報ログ");
$log.Error("エラーログ");
$log.Debug("デバッグログ");
```
NeosVR コンパイラ その10

# 概要
NeosVRのオブジェクトを外部で生成するコンパイラを開発した。
遂にLogiXノードを繋いでみた。

# 写真

![2023-09-28 01.21.16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/007b16a0-558a-c5a6-8ac1-439f505da10e.jpeg)

# 俺コード

LogiXノード、TとDisplayを繋ぐコード。

```

use Ore test1
new LogiX.T
new LogiX.Display
{a} = LogiX.T
{} = LogiX.Display a
add LogiX.T
add LogiX.Display  


```

# 成果物

コンパイラはこちら。

https://embed.plnkr.co/plunk/LbFjkD6fqzPwtuKt


以上。
dbutils.notebook.run 実行時の Any international characters must be removed or replaced in workflow_context エラーへの対応方法

## 概要

`dbutils.notebook.run`実行時の`Any international characters must be removed or replaced in workflow_context`エラーへの対応方法を共有します。

## エラーと対応方法

### エラー

dbutils.notebook.run を実行すると次のようなエラーが発生する場合があります。ノートブック名やディレクトリにマルチバイト文字（日本語等）が含まれている場合に発生します。今回は`/ジョブエラー/executor`のノートブックを実行しようとしているためエラーとなりました。

```python
dbutils.notebook.run(
    "./executor",
    0,
)
```

```text
com.databricks.WorkflowException: com.databricks.common.client.DatabricksServiceHttpClientException: INVALID_PARAMETER_VALUE: Only Latin1 (ASCII) characters are currently supported. Any international characters must be removed or replaced in workflow_context
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f8450a69-43df-3e60-503d-bb5926dfe371.png)

`%run`によりノートブックを呼び出す場合には、ディレクトリ名にマルチバイト文字が含まれていても正常終了するようです。

```python
%run ./executor
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b1cd35bd-3e26-5910-7c4c-3dd47e1b4a3f.png)


### 対応方法

ノートブック名、あるいは、ディレクトリ名からマルチバイト文字を除く必要があります。`/ジョブエラー/executor`というパスであるため、`/job_error/executor`に変更することで正常終了します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/72fd4643-bf75-490f-84b3-d6ea4347ce2d.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/99814190-7a9d-5772-f088-c4cf8efe7de0.png)
【kintone/javascript】ルックアップ取得をあいまい検索したい！

# はじめに
お客さんの既存マスタが半角英数字(スペースとか入っていたり)を含むデータで、kintone標準機能のルックアップだと検索にヒットしないやん！
という方いらっしゃいませんか？
[検索したいデータがヒットしません](https://jp.cybozu.help/k/ja/id/040315.html)

「お客様、大変申し訳ございませんがこれはkintoneの仕様です。」
「毎度完全一致する文字列(まぁまぁ長い文字列)を指定して運用回避いただけないでしょうか？」
なんて言えないのがシステム屋です。

# プラグインとか無いの？
プラグインも探したのですが、APIの10,000件問題が本当に考慮されているか疑わしかったり、
マスタデータが数万レコードに及びため、APIコール数上限に簡単に引っかかるような実装仕様になっていないか不安と思う部分がありコスト掛けて購入するメリットを見いだせず。
[1日に実行できるAPIリクエスト数](https://jp.cybozu.help/k/ja/id/04044.html#limitation_limit_3040)

# どうしよう
ググっていると[こちら](https://community.cybozu.dev/t/topic/3252)の記事にたどり着きました。
ここまで揃っている参考コードがあるなら行けそう！

業務要件として
- あいまい検索できること

システム要件(制約)としては
- APIコール上限を考慮すること

この2点を追加実装することにしました。
（この場をお借りして御礼申し上げますmm まじで助かりました！）

困っている人がきっと他にいると思い共有します！
ぜひお客様の業務を軽くしてあげましょう！

# kintoneの設定
以下のアプリを作成します。
### 顧客マスタアプリ
| フィールド名 | フィールドコード | データ型 |
|:-----------:|:------------:|:------------:|
| 会社名       | 会社名        | 文字列         |
| 担当者名     | 担当者名      | 文字列       |

### 案件管理アプリ
| フィールド名 | フィールドコード | データ型 |備考|
|:-----------:|:------------:|:------------:|:------------:|
| 案件タイトル       | 案件タイトル        | 文字列         ||
| 顧客会社名       | 顧客会社名        | 文字列         ||
| 顧客担当者名     | 顧客担当者名      | 文字列       ||
|      | 要素ID：lookUpButton      | スペース       |[取得]リンクを配置するエリア|
|顧客マスタレコード番号|顧客マスタレコード番号|文字列|ルックアップみたいに詳細画面でリンク表示するためのルックアップ先のレコード番号を保持しておくフィールド|

想定シーンとしては、
案件情報を作成する際に顧客マスタから先方担当者を設定する操作でルックアップを使う、です。

# 実装内容
ルックアップ取得先が数万レコードに及ぶことから検索中に[スピナー表示(spin.js)](https://cybozu.dev/ja/kintone/sdk/library/cybozu-cdn/)を追加しました。
あと検索結果が数100件とか出てきても困るので(ノートパソコンで業務してたらかなり辛い)、modal上で絞り込みできるようにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1153679/842922b2-e8bf-9933-ddbb-f4cbd2809e77.png)


コード長いのでこちらをご参照ください。
https://github.com/koguren/kintoneJSSample
アーカイブ：直線の交点座標

```julia
function prog(x1, y1, x2, y2, x3, y3, x4, y4)
    """
    (x1,y1)と(x2,y2)を通る直線と，(x3,y3)と(x4,y4)を通る直線の交点の座標を求める
    戻り値は交点の x, y 座標。交点がない場合は (NaN, NaN) を返す。
    """
    if x1 == x2 && x3 == x4
        x = y = NaN
    elseif x1 == x2
        x = x1
        y = (y4 - y3)/(x4 - x3)*(x1 - x3) + y3
    elseif x3 == x4
        x = x3
        y = (y2 - y1)/(x2 - x1)*(x3 - x1) + y1
    else
        a1 = (y2 - y1)/(x2 - x1)
        a3 = (y4 - y3)/(x4 - x3)
        if (a1 == a3)
            x = y = NaN
        else
            x = (a1*x1 - y1 - a3*x3 + y3)/(a1 - a3)
            y = (y2 - y1)/(x2 - x1)*(x - x1) + y1
        end
    end
    return (x, y)
end;
```


```julia
prog(4, 8, 8, 0, 2, 2, 12, 7) |> println
prog(4, 1, 4, 5, -1, -1, 6, 3) |> println
prog(-1, -1, 6, 3, 4, 1, 4, 5) |> println
prog(-1, -1, 6, 3, 4, 1, 4+1e-3, 5) |> println
prog(1, 2, 5, 2, 0, 3, 8, 3) |> println
prog(1, 1, 5, 5, -1, 0, 6, 7) |> println
prog(-5, 2, -5, 8, 2, 3, 2, 7) |> println
```

    (6.0, 4.0)
    (4, 1.8571428571428568)
    (4, 1.8571428571428568)
    (4.000214316330904, 1.8572653236176593)
    (NaN, NaN)
    (NaN, NaN)
    (NaN, NaN)
アーカイブ：直線に直交する直線の切片と傾き

```julia
function prog(x1, y1, x2, y2, x3, y3)
    """
    (x1, y1) と (x2, y2) を通る直線と垂直に交わり，(x3, y3) を通る直線の切片と傾き
    戻り値は切片と，傾き
    """
    a = -(x2 - x1)/(y2 - y1)  # 傾き
    b = y3 - a*x3  # 切片
    return (b, a)
end

prog(1, 3, 5, 5, 2, 6)
```

    (10.0, -2.0)
アーカイブ：点から直線までの距離

```julia
function prog(x1, y1, x2, y2, x3, y3)
    """
    (x1, y1) と (x2, y2) を通る直線に，(x3, y3) からおろした垂線の長さを求める
    戻り値は垂線の脚の座標と垂線の長さ（直線までの距離）
    """
    a = (y2 - y1)/(x2 - x1)
    x = (x3/a + y3 + a*x1 - y1)/(a + 1/a)
    y = a*(x - x1) + y1
    return (x, y, sqrt((x - x3)^2 + (y - y3)^2))
end
```

```julia
prog(1, 0, 15, 5, 0, 6)
```

    (2.013574660633484, 0.36199095022624433, 5.986787866567181)
Storybook 7「satisfiesMeta」ってなに？

少し前にStorybookのバージョン7が登場し現在キャッチアップ中の私です。
その中でも本記事は「型安全」が向上したことについてフォーカスしたいと思います！

:::note info
本記事は勉強録です。
学習中につき誤った解釈がある場合はぜひご指摘ください…。
:::

https://storybook.js.org/blog/improved-type-safety-in-storybook-7/

## どう型の安全性が向上したのか？
Storybookの7からは必須の引数がない場合にエラーを出しくれるようになりました！

:::note warn
公式のサイトにもありますが、CSF3とTypeScript4.9　satisfies operatorの組み合わせによって実現できるのでご認識ください。
:::

## `satisfiesMeta`どうやって使うのか？
公式サイトのコードを引用して理解を深めたいと思います。

CSF2だと下記のように書かれてました。
```tsx
export default {
  title: 'Button',
  component: Button
} as Meta<typeof Button>;
```
CSF3で`satisfiesMeta`を利用すると下記のようにかけます。
```tsx
const meta = {
  title: 'Button',
  component: Button,
} satisfies Meta<typeof Button>;
```
こうすることで必須引数が不足している場合TypeScriptのエラーが出るようになります。

## まとめ
`satisfiesMeta`が利用できるようになったことで他にも嬉しいことがあるようです。
これまでStorybookには知っている程度しか触れてこなかった筆者はそのメリットを説明できるほどの知識が現時点ではありませんが、`satisfiesMeta`を使って安全な運用ができるように書き方含め学んでいきたいと思います！
サーバーサイドのデザインパターン[Repository Patternの章]

# はじめに
Repository Patternは、データアクセスロジックとビジネスロジックを分離し、アプリケーションのアーキテクチャを整理しやすくするデザインパターンです。この記事では、Repository Patternの基本概念と、Pythonでの簡単な実装例を紹介します。

# Repository Patternとは

Repository Patternは、データストアへのアクセスとビジネスロジックの分離を実現し、アプリケーションのテスト性、保守性、拡張性を向上させることができます。このパターンは、特に大規模なアプリケーションや、異なる種類のデータストアを利用する必要があるプロジェクトで有効です。

主な要点:
1. 一元化されたデータアクセスロジック:
一つのRepositoryクラスが、特定のエンティティタイプに対するデータアクセスロジックを集約します。
例: UserRepositoryはUserエンティティに対するデータアクセスロジックを提供します。

2. データストアの抽象化:
ビジネスロジック層は、Repositoryを介してデータストアにアクセスします。
ビジネスロジック層から見ると、データストアの実装詳細（データベースの種類、スキーマ、クエリ言語など）は隠蔽されています。

3. テストの容易性:
モックオブジェクトやスタブを使用して、Repositoryを単体テストできます。
ビジネスロジックをデータストアから切り離すことで、ビジネスロジックの単体テストも容易になります。

```python
class UserRepository:
    def __init__(self, session):
        self.session = session
    
    def get_user_by_id(self, user_id):
        # データストアに対する具体的なアクセスロジック
        return self.session.query(User).filter_by(id=user_id).one_or_none()
```

# Repository Patternの利点
1. コードの再利用性:
同じデータアクセスロジックを複数の箇所で再利用できます。
コードの重複が減少し、保守性が向上します。

2. 保守性と拡張性:
データストアの変更や拡張が必要な場合、Repositoryの実装のみを変更すれば良いため、影響範囲が限定されます。
新しいデータストアのサポートや、既存のデータストアの変更を容易に実施できます。

3. 読みやすく整理されたコード:
ビジネスロジックとデータアクセスロジックが明確に分離されているため、コードの読みやすさと理解の容易さが向上します。

# ベストプラクティス
1. 単一責任の原則
Repositoryクラスは、データストアへのアクセスに関する責任のみを持たせるべきです。ビジネスロジックは、サービスクラスやビジネスロジッククラスに配置しましょう。

2. インターフェースの定義
異なるデータストアが利用される可能性がある場合、Repositoryクラスに対してインターフェースを定義しましょう。これにより、異なる実装が容易になり、テストもしやすくなります。

3. 依存性の注入
Repositoryインスタンスは、依存性注入を使用してサービスクラスやコントローラクラスに提供するべきです。これにより、テストの際にモックオブジェクトを容易に注入できます。

4. クエリの最適化
Repositoryクラス内でデータアクセスを行う際には、パフォーマンスに注意し、クエリを最適化しましょう。不要なデータの取得や、N+1問題を避けるように心掛けます。

5. エラーハンドリング
データストアへのアクセス中にエラーが発生する可能性があります。適切なエラーハンドリングとエラーメッセージの提供が必要です。

例:
```python
from abc import ABC, abstractmethod
from typing import Optional

class UserRepositoryInterface(ABC):
    @abstractmethod
    def get_user_by_id(self, user_id: int) -> Optional[User]:
        pass

class UserRepository(UserRepositoryInterface):
    def __init__(self, session):
        self.session = session
    
    def get_user_by_id(self, user_id: int) -> Optional[User]:
        try:
            return self.session.query(User).filter_by(id=user_id).one_or_none()
        except Exception as e:
            # エラーハンドリングとロギング
            print(f"Error occurred: {e}")
            return None

```
VMWareの英語OSで日本語キーボードが永遠に切り替わらない時の対処方法

# ドライバの設定
* 多くの記事では以下の内容があるが、再起動しても英語のドライバーが読み込まれる現象が発生する場合はレジストリの設定を実施すると治る
1. メニューバーに`device`と入力し、`Device Manager`を開く
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325297/17a8d176-1599-5f9a-b9c4-2f4907f05254.png)

1. ツリーから`Keyboards`の`Standard PS/2 Keyboard`の`Property`を開く
1. `Driver`タブの`Update Driver`を開く
1. `Browse my computer for drivers`の`Let me pick from a list of available drivers on my computer`をクリックする
1. `Show compatible hardware`で`Japanese PS/2 Keyboard (106/109 Key)`を選択する
1. 警告が出ても`Yes`をクリックし、再起動を行う
# レジストリの設定
1. メニューバーに`regedit`と入力し、`Registry Editor`を開く
1. ツリーから`HKLM\System\CurrentControlSet\Services\i8042prt\Parameters`に移動する
1. 以下の値を変更する
   ```
   LayerDriver JPN -> kbd106.dll
   OverrideKeyboardIdentifier -> PCAT_106KEY
   OverrideKeyboardSubtype -> 2
   OverrideKeyboardType -> 7
   ```
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325297/1fc194db-fdc5-a201-4bcb-971a9969734e.png)

1. 再起動する
DataWeave メモ

## まずは公式系

- DataWeave 言語ガイド (2.4)
    - https://docs.mulesoft.com/jp/dataweave/2.4/dataweave-language-guide
- DataWeave リファレンス (2.4)
    - https://docs.mulesoft.com/jp/dataweave/2.4/dw-functions

## ChatGPT さんへの指示

TBD
Core Web VitalsのINP指標について調べたこと

Core Web VitalsのFID指標が2024年3月にINP指標に置き換わります。
対策・改善しないまま放置しておくと、SEOにネガティブな影響を与えかねないので内容を調べてみました。

## INPとは
- INP（Interaction to Next Paint）は、ユーザが画面にアクセスして離脱するまでの間に発生したユーザー操作（クリックやキーボード入力など）に対する応答性を示す指標
- 従来、FID（First Input Delay）が応答性を示す指標として扱われてきたが、2024年3月以降はINP指標で応答性が評価される

### INPとFIDの違いは？
- FIDは画面にアクセスした直後に発生したユーザー操作に対する応答性を計測するものに対して、INP指標はユーザが画面にアクセスして離脱するまでの応答性を計測する
- 例えば、`画面にアクセス > 開くボタンクリック > モーダル開く > 閉じるボタンクリック >モーダル閉じる > 移動するボタンクリック > 別画面へ遷移`する操作がある場合、FIDでは`画面にアクセス > ボタンクリック > モーダル開く`までの応答性（入力遅延）は計測するが、それ以降の例えば`閉じるボタン`クリックに以降に発生するイベントの実行にかかる時間（処理時間）や次のフレームの表示時間（表示遅延）は計測対象外
- 一方INPは、`画面にアクセス > 開くボタンクリック > モーダル開く > 閉じるボタンクリック >モーダル閉じる > 移動するボタンクリック > 別画面へ遷移`の間に発生した（ほぼ）すべてのユーザー操作に対する応答性を計測する
- 指標変更の経緯としてweb.dev曰く
> ユーザーのページ滞在時間の 90% はページの読み込み後に費やされているため、ページのライフサイクル全体を通じて応答性を注意深く測定することが重要
WPFで再帰的なTreeViewを表示する

# 始めに
WPF初心者がMVVMを用いたアプリケーションを作る過程で、自分がはまった内容を備忘録として残そうと思います。
今回はWindowsのフォルダみたいに、TreeViewをMVVMでどうやってバインドすれば良いのかはまったので記載します。
ちなみにMVVMフレームワークはCaliburn.Microを使っています。（PrismとかLivetとかの方良いか悩み中）

# XAML側
    <TreeView Name="treeview" ItemsSource="{Binding TreeViewItems}">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate DataType="{x:Type local:TreeItem}" ItemsSource="{Binding Children}">
                <TextBlock Text="{Binding Name}"/>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>
合計3つBindingしないといけない。TreeViewにBindingする必要があるのに気づかず結構はまった。

# ViewModel側
    public class MainWindowViewModel : PropertyChangedBase
    {
        private ObservableCollection<TreeItem> _treeViewItems = new ObservableCollection<TreeItem>();
        public ObservableCollection<TreeItem> TreeViewItems
        {
            get { return _treeViewItems; }
            set
            {
                _treeViewItems = value;
                NotifyOfPropertyChange(() => TreeViewItems);
            }
        }
    }

    public class TreeItem : PropertyChangedBase
    {
        private String _name = "";
        public String Name 
        {
            get { return _name; }
            set
            {
                _name = value;
                NotifyOfPropertyChange(() => Name);
            }
        }

        private ObservableCollection<TreeItem> _children = new ObservableCollection<TreeItem>();
        public ObservableCollection<TreeItem> Children 
        {
            get { return _children; }
            set
            {
                _children = value;
                NotifyOfPropertyChange(() => Children);
            }
        }
    …(省略)…
    }
用意するクラスは、2つ
 - TreeViewにBindingするTreeViewItems
 - TreeViewItemsにAddするTreeItem

TreeItemに表示用のNameと、子要素のChildrenを用意する。
ChildrenにTreeItemをAddすることで階層表示ができる。
vSphere CSIで作成したPVの実体(vmdk)を確認する

よく忘れるのでメモ。
vSphere CSIを利用して作成したPVの実体を見つける方法。

## 事前準備
適当にPVを作る。
作ったPVは以下。
```sh
$ kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                            STORAGECLASS   REASON   AGE
pvc-02f41402-9898-4a1e-a664-7c9c4fe0cf33   100Mi      RWO            Delete           Bound    testvelero/testvelero                            default                 12m
```
中身は以下。

```sh
$ kubectl get pv pvc-02f41402-9898-4a1e-a664-7c9c4fe0cf33 -o yaml
：（省略）
 csi:
    driver: csi.vsphere.vmware.com
    fsType: ext4
    volumeAttributes:
      storage.kubernetes.io/csiProvisionerIdentity: 1695574601389-8081-csi.vsphere.vmware.com
      type: vSphere CNS Block Volume
    volumeHandle: 3b3aa842-9608-4fe9-a079-8a84634b5ee7
```

## 確認
PowerCLIを使って確認する。まずPowerShellを起動する。
```sh
pwsh
```
vCenterにログインする。
```sh
Connect-VIServer wdc-10-220-153-123.nimbus.eng.vmware.com
```

ディスクの一覧を取得する。`Get-vDisk`の`-Name`でPV名を渡すと対応するvmdkが取得できる。`ft -autosize`をつけてPV名が分かるようにする。
```sh
PS /Users> Get-vDisk -Name pvc-02f41402-9898-4a1e-a664-7c9c4fe0cf33 | ft -autosize

Name                                     Disk Type CapacityGB                                                                                   Filename
----                                     --------- ----------                                                                                   --------
pvc-02f41402-9898-4a1e-a664-7c9c4fe0cf33 Flat      0.098      [vsanDatastore] faaec864-0315-3e67-0009-020017f7c942/48260b61e16e4fd4a667d9fd3b0db8fb.vmdk
```
これはデータストアの以下にあるものになる。
![1695859584318.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/b97f3941-7a0b-4dae-759a-e7ff558bfc04.png)

基本的にはfcd以下に格納される。fcd以下のどこのディレクトリに格納されるのかはよく分からない。

PVが持ってるvolumeHandleの値は`id`に相当するため、こちらから確認することも出来る。
```sh
PS /Users> (Get-vDisk -Name pvc-02f41402-9898-4a1e-a664-7c9c4fe0cf33).id
Datastore-datastore-31:3b3aa842-9608-4fe9-a079-8a84634b5ee7
```



参考文献：[Finding VMDK path from PV VolumeHandle](https://cormachogan.com/2019/10/21/finding-vmdk-path-from-pv-volumehandle/)
「State of HTML」アンケートに回答する

一昨日下記のページを発見しました！

https://stateofhtml.com/ja-JP/

「State of HTML」を見つけた時は何かな…と思ったのですが、HTMLについてのアンケートです！

:::note info
【アンケートに回答するメリット】
メリット①
> このアンケートは3週間実施されるが、最初の9日間（10月1日まで）に入力された回答は、それ以前に締め切りがある特定の優先順位付け作業に予備データが使用されるため、ウェブ上でより高い影響力を持つことになる。

（引用）
メリット②
HTMLの最新のタグや知っていても利用が少ないタグなどを復習や知ることができる
:::

アンケートには自由回答もあるので具体的であればあるほどこれからのウェブ標準に自分の意見が反映されると思うと少しワクワクしますね！

アンケートは少し長いので時間がかかりますが、わからなかったタグや機能については「あとで読む」的な機能がついているので復習しやすいような設計になっています！

HTML知識の深度を深めるきっかけにもなると思うので気になる方はぜひ見てください！
基板のパターン継ぎ

flashを剥がした時にパターンをはいでしまったので、継いで使えるようにしてみました。

忘れてしまったのですが、flashはおそらくヒートガンで剥がしました。

まず剥がしたflashからデータをflashromで読み出します。逆さまになっているので、どこが1ピンか分かりにくいのですが、ベタの角がかけてる所が1ピンです。

![写真（2023-09-28 8.02）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/9831dd3d-731b-0214-cdbd-d798050435db.jpeg)

5-8ピンは大丈夫だったので、5x2列の1.27mmのピンヘッダーを立てます。1-4はベタにハンダ付けして、固定します。ベタはグランドになってなかったんので、グランドにしました。

![写真（2023-09-28 7.59）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/fc7b78c7-9a36-6474-f784-371e375f1d4e.jpeg)

ピンヘッダーは6x2列でカットしたのですが、失敗して端っこの2個が取れてしまいました。5x2でもどうにかなります。

1,2ピンが切れたので、カッターの先でパターンを露出させ、ワイヤーとハンダ付けして、ピンヘッダーにつなぎます。パターンは弱いので、ピンヘッダーのほうを先にハンダ付けします。

![写真（2023-09-28 7.46）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/b1e88179-445e-dd7e-eaaa-e6051b234657.jpeg)

ワイヤーは0.4mmくらいです。

1.27mm-DIPの変換基板を作りました。

![写真（2023-09-28 7.59） #2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/53587833-f3d6-989e-d2c6-3199fa470cba.jpeg)

![写真（2023-09-28 8.00）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/7de6aac7-3177-b09e-5208-d5093b524000.jpeg)

WP(3)はVCC(8)に接続します。

完成です。

![写真（2023-09-28 7.48）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/b4232f0c-6650-3e9e-cdc1-cdf5f90042ed.jpeg)

DIPソケットの抜き差しは変換基板を外してからするのが良いです。

もともとSTの2MのFlashだったのですがMXの8MだとCFE(Bootloader)がサポートしてなくてpanicするのでEONの2Mを試したところ正常にboot出来ました。

BCM4712なモジュールでSPI Flashを使っているのはこのターゲットしかありません。
Apache Kafka®を使った料理【カスタマーストーリー

<font color="Grey">*[Cooking with Apache Kafka® [Customer Story]](https://aiven.io/blog/cooking-with-apache-kafka)の翻訳です。*</font>

2022年11月29日

# Apache Kafka®でクッキング[カスタマーストーリー

AivenのClusterスタートアップ企業の1つであるHuuvaは、キッチンでApache Kafka®を使用しています。彼らの革新的なコンセプトと、Clusterが彼らに与える後押しのツアーにご参加ください。

Aivenは興味深い顧客に恵まれており、これは私たちの[Clusterプログラム](https://aiven.io/cluster)の企業にとってはなおさらです。しかし、時には私たちのサービスのユースケースに遭遇し、少し説明が必要になることもあります。創業1年の[Huuva](https://www.huuva.io/)もそのひとつで、私たちは彼らのことが大好きです。


食品関連のスタートアップ企業ではおそらくトレンドになっていることだが、Huuvaは配達員を雇わず、シェフを雇っている。Huuvaのキッチンが宅配用の料理を作るのだ。


「Huuvaは、地元のレストランやブランドに対し、商品の新たな販路を提供する。ビーツであれハンバーガーであれ、私たちのキッチンが調理します」とHuuvaのソフトウェア・チームリーダー、**ティナ・ロム**は言う。「各キッチン・ロケーションのレストラン・パートナーは、そのロケーション用にカスタマイズされたメニューを提供します。顧客は、そのキッチンにあるレストランから、あるいはすべてのレストランから料理を注文することができます。"


これがHuuvaのマジックだ。あなたは中華料理が食べたいが、友人はパスタが食べたいという。2回分の宅配料を払う代わりに、Huuvaで両方を一度に注文できる。


さて、テイクアウトをめぐる深夜の口論を避ける方法はわかった。しかし、データと料理と何の関係があるのだろうか？


「厨房の仕事は鍋やフライパンやコンロでやるものだと思うかもしれませんね」とティナは笑う。でも、私たちがソフトウェアで厨房にもたらすのは、作業のしやすさです。Huuvaは、シェフたちの仕事を助けてくれるのです」。



> ![](/build/_assets/shape-quote-WGSAHX4E.svg)
> 私たちがソフトウェアで厨房にもたらすものは、作業のしやすさです。
>
>
>


一度に複数の注文がある場合、Huuvaのソフトウェアはシェフに次にできることと待つべきことを指示する。つまり、シェフが注文を順番に並べられるようにすることで、厨房がスムーズかつ効率的に、しかし急がずに作業できるようになるのだ。


## 美味しい食事のためのAiven


Huuvaの主力ソフトウェア製品は、実はHuuva Kitchensで使われているオーダー管理システムだ。複数のブランドや種類の食品を調理する職場は、いくつもの工程が重なり合う複雑な環境である。オーダー管理システムは、オーダーを論理的に表示することで、シェフの作業を容易にする。


「オーダー管理システムの背後には、複雑なコンテナベースのマイクロサービス・アーキテクチャがあります」とティナは説明する。「すべてのサービスはKubernetesクラスタで稼働しています。すべてのサービスはKubernetesクラスターで稼働しています。つまり、それぞれの目的を持った小さなサービスがたくさんあり、その目的だけを果たしているのです。これらのサービスの多くは、PostgreSQL®データベースを持っています。さらに、あるサービスにはMongoDBがあり、OpenSearch®もあります。しかし、Apache Kafka®は本当にすべての中核です。注文だけでなく、ログやその他の開発関連データも含めて、すべてのデータがApache Kafkaを通じて流れています。インフラをより簡単に監視し、すべてのキッチンで何が起きているかを知ることができます」。


## クラスターで驚異的な成長を遂げた1年


「2021年9月、フィンランドに最初の店舗をオープンしました。「2022年、私たちは世界に7つの拠点を持つことになりました。[注：インタビュー後、さらに3拠点がオープンし、10拠点になりました。］私たちは常に力強い成長を目指していたので、驚きはありませんが、満足しています"


Huuvaは当初から高い成長率に焦点を当てていたため、持続可能でスケーラブルな方法でサービスを立ち上げたいと常に考えていた。そこで、Aivenのクラスター・プログラムが登場した。


「Aivenのクラスター・プログラムが発表されたとき、応募して本当によかったと思いました。「最初からスケーラブルにソフトウェアを構築できるというのは、私たちにとって本当に貴重なことです。今はキッチンが数台しかなくても、将来は数十台、数百台になるかもしれない。その時には、もうアーキテクチャを変更する必要はありません。私たちは、キッチンのために素晴らしい機能を提供することだけに集中できるのです。"



> ![](/build/_assets/shape-quote-WGSAHX4E.svg)
> クラスター・プログラムに参加することで、私たちは最初から欲しいツールを自由に選ぶことができるようになりました。
>
>
>


「クラスター・プログラムに参加したことで、私たちは、これらのサービスの実際のコストや、維持にかかる時間を心配することなく、最初から必要なツールを自由に選択できるようになりました。だから私たちは、これが本当に前進と成長の助けになっていると感じています」とティナは言う。


「Aivenから技術的な支援も受けています。「Kafkaのようなサービスをすでに利用し、多くの経験を持っている専門家に相談することができます。彼らは、私たちがどのように物事を行うかを計画し、私たちが持っているアイデアが実際に良い方法であることを検証するのを助けてくれます。"


## 世界と向き合い、手を取り合って


しかし、Huuvaがクラスター・プログラムに参加することで得られる素晴らしいものがもうひとつある。


「Aiven・クラスターで気に入っていることのひとつは、自分たちが大切にされていると実感できることです。定期的に『調子はどう？何かしてあげられることはありますか？というような質問を定期的に受けるんです。大きな会社が小さな会社の最初の一歩を気にかけてくれるのは、本当にありがたいことです"


[Huuvaが美味しい郷土料理を提供するためにAiven Clusterがどのように役立っているか](https://img.youtube.com/vi/cFX4r-DV4q0/maxresdefault.jpg)
マネージド・データ・プラットフォームをお探しですか？[Aivenコンソールで無料トライアルにお申し込みください！[](https://console.aiven.io/signup)
［Vue3］条件分岐ざっくりまとめ

# 概要
v-ifとv-showについてざっくりまとめる。

# v-if
v-ifはjavascript等のプログラミング言語の条件分岐と同じくif、elseif、elseをディレクティブにしたもの。
v-if判定で対象とならないタグはレンダリングされない。
また、templateタグに条件分岐を付することでタグ階層が深くなることを避けることができる。

```:記法
v-if=" 条件" ...
v-else-if=" 条件" ...
v-else
```

```App.vue
<script setup lang="ts">
import { computed } from "vue";

const randomNumber = computed(
	(): number => {
		return Math.round(Math.random() * 100);
	}
);
</script>

<template>
	<p>
		点数：{{ randomNumber }}点
		<span v-if="randomNumber >= 80">優</span>
		<span v-else-if="randomNumber >= 70">良</span>
		<span v-else-if="randomNumber >= 60">可</span>
		<template  v-else>
			<div>不可</div>
			<div>がんばれ</div>
		</template>	</p>
</template>
```

```:出力結果
～80
優
79～70
良
69～60
可
59～
不可
がんばれ
```

# v-show
真偽値のみで判定を行うディレクティブ。
v-showでは常にレンダリングされstyle属性によって表示／非表示となる。
また、常にレンダリングされることからtemplateタグには使用できない。

```:レンダリング結果に付されるcss
style="display:none;"
```

```App.vue
<script setup lang="ts">
import { ref } from "vue";

const check = ref(false);
</script>

<template>
	<div>
		<input type="checkbox" name="" id="" v-model="check">
	</div>
	<span v-show="check">
		条件に合致
	</span>
</template>
```
```html:チェックON時のレンダリング結果
<span style> 条件に合致 </span>
```

```html:チェックOFFのレンダリング結果
<span style="display: none;"> 条件に合致 </span>
```
Amigo28: 2023 年の支払いを保証する信頼できる金儲けサイト


今日のデジタル時代では、多くの人がオンラインでお金を稼ぐ機会を探しています。検討する価値のある信頼できるオプションの 1 つは、Amigo28 です。 Amigo 28 は、会員に継続的に報酬を支払うことが証明されている収益サイトであり、2023 年にはその評判はさらに高まります。

Amigo28 は、オンラインでお金を稼ぐさまざまな機会を提供するサイトとしてよく知られています。登録から開始まで私たちをフォローすることで、Amigo 28 がオンライン収入の世界で最も信頼できるサイトの 1 つとみなされている理由についての洞察を得ることができます。

収入を増やす方法を探している場合、または単にオンラインで稼ぐ可能性を探りたい場合は、Amigo 28 が正しい選択となる可能性があります。
数値積分を使うことで特殊相対性理論だけで一般相対性理論の問題を解く方法

数値積分を使うことで特殊相対性理論だけで一般相対性理論の問題を解く方法を考えましたので、紹介します。
相対性理論には、特殊相対性理論と一般相対性理論があります。
特殊相対性理論の問題は、簡単な数学を使って解くことができます。
一方、一般相対性理論の問題は、特別な数学を使わないと解くことができません。
ここでは、パソコンのプログラムと簡単な数学だけで、一般相対性理論の問題を解く方法を紹介します。
要点は、特殊相対性理論の式を積分（細かく分けて足すだけ）することで一般相対性理論の問題を解くということです。
例として、ＧＰＳ衛星の時間補正（重力の影響からの）を計算してみます。
地球の重力の影響で、地表は上空よりも時間の進み方が遅れますが、どのくらい遅れるのか計算します。
```visualbasic
Dim GA, hankei, omosa, px, t1, t2, t3, c, p, g, u, v, r As Double
Dim bunkatu, i As Long

GA = 6.67 * 10 ^ -11    '万有引力定数
px = 100    '分割された１ブロックの長さ（メートル）
u = 20000000    '人工衛星と地表との距離（メートル）
hankei = 6.378 * 10 ^ 6    '地球の半径（メートル）
omosa = 5.974 * 10 ^ 24    '地球の質量（キログラム）
bunkatu = u / px    '分割数
c = 3 * 10 ^ 8    '光の速度（メートル/秒）
t1 = px / c    '静止系（地球に対して止まっている）での測定時間（光りが、分割された１ブロックを走る時間）。
v = 0    '等価原理を使い、重力を、ロケットの加速度から生じる引力に置き換える。ロケットの初速は０。
r = hankei + u    '人工衛星と地球の中心との距離。

't1 は、静止系（地球に対して止まっている）から観測した、分割された１ブロックを光が走る時間（この時間は一定）。
't2 はロケットの中での経過時間で、ロケットの速度が速くなるほど時間が遅れてくる。
't3 は、分割された１ブロックを光が走る時間の差（静止系とロケット系との時間の差）。

For i = 0 To bunkatu - 1
    g = GA * (omosa / r ^ 2)
    v = v + g * t1    '等価原理を使い、重力を、ロケットの加速度から生じる引力に置き換える。ロケットの最終速度。
    r = r - px
Next i

t2 = (t1 - v * px / c ^ 2) / Sqr(1 - (v ^ 2 / c ^ 2))     'ロケットの中での経過時間。
t3 = t1 - t2    '最後の遅れが、求める遅れ。

Text1.Text = t3 * (1 / t1)    '１秒ではどれほど遅れるか。

'結果
'5.26317633122293E-10
```


同じ計算をシュバルツシルトの時空を使って計算します。
プログラムは簡単そうに見えますが、シュバルツシルトの時空はアインシュタインの方程式から導かれる難解な式です。
```visualbasic
Dim t1, t2, c, GA, u, rx, rg, omosa, hankei As Double

GA = 6.67 * 10 ^ -11     '万有引力定数
u = 20000000     '人工衛星と地表との距離（メートル）
hankei = 6.378 * 10 ^ 6     '地球の半径（メートル）
omosa = 5.974 * 10 ^ 24     '地球の質量（キログラム）
c = 3 * 10 ^ 8     '光の速度（メートル/秒）
rx = hankei + u     '人工衛星と地球の中心との距離。

rg = 2 * GA * omosa / c ^ 2

t1 = Sqr(1 - rg / (hankei + u))     '固有時間が長くなる
t2 = Sqr(1 - rg / hankei)

Text1 = t1 - t2

'結果
'5.26322763150233E-10
```
よく使われるステータスコード９選をまとめてみた

## ステータスコードをまとめてみた

### ステータスコードの分類と意味
:::note
ステータスコードは3桁の数字で、先頭の数字によって5つに分類できる
:::

#### 分類と意味
|分類|意味||
|:-|:-|:-|
|1xx|処理中|クライアントはそのままリクエストを継続するか、サーバの指示に従ってプロトコルをアップデートして再送信する。|
|2xx|成功|リクエストが成功したことを示す。|
|3xx|リダイレクト|クライアントはこのステータスコードを受け取った時、レスポンスメッセージのLocationヘッダを見て新しいリソースへ接続する。|
|4xx|クライアントエラー|原因はクライアントのリクエストにあり、エラーを解消しない限り正常な結果は得られないので、同じリクエストをそのまま再送信できない。|
|5xx|サーバエラー|原因はサーバ側にあり、同一のリクエストを再送信して正常な結果が得られる可能性がある。|

#### 先頭の文字で分類する理由
クライアントとサーバの約束事を最小限に抑えて、クライアントとサーバの結びつきをなるべく緩やかにする、すなわち疎結合にするための工夫。

一般的にシステムが疎結合になることで、以下のようなメリットがある。
・コンポーネント間の独立性が高まる
・コンポーネントの置き換えや拡張が容易になる

またクライアントにとって未知のステータスコードが来ても、先頭の文字の約束事が守られていれば、クライアントは最低限の処理ができる。

### よく使われるステータスコード９選

#### 200 OK
リクエストが成功したことを示す。

#### 201 Created
リソースの作成成功を示す。POSTの場合、新しく作成したリソースのURIがレスポンスのLocationヘッダに絶対URIとして入る。

#### 301 Moved Permanently
リクエストで指定したリソースが新しいURIに移動したことを示す。新しいURIはレスポンスのLocationヘッダに絶対URIとして入る。
(別のURIにクライアントが自動的に再接続する処理を「リダイレクト」と呼ぶ。)

#### 303 See Other
リクエストに対する処理結果が別のURIで取得できることを示す。典型的にはブラウザからPOSTでリソースを操作した結果をGETで取得するときに使う。

#### 400 Bad Request
リクエストの構文やパラメータに間違いがあることを示す。

#### 401 Unauthorized
適切な認証情報を与えずにリクエストを行ったことを示す。レスポンスのWWW-Authenticateヘッダで、クライアントに対して認証方式を伝える。

#### 404 Not Found
指定したリソースが見つからないことを示す。レスポンスボディにその理由が入る。

#### 500 Internal Sever Error
サーバ側に何らかの異常が生じていて、正しいレスポンスが返せないことを示す。レスポンスボディにその異常の理由が入る。500は他に適切なサーバエラーを示すステータスコードがない場合にも用いる。

#### 503 Service Unavailable
サーバがメンテナンスなどで一時的にアクセス出来ないことを示す。レスポンスのRetry-Afterヘッダでサービス再開時期がおよそ何秒後であるかを通知することもできる。



### まとめ

||意味|
|:-|:-|
|200|リクエストが成功したことを示す。|
|201|リソースの作成成功を示す。POSTの場合、新しく作成したリソースのURIがレスポンスのLocationヘッダに絶対URIとして入る。|
|301|リクエストで指定したリソースが新しいURIに移動したことを示す。新しいURIはレスポンスのLocationヘッダに絶対URIとして入る。|
|303|リクエストに対する処理結果が別のURIで取得できることを示す。|
|400|リクエストの構文やパラメータに間違いがあることを示す。|
|401|適切な認証情報を与えずにリクエストを行ったことを示す。レスポンスのWWW-Authenticateヘッダで、クライアントに対して認証方式を伝える。|
|404|指定したリソースが見つからないことを示す。レスポンスボディにその理由が入る。|
|500|サーバ側に何らかの異常が生じていて、正しいレスポンスが返せないことを示す。レスポンスボディにその異常の理由が入る。500は他に適切なサーバエラーを示すステータスコードがない場合にも用いる。|
|503|サーバがメンテナンスなどで一時的にアクセス出来ないことを示す。レスポンスのRetry-Afterヘッダでサービス再開時期がおよそ何秒後であるかを通知することもできる。|


---

参考文献

技術評論者「Webを支える技術」

https://gihyo.jp/book/2010/978-4-7741-4204-3
［Javascript］関数の書き方

# 概要
JavaScriptで関数を定義する方法は大きく分けて２つ「関数宣言」と「関数式」がある。
違いはFunctionオブジェクトの生成タイミングで「関数宣言」ではコードブロックが実行する前に生成され、「関数式」はコードブロック実行時に生成される。
そのため関数宣言では関数定義より前に記述しても関数を呼び出せる。

# function【関数宣言】
functionというキーワードを使って、関数名を定義する。
どのタイミングでも呼び出せる。

```js:
function sample(args){
  console.log(args);
}
sample('hello world');
```


# 関数リテラル【関数式】
関数名を変数のように定義し、その中に関数の機能を代入するようなイメージ。
定義後でしか呼び出せない。

```js:
const sample = function(args){
  console.log(args);
};
sample('hello world');
```

# アロー関数【関数式】
アロー関数は「=>」というキーワードを使って記述する方法。
定義後でしか呼び出せない。

```js:
const sample = (args) => {
  console.log(args);
};
sample('hello world');
```

# 参考
[【JavaScript】色々な関数の書き方一覧](https://developers-book.com/2021/02/07/494/#toc5)
[JavaScriptでよく見かける3種類の関数の書き方](https://pa-tu.work/blog/javascript-function)
Amazon Security LakeはSIEMを変えるか？

![DJI_20221129_093011_75.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288030/bbb591f0-f552-2b92-21de-aa84458e6149.jpeg)
re:Invent 2022でのAmazon Security Lake発表時
# はじめに
2022年のAWS re:Inventにて発表され、5月にGAとなった「[Amazon Security Lake](https://aws.amazon.com/jp/about-aws/whats-new/2023/06/amazon-security-lake-general-availability/)」についての投稿です。
re:Invent発表当時からSIEM用途だよね、という程度で見ていましたが今更ながら試してみたいことが出てきたため頭の整理を兼ねて。

# 肥大化したSyslogを抱えて
私が社会人になった当時のセキュリティログは今思えば実に穏やかなもの。
Checkpoint社Firewall-1のログをGUIで眺めたり、Watchguard社のFireboxのLEDの点滅を眺めたり…通信を「目で追える」時代。
そして、そんな時代は一瞬で過ぎ去り通信量の激増とそれに伴う攻撃の激増が到来。さらにさらに、ログ管理の厳格化からあらゆる通信ログを保管する状況へ。
それまでのノリでログをSyslogサーバに蓄えていて、いざというときに2GBをはるかに超える量に肥大化しておりWindows（32bit当時）では開けず絶望したエンジニアが日本中にいた…よね？
さらに、ログ出力元の製品ごとにログフォーマットが異なっていたりするので、ログの検索を行うにもその違いを理解した検索手法や正規表現スキルが必須！
しかし、そんな悩みもOSの64bit化と半導体の性能向上、そして果てしないデータ保管が可能なAmazon S3や検索/分析サービス群が解放してくれました。
![s-l1200.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288030/71248568-d341-10b9-d47a-0b5790a15e4e.jpeg)
Watchguard社 Fireboxシリーズ　通信状況（permit/denyと方向）を前面パネルのLEDで見ることができた

# Amazon Security Lakeは何が違うのか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288030/e0bfe261-fb58-df35-03bd-426d6e836cec.png)

Amazon Security Lakeが提供する機能は下記となります。
- S3をベースとしたデータレイク
- 受信データをクエリ効率の高いParquet形式に変換
- OCSF（Open Cybersecurity Schema Framework） オープンソーススキーマに変換

ログの格納先としてのS3はすでに存在していたので、ポイントはParquet形式変換とOCSF変換ということになります。

# OCSFとは？
OCSFは2022年8月にBlackHat（サイバーセキュリティカンファレンス）にてデータスキーマのオープンスタンダードとして発表されました。

https://prtimes.jp/main/html/rd/p/000000011.000089232.html

OCSFは複数のIT企業によって創設され、**AWS**、Splunk、Symantec、Broadcomなどが含まれます。﻿
ポイントは、ベンダーに依存しない形式であること。ベンダーは製品に合ったスキーマを採用し必要ならば拡張することができます。従来のログの多くがベンダ固有のフォーマットで出力されている状況ですので、これは劇的な変化です。

参考　[OCSF Security Finding [2001] Class](https://schema.ocsf.io/1.0.0/classes/security_finding?extensions=)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288030/acb56833-6c7e-dec0-0b4a-25c78e609b9a.png)

# Amazon Security Lakeで何が変わる？
Amazon Security Lakeの登場でまず考えられるのは、ログの集約によるSIEMでしょう。
ただ、OCSFにより統一されたオープンなフォーマットでログが集積されるため、クラウドサービスを利用したSIEM構築がしやすくなると考えられます。また、S3に格納されることで様々な手法・製品やサービスを用いた分析が可能になります。従来はSIEM製品を如何に使いこなすかがポイントでしたが、環境や状況に応じたツールの切り替えが容易になる点でも魅力的だと思います。
民主化万歳！
オンプレミスやミドルウェアなどあらゆるログを格納することでログ分析が非常にやりやすくなるはずです。

また、組織観点ではクラウド上の様々な情報システムのセキュリティレベルが均一なのか、不安が高まってきているのではないでしょうか？
クラウド化が進む中で、SIEM的な中央監視の必要性がとても高まってきているように感じます。

# 最後に
Amazon Security Lakeは気の利いたデータレイクサービスです。
今後、各ベンダの製品でのOCSF対応が増えていくことに合わせて、価値が上がっていくサービスとなると思います。
そして、蓄えたデータは活用されてこそ価値があります。AWSが提供する各種検索サービスとの連携性の良さも、本サービス導入のモチベーションになると思います。

また、現在様々な活用が行われている生成AIとの連携ができれば面白いことができるのではないかと思っています。
Amazon Bedrockの正式リリースなどを待って試してみたいと思います！
CKAD) SecurityContext

# 概要
- コンテナに対し、指定するセキュリティー設定は個別コンテナだけ適応する
- セキュリティー設定はPodもコンテナにも設定できる


## 例）
- とあるコンテナはRoot権限を持ってないように設定してたい
- とあるコンテナからファイルを読む場合はReadonlyとして設定してほしい

## 種類

- runAsUser, runAsGroup: コンテナのプロセスで実行できるUID GIDを指定
- runAsNonRoot: コンテナがRootで実行できないように設定
- privileged mode: コンテナのNodeのRoot権限を取得
- Linux Capabilities: コンテナをPrivilegesモードとして実行し、ノードのカナルに対するすべてのアクセス権限を付与
- readOnlyRootFilesystem: プロセスがコンテナのファイルシステムで書き込むことを禁止
- supplementalGroups: 追加グループの権限を利用