OmniAICreator/Qiita-1.07M huggingface dataset:
Dynamics 365 Business Central and integration workflows - why Azure Logic Apps are often a better choice than Power Automate

https://community.dynamics.com/blogs/post/?postid=7ae27d87-888e-45ca-85b8-6202e9c2feea

Dynamics 365 Business Central and integration workflows: why Azure Logic Apps are often a better choice than Power Automate

Dynamics 365 Business Centralと統合ワークフロー：Power Automate よりも Azure Logic Apps の方が良い場合が多い理由 の要点のざっくり翻訳です。

## 元記事

https://demiliani.com/2022/10/03/dynamics-365-business-central-and-integration-workflows-why-azure-logic-apps-are-often-a-better-choice-than-power-automate/


> 私はここで、「統合には必ず Azure Logic Apps を使う必要がある」と言いたいわけではありません。Power Automate が適切なワークフローシナリオもあれば、Power Automate の使用は乱用であり、アーキテクチャーエラーである場合もあります。

> このトピックに関する私の2つの意見：ローコードワークフローで統合タスクを解決しようと考えている場合、いくつかの質問をしてみてください：

> このワークフローはユーザー中心で、ユーザーによって実行されるのか？Power Automateが選択できるだろう。
> このワークフローは、信頼性が必要で、ユーザーコンテキストなしで実行されるサイレントプロセスですか？Logic Appsが適しています。
> 信頼性が高く、スケーラブルでセキュアな統合ワークフローが必要ですか？Logic Appsが最適です。
ミッションクリティカルで、高スループット、低レイテンシーのワークフローが必要ですか？Power Automateをお忘れなく。Logic Appsは良い選択だが、多くの場合、フルコードのアプローチの方が良い（Durable Functionsはこのために生まれた。  ).


[Azure における統合と自動化のプラットフォームの選択 | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-compare-logic-apps-ms-flow-webjobs#next-steps)

>Power Automate と Azure Logic Apps はどちらも、ワークフローを作成できる "デザイナー第一" の統合サービスです。 どちらのサービスも、各種の SaaS アプリケーションやエンタープライズ アプリケーションと統合されます。

>Power Automate は、Azure Logic Apps プラットフォーム上に構築されています。 どちらも同様のワークフロー デザイナーとコネクタを提供します。

>Power Automate を使用すると、オフィスの従業員がだれでも、開発者や IT 部門の力を借りることなくシンプルな統合 (SharePoint ドキュメント ライブラリでの承認プロセスなど) を実現できます。 Logic Apps でも、エンタープライズレベルの Azure DevOps とセキュリティ対策を必要とする高度な統合 (B2B プロセスなど) が可能になります。 ビジネスで使用するワークフローは、時間の経過と共に複雑さを増してくるものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/eb3c3c87-5743-b8fe-82f1-8d06180b7c9c.png)


## つづく

推し活の続き。Power AutomateよりもAzure Logic Appsの方が良い場合が多い理由 てな記事の小ネタでした。つづく。
社会人が「How to prepare for seminars」を読み返してみた！

# はじめに

久しぶりに「How to prepare for seminars」を読み返したので、その感想をまとめます。至極当然のことを言っているかもしれませんが、雑記ですのでご容赦ください。

https://www.ms.u-tokyo.ac.jp/~yasuyuki/sem.htm

# Who am i ?

学生の頃は数学とプログラミングを勉強していました。今はしがないエンジニアです。

# なぜ記事にしようと思ったのか？

「How to prepare for seminars」とは東大の河東先生が書かれた「ゼミに挑むための心得」をまとめたものですが、ふと社会人になって読み返してみたら学生の頃とは違った気づきを得ることが出来たので記事にしてみようと思いました。

# 本題

「How to prepare for seminars」自体は、数学系博士課程の学生がディフェンスを突破するためのある種のバイブルと言っても過言ではないです。ですが、より広い解釈としては「主観的に物事をある程度理解するとはどういうことか？」「何をもって理解したと判断すべきか？」という答えを与えているようにも見えます。

ただ現実問題として、ビジネスの場合は数学と違いブラックボックスで見えない所がたくさんあります。そういった問題や課題に対しても「How to prepare for seminars」は課題への取り組み方そのものや「何をもってそう言っているのか」or「それ自体の意味する所は何なのか」等の自分の思慮が浅い部分を補ってくれる材料になってくれているわけです。勉強の方法や思考のプロセスを支える基盤にもなってくれています。


# 最後に

「How to prepare for seminars」自体は私が学部1年生のときに、先生から「良い記事だから読んで」と言われてウェブサイトをプリントアウトしたものを渡され、それ以降は研究室へ配属されるまでは見なかったのですが、まさか社会人になって読み返して感じ方が変わるとは思っていませんでした。案外、意外な発見があるものです。
ChatGPTとzsync(zfs同期スクリプト)を作った。

結果としての　スクリプトはここに置いてあります。

https://github.com/tomoyuki-asakawa/zsync

zsync.sh remote_user@remote_host local_dataset

とすると、 datasetのスナップショットを作成してをremote_host に同期します。
remote_userにはsudoの実行権限が必要です。

remote側のdataset名を変えたければ
zsync.sh remote_user@remote_host local_dataset remote_dataset

の様にremote_dataset名をしていできます。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
今年の2月ですが、ChatGPTに

zfsでリモートサーバとの差分同期を行うスクリプト

と書きました。途中で実行したので本当はスクリプト名をしりたかっただけなのですがなんと奴はスクリプトを書いてきたのです。まだ慣れてない時なので意外でしたがこれでChatGPTの可能性がわかりました。

この時は、残念ながら履歴に残ってないけど無料版でした

その時のスクリプトは、ごくごくシンプルでした。
何回かやりとりして面白くなったので有料版にしました。

履歴に残っていたのはこれで。

zfsでリモートサーバとの差分同期を毎分行うスクリプトをください
https://chat.openai.com/share/7d928ab3-b40f-4ddc-8d32-e9e75ca413fd

リンクをみてくれればわかりますが、
スナップショットの管理を私がしないとならない。
毎分の処理を無限ループでやってました。

なので、追加の質問で、修正させてます。
ただ、ここで私は、彼をみすてて、別の彼を召喚してます。

https://chat.openai.com/share/c01f8815-2ba4-42e2-85f3-fce14f913ae9
この彼も見捨てて
https://chat.openai.com/share/7b32e616-0824-4a39-8040-9a0580cacc49
こんな会話してますが
もう結構グダグダです。

そこでさらに別のを召喚
https://chat.openai.com/share/691093a2-4fca-480f-bf59-c0b145688c83

このあと何回かあった気がするけど
実行するつどスナップショットがたまるのでそれの消去を考えさせてます。
https://chat.openai.com/share/aeda10a3-91c6-48db-9e70-777e168bc108

また、ここでは、中断の再開というレジューム機能をつけさせてます。
https://chat.openai.com/share/10ee4e8b-3f42-4b8e-b2b2-043c4b3bf994
が、これを私が気に入らなかたみたいで再度別のを召喚
https://chat.openai.com/share/11b4bacf-9133-4054-887d-19a1204999d2

ここでは、デバッグの結果の問題点を指摘して書き直させてる
https://chat.openai.com/share/619c50b6-04e7-4732-8c89-afa039cf616c

ここでは、ロジックの修正を指示
https://chat.openai.com/share/caafcbd8-ef55-4114-b81e-271f0276ee28

ここでは、起動オプションについてやりとりしてます。
奴の提案を私は受け入れてる
https://chat.openai.com/share/3a23b8c2-cab6-4c7d-8021-f2ea194656bf

ここでは、エラーメッセージの改善を指示してます
https://chat.openai.com/share/5f19419c-dbb8-4631-aa3c-b33fc0dfe88d

ここでは、mbufferを入れて転送効率アップしようとしてるのですが、入れる時と入れないときでベタにスクリプトを書いてるので無駄をやめれと言ってます。
https://chat.openai.com/share/d03dd43c-ce64-4c00-ac52-1d9fc1778127

うまく動かないので修正依頼
https://chat.openai.com/share/9bb789e0-6ff2-4a1e-ac5d-474c9dc71790

ダラダラ長くなってるので、修正指示
https://chat.openai.com/share/9e3088b7-77bf-4d79-8369-29214f3a4571

またバグ対応
https://chat.openai.com/share/351ca1da-0496-4ec4-9afb-a7ffa764eee2

このあと、いろいろやって、現在のスクリプトになってます。気に入らないところがあったので
最終的には私が書いてます。じつはまだ書きかけの2.0があるのですが、言うことちゃんと聞いてくれないので中断したままです。どうみても無駄な記述なのでサブルーチン化させるのですが、変数を間違えたりしてなかなか進まない。

巷では、プロンプトエンジニアリングといって
まるで、仕様書の様なものを与えて、一発で答えを得ようとする記事が蔓延してますが
仕様書つくるぐらいならプログラムした方が早いというのをプログラマは知ってると思います。しかしChatGPTつかえば、調べる事を奴に任せられます。

プログラマ不要になるとか言われてますが、いわれた事を言われた様に作成するプログラマは要らなくなるでしょうがまだ当分そう簡単にはいかないでしょう。一番最初のでも動きます。だけどそれじゃ使えないのです。
１０ヶ月前とは、CHatGPTは進化してますが、やはりまだまだです。
Dockerボリュームの特徴

# Dockerボリュームの特徴

Dockerのボリュームは、コンテナのデータを永続化するための重要な機能です。この記事では、Dockerボリュームの基本的な概念、使用方法、およびそのメリットについて解説します。

