OmniAICreator/Qiita-1.07M huggingface dataset:
【イベントレポート】第3回　自治体システム標準化・ガバメントクラウド勉強会

いつも記事を読んでいただきありがとうございます！
モブエンジニア（[@mob-engineer](https://qiita.com/mob_engineer))です！

今回は11/22（金）に参加した**第3回　自治体システム標準化・ガバメントクラウド勉強会**の参加レポートとなります！
参加しながら執筆したため、走り書きになっているところがあるかと思いますがご留意くださいませ。

https://gov-cloud.connpass.com/event/335463/

:::note info
あくまで、一参加者としてのキャッチアップ内容をまとめています。その点、ご留意いただけますと幸いです。あわせて、公開できない情報に関しては本記事では取り上げませんのでご留意ください。
:::

# 目次
- ガバメントクラウド移行の勘所と課題
- パネルディスカッション
- まとめ

## ガバメントクラウド移行の勘所と課題
- 抱えている課題
    - そもそも何を行えるか分からない
    - 財政面でのメリットが分からない
    - 全体像を掴むのが分からない
- 自己紹介
    - ヴイエムウェアに所属されている方
    - 個人でガバメントクラウド運営・アドバイザー活動を行っている
    - アドバイザー支援・AWSハンズオン含め約50件取り組みを行っている
        - ハンズオンに関してはガバメントクラウドに紐づけて行っている
    - 今後のガバメントクラウドにおいて、どうやってサービスと紐づけられるかを考える必要がある
- 目的
    - 正しい情報を認識して何が大切かを考え、対策を講じること
- What's 標準化
    - 個々の自治体ごとにシステムが構築されている
        - 他自治体との連携が難しい状況
    - 共通システムを通じてデータ連携することでスムーズな業務が実現できる
    - ガバメントクラウドを利用することで**システム利活用の最適化**がある
    - GovCloudとの違いは**民間利用が可能か否か？**
    - デジタル庁で契約管理を行うことで、ボリュームディスカウントを活用できる
- 標準化の問題点
    - そもそもガバメントクラウドを導入してコスト削減できるの？
    - 自治体間でのデータ連携をどのように進めていく必要があるか、事業者の動きを知らないといけない
    - 自治体の規模によってコスト削減率が変わってくる
    - 公開されている情報で見積もりを行うとギャップが発生する
- 見積もり問題
    - クラウドネイティブになっていない
        - 機能によって複数クラウドを選択する必要がある
        - クラウドだけでなくネットワークも考慮しないといけない
        - 補助金をもらうためにデジタル庁が提示している非機能要件を満たさないといけない
        - **自治体としてどのようにシステム構成を行わないといけないのかを考えないといけない**
    - ボリュームディスカウントができていない
        - デジタル庁経由で支払いが行われるため売り上げにならない
        - 当初のコスト削減率を上回る為替レートが発生している
    - 経済安全保障に対応できているのか分からない
        - ガバメントクラウドは基本海外クラウド
            - 主権免除と言っているが、実際その通りとなっているのか分からない
        - **テクノロジー主権**（技術面での優位性）、**データ主権**（どこにデータがあるか）、**運営主権**（システムのシャットダウンは誰が出来るのか）を考ええる必要がある
            - データ優位性・運営主権は私たちが持っていないといけない
        - アメリカでは機密情報はクラウドに置かない運営
        - 自治体が持っている情報の機密レベルを考えてデータ設計が必要
- 振り返り
    - 理想に対して現実がどのくらい乖離しているか、何を許容するかを考えないといけない
    - **クラウドを利用するのが本当に正しいのか**を理解しないといけない
- 自治体が行うこと
    - **技術・サービスの理解**に加え、**何をしたいのか**を考えないといけない
    - 技術調達においても、どこから手を付けていけばいいのかを考えないといけない
    - **自治体が運用イメージを持っていないと正しく機能ない**
    - **自治体も他人事を思わずにシステム設計に考えていかないといけない**
- 中島さんからの提案
    - 自治体でクラウドを学ぶのが難しいので、ハンズオン座学を活用しないといけない
        - 何がコントロールできるのか、何がコントロールできないのかを理解しないといけない

## パネルディスカッション
- 個別に人材教育は難しい
    - ある程度集まって教育活動を行っていかないといけない
    - 複数自治体から教育依頼を受けている場合がある
    - **自分事**として関係者が取り組んでいかないといけない

## まとめ
今回のセミナーを聞いて、**自治体標準化の難しさ**、**自治体・事業者が考えないといけないこと**を生々しくキャッチアップできたと思います。私自身が自治体標準化に関係している立場ではないですが、**自分事として何が出来るのか**を考えないといけないと思いました。

## 参考資料
[「ガバメントクラウド」の最新課題、移行における検討ポイントとは？](https://note.govtechtokyo.jp/n/n1b219d2ac091)
[第1回勉強会](https://gov-cloud.connpass.com/event/318262/presentation/)
[【登壇レポート】 ガバメントクラウド先行事業 中間報告を読み解く #自治体クラウド勉強会](https://sugiim.hatenablog.com/entry/2024/11/04/180752)
[第2回勉強会【登壇レポート】 ガバメントクラウド先行事業 中間報告を読み解く #自治体クラウド勉強会](https://sugiim.hatenablog.com/entry/2024/11/04/180752)
[紀尾井町と霞が関のシステム標準化事務に従事する中央省庁職員に伝えたい事](https://note.com/techniczna/n/nd8f0be368f44)
[地方公共団体の経営・財務マネジメント強化事業](https://www.soumu.go.jp/iken/management/index.html)
[中島さん資料※必読](https://speakerdeck.com/jnakajima1982/di-3hui-zi-zhi-ti-sisutemubiao-zhun-hua-gabamentokuraudomian-qiang-hui-zi-liao)
Python AI開発環境および仮想環境構築 Python3 + pip3 + virtualenv

# 目的
pythonの開発環境を構築し、仮想環境ごとにパッケージ管理を行う開発手法をご紹介します。
Pythonでのアプリ開発・AI開発・データ分析などに必要となるので、ご活用ください

# 前提
- bash, zshなどシェル（ターミナル）の知識
- apt, homebrewなどパッケージ管理ツールの知識

# Python3のインストール
homebrewを使用してPython3をインストールします。
Python3にはpip3が付属しています。
```
brew install python3
```
python3およびpip3がインストールされたかを、バージョン確認のコマンドで確認します。
それぞれのバージョンが出力されればOKです。
```
python3 -V
pip -V
```
# エイリアスを設定する
エイリアスを設定しておけば、ショートカットのようにコマンドを省略して打てます。
よく使うコマンドに対し、エイリアスを設定することをオススメします。

設定は、ホームディレクトリに存在するシェルの設定ファイルに追記することで反映されます。
シェルがbashなら `.bashrc`, zshなら`.zshrc`などが設定ファイルです。
編集はvi, vim, nanoなどのお気に入りのCUIエディタで行えます。(ここではvim)
```
vim ~/.bashrc
```
編集画面が開きますので、`i`を押して編集モードになったら、`G`で最下部にカーソル移動し、下記を追記します。
保存は`Esc`で編集モードから離れ、:wqを押すと保存されます。強制終了は:q!です。
他の箇所はシェルが壊れてしまう可能性があるので、わからない方は編集しないようにご注意ください。
```
# python用エイリアス
alias mkvenv='python3 -m venv venv'
alias python='python3'
alias pip='pip3'
alias pyver='python --version'
```
`alias <コマンドの省略名>='<実際に実行したいコマンド>'` という形式で作成できます。

**mkenv**: Python用の仮想環境を作ります
**python**: python3, python2などバージョンでコマンドが変わるので、現在使用中のpython3をpythonとして打てるようにします
**pip**: こちらも同様にバージョン名なしで打てるようにします
**pyver**: バージョン確認用

無事に保存できれば、次回シェルを開くとエイリアスが使えます。
編集を即時反映させたい場合、設定ファイルを下記コマンドでリロードします。
```
source ~/.bashrc
```

# プロジェクトごとに独立したPython環境を作る
パッケージをpipでインストールしようとするとエラーがでます。
グローバルにインストールする場合はHomebrewなどを利用し、プロジェクトごとにインストールする場合は個々の環境を作りその中で行います。

仮想環境を作ると、シェルの環境を汚さずPythonパッケージをその環境内だけで扱うことができます。

シェル全体にpython3のxyzパッケージがあるが、プロジェクトごとに異なるバージョンを利用したい場合などに便利です。

virtualenvはプロジェクトごとに独立したPython環境を作るツールです。
これをグローバルにインストールし、それを利用して個々の環境を作れるようにします。
代替ツールとして`pyenv`, `conda`があります。

```
brew install virtualenv
```
バージョンを確認します
```
virtualenv --version
```

仮想環境を構築します
```
virtualenv env_py3.8 --python=python3.8
```
`virtualenv <仮想環境の名前> --python=<pythonバージョン指定>`
--の部分はオプションなのでなくてもOKです。

仮想環境を開始します（env_3.8は自分用に置き換えて下さい。）
```
source env_3.8/bin/activate
```
仮想環境の中でpip installなどを行えます。（huggingface_hubパッケージの例）
```
pip install huggingface_hub
pip show huggingface_hub
```


仮想環境を終了します
```
deactivate
```

仮想環境でインストールしたパッケージが仮想環境の外では存在しないことを確認します
```
pip show huggingface_hub
```

https://www.python.jp/install/install.html

https://virtualenv.pypa.io/en/latest/user_guide.html
おすすめのVSCode拡張機能3選

# はじめに
こんにちは。新卒社員の寺田です。
この記事では私が実際に使用して見た目や操作感がよくなったVSCodeのおすすめ拡張機能を3つ紹介していきます。
新卒社員が学んだことみたいな記事を書こうと思ったのですが被りそうなので一旦ありきたりな記事でお茶お濁します。

# 1.Japanese Language Pack for Visual Studio Code
まず一つ目に紹介するのは「Japanese Language Pack for Visual Studio Code」です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3767944/8e247e07-fe57-e142-d9fd-eb8cec64f2da.png)
この拡張機能はVSCodeの言語を日本語に翻訳することができます。
この拡張機能を使用することで、私のような「pen」「pineapple」「apple」しか英語がわからない人間でもサクサク作業を進めることができ、VSCodeを使いこなすカッコイイ大人への第一歩を踏み出すことができます。

### 表示言語の選択方法
「表示」メニューからコマンドパレットを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3767944/e95cb023-8e4a-aee7-8129-e1efe5f4dbbd.png)

コマンドパレットに「display」と入力すると「表示言語を構成する」という選択肢が表示されるので選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3767944/58134ebc-0b1b-5cc8-3540-666bd4048b1e.png)

表示言語の選択画面が表示されているので使用したい言語を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3767944/0a06e547-cea8-a28e-4862-ddcf0b18e613.png)
以上の手順で表示言語の変更を行うことができます。

:::note warn
表示言語の変更にはVSCodeの再起動が必要です
:::



# 2.Prettier - Code formatter
二つ目に紹介するのは「Prettier - Code formatter」です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3767944/9650b8d2-7fc6-abc1-52c0-58ed9f567ce1.png)
この拡張機能はソースコードを自動で整形してくれるツールです。
ソースを保存すると自動で整形してくれるため、タブのサイズや位置、さらにセミコロンやシングルクォーテーションなども整形してくれるとってもいい子ちゃんです。

### 設定方法
左下の歯車マークをクリックして「設定」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3767944/156397c2-9aa8-88a3-934d-90ef9d3647c2.png)

検索欄に「save」と入力すると「Editor:Format On Save」が表示されるのでチェックを入れます。
こうすることで保存時に自動でフォーマッターが動くようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3767944/5148074d-fd6b-1e35-90ea-4eab614ef829.png)

以上がフォーマッターの設定方法です。
実際にコードを書くとデフォルトの設定では以下のように整形して見やすいコードにしてくれます。これには上司もにっこり^^
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3767944/a6defe95-2474-39d8-0eaa-36f65a5f1f8d.png)

