OmniAICreator/Qiita-1.07M huggingface dataset:
boto v2 と boto3 で AssumeRole + リージョン固有 STS エンドポイントを使う方法

AWS の AssumeRole 機能は、権限分離やクロスアカウント操作など、セキュアな運用において非常に重要です。しかし、プライベートネットワーク環境（VPCエンドポイント使用時など）では、グローバルエンドポイントではなくリージョン固有のエンドポイントを使用する必要があります。

この記事では、boto v2 と boto3 それぞれで、リージョン固有の STS エンドポイントを使って AssumeRole を行う方法 を解説します。

⚠️ 注意点
boto v2 は公式に非推奨 されています。
ただし、既存システムやレガシーコードでまだ使われているケースも多い ため、ここでは両方の実装を比較してご紹介します。
📦 前提条件
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1348505/97473be8-52a3-48d0-94bb-7099e6079902.png)

#  🛠️ boto v2 での実装（非推奨だが現実的な対応）

✅ 使用するクラス
RegionInfo
STSConnection

🔧 コード例
from boto.sts import STSConnection
from boto.regioninfo import RegionInfo

# ---- Step 1: RegionInfo を定義 ----
region_name = 'ap-northeast-1'
endpoint = 'sts.ap-northeast-1.amazonaws.com'

region = RegionInfo(
    name=region_name,
    endpoint=endpoint,
    connection_cls=STSConnection
)

# ---- Step 2: STSConnection を生成 ----
sts = STSConnection(region=region)

# ---- Step 3: AssumeRole 実行 ----
assumed_role = sts.assume_role(
    role_arn='arn:aws:iam::123456789012:role/YourTargetRole',
    role_session_name='MySession'
)

# ---- Step 4: 取得した資格情報を使う ----
creds = assumed_role.credentials
print(f"AccessKeyId: {creds.access_key}")
print(f"SecretAccessKey: {creds.secret_key}")
print(f"SessionToken: {creds.session_token}")


# 🚀 boto3 での実装（推奨）
✅ 使用する機能
boto3.client('sts')
環境変数 AWS_STS_REGIONAL_ENDPOINTS=regional （オプション）
🔧 コード例
import boto3

# ---- Step 1: boto3 クライアント生成 ----
sts = boto3.client('sts', region_name='ap-northeast-1')

# ---- Step 2: AssumeRole 実行 ----
assumed_role = sts.assume_role(
    RoleArn='arn:aws:iam::123456789012:role/YourTargetRole',
    RoleSessionName='MySession'
)

# ---- Step 3: 取得した資格情報を使う ----
creds = assumed_role['Credentials']
print(f"AccessKeyId: {creds['AccessKeyId']}")
print(f"SecretAccessKey: {creds['SecretAccessKey']}")
print(f"SessionToken: {creds['SessionToken']}")


📝 まとめ

boto v2 のような非推奨環境でも、リージョン固有の STS エンドポイント経由で AssumeRole が可能であることを検証しました。
この記事が、古いシステムの改修や移行において、この情報が少しでもお役に立てば幸いです。

📢 （おまけ）
📁 boto v2 のソースコード場所確認方法

import boto
print(boto.\_\_file\_\_)
[小技]8ビット符号なしを加算器を使ってオーバーフローさせて遊ぶ。0,1→FF,0


いろいろ、注意
----

- arduinoでの予定は、未定

プログラム
----

オンラインコンパイラ　paiza


```c++

#include <stdio.h>
int main(void){
    // Your code here!
    
    unsigned char a = 0xff;
    
    a = a + 1;
    
    printf("%d\n",a);
    
}


```

```

0

```
生成AIアップデートまとめ（2025/6/9週）

