OmniAICreator/Qiita-1.07M huggingface dataset:
Charms による Elixir 低レベルプログラミングを Livebook 上で実行する -環境構築編-

## はじめに

:::note info
2024/12/5

Charms が 0.1.2 に更新され、プリコンパイル版の MLIR でインストールできるようになったため、コンテナ定義を変更しました

https://hex.pm/packages/charms/0.1.2

Thank you, Jackal!
:::

Charms は Elixir で「低レベルプログラミング」を 行うためのモジュールです

https://github.com/beaver-lodge/charms

低レベルプログラミングでは CPU やメモリといったハードウェアを詳細に操作できるため、処理速度の向上やメモリの最適化が期待できます

反面、コーディングに深い知識が要求され、知識不足ではバグを生む可能性が高くなります

通常、低レベルプログラミングは C やアセンブリで行いますが、それを Elixir でできるようにしたのが Charms です

本記事では、 Charms を使うための環境を Docker コンテナで構築する手順について説明します

## 実行環境

私の実行環境は以下のとおりです

- チップ: Apple M2
- メモリ: 24 GB
- OS: macOS Sequoia 15.1.1
- 仮想化プラットフォーム: [OrbStack](https://orbstack.dev/)
  - メモリ上限: 18 GB
  - CUP 上限: なし

~~OrbStack を使ったのが重要です~~

~~RancherDesktop ではどうしてもメモリ不足やストレージ不足でエラーが発生してしまいました~~

:::note info
LLVM のコンパイルが不要になったことで、 RancherDesktop でもコンテナがビルドできました
:::

## コンテナ定義

Livebook のコンテナをベースとして、 Charms の依存モジュールである Beaver の CONTRIBUTING.md を参考にしました

https://github.com/beaver-lodge/beaver/blob/main/CONTRIBUTING.md#development

Dockerfile は以下のとおりです

https://github.com/RyoWakabayashi/elixir-learning/blob/main/Dockerfile.charms

```dockerfile
FROM ghcr.io/livebook-dev/livebook:0.14.5

RUN apt-get upgrade -y \
  && apt-get update \
  && apt-get install --no-install-recommends -y \
    ninja-build \
    python3-pip \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*

# LLVM
COPY llvm-requirements.txt .

RUN python3 -m pip install --upgrade pip \
  && python3 -m pip install -r llvm-requirements.txt

ENV LLVM_CONFIG_PATH=/usr/local/lib/python3.10/dist-packages/mlir/bin/llvm-config

# Zig
RUN wget "https://ziglang.org/download/0.13.0/zig-linux-aarch64-0.13.0.tar.xz" -O "zig-linux.tar.xz" \
  && tar Jxvf "zig-linux.tar.xz" -C /usr/local \
  && mv /usr/local/zig-linux-aarch64-0.13.0 /usr/local/zig-linux \
  && rm "zig-linux.tar.xz"
ENV PATH=/usr/local/zig-linux:${PATH}

ENV LIVEBOOK_HOME=/home/livebook

COPY ./livebooks /home/livebook

CMD ["/app/bin/livebook", "start"]
```

llvm-requirements.txt

https://github.com/RyoWakabayashi/elixir-learning/blob/main/llvm-requirements.txt

```text
mlir==20.0.0.2024112701+fad5ed6e
--find-links https://github.com/makslevental/mlir-wheels/releases/expanded_assets/latest
```

~~Charms では LLVM 、　MLIR というフレームワークを利用しており、これらをビルドする必要があります~~

:::note info
プリコンパイル版の MLIR で動くようになりました
:::

Charms で利用している MLIR というフレームワークを pip でインストールします

https://mlir.llvm.org/

また、 Charms には Zig も必要なのでインストールします

現状ではバージョン 0.13.0 でないと動作しません

## 実行結果

コンテナをビルドして実行すると、 Livebook が起動します

```
...
Attaching to livebook_charms
livebook_charms  | [Livebook] Application running at http://localhost:8080/?token=xxx
```

URL をブラウザで開いてから、 Charms README の先頭にある `Run in Livebook` ボタンをクリックすると、 Charms のチュートリアルノートブックが実行できます

https://github.com/beaver-lodge/charms/

初回起動時はインストールに時間がかかりますが、気長に待ってください

ノートブックをエラーなく実行できれば、 Charms が正しくインストールできています

![スクリーンショット 2024-12-03 0.05.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/9c74e16f-da05-9f5f-b979-89b190cc8317.png)

詳細なコードの内容、実装例は次回に譲ります

## まとめ

~~LLVM のビルドにかなりのメモリと時間が必要になりますが、 Charms を Livebook から動かすことができました~~

最初は LLVM のビルドが必要で苦労しましたが、プリコンパイル版 MLIR が使えるようなったおかけで環境構築が楽になりました

次は Charms で色々実装してみたいと思います
ログ管理（連載第8回/25回）

# はじめに

システムやアプリケーションのログを管理することは、トラブルシューティングや監視において重要な役割を果たします。ここでは、`tail`、`less`、`journalctl` の基本的な使い方を紹介します。

# コマンド説明
#### `tail` - ファイルの末尾を表示

`tail` コマンドは、ファイルの末尾部分を表示します。ログファイルの最新のエントリを確認するのに便利です。

***主なオプション***
-f : ファイルが更新されるたびに新しい行を表示（フォロー）
-n : 表示する行数を指定

```powershell
# 使い方
tail [オプション] ファイル名
# このコマンドは、システムログファイル /var/log/syslog をフォローし、
# リアルタイムで新しいログエントリを表示します。
tail -f /var/log/syslog
```
#### `less` - 大きなファイルの閲覧
`less` コマンドは、大きなテキストファイルをページごとに表示し、スクロールして内容を閲覧するのに便利です。`less` は `more` コマンドの強化版で、効率的なナビゲーション機能を提供します。

***主な操作方法***
Space : 次のページに進む
b : 前のページに戻る
/ : 検索
q : 終了

```powershell
# 使い方
less ファイル名
# このコマンドは、システムログファイル /var/log/syslog をページ単位で表示します。
less /var/log/syslog
```

#### `journalctl` - システムジャーナルの表示
`journalctl` コマンドは、systemd によって管理されるシステムログを表示します。強力なフィルタリング機能を備えており、ログの詳細な分析が可能です。

***主なオプション***
-e : 最新のログエントリを表示
-f : リアルタイムでログをフォロー
-u : 特定のユニットに関連するログを表示

```powershell
# システムログファイル /var/log/syslog をページ単位で表示します。
journalctl [オプション]
# システムジャーナルのログをリアルタイムでフォローします。
journalctl -f
# 特定の期間のログを表示
# このコマンドは、2023年1月1日から2023年1月31日までのログを表示します。
journalctl --since "2023-01-01" --until "2023-01-31"
# 特定のサービスのログを確認
# このコマンドは、apache2 サービスに関連するログを表示します。
journalctl -u apache2.service

# システムログのエラーメッセージを確認（補足）
# このコマンドは、システムログファイル内の "error" メッセージを検索して表示します。
grep "error" /var/log/syslog
```
# おわりに
ログ管理の基本的なコマンドを使用することで、システムの問題を迅速に発見し、効果的に対応することができます。
次の記事では、ディスク使用量の確認について説明します。

https://qiita.com/yu1016/items/6ff0ca8d99cfbb38f723

一覧

https://qiita.com/advent-calendar/2024/pig
Python TypedDict 雑記

Python の [typing.TypedDict](https://docs.python.org/ja/3/library/typing.html#typing.TypedDict) の雑記。どういったものか、どう使うものなのかのメモ。

# TypedDict の概要
TypedDict とは「キーが固定されていて、それに対応した値の型が制限されている dict」を宣言するためのものです。呼び出したときは dict と同じくただ dict インスタンスを作るという挙動をします。型チェッカーにのみ影響をおよぼします。

たとえば、次のコード a.py を mypy で検査すると 9 行目の変数 b への辞書のバインドが想定外であろうということを検知します。いっぽう、 Python スクリプトとしてだけみるとおかしなところはないため実行が可能です。そして Point2D と dict を比較する assert 文も無事に通過します。

```python:a.py
from typing import TypedDict

class Point2D(TypedDict):
    x: int
    y: int
    label: str

a: Point2D = {'x': 1, 'y': 2, 'label': 'good'}  # OK
b: Point2D = {'z': 3, 'label': 'bad'}           # Fails type check

assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first')
```

```
> mypy a.py
a.py:9: error: Missing keys ("x", "y") for TypedDict "Point2D"  [typeddict-item]
a.py:9: error: Extra key "z" for TypedDict "Point2D"  [typeddict-unknown-key]
Found 2 errors in 1 file (checked 1 source file)
> python a.py
>
```


# TypedDict の詳細
## NotRequired
デフォルトではキーの過不足は型チェッカー上でのエラーとなります。しかし、あってもなくてもよいキーを定義できると便利なことがあるものまた事実です。これを設定するには　[typing.NotRequired](https://docs.python.org/ja/3/library/typing.html#typing.NotRequired) をもちいます。

```python
from typing import TypedDict, NotRequired

class Language(TypedDict):
    name: str
    year: NotRequired[int]

Language(name='C', year=1972)  # OK
Language(name='B')             # OK
c: Language = {'name': 'C', 'year': 1972}  # OK
b: Language = {'name': 'B'}                # OK 
```

## __total__ と Required
非必須のキーのほうが多く、いちいち typing.NotRequired を設定するのが手間である場合、必須・非必須のデフォルトを反転させることができます。キーワード引数 total を用います。このとき必須なキーを定義するのには [typing.Required](https://docs.python.org/ja/3/library/typing.html#typing.Required) を用います。この設定が行われている場合、 \_\_total\_\_ クラス属性が False となります。

```python
from typing import TypedDict, Required

class Language(TypedDict, total=False):
    name: Required[str]
    year: int

assert Language.__total__ is False
Language(name='C', year=1972)  # OK
Language(name='B')             # OK
c: Language = {'name': 'C', 'year': 1972}  # OK
b: Language = {'name': 'B'}                # OK 
```

## ReadOnly
dict インスタンス作成後に値が変更されることを想定していない、つまり読み込み専用のキーであるという設定をすることができます。 [typing.ReadOnly](https://docs.python.org/ja/3/library/typing.html#typing.ReadOnly) を用います。

```python
from typing import TypedDict, NotRequired, ReadOnly

class Language(TypedDict):
    name: ReadOnly[str]
    year: ReadOnly[NotRequired[int]]

b: Language = {'name': 'B'}
b['name'] = 'C'  # Fails type check
```

## Introspection
定義した TypedDict の設定がどのようになっているかを確認することができます。どのキーが必須なのか非必須なのか、読み込み専用なのか変更可能なのかを知ることができるようになっています。それらキーの名前は \_\_required_keys\_\_, \_\_optional_keys\_\_, \_\_readonly_keys\_\_, \_\_mutable_keys\_\_ に frozenset として収まっています。

```python
# それぞれ、 frozenset[str] が得られる。
Language.__required_keys__  # 必須
Language.__optional_keys__  # 非必須
Language.__readonly_keys__  # 読み込み専用
Language.__mutable_keys__  # 変更可能
```

# 参考

https://docs.python.org/ja/3.13/library/typing.html#typing.TypedDict

https://peps.python.org/pep-0589/

https://peps.python.org/pep-0655/

https://peps.python.org/pep-0705/
Reactで初めてアプリを作成してみた

# はじめに
今回はReactの基礎をインプット後に、アウトプットとして**簡易的な学習記録アプリ**を作成しました。

![画面収録 2024-12-01 午後3.26.52.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775597/811fb00e-ebe0-59e4-878a-604f4a9c6896.gif)



# 以前と比べてどのように成長したのか
* Reactの基礎を学べた

* Reactで簡易的ではあるけどアプリ作成ができた




# 大変だったところや工夫したところ
* 大変だったところ
いざ、アプリ作成をしようと思ってもインプットしたことが思い出せず、実装したい機能を実装するのにどうするか調べることが多かったです。
　
* 工夫したところ
インプット教材を見直したり、Qiitaでググったり、幸いにもReactの公式ドキュメントが日本語対応しているので公式ドキュメントで調べたりしていました。


# 気づき
インプットしてる時は理解してるつもりではあるけど、いざアウトプットとなると手を動かせず、理解できていない自分に気づけました。
　
なので、今回のアプリ作成で実装した機能(関数)を反復練習で理解を深めていこうと思います。
　
また、実装したい機能を実装出来た時は正直うれしかったです。



# さいごに
初めてReactで簡易的なアプリ作成をしてみましたが、理解しているつもりでもいざアウトプットとなると全然手を動かせなかったので、反復練習で今回やったことを定着させていきたいと思います。




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

https://projisou.jp
Git LFS 入門と落とし穴: 大きなファイルに悩まされないバージョン管理

Gitは大きなファイルの取り扱いは苦手です。
リポジトリサイズが肥大化し、クローンやプッシュに時間がかかる原因になります。
そこで登場するのが **Git Large File Storage (LFS)** です。

Git LFSは、大きなファイルをGitリポジトリに直接保存する代わり、
軽量なポインタを保存し、実際のファイルは別の場所に格納する仕組みです。
これにより、リポジトリサイズを小さく保ち、パフォーマンスを向上させることができます。

## Git LFS の基本的な使い方

### インストール
まずはGit LFSをインストールします。
方法はOSによって異なりますが、多くの場合パッケージマネージャでインストールできます。
例として、macOSではHomebrewを使って以下のようにインストールします。

```bash
git install git-lfs
```

### リポジトリでの有効化
GitリポジトリでGit LFSを有効化します。

   ```bash
   git lfs install
   ```

### 追跡対象ファイルの指定
どの種類のファイルをLFSで管理するかを指定します。例えば、`.psd` ファイルをLFSで管理する場合：

```bash
git lfs track "*.psd"
```
これにより、`.gitattributes` ファイルに設定が記述されます。このファイルもリポジトリで管理する必要があります。

### ファイルの追加とコミット
通常のGitワークフローと同様に、ファイルをステージング、コミット、プッシュします。

   ```bash
   git add .gitattributes
   git add your-large-file.psd
   git commit -m "Add large PSD file using LFS"
   git push origin main 
   ```

## 落とし穴: 事後登録の悲劇

先日、まさにこのGit LFSでハマってしまいました。
大きなファイルを既にコミットしてしまった後に、LFSに登録しようとしたのです。

具体的には、以下のような流れでした。

1. 大きな動画ファイル `video.mp4` を普通にGitに追加・コミット・プッシュ。
2. リポジトリが大きくなりすぎて問題が発生したため、Git LFSを導入することに。
3. `git lfs track "*.mp4"` を実行して、MP4ファイルをLFSで追跡するように設定。
4. `video.mp4` を再度 `git add`、コミット、プッシュしようとしたらエラーが発生！

なぜエラーになったのか？ それは、**既にGitの履歴に記録されている大きなファイルは、後からLFSに登録しても、LFSの仕組みで管理されるようにはならない** からです。  LFSは、`git lfs track` コマンド実行 **以降** に追加されるファイルに対してのみ有効なのです。

## 解決策: ファイルのマイグレーション

この問題を解決するには、`git lfs migrate` コマンドを使ってファイルをマイグレーションする必要があります。 具体的には以下の手順で解決しました。

1. 対象のファイルをLFSで管理するように設定: `git lfs track "*.mp4"`
2. 履歴を書き換えて、過去のコミットから大きなファイルをLFSポインタに置き換える:  `git lfs migrate import --include="*.mp4"`
3. リモートリポジトリに強制プッシュ: `git push --force-with-lease origin main`  (※ 強制プッシュは注意して使用してください！)

## まとめ

Git LFSは大きなファイルを扱う際に非常に便利ですが、既にコミットしたファイルを事後的にLFSで管理しようとする場合には注意が必要です。`git lfs migrate` コマンドを適切に使い、過去のコミットを修正することで、リポジトリを健全な状態に保ちましょう。


## 参考文献

* [Git Large File Storage](https://git-lfs.github.com/)
* [Git LFSの使用方法 – Backlog ヘルプセンター](https://support-ja.backlog.com/hc/ja/articles/360038329474-Git-LFS%E3%81%AE%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95)
* [Git Large File Storageについて - GitHub Docs](https://docs.github.com/ja/repositories/working-with-files/managing-large-files/about-git-large-file-storage)
* [Git 大容量ファイル・ストレージ(LFS) | GitLab](https://gitlab-docs.creationline.com/ee/topics/git/lfs/)
* [Git LFS をちょっと詳しく #GitLFS - Qiita](https://qiita.com/ikmski/items/5cc8b8832336b8d85429)
LTのタイトルをつけるときのテクニック

2024年最後のLT会があちこちで開催されてる時期ですね。LT好きです。
どうせなら開催告知のタイミングやタイトルコールで「おっ」とわくわくしてほしいので、タイトルちゃんと考えるときのテクをいくつか。
社内では「今日のLT」とかいう雑なタイトルつけがちなんですが…ネ！

サンプルは実際にやったことのあるLTと、今この記事を書いてるときに思いついたネタで書いてます。

# 名言、名作タイトル、ミームをもじる

- 習慣に気をつけなさい。それはいつか暗黙知になるから。
- エンジニアは経営者の夢を見るか？
- ぼくのかんがえたさいきょうのユーザー管理テーブル設計
- 技術的負債をのぞく時、技術的負債もまたこちらをのぞいているのだ

いちばんやるかも。印象も強い。流行りのミームがあると乗せやすい。
マインドセットとかチーミング系LTのときは特に名言や格言一覧眺めて良い感じのないかな〜って考えてます。
なにかの作品タイトルをもじるなら、スライドでタイトルデザインも合わせるとめっちゃアツい。雑にコラしてもおもろい。

# 問いかけ

- そのコードレビュー、価値を作れてますか
- 思考し、自走するチームをどう作るか

同じことで悩んでるひとが「おっ」と思って聞きたくなる印象。

# {聞き終わったあとどうなるか}！ {LTのテーマ}！

- もう迷わない！レガシーコードの歩き方
- 完全に理解した！PDFと康煕部首
- これができたら一人前！若手のときに学ぶべき技術5選
- もうダサいって言わせない！！実務に基づいたきれいな画面のつくりかた

本のタイトルとかチラシの見出しでもよく見るかも。
シンプルなタイトルに前半の「{聞き終わったあとどうなるか}！」を入れるだけでお気軽に勢いが出るので良い。

# ひとひねりが思いつかないときのド安定タイトル

- 〜した話
- 〜する方法
- 〜を考える
- 主題　〜副題〜

言いたいこと全部詰められるので便利。
「〇〇が□□だったから△△した話」ってタイトルは語呂のテンポが良いしわかりやすいから好きです。

# 実際はやらない

考えるときのテクとして手札にはあるけどやらない系です

## なろう

- 手入力がめんどくさかったからちょっとだけスクリプト書いたら神扱いされて全社のシフト表管理を任されました
- エキスパートは諦めました！かわりにマネジメントで最強になろうと思います！

ベースが俺TUEEEなのでこの業界で使うのはなんかとっても恥ずかしくてハードル高い。HRTの精神に反しがち。
降りかかった災いが己や仲間の過去の過ちだったり、そのときの最適解だったりもするのでざまあ展開も難しいんですよね。　なんの話？

## 一句詠む

- キャリアパスいつも悩んで先送り
- レビュア心の一句　〜その変数わからないだろどう見ても　名前はいつもわかりやすくあれ〜

タイトルコールで盛り上がらないかもな〜とおもって没。
575で一句詠んで77の返歌詠むLT大会やりたいかもしれない。

## ライムを刻む

韻を踏むってやつ。慣れたらできるって言うけどサンプルすらまじで出てこん。手札とは？
やりたい。
イベントストーミングを実施してみて得た知見と感想

## はじめに
この記事は[アイレット株式会社Advent Calendar 2024](https://qiita.com/advent-calendar/2024/iret) 11日目の記事です。

本記事では私が半年ほど業務でイベントストーミングを実践してみて感じたことを記していきます。


## そもそもイベントストーミングとは？
イベントストーミングとはソフトウェア開発をする上で、ビジネスプロセスやドメイン(業務、業務領域)の知識を業務に精通した方々(ドメインエキスパート)と共に議論し、その流れを理解しやすい形にモデル化する手法で、主にドメイン駆動設計(DDD)での開発を行う上で利用されます。

後述する付箋紙を使った簡単な表記法を利用することで、参加者のロールに依存せず活発なディスカッションを行われることが期待されています。

## 取り扱うモデルの表記法
![event_storming.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953920/61d61a8b-befc-c023-9e9a-3ffb4e32a41a.png)

イベントストーミングではホワイトボードやmiroのような大きなボード利用し、カラフルな付箋紙を貼りながらモデルを表現していきます。それぞれの色には意味付けがされており、ここでは登場する各モデルの紹介をします。

### ドメインイベント
業務ので起きる出来事を指します。ドメインイベントは過去分詞形で記します。
ex) 在庫が増えた

### コマンド
業務で行うリクエストのことを指します。コマンドは動詞で記します。
ex) 本を発注する

### アクター
コマンドをリクエストする人やシステムを指します。アクターは名詞で記します。
ex) 書店の店員

### ポリシー
イベントに対して反応し、次のリクエストを促すモノを指します。
アクターからではなく暗黙的にアクションが起きている場合はポリシーに該当します。
ex) 在庫が減ってきたことで起動する通知、商品入荷時の商品番号の採番

### 外部システム
ドメインの外側にある管理対象外のソフトウェアや組織を指します。
ex) 在庫管理票出力システム

### 集約
コマンドによって処理される概念のことを指します。集約は名詞で記します。
ex) 在庫

### ビューモデル
アクションを実行するために必要なモノを指します。ビューモデルは名詞で記します。
ex) 在庫管理票


## 実施の流れ

#### 1. ドメインイベントを洗い出す

#### 2. 時系列にドメインイベントを並び替える

#### 3. ドメインイベントを元に他の要素を洗いだす

#### 4. 集約を炙り出す


実施の中で表記揺れのある用語がある場合には、認識のズレを生まないようにドメイン内でユビキタス言語と呼ばれる一意の用語を設けて会話するようにします。また、イベントストーミング実施中に疑問や不明点、不確実な要素等が判明した場合はどんどん付箋にて記載していくことで参加者内の認識のすり合わせを進めていきます。


## 実際にやってみて感じたポイント
### 良かった点😄

#### ・簡単な表記法を用いて会話ができるので参加者が特定のモデリング技法に対する知識を持っていなくても実施できた
最初は各モデルの概念を理解するためのハードルが高かったので、誰が(アクター)何を行ったことで(コマンド)何が起きるのか(ドメインイベント)くらいの粒度から始めましたが、結果としては概要を掴む上で効果的に働きました。

#### ・開発者とドメインエキスパート間の用語や認識のズレを減らすことができるためコミュニケーションを円滑に進めることができる
イベントストーミング実施後もユビキタス言語とイベントストーミング図を元に会話ができるので便利でした。

#### ・洗い出されたドメインモデルを元に直感的に実装を行いやすい
一方でイベントストーミングで洗い出されたイベントをそのまま記録し、永続化しようとするとCQRS/イベントソーシング前提の設計になるため工夫は必要かなと思います。

#### ・参加者全員が共通認識を持った状態で議論が進んでいくので不明点の洗い出しが行いやすい

#### ・業務の流れをドメインエキスパートと共に整理できるので開発者はビジネスプロセス全体を把握した上で開発を行える

#### ・ドメインエキスパートが参画する機会を得ることができるので、コミュニケーションを行うきっかけにもなりやすい

### 苦労した点🤔
#### ・業務フロー上で条件分岐が複雑になった場合、視覚的に分かりづらくなる
ユースケースごとにイベントを分けて記載することで視覚的にはわかりやすくなりますが、似たような図が量産されるのでメンテナンス面でも苦労しました。
個人的な感想ですが、条件分岐が多くなることが見えているのであれば、その部分に関してはイベントストーミングで全てを表現しようとせずに他の形式で整理するという選択肢も取れると良いのかなと思いました。

#### ・実施には時間がかかる
実際に0ベースでイベントストーミングを行おうとするとそれなりの時間を要します。
イベントストーミングの性質上、参加者は多くなるのでスケジュールの確保が第1課題でした。
また、参加者それぞれの情報共有や認識齟齬解消をしながら行うので、議論が発散しすぎないようにファシリテーションする能力が求められるようにも感じました。


## さいごに
本記事では私が業務にてイベントストーミングを実施した上で得た知見や感想を記していきました。
教科書的なやり方ではない部分もあるかとは思いますが、初めて実施される方に少しでも雰囲気が伝われば幸いです。今回はここまで。
Deno の LTS バージョンが始まりました

使用する OS や、言語、フレームワークなどを選ぶ際に、どのバージョンを選ぶかは、技術選定において大事なトピックの一つです。

大抵のメジャーな、OS・言語・フレームワーク等では、Long Term Support (LTS) バージョンが定義されていて、特にこだわりがないユーザーは「最新の LTS バージョンを使う」ことがベストプラクティスとされている事が多いと思います。

これまで [Deno](https://deno.com/) では、どのバージョンがいつまでサポートされているのか特に厳密に議論されておらず曖昧な状態になっていましたが、Deno 2.0 リリースのタイミングで、Deno の LTS のプランが以下のように定義されました。

![lts-schedule.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13825/46cefcf7-d634-787d-4e35-f3d85b464360.png)

Deno は6週間毎にマイナーバージョンがリリースされるのですが、2.1 を始めとして、5マイナーバージョン(約7ヶ月)毎に、LTS サポートがされるバージョンとなります。具体的には 2.1, 2.6, 2.11, ... が LTS となります。

そして、先月 Deno 2.1 がリリースされ、このバージョンが Deno の最初の LTS バージョンとなりました。2.1.x 系には移行6ヶ月間、新機能は乗らずバグ修正が継続的に当てられる運用になります。

企業で Deno を使う場合など、より安定性が求められる場面では最新バージョンよりも LTS バージョンの使用を検討しても良いかもしれません。

Happy stable engineering!
ABC382回答メモ

# 0.はじめに
　先週はまさかの金曜開催で参加できず、１週ぶりの参戦。
　さらに二泊三日の旅行から帰宅して２時間後の参戦と
　ヘロヘロの状態。
　と、言い訳しながらで、ABC問題を解くのがやっとでした。
　C問題も解けたとはいえ、ダメもとで時間かかりそうな手法を取ったり
　２分探索の大小比較を誤ったりして３回失敗し、タイムロス。
　レートは-8と下がってしまいました。


# 1.A - Daily Cookie
　制約により、@がD以上ある事がわかっているので
　S内の”.”を数え、そこにDを加えることで空き箱の数がわかりました。

　https://atcoder.jp/contests/abc382/submissions/60303224

# 2.B - Daily Cookie 2
　Aよりちょっと難易度の高い問題。
　とはいえ、B問題。
　Sをリスト化して読み込み、後ろから見ていき、D枚分”@”を”.”に
　変換し、最後にSを結合して出力。

　https://atcoder.jp/contests/abc382/submissions/60308872

# 3.C - Kaiten Sushi
　なかなかてこずった問題。
　単純にBの寿司をAの人の頭から食べられるか
　シミュレーションした場合、TLE18と半分以上時間切れ。
　いい感じの表を作り、食べられる人を二分探索する方針を決める。

　【考え方】
　　・美食度１の人が先頭にいたら全部この人が食べる
　　・同じ美食度の人がいたら前に座っている人が食べる
　　といったことから、以下の方針を取る。
　　1)Aのリストを元に、美食度毎の先頭の人を辞書D(キー：美食度、値：順番)に格納
　　2)Dを元に、リストL（L[i]＝[美食度,順番]、美食度の昇順)
　　3)Lを先頭から見ていき、L[i][1]に、L[i][1]とL[i-1][1]の小さいほうをセットする
　　　（美食度5の前に、美食度1の人がいた場合、先に食べられてしまう為）
　　　リストLには、美食度毎に何番目の人が食べるかがセットされる
　　4)リストBを先頭から見ていき、2分探索で、B[i]以上の美食度の料理を食べる人を
　　　検索し、その値を出力
　2分探索による時間短縮のお手本のような問題でした。
　と思ったら、解説を見たらリストLを美食度毎につくれば2分探索いらない事に気づき
　たしかにーとなりました。

