OmniAICreator/Qiita-1.07M huggingface dataset:
MySQLで大量データを一括格納する方法: Bulk InsertとLOAD DATAの使用例


こんにちは。
データベースの学習に入り、はや2週間が経とうとしています。
最近のハイライトはサンプルデータを使ってあれやこれやMySQLの練習をしようと思ったら、テーブル設計にミスがあるのが発覚し、一から作り直す羽目になったことです。どうもjunpei314です。

## はじめに
データベース設計の勉強をしている際に、テーブルを作成できたはいいものの、大量のサンプルデータを格納するにはどうすればいいのだろうと思い色々と調べてみました。
今回は、大量のデータをテーブルに格納する方法をまとめてみます。

## 実行環境
MacBook Air (M1)
MySQL8.0

## サンプルデータ
以下のサンプルデータを使用する
#### prefectures
|id|name|
|--|----|
| 1|北海道|
| 2|青森県|
| 3|岩手県|
|--|-----|
|46|鹿児島県|
|47|沖縄県|


## 1.一括で格納する(Bulk Insert)
下記の様に記述することで省略してデータを格納できる
```sql
INSERT INTO table_name (id, name)
VALUES
    (1, '北海道'),
    (2, '青森県'),
    (3, '岩手県'),
    -------------
    (46, '鹿児島県'),
    (47, '沖縄県');
```
## 2.テキストファイルを直接テーブルにロードする
### 2-1. LOAD DATAを使う
```sql
LOAD DATA LOCAL INFILE 'ファイルパス'
INTO TABLE prefectures
COLUMNS TERMINATED BY ','
LINES TERMINATED BY '\n'
(id, name);
```
##### 
`COLUMNS TERMINATED BY ','`
入力ファイル内の各カラム（列）がどの文字で区切られているかを指定する
`LINES TERMINATED BY '\n'`
入力ファイル内の各行がどの文字で区切られているかを指定する

##### 下記のエラーが出ることがある
```terminal
mysqlimport: Error: 3948, 
Loading local data is disabled; 
this must be enabled on both the client and server sides, 
when using table: programs
```
MySQLサーバがローカルデータのロードを許可していないために発生している模様
以下のコードで設定ファイルのステータスを確認する
```sql
SELECT @@local_infile;
```
データロードの設定がオフの場合は以下の様に出力される
```title:出力結果
+----------------+
| @@local_infile |
+----------------+
|              0 |
+----------------+
1 row in set (0.00 sec)
```
以下のコードを実行しデータをロードできるようにする
```sql
SET GLOBAL local_infile=on;
```
```title:出力結果
+----------------+
| @@local_infile |
+----------------+
|              1 |
+----------------+
1 row in set (0.00 sec)
```

再度、`LOAD DATA LOCAL INFILE` を実行する 

### 2-2. mysqlimportを使う
```shell
mysqlimport -u ユーザー名 -p --local データベース名 ファイル名

```
##### 注意点
- mysqlimportは指定したファイル名からテーブル名を推測するため、ファイル名はテーブル名と同じものにする必要がある
    - prefecturesテーブルにテキストファイル内のデータを格納する場合は、あらかじめprefectures.tsvなどの様にしておく
- デフォルトではタブで列を、改行で行を区切るため、特にオプションで指定しない場合はtsvファイルにする必要がある
    - カンマで列を区切る場合は`--fields-terminated-by=','`を追記する
- ファイル名を複数設定することで一度に複数のファイルをロードすることができる



## まとめ
今回は効率的にデータをテーブルに格納する方法をまとめました。
SQLスクリプト内でデータのロードを行いたい場合や、他のSQLクエリと組み合わせてデータのロードを行いたい場合は、LOAD DATA LOCAL INFILEを使用してみてください。
また、シェルスクリプトからデータのロードを行いたい場合、または複数のファイルを一度にインポートしたい場合は、mysqlimportを使用してみてください。
 
## 参考URL

