OmniAICreator/Qiita-1.07M huggingface dataset:
githubの草が急に生えなくなった理由（解決）

railsでアプリを作っています。
１週間ほど、別の勉強をしていたので、pushするのは久しぶりでした。

今まで通りpushしたはずなのに・・・草が生えません。

実は心当たりがあります。
１週間前に、giuhubのメールの設定を変更していました。
それまで自分のプライベートアドレスを全世界に公開しており、
それに気づいて慌ててgithub用のアドレスに変更したのです。

でもgit 
git config --global user.email
で確認しても変更後のアドレスになっているのに、なぜpushされないんだ？？
と思い悶々としていましたが、あっさり解決しました。
変更後のアドレスの一部が誤っていたのです！
（具体的に言うと、「~noreply」のはずが「nooreply」になっていました）

githubからコピペすればよかったのに、おそらく1週間前の私は律儀に一文字ずつ入力をした結果、誤って入力していたようでした。

git config --global user.email　正しいアドレス
のコマンドを実行し、正しいアドレスに変更してみると、無事に草も生えました！

こんなところで躓くの本当悲しい・・・。
ですが、長いものはコピペせよ、と学ぶことができたので結果オーライということにします。
この不親切な手順に救援を　其の５：GPUリセットコマンドを１行で

画面が真っ黒や真っ白になった時に試す作業として
GPUリセットのショートカット
[ Win ] + [ Ctrl ] + [ Shift ] + [ B ]
が紹介されています

これをコマンドで行う方法として
PowerShell を 起動してから
pnputil /enum-devices /class display
で ディスプレイドライバ の インスタンス ID を 表示させ
pnputil /restart-device "表示された インスタンス ID を コピペ"
と言うのも紹介されています

コマンド版は手順が面倒な割りに
役に立つかどうかは不明ですが

「ファイル名を指定して実行」に貼り付ける版を作りました
管理者権限が必要な場合は
「ファイル名を指定して実行」に貼り付けた後に
[ Ctrl ] + [ Shift ] + [ Enter ]
で実行して下さい

```
cmd /c,for /f "tokens=3 delims= "  %G in ('pnputil /enum-devices /class display ^| find "\"') do @pnputil /restart-device  "%G" & pause
```

![無題2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98441/b15f9567-25a9-f586-edca-3f259f7f7dc8.jpeg)

実行すると画面がフラッシュした後に
このような画面が表示されるので
コマンドプロンプト画面を×で閉じるか
コマンドプロンプト画面で何かキーを押せば終了します

結果表示は要らない、リセットだけ行いたい場合は、こちらです
※ Pause文が無いだけです

```
cmd /c,for /f "tokens=3 delims= "  %G in ('pnputil /enum-devices /class display ^| find "\"') do @pnputil /restart-device  "%G"
```
AWS MLAベータ試験受験レポート

