OmniAICreator/Qiita-1.07M huggingface dataset:
Jetpack Compose、Modifier.shadowの罠

ある日、ほぼほぼ三角形の形状をしたdrawableに影をつけたくなりました。[^fact]
そういうときは`Modifier.shadow`を使えばいいですね。
[^fact]: デザイナーからの指定

例えばこんな風に。

```kotlin:composable.kt
modifier = Modifier
    .shadow(
        elevation = 2.dp,
        shape = GenericShape { size, _ ->
            moveTo(x = 0f, y = 0f)
            lineTo(size.width, 0f)
            lineTo(size.width / 2f, size.height)
        },
        spotColor = Color(0xFF000000),
        ambientColor = Color(0xFF000000)
    )
```

ところがどっこい、影はつくけどdrawableの外側がやたらギザつきました。
はてさてどうして？？？

と思い調べてみたら、どうやら`Modifier.shadow`にはデフォルトで`clip: Boolean = elevation > 0.dp`を取るようになっているようです。

```kotlin:Shadow.kt
@Stable
fun Modifier.shadow(
    elevation: Dp,
    shape: Shape = RectangleShape,
    clip: Boolean = elevation > 0.dp,
    ambientColor: Color = DefaultShadowColor,
    spotColor: Color = DefaultShadowColor,
) = if (elevation > 0.dp || clip) {
    inspectable(
        inspectorInfo = debugInspectorInfo {
            name = "shadow"
            properties["elevation"] = elevation
            properties["shape"] = shape
            properties["clip"] = clip
            properties["ambientColor"] = ambientColor
            properties["spotColor"] = spotColor
        }
    ) {
        graphicsLayer {
            this.shadowElevation = elevation.toPx()
            this.shape = shape
            this.clip = clip
            this.ambientShadowColor = ambientColor
            this.spotShadowColor = spotColor
        }
    }
} else {
    this
}

```

つまり、`elevation = 2.dp`と指定している時点で`clip = true`になり、指定したshapeの形状に切り抜かれてしまうわけですね。

drawableの形状より指定したshapeの頂角の方が微妙に角度が浅かったために、drawableの輪郭が若干削られてギザギザになっていたみたいです。

`clip = false`を指定した上で、shapeを若干調整したらいい感じになりました。
良い勉強になりました。
10月開催のカンファレンス７選