[週刊生成AI with AWS – 2025/6/9 週](https://aws.amazon.com/jp/blogs/news/weekly-genai-20250609/)

## Amazon Q Developer IDE プラグインでMCPツールをサポート開始

### MSPとは
AI アシスタントが外部ツールやサービスとやり取りできるようにするオープンスタンダード

MCP を介したユーザー、Amazon Q Developer CLI、外部サービス間の通信フロー
![{1640DF04-788B-4990-965E-5C1E95204279}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858908/5d9709f7-bbb4-4bff-b0a0-5a389a6c4f07.png)
[引用](https://docs.aws.amazon.com/ja_jp/amazonq/latest/qdeveloper-ug/command-line-mcp.html)

利用可能なIDE
* Visual Studio Code
* JetBrains IDE plugins
* Amazon Q Developer CLI

## Amazon Q Developer で CLI における Java の選択的変換（プレビュー）を発表

レガシーJavaコードのモダナイゼーションや、特定の部分のみを対象とした変換作業を効率的に行うことができます。

利用例
* Java 8からJava 21への移行
* JUnitのバージョンアップグレード
* Log4jからLogbackへの移行

特定のコード変換タスクを選択的に実行可能
特定のファイルやディレクトリを対象にもできる

利用可能リージョン
* バージニア北部

## Amazon Q Developer Pro tier でBuilder IDのアップグレードが可能に

* 個人のBuilder IDからチーム向けのPro tierへのスムーズな移行を行うことができる
* アップグレードする際、既存のIDは維持可能
* Pro tierの高度なコード生成、コードトランスフォーメーション、セキュリティスキャンなどの機能を利用できるように

#### Amazon Q Developer と Builder ID の関係:
#### 無料利用枠:
Amazon Q Developer の無料利用枠を利用するには、AWS Builder ID でサインインする
#### Builder ID とは:
AWS Builder ID は、AWS アカウントを持っていなくても、Amazon Q Developer や AWS Skill Builder などのサービスにアクセスできる個人用アカウントです.﻿
### Pro版:
Amazon Q Developer の Pro 版は、AWS IAM Identity Center でサインインするか、Builder ID を Pro ティアにアップグレードすることで利用できます.

アップデートするには
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858908/7a3a794d-8393-4fd3-9da8-8b85fcefc76f.png)
[引用](https://dev.classmethod.jp/articles/q-developer-pro-tier-upgrades-builder-ids/)


## Amazon Lex で LLM-Assisted NLUによって会話精度が向上
* これまで：ルールベースのアプローチ
* 本アップデート：自然言語理解（NLU）機能 
* Assisted NLUは、標準のNLUで問題が発生した際に大規模言語モデル（LLM）を活用して精度を向上させることができる

より自然で柔軟な対話が可能になり、ユーザーの意図をより正確に理解できるようになりました。

Assisted NLUの有効化
![{95247379-8CC6-4B0C-835E-32B1BD627228}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858908/405dca0e-517c-40ad-9520-e9d73af19969.png)
[引用](https://dev.classmethod.jp/articles/amazon-lex-conversational-accuracy-llm-assisted-nlu/)

## Amazon Nova Sonic でスペイン語サポートを開始
スペイン語サポートリージョン
* 米国東部（バージニア北部）
* 米国西部（オレゴン）

## Amazon Bedrock Custom Model Import で Qwen モデルをサポート

### Qwenとは
* 高性能な多言語対応の大規模言語モデル
* 特に中国語や日本語などのアジア言語に強み
* モデルの種類
Qwen1.5-0.5B
Qwen1.5-1.8B
Qwen1.5-4B
Qwen1.5-7B
Qwen1.5-14B
Qwen1.5-32B
Qwen1.5-72BQwen1.5-110B

## PowerTools for Lambda に Bedrock Agents 機能ユーティリティを追加

#### AWS Lambda Powertoolsとは
Lambda Functionに対してサーバーレスのベストプラクティスを適用できるユーティリティ
AWS LabsからOSSとして提供
https://github.com/awslabs/aws-lambda-powertools-typescript/

対応している言語
* Python
* TypeScript (Node.js)
* .NET
* Java

#### アップデートメリット
* Lambda関数内でBedrock Agentsをより簡単に活用できる
* サーバーレスアーキテクチャでのAIエージェント開発が効率的にできる

AWS Samplesにもサンプルコードが公開されています。
https://github.com/aws-samples/sample-bedrock-agent-powertools-for-aws
ECS Fargate + Railsで500エラーのログがCloudWatchに出ない場合の対処

Next.js + Rails APIでSPA開発中の話。

ECS Fargate + Railsの本番環境で**500エラー**が出たが解決に時間がかかりました。

かなり苦労したので記事化。技術記事初投稿です。

# 1. 前提

- 本番環境の500エラーを解消したいがCloudWatchにRailsログが出ない
  - リバースプロキシのNginxでは500エラーとだけ出る
  - Railsログには情報なし
- 本番インフラ: Route53 → ALB → ECS Fargate (Nginx/Rails)
- Ruby 3.3.7　Rails API 7.2.2.1

500エラーという情報だけで力技で解決しようとしてました。。


# 2. 詳しい状況
Devise Token Authのメール内リンク押下によるアカウント認証時に500エラー。
認証も失敗するし、リダイレクト先で500と出る。
なお、開発環境では成功済み。

コード：
```
# puma.rb

stdout_redirect "#{app_root}/log/puma.stdout.log", "#{app_root}/log/puma.stderr.log", true
```
```
# production.rb

config.logger = ActiveSupport::Logger.new(STDOUT)
    .tap  { |logger| logger.formatter = ::Logger::Formatter.new }
    .then { |logger| ActiveSupport::TaggedLogging.new(logger) }

config.log_level = :debug
```

加えて、`RAILS_LOG_TO_STDOUT=true`をタスク定義の環境変数で渡していました。
これは`.env.production`への設定でもOK。

Devise Token AuthのOSSコードを追ったりして原因特定しようと思ったができず。

# 3. 解決法

結論、pumaのログ設定を下記に修正してCloudWatchでRailsログが出ました。

```
# puma.rb

if ENV.fetch("RAILS_ENV", "development") == "production"
  stdout_redirect(nil, nil, true)
else
  stdout_redirect "#{app_root}/log/puma.stdout.log", "#{app_root}/log/puma.stderr.log", true
end
```

`stdout_redirect`でログ出力先を指定。本番ではSTDOUTもSTDERRも`nil`に。
これでコンテナの**STDOUT/STDERR**を収集してCloudWatchに流れます。

修正後にRailsログを見ると**ActionController::Redirecting::UnsafeRedirectError**でした。500エラーの具体的内容さえわかれば対処は難しくない。10分で解決しました。

# 最後に

- 500エラーは具体的内容が不明だと解決は非常に難しい（OSS依存の内容なら尚更）
- デプロイ後は本番用ログが正常に出るかを早めに確認すべき

以上を思いました。

同じような問題にぶつかった方の参考になれば幸いです。
lcovで「mismatched end line」エラーが出る（Ubuntu 24.04 + GCC 13 + GoogleTest）

# 【解決】

## 🔍 問題概要

Ubuntu 24.04 で GoogleTest + lcov を使って C/C++ のカバレッジを取得しようとしたところ、以下のエラーが発生：

```
geninfo: ERROR: mismatched end line for ...
(use "geninfo --ignore-errors mismatch ..." to bypass this error)
```

これは `lcov` と `gcov` の間でソースコードの行情報が一致しない場合に出るエラーです。

---

## ✅ 環境

- OS: Ubuntu 24.04
- GCC / gcov: 13.3.0
- LCOV: 2.0-1
- GoogleTest: v1.17.0

---

## ✅ 解決策

### 1. LCOV をアンインストール

```bash
sudo apt remove lcov
```

### 2. LCOV 1.14 をインストール

```bash
wget http://archive.ubuntu.com/ubuntu/pool/universe/l/lcov/lcov_1.14-2_all.deb
sudo dpkg -i lcov_1.14-2_all.deb
```

### 3. バージョン確認

```bash
lcov --version
# -> LCOV version 1.14
```
---

## 🔗 参考

- [LCOV Issue #296](https://github.com/linux-test-project/lcov/issues/296)

---

以上、同じエラーで詰まっている方の助けになれば幸いです！
HTMLを作ろう #2 し・た・が・き 『名無しn講座』

# HTMLを作ろう #2 し・た・が・き 『名無しn講座』

## はじめに

前回はHTMLを使って、Webページの“骨組み”を作る方法を学びました。  
今回はそこに色と形を加えていく「CSS（スタイルシート）」の魔法を学んでいきましょう！

---

### 🎭 登場人物

- **自分**：Web初心者。ワクワクしながら学び中。
- **ソースケ**：陽気でフレンドリーなコードガイド。
- **スタイル先生**：ビジュアルを司るCSSのマスター。冷静かつおしゃれ。

---

## 🎨 Scene1：CSSってなに？

**自分**：  
「この前作ったページ、なんか白くて味気ないなあ〜。」

**ソースケ**：  
「そりゃそうさ！HTMLだけじゃ“骨組み”だからな！デザイン担当の**CSS**が必要なんだ！」

**自分**：  
「CSSって、どんなことができるの？」

**スタイル先生**：  
「色をつけたり、文字の大きさを変えたり、レイアウトを整えたり…CSSは**見た目全般のコーディネーター**です。」

**ソースケ**：  
「よーし、それじゃスタイルの魔法、体験してみようぜ！」

---

## 🧪 Scene2：CSSの基本の書き方

**ソースケ**：  
「まずはこのHTMLにスタイルを当ててみようぜ！」

```html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>カラフルなページ</title>
    <style>
      body {
        background-color: #f0f8ff;
        font-family: 'Arial', sans-serif;
      }

      h1 {
        color: #333366;
        text-align: center;
      }

      p {
        color: #555;
        font-size: 1.2em;
      }
    </style>
  </head>
  <body>
    <h1>CSSで飾ろう！</h1>
    <p>これはスタイルが加わったWebページです。</p>
  </body>
</html>
```
**スタイル先生**：  
「HTMLの`<head>`内にある`<style>`タグでCSSを記述しています。  
`body`, `h1`, `p`はセレクタと呼ばれ、どのHTML要素にスタイルを適用するかを示すものです。」

**自分**：  
「おお〜背景に色がついて、文字の色も変わってる！」

---

### 🧰 Scene3：よく使うプロパティたち

| プロパティ            | 効果                            |
|------------------------|---------------------------------|
| `color`                | 文字色を設定                    |
| `background-color`     | 背景色を設定                    |
| `font-size`            | 文字サイズの指定                |
| `text-align`           | テキストの位置（左・中央など）  |
| `margin` / `padding`   | 余白や内側のスペース指定        |
| `border`               | 枠線をつける                     |

**ソースケ**：  
「プロパティはまるで絵の具とハケさ！組み合わせ次第で、印象が全然変わるぜ！」

**自分**：  
「うわぁ〜なんかおしゃれにしたくなってきた！」

---

### ✨ Scene4：CSSの書き方はいろいろある！

**スタイル先生**：  
「CSSには主に3つの書き方があります。」

| 種類           | 特徴                                                  |
|----------------|-------------------------------------------------------|
| インライン      | HTMLタグ内に直接書く（例：`style="color:red;"`）        |
| 内部スタイル     | `<style>` タグ内にまとめて書く（今回の形式）             |
| 外部スタイル     | `.css`ファイルに記述し、HTMLと分ける                    |

**ソースケ**：  
「本格的なサイトを作るなら外部CSSが主流だぜ〜！」

**自分**：  
「ファイルを分けることで、見やすく、再利用しやすくなるんだね！」

---

### 📚 Scene5：まとめと次回予告！

**スタイル先生**：  
「今日はCSSの基本と、その使い方について学びましたね。HTMLにデザインの力を加えるのがCSSの役割です。」

**ソースケ**：  
「次回はJavaScriptでページに動きを加えていくぜ！ボタンを押すと動いたり、アニメーションしたり…まるで命が吹き込まれたみたいになるぞ！」

**自分**：  
「うわ〜ワクワクしてきた！はやく動かしてみたい！ありがとう、スタイル先生、ソースケ！」

---

### 📝 おわりに

今回は「CSSの基本的な役割」「スタイルの指定方法」「よく使うプロパティ」など、デザインの土台を紹介しました。  
次回は「JavaScript編」で、ページに**動きとインタラクション**を加えていきます！

---

\* この講座は「名無しn講座」シリーズとして続編も展開予定！  
お気に召したらコメントいただけると励みになります！
[会話風]HTMLを作ろう#1 き・ほ・ん 名無しn講座 

こんにちは！名無しのnです
# HTMLを作ろう #1 き・ほ・ん 『名無しn講座』

## はじめに

Webページを作りたいけど、何から始めればいいのか分からない…そんなあなたに、HTML、CSS、JavaScriptの基本を会話形式で楽しく学べる講座をお届けします。  
登場キャラたちと一緒に、Webの世界に一歩踏み出してみましょう！

---

### 🎭 登場人物

- **自分**：Web初心者。いろいろ知りたい好奇心旺盛タイプ。
- **ソースケ**：ソースコード愛にあふれる陽気なガイド役。
- **スタイル先生**：CSSとセマンティック構造の重要性を説く冷静な解説者。

---

## 💻 Scene1：HTMLってなに？

**自分**：  
「そろそろWebページってのを作ってみたいな。でも、何から始めればいいのか分かんないや…。」

**ソースケ**：  
「やあやあ！その悩みにズバッと応えるのがオレ、**ソースケ**さ！まずは『HTML』から始めようじゃないか！」

**自分**：  
「HTML？ よく聞くけど、どんな役割があるの？」

**スタイル先生**：  
「HTMLは**Webページの骨組み**を作るためのマークアップ言語です。文章の構造や意味を定義するために使われます。」

**ソースケ**：  
「そう！HTMLで見出し、段落、画像、リンク……そういった“パーツ”を組み立てていくんだ！」

---

## 🧱 Scene2：基本のHTML構造

**自分**：  
「なるほど、実際のコードも見てみたいな！」

**ソースケ**：  
「よっしゃ！コレがHTMLの“基本型”だ！」

``` main.htm
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>はじめてのページ</title>
  </head>
  <body>
    <h1>こんにちは！</h1>
    <p>これは初めてのWebページです。</p>
  </body>
</html>
```

**スタイル先生**：  
「`<!DOCTYPE html>`は、HTML5であることを宣言する部分。  
`<meta charset="UTF-8">`は文字コードの指定ね。日本語が文字化けしないように大事な一行です。」

**自分**：  
「ふむふむ、ページのタイトルは`<title>`で決まるんだね！」

**ソースケ**：  
「そのとおり！ブラウザのタブの名前になるんだぜ！」

---

### ✨ Scene3：タグの世界を冒険しよう

**スタイル先生**：  
「HTMLには他にも多くのタグがあります。例を挙げてみましょう。」

| タグ               | 役割                          |
|--------------------|-------------------------------|
| `<h1>`～`<h6>`     | 見出し。数字が大きいほど重要。 |
| `<p>`              | 段落                          |
| `<a>`              | リンク                        |
| `<img>`            | 画像を表示                    |
| `<ul>` / `<ol>`    | 箇条書きリスト                |

**ソースケ**：  
「タグってまるで魔法の呪文みたいだよな！“これが見出し〜”とか“ここに画像〜”って指示してるみたい！」

**自分**：  
「うん、だんだん楽しくなってきたかも！」

---

### 📚 Scene4：まとめと次回予告！

**スタイル先生**：  
「今日覚えたことは、HTMLがWebページの基礎構造を作るものであること。そして、いくつかの基本的なタグの使い方ですね。」

**ソースケ**：  
「次回はCSSでこのページをド派手にデザインしていくぜ！色をつけたり、文字を飾ったり…楽しみにしてろよ！」

**自分**：  
「やった〜！なんかサイト作れそうな気がしてきた！ありがとう、ソースケ！先生もありがとう！」

---

### 📝 おわりに

今回は「HTMLとは何か？」「HTMLの基本構造」「よく使うタグたち」について紹介しました！  
次回はCSSの世界に突入して、見た目の魔法をかけていきましょう！

---

\* この講座は「名無しn講座」シリーズとして続編も展開予定！  
応援、コメントL大歓迎です！
##### 情報
https://qiita.com/tags/%e7%84%a1%e3%81%97%e3%81%aen%e8%ac%9b%e5%ba%a7
をみてぇぇ
LLMがウェブで操作できるようにDOMを自然言語に変換するウェブエージェントフレームワーク

こんにちは、開発者の皆様。私はNotte（ノッテ）というブラウザフレームワークを開発しました。これはウェブサイトのDOMを自然言語に変換し、LLMがウェブ上で行動できるようにするものです。AIエージェントの能力を大幅に向上させる技術です。

Notteの核となる革新は「認識レイヤー」です。このレイヤーがウェブサイトを自然言語で記述された構造化マップに変換します。これによりAIエージェントは生のHTMLではなく、ウェブサイトの意図を理解できるようになります。小規模なモデルでも信頼性の高い動作が可能になります。

私たちのベンチマーク結果は非常に有望です：

タスク完了の平均時間：47秒（他の手法より2.4倍速い）
複数回の試行で96.6%のタスク信頼性

Notteには以下の機能が含まれています：

統合セッション管理
ステルス機能
認証情報の安全な保管
シンプルなAPIによるCAPTCHA処理

LLMおよびウェブ自動化に興味のある開発者の方々にとって役立つと思います。フィードバックをいただければ幸いです！

GitHub: https://github.com/nottelabs/notte
文全体の意味ベクトルと邦ロック



### ✅ プロンプト

```
次の日本語文について、意味構造を線形代数的に解析してください：

1. 文中の各単語を、Word2Vecまたは類似の意味ベクトル（埋め込みベクトル）に変換してください。
2. 文全体の意味ベクトル（ターゲットベクトル）を、単語ベクトルの線形結合で再構成してください。
3. 再構成には最小二乗法（minimize ||Ax - y||²）を用いて、各単語の寄与係数 x を求めてください。
4. 得られた係数に基づき、どの単語が文の意味に最も影響しているかを説明してください。
5. 最後に、係数の大小に基づいて、文を要約・再構成・英訳してください。

対象文：
「きっと世界の終わりもこんな風に
味気ない感じなんだろうな
あのバンドの新譜と牛乳を買いに
部屋をでたけれど」

---

Please perform a linear algebraic semantic analysis of the following Japanese sentence:

1. Convert each word in the sentence into a semantic embedding vector (e.g., Word2Vec).
2. Assume a target vector representing the meaning of the whole sentence.
3. Reconstruct the target meaning vector as a linear combination of word vectors using least squares: minimize ||Ax - y||².
4. Explain which words contribute most to the sentence’s meaning based on the weights (coefficients) x.
5. Based on the coefficients, summarize, rephrase, or translate the sentence into English.
```
finalとイミュータブルの違い

※並列で比較するのはちょっと変ですが、似て非なる概念として…

# final
意味：参照先が変えられない。
※修飾子なので、変数やメソッドの定義の際に使用する。

## 日常生活に例えると

### 前提となるシチュエーション
お母さん「今から渡すメモに書いてあるものを買ってきて！」
あなた「ok」

※メモの内容
`りんご、バナナ、みかん`

#### :o:これはできる

お母さん「ごめん買うもの間違えてたわ、修正するね」
あなた「ok」

※メモの内容
`りんご、味噌、インスタントラーメン`

#### :x:これはできない

お母さん「ごめん、そのメモ裏紙にしたらだめなやつだったわ。こっちのメモにして」
あなた「いやもう家出ちゃったからメモ変えられないって」

※メモの内容（お母さんが変えたがっている新たなメモ）
`りんご、バナナ、みかん`

つまり、**メモの内容を書き換えることはできるが、「あなたが買い物に行くときに見るメモ自体」を変えることはできない** ということです。


## コードで見てみる

``` java
final List<String> toBuyMemo = new ArrayList<>();//最初に渡されたメモ

//最初に書かれていた内容
toBuyMemo.add("りんご");
toBuyMemo.add("バナナ");
toBuyMemo.add("みかん");

System.out.println(toBuyMemo);//出力結果：[りんご,バナナ,みかん]

//メモの内容を修正
toBuyMemo.set(1,"味噌");
toBuyMemo.set(2,"インスタントラーメン");

System.out.println(toBuyMemo);//出力結果：[りんご,味噌,インスタントラーメン]

//メモ自体を変えようとするとコンパイルエラー
toBuyMemo = new ArrayList<>();//新しいメモ
```

値（メモの内容）を書き換えても、参照先（あなたが買い物に行くときに見るメモ自体）を変えているわけではないので、コンパイルエラーにはなりません。
逆に値（メモの内容）は変わらなかったとしても、参照先（あなたが買い物に行くときに見るメモ自体）を変えようとした場合、コンパイルエラーになります。

# イミュータブル
意味：値が変えられない
※性質を表すものなので設定するものではない。String型のオブジェクトなどがこれにあたる。

## 日常生活に例えると
### 前提となるシチュエーション
お母さん「今から渡すメモに書いてあるものを買ってきて！」
あなた「ok」

※メモの内容
`りんご、バナナ、みかん`

#### :o:これはできる

お母さん「ごめんそのメモ盛大にミスってるわ。こっちのメモ見て」
あなた「ok」
お母さん「間違っている方のメモは預かるわ」

※新しく渡されたメモの内容
`醤油、塩、砂糖`
（厳密には内容はそのままでも良い）

**※メモを変えただけなので、元のメモも残っている**

#### :x:これはできない

お母さん「ごめんそのメモ盛大にミスってるわ。そのメモの内容修正するね」
あなた「えこれ油性だから無理だよ。修正するなら新しいメモにしなきゃ」

つまり、**「見るメモを変えることはできるが、メモの内容は変えられない」** ということです。


## コードで見てみる

``` java
String toBuyMemo = "りんご、バナナ、みかん";//1枚目のメモ
toBuyMemo = "醤油、塩、砂糖";//2枚目のメモ
System.out.println(toBuyMemo)//出力結果：醤油、塩、砂糖
//元のメモ "りんご、バナナ、みかん" は変更されず、メモリ上に残る
//toBuyMemoは新しいメモ "醤油、塩、砂糖" を参照するようになっただけ
```
※Stringを用いたのは説明を簡潔にするためです
※ガベージコレクションは考慮しません。

Aの内容がBに書き換えられたわけではなく、Aはメモリ上にそのまま残し、toBuyMemoが参照する先をBに変えたイメージです。


# まとめると
+ final：変数の参照先を変更できなくする。ただし、その参照先の値を変えるのは自由。
+ イミュータブル：値は変更できない。ただし、変数の参照先自体の変更は自由。
WindowsのOpenSSHサーバーに鍵認証でsshログインする

# はじめに
Windows11 ProにSSHでアクセスするため、OpenSSHサーバーを入れました。

https://qiita.com/cohpen/items/ae69900d24b6f5231bd6

パスワード認証によるアクセスはできるようになったのですが、パスワード打たなくてすむように鍵認証を設定することにしました。少し悩んだ点があったので記録しておこうと思います。

# 鍵の生成と格納
ローカルPCで鍵の生成をします。Ed25519が最近のお勧め？
```
> ssh-keygen -t ed25519
```
C:\Users\\<ユーザID>\\.sshフォルダに
秘密鍵 id_ed25519
公開鍵 id_ed25519.pub
が作られるので、公開鍵をSSHサーバー側の
C:\Users\\<ユーザID>\\.sshフォルダ
にコピーし、authorized_keyというファイルにリネーム。（すでにauthorized_keyファイルがある場合はid_ed25519.pubの中身を追記）

authorized_keyおよびフォルダのパーミッションが影響するような記事もありますが、自分はこのパーミッション修正は必要なかったです。
# sshd_configの修正
デフォルトでは鍵認証がオフになっていましたので、設定ファイルを修正します。SSHサーバー側の
C:\ProgramData\\ssh\\sshd_config
ファイルを修正します。
C:\ProgramData\\フォルダは隠しフォルダなのでオプションで表示させるなどしてください。
sshd_configファイルを編集するには、管理者権限でメモ帳で開くとか、一時的にアクセス権を追加する必要があります。
```
#PubkeyAuthentication yes
```
の行頭の#を削除し、下記のファイル末尾の2行を行頭に#を挿入してコメントアウトします。
```
Match Group administrators
       AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
```

# 古い鍵ファイルの削除
C:\ProgramData\\ssh\\フォルダにある、
　なんたら_key
というファイル3つを削除します。
削除する前に、OpenSSHサーバーを停止しておきましょう。
（Windowsの「サービス」アプリ"OpenSSH SSH Server"を探して停止します：なんか名前が冗長ですね？？）
削除したファイルはOpenSSHサーバーを再起動すると新規作成されます。（まだ再起動しないで）
# パーミッションの修正
WindowsのOpenSSHは関連するファイルのパーミッションにセンシティブとのことです。
パーミッションを修正するマクロが用意されているので、それを利用すると簡単です。
C:\Program Files\\OpenSSH\\フォルダをターミナル（PowerShell）で開いて、
```
> FixHostFilePermissions.ps1
```
というスクリプトを実行すると、修正が必要な箇所を直すか聞いてきますので、「y」を入れて修正してもらいます。
PowerShellでスクリプト実行ができない場合は、Set-ExecutionPolicyでスクリプト実行を許可してください。
# OpenSSH SSH Serverの再起動
「サービス」アプリでOpenSSHサーバーを再起動します。
# リモートPCでの対応
ローカルPCとサーバーでユーザIDが同じならば、リモートPCから
```
> ssh -i 秘密鍵ファイル サーバー名
```
でログインできるはずなのですが、過去にそのサーバーにsshアクセスしていた場合はエラーで入れないことがあります。その場合は
C:\Users\\<ユーザID>\\.ssh\\known_hosts
ファイルをメモ帳などで開いて、アクセス先のサーバーの名前で始まる行を削除してください。（サーバーの古い公開鍵が残ってエラーになる）
設計のための線形代数学



1. ベクトル
2. スカラー
3. 行列
4. 転置行列
5. 単位行列
6. 零行列
7. 正方行列
8. 対角行列
9. 対称行列
10. 直交行列
11. 可逆行列（逆行列）
12. 行列式（determinant）
13. 行基本変形
14. 行階数
15. 列階数
16. ランク（rank）
17. 拡大係数行列
18. ガウスの消去法
19. ガウス・ジョルダン法
20. 連立一次方程式
21. 解の存在条件
22. 一意解
23. 無限解
24. 解なし（矛盾系）
25. 一次独立
26. 一次従属
27. 線形結合
28. 線形独立性
29. 線形部分空間
30. 基底
31. 次元
32. ベクトル空間
33. 部分空間
34. 射影（projection）
35. 射影行列
36. 線形写像
37. 線形変換
38. 像（image）
39. 核（null space）
40. 同型写像（isomorphism）
41. 固有値
42. 固有ベクトル
43. 固有方程式
44. 固有空間
45. 固有値分解（EVD）
46. 対角化
47. ジョルダン標準形
48. スペクトル定理
49. 特異値分解（SVD）
50. 特異値
51. ユークリッドノルム
52. L2ノルム
53. L1ノルム
54. 無限大ノルム
55. ノルムの定義
56. ベクトルの正規化
57. 内積（dot product）
58. 外積（cross product）
59. グラム・シュミットの直交化法
60. QR分解
61. LU分解
62. Cholesky分解
63. 行列の条件数
64. 擬似逆行列（ムーア–ペンローズ逆）
65. 最小二乗法
66. 過剰決定系
67. 欠損データ補完
68. 主成分分析（PCA）
69. 次元削減
70. 特徴ベクトル
71. カーネル法
72. 行列のトレース
73. 双対空間
74. 双対基底
75. ベクトルの直交性
76. 正定値行列
77. 半正定値行列
78. 負定値行列
79. 正則行列
80. ヘッセ行列（Hessian）
81. ヤコビ行列（Jacobian）
82. ハウスホルダー変換
83. ギブス現象（線形補間）
84. 線形予測
85. 線形フィルタ
86. FIRフィルタ
87. IIRフィルタ
88. 最適化問題
89. 制約付き最適化
90. カルマンフィルタ
91. 状態空間表現
92. オブザーバ
93. 可観測性
94. 可制御性
95. 線形動的システム
96. 差分方程式
97. 差分行列
98. 離散化
99. 線形計画法
100. 多変量線形回帰

---
運動方程式から連立方程式


---

## ✅ 運動方程式 $F = ma$ → 状態方程式 → オイラー法（連立一次方程式）

---

### ● Step 1: 運動方程式（2階）

$$
F = m \frac{d^2x}{dt^2}
$$

---

### ● Step 2: 状態変数の導入（1階化）

$$
\begin{cases}
x_1 = x \quad \text{(位置)} \\
x_2 = \frac{dx}{dt} = v \quad \text{(速度)}
\end{cases}
\Rightarrow
\begin{cases}
\frac{dx_1}{dt} = x_2 \\
\frac{dx_2}{dt} = \frac{1}{m}F
\end{cases}
$$

これが**連立1階微分方程式**です。

---

### ● Step 3: オイラー法による離散化（時間刻み幅 $\Delta t$）

$$
\begin{cases}
x_1(t+\Delta t) = x_1(t) + \Delta t \cdot x_2(t) \\
x_2(t+\Delta t) = x_2(t) + \Delta t \cdot \left(\frac{1}{m}F(t)\right)
\end{cases}
$$

これは**連立一次更新式**となります。

---

### ● Step 4: Python形式での連立方程式（実装例）

```python
# Program Name: euler_motion_solver.py
# Creation Date: 20250620
# Overview: Euler method for solving Newton's motion equation as coupled linear updates
# Usage: Simulate position and velocity over time

# --- Install required libraries ---
!pip install matplotlib numpy

# --- Import ---
import numpy as np
import matplotlib.pyplot as plt

# --- Parameters ---
m = 1.0              # 質量 / Mass [kg]
F = lambda t: 10.0   # 外力 / Force function [N]
dt = 0.01            # 時間刻み幅 / Time step [s]
T = 2.0              # 総時間 / Total time [s]
N = int(T / dt)      # ステップ数 / Number of steps

# --- 初期状態 / Initial conditions ---
x1 = 0.0  # 初期位置 / Initial position
x2 = 0.0  # 初期速度 / Initial velocity

x1_list = [x1]
x2_list = [x2]
t_list = [0]

# --- Euler法による更新 / Euler update ---
for i in range(N):
    t = (i + 1) * dt
    x1_new = x1 + dt * x2
    x2_new = x2 + dt * (F(t) / m)
    x1, x2 = x1_new, x2_new

    x1_list.append(x1)
    x2_list.append(x2)
    t_list.append(t)

# --- プロット / Plot ---
plt.plot(t_list, x1_list, label="Position x(t)")
plt.plot(t_list, x2_list, label="Velocity v(t)")
plt.xlabel("Time [s]")
plt.ylabel("Value")
plt.title("Euler method simulation of F = ma")
plt.legend()
plt.grid()
plt.show()
```

---

## ✅ 総括：形式的まとめ（離散連立方程式）

$$
\mathbf{x}_{k+1} = 
\begin{bmatrix}
x_{1,k+1} \\
x_{2,k+1}
\end{bmatrix}
=
\begin{bmatrix}
x_{1,k} + \Delta t \cdot x_{2,k} \\
x_{2,k} + \Delta t \cdot \frac{1}{m}F_k
\end{bmatrix}
$$

これは時刻 $k$ における状態から $k+1$ を得る\*\*線形な逐次更新式（離散連立方程式）\*\*です。

---
第五話：境界を守る神樹〜刑法



---



導入：

> 刑法は、近づきがたい法体系と見なされがちです。
しかしその本質は、**社会の共通規範を明確にする「境界線の法」**にあります。
本記事では、森と神樹というメタファーを用いながら、刑法の三層構造とその機能を再解釈します。



---

🔶シリーズ第4話「境界を守る神樹──刑法」

📝 本文構成（共通）


---

【1. 神樹としての刑法──境界を描く法】

刑法は、社会にとって「してはならない行為」を定め、これに反した場合に国家が制裁を加えることで秩序を守る法領域です。
森にたとえるなら、刑法は「侵してはならない境界を描く神樹」のような存在です。

その神樹は、広く枝を伸ばし、太い幹を持ち、深く根を張っている。
そこには、私たちが安心して生きるための「禁止」と「許容」のバランスが刻まれているのです。


---

【2. 三層構造で読み解く──神樹の枝・幹・根】

刑法による処罰は、以下の三段階の判断を経て成立します。
それはまるで神樹の構造そのもの──**「枝」「幹」「根」**のように重なり合っています。

枝（構成要件該当性）
　まず、ある行為がどの犯罪に当たるかを判断します。
　たとえば、物をこっそり持ち去る行為は「窃盗罪」という枝に分類されます。
　枝は、無数の行為を枝葉のように分類し、社会が許容しない行為を見極める分かれ道です。

幹（違法性）
　次に、その行為が社会的に非難されるべきものかを吟味します。
　同じ「殴る」行為でも、それが正当防衛であれば処罰されません。
　幹は、枝に実る行為に対して、「それでもなお処罰すべきか」と静かに問いかける太い軸。
　神樹の幹は、行為の理由を受け止め、正義の形を選び取っていきます。

根（責任能力）
　最後に、その行為者に責任を問えるのかを見極めます。
　たとえば、重い精神障害があって行為の意味を理解できなかった場合、責任を問えません。
　根は、目に見えない場所で、その人の心の深さや状況を静かに探っています。
　神樹が地に深く根を張るのは、軽々しく断罪しないためでもあるのです。



---

【3. 刑法の特質：恐ろしさと優しさ】

刑法はしばしば「怖い法律」として認識されます。
しかし実際には、人の命・身体・財産といった根本的な権利を守るための防壁であり、盾でもあるのです。

神樹の枝が乱暴に振り下ろされることはありません。
その枝葉は、幹と根に支えられながら、「本当に裁くべきか」を見極めているのです。

だからこそ刑法は、秩序を破る者だけでなく、秩序の中で怯える者の味方でもあるのです。


---

【4. 他の法との境界──神樹と森のつながり】

憲法との関係：刑法の運用には「罪刑法定主義」や「適正手続」が求められます。
　これは神樹にとっての「成長の掟」、憲法という森の大地から与えられた根源的なルールです。

民法との関係：他人の物を取れば、それは民法上の損害賠償と刑法上の窃盗の両方に関わります。
　神樹の枝と、他の樹木の枝が重なり合うような場面です。

行政法との関係：捜査や逮捕といった手続きは、行政権力と刑法が交差するところです。
　森に風が吹くとき、神樹の枝も揺れます。そこには慎重なバランスが必要です。



---

【5. まとめ──神樹は、私たちの隣に立っている】

刑法という神樹は、人を罰するためだけに立っているのではありません。
その境界線は、私たちが「安心して生きられる範囲」を描いているのです。

神樹は見えないけれど、確かにそこにあります。
幹の静けさは、理由を聞くためにあり、
枝の広がりは、無数の行為を受け止めるためにあり、
根の深さは、人の複雑さに寄り添うためにある──

その神樹のそばで、私たちは今日も生きています。


---



締め：

> 境界線は、排除のための線ではなく、共に生きるための合意点です。
法が描く「してはならない」の背後には、「守るべきもの」があります。

次回は行政法。表には見えにくい法領域が、どのように森の秩序を支えているかを見ていきます。




---
KotlinによるAndroid開発で学ぶDI入門

# Kotlin / Android開発で学ぶ Dependency Injection（DI）入門


最近Androidアプリ開発の勉強をしている中で、**Hilt**を学習しよう！と思ったときに**DI**の理解が足りなかったため学習に至りました。

---

## 目次

- DI（Dependency Injection）とは何か
- なぜDIが必要なのか
- コード例で理解するDI
- モック／スタブとテストの関係
- HiltなどDIフレームワークとの関係

---



## DI（依存性注入）とは？

> **Dependency Injection（依存性注入）** とは、「クラスが必要とする依存オブジェクトを、外部から渡してあげる」設計手法です。

例：`Car` クラスが `Engine` を必要とする場合、Car クラスが自分で Engine を生成するのではなく、**外部から Engine インスタンスを渡す**ようにします。

```kotlin

// Engineインターフェース（設計図）
interface Engine {
    fun start()
}

// MainEngineクラス（具体的な実装）
class MainEngine : Engine {
    override fun start() {
        println("Engine started")
    }
}

// Carクラス（Engineインターフェースに依存）
class Car(private val engine: Engine) {
    fun drive() {
        engine.start()
    }
}
```
イメージでいうと、エンジニアAさんとエンジニアBさんがいたとします。
・エンジニアAさん⇒Carクラスを作成
・エンジニアBさん⇒Engineクラスを作成
こうすることで、仮にエンジンインスタンスを変更したいときにはBさんのコードをいじるだけですむ。つまり**保守性が上がる**ということ。

## なぜDIが必要なのか
先ほども言ったように**コードの管理がしやすくなるから**です。
責任を分散する、依存関係を緩くすることでコードの修正が簡単になったり、明示的に引数として書くので読みやすくなったりします。


## コード例で理解するDI

では、実際にDIありとなしのコードを比較してみましょう。

```kotlin
//DIなし
// Engineの実装クラスを作る
class MainEngine : Engine {
    override fun start() {
        println("Engine started")
    }
}

class Car {
    private val engine = MainEngine()  // 実装クラスを直接インスタンス化

    fun drive() {
        engine.start()
    }
}

```



```kotlin
//DIあり(今回の話)
class Car(private val engine: Engine) {
    fun drive() {
        engine.start()
    }
}

// クラスの外で実装クラスのインスタンスを作成して渡す
val engine = MainEngine()  // ← 実装クラスのインスタンス
val car = Car(engine)      // ← 依存性を注入（DI）

```

## モック／スタブとテストの関係
次に**モック**と**スタブ**について簡単に説明します。

>スタブ：返り値を固定するための仮の実装
　　　　⇒プログラムの振る舞いさえ分かればいい
>モック：呼び出しの有無や回数を検証する目的の実装
　　　　⇒プログラム実行時の動きまで確認したい

```kotlin
//スタブテスト
class StubEngine : Engine {
    override fun start(): String {
        return "Stub engine started"
    }
}
val stubEngine = StubEngine()
val car = Car(stubEngine)//スタブテスト用エンジンインスタンスを車クラスに渡す
```
エンジンクラスとは別に、スタブテスト用エンジンクラスも作る。(DI設計)

```kotlin
//モックテスト
class MockEngine : Engine {
    var startCalled = false

    override fun start(): String {
        startCalled = true
        return "Mock engine started"
    }
}
val mockEngine = MockEngine()
val car = Car(mockEngine)
println(mockEngine.startCalled) // true なら、start() が呼ばれた証拠
```

モックはスタブと違い、中身のメソッドがちゃんと動くかを確認したい。今回はstart()インスタンスがきちんと動くか確認したい。


## HiltなどDIフレームワークとの関係

これまで書いたように、DIはとても重要な設計思想である。そのために楽に、**自動的にやってくれる**のがHiltなどのDIフレームワークである。
Hiltに関してまた、別の記事でまとめようと思います。

## 感想
DIはとても大事な設計思想であり、アーキテクチャ手法であることがよく分かりました。
ただ、理解度はまだ7〜8割程度で、どこかニュアンスを間違えている可能性もあります。
もし誤りがあれば、ご指摘いただけるとありがたいです。

今後は今回学んだ内容を基に、Hiltの学習により力を入れていきたいと思います。
WordPressの簡単環境構築 Local

# 一番シンプルにWordPressの開発環境を構築出来るのが「local WordPress development tool」

ダウンロード先↓
https://localwp.com/

Webサーバ環境とWordPressがセットのソフトなので設定が必要ない
※サイトにメールアドレスの登録だけ必要

ダウンロード後はログインして、ソフトの中でWordPressを新規作成するだけ

設定を変更すれば、日本語にも設定が可能でした。

[インストール手順参考](https://www.onamae.com/column/wordpress/27/)
PythonでPDFをExcel（XLS/ XLSX）に変換する

PDF は編集が難しい静的な文書形式ですが、Excel は柔軟なスプレッドシートツールです。PDF を Excel に変換することで、PDF 内の表形式のデータを簡単に修正、並べ替え、フィルター処理、計算できるほか、PDF テーブルの元の形式やスタイルを維持することができます。

本記事では、無料の Python PDF ライブラリを使用して **Python で PDF を Excel に変換する方法**について説明します：

:one: [Python で PDF を Excel（Xls/Xlsx）ファイルに変換する](#python-で-pdf-を-excelxlsxlsxファイルに変換する)
:two: [Python でカスタマイズオプションを使用して PDF を Excel に変換する](#python-でカスタマイズオプションを使用して-pdf-を-excel-に変換する)

## 無料のPythonライブラリのインストール  
PythonでPDFからExcelへの変換を実現するには、まず以下のpipコマンドを使用して、無料ライブラリ「[Free Spire.PDF for Python](https://www.e-iceblue.com/Introduce/free-pdf-for-python.html)」をプログラムにインストールする必要があります。
```
pip install Spire.Pdf.Free
```

> :bangbang: **注**： この無料ライブラリにはページ数の制限があり、軽量ファイルにより適しています。

## Python で PDF を Excel（Xls/Xlsx）ファイルに変換する
たった3行のコードでPDFをエクセルに変換する簡単な変換方法があります。以下はPythonのサンプルコードです。
```python
from spire.pdf.common import *
from spire.pdf import *

# PDF文書を読み込む
pdf = PdfDocument()
pdf.LoadFromFile("Table.pdf")

# PDFファイルをエクセルXLSX形式に保存する
pdf.SaveToFile("PdfToExcel.xlsx", FileFormat.XLSX)
pdf.Close()
```
結果：
![PDFtoExcel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/9f100d41-1b65-40d8-adce-2f7f399fb97a.png)


## Python でカスタマイズオプションを使用して PDF を Excel に変換する
変換プロセス中、Free Spire.PDF for PythonはPDFからExcelへの変換オプションを設定し、変換結果の精度をコントロールすることもできます。以下はPythonのサンプルコードです。
```python
from spire.pdf.common import *
from spire.pdf import *

# PDF文書を読み込む
pdf = PdfDocument()
pdf.LoadFromFile("Table.pdf")

# 変換オプションを指定するためにXlsxLineLayoutOptionsオブジェクトを作成する。
# パラメーター： convertToMultipleSheet, rotatedText, splitCell, wrapText, overlapText
convertOptions = XlsxLineLayoutOptions(True, True, False, True, False)
pdf.ConvertOptions.SetPdfToXlsxOptions(convertOptions)

# PDFファイルをエクセルXLSX形式に保存する
pdf.SaveToFile("PdfToExcelwithOptions.xlsx", FileFormat.XLSX)
pdf.Close()
```

:star: 上記のコードでは、変換オプションを指定するため **`XlsxLineLayoutOptions`** クラスを使用しており、そのクラス・コンストラクタは以下に説明するように5つのパラメータを受け取ることがわかります：
* **`convertToMultipleSheet(bool)`**： PDFの各ページを同じExcel内の別々のワークシートに変換するかどうかを示します。Falseに設定すると、PDFファイル内のすべてのページが1つのExcelワークシートに変換されます。
* **`rotatedText(bool)`**： 回転したテキストを表示するかどうかを指定します。
* **`splitCell(bool)`**： PDF 表セル内のテキストを (2 行以上に渡って) 複数の Excel セルに分割するかどうかを示します。
* **`wrapText(bool)`**： Excel セル内のテキストを折り返すかどうかを指定します。
* **`overlapText(bool)`**： 重複テキストを表示するかどうかを示します。

Spire.PDF for Pythonライブラリを使用すると、特定のニーズに合わせてPDFからExcelへの変換をカスタマイズすることができます。

* * *
**さらに詳しく読む：**
- [PythonでPDFからテーブルを抽出する](https://www.e-iceblue.com/Tutorials/Python/Spire.PDF-for-Python/Program-Guide/Table/Python-Extract-Tables-from-PDF.html)  
- [PythonでPDFをCSVに変換する](https://www.e-iceblue.com/Tutorials/Python/Spire.PDF-for-Python/Program-Guide/Conversion/pdf-to-csv-python.html)  
- [PythonでExcelをTXTに変換する]()
【Python】zip()関数、zip_longest()関数

長さが異なるイテラブルオブジェクトから値を一つずつ取得する際、長さが短いほうに合わせる場合はzip()関数を使い、長いほうに合わせる場合はzip_longest()関数を使います。

zip_longest()関数にfillvalueの引数を付けると、オブジェクトが無い場合の値を設定できます。fillvalueの引数を付けない場合はNoneがセットされます。

zip()関数もzip_longest()関数も、イテラブルオブジェクトが辞書の場合、値ではなくキーを取得します。また、リストではなくタプルのイテレーターが返ります。

なお、zip()関数は組み込み関数のためitertoolsモジュールをインポートする必要はありませんが、zip_longest()関数を使用する場合はインポートする必要があります。
小屋裏換気をしたいメモ

20年運用してる神ブログ
https://matrasan.sakura.ne.jp/diy/koyaura.html

三菱中間取付形ダクトファン
	V-23ZM5
    
仕様
https://www.mitsubishielectric.co.jp/ldg/wink/ssl/displayProduct.do?pid=142190&ccd=1040121712

約３万円
https://www.monotaro.com/g/01324416/?srsltid=AfmBOoog0aogzEYA74RKRWurP7UPqEmhIoIjeFiLYKs0h_rVn_dFQbV0

心配なのは40度以上はダメって書いてるとこ・・

電源はVVF直結らしい。

温度センサー
https://www.amazon.co.jp/dp/B00GCX819Q/

約6000円

spec
https://www2.panasonic.biz/scvb/a2A/opnItemDetail?use_obligation=scva&contents_view_flg=1&catalog_view_flg=1&item_cd=FY-ST032&item_no=FY-ST032&b_cd=501&hinban_kbn=1&vcata_flg=1


コンセント -> VVF に変換が必要
outlet box使う？


ダクト
150mm x 10m あればええやろ
https://www.amazon.co.jp/dp/B09CGZQ1J1/

約 4000円

計４万円
Spiralでデジタル名刺作成

# 【初心者向け】Spiralでデジタル名刺を作ってみた！～フォーム作成からHTML表示までのまとめ～

こんにちは！  
今回はローコード開発ツール「Spiral（スパイラル）」を使って、**自分専用のデジタル名刺**を作る方法についてご紹介します。

私はスパイラル初心者でしたが、ハッカソンをきっかけに初めて触ってみました。  
この記事では、名刺データの登録からWebページでの見せ方まで、初心者目線で学んだことをまとめています。

まず実際に作成した名刺がこちらです。
![Pasted Graphic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4115887/8390a683-4d77-4903-b4ce-ae2908bb5f09.png)


---

## 📌 目次

1. 今回Spiralを使ってやりたいこと
2. データベースの作成  
3. フォームの作成とデータ登録  
4. データのWeb表示（HTMLテンプレート）  
5. 実際の表示イメージ  
6. つまずいたポイントと対処法  
7. まとめ  

---

## 1. 今回Spiralを使ってやりたいこと

Spiralを使って、自分の**名刺情報をオンラインで表示**できるようにしたい！  
具体的には以下の情報を表示したいと決めました：

- 名前  
- 会社名  
- 役職  
- 住所  
- メールアドレス  
- 電話番号  
- 会社のロゴ画像  
- ホームページURL  

目的は「フォームで入力→Webページで名刺として見せる」ことでした。

---

## 2. データベースの作成

### ① Spiralにログイン後、「DB」から「通常DBの新規作成」を選択しDBを作成しました。

### ② フィールドを追加
- `name`（名前）
- `company`（会社名）
- `position`（役職）
- `address`（住所）
- `mail`（メールアドレス）
- `tel`（電話番号）
- `logo`（ロゴ画像）※画像フィールドとして設定
- `url`（URL）

フィールドの「差替キーワード」を適切に設定しておくことで、後でHTMLに組み込めるようになります。

---

## 3. フォームの作成とデータ登録

### ① フォーム機能を選択

### ② フォーム編集画面にて、データ登録  
例：`name`、`company`、`mail`など  
→ これで名刺情報を入力するフォームが完成！

### ③ 入力用フォームURLから、自分の名刺情報を登録

---

## 4. データのWeb表示（HTMLテンプレート）
先ほどの工程で、名刺情報を登録した後、どのように名刺の形で表示するのか（どこのcssを編集していいのか）わかりませんでした。
ここが一番学びが大きかったポイントです！

### ① 一覧表 の 単表の「設定」で単表のスタイルを変更できます。

### ② 「単票のソース編集」で編集可能です。

### ③ カスタマイズも行いました。
単表の編集エディタを使用して、「クリックした時に回転する」ようにカスタマイズしました。

クリックした時に180度回転します。
![Pasted Graphic 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4115887/c4058b41-e563-485c-b5a9-dfce57d2f350.png)



---

## 5. まとめ
 
基本の流れである「**データベース作成 → フォーム作成 → テンプレート編集（単表）で表示**」という3ステップを押さえれば、一気に理解が深まります。
Next.jsを使って簡単にAPIを作ってみる

# はじめに

Next.jsを使えば簡単にAPIが作れるらしいので作ってみる。

対象者はPCでnpm, npxコマンドが使える人。

Node.jsをインストールしていない人はインストールをお願いします。

# 実際にやってみる

まずはNext.jsプロジェクトを作成します。

```
npx create-next-app@latest
```

```
npm run dev
```

`http://localhost:3000/`にアクセス。

次にapp/api/というディレクトリを作成し、apiフォルダの中にroute.tsを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006170/cddadf0b-d347-4928-b0e3-dafd8938ac3a.png)

route.tsに以下のように書くとGETリクエストに対してJSONデータを返してくれます。

```react:route.ts
import { NextResponse } from "next/server";

export async function GET() {
    return NextResponse.json({
        message: "データを取得",
        hoge: "hello, world",
    });
}
```

`localhost:3000/api`にアクセスすると先ほど書いたjsonが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006170/bd6bf476-610a-4ca7-97e5-d7a7fe66ad5d.png)

次はフロントエンドからデータを取得してみます。

app/page.tsxを以下のように書き換えてください。

fetch関数で`/api`にGETリクエストを送り、受け取ったデータをコンソールに表示しています。

buttonを押したときにgetDataが呼び出されるのでlocalhostにアクセスしてbuttonをクリックするとブラウザのコンソールに出力されると思います。

```react:page.tsx
"use client";

export default function Home() {

  const getData = async () => {
    const response = await fetch("/api");
    const data = await response.json();
    console.log(data);
  }

  return (
    <>
      <button onClick={getData}>button</button>
    </>
  );
}
```

F12、Ctrl+Shift+Iなどでコンソールを開いてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006170/d66e04fa-5d1c-4db3-baf3-5b77b0d6a067.png)

次はWebページ上に表示してみましょう。

```react:app/page.tsx
"use client";

import { useState } from "react";

export default function Home() {
  const [data, setData] = useState();

  const getData = async () => {
    const response = await fetch("/api");
    setData(await response.json());
  }

  return (
    <div className="text-center">
      <button onClick={getData}>button</button>
      {data && <div>{data && data.hoge}</div>}
    </div>
  );
}
```

buttonをクリックすると、dataに中身が入るので`data.hoge`がブラウザ上に表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006170/2bb183e2-af0b-4b6f-8e31-e44901677bc4.png)

もちろんroute.tsの`hoge: "hello, world"`を編集すれば返す値を変えられる。

# 参考

https://nextjs-ja-translation-docs.vercel.app/docs/api-routes/introduction
log2　多重ループ



今回は、前回と同じ問題を、多重ループを使った解き方で挑戦してみる！

問題のテーマが二重ループだから王道の解き方なのかな？

<br><br>

## 問題概要

N! を 2 で何回割ることができるか？

<br>

入力例：

    4

出力例：

    3

<br>

https://paiza.jp/works/mondai/double_roop_problems/double_roop_problems__log2

<br><br><br>

# 🧭 方針：二重ループ

素直に 1 × 2 × … × (N-1) × N を計算してから 2 で割ろうとすると、かけ算の計算結果が巨大な数となってしまいオーバーフローする(´;ω;｀)

<br>

そこで、次の性質を利用🚀

2 は素数であるので、1 × 2 × … × (N-1) × N を 2 で割ることができる回数は、
(1 を 2 で割ることができる回数) + (2 を 2 で割ることができる回数) + … + (N-1 を 2 で割ることができる回数) + (N を 2 で割ることができる回数) と一致する。

<br>

よって、
「1 〜 N の各値について 2 で割ることのできる回数を調べ、それらの和を求める。」

<br>

「1 〜 N の各値について」についてはループ処理で行うことができ、

「2 で割ることのできる回数を調べる」処理は、「ループ変数が 2 で割り切れる場合、2 で割る。」という処理を繰り返すことでおこなうことができる！


このようにして、二重ループで解くことができる✨

<br><br>

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


rl.once('line', (input) => {
    const N = Number(input);

    let count = 0;
    for (let i = 1; i <= N; i++){
        if(i % 2 === 0){
            for(let temp = i; temp > 0; temp /= 2, count++);
        }
        
    }
    
    console.log(count);
    
    rl.close();
});
```
❌ 問題点：
`if(i % 2 === 0){` で 偶数しか処理していないので、
「すでに 2 で割れることは保証されている」＝最初の1回はOK。

しかし、例えば6の場合2で割り切れるので処理を始めると、一回目は2で割り切れるが、商は３になり、３は割り切ることができないから❌

▶️ つまり、初めは偶数でも割っていくと、奇数になる場合もあるということ。

<br><br>

## ✅ 修正版：OK例
```js
const rl = require('readline').createInterface({input:process.stdin});


rl.once('line', (input) => {
    const N = Number(input);

    let count = 0;
    for (let i = 1; i <= N; i++){
        if(i % 2 === 0){
            for(let temp = i; temp % 2 === 0; temp /= 2, count++);
        }
        
    }
    
    console.log(count);
    
    rl.close();
});
```

`(let temp = i; temp % 2 === 0; temp /= 2, count++)`

によって、「ループ変数が 2 で割り切れる場合、2 で割る。」という処理を繰り返し、その度にカウントしている。

<br><br>

# 🗒️ まとめ

各数ごとに2で割る方が理解しやすい印象だけど、前回のコードの方が計算に無駄がない感じがする。


<br><br><br>[僕の失敗談(´;ω;｀)と解決法🐈](https://paizabeginner.wordpress.com/2025/06/20/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc%ef%bc%9alog2%e3%80%80%e5%a4%9a%e9%87%8d%e3%83%ab%e3%83%bc%e3%83%97/)
Exchange メール容量変更方法

https://learn.microsoft.com/ja-jp/exchange/recipients/user-mailboxes/storage-quotas


上記のサイトを参考に、コマンドを書きます。

Set-Mailbox -Identity (変更対象のメールアドレス) -UseDatabaseQuotaDefaults $false -IssueWarningQuota (警告の容量) -ProhibitSendQuota (送信禁止の容量) -ProhibitSendReceiveQuota (送受信禁止の容量)

以上、私のためのメモです。
【Python】Counterオブジェクトのmost_common([n])メソッド

most_common()メソッドの戻り値は、辞書ではなくリストです。

辞書もしくはキーワードで作成したCounterオブジェクトに対して、most_common([n])メソッドを実行すると、キーと値のペアがタプルになり、値が大きい順に並び替えられてリストで返ります。

```python:例文

>>> from collections import Counter
>>> c = Counter({'a': 2, 'b': 4, 'c': 6}) 
>>> c.most_common(2)
[('c', 6), ('b', 4)] # 結果

```

most_common([n])メソッドの[n]に整数値を指定すると、最大n件の要素を返します。
[VSCode][React] React関数コンポーネントの雛形を生成するスニペット

# 概要
- `rafce`コマンドでReact関数コンポーネントの雛形を生成する

# 手順
1. VSCodeで`ES7 React/Redux/GraphQL/React-Native snippets`のExtensionをインストールする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955010/f9f13d58-2f5e-44b0-a101-e506d6d324c0.png)

1. 雛形を生成したいファイルで`rafce`+`Tab`
    ~~~ts
    rafce
    ~~~
1. 雛形が生成される
    ~~~ts
    import React from 'react'
    
    const Circle.stories = () => {
      return (
        <div>
          
        </div>
      )
    }
    
    export default Circle.stories
    
    ~~~

# 参考リンク
- [React関数コンポーネントの雛形をrfceで生成する方法](https://zenn.dev/shin_re/articles/91fbf3949c7f51)
【Python】dateオブジェクト、datetimeオブジェクト、weekday()メソッド、isoweekday()メソッド

dateオブジェクトのtoday()メソッドは日付しか取得しません。
datetimeオブジェクトのtoday()メソッドは、日付と時刻を取得します。

dateオブジェクトにstrptime()メソッドはありません。
datetimeオブジェクトにはstrptime()メソッドがあり、文字列をdatetimeオブジェクトに変換できます。

dateオブジェクトにstrptime()メソッドはありませんが、strftime()メソッドはあります。

weekday()メソッドは、月曜日を0、日曜日を6として返します。
isoweekday()メソッドは、月曜日を1、日曜日を7として返します。
VSCodeで削除したファイルを復元する方法

# はじめに
今回は、VSCodeを用いた開発の中で間違えて削除してしまったファイルを復元する方法を調べてまとめました。

# [1. 削除したファイルと同じ名前で、同じ場所に新しいファイルを作成](#削除したファイルと同じ名前で、同じ場所に新しいファイルを作成)
削除したファイルと同じ名前で、同じ場所に新しいファイルを作成します。
例）config/gakken.phpを削除した場合、新たにconfig/gakken.phpを作成

# [2. 新しく作成したファイルのタイムラインを確認](#新しく作成したファイルのタイムラインを確認)
新しく作成したファイルをVScodeの左側の「エクスプローラー」エリアで右クリックし、「タイムラインを開く」をクリックする。
「エクスプローラー」エリアの下部にタイムラインが表示されるので一番上の項目を右クリックし、「コンテンツの復元」をクリックする。
【備忘録】Cursor Rulesで開発の均一化について考える

みなさん、こんにちは！
赤神と申します！

社内LT会でCursor Rulesに関する発表を行ったので、それに関する備忘録を書きたいと思います。

資料は↓から閲覧することができます！

<script async class="docswell-embed" src="https://www.docswell.com/assets/libs/docswell-embed/docswell-embed.min.js" data-src="https://www.docswell.com/slide/54VX2Y/embed" data-aspect="0.5625"></script><div class="docswell-link"><a href="https://www.docswell.com/s/sora_akagami/54VX2Y-2025-06-20-140454">【SCOM LT】Cursor Rules を書くということ〜業務"効率化"から業務"均一化"を目指して〜 by @sora_akagami</a></div>

最近、Cursorが学生無料になったこともあり、多くのユーザーがCursorを使って開発をしていると思います。

ですが、話を聞いてみるとあまりRulesを設定している人はそんなにいないらしい？

そこで、Cursor Rulesを設定すると便利になるよ！という話を社内LT会で発表しました。

詳しい内容は、スライドをみたり、他の方の記事を参照してもらえたらと思うのですが、今回はスライドの副題にもある『〜業務"効率化"から業務"均一化"を目指して〜』というところに焦点を当ててポエムを書いていきます。

あくまで一個人の意見なので「ほえ〜、そういうことを考えている人もいるんだなあ」ぐらいの気持ちで読んでいただけると幸いです。

# AIエージェントと業務効率化

近年、AIエージェントの進歩は凄まじく、いろんなところでコーディングの多くの割合をAIがするようになってきたような気もします。

コーディングに限らず、非開発業務でもAIエージェントは欠かせない存在となってきました。資料作成や文章校正などでも大活躍ですよね。AIエージェントを使うことで、業務が効率化することはほとんどの人が疑わないことだと思っています。

# Cursor Rulesと業務"均一化"

スライド内では、Cursor Rulesを書くということは、チーム内のドキュメントやルールをきちんと作り、育てていくということと同じであると記載しました。

「Commitメッセージは〇〇の形式で書いてください」「docstringはNumPy形式で書いてください」のようなチーム共通のルールをそのままCursor Rulesとして書いてあげるだけで良いと思っています。案外これだけでも思ったよりよくなります。

このようなチーム共通のルールは作業の"均一化"にもつながります。

チーム内の誰がいつやっても同様に同じアウトプットが期待できるということは、案外大事だと思っています。ただ、そういった作業って実はめんどくさくて、だんだんとcommitメッセージやissueの中身が適当になっていきます（経験者は語る）。そうなると、他のチームメンバーが読んだ時に理解に時間がかかり、チーム全体としては非効率的になってしまいます。

なので、チーム内のルールを設定する過程でCursor Rulesをそのまま書き、作業の均一化を目指すことこそが、この時代の効率化なんじゃないかなあというお気持ちを述べたスライドとなっています。

# おわりに

スライド内では、チーム運用の提案みたいな項目もあったりするので、暇があったら読んでみてください。

スライドだけだとわかりにくい場合は、聞いていただけたら別途説明などしますので気軽にご連絡ください。

それでは、ここまで読んでいただきありがとうございました！
【Python】正規表現でよく使う特殊文字

正規表現でよく使う特殊文字は以下となります。

　\d 数字
　\D 数字以外
　\s 空白文字
　\S 空白文字以外
　\w 任意の英数字
　\W 英数字以外
　. 任意の1文字
　^ 先頭
　$ 末尾
　* 0文字以上の繰り返し
　+ 1文字以上の繰り返し
　? 0回か1回の繰り返し
　{m} m回の繰り返し
　{m, n} m回以上、n回以下の繰り返し
　[...] 指定したいずれかの文字
　[^...] 指定したいずれかの文字以外
　(x|y) xかyの選択
Linuxを基本からまとめてみた【リポジトリとパッケージ管理 (Red Hat)】

## yumコマンドによるパッケージ管理
#### yumコマンド
- yum[オプション]サブコマンド[キーワード(パッケージの名前を指定(必要に応じて))]


| オプション(必要に応じて) | 説明    |
| --- | --- |
| -y  |確認が求められる時、全て『y』(yesの意味)で回答 |
|--enablerepo=ID|指定したIDのリポジトリを有効化 |
|--disablerepo=ID|指定したIDのリポジトリを無効化 |

| サブコマンド | 説明    |  
| --- | --- | 
|install |パッケージをダウンロード、インストール | 
|check-update |更新の有無を確認 | 
|update |パッケージ情報を更新し、パッケージを更新 | 
|remove |パッケージを削除 | 
|search |パッケージを検索 |
|info |パッケージ情報を表示　|
|list | パッケージの一覧を表示 | 
|repolist | リポジトリの一覧を表示 | 
|deplist | 依存するパッケージの一覧を表示 |
|groupinstall |パッケージグループによるダウンロード、インストール | 
|grouplist | パッケージグループの一覧を更新 | 
|localinstall |ローカルRPMパッケージのインストール |

## RPMパッケージのインストール
#### パッケージ情報を更新する
```
$ sudo yum update
```
#### パッケージをダウンロード、インストールする
```
$ sudo yum install(パッケージ)
```
#### RPMパッケージの更新
```
$ sudo yum update
```
#### RPMパッケージの削除
```
$ sudo yum remove(パッケージ)
```
## yumコマンドの設定ファイル
#### 設定ファイルの場所
```
/etc/yum.conf
```
#### yumdownloaderコマンド （RPMパッケージのダウンロード）
- リポジトリからパッケージをダウンロードする
- yumdownloader [オプション][キーワード(ダウンロードするパッケージの名前を指定する)]

| オプション(必要に応じて) | 説明    |
| --- | --- |
| -resolve  |依存関係にあるパッケージにダウンロードする |

## RPMコマンドによるRPMパッケージ管理
#### rpmコマンド
- ローカル環境でパッケージ管理する
- rpm [オプション] [キーワード(パッケージ名・ファイル名)]

| サブコマンド | 説明 |  
| --- | --- | 
|-i(--install) |パッケージをインストール |
|-U(--upgrade) |パッケージの更新、未インストールのパッケージでも更新| 
|-F(--freshen) |パッケージの更新、未インストールのパッケージついては更新はしない | 
|-e(--erase) |パッケージを削除| 
|-q(--query) |パッケージを検索 | 
|-V(--verify) |整合性を確認| 
|-K(--checksig) |署名を表示| 

#### 1つ目に指定できるオプション
| オプション | 説明    |
| --- | --- |
|-i(--install) |インストール |
|-U(--upgrade)|パッケージの更新、新規でもインストールする |
|-F(--freshen|パッケージの更新、新規にインストールしない |
|-e(--erase)|パッケージを削除 |

#### 1つ目に指定できるオプションと併用できるオプション
| オプション | 説明    |
| --- | --- |
|-v |詳細情報の表示 |
|-h(--hash)|『#』で進捗を表示　※ -eでは指定できない |
|--nodeps|依存関係を無視する |

## RPMパッケージの管理
#### treeパッケージより新しいバージョンをダウンロードする
```
wget https://mirror.stream.centos.org/9-stream/BaseOS/x86_64/os/Packages/tree-1.8.0-10.el9.x86_64.rpm
```
#### インストール済みのパッケージの一覧を取得する
```
$ rpm -qa
```
#### tree パッケージの詳細情報を取得する
```
$ rpm -qi tree
```


## 参考サイト
[新・Linux入門編6(LinuC対策版): リポジトリとパッケージ管理 (Red Hat系)](https://paiza.jp/works/linux/new-primer/linux-new-primer-6)
リモナビ：NFSv4 にリモナビを使ってみる

NFS はversion 4 で 単一ポート(2049) の TCP通信で実現されるようになりました。
これによって、リモナビを使って容易にNAT超えのNFSが実現できます。

### 🔹NFS の検証構成

以下の構成で実際に NFS マウントを実現してみようと思います。
<img width="768px" src="https://remonavi.com/img/remonavi_nfs.png">

NFSクライアント、NFSサーバ　上にそれぞれ Sender | Receiver を配置する構成とします。
この検証は 両ホストとも、**Ubuntu** を使用しますので、  Sender | Receiver は共に Docker版を利用します。

### 🔹設定イメージ
設定内容はこれまで通りですが、 OSの NFS 設定には 接続元｜先TCP接続情報 が必要なため、従来とh若干順番が異なります。

#### １） NFSサーバに リモナビ Receiver をインストール
  + Receiver Dockerコンテナ内から見たホストマシンのIPアドレスの取得
    ```
    docker inspect remonavi-receiver | grep "Gateway"   ........ [*a]
    ```
  + ホストマシンから見た、Receiver Docker コンテナの IPアドレス
    ```
    docker inspect remonavi-receiver | grep "IP"        ........ [*b]
    ``` 
#### ２） NFSクライアントに リモナビ Sender をインストール
  + Sender Dockerコンテナ内から見たホストマシンのIPアドレスの取得
    ```
    docker inspect remonavi-sender | grep "Gateway"     ........ [*c]
    ``` 
#### ３） リモナビ Gateway にて、 NFS Server　へのGateway設定を追加
　接続ホスト : [*a] の IPアドレス
　接続ポート : 2049

#### ４） リモナビ Receiverにて (3) Gateway の利用設定
#### ５） リモナビ Seneer (3) Gateway の利用設定
　接続ポート : 任意 [*d]

#### ６） NFSサーバの設定
- NFS サーバのインストール
  ``` 
  apt install nfs-kernel-server
  ``` 
- NFS サーバの設定
  ``` 
  /etc/exports　編集
   　/{公開ディレクトリ}  {ReceiverコンテナのIP情報 [*b]}(rw,sync,fsid=0,crossmnt,no_subtree_check,no_root_squash)	

  例) /mnt 172.17.0.0/16(rw,sync,fsid=0,crossmnt,no_subtree_check,no_root_squash)
        /mnt          : /mnt を公開する
        172.17.0.0/16 : NFSサーバへの接続元IPネットワーク
                        今回は Receiver Docker が接続元なので [*b] 情報とする 
                        [*b]では IPAddressとPrefixが取得できま
  ``` 
- NFS サーバの再起動
  ``` 
  systemctl restart nfs-kernel-server.service
  ``` 
#### ７） NFSクライアントの設定
- NFS クライアントのインストール
  ```
  apt install nfs-common
  ``` 
- NFS マウント設定
  ``` 
  mount -t nfs -o vers=4,port=[*d] [*c]:{NFSサーバのマウント元} {クライアントホストのマウント先}

  例) mount -t nfs -o vers=4,port=9165 172.17.0.1:/public /home/mnt/public
       9165       : Sender設定のポート番号
       172.17.0.1 : Sender の Dockerアドレス
       /public    : NFSサーバで公開したディレクトリをルールートにしたディレクトリ指定
                    NFSサーバ上の  /mnt/public 相当    
  ``` 

### 🔹おわりに
　NFS クライアント、サーバ共に、TCP/IPレベルでの接続情報が必要なため、リモナビ側で先に接続経路を確立したのちに、NFS 設定をします。

　注意点は  Sender | Receiver が Docker で、それぞれのホストに直にインストールする場合、接続IPアドレスが、Docker コンテナの IPアドレスとなる点です。　
　この情報のために、先に Receiver | Sender Docker を動作させ、以下のコマンドで接続IP情報を取得しています。
 
  ``` 
  docker inspect {コンテナ名} | grep {検索したい文字列}
      Gateway :  Docker コンテナから見たホスト側の IPアドレスじょうh
      IP      :  ホスト側から見た Docker コンテナが利用する IPアドレス情報
  ```
PO承认，ME28

对象PO的种别：ZNB1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/a7540837-d6ff-479e-804a-45fd74400c56.png)

ME28进来后，X3,X4承认2次
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/91cd1785-ffb6-45d3-8c9d-1e702b4cf205.png)
【Python】replace(old, new[, count])

文字列の変換は「replace(old, new)」で行います。

また、文字列の末尾から指定の文字を削除する場合は「rstrip(chars)」を利用します。文字の指定（chars）を省略して「rstrip()」とすると、末尾の空白文字を削除します。
[メモ]claude code関係の話

自分で触ろうと思いっつ、記事だけ集めて触ってない。とりあえず記事を貼り付け。

### まずはここから

初期設定～使い始めの話が書いてあります。最初にばずった2つの記事が6月4日でそこから2週間しか経過してない…ってスピード感がすごいですね。

https://speakerdeck.com/schroneko/getting-started-with-claude-code

https://speakerdeck.com/minorun365/yasasiiclaude-coderu-men

こちらは後発の記事。

https://syu-m-5151.hatenablog.com/entry/2025/06/06/190847

https://syu-m-5151.hatenablog.com/entry/2025/06/05/134147

2週間経過した後の記事なので、今から参照するならこれが一番いいかも?

https://dev.classmethod.jp/articles/get-started-claude-code-1/

### Howto / tips チュートリアル系

https://azukiazusa.dev/blog/vibe-coding-tutorial-create-app-with-claude-code/

https://note.com/himaratsu/n/nddf0efa67d42

https://pc.watch.impress.co.jp/docs/column/nishikawa/2023840.html

https://azukiazusa.dev/blog/vibe-coding-tutorial-create-app-with-claude-code/


### Howto / Tips 上級

多少使い込んだ方、開発スキルがある方の記事

https://zenn.dev/dirtyman/articles/ddbec05fd9fbb4

https://www.yasuhisay.info/entry/2025/06/15/162704

https://memotty-obsidian.pages.dev/202506151218-claude-code%E3%81%A8github-issue%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E5%85%A8%E8%87%AA%E5%8B%95%E9%96%8B%E7%99%BA%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/

### 読み物

読み物ではあるが、Tipsは少な目

https://zenn.dev/explaza/articles/f62e704e73d3ff

https://speakerdeck.com/nwiizo/claude-everywhere

### その他

https://zenn.dev/carenet/articles/59f62014092a1b

昨今のAIニュースいろいろまとめ
点群のノイズ除去(Denoising)の基本トピックとDeepLearningを用いたアルゴリズムまとめ

## 基本トピック
### タスク概要と活用シーン
点群(Point Cloud)のノイズ除去(Denoising)は特徴点ベースのSLAMなどの3次元再構成システムの中間の処理で得られる点群からノイズを除去するタスクです。画像などからSIFTなどによって得られる特徴点ベースの3次元再構成では得られる点にノイズが含まれることが多いのでその除去を行うことでより高品質の結果が得られます。


### SOR(Statistical Outlier Removal)を用いたノイズ除去
SOR(Statistical Outlier Removal)は「それぞれの点が近傍の点から離れているかどうか」を元に外れ値(Outlier)の除去を行うアルゴリズムです。

```math
\begin{align}
\mu_{i} &= \frac{1}{k}(d_1 + d_2 + \cdots + d_k) \\
i &= 1, 2, \cdots , N
\end{align}
```

$X$に含まれる点のk個の近傍と該当する点のdistanceを$d_1, d_2, \cdots , d_k$とおくとき、平均のdistanceの$\mu_{i}$を上記のように定義します。このときSORでは$\mathbf{x}_{i}$が外れ値(Outlier)かどうかを判定する関数$\mathrm{Outlier}$を下記のように定義します。

```math
\begin{align}
\mathrm{Outlier}(\mathbf{x}_{i}) &= \left\{ \,
    \begin{aligned}
    & \mathrm{True} \qquad \mathrm{if} \, \mu_{i} \geq \bar{\mu} + \sigma \\
    & \mathrm{False} \qquad \mathrm{otherwise}
    \end{aligned}
\right. \\
\bar{\mu} &= \frac{1}{N} \sum_{i=1}^{N} \mu_{i}, \quad \sigma = \frac{1}{N} \sqrt{\sum_{i=1}^{N} (\mu_{i}-\bar{\mu})^{2}}
\end{align}
```

上記は異常検知(Anomaly Detection)などでよく用いられる平均と標準偏差を用いた外れ値判定と対応させながら理解すると良いと思います。


### ノイズ除去のアルゴリズムの評価
PointCleanNetやScore-Based Point Cloud DenoisingなどのDeepLearninを用いたノイズ除去のアルゴリズムの評価にあたってはCD(Chamfer Distance)やP2M(Point-to-Mesh) Distanceなどのメトリクスが用いられることが一般的です。以下それぞれのメトリクスについて数式を元に簡単に確認します。

#### CD(Chamfer Distance)
CD(Chamfer Distance)はノイズを含む点群の集合$X$とノイズのない点群の集合の$Y$がある際に集合$X$の評価にあたって下記のように定義されます。

```math
\begin{align}
\mathrm{CD}(X, Y) &= \frac{1}{M} \sum_{\mathbf{x}_{i} \in X} \min_{\mathbf{y}_{j} \in Y} || \mathbf{x}_{i} - \mathbf{y}_{j} ||_{2}^{2} + \frac{1}{N} \sum_{\mathbf{y}_{j} \in Y} \min_{\mathbf{x}_{i} \in X} || \mathbf{y}_{j} - \mathbf{x}_{i} ||_{2}^{2} \\
X &= \{ \mathbf{x}_{i} \}_{i=1}^{M} \\
Y &= \{ \mathbf{y}_{i} \}_{i=1}^{N}
\end{align}
```

上記の式は下記のように解釈すると良いです。

右辺の第1項： ノイズを含む点群の集合の$X$の点から最も近い点の$\mathbf{y}_{j}$の差分のノルムの2乗の平均

右辺の第2項： ノイズのない集合の$Y$の点から最も近い点の$\mathbf{x}_{i}$の差分のノルムの2乗の平均


#### P2M(Point-to-Mesh) Distance



## DeepLearningを用いたアルゴリズム
### タスク(データセット)
#### PUNet
#### PointCleanNet
![PointDenoising1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936087/c48bc8e2-c769-40ba-accc-55e3e3d1872e.png)
PointCleanNetで用いられたデータセットの概要([PointCleanNet論文](https://arxiv.org/abs/1901.01060v3) Figure.6)

上記がPointCleanNetの論文で用いられているデータセットの概要です。上記の入手方法については下記で詳しくまとめたので省略します。

https://qiita.com/Chi_corp_123/items/12cd8622bff40ac2ef4f

入手したデータセットには`pointCleanNetOutliersTrainingSet`、`pointCleanNetOutliersTestSet`、`pointCleanNetDataset`の3つのディレクトリが用意されており、それぞれ下記の目的で用いることができます。

```
pointCleanNetOutliersTrainingSet:	それぞれのオブジェクトについて外れ値を含む140,000個の点(`xyz`で3Dの位置情報、`outliers`で点が外れ値かどうかを定義)。
pointCleanNetOutliersTestSet:		
pointCleanNetDataset:		
```

以下、`pointCleanNetOutliersTrainingSet`、`pointCleanNetOutliersTestSet`、`pointCleanNetDataset`の3つのディレクトリについてそれぞれ可視化を行います。

・`pointCleanNetOutliersTrainingSet`



### アルゴリズム
#### PointCleanNet
#### Score-Based Point Cloud Denoising