OmniAICreator/Qiita-1.07M huggingface dataset:
オペレーティングシステム　第6章 仮想記憶

キーワードのまとめです。

# 6. 仮想記憶

### フェッチの方式

- どのページをいつ主記憶へ移すかを決めるための方式

### 配置の方式

- ページを主記憶のどこへ置くかを決めるための方式

### 置き換えの方式

- 空きのページフレームを作るために、主記憶からどのページを退避させるかを決めるための方式

### デマンドページング

- 実際にページが参照された時にそのページを主記憶に取り入れる方式
- 仮想記憶実現の最も一般的な方法

### プリページング

- ページを前もって主記憶に入れる方式

### デマンドプリフェッチング

- デマンドページング方式とプリフェッチング方式の組合わせ
- ページフォールト時に要求されたページ以外に将来使用が予測されるページも主記憶に入れる

### 参照間隔

- ページが次に参照されるまでの時間間隔
- 退避すべきページを決めるために使う

### LRU

- Least Recently Used
- 最も長く参照されていないページを退避ページとして選ぶ
- 時間局所性を有しているプログラムに適している

### FIFO

- First-In-First-Out
- 主記憶内に最も長くいるページを退避ページとして選ぶ
- 空間局所性を有しているプログラムに適している

### LFU

- Least Frequently Used
- 参照頻度が最小のページを退避ページとして選ぶ

### OPT

- 将来もっとも遅くにしか参照されないページを退避ページとして選ぶ

### ワーキングセット

- 過去T秒間（T単位時間）に参照されたページの集合
- ワーキングセットの概念は、もともとはプログラムを効率よく実行するために主記憶内に存在すべきページの集合の意味

### ウィンドウタイム

- ワーキングセットのページ数を調整するために現在時刻から遡る時間T

### スラッシング

- プログラムに割当てるページフレームの数を動的に変更するシステムにおいて生じ、主記憶にプログラムを入れ過ぎたためにシステムの性能が突如低下する現象
- 極端にページの出し入れが行われる状態で、プロセスはページの出し入れ以外何もしない状態になる

### 局所性

### 時間的局所性

- 時間が推移した時に、ある少数のページにアクセスが集中するというプログラムの特性

### 空間的局所性

- 主記憶上の隣接した場所にアクセスが集中するプログラムの特性

### 局所集合

- 集中して参照されるページの集合

### フェーズ化現象

- アクセスが集中するページは必ずしも一定ではなく、ある時間特定の少数のページを参照した後は、急激に別のページの組みへと切り替わることが多い

### ローカル方式

- ページフォールトを生じさせたプログラムのページのみを退避ページの対象とする

### グローバル方式

- 主記憶のすべてのページを退避ページの対象とする

### ページスティーリング

- 他のプロセスからページフレームを取り上げて割当てる

### スタックアルゴリズム

- すべてのページ参照列$w$に対し、次を満たすアルゴリズム$A$
    
    $S(A, m, w) ⊆ S(A, m+1, w)$
    
    - $w$はページに対する参照要求が出された時刻順に順序づけられたページ番号列
    - $S(A, m, w)$は容量mのページの主記憶において、$w$に対してデマンドページングによりページ置き換えアルゴリズム$A$が適用された後の、主記憶に存在するページ集合
- どのようなプログラムに対しても、主記憶の容量が増加したときページフォルトの数は増加しないと保証されている
- LRU、LFU、OPT、LIFOはスタックアルゴリズム
- FIFO、RANDOMはスタックアルゴリズムでない

### プログラム再編成

- 互いに密に参照されるブロック（プロシージャ、関数、データ構造、配列など）を同一のページにまとめ、プログラムをロードし直す
- プログラムの論理的なブロックの大きさに比べてページがかなり大きい場合に効果を発揮する
- 時間的局所性より空間的局所性を強く有するプログラムではほとんど効果がない

### ライフタイム

- ページフォールトの間の時間間隔（平均値）

### ニーポイント

- 原点からの半直線でライフタイム曲線と交わるもののうち、最大の傾きを持つ半直線と曲線の交点

### ニー基準

- ページングのコスト＝単位時間あたりのページフォールト数（$1/f$）×主記憶に割り当てられているページ数（$s$）を最小にする点（コスト性能比を最大にする点）
wslで、最小のカーネルをコンパイル その12

# 概要
wslで、kernel.elfのコンパイル、やってみた。
cで、書いたカーネルで、俺言語を組み込んだ。
zundokoを、打ち込んで、実行した。


# 写真
![スクリーンショット 2024-03-16 112208.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/162a29cb-c344-787f-2c0e-fedf9e60f5fe.png)

以上。
半角スペースを表示したいなら&nbsp;ではなくwhite-space: pre;を使いましょうという話

# 結論

半角スペースを半角スペースとして表示するには`white-space: pre;`を使います。
`pre`はおそらくpre要素のpreですね。

`white-space`はCSSプロパティです。
つまり、表示したいスペース入りのテキストを含む要素のCSSルールとして`white-space: pre;`を指定します。

https://developer.mozilla.org/en-US/docs/Web/CSS/white-space

# 例

```css
.space-text {
  white-space: pre;
}
```

```html
<div class="space-text">  hello World  </div>
```

# おわりに

連続する複数の半角スペースは1つにまとめられたり、先頭末尾の半角スペースは省略される

これははじめてHTMLに触れた人が戸惑う部分だと思います。
ではその半角スペース分の空白をどのようにして表示すればいいのかと調べれば、`&nbsp;`などの特殊文字を紹介する記事が数多くヒットします。

HTMLでの半角スペースは`&nbsp;`なんだと強引に表現するサイトもありますが、半角スペースと`&nbsp;`が異なることは調べればすぐわかります。
もう文字コードから違います。

半角スペースと`&nbsp;`は別物なのに、半角スペースを表示するために`&nbsp;`を使っていいのでしょうか？
答えは**No**だと思います。
ローカル変数とフィールドの違いについて

ローカル変数とフィールド（クラス変数とも呼ばれる）は、Javaにおける変数のスコープと寿命に基づいて異なります。以下に主な違いをまとめました。

1.スコープ（Scope）:
・ローカル変数: メソッド内で宣言され、そのメソッド内でのみアクセス可能です。
・フィールド: クラス内で宣言され、クラスの全てのメソッドからアクセス可能です。また、アクセス修飾子によってはクラス外からもアクセスできます。

2.寿命（Lifetime）:
・ローカル変数: メソッドが実行されている間のみ存在し、メソッドの実行が終了すると消滅します。
・フィールド: オブジェクトが存在する限り、つまりオブジェクトがガベージコレクションによって破棄されるまで存在します。

3.初期化（Initialization）:
・ローカル変数: 自動的に初期化されません。使用する前に明示的に初期化する必要があります。
・フィールド: 自動的にデフォルト値で初期化されます（例：int型の場合は0、オブジェクト型の場合はnull）。

4.アクセス修飾子（Access Modifiers）:
・ローカル変数: アクセス修飾子を持つことはできません。
・フィールド: public、private、protected、staticなどのアクセス修飾子を使用して、アクセスレベルを制御できます。

これらの違いにより、ローカル変数は一時的な計算やメソッド内の処理に使用され、フィールドはオブジェクトの状態を保持するために使用されます。

ChatGPT-4を活用して記事を作成しております。
JavaScriptの3つの演算子についてのまとめ


JavaScriptの論理演算子、三項演算子、nullish coalescing operatorの詳細
JavaScriptには、条件分岐や値の比較などに使用できる論理演算子、三項演算子、nullish coalescing operatorと呼ばれる3つの演算子があります。

## 1. 論理演算子
論理演算子は、2つのオペランド（式）を受け取り、論理的な値（trueまたはfalse）を返す演算子です。主な論理演算子は以下の3つです。

- && (論理積)：両方のオペランドがtrueの場合のみtrueを返します。
- || (論理和)：いずれかのオペランドがtrueであればtrueを返します。
- ! (論理否定)：オペランドの論理値を反転します。

例:
```JavaScript
const isAdult = age >= 18;
const hasDriversLicense = true;

// 論理積：年齢が18歳以上で運転免許証を持っている場合のみtrue
const canDrive = isAdult && hasDriversLicense;

// 論理和：年齢が18歳以上または運転免許証を持っている場合true
const canRentCar = isAdult || hasDriversLicense;

// 論理否定：年齢が18歳未満の場合true
const isMinor = !isAdult;
```
コードは注意してご使用ください。
## 2. 三項演算子
三項演算子は、条件に基づいて3つのオペランド（式）を評価し、結果として1つの値を返す演算子です。

構文:

```JavaScript
condition ? expression1 : expression2
```
コードは注意してご使用ください。
条件がtrueの場合、expression1が評価され、falseの場合はexpression2が評価されます。

例:

