OmniAICreator/Qiita-1.07M huggingface dataset:
windowsでiverilog その175

# 概要　
windowsでiverilogやってみた。
74181なverilog見つけたので、やってみた。

# 74181は、ALU
TTL集積回路として実装された4ビット・スライス演算装置(Arithmetic Logic Unit; ALU)です。

# 参考にしたページ

https://qiita.com/triggerfish/items/54cb06461124b5b19064

# サンプルコード

```

module alu(output wire f, output wire co_x, input wire a, input wire b, input wire ci_x, input wire [3:0] s, input wire m);
	wire g;
	wire h;
	assign g = !(a | (b & s[0]) | (!b & s[1]));
	assign h = !((!b & s[2] & a) | (a & s[3] & b));
	assign co_x = (g | (h & ci_x));
	assign f = !(!m & ci_x) ^ g ^ h;
endmodule

module alu74181 #(parameter WIDTH = 4) (output wire [WIDTH - 1:0] f, output wire co_x, input wire [WIDTH - 1:0] a, input wire [WIDTH - 1:0] b, input wire ci_x, input wire [3:0] s, input wire m);
	genvar i;
	wire [WIDTH:0] c_x;
	assign c_x[0] = ci_x;
	assign co_x = c_x[WIDTH];
	generate
		for (i = 0; i < WIDTH; i = i + 1)
		begin
			alu alu_ins(.f(f[i]), .co_x(c_x[i + 1]), .a(a[i]), .b(b[i]), .ci_x(c_x[i]), .s(s), .m(m));
		end
	endgenerate
endmodule

module test;
	wire [3:0] f;
	reg [3:0] a;
	reg [3:0] b;
	reg cy;
	reg [3:0] s;
	reg m;
	task check_alu(input [3:0] ai, input [3:0] bi, input c, input [3:0] si, input mi);
	begin
		a = ai;
		b = bi;
		cy = c;
		s = si;
		m = mi;
	#1 
		$display("a=%d b=%d cy=%d s=%d m=%d f=%d", a, b, cy, s, m, f);
	end
	endtask
	alu74181 u(.f(f), .a(a), .b(b), .ci_x(cy), .s(s), .m(m));
	initial 
	begin
		$display("ADD");
		check_alu('h0, 'h0, 1, 'h9, 0);
		check_alu('h1, 'h1, 1, 'h9, 0);
		check_alu('h3, 'h3, 1, 'h9, 0);
		check_alu('h7, 'h7, 1, 'h9, 0);
		$display("SUB");
		check_alu('h9, 'h0, 0, 'h6, 0);
		check_alu('h9, 'h3, 0, 'h6, 0);
		check_alu('h9, 'h6, 0, 'h6, 0);
		$display("XOR");
		check_alu('h0, 'h0, 0, 6, 1);
		check_alu('h0, 'h1, 0, 6, 1);
		check_alu('h1, 'h0, 0, 6, 1);
		check_alu('h1, 'h1, 0, 6, 1);
		$display("AND");
		check_alu('h0, 'h0, 0, 'hb, 1);
		check_alu('h0, 'h1, 0, 'hb, 1);
		check_alu('h1, 'h0, 0, 'hb, 1);
		check_alu('h1, 'h1, 0, 'hb, 1);
		$display("OR");
		check_alu('h0, 'h0, 0, 'he, 1);
		check_alu('h0, 'h1, 0, 'he, 1);
		check_alu('h1, 'h0, 0, 'he, 1);
		check_alu('h1, 'h1, 0, 'he, 1);
	end
endmodule





```

# 実行結果

```
>vvp a.out
ADD
a= 0 b= 0 cy=1 s= 9 m=0 f= 0
a= 1 b= 1 cy=1 s= 9 m=0 f= 2
a= 3 b= 3 cy=1 s= 9 m=0 f= 6
a= 7 b= 7 cy=1 s= 9 m=0 f=14
SUB
a= 9 b= 0 cy=0 s= 6 m=0 f= 9
a= 9 b= 3 cy=0 s= 6 m=0 f= 6
a= 9 b= 6 cy=0 s= 6 m=0 f= 3
XOR
a= 0 b= 0 cy=0 s= 6 m=1 f= 0
a= 0 b= 1 cy=0 s= 6 m=1 f= 1
a= 1 b= 0 cy=0 s= 6 m=1 f= 1
a= 1 b= 1 cy=0 s= 6 m=1 f= 0
AND
a= 0 b= 0 cy=0 s=11 m=1 f= 0
a= 0 b= 1 cy=0 s=11 m=1 f= 0
a= 1 b= 0 cy=0 s=11 m=1 f= 0
a= 1 b= 1 cy=0 s=11 m=1 f= 1
OR
a= 0 b= 0 cy=0 s=14 m=1 f= 0
a= 0 b= 1 cy=0 s=14 m=1 f= 1
a= 1 b= 0 cy=0 s=14 m=1 f= 1
a= 1 b= 1 cy=0 s=14 m=1 f= 1

```

以上。
picoCTF 2022 writeup Includes

## Includes (Web Exploitation)

Can you get the flag?  
Go to this [website](http://saturn.picoctf.net:64702/) and see what you can discover.

とりあえず、記載のリンクを開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638553/ebb8ae71-b31a-4c3d-aa0d-2dca6015f04b.png)
includeについての説明が書かれている。
おそらくincludeに当たる部分を見れば良いだろう。
Devtoolのnetworkタブを見てみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638553/f682d6fd-ee8b-d779-f800-7eb009142f15.png)
syte.cssとscript.jsというファイルが読み込まれていることが分かる。
それぞれのファイルを見てみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638553/8f8d3c1f-f256-e4bf-9867-2c4448515de1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638553/116fea44-4572-62e1-a335-7ab2329357cd.png)

フラグが得られた。

`picoCTF{1nclu51v17y_1of2_f7w_2of2_df589022}`
SyncthingによるObsidianのMacWin間ファイル同期

# Obsidianとは
Obsidian（オブシディアン）とはMarkdown形式のテキストファイルをベースにノートを管理するノート管理アプリケーションです．クラウド上ではなく，ローカルにMarkdownファイルを保存するため，自分のデータを手元のローカル環境で管理できることがメリットになります．ちなみにObsidianというのは黒曜石を意味する英単語らしいです．
インストール方法は以下のページで確認できます。

https://help.obsidian.md/Getting+started/Download+and+install+Obsidian

# Syncthingとは
Syncthing（シンクシング）は，複数の端末同士でファイルを直接同期するためのオープンソースのP2Pファイル同期アプリです．こちらもクラウドに依存せず，ユーザーの環境下で端末間を相互に同期できる点が大きな特徴です．
インストール方法は以下のページで確認できます。

https://syncthing.net/downloads/

# やりたいこと
Obsidianの良さはローカル環境でノート管理が可能なことですが，その反面，複数端末でのファイル内容の同期が難しいという欠点があります．筆者は職場でwindowsのデスクトップ，普段はmacbookAirを利用しているため，2台の端末間でノートの内容を同期したく，今回の方法を試しています．Obsidianの公式同期機能もあるようですが，有料です．OneDriveやicloudを使って同期することも考えましたが，windowsとmac間の同期は反映に時間がかかることが多かったため断念しました．

# 1. 複数端末間でフォルダを共有する流れ
Syncthingでは「フォルダ」と「デバイス」をペアで登録して同期します．端末には固有のID（デバイスID）が付与されるため，同期したいフォルダのある端末間で相互にデバイスIDとフォルダパスを登録します．

端末A（PCなど）と端末B（別のPCやノートPCなど）でそれぞれ Syncthing を起動．
端末Aの管理画面で，端末BのデバイスIDを登録．
端末Bの管理画面で，端末AのデバイスIDを登録．
いずれかの端末で相手のIDを追加すると，相手の画面でも「この端末を承認するか？」というリクエストが表示されます．承認してお互いを認識させる形です．
### 1) フォルダを追加する
端末Aで Syncthing の管理画面を開き，「Add Folder」または「Create Folder」のようなボタンをクリックし，同期したいフォルダを選択します．
フォルダパス（例：C:\Users\YourName\ObsidianVaultなど）と、フォルダIDを設定．
同期対象にするデバイス（端末Bなど）にチェックを入れるとフォルダごとにどの端末と同期するかを指定できます．

### 2) 相手端末でフォルダを受け入れる
端末B側の Syncthing 画面に「フォルダ共有リクエスト」のようなものが表示されます．許可（Accept）すると，端末Bにも同じフォルダIDでフォルダが作成されるよう求められます．端末B側で「どのパスに同期するか？」を指定すれば，以後そのフォルダがAとB間で自動同期（両方の端末がオンラインである必要があります）されます．

### 3) 同期の開始
登録が完了すると，フォルダ内のファイルが自動で転送され，双方の端末で同じ内容になります．同期完了までの進捗が管理画面に表示されます．

# 3. Obsidian Vault を同期する例
Obsidian で使う Vaultをそのまま Syncthing で共有する手順を示します．vaultとは，Obsidianのノートの内容や情報をすべて管理するフォルダのことです．

### 1)Obsidian 側で Vault フォルダを用意
たとえば C:\ObsidianVault というフォルダを作成し，そこに Markdown ファイルを保存しているとします．

