OmniAICreator/Qiita-1.07M huggingface dataset:
PythonでWord文書の余白を変更する方法

Word文書を作成・編集する際、**余白（マージン）**はレイアウトにおいて重要な要素です。余白は文書の見た目や読みやすさに大きく影響し、特に正式な書類、両面印刷資料、書籍、契約書、政府提出書類などでは、適切な余白設定が不可欠です。

複数の文書や**文書内の各セクションごとに個別の余白を設定**する必要がある場合、Pythonを活用することで、効率的かつ正確に余白を設定することができます。

本記事では、**Pythonを使ってWord文書の各セクションの余白を設定する方法**を、実用的なコード例と共に紹介します。

---

## 本文の内容

- PythonでWord文書の余白を設定する手順  
- Pythonコードによる余白設定のサンプル  
- 余白の単位について  
- 応用シーンと高度な活用方法  

本記事では、[Free Spire.Doc for Python](https://jp.e-iceblue.com/introduce/introduce-free-doc-for-python.html) を使用します。  
PyPIからのインストールコマンド: `pip install spire.doc.free`

---

## PythonでWord文書の余白を設定する手順

1. `Document` クラスのインスタンスを作成  
2. `LoadFromFile()` メソッドでWord文書を読み込む  
3. 各セクション（Section）をループ処理で取得  
4. `PageSetup.Margins` プロパティを取得  
5. 上・下・左・右の余白を設定  
6. `SaveToFile()` で文書を保存

---

## Pythonコードによる余白設定のサンプル

```python
from spire.doc import Document

# Documentオブジェクトを作成
doc = Document()

# Word文書を読み込む
doc.LoadFromFile("Sample.docx")

# 各セクションの余白を一括設定
for i in range(doc.Sections.Count):
    section = doc.Sections.get_Item(i)
    margins = section.PageSetup.Margins
    margins.Top = 45.0
    margins.Bottom = 45.0
    margins.Left = 36.0
    margins.Right = 36.0

# ファイルに保存
doc.SaveToFile("output/Word余白設定.docx")
doc.Close()
````

**変更の効果**
![PythonでWord文書の余白を変更した結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/d00ab8c6-126c-41f1-b7c7-657b6069fc5d.png)

---

## 余白の単位について

コードでは「ポイント（point）」を単位としています：

* 1インチ = 72ポイント
* 1センチ ≈ 28.35ポイント

よく使われる余白の例：

* 2.54cm ≈ 72pt（=1インチ）
* 1cm ≈ 28.35pt
* 0.63cm ≈ 17.9pt

レイアウトに合わせて変換して使用してください。

---

## 応用シーンと高度な活用方法

### 1. **企業書式の統一処理**

複数のWordファイルを企業・団体の指定余白に統一。契約書、入札資料、通知文、報告書などの提出前整形に活用。

### 2. **バッチ処理による自動化**

Pythonスクリプトでフォルダ内のWordファイルを一括処理。文書管理システムや帳票ジェネレーターと組み合わせて自動変換・審査に応用可能。

### 3. **セクションごとの余白設定（応用）**

Word文書ではセクションごとに個別のページ設定が可能です。たとえば：

* 本文セクションは余白広めで読みやすさを重視
* 付録は余白を狭くして用紙節約
* 表紙は左右対称の余白で製本対応

以下のように条件分岐で制御できます：

```python
for i in range(doc.Sections.Count):
    section = doc.Sections.get_Item(i)
    margins = section.PageSetup.Margins
    if i == 0:
        margins.All = 36  # 表紙：広めの余白
    else:
        margins.All = 18  # その他：標準余白
```

### 4. **用紙サイズ・ページ設定との組み合わせ**

余白設定は、用紙サイズ（A4、A5など）、ヘッダー/フッターの距離、ページの向き（縦・横）などと組み合わせて、総合的なレイアウト戦略が構築できます。

詳細は[Spire.Doc for Python 公式ドキュメント](https://jp.e-iceblue.com/spire-doc-python/doc-python-program-guide-content.html)をご覧ください。

---

## まとめ

この記事では、Free Spire.Doc for Pythonを用いて、Word文書の余白を柔軟かつ高速に設定する方法を解説しました。個別設定にもバッチ処理にも対応できるこの方法は、手作業の時間を大幅に削減し、高品質なドキュメント制作を支援します。

日常業務、文書の一括アーカイブ、あるいは自動化されたシステムにおける文書出力など、さまざまなシーンで活用できる実用的な技術です。
[Rails] Swiper v.11.1.14の導入方法

# はじめに
この記事は、以下のような方を対象としています。
- RailsアプリにCDNでサクッとSwiperを導入したい方
- SwiperをyarnでDockerコンテナ内に入れ、ブラウザ上で扱いたい方

**また、この記事の説明はSwiperの導入までなので、具体的なスライド機能の実装方法などは扱っておりません。** その点ご了承くださいませ。

### 補足

https://swiperjs.com/swiper-api

実装方法（HTMLレイアウトやスタイル）は、公式ページに詳しく載っているのでそちらをご覧ください。


# Swiperとは？
https://swiperjs.com/

Swiperは、画像スライダーやカルーセルを直感的に実装でき、多彩なスライド効果（ループ・自動再生・フェード等）を表現できる軽量かつ高機能なjQueryプラグインです。

# 開発環境
- macOS: Sequoia 15.1.1
- Ruby: 3.1.4
- Rails: 7.0.4
- Docker
- yarn

# 導入方法
https://swiperjs.com/get-started

CDNから読み込む方法が最も簡単です。
ただ、yarnなどパッケージマネージャで管理したい方は、Swiperを（今回はDockerコンテナ内に）インストールし、ブラウザ上で利用するためにいくつか設定する必要があります。

## 方法1: CDNの利用
https://swiperjs.com/get-started#use-swiper-from-cdn

公式ページの通りレイアウトファイルにコピペするだけで使用できます。
今回はslimファイルに記述する方法を書いておきます。

```diff_slim:app/views/layouts/application.html.slim
doctype html
html
  head
    .
    .
    .
+   = stylesheet_link_tag "https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css"
    = javascript_include_tag 'application'
+   = javascript_include_tag "https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js"
```


## 方法2: yarnでインストールする方法
### 1. yarnでDockerコンテナ内にインストール
#### 1-1. コンテナを起動
```zsh
docker compose up
```

#### 1-2. コンテナ内でSwiper v.11.1.14をインストール
```zsh
docker compose exec web yarn add swiper@11.1.14
```
**結果**
- `node_modules/swiper`が追加されていることを確認
- 特に、この後`node_modules/swiper/swiper-bundle.css`と`node_modules/swiper/swiper-bundle.js`を参照するので、要確認
![スクリーンショット 2025-05-23 17.26.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928466/24850ec5-373e-4d2c-9e9c-d8d15c634f82.png)



- `package.json`にSwiper v.11.1.14が追加されていることを確認

```diff_json:package.json
{
  "name": "app",
  "version": "1.0.0",
  "engines": {
    "node": ">=12.14.0"
  },
    .
    .
    .
  "dependencies": {
	.
	.
	.
+   "swiper": "11.1.14"
  }
}
```

### 2. node_modules下にあるSwiperをブラウザ上で使えるように設定する

#### 2-1. アセット設定ファイルの設定
`node_modules`下にあるパッケージ（今回の場合はSwiper）をアセットパイプラインが読み込めるように設定する
```diff_ruby:config/initializers/assets.rb
+ Rails.application.config.assets.paths << Rails.root.join('node_modules')
```

#### 2-2. javascript読み込み設定
マニフェストファイルで`node_modules/swiper/swiper-bundle.js`を参照する

```diff_javascript:app/assets/config/manifest.js
//= link_tree ../images
//= link_tree ../builds
//= link application.css
//= link application.js
+ //= link swiper/swiper-bundle.js
```
- linkディレクティブを使用して、`swiper/swiper-bundle.js`を独立したアセットとして扱うように指示する

---

レイアウトファイルでマニフェストファイルで指定された`swiper/swiper-bundle.js`を読み込む
```diff_slim:app/views/layouts/application.html.slim
doctype html
html
  head
	.
	.
	.
    = javascript_include_tag 'application'
+   = javascript_include_tag 'swiper/swiper-bundle.js'
```


#### 2-3. css読み込み設定
`node_modules/swiper/swiper-bundle.css`を読み込む
```diff_scss:app/assets/stylesheets/application.scss
+ @import "swiper/swiper-bundle";
```

# 参考資料
この記事で扱わなかった参考資料はこちらです。

https://qiita.com/miketa_webprgr/items/0a3845aeb5da2ed75f82
【本日の学習】サブネット・サブネットマスク・CIDRの基礎

# 【本日の学習】サブネット・サブネットマスク・CIDRの基礎
railsでWEBアプリの実装課題を行っており更新ができていませんでした。
その間にAWSに関連する学習もおこなったので少しずつ記載していきます。
今回はIP関連の基礎についてです。

ネットワーク設計で重要な「サブネット」と「サブネットマスク」、そして「CIDR」について学びました。これらはIPアドレスの範囲を管理・分割し、効率的かつ安全に通信を行うための基本概念です。

## 1. サブネットとは？
サブネット（Subnet）は、1つの大きなネットワークを複数の小さなネットワーク（サブネット）に分割する技術です。
例えば、企業のネットワークを部署やチームごとに分割することで、通信効率やセキュリティを高めることができます。

## 2. サブネットマスクとは？
サブネットマスクは、IPアドレスのうちどの部分が「ネットワーク部（共通部分）」で、どの部分が「ホスト部（個別の端末識別部分）」かを判別するための数値です。

例：255.255.255.0 の場合、最初の3オクテット（24ビット）がネットワーク部、最後の1オクテット（8ビット）がホスト部となります。

## 3. IPアドレスの基本とバイナリ表記
IPアドレスは4つの数値（0～255）をドットで区切った形式で表され、各数値は8ビット（1バイト）の2進数で構成されています。
| 10進数 | 2進数（バイナリ） |
| ---- | --------- |
| 192  | 11000000  |
| 168  | 10101000  |
| 1    | 00000001  |
| 1    | 00000001  |

## 4. CIDR表記（Classless Inter-Domain Routing）
CIDRは、IPアドレスのネットワーク部分の長さを「/ビット数」で表す方式です。
例：192.168.1.0/24 は「ネットワークアドレスが192.168.1.0で、ネットワーク部が24ビット」という意味です。

### CIDRとサブネットマスク対応表
| CIDR表記 | サブネットマスク        | 利用可能なIPアドレス数  |
| ------ | --------------- | ------------- |
| /8     | 255.0.0.0       | 約1,677万       |
| /16    | 255.255.0.0     | 約65,000       |
| /24    | 255.255.255.0   | 256（うち254利用可） |
| /30    | 255.255.255.252 | 4（うち2利用可）     |

## 5. ネットワーク部とホスト部の役割
ネットワーク部：同じネットワーク内で共通の部分。サブネットマスクで固定される。

ホスト部：ネットワーク内の個々のデバイスを識別する部分。

例：192.168.1.10 /24 の場合
ネットワーク部: 192.168.1（固定）

ホスト部: 10（変化可能）

## 6. サブネットの設計メリットと活用例
メリット
・ネットワークの管理が容易になる（部署や用途で分類可能）

・トラフィックの効率化（不要な通信を減らす）

・セキュリティの向上（アクセス制御しやすい）
### 具体例（企業ネットワーク）
| サブネット          | CIDR範囲        | 用途       |
| -------------- | ------------- | -------- |
| 192.168.1.0/24 | 255.255.255.0 | 営業部門用    |
| 192.168.2.0/24 | 255.255.255.0 | 開発部門用    |
| 192.168.3.0/24 | 255.255.255.0 | 管理・経理部門用 |

## 7. AWSなどクラウド環境での活用
AWSのVPCでは、CIDRブロック（例：10.0.0.0/16）を設定し、サブネットを切り分けます。

・パブリックサブネット：インターネットにアクセス可能（例：Webサーバー）

・プライベートサブネット：データベースなど外部からのアクセスを制限

この設計により、セキュリティと運用管理が効率的に行えます。

## まとめ
| 項目       | 内容                          |
| -------- | --------------------------- |
| IPアドレス   | 0～255の4つの数字で表現。バイナリで32ビット。  |
| サブネットマスク | ネットワーク部・ホスト部の境界を示すマスク。      |
| CIDR表記   | `/24`のようにネットワーク部のビット数を表す。   |
| ネットワーク部  | 同じネットワーク内で共通の部分。            |
| ホスト部     | ネットワーク内の個別デバイスを識別する部分。      |
| サブネット活用  | 管理効率化・トラフィック制御・セキュリティ向上に有効。 |

この内容を理解すると、IPアドレスの割り当てやネットワーク設計、さらにAWSなどクラウドのVPC設計もよりスムーズに行えるようになると感じました。
二点間の距離(マンハッタン距離)　Math.abs　



今回は、二点間の距離を計算する問題を解いた！

ちなみに、マンハッタン距離の由来はアメリカ・ニューヨークの「マンハッタン」の街の構造から来ているらしい。
<br>

## 問題概要

与えられた `N` 個の点 `(x, y)` と、基準点 `(2, 3)` のマンハッタン距離をそれぞれ出力せよ。

マンハッタン距離：
`|x₁ – x₂| + |y₁ – y₂|`

<br>
入力例：

    3
    2 3
    1 2
    5 6

出力例：

    0
    2
    6

### 余談

マンハッタンの道路は、縦と横にまっすぐ通っていて、斜めに進めないので、目的地まで行くには曲がりながら進む必要がある。

そのような状況で使われる距離が「マンハッタン距離」。
✅ よく使われる場面

- 迷路やグリッドマップでの距離計算
- 競技プログラミング
- ルート最適化やゲームAI
- データサイエンス（クラスタリングなど）
<br>

https://paiza.jp/works/mondai/array_primer/array_primer__array_distance_step1NGコード例

<br><br>

## ❌NGコード例
```js
const rl = require('readline').createInterface({input:process.stdin});
const lines = [];

rl.on('line',(input)=>{
    lines.push(input);
});


rl.on('close',()=>{
    const N = Number(lines[0]);
    const coordinate　= lines.slice(1).map(line => line.split(' ').map(Number));
    
    coordinate.forEach(element => {
        const result = (element[0] - 2) + (element[1] - 3);
        console.log(result);
    })
});
```
<Br>

提出コードのアウトプット
```
0
-2
6
```

### ❌問題 ：マンハッタン距離の定義を無視している

上記のコードは絶対値 `| |` をとっていないため、負の値が出ることもあり、正しい距離ではない。
<br><br>

## 📌OKコード例　Math.abs()を使う：
```js
const rl = require('readline').createInterface({ input: process.stdin });
const lines = [];

rl.on('line', input => lines.push(input));

rl.on('close', () => {
    const N = Number(lines[0]);
    const baseX = 2, baseY = 3;

    for (let i = 1; i <= N; i++) {
        const [x, y] = lines[i].split(' ').map(Number);
        const distance = Math.abs(x - baseX) + Math.abs(y - baseY);
        console.log(distance);
    }
});
```
<br>
✅ 解説ポイント

- `Math.abs()`：絶対値をとる関数。マンハッタン距離に必須。

- `split(' ').map(Number)`：座標を `[x, y]` の数値配列に変換。



- 変数名が抽象的すぎるのを修正。
    - `element[0]`, `element[1]` では何の値かパッと見てわからない。
    - `[x, y]` に分割代入したほうが、読み手が内容を理解しやすい。　
- ループで各点にアクセスし、距離を1行ずつ出力。

<br><br>

## 💡新しく学んだことまとめ

- `Math.abs()`は数の絶対値を返してくれる関数。
- 分割代入 `[x, y] = ...` でコードがスッキリ＆理解しやすくなる。
- マンハッタン距離はゲームや地図アプリでも使われる！


<br><br><br>[僕の失敗談(´;ω;｀)と解決法🐈](https://paizabeginner.wordpress.com/2025/05/23/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc%ef%bc%9a%e4%ba%8c%e7%82%b9%e9%96%93%e3%81%ae%e8%b7%9d%e9%9b%a2%e3%83%9e%e3%83%b3%e3%83%8f%e3%83%83%e3%82%bf%e3%83%b3%e8%b7%9d/)
📘 Vol.8.18：【Struts2】JSP構造のテンプレート最適化と共通レイアウト〜 <s:include> / header.jspf / 共通テンプレート構成の実務設計 〜

### 🔰 概要
Struts2アプリでよくある悩み：

- 画面ごとに共通レイアウトをコピペしていて保守がつらい

- ヘッダー／フッターに変更があると全JSP修正が必要

- そもそも共通テンプレートってどう作るのがベスト？

👉 本記事では、***Struts2 × JSPにおけるテンプレート設計のベストプラクティス***として、以下を徹底解説します：

- 共通パーツの分離（header.jspf / footer.jspf）

- <s:include> タグによる動的読み込み

- 共通テンプレートの構造化と設計ルール化

- 動的メニューやログインユーザー表示などの応用例

---

### 📌 1. なぜテンプレート構造が必要なのか？
❌ よくあるアンチパターン

```jsp
<!-- 画面ごとに同じHTMLヘッダーやナビをベタ書き -->
<html>
  <head>〜</head>
  <body>
    <div class="header">共通ナビ</div>
    <div class="main">…</div>
    <div class="footer">©2024</div>
  </body>
</html>
```
✅ テンプレート最適化のメリット
- 共通部の保守性向上：header/footerだけ修正すれば全画面に反映

- 画面追加が高速化：ベース構造が使い回せる

- ログインユーザー名表示などの一元化が可能
---

### 🛠 2. 基本パターン：JSP共通パーツ化（.jspf）
✅ header.jspf / footer.jspf の分割例
```jsp
<!-- /view/include/header.jspf -->
<div class="header">
  <h1>掲示板アプリ</h1>
  ようこそ、<s:property value="#session.user_name"/> さん！
</div>
```
```jsp
<!-- /view/include/footer.jspf -->
<div class="footer">
  &copy; 2024 企業名 All rights reserved.
</div>
```

### 📄 メインJSPでの利用例（例：userPortal.jsp）
```jsp
<%@ include file="/view/include/header.jspf" %>
<div class="main">
  <!-- 各画面の個別UI -->
</div>
<%@ include file="/view/include/footer.jspf" %>
```
### 🔄 3. <s:include> タグの活用
より***動的に切り替えるテンプレート***や、Action経由の読み込み制御に使えます。

```jsp
<s:include value="/view/include/header.jspf" />
```
### 🧩 利用シーン：

- ログイン状態／権限によるナビ切り替え

- 管理者用と一般ユーザー用でテンプレートを出し分け

---

### 🧱 4. 実務設計：共通テンプレート構造のおすすめ構成
```css
/view/
├─ include/
│   ├─ header.jspf
│   ├─ footer.jspf
│   └─ menu.jspf
├─ layout/
│   └─ baseLayout.jsp (共通テンプレート)
├─ UserManagementScreen.jsp
├─ BulletinboardManagementScreen.jsp
└─ …
```
🔁 `baseLayout.jsp` を「全画面の土台」とし、そこから`<s:include>`で各コンテンツJSPを呼び出す構造がベストプラクティスです。

---
### ✨ 5. 応用：共通レイアウト内にログイン情報・ナビゲーションを配置

- #session.user_id や #session.user_name で動的表示

- 権限によって <s:if> でメニューを切り替え

```jsp
<s:if test="#session.user_role == 'admin'">
  <a href="adminMenu.action">管理メニュー</a>
</s:if>

```
---

### ✅ まとめ：Vol.8.18のポイント
| ポイント        | 内容                                              |
| ----------- | ----------------------------------------------- |
| 🔧 共通JSPパーツ | `header.jspf` / `footer.jspf` / `menu.jspf` に分離 |
| 📦 テンプレート設計 | `baseLayout.jsp` を作り全画面に共通適用                    |
| 🔄 柔軟な出し分け  | `<s:include>`＋`#session`で動的に                    |
| 💡 実務適用例    | ログイン表示・メニュー切替・画面全体の統一感                          |
---

### 🔜 次回予告
次回 [📗 Vol.8.19：【Struts2】テンプレートの再利用応用 〜 レイアウト共通化 × 動的UI部品の出し分け設計 〜](https://qiita.com/juehara-crypto/items/fdd403f97ff8900c6683)

---

### 🔄 関連記事
- [📗 Vol.8.19：【Struts2】テンプレートの再利用応用 〜 レイアウト共通化 × 動的UI部品の出し分け設計 〜](https://qiita.com/juehara-crypto/items/fdd403f97ff8900c6683)

- [📘 Vol.8.20：【Struts2】テンプレート設計の完成形 〜 ページ種別テンプレート／共通レイアウトのモジュール化と階層設計 〜](https://qiita.com/juehara-crypto/items/87c087d862db3a9a1467)
Pythonで並行処理が書けるようになるには

# 概要
Pythonをこれまで扱ってきたなかでよく並行処理を耳にすることが多かったのですが、
概念は分かりつつも実際には何をどのようにすることで並行処理を実装できるかが深いところまで理解をしてこなかったので、今回本腰を入れて学習してみようという記録です

# 本題
といっても、まずは並行処理とはなんぞやという感じの方もいるかも知れません

ざっくりいうと「複数のタスクが「同時に進行しているように見える」状態」だそうです
実際に同時に実行している状態は並列処理というのですがPythonではGILという1度に1つのスレッドしかPythonを実行できないという制約があるので並列処理は少し難し目となっています(それでもmultiprocessingというものが存在するのですが)

さてそんな平行処理ですが、標準モジュールである`threading`モジュールを使うことで、このスレッドを増やして複数の処理を平行に動かすことができます


## サンプルコード
```py:sanmple.py
import threading
import time

def task(name, delay):
    """
    スレッドで実行するタスク
    """
    print(f"スレッド {name}: 開始")
    for i in range(3):
        print(f"スレッド {name}: 処理中 ({i+1}/3)")
        time.sleep(delay)
    print(f"スレッド {name}: 終了")

if __name__ == "__main__":
    print("メインスレッド: 開始")

    # スレッド1の作成と開始
    thread1 = threading.Thread(target=task, args=("A", 1), name="Thread-A")
    thread1.start()

    # スレッド2の作成と開始
    thread2 = threading.Thread(target=task, args=("B", 0.5), name="Thread-B")
    thread2.start()

    # スレッドが終了するのを待つ
    thread1.join()
    thread2.join()

    print("メインスレッド: 全てのスレッドが終了しました")
    print("メインスレッド: 終了")
```

threadingモジュールを使う上で重要なクラスや関数は一旦以下になりそうです

`threading.Thread クラス`:
新しいスレッドを作成するための基盤となるクラス
スレッドで実行したい処理は、このクラスのインスタンスを作成する際にtarget引数に関数を渡すか、Threadクラスを継承してrun()メソッドをオーバーライドすることで定義が可能

コンストラクタの主な引数:

`target`: スレッドで実行する関数を指定
`args`: target関数に渡す引数をタプルで指定
`kwargs`: target関数に渡すキーワード引数を辞書で指定
`name`: スレッドに名前を付けます。デバッグなどに使用することが可能
`daemon`: スレッドをデーモンスレッドにするかどうかを指定可能
通常はメインのプログラムが完了するまでスレッドの処理を待機しますが、デーモンスレッドだとメインプログラムが終了すると自動的に終了しするようになります

主なメソッド:

`start()`: スレッドの実行を開始
これにより、targetで指定した関数（またはオーバーライドしたrun()メソッド）が新しいスレッドで呼び出される
`join(timeout=None)`: スレッドの終了を待機
このメソッドを呼び出したスレッド（通常はメインスレッド）は、join()を呼び出されたスレッドが終了するまでブロックされる
timeoutを指定すると、指定した時間だけ待機し、スレッドが終了しなくても処理を続行する
`is_alive()`: スレッドが現在も実行中（生きている）かどうかを返却する
`getName() / name`: スレッドの名前を取得・設定します
`threading.Lock (ロック)`:
複数のスレッドが共有リソース（変数、ファイルなど）に同時にアクセスすると、予期せぬ結果（競合状態、データ破損など）が生じる可能性があるのでそれを防ぐために、ロックを使用する
ロックは、一度に1つのスレッドしかアクセスできない排他制御を行うための仕組み
(SQLのロックなど知っていれば話が早いですね)

`acquire()`: ロックを取得、ロックが既に取得されている場合は解放されるまでブロックされる
`release()`: ロックを解放します
`threading.RLock (再入可能ロック)`:
Lockと同様だが、同じスレッドが複数回ロックを取得できる点が異なる
ただし、取得した回数だけ解放する必要が発生する

`threading.Condition (条件変数)`:
特定条件が満たされるまでスレッドを待機させたり、条件が満たされたときにスレッドを再開させたりするために使用

`threading.Semaphore (セマフォ)`:
一度にリソースにアクセスできるスレッドの数を制限する場合に使用

`threading.Event (イベント)`:
スレッド間のシグナル伝達に使用します
あるスレッドがイベントを設定し、他のスレッドがそのイベントを待つことで処理の同期を取ることができる

いろいろと書きましたが、基本は以下の形を覚えておくことができればベースはバッチリなような気がします
基本概念は平行に処理したいものを関数に書き出し、それをthreading.Threadクラスで呼び出すということです

```py
import threading
import time

def task(name, delay):
    """
    スレッドで実行したいタスク
    """
    pass

if __name__ == "__main__":
    print("メインスレッド: 開始")

    thread1 = threading.Thread(target=task, args=("A", 1), name="Thread-A")
    thread1.start()
    thread1.join()
```

# おわりに
ということで平行処理の基礎の基礎みたいなところを書いてみました
割と腑に落ちながらまとめられた気がします
今後必要なときにベースさえわかっていれば複雑なものでなければ書けそうな気がしています
requestsモジュールを何かしらのエンドポイントへリクエストをたくさん送って負荷試験するとか簡単にできそうな気がしています

いつかmultiprocessingとかにも手を出してみたいです
phpMyFAQ 4.0; 設定の保存場所

<img src="https://img.shields.io/badge/phpMyFAQ-4.0-green" alt="phpMyFAQ-4.0">

小ネタです

phpMyFAQ 4.0系でElasticsearchの設定PATHが変わってました。
というよりは、configの保存場所そのものが変わった感じです。

3.0系のPATH
`/[DocumentRoot]/config/elasticsearch.php`

4.0系のPATH
`/[DocumentRoot]/content/core/config/elasticsearch.php`


---

導入記事はこちら

https://qiita.com/yshimizu/items/34893fc282f922d95aa6


公式ドキュメント

https://phpmyfaq.readthedocs.io/en/4.0/
Brat Generator ― Charli XCX風のアート画像を簡単に生成できるツール

最近、Charli XCXのアルバム『BRAT』のビジュアルスタイルを模した画像を簡単に生成できるツール「**Brat Generator**」が公開されていたので、技術面を中心に紹介します。

🔗 [Brat Generator](https://www.brat-generator.pro)

---

![Screenshot 2025-05-19 at 10.00.05 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959521/64d1b4d3-3c8a-43f1-811a-31d7d3587b72.png)


## 🔧 概要

Brat Generatorは、入力テキストに応じてリアルタイムで「BRAT」風のタイポグラフィ画像を生成できるウェブアプリです。  
フォント、カラー、レイアウトが忠実に再現されており、SNS投稿用の画像を簡単に作成できます。

---

## 🧩 主な機能

- テキスト入力によるリアルタイム画像生成
- 最大450文字まで対応（テーマによる）
- テーマ変更機能（`green`, `black`, `white`, `strike`, `blue`）
- スクリーンショット保存対応（html2canvas準備済み）
- レスポンシブUI設計

---

## 🛠 使用技術

| 項目 | 技術内容 |
|------|----------|
| フレームワーク | バニラJavaScript, jQuery |
| スタイリング | Tailwind CSS（テーマ切替によるクラス制御） |
| レンダリング | HTML5 Canvas, `textFit.js` |
| フォント | Compacta Black, Arial Narrow |
| ホスティング | Cloudflare Pages |
| 画像保存 | `html2canvas`（ダウンロード準備） |

---

## 💡 利用シーン

- SNS投稿用の画像作成（特にX・Instagram）
- 音楽イベントやDJセットリストのビジュアル化
- タイポグラフィの研究や再現
- ミーム生成やデザインネタとしての活用

---

## 🔍 技術的ポイント

- `textFit` によりテキストのサイズが自動調整され、長文でも視認性を保てる
- `div#textOverlay` による中央配置とテーマごとのクラスで動的表現を実装
- Canvasベースの画像合成ではなく、DOM + CSS + Webフォントで高速レンダリング
- jQueryによる簡易な状態管理とイベントハンドリング

---

## 📝 補足

このツールはあくまでフロントエンドで完結する構成で、画像やテキストの保存・送信などは一切行われていません。  
そのため、プライバシーやセキュリティ面での懸念が少なく、すぐに利用できます。

---

## ✅ まとめ

[Brat Text Generator](https://www.brat-generator.pro/) は、Charli XCXの「BRAT」アルバムにインスパイアされたデザインをWebで再現するツールです。  
クライアントサイド完結型でありながら、テーマ切替やフォント最適化などの工夫が多く、技術的にも面白い内容となっています。

---
半導体回路(日記)


In the development of electronic devices, analog semiconductors play a vital role in handling real-world signals such as voltage, current, sound, and light. Unlike digital circuits that process discrete values, analog circuits manage continuous waveforms that vary smoothly over time.

A typical analog signal chain begins with a sensor that converts physical inputs—such as pressure, temperature, or light—into measurable voltage or current. These signals are then amplified using operational amplifiers (op-amps) to reach levels suitable for further processing. The circuits are composed of basic elements such as resistors, capacitors, inductors, and diodes, including specialized types like Zener and Schottky diodes.

Next, the signal passes through filters—such as low-pass or band-pass filters—to remove unwanted frequency components. The cleaned signal is then digitized by an Analog-to-Digital Converter (ADC). After digital processing, a Digital-to-Analog Converter (DAC) may be used to convert the data back into analog form. Throughout this process, engineers closely monitor performance indicators such as Signal-to-Noise Ratio (SNR), Total Harmonic Distortion (THD), and Common Mode Rejection Ratio (CMRR).

Stable power supply is also critical. Devices such as voltage regulators, LDOs (Low Dropout Regulators), and DC-DC converters provide regulated power while minimizing ripple and improving load regulation. In analog design, reducing offset voltage, input bias current, and various forms of noise—including thermal and flicker noise—is essential for maintaining signal integrity.

During the design phase, tools such as oscilloscopes, spectrum analyzers, and SPICE simulation are used to analyze circuit behavior. Key metrics like slew rate, bandwidth, and gain-bandwidth product define the responsiveness of the circuit, while Bode plots and Nyquist plots are used to evaluate system stability.

In the implementation stage, ICs are manufactured using CMOS analog design and bipolar processes. During layout design, managing parasitic elements and achieving precise matching are crucial for performance. Compliance with fabrication standards is verified using tools like Design Rule Check (DRC), Layout vs. Schematic (LVS), and Process Design Kits (PDK).

Finally, in the packaging phase, the die is enclosed for protection, and wafer probing is performed to verify the chip’s functionality. Maximizing yield is critical for ensuring cost-effectiveness and high product quality.

As demonstrated, knowledge of analog semiconductors is essential across all stages—from design and manufacturing to testing—and is a core skill for engineers in the global electronics industry.
スミレ畑、やってみた。 その6

# 概要
日本語プログラミング言語、スミレ畑、見つけたので、やってみた。
練習問題やってみた。

# 練習問題
九九を書け。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/52cf95bb-1ac2-4f2a-b69d-cfda32568fd3.png)

# サンプルコード

```

行を1から1ずつ増やしながら9まで繰り返す
　　列を1から1ずつ増やしながら9まで繰り返す
　　　　行と　列を　掛けて　出力し
　　　　「　」を　出力し
　　そして
　　改行する
そして

```

# 実行結果

```
1　2　3　4　5　6　7　8　9　
2　4　6　8　10　12　14　16　18　
3　6　9　12　15　18　21　24　27　
4　8　12　16　20　24　28　32　36　
5　10　15　20　25　30　35　40　45　
6　12　18　24　30　36　42　48　54　
7　14　21　28　35　42　49　56　63　
8　16　24　32　40　48　56　64　72　
9　18　27　36　45　54　63　72　81　

```


以上。
半導体工程（日記）


Semiconductor manufacturing is divided into two major stages: the front-end process and the back-end process.

⸻

Front-End Process

Objective: To form circuit patterns on a silicon wafer, establishing the core structure of semiconductor devices.

Main steps and functions:
	•	Cleaning: Removes microscopic impurities from the wafer surface. A high-purity surface ensures precision in subsequent processes.
	•	Photolithography: Uses ultraviolet light and photoresist to accurately transfer circuit patterns onto the wafer.
	•	Etching: Removes unnecessary material to shape the desired pattern.
	•	Ion Implantation (Doping): Introduces impurities into the wafer to adjust its electrical properties, controlling carrier concentration and enabling switching functions.
	•	Oxidation, Deposition, Diffusion, etc.: Forms insulating and conductive films to build semiconductor functionality.
	•	CMP (Chemical Mechanical Polishing): Flattens the wafer surface—essential for multilayer wiring.

Equipment used: Cleaning systems, exposure tools, etching machines, ion implanters, CVD systems, etc.

Characteristics:
Requires nanometer-level precision and must be conducted in cleanroom environments. The quality of the front-end process directly affects the yield and performance of the final product.

⸻

Back-End Process

Objective: To dice, connect, protect, and package individual chips from the processed wafer, finalizing them as products.

Main steps and functions:
	•	Dicing: Cuts the wafer into individual chips using precision techniques to avoid micro-damage.
	•	Cleaning and Inspection: Removes particles created during cutting and verifies the electrical and physical integrity of each chip.
	•	Bonding (Wiring): Connects each chip to external terminals using wire bonding or flip-chip methods.
	•	Packaging: Encases chips in protective packages to enhance shock resistance and environmental durability, while enabling ease of mounting.
	•	Testing: Ensures functionality, checks for visual defects, and conducts durability tests such as burn-in to confirm long-term reliability.

Equipment used: Dicing saws, bonding equipment, molding systems, testers, X-ray inspection machines, etc.

Characteristics:
This final stage ensures the reliability, connectivity, and environmental resistance of the product. Strict quality control is essential.

⸻

The high-precision structures created in the front-end process are completed into practical products during the back-end process. The accuracy and integration of both stages greatly influence the final performance and manufacturing yield.
Autoloadのメモ

## 注意事項
PHP8上級・準上級試験の勉強途中で、学んだものなので、間違っているかもしれません。
ご理解よろしくおねがいします。

## autoloadの基本的な使い方

▼　index.php
```php
require __DIR__ . '/vendor/autoload.php';

$log = new Monolog\Logger('name');
$log->pushHandler(new Monolog\Handler\StreamHandler('app.log', Monolog\Level::WARNING));
$log->warning('Foo');
```

▼ composer.json
```json
{
    "autoload": {
        "psr-4": {"Acme\\": "src/"}
    }
}
```

## 解説
### index.php

requireを使って、composerでインストールしたパッケージの読み込みを行う

#### ログ出力
```php
$log = new Monolog\Logger('name');
$log->pushHandler(new Monolog\Handler\StreamHandler('app.log', Monolog\Level::WARNING));
$log->warning('Foo');
```
	ルートに`app.log`というファイルで、ログが出力される

```shell
[2025-05-14T01:01:08.081400+00:00] name.WARNING: Hello World! []
```

### composer.json

autoloadの中に、psr-4を追加し、その中に`{<エイリアス>: <パス>}`を記述
複数可能

autoload設定の反映には、`composer dump-autoload`を実行することで反映される

※ Acmeは、架空の企業名らしく、ここには開発者任意の文字列を入れることができる("MyApp", "MyPrj" etc...)
Atcoder解いてみた ABC 156 B - Digits

# ABC 156 B - Digits 解いてみた
問題は[こちら](https://atcoder.jp/contests/abc156/tasks/abc156_b)

## 回答
```C++
#include <iostream>
#include <string>
#include <map>
using namespace std;

int main() {
    int N;
    int K;

    cin >> N;
    cin >> K;

    int count = 0;

    while (true) {
        N /= K;
        count++;

        if (N == 0) {
            break;
        }
    }

    std::cout << count << endl;

    return 0;
}
```
はじめまして

# はじめまして

ロクという名前で、ネットをウロウロしています。

特に言うことはないんですけど、プログラミングを楽しんでいます。
Qiitaでは、技術メモ的に使っていこうと思います。

誰かの役に立てば嬉しいです。
よろしくおねがいします。

個人ブログをLaravel12で運営？してるので、よければ見に来てください。
たまに、更新してます。
[locu.me](https://locu.me)
MySql8.0.17から先の更新履歴を読んで記事にしようとしたら5バージョンで挫折した話

最近、モッピーで使っているMySqlのバージョンが上がりました。
先輩方、ありがとうございました。

せっかくの機会なので、前に使っていた8.0.16から先、8.0.17以降のバージョンで変わったところを眺めて、クエリを書いたり、テーブル構成を考えたりする際に役立つ内容をまとめて記事に・・・
できませんでした。

[ネタ元の英語版の膨大な更新履歴](https://dev.mysql.com/doc/relnotes/mysql/8.0/en/)の量に圧倒され、8.0.21まで＋8.1以降で力尽きました。
8.0.22から先の8.0系が読み込めてません。

せっかくなので、途中までの内容でも強引に記事にしておきます。
これを読んで、定期的に更新履歴を読もうと思っていただける方が増えれば幸いです。


最初は自分でまとめた内容とAIにまとめさせた内容で見比べようとか思ってたんですが、夢でした。




# JSON_VALUE()関数が追加され、SELECT文やINDEX作成時の記述が簡略化できるように

今までCAST等を駆使して書かねばならなかったものが、関数１つで簡単に書けるようになりました。

影響バージョン：8.0.20(2020.4)

# パーティショニングの要件の厳格化

文字列の先頭N文字に限ってはられたインデックスしかないカラムは指定できないなど、制限が強化された模様です。
これまではエラーにすることなく無視をしていたとのことで、教えてくれるようになってよかったです。

影響バージョン：8.0.20(2020.4)

# EXPLAIN FORMAT=TREEでウィンドウ関数の情報を確認可能に

これはうれしい！

影響バージョン：8.0.20(2020.4)

# ファイルや変数に結果を出力するためのSELECT INTO構文の変更

INTOの位置など変更になるようです。使ってる方はご確認を。

影響バージョン：8.0.20(2020.4)

# インデックスを強制する場合の構文の変更、DELETE文でも利用可能に

これまでの「FORCE INDEX」等は非推奨となり、JOIN・ORDERなど各段階別の構文に移行せよとのことです。
合わせて、DELETE文でも指定が可能となりました。

影響バージョン：8.0.20(2020.4)

# ハッシュ結合の利用によるパフォーマンスの向上

早くなるのはいいことですね。

影響バージョン：8.0.17から8.0.20まで、段階的に導入

# JSON_TABLE()関数におけるON EMPTYとON ERRORの順序の強制予定

SQLの標準として決まっている「ON EMPTYが先」というルールを将来強制する予定とのことです。

影響バージョン：8.0.20(2020.4)

# DATETIME値にタイムゾーンを指定可能に

リクエスト元でJSTに変換せずとも、そのままクエリを発行可能になりました。
「Z」「+00:00」などはOK、0の桁を省略した「+9:00」や負数の0で「-00:00」とするのはNGのようです。

あくまで標準のTZに変換するために利用するのみで、TZ情報は保存されないとのこと。

そもそもどこを標準にしているのか、事前に設定の確認をお忘れなく！
弊社はちゃんとJSTになっていました。

影響バージョン：8.0.19(2020.1)

#  INSERT ... ON DUPLICATE KEY UPDATE文で行や列にエイリアスを設定可能に

INSERT文の中で書いた行や列にエイリアスを設定しておくことで、UPDATE文の中から参照できます。
これに伴い、これまであったVALUES()による参照は非推奨となり、将来エラーとなるとのことです。

影響バージョン：8.0.19(2020.1)、8.0.20(2020.4)

# 「RECURSIVE CTE」の文でもLIMIT・OFFSETが利用可能に

CTE？？？？
なんのことやら・・・
今度勉強しときます。

影響バージョン：8.0.19(2020.1)

# WHEREなどのない「SELECT * FROM テーブル名」を、省略して「TABLE テーブル名」と書けるように

SQL標準の表記にMySQLが対応したとのこと。
この書き方は初めて知りました。

影響バージョン：8.0.19(2020.1)

# YEAR型が4桁に統一、表示幅付きの書き方とUNSIGNEDが削除予定と発表

今時使ってる人もほぼいないと思いますが、YEAR(2)は廃止されます。
その結果YEARは4桁統一となるため、YEAR(4)という書き方も非推奨になるとのこと。

また、YEARにUNSIGNEDをつけることも非推奨と明記されました。将来エラーになるっぽいです。

影響バージョン：8.0.19(2020.1)

# EXPLAIN ANALYZEの導入

実際にクエリを実行し、EXPLAINで出てくる情報に加えて、実所要時間やループ回数などを詳細に確認できる。
実行計画上は遅くないはずのクエリが遅い！といった場合の調査に活用できるはず。

影響バージョン：8.0.18(2019.10)

# 外部キーを作るなら、参照先にユニークキーが必要

今までこの辺適当だったものが、通常のKEYやPARTIAL KEYではエラーが出るようになるようです。

現状では一時的にこのチェックをすり抜ける方法が用意されていますが、将来削除される予定です。
8.0系から8.4へのアップデートにおいても、ここはいったんスルーして警告にとどめてくれます。

将来の削除に備えて、今のうちにテーブル構成の見直しを！

影響バージョン：8.4.0以降

# STR_TO_DATE()関数の挙動変更

本来存在しない11/31のような日付を変換したとき、これまではそのまま出力していましたが、適切な日付に直して出力するようになりました。
挙動変更にご注意ください。

影響バージョン：8.2.0以降
Clocking Wizardはどのように100MHzから200MHzを作るのか？

# 位相同期回路PLLのおかげ

PLLは入力信号+αをもとに、指定する周波数を出力してくれる。
PLLは内部で位相比較器PCとローパスフィルタLPFと電圧制御発振器VCOと分周器を抱えている。
以下の記事を参考にPLLの基本構造 (分周器無し版)を説明する。記事を見ながらのほうが分かりやすい。

http://gate.ruru.ne.jp/rfdn/technote/baseplltech.asp


位相比較器PCは入力信号二つの位相差と周波数の差に応じて出力を行う。この出力は信号の差が大きいほど大きくなる。位相比較器PCの仕組みについては以下を参考にされたい。

http://gate.ruru.ne.jp/rfdn/TechNote/PDetTech.asp#pg2

次にローパスフィルタLPFによって直流電圧になり、これが電圧制御発振器VCOの入力となる。電圧制御発振器VCOは入力が大きいほど大きな周波数を出力する。
最後に電圧制御発振器VCOの出力が位相比較器PCに帰還する。
つまり、位相比較器の出力が大人しくなるまで、電圧制御発振器VCOの出力信号が入力基準信号と等しくなるまで回路は動き続ける。
そして、位相比較器PCはそうなるよう**うまく**出力してくれるので入力信号と出力信号は必ず同期する。

このPLLに分周器を追加すると、限界はあれど任意の周波数を取り出すことが出来るようになる。位相比較器PCへの入力信号二つの差を分周器を使って調整することで出力信号の周波数を調整できる。詳しくは以下を参考にされたい。

https://www.macnica.co.jp/business/semiconductor/articles/design/133385/

位相比較器PCへの入力信号二つをそれぞれIN, FBとする。INが入力基準信号で、FB (Feedback)が電圧制御発振器の出力である。INをN分周し、FBより周波数を小さくするとFBはINを追いかけるのでFBも小さくなる。FBをM分周し、INより周波数を小さくすると、FBはINを追いかけるので電圧制御発振器VCOの出力周波数は大きくなる。
FBの分周は逓倍に、INの分周は分周に繋がる。このように位相同期回路PLLは二つの分周器を抱えることで自由に出力周波数を作ることができる。
AITRIOSコミュニティーメンバーが執筆したAITRIOS関連コンテンツ・リスト

## はじめに
1年以上に亘り、AITRIOSのコミュニティー活動を通して、メンバーの皆さんがそれぞれの視点でコンテンツを作成されています。掲載されている場所も内容もバラバラですので、それらを探しやすくするためにこれまでに公開されてきた各種コンテンツを一覧にして共有しています。
Googleシートになっていますので、フィルターをかけたり、並べ替えたりして、参照する目的に合わせて各自調整をお願いします。

[コンテンツLIST](https://docs.google.com/spreadsheets/d/1SFGLAtNOO5ADTvMiaaLNBUwaIoNNrPKSAhTNCevChTM/edit?usp=sharing)

https://docs.google.com/spreadsheets/d/1SFGLAtNOO5ADTvMiaaLNBUwaIoNNrPKSAhTNCevChTM/edit?usp=sharing

## コンテンツの特徴
コンテンツには、ソリューション紹介や、使いはじめのガイド、開発の支援ツールや事例など多岐に渡り、またメディアもQiitaをはじめ、YouTube動画や、Note, GitHub そしてProtpediaなどなど様々な場所や形式で提供されています。

##### ソリューションの紹介系
オフィシャル（ソニー公式）にもコンテンツが公開されていますが、コミュニティーメンバーのコンテンツは、使い手目線で紹介されていて、共感や力強さ、そして勢いのあるコンテンツが多いのが特徴です。
##### 手順/ガイド系
オフィシャルサイトには、導入から設置そして、活用のフェーズまできっちりと沢山のガイドが掲載されていますが、初見者にはとっつきにくい感じがあり、もくもく会等の運営で、たくさんの人が、同じところでつまづくところを見てきた経験から、ユーザーが出会うであろう課題に対し、つまづきポイントを乗り越えやすくするガイドだったり、難しいコンセプトをわかりやすく説明したものが多いです。

##### 外部開発支援ツール系
AITRIOSはセンシングするためのテクノロジーであり、実世界で活用するには、センシング結果を意味ある形で見せたり活用するアプリが必要になりますが、現在公式から提供されているものだけど難しいく、ハードルが上がっています。そこで、特にコーディングが得意でない人が難しい場所で困らなくていいように、最低限必要な機能をより利便性高く利用できるようなツールをメンバーの皆さんがたくさんリリースされています。例えば、AITRIOSの制御を簡単にWebアプリからできるようにするツールとか、とにかく最新の推論結果をPCやラズパイに表示し続けるスタンドアロンアプリなどをはじめ、細かいツールなども公開されています。

##### 事例系
メンバーの皆さんの創意工夫が溢れる「AITRIOS / IMX500でこんなことやってみた！」や、事例集そして、"クスッ"とくる面白いアプリから、社会課題への挑戦まで幅広く展開されています。

#### コミュニティー活動へのお誘い
こんなメンバーは、Discordに集っています。この記事に興味を持っていただいた方をご招待いたします。全くコーディングをされない人もいらっしゃいますので、ご自身のスキルによらず、下記のURLからどしどしご参加ください。
https://discord.gg/4fq6hAtfX6
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314541/7c3de087-d5b7-43f7-b739-61d2d7d9352b.png)

また、ミートアップや、Ask me anythingなどの相談会も随時開催していますので、開催情報は、下記のConnpassでチェックをお願いします。
https://techmind.connpass.com/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314541/4e82e0ce-47d2-4d54-8839-9f9e6036ec1b.png)

皆さんとコラボレーションできることを楽しみにしています。
Internet of Things (IoT) LiveLessons, 2nd Edition (Video Training) Lesson 3

# 概要
[Internet of Things (IoT) LiveLessons, 2nd Edition (Video Training)](https://www.pearsonitcertification.com/store/internet-of-things-iot-livelessons-2nd-edition-video-9780137592241)コースのLesson 3の内容をアウトプットします.
このレッスンではスマートホームで使われる製品に関する知識を学べます。

# 内容
- スマートホームに共通してあるもの
    - センサ
    - アクチュエータ
    - Brain（指示を行う）
- 今後は家電に指示を出さなくてもいい時代になってくる
- SANET(Sensors and Actuator Network)
    - 前提条件
        - 開発がしやすい
        - 柔軟である
        - 設置コストが低い
    - 課題
        - セキュリティは限定的
- 無線技術（スマートホームのための）
    - Z-Wave
        - 802.15.4
        - Zigbeeよりも使用できる距離が長い
        - 屋内で有効
    - Zigbee
        - Z-Waveよりもデータの転送容量が大きい
    - Wifi
        - 家で多く使用されている
- Wifiが使えるのでは？
    - バッテリの制約とかない
- 将来はスマートフォンのアプリがすべての家電に対して指示を行うコントローラーの役割を果たす
- IoT コントローラー
    - 広く普及しているもの
        - Google Home/Nest
        - Amazon echo family
        - これらはIFTTTに準拠している
    - Sonos One
        - Bluetoothを使って通信を行う
        - これらはIFTTTに準拠している
    - Raspberry Pi
        - Linuxベースの小型コンピュータ
        - カスタマイズが容易
- Raspberry Pi
    - 普遍的なプラットフォーム（何にでも使える）
- Home Automation(家にあるデバイスを遠隔で管理できるようにすること）の初め方
    - 規模を測定（スケールする可能性ある　目的確認
    - 小さく作って、徐々に大きくしていく
    - プロトコル、ゲートウェイの評価
    - RTFM(read the fine manual)
        - マニュアルをちゃんと読む
    - 設置とセットアップ


# おわりに
コースの最後ではRaspberry Piを使ったデモ（接続したカメラで写真を撮る）を見れたので面白かったです。
優先度の関係でこの後は別のコースを進めようと思います。
また時間があればこのコースを進めようと思います

# 参考文献
- https://www.pearsonitcertification.com/store/internet-of-things-iot-livelessons-2nd-edition-video-9780137592241
Ubuntu24.04 における Apparmor + NFS homedirs 環境のための設定

# はじめに

- snap版のアプリ（例えば VS Code）をNFS環境で使うときに，↓のようなエラーでハマってしまった．
  ```
  $ code
  cannot create user data directory: /home/file-server/user1/snap/code/194: Permission denied
  ```

- 下書きのような雑文ですが，現状日本語だと情報が見つからないので，誰かの役に立つと信じて残しておきます．

- 以下，Ubuntu 24.04 で動作確認をしています．

# 何が起こっているのか

NFS でホームディレクトリを共有する設定だと，たいていユーザのホームディレクトリは：

```
/srv/nfs/user1
/home/fs1/user1   # /home/fs1 = mount point, user1 = username
```

みたいにしているかと思います．

しかし，Apparmor の初期設定ではデフォルトのユーザディレクトリ `/home/*` と `/root` しか，ホームディレクトリの対象として登録されていません．（そしてこの設定はrecursiveではない様子）
そのため，ユーザのホームディレクトリの場所を明示しておかないと，不要なパーミッションエラーに悩まされることになります．

参考：

https://documentation.ubuntu.com/server/how-to/security/apparmor/#profile-customisation

# 設定方法

設定方法を2通り紹介します．

## 設定方法1

コマンドを使って設定したいなら：

``` sh
$ sudo dpkg-reconfigure apparmor
```

で，「追加のホームディレクトリの場所 (Additional home directory locations)」 に，該当のディレクトリを追加する．
例えば，fstab や autofs で ``/home/file-server`` をマウントしていて，`tako` ユーザのディレクトリが ``/home/file-server/tako`` のような場所にあるとしたら：

```
/home/file-server/
```

を入力する．
なお，この手順により `/etc/apparmor.d/tunables/home.d/ubuntu` に設定項目が追加される．

## 設定方法2

https://documentation.ubuntu.com/server/how-to/security/apparmor/#profile-customisation

を参考にして，`/etc/apparmor.d/tunables/home.d/site.local` を書き換える．例えば:

```
@{HOMEDIRS}+=/home/file-server/
```

デフォルトではコメントアウトされていることに注意．

この`home.d`にあるファイルは，`/etc/apparmor.d/tunables/home` で include されている．

最後に

```bash
$ sudo systemctl reload apparmor.service
```

あるいは：

```bash
$ sudo systemctl restart apparmor.service snapd.apparmor.service snapd.service snapd.socket
```

を忘れずに．

# 参考

https://documentation.suse.com/ja-jp/sles/12-SP5/html/SLES-all/cha-apparmor-profiles.html#sec-apparmor-profiles-glob-variables

https://askubuntu.com/questions/1528750/failed-go-start-load-apparmor-profiles-managed-by-snapd-while-booting-ubuntu-2

https://unix.stackexchange.com/questions/662777/snap-cannot-create-user-data-directory-not-a-directory
Python初心者が最初に覚えるべき基本文法

# Python初心者が最初に覚えるべき基本文法
## はじめに
Pythonを勉強するにあたり基本的なものをまとめました。
## １，変数について
他言語では intや stringなど宣言してあげる必要がありましたが
Pythonでは宣言する必要はなく、変数に直接値を代入できます。

例）
```
x = 10       # 整数
name = "太郎" # 文字列
isResult = True  # ブール型
```
## ２，if文
条件によって処理を変えたい場合に使用します。
条件で例えば成人かどうかの判断をする場合は下記のように記載します。
```
age = 20
if age >= 18:
    print("成人です")
else:
    print("未成年です")
```
## ３，for文・while文
複数回同じ処理を繰り返したいときに利用します。
今回はそれぞれ0~4を出力する例を記載します。
#### for文
```
for i in range(5):
    print(i)  
```
#### while文
```
count = 0
while count < 5:
    print(count)
    count += 1
```
## ４，関数と関数の定義
### 関数
関数というのはPythonで用意されている機能のようなものです。
例えば下記のようなものがあります
#### abs()
渡した値の絶対値を返してくれる関数です。
下記のように記載するとどれでも100が返ってきます
例)
```
abs(100)
abs(-100)
```
#### round()
数値と有効桁数を指定するとその桁数で丸めた値が返ってきます。
例えば下記のように記載して2.21を小数第一位で丸めると2.2が返ってきます。
例)
```
round(2.21, 1)
```
#### max()、min()
渡した値の中から最大値のものを返してくれる関数です。
minは逆に最小の値を返してくれます。
下記のものだと12が返ってきます。
例)
```
numbers = [5, 9, 3, 12, 7]
max(numbers)
```
### 関数の定義
この様な関数を自身で作成することができます。
例として下記のようなものができます
```
def priceTotal(count1, price1, count2, price2):

    count1PriceTotal = count1 * price1
    count2PriceTotal = count2 * price2
    totalPrice = count1PriceTotal + count2PriceTotal
    return totalPrice

total = priceTotal(5, 100, 10, 130)
print("合計金額", total, "円です")
```
この様に金額計算を行う関数を作成することもできます。
## おわりに
自身もPythonを勉強し始めたばかりではありますが
AIなどこれからの技術に役立っていく言語ではあると思うので
少しでもお役に立てれば幸い
Databricksにおけるストアドプロシージャのサポート

以前、こちらの記事を書きました。

https://qiita.com/taka_yayoi/items/4d4000f086e11cde30f6

記事を書いた際にはこちらのSQLスクリプティングをストアドプロシージャとも書きましたが間違ってました。お恥ずかしい。改めてClaudeに教えてもらいました。

| 項目 | 関数 | ストアドプロシージャ | スクリプティング |
|------|------|---------------------|-----------------|
| 戻り値 | 必須（単一値） | 任意（複数可） | なし |
| 呼び出し方 | SELECT文内で使用 | CALL文で実行 | 直接実行 |
| データ変更 | 原則不可 | 可能 | 可能 |
| 保存場所 | データベース内 | データベース内 | ファイルまたは一時的 |
| 用途 | 計算・変換 | ビジネスロジック | バッチ処理・管理 |

それで、タイトルに戻りますが、Databricksランタイム17.0(ベータ)でストアドプロシージャがサポートされます。

https://docs.databricks.com/aws/ja/release-notes/runtime/17.0#sql-procedure-support

:::note info
**注意**
執筆時点ではベータ版です。
:::

> **SQLプロシージャのサポート**
> Unity Catalogにおける再利用可能な資産としてストアドプロシージャでSQLスクリプトをカプセル化できるようになりました。[CREATE PROCEDURE](https://docs.databricks.com/aws/ja/sql/language-manual/sql-ref-syntax-ddl-create-procedure)コマンドでプロシージャを作成し、[CALL](https://docs.databricks.com/aws/ja/sql/language-manual/sql-ref-syntax-aux-call)コマンドで使用することができます。

ということで、コンピュートを作成します。

![Screenshot 2025-05-23 at 16.03.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4801da3e-c5ff-4f8e-922f-c22b378b219a.png)

サンプルを作成します。二つの引数`x`と`y`を加算する関数ですが、`sum`は二つの入力の合計、`total`はこれまでの出力の累積値となります。

```sql
CREATE OR REPLACE PROCEDURE takaakiyayoi_catalog.default.add(x INT, y INT, OUT sum INT, INOUT total INT)
    LANGUAGE SQL
    SQL SECURITY INVOKER
    COMMENT 'Add two numbers'
    AS BEGIN
        SET sum = x + y;
        SET total = total + sum;
    END;
```

Unity Catalogに登録されました。

![Screenshot 2025-05-23 at 16.39.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ea3a3e2a-417c-498d-b26e-6c59a17212c1.png)

```sql
DECLARE sum INT;
DECLARE total INT DEFAULT 0;
CALL takaakiyayoi_catalog.default.add(1, 2, sum, total);
SELECT sum, total;
```

|sum|total|
|---|---|
|3|3|

引数を変えてもう一度呼び出します。

```sql
CALL takaakiyayoi_catalog.default.add(3, 4, sum, total);
SELECT sum, total;
```

|sum|total|
|---|---|
|7|10|

SQLスクリプティングを使えば、複数のストアドプロシージャや関数の呼び出しを一つの処理にまとめることができますね。

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
Fargateタスクを時間帯によって自動起動/停止させる方法

# はじめに
これまでは、毎朝始業前にFargateタスクをAWSコンソールから起動し、就業後に停止していました。しかし、うっかり停止を忘れてしまい、無駄にAWSの料金が発生することも……。
自動起動/停止機能の仕組みを作るにはLambdaなどの別サービスを使う必要があると思っていたのですが、実は **サービスの自動スケーリング機能** を使うことで、Fargateタスクの自動起動/停止機能を時間帯ベースで簡単に構築できます。

# CFnテンプレートについて
AWSコンソール上でポチポチ作るのも面倒だったので、CloudFormationを使って自動化の仕組みを構築しました。そのときに実際に利用したCFnテンプレートを載せておきます。

## 前提条件
以下のリソースが既に作成済みであることを前提としています
- ECSクラスター
- ECSサービス

## テンプレートの中身
```yaml
AWSTemplateFormatVersion: '2010-09-09'

Parameters:
  ECSClusterName:
    Type: String
    Description: A ecs cluster name.
  ECSServiceName:
    Type: String
    Description: A ecs service name.
  CreateECSServiceScalableTarget:
    Type: String
    AllowedValues:
      - true
      - false
    Default: true
    Description: Set to 'true' to create ECSServiceScalableTarget, 'false' to skip.
  CronForStartUp:
    Type: String
    Default: "cron(0 8 ? * MON-FRI *)" # 平日8時
    Description: A cron for startup ecs task.
  CronForShutDown:
    Type: String
    Default: "cron(0 19 ? * MON-FRI *)" # 平日19時
    Description: A cron for shutdown ecs task.

Conditions:
  ShouldCreateECSServiceScalableTarget: !Equals [!Ref CreateECSServiceScalableTarget, 'true']

Resources:
  ECSServiceScalableTarget:
    Type: AWS::ApplicationAutoScaling::ScalableTarget
    Condition: ShouldCreateECSServiceScalableTarget
    Properties:
      MaxCapacity: 1
      MinCapacity: 0
      ResourceId: !Sub
        - "service/${ECSCluster}/${ECSService}"
        - ECSCluster: !Ref ECSClusterName
          ECSService: !Ref ECSServiceName
      ScalableDimension: ecs:service:DesiredCount
      ServiceNamespace: ecs
      ScheduledActions:
        - ScheduledActionName: StartUp
          Schedule: !Ref CronForStartUp
          ScalableTargetAction:
            MinCapacity: 1
            MaxCapacity: 1
          Timezone: Asia/Tokyo
        - ScheduledActionName: ShutDown
          Schedule: !Ref CronForShutDown
          ScalableTargetAction:
            MinCapacity: 0
            MaxCapacity: 0
          Timezone: Asia/Tokyo
```

## 仕組みの概要
本構成では、以下のようにFargateタスクの起動と停止を自動化します。
- 平日 8:00（JST）：タスク数を **1** にスケールアウト（＝起動）
- 平日19:00（JST）：タスク数を **0** にスケールイン（＝停止）

これにより、業務時間中のみFargateタスクが稼働するようになり、不要な稼働時間を削減してコスト最適化を実現できます。
起動・停止の時刻は、CloudFormationのパラメータで **cron式** によって自由に変更可能です。業務時間に合わせて調整してください。
また、テンプレートには `CreateECSServiceScalableTarget` というパラメータがあります。これを `false` に設定することで、**自動起動・停止の仕組み自体を無効化**することができます。

### 👇こんな使い方がおすすめ
- **長期休暇前**：`CreateECSServiceScalableTarget = false` にして、自動起動/停止の仕組みを停止しておく（タスク数が0になっているかを事前に確認しておくこと）
- **休暇明け**：`CreateECSServiceScalableTarget = true` に戻せば、自動起動/停止の機能が再び有効になります

# さいごに
今回紹介した方法を活用することで、Fargateタスクを時間帯に応じて自動起動・停止する仕組みを、Lambdaなどを使わずに簡潔に構築できます。
日々の運用コスト削減や手間の軽減にもつながるので、ぜひ試してみてください！
Next.jsでOG画像のURLがlocalhostになる問題をmetadataBaseの動的設定で解決する

## 概要

OG画像のURLが`localhost:3000`になってしまい、公開環境で画像が表示されない。
※忘備録です。

> og:image　https://localhost:3000/opengraph-image.png?88v1c428287defea 

### 使用している環境

- Next.js: 15.2.4
- React: 19.1.0

## 解決方法

`metadataBase`に動的にURLを設定して解決。

```
// src/app/layout.tsx

export async function generateMetadata(): Promise<Metadata> {
  const headersList = await headers();
  const url = new URL(`https://${headersList.get("host")}`);

  return {
    title: APP_NAME,
    description: APP_DESCRIPTION,
    metadataBase: url,
  };
}
````

### 補足

`metadataBase`に環境変数から取得する方式に最初はしていたのですが、環境変数が読み込まれない問題に直面しました。

- 試したこと
    - `process.env.SITE_URL`を用意し`./src/app/layout.tsx`から読み込み
    - `process.env.NEXT_PUBLIC_SITE_URL`を用意し`./src/app/layout.tsx`から読み込み


## 参考サイト

- [metadataBaseを使うとNext.js OG画像のURLを変えられる件について
](https://zenn.dev/wataru_nishi731/articles/next-og-image-basemetadata)
- [Link is being set to localhost:3000/og.png in production](https://stackoverflow.com/questions/76217133/link-is-being-set-to-localhost3000-og-png-in-production)
🌟 Vol.8.16〜8.17 総まとめ：Struts2 出力最適化＆拡張編（一覧表示・共通部品化・カスタムタグ）

Struts2によるWebアプリ開発の中でも、**「出力の最適化」「保守性向上」「拡張性あるUI設計」** は中長期的な運用を見据える上で欠かせないテーマです。

この「Vol.8.16〜8.17」では、実務で頻出する以下の2つのテーマを中心に、Struts2タグライブラリの活用・工夫・設計パターンを整理しています。

---

## 📘 Vol.8.16：【Struts2】データ一覧表示の最適化

📎 https://qiita.com/juehara-crypto/items/f8a49cc0e630219acb21

<table>
<tr><th>目的</th><td>リスト表示の構造を最適化し、表示ロジックを簡潔に保つ</td></tr>
<tr><th>主なトピック</th><td>
<ul>
  <li><code>&lt;s:iterator&gt;</code> + <code>&lt;s:property&gt;</code> の基本パターン</li>
  <li>リスト表示のベストプラクティス</li>
  <li>行番号・条件付き出力・空データ対応</li>
</ul>
</td></tr>
<tr><th>こんな時に</th><td>
<ul>
  <li>検索結果や一覧表を画面に表示したい</li>
  <li>JSP上でループや条件分岐を明快に記述したい</li>
</ul>
</td></tr>
</table>

---

## 📗 Vol.8.17：【Struts2】カスタムタグの拡張応用

📎 https://qiita.com/juehara-crypto/items/7c5b7450e529b866a024

<table>
<tr><th>目的</th><td>繰り返し出現するUI部品を共通化し、開発と保守を効率化する</td></tr>
<tr><th>主なトピック</th><td>
<ul>
  <li>カスタムJSPタグ（.tagファイル）によるUI再利用</li>
  <li>入力フォームの共通部品化（例：テキストフィールド + エラー表示）</li>
  <li>共通ラベル・レイアウトの分離と拡張</li>
</ul>
</td></tr>
<tr><th>こんな時に</th><td>
<ul>
  <li>複数画面で同じ入力欄や表示構造を使っている</li>
  <li>メンテ性の高いJSP構造を目指したい</li>
</ul>
</td></tr>
</table>

---

## ✅ この章で学べること

| トピック                           | 解説記事 |
|----------------------------------|-----------|
| リスト表示を綺麗に・安全に出力する構造 | [Vol.8.16](https://qiita.com/juehara-crypto/items/f8a49cc0e630219acb21) |
| UIパーツの共通化・保守効率の向上     | [Vol.8.17](https://qiita.com/juehara-crypto/items/7c5b7450e529b866a024) |

---

## 💡 実務開発で役立つ活用ポイント

- **ループと条件出力**：`<s:iterator>` + `<s:if>` を使えば JSP がロジックレスに近づき、保守性UP。
- **部品化設計**：共通タグ化すれば、フォームやラベル構造の修正が一括で可能に。
- **保守効率UP**：中〜大規模開発では「テンプレートの資産化」が品質と速度に直結します。

---

## 🔜 次回予告

次回 [Vol.8.18](https://qiita.com/juehara-crypto/items/d01303875f78a1c5282f) では、**JSP構造の最適化と再利用パターン**を深掘りします。  
テンプレート構造・共通ヘッダ/フッタ・画面全体の一貫性設計などにご興味ある方はぜひご期待ください！

---
初心者×ゲーム開発＝最強！1時間で完成する2Dパズル体験🔥



みなさん、こんにちは！ 韓国在住のsanaです:relaxed:

連休明けてから時間が過ぎるのがとても速く感じます。

「自分だけのゲームを作ってみたい！」思ったことありませんか？😊
今回は 完全無料 で学べる 2Dマッチゲーム開発講座 をご紹介します！

it学習をしてもなかなか習得しない初心者の私でも説明通りに進めるだけで簡単に出来きました！:star:


<h2>🎮 Godot Engine（ゴドーエンジン）ってなに？</h2>
<p>Godot Engineは、<br>
<strong>ゲームを作るための無料ソフト</strong>です✨</p>

<p>💻 パソコンに入れるだけで、すぐにゲーム作りを始められます！<br>
お金は一切かかりません。商用利用もOK👌</p>

<h3>🌟 特徴まとめ（やさしく）</h3>
<ul>
  <li>✅ <strong>2Dも3Dも作れる！</strong></li>
  <li>✅ <strong>日本語対応で安心！</strong></li>
  <li>✅ <strong>プログラムが苦手でもOK</strong>（ノードで直感的に操作）</li>
  <li>✅ <strong>Pythonに似た「GDScript」</strong>という言語を使うので覚えやすい！</li>
  <li>✅ <strong>軽くてサクサク動く💨</strong></li>
</ul>

<h3>🧑‍🎓 こんな人にピッタリ！</h3>
<ul>
  <li>ゲーム作りに興味がある初心者🔰</li>
  <li>UnityやUnreal Engineは難しそう…と思っている人</li>
  <li>学校や趣味でゲームを作ってみたい人🎮</li>
</ul>

<p><strong>簡単に言うと…</strong><br>
「<strong>誰でも、今すぐゲームクリエイターになれる</strong>」<br>
そんな夢を叶えてくれるソフトです🌱✨</p>

https://u.inf.run/3H30LGV


２時間未満でゲームが作れる！ 無料なので週末にぜひ試してみてください:kissing:

アンニョン～！
Voiceflow AgentのAPI keyとProject IDの確認法（2025年5月現在）

>　Voiceflowは改版のたびに使用法が少しずつ変化し、公式ドキュメントが現状に合っていないことがあります。2025年5月現在では、APIキーの所在（確認方法）が公式ドキュメントと異なっており、他のアプリと連携するときの障害となっています。
>　そのうち公式に案内されるとは思いますが、それまでのつなぎとしてAPIキー（エージェントキー）とプロジェクトIDの確認方法をメモしておきます。

## 1．Agent keyの確認
　以前のVersionではエージェントを作成後、右上のPublishボタンをクリックすれば、作業終了後のPop upでAPIキーとプロジェクトIDが確認できたのですが、現在は何も表示されません。エージェントのAPIキー（Agent key)を確認するには次のようにします。
 
  Interfacesボタン→API keysをクリックすると、APIキーが伏せ字で表示されます。目視したければ◎ボタンを、コピーしたければCopyボタンを押してください。また右側には関連ドキュメントへのリンクが表示されます。 ![タイトルなし.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579471/18af5574-0d70-4142-bdaa-0aa32058d8cb.jpeg)

## 2．プロジェクトIDの確認
 同様にしてSettingボタン→GeneralをクリックするとProject IDが表示されます。右側のCopyアイコンをクリックするとCopyされます。またWindow下部のPrivate agentをOffにするとAPIキーなしでもエージェントにアクセスできるようです。　
![タイトルなし.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579471/9e2e98a6-c00b-41c0-9524-6f0edd280fea.jpeg)

## 3．まとめ
知っていればどうということのない情報ですが、公式ドキュメントと異なる場所にあるのでメモとして残しました。
functionsで受信し、他のデバイスに転送する処理

# デバイスから他のデバイスに転送するメモ
デバイスから Azure IoT Hub に送られたデータを他のデバイスに転送する方法を書いてます。

### デバイス送信処理

```javascript
const { Client, Message } = require('azure-iot-device');
const { Mqtt } = require('azure-iot-device-mqtt');

// 接続文字列（Azure Portalから取得）
const connectionString = '<Your IoT Hub device connection string>';
const client = Client.fromConnectionString(connectionString, Mqtt);

// デバイスから送信するデータ
const temperature = 25.3;
const humidity = 60.1;

const data = JSON.stringify({
  temperature,
  humidity,
  timestamp: new Date().toISOString()
});

const message = new Message(data);
message.contentType = 'application/json';
message.contentEncoding = 'utf-8';

client.open((err) => {
  if (err) {
    console.error('接続失敗: ' + err.message);
  } else {
    console.log('IoT Hub に接続されました。メッセージを送信します...');
    client.sendEvent(message, (err) => {
      if (err) {
        console.error('送信失敗: ' + err.toString());
      } else {
        console.log('メッセージ送信成功:\n' + data);
      }
      client.close(); // 接続終了
    });
  }
});
```

### Functions受信処理

```javascript
import { app } from '@azure/functions';

app.eventHub('eventHubTrigger', {
  connection: 'IoTHubConnection',
  eventHubName: 'messages/events',
  consumerGroup: '$Default',
  cardinality: 'many',
  handler: async (messages, context) => {
    for (const [i, msg] of messages.entries()) {
      try {
        // EventData.body から payload を取得
        const payload =
          typeof msg.body === 'string'
            ? JSON.parse(msg.body)
            : msg.body; // すでにオブジェクトならそのまま使う

        const deviceId = msg.systemProperties?.['iothub-connection-device-id'];

        context.log(`📦 メッセージ ${i + 1}`);
        context.log(`📟 デバイスID: ${deviceId}`);
        context.log(`🌡️ 温度: ${payload.temperature}`);
        context.log(`💧 湿度: ${payload.humidity}`);
        context.log(`🕒 タイムスタンプ: ${payload.timestamp}`);
      } catch (err) {
        context.log.error(`❌ メッセージ処理エラー:`, err.message);
      }
    }
  }
});
```