# はじめに
この記事では、AWS Certified Machine Learning - Specialty (MLS-C01) 試験のベータ版を受験した際の勉強方法や所感を共有します。AWS Certified AI Practitioner (AIF) の情報については、[前回の記事](https://qiita.com/ry-harada/items/0b902bdb96ec24d2fcab)をご覧ください。

# 受験背景
(AIFの受験動機と同じになります)
昨年度、AWS認定全冠を達成し、「2024 Japan AWS All Certifications Engineers」を受賞しました。今年度、新たに3つの認定試験（DEA/AIF/MLS-C01）が追加され、来年のAll Certにはこれらの認定も必要になると予想し、早期受験を決意しました。さらに、AIの分野の盛り上がりに合わせ、個人的な知識習得の目標もありました。そして、ベータ試験に合格すると、AWS AI Dayで特別なステッカーがもらえるという情報も、受験のモチベーションとなりました。

https://aws.amazon.com/jp/events/ai-day/

# AWS Certified Machine Learning Engineer - Associate(MLA)とは
AWS認定試験の中で今年登場した資格の一つで、生成AIや機械学習に関する知識が問われます。ベータ試験は通常価格よりも安価に受験できます。試験は85問で、通常の試験よりも20問多いです。
AIFと異なり、この試験ではAI関連よりも機械学習関連の知識がより深く問われます。[試験ガイド](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-machine-learning-engineer-associate/AWS-Certified-Machine-Learning-Engineer-Associate_Exam-Guide.pdf)にも記されているように、早期停止、ドロップアウト、ROCなど、AI分野ではお馴染みの用語が含まれています。


# 勉強内容
### 1. 試験ガイドの確認
[試験ガイド](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-machine-learning-engineer-associate/AWS-Certified-Machine-Learning-Engineer-Associate_Exam-Guide.pdf)を確認し、AWSのサービスだけでなく、一般的な機械学習の用語も理解する必要がありました。

### 2. G検定関連テキスト/問題集
機械学習用語の理解のために、G検定のテキストと問題集を復習しました。機械学習の歴史や人物名ではなく、アルゴリズムの概要や機械学習の手法に焦点を当てて復習しました。

[G検定テキスト](https://amzn.asia/d/hUMzE3P) 
[G検定問題集](https://amzn.asia/d/i9T1NaV)

### 3. Skill Builderでの試験対策コース受講
[Enhanced Exam Prep Plan: AWS Machine Learning - Specialty (MLS-C01)](https://explore.skillbuilder.aws/learn/public/learning_plan/view/2192/enhanced-exam-prep-plan-aws-machine-learning-associate-mla-c01)を通じて、試験の各セクションで問われる知識を習得しました。一部ラボトレーニングはメンテナンス中のため利用できませんでした。

### 4. 模擬試験の実施
20問と65問の模擬試験をそれぞれ実施しました。初回は60%程度でしたが、2週目に80%強を達成し、準備が整っていると判断しました。

# 結果
テストセンターで受験し、170分の試験を約90分で終了させ、見直しを行いました。800点くらい取れていそうな感覚でしたが、採点外の設問があるためか、点数は低めでした。

![スクリーンショット 2024-10-26 21.45.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448259/033c8d9a-5317-c9c3-c92f-5de557378c3f.png)

# 所感
全体として、試験の4つの分野のうち、第3分野と第4分野はAWSの知識で解答できる問題が多かったです。難易度もアソシエイトレベルで比較的易しかったです。学習する際は、第1分野と第2分野に焦点を当て、機械学習関連の知識を強化すると良いでしょう。さらに、SageMakerの機能や用語が多いため、しっかりと理解することが重要です。

【参考】AWS MLAの試験分野
第 1 分野: 機械学習 (ML) のためのデータ準備 (採点対象コンテンツの 28%)
第 2 分野: ML モデルの開発 (採点対象コンテンツの 26%)
第 3 分野: ML ワークフローのデプロイとオーケストレーション (採点対象
コンテンツの 22%)
第 4 分野: ML ソリューションのモニタリング、保守、セキュリティ (採点対象
コンテンツの 24%)

# おわりに
AWS MLAの認定を取ったことで、再びAWS認定全冠ホルダーになることができました。来年度のAll Certの要件はまだ発表されていませんが、更新の必要な認定が1つあるので、近いうちに再認定の取得を目指す予定です。
ルーティングのルールを更新する

> ルーターによるパケットの転送のことを「ルーティング」と言います。

https://qiita.com/masatom86650860/items/2bc3bd7d525c546e6600#:~:text=%E3%83%AB%E3%83%BC%E3%82%BF%E3%83%BC%E3%81%AB%E3%82%88%E3%82%8B%E3%83%91%E3%82%B1%E3%83%83%E3%83%88%E3%81%AE%E8%BB%A2%E9%80%81%E3%81%AE%E3%81%93%E3%81%A8%E3%82%92%E3%80%8C%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%80%8D%E3%81%A8%E8%A8%80%E3%81%84%E3%81%BE%E3%81%99

ルーティングは転送することを指すためダイナミックルーティング、スタティックルーティングに関して調べてみることにした。

# ルーティングテーブルは更新される
>IPネットワークでは、パケットの転送を制御するルーティングテーブルがとても大きな役割を果たしています。このルーティングテーブルは、一度登録したら未来永劫そのままで良いわけではありません。`新しいネットワークが追加された場合など、ネットワークの接続上が変わった時には、その変更に応じて、関連する各ルーターのルーティングテーブルを修正する`必要が出てきます。

ルーティングが変更されたらパケットは目的地まで運べなさそうだ。

# スタティックルーティング
>ネットワーク接続の変更が発生するたびに、関連するルータなどのルーティングテーブルを`手動で修正する`方法です。手動で修正する以外は、`常に固定されたルーティングテーブルを使ってルーティングするこのスタイルを「スタティックルーティング」`と呼びます。スタティックルーティングは、`ネットワーク全体の規模がごく小さい時`や、`構成の変更がほとんどない時`には手軽な方法です。

* 固定されたルーティングテーブル使ってパケットを転送することをスタティックルーティング
* ネットワーク全体の規模が小さい場合、構成の変更がない場合は、おすすめ
* 手動でやるから人的なミスに気をつけないといけない

# ダイナミックルーティング
> ネットワークの接続ルートに関する情報を`ルータ同士が定期的あるいは必要に応じて交換`し合い、それに基づいて`ルーティングテーブルを自動管理する「ダイナミックルーティング」`と呼ばれる方法です。例えば新しいネットワークが繋がると、その`ネットワークの入り口となるルーターが、隣接する各ルーターに新しいネットワークの情報を伝えます`。受信したルーターは、必要に応じて、その新しいルートの情報を自分の隣接ルーターに伝えます。このような方式で、`新しく繋がったネットワークの情報を自動的に拡散`し、`各ルーターがそれに必要なルール（経路情報）をルーティングテーブルに設定`します。

* ルーターが新しいネットワークの情報を隣に伝えて、隣のルーターがそれをその隣に伝えることによって情報が拡散していく
* 新しい情報を受け取ったルーターがそれに応じてルーティングテーブルを再設定する

https://www.sbcr.jp/product/4797386677/

# 感想
パケットは行き当たりばったりのルートを進むのだろうか？
paiza.ioでrust その10

# 概要
paiza.ioでrustやってみた。
shellを見つけたので、やってみた。

# 参考にしたページ

https://zenn.dev/kumavale/articles/5ed1a977f7fe97


# サンプルコード

```
use std::io::{self, Write};
use std::process::Command;
use std::process::Child;
use std::process::Stdio;

fn main() {
    loop 
    {
        print!("$ ");
        io::stdout().flush().unwrap();
        let mut input = String::new();
        io::stdin().read_line(&mut input).unwrap();
        let mut commands = input.split(" | ").peekable();
        let mut previous_process = None;
        while let Some(command) = commands.next() 
        {
            let output = commands.peek().map_or(Stdio::inherit(), |_| Stdio::piped());
            let mut tokens = command.split_whitespace();
            let Some(command) = tokens.next() else {
                continue;
            };
            match command 
            {
            "exit" => {
                println!("(^-^)/~~");
                std::process::exit(0);
            }
            _ => {
                let input = previous_process.map_or(Stdio::inherit(), |child: Child| {
                    Stdio::from(child.stdout.unwrap())
                });
                let child = Command::new(command).args(tokens).stdin(input).stdout(output).spawn().unwrap();
                previous_process = Some(child);
            }
            }
        }
        //std::process::Child.wait().unwrap();
        if let Some(mut final_process) = previous_process 
        {
            final_process.wait().unwrap();
        }
    }
}




```

# 実行結果

```
$ /workspace
$ build_command
build_exit_code.txt
build_stderr.txt
build_stdout.txt
build_time.txt
exec_command
exec_stderr.txt
exec_stdin.txt
exec_stdout.txt
Main
Main.rs
main.tar.gz
runner_mysql
run_user
$ (^-^)/~~
```

# 成果物


https://paiza.io/projects/sFrWrblvfrdc68YZwac6eg

以上
PowerApps担当になって、1年後に取り組んだこと

https://qiita.com/EasyCording/items/2e36ab2843b1deffff89

我ながら1年もかけて、くそアプリとくそPlatformに、よく付き合ってきたと思う
そんな自分が、この一年間に取り組んだことと、いまから取り組もうとしていることを、つらつら書いてみる

# 課題感
所詮は他人の書いたプログラム、ノーコードと言えば誰でも簡単にメンテナンスできる・・・
はっきり言います。PowerAppsは素人の市民開発者が手を出せるような、生半可なツールではなく、れっきとしたプログラミングスキルが必要な、別次元の開発ツールです。
そういう意味では、大規模なシステムになればなるほど、苦しむことになることは覚悟しておいてもらいたい

# 問題点
シェアポイントリストしかデータベースで使えない。Dataverseが使える、プレミアム版は別として
Automateのフローは関数ではない。フローからサブフローを関数ぽく呼べる、プレミアム版は別として
PowerAppsのスクリーンやコントロールＵＩの解読は、ソリューションエクスポートしないとコード化できない
Solutionにしないと参照接続が使えない。コネクタ関係が、しょっちゅう切れるので、後になればなるほど複雑化する
同時開発に向かない。そもそもアプリ編集中は誰か一人しかできない。
Automateは単体ではエクスポート、インポートできるが、一旦、Solutionに入れると2度と出来なくなる

# やってきたこと
とりあえず、ソースの解読は全てCHATGPTにsolutionのZIPを食わせてやっている。これは有効、自作のＲＡＧと合わせこんで、ようやく実用化レベルとなった（全部、人力で理解していると思われているけど、そうではない）
リファクタリングのために、アプリ、フロー、シェアポイント、コネクタの情報から、データサイエンス手法を用いて可視化を試んでいる

# まとめ
Powerappsに中途半端に巻き込まれそうになっている人に忠告しておく
これからの時代はコードも生成ＡＩで作れる時代である
そのうち、このような陳腐化したプラットフォームは無くなるだろう
とりあえず、今のうちに高いスキルを持っていると、周りから何となく尊敬されるが・・・

# 以下、今後の予定
ソースコード解析において、各コンポーネントが密接に関連し合っている場合、適切な可視化を利用することで全体像を把握しやすくなります。以下のような可視化手法が有効です。

### コンポーネント図
* システム内の主要コンポーネント（PowerApps, PowerAutomate, SharePoint List, APIコネクタ）間の関係性と依存関係を明確にします。
* 各コンポーネントやモジュール間のインターフェースやデータフローを示す。
* コミュニケーションパスや依存性が視覚的に把握可能。

### フローチャート
* 各機能の処理フローを詳細に追跡。
* PowerAutomateによるワークフローや処理ステップを具体的に描写。
* 条件分岐やループなども直感的に理解可能。

### シーケンス図
* 時系列でのメッセージ交換とプロセス流れを明確化。
* ユーザーインターフェースからAPIコールまで、どのような順序でイベントが発生するか表示。
* 同期・非同期処理も見える化。

### ER図（エンティティ・リレーションシップ図）
* データベース構造とデータ間の関係性を把握。
* SharePoint List内で管理されるデータエンティティとそれら間の関連性。

### 組み合わせたアプローチ
上記それぞれは異なる側面からシステム構造を見ることができます。これらを組み合わせることで、以下が可能になります：

* 全体構造から細部まで一貫した理解促進
* 問題箇所特定および改善策立案への支援
* コードメンテナンス性向上

適切なツール（Visio、Lucidchartなど）を活用してこれらの図を作成することで、解析作業はより効率的かつ効果的になるでしょう。

以下のような可視化が有効です。ネットワーク図やサンキーチャートも特定の側面で利用できますが、用途に応じた選択が重要です。

### ネットワーク図
* コンポーネント間の依存関係: PowerApps、PowerAutomate、SharePointリスト、APIコネクタなど各コンポーネント間の依存関係を可視化できます。
* データフロー: データがどのように移動し、どこで処理されるかを示すことでシステム全体の理解を深めます。
* メリット 複雑な相互関係を明確にし、ボトルネックや冗長性を見つける助けになります。
### サンキーチャート
* プロセスフロー解析: 特定機能（例えばPowerAutomateのフロー処理）の流れやステップ間でどれくらいデータが移動しているかを可視化できます。
* リソース配分: 各機能やプロセスに割り当てられたリソース量や使用頻度を見るためにも使えます。
* メリット フロー量やプロセス全体像を直感的に把握できるため、改善点を見つけやすい。

データ入力から出力まで全体的な流れと変換過程を見ることができ、システム全体像理解につながります。

結論
ネットワーク図は構造と依存関係分析向きであり、一方サンキーチャートはプロセスフロー解析によく適しています。ソースコード解析にはこれらを組み合わせて使用することで、多角的な視点から問題点や改善策を見つけ出せます。具体的には目的と焦点によって最適な手法を選ぶことがお勧めです。

# 
なんのこっちゃ。。。っていう感じ
Api ログアウト（アクセストークンを無効化）

### Apiでログイン後、ログアウトすることはできるか。
ログアウトというAPIがないため、別の方法を使うしかない。
それが「アクセストークンを無効化」

### Postmanでアクセストークンを無効化

[プログラムによる OAuth トークンの取り消し](https://help.salesforce.com/s/articleView?id=sf.remoteaccess_revoke_token.htm&type=5)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/59ad1ce3-726d-4f29-a428-b70d94f79485.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/46b50616-2e4b-410b-1f58-ae51775873a4.png)

|# |項目|値|
|---|---|---|
|1 |headers|Content-Type=application/x-www-form-urlencoded|
|2 |body   |token={AccessToken}|
|3 |URL|https://{DomainName}.my.salesforce.com/services/oauth2/revoke|
|4 |method|POST|

参考：
接続アプリケーションを使う場合は、Body部が変わる
https://qiita.com/manabian/items/3afc5701b2b027b1592c
paiza.ioでrust その9

# 概要
paiza.ioでrustやってみた。
replを見つけたので、やってみた。

# 参考にしたページ

https://qiita.com/runeleaf/items/7f61f7d7e42eb0f31d3c


# サンプルコード

```

use std::io::{self, Write};

fn main() {
    let mut input = String::new();
    loop 
    {
        print!("rust> ");
        io::stdout().flush().unwrap();
        input.clear();
        io::stdin().read_line(&mut input).unwrap();
        let prompt = input.trim();
        match prompt 
        {
        "exit" => {
            println!("Bye!");
            break;
        },
        _ => println!("{}", prompt),
        }
    }
}




```

# 実行結果

```
rust> 1 + 1
rust> foobar
rust> baz
rust> Bye!
```

# 成果物

https://paiza.io/projects/Z8R3kc3C39EyBXKrGddfSg


以上
javascript timestampでgraphql int型はエラーだった話

# nodejs timestampでgraphql int型はエラーだった話

## 背景

[nextjs examples](https://github.com/vercel/next.js/tree/canary/examples/api-routes-apollo-server-and-client-auth)を試していた時に、timestamp値をGraphql Intで定義してあり、エラーとなったための対応。

## 原因

GraphqlのInt型は、`A signed 32‐bit integer.`となっており、Date.now()を利用した場合に32-bitを超えてしまい、下記のようなエラーがでる。

![スクリーンショット 2024-10-29 11.08.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144543/544041cc-161b-7580-ca0a-2da6fc3097ac.png)


```
"message": "Int cannot represent non 32-bit signed integer value: XXX",
```

```
% Date.now()
1730166391048
```

## 1. 対応手段

### 1-1. Int型からFloat型に変更する

```schema.graphql
type User {
  id: ID!
  email: String!
  createdAt: Int!
}
```
を
```schema.graphql
type User {
  id: ID!
  email: String!
  createdAt: Float!
}
```
に変更する

### 1-2. timestamp型からString型に変更する

```schema.graphql
type User {
  id: ID!
  email: String!
  createdAt: String!
}
```

```sample.ts
new Date(now).toISOString()
```

### 1-3. Cutom Scalar型を作成する

[DateTime](https://the-guild.dev/graphql/scalars/docs/scalars/date-time)型を利用なども可能です。
paiza.ioでrust その8

# 概要
paiza.ioでrustやってみた。
練習問題やってみた。

# 練習問題
splitを使え。

# サンプルコード

```

fn main() {
	let v: Vec<&str> = "hello,world,goodbye,world".split(',').collect();
    println!("{:?}", v);

	let t: Vec<&str> = "hello,world,goodbye,world".rsplit(',').collect();
    println!("{:?}", t);

	let mut spw = "a   b  c d".split_whitespace();
    println!("{:?}", spw.next());
    println!("{:?}", spw.next());
    println!("{:?}", spw.next());
    println!("{:?}", spw.next());

	let s: &str = "1 2 a 3 b 4 aaa 5 l 10";
	let cs: Vec<i32> = s.split_whitespace().filter_map(|k| k.parse().ok()).collect::<Vec<i32>>();
    println!("{:?}", cs);

}
```

# 実行結果

```
["hello", "world", "goodbye", "world"]
["world", "goodbye", "world", "hello"]
Some("a")
Some("b")
Some("c")
Some("d")
[1, 2, 3, 4, 5, 10]
```

# 成果物

https://paiza.io/projects/E-CBvBuuGH0ey-k4FfIN4A

以上
yoomを使ってジョブカンと連携する


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/6939f432-1f5e-d154-750e-973257ef56fd.png)

yoomからエラーメッセージが届きますね。

■エラー原因
連携アプリにアクセスできません。
メンテナンス等一時的にサービス（API）が停止している可能性がございます。
連携アプリのサービスサイト等にてご確認ください。メンテナンスが終了すると、エラーは解消されます。

エラー原因をご確認の上、アプリトリガー設定の修正をお願いします。
Pythonで大文字小文字を考慮したソートが意外と簡単にできる

# Pythonのソートの基本
[公式チュートリアル](https://docs.python.org/ja/3/howto/sorting.html)を見ると大変わかりやすくまとまっているが、最低限の特徴としては、
- 組み込み関数[sorted()](https://docs.python.org/ja/3/library/functions.html#sorted)とリストのメソッド[list.sort()](https://docs.python.org/ja/3/library/stdtypes.html#list.sort)があるが仕組みや応用の仕方は同じ
- キーワード引数*key*に[キー関数](https://docs.python.org/ja/3/glossary.html#term-key-function)を設定することでいろいろなソートを実現できる

# 今回の目標
```python
['aB', 'A', 'ab', 'AB', 'a', 'Ab', 'b', 'B']
```
が
```python
['A', 'a', 'AB', 'Ab', 'aB', 'ab', 'B', 'b']
```
となるようなソートを目指す

# よくある方法と問題点
## 普通にソート
```python
>>> sorted(texts)
['A', 'AB', 'Ab', 'B', 'a', 'aB', 'ab', 'b']
```
今はほとんどの文字列が`A`か`a`から始まっているので違和感は少ないかもしれないが、**`B`が`a` `aB` `ab`より早く並んでいる**のが問題である
文字列のソートは[Unicode](https://ja.wikipedia.org/wiki/Unicode)を元にしており、Unicode上ではアルファベット大文字がアルファベット小文字より先に来るからである（参考：[式>比較>値の比較](https://docs.python.org/ja/3/reference/expressions.html#value-comparisons)）
<details><summary>参考：アルファベット周辺のUnicode表</summary>

|U+|0|1|2|3|4|5|6|7|8|9|A|B|C|D|E|F|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|0040|@|A|B|C|D|E|F|G|H|I|J|H|I|J|K|L|M|N|O|
|0050|P|Q|R|S|T|U|V|W|X|Y|Z|[|\\ |]|^|_|
|0060|`|a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|
|0070|p|q|r|s|t|u|v|w|x|y|z|{|\||}|~|DEL|

</details>

## 大文字小文字を揃えてソート
```python
>>> # operator.methodcaller()も使えるが、今回はlambdaで大文字に揃えている
>>> sorted(texts, key=lambda t: t.upper())
['A', 'a', 'aB', 'ab', 'AB', 'Ab', 'b', 'B']
```
これで`B`が`a`より後ろに来て一見良さそうに見えるが、よく見てみると**大文字と小文字の並びに統一感がない**。例えば、`A`と`a`では大文字が先に来ているのに、`B`と`b`では小文字が先に来ている
それもそのはずで大文字や小文字に揃えているため、大文字と小文字を同じものとして扱ってしまうからである

# 解決策
タプルのようなシーケンスの比較では、最初の等価でない要素の順序と同じになるという性質がある（参考：[式>比較>値の比較](https://docs.python.org/ja/3/reference/expressions.html#value-comparisons)）
そのためタプルを返す関数をキー関数にすれば簡単に複数キーでのソートが実装できる
```python
>>> sorted(texts, key=lambda t: (t.upper(), t))  # 大文字小文字を配慮したソート
['A', 'a', 'AB', 'Ab', 'aB', 'ab', 'B', 'b']
```
一行で書けており大変すっきりして見えるが、一見何をしているかわかりづらいのでコメント必須

# 終わりに
他にも
- 比較関数と[functools.cmp_to_key()](https://docs.python.org/ja/3/library/functools.html#functools.cmp_to_key)
- [collections.UserString](https://docs.python.org/ja/3/library/collections.html#collections.UserString)のサブクラスを作って特殊メソッド`__lt__()`を上書き
- 組み込み関数に頼らずソートを丸々（ちなみにPythonの組み込みのソートは[ティムソート](https://ja.wikipedia.org/wiki/ティムソート)）

といった方法でも解決はできるが、今回の方法が一番簡単に感じる
数値から文字や文字配列への変換テクニック【C#】

## 目次
- はじめに
- 数値から文字へ変換する基本的な方法
    - 0~9をchar型に変換
    - 数値をstring型に変換
    - 数値をchar[]型に変換

## はじめに
今回は、数値から文字へ変換する基本的な方法を紹介したいと思います。

## 数値から文字へ変換する基本的な方法
- 0~9をChar型に変換
```c#
int number = 8;
char digitChar = (char)(number + '0');
Console.WriteLine(digitChar); // 出力: '8'
```
'0' は文字 '0' のASCIIコードで、値は48です。
number に 8 が代入されているので、8 + 48 = 56 となります。

（char）は、数値や他のデータ型を char 型へ変換するために使います。整数値を、対応するASCII文字に変換するわけですね:smiley:

しかし、この方法は「0~9」の整数値にしか使えません。
10以上の数は複数の桁を持つため、単純にASCIIコードを足すだけでは正しい文字列にはならないからです。例えば、数値 10 を文字に変換したい場合、1 と 0 の二つの文字に分けて変換する必要があります:sob:

そんなときに便利なのがToString()です！
- 数値をstring型に変換
```c#
int number = 123;
string numberString = number.ToString();
Console.WriteLine(numberString); // 出力: 123
```
簡単に変換できましたね:relaxed:

また、このように特定の桁を char 型として取得することもできます。
```c#
int number = 123;
char firstDigitChar = number.ToString()[0]; // '1'
Console.WriteLine(firstDigitChar);
```

もちろん、char配列に変換することもできますよ！
- 数値をchar[]型に変換
```c#
int number = 123;
char[] digits = number.ToString().ToCharArray();
Console.WriteLine(digits); // 出力: 123
```
ToCharArray() を使って、文字列を char の配列に変換しました。
出力は同じく「123」になります。
日本語配列なのにUS配列として認識されるときに見る記事

日本語配列のキーボード使ってて半角/全角押してるのに｀が出てきていらついたときに見る記事

## 環境

- ubuntu22.04

## まずは確認

### アプリから確認

`設定 > キーボード > 入力ソース`で、Mozcになっているか確認。
Mozcがインストールされていない場合は

```zsh:zsh
sudo apt-get install -y ibus-mozc
sudo apt-get install -y mozc-utils-gui
reboot
```

を実行してインストールする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3315851/617da499-f569-7ddd-7677-bd18287c5246.png)
最終的にこのようになっていれば良い。

### ターミナルで確認

ターミナル上で

```
setxkbmap -query
```

を実行。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3315851/e1378f0d-0c04-48b2-e701-d3c76105b84c.png)
layout:usとあるのでキーボードのレイアウトがUS配列として設定されていることがわかる。

```
setxkbmap jp
```

を実行してみると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3315851/a158ebbd-abad-7ca7-e753-e0b96c6ff5f9.png)
となる。
これで再起動してレイアウトが変更されていれば終わり。

## setxkbmap jpしても再起動したらusになる場合

まずは

```
sudo dpkg-reconfigure keyboard-configuration
```

を実行してください。それで日本語のキーボードを選んであげてください。

### それでもだめなら

もうね、わかんない。
わかんないからゴリ押して、起動時に`setxkbmap jp`が実行されるようにする。

つぎのコマンドで設定ファイルを作って編集画面を開く。

```
mkdir -p ~/.config/autostart
nano ~/.config/autostart/setxkbmap.desktop
```

そしたらこれを書き込む。

```zsh:setxkbmap.desktop
[Desktop Entry]
Type=Application
Exec=setxkbmap jp
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=Set Japanese Keyboard Layout
Comment=Automatically set keyboard layout to JP on startup
```

これでもう大丈夫。再起動して`setxkbmap -query`したらちゃんとjpって出ます！！！


### 追記

なんかMozc以外のプレーン日本語レイアウトも登録しないとうまく動かないっぽいです。お騒がせしました。
緯度経度迷子になる人のためのサイト


|緯度|	経度|
|------------------|-----------------|
|いど|	けいど|
|latitude|	longitude|
|lat|	lon|
|lat|	lng|
|Y軸|	X軸|
|北緯|	東経|
|20度から45度|	 120度から150度|
ami削除用シェルスクリプト

```
#!/bin/bash

# AMIリストファイルのパス
AMI_LIST="ami_list.txt"

# ファイルが存在するか確認
if [[ ! -f "$AMI_LIST" ]]; then
  echo "AMIリストファイル $AMI_LIST が見つかりません。"
  exit 1
fi

# AMI IDのリストを1行ずつ読み込んで削除
while IFS= read -r ami_id
do
  if [[ -n "$ami_id" ]]; then
    # AMIを削除
    echo "削除中: AMI $ami_id"
    aws ec2 deregister-image --image-id "$ami_id"
    
    # エラーチェック
    if [[ $? -eq 0 ]]; then
      echo "AMI $ami_id が削除されました。"
    else
      echo "AMI $ami_id の削除に失敗しました。"
    fi
  fi
done < "$AMI_LIST"

```
M5NanoC6、WebServerで遊ぶ。


x 過去ログを見よ!!


修正箇所は、2か所

```c++

const char *ssid = "ご自宅のSSID";
const char *password = "ご自宅のパスワード";

```

```c++

const int led = 7;

```

![o_coq571.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a11e81d6-2fb3-d862-c29d-797f412c90b8.jpeg)


![o_coq572.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e2eb91b4-a580-21a3-0f1d-6658d5cd104d.jpeg)

![o_coq573.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/03f083ad-82db-4a1d-e161-e5382229f97a.jpeg)


![o_coq574.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c9b83c44-9cd0-ef8a-964f-378acb5f1e66.jpeg)


```c++

#include <WiFi.h>
#include <NetworkClient.h>
#include <WebServer.h>
#include <ESPmDNS.h>

const char *ssid = "ご自宅のSSID";
const char *password = "ご自宅のパスワード";

WebServer server(80);

const int led = 7;

void handleRoot() {
  digitalWrite(led, 1);
  server.send(200, "text/plain", "hello from esp32!");
  digitalWrite(led, 0);
}

void handleNotFound() {
  digitalWrite(led, 1);
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
  digitalWrite(led, 0);
}

void setup(void) {
  pinMode(led, OUTPUT);
  digitalWrite(led, 0);
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  if (MDNS.begin("esp32")) {
    Serial.println("MDNS responder started");
  }

  server.on("/", handleRoot);

  server.on("/inline", []() {
    server.send(200, "text/plain", "this works as well");
  });

  server.onNotFound(handleNotFound);

  server.begin();
  Serial.println("HTTP server started");
}

void loop(void) {
  server.handleClient();
  delay(2);  //allow the cpu to switch to other tasks
}


```
[VBA]コマンドボタンのカラーを変更する

### コマンドボタンの色を自由に変えたい
Excelでボタンを設置するときActiveX コントロールのコマンドボタンの色を変えるのに苦労したのでここに備忘録を。
ちなみにテキストボックスやチェックボックスなんかもこの方法で色が変更できます。
RGBの値をちょっといじると解決します:muscle_tone1:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921692/0f9931b1-6f07-9dcc-89b0-ea582aa77206.png)
https://indoor-nekura.work/vba_button_color/
paiza.ioでrust その7

# 概要
paiza.ioでrustやってみた。
練習問題やってみた。

# 練習問題
replaceを使え。

# サンプルコード

```

fn main() {
	let s: &str = "foo foo foo";
	println!("{}", s.replace("o", "a"));
	println!("{}", s.replacen("o", "e", 4));
}


```

# 実行結果

```
faa faa faa
fee fee foo
```

# 成果物

https://paiza.io/projects/r1GMmSZMA2L7dLrI0bUKBQ


以上
HTML #2

# 1 HTMLの基本
HTMLは、基本的にタグというもので構成されています。
例えば
```
<html>,<title>,<h1>,<a>
```
などです。
これらのタグを使うことによってページにタイトルや見出しを付けることができます。
# 2 書いてみる
例えばページにタイトルと見出しを付けて、文章を書きたいなら
```
<html>
<title>
HAZE
</title>
<h1>
HAZE
</h1>
<a>
frost
</a>
</html>
```
このようなコードを書くことによって以下の画像のような感じになる![Screenshot 2024-10-29 10.29.22 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919171/0d66abd5-9d3a-1be3-5cff-ca55586837dc.png)
非エンジニアでもわかる！Webページが表示される仕組み

今回は、普段何気なく見ているWebページが、実際にどのように私たちの目の前に表示されているのか、IT知識のない方にもわかりやすく説明していきたいと思います。

## 🌟 まずは身近な例え話から

Webページが表示される仕組みを、お店での買い物に例えて考えてみましょう。

### 🏪 登場人物
- あなた（クライアント）：お客さん
- お店（Webサーバー）：商品（Webページ）を提供する場所
- 店員（インターネット）：あなたとお店をつなぐ存在

## 📱 Webページが表示されるまでの流れ

![スクリーンショット 2024-10-29 10.25.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725992/1c831819-3239-e680-309c-0367e8b5ed8d.png)

### 1️⃣ リクエスト（注文）
1. あなたがURLを入力する、もしくはリンクをクリックする
   - 例）https://www.google.com と入力する
   - これは、「Googleというお店に行きたいです！」と言っているようなもの

### 2️⃣ 経路の確認（道順を尋ねる）
1. ブラウザは最初にDNSサーバー（案内所）に問い合わせます
   - 「Googleのお店の住所（IPアドレス）を教えてください」
2. DNSサーバーが正確な住所（IPアドレス）を教えてくれます
   - 「はい、Googleは〇〇番地にありますよ」

### 3️⃣ データの受け取り（商品を受け取る）
1. ブラウザはWebサーバーにデータを要求します
   - お店に着いて「トップページを見せてください」と頼むようなもの
2. サーバーは必要なデータを送り返します

### 🏢 Webページの構成要素

![スクリーンショット 2024-10-29 10.25.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725992/e465934b-992f-70f4-d0cd-92f8ef7654e8.png)

各要素の役割：
- HTML（お店の商品の配置図）：ページの基本的な構造を決めます
- CSS（商品の見た目の情報）：色やデザインを整えます
- JavaScript（商品の動きの情報）：ボタンを押したときの動作などを制御します
- 画像・動画（視覚的なコンテンツ）：実際に表示される写真や動画です

### 4️⃣ 画面の表示（商品を棚に並べる）
1. ブラウザがデータを解析して画面に表示します
   - HTMLを元に基本的な構造を作る
   - CSSで見た目を整える
   - JavaScriptで動きをつける

## 💡 よくある疑問

### Q1: なぜページの表示に時間がかかることがあるの？
- お店が混んでいる（サーバーが混雑している）
- 商品が重い（データ量が多い）
- 道が混んでいる（回線が遅い）
などの理由が考えられます。

### Q2: なぜたまにエラーページが表示されるの？
- お店が休業中（サーバーがダウン）
- 商品が売り切れ（ページが削除された）
- 住所が間違っている（URLが間違っている）
などの理由が考えられます。

## 🎯 まとめ

ブラウザでWebページを見るということは、実はこのように...
1. お店（サーバー）の場所を調べて
2. そこまで行って（通信して）
3. 必要な情報をもらって（データをダウンロード）
4. それを見やすく整理する（画面に表示）
という一連の作業が、私たちが気づかないうちに行われているんです！

## 📝 補足
上記の例え話は、実際の技術的な仕組みを非常に簡略化して説明したものです。実際にはもっと複雑な処理が行われていますが、基本的な流れのイメージをつかんでいただければ幸いです。
PCの故障の前兆と対処

## はじめに
2年に一回PCが壊れる人による故障診断

【故障経歴】
- BSODはオトモダチ
- 初めての自作PCを組んで１年で作業ファイルや，思い出その他もろもろを詰め込んだHDD8tbを物理障害で飛ばした経験アリ
- 組んで半年のPCのM.2 SSDが不良品を引いたのかReadエラー，交換するも読み込みできなかったり不安定！！
- i9-12900KSをクロックを下げないと動作しなくなったため１年保証で交換してもらい，１か月も経たないうちに落雷によって壊した経歴アリ！！


## 前兆
:::note warn
- コピーに異様に時間がかかる
- エクスプローラー表示中に落ちる（ディスクが抜かれた判定
- Disk Partとかで `仮想ディクスサービスエラー`とか発生する
- アクセス拒否されたりする
:::

:::note alert
- 起動するたびに認識されたり，されなかったりする
- BIOSにすら認識されない
:::

## 対処

 すぐにPCを止めて，別のPCにディスクを繋げて優先度の高いファイルから`少しずつ`コピーをする．ダウンロードすれば取り返せるようなものや環境は，**諦める**



## やっておいた方がいいこと
**バックアップきちんと複数にして取っておく**
↑これに限る

:::note warn
コードはGitHub
データセットとか大きいファイルはNAS，クラウド
:::

:::note info
不揮発性メモリは秒で死ぬ
磁気ディスクに保存

SSDよりHDD
HDDよりNAS，クラウド
:::


## **パソコンの環境と構成**
ディスクは４部構成

- M.2 SSD 500gb `OS`だけにする
- M.2 SSD 2tb　`Application` + `WorkSpace`作業フォルダ
- HDD 同じ容量かつ違うメーカー RAID1 または `robocopy`などでミラーリング `WorkSpace`を保存する場所

CドライブにはOSだけ
ほかドライブにアプリケーションをインストール
作業場`Workspace`フォルダを作って，プロジェクトをまとめておく
定期的に`tree`とかでフォルダ構成とか保存しておく

**プロジェクト**
GitHubにプッシュしておく
環境構成はDockerを使う
モジュールimportも全てDockerfileに書き込む

:::note info
Dockerfileまとめてgitしておくと，別PCでも同環境で作業そのままできる
:::
Swift: Text から Dictionary に変換

## プログラム

```swift:text_read.swift
// --------------------------------------------------------------------
//	  text_read.swift
//
//									  Oct/29/2024
//
// --------------------------------------------------------------------
import Foundation

// --------------------------------------------------------------------
func textReadProc(fileIn: String) -> [String:[String:Any]] {
	var dict = [String: [String: Any]]()
	
	let fpIn = try! String(contentsOfFile: fileIn, encoding: .utf8)
	let lines = fpIn.components(separatedBy: .newlines)
	
	for line in lines {
		let cols = line.trimmingCharacters(in: .whitespacesAndNewlines).components(separatedBy: "\t")
		if cols.count >= 4, cols[0].hasPrefix("t") {
			if let population = Int(cols[2]) {
				dict[cols[0]] = ["name": cols[1], "population": population, "date_mod": cols[3]]
			} else {
				print("*** error *** \(fileIn) ***")
				print("*** \(line) ***")
			}
		}
	}
	
	return dict
}

// --------------------------------------------------------------------
func dictDisplayProc(dict: [String:[String:Any]]) {
	for (key, value) in dict.sorted(by: { $0.key < $1.key }) {
		let name = value["name"]!
		let population = value["population"]!
		let dateMod = value["date_mod"]!
		print("\(key)\t\(name)\t\(population)\t\(dateMod)")
	}
}

// --------------------------------------------------------------------
print("*** 開始 ***")

guard CommandLine.arguments.count > 1 else {
	print("入力ファイル名を指定してください")
	exit(1)
}

let fileIn = CommandLine.arguments[1]

let dict = textReadProc(fileIn: fileIn)
dictDisplayProc(dict: dict)

print("*** 終了 ***")
// --------------------------------------------------------------------
```

## 実行コマンド

```bash
swift text_read.swift cities.txt
```

## 確認したバージョン

```text
$ swift --version
Swift version 6.0.1 (swift-6.0.1-RELEASE)
Target: x86_64-unknown-linux-gnu
```
filecheckdate

No.2508 に関する指摘ではございませんが、
一点ご確認させていただきたくご連絡いたしました。

今回の a ドキュメントにつきまして、改版履歴以外に修正された箇所は特にございませんでしょうか


No.2508 に関する指摘ではございませんが、
念のためご共有させていただきます。

aaaファイルの bbb シートにおいて、
248行目以降の A列の番号がすべて「132」になっているように見受けられます。
こちらの内容について、ご確認いただくことは可能でしょうか。


先日ご連絡させていただきました「本事象は業務に影響がない」とのご説明について、
誤りがございましたので、訂正させていただきたく存じます。

改めて確認したところ、事象発生時には「再度検索ボタンを押しても反応がない」状態となり、
一度画面を閉じて再表示しなければ正常に検索できないなど、後続の業務操作に影響があることが判明しました。

ご迷惑をおかけしてしまい申し訳ございませんが、何卒よろしくお願いいたします。



念のため確認させていただきたいのですが、
Grafana の設定時には、提供いただいた aaa のクエリをそのまま使用すればよいのか、
それとも .* などの正規表現を途中に追加する必要があるのか、
あるいは下記画像にあるようなログ全文を用いるべきなのか、
ご教示いただけますと幸いです。

Grafana に詳しくなく、もし見当違いなことを申し上げていたら申し訳ありません。


現時点のログ内容からは、
API呼出時のリクエストデータに起因する不具合なのか、他の原因によるエラーなのかの判断が難しい状況です。

また、私の方でも裏側でログを比較してみましたが、
明確な差異や問題点は確認できませんでした。

BBXより、「今回のエラーは他システム側で発生しているものであり、
弊方ではそのシステムでどのような不具合が起きたかまでは判断できない」との回答がありました。

この場合、他システム側のエラーログ等を確認すべきでしょうか？
それともこのままKDDIへ返信しても問題ないでしょうか？
ご指示いただけますと幸いです。


お疲れ様です。
以下の点につきまして、私の理解が正しいかご確認いただけますでしょうか。
ご認識と異なる点がございましたら、ご指摘いただけますと幸いです。
	1.	A画面からBシステムを呼び出した際に、Bシステム側で想定外のエラーが返却された。
	2.	発生したエラーの原因は、
　・A画面からBシステムに渡したデータに不備があった可能性、または
　・Bシステム側で想定外のエラーが発生した可能性があるが、
　　現時点ではどちらが原因か判断できない状況である。
	3.	エラーコード「FMC0001」については、
　弊方ではIF仕様書や関連資料が一切なく、内容を把握することができない。

お手数をおかけいたしますが、ご確認のほどよろしくお願いいたします。



お疲れ様です。

BBXさんからご質問いただいた件について聞きたいです。

Aファイルに記載された2つのTACコードのうち、
追加日が「2022/05/19」となっているコードについてですが、
AAAファイル上では該当コードが見当たらず、追加対象の可能性が高いものの、追加日の記載に齟齬があるように見受けられました。

そのため、こちらとしては 「2025/06/10分だけが追加対象なのか、2022/05/19分も含まれるのか」 を念のため確認させていただきたく、
お手数ですがご教示いただけますでしょうか。

よろしくお願いいたします。


以下、事象の原因と対応方針についてご報告いたします。

【原因について】
GFD1000応対履歴一覧を表示した後、別のFMBC画面をバックグラウンドで開いた際に、
その操作によりセッションの初期化処理（clear）が発動され、
GFD1000応対履歴一覧のセッション情報が失われた状態で検索ボタンを押下したことで、
NullPointerExceptionが発生した、という認識です。

【対応方針】
現状のロジックでは、セッション情報に特定の値の欠損が起因で例外が発生する可能性があるため、
検索ボタン押下時にセッションが存在しない場合は、
アラートを表示して初期画面にリダイレクトさせる対応を検討しております。
こちらの対応方針で問題ないかご確認をお願いいたします。

■ 対応案についてご相談：
	1.	sessionがクリアされたタイミングで、該当画面上に「別画面が開かれたため、この画面を再表示してください」などの ポップアップを表示して初期画面にリダイレクトすることは可能でしょうか？
	2.	または、検索ボタン押下時に sessionが存在しない場合、アラート表示する対応も考えられますが、実現は可能でしょうか？
	3.	あるいは、SgmFGFZ2030Controller#initChの動作を sessionのクリアではなく、sessionの追加や統合とすることは可能でしょうか？
（業務的に矛盾してしまう場合は申し訳ありません、もし難しければその点ご教示いただけると助かります）

⸻

ご多忙のところ恐れ入りますが、ご確認のほどよろしくお願いいたします。



お疲れ様です。
顧客向けの説明整理のため、以下の点についてご確認・ご協力いただけますでしょうか。

画面名の記載
　GFZ1000ではなく、正しくは「GFD1000」画面でよろしいでしょうか？
　顧客向け説明に正確な画面名を記載したく、念のためご確認させてください。

クラスの処理内容について
　SgmFGFZ2030Controller#initCh に関して、クラス名ではなく「この処理が何をしているか（どんな影響があるか）」を簡単にご共有いただけますでしょうか。

通常操作との違いについて
　今回の操作は通常のオペレーションと何が違うか、違いが明確に分かるようにしたいため、ポイントがあれば教えていただけますと助かります。

お手数おかけしますが、よろしくお願いいたします。
Swift: Dictionary から Text に変換

## プログラム

```swift:text_write.swift
// -------------------------------------------------------------------------
//	text_create.swift
//
//						Oct/29/2024
//
// -------------------------------------------------------------------------
import Foundation

// -------------------------------------------------------------------------
func textWriteProc(fileOut: String, dictAA: [String: [String: Any]]) {
	do {
		let fileURL = URL(fileURLWithPath: fileOut)
		var strOut = ""
		
		for (key, unit) in dictAA {
			if let name = unit["name"] as? String,
			   let population = unit["population"] as? Int,
			   let dateMod = unit["date_mod"] as? String {
				strOut += "\(key)\t\(name)\t\(population)\t\(dateMod)\n"
			}
		}
		
		try strOut.write(to: fileURL, atomically: true, encoding: .utf8)
	} catch {
		fputs("*** error *** in textWriteProc ***\n", stderr)
		fputs("\(error)\n", stderr)
	}
}

// -------------------------------------------------------------------------
func dataPrepareProc() -> [String: [String: Any]] {
	var dictAA = [String: [String: Any]]()
	
	dictAA["t2381"] = ["name": "名古屋", "population": 32154, "date_mod": "2003-4-17"]
	dictAA["t2382"] = ["name": "豊橋", "population": 19473, "date_mod": "2003-5-r"]
	dictAA["t2383"] = ["name": "岡崎", "population": 98371, "date_mod": "2003-7-21"]
	dictAA["t2384"] = ["name": "一宮", "population": 51673, "date_mod": "2003-1-7"]
	dictAA["t2385"] = ["name": "蒲郡", "population": 36175, "date_mod": "2003-2-2"]
	dictAA["t2386"] = ["name": "常滑", "population": 31249, "date_mod": "2003-10-13"]
	dictAA["t2387"] = ["name": "大府", "population": 39581, "date_mod": "2003-12-24"]
	dictAA["t2388"] = ["name": "瀬戸", "population": 32875, "date_mod": "2003-11-18"]
	dictAA["t2389"] = ["name": "犬山", "population": 34871, "date_mod": "2003-4-15"]
	
	return dictAA
}

// -------------------------------------------------------------------------
fputs("*** 開始 ***\n", stderr)

let arguments = CommandLine.arguments
guard arguments.count > 1 else {
	fputs("Please provide output file path\n", stderr)
	exit(1)
}

let fileOut = arguments[1]
print(fileOut)

let dictAA = dataPrepareProc()

textWriteProc(fileOut: fileOut, dictAA: dictAA)

fputs("*** 終了 ***\n", stderr)
// -------------------------------------------------------------------------
```

## 実行コマンド

```bash
swift text_write.swift cities.txt
```

## 確認したバージョン

```text
$ swift --version
Swift version 6.0.1 (swift-6.0.1-RELEASE)
Target: x86_64-unknown-linux-gnu
```
TCP/IPとは

# TCP/IPの階層モデル
>`TCP/IPは通信プロトコルの集合体`であり、プロトコル群とも呼ばれています。`TCP/IPには4つの層`があり、それぞれのルールやプロトコルが適用される特定の条件が設けられていることで、`異なるデバイスやアプリ間の通信を可能にし、効率的にデータを転送`できるようにしています。ここでは、TCP/IPのそれぞれの階層モデル（model）について紹介します。

### アプリケーション層
>最上位層であるアプリケーション層には、私達がパソコンやスマートフォンからウェブサイトを閲覧する際に利用する「HTTP（Hypertext Transfer Protocol）」や「HTTPS」、メールの送信に使われる「SMTP（Simple Mail Transfer Protocol）」など、実際にアプリを活用する際のプロトコルが含まれています。通信する各アプリのほとんどは、文字や画像、動画などの人が目で見て認識できるデータを扱っています。これらのデータの中で使われている文字コードや画像の形式、送信するデータ形式などを細かく設定することで、データを転送することができています。加えて、データの暗号化など、セキュリティ関連の仕組みに関してもこのアプリケーション層で定義されています。

### トランスポート層
>トランスポート層は、膨大なプログラムやネットワークが存在するインターネット上でデータを送信先まで正しく届けるための重要な役割を担っています。そして、このトランスポート層では、TCPとUDPの2種類のプロトコルが利用されています。もちろん、TCPとUDPの違いはあります。前述した通りTCPは、データを伝送する際により安全性を重視するプロトコルのことです。一方、UDP（User Datagram Protocol）は、TCPほど安全性を必要としませんが、利用速度が速くて即時性が求められるアプリでよく使用されています。具体的には、TCPはウェブサイトの閲覧やメール送受信で利用されるパケットを交互に送り続ける「コネクション型」と呼ばれる方式で、UDPの場合は音声通話や動画配信など送信側から受信側に一方的に送り続ける「コネクションレス型」、もしくは「データグラム型」方式で、用途によってどちらかの通信方法を活用します。

### インターネット層
>インターネット層は、複数の異なるネットワーク間でのデータパケットの移動を管理しています。TCP/IPの4階層モデルでは、IPプロトコルが利用されていますが、その中でもIPv4とIPv6と呼ばれる2種類のプロトコルがIPアドレスを管理するために活用されています。また、インターネット層のプロトコルには、IPの他にもARP（アドレス解決プロトコル）、IGMP（インターネットグループ管理プロトコル）、ICMP（インターネット制御メッセージプロトコル）などがあります。

### ネットワークインターフェース層
>ネットワークインターフェース層は、`データ転送の最深層`で`データリンク層`とも呼ばれており、主に`同じネットワーク内でデータを送受信するための転送を管理`しています。具体的には、有線LANのEthernetや無線LANのWi-Fiのような同一ネットワークを構築する際に、`目的のデバイスを識別する固有の番号であるMACアドレスを特定`し、ルーターに正しく接続します。ただし、場合によっては`「データの転送速度」`や`「直接データ転送可能な距離」`や`「Wi-Fiの場合の転送速度の違い」`などによって細分化されます。

https://nordvpn.com/ja/blog/tcp-ip/#:~:text=%E6%A9%9F%E8%83%BD%E3%81%97%E3%81%BE%E3%81%99%E3%80%82-,TCP/IP%E3%81%AE%E9%9A%8E%E5%B1%A4%E3%83%A2%E3%83%87%E3%83%AB,%E8%BB%A2%E9%80%81%E9%80%9F%E5%BA%A6%E3%81%AE%E9%81%95%E3%81%84%E3%80%8D%E3%81%AA%E3%81%A9%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E7%B4%B0%E5%88%86%E5%8C%96%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82,-TCP/IP%E9%80%9A%E4%BF%A1

# 感想
TCP/IPとはプロトコルではなくプロトコルの集まりのことをいう。
AutoCADに記入するためのExcel①

[button]

ファイル名入力スペース
シート生成ボタン
+-ファイル名の数だけシートを作成
BOM書式変更ボタン
+-BOMの文字形式を変更
シート合体ボタン
+-すべてのシートを一つにまとめる
合体シート部品数調査ボタン
+-まとめたシートの部品数だけをぴっけアップ


【課題】
シート合体ボタンと合体シート部品数調査ボタンはまとめることができるはず
spring.sql.init.modeの詳細機能

　SpringBootのJUnitによるテスト設定で、「`spring.sql.init.mode=always`って設定する必要あるの？、`@Transactional`があれば不要じゃない？」と思っていたのが完全に間違いであったので、その詳細を解説する。

　結論としては、（私のプロジェクト内では）
- `spring.sql.init.mode=always`は不要
- `spring.sql.init.mode`と`@Transactional`は無関係

# 前提条件
### 環境
|IDE|言語|APPフレームワーク|テストフレームワーク|SQL制御|SQL|
|:---:|:---:|:---:|:---:|:---:|:---:|
|IntelliJ IDEA 2024.1.4|java 21.0.4|Spring Boot 3.3.3|JUnit 5|MyBatis 3.0.3|MySQL 8.0.39|

# インメモリDBと組み込みDB
　後のテスト用データベース設定の話をする前に、この2つの違いを把握しておく必要がある。
　また、この記事内では以降データベースが下記の各状態になっていることをそれぞれインメモリモード、組み込みモードと呼ぶこととする。

### インメモリデータベース
　データをメモリ上に保持するデータベースであり、メモリから直接アクセスするため、通常のディスクベースのデータベースよりも高速にデータを読み書きできる。
　ただし、メモリ上にしかデータを保存しないため、アプリケーションが終了したりシステムが再起動されたりすると、データが失わる。

### 組み込みデータベース
　アプリケーション内部に組み込まれ、アプリケーションと一緒に実行されるデータベースであり、アプリケーションから直接アクセス可能である。
　通常、永続的なストレージ（ディスクやファイル）にデータを保存する機能を持っている。

# spring.sql.init.modeの機能
　[Spring Boot公式ドキュメント（使い方一覧-データの初期化）](https://spring.pleiades.io/spring-boot/how-to/data-initialization.html#howto.data-initialization)にはデータベースの初期化に関して以下の記載がある。

> デフォルトでは、SQL データベースの初期化は、組み込みのメモリ内データベースを使用する場合にのみ実行されます。SQL データベースをその型に関係なく常に初期化するには、spring.sql.init.mode を always に設定します。同様に、初期化を無効にするには、spring.sql.init.mode を never に設定します。

　また、[Spring Boot公式ドキュメント（API一覧）](https://spring.pleiades.io/spring-boot/appendix/application-properties/)で以下のように記載がある。

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812368/2ce27676-82e9-5c51-6263-c235ec99aa7e.png)

　抽出したので分かりづらいが、`spring.sql.init.mode`のデフォルトは`embedded`であり、組み込みデータベースに対してはSQLスクリプト（私の環境では`schema.sql`と`data.sql`）による初期化を実施するということを意味していると思われる。
 
# H2DBのモード設定
　H2DBではモード指定がない場合、デフォルトではインメモリモードで設定される。組み込みモードで使用する場合には、application.propertiesにてJDBC URLにファイルパスを指定する必要がある。具体的には以下の検証を参照されたい。

# 実例での検証
　私のあるプロジェクトでは以下のような設定でテストを実施している。
```application.properties
spring.sql.init.mode=always
spring.datasource.url=jdbc:h2:~/test;MODE=MySQL
spring.datasource.username=sa
spring.datasource.password=sa
spring.datasource.driver-class-name=org.h2.Driver
spring.h2.console.enabled=true
```
　冒頭で記載したように、`spring.sql.init.mode=always`があってもなくても関係ないと勘違いしたのは下記の理由による。

　[H2DBのモード設定](#H2DBのモード設定)で述べた通り、
 `spring.datasource.url=jdbc:h2:~/test;MODE=MySQL`で、H2DBを組み込みモードに設定しているため、`spring.sql.init.mode=always`がない場合でも`spring.sql.init.mode=embedded`が設定されているためにH2DBの初期化が毎回行われていたということである。
　ちなみに、`spring.datasource.url=jdbc:h2:~/test;MODE=MySQL`では、CドライブのUSERディレクトリに`test.db`というファイルが作成される（エクスプローラで確認済）。
CSS　辞書

# 問題
HTMLやCSSの記述は、プログラミング初心者にとって最初の難関であり、乗り越えても使わなければ忘れてしまうことが多いと思います。私自身もその一人です。今回は、あるサイトを模写してCSSを学習した内容を、自分用の辞書的な参考資料としてまとめてみました。参考になれば幸いです

## CSSまとめ
### インライン要素同士を重ねたい
```css
position: relative; /*基準となる親要素へ*/
position: absolute; /*動かしたい子要素へ*/
```
`position: absolute;`をつけた子要素は`position: relative;`が効いている一番近くの親要素を探す。親要素がなければ、基準は画面左端になる。
position:absoluteをつけた子要素に
```css
top: 200px;
left: 100px;
```
とかを指定することにより。親要素に対して、上から200px、左から100px離れた位置（＝右に動く）においておくことができる。

### placeholderを動かしたい
```css
padding-left: 10px;
```
にすればできる。
これが
![スクリーンショット 2024-10-29 9.36.14（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3893783/edab9230-63b4-7d74-be47-608447be62ce.png)
こう
![スクリーンショット 2024-10-29 9.36.27（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3893783/5f123dac-9e98-d39f-7a2d-8b682972f072.png)


### ブロック要素を横並びにしたい
floatを使用する。親ではなく、**移動したい要素**に指定する
```css
float: left;
float: right;
```
### インライン要素を右寄せにしたい
```css
text-align: right;
```

### インライン要素の大きさを変えたい
①文字の大きさを変える
```css
font-size: 25px;
```
:::note
fontawesomeを使用したiタグも`font-size`で変更することができる
:::

②display: inline-blockを使用する
`display: inline-block`として、widthやheightを指定する
:::note
spanタグをdisplay: inline-blockで大きさを変えることができる
:::


# 感想
インライン要素やブロック要素を意識しながら模写していくことが大切だと感じた。
以前は、自分でテストサイトを作成する際、bootstrapに頼っていた。それでは力がついていないと感じる。まずは、基本的なことをもう一度学習して、応用でbootstrapを使用できたらいいと思う。
MapBoxで日本語地図出して、現在位置にピンを立てる(メモ)

「CDNを使用する場合」で、やってみました。
かなり時間が掛かってしまったので、ここにメモしときます。
MapBoxは情報量が少ないのかも？
Google Maps API先生の方に乗り換えようかと…

参考にさせて頂いたサイトです。ありがとうございます。
https://qiita.com/katsunobu1008/items/21ca264d5793d23df9fe
https://qiita.com/mizo__/items/090cf6eb4151fb4d6725

```html:html
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>地図表示</title>

    <script src="https://api.mapbox.com/mapbox-gl-js/v2.1.1/mapbox-gl.js"></script>
    <link href="https://api.mapbox.com/mapbox-gl-js/v2.1.1/mapbox-gl.css" rel="stylesheet" />
    
    <!-- 日本語化追記 -->
    <script src='https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-language/v1.0.0/mapbox-gl-language.js'></script>

    <style>
        html { height: 100% }
        body { height: 100% }
        #map { height: 100%; width: 100%}
    </style>
</head>

<body>
    <div id='map'></div>

    <script>
        mapboxgl.accessToken = 'あなたのトークンをここに書く';

        var map = new mapboxgl.Map({
            container: 'map',
            style: 'mapbox://styles/mapbox/streets-v11',
            //center: [139.7670516, 35.6811673], //東京駅
            //zoom: 15
        });
    
        //日本語化追記
        const language = new MapboxLanguage();
        map.addControl(language);
    
    
        // 位置情報の取得に成功した時の処理
        function success(position) {
            const latitude = position.coords.latitude;
            const longitude = position.coords.longitude;

            // マーカーを作成し、地図に追加
           new mapboxgl.Marker({color:'red'})
                .setLngLat([longitude, latitude])
                .addTo(map);

            // 地図の中心をユーザーの現在位置に移動
            map.flyTo({
                center: [longitude, latitude],
                zoom: 15
            });
        }

        // 位置情報の取得に失敗した時の処理
        function error() {
            alert('位置情報の取得に失敗しました。');
        }

        // ユーザーの位置情報を取得
        if ('geolocation' in navigator) {
            navigator.geolocation.getCurrentPosition(success, error);
        } else {
            alert('お使いのブラウザでは、位置情報の取得がサポートされていません。');
        }
    </script>

</body>
</html>
```
TypeScript基礎

TypeScriptは、JavaScriptに静的型付けを追加することで、より堅牢なコードを書けるようにしたプログラミング言語です。**TypeScriptはJavaScriptのスーパーセット**として設計されているため、既存のJavaScriptに型の概念を導入するだけで、開発の効率と品質を高められます。本記事では、TypeScriptの基本的な使い方と重要な概念を紹介します。

**特にTypescript×Reactは現在多くの企業に利用されています。
Reactについての記事もだしていますので、そちらも読んでいただければ嬉しいです。**

# 1. TypeScriptの特徴とメリット
静的型付け: 変数や関数に型を指定することで、実行前に型のミスを検出できます。
JavaScriptとの互換性: すべてのJavaScriptコードは有効なTypeScriptコードです。
開発効率の向上: 開発中にエラーを発見しやすく、保守が容易になります。

# 2. TypeScriptのインストールと環境構築
TypeScriptの環境を構築するには、Node.jsがインストールされている必要があります。

インストール手順
TypeScriptのインストール
```
npm install -g typescript
```

バージョン確認
```css
tsc --version
```

# 3. 型の基本
**(1) 基本的な型の定義**
TypeScriptでは、変数に対して型を指定します。

```typescript
let message: string = "Hello, TypeScript!";
let count: number = 42;
let isActive: boolean = true;
string: 文字列型
number: 数値型
boolean: 真偽値型
```

**(2) 配列とタプル**
配列は要素の型を指定します。

```typescript
let numbers: number[] = [1, 2, 3, 4];
let user: [string, number] = ["Alice", 25];  // タプル型
```

**(3) オブジェクトの型**
オブジェクトは、そのプロパティに型を指定します。

```typescript
let person: { name: string; age: number } = {
  name: "Bob",
  age: 30,
};
```

# 4. 関数の型定義
**(1) 基本的な関数の型指定**
関数の引数や戻り値の型も定義できます。
```typescript
function greet(name: string): string {
  return `Hello, ${name}!`;
}
```

**(2) オプション引数**
引数が必須ではない場合、?を使います。

```typescript
function greet(name: string, greeting?: string): string {
  return `${greeting || "Hello"}, ${name}!`;
}
```

# 5. インターフェース
インターフェースは、オブジェクトの構造を定義します。

```typescript
interface User {
  id: number;
  name: string;
  isActive: boolean;
}

let user: User = {
  id: 1,
  name: "Taro",
  isActive: true,
};
```

# 6. クラスと継承
TypeScriptでは、オブジェクト指向プログラミングがサポートされています。

```typescript
class Animal {
  name: string;

  constructor(name: string) {
    this.name = name;
  }

  move(distance: number = 0) {
    console.log(`${this.name} moved ${distance}m.`);
  }
}

class Dog extends Animal {
  bark() {
    console.log("Woof! Woof!");
  }
}

let dog = new Dog("Rex");
dog.bark();
dog.move(10);
```

# 7. 型推論と型ガード
**(1) 型推論**
TypeScriptは、初期値から型を推論します。

```typescript
let age = 25;  // number型と推論される
```

**(2) 型ガード**
typeof演算子を使って型をチェックし、実行時のエラーを防ぎます。

```typescript
function isString(value: any): value is string {
  return typeof value === "string";
}
```

# 8. ジェネリクス（Generics）
ジェネリクスは、型の再利用を可能にします。

```typescript
function identity<T>(arg: T): T {
  return arg;
}

let result = identity<number>(42);
```

# 9. TypeScriptのコンパイルと実行
コンパイル
TypeScriptファイル（hello.ts）をJavaScriptに変換します。

```bash
tsc hello.ts
```
```
node hello.js
```

# 10. まとめ
**学習のポイントまとめ:**

基本の型から始め、関数、クラス、インターフェースを活用する。
TypeScriptの型チェック機能でエラーを未然に防ぐ。
Reactなどのフレームワークと組み合わせて実践的な開発を行う。
これからJavaScriptを学ぶ方、または既にJavaScriptを使っている方も、TypeScriptを導入することで、開発の効率と品質が向上します。

**最後までよんでいただきありがとうございます。
毎日更新していますので、@y-t0910をフォロー,いいねしていただけると嬉しいです！**
韓国語の形態素解析をJavaで行う

# 概要

韓国語の形態素解析器はいくつか存在するようですが、「open-korean-text」がよさそうでした。

https://github.com/open-korean-text/open-korean-text?tab=readme-ov-file

# maven

```xml
  <dependency>
    <groupId>org.openkoreantext</groupId>
    <artifactId>open-korean-text</artifactId>
    <version>2.1.0</version>
  </dependency>
  ```

  # サンプルコード

  ```java
package hello;

import java.util.List;

import org.openkoreantext.processor.KoreanTokenJava;
import org.openkoreantext.processor.OpenKoreanTextProcessorJava;
import org.openkoreantext.processor.tokenizer.KoreanTokenizer;

import scala.collection.Seq;

public class HelloOpenKoreanTextMain2 {

	public static void main(String[] args) {

		// 今日は天気がよいので学校に歩いて行った
		String text = "오늘은 날씨가 좋아서 걸어서 학교에 갔다.";

		// Normalize
		CharSequence normalized = OpenKoreanTextProcessorJava.normalize(text);

		// Tokenize
		Seq<KoreanTokenizer.KoreanToken> tokens = OpenKoreanTextProcessorJava.tokenize(normalized);

		List<KoreanTokenJava> kk = OpenKoreanTextProcessorJava.tokensToJavaKoreanTokenList(tokens);

		for (KoreanTokenJava k : kk) {
			System.out.println("begin: " + k.getOffset());
			System.out.println("end: " + (k.getOffset() + k.getLength()));
			System.out.println("length: " + k.getLength());
			System.out.println("lex: " + k.getStem()); // LEX 原型
			System.out.println("str: " + k.getText()); // STR
			System.out.println("pos: " + k.getPos().name()); // JOSA 助詞 Noun 名詞 Adjective 形容詞 Verb 動詞 Punctation ピリオド
			System.out.println("isUnknown: " + k.isUnknown());
			System.out.println("---");
		}

	}

}

  
  ```

  # 結果

  形態素解析の結果は以下のようになります。韓国語には日本語と同様に動詞・形容詞の活用がありますが、きちんと原型が取得できています。「갔다（行った）」の原型「가다（行く）」が取れています。

  ```
 begin: 0
end: 2
length: 2
lex: 
str: 오늘
pos: Noun
isUnknown: false
---
begin: 2
end: 3
length: 1
lex: 
str: 은
pos: Josa
isUnknown: false
---
begin: 4
end: 6
length: 2
lex: 
str: 날씨
pos: Noun
isUnknown: false
---
begin: 6
end: 7
length: 1
lex: 
str: 가
pos: Josa
isUnknown: false
---
begin: 8
end: 11
length: 3
lex: 좋다
str: 좋아서
pos: Adjective
isUnknown: false
---
begin: 12
end: 15
length: 3
lex: 걸다
str: 걸어서
pos: Verb
isUnknown: false
---
begin: 16
end: 18
length: 2
lex: 
str: 학교
pos: Noun
isUnknown: false
---
begin: 18
end: 19
length: 1
lex: 
str: 에
pos: Josa
isUnknown: false
---
begin: 20
end: 22
length: 2
lex: 가다
str: 갔다
pos: Verb
isUnknown: false
---
begin: 22
end: 23
length: 1
lex: 
str: .
pos: Punctuation
isUnknown: false
---

  ```


  以上.
DDoS攻撃対策におけるAWS Shield Advancedの活用

# 概要

DDoS攻撃対策に特化したマネージドサービス「AWS Shield Advanced」の概要、機能、料金について詳しく説明します。

## DDoS攻撃の現状

DDoS（Distributed Denial of Service）攻撃は、複数のリソースからターゲットに過剰な負荷をかけ、サービスを不能にすることを目的としています。最近のデータによると、DDoS攻撃の件数は毎年100万件以上で、特にアプリケーションレイヤーの攻撃が増加しています。

## AWS Shieldの2つのサービス

### Shield Standard

Shield Standardは、全てのインターネットに面したAWSのサービスに自動的に適用され、ネットワークレイヤーとトランスポートレイヤーの攻撃を緩和します。特に設定は不要で、追加料金も発生しません。

### Shield Advanced

Shield Advancedは、12ヶ月のサブスクリプション料金がかかる有料サービスで、お客様固有のリソースをDDoS攻撃から保護します。具体的な機能としては、DDoS攻撃の可視化、緩和機能、専門チームの支援が含まれます。


## Shield Advancedの機能

Shield Advancedでは、以下のサービスを保護対象としています。

- Amazon CloudFront
- Elastic Load Balancer（アプリケーションロードバランサー、クラシックロードバランサー）
- Amazon Route 53

自動緩和機能により、アプリケーションレイヤーのDDoS攻撃に迅速に対応でき、攻撃の状況をレポートで可視化することが可能です。また、AWS CloudWatchのメトリクスを利用して、リアルタイムでモニタリングが行えます。

## DDoS攻撃対策のベストプラクティス

DDoS攻撃対策には、Shield Advancedの導入だけでなく、アーキテクチャ全体の見直しも重要です。AWSでは、DDoS攻撃対策に関するホワイトペーパーも提供していますので、ぜひご参照ください。
[AWS DDoSレジリエンシーのベストプラクティス](https://docs.aws.amazon.com/ja_jp/whitepapers/latest/aws-best-practices-ddos-resiliency/mitigation-techniques.html)
## 料金について

Shield Advancedの料金は月額3000ドルのサブスクリプション料とデータ転送料金がかかります。具体的な料金プランはリソースタイプによって異なるため、事前に確認が必要です。


## まとめ

AWS Shieldは自動化され、常に稼働しているDDoS緩和サービスです。Shield Advancedを利用することで、アプリケーションレイヤーのDDoS攻撃に対する自動化ルールを適用でき、攻撃の検出精度を向上させることができます。また、攻撃によるコスト増加に対してクレジットの申請が可能です。

DDoS攻撃対策に役立つ情報となれば幸いです。最後までご視聴いただき、ありがとうございました！