OmniAICreator/Qiita-1.07M huggingface dataset:
C 言語の qsort() について

# はじめに

昔から `qsort()` がいまいちよくわかっていなかったので勉強しなおしました。

# qsort 関数とは

qsort 関数は `stdlib.h` に保存されています。

```c
#include <stdlib.h>

void qsort(
    void *base, 
    size_t number, 
    size_t size, 
    int (*comparison_function)(const void *n1, const void *n2)
);
```
## 引数

- `base`：ソート対象の配列のポインタ
- `number`：配列の長さ
- `size`：配列の要素のバイト単位の長さ。例えば int 配列なら `sizeof(int)` を指定する。
- `comparison_function`：比較関数のポインタ。`n1` が `n2` より前、等しい、後ろの場合にそれぞれ負の値、0、正の値を返す必要がある。

# 単純な配列のソート

```c
#include <stdio.h>
#include <stdlib.h>
#define N 10

int comp_ints(const void *vxp, const void *vyp)
{
    int* xp = (int*) vxp;
    int* yp = (int*) vyp;
    return *xp - *yp;  
}

int main(void)
{
    int i, array[N] = {5, 9, 2, 7, 4, 0, 8, 1, 6, 3};

    qsort(array, N, sizeof(int), comp_ints);

    for(i = 0; i < N; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");

    return 0;
}
```

qsort 関数は実装時点では比較対象の構造が決まっていないので、比較関数へ渡すポインタ `vxp` `vyp`は void 型である。そのためこれを `int` 型のポインタへキャストする必要がある。それが、`xp` `yp` である。

```txt
0 1 2 3 4 5 6 7 8 9
```

# 構造体のソート

```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 5

// 生徒構造体
typedef struct {
    int roll_no; // 出席番号
    char name[50]; // 氏名
} Student;

// 比較関数（出席番号順にソート）
int comp_roll_no(const void* vxp, const void* vyp)
{
    Student* xp = (Student*) vxp;
    Student* yp = (Student*) vyp;
    return xp->roll_no - yp->roll_no;
}

int main()
{
    Student students[N] = {
        {5, "Alice"},
        {3, "Bob"},
        {1, "Charlie"},
        {4, "Diana"},
        {2, "Eve"}
    };
    int i;

    printf("ソート前:\n");
    for(i = 0; i < 5; i++) {
        printf("出席番号: %d,\t氏名: %s\n", students[i].roll_no, students[i].name);
    }

    qsort(students, N, sizeof(Student), comp_roll_no);

    printf("\nソート後:\n");
    for(i = 0; i < N; i++) {
        printf("出席番号: %d,\t氏名: %s\n", students[i].roll_no, students[i].name);
    }

    return 0;
}
```

アロー演算 `xp->roll_no` は、`(*xp).roll_no` と等価である。

```txt
ソート前:
出席番号: 5,    氏名: Alice
出席番号: 3,    氏名: Bob
出席番号: 1,    氏名: Charlie
出席番号: 4,    氏名: Diana
出席番号: 2,    氏名: Eve

ソート後:
出席番号: 1,    氏名: Charlie
出席番号: 2,    氏名: Eve
出席番号: 3,    氏名: Bob
出席番号: 4,    氏名: Diana
出席番号: 5,    氏名: Alice
```
SDNのコントロールプレーン

# 論理的に集中管理されたソフトウェア制御

# SDNの基本的な技術コントロールプレーン
>SDNの基礎となる主な技術的アイデアの一つは、ルーターとは別に、しばしば単一の論理的に集中化されたプログラムとして動作するコントロール・プレーンである。

### コントロールプレーンはネットワーク通信における計算、更新を行う
>典型的には、SDN制御プログラム（時には「コントローラ」と呼ばれる）は、ルーターに変わってネットワークを通る経路を計算し、リモートで結果の転送テーブルを更新するような制御ロジックを担当している。と言える。

### バージョン管理し、プッシュして設定する
>SDNはこれまでも実際に存在していた。ルーターは設定可能で、多くの大規模ネットワークはしばしばルーターの設定を中央のデータベースから自動生成し、それをバージョン管理し、スクリプトでルーターにそれらの設定をプッシュしていた。

### 技術的にはオペレータに対して制御を与えているだけ
>学術的な意味では、この種の設定はSDNと呼ばれるかもしれないが、技術的に言えばこの種の設定はトラフィックがネットワークを通じてどのように転送されるかについてオペレーターに限られた制御を与えているだけである。

# SDNの初期研究では直接制御
>ソフトウェア定義ネットワークの初期の研究は、ネットワークの各ルーターが選択するルートを、ネットワーク構成パラメータの間接的なチューニングに頼るのではなく、`直接制御することによって、ネットワーク運用者がトラフィック・エンジニアリングの仕事を容易に実行できる`ようにすることを目的としていた。

