OmniAICreator/Qiita-1.07M huggingface dataset:
【ChatGPTに限らず】不可視化文字について取り上げます。


　どうも、カーブミラーです。

　今回は、不可視化文字について取り上げます。

:::note info
本記事は、生成AIについての
記事です。　　　あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　こちらも載せますね。
　　[ChatGPTが使えない？ログインできない・反応しない原因やエラー時の対処法を解説](https://aismiley.co.jp/ai_news/chatgpt-error-resolution-explanation/)
***
　著作権法については
　　こちらを参照するのが
　　　良いのではないかと。

　文化庁レポートをもとにした
　　著作権法についての動画（約20分）
　　　[かいちのAI大学　【警告】ChatGPTの画像生成は危険です...【4o Image Generation】](https://youtu.be/8VLUnG-iyo0?si=rAfjMboqmNqppDGq)
***
　まずは、【ニュース】です。

　OpenAIが
　　先日のGPT-4oアップデートで
　　　「へつらい」的な挙動に関して
　　　　発表しました。

　[OpenAI公式ポスト](https://x.com/OpenAI/status/1918321280790741189?t=fdJrT5CW9uc4SDjMZA1WVQ&s=19)

***（ChatGPT翻訳）***
先週のChatGPTにおけるGPT-4oアップデートで何が問題だったのか、この数日間徹底的に調査を行いました。

「へつらい」的な挙動に関して見落としていた点と、今後行っていく改善について詳しくご説明します。
***

　OpenAIのブログに
　　その詳細が書かれています。
　　　[Expanding on what we missed with sycophancy](https://openai.com/index/expanding-on-sycophancy/)

　この問題が起きた主な原因は、
　　ユーザーからのフィードバックを
　　　強調しすぎた報酬設計に
　　　　あったようです。

　　モデルが「好かれるように」を
　　　重視するあまり、
　　　　ユーザーに過度に
　　　　　同調・迎合するように
　　　　　　なってしまった、とか。

　“これからは、
　　このようなことが
　　　起こらないように
　　　　注意していきます”と
　　　　　ブログを締めています。
***
　では、【本題】です。

　今回は、
　　“不可視化文字”について
　　　取り上げます。

　先日、
　　慶応義塾大学の講義で
　　　使われたPDFファイルに
　　　　“不可視化文字”が使われました。

　このPDFを読み込んだ
　　生成AIは、本来の内容ではなく、
　　　トンチンカンな回答を
　　　　出してきた、とか。

　それに気付かずに
　　提出した生徒には、
　　　単位が与えられませんでした。
***
　それを
　　どうこう言うつもりは
　　　ありません。

　ここでは
　　PDFに使われた
　　　“不可視化文字”について
　　　　考えてみたいと思います。

　まず、
　　“不可視化文字”とは何か？

　不可視化文字（Invisible Characters）
　　とは、画面上には表示されないが、
　　　データとしては存在する文字
　　　　のことを指します。

　不可視化文字は
　　文字どおり、
　　　見えませんから
　　　　人間にはわかりません。

　しかし、
　　生成AIには
　　　その文字が見えています。

　そのため、
　　そこに何らかの命令（Prompt）が
　　　あれば、それを実行することに
　　　　なります。

　生成AIは、
　　文書のどこに命令（Prompt）が
　　　あっても、それを実行します。

　つまり、
　　PDFファイルなどに
　　　そうしたものが入れられれば、
　　　　生成AIは、それが
　　　　　命令（Prompt）と判断して
　　　　　　実行してしまうわけです。

　件のPDFは
　　まさにこれでした。
***
　これがもしも
　　悪用された場合、
　　　どうなるでしょうか。

　個人や企業の情報が
　　意図的に引き出され、利用される。

　ショッピング能力が
　　付与された生成AIでは、
　　　ユーザーが意図しない商品を
　　　　購入させられる。

　などが、
　　挙げられます。
***
　また、
　　今回のことで
　　　ChatGPTさんと
　　　　やり取りしていたのですが、
　　　　　生成が止まる現象が
　　　　　　見られました。

　　Promptの入力を
　　　受け付けない状態です。

　　具体的には
　　　書きません。

　　しかし、
　　　生成AIが動かなくなる危険性も
　　　　この“不可視化文字”には
　　　　　あるのです。
***
　不可視化文字を
　　安易に使わないように
　　　しましょう。

　また、
　　生成AIの出力が
　　　正しいように見えても
　　　　間違っている場合はあります。
　　　　　きちんと確認しましょう。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
【殴り書き】Reactに関数コンポーネントという概念があるのはなぜだ？

Reactで「クラスコンポーネントより、関数コンポーネントが一般的になったのは何故だろう」と思った。

<br>

これについて、調べていく。

## 「コンポーネントとは数式のようなもの」という発想

[Reactの公式ページ](https://ja.react.dev/learn/keeping-components-pure)によると、コンポーネントを純関数として考えている。

> あなたが書くすべてのコンポーネントが純関数であると仮定しています。
> つまり、あなたが書く React コンポーネントは、与えられた入力が同じであれば、常に同じ JSX を返す必要があります。

<br>

確かに、定義したUIコンポーネントが毎回同じ見た目で表示されるべきであると思う。
Reactの公式ページより、以下の例が共有されている。
`<Cup />`に、Propsを渡していないのに、見た目が変わってしまうのは大事故である。


```jsx:React
let guest = 0;

function Cup() {
  // Bad: changing a preexisting variable!
  guest = guest + 1;
  return <h2>Tea cup for guest #{guest}</h2>;
}

export default function TeaSet() {
  return (
    <>
      <Cup />
      <Cup />
      <Cup />
    </>
  );
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654759/f151a789-1a20-46ff-839c-5a99e90cc602.png)

## React はなぜ純粋性を重視するのか？ 
三つの利点を提唱している。
### 1. コンポーネントが異なる環境、例えばサーバ上でも実行できるようになる
近年では、Next.jsや[React Server Component](https://ja.react.dev/reference/rsc/server-components)が登場し、サーバーサイドでもコンポーネントを実行することが一般的になってきた。

こういったことも、関数コンポーネントの持つ純粋性あってのことだろう。

### 2. 入力値が変化しない場合、[レンダーをスキップ](https://ja.react.dev/reference/react/memo)することでパフォーマンスを向上できる
これが問題ないのは、純関数は常に同じ出力を返すため安全にキャッシュできるから


### 3. 深いコンポーネントツリーのレンダーの途中でデータが変化した場合、React は既に古くなったレンダー処理を最後まで終わらせるような無駄を省き、新しいレンダーを開始できる

Reactの関数コンポーネントは「同じ入力なら同じ出力を返す」純粋関数であるため、途中で計算をやめても、また最初からやり直せば同じ結果が得られる。

もしコンポーネントが「副作用」や「外部状態」に依存していた場合、途中で計算をやめたりやり直したりすると、結果が不安定になったりバグが起きたりする。

しかし純粋関数なら、何度やり直しても常に同じ結果になるので、安心して中断・再開ができる。

## 他にも色々とした利点があるみたい
https://tyotto-good.com/react/reasons-to-use-function-component

https://www.twilio.com/ja-jp/blog/react-choose-functional-components-jp
Earlephilhower版Raspberry pi Picoで、USB HIDデバイスが125Hz(8ms)でしか動かない場合の対処法

# USB HIDデバイスが125Hz(8ms)でしか動かない

PlatformIOでarduino-pico、いわゆるEarlephilhower版環境でRP2040-Zeroを使っていたときのことです。
パソコンにUSB接続して使うGamePadを作っていたところ、どう頑張っても125Hzでしかプログラムが動かなくなりました。
ボトルネックを調べたところJoystick.send_now();がどうも8ms処理をブロックするようだったので、対処法を調べました。
ググっても日本語の記事（というか英語の記事も）無かったので、ここに対処法を残しておきます。

# USB HID のポールレートは8ms固定になっている

そもそも8msしかでないのは仕様です。
RP2040でのUSB HIDというのはソフトウェアでの処理になっていて、このポールレート（パソコンにHIDの処理を伝える間隔）が早くなれば早くなるほどRP2040のCPU負荷が高くなります。
しかし8msというのも遅すぎるので、これを1msに変えてしまいましょう。
参考までに、PHOENIXWANというコントローラーは1000Hzで入力が入るようです。

# usb_hid_poll_intervalを変更する

該当環境では「usb_hid_poll_interval」という名前の変数が「弱い変数」としてグローバルに定義されています。
この弱い変数というのは、あとから定義した方が優先される変数のことで、setupやらloopやらを書いているファイル内でグローバル変数として再定義したとき、そっちの値が優先されます。

<strong>setup()などを書いたファイルと同じファイルにグローバル変数として以下の変数を定義します。 </strong>
```cpp
// USBのポールレートを1msに設定
int usb_hid_poll_interval = 1;
```

それだけでHIDのポールレートが1msになります。

従ってポールレートを1msにした状態でスケッチを書くなら、テンプレは以下の通りになります。

```cpp
// USBのポールレートを1msに設定(グローバル変数として定義するだけで初期設定を上書きできる)
int usb_hid_poll_interval = 1;

void setup() {
    
}

void loop() {

}
```

全体のポールレートが変わるので、Joystickだけでなく、Keyboardなども変わると思います。

RaspberryPiPicoをつかって自作キーボードを作ってる人にも多分影響するかな？

QMK Firmwareとかmbed_picoでどうなってるかは知らないけれど・・・

だれかの役に立ちますように。。。

# 参考文献

Increase HID Joystick Polling Rate · Issue #1769 · earlephilhower/arduino-pico
https://github.com/earlephilhower/arduino-pico/issues/1769

Allow changing USB HID poll rate by earlephilhower · Pull Request #1771 · earlephilhower/arduino-pico · GitHub
https://github.com/earlephilhower/arduino-pico/pull/1771/commits/0d3d52ab55efdc764b03e0fd7ab8d4165598b2d6

Issueで書き足されたドキュメントはこちら：
https://github.com/earlephilhower/arduino-pico/blob/master/docs/usb.rst
Obsidian × Excalidrawで“思考の地図”を描く【後編】


## はじめに

前編では、ObsidianのインストールとiCloud Driveとの連携、ノートの基本的な使い方について解説しました。
この記事では、**思考や情報の「構造」を見える化する図解ツール「Excalidraw」**を使って、
日々の気づき・タスク・知識をどうつなげるかを実例ベースで丁寧に解説します。

---

## なぜ図解が必要なのか？

Obsidianでメモや気づきを残していても、時間が経つとこう思ったことはありませんか？

「自分が何を考えていたか、全体像が見えない」

「ノートはたくさんあるけど、つながっていない」

そこで登場するのが Excalidraw（エクスカリドロー） という図解プラグインです。
これを使えば、ノート同士の関係やツールの使い分け、思考の流れを「ひと目でわかる図」にできます。

---


## 各ツールの使い分け

| ツール名       | 目的                           |
|----------------|------------------------------|
| Obsidian       | 思考・気づき・アイデアの発酵庫 |
| Notion         | タスクやプロジェクトの整理棚     |
| NotebookLM     | PDFや資料の要約・知識抽出       |
| Excalidraw     | 関係性や流れを図解で可視化       |

---

## Excalidrawの導入方法（Obsidianプラグイン）

### 1. コミュニティプラグインを有効化
1. Obsidian左下の「設定」⚙
2. 「コミュニティプラグイン」 → 「有効化」

### 2. プラグイン検索からExcalidrawをインストール
1. 「プラグインを閲覧」
2. `Excalidraw` を検索 → インストール → 有効化

### 3. 新しい図を作成する
- コマンドパレット（`Ctrl + P`）で  
  `Excalidraw: New Drawing` を実行  
- `.excalidraw.md` ファイルが生成されます

---

## Excalidrawで図を描く方法

### 基本操作

| 操作      | 方法                             |
|-----------|----------------------------------|
| テキスト  | 上部の `A` を選んで入力            |
| 図形      | `□` や `○` を使って枠をつくる        |
| 矢印      | `→` で関係性をつなぐ                |
| 色変更    | 下部のカラーパレットで調整可能       |

---

## 作成した図（例）

👇 Excalidrawで作成した図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054037/125cc60d-0abe-4243-8e03-e73579031acf.png)


---

## 🔗 ノートと図解をつなげよう（双方向リンク）
### 1. ノートから図を埋め込む
ノートに以下のように書くと、図がそのまま埋め込まれます：
![[viz_20250503_xxxx_excalidraw]]

### 2. 図からノートにリンクする
Excalidraw内のテキストで、こう書くだけ：
[[memo_20250503_obsidian使い分け]]

これで、図とノートを相互に行き来できるようになります。


---
## まとめ

Excalidrawは、自分の頭の中を“図”として外に出せる最強の思考補助ツールです。
Obsidianと組み合わせれば、情報・タスク・思考がすべてつなげることができますね。

---
## 💬最後に
図解は苦手だと思っていたけど、「頭の中を整える最高の手段」でした。
もしあなたも「ノートがたまってきて整理したい」「思考をもっと深めたい」と感じているなら、
Obsidian × Excalidraw、ぜひ試してみてください。
超幾何分布と2項分布の関係性

# はじめに
当たりくじと外れくじが入っている箱から戻さないでくじを引き続ける場合を考える。これを、非復元抽出という。このとき、ある試行回数で何回あたりがでるかという確率は、超幾何分布という確率分布に従う。また、試行回数に対して箱の中のくじの数が十分に大きいとき、つまり母集団が標本数よりも十分に大きい場合は、超幾何分布は2項分布に漸近する(参考文献参照)。そこで今回は、超幾何分布について紹介し、2項分布と対比させることで、両者の特性を比較する。具体的には、Pythonを用いて以下のように、2項分布と超幾何分布をグラフで表現し、両者を比較する。

![超幾何分布試行回数10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/5197ce10-ed60-4373-9656-a3e4a218752d.png)


# 超幾何分布について
箱の中に、$M$個の当たりと$N-M$個のはずれくじが存在しているとする。ここから、$n$回くじを戻さずに引き続けることを考える。このとき、当たりが$m$回出現する確率を$P_0(m)$と表現する。

このとき、$P_0(m)$はコンビネーションを用いて以下のように表現することができる。

```math
P_0(m)=\frac{_M C_m \times _{N-M} C_{n-m}}{_N C_n}
```

これを超幾何分布という。

また、性質として、$n<<N$である場合、$P_0(m)$は2項分布に漸近する。（詳細、証明は、参考文献を参照したい。）

ここで、2項分布との対比のため、袋の中の当たりの比率を$p=\frac{M}{N}$とおく。

# 2項分布について

ここで、2項分布についておさらいしておく。上記のくじ箱からくじを、引く操作を行うとする。ただし、くじは1回の試行ごとに箱へ戻すものとする。このとき、$n$回の試行で当たりが$m$回でる確率$P_1(m)$は以下のように表すことができる。

```math
P_1(m)= _n C_m p^m(1-p)^{n-m}
```

したがって、次章では、Pythonを用いて$P_0(m),P_1(m)$を数値計算する。


# プログラム

以下の記事を参考にしてプログラムを作成した。

https://qiita.com/arairuca/items/ecaf42ba67a563d32a52


```python h-g_dis.py
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
import math
#全試行回数
N=1000
#1回の事象の発生確率
p=0.5

# 試行回数
n=10
# 当たりの数
M=int(N*p)
#当たりが出る回数の合計
m=np.arange(0,n+1,1)

#階乗計算
def factorial(num):
  num2=1
  for i in range(1,num+1):
    num2=num2*i
  return num2
#確率を入れる配列
P0_ary=[]
P1_ary=[]
#超幾何分布と2項分布の確率を計算
for k in range(len(m)):
  #コンビネーションの計算
  combi0=factorial(M)/(factorial(m[k])*factorial(M-m[k]))
  combi1=factorial(N-M)/(factorial(n-m[k])*factorial(N-M-n+m[k]))
  combi2=factorial(N)/(factorial(n)*factorial(N-n))
  #反復試行の確率
  P0=combi0*combi1/combi2
  P0_ary.append(P0)
  #コンビネーションの計算
  combi=factorial(n)/(factorial(m[k])*factorial(n-m[k]))
  #反復試行の確率
  P1=combi*(p**(m[k])*(1-p)**(n-m[k]))
  P1_ary.append(P1)
plt.plot(m,P0_ary,color="blue",label="超幾何分布")
plt.plot(m,P1_ary,color="red",label="二項分布")
plt.legend()
plt.grid()
plt.title("超幾何分布"+str(n)+"回の試行")
plt.xlabel("表の出る回数")
plt.ylabel("超幾何分布の確率")
plt.savefig("超幾何分布試行回数"+str(n)+".png")
plt.show()
```

# 結果
## 試行回数が10回のとき
試行回数が10回のときの結果を以下に示す。

![超幾何分布試行回数10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/5197ce10-ed60-4373-9656-a3e4a218752d.png)

このように、母数に対して標本数が十分に少ないと、超幾何分布はかなり2項分布に漸近する。

## 試行回数が20回のとき
試行回数が20回のときの結果を以下に示す。

![超幾何分布試行回数20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/5d40fd2d-fdb9-456d-9a5f-3a25cda8ef0d.png)

すこし、2項分布からずれてしまった。
## 試行回数が100回のとき
試行回数が100回のときの結果を以下に示す。

![超幾何分布試行回数100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/00e1c1e7-daba-4306-9510-b9bed109062e.png)

かなり、2項分布からずれてしまった。

# まとめ
今回は、Pythonを用いて超幾何分布と2項分布の比較を行った。結果、くじの総数に対して、試行回数が十分に小さい場合は、超幾何分布は2項分布に漸近するということが分かった。

# 参考文献

https://amzn.asia/d/5FxYYSs
文字入力でF10使ってますよね。

Qiitaに生息する皆さんなら言うまでもないかもしれませんが、私の身近な人達で文字入力にファンクションキーを使ってない人達が意外といたので簡単に書きます。

想定読者層はWindowsのローマ字入力ユーザーです。かな入力の事情は分かりません。

# できること
日本語英語入力を切り替えずに英単語を文中に書ける。変換候補を見なくても変換先を指定できる。

# 文字入力時のファンクションキーの機能
F6 ：全角ひらがなに変更
F7 ：全角カタカナに変更
F8 ：半角カタカナに変更
F9 ：全角アルファベットに変更
F10：半角アルファベットに変更

# 使用例
｢pythonの記事をQiitaに投稿｣と入力したい場合
｢<ins>pyてょん</ins>｣
▶▶▶F10▶▶▶｢<ins>python</ins>｣
⬇
｢pythonの記事を<ins>くぃいた</ins>｣
▶▶▶F10▶▶▶｢pythonの記事を<ins>qiita</ins>｣
▶▶▶F10▶▶▶｢pythonの記事を<ins>QIITA</ins>｣
▶▶▶F10▶▶▶｢pythonの記事を<ins>Qiita</ins>｣
⬇
｢pythonの記事をQiitaに投稿｣

### あとがき
最近MacBookもよく触るのですが、初期設定だとFnキーを押しながらじゃないといけなかったり、勝手に適当なところで変換しようとしてしまうために思い通りの範囲にF10が適用されなかったりでとても不便に感じています。これの解決案をご存知の方いたら教えていただけると幸いです。
Obsidian の初期構築と iCloud Drive 連携【前半】


## 🎯 ゴール

「Obsidian」の設定、とくに **iPhone / iCloud Drive / Windows** での連携を完成して、ノートを複数デバイス間で共有できるようにする。

---

## 🪛 ステップ 1: Obsidian のインストール

### 【インストールURL】

- **Windows**: [https://obsidian.md/](https://obsidian.md/) からデスクトップ版をDL  
- **iPhone**: App Store で「Obsidian」を検索

---

## ☁️ ステップ 2: iCloud Drive の設定

### 🔹 Windows 側

1. [iCloud for Windows](https://support.apple.com/ja-jp/HT204283) をダウンロード  
2. Apple ID でログイン  
3. 「iCloud Drive」にチェック  
4. エクスプローラーの「お気に入り」に表示されることを確認  

### 🔸 iPhone 側

1. 設定 → Apple ID → iCloud → 「iCloud Drive」を ON  
2. ファイルアプリ → 「iCloud Drive」 が見えるかを確認  

---

## 📂 ステップ 3: Obsidian のVault（ノート保管場所）を iCloud Drive に作成

### 🔹 Windows 側

1. Obsidian起動  
2. 「新規保管庫を作成」を選択  
3. 保存先として以下のようなフォルダを指定  

    ```
    iCloud Drive\Obsidian\MyVault
    ```

### 🔸 iPhone 側

- Obsidian 起動後、**同じ名前の Vault（保存庫）** を開けるか確認  
- 見えなければ **Files App で iCloud Drive 内を表示** させておく  

---

## 🔄 ステップ 4: 同期確認

- Windows 側 Obsidian で作成したノートが iPhone 側で見えるか確認  
- 見えない場合は、ファイルアプリ内の表示や iCloud のログイン状況を再確認  

---

## ✅ 結論：この段階でできること

- Obsidianで書いたノートを **iPhoneとPC間で公開／編集可能**  
- **Excalidraw** のデータも同じVaultにあれば共有可  

---

## 📌 次回予告（後半内容）

- コミュニティプラグインの設定  
- Excalidraw の図解作成  
- Mermaid 記法との使い分け  
- Qiita記事化までの流れ  

---
uuencode/uudecode

uuencodeとuudecodeについて解説します。

これらは、バイナリファイルをメールに含めて送受信したりする時に使ったりします

(1)　uuencode

uuencode ファイル 復元ファイル名

ファイルをテキストデータに変換します。第1引数には変換するファイル，第2引数には復元したときのファイル名を指定します。結果は標準出力に出力されます。次のように使います。パーミッションも保存します。

```
% uuencode a.out a.out.result > uu
```

(2)　uudecode

uudecode ファイル

uuencodeで変換されたデータをファイルに復元します。復元時のファイル名は，uuencodeで指定された復元ファイル名になります。

```
% uudecode uu
```

```text:実行結果
% echo "testdata">test
% ls
test
% uuencode test test.result >uu
% ls   
test  uu
% uudecode uu
% ls
test  test.result  uu
% cat test.result
testdata
%
```
React 19 アップグレード後に react-testing-library でテストが失敗する問題と解決策


## はじめに

React のバージョンを 19 にアップグレードした際に、`react-testing-library` を使用しているテストが失敗する問題に遭遇しました。

この記事では、このエラーの原因と暫定的な解決策について解説する。

## 原因

詳細は不明だが、React 19 における `Suspense` の挙動変更に起因しているらしい。

特に、`use` API を利用してデータを Suspend するようなコンポーネントのテストでこの問題が発生しやすいよう。

## 暫定的な解決策

現在のところ、テストコードを `act` で Wrap すると解決する。

```tsx
import { render } from '@testing-library/react'
import { act } from 'react'
import MyComponent from './MyComponent'

test('renders component correctly', async () => {
  await act(async () => {
    render(<MyComponent />)
  })
})
```

`act` ユーティリティは、React に対してコンポーネントの更新がこれから行われることを伝え、関連する更新が処理されるまで待機するように指示する。

## まとめ

React 19 へのアップグレードに伴い、`react-testing-library` を使用したテストで `Suspense` に関連するエラーが発生する場合がある。現状では、`render` 呼び出しを `act` で Wrap すると解決する。

今後の `react-testing-library` のバージョンアップで、より根本的な解決策が提供される可能性もある。

## 参考

- Testing Library React issue: [render / waitFor seem to have issue with async component and suspense in react 19 beta #1375](https://github.com/testing-library/react-testing-library/issues/1375)
EndeavourOS i3使用時のファイルマネージャー(thunar)の起動が遅いときの対処法

## EndeavourOS
[EndeavourOS](https://endeavouros.com/)というArch LinuxベースのLinuxディストリビューションでi3wmを選択できる。
このときファイルマネージャーにはthunarがデフォルトで使用されてwindows+nで開ける。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621241/4a4854e3-7dec-4763-a3cf-7e6de86c4ab0.png)

しかし表示までに何分か待たされることがある。

ブラウザなどの他アプリでファイル参照するときにもthunar呼び出されるが、これも極めて時間を要することがある。

↓こういうとき。表示まで画面が何分か待たされがち。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621241/a8481fd9-a0bb-45e3-ab96-40fc842360a7.png)


これを解決する方法を紹介する。

## 解決
Arch LinuxのWikiに書いてあったことそのままである。

https://wiki.archlinux.jp/index.php/Thunar#.E8.B5.B7.E5.8B.95.E3.81.8C.E9.81.85.E3.81.84.E3.81.A8.E3.81.84.E3.81.86.E5.95.8F.E9.A1.8C.E3.82.92.E8.A7.A3.E6.B1.BA.E3.81.99.E3.82.8B


```bash
sudo vim /usr/share/gvfs/mounts/network.mount
```
で
```
AutoMount=true
```
の部分を
```
AutoMount=false
```
にするだけ。

## 補足
thunarがプリインストールされていることをEndeavourOSは明示的に意識しない。
このときこの解決方法に辿り着くのは至難の業のため、見つけられるように備忘録として残しておく。
Role Gravity Map (× Value Proposition) メモ

目的メモ：個人用
PJのフローと、実行者、必要な権限のマップメモ

>※「Role Gravity Map」は自分用に作った呼び名。
フローの流れ、各フェーズ毎に、実行と最終決定はどこにあるのｋ──を整理するためのマップ。
Value Proposition Canvasで見えた“価値”が、どの役割を通ってどうズレるのかをざっくり掴みたくて付けた名前。

# Value Proposition Canvas
* 誰に／何の価値を／どう届けるかを可視化

## 顧客セグメント（Customer Segment）
- 例：日常的にネットショッピングを利用する20〜40代

## 顧客ジョブ（Customer Jobs）
- 例：忙しい中でもストレスなく買い物を完了したい

## ペイン（Pains）
- 商品を探すのが手間
- 決済が煩雑
- サイトが重い・使いにくい

## ゲイン（Gains）
- 欲しい商品がすぐ見つかる
- ワンタッチで買える
- ポイントや割引でお得に買える

## 製品・サービス（Products & Services）
- 商品検索
- カート・決済機能
- ユーザー向けクーポン機能

## ペインリリーバー（Pain Relievers）
- 検索履歴ベースのレコメンド
- ワンタップ購入機能
- 軽量なUI構造

## ゲインクリエイター（Gain Creators）
- 限定キャンペーンの配信
- 購入後レビューによるポイント付与

# Role Gravity Map（責任・権限・源流の可視化）

| 項目                | 実行責任（R） | 意思決定権（A） | 出どころ（Value Source）      | 備考・ズレのリスク               |
|---------------------|----------------|------------------|-------------------------------|----------------------------------|
| 要件定義             | PO or 自分     | PO               | 顧客ジョブ／ペイン             | POが顧客視点を翻訳しない場合詰まる |
| 機能設計             | エンジニア     | TL               | 要件定義からの価値移動         | 設計の粒度が合わずトラブルに     |
| 優先度の整理         | PM・PO         | PO               | 顧客のペイン・市場要求         | POが意思決定しないと優先度迷子に |
| タスク分解・見積もり | チーム         | TL               | 機能設計／過去実績             | 粒度がバラつき属人化しやすい     |
| 実装                 | 開発者         | TL               | 機能設計                       | 実装負荷が偏りやすい             |
| 品質検証             | QA・開発者     | TL               | ペインリリーバー               | テスト観点が抜けると信頼失う     |
| リリース判定         | PM・TL         | PO               | ゲイン（成果体験）             | POが判断しないと機会損失に       |
| スケジュール調整     | PM             | PM               | 各メンバーの進捗／依存関係     | 負荷が集中しスケジュール破綻も   |
yieldの使い方

## 定義のようなもの　
> Called from inside a method body, yields control to the code block (if any) supplied as part of the method call. If no code block has been supplied, calling yield raises an exception.
> yield can take an argument; any values thus yielded are bound to the block's parameters. The value of a call to yield is the value of the executed code block. 

> メソッド本体の内部から呼び出され、メソッド呼び出しの一部として提供されたコード・ブロック（もしあれば）に制御をゆだねる。コード・ブロックが提供されていない場合、yield を呼び出すと例外が発生します。

>yieldは引数を取ることができ、yieldされた値はブロックのパラメータにバインドされます。yieldの呼び出しの値は、実行されたコード・ブロックの値です。


## yieldはどんな時に使う
> 自分で定義したブロック付きメソッドでブロックを呼び出すときに使います。 yield に渡された値はブロック記法において | と | の間にはさまれた変数(ブロックパラメータ)に代入されます。

## ブロックとは
コードの塊
do...endまたは{...}で囲まれたコード

## 一番簡単な例
```ruby
def yield_ugoki
  puts "処理開始"
  yield
  puts "処理終了"
end

yield_ugoki {puts "ブロック内の処理"}


# 出力:
# 処理開始
# ブロック内の処理
# 処理終了
```
 {puts "ブロック内の処理"} がブロック

### ブロックパラメータを使った例
```ruby
def yield_ugoki
  puts "処理開始"
  yield("こんにちは") # 引数を渡す
  puts "処理終了"
end

# ブロックパラメータ message を |message| で受け取る
yield_ugoki {|message| puts "ブロック内の処理: #{message}"}

```


 ## railsでの使用例
```rails
<!-- app/views/layouts/application.html.erb -->
<html>
  <head>
  </head>
  <body>
    <h1>共通ヘッダー</h1>
    <%= yield %>
    <footer>共通フッター</footer>
  </body>
</html>
```
ルーティングに基づいて特定コントローラのアクションが実行される
アクションに対応するビューファイルがレンダリング
>ビューのメインbodyは、常に「名前のない」yieldの位置でレンダリングされます。

という流れのよう

 ## 変数やメソッドを使えばいいんじゃね？
### 変数
あくまでデータを扱うもの、振る舞いは代入できない。
### 関数（コードは全て引用）
```ruby
def hello()
        return “Hello World!”
    end
    hello() #=> “Hello World!”


    def hello2()
        return yield
    end
    hello2(){“Hello World!”} #=> “Hello World!"
```
この例だと特に便利さはわからない、、、

```ruby
 def double()
        yield
        yield
    end
    double(){print “Hi!”} #=>”Hi!Hi!”
```
この例だと、振る舞いを2回呼び出せるという利点を見出せる。　
```ruby
def greet(name)
    print "You see #{name}. "
    puts yield(name)
end

greet('Dave'){|person| "Hi #{person}!"} #=> "You see Dave. Hi Dave!"
greet('Dave'){|person| "#{person} says hello!"} #=> "You see Dave. Dave says hello!"

```
同じメソッドを使いながら、違った挨拶を出力できる
greetメソッドを変形せずに（関心の分離？）、違った挨拶を出力できる

## 参考文献
https://docs.ruby-lang.org/ja/latest/doc/spec=2fcall.html#yield
https://railsguides.jp/layouts_and_rendering.html
https://dev.to/nwdunlap17/an-introduction-to-yield-in-ruby-and-filtering-class-instances-549j
https://ruby-doc.org/docs/keywords/1.9/Object.html
【Go】わざとメモリリークするサンプルコードと検出方法


## 概要

- Go言語を使っていてメモリリークを経験したことがないので、意図的にメモリリークを発生させるサンプルコードを書いてみた
- メモリリークしているかも下記を使用して確認してみた
	- `pprof`（Goの標準profiler）
	- `go tool pprof` コマンドでメモリの使用状況を可視化

## サンプルコード


```go
package main

import (
	"fmt"
	"net/http"
	_ "net/http/pprof"
	"time"
)

// グローバル変数として巨大なスライスへの参照を保持
var leakedData = make([][]byte, 0)

func memoryLeak() {
	for {
		// 1MBのデータを作成
		data := make([]byte, 1024*1024)

		// グローバル変数にデータの参照を保持し続ける
		leakedData = append(leakedData, data)

		// 少し待つ
		time.Sleep(100 * time.Millisecond)
	}
}

func main() {
	// pprof用にHTTPサーバを起動（:6060でアクセス可能）
	go func() {
		fmt.Println(http.ListenAndServe("localhost:6060", nil))
	}()

	// メモリリークを発生させる関数を呼び出し
	memoryLeak()
}
```


## サンプルコード解説

- `net/http/pprof` をimportすることで、`http://localhost:6060/debug/pprof/` にアクセスできるようになる
- `memoryLeak()` 関数内で**1MBのデータを生成し続け、参照を** **`leakedData`** **に保持する**
- 本来なら使い終わったら開放されるべきだが、グローバル変数に参照が残ることでGCの対象にならずメモリを消費し続ける

## pprofで確認

1. ターミナルでサンプルコード実行
	1. `go run main.go`
2. 別ターミナルで下記コマンドの実行
	1. `go tool pprof http://localhost:6060/debug/pprof/heap`
3. `top`コマンド実行でメモリ食ってる関数を一覧表示
	1. ここで8.1MB全部が memoryLeak 関数内で確保され、解放されずに生き残ってるのがわかる

	```go
	(pprof) top
	Showing nodes accounting for 8.10MB, 100% of 8.10MB total
	      flat  flat%   sum%        cum   cum%
	    8.10MB   100%   100%     8.10MB   100%  main.memoryLeak (inline)
	         0     0%   100%     8.10MB   100%  main.main
	         0     0%   100%     8.10MB   100%  runtime.main
	```

4. `list 関数名` コマンドで行単位の詳細確認

	```go
	(pprof) list main.memoryLeak
	Total: 8.10MB
	ROUTINE ======================== main.memoryLeak in /Users/isurugikeito/dev/go/go-demo/demo/low_layer/main.go
	    8.10MB     8.10MB (flat, cum)   100% of Total
	         .          .     13:func memoryLeak() {
	         .          .     14:	for {
	         .          .     15:		// 1MBのデータを作成
	    8.10MB     8.10MB     16:		data := make([]byte, 1024*1024)
	         .          .     17:
	         .          .     18:		// グローバル変数にデータの参照を保持し続ける
	         .          .     19:		leakedData = append(leakedData, data)
	         .          .     20:
	         .          .     21:		// 少し待つ
	```

5. `web` コマンドでブラウザ上でグラフで視覚化
	1. 使用するにはGraphvizが必要(Macなら`brew install graphviz`でインストール)
EXPLAINで意図したインデックスが使われなかったときにRailsで USE INDEX を指定する方法

# はじめに
MySQLでクエリのパフォーマンスを調査する際にまず行うのが `EXPLAIN` による実行計画の確認です。
しかし、インデックスを張っているにもかかわらず、意図したインデックスが使われていないというケースがあります。
この記事では、そういったケースに遭遇したときに、Rails（ActiveRecord）から MySQLの `USE INDEX` を指定して、明示的にインデックスを使わせる方法を紹介します。

# 想定する状況
たとえば、Railsのマイグレーションで以下のように blogs テーブルに複数のインデックスを追加したとします。

```ruby
add_index :blogs, :user_id
add_index :blogs, :category_id
```
これにより、次の2つのインデックスが作成されます。
- `index_blogs_on_user_id`
- `index_blogs_on_category_id`

この状態で以下のようなクエリを実行したとします。

```ruby
Blog.where(user_id: 1024).order("category_id DESC")
```
このとき、Railsが生成するSQLは以下のようになります。
```sql
SELECT * FROM blogs WHERE user_id = 1024 ORDER BY category_id DESC;
```
このクエリでは user_id を条件にしていますが、`EXPLAIN` を確認すると、なぜか `index_blogs_on_user_id` ではなく `index_blogs_on_category_id` が使われていたということがあります。

これは、MySQLが `ORDER BY` に基づいた並び替えのコストを下げるために、`category_id` のインデックスを優先して使おうとするためです。
しかし、検索条件の高速化を目的として `user_id` のインデックスを使いたい場合には、この挙動が望ましくないということがあります。

# .from を使って USE INDEX を指定する
MySQLでは、インデックスの使用を明示的に促すために `USE INDEX` という構文が用意されています。
これをRailsで利用するには、ActiveRecordの `.from` メソッドにSQL文字列を直接渡します。

```ruby
Blog.from('blogs USE INDEX(index_blogs_on_user_id)').where(user_id: 1024).order("category_id DESC")
```
このとき、Railsが生成するSQLは以下のようになります。
```sql
SELECT * FROM blogs USE INDEX(index_blogs_on_user_id) WHERE user_id = 1024 ORDER BY category_id DESC;
```
このように、MySQLに対して意図したインデックスの使用を促すことができます。

## 注意点
`USE INDEX` はインデックスの「使用を促す」ヒントであり、実際に使用されるかどうかはMySQLのクエリオプティマイザの判断に委ねられます。

### FORCE INDEX を使ってインデックス使用を強制する
どうしても特定のインデックスを使わせたい場合は、`USE INDEX` ではなく `FORCE INDEX` を使うこともできます。

```ruby
Blog.from('blogs FORCE INDEX(index_blogs_on_user_id)').where(user_id: 1024).order("category_id DESC")
```
これは、MySQLに対してそのインデックスを「強制的に使え」と指示するものです。
ただし、強制することで逆にパフォーマンスが悪化する可能性もあるため、慎重に使用する必要があります。

# おわりに
`EXPLAIN` を使ってクエリのチューニングをしていると、本来使われるべきインデックスが使われていないことが少なからずあります。

そうした場面では、Railsでも `.from(... USE INDEX(...))` や `.from(... FORCE INDEX(...))` を使うことで対処できる場合があります。

パフォーマンス改善の選択肢の一つとして、ActiveRecordにおけるインデックス指定の手段を知っておくと有効な場面が出てくるでしょう。
AWS Lambdaとローカルで非同期処理をシームレスに実行するユーティリティを作った話

## はじめに

AWS Lambdaの非同期実行とローカル開発の両立って意外と面倒ですよね。  
本記事では、asyncioによるローカル非同期処理と、Lambdaの非同期実行を同じAPIで扱えるユーティリティを作成し、LitestarでAPI化、CDKでデプロイまで自動化した構成を紹介します。

## 目的・背景

- ローカルではasyncioで高速に非同期処理を試したい
- 本番はAWS Lambdaでスケールしたい
- API設計はモダンなPythonフレームワーク（Litestar）で
- デプロイ・管理はCDKで自動化したい

## アーキテクチャ概要

```
+-------------+       +----------------+       +--------------------+
| API Gateway |  -->  | API Lambda     |  -->  | Worker Lambda      |
+-------------+       +----------------+       +--------------------+
         ↑                   |                        |
         |   (Litestar)      |   (async invoke)       | (async job)
         +-------------------+------------------------+
```

- API Gateway経由でリクエストを受け、API Lambda（Litestarアプリ）で処理
- 非同期ジョブはWorker Lambdaへinvoke
- ローカルではasyncioで同等の非同期実行

## ソースコード
https://github.com/sion908/async_lambda_local

## ローカル＆Lambda両対応の非同期処理

- `async_lambda_invoker`デコレータで、ローカル時はasyncio、Lambda時はboto3でinvoke
- 共通APIでどちらでも非同期ジョブをキックできる

```python
from main import async_lambda_invoker

@async_lambda_invoker
async def process_job(data):
    # 非同期ジョブ本体
```

## LitestarによるAPI実装

- `/` でサービスのステータス確認
- `/process` で非同期ジョブをPOST
- VS Code REST Client用の `api_test.http` で簡単にAPIテスト

## AWS CDKによるデプロイ自動化

- Lambda関数、IAMロール、API Gatewayなど全てCDKで定義
- `manage.sh` で `./manage.sh deploy` するだけで一発デプロイ
- `.env`でAWSプロファイルやリージョンを安全に管理

```bash
./manage.sh deploy
```

## プロジェクト構成と管理

- `main.py`: 非同期処理ロジックとAPI
- `infra/cdk/`: CDKスタック定義
- `src/lambda/`: Lambdaハンドラー
- `manage.sh`: 統合管理スクリプト
- `.env` & `.env.sample`: 設定ファイル
- `requirements.txt`, `requirements-dev.txt`: 依存関係管理

## まとめ

- ローカルとLambdaの両方で同じAPIで非同期処理ができる
- LitestarでモダンなAPI開発
- CDKと管理スクリプトでデプロイも超簡単
- AWSプロファイルも安全に切り替え可能

---
Agentic RAGについて

Agentic RAGは、最近RAGの精度向上において注目を集めている手法の一つです。 その名が示す通り、従来のRAGにAgentの機能を統合したもので、特にAgentが持つ「推論」「行動計画」「リフレクション（反省・評価）」などの高度な能力を活用することで、従来型のRAGよりも精度の高い検索結果を実現できる仕組みです。

## Agentic RAGとRAGの違いについて：

従来のRAGの基本的なワークフローは以下のようなものです：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/9ab3e10a-984b-4040-922b-0b29898e1807.png)

ユーザーのクエリをベクター化してベクターストアで関連情報を検索し、その検索結果とクエリをLLMに渡して回答を生成します。



一方、Agentic RAGのワークフローは⇩のようになります：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/15320c76-66a6-4c1e-a242-d59f12282a1f.png)


赤色の部分が従来のRAGから改善されたポイントです。具体的には次の2点です。

**① 複数の検索手段を活用した柔軟な検索**
従来のRAGでは、通常一つのベクターストアだけを用いて検索を行いますが、Agentic RAGでは、さまざまなタイプの検索手法を柔軟に組み合わせて使用します。例えば、従来のベクターストアに加え、グラフ型のインデックス、RDBMS（リレーショナルデータベース）によるインデックス、さらにはWeb検索など、多様な情報源を備えています。Agentがユーザーの質問内容をもとに最適な検索方法を判断して実行できるようになります。

**② Agentによるリフレクション機能**
もう一つ重要な改善点は、リフレクションの導入です。Agentが検索結果を取得した後、その情報が質問への回答を生成するために十分かどうかを自主的に評価する機能です。もし不十分と判断された場合、Agentは追加で別の検索手法を選択し、さらに情報を収集するという行動を取ります。検索プロセスそのものを動的に改善できる仕組みがAgentic RAGには備わっています。


## まとめ：
Agentic RAGは、検索可能な情報源の多様化とAgentのリフレクション機能を通じて、従来のRAGシステムよりも高い精度で情報を取得できます。また、複雑な質問に対しても、より的確かつ包括的な回答を提供することが可能になります。特に、複雑かつ専門的な質問が多いビジネス用途や高度な知識を要求される分野において、非常に有効なソリューションだと考えられます。


より詳しい情報は以下のリンクをご覧ください。

https://weaviate.io/blog/what-is-agentic-rag


https://arxiv.org/abs/2501.09136
MayaでJupyter Notebookを使用する

## 環境

* Windows
* Autodesk Maya 2026

## mayapyでJupyter Notebookを活用する

Jupyter Notebookはデータサイエンスや機械学習などの分野で利用されるインタラクティブな開発環境です。コードの実行結果を即座に確認しながら、データの可視化・分析が行えます。mayapyでも利用でき、スクリプトやツールの実行結果を記録しながら使用することも可能です。


## 導入方法

### mayapyへのソフトリンクの作成

「[mayapyでvenvを実行する](https://help.autodesk.com/view/MAYAUL/2026/JPN//?guid=GUID-6AF99E9C-1473-481E-A144-357577A53717)」を参考にmayapyへのソフトリンクを作成します。
(Program Files以下のディレクトリのため管理者権限が必要です)

```console
cd "C:\Program Files\Autodesk\Maya2026\bin"
mklink python.exe mayapy.exe
```

### 仮想環境の作成

```bat
uv init
uv venv --python "C:\Program Files\Autodesk\Maya2026\bin\python.exe" --system-site-packages
```



### Jupyter Notebookのインストール

```bat
uv add notebook
```

## 実行例

Jupyter Notebookを起動します。

```bat
jupyter notebook
```

セルの1行目でMayaライブラリをロードして初期化することで、Mayaのモジュールが使用可能になります。

```python
import maya.standalone

maya.standalone.initialize()
```

**実行例**
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3965005/877258d9-57d5-4297-a482-cb205f3b1a69.jpeg">

## 参考

* [mayapyでvenvを実行する](https://help.autodesk.com/view/MAYAUL/2026/JPN//?guid=GUID-6AF99E9C-1473-481E-A144-357577A53717)
* [Python での初期化と初期化解除](https://help.autodesk.com/view/MAYAUL/2026/JPN//?guid=GUID-D457D6A0-1E7F-4ED2-B0B4-8B57153B563B)
TB(テラバイト)を超える規模のデータを扱う必要がある場合

## TB(テラバイト)を超える規模のデータを扱う必要がある場合
￥- 自動運転の分野でのデータが管理がどのようにされているのかの記事を見てください。
- それらを参考にして、自分たちのデータ管理の手法を模索・構築してください。


[自動車の 機械学習オペレーション（MLOps）ワークフローをサポートする完全に自動化されたデータ パイプライン](https://aimotive.com/web/jp/aidata)

[自動運転を支えるクラウドシステムとエンジニアリングチーム](https://tier4.jp/media/detail/?sys_id=5KlJMexmAHQYhyBc1zD4wM&category=BLOG)

[自動運転AIとデータの関係性は？データマネジメントの重要性（特集：自動運転車1台あたり2ペタバイトの衝撃 第3回）](https://jidounten-lab.com/u_data-management-3)

[走行環境周辺データの収集と後処理サービス](https://aisan-mobility.com/lineup/driving-video-database/)

[自動運転の未来はデータ管理が鍵
自動運転車が生成する膨大なデータの管理方法について](https://blog.equinix.com/blog/2020/06/03/a-driverless-future-depends-on-data-jp/?lang=ja)

[自動運転データセットへのWebDatasetのIndexed Datasetの導入](https://zenn.dev/turing_motors/articles/9a8b51e71b1c81)

[【E2E連載企画 第5回】20TB/dayのデータ処理を支えるデータエンジンの全貌](https://zenn.dev/turing_motors/articles/045fedc15072b9)

[自動運転のための大規模なVisual QAデータセット・AutoScenesQAの作成](https://zenn.dev/turing_motors/articles/64936f88ba720e)

[1ペタバイトのデータセットで機械学習する / WebDataset入門](https://zenn.dev/turing_motors/articles/petabyte_webdataset)

[ティアフォー、大規模データ共有による自動運転AI開発において日本交通と協業　7月よりデータ収集開始、共有データ基盤の構築へ](https://tier4.jp/media/detail/?sys_id=6uSSVm8xfIVtqXMwXxLWdq&category=NEWS)

[自動運転を支えるMLOpsと学習基盤](https://tier4.jp/media/detail/?sys_id=6KqHR2MZXIcdwV3CZqquBs&category=BLOG)
NaNってこった。　（統計関数の意外な動作）

# 統計処理のプログラムが期待した動作をしていない。

- python でnumpyベースのプログラムをしていて、データファイルを切り替えた。
- 書式をそろえて解析できるようにしたはずだった。
- 結果がおかしい。
- assertをつぎ込んでいくとassertでプログラムが停止するように異常の発生の場所を絞りん込んだ。
- 統計関数の戻り値がNaNだった。
- 判明したこと：
    - ある種の統計関数は、入力データにNaNがあると、結果がNaNになってしまう。
NPO toppersedujsp kernel 2/3

toppers edu jsp
https://qiita.com/kaizen_nagoya/items/5561df93c7e156573fd2

# kernel
kernel
https://github.com/kaizen-nagoya/toppersedujsp/tree/main/kernel

Makefile.kernel
banner.c
check.h
cyclic.c
cyclic.h
dataqueue.c
dataqueue.h
eventflag.c
eventflag.h
exception.c
exception.h
interrupt.c
interrupt.h
jsp_kernel.h
jsp_rename.def
jsp_rename.h
jsp_unrename.h
mailbox.c
mailbox.h
mempfix.c
mempfix.h
queue.h
semaphore.c
semaphore.h
startup.c
sys_manage.c
syslog.c
syslog.h
task.c
task.h
task_except.c
task_manage.c
task_sync.c
time_event.c
time_event.h
time_manage.c
wait.c
wait.h


## jsp_kernel.h
```c:

```
## jsp_rename.def
```c:

```
## jsp_rename.h
```c:

```
## jsp_unrename.h
```c:

```
## mailbox.c
```c:

```
## mailbox.h
```c:

```
## mempfix.c
```c:

```
## mempfix.h
```c:

```
## queue.h
```c:

```
## semaphore.c
```c:

```
## semaphore.h
```c:

```
## startup.c
```c:

```
## sys_manage.c
```c:

```
## syslog.c
```c:

```
## syslog.h
```c:

```


# ref.
toppersedujsp kernel 1/3
https://qiita.com/kaizen_nagoya/items/ce5c1c1f2475f0c324a2

toppersedujsp kernel 2/3
https://qiita.com/kaizen_nagoya/items/59447203b484a61cf890

toppersedujsp kernel 3/3
https://qiita.com/kaizen_nagoya/items/0c4744762f3bdd80a1a0
新人エンジニアのためのインフラ入門（第5回）を読んで学んだこと

## はじめに

今回は「ミドルウェア」について理解を深めた。  
以前は「共通処理をまとめて再利用できるもの」くらいの認識だったが、よりインフラ視点での理解が進んだ。

---

## ミドルウェアとは？

ミドルウェアとは、その名の通り、

> **「アプリケーションとOSの中間的な処理を行うソフトウェア」**

たとえば、OSだけではアプリケーションは「サーバーとしての機能」を持たない。  
そこで、以下のような**ミドルウェア**を導入することで、サーバーとして動作するようになる。

- Webサーバー（nginx、Apacheなど）
- APサーバー（PHP、Javaの実行環境など）
- DBサーバー（MySQL、PostgreSQLなど）

---

## ミドルウェアはサーバーにインストールして初めて使える

「〇〇サーバー」と呼ばれるように、ミドルウェアはサーバーにインストールすることで動作する。

### Web三層構成とそれぞれの役割

| 層 | 役割 | 代表例 |
|----|------|--------|
| Webサーバー | クライアントと最初に接する窓口。静的ファイルを返す、またはAPサーバーに処理を渡す。 | nginx / Apache |
| APサーバー | アプリケーション本体を実行する。DBと連携し、動的レスポンスを生成。 | PHP / Java（実行環境） |
| DBサーバー | アプリケーションに必要なデータを保存・提供する。 | MySQL / PostgreSQL |

```plaintext
[クライアント]
     ↓ HTTP
[Webサーバー]（例: nginx）
     ↓ PHP実行
[APサーバー]（例: PHP-FPM）
     ↓ SQL
[DBサーバー]（例: MySQL）
```

---

## なぜWeb三層に分けるのか？

### セキュリティ
- DBサーバーを直接クライアントから触れるのは危険。
- 中間にWeb/APサーバーを挟むことで、制御・検査ができる。

### 障害耐性・保守性
- すべてを1台にまとめると、1台が落ちる＝全滅。
- レイヤーごとに分ければ、影響を局所化できる。

---

## Dockerを学んでいる自分にとっての気づき

Dockerは、たとえ1台のホストであっても、プロセス・ストレージ・ネットワークを分離できる。  
つまり、物理的に分かれていなくても、論理的に三層構成を模倣できる。

> **Dockerは「分離された環境を手軽に再現できる」ことが強み。**

---

## おわりに

今回ミドルウェアの役割や三層構成を学ぶことで、Dockerのような技術が**なぜ必要なのか、どんな価値があるのか**にも気づくことができた。

やはり、基礎知識があるからこそ、応用が効くのだなと実感。
日本発のサイバーセキュリティ製品が使われるために

<h1>サイバーセキュリティ産業振興戦略</h1>

- 経産省の「サイバーセキュリティ産業振興戦略」が3月に発表されていまして、遅れて確認していました
    - https://www.meti.go.jp/shingikai/mono_info_service/sangyo_cyber/wg_cybersecurity/enhanced_security/20250305.html
- ここでは、現在の日本企業の製品が足踏みしている原因を
    - 導入実績が重視される商慣習
    - 市場の付加価値を獲得しづらい産業構造（リセラーが商流を担う
    - 産業全体を支える基盤の存在（人材育成や国債市場の開拓
- として、解決策を、
    - スタートアップ等の新しい製品・サービスの実績づくり促進
    - 認知度向上
    - 技術力の強化のためのコンテスト事業、育成プログラム事業
    - SIerとベンダーのマッチングの枠組み構築
    - セキュリティ人材の育成・確保
    - 国際連携の強化（J-Startupの活用等）
        - などとして挙げていました

<h1>セキュリティ製品のネットワーク外部性</h1>

- 自分がこれを見てまず思ったのは、セキュリティ製品はネットワーク外部性が高いということ
- 自分はリセラー兼運用ベンダー的なSIerとユーザー企業（官公庁）しか経験がないのですが、SIer観点で行くと
    - 技術的には、ログであったりクエリ言語だったりが独自のものになっていたり、関連製品同士だけ親和性があったりする。この辺りの影響を判断する必要があるので、すぐに別の製品に切り替えて売りまくれるかというとそうではない
    - 人材的には、SIer（というか運用ベンダー）は運用の単価を下げるためにセキュリティ製品の手順化を行い、標準化を実施する。その上で、臨機応変に対応できる感じのいわゆる「セキュリティエンジニア」ってそこまで貼り付けないイメージで、正直言って実績のない製品に切り替えることはすっごい難しい気がする
        - 逆にここが解決してれば人材的なハードルは無い
    - その上、セキュリティ系ってお客さんの要求は高いので、その要求に対応できるサポートエンジニア力が製品ベンダーにないと焼き切れてしまう。自分が触れている大手外資系製品も結構しんどそうなのを知っている。なので、製品ベンダーサイドとしても製品乱立状態だと厳しいだろうし、そこが手厚いかどうかをSIerとしてはつい見てしまう。
- ...という前提を元に、資料（https://www.meti.go.jp/shingikai/mono_info_service/sangyo_cyber/wg_cybersecurity/enhanced_security/pdf/20250305_2.pdf） のスライド11と15を見ると、日本企業がシェアを獲得していくべしとしているセグメントとして、ペネトレソフトやEDRをあげています
    - この辺りはネットワーク外部性が強いように見えます
        - ペネトレソフトは自分扱ったことないので詳しくわかりませんが、Kali Linuxという圧倒的プラットフォームとその中にプリインストールされているツールがありますし、
        - EDR・XDRは合わせて売るであろう監視ソリューションと密接に関わっているので、前述の人材的/サポート的なネットワーク外部性があります
        - CSPMとかは、親和性を考えると利用しているパブリッククラウド基盤とかに偏ってしまうのかな（そしてパブリッククラウドは国産強くない）と思います
- なので、導入実績を重視する商慣習はなるべくしてなっており、ネットワーク外部性を破れないのがいけないのだと思います。自分は、これはシーズの発掘の問題ではなく、幹を太くするかどうかの問題だと思っています（政府としてそこまでのアクションを取れないことは承知ですが...）

<h1>本当に「サイバーセキュリティ製品・サービスが次々に創出」でいいのか</h1>

- けだし、セキュリティ製品は群雄割拠するものではないと思っています
    - セキュリティ製品は年々見直され、各企業にあった製品へ統廃合されていくものであると思っています
        - 強いエビデンスではないですが、PaloAltoの「BEYOND 2025 - 国内民間企業・公共機関のサイバーセキュリティ施策と投資動向」(https://start.paloaltonetworks.jp/beyond-2025-jp.html) にも、日本全体で68%の民間企業・公共機関が、いずれかの導入済みツールの他社移行を検討しています。
    - ゴールがプラットフォーマーへのイグジットなら目標を群雄割拠としてもいいかもしれませんが、日本としてセキュリティ技術・製品を揃えていくのがゴールなのであれば、次々に創出ではないと思います
    - そうではなく、「サイバーセキュリティ産業振興戦略」にも名前が上がっていましたが、Kプログラム（https://www8.cao.go.jp/cstp/anzen_anshin/kprogram.html） のような、国にとって確保しておきたいセキュリティ技術・製品を整理して、数社に集約的に予算を投下する方が、セキュリティという文脈においてはいいような気がしています
Reactのコンポーネントを、Vueのコンポーネントみたいに利用したい！


`React` は class の上書きや slot が無いせいで、ちょっと使いにくいところが多い。

試行錯誤した結果、以下がテンプレになると思われる。

```ts
import clsx from 'clsx'

export function MyComponent(
  { args, children, ...props }:
  & React.PropsWithChildren<{ args: string }>
  & React.HTMLAttributes<HTMLElement>
) {
  return (
    <div
      className={clsx(
        '<component class>',
        props.className, // override
      )}
      {...props} // override
    >
      {children}
    </div>
  )
}
```

### 引数要素: `args`

このコンポーネントに渡したい値は `args` で渡す。
`args` は `object` でも、複数あっても良い。
渡す値を `React.PropsWithChildren` に型定義してあげる。

ここの型が defineProps と同義である。


### スロット要素: `children`

このコンポーネントに渡す `slot` 要素は、ここに入ってくる。
基本的に default スロットしかなく、named slot を使うにはコツが必要。

この children は単体か配列かは不定なので、`map` や `filter` のかけ方は下を参照。
`Children.toArray(children)` をする必要がある。
https://ja.react.dev/reference/react/Children

:::note
追記：コメントにて named slot の手法を教えていただきました！
:::


### HTML属性: `props`

最後に純粋にHTML属性を反映させるのが `props`。
`props` は、分割代入の余り、つまり `args` と `children` 以外のものが格納されている。

ここに `React.HTMLAttributes` で型情報を与えてあげることで、HTML属性を親から反映させることが可能となる。
`<HTMLElement>` は Root の要素に応じて変えてあげよう。

ただ、`className` に関してはコンポーネントで定義したものと、親で定義したものが競合するので、`clsx` でちゃんとハンドリングしてあげたほうが良い。


----

こんな感じで、親から override できるように運用するのがよさそう。
この辺の型運用が、公式ドキュメントに載ってないのなんで...？
私が見つけられてないだけ...？
しょーもない話だけどJenkinsでandroidアプリをビルドするときにDomain.jsとBuid.gradleの環境変数指定で悩んだ件

しょーもない話なんだけどさ、最近JenkinsでちょっとしたCIパイプライン書いてたら、Node.jsとGradleで\*\*「同じ環境変数なのに読み方が全然違う」\*\*って話にぶち当たったんですよ。

Node.js側では `process.env.SOMETHING` って書くくせに、Gradleだと `System.getenv("SOMETHING")` じゃないと読めないとか…。

**なんでやねん？** って思いながらコーヒー片手に試行錯誤してたら、結局それって言語仕様の違いってだけだったんですよね。

まぁ、結論から言えば「それぞれの言語にはそれぞれの流儀がある」ってだけなんだけど、それでも「CI/CD中毒者あるあるネタ」としては押さえときたい気がしたので、軽くメモっておきます。

---

## 本記事で話すこと

* Jenkinsの `environment` ブロックで渡した環境変数を Node.js / Gradle 側でどう使うか
* 「なぜこんなに書き方が違うのか」の根本原因
* CI/CDの自動化が抱える“設計思想のブラインド”についての雑感

---

## Jenkinsでの環境変数の渡し方

Jenkinsfile でこう書くと、環境変数として下流に渡せます。

```groovy
parameters {
  string(name: 'DEV_DOMAIN_NAME', defaultValue: 'https://api.dev.example.com', description: 'APIのドメイン名')
}

environment {
  DEV_DOMAIN_NAME = "${params.DEV_DOMAIN_NAME}"
}
```

これだけ見れば「よっしゃ、どの言語でもこれで読めるやろ」って思いがちなんだけど……。

---

## ところがどっこい：言語ごとの書き方の違い

### Node.js（JavaScript）の場合

```js
export const API_SERVER = process.env.DEV_DOMAIN_NAME;
```

### Gradle（Groovy/Java）の場合

```groovy
def apiServer = System.getenv("DEV_DOMAIN_NAME")
```

全然違うじゃん……。

---

## なぜこんなに違うのか？

これは単純に「**言語とランタイムの違い**」に尽きる。

| 比較項目    | Node.js                | Gradle (Groovy/Java)        |
| ------- | ---------------------- | --------------------------- |
| 言語      | JavaScript             | Groovy / Java               |
| 実行環境    | Node.js ランタイム          | Java Virtual Machine (JVM)  |
| 環境変数の取得 | `process.env.VAR_NAME` | `System.getenv("VAR_NAME")` |

どっちが良い悪いの話ではなく、**それぞれの世界で「自然な流儀」が違う**ってこと。

---

## CI/CDがこの違いを“ブラインド”する

で、こういうのってCI/CDやってると盲点になる。

というのも、CI/CDって\*\*「自動で動けば正義」\*\*みたいな文化が強いから、たとえば `process.env` と `System.getenv` の違いが出てきても、

> とりあえず通ればいいや

> ビルドできたからヨシ！

で済ませちゃうことが多い。

でも、元をたどれば**JavaScriptとJavaの言語設計の違い**なんだよね。

コンテナに突っ込めば全部一緒に見えるし、Jenkinsfileでは全部 `env.VAR` で扱えるから、\*\*「実際に誰がそれを読むか」\*\*の視点が抜けがちになる。

---

## 一言でまとめると：

> CI/CDがコード間の橋を架けてくれる分、
> **その下に流れてる川の深さを忘れがちになる。**

---

## おわりに

Jenkinsの `environment` を介して複数言語に環境変数を渡すのは日常的なことだけど、
そのたびに「これ、どっちの書き方だっけ？」ってなるの、地味に効くよね。

この記事が、同じように `env` 地獄にハマった誰かの小さな助けになれば幸いです。

ショーもない話だけど、こういうところに“CI/CDの深さ”が出ると思う。
最近入ったプロジェクトの開発体制がいつもと違う？

# はじめに
あじ太郎は、最近、新しい開発プロジェクトにジョインしたのですが、
いつもとリーダーの配置やチーム体制が違うような？
そんなことを感じて、記事を書いてみました。

# この前まで在籍したプロジェクト
複数の開発チームがあり、
一つのチームには、10人前後のエンジニアがいました。

比較的オーソドックスな体制だと思います。
プロジェクト全体のプロジェクトマネージャーがいて、
チームごとにリーダーとサブリーダーがいて。

↓こんな感じ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992121/ae879e8b-ff8e-408c-b2dd-5be58cf47fe3.png" width=50%>

また、大き目のタスクだと、エンジニアの誰かがメイン担当者として中心になって進めたり。
いろいろな枠組みで、まとめる人がいる（発生する）感じだったな。
このあたりはマネージャーが制御してたと思います。

# 現在、参画している開発プロジェクト
今は、エンジニアが20人超。
その中で明確にリーダーとしてやってる方は一人。

複数のサービスやサブシステムがありますが、明確にチーム分けはしてなく。

↓こんな感じ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992121/2f5dd1f5-1deb-4d6d-bff5-560ee96a8923.png" width=50%>

デイリーの進捗確認は20人一緒に！
各自の報告は「〇〇は、対応中です」とか「〇〇完了です」とか
タスクに対して一言二言コメント。
勤怠連絡などもあるものの、この人数だと、これで30分くらい。

こうやって打ち合わせが長くなると、たいていチーム分けの話が出てきたりするものですが、今のところチーム分割する動きはなさそうです。

この体制だと、リーダーが1人ひとりに細かく指示するのは難しいよな……
と考えていたら、思いだしたことが。
たしか、ソニックガーデンさんが「管理ゼロ」を提唱していた気がする。
それに近いのかも？
（その本質まで同じかわからないですが形は似てるかもしれない）

見ていて、やはり積極的に発言する人、そうでもない人はいるので、発言する人がリーダーぽくなりそうとは感じてます。

# 今後はどうなる？
入ったばかりなので、そのメリットデメリットはまだわからないけど、今後どのように進んでいくのか興味深いです。
あじ太郎自身も良い影響をもらって成果を出したい！と思ったのでした。
ZoomIt利用手引

ZoomIt利用手引
==============

いにしえの、PCを使った説明のための道具アプリ（Windows用）

デスクトップを人に見せながら説明するときにレーザーポインター替わりで使う。

趣味で作った UEFN マップのプレゼン機会があったので利用。そのときのメモ。


## 入手

SysInternals の ZoomIt ページ
https://learn.microsoft.com/en-us/sysinternals/downloads/zoomit

 - 記載バージョン 9.0
 - zipダウンロードして単体実行（システムトレイに常駐）
 - 初回起動時にショートカットなどを初期設定（とくにいじらなくて大丈夫）


## 操作

```
Ctrl + 1 時を止めて<<ズーム開始>>

    終了... [右クリック] or ESC
    拡縮... [ホイール] or ↑↓
    移動... [ドラッグ]
    時を止めて<<ドロー開始>> ... [クリック]

Ctrl + 2 時を止めて<<ドロー開始>>

    時を止めて<<ズーム開始>> ... [右クリック]
    （したがってドロー中から右クリ２回で操作終了）

    ホワイトボード... W（背景全白変更）
    ブラックボード... K（背景全黒変更）

    スクショ... Ctrl + S（Ctrl + Shift + S で部分保存）
    全コピ... Ctrl + C（Ctrl + Shift + C で部分コピ）

    カーソルセンター... スペースバー
    拡縮... [ホイール] or ↑↓
    取消... Ctrl + Z（or E で全消し）

    点描... [ドラッグ]
    直線... Shift + [ドラッグ]
    矢印... Ctrl + Shift + [ドラッグ]
    角塗... Ctrl + [ドラッグ]
    丸塗... Tab + [ドラッグ]
    文字... T （Shift + T で右寄せ）

    線太... Ctrl + [ホイール]（または Ctrl + ↑↓）

    赤ペン... R（Shift + R で薄色）
    緑ペン... G（Shift + G で薄色）
    青ペン... B（Shift + B で薄色）
    黄ペン... Y（Shift + Y で薄色）
    橙ペン... O（Shift + O で薄色）
    桃ペン... P（Shift + P で薄色）



そのほか；

Ctrl + 3 <<カウントダウンタイマー表示>>
    [ホイール] または↑↓ ...１分増減
    ESC ...終了
    クイズの回答待ち時間とか？

Ctrl + 4 <<ライブズーム>> （Windowsを操作可能なズーム）
Ctrl + Shift + 4 <<ライブドロー>> （Windowsを操作可能なドロー）
    カーソルが消えてなくなるのでライブでは使わないほうがいい

Ctrl + 5 <<画面録画>>（Ctrl + Shift + 5 で部分録画）
Ctrl + 6 <<画面保存>>（Ctrl + Shift + 6 で部分保存）
    Ctrl + C/S のショートカット

Ctrl + 7 <<デモ再生>>
    ファイル作れば再生できるらしいが作り方を知らない


```


## NOTE
- 手癖で ESC 押したらすぐ全部消えちゃうので別途画面録画しながら使ったほうがいいかもね（Windows11画面録画は Win + Shift + R）
- 注釈したいときにテキスト入力もできるのがよい

__END__
【Azure】App Serviceにおける本番環境のConnectionStringの管理場所


## はじめに

C#で Azure SQL Database に接続する際に、おそらく多くの人が参照することになる公式チュートリアルがあります。

https://learn.microsoft.com/ja-jp/azure/azure-sql/database/azure-sql-dotnet-entity-framework-core-quickstart?view=azuresql&tabs=visual-studio%2Cservice-connector%2Cportal

このチュートリアルでは Azure SQL Database への接続文字列を下記のように設定します。

```Csharp
var connection = String.Empty;
if (builder.Environment.IsDevelopment())
{
    // ローカル環境
    // appsettings.Development.jsonから取得
    builder.Configuration.AddEnvironmentVariables().AddJsonFile("appsettings.Development.json");
    connection = builder.Configuration.GetConnectionString("AZURE_SQL_CONNECTIONSTRING");
}
else
{
    // 本番環境
    // どこから取得している？
    connection = Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING");
}

builder.Services.AddDbContext<PersonDbContext>(options =>
    options.UseSqlServer(connection));
```

`AZURE_SQL_CONNECTIONSTRING`は`appsettings.Development.json`でしか定義していないため本番環境では取得できません。本番環境の接続文字列がどこからきているのかずっと疑問だったため調べました。

## 結論

先ほどのチュートリアルにばっちり書いてありました。

> ホストされた運用シナリオについては環境変数から、パスワードレス データベース接続文字列を取得します。

ホストされた運用シナリオとは App Service にデプロイした環境の事です。そしてこの場合の環境変数は`appsetting.json`**ではなく**Azure App Service の環境変数の事です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783169/3ce50708-9bcf-4f60-91c8-8198d95d3efd.png)

という事で、本番環境では接続文字列では App Service 側で保持していました。

## おわりに

最初に学習した際には右も左もわからず動かすことに精一杯だったため細かいところがおろそかになっていたなーと反省しました。

この記事が皆様のコーディングライフの助けになれば幸いです！

## 参考

https://learn.microsoft.com/ja-jp/azure/azure-sql/database/azure-sql-dotnet-entity-framework-core-quickstart?view=azuresql&tabs=visual-studio%2Cservice-connector%2Cportal
C#のコントロール ImeModeプロパティを言語別に整理したい

# 1. はじめに
* C#のコントロール ImeModeプロパティの設定可能な言語を整理したい

# 2. 開発環境
* C#
* .NET 8

# 3. 言語別ImeModeプロパティ設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/ccbff2d8-5b01-457d-b966-42ffe6ebbc49.png)

# 4. 参考文献

https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.forms.imemode?view=windowsdesktop-8.0
PowerPointで作った動画の音声をffmpegを使ってキレイにする

自分用のメモ

PowerPointにナレーションを記録してスライドショーを作成し、最後に動画を書き出し。
録音後に音声部分をキレイにする方法です。
（PowerShellとかで書いた方がいいかもしれないですが
急ごしらえなので、Windows11でWSL上のUbuntuでの環境です）

# 考え方
+ PowerPointのpptxファイルは zip形式で圧縮されている
+ 圧縮ファイルの中にある ppt/media 内に media1.m4a ～ media**.m4a　と音声が記録されている
+ この音声ファイルを抽出して、ffmpegでノイズを消すフィルタをかけて処理する
+ 圧縮ファイル内に処理済みの音声を書き戻す

これでキレイになるはず。

#スクリプト

```
#!/bin/bash

if [ $# -ne 1 ]; then
    echo "使用方法: $0 <pptxファイル>"
    exit 1
fi

# 変数の設定
PPTX_FILE="$1"
BASE_NAME="${PPTX_FILE%.*}"  # 拡張子を除いたファイル名
ZIP_FILE="${BASE_NAME}.zip"
FILTERED_PPTX="${BASE_NAME}_filtered.pptx"

# pptxファイルをZIP形式にコピー
cp "$PPTX_FILE" "$ZIP_FILE"

# 必要なフォルダを作成
mkdir -p "m4a"
mkdir -p "ppt/media"

# ZIPファイルからmedia1.m4a～media99.m4aを抽出
unzip -j "$ZIP_FILE" "ppt/media/media[0-9].m4a" "ppt/media/media[1-9][0-9].m4a" -d "m4a"

# FFmpegでフィルタを適用
for file in m4a/media*.m4a; do
    base_name=$(basename "$file")
    ffmpeg -i "$file" -af "highpass=f=200,lowpass=f=3000,afftdn,anlmdn=s=0.00001:p=0.002:r=0.006:o=1:m=11" "ppt/media/$base_name"
done

# ZIPファイルのmediaフォルダを更新
zip -r "$ZIP_FILE" "ppt/media" -x "*.zip"

# ZIPファイルをpptxにリネーム
mv "$ZIP_FILE" "$FILTERED_PPTX"

# 一時フォルダを削除
rm -rf "m4a"
rm -rf "ppt"

echo "処理が完了しました。
```

適当なファイルに保存して

```
> bash てきとう.sh パワーポイントのファイル名
```
とすれば出来るはず。
unzip,ffmpeg,zipコマンドはあらかじめ必要なので

```
sudo apt install unzip ffmpeg zip
```
としておく。

# 感想
職業上、授業動画をたくさん作成していますが、どうしても環境音やマシンのファンの音とか、夜に録音すると春は田んぼのカエルがゲロゲロ言っている音がのったりするので、…
一つ一つ音声を書き出して Adobe Auditionで個別にエフェクトをかけて、PowerPointに貼り付けて…
としていましたが、かなり面倒だったので、それってffmpegで出来ないかな？と思って試してみました。

「あー」とか「えー」とかをカットしたり、マウスやキーボードのクリック音を消したりも出来たらなと思っています。

誰かの何かにお役に立てれば幸いです
SQL ServerでWHERE句でCASE文を使用する

# 1. はじめに
* SQLの条件を動的に変更したい

# 2. 開発環境
* SQL Server 2022

# 3. テストデータ
* Users

| No | Name | Gender | Amount |
| :-- | :-- | :-- | :-- |
| 1 | 山田 太郎 | M | 100 |
| 2 | 鈴木 花子 | F | 200 |
| 3 | 佐藤 次郎 | M | 300 |
| 4 | 田中 三郎 | M | 400 |


# 4. SQL文
## 4.1.CASE文でカラムを指定する場合
* CASE式の結果でカラムに対する抽出条件を分岐できる
* 複数条件の場合、WHERE句はAND条件で記載する

```SQL:
SELECT
    * 
FROM
    Users 
WHERE
    ( 
        -- カラム名の指定あり(Gender=M)
        CASE Amount >= 
            WHEN Gender = 'M' THEN 300 
            ELSE '*' -- 全件対象
            END
    ) 
    AND ( 
        -- カラム名の指定あり(Gender=F)
        CASE Amount >= 
            WHEN Gender = 'F' THEN 200 
            ELSE '*' -- 全件対象
            END
    );
```

## 4.2.CASE文でカラムを指定しない場合
* CASE式の結果を論理値（0または1）で判定し、その結果を抽出条件にする
* 複数条件の場合、WHERE句はOR条件で記載する

```SQL:
SELECT
    * 
FROM
    Users 
WHERE
    ( 
        -- カラム名の指定なし(Gender=M)
        CASE
            WHEN Gender = 'M' 
            AND Amount >= 300 
                THEN 1 
            ELSE 0 
            END
    ) = 1 
    OR ( 
        -- カラム名の指定なし(Gender=F)
        CASE
            WHEN Gender = 'F' 
            AND Amount >= 200 
                THEN 1 
            ELSE 0 
            END
    ) = 1;
```

# 5. 参考文献

https://weekend-v.work/archives/627

https://learn.microsoft.com/ja-jp/sql/t-sql/language-elements/case-transact-sql?view=sql-server-ver16
PHP備忘録：はじめてのPHPを Docker で動かしてみた — PHP × Docker × Makefile 環境構築メモ

## はじめに

この記事では、初学者がPHPを学ぶためのDocker環境を構築する手順を紹介します。

:::note info
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

Makefileを活用し、ビルドから起動、ログ確認までを簡潔に行えるようにしています。

## 書こうと思ったきっかけ

個人的にPHPのキャッチアップをしたくて、勉強している初学者による備忘録としてまとめました。
DockerやMakefileに不慣れな方にも参考になれば幸いです。

## 内容

### ディレクトリ構成

```
php-docker/
├── Dockerfile
├── docker-compose.yml
├── Makefile
└── src/
    └── index.php
```

### Dockerfile

```Dockerfile
FROM php:8.2-apache

# Apacheでindex.phpを読み込むためにmod_rewriteを有効化
RUN a2enmod rewrite

# 作業ディレクトリを /var/www/html に設定
WORKDIR /var/www/html

# ソースコードをコンテナ内にコピー
COPY src/ /var/www/html/
```

### docker-compose.yml

```yaml
version: '3.8'

services:
  web:
    build: .
    ports:
      - "8080:80"
    volumes:
      - ./src:/var/www/html
```

### Makefile

```Makefile
.PHONY: build up down logs start

build:
	docker compose build

up:
	docker compose up -d

down:
	docker compose down

logs:
	docker compose logs -f

start:
	docker compose up --build
```

### src/index.php

```php
<?php
echo "Hello, PHP on Docker!";
?>
```

### 使い方（コマンド一覧）

```bash
make build   # イメージをビルド
make up      # コンテナをバックグラウンドで起動
make logs    # ログを確認（リアルタイム）
make down    # コンテナを停止して削除
make start   # ビルド+起動+リアルタイムログ（初回に便利）
```

`http://localhost:8080` にアクセスすれば、PHPの出力が表示されます。

**実際の画面**

![Screenshot 2025-05-03 at 10.55.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/953a81d8-5448-4130-b2bb-2502e72846b2.png)

**実際の起動ログ**

![Screenshot 2025-05-03 at 11.00.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/06e93f13-d1bf-4027-b0dd-1f81195df904.png)

## まとめ

この環境を活用することで、Docker 上で効率的に PHP の学習を進められると感じています。**今後は Laravel や MySQL なども追加し、より実践的な開発環境へと発展させていく予定です。**

しばらくの間、PHP に関する記事の投稿が増えるかと思いますが、どうぞよろしくお願いいたします。
[CSS]positionをわかりやすく

# positionについて
CSSのpositionについて備忘録兼ねて記載します。

## 基本形の4つ
### static
```css:style.css
position:static;
```
positionのデフォルト、初期値

### absolute
```css:style.css
position:absolute;
top:30px;
left:50px;
```
親要素の左上を基準に絶対的に位置を移動させる。
その際に親要素にposition:relativeを指定する。

### relative
```css:style.css
position:relative;
top:10px;
left:10px;
```
現在位置を基準に相対的に位置を移動させる。

### fiwed
```css:style.css
position:fixed;
top:0;
left:0;
```
要素を固定する。
スクロールした時に上部にメニューが固定されている時などで使う。

### まとめ
このようにpositionは基本relativeとabsoluteを使用する事がほとんどです。
要素移動する時に相対的に移動させるか、絶対的なのかを判断して使用していただければ幸いです。