OmniAICreator/Qiita-1.07M huggingface dataset:
Railsチュートリアル デプロイが上手くいかない


デプロイ時に発生したエラーがとりあえず解決（これで良いのかは別として）したので、備忘録として記載。
# 1. 状況

Railsチュートリアルの10章あたりまでは、とりあえずデプロイできていたはずなのだが、11章終了後のデプロイでエラーが発生した。

```text: log
Port scan timeout reached, no open ports detected. Bind your service to at least one port. If you don't need to receive traffic on any port, create a background worker instead.
Docs on specifying a port: https://render.com/docs/web-services#port-binding
```

# 2. 実施したこと

# 2.1. PORT番号の修正

エラーログに記載のURLを確認したところ、Renderのデフォルトのポートは10000であるとの記載があったので、PORT番号を10000に修正した。

```diff_ruby: config/puma.rb
- port ENV.fetch("PORT", 3000)
+ bind "tcp://0.0.0.0:#{ENV.fetch('PORT') { 10000 }}"
```

```diff_docker: Dockerfile
- EXPOSE 80
+ EXPOSE 10000
```

```diff_yaml: .devcontainer/docker-compose.yml
services:
  app:
    ~略~
    environment:
      BINDING: 0.0.0.0
+      PORT: 10000             # Renderで期待されるポート
+      RAILS_ENV: production   # 本番環境の指定
```

また、dockerの環境変数として``PORT``に``10000``を設定した。

# 2.2. command: sleep infinityの削除

docker-compose.ymlで設定されている``command: sleep infinity``は、コンテナをただ待機させるだけらしい。``puma.rb``を読み込むように変更

```diff_yaml: .devcontainer/docker-compose.yml
services:
  app:
    ~略~
-    command: sleep infinity
+    command: bundle exec puma -C config/puma.rb
```

# 2.3. Railsサーバーの起動方法を修正

rails serverは、開発環境でのデフォルトのサーバーであるため、pumaによるサーバーの軌道に変更する。

```diff_docker: Dockerfile
- CMD ["./bin/thrust", "./bin/rails", "server"]
+ CMD ["bundle", "exec", "puma", "-C", "config/puma.rb"]
```

# 解決

ここまでの修正でデプロイはできたが、上手く動いてはいない。色々修正は必要そう。
pfSenseのOpenVPNでSDNっぽいことやってみた

## 0.はじめに
ProxmoxのSDNを構築しているにあたって、pfSenseのVPNでもSDN作ってみようということで、とりあえず試してみました。
とりあえず接続はできたっぽい(?)ので、備忘録をかねて書いてみました。

:::note warn
全体的に動作が不安定な気がします、あくまでも参考までに。
:::



## 1.やってみたこと(概要)

以下の図のようにProxmoxの各ノードにpfSenseを配置して各ノードのvmbrを同じネットワークとして扱ってVM間の通信をしたい。

![qiita_sdn.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631217/cb489268-789b-a96f-1ba6-d0641e9a4083.png)



## 2.具体的な設定方法
基本的な方針。
- サーバを1台設定して、クライアントとして他のノードを追加する
- OpenVPNのtapモードを使用する

###  サーバ側の設定
1. 証明書を作成
    - System/Certificate/AuthoritiesのAddより、好きな名前を設定して、Methodを"Create an internal Certificate Authority"で作成(他はお好みで)
    - System/Certificate/CertificateのAddより、Methodを"Create an internal Certificate"で、好きな名前を設定、Certificate authorityが先ほど作った証明書になっているかを確認して作成(他は適宜お好みで)
    - System/Certificates/Revocationはお好みで
