OmniAICreator/Qiita-1.07M huggingface dataset:
Javaを基礎から学ぶその５　Listをもっと知る

この記事は[JavaとPythonを基礎から学びたい私のための Advent Calendar 2024](https://qiita.com/advent-calendar/2024/aruhitonocalendar)の5日目の記事です。
間違っている部分があれば、教えてください。勉強になります。
# List
配列なんかと違って、中の要素を簡単に消したり追加することができるのが便利なやつです。配列と違って最初に何個の要素を入れるかわからなくても作ることができます。

# 宣言、初期化
まず、Listを使うときには
```
import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;
```
これが必要です。これがないと、下のようにエラーが出ます。
```
TEST.java:6: エラー: シンボルを見つけられません
        List<Integer> B=new ArrayList<Integer>();
        ^
  シンボル:   クラス List
  場所: クラス TEST
TEST.java:6: エラー: シンボルを見つけられません
        List<Integer> B=new ArrayList<Integer>();
                            ^
  シンボル:   クラス ArrayList
  場所: クラス TEST
エラー2個
```
こんな感じになります。エラーになって実行することができません。
importをすることで、必要な機能を使える状態にできます。

空のListを作る場合は、
```
 List<Integer> A=new ArrayList<Integer>();
```
こんな感じでできます。この書き方では、このあと入れたいものを入れたり消したりできます。
好きなように入れたり消したりできる状態を<b>「可変」</b>というようです。
ちなみに、最初から中身が入った可変のリストは
```
List<Integer> B=new ArrayList<Integer>(Arrays.asList(0,2,2,3,2));
```
こんな感じで書けます。
これに対して、<b>不変</b>と呼ばれるListが存在します。
```
List<Integer> B=List.of(0,2,2,3,2);
```
最初から中身が入っています。
この場合、入れたいものがあっても謎のエラーが出てきて入れることができませんでした。好きなように入れたり消したりできない状態を<b>「不変」</b>というそうです。
### 可変と不変の違い
```
//可変なList	
	List<Integer> X=new ArrayList<Integer>(Arrays.asList(0,2,2,3,2));
	List<Integer> Y=new ArrayList<Integer>();
	X.add(2);
	Y.add(3);
	//不変なList
	List<Integer> Z=Arrays.asList(0,2,2,3,2);
	Z.add(5);//これがエラーになる
```
並べて書くと、違いが分かりやすいです。Arrays.asListのみのListでは途中で値を追加できませんでした。そうでない、new ArrayList<>()を使ったものの場合は可変になりました。

# 要素を追加する
※可変なListのみできるっぽいです。
```
B.add(6);
```
たったこれだけでListに要素を追加できます。Listの1番目から順番に入れていくことができます。
位置を指定する場合は、こんな感じで書きます。
```
B.add(2,3);
```
かっこの中は、左が入れたい場所(今回は0から数えて3番目)、右が入れたい文字や数値です。調べたら、これのほかにinsertを使うやり方もあるっぽいですが、私の環境ではエラーが出てしまいました。
# 要素を取り除く
※可変なListのみできるっぽいです。
取り除く場合には、
```
B.remove(2,6);
```
removeを使うことで簡単に消すことができます。配列と違って、こっちは簡単に消せるのがいいですね。
# 値を変更する
不変でも可変でもできます。
```
B.set(1,6);
```
setを使うことで、変えたい場所を指定して変えられるようです。
# 並び替え
```
import java.util.Collections;
Collections.sort(B);
```
importが必須です。Collectionsとかいうものを使って並び替えを行うようです。

# まとめ
Listには、追加したり消したりできる可変なListとできない不変なListの二種類が存在する。ぱっと見区別がつかない。気を付けたい。
##  参考文献

https://www.javadrive.jp/python/list/index7.html

https://docs.oracle.com/javase/jp/8/docs/api/java/util/List.html

https://www.sejuku.net/blog/20355

https://envader.plus/article/19

https://www.sejuku.net/blog/14155
Azure Document Intelligence で aiohttp.client_exceptions.ClientPayloadError: Response payload is not completed が出たときの暫定対処

# 背景

Document Intelligence で index を作る際に、特定の PDF ファイルで件名の問題が出た。

恐らくは、以下の問題だと思われるが・・ライブラリ内部の問題っぽいので放置してた・・
が、暫定回避策はいるかなぁと思って対処した備忘録


https://github.com/Azure-Samples/azure-search-openai-demo/issues/885

# 環境

- python 3.11
- DocumentIntelligenceClient 1.0.0b4

https://pypi.org/project/azure-ai-documentintelligence/

# 暫定対処策

問題の発生個所は以下

https://github.com/Azure-Samples/azure-search-openai-demo/blob/e90920faf41295cef884ad83783af4dc3f069e47/app/backend/prepdocslib/pdfparser.py#L54C1-L59C9

エラーだけ見ると、PDF ファイルに問題があるかと思えるんだけど、物理的に 100 page 単位に分割してみたところ、失敗する可能性はあるものの、成功率は格段にあがった。

ってことで、問題の発生個所である begin_analyze_document() を利用する箇所を、数百ページ単位でメモリ上にて分割するように書き換えて、暫定回避策とした。

あ、ついでに、credential の timeout を 60s から延長した。
※cli credential を延長失敗することがあったので。

# あとがき

インデクサーで対処すればいいかなとも思うんだけど、あっちはあっちでまた難しく・・さてどうしたもんか :sweat_smile:
dSPACEのdigital I/Oでエンコーダ計測（仮）

## 1. はじめに
本記事ではdSPACE ControlDeskのdigital I/Oピンの使い方とロータリエンコーダを使うためのブロック配置を説明します．

## 2. プラットフォームの接続方法
digital I/Oは50極のDsub digital I/OⒶポートとdigital I/OⒷポートを使用します．
それぞれのピンとチャンネルとの関連はMicroLabBox (BNCタイプ)の場合は以下のようになっています．
![MicroLabBox_Digital_IO_A_page-0001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2654082/54b0ccce-59e1-78cd-3ef2-ea5a54e3e993.jpeg)
![MicroLabBox_Digital_IO_B_page-0001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2654082/cd40da91-7c3e-558f-cd42-57d1269f322f.jpeg)

どれかのGNDはシステムのGNDに接続するようにしてください．
各プラットフォームの説明書は，MicroLabBoxの場合
`dSPACEのソフトウェアをインストールしたときのフォルダ > Doc > MicroLabBoxHardwareInstallationConfiguration.pdf`が対応しています．


## 3. Simulink
digital I/Oを使うためのSimulinkブロックはよく使うものが3つあります．
- DIO_CLASS1_BIT_IN_BL1
デジタル入力
arudinoでいうこれ↓
```
pinMode(1, INPUT);
digitalRead(1);
```
- DIO_CLASS1_BIT_OUT_BL1
デジタル出力
こちらもarduinoでいうこれ↓
```
pinMode(1, OUTPUT);
digitalWrite(1, HIGH);
```
- EMC_Encoder_BL1
エンコーダ
チャンネルは`Property > Unit > Signal connector pin`に記載されているチャンネルが連動しています．
`Parameters > Number of lines`に使用するエンコーダの1回転あたりのパルス数(PPR)を入力してください．
0~360 [deg]まで計測できますが，360以上は0に折り返されるので初期値などが重要です．

[1] dSPACE, "ブロックの説明（EMC_ENCODER_BLx）" ※要ログイン,

https://www.dspace.com/ja/jpn/home/support/documentation.cfm?helpsetid=RTIElectricMotorControlBlocksetReference&externalid=Topic_ef91c32a-a6ec-4b18-bcfe-af9be3f91f99_--_&Language=ja-jp&Release=RLS2023-A

今回は以下の画像のようなモデルを取り扱います．
![hoge.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2654082/c6bc79b6-ddef-55d9-4713-53f983e90778.png)
各ブロックの役割は以下の通りです．
**電源電圧**
- DS1202_SENSOR_SUPPLY
MicroLabBoxの側面最右側の電源供給ポート(バナナプラグ)の電源電圧を2-20Vのレンジで設定

**角度計測関連**
- direction: システムで取り扱う回転の向きに合わせて1か-1
- gear_ratio: 回転軸に対して歯車やプーリで伝達している場合のギア比
- angle: 回転軸の回転角度 [deg]
- speed: 回転速度？ブロックの設定をいじれば使えるみたいです

**エンコーダ角度リセット**
- EMC_ENCODER_POS_SET_BL1
`EMC Encoder Position Set`への入力信号が立ち上がる(default)とPositionの値でリセットします．
- init_sw: ControlDeskのnumeric inputなどで0→1に書き換えるとエンコーダの値が0にリセットされます．
- init_angle: リセット動作をしたときの角度
M3 MacでTensorflow,PyTorchの導入にかなり苦戦した話

# 環境
- M3 Macbook 
- Sonoma 14.5
- **Intel Macから移行した状態**
# したかったこと
tensorflowやPyTorchでGPUを使いたかった．
```bash
pip install tensorflow-macos
pip install tensorflow-metal
pip install torch torchvision torchaudio
```
をしたかっただけです．
# 起きたこと
## エラー
なんどやっても以下のようなエラーが起きてしまった．
```
TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.
To enable the following instructions: SSE4.1 SSE4.2, in other operations, rebuild TensorFlow with the appropriate compiler flags.
...
RuntimeError: This version of jaxlib was built using AVX instructions, which your CPU and/or operating system do not support. This error is frequently encountered on macOS when running an x86 Python installation on ARM hardware. In this case, try installing an ARM build of Python. Otherwise, you may be able work around this issue by building jaxlib from source.
```
よく見ると，M3のはずなのにCPUと書かれている...
## 原因
原因はIntel Macからデータ移行したことでした．HomeBrewが`x86_64`版になっていたのです．つまり，`arm64`版に移行すれば良いのです．
```python:確認方法
print(platform.platform())
```
`x86_64`と出てきたあなたは変更をしましょう
詳しい移行方法は参考文献をご覧ください.すでにインストールしているものをそのまま移すことができます．
## やったこと
- python 初期化
- HomeBrew変更
- requirement.txtの作成
- python 再インストール
## 結果
```
Python Platform: macOS-14.5-arm64-arm-64bit
Tensor Flow Version: 2.16.2
Keras Version: 3.7.0

Python 3.11.11 (main, Dec  4 2024, 21:48:20) [Clang 16.0.0 (clang-1600.0.26.4)]
Pandas 2.2.3
Scikit-Learn 1.5.2
SciPy 1.14.1
GPU is available
```
# 終わりに
試行錯誤している間に環境が壊れていき，泣きそうでした．8時間かかりました．
# 参考文献
- [Apple Silicon Mac向けGPU利用のTensorFlow, PyTorch設定 – 温故知新 Mobileをはじめ、各種新規開発のためのメモ](https://trinitas.tech/2024/08/21/apple-silicon-mac%E5%90%91%E3%81%91gpu%E5%88%A9%E7%94%A8%E3%81%AEtensorflow-pytorch%E8%A8%AD%E5%AE%9A/)
- [HomeBrew環境移行](https://dev.classmethod.jp/articles/20240407-migrating-library-installed-with-homebrew-from-x8664-to-arm64/)
- [Mac への Python インストール作業の覚書(2024年2月)](https://zenn.dev/konru/articles/python_install_mac_202402)
- [Pythonを完全にアンインストールする方法【Windows/Mac対応】 | AIZINE（エーアイジン）](https://otafuku-lab.co/aizine/python-uninstall0227/#toc4)
回帰テスト75%短縮！MagicPodとの出会い

# はじめに
「回帰テストに3日間も費やすのはもったいない...」

これが私たちのチームが抱えていた最大の課題でした。特に、技術的なバックグラウンドを持たないメンバーでも使えて、かつメンテナンスの手間がかからないテスト自動化ツールを探していました。そんな時に出会ったのが、MagicPodでした。

# 導入前の悩み
毎回の回帰テストで困っていたこと：
- 手動テストに3日間も費やす
- 技術者でないメンバーはテスト自動化に手が出せない
- テスト自動化ツールの保守や更新に人手が必要
- コストと時間の両方が大きな負担に

# MagicPodとの出会いで変わったこと

## 驚きの使いやすさ
「えっ、こんなに簡単でいいの？」

実際に使ってみて、最初に出た感想です。
- プログラミング知識ゼロでもテスト作成が可能
- 画面上の操作だけでテストケースが作れる

## 効果絶大な自動化
- 3日間（21時間）かかっていた回帰テストが5時間に短縮（約75%削減）
- Jenkinsと連携して定期的に自動実行
- 夜間の自動実行で、朝には結果が確認できる

## 運用の手軽さ
- メンテナンスの手間がほとんどなし
- サポートの対応が早い（1〜2営業日以内）

# 具体的な効果

## Before：
- 回帰テストに3日間
- テスト担当者の大きな負担

## After：
- テスト時間が大幅短縮
- チームのストレス軽減
- 日次の品質監視が可能に

# まとめ
MagicPodは、私たちが求めていた「誰でも使える」「メンテナンスが楽」という条件を見事に満たしてくれました。特に、技術的な知識がなくても使えるという点は、チーム全体の効率を大きく向上させました。

回帰テストの自動化にお悩みの方、特に：
- 技術的なハードルを感じている方
- メンテナンスの負担を減らしたい方
- すぐに効果を出したい方

そんな方々に、ぜひMagicPodをお勧めします。
ワンタイムパスワードを CLI から生成し，クリップボードに貼り付ける

## はじめに

大学のシステムにログインする際や，GitHub にログインする際に，ワンタイムパスワードが求められますよね．  
これまでは，以下の手順でログインしていました．

1. ユーザ名，パスワードの入力
2. ワンタイムパスワードを取得するためにスマホを開く
3. スマホの画面を見ながら，ワンタイムパスワードの入力

### いちいちスマホを開くのが面倒 !
ワンタイムパスワードを見るためだけに，スマホのロックを解除し，Google Authenticator を起動するのがめんどうだと感じていました．  
そのため，ターミナルからコマンド1つでワンタイムパスワードを生成し，クリップボードに貼り付けられるようにすればいいのではないかと考えました．

## 環境
```
PC: M4 MacBook Pro
OS: macOS Sequoia 15.0
```

## 作成したプログラム
`<your secret key>` のなかは，自身で取得した秘密鍵を入れてください．

```
#!/bin/bash

SECRET="<your secret key>"

OTP=$(python3 - <<EOF
import base64
import hmac
import hashlib
import struct
import time

def generate_totp(secret):
    key = base64.b32decode(secret, casefold=True)
    timestep = int(time.time()) // 30
    msg = struct.pack(">Q", timestep)
    hmac_hash = hmac.new(key, msg, hashlib.sha1).digest()
    offset = hmac_hash[-1] & 0x0F
    binary = struct.unpack(">I", hmac_hash[offset:offset + 4])[0] & 0x7FFFFFFF
    return '{:06d}'.format(binary % 1000000)

print(generate_totp("$SECRET"))
EOF
)

echo -n "$OTP" | pbcopy
echo "Token: $OTP "
```

## 使用例
ここでは，作成したプログラムを `google_auth` というファイル名で保存することにします．

1. お好きなディレクトリでエディタを開き，`google_auth` にプログラムをコピペします
2. 秘密鍵を取得し，コピペします．

    :::note warn
    注意
    秘密鍵を直接ソースコード内に含めたくない場合は，.env に逃すなど適宜行ってください    

3. `google_auth` に実行権限を付与する．
    ```shell-session
    $ chmod +x google_auth
    ```

4. パスが通っている場所にシンボリックリンクをはる．
プログラムを直接`/bin/`などに置きたくなかったため，シンボリックリンクをはることにしました．
    1. パスが通っている場所 (例: .local/bin/) に移動する．
        ```shell-session
        $ cd ~/.local/bin
        ```
    2. シンボリックリンクをはる．
        ```shell-session
        $ ln -s path/to/google_auth google_auth
        ```  
5. `google_auth` を実行する．
    ```shell-session
    $ google_auth
    ```
6. ワンタイムパスワードが出力され，クリップボードに保存されていることを確認する．
    ```shell-session
    $ Token: 000000
    ```

## まとめ
今回は，ワンタイムパスワードを CLI から生成し，クリップボードに貼り付ける方法について紹介しました．
少しでもお役にたてれば幸いです．
キャプチャをGif形式で取得する

もう無理です。25日も連続で記事書くなんてネタがないので助けてください。皆さんすごいです。で、一年を振り返る Advent Calendar 2024の7日目です。

## Gif形式のキャプチャ取得
これまでテスト結果をエクセルに張り付けまくるために静止画のキャプチャを取ることはありましたが、人に説明するのに動いている状態でキャプチャを取得することがありました。
いつもGame Barで動画撮ってたりしてたのですが、まぁ普通に考えてツールあるよなぁと思いながら以下のツールが使いやすかったので紹介です。（多分皆さん当たり前に使ってるんですかね。）

## ScreenToGif
https://www.screentogif.com

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626174/03da3c6c-9d44-3038-4f56-436421b441ee.png)

ポータブル版もあるのが良いなぁと思っていますが、とりあえず普通にインストールしています。

不要なフレームも切れるのが結構編集しやすいなぁと思っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626174/9b3bdcf0-6c7a-a7a5-12a6-7a044b7ebede.png)
（こういうのをGifでキャプチャ撮って貼れよって言われそう）
（なのでやってみる）
![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626174/9e2399c2-b341-09d2-31d8-485b7088bfcf.gif)

## まとめ
こんな感じで結構簡単にGif形式でキャプチャ撮れるのが良いなと思いました。
いいかげんちゃんと理解したいGradle(第三章)

# はじめに
前回は、タスクについて学びました。
今回は、依存関係の設定について学びます。

## Dependency Management

### プロジェクトの依存関係
```kotlin
repositories {
    // Use Maven Central for resolving dependencies.
    mavenCentral()
}

dependencies {
    // Use JUnit test framework.
    testImplementation("junit:junit:4.13.2")

    // This dependency is used by the application.
    implementation("com.google.guava:guava:32.1.2-jre")
}
```

#### repositories
ライブラリやプラグインを取得元を指定します。

#### dependencies
プロジェクトの依存関係を設定します。

#### 推移的依存関係
ライブラリが依存するライブラリを推移的依存関係と呼ぶ

### 依存関係の確認
```shell
./gradlew dependencies
```

### バージョンカタログ
プロジェクト内で使用する依存関係やプラグインのバージョン情報を一元管理し、ビルドスクリプトでの参照を簡潔にする仕組みです。
これにより、依存関係のバージョン管理が容易になり、プロジェクト全体での一貫性を保てます。
IDEのサポートを受けることもでき、エラーチェックも可能です。
ルートの`gradle/libs.versions.toml`にバージョン情報を記述します。
```toml
[versions] # バージョンを一元管理するためのキー
guava = "32.1.2-jre"

[libraries] # プロジェクト内で使用する依存関係（ライブラリ）を定義
guava = { group = "com.google.guava", name = "guava", version.ref = "guava" } # version.refでversionsのキーを参照

[bundles] # 複数の関連するライブラリを1つのグループとしてまとめて定義するためのキー
groovy = ["groovy-core", "groovy-json", "groovy-nio"]

[plugins] # GradleプラグインのIDとバージョンを一元管理するためのキー
versions = { id = "com.github.ben-manes.versions", version = "0.45.0" }
```
## まとめ
依存関係は、`repositories`と`dependencies`で設定する。
repositoriesは、ライブラリやプラグインを取得元を指定し、dependenciesは、プロジェクトの依存関係を設定する。
バージョンカタログはプロジェクトの依存関係やプラグインのバージョンを一元管理する仕組みである。
サブプロジェクトから参照されるように、ルートの`gradle/libs.versions.toml`に記述する。
【Astro】vueコンポーネントを読み込んだ際にapp is not definedが出る

# 今回行った対策
- ViewTransitionsとvueの併用は諦める

※併用できる方法は調査中。時間なくて、、、。
※下記、メモ程度しか書いていないので、飛ばしていいです。

# 経緯
astroを用いたwebサイトを作成しています(趣味で)。

最初はastroのみで作成していましたが、機能を実装しようとした際にjavascriptを真面目に組むのが面倒になり、vueを実装しました(縋り付きました)。
この時点でページ切り替えに`ViewTransitions`を実装していました。

vueの実装を終えて走らせてみると、、、
下記のエラーが発生しました。

~~~
Uncaught ReferenceError: app is not defined at element.addEventListener.once
~~~

# 解決までの糸口
(続き。)正直、ここでエラーが起きるとは予想をしておらず、まいっていました。

chat GPT君に質問すると、コンポーネントに`client:only="vue"`を付けると良いよ！と、提案されたので実装。初回表示したページは何も起きなくなりました。しかし、ページを遷移するとエラーが発生。あ？なんじゃおら！とやけになりchat GPT君にチャットしまくり、様々な質問方法を試してみましたが、大体同じ`client:only="vue"`の解答ばかりでした。

途方に暮れている時に、ふと"不要そうなコードを全て取り除こう！"と言う気分になり実践。


すると急にエラーが無くなり動く動く。おや？と思い原因箇所を特定していくと、`ViewTransitions`の行でした(ここをコメントアウトすると動く事が分かりました)。
~~~
<head prefix="og: https://ogp.me/ns#">
~省略~
<!-- ここ -->
<!-- <ViewTransitions/> -->
~省略~
<head>
~~~
# 自己解釈
真面目に調べていないです。憶測で、`ViewTransitions`はおそらく前の画面のDOMを残してアニメーション切り替えしているのでしょう(？)。その際に、前のDOMと干渉が起きてエラーをはいているのだろうと推測しています。Astroはレンダリングをサーバー側で済ませてしまうので(SSR)、画面を切り替えた時に#appがどこかに行ってしまうのかな。きっとそう。

若しくはAstro君は優秀で、不要なjavascriptを取り除いてしまう処理になっています。これも何か関係しているのでしょうか。

はぁ。もっと勉強しないと。。。

# 実装イメージ
今回の実装は、templateLayout.astroに`ViewTransitions`を実装しており、このコンポーネントを起点にslotにて、vueコンポーネントを呼び出す実装にしました。

~~~
//page1のイメージ
<templateLayout>
 <!-- slotで挿入 -->
 <vueのコンポーネント />
</templateLayout>

↑ここの切り替え時に何かが起きている↓

//page2のイメージ
<templateLayout>
 <!-- slotで挿入 -->
 <vueのコンポーネント />
</templateLayout>

~~~

# バージョン情報
メモ程度にpackage.jsonの中身を載せて置く。
~~~
    "@astrojs/vue": "^4.5.1",
    "astro": "^4.4.2",
    "astro-imagetools": "^0.9.0",
    ~省略~
    "vue": "^3.5.9"
~~~
Python 3 エンジニア認定基礎試験 振り返り

# はじめに
先日、Python 3 エンジニア認定基礎試験を受験し、合格しました。
自分の振り返りを兼ねて学習方法や試験を受けての所感をまとめます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639400/b495ec59-cbc1-fc4f-aead-4e1a44d65d29.png)

# 記事の対象者
- Python 3 エンジニア認定基礎試験を受験しようと思っている方


# 受験範囲
Python3エンジニア認定基礎試験は[オライリー・ジャパン「Pythonチュートリアル」](https://www.amazon.co.jp/Python%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB-%E7%AC%AC4%E7%89%88-Guido-van-Rossum/dp/4873119359)を主教材として出題されます。このチュートリアルは、[Pythonの公式ドキュメント](https://docs.python.org/ja/3/tutorial/)として無料で公開されています。
出題率は決まっており、下記のとおりです。
| 章立て                                      | 出題率 |
|---------------------------------------------|--------|
| 1章　食欲をそそってみようか                 | 2.5%   |
| 2章　Pythonインタープリタの使い方           | 2.5%   |
| 3章　気楽な入門編                           | 15.0%  |
| 4章　制御構造ツール                         | 22.5%  |
| 5章　データ構造                             | 17.5%  |
| 6章　モジュール                             | 5.0%   |
| 7章　入出力                                 | 2.5%   |
| 8章　エラーと例外                           | 10.0%  |
| 9章　クラス                                 | 5.0%   |
| 10章　標準ライブラリめぐり                  | 10.0%  |
| 11章　標準ライブラリめぐり─PartII           | 2.5%   |
| 12章　仮想環境とパッケージ                  | 2.5%   |
| 13章　次はなに?                             | 0.0%   |
| 14章　対話環境での入力行編集とヒストリ置換  | 2.5%   |


受験料金：1万2千円（税別）
問題数：40問（すべて選択問題）
合格ライン：正答率70％

試験に関する詳細は、以下の公式ページをご覧ください。  
[試験公式ページ](https://cbt.odyssey-com.co.jp/pythonic-exam/python3basic.html)

# 受験しようと思った経緯
Pythonは業務で約1年間使用した経験があります。
その際、手探りで取り組むことが多く、後から振り返ると「この関数や書き方の方が効率的だった」と感じる場面が多々ありました。
その経験から、自分のPythonに関する知識が十分ではないと実感し、今回の受験を決意しました。


# 勉強方法
わたしは基本的な文法を知っていたので、アウトプット中心に学習を行いました。
初学者の方はまずはPythonの基本的な知識をインプットしたほうが学習するうえでも効率的かと思います。
下記が参考にしたものです。

#### １．[PRIME STUDY](https://study.prime-strategy.co.jp/)、[ExamApp](https://python-basic.com/)
基本知識は持っていたのでひたすら、問題を解きました。
その中で誤った問題を抽出して、振り返りの時間を取りました。

#### ２．[Python 言語リファレンス](https://docs.python.org/ja/3/reference/index.html)
前述と重複しますが、模擬試験で誤った問題は公式ドキュメントにて正答を確認しました。

模擬試験を95%程度取れるまで繰り返しました。
勉強時間は約15時間ほどです。

# 受験した感想
実際の試験では、模擬試験と似たような問題が多く出題されました。  
そのため、模擬試験と公式ドキュメントの内容をしっかり理解して受験すれば、問題なく合格できると感じました。 
また、試験対策を通じて、これまで知らなかった関数やライブラリを学ぶことができ、大変勉強になりました。
社内チャットボットを作るにあたって考えたこと　～①チャットボットの形態～

## はじめに
2024年8月頃からAWS上でBedrockを使って社内向け生成AIチャットボットを作っています。
初めて生成AIを使ってみたところで色々考える点があったので、メモとして残しておくことにしました。

生成AI技術が日々すごいスピードで進歩しているので既に古い技術になっていそうなのと、そもそも初心者が書いておりますで、あまり技術的な参考にはならないと思いますが、ポエム的な感じ？でお読みいただけたら幸いです。

## 作りたいもの
よくあるシンプルなQAチャットボットです。
社内のよくある質問をQAデータとして読み込ませて、社員からの質問にQAデータから生成AIに回答させるというものです。構成としてはざっくり以下のようなイメージです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569502/4c2beccb-32f2-8b8c-e5a1-62605c946bda.png)


## 考えたこと①　チャットボットの形態
考えたことの1つ目は、チャットボットのインターフェース部分です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569502/7b075371-1b46-3848-277e-85e95edb3fa5.png)

今回の目的は生成AIを使ってみるという意図が大きかったので、できるだけ早く簡単に作りたい。チャットボットはWEBアプリが分かりやすくていいけど、UI開発は大変そうだし、、、
ということで以下の2つの案を考えました。

- __Difyを利用してWEBアプリとして公開する__
- __AWSのサービスを駆使してTeams連携させる__

### Difyを利用してWEBアプリとして公開する（以降Dify版と呼びます）
Difyは結構すごいAI開発プラットフォームみたいだよと社内で聞いてましたので、
ちょこっと調べてみたら、
__ノーコードで開発できて簡単にWEBアプリとして提供することができる。__
ということで、すぐに採用しました。
（Difyについては多くのサイトで紹介されているので省略します）

#### 構成
Difyのコミュニティ版をEC2にインストールする形としました。
EC2はプライベートVPCに配置し、Bedrock向けにモデルアクセス用のvpcエンドポイントやAPIアクセス用にAPIGW+Lambdaを用意しました。
Difyインストール手順は、下記の記事を参考にさせていただきました。

https://qiita.com/moritalous/items/ecc21c1a5a58f8f0fa9c

#### Dify版の良かった点
- インストールが簡単
- チャットフローやLLMへのプロンプト設定などのUIが非常に使い易い
- 簡単にWEBアプリとして公開できる。想像してる使い方ができる
- スタジオの複製やDSLのエクスポートなど気軽に環境を複数作れるので色々試しやすい
- プレビュー機能によりデバッグしやすい
- 運用系機能が充実している（ログ参照・分析等）

#### Dify版の課題と感じている点
- EC2やALB、NATGWなどのランニングコストがかかる（プライベートVPCに配置したから…）
- 機能追加やバージョンアップが非常に速いので、最新の機能を使いたかったら頻繁に更新確認してアップグレードする必要がある
- 更新するとすぐ保存されてしまう（バックアップ取ってから作業しないと後悔する）
- 冗長化や拡張性を持たせた構成にするには？（まだ調べてないだけ…）

### AWSのサービスを駆使してTeams連携させる（以降Teams版と呼びます）
Teamsからチャット入力させる案です。
下記の記事にある通りTeamsからAWS Chatbot経由でBedrockエージェントに連携するものです。
※着手当時はまだその機能はなく、workflowsからEメール飛ばしてSESやSNSを使ったらどうか？など、、非常に苦労されてました。（センパイが）

https://aws.amazon.com/jp/about-aws/whats-new/2024/09/aws-chatbot-amazon-bedrock-agent-microsoft-teams-slack/

#### 構成
AWS Chatbot + Bedrockの構成になります。
構築手順は下記の記事が参考になると思います。

https://qiita.com/minorun365/items/3d6bb63a59fb10712948

#### Teams版の良かった点
- AWS ChatbotとBedrockという非常にシンプルな構成
- 普段使い慣れているTeamsから気軽に入力できる
- ランニングコスト（AWS利用費）が非常に安い
- AWS ChatbotとBedrockともにマネージドサービスなので非機能要件的な考慮が要らない
- Bedrockエージェントを利用するのでナレッジベースやガードレールの呼び出しが簡単

#### Teams版の課題と感じている点
- Teamsのチャネルへの投稿のためチャネル参加者から見える（そういう使い方としての理解が必要）
- 『@aws ask xxx 質問文』みたいな構文のため、入力の手間がかかる　
- 回答に時間がかかる。（Teams⇔AWS Chatbot間の通信なのか…20~30秒くらい待たされることが多い）
- ワークフロー的な処理をさせようとすると設定が複雑になる（PromptFlowsを呼び出すとか）
- 運用機能は作りこみが必要

## 考えた結果
Dify版もTeams版のどちらも機能として用意しようということで進めましたが、
Teams版の性能面の課題から、今のところはDify版を優先して利用することになりました。
Teams版はTeamsまたはAWS Chatbotのアップデートに期待したいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569502/960f926e-02a5-fedb-2d0a-7347d499ab8f.png)
やってるアジャイルの手法

こんな粗い記事ばっか書いて運営に怒られないかと心配になっていますが、一年を振り返る Advent Calendar 2024の6日目です。

## どんな手法でやってるのか
よく自分が引用する図なのですが、ガートナーが説明しているアジャイル開発の種類として以下のような例が図として挙げられています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626174/63a52ca1-593e-06d8-b9fd-3b11ae8d581d.png)

