OmniAICreator/Qiita-1.07M huggingface dataset:
Dynamixelの位置制御で速度を操作する方法

# はじめに
こんにちは，ロボット制作などをしている高校生のBasalteと申します．
今回はDyamixelで位置制御をしているときに，その位置までに至るための速度を調節する方法を紹介します．

# DynamixelSDK
今回はROS2 Humble DynamixelSDKでの動作確認となっています．
その他の環境では検証していません(バイナリを叩いているのでおそらくどの環境でも行けると思います)．
DynamixelをROS2 Humble DynamixelSDKで扱う基本的なところはこちらで詳しく解説されているので，こちらをご覧ください．

https://zenn.dev/tasada038/articles/422d3f7f2232bb

# Profile Velocity
Dynamixelの位置制御で速度を制御するために，Profile Velocityというものを使います．

https://www.besttechnology.co.jp/modules/knowledge/?X%20Series%20Control%20table#k31e5f2f


基本的な位置制御をするROS2 C++を用意し，次の内容を書き足していきます．

https://zenn.dev/tasada038/articles/422d3f7f2232bb

こちらの記事の"Position Control Mode：位置制御"の章で使用している
ros2 run dynamixel_sdk_examples read_write_position_node
に書き足していきます．

まず必要な変数を追加します．

~~~C++
#define ADDR_DRIVE_MODE           10
#define TIME_BASED_PROFILE        4

#define PROFILE_VELOCITY          112
~~~

https://github.com/tasada038/DynamixelSDK/blob/3ec16f3b41d2bdfc06fff63f81a65f172eeb4533/dynamixel_sdk_examples/src/read_write_position_node.cpp#L171

こちらの171行目付近のsetupDynamixel()の中に以下を追加します．
dxl_idはお好みで設定してください．そのままだと接続されているすべてのDynamixelでこの設定が適応されます．
~~~C++
dxl_comm_result = packetHandler->write1ByteTxRx(
        portHandler,
        dxl_id,
        ADDR_DRIVE_MODE,
        TIME_BASED_PROFILE,  
        &dxl_error
  );
  
uint32_t arm_profile = 1500;

dxl_comm_result = packetHandler->write4ByteTxRx(
        portHandler,
        dxl_id,
        PROFILE_VELOCITY,
        arm_profile,
        &dxl_error
  );
~~~

こうすることにより，Drive modeがTime based profileを表す4に設定され，Profile velocityがarm_profile変数の1500に定義されます．
この1500を変えることにより，速度を調整することができます．

# 速度調整
速度を調整するためにいちいち設定を変更してビルドファイルを削除しcolcon buildするのも面倒です．
そのため，Dynamixel Wiardで調整をすることができます．
Drive modeをBit 2 Time-based Profileに設定してsaveし，
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1895796/1b0284db-afa8-a647-07cc-f0da40e91970.png)


Profile Velocityの数値を変更して位置制御で動かします．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1895796/b2cd4125-c2ce-ba41-8906-8250fa0c0657.png)

トルクを入れたままProfile Velocityの値を変更して最適な設定を見つけることができます．(動く幅が狭いととてもゆっくりになるため、そのあたりも好みで調整しましょう)

# おわりに
今回はDynamixelの位置制御時の速度を設定する方法を紹介しました．
今後もロボットに関する記事を投稿していきます．よろしくお願いいたします．

https://x.com/basalte1199
デザインパターンを教えるときにー設計と実装はセットでー

設計通りに実装が進まないメンバがいたため、上司から「設計段階で止めず、実装まできちんと指導するように」と指摘を受けました。当時、該当のメンバはある程度の実装経験があり、設計からそのまま実装に移れるだろうと考えていましたが、実際にはいくつかの問題が発生しました。

### 具体的な事例

#### 1. FactoryMethodパターンを適用したソートクラスの設計・実装

- **設計段階**: クラス図では、ソートクラスが比較処理を担当する`Comparer`クラスを生成するように記載されていました。`CreateInstance`メソッドで`Comparer`のインスタンスを生成する設計です。
- **実装段階**: 実装時、`CreateInstance`メソッド内で`Comparer`クラスを生成せず、比較処理自体を直接`CreateInstance`メソッドに書いてしまい、`Comparer`クラスが使われていませんでした。

#### 2. 実装から設計に逆戻りする例

別のメンバのケースでは、まず実装を行い、その後で設計を作成していました。この結果、適用したいと考えていたデザインパターンに合致しない設計となり、無駄な作業が発生していました。

### 問題への対応

#### 1. 設計から実装への変換の練習

この問題は、設計と実装の対応を正しく理解できていない、もしくは経験が不足していることが原因と考えました。そのため、以下のような対応を行いました：

- **意図の説明**: FactoryMethodパターンの`CreateInstance`メソッドは、インスタンス生成のみを担当するメソッドであり、それ以外の処理を記載しないことを具体的に説明しました。
- **ペアプログラミング**: 実装の流れを一緒に進める中で、設計から実装への変換をサポートしました。
- **練習の機会を提供**: 設計通りに実装する練習を繰り返すことで、設計の意図を正確に反映したコードを書くスキルを習得してもらいました。

#### 2. 設計の重要性を説明

実装から設計を後付けする問題については、「なぜ設計を先に行うのか」を具体的に説明しました。以下のような点を伝えました：

- **手戻りのリスク**: 実装から設計を行うと、適用したいデザインパターンに沿わない設計になる可能性が高くなり、実装の多くを作り直す必要が出る場合があります。
- **効率の向上**: 設計を先に行うことで、実装時に迷いが少なくなり、作業効率が上がる。
- **目的に合った設計の重要性**: たとえば、今回の場合、デザインパターンを適用した設計を学ぶのが目的だったため、工程を飛ばすと学習効果が失われることを指摘しました。
UTMでOpenWrtを起動してみた

# はじめに

この記事は、Qiita Advent Calendar 13日目の記事です。
以下の記事より、すべての記事をご覧になれます。

https://qiita.com/0_terarin_0/items/2b60d47a2d0e64a273c3

# 本編

きっかけはふとした日常。今後自分が大人になっていく時に、さまざまなライフスタイルの変化を体験していく中で今後ずっとおつきあいするものなので、ある程度自分で運ぶことができるようにしないといけないなと思い、今回作ってみたかったのです。しかしながら！！実際にその機種を入手することはできない！ということで、今回はとりあえずUTM上でOpenWrtを起動してみたいなと思います。

https://openwrt.org/start

ちなみに、一応仮想化の案内ということで、ドキュメントは用意されています。

https://openwrt.org/docs/guide-user/virtualization/utm

ということで、この手順に従ってやっていきましょう！

## OpenWrtのイメージをダウンロード

下のページからまずイメージをダウンロードします。なお、イメージは`{ver}/targets/armsr/armv8/generic-ext4-combined.img.gz`というものをダウンロードしてください。

https://downloads.openwrt.org/releases/

ダウンロードが終わったら展開しましょう。ただし、アーカイブユーテリティでは展開できませんので`gzip`コマンドでやりましょう。

```zsh
gzip -d ~/Downloads/generic-ext4-combined.img.gz
```

## UTMでVMを作成

オペレーションシステムはOther、UEFIモード（レガシー起動モードはオフ）、起動イメージはNoにして、1024MBのメモリ、2コアのCPUを設定してそのまま進みます。

![Screenshot 2024-12-16 at 22.45.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583428/7046fe2d-5e6c-a5b7-e492-a95fb90457f2.png)

設定を閉じる前に編集後にメニューを開くのチェックボックスにチェックを入れます。

![Screenshot 2024-12-16 at 22.46.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583428/b396286b-80eb-8861-5179-e226f492eb66.png)

するとそのままVMの設定をするようなページが開かれますので、起動イメージとネットワーク、シリアルコンソールの設定をしましょう。

起動イメージはドライブのNewから先ほどのimgファイルをインポートして、起動順序をドラッグで上に上げてください。

ネットワークを設定します。デバイスの種類に関してはそのままで問題ないです。

![Screenshot 2024-12-16 at 22.47.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583428/c42b5458-abab-5dcb-8301-3679dab6c0b0.png)

一つはHost Onlyモード、もう一つはShared Networkにしてください。こうすることで、Macがネットワークにつながっていない場合にもOpenWrtに接続することができます。

起動しましょう！なんかスクロールが止まったらその時点でReturnを押してください。

そのままネットワークの設定を行います。

```bash
uci show network.lan
uci set network.lan.ipaddr='10.0.2.2'
uci commit
service network restart

opkg update
```

これでOpkgのアップデートが変更できたら終わりです！

# 最後に

今後はこのOpenWrtで遊んでみたいと思います。どうにかFastfetchをインストールできるとこまでできたらいいですね。
AWS認定-AWS Certified Machine Learning - Specialty(MLS-C01)を受験してみた

# はじめに
「AWS Certified Machine Learning - Specialty」(MLS-C01)を受験しました。
機械学習領域はまったく知らない状態から勉強しました。

https://aws.amazon.com/jp/certification/certified-machine-learning-specialty/

# スコア
**819/1000**
無事に合格できました。

