OmniAICreator/Qiita-1.07M huggingface dataset:
ノンブロッキングI/Oについて調べてみた

# はじめに
どうも。こんにちは。
[42tokyo](https://42tokyo.jp/)といったところで、ソケットプログラミング？？を学んでいます。
課題で、ノンブロッキングなファイルディスクリプタを扱うことになり「ノンブロッキングI/O」について調べてみました。
間違い等があれば、ご指摘ください。

# 結論
「ノンブロッキングI/O」とは、ファイルディスクリプタをノンブロッキングな状態で扱うこと。
ノンブロッキングにすることで、処理効率が上がる場合がある。
「ノンブロッキングI/O」と「非同期I/O」は、異なるもの。

# サンプルコード
ノンブロッキングなファイルディスクリプタからread();で読み込んでみる。
```c:non_blocking_read.c
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>

int	main(void) {
	// ファイルディスクリプタをノンブロッキングに設定
	int	flags = 0;

	if ((flags = fcntl(STDIN_FILENO, F_GETFL)) == -1) {
		perror("fcntl");
		exit(EXIT_FAILURE);
	}
	flags |= O_NONBLOCK;
	if (fcntl(STDIN_FILENO, F_SETFL, flags) == -1) {
		perror("fcntl");
		exit(EXIT_FAILURE);
	}
	while (1) {
		sleep(3);

		// char	buffer[1024] = {0};
		char	buffer[4] = {0};
		ssize_t	bytes_read = 0;

		errno = 0;

		// ノンブロッキングなファイルディスクリプタからデータを読み取る
		bytes_read = read(STDIN_FILENO, buffer, sizeof(buffer));

		if (bytes_read == -1) {
			perror("read");
			if (errno == EAGAIN || errno == EWOULDBLOCK) {
				continue ;
			} else {
				exit(EXIT_FAILURE);
			}
		} else if (bytes_read > 0) {
			// データが読み取られた場合
			printf("Read %zd bytes: %s", bytes_read, buffer);
		} else {
			// データがない場合
			printf("No data available.\n");
			break ;
		}
	}
	return (0);
}
```
# 私の理解
- ノンブロッキングなファイルディスクリプタからの読み取り（read();）では、`bytes_read = read(STDIN_FILENO, buffer, sizeof(buffer));
`で処理が止まらない。
- read();の後で、エラー処理を書く必要がある。（戻り値による条件分岐が必要。）
- errnoがEAGAIN（または、EWOULDBLOCK）のときは、処理は継続。

# 参考
[The Linux Programming Interface](https://www.oreilly.com/library/view/the-linux-programming/9781593272203/)
44. 9 Nonblocking I/O (P.915 ~)
44.10 Semantics of read() and write() on Pipes and FIFOs (P.917 ~)

[TCP/IP ソケットプログラミング　C言語編](https://www.ohmsha.co.jp/book/9784274065194/)
5.3 ノンブロッキング I/O (P.82 ~)
非同期処理を含む処理順のこと(そしてたまにPromise.allのこと)

# TD;LR;
プログラムは基本的に同期的に処理を書く
非同期処理は速度的に必要な場合に検討する
そのときにPromise.allのことを思いだすといいかもしれない

# 非同期実行は常に罠
現代のJavascriptでは非同期処理が多用されます
build inな関数でもfetchとかcreateImageBitmapなどのように非同期のものもある時代です
LINEのSDKのloginもPromiseかえしますし、json取得して、そのファイルの中身を読んで画像を取得してとかの処理もある時代です
こういったときに実行順序が必要なのか(前の処理に依存するのか、後の処理に必要なのか)、不定でよいのか(他の処理に影響されないのか)を判断できてないと問題を引きおこします
処理はできるだけ同期的に書く方がよく、非同期処理は実行時間的に断然有利な場合に検討するものだとは思います(数10msでは可読性を重視してよいくらい)

# 非同期処理と同期処理、きちんと理解していますか?
JavascriptにおいてPromiseまわりを理解するのは少し難易度が高いのは理解できます。しかしこれを理解しないと「たまたま動く」コードを書くことしかできませんし、それではプログラムが書けるとは言えないでしょう
自信をもってJavascript ProgrammingするためにもPromiseやそれに付随するawait/asyncのことをしっかり理解しおいてほしいところです
今回は依存関係のあるときのコードについて簡単に書いておきます

# 例題
A, B, C, Dの処理があるとします

## A,B,C,Dがすべて同期的な処理(Promiseではない)
```javascript
const A = () => {}
const B = () => {}
const C = () => {}
const D = () => {}
const main = () => {
    A();
    B();
    C();
    D();
}
```
こういうことです

## A,B,C,Dがすべて非同期的な処理であるがA→B→C→Dの順番に処理しなけえればいけない場合
await/async使いましょう
```javascript
const A = aync() => { return a}
const B = aync(arg) => { return arg + b}
const C = aync(arg) => { return arg + c}
const D = aync(arg) => { return arg + d}
const main = aync() => {
    const resultA = await A();
    const resultB = await B(resultA);
    const resultC = await C(resultB);
    const resultD = await D(resultC);
}
```
せやな。全部awaitすればいいのだ
もしここでA()の呼びだしのawaitをはずすとBは引数にPromiseがわたされてしまう惨事を引きおこします
非同期なのでAの結果がでる前にBを実行します。つまり死にます

## A,B,C,Dが非同期処理でA,B,Cの実行順は問わないが、すべて終わったあとでDを呼ぶ.(A,B,C)→Dの場合
この例は上のように全部同期的にして実行してしまってもよいのですがPromise.allとか知ってるとだいぶオシャレになります
```javascript
const A = aync(arg) => { return arg + a}
const B = aync(arg) => { return arg + b}
const C = aync(arg) => { return arg + c}
const D = aync(a,b,c) => { return a + b + c}
const main = aync() => {
    const arg = 42;
    const pA = A(arg);
    const pB = B(arg);
    const pC = C(arg);
    Promise.all([pA, pB, pC]).then((values) => {
        D(values[0], values[1], values[2])
    }) 
}
```
loginしてる最中に画像落としたりとか画像変換したりとかのときにはPromise.allさんを思いだしてあげるとよいかもしれません

# まとめ
- 同期的か非同期的かを判断しましょう
- 実行順序が前の処理に依存するか、あとの処理が依存しているかを明確にしましょう
- できる限り同期的に記述しましょう(性能問題がない限りにおいて)
- 非同期処理を綺麗にまとめるときにPromise.allのことを思いだしてあげてください(フラグ処理とか書かないようにね)

# おまけ

実際のところわたしはJavascript好きじゃないし、理解できてないんだがな(V8のコードとか理解してないし)
初めて一ヶ月で上位0.3%になった話

![スクリーンショット 2024-01-10 11.46.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292016/99d2d7de-9e01-70e4-8fdd-a89faf14c440.png)

# Codingameにて上位0.3%になりました。
12/23~1/10の期間にて

## Codingameとは？

プログラミングコンテストが常時行われているサイト
海外の参加者がとても多い

コンテストの種類は以下の通りです。
- Bot Programing
    - 指定されるルールにて作成したBotを戦わせる
- Clash of Code
    - 一問の解答速度を競う
    - Atcoderにかなり近い(正答率 >> 速度の順に重視される)
- Optimization
    - スコアを最大化するゲーム
    - AHC(AtCoder Heuristic Contest)と同じ
- Code golf
    - 問題の解答できるコードの長さを競う

## 順位の計算

(コンテストの種類毎+期間限定コンテスト)の結果を合計して計算される

![スクリーンショット 2024-01-10 11.57.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292016/0ea2ad86-d152-9306-ae37-6845a65581f1.png)

## 期間でやった事

### 12/23~1/8
- [CODINGAME FALL CHALLENGE 2023](https://www.codingame.com/contests/finished)
- 229th / 4669

### 1/9 ~ 1/10
-  [MAD POD RACING](https://www.codingame.com/multiplayer/bot-programming/mad-pod-racing)
-  他の競技を少し

### (0.3%まで)順位を上げるための知見

- 期間限定コンテストを逃さず参加する
    - レートに使われるポイントがかなり大きく手に入る
    - 直近コンテストほど高いポイントになる
- Bot Programingもやり得
    - コンテスト個数、ポイント共に多い、高い
- Optimizationは普通
    - AHCの特訓には適している
- Clash of Codeはほどほどに
    - 問題の質が安定しない
    - 総合順位を上げる為に少しやるのがいい
- Code golf
    - 各言語毎に評価してくれる
    - くれるポイントは控えめ


## まとめ
- Codingameにて上位0.3%
- いつでもコンテストがあるのでいつでも始められる
- プログラミングができる人なら誰でも遊べるのでみんな始めよう！！！！！！
MariaDBでバイナリーログのSQLを実行（ロールフォワード）

# 環境

Windows10にインストールしたMariaDBに対する情報となります。

# やり方

コマンドプロンプトで下記。

```bat:
"C:\Program Files\MariaDB 10.5\bin\mysqlbinlog" --start-position=※開始ログポジション番号 --stop-position=※終了ログポジション番号 ※バイナリーログファイルパス | "C:\Program Files\MariaDB 10.5\bin\mysql" -h localhost -u root -p※ルートユーザーパスワード --default-character-set=utf8
```

# ログポジション番号とは

バイナリーログをtxtに変換した時、 ```# at 数字``` となっている所です。
この数字がログポジション番号となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/2d226ccd-b0b1-dbb9-648a-676c188809b8.png)

バイナリーログをtxtに変換するやり方は下記。

https://qiita.com/waokitsune/items/666c21a67285c4375ece

# ログポジション番号を指定した場合の動作例

開始ログポジション番号を **322**、終了ログポジション番号を **364**にした場合は下記。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/818eb412-e2e9-2cae-e75f-4fd579680c52.png)

# ログポジション番号は指定無しも可

下記のように ```--start-position``` と ```--stop-position``` を省略して『バイナリログファイル全体』を実行もできます。

```bat:
"C:\Program Files\MariaDB 10.5\bin\mysqlbinlog" ※バイナリーログファイルパス | "C:\Program Files\MariaDB 10.5\bin\mysql" -h localhost -u root -p※ルートユーザーパスワード --default-character-set=utf8
```

# バージョン

Microsoft Windows [Version 10.0.19045.3803]
MariaDB 10.5.4
ChatGPT語と人間語のギャップ知ってますか。

## 概要
ChatGPTを含むLLMモデルに質問するときに工夫することについてまとめてみました。
いつも何だかAI系の答えが微妙と思っていませんか。これを読めば人間語とChatGPT語のギャップです。これから扱うポイントをよく見てください。

## 質問する方法（プロンプトの設計）の一般的なヒント
- 簡単に始める
- 指示
- 特異性
- 不正確を避ける
- するかしないか？

## なぜ聞き方を工夫した方がいいのか分かる簡単な例３つを見てください。
違いがお分かりでしょうか。 ※この例は不正確を避けるにあてはまります。

### 日常でやりそうな聞き方
プロンプト:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163986/05428f93-ca64-1204-284e-3df20df96de2.png)

出力:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163986/62272b57-5e2e-0933-4183-70931bb29841.png)

⇒この質問でもだいぶいい結果は得られます。ただ「どのように分を数えるか」、「前提知識（あまり詳しくない）」について不正確になっています。

### おすすめの聞き方-1
プロンプト:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163986/0c6c59a4-f878-0590-e9a0-cef2433c15aa.png)