タブサイズやセミコロンの有無設定等の詳細な設定は、プロジェクトのルート直下に「.prettierrc」ファイルを作成し、JSON形式で自分好みにカスタマイズして設定することができます。
そこまで説明する体力はないので気になる方は自分で調べなさい。



# 3.IntelliCode
最後に紹介するのは「IntelliCode」です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3767944/8a9ddb52-0210-9b92-3458-8ee753c57fef.png)
この拡張機能はコードのコンテキストに基づいたコード補完を行ってくれる機能です。
コード入力中に入力候補となるメソッドやプロパティがアルファベット順に出てくるだけでなく、IntelliCode は前後のコンテキストから多く使われるであろうものを自動的に上にあげてくれます。神ですよ。神。

### 使用方法
インストールしてコード書くだけです。以上。
本当にそれ以上でも以下でもないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3767944/3e248910-e526-c3bd-ffaa-1dcf0e6c80ce.png)



# おわりに
今回はどこにでもあるような記事でどこにでもおすすめされているメジャーな拡張機能を紹介しました。
こんなデザインも貧相な記事が誰かの救いになることを願っています。
最後までご覧いただきありがとうございました。
[Mac] 構成プロファイルの内容を見る方法

# この記事に書いてあること
企業においてApple製品を管理していると遭遇するものの一つに「構成プロファイル」がありますよね。この構成プロファイルの内容を見る手順を説明します。

# はじめに結論
```sh:ターミナルで次のコマンド入力します
$ security cms -D -i yourfile.mobileconfig -o output.plist
```
上記コマンドの結果生成されるファイル`output.plist`は、xml形式で書かれたベタテキストです。

# 詳細
構成プロファイル（拡張子は通常`.mobileconfig`が使われます）のフォーマットはrfc5652などで規定されている`Cryptographic Message Syntax (CMS)` というものです。ベタテキストではないので、内容を簡単には確認できません。
そんなときは、上記コマンドでCMS形式を変換してやります。
`security` コマンドは、キーチェーンをコマンドラインから操作する時によく出てくるコマンドですのでご存じの方も多いと思います。上記`cms`以外にもたくさんのサブコマンドがあります。より詳しい説明は、`man security`でマニュアルを参照してみてください。
【ChatGPT】3か国語で検索してまとめるPromptです。


　どうも、カーブミラーです。

　今回は、3か国語（日本語・英語・中国語）で検索してまとめるPromptです。

:::note info
本記事は、ChatGPT（有料版）
で行なっております。画像は
ありません。　あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)

***
　まずは、ニュース。

　昨日（2024/11/21）、
　　シンガポールで
　　　OpenAIのDevDayが
　　　　12:30から、開催されました。

　Realtime APIのデモ
　　パイナップル・タルトを注文
　　　このあと、200名に配布
　　インベーダーゲームを作って
　　　ゲームする
　ドローン操作のデモ
　　cursorを使用して
　　　o1-miniモデルで
　　　　ドローンをプログラミング。

　把握しているのは、
　　これだけです。

　何か出てきたら、
　　ニュースとして
　　　取り上げますね。
***
　次に、
　　AnthropicのClaudeに
　　　Googleドキュメントの
　　　　コンテンツを
　　　　　追加できるように
　　　　　　なりました。

　[Anthropic公式ポスト](https://x.com/AnthropicAI/status/1859663546830946494?t=FCxb7geD6OmplL79Zdis_w&s=19)
　DeepL翻訳
>Googleドキュメントのコンテンツをチャットやプロジェクトに直接追加できるようになりました。
>
>リンクを貼り付けるか、最近のドキュメントから選択するだけで始められます。
>
>Claude Pro、Team、Enterprise のすべてのユーザーに提供中です。

　無料版はないのね😭

　まぁ、いずれは
　　無料版にも来るかも。
***
　さて、本題です。

　今回は、
　　日本語・英語・中国語で
　　　検索してまとめるPromptです。

　こちらのもとは
　　こちらです。
　　　[木内翔大さんポスト](https://x.com/shota7180/status/1859741139831509377?t=djBNIvp8RpWySIMF3QLOpA&s=19)

　画像からOCRして
　　取り出したPromptはこちら。
```Text:3言語で検索するPrompt
OOについて日本語、英語、中国語の3言語で検索クエリを作成し、すべて検索してください。言語ごとの検索結果がわかるように全て日本語で出力してください。
```

　こちらを試したところ、
　　それぞれの言語での
　　　検索内容が出てきました。

　ですが、
　　英語も中国語も
　　　私、読めません😅

　そこで
　　読めるように
　　　翻訳して出してもらおうと
　　　　Promptをイジってイジって
　　　　　こねくりまわし、
　　　　　　ようやく出来ました。

　それがこちらになります。
　　＊＊＊に質問を入れてください。

　なお、ウェブ検索を使わずに、
　　Web接続していれば、
　　　そのまま使えます。

```Text:3か国語で検索してまとめるPrompt
質問=「＊＊＊」

0. 質問に関する情報を、日本語、英語、中国語で検索クエリを作成し、それぞれの国での検索してください。内容に違いがあるのが当然です。

1. 検索結果の提示
各言語で検索した結果をそのまま出力してください。
　※検索結果の言語は変更しないでください。

2. 情報のまとめ
各言語から得られた情報を基に、包括的に内容を要約し、まとめて日本語で出力してください。

注意事項：
・各検索結果を明確に区別してください。
・翻訳を含めた3つのステップを順番に実行してください。
・日本語、英語、中国語それぞれの検索結果は必ず保持したまま翻訳してください。
・最初からまとめて欲しくありません。
・手順を無視しないでください。
・ここにChatGPTの知識は不要です。
```

　いろいろと
　　試行錯誤した結果なので、
　　　余計な文言もあるかと思います。
　　　　すみません。

　0の最後の部分は
　　検索結果が日本語のものに
　　　引きずられているようだったので
　　　　入れました。

　注意事項の最後は、
　　検索結果以外が
　　　入り込んでいるように
　　　　感じたので、入れました。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
Proj #001 キャンバスアプリで支払申請のフォームを作成するゾ～第1回 空のアプリを作成しよう～

https://qiita.com/Novskiiiiiiiiii/items/ebb8a33970c2c49eeaaa

という事でさっそくキャンバスアプリを作成していきます。

「+ 作成」から「空のアプリ」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/9f217ec3-4547-8f29-556d-2dbca911c777.png)

「空のキャンバスアプリ」の「作成」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/e4e2aa67-c4a4-e2df-27eb-80a350698136.png)

キャンバスアプリの名称を決めて、形式を選択して作成をクリックします。
今回はPCでの申請を想定しているので、「タブレット」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/2b2d7e52-8189-cdc0-6df5-5cde35f29a8c.png)

「準備をしています…」と表示されます。数分待ちます。
いよいよ始まるぞ！という胸の高鳴りを感じますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/2fbda0ec-9f83-25ea-4a84-d5d5bc0a92ed.png)

