OmniAICreator/Qiita-1.07M huggingface dataset:
【Google Cloud Next Tokyo ’23レポート】

# はじめに
2023/11/15,16にビッグサイトで開催されるGoogle Cloud Next Tokyo '23に参加します！
今回は受講したセミナーについてのレポートを記事として出して行こうと思っています。

普段、AWSを中心に使っているためGoogleのサービス群には馴染みが薄いのですが、普段使っていないエンジニアならではの視点でレポートができればと思っています。

リアルイベント自体参加するのも久しぶりなので、とても楽しみです！！！

# 受講セミナー予定
## DAY1
- 基調講演
https://qiita.com/sho_fcafe/items/8db84dcf3861856a1eab

- 任天堂のデータ分析基盤
https://qiita.com/sho_fcafe/items/1bc2881a4f3cdd91c5a5

- リアルタイム解析データをトリガーにしたアプリケーション構築方法のご紹介
https://qiita.com/sho_fcafe/items/5d4c51f533386383a2ba

- 今日はじめる高速セキュアなアプリケーション開発DevSecOpsとシフトレフト
https://qiita.com/sho_fcafe/items/8a4c6da227e05b5a9816

- SLO 監視でサービス品質を一段上げる！Google Cloud Monitoring活用法
https://qiita.com/sho_fcafe/items/158a5bf7f1d3169f0f37

- Google Maps Platform を使った物流ラストマイル最適化問題への取り組み
https://qiita.com/sho_fcafe/items/83ba65acc25050df0c9a

## DAY2
- 基調講演
https://qiita.com/sho_fcafe/items/df237e6c664112317b13
- これからはじめるVertex AI Codey と Duet AI のアプリ開発
https://qiita.com/sho_fcafe/items/c5f1b37abdc6e34136fe
- Colab で素早く、コラボレーティブにVertex AI での AI 構築を実現しましょう
- メルコインのマイクロ サービスを支えるGoogle Cloud 利用事例
- 億単位の広告配信ログをリアルタイム レポートに加工して顧客に届けるデータ基盤開発
- DMM プラットフォームにおけるGKE を利用したプラットフォームエンジニアリングへの取り組み
- Google のサステナビリティ、世界と日本に広がる取り組み

# 関連記事
https://qiita.com/yukiMiyoshi_fcafe/items/18ad65426e1a71311419


# 参考
https://cloudonair.withgoogle.com/events/next-tokyo
【Google Cloud Next Tokyo ’23レポート】４年ぶりのオフライン・Google Cloud Nextに行ってきた

# はじめに
2023年11月15、16日。
東京ビッグサイトで開催されるGoogle Cloudのカンファレンス、Google Cloud Next Tokyo '23。
実に４年ぶりに東京でオフライン開催される、クラウド界隈でも最大規模のイベント。

前回開催された際に、現地参戦したのがもう４年も前の話だという事に驚きもありますが、
４年前に参加した時に、多種多様な参加者と充実したセッション、実に有意義な経験になった思い出があります。

確か、歴代のPCが並べられて、むかーしのgoogle検索が触れたり、
googleエンジニアおすすめの書籍コーナーがあったり。
最終日の夜には、googleエンジニアによるライブパフォーマンスがあったり。

いろんな意味で刺激的でした。

今回は、昨今世間を賑わしている生成AIにフォーカスをあてた内容になっていて、
とても楽しみ。

Google Cloud Next Tokyo ’23、その２日間のレポートをお届けできればと思っています。

![PXL_20231115_002602174.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1458753/f9896ecf-94f9-7557-0756-bf5078a75143.jpeg)

![PXL_20231115_072239403.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1458753/95f47bef-3023-ff3f-1565-718124c447fa.jpeg)

![PXL_20231115_072255291.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1458753/6892f652-5fd8-0d5e-1cf6-3e37b6e91338.jpeg)

# 受講セミナー（予定）