### SDNの実証例
>RCP(Routing Control Platform:ルーティング制御プラットフォーム）であり、これはその後、`トラフィックの負荷分散とサービス拒否攻撃からの防御のためにバックボーン・ネットワーク`に展開された。その後、Ethaneと呼ばれるシステムが開発され、ソフトウェアによる集中制御でネットワーク内のホストを認証している。
* バックボーン・ネットワークとは

https://qiita.com/masatom86650860/items/07fc108c770c85a6e958

# スイッチ・メモリに直接書き込むことができるOpenFlow
>プログラマブルなコントロール・プレーンを通してスイッチをより柔軟にする便利なバックドアがあった。多くのネットワーク・スイッチは共通のBroadcomチップセットに依存しており、その`チップセットはスイッチに直接書き込むことができるインターフェース`を持っていた。このインターフェースをソフトウェア・プログラムとして公開し、最終的にOpenFlowと呼ばれるプロトコルを開発した。
* Broadcomチップセットとは？
>ブロードコム（英語: Broadcom Inc.）は、無線（ワイヤレス、ブロードバンド）および通信インフラ向けの半導体製品、ソフトウェアなどを製造販売するファブレス企業。


https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%AD%E3%83%BC%E3%83%89%E3%82%B3%E3%83%A0#:~:text=%E3%83%96%E3%83%AD%E3%83%BC%E3%83%89%E3%82%B3%E3%83%A0%EF%BC%88%E8%8B%B1%E8%AA%9E%3A%20Broadcom%20Inc.%EF%BC%89%E3%81%AF%E3%80%81%E7%84%A1%E7%B7%9A%EF%BC%88%E3%83%AF%E3%82%A4%E3%83%A4%E3%83%AC%E3%82%B9%E3%80%81%E3%83%96%E3%83%AD%E3%83%BC%E3%83%89%E3%83%90%E3%83%B3%E3%83%89%EF%BC%89%E3%81%8A%E3%82%88%E3%81%B3%E9%80%9A%E4%BF%A1%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E5%90%91%E3%81%91%E3%81%AE%E5%8D%8A%E5%B0%8E%E4%BD%93%E8%A3%BD%E5%93%81%E3%80%81%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AA%E3%81%A9%E3%82%92%E8%A3%BD%E9%80%A0%E8%B2%A9%E5%A3%B2%E3%81%99%E3%82%8B%E3%83%95%E3%82%A1%E3%83%96%E3%83%AC%E3%82%B9%E4%BC%81%E6%A5%AD%E3%80%82

### OpenFlowの機能
>当初、このプロトコルは、非常にシンプルなインターフェースをサポートしていた。`シンプルなマッチ・アクション・テーブルとして機能する連想メモリに書き込み`を行うものであった。

### マッチ・アクション・テーブルを使ってパケットに対する処理を実行する
>スイッチはパケット・ヘッダーの一つ以上のフィールド（MACアドレス、IPアドレスなど）に一致するパケットを認識し、`パケットを特定のポートにフォワードするか、破棄するか、経路外のソフトウェア・コントローラに送る`か、など、一連なの可能なアクションの一つのを実行することができた。

* ポートにフォワードするとは？

https://qiita.com/masatom86650860/items/162749161738d005d801

### OpenFlowの後のバージョンによってプログラマに対して新たなサポートが必要になった。
>OpenFlowの後のバージョンでは、テーブルのチェーンを含む複雑な操作が追加されたが、これらの標準を実装したベンダーはごく僅かであった。`これらのタイプのマッチングにANDやORの論理式を表現することは、特にプログラマにとって少し厄介`なことが判明し、`プログラマがより複雑な条件を組み合わせを簡単に表現できるようにする技術がいる`ようになった。

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/

# 感想
SDN,OpenFlowに対して何も知らないのでなんとかこじ開けて理解したい。
RESTful APIのエンドポイント設計

RESTful APIのエンドポイント設計は、リソース指向のアプローチに基づいて行われます。以下に、典型的なエンドポイント設計のサンプルを示します。ここでは、ユーザー（Users）と記事（Articles）という2つのリソースを例にとります。

## 1. ユーザー（Users）リソースのエンドポイント設計
### 1.1 ユーザーの一覧を取得
HTTPメソッド: GET
エンドポイント: /users
説明: すべてのユーザーの一覧を取得する。
```
GET /users
```
### 1.2 特定のユーザーを取得
HTTPメソッド: GET
エンドポイント: /users/{userId}
説明: 特定のユーザーの詳細を取得する。
```
GET /users/123
```
### 1.3 新しいユーザーを作成
HTTPメソッド: POST
エンドポイント: /users
説明: 新しいユーザーを作成する。
```
POST /users
```

リクエストボディ（例）:
```
{
  "name": "John Doe",
  "email": "john.doe@example.com"
}
```

### 1.4 特定のユーザーを更新
HTTPメソッド: PUT
エンドポイント: /users/{userId}
説明: 特定のユーザーの情報を更新する。
```
PUT /users/123
```
リクエストボディ（例）:
```
{
  "name": "John Doe",
  "email": "john.doe@example.com"
}
```
### 1.5 特定のユーザーを部分的に更新
HTTPメソッド: PATCH
エンドポイント: /users/{userId}
説明: 特定のユーザーの情報を部分的に更新する。
```
PATCH /users/123
```
リクエストボディ（例）:
```
{
  "email": "john.newemail@example.com"
}
```
### 1.6 特定のユーザーを削除
HTTPメソッド: DELETE
エンドポイント: /users/{userId}
説明: 特定のユーザーを削除する。
```
DELETE /users/123
```
## 2. 記事（Articles）リソースのエンドポイント設計
### 2.1 記事の一覧を取得
HTTPメソッド: GET
エンドポイント: /articles
説明: すべての記事の一覧を取得する。
```
GET /articles
```
### 2.2 特定の記事を取得
HTTPメソッド: GET
エンドポイント: /articles/{articleId}
説明: 特定の記事の詳細を取得する。
```
GET /articles/456
```
### 2.3 新しい記事を作成
HTTPメソッド: POST
エンドポイント: /articles
説明: 新しい記事を作成する。
```
POST /articles
```
リクエストボディ（例）:
```
{
  "title": "New Article",
  "content": "This is the content of the new article.",
  "authorId": 123
}
```
### 2.4 特定の記事を更新
HTTPメソッド: PUT
エンドポイント: /articles/{articleId}
説明: 特定の記事の情報を更新する。
```
PUT /articles/456
```
リクエストボディ（例）:
```
{
  "title": "Updated Article",
  "content": "This is the updated content of the article."
}
```
### 2.5 特定の記事を部分的に更新
HTTPメソッド: PATCH
エンドポイント: /articles/{articleId}
説明: 特定の記事の情報を部分的に更新する。
```
PATCH /articles/456
```
リクエストボディ（例）:
```
{
  "title": "Partially Updated Article"
}
```
### 2.6 特定の記事を削除
HTTPメソッド: DELETE
エンドポイント: /articles/{articleId}
説明: 特定の記事を削除する。
```
DELETE /articles/456
```
## 3. ネストされたリソースのエンドポイント設計
### 3.1 特定のユーザーの記事一覧を取得
HTTPメソッド: GET
エンドポイント: /users/{userId}/articles
説明: 特定のユーザーが作成した記事の一覧を取得する。
```
GET /users/123/articles
```
### 3.2 特定のユーザーの記事を作成
HTTPメソッド: POST
エンドポイント: /users/{userId}/articles
説明: 特定のユーザーが新しい記事を作成する。
```
POST /users/123/articles
```
リクエストボディ（例）:
```
{
  "title": "New Article by User",
  "content": "This is the content of the new article by the user."
}
```
これらのエンドポイント設計は、RESTful APIの基本的なパターンを示しています。リソースの操作（作成、取得、更新、削除）に対応するHTTPメソッドを適切に使用し、リソースの階層構造をURLで表現することが重要です。
ゼロから始める curl 入門：基本コマンドと使い方ガイド

### **cURL（カール）とは何か？**
**cURL**（コマンドラインURL）は、コマンドラインやスクリプトからHTTP/HTTPSなどのプロトコルを使ってデータを送受信するためのツールです。Web APIをテストしたり、ファイルをダウンロードしたりするのに便利です。

---

### **基本的なcURLの使い方**  
まずは最も基本的なコマンドから始めましょう。

#### 1. **URLのデータ取得**
```bash
curl https://example.com
```
- **動作**: 指定したURLのデータを取得して、ターミナルに出力します。
- **例**: ウェブページのHTMLコードを確認。

#### 2. **ファイルのダウンロード**
```bash
curl -O https://example.com/file.zip
```
- **`-O`**: URLから取得したファイルをそのまま保存します。

#### 3. **ファイル名を指定して保存**
```bash
curl -o custom_name.zip https://example.com/file.zip
```
- **`-o`**: 保存時に任意のファイル名を指定。

---

### **進んだ使い方: Web APIとcURL**
APIを使う際に、GETやPOSTリクエストを送信します。

#### 1. **GETリクエスト**
```bash
curl -X GET https://api.example.com/data
```
- **`-X GET`**: 明示的にGETリクエストを指定（省略可能）。
- **例**: APIからデータを取得。

#### 2. **POSTリクエスト**
```bash
curl -X POST -d "key=value&key2=value2" https://api.example.com/data
```
- **`-d`**: データ（フォームのような形式）を送信。
- **例**: ユーザー情報の登録。

#### 3. **JSON形式のデータ送信**
```bash
curl -X POST -H "Content-Type: application/json" -d '{"key":"value"}' https://api.example.com/data
```
- **`-H`**: ヘッダー情報を指定。`Content-Type: application/json`はJSONデータ送信時に必須。
- **例**: Web APIにJSON形式のリクエストを送信。

#### 4. **ヘッダー情報の取得**
```bash
curl -I https://example.com
```
- **`-I`**: ヘッダー情報のみを取得。

#### 5. **認証付きリクエスト**
```bash
curl -u username:password https://api.example.com/data
```
- **`-u`**: ユーザー名とパスワードを指定（Basic認証）。

---

### **実用的なcURLの例**
#### 1. **REST APIを使ったデータ取得**
```bash
curl -X GET -H "Authorization: Bearer YOUR_TOKEN" https://api.example.com/data
```
- **`Authorization: Bearer`**: APIトークン認証でよく使う形式。

#### 2. **ファイルをアップロード**
```bash
curl -X POST -F "file=@path/to/yourfile.jpg" https://example.com/upload
```
- **`-F`**: ファイルをフォームデータとして送信。

#### 3. **リクエストとレスポンスをログに出力**
```bash
curl -v https://example.com
```
- **`-v`**: 詳細なログ（通信内容）を表示。

---

### **エラーとデバッグ**
- **`--fail`**: エラー時にエラーメッセージを出力。
- **`-w`**: リクエスト時間やHTTPステータスを表示。
- **`--retry`**: 接続失敗時に再試行。
  
例: 失敗時に3回までリトライ
```bash
curl --retry 3 https://example.com
```

---

### **cURLをマスターするための学習ステップ**
1. **基本コマンドの理解**
   - GET、POST、ヘッダーの取得など。
2. **オプションの組み合わせ**
   - `-d`や`-H`を組み合わせて、複雑なリクエストを試す。
3. **APIのテスト**
   - 公開API（例: [JSONPlaceholder](https://jsonplaceholder.typicode.com/)）で練習。
4. **スクリプトでの自動化**
   - シェルスクリプトに組み込んで実行（ループや条件分岐を追加）。
5. **ログとエラー管理**
   - `-v`や`--fail`を使い、エラー時の挙動を把握。

---

### **学んだcURLをスクリプトに活用する例**
#### シェルスクリプトでAPIにデータを送信
```bash
#!/bin/bash

API_URL="https://api.example.com/data"
AUTH_TOKEN="YOUR_TOKEN"

# GETリクエスト
curl -X GET -H "Authorization: Bearer $AUTH_TOKEN" $API_URL

# POSTリクエスト
curl -X POST -H "Authorization: Bearer $AUTH_TOKEN" \
     -H "Content-Type: application/json" \
     -d '{"name":"test_user","email":"test@example.com"}' $API_URL
```

---

### **さらなるステップ**
- **HTTP/HTTPS以外のプロトコルを試す**  
  cURLはFTPやSFTP、LDAPなどさまざまなプロトコルに対応。
  
- **cURLの公式ドキュメントを参照**  
  [cURL公式ページ](https://curl.se/)でオプションの詳細を確認。

- **Postmanとの比較を考える**  
  GUIツールのPostmanでAPIをテストし、cURLにエクスポートして学習を補完。

---

必要に応じてコードの詳細や応用例をお伝えします！
🔰Python初心者向け！リスト・タプル・辞書の違いと使い分け

# はじめに
Pythonには便利なデータ型がいくつか用意されています。
その中でも「リスト」「タプル」「辞書」は、データを扱う上で頻繁に使われますが、適切に使い分けることでコードの効率や可読性が向上します。

今回は、これらの基本的なデータ型の特徴や違い、そしてどのような場面で使うべきかを分かりやすく解説します！

# 1. リスト (List)
**特徴**
+ **順序が保証される**: インデックスで要素にアクセス可能
+ **変更可能（ミュータブル）**: 要素の追加、削除、変更が可能
+ **重複を許容**: 同じ値を複数回持つことができる

リストは、データの順序が重要な場合や、頻繁に変更が発生するデータを扱うのに適しています。

**使用例**
例えば、買い物リストを管理したい場合:

```python
shopping_list = ['apple', 'banana', 'milk']
shopping_list.append('bread')  # リストに要素を追加
print(shopping_list[1])  # "banana"を出力
```
リストを使えば、要素の追加や削除が簡単に行えます。

# 2. タプル (Tuple)
**特徴**
+ **順序が保証される**: リストと同様にインデックスでアクセス可能
+ **変更不可（イミュータブル）**: 作成後に要素を変更できない
+ **重複を許容**: 同じ値を複数回持つことができる

タプルは、「変更されると困るデータ」や「辞書のキーとして使用するデータ」に適しています。

**使用例**
例えば、地図の座標を管理したい場合:

```python
coordinates = (35.6895, 139.6917)  # 東京の緯度と経度
print(coordinates[0])  # "35.6895"を出力
```
座標や設定値のように変更しないデータを扱う場合は、タプルが最適です。

# 3. 辞書 (Dictionary)
**特徴**
+ **キーと値のペアでデータを管理**: 値に識別子（キー）を持たせる
+ **順序が保証される**（Python 3.7以降）
+ **キーはユニークでなければならない**

辞書は、データに名前やラベルを付けて管理したい場合に便利です。

**使用例**
例えば、ユーザー情報を管理したい場合:

```python
user_info = {'name': 'Alice', 'age': 25, 'city': 'Tokyo'}
print(user_info['name'])  # "Alice"を出力
user_info['age'] = 26  # 年齢を更新
```
キーで値を管理するため、データベースやAPIレスポンスの処理によく使われます。

# 4. リストとタプルの違い
|特徴|リスト (List)|タプル (Tuple)|
|---|---|---|
|変更可否|変更可能（ミュータブル）|変更不可（イミュータブル）|
|使用場面|動的データの管理|静的データや不変のデータの管理|
|速度|タプルより遅い|リストより高速|
|辞書のキー|使用不可|使用可能|

# 5. 辞書の利用場面
辞書は、次のような場面で特に活躍します。

1. ユーザー情報の管理（名前、年齢、住所など）
2. 設定データの管理（例: アプリケーションの設定値）
3. JSON形式データの操作（APIやファイル入出力）

辞書を使えば、キーで値を直接指定できるため、データ検索が効率的になります。

# 6. 適切なデータ型の選び方
1. **順序が重要で頻繁に変更するデータ**: リスト
2. **不変で固定されたデータ**: タプル
3. **キーで管理されるデータ**: 辞書

適切なデータ型を選ぶことで、コードの保守性が向上し、無駄なエラーも防ぐことができます。

# まとめ
Pythonの「リスト」「タプル」「辞書」は、それぞれ異なる用途に適しています。特徴や使用場面を理解し、賢く使い分けることで、より効率的なプログラムを書くことができるでしょう。
M5Stick C Plusのpwm出力ピン

M5Stick C Plusのpwm出力が可能なピンは

ピン番号
- 0
- 26
- 32
- 33

です．

32,33はGroveコネクタとなっていますが，線を取りだせば，普通のGPIOとしても扱うことができます．



## メモ
 M5StickCPlusで倒立振子を作っている方の記事を参考に，前後，左右旋回できる倒立振子を作ろうとしている中で，DCモータを２台制御する必要がありました．
 どのピンがpwm対応しているか調べていましたが，まとまって記載されているサイトがなかったので，メモ書き程度に残しておきました．


### M5StickCで倒立振子
https://qiita.com/Google_Homer/items/3897e7ffef9d247e2f56
Pytorch上の実装をJetsonに移植するのはわりと簡単

ここ半年ほど、Pytorchで実装されているアルゴリズムをJetson上で動作確認した。
比較的簡単だったので、手順を示す。

準備
1. 動作させるアルゴリズムの実装を見つける。
1. 機械学習のフレームワークの種類を確認する。
1. 以下は、pytorchだったとして。
1. JetsonのLTのバージョンに即したpytorch のDockerImageを明確にする。
1. 既存のDockerfileをまずは、雛形として用意する。
1. docker build 用、docker run 用のシェルスクリプトを用意する。
 
https://github.com/katsunori-waragai/depth-anything-zed/blob/main/Dockerfile
```
FROM nvcr.io/nvidia/l4t-pytorch:r35.2.1-pth2.0-py3
```
これは、Pytorchの動作する環境をNVIDIAがl4t(Linux_for_Tegra）, つまりjetson用に用意したDockerImageを使います。（docker build 時にダウンロードされる。）

```
RUN apt-get update
RUN apt install sudo
RUN apt install -y git-lfs
# only for development
RUN apt update && apt install -y eog nano
RUN apt install -y meshlab
```

RUN で始まる行は、Docker build の際に実行されるコマンドです。
Docker環境内でnanoエディタや、画像ファイルのビューワーeogを使いたいので入れています。

本題です。
移植元でaptでインストールしているライブラリ・コマンドがあれば、以下のようにDockerfileに書き加えます。
```
RUN apt install -y build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
RUN apt install -y libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev
RUN apt install -y libv4l-dev v4l-utils qv4l2
RUN apt install -y curl
RUN apt install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
```

Pythonのライブラリをpipで入れる必要があれば入れます。

```
RUN python3 -m pip install パッケージ名

RUN python3 -m pip install -r requirements.txt
```

あるいは、元のリポジトリにpyproject.toml があれば
```
RUN cd ${そのディレクトリ} && python3 -m pip install .
```
を実行します。
例 以下のようにシエルスクリプトを用意します。

```:docker_build.sh
#/bin/bash
docker build -t depth-anything-zed:100 .
```
  

```:docker_run.sh
#!/bin/bash
xhost +
export GIT_ROOT=$(cd $(dirname $0)/.. ; pwd)
docker run -it --rm --net=host --runtime nvidia -e DISPLAY=$DISPLAY \
	-v ${GIT_ROOT}/depth-anything-zed/weights:/root/depth-anything-zed/weights \
	-v ${GIT_ROOT}/depth-anything-zed/data:/root/depth-anything-zed/data \
	-v ${GIT_ROOT}/depth-anything-zed/test:/root/depth-anything-zed/test \
	--device /dev/bus/usb \
	--device /dev/video0:/dev/video0:mwr \
	-v /tmp/.X11-unix/:/tmp/.X11-unix depth-anything-zed:100
```

以下のように実行します。
```
sh docker_build.sh 
sh docker_run.sh
```

として、docker環境を立ち上げることができました。

ここまでの手順をふむと,
CUDAデバイスのあるUbuntuPCでの動作例をJetsonで動作させるのは比較的簡単です。
UbuntuPCでのDockerfileが移植元で公開されている場合には、FROM行で指定するDockerImageをNVIDIAのL4T（もしくはjetpack）の指定のあるDockerImageに置き換えればいいだけですから。
プログラミングについて


---


プログラミングは、コンピュータに対して指示を出し、特定のタスクを実行させるための技術です。近年、テクノロジーが急速に進化する中で、プログラミングの重要性はますます高まっています。ソフトウェア開発、ウェブ開発、ゲーム開発、人工知能（AI）など、あらゆる分野でプログラミングが活用されています。本記事では、プログラミングの基本とその重要性について解説します。

### 1. プログラミングとは？

プログラミングとは、コンピュータが理解できる言語（プログラミング言語）を使って、コンピュータに命令を与え、特定の作業を行わせる作業です。プログラムは、ソースコードと呼ばれるテキストファイルに書かれ、コンピュータはその指示に従って動作します。プログラミング言語には、Python、Java、C++、JavaScriptなどがあり、それぞれ異なる特徴と用途があります。

### 2. プログラミングの重要性

プログラミングは、現代社会において不可欠なスキルとなっています。多くの企業や業界で、プログラミングの知識を持つ人材が求められており、その需要は年々高まっています。プログラミングを学ぶことは、単にソフトウェアやアプリケーションを開発するだけでなく、問題解決能力や論理的思考を養うことにも繋がります。さらに、プログラミングスキルを活かして、独自のプロジェクトを作成したり、フリーランスとして仕事を得たりすることも可能です。

### 3. プログラミングを学ぶ方法

プログラミングを学ぶ方法は、いくつかの選択肢があります。例えば、オンライン学習プラットフォーム（Udemy、Coursera、Codecademyなど）を利用したり、専門学校や大学で正式に学ぶことができます。また、実際に手を動かしてコードを書くことが最も効果的な学習方法であり、初心者向けのプロジェクトを実践することが勉強になります。初心者向けのプログラミング言語としては、Pythonが人気です。そのシンプルで分かりやすい文法が特徴です。

### 4. プログラミングの応用分野

プログラミングは、非常に多くの分野で応用されています。例えば、ウェブ開発では、ウェブサイトやウェブアプリケーションを作成するためにプログラミングが必要です。また、ゲーム開発では、ゲームエンジンを使用してインタラクティブなゲームを作るためにプログラミングスキルが活かされます。さらに、人工知能（AI）や機械学習の分野でも、データを解析し、予測モデルを構築するためにプログラミングが欠かせません。

### 5. 結論

プログラミングは、現代のデジタル社会において非常に重要なスキルです。テクノロジーの進化とともに、プログラミングの需要は今後も増加することが予想されます。プログラミングを学ぶことで、創造的な問題解決能力を養い、さまざまな分野でのキャリアを築くことができます。初心者でも手軽に始められるプログラミング学習のリソースが豊富にあるので、興味がある方はぜひ挑戦してみてください。

---
【Git入門】新規リポジトリの作成方法と既存ソースのアップロード

GitHubに新規プロジェクトを作成し、リポジトリに既存プロジェクトをアップロードする手順を以下にまとめます。

---

### **1. GitHubリポジトリの作成**
1. GitHubにログイン。
2. 以下の「New repository」を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1202056/4ebb6b41-f932-eaba-e6e6-e311ac43dcc9.png)

3. 以下の情報を入力：
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1202056/6b521f08-1f98-9e5b-d089-b19745009c05.png)

   - **Repository name**: プロジェクト名（例: `my-project`）
   - **Description**: プロジェクトの説明（任意）
   - **Visibility**: プライベートかパブリックを選択
   - **Initialize this repository with...**: 初期化オプションを選択（初回はチェックを入れず、空のリポジトリで進める方が良い）
4. **Create repository**をクリック

---

### **2. ローカルプロジェクトの準備**
※プロジェクトがローカルPCに存在している場合の手順になります
1. ターミナルを開き、プロジェクトのディレクトリに移動します：
   ```bash
   cd /path/to/your/project
   ```
2. **Gitリポジトリを初期化**：
   ```bash
   git init
   ```
3. **全てのファイルをステージング**：
   ```bash
   git add .
   ```

4. **最初のコミット**：
   ```bash
   git commit -m "first commit"
   ```
---

### **3. GitHubリポジトリに接続**
1. 先ほど作成したGitHubリポジトリのページで、リポジトリURLをコピーします（`https://github.com/username/repository.git` の形式）。


2. ローカルリポジトリにGitHubリポジトリをリモートとして追加：
   ```bash
   git remote add origin https://github.com/{username}/{new_repo}.git
   ```
※{username}、{new_repo}の部分は適宜変更してください。
3. **ブランチをプッシュ**：
   ```bash
   git branch -M main  # ブランチ名を "main" に変更（必要に応じて）
   git push -u origin main
   ```

---

### **4. リポジトリの確認**
1. GitHubのリポジトリページにアクセス。
2. ローカルプロジェクトのファイルがアップロードされていることを確認。

---

以上になります！

---

### **おまけ**
- **ファイル変更後**：
  変更後は以下のコマンドで再度更新できます。
  ```bash
  git add .
  git commit -m "Updated files"
  git push origin main
  ```
Linux（Debian, Ubuntu, Raspbian...） よもやまばなし

Linux Calendar 2024
https://qiita.com/advent-calendar/2024/linux
Day 10 投稿予定記事です。

この１０年間、Linuxというと、Debian, Ubuntu, Raspbianしか導入、運用、管理したことがない。

その前には、RedHat、Centos, Vine、Slackwareなどを利用していた。

# SlackWare
SlackWareは、アメリカの開発チームと歓談したことがある。
ちょうど、IEEEの国際会議と、ISO/IEC JTC1 SC7国際会議が連続で２週間アメリカのホテル暮らしをしていた時に、自転車を借りていた。
自転車でちょうど行ける距離に開発チームがいる組織があり、突撃訪問した。

最初は、何をしにきたんだくらいの扱いだった。
玄関の資料をみせてくれと頼んで見ていたら、ところでお前は何しているんだというので、
日本であるソフトの移植チームにいるといったら、Tさん知っているかといった。
あ、よく会うよといったら、じゃ、ちょっと中に入ってメンバに挨拶してけってなった。

サポートの女性２人とDeveloperの男性２人と歓談して写真をとった。

# Vine
博士課程の研究室で、先輩がVineのDeveloperをしていた。
じゃあってことで、自分でもVineを導入して、教育にも１度使った。

その後、Texユーザ会でVineのDistributerの方にお会いした。
その後もOSCなどでときどきお会いした。

# Debian
日本語の本がでたときに、真っ先に購入し、インストールして、本に書いてある操作をした。
誤植を５−１０箇所くらいみつけた。連絡先に送った。改訂版がおくられてきた。

Debianが大好きになった。

なにを隠そう、はずかしながら、LinuxでKernelビルドがうまくいったのは、Debianが最初。

aptコマンドは、ソースコードの整合性もそれなりに確保してくれ、面倒なエラーがなくビルドできた。

ちょうど、博論のためにMobile IPを導入するため、特定の版からPatchをあてる必要があった。
Debianを使っていなければ、自分の博論の内容が、架空の議論で終わっていたかもしれない。
Debianさんありがとう。

対向試験は、FreeBSDと実施した。

ネットワーク ReferenceとしてのBSD, Ethernet(64)
https://qiita.com/kaizen_nagoya/items/14fba711d42fd8b5db4c

新人(学生)を指導するよりも新人(学生)に指導してもらった方が効率的. 仮説(139) 転職(39)
https://qiita.com/kaizen_nagoya/items/db993b1536055029f7c8

Unixのカーネルソースをビルドできたのは、学生におしえてもらったからだった。

# ubuntu
dockerでいつもお世話になっている。
GCCの公式はDebianだが、他は多くがUbuntuっぽい。

あなたもdocker, 私もdocker。docker(130)
https://qiita.com/kaizen_nagoya/items/8f2746f10f30b575d0a8

# Raspbian
Rust Lang) leetcode - Q20. Valid Parentheses

# code  

```rust
pub struct Stack{
    stack: Vec<u8>,
}

impl Stack{
    fn new() -> Stack{
        let v: Vec<u8>= Vec::new();
        
        Self { stack: v }
    }
    
    fn stack_in(mut self) -> Self{
        self.stack.push(1);
        
        self
    }

    fn pop_up(mut self) -> Self{
        self.stack.pop();
        
        self
    }
}

struct Solution{}

impl Solution {
    pub fn is_valid(s: String) -> bool {
        // [40, 41 / 123, 125 / 91, 93]
        let s_bytes= s.as_bytes();
        let mut type_a: Stack= Stack::new();
        let mut type_b: Stack= Stack::new();
        let mut type_c: Stack= Stack::new();

        let a= "(".as_bytes();
        let a2= ")".as_bytes();

        let b= "{".as_bytes();
        let b2= "}".as_bytes();

        let c= "[".as_bytes();
        let c2= "]".as_bytes();

        for bc in s_bytes {
            if *bc == a[0]{
                type_a= type_a.stack_in();
            }
            if *bc == b[0]{
                type_b= type_b.stack_in();
            }
            if *bc == c[0]{
                type_c= type_c.stack_in();
            }

            if *bc == a2[0] {
                type_a= Stack::pop_up(type_a);
            }
            if *bc == b2[0] {
                type_b= Stack::pop_up(type_b);
            }
            if *bc == c2[0] {
                type_c= Stack::pop_up(type_c);
            }
        }

        let a_size= type_a.stack.len().clone();
        let b_size= type_b.stack.len().clone();
        let c_size= type_c.stack.len().clone();

        if a_size == 0 && b_size == 0 && c_size == 0 {
            true
        }else{
            false
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn it_works() {
        let result = Solution::is_valid("()".to_string());
        assert_eq!(result, true);
    }


    #[test]
    fn it_works2() {
        let result = Solution::is_valid("()[]{}".to_string());
        assert_eq!(result, true);
    }


    #[test]
    fn it_works3() {
        let result = Solution::is_valid("(]".to_string());
        assert_eq!(result, false);
    }


    #[test]
    fn it_works4() {
        let result = Solution::is_valid("([])".to_string());
        assert_eq!(result, true);
    }
}
```


# Ref
- Q: https://leetcode.com/problems/valid-parentheses/description/
- Source code: https://github.com/oneduck11034/code_problem_solver/blob/main/ValidParentheses_20/lib.rs
'error''は 'unknown' 型です。

# はじめに

アプリ開発をしていてtry-catch文のcatch(error)としていると、以下のようなエラーが出ました。

```ts

catch (error) {
setError(error.message);    //'error''は 'unknown' 型です。
}

```

# 問題
調べてみると、Typescript4.4以降にcatch句のerror変数はunknown型として扱われるようになったことが原因のようです。

これはuseUnknownInCatchVariablesフラグが導入されたことに関係があるようです。strictモードを有効にしている場合、このオプションが自動的に有効になるみたいです。
これが有効になっていると、catch句の変数が従来はany型だったのが、unknow型になってしまうみたいです。

今回のコードは、catchブロック内でerrorを使用する際に、その型が不明確なため、error.messageにアクセスできないというエラーです。



# 解決方法
以下のようにコードを修正することで今回のエラーは解決できました。

```
if (error instanceof Error) {
setError(error.message);
} else {
setError('An unknown error occurred');
}

```

errorがErrorインスタンスであるかどうかチェックをするようにします。
もしErrorインスタンスの場合は、error.messageを使用できます。
else文を置いて、Errorインスタンス出ない場合のエラーメッセージを対応することで、予期しないエラーにも対応ができるようになりました。



# おわりに
今までcatch(error)は自動的に書いていることが多かったのですが、今回のエラーによって型安全性向上のためにより厳格なエラーハンドリング方法を知るきっかけになりました。
皆様の参考になれば幸いです！
コミュニティでCongaを使う



+ [コミュニティのユーザーを構成する](https://documentation.conga.com/clm/latest/salesforce/configuring-users-for-your-community-203495254.html)

+ [コミュニティ ユーザーは Conga を使用して Salesforce にファイルを保存できません](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007IeiG4)

:::note
このエラーを修正するには、コンガ クエリで参照されるすべてのフィールドがコミュニティ ユーザーに表示されるようにし、コンガ ボタン構成で次のプロパティを使用します。

```
&ContentNetworkId = 0DB3L0000000R1p( 独自のコミュニティ ネットワーク ID に置き換えてください)
&contentShareType =I
&contentVisibility =すべてのユーザー
```

```
&ContentNetworkId=0DB3L0000000R1p( replace with your own community network id)
&contentShareType=I
&contentVisibility=AllUsers
```
:::
Rust Lang) leetcode: 26. Remove Duplicates from Sorted Array

# code

```rust
// 1. Not hash set

struct Solution{}

impl Solution {
    pub fn remove_duplicates(v: &mut Vec<i32>) -> i32 {
        let mut i=0; let mut j=0;
        let mut buff: Vec<i32>= Vec::new();
        let nested_v= v.clone();
        
        for e in v{
            let duplicated= nested_v.iter().filter(|&n| *n == *e).count();
            if buff.iter().filter(|n| n == &e).count() >= 1 {
                continue;
            }else{
                buff.push(*e);
            }
        }

        buff.len() as i32
    }
}

fn main() {
    let result= Solution::remove_duplicates(&mut Vec::from([0_i32,0,1,1,1,2,2,3,3,4]));
    assert_eq!(result, 5);
}



// 1. https://stackoverflow.com/questions/57739755/how-could-rust-multiply-i32-with-i32
// pivot 1 and 2 have a same address vector
// if pivot_1 == pivot_2{
//     buff.push(*pivot_1);
// }else{
//     continue;
// }

// 2. https://stackoverflow.com/questions/45353757/how-to-count-the-elements-in-a-vector-with-some-value-without-looping


// 2. Hash set
struct Solution{}

use std::collections::HashSet;

impl Solution {
    pub fn remove_duplicates(v: &mut Vec<i32>) -> i32 {
        let mut seen = HashSet::new();
        
        for e in v{
            seen.insert(e);
        }
        
        seen.len() as i32
    }
    
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn it_works() {
        let mut inpute= Vec::from([1,1,2]);
        let result = Solution::remove_duplicates(&mut inpute);
        assert_eq!(result, 2);
    }

    #[test]
    fn it_works2() {
        let mut inpute= Vec::from([0,0,1,1,1,2,2,3,3,4]);
        let result = Solution::remove_duplicates(&mut inpute);
        assert_eq!(result, 5);
    }
}

// Constraints:
// 1 <= nums.length <= 3 * 104
// -100 <= nums[i] <= 100
// nums is sorted in non-decreasing order.
```


# Ref
- Q: https://leetcode.com/problems/remove-duplicates-from-sorted-array/description/
- source code: https://gist.github.com/oneduck11034/239849f14b364e320ca8c744ce736be5#file-removeduplicatesfromsortedarray_26-rs
プログラマブルとは

> `プログラムで制御できる`、`プログラム化できる`

https://ejje.weblio.jp/content/programmable#goog_rewarded

>プログラマブルとは`ソフトウェアプログラムによって比較的自由に動作を制御できる`ハードウェアやアプリケーションのことです。
IoTはインターネットを通じてさらに大規模・沿革・複雑な操作が可能になりますが、プログラマブルはIoTより比較的近距離の範囲で直接操作するものに用いられやすい用語です。
連想しやすいのは`生産工場でのロボットで、動作の速さ、距離、動き、位置、回数などをソフトウェアプログラムで制御`できます。
この言葉は操作される本体の言葉をつけ足して「プログラマブルキーボード」、「プログラマブルテンキー」、「プログラマブルコントローラ(PLC)」、「プログラマブルスイッチャー」、「プログラマブルマネー(ブロックチェーン)」のように使われます。

https://www.itnavi.jp/words/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%96%E3%83%AB/

>プログラマブル（programmable）とは、`装置やソフトウェア、システムなどの動作を利用者が必要に応じて変更したり自動化`したりできること。特に、`ひとまとまりの処理手順などを一定の形式で記述したプログラムにより、動作の指示をまとめて行なう`ことができること。

https://e-words.jp/w/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%96%E3%83%AB.html#:~:text=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%96%E3%83%AB%EF%BC%88programmable%EF%BC%89%E3%81%A8%E3%81%AF%E3%80%81%E8%A3%85%E7%BD%AE%E3%82%84%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%80%81%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AA%E3%81%A9%E3%81%AE%E5%8B%95%E4%BD%9C%E3%82%92%E5%88%A9%E7%94%A8%E8%80%85%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%AB%E5%BF%9C%E3%81%98%E3%81%A6%E5%A4%89%E6%9B%B4%E3%81%97%E3%81%9F%E3%82%8A%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%97%E3%81%9F%E3%82%8A%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%93%E3%81%A8%E3%80%82%E7%89%B9%E3%81%AB%E3%80%81%E3%81%B2%E3%81%A8%E3%81%BE%E3%81%A8%E3%81%BE%E3%82%8A%E3%81%AE%E5%87%A6%E7%90%86%E6%89%8B%E9%A0%86%E3%81%AA%E3%81%A9%E3%82%92%E4%B8%80%E5%AE%9A%E3%81%AE%E5%BD%A2%E5%BC%8F%E3%81%A7%E8%A8%98%E8%BF%B0%E3%81%97%E3%81%9F%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AB%E3%82%88%E3%82%8A%E3%80%81%E5%8B%95%E4%BD%9C%E3%81%AE%E6%8C%87%E7%A4%BA%E3%82%92%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E8%A1%8C%E3%81%AA%E3%81%86%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%93%E3%81%A8%E3%80%82

# 感想
自分もプログラマブルのことをやっていたことに意味を知って気づいた。
既存のNext.jsプロジェクトに TypeScript を導入すると「Error: Line 1: Unexpected token ILLEGAL」のエラーになる。

## 開発環境
・OS：Windows
・エディタ：VSCode

## エラー内容
Next.jsにTypeScriptを導入する際、以下の手順を行うとエラーになった。

1\. ルートディレクトリにtsconfig.jsonを作成。
2\. `npm install --save-dev typescript @types/react @types/node`を実行
3\. `npm run dev`を実行

```
npm run dev       

> dev
> next dev

   ▲ Next.js 15.0.3
   - Local:        http://localhost:3000

 ✓ Starting...
Error: Line 1: Unexpected token ILLEGAL
    at ErrorHandler.constructError (C:\Users\hidek\Desktop\private\study-typescript\node_modules\next\dist\compiled\comment-json\index.js:1:127785)
    at ErrorHandler.createError (C:\Users\hidek\Desktop\private\study-typescript\node_modules\next\dist\compiled\comment-json\index.js:1:128021)
    at ErrorHandler.throwError (C:\Users\hidek\Desktop\private\study-typescript\node_modules\next\dist\compiled\comment-json\index.js:1:128155)
    at Scanner.throwUnexpectedToken (C:\Users\hidek\Desktop\private\study-typescript\node_modules\next\dist\compiled\comment-json\index.js:1:132914)
    at Scanner.scanPunctuator (C:\Users\hidek\Desktop\private\study-typescript\node_modules\next\dist\compiled\comment-json\index.js:1:140960)
    at Scanner.lex (C:\Users\hidek\Desktop\private\study-typescript\node_modules\next\dist\compiled\comment-json\index.js:1:150049)
    at Tokenizer.getNextToken (C:\Users\hidek\Desktop\private\study-typescript\node_modules\next\dist\compiled\comment-json\index.js:1:155439)
    at Object.tokenize (C:\Users\hidek\Desktop\private\study-typescript\node_modules\next\dist\compiled\comment-json\index.js:1:12452)
    at tokenize (C:\Users\hidek\Desktop\private\study-typescript\node_modules\next\dist\compiled\comment-json\index.js:1:2939)
    at Object.parse (C:\Users\hidek\Desktop\private\study-typescript\node_modules\next\dist\compiled\comment-json\index.js:1:5765) {
  index: 0,
  lineNumber: 1,
  description: 'Unexpected token ILLEGAL'
}
```

## 解決策
ChactGPTによると、エラー内容としては「このエラーの主な原因は、tsconfig.jsonやpackage.jsonのようなJSON形式の設定ファイルが、無効な構文や、特殊文字（ILLEGAL TOKEN） を含んでいる」とのこと。

「手動でtsconfig.jsonを作成した」or「tsconfig.jsonに無駄な文字列が入っていた」ことが原因かもしれなかったので、以下の手順でTypeScriptを導入すると上手くいった。

1\. `npm install --save-dev typescript @types/react @types/node`を実行
2\. `npx tsc --init`を実行
3\. `npm run dev`を実行
GitHub Actionsで特定のタイトルのIssueを自動でクローズする

## はじめに

以下の記事で、日報用のIssueをGitHub Actionsで自動生成するワークフローファイルについてまとめました。
<br>

https://qiita.com/Kazuyaa/items/f8467a3b75c638afe020

<br>
このワークフローに前日のIssueを自動でクローズする処理も追加したため、こちらも備忘録としてまとめます。

## GitHub Actionsで特定のタイトルのIssueを自動でクローズする

↑の記事で紹介したワークフローファイルに前日のIssueをクローズするフ処理を追加します。
<br>

ファイル全体は次のようになりました。
<br>

```.github/workflows/daily-report.yml
name: Today I Learned Issue Creator

permissions:
  issues: write
  contents: read

on:
  schedule:
    - cron: '0 22 * * *'
  workflow_dispatch:

jobs:
  create-daily-issue:
    runs-on: ubuntu-latest

    steps:
      - name: リポジトリのチェックアウト
        uses: actions/checkout@v4

      - name: 変数の設定  # 前日の日付を追加
        run: |
          echo "TODAY=$(TZ=Asia/Tokyo date +'%Y-%m-%d')" >> $GITHUB_ENV
          echo "YESTERDAY=$(TZ=Asia/Tokyo date --date='yesterday' +'%Y-%m-%d')" >> $GITHUB_ENV

      - name: 昨日の Issue をクローズ  # フローを追加
        run: |
          ISSUE_TITLE="TIL - ${{ env.YESTERDAY }}"
          ISSUE_NUMBERS=$(gh issue list --state open --search "${ISSUE_TITLE} in:title" --json number --jq '.[].number')

          if [ -n "$ISSUE_NUMBERS" ]; then
            for ISSUE_NUMBER in $ISSUE_NUMBERS; do
              gh issue close $ISSUE_NUMBER --comment "前日の日報をクローズします。"
              echo "Issue #$ISSUE_NUMBER をクローズしました。"
            done
          else
            echo "前日のIssueは存在ないか、既にクローズされています。"
          fi
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: 今日の Issue を作成
        run: |
          cat << 'EOF' | gh issue create --label "Today I Learned" --title "TIL - ${{ env.TODAY }}" --body-file -
          ## 今日やること
          - [ ] 今日やることを書く

          ## 学んだこと
          - 

          ## ネクストアクション
          - 
          EOF
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```
<br>

このワークフローでは`TIL - 2024-11-24`のように`TIL - 日付`の形式でタイトルを付与しています。
<br>

そのため`echo "YESTERDAY=$(TZ=Asia/Tokyo date --date='yesterday' +'%Y-%m-%d')" >> $GITHUB_ENV`で昨日の日付を取得しタイトル検索することで、前日のIssueを抽出できます。
<br>

上記のワークフローファイルにより、コメントを投稿した上で自動的にIssueをクローズできるようになりました。
<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325281/705dcd97-c5a8-41c2-1d17-99bbe477d998.png)