### 2)Syncthing でフォルダを追加
端末Aの Syncthing 管理画面で「Add Folder」を選び，C:\ObsidianVault を指定します．フォルダの名前やID，同期先として端末Bを指定し，「Save」もしくは「Add」を押します．

### 3)端末Bで受け入れ
端末Bの Syncthing に「フォルダ XYZ を受け入れますか？」と表示されるので，承認します．　端末B側で D:\ObsidianVault のような同期先フォルダを指定し，
「Save」を押します．

### 4)端末Bで Obsidian の Vault として開く
端末Bにファイルが同期完了したら，Obsidian で D:\ObsidianVault を開いて同じノートを閲覧・編集できます．以後，AやBでノートを更新すると，お互いの端末がオンラインなら自動的に変更が同期される用になります．複数端末で同時編集をすると，コンフリクトが起こるので，コンフリクトが起こりそうな作業は極力避けて，作業後に同期が完了していることを確認してから別端末を開くなどの対策をとりましょう．

![スクリーンショット 2025-01-04 13.36.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3977103/9321e863-c225-e628-0d8b-4609e3d450d6.png)
Bootstrapを特定タグ配下のみで有効にするため、`postcss-prefixwrap`でセレクタを変更する

## はじめに
bootstrapがclass="bootstrap-scope"の内部にだけ適用されるようにするため、
`postcss-prefixwrap`を使って、全てのセレクタの前に`.bootstrap-scope`を追加することで適用範囲を限定します

```html
<div class="bootstrap-scope">
  <!-- Bootstrapのスタイルが適用される領域 -->
  <button class="btn btn-primary">Bootstrap Button</button>
</div>
```
既存環境にBootstrapを適用すると全体のレイアウトが変わってしまうような場合に、範囲を限定して適用することができます

## 1. 必要なライブラリをインストール

```
$ npm init -y
$ npm install bootstrap postcss postcss-cli postcss-prefixwrap
```

## 2. PostCSS設定ファイルを作成

* bootstrapの全てのセレクタの前に`.bootstrap-scope`を追加する設定を行う

```js:postcss.config.js
const prefixWrap = require('postcss-prefixwrap');

module.exports = {
  plugins: [
    prefixWrap('.bootstrap-scope')
  ]
};
```

## 3. PostCSSで処理

```
$ npx postcss node_modules/bootstrap/dist/css/bootstrap.min.css -o scoped-bootstrap.css
```

## 4. 動作確認

動作確認用htmlを作成します

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="stylesheet" href="scoped-bootstrap.css">
  <title>範囲限定Bootstrapテスト</title>
</head>
<body>
  <div class="bootstrap-scope">
    <!-- bootstrap適用領域 -->
    <button class="btn btn-primary">Bootstrap Button</button>
  </div>
  <!-- bootstrap適用範囲外 -->
  <button class="btn btn-primary">Default Button</button>
