OmniAICreator/Qiita-1.07M huggingface dataset:
TypeScriptで「今は使わない変数」を退避するスマートな方法

# はじめに

TypeScriptで開発していると、こんな状況に出くわすことはありませんか？

> 変数は定義したけど、今はまだ使わない。でも**将来的に使う予定がある**。
> でもそのままだと、`未使用の変数エラー`が出てしまう…。

特に、TypeScript + ESLint環境では、`no-unused-vars`ルールに引っかかってしまいます。コメントアウトしても関連コードが消えてしまうし、無意味にログ出力するのもイマイチ。

この記事では、**「一時的に使わない変数」を安全かつ明示的に退避する方法**として、`_unused` 関数を使ったベストプラクティスをご紹介します。

# よくあるNG例

```ts
const foo = calculateSomething();

// 一時的に使わないので、無理やり回避
if (!testMode) console.log(foo); // ← 意味が不明
```

これは一見 harmless に見えますが、

* なぜ `testMode` にしているのかが意味不明
* ログが出る可能性もあり、後で削除し忘れる

など、**メンテ性が悪くなります**。

# 解決策：`_unused` 関数を定義する

以下のような関数を用意して、**「今は使わないけど退避しておく」** という意図を明確にしましょう。

```ts
function _unused(..._args: unknown[]): void {
  // 何もしない
}
```

**使い方**

```ts
const foo = calculateSomething();
const bar = getDataFromAPI();

// 今は使わないが、将来的に使う予定
_unused(foo, bar);
```

* これで TypeScript / ESLint の警告は消えます。
* **実行時の副作用も一切なし**。
* `_unused` を見れば、他の開発者も「今は未使用なんだな」と分かる。

**💡複数変数も一括でOK**

```ts
const a = 1;
const b = "text";
const c = someFn();

_unused(a, b, c);
```

**🧼 なぜこれがベストなのか？**

| 方法                              | 明確さ | 実行負荷 | 解説             |
| ------------------------------- | --- | ---- | -------------- |
| `if (!testMode) console.log(x)` | △   | あり   | 意図が伝わりづらく、残りがち |
| `eslint-disable-next-line`      | △   | なし   | 対処法が隠れてしまう     |
| `void x`                        | ○   | なし   | 単体なら良いが複数は不可   |
| **`_unused(x, y)`（今回紹介）**       | ◎   | なし   | 意図が明確で安全       |

# おわりに

「今は使わないけど、将来的に使う予定の変数」をどう扱うかは、地味ながらも**コード品質と開発体験に直結する問題**です。

本記事で紹介した `_unused` パターンを使えば、

* ESLintの警告を避けつつ
* 意図をチームに明示でき
* 実行時にも影響を与えません

もし似たような悩みを持っていたら、ぜひ導入してみてください！
スクショに便利 - FastStone Capture

https://faststone-capture.softonic.jp

- 画面スクショ、自動スクロール画面スクショが可能
    - 取得した画面スクショはクリップボードへ自動コピー
- 動画撮影も可能
    - マウス周りにポインタが出た状態がデフォルトなので、マウスがどこにあるのか分かりやすい
- Windows向け
入力値を保持しておく(old)

検索機能を作成した。

実際に動かせるものの、検索ボタンを押すごとに入力したキーワードが削除されてしまう。

この入力値を維持する方法としてoldメソッドがある。

### 改善するコード

```php
<form method="GET" action="{{ route('evaluation.index', ['book_id' => $book->id]) }}" class="mb-4">
    <div class="p-3 d-flex justify-content-center align-items-center">
        <input type="text" name="keyword" value="{{ old('keyword', $keyword) }}" 
        class="form-control w-50 me-2" placeholder="検索キーワードを入力">
        <select name="rating" class="form-select ms-4">
            <option value="">評価を入力</option>
            <option value="1">⭐️</option>
            <option value="2">⭐️⭐️</option>
            <option value="3">⭐️⭐️⭐️</option>
            <option value="4">⭐️⭐️⭐️⭐️</option>
            <option value="5">⭐️⭐️⭐️⭐️⭐️</option>
        </select>
        <button class="btn btn-primary ms-5">検索</button>
    </div>
</form>

```

### 改善後

```php
<form method="GET" action="{{ route('evaluation.index', ['book_id' => $book->id]) }}" class="mb-4">
    <div class="p-3 d-flex justify-content:center">
        <input type="text" name="keyword" value="{{ old('keyword', $keyword) }}" 
        class="form-control w-50 me-2" placeholder="検索キーワードを入力">
        <select name="rating" class="ms-4">
            <option value="">評価を入力</option>
            <option value="1" {{ old('rating', $rating ?? '') == '1' ? 'selected' : '' }}>⭐️</option>
            <option value="2" {{ old('rating', $rating ?? '') == '2' ? 'selected' : '' }}>⭐️⭐️</option>
            <option value="3" {{ old('rating', $rating ?? '') == '3' ? 'selected' : '' }}>⭐️⭐️⭐️</option>
            <option value="4" {{ old('rating', $rating ?? '') == '4' ? 'selected' : '' }}>⭐️⭐️⭐️⭐️</option>
            <option value="5" {{ old('rating', $rating ?? '') == '5' ? 'selected' : '' }}>⭐️⭐️⭐️⭐️⭐️</option>
        </select>
        <button class="btn btn-primary ms-5">検索</button>
    </div>
</form>

```

改善前のコードの以下の部分に

```php
  <option value="1">⭐️</option>
  <option value="2">⭐️⭐️</option
  <option value="3">⭐️⭐️⭐️</option>
  <option value="4">⭐️⭐️⭐️⭐️</option>
  <option value="5">⭐️⭐️⭐️⭐️⭐️</option>
```

以下のoldを付け加える

```php
<option value="1" {{ old('rating', $rating ?? '') == '1' ? 'selected' : '' }}>⭐️</option>
<option value="2" {{ old('rating', $rating ?? '') == '2' ? 'selected' : '' }}>⭐️⭐️</option>
<option value="3" {{ old('rating', $rating ?? '') == '3' ? 'selected' : '' }}>⭐️⭐️⭐️</option>
<option value="4" {{ old('rating', $rating ?? '') == '4' ? 'selected' : '' }}>⭐️⭐️⭐️⭐️</option>
<option value="5" {{ old('rating', $rating ?? '') == '5' ? 'selected' : '' }}>⭐️⭐️⭐️⭐️⭐️</option>
```

### 追記したコードについて

```php
{{ old('rating', $rating ?? '') == '1' ? 'selected' : '' }}
```

oldメソッドは
**old('name属性に対応するもの', '値がなかった時の初期値（代替値）’)** という扱い方をする。
$rating ?? ''はnullの場合に備えるために記述したもの。


== '1' ? 'selected' : '' は三項演算子を使用している。
**条件 ? 真のときの値 : 偽のときの値**
というような書き方をする。

https://www.php.net/manual/ja/language.operators.comparison.php

一致していればselected（選択されている状態）を返し、違うのならば何もしない、という処理。
XCTestのUITestで画面の向きや明暗の設定毎に行われるテストの実行を無効にする方法

XCTestでUITestを実行した時に、一つのテストケースしか定義していないのに、何回かアプリが起動したりしていて気になったので、その無効方法を調べてみました。

## 前提
Xcode16.3

## 事象の内容

問題のテスト結果を確認してみると、一つのテストケースで、画面の向きや画面の明暗(Appearance)の設定毎のテストを全て実行していました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359094/9145ca82-2a97-440d-bebf-4e135656514e.png)


実際のテストコードは以下の様な感じです。

```swift
final class SampleTest: XCTestCase {
    
    override class var runsForEachTargetApplicationUIConfiguration: Bool {
        true
    }

    override func setUpWithError() throws {
        continueAfterFailure = false
    }

    func testExample() throws {
        // UI tests must launch the application that they test.
        let app = XCUIApplication()
        app.launch()
    }
}
```

## 結論

この事象の無効方法をサクッと説明すると、以下コードのreturnの値を`false`にするだけで良さそうです。

```swift
 override class var runsForEachTargetApplicationUIConfiguration: Bool {
        true
    }
```