さて、まっさらなキャンバスが起動しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/c46085f2-7295-e0eb-8ba7-4a6c73234f68.png)

次回はデータソースに接続していきます。

それではまた。

https://qiita.com/Novskiiiiiiiiii/items/194bf68d27100dd69e50
オーディオプレイヤーを作る DAY2

## はじめに
Pythonを使ったオーディオプレイヤ―の実装過程を順次投稿しています。
前回までの進捗は以下の通りです。

https://qiita.com/Jun-JP/items/ba0e131fb27f4e0e9031

## 今回実装した内容
* GUI
    * 特になし
* 機能
    * MP3ファイルの入力と再生
    * MP3ファイルからカバーアートなどのメタ情報を取得し、表示
 
## ソースコード

https://github.com/junpiyo/Simple-Audio-Player-with-Python/tree/main/Day2

##  環境
Windows11
Python3.12.7

## 動作イメージ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483587/8df063c5-7f8b-5986-ada5-624126905387.jpeg" width=60%>

音楽 [BGMer](https://bgmer.net)

## ソースコードの補足
### MP3ファイルの取り扱い
```python: simple_audio_player_ver0.2.py
    def _open_mp3(self, input_path:str):
        try:
            mp3_data = AudioSegment.from_mp3(input_path)
            framerate = mp3_data.frame_rate
            nchannels = mp3_data.channels
            samplewidth = mp3_data.sample_width
            frames = bytes(mp3_data.get_array_of_samples())
            
        except FileNotFoundError:
            print(f"Error: cannot find {input_path}")
            return None

        print(f"{input_path} has been loaded")
        print(f'{nchannels}ch {samplewidth * 8}bit {framerate}Hz')

        try:
            tags = ID3(input_path)
            print(tags.pprint())

            attached_picture_data = tags.get("APIC:").data
            cover_art = PIL.Image.open(BytesIO(attached_picture_data))
            artist = tags.get('TPE1')
            album = tags.get('TALB')
            title = tags.get('TIT2')
            return Audio(nchannels, samplewidth, framerate, frames), AudioTag(cover_art, album, artist, title)
        except:
            print("Error: cannot get any tags")
            return Audio(nchannels, samplewidth, framerate, frames), AudioTag(title=os.path.basename(input_path))
```
MP3ファイルのデコード処理には、[pydub](https://github.com/jiaaro/pydub)を使用しました。pydubはffmpegを利用したオーディオライブラリで、様々なフォーマットのオーディオファイルを取り扱うことができます。なお、[PyAuidio](https://people.csail.mit.edu/hubert/pyaudio/)で再生することを想定しているため、データ自体はbytes形式で保存してます。何らかな信号処理を行う場合は、numpy形式で取り扱うことになるのですが。

メタ情報の習得には、[mutagen](https://mutagen.readthedocs.io/en/latest/)を使用しました。mutagenはオーディオファイルのメタ情報に特化したライブラリで、それぞれのフォーマットに対応したメタ情報の読み書きができます。MP3には、ID3タグというMP3ファイルの中にメタ情報を書き込むための規格があり、アーティスト、曲名、カバーアートや歌詞といった様々な情報を格納することができます。mutagen.ID3を使えばID3タグを簡単に取得することができます。なお、ほしいメタ情報に応じたIDが必要になります。カバーアートならAPIC、タイトルならTIT2です。mutagen.EasyID3ならもっと簡単に取得可能ですが、カバーアートや歌詞は読み書きすることができないので注意が必要です。

## 備考
* オーディオファイルはWAVとMP3だけに対応
    * 他のフォーマットは次回以降に対応
* threadingあるいはmultiprocessingを使用していないため、あいかわらずオーディオを再生中にイベントループの処理が止まる。つまり、ポーズボタンを押しても停止させることができず、再生ボタン以外は意味をなしていない。強制終了以外に、アプリを終了すことすらできない
    * 次回以降に対応

## おわりに
次回に続きます。
Qiitaの作法やソースコードに関するアドバイス、質問などがありましたらコメント欄までお願いします。
Chromeが開けない場合のchatGPTの回答

質問
Windows pcでChromeが起動できませんでした。サイドバイサイド〜ようなエラーが出て起動ができません。
アンインストールして再インストールしても変わらず開くことができません。
業務で使用するため困っています。
予想できる原因、解決方法を教えてください

回答
Chromeが起動できず、「サイドバイサイド構成」関連のエラーが表示される場合、通常はWindowsのアプリケーション実行に必要なランタイムが欠落しているか、壊れている可能性が考えられます。この問題を解決するための手順を以下に説明します。

原因として考えられること

	1.	Microsoft Visual C++ 再配布可能パッケージの問題
ChromeはMicrosoft Visual C++ランタイムライブラリに依存しています。このランタイムがインストールされていない、または破損している場合、エラーが発生します。
	2.	Chromeインストールファイルの破損
アンインストール後も残存している設定ファイルやレジストリエントリが原因で問題が再発する場合があります。
	3.	Windowsシステムファイルの不具合
Windowsの構成に問題があり、正常にアプリケーションを起動できないケースがあります。

解決方法

以下の手順を1つずつ試して問題を解決してください。

1. Microsoft Visual C++ 再配布可能パッケージの再インストール

	1.	最新版のMicrosoft Visual C++ 再配布可能パッケージをダウンロードします。以下のURLから適切なバージョンを取得してください（Windowsのビット数に注意: 32bit/64bit）。
	•	Microsoft公式サイト
	2.	ダウンロード後、インストールを実行します。
	3.	インストールが完了したら、PCを再起動してください。
	4.	再度Chromeを起動して問題が解消されたか確認します。

2. Chromeの完全な再インストール

	1.	Chromeのアンインストール
	•	設定 > アプリからChromeをアンインストールします。
	•	アンインストール後、次のパスにある残存ファイルを削除してください：
	•	C:\Program Files\Google\Chrome
	•	C:\Users\<ユーザー名>\AppData\Local\Google\Chrome
	2.	Chromeの最新バージョンをダウンロード・インストール
	•	Chromeの公式サイトから最新版をダウンロードし、再インストールします。
	•	Chrome公式サイト

3. システムファイルの修復

Windowsのシステムファイルが破損している場合は、以下の手順で修復を試みます：
	1.	コマンドプロンプトを管理者として実行
	•	スタートメニューで「cmd」と入力し、右クリックで「管理者として実行」を選択。
	2.	以下のコマンドを順番に実行：

sfc /scannow

	•	システムファイルをスキャンし、修復を試みます。

DISM /Online /Cleanup-Image /RestoreHealth

	•	DISMコマンドを使用して、Windowsイメージを修復します。

	3.	修復が完了したら、PCを再起動し、Chromeを起動して確認します。

4. イベントビューアで詳細なエラーを確認

問題が解決しない場合、Windowsの「イベントビューア」でエラーの詳細を確認することで、さらなる原因が特定できる場合があります。
	1.	スタートメニューで「イベントビューア」と検索して起動。
	2.	「Windowsログ」 > 「アプリケーション」を選択。
	3.	Chromeに関連するエラー（サイドバイサイド構成）を探し、詳細な情報を確認。

5. 他のブラウザの使用を検討（暫定的措置）

業務で急ぎの場合、Chromeの代わりにMicrosoft EdgeやFirefoxなどのブラウザをインストールし、一時的に使用することも検討してください。

補足

これらの方法で解決しない場合、Windowsの再インストールや、さらに詳細なトラブルシューティングが必要になる可能性があります。業務の重要性を考慮し、ITサポート部門や専門家に相談するのも有効です。
HTMLとJavaScriptでカメラを起動してその映像をCanvasに表示する方法

# JavaScriptでのカメラ起動とCanvas表示

## カメラの起動

まずはコードです。

### HTML

``` html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>カメラ起動</title>
</head>
<body>
    <video id="video" src=""  width="300" height="300" playsinline></video>
</body>
</html>
```

1. HTMLはvideoタグを用意します
2. このときplaysinlineを指定することで画面内に表示できます

### Javascript

``` js
window.addEventListener('load', function(){
    //videoのstream
    let stream = null;
    //video設定値
    const constraints = {
        audio: false,
        video: {
            width: 300,
            height: 300,
            //フロントカメラの場合
            facingMode: 'user',
            //リアカメラの場合
            // facingMode: { exact: "environment" },
        },
    }
    //カメラ起動
    async function startCamera(constraints) {
        try {
            stream = await navigator.mediaDevices.getUserMedia(constraints);
            const video = document.getElementById('video');
            video.srcObject = stream;
            video.onloadedmetadata = () => {
                video.play();
            };
        } catch (err) {
            //エラーハンドリング
            console.error(err);
        }
    }
    //カメラ停止
    function stopCamera(){
        const video = document.getElementById('video');
        const tracks = video.srcObject.getTracks();
        tracks.forEach((track) => {
                track.stop();
        });
        video.srcObject = null;
    }

    //初期処理
    startCamera(constraints);
});
```
1. navigator.mediaDevices.getUserMedia(constraints)でデバイスにアクセスします
2. constraintsにvideoを指定することでカメラにアクセスでき、解像度とどのカメラを使うか指定します
3. 扱うときは非同期のためasync/awaitを使って制御します
4. 結果のstreamをvideoタグに詰めて、video.playで開始します
5. カメラを停止するときは逆にstreamを取得し停止します

## canvasに表示

上記でカメラで動画を映し続けていると思いますが、その動画をcanvasタグに常に表示させます。
追加部分のコードです。

### HTML

``` html
<canvas id="canvas" width="300" height="300"></canvas>
```

videoタグと同様にcanvasタグを用意します。

### Javascript

``` js
//canvas描画
function drawCanvas(){
    const canvas = document.getElementById('canvas');
    const context = canvas.getContext('2d');
    //videoエレメントを指定
    const video = document.getElementById('video');
    context.drawImage(video, 0, 0, canvas.width, canvas.height);
    requestAnimationFrame(drawCanvas);
}
drawCanvas();

```

1. canvasタグからcontentを取得します
2. context.drawImageでvideoタグを渡すことができますので渡すと勝手に表示してくれます
3. requestAnimationFrameに自身を渡すことで定期的(毎秒60回ぐらい)にループしてくれます

setIntervalでもできますが画面描画に関してはrequestAnimationFrameの方がよいとされています。
crontab と anacrontabの違い

`crontab` と `anacrontab` はどちらもスケジュールされたタスクを自動的に実行するための仕組みを提供しますが、設計目的と動作の仕組みが異なります。以下にその違いを詳しく説明します。

---

## 1. `crontab` の特徴

- **目的**: 指定した時刻にタスクを実行する。
- **動作の前提**: システムが指定した時間に起動している必要がある。
- **動作の仕組み**:
  - `crond`デーモンがバックグラウンドで動作し、指定された時刻にタスクを実行。
  - タスクが指定時刻に実行されなかった場合（例: システムがシャットダウンされていた場合）、そのタスクはスキップされる。
- **設定ファイル**:
  - ユーザーごとの`crontab`ファイル（`crontab -e`で編集）。
  - システム全体のスケジュールは`/etc/crontab`や`/etc/cron.d/`に配置される。
- **スケジュール指定**:
  `分 時 日 月 曜日 コマンド` 例: 毎日午前3時にスクリプトを実行
  ```
  0 3 * * * /path/to/script.sh
  ```
  ‌
- **使用場面**:
  - 時間単位、日単位などの定期タスクを正確に実行したい場合。

---

## 2. `anacrontab` の特徴

- **目的**: システムが指定された時間に起動していなくても、タスクが確実に実行されるようにする。
- **動作の前提**: システムが再び起動したときに未実行のタスクを実行する。
- **動作の仕組み**:
  - `anacron`デーモンがシステム起動時に未実行のタスクを確認し、実行する。
  - タスクが「最後に実行されてからの経過日数」を基に実行を管理。
- **設定ファイル**:
  - システム全体の設定は`/etc/anacrontab`に記述。
- **スケジュール指定**:
  `頻度（単位: 日） 遅延 実行識別子 コマンド` 例: 毎日スクリプトを実行
  ```
  1 5 daily-job /path/to/script.sh
  ```
  - `1`: 1日ごとに実行。
  - `5`: システム起動後5分の遅延を挟む。
  - `daily-job`: タスク識別名。
- **使用場面**:
  - システムが24時間稼働していない環境（例: デスクトップPCやラップトップ）で、定期タスクを確実に実行したい場合。

---

## 主な違い

| 特徴| crontab | anacrontab |
| --- | --- | ---|
| 目的| 時刻指定でタスクを正確に実行実行| 漏れのないタスク管理|
| 前提| 指定時刻にシステムが稼働している必要| システムが一時的に停止していても対応|
| 対象| サーバーのような常時稼働環境| デスクトップやラップトップなどの非常時稼働環境|
| 単位| 分単位で指定可能| 日単位で指定|
| スケジュール漏れ| スキップされる| 次回の起動時に実行|
| 設定ファイル| /etc/crontab, crontab -e| /etc/anacrontab|

---

##  使い分けの例

### **1.** `crontab`**を使う場合**

- システムが常時稼働している場合。
- 時刻指定が重要な場合（例: 毎日午前2時にログローテーションを実行）。

### **2.** `anacrontab`**を使う場合**

- ノートPCのように夜間はシャットダウンされる場合。
- タスクを確実に実行したい場合（例: 毎日バックアップスクリプトを実行）。

---

### **併用のポイント**

多くのLinuxディストリビューションでは、`cron`と`anacron`が共存しています。例えば、`cron.daily`, `cron.weekly`, `cron.monthly`ディレクトリに配置されたタスクが`anacron`経由で実行されることが多いです。これにより、常時稼働の環境でも稼働時間の限られた環境でもタスク管理が柔軟に行えます。
Proj #001 キャンバスアプリで支払申請のフォームを作成するゾ～プロローグ～

https://qiita.com/Novskiiiiiiiiii/items/b06ab0f33667f0e7e1f9

今回からしばらくシリーズものの記事になります。

実際にいま私がやっているプロジェクトの内容を記録していくので、
実録のドキュメンタリーとしてお楽しみ（？）ください。

簡単に業務プロセスの概要を書いておきます。

* １．各部門が受領した請求書をもとに、担当者が精算部門へ支払の申請をする
* ２．精算部門が内容を確認し、コンカーインボイスに連携する
* ３．コンカーインボイスから会計システムへデータを連携する

各部門の担当者が直接コンカーインボイスに登録すればいいんじゃないの？
と思う方がいるかもしれません。

かくいう私もそう思いました。

しかしどうやらなかなかそれが難しいというのが実情のようで、
精算業務専門の部門を作ってとりまとめて対応しよう、という背景があるようです。

このとりまとめの部分がボトルネックになっていて、
「Excelで管理していこう！」
という流れになり、以下のような業務プロセスが検討されました。

* １．各部門が受領した請求書をもとに、担当者が管理用Excelに支払情報を入力する
* ２．精算部門が管理用Excelを確認して、コンカーインボイス用のインポートファイルを作成する
* ３．コンカーインボイス用のインポートファイルを所定のフォルダに格納する
* ４．DataSpiderがインポートファイルをコンカーインボイスに連携する
* ５．コンカーインボイスから会計システムへ連携する


※DataSpider：セゾンテクノロジー社が提供するデータ連携用のソリューション

https://www.hulft.com/software/dataspider

このプロセスにおいて肝となるのが１および２に登場する管理用Excelで、
正しく内容が入力されていないと後続処理でエラーが出てしまいます。

それを防ぐために条件付き書式や入力規則、各種関数などで制御する必要があり、
その制限内容について白熱した議論がなされていたところに私が投入されました。

で、その制限ならMicrosoft Listsを使えば解決できますよ、という話を皮切りに、
以下のような業務プロセスを提案しました。

* １．各部門の担当者がキャンバスアプリで作成されたフォームに支払情報を入力する
* ２．入力して申請ボタンを押下するとPatch関数でMicrosoft Listsにアイテムが登録される
* ３．Microsoft Listsにアイテムが作成されたのをトリガーにPower Automateが実行される
* ４．Power Automateが精算部門に新規申請が来た事を通知する
* ５．精算部門の担当者が申請内容をMicrosoft Listsで確認し、適宜内容を修正して更新する
* ６．「精算部門承認」フィールドが「承認済」になったのをトリガーにしてPower Automateを実行
* ７．Power Automateが所定のShare Pointに連携用のファイルをcsv形式で作成する
* ８．作成されたcsvファイルをData Spiderで取得し、コンカーインボイスに連携する
* ９．コンカーインボイスから会計システムへ連携する

これを実現するために先月（2024年10月末）にキックオフを開催し、
私と精算部門のDX推進担当を中心にPower Platformをいじり倒しているのが現在の状況。

私はキャンバスアプリで申請用のフォームを作成する担当になったものの、
キャンバスアプリ初めてだったのでいろいろと検証した際にTipsとしてQiitaに残しておいたものが
Tips #001～#022になります。

今回はプロローグという事で前提のお話でしたが、
次回から実際にキャンバスアプリを作っていく過程を残していきます。

それではまた次回。

https://qiita.com/Novskiiiiiiiiii/items/9a542ef49b00ba18b60c
postgresqlで「PG::UndefinedObject: ERROR:  collation "ja_JP.utf8" for encoding "UTF8" does not exist」が出るとき

## 概要

本質的な原因や機構を正確に理解できていない状態で恐縮ですが、本エラーメッセージでGoogleやドキュメントを検索しても対策がみつからなかったため、どなたか（例：1週間前の自分）の助けになればと暫定対策ではありますが状況を共有します。

## 環境

Windows11 WSL2 Ubuntu 22.04.2 LTS
PostgreSQL 14.13 (Ubuntu 14.13-0ubuntu0.22.04.1)

## 現象

Railsにて、以下のようにカナでソートする際に以下のようにエラーが出現した。

```ruby
> Product.order(Arel.sql('name_kana collate "ja_JP.utf8"')) 
>-> ActiveRecord::StatementInvalid - PG::UndefinedObject: ERROR:  collation "ja_JP.utf8" for encoding "UTF8" does not exist
```

データベースの設定は以下の通り

```
postgres=# SHOW LC_COLLATE; 
 lc_collate 
------------
 C.UTF-8

 postgres=# SELECT datname, datcollate, datctype FROM pg_database WHERE datname = 'database';
  datname   | datcollate | datctype 
------------+------------+----------
 database | C.UTF-8    | C.UTF-8
```

OSのlocaleは下記の通りで ja_JP.utf8 は追加されている

```sh
postgres@pc:/home/pc$ locale -a | grep utf
C.utf8
ja_JP.utf8
```

## 暫定対策

以下のようにdatabaseごとにcollationを作成すると問題は解消した。

```sh
\c database;
CREATE COLLATION "ja_JP.utf8" (LOCALE = 'ja_JP.UTF-8');
```

railsの場合、テストDBと開発用DBそれぞれに実行する必要があるので要注意

（しかしこの結果は # show all; とかにも反映されていないようだし、mysqlにはある show collation のようなものも postgresql にはないのでなにがどうなったかわからない・・・。）

## 関連記事

公式ドキュメント
https://www.postgresql.jp/document/14/html/sql-createcollation.html

こちらの方のgistを参照させていただきました
https://gist.github.com/upinetree/9f643d02bdb8d245b66c

postgresのcollationについて概説
https://kiririmode.hatenablog.jp/entry/20230528/1685254374
機械学習とはをざっくりまとめてみる(備忘録)

## 機械学習とは
コンピュータが何百万もの大量のデータから学習して物事を判断できるようにすることです。

## 何を学習をするのか
物事のパターンや特徴を学習します。

## どんな方法で学習するのか
大きく、「教師あり学習」「教師なし学習」「強化学習」の3つの方法があります。

### 「教師あり学習」とは
コンピュータに対して「正解」のデータを提供することで学習させます。
この正解のデータを元にしてコンピュータが未知のデータに対しても予測や分類が行えるようになります。

例えば、「この画像は犬」「この画像は猫」というように画像データとそれはなにかという「正解」を与えて、未知の画像を見せたときにこれは犬なのか猫なのかを判断させることができるようになります。

ここでのポイントは入力データ(画像)とそれに対応する正解(犬or猫)があることです。

### 「教師なし学習」とは
正解となるデータが存在せず、提供されたデータを使って正解を導き出す学習方法が「教師なし学習」です。
提供されたデータそのものが持っている特徴や構造を分析します。

大量のデータのグループ分けなどが得意です。

例えば、顧客の行動データから似た顧客の行動パターンの顧客を見つけ出して分類かし、その顧客に向けたキャンペーンを打つなどマーケティング分野などで使用されます。


### 「強化学習」とは
AIが出した出力に対してスコアを出し、そのスコアが将来的に最大になる処理方法を学習させます。

## まとめ
これらの学習方法を用いてコンピュータが物事を学習したり判断、分析することが機械学習です。
MySQL - ユニーク制約のバイト数超過エラーの対策 : Specified key was too long; max key length is 3072 bytes

# 原因

ユニーク制約をつけるカラムの合計長が一定を超えると、このエラーが出るみたいだ

# 対策

ユニーク制約に関わるカラムの長さを短くすれば良い模様

- カラムA ( `VARCHAR(255)` -> `VARCHAR(100)` )
- カラムB ( `VARCHAR(255)` -> `VARCHAR(50)` )

...

みたいな


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
__pycache__を一括で削除する

Pythonを使ったことのある人であれば見覚えがあると思います `__pycache__`。

これといって何か悪さするわけでもないですが私のような潔癖症は消したくなるんですよね

以下のコマンドで実行時のディレクトリの中の全ての `__pycache__` を消去できます:

```bash
find . -name '__pycache__' -type d -exec rm -r {} +
```

ミスなどあればコメントや編集リクエストにどうぞ。
Gamelight、最新のAppsFlyerパフォーマンスインデックスで日本および韓国のカジュアルゲーム分野でトップ2にランクイン

AI搭載のモバイルゲーム向けユーザー獲得プラットフォーム「Gamelight」が、最新のAppsFlyerパフォーマンスインデックスで世界No.1のリワードメディアソースに選ばれ、特にアジア市場で顕著な成果を挙げています。日本と韓国という世界有数のモバイルゲーム市場において、Gamelightはカジュアルゲーム分野で全メディアソース中トップ2のランキングを達成しました。この栄誉は、Gamelightの急成長と、アジア市場でのモバイルマーケティングにおける強力な影響力を証明するものです。

![cover_1k.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784576/a89c82d7-ac8f-dc2b-d98a-989aad197329.jpeg)

### 日本と韓国のカジュアルゲーム市場における支配的な地位

AppsFlyerパフォーマンスインデックスは、毎年トップパフォーマンスを誇るメディアソースをランキングする業界標準の指標です。Gamelightが日本と韓国のカジュアルゲーム分野でトップ2入りしたことは、このプラットフォームが両市場のゲームパブリッシャーのニーズに合わせた柔軟な対応力を持つことを示しています。Gamelightの高度なAIアルゴリズムにより、パブリッシャーはエンゲージメントが見込まれるユーザーとつながりやすく、リテンション率やライフタイムバリュー(LTV)の向上が期待できます。

この日本と韓国での成果は、Gamelightにとって大きな転換点であり、アジアにおける同社の存在感を強化するとともに、トップクラスのモバイルマーケティングプラットフォームとしての成長をさらに後押ししています。日本と韓国での戦略的な展開を通じて、Gamelight は、リワード型ユーザー獲得(UA)戦略を多様なゲーミング文化に適応させ、高品質な結果を提供する能力を実証しています。

### リワード型UAにおけるGamelightの影響力 ###

Gamelightは、リリース以来、リワード型UAを従来の補助的なチャンネルから主要な戦略へと進化させる役割を果たしてきました。特に革新的なAIアプローチにより、ユーザー行動や嗜好を詳細に分析する強力なAIアルゴリズムを駆使し、ターゲットを絞った効果的なキャンペーンを展開しています。このAIによる精密なターゲティングは、ユーザーが最も楽しめるゲームとマッチングし、リテンション率を高め、LTVを最大化します。

Gamelightは、広告費回収率(ROAS)、長期的なリテンション、ライフタイムバリュー(LTV)といった主要なパフォーマンス指標(KPI)を優先することで、常に優れた成果を上げています。これにより、パートナーはユーザー獲得と収益成長において競争優位性を得ることができます。

また、同社の影響力により、iOS市場でのリワードマーケティングの存在感も拡大し、他社がグローバル市場で同様の戦略を採用するきっかけとなっています。

共同創業者Günay Azer：「アジアにおける当社の影響力はますます強まっており、今回の受賞は私たちがモバイルマーケティングのリーディングプラットフォームとして確立していることの証です。今後も日本と韓国のパブリッシャーに革新的なソリューションを提供していくことを楽しみにしています。」

![Quote_1k.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784576/a4831416-f3f9-cea3-6d34-1167944bda04.jpeg)

### 総括:日本と韓国のモバイルマーケティングにおけるリーダーとして
日本と韓国でカジュアルゲーム分野におけるトップ2にランクインし、世界でリワード型メディアソースNo.1の地位を確立したGamelightは、アジア市場でトップクラスのモバイルマーケティングプラットフォームとしての地位を確立しました。リワード型UAが進化を遂げる中、Gamelightのアジアでの影響力は、パブリッシャーが高品質なユーザー獲得を大規模に実現できるよう支援し、活況を呈する地域のモバイルゲーム市場で今後の成功を見据えています。



Gamelight の詳細については、ホームページをご覧ください: https://www.gamelight.io
rubyXLで警告「WARNING: RubyXL::Workbook is not aware how to process RubyXL::SheetMetadata」が出るのを抑止する

## 概要
RUby on RailsなどでExcelファイルを扱う便利 Gem でExcelファイルを開くときにWarningが出る場合があります。調べても情報がなく対策しにくいですが、警告抑止用のグローバル変数を用いて停止できます。

## 詳細
RUby on RailsなどでExcelファイルを扱う便利 Gem でExcelファイルを開くときにこのような警告が出る場合があります。

>WARNING: RubyXL::Workbook is not aware how to process RubyXL::SheetMetadata

これは、Microsoft365で最新のExcelを保存した際にも出て、作成者などの情報を削除しても出て、直接の原因はわかりません。Excelシートの操作などは問題なくできるため、metadataが重要ではない場合には、テストなどで出力されるとログもみにくくなるため抑止することも選択肢のひとつです。

initializeや利用時に以下のようにグローバル変数をセットすることで警告を抑止できます。

```
RubyXL.class_variable_set(:@@suppress_warnings, true)
```

ここのコードをたどって警告出力箇所を探し、発見しました。

https://github.com/weshatheleopard/rubyXL/blob/master/lib/rubyXL/objects/relationships.rb#L208

## 環境

https://rubygems.org/gems/rubyXL?locale=ja

rubyXLのバージョンは2024/11/22時点で最新の 3.4.27 です。
「もっと見る」ボタンを持つ無限スクロールの一覧画面から詳細画面に遷移して一覧画面にバックしたら一覧画面の元の位置に戻りたい

# 元の位置に戻れなくなる理由
もっと見るを押して一覧表示件数が増えたことで初期表示時より縦長な画面に変わっているのに、バックした際には初期表示時の表示件数に減っていて元の場所の座標が存在しなくなっているから
(元の場所の座標が存在していればブラウザがそこまでスクロールしてくれる)

# 対策
一覧画面を、URLパラメータに「表示件数」が指定されていたらその件数分表示する、ように作っておく
(指定されていなかったらデフォルト件数(10件等)を初期表示件数とする)

一覧の最下部のもっと見るボタンを押した際に一覧表示件数が増えるので、最新の表示件数を現URLのパラメータにセットしておく
```JavaScript
// もっと見る押下時にブラウザのアドレスバーのURLに最新表示件数パラメータをセット
const locationUrl = new URL(location.href); // 現URL
locationUrl.searchParams.set('＜表示件数パラメータ名＞', ＜最新の表示件数＞);
history.pushState({}, '', locationUrl); // ブラウザのアドレスバーが書き換わる
```

これをやっておくと、詳細に遷移してから一覧にバックした際に表示件数パラメータ付きのURLにバックするので、詳細遷移直前の表示件数すなわち縦長な画面が復元される

iPhone Safariだとうまく行かないことがあるらしい
その場合でもGoogle検索結果ならうまくいくので何が違うのかは調査未
224日目 (やらかし)初めてシステム開発をした社畜L

## 🔍はじめに
今月から初めてのシステム開発を始めました。
やってみるとわからないことだらけで、ほんとうに大変だったのでやったことを書いていきます。

## 🔍やったこと
1. **ツール入れる**
    今回導入したのは VSCodeの拡張に
    ・Docker, PHP Extension Pack, PHP Intelephense
    などなどPHP関連の拡張機能を導入しました
    <br>
2. **ほかの人の画面を真似る**
    今回は途中参加だったので、一旦ファイルをコピーして同じ画面を表示できるようにしました
    そうすることで一番最初の壁、どうやったら画面に出るんだろう問題を解決できました
    そのあとその中身を変更する感じで…
    <br>
3. **とにかく聞く**
    正直自分で考えて調べられるレベルではなかったです
    自分で調べるって言ったってなにを調べれば作業が進むのかもわからない…
    開き直っているみたいですが、何から始めるべきか聞くしかなかったです


## 🔍やらかし
1. **レビューアの観点を知らずに思い込みで開発をしていた**
    「レビューアは、指示書/設計書に沿ったプログラムであるかどうかをチェックしている」ということを理解せずに開発していました
    そのため、自分の作業が指示書/設計書とずれていることに気づけず無駄な作業を続けて、スケジュールにも大幅な遅れを発生させてしまいました

## 🔍どうすればよかったのか  

1. **レビューアの観点は事前に知っておく**
    当たり前なのかもしれませんがこれだと思います。
    やらかしの一番の原因は、指示書/設計書に沿った実装をしようとする働きが足りなかったことだと思います。
    指示書/設計書に沿った実装を積み重ねるようにしていれば、もっとスムーズに作業ができたと思います
    <br>
2. **ツール、拡張は先輩方と同じものを導入する**
    様々な相談をするときに、利用しているツールや拡張が違うと教えずらくなってしまう、
    同じものを導入するべきでした

## 🔍まとめ
今回ははじめてのシステム開発でつまずいたりやらかしたりしたことについて書きました
なにもわからない状態からのシステム開発は大変だと身をもって体感しました。
今後はもう少しスムーズに作業できるよう努めたいです
【Appsheet】「Column1もしくはColumn2のどちらかに登録されている」という条件でフィルターをかける方法

# 【Column1もしくはColumn2のどちらかに登録されている」という条件でフィルターをかける方法

Appsheetを使って小売店同士での商品のやり取りを管理しています。

例えば店舗Aで余ってしまった商品を店舗Bに送る場合
店舗A＝Column1（カラム名：出荷元店舗）
店舗B＝Column2（カラム名：集約先店舗）
という形でデータを登録しています。

店舗Aが出荷元もしくは集約先のどちらかに登録されているデータに絞って検索したいとき
Column1で店舗Aを選択して検索、Column2で店舗Aを選択して検索とそれぞれで検索すると手間なので、**「Column1もしくはColumn2のどちらかに登録されている」** という条件で一気にフィルターをかけたいと考えました。


## 1. 検索用のバーチャルカラムを作成
フィルター側の設定はカスタマイズできなさそうだったので、検索用のバーチャルカラムを作成します。

## 2. バーチャルカラムの設定
Column name：わかりやすい名前を付ける
App formula：以下の通り入力
`list([出荷元店舗],[集約先店舗])`
Type：EnumList
Item separator：「,」

![画像25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939758/d694ee8a-439e-ae34-d47c-9f8cf8a2c625.png)

## 3. 検索対象（Search?）にチェックを入れる
フィルターに新たに作成したバーチャルカラムが表示され、出荷元か集約先どちらかに登録されているという条件でデータを絞ることができるようになりました。
PowerShellがルーチンワークから解放してくれた件

# 概要
ある日、サーバのドライブが空き容量ゼロになり、本番システムが一部停止してしまう。
管理しているサーバすべてのドライブ空き容量が残りわずかになっていないか
毎日確認してくださいと指示されてしまう。

~~毎日は面倒~~ 単純作業PCにやらせたいと考え、自動化に至る・・・

# 補足
自動化で有名な言語として Python があげられるが、
Python のインストール作業する手間があるため、
最近のWindowsOSでは標準装備となっている PowerShell を使用することに決めた。

# 前提
PowerShellのバージョンは、5.1 です。

```
PS D:\> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.19041.5129
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.19041.5129
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
```

# PowerShellコマンド

```daily-drive-check.ps1

# 配列で対象とするPCを指定
$PCLIST = @(
# 対象にしたいPC名またはIPアドレスを指定してください。
"","",""
);

# 対象サーバ一覧の分だけループ・・・
foreach($str in $PCLIST){
    #リモート先PC接続とドライブ取得
    $result = Invoke-Command -ComputerName $str -ScriptBlock {
        # 検索対象のドライブを取得（DVDマウントされてるものは除外）
        $drives = Get-PSDrive -PSProvider FileSystem | Where-Object { $_.Used -ne $null -and $_.Free -ne $null }
        foreach($drive in $drives){
            $freeSpaceGB = [math]::round($drive.Free / 1GB, 2);
            if ($freeSpaceGB -le 5) {              
                # 空き容量が5GB以下の場合に警告を表示
                $result = ($result + "`r`n  警告: " + "${drive}ドライブの空き容量が残り ${freeSpaceGB} [GB] です！");
            } else {
                # 空き容量が5GBより多い場合
                $result = ($result + "${drive}ドライブ: ${freeSpaceGB} [GB]`t");
            }
        }
        # Invoke-Commandの中ではスコープが隔離されるので、returnで渡すことになる。
        return $result;
    }
}
```

# メール送信コマンド
```daily-drive-check.ps1
#メール送信用のパラメータ定義
$MailParam = @{
         SmtpServer = $SmtpServer;
         port = $port;
         From = $from;
         To = $to;
         Subject = $subject;
         Body = $body;
         Encoding = [System.Text.Encoding]::UTF8;
       }