1. VPN設定
    - VPN/OpenVPN/ServersのAddより、以下のように設定
    - ![Screenshot 2025-01-13 3.31.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631217/59022d3a-0674-aae7-076f-d108731e4a60.png)
    - Cryptographic Settingsは先ほど作成したもの選択してお好みで
    (自分はCertificate Depthの設定をミスっていたのでご参考までに
    - Tunnel SettingsはBridge DHCPにチェック☑️して、Bridge InterfaceやDHCPなどを環境に合わせて設定(LANとか)
    - Client SettingsはDynamic IPにチェック☑️

1. インターフェースの設定
    - Interfaces/Interface Assignmentsで今作ったVPNのインターフェースを追加して、**きちんとEnable interfaceにチェック☑️**　& 保存
    - Interfaces/BridgesのAddより、今有効にしたインターフェースとLANとかをMember Interfacesで選択して設定(shiftキーを押しながら複数選択ができます。)
    - Interfaces/Interface Assignmentsで保存
 
1. ファイアウォールの設定
    - WANでIPv4+IPv6のTCP/UDPのOpenVPN (1194)の通信をPassする

### クライアント側の設定
まず、ネットを見ていると、OpenVPN Client Export Utilityっていうのがあるらしいが、自分は発見できなかった。ということで、地道に設定していく。
1. 証明書の設定
    - System/Certificate/AuthoritiesのAddより、好きな名前を設定して、Methodを"Import an existing Certificate Authority"にして、サーバで設定した証明書をExportCAでダウンロードしてコピペする
    - System/Certificate/CertificateのAddより、Methodを"Import an existing Certificate"で、それぞれサーバで設定した証明書をダウンロードしてコピペする

1. VPN設定
    - サーバで設定したのと同じ内容を入れて、証明書は今入れたものを使う
1. インターフェースの設定（サーバとほぼ同じ）
1. ファイアウォールの設定（サーバと同じ）





## 3.検証
pfSenseクライアント側からは接続できたらしい。
![Screenshot_2025-01-13_3.04.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631217/82734820-3e3f-e537-be96-187b72ffa42c.png)

VM間については、Pingは一応通ったが、全体的に動作が不安定です。
今後、何か進展があれば追記します。

インターネットの様々なサイト様によってばらつきがあった李、古かったりしたので、少しでも参考になったら嬉しいです。

## 4.参考文献
- [Netgateドキュメント OpenVPN](https://docs.netgate.com/pfsense/en/latest/vpn/openvpn/index.html)
- [pfSenseでOpenVPN](https://www.seirios.org/seirios/dokuwiki/doku.php?id=networkapp:pfsense:openvpn)
【Unity初心者】Unityでネットゲームを作りたい【目次】

昔Perlで作ったCGIゲームを元に、androidでゲームアプリ作れないかな？と色々調べてたら、Unityってのがいいらしいということで早速ダウンロードしていじってみましたが、わからないことが多すぎる。。。
まず、「C＃」がわからんし、オブジェクト指向も理解できてない。
そんな私が、メモ代わりに記載していこうと思います。
<br>
・【Unity初心者】Unityでネットゲームを作りたい【1】色々悩む～ExcelでJsonの配列を作る

https://qiita.com/ysyss5500/items/f0950bc3f153f9947e7b

・【Unity初心者】Unityでネットゲームを作りたい【2】Json取入

https://qiita.com/ysyss5500/items/7078965fc5ea6e203d55

・【Unity初心者】Unityでネットゲームを作りたい【3】PlayFabログインと同時にやりたい

https://qiita.com/ysyss5500/items/1338d95f2774e247478a

・【Unity初心者】Unityでネットゲームを作りたい【4】やっぱりログイン時に、新規か判断してプレーヤーデータを読み書きしたい

https://qiita.com/ysyss5500/items/c48335128d115b871276

・【Unity初心者】Unityでネットゲームを作りたい【5】PlayFabからプレイヤーデータ(Json)・タイトルデータ(Json)をログイン（新規も）時に取得して配列に設置後、どこでも使えるようにしたい

https://qiita.com/ysyss5500/items/9d76c18c054f8a6881f3

・【Unity初心者】Unityでネットゲームを作りたい【6】ゲームの流れを考え直さないとダメだ

https://qiita.com/ysyss5500/items/285cbb1478b1141e4408

・【Unity初心者】Unityでネットゲームを作りたい【7】PlayFabから読み取ったデータをゲーム内にJsonで保存する～画面に名前を表示してみる

https://qiita.com/ysyss5500/items/ad9a61aeb3fd758b4797

・【Unity初心者】Unityでネットゲームを作りたい【8】エディタビューの表示を直す～画像ボタンを設置してシーンを切り替えてみた

https://qiita.com/ysyss5500/items/785892928c854f3aa19a

・【Unity初心者】Unityでネットゲームを作りたい【9】スクリプトの順番～苦手なレイアウトとか

https://qiita.com/ysyss5500/items/d0fbf690703be3f3884e

・【Unity初心者】Unityでネットゲームを作りたい【10】UIのスライダーを使ったスタミナ表示～とりあえずメイン画面に物を置いてみた

https://qiita.com/ysyss5500/items/d07e96027ad50fec198f

・【Unity初心者】Unityでネットゲームを作りたい【11】ゲームビュー、シミュレータ機種によって表示がずれる～画面の大きさ～カメラの関係（表示したい画像が出ない）

https://qiita.com/ysyss5500/items/c09371a206c91413d19a

・【Unity初心者】Unityでネットゲームを作りたい【12】所持しているアニメ画像を指定の場所に表示したい

https://qiita.com/ysyss5500/items/2e43376f58c48084b1db

・【Unity初心者】Unityでネットゲームを作りたい【13】ひたすらアニメーション画像貼り付け～ビルドしてスマホに表示してみる

https://qiita.com/ysyss5500/items/53e8415fa07b638d1341

・【Unity初心者】Unityでネットゲームを作りたい【14】メニューバー作成～表示順序

https://qiita.com/ysyss5500/items/710aead57fa0ca186248

・【Unity初心者】Unityでネットゲームを作りたい【15】複数のPanelの表示を制御したい～数字ランダム

https://qiita.com/ysyss5500/items/6883a0c358cf3e645809

・【Unity初心者】Unityでネットゲームを作りたい【16】謎のエラーで悩む～パネルでボタンを押したら、このパネルを消して別パネル表示

https://qiita.com/ysyss5500/items/6b939c5f2badfef63812

・【Unity初心者】Unityでネットゲームを作りたい【17】パネル間でデータの引継ぎをしたい～どのボタンが押されてるか判断して次のパネルへ～Jsonファイルの読み込みが早すぎる？

https://qiita.com/ysyss5500/items/9be5fba0737d5f4ccd64

・【Unity初心者】Unityでネットゲームを作りたい【18】Unityで正常、ビルドしてandroidで異常

https://qiita.com/ysyss5500/items/8452034ea1adc65eb14f

・【Unity初心者】Unityでネットゲームを作りたい【19】少しだけPlayFabへの書き込みに時間がかかる気がする～PlayFabの仮想通貨に手を出す

https://qiita.com/ysyss5500/items/8259b7ee93a05ea21ecb

#Unity_ver6  #PlayFab_マイクロソフトアカウント
#Json #新規ログイン　#Unity画面表示関係
Vimライクなキーバインドで最速・快適にタスク管理 - Shiba ToDo - 🚀

こんにちは、個人開発者のnkitaoです。  
今回は、私が個人開発したWebサービス「ShibaToDo」について少しご紹介させてください。  
ShibaToDoは、Vimライクなキーボードショートカットを駆使して、最速でタスク管理ができるよう設計されたWebサービスのTodoアプリです。  
この記事では、ShibaToDoの特徴や開発の背景、技術要素についてご紹介させていただきます✨  

## 作ったもの
さっそくですが作ったものはこちら👇　 

https://todo.shiba-tools.dev/lp

## 使い方

ShibaToDoは、Vimライクなキーバインドを目指して、タスク操作に必要な様々なショートカットを用意しています。

- **現在位置から上へ移動**: `k`キー  
- **現在位置から下へ移動**: `j`キー  
- **プロジェクトを右移動**: `l`キー  
- **プロジェクトを左移動**: `h`キー  
- **タスクを下に追加**: `a`キー、  
- **タスクを一番下に追加**: `Shift + a`キー  
- **タスクを上追加**: `a`キー  
- **タスクを一番上に追加**: `Shift + a`キー  
- **タスク完了**: `Space`  
- **インデント追加**: `Tab`  
- **Undo**: `u`キー  
- **Redo**: `r`キー  

etc...  
![https://todo.shiba-tools.dev/lp](https://shiba-todo.s3.ap-northeast-1.amazonaws.com/usage.png)

### 主な特徴

- タスクの作成から完了までマウス操作は不要 🖱️ 
- **ログイン不要**で利用可能 🔓  
  - ログインすることでWeb上にデータを保存・履歴表示などが可能  
- **１行テキスト**、**詳細テキスト**などの登録が可能 📝  
- **タスクを種類ごと（プロジェクト）に整理可能** 📂  

## 作成のきっかけ 

タスク管理を長らくメモ帳で行ってきました。1行ずつ書き込むことで視覚的かつ直感的で分かりやすいというメリットがありましたが、次第に以下のような限界を感じるようになりました

- タスクの分類や優先度の管理が難しい
- 完了済みタスクの整理に手間がかかる
- 詳細情報を追記するスペースがない（または１行がかなり長くなる）

これらの課題を解消するために、Google TodoやMicrosoft Todo、Trelloといった一般的なタスク管理ツールを試しました。  
どれも多機能で優れたデザインを持っており一時的には運用可能でしたが、次第に操作性に不満を感じるようになりました。特に、 **「マウス操作の多さ」** が効率を妨げる原因でした。  

私が求めていたのは、次のようなシンプルかつ高速なタスク管理です

- 思いついたタスクを即座に記録する。
- 必要最低限の情報で管理し、必要に応じて詳細を追加できる。
- 完了したタスクは速やかに処理する。

特に短期間で大量のタスクを処理する必要がある場合、タスク管理に時間をかけすぎること自体が非効率と感じていました。

これらの課題を解決するため、「自分専用のタスク管理ツール」を開発することを決意しました。  
開発にあたり、以下の4つのニーズを最優先に設計を進めました

- キーボード操作に最適化
  - ホームポジションから手を動かさずにすべての操作を完了できること。
- 1行タスク管理のシンプルさ
  - 必要最低限の情報で素早くタスクを追加し、詳細を後から追記できる柔軟性。
- Undo機能の実装
  - 操作ミスに即座に対応できる安心感を提供。
- タスクの順序維持
  - メモ帳のようにタスクの位置をそのまま保つことで、視覚的な整理が容易に。

特にキーボード操作については、Vimライクなキーバインドを採用することで、効率性をさらに高めました。  
これにより、タスクの追加、編集、完了が直感的に行えます。

このような背景のもと完成したのが、ShibaTodoです。



## 技術要素 💻

ShibaToDoの開発には以下の技術を使用しています。
### フロントエンド
- **Next.js**  
- **Tailwind CSS** 
- **shadcn/ui** 
- **react-hotkeys-hook** 
- **react-hook-form**
- **lucide-react**
- **React Activity Calendar**

### バックエンド
- **Next.js** 
- **Prisma**

### 認証

- **Auth0** 

### インフラ&ホスティング
- **Vercel**
- **Supabase** 
- **AWS Amplify**
- **AWS Route 53**

## まとめ 🏁

ShibaToDoは、最速でタスク管理ができるように設計されたWebサービスです。  
ぜひ一度触って、感想をお聞かせいただけるととても嬉しいです！

![](https://shiba-todo.s3.ap-northeast-1.amazonaws.com/service_image.png)
生成AIでコーディングをしてきた感想

# 生成AIでのコーディングについての感想

GPT-4oやCopilot以外にもClineやCursorが出てきたので、それらを利用するとともに、生成AIにおけるコーディングの使用感を言語化した。

## 1. 私の生成AIの利用経験

個人的な生成AIを用いたコーディングの感想となります。
GPT-4oを使ったコーディングが一番好きです。

### 1.1. GPT （有料会員）

- 利用期間
  - 2年程度利用
- 使用感
  - 自宅でのコーディングはGPTに書いてもらう。修正はたまに必要だが、修正箇所を指摘すれば、適切なコードを返してくれることが多い。
  - 最近はZIPファイルを読み込んでくれるので、ソースコードの解釈に柔軟に対応してくれるので良い。
    - ただ、まだうまく機能していない印象。
  - 学びに利用可能か。
    - 初めて学ぶ内容でも適切な解説が期待できる。わからないことはまず問い合わせる。

### 1.2. GitHub Copilot

- 利用歴
  - 1年程度
- 使用感
  - 利用しやすくなってきたが、GPT-4oのほうが適切なコードを書いてくれる印象。
  - CopilotのChat機能も4oを利用しているが、直接GPT-4oに依頼した方が良い。
  - 今回ClineかCursorを利用するぞ。という強い意志で解約
- 学びに利用可能か。
  - あくまで補助ツールの印象。推奨された内容に対して適切であれば採用するという感覚で記述するのが良いと思う。

### 1.3. MS Copilot（エンタープライズ版？）

- 利用歴
  - 1年弱
- 使用感
  - GPT-4系に比べて、推論能力が随分と低い。おそらく4系を利用しているはずだが、推論能力は全く異なる。
  - よくわからない方向に話が進む印象。（おそらくブラウザの検索結果の結果に引っ張られている）
  - ざっくり書いてもらって自分で必ず修正が必要。
  - 正しいコーディングがある程度わかっていたり、軌道修正するスキルが必要。
- 学びに利用可能か。
  - きっかけに利用する分には良い。怪しいことなどや回答の理由については自分でググるほうが良い。

## 2. これまで生成AIを利用したコーディングに対する感想

個人的にはClineとGPT-4oの組み合わせがいまいちだったため、現時点でのベストはGPT-4oです。

- GPT-4(4o)
  - 推論応力が高く、抽象的な依頼に対しても期待する回答が返ってくる。
  - サンプルとなるコードを渡すと、類似したコーディングを行ってくれる。
  - 上記と類似するが、言語仕様についてもpythonのバージョンを指定すれば適切な回答を返してくれる。
- Copilot
  - 徐々に利用しやすくなったが、想定外の内容をサジェストされる。
  - 事前に何がしたいのかを明確にしておくと利用しやすい。
  - 4oをブラウザで利用したほうが良い回答が返ってくることが多い。

おすすめの生成AIのコーディング方法について情報を持っている方がおられましたら、ぜひコメントやXにてコメントいただけると嬉しいです。
棒読みちゃんを歌わせる！

# 0. はじめに

https://chi.usamimi.info/Program/Application/BouyomiChan/

**棒読みちゃん**には、「音程」、「速度」などのタグがあり、配信者向け機能をオンにすることによっていろいろ遊べます。今回は棒読みちゃんにカエルの歌を歌わせてみたいと思います。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3805753/ac88f1db-b693-5351-2f0a-c7fb066a26ee.png" width=50%>

# 1. 「音程」と音の高さの関係

皆さんご存じのとおり、通常の音楽には、1オクターブ(低い音から高い同じ音まで)に12個の音があります。ちなみにこれを**12平均律**といったりします。
そして、1オクターブ上の音は周波数が2倍になります。例えば、低い音の周波数が100Hzだとしたら、高い音は200Hzになります。この間を12音に(対数的に)等分すると、1音上がるごとに周波数は**12乗根2**(=2<sup>1/12</sup>)**倍**になり、これによって音の高さが決まるというわけですね。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3805753/0e1fac3e-fa5c-7f80-681c-fd18b1501769.png" width=80%>

この関係は「**音程**」タグでも同じです。通常の音程(声の高さ)は100で、200なら1オクターブ上の音、50なら1オクターブ下の音です。これを細かく設定することによりドレミを奏でることができるというわけです。
※通常の音程の最小・最大値は50・200です。また、整数値しか受け付けません。

# 2. 計算

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3805753/65327afa-dd1c-7b0c-95e7-61c3bd2c2722.png" width="80%">

基準音を0として、他の音の高さ(マイナスもOK)と歌詞を指定します。
また、基準音の音程`baseKey`を決めます。

```javascript: code
const notes = [
  [0, "ド"],
  [2, "レ"],
  [4, "ミ"],
  [5, "ファ"],
  [7, "ソ"],
  [9, "ラ"],
  [11, "シ"],
  [12, "ド"]
];

const baseKey = 80;
let text = "";

notes.forEach(note => {
  const key = Math.round(baseKey * 2 ** (note[0] / 12));
  text += `音程(${key})${note[1] || "て"}`;
});

console.log(text);
console.log(text.length);
```

```: output
音程(80)ド
音程(90)レ
音程(101)ミ
音程(107)ファ
音程(120)ソ
音程(135)ラ
音程(151)シ
音程(160)ド
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3805753/47edb0f7-4aa2-ad6d-568c-c96d6214898e.png" width="60%">

**ドレミファソラシド**と歌ってくれました。
では、カエルの歌を歌わせてみましょう。

```javascript: input
const notes = [
  [0, "ド"], [2, "レ"], [4, "ミ"], [5, "ファ"], [4, "ミ"], [2, "レ"], [0, "ド"],
  [4, "ミ"], [5, "ファ"], [7, "ソ"], [9, "ラ"], [7, "ソ"], [5, "ファ"], [4, "ミ"],
  [0, "ド"], [0, "ド"], [0, "ド"], [0, "ド"],
  [0, "ド"], [2, "レ"], [4, "ミ"], [5, "ファ"], [4, "ミ"], [2, "レ"], [0, "ド"],
];

const baseKey = 100;
```

```: output
音程(100)ド音程(112)レ音程(126)ミ音程(133)ファ音程(126)ミ音程(112)レ音程(100)ド音程(126)ミ音程(133)ファ音程(150)ソ音程(168)ラ音程(150)ソ音程(133)ファ音程(126)ミ音程(100)ド音程(100)ド音程(100)ド音程(100)ド音程(100)ド音程(112)レ音程(126)ミ音程(133)ファ音程(126)ミ音程(112)レ音程(100)ド
```

さて歌ってもらいましょう！の前に、長くなりすぎると途中でやめちゃうので設定を変えておきましょう。じゃあ気を取り直して...
...
どうでしょうか？音程はあってますがタイミング調整を一切行っていないので連続して読み上げちゃってます。さらに、実は音程タグを使用すると声の高さだけではなく読み上げ速度も若干変わるので、そこら辺は手動で調整してください。

| やりたいこと | 書き方 |
| --- | --- |
| 読み上げ速度変更 | 速度(50 ~ 200) |
| 間をあける | ド音程(112) レ音程(126) ミ (歌詞の前に空白)|
| 音を伸ばす | 音程(152)ら/あ/あ/あ/あ/あ |

```: 完成
ド音程(112)レ音程(126)ミ音程(133)ファ音程(126)ミ音程(112)レ音程(100)ド音程(126) ミ音程(133)ファ音程(150)ソ音程(168)ラ音程(150)ソ音程(133)ファ音程(126)ミ音程(100) ド音程(100) ド音程(100) ド音程(100) ド音程(100) ド音程(112)レ音程(126)ミ音程(133)ファ音程(126)ミ音程(112)レ音程(100)ド/お/お/お/お/お/お
```

ぜひコピペして歌わせてみてください！
要望があれば簡単なツール作るかもしれません。

# 3. おまけ

```: ふるえる
声(7)音量(200)音程(112)あ音程(126)い音程(133)た音程(84)くて音程(84)速度(115)あ音程(168)い音程(150) た音程(133)くて音程(150)ふ  る音程(200) え/え/え/え音程(168)る/う/う/う/う
```

```: いつものフレーズ
音程(112)て音程(150)て音程(168)て音程(200)て音程(168)て音程(150)て音程(112)て音程(150)て音程(168)て音程(200)て音程(168)て音程(150)て音程(126)速度(140)て音程(133)て音程(126)て音程(100)て
```
Stripe導入手順

## はじめに
Stripe Checkoutを利用することで、オンライン決済を簡単かつ安全に実装できます。
本手順書では、基本的な実装フローを順序立てて説明します。画像は[こちら](https://github.com/UmeSoft-Japan/Stripe)

## 導入効果
Stripeを導入することで、以下の効果が得られます：
##### 簡単な操作で支払い画面に遷移
　ユーザーが注文画面で「支払い」ボタンを押すと、Stripeが提供する支払い画面に移動します。
##### 多様な支払い方法に対応
　支払い画面には、クレジットカード、デビットカード、銀行振込、ApplePay、GooglePay、コンビニ決済などのオプションが表示されます。
##### 支払い後のスムーズなリダイレクト
　支払い完了後、自動的に注文画面に戻り、注文処理が続行されます。
##### 自動返金
　注文キャンセルされた場合、自動的に返金が行われます。

## 開発情報
・サーバーサイド: Java
・フロントエンド: HTML/JavaScript

## 前提条件
Stripeを利用するために必要な準備：
##### Stripeアカウントの登録
・Stripeアカウントを作成（無料、初期費用・月額費不要）。
・アカウント作成後、Stripe Dashboardで「開発者メニュー」から「APIキー」を取得。
　※「公開可能キー（フロントエンド用）」と「シークレットキー（サーバー用）」の2種類が提供されます。
##### StripeのSDKをインストール
　Stripeが提供するサーバー用SDKを以下の公式サイトからインストールします：https://docs.stripe.com/sdks
##### 開発環境の準備
　EclipseやIntelliJ IDEAなどの開発環境を用意します。

## 導入手順
##### Stripe で商品を追加する
　Stripe Dashboardで商品を登録します。
　登録後、各商品に対応する「priceID」が生成されるので、これを保存しておきます。
##### Stripe でWebhookを設定する
　StripeのWebhookは、Stripeがシステム内で特定のイベント（支払い完了、返金処理、サブスクリプション更新など）を検知した際に、
　事前に指定されたURL（Webhookエンドポイント）にリアルタイムで通知を送信する仕組みです。
　この通知により、ユーザー側のシステムはStripeのイベントに基づいた処理（例: 注文ステータスの更新やメール送信）を自動で実行できます。
##### フロントエンドの実装
###### 支払いボタンの実装
　支払いボタン押下時に以下の情報をバックエンドに送信します：
　・APIキー: ショップを識別するために使用。
　・商品ID: 支払い対象の商品を特定（複数可）。
　・数量: Stripeが支払い総額を計算するために使用。
　・注文番号: 支払い成功後に注文状態を更新するために利用。
##### バックエンドからのリンク受け取り
　・バックエンドで生成した支払いリンクを受け取り、新規タブで表示します。
##### キャンセルボタンの実装
　・キャンセルボタン押下時に注文番号をバックエンドに送信します。
#### バックエンドの実装
##### 支払い画面の生成
　・フロントエンドから受け取った情報をもとに、Stripeライブラリを使用して支払い画面のリンクを生成します。
　・支払い成功時・失敗時のリダイレクト先を設定します。
##### Webhookを利用した注文状態の更新
　・StripeのWebhookを利用して、サーバーが支払い状況（成功、失敗、期限切れなど）を受信します。
　・Webhookのデータをもとに注文番号を特定し、該当注文の状態を更新します。
##### 返金処理
　Stripeの返金プロセスを構築することで、Stripeが自動返金を行われます。

## テスト
#### 支払い画面生成の確認
　支払いボタンを押して、正しく支払い画面に遷移するか確認します。
　また、Stripeが提供するテスト用カード番号（例: 4242 4242 4242 4242）を使用して、支払いフローの動作をテストします。
#### Webhookのテスト
　ローカル環境ではWebhookサービスを直接利用できないため、以下の手順で代替テストを行います。

#### 返金処理の確認
　キャンセルボタンを押して、正しく返金が行われることを確認します。
Jestのテストでwindow.confirmが実装されていないエラーの解決方法について

# はじめに
Jestのテストを実装していて下記のようなエラーが表示され、こちらの解決方法について共有させていただきます。

# 問題
window.confirmが実装されていないというエラーが発生しているようです。
```console
 Error: Not implemented: window.confirm

 const isConfirmed = window.confirm(
         |                  ^
      85 |       `${recordTitle}-${recordTime}時間を削除してよろしいですか？`
 ```

 # 解決方法
下記を削除ボタン取得後に追加することで解決することができました。
 ```.tsx
  jest.spyOn(window, "confirm").mockImplementation(() => true); // 常に "OK" を選択するモック
  // windowオブジェクト、confirmメソッドを引数に指定
```

# 参考
https://jestjs.io/ja/docs/jest-object

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

https://projisou.jp
ソフトウェアアーキテクチャの基礎本を読んだ感想


# 目的 : 勉強のアウトプット

### アーキテクチャとは？
外部的な要求や要件に応じて、最適な IT システムを構成するための設 計思想と構成されたシステムの構造のこと

よーするに基本的な設計や構造のこと

アーキテクチャを理解することに必要なこと
システムの構造
アーキテクチャの特性
アーキテクチャ決定
設計指標
上の４つを理解する必要がある

ここではシステムの構造を説明します。

システムの構造とは
アーキテクチャスタイルの種類のこと！！
代表的なアーキテクチャスタイルは

・マイクロサービス
・レイヤード
・マイクロカーネル
マイクロサービスとは簡単に
ソフトウェア開発アーキテクチャの手法の一つでアプリケーションを
それぞれ小さくサービス独立させて、独自の役割と責任を持ってAPIを通じて
サービスをやり取りする開発手法

メリット
・小さく独立させることによって障害が起こったときに、問題があるところだけ切り外せばよく、保守、開発がしやすい
・それぞれ独立させてAPIでサービスをやり取りするため、技術による制約が受けにくい。だから色んな言語で開発ができる

デメリット
設計が難しくまた、費用がかかってしまう。

マイクロサービスで開発したアプリ

例
・LINE 、Amazon,メルカリ

レイヤードとは簡単に
よく使われる一般的な設計パターンでシステムを複数のレイヤー（層）に分割して
各レイヤーが特定の機能と責任範囲を持ち、それぞれ独立して変更と拡張が可能で
上位レイヤーは下位レイヤーに依存しているが、逆に下位レイヤーは上位レイヤーに
依存関係はまったくないのが特徴のアーキテクチャ

それぞれのレイヤー層の種類
プレゼン層
UIなどの表示の部分 HTML,CSS ビュー　、ルーティング

アプリケーション層
ビジネスロジックの処理でCRUDやELTなど サービス、リポジトリの呼び出し

ドメイン層
ビジネスルールや仕様の関心ごとを取り扱う層 モデル

データアクセス層
永久化テクノロジーの処理でDB操作をする層　　　マイグレーションファイル

メリット
・保守性と拡張性が向上する
・コンポーネントや機能の再利用がしやすい
・テストやチーム開発がしやすい

デメリット
・レイヤー間の情報の受け渡しにやデータ変換が必要な為、オーバーヘッドが生じる場合がある
・適切なレイヤー分割が難しい
・過度な抽象化が増える

ちなみにオーバーヘッドとは
処理や操作を実行するために必要なコストやリソースが必要な範囲を超えて
発生する、追加的な負荷や処理のこと

マイクロカーネルとは 簡単に
マイクロカーネルとはカーネル（コンピューターシステムの中核となるソフトウェア）
が最低限の機能しか持たず、他の機能は個別のソフトウェアとして存在する。
例えばファイル管理やデバイス制御などはカーネルの外部で独立したソフトウェアとして実装される。

メリット
・柔軟性と拡張性: カーネルの最小限の機能により、新しい機能やサービスを容易に追加できる

・セキュリティと信頼性: ユーザーレベルのサーバーによる分散処理により、システムのセキュリティと信頼性が向上する

・モジュール性と保守性: カーネルとサーバーの分離により、システムの特定の機能を変更や修正する際に他の部分に影響を与えずに行える

デメリット
・性能の低下: カーネルとサーバーの間のメッセージングやプロセス間通信によりオーバーヘッドが発生し、性能が低下する場合がある

・複雑さ: カーネルとサーバーの分散処理により、システムの複雑さが増します。設計とデバッグが困難になる場合がある

カーネルアーキテクチャはスマートフォンやロボットや自動掃除機などの
システムに採用されていることが多いそうです

以上でアーキテクチャのシステムの構造を終わります！
倉庫管理システム

### はじめに
SpringBootやMybatisなどを使用して倉庫管理システムを開発しました。画像は[こちら](https://github.com/UmeSoft-Japan/Warehouse)
## 機能紹介
### 基本管理
#### a.顧客管理
・顧客追加：顧客名、住所、担当者名、電話番号などを入力して顧客を登録。
・顧客変更：登録済みの顧客情報を編集。
・顧客検索：顧客名、担当者名、電話番号で検索。部分一致検索が可能。結果を顧客IDや顧客名でソート可能。
・顧客削除：指定した顧客の情報を削除。

#### b.仕入先管理
・仕入先追加：仕入先名、住所、担当者名、電話番号を入力して登録。
・仕入先変更：登録済みの仕入先情報を編集。
・仕入先検索：仕入先名、担当者名、電話番号で検索。部分一致検索が可能。結果を仕入先IDや仕入先名でソート可能。
・仕入先削除：指定した仕入先を削除。

#### c.商品管理
・商品追加：仕入先名、商品名、価格、仕様、規格を入力して登録。
・商品変更：登録済みの商品情報を編集。
・商品検索：仕入先名、商品名、価格で検索。商品名の部分一致検索が可能。結果を商品IDや商品名でソート可能。
・商品削除：指定した商品を削除。

### 倉庫管理
#### a.入庫管理
・入庫追加：仕入先名、商品名、倉庫名、数量を入力して登録。
・入庫検索：仕入先名や入庫番号で検索。結果を入庫番号、倉庫名、商品名、作成日時でソート可能。
・入庫削除：指定した入庫レコードを削除。

#### b.出庫管理
・出庫追加：倉庫名、商品名、顧客名、数量を入力して登録。
・出庫検索：顧客名や出庫番号で検索。結果を出庫番号、顧客名、商品名、作成日時でソート可能。
・出庫削除：指定した出庫レコードを削除。

#### c.在庫管理
・倉庫追加：倉庫名、住所、警戒上限、警戒下限などの情報を入力して追加する。管理ユーザのみ使用可能。
・倉庫変更：上記倉庫情報を変更する。
・倉庫検索：倉庫名、商品名などを指定して検索する。検索結果の倉庫名、商品名や価格によりソートが可能。
・倉庫削除：指定倉庫を削除する。

### システム管理（管理ユーザ限定）
#### a.ロール管理
・ロール追加：ロール名、説明、有効状態を入力して登録。
・ロール変更：登録済みのロール情報を編集。
・ロール検索：ロール名、説明、有効状態で検索。部分一致検索可能。結果をロールIDでソート可能。
・ロール削除：指定したロールを削除。

#### b.ユーザ管理
・ユーザ追加：氏名、アカウント名、ロールID、パスワード、年齢、性別を入力して登録。
・ユーザ変更：登録済みのユーザ情報を編集。
・ユーザ検索：氏名やアカウント名で検索。部分一致検索可能。結果をユーザIDでソート可能。
・ユーザ削除：指定したユーザを削除。

### 共通機能
・検索結果をCSV/Excel形式でエクスポート可能。
・検索結果の列を選択して絞り込み可能。
・同じ画面で複数の操作画面を開くことが可能。
・入力内容に対して自動チェックを実施。

## システム紹介
### 技術
・バックエンド：SpringBoot, Shiro, MybatisPlus
・フロントエンド：HTML, Css, JavaScript, LayUI, Dtree

### 環境
・開発環境：IDEA/Eclipse
・実行環境：JDK 1.8, Mysql 5.7以上, Maven
自己教師あり学習に関するメモ

# 自己教師あり学習とは

サーベイ論文[Self-supervised Learning: Generative or Contrastive](https://arxiv.org/pdf/2006.08218)では、以下のようにまとめられています。

- データ自体から「ラベル」を「半自動」プロセスによって取得する。
- データの一部を他の部分から予測する。

## 教師なし学習、教師あり学習との違い

![スクリーンショット 2025-01-13 21.46.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135548/1e042b97-f7e9-c980-8da1-100401d467ad.png)

> Liu, X. et al. (2021). Self-supervised Learning: Generative or Contrastive
![スクリーンショット 2025-01-13 21.47.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135548/776e359f-8d85-cdd2-c1db-0acbe436fb35.png)


多くの人は、教師なし学習と自己教師あり学習の概念を混同することがあります。自己教師あり学習は、手動でのラベル付けが関与しないため、教師なし学習の一分野とみなすことができます。しかし、厳密に言えば、教師なし学習は、クラスタリング、コミュニティ検出、異常検知などの特定のデータパターンの検出に重点を置いています。一方、自己教師あり学習は「復元」を目的としており、教師あり学習のパラダイムにあります。

# 自己教師あり学習の分類

![スクリーンショット 2025-01-13 20.07.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135548/6dc53e93-b43c-6c24-9647-2f51797b7f05.png)

> Liu, X. et al. (2021). Self-supervised Learning: Generative or Contrastive

以下の3つに大別されます。

- 生成的アプローチ
    - エンコーダーをトレーニングして入力xを明示的なベクトルzにエンコードし、デコーダーを使用してzからxを再構築する（e.g., the cloze test, graph generation）
- 対照的アプローチ
    - エンコーダーをトレーニングして入力xを明示的なベクトルzにエンコードし、類似性を測定する（e.g., mutual information maximization, instance discrimination）
- 敵対的アプローチ
    - エンコーダーデコーダーをトレーニングして偽のサンプルを生成し、識別器を使用してそれらを実際のサンプルと区別する（e.g., GAN）

以下の画像の分類もわかりやすいです。AutoencoderやFlow-based Modelといったモデルが確認できます。

![スクリーンショット 2025-01-13 21.48.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135548/e1de4451-41f0-5fb8-10fd-64b5b08577c5.png)

> Liu, X. et al. (2021). Self-supervised Learning: Generative or Contrastive

# 自己教師あり学習手法の性能評価
例えば画像処理の分野において、自己教師あり学習で獲得された画像表現のの性能評価としていくつかの下流タスクがありますが、画像分類についてまとめます。
- k-NN
    - k-NNを用いてテストサンプルに対して分類を行う
- Linear probing
    - エンコーダに1層の全結合層とsoftmax関数を取り付けて、それらのみを学習する
- Fine-tuning
    - Linear Probingと同じネットワークで、すべてのパラメータを学習する

# 参考リンク

- [Self-supervised Learning: Generative or Contrastive](https://arxiv.org/pdf/2006.08218)
- [転移学習](https://www.kspub.co.jp/book/detail/5332931.html)
- [深層学習による画像認識の基礎](https://www.ohmsha.co.jp/book/9784274231841/)
passive: trueとpreventDefaultの備忘録

ノベルワークスのとっしー([@tossy](https://x.com/A1vbzr4SVP8))です.

自作webアプリ開発の際に, **preventDefault** と **passive: true** について少し調べたので, 備忘録として保存しておきます.

# preventDefault とは？

[preventDefault](https://developer.mozilla.org/ja/docs/Web/API/Event/preventDefault)は, 「**規定のアクションを行わないように, ブラウザに伝える為のメソッド**」です.

https://developer.mozilla.org/ja/docs/Web/API/Event/preventDefault

:::note info
規定のアクションとは, ブラウザや機種ごとに定義されている「特定の操作に対する標準的な挙動（アクション）」を指します. 例えば, 以下のようなものがあります.

 - リンクのクリック → 新しいページへの遷移
 - フォーム送信 → ページのリロードを伴うデータ送信
 - 右クリック → コンテキストメニューの表示
 - スクロール操作 → ページ全体のスクロール
:::

preventDefaultを使うと, この規定のアクションを行われないようにすることが出来ます.
以下はpreventDefaultによってリンクをページ遷移出来ないようにする例です.

```javascript
const link = document.getElementById('disabled-link');
link.addEventListener('click', (event) => {
    event.preventDefault(); // クリックされた際に, 規定のアクションを無効化！
    alert('このリンクは無効化されています');
});
```


# passive: trueとは？

[addEventListener()](https://developer.mozilla.org/ja/docs/Web/API/EventTarget/addEventListener)のオプションの引数であり, 以下のように使用します.

```javascript
document.addEventListener('wheel', (e) => {
    // 処理
}, { passive: true });
```

passiveを有効にすると, このイベント内ではpreventDefaultを使用しないことをブラウザに明示します. これにより, ブラウザは処理ごとにpreventDefaultが呼び出されていないかを確認しなくなります.

:::note warn
passive: true にすることによってブラウザはpreventDefaultを確認しないようになりますが, preventDefaultを使用することは出来てしまいます. 
preventDefaultを使用した場合は, ブラウザは何もせずコンソールに警告を出します.
:::

passive: true が特に効果を発揮するのは, スクロール時やマウスホイール使用時などです.
例えば, スクロール時はスクロールが少し進むごとにpreventDefaultが呼び出されているかを確認します. これは, preventDefaultが呼び出された場合に即座に規定のアクションを止めるためです.
しかし, preventDefault の呼び出しを常に確認していることで, スクロール時の処理に大きな負荷がかかっています. 
負荷の大きさによっては, スクロールがカクつく場合があります. このようなスクロールを「スクロールジャンク」と呼ぶようです.

ここで, preventDefaultを使わない場合は, passive: true をつけることによって, preventDefaultを確認しないようになるので, スムーズにスクロールの改善が期待出来ます.

# 参考記事
https://blog.leap-in.com/use-passive-true-avoid-janky/

https://qiita.com/rhrh__8/items/e0c4317bf625d4bb5621
#0013（2024/01/13）バイト・キロバイト・…・ヨタバイト・…

# IT用語の数字の単位 - バイトからヨタバイトまで

コンピュータの世界では、データ量を表す際に**Byte**を基本単位として使用します。その上位単位としてキロバイト（KB）、メガバイト（MB）などがあり、これらの単位はデータサイズや記憶容量を表現するのに役立ちます。


# バイト単位の一覧表

| **単位**      | **数字**          | **英語表記**   | **ゼロの個数** |
|---------------|-------------------|--------------------|----------------|
| バイト     | 1                | Byte         | 0              |
| キロバイト  | 1,000            | Kilobyte (KB) | 3    |
| メガバイト  | 1,000,000        | Megabyte (MB) | 6    |
| ギガバイト  | 1,000,000,000    | Gigabyte (GB) | 9  |
| テラバイト  | 1,000,000,000,000| Terabyte (TB) | 12             |
| ペタバイト  | 1,000,000,000,000,000 | Petabyte (PB) | 15   |
| エクサバイト | 1,000,000,000,000,000,000 | Exabyte (EB)　| 18  |
| ゼタバイト  | 1,000,000,000,000,000,000,000 | Zettabyte (ZB) | 21   |
| ヨタバイト | 1,000,000,000,000,000,000,000,000 | Yottabyte (YB) | 24  |
| ロナバイト  | 1,000,000,000,000,000,000,000,000,000 | Ronnabyte (RB) | 27  |
| クエタバイト  | 1,000,000,000,000,000,000,000,000,000,000 | Quettabyte (QB)| 30 |


## 補足: バイナリ単位との違い
データ量の単位には、上記のように10進数を基にした単位（キロバイト=1,000バイト）が一般的に使われます。一方、2進数を基にした単位も存在し、それぞれ次のような表記がされます。

| **10進単位**   | **2進単位（IEC単位）** |
|----------------|-------------------------|
| 1 KB = 1,000 B | 1 KiB = 1,024 B         |
| 1 MB = 1,000 KB| 1 MiB = 1,024 KiB       |
| ...            | ...                     |


# 参考
- chatgptの回答
- https://www.keyence.co.jp/ss/general/manufacture-tips/zetta-byte.jsp
Spotify再生回数推移の動くグラフを作る

# はじめに
完成形はこちら。

https://x.com/takaya901/status/1878037890879643948

動くグラフの生成自体は[Bar chart race generator](https://fabdevgit.github.io/barchartrace/)を使わせていただきました。
今回は必要なデータの加工方法を記載します。
データ加工はGoogle SpreadsheetとPythonを組み合わせて行いましたが、全部Pythonでもいけると思います。

# 手順
アーティスト名別で作成する場合の手順を記載します。曲名別で作成する場合も同様です。
1. Spotifyの再生履歴データをリクエストする
    - [アカウントのプライバシー](https://www.spotify.com/jp/account/privacy/)にアクセス→「お客様のデータのダウンロード」
1. データが届いたらJSONからCSVに変換する
※アーティスト名や曲名が半角数字だけのものが含まれるとBar chart race generatorが誤作動するので、除外するかクォーテーション等で囲っておく
1. dateとartist_name以外の列を削除する
    <br>
1. query関数を使って、dateとartist_nameをキーにして1日ごとの再生回数を集計する
    ```vb
    =QUERY(A:B, "SELECT A, B, COUNT(B) WHERE A IS NOT NULL GROUP BY A, B ORDER BY A ASC", 1)
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239014/1e918aad-20a8-070a-5fd3-457d5a88354c.png)
    <br>
1. 【Python】各アーティストを聴いていない日があるとBar chart raceのグラフが0にリセットされてしまうため、日付×アーティスト名の組み合わせが網羅されるように加工する
    ```python:Python
    count_per_day = pd.read_csv('/content/drive/MyDrive/MachineLearning/Spotify/count_per_day.csv')
    # CSVから日付とアーティスト名をそれぞれ切り出して重複削除し、それらの全組み合わせを作成する
    date_artist_cross = pd.merge(count_per_day['date'].drop_duplicates(), count_per_day['artist_name'].drop_duplicates(), how='cross')
    # 各アーティストを聴いていない日は0回、聴いている日は元のCSVの回数をコピー
    count_per_day_filled = pd.merge(date_artist_cross, count_per_day, on=['date', 'artist_name'], how='left').fillna(0)

    # 加工後のデータをダウンロード
    from google.colab import files
    final.to_csv('count_per_day_filled.csv', encoding='utf_8_sig', index=False)
    files.download('count_per_day_filled.csv')
    ```
    <br>

1. 加工したCSVに対してSUMIFS関数を適用し、その日までの累計再生回数を集計する
    ```vb
    =SUMIFS(C$2:C2, B$2:B2, B2, A$2:A2, "<="&A2)
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239014/cc7b3525-89f0-1387-6098-e21c3a1211f5.png)
    <br>
1. 6.のCSVから4.で集計した列を削除し、「date」「artist_name」「その日までの累計再生回数」の3列にする
1. 7.のCSVを[Bar chart race generator](https://fabdevgit.github.io/barchartrace/)にアップロードし、アニメーションを生成する
メモ｜モノレポのStorybookをdocker-composeで動作させる

モノレポのStorybookをdocker-composeで動作させたときの、ファイルメモ
Windows, docker desktop, hotreloadあり

```./docker-compose.yml
services:
  storybook:
    build:
      context: ./UiLbrary
      dockerfile: ./DockerfileDev
    tty: true
    environment:
      - WATCHPACK_POLLING=true
    ports:
      - "6006:6006"
    volumes:
      - ./UiLbrary:/usr/src/app
      - /usr/src/app/node_modules
    command: npm run storybook
```

```./storybook/Dockerfile
# ベースイメージとして node を使用
FROM node:20-alpine AS build

# 作業ディレクトリを設定
WORKDIR /usr/src/app

# 必要なパッケージをインストール
RUN apk add --no-cache xdg-utils

# package.json と package-lock.json をコピー
COPY package*.json ./

# 依存関係をインストール
RUN npm install

# ソースコードをコピー
COPY . .

# node_modules を削除して再インストール
RUN rm -rf node_modules && npm install

# Storybook を起動
CMD ["npm", "run", "storybook"]
```
【Linux　基本用語】

## Linuxとは
世界中で利用されているオープンソースのOS
スマートフォン、サーバー、組み込み機器など、さまざまなデバイスで動作しており、特に開発者にとって重要な基盤となっています。

### ディストリビュージョン
ニーズにあったLinuxをユーザーに配布すること

・Ubuntu　
　初心者におすすめ。使いやすいデスクトップ環境を持つ
 
・CentOS / Rocky Linux
　サーバー運用に適したディストロ。
 
・Debian
　安定性が高く、幅広く利用されている。
 
### Linuxカーネル
アプリケーションを制限するソフトウェア
Linuxを起動した時に一番最初に起動
アプリケーションとメモリ間の処理をつなぐ

### パッケージ
プログラムや設定ファイルが１つになっているアプリケーションのまとまりのこと

### パッケージ管理システム
パッケージをインストールする時に依存関係など内部的な問題を解決するシステム

### ディレクトリ
フォルダと同じ意味

### ターミナル
真っ黒な画面
コマンドラインによる操作をする際に使用する（全て文字で操作する）

### コマンド
処理の命令のこと

### シェルスクリプト
定型的な処理を自動化したい場合に使用するプログラミング言語

### ライブラリ
各機能で同じように行う処理をまとめて共通化したもの
Qiitaユーザー必見！AIがあなたの投稿をぶった斬る⚔️ Qiita Roast誕生🔥

:::note warn 
**注意事項**  
本アプリは実験的に作成したものであり、バックエンドで使用しているOpenAI APIのクレジットが切れ次第、サービスを終了する可能性があります。予めご了承ください。
:::

こんにちは、エンジニアの皆さん！  
技術的な投稿を辛口AIで分析する新感覚ツール「**[Qiita Roast](https://qiita-roast.streamlit.app)**」をリリースしました。
このアプリは、Qiitaのプロフィールや投稿をもとに、強みや改善点を鋭く、そして少しユーモアを交えて指摘してくれるAIツールです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218139/2265a7be-fb10-31af-7fee-e9d7c5c77964.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218139/8b7ea879-d299-d1d1-c002-161c1a34d020.png)

## 開発の背景

このアプリのアイデアは、以前流行した「[Twitter Roast](https://airoast.net/)」というサービスにインスパイアされています。Twitter RoastはX（旧Twitter）での投稿に辛口コメントを加えるもので、多くのユーザーが自分の投稿に対する忌憚ない意見を楽しみながら受け止めています。

そこで私は、「技術投稿の場であるQiitaにも、辛口だけど建設的なコメントを付けられるツールがあれば、自分の技術投稿を見直すきっかけになり、成長につながるのではないか？」と考えました。  
「Qiita Roast」は、そんな思いから生まれたアプリです。

## Qiita Roastとは？

**Qiita Roast**は、以下のような分析を行います：

- あなたの技術的な専門分野を診断
- 投稿スタイルの特徴を一言で表現
- 強みと弱みを箇条書きで明確化
- 最近の投稿の総合分析
- ユーモアの効いた辛口コメント（Roast）

すべてが日本語で出力されるため、どなたでも簡単に楽しめます。特に「Roast」セクションは、投稿に対して辛口かつ笑えるコメントを提供してくれるので、一味違った視点で自分を見つめ直すことができます。


## 主な機能

- **プロフィール解析**  
  フォロワー数や投稿数、フォローしているタグをもとにした簡易診断。新たな強みを発見できるかも？

- **辛口コメント（Roast）**  
  投稿のクセや改善点を鋭く指摘しつつも、ユーモアを交えたコメントが特徴。きっと「クスッ」と笑えるはず！

- **分析結果の共有機能**  
  「Share on X（Twitter）」ボタンをクリックして、自分の分析結果をそのまま投稿可能。他のエンジニアと共有して楽しみましょう！


## 使い方

1. アプリにアクセス：[Qiita Roast](https://qiita-roast.streamlit.app)
2. QiitaのアカウントIDを入力して「Discover」ボタンをクリック。
3. 分析結果を眺めながら、自分の技術投稿を見直してみてください。
4. 面白い結果はX（Twitter）でシェア！


## なぜ使うべき？

技術投稿をただ書くだけではもったいない。自分の投稿を客観的に評価し、改善点を見つけることで、より多くのフォロワーを獲得するチャンスが広がります。また、辛口コメントを楽しみながら受け入れることで、技術力の向上がポジティブな体験になります。

---
ぜひお試しください！ご意見・ご感想をお待ちしています 🙌  
「辛口AI」があなたの技術投稿を新たな次元へ導きます！  
**[Qiita Roast](https://qiita-roast.streamlit.app)** にアクセスして、あなたの投稿の新たな一面を発見してください。
24/1/13 読書記録 ~土台からしっかり学ぶソフトウェアテストのセオリー~

# 書籍
[土台からしっかり学ぶソフトウェアテストのセオリー](https://amzn.asia/d/hvYdYEd)

# 第8章 テスト環境のセオリー

## 8-1. テスト環境
### 用語集 :pencil: 

- テスト環境
    - テストの実行に必要な環境
- CI（継続的インテグレーション）
    - デプロイするコードの品質を確保し、開発スピードを向上させるソフトウェア開発手法
- CD（継続的デリバリ）
    - 修正したプログラムを自動的に利用環境に展開・導入する手法


## 8-2. テストを実行する環境

### 用語集 :pencil: 

- 実機環境
    - 製品としてプログラムが実行されている環境と同様か、それに近しい環境
- 組み込みシステム環境
    - 実機環境の中でも、特にリソースの制約が厳しい環境
- シミュレータ環境
    - プログラムを実行するハードウェアを模擬した環境
- クラウド環境
    - 仮想化されたPCリソースをインターネットを介し、必要な時に必要な分、サービスとして利用する環境

## 8-3. CI/CD

### 気付き / 学び:writing_hand_tone5: 

#### CI/CDを用いる意味

1つの機能修正・開発後に、そのプロダクトが正常にビルドできるか？、用意されたテストがパスしているか？を確認するため。

## 8-4. DevOps

### 用語集 :pencil: 

- DevOps
    - 開発と運用で分担せず、高速な連携を実現して進めていく手法
    - 開発環境と本番環境の差異を小さくすることが目的

## Chap8. 感想 

テスト環境を作るための土台の環境（PCでやるか？ハードウェアでやるか？クラウドでやるか？）の説明や、テストを自動化するためのツール紹介等が記載されたチャプターだった。
現在の業務ではCI/CDが用いられていることもあり、各単語の定義を確認した程度で読み進めた。

あまり学びは得られなかったものの、これからテスト環境を1から作る必要のある人にとっては有意義な章だと思う。
DTOクラスの基本

はじめまして、ソフトウェアエンジニアやってますkazuです🦌

最近業務で、DTOクラスを教えてもらったので理解を深めようと思い記事に起こしてみました。

# そもそもDTOクラスとは

DTO（Data Transfer Object）とは、システム間やレイヤー間（例：UIとビジネスロジック、ビジネスロジックとデータベースなど）でデータを転送する時に用いられるオブジェクトのこと。

APIやDBから受け取ってきた生のデータを扱いやすい形に変換して、一貫した形式でアプリケーション内部に受け渡しができる。

## 特徴

- ロジック（ビジネスロジック、ドメインロジック）を持たない
- プロパティを保持するシンプルなクラス
- 入力値の以上や型揃えの不備を発見しやすくなる

つまり、あくまで「データの運搬がメイン」のオブジェクトで、ビジネスロジックやドメインロジックのような業務ルールや制約などの処理に含まれず、純粋にデータのやり取りを担うことを目的としている。

# なぜ、DTOを使う必要があるのか

## 1. レイヤー間の依存を減らす

例えば、ドメインオブジェクト（エンティティ）をUI層に直接渡すと、UI層で余計なフィールドやメソッドを操作できてしまい、依存関係が複雑になったりする。

DTOを挟むことで、UI層に必要な情報だけを切り出し、UI層とドメイン層の結合度を下げることができる。

## 2. データのまとまりを担保する

データをひとつのオブジェクトにまとめることで、転送やシリアライズが簡単になり、データの受け渡しを行う関数やAPIの引数/戻り値を整理しやすくする。

## 3. セキュリティやバリデーションのしやすさ

データチェックやバリデーションをDTOクラスの生成過程で扱いやすくなる。

# DTOがよく使われるシュチュエーション

## Webアプリケーションのリクエスト/レスポンス

- REST APIで受け取ったJSONデータをDTOにマッピングして扱う
- データベースの情報をDTOにつめてフロントエンドに渡す

## マイクロサービス間通信

- マイクロサービス同士が通信する際、ServiceA → DTO → ServiceBのようにデータ転送をする

## レイヤードアーキテクチャ

- Presentation層（UI層）
- Application層（ビジネスロジック）
- Domain層（ドメイン）
- Infrastructure層（DBなど）

上記のような間で、Entityをそのまま渡すと密結合になるため、DTOを介して疎結合に保つ。

# サンプルコード

```jsx
class OrgDTO {
  constructor(contents) {
    this.orgId = this.parseIntValue(contents["orgId"]);
    this.email = contents["email"];
    this.name = contents["name"];
  }

  parseIntValue(value) {
    return value ? parseInt(value, 10) : null;
  }
}

function main() {
  // サンプルデータ（外部から取得する想定のデータ）
  const contents = {
    "orgId": "1",
    "email": "aaa@example.com",
    "name": "test"
  };

  // DTOクラスのインスタンスを生成
  const result = new OrgDTO(contents);
  console.log("result", result);
}

main();
```

例えば、このように入力値の `orgId` が文字列として与えられる場合、`parseIntValue` 関数を利用して文字列型を `Int` 型に変換することができます。このように、生のデータをアプリケーション層で扱いやすい形に整形することで、コードの可読性と保守性を大きく向上させることができます。

また、データの取り扱いに役割を限定することで、ドメインロジックやビジネスロジックとの結合度を下げることができ、システム全体の見通しが良くなります。結果として、その後の処理でデータを扱う際に余計な手間が減り、開発効率が向上しそうです。

# まとめ

- **DTOクラスは、「データをやり取りするだけ」のオブジェクト**
    - ロジックを持たず、転送用フィールドとアクセサだけを持つのが基本
- **レイヤー間の依存度を下げ、コードの可読性を上げるために利用**
    - 疎結合を保ち、メンテナンス性を高めるのに役立つ
- **Webアプリやマイクロサービス、レイヤードアーキテクチャで使われることが多い**
    - リクエスト/レスポンスやDBとのやりとりなど
Open3D : mesh にテクスチャをはる方法

# Open3Dでmeshにテクスチャをはる

1. meshを作成する（読み込む）
2. テクスチャの画像ファイルを読み込む
3. マッピングを設定する

です。

```py
import open3d as o3d
import numpy as np

# 適当にメッシュを作成する！ 別に read_triangle_mesh で読み込んでもいいです
mesh = o3d.geometry.TriangleMesh()
mesh.vertices = o3d.utility.Vector3dVector([
    [0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0],
    [0, 0, 1], [1, 0, 1], [1, 1, 1], [0, 1, 1]
])
mesh.triangles = o3d.utility.Vector3iVector([
    [0, 1, 2], [2, 3, 0], [4, 5, 6], [6, 7, 4], [0, 1, 5], [5, 4, 0],
    [1, 2, 6], [6, 5, 1], [2, 3, 7], [7, 6, 2], [3, 0, 4], [4, 7, 3]
])
mesh.compute_vertex_normals()

##########################################
# テクスチャファイルを読み込む
texture = o3d.io.read_image("texture.png")
mesh.textures = [texture]

# マッピングを設定する
triangle_uvs = np.random.rand(len(mesh.triangles) * 3, 2)
mesh.triangle_uvs = o3d.utility.Vector2dVector(triangle_uvs)
mesh.triangle_material_ids = o3d.utility.IntVector([0]*len(mesh.triangles))

##########################################
# 描画する
o3d.visualization.draw_geometries([mesh])
```

使った画像はこういう感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33095/9f1bd979-4935-259f-fc00-7ead883bd354.png)

実行するとこう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33095/f6bb4a75-2012-cb94-c83d-c6325d599f9e.png)

ぜんぜんマッピングの位置合わせなどはしていないので適当に貼られていますが、、、
とりあえず無事にはることが出来ます。
既存のプロジェクトと新たなリモートリポジトリをリンクさせる方法

## 1. 既存のプロジェクトのフォルダをGitリポジトリにする
既存のプロジェクトのフォルダをGit Bashで開き、
```
git init
```
でGitリポジトリにする。
## 2. リモートリポジトリと結びつける
作成したリモートリポジトリのリンクをコピーし、
```
git remote add origin [リモートリポジトリのリンク]
```
でリモートリポジトリと結びつける。

## 3. リモートリポジトリにpushする
```
git checkout -b main
```
でmainブランチを作成し、
```
git add . 
```
ですべての変更をステージング
```
git commit -m "Initial commit"
```
でコミットして、
```
git push -u origin main
```
でリモートリポジトリにpushする。
Linux 標準入出力

## 標準入力

プログラムの基本的な入力。通常はキーボードからの入力

## 標準出力

プログラムの標準的な出力。通常は端末ディスプレイに出力

## 標準エラー出力

プログラムのエラーメッセージを出力するための出力。通常は端末ディスプレイに出力

## リダイレクト

標準入出力先を変更することをリダイレクトと呼ぶ。

### 標準入力のリダイレクト

```
# 通常のcatコマンドの動き
# この動きはcatコマンドに用意された動きで、ファイルが指定された場合はファイルの内容を表示する
cat ファイル名

# リダイレクトを利用した場合
# キーボードからの入力ではなくファイルの内容を入力先として指定している
cat < ファイル名

# 上記の出力結果は同じだが中身の動きが違う
```

### 標準出力のリダイレクト

```
# 通常のlsコマンドの動き
ls
=> 画面に表示される

# リダイレクトを利用した場合
# 結果を画面に表示ではなくlist.txtファイルに出力する
ls > list.txt

# > だけではもしlist.txtが既に存在した場合上書きされてしまうため >> とすると末尾に追記となる
# ファイルが存在しない場合もこの書き方は有効
ls >> list.txt
```

### 標準エラー出力のリダイレクト

```
# 通常のエラー表示(lsコマンドに存在しないファイル名を渡す)
ls /xxx
# => エラー文言

# リダイレクトを利用する
# 結果を画面にではなくerror.txtファイルに出力する
ls /xxxx 2> error.txt
```

### 標準出力と標準エラー出力をまとめる

```
# > list.txt で標準出力をlist.txtにリダイレクト
# 2>&1 2(標準エラー出力)を&1(標準出力)にリダイレクト

ls /xxxx > list.txt 2>&1
```

## dev/nullファイル

スペシャルファイルと言われる特殊なファイル。

- 入力先として指定しても何も内容を返さない
- 出力先として指定しても書き込んだデータは保存されない

という特性を持っていてコマンドの結果をどこにも表示、保存したくないときに利用する

```
# この場合エラーが出た時のみ標準エラー出力として画面に表示される
ls /xxxx > /dev/null

# この場合エラー自体もリダイレクトして/dev/nullに出力される
ls /xxxx > /dev/null 2>&1
```

パイプライン

複数のコマンドを連携させる仕組み。次のように書く

```
コマンド | コマンド | コマンド

# ls コマンドの標準出力をlessコマンドに渡すことで、行数が長くなっても一ページづつ閲覧できるようになる
ls / | less

# 間にcat -nを挟み、番号つきで出力する
ls / | cat -n | less

標準エラー出力も同じように出力する
ls / 2>&1 | cat -n |less
```

## フィルタ

catコマンドのように標準入力を入力として受け取り、標準出力に出力するコマンドのこと。

代表的なフィルタコマンド
| **コマンド** | **役割** | **使用例** |
| --- | --- | --- |
| `cat` | ファイルの内容をそのまま出力する。複数ファイルの内容を結合して表示するのにも使える。 | `cat file.txt` |
| `head` | ファイルの先頭数行を表示する。デフォルトは10行。 | `head -n 5 file.txt` |
| `tail` | ファイルの末尾数行を表示する。リアルタイム更新も可能（`-f` オプション）。 | `tail -n 10 file.txt` |
| `grep` | 指定した文字列や正規表現に一致する行を検索し、表示する。 | `grep "error" file.txt` |
| `sort` | ファイルの内容を行ごとに昇順または降順に並べ替える。 | `sort file.txt` |
| `uniq` | 連続して重複する行を削除する（`sort`と組み合わせて使うことが多い）。 | `sort file.txt | uniq`   |
| `tac` | ファイルの内容を逆順（最後の行から最初の行）に表示する。 | `tac file.txt` |
| `wc` | ファイルの行数、単語数、文字数をカウントする。 | `wc file.txt` |
【Amazon Bedrock】Agentでもクロスリージョン推論使いたい

## 前書き

2024年8月の末にAmazon Bedrock がクロスリージョン推論をサポートしました。

https://aws.amazon.com/jp/about-aws/whats-new/2024/08/amazon-bedrock-cross-region-inference/

クロスリージョンとは、複数のAWSリージョン間でリソースを共有・活用する機能です。

この機能の利点は、クォータ制限を超えて利用できることです。

例えば、東京リージョンでAnthropic Claude 3.5 Sonnetを利用する場合、1分間に**20回**という呼び出し制限が設定されています。

![1DBC2FB8-EEEE-4EF3-B4E3-A1A36FCB42E7.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/87bebaa9-1223-c431-990a-0db826a21cba.jpeg)
[サービスクォータの表示](https://console.aws.amazon.com/servicequotas/home)

検証段階では大きな問題になりませんでしたが、実際にサービスを公開した場合、この制限では不十分です。

## 使い方

クロスリージョン推論の設定は非常にシンプルです。
使用する`Model ID`を`Inference profile ID`に置き換えるだけで利用可能になります。

例えば、東京リージョンのAnthropic Claude 3.5 Sonnetの場合：

`anthropic.claude-3-5-sonnet-20240620-v1:0`から
`apac.anthropic.claude-3-5-sonnet-20240620-v1:0`
に変更するだけで設定は完了です。

###  注意点
注意点が1点ございます。AWS Organizationsのサービスコントロールポリシー（SCP）によってリージョンの使用が制限されているアカウントの場合、事前に管理者へ分散先リージョンの使用許可を申請する必要があります。

`apac.anthropic.claude-3-5-sonnet-20240620-v1:0`利用する場合、下記のリージョンで許可設定行わなければいけません。

- ap-northeast-1 
- ap-northeast-2
- ap-southeast-1
- ap-southeast-2
- ap-south-1

### マネコンからAgentに適応する場合

`エージェントビルダー`の編集画面で、`モデルを選択`かから使用したいモデルの推論タイプを開き、推論プロファイルからクロスリージョンを選択して`適応`します。

![0EC3761A-3C82-43E7-B778-5699EFD289CC.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/b9b07258-de1b-f639-4d6b-0e88291c8263.jpeg)


### CDKからAgentに適応する場合

Amazon Bedrock のメニューバーから`Cross-region inference`を開き

![18033B7B-BA63-45D0-8FC7-414FDD8E9E7C.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/e3dc65f8-2b92-e14e-2adb-ea6be4339f50.jpeg)

使用したい`Inference profile ID`をコピーします。

foundationModelの値をそれに置き換えれば完成です。

```typescript: agent.ts
    const xxxagent = new CfnAgent(this, 'Xxxagent', {
      ...
      foundationModel: 'apac.anthropic.claude-3-5-sonnet-20240620-v1:0',
      ...
```

## 補足

2点補足します。

1. クライアントからAmazon Bedrock Agentを呼び出す時に使用する`InvokeAgentCommand`、クロスリージョン推論プロファイルでも対応します
2. リクエストの分散先として利用されるリージョンでも、該当モデルのアクセス許可が必要です

https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-prereq.html

   ただし、一部のリージョンでは、該当モデルは `Cross-region inference`対応してるため、何もしなくても使えます

![16C72888-B6B8-4A8D-99A8-5E85DEAA2DCA_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/5e75b5c2-e7d6-6c99-f656-b58d0b2d2309.jpeg)

東京リージョンで利用する`Claude 3.5 Sonnet`のクロスリージョンプロファイルでは、`ap-northeast-2`（ソウル）リージョンのみ手動での有効化が必要です。
データへの関数のフィッテング、scipy.optimizeのcurve_fitではうまくできなくてもleast_squaresではできたよ

# pythonのフィッテング、least_squaresを試すべし

データに対して関数のフィッテングをしていたんですが、データも関数も同じなのにcurve_fitではうまくいかなかったのがleast_squaresを使ったらうまくいきました。使っているアルゴリズムが違うのだと思いますが、理由はわかんないです。

### フィッテングさせたいデータと関数
・データ
指数関数的に減少していくデータの漸近部分で次の関数でフィッテングしたい。プログラム内では$mm$と置いていて、後半の漸近部分のみをフィッテングしたいので$mm[150:]$に対してフィッテングしてます。

・関数
```math
y=(1-c)\exp(-\frac{c}{a}t)
```
変数は$t$、パラメタは$a$と$c$の二つです。
値の範囲は$a>0$、$1>c>0$です。およそ$[a, c]=[1000, 0.9]$が正解です。これらを範囲と初期値に設定しました。


## うまくいかなかったscipy.optimize.curve_fitの場合

```Python
import numpy as np
from scipy.optimize import curve_fit

def func_c1(x, a, c):
    return (1-c)*np.exp(-x*c/a)
     
popt, pcov = curve_fit(func_c1, mm_fit[150:1000], times[150:1000], p0=[1000,0.9], bounds=([0,0], [np.inf,1]))
    
xd = np.linspace(min(times), max(times), 1000)
fitting = func_c1(xd, popt[0],popt[1])

print("Optimal parameters:", popt)
```
結果を確認しましょう。
```
Optimal parameters: [4000.000901077    0.000000000]
```
プロットしてみます。オレンジの点に対してフィッテングを行なっていて、緑の点線がフィッティングされた曲線です。

![curve_fit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2804113/85a0fea1-36e4-1aed-ad28-4366a208fdd0.png)

うまくできてないですね。

## うまくいったscipy.optimize.least_squaresの場合

```Python
import numpy as np
from scipy.optimize import least_squares

def func_c1(t, params):
    a, c = params
    return (1 - c) * np.exp(-t * c / a)
    
def residuals(params, x, y):
    return y - func_c1(x, params)
    
initial_params = [800, 0.8]
    
result = least_squares(residuals, initial_params, args=(times[150:], mm[150:]), bounds=([0, 0], [np.inf, 1]))

print("Optimal parameters:", result.x)
```


出力も良さげです。
```
Optimal parameters: [1351.5720327910    0.8665103412]
```

同様にプロットしてみます。

![least_squares.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2804113/8e4e4cbf-5cc7-1ee2-be0c-3bd10ef8fbb2.png)

うまくいってます。

# まとめ

pythonのscipy.optimizeのcurve_fitを用いたフィッティングがうまくできなかったらleast_squaresを試してみようというメモでした。

実装の違いとしては、curve_fitは当てはめ関数をそのまま使えるのに対して、least_squaresは差分を使うところが違うんで書き換えるときはそこだけ注意です。
ユークリッドの互除法の覚え方


### ユークリッドの互除法とは

 

- 商と余りの最大公約数は被除数と除数の最大公約数になるということ
- 上の性質を利用して下のような問題を解くことができる



#### (問題) 1071 と 1029 の最大公約数
- 1071 を 1029 で割った余りは 42
- 1029 を 42 で割った余りは 21 （なぜ上の行からこうなるかがわからない）
- 42 を 21 で割った余りは 0
- よって、最大公約数は21である。

42 = 21 x 2

### 覚え方

- 長方形の中に敷き詰められることのできる正方形を探すというのが感覚的に覚えやすそう。
 https://suuhaji.com/euclid/

### 証明

```
被除数 = 除数 x 商 + 余り
```

- 除数と余りの両方を割り切ることできる数があると左辺の被除数も同じ数で割り切ることができる。


### 例
    
```
24 = 5 x 4 + 4 
24, 4, 4は全て2で割ることができる。
```


- なので商と余りの最大公約数は被除数と除数の最大公約数になる。
日本語プログラミング言語 Mind（マインド）をビルドできる環境をVSCodeで構築（シンタックスハイライト編）

# はじめに
日本語プログラミング言語Mind（マインド）のシンタックスハイライトとスニペットが使用可能なVSCode拡張機能（の非公式プレビュー版）がついにリリース！まだまだ粗削りの状態ですが、みなさまのご意見ちょうだいいただきたく、よろしくお願いいたします。:bow:

# 前提条件
Windows11 Pro 22H2
VSCode(Visual Studo Code)　1.95.1


## VSCodeの拡張機能
mind-extension-preview 0.0.1

# 「日本語プログラミング言語MindのVSCode拡張（非公式）」0.0.1のインストール

VSCodeの拡張機能の検索で、「mindv」くらいまでタイプすると下図のような検索結果が表示されます。スクショはアッパーキャメル風になっていますが、全部小文字でもだいじょうぶです。

![vscode-mind-syntax7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118036/678d701f-6f07-e555-2242-9ec76505f941.png)


検索結果ペインで「MindVsCodeExtension」の「インストール」をクリックするとインストールされてエディタウィンドウにドキュメントが展開します。

![vscode-mind-syntax8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118036/fa14a098-0a40-aab4-dbf6-d761530ce7ed.png)

# シンタックスハイライトの様子
下図は先日の雪っぽいのを降らせるMind9βのソースコードです。

![vscode-mind-syntax9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118036/8e84d8aa-59aa-e8f1-4dca-979e8fefa23a.png)

下図はMind9β標準添付のサンプルソースコードの例です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118036/15862dff-f36e-bd8c-a9f6-886a6e420b74.png)

こちらでは全角空白の強調表示に選択肢が提示されました。開発時に表示したサンプルソースコードでは全角空白が強調されていますが、これはextensionとしてはなにもやっていないので、VSCode全体の設定なのかなと思っていました。この選択肢は初めてみましたので、あとで深堀しておきます。

日本語プログラミング言語Mindユーザーとしては全角空白の強調はうるさいかなとも思っていたのですが、ユーザーさまのご意見を伺えればと思います。

# コードスニペットの様子
このバージョンではコードスニペットも一部の構文で対応しています。
詳しくは[こちらの記事](https://qiita.com/mylifewithviolin/items/5eec7787c1b76cd9fcea)をご参照ください。

# ソースコードをVSCodeでビルドする方法
Mind7とMind8のソースコードをVSCodeでビルドする環境を構築する方法はこちらもご参照ください。

https://qiita.com/mylifewithviolin/items/afe36d1fe26194e241ec

# おわりに
いかがでしたでしょうか？なにかのお役に立てればと思います。シンタックスハイライトの守備範囲はまだ不十分なので、追ってバージョンアップしていけたらと考えております:relaxed:
VSCodeでの Jupyter の環境構築

# はじめに
**「VSCode で環境構築して！」
「仮想環境で Jupyter Notebook 使えるようにしといて！」
「Jupyter のパッケージ入れるだけだよ」**
などなど、プログラミングを始めようとするとこんなことを言われがちです。Qiita を調べて Terminal やコマンドプロンプトを叩き、Hello world を打ってみたら一応出力された。出力されたのだからいいだろうと、よく理解しないままスルーしてしまったことは初学者あるあるでしょう。
特に Mac ユーザーは絶妙に参考になる記事が見つからず、モヤモヤしたのではないでしょうか。

ということで、この記事では Mac OS における VSCode での Jupyter の仮想環境での環境構築について、基本的なことを再度押さえなおしていこきます。


# そもそも「仮想環境」って？

**仮想環境（virtual environment）** とは、Pythonのプログラムやプロジェクトごとに、個別にライブラリをインストールできる独立した環境のことです。Pythonはさまざまなプロジェクトで使われますが、仮想環境を使うことで、プロジェクト間のパッケージや依存関係の競合を避けることができます。

これでわかるなら十分ですが、そうでない人のために噛み砕いて説明しておきます。
### ライブラリとは？
ライブラリも多くの人は用いたことがあると思いますが、Numpy, matplotlib といったあれです。
```
import [ライブラリ名]
```
で、プログラムファイルの頭で読み込んでいるものたちです。そしてライブラリは標準ライブラリと外部ライブラリに分けられます。

| 標準ライブラリ | 外部ライブラリ|
|:-:|:-:|
| Python に元から搭載  |  必要に応じてインストールする必要がある |
| import [ライブラリ名]  |  Terminal でのインストールが必要|
| math, sys など| matplotlib, numpy など|

外部ライブラリのインストールの際に Terminal で使うコマンドが、
```
pip install [ライブラリ名]
```
もしくは
```
python -m install [ライブラリ名]
```
です。

:::note
この二つは Python のインストールの仕方によって下を使わないとうまくいかない場合があるのですが、基本的には上で問題ありません。
下をやってもうまくいかない時は、Python がインストールされていないなどの根本的な問題があると思われます。
:::
それでは、**pip でインストールしたライブラリはどこに保存されるのでしょうか？**
ここに**仮想環境**を使う理由が出てきます。

## 仮想環境の役割
まず先ほどの質問の答えですが、**ライブラリのインストール先**を**仮想環境**に指定することが可能です。つまり、プロジェクトごとに仮想環境を作成することによって、ライブラリ等のインストール先を分けることが可能になります。
### 仮想環境のメリット
プロジェクトごとに必要なライブラリをインストールして管理することができるので、ライブラリのバージョン管理も簡単になります。

:::note
これによって、あるライブラリのver. 1.1 と ver. 2.1 を使い分けるといったことができるようになります。


:::
一方で仮想環境を作成しない場合、ライブラリのインストール先は **Global 環境**となります。全てのライブラリを Global 環境に入れてしまうと、過去にどのライブラリをインストールしたのかの確認が面倒になってしまします。

## 仮想環境の構築
それでは仮想環境の構築を VSCode 上で行っていきましょう。今回は仮想環境を構築し、Python での開発によく用いられる Jupyter ライブラリをインストールしていきます。

![Jupyter Notebook](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3743858/cdbd08d3-c2fa-b28a-fb35-8ea72b86c10d.png)

1. まず適当な作業用フォルダを用意します。今回はデスクトップ上に VSCode というフォルダを作成し、その中に venv という作業用フォルダを作成しました。

2. VSCode で　ターミナル > 新しいターミナル を選択し、ターミナルを開きます。

3. ターミナルで以下のコマンドをうち、作成した作業用フォルダに移動します。
    ```terminal: 作業用フォルダへの移動
    cd /Users/[User name]/Desktop/VScode/venv
    ```
4. 引き続き VSCode 内のターミナルで以下のコマンドを実行し、**仮想環境**を作成します。今回は jupyter という名前の仮想環境を構築します。
    ```terminal: 仮想環境の構築
    Python -m venv jupyter
    ```
これで仮想環境が構築されました！

## 仮想環境のアクティベート
以下のコマンドをターミナルで実行します。
```terminal: アクティベート
. jupyter/bin/activate
```
このコマンドは Mac 及び Linux 用になり、Windows の場合は異なります。これを実行すると仮想環境に入ることができ、ターミナルにおいて先頭に
```terminal: 仮想環境
(jupyter) [コマンド]
```
と仮想環境名が記載されます。

## モジュールやライブラリのインポート
この状態でpip install をすればモジュールなどをインポートすることができます。そして、モジュールのインポート先が構築した仮想環境になっているかは、
```terminal: インポートされたモジュール一覧の表示
pip list
```
と実行することで確認できます。インポート先が仮想環境に指定できていれば、構築したばかりの仮想環境にはまだ何もモジュールは入っていません。
```terminal: pip list
Package    Version
---------- -------
pip        22.0.4
setuptools 58.1.0
```
このように基本的なパッケージのみが表示されます。

# 最後に
自分のメモがてら記事にしました。何かご指摘や改善点があれば教えていただけると幸いです。