OmniAICreator/Qiita-1.07M huggingface dataset:
若手エンジニアこそリーダーにチャレンジしてみませんか？

この記事は[Schoo Advent Calendar 2024](https://qiita.com/advent-calendar/2024/schoo)の4日目の記事です！

こんにちは、株式会社Schooでエンジニアをしているタキザワと申します。

Schooを含め、数社でリーダーシップやマネジメント業務に携わってきた経験を踏まえ、
ここでは、若手エンジニアこそリーダーにチャレンジしてみませんか？という提案をしたいと思います。

## やってみて大変だったこと

筆者は新卒で受託開発会社に入社後、2年目でiOSアプリ開発のチームリーダーを拝命しました。

リーダーとしてやってほしいと言われたことは、主に次の3つでした。

- 各案件の設計レビュー、コードレビュー
- 開発プロセス、技術スタックの標準化
- チームメンバーの技術力底上げ

「リーダー」や「なんとか長」といったものにはほぼ無縁の学生生活を送ってきたので、
新しい仕事への期待はありつつも、正直、自分に務まるのかという不安の方が大きかったです。

ただ、実際やってみると、**思っていたほど大変なことばかりでもないんだな**、という感想でした。

プロセスを考えてメンバーに意見をもらったり、社内研究会を主催したりと、
他社でもやっていることをやってみたりしましたが、そこまで特別なことはしていなかったと思います。

やる前から、勝手に「大変そう」という先入観が膨らんでしまっていたのかなと思います。

また、**チャレンジを奨励する企業文化**であったり、**メンバーがとても協力的**であったりといった、取り巻く環境に支えられていた部分も大きかったと思います。

:::note info
リーダーは、思っていたほど大変なことばかりではない
:::

## やってみて良かったこと

**自分の新しい一面を知ることができた**という点が、やってみて良かった一番のポイントでした。

それまで、「プログラミングって考えた通りに動いてくれて、ピタゴラ装置[^1]みたいで面白いなぁ」ということだけで学習や仕事をしてきたので、それとは違う仕事に面白さを感じる自分がいるかも、と考えたこともありませんでした。

しかし、リーダーとして向き合うことになるチームであったりプロジェクトであったりは、
考えた通りにはいかないことの方が多く、そういった前提のもとで、それなら何ができるかを考えて試していくことも、
プログラミングとは違う面白さであり、仕事の醍醐味であると気づくことができました。

:::note info
リーダーは、新たな自分を見つけるチャンスの1つである
:::

## 若手時代にリーダーをやっておくメリットとは

若手のうちからリーダーを経験した身として、最大のメリットは**今後の仕事がめちゃめちゃやりやすくなる**し、**成果も出しやすくなる**点だと感じています。

リーダーには「チームを率いて成果を出す」ことが求められます。
大胆な決断をすることもあり、知識や経験だけでなく、勇気や度胸も必要です。
円滑に進めるには人間関係やコミュニケーションも大事ですし、重要な局面では精神的なタフさも必要です。

リーダーをやることで、リーダーシップの成長だけでなく、他の様々なスキルも総合的に鍛えられます。

![スキルは総合的に鍛えられる](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3876082/d927d289-276c-6a90-3200-6e42a1939533.png)

また、若くからリーダーを目指す人も、特にエンジニアにおいてはそこまで多くありません。リーダーは知識や経験が豊富でないと務まらない、という先入観を持っている人も一定数います。自分には無理そう、と最初から諦めている人も一定数います。

早くからリーダーにチャレンジし、いろいろな経験してみることで、そういった他の若手エンジニアより一歩先の世界に進むことができます。仕事がしやすくなるということは、そのまま成果にも直結するため、リーダーの経験は**早いほど良い**のです。

:::note info
若手のうちからリーダーの経験をすることで、今後の仕事がめちゃめちゃやりやすくなるし、成果も出しやすくなる
:::

## リーダーになりたいと思ったらやってみると良いこと

ここまで、筆者がリーダーをやってみて良かったと感じたことや、そのメリットを話してきました。
もしかしたら、リーダーという仕事は意外と面白いのかも、と感じてくださった方もいるかも知れません。

では、どうしたらリーダーになれるのでしょうか？

筆者がリーダーを任せてみたいと思える人物像と、自分が新卒時代に心がけていたことで、一致する部分を挙げてみたいと思います。

##### 分からないことを遠慮なく訊ける人

単純に分かることが増えて仕事に詳しくなれるというのもありますが、それだけではなく、

- 相手の今置かれている状況（忙しいタイミングで無理に聞こうとしていないか）
- 相手の理解度（自分と同じだけ理解しているという前提で聞こうとしていないか）

等、相手のことを想像して話す練習にもなるので、コミュニケーション能力も磨かれます。

また、単純接触効果[^2]もあり、いろいろと任せてもらえる機会も増えます。

##### ちょっと背伸びができる人

一所懸命に働いていれば、必ず、少し大変だけど成長につながるという仕事のチャンスが巡って来ます。（多くの場合、自分のことを普段から気にかけてくれている上司から声を掛けられます）

そんなときに、「やってみたいです！」と答えるか、「自分には無理です...」と答えるかは、もしリーダーをやってみたいと思うのであれば、とても重要な選択です。

チャンスが巡ってきた際、そこにどのような期待値や成長機会があるのかを想像してみることをお勧めします。

## おわりに

いろいろと話してきましたが、リーダーを始めるのに必要なものは、そう多くはありません。

「自分はまだまだ発展途上」という謙虚さと、「やってやるぞ！」という熱意さえあれば、大抵のことは何とかなります。

もし、自分なんて⋯と尻込みしているのなら、まずはチャレンジしてみるのはどうでしょうか :smile: 

---
Schooでは一緒に働く仲間を募集しています！

https://corp.schoo.jp/careers/graduates

https://corp.schoo.jp/careers

[^1]: NHKで放送されている教育番組「ピタゴラスイッチ」の1コーナー。様々な仕掛けが連動して動作し、見ているものを楽しませる。

[^2]: 繰り返し見聞きすることにより親近感が湧くという心理効果の一つ。
ubuntuでpythonのsubprocessを使ってexeファイルを開く

# 状況
subprocessモジュールを使ってexeファイルを開くプログラムをWindowsで使っていた．
これをubuntuでも実行したい．
しかしubuntuはexeファイルに対応していない．

# やり方
Ubuntuでexeを扱えるようにするwineというものがある。
以下のようにwineコマンドを使えば、
```
wine ｛フルパスまたは相対パス｝/hoge.exe
```
でexeファイルを実行できる。
このコマンドをsubprocess.runで実行させればよい。

### wineのインストール
[Ubuntu 22.04.2 LTSにWineをインストールする手順【初心者向け】](https://www.miraiserver.ne.jp/column/about_ubuntu-wine/)
を見てほしい．

### サンプルコード
```python:test_exe.py
import subprocess

def run_exe_with_wine(exe_path):
    """
    wineを使って.exeファイルを実行する
    """
    try:
        # wineで.exeを実行
        result = subprocess.run(['wine', exe_path], check=True, text=True, capture_output=True)
        print("Output:", result.stdout)
    except subprocess.CalledProcessError as e:
        print("Error:", e.stderr)
    except FileNotFoundError:
        print("wineがインストールされているか確認してください。")

if __name__ == "__main__":
    # 実行したい.exeファイルのフルパス
    exe_file = "/path/to/your/program.exe"
    run_exe_with_wine(exe_file)

```
### subprocess.runの引数
* check=True: 実行が失敗した場合に例外を発生
* text=True: 標準出力とエラー出力を文字列として扱う
* capture_output=True: 標準出力とエラー出力をキャプチャする

# まとめ
wineを使ってexeを実行できることは知っていたが，subprocess経由でも簡単にできてうれしい．
BizRobo! クリックができなかった場合に何度かトライさせる処理の作り方

皆さんは緑ロボット（DAロボット）でロボット作成する際に
ここのクリックが少し不安定だな、、という状況に陥ったことはないでしょうか？

そんな時に「クリックできなかった場合は何回かトライする」ように作成するのも
対処法の１つかと思います。

今回はそのような想定していた動きをしなかった際の１つ対処の仕組みを
実際に緑ロボットのステップを踏まえご説明できればと思います。
※ver11.4を使用して説明します

# 修正ロボット概要
あるメールサイトの新規作成ボタンをクリックし、
出てきたメール作成ウィンドウの宛先にメールアドレスなどを記入していくロボットを作成。
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3346701/2b384f4f-35c1-533b-d291-7c9c33924e83.png)
しかし、たまにメール作成ウィンドウが表示されないことがあり
宛先を記入する箇所でエラーが発生してしまうことがある。

# ロボット修正案
まず、行いたい事を整理しましょう。
今回の場合、メール作成ウィンドウが表示されなかったら
もう一度新規作成ボタンをクリックしメール作成ウィンドウを表示する
という動きを行いたいです。

上記を実施させるためには、以下2つの処理が必要となってきます。
①メール作成ウィンドウが表示されていることを確認
②表示されている場合はそのまま宛先を記入するように
　表示されていない場合はもう一度クリックするようにする

こちらを実現したロボットのフローが以下になります。
![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3346701/fafd00f3-ab9f-de11-910a-e9ba370ed973.png)

追加したステップは大きく分けて「ガードチョイス」と「ループステップ」の2つです。

##### ガードチョイスについて
「メール作成ウィンドウが表示されていることを確認し、表示の有無で実施操作を変える」
という部分を担っています。

ガードチョイスの中でも「該当するコンポーネント」を使用し、
メール作成ウィンドウ中の特定の要素（宛先BOXなど普遍的なもの）があった場合となかった場合に条件分岐させます。
今回の場合は
・10秒間の間に宛先BOXが認識されたら上のルート
・10秒間の間に宛先BOXが認識されなかったら下のルート
という分岐になっています。

##### ループについて
「メール作成ウィンドウが表示されていなかったら、再度同じ処理（新規作成クリック）を繰り返す」
という部分を担っています。

緑ロボットのループステップは青ロボットのループステップと少し仕様が異なりループステップの中のステップを繰り返すという仕様です。

そのため、
繰り返したい以下の処理をループの中に
・新規作成クリックステップ
・メール作成ウィンドウガード ステップ
繰り返したくない以下の処理をループの外に
・宛先入力 ステップ
という風に作成します。

また、メール作成ウィンドウが表示されていた場合はループを終了したいため、ガードの後ろにブレークステップを作成します。
一方で、表示されていない場合はループして欲しいため、10秒待機の後ろにコンティニューステップを作成します。

:::note info
何かしらの原因でメール作成ウィンドウが表示されない状況になった場合に無限ループとならないよう、
ループ回数が5回より多い場合はエラーを出すという条件分岐も作成しておきましょう。
:::

# 
今回ご説明させていただいたものはあくまで１例ですので、
皆様のロボット開発状況によって最善の方法は異なるかと思います。
そのため、１つの考え方としてご活用いただけますと幸いです！
最後までお読みいただきありがとうございました。
[Unity][RoboCup] CrossView開発日記 #5

# CrossViewとは
こちらの記事をご覧ください。

https://qiita.com/suzuki_nene/items/cbdb701622a738f1b2ee

# はじめに
[前回](https://qiita.com/suzuki_nene/items/b473e986dbdd58925025)、プレーヤーをPrefabからインスタンス化する実装を行いました。
[前々回](https://qiita.com/suzuki_nene/items/b920e3faf7aa27410005)で実装した「ログ再生の仕組み」と組み合わせれば、3DLogPlayerとしてはほぼ完成と言えますが、次は周辺機能を実装しました。

せっかく3Dアプリとして実装するのですから、これを生かす意味で、「任意のプレーヤーの三人称視点」を表示する機能を実装してみます。

といっても非常に簡単な話しで、要するにThird Person Cameraです。

三人称視点を用いることで、ロボカップのサッカーサーバーから通知されてくる「視界の範囲内に存在するオブジェクトの情報」をビジュアル的に表現できると思われます。

# Football_5
今回のテストプログラムでは、以下の項目を実装します。
- ViewModeとして3種類の見せ方を切り替える。
    - サッカーフィールドを俯瞰して見せるタイプを２つ
    - 任意のプレーヤーの三人称視点として見せるタイプを１つ

## ViewMode
１つのカメラを使いまわして3種類の見せ方を実現するのではなく、3種類の見せ方に対応する専用のカメラを設置しておき、ViewModeの変更に合わせて必要なカメラをActiveにしていく、という方法で実現しています。

ViewMode #1（斜め上からの俯瞰映像）
![Football_5_ViewMode_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/843818/c630098d-9b1b-c449-bd4f-2ecb8ca66418.png)

ViewMode #2（天頂方向からの俯瞰映像）
![Football_5_ViewMode_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/843818/10ee0688-df15-8161-ffa4-0ba270050c39.png)

ViewMode #3（画面分割：全体映像＋任意のプレーヤーの三人称視点）
![Football_5_ViewMode_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/843818/f6a9bb03-b117-4c5a-519b-7a34525f45bf.png)

## 画面分割
アプリのウィンドウを左右に2分割し、左画面と右画面それぞれに専用のカメラオブジェクトを用意します。

後述の参考サイトでも解説されていますが、カメラオブジェクトのViewport Rectを設定して、ウィンドウ上のどの位置にどのサイズで表示させるかを、割合で指定します。

右画面の三人称視点のカメラは、宇宙飛行士の移動に追従するように実装します。
また、宇宙飛行士の視線の先にあるものがカメラから見えるように、少し高い位置から見下ろすようにカメラ位置をセットしています。

今回は左右2分割を採用しましたが、他にも
- 12分割(4x3)にして、全体表示＋11名のプレーヤーを表示させる。
- ウィンドウいっぱいの三人称画面の中にPictureInPictureとして全体表示を埋め込む。

といった案も考えられるかと思います。

# 参考サイト
- https://nekojara.city/unity-split-screen

# WebGL version

https://suzukinene.github.io/FootballWeb/Football_5/

操作方法は、以下の通りです。
- WASDキー、または上下左右キーで宇宙飛行士を移動させることができます。
- 画面右下のViewModeボタンを押下すると、ViewModeが#1->#2->#3->#1...と切り替わります。
- 画面右上のDropdownは、三人称視点を表示するプレーヤーを選択するコントロールです。
    - あくまでデザインイメージです。機能はしません。
    - 左右(L,R)チームの背番号１～11までがリストアップされるので、クリックで選択します。

以上です。
AIモデルの評価をより正確に：統計的アプローチの重要性

## はじめに

https://www.anthropic.com/research/statistical-approach-to-model-evals

本記事は上記の内容を簡潔にまとめたものです。

ChatGPTやClaudeのような最新のAIモデルの性能を比較するとき、「どちらが本当に優れているのか」を正確に判断するのは意外と難しい課題です。例えば、数学の問題を解くテストで、あるAIモデルが90点、別のモデルが85点を取ったとしても、この差は本当に意味のある差なのでしょうか？

本記事では、AIモデルの評価をより正確に行うための新しいアプローチを、身近な例を使って分かりやすく解説します。

## なぜ統計的なアプローチが必要なのか？

### 🎯 単純な点数比較の罠

例えば、こんな状況を想像してみてください：

- モデルA：数学テストで90点
- モデルB：数学テストで85点

一見するとモデルAの方が優秀に見えますが、以下のような要因を考慮する必要があります：

1. **テストの問題数**: 10問中9問正解なのか、100問中90問正解なのかでは信頼性が大きく異なります
2. **問題の種類**: 簡単な問題ばかりなのか、難しい問題が含まれているのか
3. **回答のブレ**: 同じ問題でも、AIの回答は毎回少しずつ異なる可能性があります

### 📊 より正確な評価方法

そこで提案されているのが、以下の5つのポイントです：

1. **平均点だけでなく、ばらつきも見る**
   - 野球の打率で例えると：
     - 打率.300を20打数で達成するのと
     - 打率.300を200打数で達成するのでは
     - 後者の方が信頼できる数字といえます

2. **複数回のテストを実施**
   - 1回のテストではなく、同じ問題を複数回解かせることで
   - より安定した評価が可能になります

3. **問題のグループ分けを考慮**
   - 例：長文読解の場合
     - 1つの長文から複数の質問が出題される場合
     - これらの質問は完全に独立しているとは言えません

4. **ペアで比較**
   - 2つのモデルに全く同じ問題を解かせて
   - 差を直接比較する方法

5. **十分な数の問題を用意**
   - 小さな差を検出したい場合は
   - より多くの問題数が必要になります

## 具体的な評価方法のポイント

### 1. 標準誤差を使った評価

```
評価結果の表示例：
MATH：65.5% (±0.7%)
```

この表示は以下を意味します：
- 平均点は65.5%
- 真の実力は、おそらく64.8%～66.2%の範囲にある
- (±0.7%は信頼区間を示しています)

### 2. モデル間の比較方法

2つのモデルを比較する際の重要なポイント：

| 比較のポイント | 説明 | 例 |
|----------|------|-----|
| スコアの差 | 単純な点数の差 | 5%の差 |
| 信頼区間 | その差がどの程度信頼できるか | ±2%の範囲 |
| 相関 | 同じような問題でつまずくか | 高い/低い相関 |

### 3. 評価の信頼性を高めるコツ

1. **十分な問題数を確保**
   - 少なくとも100問以上
   - 可能であれば1000問以上

2. **複数回の試行**
   - 同じ問題を3回以上解かせる
   - 平均を取ることで安定した評価に

3. **多様な問題タイプ**
   - 簡単な問題と難しい問題をバランスよく
   - 異なる分野の問題を含める

## まとめ

AIモデルの評価は、単純な点数比較ではなく、以下の点を考慮することが重要です：

- ✅ 平均点だけでなく、ばらつきも考慮する
- ✅ 十分な数の問題で評価する
- ✅ 複数回の試行を行う
- ✅ 統計的な手法を用いて信頼性を確保する

これらの方法を使うことで、「このAIモデルは本当に優れているのか？」という問いにより確かな答えを出すことができます。

## 参考資料
- [プログラミング知識ゼロでもわかる プロンプトエンジニアリング入門](https://amzn.to/4hPB1eX)
- [LangChainとLangGraphによるRAG・AIエージェント［実践］入門](https://amzn.to/4hXrtP9)
LaravelでAPP_DEBUG=false時にlivewire.jsが404エラーになる原因とその解決方法

参考サイト：https://laracasts.com/discuss/channels/livewire/app-debug-to-false-causes-a-404-error-on-livewirejs

## 【これを書くに至った経緯】

ローカル環境では問題なくLivewireが動作していたのに、リモートサーバーへLaravelプロジェクトをデプロイした際、ブラウザで以下のエラーが発生しました。

***failed to load resource: the server responded with a status of 404 ()***

Livewire.jsが **https://XXXX.com/livewire/livewire.min.js?id** を探しに行き、404エラーが発生。
**.env**ファイルの **APP_DEBUGをtrue** にすると問題なく動作するものの、**false** にすると正常に動作しなくなりました。

## 【結論から言うと】

`php artisan livewire:publish --assets`コマンドを実行し、Livewireのアセットを**public**ディレクトリに公開することで解決しました。


## 【なぜAPP_DEBUGがtrueだと動作するのに、falseだと動作しないか】
**APP_DEBUG**の設定によって、Laravelの動作が次のように変化します。

### APP_DEBUG=true
- Laravelは **デバッグモード** で動作し、Livewireの **動的アセット生成機能** が有効になります。
- **https://XXXX.com/livewire/livewire.min.js** のリクエストがあれば、Laravelアプリケーションが自動的にJavaScriptを生成して提供します。
- このため、**public/livewire/livewire.min.js**ファイルが存在しなくても問題なく動作します。

### APP_DEBUG=false
- APP_DEBUG=false に設定すると、Laravelは 本番環境を前提とした動作モード に切り替わります。
- もし**public/livewire/livewire.min.js**が存在しない場合、サーバーは404エラーを返します。
- 本番モードでは動的アセット提供が無効化されるため、アセットファイルを公開する必要があります。


## 【なぜpublic内にlivewireのアセットを公開する方法で解決するのか】

本番では、Laravelは静的アセットを直接提供することを期待します。
php artisan livewire:publish --assets により、必要なアセットが正しい場所に配置され、Laravelやサーバーが適切にレスポンスを返せるようになります。

`php artisan livewire:publish --assets` コマンドを実行すると、Livewireが必要とするJavaScriptファイルが **public/livewire**ディレクトリに配置されます。

### 生成されるファイル
```plaintext
public/
└── livewire/
  ├── livewire.js
  ├── livewire.min.js
  └── livewire.js.map
```
### 問題解決の流れ
①ブラウザが https://XXXX.com/livewire/livewire.min.js をリクエスト。

②サーバーが public/livewire/livewire.min.js を返却。

③必要なアセットが正しい場所に配置されているため、404エラーが解消。


## 【なぜローカル環境ではAPP_DEBUGがfalseでも動作していたのか】

①Laravelの内部ルーティングがリクエストを動的に処理していた。

②PHPビルトインサーバーの柔軟な動作により、静的アセットがなくても正常に処理されていた。

③開発環境特有のキャッシュや動的アセット生成が影響していた。

上記などが考えられます。本番環境では、これらの柔軟性がなくなるため、public/livewire/livewire.js などの静的アセットを明示的に配置する必要があるようです。

## 【まとめ】

#### 問題の原因:
APP_DEBUG=false では、Laravelは動的アセット提供を行わず、静的アセット（public/livewire/livewire.min.js）が必要になる。（今回のパターンではpublic/vendor/livewire/livewire.min.js）

#### 解決方法:
php artisan livewire:publish --assets を実行して、必要なアセットを公開する。

#### ポイント:
ローカル環境で動作しても、本番環境では静的アセットが必須であるため、適切に公開することが重要。
【Next.js】バージョン15を個人用にまとめてみた

Next.jsのバージョン15の技術情報を個人用にまとめてます。
ざっくりとまとめておりますので、詳細が気になる方は[公式ドキュメント](https://nextjs.org/blog/next-15)を参照しておりますので確認してみてください。

## 1.アップグレード用CLIの強化
@next/codemod というCLIツールを利用して、Next.js、Reactを最新バージョンに簡単にアップグレードできるようになりました。依存関係の更新なども行ってくれるらしい

## 2.非同期リクエストAPI
リクエスト固有のデータに依存するAPIが非同期化する。
レンダリングをするにあたってリクエストを待機する必要がなくなり、レンダリングが早くなる
cookie、headers、draftMode、params、SearchParamなどが該当します。

## 3.キャッシュのデフォルト化を解除
Next.jsは複数のキャッシュ機能が実装されており、不要な場合はオプトアウトできる機能を備えていました。
バージョン15ではそれが解除され、オプトインする形式に変更された。

## 4.React19、React18との互換性
バージョン15ではAppRouterをReact19RC版で使用する。
又、React18でPagesRouterを使用できるので、バージョン15の恩恵を受けながらPagesRouterを使用することが可能である。
公式を見るとReact19はRC版の段階ではあるが、テストは十分で安定性の確保はできているみたいです。

## Turbopack開発が安定化
TurbopackDevが安定板になった
[Turbopack](https://ja.next-community-docs.dev/docs/architecture/turbopack)の詳細はこちら

## 5.静的ルートインジケーター
開発中に静的ルートインジケータが表示されるようになり、静的or動的ルーティングを識別しやすくなった。

## 6.unstable_after API
レスポンス又はプリレンダリングの完了後に実行するタスクをスケジュールすることが出来る。

## 7.instrumentation.jsの安定化
Nextサーバーのライフサイクルを利用してパフォーマンス監視、エラーの原因を追跡し、OpenTelemetryなどの観測ライブラリと深く統合できる。

## 8.セルフホスティングの改善
Cache-Controlディレクティブをより細かく制御できるようになった。
next.configでexpireTime値を設定できる。又、デフォルト値を一年に更新し、Cache-Controlがカスタム値をデフォルト値で上書きしなくなり完全な制御が可能になった。

## 9.サーバーアクションのセキュリティ強化
デッドコードの排除で使用されていないサーバーアクションのIDはクライアント側のJavaScriptバンドルに公開されないため、バンドルサイズが削減し、パフォーマンスが向上する。
アクションIDを憶測不可能で非決定的なものを生成。IDはビルド間で定期的に再計算されるためセキュリティ強化が期待できる。

## 外部パッケージのバンドルを最適化
AppRouterでは外部パッケージがデフォルトでバンドルされますが、serverExternalPackages構成オプションを使用して特定のパッケージをオプトアウトできます。

## ESLint9をサポート
ESLint8のサポートが2024年10月5日終了することに伴い、ESLint9のサポートが導入されました。
Next.jsでは下位互換性を維持しており、ESLint8も引き続き使用できる

## 開発とビルドの改善
ローカル開発のパフォーマンス向上、課金対象のAPI呼び出しの潜在的なコストを削減するために、HMRが以前のレンダリングからの応答を再利用できるウようになった。
AppRouterの静的生成を高速化。
【C#】誰でもわかるアクセス装飾子

## はじめに
みなさんアクセス装飾子ってちゃんと理解できてますか？
わりと適当にpublicにしたりprivateにしたりしてないでしょうか？
自分は初心者のときに結構してました...
そこで分かりやすく基本的なアクセス装飾子の解説を今回したいと思います！

## アクセス装飾子の種類について
主な種類としては
・public
・private
・internal
・protected
とありますが今回は最も使うpublicとprivateのお話をします。(internalとかprotectedはファイルだったり継承あたりが絡んでくるので小難しくて頭パンクするのでという言い訳）
## publicとは？
これはpublic（パブリック）と読みます。
これは言ってしまえばどこからでもアクセスしていですよーと言うアクセス装飾子になります。
ここで例を見てみましょう！(例としてプレーヤークラスと言う形で上げてます）
```c#
public class Player
{
    public string m_PlayerName;

    //プレイヤーの名前を取得するメソッド
    public string GetPlayerName()
    {
        return m_PlayerName;
    }

}
```
上記のようなクラスがあったときます。
そしてこのクラスではm_PlayerNameという変数とSetPlayerNameというメソッドが用意されています。
そしてこれを外から呼び出したい！ってときはpublicにするイメージです。
例を出すとこんな感じです。
```c#
public class Manager
{
    public Player m_Player=new Player();

    //Playerクラスをインスタンスして呼び出せる。
    Player.m_PlayerName="プレイヤー名";
    
    //メソッドも同じように呼び出せる。
    var playerName= Player.GetPlayerName();
}
```
ただこれだとあれ？
なんでManagerプレイヤーの名前もセットも取得もしているの？
って感じがするのでここで次に説明するprivateがあるわけです。

## privateとは？
これはprivate(プライベート）と呼びます。
名前から察せると思うのですがそのクラスでしか使いたくないときに使います。
ほかでは絶対に呼ばせたくないときに使いますね。
早速先ほどのコードを例にしてみていましょう。
```c#
public class Player
{
    //今回はここをプライベートにかえるのと初期値としてPlayerNameを代入しておく。
    private string m_PlayerName="PlayerName";

    //プレイヤーの名前を取得するメソッド
    public string GetPlayerName()
    {
        return m_PlayerName;
    }

}
```
このようにm_PlayerNameだけプライベートにしてみました。
ではこれをManagerクラスでの例をみてみましょう。
```c#
public class Manager
{
    public Player m_Player=new Player();

    //privateなので呼べません
    //Player.m_PlayerName="プレイヤー名";
    
    //メソッドは変わらずpublicのままなので呼べます。
    var playerName= Player.GetPlayerName();

}
```
先程のようにほかのクラスの変数を直接別のクラスで代入するのはぶっちゃけナンセンスなのでManagerクラスではPlayerクラスの名前だけ取得できるようにするという形にするのが個人的には良いと思います。

## 総括
わりとprivateでいいものをpublicにしてしまっていたりとか言う経験はみなさんあるのではないでしょうか？
もちろん最初からすべて完璧な装飾子にする必要はないですが極力publicとprivateは意識しておくとなんでもかんでも依存をしてしまうということを少しでも防げる設計にできるのではないかとおもいます。
すごく簡単なことですがぜひ意識していきましょう！！

おわり
ブループリントからジオメトリキャッシュを登録する

この記事は[Unreal Engine (UE) Advent Calendar 2024](https://qiita.com/advent-calendar/2024/ue)の5日目の記事です。


[シリーズ2の3日目](https://qiita.com/_akoto_/items/8bc503bf6bc13142f346)に、『Pythonからジオメトリキャッシュを登録する』という記事を投稿しました。
そこでやっている事を、ブループリントに置き換えたのが、この記事になります。
Pythonとブループリントで書き方を比較してみてください。


# 確認環境
Windows 11 Pro
UnrealEngine 5.3.2

# サンプル

ブループリントで書いた場合のブループリントの処理の全体です。

![ブループリントでジオメトリキャッシュを登録するサンプル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/07e2c741-54b5-a1ed-7bf3-3dbfb1defe14.png)

:::note info
上の写真はWidgetのブループリントになります。
:::


# 説明

ポイントになるブループリントのノードを簡単に説明します。

**インスタンス作成**
![ジオメトリキャッシュのインスタンスをスポーン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/ce0a7d08-250e-1686-0b94-2f23451e395c.png)

ジオメトリキャッシュの**Spawnable**と**インスタンス化**しています。


**トラック作成**
![ジオメトリキャッシュのトラックを作成する.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/2c6ca159-23f4-72e4-e81d-948864f7ef78.png)

トラックは、『**MovieSceneGeometryCacheTrack**』を追加してください。
セクションは、『**MovieSceneGeometryCacheSection**』が追加されます。

**MovieSceneGeometryChacheParams構造体**

MovieSceneGeometryCacheSectionに、**MovieSceneGeometryChacheParams**構造体を渡す必要があります。
Makeのノードが公開されている為、これを使用してください。

![MovieSceneGeometryChacheParams構造体作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/140ef2f2-0292-c58d-5ae1-979b164118be.png)

**StartFrameとEndFrame**
ジオメトリキャッシュから、『**StartFrame(開始時間)**』と『**EndFrame(終了時間)**』にアクセスが可能です。
SetRange等で、トラックの長さを設定するのに使えるかと思います。

![StartFrameとEndFrame.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/a9fa7d56-0a5d-f1d8-db60-d6aee8c80fa2.png)


# 最後に

今回は、Pythonとブループリントを比較するような記事を投稿しました。
普段は、ブループリントしか使っていないのですが、初めてUnrealPythonをさわってみて、書き方やお作法の違いが結構あった為、今回の記事を投稿させていただきました。
paiza.ioでnode.js その6

# 概要
paiza.ioでnode.js、やってみた。
練習問題やってみた。

# 練習問題
objectをtree表示せよ。

# サンプルコード

```
process.stdin.resume();
process.stdin.setEncoding('utf8');

    let data = {
      "Fish": {
        "trout": {},
        "salmon": {}
      },
      "Tree": {
        "Huge": {
          "sequoia": {},
          "oak": {}
        },
        "Flowering": {
          "redbud": {},
          "magnolia": {}
        }
      }
    };
    function createTreeText(obj) {
      let li = '';
      for (let key in obj) 
      {
        li += '<li>' + key + createTreeText(obj[key]) + '</li>';
      }
      let ul = '';
      if (li) 
      {
        ul = '<ul>' + li + '</ul>';
      }
      return ul || '';
    }
    console.log(createTreeText(data));


```

# 実行結果

<ul><li>Fish<ul><li>trout</li><li>salmon</li></ul></li><li>Tree<ul><li>Huge<ul><li>sequoia</li><li>oak</li></ul></li><li>Flowering<ul><li>redbud</li><li>magnolia</li></ul></li></ul></li></ul>

# 成果物

https://paiza.io/projects/0A7zIi74VUVaxs3SvRUmTg?language=javascript

以上。
ジョブカンのフォームID

**使っているクラウドなどの小ネタ Advent Calendar 2024 11日目**


申請書を選択した時にURLにIDらしきものがある　504807

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/cee68c79-4615-0987-2fae-89e1d8208b2f.png)

フォームのIDかなと思って、YoomからフォームIDを見てみると... あれ56580875になっている？
桁数も違う

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/dc73dc22-0076-a4fb-564e-6ced45835665.png)

さらにAPIでフォームを取得してみるとidは56580875になっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/543702de-e443-f0a1-0df4-532c1c34caab.png)

ジョブカンの管理者画面でフォームを見てみると　504807　ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/9b0f5857-0ccb-2e13-c69b-a380b516c917.png)

この番号でリンクを作れば、申請はできそうですが... このIdは何
【Ruby】putsと$stdout.putsの違い

# はじめに
こんにちは！アメリカの大学で語学を学びながら、独学でソフトウェアエンジニアを目指している者です。
本日は`puts`と`$stdout.puts`の違いについて説明していきたいと思います。
Rubyを使っているとき、よく目にする `puts`。そしてあまり見かけない `$stdout.puts`。
これらはどちらも「標準出力」に文字列を出力するために使われますが、実は微妙な違いがあります。
それぞれ見ていきましょう。

## `puts` とは
`puts` は、Rubyで最も基本的な出力メソッドの一つです。現在の `$stdout` に文字列を出力します。
通常、Rubyプログラムを実行したときの「標準出力」とはターミナルの画面を指します。

以下の例を見てください。
```ruby
puts "Hello, World!" # ターミナルに "Hello, World!" を表示
```
この場合、`puts` はデフォルトでターミナル（`STDOUT`）に「Hello, World!」と出力します。

## `$stdout.puts` とは
`$stdout` は、Rubyにあらかじめ定義されているグローバル変数で、現在の標準出力を指します。
`$stdout.puts` は、この `$stdout` オブジェクトに対して直接 `puts` を呼び出す形式です。

以下は `puts` と `$stdout.puts` の基本的な使い方です。

```ruby
puts "Hello, World!"        # ターミナルに "Hello, World!" を表示
$stdout.puts "Hello, World!" # 同じ結果を表示
```
動作は似ていますが、両者の違いは `$stdout` をリダイレクト（出力先を変更）したときに顕著になります。

## 違いが出るケース：`$stdout` のリダイレクト
#### リダイレクトとは？
リダイレクトとは、標準出力の出力先を変更することです。
通常、`puts` はターミナル画面に出力されますが、リダイレクトを使うとターミナル以外の場所（例: ファイルや仮想ファイル）に出力を切り替えることができます。

具体例を見てみましょう。
```Ruby

require 'stringio'

# ログ用の仮想ファイルを用意
log = StringIO.new

# $stdout をリダイレクト
$stdout = log

# 出力を確認
puts "This is puts"
$stdout.puts "This is $stdout.puts"

# $stdout を元に戻す
$stdout = STDOUT

# 結果の確認
puts "Log contents:"
puts log.string
```
実行結果
```ruby
Log contents:
This is puts
This is $stdout.puts
```

### コードの動作解説
1. $stdout を仮想ファイルにリダイレクト
`$stdout = log` で `$stdout` を仮想ファイル（`StringIO` オブジェクト）にリダイレクトしています。この時点から、`puts` の出力先がターミナルではなく仮想ファイルになります。

2. `puts` の動作
`puts` は `$stdout` を経由するため、現在の `$stdout`（仮想ファイル）に "This is puts" を書き込みます。

3. `$stdout.puts` の動作
`$stdout.puts` は `$stdout` オブジェクトの `puts` メソッドを直接呼び出して、仮想ファイルに "This is $stdout.puts" を書き込みます。

4. `$stdout` を元に戻す
`$stdout = STDOUT` で `$stdout` を標準の出力先（ターミナル）に戻します。

5. ログ内容を確認
仮想ファイル（log）に蓄積された内容を `log.string` で取得し、ターミナルに出力します。

## リダイレクトなしの場合
リダイレクトを行わない場合の動作を確認してみましょう。

```Ruby
puts "This is puts"
$stdout.puts "This is $stdout.puts"
```
出力結果
```ruby
This is puts
This is $stdout.puts
```

この場合、`puts` と `$stdout.puts` のどちらもデフォルトの `$stdout`（STDOUT オブジェクト）を通じてターミナルに直接出力されるため、記述された順番通りに表示されます。

### `$stdout` を操作するメリット
では、わざわざ `$stdout` を操作して出力先を変更するメリットは何でしょうか？
以下に `$stdout` のリダイレクトが役立つ具体例を示します。

#### テストやデバッグに活用
たとえば、プログラムの動作確認やログ収集のために出力内容を一時的にログとして保存したい場合、以下のように `$stdout` をリダイレクトすると便利です。

```ruby
require 'stringio'

log = StringIO.new
$stdout = log

puts "Test log: Something happened."
$stdout = STDOUT

puts "Captured log:"
puts log.string
```
出力結果

```ruby
Captured log:
Test log: Something happened.
```
仮想ファイルに出力を切り替えることで、テストの動作確認やデバッグの効率を向上させられます。

# まとめ
* `puts` と `$stdout.puts` は通常同じ挙動ですが、リダイレクトを行うと違いが顕著になります。
* `$stdout` をリダイレクトすることで、出力先を仮想ファイルや別のストリームに柔軟に切り替えることが可能です。
* テストやログ収集の際に `$stdout` を操作することで、プログラムの動作確認やデバッグを効率化できます。
注意点として、リダイレクトは一時的な変更であるため、必ず元の `$stdout`（`STDOUT`）に戻すことを忘れないようにしましょう！
3Dスキャン技術が宝飾デザインとカスタマイズを革新する

ジュエリーデザインの分野では、技術の進歩がデザイナーの創造の幅を広げ続けています。その中で、近年注目を集める3Dスキャン技術は、精密さと効率性、多機能性を兼ね備えたツールとして、宝飾業界に新たな可能性をもたらしています。  

### 精密なデータ収集で革新的なデザインをサポート  

3Dスキャナーは、宝飾品の細かいデザインや複雑な構造を正確に三次元データとして収集することができます。宝石のセッティングや繊細な彫刻模様なども、デジタルモデルとして完璧に再現されます。これにより、ジュエリーの修復、改造、再現が効率的に行えるだけでなく、新しいデザインの基礎としても活用可能です。  

カスタマイズジュエリーにおいて、この技術は特に重要です。顧客が持ち込むジュエリーをスキャンし、そのデータを基にデザイナーが顧客の希望に沿ったデザインを作成することで、完全に個別化された唯一無二の作品が実現します。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/7b372aa6-d06b-948c-aedc-28930e7205f0.png)

### 自然テーマデザイン：自然からインスピレーションを得る  

伝統的なジュエリーだけでなく、3Dスキャン技術は自然物のデータ収集にも応用できます。例えば、花や葉、貝殻などの自然物をスキャンし、高精度の3Dモデルを生成することで、自然の形状やテクスチャーをそのままジュエリーデザインに取り入れることが可能です。手彫りに比べて、3Dスキャンは肉眼では捉えきれない細部まで再現でき、デザインによりリアルな自然の美を与えることができます。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/6ac3c933-72ce-f824-1204-e93b3c2cfccd.png)


### デザイン効率の向上とワークフローの最適化  

従来のジュエリーデザインでは、特に複雑なデザインの場合、手作業でのモデリングに多くの時間がかかっていました。しかし、3Dスキャン技術を使えば、このプロセスを大幅に短縮できます。スキャンで得た正確なデジタルモデルを直接コンピューターで編集することで、煩雑な手作業を省略できます。また、完成したデザインは3Dプリンターを使ってプロトタイプや製品として迅速に製作でき、デザインから製造までのプロセスを効率的に変革します。  

### 結論  

3Dスキャン技術は、ジュエリーデザインの効率を向上させるだけでなく、デザイナーに無限の創造の可能性を提供します。個別化カスタマイズ、伝統的な宝飾の改造、自然からインスピレーションを得たデザインなど、あらゆる場面でこの技術が革新をもたらしています。今後、3Dスキャン技術がさらに普及・進化するにつれて、ジュエリーデザインはますます多様な可能性を追求し、創造性と技術の融合を体現した作品が増えていくことでしょう。

https://www.revopoint3d.com/collections/3d-scanners
Kaliで\u@\h:\w$が表示される

Kaliで日本語を表示したいとき、言語パックをダウンロードしてインストールし、~/.bashrcファイルを設定しました。$source ~/.bashrcを実行すると、\u@\h:\w$形式が表示されました。ChatGPTに質問したところ、それはPS1の設定問題だと教えてくれました。ChatGPTの指示通りに長い間実行しましたが、最終的に最初の問題に戻り、\u@\h:\w$を消すには、たった2つのコマンドで済むことが分かりました。

```
シェルの種類を確認する
    echo $SHELL

シェルの種類を切り替える   
    chsh -s /bin/bash

召喚せよ！
    bash
 ```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941931/340c2615-db9e-d89f-5e11-cf45779d197a.png)

原因は私のシェル環境がzshであることです。
zsh（Z Shell）とbash（Bourne Again Shell）は、2つの一般的なUnix/Linuxシェルです。どちらも基本的な機能は似ていますが、zshは特定の点でより多くの強化された機能や柔軟性を提供しています。
source /.bashrcを実行した後、\u@\h:\w$のようなプロンプトが表示される理由は、私はbashの設定ファイル/.bashrcを読み込もうとしていたからです。このファイルは元々bashシェル用に設計されています。
なぜこの問題が発生したのかというと、zshとbashは似たような機能を持っていますが、設定ファイルや構文にいくつかの違いがあるからです。~/.bashrcはbashの設定ファイルで、通常はbashのプロンプトやコマンドエイリアスなどを設定するために使われます。
zshでsource ~/.bashrcを実行すると、zshはこのbash設定ファイルを読み込んで実行しようとします。bashrcファイルの一部の設定（例：PS1='\u@\h:\w$ '）は、zshによって読み込まれ、設定として適用されます。
```
\u@\h:\w$ の意味：
\u：現在のユーザー名。 
\h：ホスト名の最初の部分（ドメイン名は含まれません）。
\w：現在の作業ディレクトリのパス。
$：プロンプトの終わりを示します。通常のユーザーの場合は $ が表示され、rootユーザーの場合は # が表示されます。
```

\u@\h:\w$ の形式が現れた時、ChatGPTが指摘する問題は私を大きく遠回りさせるものだった。私はまだまだ愚かだ。
linuxで設定したグループIDがvscodeのターミナルで変わらないときの対処法

# 解決したいこと
- vscodeのリモートSSHで、GPUサーバなどに接続している
- GPUサーバ側で自分のグループIDを変更した
  ```:IDの変更
    shibaura@server:~$ sudo usermod -aG docker shibaura
  ```
- `id`コマンドでグループIDを出力しても、なぜか適用されていない
  ```:理想
    shibaura@server:~$ id
    uid=1000(shibaura) gid=1000(shibaura) groups=1000(shibaura), 999(docker)
  ```
  ```:現実（ダメ）
    shibaura@server:~$ id
    uid=1000(shibaura) gid=1000(shibaura) groups=1000(shibaura)
  ```

# 解決策
**サーバ側のvscodeサーバを更新すればOK。**
サーバ側に設置されている`/home/.vscode-server`を削除して、再度vscodeのリモートSSHで接続すればよい

- 作業1：vscodeを使ず、普通のターミナルで、特定フォルダを削除
   ```:
    shibaura@local:~$ ssh shibaura@server
    shibaura@server:~$ rm -rf .vscode-server
  ```

- 手順2：vscodeでリモートSSH接続する 👉 `id`コマンドを叩いてみると解決している

# おわりに
- ほえー
EdgeTech+ 2024 イベントレポート

EdgeTech+ 2024に行ってきましたので気になったブースを紹介します。
# メカトラックス Raspberry Pi ヘルプデスク
Raspberry Pi公式パートナーのメカトラックスでは歴代のRaspberry Piを展示していました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/1c81fd76-c767-ee99-1280-4b7548b76a13.png)
### Raspberry Pi 導入ヘルプデスク
Raspberry Pi 導入相談が可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/e44ad55a-52ae-ab26-119a-c9471cca68b5.png)

https://prtimes.jp/main/html/rd/p/000000020.000023719.html
# アットマークテクノ
i.MX 8ULP搭載の新製品「Armadillo-900」を発表した實吉社長
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/0f4b08ec-4ebc-bb48-0568-412c5f24c416.png)
# AVNET 
アブネットの新人FAEがNanoEdge AI Studioで２週間で製作した事例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/2aedfabc-52d5-cc3a-ad98-83ea8c8e2c59.png)
[実演映像](https://avtinc-my.sharepoint.com/:v:/g/personal/takuto_mashiko_avnet_com/EVwE8LHlhjlKjhmTsFl54TABg-8NSGKLboYu_I13fBoBLg)
# STマイクロ
今や当たり前となったセキュリティ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/0330b451-d797-c2fd-4e3f-494ed2d49477.png)
# サンマックス・テクノロジーズ
１１月２１日に秋月電子から発売になったボード(T8F81 DIP化モジュールキット)の展示および、上位製品の発売告知
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/654632cb-8251-588d-402b-ee716af6bec4.png)