#メール送信
Send-MailMessage @MailParam;
```

# タスクスケジューラに設定
バッチファイルと比べて少し面倒だった。
操作：プログラムの開始
プログラム/スクリプト：（powershell.exeの絶対パス)
引数の追加：-Command "(作ったps1の絶対パス)"   ※ダブルクオーテーションで囲む

:::note info
powerShellのウィンドウを非表示にしたい場合：
セキュリティ オプション
「ユーザーがログオンしているかどうかにかかわらず実行する」を選択する。
:::

# 結果
とりあえず出社時間の10分後くらいに自動で実行するように
自PCのタスクスケジューラに組んだのでこれで完璧！

めっちゃ快適になった。
もっと色々なことに使ってみたい。

# 懸念
PowerShell使うと色々な処理ができてしまうため、安全性が気になるところ。
LeetCodeを1日1題解いてみる (day23)

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

# 111. Minimum Depth of Binary Tree

https://leetcode.com/problems/minimum-depth-of-binary-tree/description/

## 問題文
Given a binary tree, find its minimum depth.

The minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node.

Note: A leaf is a node with no children.

## 僕の回答
```py
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def minDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        depth_left = self.minDepth(root.left)
        depth_right = self.minDepth(root.right)
        if depth_left == 0:
            return depth_right + 1
        elif depth_right == 0:
            return depth_left + 1
        return min(depth_left, depth_right) + 1