## おわりに

まだ始めて数日ですが、日報を書くのは良い習慣だと感じています。
<br>

この調子で続けていきたいです。

### 参考

https://docs.github.com/ja/search-github/searching-on-github/searching-issues-and-pull-requests
Rust lang) Atcoder ABC380 -  A: 123233 

# code  

```rust
use std::{collections::HashMap, io::{stdin, BufRead}};

// https://atcoder.jp/contests/abc380/tasks/abc380_a
pub fn main(){
    // number: u64
    let std= stdin();
    let mut buf=std.lock().lines();
    let string_input= buf.next().unwrap().unwrap();
    let number_input= string_input.parse::<u64>().unwrap();

    let n_string= number_input.to_string().trim().to_string();
    let v_n: Vec<char>= n_string.chars().collect();
    
    let mut map_one: HashMap<char, u64>= HashMap::new();
    let mut map_two: HashMap<char, u64>= HashMap::new();
    let mut map_three: HashMap<char, u64>= HashMap::new();

    for e_n in v_n {
        match e_n {
            '1' => {
                map_one.insert('1', 1);
            },
            '2' => {
                map_one.insert('2', 1);

                if *(map_one.get(&'2').unwrap()) == 1 {
                    map_two.insert('2', 2);
                }
            },
            '3' => {
                map_one.insert('3',1);

                if *(map_one.get(&'3').unwrap()) == 1 {
                    map_two.insert('3', 2);
                    
                }
                if *(map_two.get(&'3').unwrap()) == 2 {
                    map_three.insert('3', 3);
                }
            },
            _ => { println!("No"); }
        }
    }



    if *(map_one.get(&'1').unwrap()) == 1 
        && *(map_two.get(&'2').unwrap()) == 2 
        && *(map_three.get(&'3').unwrap()) == 3  {
            println!("Yes");
    }
}
```