　https://atcoder.jp/contests/abc382/submissions/60342216


以上
TypeScriptのデバッグ環境構築手順

# はじめに
TypeScriptの開発環境構築手順は多く見られるのですが、
デバッグ環境構築手順については意外と見つからなかったので、
記事を作成しました。

初めての投稿になりますので、至らない点はあるかも知れませんが、
その点ご了承頂ければと思います。

# 開発環境の構築
## Node.jsのインストール
Node.jsはJavaScriptをサーバサイドで動かすために必要なソフトウェアです。
TypeScriptコンパイラを動かすのにNode.jsが必要になるので最初にインストールします。
[こちら](https://nodejs.org/en/)からインストーラをダウンロードしてインストールしてください。

## プロジェクトフォルダの初期化
まずはプロジェクトフォルダを作成して`npm init`コマンドでNode.jsを初期化しましょう。
`-y`オプションはすべてのデフォルト設定で`package.json`を生成します。
```
$ mkdir typescript-sample
$ cd typescript-sample
$ npm init -y
```

## TypeScriptとts-nodeのインストール
ここでは`TypeScript`と`ts-node`をローカル環境にインストールします。

`ts-node`はTypeScriptファイルを直接実行できるように、
実行時にコードをJavaScriptにトランスパイルしてから実行します。

つまり、スクリプトを実行する際に、
事前に`tsc`コマンドでコンパイルしてから実行する必要はないわけです。

```bash
$ npm install typescript ts-node
```

## TypeScript設定ファイルの初期化
TypeScriptの設定ファイルを作成します。
以下のコマンド実行後に`tsconfig.json`が作成されます。
```bash
$ npx tsc --init
```

## サンプルプログラムの実行
動作確認のためにサンプルプログラムを実行してみましょう。

```typescript:sample.ts
const msg: string = "Hello, World!";
console.log(msg);
```
サンプルプログラムが用意できたらスクリプトを実行しましょう。
以下のように結果が表示されたら成功です。

```bash
$ node_modules/.bin/ts-node sample.ts
Hello, World!
```

# デバッグ環境の構築
## launch.jsonの作成
ここからはデバッグ環境の構築手順になります。
まずはデバッグする前に設定ファイル(launch.json)を作成します。
`vscode`を開き以下の画像を参考に`launch.json`を作成してください。

![iScreen Shoter - Code - 241202175540.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947973/2c949e13-4354-7ff8-6e0f-9f26fdd95a2e.jpeg)
![iScreen Shoter - Code - 241202175921.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947973/408d3b71-4e79-f8f6-564f-bfb626ef0691.jpeg)

# launch.jsonの編集
`launch.json`を開き以下のように編集してください。
```jsonc
{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "node",
            "request": "launch",
            "name": "Launch Program",
            "skipFiles": [
                "<node_internals>/**"
            ],
            "program": "${file}",
            // -----ここから追加------
            "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/ts-node",
            "args": [
                "--transpile-only",
                "--respawn",
                "--project",
                "tsconfig.json"
            ],
            // -----ここまで---------
        }
    ]
}
```

# デバッグの試行
サンプルプログラムにブレークポイントを貼り、`F5`でデバッグしてみましょう。
以下のようにブレークポイントで止まれば成功です。
![iScreen Shoter - Code - 241202180519.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947973/a837fd3d-047b-1b09-de37-f32b55389c6e.jpeg)
[LinkedIn]SEなら登録してみない？

# はじめに
Qiita Advent Calendar 17日目です。
継続は力なりです。
意外と25記事書くのはきついですが、文章構成などを考えることができるようになってきた気がします。
記事力が上がったような気がします。

# LinkedInを知っていますか？
https://www.linkedin.com/

LinkedInはビジネス型SNSとして広く知られています。基本的に「フィード」と呼ばれるタイムラインのような機能では、様々な企業の投稿や人材のポジション募集が多く流れています。

また、キャリアや資格をプロフィールに記載することで、転職エージェントから直接メッセージを受け取ることができます。メッセージが大量に来ることは少なく、嫌なメッセージに対してはブロック機能もあるため、非常に利用しやすいです。

さらに、LinkedInは様々な資格を一つのサイトに集める目的としても利用できます。例えば、Microsoft、Oracle、AWSなどの資格を自分のアカウントに集めることができます。

LinkedInは、ビジネスネットワーキングやキャリアの発展に非常に役立つツールです。企業の最新情報を得たり、業界のトレンドを把握したりするのにも便利です。また、プロフェッショナルなコミュニティに参加することで、同じ業界の専門家とつながり、知識や経験を共有することができます。

# 使うメリット
・求人がダイレクトに来るため、企業側とのミスマッチもあまり起きない。
・職務経歴書のような機能もしているため、わざわざ職務経歴書を新たに作成しなくてよい。
・情報集めとして様々な人と交流することができる
・自分の行きたい会社のOBやOGと交流することができる。


# 私が実際に感じたメリット
・インタビューなどで、Amazonギフト券をもらえた。
・普段知らない企業について知ることができた。
2024年12月 AIOps 定点観測

# 概要
AIOps の動向や学習のため、Google で AIOps を検索した結果を記録している記事です。

# 2024年12月2日の検索結果 (リスティング広告)

![スクリーンショット 2024-12-02 174747.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/f1161fa6-fa8c-35c6-b746-8843f0cc9c29.png)

* Dynatrace
* オージス総研
* Splunk

今月は Dynatrace が先月に続き TOP で、2番目にオージス総研、3番目に Splunk です。

先月の結果はこちら --> [2024年11月 AIOps 定点観測](https://qiita.com/mkodera/items/bd22adb5598d1f47751e)

# 2024年12月2日の検索結果 (広告以外)

![スクリーンショット 2024-12-02 174814.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/040519f6-8de2-7f78-e499-deb19e5b1205.png)

* Splunk
* AWS
* IBM
* 日立ソリューションズ・クリエイト

今月は Splunk が TOP で、AWS と IBM が続いています。日立ソリューションズ・クリエイトが初登場です。

先月の結果はこちら --> [2024年11月 AIOps 定点観測](https://qiita.com/mkodera/items/bd22adb5598d1f47751e)
学習機能付き生成AIのDiscord Botを作った話

---

#### **はじめに**
AI技術の進化とともに、生成AIを活用したチャットボットの需要が増えています。今回、私は学習機能を持つDiscord Botを開発しました。このボットは、ユーザーが登録した情報を学習し、自然な会話で回答を返します。また、生成AIとして **Gemini-1.5-Flash** を活用し、柔軟で魅力的な応答を実現しました。

この記事では、このプロジェクトの技術スタックや開発の工夫、直面した課題について共有します。

---

#### **使った技術スタック**

| 技術         | 内容                                    |
|--------------|----------------------------------------|
| **Node.js**  | サーバーサイドの基盤として採用。          |
| **Discord.js** | Discord Botのインターフェースを実現。    |
| **TypeScript** | 型安全性を確保し、コードの保守性を向上。 |
| **Prisma**    | データベースORMとして採用し、MySQLを操作。|
| **MySQL**     | 学習データを保存するデータベース。       |
| **Gemini-1.5-Flash** | 生成AIとして採用。柔軟で高品質な応答を提供。 |
| **Fuse.js**   | 質問と学習データをマッチングするためのあいまい検索。|

---

#### **主な機能**

1. **学習機能**
   - `!l 質問|答え` コマンドで、ユーザーが質問と答えのペアを登録。
   - データはMySQLデータベースに保存。

2. **質問応答機能**
   - `!q 質問` コマンドで、登録されたデータやAI生成応答を利用。
   - Fuse.jsを使った類似度検索で、完全一致しない質問にも柔軟に対応。

3. **生成AI機能**
   - 学習データが見つからない場合、Gemini-1.5-Flashを呼び出し、回答を生成。

---

#### **Gemini-1.5-Flashを使った理由**

Gemini-Proでは、ギャンブル関連の質問がSAFETY制約に引っかかることが多く、柔軟性に欠ける場面がありました。一方で、**Gemini-1.5-Flash** はSAFETYチェックが緩やかで、特定のトピックにも対応可能でした。

```typescript
const model = genAI.getGenerativeModel({ model: 'gemini-1.5-flash' });
const prompt = `
  以下の質問に簡潔かつ正確に回答してください。
  質問: "${input}"
`;
const result = await model.generateContent(prompt);
```

---

#### **苦労したこと**

1. **Gemini-ProのSAFETY制約**
   - パチスロやギャンブルに関する質問がSAFETY制約により応答拒否されました。
   - **対応**: 規制が緩やかだったGemini-1.5-Flashを採用。

2. **質問の完全一致問題**
   - 登録した質問が完全一致しないとデータベースから答えを取得できない問題がありました。
   - **対応**: Fuse.jsを使い、学習済みデータとの類似度検索を実装しました。

3. **学習データとAI生成の切り分け**
   - ユーザーの意図を的確に把握し、学習データが存在する場合はそれを優先的に使用。
   - **対応**: データベース検索と生成AI呼び出しを連携。

---

#### **工夫したこと**


2. **類似度検索の導入**
   - Fuse.jsを使い、曖昧な質問でも学習済みデータに基づく応答を返す設計。

```typescript
const fuse = new Fuse(learnedQuestions, {
  keys: ['question'],
  threshold: 0.4,
});
const result = fuse.search(question);
```

3. **エラーハンドリングの強化**
   - Gemini APIやデータベースエラー時の詳細なログ出力を追加。
   - ユーザーには明確なエラーメッセージを返すように対応。

---

#### **完成したボットの動作例**

1. **学習**
   ```plaintext
   !l パチンコやスロットにはまる人|ぎゃんちゅう
   ```
   - 質問「パチンコやスロットにはまる人」と回答「ぎゃんちゅう」を登録。

2. **質問**
   ```plaintext
   !q ぱちんこにはまる人をなんていう？
   ```
   - 類似検索を行い、登録された回答「ぎゃんちゅう」を返します。

3. **生成AI**
   - 学習データが見つからない場合、Geminiが質問内容に基づいて回答を生成。

---

#### **まとめ**

今回のプロジェクトでは、学習データと生成AIを組み合わせ、柔軟な回答を可能にするDiscord Botを開発しました。特に、Fuse.jsによる類似度検索やGemini-1.5-Flashを活用した生成AI機能は、ギャンブル関連の質問にも適切に対応できる仕組みを提供します。

今後は、以下の改善を検討しています：
- ユーザーインターフェース（フロントエンド）の構築。
- 学習内容の可視化や編集機能の追加。
- 他の生成AIモデル（例: GPT-4）の統合。

---

#### **参考**

- [Discord.js Documentation](https://discord.js.org/)
- [Prisma Documentation](https://www.prisma.io/docs/)
- [Gemini API Documentation](https://cloud.google.com/gemini)
- [誰でも作れる！Discord Bot（基礎編）](https://note.com/exteoi/n/nf1c37cb26c41)
プロセス管理（連載第7回/25回）

# はじめに

プロセス管理は、システムのパフォーマンスを維持し、効率的にリソースを使用するために不可欠です。ここでは、`ps`、`kill`、`nice`、`renice` の基本的な使い方を紹介します。

# コマンド説明
#### `ps` - プロセスの表示
`ps` コマンドは、現在実行中のプロセスの情報を表示します。

***主なオプション***
-e : 全てのプロセスを表示
-f : 完全な形式で表示
-u : 特定のユーザーのプロセスを表示

```powershell
# 例
ps [オプション]
# 全てのプロセスを完全な形式で表示します。
ps -ef
# 特定のユーザーのプロセスを表示
# このコマンドは、username のプロセスを表示します。
ps -u username
```

#### `kill` - プロセスの終了
`kill` コマンドは、指定したプロセスにシグナルを送信して終了させます。通常はシグナル 9（SIGKILL）を使用します。

***主なオプション***
-9 : プロセスを強制終了（SIGKILL）

```powershell
# 例
kill [シグナル] PID
# プロセスID 12345 のプロセスを強制終了します。
kill -9 12345
# プロセスを終了する
# このコマンドは、プロセスID 12345 に終了シグナル（SIGTERM）を送信します。
kill -15 12345
```

#### `nice` - プロセスの優先度設定
`nice` コマンドは、指定したコマンドを特定の優先度で実行します。優先度は -20（最高優先度）から 19（最低優先度）までの範囲です。

```powershell
# 例
nice -n [優先度] コマンド
# mycommand を優先度 10 で実行します。
nice -n 10 mycommand
# 特定の優先度でコマンドを実行
# このコマンドは、mycommand を高優先度で実行します。
nice -n -5 mycommand
```

#### `renice` - 実行中のプロセスの優先度変更
`renice` コマンドは、実行中のプロセスの優先度を変更します。

```powershell
# 使い方
renice [優先度] -p PID    
# 例：プロセスID 12345 のプロセスの優先度を 5 に変更します。
renice 5 -p 12345
# 実行中のプロセスの優先度を変更
# このコマンドは、プロセスID 6789 の優先度を 10 に変更します。
renice 10 -p 6789
```
# おわりに
これらのコマンドを使用することで、システムのプロセスを効率的に管理し、パフォーマンスを最適化することができます。
次の記事では、ログ管理について説明します。

https://qiita.com/yu1016/items/687ae4bfc1e03fc60021

一覧

https://qiita.com/advent-calendar/2024/pig
SQL Serverのテーブル上に登録したJSONのプロパティのUpdate

https://learn.microsoft.com/ja-jp/sql/t-sql/functions/json-modify-transact-sql?view=sql-server-ver16

tableAのrecord1列に登録されているJson形式のデータのうち、property1というプロパティをUpdateしたい場合。
update tableA
set record1 = JSON_MODIFY(record1,'$.property1','更新後の値')
where <Updateの条件>
[SmartSheet]SmartSheetについて語る。

# はじめに
Qiita Advent Calendar 16日目です。
本日は業務で学んだマネジメントツールについて話していきたいと思います。
あまり知られていないツールだと思います。

# マネジメントツールの必要性
プロジェクトをうまく進行させていくためには、プロジェクトマネジメントが肝心になります。
そのためのツールとしてよく使われているものは
<strong>
・Redmine
・Asana
・Backlog
・TIMETRACKERNX（協賛企業）
</strong>
などがあげられると思います。

これらはタスクを一元管理し、工数の把握、タスクの振り分け、タスクの完了、ガンチャートなどプロジェクト管理の効率化を図ります。
様々な製品がある中、自分が勉強したマネジメントツールのSmart Sheetについて学んだため、これについて共有していきたいと思います。
　
# SmartSheetとは
Smartsheetは2005年に設立されました。
日本市場には2023年に本格参入し、日本語版を提供し始めました。

Smartsheetは、プロジェクト管理や業務効率化のための多機能なプラットフォームです。以下は主な機能の一部です：

**プロジェクト管理**：タイムライン、グリッド、カード、ガントチャート、カレンダービューなど、さまざまなビューで作業を追跡し、可視化できます。

**チームコラボレーション**：どこからでも、いつでも、チームが迅速かつ安全に作業を実行できるようにします。

**フォームとデータ収集**：ブランドの色、画像、ロゴでカスタマイズされたフォームを使用して、内部および外部の関係者からエラーフリーで一貫性のあるデータを収集し、行動に移すことができます。

**タスクの自動化**：シンプルで強力な自動化ワークフローを数分で実装できます。

**コンテンツ管理**：ファイルライブラリを使用してプロジェクトと並行してコンテンツを計画、管理、レビューし、Brandfolder by Smartsheetに公開して簡単に配布し、パフォーマンスの洞察を得ることができます

# よいところ
- **Excelの進化版**：SmartsheetはExcelのような使用感があり、すぐに使い始めることができます。
- **タスクの自動化**：メール通知などの自動化により、タスク管理が簡単になります。
- **データ収集フォーム**：外部サイトに埋め込むことで、データを自動的に収集できます。

# 不便なところ
- **日本語対応の遅れ**：Smartsheetは一年前に日本市場に参入したため、日本語対応がまだ完全ではありません。
チャット風Python入門

ミユキ「ノボルくん、ちゃんと食べたら片づけないと駄目よ」
ノボル「うるさい！　うるさい！　僕は遊ぶんだ！」
ミユキ「そんなこと言ってると、将来プログラミングをするときに困ることになるわよ？」
ノボル「プ……？　お姉ちゃん、プ……なに？」
ミユキ「プログラミングよ、ノボルくん」
ノボル「プロ……？　プロ……なに？　お姉ちゃん」
ミユキ「プログラミング」
ノボル「プログ……？　プログ……なに？　お姉ちゃん」
ミユキ「かなり短期記憶が劣化しているわね。きっとゲームのやりすぎのせいだわ」
ミユキ「いーい？　ノボルくん。ここに書いてあげたから、これを読むのよ」
ノボル「プログラ……？　ああ！　目が！　目があ！」
ミユキ「どうしたの？　ノボルくん！」
ノボル「お姉ちゃん！　目が！　目が痛いよぉ！」
ミユキ「どうやら、ゲームのし過ぎで眼精疲労のようね。目薬をさしてあげるわ」

ノボル「プログラミング？　なあにこれ、お姉ちゃん」
ミユキ「プログラミングというのは、パソコンに命令を与える文章を書くことを言うわ」
ノボル「パソコンに命令を与えるの？」
ミユキ「そうよ。魔法使いが使い魔に命令するように、パソコンに命令を与えて仕事をさせるの」
ノボル「仕事？　ぼくのパパは、仕事してないよ？」
ミユキ「……」
ミユキ「プログラミングはパソコンがあればできるわ。これ、私のパソコン」
ノボル「すげぇ！　ゲームができるぜ！」
ミユキ「あっ、ばっ、こら、やめなさい！　マイクラをインストールするんじゃないの！」
ノボル「うるせえ！」
ミユキ「いーい？　ノボル君。プログラミングを覚えたら、マイクラみたいなゲームだって作れるようになるかもしれないわよ？」
ノボル「え？　ほんと？　お姉ちゃん」
ミユキ「ほんとよ。でも、お姉ちゃんが教えられるのはPythonなの」
ノボル「パ……？」
ミユキ「ああ、短期記憶が。ほら書いてあげるわ。パ、イ、ソ、ン」
ノボル「パイソン？　これがプログラミング？」
ミユキ「プログラミング言語よ。パソコンに命令を与えるための言語。これを覚えたら、あなたも魔法使いになれるわ」
ノボル「僕のパパが、ノボルは30歳まで女の子とデートしなかったら魔法使いになれるって言ってた」
ミユキ「……」
ノボル「お姉ちゃん！　ぼく、魔法使いになりたい！　どうしたらいいの？」
ミユキ「ふふ、いいわ。手取り足取り、教えてあげる♡」

完
システムのドキュメント整備してますか？ドキュメント整備で失敗しないためにしていること。

:::note info
🎄 本記事は ZOZO Advent Calendar 2024 シリーズ 2 の 3 日目です。
推薦基盤ブロックの2日目の記事は [ｺｳｽｹ ｽﾐﾔｽ](https://qiita.com/kosuke_sumiyasu) さんによる [推薦システムにおける新規性に関して、考えてみませんか？](https://qiita.com/kosuke_sumiyasu/items/424e2108c548e312146d)でした
:::

# はじめに

こんにちは。データシステム部 推薦基盤 チームの 関口 です。最近、筋トレ（ベンチプレス）に励んでおり、6ヶ月で最大重量を80kgから107.5kgに増強しました！コツは、筋肉痛があってもとにかく継続すること。量をこなすことが重要だと実感しています。来年夏には120kgを目指します！


さて、本題です。システム運用におけるドキュメントの重要性についてお話します。設計、実装、運用、トラブル対応…あらゆる場面で欠かせない存在にも関わらず、ドキュメント整備は後回しになりがちです。これにより、

- システムに関する知識が属人化し、特定のメンバーがいないと対応できない
- トラブル時に迅速な原因特定ができない
- 新メンバーがスムーズにプロジェクトに参加できない

といった問題が発生します。そこで私たちのチームが実践しているドキュメントの管理方法についてまとめようと思います。

# システムの運用ドキュメントの目的
MLパイプラインやAPIなど、多数のシステムを管理する私たちのチームでは、以下の目的でシステムごとの運用ドキュメントを作成・維持しています。

- 属人化の防止
- 新規メンバーの円滑なオンボーディング
- トラブル対応の迅速化
- システム変更の影響把握

# ドキュメント整備の基本方針
ドキュメントの基本構成は以下の通りです。（システムごとに必要な追加要素はあります。）

```
├── README/
│   ├── リポジトリの目的
│   ├── 動作確認方法
│   ├── リリースフロー
│   └── 関係者リスト
├── システム構成/
│   ├── アーキテクチャの概要図
│   ├── 関連システムとの関係性
│   ├── 処理フロー
│   ├── ML アーキテクチャ
│   ├── 使用しているサービスについて（GCP等）
│   └── etc...
├── 設計資料/
│   └── 開発時の設計資料
└── 運用資料/
    ├── 運用に関する議事録
    ├── 運用履歴
    └── 改修案件資料
```
ここで重要なのが、システム構成では**必要最低限の情報だけ**を載せることを意識しています。なぜ必要最低限にするかは以下が理由です。

- システムの詳細はコードを読めば確認できる
- ドキュメントに詳細な部分まで書くと、細かなシステム改修時にもドキュメントも修正しなければいけなくなる
- 上記を徹底しないとコードとドキュメントに乖離が発生する

なるべくメンテナンスコストをなくすことを意識してドキュメントの作成を行っています。

# ドキュメントの運用で失敗しないための取り組み

#### 定期的なドキュメント整備
私たちのチームでは保持しているすべてのシステムのドキュメントを作成するために週2回1時間の**大ドキュメント書き大会**を実施していました。この会ではチーム全員で集まり、担当の運用ドキュメントを整備する時間として確保しています。ドキュメント整備を行う時間を確保しておくことで、他の業務への集中度を高めることができます。
ドキュメントが完成した後は、改めてドキュメント更新の担当者を設けて確認する時間として確保しています。

#### システム共有会の実施
整備したドキュメントをもとにシステムの共有をチーム内でシステム共有会を開催しました。これによりシステムの属人化を防ぐことを目的としています。また、新規メンバーに対するオンボーディング資料としても活用できます。

# まとめ

効率的なシステム運用には、質の高いドキュメントと、それを維持するための仕組みが不可欠です。私たちのチームでは、必要最低限の情報に絞ったドキュメントと、定期的な整備、共有会という仕組みによって、属人化を防ぎ、スムーズな運用を目指しています。筋トレと同様に、継続的な努力が重要です。ﾊﾟﾜｰーーーーーーーーｯｯ!!!!
ilasmでstack machine その58

# 概要
ilasmでstack machineやってみた。
練習問題やってみた。
構想編

# 練習問題
elixirでilasmをアセンブルしてROM化せよ。

# CPUの仕様設計
スタックマシン

- 命令長　１２ビット
- 命令メモリー　12ビット２５６バイト

- レジスタ　８ビット
　文字列用　４バイト
　プログラムカウンタ 1バイト
　スタック用　６バイト
　出力用　1バイト
　変数用　2バイト
  乱数用　１バイト
- フラグ
　ジャンプ用１ビット

- 命令セット

|命令コード	|ニーモニック	|意味											|stackの状態
|:--|:--|:--|:--|
|000		|nop			|何もしない。									|変化無し
|001		|ret			|戻る										|	変化無し
|1nn		|ldc.i4 nn	|stackに整数 nnを積む。								|	1個増える
|2nn		|ldstr "fizzbuzz"	|バッファに「fizzbuzz」を積む。				|	変化無し
|400|call void [mscorlib] System.Console::WriteLine(int32)	|トップを数値印刷。|1個減る
|500|call void [mscorlib] System.Console::WriteLine(string)	|バッファを文字印刷。|変化無し
|6nn		|beq nn		|セカンドとトップを比べて等しいならnnに飛ぶ。			|2個減る
|7nn		|bgt nn		|セカンドとトップを比べて小さいならnnに飛ぶ。			|2個減る
|8nn		|blt nn		|セカンドとトップを比べて大きいならnnに飛ぶ。			|2個減る
|9nn		|br nn		|nnへ飛ぶ。											|	変化無し
|ann		|brfalse nn	|トップがゼロで無いならnnに飛ぶ。				|1個減る
|bnn		|brtrue nn	|トップがゼロならnnに飛ぶ。					|	1個減る
|f00		|dup			|stackにコピーを積む。							|1個増える
|f01		|pop			|stackを一個減らす。									|1個減る
|f02		|add			|セカンドとトップの加算を求める。						|1個減る
|f03		|sub			|セカンドとトップの減算を求める。						|1個減る
|f04		|mul			|セカンドとトップの乗算を求める。						|1個減る
|f05		|div			|セカンドとトップの除算を求める。						|1個減る
|f06		|rem			|セカンドとトップの剰余を求める。						|1個減る
|f07	|callvirt instance int32 [mscorlib]System.Random::Next(int32)	|stackに乱数を積む	|1個増える
|f09		|stloc a		|変数aにトップを移動。							|	1個減る
|f0a		|ldloc a		|stackに変数aの値を積む。							|1個増える
|f0b		|stloc b		|変数bにトップを移動。							|	1個減る
|f0c		|ldloc b		|stackに変数bの値を積む。							|1個増える

- 例外
ldstrは、命令長6バイト　（なので　アドレス計算　めんどくさくなっちゃた。）

rom[22] = 12'h201;
rom[23] = 12'h266;
rom[24] = 12'h269;
rom[25] = 12'h262;
rom[26] = 12'h275;
rom[27] = 12'h200;


# 投入するソース
fizzbuzz
```
  ldc.i4  100
  stloc  b
  ldc.i4  1
  stloc  a
loop:
  ldloc  a
  ldloc  b
  bgt  bye
  ldloc  a
  ldc.i4  15
  rem
  brfalse  fb
  ldloc  a
  ldc.i4  5
  rem
  brfalse  b
  ldloc  a
  ldc.i4  3
  rem
  brfalse  f
  ldloc  a
  call  void [mscorlib] System.Console::WriteLine(int32)
  br  tugi
fb:
  ldstr  "fibu"
  br  print
b:
  ldstr  "buzz"
  br  print
f:
  ldstr  "fizz"
print:
  call  void [mscorlib] System.Console::WriteLine(string)
tugi:
  ldloc  a
  ldc.i4  1
  add
  stloc  a
  br  loop
bye:
  ret

```

以上
Advent of code 2024 Day 2 Part 1 & Part 2 を Livebook で楽しむ

## はじめに

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

問題文はこちら

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

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

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

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

## セットアップ

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

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

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

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

## 入力の取得

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

![スクリーンショット 2024-12-02 17.29.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/dfba0bec-79cf-3f01-6c4d-666bcd4003c3.png)

## 私の答え

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

### Part 1

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

まず入力を読み込みます

```elixir
reports =
  puzzle_input
  |> String.split("\n")
  |> Enum.map(fn row ->
    row
    |> String.split(" ")
    |> Enum.map(&String.to_integer(&1))
  end)
```

第1段階として、単調減少または単調増加しているかをチェックします

ソートした結果とソートする前が一致していれば、必ず単調減少または単調増加しています

次に一つずらした配列を作り、次のレベルとの差が 1 〜 3 になっているかをチェックします

```elixir
reports
|> Enum.filter(fn report ->
  Enum.sort(report) == report or Enum.sort(report, :desc) == report
end)
|> Enum.filter(fn report ->
  next_report = tl(report) ++ [nil]

  Enum.zip([report, next_report])
  |> Enum.all?(fn {current, next} ->
    if is_nil(next) do
      true
    else
      diff = abs(next - current)
      diff > 0 and diff < 4
    end
  end)
end)
|> length()
```


</details>

### Part 2

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

ちょっと複雑ですが、各レポートにつき、1つレベルを削除したパターンを全て用意します

各パターンのうち、 Part 1 と同じ条件を満たすものが一つでもあれば、そのレポートは正常です

```elixir
reports
|> Enum.filter(fn report ->
  deleted =
    1..length(report)
    |> Enum.map(fn index ->
      Enum.take(report, index - 1) ++ Enum.drop(report, index)
    end)

  [report | deleted]
  |> Enum.filter(fn sub_report ->
    Enum.sort(sub_report) == sub_report or Enum.sort(sub_report, :desc) == sub_report
  end)
  |> Enum.find(fn sub_report ->
    next_report = tl(sub_report) ++ [nil]

    Enum.zip([sub_report, next_report])
    |> Enum.all?(fn {current, next} ->
      if is_nil(next) do
        true
      else
        diff = abs(next - current)
        diff > 0 and diff < 4
      end
    end)
  end)
  |> then(&!is_nil(&1))  
end)
|> length()
```

</details>

## まとめ

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

![aoc2024_day2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/e0dbbcfa-eedf-d5f7-f7f0-2fc87167bc5f.jpeg)

Day 2 ですが、結構ややこしい問題でした

年々難しくなっていっているのかもしれません
アロー関数省略形まとめ

# アロー関数
アロー関数は様々な省略した記述の仕方があるため解読するのに苦慮すると思いますので、省略形をまとめておきます。

そもそもアロー関数とは・・・関数式の簡潔に書ける代替構文
```.js
const hoge = (str) => { //hogeはstrという引数を受け取っている
  return str;
};
console.log(hoge('ストリングです')); // ストリングです　が出力される
```
```.js
const hoge = str => { // 引数が1つの場合()を省略できる
  return str;
};
console.log(hoge('ストリングです')); 
```
```.js
const hoge = str => str; // 式が1つで返すような場合は{}とreturnも省略できる。もし{}を使用するならreturnもつけること
console.log(hoge('ストリングです'));  
```
上記3つは同じことをしています。

```.js
const hogehoge = () => {
  return Math.floor(Math.random() * 6) + 1;
}
```
```.js
const hogehoge = () => (
Math.floor(Math.random() * 6) + 1 //()を使用する場合はどこの範囲を返すか分かるようにするため()内に;はNG。;は()の外に記述する
);
```

```.js
const hogehoge = () => Math.floor(Math.random() * 6) + 1;
```
上記3つも同じことをしています。
慣れないうちは繰り返し使用してきましょう:wink:

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

https://projisou.jp
React Native(EXPO)とFlutterの比較：2024年のクロスプラットフォーム開発

## はじめに

私はWeb開発を業務で行っています(ここ最近はGoでバックエンドを一年ぐらいしてますが、React.jsなどのフロント側も2,3年ぐらい?は開発していました)。
最近新しいことに挑戦したいと思い、React Native(EXPO)とFlutterの両方を使って、TODOアプリや写真登録、いいね機能などの基本的な部分を開発してみました。その所感を共有したいと思います。:santa:

※バックエンドはFirebase を使いました。本記事はFirebase については触れません。:bow:

# クロスプラットフォームフレームワークとは?
単一のコードベースで複数のプラットフォーム（例えばiOSやAndroid）に対応するアプリケーションを開発するためのフレームワークです。これにより、開発者は異なるプラットフォームごとに個別のコードを書く必要がなくなり、開発効率が向上します。
クロスプラットフォームフレームワークは、ネイティブアプリのようなパフォーマンスを提供しつつ、開発コストを削減することが可能です。
今回紹介するReact NativeやFlutterがその クロスプラットフォームフレームワークになります。


React NativeやFlutterの 特徴、利点、欠点はいろんな記事で紹介しているため簡単に載せておきます

## React Native
- 特徴：JavaScriptを使用し、Reactのコンポーネントベースアーキテクチャを採用
- 利点：大規模なコミュニティ、豊富なライブラリ、ホットリロード機能、既存のウェブ技術の再利用が可能
- 欠点：ネイティブアプリに比べてパフォーマンスが劣る場合がある

## Flutter
- 特徴：GoogleのDart言語を使用し、全てがウィジェットとして構築される
- 利点：高いパフォーマンス、カスタマイズ可能な豊富なウィジェット、複数プラットフォームへの対応
- 欠点：Dart言語の学習が必要、React Nativeに比べてコミュニティがやや小さい

## 比較

### パフォーマンス

React NativeはJavaScriptブリッジを介してネイティブコンポーネントと通信するため、パフォーマンスが若干低下することがあります。一方、Flutterはネイティブコードに直接コンパイルされるため、非常に高いパフォーマンスを発揮します。多くの情報源でこのように紹介されていますが、実際には非常に大きく複雑な処理を行わない限り、ユーザーが体感できるほどのパフォーマンス低下は起こらないかもしれません。(多分w)

### 開発効率
React NativeはJavaScriptとReactの知識があれば迅速に開発を開始できます。
FlutterはDartの学習が必要ですが、豊富なウィジェットとツールにより効率的な開発が可能です。

### 開発中のエラー
エラーメッセージなど問題解決にすぐ対応できそうなのはFlutterの方が良いと感じました。
私自身、React.jsについては2,3年ほど開発経験がありましたが、React Native開発中に初見のエラーメッセージや、どこでどんなエラーが出ているかわからないこともありました...orz。

本当にわからない時はシュミレーター画面をスクショを撮りChatGPTに解決してもらいました...:hear_no_evil:w。
なので一応なんとかなりますがエラー情報が少ないのが現状だなと感じました。

### ライブラリに関して
React Nativeの方が豊富とされていますが、正直どちらも一長一短です。よく見かける写真登録などの機能はReact Native、Flutterのどちらもありますが、インスタのような写真をスライドできる機能に変えようとした場合、iOSは対応しているが、Androidが対応していないなどの問題もありました。（調べてみるとOSのバージョンによってもライブラリが使えるかどうかの問題もあります...w）

そのため開発中に心が折れないようにするための心構えが大事です:cop:

### エコシステムとサポート
React Nativeは大規模なコミュニティと豊富なライブラリが利用可能です。Flutterはコミュニティが急速に成長しており、Googleの強力なサポートがあります。

## 最新の統計

2023年のStack Overflow調査では、プロフェッショナル開発者の間でFlutterが9.21%、React Nativeが9.14%の支持を得ており、ほぼ拮抗しています。
- https://survey.stackoverflow.co/2023/

## どちらを選ぶべきか？

どちらも触ってみて思うのは、どんな機能を作りたいかで決まると思います。
そこからライブラリ周りを調べ、作りたい機能がライブラリにあるか(←ここが個人的に一番重要だと思っており、iosで対応されていて、androidで対応されてないとかなると心折れますw)かどうかを確認した上で選ぶのが良いと思います。
また、開発するチームのスキルセットで決めるのが良いと思います。

## まとめ

React NativeとFlutterはそれぞれ異なる強みを持つ優れたフレームワークです。プロジェクトの要件やチームのスキルセットに応じて、どちらのフレームワークを選ぶかを慎重に検討することが重要だと思いました。
あと、「React Native vs Flutter」で調べるといろんなエンジニアの意見とかも楽しいですし、今後の展望も楽しみです。

この記事が、あなたのフレームワーク選びの参考になれば幸いです。
基礎が大事だと改めて思った話

この記事は LTS Group Advent Calendar 2024 の11日目の記事として執筆しています。
最近の生活を通じて感じた「基礎の重要性」について、技術的な視点も交えながらお話ししたいと思います。
※技術記事というよりは、体験談を中心とした内容です。


# はじめに
「基礎は大事」と言うと、今さら感があるかもしれません。しかし、日々の生活や仕事を振り返る中で、私自身が改めてその大切さを痛感する出来事がいくつもありました。

まずは私の背景について簡単にお伝えします。
私は新卒3年目のWeb開発エンジニア兼データエンジニアです。
主に Ruby on Rails を使ってきましたが、9ヶ月前から Python に本格的に取り組むようになりました。
Djangoを使ったWeb開発とデータ加工のスキルを同時に身につける必要があったため、「とにかく書いて動かす」というアプローチでPythonを学びました。
正直なところ、基礎をじっくり学ぶ余裕はありませんでした。

しかし、最近ではコードレビューを担当することが増え、後輩たちの成長に触れる中で、自分も「もっとPythonを深く理解したい」と強く思うようになりました。
そこで、改めて「基礎の重要性」を実感した出来事をお話ししたいと思います。


# 1. ひよこ鑑定士の基礎力
「若いうちにしかできないこと」を調べていた際、「ひよこ鑑定士」（正式名称「初生雛鑑別師」）という職業に興味を持ちました。
この仕事では、生まれたばかりのひよこの性別を判別する技術を習得します。資格取得には、約5ヶ月間の集中講習が必要です。

その過程で、日本チャンピオンに輝いた方の記事を読みました。
この方は訓練初期段階の「脱糞」と呼ばれる基礎技術に苦労し、同期が応用技術を学び始める中でも、基礎練習に専念して努力を重ねたそうです。
私が同じ状況であれば焦ってしまうところですが、チャンピオンの方は「基礎の先に飛躍がある」という考えのもと、焦らず黙々とやっていたとのことでした。

私は、この記事を読んだ後、それまでなんとなく使っていたPythonの標準ライブラリのソースコードを読む習慣を始めました。今まで、ライブラリという基礎を疎かにしていたなと感じたためです。
最初はライブラリを読むのにも苦労しましたが、徐々にPythonの流儀のようなものが掴めてきたように思います。
また、基礎を深く理解することで、以前はあまりよく分からずに時間がかかっていたエラー解消がより短時間でできるようになりました。


# 2. 祖父の体験談：叩き込まれた基礎が築く信頼
私の祖父は冠婚葬祭業で経営者をしており、働き方や今後の相談をする際に、昔の経験談を聞くことがあります。
その中でも、特に心に残っているのが、祖父が18歳頃に経験した話です。

祖父は高校卒業後、京都の仏壇具職人の元で丁稚奉公をしていました。
そこで業務外ではありますが、興味で仏壇の原価計算表を3ヶ月間読み込み続けた結果、仏壇具を見ただけで原価をほぼ正確に判断できるようになりました。
当時、祖父は見積もりを任される立場ではありませんでしたが、急な依頼時に控えめながらも正確な見積もりを助言することで、徐々に信頼を得ていきました。
基礎力を元に、自ら築く信頼の大切さを教えてくれました。

この話をきっかけに、私はレビュー時のコメントの比重を変更しました。
今までは、ここはもっと短く書けるのでは？ということをメインでコメントしていましたが
基礎に則って「できるだけシンプルに」「同じことを繰り返さない」という原則に重きを置いたレビューに変更しました。
ここは短く書ける、というのはその場でのコメントであって、信頼の高いコードを書くにはもっと原則に忠実なコードが重要だと思ったためです。


# 3.「世界一流エンジニアの思考法」から見た基礎力
最近読んだ『世界一流エンジニアの思考法』という本にも、基礎の重要性が強調されていました。その中でも特に印象に残ったのが、次の一文です。
> 基礎的なことがうまくできない段階で、下手に試行錯誤して自分流に考えてアレンジすると、かえってめちゃくちゃになって成功しない

この言葉が示しているのは、基礎の重要性です。
基礎が整っていない状態で応用に手を出すのは、砂の上に建物を建てるようなもので、最終的には全体が崩れてしまう、ということです。
しっかりとした基礎があれば、余計なエネルギーを使わずに、コードを完全に理解しながら効率よく読み書きできるようになります。

さらにこの本では、何も検索せずにすぐ実装できるレベルの基礎をどれだけ増やせるかが、長期的な効率を左右する旨も記されていました。
現在の私は、困るたびに検索を頼ってしまいがちですが、本を読んで「基礎力を鍛える必要性」を改めて感じました。

この本を読んだのを機に、私はこれまで苦手意識があった正規表現の基礎を学び直しています。
正規表現を何も検索せずにすぐ実装できるレベルまで持っていければ、当面の間の時間効率が上がると感じたためです。
練習を通じて、以前は敬遠していた正規表現が、実は分解して考えると面白く、効率的な記述法を探る面白さに気づきました。
これも、基礎力を鍛えられたからこその気づきだったと思っています。


# 結論
「基礎を固めること」は地味で時間のかかる作業です。若手のうちは、早く成果を出したいという気持ちから
知らずのうちに基礎を軽視していることもあるでしょう（私がそうです）。
しかし、長期的なスキルアップを目指すのであれば、基礎はやはり大切です。
ひよこ鑑定士の訓練、世界一流エンジニアの思考法、祖父の体験談はどれも、「基礎が応用を支える」ことを教えてくれます。
私も引き続き、基礎力を高める努力を続けていきます。この記事を読んでいるあなたも一緒に、基礎をより積み上げませんか？
YUV入門前

YUVを扱うとき最低限これだけは抑えておこう。

## YUVとは？

まず抑えておいてほしいのはYUVは画像フォーマットであるが「YUVはRGBのように赤緑青で保存していない」ということ。具体的にどのように保存されるかは後述する。


## Q.そもそもなぜYUVを使うのか。

ディスプレイ表示などする場合最終的にビデオメモリにはRGB形式で画像が配置されることがほとんど、ならなぜYUVなどというフォーマットを使用するのか？

**A.データ効率が良いから（＋歴史的経緯）**

RGBが色を赤、緑、青の3つに分けるのに対して、YUVでは輝度(Y),青色差成分(U),赤色差成分(V)に分ける。

人間の目が輝度に敏感な性質を使ってUVを少ないビットで表現しても画質の劣化が少ない。

例えばNV12であればYを8bit、UVをそれぞれ2bitで1画素あたり12bitで表現できる。RGBで１画素あたり12bitを表現しようとすると各色4bitしか使うことができず非常に画質が劣化する。

なお、当初YUVが採用されたのは白黒テレビとカラーテレビの互換性を保つためだったらしい。[要出典]

## 4:4:4とか4:2:0ってなに？

これらはサンプリング方法を表している。（フォーマットとは違うので注意）

<輝度>:<水平方向色差>:<垂直方向色差>で表しているが言葉で説明するのは難しい。

下の図がわかりやすい。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39647/fe4d2509-1725-ee4b-fad4-d0b31075aa5b.png)

https://www.videomaker.com/article/f6/15788-the-anatomy-of-chroma-subsampling/

## サンプリングとフォーマットはどう違うのか。

サンプリングはあくまで画素からデータを取得する方法にすぎない。フォーマットはそれに加えて取得したデータをメモリやファイル上にどのように配置するかまでを規定するものとなる。

* 4:4:4 (32 bpp)
  * AYUV
* 4:2:2 (16 bpp)
  * YUY2
  * UYVY
* 4:2:0 (16 bpp)
  * IMC1
  * IMC3
* 4:2:0 (12 bpp)
  * IMC2
  * IMC4
  * YV12
  * NV12
  * YUV420


### UYVY

例えばUYVYならメモリ上にYUVが以下のように並ぶ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39647/56ea0143-e36e-8e30-8fba-e21109e2679d.png)

### NV12

NV12などはYとUVが別で配置されており、Yの領域とUVの領域は必ずしも連続している必要はない。それぞれのメモリ領域は**プレーン**と呼ばれており特に複数のプレーンからなるフォーマットは**multi-planar**と呼ばれる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39647/f22d5fde-9a7d-6eeb-7068-2c378f9f2074.png)


https://www.klab.com/jp/blog/tech/2016/1054828175.html

### YUV420

YUV420という紛らわしい名前が有るが、これはサンプリング方法ではなくフォーマット名。(サンプリング方法は4:2:0)
YUV420の中でさらに細かくI420,YV12…等に分かれる。

以下はI420のフォーマット。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39647/6429f6a2-39fa-ed22-0d88-2e74dfb72290.png)

https://en.wikipedia.org/wiki/YCbCr

### いろんな4:2:0

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39647/24b56aec-dc39-a2fb-618b-be1e66375bcd.png)

https://gist.github.com/Jim-Bar/3cbba684a71d1a9d468a6711a6eddbeb#file-yuv_formats-png
MDM SaaS：Egress Jobのマッピングでデータプレビューする！

# はじめに
散在するマスタデータを集積して、クレンジング、名寄せを実施し、関連するマスタデータを紐づけて管理するマスタデータ管理のソリューションでは、マスタデータを集積して、配信するデータ連携が非常に重要となります。

インフォマティカのMDMソリューションにおいても、データの集配信を実施するためのジョブを作成することができます。このジョブの中では、インフォマティカのデータ統合のソリューション：Cloud Data Integration を活用して、様々なアプリケーションとして接続するためのデータ集積、さらには配信していくためのデータ連携をノンコーディングで容易に開発することができます。

# MDMからマスタデータの集配信
インフォマティカのMDMソリューションではデータ集積のジョブをIngressジョブ、データ配信のためのジョブをEgressジョブと呼ばれます。

インフォマティカでは、データ連携のプログラムのことをマッピングと呼び、GUIベースにて簡易な開発を可能とします。また、通常マッピングを開発する際は、プレビュー機能にてデータ連携のロジックが正しく実装されているかを確認しながら、デバッグや調査を実施しながらマッピングの開発が可能です。しかしながら、MDMからデータを配信するEgress ジョブの中では、前処理が実行されており、プレビュー機能が有効にはならないため、プレビュー機能を活用するためのTipsをご紹介します。

# Egress Jobのマッピングでデータプレビューを実施する方法
## 手順１
一度Egressジョブをテスト的に実行します。このとき「Business 360 Console」サービスのマイジョブなどを利用して、Egressジョブの中で指定されているjobInstanceId のパラメータを確認します。(手順２で利用します)
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940837/4187f591-0cb4-ad1c-5bcf-90e85b924028.png)

## 手順２
このjobInstanceIdのパラメータは再利用可能なため、jobInstanceIdの値をEgressジョブのマッピング内のパラメータのデフォルト値として設定します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940837/132901a2-578a-7015-c88d-8701cf935aab.png)

## 手順３
このパラメータをデフォルト値として設定しているマッピングについては、以下のように任意の変換部品（トランスフォーメーション）にてプレビューを実施することができます！
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940837/d1123230-02bc-c731-1b60-d3c5df4bba15.png)

