OmniAICreator/Qiita-1.07M huggingface dataset:
AtCoder Beginner Contest 398 振り返り

ABC398の振り返りです。今回3週間ぶりの参加でした。

## 結果

ABCの3完でした。

![スクリーンショット 2025-03-23 16.48.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167729/6c117f33-c498-4ca4-a5fe-5c0aaff54b63.png)

![スクリーンショット 2025-03-23 16.50.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167729/699c0d0b-5c4d-427b-a654-b7a179b60e14.png)

## ふりかえり

### A問題

- 問題
  - https://atcoder.jp/contests/abc398/tasks/abc398_a
- 回答
  - https://atcoder.jp/contests/abc398/submissions/64040309

問題文の条件

- 各文字は`-`または`=`である
- 回文である
- 文字列中に`=`は 1 個または 2 個含まれる。 2 個含まれる場合、それらの`=`は隣接している

を読み替えると、

- nが奇数の場合: 真ん中が`=`になり、これ以外が`-`になる
- nが偶数の場合: 真ん中が`==`になり、これ以外が`-`になる

と読めます。

ここから、

- nが奇数の場合
  - `nを2で割った数の'-' + "=" + nを2で割った数の'-'`
- nが偶数の場合
  - `nを2で割った数 - 1 の'-' + "=" + nを2で割った数 - 1の'-'`

（割った後の余りは切り捨て）

で答えが得られるとわかります。

これをコードに起こすと、以下のようになります。

```haskell
main :: IO ()
main = do
  n <- readLn @Int

  let s = replicate (n `div` 2) '-'

  putStrLn $
    if odd n
      then s ++ "=" ++ s
      else tail s ++ "==" ++ tail s

```

### B問題

- 問題
  - https://atcoder.jp/contests/abc398/tasks/abc398_b
- 回答
  - https://atcoder.jp/contests/abc398/submissions/64056381

数をソートして、グルーピングします。
例えば、入力が`1 4 1 4 2 1 3`の場合、昇順ソートすると

`[1, 1, 1, 2, 3, 4, 4]`

これをグルーピングして、

`[[1, 1, 1], [2] [3] [4, 4]]`

で、全てのリストの長さを取ると

`[3, 1, 1, 2]`

このうち、3以上の値と2以上の値がそれぞれ1つ以上あればYesになります。
コードは以下の通りです。

```haskell
main :: IO ()
main = do
  as <- sort <$> getInts

  let cnt = sortOn Down $ map length $ group as

  printYN $ length cnt >= 2 && head cnt >= 3 && (head . tail) cnt >= 2
```

ちなみに、最初のコードでは最後の行を以下のようにしており、これが原因で1ペナになってしまいました。

```haskell
  printYN $ length cnt >= 2 && head cnt == 3 && (head . tail) cnt == 2
```

このコードの場合だと、`1 1 1 1 2 2 2` のような3つ以上、2つ以上同じ数を含む入力を考慮できません。

同じようにソートしてグルーピングすると

`[[1, 1, 1, 1] [2, 2, 2]]`

それぞれの長さを取ると

`[4, 3]`

となります。
これは正解なのですが、誤ったコード例だと正しく判定されずWAになります。

### C問題

- 問題
  - https://atcoder.jp/contests/abc398/tasks/abc398_c
- 回答
  - https://atcoder.jp/contests/abc398/submissions/64083560

まず、`zip [1 ..] <$> getInts`で番号と数を紐付けます。
その後、数でソート、グルーピングし、数が一つしかないものだけfilterして抽出します。

その後、数が最大のものの番号を出力したいので、`fst $ maximumOn snd`でsnd、つまり数が最大のものの番号を取得します。

```haskell
main :: IO ()
main = do
  n <- readLn @Int
  as <- zip [1 ..] <$> getInts

  let as' = sortOn snd as
      t = concat $ filter (\l -> length l == 1) $ groupOn snd as'
  print $ if null t then -1 else fst $ maximumOn snd t
```

解いている間はなぜか再帰でがんばろうとして2ペナだしましたが、そんなことする必要はありませんでした。