公式のドキュメントによると、`runsForEachTargetApplicationUIConfiguration`は、プロジェクトの設定を読み取り、以下設定毎に[`launch()`](https://developer.apple.com/documentation/XCUIAutomation/XCUIApplication/launch())時に反復的にテストを実行する様です。
- 外観（例：ライトモードまたはダークモード）
- 向き（縦向き、横向きなど）
- ローカリゼーション（例、または）en_USzh_CN

https://developer.apple.com/documentation/xctest/xctestcase/runsforeachtargetapplicationuiconfiguration

デフォルトでは`false`になっている様なので、この挙動を無効にしたい場合は、`runsForEachTargetApplicationUIConfiguration`のoverrideメソッド定義を削除するだけでも良いです。

:::note
一つのテストケースで複数のUI設定を検証できること自体は、非常に強力な機能と思ったので、テストの実行時間が膨らむことが許容できれば使うのはアリと思いましたが、
それでも`launch()`毎に複数実行されるので、この機能をONにする場合は`launch()`は不必要に行わない方が良さそうですね。
:::

とはいえ、UITestターゲットを作成時にデフォルトで存在するUITestケースは上記のテストコードの様になっていて、私はそのまま使用してしまっていたのでこの挙動を知らずに変にハマってしまいました。

今回の知見がどなたかの参考になれば幸いです。
[PowerAutomate] 毎週決まった時間にメールを送信する

### はじめに
業務効率化の一環として、毎週決まった時間に部内のメンバーに周知するリマインドメールを自動送信したいと考えました。
Outlook の送信スケジュール機能では一度きりの予約は可能ですが、「繰り返し処理」ができません。また、Excel VBA での実装も検討しましたが、より直感的で簡易的に構築できる Power Automate を使ってみることにしました。

### この記事でできること
Power Automate を使って、毎週決まった時間にリマインドメールを自動送信するクラウドフローを作成できます。

### この記事の対象者
・Power Automate でスケジュール済みクラウドフローを作成したい方
・メール本文にリンクを挿入したいが、簡潔な書き方が分からない方

早速、実際の手順を示していきます。
#### 【手順：Power Automate で毎週決まった時間にメールを送信する方法】
##### １．[＋作成] タブ > [スケジュール済みクラウドフロー] を選択します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4023455/63335776-96fe-46da-85f6-4d5a683eb1f0.png)


##### 2． フロー名、フロー実行タイミング、設定曜日を選択し、作成をクリックします。

例：毎週木曜日の午前10:00 (日本時間）に実行するフローを作成します
フロー名に関しては、簡潔なタイトルとして、[毎週(木)にリマインドメールを送信する] というものにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4023455/04c1bbf1-e0a1-4625-879d-f881016007c6.png)

##### 3．Recurrence の下の「＋」をクリックして、アクションを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4023455/218e1045-0b33-4fa0-85a7-12737e61133c.png)

##### 4．メールの送信と入力し、 [メールの送信 (V2) ] をクリックします。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4023455/01dc726f-33ab-4014-8698-de2e63af394b.png)

##### 5．  [宛先] > [件名] > [本文] を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4023455/95cc06a2-0f03-4c31-a5bb-3325756b50a2.png)

尚、メール文にリンクを挿入する際は、まず本文を記載する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4023455/1f5d90a4-6ea9-4992-a104-a3da45662723.png)

次に、リンクを埋め込みたい箇所 [ここをクリック] にカーソルを合わせ、 右上の[-]をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4023455/8249bf51-21ca-47dd-b327-16006b763116.png)

参照したいリンクを張り付け > [✓] をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4023455/5a15f6a0-7f78-486e-acca-8fe872d23cfb.png)

##### 6． 右上から [保存] > [テスト] クリックし、念のため手動で本フローをテストします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4023455/8e06aa55-4bd3-4e6e-a054-b9dfcbb1f83d.png)

エラーが出力されず、問題なくフローが飛ぶようでしたら、これで設定は完了です。

PowerAutoamteをPC上で起動していなくても、毎週木曜日の日本時間午前10時に自動でメールが送付される設定が完了しました。
RSpecの基本のキホン！(モデルスペック編)

# モデルスペック

## モデルスペックの作成

以下コマンドで既存モデルへモデルスペックを作成。

```bash
rails generate rspec:model user
```

```ruby:初期状態のspec/models/user_spec.rb
require 'rails_helper'

RSpec.describe User, type: :model do
  pending "add some examples to (or delete) #{__FILE__}"
end
```

## モデルスペックのルール

### ・期待する結果は能動形で明示的に記述する

- example の結果がどうなるかを動詞を使って明示的に説明する(古い形式ではshouldを用いたが、現在は使用しない)
- チェックする結果は example 一つに付き一個だけ

```ruby
# 古い形式
it "should be valid" do
  expect(user).to be_valid
end

# 新しい形式
it "is valid" do
  expect(user).to be_valid
end
```

### ・起きてほしいことと、起きてほしくないことをテストする

正常系と異常系(エラーが期待通りに起きるか)の両方をテストする

### ・境界値テストをする

例えば、パスワードのバリデーションが4文字以上10文字以下なら、8文字のパスワードをテストしただけでは十分なテストとは言えない。境界値となる4文字と10文字、そして3文字と11文字もテストするのが良いテストケース。

### • 可読性を上げるためにスペックを整理する

- describeとcontextでよく似た example を分類してアウトライン化する
  - describeではクラスやシステムの機能に関するアウトラインを記述
  - describeブロックで説明文の代わりにメソッド名 を書く場合もある
  ```ruby
    describe User do
      # クラスやシステムの機能に関するアウトラインを記述
      describe "create a user" do
        # ...
      end

      # メソッド名を記述
      describe "#create" do
        # ...
      end
    end
  ```
  - contextでは特定の状態に関するアウトラインを記述
- before ブロックと after ブロックで重複を取り除く
- **テストの場合は DRY であることよりも読みやすいことの方が重要**。もし頻繁にスペックファイルをスクロールしていることに気付いたら、ある程度はリピートして記述しても問題ない
LaravelでPHPのEnumを使ってみる

## はじめに
PHP 8.1.0から追加された `Enum` 機能を、Laravel で使ってみます。
「コードの可読性・保守性を上げたい」「定数管理を効率的に行いたい」という場合に有効だと思います。