この中で良く見かけるのが１な気がしていますが、自分がやってることに近いのは４かなと思っています。

初めにグランドデザインを決めてから、要件定義、設計、製造、テストと、要素開発における部分については日々イテレーション（スクラムじゃないのでスプリントとは意図的に呼んでいません。）を回していって、最後に総合テストをまとめて実施するような進め方をしています。

ここでウォーターフォールと違うなと思ったのは、やはりプロダクトの価値にフォーカスしているところかなと思いました。
作ってテストして、イテレーションの最後にデモをやって動かしてみて要望を取り入れて次のイテレーションでバックログに入れて回す、みたいなところがアジリティの高い開発ができているなぁと感じました。

一方で、アジャイル開発は納期がないかというとそんなことは一切なく、納期はしっかりあるので期日は守らないといけないです。
そんな中で仕様凍結しないまま結構ギリギリまで要件の変更とか発生したりすることもあるので、そろそろスケジュールきついんですけどーとなることもあったりする印象です。
なんか初のプロダクトでやりたいことも決まっていて、規模も大きくて期日もあるんだったら、正直ウォーターフォールで作り切った方がよいんじゃないかとも思ったりしますが、この辺はPMBOK7版にもある通り、プロジェクトの性質に合わせてやり方テーラリングするのが大事なんだろうなと思っています。