# Source code  

## test code
- https://github.com/miyuki1103/at_coder_rust/actions/runs/11969510809/job/33370401992

## input
- https://github.com/miyuki1103/at-coder-rust-main/blob/main/abc380_a/src/main.rs
SDNとは

# 機能を２つに分けることでカスタマイズできる
>SDNではネットワークの機能を「データの転送」と「転送の制御」に切り離します。こうすることで、ユーザーがネットワークの機能を自由に組み立てられるようになります。

* データの転送、転送の制御とは?

# データプレーンとコントロールプレーンの２つに分ける
>SDNでは、これまで一つの機器に一緒に組み込まれていたデータを転送する仕組み（データプレーン）と、転送を制御する仕組み（コントロールプレーン）を別々に切り離します。そして転送制御はユーザーがパソコンなどで自由に行えるようにします。これによりネットワークの機能を自由かつ柔軟に作れるようにします。

# OpenFlowとは
>このようなことを実現する具体的な企画の一つです。
### OpenFlowスイッチとOpenFlowプロトコルに分かれる
>「実際にデータを転送するOpenFlow スイッチ」と、それに指示を与える手順「OpenFlowプロトコル」について、メーカー共通の規格が決められています。
### OpneFlowコントローラーはプロトコルに従ってスイッチに必要な指示を出す
>頭脳に当たる「OpenFlowコントローラー」は、OpenFlowプロトコルに沿ってOpenFlowスイッチに対して必要な指示を出し、これら全体でネットワークの機能を実現します