## ボリュームの基本概念

Dockerコンテナは、その性質上、一時的な環境です。コンテナを削除すると、その中のデータも消失します。しかし、ボリュームを使用することで、重要なデータをコンテナ外に保存し、コンテナ間で共有することができます。

### ボリュームの特徴

- **永続性**: コンテナが削除されてもデータが保持されます。
- **独立性**: ボリュームはコンテナから独立して存在し、複数のコンテナで共有できます。
- **可搬性**: ボリュームはDockerエンジンとは独立しており、異なる環境間で移動可能です。

## ボリュームの使用方法

ボリュームは、コンテナを実行する際に、特定のディレクトリをホストマシンのディレクトリにマウントすることで使用します。

### ボリュームの作成と管理

- **ボリュームの作成**: `docker volume create [ボリューム名]`
- **ボリュームの一覧表示**: `docker volume ls`
- **ボリュームの詳細情報表示**: `docker volume inspect [ボリューム名]`
- **ボリュームの削除**: `docker volume rm [ボリューム名]`

### コンテナでのボリュームの利用

コンテナを実行する際に、`-v` オプションを使ってボリュームをマウントします。

```bash
docker run -v [ボリューム名]:[コンテナ内のパス] [イメージ名]
```

## ボリュームのメリット

ボリュームの使用には以下のようなメリットがあります。

### データの永続化

コンテナが削除されても、ボリュームに保存されたデータは残ります。これにより、データのバックアップや復元が容易になります。

### データの共有

ボリュームは複数のコンテナ間で共有できるため、異なるコンテナが同じデータセットを利用する場合に便利です。

### パフォーマンスの向上

ディスクへの直接アクセスにより、パフォーマンスが向上します。特に、大量のデータを扱う場合に重要です。

## まとめ

Dockerのボリュームは、コンテナのデータを永続化し、安全に管理するための強力なツールです。データの永続化、共有、およびパフォーマンスの向上は、Dockerを利用する上で非常に重要な要素です。ボリュームの適切な利用により、Dockerの柔軟性と効率性を最大限に活用できます。
2023/12/4主にITとかセキュリティの記事

Apple、「iOS 17.1.2」「iPadOS 17.1.2」を配信〜重要なセキュリティ脆弱性を修正(12/1)
https://touchlab.jp/2023/12/ios1712_relased/

ＱＲコードから不正サイト誘導、被害相次ぐ　「クイッシング」と呼ばれる手口も(12/2)
https://news.yahoo.co.jp/articles/45351f1be5e145fbc540adac7b948d99a4167adc?source=rss

暗号資産のIEOをサポートし、Web3の普及と発展を牽引する(12/1)
https://bp-affairs.com/news/2023/12/20231201-12189.html

ＬＩＮＥヤフーの大量個人情報流出　いまや日本の「公共インフラ」も漏洩経路に愕然　国産アプリ開発で「脱ＬＩＮＥ」検討を(12/2)
https://www.zakzak.co.jp/article/20231202-IFBG75EVNVLIJIQ3HVK5GX4ERU/

「Google Bard」の名を悪用したマルウェアに要注意(12/1)
https://gunosy.com/articles/epOKN

LINEヤフー、個人情報流出発表　佐藤一郎さんらとThink!(12/2)
https://www.nikkei.com/article/DGXZQODL015OV0R01C23A2000000/

iPhoneの「iOS 17.1.2」アップデートがリリース &#8211; 2つの重要なセキュリティを修正(12/2)
https://gunosy.com/articles/evi4E

生成AIで初の包括ルール、G7が最終合意　日本も制度作り本格化へ(12/1)
https://news.yahoo.co.jp/articles/de97b5fa73cb0c1dffeecf228e85afe39c7084b7

NHK、記者の取材メモ“インターネット上に流出”で謝罪「信頼を損なう、あってはならないこと」(12/1)
https://373news.com/_news/oricon/kiji.php?id=2304923&category=10

富士ソフト、農林水産省様の「農業研究見える化システム」の高度化を支援 オンプレミス環境からデジタル庁の「ガバメントクラウド」へ移行(12/1)
https://www.jiji.com/jc/article?k=000000085.000061382&g=prt

消費者庁も注意、シニア狙う「サポート詐欺」--マイクロソフト名乗り、仕組みや対策は(12/2)
https://japan.cnet.com/article/35212133/

スマホの遠隔操作アプリを悪用されたときの被害の確認方法や対策を解説(12/1)
https://cybersecurity-jp.com/column/92650

デバイスのサイバーセキュリティは設計から廃棄に至るまでが優先事項(12/2)
https://www.gmp-platform.com/article_detail.html?id=22731&lang=ja

韓国、初の軍事偵察衛星打ち上げに成功(12/2)
https://nordot.app/1103440737296810631?c=110564226228225532

コンテナのベストプラクティスに対しておこがましくも言ってみる(12/3)
https://qiita.com/umanetes/items/e0257dafb920726c4f94

「笑えない喜劇」、誤入金で預金残高127億円－でもアクセスはできず(12/2)
https://www.bloomberg.co.jp/news/articles/2023-12-01/S4ZOPDT1UM0W01?srnd=cojp-v2

「上司からの指示・命令のない組織」はうまくいく？　GMOグローバルサイン・HDの挑戦(12/2)
https://news.yahoo.co.jp/articles/753ebf46b1841345b1a700c9b294d172f118fc01

仮想通貨ウォレットを使う際の注意点を紹介！各ウォレットの特徴も解説(12/1)
https://crypto-times.jp/cryptocurrency-wallet-attention/

サイバー人材官民で育成　安全保障分野 横須賀で協会設立(12/2)
https://www.yomiuri.co.jp/local/kanagawa/news/20231202-OYTNT50008/

サイバー資格創設促す　NECなど、防衛人材育成団体 官民を行き来しやすく(12/2)
https://www.nikkei.com/article/DGKKZO76623120S3A201C2EA3000/

住民情報に不正アクセスして女性待ち伏せ　仙台市職員を停職6カ月に(12/2)
https://news.yahoo.co.jp/articles/6820a618c2b87cab728c0be9bb6980fb8194125b

小中学校の「いじめ・体罰・セクハラアンケート」個人情報が漏洩　生徒配布プリントに誤ったQRコード掲載･･･教育委員会が保護者に謝罪　広島(12/1)
https://nordot.app/1103300000342164431

【広島大学病院・システム障害復旧】４日から通常通り外来診療(12/2)
https://news.yahoo.co.jp/articles/b3643351e8806c959fedb46aaac43c88e61d8347
【XAMPP】phpMyAdminに接続できない場合の対処法

XAMPPのコントロールパネルから、phpMyAdminに接続できなかった時に試したことをまとめています。
結論から言うと、phpMyAdminの設定ファイル (config.inc.php) を諸々いじる必要があります。
特に、**MySQLに特定のポート番号を割り当てている場合は、特別な設定が必要**でした。

## 困っていたこと
XAMPPのコントロールパネルから、phpMyAdminに接続しようとすると以下のようなエラーが出る。
![スクリーンショット 2023-12-04 015346.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634172/cdbb7865-8d89-8fd0-26db-fd11dfa7dbc4.png)

## 動作環境
- Windows 11 Home
- XAMPP for Windows 8.2.12
  - Apache/2.4.58 (Win64)
  - PHP 8.2.12
  - 10.4.32-MariaDB