# 試験ガイド
### 分野の比重
• 第 1 分野: データエンジニアリング (採点対象コンテンツの 20%)
• 第 2 分野: 探索的データ分析 (採点対象コンテンツの 24%)
• 第 3 分野: ***モデリング*** (採点対象コンテンツの 36%)
• 第 4 分野: 機械学習の実装と運用 (採点対象コンテンツの 20%)

個人的には「モデリング」領域の試験ガイドに記載されている内容がよくわからず苦戦した印象です。。

# 受験対策

### AWS Certified Machine Learning - Specialty (MLS-C01) 試験ガイド
どのAWS試験もですが、、、
試験ガイドは一通り目を通して、それとなく出題されるAWSサービスを確認します。

### Web問題集
3～4周くらい実施しました。
よくわからない単語についてはネットや本で調べたりしてます。
今回はAWSの用語というよりも機械学習用語がわかりづらい印象でした。

### G検定対策本
#### ディープラーニングG検定 最強の合格テキスト
いろんな人の合格記や感想などを見たらG検定のテキストを使って対策している人が多くいたので、私も物は試しで購入してみました。
内容は直接的にAWSのサービスと関係ない本ではありますが、AWS認定機械学習対策の本があまりないのと、基礎的なことを初めに学習したかったので、こちらの本を使いました。
わからない用語が出た時などにひく辞書のような使い方をしてました。

# 受験方法
テストセンターで受験しました。
久々に予約しましたが、12月だからかもしれませんがあまり空きがなく結構混んでました。

# 受験の感想とか
いまいちイメージが湧かず、機械学習の専門用語と機能・内容を覚えるのに結構苦戦しました。
AWSのサービスもですが、機械学習系の業務に使っていないサービスについても出題範囲に含まれているのでイメージが湧かなかったです。

「AI Practitioner」と「Machine Learning Engineer - Associate」の２つを持っていない人はこっちから受験したほうが良いと思います。
一応、「Practitioner」と「Associate」の資格なので、「Specialty」よりは簡単と思っています。

もしくは、G検定をあらかじめ取得していると楽なのかなと思います。

https://aws.amazon.com/jp/certification/certified-ai-practitioner/?ch=sec&sec=rmg&d=1

https://aws.amazon.com/jp/certification/certified-machine-learning-engineer-associate/?ch=sec&sec=rmg&d=1

# おわりに
合格できてよかったです。
次は専門知識のネットワークあたりに挑戦したいと考えています。

https://aws.amazon.com/jp/certification/certified-advanced-networking-specialty/?ch=sec&sec=rmg&d=1


# AWSの相談・お困りごとありましたら、、、

AWSの活用方法や、お困りごとの相談、随時、お仕事の受付しております。

https://www.cs-cloud-aid.com/
切手の最小枚数の組み合わせを動的計画法で解く

郵便料金を支払うために必要な最小枚数の切手の組み合わせを求める問題を動的計画法（DP）を使って効率的に解く方法について解説します。この問題は、いわゆる「コイン問題」と似た性質を持ち、動的計画法の典型的な応用例の一つです。

## 問題の定義

与えられた一連の切手の額面（例えば、10円、60円、100円など）を使って、指定された料金（例えば、120円）を支払うために必要な最小枚数の切手を求める問題です。切手の額面は無限に枚数があるものとします。

### 例
切手の額面: 10円, 60円, 100円  
支払う料金: 120円

この場合、最小枚数で120円を支払うためには、60円の切手を2枚使うのが最小となります。なお、金額の大きいほうから引く計算をすると（120-100=20で、残り20円を10円切手2枚とすると、計3枚となる）、正しい解が得られないので注意です。

## 解法のアプローチ

この問題は、「最小枚数で特定の金額を作る」という部分がコイン問題に似ているため、動的計画法（DP）を使うことで効率的に解けます。動的計画法を使用すると、部分問題を解決することで最終的な解を得ることができます。

### 動的計画法のステップ

1. **状態定義**  
   `dp[i]`を、金額`i`を作るために必要な最小枚数の切手と定義します。

2. **初期条件**  
   `dp[0] = 0`とします。0円を作るためには切手が0枚で十分です。

3. **遷移式**  
   各金額`i`について、切手の額面`c`（10円、50円、100円など）を使って金額`i`を作る場合、次の遷移式を使います。
$$
   dp[i] = \min(dp[i], dp[i - c] + 1)
$$
   これは、金額`i - c`を作るための最小枚数に1枚の切手`c`を足したものを比較するという意味です。

4. **最終的な解**  
   `dp[target]`（指定された料金`target`）が、最小枚数の切手の枚数を示します。

## 実装

以下にPythonで実装したコードを示します。

```python
def min_stamps(target, stamps):
    # dp[i] : 金額iを作るための最小枚数
    dp = [float('inf')] * (target + 1)
    dp[0] = 0  # 0円を作るためには0枚の切手でOK

    for i in range(1, target + 1):
        for stamp in stamps:
            if i - stamp >= 0:
                dp[i] = min(dp[i], dp[i - stamp] + 1)

    return dp[target] if dp[target] != float('inf') else -1  # 目標金額を作れない場合は-1を返す

# 使用例
stamps = [10, 60, 100]  # 切手の額面
target = 120  # 支払う金額
result = min_stamps(target, stamps)
print(f"最小枚数の切手: {result}")
```

実行結果
```python
最小枚数の切手: 2
```

しっかり正しい答えが出ました。
Tailwindcssの即時反映の設定【Docker】

## 今回の記事
既存のdocker＋RailsアプリにTailwindcssを導入している時、
開発環境で変更が即時反映されないので全然効率的じゃないじゃん！ということで
 HTMLのCSSクラスを変更したら勝手にCSSにも適用されるようにしてみたのでやり方をまとめました。
## Tailwindcssの導入
`./bin/bundle add tailwindcss-rails`
`./bin/rails tailwindcss:install`
を実行
↓
dockerを再ビルド

tailwindcssの導入は成功しているがClassを変更してもtailwindが適用されない

`.bin/dev`を実行すると適用されるが（エラーで継続しない）
変更毎にいちいち`.bin/dev`を実行するのはめんどくさい

bin/devで行っているのは`bin/rails tailwindcss:watch`というコマンド
これをコンテナで直接実行すれば
```
root@09e95a2a975d:/app# bin/rails tailwindcss:watch

Rebuilding...
Done in 580ms.
Rebuilding...
Done in 115ms.
```
こんな感じで編集を感知して自動で適用してくれる。
しかし`bin/rails tailwindcss:watch`を実行するのもめんどくさい
なのでdockerの起動オプションに起動を含めてしまう
### Dockerの起動時にtailwindの変更監視を含める
```docker-compose.yml
#変更前
web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails server -b 0.0.0.0"
```
今のコードはweb起動時に、このコマンドを行っている。
これをbin/devに置き換え、その中で実行するように変更する↓
```docker-compose.yml
#変更後
web:
    build: .
    command: bin/dev
```

```bin/dev.sh
#!/usr/bin/env sh

if ! gem list foreman -i --silent; then
  echo "Installing foreman..."
  gem install foreman
fi

export PORT="${PORT:-3000}"

export RUBY_DEBUG_OPEN="true"
export RUBY_DEBUG_LAZY="true"

exec foreman start -f Procfile.dev "$@"
```
bin/devはProckfileに書いてある処理を実行するファイル
なのでProckfileにdocker-composeで書いていた処理を追加する
```Prockfile.dev
#変更前
web: bin/rails server
css: bin/rails tailwindcss:watch
```
```Prockfile.dev
#変更後
web: bash -c "rm -f tmp/pids/server.pid && bundle exec rails server -b 0.0.0.0"
css: bin/rails tailwindcss:watch[always]　←超重要
```
重要なのは`[always]`
これがないとCSSがすぐに終了してしまう

↓公式にしれっと書かれている(このエラーと何時間戦ったか....)

https://github.com/rails/tailwindcss-rails?tab=readme-ov-file#running-in-a-docker-container-exits-prematurely

ここまで変更出来たら再buildして起動する

```
web-1  | 07:55:22 web.1  | *  Max threads: 5
web-1  | 07:55:22 web.1  | *  Environment: development
web-1  | 07:55:22 web.1  | *          PID: 19
web-1  | 07:55:22 web.1  | * Listening on http://0.0.0.0:3000
web-1  | 07:55:22 web.1  | Use Ctrl-C to stop
web-1  | 07:55:23 css.1  |
web-1  | 07:55:23 css.1  | Rebuilding...
web-1  | 07:55:23 css.1  |
web-1  | 07:55:23 css.1  | Done in 645ms.
web-1  | 07:55:40 css.1  |
web-1  | 07:55:40 css.1  | Rebuilding...
web-1  | 07:55:40 css.1  |
web-1  | 07:55:40 css.1  | Done in 224ms.
```
こんな感じで自動で立ち上がりtailwindの変更があったらrebuildingしてくれるようになる

## 補足
develop環境で変更が即時反映されない時は
```enviroments/development.rb
  config.assets.compile = true
  config.assets.debug = false
  config.assets.digest = false
```
development.rbがこのように設定されているか確認しよう
対称ルーティングのすゝめ