https://www.sbcr.jp/product/4797386677/

# SDNとは
>ユーザーが作ったソフトウェアによって管理・制御された仮想ネットワーク、あるいは、それを構成するための技術のことです。

# SDNのできること
>SDNは自由にアプリケーションフローを制御できたり、ネットワーク全体を一元管理できたりと、OSI参照モデルの概念を取り払って色々なことを実現できる

# 実際のところ
>いまだ発展途上の域を脱していません。
...
絶対安定が求められるネットワークにおいては、新技術が必ずしも良いことばかりをもたらすわけではない、ということをしっかり認識しておく必要があるでしょう。

https://www.sbcr.jp/product/4797386660/
LeetCodeを1日1題解いてみる (day25)

25日目に取り組んだ問題はこちら！

# 118. Pascal's Triangle

https://leetcode.com/problems/pascals-triangle/description/

## 問題文
Given an integer numRows, return the first numRows of Pascal's triangle.

In Pascal's triangle, each number is the sum of the two numbers directly above it as shown:

## 僕の回答
```py
class Solution:
    def generate(self, numRows: int) -> List[List[int]]:
        result = []
        result.append([1])
        for n in range(1, numRows):
            row = []
            row.append(result[n-1][0])
            for i in range(0, n-1):
                row.append(result[n-1][i] + result[n-1][i+1])
            row.append(result[n-1][-1])
            result.append(row)
        return result
```