</body>
</html>
```

動作確認のため簡易webサーバーを起動します

```
$ npx http-server .
```

`<div class="bootstrap-scope">`配下のみBootstrapが適用されることが確認できました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276579/4c581b1a-3972-970a-9c19-aced2732ace0.png)
ReactNativeで作成したアプリからActix Webで作成したAPIをfetchできなかった話

# 前提

バックエンド: Actix Web(Rust)
モバイル: React Native

# 現象

```ReactNative
export default function HomeScreen() {
	const [text, setText] = useState("");
	useEffect(() => {
		fetch("http://localhost:8080/", {
			headers: {
				"Content-Type": "application/json",
			},
		})
			.then(async (response) => {
				setText(await response.text());
			})
			.catch((error) => {
				console.log(error);
			});
	}, []);
	return (
    // 以下略
```

```Rust
use actix_web::{get, post, web, App, HttpResponse, HttpServer, Responder};

#[get("/")]
async fn hello() -> impl Responder {
    HttpResponse::Ok().body("Hello world!")
}

#[post("/echo")]
async fn echo(req_body: String) -> impl Responder {
    HttpResponse::Ok().body(req_body)
}

async fn manual_hello() -> impl Responder {
    HttpResponse::Ok().body("Hey there!")
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| {
        App::new()
            .service(hello)
            .service(echo)
            .route("/hey", web::get().to(manual_hello))
    })
    .bind(("127.0.0.1", 8080))?
    .run()
    .await
}
```

上記のコードの際に、AndroidからAPIをfetchできなかった。（`[TypeError: Network request failed]`というエラーが出ていた）
ブラウザで`http:localhost:8080`を叩いたり、`http://127.0.0.1:8080`を叩く場合は問題なし。

# 解決方法
Actix Webでbindする値を`"0.0.0.0", 8080`に変更し、
ReactNativeのコードではfetchする箇所を
`http://192.168.40.31:8080/`
上記のようにドメインをプライベートipアドレスにしたらAPIが取得できた。

# 参考
https://ja.stackoverflow.com/questions/94827/actix-web-%E3%81%A7%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%9F%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AB%E5%88%A5%E3%81%AE%E7%AB%AF%E6%9C%AB%E3%81%8B%E3%82%89%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84
https://qiita.com/1ain2/items/194a9372798eaef6c5ab
アカウントの認証情報のステータスが欲しい

# 背景
AWS認定資格の勉強をしていたら、アカウントのIMAユーザーパスワードやアクセスキーが最後に利用されたのがいつなのかが気になった。

# やったこと
IAMから認証情報レポートをダウンロードすればアカウントのIMAユーザーのパスワードやアクセスキーのステータスがわかると「AWSのre:Post」に記載されていました。
[不正なアクティビティに気づいた場合](https://repost.aws/ja/knowledge-center/potential-account-compromise)

# 認証情報レポートとは
公式ドキュメントでは以下のように記載されています。
> アカウントのすべてのユーザーと、ユーザーの各種認証情報 (パスワード、アクセスキー、MFA デバイスなど) のステータスが示された認証情報レポートを生成し、ダウンロードできます。
>認証情報レポートを使用して、監査やコンプライアンスの作業を支援することができます。このレポートを使用して、パスワードやアクセスキーの更新など、認証情報ライフサイクルの要件の効果を監査できます。外部の監査人にこのレポートを提供することも、監査人が直接このレポートをダウンロードできるようにアクセス権限を付与することもできます。
[認証情報レポートの生成する](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_getting-report.html)
>
つまり、**アカウント内の各IAMユーザーやルートユーザーのセキュリティ資格情報の状態を詳細にまとめたCSV形式のレポート**かなと思います。
公式ドキュメントにもありますが、監査の際にセキュリティ資格情報を確認する際にも利用されそうですね。


#### どういった場面でほしい？
- 不正アクセスがあった場合にどのパスワードやアクセスキーがいつ使われたかが知りたい

#### ポイント
- csv形式のファイルをダウンロードすればアカウント内のユーザーの認証情報のステータスがわかる

## 使ったよ
### マネジメントコンソールへサインイン
1\. IAMのコンソール画面に移動
2\.画面左の「認証情報レポート」をクリックして、「認証レポートをダウンロード」をクリックすると、csvファイルがダウンロードされます。
![認証レポートダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659733/f70214f1-ab31-1858-7bf3-1f2ccd129ed5.png)
ダウンロードしたcsvファイルを開くと以下のような感じになる
![csvをダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659733/94b03ba3-71eb-41fc-c10d-e93f46ca79aa.png)
### 利用されたパスワードとアクセスキーの確認項目
先ほど開いたcsvファイルで確認する箇所を説明します。
###### user
アカウント内の各ユーザ名
###### arn
ユーザーの Amazon リソース名
###### password_last_used
ユーザーに設定したパスワードがいつ最後に利用されたのがわかります。そのため、いつIAM IDが利用されたかがわかると思います。
###### password_last_changed
ユーザーのパスワードが最後に更新された日時を表します。そのため、利用された際にパスワードが更新されたかがわかると思います。
###### access_key_1_last_used_dateまたはaccess_key_2_last_used_date
ユーザーに対するアクセスキーが最後に使われた日時がわかります。
###### access_key_1_last_used_regionまたはaccess_key_2_last_used_region
アクセスキーが使われたリージョンを示します。どのリージョンで操作されたかがわかると思います。
###### access_key_1_last_used_serviceまたはaccess_key_2_last_used_service
アクセスキーを利用してどのサービスを利用したかがわかります。

# 最後に
調べる前はアカウントに対して不正アクセスを確認するにはAWS CloudTrailを使うのかなと思いました。でも、IAMから認証情報レポートをダウンロードすればアカウント内のユーザーのセキュリティ資格情報がわかるので便利だなと感じました。

# 参考文献
以下を参考にして学習しました。
ありがとうございます。
[AWS re: POST]()
[AWS アカウントの認証情報レポートを生成する](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_getting-report.html#getting-credential-reports-cliapi)
JSのslice関数の引数の動き

# はじめに
プログラミング学習中の[@kat_log](https://twitter.com/kat__log "Twitter")と申します。

JSのslice関数の引数の動きが若干ややこしやなので共有です

![image.png](https://soco-st.com/wp-content/themes/socost/upload/11813_color.svg)

# slice関数とは
→配列をシャローコピーする関数。
引数により配列内のどこからどこまでをコピーするか指定もできます。
正確には文字列もコピーできます。

# 引数無し
→配列全体をコピー

```javascript:slice()
let array = [1, 2, 3, 4, 5];
let result = array.slice();
console.log(result); // [1, 2, 3, 4, 5]
```

引数を省略すると、元の配列や文字列の全てをコピーします。

# 第1引数のみ
→引数で指定した**インデックスから**最後までの部分を抽出します

```javascript:slice(2)
let array = [1, 2, 3, 4, 5];
let result = array.slice(2);
console.log(result); // [3, 4, 5]
```
（↑例）2を指定すると、添字（インデックス）は0から数えるので上記の例ではインデックス2から開始し、最後までの要素（3, 4, 5）が戻り値として返されます。

## （便利テクニック）第1引数にマイナスの指定
→マイナスのインデックスを指定すると、配列の後ろから指定した数の要素を抽出します

```javascript:slice(-2)
const srcArray = [1, 2, 3, 4, 5];
const resArray = srcArray.slice(-2);
console.log(resArray); // [4, 5]
```

（[コメント](https://qiita.com/kat_log/items/ae23e617764db09e6128#comment-c8d38dc4e34e54d364c0 "@ffgogfb454さんのコメント")にて@ffgogfb454 さんにご教示いただきました。ありがとうございます🙇）


# 第1引数&第2引数
→開始インデックスから終了インデックスの**手前まで**の部分が抽出されます

```javascript:slice(1, 4)
let array = [1, 2, 3, 4, 5];
let result = array.slice(1, 4);
console.log(result); // [2, 3, 4]
```

上記の例ではインデックス1からインデックス4の手前が戻り値として返されます。

# つまり
第1引数：含む
第2引数：含まない
です！

# 補足　オリジナルへの反映
配列内の要素が参照型（配列やオブジェクト）の場合は、コピー後を書き換えるとオリジナルにも反映されます

```javascript:参照型はオリジナルにも影響します
// 元の配列（オブジェクトを含む）
let originalArray = [1, 2, {a: 3}, 4, 5];

// 配列をコピー
let copiedArray = originalArray.slice();

// コピーした配列のオブジェクトを変更
copiedArray[2].a = 100;

console.log('Original Array:', originalArray); // [1, 2, {a: 100}, 4, 5]
console.log('Copied Array:', copiedArray);     // [1, 2, {a: 100}, 4, 5]
```

配列の中身が文字列などプリミティブ値（数値、文字列、真偽値など）の場合影響なしです

```javascript:プリミティブ型はオリジナルに影響なしです
// 元の配列
let originalArray = [1, 2, 3, 4, 5];

// 配列をコピー
let copiedArray = originalArray.slice();

// コピーした配列に要素を追加
copiedArray[0] = 99; 
copiedArray.push(6);

console.log('Original Array:', originalArray); // [1, 2, 3, 4, 5]
console.log('Copied Array:', copiedArray);     // [99, 2, 3, 4, 5, 6]
```


お読みいただきありがとうございました。
ここもややこしポイントでしたね…

# おわりに
以上sliceについて共有でした！
どなたかの参考になれば嬉しいです。
ResNetとは？概要から精度向上のアプローチまで徹底解説

ディープラーニングにおいて画像認識の分野で革新をもたらしたモデルの1つが **ResNet（Residual Network）** です。ResNetは、その特徴的なアーキテクチャにより、深いネットワークでも効果的に学習を進められるように設計されています。本記事では、ResNetの概要、処理内容、そしてKaggleのようなコンペで精度を向上させるためのアプローチを詳しく解説します。
※この記事は、ChatGPTの出力を基に作成しています。

---

## **ResNetの概要**

### **1. ResNetとは？**
ResNet（Residual Network）は、「残差学習（Residual Learning）」という手法を採用したディープラーニングモデルで、深い層を持つネットワークでの学習を可能にした画期的なアーキテクチャです。従来の深いネットワークでは、層が増えるほど学習が難しくなる「勾配消失問題」が発生しやすいという課題がありました。ResNetは、この問題を解決するために「ショートカット接続（Skip Connection）」を導入しています。

### **2. ResNetの特徴**
- **残差学習**：
  ResNetでは、通常のネットワーク構造に「ショートカット接続」を追加し、層の出力に前の層の出力を直接加算します。これにより、ネットワークが学習すべきは「出力の差分（残差）」だけとなり、学習が効率化されます。
- **非常に深い層を持てる**：
  ResNetの設計により、100層以上の非常に深いネットワークでも性能が低下しにくくなりました。

---

## **ResNetの処理内容をステップバイステップで解説**

### **1. 画像入力**
ResNetに入力されるのは、ピクセル値からなる画像データです。たとえば、犬の写真を入力するとします。

### **2. 畳み込み層（Convolution Layer）**
最初の処理では、画像にフィルタを適用して特徴を抽出します。この層は、エッジや形、色など、画像の基本的な特徴を捉えます。

### **3. 残差接続（ショートカット接続）**
ResNetの革新的な部分です。通常の畳み込み層の出力に、1つ前の層の出力を直接加算します。
- **効果**：情報が失われにくくなり、ネットワークが深くても学習が安定します。

### **4. 活性化関数（ReLU）**
畳み込み層の出力にReLU（Rectified Linear Unit）を適用し、非線形な特徴を学習します。これは、負の値を0にし、正の値はそのまま通す簡単な関数です。

### **5. プーリング層**
画像サイズを縮小する「プーリング」処理を適用します。これにより、計算量が削減され、効率的な学習が可能になります。

### **6. 残差接続の繰り返し**
残差接続を含むブロックを何層も重ねることで、ネットワーク全体が画像の複雑な特徴を段階的に学習します。

### **7. 全結合層**
画像から抽出された特徴を使って、カテゴリの予測を行います。たとえば、犬の画像なら「これは犬です」と予測します。

### **8. 出力層**
最終的な分類結果を出力します。ResNetではSoftmax関数を使用して、各クラスに属する確率を計算します。

---

## **ResNetの精度を向上させるためのアプローチ**

KaggleなどのコンペでResNetの性能を引き上げるための具体的なアプローチを、以下の5つの観点で整理します。

---

### **1. データの改善**
データの質と量を向上させることで、モデルの性能を高めます。

- **データ拡張**：画像の回転や反転、ノイズ付加でデータの多様性を増やす。
- **ラベル修正**：誤ったラベルを修正し、正確なデータセットを構築。
- **データバランシング**：クラス不均衡を解消し、特定クラスへの偏りを防ぐ。
- **外部データの利用**：関連する外部データを追加して学習。

---

### **2. モデル構造の改善**
ResNetそのものの設計を調整します。

- **アーキテクチャの変更**：
  - ResNet-50やResNet-101など、異なる深さのモデルを試す。
  - 他のモデル（DenseNet, EfficientNet）とのハイブリッド化を検討。
- **幅や深さの調整**：チャネル数や層数を最適化。
- **ショートカット接続の改良**：恒等接続と畳み込み接続をタスクに応じて調整。

---

### **3. トレーニングの最適化**
学習プロセスを最適化します。

- **ハイパーパラメータチューニング**：学習率やバッチサイズの調整。
- **正則化**：DropoutやWeight Decayで過学習を抑制。
- **転移学習**：ImageNetで事前学習済みモデルを活用。
- **ロス関数の変更**：クロスエントロピー以外にFocal LossやLabel Smoothingを試す。

---

### **4. 推論時の工夫**
モデルの予測精度を向上させる工夫です。

- **テスト時データ拡張（TTA）**：テストデータを異なる角度で複数回予測し、結果を平均化。
- **アンサンブル学習**：複数のモデルの予測を組み合わせて精度向上。
- **混合精度推論**：半精度（FP16）推論で速度を向上させつつ精度を維持。

---

### **5. 環境の最適化**
計算環境を強化し、効率的なトレーニングを行います。

- **GPU/TPUの利用**：高速なハードウェアを活用。
- **分散トレーニング**：複数GPUで学習を並列化。
- **フレームワークの最新版を使用**：TensorFlowやPyTorchの最新機能を活用。

---

## **まとめ**

ResNetは、画像認識における「深いネットワーク」の学習を可能にした革新的なモデルです。その構造の特徴である「残差接続」により、非常に深い層を持つモデルでも高精度な学習が実現しました。

KaggleなどのコンペでResNetを活用する際には、データ、モデル構造、トレーニングプロセス、推論、環境の5つの観点から改善策を検討することで、精度をさらに高めることができます。これらの手法を駆使し、ResNetの可能性を最大限引き出しましょう！
MCPサーバー（ファイルシステム）のDocker設定手順

# MCPサーバー（ファイルシステム）のDocker設定手順

このドキュメントでは、Model Context Protocol (MCP) のファイルシステムサーバーをDockerを使用してセットアップする手順を説明します。

## 前提条件

- Docker Desktopがインストールされていること
- GitがインストールされていてGitHubにアクセスできること
- Claude Desktopがインストールされていること

## セットアップ手順

### 1. リポジトリのクローン

```bash
git clone https://github.com/modelcontextprotocol/servers.git
cd servers
```

### 2. Dockerイメージのビルド

```bash
docker build -t mcp/filesystem -f src/filesystem/Dockerfile .
```

### 3. claude_desktop_config.jsonの設定

`claude_desktop_config.json` に以下の設定を追加します：

```json
{
    "mcpServers": {
        "filesystem": {
            "command": "docker",
            "args": [
                "run",
                "-i",
                "--rm",
                "--mount", "type=bind,src=<YOUR_LOCAL_PATH>,dst=/projects/<MOUNT_POINT>",
                "mcp/filesystem",
                "/projects"
            ]
        }
    }
}
```

### 設定項目の説明

| パラメータ | 説明 | 例 |
|------------|------|------|
| `src` | アクセスを許可するローカルディレクトリのパス | `C:/Users/username/Documents` |
| `dst` | Dockerコンテナ内でマウントされるパス（必ず `/projects` 配下） | `/projects/docs` |
| 最後の引数 | MCPサーバーのルートディレクトリ | `/projects` |

### 4. 動作確認

設定が正しく行われたかを確認するには、以下の点をチェックします：

1. Claude Desktopが正常に起動すること
2. ファイルシステムへのアクセスが可能なこと（例：`/projects` 配下のディレクトリ一覧が取得できる）

## トラブルシューティング

### よくある問題と解決方法

- error "Docker buildが失敗する場合"
    * Dockerfileが存在することを確認
    * リポジトリが正しくクローンされているか確認
        * `git clone` コマンドが成功したか
        * `servers` ディレクトリに移動できているか
    * Dockerデーモンが起動しているか確認
        * Docker Desktopが起動しているか
        * `docker ps` コマンドが実行できるか

- error "ファイルにアクセスできない場合"
    * パスの確認
        * マウントパスが `/projects` 配下になっているか
        * Windowsのパスはスラッシュ（/）を使用しているか
    * 権限の確認
        * マウントしたディレクトリのパーミッション
        * Docker Desktopのファイル共有設定

## 参考情報

- [Model Context Protocol GitHub](https://github.com/modelcontextprotocol/servers)
- [MCPサーバー・ドキュメンテーション](https://glama.ai/mcp/servers)

## 注意点

- セキュリティ上の理由から、必要最小限のディレクトリのみをマウントすることを推奨
- 機密情報を含むディレクトリへのアクセスには十分注意が必要
U-25エンジニア特化奨学金型採用マッチングコミュニティのお知らせ 🚀


こんにちは！🔥 現在、「フレフレ」という 学生エンジニアと企業をつなぐ奨学金型採用マッチングコミュニティ を運営しています。このプラットフォームでは、未来を切り開く優秀な学生エンジニアの皆さんを応援し、彼らの夢や挑戦をサポートする企業とのつながりを提供しています。

このコミュニティを運営している「林星凪」について軽く自己紹介をさせてください！

学校：N高等学校・Penn Foster High school
趣味：作曲・映画鑑賞・サッカー
頑張っていること：起業・英語 / 脳科学 / 行動経済学 / プログラミングの勉強

特に、今は「HUREHURE」というコミュニティに注力を注いでいます 🔥

それに伴い、皆様のような優秀なU-25エンジニアの確保にとても苦労をしています😭

この記事を読んでいただいてる方々は、学生様でしたらぜひ入会を検討していただき、保護者様や友達などでしたらこの記事を紹介していただけると幸いです！

また、この記事では書ききれないことを下記のリンクのホームページに記載しておりますので、読んでください！

![1月12日Pitch Deck.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3974588/9c9ef94b-59ac-2770-59d2-63bc231a07db.png)


募集対象 🎯

* 高校生～大学院生
* エンジニアやIT分野の専攻でなくてもOK！
* 将来の目標やビジョンが明確で、それに向かって努力を続けている方
* 技術スキルを磨きたい、もしくはすでに得意な分野がある方

こんな方におすすめ 🌟

* 自分のスキルや挑戦を応援してくれる企業とつながりたい
* 奨学金や資金援助を通じて夢に近づきたい
* 新しいチャンスやネットワークを探している

![企業様向け資料.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3974588/9c94cc57-efbd-6a43-66b6-11628588732c.png)

少しでも興味を持っていただけたら、この投稿にいいねをしていただけると嬉しいです！後ほど、こちらから詳細を送らせていただきます。

詳細はこちらからご確認ください：
🔗 https://aromatic-beech-424.notion.site/HP-143f4ed8e71480fcaf11dfc73206eb74


それでは、またフレフレのコミュニティでお会いしましょう👋
Viteを使ったReactの環境構築〜初心者でもすぐに始める〜

# React環境構築
## はじめに
Reactの学習をするにあたって、簡単に環境構築をする方法をまとめる。
ここでは、Viteを使ったReactの環境構築を行う。
また、Node.jsはインストールされている前提とする。

## 手順1　コマンドを実行する
以下のコマンドを実行することで、プロジェクトの作成が開始される。
```
npm create vite
```
コマンドの実行後、いくつかの設定を求められるため、以下の手順のように設定する。

## 手順2　プロジェクト名の入力
コマンド実行後、プロジェクト名の入力が求められるため、任意のプロジェクト名を入力する。
今回は`react-project`という名前にする。
```
? Project name: » react-project
```

## 手順3　フレームワークの選択
使用するフレームワークの選択が求められるため、選択する。
今回は`React`を選択する。
```
? Select a framework: » - Use arrow-keys. Return to submit.
    Vanilla
    Vue
>   React
    Preact
    Lit
    Svelte
    Solid
    Qwik
    Others
```

## 手順4　JavaScriptとTypeScriptの選択
JavaScriptとTypeScriptの選択が求められるため、選択する。
今回は、`TypeScript`を選択する。
また、SWCはVercel社が開発しているBabelに代わる新しいコンパイラーのようだが、今回は選択しない。
```
? Select a variant: » - Use arrow-keys. Return to submit.
>   TypeScript
    TypeScript + SWC
    JavaScript
    JavaScript + SWC
```
これで、プロジェクトの作成は完了する。
以下は、実際にサーバーを起動するための手順になる。

## 手順5 パッケージのインストール
プロジェクトが作成されたことを確認後、作成したプロジェクトのディレクトに移動して、パッケージのインストールを行う。
```
cd react-project
npm install
```

## 手順6　サーバーの起動
以下のコマンドを実行すると、サーバの起動が行われる。
サーバに接続し、画面が表示されれば成功。
```
npm run dev
```

## おわりに
このように簡単にプロジェクトの作成やサーバの起動を行うことができる。
最低限、必要なファイルなどは作成されているため、コードを修正するなどして、開発を行っていく。
Raspberry Pi Pico 2 W でＬチカ

#### Raspberry Pi Pico 2 W で遊ぶ

昨年末に注文していた Raspberry Pi Pico 2 W が届いたので遊んでみることにしました。
(早くSwitch Scienceで取り扱ってくれないかな…)
内容はただのＬチカです。VSCode + C/C++ の練習及び開発環境の動作確認のためにとやってみました。
Raspberry Pico W でも通る内容だと思います。

現段階での環境は以下の通り。
・Raspberry Pi Pico 2 W
・Raspberry Pi Pico (PicoProbe用)
・VSCode + 拡張機能「Raspberry Pi Pico」　←①
・C/C++

酷く限定された環境でのお話になります。
言語はやりたいことに合わせて変える予定。
(MicroPythonとかも使います)

で。
Pico WのLチカ自体はある程度情報があったのだが全部MicroPythonでピュア C/C++ の情報が無かった(英語が読めないから)ので、誰かが困ったときのために書いておきます。

結論から先に言うと、①の拡張機能のサンプルコードにやり方書いてありました(だから情報なかったのか…)。
丸コピなんですが、こんな感じです。

```blink.c
**
 * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#include "pico/stdlib.h"

// Pico W devices use a GPIO on the WIFI chip for the LED,
// so when building for Pico W, CYW43_WL_GPIO_LED_PIN will be defined
// Pico W系 は WIFI ICにLEDが接続されていて、LチカにWiFi ICドライバが必要
// Pico W 向けプロジェクトを作成すると CYW43_WL_GPIO_LED_PIN が定義され
// pico/cyw43/arch.h をインクルードできる(無印プロジェクトにはこのヘッダは提供されない)
#ifdef CYW43_WL_GPIO_LED_PIN
#include "pico/cyw43_arch.h"
#endif

#ifndef LED_DELAY_MS
#define LED_DELAY_MS 250
#endif

// Perform initialisation
int pico_led_init(void) {
#if defined(PICO_DEFAULT_LED_PIN)
    // A device like Pico that uses a GPIO for the LED will define PICO_DEFAULT_LED_PIN
    // so we can use normal GPIO functionality to turn the led on and off
    gpio_init(PICO_DEFAULT_LED_PIN);
    gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT);
    return PICO_OK;
#elif defined(CYW43_WL_GPIO_LED_PIN)
    // For Pico W devices we need to initialise the driver etc
    return cyw43_arch_init();
#endif
}

// Turn the led on or off
void pico_set_led(bool led_on) {
#if defined(PICO_DEFAULT_LED_PIN)
    // Just set the GPIO on or off
    gpio_put(PICO_DEFAULT_LED_PIN, led_on);
#elif defined(CYW43_WL_GPIO_LED_PIN)
    // Ask the wifi "driver" to set the GPIO on or off
    cyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, led_on);
#endif
}

int main() {
    int rc = pico_led_init();
    hard_assert(rc == PICO_OK);
    while (true) {
        pico_set_led(true);
        sleep_ms(LED_DELAY_MS);
        pico_set_led(false);
        sleep_ms(LED_DELAY_MS);
    }
}
```

65行目の`cyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, led_on);` (led_onは呼び出し元で1/0にする)でLEDを点滅させています。裏でCYW43と通信してLEDの状態を変更させています。
無印では
`gpio_put(PICO_DEFAULT_LED_PIN, led_on);`
でまあまあおなじみ？のコード。MicroPythonの本体が色々隠蔽していたんですね。

36行目の
`#include "pico/cyw43_arch.h"`
がインクルードできるかが勝負どころ。そのためには35行目の`CYW43_WL_GPIO_LED_PIN`が定義されるかがキモなわけですが、これは、サンプルプロジェクトの作成時のターゲットに"Pico W"、"Pico2 W"をしっかり選んでいるかが勝負になります。これを怠るとプロジェクトにW系のヘッダ等が組み込まれず、W系を使っていたとしても35行目の判定に失敗しヘッダファイルが読み込まれないことになります。筆者は失敗しました。無念。後からinclude文コピペしても無駄でしたのでファイル自体がコピーされてないのでしょう。
ターゲットを後から変える方法は現時点ではわかりません。要調査です。

……始めたばかりでもうしんどい……

全く関係ない話ですが、三点リーダが下につくのって日本語っぽくなくて好きじゃないです。


いじょ
ClaudeのMCPを簡単に試す方法

ClaudeのMCPを使ってみようと思い調べると、いろんなことがごちゃごちゃと書いてあってなかなか使い方にたどり着けないので、最も簡単だと思う方法を記載する。

Macで実行することを前提に書く。

# 1. Claude Desktopをインストール

https://claude.ai/download

# 2. Mac にnpxをインストール

ClaudeのMCPは裏でnpxが動いている。なので、npxをインストールしておく。

https://qiita.com/itty-star/items/230ff18c3cce2e52a1f8

# 3. Claude DesktopのMCP設定ファイルをいじる

以下の通りにやればいいのだが

https://modelcontextprotocol.io/quickstart/user

要は以下のjsonの設定ファイルに

``~/Library/Application Support/Claude/claude_desktop_config.json``

そして以下の設定をファイルに書くとAnthropicが用意してくれている[Filesystem](https://github.com/modelcontextprotocol/servers/tree/main/src/filesystem) MCPサーバーがアプリ起動時に自動で立ち上がって使えるようになる。``username``はそれぞれのMac上のユーザー名に置き換える。

これでClaudeからPC上のファイル操作ができるようになる。設定を書き込んだらアプリを再起動する。

```
{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "/Users/username/Desktop",
        "/Users/username/Downloads"
      ]
    }
  }
}

```

# 4. ClaudeでMCPを使う

``シェークスピア風の詩を書いて、デスクトップにpoem.txtとして保存して``とかプロンプトで打つとファイルがデスクトップに作成される。何度か実行してもよいか聞かれるので、Allowをする。

# 5. 他のMCPサーバーを試す

https://github.com/modelcontextprotocol/servers/tree/main/src

ここにAnthropicが作った、いろんなMCPサーバーがあるので、これらを使う。上記のjsonファイルに設定追記すればいい。この辺がまだちょっと素人に優しくない。

# 最後に

これだけのことだが、他にもいろんなことが書いてあるのでGithubのリポジトリを持ってきたりしてしまいそうになるがまったく持って不要。

サーバーを作る方法もあるが、それも[サーバー作成ツール](https://github.com/modelcontextprotocol/create-python-server)が用意されている（まだ試してない）。この辺もごちゃごちゃいろんなことが書かれているので、わかりにくい。作り方はわかるが、どうやってClaudeから呼び出せるようになるのだろうか？まあ多分サーバー名をjsonに書けばいいのかなって感じがする。ChatGPTもよく知らないので、うまく自動生成できない。そのうちできるようになるとは思うが。
FlaskでSwaggerを設定する方法について

## はじめに
FlaskでSwaggerを使えるように設定する方法について説明したいと思います

## 前提
- Flaskのプロジェクトを作成済み

## flask-swagger-uiのインストール
flask-swagger-uiをインストールすることで使用できるようになります
```terminal
pip install flask-swagger-ui
```

## ディレクトリ構成
今回はmain.py、swagger.ymlを作成します

```
.
└── application
    ├── main.py
    ├── poetry.lock
    ├── pyproject.toml
    └── static
        └── swagger.yml
```

## main.py
SWAGGER_URLにswaggerへアクセスする際のパス、API_URLにswagger.ymlのパスを記載します
get_swaggerui_blueprintを使ってSwagger用のBlueprintを取得し、SWAGGER_URLとAPI_URLを上書きした後にSwagger用のBlueprintをアプリケーションに登録します

```main.py
from flask_swagger_ui import get_swaggerui_blueprint

app = Flask(__name__)

SWAGGER_URL = "/api/docs"
API_URL = "/static/swagger.yml"

# Call factory function to create our blueprint
swaggerui_blueprint = get_swaggerui_blueprint(
    SWAGGER_URL,
    API_URL,
)

app.register_blueprint(swaggerui_blueprint)


@app.route("/api/health")
def health():
    return {"msg": "pass"}
```

## APIのドキュメントが記載されたymlファイル
swagger.ymlにAPIのドキュメントを記載します
今回はヘルスチェック用のAPIについて記載してます

```static/swagger.yml
# https://swagger.io/specification/
openapi: "3.0.0"
# APIに関するメタデータ
info:
  title: project
  description: |-
    # プロジェクトの詳細
  version: 1.0.0

tags:
  - name: health
    description: ヘルスチェックAPI

paths:
  /api/health:
    get:
      tags:
        - health
      summary: ヘルスチェックAPI
      description: APIサーバー単独でのヘルスチェック
      responses:
        '200':
          description: 成功
          content:
            application/json:
              schema:
                type: object
                properties:
                  msg:
                    type: string
                    description: ステータス
                    example: pass
```

今回は8000ポートを使用します
http://127.0.0.1:8000/api/docs へアクセスした際にSwaggerが出たら成功です

![スクリーンショット 2025-01-04 9.03.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/13864415-1c24-ccb5-f44c-fc39f048b015.png)

また、ymlファイルを下記のようにGitHub Pagesにアップロードできます

https://qiita.com/shun198/items/520806a86a14a4bd64a8

## 参考文献
https://github.com/sveint/flask-swagger-ui
永続的なバグの根本原因を特定する方法

未知の根本原因を持つ永続的なバグに対処するための対策を以下に示します。たとえAIの支援が解決に至らなかった場合でも、この方法を試すことができます。

問題を特定するためには、どのコミットがバグを導入したのかを突き止める必要があります。まず、バグが存在するブランチを以前のコミットに戻します。そして、コミットAが正常に動作し、コミットBを追加すると問題が発生するポイントを見つけます。

次に、コミットBで導入された変更を調べます。変更が大規模な場合、それらを詳細に分析し、バグの原因となる特定の変更を突き止めます。このプロセスを通じて、最終的に根本原因を明らかにすることができます。

もちろん、CIのテストケースが十分に包括的であれば、PRを開く際やPRを開いた後にコミットをプッシュする際にCIが実行され、問題が検出された場合、どのPRやコミットが原因かを特定できます。この場合、上述のステップを実行する必要はなくなります。
開発者ツール　F12（Microsoft Edge編）

開発者ツールって何ですか？

それは置いといて、ちょっとしたときに使いたいではないですか？

今は何もわからんのです。コンソールを今回はテストしてみることに

しましょう。これくらいは知っておきたいものですね。

皆さんの大半（イメージ）はGoogle Chromeを使ってるのでしょう。

私は実行環境としては、Microsoft Edgeしか使ってないです。

申し訳ありませんが、ウェブブラウザは、Edgeを前提条件として

説明をさせてもらいます。Chromeとだいたい同じと思ってるのでね。

まずは、マウスを右クリック。コンテクストメニューが一覧に出力されます。

その中から「開発者ツールで調査する」をチョイスします。

パソコンの画面の右にデベロッパー用のサイトが別表示されるはずです。

肝心なのはここからになります。

「要素」の隣にあります「コンソール」を押します。

<br>

<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698531/d433b94a-6a2b-bb71-e310-079e9ab17f07.png)


<br>

<br>


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698531/2682a6db-faf4-ccc2-48a7-d52a711a3da6.png)

<br>

<br>

写真の通りなので、これに従ってセッティングを終えます。

下は空白の欄になっておりますが

ここに記号の「>」が青色で付いてるんですよね？

＞　の行にカーソルを合わせて、サンプルコードの入力とまいりましょう。

<br>

```

> document.write("OK");

```

<br>

<br>

リターンキーを一回押します。

すると、真っ白なウェブページの片隅に「OK」と出ました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698531/1ec1a754-8430-832c-7ba7-e57d9941bf51.png)

<br>

<br>

これが今回の成功の合図となります。

エンジニアの方々にとっては

分かりきってる内容でありますから

記事にするレベルでもないんですが

今日初めて知ったことですので

自分のための忘備録として書いておきました。

<br>

<br>

それではまた次回。
localStorageの使い方メモ

## 値の格納
```ts
localStorage.setItem("userId", "user-1");
```

## 値の取得
```ts
const userId = localStorage.getItem("userId", "user-1");
```

## オブジェクトの格納
localStorageは文字列のみなのでJSON文字列化する
```ts
const newUserInfo = {
 userId: "user-1",
 userName: "test",
 mail: "test@sample.com",
};

localStorage.setItem("userInfo", JSON.stringify(newUserInfo));
```

## オブジェクトの取得
```ts
// JSON文字列で取得
const storedUserInfo = localStorage.getItem("userInfo");

if (storedUserInfo) {
    // JSONオブジェクトへパース
    const userInfo = JSON.parse(storedUserInfo);
}


```
【準1級】統計学実践ワークブック　第7章　例1　大数の弱法則と連続写像定理


統計検定準1級の勉強のための解説記事となります。下記にご了承いただける方のみ、お読みください。

:::note warn
##### 注意
* 著作権の都合により問題文は掲載せず解説のみの記述となります。
* 独自の解釈により、不適切な表現がある可能性があります。
:::

以下の動画でも解説していますので、見やすいほうでご覧ください。

<iframe width="560" height="315" src="https://www.youtube.com/embed/-f5xyYJIpak?si=CFeEO8kLtEMBfDJD" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

# 学習のポイント


:::note



・確率変数列${X_n}$が確率変数$Y$に確率収束する：

$$
任意のε > 0に対して、\lim_{n \to \infty} P(|X_n - Y| > \epsilon) = 0
$$





・大数の弱法則： 
確率変数列$ {X_n} $は独立同一分布に従い、その平均と分散がそれぞれ $E[X_n] = µ$ と $V[X_n] = σ²$ であるとする。このとき、$X_1, …, X_n$ の標本平均

$$
\bar{X_n} = \frac{1}{n} \sum_{i=1}^{n} X_i
$$

は $n → ∞$ のもとで $µ$ に確率収束する。

・連続写像定理：
確率変数の列 ${X_n}$ が確率変数$ Y$ に確率収束し、関数$ h$ が実数全体で連続であるとき、確率変数の列 ${h(X_n)}$ は確率変数$ h(Y)$ に確率収束する。
:::



# 解法ノート


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618291/7e232eed-fddb-9dea-281f-573b9cf42706.png)


# 標本平均の関数の確率収束
#### 大数の弱法則
$X_1, X_2, ..., X_n $は独立に区間$[0, 1]$上の一様分布に従う確率変数です。つまり、各$X_i$は互いに独立であり、$0$から$1$の間の任意の値をとる確率が等しいということです。

区間$[0, 1]$上の一様分布の期待値は、
$$
μ=E[X_n] = \frac{0 + 1}{2} = \frac{1}{2}
$$

です。

大数の弱法則より、標本平均 $\bar{X_n} = \frac{X_1 + X_2 + \dots + X_n}{n}$ は、$n$が大きくなるにつれて $μ=\frac{1}{2}$ に確率収束します。

#### 連続写像定理

次に、連続写像定理を適用します。この問題では、$\bar{X_n}$ が $\frac{1}{2}$ に確率収束することがわかりました。ここで、$h(x) = √x$ という連続関数を考えます。$\bar{X_n} = \frac{X_1 + X_2 + \dots + X_n}{n}$ を $h(x)$ に代入すると、
$$
 Z_n=h(\bar{X_n}) =√(   \frac{X_1 + X_2 + \dots + X_n}{n} )
$$

です。

ここで、$Z_n$は、連続写像定理より$Y=h\left(\frac{1}{2}\right)$に確率収束します。$Y=h\left(\frac{1}{2}\right) = \sqrt{\frac{1}{2}} = \frac{1}{\sqrt{2}}$ のため、$Z_n$は、$\frac{1}{\sqrt{2}}$に確率収束します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618291/93f96063-72f7-c5a4-e4a2-3038d37daf6a.png)

# コラム
各用語の数式を日本語化すると以下のような意味となります。
・確率収束：$n$ が大きくなるにつれて、$X_n$ と$X$の差が$ϵ$ より大きくなる確率が 0 に近づく
・平均二乗収束：$X_n$ と$X$ の差の二乗の期待値（平均）が$0$ に近づく
・大数の弱法則：標本平均は、標本数を増やすと、真の平均（母平均）に確率収束する。
・中心極限定理：独立同分布に従う確率変数列の標本平均の標準化されたものは、標本数を増やすと、標準正規分布に法則収束（分布収束） する。
量子コンパイラを作る。 その18

# 概要
量子コンパイラを作る。
elixirで論理回路アセンブラをコンパイルして、qiskitを生成できるが、結局、論理回路が書けるのかが、問題になる。（人材の問題、それなりの人の育成、、、）
そっちに、対策を取る。
論理回路アセンブラから、論理回路を生成して、ビジュアルでシュミレーションするエディタを開発する。どうだ。
構想編

# 方針
- simcirjsを使う。
- レイアウトエンジンを導入する。
縦に長くなるので、横に広げる。
- 主なデバイス
電源
トグルスイッチ
LED
端子
- 論理回路
and
xor
or
- セーブ機能
無し。
- 設置
plunker


# 論理回路アセンブラ

左から　make in 論理デバイス out の順に表示する。

```
make 18
in 0 5
wire 6 13
xor 0 3 14
and 0 3 6
xor 1 4 7
and 1 4 8
xor 6 7 15
and 6 7 9
or 8 9 10
xor 2 5 11
and 2 5 12
xor 10 11 16
and 10 11 13
or 12 13 17
out 14 17
```
# simcirjsのリバースエンジニアリング

デバイスにID譜って、ｘｙでレイアウトする。
コネクトで繋ぐ。

```
	"devices":[
		{"type":"DC",	"id":"dev0",	"x":24,		"y":160,	"label":"DC"},
		{"type":"LED",	"id":"dev1",	"x":496,	"y":120,	"label":"LED"},
		{"type":"LED",	"id":"dev2",	"x":504,	"y":208,	"label":"LED"},
		{"type":"In",	"id":"dev3",	"x":168,	"y":112,	"label":"A"},
		{"type":"In",	"id":"dev4",	"x":168,	"y":192,	"label":"B"},
		{"type":"Out",	"id":"dev5",	"x":424,	"y":112,	"label":"Sum"},
		{"type":"Out",	"id":"dev6",	"x":424,	"y":200,	"label":"Carry"},
		{"type":"Toggle","id":"dev7",	"x":96,		"y":192,	"label":"Toggle",	"state":{"on":true}},
		{"type":"XOR",	"id":"dev8",	"x":288,	"y":120,	"label":"XOR"},
		{"type":"Toggle","id":"dev9",	"x":88,		"y":112,	"label":"Toggle",	"state":{"on":true}},
		{"type":"AND",	"id":"dev10",	"x":288,	"y":192,	"label":"AND"}
	],
	"connectors":[
		{"from":"dev1.in0",		"to":"dev5.out0"},
		{"from":"dev2.in0",		"to":"dev6.out0"},
		{"from":"dev3.in0",		"to":"dev9.out0"},
		{"from":"dev4.in0",		"to":"dev7.out0"},
		{"from":"dev5.in0",		"to":"dev8.out0"},
		{"from":"dev6.in0",		"to":"dev10.out0"},
		{"from":"dev7.in0",		"to":"dev0.out0"},
		{"from":"dev8.in0",		"to":"dev3.out0"},
		{"from":"dev8.in1",		"to":"dev4.out0"},
		{"from":"dev9.in0",		"to":"dev0.out0"},
		{"from":"dev10.in0",	"to":"dev3.out0"},
		{"from":"dev10.in1",	"to":"dev4.out0"}
	]
```

以上。
Go言語 × GormでMySQLとSQLiteを簡単切り替え！データベース接続管理の方法

## 概要

Go言語でWebアプリケーションを構築する際、データベースとの接続を簡単に切り替えられる設計はとても便利です。この記事では、Gormを活用してMySQLとSQLiteの接続を切り替える方法を解説します。

この記事を読めば以下のことがわかります：

- **Gormとは何か？**
- **MySQLとSQLiteの接続を切り替える実装方法**
- **よくある設計パターン「ファクトリ関数」を利用した実践的なコード例**

## Gormとは？

GormはGo言語用のオープンソースのORM（Object Relational Mapping）ライブラリです。  
SQLを書く手間を減らしつつ、データベース操作を簡素化する強力なツールとして知られています。

主な特徴：

- クエリ生成機能が充実しており、簡単にCRUD操作が可能
- 複数のデータベースドライバ（MySQL、PostgreSQL、SQLiteなど）をサポート
- マイグレーション（テーブル構造変更）もコードで管理可能

公式ドキュメント：[Gorm](https://gorm.io/)

## 実装例：MySQLとSQLiteを簡単切り替え

以下のコードでは、Gormを活用してMySQLとSQLiteを柔軟に切り替えられる設計を実現しています。  
「ファクトリ関数」を利用した汎用性の高いコードを見ていきましょう。

```go
package models

import (
	"errors"
	"fmt"

	"gorm.io/driver/mysql"
	"gorm.io/driver/sqlite"
	"gorm.io/gorm"

	"go-api-newspaper/configs"
)

const (
	InstanceSqlLite int = iota // SQLiteを選択する定数
	InstanceMySQL              // MySQLを選択する定数
)

var (
	DB                            *gorm.DB // グローバルで利用可能なデータベースインスタンス
	errInvalidSQLDatabaseInstance = errors.New("invalid sql db instance") // 不正なデータベースインスタンスを扱うエラー
)

// 初期化するモデル（テーブル）をリストで返す関数
func GetModels() []interface{} {
	return []interface{}{&Newspaper{}}
}

// データベースのインスタンスを生成するファクトリ関数
func NewDatabaseSQLFactory(instance int) (db *gorm.DB, err error) {
	switch instance {
	case InstanceMySQL:
		// MySQL用の接続情報（DSN: Data Source Name）を構築
		dsn := fmt.Sprintf(
			"%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True",
			configs.Config.DBUser,
			configs.Config.DBPassword,
			configs.Config.DBHost,
			configs.Config.DBPort,
			configs.Config.DBName)
		db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
	case InstanceSqlLite:
		db, err = gorm.Open(sqlite.Open(configs.Config.DBName), &gorm.Config{})
	default:
		return nil, errInvalidSQLDatabaseInstance
	}
	return db, err
}

// データベースをセットする関数（実際にグローバル変数DBにインスタンスを格納）
func SetDatabase(instance int) (err error) {
	db, err := NewDatabaseSQLFactory(instance)
	if err != nil {
		return err
	}
	DB = db // グローバル変数にセット
	return err
}
```

## コード解説

### データベース接続を切り替えるファクトリ関数

このコードでは、`NewDatabaseSQLFactory`関数を利用して、データベースの接続先を柔軟に切り替えられるようにしています。

#### 1. `InstanceSqlLite` と `InstanceMySQL`

`const` を利用して、データベース接続先の種類を識別するための定数を定義しています。

```go
const (
	InstanceSqlLite int = iota // SQLiteを選択する定数
	InstanceMySQL              // MySQLを選択する定数
)
```

これにより、コード内でデータベースの種類を識別しやすくなります。

#### 2. データベース接続情報（DSN）を動的に生成

MySQLの接続情報は、`fmt.Sprintf` を利用して動的に生成されます。

```go
dsn := fmt.Sprintf(
	"%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True",
	configs.Config.DBUser,
	configs.Config.DBPassword,
	configs.Config.DBHost,
	configs.Config.DBPort,
	configs.Config.DBName)
```

#### 3. `gorm.Open` で接続を初期化

Gormが提供する `gorm.Open` メソッドを使用して、指定したデータベースに接続します。

```go
db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
```

SQLiteの場合も同様に `gorm.Open` を利用して接続します。

## まとめ

この記事では、Gormを活用してMySQLとSQLiteの接続を柔軟に切り替える方法について解説しました。ファクトリ関数を活用することで、拡張性と保守性の高い設計を実現できます。

今後、新しいデータベースに対応する際も、ファクトリ関数に新しいケースを追加するだけで対応可能です。ぜひこのコードを参考にして、実際のプロジェクトで活用してみてください！
4K モニターを使い始めて 2 週間が経過した

自室のモニターを FullHD 27 インチから 4K 43 インチのものに変えたので使用感を書く。

# どんなモニター?
実はモニターではなくテレビに乗り換えました。
[これ (Xiaomi TV A Pro 2025シリーズ)](https://amzn.asia/d/369f1ec) です。
近頃流行りのスマートテレビってやつです。

なぜモニターではなくテレビに切り替えたのか理由は単純で、4K で大きいモニターは高くて手が出しにくいから。
前に外国人 YouTuber によるデスク紹介にて、今回のようにモニターではなくテレビを利用しているのを見かけたのが記憶に残っており、今回の買い替えの際に検討してみた感じです。

# 使用感
## 人間側
文字の視認性がかなり良いです。
DPI が 3 割ほど向上し、同じサイズの文字がより鮮明に描画され読みやすくなりました。
(FullHD ≈ 82 DPI, 4K ≈ 108 DPI)
(DCI 4K なので普通の 4K (=4K UHDTV) より少し大きい)

それとシンプルにデカいので表示可能な領域が広がり、作業時のスクロールといった操作が減少し効率向上につながりました。(たぶん)

少し目が悪く 4K 100% では負担になるため 150% の拡大を適用して利用しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2403016/428e573b-8922-3020-9f14-3fa08384b38b.png)

## パソコン側
YouTube で [4K 動画](https://youtu.be/njX2bu-_Vw4?si=sh9E7TF56JQ3xXvQ)を観た時のオンボードグラフィックがこんな感じ
CPU 使用率は再生中の平均で普段時 +10 % 程度
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2403016/865fb477-26fa-2a49-d8fb-334cec699343.png)

ネットサーフィンやオフィスソフトを使うくらいでは変更前とそれほど変わらない感じでした。

# モニター以外に変えたもの
特にありません。

4K へ変更するにあたって、普段使用するパソコンにグラボを積んでいないので映像出力側を増強するべきか悩みましたが最終的に、使ってみてから負荷を確認してから考えようと特に増強はせずに利用を開始しました。

普段使用するパソコンの CPU はデスクトップが AMD Ryzen5-5600G, ラップトップは Intel Core i5-1155G7 なのですが、当初の心配をものともせず普通に動いてくれたのでグラボ増設はしませんでした。

# 気になること
## Linux から利用すると一部ソフトで文字がぼやける
テレビの問題ではないのですが、Ubuntu 24.04 から出力したときに Google Chrome や IntelliJ IDEA といった一部ソフトで文字がぼやける現象が発生しました。

Chrome は代わりに文字のぼやけがなかった FireFox を利用できるのでまだ良いのですが、 IntelliJ は代わりが効かない(と思っている)のでどうにかしたいところです。
色々調べて起動時の VM オプション指定やプロパティ指定などを行いましたが効果はありませんでした。

# 総評
作業が快適になったのがでかい。
あと動画が高画質で観られるのめっちゃいい。
順序回路の作法 その14

# 概要
順序回路を理解する。
simcirjsを見つけたので、plunkerでやってみた。

# 参考にしたページ

https://qiita.com/yukkeaa/items/66f68b304e2b9038581c

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/05d3f089-51db-6abb-c01f-b19f58edef1a.png)


# 成果物

https://embed.plnkr.co/plunk/4CfmSmgTnzHW0MNk


以上。
Ubuntuからwindowsに持ってきたpythonファイルが動かない人へ。

## 💡 このスクリプトで何ができるの？
Pythonファイルの先頭に、次の修正を自動的に追加しちゃうスクリプトだよ！
1. **UnicodeDecodeError対策のエンコーディング設定**
2. **`open`関数を上書きして、UTF-8で安全に読み書きできるように**

---

## 🚀 使い方
1. **まずは準備**
   - 持ってきたPythonファイルを、すべて**1つのディレクトリ**にまとめてね。
   - 念のためにバックアップを取っておいてね。何が起こるかわからないから、安全第一！

2. **スクリプトをコピーして実行**
   - 以下のスクリプトをコピーして、実行してみて！

---

### 🖋️ スクリプト

```python
import os

def update_custom_open_in_py_files(directory_path):
    """
    指定されたディレクトリ内のすべての.pyファイルにおいて、
    custom_open関数が存在する場合、その内容を更新する。

    Args:
        directory_path (str): 処理対象のディレクトリのパス
    """
    # 新しいcustom_open関数の定義
    new_custom_open = '''def custom_open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None):
    # OSによって動作を切り替え
    import platform
    if platform.system() == 'Linux':  # UbuntuなどのLinux環境
        pass  # encodingはNoneのまま
    elif platform.system() == 'Windows':  # Windows環境
        if 'b' not in mode:  # バイナリモードでない場合
            if encoding is None:  # エンコーディングが指定されていなければ
                encoding = 'utf-8'  # Windowsのみutf-8を指定
    return original_open(file, mode, buffering, encoding, errors, newline, closefd, opener)
'''

    # ディレクトリ内のすべての.pyファイルを検索
    for root, dirs, files in os.walk(directory_path):
        for file in files:
            if file.endswith('.py'):  # .pyファイルを対象
                file_path = os.path.join(root, file)
                try:
                    # ファイル内容を読み込み
                    with open(file_path, 'r', encoding='utf-8') as f:
                        content = f.readlines()

                    # custom_open関数の開始と終了を特定
                    start_idx = None
                    end_idx = None
                    for i, line in enumerate(content):
                        if "def custom_open(" in line:
                            start_idx = i
                        if start_idx is not None and "builtins.open = custom_open" in line:
                            end_idx = i
                            break

                    # custom_open関数が見つかった場合
                    if start_idx is not None and end_idx is not None:
                        # 関数を新しい内容で置き換える
                        content = content[:start_idx] + [new_custom_open] + content[end_idx + 1:]
                        with open(file_path, 'w', encoding='utf-8') as f:
                            f.writelines(content)
                        print(f"Updated custom_open in: {file_path}")
                    else:
                        print(f"Skipped (no custom_open found): {file_path}")

                except Exception as e:
                    print(f"Error processing {file_path}: {e}")

# 使用例
# ディレクトリパスを指定
dir_list = [
    "修正pythonファイル群保存先ディレクトリpath",
    "修正pythonファイル群保存先ディレクトリpath＿２(",
]
for path in dir_list:
    update_custom_open_in_py_files(path)

```

---

## 🐾 注意点
- **バックアップは必ず取っておこう！** このスクリプトを実行するとファイルが上書きされるよ！
- まだ問題起きるかも知れないので、慎重に。
---
M5StampS3、2ボタンで遊ぶ(マルツ(秋葉原)で買った)



参考


https://qiita.com/caa45040/items/b98a2454535b86db1e64


x 過去ログを見よ!!!
x 3.1.0

![o_coq746.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d005cc04-3911-0dae-9504-1deb657bf15b.jpeg)

![o_coq747.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c989ede8-ef22-91b3-4648-9fc35ad7d3e4.jpeg)

![o_coq748.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/bb6b5e78-4068-9873-5868-e0cba556e1e1.jpeg)


```c++



//2button_test1_M5StampS3_1


//インクルド
#include <Arduino.h>


//初期化
void setup() {
  // put your setup code here, to run once:

  //GPIOの初期化
  pinMode(21, OUTPUT);
  pinMode(13, INPUT);
  pinMode(15, INPUT);

}//setup


//メインループ
void loop() {
  // put your main code here, to run repeatedly:

  int a = digitalRead(15); //ボタンの読み込み
  int b = digitalRead(13); //ボタンの読み込み

  if ( a != 0 && b == 0 ) {

    neopixelWrite(21, 64, 0, 0);

  } else if ( a == 0 && b != 0 ) {

    neopixelWrite(21, 0, 0, 64);

  } else if ( a == 0 && b == 0 ) {

    neopixelWrite(21, 64, 0, 64);

  } else {

    neopixelWrite(21, 0, 0, 0);

  } //endif

  delay(10); // 1 / 100 秒待つ

}//loop




```
2025/1/3　学習記録


### 現状：
エンジニアへの未経験転職。
就職先もほぼ決まり、2月からひよこエンジニアに。

2025年は頑張ろうということで、2025年学習記録3日目。

内容は常に書き散らしのメモです、あしからず。

当面の目標：LPIC101,102合格

---

## 四則演算

- 計算結果の出力方法
`echo $(( 1 + 1 ))`

- `echo $(expr 1 + 1)`でも出力可能だが、
その場合、積を計算する際は`*` ではなく `¥*` と書く必要がある。

### 変数を用いる場合
- 前述の記述はそのまま。
`echo $(( num1 + num2 ))` 
- 後述の記述は `$()` の他に、各変数の前にも `$` が必要。
`echo $(expr $num1 ¥* $num2)`

### `bc`コマンド
複雑な計算には`bc`コマンドが必要。
使用するにはインストールが必要。
- `$ echo "計算式" | bc`
- `-l`オプションを使用すると、より高度な計算が可能に。
- `sqrt` を使用すると平方根を求めることができる。
- Mac OSでは`yum`コマンドは使用できない → 一旦スルー。


### `Case`文
- 条件分岐。
- 



if文との違いは？
## perplexity回答：
if文とcase文は両方とも条件分岐を行うための構文
使用場面や特徴に違いあり

### 主な違い
1. **条件の数と複雑さ**:
   - if文: 複数の条件を扱え、複雑な条件式も可能
   - case文: 単一の値や変数に対する複数の条件を扱う

2. **可読性**:
   - if文: 条件が少ない場合に適している
   - case文: 多数の条件がある場合、より読みやすくなる傾向がある

3. **処理の柔軟性**:
   - if文: より柔軟な条件設定が可能
   - case文: 等価比較に特化している

### 使用シーン

**if文の適用例**
- 複雑な条件分岐が必要な場合
- 範囲指定を含む条件分岐（例：年齢による分類）
- 論理演算子（AND, OR）を使用した複合条件

### case文の適用例
- 単一の変数や式に対する複数の値との比較
- 列挙型のような離散的な値の処理
- 多数の条件分岐がある場合の可読性向上

**コード例の比較**

### if文
```python
if age >= 65:
    print("高齢者です")
elif age >= 20:
    print("成人です")
elif age >= 2:
    print("子供です")
else:
    print("幼児です")
```

### case文（Pythonの場合はmatch文）
```python
match color:
    case "red":
        print("止まれ")
    case "yellow":
        print("注意して進むか止まれ")
    case "blue":
        print("進め")
    case _:
        print("該当なし")
```

if文とcase文は、状況に応じて適切に使い分けることで、コードの可読性と効率性を向上させることができます[1][2][4]。

Citations:
[1] https://qiita.com/germany124805/items/930ff69565a51e2e12f4
[2] https://www.sejuku.net/blog/25214
[3] https://gotto50105010.hatenablog.com/entry/2018/12/03/231711
[4] https://it-biz.online/sap/if-case/
[5] https://www.kikagaku.co.jp/kikagaku-blog/python-if-else-elif/
[6] https://envader.plus/course/10/scenario/1081
[7] https://yuru-it-se.com/programmer-java-case/

---


### 今日はここまで！
【競プロ】Golangでの配列の部分ソート【Golang】

Golangでの配列の部分ソートを紹介します。
[ABC289 B問題](https://atcoder.jp/contests/abc289/tasks/abc289_b "ABC289 B問題")で使用する場面があるので、サンプルコードとともに説明します。

## ABC B問題 サンプルコード
```go:ABC289 B.go
package main

import (
	"fmt"
	"sort"
)

func main() {
	var N, M int
	fmt.Scan(&N, &M)

	a := make([]int, M)
	for i := 0; i < M; i++ {
		fmt.Scan(&a[i])
	}
	nums := make([]int, N+2)
	for i := 0; i <= N; i++ {
		nums[i] = i
	}

	for i := 0; i < M; i++ {
		for j := i + 1; j <= M; j++ {
			if j != M && a[i]+j == a[j]+i {
				// レ点が連続していたら、まだ部分的にソートするところではないので、処理を飛ばす
				continue
			}
			// 現在のレ点が直後のレ点と地続きになっていなければ、部分ソート(降順)する
			inplaceReverseSort(nums, a[i], a[j-1]+2)
			i = j - 1 // インクリメントされるので、マイナス1してる
			break
		}
	}

	for _, num := range nums[1 : len(nums)-1] {
		fmt.Print(num, " ")
	}

}

// 配列を部分ソート(リバースソート)する関数
func inplaceReverseSort(arr []int, n, m int) {
	sort.Slice(arr[n:m], func(i, j int) bool {
		return arr[n+i] > arr[n+j] // 降順にソート
	})
}

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3771904/1dbf40f7-70b8-2b43-fa67-4d5146eec479.png)

## 部分ソート部分をピックアップ
```go
func inplaceReverseSort(arr []int, n, m int) {
	sort.Slice(arr[n:m], func(i, j int) bool {
		return arr[n+i] > arr[n+j] // 降順にソート
	})
}
```
- return arr[n+i] > arr[n+j] について：
    - iとjは、arr[n:m]の中でのローカルなインデックスを指す。
    - つまり、jはn:mのスライス内部の相対的なインデックスであり、元の配列arrのインデックスではない。
    - 元の配列arr全体を参照する場合、iとjは相対インデックスなので、nを加算して元の配列の絶対インデックスに変換する必要がある。
    - arr[n+i] > arr[n+j] の形にすることで、元の配列arrの正しい要素を比較できる。

## 最後に
Golangでソートするとなると、sort.Ints()やsort.Sort(sort.Reverse(sort.IntSlice()))、sort.Slice(arr, func(i, j) bool { return arr[i] < arr[j]})あたりをよく使いますよね。
ただ、どれも配列全体をソートする場面が多いので、意外とインデックスを使って部分ソートする場面は、灰色のレートだと少ないように思いました。
今回は、ADTでこの問題を知り、200点問題でも部分ソートで回答できる問題に会えてよかったと思いました。
macOS+JISキーボードでバックスラッシュ

日本語配列のMacBookとかJISキーボードを繋げているときに、Ghosttyのデフォルトでは`option+¥`のように入力しても`\`が入力できない。

以下のように設定してやればいい。

```ini:config
keybind = ¥=text:\\
```

この設定で、単に`¥`を入力すれば`\\`が入力される。`option+¥`ではそのまま`¥`が入力される。

設定ファイルの仕様については以下のページを参照。

https://ghostty.org/docs/config

https://ghostty.org/docs/config/keybind

## 動かない設定

以下のように設定すれば`option+¥`で`\`が入力されるようにできそうだが、**現実には動かない**。

```ini:config
keybind = option+¥=text:\\
```

これはおそらく[`macos-option-as-alt`](https://ghostty.org/docs/config/reference#macos-option-as-alt)との兼ね合いもあるのかもしれないが… 特別な事情やこだわりがなければ明示的には何も弄らない方がいいだろう。

## 現状の設定

せっかくなので置いておく。

```ini:config
font-family = "UDEV Gothic HSJPDOC Regular"
font-family-bold = "UDEV Gothic HSJPDOC Bold"
font-family-italic = "UDEV Gothic HSJPDOC Italic"
font-family-bold-italic = "UDEV Gothic HSJPDOC BoldItalic"
font-size = 13.5
cursor-style = "block"
theme = dark:Jellybeans, light:Alabaster
mouse-shift-capture = true
keybind = ¥=text:\\
clipboard-read = ask
clipboard-write = allow
```

Ghosttyには[Iterm2-color-schemes](https://iterm2colorschemes.com/)がバンドルされているので好きなテーマを選ぶのがよい。