https://akizukidenshi.com/catalog/g/g129595/

# フェスタ
EdgeTech+の中日の木曜日はボジョレーヌーボーの解禁日です。
例年、中日の木曜日にEdgeTech+ フェスタというイベントがあります。
各企業からお酒やおつまみ等が提供されます。

https://www.jasa.or.jp/expo/event/festa.html
### TDK
かなり豪華
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/5fdb7e14-f074-82c8-79c4-d3a3ac8db89a.png)
# Winbond
お食事券で交換できるお食事と世界のビールが素敵
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/1c28d993-a5be-fce8-6553-ddfde2d8f173.png)
# パナソニックオートモーティブ
初出展かつ端っこでの出展でしたが、足りないくらいだった模様
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/ccdd45d5-1cfd-c3f2-2d5f-d2c04b0f2735.png)
個人情報を出さないとお酒を出さないブースと太っ腹で何も言わず提供してくれるブースに大別されます。
当然、後者のブースは大盛況かつ人気でした。
逆に前者の勿体ぶっているブースは最後まで酒などが余っている光景はいつもの通りでした。
【2024/11月新機能】QuickSightでビジュアルのインポート機能が追加されました

# はじめに
株式会社ジールの @oreo_tです。
2024/11/22のアップデートで、AWSのQuickSightでビジュアルのインポートができるようになりましたので紹介しようと思います。

# 今回の更新情報

本日からQuickSightの分析画面のファイルタブに、「import」という項目が追加されたようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2197572/0ad46192-76bd-ae2c-7327-f3e31953a94c.png)


この機能は、分析編集時に、別の分析やダッシュボードからビジュアルを取り込むことができるというものです。
これまでは、1つの分析の中でシートを跨いだビジュアルの複製などはできたのですが、分析を跨いだ複製はできませんでした。そのため、同じような内容の分析・ダッシュボードをいくつも作るような際に作業の短縮ができそうです。

# 機能検証
今回は、インポート機能を一通り試してみたいと思います。
まず、インポート元となる分析を用意します。今回は、オープンデータである人口統計情報を利用してこのような分析を作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2197572/52452f59-d838-a993-d9a5-c6cd5b6bc81f.png)

次に、インポート先となる分析を用意します。
ダミーのデータソースだけが入っている空の分析を作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2197572/852daa3f-137d-38c9-fa6c-eff19b6b2995.png)

そして、「ファイル」から「import」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2197572/bbd624c3-ffe7-9672-c1c1-0f34731b1ea1.png)


分析・ダッシュボードの選択画面が出てくるので、インポート元を選択して「ロード」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2197572/fdc91205-7dd1-af24-f679-94f28411cbef.png)

インポート元の画面が表示されるので、インポートしたいビジュアルをクリックし、「インポート」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2197572/bc29d886-646f-b56a-fec1-ff26f70bdc01.png)

すると、このようにビジュアルをインポートできました。
また、この際元のビジュアルで使っていたデータセットも一緒に連携されていることが画面左から分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2197572/dd6d8d3d-0200-c7c5-bf8a-887bf486079a.png)


***
以下、制約や細かい仕様についての検証です。

制約として、インポートできるのはビジュアルに限られ、テキストボックス、インサイトはインポートできないようです。
例として、テキストボックスがあった箇所にはこのような警告文が出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2197572/91b987c1-9c0a-a7c4-eee7-2f38b5aa3d97.png)

また、一度にインポートできるのは1シート分だけのため、ビジュアルを選択した状態で別シートに行くと以下のような警告文が出てきます。
逆に、1シート内であればビジュアルの複数選択は可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2197572/d52eface-e2f3-589f-f107-ff1335dc21ff.png)



計算フィールド、フィルター、パラメータ単体でのインポートはできないものの、インポートするビジュアルにそれらが使われている場合、一緒にインポートされるという仕様のようです。

インポート元に「世帯数_計算フィールド」「総人口_計算フィールド」という2つの計算フィールドを作成し、「総人口_計算フィールド」だけがビジュアルに使われているので、この状態でインポートをしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2197572/f2accc41-4796-dae0-370c-ff39fce7b0dd.png)

すると、インポートされた計算フィールドも「総人口_計算フィールド」だけとなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2197572/e713b615-85ff-fea8-c565-9ba7051ac83c.png)




# まとめ
この機能を使えば、同じようなビジュアルを別の分析・ダッシュボードで使いたいときに、計算フィールドを再作成したりグラフのプロパティを合わせるといった手間が省けそうです。
ぜひご活用ください。

***
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：

https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area
セットアップファイルで、dllがインストールされない意図しない動作を回避する

## 課題
次の条件の時、意図しない動作になる。
- msiファイルのセットアップで、既にインストールされているアプリをアップグレードする
- セットアップファイルに、ダウングレードされる（バージョンが小さくなる）DLLがある

この場合、ダウングレードされる前のDLLは、削除はされるが、DLL（ダウングレードされたDLL）はインストールされない。そのため、アプリが（部分的に）動作しなくなる。

## 操作による解決方法
インストール時の操作で、解決はできる。次のどちらかを行う。
- 一度、アンインストールしてから、セットアップする
- セットアップファイルを再度実行して、修復を行う


## セットアップファイル作成時による解決方法

ここでは、[WixToolset](https://wixtoolset.org/) 5.0.2 でmsiファイルを作成するとする。

wxsファイルで、REINSTALLMODEを `dmus` に指定する。


> d ファイルがないか、または別のバージョンが存在する場合に再インストールします。
- [REINSTALLMODE プロパティ](https://learn.microsoft.com/ja-jp/windows/win32/msi/reinstallmode)


```xml
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:ui="http://wixtoolset.org/schemas/v4/wxs/ui">
  <Package Name="" ---- >

    <SetProperty Id="REINSTALLMODE" Value="dmus" Before="FindRelatedProducts" Sequence="first"/> 
```
以上のようにすると、コマンド ラインからプロパティを変更できるとのこと
- [MSI with WIX: setting REINSTALLMODE="amus" triggers "LGHT1076: ICE40: REINSTALLMODE is defined in the Property table. This may cause difficulties"](https://stackoverflow.com/a/75437957)



次のようにしても良いはずだが、ICE40の警告がでる。
```xml
<Property Id="REINSTALLMODE" Value="dmus"/>
```

> .msi ファイルで REINSTALLMODE プロパティを定義すると、予期しない動作が発生する可能性があります。 このエラーを解決するには、このプロパティを定義しないでください。

- [ICE40](https://learn.microsoft.com/ja-jp/windows/win32/msi/ice40)


### 参考：msiファイルのインストール時のログの取り方
- [How to create installation logs at a particular location using Wix toolset?](https://stackoverflow.com/questions/62593880)
- [MSIインストーラーで詳細ログを出力する](https://qiita.com/zrock/items/f45f51047d4daf7a8401)

### 参照

- [File not copied (only) during upgrade](https://stackoverflow.com/questions/52993587/)
paiza.ioでnode.js その5

# 概要
paiza.ioでnode.js、やってみた。
練習問題やってみた。

# 練習問題
gccでコンパイルせよ。

# サンプルコード

```
process.stdin.resume();
process.stdin.setEncoding('utf8');

const fs = require('fs');
const { exec } = require('child_process');

fs.writeFileSync("main.c", "#include<stdio.h>\nint main() { puts(\"Hello world\"); }");

exec('cat main.c', (err, stdout, stderr) => {
	if (err) 
	{
		console.log(`stderr: ${stderr}`)
		return
	}
	console.log(`stdout: ${stdout}`)
})

exec(`gcc main.c`, (compileError) => {
	if (compileError) 
	{
		console.error(`コンパイルエラー: ${compileError}`);
	}
	console.log('Cプログラムのコンパイル成功');
});



```

# 実行結果

```
コンパイルエラー: Error: Command failed: gcc main.c
/bin/sh: 1: gcc: not found
```

# 成果物

https://paiza.io/projects/05a1LjEZzJZcszA6DT6NXw


以上。
OTF and TTF

OTF [^2] と TTF [^3] について。

雑なメモ。

## tl;dr

- OTF は TTF を発展させたフォントである。
- フォントをリポジトリで管理したくない場合は、GitHub から download して使う。Google Fonts は GitHub [^1] で公開されている。

## Context

業務アプリで PDF を出力するにあたり、TTF [^3] が必要になった。

CSS へのフォントの埋め込みや S3 からの配信などと構成を考慮した結果、Docker の build 時に download してそのまま使うことになった。

ただし、リポジトリに TTF を置くのはサイズが大きくなるため、避けたい。それを許容すると割れ窓的に他も大きなファイルを置くことになりそうだったため、Docker の起動時に download することにした。

```bash
# Get fonts for PDF generation
RUN curl -o /usr/local/share/fonts/NotoSansJP-Regular.otf -LO https://raw.githubusercontent.com/notofonts/noto-cjk/main/Sans/SubsetOTF/JP/NotoSansJP-Regular.otf && \
    curl -o /usr/local/share/fonts/NotoSansJP-Bold.otf -LO https://raw.githubusercontent.com/notofonts/noto-cjk/main/Sans/SubsetOTF/JP/NotoSansJP-Bold.otf
```

Google Fonts は GitHub [^1] で公開されており、そこから TTF を `curl` で取得することにした。

https://github.com/notofonts/noto-cjk

PDF 生成アプリ側は絶対パスで参照するようにした。`React-pdf` [^4] でのフォントの読み込み。

```typescript
    {
      src: path.resolve('/usr/local/share/fonts/NotoSansJP-Regular.otf'),
    },
    {
      src: path.resolve('/usr/local/share/fonts/NotoSansJP-Bold.otf'),
      fontWeight: 'bold',
    },
```

今回フロントエンドは CloudFront と Lambda で構成される予定であり、Fonts をデプロイに含めるのが妥当という結論に達した。

フォント ファイルをサブセット化するという手もあるが、PDF を使用する部分の特性を考慮し、性能よりも信頼性を優先することにした。

## Quick Note

現職になり、半年が経過した。

これまでに取り組んできたのは以下の通り。

- ADR の導入
- Architecture の検討
- 開発言語の選定
- CI/CD の構築
- CDK での IaC 化
- テスト自動化の実装
- 脆弱性診断の自動化
- 負荷試験の自動化と準備
- APM の導入
- 部門戦略の素案作成

生成 AI の登場により、何が必要なくなったかと言われれば、ググる回数が若干減ったくらい。

枯れた技術に取り組んでいれば、生成 AI で事足りるだろうが、それは「改善」を否定するに近く、昨日よりも良くなりたいという人間の性には逆らえない。

ということで、今も昔も変わらないエンジニア生活が続いている。自分でハマって、自分で解決して、自分の機嫌を取る。


[^1]: https://github.com/notofonts/noto-cjk
[^2]: https://ja.wikipedia.org/wiki/OpenType
[^3]: https://ja.wikipedia.org/wiki/TrueType
[^4]: https://github.com/diegomura/react-pdf
ROS2 launchファイルの書き方

# 状況
とりあえずlaunchファイルを書いて認識させたいとき，どうすればいいか忘れた．

# やり方
参考
[Launch ファイルによる複数プログラムの同時起動](https://brain.cc.kogakuin.ac.jp/~kanamaru/lecture/ROS2/index3.html)
から抜粋した．

1\. launchディレクトリが無ければつくる．
2\. setup.pyのインポート部分とdeta_filesに以下を追加
```python:setup.py
import os
from glob import glob
```
```python:setup.py
    data_files=[
        (略),
        (os.path.join('share', package_name), glob('launch/*_launch.py'))
    ],
```
3\. lauchディレクトリにlaunchファイルを追加する．
launchファイルの例
```python:hoge.launch.py
from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='turtlesim',
            executable='turtlesim_node',
            name='turtlesim'
        ),
        Node(
            package='ros_practice',
            executable='autonomous_controller',
            name='autonomous_controller',
            remappings=[
                ('/pose', '/turtle1/pose'),
                ('/cmd_vel', '/turtle1/cmd_vel'),
            ]
        )
    ])
```

# 最後に
学習中の備忘録なので参考程度に．
【UiPath】【DU】モダンプロジェクトに移行したい方へ

# はじめに

- 本記事は、Document Understanding のクラシックプロジェクトで運用中で、***モダンプロジェクトに移行したい方向け***の内容です。
- 記事の内容は、個人の見解または確認結果であり、UiPath の公式見解ではありません。
- 製品仕様や参考画像は 24.10 バージョンのもので構成しています。

# 公式ガイドの手順

https://docs.uipath.com/ja/document-understanding/automation-cloud/latest/user-guide/migrating-existing-projects

基本的には上記のガイドを参考に移行作業は実施いただけますが、幾つか沼ポイントがあるので、これから移行作業をおこなう方はご一読いただくのをお勧めします。

# 【要チェック】ハマりやすいポイント
## ✔ クラシックのデータセットをインポートする際は、まず「カスタム」のドキュメント種類をご用意ください

たとえば、請求書（日本語）モデルのデータセットだからといって、請求書（日本語）のドキュメント種類を追加してインポートしても失敗します！
必ず、「カスタム」のドキュメント種類を作成してインポートしましょう！

![注意事項1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/2a548b2e-d32e-bda3-c395-3259091c082a.jpeg)

## ✔ インポートするZipの直下にschema.jsonが含まれていること

AI Center のデータセットをエクスポート＞ダウンロードする場合、抽出器が複数あると次の様なデータセットが出力されます。

（例）
69207d47-5f79-4d67-a01a-30fe0bd17ea0.zip
　┗　抽出器1
　┃　　　┗　省略
　┗　抽出器2
 　　　　┗　images
 　　　　┗　latest
　　　　　　***schema.json***
　　　　　　split.csv

上記の状態でインポートすると次のエラー（スキーマファイルがありません）で失敗します。

![エラーキャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/3467037b-211a-a724-183c-e32deeefa24c.jpeg)

## ✔ データセットを再Zipする際は文字エンコードをutf-8に指定すること

OS標準の右クリック＞圧縮の場合、環境によって圧縮時の文字エンコードがutf-8以外のこともあります。

（例：utf-8以外で圧縮しインポート）
![エラーキャプチャ2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/809dbc30-c151-d008-0239-800936f7c577.jpeg)

::: note
7-Zip の場合、パラメータに「cu=on」を指定すればutf-8でエンコードされます。
![注意事項2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/4b357f9d-713c-5b56-99a4-a7c8e193b53a.jpeg)
:::

## ✔ Zipを再度インポートした際のエラーメッセージがわかりづらい。。。

![既に取り込み済みのZipを再投下.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/ccc8fbcc-0ee7-6db3-fab7-08b3a2f81f4f.jpeg)

『インポートされたデータセットのスキーマがドキュメントの種類「XXX」と一致しません。』

![追加投入できない原因.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/7c1543d7-c01d-5550-71c2-c8b59882ce1b.jpeg)

インポートするschema.jsonの末尾をみるとbase_modelのid:nullの記載などがあります。
推測ですが、一度インポートした後はこの辺の指定を変更しないと追加で取り込めないのかもしれません。単純にドキュメントIDを指定するだけではエラーは解消できませんでした。

::: note warn
既に取り込み済みのカスタムモデルに追加のデータセット（Zip）をインポートすることはできません。
ファイル削除をしても同様です。
再度、新しく「カスタム」のドキュメント種類を作成してからインポートしましょう！
:::

# さいごに
いかがでしたでしょうか。
皆さまのDUモダンプロジェクトへの移行が少しでも円滑に進めば幸いです。
移行作業自体はポイントさへおさえておけば簡単ですので、UI/UXが改善されたDUモダンプロジェクトへの移行を是非是非ご検討ください。
最後までお読みいただきありがとうございます(・ω・)ノ
9800X3DとASUSのMBでqledがVGAで止まって起動しない

### 12/12追記
最後の方に結末を追記しました。

### 経緯
初の自作PCを組んだのですが、題のように起動しませんでした。
問題がまさかCPUにある??とは思いもしなかったため、自力での解決は困難だったと思います。
すんごく時間を取られてしまったので、こうなる人を減らそうと、投稿します。

### 構成
CPU : Ryzen 7 9800X3D
GPU : なし
Memory : Crucial PRO 32GBX2枚 DDR5-5600
MB : ASUS TUF GAMING B650M-PLUS
SSD : Crucial P3 Plus 1TB

### 症状
一通り組んでみたところ、MBのqledがVGA(白)で点灯したままになり、画面に何も映らない。
biosにも入れないという状況。グラボは持っていないため、差したら行けるのかとかもわからない。
もちろんBiosは最新(3057)にしていた。

### やったこと。
- CMOSクリア
- Bios最新(3057)→CMOSクリア
- CPU再取り付け
- Bios一つ前に(3042)→CMOSクリア
- メモリ1枚差し(全てのスロットで)
- メモリ2枚差し(全てのスロットの組み合わせで)
- メモリの返品(クルーシャルさんごめんなさい)をして上のこと一通り

### 起動できた組み合わせ
<div align="center"><img width="300" alt="image" src="https://bbsimg03.kakaku.k-img.com/images/bbs/002/716/2716481_m.jpg"></div>

メモリをA2のみにさすと起動。ただしVGAドライバを入れないと画面がすごい途切れる。
VGAドライバを入れても時々途切れる。
A1,A2に挿すと速さ3600で起動する時があるが、本望ではない
A2,B2に挿すと上の症状で起動しない。


### 同じ症状の人の例
自分はまだ解決していないが、どうみても同じ症状な人がいたため、これから対処してみる。

https://x.com/Boker_iruka/status/1857777666683973733

この人の投稿をある程度まとめると、
- メインマザボはASUSのTUF GAMING X670E-PLUS WIFI
- 7700に戻すと何事もなく起動
- この人はメモリ1枚でもダメらしい
- サブ機に9800x3dを載せて内蔵GPUでOSまで行くのは確認
- サブ機マザボはMSIのトマホークらしい
- ただしサブ機でもiGPUが最初は使えず、後からいきなり使えるようになったらしい
- サブ機でもメモリクロックがコロコロ変わる不具合あり

### 解決策
ツリーに以下の記事があり、

https://www.reddit.com/r/ASUS/comments/1gtvpfr/b650ef_unable_to_use_9800x3d_with_new_bios_vga/

それによると最初のBios(2616)でのみ起動が確認される。まあPBOとかないからこのまま使うのはね
twitterの人もこれで起動できていた。
以下同様の問題について
ASUS ROG STRIX B550-Aで同じような感じになった人はPCの電源を入れる前にモニターの電源を入れると解決したらしい。

### 今の所の問題の根源
みた感じすんごくデータ数が少ないが、CPUの初期不良みたい。
ASUSのマザーで問題が顕在化しやすいってことなのかなと思う。

### 結局
twitterの人は最終的にCPUを交換して完全に解決した模様。
交換してきましょう。

### 自分の対処(12/12追記)
結局自分は購入店であるアキバのPC工房様に出向いてCPUを変えてもらえました。
その結果**症状は完全になくなりました**。つまりCPUがダメだったんだろうと思います。
ちなみに、マザーボードを結局変えてないので、(もしかすると??)マザーとの相性の線もあります。
とはいえ少なくともCPUになんらか落ち度があったから交換で治ったわけですね。

### 交換してもらった状況
学会で忙しくて交換してもらってからしばらく積んでいたのですが、確か11/23に変えてもらったと思います。
CPUとレシートだけ持って行ったのですが、結果から言うとマザーも持って行ったほうがいいみたい?
ちゃんと**ASUSの**マザーで動かないといったのに、現場にASUSマザーがないからとギガバイトだかのマザーで確認されて、「動きますねー」と言われて交換をしぶられました。
その時にマザーも持ってきてくれないと、、みたいなことを言われましたが、冷静になると今度はマザーのせいにされて交換されなかったんじゃないかと思います。あれごねなければ詰んでたかも。
結局交換してくれたのですが、何度も「多分動かないけどね」と言われ、割と気分は悪かったです。
ちゃんとCPUの問題でしたよ!!!!
［実践ガイド］あまり知られていない⁉知っておくべきAssignGroup履歴の可視化テクニック

## はじめに
ITSM運用においてインシデントおよび問題管理のトラッキングは重要な業務の一つです。
チケットのAssignTo（担当者）の変更履歴は標準のNote（メモ）機能で追跡可能ですが、AssignGroup（担当グループ）の変更履歴はOOTBのフォームUIでは可視化されていません。
本記事では、システムログやバックエンドデータを活用したAssignGroup変更履歴の追跡手法について解説します。
これにより、より詳細なワークフローの分析とプロセス改善が可能になります。

## AssignGroup変更履歴確認方法
①該当のレコードのハンバーガーメニュー（3本線の直線）をクリック
②History（履歴）→List（リスト）をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3915380/88c004b3-979f-984f-d11d-a9bea3bb4d11.png)

③表示されたページ下部にある、Audit History（監査履歴）のLabel（ラベル）でassignmentで条件指定
④AssignGroupの変更履歴が表示

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3915380/ece21e25-de87-0500-5fba-55d3c9c79aef.png)

## まとめ
この手法はGUIベースのインターフェースを通じて実装されているため、技術レベルに関係なく、全てのエンドユーザーが直感的に操作可能です。
特にローコード/ノーコード開発者にとって、システムの深い知識なしでAssignGroup履歴を追跡できる有用なソリューションとなっています。
運用効率化の観点から、この手順をナレッジベースに文書化し、組織全体で共有することを推奨します。これにより、サポートチームの負荷軽減とベストプラクティスの標準化が実現できます。

## 豆知識
上記とは異なった方法でMetric（測定基準）をフォームのRelatedList（関連リスト）に表示させて変更履歴を確認するという方法もあります。
この場合ではMetricを新規作成し、フォームに追加しなければいけないため上記手法よりも労力と時間が必要となるためお薦めはできません。
APMを導入してアプリケーションの品質を改善しよう！（概要編）

New Relic APMをアプリケーションに導入することで、アプリケーションの健全性をリアルタイムで観測し、システム障害やユーザー体験の劣化につながるアプリケーションのパフォーマンスやエラーの原因特定と解決、改善に繋げることができます。

# APM とは
APM(Application Performance Monitoring)は、アプリケーションが想定通りのパフォーマンスを発揮しているかどうかを監視し、その改善に向けた原因の特定や、改修の迅速化を実現するためのプロセス、あるいはそのためのツールを指します。APMを導入することで、アプリケーションのパフォーマンス低下やエラーを検知し、その原因を素早く特定して対処することができるため、提供するサービスレベルの維持とユーザー体験の向上に繋げていくことができます。

# New Relic APM とは
New Relic APMは、アプリケーションの言語別に用意されているAPMエージェントをインストールすることで、アプリケーションのパフォーマンスデータを収集します。以下の主要な言語に対応したエージェントが用意されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/4f64701a-e74e-a133-5c95-33e1f6cd2f46.png)

各言語の代表的なフレームワークをサポートしており、アプリケーションのパフォーマンスデータを計測するコードをエージェントが自動的に計装することで、アプリケーションのパフォーマンスやエラーの発生状況などリアルタイムで観測できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/679597af-56dc-888f-dd7d-f80187da7c2a.png)

# どうやって導入するの？
APMエージェントのインストール方法は各言語で多少の違いはありますが、どの言語でもおおよそ以下の流れで簡単に導入することになります。

1. [インストール要件](https://docs.newrelic.com/jp/docs/new-relic-solutions/new-relic-one/install-configure/compatibility-requirements-new-relic-agents-products/?_gl=1*skbddj*_gcl_au*MjExMjUzMzg4NC4xNzMxMzc3ODcy*_ga*Mzc0MTY4NjAzLjE3MDgwNDU0Mzg.*_ga_R5EF3MCG7B*MTczMjI0NjgyOC42MjIuMS4xNzMyMjQ3MzQ3LjU1LjEuMTE2MzM0MzM0MA..)を確認
1. New Relic 画面上でガイドを受けながら、アプリケーションにAPMエージェントをインストール
1. アプリケーションを再起動し、トランザクションを発生させる
1. New Relic のAPMの画面上でデータを確認する

次回以降の記事でエージェントの導入の流れの詳細をご紹介します！

# その他
New Relicでは、**新しい機能やその活用方法**について、QiitaやXで発信しています！
**無料でアカウント作成**も可能なのでぜひお試しください！

:::note info
New Relic株式会社の[X(旧Twitter)](https://x.com/NewRelicJapan) や [Qiita OrganizationOrganization](https://qiita.com/organizations/newrelic)では、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::

:::note info
無料のアカウントで試してみよう！
[New Relic フリープランで始めるオブザーバビリティ！](https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa)
:::
Proj #001 キャンバスアプリで支払申請のフォームを作成するゾ～第2回 データソースを追加しよう～

https://qiita.com/Novskiiiiiiiiii/items/9a542ef49b00ba18b60c

さて、以下の状態では何もないまっさらなキャンバスでしかないので、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/cdcb32a3-b3ff-9701-6b13-f5c00ab670d8.png)

後続処理で連携させたいMicrosoft Lists（以下リスト）と連動させましょう。

「+ 挿入」から「編集フォーム」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/6ea87101-aba6-a70f-370e-0531e6a0f8c0.png)

コネクタから、SharePointを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/4ef38872-e6d4-83ec-4556-00ee41a5425f.png)

SharePointの接続が確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/89ec2191-d284-abc5-adc3-095424411e37.png)

連携したいMicorosoft ListsのあるSharePointサイトを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/5cc32d84-e208-db6d-4ce1-f64394996fc5.png)

サイトの中から接続したいリストにチェックを入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/61ed3cd1-7701-8e22-df2a-62161fea341d.png)