```

## より効率の良い回答例

```py
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def minDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        
        q = deque([root])
        level = 0

        while q:
            level +=1
            for i in range(len(q)):
                node = q.popleft()
                if not node.left and not node.right:
                    return level
                if node.left:
                    q.append(node.left)
                if node.right:
                    q.append(node.right)        
        return level        
```

## コメント
pythonの`deque`は今回初めて知りました。初め見たときは、「enqueue」「dequeue」の取り出すという意味なのかなと思ったが、実際は型だということがわかりました。
こちらの記事を読み勉強しました！
https://note.nkmk.me/python-collections-deque/

## 次の問題はこちら!
https://qiita.com/h_y_s_d/items/c3f28f5881a6711aac10
Windows メモリダンプファイルの解析

ダンプファイルの解析を行う機会があったので備忘録です。

## 使用ツール

[Windows SDK（Software Development Kit）](https://developer.microsoft.com/ja-jp/windows/downloads/windows-sdk/)
Windows SDKとは、Microsoftが無料で公開しているWindowsアプリケーション開発キットです。
色々機能がありますが、今回はデバッグ用の機能を使用して解析を行います。


## 解析手順

### -ダンプの読み込み
WinDbgを開き
File > open crash Dump > ダンプファイルの選択

### -解析
ダンプファイルの読み込みが完了すると、一番下に以下の文字列が表示されます。
"!analyze -v" をクリックすると解析を行ってくれます。

```
For analysis of this file, run !analyze -v
```
解析されたデータは英語で出てくるので拒否反応が出ますが、根気よく読みましょう。
大体、以下のように怪しい場所を教えてくれます。

[例]
```
NMI_HARDWARE_FAILURE (80)
This is typically due to a hardware malfunction.  The hardware supplier shouldbe called.
~~~中略~~~
MODULE_NAME: xxxxxxx
 