```JavaScript
const age = 17;
const message = age >= 18 ? "成人です" : "未成年です";

console.log(message); // 出力: "未成年です"
```
コードは注意してご使用ください。
## 3. Nullish coalescing operator
Nullish coalescing operator (??) は、ES2020で導入された新しい演算子です。この演算子は、左側のオペランドがnullまたはundefinedの場合に右側のオペランドを返し、それ以外の場合は左側のオペランドをそのまま返します。

例:

```JavaScript
const name = null;
const defaultName = "John Doe";

const fullName = name ?? defaultName;

console.log(fullName); // 出力: "John Doe"
```
コードは注意してご使用ください。
- 従来のnullチェックと比較:

```JavaScript
const name = null;
const defaultName = "John Doe";

let fullName;

if (name === null || name === undefined) {
  fullName = defaultName;
} else {
  fullName = name;
}

console.log(fullName); // 出力: "John Doe"
```
コードは注意してご使用ください。
Nullish coalescing operatorは、従来のnullチェックよりも簡潔で分かりやすいコードを書けるため、nullとundefinedの両方をチェックしたい場合に便利です。

## まとめ
論理演算子は、条件分岐や値の比較などに使用できます。
三項演算子は、条件に基づいて異なる値を返すことができます。
Nullish coalescing operatorは、nullまたはundefinedの値をデフォルト値に置き換えることができます。
これらの演算子を理解し、使いこなすことで、JavaScriptコードをより効率的で読みやすくすることができます。

参考資料
- JavaScriptの論理演算子: 
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Logical_Operators
- JavaScriptの三項演算子: 
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Conditional_operator
- JavaScriptのnullish coalescing operator: 
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Nullish_coales

上記の説明は、基本的なものです。より複雑な設定が必要な場合は、それぞれの演算子の詳細を調べてください。

## その他

JavaScriptの演算子についてもっと詳しく知りたい場合は、以下のリソースを参照してください。
MDN Web Docs: JavaScript の演算子: 
https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Expressions_and_operators
JavaScript Primer: 演算子:
https://jsprimer.net/basic/operator/
[LINUX]役立つサイトまとめ