チェックを入れたら「接続」をクリックしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/37475aef-126f-ece0-7848-68846329cddd.png)

キャンバスアプリのデータソースとしてリストが連携されました。
一部のフィールドがデフォルトでアプリに表示されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/a7dd40dd-7982-8345-59d9-43364a8ca4a0.png)

次回は実際にフォームからリストにアイテムを新規追加していきます。

それではまた。

https://qiita.com/Novskiiiiiiiiii/items/e9aac700a479dfa0c393
～i.MX8で学ぶ～ 組み込みLinuxハンズオン・セミナを受講したよ

CQ出版にて開催の～i.MX8で学ぶ～組み込みLinuxハンズオン・セミナを受講しました。

https://interface.cqpub.co.jp/linux-hands-on/
# セミナー内容
ハンズオンセミナは以下のテーマでした。
- i.MX8 ULP×Yocto ProjectではじめてのBSPカスタマイズ
- Linuxデバイス・ドライバ開発入門
- Wi-Fiモジュールによるネットワーク拡張
- i.MX8ULP ではじめる画像認識AI
# 応募者多数・・・
ボード込みで1万円という格安なこともあり、抽選に落ち続けていていましたが、今回当選し受講できました。
# 開発ボードMaaXBoard 8ULP
使用する開発ボードは[MaaXBoard 8ULP](https://www.avnet.com/wps/portal/japan/manufacturers/nxp/maaxboard-8ulp/)になります。
MaaXBoard 8ULPはデュアルCortexA35（800 MHz）とCortexM33（216 MHz）を搭載したRaspberry Piフォームのシングルボードコンピュータになります。
プロセッサやメモリなどはSoMという小基板に集約されており、I/Oベースボードから各種I/O端子が使用できる構成になっています。
SoMはJetsonやRaspberry Pi Compute Moduleなど目にすることが多くなっています。
![MaaXBoard.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/c39bd4c3-16c4-72db-ff40-365f188eab31.jpeg)
MaaXBoard 8ULPは拡張端子としてMIPI CSIやMIPI DSIがありますが、Wi－Fi／Bluetooth、HDMIがありません。
更に、デュアルA35と決して高速なコアでは無い為、本来は、画像処理等には向かないSoCとなります。
# セミナーの様子

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/88693364-ab7a-db70-71c2-3c0c4526cc33.png)