IMAGE_NAME:  xxxxxxx

```
## 終わりに
メモリダンプ解析ではあくまでも原因のモジュールなどが分かるだけで、直接解決できるツールではありません。
シスログ等総合的に加味して原因究明するよう心掛けたいです。
CUEって何？

## はじめに
[TRIAL＆RetailAI Advent Calendar 2024 ](https://qiita.com/advent-calendar/2024/retail-ai) の 24日目の記事です。

https://qiita.com/advent-calendar/2024/retail-ai

昨日は@takudooonさんの[🎄X'masにRustで南無阿弥陀仏🙏](https://qiita.com/takudooon/items/019581f3eff853004841)という記事でした。
Rustで動くマイコンを使って仏教音楽を流すという記事でしたが、選曲が気になりますね。
組み込み開発は疎い方ですが、自分で何か動くモノを作ってみるのは楽しそうだと思いました。本日はCUEについて、ざっくりと紹介していきたいと思います。

## CUEとは？
簡単にいうと**言語**です。データの構造や設定、仕様を定義するための言語だそう。

https://cuelang.org/

## 特徴は？
CUEの特徴を以下に記述します。
- 宣言的なデータ定義
データの構造を宣言的に定義できます。
- データの検証
データが期待する形式やルールに従っているかを検証できます。
- バージョン管理
データ定義のバージョン管理を簡単に行うことができます。
- 型推論と柔軟性
CUEは型推論を行い、柔軟なデータ構造を定義できます。

CUEは、特に構成管理や設定のテンプレート化、マイクロサービス環境などでのデータ構造の管理に有用です。

## 書いてみよう
CUEの記述方法はシンプルで直感的です。以下にいくつかの基本的な例を示します。
- 基本的なデータ定義
例えば、以下のように簡単な構成を定義できます。
こちらの例はスキーマ定義になりますが、具体的な制約を加えることも可能です。
```person.cue
person: {
    name: string
    age:  int
    active: bool
}
```
- データの検証
CUEでは、データが期待する形式に従っているかどうかを検証できます。
```person.cue
person: {
    name:  string & >0   // 名前は0文字以上
    age:   int & >=18    // 年齢は18歳以上
    active: bool         
}
```
- デフォルト値の設定
```person.cue
person: {
    name: string
    age:  int | 30 // デフォルトで30歳
    active: bool
}
```
- データの統合
データ定義を統合することも可能です。

```person.cue
// 同じフィールドが異なる場所で定義されている場合
person: {
  age: 30       // 1つ目の定義
  name: "John"  // 1つ目の定義
}