# はじめに
ネットワーク設計の時に対称性を気にしてますか？
対称ルーティングは必ずしも満たさなければならないというものではありませんがさまざまなトラブルの原因になり得ます。自分はあまり理解しておらず、作成した構成図を上司に見せて指摘されるまであまりデメリットに気づけませんでした。
本記事では対称ルーティングはなぜ良いのかについてまとめていこうと思います。

# 対称にしないと何が問題なの
## 対称ルーティングと非対称ルーティングの違い
対称ルーティングと非対称ルーティングの違いをざっくり説明するとこうなります。

- 対称ルーティング：往路と復路で同じパスを通る
- 非対称ルーティング：往路と復路で異なるパスを通る

具体的には以下のような構成が当てはまります。

![sg for pods説明-ページ3.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546781/6db09abb-80c5-76d8-272c-8babf00415ae.png)
- 対称ルーティング側
    - 行きの通信: インターネット → Internet Gateway → NAT Gateway → EC2
    - 帰りの通信: EC2 → NAT Gateway → Internet Gateway → インターネット
- 非対称ルーティング側
    - 行きの通信: インターネット → Internet Gateway → EC2
    - 帰りの通信: EC2 → NAT Gateway → Internet Gateway → インターネット

非対称の方では行きと帰りのルートが異なりますよね？これがルーティングの対称性の違いです。

## 非対称ルーティングがもたらす問題
- ステートフルインスペクション
    - ファイアウォールでのセッション管理の問題
- パフォーマンスへの影響
    - レイテンシーの一貫性が保たれない
    - 帯域幅の非効率な使用
- トラブルシューティングの複雑化
    - モニタリングポイントの増加

ここでもしかしたらステートフルインスペクションという単語が見慣れないかもしれません。

ステートフルインスペクションとは、通信のセッション管理によって、戻りの通信を動的に許可する仕組みのことです。
ファイアウォールは、LAN側から送信したデータをセッションログとして一時的に保存しておき、WAN側から受け取ったパケットがセッションログと整合性が合うか確認し、整合性が合う場合だけ通信を許可します。
そのため、行きと帰りの通信の経路が異なると、セッションログの整合性が合わず、通信ができなくなります。

# 終わりに
以上より非対称ルーティングは運用面で弊害を起こしやすい設計であることがわかります。
皆さんもネットワーク構成を行う際に参考にしてみてください。
Betti's theorem「マクスウェルの相反定理を使うと、何を計算できますか。入力条件も教えて下さい。」をAI先生に教えてもらう。(2/2)

(再)以下おすすめです。
https://qiita.com/mrrclb48z/items/369b66044a32fdc3c8ee#sympy%E3%81%A7bettis-theorem%E3%81%A7
　
・以下、正しいのか、私の力で判断できませんでした。申し訳ありません。
・???sympyのコードを聞きました。

:::note info
前　 [「何を計算できますか。入力条件も教えて下さい。(1/2)」
](https://qiita.com/mrrclb48z/items/e7eab594dc3e876ed9ca)
:::

**マクスウェルの相反定理を使うと、何を計算できますか。入力条件も教えて下さい。**

# Gemini先生へ
#### 1.画像アップロードだけ
＞Example of Betti's Theorem
https://en.wikipedia.org/wiki/Betti%27s_theorem#/media/File:Bettti's_Theorem_Beam.png

https://en.wikipedia.org/wiki/Betti%27s_theorem

>(回答抜粋)
添付されたファイルは、構造力学における構造物の変形に関する図のようです。...

#### 2.画像アップロード と　ソースコード依頼 
画像からsympyのソースコードをお願いします。
>(回答抜粋)
画像そのものから直接 SymPy のソースコードを生成することはできません。画像を解析して数式を抽出する画像処理技術と、抽出された数式を SymPy のコードに変換する処理が必要になります。...
参考までに、SymPy の基本的な使い方に関する情報源をいくつか挙げておきます。...
```python
from sympy import *

# 記号の定義
E, I, L, P = symbols('E I L P')

# たわみの計算式
delta = (P * L**3) / (48 * E * I)

# 数値代入
delta_numeric = delta.subs({E: 200e9, I: 1e-5, L: 5, P: 10e3})

# 結果の出力
print(f"たわみ: {delta}")
print(f"数値計算結果: {delta_numeric}")
```

# ChatGPT先生へ

# copilot先生へ

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

# いつもと違うおすすめです。
#### wikipedia
Firefox のabout:config 設定。TLSやポップアップ、アドレスバー非表示など

*　FireFox 133 にて確認した。(2024年12月最新版)

## SSL_ERROR_UNSUPPORTED_VERSION エラー

![ssl_error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/f9eec385-67ff-fab7-e899-7bb8e6b7a3d8.png)

### 設定

`about:config` を開き、
`security.tls.version.min` 値を確認。

* 初期値は `3`
* `1`に下げてエラーが出なくなるか確認。

![ssl.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/e3660d67-d566-1085-dfd5-c0fb9cb26f6f.png)


## UserAgentを変更する

* UserAgentは[こちら](https://testpage.jp/tool/ip_user_agent.php)で確認が出来る。
* `about:config` にて以下文字列を変更。

```
general.useragent.override
```


## popupを許可

```
privacy.popups.showBrowserMessage
を trueにする
```

## (失敗) 混在コンテンツの許可

* ページ中に http://localhost/ へのアクセスもある場合など用 (エラーが出る場合のみ)

```
security.mixed_content.block_active_content
を false
```

## (失敗) c:\内のcssを読み込ませたい場合

```
security.fileuri.strict_origin_policy
を false
```

## (未確認) file:// リンクを許可する場合

```
network.protocol-handler.expose.file
を false にすると外部アプリで開くようになる
```


## アドレスバーを非表示にする

https://qiita.com/techno-tanoC/items/0f9df63bfaf54ced3cfa

<details><summary>windows用</summary>

```css
/*
* Custom App Mode Settings for Firefox.
* This duplicates the effects of Chrome App mode.
*
*/

@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");

/* Hide the Toolbars. */
#TabsToolbar,
#PersonalToolbar,
#BookmarksToolbar,
#MenuToolbar,
#tabbrowser-tabs {
    visibility: collapse !important;
}

/* Hide main toolbar contents EXCEPT Address bar */
/* leaves space for the window buttons */
#search-container,
#stop-reload-button {
    display: none !important;
}

#nav-bar {
    margin-top: -32px !important;
    margin-bottom: -4px !important;
}

/* Hide Address bar when NOT focused (e.g., F6) */
#urlbar:not([focused]),
#urlbar:not([focused]) * {
    min-height: 0 !important;
    max-height: 0 !important;
    padding: 0 !important;
    margin: 0 !important;
    border: none !important;
}

```
</details>

Firefox Portable を使う場合は以下のように
`profile\Chrome\userChrome.css` を用意。

`about:config` にて
`toolkit.legacyUserProfileCustomizations.stylesheets` を `true` にしておく。


![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/9e889167-19d6-3b43-5d29-65be40d82b99.png)

### タイトルバーを表示

今のままだとウィンドウの移動がマウスで出来ないため表示させる。

`about:config` にて

```
browser.tabs.inTitlebar
0
```


## 再配布時の注意

### 保存されているパスワードの削除

`about:logins` にて保存されているパスワードの削除をしておく

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/34872708-2e18-3050-8a92-b54adab69a44.png)

### 自動削除

ブラウザのキャッシュサイズが大きくなっていくので自動削除しておくと便利

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/ac15c001-89ab-2af7-14ef-5c06324b82f2.png)



## 設定の和訳ページ

https://null.michikusa.jp/config/config_d.html
Fargateのイメージの更新で旧版をそれなりにする

## 環境

Fargateで下記を動かしている
- payara(TALON)
- mysql

ECRに登録しているコンテナイメージを更新する際、ローカルのコンテナを更新してからECRにプッシュしている。久しぶりだとドレに対して更新をかけるのか等、フリーズしてしまうのでメモ。

### 方針

ECRにpushしているイメージの更新運用で下記が考慮点
- payaraで動いている静的コンテンツ（ライセンスファイルなど）書き換え時の運用
- payaraで動いている動的コンテンツ更新時の運用
- mysqlはデータ部分を共有ボリュームにして、mysql自体のバージョンアップ以外はイメージ更新なしの運用

２番目のは基本的に無い（TALONでは動的コンテンツをDBで管理しているため）と理解しているので現時点では除外して考える。
３番目のは１番目と同じ運用にできるように考える。

### payara静的ファイルを書き換えする際の運用