## 他の回答例

```py
class Solution:
    def generate(self, numRows: int) -> List[List[int]]:
        list_ = []
        for i in range(numRows):
            if i == 0:
                list_ += [[1]]
            else:
                list_ += [[1, 1]]
                for j in range(i-1):
                    list_[i].insert(j+1, list_[i-1][j] + list_[i-1][j+1])         
        return list_
```

## コメント
`row`を初めに`1`で初期化し、両端以外に正しい値を入力していく方法も考えたが、それだと、頂点の数字が`1`じゃなくなった時に対応できないなと思いました。頂点を変更しても使えるように個人的にしたかったので、今回の実装にしました。

## 次の問題はこちら!
https://qiita.com/h_y_s_d/items/ff647c406d28580d97bd
ティアリストを作成するサイトを作ってみた

## 概要
登録不要・無料でティアリストを作成できるサイトを作ってみました。

https://tier-maker.com/

![](https://storage.googleapis.com/zenn-user-upload/fd302657dbbf-20241124.png)

## 使った技術

- React: コンポーネントベースのUI構築。
- Tailwind CSS: スタイリングの効率化。
- [dndkit](https://dndkit.com/): 高度なドラッグ＆ドロップ操作の実装。
Windows と TypeScript ではじめる Symbol 通信 05【委任者情報】


Rest の`/node/unlockedaccount`と同等の値を取得してみましょう。
これは他と違い`config-node.properties`の`trustedHosts`に羅列された IP からのみ参照できます。つまり、他のノードの委任者情報は本来勝手に見ることは出来ないものなのです。今回はローカルにあるノードに対してアクセするので、設定の変更は不要です。

## 委任者情報の取得

### ノードへリクエスト

パケットタイプは、`0x304`です。ペイロードはありません。

```typescript:Catapult.ts
/** パケットタイプ */
private PacketType = {
  CHAIN_STATISTICS: 0x0_05,
  NODE_DISCOVERY_PULL_PING: 0x1_11,
  TIME_SYNC_NETWORK_TIME: 0x1_20,
  FINALIZATION_STATISTICS: 0x1_32,
  UNLOCKED_ACCOUNTS: 0x3_04,
}

/**
 * /node/unlockedAccount 同等の値を持つクラスを取得
 * @returns NodeUnlockedAccount
 */
async getNodeUnlockedAccount() {
  console.info('NodeUnlockedAccount')
  let nodeUnlockedAccount: NodeUnlockedAccount | undefined
  try {
    // ピア問合せ
    const socketData = await this.request(this.PacketType.UNLOCKED_ACCOUNTS)
    if (socketData)
      nodeUnlockedAccount = NodeUnlockedAccount.deserialize(socketData)
    this.close()
  } catch (e) {
    if (e instanceof Error) console.error(e.message)
    else console.error(e)
  }
  return nodeUnlockedAccount
}
```

### レスポンスデータの解析

シリアライズされたデータが返ってくるので、デシリアライズします。

| 項目            | 長さ      |
| :-------------- | :-------- |
| unlockedAccount | 32 バイト |

委任者のリモートアカウントの公開鍵が委任者数分連なって返ってきます。

```typescript:src/models/NodeUnlockedAccount.ts
import { PacketBuffer } from '../PacketBuffer.js'

export class NodeUnlockedAccount {
  constructor(public unlockedAccount: string[] = []) {}

  static deserialize(payload: Uint8Array) {
    const nodeBufferView = new PacketBuffer(Buffer.from(payload))
    const unlockedAccount = []
    while (nodeBufferView.index < nodeBufferView.length) {
      unlockedAccount.push(nodeBufferView.readHexString(32).toUpperCase())
    }
    return new NodeUnlockedAccount(unlockedAccount)
  }

  toJson() {
    return {
      unlockedAccount: [...this.unlockedAccount],
    }
  }
}
```

## メインの作成

実行するコードを作成します。

```typescript:src/mainNodeUnlockedAccount.ts
import { Catapult } from './Catapult.js'

const catapult = new Catapult(
  'cert/ca.crt.pem',
  'cert/node.crt.pem',
  'cert/node.key.pem',
  'localhost'
)

const nodeUnlockedAccount = await catapult.getNodeUnlockedAccount()
if (nodeUnlockedAccount) console.log(nodeUnlockedAccount)
```

### 実行

```posh
yarn tsx .\src\mainNodeUnlockedAccount.ts
```

実行すると以下の様にアンロックされているアカウント情報が出力されます。

```plaintext
NodeUnlockedAccount
socket connected.
NodeUnlockedAccount {
  unlockedAccount: [
    'C02D3D1820E897DD1CB06D20335D6B5B43FCE9BAF7BDBC850CE6E954E3563C7F'
  ]
}
socket close: 772
```

## バックナンバー

https://qiita.com/ccHarvestasya/items/7b9c66f145b636fe70ee

https://qiita.com/ccHarvestasya/items/46af59638c5aadc1f0be

https://qiita.com/ccHarvestasya/items/c7eca49984825eb3db29

https://qiita.com/ccHarvestasya/items/002854ee0e65f9c47fdf
よく使うGit コマンドを雑に挙げる


# よく使う Git コマンドを雑に挙げる

## はじめに

最近、筆が重くなりつつあり、このままでは書くことをやめてしまうと思い、雑でいいから何か書き上げようという思いで書き始めてます。

:::note warn
よく使う Git コマンドと言ってますが、あくまで自分ベースなので、情報不足の点があるかもしれません。その場合、コメント等で教えていただけると嬉しいです。
:::

## よく使う Git コマンド

自分が通常フローでよく使ってる Git コマンドを挙げます。

### git branch

```ブランチの一覧取得.
git branch
```
ローカルのブランチを一覧で確認できるコマンドです。

ブランチ名をコピペしたり、他のブランチを確認したいときに活用してます。（最近はあんまり使ってない気もします。）

### git switch <branch name>

```ブランチ切り替え.
git switch <branch name>
```

`git switch -`ブランチ名の部分を`-`にすると、このブランチの前のカレントブランチに戻れます。

`checkout`とほとんど同じですが`switch`コマンドの方が新しく、`checkout`でできることはほとんどできるようです。

`switch`について、下の記事が参考になりました。

https://qiita.com/umekikazuya/items/bc154da51b40f60285fe

### git add .

コミットするファイルをステージングにあげるコマンドです。

```特定ファイルをステージングする.
git add index.html
```

```変更差分のある全ファイルステージングする.
git add .
```

最近は、vscode のソース管理でコミットしたいファイルや変更内容を選び、ステージングしています。

画像の手順のように進めることでステージングにあげたり、戻したりできます。

![スクリーンショット 2024-11-24 7.46.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337943/e501f163-72f3-85d8-47d0-ff5ed005c0c6.png)

そのため`add`コマンドも全ファイルコミットしたいとき以外あまり使っていません。

### git commit -m "commit message"

ステージングしたファイルをコミットするコマンドです。

```ステージングした対象をコミット.
git commit -m "commit message"
```

下のようにコミットメッセージで空欄などを必要としないなら、`-m`、`””`は、なくてもいいことを最近知りました。

```ステージングした対象をコミット.
git commit wip
```

しかし、情報不足になりがちなので、`一時的な仮のコミット（後でコミットを戻す）`の時くらいしか利用していません。

こちらも、vscode のソース管理でコミットしがちです。

![スクリーンショット 2024-11-24 8.05.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337943/ea090702-a55b-5ca1-ca0b-3b06f58e39d8.png)

ターミナルでコミットする場合、誤って Enter キーをクリックをしてもそのままコミットログに反映されてしまいます。

vscode のソース管理のコミットメッセージ入力時に、誤って Enter キーをクリックしても、改行されるだけでコミットが送信されないのも良いです。

![スクリーンショット 2024-11-24 8.23.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337943/20ee543f-c44e-80e1-0dde-406faef665b1.png)

### git push origin <branch name>
`git commit`しても変更内容はリモートブランチに反映されていません。

変更内容をリモートブランチに反映させるためには、プッシュする必要があります。

```コミットした内容をリモートブランチに送信する.
git push origin <branch name>
```

またカレントブランチは、`HEAD`と書くこともできます。

```コミットした内容をリモートブランチに送信する.
git push origin HEAD
```

`HEAD`とは、ブランチの場所を記憶しているポインタのようです。

この記事がわかりやすかったです。

https://qiita.com/ymzkjpx/items/00ff664da60c37458aaa#head%E3%81%A8%E3%81%AF-1

## おわりに
一旦、紹介させていただいたGitコマンドでこの記事を終わらせたいと思います。

5つほどのコマンドしか書いていませんので、他は別の記事に切り出したいと思います。



<!-- git fetch
git stash
git stash pop stash@{0}
git reset --soft HEAD^
git cherry-pick
git merge develop
git branch
git branch -d <branch>

git push origin --delete <branch>
git fetch -p
origin とは
git merge --abort -->
Jade（Pug）の記述方法(express)



## Jade（Pug）の記述方法

Jade（現在はPug）はインデントを使用してHTMLを簡潔に記述できるテンプレートエンジンです。以下は基本的な記述例と、さまざまなHTML要素の書き方です。

---

### 基本構文

#### HTMLタグの書き方
```jade
doctype html
html
  head
    title My Website
  body
    h1 Hello World
    p This is a paragraph.
```

#### 結果
```html
<!DOCTYPE html>
<html>
  <head>
    <title>My Website</title>
  </head>
  <body>
    <h1>Hello World</h1>
    <p>This is a paragraph.</p>
  </body>
</html>
```

---

### 属性の指定

#### 属性の記述方法
```jade
a(href='https://example.com' target='_blank') Visit Example
```

#### 結果
```html
<a href="https://example.com" target="_blank">Visit Example</a>
```

---

### クラスとIDの指定

#### クラスとIDを簡潔に指定
```jade
div#main.container
  h1.title Page Title
  p.subtitle Welcome to my page!
```

#### 結果
```html
<div id="main" class="container">
  <h1 class="title">Page Title</h1>
  <p class="subtitle">Welcome to my page!</p>
</div>
```

---

### ループと条件分岐

#### ループ
```jade
ul
  each item in ['Apple', 'Banana', 'Cherry']
    li= item
```

#### 結果
```html
<ul>
  <li>Apple</li>
  <li>Banana</li>
  <li>Cherry</li>
</ul>
```

---

#### 条件分岐
```jade
if user
  p Welcome back, #{user.name}!
else
  p Please log in.
```

#### 結果
ユーザーが存在する場合:
```html
<p>Welcome back, John!</p>
```

ユーザーが存在しない場合:
```html
<p>Please log in.</p>
```

---

### ネスト構造

#### 子要素をインデントで記述
```jade
ul
  li Item 1
    ul
      li Sub-item 1.1
      li Sub-item 1.2
  li Item 2
```

#### 結果
```html
<ul>
  <li>Item 1
    <ul>
      <li>Sub-item 1.1</li>
      <li>Sub-item 1.2</li>
    </ul>
  </li>
  <li>Item 2</li>
</ul>
```

---

### テキストと変数の組み合わせ

#### 変数の埋め込み
```jade
p Hello, #{username}!
```

#### 結果
```html
<p>Hello, John!</p>
```

---

### フォームの記述

#### 基本的なフォーム
```jade
form(action='/submit' method='post')
  label(for='name') Name:
  input#name(type='text' name='name')
  button(type='submit') Submit
```

#### 結果
```html
<form action="/submit" method="post">
  <label for="name">Name:</label>
  <input id="name" type="text" name="name">
  <button type="submit">Submit</button>
</form>
```

---

### コメント

#### HTMLコメント
```jade
// This is a comment
```

#### 出力されるHTML
```html
<!-- This is a comment -->
```

#### Jade内でのコメント（HTMLに出力されない）
```jade
//- This comment will not appear in the HTML
```

---

### その他の要素

#### 画像の挿入
```jade
img(src='/images/example.png' alt='Example Image')
```

#### リンクリスト
```jade
nav
  ul
    li: a(href='/home') Home
    li: a(href='/about') About
    li: a(href='/contact') Contact
```

#### 結果
```html
<nav>
  <ul>
    <li><a href="/home">Home</a></li>
    <li><a href="/about">About</a></li>
    <li><a href="/contact">Contact</a></li>
  </ul>
</nav>
```

---

これらの例を使うことで、Jade（Pug）の記述が簡単に理解でき、様々な場面に対応できます。Jadeの簡潔な記述で効率的にテンプレートを作成しましょう！
SOP Volume Center Points をビルドして遊んでみる

# はじめに

なんかネタないかな～と安直な気持ちでネットサーフィンしてたら見つけたので、というのがこのポストを書いた理由:stuck_out_tongue_closed_eyes:

動く動かないとかよりも、とりあえず触ってみて、吸収するスタンス。大事。

## 環境

* Houdini 20.5.410

# ソースコード

## 大本のソースコード

https://github.com/ttvd/houdini-sop-volume-center-points/tree/master


# ビルドする

大本のソースコードは Premake5 でビルドするように出来ている。
まぁ、そのまま Premake5 でビルドしてみるのでもいいが、 ~~ソースコードによっては Houdini のビルドサポートを受けた方が安パイなこともある~~ ので、Houdini 側がサポートしている CMake でのビルド手段を取る。

:::note info
**追記:2024/12/13**
Premake5 を使ってのビルドも実際のところできる。Makefile を使ってできるので、その場合は、Premake5 の使用方法に習ってビルドすること。
:::

ということで、CMakeLists.txt を作成して書く。
配置場所はルートで良い。

```cmake:CMakeLists.txt
cmake_minimum_required(VERSION 3.8)

project("SOP_VolumeCenterPoints")

# Find Houdini Package
find_package(Houdini REQUIRED)

# Set the name of the node
set (library_name ${PROJECT_NAME})

# Add a library with the sources
add_library(${library_name} SHARED
    SOP_VolumeCenterPoints.C
    SOP_VolumeCenterPoints.h
)

# Support to compile against Houdini headers
houdini_configure_target(${library_name})


# Target libraries
target_link_libraries(${library_name} PRIVATE Houdini)


target_include_directories(${library_name} PRIVATE
    ${CMAKE_CURRENT_BINARY_DIR}
)
```

## CMake ビルドを行う

```powershell
mkdir build
cd build
cmake .. -G "Visual Studio 16 2019 Win64"
cmake --build . --config Release
```

:::note info
**最近の僕のらくちん CMake Houdini ビルド構成**

基本的には Command Line Tools 上で操作を行う。色々環境設定してくれてるので。
僕の場合は、Windows Terminal に Command Line Tools を起動できるように設定しているので、すぐに立ち上げれるようにしていたりする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51857/cb093593-25f3-7748-d581-7a2eba81140f.png)

また、最近はエディタに [NeoVim 構成をしている](https://qiita.com/takavfx/items/999d345f9b6c0925334a)ので、CMake プラグインを導入していると、**:CMakeQuickBuild** コマンドでサクッとビルドできるようにしている。
CMakeLists.txt を裏でビルドしながらのコーディングもできるので、まーじで便利。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51857/d10c5595-86c0-a1eb-94b5-42cadb697eb3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51857/f6434cfd-2a62-e7b3-48f8-d1f134d47305.png)
:::

# SOP VOlume Center POints を使ってみる

こういうボリュームに対して、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51857/780d171f-cdd2-5735-6c87-5acb3b8809d8.png)

こういうポイントを生成できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51857/405e4468-b4e3-d960-b1b9-ff065f2a50bf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51857/976796d9-bd6c-9e15-d161-26215cbf4435.png)

## え？やってることって、Point From Volueme と一緒では…？ (困惑)

ええぇ。そう。Point from Volume でも同じことがやれる。
というか、SOP Volume Center Points は処理の関係上、Volume を元のジオメトリの位置に作成していても、0座標のところにポイント郡が作成されてしまう。
Point from Volume の方はそれがない。

赤が Point from Volume で、青が SOP Volume Center Points。
テンプレートが元のジオメトリ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51857/52956d2c-ec2a-0f04-eb07-77a0d870dd0f.png)

# さいごに

まぁ、別のノードでもできるじゃん！ってのは、結果論ではあるのだけど、こうして CMake 作ったり、CMake の環境を試してみたり、みんなどんな考えでノード作ったりしてるのかな？とか、コードを読んだりしながら学べるのはまた面白い分野でもある。
そう、こういう事にも無駄はないのである（言い切り） :exclamation::exclamation::exclamation: