OmniAICreator/Qiita-1.07M huggingface dataset:
Voice-Pro: 究極のAI音声変換・多言語翻訳ツール 🎙️

## はじめに

コンテンツのグローバル展開やマルチメディア処理にお困りではありませんか？Voice-Proは、これらの課題を解決する革新的なAIパワードツールです。YouTubeコンテンツの加工から、プロフェッショナルな音声処理、リアルタイム翻訳まで、あらゆるニーズに対応する統合ソリューションをご紹介します。

## 🌟 Voice-Proが解決する課題

### 1. コンテンツの多言語展開
- YouTubeビデオの高精度な文字起こし
- 100言語以上への自動翻訳
- プロフェッショナルな吹き替え音声生成
- オリジナルBGMと効果音の完全保持

### 2. 音声プロダクション
- 🎤 ゼロショット音声クローニング技術
- 🎵 AIカバー曲制作
- 🎙️ ポッドキャスト制作
- 🔊 プロフェッショナルな音声加工

### 3. リアルタイムコミュニケーション
- 即時音声認識
- リアルタイム多言語翻訳
- 柔軟な音声入力ソース対応

## 💫 主要機能のデモンストレーション

### 1. Dubbing Studio
コンテンツの多言語化を一括処理：
- YouTube動画のダウンロード
- AIによる高精度な音声分離
- Whisperによる自動字幕生成
- 多言語翻訳
- F5-TTSによるプロフェッショナルな吹き替え

![main_page.kor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3977019/af9c45ae-c381-7574-716c-f8890d70f86b.png)



### 2. F5-TTS音声クローニング
革新的な音声複製技術：
- 数分の音声サンプルから話者の声を再現
- 自然な抑揚とイントネーション
- 感情表現の保持
- マルチ言語対応

![tts_f5_multi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3977019/4a7f7831-5a1a-5e19-7db5-808cdfd82492.png)


### 3. AIカバー制作
プロフェッショナルな音楽制作機能：
- UVR5による高品質なボーカル分離
- RVC v2エンジンによる声質変換
- 柔軟な音声モジュレーション

![ai_cover.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3977019/6a504b04-0341-c9a0-5368-6a7a947525a7.png)


### 4. リアルタイム翻訳
ビジネスコミュニケーションの革新：
- 瞬時の音声認識
- 100言語以上への即時翻訳
- 会議や商談での活用が可能

![live_translation_bbc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3977019/ea84e006-8d71-a1e0-8577-3c3ba64572e7.png)


## 🎯 活用シーン

### 1. コンテンツクリエイター向け
- YouTubeチャンネルのグローバル展開
- マルチ言語コンテンツの制作
- オリジナルポッドキャストの制作

https://youtu.be/SviTNFw_DrY?si=Xz0jrpV_Zb07yr-c

https://youtu.be/Wfo7vQCD4no?si=ohGlX5ZwVzyJNKaj

### 2. ビジネス向け
- 国際会議でのリアルタイム通訳
- プレゼンテーション資料の多言語化
- トレーニング動画の現地化

https://youtu.be/GOzCDj4MCpo?si=Ea7m5PWPFmiDXz0I

### 3. エンターテインメント向け
- カバー曲の制作
- ボイスアクティング
- 音声コンテンツの制作

https://youtu.be/sv3l6gvESbE?si=_cJV4wL6tc9kHXiI


## 🔧 技術基盤

Voice-Proは最先端のAI技術を統合：
- **音声認識**: Whisper, Faster-Whisper, Whisper-Timestamped
- **音声合成**: F5-TTS, Edge-TTS
- **音声処理**: Demucs, MDX-Net, RVC v2
- **UI**: Gradio 5
- **GPU加速**: CUDA 12.1対応

## 📢 さらに詳しく

Voice-Proの詳細な機能や導入方法については、[公式GitHub](https://github.com/abus-aikorea/voice-pro/)をご覧ください。無料トライアル版もご利用いただけます。

本格的な導入やビジネス利用については、以下のチャネルをご確認ください：
- 🌐 公式サイト：[ABUS Korea](https://abuskorea.imweb.me)
- 📧 お問い合わせ：abus.aikorea@gmail.com
- 🛍️ 購入：[Amazon Japan](https://www.amazon.co.jp/dp/B0DBVRJ542)

## まとめ

Voice-Proは、AIによる音声処理と多言語展開の新たな地平を切り開くツールです。コンテンツのグローバル展開やプロフェッショナルな音声制作に、ぜひVoice-Proをご活用ください。詳細は公式GitHubリポジトリにて公開中です。
Swift学習：基本的なデータ型

## Swiftの基本的なデータ型
１．文字列型：String
２．整数型：Int
３．浮動小数点型：Double
４．ブール型：Boole

#### 記述例
```Swift
// 基本的なデータ型
let string: String = "Hello world"
let integer: Int = 10
let double: Double = 0.0
let booleanTrue: Bool = true
let booleanFalse = false

// Bool型は「trueとfalse」だけ
```

## 型推論
Swiftは賢いので代入した値から自動的にデータ型を推測する

#### 記述例
```Swift
let whatIsDatatype = "Hello everyone" // Swift「この値は文字列です」
var double = 10.5 // Swift「この値はdouble型です」
````
途に応じて BOM の有無を決める

### **BOM（Byte Order Mark）がある場合とない場合の影響**
UTF-8 における BOM (`\ufeff`) の有無は、ファイルの読み取りや表示に影響を与える場合があります。

---

## **1. BOM あり (`\ufeff` 付き)**
```javascript
var blob = new Blob(['\ufeff' + printData], { type: "text/csv;charset=utf-8" });
```

### **影響**
✅ **メリット**
- Windows版 **Excel** で開いたときに **文字化けしにくい**（特に CSV ファイル）。
- 一部のテキストエディタやアプリケーションが **UTF-8 であることを正しく認識** できる。

❌ **デメリット**
- UNIX/Linux の一部のツール (`cat`, `grep`, `awk` など) では **BOM をデータの一部と誤認識** することがある。
- Python や JavaScript の `read()` 関数で最初の文字として `\ufeff` が入る場合がある。
- Web サーバーや API で処理する際、BOM の存在が影響を与える場合がある。

---

## **2. BOM なし (`\ufeff` なし)**
```javascript
var blob = new Blob([printData], { type: "text/csv;charset=utf-8" });
```

### **影響**
✅ **メリット**
- Linux 環境の `grep` や `awk` などで **スクリプトが正しく動作する**。
- 一部のプログラム（特に JSON, XML, CSV の解析）で **余計な BOM の影響を受けない**。
- Web サーバーでの処理に影響を与えない。

❌ **デメリット**
- **Windows版 Excel で CSV を開いたときに文字化けする可能性がある**（特に日本語）。
  - Excel では UTF-8 を正しく判別できないことがあり、Shift_JIS で解釈されることがある。

---

## **BOM の有無の選び方**
| 使用用途 | BOM あり | BOM なし |
|----------|---------|---------|
| **Windows Excel で開く CSV** | ✅ **推奨** | ❌ 文字化けする可能性あり |
| **Linux でのテキスト処理 (`cat`, `grep`, `awk` など)** | ❌ 影響を受ける可能性あり | ✅ **推奨** |
| **Web サーバーで API 連携や JSON/XML を扱う** | ❌ 影響を受ける可能性あり | ✅ **推奨** |
| **UTF-8 のエディタで開く（VSCode, Sublime, Notepad++ など）** | どちらでもOK | どちらでもOK |

---

## **結論**
- **Windows の Excel で CSV を開く場合** → BOM **あり**
- **Linux や Web サーバーで処理する場合** → BOM **なし**
Intent にデータを詰める（自分用メモ）

いつも忘れるのでメモ。

Intent にデータを詰めて他のアプリコンポーネントを起動したい場合、putExtra を使用することでデータを詰めることができる。

例えば ある Activity に「TEST DATA!!」というデータを渡したい場合は以下のようにする。

```FirstActivity.kt
val intent = Intent(this, SecoundActivity::class.java)
// key-value 方式で値を詰める
intent.putExtra("TEST_DATA'S KEY", "TEST DATA!!")
```

データをもらう側では`getXXXExtra`を使用することでデータを取り出すことができる。
```SecoundActivity.kt
    // キーを指定することで対応する value を取得できる
    intent.getStringExtra("TEST_DATA'S KEY")
```
数値変換でNaNがでてしまう

# コンソール上に謎の値がでてきた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3993509/bd67a270-4240-cda2-a88b-fd45e57e5072.png)

#### コード
```react:
const value = {title:"タイトル", time:"1"}

console.log(parseInt(value));
```
# 原因
オブジェクトに対して数値変換していた

NaNとは非数 (Not-A-Number) を表す値
数値が解釈できないときに表示される


# 解決
オブジェクト内の項目を指定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3993509/a8b38a8c-b72a-fe4c-0e90-6f35c7770c81.png)


```react:
const value = {title:"タイトル", time:"1"}

console.log(parseInt(value.time));
```

# 参考
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/NaN
Spring for GraphQLを試してみた

# 経緯
以前からSpringを使用しての案件に携わることが多かったのですが、使用したことがないプロジェクトもあるので、勉強がてら色々と試してみようと思いました。

# GraphQLとは？
この辺が分かりやすく書かれていると思うので、参考にしてください。

https://zenn.dev/gakin/articles/graphql_introduction

### プロジェクト作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949792/d12942da-403c-e4c1-7b4a-014fa6e163d4.png)

ファイル＞新規＞Springスターター・プロジェクト(Spring initializr)を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949792/9c6fe102-c07a-f36d-a13a-f3a8ee0d25f6.png)

この辺はご自身の環境に合わせてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949792/b9427c32-3ff1-dcf5-4201-1ebf4e922c1a.png)

Spring Web、Spring for GraphQLを選択し、完了ボタンを押下します。

### GraphQLスキーマの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949792/985f210f-c629-6c04-90c8-cc0c820f1c58.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949792/54726c17-e1a7-ae82-784a-04abc5058781.png)

schema.graphqls を src/main/resources/graphql フォルダーに追加します。
すべての GraphQL スキーマにはトップレベルの Query 型があり、そのフィールドはアプリケーションによって公開されるクエリ操作です。ここで、スキーマは、特定の本の詳細を返す bookById と呼ばれる 1 つのクエリを定義します。
また、フィールド id、name、pageCount、author を持つ型 Book と、フィールド firstName および lastName を持つ型 Author も定義します。

### データのソース
GraphQL の主な強みは、どこからでもデータを取得できることです。データは、データベース、外部サービス、静的なメモリ内リストから取得できます。
簡素化するために、本と作成者のデータは、それぞれのクラス内の静的リストから取得されます。
Book および Author データソースを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949792/aa61b523-0cab-cb31-e8f0-2f44cc326d87.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949792/5abf5bd8-4b69-dcf4-ea6f-19964a7059b1.png)

### データを取得するためのコードの追加
Spring for GraphQL は、アノテーションベースのプログラミングモデルを提供します。コントローラーのアノテーション付きメソッドを使用して、特定の GraphQL フィールドのデータをフェッチする方法を宣言できます。
Book および Author の横にある、メインアプリケーションパッケージの BookController.java に以下を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949792/e124f1ee-9a77-2cb2-194f-f6b86ec75bdb.png)

@QueryMapping でアノテーションが付けられた bookById という名前のメソッドを定義することにより、このコントローラーは Query 型で定義されているように Book を取得する方法を宣言します。クエリフィールドはメソッド名から決定されますが、アノテーション自体で宣言することもできます。

### GraphiQL プレイグラウンドを有効にする
GraphiQL は、クエリの作成と実行などに役立つビジュアルインターフェースです。この構成を application.properties ファイルに追加して、GraphiQL を有効にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949792/ad36b860-1adb-819b-6de5-5b7a8655552f.png)

### クエリを実行する
Spring アプリケーションを開始し、http://localhost:8080/graphiql に移動します。
クエリを入力し、ウィンドウの上部にある再生ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949792/d86b00fe-9ad1-7fde-be63-d6bc6d357e49.png)

このようなレスポンスが表示されるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949792/242e361f-ccf8-b8c5-e230-b484361b75c7.png)

# 終わりに
今回は試すだけが目的だったので、チュートリアルを実施する形にしましたが、まだまだ奥が深そうでもあるし、実務で利用する際に色々な可能性が見えてきました。今後触れる機会があれば、もっと深くまで学んでいきたいと思います。
配列の値を一つずつ取得して計算したい

# はじめに
オブジェクトを要素に持つ配列の操作でつまったのでまとめてみました。

# 問題
オブジェクトを要素に持つ配列の時間だけを取得して合計時間を出したい。
```react
const records = [
    { title: "タイトル1", time: 1},
    { title: "タイトル2", time: 3},
    { title: "タイトル3", time: 5}
]
```

# 解決方法
reduceを使用する

```react
const answer = records.reduce(
    (accumulator, currentValue) => accumulator + parseInt(currentValue.time), 0
);

```

#### reduce関数とは

```javascript
reduce(callbackFn, initialValue)
```

##### callbackFn
mdnより抜粋
配列の各要素に対して実行される関数。その返値は、次に callbackFn を呼び出す際の accumulator 引数の値になります。最後の呼び出しでは、返値は reduce() の返値となります。この関数は以下の引数で呼び出されます。

```javascript
(accumulator, currentValue) => accumulator + parseInt(currentValue.time), 0
```
accumulator
前回の callbackFn の呼び出し結果の値を格納する。

currentValue
現在の要素の値です。オブジェクトなのでプロパティまで指定する。

##### initialValue
省略可、callbackFnで配列の最初の要素を呼び出す時に指定する初期値

# 参考
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce
[PM] プロジェクト必要資料一覧

# 資料一覧
1. アーキテクチャ図
   - type：drawio
1. 業務要件書
   - type：drawio
1. システム要件書
   - type：drawio
1. 機能一覧
   - type：Excel
1. 画面一覧
   - type：Excel
1. 画面設計書
   - type：Excel
1. テーブル項目定義書
   - type：Excel
1. CRUD図
1. ER図
1. テスト仕様書
   - type：PowerPoint
1. テスト計画書
   - type：PowerPoint
1. 移行計画書
    - type：PowerPoint
1. 移行手順書
   - type：Excel
1. 環境構築手順書
   - type：Excel
1. Coding Guideline
   - type：adoc
1. README
   - type：markdown
   - コンテンツ
       1. 使用するツール一覧
       1. 使用するライブラリ一覧　等

# 概要
```mermaid
 graph LR;
 D1((WebApp01)) --> E1[要件定義]
 E1 --> F1[Architecture]
 E1 --> F2[業務要件書]
 E1 --> F3[システム要件書]
 F1 --> G1[アーキテクチャ図]
 D1 --> E2[設計]
 E2 --> F4[機能一覧]
 E2 --> F5[画面一覧]
 E2 --> F6[画面設計書]
 E2 --> F7[テーブル項目定義書]
 E2 --> F8[CRUD図]
 E2 --> F9[ER図]
 D1 --> E3[Test]
 E3 --> F11[テスト計画書]
 E3 --> F12[テスト仕様書]
```

```mermaid
 graph LR;
 A((Repos)) --> B1[Cording.Guideline.adoc]
 A --> B2[README.md]
```
ReactでLaravelからJsonをもらうときに詰まったところ

## 詰まったエラー
```
localhost/:1 Access to XMLHttpRequest at 'http://localhost/api/' from origin 'http://localhost' has been blocked by CORS policy: The 'Access-Control-Allow-Origin' header contains multiple values 'http://localhost:3000, http://localhost', but only one is allowed.
```
```
localhost/:1 Access to XMLHttpRequest at 'http://localhost/api/' from origin 'http://localhost' has been blocked by CORS policy: Request header field (設定していたheader) is not allowed by Access-Control-Allow-Headers in preflight response
```
```
client:776 [vite] Direct websocket connection fallback. Check out https://vite.dev/config/server-options.html#server-hmr to remove the previous connection error.
```
```
Download the React DevTools for a better development experience: https://react.dev/link/react-devtools
client:755 WebSocket connection to 'ws://localhost/?token=' failed: 
```
などなど

## 試したこと
### React側
`vite.config.js`にhmrを書いてなかったので記載
```
    hmr: {
      host: "localhost",
      port: 3000,
    },
```
`App.jsx`にそもそもheader情報を記載
```
          headers: {
            必要なヘッダー情報を記載
          },
```
### laravel側
nginxの`default.conf`で必要なheader情報を許可
```
add_header Access-Control-Allow-Headers "必要なヘッダー情報";
```
`config/cors.php`にヘッダーを許可
（corsのミドルウエアを作製するみたいなのを書いている記事があり、それを参考に作成してみましたがnginxの`default.conf`と競合するみたいで削除しました。なので元々あったconfigの物だけ修正しています。）
```
    'allowed_origins' => [許可するURL:ポート],→ 配列内の文字列と完全一致するオリジンのみを許可

    'allowed_origins_patterns' => [許可するURL:ポート],→ 正規表現でマッチするオリジンを許可。サブドメインなど柔軟に許可する場合に使用。

    'allowed_headers' => [許可するヘッダー],
```
補足
`'supports_credentials' => true,`これがtrueの時はallowed_headersで['*']が使えないらしい

後はよくわからず`laravel-vite-plugin`を入れてみたらもっとおかしくなった
iCloud写真 on Windows 11で写真同期が保留中現象を対処してみた

Windows 11環境に、iCloud on Windows（バージョン：15.3.138.0）を、Microsoft Storeからインストールして、うまく動かなかった場合（下記のような症状）への対処方法を見つけました。
〈症状１〉写真の同期を設定したが、「アップデート中・・・」のまま更新されない。
〈症状２〉iCloud上の全ての写真より少ない写真の枚数しかPCに同期されない。

対処方法：
・ネットワークの「プロパティ」を開き、左上の「アダプターの設定の変更」を選択し、インストールされているネットワークアダプターの一覧を表示させる。
![network-list.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1272333/d755d884-700e-a255-4095-cb12ab20107f.png)
・上図の環境の場合、「Wi-Fi」がアクティブになっているので、Wi-Fiを右クリックして、プロパティを選択し、「インターネットプロトコルバージョン６（TCP/IPv6）」にチェックが入っていたら、チェックを外します（下図の赤枠）。「OK」で保存します。
![network-property.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1272333/9fb13de7-4675-1278-f9c7-8b1690dde1e9.png)
これで、iCloud写真の同期が開始されるはずです。
プロ並みに複数のAirbnb物件を管理する方法

Airbnbの物件を複数運営することは、大きな収益を生む可能性がありますが、効果的に管理しなければ、運営が複雑になり、負担が増えてしまいます。本記事では、効率的なAirbnb管理の方法を紹介し、収益を最大化するための戦略を解説します。

<h3>一元管理ツールの活用</h3>
複数の物件を管理する場合、予約やメッセージの管理が重要です。一元管理ツールを導入すると、異なる物件のカレンダーやゲストとのやり取りをまとめて管理でき、作業効率が向上します。

例えば、予約管理ソフトを活用することで、ダブルブッキングを防ぎ、ゲストとの円滑なコミュニケーションが可能になります。また、定型メッセージを活用することで、返信の手間を省くこともできます。

<h3>清掃・メンテナンスの最適化</h3>
清掃とメンテナンスは、ゲストの満足度を高めるために欠かせません。清掃スタッフと連携し、チェックアウト後すぐに清掃が完了するようにスケジュールを調整しましょう。また、定期的なメンテナンスを実施し、設備の故障を未然に防ぐことが重要です。

<h2>収益を最大化する価格設定戦略</h2>
<h3>ダイナミックプライシングの導入</h3>
シーズンやイベントによって需要は変動するため、柔軟な価格設定が求められます。ダイナミックプライシングツールを活用すれば、市場の状況に応じて最適な価格を自動的に設定できます。これにより、オフシーズンの空室率を減らし、ピーク時の収益を最大化できます。

<h3>競合分析を活用した価格調整</h3>
同じエリアの競合物件と比較し、適切な価格設定を行いましょう。競合の価格が自分の物件より低い場合、付加価値を高めることで差別化できます。例えば、高速Wi-Fiや無料駐車場の提供など、ゲストにとって魅力的な要素を加えるとよいでしょう。

<h2>高評価を獲得するためのホスピタリティ戦略</h2>
<h3>ゲスト対応の迅速化</h3>
ゲストからの問い合わせにはできるだけ早く対応しましょう。レスポンスの速さはレビューに大きく影響し、予約率の向上につながります。特にチェックインやチェックアウトに関する質問には、事前に詳細な案内を用意することでスムーズな対応が可能になります。

<h3>宿泊体験を向上させる工夫</h3>
ゲストが快適に過ごせるよう、細かい気配りを大切にしましょう。例えば、観光情報やおすすめのレストランリストを用意したり、ウェルカムドリンクを提供したりすることで、好印象を与えられます。また、地域の特産品を部屋に置くと、ゲストにユニークな体験を提供できます。

<h3>プロの管理サービスの活用</h3>
複数の物件を運営する場合、管理の負担が大きくなります。そのため、プロの管理サービスを利用するのも一つの方法です。<a href=https://www.airbnbmanagement.melbourne/>Airbnb Management Melbourne</a> のような専門業者に依頼することで、清掃やゲスト対応などの業務を任せ、自分は戦略的な運営に集中できます。

Airbnbの複数物件を効率的に管理するには、適切なツールを導入し、価格設定やホスピタリティに工夫を凝らすことが大切です。また、プロの管理サービスを活用することで、さらにスムーズな運営が可能になります。適切な管理方法を実践し、Airbnbビジネスを成功させましょう。
T-Displayを３種のライブラリで使ってみる

# 経緯
　アリエクでT-Displayを購入した。800円前後で安いと思ったので。
  ESP32C3に135x240のLCDが付いただけだが、両方を足したよりも安いような。
　社名も型名も書かれて無いから、パチモンじゃ無いかと思うが。
  下図、左端が購入した商品、二番目が広告、三番目が本家。四番目は技適付きの本家。
  パチモンと本家でパターンが同じに見えるが、此処まで真似したのだろうか。
![TD_cmp.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/a157c585-de58-75c5-9263-1578c3cd881a.jpeg)
　◆◆◆　測定器の表示にでも使うかな　◆◆◆
　いや、表示させたら文字が小さいな。

# T-Display運用の共通注意事項
　購入したT-Displayには、操作するとWiFi接続可能とする機能が入っている。
　本機は技適無だから、誤操作する前に書き換えた用が安全だな。
　サンプルでファイルを使う場合、予めDATAファルダの内容をSPIFFS形式で格納しておく必要が有る。
　サンプルプログラムの画像一覧
![td_sample.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/01543d65-a31b-b36e-0513-877fa368785c.jpeg)

　　「[サンプルプログラムの場所(Github)](https://github.com/hi631/T-Display)」

# Arduino_GFXの場合
　初期設定時にピン番号を指定する。
　◇AnimatedGIF_GIFDEC
　　地球が回るGIFアニメーション
　◇Clock
　　シンプルなクロック

# LovyanGFXの場合
　ハード構成をライブラリに登録する。
　LGFX_ESP32C3-TTGO_T-Display.hppを、Arduino\libraries\LovyanGFX\src\lgfx_userに予め格納が必要。
　　※一部はライブラリアップデートでコンパイル不可になってしまった。
　◇ClockSample
　　アナログ・デジタル両様時計
　◇DrawLineThickness
　　なんだかわからない模様、描画が早いと言いたいのだろう。
　◇Graph
　　スクロールする複数本のグラフ
　◇MovingCircles
　　輪が高速で動く。
　◇MovingIcons
　　アイコンが高速で動く。
　◇RotatedZoomSample
　　ぐるぐる回って凝縮される。

# TFT_eSPI
　ディフォルト設定の決め打ちで動作する。
　◇boing_ball
　　丸いボールが跳ねる。
　◇Flash_Jpg_DMA
　　画像（パンダ）が表示される。
　◇SpriteRotatingCube
　　白いキューブが跳ね回る。
　◇SPIFFS_Jpg
　　風景画像が表示される。


# SPIFFSファイルのアップロード
　xxx.inoファイルとdataディレクトリの存在する場所_upload.batを入れ、実行すればアップロードされるが、バッチ内にはファイル名などが固定で書かれている。
　バージョンアップ・各人の環境の違いなどでエラーとなる場合は、下記の格納場所・名称等の変更してくれ。
　　※ファイルは大体元のディレクトリ近辺に存在すると思う。
　◇mkspiffs.exe　ファイルブロック作成
　◇esptool.exe　　転送ファイル本体
　◇COM6　　　　　ポート(各人の環境に合わせる)
　◇0x160000　　　使用パーテーションで決まる(之はdefault.csvの設定)。SPIFFSの大きさ
　◇0x290000　　　　　〃　　　　　　　　　　　　　　　　　　　　　 ESP32上の格納位置
　　※[freewing様](http://www.neko.ne.jp/~freewing/hardware/espressif_esp32_upload_spiffs_command_line/)の記述を参考にしました。

# 感想
　画面が小さいと言う事も有るが、結構ＦＰＳが出るものだ。
　なお、上記記載内容は全て無保証であり、各自の責任においてご利用願います。
Oracleのエディションとライセンスの話

Oracleデータベースのエディションとライセンスについてまとめる。
Oracle Cloud（OCI）はここには含まない。

### 記事の目的
Oracleデータベースの混乱しがちなエディションとライセンスについてざっくりまとめる。

### はじめに
まず、Oracleデータベースには"バージョン"があることを前提としておさえておきたい。
11g ⇒ 12c ⇒ 18c ⇒ 19c ⇒ 21c ⇒ 23aiといった流れでバージョンアップしてきている。
（2025年2月時点）
たんにググっただけだと、Oracleの公式サイトさえ情報が古いことが多く最新の情報を得るのが難しい。
最新かつ網羅的な情報を得るなら、Oracleのサポートサイト（My Oracle Support）を活用したい。
※以下のOracleのページにもそのように記載がある。
https://www.oracle.com/jp/database/database-matrix/#reference
ここでは省略するが、バージョンによってサポート期間や期限が変わるので、採用時には重要な点になる。

### エディション
"バージョンごと"に複数のエディションが存在する。
"バージョンごと"というのが一つポイントで、バージョンによって選択可能なエディションが異なるので注意。
ただし近年は、有償版として「Enterprise Edition」「Standard Edition 2」のどちらか、
無償版の「Express Edition」のいずれかとなる。

かなり古い例にはなるが・・・
11gだと、Enterprise Edition、Standard Edition、Standard Edition One、Personal Editionが選択可能。
12cだと、Enterprise Edition、Standard Edition 2が選択可能。
といったようになる。

エディションの違いとは、簡単に言えば使える機能や制限事項の有無が異なり、それによって価格も違ってくる。

**Enterprise Edition**と**Standard Edition 2**について
・Enterprise Edition　⇒　大規模向け
・Standard Edition 2　⇒　中小規模向け

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15241/f42dc8f8-daba-1df3-1331-1b9c7adb52aa.png)
金額面で言えば、Enterprise Editionの方が高額で、Standard Edition 2の倍以上になる。

### 無償版のExpress Editionは？
このエディションもすべてのバージョンに存在するわけではなく、18cや21cなど一部のバージョンに存在する。
最新の23aiだと「Oracle Database 23ai Free」として存在する。


### ライセンス
エディションとは別にライセンス体系が2通りある。
**・Processor**
　サーバーのプロセッサ数に応じたライセンス体系である。
　ユーザー数が多い場合やユーザー数の特定が出来ない場合に有効。
　エディションによって、コアでのカウントになるかソケットでのカウントになるか違うので注意。
**・Named User Plus（NUP）**
　使用するユーザー（人）数に応じたライセンス体系である。
　ユーザー数が少ない場合に有効。
　こちらもエディションによって、最小数が変わるので注意。
IT系動画おすすめ

## はじめに

皆さん、こんにちは、れんれんです。

唐突ですが、皆さんは普段どのようにITの知識を付けていますか？
本を読んだり、Xで情報収集したり、と様々な手段が挙げられます。

私は集中したいとき以外は音がないと不安な人間で、ずっと動画を付けています。
その中でIT系の動画を見て知識を付けています。
今回は、ほぼ一日中動画を付けている私がおすすめする動画投稿者さんを紹介したいと思います！
ぜひ、見てみて下さい！

１：ゆるコンピュータ科学ラジオ
https://youtube.com/@yurucom?si=Stv5J9YzcEcQ3TyO
![ゆるコンピュータ科学ラジオ - YouTube - www.youtube.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3593749/c58bcfc0-f34f-3f33-4fe0-94fd4e0e7097.png)



2:あずぱん動画
https://youtube.com/@user-ri4nv7di2o?si=VNwNQ3HQmn-9lORb
![あずぱん動画 - YouTube - www.youtube.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3593749/3060c7c3-bddf-ae81-bb5e-60a1fae62ecd.png)



3:【基本情報技術者試験YouTuber】すーさん
https://youtube.com/@kihonzyouhou?si=Xqb6-pr9xJlDMCwD
![【基本情報技術者試験YouTuber】すーさん - YouTube - www.youtube.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3593749/9a35c754-0986-5209-8f4b-711f64c6cd8c.png)

4:仕組みチャンネル
https://youtube.com/@SikumiChannel?si=X7GRL1_N3y-zHQmo
![仕組みチャンネル - YouTube - www.youtube.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3593749/c5463647-da67-5975-9779-7dc56877534e.png)


5:脆弱エンジニアの日常
https://youtube.com/@full-weak-engineer?si=vVDdHSpAmYCqmVHu
![脆弱エンジニアの日常 - YouTube - www.youtube.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3593749/54cbdfb9-8fe3-b29f-943b-de514db946ed.png)


6:まさるの勉強部屋
https://youtube.com/@masaru-study?si=fc0H-4_gsV0alGhB
![まさるの勉強部屋 - YouTube - www.youtube.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3593749/7a078ec5-2c21-91e3-3c11-d1252cc841b6.png)


7:HIROCODE.ヒロコード
https://youtube.com/@hirocode?si=EFEeM1paAh3IzZ_c
![HIROCODE.ヒロコード - YouTube - www.youtube.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3593749/04bbc7f0-2187-c27e-89a7-68e19dc4d0d4.png)


8:SAMURAI ENGINEER [侍エンジニア]
https://youtube.com/@samuraiengineer?si=foVoUVACZDISiUYf
![SAMURAI ENGINEER [侍エンジニア] - YouTube - www.youtube.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3593749/48c4b30e-19ac-2995-246d-fb804e18ea2c.png)



9:ラムダ技術部 
https://youtube.com/@lambdatech?siI=cxnrx4GaXrNxRrk6
![ラムダ技術部 - YouTube - www.youtube.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3593749/70a45e3d-99a8-ca09-c121-9f5351517bc3.png)

## おわり
アドベントカレンダー9日目ということで9つ紹介させていただきました！
皆さんのおすすめの方いらっしゃったら共有してほしいです！
rex0220 計算式プラグイン テーブル行の自動追加・更新その２

[計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)で、テーブル行の自動追加・更新を行う例のその２です。

# 概要

日付または科目の変更時に、テーブル行の追加・更新を行います。
テーブルに該当日付・科目が無い場合は、行追加。ある場合は更新します。
テーブルは、日付’科目順にソートします。

※[rex0220 計算式プラグイン テーブル行の自動追加・更新](https://qiita.com/rex0220/items/6b4fe34d184010c6697b)に科目を追加した例です。

![2025-02-10_17h31_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/a8df0f05-3648-a65a-b4eb-5b718b1ba5c9.png)

# 計算式プラグイン設定

日付と科目をキーにして、該当する行が無ければ行を追加。あれば出欠を更新。

![2025-02-10_17h35_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/64b9c5b1-fa00-d06b-d7db-7eb47b73542a.png)

```.js
OPTION: 循環参照を許可

// 出欠一覧 SUBTABLE (editable)
TABLE_SORT(出欠一覧,
  TPFILTER(AND(日付_一覧,科目_一覧)),
  TPSORT(日付_一覧,科目_一覧)
)

// 計算処理用 SINGLE_LINE_TEXT (hide)
IF(AND(日付,科目),
  LET(
    key, DATE_FORMAT(日付)&":"&科目,
    rno, FIRSTIF((DATE_FORMAT(日付_一覧)&":"&科目_一覧)==key,ROWNO(出欠一覧)),
    IF(rno === "",
      LET(
        row, JSON_S(ARRAY(DIC(
          "日付_一覧",DATE_FORMAT(日付),
          "出欠_一覧",出欠,
          "科目_一覧",科目
        ))),
        FSET_TADD(出欠一覧, row)
      ),
      FSET(出欠_一覧, 出欠, rno)
    )
  )
)```
個人的vimめも。

# はじめに
個人的vimrc設定とか便利機能とか。随時更新。

```.vimrc
" setting
"文字コードをUFT-8に設定
set fenc=utf-8
" バックアップファイルを作らない
set nobackup
" スワップファイルを作らない
set noswapfile
" 編集中のファイルが変更されたら自動で読み直す
set autoread
" バッファが編集中でもその他のファイルを開けるように
set hidden
" 入力中のコマンドをステータスに表示する
set showcmd


" 見た目系
" 行番号を表示
set number
" 現在の行を強調表示
set cursorline
" 現在の行を強調表示（縦）
" 行末の1文字先までカーソルを移動できるように
set virtualedit=onemore
" インデントはスマートインデント
set smartindent
" ビープ音を可視化
set visualbell
" 括弧入力時の対応する括弧を表示
set showmatch
" ステータスラインを常に表示
set laststatus=2
" コマンドラインの補完
set wildmode=list:longest
" 折り返し時に表示行単位での移動できるようにする
nnoremap j gj
nnoremap k gk
" シンタックスハイライトの有効化
syntax enable


" 検索系
" 検索文字列が小文字の場合は大文字小文字を区別なく検索する
set ignorecase
" 検索文字列に大文字が含まれている場合は区別して検索する
set smartcase
" 検索文字列入力時に順次対象文字列にヒットさせる
set incsearch
" 検索時に最後まで行ったら最初に戻る
set wrapscan
" 検索語をハイライト表示
set hlsearch
" ESC連打でハイライト解除
nmap <Esc><Esc> :nohlsearch<CR><Esc>

set undofile

packadd termdebug 
set mouse=a
let g:termdebug_wide = 163

filetype plugin on

"ウィンドウ操作
nnoremap wh <C-w>h
nnoremap wj <C-w>j
nnoremap wk <C-w>k
nnoremap wl <C-w>l

"ウィンドウサイズ変更
nnoremap >> <C-w>>
nnoremap << <C-w><
nnoremap ++ <C-w>+
nnoremap -- <C-w>-

"Netrwをツリー状に
let g:netrw_liststyle = 3
```

# 検索系
例えばcファイルに絞って検索。
```
:vimgrep パターン *.c
```

以下の方が速い。
```
:grep -rnF パターン *.c
```

quickfixで検索結果一覧に飛べるようになる。
```
:copen
```

# Netrw
標準プラグインのファイルエクスプローラー。
以下を.vimrcに追記する。
```
"netrw有効
filetype plugin on
```

ツリー状に表示するにはvimrcに以下を追加する。

```
let g:netrw_liststyle = 3
```

エクスプローラーを開きたいディレクトリで以下実行。
```
vim .
```

o:水平に開く
v:垂直に開く
t:新しいタブで開く

# 参考にさせて頂いた方々
https://qiita.com/iwaseasahi/items/0b2da68269397906c14c

https://qiita.com/morikooooo/items/9fd41bcd8d1ce9170301

https://qiita.com/jintz/items/d357478271179c90ffab#vim%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%AE%E5%B0%8E%E5%85%A5

https://wolfbash.hateblo.jp/entry/2017/08/25/121711

https://qiita.com/hachi8833/items/7beeee825c11f7437f54

https://qiita.com/lighttiger2505/items/bf4755cd912f7272ba60

https://zenn.dev/sa2knight/articles/e0a1b2ee30e9ec22dea9

https://vim.blue/netrw-open-file/

https://qiita.com/r12tkmt/items/1f396ddb4c701b59e1e8

https://qiita.com/r12tkmt/items/97afb4b489966e746b20

https://reisuta.com/register/

https://qiita.com/0829/items/0b3f63798b6910623efc

https://ylgbk.hatenablog.com/entry/2015/02/05/120000

https://zenn.dev/vim_jp/articles/vim_noplugin

https://shotat.hateblo.jp/entry/2016/09/13/014358

https://cohama.hateblo.jp/entry/2013/09/28/220808
mqttx cli の使い方

## Linux にインストール

```bash
curl -LO https://www.emqx.com/zh/downloads/MQTTX/v1.8.0/mqttx-cli-linux-x64
 sudo install ./mqttx-cli-linux-x64 /usr/local/bin/mqttx
 ```

 インストールの確認

 ```text
 $ which mqttx
/usr/local/bin/mqttx
```

バージョンの確認

```text
$ mqttx --version
1.8.0
```

## Subscribe

```bash
mqttx sub -t 'mqttx/cli' -h 'broker.emqx.io' -p 1883
```

## Publish

```bash
mqttx pub -t 'mqttx/cli' -h 'broker.emqx.io' -p 1883 -m 'Good Afternoon Feb/10/2025'
```

## 実行結果

```text
$ mqttx sub -t 'mqttx/cli' -h 'broker.emqx.io' -p 1883
Good Afternoon Feb/10/2025
```
Kindleセール本の取得の仕方

　電子書籍は定期的にセールを行っているがキンドルのセールページが探しづらいので探し方を書いていく。kobo、bookwalker、reader store、booklive、kinoppyなどセールページが充実しているが、アマゾンのページは個別のセールがまとまっていない。

アマゾンのページにはnode番号があり、商品をカテゴリーや分類などに使われている。講談社のキャンペーンページは「22119498051」の数字が振られている。nodeクエリに番号をつけると専用のページに行ける。
```
https://www.amazon.co.jp/b/?node=
https://www.amazon.co.jp/b/?node=22119498051
```
　問題は講談社以外ではセールページが更新されていないのでページが有ってもセールサイトが見つからない。

KADOKAWAのページ

https://www.amazon.co.jp/stores/page/8FE82C0A-7F4B-4F70-8430-32DFE122FE0A?ingress=0&visitId=1b01d67f-f142-4981-91a8-8e005210e8dd

幻冬舎のページ

 https://www.amazon.co.jp/stores/page/1A84BE52-2C1E-4749-A3F7-6992B5CCB581?ingress=0&visitId=0c5ec2ae-6aea-494c-9f70-c2e58838e5dc

どうやってセールサイトを探すかというと、ASINから商品の属しているnode番号を逆引きする。例としてASINの「B0DJV337M1」をProduct Advertising API 5.0 Scratchpadの「GetBrowseNodes」でBrowseNodeIdsのBrowseNodeChildrenで子要素を探索するとセールのnodeが取得できる。node番号は過去のも含むので終了したものが混ざっている。
```
       "ContextFreeName": "翔泳社祭2025",
       "DisplayName": "翔泳社祭2025",
       "Id": "204450042051",
       "IsRoot": false
```
nodeのクエリ番号をつなげたアドレスを見るとセールサイトが取得できる。

https://www.amazon.co.jp/b/?node=204450042051

セール対象の本は他のサイトから検索することになる。

https://books.rakuten.co.jp/event/e-book/camp-bestprice/

https://bookwalker.jp/special/

https://ebookstore.sony.jp/stc/article/top/

https://booklive.jp/index/sale

https://k-kinoppy.jp/sale.html

https://www.amazon.co.jp/hko/deals/?&activeTab=explore_deals

https://qiita.com/99nyorituryo/items/e337e6a75c361521f297
webアプリケーションの仕組み（学習用・備忘録）

## [ Webアプリケーションの仕組み](URL "タイトル")
<h3>WEBアプリケーションとは？</h3>
Webブラウザ上で動くソフトウェア

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3593749/d25713c7-b732-b8d5-c086-b57ffad44c8f.png)
このブラウザで検索した時の裏側はどうなっているか

<h3>ネットワークと２つのコンピュータ</h3>
ブラウザの奥には無数のコンピュータが繋がっている。
光回線やLANケーブルとかで相互に接続し合ってネットワークが出来上がっている。
⇒ネットワークという海が広がっている。

![データベース (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3593749/ba8a287b-4e2b-2315-7ba3-8707cc8fe66e.png)
![uploading...0]()

例えばGoogleからキーワードを検索するとネットワークの海を乗り越えて、Google社のコンピュータにたどり着く。このコンピュータには検索のシステムWebアプリ本体がいる。あと、大量のデータを保有するデータベースがある。そこからユーザーからの要求に答え返している。

⇒Webアプリケーションはネットワークを通してクライアントとサーバーがやり取りしている。
この時、HTTP通信されている。

<h3>Webアプリケーションの仕組み</h3>
検索した時、リクエストが送られる
関連性の高いデータを返す（レスポンス）
この一連の流れから
Webアプリを提供する上で重要な処理はすべてサーバー側で実施される。
このおかげで安価なPCで利用できる！

<h3>サーバーの中はどうなっている？</h3>
リクエストを受け取ってからレスポンスを返すまでに三つのサーバがいる

１Webサーバー　受付嬢みたい　HTTP通信でリクエストをウ受け取りレスポンスを返す。サーバー全体で作ったデータをほいよと渡す
２APサーバー　weｂサーバーが受け取ったリクエストに応じてデータを取得したり計算するといった処理を実行する。
３ＤＢサーバー　Webサービスに必要な情報を保持する

この仕組みをweb三層アプリケーションという

メリット
サーバにかかる負荷が分散するのでアクセス急増のような障害に強くなる
管理メンテナンスが容易になる
変更拡張を行いやすい

デメリット
たくさんのサーバーコンピュータが必要になるため費用が掛かる
🚀 イーロン・マスクの xAI Grok：次世代AIチャットボットが登場！🤖🔥

# 🚀 Grok Chatbot by xAI: インストール＆使い方ガイド 📖✨
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917980/4b3b70e3-dca2-de32-2b66-6483b63991d1.png)

## 🎉 はじめに
GrokはxAIが開発した最先端のAIチャットボット！💡 他のLLM（大規模言語モデル）と比べても、リアルタイムのデータ取得、ウィットに富んだ応答、そして強力なAPI互換性を誇ります。💬✨

今回のガイドでは、
- **Grokの魅力とは？🤔**
- **Grokを使うメリット👍**
- **インストール＆使い方📌**
- **OpenAI/Anthropicからの移行方法🔄**
- **Grok APIの使い方🛠**
- **実装用サンプルコード💻**

を楽しく解説していきます！✨

---

## 🏆 Grokの魅力とは？
Grokは他のAIとはひと味違う！その理由は…

### 🌟 主要な特徴
✅ **リアルタイム情報取得**：X（旧Twitter）と統合され、最新の情報をキャッチ！📡
✅ **ウィットに富んだ会話**：ジョークも交えた楽しい対話ができる🎭
✅ **画像認識もOK！**：`grok-2-vision-1212`モデルなら画像解析もお手のもの📷👀
✅ **高い互換性**：OpenAIやAnthropic SDKからの移行が超簡単🔄

---

## 💡 Grokを使うメリット
🔹 **スムーズな移行**：他のLLMから乗り換えが簡単！
🔹 **コスパが良い💰**：競合よりもお得な価格設定💲
🔹 **REST API対応**：簡単にシステムへ統合可能🔌
🔹 **より深い文脈理解**：長い会話の記憶力が強化された🧠

---

## 🛠 Grokのインストール＆使い方
Grokを使う方法は2つ！

### 🏗 1. 他のLLMプロバイダー（OpenAI/Anthropic）から移行
すでにOpenAIやAnthropicを使っているなら、ほんの数行の変更だけでOK！🎯

#### **🔄 OpenAI SDKからの移行**

```python
from openai import OpenAI

client = OpenAI(
  api_key="YOUR_XAI_API_KEY",
  base_url="https://api.x.ai/v1"
)
```

#### **🔄 Anthropic SDKからの移行**

```python
from anthropic import Anthropic

client = Anthropic(
  api_key="YOUR_XAI_API_KEY",
  base_url="https://api.x.ai"
)
```

モデル名をGrokのものに変更すれば、すぐに使えます！🚀

### 🖥 2. Grok APIを直接使う

#### **✨ APIの準備**
1. **xAI Consoleにサインアップ** [公式サイト](https://x.ai)へGO！🏃💨
2. **APIキーを取得** 🔑
3. **認証ヘッダーを設定**

   ```bash
   Authorization: Bearer YOUR_XAI_API_KEY
   ```

#### **💬 Chatリクエストの実行**

```python
import requests

headers = {
    "Authorization": "Bearer YOUR_XAI_API_KEY",
    "Content-Type": "application/json"
}

payload = {
    "messages": [
        {"role": "system", "content": "あなたはAIアシスタントです。"},
        {"role": "user", "content": "こんにちは！元気？"}
    ],
    "model": "grok-2-latest"
}

response = requests.post("https://api.x.ai/v1/chat/completions", json=payload, headers=headers)

print(response.json())
```

#### **💡 応答例**
```json
{
  "id": "12345",
  "object": "chat.completion",
  "created": 1728646283,
  "model": "grok-2-latest",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "こんにちは！何かお手伝いできることはありますか？"
      },
      "finish_reason": "stop"
    }
  ]
}
```

---

## 🔥 Grokの人気モデル

### 🚀 **1. grok-2-1212**
💨 **速さUP！**
🎯 **高精度な応答**
📚 **長文の理解力向上**

### 🖼 **2. grok-2-vision-1212**
📷 **画像解析対応**
📄 **スクリーンショットや文書もOK！**
🧠 **コンテキスト保持力UP！**

---

## 🎯 まとめ
Grokは、これまでのLLMを超える次世代AIチャットボット！🚀

✅ **ウィットに富んだ楽しい会話** 💬
✅ **リアルタイム情報の取得** 📡
✅ **簡単に移行できる互換性の高さ** 🔄
✅ **画像解析機能まで搭載** 📷

さあ、あなたもGrokを試してみませんか？🌟 [xAI Console](https://x.ai)で今すぐ登録！📝

---

📌 **参考資料**
🔗 [Grok APIドキュメント](https://x.ai/docs)
🔗 [OpenAIからの移行ガイド](https://x.ai/migration-guide)
🔗 [xAIの料金＆モデル](https://x.ai/models-pricing)
学習を記録するアプリにCI/CDを実装してみた

# 使用技術と概要
前回作成したアプリにCI/CDをつけてデータを保持させるようにしました。

【使用技術】
・React
・Vite
・Supabase
・Firebase
・Jest
・react-testing-library
・GithubActions

# やったこと
前回はstateで管理し、フロント部分のみで管理していたので、
リロードをすると削除されてしまうのがアプリっぽくないなと思いました。

そこで、今回はSupabaseでDBを作成してそこにpushしたり、そこかgetできるようにしたり、deleteとかできるようにしました。

デプロイはFirebaseで行い、github actionsを利用してfirebaseへのデプロイとテストコードの稼働をgitへプッシュする際に自動的に行えるようにしました。

あとは追加した機能として、
ある一定の時間を超えるとコメントが変わる機能を実装しました。
特に必要はないのかなって思うんですが、useEffectを独力で実装してみたかったので、やれてよかったなと思います


# 感想
ひたすらに楽しかったし、Reactだと楽だなって思う場面がわかるようになってきた
今回はSupabaseでapiを叩いて、ゴニョゴニョする感じだったけど、
最初は、「何からやるの？」ってなるパターンが多かったなと思いました。
動画を見て、ドキュメントを見たりとかして、
「これってなんでこれをやっているんだっけ」を意識してやるようにしました。

# おわりに
ドキュメントを見て理解することができました。
ただ、今もう一回やれって言われると難しいなって思いました
まだまだ自己研鑽をしていく必要があるので、今回のアプリとかに
色々加えることができたら面白いんじゃないかなって思います。

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

https://projisou.jp
ggplot2; 棒グラフとエラーバーを一気通貫にプロットする

#### エラーバー付き棒グラフを一気に書きたい ####
RT-PCRなどの結果をFigureにするとき、エラーバー付きの棒グラフを書くと思います。
少し調べると、書き方を紹介する記事がいくつか出てきますが、データの平均とSDを、dplyr::summarise()とgroup_by()を使ってまず算出し、その結果をもとにプロットしているもので、二度手間感を感じてしまいました。

#### GPTに聞いた結果 ####
そこでchatGPTに聞いてみると以下のお返事。

まずは、例となるdataframeの準備です。
```
library(ggplot2)
# 仮のデータフレームを作成
set.seed(123)
df <- data.frame(
  group = rep(LETTERS[1:3], each = 10),
  value = c(rnorm(10, mean = 5, sd = 1),
            rnorm(10, mean = 7, sd = 1),
            rnorm(10, mean = 6, sd = 1))
)
```
ここからが本題です。
```
# stat_summary() を利用して直接プロット
ggplot(df, aes(x = group, y = value)) +
  stat_summary(fun = mean, geom = "bar", fill = "lightblue", color = "black") +
  stat_summary(fun.data = mean_se, geom = "errorbar", width = 0.2) +
  theme_minimal()
```

プロットはこちら。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627004/cb83730b-7d9d-2ad8-ce77-899e8bfa2025.png)

私自身、見様見真似でggplot2を使っている分際ですが、```geom_hogehoge()```にくらべて```stat_summary()```には慣れていません。
調べてもあまり日本語での情報が出てきづらいのも一つの原因かもしれません。
```stat_summary()```をもっと使いこなせたら、得なのでしょうね…。
Windows11 + Intel Arc B580でStable Diffusionを動かしたい!

# 前提

**この記事は筆者の備忘録です.**
**Stable Diffusion(SD.Next)が動作する所まで.**

## 環境

### 物理

:::note info

+ **OS: Debian12**
+ **CPU: Ryzen9 7945HX(16c32t)**
+ **MEM: DDR5 5200 ~~64GB~~96GB**
+ **iGPU: Radeon 610M**
+ **dGPU: Intel Arc B580**

:::

### 仮想環境

:::note info

+ **OS: Windows11(24H2)**
+ **CPU Ryzen9 7945HX(4vCPU)**
+ **MEM: 16GB**
+ **iGPU: VirtIO GPU DOD Controller**
+ **dGPU: Intel Arc B580(GPUパススルー)**

:::

## 作業

### 事前作業

+ **Intel GPUの最新版ドライバを仮想マシンにインストールしておきます.**
+ **Intel oneAPI Base Toolkitを仮想マシンに入れておきます.**

### インストール作業

+ **Powershellで外部スクリプトの実行ポリシーを変更します(安全な環境のPCでのみ, この作業をします).**

```powershell
PS c:\Users\<YourUserName>> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process
```

+ **pyenvをインストールします**

```powershell
PS c:\Users\<YourUserName>> Invoke-WebRequest -UseBasicParsing -Uri "https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/pyenv-win/install-pyenv-win.ps1" -OutFile "./install-pyenv-win.ps1"; &"./install-pyenv-win.ps1"
```

+ **Pythonを3.10.6にダウングレードします.**

```powershell
PS c:\Users\<YourUserName>> pyenv install 3.10.6
PS c:\Users\<YourUserName>> pyenv global 3.10.6
```

+ **Stable Diffusion用の仮想環境(venv)を作ります.**

```powershell
PS c:\Users\<YourUserName>> python -m venv venv --clear
PS c:\Users\<YourUserName>> python -m venv venv
```

+ **Intel oneAPI用Pythonモジュールを(必要ない気がするけど)仮想マシンに入れておきます.**
```powershell
PS c:\Users\<YourUserName>> pip install https://github.com/Nuullll/intel-extension-for-pytorch/releases/download/v2.0.110%2Bxpu-master%2Bdll-bundle/torch-2.0.0a0+gite9ebda2-cp310-cp310-win_amd64.whl
PS c:\Users\<YourUserName>> pip install https://github.com/Nuullll/intel-extension-for-pytorch/releases/download/v2.0.110%2Bxpu-master%2Bdll-bundle/torchvision-0.15.2a0+fa99a53-cp310-cp310-win_amd64.whl
PS c:\Users\<YourUserName>> pip install https://github.com/Nuullll/intel-extension-for-pytorch/releases/download/v2.0.110%2Bxpu-master%2Bdll-bundle/intel_extension_for_pytorch-2.0.110+gitc6ea20b-cp310-cp310-win_amd64.whl
```

+ **Stable Diffusion(SD.Next)をインストールします.**

```powershell
PS c:\Users\<YourUserName>> git clone https://github.com/vladmandic/automatic.git
PS c:\Users\<YourUserName>> cd automatic
PS c:\Users\<YourUserName>\automatic> python -m venv venv
```

### 起動を円滑化するためのバッチファイル作成

+ **バッチファイルを作成し, 適当なディレクトリ(例えばデスクトップ)に配置します.**

```SD.Next.bat
cd c:\Users\<YourUserName>\automatic
call .\venv\Scripts\activate
.\webui.bat --use-ipex
```

### 起動

+ **バッチファイルをダブルクリックします.**

### 運用

+ **使用したいモデルをSD.Nextの案内に従ってダウンロードしてください.**
+ **プロンプトは各自後自由に.**

## 感想

:::note info

+ **Intel ArcシリーズでStable Diffusionを動かす方法は, 以前より格段に簡単になっていた.**
+ **比較対象がGeForce GTX TITAN X(Maxwell/12GB)で, しかもCPUも異なるし何なら1年前の話になるので大分不公平ではあるが, 画像1枚を生成する時間が1/4になった(60秒 -> 15秒)一方, 画像の解像度はピクセル数で約4倍(512x512 -> 768x1152)に上げることが出来た.**

:::

:::note warn

+ **起動を円滑化するためのバッチファイル作成にやや手間取った(そのまま素直に実行コマンドを並べただけでは, 実行して直ぐにウィンドウが閉じてしまうので. callすることで閉じられずに実行される).**

:::
【Ruby初心者必見】知らないとヤバい！？ return・break・next の違いをサクッと理解！

# はじめに
株式会社シンシアでは、実務未経験のエンジニアの方や学生エンジニアインターンを採用し一緒に働いています。
※ シンシアにおける働き方の様子はこちら

https://www.wantedly.com/companies/xincere-inc/stories

弊社には年間100人程度の実務未経験の方に応募いただき、技術面接を実施しております。
その時に、Ruby でループ処理やメソッドの中に登場する `return`、`break`、`next`について質問をいただいたので、記事にもまとめておきます。


この記事では、それぞれの違いを簡潔にまとめ、サンプルコードとともに解説していきます。

# return, next, break の違い
## return
`return` は **メソッドやブロックから抜け出す（処理を終わらせる）** ときに使います。

~~~ruby
def greet(name)
  return "Hello, NoName..." if name.empty?

  "Hello, #{name}!"
end

puts greet("")        # => "Hello, NoName..."
puts greet("Taro")   # => "Hello, Taro!"
~~~

- 空文字が与えらた時に処理終了＆値を返す
- それ以外の場合は `"Hello, #{name}!"` が返される

### 注意点
- ループ処理の中で `return` を使うと、**ループだけでなくメソッドごと抜けて** しまいます。

~~~ruby
def method_with_return
  [1, 2, 3, 4, 5].each do |num|
    if num == 3
      return "return が呼ばれたのでメソッドごと抜けます"
    end
    puts "method_with_return: #{num}"
  end
  "ここには到達しません"
end

puts "method_with_return の結果 => #{method_with_return}"

# 実行結果:
# method_with_return: 1
# method_with_return: 2
# method_with_return の結果 => return が呼ばれたのでメソッドごと抜けます
# 4,5も"ここには到達しません"も出力されません。
~~~

## break の使い方
`break` は **現在のループ処理を途中で抜ける** ときに使います。

~~~ruby
numbers = [1, 2, 3, 4, 5]

numbers.each do |num|
  if num == 3
    break  # ここでループそのものを終了
  end
  puts num
end

# 実行結果:
# 1
# 2
~~~

- `num == 3` で `break` が呼び出されると、その瞬間にループ処理自体が終了。  
- `4`, `5` は出力されない。

### 注意点
- `break` に引数を渡すと、**「反復メソッドの戻り値」** となります。

  ~~~ruby
  result = [1, 2, 3].each do |num|
    break "Stopped!" if num == 2
    puts num
  end

  puts result  # => "Stopped!"
  ~~~

- 2 重ループ以上の場合、`break` は **書かれたループを抜けるだけ** なので、深い階層を一気に抜けたいときはフラグ変数や `throw` / `catch` を検討しましょう。

## next の使い方
`next` は **現在のイテレーション（繰り返し回）をスキップ** して、次の繰り返しへ進みたいときに使います。

~~~ruby
numbers = [1, 2, 3, 4, 5]

numbers.each do |num|
  if num == 3
    next  # この回だけ処理をスキップ
  end
  puts num
end

# 実行結果:
# 1
# 2
# 4
# 5
~~~

- `num == 3` のタイミングだけ処理を飛ばし、ループはそのまま続行。

### 注意点
- **中断ではなく「飛ばす」** だけなので、ループ自体は終わらせたくないが、特定条件時の処理だけパスしたいときに使います。

# まとめ
| キーワード | 主な使い所           | 動作                                         | 使われるシーン                                        |
|:-----------|:---------------------|:---------------------------------------------|:------------------------------------------------------|
| **return** | メソッド・ブロック   | メソッド/ブロックの処理を打ち切り値を返す     | メソッドの処理結果を返す、ブロック内の処理を終了する   |
| **break**  | ループ全般           | ループ自体を抜ける                           | 繰り返しを完全に打ち切りたい                         |
| **next**   | ループ全般           | その繰り返し回をスキップし次の繰り返しへ進む | 特定条件のときだけ処理を飛ばし、ループは続行させたい   |

- `return`: メソッドごと抜ける 
- `break`: ループ処理から抜ける  
- `next`: ループ処理の「その回」をスキップする  

# 最後に
return, next, break の違いをまとめましたが、実務でももちろん使うものです。
必ず復習して理解しておくようにしましょう！
array.at() でスマートに配列の要素を取り出そう

# はじめに
ここでは、array.at() を使うメリットや使い方を紹介します。
例えば、JavaScriptで、配列の最後の要素を取りたい時、`array[array.length - 1]` ではなく `at(-1)` を使うことで、コードの可読性を上げられます。

サクッと理解して、よりスマートなコードをかけるようにしましょう！

# 概要
- **ポイント1**: `array.length - 1` を使う代わりに `at(-1)` を使うと、コードが短く読みやすい  
- **ポイント2**: マイナスのインデックス指定ができるので、直感的に「後ろから何番目か」を参照できる  
- **ポイント3**: ES2022（ES13）で追加された新機能

# 内容

## なぜ `at(-1)` がいいのか？

従来、配列の最後の要素を取り出すためには次のように書いていました。

```js
const array = [1, 2, 3, 4, 5];
console.log(array[array.length - 1]); // 5
```
このとき、コードが少し冗長になってしまいますね。

そこでES2022から登場した `Array.prototype.at()` メソッドを使うと、負の整数で後ろから要素を取り出せます。
最後の要素を参照したい場合は `at(-1)` を使いましょう。

```js
const array = [1, 2, 3, 4, 5];
console.log(array.at(-1)); // 5
```

## `at()` メソッドの使い方
`at()` は配列の要素に対して、以下のようにアクセスが可能です。

```js
const array = ['apple', 'banana', 'orange', 'grape'];

console.log(array.at(0));   // 'apple'  (最初の要素)
console.log(array.at(1));   // 'banana' (2番目)
console.log(array.at(-1));  // 'grape'  (最後の要素)
console.log(array.at(-2));  // 'orange' (後ろから2番目)
```

このように、プラスのインデックスで先頭から、マイナスのインデックスで末尾から要素を取得できます。

# まとめ
1. `array[array.length - 1]` よりも `array.at(-1)` のほうが直感的で読みやすい  
2.  他にも `array.at(-2)` などで直感的に「後ろから何番目」を参照できる     

# 最後に
少しの書き方の違いですが、スマートに書けています。
これを機に `array.at()` を活用してみてください！

また、株式会社シンシアでは、実務未経験のエンジニアの方や学生エンジニアインターンを採用し一緒に働いています。
※ シンシアにおける働き方の様子はこちら

https://www.wantedly.com/companies/xincere-inc/stories

弊社には年間100人程度の実務未経験の方に応募いただき、技術面接を実施しております。
もしこの記事が少しでも学びになったと思っていただける方は、ぜひ wantedly のストーリーも読んでみてくださると嬉しいです！
NSD で let’sencrypt の DNS-01チャレンジを自動化する。

# 
proxmox 用に サーバ証明書を 使いたくて chatGPT に いろいろしつもして 自前の DNSサーバ NSD でも できるんじゃね？ って ところまで 来たので 設定に ちゃれんじしてみたら ハルシネーション が 起きてきたことが 判明した。

## TL;DR

簡単には できない。
↓の記事によると 何とかできるようですが、私にはむずかしい
https://hachu.net/security/230228/letsencrypt-dns.html

## なんで DNS-01チャレンジなのか

proxmox は インターネットから アクセスさせないサーバだから
http-01 チャレンジは 使えない 
chatGPTで 質問したら でてきたから

## 手動で ゾーンファイル を 書き換えればできる

自動に しておかないと 90日で、 期限切れになる。
自動化には こだわりたい。

## ハルシネーションの罠

bindの設定を あたかもNSDの設定かのように 回答する
NSDのマニュアルを読むと 言われた 設定は なく
設定してみると エラーになる（当たり前）

## 簡単そうな 別の切り口を提案してくる

ゾーンファイルを修正して reload したら と 簡単そうに いうが SOAレコードの更新まで 意識してくれない 
TTL短くしておけば いいのかなぁ

## 今後の方針

* いまのまま 証明書が 健全じゃないじょうたいのまま 使い続ける
* 自前のルートサーバを 作って proxmox 用に証明書を払い出し、クライアントPCに設定する
* 自動更新が できる DNSツールに 乗り換える
* 自動更新が できる DNSサービスを 借りる

つづく… かな？

さっそく追記↓
## 自動更新が できる DNSツールに 乗り換える
chatGPT に 質問したら bind、Knot DNS、PowerDNS と ３つ あげてきた。
bind は すてたし、 PowerDNS は DBつかうのが いまいちなところにKnot DNS を 使った例が 検索したら 見つかった。

https://eng-blog.iij.ad.jp/archives/14198

証明書を更新するときだけ Knot DNSを 起動する 例が あった。

これ いいかもしれない。でも IPv6 つかってないから IPどうしようか。
DecodeAudioDataをモノラル変換してflacにエンコードしてみた

## 概要

[前回は](https://qiita.com/mbotsu/items/76b9354ce6c3024b7aaa)MP3にエンコードして文字起こしの処理を実施しましたが、「[AmiVoice APIを実行してみた Webページ編](https://acp.amivoice.com/blog/2023-10-26-100257/)」にdecodeAudioDataのモノラル変換処理が書かれているのをみまして、これは使えそうだということでFLACでのデータ受け渡しを試してみました。

## decodeAudioDataのモノラル変換

Whisperの発話データの前処理では「PCM 16kHz 16bit モノラル」に変換が行われます。
mp3をエンコードするときは、劣化対策として「44.1khzをステレオ」で処理してましたが、「PCM 16kHz 16bit モノラル」でかつ、FLACで処理した方が軽いし高音質に決まっているやろと思い至りましたので実現可能性について評価しました。
なので今回は、精度比較は行なっておりません。気が向いた時にやろうと思います。
他にも、「PCM 16kHz 16bit モノラル」をmp3で処理した場合とFLACで処理した場合での違いも気になりますね。

さて、処理方法ですが、[5. 複数チャンネルの音声データをモノラルへ変換](https://acp.amivoice.com/blog/2023-10-26-100257/)に書かれているモノラル変換の通りです。

他にもやり方があると書かれていますが、複数チャンネルをモノラルにまとめる方法を知らなかったので勉強になりました。
「長時間でかつ２チャンネルの音声データ」を扱う時にdecodeAudioDataを単純にひとつの変数に格納しますと、変数から溢れるのでどうするのかと思っていたのでなるほどなぁと思いました。

## flacのエンコード(JS)

JSでのflacのエンコードは、libflacの[example/encode-func.js](https://github.com/mmig/libflac.js/blob/master/example/encode-func.js)を参照して組みこみました。

利用方法は、[package/libflacjs](https://www.npmjs.com/package/libflacjs)にある通り、npmでインストールするか、vanillajsで扱いたい場合は、distのフォルダをローカルに展開して利用します。

```bash
$ curl -LO https://github.com/mmig/libflac.js/archive/refs/tags/5.4.0.tar.gz
$ tar xvzf 5.4.0.tar.gz
$ cp libflac.js-5.4.0/dist/libflac.wasm.* ./js
```

`libflac.min.wasm.js`はwasmが今のブラウザに対応していないのかエラーが出るので`libflac.wasm.js`を利用しました。
※ libflacjsの最終リリースは2020年

exampleは古いお作法で書かれており、例外処理をtry-catchで括って欲しかったり、今風にAsyncで書ける実装にして欲しかったりと思うところは多々ありました。


## flacのデコード(Python)

[Whisper load_audio](https://github.com/openai/whisper/blob/main/whisper/audio.py)のffmpegを利用するやり方でflacは簡単に読み込めます。
幾つかのpythonのオーディオライブラリを試して見たのですが、何故か読み込みに失敗します。
Pythonでバイナリをバラして処理すると遅い（途中まで試してやめた）ので`ffmpeg`を使うのが無難そうです。
思うところは多々ありますが、一応動いてはいるし何処まで調べるかは悩ましいところです。

## サンプルコード

とりあえず動かしたサンプルコードを貼っておきます。適宜修正は必要です。

https://gist.github.com/otmb/8ba8da24fc5b86f17603307d679f2fed
React.jsでスクレイピングする方法

React.jsはフロントエンドのライブラリであるため、スクレイピングを行う際にはCORS（クロスオリジン制約）や適切なデータ取得方法について理解することが重要です。

## React.jsでスクレイピングをする際の問題点

React.jsはフロントエンドの技術なので、通常のバックエンドで行うスクレイピングとは異なり、いくつかの制約があります。

### CORSの制約
ブラウザ上でスクレイピングを行う場合、異なるオリジン（ドメイン）からデータを取得しようとするとCORS制約によりブロックされることがあります。

### Javascriptによるレンダリング
多くのWebサイトは、Javascriptを使ってデータを非同期にロードしているため、単純なfetchではHTMLにデータが含まれていないケースが多いです。

例えば、以下のページが React.js や Vue.js で動的にデータを読み込む場合、普通のHTTPリクエストではデータを取得できません。

```html
<div id="app">
   <p>Loading...</p>
</div>
```

React.jsがデータを読み込んだあと、DOMが変更されてappの中にデータが入ります。しかし、通常のfetchではjavascriptが実行される前の状態しか取得できません。

## 解決策①
CORSの制約を回避するために、バックエンド（サーバー）を用意し、フロントエンド経由でリクエストを送る方法です。

①フロントエンド（React.js）は、自分のサーバー（Node.js/Expressなど）にリクエストを送る
②サーバー側がfetch()やaxiosを使い、外部のwebサイトからデータを取得する
③React.jsはサーバーからのレスポンスを受け取る

⭐️Node.js+Expressのサーバーを作る
```javascript
const express=require('express');
const axios = require("axios");
const cors = require("cors");

const app = express();
const PORT = 3001;

// CORSを許可
app.use(cors());

app.get("/proxy", async (req, res) => {
    try {
        const response = await axios.get("https://example.com/data");
        res.json(response.data);
    } catch (error) {
        res.status(500).json({ error: "データ取得に失敗しました" });
    }
});

app.listen(PORT, () => console.log(`サーバー起動: http://localhost:${PORT}`));

```

⭐️React.js側でデータを取得
```javascript
import { useEffect, useState } from "react";

const Scraper = () => {
  const [data, setData] = useState(null);

  useEffect(() => {
    fetch("http://localhost:3001/proxy")
      .then(response => response.json())
      .then(result => setData(result))
      .catch(error => console.error("Error:", error));
  }, []);

  return (
    <div>
      <h1>スクレイピング結果</h1>
      {data ? <pre>{JSON.stringify(data, null, 2)}</pre> : <p>読み込み中...</p>}
    </div>
  );
};

export default Scraper;
```

### メリット
・CORSの制約を回避することができる（フロントエンドは自分のサーバーを経由するので、外部のサイトには直接アクセスしない）
・Webサイト側がAPIを提供していない場合でもデータを取得することができる

### デメリット
・サーバーをセットアップする必要がある
・サーバーの負荷が増える

## 解決策②：ヘッドレスブラウザ（Puppeteer）を利用する
普通のfetch()では、Javascriptで動的にレンダリングされるページのデータを取得することはできない。そのため、Puppeteerというツールを使用してブラウザを自動操作しながらデータを取得する必要がある。

### Puppeteerとは？
Puppeteerは、Google Chromeをプログラムで自動操作するためのツールです。
・Javascriptで描画されたページでもデータを取得することができる
・ログインが必要なサイトでも操作できる

### Puppeteerでスクレイピングを行う
```javascript
const puppeteer = require("puppeteer");

const scrapeData = async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto("https://example.com");

    const data = await page.evaluate(() => {
        return document.querySelector("h1").innerText;
    });

    await browser.close();
    return data;
};

scrapeData().then(console.log);

```

### メリット
・Javascriptでレンダリングされるページでもデータを取得できる
・フォームの送信やページのスクロールなどブラウザの操作が可能
### デメリット
・axiosやfetch()に比べて動作が重い（ブラウザを起動するため）
・サーバー環境によってはセットアップが必要
ReactでModalを使うと発生したエラーの対処法「TypeError: Cannot read properties of null (reading 'useState')」

# エラー内容
import { Modal, Button } from 'react-bootstrap';
ReactでModalを使うためにこのインポート文を追加した瞬間に，以下のエラーが出ました．

```
Uncaught runtime errors:
ERROR
Cannot read properties of null (reading 'useState')
TypeError: Cannot read properties of null (reading 'useState')
```
どうやらuseStateにnullを読み込もうとしてエラーが起きているそう．でもコードの中でそのような処理はしていないはず．

# 対処法
node_modulesが2つあると発生する場合があるようです．
2つあると，ReactのuseStateなどが意図しない場所から読み込まれる可能性があり，エラーの原因になるようです．

実際の私のディレクトリ構成が以下の通り．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3888054/612ae950-e898-91e5-d6e1-dac3478114e6.png)

一旦動くものを作ろうとして，clientの下と，client/test_appの下と，ルートディレクトリの下と3つ存在していました．何も考えずにnpm installしているのがバレますね．

このWebアプリの場合はtest_appがフロントのメインアプリになります．なので，ルートディレクトリとclientの下にある
・node_modules
・package-lock.json
・package.json
は必要ありません．なので削除してください．

そして
```
cd client/test_app/
npm install
```
で再度インストールしなおせば動きました．
動けばいいやでインストールしまくるのもよくないことが分かりました．
個人的備忘録：自分なりに整理したMarkdownの基本構文と、GitHubやブログでよく使う記法のまとめ

## はじめに

Markdown（マークダウン）は、シンプルな記法で文書を作成できる軽量マークアップ言語です。HTMLを使わずに、直感的に書けるのが特徴で、開発者やライターに広く利用されています。

:::note info
***GitHubのREADMEファイルやブログ記事、ドキュメント作成など、多くの場面で活用されています。***
:::

本記事では、Markdownの基本的な書き方を紹介します。

## 書こうと思ったきっかけ

私自身、プログラミングの学習やドキュメント作成をする中で、Markdownを活用する機会が増えました。

:::note warn
**シンプルな構文で簡単に整った文章が書けるため、とても便利だと感じています。**
:::

しかし、最初は書き方に戸惑うこともあったので、これからMarkdownを使う人の参考になればと思い、まとめてみました。

## Markdown（マークダウン）とは？
Markdownは、シンプルな記法で書ける軽量マークアップ言語です。***HTMLなどのタグを使わずに、直感的に書けるのが特徴で、GitHubやNotion、ブログ記事、READMEファイルなどでよく使われています。***

## Markdownの基本構文

以下に、Markdownの主要な書き方とその実例を紹介します。

### 1. 見出し（Heading）
見出しは `#` を使います。 `#` の数が増えるほど、小さな見出しになります。

```markdown
# 大見出し（H1）
## 中見出し（H2）
### 小見出し（H3）
#### H4
##### H5
###### H6
```

**表示結果**

# 大見出し（H1）
## 中見出し（H2）
### 小見出し（H3）
#### H4
##### H5
###### H6

### 2. 強調（太字・斜体）
テキストを `*` や `_` で囲むことで、太字や斜体にできます。

```markdown
*斜体* または _斜体_
**太字** または __太字__
***太字かつ斜体*** または ___太字かつ斜体___
```

**表示結果**

*斜体* または _斜体_
**太字** または __太字__
***太字かつ斜体*** または ___太字かつ斜体___

### 3. リスト（箇条書き・番号付きリスト）

- 箇条書きリスト（`-` または `*`）
- 番号付きリスト（`1. 2. 3.`）

```markdown
- リスト1
- リスト2
  - サブリスト1
  - サブリスト2

1. 番号付きリスト1
2. 番号付きリスト2
   1. ネストされたリスト
   2. ネストされたリスト
```

**表示結果**

- リスト1
- リスト2
  - サブリスト1
  - サブリスト2

1. 番号付きリスト1
2. 番号付きリスト2
   1. ネストされたリスト
   2. ネストされたリスト

### 4. コードブロック・インラインコード
コードを記述する場合は、バッククォート (`) を使用します。

**インラインコード**

```markdown
`print("Hello, World!")`
```

**表示結果**

`print("Hello, World!")`

**コードブロック（複数行）**

``` で囲むと、コードブロックになります。言語名を指定するとシンタックスハイライトが適用されます。

```markdown
```python
print("Hello, World!")
```

**表示結果**

```python
print("Hello, World!")
```

### 5. リンクと画像

- リンク: `[表示テキスト](URL)`
- 画像: `![代替テキスト](画像URL)`

```markdown
[Google](https://www.google.com)

![GitHub Logo](https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png)
```

### 6. 引用（Blockquote）
`>` を使うと引用ができます。

```markdown
> これは引用です。
>> ネストされた引用も可能です。
```

**表示結果**

> これは引用です。
>> ネストされた引用も可能です。

### 7. チェックボックス（タスクリスト）
GitHubなどで使えるチェックボックスです。

```markdown
- [x] 完了した項目
- [ ] 未完了の項目
```

**表示結果**

- [x] 完了した項目
- [ ] 未完了の項目

### 8. 水平線
`---` または `***` を使うと水平線が作れます。

```markdown
---
```

---

## まとめ

Markdownは、直感的に記述でき、見出しやリスト、コードブロックなどを簡単に表現できる便利な言語です。

:::note info
**特に、GitHubやNotionなどのツールと相性が良く、日常的な文書作成にも活用できます。**
:::

基本的な記法を覚えることで、スムーズに文章を整理し、読みやすいドキュメントを作成できるようになります。
GitHubにプッシュした後にコミットメッセージを修正する方法

GitHubにプッシュした後、メッセージに誤りがあることに気づきました！

正：ver.1.2
誤：ver.1.3

正しいコミットメッセージに修正する場合、
以下のコマンドを実行する！
直前のコミットメッセージを修正できます！

``` 
git commit --amend -m "修正後のコミットメッセージ"
git push --force-with-lease
```

force-with-lease は リモートの変更が他の人によって更新されていないことを確認してから強制プッシュする安全な方法です。

チーム開発中の場合、他の人と作業が競合しないか注意！