```bash:こんな感じがスタート地点。ほかのコンテナ消しているのでシンプルに見えるが実際は亜流のコンテナがたくさんある。
$ docker ps -a
CONTAINER ID   IMAGE           COMMAND                   CREATED       STATUS                      PORTS                                                                                            NAMES
02f78bf3ec8b   talon20241112   "/bin/sh -c '/bin/sh…"   4 weeks ago   Exited (255) 17 hours ago   0.0.0.0:4848->4848/tcp, :::4848->4848/tcp, 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 6900/tcp   talon_latest
77cc95c7effc   talon:test      "/bin/sh -c '/usr/lo…"   5 weeks ago   Exited (137) 4 weeks ago                                                                                                     talon20241108

$ docker images
REPOSITORY                                                           TAG           IMAGE ID       CREATED        SIZE
123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/prod/talon         latest        d9a9949764bf   4 weeks ago    990MB
talon                                                                20241112      d9a9949764bf   4 weeks ago    990MB
```
旧版に対して更新をかける運用にする。
※更新後版は20241217で旧版は20241112
エントリポイントなどは更新なし（指定なしでコンテナ起動）の前提。
```
docker run -d --name=talon20241217 -p 8080:8080 -p 4848:4848 talon:20241112
```
して旧版コンテナをtalon20241217で起動し、このコンテナに対してファイル更新をかける。
更新後コミット
※ローカルとFargateでDBの接続文字列違うので更新忘れずに。allowPublicKeyRetrievalも。
※イメージファイルサイズ縮小等は別の方法で考える必要あり
```
docker commit talon20241217 talon:20241217
```

タグ付け
```
docker tag talon:20241217 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/prod/talon:latest
```

ECRプッシュ。latestだけECRに置く運用とする。
```
docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/prod/talon:latest
```

### まとめ
この運用だとECRでは最新版のみの管理でシンプルだし、コスト最小化もできそう。
ローカルdockerでの旧版履歴は下記のようになる予定で、なんとなくいい感じ。
改善点はいっぱいありそうだけど、いったんは満足。

```bash:上記運用実施後のdocker imagesコマンド出力結果（イメージ）
REPOSITORY                                                           TAG           IMAGE ID       CREATED        SIZE
talon                                                                20241227      d9a9XXXXXXXX   1 day ago      990MB
123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/prod/talon         latest        d9a9XXXXXXXX   1 day ago      990MB
talon                                                                20241112      d9a9949764bf   4 weeks ago    990MB
talon                                                                20241001      YYYYYYYYYYYY   2 Months ago   990MB
```
Flutter レイアウト調整方法一覧

## **1. レイアウト構築ウィジェット**
### **行・列ウィジェット**
- **`Row`**: 子ウィジェットを横方向に並べる。
- **`Column`**: 子ウィジェットを縦方向に並べる。
- **主なプロパティ**:
  - `mainAxisAlignment`: 主軸方向の整列。
  - `crossAxisAlignment`: 副軸方向の整列。

### **スタックウィジェット**
- **`Stack`**: ウィジェットを重ねる。
- **`Positioned`**: `Stack`内でウィジェットを特定の位置に配置。

### **グリッドウィジェット**
- **`GridView`**: 格子状のレイアウトを作成。
- **`SliverGrid`**: カスタマイズ可能なグリッド。

---

## **2. サイズ調整ウィジェット**
- **`Container`**: サイズ、色、余白、装飾などを設定可能。
- **`SizedBox`**: 固定のサイズを指定。
- **`FractionallySizedBox`**: 親ウィジェットに対する相対的なサイズを指定。

---

## **3. 整列用ウィジェット**
- **`Align`**: 子ウィジェットを親ウィジェット内で整列。
- **`Center`**: 子ウィジェットを中央に配置。
- **`Baseline`**: 子ウィジェットの基準線に沿って配置。
- **`Spacer`**: `Row`や`Column`でスペースを均等に分割。

---

## **4. 余白・パディング**
- **`Padding`**: 子ウィジェットに内側の余白を設定。
- **`Margin`（`Container`内の`margin`プロパティ）**: 外側の余白を設定。

---

## **5. フレキシブルなサイズ管理**
- **`Expanded`**: `Row`や`Column`内で利用し、空きスペースを埋める。
- **`Flexible`**: 子ウィジェットを柔軟にサイズ調整。

---

## **6. リスト表示ウィジェット**
- **`ListView`**: スクロール可能なリスト。
- **`CustomScrollView`**: スクロールビューのカスタマイズ。
- **`SliverList`**: パフォーマンスを考慮したリスト表示。

---

## **7. レスポンシブ対応**
- **`MediaQuery`**: 画面サイズやデバイスの情報を取得して動的にレイアウトを調整。
- **`LayoutBuilder`**: 親ウィジェットの制約に基づいてレイアウトを構築。

---

## **8. デコレーション・スタイル**
- **`Container`の`decoration`プロパティ**:
  - 背景色、枠線、影、角丸などを設定可能。
- **`BoxDecoration`**:
  - 線形グラデーションや円形背景などを追加。

---

## **9. フロー系レイアウト**
- **`Wrap`**: 子ウィジェットを行や列にラップして表示。
- **`Flow`**: 高度なカスタマイズが可能なフロー型レイアウト。

---

## **10. カスタムレイアウト**
- **`CustomMultiChildLayout`**: 独自のレイアウトロジックを構築。
- **`Stack` + カスタム`Positioned`**: 自由な配置。

---

## **11. アニメーション付きレイアウト**
- **`AnimatedContainer`**: サイズやスタイルの変化をアニメーション化。
- **`AnimatedAlign`**: 整列位置をアニメーションで変更。

---

## **12. マルチプラットフォーム対応**
- **`FittedBox`**: 子ウィジェットを親ウィジェット内にフィットさせる。
- **`AspectRatio`**: 特定のアスペクト比でサイズを制御。

---
RestTemplateでAPIの呼び出し

Spring BootでRestTemplateを使用してリクエストを送信して、レスポンスを取得する方法を以下に示します。
### サンプルコード
```java
package exsample;

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.client.HttpServerErrorException;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;

public class PutApiExample {

  public static void main(String[] args) {
    // RestTemplateのインスタンスを作成
    RestTemplate restTemplate = new RestTemplate();

    // PUTリクエストのURL
    String url = "http://localhost:8080/api/puts"; // 実際のAPIエンドポイントに置き換えてください

    // リクエストボディを作成
    OrderRequest requestDto = new OrderRequest();
    requestDto.setOrderId("0123456");

    // ヘッダーを設定（必要に応じて）
    HttpHeaders headers = new HttpHeaders();
    headers.set("Content-Type", "application/json");

    // HttpEntityにリクエストボディとヘッダーを設定
    HttpEntity<OrderRequest> requestEntity = new HttpEntity<>(requestDto,headers);

    try {
      // PUTリクエストを送信し、レスポンスを受け取る
      ResponseEntity<OrderResponse> responseEntity = restTemplate
          .exchange(url, HttpMethod.PUT, requestEntity, OrderResponse.class);

      // レスポンスを取得
      OrderResponse responseDto = responseEntity.getBody();

      // レスポンスを出力
      if (responseDto != null) {
        System.out.println("OrderId: " + responseDto.getOrderId());
        System.out.println("ResultCd: " + responseDto.getResultCd());
        System.out.println("ErrorMessage: " + responseDto.getErrorMessage());
      } else {
        System.out.println("レスポンスが空です");
      }
    } catch (HttpClientErrorException e) {
      // HTTPステータスコードが4xxの場合の処理
      System.out.println("HTTPステータスコード: " + e.getStatusCode());
      System.out.println("エラーレスポンス: " + e.getResponseBodyAsString());
    } catch (HttpServerErrorException e) {
      // HTTPステータスコードが5xxの場合の処理
      System.out.println("HTTPステータスコード: " + e.getStatusCode());
      System.out.println("エラーレスポンス: " + e.getResponseBodyAsString());
    } catch (Exception e) {
      // その他の例外処理
      System.out.println("エラーが発生しました: " + e.getMessage());
    }
  }
}
```
### 説明
- Response
RestTemplateのexchange()のリターン値を取得できます。

- HttpClientErrorExceptionのキャッチ

RestTemplateは、HTTPステータスコードが4xxや5xxの場合にHttpClientErrorExceptionやHttpServerErrorExceptionをスローします。
HttpClientErrorExceptionをキャッチすることで、400エラーのレスポンスを取得できます。

- HttpServerErrorExceptionのキャッチ

RestTemplateは、HTTPステータスコードが5xxの場合にHttpServerErrorExceptionをスローします。
この例外をキャッチすることで、500エラーのレスポンスを取得できます。

- エラーレスポンスの取得

e.getResponseBodyAsString()を使用して、エラーレスポンスのボディを文字列として取得します。
必要に応じて、JSON文字列をパースしてオブジェクトに変換することもできます。

- その他の例外処理

ネットワークエラーやその他の例外が発生する可能性あるため、Exceptionをキャッチして適切に処理します。
GitHub Actionsを利用したFirebaseへの自動デプロイについて

　開発中GitHub Actionsを利用したFirebaseへの自動デプロイを実装中躓いたため共有させていただきます。
自動デプロイするためfirebase-deploy.ymlに設定を記述する必要があるのですが、知らぬ間にgit管理ディレクトリを2階層で開発を行ってしまっており、今回working-derectoryの指定が必要になりました。通常であればworking-derectoryの指定は不要だと思います。

また自動デプロイは成功するもののアプリが起動しないことから、検証ツールで確認するとローカルで記述したsupabaseとの認証ができていない旨のメッセージが表示されていました。
.envファイルにsupabaseとの認証に関するURLとKeyを記述しており.gitignoreで.envファイルを管理していたため、GitHubにpushしても.envファイルはpushされないことから、認証が成立しない症状になっておりました。
そこでGitHubのActions secrets and variablesでURLとkeyを設定し、ymlファイルで環境変数を読み込み.envファイルを作成する記述を追加することで自動デプロイに成功することができました。
　今回の実装でymlをそもそもそんなに書いたことが無かったため、1つ1つの意味を調べることでとても学びの多い実装となりました。

![スクリーンショット 2024-12-18 202857.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/857acc2a-3a45-a868-c590-73215190d9c1.jpeg)


<br>

```firebase-deploy.yml
name: Build and Deploy to Firebase # 名前 何でもよい

on:
  push:
    branches:
      - main  # mainブランチにpushされたときに実行

jobs:
  build_and_deploy:
    runs-on: ubuntu-latest # 使用するOS

    steps:
      # sample-vite ディレクトリのみをチェックアウト
      - name: Checkout repository (sample-vite only)
        uses: actions/checkout@v3
        with:
           path: sample-vite # すべてのファイルをsample-viteディレクトリにチェックアウトするようにしています。

      # Node.jsをセットアップ
      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18.16.0'

      # 依存パッケージのインストール 環境変数を注入し、ビルド
      - name: Inject environment variables and build
      # .envファイルを.gitignoreで管理しているためURL,KEYをGitHubに登録した内容を代入しそれを新規作成の.envへ上書きする設定
      # npm と yarn のバージョンを指定（すでに同じバージョンならスキップ）
        run: |
          npm list -g npm@9.5.1 || npm install -g npm@9.5.1
          yarn --version | grep 1.22.22 || npm install -g yarn@1.22.22
          echo "VITE_SUPABASE_URL=${{ secrets.VITE_SUPABASE_URL }}" > .env
          echo "VITE_SUPABASE_ANON_KEY=${{ secrets.VITE_SUPABASE_ANON_KEY }}" >> .env
          npm install
          npm run build
        working-directory: ./sample-vite # sample-viteの階層で実行

      # Firebase CLIを使ってデプロイ
      - name: Deploy to Firebase
        uses: FirebaseExtended/action-hosting-deploy@v0
        with:
          repoToken: "${{ secrets.GITHUB_TOKEN }}"
          firebaseServiceAccount: "${{ secrets.FIREBASE_SERVICE_ACCOUNT }}"
          channelId: live
          projectId: jisou-study-record-app3
          entryPoint: ./sample-vite
```


 # JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
興味のある方は、ぜひホームページをのぞいてみてください！
▼▼▼

https://projisou.jp
VSCodeとMac OS版ChatGPTデスクトップアプリを連携する

VSCodeをChatGPTデスクトップアプリと連携させ、編集中のコードをChatGPTに読ませてやり取りをする機能拡張があったので試してみました。

## デスクトップアプリをインストール
https://openai.com/chatgpt/desktop/

## VSIXファイルをダウンロード
https://help.openai.com/en/articles/10128592

こちらの記事中にある[リンクから、VSIXファイルをダウンロード](https://persistent.oaistatic.com/pair-with-ai/openai-chatgpt-latest.vsix?t=261124)する。

## VSCodeにインストールする

![コマンドを入力](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29093/aa473374-7917-1429-c068-90b019a77114.png)

Command + Shift + Pを押してコマンドを開き、`Extensions: Install from VSIX`と入力してインストールコマンドを選択する。
ダイアログで、ダウンロードしたVSIXファイルを選択し、インストール。

![インストール完了](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29093/8a0c739a-fc1d-cfe5-a4a1-ce320aa9afa2.png)

## デスクトップアプリに連携を許可する
ChagGPTアプリのウィンドウにある紙飛行機アイコンを開き、VSCodeの「+」を押して連携を許可する。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29093/c5a7397c-0b45-591d-26cb-59c8a82aaa05.png" alt="連携画面" width="45%"> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29093/ed01166d-7cd0-d5aa-cfd1-6f3b0e10192c.png" width="45%" alt="連携完了">

連携すると、VSCodeで開いているファイルや選択中の行を確認できる。
![連携後の画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29093/2b4e12f4-dfaa-65db-5268-c6b31bb686be.png)

## チャットする
その状態で質問などを投げると、コードを参照してやり取りができる。

![スクリーンショット 2024-12-18 16.52.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29093/d32a4755-fb41-cabd-c1b3-1cbc2c7df5e9.png)

## 制限など
https://help.openai.com/en/articles/10119604-work-with-apps-on-macos

こちらによると、

>ChatGPT includes the last 200 lines of open panes.
>If you select text in a pane, ChatGPT focuses on the selection and includes neighboring text up to a truncation limit.

長いコードをまるっと認識することはできないようですが、APIキーを取得、従量課金したり、コードをブラウザにコピペしなくても呼び出すことができるので、ちょっとした手助けにはなりそうです。
NewRelicのセッションリプレイ機能を使ってみた

# はじめに
本記事では、NewRelicを使って簡単にセッションリプレイを導入する方法についてご紹介します。
セッションリプレイとは、Web サイトに訪れたユーザーがUI上でどのような行動を取ったのか記録できる機能です。
NewRelicを使うと簡単に実現できたので、ご興味のある方はぜひご一読ください！

※こちらでは、すでにNewRelicのAPMを導入した後のRuby on rails アプリケーションに対して、ブラウザモニタリングを導入する方法を解説しています。
APMの導入方法について気になる方はこちらをご参考ください。

https://docs.newrelic.com/jp/docs/apm/agents/ruby-agent/getting-started/introduction-new-relic-ruby/

https://qiita.com/k_koike02/private/44f7ff4ddff034d3ca4c

# 設定方法
まずはブラウザモニタリングを実装する必要があります。
Browserタブから"Add data"を選択。
![サンプル画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947049/c093bdf6-8828-db66-1aba-26e64f959861.png)

BrowserMonitoringを選択。
![サンプル画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947049/b0720457-1baf-c730-ae39-3ceaff347400.png)

Connect browser data to an application's APM dataを選択。
![サンプル画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947049/a07dcd49-be36-8437-6452-73eef3a188e0.png)

"Choose your application"画面では、ブラウザを保持しているアプリケーションを選択してください。
さらに次の"Configure browser agent"画面で、セッションリプレイを動作させるために"Capture session replays"をONにします。
![サンプル画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947049/026a1ecc-09a1-2a75-5723-b5e627c11734.png)

Sample rate of total sessions (%)では、全セッションのうち、何％を記録するか指定できます。デフォルトでは10%となっています。
Sample rate of total sessions with errors (%)では、エラーが起きたセッションのうち、何％を記録するか指定できます。デフォルトでは100%となっています。
![サンプル画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947049/9a5095dd-6106-b232-4a3a-d806db4fbb39.png)

ここで、一旦アプリケーションのnewrelic.ymlファイルを編集します。
以下の設定項目がない場合は、ymlファイルに追記します。

```newrelic.yml
browser_monitoring:
  auto_instrument: true
```


次に、HTMLにスニペットを挿入します。
Browser＞applications＞application settingsに移動し、次の画面から必要なスニペットをコピーします。
![サンプル画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947049/6adb80bc-7626-a366-6a0a-6fdd4245e9c4.png)

HTMLのヘッダー内に、先ほどCopyしたスニペットを挿入します。スニペットはなるべくヘッダー上部に挿入するようにしましょう。

これらを設定したうえで、最後の画面に遷移し、See your dataでモニタリング画面に遷移します。
![サンプル画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947049/cf4b853b-46a1-1e4c-5fbb-88900d378af9.png)

正常にデータの登録ができたら、以下のような画面が見えるはずです。
赤枠で囲まれたSession replayの枠から、画面上でのユーザーの行動を確認できます。
![サンプル画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947049/a035afbc-a934-723d-ea4d-22e5247c98fc.png)

Session replay画面では、セッション継続時間の間でのユーザーの行動記録を確認できます。
ユーザーのカーソルは赤色のポインタとして表示され、実際のWebサイト上でのユーザーの行動が再現されます。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947049/4e71c2e5-46f5-5a32-d0a3-364e0c87791a.png)
※サイトの画像はイメージです。


# 終わりに
<!-- 〆の挨拶文を入れてください -->
以上、NewRelicのセッションリプレイの設定方法でした。
New Relicでは、APMが実装されていれば、簡単にセッションリプレイを実現できます。
ブラウザモニタリングの導入を検討している方は、ぜひNewRelicを使用してみてはいかがでしょうか！
<!-- 〆の挨拶文を入れてください -->
---
<!-- 他社商標に関する記載を適宜修正してください -->
- New Relic は、New Relic, Inc.の商標または登録商標です。
- その他、記載されている会社名および商品・製品・サービス名は、各社の商標または登録商標です。
KDE Plasma 6でVSCode日本語入力有効化設定

# 動作確認環境
* ArchLinux（2024年12月18日時点）
* KDE Plasma 6
* Code - OSS（VScodeのMITライセンス版） 1.96.0
* fcitx5 5.1.11