person: {
  age: 30       // 2つ目の定義 (一致)
  name: "John"  // 2つ目の定義 (一致)
}

person: {
  height: 180   // 身長
  weight: 75    // 体重
}

```
データの統合ができていることを確認するために、以下のコマンドで上記のファイルをJSON形式で出力します。

:::note info
```cue```コマンドはHomebrewでインストールしました
:::

```zsh
cue export person.cue --out json
```

出力結果
```
{
    "person": {
        "age": 30,
        "height": 180,
        "name": "John",
        "weight": 75
    }
}
```

## CUEの中核概念
CUEのロジックについて、一部紹介したいと思います。
(トップダウンの理解と参照枠を得るのに役立ちますが、言語の習得には必要ありません)

- Types are values
どういうことかというと、型も値と同じということです。
- The Value Lattice
型と値の関係を階層（格子）として捉え、統合や比較を行います。
この格子構造の論理が、スキーマ定義と制約を同時に行う基盤となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924376/dedf7edf-9b34-f869-87f5-ab57bf67ff0f.png)

## 補足
### CUEにおける「制約」の役割
CUEの制約は、単なる「入力データの検証」に留まらない。

- 型＋制約 = スキーマ定義
型と制約を同時に定義できる。これがCUEの強みである。
例：value: int & >0 & <=100
→ これは「整数かつ0より大きく100以下」という制約を型に組み込んでいる。
- 制約 = データの期待値を示す
データがどのような条件を満たすべきかを表現する。
→ つまり、これを使って「データがスキーマに合致しているか？」を検証することができる。

### 「バリデーション」との違い
CUEの「制約」は、通常のバリデーションよりも 宣言的 に表現される。
- 通常のバリデーション： 
データを受け取り、コードで条件を確認する（命令的）
- CUEの制約： 
スキーマに制約を組み込むことで、検証とデータモデリングを同時に行う（宣言的）

##  まとめ
CUEは、データ構造の定義と検証を効率化する宣言的な言語です。
型と制約を一体化して管理でき、統合や整合性チェックもシンプルに行えます。
「設定ファイルの複雑さを減らし、保守性を上げたい」という方に最適なツールです。
CUEでできることは色々あるみたいなので、気になったものを以下にまとめます。

- Protobuf を CUE に変換する
- Kubernates の制御
- Terraform のプランポリシーの作成

https://cuelang.org/docs/integration/

この辺で「CUE を使って何かしらやってみた」系で記事を書こうと思ったのですが、Kubernates やTerraform はGCP やAWS のアカウントが必要だったので見送りました。
興味がある方は、ぜひ試してみてください。

## さいごに
明日は@10longさんの「leanによる定理証明AIエージェント遊戯」という記事になります。
お楽しみに〜

RetailAIとTRIALではエンジニアを募集しています。
興味がある方はご連絡ください！

https://hrmos.co/pages/trialgp/jobs?category=2020003768196907008

https://www.recruit-retail-ai.jp/
【Appsheet】ビューに表示するデータの表示方法をカスタマイズする

# 項目をアプリに表示させるときに、カスタマイズして表示する方法

小売店で使用するお客様からのご意見管理アプリを作成しています。
電話、メール、GoogleMapなどからご意見が届くので、「利用ツール」というカラムを作って、どこから届いたものであるのかを管理しています。
「利用ツール」カラムをそのままビューに表示させると以下の赤枠のようになりますが、「メール」だけだとなんのことかわかりにくいため「メールからの口コミ」などぱっとみてわかりやすい表示方法にしたいと考えました。

<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939758/5ed47313-484b-82c2-a37c-e92cea2c5a51.png">


## 1. バーチャルカラムを追加
「利用ツール 表示用」などわかりやすい名前を付ける

## 2. App formulaを入力
以下の通り入力
```
[利用ツール]&"からの口コミ"
```

![画像14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939758/effcc731-371d-5836-57b0-d0fb2200e4c7.png)

## 3. 完成！
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939758/4c9138a0-02ba-9e7c-2a64-fb4ec801ffa6.png">



メモ：
ビュー側はあまりカスタマイズできなさそうなので、表示用の項目を作ることで対応しました
【chatGPT 対話備忘録】JSONとは何か

# 私：JSONとは

# ChatGPT:

**JSON（JavaScript Object Notation）**は、データの保存や送受信に使用される軽量なデータ交換フォーマットです。JSONはテキスト形式であり、機械可読性が高く、かつ人間にも比較的読みやすい形でデータを表現します。

特徴
軽量

テキストベースのシンプルな構造で、データ交換に適しています。
可読性

人間が理解しやすい構造で、デバッグや編集が容易です。
広い互換性

JavaScript以外の多くのプログラミング言語で利用可能なライブラリやツールが提供されています。
汎用性

クライアントとサーバー間のデータ通信、設定ファイル、APIレスポンスなど、様々な用途で使用されます。
基本構造
JSONは以下の2つのデータ構造を基本として構成されます。

オブジェクト（Object）

{キー: 値} のペアでデータを表現します。
例:

```:json

{
  "name": "John",
  "age": 30,
  "isStudent": false
}
```
配列（Array）

値のリストを表現します。
例:
```:json

[
  "Apple",
  "Banana",
  "Cherry"
]
```
データ型
JSONがサポートするデータ型は以下の通りです。

文字列（String）: "text"
数値（Number）: 123, 45.67
オブジェクト（Object）: { "key": "value" }
配列（Array）: [value1, value2]
真偽値（Boolean）: true, false
null: null
使用例
APIのレスポンス
```:json

{
  "status": "success",
  "data": {
    "id": 101,
    "name": "Jane Doe",
    "email": "jane.doe@example.com"
  }
}
```
設定ファイル
```:json