# まとめ
マスタデータを管理するMDMソリューションの中では、データの集配信は重要な技術要素であり、効率的な開発、運用が求められます。本Tipsにより、少しでも効率的な開発作業につながることを期待しています。
【高専ロボコン】面倒なことは先にしておこう

## はじめに

設計周りで後回しにして後悔したこととかを書いてます。
この記事は設計1年目でノウハウも何もない高専2年生によるものです。経験が無さすぎて書くことも少ないですが何卒。

## 部品

作りたい形やミラーの基準にあわせて平面![1000000439.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925483/3f24639b-8100-5271-0ba5-283abb8fcb46.gif)
を作っておくとパターンフィーチャーとかにすぐ使えて便利です。使わない時は非表示にすると邪魔になりにくいので設定しておきましょう。

## アセンブリ

サブアセンブリを作っておくと合致設定や表示設定を変更する際に部品を一つ一つ触らなくてもよくなります。便利。

## ファイルの管理

part1.sldprtとかにするとどのファイルがどの部品か見分けがつかなくなるので後悔します。絶対にやめましょう。(n敗)

部品をコピー→編集する際にも先にファイル名を変えることを推奨。<br>
↓最悪な例
part4 -コピー コピー コピー コピー.sldprt

使わないファイルを削除したり別のフォルダに移動するのもかなり見やすくなると思います。