出力:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163986/8424afce-c1e6-328e-8a34-b919f542f4a2.png)

⇒初心者向けに業界単語（チャットボットや）や少しレベルのある単語は除いたシンプルで分かりやすくなったかと思います。

### おすすめの聞き方-2
プロンプト:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163986/05ed2ef8-b6ef-c8a0-d963-f497304594a9.png)

出力:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163986/ad8828c3-8abf-450e-55e6-64307920464a.png)

**⇒ これぞプロンプトエンジニアリングの本質**
お猿が明確な数値（レベル）ではないが、一般的に超初心者レベルを意味するので、
ちゃんと超入門で意味を説明してくれました。
~~我が子にはまずこれで説明しようと笑~~

## それぞれどういう意味
#### 簡単に始める
多くの異なるサブタスクを含む大きなタスクがある場合、タスクをよりシンプルなサブタスクに分解し、結果が改善されるにつれて徐々に構築していくことができます。こうすることで、プロンプトの設計プロセスが複雑になりすぎるのを避けられます。

#### 指示
「書く」「分類する」「要約する」「翻訳する」「並べ替える」などの動詞を使用して明確に指示しましょう。

おすすめの方法は以下でしたが、特にここまでしなくても最近の行けてるLLMモデルはよく理解するようです。出力にあまり差はなかった。

プロンプト：
>\### 指示 ###
>以下のテキストをスペイン語に翻訳してください。
>Text: "hello!"

出力：
> ¡Hola!

ただ、 「Text: "hello!"」のようにパラメターを明確に指定するのはいいと思いました。 よく使うのはテンプレートにしておくのはありだと思いました。

例えば
>\### 指示 ###
>以下のテキストをlanguage1、language2で翻訳してください。
>language1:spain
>language2:korea
>Text: "hello!"
>Text: "안녕하세요!"

#### 特異性
>モデルに実行してほしい指示やタスクについて、非常に具体的に説明してください。プロンプトが詳細で具体的であるほど、結果はよくなります。特定の出力やスタイルを望む場合には、特に重要です。より良い結果をもたらすトークンやキーワードはありません。良いフォーマットと詳細なプロンプトを用意することが重要です。実際、プロンプトに例を提供することは、特定のフォーマットで出力を得るために非常に効果的です。
とのことですが、私が使う利用範囲ではそこまで深く考えなくても良さそうだったので、飛ばしました。

#### 不正確を避ける
できるだけ「正確」という意味です。前述の「なぜ聞き方を工夫した方がいいのか分かる簡単な例３つを見てください。」で扱ったので省略します。

:::note info
**要はできるだけ正確な言語で質問しましょう。 です**
お水少し(❌) 
お水30ｍ(👌)

数文(❌)
2~3文(👌)
⇒ ここで間違っているのは人なら経験や一般常識で分かるし、もし間違ったとしても認識の修正が入ります。ChatGPT語ではとにかく正確な数値、数、フォーマットを使いましょう。
:::

#### するかしないか？
引用サイトによると以下らしいですが
>プロンプトを設計する際のもう一つの一般的なヒントは、「しないこと」を言わず、「すること」を言うことです。これにより、より具体的になり、モデルから良い回答を得るための詳細に焦点が当てられます。

::: note info
要は制限はかけるものの、焦点をやることに当てるです。
しないで (❌)
これは避けてこれをして (👌)
:::

悪い例：
個人情報を尋ねないでください。

良い例：
ユーザーの好みを尋ねることを避け、個人情報を尋ねることを避ける必要があります。

## 試して見てほしいこと ＆ まとめ

不正確を避けるを気にしながらAIに聞いてみてください。グーンと回答の質が上がるはず！

