OmniAICreator/Qiita-1.07M huggingface dataset:
【入門】async await

# Dartの非同期処理方法
Dartは**シングルスレッド方式**によりプロセス管理を行なっている。

# イベントループとは
Dartの非同期処理の手法。発生したイベントをイベントキューにためて、溜まったイベントを順次処理することによりノンブロッキング処理を可能としている。
ex) Javascript, Dart

# マルチスレッドとは
よく比較対象として議論されるのがマルチスレッド。　
マルチスレッドはカーネルが複数の命令を処理して、ある処理をバックグラウンドで同時に行う手法。
ex) Java, C++, Python

# Dartの処理系(Event Queue, Microtask Queue)
## Event Queue
メインとなるキュー。I/O、マウスイベント、描画イベント、メッセージ等DartやDart以外のシステムのイベントもイベントキューに格納される。

## Microtask Queue
クロージャー等後から処理を行いたいものをキューに格納するためのもの。マイクロタスクキューに格納されているイベントはイベントキューの処理前に全て呼び出される。

※誤りがありましたら、ご指摘をお願いします🙇

# async, awaitの正体
`async` : 非同期処理を行いますよと関数にラベルをつけるもの。
`await` : return値が`Future<T>`の`async`関数に対して、`await`キーワードを用いると `T`型のreturn値を取得することができる。
`await`キーワードをつけないと`Future instanse`が戻ってくる



# 実際の処理
## 1. 同期処理
```dart
void process1() {
  print('Done Process1');
}

void process2() {
  print('Done Process2');
}

void process3() {
  print('Done Process3');
}

void main() {
    process1();
    process2();
    process3();
}

// 出力結果
// Done Process1
// Done Process2
// Done process3
```

2. 非同期処理　その１（関数にasync/await）
```dart
void process1() {
  print('Done Process1');
}

Future<void> process2() async {
  Future<String> future = Future.delayed(Duration(seconds: 2), () =>'Done process2');
  future.then((value) => print(value));
}

void process3() {
  print('Done Process3');
}

void main() {
    process1();
    process2();
    process3();
}

// 出力結果
// Done Process1
// Done Process3
// Done process2
```

`process2()`が非同期処理の対象になる。

----
参考記事
https://medium.com/@kawanojieee/dart-async-await-394846fb3d2c
https://medium.flutterdevs.com/event-loop-in-dart-226a7487b4aa
MySQLによる"NULL"の扱いについて

# 前提

- MySQL: 5.7.43

# ORDER BY句によるソート結果でのNULL

以下のようなテーブルがあるとします。
```sql:
mysql> select name, x from tmp;
+------+------+
| name | x    |
+------+------+
| A    |    3 |
| B    |    0 |
| C    | NULL |
| D    |     1|
+------+------+
```

ここで、`x`についてORDER BYで指定し昇順で表示させると、NULLが最も上位に表示されます。
逆に、降順でORDER BYを指定すると、NULLは最下位に表示されます。
これはNULLに対する仕様として把握しておいた方が良い内容です。

```sql:
mysql> select name, x from Greatests order by x;
+------+------+
| name | x    |
+------+------+
| C    | NULL |
| B    |    0 |
| D    |    1 |
| A    |    3 |
+------+------+

mysql> select name, x from tmp order by x desc;
+------+------+
| name | x    |
+------+------+
| A    |    3 |
| D    |    1 |
| B    |    0 |
| C    | NULL |
+------+------+
```





# NULLと文字列の結合

CONCAT関数は、以下のように引数を結合する関数です。

```sql:
mysql> SELECT CONCAT('hoge', 'foo');
+-----------------------+
| CONCAT('hoge', 'foo') |
+-----------------------+
| hogefoo               |
+-----------------------+
```

ただし、引数の中に一つでもNULLが含まれる場合、出力結果はNULLとなってしまいます。
これは特に注意しなければならない仕様です。

```sql:
mysql> SELECT CONCAT('hoge', 'foo', NULL);
+-----------------------------+
| CONCAT('hoge', 'foo', NULL) |
+-----------------------------+
| NULL                        |
+-----------------------------+
```

# COALESCE関数

COALESCE関数とは、引数の中で一番最初の非NULL値を返す関数です。
NULLのデータが含まれる可能性のあるカラムなどがある場合は、この関数を使用した方が良いでしょう。

```sql:
mysql> SELECT COALESCE(NULL,1, NULL);
        -> 1
mysql> SELECT COALESCE(NULL,NULL,NULL);
        -> NULL
```
プログラミングスクール卒業後のあれこれ②