# 講習内容
午前は無線LANの基礎知識から、セキュリティ、技適についての座学を受講し、午後からはドライバの基礎知識や開発、導入を学びました。
MaaXBoard 8ULPは有線LANのみ対応し、Wi-FiやBluetoothには対応していません。
サイレックス社のWi-Fiモジュール __SX-SDMAX__ を使用しWi-Fiを使用できるようにします。
https://www.silex.jp/products/wireless-module/sdio/sxsdmax
# 総評
この講習を受けることでデバイスドライバ周りの作りを知らないといけない事がわかっただけに、本セミナーは4回分を通して受講するべきなのではないか？と思い、改めて全回を受講したいなと思いました。
LINE WORKS Incoming Webhook でさくっとメッセージ送信

以下の３ステップで簡単にLINE WORKSへメッセージ送信できます

1. LINE WORKSで Incoming Webhook URLを作成する
2. Google Sheet に送信したいメッセージ内容を入力する
3. 送信ボタンを押す / またはGASのスケジュール設定で定期送信


## 1. LINE WORKS Incoming Webhookを発行

管理画面の「アプリ」からIncoming Webhookを追加します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/ae329898-7ef5-2360-d46b-aade21232420.png)

Botで「Incoming Webhook」を検索しトーク開始します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/4a95a6e8-6862-42d9-e89d-db075de767cb.png)