①[初学者へおすすめ：LINUXコマンドを学びたい時に見るサイト](https://qiita.com/nokonoko_1203/items/35c4078bf72cffb16171)
②[経験者へおすすめ：コマンド一式を確認できるサイト](https://linux.command-ref.com/)
【Ruby】Amazon BedrockのClaude3 使ってみた。

先日、Amazon BedrockでClaude3が使用可能になりました！ 

本記事では、現在開発中のCLIツール「[omochi](https://github.com/mikik0/omochi)」で使用している Amazon Bedrock のモデルをClaude2からClaude3にアップグレードした際の変更点について紹介します。

Amazon Bedrock のモデルをClaude2 からClaude3 にアップグレードしたい方やRuby でAmazon Bedrock のClaude3 を使用したい方の参考になれば幸いです。

### 事前準備

以下の準備が完了していることを確認してください。

* Rubyのインストール
* AWSアカウントの作成
* モデルアクセスの許可

できていない項目がある場合は、以下を参考に進めてください。

https://www.ruby-lang.org/ja/documentation/installation/

https://docs.aws.amazon.com/bedrock/latest/userguide/setting-up.html

### Claude2からClaude3へのアップグレード

**Claude2で使用していたコード**

```ruby
body_data = {
  "prompt": "\n\nHuman: #{comment}\n\nAssistant:",
  "max_tokens_to_sample": 4000,
  "temperature": 0.0,
  "stop_sequences": [
    "\n\nHuman:"
  ]
}
response = bedrock_client.invoke_model({
    accept: '*/*',
    content_type: 'application/json',
    body: body_data.to_json,
    model_id: 'anthropic.claude-v2:1'
  })

string_io_object = response.body
data = JSON.parse(string_io_object.string)
code_html = data['completion']
```

**変更点**

* **anthropic_version**: Bedrockのバージョンを指定する項目を追加
* **prompt**: 従来のpromptは廃止され、代わりにmessagesオブジェクトで会話内容を定義
* **completion**: 返却値のキーがcompletionからcontentに変更

**Claude3への変更反映**

上記の変更点を反映したClaude3のコードは以下の通りです。

```ruby
body_data = {
  "anthropic_version": "bedrock-2023-05-31",
  "max_tokens": 4000,
  "temperature": 0.0,
  "messages": [
    {
      "role": "user",
      "content": "#{comment}"
    }
  ]
}
response = bedrock_client.invoke_model({
    accept: '*/*',
    content_type: 'application/json',
    body: body_data.to_json,
    model_id: 'anthropic.claude-3-sonnet-20240229-v1:0'
  })

string_io_object = response.body
data = JSON.parse(string_io_object.string)
code_html = data['content'][0]['text']
```

### まとめ

本記事では、Amazon BedrockのClaude3へのアップグレード方法について紹介しました。
Claude2からClaude3へアップグレードしたことで、レスポンスがかなり早くなりました。

**omochiについて**

https://github.com/mikik0/omochi

https://qiita.com/mikiko_bridge/items/dbb8378a41ba63e36ff7

**参考資料**

* Amazon Bedrock 公式ドキュメント: [https://docs.aws.amazon.com/bedrock/latest/userguide/](https://docs.aws.amazon.com/bedrock/latest/userguide/)
【Ruby】paizaラーニング問題集解答（スペース区切りの文字列の受け取り・カンマ区切りでの出力）

# カンマ区切りで 2 つ出力 (paizaランク D 相当)
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__specific_split_step1
### 自分の解答
```ruby:practice.rb
num = gets.chomp.split

puts "#{num[0]},#{num[1]}"
```
### ChatGPTの解答
以下は、与えられた条件に基づいて問題を解決するRubyのコードです。

```ruby
input = gets.chomp.split(' ')
puts input.join(',')
```

このコードは、入力を受け取り、半角スペースで分割して配列に格納し、それらの要素をカンマで結合して出力します。
Node.jsとは何か

Node.jsに関連する、npm、nvmが似たような言葉ばかりで理解しづらい。
大体の環境系トラブルはここに集約する（と思っている）ので、ほぼ自分用にまとめてみることにしました。

## 環境

- WSL 2
- Ubuntsu 20.04.6 LTS

## Node.jsとは

Javascriptをサーバーサイドでも使えるようにしたもの。ブラウザ側、サーバー側、双方で同じ言語が使えると効率が良いためよく使われている。

ただ、主に私がRuby on Railsを学習する中でよく出てくるNode.jsの役割とは、開発環境の補佐的な役割として使っていることが多いです。

- Node
    JavaScriptを実行するためのエンジン。
    
- npm
    Node.jsのパッケージを管理するためのツール。Node Package Managerの略。
    npmを介して様々なパッケージをインストールできる。RailsでいうところのGemと同じような役割。
    
- nvm
    バージョン切り替えツール。Node Version Managerの略。
    （npmと似ていて違いがよくわかっていなかった）
    MacOSはnodebrewが主流のようですが、私はWSLを使用しているためnvmでいきます。
    

## よく使うコマンド集

Node.jsのバージョン確認方法

```bash
node -v
```

使いたいNode.jsのバージョンを指定する。

```bash
nvm use vバージョン
```

VSCordを起動するとデフォルトのバージョンに戻っているため、都度使いたいバージョンを指定してあげる。

## 参考URL

https://paiza.hatenablog.com/entry/2018/06/08/paizacloud_nodejs
https://qiita.com/non_cal/items/a8fee0b7ad96e67713eb
https://qiita.com/righteous/items/e5448cb2e7e11ab7d477

npm周りもまとめたかったのですがこの記事が上げられなくなってしまうので割愛します…。いつか書くかもしれない。
vercelでnext.jsをデプロイすると404 not foundが表示されてしまう件

# 経緯
以下のようなフォルダ構成のGitHubのレポジトリと連携してnext.jsで構築されたfrontendをvercelにデプロイしようとしました。
ところが、404 not foundが表示されてしまったのでその解決方法を共有いたしました。
```
project
 ├backend
 └frontend
 ```
 # 解決方法
 以下のように「Root Directory」で「frontend」を、「Framework Preset」で「Next.js」をそれぞれ指定します。
![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3439167/3725b901-66af-7988-0104-8d6e9226ab4e.png)
これでデプロイすれば成功です。
当初は「Framework Preset」でデフォルト設定の「Other」のままでデプロイしてしまっており、これが原因で404 not foundが表示されていたようです。
wslで、最小のカーネルをコンパイル その11

# 概要
wslで、kernel.elfのコンパイル、やってみた。
乱数を考察。

# 乱数比較

|実験　|3の剰余|　周期|
|:-|:-|:-|
|1|マイナス有り|長い|
|2|マイナス有り|長い|
|3|ok|短い|

# 実験１

```
#include <stdio.h>

char randseed = 123;
char rand(void) {
	return (randseed = randseed * 5 - 1);
}
int main(void) {
    printf("%d \n", rand() % 3);
    printf("%d \n", rand() % 3);
    printf("%d \n", rand() % 3);
    printf("%d \n", rand() % 3);
    printf("%d \n", rand() % 3);
    printf("%d \n", rand() % 3);
    printf("%d \n", rand() % 3);
    int i = 0;
	while (i < 4)
	{
		if (rand() < 0)
		{
			printf("zun ");
			i++;
		}
		else
		{
			printf("doko ");
			i = 0;
		}
	}
	printf("doko kiyosi!!");

    return 0;
}
```

```
0 
0 
-1 
0 
1 
2 
0 
zun doko zun doko doko zun doko doko zun zun zun doko zun zun zun doko zun zun zun zun doko kiyosi!!

```
# 実験２

```

#include <stdio.h>

int a = 12;
int rand() {
	int x = a;
	x ^= x << 13;
	x ^= x >> 17;
	x ^= x << 5;
	return a = x;
}
int main(void) {
    printf("%d \n", rand() % 3);
    printf("%d \n", rand() % 3);
    printf("%d \n", rand() % 3);
    printf("%d \n", rand() % 3);
    printf("%d \n", rand() % 3);
    printf("%d \n", rand() % 3);
    printf("%d \n", rand() % 3);
    int i = 0;
	while (i < 4)
	{
		if (rand() < 0)
		{
			printf("zun ");
			i++;
		}
		else
		{
			printf("doko ");
			i = 0;
		}
	}
	printf("doko kiyosi!!");
    return 0;
}

```

```
0 
1 
0 
2 
0 
0 
-1 
zun doko zun doko zun doko doko doko doko doko zun doko zun doko doko zun zun doko zun zun zun zun doko kiyosi!!

```

# 実験３

```
#include <stdio.h>

static int randseed = 12345;
int rand(void) {
	return (randseed = randseed * 12345 + 17);
}
int main(void) {
    printf("%d \n", rand() % 3);
    printf("%d \n", rand() % 3);
    printf("%d \n", rand() % 3);
    printf("%d \n", rand() % 3);
    printf("%d \n", rand() % 3);
    printf("%d \n", rand() % 3);
    printf("%d \n", rand() % 3);
    int i = 0;
	while (i < 4)
	{
		if (rand() % 2 < 1)
		{
			printf("zun ");
			i++;
		}
		else
		{
			printf("doko ");
			i = 0;
		}
	}
	printf("doko kiyosi!!");

    return 0;
}
```


```
2 
2 
1 
2 
0 
0 
2 
doko zun doko zun doko zun zun zun zun doko kiyosi!!

```
以上。
cURL error 28: Operation timed out after 5001 milliseconds with 0 out of -1 bytes received



+ [Account Engagement External Action Error](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ZB9Fx)

サーバー側でのエラーだと思うけど... IPアドレスがブロックされているような
物体検出、トラッキングのおもろい論文をザックリまとめてみた

 個人的におもろいな～なと思った技術をまとめてみました。

 ## Tracking Any Object Amodally

 こちらのツイートをまず、見て頂きたいです。
 
 https://twitter.com/arankomatsuzaki/status/1737309414443438221?t=2hBqZZ7DsaKXiwg1BBK45A&s=19

 すごくないですか...?従来のトラッキングは、何かに遮られてしまうと見失う、それが常識でした。それを覆す技術です。

 日本語訳にすると、「あらゆる物体をアモーダルに追跡」です。アモーダルとは、物体の遮蔽された部分を補う視覚の補完機能のことです。


 [論文](https://arxiv.org/abs/2312.12433)と[Github](https://github.com/WesleyHsieh0806/TAO-Amodal)はこちらから公開されています。

 ## YOLO-World
https://twitter.com/minoaimino/status/1752946809528525262?t=BxDCFBl8CtxGePBDtK0LAA&s=19

自然言語とタックを組んだYOLOの派生のモデルです。

「なんとなくこれを検出したい」というのが実現できそうですね！


デモは[こちら](https://huggingface.co/spaces/stevengrove/YOLO-World)から.
[論文](https://arxiv.org/abs/2401.17270)、[Github](https://github.com/AILab-CVC/YOLO-World)
 
 ## YOLOv9
言わずと知れたYOLOシリーズの最先端モデルです。

![performance.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3743979/56e90022-0362-4d37-badf-010e81cc8774.png)
引用:https://github.com/WongKinYiu/yolov9

　物体検出の分野は、常に高速かつ正確なモデルを求めて進化しています。YOLOシリーズはその最前線にあり、最新のYOLOv9は、前作YOLOv8と比較して、計算効率と精度の両方で顕著な改善を実現しました。

　YOLOv9は、YOLOv8と比較して、パラメータの数を49%削減し、計算量を43%削減しながら、MS COCOデータセットにおけるAP（平均精度）を0.6%向上させました。これは、計算リソースが限られている環境でも高い性能を発揮することが可能であることを意味します。

　YOLOv9の成功の背後には、二つの重要な技術、PGI（Path Gradient Injection）とGELAN（Gradient Enhancement Layer）があります。

　YOLOv9は、高度な技術革新により、物体検出の精度と効率を同時に向上させることに成功しました。PGIとGELANの導入により、勾配の問題を克服し、より高速かつ正確な物体検出が可能になりました。YOLOv9は、物体検出技術の未来を形作る重要なステップです。
[論文](https://arxiv.org/abs/2402.13616)、[Github](https://github.com/WongKinYiu/yolov9)
GitとIntellijの使用

# 今回環境構築として下記のことを実施
- githubのアカウント作成
- githubとIntellijの連携

参考URL
- githubとIntellijの連携
https://www.teiri-student.com/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0/2022/09/intellij-idea%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6github%E3%81%AB%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%83%BB%E3%83%97%E3%83%83%E3%82%B7%E3%83%A5%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%82%92%E8%A7%A3/

# 所要時間
1hぐらい
リピータとハブ

## はじめに
今日もネットワーク知識をまとめていく。

ネットワーキングメディアには一定以上の距離制限があり、
それ以上の距離を繋ぐとノイズが影響して正しい信号が届かなくなってしまう。

そこで利用するのがリピータとハブである。

## 解説
### リピータ
- ネットワーキングメディアから送られてきた信号を増幅させたり正しい形に整形する役割がある
- 使用することで信号の届く距離が長くなる

### ハブ
- 同時に複数のデバイス同士を接続することができる
- LANを構築する際によく使用される
- リピータと同様に信号の増幅や整形を行うことができる

### 衝突ドメイン
- ハブを介している場合信号が同時に送られてきた時、信号同士の衝突が発生する
- スイッチやルータを使用することで通信の制御ができるため衝突を減らすことが出来る

### リピータの制限
リピータの信号増幅には時間がかかるため、複数台リピータを使用すると大きな遅延が発生する。
そのため以下のような使用台数のルールが決められている。
- 10BASE-Tは4台
- 100BASE-Tは2台

## 最後に
リピータやハブの役割は知っている人が多いですかね？
各ネットワーク機器の役割を知ることでデータがどのように動いているかの理解が深まっている気がします。
次回は、スイッチやブリッジをまとめていきたいです。

## 参考文献

https://www5e.biglobe.ne.jp/~aji/3min/10.html
Hilti SLAM Challenge 2022/2023をPV-LIOで試す

# 概要

気になってたデータセットで気になってたアルゴリズムを試す。

## Hilti SLAM Challenge

https://hilti-challenge.com/dataset-2022.html

https://hilti-challenge.com/dataset-2023.html

Hilti社が実施しているSLAMの精度を競うコンペ。
データセットもその都度一般公開してくれている。
2022年は建設現場＋オックスフォードにあるシェルドニアンシアター、2023年は建設現場がターゲット。
開けた場所だけでなく、階段や狭い通路が多いシーケンスもあり難易度が高い。
以前紹介した[DLIO](https://qiita.com/np_hsgw/items/ec37d2fd8c19b843777c)だと失敗するシーケンスが多い。

## PV-LIO
https://github.com/HViktorTsoi/PV-LIO

VoxelMapを使ったLiDAR-Inertial Odometry。
Githubを見ると階段でも精度良く姿勢推定できそう。

## 実験
難しそうなシーケンスでPV-LIOの性能を確認する。

* Hilti SLAM Challenge 2022
    * シーケンス名: exp10 cupola 2

狭い通路、階段の昇り降りがあるかなり難しいシーケンス。
LiDAR Odometryなのでどうしても誤差が蓄積して歪んだマップになるが、自己位置ロストがないのはすごい。

![Screenshot from 2024-03-15 07-04-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84781/b29e29e4-f025-fae2-d10b-22895bf02423.png)
![Screenshot from 2024-03-15 07-04-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84781/54838dfe-b444-c234-7a0d-10b1841c429c.png)
![Screenshot from 2024-03-15 07-05-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84781/294f281b-95e1-683f-d48c-452d6c541620.png)
![Screenshot from 2024-03-15 07-06-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84781/1eb9b382-b668-fa5a-6511-815ed8007805.png)
![Screenshot from 2024-03-15 07-06-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84781/456f8232-bb4a-8c0f-adee-5973bd3374ac.png)
![Screenshot from 2024-03-15 07-07-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84781/a77d0317-6875-a06c-d6f4-386565a6a878.png)

* hilti SLAM Challenge 2023
    * シーケンス名: site1 handheld 5

階段を使って3フロア間を移動している。exp10 cupola 2よりは開けているためきれいに姿勢推定ができているように見える。
![Screenshot from 2024-03-16 10-05-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84781/a1688397-06d6-d3ca-4deb-5a6e6bf28c4c.png)
![Screenshot from 2024-03-16 10-07-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84781/f49b6b96-24d4-4d3b-17d6-46e34207dd3e.png)
![Screenshot from 2024-03-16 10-08-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84781/974210b2-e649-f88d-b469-f2e7f96c97a4.png)
Claude3を無料で使ってみた！

# はじめに
うわさの`Claude3`を使ってみました！

# サイト
- こちらからユーザー登録、ログインできます！

https://claude.ai

- ユーザー登録時に、「Japan」を選択する必要があるため注意

![スクリーンショット 2024-03-16 9.19.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263017/68c4bad9-5e6c-dd60-02ec-7174526a9f17.png)

# 使ってみた

- ログイン後、そのまま「Start Chat」をクリック！

![スクリーンショット 2024-03-16 9.04.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263017/efcfbb79-a5ec-fd5d-6a6c-0589b18b6ac5.png)

- プログラミングの質問をしてみましたが、回答もらえました。それにしてもUIが綺麗です

![スクリーンショット 2024-03-16 9.14.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263017/526c9a80-6f13-f9ec-6448-31126ed0c08b.png)

- AWSの質問も回答してくれます！

![スクリーンショット 2024-03-16 9.16.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263017/a66b9004-ccc1-57a6-637e-357fc7045c55.png)

# 有料版
ChatGPT同様に有料版もあります！

![スクリーンショット 2024-03-16 9.24.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263017/fe371031-c475-bea2-b658-acd394b25fb1.png)

# 感想
色々なLLMツールが出てきますね。
ChatGPTが一番有名でですが、他のサービスも使っていきたいと思います！
ChatGPTとの違いなども、今後意識していきたいです💪
Claude3をDenoを使ってAPI経由で使用してみた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113494/24f9852b-5a13-4e29-b63f-59a0b1faf490.png)

## ベーシックな使い方
参考: [github/anthropic-sdk-typescript](https://github.com/anthropics/anthropic-sdk-typescript/tree/a974f6cc5f7e3cc5f2363966e60e03285c2b6d66)

```typescript
    const apiKey = Deno.env.get("ANTHROPIC_API_KEY")
    const client = new Anthropic({ apiKey })
    const message = await client.messages.create({
      model: "claude-3-haiku-20240307",
      temperature: 1.0,
      max_tokens: 1024,
      system: "馴れ馴れしい口調で", // GPTと違ってsystem promptはsystemに入れる
      messages:[{ role: "user", content: "やあ" }],
    })

    console.log(message.content);
```


### モデル一覧
Claudeのモデルは[messages.ts](https://github.com/anthropics/anthropic-sdk-typescript/blob/a974f6cc5f7e3cc5f2363966e60e03285c2b6d66/src/resources/messages.ts#L530)に定義されていますので、`claude-instance-1.2`とか`claude-3-haiku-20240307`とかもmodelプロパティに指定すれば使えます。

```typescript:messages.ts
export interface MessageCreateParamsBase {
// ...snip
  model:
    | (string & {})
    | 'claude-3-opus-20240229'
    | 'claude-3-sonnet-20240229'
    | 'claude-3-haiku-20240307'
    | "claude-2.1'"
    | 'claude-2.0'
    | 'claude-instant-1.2';
```

## 成果物
https://github.com/u1and0/gpt-cli

CLIベースのChatGPT, ClaudeのAPIクライアントです。
テキストメッセージの往復のやり取りができます。
イメージやファイルのやり取りはできません。(公式のAPIでできるので、実装すればできます。)

バイナリのインストールはこちらから。
deno compileはdenoを丸ごと固めているのでこれだけの処理なのに重たい...(90MB)

https://github.com/u1and0/gpt-cli/releases
Azure Functions を Docker コンテナーで試してみた

Azure Functions で使用される Docker コンテナーの OS は、debian 11 です。という事は、OS 内で実行できるアプリをあからじめ Docker コンテナーに用意しておけば、Azure Functions から呼び出して実行し、処理結果を受け取れるはずです。そこでまずは、Azure Functions を Docker コンテナーで試してみました。

## Azure Container Registry を用意

```bash:bash
prefix=mnrfuncd
region=japaneast

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

az acr create \
  --resource-group ${prefix}-rg \
  --name ${prefix}acr \
  --sku Basic \
  --admin-enabled true
```

## 検証用 Azure Functions アプリを作成

```bash:bash
func init $prefix --dotnet --docker

cd $prefix

func new --name http --template HttpTrigger --authlevel anonymous

func start
```

動作確認

```bash:bash
$ curl http://localhost:7071/api/http
This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.
```

## 検証用 Azure Functions を Docker で動作確認

```bash:bash
docker build -t $prefix .

docker run --rm -it -p 8080:80 $prefix
```

動作確認

```bash:bash
$ curl http://localhost:8080/api/http
This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.
```

## Docker イメージを ACR にプッシュ

```bash:bash
az acr login --name ${prefix}acr

docker tag $prefix ${prefix}acr.azurecr.io/$prefix

docker push ${prefix}acr.azurecr.io/$prefix
```

## Azure 上に Functions アプリを作成

Docker コンテナー版の Functions は B1 以上か、従量課金のプレミアムプランが必要です。

```bash:bash
az storage account create \
  --name ${prefix}stor \
  --resource-group ${prefix}-rg \
  --sku Standard_LRS

az appservice plan create \
  --name ${prefix}-plan \
  --resource-group ${prefix}-rg \
  --sku B1 \
  --is-linux

az functionapp create \
  --name ${prefix} \
  --resource-group ${prefix}-rg \
  --plan ${prefix}-plan \
  --runtime custom \
  --functions-version 4 \
  --storage-account ${prefix}stor \
  --https-only \
  --os-type Linux \
  --deployment-container-image-name ${prefix}acr.azurecr.io/${prefix} \
  --docker-registry-server-user ${prefix}acr \
  --docker-registry-server-password $(az acr credential show \
  --resource-group ${prefix}-rg \
  --name ${prefix}acr \
  --query "passwords[0].value" \
  --output tsv)
```

動作確認

```bash:bash
$ curl https://$prefix.azurewebsites.net/api/http
This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.
```

## 後片付け

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

## 参考

https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-create-container-registry?tabs=acr%2Cbash&pivots=programming-language-csharp

https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-how-to-custom-container?tabs=core-tools%2Cacr%2Cazure-cli2%2Cazure-cli&pivots=azure-functions

https://github.com/Azure/azure-functions-docker
Macのショートカットが使いこなせない


Macのショートカットが覚えられないので自分が使うショートかっとを此処に書こうと思う

- [ ] メニューバーの移動
`` Ctrl+F2 ``
- [ ] Dockの呼び出し
`` Ctrl+F3 ``
- [ ] Appの切り替え
`` Cmd+Tab ``
- [ ] 画面の分割
`` Ctrl+Cmd+F ``

- [ ] 最小化
`` Cmd+M ``

Windowsの方が使いやすい気がしてしまう、、、
ブロックをスポーンさせるスポナーを作成する

# 環境
PaperAPI : `1.20.4-R0.1`

# 完成物イメージ

<iframe width="560" height="315" src="https://www.youtube.com/embed/SquvchsQmFw?si=YJhsBkemuzjckzV2" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>


# 手順
## CreatureSpawner を取得する
まず、全ての設定をのせるスポナーを座標などから取得します。
スポナーは、機能的ブロックのインタフェースである `BlockState` の実装クラスである `CreatureSpawner` クラスなのでキャスト等を用いて取得します。
```java
// World型 world: スポナーが存在するワールド
// Location型 location: スポナーの座標を示す Location
Block block = world.getBlockAt(location);
CreatureSpawner spawner = (CreatureSpawner) block.getBlockState();
```

## FallingBlock を作成する
スポーンさせるためのエンティティを作成します。
ここで必要な Entity 型は、実際にゲーム内にスポーンさせないとうまく掴めないため、一度ブロックデータを何も設定しない状態でスポーンさせます。

```java
Entity entity = world.spawn(location, EntityType.FALLING_BLOCK.getEntityClass());
FallingBlock fallingBlock = (FallingBlock) entity;
```

:::note warn
`World#createEntity` を用いるとワールドにエンティティをスポーンさせずに掴むことができます。
しかしこの方法でスポーンさせたエンティティは、ワールドをアンロードした後に操作しようとするとメモリリークを起こすため、**私としては** `World#createEntity()` の使用を推奨しません。(このメソッドが非推奨にされているわけではなく、公式も「メモリリークを起こす危険性があるから扱いには気をつけてね」と言っているだけなので)

> _Note: The created entity keeps a reference to the world it was created in, care should be taken that the entity does not outlive the world instance as this will lead to memory leaks._
>
> [PaperMC 1.20.4-R0.1 JavaDoc RegionAccessor#createEntity()](https://jd.papermc.io/paper/1.20/org/bukkit/RegionAccessor.html#createEntity(org.bukkit.Location,java.lang.Class)) より 
---
おそらく、ワールドをアンロードする `Bukkit#unloadWorld()` や `Server#unloadWorld()` が対象のワールドのインスタンスを finalize して強制的に破棄 (を GC へ要求) するため、エンティティからの参照だけが残り続けて結果的にメモリリークが発生する、というものだと考えられます。
> [PaperMC 1.20.4-R0.1 JavaDoc Bukkit#unloadWorld()](https://jd.papermc.io/paper/1.20/org/bukkit/Bukkit.html#unloadWorld(java.lang.String,boolean))
:::

## ブロック種別を設定する
上記の手順で作成した FallingBlock を湧かせようとスポナーに登録しても空気ブロックを湧かせてしまうので、ブロック種別を変更します。

もともと持っている BlockState をコピーして取得した新しい BlockState に対して setType を実行し、ブロックの種別を変更します。

そして、コピーしたものを `FallingBlock#setBlockState()` で落下ブロックに設定し、既存の設定を上書きします。
```java
BlockState copied = fallingBlock.getBlockState().copy();
copied.setType(Material.DIAMOND_BLOCK);
fallingBlock.setBlockState(copied);
```

## 作成した FallingBlock をスポナーに登録する
```java
spawner.setSpawnedEntity(fallingBlock.createSnapshot());
```
(この `setSpawnedEntity` という関数は引数に EntitySnapshot しか受け付けないのにも拘らず、Entity から EntitySnapshot を作成する唯一の手段である `Entity#createEntitySnapshot()` が実験的なメソッドであり、動作の保証をしないことを示すアノテーションをつけられているというこのチグハグさはどうにかしてほしいところです。)

## データの更新を適用する
`BlockState` の実装クラスはすべて `update()` を実行しないことにはデータの更新が行われません。
忘れずに実行しましょう。
```java
spawner.update();
```
SAP IntegrationSuite API Management編

# API Managementの概要
Integration SuiteのAPI管理サービス
これ自体でAPIを作れるわけではなく、別であるAPIを統合管理するためのサービス

# チュートリアル
https://developers.sap.com/mission.apim-mobile-app.html
# 実装における参考資料

## APIの設定
各種APIをAPI Managementに登録設定する方法

全体像の把握（API、Product、Applicationの違いなど）

https://blogs.sap.com/2016/06/17/part-1-introduction-to-api-management/

### OData （S/4HANA）
S/4HANAのODataBTPに設定する方法

How to configure SAP Cloud Connector & Create API using SCP API Management

https://blogs.sap.com/2020/06/18/how-to-configure-sap-cloud-connector-create-api-using-scp-api-management/

### Open Connector

SAP API Management - Managing 3rd Party services via Open Connector Instances

チュートリアルでも使うHubspotをOpen Connector経由してAPIに設定する方法

https://blogs.sap.com/2019/02/20/sap-api-management-managing-3rd-party-services-via-open-connector-instances/

### Cloud Integration
Cloud IntegrationをAPIとして公開する方法
その他スクラッチで開発したAPIなどもRESTAPIとして公開可能

https://blogs.sap.com/2020/01/31/sap-api-management-discover-integration-flows-from-cpi-tenants-and-auto-generate-apis/

## 認証

バックエンドシステムの認証情報を漏らさない、同じAPIでも呼び出し先のシステムごとに異なるAPIを設定したい場合などに必要な設定
Product、Applicationなどを紐づけるAPIによって制御する

::: note
トライアルと商用環境だとBusinessHubのサービス名が何故か違うので注意が必要
:::

API、Product、Applicationなどの作り方（認証共通）

https://blogs.sap.com/2020/06/22/part-1-enable-sap-cloud-platform-api-management-in-cloud-foundry-environment/


Basic Auth

https://blogs.sap.com/2018/09/24/working-with-key-value-maps-using-sap-cloud-platform-api-management/

API Key

https://blogs.sap.com/2017/08/11/sap-api-management-rate-limiting-api-calls-per-application/

OAuth

https://blogs.sap.com/2021/11/17/oauth-2.0-authentication-for-api-management-to-connect-to-cpi/


## その他
https://blogs.sap.com/2021/09/18/csrf-token-handling-in-sap-api-management/

https://help.sap.com/docs/SAP_CLOUD_PLATFORM_API_MANAGEMENT/66d066d903c2473f81ec33acfe2ccdb4/dabee6e347f645a6805ec5b29f5d578c.html

https://me.sap.com/notes/0002872526
インタプリタは「コードを1行ずつ機械語に変換する」はガセネタ

## はじめに

多分これはガセネタです。おそらく日本だけで出回っているガセネタです。インタプリタにはそのような定義はありません。**インタプリタは「ソースコードを読み込んで意味を解釈して実行するプログラム」** です。「1行ずつ」は些細な間違いとして「機械語に変換する」は完全に間違いです。ある程度詳しい人にとっては常識だと思うのですが。

おそらくコンピュータは機械語しか動かせないから、インタプリタも最終的に機械語に変換しているはずだという**間違った思い込み**からこのガセネタは広まってしまっているのでしょう。機械語に変換するのは面倒な処理です。速くなるかもしれませんが変換処理しなくて良いのだから普通はしませんよ。

## コンパイラとインタプリタの定義

### コンパイラとは

コンパイラとは、ソースコードを元に実行可能なプログラムを生成するためのプログラムです。ユーザーは（ソースコードではなく）別に生成されたプログラムを実行します。かつてはコンパイラはソースコードから機械語に変換するものでしたが、今は中間コード（バイトコード）などに変換するコンパイラもあります。何に変換するかは関係なく、**あらかじめの変換作業を行うプログラム**がコンパイラです。

```txt
[ソースコード]
    ↓
[コンパイラ]   👈 コンパイルする（ソースコードを入力データとして実行ファイルを生成する）
    │
    │ 実行ファイルの生成（ソースコードから実行ファイルへの変換作業を事前に行う）
    ↓
[実行ファイル] 👈 ユーザーはこれを実行する（ユーザーは実行ファイルだけを持っていれば良い）
```

### インタプリタとは

インタプリタとは、ソースコードを直接実行することができるプログラムです。ユーザーはソースコードをインタプリタに渡して実行します。内部的には中間コードなどに変換されている場合がありますがユーザーはそれを意識する必要はありません。内部の変換がどうなっているかは関係なく、**コードを解釈しながら実行するプログラム**がインタプリタです。内部で機械語に変換しなければならないという定義はなく、実際に機械語に変換しているインタプリタは少数派です。

```txt:多くのスクリプト言語の場合
[ソースコード]
    ↓
[インタプリタ]  👈 ユーザーはこれを実行する（ソースコードも必要、インタプリタはソースコードを実行するため）
            ※ユーザーが本当に実行しているプログラムはインタプリタだが、感覚的にはソースコードを実行している
```

バイトコードインタプリタの場合は、事前にバイトコードコンパイラを使ってバイトコード（機械語ではなく仮想的なコンピュータ用のバイナリ）に変換します。この場合、インタプリタはソースコードではなくバイトコードを実行します。この場合も「インタプリタは機械語に変換する」という要件はありません。解釈する対象がソースコードからバイトコードに変わるだけでインタプリタの役目は同じです。

```txt:バイトコードコンパイラ＋バイトコードインタプリタの場合
[ソースコード]
    ↓
[コンパイラ]   👈 バイトコードにコンパイルする（ソースコードを入力データとして実行ファイルを生成する）
    │
    │ バイトコード実行ファイルの生成（ソースコードからバイトコードの実行ファイルへの変換作業を事前に行う）
    ↓
[インタプリタ]  👈 ユーザーはこれを実行する（バイトコードも必要、バイトコードインタプリタはバイトコードを実行する）
            ※ユーザーが本当に実行しているプログラムはインタプリタだが、感覚的にはバイトコードを実行している
```

いずれにしろインタプリタは解釈しながら実行するプログラムだと言うことです。

## Wikipediaの定義

https://en.wikipedia.org/wiki/Interpreter_(computing)

> In computer science, an interpreter is a computer program that directly executes instructions written in a programming or scripting language, without requiring them previously to have been compiled into a machine language program. 


インタプリタはプログラミング言語やスクリプト言語で書かれた命令を**機械語プログラムにコンパイルすることなく**直接実行するコンピュータ・プログラムのことであると書いてありますね。続けて３つのタイプが紹介されています。

> 1. Parse the source code and perform its behavior directly;
> 2. Translate source code into some efficient intermediate representation or object code and immediately execute that;
> 3. Explicitly execute stored precompiled bytecode[1] made by a compiler and matched with the interpreter's Virtual Machine.

1. ソースコードを解釈して直接実行する
2. ソースコードを効率的な**中間コードやオブジェクトコード**に変換して実行する
3. インタプリタ仮想マシンの**バイトコード**に変換して実行する

機械語に変換するようなインタプリタは定義されていません。

## 機械語に変換する方式だと移植性がさがる

機械語は特定のCPU固有の命令なので機械語に変換する場合、対応するCPUが限定さたり、そのCPUに対応しているかを明示しなければいけないはずです。せっかくインタプリタを作ったのに移植性を下げるようなことをしてしまったらもったいないでしょう？

## 最初のインタプリタであるLISPはどうなの？

LISPに詳しくないのでよくわかりません。機械語に変換していたのでしょうか？ はるか昔のことで当時であれば特定のCPU固有の機械語を生成してもおかしくないと思っていますが、一般的なインタプリタの定義として「1行ずつ機械語に変換する」が正しいとは思えません。

## 機械語に変換するインタプリタもあると言えばある

どこで見かけたのか忘れましたが、機械語に変換してから実行するインタプリタもあるようです。インタプリタの定義として「ソースコードを1行ずつ機械語に変換する」が間違っていると言うだけで、1行ずつ機械語に変換するインタプリタが存在しないという意味ではありません。

## さいごに

インタプリタは「ソースコードを1行ずつ機械語に変換する」という定義が正しいという根拠や、このようなガセネタはどこから生まれたのかという情報があればコメント下さい。
unityでmacビルドしたアプリのアイコンが反映されない

# 結果
- texture typeをSprite(2D and UI)→Editor GUI and Legacy GUIに変更
![スクリーンショット 2024-03-16 7.36.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3746680/5d5a83e7-6a46-1f46-389d-42d3f35c553c.png)
- playerSettingsのOverride for windows, Mac, Linuxをoffに
![スクリーンショット 2024-03-16 7.38.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3746680/c9678256-fc3f-35c2-497c-414f3c90f65d.png)

すると治った。


ちなみにspriteに戻し、overrideをonにしてみたがバグることはなかった。overrideを切り替えたタイミングで設定が更新されたとかだろうか。
Pythonで「パターンにマッチしたすべての文字列をリストで取得する(Pattern.findall)」の動作を確認してみた

# 概要

Pythonで「パターンにマッチしたすべての文字列をリストで取得する(Pattern.findall)」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/python/regex/index7.html

# 実装

以下のファイルを作成しました。
```sample.py
import re

msg = 'MA-52, JO-72, PP-45'
pattern = re.compile(r'[A-Z]{2}-[0-9]{2}')

result = pattern.findall(msg)

if (len(result) == 0):
    print('Don\'t matched')
else:
    for s in result:
        print(s)

import re

msg = 'MA-52, JO-72, PP-45'
pattern = re.compile(r'([A-Z]{2})-([0-9]{2})')

result = pattern.findall(msg)

if (len(result) == 0):
    print('Don\'t matched')
else:
    for s in result:
        print(s)
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
MA-52
JO-72
PP-45
('MA', '52')
('JO', '72')
('PP', '45')
```

# まとめ

何かの役に立てばと。
SpringBoot2.*.*と3.*.*はいろいろと違う

# MySQLとの依存関係確立に失敗
下記エラーが発生した。
```
Execution failed for task ':TestappApplication.main()'.
> Could not resolve all files for configuration ':runtimeClasspath'.
   > Could not find mysql:mysql-connector-java:.
     Required by:
         project :

Possible solution:
 - Declare repository providing the artifact, see the documentation at https://docs.gradle.org/current/userguide/declaring_repositories.html
```
# エラー内容
mysql:mysql-connector-javaが見つからない
# エラー原因
ググるとまんまの回答があった。
https://teratail.com/questions/f4suoxm30dmg7o
```
変更前
runtimeOnly 'mysql:mysql-connector-java'

変更後
runtimeOnly 'com.mysql:mysql-connector-j'
```
試してみると正常に動作し、テーブルも生成されていた。
この結果は良いことなのかChatGPT3.5に聞いてみると、
>正しい依存関係の宣言
MySQL Connector/J の依存関係をプロジェクトに追加する際は、以下のように正確なバージョン番号を指定して宣言することが一般的です。
>gradle
Copy code
>```
>runtimeOnly 'mysql:mysql-connector-java:バージョン'
>```
>ここで、バージョン には使用したい MySQL Connector/J のバージョン番号を指定します。これにより、Gradle は指定されたバージョンのライブラリをリポジトリから探してプロジェクトの実行時クラスパスに追加します。
>結論
あなたの問題が解決したのは良いニュースですが、com.mysql:mysql-connector-j という依存関係は存在しないため、おそらく他の修正が効果を発揮したか、初めのエラーメッセージの解釈に誤りがあった可能性があります。将来的に依存関係の問題に直面した場合は、依存関係の宣言を再確認し、必要に応じて正しいバージョン番号を含めることをお勧めします。

だめなのかな？
でもテーブルできてるしエラー出てないし、
さらにググると、下記のサイトを見つけた。
https://qiita.com/itawn/items/96c4d1685b4682d5607d
https://qiita.com/hiro_tsutsui/items/b14567f9ea51c38c5c23
https://blog.kinto-technologies.com/posts/2023-12-09-UpgradedSpringBoot2to3
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide
いろいろと情報を残していただいて感謝。
どうやらSpringBootが2から3になった際にかなり変更があったようで、MySQLのJDBCドライバーも変更となったようだ。
>MySQL JDBC Driver
>The coordinates of the MySQL JDBC driver have changed from mysql:mysql-connector-java to com.mysql:mysql-connector-j. If you are using the MySQL JDBC driver, update its coordinates accordingly when upgrading to Spring Boot 3.0.

私が使用している教材がSpringBoot2.7.8に対し、私がSpring Initializr生成したプログラムがSpringBoot3.2.3であったため、このような現象が発生した。
# 結果
結果的に対応は正しかった。ChatGPTはソースが最新の情報ではないことがあるということが改めて確認できた。
HTML: event処理記述で省略できるっぽいもの

htmlのtagに直接event処理を記述すると省略できるものがある。
`window`, `document`, tagの要素自身を指すobjectである(他にもあるかどうかは不明)。そのため以下のような記述は正常に処理される。
```html
<a onclick="console.log(id,href,title,URL,style)">a</a>
```
3つのobjectいずれかで共通の属性を持つ場合、参照される優先順位は event起動要素 > document > window となるっぽい。
そんな訳でdocument.titleを参照したい場合はdocumentは省略できない。
```html
<title>0</title><a onclick="console.log(document.title,title)" title=1>a</a>
```
以下の実験では面白い事が起こる。最初のclickではdocument.URLが参照され、2回目以降はa要素のURLが参照される。
```html
<a onclick="console.log(URL);this.URL=++id">a</a>
```
優先順位の都合上、以下のような処理は異常停止となる。`self.URL`、`top.URL`、`window.URL`等と記述すべし。
```html
<a onclick="URL.createObjectURL(new Blob([]))">a</a>
```
以下の場合click連打でa要素が増殖。訳が分からない。当然a要素以外は消滅する。
```html
<a onclick="write(outerHTML)">a</a>
```
では以下の場合何が起こるか? なんと盛大にerror祭りが開催されます。body要素のonloadでは何も省略できない模様。ついでに`this`が指すものはbody要素ではなくwindow。
ちなみにiframe、img、svg要素のonloadでは省略祭り開催中で、thisが指すものも要素自身となる。
```html
<title>0</title><body onload="console.log(title)" title=t>
```
## 参考記事
[iframeを使った手品](https://qiita.com/mashuel/items/4f84188a2cf7a8f37271)
Quipのまとめ

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)




# 言語設定

+ [Quip in Japanese ?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Yw7bJ)

:::note
Please check this article.

Change Language Settings in Quip
https://help.salesforce.com/s/articleView?id=sf.quip_change_language.htm&type=5
:::


# The value of the "id" parameter contains a character that is not allowed or the value exceeds the maximum allowed length. Remove the character from the parameter value or reduce the value length and resubmit. If the error still persists, report it to our Customer Support team. Provide the URL of the page you were requesting as well as any other related information.

+ [Quipでのエラー](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HESVeSAP)


:::note
 As per today`s reply from SF tech, They fixed the issue. I did not observe any issues since today.
:::


# できないこと

+ [商談のフィールドとして画像を保存している場合、何らかの方法でこれを Quip 文書に挿入できますか?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007bLDgI)

:::note
そうは思いません。Salesforce 画像フィールドを Quip 文書に直接挿入することはできません。 Quip は現在、Salesforce 画像フィールドからのデータの表示をサポートしていません。

ただし、考慮できる回避策がいくつかあります。

画像を手動で挿入する:   Salesforce 商談レコードから画像をダウンロードし、Quip ドキュメントにアップロードします。
数式項目を使用する (回避策):  画像 URL が商談のテキスト項目に保存されている場合は、画像をアイコンとして表示する数式項目を Salesforce に作成できます。その後、Quip 文書で数式フィールドに言及できますが、これでは画像を表すアイコンのみが表示され、画像そのものは表示されません。
:::
Windows Server 2022 に Windows Terminal をインストールする

インストールに数時間かかったのでメモ。

Windows Server は Windows Store がないため Windows Terminal をストアからインストールすることができません。


1. Windows terminal 本体
https://github.com/microsoft/terminal/releases
github からダウンロードできますが、ダウンロードしたファイル (msixbundle) をダブルクリックしてもインストールできません。
書いている時点での Release は v1.19.10573.0

2. Microsoft.UI.Xaml v2.8.x
https://github.com/microsoft/microsoft-ui-xaml/releases
Windows Terminal をインストールするために必要です

3. デスクトップ ブリッジ用の C++ ランタイム フレームワーク パッケージ
https://learn.microsoft.com/ja-jp/troubleshoot/developer/visualstudio/cpp/libraries/c-runtime-packages-desktop-bridge
Windows Terminal をインストールするために必要です

これらをインストールする必要があります。

通常インストールされるバージョン 5.1.20348.2227 の PowerShell を使ってインストールします。
7.4 とかでは実行できません。

現状のバージョンでのインストールコマンド
```powershell:install.ps1

cd ${HOME}\Downloads

Invoke-WebRequest -Uri https://aka.ms/Microsoft.VCLibs.x64.14.00.Desktop.appx  -outfile Microsoft.VCLibs.x64.14.00.Desktop.appx
Add-AppxPackage -Path .\Microsoft.VCLibs.x64.14.00.Desktop.appx

winget install --id=Microsoft.UI.Xaml.2.8  -e

Invoke-WebRequest -Uri https://github.com/microsoft/terminal/releases/download/v1.15.3465.0/Microsoft.WindowsTerminal_Win10_1.15.3465.0_8wekyb3d8bbwe.msixbundle -outfile Microsoft.WindowsTerminal_Win10_1.15.3465.0_8wekyb3d8bbwe.msixbundle
Add-AppxPackage -Path .\Microsoft.WindowsTerminal_Win10_1.15.3465.0_8wekyb3d8bbwe.msixbundle
```

実行後にはダウンロードしたファイルを削除してください。
バージョンを更新する際には上記の Web ページから確認して URL を更新してください。

---- 8< ------- 8< ------- 8< ------- 8< ------- 8< ------- 8< ------- 8< ------- 8< ----
※めも
Start-ThreadJob
https://learn.microsoft.com/ja-jp/powershell/module/threadjob/start-threadjob?view=powershell-7.4
で、同時実行数を指定してバックグランドでコマンドを実行できる。


https://learn.microsoft.com/ja-jp/windows/package-manager/winget/

winget をインストール？
```
Install-PackageProvider -Name NuGet -Force
Install-Module -Name Microsoft.WinGet.Client -Force -Repository PSGallery
Repair-WinGetPackageManager
Repair-WinGetPackageManager -AllUsers   
```

これだけで OK？
```
winget install Microsoft.WindowsTerminal
```

全部いる？
```
winget install Microsoft.VCLibs.Desktop Microsoft.UI.Xaml.2.8 Microsoft.WindowsTerminal
```
初めてのExpress学習メモ

# 環境
node : v18.19.1
dependencies: {
　　ejs: 3.1.9,  　　　 //動的なHTMLの為のテンプレートエンジン
　　express: 4.18.3
}


# 目次
- Expressの立ち上げ

https://expressjs.com/ja/api.html


- bootstrap (CSSのため)

https://qiita.com/engineerhikaru/items/9b274ea3662f381e2266


- EJS　(動的HTMLのため)
- nodemon(ホット)

以降追加予定

- (API)




## Expressでサーバー立ち上げまで
コマンド

```
//expreeディレクトリ作成
mkdir my-express-api
cd my-express-api

//npm初期化してexpreeインストール
npm init -y
npm install express

//サーバー起動用のファイル作成
touch index.js
```









- index.jsの中身

```
//express　インポート
const express = require ('express');
const app = express();


//このディレクトリのパスのpublicを使う
app.use(express.static(path.join(__dirname,'public')));

//このディレクトリのパスのviewsを使う
app.set('views' , path.join(__dirname,'views'));
app.set('view engine','ejs');


app.get ("/",(req,res)=>{
    console.log("get 1");
    //res.send({"test":1});
    res.render('home');
});

app.get("/db",(req,res)=>{
    const num = Math.floor(Math.random()*10)
    res.render('db',{rand:num})
})

app.get ("/serch",(req,res)=>{
    const {q}= req.query;
    console.log(`クエリ：${q}`);
    res.send({"test":1});

});

app.use((req,res)=>{
    console.log('リクエスト');
   //res.send('responce !!!');
    
});

app.listen(3000,()=>{
console.log('3000で受信中');

});
```

appの使い方

https://expressjs.com/ja/api.html#app




### bootstrap導入(必要なら)
今回はv4.5を使用

Compiled CSS and JSをダウンロード

https://getbootstrap.jp/docs/4.5/getting-started/download/

/public/css
/public/js
を作成、そこに入れる


### EJS導入(必要なら)

```
npm install ejs
```

index.jsの中身を変更
```
// ビューエンジンとしてEJSを設定
app.set('view engine', 'ejs');

//使い方
app.get('/', (req, res) => {
  res.render('index', { title: 'Express + EJS' });
});

```





## Tips
! [tab] でEJSがHTMLのテンプレ作成

app.setはExpressアプリケーションで設定を定義するために使われるメソッドです。このメソッドを使って、アプリケーションレベルの設定を行うことができます。例えば、テンプレートエンジンの設定やポート番号の設定などがこれに該当します。

コードの例で見ると、app.set('view engine','ejs');は、Expressに対してEJSをビューエンジン（テンプレートエンジン）として使用するように指示しています。これにより、EJSテンプレートファイルをレンダリングする際に、拡張子.ejsのファイルを自動的に探し、それらをHTMLに変換してクライアントに送信することができます。

このapp.setメソッドは非常に柔軟で、様々な種類の設定をアプリケーションに適用するために使用されます。設定のキー（この場合は'view engine'）と値（この場合は'ejs'）を指定することで、Expressアプリケーションの振る舞いを調整することができます。


## railsと比較して
以下が言語されていてわかりやすい


https://blog.nnn.dev/entry/2022/11/09/110000
PostgreSQLのauto vacuumの謎についての所感と推測

# 起

これはPostgreSQLのDBを見守る一人のDBエンジニアの所感と推測で、間違っているかもしれませんが、現象としてこういうことがあるというメモ書きとしてこれを残します。

PostgreSQLのタプルとはなにかとか、行がどうやってファイルの中におさまってるかを知っておくと書いてあることがイメージしやすいです。

yamamotodinはPostgreSQLについて、明確に意識したバージョンとして 7 から、断続的に 8, 9 , 11, 15 と見てきました。
9以前はオンプレで、11以降はAzureだったりAWSだったりとクラウド上にあるDBです。
今ではdockerでインスタンスを起動して実験したり開発もします。
同じくらいMySQLも使います。

時間的な長さとしては・・曖昧なんですがちゃんとDBのエンジニア（あるいはチューナー）としてPostgreSQLと相対したときから１５年間くらいちょくちょくつきあってるんじゃないかなと思います。

# 承

そんな私が見た中で「auto vacuumが行われてるはずだけど動いてないように見えてるけどなんで？統計情報とかクソ狂うんだけど」という現象の発生するデータベース(テーブル？)が稀にあります。
逆に頻繁にCRUDしてるけど適切に断片化の解消や統計情報の更新が行われるテーブルもあります。

この差はなんなのかほんとにわからないけれど、現象から仮説を立てられる程度には情報を得たと思うので少しまとめてみたいと思います。

# 転
まず公式の auto vacuum のドキュメントを読んでみましょう。
ANALYZEが行われるタイミング？について下記の記述があります。

https://www.postgresql.jp/docs/15/routine-vacuuming.html

> 25.1.6. 自動バキュームデーモン
> ...
> 解析閾値 = 解析基礎閾値 + 解析規模係数 * タプル数

ふむ、ワイ頭わるいからわからん。
というか和訳されたらほんとにわからなくなるのが技術文章、原典をあたろう・・

https://www.postgresql.org/docs/current/routine-vacuuming.html

が、長期間統計情報が更新されないテーブルは、コレをすり抜ける何かがあるということだろうな。

> analyze threshold = analyze base threshold + analyze scale factor * number of tuples

つまり、システムパラメータの `autovacuum_analyze_threshold` と `autovacuum_analyze_scale_factor` で同じことをする、と言いたいんだな。

AWS RDS で PostgreSQL 11 と 15 で同じ数字でした・・ということは両者で変化はない、ということだな。
だったらまた断片化しますね。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570665/ba1324d7-18a1-2ce9-086b-75f48dd05814.png)

なお、 `autovacuum_analyze_threshold` が空白の場合デフォルトの `50` タプルが使用される。

不可解なのは、autovacuum_analyze_scale_factor = 0.05 ということ。
単純に考えると、 5% 増えたら統計情報更新するゼ・・って言ってるように見えるけど、前述の通り更新されないケースがある。

しきい値は **タプル数** であるため、

> x = 50 + 0.05 * テーブルの全体のタプルの数

x が前回ANALYZEかかったときより多ければ再度ANALYZE..

いくつかのパターンで考えてみよう

たとえば最後にANALYZEしたのが　１０，０００ 行（タプル）になったときだとしよう。
そこから次のANALYZEが発生するタイミングは下記の通り

> x = 50 + 0.05 * 10,000
> x = 550

つまり 550 行増えたとき。

テーブルのタプルの数が10万行だとこの数字は 5050 だし、 100 万行だと 50050 だろう。

・・・すり抜ける隙、なくない？

# 結？
だが事実として統計情報が更新されていないのか、はてまた別な要因かよくわからんけど実行時間が長くかかるケースはある。

あ、**VACUUM FULL**をかけると解決するあたり、統計情報ではなくAUTO VACUUMで行われる**通常のVACUUMでは回収できない**死にタプルの多さによる性能劣化と見るべきか・・・

正解だか不正解だかはよくわからん。
ほんとによくわからん、未来のyamamotodin君、引き続きよろしく頼む。

# 補遺
運用中のDBにホイホイとロックが必要なVACUUM FULLかけられんのだよ。
Dicordでのbot作成におけるSSL?のエラー

# Dicordでのbot作成におけるSSL?のエラー
discordでbotを作ろうと思って簡単なところから始めたが、参考サイトでは出ていなかった”SSLCertVerificationError”というエラーの解決に時間がかかったので、ここにどうしたかをメモしておきます。

と言っても、次のサイトを参照しただけですので、こちらを参照することを強くお勧めします。

https://tektektech.com/python-ssl-certification-verify-failed/


# 結論から
するべきことはFinderから
Macintosh HD -> Application -> Python
に入って
Install Certidication Command
を実行する

# ここから先は備忘録
## OpenSSLとは
暗号通信のためのオープンソースソフトウェア。SSL(Secure Sockets Layer)

https://e-words.jp/w/OpenSSL.html

## 何が問題だったか
まず持ってPython自体の問題だった。
pythonのバージョンによって、SSLモジュールが使用されないらしい。
VSCode PythonのBlack Formatter、Flake8、isortインストールと設定

# はじめに
VSCodeでPythonコードを作成する時、使用しているVSCodeの拡張機能(Black Formatter、Flake8、isort)のインストールと自分が使っている設定を整理した。

# Black Formatter
Pythonコードを自動的にフォーマットするツール

https://marketplace.visualstudio.com/items?itemName=ms-python.black-formatter

# Flake8
Pythonのコードをチェックするツール

https://marketplace.visualstudio.com/items?itemName=ms-python.flake8

# isort
インポートの順序をフォーマットするツール

https://marketplace.visualstudio.com/items?itemName=ms-python.isort

# 設定
VSCodeのsetting.jsonで以下のコードを作成する。
例には1行の最大文字数を100にしている。
```json:setting.json
  "[python]": {
    "editor.defaultFormatter": "ms-python.black-formatter",
    "editor.formatOnSave": true,
    "editor.codeActionsOnSave": {
      "source.organizeImports": "explicit"
    }
  },
  "black-formatter.args": ["--line-length=100"],
  "flake8.args": ["--max-line-length=100"],
  "isort.args": ["--profile", "black"]
```
Reactで出力したフォーム系タグのイベント属性に設定した関数を別の関数内で発火させる

:::note warn
注意
今回の記事で用いる手法はReact-domのバージョンが16.11までのもので確認できたものです。
それ以降のバージョンでは動作しない可能性があります。ご了承ください。
:::

Reactのrender部分でフォーム系タグへイベント属性を記載している場合、実際に画面に出力された際のフォーム系タグの中にはイベント属性が記述されていません。

```html:render部分の記述
<select id="id_aa" className="class_aa" onChange={(e)=>this.changeHandler(e)}>
    <option label="bb" value="1">bb</option>
    <option label="cc" value="2">cc</option>
</select>
```
```html:出力された際の記述
<select id="id_aa" class="class_aa">
    <option label="bb" value="1">bb</option>
    <option label="cc" value="2">cc</option>
</select>
```

そのため、render部分の記述でonChange属性に指定した関数を、別の関数内で`.onchange`を用いて発火させようとしても、出力された記述ではonChange属性が入っていないためか発火しませんでした。

ではどうやって発火させるかというと、以下の記述を用います。
```js
const element = document.querySelector("指定したいid名やclass名");
const event = new Event('input', { bubbles: true});
event.simulated = true;
element.value = "設定したいvalue";
element.defaultValue = "設定したいvalue";
element.dispatchEvent(event);
```
イベントオブジェクトに`simulated`という特殊なプロパティがあり、それをtrueにすることで可能になる。
また、イベントオブジェクトの`bubbles: true`も必須。

最初に記載した、render部分の記述コードのonChange属性に指定した関数を別関数で発火させる記述例としては以下となります。
イメージとしては、別に設置したボタンをクリックした際、ボタン独自の挙動と一緒にセレクトボックスの選択内容を変更させ、変更した際のイベントを発火させる感じです。
```html:render部分の記述
<select id="id_aa" className="class_aa" onChange={(e)=>this.changeHandler(e)}>
    <option label="bb" value="1">bb</option>
    <option label="cc" value="2">cc</option>
</select>
<button onClick={(e) => this.otherButtonHandler(e)}>セレクトボックスの選択をccにする</button>
```
```js:buttonタグのonClickに設定した関数
otherButtonHandler(e) {
    const element = document.querySelector("id_aa");
    const event = new Event('input', { bubbles: true});
    event.simulated = true;
    element.value = "2";
    element.defaultValue = "2";
    element.dispatchEvent(event);

    //以後、ボタン独自の挙動
    ～～～
}
```

自分が見つけた方法としては以上となりますが、もし他に良い方法があったりすれば教えていただけると助かります。
Laravel11アップデート内容②【データベース】

Laravel11がリリースされたので、
どんな変更点があるのか[Release Notes](https://laravel.com/docs/11.x/releases)や[LaravelDaily](https://laraveldaily.com/)の情報を元にまとめてみます。

第二弾です。

※第一弾は[こちら](https://qiita.com/mumucochimu/items/dbf8e910e8a59a973658)

## SQLite

laravel11ではデフォルトのデータベースがSQLiteになっています。

>これにより、追加のソフトウェアをインストールしたり、追加のデータベース移行を作成したりすることなく、新しい Laravel アプリケーションを作成した後すぐにアプリケーションの構築を開始できます。

とのことですが、
SQLiteのこと全然知らないのでちょっと調べてみました。

### 特徴

- RDBMS
- 軽量な造り（本体ファイルサイズは600KB程度）
- メモリの消費量が少ない
- サーバ構築が不要
- パブリックドメイン

セットアップも簡単なのですぐにサクッと始められるようですね。
小規模プロジェクト用みたい。

やっぱり今回のLaravelのテーマは「軽量化」なんですね。

設定などは今まで通り`config/database.php`に記述するようです。


### その他データベース

SQLiteがデフォルトですが、他4つのデータベースに関してもサポートを提供しているようです。

```
MariaDB 10.3
MySQL 5.7
PostgreSQL 10.0
SQLite 3.35.0
SQL Server 2017
```

### SQLiteからの変更方法

デフォルトでは`.env`ファイルが以下のようにSQLiteで使わない設定はコメントアウトされてます。

```
DB_CONNECTION=sqlite
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=laravel
# DB_USERNAME=root
# DB_PASSWORD=
```

例えばMySQLを使いたいとなった場合は以下のように書き換えます。

```
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
DB_COLLATION=uca1400_ai_ci
```

`DB_COLLATION=uca1400_ai_ci`このように記述しないとマイグレーションでエラーになるという記事をいくつか見ました。
まだ検証できてないけど後で確認してみよう。

では、今回はここまでにします！