## 最後に

正直SolidWorksの機能とかあんまりわかってないのでそろそろ勉強したほうが良いよねってなってます。これからもどうぞよろしくお願いします。
AWS Lambda が Lambda と Amazon S3 間の再帰ループ検出に対応したみたいなので検証する

少し前にSQSとの無限ループ検出、停止が実装されましたが、ついにもっともメジャーなLambda↔S3間の検知も来ましたね。
裏ではX-Rayが使われてるんでしたっけ？

# 概要
AWS Lambda は、再帰ループ検出機能をデフォルトで有効化、Lambda と Amazon S3 間での意図しない再帰ループを自動的に検出・停止。
これにより、設定ミスやコードの欠陥による無駄な課金や暴走を防る。

課金抑制: 意図しない再帰ループの発生を防止。
通知機能: 問題発生時に AWS Health Dashboard でトラブルシューティング情報を提供。
意図的な再帰: 必要に応じて PutFunctionRecursionConfig API で検出を無効化可能。
この機能は全リージョンで利用可能です。詳細は Lambda ドキュメント を参照。

# 検証

### テスト用コード
```python
import boto3
import random
import string
import os

s3_client = boto3.client('s3')

def generate_random_filename(length=10, extension=".txt"):
    """ランダムなファイル名を生成"""
    random_str = ''.join(random.choices(string.ascii_letters + string.digits, k=length))
    return random_str + extension

def lambda_handler(event, context):
    """Lambda 関数のエントリポイント"""
    # S3 バケット名（環境変数から取得）
    bucket_name = os.environ.get('S3_BUCKET_NAME')
    if not bucket_name:
        return {
            "statusCode": 400,
            "body": "環境変数 'S3_BUCKET_NAME' を設定してください。"
        }

    # ランダムなファイル名を生成
    random_filename = generate_random_filename()

    # アップロードするデータ（ここでは例として固定のテキストを使用）
    file_content = "lambda-s3-loop-detect-test"

    try:
        # S3 にアップロード
        s3_client.put_object(Bucket=bucket_name, Key=random_filename, Body=file_content)
        return {
            "statusCode": 200,
            "body": f"ファイル '{random_filename}' を S3 バケット '{bucket_name}' にアップロードしました。"
        }
    except Exception as e:
        return {
            "statusCode": 500,
            "body": f"アップロード中にエラーが発生しました: {e}"
        }
```