通知したいトークルームに、Incoming Webhook Botを招待します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/33c825ea-64f5-fa94-8f10-ff99b0b34a09.png)

次に、通知したいトークルームの「チャンネルID」をコピーします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/49a96470-c9d8-0768-1bab-5751f0112ac6.png)

チャンネルIDをコピー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/83a8a0db-c348-2f1a-7215-31f931842819.png)

以下のようなトークが来たら、「Webhookリスト」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/e50bc4f6-5cc5-9336-31b6-d8277d3899a8.png)

Webhookを追加して、チャンネルIDを貼りつけて「OK」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/50ec54b8-1419-9965-afe8-563b5f736599.png)

作成されたWebhook URLをコピーします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/ce931d40-9b7b-4b29-d85b-110c3e314e2e.png)


## 2. Google Sheetに送信内容を入力

以下のGoogle Sheet をコピーします
https://docs.google.com/spreadsheets/d/1UyQgumv1LS_g-RpPo7L57UdgiF2oYK5n1J0CNc0eRWE/copy

以下のようにSheetに送信内容を記載します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/d6db6c81-6069-33b3-88b1-0f04ffd93806.png)

**webhook URL：** 先ほどコピーしたWebhook URL
**タイトル：** 通知メッセージのタイトル
**テキスト：** 通知メッセージのテキスト
**ボタン表示有無：** リンクボタンを含める場合はTRUE, 含めない場合はFALSE
**ボタン表示テキスト：** リンクボタンに表示するテキスト
**遷移先URL：** リンクを押したら遷移する先のURL



## 3. 送信ボタン押す or GASのスケジュール設定で定期送信

シート上の送信ボタンを押すと、該当のトークルームへメッセージ送信されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/d7de7528-7307-e640-8fbd-a45a0c484aad.png)



定期自動送信したい場合は、Google Apps Scriptのトリガー設定で実行タイミングを時間主導にしてカスタマイズできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/ad75d217-6051-e226-e8d8-61e93856fd2d.png)

## 参考記事
Incoming Webhookの紹介記事 https://line-works.com/blog/solution/incoming-webhook-app/
LINE WORKS Developers Document https://developers.worksmobile.com/jp/docs/webhook