## エラー発生までの前提
- MySQL(MariaDB)の管理者アカウント(root)のパスワードは設定済
(参照URL : https://www.javadrive.jp/xampp/mysql/index2.html)
- MySQLへの接続自体はできる

## 試したこと
### 1. phpMyAdminの設定ファイルに管理者アカウント(root)のパスワードを記載
phpMyAdminの設定ファイル (C:\xampp\phpMyAdmin\config.inc.php) に、管理者アカウント(root)のパスワードを記載する必要があるみたいだったので、追加しました。

**<変更前>**
```php:C:\xampp\phpMyAdmin\config.inc.php
/* Authentication type and info */
$cfg['Servers'][$i]['auth_type'] = 'config';
$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = '';
```
**<変更後>**
```php:C:\xampp\phpMyAdmin\config.inc.php
/* Authentication type and info */
$cfg['Servers'][$i]['auth_type'] = 'config';
$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = '********';
```
(参照URL : https://www.javadrive.jp/xampp/mysql/index3.html)

**<結果>**
ページ最初の画像と変わらず、エラーが出る。。。

### 2. phpMyAdminの設定ファイルにMySQLのポート番号を追加
https://teratail.com/questions/29659
にて、質問をしている方が自分と同じ部分で詰まっていたので、詳しく読んでみることに。
すると、自分のphpMyAdminの設定ファイルには、ポート番号情報がないことに気づく。(どうやらデフォルトでの記載はない模様)
試しに、上の記事を参考にして自分の設定ファイルにもポート番号情報を書き込む。

**<変更前>**
```php:C:\xampp\phpMyAdmin\config.inc.php
/*
 * First server
 */
$i++;

/* Authentication type and info */
$cfg['Servers'][$i]['auth_type'] = 'config';
```
**<変更後>**
```php:C:\xampp\phpMyAdmin\config.inc.php
/*
 * First server
 */
$i++;

$cfg['Servers'][$i]['port'] = '1234';

/* Authentication type and info */
$cfg['Servers'][$i]['auth_type'] = 'config';
```
**<結果>**
見事、アクセスできました！！
![スクリーンショット 2023-12-04 024600.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634172/e23c4fae-4007-1ada-e9fc-fd982a876090.png)

## 原因
XAMPPインストール時、ポートの競合により、MySQLが起動できない状態でした。
そのため、MySQLのポートを'3306'から'1234'に変更しており、おそらくこれが原因だったと思われます。
(参照URL : https://qiita.com/nananari/items/66df067499a0e80e1036)

## 余談
MySQLに特定のポート番号の割り当てを行っている場合には、**PHPにてPDOを用いたMySQL接続を行う**際にも特別な設定が必要です。
具体的には、データソース名($dsn)に、ポート番号の情報を加える必要があります。
```php:db_connect.php
$dsn = 'mysql:dbname=mysql;host=localhost;port=1234';
$user = 'root';
$password = '********';

$pdo = new PDO($dsn, $user, $password);
```
(参照URL : https://blog.diginnovation.com/archives/7143/)
Unityを使ったVJでよく使うイメージエフェクト集2023

この記事は、ジェネ系VJ Advent Calendar 2023の4日目の記事です。

2018年に「Unityを使ったVJでよく使うイメージエフェクト集」というスライドを発表しました。

https://unityroom.com/games/unityvjshaderslide20181108

あれから5年経ったので、2023年版を作成しました！

https://unityroom.com/games/unityvjshaderslide2023

2018年版と重複してる所は多いので、比較しながらみてください。

スライドのリポジトリも用意しましたので、シェーダーは自由にお使いください（MITライセンスの範疇で）

https://github.com/kaiware007/UnityVJShaderSlide2023

自作VJアプリですが、かれこれ数年作り続けているので、そろそろ一新してURP対応もしていきたい気持ちです。
【TypeScript】とは

## ▼はじめに
最近プライベートがバタバタしていて期間があいてしまいました！
人生の大イベントが終わったーーと思ってもまだまだやることが尽きず、仕事もまだ慣れず、、
毎日仕事してご飯食べて用事済ませて寝る、の繰り返しです。苦しい。
さて気合いを入れてTypeScriptを勉強します:lifter_tone3:🔥

## ▼TypeScriptとは
JavaScriptを拡張して作られたプログラミング言語。
TypeScriptで書いたコードをコンパイルするとJavaScriptのコードへと変換されます。そのため、JavaScriptの開発環境や実行環境があればすぐに使えるとのこと。

・JavaScriptファイルが実行できる環境ならすぐに使える
・JavaScriptライブラリもTypeScriptから使用できる

JSがわかるのであればスムーズに学習できるのでは？と思ったのですが、TSは学習コストが高いという記事が多くありました。

次項でもあげる「静的型付け」などのJSと異なる点が、JSを学んだ人にとっては習得の妨げとなるようです。

## ▼JavaScriptとの違い
JSとの違いを整理します。

#### 1.JavaScriptは動的型付け、TypeScriptは静的型付け

↓過去の記事で取り上げました。

https://qiita.com/sakuc47/items/f00032201c10793e5ff6

静的型付けのため、早い段階（コンパイル時）でエラーを発見できる、大人数で開発に携わる場合でもエラーを防ぎやすいというメリットがあります。



（そのほかはうまく言語化できず、後日まとめます。もしかしたらTSを学習していく中で気付きがあるかもしれません。）


## ▼実際に触ってみる
下記の記事を見ながら動かしてみました。

https://udemy.benesse.co.jp/development/system/typescript.html

### 1.npmをインストールする
### 2.TypeScriptをインストール

```
$ npm install -g typescript
```

下記で正しくインストールされていることを確認。
```
$ tsc -v 
Version 5.3.2
```

### 3.TypeScriptで「Hello World!」を表示

#### 3-1.作業ディレクトリを作成し、移動する
#### 3-2.コンパイルのための設定ファイルを作成する
```
tsc --init
```
作業ディレクトリ内にtsconfig.jsonという設定ファイルが作成されます。
TSファイルをJSファイルに変換する際の設定が書かれています。

↓TS公式サイトのセットアップ手順メモ
https://typescript.nuxtjs.org/ja/guide/setup/

#### 3-3.「Hello World!」を表示するためのTSファイルを作成
ディレクトリ内にsample.tsファイルを作成し、サンプルコードを記述
```ts
let message: string = "Hello World!"
console.log(message)
```

` : string` で型を指定していますね！

#### 3-4.コンパイルを実行する
```
$ tsc
```
成功すると、作業ディレクトリ内にsample.jsというファイルが作成されます。

#### 3-5.sample.jsを実行する
```
$ node sample.js
```
実行後、コマンドプロンプトに「Hello World!」と表示されます。

### 4.htmlで「Hello World!」を表示する
TypeScriptのコードはブラウザで直接実行できないため、JSファイルに変換する必要があるとのこと。
コンパイルが必要です。

ちなみに下記の記事で自動コンパイルの解説をしてくださっているので、後日試します。

https://qiita.com/ochiochi/items/efdaa0ae7d8c972c8103


#### 4-1.新たなTSファイルを作成し、サンプルコードを記述。
※参考サイトのサンプルコードではエラーが出たため、下記で実行しました。

``` ts
ｌet message: string = "Hello World!"

/* 
　　参考サイトのコード
 　document.body.innerHTML(message)
 innerHTMLプロパティには関数を適用する必要はないため、
 代入演算子 = を使用して値を代入する
*/ 
document.body.innerHTML = message2;
```

#### 4-2.コンパイルを実行し、TSファイルを変換
```
$ tsc sample2.ts
```
#### 4-3.出力れたjsファイルをhtmlファイルで読み込み、開く
```html
<!DOCTYPE html>
<html>
<head>
  <title>TypeScript練習</title>
</head>
<body>
<script src="sample2.js"></script>
</body>
</html>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524465/5645784a-1850-8c36-0234-e2c948cf1546.png)


## ▼さいごに
はじめは、「全くわからない・・・」と絶望していたのですが、
・型付けが違うこと
・コード内でどのように型宣言をするか
・コンパイルをしてJSファイルに変換する必要があること
・基礎的なコンパイルのやり方
がわかりました。

次回は書き方を中心に手を動かしていきます。
制作物、どうしようか悩み中です・・・。

## ▼参考

https://udemy.benesse.co.jp/development/system/typescript.html

https://note.com/aliz/n/n43958fdcdd44
Azureの資格について軽いまとめ（途中）

Fundamentals
AZ-900: Microsoft Azure Fundamentals
AI-900: Microsoft AI Fundamentals
DP-900: Microsoft Azure Data Fundamentals
Associate
AZ-104: Microsoft Azure Administrator Associate
AZ-204: Microsoft Azure Developer Associate
DP-100: Microsoft Azure Data Scientist Associate
DP-203: Microsoft Azure Data Engineer Associate
DP-300: Microsoft Azure Database Administrator Associate
PL-300: Microsoft Data Analyst Associate
AZ-500: Microsoft Azure Security Engineer Associate
Expert
AZ-305: Microsoft Azure Solutions Architect Expert
AZ-400: Microsoft DevOps Engineer Expert

### 参考ページ
https://k21academy.com/microsoft-azure/certification-path/
Babylon.js で作成したメッシュの頂点を編集する方法 

これはBabylon.js Advent Calendar 2023 の4日目の記事です。

## この記事について

Babylon.jsでは、BABYLON.MeshBuilderで立方体や球体を表示します。
今回はここで生成したメッシュの頂点を、調整する方法について記述します。

## 作成した立方体の頂点を取得する
Playgroundを開いて、下記のように立方体を１つ作成するコードを記述します。

```javascript:立方体を表示
    var box = BABYLON.MeshBuilder.CreateBox("box1", {width: 2, height: 2, depth: 2}, scene);
```
![baby20231204_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594551/9a5b5620-d16c-e349-3c08-e963f3c0f446.png)
https://playground.babylonjs.com/#UY72D0

立方体を表示したら、下記のようにgetVerticesDataでメッシュの頂点データを配列で取得できます。

```javascript:立方体の頂点を取得
    var boxpos = box.getVerticesData(BABYLON.VertexBuffer.PositionKind);
    alert(boxpos);
```
お手軽にalertで取得した内容を表示してみます。
![baby20231204_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594551/c2f0d8c1-26f3-15ce-e7f3-15e8341f41a6.png)
取得した各頂点毎のXYZ座標が連続で表示されました。1点につきXYZ座標があるので、3つの値で1つの頂点に相当します。
今回作成した立方体は、中心座標が０、XYZのサイズが2なので、XYZ座標がすべて1と-1になっていますね。

## 頂点を編集する
頂点を編集するには、CreateBoxで立方体を作成する際にオプションで「updatable:true」を記述して編集を許可しておく必要があります。（これを忘れると変更した内容が反映されずに悩みます）
```javascript:編集可能な立方体を表示
   var box = BABYLON.MeshBuilder.CreateBox("box1", {width: 2, height: 2, depth: 2, updatable:true}, scene);
   ```

編集可能にした立方体の頂点をgetVerticesDataで取得したら、その配列を編集します。必要な編集が終わったら、updateVerticesDataで立方体に変更した頂点位置を反映します。

```javascript:1つの頂点位置（XYZ）を2.5倍する
    //頂点の値を変更
    boxpos[0] = boxpos[0] * 2.5;
    boxpos[1] = boxpos[1] * 2.5;
    boxpos[2] = boxpos[2] * 2.5;
    //変更した頂点を反映する
    box.updateVerticesData(BABYLON.VertexBuffer.PositionKind, boxpos);
```
![baby20231204_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594551/bbeb7c85-ee97-e1a1-535f-a4c0f95349bc.png)
https://playground.babylonjs.com/#UY72D0#1

立方体のうち、1点の頂点を移動することができました。


## 最期に
今回は作成した立方体の頂点を編集する方法について記述しました。
色々と応用ができるので、いくつか色々試してみようと思います。
Snowflakeでランダムな位置情報データを生成してみた

## はじめに
Snowflakeでは、地理空間データを扱う機能がサポートされており、日々アップデートされています。今回、地理空間を扱う各機能の性能面についてざっと確認したかったので、ランダムな位置情報データをSnowflake内で生成してみました。

## 環境
Snowflake standard edition (November 11-14, 2023)
Snowsight + DBeaver（Geoデータ可視化に使用）

## ランダムデータの作成方針
ランダムとはいえ、位置情報なので、落ちてほしい範囲を決めて作ることにしました。
東京（離島を除く）範囲で作りたい・・・ところですが、~~Snowflakeには、PostgreSQL + PostGISの[ST_GeneratePoints](https://postgis.net/docs/ST_GeneratePoints.html)のような便利な関数はないので~~(マーケットプレイスで無料で使えるCarto Analytics ToolboxにてST_GeneratePoints()が用意されておりました！ありがたい・・・)、ひよって、東京（離島を除く）範囲を含む最小のバウンディングボックス内で、緯度経度をランダムに生成させることにします。

## 都道府県ポリゴン
今回はマーケットプレイスにて、Truestar社が無料公開してくださっているPODB都道府県データを使わせていただきました。
参考：[マーケットプレイスリンク](https://app.snowflake.com/marketplace/listing/GZT2Z25AYF/truestar-inc-prepper-open-data-bank-japanese-prefecture-data?originTab=provider&providerName=truestar%20inc.&profileGlobalName=GZT2Z25AU7)
都道府県データをサクッと使わせていただけるの大変ありがたいことです。
（国土数値情報>行政区域データからいい感じのデータを作ってSnowflakeに入れるのは結構大変です。。）

## ランダム位置情報データを生成
sonwflakeでのデータ生成は、uniform関数で行えます。
> Snowflake Doc uniform | https://docs.snowflake.com/ja/sql-reference/functions/unifDoc

ということで、東京都ポリゴンデータより矩形情報を取得しつつ、uniformでランダムに位置情報を作成してみます。

```sql
-- PODBより都道府県ポリゴン（離島無し）のデータから、東京都の矩形データを取得する
with t as (
select
    st_xmin(POLYGON_JP_PREF_2_LIGHT) as xmin,
    st_xmax(POLYGON_JP_PREF_2_LIGHT) as xmax,
    st_ymin(POLYGON_JP_PREF_2_LIGHT) as ymin,
    st_ymax(POLYGON_JP_PREF_2_LIGHT) as ymax
from
    -- 都道府県の基礎データ | 2020年 テーブル
    PREPPER_OPEN_DATA_BANK__JAPANESE_PREFECTURE_DATA.E_PODB.E_PR_FD20
where
    PREF_CODE= 13 -- 東京都
)
select 
  	st_point(
  		uniform(xmin, xmax, random()),
  		uniform(ymin, ymax, random())
	) AS geog
  FROM
    t,
 	table(generator(rowCount => 100000000))
;
```
…がエラーになってしまいました。
> argument 1 to function UNIFORM needs to be constant, found 'SYS_VW.XMIN_1'

uniform関数に渡す引数は定数でなければならないとのこと。
CTEでの取得結果をつなぐのは無理そう。今回はsnowsightで作業していたため、SETで矩形情報を変数に結入れて、渡すことでエラー回避しました。

```sql

-- 一回矩形情報をsetで変数に入れておく。
set (xmin,xmax,ymin,ymax) = (
select
    st_xmin(POLYGON_JP_PREF_2_LIGHT) as xmin,
    st_xmax(POLYGON_JP_PREF_2_LIGHT) as xmax,
    st_ymin(POLYGON_JP_PREF_2_LIGHT) as ymin,
    st_ymax(POLYGON_JP_PREF_2_LIGHT) as ymax
from
    -- 都道府県の基礎データ | 2020年 テーブル
    PREPPER_OPEN_DATA_BANK__JAPANESE_PREFECTURE_DATA.E_PODB.E_PR_FD20
where
    PREF_CODE= 13 -- 東京都
);

-- １億レコード程、テーブルに挿入
create table dummy_tokyo_point as 
select 
  	st_point(
  		uniform($xmin, $xmax, random()),
  		uniform($ymin, $ymax, random())
	) AS geog
  FROM
 	table(generator(rowCount => 100000000))
;
```

1億レコードの挿入は、2分強で完了しました。
通常ウェアハウスはXSでしたので、10億レコード以上作る際は、もう少しサイズをあげてもよいかもしれません。

データもDBeaverのspatialデータモードで参照し、意図通り作成できていることが確認できました。
矩形単位で生成しているので、若干海に落ちてますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619567/b1c41314-10f9-09a7-ca7c-a9eb6ad9d174.png)

## まとめ
Snowflakeで、位置情報のランダムポイントデータを生成してみました。
Snowflake内部のリソースを使って生成、インポートを行うことで、効率よくデータ生成ができたかと思います。
よりユースケースにマッチした複雑なランダムデータを作成する場合、Snowflakeは、Pythonも使えますので、そちらも検討したほうが良いと思います。
地理空間データを試す際、オープンデータやSnowflakeマーケットプレイスで無料で試すことができるものがあり、大変ありがたいと感じます。実際の検証ではそういったものを掛け合わせて進めていきたいと感じました！
Next.js + aws-amplify auth(Cognito) メモ

# はじめに
- Next.js にCognitoによる認証機能を追加したときにやったことをメモしました。
- ほぼ自分用のメモ書きみたいな感じで、不備が多々あります、申し訳ありません。

# バージョン

特に重要な項目のみ抜粋します。
- Next.js 13
- aws-amplify 6.0.5
- @aws-amplify/ui-react 6.0.3
```
 "dependencies": {
    "@aws-amplify/ui-react": "^6.0.3",
    "@types/node": "20.5.9",
    "@types/react": "18.2.21",
    "aws-amplify": "^6.0.5",
    "next": "13.4.19",
    "react": "18.2.0",
  },
```

# 認証機能の追加手順
```
$ amplify init
$ amplify env list
$ amplify env checkout example
$ amplify push
→ Consoleでリソースができていることを確認
→ 認証機能追加
$ amplify env list （環境があっていることを確認）
$ amplify pull --appId xxxxxxxxxxxx --envName example （Consoleでコマンドを確認できる）
// 間違えてしまった場合
$ amplify env remove example
```

# 必要なIAM User, Role
- IAM User: Amplifyの操作権限を持ったユーザー
- IAM Role:
    - Backendのデプロイ権限
    - Cognitoの操作権限

# 注意点
- コマンドに失敗しても、落ち着いてエラー文を読めば解決できることが多い。
    - 特定のフォルダを削除するよう指示しているものがあった。
    - Console上で、Amplify Studio settingsの Enable OFF/ON を切り替えると直るものがあった。
- Console上でフロントエンドのデプロイ設定を行う時は、必ずBackendのデプロイ権限を持たせたロールを設定する


# バージョンの差異に注意
- 検索すると aws-amplifyのバージョンが5 の場合の記法が多くヒットするが、最新のバージョン6では、 `Auth` を書く必要がないなど、書き方が微妙に異なるので注意する→ [公式ドキュメント](https://docs.amplify.aws/javascript/build-a-backend/auth/set-up-auth/)
- 以下、コード例

```:_app.tsx
import '@/styles/globals.css'
import { Authenticator, View, Image, useTheme } from '@aws-amplify/ui-react'
import '@aws-amplify/ui-react/styles.css'
import { Amplify } from 'aws-amplify'
import type { AppProps } from 'next/app'
import React from 'react'
import awsExports from '@/aws-exports.js'

Amplify.configure(awsExports)

const authComponents = {
  Header() {
    const { tokens } = useTheme()

    return (
      <View textAlign='center' padding={tokens.space.xxxl}>
        <Image alt='logo' src='/logo.png' />
      </View>
    )
  },
}

export default function App({ Component, pageProps: { session, ...pageProps } }: AppProps) {
  return (
    // ユーザー登録を許可しない要件だったので、hideSignUp={true} を追加している
    <Authenticator hideSignUp={true} components={authComponents}>
      <Component {...pageProps} />
    </Authenticator>
  )
}

```

# 終わりに
- 不備が多々ありご迷惑をおかけします。適宜、他の記事と併せてお使いいただければ幸いです。
OpenChain Security Assurance (ISO/IEC 18974)の件

# 概要

OpenChainプロジェクトが2022年にリリースしたOpenChain Security Assurance Specification 1.1は、国際規格のISO/IEC 18974として承認され、2024年1月に刊行される予定です。
ISO/IEC 18974はOpenChain 2.1 (ISO/IEC 5230:2020) と関連して、OSSを使用する組織がセキュリティを保証するために満たすべき要件などを定義するものです。

内容については[昨年のAdvent Calendarで浅羽さんが書いてます](https://qiita.com/teppeitherock/items/aa0c1fa20dfa7b614259)のでそちらもご参照ください。
3章構成で、1章は仕様の範囲、2章は用語の定義など。
3章に要件が記載され、おおむね下記のような構成になっています。
- OSSセキュリティ保証に関するポリシーや、組織内での役割・責任などに関するもの
- OSSのライフサイクル全体にわたる継続的な記録 (SBOM管理) や脆弱性の検出・解決手順の明確化、脆弱性への対応と対応内容の追跡などを求めるもの
- セキュリティ保証の関連業務を定義することや、外部からの問合せの受付、十分なリソースの確保を求めるもの
- セキュリティ保証に関する取組みを定期的に見直すこと

また、これら要件を満たしているかを確認するための[セルフ チェックリスト](https://github.com/OpenChain-Project/Reference-Material/blob/master/Self-Certification/Checklist/Security-Assurance-1.1/en/Security-Assurance-1-1-Checklist-Version-2.md)が別途あります。ISO/IEC 5230:2020と同様に自己認証が可能です。

セルフ チェックリストを眺めてみると、たとえば「OSSのセキュリティ ポリシーを文書化すること」や、「関連する役割を特定すること」のように、セキュリティ ポリシーの中身や関連する役割の具体例などは示されておらず、それらを定義しているかどうかを確認しています。あくまでOSSをセキュアに扱う組織を構築するための要件にとどまっているので、ではいざセキュリティ ポリシーを策定しようとしたときにはあまり役に立たないかもしれません。
また、例えばこの取り組みの実施を監査する仕組みや、具体的なOSSの脆弱性の監視手順や対応方法なども提供されません。

# なぜこれが必要か?

企業が販売する製品やサービスにおいてOSSが扱われるのが一般的になる中で、OSSのセキュリティ対策も欠かせないです。企業は自身の製品やサービスを安全に保ち続けることに対して責任を求められますが、OSSに対するセキュリティ保証のプロセスを独自に構築してしまうと、対外的にそのプロセスがどのくらい妥当なのか？を示しづらくなります。
標準規格であるISO/IEC 18974を採用し、OSSのセキュリティ保証のプロセスを構築することで、企業はOSSをセキュアに保つための取組みをしているということを対外的に示すことができるようになります。
またISO/IEC 18974の内容自体が、そうした組織をどのように構築すべきなのか、といった指針を示すものになるため、今後OSSを利用することを検討している企業にとっても役立ちます。

# まとめると、これが何に役立ち、何ができないか？

- 企業として採用すると、OSSをセキュアに扱っているということを対外的に示せる
- 扱っているOSSをセキュアに保つための組織づくりの指針になる
- セキュリティ ポリシーの作成方法や関連する役割の具体的な例は提示されない
- 具体的なOSSの脆弱性監視の手順、対応方法は提示されていない
俺のweztermの設定

# 環境
* Ubuntu 22.04

# 設定ファイル
``` bash:bash
cd ~/
touch .wezterm.lua
```
```lua:.wezterm.lua
local wezterm = require 'wezterm'

local config = {}

if wezterm.config_builder then
  config = wezterm.config_builder()
end

-- カラースキームの設定
-- config.color_scheme = 'Darcula'
config.color_scheme = 'Dark Violet'


-- 背景画像の表示
config.window_background_image = "/your/image/filepath.png"
config.window_background_image_hsb = {
  -- 背景画像の明るさ
  -- 1.0で元画像から変更なし
  brightness = 0.1,
  -- 色相の設定
  -- 1.0で元画像から変更なし
  hue = 1.0,
  -- 彩度の調整
  -- 1.0で元画像から変更なし
  saturation = 1.0,
}

-- 背景透過
config.window_background_opacity = 1.0

-- 最初からフルスクリーンで起動
-- local mux = wezterm.mux
-- wezterm.on("gui-startup", function(cmd)
--     local tab, pane, window = mux.spawn_window(cmd or {})
--     window:gui_window():toggle_fullscreen()
-- end)

-- ショートカットキー設定
local act = wezterm.action
config.keys = {
  -- Alt(Opt)+Shift+Fでフルスクリーン切り替え
  {
    key = 'f',
    mods = 'SHIFT|META',
    action = wezterm.action.ToggleFullScreen,
  },
}

-- フォントの設定(Cicaの別途インストールがひつよう)
config.font = wezterm.font("Cica", {weight="Medium", stretch="Normal", style="No
rmal"})

-- フォントサイズの設定
config.font_size = 16

-- trueで日本語切り替えを可能にする 設定の反映に再起動が必要
config.use_ime=true

return config
```
* ホームディレクトリ直下に.wezterm.luaというファイルを作成し設定を記述すると保存した時点で設定が即反映される
* ただし一部の設定（config.use_imeなど）は再起動が必要
    * 俺はUbuntu自体を再起動して反映させたがもっといい方法が他にあると思う
* 設定の記述を誤ってフリーズもしくは起動しなくなった場合は別のターミナルから`.wezterm.lua`の修正を行う

# 参考

https://wezfurlong.org/wezterm/config/files.html#configuration-file-structure

https://qiita.com/sonarAIT/items/0571c869e5f9ab3be817
GitHubへの簡単なやり取りを自動化する

# GitHubへの簡単なやり取りを自動化する

## 概要
GitHubへのやり取りが面倒だったのでChat-gptに自動化してもらった

※gitのメール・名前・リモートリポジトリの情報が追加されていて、当然権限もある前提
※最初のコミットは手動じゃないとだめかも...

尚、up主のGitHubは[こちら](https://github.com/sabameron?tab=repositories)

https://github.com/sabameron?tab=repositories

## git pushの自動化
オプションを設定しなければ以下のように自動で日付が追加される
「AutomaticPush_2023-11-29_13-03-30」
```-m```を付けることでコミット時のコメントを追記できる
```bash:bash
#!/bin/bash

current_date=$(date +%Y-%m-%d)
current_time=$(date +%H-%M-%S)

commit_message="AutomaticPush_${current_date}_${current_time}"

git status
git add .

while getopts ":m" opt; do
  case $opt in
    m)
      # Prompt the user for a commit message
      read -p "Enter commit message: " user_message
      commit_message="$user_message"
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      ;;
  esac
done

git commit -m "$commit_message"
sleep 2
git push origin master

```
※Masterに直接アップされるので注意

## git pullの自動化

```bash:bash
#!/bin/bash

# ユーザーに確認メッセージを表示し、ユーザーの入力が'y'かどうかを確認する関数
function confirm() {
  read -r -p "$1 (y/n): " response
  case "$response" in
    [yY][eE][sS]|[yY])
      true
      ;;
    *)
      false
      ;;
  esac
}

# リモートから最新の変更を取得
if confirm "リモートから最新の変更を取得しますか？"; then
  git fetch --all
else
  echo "処理を中止します。"
  exit 1
fi

# ローカルのブランチをリモートの対応するブランチと同期
if confirm "ローカルのブランチをリモートの対応するブランチと同期しますか？"; then
  git reset --hard origin/master
else
  echo "処理を中止します。"
  exit 1
fi

# ローカルの変更を取り消して、指定されたブランチの状態と一致させる
if confirm "ローカルの変更を取り消して、指定されたブランチの状態と一致させますか？"; then
  git pull origin master
else
  echo "処理を中止します。"
  exit 1
fi

```
初学者向けGoogleColab上でのJapanese Stable Diffusion XL(JapaneseSDXL)実行環境爆速構築

この投稿はKDDIテクノロジーアドベントカレンダーの5日目の記事となります。
[SDXLの日本語版](https://huggingface.co/stabilityai/japanese-stable-diffusion-xl)が公開されていたのでGoogleColabo上で試してみました。

# 前提条件
・Googleアカウント
・HuggingFaceアカウント
※2023/12時点では日本語版SDXLはHuggingFaceへのログインが必要になります。

# 環境情報
・GoogleColabo Pro (A100 GPU および ハイメモリ設定)
※実行時にシステムRAM上限を超過してしまったため有料プランで契約しています…。ほかにいい方法が無いか模索中。

# バージョン情報
・diffusers 0.24.0
・transformers 4.35.2
・accelerate 0.25.0
・sentencepiece 0.1.99

# 準備
①HuggingFaceのアカウントが無い場合は[HuggingFace](https://huggingface.co/)の「Sign Up」よりHuggingFaceアカウントを作成する。
<br>
②HuggingFaceにログイン後、右上のアイコンを押下し「Settings」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/32ccdbea-27f4-3bac-c355-9d6990876343.png)
<br>
③「Access Tokens」⇒「New token」を選択しHuggingFace Hubにログインするためのトークンを取得する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/3ca6fd24-d804-a5ad-52eb-b289086ea8f6.png)


# 実行手順
①以下URLを開き「ノートブックを新規作成」を選択する。
https://colab.research.google.com
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/1249e8bf-cc56-d8ee-6683-63b651db84e3.png)
<br>

②メニューより「ランタイム」⇒「ランタイムのタイプを変更」を選択し、ランタイムの設定を「A100 GPU」「ハイメモリ」に変更する。
※T4 GPUやV100 GPUでも問題無いと思いますが速度優先でA100にしています。
![ランタイム①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/1134599e-a744-f4b1-58ce-77bc8ba0fa52.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/342a8d3c-e5a2-28db-d345-03322a17cced.png)

<br>


③下記コマンドを入力し画像の赤枠の矢印を押下してコマンドを実行する。
「diffusers」「transformers」「accelerate」「sentencepiece」がインストールされる。
```bash
!pip install diffusers transformers accelerate sentencepiece
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/bbdde881-fe65-bbac-c264-7a76f76cbcef.png)

<br>

④下記コマンドを実行しHuggingFace Hubにログインする。
「Token」の欄に先ほどHuggingFace公式ページより入手したトークンを入力し「Login」を押下する。
```python
from huggingface_hub import login
login()
```
![HFログイン①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/a5deeaba-cdab-9cfc-162f-7b84c74516ea.png)
※ログインに成功した場合は下記の画像のように「Login successful」と表示される。
![HFログイン②.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/03447d65-2e07-d33c-14d4-8b7632440ebc.png)
<br>

⑤下記コマンドを実行し日本語版SDXLをダウンロードする。
```python
from diffusers import DiffusionPipeline
import torch

model_id = "stabilityai/japanese-stable-diffusion-xl"
pipeline = DiffusionPipeline.from_pretrained(model_id, trust_remote_code=True)
pipeline.to("cuda")
```
※HTTPError: 401となり「OSError: Cannot load model stabilityai/japanese-stable-diffusion-xl: model is not cached locally and an error occured while trying to fetch metadata from the Hub. Please check out the root cause in the stacktrace above.」と出た場合はHuggingFace Hubにログイン出来ていないため再度④を実行すること。
<br>

⑥下記コマンドを実行し画像を出力する。
※promptの部分を出力したい任意の文字列に変更する。
```python
prompt = "侍 アート"
image = pipeline(prompt=prompt).images[0]
image
```
![実行例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/464a3a96-f6f4-9921-de04-1a6d701a75e5.png)

以上です。

次回はLCM LoRAも試してみます。
deck.glをTypeScriptで組むときのポイント

:::note info
これは [MIERUNE AdventCalendar 2023](https://qiita.com/advent-calendar/2023/mierune)　4日目の記事です。
昨日は @koyamagon さんによる [事務員がChatGPTを使ったアレコレについて書くよ](https://qiita.com/koyamagon/items/ef7b5239bf46eff467e6) でした。
:::


データ可視化ライブラリ[deck.gl](https://deck.gl/)のインポート文は

```javascript
import { Deck } from '@deck.gl/core';
```

と、公式のドキュメントでは指定されています
これでも動くのですが、TypeScriptで組んだ時に型の恩恵を受けることができません
VSCodeの場合、Lintの設定次第ではエラーとして赤い波線が表示されてしまいます
そこで、以下のように明示的にインポートすると良いです

```javascript
import { Deck } from '@deck.gl/core/typed';
```


:::note info
明日は@KEI_YAMAさんの記事です！お楽しみにー
:::
Unityにテクスチャなどインポートする時に最低限の設定を自動化する

# 導入の話

Unityにテクスチャなどをインポートするときに、
インポートするファイルごとにプラットフォームに合わせた設定を行う必要がある。
これがとてもめんどう。
検索すればある程度まとめて処理できるが、それも面倒。
なので最低限の設定を自動化するライブラリをつくってみました。


# 機能概要

対象ファイルをインポート時にプラットフォームごとの設定を行います。

例
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24266/bf8f7f29-6b01-c74d-d17e-29212783b419.png" width=50%>

# ライブラリの公開先

https://github.com/syskentokyo/unityautoformatconfig

バージョンはver1.1.0(2023/12/04時点)となります
ちまちまアップデートしているので、バージョンは変更されているかもしれません。


# 対象環境

## 自動化対象

* テクスチャ
* サウンド
* ビデオ


## 対象プラットフォーム

* PC
* Android
* iOS
* tvOS

WebGLにも対応するコードを書いているが、
自動設定の反映処理が動作しないため、非対応とする


# ざっくりとした使い方説明

1. UnityPackageのダウンロード、インポート
    1. https://github.com/syskentokyo/unityautoformatconfig/releases
1. いつもどおり対象ファイル(テクスチャなど）をUnityへインポート


# 設定について

プラットフォームごとの設定は、設定ファイルで変更できる

設定ファイルはここ
Assets/SyskenTLib/UnityAutoFormatConfig/Editor/Config

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24266/20fb2e8a-2d78-2519-82a8-49c853162088.png" width=50%>

また、設定は、フォルダごとにわけることができる
例えばテクスチャは、合計５つの種類の設定できる。

対象のファイルごとのパス設定は、General Configファイルで行うことができる

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24266/27b71bd0-357a-047c-940c-c94b7e8620b2.png" width= 45%>

例えばテクスチャの最大サイズの変更などは、
Assets/SyskenTLib/UnityAutoFormatConfig/Editor/Config/Texture
にあるディクレトリごとの設定ファイルで変更できる

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24266/a3cfcd1f-e7e5-d8f3-6fa7-50c3cf23e09d.png" width= 45%>


サウンドやビデオの設定はこれ

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24266/b0a23e74-ec63-b564-6125-855300e74053.png" width= 30%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24266/46aaa42b-2bfe-c9de-b291-f7b597863e15.png" width= 30%>


# 自動設定のコードについて

とてもシンプル。
インポート時に呼ばれるメソッドを定義し、独自の処理を記載するだけ。

例えばテクスチャなら、AssetPostprocessorを継承したクラスを作成する
OnPreprocessTextureメソッドを継承し、各設定を行っているだけ。

ビデオはちょっと特殊で、
テクスチャのOnPreprocessTextureのように専用のメソッドがない。
そのため汎用的なOnPreprocessAssetメソッドを使う。
そして動画であるかを判定し、設定を行う

```
        void OnPreprocessAsset()
        {
            if (assetImporter.ToString().Contains("VideoClipImporter")== false )
            {
                //ビデオ以外だった場合
                return;
            }

            //ここから動画だった場合の処理へ........

```


# おわりに


個人てきには、デモ用にUnityプロジェクトつくる時つかうようにしています。
スマホアプリの場合は、地味にプラットフォームごとの設定をしていないと、負荷が大きすぎることが多いためです。
最近だと、フォトグラ系のテクスチャへ自動設定ができて便利だったります。


他にも便利そうなものちょいちょいつくっています。
https://github.com/syskentokyo/publicunitylibrary
追加で何か作りましたら、Qiitaなどで共有していこうと思います
ニコニコ動画の新配信形式はどうなっているのか

11月頃から新サーバに移行しはじめてたり戻ったりしてるニコニコの配信形式ですが、どうやら以前のhls形式とは違った形式での配信が行われているようです。

# 三行で説明しろ
- 基本的にm3u8の形式に沿った配信がなされている
- 所定のファイルをすべてダウンロード後m3u8ファイルを書き換えることでffmpegで変換できる
- 単純にすごくめんどくさいので拙作のnico downloaderを使ってくれると嬉しい


# API
- API叩いたらここでもA/Bテストしているっぽくて泣きそうになった
- 安定してないのでここはかけない

# m3u8の安直な取得方法
- 前と同様にシステムメッセージに書いてある
```
動画の読み込みを開始しました。（https://delivery.domand.nicovideo.jp/hlsbid/～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～ ）
```
っていうところに書いてます
~~API叩いたらこのURL出せたけどAPIの挙動が読めないのでｵﾜﾘ~~

# m3u8ファイルが3つになった！
- 音声と動画部分が分かれて配信されるようになった
- TS形式ではなくCMAFで配信されるようになった
- Keyは#EXT-X-KEYに置いてあるURIが書いてある
- init01.cmfvとかinit01.cmfaは結合するために必要

# ffmpegで結合する方法
- m3u8ファイルを3つ用意する
   1. システムメッセージに書いてあるm3u8
   1. 1に書いてあるURIから持ってきたvideo-h264-XXXp.m3u8(XXXpは画質)
   1.   1に書いてあるURIから持ってきたaudio-h264-XXXkbps.m3u8(XXXkbpsは音質)

- 上記2と3に記載されているファイルをすべて保存する
- 中身をすべて書き換える
  - URIをどうやらファイル名だけにするとよいようだ

- ffmpegで結合する
  ```
  ffmpeg -allowed_extensions ALL -i システムメッセージに書いてある.m3u8 -c copy 出力動画名.mp4
  ```

これで一応再生できるh264のmp4が出来上がるはず

# めんどくさい方へ
この作業を自動でやってくれる拙作のChrome拡張機能 [nico downloader](https://chromewebstore.google.com/detail/nico-downloader/dncjcadpoakefjpnabimpalenliehbig "Chrome拡張機能:nico downloader") があるのでぜひ使ってください。

# ぐちゃぐちゃなコードで良ければ参考に
https://github.com/masteralice3104/nico_downloader
【Python】マルチスレッドとマルチプロセスの概要・違い

PHPをこれまでメインに使っておりましたが、現在のプロジェクトではPythonを使用しております。
慣れないというかPHPではあまり馴染みのないマルチスレッドとマルチプロセスについて、その違いと役割について備忘としてまとめます。

基本的な理解をするためのものなので、詳しい実装方法などは説明しません。

## 基本的な説明

### 通常の処理

通常の処理であればコードは逐次実行されます。
同時に複数の処理が行われることはなく、上から順にコードが実行されていきます。

### マルチプロセス (並列処理)

複数の作業者がおり、同時に二つの処理を実行するような処理方法を言います。
マルチプロセスはプロセスを二つ利用します。
プロセスとはコンピューター上で動かす処理単位を言います。PCで複数アプリケーションを使用している場合は、マルチプロセスを行っていると言えます。

![multiprocess.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470041/47c79fca-6226-c422-645f-7ff07db40afa.png)

### マルチスレッド (並行処理)

一つの作業者ですが、他の処理の空き時間を利用して処理を実行するような処理方法のことを言います。
スレッドとはプロセスをさらに細分化したような単位です。

![multithread.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470041/8dd88333-250a-5432-50a3-97e094cbb46e.png)


## それぞれの得意
### マルチプロセス(並列処理)
CPUバウンドが発生するような処理に使うのが良いです ⇒ 計算量が多くなってしまうもの

例)
- 大量の計算処理
- PDFを画像に変換する処理など

### マルチスレッド(並行処理)
I/O(インプット/アウトプット)バウンドが発生するような処理に使うのが良いです

例)
- APIの呼び出し
- データベースへの挿入など

## 実装方法

どちらもconcurrent.futuresモジュールからインポートして実装することができます。
以下を見てもらえば分かりますが、記述自体はほとんど変わりません。

### マルチプロセス(並列処理)
```python
import concurrent.futures

def func1():
    # func1の処理
    print('func1')

def func2():
    # func2の処理
    print('func2')

# ProcessPoolExecutorを使用して並列処理を実行
with concurrent.futures.ProcessPoolExecutor() as executor:
    # 各関数を並列に実行
    executor.submit(func1)
    executor.submit(func2)
```

### マルチスレッド(並行処理)
```python
import concurrent.futures

def func1():
    # func1の処理
    print('func1')

def func2():
    # func2の処理
    print('func2')

# ThreadPoolExecutorを使用してマルチスレッド処理を実行
with concurrent.futures.ThreadPoolExecutor() as executor:
    # 各関数を並行処理で実行
    executor.submit(func1)
    executor.submit(func2)
```

今回は基礎的な実装しか書いていないのでもし詳しいことが知りたい場合は以下を参照してください

https://docs.python.org/3/library/concurrent.futures.html
systemdのtimerで定期実行しよう！

# systemdのtimerで定期実行しよう！

##  きっかけ
- 古いサーバを解約してAWSに集約した後で定期実行について調べた時にcrondがプリインストールされていなかった
- 非推奨というわけではなかったがsystemdのtimerを推奨しているようだったので、内容を調べた備忘録を記載する

## Systemdのtimerってなに？
- systemdの元で動く、定期実行する仕組み
    - systemdはLinuxのほぼすべてのディストリビューションに含まれるようになった
- cronと同様に設定ファイルを置くことで定期実行を行ってくれる

## 設定方法
※ 以下の設定はAmazon Linux 2023を用いて実施している
- ec2-userで朝6時にPythonのスクリプトを実行する例を記載します
### 設定ファイルの作成
`/etc/systemd/system`に`xxx.service`と`xxx.timer`を作成します

:::note warn
xxx.serivceとxxx.timerのxxxの部分は同じ名前にしましょう
:::

```sample.service
[Unit]
Description=Run sample.py script as ec2-user

[Service]
Type=oneshot
User=ec2-user
ExecStart=/usr/bin/python /home/ec2-user/source/sample.py

[Install]
WantedBy=multi-user.target
```
それぞれの設定値について

|名前|説明|
|:--:|--|
|Description|そのユニットが何をするものなのか記載するところ|
|Type|サービスの実行タイプ<br>oneshotは一度だけ実行するタスクに適している。<br>その他のオプションについては別途まとめます|
|User|どのユーザで実行するか選択する|
|ExecStart|このtimerで何を実行するのか絶対パスで記述|
|WantedBy|手動での起動が前提の場合は不要です。<br>APIなどネットワークに接続する必要があるときは書いたほうが無難でしょう|

```sample.timer
[Unit]
Description=Timer for sample.py Script

[Timer]
OnCalendar=*-*-* 06:00:00
Persistent=true

[Install]
WantedBy=timers.target
```
|名前|説明|
|:--:|--|
|Description|そのユニットが何をするものなのか記載するところ|
|OnCalendar|実行するタイミングを記載します。<br>詳しい記載内容は別途|
|Persistent|指定したタイミングで実行されなかった場合に、システム再起動後に時間外でも動かす必要がある場合Trueに設定します。|
|WantedBy|cronの代用として使うため記述します。<br>時間になったら動くようにするために必要な設定です。|

### 設定の有効化
- サービス自動起動有効
`sudo systemctl enable sample.timer`
- サービスの起動
`sudo systemctl start sample.timer`

### 起動確認
- 再起動後など、自動起動されることを確認
`sudo systemctl is-enabled sample.timer`
- ステータスの確認
`sudo systemctl status sample.timer`
- タイマー設定の一覧で確認
`sudo systemctl list-timers`

ここまで確認すれば安心ですね👍

#### 次回予告
明日の記事は.serviceや.timerの中身について詳しく書いていこうと思います！

### 参考文献

https://wiki.archlinux.jp/index.php/Systemd/%E3%82%BF%E3%82%A4%E3%83%9E%E3%83%BC
初めてのチーム開発〜第1章〜

---
2023年Apprentice第2期生としてチーム開発-第1回目-を行いました！

このブログは私が所属したチームが様々な課題を解決し、アプリを作成する一つの物語です。

私たちは、スケジュールアプリ「スケミ」を開発しました！

スケミの概要は[コチラ](https://qiita.com/HACHI32/items/06bf7c07f72061a16615)

---

では始まり始まり💨

まずはチーム開発をどのように行ったかについて📝

最初に決めたことは以下です。

- チーム名を決定
- チームMTGの日程を調整(週2回)
- 開発するアプリを決定
- アプリの作成方法を模索
- 機能の洗い出し

開発するアプリについては様々な意見が出ました💡

- 料理に関するレシピ決定アプリ
- プログラミング特化のタスク管理、勉強メモアプリ
- スケジュールアプリ

今回の開発アプリにはテーマがありました。

「自分たちに役立つアプリの開発」

ここで私たちは、初めてMTGをしてチーム会のスケジュール決めに苦労したことを思い出します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579151/4768fa9a-4684-5859-6172-923571f4d44b.png)


😖4人が全員空いている日時は一体いつなんだ、、、

そうだ！スケジュールアプリを作成すればこの問題は解決されるのでは！？

と、意見が一致して「スケジュールアプリ」を作成することになりました👏

さて、ここで開発するアプリは決定したのですがここで一つ問題が出てきました。

チームアプリ開発の要件のひとつに、フレームワークは使用しない。というのがありました。

私たちがこの学習期間で学んできたことは

Ruby、MySQL、HTML、CSS、JavaScript(基礎)

🤔うーんと、どうやってそれぞれを繋げてアプリを動かすんだろう。。。？

各自で調べた結果、Rubyのライブラリである[Webrick](https://docs.ruby-lang.org/ja/latest/library/webrick.html)に辿り着きます！

よしよし、サーバーはなんとかなりそうだな！となったのですがまだまだ問題が💦

- データベースはどのように繋げるのか
- macを使っている人、Windowsを使っている人と開発環境が違う

さて、どうやって解決していこうか、、、

私たちのチーム開発はまだまだ続きます！

[初めてのチーム開発〜第2章](https://qiita.com/HACHI32/items/88748d92385c5ca25438)〜へ続く
【React】textareaに記述している内容が全て表示されるようにする方法

以下のように記述することで内容に合わせてtextareaの高さを自動で変更できます。

```tsx:Textarea.tsx

export default function TextArea() {
  return (
    <textarea
        onChange={(ev) => {
          ev.currentTarget.style.height = 'auto'
          ev.currentTarget.style.height = `${ev.currentTarget.scrollHeight}px`
        }}
    />
  )
}
```
Kubernetes:Dynatrace Operator YAMLマニフェストを分解してみる

こんばんわ。Dynatrace井上です。

`K8S` を監視観測する場合、多くの場合`Dynatrace Operator`を使います。

マニフェスト`YAML`ファイルへのリンクは例えば以下のドキュメントページに出てきます。

https://docs.dynatrace.com/docs/shortlink/guides-k8s-update-uninstall-operator#manifest-uninstall

このYAMLファイルは実際は複数YAMLの結合です。

> その境界は「---（ハイフン3つ）」で仕切ります

https://zenn.dev/mkosakana/articles/459d6126236bf0#%E8%A4%87%E6%95%B0yaml%E3%81%AE%E7%B5%90%E5%90%88%EF%BC%881%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E8%A4%87%E6%95%B0%E3%81%AEyaml%E3%82%92%E5%90%AB%E3%82%81%E3%81%9F%E3%81%84%E5%A0%B4%E5%90%88%EF%BC%89

通常は必要ないですが例えばバージョン間の差分を知りたいなどの場合分解して比較してみたくなることもあるかと思います。そこで試したのが以下の分解方法です。

```terminal
$ mkdir Dynatrace_k8s
$ curl --silent --location \
 https://github.com/Dynatrace/dynatrace-operator/releases/download/v0.14.0/kubernetes.yaml |
 csplit --silent --elide-empty-files --prefix Dynatrace_k8s/Operator140_ - '/^---$/' {*}
$ ls -l Dynatrace_k8s
total 320
-rwxrwxrwx 1 kinoue kinoue    332 Dec  4 00:06 Operator140_00
-rwxrwxrwx 1 kinoue kinoue    905 Dec  4 00:06 Operator140_01
-rwxrwxrwx 1 kinoue kinoue    904 Dec  4 00:06 Operator140_02
-rwxrwxrwx 1 kinoue kinoue    938 Dec  4 00:06 Operator140_03
-rwxrwxrwx 1 kinoue kinoue    942 Dec  4 00:06 Operator140_04
-rwxrwxrwx 1 kinoue kinoue    897 Dec  4 00:06 Operator140_05
-rwxrwxrwx 1 kinoue kinoue    893 Dec  4 00:06 Operator140_06
-rwxrwxrwx 1 kinoue kinoue 217416 Dec  4 00:06 Operator140_07
-rwxrwxrwx 1 kinoue kinoue  33502 Dec  4 00:06 Operator140_08
-rwxrwxrwx 1 kinoue kinoue   1896 Dec  4 00:06 Operator140_09
-rwxrwxrwx 1 kinoue kinoue   2129 Dec  4 00:06 Operator140_10
-rwxrwxrwx 1 kinoue kinoue   1896 Dec  4 00:06 Operator140_11
-rwxrwxrwx 1 kinoue kinoue    577 Dec  4 00:06 Operator140_12
-rwxrwxrwx 1 kinoue kinoue    510 Dec  4 00:06 Operator140_13
-rwxrwxrwx 1 kinoue kinoue    504 Dec  4 00:06 Operator140_14
-rwxrwxrwx 1 kinoue kinoue   3076 Dec  4 00:06 Operator140_15
-rwxrwxrwx 1 kinoue kinoue   1624 Dec  4 00:06 Operator140_16
-rwxrwxrwx 1 kinoue kinoue    487 Dec  4 00:06 Operator140_17
-rwxrwxrwx 1 kinoue kinoue    506 Dec  4 00:06 Operator140_18
-rwxrwxrwx 1 kinoue kinoue   1092 Dec  4 00:06 Operator140_19
-rwxrwxrwx 1 kinoue kinoue   3872 Dec  4 00:06 Operator140_20
-rwxrwxrwx 1 kinoue kinoue   4711 Dec  4 00:06 Operator140_21
-rwxrwxrwx 1 kinoue kinoue   1992 Dec  4 00:06 Operator140_22
-rwxrwxrwx 1 kinoue kinoue   1889 Dec  4 00:06 Operator140_23
```

これだけだとファイル名が連番になるだけなので、ファイル名を意味あるものに一括変更する方法を探してみます。
チーム開発アプリ「スケミ」の詳細

Apprenticeにおいてチーム開発を行いました。


## **テーマ**『自分たちの役に立つものを開発せよ』です。

### チーム開発の要件

- ベースとなる技術は HTML/CSS/JavaScript/MySQL/Ruby or PHP を使用
- Rails, Laravel, React などのフレームワークは使わない。
- ローカル（手元のPC上）で動くようにする
- 最終日に各チーム、制作物をプレゼン。**プレゼン時間は5分**。
- プレゼンは Zoom の画面共有で、スライドとデモを使用
- デモはローカル上で制作物を実際に動かして見せること。  
    ※基本はデモで動作するところを見せる
    
- プレゼン後、メンター及び受講生全員で投票を行う

### 開発期間は約2週間

私たちのチームはスケジュールアプリを作成することにしました。

### アプリの作成背景

「なぜこのアプリを作ろうと思ったのか、どんな課題を解決したかったのか」について

1. **スケジュール調整の困難さ**:
    - チームメンバーがバラバラのスケジュールを持っており、全員の都合が合う時間を見つけるのが難しい状況。
    - 例えば、あるメンバーは平日の夜しか空いていない、別のメンバーは週によって予定が変わるなど。
2. **既存ツールの限界**:
    - Googleカレンダーや他のスケジュール調整ツールは、ユーザー登録が必要であったり、操作が複雑だったりする。
    - これらのツールでは、特に小規模チームや非定型的なスケジュールに対応するのが難しい。
3. **時間の制約**:
    - チームメンバーが仕事や自主学習に忙しく、スケジュール調整に多くの時間を割くことができない。
    - 効率的かつ迅速にスケジュールを調整したいという強いニーズがある。
4. **シンプルで効果的な解決策の必要性**:
    - ユーザーが短時間で直感的に利用できる、シンプルで効率的なスケジュール調整ツールの必要性が明らかになった。
5. **チームワーク向上**:
    - より良いチームワークを目指すために、スムーズなスケジュール調整が不可欠。
    - ミーティングの計画を簡素化し、チームの生産性を高めることを目指す。

上記のように、日中仕事をしている方、毎週ランダムな休みや就業時間の方がいてチームMTGの日程を決めることがとても難しかったり、スケジュール調整に時間をとられるわけにもいかず、とにかくパッ！と日程を決めたかったです。


### スケジュールアプリの要件定義

1. **個別色分け表示機能**:
    - 各ユーザーに固有の色を割り当て、そのユーザーの空いている時間をその色で表示。
    - これにより、誰がいつ空いているかを一目で確認できる。(ハイライト表示)
2. **空いている時間の入力と表示機能**:
    - ユーザーが自分の空いている時間をクリックやドラッグで簡単に入力できる機能。
3. **時間の重複確認機能**:
    - すべてのメンバーの空いている時間がそれぞれの色で表示されている
    - 共通の空き時間が色でわかる(一色で表示される)
4. **柔軟なスケジュール管理**:
    - 予期せぬスケジュールの変更に対応できるよう、簡単に日程を更新できるシステム。
5. **直感的で使いやすいインターフェース**:
    - 初めてのユーザーでも直感的に操作できるクリアなデザイン。

### アプリのコンセプト
早い！軽い！簡単！

### 業務要件フロー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579151/b9fc62cb-a952-eeac-8a85-790583b8b50c.png)

### 実際の画面デモです！

ユーザーがニックネームを追加し、自分のスケジュールを保存する画面

[![Image from Gyazo](https://i.gyazo.com/0a64feb6ac74fc445dc43667d661530c.gif)](https://gyazo.com/0a64feb6ac74fc445dc43667d661530c)

4人のユーザーがスケジュールを保存し、一致した日時がある場合の画面

[![Image from Gyazo](https://i.gyazo.com/ad4a433b01ba8c1f6a7ed42e1bc8f37e.gif)](https://gyazo.com/ad4a433b01ba8c1f6a7ed42e1bc8f37e)

ハイライトされている部分が、4人全員があいているスケジュール日時です！


### 今回****使用した技術****

- **フロントエンド開発**:
    HTML／CSS／JavaScript
    
- **バックエンド開発**:
    Ruby／Webrick（RubyのHTTPサーバライブラリ）
- **データベース**:
    MySQL／mysql2（RubyのMySQLデータベース接続アダプタ）
- **開発環境**:
    Docker（アプリケーションのコンテナ化）
- **ソースコード管理**:
    Git／GitHub（ソースコードのバージョン管理と共有のためのプラットフォーム）
VBAでバーコードを画像に出力するプログラムをChatGPTに聞いてみた

### 背景
Pythonのライブラリーで出力したバーコードで読み込みができずにVBAで出力したバーコードのみしか対応できないため、VBAでバーコードを画像に出力するプログラムを作成しかありませんでした。
このコードでは、SaveClipboardAsPNGサブルーチンがクリップボードから取得した画像をPNGファイルとして保存します。ActiveWindow.SelectedSheets.CopyPictureを使用してスクリーンショットを取得し、それをクリップボードにコピーしています。

fileName を適切なパスとファイル名に変更してください。これにより、指定されたパスにPNG形式のバーコード画像が保存されます。

```vba
Sub GenerateAndSaveBarcodePNG()
    Dim barcodeValue As String
    Dim barcodeFont As String
    Dim fontSize As Integer
    Dim fileName As String

    ' バーコードに変換する値
    barcodeValue = "123456789"

    ' 使用するバーコードフォント
    barcodeFont = "Free 3 of 9"

    ' フォントサイズ
    fontSize = 16

    ' 新しいシートを作成
    Sheets.Add

    ' バーコードをセルに設定
    Range("A1").Value = barcodeValue

    ' セルにバーコードフォントを適用
    Range("A1").Font.Name = barcodeFont
    Range("A1").Font.Size = fontSize

    ' シートをアクティブにする
    Sheets(1).Activate

    ' シートをスクリーンショットとして保存
    fileName = "C:\Path\To\Save\BarcodeImage.png"
    ActiveWindow.SelectedSheets.CopyPicture Appearance:=xlScreen, Format:=xlPicture
    SaveClipboardAsPNG fileName

    ' シートを削除
    Application.DisplayAlerts = False
    ActiveWindow.SelectedSheets.Delete
    Application.DisplayAlerts = True
End Sub

Sub SaveClipboardAsPNG(filePath As String)
    ' クリップボードの内容を取得
    Dim img As Object
    Set img = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")

    ' クリップボードの内容をPNGファイルとして保存
    With img
        .SaveAsFile filePath, 2 ' 2 はPNGフォーマットを指定
    End With
End Sub
Pythonを使ってPDFデータをPNG画像に変換するやり方（をあえて投稿する）

# ソリューション

~~~
>pip install pdf2image
~~~

フォルダ構成とかは、以下のソースコード参照

~~~p2i.py
import os
from pathlib import Path
from pdf2image import convert_from_path

# poppler/binを環境変数PATHに追加する
poppler_dir = Path(__file__).parent.absolute() / "poppler/Library/bin"
os.environ["PATH"] += os.pathsep + str(poppler_dir)

# PDFファイルのパス
pdf_path = Path("./000108041.pdf")
print(pdf_path)

# PDF -> Image に変換（150dpi）
pages = convert_from_path(str(pdf_path), 150)

# 画像ファイルを1ページずつ保存
image_dir = Path("./img_data")
for i, page in enumerate(pages):
    # PNGで保存
    file_name = pdf_path.stem + "_{:03d}".format(i + 1) + ".png"
    image_path = image_dir / file_name
    page.save(str(image_path), "PNG")
~~~

# 参考文献

https://gammasoft.jp/blog/convert-pdf-to-image-by-python/


# そもそもネットに車輪の再開発されまくっているネタ

Pythonを使ってPDFデータをPNG画像に変換するなんていうネタは山ほどあるわけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308248/ac7befbe-41d9-9bfd-1c3a-4c0cd41c8867.png)

これをあえて書く必要があるのか？っていう話です。

結論からいうと、個人的には「ある」と思っていて

- 自分の知識の整理になる
- 次回検索したときに、そのサイト（エントリ）があるとは限らない
- 自分なりの好きな（しっくりくる）コードを残して置ける

などの理由で、そういうのを書いておくのは重要だと思っています。

（おわり）