[こちら](https://qiita.com/ta--i/items/9d4f4108550c41378703)の記事の続きになります。


# 入社後・・
プログラミングスクールでキャリアサポートを受けながら、2月末ごろに内定をいただき、無事に4月からの就職先が決まりました。

就職した企業は、IT業界ではありませんが、
Webアプリケーションを外部ベンダーさんに開発してもらい、それをお客様に利用していただいています。（完全在宅勤務）
- Webアプリを利用するお客様より動作不具合の連絡が入ると、動作確認をし、ベンダーさんへ報告、修正依頼
- 新機能追加したときはリリース前の動作テストを行ったり
- Mtgがあれば議事録をとったり、アジェンダ作成したり
他にも社内のシステム整備が未発展な部分があり、様々なことを幅広く担当していました。
様々なプロジェクトチームがあります。会社の中の動きを理解するためにも、各Mtgに参加し、議事録担当でなくても自分でメモをしながら積極的に理解しようとしていました。


入社直後は私のためにMtgで時間を割いて、社内のこと（各部署の紹介、役割などの説明）や目指していることなどなど右も左もわからない状態で参加していました。
正直、チンプンカンプンです。
でも、自分の中で理解し落とし込んでいくには、周りの人に質問しながら進んで行くしかないと思い必死でした。
（みんなそうだよね。）
幸い、みなさん丁寧に説明してくださったり、急に電話をしてもいいですか？と聞くと快く教えてくださったり本当に良い方ばかりでした。


# 入社後（子育て）・・
仕事中、子どもたちは保育園に預けています。
上の子は去年秋から通っていますが、下の子は保育園に通うことが初めてでした。
予想はしていましたが、2人とも風邪やらなにやらいろいろな理由でお休みが続く日もあり
仕事を遅刻・早退する日も少なくありませんでした。
もちろん夫と協力していましたが、忙しい時期でもあり、わたしが対応する日々でした。

仕事が終わり、保育園にお迎え、夕飯、お風呂、寝かしつけ・・と平日は流れ作業のようにこなしていました。
約5年ぶりの社会復帰（未経験業務）で、家事も中途半端で、本当に家が荒れていました。(笑)
わたしも日々アップアップしながら生活をしていましたが、子どもたちも結構大変だったと思います。
7：30～17：30　朝から夕方まで保育園で過ごし、下の子は特に、外面が良いというか、どの先生からも「あれもこれも、自分で積極的に取り組もうとして、本当にすごいですね、いい子ですね」というお言葉をいただいておりました。
しかし、家ではその逆で、迎えに言った瞬間からイヤイヤ放題。
先生方からのお言葉は到底信じられないほどの態度でした。
車に乗らない、お風呂行かない、寝ない、、、
そして新生児かと思うくらい夜泣きを2回ほど。

こちらも仕事で疲れており、睡眠もとりたいのに、夜に起こされ抱っこ・・
ソファで抱っこしながら朝を迎える日もまあまあありました。

子育て世代の働く父母たちはこんなにも大変なのかと身をもって実感しました。
働くって、大変です。そして今の自分にとっては働くだけが仕事じゃないので・・
子育てや家事、特に毎日の食事の用意があるので。


## あとがき
食事の用意に関しては、宅配サービスを活用していました。
ミールキットと呼ばれるものを注文し、野菜や調味料などが用意されているパッケージ商品をよく購入していました。
とても便利で、今も継続して利用しています～。


続きます。
【Rust】WebAssembly開発セットアップ

# 概要
RustでWebAssemblyを開発するための手順をまとめています。
※ 備忘録も兼ねているので、メモ程度です。

# インストール
必要なものをインストールしていきます。

### Node（npm）
Wasmとは関係ないですが、確認するための環境をViteで作成するので、Nodeをインストールします。
Nodeをインストールすると、npm（Nodeのビルドシステム兼パッケージマネージャ）もインストールされます。

https://nodejs.org/ja

### Rust（cargo）
Rustをインストールします。インストール手順はOSによってことなります。
Rustをインストールすると、cargo（Rustのビルドシステム兼パッケージマネージャ）もインストールされます。

https://doc.rust-jp.rs/book-ja/ch01-01-installation.html

### wasm-pack
npmを使って`wasm-pack`をグローバルにインストールします。
※ npm経由じゃなくてもインストールできます。
```
npm install -g wasm-pack
```
https://rustwasm.github.io/wasm-pack/installer/

# セットアップ
プロジェクトを作成します。

### 1）プロジェクトの作成
任意のディレクトリで、以下のコマンドを実行します。
```
cargo new --lib [your_project_name]
```

### 2）パッケージの追加
設定ファイルに、必要なパッケージを追加します。
パッケージは、[crate.io](https://crates.io/)で最新版を見つけることができます。パッケージの説明は、[こちら](https://rustwasm.github.io/wasm-bindgen/api/wasm_bindgen/index.html)。

```Cargo.toml
[package]
name = "your_project_name"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[lib]
crate-type = ["cdylib", "rlib"]

[dependencies]
wasm-bindgen = "0.2.87"
js-sys = "0.3.64"

[dependencies.web-sys]
version = "0.3.64"
features = [
  "Window",
  'console'
]
```

### 3）テストコードの記述
js側から`greet()`が呼ばれると、alertを表示します。

```rs: src/lib.rs
use wasm_bindgen::prelude::*;

#[wasm_bindgen]
extern "C" {
  fn alert(s: &str);
}

#[wasm_bindgen]
pub fn greet() {
  alert("Hello wasm!");
}
```

### 4）ビルドコマンド等の追加
Nodeをインストールしているので、実行にnpmを使います。

```json: package.json（追加）
{
	"scripts": {
		"web": "cd web && npm run dev",
		"start": "npm run build && cd web && npm run dev",
		"build": "wasm-pack build --target web --out-dir web/pkg",
		"login": "wasm-pack login",
		"pack": "wasm-pack pack web/pkg",
		"publish": "wasm-pack publish"
	}
}
```
| command | summary |
|:-|:-|
| web | web階層に移動してdevコマンドを実行する |
| start | rust libをbuildして、localhost接続する |
| build | rust libをbuildして、wasmとして書き出す |
| login | npmにログインする |
| pack | パッケージを生成する |
| publish | パッケージをnpmに公開する |


### 5）確認用のweb環境の作成
wasmはそもそもweb開発環境（html, css, js）からは切り離されている設計なので、WebpackやVite等どんな環境でもなんでもいいのですが、Viteが楽なのでViteを使います。

プロジェクトディレクトリで、Vite環境を作成します。
TypeScriptを使う人は、👇
```
npm create vite@latest web --template vanilla-ts
```
※ プロジェクト名を`web`にしていますが、任意です。ただし、4）のRustディレクトリの方の`package.json`と整合性を合わせる必要があります。

その他はこちらを参照。

https://ja.vitejs.dev/guide/

### 6）Rust libをビルド
プロジェクトディレクトリで以下を実行します。

```
npm run build
// 👇と同義で、web/pkgディレクトリにファイルを吐き出します。
// wasm-pack build --target web --out-dir web/pkg
```

### 7）TS（JS）の記述
スクリプトから`greet()`を呼び出す。
ボタンを追加して、ボタンを押したらgreet()が呼ばれ、`lib.rs`で記述したalertが表示されます。

```ts
import init, { greet } from '../../pkg'

init()

const greetBtn = document.querySelector<HTMLButtonElement>('.greet')!
greetBtn.addEventListener('click', () => {
  greet()
})
```

実行は、プロジェクトディレクトリで、
```
npm start
```

# 雑感
`cargo new`でパッケージを作成したけど、`wasm-pack new [project_name]`でも作れるらしい。
けど、こっちの方はNode環境やブラウザでの仮想的なテストができるようになってるみたい。（理解が進んだら試す）

# 参考
- [100日後にRustをちょっと知ってる人になる: [Day 22]wasm-pack](https://zenn.dev/shinyay/articles/hello-rust-day022)
- https://github.com/sadnessOjisan/wasm-vite-template
[Database]DBスペシャリスト対策で読んだ記事一覧

# パーティション分割（区分化）
https://xtech.nikkei.com/it/article/COLUMN/20090512/329853/

https://ひとりでできるもん.com/2018/12/25/%E8%B6%85%E5%9B%B3%E8%A7%A3%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3%E5%8C%961-5-%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3%E4%BA%8B%E5%A7%8B%E3%82%81/

# インデックス
https://itmanabi.com/unique-cluster-index/
転職@微経験からデータエンジニアを目指す

# 以下は残しますが、色々あってデータエンジニアになるのはやめました。

# はじめに

データエンジニア目指してます！！有識者の方是非アドバイスお願いします！！
転職活動終わるまでは更新し続けようと思います！
ばばばーっと書いてるので汚いですが、時間がある時に整形します！！

# 目次

・[概要](#概要)
・[方法](#自己紹介)
　・[1 ポートフォリオの作成](#1-ポートフォリオの作成)
　・[2 職務経歴書の作成](#2-職務経歴書の作成)
・[メモ](#メモ)
# 概要

## 自己紹介
自分はメーカーでIoT 関連の分野で働いていて、
電気、機械、ITに関する業務をしている。

今年の4月くらいにデータエンジニアという職種を知り興味が出た。
（現職での仕事にほんの少し被る）

以下の本は読了し解像度を上げた（つもり）。

・AI・データ分析プロジェクトのすべて
・データマネジメントが30分でわかる本　（3時間コースはまだ読めていない 9/1 現在）
・実践的データ基盤への処方箋


## 目標
データエンジニア系企業への転職（行きたい所はある）
期限：エントリー完了(10/1)　内定獲得（11/1） 遅れても気にしない

# 方法

### 1 ポートフォリオの作成

職務経歴書の作成中に、あれ、思ったよりデータエンジニアライクな経歴がない！と気づいたので（遅い！）急遽作成することにした。

データすぐ取れる、かつ、自分が興味ある内容ということで、BTCに関するデータを収集し、簡単な分析をすることにした。　（-> うーん、、udemy とかのコースを高速でやってもいいかも。。）

#### やらないこと
~~・クラウド技術の活用
　　サービスは利用するが、BigQuerryやRedShift 等のクラウド技術は使わない、学習しない。（時間がないので）~~
・見た目にこだわりすぎない
　　大事なのは、どう考えて設計・分析したかなので。全くこだわるつもりがないというわけではなく、ポートフォリオ以外の準備が完了次第わかりやすいところから実施する。

#### つくるもの
BTCチャート表示(予想工数 15 h)
①：AWS lambda を使用して、Bitcoin の1分毎のFR*、価格などの情報を取得し、データベースに挿入する。
②：データベースにTableau を接続し表示する。


~~パターンB （ここまでやる予定）  工数 (予想10 h) 
①：Bitcoin の1分毎のFR、価格情報を複数取引所から取得。データベースに書き込み。
②：Looker (かLooker Studio)でデータベースの情報を表示。
③：なんかいい感じに分析（ここが大事だと思うけど、解像度が低い...がんばれ！）~~

*:FR: Funding Rate の略。時間毎の手数料のレーティングを表しており、現物価格と先物価格との乖離を縮小する値を取る。

期限：9/3 23:59

### 2 職務経歴書の作成

以下の本を参考にして作成する。

・40歳でGAFAの部長に転職した僕が1ヶ月でやりきった戦略的面接対策: 日系/外資系企業に転職して年収を上げたいあなたに贈る、思考法/話し方/自己PR/履歴書/質問への答え方の教科書

#### 手順
①　A3の紙にこれまでのプロジェクトを書きまくる。(予想工数　3-6 h)
②　面接で企業が聞きたいスキルを分析する。（予想工数　3 h）
③　経歴からストーリー構築　（予想工数 3 h）




#### メモ

##### スケジュール

|期間|内容|
|---|---|
|9/2 -9/3|ポートフォリオパターンA完了、パターンB着手|
|9/4 - 9/8|ポートフォリオパターンB完了|
|9/9| A3用紙に携わったプロジェクト書き出し、会社が求めるスキル洗い出し|
|9/10|書き出したA3用紙を元にストーリー構築|
|9/11 - 9/12|職務経歴書作成|
|9/13 - 15|志望動機,自己PRを考える|
|9/16 - 17|想定問答集作成|
|9/18 - 31|練習期間、バッファ|

##### 意識すること

転職活動ではネガティブになりがち（らしい）ので、
自分は優秀であると思い込む、自信ある振る舞いを心がける。


##### 他己分析

新卒時代のメンターと同期、大学時代の友人からヒアリングした内容。
協力誠に感謝しています。


メンター
・新人時代から難しい仕事にも取り組んで感謝している。
・さらっとフォローしてくれて助かっている。

同期
・興味があることに対して、集中力がすごい。
・勉強会に参加したり、主催したりなど主体的に行動している。

大学時代の友人
・行動力ある。興味があることを自分から勉強している。
openFrameworks 0.12.0 release

[0.12.0 is Released](https://forum.openframeworks.cc/t/0-12-0-is-released/42426)

ついについにリリースされましたね.
arturoが実質殆どコミットしなくなった今回は [dimitre君](https://github.com/dimitre) が大活躍のリリースです.

ということで個人的に気になってる点をまとめます.

---

## C++17対応

やっとC++17対応しました.
`std` に `boost::filesystem` とか `std::experimental::filesystem` とかぶっ込んだせいでにっちもさっちもいかなくなっていたoFですがついに.
今のところ上記のようなダーティなことは見当たらないのでC++20や23にもすんなり上げられる環境をキープしていきたいですね.

ちなみに, `of::filesystem` というのが散見されるけどこれは基本的には `std::filesystem` か `std::experimental::filesystem` のどちらかになっています. 今見たら `OF_USING_STD_FS` が `0` のとき用で `boost::filesystem` も残ってるな... うーん...

---

## ARC対応

macOS/iOS周りの話ですが, ARCに対応しました. 俺もだいぶ頑張った！（デカいPRマージされてから忙しくなってその後放置してしまったので申し訳なさ）
ただ, iOS周りがユーザー数の少なさもあってまだまだバギーな印象なので我こそはoFでiOS使うぞ！という血気盛んな方は是非色々コミットしていってもらいたいですね.

---

## ProjectGenerator

誰も殆どメンテしないまま10年近い月日が流れたoFの魔境ことPGも内部的にだいぶ変更がありました.
謎の文字列処理で真意が読み解けないパス周りの処理もdimitreが頑張って `std::filesystem` を使ってモダンに.
フロントエンドも何度もelectronのバージョンアップのPRが投げられていたにも関わらず化石のようなバージョンのままだったところをApple Silicon対応とかのために最新版に.
その間にIPC周りの大幅変更やレンダラープロセスでのrequireが禁止されたりしていてだいぶダーティな方法で一旦アップデートしています. (時間見つけてちゃんとした方法に書き直したい...)
まだまだだいぶバギーなので問題が多分にあると思われるので何か見つけたらissue立ててください.

### PG周りの細かいところ

これもmacOS/iOS周りの話になりますが, 
`scripts/templates/osx|ios/emptyExample.xcodeproj/projet.pbxjproj`
がXMLからjsonになっています. 多少読みやすくなった？
結局基本構造は変わらないしXcodeで修正したファイルは謎のjson風plistになるので根本解決には至ってないのでもう少しなんとかしたいところ.

あと, `App.xcconfig` というファイルを自分で作ってプロジェクトディレクトリに置くことでcodesign周りの設定とかがPG通しても置き換えられないようになったので毎回カメラアクセスの許可求められたりしてたのが楽になります. [参考](https://qiita.com/2bbb/items/0dc8f2ad705ff989e02e)

---

## その他追えてない/追う気が無い辺り

### ofCubeMap / ofCubMapShaders

多分CubeMapするやつ.

### ofShadow

多分影に関係してる.

### `ofAVEngineSoundPlayer`

macOS用のサウンドプレイヤー.
fmodが要らない.

### `ofMediaFoundationPlayer`, `ofMediaFoundationSoundPlayer`

主にWindows向け.
ofMediaFoundationPlayerはcodecを追加で入れなくて良いとのこと.
ofMediaFoundationSoundPlayerはfmodが要らない.

---

## 後書き

意外と書くことなかったな...
また何か思いついたら追記します.
通信技術の基礎（物理層〜データリンク層）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/b5495a15-baca-5a8f-47b3-4cdecea2b525.png)
１：通信回線の媒体
①同軸ケーブル：
　信号を伝える導体を絶縁皮膜で被い、メッシュ上の金属でシールドしたケーブルです。シールドは、外界からのノイズを防ぐ効果があります。同軸ケーブルは、ノイズに強く伝送距離が比較的長いことが特徴です。一方で、線が太く、折り曲げたりすることが難しいので、配線に手間がかります。

②ツイストペアケーブル
　２本の電線をペアにして、より線にしたケーブルです。メッシュ上の伊金属でシールドしていないUTP（Unshielded Twisted Pair）ケーブルが、パソコンをネットワークに接続する際に利用されています。UTPケーブルは同軸ケーブルに比べると線が細く、配線しやすいことが特徴です。一方で、伝送距離を長くできない欠点があります。

③光ファイバケーブル
　レーザ光を用いて、信号を光で伝送するケーブルです。信号（光）を伝える部分をコア、コアの周りを被鵜部分をクラッドと言います。コアとクラッドの屈折率の違いを利用して光を全反射させて伝送します。数km〜数十kmの長距離伝送が可能です。さらに、電気ノイズに強い、高速通信が可能であるという特徴もあります。

２：通信方式
通信方式には、半二重方式と全二重方式があります。
①半二重方式：送信または受信を交互に切り替えて行う。無線トランシーバのように通信する。

②全二重方式：送信と受信を同時に行う。電話のように通信ができる。
※全二重方式は、イーサネット（１００BASEーTX、１０００BASE-T）などで用いられている。全二重方式では衝突が発生しない。

３：誤り制御
　データは通信回線上を電気信号や光信号で伝わります。通信回線を伝わっている最中に、外界からのノイズなどでデータに誤り（エラー）が生じてしまうこともあります。したがって、獣神側は、必ずしも送信側が送ったデータを正しく受け取れるわけではないのです。そこで、受信側は、受け取ったデータに誤りが含まれているかどうかを検査し、もし、誤りが含まれていたら、再送するよう送信側に指示を出します。これを誤り制御と言います。誤りが含まれているかどうかの検査方法には、パリティとCRCがあります。

①パリティ
　データ中の１のビットの個数で誤りの有無を確認する方式です。１のビットが偶数個となるように検査用のビット（パリティビット）をつける方式を偶数パリティ、１のビットが奇数個となるようにパリティビットをつける方式を奇数パリティと言います。
　パリティには、垂直パリティ、水平パリティという分類もあります。垂直パリティはデータ１つに対してつけるパリティです。水平パリティは複数のデータの同じビット位置に対してつけるパリティです。
　パリティは、データ中の１ビットが誤っている場合は、データに誤りが含まれていることを検出できます。しかし、複数ビットが誤っている場合には、データに誤りが含まれていることを検出できない場合もあります。連続して誤りが発生している箇所（バースト誤り）があると、精度よくエラーを検出することができません。

②CRC（Cyclic Redundancy Check：巡回冗長検査）
　データを生成多項式と呼ばれる計算式で助産師、その結果、誤りが出たかどうかでエラーの有無を確認する方式です。バースト誤りを精度良く検出することができます。HDLCフレームのエラー検出といった通信分野の他、ディスク装置に記録したデータの読み取りエラー検出などにも使われます。
pythonのmultiprocessを使用する際の注意点

Pythonの`multiprocessing`を使用する際、コードを`if __name__ == "__main__":` ブロック内に配置する方がよいです。主に次の2つの理由からです：

## 1. **プロセスの起動:** 
`multiprocessing`を使用すると、新しいプロセスが生成されます。`if __name__ == "__main__":` ブロックは、スクリプトが実行される主要なプロセスからだけではなく、新しいプロセスからも実行されます。この条件を使用することで、プロセスがスクリプト自体ではなく、スクリプトの特定の部分を再度実行しないようにできます。これにより、意図しない再帰的なプロセス生成を防ぎます。

## 2. **モジュールの再利用:** 
Pythonではモジュールが再利用されることが一般的です。例えば、他のスクリプトからあるモジュールをインポートして利用する場合、そのモジュール内に記述されたコードが実行されます。`if __name__ == "__main__":` ブロックがないと、モジュールがインポートされた際に不要なコードが実行される可能性があります。この条件を使用することで、モジュールがスクリプトとして実行される場合だけ特定のコードブロックが実行されるように制御できます。


したがって、`if __name__ == "__main__":` ブロックは、スクリプトを実行する際に主要なプロセスで実行され、同時に新しいプロセスを生成する場合にも、適切な制御を提供します。これにより、コードが予期しない問題を引き起こすのを防ぎ、モジュールの再利用をサポートします。

## 参考資料
https://stackoverflow.com/questions/20360686/compulsory-usage-of-if-name-main-in-windows-while-using-multiprocessi/20361032#20361032
Batファイル 特定のフォルダの特定の拡張子で最新のファイルを一つだけテキストファイルに出力

# 不完全
本当は10くらい表示するようにしたいが、全くうまくいかない。
10くらい表示するために、tokensは1-10になっている。
bat_ShowNewOne.batをリストを作成したフォルダに直に置く。batファイル自体の文字コードはANSI。
なお、環境依存文字でも大丈夫なようにUTF-8で出力される。
変数は１文字になる。`%FILES%` `%FILES` `%%FILES`はエラー。
Dirを囲んでいるのはバッククォートだが、そのためには事前に`backq`が入っていないとダメ。クォーテーションではない。

:::note info
最新とは更新日付ベースになります。
:::
:::note info
ファイル名には空白が含まれているので、こんなややこしいことになっている可能性があります
:::

```bat:bat_ShowNewOne.bat
@Echo Off
Chcp 65001
Cls
cd %~dp0
FOR /F "usebackq tokens=1-10 delims==" %%i IN (`Dir *.pdf /b /OD`) DO @echo %%i > ThisFolderPdfFileslist.txt
Chcp 932
@Echo On
```

# コマンドラインでも実験できる
この時は変数の前の`%%`は`%`
CLSが入っているので、いらない人は削除してください。

```bat
Cls && FOR /F "usebackq tokens=1 delims==" %i IN (`Dir *.pdf /b /Od`) DO @echo %i > ThisFolderPDFFileslist.txt
```
しかし、以下のように画面に表示させる場合は、いったんすべてのPDFファイルが表示され、最後に１つ表示され、画面では効果が分かりにくい。


```bat
FOR /F "usebackq tokens=1 delims==" %i IN (`Dir *.pdf /b /Od`) DO @echo %i
```

# BingのchatGPT
正しいコマンドは以下のようになります。といって出てきたのがこれ。
```bat
for /f “Tokens=1-10” %%I IN (‘dir *.txt /b /o-d’) do Echo %%I %%J %%K %%L %%M %%N %%O %%P %%Q %%R
```

はい間違い`@Echo`じゃないとうまくいかない。

# txtファイルは無理
なぜなら、最新のファイルが、ファイルリストになるため。
Textファイルのときは最新ではなく、最新の次から10にしなければいけない。
しかし、今のところ、最新１つしか出ないので、リストしか出力されない。
逆に出力ファイル名をタイトルっぽくして、11にしてもいいかもしれない。
という妄想はまず10出てきてからだ。AIはほんと使えないな。

# 10は出ない
`FOR /F "usebackq tokens=1-10 delims==" %%I IN (`Dir *.pdf /b /OD`) DO @echo "%%I %%J %%K %%L %%M %%N %%O %%P %%Q %%R"`
こういうのも試したが、うまくいかない。

```text
FOR /F "usebackq tokens=1-10 delims==" %I IN (`Dir *.mp4 /b /OD`) DO @echo "%I %J %K %L %M %N %O %P %Q %R"
"ファイル名.mp4         "
```

結果が空白が含まれている。このため空白が出力されているらしい。（元環境大臣構文）
最大でも最新のファイル一つしか入っていない。Forの説明からすると各変数に入っていくはずだが、

# 戦いはこれからだ

今のところうまくいっていないのが、このあたりのサブルーチンを使う方法を次は試してみる。
[for - Windows バッチ ファイル内の文字列を連結する方法 - 入門サンプル](https://code-examples.net/ja/q/1eee3e#:~:text=%40echo%20off%20set%20myvar%3D%22the%20list%3A%20%22%20for%20%2Fr,%251%3B%20goto%20%3Aeof%20%E5%A4%89%E6%95%B0%20%40fname%20%E3%81%BE%E3%81%9F%E3%81%AF%20%40ext%20%E3%81%AF%E5%8D%98%E7%B4%94%E3%81%AB%E9%80%A3%E7%B5%90%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82)
[【Windowsバッチファイル】引数のダブルクォーテーションを削除するサンプル](https://tooljp.com/bat_qa/Sample-to-remove-double-quotes-in-argument-3326.html)
[バッチファイルで変数を使う方法 | そまちょブログ](https://somachob.com/bat-set/)
[引数のダブルクォーテーションを削除するサンプル | Windows バッチファイル](https://tooljp.com/bat_qa/Sample-to-remove-double-quotes-in-argument-3326.html)
[windows - バッチファイルで変数を複数行にわけて指定したときのダブルクォーテーションの指定について - スタック・オーバーフロー](https://ja.stackoverflow.com/questions/65968/%e3%83%90%e3%83%83%e3%83%81%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%a7%e5%a4%89%e6%95%b0%e3%82%92%e8%a4%87%e6%95%b0%e8%a1%8c%e3%81%ab%e3%82%8f%e3%81%91%e3%81%a6%e6%8c%87%e5%ae%9a%e3%81%97%e3%81%9f%e3%81%a8%e3%81%8d%e3%81%ae%e3%83%80%e3%83%96%e3%83%ab%e3%82%af%e3%82%a9%e3%83%bc%e3%83%86%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e6%8c%87%e5%ae%9a%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6)
S_ReplaceAll()の置換オプションについて

［すべて置換(A)］を［キーマクロの記録開始(R)］で記録すると、次のようなコードになります。
置換オプション（＝第3引数）が何を意味するのか、調べた結果をまとめました。

※置換前は「タブor半角スペースの連続」、置換後は「半角スペース1個」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2115724/35aa4ec8-8c1f-98ed-f089-7c663819e99d.png)

``` c
S_ReplaceAll('[\\t ]+', ' ', 142);	// すべて置換（※連続するスペースやタブを、スペースに置換）
S_ReDraw(0);	                    // 再描画
```

置換オプションは、次のようなものがあり、必要なオプションの値を足した合計を引数に指定するようです。
    
|置換オプション|値（10進）|
|:-|:-|
|英大文字と小文字を区別する(<u>C</u>)|2|
|正規表現(<u>E</u>)|4|
|見つからないときにメッセージを表示(<u>M</u>)|8|
|置換対象 - 選択文字(<u>0</u>)|0|
|範囲 - 選択範囲(<u>S</u>)|128|

以下のサイトを参考にしました。

   - [S_ReplaceAll関数](<https://sakura-editor.github.io/help/HLP000293.html>)
     - [https://sakura-editor.github.io/help/HLP000293.html](<https://sakura-editor.github.io/help/HLP000293.html>)
   - [置換オプションについて](<https://sakura-editor.github.io/help/HLP000292.html>)
     - [https://sakura-editor.github.io/help/HLP000292.html](<https://sakura-editor.github.io/help/HLP000292.html>)
キューを使ったマルチプロセス処理

## 初めに
業務でmultiprocessingのQueueを使用して並列処理を実装することがあったのでノウハウ記録用に記入にします。誰かのお役に立てれば幸いです。

## 使用例
マルチプロセス処理の例を紹介します。
```python
import multiprocessing as mp

def work(q):
    q.put(object()) #アイテムをキューに追加　最大処理数のリソースが消費されるまでブロック
    # do some work
    q.get() #アイテムを回収　リソースを解放 アイテムが取り出せるまでブロック

if __name__ == '__main__':
    Max = 2 #並列最大処理数
    queue = mp.Queue(Max)
    process = [mp.Process(target=work, args=(queue,)),
               mp.Process(target=work, args=(queue,)), ]
    [p.start() for p in process]
    [p.join() for p in process]


```

## 参考資料
https://docs.python.org/ja/3.11/library/multiprocessing.html#pipes-and-queues
[ SwiftUI ] ダークモードの時にカスタムした色をbackgroundカラーにしたい

:::note warn
Xcode version 14.3.1
:::

### やりたかったこと
ダークモードとライトモードに合わせてバックグラウンドのカラーを簡単にカスタムした色に変えたかった。

```ruby:qiita.rb
@Environment(\.colorScheme) var colorScheme

view()
    .background(colorScheme == .dark ? /* CUSTOM COLOR */ : .white)
```

## 解決法

##### Edit > Format > Show Colorsを選択
（Helpタブでshow colorsと検索することでも見つけられます。）

<Img width='50%' src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3539223/279d65b6-53c6-cb5d-0eec-2e50da0ace54.png" />


##### Colorsウィンドウで好きな色を選択
RGBやHexで好きな色を作れます。

<Img width='30%' src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3539223/bb6b9502-31c6-7f7a-4ca2-cfcb060e27ee.png" />

##### 色が決まったら、左下の色枠をエディターにDrag & Dropする

Color()で囲んであげると他のColorと同様に使うことができました。

<Img width='50%' src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3539223/0f71a8cd-36ba-e919-5461-d6e4bdc158c6.gif" />



他にもたくさん方法があると思いますが、とりあえずできたことを記録として残しました。

## References
* How to change background color depending on color scheme

https://stackoverflow.com/questions/59694589/change-background-color-when-dark-mode-turns-on-in-swiftui

* How to use color literals as Color

https://stackoverflow.com/questions/57307302/can-i-use-color-literals-in-swiftui
TypeScriptで0~nまでの整数だけを取る型を作る

TypeScriptで特定の範囲の整数だけを取り得る型を作りたいことがあります。
0~3までのように短い場合は以下のように列挙して書くことが多いです。
```ts
type ShortRange = 0 | 1 | 2;
```
しかし、0~100のようにある程度長い範囲を取る場合は列挙させて書くのは大変面倒です。以下のように便利な型を作れば手間を省略できます。

```ts
type Range<
  N extends number,
  Result extends number = never,
  C extends never[] = [],
> = C['length'] extends N
  ? Result
  : Range<N, Result | C['length'], [...C, never]>;
```
この`Range`型は`Range<3>`とすると`0 | 1 | 2`、`Range<101>`とすると`0 | 1 | ... | 100`のような型を生成します。
この型は`C`を目安に指定した数値まで再帰的に呼び出して目的の型を取り出します。
型引数の`N`は上限の数値、`Result`は最後に返す型で初期値は`never`にしています(つまり`Range<0>`は`never`です。)。`C`は再帰数の目安に使う型で初期値が`[]`の`never`型の配列です。再帰数は配列の長さ`C['length']`を元に求めます。

`C['length'] extends N`は指定した数値`N`に達しているかどうかをチェックします。

達していなければ`Range`を再度呼び出します。
第1型引数は据え置きなのでその時点の`N`を次に託します。
第2型引数は最終的に返す型です。その時点の`Result`と`C`の長さをユニオンで渡します。
第2型引数は再帰数を表す配列です。`C`に新たに`never`を詰め込んで更新します。

`C['length']`と`N`が一致すればこれまで作り上げてきた`Result`を返します。

この型は再帰を用いているので上限があることに気をつけてください。突破すると以下のようなエラーが出ます。
```
Type instantiation is excessively deep and possibly infinite.
```
私の環境では`Range<1000>`が上限でした。

`Range<3>`だと以下のような流れです。

| `Range`の呼び出し数 | `N` | `Result` | `C` |
| --- | --- | --- | --- |
| 1回目 | `3` | `never` | `[]` |
| 2回目 | `3` | `0` | `[never]` |
| 3回目 | `3` | `0 \| 1` | `[never, never]` |
| 4回目 | `3` | `0 \| 1 \| 2` | `[never, never, never]` |

`never`は何かとユニオンを取ると消滅するので`never | 0`ではなく`0`と表記しています。


## おまけ1
`Range<N>`で指定したNも含めたい場合は以下のようにします。
```ts
type Range<
  N extends number,
  Result extends number = N,
  C extends never[] = [],
> = C['length'] extends N
  ? Result
  : Range<N, Result | C['length'], [...C, never]>;
```
`Result`の初期値を`N`にしておくことで、最初に紹介した型の結果と`N`のユニオンが作られるようにしました。
他にも最終的な型をいじって表現するなどいくつかの方法で書けます。
```ts
type Range<
  N extends number,
  Result extends number = never,
  C extends never[] = [],
> = C['length'] extends N
  ? Result | C['length']
  : Range<N, Result | C['length'], [...C, never]>;
```

## おまけ2
n~mの整数のように両方の値を指定する場合は以下のようにします。
```ts
type Range<
  N extends number,
  M extends number,
  Result extends number = never,
  C extends never[] = [],
  Flag extends boolean = false,
> = C['length'] extends N
  ? Range<N, M, Result | C['length'], [...C, never], true>
  : Flag extends true
  ? C['length'] extends M
    ? Result
    : Range<N, M, Result | C['length'], [...C, never], Flag>
  : Range<N, M, Result, [...C, never], Flag>;
```
新たに`M`と`Flag`を型引数に取るようにしました。`N`が範囲の最初の数値、`M`は範囲の終端です。
これも同じく`C`で管理する再帰数を元に型を作って最終的に`C['length']`が`M`とぶつかった時の`Result`を返します。
異なる点は`C['length']`が`N`とぶつかるまでは`Result`を更新しないところです。衝突するまでは`Flag`は`false`を取りその間は`Result`を更新せずに再帰数だけ更新します。衝突したタイミングから`Flag`を`true`に切り替えて`Result`の更新を開始するようにしました。
メソッド

## 概要

::: note
メソッド（＝処理の部品化）
:::

メリット：・大枠で捉えやすくなり、プログラム全体の見通しが良い。
　　　　　　　　　　　・繰り返し使用でき効率的。

##### メソッドの2つの役割

::: note warn
- メソッドを定義する役割（メソッド側）
メソッド側から、呼び出し側（元）に返すデータを「戻り値」と言う。

- そのメソッドを利用する役割（呼び出し側）
呼び出し側から、メソッド側へ渡すデータを「引数」と言う。
:::

#####　メソッドの定義


```Sample.java
//aaaがメソッド名。（）内を仮引数と言う。呼び出し側で設定されているものをそのまま使用。
//戻り値の型を設定する。resultはint型なので「int」となる。
static int aaa(int value) {
    int result = value * value;
    return result;  //戻り値。これを呼び出し元に返す。
}
```
#####　メソッドの呼び出し
「メソッド名（実引数）;」
※実引数と仮引数の型は同一である必要がある。

```Sample.java
//省略
aaa(3);
//省略
```
[Docker on macOS] Ubuntuコンテナ上で走るLinuxカーネルのバージョン

「特定のカーネルバージョンでのみ提供されるaptパッケージを使いたい」という状況があり、調べた。間違えてたら教えてください。

## 調べて分かったこと

### Ubuntu image version ↔️ Ubuntu release version

DockerのUbuntuイメージのバージョンは、[Ubuntuのリリースバージョン](https://wiki.ubuntu.com/Releases)に相当する。

### Linux kernel version ↔️ Docker engine version

macOS上のDockerエンジンは、LinuxのVMを走らせており、Linux系のコンテナはその上で走っているから。[ref](https://stackoverflow.com/questions/64000123/can-i-change-the-linux-kernel-that-docker-uses-on-macos)

よって、Docker on macOS上のUbuntuコンテナが使用するLinuxカーネルのバージョンは、Dockerエンジンのバージョンに依存する。

### Ubuntu release version ↔️ Linux kernel version

Ubuntuのリリースバージョンごとに、どのLinuxカーネルのバージョンがサポートされているかは異なる。[ref](https://designetwork.daichi703n.com/entry/2017/03/05/ubuntu-kernel-version)

### (**TODO:確認**) Docker engine version ↔️ Ubuntu image version

「Dockerエンジンのバージョンにより、使用可能なUbuntuイメージのバージョンが制限される」ということだろうか。


## Ref.

https://stackoverflow.com/questions/64000123/can-i-change-the-linux-kernel-that-docker-uses-on-macos

https://designetwork.daichi703n.com/entry/2017/03/05/ubuntu-kernel-version
【Flutter】ハンバーガーメニューを実装してみた

Flutterでハンバーガーメニューを表示させるのにはどうするんだろう？
と思って調べてみたら、特にパッケージを使うことなく、簡単に実装できそうだったので、やってみました。


# 実装後の動作

この記事でゴールとする実装の動作動画です。

### 表示結果

<img width="300" alt="09032023155931.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524065/3d1ef10a-72fe-b051-4433-b9995c556f6a.gif" >

# 実装手順

以下、実装手順です。

## 1\. ハンバーガーメニュー表示

ハンバーガーメニューを表示させるには、scaffoldのdrawerプロパティに`Drawer`ウィジェットを渡すだけで、基本的な機能は実装できます。

### サンプルコード

```dart
@override
Widget build(BuildContext context) {
return Scaffold(
  appBar: AppBar(
    title: const Text('Sample'),
  ),
  drawer: const Drawer(), // ここを追加
  body: Container(),
);
}
```

このコードだけで、AppBarにハンバーガーメニューを表示させるアイコンと、押下時にハンバーガーメニューが表示されます。

### 表示結果

<img width="300" alt="09032023160804.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524065/c50c0aa8-e13f-3157-34dd-0c3c1ae5a765.gif" >

## 2\. ハンバーガーメニューの中身実装

ListViewで実装させています。

### サンプルコード

```dart
final menuList = ['Top', 'UserData', 'Access', 'Setting'];

@override
Widget build(BuildContext context) {
return Scaffold(
  appBar: AppBar(
    title: const Text('Sample'),
  ),
  drawer: Drawer(
    child: ListView(
      children: [
        const DrawerHeader(
          child: Center(
            child: Text(
              'DrawerHeader',
              style: TextStyle(
                fontWeight: FontWeight.bold,
                fontSize: 20,
              ),
            ),
          ),
          decoration: BoxDecoration(
            color: Colors.blue,
          ),
        ),
        const Divider(
          thickness: 1.0,
          color: Colors.black,
        ),
        ...menuList.map(
          (e) => listTile(e),
        )
      ],
    ),
  ),
  body: Container(),
);
}

// コンポーネント

Widget listTile(String title) {
    return Column(
      children: [
        Padding(
          padding: const EdgeInsets.symmetric(horizontal: 12.0),
          child: Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              Text(
                title,
                style: const TextStyle(
                  fontWeight: FontWeight.bold,
                  fontSize: 28.0,
                ),
              ),
              IconButton(
                onPressed: () {},
                icon: const Icon(Icons.arrow_circle_right),
              )
            ],
          ),
        ),
        const Divider(
          thickness: 1.0,
          color: Colors.black,
        ),
      ],
    );
  }
```

### 表示結果

<img width="300" alt="09032023155931.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524065/3d1ef10a-72fe-b051-4433-b9995c556f6a.gif" >

以上。
簡単なのでやってみてください。
Excel VBAで知らなかった便利な機能

## 機能① どの図からマクロが呼び出されたのかを知る

マクロを図に登録してから、その図をクリックすると、登録したマクロが呼び出されますが、
同じマクロを複数の図に登録した場合、どの図がクリックされたのか知りたい場合があります。

そんな時に、`Application.Caller`プロパティを参照すれば、クリックされた図の名前を取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2115724/a5137c92-6499-f629-4cd1-1606e63953ac.png)

> - 引用元：[マクロ呼び出し元の図形・画像を取得するには](<https://koukimra.com/archives/2085>)
>   - [https://koukimra.com/archives/2085](<https://koukimra.com/archives/2085>)

## 機能② キーボードからのキー入力を再現する

キーボードからのキー入力は、`Application.SendKeys`メソッドを使うと再現できます。
これを使えば、VBAから直接コントロールできないアプリケーションでも、そのショートカットキーを`Application.SendKeys`メソッドで送ることで、間接的にコントロールできます。

例えば、電卓を起動してから、VBEのイミディエイトウィンドウ（Ctrl+G）に`AppActivate "電卓" : SendKeys 1024 & "{=}", True`を入力して実行すると、電卓に1024を表示することができます。
（※電卓を起動してから数秒待たないと、実行時エラーが発生することがあります。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2115724/619b11ac-3d1e-e553-4669-7bac8749cc3f.png)

> - 引用元：[SendKeysメソッドとAppActivateステートメント｜VBA入門](<https://excel-ubara.com/excelvba1/EXCELVBA421.html>)
>   - [https://excel-ubara.com/excelvba1/EXCELVBA421.html](<https://excel-ubara.com/excelvba1/EXCELVBA421.html>)

## 機能③ ［マクロの記録］ではコードが生成されない場合がある

［マクロの記録］を使っても、コードが生成されない場合があります。
例えば、図のサイズを[リセット]するボタンは、［マクロの記録］を使ってもコードが生成されません。

そんな場合でも、`Application.CommandBars.ExecuteMso`メソッドを使って、機能のID（「コントロールID」と呼ぶ）を送れば、機能を実行できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2115724/7d49049a-9947-b49a-1fbb-f2ec480c6d02.png)

> - [「図のリセット」を実行するExcelマクロ \| 初心者備忘録](<https://www.ka-net.org/blog/?p=5246>)
>   - [https://www.ka-net.org/blog/?p=5246](<https://www.ka-net.org/blog/?p=5246>)

## 機能④ `WorksheetFunction`が使えない場合がある

VBAの関数を使うよりも、`WorksheetFunction`を使う方が、プログラムの実行速度は速くなりますが、中には実行時エラーが発生して、使えない関数もあります。
そんな場合でも、`Application.Evaluate`メソッドを使えば、同じ関数をエラーなしで実行できます。
（※すべての関数を試した訳ではないので、もし例外があったらスミマセン。）

また、`Application.Evaluate`メソッドを簡略化した書き方として、`[]`という（糖衣）構文が用意されているので、便利そうです。

> - [Excel VBA Evaluateメソッドを使う方法について](<https://www.kurumico.com/excel-vba-evaluate/9090/>)
>   - [https://www.kurumico.com/excel-vba-evaluate/9090/](<https://www.kurumico.com/excel-vba-evaluate/9090/>)

## 機能⑤ その他

他にも便利なメソッドやプロパティが、`Application`オブジェクトにあります。
下記のリンクから一覧を眺めるだけでも、勉強になりそうです。

> - [Applicationのプロパティ、メソッド、イベント一覧｜VBAリファレンス](<https://excel-ubara.com/EXCEL/EXCEL914.html>)
>   - [https://excel-ubara.com/EXCEL/EXCEL914.html](<https://excel-ubara.com/EXCEL/EXCEL914.html>)
Web+DB PRESS 最終号 「Python 最新Web開発」をWindowsで動作させる

# 1.はじめに
Web+DB PRESS 最終号 「Python 最新Web開発」の内容をWindows上で動作させるために必要な手順を補足する。

# 2.第1章(p10-p13)
## 準備
Anacondaのインストール
下記サイト等を参考にanacondaをインストールしてpython環境を準備する
[AI-interのPython3入門](https://ai-inter1.com/python-install/)
[JavaDrive](https://www.javadrive.jp/python/install/index5.html)

## インストール
1.作業フォルダを作成する（例：c:\workspace）
2.コマンドプロンプトを起動し(Windows+r, cmd)、1.で作成した作業フォルダへ移動する
```
c:\user\hoge>cd c:\workspace
```
3.以下コマンドを実行しpython仮想環境を作成する
```
c:\workspace>python -m venv env
```
4.仮想環境を起動する
```
c:\workspace>env\Scripts\activate.bat
```
5.fastapi, uvicornをインストールする
```
(env)c:\workspace>pip install fastapi==0.100.0
(env)c:\workspace>pip install uvicorn[starndard]
```
6.c:\workspace\envの下にsrcフォルダを作成する

7.c:\workspace\env\srcフォルダの下に記事内内容のmain.pyを保存する

## ローカルでの実行
1.srcフォルダへ移動しuvicornを実行する
```
(env)c:\workspace>cd dev\src
(env)c:\workspace\dev\src>uvicorn main:app
```

第2章以降も、気が向いたら適宜追記していきます
「static」と「インスタンス」

## static変数とインスタンス変数の違い

static変数とは、static修飾子がついた変数のことです。
また、static修飾子がついていない変数のことをインスタンス変数といいます。

- インスタンス変数は、「クラスのオブジェクト（インスタンス）を生成したタイミングで作られる変数」です。
そして、「クラスのオブジェクト（インスタンス）毎に管理されています」。(オブジェクト毎に変数が作られる)

```Sample.java
Sample m = new Sample();
m.instanNum = 1;
```

- static変数は、「クラスのオブジェクト生成（インスタンス生成）に関係なく作られる変数」です。（static変数に最初にアクセスしたタイミングで作られる）
そのため、「クラスのオブジェクト（インスタンス）に関係なく共通で管理しています」。（共通で1つの変数が作られる）
static変数は、静的な変数であり、オブジェクト毎に管理しているインスタンス変数とは違い、static変数の実体は1つです。

```Sample.java
Sample.staticNum = 1;
```

## staticメソッドとインスタンスメソッドの違い
staticメソッドとは、static修飾子がついたメソッドのことです。
また、static修飾子がついていないメソッドのことをインスタンスメソッドといいます。

staticメソッドの主な使い方は、インスタンスの状態に依存しない処理をさせることです。これはユーティリティメソッドとも呼ばれ、決まりきった処理などに用いられます。

インスタンスメソッドは、クラスのオブジェクト（インスタンス）を生成したタイミングで使えるようになるメソッドです。それに対しstaticメソッドは、クラスのオブジェクト（インスタンス）を生成しなくても使うことができます。
OkHttpでステータスコードを変更する

## 概要
OkHttpのAuthenticatorを使用して、ステータスコードが401の場合にアクセストークンを更新する処理を実装していました。しかし、アクセストークンが無効なエラーがステータスコードが400で返されることがあり、本来はAPIの仕様を変更してもらうのが適切な解決策ですが、その際にもクライアント側でアクセストークンを更新するようにしました。

## 対応方法
Authenticatorへはステータスコードが401の場合のみリクエストが到達するため、ステータスコードが400の場合に401に変更するInterceptorを適用しました。

```kotlin
class ReplaceStatusCodeInterceptor() : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val response = chain.proceed(chain.request())
        return if (response.code != 400) {
            response
        } else {
            response.newBuilder().code(401).build()
        }
    }
}
```

## 参考文献
- https://gist.github.com/Sar777/f7daaa0f9c0ad67def24dbd4a53d20bc
LeetCodeのPermutation in String解いてみた

# 始めに
今回からLeetCodeで解いた問題をアプトプットしてみる
正直コーディング問題はかなり苦手。
しかし、昨今のエンジニア採用競争は激化していて、有名テック企業などで働くにはコーディングテストやコーディング面接を突破しなければいけない。

重い腰を上げて頑張ってみる

ちなみにLeetCodeとは実際にテック企業で出題されたコーディング問題を解くことができるサイトです。
AtCorderとかよりもアルゴリズム特化って感じ。
カテゴリ毎にeasyとmediumを中心に解いていく。
使う言語はPythonでやってみる。

あ、あと変なことを言う可能性は大いにあるので容赦なくご指摘お願いします



# 問題

https://leetcode.com/problems/contains-duplicate/description/

まずこの問題は数値が格納された配列numsが渡され、配列内に同じ数値が2つ以上あればTrue、無ければFalseを返すプログラムを作ればよい。
解法はいくつかあるがまずは簡単な例から試してみる




## 解法1
最も簡単なのが一つひとつ確かめていく方法
簡単に思いつく方法だが、最悪の場合**計算量O(N2)** かかります。
当然、タイムオーバーで通りません。
基本的にLeetCodeでブルートフォースは大体時間オーバーで失敗します...
``` python
# 解法1 ブルートフォース
class Solution:
    def containsDuplicate(self, nums: List[int]) -> bool:
        for i in range(len(nums)-1):
            for j in range(i+1, len(nums)):
                if nums[i] == nums[j]:
                    return True

        return False
```

## 解法2
続いてが**ハッシュマップ**(ハッシュテーブル)を使って各文字の出現数をカウントしていく方法。
この方法なら最悪の場合でも**計算量O(N)** で余裕で突破できる。
ちなみに自分は最初にこれが思いついた。
シンプルなので解説は不要かもだけどざっくり説明してみる。

例. nums = [1,2,3,1]
上記を例にすると
1は2回
2は1回
3は1回

ハッシュマップにカウントするとこうなる
hash_map = {1: 2, 2: 1, 3: 1}

nums[i]の値が既にhash_map内に存在してる場合、配列内に同じ数字が2つ以上あるということが証明される。
よってこの時点でTrueを返す。
全て通っても同じ値が出てこなかった場合、必然的にFalseになる訳です。

``` python
# 解法2 ハッシュマップ
hash_map = {}
for i in range(len(nums)):
    if hash_map.get(nums[i]) is None:
        hash_map[nums[i]] = 1
    else:
        return True
return False
```

## 解法3
ソートしてから隣り合う値が同じの時点でTrueとなる。
コードとしてはとてもシンプルで一番わかりやすい。
一見O(N)で計算できそうですが、前処理にソートしてるのでハッシュマップの方が早い。
全体の計算量としてはO(nlogn)+O(n)になるのですが、Big O記法では最も計算量が増える項を優先するのでO(nlogn)となる。(ちょっと自信ない)
``` python
nums.sort()
for i in range(1, len(nums)):
    if nums[i] == nums[i-1]:
        return True
return False
```

## 感想
ハッシュマップの基本問題なだけあり、この辺はサクッと解けた。
複数のアルゴリズムを組み合わせたりすると一気に理解が追いつかなくなるから今後もアウトプットを続けていきます。
間違った箇所などあればビシバシご指摘お願いします🙇‍♂️
JavaScript 

＜配列の取り出し＞
let data = ['JavaScript', 'Python', 'PHP', 'Rudy', 'Perl'];
console.log(data[0]);
console.log(data[1]);
console.log(data[2]);
console.log(data[3]);
console.log(data[4]);

＜配列の削除＞
let data = ['Python', 'PHP', 'JavaScript'];
console.log(delete data[0]);
console.log(data);
console.log(data.length);

let data2 = ['Python', 'PHP', 'JavaScript'];
data2.shift(); //配列の先頭から要素を削除
console.log(data2);
console.log(data2.length);

＜カウントダウン＞
for (let i = 10; i >= 0; i--) {
    console.log(i);
}
/*
for (初期化式; 条件式; 増減式) {
    処理A
    処理B
    ...
}
*/

＜配列専用の繰り返し構文(連想配列では使えない)＞
let data = [ 'apple', 'orange', 'banana' ];
for (const value of data) {
    console.log(value);
}
for (let i = 0; i < data.length; i++) {
    console.log(data[i]);
}

＜時刻・時期ごとにメッセージを表示する方法＞

const gozen = new Set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]);
const ohiru = new Set([12]);
const gogo  = new Set([13, 14, 15, 16, 17, 18]);
const yoru  = new Set([19, 20, 21, 22, 23]);

for (let h = -1; h <= 24; h++) {
    console.log(`\n== ${h}時 ==`)
    console.log('---< 解法1 >---');
    if (h >= 0 && h <= 11) {
        console.log('おはようございます');
    } else if (h === 12) {
        console.log('お昼です。');
    } else if (h >= 13 && h <= 18) {
        console.log('こんにちは。');
    } else if (h >= 19 && h <= 23) {
        console.log('こんばんは。');
    } else {
        console.log('時刻の範囲を超えています。');
    }

    console.log("---< 解法2 >---");
    if (h < 0 || h > 23) {
        console.log('時刻の範囲を超えています。');
    } else if (h <= 11) {
        console.log('おはようございます。');
    } else if (h === 12) {
        console.log('お昼です。');
    } else if (h <= 18) {
        console.log('こんにちは。');
    } else {
        console.log('こんばんは。');
    }

    console.log('---< 解法3 >---');
    if (h < 0 || h > 23) {
        console.log('時刻の範囲を超えています。');
    } else if (h >= 19) {
        console.log('こんばんは。');
    } else if (h >= 13) {
        console.log('こんにちは。');
    } else if (h === 12) {
        console.log('お昼です。');
    } else {
        console.log('おはようございます。');
    }

    console.log('---< 解法4 >---');
    if (gozen.has(h)) {
        console.log('おはようございます。');
    } else if (ohiru.has(h)) {
        console.log('お昼です。');
    } else if (gogo.has(h)) {
        console.log('こんにちは。');
    } else if (yoru.has(h)) {
        console.log('こんばんは。');
    } else {
        console.log('時刻の範囲を超えています。');
    }
}

const spring = new Set([3, 4, 5]);
const summer = new Set([6, 7, 8]);
const autumn = new Set([9, 10, 11]);
const winter = new Set([12, 1, 2]);

for (let m = 0; m <= 13; m++) {
    if (spring.has(m)) {
        console.log(`${m}月は春です`);
    } else if (summer.has(m)) {
        console.log(`${m}月は夏です`);
    } else if (autumn.has(m)) {
        console.log(`${m}月は秋です`);
    } else if (winter.has(m)) {
        console.log(`${m}月は冬です`);
    } else {
        console.log('月の指定に誤りがあります。');
    }
}

＜条件分岐＞
let rank = 'B';

switch(rank) {
case 'A' :
    console.log('Aランクです。');
    break;
case 'B' :
    console.log('Bランクです。');
    break;
case 'C' :
    console.log('Cランクです。');
    break;
default :
 console.log('ランク外です。');
    break;
}
Drag & Drop APIで親要素を並び変える

Drag & Drop API使用して要素を並び替える際に、
ドロップが子要素にもできてしまっていました。

その回避策として子要素にはドロップをできないようにしました。


```html:change.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Drag & Drop Example</title>
    <script src="main.js"></script>
    <style>
        #container {
            display: flex;
            flex-direction: column;
            width: 300px;
            margin: 0 auto;
        }
        .item {
            background-color: #f0f0f0;
            border: 1px solid #ccc;
            padding: 10px;
            margin: 5px;
            cursor: pointer;
        }
    </style>
</head>
<body>
    <div id="container">
        <div class="item" draggable="true">
            <div>Item</div>
            <div>1</div>
        </div>
        <div class="item" draggable="true">
            <div>Item</div>
            <div>2</div>
        </div>
        <div class="item" draggable="true">
            <div>Item</div>
            <div>3</div>
        </div>
    </div>
</body>
</html>
```

```javascript:main.js
window.addEventListener('DOMContentLoaded', function() {
    const container = document.getElementById('container');
    let draggingItem = null;

    container.addEventListener('dragstart', (e) => {
        draggingItem = e.target;
        e.dataTransfer.setData('text/plain', e.target.innerText);
    });

    container.addEventListener('dragover', (e) => {
        e.preventDefault();
    });

    container.addEventListener('dragenter', (e) => {
        if (e.target !== container && e.target.classList.contains('item')) {
            e.target.style.border = '2px dashed #ccc';
        }
    });

    container.addEventListener('dragleave', (e) => {
        if (e.target !== container && e.target.classList.contains('item')) {
            e.target.style.border = '';
        }
    });

    container.addEventListener('drop', (e) => {
        e.preventDefault();
        if (e.target !== container && e.target.classList.contains('item')) {
            e.target.style.border = '';
            draggingItem.innerText = e.target.innerText;
            e.target.innerText = e.dataTransfer.getData('text/plain');
        }
    });
})
```
選択したプルダウン別に、classを割り振り、cssを当てる方法

## 経緯
プルダウンの選択方式で選んだ項目を一覧で表示する際、それぞれの値に別々の色をつけたい。
と思ったのがきっかけ。

### 開発環境
Rails 6.1.7.4
ruby 3.0.1


- 繰り返し処理で表示しているため、通常通りclassをつけると、全て同じclassになってしまう。

**選択式にしたプルダウンを表示するコードのクラス**
```
<td class="priority_class　display-4" > 省略
```
検証ツールで確認 ※余計な情報は黒塗り
![スクリーンショット 2023-08-22 17.34.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508102/43fd8489-5807-34b5-7b10-eb68e685b075.png)

これだと、選択肢で選んだ内容が違くても、全て同じCSSが適用されてしまう


## 条件によりclassが割り振られるようにする
※enum日本語化してるので、設定はこちら。
```
enum priority: { low: 0, medium: 1, high: 2 }
```


**app/helper/モデル名_helper.rb**　
```
def priority_class(priority)
    case priority
    when "low"
      "low-priority"
    when "medium"
      "medium-priority"
    when "high"
      "high-priority"
    else
      ""
    end
  end
```
elseいらないかも？

**選択式にしたプルダウン** 

<td class="<%=　定義したメソッド名（引数） %>">　<%= プルダウンのコード %></td>

```
<td class="<%= priority_class(モデル名.priority) %>　 display-4 "> 省略
```
上記のように記述することで、各選択肢ごとに違うclassがあてがわれ、CSSも別とすることができる(入れ子なので少しわかりづらい）

**<%= priority_class(モデル名.priority) %>の部分が、helperで定義した、case文に一致したclass名となる。**

検証ツールで確認
![スクリーンショット 2023-08-22 17.33.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508102/49240227-a31f-035b-08af-2114cb6e38e7.png)
※high,medium,lowそれぞれに違うclassが割り振られているのがわかる
 下記のように別々にcssを当てて、適用できるようになった！

css設定例

```
.low-priority {
  background-color: rgb(2, 202, 2);
  color: white;
}

.medium-priority {
  background-color: rgb(229, 205, 84);
 　　color: white;
}

.high-priority {
  background-color: red;
  color: white;
}
```

実際の状態
![スクリーンショット 2023-08-22 17.52.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508102/47488530-4bc6-3971-0e76-5a094d6a843e.png)


## まとめ
もっとスマートな方法があるかもしれないが、目的は果たせたのでよしとする。
やりたいことを見つけて、どうしたらできるのかと調べていくことで、いろいろな方法が出てくるのはとても面白い。
リファレンスを理解する力が不足しているので、効率的な検索方法などを知りたいものだ。
python仮想環境の作成メモ

pythonは開発単位で仮想環境を作成できる。
これによって、仮想環境同士の影響を気にせず開発が進められる。

windowsの場合
1.コマンドプロンプトの起動

2.[python -m venv <仮想環境名>]という書式で仮想環境の作成ができる。
　ex:
  ```
  python -m venv venv_exsample
  ```

3.python仮想環境に入るため、作成したディレクトリびあるScriptsのactivate.batを実行する。
  ```
  cd　<仮想環境名>/Scripts
  ```
  ```
  activate.bat
  ```

  終わったら、
  ```
  deactivate
  ```
BigQueryで、あるtableの時刻間の差分データを取得

BigQueryのタイムトラベル機能を用いれば良い。しかし注意点として次の2点があります: 

1. タイムトラベルの**時間枠はデフォルトでは7日間**
1. **一度に同じtableの2つの異なる時間を参照することは無理**みたいなので、`TEMP TABLE`を使う

https://cloud.google.com/bigquery/docs/time-travel


以下のsample queryで適宜`<target_table_id>`、`INTERVAL ***`、`key_*`を置き換えて使ってください: 

```sql
CREATE TEMP TABLE before_snapshot
AS 
SELECT DISTINCT 
  key_1,
  ...  ,
  key_n
FROM `<target_table_id>`
FOR SYSTEM_TIME AS OF TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
;

SELECT 
  * 
FROM `<target_table_id>` after_snapshot
WHERE NOT EXISTS (
  SELECT 1
  FROM before_snapshot
  WHERE 
    after_snapshot.key_1 = before_snapshot.key_1 AND
    ...                                          AND
    after_snapshot.key_n = before_snapshot.key_n 
)
;
```
[リサーチ・メモ] jsonパラメータを用いたjunitテスト

## 背景
会社でjsonパラメータを用いたjunitのテストを実施した為、メモとして纏める。

## サンプルソース
```
@RunWith(Enclosed.class)
public class xxxxxTest {

    @RunWith(Parameterized.class)
    public static class yyyyyTest {
        private xxxxxResource sut = spy(xxxxxResource.class);

        /** Parameter(0)：テスト名称. */
        @Parameter(0)
        public String testName;

        /** Parameter(1)：xxxxxResourceのリクエスト. */
        @Parameter(1)
        public xxxxxResourceRequest request;

        /**
         * パラメータファイルからテストデータを取得する.
         *
         * @return パラメータファイルから取得したテストデータの配列
         * @throws Exception テストが失敗したとき
         */
        @Parameters(name = "{0}")
        public static Object[][] getTestParameters() throws Exception {
            // パラメータファイルからテストデータを読み込み、Beanにロードする
            List<yyyyyParam> testParamList = fromJSON(new TypeReference<List<yyyyyParam>>() {
                    }, "yyyyy/param.json");

            // Beanのデータを二重配列に詰めなおす
            ArrayList<Object[]> objParamArrayList = new ArrayList<>();
            for (yyyyyParam testParam : testParamList) {
                ArrayList<Object> objParamArray = new ArrayList<>();
                objParamArray.add(testParam.testName);
                objParamArray.add(testParam.request);
                objParamArrayList.add(objParamArray.toArray(new Object[0]));
            }

            // 取得したテストデータを返す
            return objParamArrayList.toArray(new Object[0][0]);
        }

        @Test
        public void testWithParameters() throws Exception {

            // 検証対象のメソッドを呼び出す
            Response response = sut.yyyyy(request);

            // レスポンスや例外の検証を行う
        }
    }
}

    //JSONを任意の型にパース
    public <T> T fromJSON(final TypeReference<T> type, final String filename) throws IOException {
        T data = null;
        Path file = Paths.get(フルパス);
        String[] s = {};
        String text = String.join("\n", Files.readAllLines(file).toArray(s));
        data = mapper.readValue(text, type);
        return data;
    }
```

## 各詳細
### `@RunWith(Parameterized.class)`
同じテストケースを異なるパラメータで実行したい場合に使用する。

### `@Parameter()`
テストで使用するパラメータのDTOを記載した、yyyyyParamの内容を記載する。

### `@Parameters(name = "{0}")`
getTestParametersのjsonパラメータをロードする。
(name = "{0}")とすることで、`@Parameter(0)`の値が、テストケースの名前としてjunitに出力される。
JavaScript 関数呼び出し

/*
関数定義
　　　　　関数名　　　　　仮引数１　　　仮引数２
function function-name(parameter1, parameter2, ...) {
    ...
    return return-value; // 戻り値
}
*/

function add(x, y) {
     return x + y;
}

const a = 20;
const b = 30;

const c = add(a, b); 
console.log(`${a} + ${b} = ${c}`);
Azure Databricks でアプリケーション ログを Log Analytics ワークスペースに送信する

## はじめに

Azure Databricks ではノートブックに記載したログ情報を Log Analytics ワークスペースに送信することができます。
なお、[Spark Monitoring ライブラリ](https://github.com/mspnp/spark-monitoring/tree/l4jv2)を使用する必要があるため、今回は導入までの手順を説明します。

## 手順

### 1. ライブラリのビルド

以下のコマンドを実行して、Java と Maven をインストールします。なお、実行環境として Ubuntu 22.04 を使用しています。

```console
$ sudo apt update
$ sudo apt install -y default-jdk maven
```

Spark Monitoring リポジトリを git clone して、Maven ビルドします。
今回は Databricks Runtime 12.2 をオプションで指定していますが、これはご自身の Databricks Runtime バージョンに合わせる必要があります。

```console
$ git clone https://github.com/mspnp/spark-monitoring.git
$ cd spark-monitoring/
$ git switch l4jv2
$ mvn package -P dbr-12.2-lts
```

`src/scripts/spark-monitoring.sh` にて、Log Analytics ワークスペースの ID とキーを記載します。これらの情報は Azure Portal の Log Analytics ワークスペース画面にて確認できます。

```sh
export LOG_ANALYTICS_WORKSPACE_ID=<Log Analytics ワークスペース ID>
export LOG_ANALYTICS_WORKSPACE_KEY=<Log Analytics ワークスペース キー>
```


### 2. Databricks ワークスペースへのファイル アップロード

`src/scripts/spark-monitoring.sh` および `target/spark-monitoring_1.0.0.jar` を Databricks ワークスペースにて `dbfs:/databricks/spark-monitoring/` に配置します。
その際、[Databricks CLI](https://learn.microsoft.com/ja-jp/azure/databricks/dev-tools/cli/databricks-cli-ref#use-the-cli) を使用したアップロードでもよいですし、UI 画面からアップロードし、Notebook で以下のようなコードを実行してファイルを移動してもよいです。

```console
%sh
mv /FileStore/spark-monitoring.sh /dbfs/databricks/spark-monitoring/spark-monitoring.sh
```

### 3. クラスターの起動

Init Script で `dbfs:/databricks/spark-monitoring/spark-monitoring.sh` を指定したうえでクラスターを起動します。
その際、手順 1 のビルド時にオプションで指定した Databricks Runtime バージョンを選択します。

### 4. コードの実行

Databricks ノートブックにて以下のサンプルコードを実行します。

```python
logger = sc._jvm.org.apache.log4j.LogManager.getRootLogger()
logger.info('logging test')
```

### 5. Log Analytics ワークスペースでの確認

Log Analytics ワークスペースにて `SparkLoggingEvent_CL` クエリを実行し、手順 4 で指定したログが送信されていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/39424f5f-43f8-d00c-083c-a9daae066412.png)

メトリクスに関しては `SparkMetric_CL` クエリにより確認できます。

## おわりに

Azure Databricks ノートブックに記載したログ情報を Log Analytics ワークスペースに送信する方法を説明しました。先述の通り、ログ情報のみならずメトリクス情報も取得できるので、これらを利用してアラートを作成することもできます。

## 参考

https://learn.microsoft.com/en-us/azure/architecture/databricks-monitoring/application-logs