OmniAICreator/Qiita-1.07M huggingface dataset:
テキスト形式のWebAssemblyをブラウザ上で実行する

# テキスト形式のWebAssemblyをブラウザ上で実行する

ブラウザ上で`.wat`を`.wasm`にして実行する方法です。
[wat2wasm demo](https://webassembly.github.io/wabt/demo/wat2wasm/)みたいなものを作りたい方向けです。

## wabt.js
[wabt.js](https://www.npmjs.com/package/wabt)を使います。

### 初期化
`CDN`とかで`wabt.js`を読み込んだら、`WabtModule()`を呼び出していろいろやります。
```html
<script src = "https://unpkg.com/wabt@1.0.36/index.js"></script>
```
```js
WabtModule().then((wabt) => {
  //...
})
```

### wat -> wasm
`wabt.parseWat`で`.wat`コードを`.wasm`に変換し、`.toBinary()`でバイトデータを取得します。
```js
  let wasmModule = wabt.parseWat("main.wat", code)
  let buffer = wasmModule.toBinary({
    log : true,
    canonicalize_lebs : true,
    relocatable : false,
    write_debug_names : false
  })
```
`.toBinary()`の引数はオプションです。

#### log
`buffer.log`にログ情報が記録されます。
#### canonicalize_lebs
[LEB128](https://ja.wikipedia.org/wiki/LEB128)が使用されるようです。
#### relocatable
再配置可能なwasmバイナリを作成します。
#### write_debug_names
デバッグ名が書き込まれます。

### wasmの実行
通常の`wasm`と同じように実行することができます。
```js
  WebAssembly.instantiate(buffer.buffer).then(
    (results) => {
      console.log("result : " + results.instance.exports.add(0, 10))
    }
  )
```

## sample code
```index.html
<script src = "https://unpkg.com/wabt@1.0.36/index.js"></script>
<script src = "index.js"></script>
```
```index.js
let code = `
(module
  (func $add (param $lhs i32) (param $rhs i32) (result i32)
    local.get $lhs
    local.get $rhs
    i32.add)
  (export "add" (func $add))
)
`

WabtModule().then((wabt) => {
  let wasmModule = wabt.parseWat("main.wat", code)
  let buffer = wasmModule.toBinary({
    log : true,
    canonicalize_lebs : true,
    relocatable : false,
    write_debug_names : false
  })

  wasmModule.destroy()

  console.log(buffer.log)
  console.log("bytesize : " + buffer.buffer.byteLength)

  WebAssembly.instantiate(buffer.buffer).then(
    (results) => {
      console.log("result : " + results.instance.exports.add(0, 10))
    }
  )
})
```

## 参考
[WebAssembly](https://developer.mozilla.org/ja/docs/WebAssembly)
[wat2wasm demo](https://webassembly.github.io/wabt/demo/wat2wasm/)
[wabt.js](https://www.npmjs.com/package/wabt)

## むすび
ちょっとしたメモでした。
\
[bsky](https://bsky.app/profile/drywaterfall.bsky.social)
InDesign 行のセルスタイルをセルの内容で統一する

セルスタイルを統一したいセルにInsertionPoint（点滅する縦の線）がある状態で実行して下さい。

例えば
テーブルでカレンダーが作ってある場合に
InsertionPointのあるセルの内容が「日曜日」の場合
同じ内容のセルがある行に対して同様のセルスタイルが当てられます。

```JavaScript
if(app.activeDocument.selection[0].constructor.name == "InsertionPoint" &&
    app.activeDocument.selection[0].parent.constructor.name == "Cell" &&
	app.activeDocument.selection[0].parent.parent.constructor.name == "Table"
){
	var targetCell = app.activeDocument.selection[0].parent;
	var targetTable = targetCell.parent;
	var count = 0;
	for(var i = 0; i < targetTable.rows.count(); i++){
		var nowRow = targetTable.rows.item(i);
		for(var ii = 0; ii < nowRow.cells.count(); ii++){
		    var nowCell = nowRow.cells.item(ii);
			if(nowCell.contents == targetCell.contents){
				for(var iii = 0; iii < nowRow.cells.count(); iii++){
					nowRow.cells.item(iii).appliedCellStyle = targetCell.appliedCellStyle;
					count++;
				}
				break;
			}
		}
	}
	alert("changeCellStyle : " + count);
}

```
vscodeのポコポコ音がうざすぎる...!!!

VS Codeのエラー時のビープ音に悩まされる人いませんか？
うるさすぎて私は禿げました。

settings.jsonはめちゃくちゃ...。
これじゃ管理しにくいし、アップデートなどで勝手に設定が増えてた時にどうにもならん。
そもそもデフォルトでoffにしてくれ。

```
// settings.json
{
  ...mySettings.json,
  "accessibility.signals.lineHasError": {
    "sound": "off"
  },
  "accessibility.signals.chatRequestSent": {
    "sound": "off"
  },
  "accessibility.signals.chatResponseReceived": {
    "sound": "off"
  },
  "accessibility.signals.clear": {
    "sound": "off"
  },
  "accessibility.signals.diffLineDeleted": {
    "sound": "off"
  },
  "accessibility.signals.diffLineInserted": {
    "sound": "off"
  },
  "accessibility.signals.lineHasBreakpoint": {
    "sound": "off"
  },
  "accessibility.signals.lineHasFoldedArea": {
    "sound": "off"
  },
  "accessibility.signals.lineHasInlineSuggestion": {
    "sound": "off"
  },
  "accessibility.signals.lineHasWarning": {
    "sound": "off"
  },
  "accessibility.signals.noInlayHints": {
    "sound": "off"
  },
  "accessibility.signals.notebookCellCompleted": {
    "sound": "off"
  },
  "accessibility.signals.notebookCellFailed": {
    "sound": "off"
  },
  "accessibility.signals.onDebugBreak": {
    "sound": "off"
  },
  "accessibility.signals.positionHasError": {
    "sound": "off"
  },
  "accessibility.signals.positionHasWarning": {
    "sound": "off"
  },
  "accessibility.signals.progress": {
    "sound": "off"
  },
  "accessibility.signals.taskCompleted": {
    "sound": "off"
  },
  "accessibility.signals.taskFailed": {
    "sound": "off"
  },
  "accessibility.signals.terminalBell": {
    "sound": "off"
  },
  "accessibility.signals.terminalCommandFailed": {
    "sound": "off"
  },
  "accessibility.signals.terminalCommandSucceeded": {
    "sound": "off"
  },
  "accessibility.signals.terminalQuickFix": {
    "sound": "off"
  },
  "accessibility.signals.voiceRecordingStarted": {
    "sound": "off"
  },
  "accessibility.signals.voiceRecordingStopped": {
    "sound": "off"
  },
  "accessibility.signals.codeActionApplied": {
    "sound": "off"
  },
  "accessibility.signals.codeActionTriggered": {
    "sound": "off"
  },
}
```

### 解決法
この悩みを一気に解決する設定がありました。
signalの音量調整設定です。
ご自身のsettings.jsonに以下の行を追加してください。

```
"accessibility.signalOptions.volume": 0,
```

これでsignalsの設定が追加されても、もう禿げないはず!

頼むからデフォルトでoffにしてくれ...!!!(切望)
WindowsPCが完全にシャットダウンするための設定変更手順

windowsキーを押す
左下シークバーにカーソルが移るので「cp」と入力
enterキーを押してコントロールパネル起動
コントロールパネル内の電源オプションを選択 (表示が異なる場合は右上の表示方法を画像と合わせてください)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/c91e4e85-d171-4510-aaf8-b9fc764966d2.png)

電源ボタンの動作を選択する  を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/d76a8282-f4cb-446c-9c42-cc4e246d7206.png)

現在利用可能ではない設定を変更します を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/cc0400e9-0f35-451e-b719-c4a9dfcd916c.png)


高速スタートアップを有効にする のチェックを外します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/204547ad-2cfc-4665-b26f-8d906ffa68a6.png)

チェックが外れれば変更の保存を押して設定完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/14f92002-16a0-481b-bf09-3f43a41b06d1.png)
Roo Code (旧 Roo Cline) / Cline で zsh の RPROMPT 設定が原因でコマンドライン出力が取得できない問題

## 概要
VS Code の拡張機能 **Roo Code** を使用している際、`RPROMPT` を `.zshrc` に設定していると、**コマンドラインの出力が正しく取得できない** という問題が発生しました。

この問題について、Roo Code の GitHub Issue [#1083](https://github.com/RooVetGit/Roo-Code/issues/1083) として報告しました。
本記事では、この問題の詳細や再現方法、回避策について解説します。

また、~~**同様の問題が VS Code 拡張「Cline」でも発生しており、RPROMPT の回避策を適用しても完全には解決しない** ため、Cline では別の原因がある可能性があることについても言及します。~~ **Cline での問題については最後の[追記](https://qiita.com/norisuke3@github/items/e254e63c4d625677d71b#追記---2025220)参照。**

確認したバージョン
Roo Code: v3.3.21
Cline: v3.4.5

---

## 発生した問題
VS Code のターミナルで Zsh を使用し、`RPROMPT` を `.zshrc` に設定した状態で、Roo Code に次のような指示を出しました。

```
ls -la の出力結果を教えて。
```

しかし、Roo Code は `ls -la` を実行したものの、その **出力結果を取得できず、ユーザーに返せない** という問題が発生しました。

なお、**ターミナル自体では `ls -la` の結果が正常に表示されており、出力が阻害されているわけではありません。**
このことから、Roo Code のターミナル出力の取得方法と `RPROMPT` の設定が干渉している可能性が考えられます。

---

## 再現方法
1. 以下の `.zshrc` を設定する。  
   ```zsh
   RED=$'%{\e[1;31m%}'
   DEFAULT=$'%{\e[1;m%}'

   RPROMPT=$RED'[%~]'$DEFAULT
   ```
2. VS Code のターミナルを開き、Zsh を使用する。  
3. Roo Code に次の指示を出す。  
   ```bash
   Tell me the output of the command ls -la.
   ```
4. **Roo Code が `ls -la` の出力を取得できず、結果が返されないことを確認する。**  

---

## 原因の考察
この問題は、**Roo Code が `RPROMPT` に設定された ANSI エスケープシーケンスを適切に処理できず、ターミナル出力を正しく認識できないことが原因** である可能性が高いです。

Zsh の `RPROMPT` は、ターミナルの **右側に表示されるプロンプト** であり、上記の設定では「現在のディレクトリ (`%~`) を赤色で表示する」ようにカスタマイズされています。

通常のターミナル（iTerm2 や macOS の標準ターミナル）では問題なく動作しますが、**VS Code の Roo Code では `RPROMPT` の影響で出力の解析がうまくできず、コマンドの結果を取得できない** という問題が発生している可能性があります。

---

## 回避策
### **回避策 1: VS Code では `RPROMPT` を無効化**
```zsh
if [[ "$TERM_PROGRAM" != "vscode" ]]; then
    RPROMPT=$RED'[%~]'$DEFAULT
fi
```
この設定を `.zshrc` に追加すると、**VS Code のターミナルでは `RPROMPT` を使用せず、他のターミナルでは従来通り動作** します。

### **回避策 2: `RPROMPT` を削除する**
根本的に問題を避けるなら、`RPROMPT` を設定しないのも一つの手です。
```zsh
unset RPROMPT
```
ただし、`RPROMPT` を使ってターミナルをカスタマイズしている場合は、この方法は望ましくないかもしれません。

---

## 関連情報
- **GitHub Issue**: [Roo Code Issue #1083](https://github.com/RooVetGit/Roo-Code/issues/1083)  
- **環境情報**:
  - **VS Code Version**: 1.97.2 (Universal)  
  - **OS**: macOS 15.1.1  
  - **Shell**: Zsh  
  - **Terminal Emulator**: VS Code Integrated Terminal  
  - **Roo Code Version**: 3.3.21  
  - **LLM Used**: `google/gemini-flash-1.5`  

---

## まとめ
- `RPROMPT` を `.zshrc` に設定していると、Roo Code が `ls -la` の出力を取得できなくなる。
- `RPROMPT` を VS Code のターミナルのみ無効化することで回避できる。
- ~~同様の問題が Cline でも発生するが、RPROMPT を無効化しても解決しないため、別の原因がある可能性がある。~~ Cline での問題については最後の[追記](https://qiita.com/norisuke3@github/items/e254e63c4d625677d71b#追記---2025220)参照。
- Roo Code のこの問題について、[GitHub Issue #1083](https://github.com/RooVetGit/Roo-Code/issues/1083) に報告済み。

もし同じ問題に遭遇した方がいれば、上記の回避策を試してみてください！🚀

## 追記 - 2025/2/20
Cline では、以下の様に`RED=$'%{\e[1;31m%}'`だけでコマンドライン出力が取得できなくなる事がわかりました。。
   ```zsh
   RED=$'%{\e[1;31m%}'
   ```
ubuntu20.04にてhtaccessを有効にする設定

ubuntuではhttpd.confが無く、/etc/apache2/apache2.confにあるconfファイルの設定になります。
```
<Directory />
        Options FollowSymLinks
        AllowOverride None
        Require all denied
</Directory>

<Directory /usr/share>
        AllowOverride None
        Require all granted
</Directory>

<Directory /var/www/>
        Options Indexes FollowSymLinks
        #AllowOverride None //ここを下記の様に変更。
        AllowOverride All
        Require all granted
</Directory>
```
ubuntuの場合apache関連の設定は

/etc/apache2/直下の各ファイルを設定変更が必要。
```
apache2.conf　//今回はここ
conf-enabled
magic           
mods-enabled  
sites-available
conf-available  
envvars       
mods-available  
ports.conf    
sites-enabl
```

参考サイト：https://www.t3a.jp/blog/infrastructure/apache-htaccess-enable/
Laravel における命名規則

##  Laravel における Controller 名、Blade 名、Blade ファイル名の命名ルール

Laravel のプロジェクトで Controller / Blade / Bladeファイル の命名を統一すると、
可読性が向上し、**チーム開発でも一貫したコード管理が可能**になる。

## 1. Controller の命名ルール
### 基本ルール

**単数形 + Controller をつける**
**PascalCase（頭文字を大文字にする）を使う**
**リソースコントローラなら RESTful に準拠した命名をする**

```:具体例
【用途】	　　　　【Controller名】	　　　【説明】

ユーザー管理	　 UserController	     ユーザーの CRUD 処理を担当
記事管理	　　　 ArticleController 	 記事の CRUD 処理を担当
認証処理	      AuthController	     認証関連の処理（ログイン・ログアウト）
ダッシュボード	  DashboardController	 ダッシュボード画面の処理
プロフィール	  ProfileController	     ユーザーのプロフィール画面の処理
```
コントローラーの生成コマンド
```php:example.php
php artisan make:controller UserController
```

## 2. Blade（ビュー）の命名ルール 
### 基本ルール

**• スネークケースを使用する場合は(例snake_case.blade.php) で記述**
**• 関連するビューは resources/views/下のサブディレクトリに整理する**
**• Controller のメソッドに対応するファイル名をつけるを推奨する**

```:Blade記述具体例
【画面の用途】  【Blade名】	Blade ファイル名
ユーザー一覧	  users.index	 resources/views/users/index.blade.php
ユーザー詳細 	  users.show	 resources/views/users/show.blade.php
ユーザー編集	  users.edit	 resources/views/users/edit.blade.php
記事一覧	      articles.index resources/views/articles/index.blade.php
記事詳細	      articles.show	 resources/views/articles/show.blade.php
ログイン画面	  auth.login	 resources/views/auth/login.blade.php
```

## 3. Blade ファイルのフォルダ構成

```:フォルダ構成
resources/views/
├── layouts/
│   ├── app.blade.php  # 共通レイアウト
│   ├── header.blade.php  # ヘッダー
│   ├── footer.blade.php  # フッター
│
├── users/
│   ├── index.blade.php  # ユーザー一覧
│   ├── show.blade.php  # ユーザー詳細
│   ├── edit.blade.php  # ユーザー編集
│
├── articles/
│   ├── index.blade.php  # 記事一覧
│   ├── show.blade.php  # 記事詳細
│
└── auth/
    ├── login.blade.php  # ログイン
    ├── register.blade.php  # 会員登録
```
    
 **•各フォルダ毎にリソースを整理すると管理しやすくなる**


## 4. Controller と Blade の関連付け
**•UserController.php（コントローラ）の例**

```php:example.php
class UserController extends Controller
{
    // ユーザー一覧
    public function index()
    {
        return view('users.index');
    }

    // ユーザー詳細
    public function show($id)
    {
        return view('users.show', compact('id'));
    }

    // ユーザー編集
    public function edit($id)
    {
        return view('users.edit', compact('id'));
    }
}
```




## 5. Blade の記述方法
**resources/views/users/index.blade.php（ユーザー一覧のビュー）**
**記述例→ @extends('layouts.app') で layouts/app.blade.php を継承している**

```php:example.php
@extends('layouts.app')

@section('content')
    <h1>ユーザー一覧</h1>
    <ul>
        @foreach($users as $user)
            <li>{{ $user->name }}</li>
        @endforeach
    </ul>
@endsection
```
## 6. この記事のまとめ
**以下の命名規則を適用すると、Laravelでのプロジェクトの可読性・管理のしやすさが向上する**

 •Controller は PascalCase + Controller（例: UserController）
 •Blade（ビュー）は snake_case.blade.php で命名（例: index.blade.php)
 •ビューは resources/views/ 以下にフォルダを作成して整理
 
 •Controller の return view('users.index');で Bladeと連携
 •共通レイアウトは layouts/ に格納して @extends で継承
仕事効率5倍化！AI活用で「残業ゼロ」を実現した私の方法

こんにちは、デジタルツール大好きなママ社員のさきです✨ 今日は「AIで仕事を時短する具体的な方法」について赤裸々に語ります！特に最近ハマっているAI PowerPointの驚異の時短術を大公開♪

▮衝撃の事実：半日→10分の革命
先月の営業会議で起きた奇跡：
〈従来〉
9:00 資料構成を考える
11:00 スライド作成開始
13:00 デザイン調整
15:00 完成（計6時間）

〈AutoPPT活用後〉
14:50 「クラウド会計ソフト比較資料」と入力
14:53 自動生成された3案から選択
14:57 カラーを会社ロゴに合わせて調整
15:00 完成（たった10分！）

![zu7h4r8rgdnek8elap4mvsdmhwmm.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016113/089842e1-1a4b-4d26-ac67-e967ddb922aa.jpeg)




https://autoppt.com/ja/


▮私流AI活用3ステップ
① 脳内をそのまま投げる
「新規顧客獲得戦略 数値重視 競合分析含む」のように、思いついたキーワードをそのまま入力。最近追加された音声入力機能も超便利！

② デザインはAIにお任せ
「プロっぽく」「カジュアルに」などの指示可能。私のお気に入りは「スタバ風ミニマルデザイン」です♫

③ 微調整で個性を追加
AI生成後にフォントサイズやアニメーションをチューニング。先輩に「資料のクオリティ上がったね」と褒められました！

▮あるある悩みを解決
✓ 数値資料が苦手 → 自動でグラフ生成
✓ 画像配置に時間がかかる → 最適な位置に自動配置
✓ チーム確認が面倒 → コメント機能付き共有

先週は移動中にスマホでAI PowerPointを開いて、電車内で資料修正できちゃいました！🚃

▮裏側のすごい技術
開発者インタビューで分かった秘密：

文章要約：BERTモデルでキーワード抽出
デザイン予測：過去100万件の優良スライドを学習
リアルタイム反映：差分更新アルゴリズム採用
専門家いわく「PPT作成を微分するように最適化」しているそうです！（意味はよく分からないけどすごい！）

▮注意点と対策
△ 完全自動化はまだ難しい → 最終チェック必須
△ 特殊記号があると誤認識 → 平易な表現が吉
◎ 毎週金曜に新テンプレート追加！

先月追加された「DX推進向けテンプレート」が社内で大流行中です🔥

まとめ：時短は最高の自己投資
AutoPPTを使い始めてから：
✓ 定時退社が当たり前に
✓ 子供との時間が2倍に
✓ ストレス激減で肌ツヤアップ♪

「時間がない」と悩んでいる方、ぜひAI PowerPointで仕事の「時短筋トレ」始めてみませんか？次回はAIメール執筆術を紹介しますね！
P1P2単純梁の張り出し 組合せ応力 問題10A) p126「材料力学演習(20221021)」をsympyでやってみたい。

# オリジナル
[問題10A) p126](http://zairikiweb.starfree.jp/zai_enshuh/zai_enshuh_ver.3.3.pdf#page=131)[　＜「材料力学演習(20221021)一括(ver.3.3)」を勉強したい。#sympy](https://qiita.com/mrrclb48z/items/c3274daf5f7a99cfe027#%E4%BD%9C%E6%A5%AD%E4%B8%AD%E7%A7%81%E3%81%AE%E8%A7%A3%E7%AD%94sympy)
？？？タブレット等で、pdfを開く事ができないかも。？？？　

:::note info
~~次　 [基本例題6.12 P164
](https://qiita.com/mrrclb48z/items/7ff5fd4dba41eb0cfdef)~~
:::

# sympyで
・ver0.1
```python
# ver0.1
from sympy import *
var('P1,P2,a,b,c,x')
var('RA,RB')
MAC_str="RA*x"
MCB_str=MAC_str +"+"+"-P1*(x-a)"
MBD_str=MCB_str                +"+"+"+RB*(x-a-b)"
MAC=sympify(MAC_str); FAC=diff(sympify(MAC_str),x)
MCB=sympify(MCB_str); FCB=diff(sympify(MCB_str),x)
MBD=sympify(MBD_str); FBD=diff(sympify(MBD_str),x)
print("#",FAC," "*10,",",MAC_str)
print("#",FCB," "*4 ,",",MCB_str)
print("#",FBD       ,",",MBD_str)
sol=solve([Eq(MBD.subs({x:a+b+c}),0),
           Eq(RA+RB-P1-P2        ,0)],
          [RA,RB])
print("#",sol.get(RA),P1+P2-RA)
# RA           , RA*x
# -P1 + RA      , RA*x+-P1*(x-a)
# -P1 + RA + RB , RA*x+-P1*(x-a)++RB*(x-a-b)
# (P1*b - P2*c)/(a + b) P1 + P2 - RA
```
# sympyのBeamで作図
(勉強中)

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

# いつもと違うおすすめです。
#### 参考文献

~~＞一部に等分布荷重を受ける単純支持はり~~
~~＞JSME p89~~

ちょっと違うかも 
＞張出しばり 1)
＞構造力学公式集 表5.5 張出しばりの公式　p154
rbenv install 2.6.6でエラーが発生した

### はじめに
rbenvを使用してRuby 2.6.6をインストールする際に、さまざまな要因で失敗しました。
以下に私が試して有効だったものを列挙します。

## あなたがOpenSSLの3系を使用している場合

以下コマンドでOpenSSLのバージョンを確認できます
```
% openssl version
```


Ruby 2.4〜3.0はOpenSSL 3系ではインストールできないので、OpenSSL@1.1.1系をインストールする必要があります。

`brew install openssl@1.1`ではインストールできないので、下記記事を参考にインストールしてください。

https://qiita.com/k-tetsuhiro/items/70843c746e3c185378f8

## `ffi_prep_closure`によりビルドが失敗する場合

build logに下記の記述がある場合

```
closure.c:264:14: error: call to undeclared function 'ffi_prep_closure'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
```

<details>

<summary>※build logの確認方法</summary>

インストールに失敗した際、下記のような出力になるかと思います。
出力の最後に`See the full build log at ~`があるので、そこを見れば良いです。

```console
$ rbenv install 2.6.6              
(略)
BUILD FAILED (macOS 13.7.4 on arm64 using ruby-build 20250215)

You can inspect the build directory at /var/folders/rs/〇〇
See the full build log at /var/folders/rs/〇〇 <- ここにbuild logがあります
```

</details>



インストール時に環境変数RUBY_CFLAGSを指定することで解決する

```
$ RUBY_CFLAGS=-DUSE_FFI_CLOSURE_ALLOC rbenv install 2.6.6
```

https://github.com/ffi/ffi/issues/869

## 他の環境変数があっているか確認する

build logに以下のようなエラーがある場合、環境変数に設定しているパスが誤っている

```terminal
(略)
ld: warning: search path '/opt/homebrew/opt/php@8.0/lib' not found
(略)
```

### 以下の手順で再設定

1. 環境変数を確認
    ```terminal
    % export -p
    (略)
    export LDFLAGS=-L/opt/homebrew/opt/php@8.0/lib
    (略)
    ```
2. 削除

    ```
    $ unset LDFLAGS
    ```
    
3. 設定

    ```
    $ export LDFLAGS=-L/opt/homebrew/opt/php@8.3/lib
    ```
「〇〇で歌ってみた」替え歌歌詞に基づくデータセット公開時の注意点の検討

# はじめに

「『〇〇で歌ってみた』替え歌に基づく音韻検索データセット」を公開するとしたら、どういう注意が必要か、検討した内容をまとめました。

「〇〇で歌ってみた」は元歌詞の音韻を特定ジャンルの名詞の羅列で模倣する替え歌のジャンルです。
「『〇〇で歌ってみた』替え歌に基づく音韻検索データセット」は同替え歌に基づいて作成された、音韻が類似した単語を検索する技術の精度評価に使うためのデータセットです。
元歌詞がどのような替え歌歌詞に変換されたかを、候補単語のリストから検索するタスクとなっています。
このデータセットは、以下の情報を含みます。

- 元歌詞の短いフレーズ（文節や単語レベルの長さ）がどの替え歌単語に置き換えられたか
- 検索対象となる替え歌単語のリスト

学術利用がメインではあるものの、データセットが他者のコンテンツを用いて作られているため、公開にあたっては注意が必要と考え、情報を整理しました。
筆者は法律の専門家ではないため間違いを含む可能性があります。もしなにかあればコメントいただけると幸いです。
本文章をもとになされた第三者の決断について筆者は責任を負いません。

# データセットの概要

クエリリストと単語リストからなる文字列データです。

- クエリリスト
  - 元歌詞のフレーズと替え歌単語の対応ペアのリストです。
  - 元歌詞がクエリ、替え歌単語が正解データとなります。
- 替え歌単語リスト
    - 検索対象となる替え歌単語の候補のリストです。

例えば「野球選手名で歌ってみた」であれば、以下のようなJSONファイルとなります。
queries の query が元歌詞フレーズ、positive が替え歌単語（野球選手名）、words が替え歌単語のリストです。

```json
{
  "queries": [
    {
      "query": "アイ",
      "positive": ["アイ"]
    },
    {
      "query": "アウマル",
      "positive": ["タクマル"]
    },
    {
      "query": "アケ",
      "positive": ["アベ", "カケイ"]
    }
    ...
  ],
  "words": [
    "アーノルド",
    "クリスアーノルド",
    "アーリン",
    "ロビーアーリン",
    "アイ",
    "アイエイジロウ",
    ...
  ]
}
```

# 想定されるリスク

## 歌詞

元歌詞や替え歌歌詞には著作権があります。
ただし、著作権法第30条の4によって、「情報解析等」の「非享受利用」であれば、著作権者の承諾なく利用（複製や公開含む）できます。
音韻検索データセットとしての利用は「情報解析等」に該当しますが、「享受」ができると30条の4の例外になりますので、注意が必要です。
今回のデータセットでは、歌詞を短く分割し、順番も復元が困難な程度にバラバラにすることで「享受」を困難にしています。
これにより、著作権に関する問題はクリアできると考えられます。

著作権的には問題なくとも、替え歌歌詞がキャラクターや人名の場合、商標権やパブリシティ権の侵害、名誉毀損などにつながる可能性が考えられます。
しかし、音韻が類似した元歌詞フレーズと併記するだけでこれらの不利益を与えるリスクは低いと考えられます。
強いて言えば、併記されるフレーズが侮蔑的な言葉だった場合に、名誉毀損等になるかもしれませんので、そういった元歌詞はあらかじめ省いておくほうが無難です。

## 替え歌単語リスト

替え歌単語のジャンルによってリスクが変わってきます。
基本的には、動物の種族名など権利所有者がいないものはもちろん、キャラクターや著名人など商業や人格が関わる文字列であっても、問題が発生する可能性は低いと考えられます。
音韻検索データセットとして列挙・公開する行為自体が、文字列コンテンツの権利所有者に商業的・人格的な不利益を与えるとは想定しにくいからです。

# 許容される公開方法

上記の考察から、データセットの公開自体は問題ないと考えられます。

次に、商用利用を許可してよいかどうかについてですが、音韻検索データセットとしての利用であれば、商用利用も許可して差し支えないという見解です。
商用利用の場合、コンテンツの権利所有者の商標権やパブリシティ権の侵害に特に注意する必要があるものの、音韻検索データセットとしての利用範囲内では、そうした商業的な利益の衝突は考えにくいためです。
万が一、データを別の意図（例：キャラクター名の大量利用による商品化）で加工する場合は、利用者側が責任を負うべき問題であり、公開者の範疇を越えます。

# どういうライセンスがよさそうか

商用利用可能なデータセットとしての公開が問題なさそうであれば、あとは好みに応じてライセンスを選べば良いです。
好みとは、クレジット表記やライセンス継承などをどの程度求めるかということです。
やっぱり不安だから、あるいは、競合を作りたくないから、という理由で非商用にするのもありだと思います。

データセットには著作権が生じにくいとされるため、MITライセンスやCC系ライセンスといった「著作物向けライセンス」は、厳密には不向きとの意見もあります。
不向きというのは、例えば裁判になったときに、公開者が定めた利用条件を守らせる効力がなかったと判断される、みたいなリスクがあるということです。
実際にはこれらのライセンスがデータセットにも数多く使われていますので、全くの無効ということでもないのかもしれませんが。

ODC系（Open Data Commons）やCDLA系（Community Data License Agreement）など、データセット公開に特化したライセンスを選ぶのも手段の一つです。
ライセンスを「契約」として成立させ、利用条件を強制したい場合には、ワンクリックなどの手段でユーザに同意を得る仕組みを用意することが望ましいとされています。


# おわりに

本記事では、「〇〇で歌ってみた」の替え歌歌詞を用いた音韻検索データセットを公開するにあたって、公開者の目線で、考慮すべき著作権や商標権、パブリシティ権などのリスクを整理してみました。
これから替え歌データセットを作ろうという方々にとって、本記事が一つの検討材料になれば幸いです。

# 参考

- [オープンデータセットのライセンスガイド](https://zenn.dev/sanami/articles/37d0028142b0a6)
  - 著作物ではないデータセットのライセンスの考え方について大変勉強になりました。
  - 参考文献として挙げられていた以下の資料も大変勉強になりました。
      - [生成AI開発におけるデータセットを構築・利用・公開する際に問題となる法規制とそのクリア方法](https://zenn.dev/sanami/articles/37d0028142b0a6)
      - [学習用データセットおよび学習済みモデルのライセンスに関する法的問題](https://www.jstage.jst.go.jp/article/alis/11/0/11_110/_article/-char/ja/)」
Kubernetes: CRD設計チェックリスト

Kubernetesオペレーター開発者がCRDを設計するときに考慮することです。

## 基本構造設計

- [ ] APIグループとバージョン(`apiVersion`)が適切に定義されているか
- [ ] リソース名（Kind, plural, singular, shortNames）が命名規則に従っているか
- [ ] スコープ（Namespaced/Cluster）が適切に選択されているか
- [ ] `.spec`と`.status`の責務が明確に分離されているか

## スキーマ定義

- [ ] すべてのフィールドにOpenAPI v3スキーマが定義されているか
- [ ] 各フィールドに適切な型とバリデーションルールが設定されているか
- [ ] 必須フィールド（required）が適切に指定されているか
- [ ] デフォルト値が必要なフィールドに`default`が設定されているか
- [ ] フィールドの`description`が明確に書かれているか
- [ ] `nullable`の使用が適切か（特にデフォルト値との関係）

## サブリソース

- [ ] Statusサブリソース（`spec.subresources.status`）が有効化されているか
- [ ] レプリカを持つリソースの場合、Scaleサブリソースが設定されているか
- [ ] 追加プリンタ列（`additionalPrinterColumns`）が定義されているか

## バリデーション

- [ ] フィールドの制約（min/max, pattern等）が適切に設定されているか
- [ ] CELを使った複雑なバリデーションルールが必要な箇所に定義されているか
- [ ] Validation Webhookの必要性を検討したか

## バージョニング

- [ ] バージョン戦略（alpha→beta→v1）が計画されているか
- [ ] 複数バージョン提供時のConversion Webhookの必要性を検討したか
- [ ] ストレージバージョン（`storage: true`）が適切に設定されているか
- [ ] 非推奨化（deprecation）の計画があるか

## 将来性

- [ ] フィールド設計に拡張の余地があるか
- [ ] 後方互換性を維持できる構造になっているか
- [ ] 標準的なKubernetesパターン（PodTemplateSpec等）を適切に再利用しているか

## ドキュメント

- [ ] 各フィールドの説明が十分か
- [ ] 制限事項が明記されているか
【令和最新版】FFmpegからYouTubeLiveに映像を送信する

# FFmpegからYouTubeLiveに映像を送信する

※ 令和最新版（令和7年2月20日 時点）

## 結論

オーディオトラックが無いとダメらしい

ffmpegコマンド例

```batch
ffmpeg -y -f rawvideo -pix_fmt bgr24 -s 1280x720 -r 8 -i - -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 -map 0:v -map 1:a -c:v libx264 -preset 5 -pix_fmt yuv420p -g 16 -tune zerolatency -bf 2 -b:v 2000k -maxrate 2000k -bufsize 4000k -c:a aac -b:a 128k -ar 44100 -f flv rtmp://a.rtmp.youtube.com/live2/your-youtube-stream-key
```

特に送信部分

`-f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 -map 0:v -map 1:a -c:v libx264 -preset 5 -pix_fmt yuv420p -g 16 -tune zerolatency -bf 2 -b:v 2000k -maxrate 2000k -bufsize 4000k -c:a aac -b:a 128k -ar 44100 -f flv rtmp://a.rtmp.youtube.com/live2/your-youtube-stream-key`

オーディオトラック関係

`-i anullsrc=channel_layout=stereo:sample_rate=44100 -map 0:v -map 1:a`

`-c:a aac -b:a 128k -ar 44100`

## 使用例

FFmpegだけを使ってPCの画面を無音で配信するコマンド(Windows)

```batch
ffmpeg -f gdigrab -framerate 30 -i desktop -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 -map 0:v -map 1:a -c:v libx264 -preset 5 -pix_fmt yuv420p -g 16 -tune zerolatency -bf 2 -b:v 2000k -maxrate 2000k -bufsize 4000k -c:a aac -b:a 128k -ar 44100 -f flv rtmp://a.rtmp.youtube.com/live2/your-youtube-stream-key
```
ざっくり SSH 公開鍵認証方式

# 概要
公開鍵を相互に持ちます。秘密鍵を相手に渡してはいけません。

接続元と接続先のチェックは相互に行われます。

関連するファイルの一般的な配置は以下の通りです。

| ファイル | 接続元（クライアント） | 接続先（サーバー） |
| ---- | ---- | ---- |
| **クライアント<br>秘密鍵** | (1)<br>`~/.ssh/id_ed25519` | **なし** |
| **クライアント<br>公開鍵** | (1)<br>`~/.ssh/id_ed25519.pub` | (2)<br>`~/.ssh/authorized_keys` |
| **サーバー<br>秘密鍵** | **なし** | (3)<br>`/etc/ssh/ssh_host_ed25519_key`|
| **サーバー<br>公開鍵** | (4)<br>`~/.ssh/known_hosts` | (3)<br>`/etc/ssh/ssh_host_ed25519_key.pub`|

### **詳細な説明**
(1). **クライアントの鍵ペアの作成**
   - クライアント側で `ssh-keygen` を実行し、`id_ed25519`（秘密鍵）と `id_ed25519.pub`（公開鍵）を作成

```bash:コマンド例
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519
```

   - **`id_ed25519` は秘密として扱い、外部に流出させないこと**

(2). **公開鍵のサーバー登録**
   - クライアントの `id_ed25519.pub` をサーバーの `~/.ssh/authorized_keys` に追加

```bash:コマンド例
cat ~/.ssh/id_ed25519.pub | ssh user@server "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
```

   - `authorized_keys` はサーバーが接続を許可するクライアントの公開鍵リスト

(3). **サーバーのホスト鍵の生成**
   - SSH サーバーが自己認証するために使用する秘密鍵と公開鍵
   - `/etc/ssh/ssh_host_ed25519_key`（秘密鍵）および `/etc/ssh/ssh_host_ed25519_key.pub`（公開鍵）が OpenSSH サーバーインストール時に自動生成
   - **通常は手動で設定不要**

(4). **クライアントの `known_hosts`**
   - クライアントが接続したことのあるサーバーの公開鍵情報を記録
   - 初回接続時に以下のような警告が表示され、受け入れると `~/.ssh/known_hosts` に登録
```
The authenticity of host 'server.example.com (192.168.1.1)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
```
   - `known_hosts` はサーバーのなりすましを防ぐために利用される

---

# SSH 鍵の選択について（2025年現在）
現在、セキュリティと処理速度の観点から **Ed25519** が推奨されています。

古いシステムとの互換性が必要な場合は RSA 4096bit を使用することがあるかもしれません。
Codewars 8 kyu Exclamation marks series #6: Remove n exclamation marks in the sentence from left to right

# Codewars 8 kyu Exclamation marks series #6: Remove n exclamation marks in the sentence from left to right
https://www.codewars.com/kata/57faf7275c991027af000679/python
Task
Remove n exclamation marks in the sentence from left to right. n is positive integer.

# Verbalization
If i is !, revolve ! n times (use replace(“!”, “”, n)

I assumed that I need  Put vacant list (m = “”), Roop st (For i in st), Add i in vacant list but they were not needed :->

Only I needed to know is replace method can assign the number to replace.

# Code 
```py
def remove(st, n):
    return st.replace("!","", n)

```

# Reference
https://www.w3schools.com/python/ref_string_replace.asp

# Other solution that I initially tried.
```py
def remove(s, n):
    liste=[]
    k=1
    for i in range(len(s)):
            if s[i]=="!" and k<=n:
                k+=1
            else:
                liste.append(s[i])
    return "".join(liste)
```
Debian liveのユーザーとパスワード

USBやDVDから起動できるDebian liveは，いざという時便利です．Debian liveは起動するとユーザ認証なしに使用することができます．しかし，スクリーンロックの解除やサスペンドからの復帰時などユーザ名とパスワードが必要になるときがあります．Debian liveのユーザー名とパスワードは次のとおりです．

username: user
password: live
pythonのjson.dump(s)のclsパラメーターでのカスタマイズについて

# 初めに
pythonのdictをJSON文字列にするのは良く行われる処理だと思います
とあるAPIに渡すのに、数値は文字列にしないといけないケースがありました

dictの生成処理で、文字列に変換すれば良いかと思いましたが、
今一つイケていないので、JSON文字列を生成する際に、intもしくはfloatなら文字列にしようと考えました


# やってみた
```test_jsondump.py
import json
import datetime

class Num2StrEncoder(json.JSONEncoder):
    def default(self, o):
        print(o) # debug
        if isinstance(o, (int, float)):
            return str(o)
        return super().default(o)


def test_jsondump():
    record = {
        "aaa": 100,
        "bbb": 0,
        "ccc": 0.0,
        "ddd": 123456789.12345,
        "eee": "123",
        "fff": "0.0",
        # "ggg": datetime.datetime.now(),
    }
    buf = json.dumps(record, cls=Num2StrEncoder)
    print(buf)
```

上のコードを実行しましたが、defaultメソッドは呼び出されません

# 考察
下は[マニュアル](https://docs.python.org/ja/3.13/library/json.html#json.dump)からの抜粋です
(1部改行)
特に呼び出すのに条件はないようです

```
cls (a JSONEncoder subclass) -- 
If set, a custom JSON encoder with the default() method overridden, 
for serializing into custom datatypes. 
If None (the default), JSONEncoder is used.
```

[マニュアル](https://docs.python.org/ja/3.13/library/json.html#json.dump)を眺めていて気づいたのがdefalutパラメーターです
(1部改行)
こちらは`that can't otherwise be serialized`なので、JSON文字列に出来ない場合のみ呼ばれるようです

```
default (callable | None) --
A function that is called for objects that can't otherwise be serialized.
It should return a JSON encodable version of the object or raise a TypeError.
If None (the default), TypeError is raised.
```

同じdefaultなので気になったので、試しに`"ggg": datetime.datetime.now(),`を追加しテストしたところ

```
test/test_jsondump.py 2025-02-20 13:36:14.728545
{"aaa": 100, "bbb": 0, "ccc": 0.0, "ddd": 123456789.12345, "eee": "123", "fff": "0.0", "ggg": "2025-02-20 13:36:14.
728545"}
```
となりました
どうやらclsパラメーターもdefaultパラメーターと同じように、規定のserialize可能な型以外のみ呼び出されるようです

:::note info
規定のserializeは↓となっています
https://docs.python.org/ja/3.13/library/json.html#json.JSONEncoder
:::

## 終りに
この対応でかなりの時間を溶かしてしまいました
同じ思いをする人が一人でも少なくなりますように
電脳少女プログラミング2088 -壊レタ君を再構築- のカジノをPythonで解いてみた

どうもこんにちは！

paizaにて公開中の[電脳少女プログラミング2088 -壊レタ君を再構築-](https://ppg.paiza.jp/denno2088)にて、2問目です。
# 問題
次はカジノです。paizaランクはD相当、EASYとついてもいます。最初は4択でしたがここからコードを書いて解いていくことになりました。
>あなたはカジノにやってきました。カジノで使われるチップは 1 ドルのもの 5 ドルのもの 10 ドルのものがあるようです。
各チップの枚数が 1 ドル, 5 ドル, 10 ドルの順で改行区切りで与えられるので合計で何ドルかを出力してください。入力は標準入力にて以下のフォーマットで与えられます。
・1 行目に a 与えられます。
・2 行目に b 与えられます。
・3 行目に c 与えられます。
>```
>a # 1ドル
>b # 5ドル
>c # 10ドル
>```

https://ppg.paiza.jp/denno2088/challenges/denno2088_c_d_02


# 答えと解説
入力・計算・出力をそれぞれ1行ずつで実装しました。
```Python
chip = [int(input()) for _ in range(3)]
dollar = chip[0] + chip[1] * 5 + chip[2] * 10
print(dollar)
```
入力：input()で入力の1行を読み取り、さらにint()関数で入力を整数に変換。リスト内包を使って3行分を１まとめにしてリストで保存。
計算：入力で得た値から足し算。2つ目は5ドル、3つ目は10ドルの枚数であることに注意ですね。
出力：計算結果をprint()関数で出力。

# 結果
提出結果は以下。たこ焼き職人が玉クルクル回すみたいにスムーズ・・・？

https://ppg.paiza.jp/denno2088?dynamic_ogp_image_uid=02d7a0e1-8674-446b-8aa5-742a7810f948&from=res

# コードをコンパクトに
入力・計算・出力を1行にまとめることもできました。
```python
print(int(input()) + int(input()) * 5 + int(input()) * 10)
```
提出結果はこちら。カジノのディーラーがカードをシャッフルするみたいにスマートだそうです。コードを最適化(?)すると問題に沿った内容で返してくれるんでしょうか。

https://ppg.paiza.jp/denno2088?dynamic_ogp_image_uid=c815275e-1200-4bda-a7f4-0a72acc42249&from=res

ではでは。
SOQL：親から子への参照における5レベル下のクエリ方法

Salesforce Summer '24 から、SOQL で最大 5 レベル下の子レコードまでクエリできるようになりました。これにより、より深い階層の関連オブジェクトを 1 回のクエリで取得できます。

### **具体的な SOQL の例**
たとえば、`Account` を親オブジェクトとして、以下のような関連を持つデータ構造があるとします。

- **Account** (親)
  - **Contact** (子)  
    - **Case** (孫)  
      - **CaseComment** (ひ孫)  
        - **FeedItem** (5レベル目)

この 5 階層のデータを 1 回の SOQL で取得するには、以下のように記述できます。

```sql
SELECT Id, Name, 
    (SELECT Id, FirstName, LastName, 
        (SELECT Id, Subject, Status, 
            (SELECT Id, CommentBody, 
                (SELECT Id, Body FROM FeedItems) 
            FROM CaseComments) 
        FROM Cases) 
    FROM Contacts) 
FROM Account
```

### **クエリの解説**
1. `Account` の ID と Name を取得
2. `Contact` をサブクエリで取得（`Contacts` 関連リスト）
3. `Case` を 2 階層目のサブクエリで取得（`Cases` 関連リスト）
4. `CaseComment` を 3 階層目のサブクエリで取得（`CaseComments` 関連リスト）
5. `FeedItem` を 4 階層目のサブクエリで取得（`FeedItems` 関連リスト）

### **ポイント**
- これまでは 1 回のクエリで 1〜2 階層程度が一般的だったが、5 階層まで一度に取得できるようになった。
- 複数回のクエリ実行や Apex での後処理を減らし、パフォーマンスを向上させることができる。
- `FROM` 句のオブジェクトの子オブジェクトは `SELECT (サブクエリ) FROM [子オブジェクトのリレーション名]` の形式で記述する。

この機能により、データの取得がより柔軟になり、SOQL クエリの記述が簡潔になります。
【JS+PHP】ajaxでactionのデータを送ることで、関数の実行をコントロールする

最近フロント側とバックエンド側との連携を作る時に、使っていた方法をメモしておく。関数が多いが、一つのファイルにまとめたい場合、使おうかな。
まずフロント側で、送信用```form```を用意する(ログインを例とする)
```php
<?php
<form  id="id-name" method="POST">
//...
</form>
?>
```
```ajax```でデータを送受信する
```js
$(document).ready(function(){
    $("#id-name").submit(function(event){
        event.preventDefault(); // フォームの通常送信を防ぐ

        let id = $("#id").val();
        let password = $("#password").val();

        $.ajax({
            url: "/function.php",
            type: "POST",
            data: { id: id, password: password ,action: "login"},//ここでactionを追加で送る
            dataType: "json",
            success: function(response) {
                if (response.success) {
                    window.location.href = "pages.php"; //成功時リダイレクト
                } else {
                    $("#error").text(response.message); //エラー表示
                }
            },
            error: function(xhr, status, error) {
                console.log("AJAXエラー: ", xhr, status, error);
                $("#error").text("通信エラーが発生しました");
            }
        });
    });
});
```
送られてきた```action```は```login```であれば、ログインの関数を実行する
```php
<?php
function login(){
//...
}
if (isset($_POST['action'])) {
    $action = $_POST['action'];

    switch ($action) {
    //actionがloginであれば実行する
        case 'login':
            login();
            break;

        case 'others':
            others();
            break;
            
        default:
            echo json_encode(["success" => false, "message" => "無効なアクション"]);
            break;
    }
} else {
    echo json_encode(["success" => false, "message" => "アクションが指定されていません"]);
}
```
備忘録：凸包計算量の上限調査

# 概要
・凸包の限界計算量を調査
・32Gメモリでは20次元まで計算可能（計算可能なデータ量は次元が上がるほど減少）
・メモリ、CPUが異なれば結果が変わるのであしからず

# 背景
scipyでは凸包(convexhull)が計算できる。
以前(2022？)は3次元までしか計算できなかったが、いつの間にか任意の次元で計算できるようになっていた。
 
しかし、凸包の計算はメモリを馬鹿食いするのが通例。
そこで、計算上限を調べる事にした。

# 内容

環境
Windows11、8 vcpu 数、32 GiB メモリ：大体28Gぐらいはフリーで使える状態

乱数でDataを作成して、それをscipyで凸包を作成した。
①作成できたか？　②その時の時間　を検証した。

```python

# import 
# -----------------------
import numpy as np
import time
from scipy.spatial import ConvexHull

import logging
from datetime import datetime


# logファイル作成
# ----------------------
# 任意のログファイルの保存場所
log_filepath = "C:/Users/Desktop/log/logfile.log"  # ここを任意のパスに変更

# ログに記録
log_message = "start\n"
with open(log_filepath, "a") as log_file:
    log_file.write(log_message)


# 凸包の計算
# -----------------------
np.random.seed(42)  # 再現性のためにシードを設定


# データ次元とデータ数を設定
dimensions = [5]
data_sizes = [10000,100000,1000000,10000000,100000000,1000000000]

#dimensions = [10]
#data_sizes = [1100,1200,1300,1400]

#dimensions = [15]
#data_sizes = [60,70,80,90]

#dimensions = [20]
#data_sizes = [21,30,40,50]

#dimensions = [25]
#data_sizes = [26,30,40,50]


# 結果を保存するリスト
results = []

# 各組み合わせで凸包の計算時間を測定
for dim in dimensions:
    for size in data_sizes:
        
        # データ生成
        data = np.random.rand(size, dim)

        # 時間計測開始
        start_time = time.time()
        print(dim,size,datetime.now())

        hull = ConvexHull(data)

        end_time = time.time()
        print(dim,size,datetime.now())

        # 計算時間
        elapsed_time = end_time - start_time
        results.append((dim, size, elapsed_time))

        # ログに保存
        log_message = f"{datetime.now()} - Dim: {dim}, Rows: {size}, Convex hull computation time: {elapsed_time:.6f} seconds\n"
        with open(log_filepath, "a") as log_file:
            log_file.write(log_message)
```

# 結果
以下の図のようになった。計算が出来た上限値を記載している。
横軸はデータ次元(cols）、縦軸はデータ数（rows）である。数値は計算時間を示す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976724/3e9408ce-f498-4185-91f9-d697a3359ef5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976724/0eabab4b-673a-4da7-a44c-7767e0f6fec1.png)

25次元では、凸包形成に必要な最低点である26点でも凸包が形成できなかった。
※凸包形成には、最低でも次元＋１点が必要。例：2次元では、最低３点（三角形）

# まとめ
凸包計算量の上限を調査した。
ちなみに、2025年段階ではGPUで凸包を計算できるPythonライブラリはたぶん無い。
野良ライブラリもあるが、scipyが一番安定している気がする。
[備忘録] CDKとSAMでローカルにAPI構築

## まえおき

CDKで記述したLambdaとAPI Gatewayをローカルで動かしたときの手順をここに残します。

## 前提

以下のコマンドによって作成されたCDKのテンプレートを使用して、CDKを実装している。

```shell
cdk init app --language typescript
```

## テンプレート出力

以下のコマンドを実行して、テンプレート出力をする。

※template.yamlが既に存在する場合は削除してから実行

```shell
cdk synth > template.yaml
```

以下のコマンドを実行して、出力されたテンプレートを`cdk.out`ディレクトリに移動させる。

```shell
mv template.yaml cdk.out/template.yaml
```

## API起動

以下のコマンドを実行して、テンプレートを元にAPIを起動する。

```shell
sam local start-api -t cdk.out/template.yaml
```

## Tips

### API Gatewayのアクセス可能なURLを出力

CDK内で、`cdk.CfnOutput()`を記述をすることでコンソール上にアクセス可能なAPIのURLが出力される。

```typescript
import { NestedStack } from "aws-cdk-lib";
import type { Construct } from "constructs";
import * as cdk from "aws-cdk-lib";
import * as apigateway from "aws-cdk-lib/aws-apigateway";

export class ApiStack extends NestedStack {
    constructor(scope: Construct, id: string) {
        super(scope, id);

        // LambdaやAPI Gatewayの作成
        ...

        const api = new apigateway.RestApi(this, "Api", {
            // 設定など
            ...
        });
        
        new cdk.CfnOutput(this, "ApiEndpoint", {
            value: api.url,
        });
    }
}
```
[Sharepoint] リストの参照タイプの列を繰り返し処理する。

Sharepointのリストで親子関係のデータを１つのフォームに表示したい時、
参照関係の列を追加して、子リストをソースとして選択後、複数選択可能にしたらよい。
また、一緒に表示したい追加の列も選択可能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159211/15442625-8bd5-4e8d-83b8-597c67797310.png)

![{F9E0A809-375B-4AEF-9CF3-CD1DEE0171E4}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159211/ee14a8f5-f7a6-49cd-8ace-cc66e0aa24ff.png)


見た目は下記のようになる。

![{23BC5DA8-F9BE-451D-A22A-84C583AFDC4D}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159211/476f498a-1d88-4142-8346-c534a7b538be.png)

リンクをクリックすると、なんとクラシック表示のダイアログが表示されてしまう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159211/d5818e08-d6c4-4758-ab32-6537aadb29f6.png)

foreach構文を利用してアイテムクリック時別タブで開けるように変更する。
イメージ：
![{D9596099-9052-43A1-924C-3B2DD88CB060}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159211/6e1d3e5b-221d-474d-9a08-c8f5fecddf9c.png)

コード：
```JSON
{
  "$schema": "https://developer.microsoft.com/json-schemas/sp/v2/column-formatting.schema.json",
  "elmType": "div",
  "style": {
    "margin": "5px 0px"
  },
  "children": [
    {
      "elmType": "div",
      "style": {
        "display": "flex",
        "flex-direction": "column",
        "justify-content": "flex-start",
        "flex-wrap": "wrap"
      },
      "children": [
        {
          "elmType": "div",
          "forEach": "item in @currentField",
          "style": {
            "margin": "3px 0px",
            "display": "flex",
            "flex-direction": "row",
            "align-items": "center"
          },
          "children": [
            {
              "elmType": "div",
              "txtContent": "=loopIndex('item')+1 + '.'",
              "style": {
                "width": "18px"
              }
            },
            {
              "elmType": "a",
              "txtContent": "[$item.lookupValue]",
              "attributes": {
                "target": "_blank",
                "href": {
                  "operator": "+",
                  "operands": [
                    "https://<tenant>.sharepoint.com/sites/<sitename>/web/<subsitename>/Lists/<listname>/DispForm.aspx?ID=",
                    "[$item.lookupId]"
                  ]
                }
              }
            }
          ]
        }
      ]
    }
  ]
}

```
※参照関係で取得可能な値は「lookupId、lookupValue」の2種類のみ

本当は別のページに飛ばして見栄えのいい画面にしたかったが
ページ内のリストプロパティパーツにパラメータを渡す方法がないのが非常に残念。
【PHP】requireとrequire_once、includeとinclude_onceの違いまとめ

### require
ファイルを読み込む際に、ファイルが**見つからない**と、**Fatal error**が発生し、スクリプトは**実行停止**する。
ファイルが必須な場合に使う。
```php
require 'config.php';
echo "この行は表示される？"; 
//`config.php` がないと表示されない（Fatal errorで停止）
```

### require_once
requireとほぼ同じだが、一度読み込まれたファイルを再度読み込まないようにできる。
クラス、関数の重複を防げる。
```php
require_once 'config.php';
require_once 'config.php'; 
//2回目は無視される（エラーにならない）

```

### include
ファイルを読み込む際に、ファイルが見つからないと、**Warning**を出すが、スクリプトは**実行継続**する。
ファイルが必須ではない場合に使う。
```php
include 'config.php';
echo "この行は表示される！"; 
//`config.php` がなくてもこの行は実行される
```

### include_once
includeとほぼ同じだが、一度読み込まれたファイルを再度読み込まないようにできる。
一度だけ必要なファイルを読み込む。
```php
include_once 'config.php';
include_once 'config.php'; 
//2回目は無視される
```
MkDocsで出力されるHTMLをSharePointで表示したい。

# 概要

SW開発で、Markdownでドキュメントを記載し、MkDocsでHTML化して共有することがよくあると思います。 私は[Material for MkDocs](https://squidfunk.github.io/mkdocs-material/)を使っています。

リンクも入って見やすいドキュメントができるのですが、HTMLファイルを社内で共有するためにSharePointに置くと正しく表示できません。  

ローカルにダウンロードして見てもらうか、GitHub PagesなどでWebページ化すればいいのですが、SharePointのリンクでそのまま見ることができると誰もが見ることができて便利です。  

というわけで、[こちら](https://idea.tostring.jp/?p=1717)を参考にして、SharePointで表示する方法を試みました。そして、自動変換するためのPythonスクリプトを作ってみました。

## HTMLをSharePointで表示する方法

試したところ、私の例では下記の変更で対処できました。

- 拡張子を.htmlから.aspxに変更し、エンコードはUTF-8とする。

- 文字化け防止のためにmetaタグを追加する。

```html
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
```

- html内のハイパーリンク(XXXXX.html)をXXXXX.aspxに変更する。

## 自動変換用Python

mkdocsのビルドと、上記の手順を自動で行うPythonスクリプトを実装しました。

`mkdocs build` して、その後出力された`./site`を`./site_sharepoint`に変換します。

```python
import glob
import shutil
import os
from bs4 import BeautifulSoup
import subprocess

subprocess.run(["mkdocs", "build"])

shutil.rmtree("./site_sharepoint", ignore_errors=True)
shutil.copytree("site", "./site_sharepoint")

for filename in glob.glob("./site_sharepoint/**/*.html", recursive=True):
    with open(filename, "r", encoding="utf-8") as file:
        soup = BeautifulSoup(file, 'html.parser')
    # Add meta tag to avoid garbled text
    if soup.head:
        meta_tag = soup.new_tag('meta')
        meta_tag.attrs['http-equiv'] = 'Content-type'
        meta_tag.attrs['content'] = 'text/html; charset=utf-8'
        
        soup.head.append(meta_tag)
    # change .html link to .aspx
    for link in soup.find_all('a'):
        if link.has_attr('href'):
            if link['href'].endswith('.html'):
                link['href'] = link['href'].replace('.html', '.aspx')
    # Save as file
    with open(filename.replace(".html",".aspx"), 'w', encoding='utf-8') as file:
        file.write(str(soup.prettify()))

    os.remove(filename)
```

MkDocsの設定に依存するかもしれませんが、私の環境では、この状態でSharePointでHTMLファイルを見ることができました！

## mkdocs.ymlの設定

SharePointで開けるようにする前段階として、LocalでmkdocsのHTMLを開けるように、mkdocs.ymlで以下を設定して、各ページが`page名/index.html`の形式にならないようにしています。

```yml
use_directory_urls: false
```
🚀 コンテナ運用アプリの初期ビルド時間を劇的に短縮する方法

コンテナを20個以上立ち上げる大規模なアプリケーションでは、初期ビルドに非常に時間がかかることがあります。この記事では、初期ビルド時間を短縮するための具体的な手法と、その実装例を紹介します。

---

## 🔍 目次

- [はじめに](#はじめに)
- [1. Dockerfileの最適化とマルチステージビルド](#1-dockerfileの最適化とマルチステージビルド)
- [2. Dockerビルドキャッシュの有効活用](#2-dockerビルドキャッシュの有効活用)
- [3. 並列ビルドの活用](#3-並列ビルドの活用)
- [4. 共通ベースイメージの利用](#4-共通ベースイメージの利用)
- [5. イメージレジストリの活用](#5-イメージレジストリの活用)
- [まとめ](#まとめ)

---

## はじめに

コンテナ環境で複数のサービスを運用する際、各サービスのイメージをゼロからビルドすると非常に時間がかかります。  
そこで、以下の取り組みにより**初期ビルド時間を大幅に短縮**する方法を解説します。

---

## 1. Dockerfileの最適化とマルチステージビルド

### 📌 レイヤー構造の最適化

Dockerfileは各命令ごとにレイヤーが作成されます。  
**頻繁に変更されない部分**（依存関係のインストールなど）を先頭に配置することでキャッシュが有効になり、再ビルド時間を大幅に短縮できます。

#### 例：GoアプリケーションのDockerfile

```dockerfile
# ビルドステージ
FROM golang:1.18-alpine AS builder
WORKDIR /app

# 依存関係ファイルだけを先にコピーしてキャッシュを活用
COPY go.mod go.sum ./
RUN go mod download

# ソースコードをコピー
COPY . .

# バイナリのビルド（CGO無効化）
RUN CGO_ENABLED=0 go build -o main .

# 最終ステージ（不要なビルドツールを除外）
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/main .
CMD ["./main"]
```

### 💡 マルチステージビルドのメリット

- **不要なツールを除外**できるため、最終イメージのサイズが小さくなります。
- **キャッシュの有効活用**により、再ビルド時の処理時間が短縮されます。

---

## 2. Dockerビルドキャッシュの有効活用

### 📌 キャッシュレイヤー戦略

- **依存関係のインストール**（例: `go mod download`、`npm install`）は上部に配置し、頻繁に変更されるソースコード部分は下部に配置する。
- CI/CD環境では、**キャッシュの共有**が可能な設定を利用して、毎回のビルド時間を短縮する。

---

## 3. 並列ビルドの活用

### 📌 複数イメージの同時ビルド

- **docker-composeの並列ビルド**  
  コマンド例：  
  ```bash
  docker-compose build --parallel
  ```
- **CI/CDでの並列ジョブ実行**  
  GitHub Actions、GitLab CI、CircleCIなどの設定で、各サービスのビルドを並列に実行する。

これにより、全体のビルド時間が大幅に短縮されます。

---

## 4. 共通ベースイメージの利用

### 📌 重複作業の削減

複数サービスが同じ依存関係を持つ場合、**共通のベースイメージ**を作成し、そこから各サービスのイメージを派生させると効率的です。

#### ステップ

1. **共通ベースイメージの作成**

   ```dockerfile
   # Dockerfile.base
   FROM alpine:latest
   RUN apk add --no-cache curl ca-certificates
   # 共通ライブラリや環境設定を追加
   ```

2. **各サービスのDockerfileで利用**

   ```dockerfile
   # 各サービスのDockerfile
   FROM yourregistry/your-common-base:latest
   WORKDIR /app
   COPY . .
   RUN make build
   CMD ["./your-service"]
   ```

こうすることで、依存関係のビルドが一度だけ実施され、再利用されます。

---

## 5. イメージレジストリの活用

### 📌 ビルド済みイメージの再利用

一度ビルドしたイメージを Docker Hub やプライベートレジストリにプッシュすることで、  
**再ビルドの手間を省けます**。

#### 具体的な手順

1. **イメージをビルド**

   ```bash
   docker build -t yourregistry/your-app:latest .
   ```

2. **イメージをプッシュ**

   ```bash
   docker push yourregistry/your-app:latest
   ```

3. **デプロイ時はプルして利用**  
   Kubernetesなどでは、`imagePullPolicy` を `IfNotPresent` に設定すると、キャッシュされたイメージを利用できます。

---

## まとめ

初期ビルド時間の短縮は、下記の取り組みで実現できます：

- **Dockerfileの最適化とマルチステージビルド**  
  キャッシュを有効活用し、不要なツールを除去する。
  
- **Dockerビルドキャッシュの戦略的利用**  
  CI/CD環境でキャッシュを共有して、再ビルドを効率化する。
  
- **並列ビルド**  
  複数サービスを同時にビルドすることで、全体の時間を短縮する。
  
- **共通ベースイメージの利用**  
  重複する依存関係を一度だけビルドし、各サービスで再利用する。
  
- **イメージレジストリの活用**  
  一度ビルドしたイメージを保存して再利用することで、デプロイ時間を大幅に短縮する。

これらの手法を組み合わせることで、初期ビルドの時間を劇的に短縮し、効率的なコンテナ運用が可能になります。  
ぜひ、プロジェクトに合わせた最適な手法を選んでみてください！
AWS CloudFront と独自ドメインの設定について



## **🔹 はじめに**
AWSを使い始めると「CloudFront って何？」や「独自ドメインを設定する意味は？」という疑問を持つことがあると思います。

今回、CloudFront に独自ドメイン（例：cdn.example.com）を設定する方法について調査してみました！


## **🔹 CloudFront とは？**
AWS CloudFront は **CDN（コンテンツ配信ネットワーク）** の一種です。

### **CloudFront の主な機能**
| **機能** | **説明** |
|----------|---------|
| **HTTPS対応** | S3 や EC2 のコンテンツを HTTPS で提供できる |
| **CDN（キャッシュ）** | 世界中のエッジロケーションでキャッシュして高速配信できる |
| **オリジンの負荷軽減** | S3 や EC2 へのリクエストを減らせる |
| **カスタムドメイン対応** | `cdn.example.com` などの独自ドメインを設定可能 |
| **セキュリティ強化** | AWS WAF や OAI（S3の非公開化）と組み合わせてセキュアに運用可能 |

CloudFront を利用すると、
- Webサイトを **HTTPS化** できる
- 静的ファイルの配信が **速くなる**
- **S3 や EC2 への負荷を減らせる**
といったメリットがあります。

## **🔹 CloudFront に `cdn.example.com` を設定する意味は？**
CloudFront のデフォルトドメインは `d123.cloudfront.net` のような **ランダムな文字列** です。

そこで **独自ドメイン（例：cdn.example.com）を設定することで、より使いやすくなります！** 🚀

### **独自ドメイン（cdn.example.com）を設定するメリット**
| **メリット** | **説明** |
|----------|------|
| **URLが分かりやすい** | `cdn.example.com` の方が `d123.cloudfront.net` よりシンプル |
| **ブランドの統一** | `example.com` 配下のドメインを使えるので統一感がある |
| **SEOやマーケティング** | 独自ドメインの方が検索エンジン対策にも有利（特にHTTPS対応時） |
| **Cookieの制御** | `cdn.example.com` なら `example.com` のサブドメインとして動作し、Cookie管理がしやすい |


## **🔹 CloudFront に `cdn.example.com` を設定する方法**

### **✅ 1. S3 に静的ウェブサイトを配置**
1. S3 バケット（例：`example-bucket`）を作成
2. `index.html` などの静的ファイルをアップロード
3. バケットの **パブリックアクセスをブロック** し、CloudFront 経由で配信する

### **✅ 2. CloudFront ディストリビューションを作成**
1. CloudFront のオリジンに `example-bucket.s3.amazonaws.com` を設定
2. 「Alternate Domain Name (CNAME)」 に `cdn.example.com` を追加
3. AWS Certificate Manager (ACM) で `cdn.example.com` の **SSL証明書を発行**

### **✅ 3. Route 53 に Alias レコードを設定**
```
cdn.example.com.  300  IN  A  ALIAS  d123.cloudfront.net.
```
これで `https://cdn.example.com` で CloudFront 経由の HTTPS アクセスができる！

## **🔹 調査して分かったこと**
- **設定自体は比較的簡単だったが、ACMの証明書発行に少し時間がかかった**
- **キャッシュの管理をしっかりしないと、更新したファイルが反映されにくい**
- **Route 53 の設定は Alias レコードを使えばスムーズにできた**


## **🔹 疑問点（初心者がつまずきやすいポイント）**

### ❓ CloudFront は「HTTPS化」だけのために使うの？
➡ いいえ！CloudFront は **「HTTPS対応」＋「CDNによる高速化」** の両方を目的として使う。

### ❓ S3 には HTTPS があるのに、なぜ CloudFront を使うの？
➡ **S3 の静的ウェブサイトホスティングは HTTPS に対応していない！** CloudFront を経由させることで HTTPS を実現できる。

### ❓ CloudFront の代わりに ALB（Application Load Balancer）を使って HTTPS 化できる？
➡ **可能だが、ALB はCDNのようにキャッシュできないので、CloudFront の方が高速＆セキュア！**

## **🔹 参考文献**
- [AWS CloudFront 公式ドキュメント](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/)
- [AWS Route 53 公式ドキュメント](https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/)
- [AWS Certificate Manager (ACM) 公式ドキュメント](https://docs.aws.amazon.com/ja_jp/acm/latest/userguide/)
volumes で node_modules が消える問題を解決！

# 🚀 Docker の `volumes` で `node_modules` が消える問題を解決！【開発者向け】

## **🎯 はじめに**

Docker を使って React や Node.js のプロジェクトを動かしていると、

```yaml
volumes:
  - ../frontend/admin:/app
  - /app/node_modules
```

のような `volumes` 設定をしたときに、

✅ **コンテナは起動するのに `node_modules` が空！**  
✅ `npm install` しても何も入らない！  

こんな **ハマりがち** な問題にぶつかったので、
その原因と **確実に `node_modules` をインストールする方法** をまとめました！🚀

---

## **🔍 `node_modules` が消える原因**

この問題は **`volumes` のマウントの仕組み** によるもの。

以下の `volumes` 設定を見てみましょう。

```yaml
volumes:
  - ../frontend/admin:/app
  - /app/node_modules
```

**この場合、`/app/node_modules` に `空のボリューム` がマウントされる** ため、
`npm install` しても **何もインストールされない**。

Docker の `volumes` は、指定されたパスに何もない場合、
**空のディレクトリを作成してコンテナのディレクトリを上書き** してしまう。

🚨 **つまり…**
- `node_modules` をインストールしても、**`/app/node_modules` が `volumes` によって上書きされて空になる！**

---

## **✅ 正しい `volumes` の設定方法**

`node_modules` を **コンテナ内で管理** したい場合、

### **方法① `node_modules` の `volumes` を削除する**

```yaml
volumes:
  - ../frontend/admin:/app  # `node_modules` のマウントをしない！
```

**この場合、コンテナの `/app/node_modules` はそのまま維持され、正常に `npm install` される。**

---

### **方法② `tmpfs` を使って `node_modules` をコンテナ内で保持**

開発環境で **ホットリロードを使いつつ、`node_modules` を維持したい** 場合は `tmpfs` を使うのがベスト。

```yaml
services:
  app:
    image: my-app
    volumes:
      - ../frontend/admin:/app  # ソースコードは同期
    tmpfs:
      - /app/node_modules  # `node_modules` はコンテナ内で管理
```

✅ **メリット:**
- `node_modules` を **ホストと同期しない** ので、依存関係が壊れない。
- ソースコードは **ホストと同期** するので、ホットリロードは有効。

---

## **🔄 `volumes` の確認方法**

もし「本当に `volumes` のせいで `node_modules` が空になってるの？」と思ったら、
Docker の `inspect` コマンドで確認できます。

```sh
docker inspect <コンテナID> | grep node_modules
```

また、コンテナに入って `node_modules` の状態を確認するのも有効。

```sh
docker exec -it <コンテナID> sh
ls -la /app/node_modules
```

**`node_modules` が空になっているなら、`volumes` のせい！**

---

## **🎯 まとめ**

✅ **`volumes` に `/app/node_modules` を指定すると `node_modules` が消える**
✅ **開発時は `volumes` から `node_modules` を除外 or `tmpfs` を使う**
✅ **`docker inspect` や `exec` で `node_modules` の状態を確認できる**

もし `node_modules` が消えてしまって困っているなら、
**`volumes` の設定を見直してみよう！** 🚀


---

## **📝 参考リンク**
- [Docker公式ドキュメント - volumes](https://docs.docker.com/storage/volumes/)
- [npm公式ドキュメント - install](https://docs.npmjs.com/cli/install)
10sec事にクリップボードにコピーするtextarea

10sec事にクリップボードにコピーするtextarea
Javascript。
手動のボ夕ンでもcopy出来る。

<h3>注意</h3>
これをブラウザで開いている間は、
他でcopyしても10sec事にこのtextareaの内容で上書きされるので注意


```autocopy.html
<html>
<HEAD>
	<title> AUTO COPY</title>
</HEAD>

<body>

<button id="bbb">手動コピー</button>&nbsp;<font color="#CCC">Rev.C58-20225i</font><br/>
<textarea id="myText" rows="24" cols="50"></textarea>

</body>
<SCRIPT language="JavaScript">

function copyText()
{
  var textArea = document.getElementById("myText");
  textArea.select();
  document.execCommand("copy");
  textArea.setSelectionRange(999, 999);
}

//--- void main(...)
document.getElementById("bbb").addEventListener("click", copyText);

 setInterval(() => 
	 {	console.log("Interval type3");  
		copyText();
	 }, 10000); //10sec

</SCRIPT>

</html>
```