OmniAICreator/Qiita-1.07M huggingface dataset:
Proxmox VEで管理コンソールのポートを8006から443に変えるオススメの方法

変える、と言いましたが正確には8006/443の両方からアクセス可能です。ごめんなさい。

:::note alert
下記の方法が有名ですが、関連付けされたNICのポート全てにNATされておかしくなります。
:::
```bash:これはオススメしません
/sbin/iptables -F
/sbin/iptables -t nat -F
/sbin/iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8006
```

この場合443ポートにアクセスすると正しく管理コンソールにアクセスできます。
しかし、管理画面のNICに関連するブリッジは、どの仮想マシンに割り当てたIPアドレスからでも443ポートのアクセスがProxmoxホストにリダイレクトされます。

vmbr0にCIDR/GWが割り当てられている場合、それらに関連するVMのすべての443ポートへのアクセスはProxmoxホストの管理画面へリダイレクトされます。

最悪の場合、内部にもう1つネットワークを作成してVMを配置すると、どのhttpsサイトにアクセスしても管理画面へリダイレクトされる現象が発生します。

つまり、管理用のNICとVM用のNICを分けていない場合、上記の方法は推奨されません。

:::note
基本的にはnginxでリバースプロキシを配置する下記の方法がオススメです。
:::

```conf:/etc/nginx/sites-enabled/default
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

server {
        listen 80;
        listen [::]:80;
        server_name _;
        location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_pass https://127.0.0.1:8006/;
        proxy_buffering off;
        client_max_body_size 0;
        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;
        send_timeout 3600s;
        }
}

server {
        listen 443;
        listen [::]:443;
        ssl on;
        ssl_certificate /etc/pve/local/pveproxy-ssl.pem;
        ssl_certificate_key /etc/pve/local/pveproxy-ssl.key;
        server_name _;
        location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_pass https://127.0.0.1:8006/;
        proxy_buffering off;
        client_max_body_size 0;
        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;
        send_timeout 3600s;
        }
}
```
HTTPはCloudflare Zero Trustでトンネル張る用で開いています。
HTTPSの証明書は各ノードのシステム→証明書より、ACMEなりオレオレ証明書なりを登録すると使用できます。
必要に応じて設定はいい感じに弄ってください。
AWSリソース一括削除手順(CloudShell＆nuke)

# はじめに
検証環境に作ったリソースを削除したいときに調べた内容を整理しました。

# aws-nukeとは
- AWSアカウント内のリソースを削除することができるツール
- 主な機能
    - リージョンの指定
    - 削除するリソースタイプの指定
    - 削除しないリソースタイプの指定(除外指定)
    - リソースのフィルタリング
    - 削除するリソースタイプのうち、特定のリソースのみ削除させたくない場合などに使用

# AWS CloudShell とは
- AWSマネジメントコンソールから直接起動できる、ブラウザベースの事前認証済みシェル

- AWSマネジメントコンソールにログインし、CloudShellの画面に移動するとその場で Amazon Linux 2 の環境が構築され、少し待つと利用可能な状態になる

- AWS CloudShell の特徴
    - Amazon Linux 2ベースの環境
    - パッケージインストールも可能
    - ファイルをアップロード,ダウンロード可能(ホームディレクトリは1GB保持することが出来ます。)
    - 最大10個の同時シェルを無料で使用可能


# 手順
### 1.アカウントID確認
### 2.cloudshellを開く
### 3.aws-nukeインストール
- Githubで最新のバージョン確認
    https://github.com/rebuy-de/aws-nuke/releases
- バイナリダウンロード
```タイトル:cloudshell
$ wget https://github.com/rebuy-de/aws-nuke/releases/download/v2.21.2/aws-nuke-v2.21.2-linux-amd64.tar.gz
$ tar -zxvf aws-nuke-v2.21.2-linux-amd64.tar.gz
```
### 4.configファイル作成
```タイトル:cloudshell
$ vi nuke-config.yml
```
```タイトル:nuke-config.yml
regions:
- us-east-1 # 消したいリージョン

account-blocklist:
- "999999999999" # 消したくないAWSアカウント。特に指定しなくて良いがこの部分を消すとエラーになるのでこのまま

resource-types:
  # IAMユーザは消したくない
  excludes:
  - IAMUser

accounts:
  "123456789012": {} # 消したいAWSアカウント
```

### 5.アカウントエイリアス作成
```タイトル:cloudshell
# エイリアスは全世界で一意
$ aws iam create-account-alias --account-alias {エイリアス名}
```

### 6.実行
```タイトル:cloudshell
$ ./aws-nuke-v2.21.2-linux-amd64 -c ./nuke-config.yml --no-dry-run

dry runモード：実行時に削除されるリソースを一度確認したいときに使用
```

# 参考
https://qiita.com/rapirapi/items/664b61958aabef51df17
https://iret.media/64433
Kotlin: Gradle で Kotlin Sealization を使う