### テスト実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/81cc4606-c067-e217-1d48-f55f7e83f7ab.png)
S3側にオブジェクトができていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/e2802b2d-b112-2c35-e154-d588b6c15c49.png)

### ループを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/149fb6a8-639d-6c95-44e7-2525c057d042.png)

### ループ順序
1. Lambda によってファイルが作成
1. S3のイベント通知でLambdaが起動
1. 起動されたLambdaによってS3へファイルが作成
1. S3のイベント通知でLambdaが起動

をずっとくりかえる感じです、公式的には16回の実行で止まるはず。

### 発火します
無事16回実行されて停止しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/efa25b9e-f843-1427-d2e7-e593b9493ac2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/e8b47182-7cc9-9855-7085-8058541f70f1.png)

### CloudWatch 上にメトリクスも出力されます
Recursive invocations dropped メトリクス
アラームなどを設定しておくとよいかもしれません
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/362452b3-1a2a-8d03-6eef-705c98b7d8ad.png)



**対応外のケースもあるようなので、慢心しないように注意しましょう**
3Dスキャナーを使用した部品寸法測定方法

3Dスキャナーの登場により、部品の寸法測定が大幅に簡略化され、特に逆行工程や品質管理で非常に有用です。以下は、3Dスキャナーを使用して部品の寸法を測定する方法の簡単な手順です。