## 参考
以下サイトの「プロンプトの設計に関する一般的なヒント」というコーナーを読んで試しながら自分流で書き直したものです。
 [Prompt Engineering Guide](https://www.promptingguide.ai/jp/introduction/tips "プロンプトの設計に関する一般的なヒント")
MySQL 備忘録

## 本記事について
MySQLコマンド操作の備忘録を残します。

## 環境
```
mysql --version
mysql  Ver 8.2.0 for Win64 on x86_64 (MySQL Community Server - GPL)
```
## 各種コマンド
##### MySQLのバージョン
* MySQL接続後
`mysql --version`

* MySQL接続前
`mysql> select version();`

##### MySQLに接続する
`mysql -u root -p`

##### データベース作成
* UTF-8の文字セットを使用する場合のデータベース作成コマンド
```sql
CREATE DATABASE IF NOT EXISTS your_database_name
  CHARACTER SET utf8mb4 
  COLLATE utf8mb4_0900_ai_ci;
```
* SJIS（Shift JIS）の文字セットを使用する場合のデータベース作成コマンド
```sql
CREATE DATABASE IF NOT EXISTS your_database_name
  CHARACTER SET sjis
  COLLATE sjis_japanese_ci;
```

##### データベース選択
`use select_database_name;`

##### 現在作成中のデータベース（データベース一覧）を表示
`show databases;`

##### データベース削除
`drop database delete_database_name;`

##### テーブル作成
カラム別にCHACHARACTER SETを指定する
```sql
CREATE TABLE IF NOT EXISTS your_table_name (
    column1 VARCHAR(50) CHARACTER SET utf8,
    column2 TEXT CHARACTER SET sjis
);
```
テーブル全体に対してCHARACTER SETを指定する
```sql
CREATE TABLE IF NOT EXISTS your_table_name (
    column1 VARCHAR(50),
    column2 TEXT
) CHARACTER SET sjis;
```

##### テーブル一覧表示
`show tables;`

##### テーブル削除
`drop table delete_table_name;`

##### カラム一覧を表示
`desc your_table_name;`

## MySQL各種トピック

#### MySQLのテーブルにCSVファイルのデータを取り込む
以下の手順で実施してください。

##### [手順1] クライアント側の「--local_infile」を設定する
接続時に「--local_infile=1」を指定してログインする
`mysql -u root -p --local_infile=1`

##### [手順2] サーバー側の設定
1. MySQL側の「local_infile」の現在の設定値(デフォルト値)を確認
```sql
SELECT @@local_infile;
+----------------+
| @@local_infile |
+----------------+
|              0 |
+----------------+
1 row in set (0.00 sec)
```
2. 「local_infile=1」を設定
```sql
SET PERSIST local_infile= 1;
Query OK, 0 rows affected (0.00 sec)
```
3. 設定後の確認
```sql
SELECT @@local_infile;
+----------------+
| @@local_infile |
+----------------+
|              1 |
+----------------+
1 row in set (0.00 sec)
```

##### [手順3] インポートコマンドを実行する
MySQLでCSVファイルをテーブルにインポートするコマンド例を記載します。
オプション指定は必要であれば指定してください
```sql
LOAD DATA LOCAL INFILE 'C:/data.csv'
INTO TABLE products
CHARACTER SET sjis  -- 文字セットがShift JISの場合
FIELDS TERMINATED BY ','  -- CSVのフィールドの区切り文字がカンマの場合
ENCLOSED BY '"'  -- フィールドがダブルクォートで囲まれている場合
LINES TERMINATED BY '\r\n'  -- 改行文字がCRLFの場合
IGNORE 1 LINES;  -- ヘッダ行がある場合、1行目を無視
```


#### sql文スクリプトで実行する
##### エディタでSQLスクリプト作成(例: script.sql)
```sql
-- usersテーブルの作成
CREATE TABLE users (
    user_id INT PRIMARY KEY,
    username VARCHAR(255) NOT NULL,
    -- 他のカラムの定義
);

-- ordersテーブルの作成
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    user_id INT,
    -- 他のカラムの定義
);

-- サンプルデータの挿入
INSERT INTO users (user_id, username) VALUES (1, 'John');
INSERT INTO orders (order_id, user_id) VALUES (101, 1);
```
##### スクリプトの実行
```sql
mysql -u username -p dbname < script.sql
```

## SQL学習
* [SQL Zoo Tutorial](https://sqlzoo.net/wiki/SQL_Tutorial/ja)
    - [【SQL ZOO答え】一覧](https://note.com/shincz88/n/ndea647de70d4)
* [ByteByteGoHq](https://github.com/ByteByteGoHq/system-design-101)
* [SQL Roadmap](https://roadmap.sh/sql)


## 参考リンク
* [MySQLのテーブルにCSVファイルのデータを取り込む](https://blog.symdon.info/posts/1671937495/)
* [MySQL8でインポート・エクスポート](https://qiita.com/yes_dog/items/57c1a8c03aff8bb177de)
* [mysql実行ログをsql上で設定する](https://tech.adseed.co.jp/mysqlgenerallog)
1月19日開催！参加無料！ AIアプリケーション開発者向けの無料トレーニング

エクセルソフト株式会社とインテル株式会社は、1月19日AI PCアプリケーション開発者向けの無料トレーニングプログラムを実施します。申し込みはウェブページで登録を受付中です。
場所はインテル東京オフィス（東京都千代田区丸の内3丁目1番1号 国際ビル5階）、時間は13時30分～16時30分（13時開場）。定員は20人となります。
登録受付はこちらから。
https://www.xlsoft.com/jp/products/intel/tech/seminar/core_ultra.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/f7fb024e-3641-67df-7675-e6e2777e6796.png)

2023年12月に発表されたインテルの最新プロセッサー「Core Ultra」を搭載した AI PCの特長と、AI/ディープラーニング推論を活用したアプリケーション開発を実現するツールキット「OpenVINO」について、AI アプリケーション開発者向けに紹介します。インテルの安生健一朗（技術本部 部長）と、エクセルソフトの中村弘志さま（テクニカル・サポート・エンジニア）が講師を務めます。

是非ご応募をお待ちしています。

![03_o.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/ab38ae2c-8f21-42a2-14b9-a759bac95871.png)
Java学習 変数

# 変数の違い
プログラミング言語によって変数の扱い方は異なり、「動的型付け言語」と「静的型付け言語」の２種類がある。
今まで学習してきたRubyは「動的型付け言語」で、Javaは「静的型付け言語」。


# データ型
データ型とは、変数に格納するデータの種類のこと。
「数値としての1」と「文字としての1」はプログラムの上では異なるものとして扱われます。

Javaでは変数を定義するときに、その変数をどのデータ型として扱うのかプログラムに伝えるため、使用前に「宣言」してから使用する。

## Javaの基本データ型は以下の8種類

|データ型    |bit数　 |値                                                        |
| -------- | ----- | --------------------------------------------------------- |
|boolean   |1bit   |true あるいは false                                         |
|char      |16bit  |文字                                                       |
|byte      |8bit   |整数（扱える範囲は -128～127）                                |
|short     |16bit  |整数（扱える範囲は-32,768～32,767）                           |
|int       |32bit  |整数（扱える範囲は-2,147,483,648～2,147,483,647）             |
|long      |64bit  |整数（扱える範囲は-9223372036854775808～9223372036854775807） |
|float     |32bit  |小数（精度低）                                               |
|double    |64bit  |小数（精度高）                                               |

小さめの数値を扱うint型と、大きめの数値を扱うlong型が使用頻度が高い。

小さめの数値を扱う型と、大きめの数値を扱う型で使用するメモリに 8bt ~ 64bit と、違いがあり、扱う数値が大きくなると必要なメモリサイズも増える


# データ型の扱い方の違い
「動的型付け言語」と「静的方付け言語」の２種類の違い
## 動的型付け言語

rubyが該当する。

```ruby
a = 2
puts(a * 2)
# 4と出力される。
# 数値の4として扱われる。

a = "ruby"
puts(a * 2)
# rubyrubyと出力される。
# 文字列として扱われ、2回繰り返している。

a = "2"
puts(a * 2)
# 22と出力される。
# 文字列として扱われ、2回繰り返している。
```
上記のような違いが出るのは、どのような値が代入されたかによって、変数のデータ型が柔軟に変更され、そのデータ型に基づいて処理が行われていることを表している。

このように、「プログラムの実行時に変数のデータ型が決定される仕組み」を採用している言語が、「動的型付け言語」。

## 静的型付け言語

動的型付け言語とは異なり、変数のデータ型を最初に決定したら変更できない仕組み。
javaが該当する。

最初に「整数」として宣言した変数に、「文字列」を代入しようとするとエラーになる。

柔軟性がなく不便なようだが、あらかじめ宣言しておくことで処理が高速になったり、データ型の不整合によるエラーを実行前に検知できるなどのメリットがある。

### 変数の宣言と使い方
```
型名　変数名;
```
行末に「;（セミコロン）」をつける。
Javaでは、命令の終わりに「;（セミコロン）」が必要で、書き忘れるとエラーになる。
宣言した後の変数は、Rubyと同様に使うことができる。

```java
class Main {
  public static void main(String[] args) {
    int number;
    number = 2;
    System.out.println(number * 3);
  }
}
// int型で整数(数値)として扱うことを宣言している。
```
System.out.printlnは、（）で囲んだ中身を出力するメソッドで、Rubyのputsに相当する。

```java
class Main {
  public static void main(String[] args) {
    int number;
    number = エラーになる;
    System.out.println(number);
  }
}
// int型で整数(数値)として扱うことを宣言しているため、文字を代入するとエラーになる。
```
下記はreplitで出力されたエラー文
```
./Main.java:3: error: cannot find symbol
    var radius = エラーになる;
                 ^
  symbol:   variable エラーになる
  location: class Main
1 error
```

```java
1 class Main {
2   public static void main(String[] args) {
3     //ここに処理を記述する
4   }
5 }
```
1・2・4・5行目の記述は必ず書かなくてはいけないテンプレートのようなもの。
詳しくは別の記事。

## 型推論

```java
var 変数名 = 値
```
この記述を行うと、値の種類によってデータ型が推論され、推論されたデータ型で宣言が行われる。
```java
class Main {
  public static void main(String[] args) {
    var number = 2;
    System.out.println(number * 3);
  }
}
```
上記記述を行うと、代入する値（今回は2）からデータ型を推論してくれるため、int型であるという宣言が不要になる。
【備忘録】gulp-notifyでエラーになったのでmacにjavaを入れた


# はじめに
現在進行しているプロジェクトのタスクランナーでjavaがないとエラーになる事象が発生したので入れてみた。

# 事象
```
[12:16:44] gulp-notify: [Error running Gulp] ⚠️ Nu Html Checker (v.Nu) のエラーが出ています ⚠️
The operation couldn’t be completed. Unable to locate a Java Runtime.
Please visit http://www.java.com for information on installing Java.
```
gulp-notifyでjavaを使ってるけど、macにjavaがないので怒られた。

# javaのインストール
今回はbrewでjavaをインストールした。
```
java --version
The operation couldn’t be completed. Unable to locate a Java Runtime.
Please visit http://www.java.com for information on installing Java.
```

```
brew install java
```
インストールは完了。
バージョン確認しても、まだシンボリックをはってないのでエラーになる。
```
java --version
The operation couldn’t be completed. Unable to locate a Java Runtime.
Please visit http://www.java.com for information on installing Java.
```
シンボリックをはる。
```
sudo ln -sfn $(brew --prefix)/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk
```
```
java --version
openjdk 21.0.1 2023-10-17
OpenJDK Runtime Environment Homebrew (build 21.0.1)
OpenJDK 64-Bit Server VM Homebrew (build 21.0.1, mixed mode, sharing)
```
無事にインストール完了！
タスクランナーのエラーも消えた。
Visual StudioでUNITYの入力補完が機能せず調べた方法でも直らなかった件

直ったけど不可解だったので自信ないですが一応書いておきます

1. タスクトレイで起動しているUNITY HUBを終了する
2. UNITY EDITOREをアンインストール
3. UNITY HUBをアンインストール
4. Visual Studioをアンインストール
5. 下記のフォルダ内のUNITY、UnityHub等のUNITY関連フォルダを手動で削除(AppDataは隠しフォルダ)
 C:\Program Files
 C:\ProgramData
 C:\Users\(ユーザ名)\AppData\Local
 C:\Users\(ユーザ名)\AppData\LocalLow
 C:\Users\(ユーザ名)\AppData\Roaming
6. UNITY EDITORE VERSION 2022.3.17f1をインストール
7. Visual Studio Community2022をインストール時にVisual Studio Tools for Unityにチェックを入れてインストール
8. UnityHubから適当に新規プロジェクトを作成
9. UNITYのEdit / Preferences / External ToolsでExternal Script EditorにVS2022を設定しRegenerate project filesをクリック
10. Window / Package ManagerでVisual Studio Code EditorとVisual Studio Editorが最新になっていることを確認
11. 適当にC#スクリプトを新規作成してダブルクリックでVSエディタ起動
12. エディタ起動してしばらく待っても[MonoBehaviour]と書かれている部分の色が変わらず、入力補完は効かない
13. ソリューションエクスプローラーのAssembly-CSharpの参照内を見ると黄色の三角がついていて、確認しようと「UnityEditor」をクリックしてみたら「MonoBehaviour」の色が変わって入力補完が効くようになった

謎すぎるけど別のプロジェクトでも同様に直りました
pythonの辞書型メモ

## 元素記号と元素名（英語）

+ 原子番号順
+ 希ガスは除く
+ 原子番号53番まで

```python
elements = {
    "H": "Hydrogen",
    "Li": "Lithium",
    "Be": "Beryllium",
    "B": "Boron",
    "C": "Carbon",
    "N": "Nitrogen",
    "O": "Oxygen",
    "F": "Fluorine",
    "Na": "Sodium",
    "Mg": "Magnesium",
    "Al": "Aluminium",
    "Si": "Silicon",
    "P": "Phosphorus",
    "S": "Sulfur",
    "Cl": "Chlorine",
    "K": "Potassium",
    "Ca": "Calcium",
    "Sc": "Scandium",
    "Ti": "Titanium",
    "V": "Vanadium",
    "Cr": "Chromium",
    "Mn": "Manganese",
    "Fe": "Iron",
    "Co": "Cobalt",
    "Ni": "Nickel",
    "Cu": "Copper",
    "Zn": "Zinc",
    "Ga": "Gallium",
    "Ge": "Germanium",
    "As": "Arsenic",
    "Se": "Selenium",
    "Br": "Bromine",
    "Rb": "Rubidium",
    "Sr": "Strontium",
    "Y": "Yttrium",
    "Zr": "Zirconium",
    "Nb": "Niobium",
    "Mo": "Molybdenum",
    "Tc": "Technetium",
    "Ru": "Ruthenium",
    "Rh": "Rhodium",
    "Pd": "Palladium",
    "Ag": "Silver",
    "Cd": "Cadmium",
    "In": "Indium",
    "Sn": "Tin",
    "Sb": "Antimony",
    "Te": "Tellurium",
    "I": "Iodine",
}
```
CI/CD：「GitHub-flow」「Git-flow」による開発、本番環境へのデプロイフロー

# はじめに
Web開発やデータ基盤などAWS環境で様々なCI/CD開発を行ってきました。
本記事は、「GitHub-flow」「Git-flow」による開発、本番環境へのデプロイフロー(CI/CD)について後述しました。
環境やお作法などで、実装方法は異なってきますが、もし迷ったら本記事をご参考ください！！

:::note warn
承認機能などの細かい機能については、後述してませんのでご注意ください
:::

# GitHub-flowの概要
- featureブランチ: mainブランチから分岐。開発環境へデプロイするためのブランチ。新機能や修正に使用。
- mainブランチ: 本番環境へデプロイするためのブランチ。

# GitHub-flowのデプロイフロー
## 開発環境(featureブランチ)へのデプロイ
- **featureブランチへプッシュすると、ビルド・テストが行われ、正常であれば開発環境へ自動デプロイされる。**

## 本番環境(mainブランチ)へのデプロイ
- **featureブランチからmainブランチへプルリクエストを作成すると、自動テスト・ビルドが行われる。**
- **正常であれば本番環境へ自動デプロイされる。**

# Git-flowの概要
本3種類のブランチのみで実装可能です
- featureブランチ: developブランチから分岐。新機能の開発に使用。
- developブランチ: mainブランチから分岐。開発環境へデプロイするためのブランチ。
- mainブランチ: 本番環境へデプロイするためのブランチ。

少し難しいですが、使いこなすと作業効率が上がります
- releaseブランチ: developブランチから分岐。リリース前の最終調整やバグ修正に使用。
- hotfixブランチ: mainブランチから分岐。本番環境で発見された緊急のバグ修正に使用。

# Git-flowのデプロイフロー
## 開発環境(developブランチ)へのデプロイ

- **feature or releaseブランチからdevelopブランチへプルリクエストを作成すると、自動テスト・ビルドが行われる。**
- **feature or releaseブランチへpushすると、自動テスト・ビルドが行われる。**
- **テスト・ビルドが正常であればマージを行い、開発環境へ自動デプロイされる。**

## 本番環境(mainブランチ)へのデプロイ

- **develop or hotfixブランチからmainブランチへプルリクエストを作成すると、自動テスト・ビルドが行われる。**
- **feature or releaseブランチからdevelopブランチへマージすると、自動テスト・ビルドが行われる。**
- **テスト・ビルドが正常であればマージを行い、本番環境に自動デプロイされる。**
【登壇】Streamlitでデータカタログを作成したのでLTに初挑戦した

# 今回のお話
こんにちは！
株式会社GENDAデータエンジニアの山口です。

先日、SnowVillageというSnowflakeのコミュニティにて、
Streamlitの活用事例を発表するLT会がありました。

そこで登壇に初挑戦したので、
本日はそのレポートを投稿させていただきます。

https://techplay.jp/event/930024


# タイムスケジュール

タイムスケジュールは以下の通りでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883573/5019d8cc-9a5f-09fa-04e2-6d1d7d2632e9.png)

自分がStreamlitでアプリを作るにあたって思いつかなかったようなUIの実装方法や、
SnowflakeのNative Appのお話など、
皆様のお話聞くことができて大変勉強になりました。

# 自分のLTについて
どういったことを発表したのか、下記にて簡単にご紹介させていただきます。
ご興味を持っていただけたら、資料やGitHubで公開しているコードなどをご確認いただけますと幸いです。

## 発表内容
昨年、社内で活用できるデータカタログの作成に挑戦したので、
そのことについてお話させていただきました。

以下のURLの資料に、
データカタログの機能・実装方法・作成までの経緯 などを詳しく書いているので、
是非ご覧いただければと思います。

https://speakerdeck.com/gussan0223/streamlitwoshi-tutedetakataroguwozuo-tutemita

↓LTの様子
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883573/7d959c43-dfe1-efdf-8826-490e345a5d40.png)


## サンプルコード
GitHubにて、作成したデータカタログのサンプルコードを公開しました！
こちらも、是非ご活用いただけると嬉しいです。

https://github.com/genda-tech/sample-data-catalog

<font color="red">※ご意見やご要望などをコメントでフィードバックいただけると大変嬉しいです！<font>

# まとめ
LT初挑戦で緊張しましたが、
発表中や発表後にも皆さんから良い反応を頂けて大変嬉しかったです。

LT会を企画していただいた運営の皆様、
会場を提供いただいたDATUM STUDIO株式会社様、
LTを見てくださった皆様、
懇親会で話しかけてくださった皆様。
誠にありがとうございました:bow: 

# 採用情報

GENDAでは一緒に働く仲間を募集しています！
採用情報などは以下のURLからご確認いただけると幸いです。

https://hrmos.co/pages/genda
[備忘録] React x Firebase アプリのセットアップ手順

## React x Firebase のプロジェクトをセットアップする手順
もう何度かやってるけど、たまに手順が曖昧になってしまうので、備忘録。
今回は、新しいMacBookを買い替えたので、CLIのインストールからやらんとあかん。
最初にnode.js/npm/Gitはマシーンにインストールしておく。

### 1, Vite で React App を作る。
VS Codeからプロジェクトディレクトリを作り、下記コマンドでプロジェクトの初期化。
Viteは、create-react-app より全然高速で使いやすい。
```:Terminal
 npm create vite@latest
```

Dependencyのインストール
```:Terminal
npm install
```

### 2, Firebase CLI のインストール
```:Terminal
npm install -g firebase-tools
```
今回はパーミションエラーが出たので、Macのターミナルから
```:Mac Terminal
brew install firebase-cli
```
Firebaseにログインして、IDEからFirebaseに繋げる
```:Terminal
npx firebase login
```
### 3, Firebase Project のセットアップ
Firebasenのコンソールから、プロジェクトを制作

今回は、Authentication/Firestore/Storage を使うので、それらをコンソール上で設定
![Firebase-console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1204968/a9ef5aab-c825-aed7-d3f4-6572688950d4.png)

### 4, Firebase Projectをローカル側で制作
VS Codeに戻って、Firebaseプロジェクト を初期化
```:Terminal
firebase init
```
プロンプトに従って必要事項を入力すると、色々とFirebaseのディレクトリやファイルが生成される
![Screenshot 2024-01-10 at 1.44.43 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1204968/2797b1be-3098-6ada-bf32-c06ef9751f35.png)

### 5, Firebaseのクライアント側SDKをインストール
```:Terminal
npm install firebase
```

### 6, Git を初期化
```:Terminal
git init
git add .
git commit -m "Initial commit"
```
あとは、Githubとプロジェクトを繋いでおく
```:Terminal
git remote add origin https://github.com/your_git_page/your_repo.git
git branch -M main
git push -u origin main
```

### 7, プロジェクトをレビュー
Viteのrunスクリプトを走らせて、ブラウザで確認
```:Terminal
 npm run dev
```
![Vite-React.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1204968/df4e9305-3834-3553-35a5-02071d10121e.png)
デフォルトの初期画面が表示されたらオーケー。

というわけで、１０分ほどあれば、Reactフロント／Firebaseバックエンド　のアプリの開発をスタート出来る。
あとはコードを書いていくのみ。

### 追記1:
よく使うMUIやReact routerなどのライブラリを一気にインストール
```:Terminal
 npm install react-router-dom @mui/material @emotion/react @emotion/styled @mui/icons-material

```

### 追記2:
CSSのグローバルリセットのコード
```css:CSS
/* Global styles */
html, body, #root {
  height: 100%;
  margin: 0;
  padding: 0;
  font-family: 'Roboto', sans-serif;
  background-color: #f0f0f0;
}

* {
  box-sizing: border-box;
}

body {
  margin: 0;
  padding: 0;
  font-size: 16px;
  color: #333;
}

h1, h2, h3, h4, h5, h6 {
  margin: 0;
  padding: 0;
}

p {
  margin: 0;
  padding: 0;
}


```
index.html のheader内にRobotとそれぞれのウェイトを使えるようにリンクを埋め込み
```css:CSS
    <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;700&display=swap" />
```

## 付録
というわけで、リストをランダムに表示するだけの超シンプルなアプリをReactとFirebaseで作ってみました。
![List-Ramdomizer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1204968/54aeca0d-6eee-8819-6651-45c5e2b7b7ef.png)

[List Ramdomizer App](https://ramdom-list-app.web.app/)

最近外国人に日本語を教えるグループレッスンを始めたんだけど、１０人ほどの生徒にランダムにあてたり、適当にグループ分けしたりするのって、意外と難しくて、名前を放り込んでガラガラポンでリストを生成してくれるようなメチャシンプルなアプリがあればなあと思って作ってみましたよ。
Quest3のマイクはどこにあるのか？

## はじめに

Quest3では、マイク機能がついているのですが、一見マイクがどこにあるのかよくわかりません。それを明らかにします。

## 要するに

以下の場所に合計３つのマイクがついており、マイクアレイを形成していると考えられます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71421/4654dd56-84a5-5172-c28c-1194cceb37ac.png)

## 証拠

iFixit の分解動画から引用します。 (https://www.youtube.com/watch?v=liVll-GVF3Q)

Quest3の正面中央のマイクですが、このように裏にMEMSマイクデバイスがついています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71421/32f98796-2ec1-aa2f-c6c3-9e9bd810067c.png)


鼻のところのマイク２つですが、正面パネルを外した残りのパーツを上からみたときに、２つのMEMSマイクデバイスが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71421/28721d5d-b729-3409-eb07-a68b8c888695.png)


## マイクの特性について

このようにマイクが３つついており、マイクアレイを形成していると推測されます。
実際にアプリから音声を録音してみると、環境音はかなり拾わないように調整されていることがわかります。実質的に、口のあたりから出た音だけを拾うという印象があります。

また、鼻のところのマイクには一般的にみられるマイク用の穴が見当たりません。これがどのように音質に影響を与えるかはわかりませんが、HMD全体をカバーするようなケースをつけている場合、マイク入力を阻害する可能性がありそうです。

## Quest Proとの比較

Quest Proでは、画像のように鼻のまわりに３つのマイク穴があり、マイクアレイを形成しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71421/6ec59f45-1552-99b1-4f2a-879b69802fbc.png)

## 外部マイクの利用について

Quest3では、スタンドアロンでの利用の場合、今のところ外部マイクを利用する手段はないようです。ヘッドホン端子は音声出力の機能のみ持っているようです。
Image.onloadはやめてImage.decodeを使おうね

# TL;DR;
タイトルの通りで、古典的なImage.onloadよりImage.decode使おうね
2024年なら、という話です

# そもそもImage.onloadってなに?
```javascript
const image = new Image();
image.src = 'hoge.jpg'
image.onload = {
    //読みこまれたら実行するよ
}
// なんかしら処理
```

画像ファイルが読みこまれたらonloadイベントが呼ばれて、なんか処理をするというやつです
動的に画像をどうこうするコードでは誰もが使うやつですよね


# Image.decodeとは?
やってることは同じですがdecode()はPromiseを返します
https://developer.mozilla.org/ja/docs/Web/API/HTMLImageElement/decode
```javascript
const img = new Image();
img.src = "nebula.jpg";
img
  .decode()
  .then(() => {
    document.body.appendChild(img);
  })
  .catch((encodingError) => {
    // エラー時に何かをする。
  });
```
コードはMDNのやつのコピペな

# どうしてdecodeの方がいいの?
人間の脳にとってイベント処理は複雑すぎるからです
たとえばこちらのコードの実行順序を把握できるでしょうか?


```javascript
const image = new Image();
image.src = 'hoge.jpg'
image.onload = {
    // 2読みこまれたら実行するよ
    // こちらはあとで処理される。つまり
    console.log('画像がよみこまれたら実行されるよ')
}
// 
console.log('こちらが先に処理される')
```
読みこんだあとの処理はonloadで書かれるので、コードの実行フローが下にいってまたもどることになります
読みこんだときの処理と読みこんでない状態の処理をきちんと意識しないと不具合を起こします

ではdecodeでは?となるのですが、async/awaitつかうと話がかわります
```javascript
const loadImage = async() => {
    const img = new Image();
    img.src = "nebula.jpg";
    try {
        await img.decode()
        document.body.appendChild(img);
    }catch(encodingError){
        // エラー時に何かをする。
    }
}
loadImage()
```

loadImageのなかでは
+ ファイルを読みこむ
+ 読みこんだらなんかする
という処理が上から下にながれます。この方が読みやすいし間違いがないですね


# イベントモデル vs Promise
もともとJavascriptにはイベントモデルしかなかったわけですが、今はPromise時代に生きてるわけですので、そちらが使えるところでは使わないといけないし、理解していないと火傷しますね
(これの理解の不足で障害とかやらかしてますよね、きっと)

# まとめ
この記事は画像の動的読みこみを調べると古典であるonloadが基本的にヒットしてくるのでdecodeをつかうといいですよ、という目的のために書かれました


# おまけ
```javascript
new Promise((resolve, reject) => {
  const img = new Image();
  img.onload = () => resolve(img);
  img.onerror = (e) => reject(e);
  img.src = 'hoge.jog';
})
```
アーニャなみだでる
ステークホルダーの承認がほしい

## はじめに

僕はデザイナーではないですが、業務でアプリのデザイン検討に携わることができたので、デザインの承認を得るためにやったことのふりかえりメモを残しておきます。

**文書量は少なめです‼︎**

というのも、もっと書こう！図も作ろう！などと考えていたところ、あっという間に数日が経ち、このままでは書き終わらないと思ったからです。


あと、仕事以外の時間はほとんど子育てに割いているので、以前よりも自由に使える時間が減ったのも事実です。。。

がっつり時間取って作業するタイプだったからスタイル変えていかないとなぁ。

※弊社はアプリ開発のノウハウがなく、まだまだ手探りなのでツッコミどころが多いことをご了承ください🙏


## 概要

アプリ開発プロジェクトにて、画面デザインや機能に関する仕様検討を実施。

デザインの検討は基本的に次のステップで行われていました。

①チームメンバーでデザインを検討
②その画面で提供するサービスの運用を担当するチームにレビュー
③ステークホルダー（役員）にレビュー

②、③は、それぞれ関係者を集めて会議を開き、その場で意見や承認をもらうような形式です。


## 課題

まだ改善の余地はあるものの、今回は解決したものについて触れます。

その課題とは、③のレビューにて
**『ステークホルダーの意見一つで、現場で決めたことが覆るような仕様変更が発生しがち』**
というものです。

軽微な修正であれば問題ないですが、指摘によっては②から再レビューをする必要があるため、非常に大きな手戻りとなっていました。

また、ステークホルダーは多忙であり予定調整が困難で、修正作業が終わったとしても再レビューの開催まで時間を要するといった問題もありました。


## 課題認識の背景

なぜ上述した内容を課題と認識したかというと、当該プロジェクトではアプリのリリース日が決まっており、スケジュールが非常にタイトだったからです。

また、チームメンバーのリソースにも余裕がなく、手戻りの発生によるスケジュール遅延の可能性が大いにありました。

いわゆるバッファのような期間がほぼゼロでした。


## 解決策

ズバリ、根回しです！

①と②の間に①’（根回し）を追加しました。

①チームメンバーでデザインを検討
①’ステークホルダーへの事前ヒアリング
②その画面で提供するサービスの運用を担当するチームにレビュー
③ステークホルダー（役員）にレビュー

①’では、③に参加するステークホルダーに対し、これからレビューを開始するデザインを直接見せて事前にフィードバックをもらうようにしました。

「直接見せる」というのは、会議を開催するのではなく、
自席に座っている役員に対し、隙を見て話しかけるという意味です！


## なぜこの解決策をとったのか

その理由は、レビューを繰り返すうちにステークホルダーが何を重点的に見ているのかが分かってきたからです。

ステークホルダーは、文字やボタンの大きさのようなデザインの細かな話ではなく、会社の利益に直結する箇所を見ていると気がつきました。

例えば、次のような指摘がありました。

・この画面ではバナーを入れてほしい
・サービスのメリットが分かるようなイラストを入れてほしい

などなど。
商品やサービスへの導線を設けたいという指摘がほとんどでした。

これらを踏まえて①’では、レビュー対象全てに目を通していただくのではなく、
ステークホルダーが気にするであろう画面に絞ることで、5〜10分程度で意見をもらえるようにしていました。


## 結果

ステークホルダーに対して事前にヒアリングを行うことで、大きな手戻りの発生を防ぐことができるようになりました。

さらに、②のレビューにおいても「ステークホルダーはこう言っていた」と伝えることで、レビュー参加者だけでは判断に迷うような内容も持ち帰らずに確定させることができるようになりました。


## 注意点

サクッと気軽に確認ができる反面、注意点もあるので記載しておきます。

#### ヒアリング結果のメモを残すこと

対話で話が片付いてしまうと、安心してメモを忘れがちです。

メモをとっておかないと、どのような過程で指摘を受けたのかが分からなくなってしまいます。

チームのメンバーからも、いつの間にそんな話になったんだと思われるので、情報共有の目的もかねて必ずメモを取りましょう。


#### ヒアリング結果をステークホルダーに共有すること

話したことを忘れがちなのはステークホルダーも同様です。

時間を割いてもらったお礼とあわせて、チャットやメールにて話し合いの内容を共有しておくといいと思います。


## おわりに

ふりかえってみると、根回しというのは、仕事をする上で当たり前の手順なのかもしれません。

しかし、根回しが必須であるならば、それも含めた承認のフローを検討すべきだと思います。

当社はまだその辺りが確立していないので、今回のように「こうしたら良くなった」という経験を蓄積し、よりよい方向へ業務を改善していきたいです。
C＃でAtCoder Beginners Selection ABC085C Otoshidama

https://atcoder.jp/contests/abs/tasks/abc085_c

自分が書いたコード

```c#
using System;
using System.Linq;
 
class Program
{
    static void Main(string[] args)
    {
		int[] input = Console.ReadLine().Split(' ').Select(i => int.Parse(i)).ToArray();
		int N = input[0];
		int Y = input[1] / 1000;
		for (int i = 0; i <= N; i++)
		{
			for (int j = 0; j <= N - i; j++)
			{
				int k = N - (i + j);
				if (10 * i + 5 * j + k == Y)
				{
					Console.WriteLine($"{i} {j} {k}");
					return;
				}
			}
		}
		Console.WriteLine("-1 -1 -1");
    }
}
```

最初に提出したときは `x`, `y`がそれぞれ決まれば `z` が勝手に定まることをすっかり忘れて？しまって、なぜか3重ループを書いていました、、、

問題文的に全体を1000で割ってしまって問題なかったので1000で割った。
クラスにないプロパティを持つJSONをデシリアライズする

## 参考
この記事は、以下の動画の概要です。
詳しくは、動画をご覧ください。

https://youtu.be/YqnRliCeoaQ?si=yf9Y5OQ6jc9RF8KP

## 概要
- `JsonSeriarizer.Deserialize`メソッドを使い、JSONをデシリアライズする場合
- デフォルトでは、JSONのプロパティのうち、クラスに相当するメンバーがないものがあっても、単に無視する
- クラスに`JsonUnmappedMemberHandling`属性を付けることで、クラスに相当するメンバーがないJSONプロパティがあった場合、例外を投げるよう指定できる
メモ3

当然可以。您可以直接在测试类中使用反射来设置 `FacesContext` 的模拟实例，而无需创建一个单独的辅助类。这样做可以简化您的测试设置，尽管它仍然依赖于反射这种较为复杂的方法。以下是如何在测试类中实现这一点的示例：

```java
import javax.faces.context.FacesContext;
import java.lang.reflect.Field;
import org.junit.Before;
import org.junit.After;
import static org.mockito.Mockito.mock;

public class YourTest {

    private FacesContext originalFacesContext;

    @Before
    public void setUp() throws Exception {
        // 保存原始的 FacesContext 实例
        originalFacesContext = FacesContext.getCurrentInstance();

        // 创建模拟 FacesContext 实例
        FacesContext mockedFacesContext = mock(FacesContext.class);
        // 配置 FacesContext 的必要行为
        // ...

        // 使用反射设置 FacesContext 实例
        Field field = FacesContext.class.getDeclaredField("instance");
        field.setAccessible(true);
        field.set(null, mockedFacesContext);
    }

    @After
    public void tearDown() throws Exception {
        // 使用反射重置 FacesContext 实例
        Field field = FacesContext.class.getDeclaredField("instance");
        field.setAccessible(true);
        field.set(null, originalFacesContext);
    }

    // 测试用例...
}
```

在这个示例中，`setUp` 方法中使用反射来设置 `FacesContext` 的模拟实例，而 `tearDown` 方法则用于清理，将 `FacesContext` 重置为其原始状态。这样做可以确保每个测试之间不会相互干扰。

请注意，这种方法直接依赖于 `FacesContext` 类的内部实现，因此在不同的 JSF 实现或版本
Splunk独自のサーチ言語（SPL）を最も基本部分(search、index、sourcetype)を紹介

## SPLとは
Splunk社独自のサーチ言語。
SPL⇒Search Proccessing Languageの略。
ルールは簡単で下記２点
・コマンドの間はパイプ（｜）で繋ぐ。
・先頭から順番に処理される。

140種類以上有り。オプションコマンドもあるので、適宜使用していく。


## 最も基本的なSPL
#### ▼searchコマンド
特定のワードを含むイベントをサーチすることができる。
さらにフィールド値を条件付きでサーチも可能。

例1：search index="log_server" name="Tanaka"
例2：search index="FW_server" src_ip="192.168.10.9"
※「“”」内の文字は可変。各々が作成した時に設定した値となる。

##### ※ちなみに「search」は省略して使用可能です。
実際は大半が省略してるので、省略した方を見慣れておくと良いです。
例3：index="log_server" name="Tanaka"
例4：index="FW_server" src_ip="192.168.10.9"
※省略されているだけなので、例1＝例3、例2＝例4は同等の意味になる。

#### ▼index（インデックス）
収集したログデータを保存しているリポジトリ(保管場所)。
難しくいうと、収集した機器のログをどのインデックス値と紐づけるかを表す項目。
対象機器のindex名を指定することで、分析したい機器のログを抽出してくれる。
SQLで例えると、テーブル名みたいなもの。

例1：search index ="web_server"
例2：search index ="paloalto_ips"
例3：search index ="impreva_waf"

#### ▼sourcetype（ソースタイプ）
ログの種類を指定できる。
取り込むログがどのようなログかを定義してくれる項目。
例：アクセス成功ログ、アクセス失敗ログ

例1：search index ="paloalto_ips" sourcetype="secure"
例2：search index ="web_server" sourcetype="message"

サーチ文に取り入れることで、ログ絞り込みが効率よくできる。

## さいごに
簡単に言うと、
・「search」は大半が省略して使用。コマンド入れなきゃ自動的に「search」扱いになってると認識しておく。
・「index」でログを検索したいデータを指定。
・「sourcetype」は更に絞り込むためにログの種類で絞り込めます。
崖に落ちるか判定

https://paiza.jp/works/mondai/conditions_branch/conditions_branch__complex_step7

小数点があるということで、int型でなくてfloat型にしてみました。
でも解答だと普通にintでもよかったみたいです。
まあ、仕様を見ると、小数点のある数字を混ぜたときにfloat型になってしまうようなので
問題ないのかな。

```py
N,K,T = map(float,input().split())
X = T + 0.1

if N * K < X:
    print('YES')
else:
    print('NO')

```

PHPだとこうですね。
さらに変数を使わないようにしました
行数が減りました

```php
<?php
    list($N,$K,$T) = explode(" ",fgets(STDIN));
    if ($N * $K < $T + 0.1){
        print('YES');
    } else {
        print('NO');
    }
?>

```
Fargate上のGitLab起点でGitOpsを実現するパターンのまとめ

# はじめに
この記事はDevOps on AWS大全 実践編の一部です。
DevOps on AWS大全 実践編の一覧は[こちら](https://qiita.com/tech4anyone/items/c27e74f9ae569ced259f)。

この記事ではFargate上のGitLab起点で起動するCICDパイプラインのアーキテクチャのまとめを解説しています。

具体的には以下流れで説明します。

- 解決した課題の整理
- アーキテクチャの策定
- 策定したアーキテクチャで達成できたこと

AWSの区分でいう「Level 400 : 複数のサービス、アーキテクチャによる実装でテクノロジーがどのように機能するかを解説するレベル」の内容です。

# この記事を読んでほしい人
- DevOpsエンジニアがアーキテクチャを決めるときにどのような思考フローを踏んでいるか知りたい人
- Fargate上のGitLab起点で起動するCICDパイプラインのアーキテクチャを知りたい人
- AWS Certified DevOps Engineer Professionalを目指している人

# 前回までの流れ
[こちら](https://qiita.com/tech4anyone/items/9057e188a1c43e609bd3)の記事で以下のアーキテクチャを策定しました。
![](https://storage.googleapis.com/zenn-user-upload/d63f097ef605-20240106.png)

# 解決した課題の整理
現在、解決した課題は以下になります。
- GitLabにコミットしたCloudFormationテンプレートを使ってGitOpsを実現したい
- GitLabにコミットしたECSの定義を使ってGitOpsを実現したい
- GitLabにコミットしたLambdaの定義を使ってGitOpsを実現したい
- GitLabにコミットしたEC2 ImageBuilderの定義を使ってGitOpsを実現したい
- 管理用アカウントにあるCodeCommitを起点にして、開発用アカウントのGitOpsを実現したい
- CICDパイプラインを実行した後、実行完了までの間はマネジメントコンソールを見たくない

ということで、これをどうやって解決したか考えていきましょう。


# アーキテクチャの策定
ここからはこれまで策定してきたアーキテクチャを整理していきます。
## Fargate上のGitLab起点でCloudFormationを更新するGitOps
以下のようなアーキテクチャを作成しました。
![](https://storage.googleapis.com/zenn-user-upload/c3e67a1960b8-20240110.png)

## Fargate上のGitLab起点でECSを更新するGitOps
以下のようなアーキテクチャを作成しました。
![](https://storage.googleapis.com/zenn-user-upload/f2dd88996160-20240110.png)

## Fargate上のGitLab起点でLambdaを更新するGitOps
以下のようなアーキテクチャを作成しました。
![](https://storage.googleapis.com/zenn-user-upload/f866c79b2822-20240110.png)

## Fargate上のGitLab起点でEC2を更新するGitOps
以下のようなアーキテクチャを作成しました。
![](https://storage.googleapis.com/zenn-user-upload/b9a70219e78b-20240110.png)

# まとめ
本記事ではFargate上のGitLab起点でGitOpsを実現するパターンをまとめました。

これらのパイプラインを1つの図にまとめるとわかりにくいので分けて書きましたが、本来は1つのCodeCommitに対してこれらのような複数のパターンのパイプラインが刺さっているアーキテクチャになります。

また、連携先のチャットも当然ですが1つです。

今回策定したアーキテクチャで実現できたのは以下の項目です。
- Fargate上のGitLabを起点にCloudFormation、ECS、Lambda、EC2を更新するGitOps
- 1つのGitLabを起点としてマルチアカウントのCodePipelineを動作させるCICDパイプライン
- マネジメントコンソールを確認する必要があるタイミングでチャットに通知を飛ばすChatOps

次回はロギングを考えてみたいと思います。
C＃でAtCoder Beginners Selection ABC085B Kagami Mochi

https://atcoder.jp/contests/abs/tasks/abc085_c

自分が書いたコード

```c#

using System;
 
class Program
{
    static void Main(string[] args)
    {
		int N = int.Parse(Console.ReadLine());
		int[] d = new int[N];
		for (int i = 0; i < N; i++)
		{
			d[i] = int.Parse(Console.ReadLine());
		}
		Array.Sort(d);
		int count = 1;
		if (N == 1) {
			Console.WriteLine(count);
			return;
		}
		int tmp = d[0];
		foreach (int d_ in d)
		{	
			if (tmp < d_)
			{
				count++;
			}
			tmp = d_;
		}
		Console.WriteLine(count);
    }
}
```

餅が1枚のときがよくわからなくてこういうコードになってしまった。
メモ2

遇到 `FacesContextFileNotFoundException` 错误通常表明测试过程中尝试了对 `FacesContext` 的操作，但此时 `FacesContext` 并未正确初始化或不存在。在您的测试用例中，如果 `processViewExpiredException` 方法中的逻辑依赖于 `FacesContext`（例如，进行页面重定向或访问某些视图资源），则需要在测试中适当设置和模拟 `FacesContext`。

以下是处理这个问题的步骤：

### 1. 模拟 `FacesContext`
由于 `FacesContext` 是 JSF 应用的核心，您需要在测试中模拟它。您可以使用 Mockito 来创建 `FacesContext` 的模拟实例，并根据需要模拟它的行为。例如：

```java
import javax.faces.context.FacesContext;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

// ...

@Before
public void setUp() throws Exception {
    mockedWrapped = mock(ExceptionHandler.class);
    exceptionHandlerWrapper = new ExceptionHandlerWrapper(mockedWrapped);

    // 创建模拟 FacesContext 实例
    FacesContext mockedFacesContext = mock(FacesContext.class);

    // 配置 FacesContext 的必要行为
    when(mockedFacesContext.getApplication()).thenReturn(您的模拟 Application 实例);
    // 其他需要的模拟操作...

    // 设置 FacesContext 的静态实例
    FacesContextUtil.setFacesContext(mockedFacesContext);
}
```

### 2. 清理 `FacesContext`
在测试完成后，您应该清理掉设置的 `FacesContext` 实例，以避免对后续测试造成影响：

```java
@After
public void tearDown() {
    // 清理 FacesContext
    FacesContextUtil.setFacesContext(null);
}
```

### 3. 考虑 `FacesContext` 的依赖
根据 `processViewExpiredException` 方法的具体实现，您可能需要模拟 `FacesContext` 的其他方法和属性。例如，如果该方法中使用了 `FacesContext` 来获取特定的视图参数或进行页面跳转，您需要确保相关的方法也被适当地模拟。

### 4. 使用反射
继续使用反射来调用私有方法，但这次在一个已经设置了 `FacesContext` 的环境中进行。

这些步骤应该能够帮助您解决在测试中遇到的 `FacesContextFileNotFoundException` 问题。如果 `processViewExpiredException` 方法的实现依赖于 `FacesContext` 的具体状态或行为，确保您的模拟实例反映了这些依赖。
終了判定 2 Python3編

https://paiza.jp/works/mondai/conditions_branch/conditions_branch__complex_step5

さて久しぶりにPythonから。
ここでwhileを使いました。たぶんpythonでPaizaやり始めてから初めてじゃないかな。

```py
N,K = map(int,input().split())
cnt = 0
while N < K:
    cnt += 1
    N = N * 2
    
print(cnt)
```

ところでなんで、＋＝は知ってるのに、＊＝はなぜしなかったの？と自分で自分を突っ込んでしまった。いやおっしゃるとおり。
こうですね。

```py
N,K = map(int,input().split())
cnt = 0
while N < K:
    cnt += 1
    N *= 2
    
print(cnt)
```

とりあえずphpでもやっておきます。

```php5
<?php
    $A = explode(" ",fgets(STDIN));
    $N = $A[0];
    $K = $A[1];
    $cnt = 0;
    while($N<$K){
        $N *= 2;
        $cnt += 1;
    }
    print($cnt);
?>
```
解答はないので、自分でコードを評価してみます。
pythonみたいに、複数の変数に入れられないのかなと思ってたら、
`list()`でできるようです。
さらに配列＄Aにいれないまま直接リストにつっこんでもよさそうです。
やってみましょう。

```php5
<?php
    list($N,$K) = explode(" ",fgets(STDIN));
    $cnt = 0;
    while($N<$K){
        $N *= 2;
        $cnt += 1;
    }
    print($cnt);
?>
```
こうですね。
２行減りました。
思った通りうまくいったようです。
【2024年01月版】mkdir したあと cd で入る方法【中年エンジニアのためのLinuxメモ】

# はじめに

`mkdir` したあと `cd` で入る方法ってどうだったっけ？　のメモ

スクリプトで `mkcd` とかを作る、シェル関数を作るとかの方法もあるけど、
環境をいじれない、常にデフォルトで作業している漢のための方法

# 環境

bash

# やりかた

## いつも通りの方法

```
$ mkdir 20240110
$ cd 20240110
```

## `cd` 時にディレクトリ名を省略する方法

```
$ mkdir 20240110
$ cd $_
```

## スペースを含むディレクトリ名の場合

```
$ mkdir "2024 0110"
$ cd "$_"
```

## ワンライナー

```
$ mkdir 20240110;cd $_
```

```
$ mkdir 20240110 && cd $_
```

## シェル関数を作る方法

`.bashrc` に以下を追記する

```
mkcd () {
  mkdir -p "$1" && cd "$1"
}
```

# さいごに

かんたんでしたね
C＃でAtCoder Beginners Selection ABC088B Card Game for Two (2)

https://qiita.com/kosuke-naito/items/fc3bda595558d879d557

上記記事？で書いたコードがとても冗長だったので、再投稿。

改善観点は以下。

- リストから要素をポップして取り出す必要はない
- 交互だからループカウンタの偶奇でどちらの操作がわかる
- 行動を最適化しているため常に `Alice >= Bob` が成り立つ

書き直すと、
```c#
using System;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
		int N = int.Parse(Console.ReadLine());
		int[] A = Console.ReadLine().Split(' ').Select(a => int.Parse(a)).ToArray();
		Array.Sort(A);
		Array.Reverse(A);

		int diff = 0;
		for (int i = 0; i < N; i++)
		{
			if (i % 2 == 0)
			{
				diff += A[i];
			} else
			{
				diff -= A[i];
			}
		}
		Console.WriteLine(diff);
    }
}
```

常に `Alice >= Bob` が成り立つため、両者の差分を `diff` とすれば、偶数回目のループ(Aliceによる操作)では足し算して、奇数回目のループ(Bobの操作)では引き算をしてやればよい。

最初に問題を見たときは、配列ではなくてリストにして、先頭か末尾の要素を取り出して削除していくことがいい感じがする気がしたけど、全くそんなことはなかった。
Apex REST API のまとめ

[APIのまとめに戻る](https://qiita.com/Keiji_otsubo/items/f44e752b618c8524885b)

# エラー

+ [Apex REST でのエラー(入力に使うJsonの設定とクラスの定義)](https://qiita.com/Keiji_otsubo/items/2b2530431961669cf259)


# Apex REST API の機能強化: RFC 7230 検証の強制

https://www.salesforceben.com/salesforce-spring-24-features-top-10-developer-updates-you-need-to-know/

https://help.salesforce.com/s/articleView?id=release-notes.rn_apex_enforce_RFC_header_validation.htm&release=248&type=5

Spring '24 リリースでは、Apex REST API 応答の動作を改善するための新たな改善が行われました。「RFC 7230」と呼ばれる一連のルールに従って、API 応答の名前と構造が正しく設定されていることを確認します。

次のように考えてください。Salesforce データ用の Apex REST API を構築するとき、それが他のアプリケーションとうまく連携できるようにしたいですよね。API 応答の RFC 7230 ヘッダー チェックを有効にすることは、すべてがルールに従っていることを確認する交通警官のようなものです。

これにより、応答に一貫性があり、理解しやすくなり、他の RESTful アプリとシームレスに連携できるようになるなど、多くの利点がもたらされます。これは、API に通信のためのスムーズな高速道路を提供し、エラーを減らし、アプリと他のアプリの間ですべてがスムーズに流れるようにするようなものです。

以下は、この新しい改善点を示す例です。

```Java
@RestResource(urlMapping='/exampleEndpoint/*')
global with sharing class ExampleRestController {

    @HttpGet
    global static String doGet() {
        // Assume you're retrieving some Salesforce data
        String responseData = '{"accountId": "001XXXXXXXXXXXXXXX", "name": "Sample Account"}';

        // Set the RFC 7230 header to enable the check for structured and named responses
        RestContext.response.addHeader('RFC-7230-Check', 'enabled');

        return responseData;
    }
}
```

この例では、アノテーションを使用して Apex REST エンドポイントが作成されます ( /exampleEndpoint/) @RestResource。doGet メソッドは HTTP GET リクエストを処理します。応答データは、サンプル Salesforce アカウントの JSON 表現です。

重要な追加機能は、 の使用ですRestContext.response.addHeader('RFC-7230-Check', 'enabled');。この行は、API 応答に RFC 7230 ヘッダーを追加し、応答が指定された名前付けと構造化の規則に従っていることを示します。

このヘッダーを組み込むことにより、Apex REST API 応答は RFC 7230 に準拠し、一貫性、明確性、および他の RESTful アプリケーションとのシームレスな統合が保証されます。これは、Salesforce アプリケーションと他のアプリケーションの間で API 通信がスムーズかつエラーなく行われるようにする交通警察のようなものです。


# 解答例

+ [Apex REST API の機能強化: RFC 7230 検証の強制](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007WdKow)
+ [Enforce RFC 7230 Validation for Apex RestResponse Headers](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007UvhBj)
+ [Enforce RFC 7230 Validation for Apex RestResponse Headers - Need to understand](https://salesforce.stackexchange.com/questions/415451/enforce-rfc-7230-validation-for-apex-restresponse-headers-need-to-understand)


# エラーの回避

+ ["\" Coming in the REST API response of Custom Salesforce API](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007X82xx)

:::note
I found out the solution this way how i solved the issue 

```
res.responseBody = Blob.valueOf(JSON.serialize(responseList));
```

Instead of returning the serialised JSON as a string, it's now converted to a Blob using Blob.valueOf. This helps in ensuring that the response is treated as binary data, and it avoids the automatic addition of backslashes.
:::

# 大量の修正をどうするか？

+ [Please suggest me some steps to complete.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007XIaCS)
IBM i 実行管理：実行管理のレベルと主な関連システムオブジェクト・定義2

※昨日の [記事#1](https://qiita.com/gomAnomalocaris/items/00cdd9db0864900dca91) の続きです。

## ジョブ単位の制御

ジョブ処理要件を設定した **ジョブ記述*JOBD** と**クラス*CLS** によって制御します。

### ジョブ記述 *JOBD での主な設定項目

(1)ジョブ待ち行列 *JOBQ／出力待ち行列 *OUTQ での優先順位
(2)ライブラリーリスト *LIBL でのプログラム実行時のオブジェクト探索順序

WRKJOBD QGPL/QDFTJOBD コマンドを実行　OPT.2 or 5を実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/3ea2a127-4583-03c1-5b01-85454b23bd70.png)

ジョブ記述 *JOBD の設定が表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/b77c3642-9e9f-3b99-6cbc-b820e1ddbfe7.png)

※ **ジョブ日付** ：OSの日付と別にこのジョブ専用で使用（指定）したい日付を設定することが出来ます。バッチ処理などで日付をまたいでしまう場合など、実際のデータ発生日と処理日がずれる場合に指定する、などが代表例でしょうか？
※ **ジョブ優先順位**と**ジョブ待ち行列** ジョブ待ち行列名と優先順位を指定
※ **出力優先順位**と**出力待ち行列** 出力待ち行列名と優先順位を指定。この例では *USRPRF が指定されているのでジョブを実行するユーザーIDに指定されている*OUTQ名が使用されます。

ジョブ記述 *JOBD の設定（2ページ目）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/048b2f8c-086e-51d2-f6e9-3b7f299f462f.png)

※ **会計コード** アカウンティングに使用される会計コードを設定することもできます。
※ **経路指定データ** をサブシステム記述 *SBSD の経路指定項目の設定値と比較することでこのジョブが使用するクラス *CLS （ほか）が決定されます。

ジョブ記述 *JOBD の設定（3ページ目）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/2b228bfd-5539-4388-916a-f1185ef77724.png)

※ **初期ライブラリーリスト** このジョブ記述で使用される（ユーザーの）初期ライブラリーリストを指定。画像では ＊SYSVAL となっていますので、システム値 QUSRLIBL の設定が参照されます。
**ライブラリー（ライブラリーリスト）を変えたいユーザーID毎に専用の*JOBDを作成し、それぞれのユーザーIDが必要とするライブラリーリストをここに設定する、といった方法はよく実施されていると思います。**

DSPSYSVAL QUSRLIBLコマンドで確認すると、デフォルトは下記のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/2df7dcde-b411-597f-9708-e0eca5bdb6fd.png)

### システム提供のジョブ記述 *JOBD
|ジョブ記述  |説明 |コメント|
|---|---|---|
|QGPL/QDFTJOBD|ユーザージョブが使用するデフォルトのジョブ記述|ユーザーが実行するジョブでデフォルトで使用されるジョブ記述|

### ジョブ記述 *JOBD での指定値の一時的な変更

**プログラム、ジョブの開始前に CHGJOBコマンドを実行すると、ジョブ記述*JOBD で指定した上記（ほか）の指定値を一時的に変更することが出来ます。
これまで説明した実行管理関連の設定値以外にも、文字コードCCSIDの変更なども（CCSID 5026/5035が混在するシステムなどで）よく見かける気がします。

### クラス *CLS での設定項目

(1)プログラム実行時の実行優先順位
(2)CPUのタイムスライス（ms)
(3)PURGE *YES/*NO の指定（対話型かバッチ型かの指定）

※ジョブがどのクラス *CLS を使用するかはサブシステム記述 *SBSDの経路指定項目(DSPSBSDコマンドのOPT.7やCHGRTGEコマンド等で確認操作）の指定に従って決定されます。 階層（関連）が深く少しわかりにくいですがきちんと覚えておきたいポイントです。

DSPSBSDコマンド OPT.7 を実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/1de6c319-3bba-4218-3ba5-a1b98c0dc83e.png)

経路指定項目の表示　から OPT.5 詳細の表示 を実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/8c9260c9-47f0-0eab-568c-f9d8d523e6e5.png)

経路指定項目の明細表示 画面に使用されるクラス *CLS が指定されています。
下図では クラス *CLS QSYS/QBATCH が指定されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/862b90d1-0338-a1a8-c1c2-3425763c67a8.png)

クラス *CLS QSYS/QBATCH の設定 DSPCLSコマンド
下図では(CPU処理待ち時の)実行優先順位 50 （対話型の場合だとデフォルトは20か30）、CPUタイムスライスが5,000ミリ秒であることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/604c4e87-2253-38b8-a1b0-d95e9e6199d6.png)

### システム提供のクラス *CLS
|クラス  |説明 |コメント|
|---|---|---|
|QINTER|対話型ジョブ用のクラス||
|QBATCH|バッチ型ジョブ用のクラス||
プログラミング学習 つまづき原因 まとめ

## プログラミング学習でつまづいてきた原因まとめ

ざっと箇条書きにすると以下（思いつき次第更新予定）

1. 用語の意味うろ覚え
1. タイプミス（一文字違い）
1. タイプミス（""と''）
1. 開発サーバーの再起動

### 1. 用語の意味うろ覚え

「モジュール」とか、なんとなくの意味でおぼえてて、その後の解説で、「モジュール」という言葉が用いられる度に、モジュールってなんだっけ？あれこの文章何言ってるんだってなってくる...あれ。

対策として、おすすめなのは、その都度「ChatGPT」にわからない用語の意味を聞くことと。

ChatGPTに「Pythonを学習していてモジュールという言葉が出てきたんだけど、どういう意味？」って聞くのがおすすめ。

最後にはきちんと覚えましょう。Ankiとか使うと再度覚えてるか確認できて良いと思います。
そのさいできれば、「その用語がどの文脈で出てきたかとのセットで意味を覚える」と思います。

「オブジェクト」とか、「コレクション」という単語は、シチュエーションごとにイメージするものが違ったりします。
なので「Pythonのオブジェクトは〜〜」、「JavaScriptを勉強している時に出てきたオブジェクトは〜〜」「mongodbで出てくるコレクションは〜〜」「イテラブルと同じ意味のコレクションは〜〜」のように。どの文脈で出てきたかをセットで覚えると良いかと。

### 2. タイプミス（一文字違い）

本の写経をしてたり、何かの解説を見ながら、それ通りにコードを書いたのに、自分だけエラーになる。
バージョンが違うのか？でもそんな難しいことわからんし。プログラミング難しすぎだよ。。。
と思ってたらcollection を　collections と小文字のs一文字足りなかっただけとか。
（自分は結構この単数系か複数形かのsつけ忘れやりがち。）

この手のミスで動かなくなる、エラーになることが結構あるって学んでからは、「エラー？とりあえず打ち間違えしてないか？あ、あったあった。」が増えてつまづきを回避することができたりしてます。

### 3. タイプミス（""と''）

これは個人的によくエラーになる原因なんですが、""と''に関するもの。
Pythonの「f文字列」（f"{n}個です"みたいな記述）を書く際。
```
print(f"{dict["あいさつ"]}")
```
のように、f""の中に""を使ってしまって、エラーが出るやつです。
正しくは
```
print(f"{dict['あいさつ']}")
```
文字列を書くときにいつも””を使っているので、やってしまいがちなのですが、この手のミスをする。という自覚を持っていると、エラーが起きた時に良いです。

### 4. 開発サーバーの再起動
コードを修正して、保存したのに、その変更がブラウザに反映されない。自分のPCのターミナルでサーバーを起動させ、チュートリアル見ながらアプリ作る勉強してる際におきるつまづきです。
まずはデバックモードをオンにできれば（していれば）、VSCodeなどで上書き保存するとブラウザに変更が反映されるので、デバックモードをオンにできそうならオンにしてみましょう。
デバックモードをオンにするやり方がわからない。そんな時は、一度ターミナルで「windowsなら」ctrl + c、「Macなら」command + c でサーバーを一度閉じてからまた繋げる。そうするとブラウザに反映されます。
設定とか読み込みとかが変わるらしいので上のどちらかは行いましょう。
これ知らないと、頑張ったのに（そして間違いがなくても）画面に反映されず、挫折しそうになるので、注意です。