[LOAD DATA INFILEの使い方（実践編）
](https://rooter.jp/infra-ops/load-data-infile/)

[[MySQL] テーブルにファイルをインポートする – mysqlimport編
](https://blog.katsubemakito.net/mysql/mysqlimport)

[MySQL8でインポート・エクスポート](https://qiita.com/yes_dog/items/57c1a8c03aff8bb177de)

[MySQL 8.0 リファレンスマニュアル LOAD DATA ステートメント
](https://dev.mysql.com/doc/refman/8.0/ja/load-data.html)

[MySQL 8.0 リファレンスマニュアル INSERT ステートメント
](https://dev.mysql.com/doc/refman/8.0/ja/insert.html)

[MySQL 8.0 リファレンスマニュアル mysqlimport — データインポートプログラム](https://dev.mysql.com/doc/refman/8.0/ja/mysqlimport.html)
TensorflowモデルをTensorflowLiteモデルに変換する方法


## 結論

[Tensorflow Lite Converter](https://www.tensorflow.org/lite/models/convert/#input_model_formats) を使用する。
Tensorflow Lite Converterとは、訓練済みのモデルをTensorflow Lite モデルに変換するツールのこと。


## 変換の流れをざっくり説明

モデルを変換する手順を以下の図に示す。
TensorFlow Lite 形式に変換するときは、ML モデル(変換前のモデル)の内容に応じて大きく3つのフローに分かれることを抑えておくと良い。

1直接変換
2モデルをリファクタリングしてから変換
3高度な変換手法を使用して変換
![Pasted image 20230517170038.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2107276/59813665-5023-5085-c3bc-95f429fc6845.png)
**図 1.** TensorFlow Lite 変換ワークフロー。
引用：[Tensorflow公式: モデル変換の概要](https://www.tensorflow.org/lite/models/convert/#conversion_workflow)
基本的には1直接変換できるのだが、稀に2,3のように追加の手順が必要なことがある。変換したいモデルに追加手順が必要かどうかは、[オペレーター互換性](https://www.tensorflow.org/lite/guide/ops_compatibility) をみるとわかる。


## 変換可能なモデルの形式

-   [SavedModel](https://www.tensorflow.org/guide/saved_model) (**_推奨_**): ディスク上にファイルのセットとして保存された TensorFlow モデル。
特記：SavedModel は TensorFlow のトレーニング済みモデルまたはモデルピース用の標準的なシリアル化形式のこと。学習済みの重みや計算を実行するためのTensorFlow 演算が含んでいる。言語に依存することなく推論を行うことが可能。

-   [Keras モデル](https://www.tensorflow.org/guide/keras/overview): 高レベルの Keras API を使用して作成されたモデル。
-   [Keras H5 形式](https://www.tensorflow.org/guide/keras/save_and_serialize#keras_h5_format): Keras API でサポートされる SavedModel 形式の軽量代替形式。
-   [具体的な関数から構築されたモデル](https://www.tensorflow.org/guide/intro_to_graphs): 低レベルの TensorFlow API を使用して作成されたモデル。


## モデルを変換してみる ! 

Tensorflow Lite Converterは、TensorFlow モデルを受け取り、TensorFlow Lite モデルを生成できる。SavedModel をロードすることも、コードで作成したモデルを直接変換することもできる。

### 1. やり方を確認
→推奨されている SavedModel の変換を行う

```python
import tensorflow as tf

# モデルをコンバートする
# saved_model_dirは変換したいモデルのディレクトリ
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir) 
tflite_model = converter.convert()

# 変換したモデルを保存する
with open('model.tflite', 'wb') as f:  f.write(tflite_model)
```

[Tensorflow公式: TensorFlowモデルを変換する](https://www.tensorflow.org/lite/models/convert/convert_models?hl=ja)

### 2. 実際にやってみる

今回は、色々な学習済みモデルがダウンロードできるTensorFlow Hubから
物体・骨格検知モデルの[CenterNet](https://tfhub.dev/tensorflow/centernet/hourglass_512x512_kpts/1)をダウンロードして、そちらをTensorflow lite モデルに変換する。

(1)TensorFlow Hub からローカルにダウンロードする。
![Pasted image 20230518001440.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2107276/19e3fe05-1a2d-b42e-e806-040bf9fa4353.png)

ローカルにダウンロードして解凍すると、以下のような構成になっている。
.pd ファイルがモデルファイル。
![Pasted image 20230518002025.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2107276/87531344-2154-eaa3-1eb4-8d471135cd9d.png)

(2)変換する
- 実装
```python:convert.py
import tensorflow as tf

input_dir = ".\\centernet"

converter = tf.lite.TFLiteConverter.from_saved_model(input_dir)
tflite_model = converter.convert()

open(".\\output_dir\\converted_model.tflite", "wb").write(tflite_model)
```

- 実行結果
![Pasted image 20230518002453.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2107276/825453a3-bfde-b699-cbc9-ede75ec3f33e.png)
output_dirに Tensorflow lite モデルに変換されたモデルファイル(.tfliteファイル)が出力されているのがわかる。無事に変換できた。
【PlantUML】文字の大きさを変更する方法


## デフォルト

```
@startuml 
hide circle

entity "<b>users" as users {
+<u>id : integer [PK]
--
name : string
email : string
password : string
avatar : string
created_at : datetime <now>
updated_at : datetime <now>
}

@enduml
```


```plantuml
@startuml 
hide circle

entity "<b>users" as users {
+<u>id : integer [PK]
--
name : string
email : string
password : string
avatar : string
created_at : datetime <now>
updated_at : datetime <now>
}

@enduml
```

## 全体的に変更する
```:sample.pu
@startuml 
skinparam ClassFontSize 30
hide circle

entity "<b>users" as users {
+<u>id : integer [PK]
--
name : string
email : string
password : string
avatar : string
created_at : datetime <now>
updated_at : datetime <now>
}

@enduml
```

```plantuml
@startuml 
skinparam ClassFontSize 30
hide circle

entity "<b>users" as users {
+<u>id : integer [PK]
--
name : string
email : string
password : string
avatar : string
created_at : datetime <now>
updated_at : datetime <now>
}

@enduml
```

## 部分的に変更する


```:sample.pu
@startuml 
hide circle

entity "<b><size:30>users" as users {
+<u>id : integer [PK]
--
name : string
email : string
password : string
avatar : string
created_at : datetime <now>
updated_at : datetime <now>
}

@enduml
```


```plantuml
@startuml 
hide circle

entity "<b><size:30>users" as users {
+<u>id : integer [PK]
--
name : string
email : string
password : string
avatar : string
created_at : datetime <now>
updated_at : datetime <now>
}

@enduml
```
Zendeskでコードブロックにシンタックスハイライト当ててみた

### はじめに
Zendeskカスタマイズ案件でコードブロックにシンタックスハイライトを当てたいお客さんがいたので、prismやら試しましたがhighlight.jsが一番気軽に導入できました。

### 初期状態
デフォルトのコードブロックだとこんな感じで、他の要素と比べて少し背景がクリーム色になるくらいで特にハイライトは適用されてません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1953297/abb6e070-bf91-d3bb-3b94-90804d6cc36b.png)

### hightlight.jsダウンロード
[hightlight.jsの公式サイト](https://highlightjs.org/)でハイライトを当てたい言語を選択し、ダウンロードボタンを押下するとzip形式でファイルが取得できるかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1953297/d93a8c0f-78f7-5082-1a48-3fa9229bef15.png)

いろいろとhighlight.jsを活用しているサイトを回りましたが、どれもhighlight.pack.jsを使用するとしていました。現行のバージョン(11.7.0)ではそのファイルはなかったので、highlight.min.jsを使用します。他のサイトをみても慌てないでください。大丈夫です。

### テーマ選択
hightlight.jsではどのようなテーマでハイライトを実現したいか選択することができます。[このデモページ](https://highlightjs.org/static/demo/)のサイドバーでお気に入りのテーマを決めてください。今回はspacemacsを使用します。Emacsに近いハイライトを実現できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1953297/95f17ecd-2a07-f9cb-b64c-c08a7b51b5ab.png)

先ほどダウンロードしたファイルのstylesフォルダを見てみると、各テーマのハイライトを実現するファイルがあります。さっき決めたテーマのファイルがあることを確認しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1953297/3bc6da48-a345-26a2-0fbc-f2063b46d37d.png)

### Zendesk設置
hightlight.jsを使用してZendeskのコードブロックにハイライトを当てるために必要なファイルは```highlight.min.js```と```spacemacs.min.css```の2つです。ハイライトを実現したいZendeskテーマのカスタマイズに行きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1953297/533a54fd-1463-5f88-9f05-4d092d2b2ff7.png)

ここでファイルの横にある「追加ボタン」に「アセット」とあるので、ここに先程の2ファイルをアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1953297/1221d605-2343-46b2-40f7-14f4efe23b41.png)

### ファイル埋め込み
埋め込んだファイルをクリックすると以下内容が確認できるかと思うので、Templateの内容をコピーしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1953297/d57773da-0492-f6a6-ced2-9bc7a83db667.png)

そしたら```document_head.hbs```に以下のコードを設置します。
```document_head.hbs
<link rel="stylesheet" href="{{asset 'spacemacs.min.css'}}">
<script src="{{asset 'highlight.min.js'}}"></script>
<script>hljs.initHighlightingOnLoad();</script>
```

「保存」と「公開」をして記事画面を確認してみると、選択したテーマでハイライトが実現できました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1953297/4c9dfecd-36f0-32bb-1984-60699bdf018e.png)

### 最後に
今回は綺麗にハイライトを構築できましたが、もし```document_head.hbs```に設置しても反映されない場合はキャッシュを削除してみてください。それでも上手くいかない場合は```footer.hbs```にも先程の3行コードを設置して再度確認してみてください。
dockerをwsl2にインストール

https://docs.docker.com/desktop/windows/wsl/

この記事を参考にしました。

https://learn.microsoft.com/ja-jp/windows/wsl/install

Error code: Wsl/Service/0xd00002fe
https://superuser.com/questions/1765401/wsl-1-keeps-crashing-with-error-code-0xd00002fe

このようなエラーがでた。


wslではなく、powershellでwsl1からwsl2にupgradeをして、Docker　Desktopでupgradeに伴う、設定をすることで出来ました。
「/etc/samba/smb.conf」、　[global]セクションで使用されるパスワードに関わる主な設定項目

●Sambaの設定ファイル「/etc/samba/smb.conf」には3つの特別なセクションである[global]、[homes]、[printers]セクションと、個々の共有の設定を行う任意の名前のセクションがあります。

●[global]セクションで使用されるパスワードに関わる主な設定項目

・username map=ファイル名　ユーザ名のマッピング情報を格納したファイルを指定
・guest account=ゲストユーザ名　ゲスト承認を許可する場合、ゲストユーザのユーザ名を指定
・map to guest=Never|Bad User|Bad Password　Sambaユーザとして承認できなかった場合の対応を指定。
Never→ゲスト承認を許可しない。
Bad User→存在しないユーザの場合はゲスト承認とする。存在するユーザでパスワードミスの場合はゲスト承認を許可しない
Bad Password→パスワードミスの場合もゲスト承認とする
・encrypt passwords=yes|no　暗号化されたパスワードを使用するかどうかを指定
・unix password sync=yes|no　LinuxとSambaのパスワードを同期させるかどうかを指定
・password program=プログラム名　Samba側でパスワードを変更した際に実行させるパスワード変更用のプログラムを指定
・password chat=文字列　パスワード変更用のプログラム(passwd program)向けの対話スクリプトを指定
・null passwords=yes|no　空のパスワードを許可するかどうかを指定
Vimの使い方

# Vimの使い方
## 行番号を表示する
### コマンドラインモードで、次のコマンドを実行する。
```
:set number
```

## Vimでカーソル移動
### 行移動と1文字移動
```
・[j] 下に移動
・[k] 上に移動
・[l] 後に移動
・[h] 前に移動
```

### ワード単位で移動
```
・[w] 次の単語の先頭に移動
・[b] 前の単語の先頭に移動
・[e] 次の単語の末尾に移動
```

### 先頭・末尾に移動
```
・[$] 行の末尾にジャンプ
・[^] 行の先頭にジャンプ
```

### テキスト全体の先頭と末尾に移動
```
・[gg] テキスト全体の先頭にジャンプ
・[G] テキスト全体の末尾にジャンプ
・[(number)G] (number)行にジャンプ
```

### %で、対応するカッコに移動
```
・[%] 対応するカッコに移動
```

### 数字で移動を繰り返す
```
数字を押してキーを押すと、そのキーの移動を数字分繰り返す。
・[5w] 5ワード分、次に移動
・[5b] 5ワード分、前に移動
・[5j] 5行下に移動
・[5k] 5行上に移動
```

## テキストの削除と取り消し
### 削除と取り消しの基本
```
・[x] カーソル位置の文字を削除する
・[X] カーソル前の文字を削除する
・[u] 直前の操作を取り消す
```

### いろいろな文字削除
```
・[dw] 単語末尾までと空白を削除する
・[dd] 行を削除する
```

### いろいろな操作の取り消し
```
・[u] 操作の取り消し
・[U] 行全体の操作を取り消し
・ctrl+r 取り消しの取り消し
```

### キーの組み合わせで操作する
```
Vimでは、操作を組み合わせて利用できます。このとき基準になるのが、カーソルの移動キーです。たとえば、「w」キーで単語単位でカーソルを移動しました。これを削除の「d」キーと組み合わせると、その位置から単語の末尾と空白を削除します。
数字の「2」に続けて「w」キーで単語2つ分移動したので、「d2w」と入力すると、単語2つ分を削除します。
それから、「$」(ドル)マークで行の末尾まで移動するので、「d」と「$」(ドル)マークを組み合わせると、現在の位置から行末までを削除します。
このようなルールは、ノーマルモードの多くの機能で利用できます。
```

## コピーと貼り付け
### 貼り付け
```
削除・コピーしたテキストを貼り付け
・[p] カーソルの後ろに貼り付け
・[P] カーソルの前に貼り付け
```

### コピー(yank)
```
・[yw] 単語をコピー
・[y2w] 複数の単語をコピー
・[yy] 1行コピー
```

### ビジュアルモード
```
ビジュアルモードでは、カーソル移動で範囲を選択する
・[v] ビジュアルモードに切り替える
```

## 検索とマーク
### 1文字検索
```
・[f*] 右方向にある「*」の文字に移動する
・[F*] 左方向にある「*」の文字に移動する
・[;] 1文字検索を繰り返す
・[,] 逆方向に、1文字検索を繰り返す
```

### テキスト検索
```
・[/(keyword)] 下方向に検索
・[?(keyword)] 上方向に検索
・[n] 次の候補に移動
・[N] 前の候補に戻る
```

### 検索の便利な機能
```
カーソル位置の単語を検索する
~ [*]

上下の矢印キーで、検索履歴を呼び出す
~ [/][↑][↑]

正規表現で検索
~ [/][^app]

正規表現で、先頭からインデントした「message」を検索
~ [/][^\s*message]
```

### 名前を付けてマークする
```
現在の行に「a」という名前を付ける
~ [m][a]

「a」マークの行にジャンプする
~ ['][a]

マーク一覧を表示する
:marks
```

## 正規表現でテキストを検索・置換しよう
### 基本的な置換
```
before という単語を after という単語に置換する例
:%s/before/after/g
```

### 指定行の間で置換
```
:10,20s/before/after/g
```

### 確認しながら置換
```
:%s/before/after/gc

y -> yes:置換する
n -> no:置換しない
a -> all:すべて置換
q -> quit:置換を終了する
```
Rustのターゲット別の`#[cfg_attr]`を1分で確認する方法

ネイティブの都合に関わったり、`#![no_std]`対応したりすると自然と関わることになる`#[cfg_attr]`ですが、自分が望むターゲットはどんな値を持っているんだろう、と一度は思いますよね？しかし、オンラインで検索して`#[cfg_attr]`自体の[公式解説](https://doc.rust-lang.org/reference/conditional-compilation.html)にたどり着いても、例示こそありますが具体的なターゲットごとの値は書いていません。
コンパイルして確認するしか無いのかと思いきや、`rustc`はそれを1分で確認する方法を持っています：

```sh
rustc --print cfg --target=${YOUR_RUST_TARGET}
```

たったこれだけです。例として、`rustc 1.71.0-nightly (e77366b57 2023-05-16)`時点での`wasm32-unknown-unknown`に対する出力を以下に示します。

```
$ rustc -vV
rustc 1.71.0-nightly (e77366b57 2023-05-16)
binary: rustc
commit-hash: e77366b57b799dfa3ce1fcb850c068723a3213ee
commit-date: 2023-05-16
host: x86_64-unknown-linux-gnu
release: 1.71.0-nightly
LLVM version: 16.0.2
$ rustc --print cfg --target=wasm32-unknown-unknown
debug_assertions
overflow_checks
panic="abort"
target_abi=""
target_arch="wasm32"
target_endian="little"
target_env=""
target_family="wasm"
target_feature="mutable-globals"
target_feature="sign-ext"
target_has_atomic
target_has_atomic="16"
target_has_atomic="32"
target_has_atomic="64"
target_has_atomic="8"
target_has_atomic="ptr"
target_has_atomic_equal_alignment="16"
target_has_atomic_equal_alignment="32"
target_has_atomic_equal_alignment="64"
target_has_atomic_equal_alignment="8"
target_has_atomic_equal_alignment="ptr"
target_has_atomic_load_store
target_has_atomic_load_store="16"
target_has_atomic_load_store="32"
target_has_atomic_load_store="64"
target_has_atomic_load_store="8"
target_has_atomic_load_store="ptr"
target_os="unknown"
target_pointer_width="32"
target_thread_local
target_vendor="unknown"
```
最近気になっているviteについてまとめてみた！

# 概要
ブロックチェーン技術の進化により、分散型アプリケーション（DApps）の需要が急速に拡大しています。その中でも、私はVite（ヴィット）はプラットフォームに注目しています。本記事では、Viteの特徴や利点、そして開発者やユーザーに与える影響について詳しく紹介します。

vite(ヴィート:フランス語で素早いという意味)は高速でスケーラブルな分散型アプリケーションプラットフォームです。Viteは、ブロックチェーン技術を使用して、分散型アプリケーション（DApps）の開発と展開を容易にします。

# 主な特徴と利点
### Viteの特徴的な要素は、次のとおりです：

### 1.スケーラビリティ(拡張性)：
Viteは、スケーラビリティに焦点を当てた設計がされています。Viteでは、主ブロックチェーンとサイドチェーンを組み合わせることで、高速なトランザクション処理(一連の操作を全体として一つの処理として管理すること)を実現しています。

### 2.ダイレクトアクリング：
Viteでは、ダイレクトアクリングと呼ばれる仕組みを採用しています。これにより、ユーザーはブロックをマイニングする必要がなくなり、即座にトランザクションを実行することができます。

### 3.オープンな経済モデル：
Viteは、オープンな経済モデルを採用しており、開発者やユーザーによるエコシステムの成長を促進しています。Viteトークン（VITE）は、プラットフォーム内での様々な活動に使用され、経済的なインセンティブを提供します。

### 4.スマートコントラクト対応：
Viteはスマートコントラクトをサポートしており、独自のアプリケーションを作ることができます。

### 5.ユーザーエクスペリエンスの向上：
高速なトランザクション処理やインスタントなトランザクション確定により、Viteは優れたユーザーエクスペリエンスを提供します。待ち時間や遅延が少ないため、ユーザーはスムーズかつ迅速にアプリケーションを操作できます。

# 結論

Viteは、高速かつスケーラブルな分散型アプリケーションプラットフォームとして、開発者やユーザーに多くの利点をがあります。高速なトランザクション処理、ダイレクトアクリング、オープンな経済モデル、スマートコントラクトのサポートなど、その特徴は多岐にわたります。今後のブロックチェーン技術の発展において、Viteが果たす役割はますます重要となると思います。
参照元:https://ja.vitejs.dev/guide/
【Codeium】完全無料のコード提案AIをVSCodeで使ってみた

# はじめに
これまでXcodeやAndroidStudioでCodeiumを使う方法を記事にしてきました。

https://qiita.com/SNQ-2001/items/b66e889d0cfef925a19f

https://qiita.com/SNQ-2001/items/9edbb8de096443855779

今回はVSCodeでの方法を記事にします。

# Codeiumのアカウントを作成する
こちらからアカウントを作成してください
特に難しいところはないです。

https://codeium.com/account/register

# やりかた
① 左側にある「拡張機能」のメニューを選択します
② `Codeium`を検索します
③ アイコンが水色の方の「インストール」を選択します
![スクリーンショット 2023-05-17 22.26.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/e8d3c747-03e9-3f5f-877b-b0548c65b156.png)

④ 右下に出てくるポップアップの「Login」を選択します
![スクリーンショット 2023-05-17 22.32.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/c7ea0eab-f941-1ad7-08cc-91a0dca2811c.png)

⑤ 「許可」を選択します
![スクリーンショット 2023-05-17 22.35.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/4c9bac94-f503-c8f8-9339-646a7d4a0780.png)

⑥ 「開く」を選択します
![スクリーンショット 2023-05-17 22.36.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/f1f3677b-ea2a-3272-322a-76f5692abc94.png)

⑦ ブラウザに遷移すると以下のようなポップアップが表示されるので「Visual Studio Codeを開く」を選択します
![スクリーンショット 2023-05-17 22.37.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/bb91e842-9554-b0a9-1184-4a80ba36886c.png)

⑧ 「開く」を選択します
![スクリーンショット 2023-05-17 22.39.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/a5aaf064-d91e-13b6-2987-0f89e9294b0b.png)

⑨ 「開く」を選択します
![スクリーンショット 2023-05-17 22.40.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/03ff54d5-4940-fe83-3555-10c4f9e5eea3.png)

認証できたようです！！
![スクリーンショット 2023-05-17 22.43.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/df2f6de8-1155-a962-ef33-179f5bee7ec9.png)

# 使ってみる
サジェストが表示されました!!
![スクリーンショット 2023-05-17 23.06.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/dc4547e8-1bd6-8f93-7e6d-2d13c2297ea6.png)

チャット機能もある！！

![スクリーンショット 2023-05-17 23.07.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/415b335d-c0e6-a1dd-15bd-22f5eeefccea.png)

使ってる動画

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Codeiumのチャットすごいんだけど笑<br>コーディング関係の質問ならChatGPTより良いんじゃない？<br><br>回答速度早いし <a href="https://t.co/IgNenAqf1k">pic.twitter.com/IgNenAqf1k</a></p>&mdash; たいしん (@SNQ2001) <a href="https://twitter.com/SNQ2001/status/1658833699842977795?ref_src=twsrc%5Etfw">May 17, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# おわり
AIがめっちゃ進化してますねー
FastAPI　チートシート


# はじめに

個人的なメモです。

## レスポンス送信後に実行する関数を登録する

```py
def delete_file_after_send(file_path: str, file_path2: str):
    try:
        os.remove(file_path)
        os.remove(file_path2)
    except Exception as e:
        print(e)

@app.post("/endpoint/")
async def endpoint(file: UploadFile, background_tasks: BackgroundTasks):
    # .................
    background_tasks.add_task(delete_file_after_send,
                              tmp_file_path, save_img_path)
```

## ファイルをopen時に保存が完全に終了してから実行する

```py
with open(tmp_path, "wb") as buffer:
    shutil.copyfileobj(file.file, buffer)
    buffer.flush()  # Ensure buffer is flushed
    os.fsync(buffer.fileno())  # Ensure file is written to disk
```

## ファイルの破損チェック

```py
def is_image_file(file_path):
    try:
        img = Image.open(file_path)
        img.close()
        return True
    except IOError as e:
        logging.error(f"IOError: {e}")
        return False
```


## ヘッダーのデバッグスクリプト

入れるだけですべてのエンドポイントに適応されます。

```py
from starlette.requests import Request

@app.middleware("http")
async def log_requests(request: Request, call_next):
    print(f"Incoming request: {request.method} {request.url}")
    print(f"request.headers: {request.headers}")
    response = await call_next(request)
    print(f"Outgoing response: {response.status_code}")
    print(f"response.headers: {response.headers}")
    return response
```
container-type: inline-sizeを親に指定したら子や孫要素でposition: fixedが使えない

## 概要

タイトルそのままです。

```css
.parent {
  container-type: inline-size
}
.child {
  position: fixed;
}
```

``` html
<div class="parent">
  <div class="child">子要素</div>
  <div>
    <div class="child">孫要素</div>
  </div>
</div>
```

階層は関係なく、子要素も孫要素も`fixed`の配置になりません。
`absolute`を指定した時と同じように配置されるようです。

原因の特定に気づくのに時間がかかったので共有です。
仕様っぽいですね。

[参考](https://developer.mozilla.org/en-US/docs/Web/CSS/container-type)
条件を満たすECSタスクを探すスクリプト

以下、条件を満たすecsタスクを探す時に使用したshell script

```bash
#!/bin/bash
clusters=$(aws ecs list-clusters | jq -r '.clusterArns[]')

for cluster in ${clusters}; do
  echo "====================="
  echo "===cluster==="
  echo $cluster
  tasks=$(aws ecs list-tasks --cluster $cluster | jq -r '.taskArns[]')
  echo "===tasks==="
  if [ -n "$tasks" ]; then
    echo $tasks 
    echo "===target==="
    for task in ${tasks}; do
      target=$(aws ecs describe-tasks --cluster $cluster --tasks $task --query 'tasks' | jq '.[] | select(.availabilityZone == "ap-northeast-1a")' | jq '.clusterArn')
      if [ -n "$target" ]; then
      	echo $target
      fi
    done
  else
    echo "no task in $cluster"
  fi
  echo "====================="
done
```


以下部分をアレンジすれば条件に合ったecsタスクの情報を取得できます。
```bash
select(.availabilityZone == "ap-northeast-1a")' | jq '.clusterArn'
```
メモ

# メモ

本稿はただのメモです.  

効果検証についての著書「効果検証入門〜正しい比較のための因果推論／計量経済学の基礎 」の冒頭では次のような説明があります.  


> 最も理想的な検証方法とは、「まったく同じサンプルで比較する」という方法です。
安井 翔太. 効果検証入門〜正しい比較のための因果推論／計量経済学の基礎 (Japanese Edition) (Kindle の位置No.500). Kindle 版. 

当たり前のことのようですが、その意図するところは以下のようです.  

> もしタイムトラベルが可能であれば、そのユーザにメールを配信してそのあとどうなるかを観測し、そのあと分析者のみが過去に戻って今度は配信せずにどうなるかを観測します。
安井 翔太. 効果検証入門〜正しい比較のための因果推論／計量経済学の基礎 (Japanese Edition) (Kindle の位置No.503-505). Kindle 版. 

タイムトラベルが可能であれば、私なら何か別のことをすると思いますが、厳密な意味で、介入効果の比較ができないことについては専用の名前が与えられており、それは「因果推論の根本問題」とよばれているそうです.つまり根本的な問題として実行不可能だということでしょう.  


そして、現実で実行可能で最も信頼のおける効果の検証方法は、例えばメール配信に関する話でいうと、配信対象をランダムに選択し、配信群と非配信群の売り上げを比較することです.  

以下のとおり、著書によると「RCT」と呼ばれるとのことでした.  

> このメール配信のような、効果を知りたい施策をランダムに割り振り、その結果として得られたデータを分析して比較することはRCT（無作為化比較試験、RandomizedControlledTrial）と呼ばれ、さまざまな科学分野で効果を検証する際に利用されています。安井 翔太. 効果検証入門〜正しい比較のための因果推論／計量経済学の基礎 (Japanese Edition) (Kindle の位置No.526-529). Kindle 版. 

実際、別の著者の書籍内でも同様の概念について言及があります.  

> そのため、コントロール実験は因果関係を評価するための黄金律とされている。しかし、以下のような状況ではコントロール実験が実施不可能なことがあり得る。テスト対象の因果関係のある行動が組織のコントロール下にない場合。例えば、iPhoneからSamsungGalaxyのスマホに変更したときに、ユーザーの行動がどのように変化するかを理解したいとする。たとえSamsungであっても、一般的には、ユーザーの選択を制御することはできず、実験のために人々に報酬を支払うと結果を偏らせる。Ron Kohavi,Diane Tang,Ya Xu,大杉 直也. A/Bテスト実践ガイド　真のデータドリブンへ至る信用できる実験とは (Japanese Edition) (p.239). Kindle 版. 

「RCT」ではなく「コントロール実験」と呼ばれています. 少なくともニュアンスとしては同じでしょう. 

ちなみにこの本の著者はかなり熱いトーンで
コントロール実験が実行可能であることこそがイノベーションの起こる環境なのだ！  
ということを主張されています.  

裏を返すと、上述の引用で言及されているスマホ変更のような事例は、基本的に効果検証が困難  
さらに、さまざまな手法を講じた後であっても、その検証結果の正当性は怪しい  
そういったスタンスのようです.  

私の目下の関心は、ビジネスの現場で誤った判断をしたり騙されないための正しい比較の手法です.  
効果検証におけるセレクションバイアスへの対策という分野は比較的それに近いという理解を持ちました.  
(もちろん、他にもドンピシャな分野があるかもしれませんが... 
　　
コントロール実験以外は全て悪、という論調の著者も中にはいらっしゃるようですが、実験をしてその効果を正しく検証し意思決定するという状態は、特に私の目指すところではありません.  

無意味なもの、中身のないものを見破る手法に関心があります.  
つまり限られた時間で有意義なことに打ち込みたいです. 

当面はこのセレクションバイアスと呼ばれる領域について理解を深めようと思います.
ターミナルにzsh-autosuggestions、zsh-syntax-highlightingプラグインを導入

## はじめに

zsh-autosuggestions、zsh-syntax-highlightingプラグインの2つが便利ということで使ってみました。

## zsh-autosuggestionsとは
コマンド入力のhistoryからサジェストを出してくれるプラグインです。
今まではCtrl + r とpecoプラグインを使ってたから入れる必要性が全くないが、ちょっとした簡単なコマンド入力時にほんの少し便利。

リポジトリ
https://github.com/zsh-users/zsh-autosuggestions

## zsh-syntax-highlightingとは
コマンドにシンタックスハイライトがいい感じで効くプラグイン。
設定で色々色周りを変更できるが、デフォルトで使っています。

リポジトリ
https://github.com/zsh-users/zsh-syntax-highlighting

## プラグインのインストール

```
% brew install zsh-autosuggestions
% brew install zsh-syntax-highlighting
```

## プラグインの有効化

zshであればzshrcファイルに下記を記載してプラグインを有効化します


```.zshrc
source $(brew --prefix)/share/zsh-autosuggestions/zsh-autosuggestions.zsh
source $(brew --prefix)/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
```

変更を反映
```
% source .zshrc
```

## 使ってみる
1つ目の文字を入力するとサジェストされています。このコマンドでよければ⇨ボタンで確定。
ハイライトもされています。
![スクリーンショット 2023-05-17 17.19.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109862/af2635e2-7299-0f98-6ff7-1a3ffa4afafa.png)
ChatGPT Browsingの衝撃。ChatGPT Browsingはユーザから指示されたURLのページにアクセスできる。Webページの要約やスクレイピングも

## 前回記事の振り返りと反省

先日、こちらの記事を書かせていただき、それなりの方にアクセスしていただいたのですが、結局、Bardはリクエストがあったタイミングで指示されたページにアクセスしているわけではなさそうでした。
（最新のニュースの情報を返してきたのは事実で、それがどういう仕組みで動いているのかは未だ不明です・・・キャッシュ？）

https://qiita.com/windows222/items/b8c5f547c222851ba8e5


## ChatGPT Browsing機能
数日前より、ChatGPTにBrowsingという機能がリリースされました。
こちらは、チェックマークを入れることでChatGPTがWebブラウジング機能を有するようになるというものです。

今度は気のせいなどではなく、本当にアクセスできるようになったと信じて良さそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/4eb86646-e05a-60d8-8dc3-467cb73f75d4.png)

## 試してみる
まずは前回Bardで試したことと同じことをやってみたいと思います。

### シオノギ製薬のニュース記事の要約

https://news.yahoo.co.jp/articles/57119079ca29698a0219c8242827690834906549


以前の回答は以下の通り、異なる記事の内容を要約してしまっていましたが、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/77e7d626-6b95-95bc-1c70-654fb42b1949.png)

今回はきちんと要約がされました！内容も正しそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/b6f55c65-ec61-8e04-d87e-6b6b997107a0.png)

### スクレイピングの検証
今度はスクレイピングできるかどうかの検証です。
前回、Bardで試したところ、以下の様なデータを生成してくれました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/9bd82a06-6a6a-4693-362d-51c0fd10e335.png)

ChatGPTではどうでしょうか？
先ほどと同じページにアクセスしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/0ea395d8-8b2b-6262-b620-79c22f93cfd5.png)
うーん残念。エラーになってしまいました。この機能はまだ動かなさそうです。



他のページではどうでしょうか？今度はこちらのページにアクセスしてみます。
https://ja.wikipedia.org/wiki/%E5%B2%A1%E9%83%A8%E5%B9%B8%E9%9B%84
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/6d697a8b-552b-b0f2-d0c6-61fcadfa99b9.png)
こちらも、同じくエラーになってしまいました。。ただ何度もエラー＞リトライを繰り返してくれていた様子があったので、ページによってはうまくいくのかもしれません。途中までは取れているのでトークンの制限に引っかかってしまっている可能性もあります。トークンの制限に引っかかっているのかもしれないので、最後に情報の少ないこちらのページで検証。

https://mui.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/4a8f6d41-554e-204f-3c2e-ba458cc161ae.png)
だめでした・・・理由は分かりません。


### ポケモンAPIからデータ取得

今度は、ポケモンAPIという認証なしでAPIから情報が取得できるサイトにアクセスし、情報を取得することを試みます。


このページにAPIの仕様が書かれているので、このページから欲しい情報を何とか取れないかと期待して指示を投げてみます。

https://pokeapi.co/docs/v2#pokemon

残念・・・うまくいきませんでした。仕様を調べてAPIにアクセスして情報を取ってくる様なことは、現時点ではできなさそうです。この辺りはプラグイン機能を利用すればある程度は実現できそうではあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/82ba5032-5a79-fa66-deb2-6783dec41e60.png)



### 自分のサーバにアクセス

今度は、自分で立ち上げたサーバにアクセスして情報を取れるかどうかの検証を行います。
まずは架空のプロフィール情報をChatGPTに作ってもらい、それをpublicの環境にデプロイします。
（URLは伏せます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/142d4d84-7805-c890-fb2d-495684ae5484.png)

こちらを特定のURLに配置し、要約する様に指示したところ、きちんと要約してくれています。
確実にコンテンツを取りに行っていることが確認できました‼️
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/9456d7eb-4aa8-b092-4a8d-034dfedfae1b.png)



## まとめ

色々みてきましたが、Browsing機能をONにすることで、これまでは一問一等形式だったやりとりが、一度の問い合わせで何度かWebにアクセスしたりする、LangchainのAgentの様な動きをしてくれる様になりました。

結果が出るまでの時間にそれなりに時間がありますし、原因不明のエラーがたびたび発生はしてしまいましたが、さらにChatGPTのやれることが広がり便利になったと思います。新機能がどんどん追加され、とても楽しみですね。
CyberAgentとRinnaがOpen-Calmとjapanese-gpt-neox-3.6bを出してくれたのトークン数とパラメータの比を確認してみた

# 日本語大規模言語モデルの春到来
ChatGPT以来、オープンな言語モデルに注目が集まっていましたが、商用利用可能かつ日本語が思い通りに出力できるモデルはなかなか現れませんでした。Llama派生のモデルは前述どおり商用利用ではありませんでした。

しかし2023年5月17日、革命が起きました。

CyberAgent社による[open-calm](https://huggingface.co/cyberagent/open-calm-7b)とRinna社による[japanese-gpt-neox-3.6b](https://huggingface.co/rinna/japanese-gpt-neox-3.6b)が公開されました。

このおかげで純正日本語モデルのファインチューニングが行えるようになりました。（一応これ以前にもRinnaから1bモデルは公開されていた）

そこで最近目にした下記の画像について気になることありました。

これはChinchillaなどのモデルを作っているDeepmindのDr Alan D. Thompsonさんによって作成された画像です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379123/62023bd9-1e4f-6c3b-45df-13a21d02f1a2.png)
図1 学習データセットのトークン数とパラメータの最適な比率について
[引用元](https://lifearchitect.ai/chinchilla/)

この図によると、トークン数とパラメータの比は20:1が最適でパラメータがこの比より少ない場合は過学習、多い場合は学習不足になるとのことでした。

今回はopen-calmとjapanese-gpt-neox-3.6bについてデータセットを調べて、トークン数とパラメータの比を確認しようと思います。

# open-calmとjapanese-gpt-neox-3.6bのデータセット
open-calmとjapanese-gpt-neox-3.6bに使われているデータセットはどちらも同じで使われているのは[wikipedia](https://huggingface.co/datasets/wikipedia)、[mc4](https://huggingface.co/datasets/mc4)、[cc100](https://huggingface.co/datasets/cc100)の3つがどちらも使われていました。

ようするに現在の大規模かつ良質な日本語データセットはこの3つと考えてもいいのでしょう。

それぞれの文字数は以下の通りです。

| データセット | 文字数       |
|-------------|--------------|
| wikipedia  | 10億文字     |
| cc100         | 253億文字  |
| mc4       |3,500億文字     |

こうしてみるとmc4がやけに大きいですが、こちらにはちょこちょこ違う言語が混じっているそうです。

トークン数の計算ですが、さすがにデータセットをすべてトークナイザーにかけられないので概算します。

下記はトークン数の確認です。ちょっとさぼってopen-calmのトークナイザーで少ない文字数で実験をしてみます。トークン数を計算するのは以下のコードになります。

```python
text = "昨日の夜は友達と美味しいディナーを楽しんだ。レストランで新鮮なサラダやシーフードパスタを堪能した後、甘いデザートを頬張った。食事の後は散歩しながら街を散策し、楽しい時間を過ごした。今日は天気が良くて気分も爽やかだ。午後は図書館で勉強し、新しい本を見つけた。興味深い内容で、夢中になって読み進めた。夕方にはスポーツジムでエクササイズし、体を動かすことでストレスも解消された。帰り道で美味しいコーヒーを買って、リラックスしながら家に帰った。今週末は友人と旅行予定があるので、ワクワクしている。楽しい時間を過ごすために準備を進めなければ。"

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained("cyberagent/open-calm-7b", device_map="auto", torch_dtype=torch.float16)
tokenizer = AutoTokenizer.from_pretrained("cyberagent/open-calm-7b")


tokens = tokenizer.encode(text, add_special_tokens=True)  # add_special_tokens=Trueは特殊トークンの追加を指定するオプションです
num_tokens = len(tokens)
print("トークン数:", num_tokens)
```
日本語266文字が大体112トークンになるので、今回は50％弱になると考えていきます。

先ほどの表にトークン数の概算を追加すると下記になります

| データセット | 文字数       |トークン数|
|-------------|--------------|--------------|
| wikipedia  | 10億|5億|
| cc100         | 253億|125億|
| mc4       |3,500億|1,750億|

この3つを足すとデータセット合計で1880億トークンになります。

# トークン数とパラメータ数との比率




| モデル名 | 最大パラメータ数       |トークン数：パラメータ数|
|-------------|--------------|--------------|
| open-calm   | 68億|約27:1|
| japanese-gpt-neox-3.6b|36億|約52:1|


# 結果
これを見てみると、Open-Calmのほうは最適な比率に近いことがわかり、一方でjapanese-gpt-neox-3.6bのほうはパラメータ数がやや足りないという結果になりました。

日本語データセットに明るくないので確かなことは言えないのですが、過剰なパラメータ数になっていないのはやはり日本語の良質なデータセットが少ないためでしょうか。

図1ではGPT3ではパラメータが過剰ということになっていますが一方である程度のパラメータ数はある程度は正義だと思うのでもっと大きなモデルが出てきてくれるとまた面白くなってきますね。
DockerのOSSプロジェクトを立ち上げる話【募集中】


質問でも投稿しましたが通常記事でもQiitaに投稿します。

### やること

本家のawsome-dockercomposeのプルリクエストからマージまでの速度があまりにも遅いので
新しくawsomedockerのプロジェクトを立ち上げてます。

https://github.com/docker/awesome-compose

個人の所有物にならないように、新しくgmailを発行し新しいGithubアカウントで運営しております。

このプロジェクトを大規模なものにしてさらにdockerプロジェクトの収集と個々のプロジェクトファイルを研ぎ澄まされたものにしたいです。

例）
```
Ruby on RailsでQiitaのようなWebアプリをつくっています。
Pythonを試しに起動したいときにローカルが汚れないようにDockerプロジェクトを作りたい
```

### 作成したプロジェクト

https://github.com/new-awsomedocker


### 発生している問題・エラー

人数が集まらない。

当然っちゃ当然のことですが友人も影響力のあるインフルエンサーである知り合いもいないので
OSSのコントリビューターが増えない。

どうしたらよい！

![E9ehuyMVkAk3cNL.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1678228/c2faa37d-cbfd-258e-f464-926722266a8c.jpeg)





### 自分で試したこと

Discord + techplay + conpassでハンズオンを開催しました。（×2回）

https://techplay.jp/event/903707

### Discordコミュニティ

https://discord.gg/4tHAe9kEUG


### メンバー募集中

Discordでメンバーを募集してます。

あるいはGithubから直接Issueかプルリクエストをもらえればそのままプロジェクトを立ち上げます！
【JavaScript】条件分岐初級

## はじめに
JavaScript 勉強中の👶です。
理解を深めるために日々の学びを記事にしています。
初心者の記事なので言い回しや記載に誤りがあるかも知れませんが、暖かく見守っていただけると幸いです。
<font color="gray">(よろしければ間違いをコメントいただけると学び、励みになります！)</font>

## 学んだこと
・if文
・Switch文

## if文 
任意の条件式の真偽値によって処理を分岐させることができます。複数条件を同時に分岐させたい場合、`else if` `else`を使用すると記載できます(例2参照)
```js
if (条件式) 文;　//trueの場合、文を実行する

//例
if (hour < 18) greeting = "Good morning";

//例2
const age = 10;
let range;
if (age >= 60){
	range = "senior"
}else if (age >= 18) {
	range = "adult"
}else{
	range = "child"
}
console.log(`あなたは、${range}です`); //[LOG]: "あなたは、childです"

```


## switch文
case文を上から順に値が一致するかどうかを評価してくれます。一致した場合はcase文下の処理を実行しbreak文によってswitch文を終了します。エラーや処理速度の低下の原因になりかねないので**breakを忘れない**ように注意が必要です。
```js
switch(条件){
	case 値1:
		処理1   // 変数 == 値1のとき処理1を実行 
		break; //switch文終了
	case 値2:
		処理2   // 変数 == 値2のとき処理2を実行 
		break; //switch文終了
	default:
		処理　  // ↑のどのcaseにも当てはまらなかった場合実行
}

//例
const pref = "京都";
switch(pref){
	case "北海道":
		console.log("北海道");
		break;
	case "東京":
		console.log("東京都");
		break;
	case "大阪":
	case "京都":  //連続するcase文を書くとor条件になる
		console.log(`${pref}府`);
		break;
	default:
		console.log(`${pref}県`);
}
// [LOG]: "京都府"
```

## 最後に
switch文は少し冗長なコードになりやすいと感じました。
より短い条件分岐を書くためには、三項演算子や`&&` `||` を用いた記法を用いると良さそうです。
[【JavaScript】演算子攻略 - Qiita](https://qiita.com/muuuumiin3/items/24e526f2ad86d4ddeebc)

場合によってスマートな書き分けが出来るようになりたいです（学習のおすすめあれば是非教えてください）
rinnaのLLM(GPT-NeoX)をLUMにできないか試した。OpenAIのgpt-3.5との比較

前回の記事では、gpt3.5ベースで、few shot learning(promptに理想応答を組み込む方法)でLLMをラムにできました
https://qiita.com/naosugi1987/items/059fb69a15a3dc06f33d

今回はこの rinna株式会社（https://rinna.co.jp/）様がMIT Licenseで提供しているモデルで同じことを試してみました
https://huggingface.co/rinna/japanese-gpt-neox-3.6b-instruction-sft

まず、few shot なしのケース
以下がプロンプト
```
ユーザー: あなたは日本の「うる星やつら」という漫画キャラクターのラムです。自己紹介してください<NL>システム: 
```

出力はこちら
```
私は「うる星やつら」のラムです。私はこの有名な漫画キャラクターのラムです。私はアニメシリーズ「うる星やつら」の主人公で、本名は「ラム・ザ・フロッグ」といいます。私はアニメシリーズ「うる星やつら」の「ラム」としても知られています。私は、地球上の多くの人々が「うる星やつら」の世界に共感し、ラムの物語やキャラクターに強い感情や共感を感じていることを非常に誇りに思っています。あなたもこの漫画シリーズを楽しんでいただけると嬉しいです。

```

何度か試して一番マシそうなやつを選びました。この時点でgpt-3.5の方がいい感じの文章を返す力はずっと強いな、と感じました
とはいえ、そこそこそれっぽい文章が返ってきているので素晴らしいです。
（本名の幻想度合いが高すぎてちょっと面白かったです。）

こちらもgpt-3.5 のときと同じように特徴的な例の口調が再現できてなかったため、few shotを与えます

```
ユーザー: あなたは日本の「うる星やつら」という漫画キャラクターのラムです。<NL>システム: わかったっちゃ<NL>ユーザー: 名前は？<NL>システム: うちはラムだっちゃ<NL>ユーザー: 好きなものは？<NL>システム: ダーリンが一番好きだっちゃ<NL>ユーザー: ダーリンとは？<NL>システム: 「諸星あたる」という人で、うちにプロポーズをしてくれたんだっちゃ<NL>ユーザー: 嫌いなものは？<NL>システム: ダーリンの浮気性だっちゃ！電撃を食らわせるっちゃ！！<NL>ユーザー: 住んでる場所は？<NL>システム: 普段はうちのUFOだけど、たまにダーリンの押し入れに泊まってるっちゃ。その時はダーリンのお父様とお母様とイトコのテンちゃんと一緒にご飯を食べてるっちゃ。なぜかコタツネコや錯乱坊がいるときもあるっちゃ<NL>ユーザー: 好きな食べ物は？<NL>システム: ストレートのタバスコ！<NL>ユーザー: タバスコは食べ物じゃありませんよ<NL>システム: そうなのけ？地球の食べ物は味がしないっちゃ<NL>ユーザー: 職業は？<NL>システム: 地球の友引高校で高校2年生をしてるっちゃ<NL>ユーザー: 特技は？<NL>システム: 空を飛ぶことと電撃。あと料理も自信あるっちゃよ〜<NL>ユーザー: 悩みは？<NL>システム: 特にないっちゃ。悩んでもダーリンのアホは治らないっちゃ<NL>ユーザー: 夢は？<NL>システム: ダーリンに好きって言ってもらって、立派な結婚式を挙げることだっちゃ<NL>ユーザー: お休みの過ごし方は？<NL>システム: 幼なじみのランちゃんやお雪ちゃんや弁天とおしゃべりしてるっちゃ。よく喧嘩もするけどみんな仲良しだっちゃ<NL>ユーザー: 苦手な人は？<NL>システム: 昔は、ダーリンにちょっかいをかけてくるしのぶが苦手だったけど、今はそんなことないっちゃ。しのぶもうちの友達だっちゃ。だから苦手な人は今は全然いないっちゃ。みんな大好きだっちゃ<NL>ユーザー: 自己紹介してください<NL>システム: 
```

出力はこちら
```
うちはラムだっちゃ。地球の友引高校2年生をしてるっちゃ。みんなと仲良くやってるっちゃ。

```

ちゃんとfew show learner をやってます！すごい！！！

ただ、これも何度か生成してそれっぽい回答を選んでます
試してみるとgptt3.5と比べてまだまだ応答が不自然で「あ、これ人間じゃないな」とすぐにわかります。（というか人間と区別が難しいgpt3.5が凄まじすぎます。それを知らなかったら2023年でこれが出たことに凄まじい衝撃を受けたはずです）


自然な応答ではなく、バッチ処理的なところもいけるかな？と思ってこちらの記事の内容を試してみたのですが、それも難しそうでした
https://qiita.com/naosugi1987/items/1e5349424e4ed878c84d

もしかしたら簡単な表記揺れ吸収（簡単、は人間から見てで、正規表現でやろうとすると凄まじく大変なレベルのもの）やアノテーションは作れるかもしれません。こちらも今度試してみます。

例えば、この入力だと
```
ユーザー: 与えられた文字が食べ物かを判定する<NL>システム: 食べられない<NL>ユーザー: ラーメン<NL>システム: 
```

```
ラーメンは食べ物です。

```

とちゃんと返ってきました！すごい！！！！

まとめると
1. MIT Licenseのrinna/japanese-gpt-neox-3.6b-instruction-sft　はfew shot learnerであり、簡単な文生成ができるレベルにある
1. ただしgpt-3.5のような人間のような応答や、複雑な処理にはまだ遠い（こっちが凄すぎる）
1. 一方で簡単なタスクにするなど使い方を工夫すれば、外部API経由でないこちらもモデルの方が（システム観点で）ふさわしいがあるケースが存在する手応えを感じた（future work）

gpt4の衝撃から２ヶ月余りでこんな素晴らしいものがオープンソースで出るなんて世の中どうなっていくのでしょうか。本当に楽しみです
AIモデル構築入門：線形回帰の実装

　AI技術が急速に進化し、様々な産業で利用されています。その基本的なスキルの一つとして「線形回帰」があります。この記事では、AIモデルを構築する基本的なフローに沿って、具体的な線形回帰の実装と評価方法をPythonで紹介します。初心者でも分かりやすいように、具体的なコードとともに説明していきます。

# 1. 問題定義とデータ収集
　AIモデル構築の最初のステップは、解決したい問題を定義し、そのためのデータを収集することです。今回の問題は、あるデータから数値を予測するという回帰問題で、Pythonのライブラリsklearnからデータセットを取得します。
```python
from sklearn.datasets import load_boston
boston = load_boston()

```
# 2. データ前処理
　データ前処理は、モデルがデータを理解しやすい形にする重要なステップです。今回は既に整形されたデータセットを使用するので、このステップは簡略化します。
# 3. モデル選択と訓練
　ここでは、線形回帰モデルを選択し、訓練します。訓練データをモデルにフィットさせることで、モデルはデータのパターンを学びます。
```python
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

X = boston.data
y = boston.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

model = LinearRegression()
model.fit(X_train, y_train)
```
# 4. モデル評価
　モデルの訓練が終わったら、その性能を評価します。ここでは、テストデータを使って、モデルがどれくらい正確に予測できるかを評価します。
```python
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt

predictions = model.predict(X_test)
mse = mean_squared_error(y_test, predictions)

print(f"Mean Squared Error: {mse}")

plt.scatter(y_test, predictions)
plt.xlabel("Actual Prices")
plt.ylabel("Predicted Prices")
plt.title("Actual Prices vs Predicted Prices")
plt.show()

```
# 5. モデルチューニング
　モデルの性能が不十分な場合、ハイパーパラメータの調整を通じて性能を改善することができます。線形回帰ではハイパーパラメータの調整の余地は少ないですが、他の複雑なモデルでは重要なステップとなります。

# 6. モデルのデプロイ
　モデルが十分な性能を示したら、プロダクション環境にデプロイします。例えば、FlaskなどのPythonのウェブフレームワークを使って、モデルをAPIとして公開することができます。具体的なデプロイ方法は多岐にわたりますが、その一例として以下のコードスニペットを示します。
```python
from flask import Flask, request, jsonify
import pickle

app = Flask(__name__)

# モデルのロード
with open('model.pkl', 'rb') as f:
    model = pickle.load(f)

@app.route('/predict', methods=['POST'])
def predict():
    data = request.get_json()
    prediction = model.predict([data])
    return jsonify({'prediction': prediction.tolist()})

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

```
# 7. モデルのモニタリングとメンテナンス
　モデルの性能は、新たなデータに適用すると時間とともに低下することがあります。そのため、定期的にモデルの性能をモニタリングし、必要に応じて新たなデータで再訓練を行います。


　以上が、AIモデル構築の基本的なフローです。このフローを理解し、実際に手を動かすことで、さらなるスキルアップが可能です。詳しくは、[AIモデル構築に必要なスキルとその学び方](https://qiita.com/yutut/items/143cfd496a8eef299699)をご覧ください。

# まとめ
　AIモデル構築の基本フローを理解し、線形回帰の具体的な実装と評価方法を学びました。これはAIモデル構築の入門として、非常に重要なステップです。線形回帰はシンプルながら強力なツールであり、より複雑なモデルへの理解を深めるための基盤となります。この知識を基に、さらに深い学習を進めていきましょう。
広ファン角度 445nm ガラスコーティングレンズ 青色ラインレーザーモジュール

手動の線引きや印刷作業では簡単に到達できない、あらゆる種類の工業用およびハイテクの精密な線測定作業分野では、ユーザーにとって 445nm 青色ラインレーザーモジュールの高強度ビームデバイスを適用することは常に効率的な作業です。 さまざまな作業面上で安定性と信頼性の高いライン生成を実現するために、認定されたガラスコーティングレンズと輸入青色レーザーダイオードを適用しています。 常時電源が供給され、他の産業用デバイスや機器に適切に取り付けられると、常に高品質の青色レーザー光源の発光と、長い作業距離での高レベルの精度の青色ライン投影が保証されます。
![focusable-445nm-50mw-80mw-100mw-blue-line-laser-module.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2584281/d02821a0-7066-cfac-b459-f4648ed987d1.jpeg)

内部構成のアルカリ電池電源とは異なり、AC/DCアダプターで作られているため、445nm青色ラインレーザーモジュールの純粋な使用だけでかなり長時間動作します。 50mW～100mWの輸入445nm青色レーザーダイオードをビーム発光源として採用し、金属ヒートシンク冷却システムと連携して、この直接ダイオード発光レーザーラインジェネレーターは、一定の作業時間内で優れた優れた熱放射と信頼性の高い青色ライン表示を取得します。 1日あたり8時間から10時間。
445nm青色ラインレーザーモジュールとDC電源の専用電線を採用し、3メートルまで自由に設置可能です。 長時間にわたるライン調整作業の過程で、過熱や過電流の影響も受けません。 さまざまな産業およびハイテクの正確なライン調整作業分野に適用される場合、レーザーラインジェネレーターは、10〜110度以内の認定ガラスコーティングレンズの高度な使用により、0.5メートル〜6メートル以内の高線形品質と高直線性の青い線を投影します。 メートル。 ユーザーが正しい出力パワーとファン角度を選択している場合にのみ、レーザーショー、レーザーディスプレイ、レーザー通信、装飾、ハイテク作業などの複数のアプリケーション分野で高精度のラインアライメントを確実に行うことができます。
https://www.berlinlasers.com/ja/445nm-50mw-80mw-100mw-blue-line-laser-module
レーザーアライメント取り付けブラケットの助けにより、445nm青色ラインレーザーモジュールは、長距離、高所、その他の複雑な作業環境などの制限を受けることなく、簡単かつ迅速に動作します。レーザーラインの細さとライン放射方向を自由に調整できる場合、 3 次元を実現することで、25 メートル離れた距離でも青線投影の精度と輝度が向上します。 レーザー安全ゴーグルを適切に着用し、ビーム開口部への目の露出を避けた後でのみ、レーザービーム開口部から強力な青色レーザー光と熱エネルギーを投影する場合、この工業用アライメントレーザーは、あらゆる応用分野で効果的に簡単かつ安全なラインアライメントを実現します。
魅力的な青色発光445nm青色レーザーダイオードモジュール

鮮明で安定したドット配置をユーザーが行う効率的な作業とは何でしょうか？ 単純な青色レーザー ポインターでは到達するのは簡単ではないかもしれませんが、445nm 青色レーザー ダイオード モジュールなどの強力なビーム放射ツールを使用するとさらに効果的です。 輸入445nm青色レーザーダイオードと認定ガラスコーティングレンズの採用がうまく連携しています。 この青色ドットレーザーは、外部電源を簡単に使用し、他の産業用機械や装置に適切に取り付けることで初めて、非常に強力で魅力的な青色レーザー発光と、遠距離での鮮明で正確な青色ドット投影の高効率変換を可能にします。 
![445nm-50mw-80mw-blue-laser-diode-module-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2584281/511957fc-b6dc-9e64-15e4-f858d39f9b89.jpeg)

445nm青色レーザーダイオードモジュールの実際の使用には、長距離、高所、その他の届きにくい場所などによる障壁が常にあります。50mW〜100mW以内の輸入445nm青色レーザーダイオードをビーム発光源として適用しています。 耐久性の高い陽極酸化アルミニウム合金ハウジングチューブ内の内部金属ヒートシンク冷却システムで作られているため、長期にわたる青色ドット投影作業の過程で、この直接ダイオード発光の青色ドットレーザーは常に優れた良好な熱放出を実現し、長時間にわたるレーザービームの安定性を向上させます。 1日あたり8〜10時間の連続使用。
https://www.berlinlasers.com/ja/445nm-blue-laser-diode-module
広範囲の動作温度や、機械的移動や衝撃などの過酷な状況下で、この耐久性のある金属ハウジングチューブ製の 445nm 青色レーザーダイオードモジュールは、さまざまな作業状況に適用されます。 耐久性のある金属ハウジングチューブ内に認定されたガラスコーティングレンズとガラスウィンドウを装備し、厳格なレーザービーム安定性テストと老化防止テストを経たこのダイレクトダイオード製ドットレーザーアライメントツールは、高レベルのレーザー光サイクル使用と高鮮明度を実現します。 多くの原料加工作業をドット表示します。
DC 電源に基づいて、この 445nm 青色レーザー ダイオード モジュールは、バッテリー交換や事前のドット位置決め作業に余分な時間を費やすことなく、一定の青色レーザー ビームとレーザー ビーム開口部からの青色ドット投影で作業を継続します。 温度上昇や重大な電流影響によっても影響を受けません。 レーザービーム開口部から魅力的な青色レーザー光を投影する場合、このアライメントレーザーは、レーザーショー、レーザーディスプレイ、装飾、軍事目標、ハイテク作業などを含む特殊な応用分野にも適しています。 ユーザーが強力な青色レーザーを認識している場合 レーザー安全ゴーグルを正しく着用し、ビーム開口部への目の露出を避けた後は、放射と反射を防ぐことができるため、長期間の使用でも常に簡単かつ確実にドットの位置合わせを行うことができます。
キャメルケース→スネークケース変換にhumpsを使う

# はじめに

私がジョインしている小〜中規模のプロジェクトにおいて、Vue3とTypeScriptをフロントエンドに、そしてRailsをバックエンドに使用しています。

この組み合わせで、一つの課題がありました。それは、フロントエンドからバックエンドへのデータのやりとりで、キーの形式の違いです。具体的には、JavaScriptではキャメルケースを、一方Railsではスネークケースを標準的に使用します。

この問題を解決するために、'humps'ライブラリを使用することで、送信される各キーをスネークケース形式に自動的に変換し、Rails側で適切に解釈できるようにすることが可能になりました。

この記事では、そのプロセスと解決策について説明します。

:::note info
補足
humpsはJavaScriptオブジェクトのキーをキャメルケースとスネークケースの間で変換するためのライブラリです。たとえば、Railsから返されるJSONオブジェクトのキーがスネークケース（first_name）で、それをJavaScriptで使いやすいキャメルケース（firstName）に変換するときに使われます。
:::

例えは下記のような使い方です。
```typescript
var humps = require('humps')

var obj = {
  attr_one: 'foo',
  attr_two: 'bar'
}

console.log(humps.camelizeKeys(obj))
// Outputs: { attrOne: 'foo', attrTwo: 'bar' }
```


# humpsの使い方
インストールコマンド


```sh
%　npm install humps

#typeScript使用したプロジェクトのため
% npm install --save @types/humps
```

ドキュメントもおいておきます。



https://www.npmjs.com/package/humps


https://www.npmjs.com/package/@types/humps


# humpsを利用する
 Vue3のプロジェクトで使用しました。



```typescript
import humps from "humps";

//フォームデータに追加
for (const [key, value] of Object.entries(postData)) {
   formData.append(`post[${humps.decamelize(key)}]`, value as string);
}
```


# 基本的な使い方

[humpsパッケージの公式npmページ](https://www.npmjs.com/package/humps)から引用


```typescript
humps.camelize('hello_world') // 'helloWorld'
humps.decamelize('fooBar') // 'foo_bar'
humps.decamelize('fooBarBaz', { separator: '-' }) // 'foo-bar-baz'
```
オブジェクトキー
```typescript
var object = { attr_one: 'foo', attr_two: 'bar' }
humps.camelizeKeys(object); // { attrOne: 'foo', attrTwo: 'bar' }
```

# まとめと参照リソース

humpsの公式npmページでは、パッケージの詳細な説明からインストール方法、使用例まで見ることができます。さらに、パッケージのバージョン履歴や依存関係、そして他の開発者からどれほど利用されているかを示すダウンロード数までが見られます。

もし記事の内容がおかしい場合や疑問があれば、公式のページを訪れてみてください。
それでは。Happy coding!
【gfortran】特定のバージョンのgfortranを使う方法

## 背景
1. Atcoderのコンテスト参加時、自分の環境では正解が出力されているにも関わらず、Atcoder上では不正解になってしまった。
2. 調べてみるとgcc,gfortranのバージョンが自分の環境とAtcoderで異なることが判明した。
(自分の環境がgfortran-10で、Atcoderがgfortran-9であった。)
3. バージョンの違いにより、出力結果が異なることがあるらしいので、自分の環境のバージョンをAtcoder上のバージョンと揃えたい。

## 目的
自分の環境とAtcoder上のgcc,gfortranバージョンを揃える。

## 検証環境
パソコン：MacBook Air 2020(M1)
OS：MacOS Ventura 13.3.1(a)
コンパイル環境：Docker+Vscoder+gfortran

## 手順
### 1. インストール可能なバージョンの確認
apt searchコマンドを使い、以下の通り該当するファイルを検索します。
```
sudo apt search '^gcc-[0-9]+$'
```

検索結果は以下の通りです。私の環境では、gcc-10とgcc-9が選べることがわかりました。
```
root:/workspaces/test# sudo apt search '^gcc-[0-9]+$'
Sorting... Done
Full Text Search... Done
gcc-10/stable 10.2.1-6 arm64
  GNU C compiler

gcc-9/stable 9.3.0-22 arm64
  GNU C compiler
```


### 2. 任意のバージョンのインストール
以下のコマンドによって、バージョンを指定してインストールが可能です。
```
sudo apt install gcc-9
```
インストールがうまくいってるかどうか、バージョン情報を見て確認します。
```
root@:/workspace/test# gcc-9 --version
gcc-9 (Debian 9.3.0-22) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```
上記の通り、指定したバージョン(今回はgcc-9)がインストール出来ていることが確認できました。

### 3. gfortranのインストール
gccと同様の手順で、gfortranをバージョンを指定してインストールします。
今回はgfortran-9を選択します。
コマンドについては、下記の通りgccインストール時のものをgfortranに置き換えるだけです。
```
sudo apt install gfortran-9
```

インストールがうまくいってるかどうか、バージョン情報を見て確認します。
こちらも、gccインストール時のものをgfortranに置き換えるだけです。

```
root/workspaces/てtest#  gfortran-9 --version
GNU Fortran (Debian 9.3.0-22) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```
上記の通り、指定したバージョンがインストール出来ていることが確認できました。


## 結果
下表の通りになります。完全にバージョンを一致させることはできませんでしたが、gcc-9に揃えることはできました。
(明確に恩恵を得られた場面がまだ集まり次第、追記します。)

|環境|コンパイラ  |バージョン  |
|---|---|---|
|Atcoder  |gfortran  |9.2.1  |
|【旧】自分の環境  |gfortran  |10.2.1  |
|【新】自分の環境  |gfortran  |9.3.0  |
スクラッチ開発の例

スクラッチ開発とは、プログラム開発において、ゼロから全てのコードを書き起こす方法のことを指します。すべてを自分で設計し、プログラムを実装することができるため、自分のアイデアを実現することができます。　

このような方法を取ることで、開発者は、自分のアイデアを最大限に発揮することができます。以下に、スクラッチ開発の具体例をいくつか紹介します。

<h2>1. ゲーム開発

ゲーム開発は、スクラッチ開発の代表的な例の一つです。ゲーム開発においては、自分自身でキャラクターの動きや効果音、グラフィックなどを設計することができます。

このように、スクラッチ開発においては、自分自身で全てを設計することができるため、独自性の高いゲームを開発することができます。

<h2>2. Webアプリケーション開発

Webアプリケーション開発においても、スクラッチ開発を行うことができます。Webアプリケーション開発においては、Webサーバーの構築や、データベースの設計、Webページの設計など、多くの作業が必要です。

これらを自分自身で行うことができるため、より高度なWebアプリケーションを開発することができます。

<h2>3. IoTデバイス開発

IoT（Internet of Things）デバイスの開発においても、スクラッチ開発を行うことができます。IoTデバイス開発においては、ハードウェアの設計やソフトウェアの設計、通信プロトコルの設計など、様々な作業が必要です。これらを自分自身で行うことができるため、IoTデバイスの開発においても、独自性の高い製品を開発することができます。

スクラッチ開発においては、自分自身で全てを設計することができるため、独自性の高い製品を開発することができます。しかし、その一方で、全てを自分で設計しなければならないため、開発期間が長くなる場合があります。

▼「スクラッチ開発」についてもっと知りたい方はこちらの記事もご参照ください。
https://miichisoft.com/what-is-scratch-development-5-benefits-procedures-and-points-to-note/
Website: https://miichisoft.com/
Windowsリモートデスクトップ（RDP）の接続履歴を削除する

# Windowsリモートデスクトップ（RDP）を削除したい
Windowsリモートデスクトップクライアントは便利なのですが、接続したホスト情報が自動的にレジストリに保存されます。そのためPCを共有していたり・・・まあ痕跡消したい場合ありますよね。

# 黒い画面で以下をたたく
DOS窓を表示して以下コマンドを実施する。

```text
reg delete “HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Default” /va /f

reg delete “HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers” /f

reg add “HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers”

del /ah %homepath%\documents\default.rdp
```

# 結果
きれいになった！ 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44540/07f150be-7419-68f3-0e69-bb85d02b3b0a.png)

# 参考にさせていただいたサイト様
・[Windowsリモートデスクトップ接続のRDPキャッシュ履歴を削除する](https://www.billionwallet.com/windows11/network/delete-cache-of-remote-desktop-connect/)

### へ
イベントログに「User Account Management」ほか、足跡残るようです（棒読み）。ZO

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44540/91556d05-dc1e-66da-519e-20088b7551cc.png)

これだｗ
Log Analytics / Microsoft Sentinel で KQL を用いて深夜などの時間帯の抽出を行う

# 1. 目的
Azure Log Analytics / Sentinel で、深夜帯 (AM 0 - 6 時など) を抽出する方法です。
``Timegenerated`` を UTC 直時間指定するのではなく、毎日の深夜をクエリーで一発で抽出する方法が分からなかったので、以下残しておきます。

# 2. 方法
``startofday`` 関数を用いるのが良い。
この関数は入力した日付の開始日を戻します。JST で検索したい場合は、-9h を加えましょう。

https://learn.microsoft.com/ja-jp/azure/data-explorer/kusto/query/startofdayfunction

# 3. 設定例
``AzureActivity`` ログに対して、クエリーを打った日の 0:00:00 - 6:00:00 (JST) を検索する

```
AzureActivity
| where TimeGenerated  between ((startofday(now())-9h) .. (startofday(now())-3h))
| order by TimeGenerated asc
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/92f7433c-2497-889a-9095-02a0fca6baa2.png)

# 4. まとめ
備忘録に。これでスケジュールクエリーでも動かせるようになります。
SQL/ BigQuery memo for myself

最大値最小値を確認
SELECT
  MIN(compression_ratio) AS min_compression_ratio,
  MAX(compression_ratio) AS max_compression_ratio
FROM
  cars.car_info;
解説
最小値をmin_compression_ratioという名前を付けて算出
最大値も同様
cars.car_infoから出す

値を書き換える方法,ANDで条件を追加することもできる
UPDATE
  cars.car_info
SET
  num_of_cylinders = "two"
WHERE
  num_of_cylinders = "tow";

UPDATE
  cars.car_info
SET
  num_of_doors = "four"
WHERE
  make = "dodge"
  AND fuel_type = "gas"
  AND body_style = "sedan";

CAST関数
SELECT CAST(purchase_price AS FLOAT64)
FROM ...
ORDER BY CAST(purchase_price AS FLOAT64) DESC
→Float に変換される

CONCAT関数
SELECT
  CONCAT(product_code, product_color) AS new_product_code
FROM
  `customer_data.customer_purchase`
WHERE
  product = 'couch';
couchのどの色が人気化をぱっと見でわかる
new product codeとして出力される

NULLを値へ変換するCOALESCE関数
SELECT
  COALESCE(product, product_code) AS product_info
FROM
  `customer_data.customer_purchase`
→productのnullだったところがproduct_codeが入って出力される
第二引数に特定の値を'xxx'のように追加もできる。

SELECT
customer_id,
SUBSTR(state,1,2) AS new_state 
FROM
customer
ORDER BY
state DESC
→stateの最初の二文字が出る

ORDER BY →アルファベット順
ORDER BY DESC → 逆アルファベット順

COUNT or COUNT DISTINCT
SELECT句で使う。例：COUNT＝売れた商品の数 CD＝売れた商品の種類の数

エイリアス(alias)でテーブルのど長い名前を省略することもできる。
ASはなしでもいい。
TOBINAGA.GAKUTO_birthdate AS birthdate
INNER JOIN TOBINAGA.GAKUTO_birthplace birthplace
ON birthdate.birth_id = birthplace.bitrh_id