あと、委託周りでデメリットも感じてるのですが、この辺細かく書くと色々情報漏洩じゃないですが良くなさそうなのでここでは控えます。

## まとめ
ウォーターフォールとアジャイルとでやり方が違う点は色々ありますが、とにかく価値にフォーカスして日々反復してプロダクトを育てていくんだなぁというのを実感しました。
そして、若手の技術者がウォーターフォールに行くなみたいなのがありますが、個人的にはどっちもやれ、以上まる。かなと思います。
プロジェクトの特性に合わせて進め方の選択肢を持っておくのが大事だと思うのと、頭でわかっていても実際やってみるのとでは雲梯の差があるのでそのあたりは色々経験しておくのが良いのかなぁと思った今日この頃です。
出力: Lチカ（マトリクス）

### 背景
メイン基板には8x8のLEDマトリクスが搭載されています。

今回はLEDマトリクスを出力として扱うLチカを行いました。

### Scratch
今回はLEDライトに分類されているブロックを使ってみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/4e5b335a-75af-f18f-9577-a2da3413c238.png)

「赤色で点灯、暗転、
　緑色から青色に3秒間で徐々に変化、
  白色で0.5秒で3回点滅する」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/ece4f5a3-6102-5235-934e-f8a2d6a9c285.png)