# もとの設定
```:/etc/environment
ELECTRON_OZONE_PLATFORM_HINT=wayland
```
　環境変数`ELECTRON_OZONE_PLATFORM_HINT`を`wayland`に設定し、electronをwaylandでネイティブに動作させていた。  
　日本語入力に関しては、fcitx5-mozcをインストールし、Input Methodをfcitx5に設定し使っていた。
　他に、Code - OSS、日本語入力関連で設定していることはなかった。

# 問題
　あるタイミングから、Code - OSSで日本語入力ができなくなった。（逆に、なぜそれまでは特に設定せずに日本語入力ができていたのかも、分からない）

# 試したこと
　[fcitx5のwiki](https://fcitx-im.org/wiki/Using_Fcitx_5_on_Wayland#Chromium_.2F_Electron)を参考に、`code`コマンドに`--enable-wayland-ime`オプションをつけることで日本語入力ができることを確認した。（問題なく使えるが、警告は出てしまう。）  

```
$ code --enable-wayland-ime .
Warning: 'enable-wayland-ime' is not in the list of known options, but still passed to Electron/Chromium.
```

　このオプションをデフォルトでつけることのできる方法はないか探した。
* `argv.conf`への書き込み
サポートされているオプションが非常に少ないようで、断念した。 ドキュメントもまとまっていない。 
* `electron-flags.conf`の作成、書き込み
Code - OSSはこの設定ファイルは読まないらしく、断念。

# 解決方法
　[yangniao23様のZenn記事](https://zenn.dev/link/comments/17aed48345a383)に、次のような記述があった。
> * vscode
~/.config/code-flags.conf に起動引数を書ける

　これを参考に、次のように設定ファイルを作成した。
 ```:~/.config/code-flags.conf
 --enable-wayland-ime=true
 ```
 　すると、問題なくfcitx5で日本語入力ができるようになった。（相変わらず、警告は出てしまう）
  ```
  $ code .
  Warning: 'enable-wayland-ime' is not in the list of known options, but still passed to Electron/Chromium.
  ```
　タスクバーから起動する際も、問題なく日本語入力ができるようになっていることを確認した。
 # おわりに
　KDE Plasma 6でVSCode（Code - OSS）を動かすとき、いちいち起動オプションをつけずに日本語入力が有効化できる設定を紹介した。
　Warningが出るのだけ気に食わないので、今後の課題とする。
GIHOZで組み合わせテスト(ペアワイズ法)

# はじめに
[GIHOZ](https://www.veriserve.co.jp/helloqualityworld/service/gihoz/)を用いて組み合わせテストを実践していきます.

今回でソフトウェアテスト関連の記事は一区切りをつけます.


# 組み合わせテスト
組み合わせテストは,複数の条件を組み合わせてソフトウェアの動作を
確認するテスト技法です.

**単一の条件だけでは発生しないが,複数の条件が組み合わさった際に発生する欠陥**を
見つけるために行います.

組み合わせテストでは**2因子間網羅**という考え方に基づくことで考えるべき組み合わせ数を減らします.

一般的にソフトウェアのテストにおいて**多くの欠陥は2因子間までで見つかる」という定説があるので,このような考え方をします.

# 因子水準表
因子とは,「テスト対象の機能名や設定項目名など」を指します.

水準とは,「因子が持つ選択肢や設定値など」を指します.

GIHOZでは因子は「パラメータ」,水準は「値」に対応した表を作ることになります.

# 組み合わせテストの例
以下のラベル印刷機の仕様に対して,組み合わせテストをする場合を考える.

### ラベル印刷機の仕様
#### 概要:ラベル印刷機で印字される文字の書式を設定する
- 縦書き・横書き
    - ラベルに印刷する文字の方向を設定
    - 縦書き、横書きの設定が可能
    - デフォルト設定は縦書き
- 行表示
    - ラベルに印刷する行数を設定
    - 1行,2行,3行の設定が可能
    - デフォルト設定は1行
- 文字サイズ
    - ラベルに印刷する文字のサイズを設定する
    - 大,中,小,極小の設定が可能
    - デフォルト設定は中
- フォント
    - ラベルに印刷するフォントを設定
    - ゴシック,明朝の設定が可能
    - デフォルト設定はゴシック
- 文字飾り
    - ラベルに印刷される文字に対する,装飾を設定
    - なし,太字,斜体,下線,網掛けの設定が可能
    - デフォルト設定はなし

# 因子水準表の準備
上記の仕様を基に因子と水準を考えてみます.

すると以下のような因子水準表が作れます.

#### 因子水準表
![スクリーンショット 2024-12-18 162423.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/cbf30591-dfb3-76ab-3c4c-5f9e64192bd5.png)

# テストケースの生成
上のような因子水準表を基にテストケースを作成された結果が以下となります.
![スクリーンショット 2024-12-18 162643.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/7efea01d-7ae7-96ab-f9a8-e7d73e5a4e78.png)

# 禁則を考える
ここで,ラベル印刷機で以下のような仕様が記述されていたとします.
- 行表示を3行としたとき,文字サイズを大に設定することはできない.

このように,禁止になっている組み合わせのことを**禁則**と呼びます.

この場合,以下のように制約を追加することでその組み合わせを除外することができます.

#### 制約の追加
![スクリーンショット 2024-12-18 163545.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/e218f230-790b-f9d6-f897-7120b158fd24.png)

値の前に'#'を追加することで,それを除外という意味になります.

逆に,'#'がなければ,それになるという意味になります.
(行表示が3行の時,文字サイズは大になる)

制約を追加した後にテストケースを生成してみると,確かに除外されていることが確認できました.

#### 制約追加後のテストケース
![スクリーンショット 2024-12-18 163820.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/5e574c55-766f-7036-fe8f-ce2bb5bc5e7b.png)

# 最後に
組み合わせテストをGIHOZで実践してみましたが,
考えるべきテストケースを非常に簡単に生成することができました.

これまで,GIHOZを用いて代表的なソフトウェアテスト(境界値分析・同値分析・デシジョンテーブル・状態遷移テスト・ペアワイズ法)を実践するとともに,ツールの使い方を学びました.

きっかけは,書籍でのインプットだけでは中々頭に定着しないということで,ツールを用いてソフトウェアテスト関連の知識のアウトプットをしようということで始めたことでしたが,
おかげで,いつもよりも必要な知識が記憶に留まっている気がします.
(そんな気がするだけかもしれませんが)

次回以降もインプット→アウトプットの過程は特に大事にしていきたいです.

# 参考
[ソフトウェアテストの教科書](https://www.amazon.co.jp/%E3%80%90%E3%81%93%E3%81%AE1%E5%86%8A%E3%81%A7%E3%82%88%E3%81%8F%E3%82%8F%E3%81%8B%E3%82%8B%E3%80%91-%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82-%E7%AC%AC2%E7%89%88-%E5%B8%83%E6%96%BD/dp/481560875X)
New RelicでDockerコンテナ上で動作するアプリケーションのAPMを実現してみた(Ruby on Rails編) 

# はじめに
<!-- 挨拶文を入れてください -->
今回は、New Relicを使って簡単にAPMを実現する方法についてご紹介します！
本記事では、特にアプリケーションの中でもDockerコンテナ上で動作するRuby on RailsアプリケーションのAPM導入方法について説明します。

<!-- 挨拶文を入れてください -->
# 操作手順
まずはNew Relicにログインします。
左のタブのうち、Integrations & Agentsを選択し、Popular欄の中からRubyを探し、選択します。
![サンプル画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947049/3e999406-969d-fd7d-dc94-3e1c5e7812ee.png)

以下のような画面に切り替わったら、Ruby on railsを選択。
![サンプル画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947049/03543f84-6723-6f54-77b9-d8f9acb07cd3.png)

自分のLicnese keyとuser keyを入力します。ない場合はcreate a new keyで作成します。
![サンプル画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947049/13e13997-6108-eef8-fa41-5376a2363eed.png)

こちらでは、Bundlerを使用しているかどうかで手順が異なります。
![サンプル画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947049/d746290b-142a-3edf-363f-59091a083421.png)

私が使用したアプリケーションではBundlerを使用していたため、Yesを選択しました。
Gemfileを開き、以下を挿入します。

```Gemfile
gem 'New Relic_rpm'
```

通常のアプリケーションではこの後bundle installを行います。Dockerコンテナ上で動作している場合は、Gemfile内のGemのインストールがDockerfileなどで定義されていると思うのでこの操作は不要です。
代わりに、後でDockerコンテナをビルドし直す必要があります。


先ほどの画面でcontinueを選択した後、Name欄にアプリケーション名を入力した後、ymlファイルの内容をコピーします。
newrelic.ymlファイルは、configファイルが設置されているフォルダ内に作成し、ファイル内にコピーした内容をペーストします。
![サンプル画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947049/7bb30275-ae5f-7029-ccf4-e6c93cdd7243.png)

ymlファイルを作成後、コンテナをビルドし、再起動します。
最後に、Test the connection画面のstatus欄がsuccessになっていることを確認して終了です。


# APM画面
APMでは、以下のような画面が表示されます。
Web transactions timeなどのメトリクスのほか、アプリケーションのサービスマップなどを表示させることができます。
![サンプル画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947049/23301193-5b2b-0a75-03ed-ec726673902d.png)

# 終わりに
<!-- 〆の挨拶文を入れてください -->
以上がNew Relicを用いたRubyアプリケーションのAPMの導入手順でした！
ありがとうございました！
<!-- 〆の挨拶文を入れてください -->
---
<!-- 他社商標に関する記載を適宜修正してください -->
- New Relic は、New Relic, Inc.の商標または登録商標です。
- その他、記載されている会社名および商品・製品・サービス名は、各社の商標または登録商標です。
Advent of code 2024 Day 13 Part 1 を Livebook で楽しむ

## はじめに

Advent of code 2024 Day 13 の Part 1 を解きます

問題文はこちら

https://adventofcode.com/2024/day/13

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/aoc/2024/2024_day13_part1.livemd

## セットアップ

Kino AOC をインストールします

```elixir
Mix.install([
  {:kino_aoc, "~> 0.1"}
])
```

Kino AOC の使い方はこちらを参照

https://qiita.com/RyoWakabayashi/items/3d3abcf9134cee4dff05

## 入力の取得

"Advent of Code Helper" スマートセルを追加し、 Day 13 の入力を取得します

![スクリーンショット 2024-12-18 16.44.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/35f6ab86-a7b8-ebb0-31c2-42ad32b1ff36.png)

## 私の答え

私の答えです。
折りたたんでおきます。
▶を押して開いてください。

<details><summary>回答</summary>

入力例で考えます

```elixir
sample_input =
  """
  Button A: X+94, Y+34
  Button B: X+22, Y+67
  Prize: X=8400, Y=5400
  
  Button A: X+26, Y+66
  Button B: X+67, Y+21
  Prize: X=12748, Y=12176
  
  Button A: X+17, Y+86
  Button B: X+84, Y+37
  Prize: X=7870, Y=6450
  
  Button A: X+69, Y+23
  Button B: X+27, Y+71
  Prize: X=18641, Y=10279
  """
  |> String.trim()
```

まずはクレーンゲーム機毎に A ボタン、 B ボタン、 プライズの情報を読み込みます

```elixir
parse_machines = fn input ->
  input
  |> String.split("\n\n")
  |> Enum.map(fn machine_rows ->
    Regex.named_captures(
      ~r/\+(?<ax>\d+).*\+(?<ay>\d+)\n.*\+(?<bx>\d+).*\+(?<by>\d+)\n.*=(?<px>\d+).*=(?<py>\d+)/,
      machine_rows
    )
  end)
  |> Enum.map(fn %{"ax" => ax, "ay" => ay, "bx" => bx, "by" => by, "px" => px, "py" => py} ->
    %{
      a: %{x: String.to_integer(ax), y: String.to_integer(ay)},
      b: %{x: String.to_integer(bx), y: String.to_integer(by)},
      prize: %{x: String.to_integer(px), y: String.to_integer(py)}
    }
  end)
end
```

```elixir
machines = parse_machines.(sample_input)
```

実行結果

```elixir
[
  %{a: %{y: 34, x: 94}, b: %{y: 67, x: 22}, prize: %{y: 5400, x: 8400}},
  %{a: %{y: 66, x: 26}, b: %{y: 21, x: 67}, prize: %{y: 12176, x: 12748}},
  %{a: %{y: 86, x: 17}, b: %{y: 37, x: 84}, prize: %{y: 6450, x: 7870}},
  %{a: %{y: 23, x: 69}, b: %{y: 71, x: 27}, prize: %{y: 10279, x: 18641}}
]
```

A ボタンと B ボタンは最大でも 100 回しか押さないので、その範囲でプライズが取得できる組み合わせを探索します

```elixir
get_prize = fn %{a: %{x: ax, y: ay}, b: %{x: bx, y: by}, prize: %{x: px, y: py}} ->
  for num_a <- 0..100,
      num_b <- 0..100,
      num_a * ax + num_b * bx == px,
      num_a * ay + num_b * by == py do
    {num_a, num_b}
  end
end
```

各クレーンゲーム機で探索した結果のコスト（A ボタンは 3 トークン、 B ボタンは 1 トークン）を合計します

```elixir
get_cost = fn machines ->
  machines
  |> Enum.map(fn machine ->
    machine
    |> get_prize.()
    |> Enum.map(fn {num_a, num_b} ->
      num_a * 3 + num_b
    end)
    |> case do
      [] -> 0
      costs -> Enum.min(costs)
    end
  end)
  |> Enum.sum()
end
```

```elixir
get_cost.(machines)
```

実行結果

```elixir
480
```

実際の入力に対して実行します

```elixir
puzzle_input
|> parse_machines.()
|> get_cost.()
```

</details>

## まとめ

問題文から ChatGPT に画像を生成してもらいました

![aoc2024_day13_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/0bd208c6-41cf-af05-7e9c-7b3a6f91ae9a.png)

Part 1 は素直に解けば良いだけでしたが、、、

Part 2 はこちら

https://qiita.com/RyoWakabayashi/private/262d5d610844f1a1cb35
Java1級に満点合格した勉強法

Java1級の試験に挑戦し、無事に満点合格することができました！そこで今回はどのような対策を行い、どのような勉強方法が効果的だったかのかをお話したいと思います。限られた時間の中で効率的に学習を進めるコツや、出題範囲をしっかりと抑えるためのポイントなど、実際に試験勉強で役立った具体的な方法をシェアしていきます。

## 【Java1級とは】
サーティファイが主催しているJavaプログラミング能力検定1級のことです。1級の認定基準としては、”オブジェクト指向に基づく分析・設計（UML）により業務システムの流れを把握し、変更仕様に従ってプログラムの保守ができる能力を有する。なおUMLの表記はユースケース図、シーケンス図、クラス図などの基本的な知識を有する。”ということで実際にプログラムを作成したり設計書を作成する等の実技がメインの試験でした。合格するためには、得点率が60％以上である必要があります。
https://www.sikaku.gr.jp/js/cpjv/jv/introduction/

 

## 【スペック】

SE歴4年目。Javaを始めShellまでいろんな言語を幅広く触って一通りなんとなく理解はしているが、何が一番得意かよくわからなくなってしまったいわゆる器用貧乏な人間です。Javaのスキルに関しては当時業務で少し触っていたので基本的な構文は扱うことができる、程度でした。

 

## 【試験内容】

テーマプログラムに対して問題文で求められる仕様変更や機能追加を行い、対応するプログラムと設計書を作成する、というものでした。

サンプル問題でいうと、ある程度完成している従業員管理システムのソースコードに追記することで機能を追加し、対応する設計書を作成する、というものです。従業員登録や削除等の基本的な操作は既に作成されており、更新機能を追加しそれに伴う処理やUIを修正するのが設問でした。

試験時間は150分で、問題数は2問です。この2問とも追加機能の開発とそれに伴う設計書作成です。

サンプル問題は以下から確認することができます。
https://www.sikaku.gr.jp/js/jv/org/prepare/sample/
 

 

## 【勉強期間と対策法】

試験の2週間程前から少しずつ始めていきました。多い日で4,5時間程度、少ない日は1時間未満の勉強時間でした。プログラムを作成するのにまとまった時間が必要だったので実際にコードを書いて答え合わせをする日はしっかりと学習時間を取りました。

### 【試験2週間前】

まずは相手を知る期間として、最初の1週間でTeraPadの使い方やコンパイルの構文を覚え、時間を気にせずにサンプル問題を1周解いてみました。また、以前同じ試験を受けたことがある先輩にどのような内容か聞いてみました。「設計書は紙に書いて提出する必要があるので思っている以上に時間がないよ」という情報を得たので設計書の解答例を一通り読み、記述の流れやスタイルを把握しました。「分量は多いけど記述方法は問題文からかき集めてくればOK」と判断し、なるべく問題冊子に記載されている文言を使用していこうと方針を決めました。

また、問題冊子を見たときにページ数に驚きましたが、実際書いてあることは処理詳細説明とソースコード丸写し+α程度なので「ソース読んで少し動かしてみればある程度機能把握できる」と判断しました。

 

### 【試験1週間前】

サンプル問題は解き終わってしまったので、解答例を読んで設計書の書き方をさらっと読むことと基本的な構文を理解するのを目標として勉強しました。「Java 基本構文」で検索してヒットした記事を読み漁ることにしました。以下のような記事を隙間時間を使って少しずつ読み進めていきました。

https://qiita.com/tomonori_hioki/items/cec47a366208d43d7339
https://java-code.jp/category/basic
 

### 【前日～当日】

今更細かい部分を勉強しても覚えきれない、試験時間が短いため初歩的なミスはなるべくしたくない、ということでとにかく基本部分の復習を行いました。特に言語ごとに書き方が違う構文は一度間違えると思いだすまで時間ロスに繋がると考え、以下のことを重点的に何度も確認しました。

1\. コンパイルのコマンド

　→これを忘れるとデバッグができなくなるので絶対に忘れないように試験直前まで確認しました。

2\. データ型の扱い方

　→個人的に変数の宣言を行う際に「どうやって宣言するんだっけ・・・」と混乱する傾向があるので忘れないようにしました。特に配列の書き方を忘れがちです。

3\. 等価演算子の使い方

　→”==”なのか”===”なのかが一瞬わからなくなるので確認する内容に入れました。（JavaScriptも触ったことがあるので混乱しがち）

4\. for文、while文、if文、switch文の書き方

　→ループや条件分岐も書き方を忘れそうになるので確認するようにしました。特にif文の書き方は混乱します。

5\. returnとbreakの扱い方

　→上記に関連してループを抜けるときはbreak、処理終了するときはreturn、というのを叩き込みました。

 

あとは記述（物理）が多いので、使い慣れたペンや消しゴムを使うことも結構大事だと感じました。久々に大量に文字を書いたので試験後は腕が疲れるレベルでした。設計書作成は追加機能分はしっかり記述する必要がありますが、既存部分は～省略～のように記述しても減点されなかったのである程度省略しても良いのかもしれません。

 

以上の方法で短い勉強期間であったにも関わらず、無事に満点を取ることができました。

参考にしてみてください。
Google Cloud Certified - Professional Cloud Architect 合格体験記：複雑なケーススタディを攻略し、一発合格！

## はじめに
**Google Cloud Certified - Professional Cloud Architect**の試験を受験し、一発合格を果たしました。これまでのCloud Digital LeaderやAssociate Cloud Engineerの経験を活かし、念入りな学習と対策を行った結果です。本記事では、Professional Cloud Architectの特徴や学習方法ついて詳しくご紹介します。

https://qiita.com/abachan/items/179bc1b03ca07fe04142

https://qiita.com/abachan/items/25067a95654539d797b1

## 目次
1. [Professional Cloud Architectとは？](#professional-cloud-architectとは)
2. [Associate Cloud Engineerとの違い](#Associate-Cloud-Engineerとの違い)
3. [学習計画と使用教材](#学習計画と使用教材)
4. [試験当日の体験とハプニング](#試験当日の体験とハプニング)
5. [まとめとアドバイス](#まとめとアドバイス)

## Professional Cloud Architectとは？

**Professional Cloud Architect**は、Google Cloud Platform（GCP）の高度な知識とスキルを持ち、ビジネス要件に応じたスケーラブルで高可用性のソリューションを設計・管理できることを証明する資格です。具体的には、以下の能力が求められます。

- クラウドソリューションの設計と計画
- クラウドインフラの管理とプロビジョニング
- セキュリティとコンプライアンスへの対応
- 技術プロセスやビジネスプロセスの分析と最適化
- ソリューションの信頼性確保

https://cloud.google.com/learn/certification/cloud-architect?hl=ja

## Associate Cloud Engineerとの違い
これまでに取得したAssociate Cloud Engineerと比較すると、Professional Cloud Architectは以下の点で難易度が上がっています。

- **ケーススタディの増加**: 顧客の具体的な要件に基づき、最適なソリューションを提案する問題が多く出題されます。
- **問題文の長文化**: 長文のシナリオから必要な情報を抽出し、適切な回答を導く力が求められます。
- **高度な設計能力**: 単なる知識だけでなく、実践的な設計スキルや経験が重要となります。

## 学習計画と使用教材

### 学習期間

約2週間、週30〜35時間の学習時間を確保し、計画的に進めました。

### 使用した教材とツール

#### 1. Udemyの動画コンテンツで基礎知識を固める
実践的なケーススタディや模擬試験が豊富で、試験対策に非常に役立ちました

https://www.udemy.com/course/google-cloud-professional-cloud-architectpca/?couponCode=ST21MT121624
     
### 2. **模擬試験**
多様な問題形式に慣れるため、複数回実施しました。

https://www.udemy.com/course/google-cloud-professional-cloud-architect-i/

#### 3. 試験前の最終確認
**Google Cloud Skill Boost**
Google Cloudが提供する公式の学習プラットフォームで、試験に向けたコースやハンズオンの受講が可能です。無料で利用できるため、最新の情報やサービスの詳細を学習するのに役立ちます。 


**Cloud Digital Leader公式模擬問題**
Googleが提供する公式の模擬問題集です。無料で受験可能で、本番と似た形式の問題に取り組むことができます。試験前に一度解いておくことをおすすめします。

### 学習方法

- **ケーススタディの重点学習**: 長文問題に慣れるため、日々の学習で要約力と分析力を鍛えました。
- **実践的な演習**: GCPの各サービスを実際に操作し、理解を深めました。
- **模擬試験の活用**: 定期的に模擬試験を受け、弱点を洗い出し、復習しました。

## 試験当日の流れと自宅受験でのハプニング

### 1. 試験形式

- **試験時間**: 120分
- **問題数**: 約50問
- **形式**: 単一選択および複数選択

### 2. 試験当日のポイント

- **時間配分**: 1問あたり約2分を目安に解答。難しい問題は一旦飛ばし、後で見直す戦略を取りました。
- **冷静さの維持**: 模擬試験での経験から、焦らず冷静に問題に取り組むことができました。

### 3.自宅受験のハプニング

自宅でのオンライン受験を選択しましたが、以下のトラブルが発生しました。

1. **試験の一時中断**: 突然、試験がストップし、サポートから「マイクから音が聞こえない」との指摘がありました。
2. **音声確認**: サポート担当者から「名前を言ってください」と依頼され、「〇〇です」と大きな声で伝えたところ、問題が解決し、試験を再開できました。
3. **集中力の低下**: 再開後、集中力を取り戻すのに時間がかかりました。

この経験から、オンライン受験のリスクを感じ、次回は試験センターでの受験も検討しようと思いました。

## まとめとアドバイス

### 試験対策のポイント

- **ケーススタディに慣れる**: 長文問題から必要な情報を迅速に抽出する練習を積みましょう。
- **実践経験の積み重ね**: GCPの各サービスを実際に操作し、理解を深めることが重要です。
- **模擬試験の活用**: 定期的に模擬試験を受け、問題形式や出題傾向に慣れておくことをおすすめします。

最後までお読みいただき、ありがとうございました。皆さんの合格を心より応援しています！
ステップバイステップ！リアルタイムOSを評価ボードへ移植    ～ TOPPERS/ASP3をNXP FRDM-MCXN947へ～ 第0回 

## 本記事について 

リアルタイムOSを市販のマイコン評価ボードに移植する手順を、
ステップバイステップでポイント毎に動作を確認しながら説明します。
移植するリアルタイムOSはTOPPERS/ASP3です。 

下記構成で複数回に分けての投稿を予定しています。 

 :::note info


第0回 本記事の趣旨、TOPPERS/ASP3と評価ボードの説明 
[第1回 準備　ハードウェアの入手、ツールのインストールなど](https://qiita.com/Debuggy_24/items/e6a8c788979df97b4b67) 
[第2回 とりあえず動くものを移植](https://qiita.com/Debuggy_24/items/25e21b8b8d02fe614e4b) 
第3回 細部の作り込み1	クロックの設定 
第4回 細部の作り込み2	UARTドライバ 
[第5回 細部の作り込み3 タイマドライバ (ティックレス対応)](https://qiita.com/Debuggy_24/items/d80dfc71ce9398b1466c) 
:::


 

NXP社のFRDM-MCXN947という評価ボード向けの移植について説明しますが、
他のArm Cortex-Mを実装したボード向けにも応用できます。 

 

## TOPPERS/ASP3とは 

TOPPERSプロジェクトでμITRON4.0仕様のスタンダードプロファイル準拠の
リアルタイムカーネルを拡張・改良する形で開発したものです。 

ASP3の3は第3世代を表しています。 

シングルコアで動作します。
(マルチコア向けにはTOPPERS/FMP3という別のリアルタイムカーネルがあります。) 

 

TOPPERSプロジェクトのソースコードを含む、
* 開発成果物
* 対応しているターゲットシステム
* 仕様

などの情報は[こちら（TOPPERS/ASP3カーネル ）](https://www.toppers.jp/asp3-kernel.html)からご覧いただけます。 



 

 

## 評価ボードFRDM-MCXN947 

NXP社から販売されているMCX N947が実装されたボードです。
[MCX N94/N54 MCU用FRDM開発ボード](https://www.nxp.jp/design/design-center/development-boards-and-designs/FRDM-MCXN947)

 

MCX N947は次の機能をもつMCUです。 

※ここでは、リアルタイムOSを扱うにあたって必要な機能に絞っています。
詳細はNXP社のWebページを参照してください。 

|||
|:-|:-|
|  CPU  |  Arm Cortex-M33 (2コア)  |
| ROM   |2MB   |
|RAM    |512KB    |
|  UART  | 最大10チャネル   |


このボードは、リアルタイムOSを実機で動かしてみるには手頃だと思っています。 

その理由を挙げます。 

 

* オンボードデバッガで実装されている。(別途購入する必要がない) 

* 価格が安く(約￥3,000~5,000・筆者調べ)、入手性がよい。 

* 開発ツールが無料でダウンロードできる。 

* リアルタイムOS実装にあたってのMCU(MCXN947)の機能やレジスタについて説明した資料が入手できる。 

* 2つのCortex-M33コア、イーサネットが実装されているので、OSの移植した後にもいろいろと楽しめる。 

 

以上で第0回は終了です。第1回([リンク](https://qiita.com/Debuggy_24/items/e6a8c788979df97b4b67))へ続きます。