こちらのプログラムを改造しました。
[Kotlin: Gradle で使う](https://qiita.com/ekzemplaro/items/2aa0ec5f906d6ed1ace0)

## プログラム

```kt:app/src/main/kotlin/ex04/App.kt
// ------------------------------------------------------------------
/*
	app/src/main/kotlin/ex04/App.kt

					Oct/17/2023
*/
// ------------------------------------------------------------------
package ex04

import java.time.LocalDate
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter

import kotlinx.serialization.*
import kotlinx.serialization.json.*

// ------------------------------------------------------------------
class App {
    val greeting: String
        get() {
            return "本日は晴天なり!"
        }
}

fun main() {
	println(" *** 開始 ***")
	println(LocalDate.now())
	println(LocalDateTime.now())
	println(App().greeting)

	@Serializable
	data class Data(
		val key: String,
		val name: String,
		val population:Int,
		val date_mod: String)

	val date1: String = "2022-11-04"
 
	val datax = Data("t0921","宇都宮",92145,date1)

        val json = Json.encodeToString(serializer<Data>(), datax)
        println(json)

	println(" *** 終了 ***")
}

// ------------------------------------------------------------------
```

## 設定ファイル

```text:app/build.gradle.kts
/*
 * This file was generated by the Gradle 'init' task.
 *
 * This generated file contains a sample Kotlin application project to get you started.
 * For more details take a look at the 'Building Java & JVM projects' chapter in the Gradle
 * User Manual available at https://docs.gradle.org/7.2/userguide/building_java_projects.html
 */

plugins {
    // Apply the org.jetbrains.kotlin.jvm Plugin to add support for Kotlin.
    id("org.jetbrains.kotlin.jvm") version "1.9.0"
	id("org.jetbrains.kotlin.plugin.serialization") version "1.9.0"
    // Apply the application plugin to add support for building a CLI application in Java.
    application
}

repositories {
    // Use Maven Central for resolving dependencies.
    mavenCentral()
}

dependencies {
    // Align versions of all Kotlin components
    implementation(platform("org.jetbrains.kotlin:kotlin-bom"))

    // Use the Kotlin JDK 8 standard library.
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")

    // This dependency is used by the application.
    implementation("com.google.guava:guava:30.1.1-jre")

 implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0")

    // Use the Kotlin test library.
    testImplementation("org.jetbrains.kotlin:kotlin-test")

    // Use the Kotlin JUnit integration.
    testImplementation("org.jetbrains.kotlin:kotlin-test-junit")
}

application {
    // Define the main class for the application.
    mainClass.set("ex04.AppKt")
}
```

## 実行結果

```text
> Task :app:run
 *** 開始 ***
2023-10-17
2023-10-17T15:22:29.999678881
本日は晴天なり!
{"key":"t0921","name":"宇都宮","population":92145,"date_mod":"2022-11-04"}
 *** 終了 ***

BUILD SUCCESSFUL in 655ms
2 actionable tasks: 1 executed, 1 up-to-date
```
Google Colab上でdatasets.load_dataset()で.zstのデータをロードできない

# TL; DR

結論：ランタイムを再起動しましょう。

# 背景

[Hugging Face NLP Course 5章のビッグデータ処理](https://huggingface.co/learn/nlp-course/chapter5/4?fw=pt)部分を学習中に遭遇したエラー。

# 困ったこと

zstandardで圧縮されたデータを`load_dataset()`でロードしようとしたが、`ImportError`で`pip install zstandard`を実行してくださいと言われる。

が、実行しても同じエラーが出る。

```python
from datasets import load_datasets

data_files = "https://the-eye.eu/public/AI/training_data/code_clippy_data/code_clippy_dedup_data/train/data_1761_time1626321250_default.jsonl.zst"
pubmed_dataset = load_dataset('json', data_files=data_files, split="train")
```

```python
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-4-f85ab24d8195> in <cell line: 5>()
      3 # This takes a few minutes to run, so go grab a tea or coffee while you wait :)
      4 data_files = "https://the-eye.eu/public/AI/training_data/code_clippy_data/code_clippy_dedup_data/train/data_1761_time1626321250_default.jsonl.zst"
----> 5 pubmed_dataset = load_dataset('json', data_files=data_files, split="train")
      6 pubmed_dataset

14 frames
/usr/local/lib/python3.10/dist-packages/datasets/utils/extract.py in extract(input_path, output_path)
    223     def extract(input_path: Union[Path, str], output_path: Union[Path, str]) -> None:
    224         if not config.ZSTANDARD_AVAILABLE:
--> 225             raise ImportError("Please pip install zstandard")
    226         import zstandard as zstd
    227 

ImportError: Please pip install zstandard

---------------------------------------------------------------------------
NOTE: If your import is failing due to a missing package, you can
manually install dependencies using either !pip or !apt.

To view examples of installing some common dependencies, click the
"Open Examples" button below.
---------------------------------------------------------------------------
```

# 原因

- `pip install datasets` 
- `load_dataset()`
- `pip install zstandard`

の順で実行してしまうと、`load_dataset()`の後にzstandardをインストールしても直らない。

実行後はエラーメッセージ内の`config.ZSTANDARD_AVAILABLE`変数が書き換わらないと思われる。

# 解決策

ランタイムを再起動し、`load_dataset()`を実行する前に`zstandard`をインストールする。
gitでプッシュしたフォルダやファイルをコミットしないようにする方法

※gitignoreに書いていないフォルダやファイルを無視したい場合

※VSCodeの場合
①.gitignoreを作成して、リポジトリに保存する。
②.gitignoreをコミット、プッシュする。
③ターミナルを開き、リポジトリに移動する。
③以下のコマンドをターミナルで実行する。
```
git rm -r --cached .
git add .
git commit -m ".gitignore is now working"
```
④自動でコミットまでされているので、プッシュする。
⑤リモート側でフォルダやファイルがなくなっているか確認する。

**上記をやってもプッシュしたものがリモートから消えるわけではない。**
以下を実施することで、リモートのデータを削除することができる。
https://qiita.com/Tsh-43879562/items/e2397035da33f910c5b5

参考サイト
https://qiita.com/Potof_/items/c75eba9cfa72819506de
https://qiita.com/Tsh-43879562/items/e2397035da33f910c5b5
そもそも、Splunkとは何か

## Splunkとは
splunkは、様々なマシンからログを集める、**ソフトウェアツール**です。

ログデータを取得してテキスト化することで、可視化できるようになり、問題の切り分けや分析ができるようになります。
マシン例：セキュリティ機器(IPS/IDS、WAF、FW、UTM)、各種サーバー、ネットワーク機器、アプリケーション

検知アラート設定や、事前の予兆から以上発見するする機能、リスク顕在化した際の原因追跡する機能も備わっています。
セキュリティ運用やIT運用、ビジネス分析に活用ができます。

![Splunk構造図.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3501557/7e402e71-be45-7cfb-793f-960e494db3ce.jpeg)

#### ・セキュリティでの活用例①：
WEBサーバ等に検知(この時点では正常か不正か不明)が発生した場合、IDSやWAFのsplunkでセキュリティ機器ログの確認。
検知時間に対象IPアドレスが各セキュリティ機器に検知しているかを確認。
検知している場合、攻撃手法(シグネチャ)や脅威度を確認して、遮断するか否かの切り分けを行う。

#### ・セキュリティでの活用例②：
内部不正防止のために、社員使用ＰＣに作業に対する閾値を決めてアラート設定を行う。
例：一定時間内に閾値以上の印刷をする。一定時間内に閾値以上のスクショをする。
アラート検知時には、splunkで複数の対象ログ抽出を行い、不正判断の切り分けを行う。

## おまけ
splunkはSIEMというシステムの製品・サービスの1つです。

・SIEM（Security Information and Event Management）とは
⇒企業内に設置したセキュリティ機器やネットワーク機器のログを収集し、蓄積し、リアルタイムに分析を行うことで、未知の脅威や怪しいアクセスを検知するシステム。
　使用することで、幅広いマシンからマシンデータを収集、解析、分析を行い、脅威となりうるものに遮断ができ、高度なセキュリティ運用が可能。

他製品例；Datadog、McAfee SIEM、Logstorage
PubSubHubbub Hub `challenge mismatch` を解決

## 問題

youtube apiのpush notification、詳細は↓
https://developers.google.com/youtube/v3/guides/push_notifications

これのwebhookを実装した後、↓のページでsubscribeしようとすると
https://pubsubhubbub.appspot.com/subscribe
`challenge mismatch`とエラーが出ます。

## 解決

firebase cloud functionを利用しているが、node.jsのexpressでも通用すると思います。

```js
exports.youtubeWebhook = functions
    .region("asia-northeast1")
    .https.onRequest((req, res) => {
        // challengeに回答する。mismatchを解消
        if (req.query['hub.challenge']) {
            res.set('Content-Type', 'text/plain');
            res.status(200).send(req.query['hub.challenge']);
            return;
        }
        // ここからxmlを受け取って、ビジネスロジックを実行
        ...
    });
```
ACPI BIOS ErrorとACPI Error奮闘記 その2 (おまけ: hostnameの変更)

更新履歴
10/26 [回避方法(ACPIを恒久的にoffにする)](https://qiita.com/t_dragon/items/06f1397aa73d308f7fba#%E5%9B%9E%E9%81%BF%E6%96%B9%E6%B3%95acpi%E3%82%92%E6%81%92%E4%B9%85%E7%9A%84%E3%81%ABoff%E3%81%AB%E3%81%99%E3%82%8B)と[その後](https://qiita.com/t_dragon/items/06f1397aa73d308f7fba#%E3%81%9D%E3%81%AE%E5%BE%8C)を追加

# これまでの経緯

この記事はACPI BIOS ErrorとACPI Errorに対する奮闘記その2である。
その1は[こちら](https://qiita.com/t_dragon/items/5f6ec609c779ae6f9782)、その後[こちら](https://qiita.com/t_dragon/items/a61dd67c01cb72b579cd)でデフォルトのカーネルを変更し、[こちら](https://qiita.com/t_dragon/items/c38f8f6ceea23ed8bf15)でOSをAlmaLinuxに変更し、問題解決かと思われた。
しかし、私自身の異動に伴い計算機の引っ越しを行った結果、AlmaLinuxでもまたErrorが発生した。

結論を先に言うと、ACPIをoffにすることでErrorが出なくなった。

# エラーの内容

計算機の電源を入れ、カーネルを選択する画面でAlmaLinux 8.8 (Sapphire Caracal)を選ぶ。
するとしばらくしてエラー画面が出る。

このようなエラーである。
~~~
ACPI BIOS Error (bug): Failure creating named object [\_SB.INTS], AE_ALREADY_EXISTS
ACPI Error: AE_ALREADY_EXISTS, During name lookup/catalog
~~~

そしてそのまま黒い画面のまま動かなくなる。

# 回避方法(ACPIをoffにする)

参考にしたのは[こちら](http://ubuntuguide.net/turn-off-acpi-ubuntu-grub2)。
ACPIをoffにする。

カーネルを選択する画面でAlmaLinuxにカーソルを合わせた状態で、以下の指示通り'e'を入力。
~~~
Press 'e' to edit the selected item, or 'c' for a command prompt.
~~~

以下の行を編集する。
~~~
limux ...(中略)... acpi=strict
~~~

このように編集する。
~~~
limux ...(中略)... acpi=off
~~~

そしてCtrl + Xでstartする。

# 回避方法(ACPIを恒久的にoffにする)

[上記の方法](https://qiita.com/t_dragon/items/06f1397aa73d308f7fba#%E5%9B%9E%E9%81%BF%E6%96%B9%E6%B3%95acpi%E3%82%92off%E3%81%AB%E3%81%99%E3%82%8B)だと、一時的な編集にしかならない。
そこで、以下のように恒久的な変更を行う。

まずは、現在の設定の確認を行う。
~~~
$ sudo grubby --info=ALL
index=0
kernel=“/boot/vmlinuz-4.18.0-477.21.1.el8_8.x86_64”
args=“... acpi=strict ...”
...
~~~
ACPIはstrictになっている。
そこで、以下のように変更を加える。
~~~
$ sudo grubby --args=“acpi=off” --update-kernel /boot/vmlinuz-4.18.0-477.21.1.el8_8.x86_64
$ sudo grubby --info=ALL
index=0
kernel=“/boot/vmlinuz-4.18.0-477.21.1.el8_8.x86_64"
args=“... acpi=off”
~~~
これで変更が完了した。

# その後

ACPIは電源管理やハードウェアの構成管理をしている。
ACPIをoffにしたことで、コマンド入力でのrebootやshutdownができなくなった。
また、htopで見ることのできるスレッド数が半分になってしまった。
根本的な解決には程遠いが、とりあえず起動させることには成功したという状況である。

# おまけ: hostnameの変更

新しい所属先がDynamic DNSなので、計算機自体にhostnameをつける必要がある。
[こちら](https://www.server-world.info/query?os=AlmaLinux_9&p=hostname)を参考にする。

hostnameの確認は以下の通り。
~~~
$ hostname
(現在のhostnameが表示される)
~~~

hostnameの変更は以下の通り。
~~~
$ hostnamectl set-hostname hogehoge
~~~

そのあと計算機の再起動が必要かもしれない。
マルチチャンネルの波形をチャンネルごとのモノラル波形にする

# はじめに

[IEM Plug-in Suite](https://plugins.iem.at/)で立体音響とか試していて
マルチチャンネルの波形を扱えるのだけれど、
ゲームとかでオブジェクトオーディオのように扱いたいと思ったけど、
データをさらにバラバラのモノラルにして扱う必要がでてきて
DAWや波形エディタとかだと一つ一つ選んで設定を変えてとか
とても作業が大変なので、
スクリプトで簡単にできるようにしてみた

コードは以下のような感じ

```wav_channel_split.py 
import PySimpleGUI as sg
import subprocess

# 指定したファイルのチャンネルスプリット
def wav_channel_split():
    read_src_path = sg.popup_get_file('チャンネル分離をしたいファイルを選択してください。')

    print(read_src_path)

    #ffmpeg -i test.wav -map_channel 0.0.0 1.wav -map_channel 0.0.1 2.wav -map_channel 0.0.2 3.wav -map_channel 0.0.3 4.wav -map_channel 0.0.4 5.wav -map_channel 0.0.5 6.wav -map_channel 0.0.6 7.wav -map_channel 0.0.7 8.wav

    text = f"ffmpeg -i {read_src_path} "

    for ch in range(8):
        text +=f"-map_channel 0.0.{ch} {read_src_path[:-4]}_{ch+1}.wav "

    print(text)

    try:
        result = subprocess.run(text,
                                shell=True, check=True,
                                stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
        for line in result.stdout.splitlines():
            print('>>> ' + line)

    except subprocess.CalledProcessError:
        print('外部プログラムの実行に失敗しました {0}'.format(text))

wav_channel_split()
```
このコードはチャンネル数8chの波形をモノラル8本にするようなコードになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/ecfeec83-013e-0705-8936-ae8564744550.png)


## 情報元
https://stackoverflow.com/questions/51275725/how-do-you-separate-each-channel-of-a-two-channel-wav-file-into-two-different-fi

## 備忘録（あとがき）
wav波形フォーマットっていろいろあってうまく読めるライブラリの信頼度に依存する感じがしていて
librosaを最初頼ろうとしてみたところoutputが途中からサポートされなくなっていたようだった。

なんでも開いてくれるffmpegは強い感じがする。

で、ffmpegのpython版もあるけど、-map_channelの呼び方がわからず
今回は仕方ないのでsubprocess呼び出しにしてみたのだった。
ゴミ収集車の車体市場： 廃棄物発生量の増加と人口増加が促進：リサーチネスターによる分析 2023-2033

リサーチ・ネスターは次のタイトルのレポートを発表した "ごみ収集車の車体市場： 世界の需要分析と機会展望2033年"この調査レポートは、世界のゴミ収集車車体市場を製品タイプ別、用途別、地域別に詳細に調査・分析しています。
さらに、詳細な分析のために、市場の成長に関連する現在と将来の市場動向に関する詳細な議論とともに、業界の成長指標、阻害要因、需給リスクを網羅しています。
世界のゴミ収集車ボディ市場は、予測期間中、すなわち2023年から2033年にかけて、年平均成長率〜5％で成長すると予測されている。同市場は、用途別に家庭廃棄物と商業廃棄物に区分される。これらのセグメントのうち、商業廃棄物セグメントは、商業廃棄物の増加により、予測期間中に最大の市場シェアを獲得すると予想される。また、産業廃棄物の産業間での拡大も、今後数年間の同セグメントの成長を後押しすると予想されている。
世界のゴミ収集車車体市場は、世界的な固形廃棄物関連排出量の増加を背景に、2033年末までに80億米ドルの売上を獲得すると推定されている。ゴミ収集車ボディが提供する様々な機能は、埋立地、リサイクルセンター、中継所などの様々な処理施設への様々な種類の固形廃棄物の輸送を含み、今後数年間でこれらの車両の売上を押し上げると予測されている。さらに、電子廃棄物の増加や都市化の進展も、予測期間中の市場の成長を促進すると予測されている。
![Garbage-Truck-Bodies-Market-Size.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491677/a7b1d464-0743-d3df-4440-de612ee53b50.jpeg)

詳細レポートへのアクセスはこちら：
https://www.researchnester.jp/reports/garbage-truck-bodies-market/4473

地域的には、世界のゴミ収集車ボディ市場は、北米、ヨーロッパ、アジア太平洋地域、ラテンアメリカ、中東・アフリカ地域を含む5つの主要地域にセグメント化されている。このうち、アジア太平洋地域の市場は、同地域で発生する廃棄物の量が最も多いことから、予測期間中に最大の市場シェアを獲得すると推定される。これとは別に、北米市場は今後数年間で大きな成長を記録すると予測されている。
この調査はグローバルな性質を持ち、以下の国の市場に関する詳細な分析をカバーしている North America (U.S., Canada), Europe (U.K., Germany, France, Italy, Spain, Hungary, Belgium, Netherlands & Luxembourg, NORDIC [Finland, Sweden, Norway, Denmark], Poland, Turkey, Russia, Rest of Europe), Latin America (Brazil, Mexico, Argentina, Rest of Latin America), Asia-Pacific (China, India, Japan, South Korea, Indonesia, Singapore, Malaysia, Australia, New Zealand, Rest of Asia-Pacific), Middle East and Africa (Israel, GCC [Saudi Arabia, UAE, Bahrain, Kuwait, Qatar, Oman], North Africa, South Africa, Rest of Middle East and Africa) 。 さらに、市場規模、前年比成長率および機会分析、市場プレイヤーの競争調査、投資機会、将来の展望に対する需要などを含む分析も、調査報告書の中で取り上げられ、表示されている。

廃棄物発生量の増加が市場成長を牽引
2050年までに世界全体で30億トン以上の廃棄物が発生すると予測されている。
廃棄物管理の不備が気候変動、大気汚染、健康問題の原因となり、多くの生態系や生物種に直接影響を与えるため、廃棄物の増加は今後数年間で市場成長を加速させると予想される。さらに、人口増加やスマートシティ構想の高まりも、予測期間中の世界ゴミ収集車車体市場の成長を促進すると予想される。
しかし、発生する廃棄物の種類の特性の変化や厳しい規制の枠組みは、予測期間中、世界のゴミ収集車車体市場の成長に対する主要な抑制要因になると予想される。
本レポートはまた、以下の企業プロフィールを含む、世界のゴミ収集車車体市場の主要企業の既存の競争シナリオを提供します Dover Corporation, Changsha Zoomlion Heavy Industry Science &Technology Development Co., Ltd., Fulongma Group Co., Ltd., Boivin Evolution Inc., Oshkosh Corporation, Geeinknorba Group, Terberg RosRoca Group, Pak-Mor Ltd., Labrie Environmental Group, Bridgeport Manufacturing. プロファイリングでは、事業概要、製品・サービス、主要財務情報、最近のニュースや開発など、企業の重要な情報を掲載しています。全体として、当レポートは世界のゴミ収集車車体市場の詳細な概観を描いており、業界コンサルタント、機器メーカー、拡大機会を探している既存プレイヤー、可能性を探している新規プレイヤー、その他のステークホルダーが、現在進行中および今後予想されるトレンドに従って市場中心の戦略を調整するのに役立ちます。
レポートサンプル@を請求する
https://www.researchnester.jp/sample-request-4473

について Research Nester
Research Nesterは戦略的市場調査とコンサルティングのリーディング・サービス・プロバイダーです。業界、コングロマリット、エグゼクティブが将来のマーケティング戦略、事業拡大、投資などのために賢明な決断を下せるよう、偏りのない比類のない市場洞察と業界分析を提供することを目指しています。私たちは、戦略的思考を通じて適切なタイミングで適切なガイダンスを得ることができれば、あらゆるビジネスが新たな地平へと拡大できると信じています。私たちの既成概念にとらわれない思考は、お客様が将来の不確実性を回避するために賢明な決断を下すのに役立ちます。
【お問い合わせ先】
ナオミ コスギ
Eメール: info@researchnester.jp
米国の電話番号: +81 505 050 8480
連載：若手エンジニアのナラティブポエム (1)　～自己紹介 と 僕がPADを知ったきっかけ～

どうも
パナソニック アドバンストテクノロジー株式会社 (以後、PAD) の @nakamura_tatsuya です。

プロフィールにもある通り、社内で若手・ベテラン問わず類を見ないバイタリティを発揮しているらしい若手エンジニアです。ROSでロボット制御ソフトを開発したり、MATLAB/Simulinkでモデルベース開発をやったりしてます。

これまで当社の投稿内容としては技術系がメインでしたが、突然の毛色が違うタイトルでの投稿、失礼いたします。

<br>
<br>

元々、当社がQiitaを始めたきっかけとしては、[最初の記事]に記載の通り、少数精鋭の技術者集団という形で高い技術力を強みとし、維持しようと切磋琢磨している会社ですので、「その動機付けのために、社内だけでなく社外にも公開する場が欲しい！」というところからでした。

[最初の記事]: https://qiita.com/Takahashi_Saburo/items/0cf19044e8b23457293d

そんなところから始まったQiitaでの記事公開ですが、最近では、ありがたいことに **「Qiitaを見てPADを知りました！採用に応募してみました！」** と言ってくれる方が増えているそうです。

というわけで、投稿内容を見てPADが技術的に色々やっているのは分かったが、実際どんな会社なのか、どんな人が働いているの等が気になる人もいるかもしれませんので、若手代表として会社で過ごす中で想ったこと、感じたことを書いていこうというのが、この**若手エンジニアのナラティブポエム**になります。

<br>
<br>

僕の入社前～入社後、そして現在の日々を語っていこうと思いますので、連載期間は特に無し。
書きたいことがあれば書いていくスタイルで行こうと思います。

決意表明だけで終わるのもあれなので、今回は入社前のことについて少し書こうと思います。
それでは、皆様、レッツゴー(/・ω・)/

<br>
<br>

※ 当社について、なんか面白そうだな、ちょっと気になるな、お話聞いてみようかなと思ったアナタ。当社Webサイトからお気軽にお問い合わせください。([ここをクリック])
どんな内容であれ、**世の中にある沢山の会社の中から当社を見つけてくれて、興味を持ってくれたことが一番うれしい**ので、真摯に対応してくれると思います！

[ここをクリック]: https://adtsd.jpn.panasonic.com/contact/


# 僕がPADを知ったきっかけ

画像処理や深層学習等の機械学習に没頭していたM1の頃、「そろそろ就活始めんといかんな～」と思いながら、どこの会社が良いんだろうかと悩む日々。

僕：
「〇〇電機、〇立？、本体？研究所？ うーむ。。。」

この頃はパナソニックの「パ」の字も浮かんでいませんでした。
(東京の大学だったこともあり、本社が大阪のパナソニックはあまり調べていなかった)

とはいえ、こんな会社が良い！のイメージとして、**画像認識等のセンシング技術を用いた先進的な開発に携わりたい、主体性を持って働ける場所が良い**というのは漠然と考えていました。

<br>

そんなある日、当時学科の就職担当だった指導教員の教授から、

教授：
「さっきね、中村君に向いてそうな会社の人が来たよ」
「建機の自動化・自律化とか面白そうなことをやっていて、少数精鋭の技術者集団らしいよ」
「先進的な開発、少数精鋭というワードを聞いて中村君が一番に思い浮かんでさ、興味あるなら連絡しようと思うけど、どうする？」

と、言われました。
正直、僕はその時までPADという会社は知りませんでした。

しかし、なぜか教授から事業内容と会社の感じを聞いて、先進的な開発に携わりながら、主体性を持って働いている自分が想像できてしまいました。

「え！この会社めっちゃ合っとるやん！」と思った感覚、今でも覚えています。
「これが就活はお見合いと表現される所以か！」と思いながら、

僕：
「興味があるので、ぜひ連絡をお願いします」

と教授に伝えました。

<br>
<br>
<br>

そして、30分ぐらい経った後、、、

<br>
<br>
<br>

教授：
「来週、中村君に会いに大学に来てくれるってさ」
僕：
「えっ！？ 1人のためにわざわざ大阪から会いに来てくれるん！？」
「そんなことあるん！？」
「どうしよう！？準備せんといかん！！！」

<br>
<br>

急展開かつ、PADの熱量に驚く僕。
そして、次回：「A氏による大学訪問」に続く。

記念すべき連載第1回、読んでくれてありがとうございました。
Distributed Load Testing on AWS でIP固定してみた。

# 概要
Distributed Load Testing on AWS作って、NAT作って
グローバルIP固定してみた。

# Distributed Load Testing on AWS(DLT) とは
AWSでの分散負荷テストが行えるソリューション。
AWSが公開している実装ガイドCloudFormationテンプレートを使って、AWS上に簡単に負荷テスト実行環境を構築できる。
下記二つができる。
- 画面からAPIの情報を設定して実行
- jmeterのシナリオをアップロードして実行

Taurusを利用した負荷テスト実行環境である。
zipファイルに固めれば、Jmeterのライブラリ、csv使った外部ファイルなども含めて実行することができる。

# 構築
DLTの実行
[これ](https://aws.amazon.com/jp/solutions/implementations/distributed-load-testing-on-aws/)
に従って、distributed-load-testing-on-aws.templateのCoudFomationテンプレートを使って、環境構築

VPC自体の条件がない場合、そのまま作成する。
VPCのIPの範囲等が設定可能である。
AWSに対して、匿名の統計情報を送る、送らないのパラメータもあるので、変更する。

CloudFomationの画面からスタックを作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277626/9c2a81a2-f089-1871-9843-c544059aa015.png)

スタック名と、初回アクセス用の管理者アカウントを入力する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277626/c72a141f-6b02-1b2e-4eea-9f86484ee399.png)

そのまま次へ、次へと押して環境作成

# IP固定してみた
いろいろと後から、追加して固定してみた

## サブネット追加
nat配置用のサブネットを追加
VPCを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277626/022238d0-6f17-a3a4-0d23-c17490630740.png)

CIDRは少な目でいいので[192.168.32.0/24] 
 一応後から増やせる程度に少し余裕を持たせる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277626/318e965b-04aa-3628-0963-6c5971385c84.png)

## NATgateway作成
追加したサブネット上にNATGatewayを作成し、外部への経路となるように設定する。
- サブネットの選択（先ほど作成したもの
- 接続タイプパブリック
- ElasticIPの割り当て

を実施し、固定したパブリックIPでNAT-gatewayが外部通信を行えるようにする。
※ElasticIPの数が足りない場合は、AWSに申請して、割り当て可能数を増やしてもらう必要がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277626/034ecf9e-acbc-eb30-af07-2a611ec669c2.png)


## ルートテーブル追加
サブネットから外に出るときNAT経由となるように作成
ECS(DLTの動く場所)→nat→igwの経路を作るために、nat→igwのルートテーブルを作成し
作成したサブネットを関連付ける


# 既存ルートテーブル変更
デフォルトで、ECSが0.0.0.0の外部へ出る際の経路を直接igwを指しているため、
0.0.0.0が作成したNATGatewayとなるように変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277626/624e805d-dfda-edac-a633-a25764803f1a.png)


# まとめ
備忘録として、DLTのIP固定をメモって見た。

今回作成する負荷テスト実行環境は、想定リクエスト数がそこまで高くないため、nat-gatewayを一つ、Subnetもまとめているが、本来分散してnat-gatewayを使えるようにazも分けてsubnetを配置するものだと思う。
プログラムを一般の人に説明するには料理に例えるとわかりやすい

# プログラム（プログラミング）って何と聞かれたら？
「プログラム（プログラミング）」って何？　と聞かれたら何と説明しますか？

私はいつも料理に例えることにしています。

つまり

プログラム → レシピ
プログラマ → レシピを書く人
プログラミング → レシピを書くこと
プログラミング言語 →　レシピの記載方法（言語）
コンピュータ　→ レシピ通りに料理を作ってくれるシェフ

となるわけです。

## プログラムを実行するとは？
プログラム（レシピ）をコンピュータ（シェフ）に渡して料理を作ってもらうことです。

ちゃんと正しくプログラムを書けば、コンピュータが美味しい料理を作ってくれます。
材料や分量を間違ったり順番を間違ったりすると、不味かったり、黒焦げになったり、生焼けになったり、そもそも得体のしれない何かになっちゃうわけですね。

また、レシピもシェフが理解できる言葉で書かなければいけません。レシピの書き方を間違うとシェフはこんなレシピはわからない。とさじを投げちゃいます。

## プログラミングの難しさ
レシピの書き方自体はパターン化されているのでそう難しいものではありません。
本当の難しさはプログラマ（レシピを書く人）の意図通りを正しくシェフに伝えることにあります。

なにせこのシェフは融通がきかず、レシピの内容を忠実に一切の忖度なしに実行しようとします。
普通のレシピで多用されるような「適宜」とか「お好みで」といった曖昧な指定は一切受け付けてもらえません。

塩なら0.8gとか、胡椒なら1.3gとか、気温が何度だったら0.1g追加するとか、焼き加減についても「様子を見ながら」みたいな指定も受け付けてもらえません。
野菜や肉を「一口大に切る」といった曖昧な表現も駄目です。ちゃんと最大5cmに収まり、重さは25g以上30g以下のような指定をする必要があります。

レシピの書き方を間違うと、シェフは正しく間違ってくれます。全てはレシピを書いたあなたの責任です。
ここがプログラミングの難しさの最大のポイントであり、プログラミングの面白さでもあるのです。

## ライブラリはなんとかの素や調理器具である
プログラミングに欠かせないのはライブラリです。

カレーのレシピを書くにしても、カレールー（粉）のレシピを書くのが面倒な場合は、出来合いのカレールー（粉）を使うことがよくあるでしょう。具材だってカレー用野菜セットを使うことも多いはずです。
野菜の皮を剥くのにピーラーを使ったり、煮るためには鍋が必要でしょう。

こういった、なんとかの素や調理器具はライブラリと呼ばれます。

## プログラムはライブラリの塊でできている
プログラミングは普通の料理以上に、誰かが作ってくれたライブラリの塊でできています。
画面に点1つを表示するのにだって、ディスクから1バイトのデータを読み込むのだって、ネットに1バイトのデータを送信するのだって、キーボードから1文字の入力を受け付けるのだって膨大なライブラリが必要なのです。

プログラミングの7割は適切なライブラリを探すこと、そのライブラリを正しく利用することです。
1から全てを作ろうとしたら10年たってもレシピは完成できません。使えるライブラリは最大限利用する必要があります。

## プログラミングの勉強の難しさとは
ライブラリの知識が不足していると、いくらプログラミング言語を勉強しても、実際の業務になると全く歯が立ちません。プログラマを目指す人の多くはここで躓くのです。

しかもライブラリは一度覚えればそれでOKということはありません。ライブラリには流行り廃りがあるからです。
特にJavaScriptはその勢いが激しく、つい最近までVueが全盛だったと思ったら、今はReactに置き換えられていこうとしています。そのReactも数年後には新しいライブラリに置き換わっていくと思います。
PostgreSQL fsyncとsynchronous_commit

- fsync
    - postgresql.conf（またはpostgresのコマンドラインオプション）で設定
    - offにするとDBクラッシュ時に回復不可能なデータ破壊になるリスクがある。[ユニットテスト用のDBなど、壊れてもいいから高速化したい場合に利用すると良い](https://stackoverflow.com/a/9407940/5209556)。
- synchronous_commit
    - セッションごと、トランザクションごとに設定可能
    - offにすると、fsyncは行うがその完了を待たずにクライアントに成功を返す。DBクラッシュ時にデータが壊れることはないが、コミットしたはずの変更が失われるリスクがある。本番でoffにすることも十分見合うトレードオフ。
    - 有効な値は何種類かある: remote_apply、on(デフォルト)、remote_write、local、off

`set synchronous_commit = 'off'` にして単純なINSERT文を試してみたところ、0.8msくらい短縮できた。

```
postgres=# insert into users (name, start_date, end_date) values ('hoge', '2023-10-01', '2023-10-02');
INSERT 0 1
時間: 1.351 ミリ秒

postgres=# set synchronous_commit = 'off';
SET
時間: 0.700 ミリ秒

postgres=# insert into users (name, start_date, end_date) values ('hoge', '2023-10-01', '2023-10-02');
時間: 0.526 ミリ秒
```

公式ドキュメントの記述はやや分かりづらいが、内部的な動作は[COMMITについて少し考えてみた(3)](https://kojishinkubo.blogspot.com/2019/12/commit3.html
)の通りらしい。

https://www.postgresql.jp/docs/15/runtime-config-wal.html

https://kojishinkubo.blogspot.com/2019/12/commit3.html
Wordpressのブログ記事を、特定のタグが設定されている記事だけ4件取得して表示したい

# 表示させたい固定ページのphpファイルを開いて編集
以下のコードをタグ名、取得件数や表示させるときのHTML構造を変更して貼り付けるだけです。

```php
<?php
    $tag = '取得したいタグ名'; // タグのスラッグを指定
    $args = array(
        'post_type' => 'post', // 投稿タイプを指定
        'tag' => $tag, // タグを指定
        'posts_per_page' => 4, // 取得する記事数を指定
    );

    $query = new WP_Query($args);

    if ($query->have_posts()) :
        while ($query->have_posts()) : $query->the_post();
            // ここに記事を表示するためのコードを追加
            ?>
            <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
                <header class="entry-header">
                    <h2 class="entry-title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
                </header>
                <div class="entry-content">
                    <?php the_excerpt(); ?>
                </div>
            </article>
            <?php
        endwhile;
        wp_reset_postdata();
    else :
        // 記事が見つからない場合の表示
        echo '該当する記事はありません。';
    endif;
?>
```
Wordpressのブログ記事につけるタグを、人気順(view数順)に表示させたい

# プラグインWP-PostViewsを入れる
デフォルトではWordpressはタグの閲覧数を集計していないので、プラグインを入れてタグごとの閲覧数を集計する機能を追加します。

[https://ja.wordpress.org/plugins/wp-postviews/](https://ja.wordpress.org/plugins/wp-postviews/)


# カスタム関数をfunction.phpに定義する

全件取得することもないと思うので、上位5件のみ取得する様にしてみます。

```function.php
function get_tags_view_count() {
    $tags = get_tags();
    $tag_counts = array();

    foreach ($tags as $tag) {
        $args = array(
            'tag_id' => $tag->term_id,
            'posts_per_page' => -1
        );

        $query = new WP_Query($args);
        $count = 0;

        if ($query->have_posts()) : while ($query->have_posts()) : $query->the_post();
            $post_id = get_the_ID();
            $count += (int) get_post_meta($post_id, 'views', true);
        endwhile; endif;

        $tag_counts[$tag->name] = $count;
        wp_reset_postdata();
    }

    arsort($tag_counts);
    return array_slice($tag_counts, 0, 5, true); // 上位5件のみを返す
}
```

# 実際に表示するページでカスタム関数を呼び出す

```php
<?php
$tag_counts = get_tags_view_count();
echo '<ul>';
foreach ($tag_counts as $tag_name => $count) {
    $tag_obj = get_term_by('name', $tag_name, 'post_tag');  // タグ名からタグオブジェクトを取得
    $tag_link = get_tag_link($tag_obj->term_id);            // タグのリンクURLを取得
    echo '<li><a href="' . esc_url($tag_link) . '">' . esc_html($tag_name) . '</a></li>';
}
echo '</ul>';
?>
```
git-rebaseとmergeとの違い

git rebase とは、作業が完了したブランチを分岐元のブランチにくっつける。

**rebaseの場合のコマンド例**
* git checkout 分岐先のブランチ1
* git rebase master
* git checkout 分岐先のブランチ2
* git rebase master

**merge の場合のコマンド例**
* git checkout master
* git merge 分岐先のブランチ1
* git merge 分岐先のブランチ2

**参考サイト**
https://blog.codecamp.jp/git_rebase
LLMのトレーニングでよく調整するパラメータについて

私がよく調整するパラメータを共有します。

1.トレーニング時のパラメータ:
max_seq_length = xxxx：1回で読み込むtokenの数。（tokenは文字数を計算する単位、7500個英語の単語は10000tokenに相当）
max_new_tokens=xxx：1回で生成するtokenの数。
batch size=X：1回のイテレーションで処理するサンプルの数。
num_train_epochs=X：データセットの学習回数。（1epochは1回）
learning_rate=2e-4：学習率。値が大きいと学習は早くなるが、情報を失うリスクも高い。おすすめ範囲は1e-4から5e-5。
lr_scheduler_type='constant'：学習率を自動調整するスケジューラ。より精度求める場合loss見て自分で書く
save_strategy="epoch"：モデルを保存する頻度。epochごとや、ステップごとなどが選べる。
iter time：1回のイテレーションにかかる時間。
sample/sec：1秒間で処理できるサンプルの数。
trainloss：モデルの出力と正解との誤差。(小さいほど性能が高いを示すが、過学習にも注意が必要。大事なのはlossの安定性）


2.モデルの出力時のパラメータ:
1.return_source_documents=True:LLMの回答根拠を出すこと
2.do_sample=True:ランダムサンプリング。（trueにすると回答がより創造性がある。chatgptみたいなチャットボットは多分True）
2-2.temperature=X：ランダムサンプリングの強さを調整（0に近づけば近いほど回答が安定、1か１以上の場合は創造性が高い）
3.num_beams=X：安定回答求める場合使う（可能性が一番高いX個のtokenを使うために、正確さ重視するモデルならこれにする。do_sample=Falseにしないと動作できない)
4.repetition_penalty＝X：重複ペナルティ（1以上だと重複しないようにモデルを調整する。１以下の場合は重複の結果が出てくる。おすすめは:1.1-1.5）
5. word2vec_db（embeddingの計算に使用されるvectorstore。計算速度は遅いが、ノイズに対して強く、多くの情報を保存することができる。）
5-2.chroma_db（embedding計算用vectorstore、計算スピードが速いですが、ノイズに対して弱い）
SpringBootで、CSVを読み込んでList<String>に変換する

# 環境
| 名称 | バージョン |
|:-:|:-:|
| Spring Boot | 3.1.4 |
| opencsv | 5.8 |

# 問題
SpringBoot環境下でアップロードされたCSVファイル＠MultipartFileを、サーバーにファイルを置かずにリストに変換するのに右往左往してしまったので覚え書き。

～条件～
・CSVの文字コードはUTF-16
・区切り文字はタブ文字
・改行文字が入っててもサクッと解決

# 解決方法
```sampleService.java
  public List<String[]> csvToList(MultipartFile file) {
    // CSVをListに変換
    Reader reader = new InputStreamReader(file.getInputStream(), "UTF_16");
    CSVParser parser = new CSVParserBuilder().withSeparator('\t').build();
    CSVReader csvReader = new CSVReaderBuilder(reader).withCSVParser(parser).build();
    List<String[]> taskList = csvReader.readAll();
  }
```
# 参考

https://qiita.com/T-H9703EnAc/items/0cbb28935ca7a7e30d9c

https://yh9092.hatenablog.com/entry/2018/08/03/113844

https://stackoverflow.com/questions/51565799/how-to-give-multipartfile-to-reader-in-java
Permission denied (publickey,gssapi-keyex,gssapi-with-mic). の別解法

`git clone`をしようとしたら、なにやらエラー出てこけた。

```shell
user@ubuntu:/path/to/projects$ git clone ssh://user@{ipaddr}:{port}/path/to/hoge.git
fatal: could not create work tree dir 'hoge': Permission denied
```

このエラー文の時点で気付くべきだったが、
「よくある秘密鍵の問題か？とりあえず`sudo`も試しておこう。」とか考えて
```shell
user@ubuntu:/path/to/projects$ sudo git clone ssh://user@{ipaddr}:{port}/path/to/hoge.git
Cloning into 'hoge'...
user@{ipaddr}: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

本格的に秘密鍵のエラーが吐き出された。
しかし鍵は作って登録したばかりだし、`~/.ssh/config`でも問題なく接続できる。
しばらく沼った……。

## 接続元のディレクトリの所有者が違った

`user`アカウントにて操作を行っていたが、cloneしたレポジトリを置こうとしてるディレクトリ（カレントディレクトリ）のユーザーが`root`になっていた。

```shell
user@ubuntu:/path/to/projects$ ls -la
total 16
drwxr-xr-x   4 root root 4096 Oct 16 16:08 ./ # <= ここ
drwxr-xr-x 134 root root 4096 Oct 17 11:07 ../
```

```shell
# cloneしたレポジトリを置きたいディレクトリの所有者を変更する
user@ubuntu:/path/to/projects$ chown user. ./

user@ubuntu:/path/to/projects$ ls -la
total 16
drwxr-xr-x   4 user user 4096 Oct 16 16:08 ./
drwxr-xr-x 134 root root 4096 Oct 17 11:07 ../
```

cloneに成功
```shell
user@ubuntu:/path/to/proijects$ git clone ssh://user@{ipaddr}:{port}/path/to/hoge.git
Cloning into 'hoge'...
remote: Enumerating objects: 2495, done.
remote: Counting objects: 100% (2495/2495), done.
remote: Compressing objects: 100% (1963/1963), done.
remote: Total 2495 (delta 836), reused 1923 (delta 460), pack-reused 0
Receiving objects: 100% (2495/2495), 43.19 MiB | 6.08 MiB/s, done.
Resolving deltas: 100% (836/836), done.
```

問題はsudoでも秘密鍵でもなかった。

めっちゃ初歩的なミス……
インストール失敗したubuntu OSを再インストールする方法

##起動時
ubuntu OSの入ったusbをpcに挿しながらpcを起動し、起動時にF2またはdelキーを押してBIOSのセットアップ画面に移動する。起動タブに移動して起動順位でusbを1番にして保存し、そのまま再起動することでtry or install ubuntuが表示されて再インストールが始まる。
Kaggleで磨く機械学習の実践力を読んでみて


## 概要

Kaggleを通してデータ分析の基本的な進め方を学べる。
俗にいわれるkaggle本よりも初心者向け。Kaggleコンペの流れを理解できる。

### 対象者
・データ分析初級者
・Kaggleに興味を持っている人
・データサイエンティスト脱初心者を目指す人
Pythonや機械学習の基礎的なことを他の教材を学び、Kaggleに挑戦する前に読むと具合がよさそうな本だと感じました。
まさに今の私が読む本でした。感謝。

### 前提知識
・Python(この本で基礎文法などの説明は少ない、ほぼないかも)
・中学レベルの数学(と、本には書いてあるが実際はこの本を進めるだけならまぁ...)


## この本の良かったところ
### kaggleの説明
英語という言語の壁があるのでとっつきにくさがあるKaggleですが、画像付きでコンペのページの見方を説明してくれます。どこを見ればいいかわかるのでとてもありがたいです。
また初級者が選びやすいコンペの特徴などを挙げてくれているのでよい。

この辺はネットで調べてみると他の人の視点の初級者向けのKaggleの使い方の説明があるので、そちらも流し見するとより効果的だと感じました。カレーちゃんさんのKaggleのチュートリアルなどおすすめです。


### その先の実務を見ている
本文中しきりに書いてあるのが実務からの視点。
Kaggleのコンペでできることは実務におけるほんの一部。しかしその一部はとても重要なもの。コンペで学べるそのほんの一部、コンペ以外で学べる点、どちらもがデータサイエンティストにおいて重要であるということが再三言われています。
またデータコンペと実務の違い(実務ではここはもっとうんたら～)など実務についたときに役立ちそうだなと。

### ベースラインの作成
機械学習のデータ分析を少し勉強をしていて全く触れてこなかった知識「ベースライン」。
分析の骨格を最初に決めて推論まで行い、そこに肉付けをしていくというもの。このベースラインの作り方が大事なんだろうなと思わせるくらいにはしっかりとベースラインの作成に関して書いてあります。データコンペだけでなく実務においても役立ちそうだと思いました。

他にはLightGBMというなかなかにつよいやつも知りました。かなり便利らしい。

## つまずいたところ
バージョンの違いなどでつまずいたところを挙げておきます。
### early_stopping
```python
#モデルの宣言
model = lgb.LGBMClassifier(**params)

#モデルの学習(自分なりに修正)
model.fit(X_tr, y_tr,
            eval_set=[(X_tr, y_tr),(X_val, y_val)], 
            callbacks=
            [lgb.early_stopping(stopping_rounds=100,verbose=True),lgb.log_evaluation(100)])
#モデルの学習(本での記述)
model.fit(X_tr, y_tr, 
            eval_set=[(X_tr,y_tr),(X_val,y_val)], 
            callbacks=[
            lgb.early_stopping(stopping_rounds=100,verbose=100)]
```
本のPythonのバージョンは3.7。私の環境は3.10なので少し違いがありました。

### pandas_profiling
```python
#モデルの学習(自分なりに修正)
import ydata_profiling as ydp
#モデルの学習(本での記述)
import pandas_profiling as pdp
```
出版された後に名称の変更があったようです。

### import mlb
```python
import mlb

env = mlb.make_env()
ite_test = env.iter_test()
```
8章MLBの回帰問題。推論スクリプトを提出するコンペの使用上KaggleNotebookを使うそうです。おそらくmlbファイルを使って仮想環境?を作って何かすると思うのですが、現状の私にはよくわかっていません。
Python3.7だとうまく動くそうなのですが3.8以降だとうまく動作しないというのをDiscussionで見つけました。KaggleNotebookのPythonのバージョンを変えるのは調べてもよくわからなかったのでうまくいかず。
jupyterなどを使ってうまくやれそうなのかもわからず。何か解決策があればよかったのですがね。

## さいごに
本のまとめ?感想?はむずかしく感じました。内容を載せすぎてもいけず、語らずすぎてもいけず。
この本を読む前の私のような、Kaggle入門の前の段階である人になんとなくこの本の良さが伝わればいいと思います。
Kaggleたのしんでこー。
[macOS] VSCodeでマクロを有効にしてC/C++のソースコードの#ifdefの中をアクティブにする

# VSCodeのIntelisenseを設定してVSCodeでマクロを有効にする

## 環境
- macOS
- VSCode
  - 拡張機能：　C/C++　(Extension Pack)
- llvm/clang

## 手順

以下の手順で設定ファイル（`c_cpp_properties.json`）を開き、編集する。
- Cmd+Shift+P、C/C++: 構成の編集（JSON)を選択する。
- `defines`に有効にしたいマクロを追加する。
  - 例えば、`__cplusplus`とか。
- `#ifdef`内も評価されるようになる。

例（全体）：
```
{
    "configurations": [
        {
            "name": "Mac",
            "includePath": [
                "${workspaceFolder}/**",                
            ],
            "defines": [
                "__cplusplus",
            ],
            "macFrameworkPath": [
                "/Library/Developer/CommandLineTools/SDKs/MacOSX12.sdk/System/Library/Frameworks"
            ],
            "compilerPath": "/usr/local/opt/llvm@11/bin/clang",
            "cStandard": "c17",
            "cppStandard": "c++11",
            "intelliSenseMode": "macos-clang-x64"
        }
    ],
    "version": 4
}
```


## Note
他にも、見た目だけアクティブにするのであればIntellisenseの該当の機能をOffにする方法がある。
[こちら](https://stackoverflow.com/questions/75319710/how-can-i-disable-grey-color-of-code-inside-ifdef-in-vs-code)

ただ個人的にはIntellisenseにビルドエラーなどを検出して欲しいので適切に環境設定をするのが好み。

## 参考
https://stackoverflow.com/questions/46415076/how-can-i-define-macros-for-the-c-intellisense-engine
WithViewStoreに 2 つ以上のstateをobserveする方法

## 概要
TCAを使って画面遷移以外のstateを監視したくないが
画面遷移の処理を複数のstateによって制御したい
そんな場合にどのように解決すればいいのかを調べました。
結論として、WithViewStoreのobserveにViewStateを渡してあげればいいようです。

そもそも、observeってどんな時に使うの？ って方は
僕の説明よりもわかりやすい記事がありますので、以下を御覧ください。
https://zenn.dev/kalupas226/articles/c4128a0f99d07b


### 実装

    let store: StoreOf<Test>

    private struct ViewState: Equatable {
        let selectedTab: Tab
        var count: Int
    
        init(state: Test.State) {
            selectedTab = state.selectedTab
            _showsSearchView = state.$count
        }
    }

    var body: some View {
            WithViewStore(store, observe: ViewState.init) { viewStore in
    // ...

### BindingState を使用する方法

    let store: StoreOf<Test>

    private struct ViewState: Equatable {
        let selectedTab: Tab
        @BindingViewState var count: Int
    
        init(state: BindingViewStore<Test.State>) {
            selectedTab = state.selectedTab
            _showsSearchView = state.$count
        }
    }

    var body: some View {
            WithViewStore(store, observe: ViewState.init) { viewStore in
    // ...

## 参考
https://github.com/pointfreeco/swift-composable-architecture/blob/a611f141dd1b6249941bcca6689eadce12be0c21/Examples/Todos/Todos/Todos.swift
【Django】テーブル名にアプリの名前をつけない

# はじめに
Djangoのmodels.pyをmigratしてDBにテーブルを作成した場合、テーブル名の頭にアプリの名前がついてしまいます。
appという名前でアプリを作成し、```python manage.py startapp app```
以下のようなmodels.pyを作ったとすると
```python:models.py
class Reporter(models.Model):
    full_name = models.CharField(max_length=70)
```
テーブル名は```app_reporter```になります。
（↓DBを直接確認してみるとテーブル名称が確認できます。）
```terminal
postgres-# \dt
                   List of relations
 Schema |            Name            | Type  |  Owner
--------+----------------------------+-------+----------
 public | app_reporter               | table | postgres
 public | auth_group                 | table | postgres
 public | auth_group_permissions     | table | postgres
 public | auth_permission            | table | postgres
 public | auth_user                  | table | postgres
 public | auth_user_groups           | table | postgres
 public | auth_user_user_permissions | table | postgres
 public | django_admin_log           | table | postgres
 public | django_content_type        | table | postgres
 public | django_migrations          | table | postgres
 public | django_session             | table | postgres
(11 rows)
```

テーブル名にいちいちアプリ名がつくのは後々面倒なため、アプリ名を消す方法を調べた結果を残します。

# 環境
- Django==4.2.6
- DB postgres

# 手順
models.pyで該当のMetaクラスに```db_table = 'テーブル名'```と追記します。
```python:models.py
class Reporter(models.Model):
    full_name = models.CharField(max_length=70)

    def __str__(self):
        return self.full_name
    
    class Meta:
        db_table = 'Reporter'
```
指定したテーブル名称に変更されました。
```terminal
 Schema |            Name            | Type  |  Owner
--------+----------------------------+-------+----------
 public | Reporter                   | table | postgres
```

# おわりに
メンテナンスするときのために、わかりやすいテーブル名称にしたいです。
【Flutter】初心者でもできる！背景をグラデーションにしてオシャレな画面を作ろう

こんにちは。
今回は、背景をグラデーションにする方法を紹介します。
オシャレな画面を作ってみましょう:blush:

# 方法
![スクリーンショット 2023-08-13 20.18.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524120/ce57fee2-1687-ea40-8538-b4c8b9db94e0.png)
画面の背景色をグラデーションにするには、Containerを使います。
まず、Scaffoldの引数「backgroundColor」にColors.transparentを指定します。
次に、ScaffoldをContainerでラップします。
そして、Containerの引数「decoraiton」にBoxDecorationを指定します。
BoxDecorationの引数「gradient」にGradientのクラスを指定します。

:::note warn
Gradientのクラスには、次の３つがあります。
- LinearGradient : 直線上グラデーション
- RadialGradient : 放射状グラデーション
- SweepGradient : 環状グラデーション
:::




# 使用例
```dart
import 'package:flutter/material.dart';

void main() {
  runApp(const MaterialApp(home: MainApp()));
}

class MainApp extends StatefulWidget {
  const MainApp({super.key});

  @override
  State<MainApp> createState() => _MainAppState();
}

class _MainAppState extends State<MainApp> {
  @override
  Widget build(BuildContext context) {
    return Container(
      decoration: const BoxDecoration(
        gradient: LinearGradient(
          colors: [
            Colors.blue,
            Colors.green,
            Colors.red,
          ],
          begin: Alignment.topCenter,
          end: Alignment.bottomCenter,
        ),
      ),
      child: const Scaffold(
        backgroundColor: Colors.transparent,
        body: Center(child: Text("カラフル♡")),
      ),
    );
  }
}
```

# 実行例


![スクリーンショット 2023-10-17 11.17.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524120/418c0c60-d71c-5dce-dd50-8f1529ac5237.png)
Account Engagementオプトアウト済み項目の同期設定



2023 年 7 月 20 日更新: プロスペクトの [オプトアウト済み] 項目の新しい同期オプションがリリースされました。お客様は 2023 年 11 月 15 日までに、同期動作をサポートされているオプションのいずれかに変更してください。

+ [Account Engagement のオプトアウト同期動作の変更に関する通知](https://help.salesforce.com/s/articleView?id=000391838&type=1)

+ [Account Engagementオプトアウト済み項目の同期設定について](https://sf.forum.circlace.com/articles/927299943947833344)
Kotlin: 日付の取り扱い

## プログラム

```kt:ex01.kt
// ------------------------------------------------------------------
/*
	ex01.kt

						Oct/17/2023
*/
// ------------------------------------------------------------------
import java.time.format.DateTimeFormatter
import java.time.LocalDateTime
import java.time.LocalDate

data class Data(
	val key: String,
	val name: String,
	val population:Int,
	val date_mod:LocalDate)

// ------------------------------------------------------------------
fun output_proc(data_in: Data) {
	print(data_in.key)
	print("\t" + data_in.name)
	print("\t" + data_in.population)
	println("\t" + data_in.date_mod)
}

// ------------------------------------------------------------------
fun main() {
	System.err.println("*** 開始 ***")
	println(LocalDateTime.now())

	val date1: String = "2022-11-04"
 
	val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")
	val testDate: LocalDate = LocalDate.parse(date1, formatter)
	println("testDate ： " + testDate)
	println("testDate ： $testDate")

	val datax = Data("t0921", "太郎",92145,testDate)
	output_proc(datax)

	val datay = Data("t0922", "次郎",27184,
		LocalDate.parse("2011-08-24",formatter))
	output_proc(datay)

	System.err.println("*** 終了 ***")
}

// ------------------------------------------------------------------
```

## コンパイル

```text:Makefile
ex01: ex01.kt
	kotlinc ex01.kt -include-runtime -d ex01.jar
clean:
	rm -f ex01.jar
```

```bash
make
```

## 実行

```bash
java -jar ex01.jar
```

実行結果

```text
$ java -jar ex01.jar
*** 開始 ***
2023-10-17T10:59:39.218590807
testDate ： 2022-11-04
testDate ： 2022-11-04
t0921	太郎	92145	2022-11-04
t0922	次郎	27184	2011-08-24
*** 終了 ***
```
Javaサーブレットでリクエストパラメーターを取得する方法

# Javaサーブレットでリクエストパラメーターを取得する方法＃覚書

1. **HttpServletRequestを使用する方法:**
HttpServletRequestオブジェクトを使用してリクエストパラメーターを取得します。このオブジェクトはサーブレットのdoGet()またはdoPost()メソッドの引数として提供されます。
    
    ```java
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class YourServlet extends HttpServlet {
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            String parameterValue = request.getParameter("parameterName");
            // parameterValueにはリクエストパラメーターの値が格納されます
        }
    }
    ```
    
    リクエストパラメーターは、URLにクエリ文字列として渡されるため、例えば**`http://example.com/servlet-path?parameterName=parameterValue`**といった形で渡されます。
    
2. **リクエストパラメーターが複数ある場合の取得方法:**
リクエストパラメーターが複数ある場合、**`request.getParameter()`**メソッドは配列として取得されます。
    
    ```java
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class YourServlet extends HttpServlet {
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            String[] parameterValues = request.getParameterValues("parameterName");
            // parameterValuesにはリクエストパラメーターの値が配列として格納されます
        }
    }
    ```
    
    このようにして、リクエストパラメーターを取得し、必要に応じて処理することができます。
    

注意: リクエストパラメーターは常に文字列として取得されるため、適宜変換（数値へのパースなど）が必要な場合があります。また、リクエストパラメーターが存在しない場合はnullが返されるため、適切なエラーハンドリングを行う必要があります。

**リクエストパラメーターのエンコーディング:**
リクエストパラメーターの値は通常、URLエンコードされて送信されます。サーブレットコンテナはこれらの値をデコードして提供します。このデコードは通常UTF-8で行われますが、場合によっては異なるエンコーディングが使われることもあります。リクエストパラメーターの値を取得する際には、適切なエンコーディングを指定して取得することが重要です。


```java
    String parameterValue = request.getParameter("parameterName");
    if (parameterValue != null) {
        // リクエストパラメーターの値をUTF-8でデコード
        parameterValue = new String(parameterValue.getBytes("ISO-8859-1"), "UTF-8");
    }
```
    
2. **リクエストパラメーターのマルチバイト文字対応:**
リクエストパラメーターがマルチバイト文字を含む場合、正しく取得するためには適切なエンコーディングを指定することが重要です。リクエストパラメーターの値が日本語などのマルチバイト文字を含む場合、UTF-8エンコーディングを使用するのが一般的だそうです。
3. 
    
    ```java
    String parameterValue = request.getParameter("parameterName");
    if (parameterValue != null) {
        // リクエストパラメーターの値をUTF-8でデコード
        parameterValue = new String(parameterValue.getBytes("ISO-8859-1"), "UTF-8");
    }
    
    ```
    

これらの手法を使用して、Javaサーブレットでリクエストパラメーターを正しく取得し、適切に処理することができます。
The binding type(s) 'cosmosDB' were not found in the configured extension bundle.

# 事象
CosmosDBの出力バインドを使おうとしたら、こんなエラーが出ました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3242301/87eae089-e24b-f05d-0e9f-b4889301fc97.png)

# 解決方法

デフォルトで作成される、host.jsonを変えたら通るようになりました。
変更前）"version": "[4.\*, 5.0.0)"
変更後）"version": "[4.\*, 4.1.0)"
（なんでだろう。。。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3242301/20332142-980b-cfda-89a7-169c57027f68.png)

通るようになっている。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3242301/dc84ccac-a090-d6cf-46be-231a9512f093.png)

ちなみに、"version": "[3.*, 4.0.0)"はCosmosDBへの接続が変わっているようでダメでした。
TypeScriptのMapを整理してみた

## 今回のゴール

Mapとは？を整理して理解する。ふつうのオブジェクトと違う点も列挙。また、使用するにあたっての考慮、あるいは検討する性質について

## Mapの性質

Mapは連想配列として認識するとイメージしやすい。ただのオブジェクトより自由度が高い連想配列といえます。始めとして下記にオブジェクトとの違いを箇条書きにして明確にします。

オブジェクトとMapの違いは以下の通りです

- `キーにstring以外を設定できる。`
- `キーの列挙順が保証されている。`
- `キーの数を取得するためには、Object.keys()を使用する必要がある。`
- `キーと値のペアを保持し、キーが最初に挿入された順序を覚えている。`

以上です。

Mapの方は`Map<K,V>`のような形をとります。Kにキーの型、Vに値の型を示します。まず`Map`の作成方は下記のように記述して初期化します。しかし、このままでは定数`map`は`<any,any>`となってしまうのでよろしくないでしょう。

```tsx
const map = new Map();
```

また、主なメソッドはset,getを使用し、hasというものもある。

`set`は下記のように、引数に値をセットしてデータを追加する。

```tsx
const map: Map<string, number> = new Map();
map.set('a',1);

```

`get`は下記のようにキーを指定して値を返す。ただし、存在しないキーが記述された場合、`undefined`が返される。

```tsx
const map: Map<string, number> = new Map();
map.set('a',1);
console.log(map.get('a')//1
console.log(map.get('bar')//unudifined
```

存在確認して要素を取得する場合はhasメソッドは認識されない。

```tsx
const map = new Map([["a", 1]]);
if (map.has("a")) {
  // TypeScriptは"a"があることを認識しない
  const n = map.get("a");
  n * 2;
}
```

```tsx
const map = new Map([["a", 1]]);
const n = map.get("a");
if (typeof n === "number") {
  n * 2;
}
```

### 考慮、検討する点

パフォーマンスを意識するなら、`Map`ではなく`WeakMap`という手もある。ただし、列挙系は使用できないので、逆に列挙を使用しない場合のみ検討する。`Map`はGCの対象にならないため、本来ガベレージコレクトされてもいいオブジェクトも、`Map`でキーとして使用されているためメモリ上に残り続ける。以上により場面では、`WeakMap`を使用する手もあるだろう。

## 参考記事
https://typescriptbook.jp/reference/builtin-api/map#%E3%82%AD%E3%83%BC%E3%82%92%E5%88%97%E6%8C%99%E3%81%99%E3%82%8B---mapprototypekeys

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/WeakMap
サービス スタック更新プログラム(SSU)

###サービス スタック更新プログラム(SSU)
######サービス スタック更新プログラムは、Windows 更新プログラムのインストールを実行するコンポーネント。
また、Windows 展開のいくつかの要素 (DISM、SFC など) 、主要なコンポーネントである "コンポーネントベースのサービス スタック" (CBS) が含まれている。そして、Windows の機能や役割の変更やコンポーネントの修復が行われる。
※CBS は、毎月公開される更新プログラムではなく、小さなコンポーネント。

サービス スタック更新プログラムは更新プロセスの信頼性を向上、最新の品質更新プログラム、機能更新プログラムのインストール中に発生する可能性がある問題を軽減する。 最新のサービス スタック更新プログラムをインストールしない場合、最新の Microsoft セキュリティ修正プログラムによるデバイスの更新が実行できなくなる恐れがある。

Windows クライアントと Windows Server の両方で累積更新プログラムの方式が使用されており、この方式では、Windows の品質とセキュリティを向上させる多くの修正プログラムが 1 つの更新プログラムにまとめられます。 それぞれの累積更新プログラムには、それ以前のすべての更新プログラムでの変更と修正が含まれます。


※OS のインストール処理を担うコンポーネント CBS (Component Based Servicing) を更新するプログラム
※CBS は、毎月公開される更新プログラムではなく、小さなコンポーネント。



参考
https://learn.microsoft.com/ja-jp/windows/deployment/update/servicing-stack-updates