### spheroV2
sphero_edu.pyにあるメソッドを見ながらスクリプトを作成しました。

```
import time

from spherov2 import scanner
from spherov2.sphero_edu import EventType, SpheroEduAPI
from spherov2.types import Color

from spherov2.utils import FrameRotationOptions

print("Testing Starting...")
print("Connecting to Bolt...")
toy = scanner.find_BOLT()

if toy is not None:
    print("Connected.")
    with SpheroEduAPI(toy) as api:
        api.set_stabilization(False)

        api.set_main_led(Color(r=255, g=0, b=0)) 
        time.sleep(1)
        api.set_main_led(Color(r=0, g=0, b=0))
        time.sleep(1)

        api.fade(Color(r=0, g=255, b=0), Color(r=0, g=0, b=255), 3) 
        time.sleep(1)

        api.strobe(Color(r=255, g=255, b=255), 0.5, 3)

        api.set_main_led(Color(r=0, g=0, b=0))
        time.sleep(1)

else:
    print("Failed to connect to Sphero.")
```

### まとめ
LEDマトリクスを出力として扱うLチカを実験しました。
ここでは同じ色で表示しましたので、次は線を引いたり四角を描いたりするようにします。
Ollama で x509: certificate signed by unknown authority が出たときの対処

# 背景

会社(proxy 環境下) で Ollama を利用しようとしたら、なんかエラーが出た。その備忘録

https://ollama.com/

## error

> Error: pull model manifest: Get "https://registry.ollama.ai/v2/library/gemma/manifests/latest ": tls: failed to verify certificate: x509: certificate signed by unknown authority


## 環境

- Windows 11
- Powershell 7.4.6 (wsl2 bash でも同様)

# 結論

Ollama を install して起動するとシステムトレイに常駐し、最初にポップアップが出る。
そこをクリックすると、Ollama update が出来た。

で、update されたら、proxy 設定が効くようになって、問題解決した。

# 詳細

インストール直後プロキシー設定が効かなかった。

で、試したのが

1. 別の proxy 設定
   - error 変わらず
1. HTTPS_PROXY/https_proxy という大文字小文字
   - error 変わらず
1. wsl2:bash で
   - error 変わらず
1. ollama pull -insecure
   - FWで blocked
1. GitHub issues を検索
   - 完全に一致したものは以下だったが、解決済みの筈だった
   
https://github.com/ollama/ollama/issues/3336

この辺でいったん疲れて諦めた

で、その後サーバーログを確認すると、

> HTTPS_PROXY: HTTP_PROXY: NO_PROXY: 

となっていて未設定に見えた。

で、config.json に設定する方法とかないのか？と探していたら、
ポップアップでアップデーターが走って、解決した、というのが本当のところ


結局、アップデートしてない状態では問題があったって理解。

アップデート後は、ちゃんと proxy が設定されているのが見えるので、それで確認可能

> HTTPS_PROXY: {proxy url} HTTP_PROXY: NO_PROXY: 


## サーバーログの在処

log や設定の在処
<code>%appdata%\..\Local\Ollama</code>

## アップデートされてるか？

<code>%appdata%\..\Local\Ollama</code>

に、<code>updates</code> フォルダが出来る

# あとがき

なんというか、達成感に乏しいですが、
やり続けると解決するもんだって話ですな。

出来るまでやるからこそ、出来る。みたいな :laughing:
いい加減Flutterに入門してみる (2)

# はじめに

https://qiita.com/grhg/items/646f6b456612e9b30dad
の続きをやっていきます。

# 開発用の証明書を端末にロード

https://docs.flutter.dev/get-started/install/macos/mobile-ios#enable-developer-code-signing-certificates

前回、プロジェクトがなくてスキップしていたので、実機で起動するための設定を進めていきます。

1. Xcode で `ios/Runner.xcworkspace` を開く
1. 接続中のデバイスを選択 (iPhone15)
1. Targets -> Runner -> Signing & Capabilities
1. Team のプルダウンで {名前} (Personal Team) を選択
1. Bundle Identifier にユニークな名前を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3294382/7bc0a755-0cc8-9246-665d-ae528581b683.png)