## DAY1
- [基調講演](https://qiita.com/yukiMiyoshi_fcafe/items/41ef577743f3e80ec2c4)
- [AWSとGoogle Cloud の垣根を超えてデータを活用する方法](https://qiita.com/yukiMiyoshi_fcafe/items/b2b466ec6ed2618efa18)
- [働き方と働く環境をデータで可視化！イトーキ様分析ツール開発事例に学ぶ](https://qiita.com/yukiMiyoshi_fcafe/items/6a95237f86806ce66bf6)
- [2023年版: アプリケーションをどこで動かすべきか](https://qiita.com/yukiMiyoshi_fcafe/items/abdf0cfc9239a09fb8f4)
- [グローバル No 1 サービスを目指すmeviy に、なぜカルチャー推進が重要なのか？～社員の自己肯定感を高める](https://qiita.com/yukiMiyoshi_fcafe/items/9e507b2303e14402901e)
- ~~金融システムのセキュリティ対策要点と最新版 FISC リファレンスのご紹介~~
- [最新Google Cloud CI/CDを利用したソフトウェア デリバリー](https://qiita.com/yukiMiyoshi_fcafe/items/6a4273120e835a4510d0)

## DAY2
- [基調講演](https://qiita.com/yukiMiyoshi_fcafe/items/fee07331916d7fcf2e81)
- [生成AIのもたらすインパクトとエンタープライズ利用における検討ポイント](https://qiita.com/yukiMiyoshi_fcafe/items/3d7755e5bd85856a25cd)
- [PIVOT様と事例を交えて、クラウドリフトに潜むしくじりポイントを大公開 !!](https://qiita.com/yukiMiyoshi_fcafe/items/c6389a473eaaae64140b)
- [強みを活かす組織づくりへの変革を考える](https://qiita.com/yukiMiyoshi_fcafe/items/87f85afeae5768d1591f)
- [日本の空を支えるGoogle Workspace](https://qiita.com/yukiMiyoshi_fcafe/items/9f34dd4f2ec1ae5abce0)
- [運用管理者目線でみたGoogle Workspaceのリアル](https://qiita.com/yukiMiyoshi_fcafe/items/928ad2998e0d9e8171fe)
- [Google Cloudと歩むスタートアップの軌跡 -Bitkey と Luup の成長物語 -](https://qiita.com/yukiMiyoshi_fcafe/items/1f75829544b40fbea170)

# DAY1の総括
一通り受けてみてまず思ったのは、個人的には各GCPサービスの紹介よりも、
それらをどう活用し、プロダクトに活かしているのかであったり、アイディアを実現するために何故そのインフラを選んだのか？というような話を聞くのが面白かった。

他、組織のカルチャーのお話はすごく印象に残っていて、IAmRemarkableという言葉や考え方は、しばらく自分の中に残りそう。

それにしてもこういったイベントに参加して毎回思うのは、世の中すごい！ということ。
普段自分たちの枠の中で仕事していて、しばらくすると気づかないうちに何か見えない枠の中に収まろうとしていのではないか？と思う。
こういう機会にいつもそれをぶち壊してくれて、自然とモチベーションが上がる。

また、オフラインであることで、より没入できるので、
どこからでも参加できるオンラインという形も素晴らしいけれど、
やはりオフラインで得られるものとは違う。

DAY2も楽しみ！

# 関連記事
- [【Google Cloud Next Tokyo ’23レポート】 by sho_fcafe](https://qiita.com/sho_fcafe/items/a97ee90d6a05f68e1c01)
# 参考
https://cloudonair.withgoogle.com/events/next-tokyo
クリップボードにコピーした画像をEPSに出力するコマンド

準備
```
brew install pngpaste
brew install imagemagick
```

クリップボードに画像をコピーしたら、以下のコマンドを叩く。
```
pngpaste ~/temp_clipboard_image.png
convert ~/temp_clipboard_image.png ~/clipboard_image.eps
rm ~/temp_clipboard_image.png
```
`~/clipboard_image.eps`が生成される。


同じことをするワンライナー
```
pngpaste ~/temp_clipboard_image.png; convert ~/temp_clipboard_image.png ~/clipboard_image.eps; rm ~/temp_clipboard_image.png
```

Latexで草稿を書いていて、サクッと画像をアップしたいときに便利。
1ラインバッファー方式まとめ


1ラインバッファー方式まとめ



https://qiita.com/caa45040/items/e2e61c6975ba17e7fd08


https://qiita.com/caa45040/items/7e65d219385e03dddb0f


https://qiita.com/caa45040/items/8b5be039f4d3169b07ea




----------------------------------------------

ST7735S P

https://qiita.com/caa45040/items/72ff40efa18e889a1329


----------------------------------------------

ST7735S SPI


https://qiita.com/caa45040/items/a594f0d550fc5431d2d7


----------------------------------------------

ST7789V2 SPI



https://qiita.com/caa45040/items/d25cccc40e8900c125bb


----------------------------------------------

ILI9341

https://qiita.com/caa45040/items/2506a81449796e3f7c70
マナビDX Quest：アクセスログから学ぶ参加者の心理

[ケムファク](https://twitter.com/chem_fac)と申します。
普段は[プラントの技術者向けのブログ](https://chem-fac.com/)を書いています。

マナビDX Quest 2022に参加後、すぐに次年度以降の参加者に向けて記録を書きました。

https://chem-fac.com/manabi-dx-quest-2022/

公開から10ヶ月ほど経ち、2023年度参加者・参加希望者のアクセス数や見出しクリック数などのデータが集まっています。
皆さんがどのような点に興味を持っているのか、データを集計してみました。

## アクセス記録
最初にブログのアクセス記録（PV数）を確認します。
簡単に言うと、この記事が何回見られたかを表します。

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619740/5ff0a723-5eeb-6078-6dc4-0d9c5d1e99b8.png">

2023年6月から急激にアクセスが伸びています。
[マナビDX QuestのHP](https://dxq.manabi-dx.ipa.go.jp/)のお知らせ欄から公開された流れを確認してみます。
<img width="1000" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619740/c62c2c2d-04ce-833c-d747-b4133933dcb0.png">

6月5日にサイト公開されており、第一タームの応募が終わる7月がピークとなっています。
スケジュールと一致しています。

実はアクセスのピークは、サイト公開翌日の6月6日です。
各種メディアやSNSなどで情報が広がって検索された方が多いと思われます。
<img width="1000" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619740/d6cd9ec0-f158-ad09-b57b-8676ca3c8541.png">

ちなみに7月はピークこそ無いものの、安定して高めの値を出していました。

## 検索記録
記事がGoogle検索から閲覧されるとき、どのような内容で検索されているのか確認します。
特にアクセスの大きかったキーワードを紹介します。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619740/33874ae0-e4f5-87b5-9cca-70d9e429f377.png">

- マナビdxクエスト 落ちた
- マナビdxクエスト 評判

圧倒的にこの2つのキーワードでのアクセスが多かったです。
検索キーワードからは **「選考って難しいの？」「有意義なものなの？」という疑問** が伺えます。

当時SNSでは選考で落ちた話を見かけていましたが、私も合格していますのでブログ記事では取り上げられていませんでした。
何か参考になるような情報を記載しておけば良かったです……

## 見出しクリック記録
記事の見出しにもクリック数を集計する機能があります。
以下のような見出し構成にしていました。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619740/a43760b3-0803-f412-d246-b18d248059d7.png">

これら見出しがクリックされた回数をグラフに表してみました。
クリック数は2023年2月～11月までの合計値です。

まずは大見出しごとに集計しました。

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619740/1c8bd8f4-2897-204c-a0b5-fc20cbd8f892.png">

 **「3. スケジュール」** のクリックが目立ちます。
詳細を知るというよりも、まず「そもそも完遂できるの？」という疑問が伺えます。

一方で **「5. マナビDX Quest のここが凄かった」** という体験談の部分は他よりもクリック数が少なかったです。

詳細の見出しも含めて全体を見てみます。

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619740/edd4d5b0-f2ca-e179-ab23-2699aa319cce.png">

まず目を引くのが **「3-1. とにかく忙しい！」** です。
仕事やプライベートで忙しい中、約半年間も参加しますから不安な部分も多いと思われます。

更に **「2-1. ケーススタディ教育プログラム」** についてクリックする方も多いようです。
これもマナビDX Questの主となる部分ですね。

**ただし見出しの性質上、読みたいところ以降から読む、各大見出しの頭から読むという傾向もあるため、少し人の感覚に引っ張られた集計値となっていることはご理解ください。**

## 最後に
マナビDX Questについてブログ記事を書いて、なおかつデータまで取得されている方は少ないと思われます。
せっかくなのでアドベントカレンダー企画に乗っかってまとめてみました。

結果は **「忙しいの？」「難しいの？」「有意義なの？」** といった疑問が分かりやすくデータに表れていました。
今後も続いていくイベントだと思いますので、紹介される方はこのデータを参考に説明頂けると参加率が上がるかもしれません。

## 宣伝
発信活動をしていますので宣伝させてください。
### 製造業DX アドベントカレンダー
2023年度は「製造業DX」に関するアドベントカレンダーを主催しています。
もしご興味があれば是非とも参加ください！

https://note.com/chem_fac/n/n5e04e7ba5e55

### ブログ「ケムファク」
プラント関係の技術者向けにブログを書いています。
配管・化学工学・機械・電気計装・データサイエンスなど広い分野で公開しています。

https://chem-fac.com/

### X（Twitter）
製造業の技術やデータ分析に関する発信をしています。

https://twitter.com/chem_fac
AWSを用いてHTTPS通信を行う方法

# AWSを用いてHTTPS通信を行う方法

インターネット上でのデータの安全なやり取りは、ウェブサイトの信頼性とユーザーのセキュリティを確保するために非常に重要です。特に、HTTPとHTTPSの違いと、HTTPS通信を実現するために必要なサーバー証明書の役割を理解することが重要です。AWS（Amazon Web Services）は、このようなセキュアな通信を容易に実装するツールとサービスを提供しています。ここでは、HTTPとHTTPSの基本的な違い、HTTPSにおけるサーバー証明書の重要性、そしてAWS Certificate Managerについて詳しく解説します。

## HTTPとHTTPSの違い

### 基本的な概念

#### HTTP（Hypertext Transfer Protocol）

- **概要**: ウェブ上で情報をやり取りするためのプロトコルですが、暗号化されていないためデータが盗み見されるリスクがあります。
- **利用**: 主にウェブブラウザとサーバー間でHTML文書などの情報をやり取りする際に使用されます。

#### HTTPS（HTTP Secure）

- **概要**: HTTPにSSL（Secure Sockets Layer）またはTLS（Transport Layer Security）というセキュリティ層を加えたプロトコルです。これにより、データの暗号化が行われ、通信が保護されます。
- **利用**: オンラインバンキングやショッピングサイトなど、セキュリティが求められるウェブサイトで一般的に使用されます。

## HTTPSにサーバー証明書が必要な理由

### 信頼性とセキュリティの確保

HTTPS通信では、サーバー証明書が重要な役割を果たします。この証明書は、ウェブサイトが信頼できるものであることを証明し、第三者によるデータの改ざんや中間者攻撃を防ぎます。

#### 証明書の機能

- **認証**: 証明書はウェブサイトの正当性をブラウザに証明します。これにより、ユーザーは訪れたサイトが正規のものであることを確認できます。
- **暗号化**: 通信を暗号化するための鍵が証明書に含まれており、これにより送受信されるデータが保護されます。

## AWS Certificate Managerの役割

### サーバー証明書の管理を簡素化

AWS Certificate Manager（ACM）は、AWSクラウド上でSSL/TLS証明書を簡単にプロビジョニング、管理、展開できるサービスです。ACMを使用すると、AWSリソースに対してHTTPSを容易に実装できます。

#### ACMの主な特徴

- **自動更新**: ACMは証明書の有効期限が近づくと自動的に更新を行い、証明書の期限切れによる問題を防ぎます。
- **統合性**: AWSの他のサービス（例えば、Elastic Load BalancingやAmazon CloudFront）と簡単に統合でき、セキュアなウェブアプリケーションの構築を支援します。

## まとめ

HTTPとHTTPSの違いを理解し、HTTPS通信におけるサーバー証明書の重要性を把握することは、ウェブセキュリティを確保する上で非常に重要です。AWS Certificate Managerを利用することで、SSL/TLS証明書の取得と管理を容易に行い、AWS環境上でセキュアな通信を実現することができます。これにより、データの保護とユーザーの信頼を確保し、安全なウェブサービスを提供することが可能になります。
公開鍵暗号方式と共通鍵暗号方式のメカニズム

# 公開鍵暗号方式と共通鍵暗号方式のメカニズムと違い

暗号化技術は、デジタル時代における情報セキュリティの根幹をなすものです。その中でも、公開鍵暗号方式と共通鍵暗号方式は、データの安全な伝送と保管に広く用いられています。これら2つの方式は、基本的なメカニズムや用途において異なる特徴を持ちます。この記事では、公開鍵暗号方式と共通鍵暗号方式の基本的な仕組みとそれらの違いについて、初心者にも分かりやすく解説します。

## 公開鍵暗号方式

### データの安全な交換を可能にする方式

公開鍵暗号方式では、暗号化と復号に異なる2つの鍵（公開鍵と秘密鍵）を使用します。この方式の最大の特徴は、公開鍵を安全でないチャネル経由で共有しても、秘密鍵が漏洩しない限り安全性が保たれる点です。

#### 鍵のペア

- **公開鍵**：誰でもアクセス可能な鍵。この鍵を使って暗号化されたデータは、対応する秘密鍵を持つ者だけが復号できます。
- **秘密鍵**：個人が秘密に保持する鍵。この鍵を使って復号されたデータは、対応する公開鍵を使って暗号化されています。

### 用途

- **データの安全な送信**：公開鍵を使用してデータを暗号化し、受信者のみが秘密鍵で復号できます。
- **デジタル署名**：データの完全性と送信者の認証を保証するために使用されます。

## 共通鍵暗号方式

### 効率的な暗号化手法

共通鍵暗号方式では、暗号化と復号に同じ鍵を使用します。この方式は単純で処理が高速なため、大量のデータの暗号化に適していますが、鍵の共有がセキュリティの大きな課題となります。

#### 鍵の管理

- **共通鍵**：暗号化と復号に同一の鍵を使用。鍵の配布や管理が重要なセキュリティの要素となります。

### 用途

- **大量データの暗号化**：処理速度が速いため、大規模なデータセットの暗号化に適しています。
- **ファイルの暗号化**：ファイルやデータベースのセキュアな保管に用いられます。

## 公開鍵暗号方式と共通鍵暗号方式の違い

### セキュリティと効率のバランス

公開鍵暗号方式と共通鍵暗号方式は、セキュリティと効率のバランスにおいて異なるアプローチを取ります。

- **公開鍵暗号方式**：鍵の配布が容易で、鍵管理のリスクが低いですが、計算処理が重いため、共通鍵暗号方式に比べて遅いです。
- **共通鍵暗号方式**：計算効率が高く、大量のデータを迅速に暗号化できますが、鍵の安全な配布と管理が課題です。

### 実践的な組み合わせ

実際のセキュリティ対策では、両方の方式が組み合わせて使用されることが一般的です。例えば、公開鍵暗号方式で共通鍵を安全に交換し、その共通鍵を使用してデータを暗号化する方法があります。このようにすることで、公開鍵暗号方式の安全性と共通鍵暗号方式の効率性を両立させることが可能です。

## まとめ

公開鍵暗号方式と共通鍵暗号方式は、現代のデジタルコミュニケーションにおいて不可欠なセキュリティ技術です。公開鍵暗号方式は、鍵の管理が容易であり、データの安全な送信やデジタル署名に最適です。一方で共通鍵暗号方式は、高速な暗号化を提供し、大量のデータのセキュアな保管に適しています。これらの方式を適切に組み合わせることで、効率的かつセキュアな暗号化システムを実現することができます。データの安全性を確保しながら、効率的なデータ処理を行うためには、これらの暗号方式の特徴を理解し、適切に選択・適用することが重要です。
VPCとRoute53の特徴と繋がり

# AWSのネットワーク構築サービス

クラウドコンピューティングの世界では、ネットワークの設計と管理が重要な要素です。Amazon Web Services（AWS）では、このニーズに応えるために、Amazon Virtual Private Cloud（VPC）とAmazon Route 53という2つの強力なサービスを提供しています。これらのサービスはAWS上でセキュアで柔軟なネットワーク環境を構築するために不可欠です。ここでは、これら2つのサービスの関連性や特徴について、初心者にも分かりやすく解説します。

## Amazon VPC

### カスタマイズ可能なクラウドネットワーク

**Amazon VPC**は、AWS上でのプライベートネットワーク空間を提供します。これにより、ユーザーは自身の仮想ネットワークを完全に制御し、AWSリソースの配置やセキュリティ設定をカスタマイズできます。

#### 主な機能と特徴

- **サブネットの分割**：VPC内でサブネットを作成し、リソースのグループ化とアクセス制御を行います。
- **セキュリティの強化**：セキュリティグループやネットワークACLを用いて、インバウンドおよびアウトバウンドのトラフィックを制御します。
- **VPN接続**：オンプレミスのネットワークとAWSの間で安全なVPN接続を設定できます。

## Amazon Route 53

### 効果的なDNSとドメイン管理サービス

**Amazon Route 53**は、スケーラブルなDNS（ドメインネームシステム）サービスであり、ドメイン名の登録とルーティングを管理します。Route 53を使用すると、ユーザーはドメイン名からAWSのリソースへのトラフィックのルーティングを効率的に行うことができます。

#### 主な機能と特徴

- **DNSルーティング**：ドメイン名をIPアドレスに解決し、ユーザーのリクエストを適切なサーバーにルーティングします。
- **ヘルスチェック**：アプリケーションのヘルスチェックを行い、障害が発生した場合にトラフィックを自動的に別のルートに切り替えます。
- **ドメイン名登録**：ドメイン名の登録と管理を簡単に行うことができます。

## VPCとRoute 53の関連性

Amazon VPCとRoute 53は、AWSのネットワークインフラストラクチャの2つの重要な要素です。VPCはネットワークの内部構造とセキュリティを管理するのに対し、Route 53は外部からのトラフィックの流れとDNSの管理を担当します。これらは互いに補完し合い、セキュアで効率的なクラウドベースのネットワーク環境の構築を可能にします。

## まとめ

Amazon VPCとRoute 53は、AWSでネットワークを構築する際に不可欠なサービスです。VPCにより

プライベートなネットワーク空間を作成し、Route 53を使用してドメイン名の管理とトラフィックのルーティングを行うことで、強力かつ柔軟なネットワークアーキテクチャを構築できます。これらのサービスの適切な組み合わせにより、AWS上でのアプリケーションのセキュリティ、可用性、およびスケーラビリティが向上します。
初めてのプルリクエスト

# プルリクエストは、何の為に行う？

結論、チーム開発で、必要な過程


## プルリクエストの流れ

フォークする

↓

クローンする

↓

```
プログラミング等
```

↓

アッドする

↓

コミットする

↓

プッシュする

↓

プルリクエスト送信

##
Leetcode 1930. Unique Length-3 Palindromic Subsequences

https://leetcode.com/problems/unique-length-3-palindromic-subsequences/description/?envType=daily-question&envId=2023-11-14

# アプローチ
- hashset

1. 同様のCharを持ってくる
1. 同様のCharスタート時点から終了時点の間のCharを取得
1. 上記で取得したCharをHashSetで入れる（他のCharを取得）
1. 結果を合算する
1. 結果を出す

```java
class Solution {
    public int countPalindromicSubsequence(String s) {
        int result = 0;

        for (int i = 'a'; i < 'z'; i++) {
            int firstOccurence = s.indexOf(i);
            int lastOccurrence = s.lastIndexOf(i);

            if (firstOccurence != -1 && lastOccurrence != -1 && firstOccurence < lastOccurrence) {
                HashSet<Character> set = new HashSet<>();

                for (int z = firstOccurence + 1; z < lastOccurrence; z++) {

                    set.add(s.charAt(z));
                }
                result += set.size();
            }

        }

        return result;
    }
}

```

https://leetcode.com/problems/unique-length-3-palindromic-subsequences/solutions/4285274/java-solution-for-unique-length-3-palindromic-subsequences-problem/?envType=daily-question&envId=2023-11-14
Dockerの全て

## Dockerとは

アプリを簡単に開発・デプロイできる仕組み

OSは、何を使う？：ubuntu?redhut?
ライブラリは何使う？
バージョンは、どれ使う？

という環境構築をパッケージという名前でまとめて指定しておいて、
チームメンバーに共有することで、
みんなが同じ環境を一瞬で用意できる

## MacPCでのDockerのインストール
useRenderInfoを使ってコンポーネントのレンダリング情報を取得してみよう。

Reactでの開発経験がまだ浅い私ですが、日々の開発を重ねる中で、Reactのパフォーマンスの最適化についての興味を持つようになりました。
そんな中、さまざまなライブラリやツールを調査している際に、「useHooks」というカスタムフックスのライブラリを見つけました。
今回の記事では、このライブラリの中でも特に「コンポーネントのレンダリング情報を手軽に取得できる」カスタムフック、『useRenderInfo』について紹介したいと思います。

# useRenderInfoとは
useRenderInfoとは、「コンポーネントのレンダリングに関する情報を簡単に表示」することができるカスタムフックです。
開発の規模が大きくなってくると、状態の変更や親コンポーネントからのpropsの変更による影響が把握しにくくなってきます。
特に、コンポーネントの再レンダリングが頻繁に行われることで、予期しないパフォーマンスの低下が発生します。
React開発において、コンポーネントのレンダリング動作やタイミングなどの情報を正確に把握することは、パフォーマンスの最適化を図る上でも非常に重要です。
このフックを利用することで、「特定のコンポーネントのレンダリング数、最新のレンダリングのタイムスタンプ、および最後のレンダリングからの経過時間」などの情報を取得することができます。
これらの情報は、React開発でコンポーネントをデバッグするときに参考にすることができます。

# useRenderInfoの導入手順
1\. ターミナルから下記コマンドを実行してください

```
npm i @uidotdev/usehooks
```
    
2\. useRenderInfoを使用したいコンポーネントでインポートしてください。

```
import { useRenderInfo } from "@uidotdev/usehooks";
```

3\. コンポーネント内でuseRenderInfoを実行してください。

```
const info = useRenderInfo("App"); // 引数にはコンポーネント名を指定してください。
```
3. infoはコンポーネントのレンダリングに関する情報を含むオブジェクトです。以下のようにコンポーネントの情報を取得することができます。
    1. info.name -> コンポーネントの名前。
    2. info.renders -> コンポーネントがレンダリングした回数。
    3. info.sinceLastRender -> 前回のレンダリングからの経過時間（ミリ秒）。
    4. info.timestamp -> 現在のレンダリングのタイムスタンプ。
    4. 下記の画像では親コンポーネント『UserRenderInfoParent』と子コンポーネント『UserRenderInfoChild』のレンダリング情報を取得しています。このようにコンポーネントのレンダリング情報を簡単に取得できます。

![スクリーンショット 2023-10-12 23.59.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594831/9e74f8d1-735b-cfff-0c1b-abdb1aa79762.png)


# 終わりに
以上、『useHook』ライブラリの『useRenderInfo』を用いてコンポーネントのレンダリング情報を取得する方法をご紹介いたしました。このフックで得られた情報をもとに、不要な再レンダリングを特定し、対処方法を探っていくことができます。
簡単にコンポーネントをデバッグしたいときなどにお試しください。

> useHooks : https://usehooks.com/userenderinfo

私が試した実装リポジトリ
https://github.com/yuki-shimu-coder/react-hooks-verification/tree/useRenderInfo
Docker フルコース

# Dockerとは

 まず、Dockerを１文で説明すると、

`
一発で開発環境が作れる
`

これです。

一発って何？

というと

```

```

これができると何が便利なのか？

チーム開発するときに、それぞれのメンバーが、バラバラの開発環境を使ってやってしまうと、コードを合わせていくのが面倒になる。

Dockerを使えば、

最初に、開発環境をインストールしたら、あとはその環境の上で、コーディングをすればいいだけなのだ。

みんなで、同じ環境を使っているので*とても安心*ですよね
PencilKitで高解像度の写真に絵を描く

## はじめに

PencilKitで高解像度の画像をスクロールして絵を描けるようにする方法で悩んだので、備忘録です。

## 概要

- PKCanvasViewはStoryboardで設定
- 高解像度の画像を表示する場合はスクロールして絵を描けるようにする
    - 画面に収まる画像の場合は画面中央に配置して絵を描けるようにする
- 画像外は絵を描けないようにする

## ソースコード
```swift
class ViewController: UIViewController {

    @IBOutlet weak var canvasView: PKCanvasView!
    private let imageView: UIImageView = UIImageView()
    private let pkToolPicker = PKToolPicker()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupPencilKit()
    }
    
    override func viewDidLayoutSubviews() {
         super.viewDidLayoutSubviews()
         if let size = imageView.image?.size {
             // imageViewを画像サイズに調整
             imageView.frame.size = CGSizeMake(size.width, size.height)
             // contentSizeを画像サイズに設定
             canvasView.contentSize = imageView.frame.size
             // 初期表示のためcontentInsetを更新
             updateScrollInset()
         }
     }

    private func updateScrollInset() {
         // imageViewの大きさからcontentInsetを再計算
         canvasView.contentInset = UIEdgeInsets(
            top: max((canvasView.frame.height - imageView.frame.height)/2, 0),
            left: max((canvasView.frame.width - imageView.frame.width)/2, 0),
            bottom: 0,
            right: 0
         );
     }
    
    private func setupPencilKit() {
        pkToolPicker.setVisible(true, forFirstResponder: canvasView)
        pkToolPicker.addObserver(canvasView)
        imageView.image = UIImage(named: "Sample")
        canvasView.insertSubview(imageView, at: 0)
        canvasView.becomeFirstResponder()
    }
    
}
```

## 実行結果

### 低解像度画像で絵を描く

![sample2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2420374/a524ef2f-a82a-8285-836f-284895c66b93.gif)

### 高解像度画像で絵を描く

![sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2420374/04387195-8534-3a2e-5eb2-70f104109de8.gif)

## 注意点

```swift
canvasView.insertSubview(imageView, at: 0)
```
addSubviewではPKCanvasViewの下にUIImageViewが表示されないので、注意が必要です。

## 補足
ズーム処理は追加していないので、ズームもしたい場合は別途対応が必要です。

## 参考にさせて頂いたページ
https://qiita.com/wmoai/items/52b1901e62d28dae9f91
インストーラでレジストリに動的な値を書き込む方法

# 概要
Windows用のインストーラ作成を作成する場合はVisual Studioの拡張機能**Microsoft Visual Studio Installer Projects**(以降、Installer Projectsと呼ぶ)を使用することも多いでしょう。
ドキュメントが少ない、拡張性が乏しい、レガシー、バージョン管理しにくい、謎仕様が多い…など様々な問題を抱えているInstaller Projectsですが、なぜか戻ってきてしまう魅力があります。

先日インストーラを作成していて、**インストールウィザード内でユーザに入力してもらった内容をレジストリに書き込む**という内容を実現する必要があって、ちょっとハマったので忘れないうちにメモしておきます。

# 仕様
- インストーラのウィザードで以下のような合言葉の入力を要求します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57609/fd56e0df-b953-2b18-27ad-df55e0e5b128.png)
- 合言葉はレジストリに記録されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57609/cb196e48-3365-7ad8-a7e2-bcbc41acfe1b.png)
- バージョンアップ時や修復(すでにインストール済みのインストーラを起動して元の状態を復元するやつ)時も合言葉は初期化されないようにします。

# インストーラの設定
まず、**起動条件**を設定します。すでにレジストリに記録されている合言葉の値を取得します。初回インストール時などレジストリに値が存在しない場合も空の値が取得されるだけなので特に問題ありません。
以下のように設定することでレジストリの値が`Property`で指定した変数(`TESTVALUE`)に格納されます。`[TESTVALUE]`のように使用することでインストーラ内の様々な場所から参照できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57609/dbbed7f9-50ee-e684-bd6a-d7c72aea331d.png)

次に**ユーザーインターフェイス**の設定をします。レジストリから取得した値を画面上に表示したいので`Edit1Value`に`[TESTVALUE]`を指定しています。また、この画面の入力値で合言葉を上書きしたいので`Edit1Property`に`TESTVALUE`を指定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57609/eb91958d-6738-1886-2f1b-83796b765cbf.png)

最後に**レジストリ**の設定をします。合言葉の値を所定のキーに書き込むようにしています。値の名前は`TestValue`にして書き込む値は合言葉(`[TESTVALUE]`)です。
このとき`Condition`に`REINSTALL <> "ALL"`、`Transitive`は`True`に設定しています。修復時には(なぜか)合言葉を入力するための画面が表示されないため、このような設定しないと修復時に合言葉が初期化されてしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57609/b64dee8f-4baa-618d-0b23-b4f9bfa71acc.png)

修復時には`REINSTALL`の値が`ALL`になるようです。これによって`Condition`の評価値が`False`になり、レジストリの書き換え(初期化)が行われなくなります。単純に`NOT REINSTALL`などとするとバージョンアップ時も書き換えがスキップされてしまうことになり、バージョンアップするたびに合言葉を入力し直さなくてはならなくなります。また、`Transitive`を`True`にすることでインストールのたびに`Condition`が再評価されるようになります。

`Condition`の書き方についてはこのあたりの説明は下記の記事が詳しいです。

https://qiita.com/tohshima/items/72d1e7602a48055c55f5

# 注意
インストール対象を`すべてのユーザー`にすると上記のように設定しても修復時にレジストリが初期化されてしまいます。レジストリの書きこむ先を`Local Machine`にすればいいかというとそうではありません。どういう理屈なんでしょうね。

# ソースコード

https://github.com/okbear/InstallerTest1
FastAPI 認証

## はじめに
ポートフォリオを作成しており、ようやく開発工程に入ろうとしています！！
悩んでいたバックエンドはpythonのフレームワークであるFastAPIに選定しました。
選定理由は、
* 単純にpythonで開発をしてみたかったから。
* flaskより高速なAPIフレームワークだから。

です！
今回は、認証機能について少し学習したのでアウトプットがてら少し書こうかと思います。

## 仕組み
FastAPIでは**OAuth2**というものを使用して認証機能を実装できます。
実際には、OAuth2PasswordBearerクラスをインポートし、インスタンスを作成して使用する流れになります。

↓公式のコード
```main.py
from fastapi import Depends, FastAPI
from fastapi.security import OAuth2PasswordBearer

app = FastAPI()

#OAuth2PasswordBearerのインスタンスを作成
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")


@app.get("/items/")
async def read_items(token: str = Depends(oauth2_scheme)):
    return {"token": token}
```

read_items()の引数にあるDepends()は、依存する関数を呼ぶためにあるらしく、（ここがよく理解できませんでした。。。）
関数を呼ぶ際、ついでに呼んでおきたい関数（認証、トークン確認等）を設定できるみたいです。

今回であれば認証済みのユーザーのみが/items/にリクエストを送れるようにしたいので、
Depends内にOAuth2PasswordBearerのインスタンスを入れてますね。


## 最後に
基本的にはこのような仕組みで認証を実装できます。
フォームから実際にデータを送って認証する、みたいなところはまた実装する際に書こうと思います！
FastAPIには静的型付けなどもありかなりコーディングもしやすいイメージです！
ライブラリなども豊富で、これからの開発がとても楽しみになりました〜
では、また進捗があれば投稿いたします。
オブジェクト指向プログラミングがもたらした2つの再利用技術

オブジェクト指向プログラミングの進化は、部品の再利用とアイデアの再利用という２つの流れを生む基盤になりました。

|||
|:-:|:-:|
|部品の再利用|クラスライブラリ、フレームワーク、コンポーネント|
|アイデアの再利用|デザインパターン|

##### クラスライブラリ
「汎用的な機能を持つクラスをたくさん集めたもの」

##### フレームワーク
「特定のプログラミング言語で書かれた、特定の目的をもつ再利用部品群」

##### コンポーネント
「機能の独立性が高く、内部の詳細を知らなくても利用できる」
「OOPのクラスよりも粒度が大きい」

##### デザインパターン
「設計のパターン」
プログラミング言語やアプリケーションの適用分野によらず、さまざまな場面で繰り返し現れるクラス構造に名前をつけてパターン化したもの。
pkgbuildから実行されるスクリプトで現在のユーザを取得する

macOSでpkgインストーラを作成する際，preinstall，postinstallといったスクリプトファイルを作ることでインストール前後の処理を書くことができる．

インストールはrootユーザで行われるため，スクリプト内では `logname` など通常の方法でユーザ名を取得することができない．

現在のユーザ名を知りたい場合は以下のコマンドで取得することができる．

```sh
$(stat -f '%Su' $HOME)
```
【JavaScript】配列から条件に一致する要素を取得する方法

## `find`メソッド

`find`は、配列から条件に一致した最初の要素を返します。
一致するものがない場合には`undefind`を返します。

```js
const numbers = [1, 2, 3, 4, 5]

const found = numbers.find((number) => number > 2)

console.log(found) // 3
```

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/find

## `filter`メソッド

`filter`は配列から条件に一致した全ての要素を配列で返します。
一致する要素がない場合には空の配列を返します。

```js
const numbers = [1, 2, 3, 4, 5]

const result = numbers.filter((number) => number > 2)

console.log(result) // [3, 4, 5]
```


https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
MacBookPro環境構築メモ

# はじめに
2019年モデルのMacBookAirを買った1ヶ月後くらいにM1が発売されたショックをいまだに覚えています。[にわのわ](https://twitter.com/niwa_nowa)です。
M3になり、かなり熟れてきた頃合いと判断し、MacBookProを購入しました。
設定の備忘録を兼ねて公開します。niwanowaM3カスタムです。

# 設定
- スクショの設定
やらないとデスクトップが地獄となる。
```command + shift + 5```でスクリーンショットを起動
オプションから保存先をクリップボードに変更する。

- アイコン周りの設定
  - システム設定 -> Apple ID
  赤枠で囲ったところに任意の画像をドラッグ＆ドロップ
  ![icon設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590707/6dae700e-1c75-e0ff-ddab-6073a38cf281.png)

  - システム設定 -> ユーザとグループ
  アイコンをクリックして上と同様にドラッグ&ドロップ

- システム設定 > マウス
 - 軌道の速さをデフォルトよりも速くする
 早ければ早いほど良いとされています

 - ナチュラルなスクロール をオフに
 windows脳だと頭がバグる

 - 詳細設定 > ポインタを加速 をオフに
 これをしないとマウスがおっそい

# インストールしたもの

## VSCode

https://code.visualstudio.com/docs/?dv=osx

コマンドパレットから以下を実行することでパスが通る。
```
>shell command: Install 'code' command in PATH
```
## git

https://git-scm.com/download/mac

いつもの
ちなみに https://github.com/settings/emails から
```114514+niwanowa@users.noreply.github.com ```のような誰に見られても良いメールアドレスが確認できる。

  ```bash
  git config --global user.name "Your name"
  git config --global user.email "Your email"
  ```

## Homebrew

https://brew.sh

パス通すのを忘れずに
```bash
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/{ユーザ名}/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
```

## HHKB用ドライバ
入れないとcommandキーが使えない...
https://happyhackingkb.com/jp/download/macdownload.html

## iTerm2

https://iterm2.com/

### 設定
- iTerm2 -> Settings -> General -> windows　-> Native full screen windows のチェックを外す
- iTerm2 -> Settings -> Profiles
  - window -> Transparency : 30 
  - window -> style : Fullscreen
  - window -> screen : screen with cursor
  - Session -> Prompt before closing? : If there are jobs besides 
  - Keys -> A hotkey opens a dedicated window with this profile. : option + space


## npm
```bash
brew install n
sudo n latest
sudo chown -R 501:20 "/Users/{ユーザ名}/.npm"
```

## Qiita CLI
[こちら](https://github.com/increments/qiita-cli)参照
```bash
npm install @qiita/qiita-cli --save-dev
npx qiita login
```

## AWS CLI
[こちら](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)参照
```bash
curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /
```
## Google日本語入力

https://www.google.co.jp/ime/

インストール後、キーボード設定から余計な入力ソースを外す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590707/6160dc51-c69a-edea-652e-559689ee1f0c.png)

### Google日本語入力 -> 環境設定
- 一般
  - スペースの入力 : 半角
- その他
  - ログイン時に変換エンジンプログラムを起動するにチェック

## フォントの設定
こちらをダウンロード

https://www.jetbrains.com/ja-jp/lp/mono/

launchpadからフォントブックを開き、ダウンロードしたフォントをドラッグ&ドロップ
```JetBrains Mono NL```を基本的に使っていく。

## Docker

https://matsuand.github.io/docs.docker.jp.onthefly/desktop/mac/apple-silicon/

一応以下も実行しておく。
```bash
softwareupdate --install-rosetta
```


# その他
- スキンシール
wraplusのスキンシールがいい感じ。
https://wraplus.jp/products/macbook-pro14_2021-orange-none-cut

# おわりに
フォントとスキンシールで内と外を綺麗にしましょうね。
rex0220 計算式プラグインの使い方をGPTsに学習させてみる（その２）関数の説明

[rex0220 計算式プラグインの使い方をGPTsに学習させてみる](https://qiita.com/rex0220/items/f544263cb49005cf3a62) の続きです。

# 概要
関数の説明をどの程度書いて、学習させればいいかを検証します。
今回は、AND 関数の説明を学習させて、応答を確認します。

# 学習1
簡単な説明と使用例を書いたファイルをアップロード

```AND関数1.txt
・AND関数について
AND(条件[,...])
論理関数 (論理積)

ex:
AND(数値1,数値2)
AND(数値1>10,数値2>20)
AND(文字列1="B",文字列2="C")
AND(0,0) -> false
AND(1,0) -> false
AND(1,1) -> true
AND(1,"0") -> true
AND("","0") -> false
```

# 応答1
「ANDの使用例を教えてください」
AND関数1.txt の内容を整理して応答してくれました。
![2023-11-14_23h10_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/a22e17be-017f-b358-a5fc-6f8900b536ae.png)

# 学習2

「複数の文字列項目が入力済みか判定する例
AND(文字列1,文字列2) -> 文字列1と文字列2が入力済みの場合のみ true になる。」を追加

```AND関数1.txt
・AND関数について
AND(条件[,...])
論理関数 (論理積)

ex:
AND(数値1,数値2)
AND(数値1>10,数値2>20)
AND(文字列1="B",文字列2="C")
AND(0,0) -> false
AND(1,0) -> false
AND(1,1) -> true
AND(1,"0") -> true
AND("","0") -> false


複数の文字列項目が入力済みか判定する例
AND(文字列1,文字列2) -> 文字列1と文字列2が入力済みの場合のみ true になる。
```

# 応答2
「ANDの使用例を教えてください」
「複数の文字列項目が入力済みか判定する例」が反映されました。

![2023-11-14_23h21_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/50eaf829-4895-4f6a-e0ec-0704e2d8c9bb.png)

# 応答2-a
「複数の項目が入力されたか判定したい」
関数を指定せずに、AND 関数に関係する問合せを行うと、AND 関数の例を応答してくれる。

![2023-11-14_23h24_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/e19c29a2-ef6a-70b9-f4fe-163e572093a6.png)

# 応答2-b
「複数の項目のどれか一つ以上入力されたか判定したい」
関数を指定せずに、OR 関数に関係する問合せを行うと、OR 関数の例を応答してくれる。
まだ OR 関数に関して学習させていないのだが、類推するのか？
それとも他の一般的なプログラミング言語からの応用か？

![2023-11-14_23h27_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/ef4c6b9f-798f-11c9-8eb1-6d126d06358f.png)

# 応答2-c
「NAND関数について教えて」
計算式プラグインでは、未実装の NAND 関数について聞いてみた。
OR 関数の時とは異なり、一般的なNAND 関数の説明と、!, AND の組合せの例を応答。
ただし、計算式プラグインでは「!」は 否定の演算子では無いので、誤った説明。

![2023-11-15_09h23_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/f4b960ab-b2c9-ff46-4fd6-b58f5bed5e0e.png)

# 応答2-d
「複数項目で、未入力があるかを判定したい」
NAND 関数を使うような質問をすると、NOT(AND()) の組合せで応答してくれた。
説明もわかりやすい。
NOT 関数も未学習なので、応答内容がどうやって組み合わせられたか不思議。

![2023-11-15_09h33_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/663c8fe1-3734-44d1-877e-e2219ac243a8.png)

# 応答3
「平均値を求める関数は？」
計算式プラグインのページには、AVE 関数の記述があるが、詳細までは学習させていない内容を問合せると、一般的な平均値の求め方を応答してくれる。

![2023-11-14_23h37_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/f44f566d-f995-70d5-3061-21c4ee7c68bc.png)

# まとめ

GPTs は、簡単な説明文を学習させただけで、かなりわかりやすく解説してくれるようです。
ただ何の記述か明確にしないと、やはり答えには反映されません。
OR 関数については、教えていない内容も応答してくれてびっくりです。
一般的な関数で、計算式プラグインでは未実装の  NAND 関数については、NOT(AND()) の組合せで応答するなど、応用もしてくれる。
VMDを使った動画の作り方

## 例

[出力例.mp4](https://youtu.be/fxn1mU1ZZFQ)

## 動作環境

- Mac

## 必要なツール

- VMD 
- ffmpeg 
  -  homebrew を導入済みなら, コマンドプロンプトに以下を入力します. 
      ```bash
      brew install ffmpeg 
      ```


## 手順


### VMDでファイルを出力する
1. `hoge.lammpstrj` ファイルをVMDで出力します。


### VMD Movie Makerを使用して連番画像を生成する
1. 出力が完了したら、VMD Mainで `Extensions -> Visualization -> Movie maker` を選択します。
2. 表示された `VMD Movie Generator` で以下の設定を行います:
    - **Renderer**: Snap Shot を選択します。
    - **Movie Settings**: Trajectory を選択し、`4: Delete image files` のチェックを外します。
    - **Format**: MPEG-1 を選択します。
    - **Set working directory**: Tフォルダにデフォルトが設定されていますが、作業しやすい場所に変更します。
    - **Name of movie**: ここでは仮に `untitled` のままとして説明します。
3. `Make Movie` をクリックします。


### 画像から動画を生成する
1. 画像出力が終了したら、出力された画像ファイルのディレクトリをカレントディレクトリにしたコマンドプロンプトを準備します。
2. 以下のコマンドを入力します。(`%05d`は5桁の連番の場合です。3桁の場合は `%03d` に置き換えてください。)
    ```bash
    ffmpeg -r 30 -i untitled.%05d.ppm -vcodec libx264 -pix_fmt yuv420p -r 30 output.mp4
    ```
3. 動画出力が終了したら、大量の残っている画像ファイルを次のコマンドで削除します。
    ```bash
    rm *.ppm
    ```


### .ppmを.jpgに変換する
もし `.ppm` を `.png` に変換したい場合は、次のコマンドを実行します。
```bash
ffmpeg -i output.ppm output.png
```
Reactで4択クイズ作ってみた

# はじめに
Reactで4択クイズを作成しました。以下のURLからサイトに飛べます。
(https://gakkki4411.github.io/FirstApp/)

# 作ったきっかけ
+ 自分で1から作った作品がなかった 
+ 1から開発することでプログラミングスキルや問題解決能力を伸ばしたかった
+ クイズが好きなので開発のモチベーションを保つことができると思った

# 工夫した点
+ 時間を小数点第２位まで表示させた
初めは整数のみ表示させていたのですが、小数点第２位まで表示させた方がプレッシャーを与えると考えこちらを採用しました。4択のクイズなので記述式に比べて回答するハードルは低いと思います。その点を考慮しました。

+ ヒントを5秒ごとに表示させた
ただの4択クイズだと味気ないと思ったので、ヒントを表示させました。

# 困難だったこと
時間を止める処理と正誤判定を一緒にするところが一番時間がかかりました。
インターネットでタイマーを実装しているサンプルを参考になんとか実装することができました。

# 最後に
自分で作るのって楽しいですね。これからも頑張ります。
(再掲)以下のURLからサイトに飛べます。
(https://gakkki4411.github.io/FirstApp/)
git-secrets導入後にGitHub Desktopからコミットするときはまずは落ち着いて再起動しよう

こんにちは！
ちょっと前にあったできごとを投稿します。

# 環境
- Windows11
今回の話ではWindowsかMacか区別付けば足りるのでこれだけで…

# git-secretsとは
[git-secrets](Uhttps://github.com/awslabs/git-secrets)とは、awslabsが開発しているツールで、機密情報をGitリポジトリにPushしないようにするためのツールです。導入方法は、解説されている方が多いので割愛します。

# git: 'secrets' is not a git command. See 'git --help'.というエラー

git-secrets導入後にGitHub Desktopからコミットしようとしたら上記のエラーでコミットできませんでした。

# なんでだろう？と手順を見直し
コマンド実行時の内容を見ても問題ないように見える…

# ただ再起動すればいいだけでした
再起動したら問題なくコミット完了。起動しっぱなしであれこれコマンド打ってたから…  
再起動って大事なのわかっているのですが、頭の中で選択肢に出てこない時ありますよね。笑  
アプリ内でのエラーはともかく、こういうところでエラー起こるとちょっとヒヤッとしますが落ち着いて対処していきましょう(自戒)。

# 最後に
始めたてのときに思ったことや、エラーを解決した経験などを思い出しながら投稿しようと考えています。誰かの役に立てば嬉しいです。  
投稿順で見ると時系列がおかしくなっているかもしれませんがご了承ください。
情報収集まとめ

情報収集するために普段活用しているものをまとめました。

# Qiita
https://qiita.com/

# Zenn
https://zenn.dev/

# TECHFEED
https://techfeed.io/

# daily.dev
https://app.daily.dev/

# はてなブックマーク
https://b.hatena.ne.jp/hotentry/it

# publickey
https://www.publickey1.jp/

# Software Design
https://gihyo.jp/magazine/SD
Riderをunityで使った感想（C#、個人開発）


### 前提

VScodeが.NET立ち上げてメモリとCPUを食い潰すようになったため、VScodeの縁切寺とも言われるRiderのトライアルをやってみました。
以下は一ヶ月使ってみたけれど、こんな手触りだったよ～という備忘録です。


* 無料期間の一ヶ月間のみ使用
* UnityでC#を書くために使用（shaderは書いていません）
* 個人開発
* 設定を一切変更しない

# 触ってみた感想


## メリット
* 見栄えがいい。UIが見やすく目が疲れない。
* 動作が軽い。機能が詰まっているのに、一度も処理が重くなるようなことがなかった。


### フォントがいい
見ていて目が疲れない。
最初にRiderを開いたときのレイアウトのまま使い続けられた。

### 手厚い補完機能

インストールしたそのままの状態で
```
foreach
```
と書くと
```
foreach(type Variable in COLLECTION)
{}
```
ぐらいまで補完してくれる。
基本的な構文のスニペットは必要ないと感じた。

### grep

Ctrl+Shift+Fでフォルダ内の別ファイルも検索してくれるやつ。
VScodeだと該当行だけがサイドバーに表示される。

Riderではデフォルトで別ウィンドウを立ち上げて、周囲の行も見せてくれる。

**地味に一番楽な機能でした。**



## デメリット

次に感じていたデメリットです。
あくまで個人的な感想であり、かつ設定やRiderについて調べもせずに使い倒していた期間中に感じていたこととなります（たぶんもっと楽に扱えたはず）


### Unityとの相性が悪い？
Unityでプログラムを書いているときに一番面倒な時間は、ソースコードを変更したときに発生するコンパイルの待機時間だと思われます。
Riderでクラス変数を書いた場合、一度コンパイルを挟まないとインテリセンスに変数が出てきません。

設計をテキトーにしているプロジェクトや、設計が詰まっておらず書きながらクラス変数を追加する場合などだと、おそらく大分ストレスポイントになります。なった。


### インデントが勝手に決められる
個人開発ではプログラムを書く私が王なので、私の気分でインデントを決めたり、{}の位置をifの後とか次の行とかにするのですが、Riderは乳母が如く邪魔をしてきます。

従ったほうが整ったコードにはなるでしょう。
会社とかで従業員全員に使わせれば、コードのインデントがソースコードの部分によって異なるなどの問題が発生しなさそうなので、そういう使い方としては大変優秀だと思います。

けど、個人開発なんて好き勝手プログラミングするためにあると言っても過言ではない。

だから#regionを

こう書いてるのに
```
#endregion
-------------
#region
```

勝手にタブ空けするな！ヽ(｀Д´#)ﾉ
```
    #endregion
-------------
    #region
```
（※再三書いていますがおそらく設定で変更可能です）




# 総括

* 個人開発のエディタとして月1600円払うほどの大きなメリットはなかった。
* 会社で配られたら喜んで使う。
* プログラムを書く手間は他エディタと差異はない（Unityのコンパイル待機時間を除く）。
けど、プログラムを読む面としては今まで触ったどのエディタよりも見やすくてよかった。
* 個人開発だとソースコードの細かい書き方などは自分ルールで動かしている場合が多そう。
会社などの複数人プロジェクトで使用すれば、同じ見栄えになるメリットがある。
Googleドキュメントを利用した動画文字起こしの無料体験

# 誰に向けて
動画文字起こしをしてみたいけれど、巷には有料のサービスばかりで、サクッと試してみたいというニーズには合わないことが多いですね。

そこで今回は、GoogleドキュメントとYoutubeを利用した動画文字起こしの方法を解説したいと思います。


## Googleドキュメントを使用した動画の文字起こし方法

こんにちは、今回はGoogleドキュメントを使った動画の文字起こし方法についてご紹介します。特にYouTube動画や音声ファイルからの文字起こしに焦点を当てて解説していきます。

 

### サウンド設定
パソコンのステレオの設定を変更します。
Macの場合はSpeaker Audito Recoderを利用します。

 ![スクリーンショット 2023-11-14 22.56.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620022/c480b753-bbdd-2771-49ac-8d5276651fea.png)



### 基本的な手順

Googleドキュメントを開いて、画面右上の「ツール」から「音声入力」を選択します。すると画面左側にマイクのアイコンが表示されます。ここでマイクをクリックし、音声認識を開始します。

![スクリーンショット 2023-11-14 23.05.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620022/5854bd8d-8934-5b29-682d-b131c87f6ea2.png)


### 注意点

音声認識がうまくいかない場合は、アドレスバーの右端にあるビデオマークをクリックし、マイク設定を確認してください。
ステレオミキサーを選択することで、動画や音声ファイルの音声を正確に認識させることができます。

![スクリーンショット 2023-11-14 23.07.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620022/3375b2e2-5fbd-c1cc-40da-cef3c1e219a8.png)

 

### 実際の文字起こしプロセス

YouTube動画や音声ファイル（例えばM4A形式）を再生し、同時にマイクをオンにして文字起こしを開始します。
注意事項として、マイクをオンにした後は、他の操作を行わないようにしてください。操作を行うと、マイクが停止してしまうことがあります。
 

### 文字起こしの品質

Googleドキュメントの音声認識機能は、比較的高い精度で文字起こしを行います。ただし、完璧ではないため、点や丸、改行などは手動で加える必要があります。

 

### 著作権についての注意

YouTube動画からの文字起こしを行う際は、著作権に十分注意してください。無断での使用は著作権侵害にあたる場合があります。

 

### まとめ

以上がGoogleドキュメントを使用した動画や音声ファイルの文字起こし方法です。初めての方でも簡単に試すことができるので、ぜひ一度お試しください。最後までご覧いただき、ありがとうございました。
Postgresqlでintervalの値を動的に指定する（＋`generate_series`を使った方法）メモ

今振り返ってみるとしょうもないことなんだが、Postgresqlの`interval`の使い方でちょっと詰まったので、そのメモ。副問い合わせで`generate_series`使って連番を生成し、その連番に基づいて`current_timestamp`からの差分をぶわーっと一気に作ろうという魂胆があって、無駄に色々やってみたんだが、そもそも最初の発想に誤りがありましたという話。

# ※失敗例

最初はこんな感じのSQLを書いて実行してみた。
```sql
postgres=# select g.g, current_timestamp - interval g.g || ' days' from (select generate_series(1,10) g) g;
```

副問い合わせ ` (select generate_series(1,10) g) g` で1から10までの連番を生成して、その生成した数値を`interval`に動的に指定する形で `CURRENT_TIMESTAMP` から日付の減算を実施している(`current_timestamp - interval g.g || ' days'`)。うまくいけば「過去10日分のTIMESTAMPを生成する」SQLになる、はずだった。
が、これは以下のエラーになる。
```sql
ERROR:  syntax error at or near "."
LINE 1: select g.g, current_timestamp - interval g.g || ' days' from...
```

`current_timestamp - interval '1 days'`みたいに、intervalの指定が固定の文字列なら成功するのだが、肝心の数値の部分を動的にすると絶対に同じエラーで落ちる。
- 数値が変に入ってくる（intervalの指定値に暗黙の型変換を挟んでいる）のがだめなのかな？と思って `interval g.g::char || ' days'`とかして、つまり`generate_series`の値を`char`にcastして`'days'`と文字列結合して試してみたり
- だったら最初から副問い合わせ内で指定する文字列自体を生成しておけばいいのか？とか思って副問い合わせの中身を`select generate_series(1,10) || ' days' g`にして、`interval g.g`だけにしてみたり

と、今にして思うと **涙ぐましい悪あがき** を色々してみたんだが、どれも同じエラーで落ちる。

調べたんだが、そもそも`interval`にはこういう動的な値の指定ができないようだ（そういう仕様ということのようだ）。[こちらのissueの回答](https://github.com/porsager/postgres/issues/247#issuecomment-978256872)でそのような内容が確認できる。

# 修正案

`interval`に指定する文字をつくって`::interval`でcastすればいい。そんだけ。書き方が少し違うだけである。最初の「※失敗例」をもとに修正すると以下のようになる。

```sql
postgres=# select g.g, current_timestamp - (g.g || ' days')::interval from (select generate_series(1,10) g) g;
 g  |           ?column?            
----+-------------------------------
  1 | 2023-11-13 13:33:54.551507+00
  2 | 2023-11-12 13:33:54.551507+00
  3 | 2023-11-11 13:33:54.551507+00
  4 | 2023-11-10 13:33:54.551507+00
  5 | 2023-11-09 13:33:54.551507+00
  6 | 2023-11-08 13:33:54.551507+00
  7 | 2023-11-07 13:33:54.551507+00
  8 | 2023-11-06 13:33:54.551507+00
  9 | 2023-11-05 13:33:54.551507+00
 10 | 2023-11-04 13:33:54.551507+00
(10 rows)
```

要するに`current_timestamp - interval g.g || ' days'`が`current_timestamp - (g.g || ' days')::interval`に変わっただけである。これでやりたいことができた。これについては[こちらの記事](https://www.postgresql.org/message-id/2B704E31-B533-4159-B6F0-EC284CFE824C%40skype.net)から情報を得た。どうもありがとうございました。（？）

# （余談）generate_seriesの引数にTIMESTAMPを与えて連日を生成する

`generate_series`の引数にはTIMESTAMP型も指定できるので、以下のようなやり方で似たような結果は得られる。
```sql
postgres=# select generate_series(current_timestamp , current_timestamp - interval '10 days', ('-1 days')::interval);
        generate_series        
-------------------------------
 2023-11-14 13:57:32.688607+00
 2023-11-13 13:57:32.688607+00
 2023-11-12 13:57:32.688607+00
 2023-11-11 13:57:32.688607+00
 2023-11-10 13:57:32.688607+00
 2023-11-09 13:57:32.688607+00
 2023-11-08 13:57:32.688607+00
 2023-11-07 13:57:32.688607+00
 2023-11-06 13:57:32.688607+00
 2023-11-05 13:57:32.688607+00
 2023-11-04 13:57:32.688607+00
(11 rows)
```

この例だと`current_timestamp`自体も返却されるので、↑と比べると若干結果が異なるが、まあそこはいくらでも調整できる。intervalが多くなるのでちょっと`generate_series`の指定がゴチャゴチャするが、変に副問い合わせを使わなくてよい分こっちの方が分かりやすいかもしれない。。

以上
Next.jsのapp routerを利用してNext.jsのAPIをlocalhost上で叩く時にURL parse Errorになるのを防ぐ

#### 背景

Next.js の App Routerを利用して、Next.js(localhost)のapi を叩く際にErrorになったので、issueと対応方法を記載する

#### TL;DR

fetch method内に環境変数または、next/headersを利用してhostとprotolを渡してfetchを実施すれば良い。
相対パスでのパス指定ではなく絶対指定のパスを利用する。

[issues](https://github.com/vercel/next.js/issues/48344)

## 0. 現状のdirectoryと構成

```terminal
% tree ./app
├── api
│   └── posts
│       └── route.ts
└── posts
    └── page.tsx
```

## 1. URL parse Errorになるfetch

```app/posts/page.tsx
import Link from "next/link";

const fetchData = async (host: string) => {
  const res = await fetch(`/api/posts`);
  return res.json();
};

export default async function Home() {
  const data = await fetchData();
    return (
      <main className="flex min-h-screen flex-col items-center justify-between p-24">
        smaple
        <Link href={`/`}>top</Link>
      </main>
    )
  }

```

![スクリーンショット 2023-11-14 22.54.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144543/86f51b61-0679-66f8-d924-71438f9e1e4e.png)

どうしてダメか？

↓でしかない
https://github.com/vercel/next.js/issues/48344#issuecomment-1507068100

## どう解決するか？

Projectの環境変数にapi requestのurlを渡してあげる。
または、`next/hosts`を利用してhostとprotocolを渡してあげれば良い。

```app/pages/posts.tsx
import Link from "next/link";
import { headers } from "next/headers";

const fetchData = async (host: string) => {
  const res = await fetch(`http://${host}/api/posts`);
  return res.json();
};

export default async function Home() {
  const host = headers().get("host");
  const data = await fetchData(host!);
    return (
      <main className="flex min-h-screen flex-col items-center justify-between p-24">
        smaple
        <Link href={`/`}>top</Link>
      </main>
    )
  }

```
BCC で自分宛てに来たメールを Power Automate で処理する方法

こんにちは。
「浜松と言ったら？」と問われたら、「茶畑のシンデレラ」と真っ先に答える男です。

## 背景
某所のチャットで
「Power Automate を使って、自分に BCC で来たメールを分岐させる方法を知りたい」
と言う質問を受け、
「Outlook のメール到着時のコネクタから、BCC の値を取って来れそうだから、それでできるんじゃない？」
とドヤ顔で答えました。

しばらくして、「あれ？」と。

「中身を見れたら、 Blind Carbon Copy、すなわち、目隠し複写の意味が無いじゃん。ヽ(・ω・)/ｽﾞｺｰ」
という事に、気付きまして。
冷静に考えると、そうなんすよ。いや、わかってたんすよ。

なんやかんやで、私がモタモタしている間に、他の回答者が
「To: と CC: に自分のメアドがなければ、BCC: ってことだよね」
「複数メアドがある場合も考えて concat で連結すると良いよ」
と優しくアドバイスをして、
最終的に質問者自身が自力で正解にたどり着きました。

・・・なんか・・・すごい恥ずかしい・・・です。
この屈辱を忘れぬよう、書き残しておきます（ぐぬぬ・・・）。

## BCC で来たメールを処理する方法
こんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955093/82f265af-b416-9d3a-d4c2-e83fcbce617c.png)

① トリガー「新しいメールが届いたとき」で取得した「宛先（To）」と「Cc」を、concat で文字列として連結して変数に入れます。数式としてはこんな感じ。
> concat(triggerOutputs()?['body/toRecipients'],triggerOutputs()?['body/ccRecipients'])

② 直前に設定した変数（文字列）に、自分のメアドがあるかで分岐
③ 「いいえの場合」（To と CC に自分のメアドが無かった場合）に BCC の場合の処理を書く

こうして見ると、やることはカンタンっすね。

## さいごに
この記事を書く際、モダンなデザインの UI を試そうと思ったんだけど、まだバグがあるみたい（例：数式のテキストボックス（下図）でカーソルが動かない。入力は普通にできるんだけど、現在地がわからない）。

もうしばらくは様子見しようかな、と思った。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955093/95663e3b-a5be-947f-dd1e-46ab1517bf45.png)
【n * n の 2 次元配列の表示】N * N の九九表の出力

今度は出力されるｎまでの九九表を作れという問題。
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__2dim_array_boss
九九の問題があったのでわかりやすかった
一応、自然数が出されるけど、Nコの場合+1しないといけないが、
N番目のところをN+1としないように注意

```python
N = int(input())
for i in range(1,N+1):
    for j in range(1,N+1):
        if j == N:
            print(j * i)
        else:
            print(j * i,end= " ")

```
仮想VRAM方式まとめ





仮想VRAM方式まとめ


https://qiita.com/caa45040/items/c5f22df613f7fba63515


![o_cop785.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e1841f1b-7e2e-e58d-f69e-410ad1ba294f.jpeg)

![o_cop786.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e78cb90e-39b4-3871-9acc-30c30f3f21c6.jpeg)

![o_cop787.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/aff87806-a614-9da0-59a8-bee1eb42dfab.jpeg)









----------------------------------------------

ST7735S P


STM32

https://qiita.com/caa45040/items/6761c3b03f290cd2315a

ESP32

https://qiita.com/caa45040/items/564e37edabf02358cc3f

----------------------------------------------

ST7735S SPI


STM32

https://qiita.com/caa45040/items/dea29c153b0b4bdbc6e7

ESP32

https://qiita.com/caa45040/items/b2de652dfa14cd0768c8

----------------------------------------------

ST7789V2


STM32

https://qiita.com/caa45040/items/9cb95f35250348201a53

ESP32

https://qiita.com/caa45040/items/73b2d7cfdcc1e36bae1a

----------------------------------------------

ILI9341

https://qiita.com/caa45040/items/90bd64e6ca6d3c583485
[初心者] QiitaとZenn、どちらを選ぶべきか。（英語圏の類似サービスも）

# Introduction

本格的に趣味的な個人開発を始めるにあたり、開発記録やつまずいたポイントを記事としてアウトプットしたいと思うようになりました。動機は次のような感じです。

- 自分のつまずきポイントを記録しておけば、また同じところでつまずいても自分の記事を見返せば即座に解決できる。
- そもそもアウトプットの段階で脳の仲が整理されるので、同じポイントで躓くこと自体を防げる（はず）。
- わんちゃん収益化したい。

こうした記事を投稿できるサービスとしてQiitaとZennを知っていたのですが、どちらを始めるべきか迷ったので調べてみました。

Qiita: https://qiita.com/

Zenn: https://zenn.dev/

# Qiitaとは

公式の説明:

>Qiitaはエンジニアにとって再利用性・汎用性の高い他のユーザーにとっても役にたつ、学びのある情報が多く集まっている場であり続けたいと考えています。Qiitaは記事を読むこと、記事を書くことを通して、読む側・書く側それぞれがお互いに関わり合いを持ち、情報をみんなで育てていくことで、今後同じようなことを学んだり、悩んだりするエンジニアが使う時間を減らし、エンジニアの成長や生産性をスピードアップさせることを目指します。

(source: https://qiita.com/about)

# Zennとは

公式の説明: 
> Zennは「知見を共有するエンジニアに対価を」というコンセプトで作られた技術者共有コミュニティです。

(source: https://zenn.dev/about)

# どっちを選ぶべきか

ChatGPTに2つのサービスの相違点を聞いてみました:

> QiitaとZennはどちらも日本で人気のある技術共有プラットフォームですが、いくつかの重要な相違点があります：
>1. **ユーザーベースとコミュニティの特性**:
    - **Qiita**は、初心者から上級者まで幅広いスキルレベルの開発者が利用しています。プログラミングのヒント、コードスニペット、技術的な問題解決策など、様々な内容が共有されています。
    - **Zenn**は、より深い技術的な話題や長い記事、思索的な内容に焦点を当てています。プログラマーやエンジニアが自分の専門知識を深く掘り下げた記事を書くことが多いです。
> 2. **コンテンツの種類とフォーマット**:
    - **Qiita**は、主に短い技術記事やコードのヒント、トラブルシューティングの方法に焦点を当てています。ユーザーは質問を投稿し、コミュニティからの回答を得ることもできます。
    - **Zenn**では、長いフォーマットの記事や書籍のような形式での知識共有が可能です。ユーザーはZenn上で電子書籍を作成し、販売することもできます。
> 3. **デザインとインターフェース**:
    - **Qiita**は機能的で直感的なインターフェースを持っており、記事の検索や閲覧が容易です。
    - **Zenn**はモダンで洗練されたデザインを採用しており、読みやすいレイアウトと視覚的な魅力を備えています。
> 4. **モノタイズ化と収益化のオプション**:
    - **Qiita**は主にコミュニティに基づいた共有のプラットフォームであり、直接的な収益化のオプションは限られています。
    - **Zenn**は、ユーザーが自分の記事や書籍を通じて収益を得ることを可能にしています。これには電子書籍の販売やサポーターからの支援が含まれます。
>これらの違いにより、ユーザーは自分の目的や好みに合わせて、QiitaかZennのどちらかを選択することができます

## 私はQiitaを選んだ

私はQiitaを選びました。（この記事がQiitaに投稿されている時点でお察しかもしれないですが）

決め手は大まかに以下のような通りです。

- 初心者向けに記事が書ける
- スモールスタート (初めから収益化は狙わず、まずは開発→記事としてアウトプットの流れを身につけるところから)

収益化の点ではZennに軍配が上がりそうですが、投稿者としても読者としてもとっつきやすいQiitaから始めることにしました。
ただどちらか一方に絞る必要はもちろんないので、いずれZennにも展開していこうと思っています。

# Appendix: 英語の類似サービス

記事として投稿する以上、多くの方に読んでもらえた方が嬉しいので、英語でアウトプットすることも視野に入れていました。英語圏で使用されている同様のサービスがパッと思いつかなかったので、ChatGPTに聞いてみました。

ChatGPTの回答は以下の通りです。

> 日本以外で、特に欧米や英語圏の技術者向けに発信したい場合に利用できるサービスはいくつかあります。以下はその中の主要なプラットフォームです：
> 1. **GitHub**:
    - GitHubは、ソースコードのホスティングとコラボレーションのためのプラットフォームですが、READMEやWikiを通じてプロジェクトに関連する情報やドキュメントを共有することもできます。
> 2. **Stack Overflow**:
    - Stack Overflowは、開発者が技術的な質問を投稿し、他のユーザーからの回答を得ることができるQ&Aプラットフォームです。特にプログラミングに関する具体的な問題解決に重点を置いています。
> 3. **Medium**:
    - Mediumは、様々なトピックに関する記事を公開できるプラットフォームで、技術的な内容も多く扱われています。個人ブログのような形式で、深い洞察や技術的な知識を共有するのに適しています。
> 4. **Dev.to**:
    - Dev.toは、開発者コミュニティに焦点を当てたプラットフォームで、ユーザーは技術記事を投稿し、他のユーザーと交流することができます。初心者から上級者まで幅広いユーザーが活動しています。
> 5. **Hacker News**:
    - Hacker Newsは、技術ニュース、スタートアップ、プログラミングに関連する記事やディスカッションを共有するためのコミュニティです。特にテクノロジー業界の最新の動向に関心があるユーザーに人気です。

> これらのプラットフォームは、英語圏の技術者やプログラマーに向けて知識や経験を共有したい場合に適しています。それぞれに特有の機能とユーザーベースがあり、目的に応じて適切なプラットフォームを選択できます。


- GitHubやStack Overflowは既知のサービスでしたが、ブログ形式で投稿するという自分の目的からは外れてしまうため、避けました。
- Mediumはこれまでデータサイエンス系のプロジェクトを行う時などによく記事を読んでいたので、確かに！という印象でした。今後こちらにも展開させていくかもしれません。
- Dev.toは知らないプラットフォームでしたが、ぱっと見情報収集の場として良さげな印象でした。
- Hacker Newsについては、検索してもニュースサイト的なものはあれどアウトプットできるプラットフォームという感じではなかったので、今回は避けました。
九九表作成

前回に続いてこちらも。
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__2dim_array_step3

九九表を作れという問題。
まあ、phpでもあったfor複数ループをPythonでもやればいいだけ。
range関数が0からはじまるのでそこらへんの調整は必要だけど。

```python
for i in range(9):
    for j in range(9):
        print((j+1)*(i+1),end="")
        if (j+1) % 9 == 0:
            print()
        else:
            print(" ",end="")

```
めんどい場合は、一応こちらのrange関数でもできる（覚えよう）
むしろこっちのほうがロジックがわかりやすいか？

```python
for i in range(1, 10):
    for j in range(1, 10):
        if j == 9:
            print(i * j)
        else:
            print(i * j, end=" ")

```
3 * 3 の出力

前回につづいてこちらも。
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__2dim_array_step2

入力された半スペで区切られている 9 個の数値を 3 行 3 列の形式で出力という形。
前と同じ解法でいけるのでこちらで。

```py
tmp = input()
N = tmp.split()
for i in range(9):
    if (i + 1) % 3 != 0:
        print(N[i],end=" ")
    else:
        print(N[i],end="\n")
```

・Nにいれるところは
　`N = input().split()` とやると１行でできる

・他の方法として数値は普通にprintして、他の解法として半スペか改行をi番目ごとにprintするというのがある。下のようになる
　(print()はそのままだと改行するから）

```py
for i in range(9):
    print(N[i])
    if i % 3 == 2:
        print()
    else:
        print(" ",end="")
```
NodeCGのバンドルについての備忘録

# 概要
* NodeCG のバンドルとはなにか
* `nodecg install` で何をやっているのか
* どうやってバンドルを作るのか

について書き残しておきます。
NodeCG の基本的なお話は書きません。いっぱい記事あるからね。

# NodeCG のバンドルとはなにか
ざっくりいうと `nodecg/bundles/{bundleName}` 配下に配置されるコンテンツ。
基本的には下記のような構成でいろいろ入ってくる。

```
nodecg/bundles/{bundleName}/
    dashboards/
    graphics/
    extensions/
    package.json
```

# `nodecg install` で何をやっているのか
[NodeCG CLI](https://github.com/nodecg/nodecg-cli) のコマンドの一種である `install` でバンドルをインストールできる。

やってることは非常に単純で
1. 下記いずれかの引数によりリポジトリをクローン
   * Git リポジトリの URL
   * GitHub のユーザ名とリポジトリ名のペア（ `{user}/{repo}` の形式）
1. 依存ライブラリのインストール（いわゆる `npm install` ）

これだけ。
あとはバンドルのディレクトリで実行すると、そのバンドルの依存ライブラリをインストールするらしい。

## どうやってバンドルを作るのか
上のコードブロックで書いた構成の `nodecg/bundles/{bundleName}` 配下を GitHub のリポジトリとして公開するのが一番簡単。
ベストプラクティスとしては、タグを切ってコミットしておくのが良さそう（タグを切ってある場合は最新のタグが優先してクローンされる）。そうすると過去のバージョンもインストールできるようになる。 [`nodecg-speedcontrol`](https://github.com/speedcontrol/nodecg-speedcontrol) とかが参考になる。
gnuplotで自作dllの(C言語)関数を使って計算するために参考にしたサイト集

Windows11環境です。(Windows10もおそらく同様)

# 参考サイト

https://ss.scphys.kyoto-u.ac.jp/person/yonezawa/contents/program/gnuplot/import.html

※上記にも記載されている通り、gnuplotと、dllを作成するMinGWのbit数を合わせる必要あり。

64bit版MinGWを探すのに手間取った。下記のおかげで辿り着けました。

https://qiita.com/StudyKogaku/items/6e3e217e17eb9f208b31

インクルード必要なヘッダファイルgnuplot_plugin.hはここ：

https://github.com/gnuplot/gnuplot/blob/master/demo/plugin/gnuplot_plugin.h

# 自動で読み込ませたい

`show loadpath`で表示されるパスの
ファイル gnuplotrc にスタートアップ処理を記載する。
`cd` コマンドで、作成した .dll のあるパスに移動してから`import`コマンドを呼ぶ必要あり。

dllを読み込ませるのは、セキュリティ上のリスクになりえるかもしれないので注意。
(D->C)2 * 2 の出力

今日の問題はこれ
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__2dim_array_step1
・８，７，１，３を２＊２の形で出力せよという問題

私は
偶数番目のときに改行、奇数番目のときに半スペと考えて下記の様に実装

```py
N =[0,8,1,3]
for i in range(len(N)):
    if (i + 1) % 2 == 1:
        print(N[i],end=" ")
    else:
        print(N[i],end="\n")

```

ところが他にもあり
もっと簡単にできた

```py
print("0 8¥n1 3")
```
うん、たしかにそうなんだよなぁ。。。
まあ数字４つだけだからな
まあ、それにしてもprint内でも改行コード使えるんやな