### 1. **適切なスキャナーを選ぶ**
まず、使用する3Dスキャナーが測定したい部品に適しているか確認します。レーザー3Dスキャナーは高精度でさまざまな材質に対応できるため、よく使われます。複雑な表面や小さな部品の測定には、より高解像度のスキャンモードを選択して、データの精度を確保しましょう。
![f987d396d47b42e47c07efabf967c1cd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/abdee7ea-09e2-146c-82fd-2bbb621a7435.png)

https://www.revopoint3d.com/products/3d-laser-scanner-metrox

https://www.revopoint3d.jp/products/3d-laser-scanner-metrox
### 2. **部品の準備**
スキャンを行う前に、部品表面をきれいに清掃し、油汚れやホコリがスキャン結果に影響を与えないようにします。特に光沢のある表面には、スキャン用の粉（白色粉末など）を軽く吹きかけることで、スキャナーが細部をより正確に捉えることができます。

### 3. **スキャンの実施**
3Dスキャナーを使用して部品をさまざまな角度からスキャンします。これにより、部品全体の表面データを網羅的に取得できます。スキャン時は適切な解像度を選ぶことが重要で、高解像度にするほどデータが詳細になりますが、その分スキャン時間も長くなります。スキャン中は強い光源や反射面に注意し、これらがデータ収集に干渉しないようにします。
![2d36b876b7a611e1e5f80f122b593233.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/cfab448e-d754-f970-683d-ce4bc3b02137.png)



### 4. **スキャンデータの処理**
スキャン後、取得した点群データはソフトウェアで処理する必要があります。ほとんどのスキャナーには専用の処理ソフトウェアがあり、異なる視点からのデータを自動的に整列させ、1つの3Dモデルに統合できます。この段階でノイズや欠落部分をチェックし、データの完全性と正確性を確保します。
![dd0f1afbe0c6e68620fb4cb0c8e6e673.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/a66e570c-7e9b-182c-cab6-ef94fe9fc434.png)

### 5. **寸法測定**
処理が完了した3Dモデルを使用して寸法測定を行います。ソフトウェアを使って、部品の長さ、幅、高さを直接測定できます。また、複雑な角度や曲面の測定も可能です。一般的な操作としては、2点間の距離や、2つの線分の間の角度を測定することができます。CADモデルがあれば、スキャンしたモデルとCADデータを比較して寸法のズレを確認することもできます。

### 6. **誤差と精度の管理**
スキャン精度はスキャナーの解像度、部品表面の滑らかさなどさまざまな要因に影響されます。寸法測定を行う際は、スキャナーの誤差範囲を理解し、必要に応じて補正や調整を行うことが重要です。