## デバイス側で証明書を信頼する

一度実行してみたら以下のエラーになったため、指示の通り端末側で設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3294382/a31c28ee-5c64-4c10-1f47-a7a06092d7a2.png)

## 端末での起動成功

もう一度実行したら無事端末で起動できました。
時刻や電池表示がアプリの表示範囲と被っているため、あとで改善した方が良さそうです。

![IMG_5662.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3294382/ce4cce5d-54e8-f9d1-5ef0-d8a754405118.jpeg)

# Codelab の実施

端末での起動ができたので、Codelab に戻っていきます。

## 4. ボタンを追加する

https://codelabs.developers.google.com/codelabs/flutter-codelab-first?hl=ja#3

[PullRequest](https://github.com/tgrhg/flutter_sample/pull/2)

手順通り「Next」ボタンを追加します。
ホットリロードめちゃくちゃ便利です。

![Dec-04-2024 17-16-02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3294382/97a1eb63-c015-ffd6-e44f-0871ec28f848.gif)

## 5. アプリを美しくする

https://codelabs.developers.google.com/codelabs/flutter-codelab-first?hl=ja#4

[PullRequest](https://github.com/tgrhg/flutter_sample/pull/4)

見た目を綺麗にしていきます。
ボタンが綺麗になると違いますね！


![Dec-04-2024 19-50-50.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3294382/21673833-fd1a-982e-cace-c8b462cb84c0.gif)

## 6. 機能を追加する

https://codelabs.developers.google.com/codelabs/flutter-codelab-first?hl=ja#5

[PullRequest](https://github.com/tgrhg/flutter_sample/pull/5)

Like ボタンを追加して、ランダムで生成した単語を保存できるようにします。

![Dec-04-2024 21-10-37.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3294382/176535f9-8cc5-2491-d7c0-f3ff7b4c0881.gif)

Like したリストの表示は次以降っぽいです。
Dart も結構分かりやすく、このくらいの機能追加は楽にできますね。


## 7. ナビゲーション レールを追加する

https://codelabs.developers.google.com/codelabs/flutter-codelab-first?hl=ja#6

[PullRequest](https://github.com/tgrhg/flutter_sample/pull/6)

![Dec-04-2024 21-42-49.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3294382/f236dec0-663e-1211-e4a4-e98f7183a79d.gif)

ナビゲーションを追加しました。だいぶアプリっぽくなってきました (笑)  
あとは、ちゃんとLikeした文字列のリストを出して終わりっぽいです。

## 8. 新しいページを追加する

https://codelabs.developers.google.com/codelabs/flutter-codelab-first?hl=ja#7

最後にLikeしたリストを表示するページを作って完成です！

[PullRequest](https://github.com/tgrhg/flutter_sample/pull/7)

![Dec-04-2024 22-08-34.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3294382/6938949e-64ba-0fa3-04c0-f3b1c00dd74d.gif)

ちょっとだけアレンジして「Clear」ボタンも作ってみました。

## 9. 次のステップ

まとめページのためスキップ。
ここではやりませんが、クロスフェードなどプラスαを実装したバージョンもあるようです。

# おわり

なんとか、第2回で完了することができました！
簡単なサンプルを触っただけですが、かなり作りやすいと感じました。
Dart も初めて触りましたが、特に難しそうなところはなく、触っていればすぐになれそうです。
今度はもう少しちゃんとしたアプリに挑戦してみたいです。
Firefox On Androidで「About:config」を使えるようにする

この記事は[Firefox Forumのコメント](https://discourse.mozilla.org/t/about-config-missing/66537/46)からのコピペです。日本語記事が見当たらなかったので作成しました。


# 1.Firefoxを起動する
# 2.以下のURLをコピペする
```
chrome://geckoview/content/config.xhtml
```
![1000007127.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1175306/bca25d2f-11bd-1750-ff97-c6cc66121b3a.jpeg)

# 3."general.aboutConfig.enable"を有効化
"general.aboutConfig.enable"を"true"にします
![1000007128.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1175306/2f38774d-4daa-3e8d-7522-80960c72c42b.jpeg)

# 4. 完了！
![1000007129.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1175306/13c1adad-ff2e-1716-c971-1dfcb3edf27e.jpeg)
[React] Stateの連結

# 環境
MacBook Pro (2.3 GHz 8コアIntel Core i9)
macOS 14.0（23A344）
Homebrew 4.3.8
gh 2.52.0

# まとめ
ある`state`(ここでは`num`)を受け取り、
別の`state`(ここでは`isShowFace`)を`更新関数`(ここでは`setIsShowFace`)を用いて更新する。

# ソースコードの前に
## フォルダ構成
~~~:folda_structure
├── public/
│   ├── index.html
└── src/
│   ├── index.js(index.jsx)
│   └── App.js(App.jsx)
~~~

## index.html
~~~html:index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <title>React App</title>
  </head>

  <body>
    <div id="root"></div>
  </body>
</html>
~~~

## index.js
~~~jsx:index.js
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import { App } from "./App";

const rootElement = document.getElementById("root");
const root = createRoot(rootElement);

root.render(
  <StrictMode>
    <App />
  </StrictMode>
);
~~~

# ソースコード（App.js）
## 解説
1. `num + 1`で、引数`num`を1つずつ増やす
1. `useState(false)`で、`isShowFace`の初期値を`false`に設定する
1. `||`で、引数(`state`)`isShowFace`が`false`の時に`setIsShowFace(true)`で`isShowFace`を`true`にする
1. `&&`で、引数(`state`)`isShowFace`が`true`の時に`setIsShowFace(false)`で`isShowFace`を`false`にする 
1. `&&`で、引数(`state`)`isShowFace`が`true`の時に`＼(^o^)／ｵﾜﾀ`が表示される

~~~jsx:App.jsx
import { useState } from "react";

export const App = () => {
  const [num, setNum] = useState(0);
  const onClickCountUp = () => {
    setNum(num + 1);
  };

  const [isShowFace, setIsShowFace] = useState(false);

  if (num > 0) {
    if (num % 3 === 0) {
      isShowFace || setIsShowFace(true);
    } else {
      isShowFace && setIsShowFace(false);
    }
  };

  return (
    <>
      <button onclick={onClickCountUp}>カウントアップ</button>
      <p>{num}</p>
      {isShowFace && <p>＼(^o^)／ｵﾜﾀ</p>}
    </>
  );
};
~~~

## Tips
- `||`: 左側が`false`の場合に右側実行 = 左側が`true`の場合は何もしない
- `&&`: 右側が`true`の場合に右側実行 = 左側が`false`の場合は何もしない

## 処理
### `num`が0から1にカウントアップされる時
1. `num`は初期値の`0`、`isShowFace`は初期値の`false`
1. カウントアップ`button`を押す
1. `num`が`1`になる
1. `1`は`3`で割り切れないので、`else`に入る
1. `isShowFace`の初期値`false`なので、何もしない
1. `＼(^o^)／ｵﾜﾀ`は表示されない

### `num`が2から3にカウントアップされる時
1. `num`は`2`、`isShowFace`は`false`
1. カウントアップ`button`を押す
1. `num`が`3`になる
1. `3`は`3`で割り切れるので、`if`文の条件の最初の式に入る
1. `isShowFace`の`false`なので、`setIsShowFace(true)`で`isShowFace`を`true`にする
1. `＼(^o^)／ｵﾜﾀ`が表示される

### `num`が3から4にカウントアップされる時
1. `num`は`3`、`isShowFace`は`true`
1. カウントアップ`button`を押す
1. `num`が`4`になる
1. `4`は`3`で割り切れないので、`else`に入る
1. `isShowFace`の`true`なので、`setIsShowFace(false)`で`isShowFace`を`false`にする
1. `＼(^o^)／ｵﾜﾀ`は表示されない

# イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955010/12aa2c0b-3244-0763-575d-ebda69310d82.png)

# 参考リンク
- [state の管理](https://ja.react.dev/learn/managing-state)
- [コンポーネントの state](https://ja.legacy.reactjs.org/docs/faq-state.html)
- [論理和 (||)](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Logical_OR)
- [論理積 (&&)](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Logical_AND)
- [モダンJavaScriptの基礎から始める挫折しないためのReact入門
](https://www.udemy.com/course/modern_javascipt_react_beginner)
今更だけどUniversal Scene Description (USD)を使ってみた

# Universal Scene Description (USD)ってなんだ？
#### Universal Scene Description (USD)とは
他のDCCツールと共有ができるすごいやつらしい・・・
###### 以下のような強みがあるらしい
 - 派生、バリアント
 - 読み込み速度
 - カスタムアトリビュート追加
 
# とりあえず使ってみる
HoudiniとMayaでUSDを使ってみる
適当に階段っぽいものを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640936/713a2a4e-a329-6950-7360-f0345931f1f2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640936/4e8eb4ae-c8b3-114e-248e-59505ffeaa18.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640936/2bf6a78a-d53d-cfba-8f67-72f30bacfe63.png)

ステップになるような感じで調整をして、USDを出力してみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640936/875b17ba-e635-20fa-e2ab-f5bdfcc984c5.png)

HoudiniでいったんUSDをインポートしてしっかり確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640936/24249291-a805-d0c3-4ed8-2bcc95e41dbe.png)

PythonApiを使用しての保存もできる。
```
from pxr import Usd, UsdGeom

# 新しいUSD Stageを作成
stage = Usd.Stage.CreateNew("output.usda")
root = UsdGeom.Xform.Define(stage, '/Root')

# ジオメトリを追加
sphere = UsdGeom.Sphere.Define(stage, '/Root/Sphere')
sphere.GetRadiusAttr().Set(2.0)

# 保存
stage.GetRootLayer().Save()
print("USDファイルが保存されました: output.usda")
```

このUSDデータをMayaにインポートしてみる。

mayaのプラグインをオンにしてインポート

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640936/87c4f4ff-be8f-e3be-946b-8588dbee895a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640936/6c07f33e-b58d-cf87-dfdc-2039849b11ad.png)

Houdiniで値を変えて階段の角度を変えてHoudini側で保存

その後Mayaでインポート
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640936/eb3d686d-6d08-fa12-ba3a-5323026cef13.png)

Pythonで読み込み
```
from pxr import Usd, UsdGeom

# USDファイルを読み込む
stage = Usd.Stage.Open("パス")
root = UsdGeom.Xform.Define(stage, '/Root')
print("USD Stage loaded:", stage)
```

うまくインポートできた。

Mayaで新しいUSDステージを作成してみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640936/1f0139bd-e2bc-f8e9-95a2-a655ec9aef85.png)

適当にステージにメッシュを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640936/d5e7cf14-f97c-ecf9-ffeb-d1e5d9eba925.png)


保存後、HoudiniのUSDImportノードのRelodeをしてみると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640936/edc9cb0a-baf8-7ef0-780f-582171a79673.png)

うまく反映していた。

 
# 使ってみた感想

USDステージごとの追加でオリジナルを非破壊的に変更することができて、便利だと感じた。
各ソフトを開きなおしたり、インポートする手間がなくなってすごく楽に感じた。
Mayaで作成、Houdiniで配置みたいなことをしたときにUSDで楽に管理できそう。

次はカスタムアトリビュートの追加もやって見たいと思います。
ミュージアムのすすめ

⚠記事の内容は学生個人の見解であり、所属する学科組織を代表するものではありません。

# はじめに
みなさんは博物館や科学館に行くのは好きですか？
今回は、私が今年訪れた魅力的な博物館、科学館の展示を紹介したいと思います。
どうぞお気軽に読んでいただけますと幸いです！

# ふりこのすなもよう(名古屋市科学館)
振り子の先についた穴の空いた容器に砂をいれ、振動させると砂がきれいな模様を描く！という展示です。

実際に体験した結果がこちらです↓

<img width=500 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935898/4a65b6f5-69b2-a185-5466-6732c6010975.jpeg">

きれいな模様になる理由はふりこのひもが**Y字になっている**ことです。（勘の良い方はお気づきだったかもしれません）
振動する向きによって周期が変化することできれいな模様「**リサージュ曲線**」が描かれます。
扱っているテーマは実は少し難しいのですが、子供たちには大人気の体験型展示でした。

<img width=500 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935898/87152d63-d73e-2c9e-1dd4-25507709b505.jpeg">

# 科学の歴史とあゆみ(大阪市立科学館)
その名の通り、これまでの**科学の歴史と発展**を感じることができる展示です。

<img width=500 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935898/28f8efe0-7392-eca8-ec39-878ad20fcdf6.jpeg">

体験と資料が上手く組み合わされており、ひとつひとつの現象をしっかり理解することができます。
「力と運動」「光と熱」「電気と磁気」「科学の利用」の4テーマにわかれています。
ここでは詳しい紹介を割愛させていただきますが、例えば真空に近づけた時の音の伝わり方の変化や、電磁誘導などの現象を使った楽しい体験型展示がたくさんあります。
科学者たちの探究の道のりをたどることができる、素敵な展示でした✨

# メタバース加速器博物館(KEK)
名前の通り、VR空間に加速器が再現されています。
加速器の中に入って内部の構造をみたり、電子が加速される様子を見学したりすることができます。
仮想空間の利点を活かした、とても面白い博物館となっています。

オープンに公開されているためVR空間で海外の研究者の方と議論が始まることもあるそうです！!
必要スペックを満たしたパソコンがあれば簡単に訪れることができますので、ぜひ一度体験してみてください。
**加速器の内部に頭をつっこんで覗く**という他にはない体験ができますよ！

# おわりに
ここで紹介させていただいた科学館には、もっと多くの展示がありますし、もちろん他にも魅力的な科学館や博物館はたくさんあります。
大学生になっても、新鮮な気づきがいっぱいでとても楽しいので、みなさんもぜひ科学館や博物館を訪れてみてください！
拙い文章でしたが、お読みいただきありがとうございました。

# 参考サイト・出典
[名古屋市科学館ホームページ](http://www.ncsm.city.nagoya.jp/)
[大阪市立科学館ホームページ](https://www.sci-museum.jp/)
[メタバース加速器博物館](https://www2.kek.jp/APD/mam/)

※画像は全て筆者が撮影したもの
Fortranでテトリス

# Fortranでコンソールゲーム
自分で[ANSI ASCII](https://ja.wikipedia.org/wiki/ASCII)コードを使ってコンソールゲームを書くのは大変。
[ncurses](https://invisible-island.net/ncurses/announce.html)を使うのがいいかも。。と思っていたら、`blocktran`なるものがありました。

# [blocktran](https://github.com/fortran-gaming/blocktran)
ncursesをfortranから利用して作られた、コンソール用テトリスです。

## ビルド&ラン
ncursesはあらかじめapt-getしておいてください。
```bash
git clone https://github.com/fortran-gaming/blocktran.git
cd blocktran
# fpm をビルドツールに使う場合、例えばpythonのpipで用意できる
python -m venv .env
source .env/bin/activate
pip install fpm 
# fpmによるゲームビルドと実行
fpm build # ゲームのビルド
fpm run   # これでゲームが実行される
```
## ゲーム画面
一人で遊ぶときの画面例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275690/7ebfbda7-0644-f80a-c081-d8d55664bb9d.png)

コンピュータと対戦もできる(右側がCPU)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275690/91b00ac9-2e6e-9a54-0b1a-8352239b0e75.png)

なんとなく、[nethack](https://ja.wikipedia.org/wiki/NetHack)を彷彿とさせます。

以上、Fortranのゲームでした。
複合フラグメント整理

一年を振り返る Advent Calendar 2024の5日目です。もう完全に量と質を求める気はなくなったので、この一年をメモというか感想というか書きなぐってみようと思います。

## シーケンス図を使った設計をするようになった
今までのエンジニア人生で実際にシーケンス図を描くことがなかったのですが、今回のプロジェクトではPlantUMLを使ってシーケンス図を描くことになりました。

https://plantuml.com/ja/

VSCodeでもプラグインあってこんな感じで描画もできるのでとても使いやすいです。

![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626174/bb3cda8f-daac-0f3b-4339-b524add3e4dd.gif)

とりあえず複合フラグメントってどんな種類があるのかいまいちわかってないのでメモに残す。

## 複合フラグメントってなんぞや

https://products.sint.co.jp/ober/blog/sequence
>シーケンス図の複合フラグメントとは、並列処理・ループ処理・条件分岐などの具体的な処理内容を示す記号ルールのことです。

良く書いてるaltとかloopとか、あれなんて言うんやろと思ってたら複合フラグメントというらしい、というのを学んだ（シーケンス図なんか書いてこなかったから全然知らんかった）。

## どんな種類があるのか

以下サイト引用。

https://www.itsenka.com/contents/development/uml/sequence.html

複合フラグメント一覧
|InteractionOperator　　|意味|
|---|---|
|ref|別のシーケンス図を参照することを表します。|
|alt|分岐処理を表します。|
|opt|条件を満たした場合のみ実行される処理を表します。
|par|並列処理を表します。|
|loop|ループ（繰り返し）処理を表します。|
|break|処理の中断を表します。|
|critical|マルチスレッド環境での同期処理など、排他制御を表します。|
|assert|処理が妥当であるための定義を表します。|
|neg|本来、実行されるはずがない処理（メッセージ）であることを表します。|
|ignore|あまり重要な処理（メッセージ）ではないことを表します。|
|consider|重要な処理（メッセージ）であることを表します。|

altとoptがいまいちわかってなかったですが、
「alt」-条件分岐、if-elseのイメージ
「opt」-条件一致、
ということを理解しました。

基本的にref,alt,opt,loopぐらいしか見ないので他のやつ知らなかったです。

## まとめ
これまで詳細設計って文字で処理を書きなぐる系の設計書しか書いてこなかったですが、シーケンス図で処理を表現するのってやっぱ見やすいなと思いました。
とはいえ、シーケンス図でオブジェクト指向の設計を表現しきるのって限界あるよねってのも感じました。
この辺の知見も頑張って抑えていきたいと思います。（とはいえアプリ開発じゃなくてインフラがやりたい。）
SwapAnything.ioがProduct Huntに登場しました！🚀

こんにちは、Qiitaコミュニティの皆さん！

私たちは、本日12月4日に[SwapAnything.io](https://swapanything.io/face-swap)がProduct Huntに公開されたことをお知らせできることを非常に嬉しく思っています！🎉
SwapAnything.ioは、写真や動画の中で顔や服を簡単に入れ替えられるAIツールです。高度な編集スキルは必要なく、数回クリックするだけで瞬時に変換を実現します。

[SwapAnything.ioをProduct Huntでチェック](https://www.producthunt.com/posts/swapanything-io)

SwapAnything.ioとは？
SwapAnything.ioは、AIを活用して、写真や動画の顔や服を簡単に入れ替えることができるツールです。コンテンツクリエイターやファッション愛好者はもちろん、クリエイティブなビジュアルを作成したい方なら誰でも簡単に利用できます。

なぜこのツールを作ったのか？
私たち自身もクリエイターとして、簡単で直感的に使えるツールを求めていました。特に、クリエイティブなビジュアルを短時間で作成することが重要だと感じていたので、SwapAnything.ioを開発しました。
このツールを使えば、誰でもすぐに、そして簡単に面白い変換を行うことができるようになります。

SwapAnything.ioの特徴
簡単な顔や服の入れ替え: 数回のクリックで写真や動画の顔や服を入れ替えられます。
使いやすさ: デザインや編集の経験がなくても、誰でも簡単に利用できます。
高速な処理: 高速かつ正確な変換を提供します。
無料クレジット: 新規ユーザーには無料クレジットを提供していますので、リスクなしでお試しいただけます。
SwapAnything.ioを試してみる

フィードバックをお聞かせください！
私たちは、ユーザーからのフィードバックを大切にしています。今後の機能追加や改善について、何かご意見があればぜひお聞かせください。また、質問があれば気軽にコメントしてください。

これからもSwapAnything.ioをよろしくお願いします！💬
020 AI屋さんの　LLMに２００万トークン全文入力　野良右衛門＋ブログ編


020 AI屋さんの　LLMに２００万トークン全文入力　野良右衛門＋ブログ編



無事に野良右衛門も完成しました。
沢山、冒険譚を語ってくれます。



https://st.bono0.com/nora01

と言うことで、早速サーバーレスにネットワークストレージをマウントしてアプリを動的に更新できる　webアプリの完成です。
詳細は、下記参照。

-----



![スクリーンショット 2024-12-04 20.50.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/8459137c-11ad-052f-a548-25de5fd24cd1.png)



折角なので
野良右衛門に　ブログの作り方を聞いてみました。
AI屋さんは、通常　手元にDBの全出力＋前処理くらいしか使いませんが
DB側のSQLで簡単なフィルタもしてあげます。
CRUD　は管理者・読者など、対人画面が面倒なので最小限です。




イメージとしては　簡易WordPress　くらいです。
広告収入は出来ないので、広告媒体としては無価値ですが、
情報発信源のWebとしては、純粋です。
ブログなので、動的な記事の投稿は簡単です。

　WordPress
　DB
　レンタルサーバー

の置き換えです。

　streamlit
　DB（≒sqlite3＋クラウドストレージ）
　cloudrun(＋dockerHub)

DBは、お好みでサーバーを別途用意すれば何でも良いかと思います。
お値段は、ほぼ無料です。
デプロイもdockerHub経由で、一度作れば誰でも利用可能です。



 


![スクリーンショット 2024-12-04 21.00.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/420e93a2-7108-9ef2-04a3-509a34bacd79.png)


野良右衛門に教わった通りで
あっさり完成です。
ちょっとしたブログや掲示板くらいなら
これでも十分　足りそうですね。

しかし、「なんで突然ブログ作ったの？」って気もしますが
AI屋さんもDB使いましょうね　くらいの動機です。



目次

https://qiita.com/bono0/items/dc1d000c98af7e07c9a7

今回も、あっさりと
　020 AI屋さんの　LLMに２００万トークン全文入力　野良右衛門＋ブログ編
完成です。おめでとうございます。


ー続くー
【プロダクトマネジメント】チームで仕事を進めるためにユーザーヒアリングの重要性

## はじめに
みなさんは、ユーザーヒアリングしていますか？

ユーザーヒアリングには、準備や計画が必要で、時間もかかります。そして、その過程で本当に課題が見つかるのか、不安に感じることもあるでしょう。

私自身、ここ2年ほどQiitaのプロダクトマネージャー（PdM）として働いてきました。
その中で、リリーススピードを最優先にするあまり、ユーザーヒアリングの重要性を深く考えることができていませんでした。振り返れば、ユーザーヒアリングを軽視していたと言えるかもしれません。

しかし、ある出来事をきっかけにユーザーヒアリング重要性を痛感しました。
そのため、この記事では、この経験を通じて気づいたことを、この記事にまとめたいと思います。

## 以前の私
以前の私は、ユーザーヒアリングに対してあまり前向きではありませんでした。

その理由はシンプルで、私自身がプロダクトを誰よりも使い込んでいる自信があったからです。いわゆる「ドッグフーディング」を通じて、ユーザーの視点や課題を十分に理解していると思っていました。

そのため、ユーザーの声を直接聞かなくても、ユーザーの課題や事業の課題を加味した的確な判断ができると思っていました。

また、ユーザーヒアリングには多くの時間と労力が必要です。
ユーザーにインタビューをしたり、アンケートを取ったりするには準備や調整が必要で、場合によってはリリースが1か月以上遅れることもあります。

「せっかく良いアイデアがあるのに、そんなに時間をかけていたらプロダクトの成長スピードが落ちてしまうのでは？」と考え、ユーザーヒアリングをやらずに進めることが多かったです。

そんな中で、私は自分のやり方に強い自信を持っていました。
「ドッグフーディングで得た気づきこそが、ユーザーにとって一番価値のある改善案だ」と思い込んでいたのです。

振り返ってみると、それは自己満足の範囲でしかなく、ユーザーの本当の声に耳を傾ける機会を逃していたのかもしれません。

## ユーザーヒアリングの重要性について気づいたきっかけ

いつも通り、ドッグフーディングを通じてユーザー目線で改善点を見つけ出し、「これならユーザーも喜ぶし、プロダクトの数値にも良い影響を与えられる」と確信したアイデアをもとに、新しいプロジェクトを立ち上げました。

デザイナーと二人三脚でUIやUXを詰め、エンジニアに共有したときのことです。
その場でエンジニアからこんなフィードバックが返ってきました

+ ユーザーからこの機能が欲しいという声が上がっているのは理解できる
+ 理想通りに進めばプロダクトの数値が良くなる可能性があるのもわかる
+ でも、感覚として「使われるイメージ」が湧かない

その言葉を聞いて、私は思わず「ん？？？どういうこと？？？」と頭の中が混乱しました。

「機能を求めている人がいるなら、使われるんじゃないの？」
「理想通りに進むようにこれから試行錯誤するんじゃないの？」
「こういう人が、こういうふうに使うって共有したじゃん。それがイメージできないってどういうこと？」

こんな疑問が次々と浮かびました。

もやもやしたままでは、何も進めないので、一度ユーザーにアンケートを取って、ユーザーが私の考えたシナリオ通りに行動するかどうかを確認することにしました。

その結果、ユーザーの行動は私の想定に近いものでした。

しかし、この経験を通じて、私は大きな気づきを得ました。それは、チームで知見を共有することの大切さです。ドッグフーディングだけでは、私個人にしか知見がたまりません。そして、私が得た知見は主観的で定性的なものなので、それを共有しても一般化しづらいのです。

一方で、アンケートやインタビューを行うと、複数のユーザーの声をもとにした客観的で定量的な知見を得ることができます。それをチーム全体で共有することで、意思決定がより確実で説得力のあるものになると実感しました。このプロセスは、単にプロダクトを改善するだけでなく、チーム全体の連携や理解を深める上でも非常に有効です。

## チームで仕事を進めるためにユーザーヒアリングが重要な理由
私が経験を通じて感じたのは、ユーザーヒアリングが単にプロダクトを改善するためだけのものではなく、**チーム全体で目標を共有し、一体感を持って進むために不可欠なプロセス**だということです。

ユーザーヒアリングの最大の強みは、主観を超えて客観的なデータやインサイトをチームで共有できることです。ドッグフーディングで得られる知見は貴重ですが、それはあくまで「私」という一個人の視点に基づいたものであり、主観的で一般化しにくいものです。

一方、ユーザーヒアリングによって収集されたデータは、複数のユーザーの声に裏付けられており、客観性と信頼性を持っています。

これにより、以下のような効果が得られると思います。

1. **共通認識の形成**
1. **議論の質の向上**
1. **チームの信頼関係の強化**
1. **リスクの軽減**

## まとめ
ユーザーヒアリングは確かに手間がかかります。
しかし、それはチームの方向性を正しく定め、全員が同じ目標に向かって進むための投資なのかもしれません。

これからも私は、ドッグフーディングを続けながら、ユーザーヒアリングを活用してチームで仕事を進めていきたいと思います。そしてプロダクトが、ユーザーにとって本当に価値のあるものになることを願っています。

---

最後まで読んでくださってありがとうございます！

普段はデザインやフロントエンドを中心にQiitaで記事を投稿しているので、ぜひQiitaのフォローとX(Twitter)のフォローをお願いします。

https://twitter.com/degudegu2510
適応度地形について

この記事は、[適応型ソフトウェア開発 アドベントカレンダー 2024](https://qiita.com/advent-calendar/2024/adaptive-software-development) の 7日目です。

## 適応度地形について
適応型ソフトウェア開発を進める書籍でジム・ハイスミス氏はよくプロジェクトを山登りに例えて表現する。

筆者はこの適応度地形という言葉もその山登りをメタファーとして、プロジェクトをとらえた結果生まれてきた概念だと認識している。

### 適応度地形とはなにか
ここで筆者も山登りを例に表現したいと思う。

山登りといっても、いろいろ分野が違う。

例えば、ピクニック・日帰り登山・ロッククライミング・エベレスト登頂といった具合に、難易度や表情、過酷さが如実に変わってくる。

何を登ろうとしているのかによって、装備も変わってくるものだ。
このような環境の違いを適応度地形という表現をしている。


### 開発に置き換えて考える
この適応度地形という考え方を、開発案件に置き換えて考えてみたい。

ピクニックのような趣味の個人コーディングや１週間程度で終わらせることができる社内ツール開発、実際に顧客に届けるプロダクト開発や、人命の関わるシステムの開発など、それぞれ難易度や表情は違う。

このそれぞれの状態や地形に応じて、我々も上り方を模索する必要が出てくる。

ピクニックに行く装備でエベレストには挑めないし、ロッククライミングをするための装備やチョークをピクニックにもっていく必要もない。むしろ身重になってしまい、つまらない。


### 適応度地形を意識する
このように案件が有している地形情報を適切にとらえ、その時に必要な装備・準備・対策を常に講じることで、最適な開発体験を進めることを意識する。

これが適応型ソフトウェア開発における、適応度地形という考え方だ。


## 筆者のスクラムフレームワーク選択の失敗について
ここで改めて筆者のスクラムフレームワーク選択の失敗について振り返ってみたい。
詳細はこちらの記事を見てもらえると嬉しい。

https://qiita.com/h-kinocoboy/items/083c2fcabaf843a20a64

これはまさに適応度地形をとらえられていないことで起きた、準備・装備のミスマッチだ。

### 作るものがわからない状態
この創るものがわからない状態でスクラムのようにフォーカスしていくフレームワークを選択したことが、装備のミス。

創るものが見えていない段階で、チームの速度を測ろうとする心は、間違った準備だった。

このように案件を完了させるだけのスキルを持ったチームだったとしても、適応度地形を勘違いすると、全く通じなくなる。

それもそのはずだ。

## まとめ
何を登るのか、どんな装備で行くのかを考えずに、登山を始めたらそれはもう頓挫してしまうことは明白だと思う。
最悪遭難してしまうだろう。

従って、アジャイル開発やウォーターフォール開発でも、それに適した適応度地形が存在する。

そのため、どのタイミングで何を選び、どう使うのかをしっかり考えて選定することこそ、開発や通年通して行う仕事を進めるためには必要なマインドであることを学ぶことができた。
SwapAnything.ioがProduct Huntに登場しました！🚀

こんにちは、Qiitaコミュニティの皆さん！

私たちは、本日12月4日にSwapAnything.ioがProduct Huntに公開されたことをお知らせできることを非常に嬉しく思っています！🎉
SwapAnything.ioは、写真や動画の中で顔や服を簡単に入れ替えられるAIツールです。高度な編集スキルは必要なく、数回クリックするだけで瞬時に変換を実現します。

SwapAnything.ioをProduct Huntでチェック

SwapAnything.ioとは？
SwapAnything.ioは、AIを活用して、写真や動画の顔や服を簡単に入れ替えることができるツールです。コンテンツクリエイターやファッション愛好者はもちろん、クリエイティブなビジュアルを作成したい方なら誰でも簡単に利用できます。

なぜこのツールを作ったのか？
私たち自身もクリエイターとして、簡単で直感的に使えるツールを求めていました。特に、クリエイティブなビジュアルを短時間で作成することが重要だと感じていたので、SwapAnything.ioを開発しました。
このツールを使えば、誰でもすぐに、そして簡単に面白い変換を行うことができるようになります。

SwapAnything.ioの特徴
簡単な顔や服の入れ替え: 数回のクリックで写真や動画の顔や服を入れ替えられます。
使いやすさ: デザインや編集の経験がなくても、誰でも簡単に利用できます。
高速な処理: 高速かつ正確な変換を提供します。
無料クレジット: 新規ユーザーには無料クレジットを提供していますので、リスクなしでお試しいただけます。
SwapAnything.ioを試してみる

フィードバックをお聞かせください！
私たちは、ユーザーからのフィードバックを大切にしています。今後の機能追加や改善について、何かご意見があればぜひお聞かせください。また、質問があれば気軽にコメントしてください。

これからもSwapAnything.ioをよろしくお願いします！💬
RustをNode.jsで動かす3つの方法

RustはフロントエンドおよびJavaScriptにおけるツールで欠かせない存在となりました。
JavaScriptランタイムDenoや、高速なフォーマッター・リンターBiome、トランスパイラーSWCなどです。

我々は `npm install` などで知らず知らずのうちにRustで作られたソフトウェアをインストールし、利用しています。
これに気づかないのは、我々はRust環境(rustupやcargo)をセットアップせずとも利用できるからです。

さて、どのようにしてRustコードは我々のコンピュータで動いているのでしょうか。

## 1. WebAssembly

1つ目はWebAssembly、通称WASM(ﾜｽﾞﾑ)です。Rustおよびその周辺ツールチェーンではRustをWASMに変換するソリューションが提供されています。

rustc(Rustコンパイラ)はwasm出力に対応し、[wasm-bindgen](https://github.com/rustwasm/wasm-bindgen)や[wasm-pack](https://github.com/rustwasm/wasm-pack)を用いることでRust用のインターフェースやJavaScriptのグルーコードが提供されます。
wasm-bindgenやwasm-packを利用して出力したWASMも当然Node.jsから利用できます。
ブラウザとNode.js、その他JavaScriptランタイムで同一のRustコードを動かす場合、これが第一の選択肢になるでしょう。

また、WebAssembly System Interface、通称WASI(ﾜｽﾞｨ)というものもあります。

WASIはWASMのスーパーセットであり、ブラウザ以外での利用が主になります。Node.jsでもWASIのための[API](https://nodejs.org/docs/latest-v22.x/api/wasi.html)がExperimentalで用意されており(2024/12/04現在)、利用することができます。

WASMはポータビリティに優れ、OS間の差異がないため今後さらなる流行が期待できます。しかしながらWASIによって改善しつつあるものの、ファイルシステムやネットワーク通信を扱うようなケースではエコシステムが未成熟と言わざるを得ません。

これら技術を用いたソフトウェアとして以下のようなものがあります：

* [amaro](https://github.com/nodejs/amaro) (Node.jsでTypeScriptを動かすためのtransformer)
  * amaroはwasm-packを用いてWASMが生成されています
* [Rolldown](https://github.com/rolldown/rolldown)
  * 一部WASIが利用されています

## 2. Node-API (N-API)

Node-APIは、ネイティブ技術をNode.jsから利用するためのAPIです。ネイティブのバイナリを用いるのでNode.jsのJavaScriptやWASMよりも高速に動作します。

Rustでは、NAPI-RSを筆頭にNode-APIをサポートしたツールチェインが存在しており、これを利用することでRustコードをネイティブの速度でNode.jsから利用することができます。

Node-APIはネイティブの速度を手に入れつつ、Node.jsとの通信も確立されている技術です。ネイティブで制約がない故に、セキュリティ面の懸念があるほか、OS別にバイナリを配布する必要があるなどいい面ばかりではありません。

この技術を用いたソフトウェアとしては以下のようなものがあります：

* [Rolldown](https://github.com/rolldown/rolldown)
  * NAPI-RSでRustコードがバイナリに変換され主に利用されます
* [Rollup](https://github.com/rollup/rollup)
  * 以前はJavaScriptで書かれていましたが、現在はパース処理がRust(SWC)製のものになっています

## 3. child_process

Node.jsにはchild_processというモジュールがあり、実行可能形式のファイルを実行することができます。

Rustを実行可能形式のバイナリとして出力して、child_processモジュールのexec関数などを利用することでRustコードを実行できます。

child_process、というか実行可能形式では、ネイティブの速度を手に入れつつ、Node.js以外のDenoやその他言語からもその気になれば利用できます。Node-APIと同様セキュリティやOS別バイナリなどのデメリットに加え、Node.jsと直接通信ができないという問題もあります。

この技術を用いたソフトウェアとしては以下のようなものがあります：

* [Biome](https://github.com/biomejs/biome)
  * Biomeは実行可能形式のファイルを配布し、execすることで実現されています

## まとめ

||ポータビリティ|Node.jsとの通信|セキュリティ|速度|ツールチェイン|
|--|--|--|--|--|--|
|1a. WASM|◎(ブラウザでもOK)|○|◎|○|○|
|1b. WASI|◎|○|○|○|△|
|2. Node-API|×(Node.js限定,OS別バイナリ)|○|△|◎|○|
|3. child_process|△(OS別バイナリ)|△|△|◎|◎|
How the PCNSE Exam Boosted My Skills as a Network Security Engineer

As a network security engineer, I recently had the opportunity to take the Palo Alto Networks Certified Security Engineer (PCNSE) exam, and I'm excited to share how this certification has enhanced my expertise. Passing the PCNSE exam has significantly improved my skills in deploying and configuring Palo Alto Networks Next-Generation Firewalls. The knowledge gained through the preparation and exam process has equipped me with a deeper understanding of advanced security concepts, network architectures, and firewall management.

The PCNSE certification is a valuable asset for anyone working in network security. Whether you're a network security engineer, systems engineer, systems integrator, or support engineer, this exam validates your ability to implement and maintain Palo Alto Networks' solutions. With the increasing demand for skilled professionals in network security, this certification can help you stand out and demonstrate your proficiency in securing and optimizing network infrastructures.

I highly recommend the PCNSE exam to anyone involved in deploying and configuring Palo Alto Networks Next-Generation Firewalls. It's an excellent way to advance your career and build a solid foundation in network security. The exam covers everything from firewall policies to advanced troubleshooting, making it a must-have for professionals looking to excel in the field of network security.

If you're interested in taking the PCNSE exam, I strongly suggest using a practice test. [Palo Alto Networks PCNSE Practice Test](https://www.p2pexams.com/palo-alto-networks/pdf/pcnse) is a great way to prepare effectively, as it helps you familiarize yourself with the exam format and improve your chances of passing the test.