この記事では、[PHPの列挙型のドキュメント](https://www.php.net/manual/ja/language.enumerations.php)や、[Laravel 12.x Eloquent：ミューテタ／キャスト](https://readouble.com/laravel/12.x/ja/eloquent-mutators.html)を参考に、以下のようなケースで `Enum` の活用例を紹介します。

- フォーム入力の選択肢
- バリデーションとの連携
- DBの保存・表示

※本記事では下記のバージョンを参考にしています。
PHP 8.1.0
Laravel 12.x

## PHPのenumって何？
PHP 8.1.0から導入された `Enum`（列挙型）は、いわゆる「定数の集まり」をオブジェクト指向的に表現できる機能です。

例えばこんな使い方ができます

```php
enum UserType: string
{
    case Admin = 'admin';
    case User  = 'user';
    case Guest = 'guest';
}
```

従来の定数クラスよりも型安全かつ可読性が高く、条件分岐もしやすいです。

## Laravelでの使い方

### 1. **フォームの選択肢として使う**

```php
// UserType.php
enum UserType: string {
    case Admin = 'admin';
    case User  = 'user';
    case Guest = 'guest';

    // 表示名(label)を設定
    public function label(): string {
        return match($this) {
            self::Admin => '管理者',
            self::User  => '一般ユーザー',
            self::Guest => 'ゲスト',
        };
    }

    // フォームの選択肢を設定
    public static function options(): array {
        return array_map(fn($case) => [
            // caseで定義した値を取得
            'value' => $case->value,
            // label()で定義した値を取得
            'label' => $case->label(),
        ], self::cases());
    }
}
```

```php
<!-- form.blade.php -->
<select name="user_type">
    @foreach (\App\Enums\UserType::options() as $option)
        <option value="{{ $option['value'] }}">{{ $option['label'] }}</option>
    @endforeach
</select>
```

### 2. バリデーションで使う
```php
$request->validate([
    // 必須 + caseで定義した値を元に存在チェック
    'user_type' => ['required', Rule::in(array_column(UserType::cases(), 'value'))],
]);
```

### 3. モデルの属性キャストに使う

```php
// User.php
use App\Enums\UserType;

protected $casts = [
    'user_type' => UserType::class,
];
```

```php
$user = User::find(1);
echo $user->user_type->label(); // adminユーザーであれば「管理者」が出力される
```

## Tips
```php
// ラベル付き一覧を配列で取得
UserType::options();

// DB保存値からenumインスタンスへ
UserType::from('admin');

// enumからvalueを取得
$user->user_type->value;

// enumから日本語表示用のラベルを取得
$user->user_type->label();
```

## まとめ
Laravel × PHPの `Enum` を使うことで、以下のようなメリットがあると感じます。

- 定数の管理が一元化できて読みやすい
- 型安全になり、コーディングミスが減る
- Laravelのフォーム・バリデーション・モデルキャストと相性が良い

今までは`config`や`constant`というディレクトリに定数を置きがちでしたが、定数管理の方法の1つとして`Enum`も有効なので、今後も活用していきたいと思います。
# 🚀 MulmoCast：AI時代の新しいマルチモーダル・プレゼンテーションツール、Product Huntでローンチされた！

## はじめに ― Product Huntとは？

Product Hunt（プロダクトハント）は、世界中のクリエイターやスタートアップが新しいウェブサービス、アプリ、プロダクトを「発表」できるグローバルなコミュニティプラットフォームです。  
ユーザーは毎日投稿される最新プロダクトを発見・投票・コメントでき、SNS感覚で気になるアイデアや技術トレンドをいち早く知ることができます。

### 特徴
- 新サービスやアプリが毎日アップデート
- 世界中の開発者・クリエイター・投資家が集まる
- 投票（Upvote）やコメントでコミュニティから直接フィードバックを得られる
- 上位にランクインすれば短期間で大きな注目を集める（これを「Product Huntバンプ」とも呼ぶ）

---

## ローンチ（Launch）とは？

「ローンチ（Launch）」とは、**新しいプロダクトやサービスを一般公開すること**です。  
特にProduct Huntでは、サービスやアプリを初めて発表し、コミュニティからの投票・反応を受けることを「ローンチ」と呼びます。  
ローンチ当日にはSNSやメールでユーザーやサポーターを集め、**Upvote（投票）やコメントによってランキング上位を狙う**のが一般的な流れです。

#### Product Huntローンチのメリット
- 初期ユーザーやフィードバックを素早く獲得できる
- 海外メディアや投資家の目に留まりやすい
- 上位にランクインすれば、一気にアクセスや話題が広がる

---

# 🎉 MulmoCastとは？Product Huntで話題のマルチモーダル生成AIツール

## MulmoCastの概要

**MulmoCast**は、ウェブ記事や論文、ドキュメントをポッドキャスト、スライド、漫画、動画など、複数のメディア形式に自動変換できる**オープンソースのCLIツール**です。  
ChatGPTやClaude、gpt-image-1などの生成AIと連携し、これまで手作業だった情報変換を一括・高速化します。

- **2025年6月にProduct Huntでローンチ**
- ベータ版公開後すぐにコミュニティで話題に
- GitHubで活発に開発が続いている

---

## 主な特徴・できること

- **MulmoScript（JSON/YAML）でスクリプト管理**
  - ナレーター、テキスト、画像、レイアウトなどを一元定義
- **コマンド一発で各種アウトプット**
  - `mulmo audio`（ポッドキャスト生成）
  - `mulmo images`（イラスト・漫画化）
  - `mulmo movie`（動画変換）
  - `mulmo slideshow`（スライド作成）
  - `mulmo translate`（多言語化）
- **AIネイティブ設計**
  - PowerPointやGoogleスライドと違い、生成AIを最大限活用した「新しいプレゼン体験」を実現

---

## 開発背景とコミュニティの反響

MulmoCastは「情報発信や学習を、もっと多様なメディアで効率的に」という課題から生まれました。Product Huntでは開発者Satoshi Nakajima氏が直々に解説・フィードバック対応し、  
「画像の中のテキスト自動配置」や「多様なAIとの連携」など革新的な設計が高く評価されています。

実際の活用例としては、
- 学術やニュース記事を自動でポッドキャスト化
- 企業向け資料を即座にスライド＆解説動画へ変換
- 記事やアイデアをコミック形式でSNS拡散…など、使い方は多彩です。

---

## 今後の展望

- 完全オープンソースで商用利用も可能
- 今後はより直感的なGUIやWebアプリ化も期待
- AIモデルや出力パターンの拡張で「情報変換の自動化」をさらに推進

---

# まとめ

Product Huntは「世界中の最新プロダクト発見サイト」であり、ローンチは“公開デビューの日”。  
MulmoCastは、AI時代の情報発信・変換の効率を劇的に変える新ツールとしてProduct Huntで大きな注目を集めています。

プレゼンや発信を「よりラクに、より多様に」したいすべての人に、MulmoCastは必見のプロダクトです。

---

> **MulmoCastの詳細・インストール方法はProduct Hunt公式ページやGitHubをチェック！**  
> [MulmoCast on Product Hunt](https://www.producthunt.com/products/mulmocast?utm_source=twitter&utm_medium=social)  
> [MulmoCast CLI on GitHub](https://github.com/receptron/mulmocast-cli)

---

※本記事の内容は、ChatGPT4.1と共に生成結果と、公式GitHubリポジトリおよびProduct Huntに関する情報を参考にまとめています。
MulmoCastで動画作成の段階でエラーが出るトラブルについて議論した

**私**  
MulmoCastで音声までは作成できるのですが、動画作成の段階でエラーが出て先に進めません。  
表示されたエラーは以下です。

```
An unexpected error occurred: RateLimitError: 429 {"message":null,"type":"image_generation_user_error","param":null,"code":null}
```

---

**ChatGPT**  
エラー内容を確認すると「429 RateLimitError」となっています。  
これはAPIの利用回数制限（レートリミット）に引っかかっていることを意味します。

---

**私**  
レートリミットって何ですか？どうして起きるんですか？

---

**ChatGPT**  
レートリミットとは、短時間に大量のリクエストを送ることを防ぐための仕組みです。  
MulmoCastやOpenAIのAPIサーバー側で、主に次のような場合に発生します：

- サーバーに短時間でリクエストが集中したとき  
- 無料枠や有料プランの利用上限（リミット）を超えたとき  
- 画像生成や音声生成などを短期間に連続で実行したとき

---

**私**  
どうやって解決すればいいですか？

---

**ChatGPT**  
主な対応策は以下の通りです：

1. **時間を置いて再実行する**  
　数分〜数十分ほど待ってから、もう一度試してみてください。  
2. **APIキーやプランの状態を確認する**  
　OpenAIアカウントの管理画面で、利用状況やレート制限をチェックしましょう。  
3. **実行回数を減らす**  
　連続で大量にリクエストを送るのは控え、間隔をあけて実行してください。  
4. **mulmocastのキャッシュや履歴をクリアする**  
　ごくまれにローカルのキャッシュや履歴が影響している場合があります。一度キャッシュクリアやPCの再起動も効果的です。

> 💡 **補足：**  
> APIの利用状況を確認し、上限に達していない場合でも、サーバー側の一時的な混雑や、アカウント単位での制限がかかっている可能性もあります。

---

**私**  
APIにはまだ余裕があるみたいなのですが、やはり画像生成ができません。スクリプト自体は問題ないようです。どうしたら良いでしょうか？

---

**ChatGPT**  
はい、スクリプト自体は正しく生成できているので、  
**画像生成の部分以外はそのまま利用できます。**  
プレゼン資料や動画のテキスト部分だけ先に作成し、  
画像生成については時間を置いてから再チャレンジすることもおすすめです。

---

**私**  
ありがとうございました！また何かあれば相談します。

---

**ChatGPT**  
いつでもどうぞ！お困りの際はお気軽にご相談ください😊  
進捗がありましたら、また状況を教えてください！

---

## ポイントまとめ
- 「429 RateLimitError」は短時間の大量アクセスやサーバー混雑でも発生する
- APIの利用状況を確認し、リクエストを分散させることが重要   <- 自動実行のため悩み中
- スクリプトや成果物に問題なければ、そのままテキスト資料等で活用OK
- 一時的な現象も多いので、焦らず再挑戦してみましょう

結論：
現状では、再実行しかないが、MulmoCastのアップデートを待つしかないように思いました。
pythonのユーザー定義関数「(不定積分)sympyで変数1つのn階不定積分を教えて下さい。積分定数付きのユーザー定義関数で。」をAI先生ヘ。

# (本日の)ChatGPT先生へ
```
# 質問リスト（ユーザー投稿分のみ）
1. sympyで変数1つのn階不定積分を教えて下さい。積分定数付きのユーザー定義関数で。
2. 初期値が固定1つではありません。
3. x01つに固定できません。
4. F(a)やF(b)があります。
5. ValueError: 与えられた条件で積分定数が解けません（条件が不足 or 矛盾）　でます。
6. この記事中のすべての質問を含めた、Markdown形式の質問リストを出力して。
7. 私の質問だけ。本コメントも含めて。
8. 空白行を削除して。最後のコメントを含めて。
```
#### (以下回答抜粋)
>(途中抜粋)最後だけです。
>✅ デバッグのための簡易出力付きバージョン
```python
import sympy as sp

def nth_integral_with_conditions_multi_points_debug(expr, var, n, conditions):
    C = sp.symbols(f'C1:{n+1}')  # 積分定数
    F = expr
    for i in range(n):
        F = sp.integrate(F, var) + C[i]

    eqs = []
    for (point, deriv_order, val) in conditions:
        dF = F.diff(var, deriv_order)
        eq = dF.subs(var, point) - val
        print(f"条件: F^{deriv_order}({point}) = {val} → 式: {eq}")
        eqs.append(eq)

    sol = sp.solve(eqs, C, dict=True)
    if not sol:
        raise ValueError(f"\n条件が不十分または矛盾しています。\n"
                         f"定数 {C} に対する方程式系:\n" +
                         "\n".join([str(eq) for eq in eqs]))
    
    F_final = F.subs(sol[0])
    return sp.simplify(F_final)
```
>✅ 使用例（正しく動作するはずの例）
```python
x = sp.Symbol('x')
a, b = sp.symbols('a b')
f = x**2

conds = [
    (a, 0, 0),   # F(a) = 0
    (b, 1, 0)    # F'(b) = 0
]

res = nth_integral_with_conditions_multi_points_debug(f, x, 2, conds)
sp.pprint(res)
```

>✅ エラーが出る例（参考）
```python
conds = [
    (a, 0, 0),
    (a, 0, 1)  # 同じ F(a) に対して 2つの異なる値 → 矛盾
]
```

# Gemini先生へ

# copilot先生へ

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

https://qiita.com/mrrclb48z/items/b6351b48e47bcf6265c0

# いつもと違うおすすめです。
#### Qiita内
Salesforce 上でのftpのまとめ

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)

-------------

+ [FTPS write connector returns 425 and empty json file](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000Tkllu)

:::note
通信できてないみたい
:::
【Unity】TimelineのClipを生成した際の時間を設定する方法

# はじめに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608797/3d451f9e-f7b6-4406-9620-62b940c802d0.png)

UnityでTimelineを使用している際にClipを作成すると何もEditor拡張をしていない状態だと生成時間は5秒に設定されています。
このデフォルトの時間を好きな時間に変更する方法について解説します。

# ソースコード
今回使用したコードはこちらにあります。

https://github.com/ayaha401/Unity-Timeline-Clip-Default-Duration

# 方法1 durationをoverrideする
自作したClipは`PlayableAsset`を継承していると思います。
`PlayableAsset`には
```C#
public virtual double duration => PlayableBinding.DefaultDuration;
```
があり、こちらをoverrideすることで生成したタイミング時で好きな時間にできます。

```C#
public class PrefabClip : PlayableAsset
{
    [SerializeField]
    private GameObject prefabA;

    [SerializeField]
    private GameObject prefabB;

    [SerializeField]
    private GameObject prefabC;

    // 試しに1秒に設定する
    public override double duration => 1.0;

    public override Playable CreatePlayable(PlayableGraph graph, GameObject go)
    {
        return ScriptPlayable<PrefabBehaviour>.Create(graph);
    }
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608797/e94b4b13-41a5-4543-8c4c-cb1a8a4753b8.png)

この通り、1秒で作成されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608797/fe8a9154-d5a2-4102-8ca0-c0b0bcfddfe0.png)

しかし、このClipを横に伸ばすとクリックして選択した際に1秒以上の区間に**Hold**と表示がついてしまいます。

overrideする方法は手軽ですがこの設定を行う前とは別の見た目になってしまうので不便になるかもしれません。

# 方法2 Clipを作成した時点でdurationを決める

Editor拡張でClipを作成した時に好きな時間に設定します。

```C#
[CustomTimelineEditor(typeof(PrefabClip))]
public class PrefabClipEditor : ClipEditor
{
    private float _defaultDuration = 1.0f;

    public override void OnCreate(TimelineClip clip, TrackAsset track, TimelineClip clonedFrom)
    {
        base.OnCreate(clip, track, clonedFrom);

        // 作成するClipのDuration
        var createdClipDuration = clip.duration;

        // Unityのデフォルト時間ではない かつ 作ろうとしているClipの時間で無い場合はコピーしたClip
        if (createdClipDuration != TimelineClip.kDefaultClipDurationInSeconds && createdClipDuration != _defaultDuration)
        {
            clip.duration = createdClipDuration;
        }
        else
        {
            // コピーではない新規作成なので設定したい初期時間をSetする
            clip.duration = _defaultDuration;
        }
    }
}
```

`OnCreate`はClipを作成した時に呼ばれます。
こちらを使用し、Clipが作成されたタイミングで`clip.duration`に1.0を入れます。
しかし、その処理だけだとClipをコピーして貼り付けたときにコピーした時間ではなく、1.0で生成してしまうため

```C#
if (createdClipDuration != TimelineClip.kDefaultClipDurationInSeconds && createdClipDuration != _defaultDuration)
```
この処理でコピーしたClipかどうかを分岐します。
コピーしたClipである場合は`clip.duration`の時間はそのまま何もしないです。
コピーではない場合は新規作成になるので`clip.duration`に1.0を入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608797/38db75dc-18d6-4afe-89ba-93dfffddb85c.png)

この方法で作成されたClipは方法1の時のような**Hold**は表示されません。
独学でデータサイエンスを学ぶ_0/n歩目



## この記事は
「5年後にデータサイエンスを扱う職に就く」を目標に、独学で進めている人間の記事です。  
期間設定や目指す理由は割愛しますが、  
1. 0からどう学んでいったかの足跡を残したい  
2. 定期的に書き出して現状を振り返りたい  

そんな思いで書いています。  
いつかこの記事が、似た境遇の誰かの参考になれば嬉しいです。

---

## 現状
私の現状についてです。
- SEだが普段業務でプログラムやSQLなどは書いていない
- 趣味として競技プログラミングを始めた（良ければ下記記事をご参照ください）
    https://qiita.com/t_j_/items/6e76cab47dfb1fc5fb97
- 基本情報技術者を昨年取得したくらいの知識レベル

---

## 目指すレベル
「データサイエンティスト」で求人を出している企業が求めるレベルを、ひとまずゴールに設定しています。
- **統計検定準1級**
- **コンペの経験（Kaggleなど）**
- **機械学習モデルの開発経験**

これらの目標に対する現在の所感は以下の通りです。
- 統計検定は分かりやすい目標だと捉えている
- 逆にコンペ経験はどの程度を目安にするか悩み中。受賞を目指して本腰を入れなければならないのか？少なくとも複数回参加して、改善の模様をレポートに残してポートフォリオに加えたい
- 機械学習モデルの開発経験も今はまだゴールが見えないので、知識をつけながら具体的な目標を決めてく

## 今具体的に何をしているか
ゴールに向けて、しばらくは「**統計**」と「**機械学習**」の2分野で学習を進めます。

### 統計分野
下記Webサイトで学習を始めました。step0の基礎編を終えたところです。
https://bellcurve.jp/statistics/course/?srsltid=AfmBOoq7c4sPx-VZuFHtLk4dAStAW_a9BfW8mAZK_fDKrBbsimpdScy3
丁寧に説明されていて、統計検定2級の範囲までカバーされてるとのことです。

### 機械学習分野
まだ何も手を付けられていません。これからです。

---

## これからのロードマップ
ゴールに向けて何を行なっていく想定か、その中でも**次は何をやるか**を明確にします。  
分野は先の[今具体的に何をしているか](#今具体的に何をしているか)に則って二つに分けました。  
分野ごとに「**座学形式**」と「**実践形式**」で分けて、具体的に進める内容を整理します。  
どちらを先にやるかは決めず、必要に応じて進めていくつもりです。


### 統計分野
- **座学**
	- 統計WEB - 統計学の時間
    https://bellcurve.jp/statistics/course/?srsltid=AfmBOoq7c4sPx-VZuFHtLk4dAStAW_a9BfW8mAZK_fDKrBbsimpdScy3
	- データ分析に必須の知識・考え方 統計学入門
	https://www.kinokuniya.co.jp/f/dsg-01-9784802613194
- **実践**
	- Pythonブートキャンプ［データ分析コース］
	https://gihyo.jp/book/2025/978-4-297-14931-4

### 機械学習
- **座学**
	- ゼロから作るディープラーニング
	https://www.oreilly.co.jp/books/9784873117584/
	
- **実践**
	- 迷い中…まだ決められていません

---

## その他
根拠のない話ではありますが「**分野の本を20冊精読すればその技術の本質が掴める**」という説があります。
本記事のゴールとしては5年後の技術習熟を目指していますが、5年で40冊（統計と機械学習で20冊ずつ）は少ないか?とも思うので、ひとまず「**3年で40冊**」をもう一つ影の目標として据えてみます。

---

## 最後に

現状あまりにも進んでいません。5年という期間設定とゴールの高さには正直不安もありますが、やれることを一つずつやるしかない。  
幸い、現状の業務とは少しズレている分野なので、リフレッシュも兼ねて楽しく取り組めています。  
気負わず、でも着実に進めていきたいと思います。
pythonのユーザー定義関数「(辞書型キー)Python の辞書型キーの名前の変更後、並べかえのユーザー定義関数を教えて下さい。」をAI先生ヘ。

# (本日の)ChatGPT先生へ
```
# 質問リスト
1. Python の辞書型キーの名前の変更後、並べかえのユーザー定義関数を教えて下さい。
2. （補足）キーオーダーが無しで。
3. （補足）順序はコードの順番で。
4. rename_map = {
     '34': '➄',
     '31': '➁',
     '32': '➂',
     '42': '➃',
     '12': '➀'
   } を使いたい。
5. 小さい順に。
6. この記事中のすべての質問を含めた、Markdown形式の質問リストを出力して。
```
#### (以下回答抜粋)
>(途中抜粋)最後だけです。
>✅ ユーザー定義関数：rename_and_sort_keys
```python
def rename_and_sort_keys(d, rename_map):
    """
    辞書 d のキーを rename_map に従ってリネームし、
    変更後のキーを文字コード順（小さい順）にソートして返す。

    Parameters:
    - d (dict): 元の辞書
    - rename_map (dict): {"旧キー": "新キー"} 形式

    Returns:
    - dict: キーを変更・並べ替えた新しい辞書
    """
    # キーをリネーム
    renamed = {
        rename_map.get(k, k): v
        for k, v in d.items()
    }

    # 小さい順に並び替え（文字コード順）
    sorted_keys = sorted(renamed.keys())
    sorted_dict = {k: renamed[k] for k in sorted_keys}

    return sorted_dict
```
>🔧 使用例
```python
data = {
    '12': 100,
    '31': 200,
    '32': 300,
    '34': 400,
    '42': 500,
    '50': 600  # rename_map にないキー
}

rename_map = {
    '34': '➄',
    '31': '➁',
    '32': '➂',
    '42': '➃',
    '12': '➀'
}

new_data = rename_and_sort_keys(data, rename_map)
print(new_data)
```
>✅ 出力結果（小さい順：➀, ➁, ➂, ➃, ➄...）
```python
{'➀': 100, '➁': 200, '➂': 300, '➃': 500, '➄': 400, '50': 600}
```

# Gemini先生へ

# copilot先生へ

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

https://qiita.com/mrrclb48z/items/b6351b48e47bcf6265c0

# いつもと違うおすすめです。
#### Qiita内
【rails】ディシジョンテーブルテストを反映させてテストコードを書いてみた


## はじめに

こんにちは。アメリカ在住で独学エンジニアを目指している Taira です。

現在 Devise を用いて Rails アプリを作成中で、ようやく基本機能の実装が一通り終わりました。
その後、テストコードを記述していますが、テストは「漏れなく」かつ「最小限のコード」で書くことが重要です。

この記事では、そのためのテクニックとして学んだ「ディシジョンテーブルテスト」を実際に Todo モデルのテストに適用してみた例を紹介します。
ディシジョンテーブルを知らない方は以下の記事で書いてるので確認してから記事を見てみてください

https://qiita.com/Taira0222/items/4f19d1a803f87360627a

---

## テスト対象

今回は `Todo` モデルの scope についてテストを実施します。

```ruby
# models/todo.rb
class Todo < ApplicationRecord
  belongs_to :user

  scope :today, -> {
    where("due_at BETWEEN :start AND :end AND done = :done",
          start: Time.zone.today.beginning_of_day,
          end: Time.zone.today.end_of_day,
          done: false)
  }

  scope :upcoming, -> {
    where("due_at > :end_of_today AND done = :done",
          end_of_today: Time.zone.now.end_of_day,
          done: false)
  }

  scope :archived, -> {
    where("due_at < :start_of_today OR done = :done",
          start_of_today: Time.zone.now.beginning_of_day,
          done: true)
  }

  validates :title, presence: true, length: { maximum: 50 }
  validates :description, length: { maximum: 140 }
end
```

---

## ディシジョンテーブル

`scope` の分類基準は、`done` の真偽と `due_at` の日付で分けられます。これを元に、以下のディシジョンテーブルを作成しました。

| テストケース | done? | 日付   | scope 結果 |
| ------ | ----- | ---- | -------- |
| 1      | ○     | N/A  | archived |
| 2      | ×     | 今日   | today    |
| 3      | ×     | 明日以降 | upcoming |
| 4      | ×     | 昨日以前 | archived |

---

## テストコード

上記のテーブルを元に、次のような Minitest コードを書いています。

```ruby
require "test_helper"

class TodoTest < ActiveSupport::TestCase
  def setup
    @user = users(:user1)
  end

  test "should include today scope (decision table)" do
    today_todo = todos(:today)
    assert_includes Todo.today, today_todo
  end

  test "should include upcoming scope" do
    upcoming_todo = todos(:upcoming)
    assert_includes Todo.upcoming, upcoming_todo
  end

  test "should include archived scope (done or past)" do
    done_todo = Todo.create(
      user: @user,
      title: "done",
      description: "done",
      done: true,
      due_at: Time.zone.tomorrow
    )

    past_todo = Todo.create(
      user: @user,
      title: "yesterday",
      description: "yesterday",
      done: false,
      due_at: Time.zone.yesterday
    )

    assert_includes Todo.archived, done_todo
    assert_includes Todo.archived, past_todo
  end
end
```

---

## おわりに

ディシジョンテーブルを用いることで、漏れを防ぎつつ、無駄のないテストを立てることができました。

ビジネスロジックだけでなく、このようなソフトウェアテスト技法を活用して、開発の質を上げていけるよう学んでいきたいと思います。
GoogleCloud PCA資格の学習記録 - AI / ML編

## はじめに

Google CloudのPCA(Professional Cloud Architect)認定資格取得に向けて学習した内容を自分なりに整理します。Google Cloudのサービスに限らず、それを扱う上での関連知識についても触れています。
本記事は AI / ML編ということで、下記の要素を扱います。


* Vertex AI
    * モデル作成: AutoML
    * 大規模言語モデル: Generative AI Studio
    * 機械学習のトレーニング: 旧称 Google Cloud Machine Learning （Cloud ML Engine）
* Google Cloudが提供するAI関連のAPI群
    * Cloud Vision API
    * Speech-To-Text / Text-To-Speech API
    * Cloud Natural Language API
    * Cloud Translation API

:::note
この記事における「現在」や「最近」などの表現は、特に断らない限り2025年6月時点を指します
:::

## Vertex AI

* 機械学習モデルの構築からデプロイ、運用までを包括的にサポートするマネージドサービス
* トレーニング用データの管理、モデルのトレーニング、モデルのデプロイというパイプラインの管理を行う
* コードなしでモデルを構築するAutoMLと、ユーザー自信で定義したカスタムモデルの両方に対応
* 高度なカスタマイズを行えることが、後述のAPI群よりも有利な点
    * 逆に簡単な組込みAIであれば、API群が向いている

### モデル作成: AutoML

* コードなしでモデルを構築できる機能群
    * 画像分類、自然言語処理など
    * 内部ではTensorFlowベース
* データソースとしてCloud StorageやBigQueryを使用可能
    * Cloud Storageは、主に画像・動画・音声・非構造データの保存用
    * BigQueryは、構造化データの教師データを保持し、Vertex AIにわたす前の前処理を行うこともある

### 大規模言語モデル: Generative AI Studio

* PaLMやGeminiなどの大規模言語モデル（LLM）を使ったアプリ開発を支援するUIツール
* プロンプトのチューニングや評価などが可能
* デプロイしたモデルは、Cloud RunやCloud FunctionsなどにAPIとして組み込める


### 機械学習のトレーニング: 旧称 Google Cloud Machine Learning （Cloud ML Engine）

* 機械学習モデルのトレーニングに特化
    * モデルの監視・バージョン管理・再学習まで一元化している
* TensorFLow や PyTorch などのフレームワークに対応
    * TensorFlowはGoogleが開発したフレームワーク

## Google Cloudが提供するAI関連のAPI群

Vertex AIほど高度にカスタマイズするのではなく、簡単な組込みAIが欲しい場合にはAPI群が利用できる
これらはプリビルト（事前学習済み）なサービス

### Cloud Vision API

* 画像認識を行い、ラベル検出やOCR、顔検出などを行うためのAPI
* Cloud Storageの画像と連携し、Cloud Functionsでトリガー処理を自動化できる
* リアルタイムの処理が可能
    * 動画（を分割した画像）に対してのOCRなどを行いたい場合、現状ではVision APIのみが対応している
        * Cloud Video Intelligence APIはリアルタイム処理に対応していないため

### Speech-To-Text / Text-To-Speech API

* 音声を認識してテキスト情報にしたり、テキストから音声合成を行ったりするAPI
* 音声データはCloud Storageから取得する
* ストリーミング処理ではPub/SubやCloud Functionsと組み合わせる

### Cloud Natural Language API

* 自然言語処理（NLP）のためのAPI
    * テキストの構文解析、感情分析、エンティティ抽出などを行う
* REST APIベースでどこからも呼び出し可能
* Cloud Functionsなどから利用しやすい

### Cloud Translation API

* テキストの翻訳及び言語検出を行うAPI
    * 数十の言語をサポート
* WebアプリやCloud Runのマイクロサービスとの連携に適している
* Cloud Video Intelligence API
* 動画ファイルを分析して、ラベル検出やショット分割、顔や人物の検出、文字起こし（Speech-To-Text との連携）などを提供する
* 動画内のコンテンツを構造化する目的で利用される
* あくまで動画ファイルに対するバッチ処理（事後処理）を提供するものなので、ストリーミング動画やリアルタイム処理には非対応
* Cloud  Storage上の動画ファイルに対応
* 解析結果の構造化データはBigQueryに保存し、検索できる
材料力学「段付棒,段付きはり いろいろ」目次

・段付棒,段付き棒,段付きはり
・剛体もありますが、区別をしていません。


# 文献:不静定構造物の解法 
出版社 ‏ : ‎ 森北出版 (1993/4/1)

https://www.amazon.co.jp/%E4%B8%8D%E9%9D%99%E5%AE%9A%E6%A7%8B%E9%80%A0%E3%81%AE%E8%A7%A3%E6%B3%95-%E5%B9%B3%E5%B6%8B-%E6%94%BF%E6%B2%BB/dp/4627463804

https://www.morikita.co.jp/books/mid/046380

・ステキな表です。
　[表2-4 変断面ばり のたわみと傾斜角 p76](https://qiita.com/mrrclb48z/items/75b1d145c887eb6b4f8d)

# 文献:JSMEテキストシリーズ
#### 第3章 引張と圧縮
【練習問題】
【3.3】図3.25 段付棒の引張 p45
【3.7】Fig3.28 荷重を受ける段付棒 p45
【3.10】図3.31 両端が固定された断面の異なる棒 p46

#### 第4章 軸のねじり
【Example 4.6】Fig4.16 The stepped bar fiexed at each end and subjected to the torque p54
【練習問題】
【4.9】Fig4.32 段付棒のねじり p61
【4.10】図3.33 両端が固定され、材質が異なる軸のねじり p61

#### 第6章 はりの複雑な問題
【6.6】Fig6.44 Stepped beam p117
【6.17】図3.53 両端が固定された段付きはり p118

#### 第9章 エネルギー法
【Example 9.6】Fig9.11 The stepped bar subjected to the tprque p156

# いつもと違うおすすめです。
#### Qiita内

https://qiita.com/mrrclb48z/items/c3274daf5f7a99cfe027#:~:text=%E4%BD%9C%E6%A5%AD%E4%B8%AD%3A-,%E3%81%84%E3%82%8D%E3%81%84%E3%82%8D,-%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA(sympy)
Jotai - Reactの状態管理ライブラリ

## Jotaiとは
**Jotai**は、Reactアプリケーションのための軽量かつ柔軟な状態管理ライブラリ。  
非常にシンプルで使いやすく、必要な機能だけを組み合わせて使える。

## 基本構成
### atom
- 状態の最小単位を表すオブジェクト
- グローバルに状態を共有したいときなどに使える
- 状態の初期値を与えるだけで簡単に定義できる

```react
import { atom } from 'jotai';

const countAtom = atom(0); // atomを作成、初期値は0
```

### useAtom
- useState のように、状態と更新関数を返す
- atomをコンポーネント内で使用可能にするReactフック
- グローバルで定義されたatomにアクセス・更新できるようになる

```react
import { useAtom } from 'jotai';

const Counter = () => {
  const [count, setCount] = useAtom(countAtom);

  return (
    <div>
      <p>現在のカウント: {count}</p>
      <button onClick={() => setCount(count + 1)}>＋</button>
    </div>
  );
};
```
71歳の... ESP32-S3のUsbHost機能を使い、ワイアレスキーボードから文字入力できました

　ESP32-S3ボードに、ASCII文字を直接入力する方法がないかとネット上を探し、見つけました。作者に感謝いたします。

 https://github.com/tanakamasayuki/EspUsbHost
 
最初はコンパイルエラーなどあり、困りましたが結果できました。
　環境・構成・留意点は以下です。

    １．Windows 11 Pro
    ２．Arduino IDE 2.3.6
    ３．ボードは、FREENOVE ESP32-S3 WROOM N8R8 (8MB Flash)
         Arduino IDE上では「ESP32S3 Dev Module」
    ４．ライブラリマネージャーで「EspUsbHost」をインストール
        コンパイルエラーが出るので、スケッチフォルダー内に
        "EspUsbHost.h"と"EspUsbHost.cpp"を配置
    ５．USB Type-A メスコネクタを外付けし、それにUSBレシーバーを接続

![USB_HOST.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3189926/18ed427a-7d4f-4cd6-9d5a-b652c5d6cd68.jpeg)
　ボードとメスコネクタ間の接続は次のようにしました。

 |ESP32-S3|USB Type-A メスコネクタ||
 |---|---|---|
 |19(D+)|D-|逆では動かない|
 |20(D-)|D+|　同上|
 |5V|VBUS||
 |GND|GND||

　最初は反応せずダメかと思いましたが、`D+` と`D-`を逆にしたら大丈夫でした。ちなみに、「ESP32-S3-DevKitC-1」のピン配図はこうなってます。余ってたELECOM製ワイアレスキーボード(2.4GHz)が使えラッキーです。
　スケッチ自体はとてもシンプルですが、裏で動いているライブラリが凄いですね、私にはまったく理解できないです。Exampleのままですが、載せさせていただきます。

```c:EspUsbHostKeybord.ino
#include "EspUsbHost.h"

class MyEspUsbHost : public EspUsbHost {
  void onKeyboardKey(uint8_t ascii, uint8_t keycode, uint8_t modifier) {
    if (' ' <= ascii && ascii <= '~') {
      Serial.printf("%c", ascii);
    } else if (ascii == '\r') {
      Serial.println();
    }
  };
};

MyEspUsbHost usbHost;

void setup() {
  Serial.begin(115200);
  delay(500);

  usbHost.begin();
  usbHost.setHIDLocal(HID_LOCAL_Japan_Katakana);
}

void loop() {
  usbHost.task();
}
```
　これで、新たに何かできそうです。最後まで見ていただきありがとうございました。
なぜ私はRustを選んだのか 〜中学生低レイヤー開発者が語る言語の魅力〜


はじめまして！**中学生プログラマーのAqua** です！🚀

僕は普段、学校に通う傍ら、ちょっと「マニアック」って言われるかもしれないことに夢中です。それは、コンピュータのいちばん根っこにある**OS**、毎日使っている**Webブラウザ**、そしてウェブを動かしている**JavaScriptエンジン**を、自分の手でゼロから作り上げること！💻✨

「コンピュータってどう動いてるの？」「なんでWebサイトって表示されるの？」…そんな素朴な疑問を追いかけるうち、自分で作っちゃうのが一番早い！って思ったのが始まりです。

この壮大な挑戦の相棒として、僕が深く学び、心から信頼を置いているのが、**Rust**というプログラミング言語なんです。

Rustは「難しい」って言われることが多いけど、なぜ僕がこの言語を選び、低レイヤー開発においてその魅力を強く感じているのか、この記事で熱く語らせてください！🔥

---

### プログラミングへの探求心、そして低レイヤーの世界へ🚀

僕がプログラミングに出会ったのは、小学校の頃でした。初めて自分の書いたコードが、画面の中で動いた時のあの感動！💡 今でも忘れられない、僕のプログラミング人生の始まりです。

最初はScratchやPythonなんかで簡単なゲームを作ったり、JavaScriptでウェブサイトに動きをつけたりしていました。すごく楽しかったんですけど、だんだん「このアプリって、コンピュータの中じゃどうなってるの？」「インターネットって、一体どんな仕組みで動いてるの？」って、根っこにある部分に興味が湧いてきたんです。

その疑問を解決するには、**OSやWebブラウザ、JavaScriptエンジン**といった、コンピュータの「心臓」や「頭脳」の部分を理解するしかない！そう確信した時、僕の低レイヤー開発への挑戦が始まりました。

低レイヤーの世界では、ずっとC言語やC++が使われてきました。僕もこれらの言語に触れて、そのパワーを知った一方で、もっと安全で、もっと効率的に開発できる言語はないかなって探していたんです。そこで出会ったのがRustでした。✨

---

### Rustが持つ「3つの本質的な強み」✨

僕が低レイヤー開発の主軸としてRustを選んだ理由は、主にその「安全性」「パフォーマンス」「現代的な並行処理」という3つの本質的な強みにあります。これは、他の言語ではなかなか手に入らない、Rustならではの魅力なんです。

#### 1. 「安全性」がもたらす揺るぎない信頼感🛡️

コンピュータの深い部分を扱う開発では、ほんの小さなミスがシステム全体をクラッシュさせる大事故につながることがあります。特に**メモリの管理**は超複雑で、バグの温床になりやすいんです。

でも、Rustには **「所有権（Ownership）」** っていう、とんでもなく賢いシステムがあります。これが、コンパイルする段階でメモリに関するほとんどのバグ（例えば、間違った場所にアクセスしちゃったり、同時に色々な処理がデータを書き換えちゃったりする問題）を、実行する前に見つけてくれるんです！

以前、C言語でポインタのミスを見つけるのに何日もかかって、心が折れそうになったことがありました。でも、Rustを使い始めてからは、コンパイラがまるで先生みたいに「ここ危ないよ！」「こう直してみて！」って教えてくれるから、同じような低レベルなバグで悩むことが劇的に減りました。これは、僕のような学習中の開発者にとって、本当に大きな安心感なんです。**安心して複雑なコードに挑戦できる**って、すごいことだと思いませんか？

#### 2. 「パフォーマンス」が切り拓く無限の可能性🚀

Webブラウザの高速なウェブページ表示、JavaScriptエンジンの瞬時のコード実行…低レイヤーの領域では、 **「速さ」** がすべてです。数ミリ秒の遅れが、ユーザーの「あれ？」ってストレスにつながっちゃう。

Rustは、自動でメモリを片付ける「ガベージコレクタ」がない分、C++と同じくらい、いやそれ以上に**すっごく速く**動くことができるんです。余計な処理が入らないから、コンピュータの力を最大限に引き出せる。

僕が開発しているブラウザやJavaScriptエンジンでは、大量のデータを一瞬で処理したり、複雑な計算を高速で実行したりする場面がたくさんあります。Rustのこの**圧倒的なパフォーマンス**は、僕の野心的なプロジェクトを、机上の空論じゃなくて、本当に動くものにするための強力な基盤になっています。パフォーマンス面での妥協なく、理想を追い求められる点が、Rustの最大の魅力ですね。

#### 3. 「並行処理」の容易さと堅牢性🤝

OSはたくさんのアプリを同時に動かし、Webブラウザは複数のタブやバックグラウンドで動く処理をうまくさばいています。これが「並行処理」と呼ばれるもの。

並行処理って、実装がめちゃくちゃ難しいんです。間違えるとシステムが固まっちゃったり、変な動きをしちゃったり……。でも、Rustは、その安全性へのこだわりが、この並行処理の分野でも威力を発揮します。

所有権システムのおかげで、複数の処理が同時に同じデータにアクセスする際に起こりがちな「データ競合」を、コンパイルする段階でピシャリと防いでくれるんです。これにより、僕たちは**より安全に、そして直感的に並行処理を記述する**ことができます。

この特性は、自作OSのマルチタスク機能や、ブラウザでの複雑な非同期処理を設計する上で、僕に大きな安心感を与えてくれています。複雑な課題に怖がらずに挑戦できるのは、やっぱりRustが提供してくれる堅牢性のおかげだと感じています。

---

### Rustが僕に教えてくれたこと、そして未来への一歩👣

Rustの学習は、正直に言って簡単な道ではありませんでした。特に所有権の考え方は、最初は頭がこんがらがっちゃうこともありました。でも、それを乗り越えて理解した時の「あ、そういうことか！」っていう閃きと、その後の学びの深さは本当に大きいです。

Rustを学ぶことで、僕はプログラミング言語の仕組みや、コンピュータがどう動くのかという原理について、以前よりもずっと深く理解できるようになりました。これは、他の言語を学ぶ上でも、新しい技術を理解する上でも、かけがえのない基礎になっています。

Rustは今、WebAssembly（Wasm）の普及と共に、ウェブのフロントエンドからサーバー、そして僕が挑んでいるOSや組み込みシステムまで、あらゆる場所でその活躍の場を広げています。DiscordやDropbox、Amazon Web Servicesといった世界的な企業でも使われていて、これからの時代に間違いなく欠かせない言語になっていくと、僕は確信しています。

僕はこれからもRustを最高の相棒に、コンピュータの根源的な仕組みを追求し、自分の手で新しいものを創造し続けていきたいです。きっとそれは、未来のインターネットを少しでも良くすることに繋がるはず！

僕の記事が、少しでも皆さんのプログラミング学習のヒントになったり、Rustに興味を持つきっかけになったりすれば、これほど嬉しいことはありません。未熟者ではありますが、皆さんの温かいご意見やご感想、アドバイスをいただけると、本当に励みになります！

これからもどうぞよろしくお願いします！

---
SQSトリガーのLambda構成の再試行回数の検証

# 背景
SQSとLambdaの設定項目に再試行の設定値が存在せず、どういう仕組みで再試行しているのかが気になり今回検証を実施する。

# 検証
対象のSQS⇒Lambdaの構成のSQSにメッセージをコンソール上から流してみます。
流すメッセージはLambddaが期待した内容ではないため例外が発生するメッセージとなります。
SQSの設定とメッセージを流した際のLambda起動時のメッセージの内容です。

■ SQSの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893794/863cf16f-1cb8-4bbe-aa9f-76346aabf034.png)


■ CloudWatch Logsの起動メッセージ1個目
```json
{
    "Records": [
        {
            "messageId": "c7c5c3f6-e6d1-4d68-81aa-748d97b1d256",
            "receiptHandle":"",
            "body": "a",
            "attributes": {
                "ApproximateReceiveCount": "1",
                "SentTimestamp": "",
                "SenderId": "",
                "ApproximateFirstReceiveTimestamp": ""
            },
            "messageAttributes": {},
            "md5OfBody": "",
            "eventSource": "aws:sqs",
            "eventSourceARN": "",
            "awsRegion": ""
        }
    ]
}
```
■ CloudWatch Logsの起動メッセージ2個目
``` json
{
    "Records": [
        {
            "messageId": "",
            "receiptHandle": "",
            "body": "a",
            "attributes": {
                "ApproximateReceiveCount": "2",
                "SentTimestamp": "",
                "SenderId": "",
                "ApproximateFirstReceiveTimestamp": ""
            },
            "messageAttributes": {},
            "md5OfBody": "",
            "eventSource": "aws:sqs",
            "eventSourceARN": "",
            "awsRegion": ""
        }
    ]
}
```

起動メッセージから```ApproximateReceiveCount```が再試行するごとにカウントアップされています。
また、今回の実行数が2回ということから、下記のようなサイクルになっていると思われます。

**初回起動 ➡ Lambda失敗 ➡ 可視性タイムアウト(30秒経過) ➡ Lambda起動(2回目) ➡ Lambda失敗 ➡ 可視性タイムアウト(30秒経過) ➡ メッセージ削除(保存期間1分経過のため)**

実際、保存期間を2分に変更したら、4回実行されるようになりました。
また、可視性タイムアウトを1分にし、保存期間を2分にするとLambdaの実行すうは2回となりました。

# 検証結果
SQS → Lambda の再試行は、SQS 側の制御によって行われることが分かりました。具体的には、Lambda 関数がエラーを返すと、メッセージは削除されずに **可視性タイムアウト（Visibility Timeout）** が発生し、その後に再び Lambda に配信されます。

この再試行は、SQS の **保存期間（Retention Period）** を過ぎるか、**DLQ を設定していた場合は最大受信回数（maxReceiveCount）を超えるまで** 継続されます。

したがって、Lambda の再試行回数は直接設定できませんが、以下の項目で間接的に制御できます：

- **可視性タイムアウト（Visibility Timeout）**
- **保存期間（Message Retention Period）**
- **最大受信回数（maxReceiveCount）と DLQ の設定**

これにより、SQS における再試行の回数・タイミングはある程度コントロール可能です。
【Go】簡単なRSAによるデジタル署名のサンプルコードを書いてみた


## 概要

- [**暗号技術入門 第3版**](https://amzn.asia/d/4EzqngT)に出てきたRSAによるデジタル署名のサンプルコードを書いてみた
- それぞれの数値はなるべく最小にして計算の流れの理解を重視

## RSAデジタル署名の流れ

1. **公開鍵と秘密鍵を作る**
	- 2つの素数 p, q を決める
	- n = p × q
	- φ(n) = (p-1)(q-1)
	- 公開鍵 e を選ぶ（1 < e < φ(n), かつ互いに素）
	- 秘密鍵 d を計算する（e×d ≡ 1 mod φ(n)）
2. **署名する**
	- メッセージ m を用意
	- 署名 s = m^d mod n を計算
3. **検証する**
	- 検証値 v = s^e mod n を計算
	- v と元のメッセージ m が一致すれば正しい

## サンプルコード


```go
package main

import (
	"fmt"
)

const (
	p, q = 3, 5
)

// n = p * q 	
func generateN() int {
	n := p * q
	return n // 15 = 3 * 5
}

// φ(n) = (p-1)*(q-1) 
func generateL() int {
	l := (p - 1) * (q - 1)
	return l // 8 = (3-1)*(5-1)
}

// 1 < E < L
// gcd(E, L)
func generateE(l int) int {
	e := 2
	for e < l {
		if gcd(e, l) == 1 {
			break
		}
		e++
	}
	return e // 3
}

// gcd(E, L) = 1を満たしているかをチェック
func gcd(e, l int) int {
	for l != 0 {
		e, l = l, e % l
	}
	return e
}

// 1 < D < L
// E * D mod L = 1
func generateD(e, l int) int {
	d := 1
	for {
		if (e * d) % l == 1 {
			break
		}
		d++
	}
	return d // 3
}

// m^e mod n
func modExp(m, e, n int) int {
	result := 1
	for e > 0 {
		if e % 2 == 1 {
			result = (result * m) % n
		}
		m = (m * m) % n
		e /= 2
	}
	return result
}

func rsaSignature() {
	n := generateN()
	fmt.Println("N:", n)

	l := generateL()
	fmt.Println("L:", l)

	e := generateE(l)
	fmt.Println("E:", e)

	d := generateD(e, l)
	fmt.Println("D:", d)

	// N未満の数値を指定
	message := 8

	// 署名生成: s = m^d mod n
	signature := modExp(message, d, n) // 2 = 8^3 mod 15
	fmt.Println("メッセージ:", message)
	fmt.Println("署名:", signature)

	// 検証: v = s^e mod n
	verified := modExp(signature, e, n) // 8 = 2^3 mod 15
	fmt.Println("検証結果:", verified)

	if verified == message {
		fmt.Println("検証成功: メッセージが正しいです。")
	} else {
		fmt.Println("検証失敗: メッセージが改ざんされています。")
	}
}

```
[Linux] クロック設定_NTP, chrony, chronyc, /etc/chrony.conf

# chronyc コマンド

```terminal
$ chronyc [サブコマンド]
```

| サブコマンド           | 由来                   | 説明                                                  |
| :--------------- | :------------------- | :-------------------------------------------------- |
| default          | chrony client        | chrony デーモンと通信して、現在の時刻同期状態などを確認・制御するクライアントコマンド      |
| activity   | source activity   | オンライン/オフラインのNTPサーバの数を表示         |
| sources    | time sources      | 現在参照している NTP サーバの一覧と状態を表示 |
| sourcestats | source statistics | 現在参照している NTP サーバの統計情報を表示                |
| tracking    | clock tracking    | 現在参照している NTP サーバの時刻同期の情報表示    |

# /etc/chrony.conf
[解説](https://qiita.com/Jochun/items/6ac664fe2f41ef79e9c2#%E3%82%AF%E3%83%AD%E3%83%83%E3%82%AF%E8%A8%AD%E5%AE%9A-ntp)


# /etc/chrony.confの主な設定項目

| 設定項目        | 説明                                                                                                            |
| :---------- | :------------------------------------------------------------------------------------------------------------ |
| `server`    | 時刻同期を行うNTPサーバを指定<br>例：`server ntp.nict.jp iburst`<br>一方向の同期関係               |
| `peer`      | 時刻同期を行うNTPサーバを指定<br>例：`peer 192.168.0.10 iburst`<br>双方向の同期関係 |
| `pool`      | 時刻同期を行うNTPサーバのプール（集合）を指定<br>例：`pool ntp.nict.jp iburst`                             |
| `driftfile` | システムクロックのドリフト（ズレ）を保存するファイルのパス指定<br>例：`driftfile /var/lib/chrony/drift`                                        |
| `rtcsync`   | システムクロックの時刻を、定期的にハードウェアクロックに反映（`hwclock --systohc` 相当）                                                        |


# 補足：NTPパッケージ
- CentOS, RHEL: `ntp` パッケージ（`/etc/ntp.conf` を読み込み）
- Ubuntu: `ntp` パッケージ（`/etc/ntp.conf` を読み込み）
- CentOS 8 以降: `chrony` パッケージ(`/etc/chrony.conf` を読み込み)


# 参考リンク
- [[Linux][directory] ディレクトリ一覧_LPIC-1 102](https://qiita.com/Jochun/items/6ac664fe2f41ef79e9c2#%E3%82%AF%E3%83%AD%E3%83%83%E3%82%AF%E8%A8%AD%E5%AE%9A-ntp)

# Ping-t
- [5081_/etc/chrony.conf](https://mondai.ping-t.com/question_subjects/32/question_sessions/34000185/progressing_questions/520498140)
- [5083_/etc/chrony.conf, peer](https://mondai.ping-t.com/question_subjects/32/question_sessions/33866047/progressing_questions/518453904)
- [5084_/etc/chrony.conf, driftfile](https://mondai.ping-t.com/question_subjects/32/question_sessions/33867186/progressing_questions/518471885)
- [5150_/etc/chrony.conf, pool](https://mondai.ping-t.com/question_subjects/32/question_sessions/34000185/progressing_questions/520498151)
- [5087_chronyc, sources](https://mondai.ping-t.com/question_subjects/32/question_sessions/34000185/progressing_questions/520498138)
- [5089_chronyc, tracking](https://mondai.ping-t.com/question_subjects/32/question_sessions/33866047/progressing_questions/518453905)
[初心者向け]最低限これだけ覚えれば使える！簡単vimコマンドまとめ

### [初心者向け]最低限これだけ覚えれば使える！簡単vimコマンドまとめ
vimは軽量で高機能なエディタですが、初めて触ると「キー操作が多くて難しそう...」と思う方も多いのではないでしょうか？

この記事では、最低限覚えておけば使えるVimの基本操作を、分かりやすくまとめました。まずはここから始めて、少しずつ慣れていきましょう！
(この記事もvimでテキストに書いたものをコピペしています。)

#### Vimの起動と終了
起動　vim text.txt #ファイルを開く(新規作成も可能)
・i:挿入モード(入力開始)
・ESC:ノーマルモード(コマンド入力に戻る)
#### 保存と終了
・:w:保存
・:q:終了
・:wq:保存して終了
・:q!:保存せずに強制終了
#### 基本操作まとめ
| コマンド | 説明 |
|----------|------------------------------|
| `h`      | 左に移動 |
| `j`      | 下に移動 |
| `k`      | 上に移動 |
| `l`      | 右に移動 |
| `G`      | ファイルの一番下へ移動 |
| `gg`     | ファイルの一番上へ移動 |
| `x`      | カーソル位置の一文字を削除 |
| `dd`     | 行全体を削除 |
| `d`     　| 複数行を削除 |
| `yy`     | 行をコピー |
| `y`     　| 複数行をコピー |
| `p`      | コピーや削除した行を貼り付け |
| `u`      | 直前の操作を元に戻す |
| `v`      | 行をまとめて選択 |
| `/文字列`| 文字列を検索（`n` で次を検索） |
| `:`      | コマンドラインモード |

#### よくある使い方の流れ
1.vim text.txt ＃ファイルを開く
2.i            ＃挿入モードに入る
（テキストを入力）
3.ESC          ＃ノーマルモードに戻る
4.:wq          ＃保存して終了

#### まとめ
vimは最初こそ操作に戸惑うかもしれませんが少し使ってみるだけでかなり効率的にテキスト編集ができるようになります。
今回紹介したコマンドだけで「開く → 編集 → 保存 → 終了」という一連の作業は問題なくこなせます。
まずはこの基本を手に覚えさせてVimに慣れていきましょう。
Qiitaデビュー！！中学生のプログラミング挑戦記

## はじめまして！中学生プログラマーのAquaです！

普段は学校に通っている**現役中学生プログラマー**です。プログラミングの学習や、自分で何かを作ることに夢中で、今回、自分のアウトプットの場としてQiitaを選んでみました。

僕の記事を読んで、少しでも誰かの役に立ったり、「プログラミングって面白そうだな」って思ってもらえたりしたら嬉しいです！

---

## プログラミングとの出会いと、これまでの歩み

僕がプログラミングに興味を持ったのは、中学1年の時でした。Scratchで自分で作ったものが自分の思うように動くという感動が、僕のプログラミング人生の始まりです。

最初はPythonから始めて、ProgateやQiitaなどの記事を読んだりして勉強してきました。

これまでにPython、Javascript、Rust、C++など、たくさんの言語に触れてきました。

---

## 今、僕が夢中になっていること

今、僕が最も情熱を注いでいるのは、**OS、Webブラウザ、JavaScriptエンジンの自作**です。

「コンピュータってどうやって動いているんだろう？」「Webサイトってどうやって表示されているんだろう？」「JavaScriptって、一体どうやって動くんだろう？」――そんな疑問が尽きなくて、だったら**自分で作ってみよう！** と思い立ったのがきっかけです。

主に**Rust**という言語を使って開発を進めています。Rustは「安全で速い」という特徴があって、OSやブラウザのように、コンピュータの根っこの部分を触るのにぴったりなんです。

* **自作OS**：今はまだごく基本的な部分ですが、コンピュータが立ち上がって最初に動く「ブートローダ」や、メモリを管理する仕組みなどを試行錯誤しながら書いています。
* **自作Webブラウザ**：ウェブページを表示するためのレンダリングの仕組みや、インターネットの向こう側と通信する部分などを学んでいます。いつか自分の作ったブラウザで、Qiitaの記事を見ることが目標です！
* **Rust製JavaScriptエンジン**：JavaScriptのコードがどのように解釈され、実行されるのかを知るために、シンプルなJavaScriptエンジンをゼロから作っています。

どれもとても難しい挑戦ですが、一つ一つの仕組みを理解し、自分の手でコードを書いて動かせた時の達成感は、何物にも代えがたいです。

---

## 今後の目標と、Qiitaで発信したいこと

今後の目標は、もちろん**自作OS、ブラウザ、JavaScriptエンジンの開発を進めること**です。それぞれのプロジェクトで、もっと複雑な機能や、より効率的な仕組みを実装できるようになりたいです。

Qiita/Zennでは、主に次のことについて発信していこうと思っています。

* **自作OS/ブラウザ/JSエンジンの開発記録**：開発中にハマったこと、解決策、新しく学んだ技術など
* **学んだ技術の解説**：例えばRustの特定の機能や、低レイヤープログラミングの基礎知識など
* **エラー解決の体験談**：僕が遭遇したエラーと、その解決までの道のり

まだまだ未熟者ですが、これからたくさんのことを学び、経験を積んでいきたいです。

温かい目で見守っていただけると嬉しいです。もし、僕の記事を読んで「こんなこと教えてほしい！」「ここがわからない！」といったコメントや、アドバイスなどがあれば、ぜひお気軽に声をかけてください！

これからどうぞよろしくお願いします！

---
コード

Sub CreateGraph()

Dim ch As Chart

Set ch = ActiveSheet.Shapes.AddChart2(240, xlXYScatterLines).Chart 'chという変数に散布図の直線という情報を入れている。

Dim lastRow As Long

lastRow = Cells(Rows.Count, "A").End(xlUp).Row '最終行数を取得(データが20行あるなら20という数値が入る)

Dim seriesIndex As Long

seriesIndex = 1                                 '何セットあるかを管理。データが20行あり棒線が10個あるなら、seriesIndexは1～10へと変化していく。

'ここで1行目から最終行までループ。A1,A2とB1,B2、A3,A4とB3,B4…という感じに2づつ増えて繰り返している

Dim i As Long

For i = 1 To lastRow Step 2

    ch.SeriesCollection.NewSeries                                                   'SeriesCollection.NewSeriesでグラフを追加できるらしい？

    ch.SeriesCollection(seriesIndex).XValues = Range("A" & i & ":A" & i + 1)        '最初はch.SeriesCollection(1)となり、棒線1つ目ってこと。X軸の範囲はA1:A2

    ch.SeriesCollection(seriesIndex).Values = Range("B" & i & ":B" & i + 1)         '最初はch.SeriesCollection(1)となり、棒線1つ目ってこと。Y軸の範囲はB1:B2

    ch.SeriesCollection(seriesIndex).MarkerStyle = xlMarkerStyleNone                '座標の点を非表示

    ch.SeriesCollection(seriesIndex).Format.Line.ForeColor.RGB = RGB(0, 112, 192)   'グラフの色を全部標準の青色に設定

    seriesIndex = seriesIndex + 1                                                   'ここまでやって棒線1つ目終了。次は2つ目の棒線を追加したいので+ 1する。最初から同じ作業

Next i

'ループのコードはここまで。データが20行あるなら、iが20まで進めば終了

ch.ChartTitle.Text = ""   'ここに文字を入れれば表に題名が付く。例：ch.ChartTitle.Text = "電圧グラフ"

End Sub
[Linux] システムログ設定_syslog, rsyslog, syslog-ng, /etc/rsyslog.conf,  ファシリティ, プライオリティ

# システムログを取得し処理するソフトウェア
- syslog
- rsyslog
- syslog-ng

# ファシリティ（Facility）

| ファシリティ名           | 用途・説明                                  |
| :---------------- | :------------------------------------- |
| `auth`            | 認証メッセージ（`login`, `su`, `getty`など）   |
| `authpriv`        | 認証メッセージ（セキュリティ重視）    |
| `cron`            | `cron` や `at` に関するジョブスケジューラのメッセージ      |
| `daemon`          | 汎用デーモンのログ（`ntpd`, `cupsd`など）           |
| `kern`            | カーネルからのメッセージ（ユーザースペースからは生成不可）          |
| `lpr`             | 印刷関連のログ                                |
| `mail`            | メール関連プログラムのログ（`sendmail`, `postfix`など） |
| `syslog`          | `syslogd` 自体のメッセージ                     |
| `user`            | 一般ユーザーのアプリケーションからのログ                   |
| `local0`-`local7` | カスタム用途（アプリケーションや管理者用に自由に使用可能）          |

# プライオリティ（Priority）

| プライオリティ名  | レベル | 説明                                   |
| :-------- | :-- | :----------------------------------- |
| `emerg`   | 0   | 緊急：全ユーザーに通知すべきシステムダウンレベルの障害          |
| `alert`   | 1   | 即時対応が必要な障害（例：データベース障害など）             |
| `crit`    | 2   | 重大な障害（例：ハードディスク故障）                   |
| `err`     | 3   | エラー（recoverable な問題、通常のアプリケーション障害など） |
| `warning` | 4   | 警告（今後問題になりうる状態）                      |
| `notice`  | 5   | 注意すべき正常動作（例：設定変更、状態変化など）             |
| `info`    | 6   | 情報（通常動作に関する記録）                       |
| `debug`   | 7   | デバッグ用詳細情報                            |



# 書式例（/etc/rsyslog.conf）

```conf:/etc/rsyslog.conf
authpriv.*                          /var/log/secure
mail.err                            /var/log/maillog
cron.*                              /var/log/cron
*.info;mail.none;authpriv.none      /var/log/messages
```


# Ping-t
- [4802_書式](https://mondai.ping-t.com/question_subjects/32/question_sessions/33867186/progressing_questions/518471890)
- [4961_全般](https://mondai.ping-t.com/question_subjects/32/question_sessions/33867186/progressing_questions/518471884)
- [5047_ファシリティ_daemon, kern, local0](https://mondai.ping-t.com/question_subjects/32/question_sessions/33866047/progressing_questions/518453903)
- [5048_ファシリティ](https://mondai.ping-t.com/question_subjects/32/question_sessions/33867186/progressing_questions/518471887)
- [36680_ファシリティ_mail, local3](https://mondai.ping-t.com/question_subjects/32/question_sessions/34000185/progressing_questions/520498137)