ちなみに、数の出現回数を`IntMap`で持っておいて、valueが1のもののみ取得する方法もあります。
こっちのほうが若干早いです。
回答は[こちら](https://atcoder.jp/contests/abc398/submissions/64110222)においています。

```haskell
main :: IO ()
main = do
  n <- readLn @Int
  as <- getInts

  let im = IM.fromListWith (+) $ map (,1) as
      ks = IM.keys $ IM.filter (== 1) im
      pos = fromMaybe (-1) $ safeMaximum ks
      im2 = IM.fromList $ zip as [1 ..]
  print $ fromMaybe (-1) $ IM.lookup pos im2
```

## 全体を振り返って

今回はペナを多めに出してしまいました。
問題文の誤読や方針の誤りが原因なので、もう少ししっかり考えられるようにしたいです。

## おまけ

今回もRustで解いてみました。
Bは`combinations(5)`、Cは`HashMap`に出現回数を保存して解いています。

- B 
  - https://atcoder.jp/contests/abc398/submissions/64111097
- C
  - https://atcoder.jp/contests/abc398/submissions/64109241
mmcのスレッド対応

# はじめに
Rustでマルチスレッドプログラミングを行うとデータがスレッド間で競合するところはMutex型のtraitでくるまないと型エラーになるので安全であるという話を良く聞きます。これはとても優れたデザインなんですが、そこまでやるのであれば競合するところに勝手にMutexを入れてほしいと思うのです。
ちょっと考えてみたら抽象解釈を利用すればそれが可能であることに気づいて、mmcにマルチスレッド対応の機能を入れてみました。これは競合するオブジェクトをレシーバーとするメソッド呼び出しやインスタンス変数のアクセスに自動的に排他制御が入るというものです。

# mmc
mmcのマルチスレッド化のために簡単にmmcの説明を行います。詳しくはを参照してください。
mmcは抽象解釈という技術を使って型解析やエスケープ解析を行い、mrubyのバイトコードを高速なC言語に変換するトランスレータです。抽象解釈では通常のインタープリテーションと同様にmrubyのバイトコードを実行していきます。ただし、通常のmrubyの処理系と違い値ではなく型情報レベルで実行します。抽象解釈で型情報があたかも値の様に伝搬していくことで変数・オブジェクト・メソッドの戻り値などの型が推定できます。同時に値がどこに格納されるかを記録することでエスケープ解析を行うことも出来ます。
mmcでは大きく2つの部分からなります。一つは抽象解釈の部分で一旦プログラム全体を型レベルで実行します。型レベルではループなどは繰り返さないので実際に実行するのに比べれば短時間で実行できます。これをPASS 1と呼ぶことにします。
もうひとつはCへの変換です。PASS 1で得た型の情報やエスケープの情報を使用してC言語に変換します。この中で gen_type_conversion というメソッドが大きな働きをします。これはsrcの型, dstの型を渡して、srcの型からdstの型へ型変換するコードを生成するメソッドです。ロックを掛ける処理はこのメソッドが型変換の一貫として生成します。これをPASS 2と呼びことにします。
オリジナルのmmcではこの２つからなる(正確にはバイトコード列を作る処理があるが今回は割愛)だけだが、スレッド対応にはPASS 1とPASS 2の間に処理が入る。これをPASS 1.5と呼ぶことにする。

# mmcのマルチスレッド対応
## 競合するオブジェクトの検出
競合するオブジェクトを検出するためには複数のスレッドから呼び出されているメソッドを検出することで行います。複数のスレッドから呼ばれているメソッドが分かれば次の節で説明するeffect解析の結果を用いることでどのオブジェクトが競合しているかわかる。effect解析はそのメソッドがどのような副作用を持っているかを解析するもので、オブジェクトの生成やインスタンス変数の読み書きなどの情報を使用する。
PASS 1で抽象解釈中にメソッド呼び出しをした場合、どのメソッドからどのメソッドに呼び出したかを記録していきます。あるメソッドがどのメソッドを呼ぶかの一覧は一見簡単に得られそうですが、Rubyの場合はポリフォリズムやsendメソッドなどのために見た目ほどには簡単ではありません。静的に型を決める必要があります。
PASS 1で得られたメソッドごとにどのメソッドを呼び出したかの情報をPASS 1.5でつなぎ合わせてグラフの形にします。再帰呼び出しを行うと循環ができますので循環にひっかからないようにする必要があります。

## effect解析
effect解析はJuliaやOCamlなどで行われている副作用の解析です。mmcでもPASS 1でバイトコードをトラバースする際に副作用の情報を集めるようにしました。副作用としては次のようなものがあります。
<d1>
  <dt> 
## lock, unlockの自動挿入
Pythonの主なライブラリ(NumPy, pandas, Matplotlib, Plotly, scikit-learn, SciPy)

## はじめに
Pythonの主なライブラリについてまとめてみました。

## 主なライブラリ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/e93769ed-ae7b-47ba-9e46-e4d60d3a1f8f.png)

## NumPy
　配列構造をデータ型として提供し、数値演算や加工などの機能を持つ、Pythonにおけるデータ分析の基礎となるライブラリ。
　NumPyが提供するndarray型は、効率的にデータを扱える内部構造となっている。１次元配列から多次元配列をサポートしている。配列の要素は全て同じデータ型で定義する。また、NumPyが提供するデータ型には、例えばnumpy.float32など、整数型や浮動小数点数型などがある。これらのデータ型は、データの精度などを厳密に決めてメモリを確保し、効率的な処理を可能にしている。

### Numpyが持つ機能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/e3eb0e6a-7509-487f-985b-a1ab1a2417a8.png)

## pandas
　データ加工ライブラリとして、１・２次元のデータ構造を提供し、データ加工やデータ読み書きなどの豊富な機能を持ち、Pythonでデータ分析を行うときに最も使われるライブラリ。
　pandasは、１次元のSeries型と２次元のDataFrame型の２つを提供する。DataFrameはSeriesが複数列あるという集まりと考えるのがよい。Seriesは、全ての要素が１つのデータ型で統一される。つまり、DataFrameの１つの列は、１つのデータ型となる。なお、pandasは内部でNumPyのndarrayが使われているので、部分的にNumPyの機能も使える。

### pandasが持つ機能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/e3f666c4-fca2-4112-b835-64d07fc16c3b.png)

## Matplotlib
　Pythonの可視化ライブラリで、グラフを描画する。
　MATLABの影響を強く受けて作られたライブラリ。主に２次元のグラフを得意としているが、３次元のグラフも描画出来る。

### Matplotlibが持つ機能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/83c58c02-e0d0-4bb4-a8ac-e261c7a2f435.png)

## Plotly
　インタラクティブなグラフ描画を得意とする可視化ライブラリ。
　様々な種類のグラフを作成でき、JavaScriptが内部で使われていることでズームイン/ズームアウトなどが可能。インタラクティブな地図の描画も出来る。

### Plotlyが持つ機能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/c50f4fc1-773b-4dd3-905d-23d850808925.png)

## scikit-learn
　機械学習を行うライブラリ。機械学習を始めるならscikit-learnの使い方を覚えることをおすすめする。
　多くの機械学習アルゴリズムが実装されていて、統一的なインタフェースで様々な機械学習アルゴリズムの学習（訓練）から推論までサポートしている。scikit-learnは機械学習に関連する機能が充実している。サンプルデータの提供から、データの分割を行う様々な機能やモデル性能の評価を行う機能なども持っている。
　scikit-learnでは、NumPyをベースとしたデータの受け渡しが可能。さらに、pandasのDataFrameもそのままデータとして使えるので、データ加工までをpandasで行い、機械学習にscikit-learnを使うことで、データ型をさほど意識せずに一連の処理を実装出来る。また、結果を可視化する際にはndarray型として出力されたデータをpandasのDataFrameに変換して加工し、Matplotlibに渡して可視化するということが多く行われている。

### Scikit-learnが持つ機能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/5e792012-c1ff-4540-8793-5d7d7b46321f.png)

## SciPy
　科学技術計算を支えるライブラリ。
　微分方程式の数値解析やフーリエ変換など、様々な演算・計算をサポートしている。内部的にはC言語やFORTRANで実装されており、効率的に演算が行われている。NumPyの配列(ndarray)をサポートしている。また、scikit-learnは内部でSciPyを使っており、機械学習に必要な演算はSciPyが支えている。

### SciPyが持つ機能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/fc2e5553-d71a-4499-8c22-caae552114d8.png)

## そのほかのライブラリ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/141ffee3-cb4c-4608-a942-875985b9cdac.png)

## 深層学習ライブラリ
　深層学習（ディープラーニング）に使われるライブラリは、Pythonで扱えるものが多くある。
　主なライブラリは次の３つ。
 ・TensorFlow
 ・PyTorch
 ・Keras

## おわりに
ここまで読んでいただきありがとうございます！

## 参考文献
・Pythonデータ分析 実践ハンドブック　実務で使えるデータ加工のテクニック 単行本（ソフトカバー） – 2023/9/22
寺田 学 (著), 神沢 雄大 (著), ＠driller (著),
p.18-21
var_dump() / dd() / dump() の違いと使い分け

# はじめに

LaravelやPHPでコードを書いていると、**変数の中身を確認したい**場面が頻繁にあります。  
そんなときに便利なのが `var_dump()` / `dd()` / `dump()` ですが、それぞれ少しずつ挙動が違います。

この記事では、**この3つの違いや使い分け方**を自分の備忘録としてまとめておきます。

---

# ① `var_dump()`（PHP標準のデバッグ関数）

```php
$test = ['name' => 'Taro', 'age' => 25];
var_dump($test);
```

**特徴:**
- PHPにもともと備わっている関数（Laravelに限らず使える）
- 型・長さ・値まで詳しく出力される
- HTMLの画面にそのまま出力されるため、見た目はちょっと地味
- 配列・オブジェクトの中身確認に便利

**出力例:**
```
array(2) {
  ["name"]=>
  string(4) "Taro"
  ["age"]=>
  int(25)
}
```

# ②`dd()`（Laravel専用、Dump & Die）

```php
dd($test);
```

**特徴:**
- Laravelが提供しているデバッグ用関数
- dd = Dump and Die（ダンプして終了）
- 変数の中身を表示した後、処理を強制的に終了する
- Web画面でも見やすく整形される（HTMLベース）

**よくある使い方**
- コントローラーやルーティングで、処理の途中でデータを確認したいとき
- Laravelならとりあえず dd() すればOK、というくらい定番

# ③`dump()`（Laravel / Symfony の関数）

```php
dump($test);
```

**特徴:**
- Laravelでも使える、dd() の「処理を止めないバージョン」
- 変数の中身を表示するが、その後も処理が続行される
- dd() のように止めたくないときに使う
- ビューファイル内でも便利

**使い分け例:**
```php
dump($user); // 処理は続く
dd($user);   // 処理はここで終了
```

# ④実務での使い分けまとめ
![IMG_7723.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246240/64346ba6-1f14-4507-a771-7a2b3ddb1676.jpeg)

# ⑤おすすめの使い分けパターン
![IMG_7724.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246240/1c2c169e-1126-490d-9d16-01d7eab2f2ac.jpeg)

# ⑥補足: 複数引数もOK
```php
dd($user, $posts, $comments);
```
複数の変数を一度に確認したいときも便利です。

# ⑦まとめ
- `var_dump()`はPHP標準、最低限の出力だけどどこでも使える
- `dd()`はLaravel開発で最もよく使う、即終了＆見やすい
- `dump()`は途中経過を確認したいときに便利な柔らかい版
HTTPについて学習

## はじめに
HTTPについて学習したことをまとめました

## 1.HTTPとは
HyperText Transfer Protocol(HTTP)はWeb上でデータを送受信するための通信ルール(プロトコル)です
WebブラウザとWebサーバーがやり取りをする際に使用されます
例えば、ユーザーがブラウザでhttps://www.google.com にアクセスすると、HTTPを使ってGoogleのサーバーにリクエストを送り、GoogleのサーバーからWebページのデータ(HTML,CSS,画像など)がレスポンスとして返ってきます

## 2.プロトコルとは
プロトコル(Protocol)とは、「コンピュータ同士が通信するための決まりごと」です
人間同士の会話をする時に共通の言語(日本語、英語など)が必要なのと同じように、コンピュータ同士も正しくデータをやり取りするために「通信ルール」を決めています

HTTPもその一種で、Webページのデータを送受信するためのルールを定めています。他にも、以下のようなプロトコルがあります

* TCP/IP(インターネット通信の基盤となるプロトコル)
* FTP(ファイル転送のためのプロトコル)
* SMTP(メール送信のためのプロトコル)
* HTTPS(HTTPの安全性を高めたもの)

## 3.HTTPリクエスト
HTTPリクエストとは、クライアント(ブラウザなど)がサーバーにデータを要求するための通信です
例えば、ブラウザでhttps://www.google.com にアクセスすると、Googleのサーバーに「トップページをください」というリクエストが送られます

**HTTPリクエストの構成**

HTTPリクエストは以下の3つの要素で構成されています
1. リクエストライン(Request Line)
    * どのページを取得するか、どのHTTPメソッドを使うかを指定
    * 例：GET / HTTP/1.1

2. ヘッダ(Headers)
    * 追加情報(ユーザーエージェント、言語、クッキーなど)を送る
    ```:例
    Host: www.google.com
    User-Agent: Mozilla/5.0
    Accept: text/html
    ```

3. メッセージボディ(Message Body)
    * データを送信する場合に使う(POSTリクエストなど)
    * 例：フォームの入力データなど

**HTTPメソッドとは？**

HTTPメソッドは、リクエストの種類を指定するためのものです
主なメソッドは以下の通りです
|メソッド|説明|
|--------|----|
|GET|指定したリソースを取得(Webページを表示)|
|POST|新しいデータをサーバーに送信する(フォーム送信など)|
|PUT|指定したリソースを更新する|
|DELETE|指定したリソースを更新する|
|PATCH|指定したリソースの一部を更新する|
|HEAD|レスポンスのヘッダだけを取得する|
|OPTIONS|利用可能なメソッドを取得する|

## 4.HTTPレスポンス
HTTPレスポンスとは、サーバーがクライアント(ブラウザなど)に返すデータのことです
例えば、https://www.google.com にアクセスすると、GoogleのサーバーからWebページのデータがレスポンスとして返ってきます

**HTTPレスポンスの構成**
HTTPレスポンスは、以下の3つの要素で構成されています
1. ステータスライン(Status Line)
    * リクエストの結果(成功/失敗など)を示す
    * 例：HTTP/1.1 200 OK
2. ヘッダ(Headers)
    * 追加情報(コンテンツの種類、キャッシュの指示など)を送る
    ```:例
    Content-Type: text/html
    Cache-Control: no-cache
    ```
3. メッセージボディ(Message Body)
    * 実際のデータ(HTML,JSON,画像など)
    * 例：WebページのHTMLデータ

**HTTPステータスコードとは？**
HTTPステータスコードは、リクエストの結果を表す3桁の数字です
代表的なものを以下に示します
|ステータスコード|意味|
|-----------|------|
|200 OK|リクエス成功(通常のWebページ表示)|
|201 Created|新しいリソースが作成された(POST成功時)|
|204 No Content|処理成功だが返すデータがない|
|301 Moved Permanently|URLが恒久的に変更された|
|400 Bad Request|クライアントのリクエストが不正|
|401 Unauthorized|認証が必要(ログインが必要)|
|403 Forbidden|アクセス禁止(権限がない)|
|404 Not Found|してしたページが見つからない|
|500 Internal Server Error|サーバー内部のエラー|

## 5.HTTP通信(実際のリクエストとレスポンス)
ブラウザでHttps://www.google.com/ にアクセスした場合、次のようなリクエストとレスポンスがやり取りされます。

```:リクエスト
GET / HTTP/2
Host: www.google.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: text/html
```
* GETメソッドが使われている(Webページを取得)
* Host: www.google.com でGoogleのサーバーを指定
* User-Agentはブラウザの情報

```:レスポンス
HTTP/2 200 OK
Content-Type: text/html; charset=UTF-8
Cache-Control: private, max-age=0
Set-Cookie: 1P_JAR=2024-03-19; Secure; SameSite=Strict
```
* HTTP/2 200 OK → HTMLデータが返される
* Content-Type: text/html → HTMLデータが返される
* Set-Cookie → Googleがクッキーを設定

そして、メッセージボディにはGoogleのトップページのHTMLデータが含まれています。ブラウザはこれを解析し、Webページとして表示します

## まとめ
HTTPを学習することによってブラウザとサーバーのやり取りがどのようにして行われているのか、HTTPはWeb上のデータ通信のルールであり、プロトコルはコンピュータ同士の通信ルールなど、ブラウザがWebページを開く仕組みを理解することができました。
オープンＣＡＥ勉強会【岐阜】への投稿資料

# 要旨 
岐阜高専の柴田良一先生が取り組んでいる「オープンＣＡＥ」に関する情報を発信している題記のサイトが、2025年3月28日で閉鎖されるとのことです。必要に応じて順次データを移動するとのことですので、再度見ることのできる内容や時期が不明です。
[OpenCAE Users Wiki：３月２８日まで](http://opencae.gifu-nct.ac.jp/pukiwiki/index.php?OpenCAE%20Users%20Wiki)
[2025年5月から再開しています](https://opencae-dalab.org/pukiwiki/)

小生が発表した資料のうち、現在でも利用価値がありそうなものの保管庫として、投稿いたします。

10年前は、統計用ソフト"R"、Matlabと互換ソフト、Python、LTspice、QUCS、などの活用事例の報告がありましたが、今はRとQUCSをあまり聞かなくなりました。
LTspiceは日本のユーザー会もありますが、情報量では海外のフォーラムが圧倒的に多いです。


# 1D-CAE関連資料／オープンCAE勉強会【岐阜】-20150613
---
**zipファイルをダウンロードして解凍すると、以下の資料ができます。**
---
[1D-CAE関連資料-オープンCAE勉強会岐阜-20150613.zip](https://1drv.ms/u/c/ca3fad7a4b4217c1/EfevKWx0vVZGm-ZZJVbU1iwBLNtRz_THsDbEidl0cGVeUg?e=wvjCop "小生のOneDriveへのリンク")

---
- 回路シミュレータによる1D-CAEの検討
小生の説明資料です。
---
- 1DCAEによるものづくりの革新的な教育ー平成２６年
---
- QUCS-Brinson_MOS-AK_India12
---
- SimulationsergebnisseRegelkreis mit Smith Predictor
:::note info
 手間がかかると思われますが、部品を階層化することによりMatlab/Simulink風にしたもの
 約15年前にyahoo.comのLTspiceグループから入手しました
 今は、以下のgroup.ioにおいて英語のユーザー会が運営されています
 [LTspice group: English](https://groups.io/g/LTspice)
無償の登録をすれば、古いファイルもダウンロードできるようです。
This group has thousands of SPICE models and schematics.  Use these two index files to find them:
  all_files_z_yahoo.htm  (for files uploaded before 2019),
  all_files_z_groups.io.htm  (for files uploaded since 2019 until mid 2020).
Download them, then open them in a web browser.
:::
---
- 回路シミュレータを用いたマルチフィジックス解析（東大）、2011
---
- 機械回路の記号解析－電気通信大学ー2011ppt1
- 機械回路の記号解析－電気通信大学ー2011-文書版
---
- 第1回デライトデザインシンポジウム-150220_ddpHandout

# フリーソフトによる偏微分方程式計算／オープンCAE勉強会【岐阜】-20151031
---
**zipファイルをダウンロードして解凍すると、以下の資料ができます。**

[フリーソフトによる偏微分方程式計算-オープンCAE勉強会岐阜-20151031.zip](https://1drv.ms/u/c/ca3fad7a4b4217c1/ETopDKL4SWdJmI1UDvk8gvwB1mlGQ4EZ0blFrUZU8Wd8ig?e=F3ahMg "小生のOneDriveへのリンク")

---
- フリーソフトによる偏微分方程式計算
小生の説明資料です。
---
- Rのライブラリの説明資料：deSolve, deTestSet, PDE, PDEinR
10年前はRの情報を聞く機会が頻繁にありましたが、今はPythonやMatlab互換ソフトに勢いを感じます
---
電子回路設計に必須！主要計測機器まとめ


---

#  電子回路設計に必須！主要計測機器まとめ
電子回路の設計や家電製品の開発には、**計測機器（テスト機器）**が欠かせません。  
この記事では、設計・評価・トラブルシューティングの現場でよく使われる**5つの主要機器**について、役割や特徴を分かりやすく解説します。  
理解を深めるための**おすすめ動画リンク**もあわせて紹介しています。

---

##  1. 安定化電源（直流電源）

###  主な用途
- 回路に**安定した電圧・電流**を供給
- 動作テストや部品評価に使用

###  補足・特徴
- **単電源（GND基準）**と**両電源（±電源）**がある
- 高精度・低ノイズなモデル（例：菊水「PAN-Aシリーズ」）は高信頼な出力が得られる
- **電流制限機能（CCモード）**付きで誤配線時の破損も防止

🔗 [製品例を見る（菊水電子工業 PAN-Aシリーズ）](https://www.kikusui.co.jp/)

---

##  2. ファンクションジェネレーター（信号発生器）

###  主な用途
- **正弦波、方形波、三角波**などの波形を出力
- 回路の周波数応答やフィルタ特性を評価

###  補足・特徴
- **周波数・振幅・オフセット**を自由に設定可能
- オペアンプやセンサ回路の動作チェックに便利
- 例：TEXIO FGX-295（詳細PDFあり）

 [製品資料 PDF（TEXIO FGX-295）](https://www.texio.co.jp/uploads/FGX-295_B71-0121-11_J.pdf)

---

##  3. オシロスコープ

###  主な用途
- 電圧の**波形を時間軸で観測**
- スイッチング波形やノイズ、立ち上がり時間を可視化

###  補足・特徴
- **トリガ機能**で安定した波形表示が可能
- **2ch/4chモデル**で複数信号を同時表示
- アナログ波形に加え**FFT表示**で周波数分析も可能な機種もあり

 解説動画：[【超入門】オシロスコープの使い方（電子工作講座）](https://www.youtube.com/watch?v=YSJCf63_qNo&t=300s)

---

## 📏 4. テスター（デジタルマルチメーター）

###  主な用途
- **電圧・電流・抵抗**の基本的な数値測定
- 配線の導通確認やコンポーネントのチェック

###  補足・特徴
- 手軽で安価、必携ツール
- **導通チェック音**や**ダイオードチェック機能**など多機能
- **自動レンジ設定**で初心者でも扱いやすい

 解説動画：[テスターの基本的な使い方（電子工作初心者向け）](https://www.youtube.com/watch?v=Oiyc06vAxoM)

---

## 📡 5. スペクトラムアナライザー

###  主な用途
- 信号の**周波数成分を解析**
- ノイズや高周波信号の干渉を視覚化

###  補足・特徴
- EMI（電磁妨害）や無線通信の**ノイズ評価**に必須
- 特にスマート家電・無線モジュール搭載製品の設計では重要
- 高周波設計に関わる技術者にとって基本ツール

 解説動画：[スペクトラムアナライザーを使ってみよう（高周波回路初心者向け）](https://www.youtube.com/watch?v=UZpP8UgNK-k&t=135s)

---

##  おすすめ学習動画まとめ

| タイトル | リンク |
|----------|--------|
| 【電子工作入門】安定化電源の基礎と選び方 | [▶️ 動画を見る](https://www.youtube.com/watch?v=n9L5a4pKKE8&t=626s) |
| ファンクションジェネレーターの使い方と応用 | [▶️ 動画を見る](https://www.youtube.com/watch?v=lES77yCpnRQ&t=381s) |
| オシロスコープの基本操作と実演 | [▶️ 動画を見る](https://www.youtube.com/watch?v=YSJCf63_qNo&t=300s) |
| テスターの使い方超入門 | [▶️ 動画を見る](https://www.youtube.com/watch?v=Oiyc06vAxoM) |
| スペクトラムアナライザーの仕組みと操作 | [▶️ 動画を見る](https://www.youtube.com/watch?v=UZpP8UgNK-k&t=135s) |

---

##  まとめ：道具を知れば設計の質が変わる！

計測機器は、電子回路や家電製品の「正確な設計」と「安全な動作」を保証するための必須ツールです。

初心者の方もまずは **マルチメーターとオシロスコープ** から使い始めて、徐々に他の機器にもステップアップしていきましょう。

---





いいですね！「オシロスコープ」を中心とした**回路計測工学カリキュラム**を作ることは、電気電子工学を学ぶうえで非常に実践的で役立ちます。以下に、基礎から応用まで体系的に学べるカリキュラム案を提示します。

---

##  **回路計測工学カリキュラム（オシロスコープ中心）**

###  **第1章：計測の基礎**
- 計測とは何か？誤差と精度
- 測定器の種類と役割
- 単位と校正（V、A、Ω、Hz など）

---

###  **第2章：オシロスコープの基本操作**
- オシロスコープの構成（垂直軸、水平軸、トリガ）
- アナログ vs デジタルオシロスコープ
- プローブの使い方と選び方（x1/x10）
- 波形表示の基礎（振幅、周期、周波数）

---

###  **第3章：オシロスコープによる信号観測**
- 正弦波・方形波・三角波の観測
- ノイズを含む信号の観測と処理
- デューティ比、立ち上がり時間、パルス幅の計測
- トリガの詳細設定と安定した波形の取得

---

###  **第4章：実験による測定実習**
- 実験1：発振回路の出力波形観測
- 実験2：ローパスフィルタとハイパスフィルタの周波数応答
- 実験3：パルス信号と応答波形の比較
- 実験4：増幅回路の利得とひずみの観測

---

###  **第5章：FFT・スペクトラム解析**
- 時間領域 vs 周波数領域
- FFT機能の使い方
- 高調波成分の可視化とノイズ解析
- オーディオ信号やセンサ出力の周波数解析

---
【Spring】二重送信防止について

# 二重送信について
二重送信が必要な理由については調べてください。
ざっくり言うとボタンとリクエストが1:1である中で、複数回実行されると困るリクエストに対する対策として必要なものです。

# 一般的な対応方法
主に以下の記事が参考になります（Macchinettaさんでも大丈夫だと思います）。

https://terasolunaorg.github.io/guideline/public_review/ArchitectureInDetail/DoubleSubmitProtection.html

記事の概要を言うと、以下の3つの対策方法があります。
1. JavaScriptによる2回以上ボタンを押させなくさせる機構
  　ボタンクリックをトリガにしてボタンにdisabled属性などをつける。これによりボタンは押せないのでリクエストを1回に強制させることができる。ただHTML系は開発者ツールで強制突破することができ、スクリプトで実行されると画面からのリクエストではないため、強制することはできない。

2. PRG(Post-Redirect-Get)パターンを利用した機構
  　必ずPOSTでリクエストを受けるようにし、内部でリダイレクトさせて処理を行うようにする。これによりブラウザバック時のリクエストを通さないようにすることができる（ブラウザでの検索はGETであるため通らない）。ただこれでもスクリプトでPOSTリクエストを投げられると防止することができない。

3. トランザクショントークンチェックを使用した機構
  　今回の記事の内容。リクエストの内容にトランザクショントークン（以降トークン）を入れることで、アプリ側に1回目のリクエストかどうかをチェックさせる。考え方としては画面に対して1つのトークンを設けることで、そのトークン以外からのリクエストを防止し、処理中はそのトークン以外の処理を受け付けないようにすることができる。

# トランザクショントークンチェックの実装
自分で実装もできますが、ここはライブラリを使用しましょう。提供されているライブラリは以下の2種類です。
1. org.terasoluna.gfw:terasoluna-gfw-web:5.9.0.RELEASE
  https://github.com/terasolunaorg/terasoluna-gfw
2. jp.fintan.keel:keel-spring-boot-starter-web:2.0.0
  https://github.com/Fintan-contents/keel-spring-enhance

※バージョンは逐一変更してください。

どちらでも良いのですが、私が判断した基準は以下の2点です。
1. GradleLintを使用しているかどうか
2. CSRFトークンチェックを使用するかどうか

GradleLintを使用している場合は2が良いです。これは1だと内部でaspectjライブラリのクラス名が重複し、警告ログが出るようになるからです。もちろん設定で除外はできますが、ライブラリを入れることで入れる側がライブラリについての制御を行うのは依存関係が広がってしまうのでやめておきたいところです。
CSRFトークンチェックをする場合は1が良いです。これは2だとRequestDataValueProcessorが干渉した際、対応する方法が少し難しくなるためです。1だとライブラリにそれを実現させる機構があるので、そういう意味では楽です。対応方法については、他記事が参考になりますのでそちらをご確認ください。

では実際の実装です。ライブラリとしては2を採用しています。

```java
@Controller
@TransactionTokenCheck("signup")
public class SignupController {

  @PostMapping("/signup")
  @TransactionTokenCheck(type = TransactionTokenType.BEGIN)
  public String index() {
    return "/signup";
  }

  @PostMapping(path = "/signup", param = "regist")
  @TransactionTokenCheck
  public String regist() {
    return "/signup"
  }
}
```

classに注入した@TransactionTokenCheckはそのControllerを使用する画面に対してのトークン名です。
またmethodに注入したものはそのトークンをどこで始めて、どこでチェックするかを決めてます。
上記の実装例で言うとtypeが`TransactionTokenType.BEGIN`の場合は、トークンが払い出されるタイミングで、typeのデフォルト（もしくはTransactionTokenType.IN）の場合はトークンをチェックするタイミングになります。
トランザクションの範囲を把握するために同じトークンを管理する場合は同じControllerに定義した方が良いと思います。

# まとめ
- Javaでトークンを用いて二重送信を防止するライブラリは2つある
- トークン管理はトークンの発行、チェックの2種類ある

セキュリティ観点や不正操作の防止など、まだまだ勉強させられる毎日です。
PHPerKaigi2025(2日目)オンライン視聴の感想

## はじめに
今年もPHPerKaigiの時期になりました。
オンライン視聴するライトユーザーですが、毎年楽しみにしております。
2025年のPHPerKaigiはオンライン視聴できたので、レポートしていこうと思います。

## 対象者
この記事は下記のような人を対象にしています。

- PHPerKaigi2025に参加したいが出来なかった方
- アーカイブ動画を見たいが、どれから見るか迷ってる方

:::note warn
・あくまで個人のメモのため、実際の内容と異なる場合があります
・興味のある部分のみメモしており、網羅的でない点、ご了承ください
:::

## [モジュラーモノリスでスケーラブルなシステムを設計・開発する by プログラミングをするパンダ](https://fortee.jp/phperkaigi-2025/proposal/9d6ccf4b-6630-4c23-8bf6-948d24078504)
- 1モジュールを1チームで担当する
    - という理想だったが、担当チームがつかない不人気モジュールは基盤チームが面倒見る
    - PDCAをチーム単位で回しやすくなった
- クリーンアーキテクチャ
    - 1層目 ゲートウェイ　←ここだけフレームワーク依存+CQRSを意識
    - 2層目 アプリケーション　←ここがモジュール化されてる
    - 3層目 ドメイン　←ここがモジュール化されてる
- UnitOfWorkでトランザクション管理
- モジュール間連携
    - ModuleProxy(メソッドコール)
    - 非同期イベントリスナー(ドメインイベント)
- メリット
    - デプロイしやすい
    - テスト書きやすい
- デメリット
    - 学習コストが高い
    - MVCしか知らないとむずい
- 「オブジェクト設計スタイルガイド」おすすめの本

## [OpenTelemetryを活用したObservability入門 by 清家史郎](https://fortee.jp/phperkaigi-2025/proposal/76fe34e4-76ed-49b5-94a9-52b5043805dd)
- どこで何が起きていて、何をすれば治るのか、を知るのがObservability
- Observabilityの3要素
    - ログ
    - メトリクス
    - トレース
- OpenTelemetry
    - 言語を問わないSDK
    - ベンダーニュートラル
    - PHPの場合、8.0以上必要
    - マイクロサービス間のトレースが容易に
- 計装：測定、収取する仕組みを導入すること

## [アーキテクトと美学：美しさがシステムにもたらす秩序と未来 by nrs](https://fortee.jp/phperkaigi-2025/proposal/65143400-54ab-4eb0-ad96-1044364de149)
- デザイン = 審美性を根源とする設計行為
- 美しさは普遍的なものである
- 美しさは解析できる = 美しさは作れる
- アーキテクトが芸術に触れることは言語化能力のトレーニングとして有用

## [技術的負債を正しく理解し、正しく付き合う by 河瀨 翔吾](https://fortee.jp/phperkaigi-2025/proposal/b00332b5-8965-4438-bcce-932c3b8f8f15)
- 技術的負債は絶対悪ではなく、リスクの一種
- 適切に管理されるべき
- 技術的負債が生まれる経緯がリアルすぎる
- 技術的負債を抑える方法
    - 自動テストとCI導入は必須
    - フレームワークやライブラリの導入を絞る
    - コードの共同所有
    - ドキュメントの充実化
    - 腐敗防止層
    - 日常的なリファクタリング(20%ルール)

## [PHPで巨大データ検索の高速化：strposと計算量の重要性 by まさき。](https://fortee.jp/phperkaigi-2025/proposal/1740b466-cd6f-4895-8362-2f16c8ace62e)
- 1回の処理はms単位でも、3000万回も実施されると30秒になり、ユーザー体験に影響あり
- O(N)の処理をループ内で使う際には要注意

## [PHP 8.4がリリース！あなたはもうアップデートしましたか？ by 当田昇](https://fortee.jp/phperkaigi-2025/proposal/2272e963-b6b4-4707-88fe-2bef1a9f9e7f)
- 自動化テストがない辛いっすね...
- composer-patches使えばライブラリ起因のエラーを無理やり解消

## [小さく段階的リリースすることで深夜メンテを回避する by まきまき](https://fortee.jp/phperkaigi-2025/proposal/73ea80a1-5773-465b-bf80-5d43bd12207f)
- 一次利用カラムを用いてデータを退避+切り戻しできるように

## おわりに
カンファレンスは楽しい！
また来年も参加しようっと。

## 参考記事
[PHPerKaigi2025](https://phperkaigi.jp/2025/)
uv の GitHub ActionsでBuildする設定

## uv

- https://docs.astral.sh/uv/guides/integration/github/#caching

## [Dockerfile](https://docs.astral.sh/uv/guides/integration/docker/#installing-a-project)

poetry などとほぼ変わらず commandは `CMD ["uv", "run", "my_app"]` とすればよい。

```Dockerfile
FROM python:3.12.3-slim

WORKDIR /app

# Install uv
RUN pip install uv

# Copy files needed for uv install
COPY pyproject.toml uv.lock ./

RUN uv sync --frozen

# Copy application files
COPY ./myapp ./myapp

ENV PORT=8080
EXPOSE 8080

CMD ["uv", "run", "gunicorn", "--bind", ":8080", "--workers", "1", "--threads", "8", "--timeout", "0", "myapp.main:create_app()"]
```


## GitHub Actions

https://github.com/astral-sh/setup-uv

```yaml
- name: Install a specific version of uv
  uses: astral-sh/setup-uv@v5
  with:
    version: "0.4.4"
```


## その他

### `OSError: Readme file does not exist: README.md` が出る

```
#11 ERROR: process "/bin/sh -c uv sync" did not complete successfully: exit code: 1
------
 > [stage-0 5/6] RUN --mount=type=cache,target=/tmp/.uv-cache,sharing=locked     uv sync:
2.028       line 1366, in validate_fields
2.028           getattr(self, attribute)
2.028         File
2.028       "/root/.cache/uv/builds-v0/.tmpUz8udH/lib/python3.12/site-packages/hatchling/metadata/core.py",
2.028       line 531, in readme
2.028           raise OSError(message)
2.028       OSError: Readme file does not exist: README.md
2.028 
2.028       hint: This usually indicates a problem with the package or the build
2.028       environment.
------
Dockerfile:17
--------------------
  16 |     # https://docs.astral.sh/uv/guides/integration/docker/#caching
  17 | >>> RUN --mount=type=cache,target=/tmp/.uv-cache,sharing=locked \
  18 | >>>     uv sync
  19 |     
--------------------
ERROR: failed to solve: process "/bin/sh -c uv sync" did not complete successfully: exit code: 1
```

pyproject.tomlに `readme = "README.md"` などが書いてあって build時にないと起こるらしい。

対策としては、pyproject.tomlからreadmeを消す or Dockerfileで uv syncなどする前に `COPY README.md ./` してあげるかどちらか。

### `error: failed to create directory `/nonexistent/.cache/uv`: Permission denied (os error 13)` が出る

app用のuserがcache dirへのアクセスがないケースで起こるのでdir作成と権限を付与しておく

```Dockerfile
RUN addgroup --system --gid 1001 appgroup \
    && adduser --system --uid 1001 --gid 1001 --no-create-home appuser

RUN mkdir -p /app/.cache && chown -R 1001:1001 /app/.cache

ENV UV_CACHE_DIR=/app/.cache/uv

USER appuser
```
Kotlinで単一の発火イベントを流す機構を作る

# はじめに
今回はKotlinを使って単一の発火イベントを流すことができる機構を作っていきます
### 本文
まず、共通で使えるinterfaceを用意します
今回は単一でハンドリングすることの多いToastにしてみます
```kotlin
sealed interface SideEffect {
  data class ShowToast(val message: String) : SideEffect
}
```
次にToastを使いたいViewModelで下記のように変数を宣言します
```kotlin
// 実態は隠匿しておきたいのでpraivateにしてFlowに変換したものを利用側に流すようにする
private val _sideEffectChannel = Channel<SideEffect>(capacity = Channel.BUFFERED)
val sideEffectFlow: Flow<SideEffect>
    get() = _sideEffectChannel.receiveAsFlow()
```
最後にCompose関数で監視するための関数を用意してあげます
```kotlin
@Composable
fun <T : Any> SingleEffect(
  sideEffectFlow: Flow<T>,
  lifeCycleState: Lifecycle.State = Lifecycle.State.STARTED,
  collector: (T) -> Unit
) {
  val lifecycleOwner = LocalLifecycleOwner.current

  LaunchedEffect(sideEffectFlow) {
    lifecycleOwner.repeatOnLifecycle(lifeCycleState) {
      sideEffectFlow.collect(collector)
    }
  }
}
```
あとは下記のように使いたい画面でハンドリングをしてあげれば完成です
```kotlin
SingleEffect(viewModel.sideEffectFlow) { sideEffect ->
    when (sideEffect) {
      is SideEffect.ShowToast -> Toast.makeText(context, sideEffect.message, Toast.LENGTH_SHORT).show()
    }
  }
```
### 最後に
まだ試せてませんがこれをつかえばDeepLink周りなどの単一で発生させたいイベントにも使えるのかなと思います
もし試した方がいらっしゃればコメントに貼っていただけると助かります
React Router の Link コンポーネントを使いこなす

## `Link` って何？

React Router の `<Link>` コンポーネントは、SPAにおける「画面遷移のためのリンク」を実現するためのものです。`<a>` タグのように見た目はリンクですが、ページ全体をリロードせずにURLだけを変えて、スムーズに別の画面へ移動してくれます。

```tsx
import { Link } from 'react-router-dom';

function Home() {
  return <Link to="/about">Aboutページへ</Link>;
}
```

これだけで、URLが `/about` に変わり、`<Route path="/about" />` にマッチしたコンポーネントが表示されます。

---

## `<a>` タグじゃダメ？

普通の `<a>` タグでもリンクは作れますが、以下の問題があります。

- **ページ全体がリロードされる** → SPA のメリットが台無し
- **状態やコンテキストが失われる** → せっかく保持してた値がリセットされる
- **React Router の制御外になる** → ルーティングが複雑化

Linkコンポーネントを使えば、React Router が内部的に履歴（History API）を操作してくれるので、滑らかでストレスのない画面遷移が実現できます。

---

## 基本的な使い方

まずは React Router をインストールしておきます。

```bash
npm install react-router-dom
```

### ルーティング設定例

```tsx
// App.tsx
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import Home from './pages/Home';
import About from './pages/About';

function App() {
  return (
    <BrowserRouter>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
      </Routes>
    </BrowserRouter>
  );
}
```

### リンクを使う

```tsx
// pages/Home.tsx
import { Link } from 'react-router-dom';

export default function Home() {
  return (
    <div>
      <h1>Home</h1>
      <Link to="/about">Aboutページへ移動</Link>
    </div>
  );
}
```

これだけで、`Aboutページへ移動` をクリックすると `/about` に遷移します。

---

## 応用的な使い方

### パラメータ付きのリンク

URLに動的なパラメータを渡すこともできます。

```tsx
import { Link } from 'react-router-dom';

const userId = '123';

<Link to={`/user/${userId}`}>ユーザーページへ</Link>
```
このコードでは、`/user/123` というURLに遷移します。

---

### オブジェクトで `to` を指定する

クエリパラメータや状態も一緒に渡せます。

```tsx
<Link
  to={{
    pathname: '/search',
    search: '?keyword=react',
    state: { from: 'home' }
  }}
>
  検索ページへ
</Link>
```

| 内容 | 説明 |
|------|------|
| `pathname` | 遷移先のパス |
| `search` | URLに付けるクエリパラメータ（例：?keyword=react） |
| `state` | URLには表示されないけど、リンクと一緒に渡せる任意のデータ |


これをクリックすると、以下のようなURLに遷移します。

```
/search?keyword=react
```

しかも、「このリンクはどこから来たか（`from: 'home'`）」という情報もstateとして一緒に渡すことができます。


---

### カスタムスタイルや条件付きクラス

`Link` は `className` も使えるので、現在のURLに応じてクラスを切り替えることも可能です。
`useLocation()` フックを使えば、**現在のURLのパス情報** を取得できます。

その情報を使って、今表示しているページとリンク先が一致するかをチェック → 一致してたら `className` を付ける、という仕組みです。

```tsx
import { useLocation } from 'react-router-dom';

function Menu() {
  const location = useLocation();

  return (
    <Link
      to="/about"
      className={location.pathname === '/about' ? 'active' : ''}
    >
      About
    </Link>
  );
}
```

---

### クリックイベントと組み合わせる

リンクをクリックしたときに「ただ移動するだけ」じゃなくて、

- ユーザーをログアウトさせる  
- フォームの内容を保存する  
- アラートや確認ダイアログを出す  
- 状態をリセットする

など、**何か処理をしてからページを移動したい**場合はクリックイベントを使って実装することができます。

```tsx
<Link
  to="/logout"
  onClick={() => {
    console.log('ログアウト処理...');
  }}
>
  ログアウト
</Link>
```
このコードでは、

- 「ログアウト」リンクをクリックすると `onClick` の中の処理（`console.log`）が先に実行される
- そのあとに `/logout` へ画面遷移する

という動きになります。

---

## まとめ

- `<a>` タグのように見えるけど、裏側で履歴APIを操作
- リロードなしで快適な画面遷移ができる
- パラメータや状態を渡せたり、スタイルも簡単に制御できる
Casting in Java

###  What is cast?
Casting in Java is the process of converting a variable from one data type to another. There are two main types of casting:

**1. Widening Casting (Implicit Casting)**
**2. Narrow Casting (Explicit Casting)**

### 1. Widening Casting (Implicit Casting)
Widening casting occurs when a smaller data type is converted into a larger data type. This is done automatically by Java, so no explicit cast is needed.

```
int num = 10;
double d = num;  // int → double (automatic conversion)
System.out.println(d);  // Output: 10.0
```

### 2. Narrow Casting (Explicit Casting)
Narrowing casting occurs when a larger data type is converted into a smaller data type. This requires explicit casting because data loss may occur.

```
double d = 9.78;
int num = (int) d;  // double → int (explicit casting)
System.out.println(num);  // Output: 9 (decimal part is truncated)
```
【Web】Reactでローカルストレージを簡単に使う！カスタムフックuseLocalStorageの実装方法まとめ

# はじめに
Reactで開発していると、「ユーザーの設定をローカルに保存したい」「ダークモードを記憶させたい」といった要件が高い頻度で登場します。
そんなときに便利なのが、**`localStorage` を React の `useState` のように扱えるカスタムフック `useLocalStorage`** です。
今回は上記機能の実装方法や実際の利用方法などを備忘録的にまとめていきたいと思います。

# useLocalStorage とは？

通常、`localStorage` は `window.localStorage.getItem()` / `setItem()` を使って操作しますが、

- 値の変更で再レンダリングされない
- 型が文字列限定なので変換が面倒
- 毎回try-catch書くのがつらい

などの課題があるかと思います。
それを解決するのが、カスタムフック `useLocalStorage` です。

# `useLocalStorage` の実装方法
以下が `useLocalStorage` の実装とその使用例です。

```hooks/useLocalStorage.ts

import { useState, useEffect } from "react";

function useLocalStorage<T>(key: string, initialValue: T) {
  const [storedValue, setStoredValue] = useState<T>(() => {
    try {
      if (typeof window === "undefined") return initialValue;
      const item = window.localStorage.getItem(key);
      return item ? JSON.parse(item) : initialValue;
    } catch (error) {
      console.warn(`Error reading localStorage key "${key}":`, error);
      return initialValue;
    }
  });

  useEffect(() => {
    try {
      window.localStorage.setItem(key, JSON.stringify(storedValue));
    } catch (error) {
      console.warn(`Error setting localStorage key "${key}":`, error);
    }
  }, [key, storedValue]);

  return [storedValue, setStoredValue] as const;
}

export default useLocalStorage;
```

この実装の特徴としては、

- `initialValue` がそのままデフォルト値になる
- `T` 型パラメータで、**任意の型を保持可能**
- データを JSON 化して保存 / 復元

以上になります。
次にuseLocalStorageの使用例になります。

```tsx
import useLocalStorage from "@/hooks/useLocalStorage";

const ThemeSwitcher = () => {
  const [theme, setTheme] = useLocalStorage<"light" | "dark">("theme", "light");

  const toggleTheme = () => {
    setTheme(theme === "light" ? "dark" : "light");
  };

  return (
    <div>
      <p>現在のテーマ: {theme}</p>
      <button onClick={toggleTheme}>
        トグルテーマ
      </button>
    </div>
  );
};

export default ThemeSwitcher;
```
使用例は以上です。
上記のように保存しておくことで、ページをリロードしても前回選んだテーマが復元されます。

# 使用時の注意点

- `localStorage` は **ブラウザにしか存在しない**為、SSR時（Next.js）には `typeof window !== "undefined"` チェックが必要になります。
- 保存可能なデータは基本的に **JSONでシリアライズ可能なもの**（関数や `Date` インスタンスなどはNG）
- データサイズに上限あり（約5MB）

# まとめ
`useLocalStorage` は、**一度作れば全プロジェクトで再利用可能な便利ユーティリティ**です。

ちょっとしたカスタマイズで `sessionStorage` 対応にも拡張できますし、Cookieベースのバリエーションもアリかと思います。

# さいごに
健康管理のモチベーションもしっかり維持して邁進していきます！
Windows で mkdocs サイトを配布したい・・

# [mkdocs](https://www.mkdocs.org/) は素晴らしい。でも・・
誰もが Python環境を自在に扱えることはありませんし、ましてやWebサーバなんかローカルで動かすなんていわれても困るでしょう。
"mkdocs serve" が動く環境をどのようにしたら？WindowsのPCに落とせるかを一週間くらいやっていました。

# [NW.js](https://nwjs.io/) という話・・・ボツ
どうもWindows11でカンタンに動かせた時代は過ぎてしまったようです。今はちょっと努力が必要だし、時間がありません。

# electron で　・・・出来たけど ブツが200MBはでかい。
[electron](https://www.electronjs.org/) はマルチプラットフォームを謳う強力な開発基盤ですが、強力すぎて mkdocs でドキュメント表示する程度で 200MBのフットプリントを持つ実行ファイルが出来上がりました・・・。Electronでのパッケージ化作業過程、今後は役に立つかもしれませんので別途書こうかと思います。

# [eel](https://github.com/python-eel/Eel) これでいいよこれで。
　この結論に至るまでに [Python EelをつかってHTML/CSS/JavaScriptでGUIを構築](https://github.com/python-eel/Eel)　の記事を参考にしました。

 作業過程は余りカンタンなんで書かないことにしよう？かと思いましたがカンタンですから書いておきます。

 1. mkdocs の プロジェクト folder に main.py を書きます。
```
import eel
eel.init('site')
eel.start('index.html',mode='default')
```
1. pip install eel します。 venv しておけば安心です。
1. [バイナリ化](https://qiita.com/inoory/items/f431c581332c8d500a3b#%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E5%8C%96) 
## インストーラまで。
footprint は 7MBそこそこ
これに _internal フォルダを加えて 28MBくらいの圧縮ファイルが出来ます。
配布用のEXEファイルを作る話は、色々紆余曲折。 
[ぽぽろさんの記事](https://note.com/page10/n/ne71f5a13456f)から、
CMD.exe で駆動するバッチファイルで　powershellを実行させるパターンを紹介してもらっていますが、 これ二つ問題がありまして
1. 文字化ける
1. パスが通ってないからかpowershell.exe が実行できなかった。

コピーさせていただいた run.cmd の実行結果がボロボロに文字化けてしまったので何が起きてるのかわかりません。[^1]
[^1]: 対策は分かりましたが、それで時間を食った。

## debug..
本来なら、setup.exe っぽいものが実際にはインストールではなくドキュメントの塊を表示するだけの処理をするとなっているので、実行するたびに消える？　オカシイ？
そもそも展開できてないのでは？？　ということで、調べたら全然展開できてない。

## hogehoge.cmd の文字化け対策
[玉城 学（タマキ マナブ）さん](https://blackmagicdesign-creatorscom.jp/windows11-character-encoding-issues/?unapproved=81&moderation-hash=f92616eba94f9cfc6ff676e62ad7da06#index_id8)の
[バッチファイルで文字化け対策するには UTF-8/ANSI](https://blackmagicdesign-creatorscom.jp/windows11-character-encoding-issues/)　にある対策の一つ
```
@echo off
setlocal enabledelaydexpansion
REM ここに文字が化ける処理を入れる。
endlocal
```
を実行して、取り敢えず文字化けは消えます。

## powershell.exe が見つからない問題
* 実際に CMD.exe から　run.cmd を起動したらわかる？とやってみたところ
```
>run.cmd
指定したパスが見つかりません。
``` 
となりまして、これは powershell.exe くらいしか思いつかないので、powershell.exe ってどこだ？となります。　CMD.exe から powershell.exeを
実行できるとは限らないというところが本当に厄介。 とはいえ .ps1 では 例の
スクリプト実行許可が "Restricted" で与えられてないマシンは多いと思われ、
.BAT/.CMD に頼らざる得ません。

取り敢えず悩んでいても仕方ないので 環境変数を頼らずベタ書きします。
> C:\Windows\System32￥WindowsPowerShell\v1.0\powershell.exe

## ようやく完成・・・
![iexpress_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91470/da33850f-a6d1-47c1-bdfa-2dbd3223d53e.png)
![expand.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91470/dc18780b-813c-42b0-b48c-4aaabeb0569c.png)
![スクリーンショット_2025-03-23_15-51-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91470/28a454d6-9089-436c-b4dd-ff512b1b8ef9.png)

## 終わりに
取り敢えず、Windows PCでmarmaidまで動くようになっていますが、配布するとウィルスだなんだと誤検知してしてしまう問題があり、配布には至っていません。
諦めてPDFにするしかないみたいなところに来ています。残念。
【Next.js】ローカルで立ち上がらなかった原因と解決方法まとめ

## はじめに
Next.jsをDockerで構築中、なぜかlocalhostにアクセスしても何も表示されないエラーが発生した原因と対処法になります

## docker-compose.ymlの状況
```docker
services:
  frontend:
    container_name: trade-rush-frontend
    build:
      context: .
      dockerfile:  ./frontend/Dockerfile
    tty: true
    stdin_open: true
    volumes:
      - ./frontend:/app
    ports:
      - 3001:3001
```
- docker-compose upで起動したが`http://localhost:3001`を開いても起動ができない
:::note warn
ports:3000はrailsで使用しているため3001にしました
:::

## 原因と対策
#### 原因 
commandが指定されていない
node REPL が起動していた
docker-compose.yml に`command: npm run dev`がなかった為コンテナが起動したときに Next.jsの「対話モード（REPL）」が立ち上がっていた
#### 対策
docker-compose.yml に command: npm run dev を明示
これにより、Next.js のろーかるサーバが正しく起動されるようになる
```docker
command: npm run dev
```

#### 原因 
package.jsのscriptsにportを指定していなかった
#### 対策
package.jsonのscriptsにport3001を明示した
```json
"scripts": {
  "dev": "next dev -p 3001",
  "build": "next build",
  "start": "next start"
}
```
## まとめ
- `npm run dev`はNext.jsのローカルサーバを立ち上げる基本コマンド

- package.jsonのscripts.devにnext devが設定されている

- Dockerでも`command: npm run dev`を使えばOK
辞書の初期値の、記法による挙動の違い

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

<iframe width="560" height="315" src="https://www.youtube.com/embed/_GBFt93lGjg?si=KvRMvBYSAb17pHpk" 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>

コレクション初期化子について。

https://learn.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/object-and-collection-initializers#collection-initializers

## Dictionaryのコレクション初期化子の初期値の記法
### { キー, 値 }
```cs
var dictionary = new Dictionary<string, string>
{
    { "key1", "value1" },
    { "key2", "value2" },
    { "key3", "value3" },
};
```
### [ キー ] = 値
```cs
var dictionary = new Dictionary<string, string>
{
    [ "key1" ] = "value1",
    [ "key2" ] = "value2",
    [ "key3" ] = "value3",
};
```
## 初期値の中に同じキーが存在している場合
### { キー, 値 }
この記法は、`Add`メソッドを使って初期値を辞書に追加するように展開される。
したがって、`Add`メソッドが例外を投げる場合、つまり、辞書に存在するキーで再度追加しようとした場合、**実行時に例外**が起きる。
```cs
var dictionary = new Dictionary<string, string>
{
    { "key1", "value1" },
    { "key2", "value2" },
    { "key3", "value3" },
    
    { "key1", "value1-1" }, // 実行時に例外になる
};
```

https://learn.microsoft.com/ja-jp/dotnet/api/system.collections.generic.dictionary-2.add

### [ キー ] = 値
この記法は、見た目通り、インデクサー`this[]`を使って初期値を辞書にセットするように展開される。
したがって、辞書に存在するキーで再度追加しようとした場合、そのキーに対応する値が上書きされる。この場合、Visual Studioは、**編集時に警告**CA2244を出す。
```cs
var dictionary = new Dictionary<string, string>
{
    [ "key1" ] = "value1", // 編集時に、警告 CA2244 が出る
    [ "key2" ] = "value2",
    [ "key3" ] = "value3",

    [ "key1" ] = "value1-1", // 先行する同じキーの値を上書きする
};
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293884/2544019d-02f3-439e-bfe9-3958277886c8.png)

https://learn.microsoft.com/ja-jp/dotnet/fundamentals/code-analysis/quality-rules/ca2244

https://learn.microsoft.com/ja-jp/dotnet/api/system.collections.generic.dictionary-2.item
Linuxコマンド一覧まとめ【Pythonで学ぶ！】

---
# Linuxコマンド一覧まとめ【Pythonで学ぶ！】

Linuxの基本操作をカテゴリごとに整理して、Pythonで見やすく表示できるコードをご紹介します。Linux初心者や復習用にぴったりです！

## コードの全体像

以下のPythonコードでは、Linuxコマンドをカテゴリ別に整理し、それぞれのコマンドに「説明」と「主なオプション」を付けて出力します。

```python
# カテゴリごとのLinuxコマンドとオプションの一覧を表示する

# コマンド一覧（カテゴリ別）
commands = {
    " ディレクトリ・ファイル操作": [ 
        ["pwd", "現在のディレクトリを表示", "-L: シンボリックリンク名表示, -P: 実体パス表示"],
        ["cd", "ディレクトリ移動", "-L: リンクに移動, -P: 実体へ移動"],
        ["ls", "ファイル・ディレクトリ一覧", "-l: 詳細表示, -a: 隠しファイル, -R: 再帰表示"],
        ["touch", "ファイル作成/更新", "-a: アクセス時刻変更, -m: 修正時刻変更"],
        ["mkdir", "ディレクトリ作成", "-p: 親ディレクトリも作成, -v: 作成表示"],
        ["rm", "ファイル削除", "-f: 強制削除, -r: 再帰削除"],
        ["rmdir", "空ディレクトリ削除", "-p: 親も削除, -v: 詳細表示"],
        ["cp", "ファイル・ディレクトリコピー", "-a: 属性ごと, -r: 再帰コピー"],
        ["find", "ファイル検索", "-type f: ファイル, -type d: ディレクトリ, -size +100k: サイズ指定"]
    ],
    " テキスト操作": [ 
        ["cat", "ファイル内容表示", "-n: 行番号付き, -s: 空行まとめ"],
        ["tail", "末尾表示", "-n 10: 最後の10行, -f: リアルタイム表示"],
        ["nl", "行番号付き表示", "-ba: 全行に番号, -bt: 非空行に番号"],
        ["wc", "行・単語・バイト数表示", "-l: 行数, -w: 単語数, -c: バイト数"],
        ["grep", "文字列検索", "-i: 大文字小文字無視, -r: 再帰検索"]
    ],
    " ユーザー管理": [ 
        ["useradd", "ユーザー作成", "-m: ホーム作成, -u: UID指定"],
        ["userdel", "ユーザー削除", "-r: ホームごと削除"],
        ["groupadd", "グループ作成", "-g: GID指定"],
        ["groupdel", "グループ削除", "（オプションなし）"]
    ],
    " システム管理": [ 
        ["free", "メモリ使用状況表示", "-b: バイト単位, -s 2: 2秒ごと更新"],
        ["last", "ログイン履歴表示", "-n 5: 最新5件, -d: IP→ホスト変換"],
        ["finger", "ユーザー情報表示", "-s: 簡易情報, -m: 名前一致"]
    ],
    " ネットワーク設定": [
        ["ping", "接続確認", "-c 4: 回数指定, -w 5: タイムアウト指定"],
        ["ssh", "リモート接続", "-p: ポート番号指定, -l: ユーザー名指定"],
        ["netstat", "ネットワーク状態表示", "-a: すべて, -s: 統計表示"]
    ]
}

# プリント表示
for category, cmds in commands.items():
    print(f"\n{category}")
    print("-" * 60)
    for cmd, desc, opts in cmds:
        print(f"{cmd:10} | {desc:30} | {opts}")
```

---

##  実行結果（一部抜粋）

```
 ディレクトリ・ファイル操作
------------------------------------------------------------
pwd        | 現在のディレクトリを表示         | -L: シンボリックリンク名表示, -P: 実体パス表示
cd         | ディレクトリ移動                | -L: リンクに移動, -P: 実体へ移動
ls         | ファイル・ディレクトリ一覧        | -l: 詳細表示, -a: 隠しファイル, -R: 再帰表示
...
```

---

## 応用編

### `pandas`で表形式に表示したい？

もちろん可能です！以下のようにすれば、カテゴリごとにDataFrameに変換できます：

```python
import pandas as pd

for category, cmds in commands.items():
    df = pd.DataFrame(cmds, columns=["Command", "Description", "Options"])
    print(f"\n📂 {category.strip()}")
    display(df)
```

### 特定カテゴリだけ抽出したい？

```python
target = "テキスト操作"
for category, cmds in commands.items():
    if target in category:
        for cmd, desc, opts in cmds:
            print(f"{cmd:10} | {desc:30} | {opts}")
```

---

## まとめ

- このPythonコードでLinuxの基本コマンドを視覚的に整理できる
- コマンドの意味とオプションをまとめて覚えるのに便利
- `pandas`やフィルタ機能で柔軟な拡張も可能！

---
poetry から uvに移行する

# 移行のモチベ

uvは爆速ということで lintをruffに寄せたのと同じように package managerもuvへ

![Screenshot 2025-03-23 at 16.32.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7059/9ddadfdb-fc8b-4788-bdd2-9bc1e2b2e4d5.png)

https://docs.astral.sh/uv/ これを見てすぐにやろうと思い移行。

# 移行手順

:::note info
この時代ClineとかCursorでやれば楽かなと思ってやっていたが、生成AIすら不要で、`migrate-to-uv`を使えば一発で済む！
:::


## migrate-to-uv

https://github.com/mkniewallner/migrate-to-uv

```
uvx migrate-to-uv
```

この1コマンドで終了！
残りは、READMEなどを更新すればOK

## `poetry` -> `run`に変更

```
git grep -l "poetry run" | xargs sed -i '' 's/poetry run/uv run/g'
git grep -l "poetry install" | xargs sed -i '' 's/poetry install/uv sync/g'
git grep -l "poetry.lock" | xargs sed -i '' 's/poetry.lock/uv.lock/g'
```

## GitHub Actions

https://qiita.com/nakamasato/items/4bff0f0eecd665c68182

## renovate

renovateもサポートしているので`lockFileMaintenance`をenableしておけばいい。

```json
  "lockFileMaintenance": {
    "enabled": true
  },
```

https://docs.astral.sh/uv/guides/integration/dependency-bots/#renovate
個人事業を開始するときに提出するもの

# はじめに
2025年3月末をもって会社を退職し、翌4月からフリーランスとしてやっていくことになりました。
会社員の期間はちょうど１年間で、それまではフリーランスとしてやっていたのである程度流れは分かるのですが、思い出すために書き出してみます。
ちなみに当方IT系のエンジニアです。

# 提出物

## 前提
- 青色申告
- 適格請求書発行事業者（インボイスのアレ）
- 簡易課税制度を選択

## 個人事業の開業・廃業等届出書

とりあえずこれが無いと始まらないので。
事業開始後、１か月後までに提出のようです。

e-taxでの提出が可能です。

## 所得税の青色申告承認申請書

青色申告を行う場合に必要です。
提出期限は以下のようです（Gemini調べ）
- その年の1月1日から1月15日までに開業した場合：その年の3月15日まで
- その年の1月16日以降に開業した場合：開業日から2ヶ月以内

いずれにしても２月程度の猶予があるみたいですね。

e-taxでの提出が可能です。

## 適格請求書発行事業者登録申請書

課税事業者となり、事業者ごとの番号を発行してもらう際に必要となります。（雑すぎる？）
事業開始と同時に提出する場合、期限については記載が見当たりませんでした。
とは言え、事業開始時に適格請求書発行事業者となっているのが望ましいので、早く出すのがベターのようです。

免税事業者だった人が適格請求書発行事業者となる場合については [こちら](https://www.nta.go.jp/taxes/tetsuzuki/shinsei/annai/hojin/annai/invoice_01.htm#:~:text=%E7%99%BB%E9%8C%B2%E7%94%B3%E8%AB%8B%E6%9B%B8%E3%81%AB%E3%80%81%E7%99%BB%E9%8C%B2,%E6%8F%90%E5%87%BA%E3%81%99%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82) を参照してください。

この申請を行うことで自動的に課税事業者となるので、「消費税課税事業者選択届出書」の提出は不要のようです。

e-taxでの提出が可能です。

## 消費税簡易課税制度選択届出書

簡易課税制度で消費税の申告をしたい場合に提出。
提出期限は事業を開始する前日までに提出が必要。
期の途中で出しても却下されるので注意が必要です。（インボイス制度が始まった令和５年１０月頃は除く）

e-taxでの提出が可能です。

## 事業開始等申告書

各都道府県税事務所に対して提出する開業届。
都道府県によって書式や書類の名称も異なると思われます。
提出先についても確認が必要です。（地域によって管轄が分かれているなど）
面倒ですね。

提出しなくても確定申告等のタイミングで情報が連携され、自治体側でも把握するみたいですが、私は出すことにします。

私の居住地の管轄では郵送での提出のようです。
面倒ですね。

## その他

ぎりぎりではなく、余裕をもって書類の準備を行うのが吉。
e-taxはたまにメンテナンス日があり、その場合は提出できないので注意。
UIAPduinoをMacで使う。With WCH-LINKE

# はじめに
Switch Science の　第二回スイッチサイエンス大感謝祭　に参加した際 UIAPduinoを頂いた。
教育機関向けに安価で提供とのことで素晴らしいのですが、macで使えないとか、色々問題もありそう。
## UIAPduinoとは
https://www.uiap.jp/uiapduino/pro-micro/ch32v003/v1dot4

CH32V003を調べると、どうもハードとしてのUSBは備えていないらしいと言うことで、USBをソフトでエミュレートしているみたいです。

# 設定
# Arduino
Preferenceの"Additional Boards Manager Urls"に以下を加える。
```https://github.com/openwch/board_manager_files/raw/main/package_ch32v_index.json```

Boards Managerで”CH32"と検索し、"CH32 MCU EVT Boards by WCH"をインストールする。

# WCH-LinkE
RISC-Vモードに接続する必要があります。下記の内容が参考になりました。
自分はケースが簡単に開かなかったのでWindowsで変更しました。

https://qiita.com/nanbuwks/items/fd43cb92c6d381917f7e

# 接続
UIAPduinoは標準が５Vらしいので５Vで接続します。
５V->5V,GND->GND,SWDIO->UIAPduinoの”PD1/11”に接続します。

# メモ
以下のエラーが発生した場合
dyld[17459]: Library not loaded: /usr/local/opt/libusb/lib/libusb-1.0.0.dylib
ターミナルで下記のように入力します。
2025/03/23現在ではx86_64用のlibusbが必要みたいです。
```
> arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 
> arch -x86_64 /usr/local/bin/brew install libusb
```
PythonからC言語を実行してみよう！～ビット反転のCコードを例


---

# PythonからC言語を実行してみよう！～ビット反転のCコードを例に～

Pythonは高レベルで柔軟なスクリプト言語ですが、低レベルな処理（例えば**ビット演算**や**ハードウェア寄りの制御**）にはC言語がよく使われます。この記事では、**PythonからC言語コードを生成し、コンパイル・実行する方法**をご紹介します。

## やりたいこと

C言語でよく見られる「**32bit整数のビット反転（bit reversal）**」処理をPythonから実行してみます。

---

##  Cのビット反転コード

まずは、C言語で書いた32ビット整数のビットを逆順にする関数 `reverse_bits` を定義します。

```c
#include <stdio.h>
#include <stdint.h>

uint32_t reverse_bits(uint32_t n) {
    uint32_t result = 0;
    for (int i = 0; i < 32; ++i) {
        result <<= 1;
        result |= (n & 1);
        n >>= 1;
    }
    return result;
}

int main() {
    uint32_t value = 0b00000000000000000000000000001111;
    uint32_t reversed = reverse_bits(value);
    printf("Original: %u\n", value);
    printf("Reversed: %u\n", reversed);
    return 0;
}
```

---

##  PythonからこのCコードを実行！

Python側では、以下の手順でCコードを動かします：

1. Cコードを文字列として定義し、`.c`ファイルに保存
2. `gcc`でコンパイル
3. 実行して標準出力を取得

```python
import subprocess

# CコードをPython文字列として記述
c_code = """
#include <stdio.h>
#include <stdint.h>

uint32_t reverse_bits(uint32_t n) {
    uint32_t result = 0;
    for (int i = 0; i < 32; ++i) {
        result <<= 1;
        result |= (n & 1);
        n >>= 1;
    }
    return result;
}

int main() {
    uint32_t value = 0b00000000000000000000000000001111;
    uint32_t reversed = reverse_bits(value);
    printf("Original: %u\\n", value);
    printf("Reversed: %u\\n", reversed);
    return 0;
}
"""

# Cコードをファイルに保存
with open("bit_reverse.c", "w") as f:
    f.write(c_code)

# GCCでコンパイル
subprocess.run(["gcc", "bit_reverse.c", "-o", "bit_reverse"])

# 実行し、結果を取得
result = subprocess.run(["./bit_reverse"], capture_output=True, text=True)
print(result.stdout)
```

---

##  実行結果（例）

```
Original: 15
Reversed: 4026531840
```

この結果は、`0b00000000000000000000000000001111`（=15）をビット反転して、`0b11110000000000000000000000000000`（=4026531840）となっていることを示しています。

---

##  まとめ

- PythonからCコードを動的に生成して実行することが可能
- `subprocess` モジュールで **コンパイル** と **実行** を制御
- Cならではの **低レベルな処理** をPythonスクリプトの中で利用可能

このように、PythonとCを組み合わせることで、ハードウェア寄りの計算や処理をスクリプト上で柔軟に扱うことができます。特に、**ビット演算**や**パフォーマンス重視の処理**には有効です！

---
WebP形式の画像をpdfに変換するとファイルサイズが異常に増大する問題について

## 記事の目的
本事象の観測を広く報告すること。
## 発生している問題
表題の通りの問題が発生します。
具体的な事例としては、同内容の画像ファイル5つで、
|  | jpg | WebP |
|:-:|:-:|:-:|
| 元ファイルサイズ  | 5,652,041 B  |  1,437,884 B |
| 変換後サイズ | 5,658,594 B  | 15,395,042 B  |
| 増加率  | 0.11%  |  **970%** |

となります。
画像のサイズ自体はjpeg-->WebPで減少しているにもかかわらずpdfではその逆が起こることに着目してください。埋め込む画像の数がこれより増加した場合、これに比例して増加量も増大していきます。
## 原因
結論としては、WebPの画像デコード形式がpdfへの埋め込みに対応していないことが原因だと考察されます。画像はそれぞれ特定の画像デコード方式によって元 (raw) ファイルより圧縮されており、JPEGの場合それは離散コサイン変換 (**DCTDecode**)、PNGはDeflate (**FlateDecode**)という方式です。ここで、pdfが受け付けるデコード方式にWebPの方式がどうも含まれていないらしく[^1]、その際可逆 (Lossless)のFlateDecodeに自動で画像が変換されてしまうため、勝手にファイルサイズが増大していると思われます。

[^1]:ISO 32000-1:2008 §8.9 Imagesをざっくり参照; https://pdf-lib.js.org/assets/with_large_page_count.pdf

すなわち、今回の問題はWebPに限らず、**avif, tiff等の特殊な画像形式でも起こりうる問題**だということです。

## 解析
実際どのようにpdfの中に埋め込まれているかを見てみます。jpegが埋め込まれたpdfをテキトーにVSCodeで開き、一枚目の画像 (1200x1600)が埋め込まれてそうな部分を探します。
~~~bash:jpeg-->pdf
<< /BitsPerComponent 8 /ColorSpace [ /ICCBased 20 0 R ] /Filter /DCTDecode /Height 1600 /Subtype /Image /Type /XObject /Width 1200 /Length 1094661 >>
~~~
画像のデコードタイプが/DCTDecodeで指定されていることが確認できます。次は、pngの場合です。
~~~bash:png-->pdf
<< /BitsPerComponent 8 /ColorSpace [ /ICCBased 23 0 R ] /DecodeParms << /BitsPerComponent 8 /Colors 3 /Columns 1200 /Predictor 15 >> /Filter /FlateDecode /Height 1600 /Subtype /Image /Type /XObject /Width 1200 /Length 2318605 >>
~~~
ここでは、/FlateDecodeが指定されていることが確認できました。では、tiffならどうでしょうか。
~~~bash:tiff-->pdf
<< /BitsPerComponent 8 /ColorSpace [ /ICCBased 23 0 R ] /DecodeParms << /BitsPerComponent 8 /Colors 3 /Columns 1200 /Predictor 15 >> /Filter /FlateDecode /Height 1600 /Subtype /Image /Type /XObject /Width 1200 /Length 2318605 >>
~~~
pdf側でtiffファイルを受け付けず、png相当に変換しているので、記述がpngの場合と全く同じであることが明瞭にわかります。

バイト数の面でも、同じ画像ファイルを.tiffや.avifに変換してpdf化すると、生成物のバイト数までpngの場合と一致することが確認できます。
## 対処法
pdfが対応しており、かつバイト数が小さいjpeg形式に変換してあげれば良いです。例としてPythonで変換します。
先にPillowをターミナルでインストールして下さい。
~~~bash
$ pip install pillow
~~~
以下はコード例：
~~~python:webp2jpg.py
import os
import glob
from PIL import Image
path = r"\pictest\webp" #実際のパスにへんこう

images = [p for p in glob.glob(os.path.join(path, "*.webp")) if os.path.isfile(p)]
for image in images:
    with Image.open(image) as img:
        img = img.convert("RGB")
        img.save(os.path.splitext(image)[0] + ".jpg", "JPEG", quality=100)
~~~
### 注意点
閉じ忘れがないように、withを使って開きます。
ファイル名を元のファイルと同じにするため、os.path.splitextのタプルから最初の要素を取得しています。
画像の保存の際、quality引数を用いての品質指定が可能です。

## コメント
個人でファイルを整理していたところ画像をpdfにして保存した方が良い場合があり、その際ぶつかった問題について問題解決プロセスを記事にしてみました。初めての記事なので誤りや至らない所があればご指摘ください。

## 参考資料
[PillowのImageライブラリに関する公式解説](https://pillow.readthedocs.io/en/stable/reference/Image.html)

## 脚注