{
  "appName": "SampleApp",
  "version": "1.0.0",
  "theme": {
    "color": "blue",
    "fontSize": 14
  }
}
```
主な用途
Web APIのデータ交換フォーマット（REST APIやGraphQLなど）。
アプリケーション設定（構成ファイル）。
データ保存（小規模なデータベースやキャッシュ）。
フロントエンドとバックエンド間の通信。
JSONはプログラミング言語に依存しない汎用フォーマットであり、多くのシステムで標準的に採用されています。
クラウド・アプリケーション（クラウド型BI等）から Autonomous Database に直接接続する方法

# はじめに
Oracle Cloud では、自律型データベース Autonomous Database(ADB) があります。これは、インターネットからも Oracle Cloud内部ネットワーク VCN からもアクセスすることができます。ADBにお使いのユーザーのなかには、クラウド・アプリケーション（クラウド型BI、Azure の Microsoft Power BI, Tablew Cloud等）から、直接、ADBに接続したい要件もあるかと思います。クラウド側アプリケーションでは、ADBのウォレットを設定して mTLS接続することができない場合もあり、アプリケーションによってはブリッジを経由してパッシブ接続（クライアントからサーバーへの接続）して接続できる場合もありますが、ブリッジを介しての接続では、ホップ数が増えることで、遅延や障害の懸念が大きくなります。ですので、ウォレット無しのTLS接続をしたい場合があるかと思います。
この記事では、クラウド側アプリケーションからADBにTLS接続する方法をご紹介します。

# 1.クラウド・アプリケーションのIP範囲の確認
データソース側が認証するため、クラウド・アプリケーションでは使用する接続元IPアドレス範囲を公開している場合が多いです。ですので、あらかじめ、クラウド・アプリケーションで使うIPアドレス範囲（CIDR）をメモしておきます。
参考として、Power BI サービス、 Tableau Cloud、Qlik Cloud、QuickSight のIPアドレス範囲のリンクを掲載します。
[Azure IP Ranges and Service Tags – Public Cloud](https://www.microsoft.com/en-us/download/details.aspx?id=56519)
[Azureの参考サイト](https://jpbap-sqlbi.github.io/blog/powerbi/pbi_pbiservice_network/)
[Authorize Access to Cloud Data Published to Tableau Cloud](https://help.tableau.com/current/pro/desktop/en-us/publish_tableau_online_ip_authorization.htm)
[Qlik Cloud](https://help.qlik.com/ja-JP/cloud-services/Subsystems/Hub/Content/Sense_Hub/Introduction/qlik-cloud-dns-ip.htm)
[Amazon AWS リージョン でサポート QuickSight](https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/regions-qs.html)

# 2.ADBのネックワーク・アクセスの設定
ADB の管理コンソールで、「その他のアクション」からネットワーク・アクセスの構成で、「許可されたIPおよびVCNのみからのセキュア・アクセス」にし、アクセス制御の構成で、ホワイトリスト（許可リスト）として、CIDRブロックの設定で、クラウド・アプリケーションのCIDRを入力します。

![スクリーンショット 2024-11-18 142829.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3112379/bb6c4ca9-c89c-c836-7026-4954404f0403.png)

ADBをプライベート・エンドポイントに配置した場合、拡張オプションの表示して、「パブリック・アクセス」を許可をチェックして、同様に、CIDRブロックを設定します。

![スクリーンショット 2024-11-18 142850.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3112379/7e2e0aad-f582-62fa-d73b-b022a361a8f1.png)

# 3.ADBへのTLS接続
ADB の管理コンソールで、「接続」から接続文字列で、TLS認証をTLSにすると、TLSの接続文字列が表示されますので、その文字列をクラウド・アプリケーションのデータソース接続に設定すれば、ADBに直接接続できると思います。
![スクリーンショット 2024-11-18 154919.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3112379/036a42fe-136c-cabf-e5f3-8ff015d119ba.png)

# 4.さいごに
ADBのACL（アクセス・コントロール・リスト）を使い、TLS認証で、クラウドアプリケーションからインターネットを通じて、直接接続する方法の紹介でした。Oracle Cloud には、Oracle Analytics Cloud(OAC) というBIツールもあり、同じOracle Cloud 上にあるので、高速にADB接続できますので、OACも検討いただければ、幸いです。
【Go】スライスに要素を追加する処理のベンチマークテスト比較


## 概要


スライスに要素を追加する**append**と**インデックスを直接指定する方法**のパフォーマンスが気になったので、ベンチマークテストの比較を行ってみた。


## 環境

- MacBook Air M1 メモリ16GB、go 1.23.0

## 計測方法

- `[]int`型のスライスに10,000,000回要素を追加する処理のベンチマークテストを実施

## サンプルコード


```go
package main

import "testing"

const size = 10000000

// ベンチマーク関数: append の場合
func BenchmarkAppend(b *testing.B) {
	b.ReportAllocs()
	for i := 0; i < b.N; i++ {
		var slice []int
		for j := 0; j < size; j++ {
			slice = append(slice, j)
		}
	}
}

// ベンチマーク関数: slice[i] = int の場合
func BenchmarkIndexAssignment(b *testing.B) {
	b.ReportAllocs()
	for i := 0; i < b.N; i++ {
        slice := make([]int, size)
        for j := 0; j < size; j++ {
            slice[j] = j
        }
    }
}
```


## 計測結果


```go
goos: darwin
goarch: arm64
pkg: performance
cpu: Apple M1
BenchmarkAppend-8            40	  29059970 ns/op	492000713 B/op  51 allocs/op
BenchmarkIndexAssignment-8  264	   4503033 ns/op	80003085 B/op	   1 allocs/op
PASS
ok  	performance	3.679s
```


※ベンチマークテストでは内部で複数回の計測を実施しており、テストを数回実行しても結果のばらつきはほとんどなかったので1回分のみを記載


### append(BenchmarkAppend-8)

- **実行回数**: 40回
- **平均実行時間**: 29,059,970 ns/op（約29.1ms/1回）
- **メモリ使用量**: 492,000,713 B/op（約492MB/1回）
- **メモリアロケーション回数**: 51回

### インデックス指定(BenchmarkIndexAssignment-8)

- **実行回数**: 264回
- **平均実行時間**: 4,503,033 ns/op（約4.5ms/1回）
- **メモリ使用量**: 80,003,085 B/op（約80MB/1回）
- **メモリアロケーション回数**: 1回

### 比較


|                  | append                       | インデックス指定                   |
| ---------------- | ---------------------------- | -------------------------- |
| **実行回数**         | 40回                          | 264回                       |
| **平均実行時間**       | 29,059,970 ns/op（約29.1ms/1回） | 4,503,033 ns/op（約4.5ms/1回） |
| **メモリ使用量**       | 492,000,713 B/op（約492MB/1回）  | 80,003,085 B/op（約80MB/1回）  |
| **メモリアロケーション回数** | 51回                          | 1回                         |

- **実行回数**
	- `インデックス指定`は`append` と比べて実行回数は **約6倍多い**
- **実行時間**
	- `インデックス指定`は`append` と比べて実行速度が **約6倍速い**
- **メモリ使用量**
	- `インデックス指定`は `append` の **約6分の1** のメモリ使用量
- **アロケーション回数**:
	- `インデックス指定` は最初に要素数分のメモリを確保するので **1回** のみ

## 結論

- 今回の計測方法ではインデックス指定の方が append より 実行速度、メモリ効率共に優れている結果となった
- データ量が少ないときはそこまで影響はないかもしれないが、スライスに要素を追加する際にあらかじめサイズが分かっている場合は、インデックスを指定する方法を使用するようにしたい
ZED SDK 4.2 で何が変更になったのか

# ZED SDK 4.2 で何が変更になったのか

github でPRでのマージの差分を見ると、何が加わったのかが分かる。

## 新規に加わっているフォルダ

- body tracking/multi-camera/csharp/
- https://github.com/stereolabs/zed-sdk/tree/master/body%20tracking/multi-camera/csharp

- depth sensing/fusion/cpp/
- https://github.com/stereolabs/zed-sdk/tree/master/depth%20sensing/fusion/cpp
- object detection/custom detector/cpp/tensorrt_yolov5-v6-v8_onnx_internal/
- https://github.com/stereolabs/zed-sdk/tree/master/object%20detection/custom%20detector/cpp/tensorrt_yolov5-v6-v8_onnx_internal
- object detection/custom detector/python/pytorch_yolov8_seg/
- https://github.com/stereolabs/zed-sdk/tree/master/object%20detection/custom%20detector/python/pytorch_yolov8_seg
- object detection/multi-camera_multi-model/cpp/
- https://github.com/stereolabs/zed-sdk/tree/master/object%20detection/multi-camera_multi-model/cpp
- zed one/cpp/
- https://github.com/stereolabs/zed-sdk/tree/master/zed%20one/cpp
- zed one/python/
- https://github.com/stereolabs/zed-sdk/tree/master/zed%20one/python

ZED X One というGMSL2の単眼カメラを売り出しています。

https://www.stereolabs.com/en-jp
![Screenshot from 2024-11-22 10-27-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/1427fbe9-37a3-487b-af28-404be080b28b.png)


## なくなっているもの
object detection/custom detector/cpp/tensorrt_yolov5_v5.0/
object detection/custom detector/cpp/tensorrt_yolov5_v6.0/
フォルダが整理されたようです。


## 変更点
162のファイルで変更になっているので、追えていません。
```
body tracking/body tracking/cpp/
body tracking/body tracking/csharp/
body tracking/export/JSON export/cpp/
body tracking/multi-camera/cpp/
camera control/cpp/
camera streaming/receiver/cpp/
depth sensing/depth sensing/cpp/
global localization/live/cpp/
global localization/live/python/
global localization/playback/cpp/
global localization/playback/python
global localization/recording/cpp/
global localization/recording/python/
object detection/birds eye viewer/cpp/
object detection/birds eye viewer/csharp/
object detection/birds eye viewer/python/
object detection/concurrent detections/cpp/
object detection/custom detector/cpp/
object detection/custom detector/python/pytorch_yolov8/
object detection/image viewer/
object detection/multi-camera/cpp/
object detection/multi-camera_multi-model/cpp/
plane detection/floor plane/cpp/
plane detection/plane detection/cpp/
positional tracking/positional tracking/cpp/
recording/recording/mono/cpp/
recording/recording/mono/python/
spatial mapping/multi camera/cpp/
spatial mapping/spatial mapping/cpp/
```

## 気づいたこと
OpenGLがらみの変更がやたら多い。
OpenGLに詳しくない人としては、どういう修正なのかがわかっていない。


## 古いC/C++の流儀は残っているか
malloc(で検索してみてください。
freee( で検索してみてください。
コードの量に比べれば、比較的少ないと言えるでしょうか。
C++で入った `auto` も使われだしているのが見て取れます。

unique_ptr
shared_ptr
も使われだしています。


## ZED SDK 4.1 の変更では
- C++ のソースコードで const 属性の追加が多数みられます。
- そのことで、コードの安全性が高まるし、読む側の負担も減ります。いいことです。