## Japan IT Week【秋】
開催日時：2023/10/25～2023/10/27
開催場所：[幕張メッセ](https://www.m-messe.co.jp/access/)

11の専門展から構成されている下半期最大のIT展示会です。

幅広くIT分野を網羅して開催することで、ビジネス拡大を求める出展社、来場者にとって欠かせない展示会となっています。
出展ブースでは製品・サービスの販売・受注、課題についての相談、見積り・導入時期の打合せなどが行われ、“実質的な商談の場”として活用いただいています。

https://www.japan-it.jp/autumn/ja-jp.html

---
## PyCon APAC 2023
開催日時：2023/10/27～2023/10/29 14:00～18:00
開催場所：[TOC有明コンベンションホール](https://www.toc.co.jp/saiji/ariake/access/)

PyCon JP は日本で開催される、プログラミング言語 Python に関する国際カンファレンスです。 Python はオープンソースで開発されているプログラミング言語で、世界中で利用されています。

PyCon(Python Conference)は世界中で開催されており、2012年は2,000名以上が参加する PyCon US をはじめ、世界30箇所以上で開催されています。 PyCon JP は2011年から毎年開催しており、PyCon JP 2018では約1000名の参加者を集めアメリカ、ヨーロッパに次ぐ世界最大規模のカンファレンスとなっています。

https://2023.pycon.jp/

---
## Vue Fes Japan 2023
開催日時：2023/10/28
開催場所：[中野セントラルパーク カンファレンス](https://www.nakano-centralpark.jp/conference/)

Vue Fes Japan は 2018 年に誕生した日本最大級の Vue.js カンファレンスです。
文字通り Fes = お祭りのように Vue.js を共に盛り上げ、共に学び、そしてなによりも共に楽しむために誕生しました。

Vue.js とエコシステムがさらに発展しつつある中、この度 2023 年はオフラインカンファレンスとしての Vue Fes Japan をリブートすることを決意しました。
ぜひ、一緒にカンファレンスに参加し、リアルでしか味わえない体験を楽しみましょう！


https://vuefes.jp/2023/

---
## Open Source Conference 2023 Tokyo/Fall
開催日時：2023/10/21 10:00～16:00
開催場所：[大田区産業プラザPiO 大展示ホール](https://www.pio-ota.net/access/)

オープンソースカンファレンス2023 Tokyo/Fallは、リアルイベントでブース展示のみの開催です。  
※最後にライトニングトークがあります！  
今回の会場は、久しぶりに蒲田のPiO内で大展示ホールでの開催です。  
これから出展希望者は公式サイトのお問い合わせより、ご連絡ください。

https://event.ospn.jp/osc2023-fall/

https://ospn.connpass.com/event/295184/

---
## プロジェクトマネジメントDAY 2023
開催日時：2023/10/24
開催場所：オンライン

今年のテーマは「AIとの共存、変革の時代を生き抜くPMとは？」です。  
「生成AI」への注目が急速に高まっています。  
アイデア出しや業務効率化など、仕事への活用も急速に進んでいます。  
生成AIの爆発的な普及は、働く環境の激変をいや応なく意識させ始めています。  
一方、新型コロナ禍で国内の出生率低下は加速し、人手不足は決定的です。  
Z世代は、共感できる会社に入りたい、選ばれるのは、企業側です。  
プロジェクトマネジャーには、不確実性と複雑さにより様々なタイプのプロジェクトを選択し、  
人を最大限活かし切るスキルが求められます。  
この変革時代に、プロジェクトの目標を達成するために必要な考え方・フレームワーク・テクニックなど、  
各分野の有識者が解説していきます。

https://products.sint.co.jp/obpm/pmday2023

---

## IBM TechXchange Conference Japan
開催日時：2023/10/31～11/01
開催場所：[ベルサール東京日本橋](https://office-b.sumitomo-rd.co.jp/nihombashi/access.html)


日本IBM史上初となる技術者/開発者向け**「IBM TechXchange Conference Japan」**を開催します。本イベントでは、IBM製品とテクノロジーに関する最新情報をお届けし、体感いただけます。最新技術のセッション、デモ、ハンズオンの場を提供します。また、コミュニティーイベント、技術者の皆様との交流の場を通じて、技術者同士が学び、つながるネットワーキングの機会もありますので、すでにIBMの技術にお馴染みの方も、初めての方も充実した2日間をお過ごしいただけます。

https://ibm-developer.connpass.com/event/292633/

https://www.ibm.com/jp-ja/events/techxchange

---
## Qiita Conference 2023 Autumn
開催日時：2023/10/25～27　17:00～21:00
開催場所：オンライン

Qiita Conferenceは、日本最大級*のエンジニアコミュニティ「Qiita」が開催するオンライン技術カンファレンスです。  
ゲストスピーカーによる基調講演、参加各社のスポンサーセッションで技術的な挑戦や積み重ねてきた知見を共有します。  
ソフトウェア開発者が集まり、最新の技術や最先端の挑戦、ソフトウェアの未来についての考えや知見を共有し、つながる場を創出します。

※注釈：「最大級」は、エンジニアが集うオンラインコミュニティを市場として、IT人材白書（2020年版）と当社登録会員数・UU数の比較をもとに表現しています。

https://increments.connpass.com/event/294310/

---
Xcode 15 failed with Command CodeSign failed with a nonzero exit code

## CodeSign 系エラー

Xcode 15 で新しくつくったプロジェクトがシミュレータを対象としたビルドにも関わらず。code sign系のビルドエラーをおこした。メッセージは以下の通り。

```log
Command CodeSign failed with a nonzero exit code
```

同様なエラーで困った人が検索して辿り着けるように記録しておきます。

## 原因

プロジェクトにFolder Reference で `Contents` という名前でフォルダを追加していた為。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65634/a657937f-59e3-8a67-d663-709ebc378418.png"/>

Xcodeでみると青いフォルダ。

<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65634/4ab64114-52c4-6202-9f3e-f5d17c3867c9.png"/>

これを別の名前にするとこのビルドエラーはなくなりました。

## ほかにもダメな名前も

| Folder Name | 可否 |
| ----------- | ----------- |
| Contents | NG |
| Resources | NG |
| Content | OK |
| Resource | OK |



## 未調査

このビルドエラーがXcode14以前にもあったか、他にもNGな名前があるのか？など未調査。

## 環境

```
macOS: 13.5.2 (22G91)
Xcode: Version 15.0 (15A240d)
```
自作PCのマザーボードのType-C端子からRaspberry Piを動作させたレポ

・この記事の新規性
X570 taichiのType-C端子から5V/3A給電ができるということはネット上に情報があるが、
そこで実際にRaspberryPiを動作させたという報告はなかった。
よって、試してみた。
※そもそもType-C端子はPCに一つか二つしかない上に使用頻度も高いため、デスクトップPCのType-C端子でRaspberry Piを動かしてみようという人が少ないのだと思う。私はスペースの関係とたまたまType-C端子を使う機器をPC周りで使用していないため、空いている端子で給電してみようと思った。

・普通に動作している時
vcgencmd get_Throttled
→0x0(正常）
vcgencmd measure_volts
→volt = 0.9369V
![電圧.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565403/8cbc02c8-c0bc-0e53-b622-3b45016211fc.png)

・負荷をかけてみた
https://japan.zdnet.com/article/35201090/3/　
の手順に従いStressberryをインストールし、実行した。
→完走した。
ログを見たら600秒ぐらいかかっているので、つまり10分程度のストレステストには耐えたことになる。

・なぜこんな実験をしたのか
友人に「ラズパイをPCのマザボから給電したら電圧不安定になるんじゃない？」と指摘されたため。
友人には感謝している（指摘がなければ、電圧が不安定になることで動作が不安定になるという認識自体がなかった）

・結論
たぶん5V/3A給電できるType-Cの給電能力はラズパイでストレステスト完走できるぐらいには安定している。

・最後に
この記事はもちろん、全てのPCのType-C端子でラズパイが正常に動作することを保証するものではない。

参考URL

https://www.thun-techblog.com/index.php/blog/mother-board-usb-specification-current/

https://japan.zdnet.com/article/35201090/3/
コマンドプロンプトとエクスプローラ

Windowsにおけるファイルエクスプローラで示されるフォルダの位置について

![スクリーンショット 2023-09-27 232348.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/773471/4d19848c-ec46-f50f-b5b1-a4ce24bcae7d.png)
この図に示されているアドレスバーに表示されている
PC > ローカルディスク (C:) > c
と書かれているのがフォルダの位置である．

このアドレスバーをクリックすると
![スクリーンショット 2023-09-27 233254.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/773471/291cf504-d29d-ec4d-bcb6-724f71cec2cc.png)
のようにアドレスバーの部分に
c:\c
と表示される．

このアドレスバーの部分に
cmd
と入力してEnterキーを押すと，コマンドプロンプトが立ち上がる．
![スクリーンショット 2023-09-27 234331.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/773471/edfe9e7a-52df-879a-b60d-6ef7083dd9e0.png)
このように，カレントディレクトリが，エクスプローラで示されていたパス c:\c　となっているのである．

もし，コマンドプロンプトを開いたときに，たとえば，
![スクリーンショット 2023-09-27 232436.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/773471/5ce46cc3-4821-f912-d54b-376e5645f5d9.png)
のように，ファイルエクスプローラで示しているパス（c:\）と，コマンドプロンプトで示されているカレントディレクトリ（c:\Users\tanak）が異なる場合は，コマンドプロンプトにおいて
cd 【ファイルエクスプローラで示されているパス】
を入力してEnterキーを押せば良い．（これに関する方法はいくつもある）
![スクリーンショット 2023-09-27 235334.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/773471/b064c014-07a4-84ca-8a43-7588e04a68d7.png)
すると，このようにカレントディレクトリを変更することが出来る．
（cd とは change directryの略）
【Mac】ファイルサイズを指定してファイルを作成する方法

以下のコマンドを実行すると指定した容量のファイルを作成できます。

```terminal
mkfile サイズ ファイル名
```

```terminal
$ mkfile 3m test3m.jpeg

$ ls -l test3m.jpeg
-rw-------@ 1 sample  staff  3145728  9 27 00:20 test3m.jpeg

```
meilisearch 日本語対応(トーカナイザの強制日本語化)

# 概要
meilisearchは素晴らしいプロダクトなんだけど、通常ビルドだと日本語がイマイチ。
原因はトーカナイザにあって、中国語と日本語の判定に問題、、、というか日本語と中国語のコード体系に被りあるのが問題である。
どうせ日本語でしか使わないので、強制的に日本語固定にする作戦を決行する(中の人がたまに作ってくれるのだが、毎回作ってくれないので自分で作る)。

# 準備
* wsl2で確認
* git、rust、jq(サンプルデータ投入で使う)のインストール

# コード
```bash
#!/bin/sh

git clone  https://github.com/meilisearch/meilisearch
cd meilisearch
sed -i -e "s/cargo build --release$/cargo build --release --no-default-features --features \"analytics mini-dashboard japanese\"/g" ./Dockerfile
VERSION=`grep version ./Cargo.toml | awk '{print $3}' | sed -e 's/"//g'`
docker build -t meilisearch-jp:v${VERSION} .
```

## 解説
sedの部分の1行だけ。そのあとdocker buildしてます。
ビルドにはそれなりに時間が掛かる。数分以上待つ。

# docker起動
```bash
docker run -it --rm -p 7700:7700 -v $(pwd)/meili_data:/meili_data meilisearch-jp:v1.4.0
```
:::note warn
v1.4.0は適宜置き換え
:::

Webブラウザで、http://localhost:7700/ で動作確認。まだindexがカラなので検索は確認できない。

# サンプルデータ投入
郵便番号で試してみます。
https://www.post.japanpost.jp/zipcode/dl/utf-zip.html
によると2023年6月更新分よりutf8が増えたみたいです。
なおmeiliseachのデータ投入はjsonで行います。

## csv → json変換

```bash
wget https://www.post.japanpost.jp/zipcode/dl/utf/zip/utf_all.zip
unzip utf_all.zip
cat utf_all.csv | tr -d '"' | sed -z 's/\n$//' | jq -s -R 'split("\n")|map(split(","))|map({"id" : .[2], "col1": (. [3] + " " + . [4] + " " + . [5]), "col2": (. [6] + " " + . [7] + " " + . [8])})' > utf_all.json
```
:::note info
id:郵便番号、col1:住所カナ、col2:住所。 ↓ 以下参照
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16917/a90c20af-97aa-5ee5-497e-93b2d86f103c.png)

## jsonデータ投入
```bash
curl \
  -X POST 'http://localhost:7700/indexes/sample1/documents?primaryKey=id' \
  -H 'Content-Type: application/json' \
  --data-binary @utf_all.json
```
:::note info
index名はsample1。
:::

![2023-09-27_23h43_53 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16917/337f26a3-111c-f360-0588-c925ae31e1c6.jpeg)


## (おまけ)index 削除
```bash
curl -X DELETE 'http://localhost:7700/indexes/sample1'
```
以上。
バイナリエディタスプリット

```c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>

static unsigned long get_file_size(FILE* fp);

int main(int argc, const char* argv[])
{
	// check for input parameters
	if (argc < 3) { printf("lack of input paremeters\n"); return -1; }

	// arguments
	const char* in_path = argv[1]; // source file
	char* dmy;
	const unsigned long split_bytes = strtoul(argv[2], &dmy, 10);	// split bytes

	// allocate data buffer 
	unsigned char* buffer = (unsigned char*)malloc(split_bytes);
	if (buffer == NULL) { printf("cannot allocate buffer (bytes = %d)\n", split_bytes); return -1; }

	// open input file
	errno_t error;
	FILE* in_fp;
	error = fopen_s(&in_fp, in_path, "rb");
	if (error != 0) { printf("cannot input file : %s\n", in_path); return -1; }
	// get input file size
	unsigned long in_path_bytes = get_file_size(in_fp);

	// set start position in file pointer
	fseek(in_fp, 0, SEEK_SET);

	// initialize auto variable 		
	size_t remain_bytes = in_path_bytes;
	int split_count = 0;

	do
	{
		// calcurate split binary file size
		size_t next_read_bytes = (remain_bytes > split_bytes) ? split_bytes : remain_bytes;

		// read data from input file
		size_t read_bytes = fread_s(buffer, split_bytes, 1, next_read_bytes, in_fp);
		if (read_bytes != next_read_bytes) { printf("fail to read bytes from input file\n"); return -1;}

		// create new binary file
		char str_out_path[_MAX_FNAME];
		sprintf_s(str_out_path, sizeof(str_out_path), "%s-%03d", in_path, ++split_count);
		FILE* out_fp;
		error = fopen_s(&out_fp, str_out_path, "wb");
		if (out_fp == NULL) { printf("cannot open binary file : %s", str_out_path); return -1; }

		// write data into new binary file
		size_t wrote_bytes = fwrite(buffer, 1, next_read_bytes, out_fp);
		if (read_bytes != next_read_bytes) { printf("fail to write bytes from input file\n"); return -1; }

		// flush and close 
		(void)fflush(out_fp);
		(void)fclose(out_fp);

		remain_bytes -= next_read_bytes;
	} while (remain_bytes > 0);
	
	// close input file
	(void)fclose(in_fp);

	return 0;
}

static unsigned long get_file_size(FILE *fp)
{
	fpos_t pos = 0;
	if((fseek(fp, 0, SEEK_END) == 0) && (fgetpos(fp, &pos) == 0))
	{
		return (unsigned long)pos;
	}
	else
	{
		return 0;
	}
}

```
【SwiftUI】バッジの見た目を変更する

# はじめに
iOS17から`badgeProminence`というバッジの見た目を変更するメソッドが追加されていたので使ってみました

# 実装
### standard
```diff_swift
List(0..<10) { index in
    Text(index.description)
        .badge(index)
}
.badgeProminence(.standard)
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/28520bc4-4bb6-c6d5-7f2e-dac980390e00.png" width="50%">

### decreased
```diff_swift
List(0..<10) { index in
    Text(index.description)
        .badge(index)
}
.badgeProminence(.decreased)
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/28520bc4-4bb6-c6d5-7f2e-dac980390e00.png" width="50%">

### increased
```diff_swift
List(0..<10) { index in
    Text(index.description)
        .badge(index)
}
.badgeProminence(.increased)
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/a41f6e18-82a0-655a-68c8-7925036befa5.png" width="50%">

# おわり
standardは使うViewによっても変わるみたいです

# ドキュメント
https://developer.apple.com/documentation/SwiftUI/View/badgeProminence(_:)
SQL基礎まとめ

備忘録

# データベースとは？
データベースとは、テキストや数値などのデータを保存するためのツール。
twitterのツイートなどの情報をデータベースに保存している。

・表のことを「テーブル」
・縦の列のことを「カラム」
・横の列のことを「レコード」

# クエリとは？
クエリは、データベースに送る命令のこと。
データベースからデータを取得するためには「SELECT」を用いる。
テーブルの指定は「FROM」

```:SQL：カラムの参照方法
SELECT name　・・・どのカラムの指定
FROM purchases;　・・・どのテーブルの指定
```

順番はSELECT文→FROM文の順番

クエリの最後には「;」を必ず、打つこと！！


```:SQL：複数カラムの参照方法
SELECT name,price　・・・どのカラムの指定(複数)
FROM purchases;　・・・どのテーブルの指定
```

```:SQL：すべてのカラムの参照方法
SELECT *　・・・すべてのカラムの指定
FROM purchases;　・・・どのテーブルの指定
```


編集中
ローカル環境で外部ライブラリを使用する方法

### ローカルにライブラリをダウンロードしてきて使いたい

というときのやり方をまとめておきます

## 実行環境

Android Studio Framingo

### 1.ライブラリをダウンロードしてくる
例えば、Gsonであれば、
https://mvnrepository.com/artifact/com.google.code.gson/gson
    にアクセスすることで、データのダウンロードが行えます。
ここで、使用したいバージョンの.jarファイルをダウンロードしてきます。
### 2.jarファイルを使用したいAndroidStudioProjectのフォルダに入れる
project名→app→libsフォルダ内に.jarファイルを入れます
（libsフォルダがなかったら作成してください）
### 3.gradleで依存関係を記述する
gradle(app)のdependencies内で
```kotlin
implementation files('libs/gson-${ver名}.jar')
```
のように、libs/使用したいライブラリファイル名の形で指定します。

このようにすることでオフライン環境であってもローカルで外部ライブラリを使用することができます。
Javascript の map と reduce の違い

JavaScript `map` と `reduce` の違いを説明します。

### map メソッド

1. `map` メソッドは、配列の各要素に対して与えられたコールバック関数を実行し、新しい配列を作成します。
2. 元の配列は変更されず、新しい配列が作成されるため、元の配列の要素に影響を与えません。
3. コールバック関数は、各要素に対して適用され、その結果が新しい配列の要素となります。

```javascript
const numbers = [1, 2, 3];
const doubledNumbers = numbers.map((num) => num * 2);
// doubledNumbers: [2, 4, 6]
// numbers: [1, 2, 3] (元の配列は変更されない)
```

### reduceメソッド

1. `reduce` メソッドは、配列の各要素に対して与えられたコールバック関数を使って、単一の値を生成します。
2. 初期値を指定することができ、この初期値は最初のコールバックの第一引数になります。
3. コールバック関数は、前のコールバックの結果と現在の要素を利用して処理を行い、最終的な値を生成します。

```javascript
const numbers = [1, 2, 3];
const sum = numbers.reduce((acc, num) => acc + num, 0);
// sum: 6 (1 + 2 + 3)
```

‌

要約すると、`map` は新しい配列を生成して各要素を変換するのに対して、`reduce` は配列の要素を使って単一の値を生成するために使います。また、`map` は各要素に対して同じ操作を適用するのに対して、`reduce` は異なる要素ごとに異なる処理を適用することができます。
データのByte配列の中身をPLCと各言語で比較する。

## はじめに

ソケット通信を行うときは、データをByte配列によるバッファに変換してサーバに送信します。そして、受信したデータもByte配列を文字列や実数等に変換して、クライアント側で処理します。

「データをByte配列にする」ということはいったい何？という疑問もささやかれると思いますが、簡単に言えば、データを16進数にまとめているといえばわかりやすいかと思います。

パソコンとPLCの間で上位リンク通信を行う上では、その中身を知ることが非常に重要だったりしますので、PLCと各言語でどのように変換されるのか確認したいと思います。
結論から言えば、PLCでもプログラミング言語でも結果は同じとなりますが、その変換のコードも書き方も本投稿で学習のきっかけとなれば幸いです。

## PLCの場合

試しに`-35,256,852`という数字をPLCであらわしてみましょう。
CR2002とMOV.Lコマンドでこの数字をDM0に転送します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565600/8d10342b-2e4a-ba16-0810-f4a9235ea412.png)

その結果を登録モニタで32bit16進数で確認すると下図のようになると思います。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565600/a432e365-b295-fd68-cc7d-93677e8d13af.png)

これは単純にこの数字が16進数として表記された結果ですが、DM0にどのようにデータが格納されたかを細かく分析するとこのようになります。
つまり、"05"と"EC"が下位レジスタであるDM0、"FD"と"E6"が上位レジスタであるDM1に格納されているということになります。
つまり、32bit符号付き整数が4つのByte配列になって、PLC内のレジスタに格納されているということになります。1つのByteで8bitですから、4バイトで32bitということになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565600/0eb13669-f761-0413-1b50-a6a9ea22926e.png)

# Pythonの場合

Pythonで同じ数字を変数に代入して、Byte配列にしたらどうなるか、見てみましょう。コードは下記のとおりです。
valueという変数に整数を格納し、to_bytesメソッドでByte配列に変換します。その引数は配列数が4で、変換はリトルエンディアン、符号付きという意味になります。
※リトルエンディアンについては割愛いたします。

結果は`0xfd`という風に出てきますが、PLCとの比較で分かりやすくするために`0x`の表記を削除し、`upper()`メソッドで大文字に変換します。


```Python:
value = -35256852

buf = [hex(x).replace('0x','').upper()
       for x in value.to_bytes(4, 'little', signed=True)]
str = buf[3]+', '
str += buf[2]+', '
str += buf[1]+', '
str += buf[0]

print('変換結果: ' + str)
```

実行結果：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565600/e176fff2-8a5e-4ecb-3a80-7914bfc8a0c9.png)

結果としてはPLCで出力された結果と一致しています。
当然といえば当然のことですが、データがByte配列にどのようにPLCまたはパソコンンのメモリに格納されているかを知ることで、この先のPLC上位リンク通信でさまざま役に立つ場面が出てくると思います。

# C#の場合

C#の場合もコードと結果を記載しておきます。
`ToString("X")`で数字を16進数の大文字表記にしております。

```C#:
internal class Program
{
    private static void Main(string[] args)
    {
        int value = -35256852;

        var buf = BitConverter.GetBytes(value)
                    .Select(x => x.ToString("X")).ToArray();

        Console.WriteLine($"実行結果: {buf[3]}, {buf[2]}, {buf[1]}, {buf[0]}");

    }
}
```

実行結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565600/3aefd654-afc7-f638-474f-1dcddef346c1.png)
Windows11にCopilotが実装されたので、Copilotでできること/できないことメモを作りました。

# Windows11のCopilotとは
Bing ChatをもとにしたCopilotがWindows11に実装されました（プレビュー版）。
Bing Chatでできたことはもちろん、テキスト指示でWindows11の一部タスクが実行できるようです。

詳細は下記ニュース記事を参照してください。
[Windows 11、9月26日の大型アプデ「23H2」で「Microsoft Copilot」ビルトイン](https://www.msn.com/ja-jp/news/techandscience/windows-11-9%E6%9C%8826%E6%97%A5%E3%81%AE%E5%A4%A7%E5%9E%8B%E3%82%A2%E3%83%97%E3%83%87-23h2-%E3%81%A7-microsoft-copilot-%E3%83%93%E3%83%AB%E3%83%88%E3%82%A4%E3%83%B3/ar-AA1h4o84)

# Copilotできることメモ
2023/09/27時点で確認済みのできることをメモしておきます。

* インターネット検索
* アプリの起動（Microsoft関連アプリ以外は起動できないかも）
　メモ帳・VSCodeは起動できた。その他の標準アプリもおそらく起動できる。


# Copilotできないことメモ
2023/09/27時点で確認済みのできることをメモしておきます。

* アプリの終了
* アプリ内でのテキスト入力（プロンプト例：メモ帳を開いて、「Hello」と入力してください。）
* ディスプレイを夜間モードに切り替える（ダークモード設定について聞かれてしまう。）
* クリップボードへのコピー

# 現時点の感想
私の検証不足もあると思いますが、まだできることは少ないかなっていう印象です。

「画面の明るさをもっと明るくして」と伝えると「音量を上げますか？」と聞き返されたり、「夜間モードにしてください」と伝えると「ダークモードに切り替えますか？」と聞き返されたりします。

現時点のメリットとしては、edgeを開かなくてもbing chatを使用できること、ぐらいかなと思いました。今後に期待です。
ubuntu server のインストールが終わらない（E: Can not write log (Is /dev/pts mounted?)）

# エラーログ
win11+VirtualBoxにてubuntu18のインストールが終わらない事案が発生。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342722/dc76c4a0-9ce0-1cd4-f9c4-8851cc5e4651.png)


```
E: Can not write log (Is /dev/pts mounted?) - posix_openpt (19: No such device)
```
がずっとループしている

# 解決方法

マシンの設定より
ストレージ→仮想ドライブからISOディスクを削除→リセットして再起動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342722/234dcf7c-0b95-d06c-3749-28d3ed21decf.png)
ダブルタップで拡大するのを無効化(html css)

備忘録

htmlでダブルタップして勝手に拡大されるのを防ぐ

```html:index.html
<head>

<!--styleタグの中身をstyleで指定すればOK-->

    <style>
        html {touch-action: manipulation;}
    </style>


</head>
```
関数の作成

### 簡単な関数を作ってみよう！
簡単な関数を作りながら関数の作り方を学んで行きましょう。

引数を取らず、戻り値を返さない関数を作ってみます。
関数名をfuncとして、変数iを定義して3を代入する関数を作ります。
```python
def func():
    i = 3
```
関数はdefというキーワードで定義します。
defの後、半角スペースを1つ入れて、関数の名前を書きます。
名前に引き続き丸括弧()を書きます。引数がある場合は括弧の中に指定します。
最後にコロン:を書きます。
次の行は、コロンの後なのでfor文やif文と同じようにタブキーを１つ入力してインデント（字下げ）します。このブロックが関数の中身になります。

では、関数を呼び出してみましょう。
```python
func()
```
実行しても何も起こりません。
作成した関数funcは、変数iを用意して3を代入する仕事しかしないので、何の変化も見えないのは当然です。
### 戻り値を返す関数を作ってみよう！
関数funcを改造して、関数内部で定義した変数iを戻り値として返すようにしてみよう。
そのために、returnというキーワードを使います。
returnは、直後に書かれたオブジェクトを関数の外に返す役割があります。
```python:関数func
def func():      # 関数func作成
    i = 3
    return i

func()           # 関数func実行
```
```python:実行結果
3
```
関数funcを呼び出すと、今度は3が戻ってきて画面に出力されます。
なお、returnを使って関数の外にデータを返すと、その関数の役割が終わり、その時点で関数が終了します。つまり、ブロック内でreturnより後の行にコードを置いても実行されません。
### 引数を持つ関数を作ってみよう！
関数funcを改造して、数字を受け取って、それに3を足して返すようにしましょう。
引数の指定方法は、関数を定義するときに書いた丸括弧の中に変数名を書くだけです。
こうすると、その変数を関数の中だけで使えるようになります。ここでは、引数の変数名を"v"としておきます。
```python:関数func
def func(v):     # 関数func作成
    i = v + 3
    return i

func(5)          # 関数func実行
```
```python:実行結果
8
```
引数に5を入力すると8が返ってきます。
ReactのUnKnown Prop Warningについて

## 初めに
React-Hook-FormとMUIを使ってForm画面を作っている最中以下のエラーが表示されました。
```
Warning: React does not recognize the `formState` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `formstate` instead. If you accidentally passed it from a parent component, remove it from the DOM element.
```
「なんでー」と思ってReact Hook Formの```Integration with UI Libraries```を見ると、```{({field})}```が```{(field)}```となっているではありませんか！！
```js
render={({ field }) => <Select 
          {...field} 
          options={[
            { value: "chocolate", label: "Chocolate" },
            { value: "strawberry", label: "Strawberry" },
            { value: "vanilla", label: "Vanilla" }
          ]} 
```
ということがありました。

調べてみると、```Unknown Prop Warning```と言われるもので、反省ということで記事を書かせていただきます。

## Unknow Prop Warningとは
簡単に言うと、認識しない引数を渡すとこのWarningが表示されるみたいです。
例えば、下記のようにpropsがありそれをスプレッド構文で渡す場面があると思います。
その際、divタグにはidという属性はあるが、layoutという属性はありません。このような場合、上記の警告が表示されます。
```jsx
props //props.layout='horizontal' props.id="my-id"
<div {...props} />
```

## 結論
今回は、```{}```が抜けていたため、期待通りのスプレッド構文で渡すことができなくなっていたということですね。
Macアプリの自動バックアップを取る

# TL;DR
Time Machineでバックアップを取る際、`/Application`を含めてしまうとバックアップサイズがすごいことになってしまうので、それをなんとか回避したかった。
「自動バックアップを取る」と書きましたが、もちろん`.app`をすべてTime Machineにぶちこむわけでも、Dropboxに上げるわけでもなく、「アプリケーション」のファイル名をテキストファイルとして保存し、それをDropbox等の指定ディレクトリに保存するという方法で、設定自体はおそらく5分あればできると思います。

# 実装
ここでは、Automatorで作成したスクリプトをアプリケーションとして保存し、Macログイン時に自動起動させ、スクリプトを走らせるという方法を取ってます。

まずはAutomatorを起動し、新規書類を作成。「アプリケーション」を選択。
![スクリーンショット 2023-09-27 21.41.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328477/c1a39dee-4bca-ae24-9955-e5d0f165aa99.png)

一覧から「シェルスクリプト」を探し出し、右にドロップします。
![スクリーンショット 2023-09-27 21.43.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328477/129ae82e-30a3-9adb-28fe-64404950a3ab.png)

すでに入力されている`cat`を削除し、以下を入力。
```AppleScript
cd /Applications
```
続いて、以下のスクリプトを入力。
・`[保存先のディレクトリ]`にはご自身の保存先に置き換えてください。個人的にはクラウド上に保存するのがおすすめです。（私はDropboxを保存先にしています。）
・`[作成するファイル名]`は`appList_[機種名]`にするのがおすすめです。
・`$(date +"%Y-%m-%d-%H-%M")`には自動でタイムスタンプが入ります。これを削除すると常に上書きされるようになるので、上書きでよければ`_`から`)`まで削除してください。（Dropboxなどでは巻き戻せるので不要かもしれませんが、私はそのままです。）
```AppleScript
ls > [保存先のディレクトリ]/[作成するファイル名]_$(date +"%Y-%m-%d-%H-%M").text
```

試しに実行してみましょう。
右上の実行（再生ボタン）をクリックして実行します。
保存先のディレクトリにファイルが生成されていれば成功です。
![スクリーンショット 2023-09-27 21.53.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328477/a0d63422-b19c-a59f-6f9c-782848ecd236.png)

# 保存〜定期実行
`⌘S`で保存します。わかりやすいファイル名を適当につけます。
「ファイルフォーマット」で「アプリケーション」を選択してください。
![スクリーンショット 2023-09-27 22.01.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328477/5b81e68a-b183-9195-7094-07c5a3e840ab.png)

「システム設定」を開き、「一般」>「ログイン項目」へと進みます。（このあたりはバージョンによって多少異なるかもです。）
「ログイン時に開く」セクションの「＋」ボタンをクリックし、先程保存したアプリケーションを選択し、一覧に追加されれば完了です。
![スクリーンショット 2023-09-27 22.04.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328477/b73b979e-d908-0c4a-cc37-9ffd24f86867.png)

再起動をして、指定したディレクトリにファイルが生成されていれば成功です。お疲れ様でした。

ここまでお読みいただきありがとうございました。
こんにちは！ 戻ってきました: 現在のプロジェクト

もっと日本語ともっとCYBERSECURITYを勉強だから数年前にここに書くのをやめましたいま私は現在6年のサイバー脅威の専門家です日本へいきましたそれから私の日本語と私の実務経験は前回よりも優れています

新しいプロジェクトに向けて取り組んでいます! 
それを共有したい

![cornelius-ventures-Ak81Vc-kCf4-unsplash.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233436/7890ca96-5356-0b73-286a-b5f0d3117278.jpeg)



## LINUXのサイバー脅威の最先端の研究


私はLINUXのサイバー脅威について1年間研究しました。そのために初めCOWRIEのHONEYPOTを使用しました。。。[このリンク](https://git.sr.ht/~alienagain/honeypot_notes)はそののリポジトリです 
私は3つのイベントにその研究をみせって (スペイン語と英語です)

[AlienVaultで結果を公開しました](https://otx.alienvault.com/user/astronaut_skull/pulses)

![Screenshot from 2023-09-27 15.08.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233436/2e03f9d2-de6a-afb5-d9ae-17ce93424cab.png)


2022年にcryptominersは人気になりましたでも2023年にstealersはcryptominersより人気になりました
また、Malware複雑になりました

例えばここにいくつかの最近見たのTTPがあります

* Command&Controlとして使われたTelegramのbots ([T1102.002 MITRE](https://attack.mitre.org/techniques/T1102/002/))
* 2FAのポケんンを窃盗 --- SMS例えば ([T11111 MITRE](https://attack.mitre.org/techniques/T1111))
* Anti-VM (VMを回避) ([T1497 MITRE](https://attack.mitre.org/techniques/T1497))

それでわ最近のキャンペーンは Ransomware (Cyclops, Conti), Stealers (The White Snake), toolkits (Reptile) とその他など



## STEALERS

WindowsとLinuxとMacOSのStealersは人気が出てきています
一部のRansomwareもう暗号化を使用していませんそれはDataを盗むだけです

いま一部の人気のStealersはMeduzaとRacoonとRedlineとBanditとNodeStealerとVidar
[ここで](https://any.run/malware-trends/)部分的に見ることができます。例えばその統計は[Redlineの量](https://any.run/malware-trends/redline)が増えていますと書いてある

![Screenshot from 2023-09-27 15.06.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233436/07cf58b1-fdc2-4c3e-f4f6-b0444bf8b13c.png)


Stealers も他のマルウェアのコードをリサイクルします! 例えばQuasarとAsyncRAT（RACOONでっと）


----

すぐこれについて書きます!
社内SEやる時に気を付けてること（適宜更新）

社内SEやる時に気を付けていることを列記しておきます。
自分用メモみたいなもんでもある。


・トラブルが起きた時は根掘り葉掘り訊く
パソコンに詳しくない人は「なんかおかしい」「いつの間にか壊れた」などと言い出します。社会人なのだから5W1Hぐらいまともに喋ってほしいところですが、なぜかITが関わると「わからない！」ってなる人がたくさんいます。
まあだから社内SEなんて職業が成り立つんすね。
なので、わかる範囲で根掘り葉掘り聞かないとトラブルは解決できないものと思ったほうがいいです。
「いつ」「どこで」「何をしたとき」「どうなった」ぐらいは聞きたいですね。
もちろん会社用のPCなのでログが見れないことはないですが、ログを調べるのにも余計な時間がかかりますし。

・システム化の相談はまず傾聴する。
そんな状態なので、今やってる仕事をIT化したいという依頼も、
「あんなこといいな　できたらいいな」状態だったりします。
しかし、システムというのは誰かがどこかで入力したデータ（センサー類なのか、OCRなのか、入力画面に入れるのか、別システムから連携するのか）を、何かしらのロジックに従って出力するという形になります。
つまり、誰も入れていないデータを出力したり、ロジックがきちんと定まっていないのに計算結果を出力したりすることはできません。
Qiitaにいる方にとっては太陽が東から昇るのと同じぐらい当たり前だと思いますが、それが理解できない人もいます。
なので、こちら側で「それはつまり、こういった計算式ですか？」「それはつまり、ここから入ってくるデータで必要なデータはすべてそろうということですか？」と具体化してあげる必要があります。
本来、仕様策定は発注者の責任なのですが、そのようなIT界の常識は古い会社では通用しません。
泣いた。

・バズワードを連発する偉い人は警戒する
技術的な理解力に乏しい偉い人がAIだのVRだのとバズワードを連発して、RTX4000シリーズが乗っかった高いPCを買って、設定は情シスの若いやつ（私）に丸投げ。
そんなことが多すぎる。（そして大概現場の人が使いこなせず文鎮になる）
自分の権限で出来ることは多くないにせよ、話が勝手に広がらないように注意する必要がある（既定事項になると、本当に、本当に困る）

（思いついたら適宜更新）
マルウェア、さまざまな攻撃

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/45b5a299-83a1-0ea3-7e41-a833a2c7385b.png)
１：ウイルス対策ソフトウェア
　ウイルスを検出し、可能であれば駆除するソフトウェアです。
ウイルスの検出方式には
①パターンマッチング方式：ウイルス定義ファイルに登録されているウイルスパターンと一致するか調べて、ウイルスを検出する。ウイルス定義ファイルに登録されていないウイルスは検出できない。

②ヒューリスティックスキャン方式（ビヘイビア方式）：不正処理と疑われる動作をするプログラムをウイルスとして検出する。完全にウイルスを検出できなるわけではないが、ウイルス定義ファイルに登録されていない最新のウイルスを検出する場合もある。

　パターンマッチング方式では、ウイルス定義ファイルを最新の状態に保つことが重要です。しかし、近年は、ウイルス定義ファイルに登録される前に最新のウイルスを広くばら撒いて攻撃を行うゼロデイ攻撃が盛んに行われています。ウイルス定義ファイルが最新であるから絶対にウイルス感染しないということはないのです。

２：攻撃の種類
①パスワード破り（パスワードクラッキング）
　主な手法として、
・ブルートフォース攻撃　総当たり攻撃：パスワード全ての組み合わせを試す。アカウントロックアウトで対策を行う。

・リバースブルートフォース攻撃：パスワードを固定してユーザIDを変化させ、当該パスワードを利用しているユーザを探り当てる。各ユーザIDに対して数回しかログインの試行を行わないのいで、アカウントロックアウトは有効に機能しない。同一IPアドレスからのログイン試行に対して、一定時間内の試行回数を制限することで対策する。

・辞書攻撃：辞書に掲載されている単語を試す。Webサイトにまとめられている用語集などの単語も含む。安易な単語をパスワードとして登録できない仕組みを設けることで対策する。

・パスワードリスト攻撃：他のサイトで流出したユーザID、パスワードをそのまま利用する。他のサイトと同じユーザID、パスワードを利用しないようユーザへ周知する。
gitで一時的に特定のリビジョンに戻す方法

```bash
git checkout リビジョンID
```

上記で特定のリビジョンの状態に戻すことができます。

```bash
git checkout リビジョンID ファイルパス
```
上記で特定のファイルを特定のリビジョンの状態に戻すことができます。

```
git checkout [branch_name]
```
元に戻す場合は上記の通りブランチ名でチェックアウトする

## appendix

```
git log --grep="your_search_term"
```

```
git log --since="YYYY-MM-DD" --until="YYYY-MM-DD"
```

```
git log | grep "2023-10-09"
```

```
git log -p ファイルパス
```
【技術書感想】テスト駆動開発

## 読んだ技術書紹介
[テスト駆動開発](https://www.amazon.co.jp/%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA-Kent-Beck/dp/4274217884/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1WVZOO1UKLMDL&keywords=%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA&qid=1695742996&sprefix=%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%2Caps%2C230&sr=8-1)
![スクリーンショット 2023-09-27 0.50.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1109509/d4d91aa8-ddb8-d61d-b727-441009652e64.png)

## 筆者について(wiki引用)
Kent Beck
- エクストリーム・プログラミング (XP) の考案者
- アジャイルマニフェスト起草者の一人
- デザインパターン、テスト駆動開発、Smalltalkに関する本を執筆
- ウォード・カニンガムと一緒にCRCカードを普及させた
- エーリヒ・ガンマと共同でJavaのユニットテストのフレームワークJUnitを開発


## テスト駆動開発の概要
### テスト駆動開発とは
テストで駆動する開発のこと。TDDと呼ばれる。
テストを作成してから、そのテストが通るようにコードを作成する。
実際には以下のルールで実装していく。
* 自動化されたテストが失敗した時のみ、新しいコードを書く
* 重複を除去する

### テスト駆動開発で得られること
テスト駆動開発のゴールは「動作するきれいなコード」である。
* 開発が予測可能になる。完成したかがわかり、バグが残っている心配をする必要もない。
* コードが伝えようとしているところを余すこと無く受け取れる。最初に思いついたコードを書きなぐるだけではなく、再考してより良いコードを書くチャンスを得られる。
* あなたが作るソフトウェアのユーザーを快適にする。
* チームメイトはあなたを信頼し、あなたもまたチームメイトを信頼する。
* 書いていて気持ちがいい。

### テスト駆動開発の進め方
以下の1-3(レッド→グリーン→リファクタリング)を小さなステップで繰り返し実施していくこと。
1. レッド：動作しない、おそらく最初のうちはコンパイルも通らないテストを書く
2. グリーン：そのテストを迅速に動作させる。このステップでは罪を犯しても良い
3. リファクタリング：テストを通すために発生した重複を全て除去する

上記でやることは以下である。

1. テストを書く
    * 物語には、正しい答えを導くための要素を全て盛り込む

2. 動かす
    * テストが全て通っている（コードが汚くなってもOK）
    * 複雑なら、TODOリストにまとめておく
    * なにがなんでも速やかにバーをグリーンにする

3. 正しくする
    * 「動かす」の行いを悔い改める
    * 邪道な部分を除去して、正道に

### テスト駆動開発を進めるときのコツ
- TODOリストを活用する
    - やるべきことを忘れない
    - 目の前の仕事に集中できる
    - 仕事が終わったかもわかるようになる
- やりたいことが複雑だったり、途中でやりたいことが増えた場合はTODOリストに詰めること。
途中であれこれ手を出すと1つのテストをグリーンにすることに集中できず、レッド期間が長くなってしまう。
- 小さなステップを踏むように意識して、10-30分くらいで1回のレッド→グリーン→リファクタリングを回せるようにする。
- 目的は小さなステップを踏むことではなく、踏み続けることなので、常に細かいステップを踏むべきというわけではなく、複雑な内容の場合に小さなステップを踏めるようになることが大事。
- 速やかにグリーンにするためのTDD戦略は実装時に仮実装・明確な実装・三角測量といった手法を適切に使い分けること。
    - 仮実装: ベタ書きの実装から、徐々に正しい実装に寄せていく
    - 明確な実装: 正しいと思う実装をいきなり書いて、テストが通ることを祈る
    - 三角測量: 1つのテストではリファクタリングしにくい場合に、もう一つテストを書いて両方が通るようにリファクタリングする


## 本書でやったこと
3部構成になっている。
- 1部: レポート機能を多国通貨に対応させる過程をTDDを用いて体験できる。
- 2部: xUnitのアーキテクチャをpythonで解説されていく。テスト駆動開発に使うツールの実装の説明もテストから駆動され、テスティングフレームワークが自分で描けるようになる。
- 3部: TDDの「ベストヒット」パターン集。TDD特有のテクニックから、デザインパターン、リファクタリングについても含まれている。

## 所感
もともとテストを書くことが重要なことは認識していましたが、本書を読んだことで「テストを書かないことはとても勿体無い」と感じ、よりテストを書くことがなぜ重要なのかというところを深く理解できました。実際にテストを書くことで実装への自信や周りからの信頼は向上すると思いますし、テストを先に書くことで実装したいことが明確になったり、テストの書き忘れがなくなったり良いことは多いのかなと思いましたので、一度TDDを実践してみようと思いました。
ただ、実際の業務においては工数や納期があり、どうしてもTDDを意識することが困難な場合も考えられます。そういった場合でも、TDDの本質としては不安を解消してコードに自信を持てることだと思うので、できる限りテストは書こうと思いますし、余裕が出たタイミングでリファクタリングしつつTDDできるようにシフトしていくのも手なのかなと思いました。
【AWS CF】エラー「 Unable to update task definition on services with a CODE_DEPLOY deployment controller」の原因

# 概要
AWS CloudformationでECSのblue/greenデプロイを構築中、サービスの中身を更新したら`Unable to update task definition...`というエラーになりました。原因を備忘録として残しておきます。

# エラー内容

`DesiredCount`（希望するタスク数）を変更したく、`Parameters`で定義した`TaskDeployNumWeb`の数値を`0`から`1`に変えて実行しました。
（マネコンからいじってもいいですが、保守性を高めるためにCF更新で行おうと思ったため）

しかし、Cloudformation実行後、以下のエラーになりました。

```
Resource handler returned message: "Invalid request provided: UpdateService error: Unable to update task definition on services with a CODE_DEPLOY deployment controller. Use AWS CodeDeploy to trigger a new deployment. (Service: AmazonECS; Status Code: 400; Error Code: InvalidParameterException; Request ID: XXXXXXXX; Proxy: null)" (RequestToken: XXXXXXXX, HandlerErrorCode: InvalidRequest)
```

該当箇所は以下。


```yaml
 ServiceXXX:
    Type: AWS::ECS::Service
    DependsOn: HttpListenerRuleWebBlue
    Properties: 
      Cluster: !Sub ${rEcsName}
      DesiredCount: !Ref TaskDeployNumWeb # Parametersで数値を割り当てています
      ServiceName: !Sub ${SysTag}
      LaunchType: "EC2"
      PlacementStrategies:
        - Field: "attribute:ecs.availability-zone"
          Type: spread
        - Field: "instanceId"
          Type: spread
      DeploymentController:
        Type: CODE_DEPLOY
      LoadBalancers:
        - TargetGroupArn: !Ref TargetGroupWebBlue
          ContainerPort: 80
          ContainerName: Web
      TaskDefinition: !Ref TaskXXX
```

# 原因
エラーメッセージは、まず`DeploymentController`が`CODE_DEPLOY`で設定されている場合、タスク定義の更新が制限されている、ということを示しています。つまり、`CODE_DEPLOY`デプロイメントコントローラーを使用している場合は、サービスを更新することはできないよ〜ということを言っているのです。

結論、どうすればいいか？というと、CFで行うためにはタスク定義から作り直さないといけないようです。しかもデプロイも必要だ、と...。
うーん、、もう`buildspec.yaml`とかで諸々設定していたので、それは面倒だなぁ...となりますた。

ということで、マネジメントコンソールから「サービスの更新」→「必要なタスク」を`1`にして対応としました。
[Tips] 異なるオリジンのスクリプトをWeb Workerとして動作させる


この記事は [個人開発エンジニア応援 - 個人開発の成果や知見を共有しよう！- - Qiita](https://qiita.com/official-events/09dee22c436b60f856c9) の参加記事です。

https://qiita.com/official-events/09dee22c436b60f856c9

## はじめに

Web Worker用のスクリプトをサイトのオリジンとは別でホストしたいというとき、
クロスオリジン制約により、スクリプトとサイトのオリジンが異なる場合はWeb Workerを起動できません。

https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers

なんとかできないかと調べていたところ、スクリプトのBlobを指すURLをつくることでできたので記事にします。

## 方法

Web Worker用のスクリプトをfetchし、Blobとして取得します。
そして、そのBlobを指すオブジェクトURLを生成し、そのURLでWorkerを起動します。

Workerを終了させるときは、オブジェクトURLも開放してあげます。

```javascript
// Workerを起動するとき
const response = await fetch(WORKER_URL);
const blob = await response.blob();
const objectUrl = URL.createObjectURL(blob);

const worker = new Worker(objectUrl);

// Workerを終了させるとき
worker.terminate();
URL.revokeObjectURL(objectUrl);
```

## Ref

- [クロスドメインでも worker したい - げっとシステムログ](https://www.getto.systems/entry/2021/11/04/010314)
- [javascript - Cross Domain Web Workers - Stack Overflow](https://stackoverflow.com/questions/23953543/cross-domain-web-workers)
- [CezaryDanielNowak/CrossOriginWorker: Method to run worker from other origins.](https://github.com/CezaryDanielNowak/CrossOriginWorker)
【Java・学習ログ⑩】多態性について

教本に沿ってやってみたシリーズ、『第12章』。
≪使用教材≫スッキリわかるJava入門　第3版　スッキリわかるシリーズ

## 多態性の基本
あるものをざっくり分類したり、ざっくり捉える概念。
下記のように大まかな括りとして、HeroインスタンスをCharacter型に代入できる。
但し、ヒーロー＝キャラクターのように絵に描いてみて嘘にならないもの。突拍子のない代入はエラーになる。

```java
Character c = new Hero;
```
下記はabstractを持つCharacterクラスを継承したWizardクラスを代入しようと試みようとしている例である。抽象クラスインタフェースはインスタンス化はできないが、型として使用することは可能だ。

```java
Character c = new Wizard(); 
```
ただし、子クラス独自のフィールドを呼び出そうとするとエラーが発生する。
![スクリーンショット 2023-09-26 210645.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/8f5df829-9d63-6dcc-8fff-74d4594ae318.png)
抽象クラスCharacterを継承したWizardを、ざっくりキャラクターの一種とみなしてインスタンスを代入しているため、Wizardを個別に判定できず独自のフィールドを呼び出すことができない。

フィールドの中身をどうしても生成したインスタンスcに使わせたい場合は、「c = characterの一種」でwizardを捉えている現状から、厳密に「wizard = c」であると書き換える必要がある。通常の演算子では矛盾が生じていると判定されエラーになってしまうが、**キャスト演算子**で強制代入することで記述自体は可能である。しかし、曖昧な型に中身のしっかり成立したものを代入しようとしているため、コンパイルはできてもエラーは免れない。この失敗の可能性のあるキャストを**ダウンキャスト**という・
```java
Character c = new Wizard();
Wizard w = (Wizard)c; // ダウンキャスト 
```
* interface演算子
ダウンキャスト時、エラーが出るかどうかを実行前に判定してくれる砦。
```java
if (c instanceof SuperHero ){ // interface演算子
//「もし、SuperHeroをcと見なして大丈夫なら…」
 SuperHero h = (SuperHero)c;
 h.fly();
}
```
## 多態性＋配列
多態性のメリットは複数のインスタンスを同一視できること。
例えばざっくりCharacterとみなせる(継承している)クラスを対象にまとめて処理を行いたい場合は…

* 配列で「Character」インスタンス作成後、forで処理をループさせる
```java
public class Main {
	public static void main(String[] args) {
		Character[] c = new Character[5];
		c[0] = new Hero();
		c[1] = new Hero();
		c[2] = new Thief();
		c[3] = new Wizard();
		c[4] = new Wizard();
		for(Character ch : c) {
			ch.hp += 50;
		}
	}
}
```
同一メソッドで配列定義した複数の「monster」インスタンスを受け取れるように定義する。
* ざっくり引数でメソッドを定義
```java
public class Main{
	public static void main(String[] args) {
		Hero h = new Hero();
		Slime s = new Slime();
		Goblin g =new Goblin();
		
		h.attack(s);
		h.attack(g);
	}
}
class Slime extends Monster{
	int hp;
}
class Hero extends Character {
	public void attack(Monster m) {
		System.out.println(this.name + "の攻撃！");
		System.out.println("敵に10ポイントのダメージをあたえた！");
		m.hp -= 10;
	}
}
```
同一の指示でインスタンスごとに異なる動きをさせる。
* 配列でインスタンス化後、ざっくり型でメソッドを呼び出す。
```java
public class Main{
	public static void main(Stiring[] args) {
		Monster[] monsters = new Monster[3];
		monster[0] = new Slime();
		monster[1] = new Goblin();
		monster[2] = new DeathBat();
		for (Monster m : monseters) {
			m.run();
		}
	}
}
class Monster {
	String name;
	int hp;
	
	void run() {
		System.out.println(this.name + "は逃げ出した！");
	}
}
class slime extends Monster{
	void run() {
		System.out.println(this.name + "体をうねらせて逃げ出した！");
	}
}
class Goblin{…
```

- - -
Reactの歴史メモ

## はじめに
Reactを使い始めて1年6ヶ月が経過。Reactの読み書きはできるようになったが、パフォーマンスや保守性を考慮した設計/実装ができていない。ReactHooksやライフサイクル、仮想DOMは概念としてはなんとなくわかるのだが、点でしかイメージできていない。なので、なぜそもそも仮想DOMが必要なの？なぜ状態にそんなに注目してレンダリングが行われるの？みたいな所が腹落ちできていません。そこで、Reactの歴史的経緯やどんな設計思想で作られているのかを理解するため、記事にしていきます。

## そもそもReactとは？
ReactはMeta社(旧FaceBook)を中心に開発されたライブラリ。2011年にFacebook社のジョーダン・ウォーク氏がFacebookにて使用し、2013年にオープンソース化されました。特徴としてUI/UXを意識した開発に向いていることで注目を集めた。
→文字面で読んでも理解は進まないので、歴史的経緯から理解していこうと思います。過去にフロントでどんな課題があり、Reactを利用する事でどんな課題を解決できるのか。

## フロントの歴史
・1990年代初頭、World Wide Webが登場
・1995年、JavaScript登場
・1996年、CSS（Cascading Style Sheets）
・2005年 Google Maps がリリース
・2006年 jQuery がリリース
・2010年 Backbone.js, Knockout, AngularJS などのフレームワークがリリース
・2011年 Web Components が提唱
・2013年 React がリリース
・2016年 Web Components v1 の仕様が決定

### 2005年 Google Maps がリリース
GoogleMapsはAJAX通信によりリアルタイムの地図のスクロールが可能に。旧来の地図アプリはサーバサイドでHTMLを作成するため、ページ遷移の旅にリロードが必要となる。それが、Ajax通信によりページの読み込みなしにリアルタイムで更新が可能。AJAX通信の発展により、サーバサイドでHTMLを作るのではなく、フロント側でデータを受け取りHTMLを完成させる流れになってきた。

### 2006年 jQuery がリリース
従来のJavaScriptは、異なるブラウザ（Internet Explorer、Firefox、Chromeなど）によって異なる方法で一部の機能が実装されていました。これは、同じJavaScriptコードが異なるブラウザで異なる動作をする可能性があることを意味しました。ブラウザ間の差異に対処するため、jQueryのようなライブラリが非常に重要でした。jQueryはクロスブラウザの問題を吸収し、開発者に統一されたAPIを提供して、異なるブラウザで一貫性のある動作を実現しました。そのため、jQueryはウェブ開発におけるブラウザ互換性の向上に大いに貢献しました。

### 2010年 Backbone.js, Knockout, AngularJS などのフレームワークがリリース
クライアントサイドのウェブ開発を効率的に行うためのフレームワークが登場。フレームワーク登場によりフロントの開発がより一層加速。

### 2011年 Web Components が提唱
Web Componentsは、つまり、カプセル化された単一の責任を持つコードブロックです。あらゆるページで再利用することができます。

### 2013年 React がリリース
Reactは、2013年にFacebook内部で開発され、同社のプロジェクトで初めて導入されました。その後、2013年5月にFacebookによってオープンソースプロジェクトとして一般にリリースされました。
Reactの特徴と影響:
Reactは、JavaScriptライブラリであり、以下の特徴とアプローチにより注目され、広く受け入れられました。

コンポーネントベースのアーキテクチャ:
Reactは、コンポーネントベースのアーキテクチャを採用しています。これは、UIを再利用可能な小さなコンポーネントに分割し、それらを組み合わせて複雑なUIを構築するアプローチです。このコンポーネントベースの開発は、コードの再利用性と保守性を向上させました。

仮想DOM（Virtual DOM）:
Reactは仮想DOMと呼ばれるコンセプトを導入しました。仮想DOMは、実際のDOMと同じ構造を持つが、メモリ内で存在し、実際のDOMへの変更が最小限になるようにするために使用されます。このアプローチにより、高速なUIの更新とパフォーマンス向上が実現されました。

・単一方向のデータフロー:
Reactは、コンポーネント間のデータフローを単一方向に制御することを奨励します。これにより、データフローが予測可能でデバッグが容易になります。

・ライブラリである点:
Reactはライブラリであるため、他のライブラリやフレームワークと組み合わせて使用することができます。これにより、既存のプロジェクトにReactを導入しやすく、部分的なアプリケーションの開発にも適しています。

・サーバサイドレンダリングXHPが元の設計思想
Reactは一部のアイデアがXHPからインスパイアされたとされています。XHPは、Facebook内で使われているPHPのための拡張で、JavaScriptのコンポーネントベースのアプローチと似たようなコンセプトを導入しています。Reactの創始者であるジョーダン・ウォークは、XHPのアイデアを取り入れ、それをJavaScriptのコンポーネントライブラリとして実装したと言われています。

具体的には、XHPはHTML要素やコンポーネントをPHPのコード内で表現する方法を提供し、PHPでUIを構築しやすくしました。ReactはこれをJavaScriptのコードに適用し、UIコンポーネントを再利用可能な部品として表現し、仮想DOMといった新しいコンセプトを導入しました。

Reactのリリースは、ウェブ開発の方法を革新し、UIコンポーネントの再利用性、パフォーマンス、開発者エクスペリエンスを向上させました。Reactは現在でも非常に人気があり、多くの企業と開発者コミュニティによって広く採用されています。また、Reactのアイデアとコンセプトは、他のフロントエンドライブラリやフレームワークの設計にも影響を与えています。

## まとめ
フロント開発要件の規模が大きくなるに伴い、部品の再利用性を考慮した設計が必要。部品の再利用はコンポーネント設計で作成。ReactはXHPというPHPのサーバサイドのPHPフレームワークであるため、リクエストする度にページ全体を際レンダリングする思想が残っている。
特定のディレクトリ内のファイルを一括でリネームするPythonプログラム

# 経緯
写真を現像したときにファイル名が自分の想定とは逆順に出力されてしまい、その原因を解決できなかったのでPythonを使って力業で解決することにした

# プログラムの説明
特定のディレクトリを指定してその中のファイル名を逆順にリネームする
ファイル名で.txtや.pngを指定すれば他のファイル形式も対応可能
※ファイルを直接書き換えるプログラムのためオリジナルは残しておくことを推奨する

# コード全文
```python
import os

current_dir = 'ディレクトリのパス'
files = os.listdir(current_dir)
number = len(files)

for i in range(len(files)):
    # リネームしたいファイル名を下記に記載
    new_file_name = "ファイル名_{}.jpg".format(number)
    os.rename(os.path.join(current_dir, files[i]), os.path.join(current_dir, new_file_name))
    number = number - 1
```

# 最後に
同様の問題で困っている方の助けになれば幸いです。
社内SE、ラズパイ4を買う。パート2（初期設定編）

・前回のあらすじ
https://qiita.com/ra_risu/items/5f306c9b847095afafd0
社内SEがラズパイ買って勉強することにした。
届いたよ！ラズパイ！
![230927190135095.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565403/57d871ce-a9ce-7ff0-a90a-c1d27b0214ec.jpeg)

・最初に確認
ラズパイが届いて最初に確認することは～？
通電？違います。
OSインストール？違います。

![230927190203332.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565403/3f7b0458-03c4-20e3-b259-e6674680c55d.jpeg)
技適確認ヨシ！

まあ、購入ページにも技適取得済の旨記載あったので不安視はしていませんでしたが、万が一非適合品を掴まされたら犯罪者になってしまうリスクがありますからね。
こういうのはちゃんと確認しないと（相手がわざとじゃなくてもミスで技適取ってないロットが混入することもあるだろうし）
しかし本当に小さいなあ……これでファンレスで色々使えるって言うんだからすごい話です。
じゃあ確認したところでさっそくやっていきます。

・OS焼いていく
流石に初めてとはいえ、私とてIT技術者の端くれ。
公式のOSを焼くぐらいで失敗したりしませんよ（フラグ）

①公式ページからダウンロード
https://www.raspberrypi.com/software/
②OSとインストール先のストレージを選ぶ
![OS.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565403/99b75641-a8ff-5b4c-4c26-f8a30029eb88.png)
ここ、ぼーっとしてると間違えそうなんですけど、ストレージは外部ストレージが全て検出されるのでバックアップ用の外付けHDDも選択肢に出ました。これ多分間違えたらバックアップ全部消えるんだよね？
どうせラズパイOSを外付けHDDに焼くことなどないのだから自動検知してポカヨケしてほしい。

ついでに右下の歯車からWi-Fiとユーザー名とパスワードとSSH有効化とホスト名変更とロケール設定をしました。一応ユーザー名やパスワードは隠していますが……
こういうのは最初にしておいたほうがいい（経験則）
あとホスト名とかデフォルトで使わないほうがたぶんセキュリティ的にいいですよね？
![詳細設定.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565403/6bae8acd-1ed8-99eb-c4cb-7a76efc357f3.png)

……あれ？
**なんか、SDカードの差込口小さくない……？**

**はい、micro-SDカードとSDカードを間違えていました。（一敗）**
**この記事を読んだ初心者の同志たちは、ラズパイを買う時はmicro-SDカードを買おうね！**

(コンビニに走る)
(1600円の追加出費）

Amazonで買えば明日には半額で家に届きますが、今はこの勢いのままセッティングまで完了してしまいたい……！

③ヒートシンクをつけてネジ止めしました。
![230927201523983.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565403/879ff3a6-08b5-871c-b4ac-f5b878b5d7e9.jpeg)
よく見ると微妙な隙間があり、金属部品とショートしない様になっていますね。

④USB-CケーブルをメインPCの充電できる端子からつなげ、microHDMI-HDMIケーブルをモニターにつなげて起動！

……あれ？
…………画面がつかない……
Type-Cの端子が緩んでいたのが原因だったみたいなので別端子につなげたら点いた。
が、ウェルカムなんとかという画面が一瞬表示されて消えた。
電源確認用の赤いLEDはついている。
電源ケーブルを差しなおす→成功！
どうもケーブルが緩いのか相性が悪いのか？今後要検証だ

![230927203430595.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565403/dcf1ec88-2c4a-94a8-2c74-e29ef213bd8a.jpeg)

ただOSを入れて画面が点いただけが、ちょっと嬉しい。
とりあえずリモートできる設定だけしておこう。

VNCをオンにして、ラズパイ側のIPアドレスを確認して、メインPC側にVNCビューワーをインストールする。
（参考にさせていただいたサイト）
https://www.indoorcorgielec.com/resources/raspberry-pi/raspberry-pi-vnc/#install-vnc-viewer-windows

無事、ラズパイにリモート接続成功！
これで今後色々やるのに便利になりますね。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565403/9b50e666-03b1-deae-59fd-b69228eeacd3.png)

本当はラズパイ側のIP固定とかしたほうがいいんだろうけど、今回は疲れたのでここまで。
次はWake On LanでメインPCの定時起動に挑戦します。
エコなSQLの書き方

# はじめに
こんにちは、SQLを使ったデータ抽出業務に従事している者です。

近年、データ量が増え続ける中で、データベースの効率的な運用に対するニーズが高まっています。効率的なデータベース操作は、サーバーの消費エネルギーを減少させるだけでなく、データの読み込みが早くなることに直結し、アプリケーションのパフォーマンスを向上させる効果もあります。

この記事では、初学者でもできる、SQLの最適化の基本的な3つのポイントについて解説します。

# 1.　必要最小限のデータを取得する


データベースからのデータ取得時にやってしまうポイントの一つが「不要なデータの取得」です。
「とりあえず、どんなデータが入っているのか確認したい。」といった理由でやってしまいがちですが、特に大規模データが格納されているテーブルに対して、以下のようなクエリを実行すると、大量のデータが不必要に読み込まれ、システム全体のパフォーマンスに影響を及ぼす可能性があります。

```
SELECT 
    *
FROM
    users
;
```

上記のクエリは、usersテーブルの全ての列を取得してしまうため、必要ではない余分なデータを不要に取得してしまい、メモリやネットワークの無駄使いとなります。

これを避けるためには、以下のような方法で、不要なデータの読み込みを防ぎましょう。

A. カラムの選定:
SELECT *の代わりに、<font color="red">必要なカラム名</font>を明示的に指定しましょう。これにより、不要なデータの読み込みを防げます。

例えば、ユーザーの名前とメールアドレス、年齢、都道府県コードが必要な場合、以下のようなクエリを書くことで、不要なデータの読み込みを回避できます。

```sql
SELECT 
    username
    , email
    , age
    , prefecture_code
FROM
    users
;
```
B. LIMIT句の利用:
必要な行数だけ取得しましょう。特に、多数のレコードが存在するテーブルからデータを取得する際には、<font color="red">LIMIT句</font>を使用して取得行数を制限します。
```sql
SELECT 
    username
    , email
    , age
    , prefecture_code
FROM
    users
LIMIT 5
;
```

# 2. JOIN操作の効率化
JOINは異なるテーブル間で関連データを結合する強力なSQL操作です。しかし、不適切に使用されると、パフォーマンスの大きなボトルネックになる可能性があります。

JOINの効率化のポイントとしては以下のようなものがあります。
A. 必要最小限のテーブルをJOIN:
必要なテーブルだけをJOINし、不要なテーブルの結合を避けることで、データの転送量と処理量を削減します。

B. ON句の条件の明確化:
ON句の条件は明確にし、必要最小限の行だけが結合されるようにします。

C. 適切なJOINタイプの選択:
INNER JOIN, LEFT JOIN, RIGHT JOINなど、適切なJOINタイプを選択することで、不要なデータの結合や処理を防ぎます。
可能な場合は、INNER JOINを使用しましょう。LEFT JOINやRIGHT JOINよりもパフォーマンスが良くなる可能性があります。


実際のわかりやすいJOINの例を考えてみましょう。
例: 顧客テーブル（customers）と注文テーブル（orders）があり、特定の顧客の注文情報を取得する場面を考えます。

```sql
SELECT 
    customers.name
    , orders.order_date
    , orders.amount
FROM 
    customers
    , orders 
WHERE c
    ustomers.customer_id = orders.customer_id
;
```
このクエリは、両テーブルの全てのカラムと行を結合し、その後WHERE句でフィルタリングを試みます。

```sql
SELECT 
    customers.name
    , orders.order_date
    , orders.amount
FROM 
    customers 
INNER JOIN 
    orders 
    ON customers.customer_id = orders.customer_id
;
```
このクエリは、必要なカラムのみを取得し、効率的なINNER JOINを使用しており、JOINする際のON条件を明確に指定することで、データベースが必要なデータのみを効率的に取得することが可能となっています。

#  3. WHERE句の最適化

WHERE句の最適化は、クエリパフォーマンスを大きく左右します。効率的なWHERE句を作成することで、データベースが対象とする行の数を大幅に減少させることができ、結果としてクエリの応答時間も短縮されます。

WHERE句の最適化のポイントとしては以下のようなものがあります。

A. 具体的な条件の使用:
可能な限り具体的な条件を用いることで、データベースがスキャンする必要のあるデータの量を削減できます。

```sql
SELECT 
    username
    , email
    , age
    , prefecture_code
FROM
    users
WHERE
    prefecture_code = '02'
;
```
B. 範囲の絞り込み:
検索条件で<font color="red">BETWEEN</font>などを用いて範囲を明確に絞り込むことで、処理するデータの量を減少させます。

```sql
SELECT 
    username
    , email
    , age
    , prefecture_code
FROM
    users
WHERE
    age BETWEEN 25 AND 30
;
```
C. 論理演算の最適化:
<font color="red">OR</font>や<font color="red">AND</font>を利用する際にも、効率的な書き方があります。ORよりもINを使用した方が良い場合があります。
```sql
SELECT 
    username
    , email
    , age
    , prefecture_code
FROM
    users
WHERE
    prefecture_code IN ('01', '14', '26', '30')
;
```
# 最後に
＜もしあれば一言とお礼＞
以上で紹介したような方法で、クエリの最適化を行うことで、不必要なリソースの消費を抑えることができます。これにより、エネルギーの使用量が削減され、環境への負荷も軽減されます。つまり、効率的で最適化されたクエリの作成と使用は、環境保護にも寄与すると言えます。
データベースのパフォーマンスを向上させながら、よりグリーンで持続可能なテクノロジーの実現に向けて、一緒に努力しましょう。
【Python】文字列の操作方法

## はじめに
今回はfind系メソッドによる判定方法をいくつか紹介します。
文字列の中に、めつの文字列が含まれているかの判定するには
in演算子を使えば可能ですが、含まれている位置までは分かりません。
なので、含まれている位置を調べるための
**findメソッド・rfindメソッド・indexメソッド・rindexメソッド**
の４つについて紹介いたします。

## findメソッド
```ruby:書き方
str = "これは文字列です。これは文字列です。"
str.find("文")
# 結果:３
```
文字列strの中に『文』が含まれている場合、その最小のインデックス返却して、
そうでなければ-1を返却します。

## rfindメソッド
```ruby:書き方
str = "これは文字列です。これは文字列です。"
str.rfind("文")
# 結果:12
```
文字列strの中に『文』が含まれている場合、その最大のインデックス返却して、
そうでなければ-1を返却します。

## indexメソッド
```ruby:書き方
str = "これは文字列です。これは文字列です。"
str.index("文")
# 結果:3
```
基本的にはfindメソッドと同様です。
ただし、『文』と言う文字が見つからなければValueError例外を送出します。

## rindexメソッド
```ruby:書き方
str = "これは文字列です。これは文字列です。"
str.rindex("文")
# 結果:12
```
基本的にはrfindメソッドと同様です。
ただし、『文』と言う文字が見つからなければValueError例外を送出します。
自然言語処理のチューニングtrick：学習率の調整

自然言語処理のBERTでほぼ100%精度を上げられる→学習率の調整手法を共有したいと思います。
そこまで難しい手法ではないですが、知っている人は意外と少ないです。
具体的には、全ての層で同じ学習率を使うのではなく、層ごとに異なる学習率を設定することです。

手動と自動の2つの調整方法があります。

①手動
まずBERTは学習率に非常に影響されやすいので、学習率を少し大きくしたらモデルがうまく学習できなくなります。
そのために、基本的な学習率の設定は「1e-5から5e-5」の範囲でおすすめです。
BERTは学習済みモデルで、inputに近い下層はあまり高い学習率は必要ないです。
一方で、outputに近いBERTのトップ層はtask specificなので、ここでは少し高めの学習率の設定が必要です。
具体的には、output層には5e-5、BERTには2e-5に設定するなどの方法が考えられます。
もう少し複雑なやり方なら、層ごとに徐々上げていく方法もあります。

②自動
これはSchedulerに学習率の調整を任せます。Schedulerは自動的に学習率を調整してくれるパラメータです。
私がよく使うのはCosineAnnealingWarmRestartsというSchedulerです。
Schedulerを使ったら、学習率が周期的に変わりますので、他のパラメータの調整も楽になります。（例えばstepの調整とか要らなくなります）

興味ある方ぜひ試してみてください。


https://pytorch.org/docs/stable/generated/torch.optim.lr_scheduler.CosineAnnealingWarmRestarts.html
Javaで「日時を比較する」の動作を確認してみた

# 概要

Javaで「日時を比較する」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/start/calendar/index5.html

# 実装

以下のファイルを作成しました。
```TestCalendar4.java
import java.util.Calendar;

class TestCalendar4{
  public static void main(String args[]){

    Calendar calendar1 = Calendar.getInstance();

    System.out.println("日時1を2006/05/08 09:45:10に設定します");
    calendar1.set(2006, 4, 8, 9, 45, 10);

    Calendar calendar2 = Calendar.getInstance();

    System.out.println("日時2を2006/05/11 12:58:15に設定します");
    calendar2.set(2006, 4, 11, 12, 58, 15);

    int diff = calendar1.compareTo(calendar2);

    if (diff == 0){
      System.out.println("日付1と日付2は同じ日時です");
    }else if (diff > 0){
      System.out.println("日付1は日付2より進んでいます");
    }else{
      System.out.println("日付1は日付2より遅れています");
    }
  }
}
```

以下のコマンドを実行しました。
```
$ javac TestCalendar4.java
$ java TestCalendar4 
日時1を2006/05/08 09:45:10に設定します
日時2を2006/05/11 12:58:15に設定します
日付1は日付2より遅れています
```

# まとめ

何かの役に立てばと。
Shadow DOM に外部からスタイルを適用する方法

よく忘れてしまうので。

### 対象となる HTML

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/759747/9ff8f65a-4b76-229d-5021-51f13b8dc1f0.png)

赤線が引いてある `<div id="background-content" part="background">` に対してスタイルを適用してみます。
ちなみにこの HTML は [ionic framework](https://ionicframework.com/) というフレームワークを使用して作った雛形ページの HTML になります。

#### スタイルの当て方

`::part(xxxx)` と定義することで DOM 内部の要素にスタイルが適用されます。
`xxxx` は タグの `part="xxxx"` の部分が該当します。

```css
::part(background) {
  background-color: blue;
}
```

しかし、これだと全ての `part="background"` 要素に適用されてしまうため、**className** や**タグ名**を指定して使う事の方が多いと思います。
今回は Shadow DOM の**外側**にある `<ion-content class="hoge ...">` タグを利用してみます。

```css
/* 適用される */
.hoge::part(background) {
  background-color: blue;
}

/* 適用される */
ion-content::part(background) {
  background-color: blue;
}

/* 適用される */
ion-content.hoge::part(background) {
  background-color: blue;
}
```

Shadow DOM については[こちらの Qiita 記事](https://qiita.com/suin/items/72b85e7d4465719aa4e8)にきれいにまとめてありましたので、一読をお勧めします。
BigQueryの使用スロット数と処理時間を求めるクエリ

```sql
SELECT
  job_id,
  SAFE_DIVIDE(total_slot_ms, TIMESTAMP_DIFF(end_time,start_time,MILLISECOND)) AS num_slot,
  TIMESTAMP_DIFF(end_time, start_time, SECOND) AS elapsed_time
FROM
  `region-asia-northeast1.INFORMATION_SCHEMA.JOBS`
WHERE
  job_id = "foobar"
```