OmniAICreator/Qiita-1.07M huggingface dataset:
【大嶋淑之・新潟県】映像でバグ修正？データが語る動画改善術

皆さん、こんにちは！新潟でフリーランスの動画クリエイターをしている大嶋淑之です。いつもは企業のプロモーションやYouTube動画を作っていますが、今日はQiitaのエンジニアの皆さんに、ちょっと違った視点から「動画」の面白さをお伝えしたいと思います。

突然ですが、皆さん、プログラムの「バグ」ってどうやって見つけますか？エラーログを追ったり、デバッグツールを使ったりしますよね。実は、僕たち動画クリエイターも、作った動画を「デバッグ」するような感覚で、データと向き合いながら「伝わる」映像を追求しているんです。

「視聴維持率」は最高のバグトラッカー
僕が動画を制作し、YouTubeなどにアップロードした後、必ずチェックするデータがあります。それが**「視聴維持率」**。これは、動画がどのくらいの間、視聴者に見られ続けているかを示すデータです。

この視聴維持率のグラフを見ると、まるでプログラムのエラーログのように、視聴者が「離脱」したポイントが視覚的にわかるんです。

「あれ？ここのシーンでガクッと視聴率が落ちてるぞ？」
「なんでだろう？BGMが悪かった？テロップの文字が多すぎた？それとも話が長すぎた？」

こんな風に、視聴維持率のグラフは、動画の「バグ」を教えてくれる最高のトラッカーなんです。僕らはこのデータを見て、「どうすれば視聴者が飽きずに見続けてくれるか」という改善点を洗い出します。

A/Bテストで「伝わる」を最適化
Qiitaユーザーの皆さんなら、A/Bテストの重要性はご存知ですよね？僕も同じように、動画制作において**「A/Bテスト的な思考」**を常に意識しています。

例えば、YouTubeのサムネイル画像。サムネイル一つでクリック率が大きく変わるため、デザインや文言を変えた複数のパターンを用意し、どれが最も効果的かを見極めます。これも、一種のA/Bテスト。

動画本編でも、同じメッセージを伝えるのに、演出Aと演出B、どちらがより視聴者に響くかを検証することがあります。特に、**「この商品、本当に魅力が伝わるか？」**という問いに対しては、複数のアプローチを試して、視聴者の反応をデータで確認することが重要になります。

まさに、コードを書いてはテストし、改善を繰り返すエンジニアの皆さんと、同じようなPDCAサイクルを回しているんです。

動画データは「ユーザー行動」の宝庫
視聴維持率だけでなく、視聴者の年齢層や性別、どこから流入してきたか、どんなキーワードで検索されたかなど、動画から得られるデータは多岐にわたります。

これらのデータは、まるでWebサイトのアクセス解析のように、**「ユーザーが動画をどう消費しているか」「どんな情報に興味があるか」**という貴重なインサイトを与えてくれます。

新潟の企業のプロモーション動画を作る際も、こうしたデータを分析することで、ターゲット層に最も響くストーリーテリングや演出を提案できるようになります。データに基づいた動画制作は、まさに「感覚」と「ロジック」の融合なんです。

映像制作は、究極の「課題解決」
僕が動画クリエイターとして一番やりがいを感じるのは、お客様の「伝えたい」という課題に対して、データと経験に基づいた最適な「映像ソリューション」を提供できること。

もし、皆さんの会社で「動画で成果を出したいけど、どうすればいいか分からない」という課題があったら、ぜひ一度お声がけください。僕が、エンジニアの皆さんのようにロジカルに、そしてクリエイティブに、その課題を解決するお手伝いをさせていただきます。
Quest3のトリガーのタッチセンサーが触ってても離してる判定になる症状を直した話

## 結論
静電容量センサーのセンサー部と基盤をつなぐ部分の導通が不安定だった、あるいは静電容量センサーのための金属板がゆるく設置されていた

## 必要なもの
1. T5星型ドライバー
2. こじ開けるためのマイナスドライバー
3. ティッシュ1枚

## 注意
こじ開ける部分があるのでどうしても傷がつくのと、接着剤で止まっているところを剥がすので剥がれやすくなります。
**破損や故障する可能性があります。すべて自己責任でお願いします。**

## 1.分解してセンサー部にたどり着く
https://youtu.be/EYa9UeDJvmM?si=m4PeJ_kFszjIVLuS
https://youtu.be/MRypbjnsmJI?si=86Gik_RF1xzH8n-9(補助で参考にしてください)

上の1個目の動画を見ながら、10:18辺りまで分解してください(9:29の黒い帯状のケーブルは外さなくていいです)
トリガーが基盤についたままのところ以外は下の写真の様になったはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593203/431c4c9f-266a-4adc-869e-c6c423262c07.png)
#### トリガー部分を外す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593203/dd28d51f-6735-49b9-b18d-958127cd610a.png)
(https://youtu.be/MRypbjnsmJI?si=86Gik_RF1xzH8n-9 より)
上画像の赤線の部分をドライバーか何かで押して軸を抜いてください

## 2.センサーとバネの接点についているグリスを拭き取る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593203/014c3dca-bc86-43d4-8bce-7529847e6400.png)
上の画像の中央のネジを外すと、バネと金属板が出てくるので、バネの両端とそれらが接触している金属板の部分についているグリスを拭き取ります(このバネがメイン基盤と金属板を電気的につなぐ役割も担っています)
ここにはグリスが元々ついてない可能性もありますが、不具合があるコントローラーはついているのではないかなと思います。

## 3.金属板と押さえの間にティッシュを挟んで、金属板をより表面に押さえつける
ティッシュを適当な大きさにちぎって(5*5センチくらいでいいかなと思います)画像のように設置します。
組み立てる時、金属板とバネの間にティッシュが挟まらないようにしてください。
これをする理由ですが、このスレッド(https://www.reddit.com/r/oculus/comments/1ayfgne/comment/ldjzy5e/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button )に、金属板がゆるく固定されているから問題が発生する、とあるからです。これとグリスのどちらが原因かは、何回も分解したくないので検証しません。
![DSC_0237.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593203/f9930166-5f42-4a0f-92f8-47a3a44182e5.jpeg)

## 4.組み立てる
頑張ってください。


## 5.所感
なぜハードウェアの問題だと思ったかですが、センサーがバグったときに机にぶつけると直ることがよくあったからです。
まさかグリスでベタベタのバネに導線としての役割も持たせているとは思わなかったので分解したときは驚きました。コスト削減のための工夫だとは思いますが、これではまたグリスが移動してきてしまう可能性があります。(あるいは最初からついていた？)Metaさんもう少し設計しっかりして…
MCPを体験するだけ

# はじめに

この記事は、MCPって何？という方が、初めの一歩を踏み出してみるための記事です。
[公式のチュートリアル](https://modelcontextprotocol.io/quickstart/user#why-claude-for-desktop-and-not-claude-ai)に従って、ファイルシステムMCPサーバーを体験します。

# 1. Claude for Desktopをインストール

[https://claude.ai/download](https://claude.ai/download)で、Claude for Desktopをダウンロードして、インストールします。

# 2. ファイルシステムMCPサーバーを追加する

まず、コンピュータでClaudeメニューを開き、「設定...」を選択します。これらは、アプリウィンドウ自体にある、アカウント設定ではないことに注意して下さい。

Macでは、次のようになります。

![](https://storage.googleapis.com/zenn-user-upload/2cdadb5dc519-20250613.png)

設定パネルの左側のバーにある、「開発者」をクリックし、「構成を編集」をクリックします。

![](https://storage.googleapis.com/zenn-user-upload/dc8047e2fc33-20250613.png)

これにより、次の場所に構成ファイルが追加されます。

- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`

任意のテキストエディタで設定ファイルを開き、ファイルの内容を以下の内容に置き換えます。

**macOS/Linux**

```json
{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "C:\\Users\\username\\Desktop",
        "C:\\Users\\username\\Downloads"
      ]
    }
  }
}
```

**Windows**

```json
{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "C:\\Users\\username\\Desktop",
        "C:\\Users\\username\\Downloads"
      ]
    }
  }
}
```

`username`を、コンピュータのユーザー名に置き換えて下さい。

このツールを正しく実行するには、コンピュータにNOde.jsがインストールされている必要があります。

コマンドラインで、以下のマンドを入力して、Nodeがインストールされていることを確認します。

```sh
node --version
```

インストールされていない場合は、[https://nodejs.org/ja](https://nodejs.org/ja)から、Nodeをダウンロードして下さい。

# 3. Claudeを再起動する

設定ファイルを更新した後、Claude for Desktopを再起動する必要があります。

再起動すると、入力ボックスの左下隅にスライダーアイコンが表示されます。

![](https://storage.googleapis.com/zenn-user-upload/a54cca91d910-20250613.png)

# 4. 試してみる

**me**: ダウンロードフォルダにある、ファイルを解説して下さい

**Claude**: 

ダウンロードフォルダの内容を確認してみますね。ダウンロードフォルダには以下のファイルがあります：

1. **.DS_Store** - macOSが自動的に作成するシステムファイルです。フォルダーの表示設定やアイコンの位置などの情報を保存しています。通常は非表示ファイルで、ユーザーが直接操作する必要はありません。

2. **.localized** - これもmacOSのシステムファイルで、フォルダー名の多言語対応に使用されます。「ダウンロード」フォルダーが各言語で適切に表示されるために存在します。

3. **Claude.dmg** - これはmacOS用のディスクイメージファイルです。おそらくClaudeアプリケーションのインストーラーファイルだと思われます。.dmgファイルをダブルクリックするとマウントされ、中に含まれているアプリケーションやファイルにアクセスできます。

現在のフォルダには主にシステムファイルと1つのアプリケーションインストーラーが含まれているようですね。Claude.dmgファイルについてより詳細な情報が必要でしたら、ファイルの詳細情報を確認することもできます。

# 最後に

MCPを触ってみるまでのハードルは高かったですが、実際に触ってみると、とても便利なものだとわかります。
従来は、普遍的な知識の提供しかできませんでしたが、MCPの登場によって、各人のコンテキストを載せることができるようになったということです。
【Databricks新機能】サーバーレスPostgres "LakeBase"についてまとめてみた

# はじめに
こんにちは！**株式会社マクニカ**でDatabricksのセールスエンジニアをしています。t-asukiです。
[Databricksとは？（マクニカ紹介ページ）](https://www.macnica.co.jp/business/dx/manufacturers/databricks/)

[**DATA+AI SUMMIT 2025**](https://www.databricks.com/dataaisummit) 盛り上がっていますね！
私は現地参加できませんでしたが、バーチャル参加して気になる機能について紹介していこうと思っています。

KeyNote day1の中で、**LakeBase** のリリースが発表されました。

この LakeBase は **Databricks が Neon を買収** し、その機能を Databricks に組み込みローンチした機能になります。

この LakeBase について、簡単にご紹介していきたいと思います。

[Databricks公式ページ（What is a LakeBase?）](https://www.databricks.com/blog/what-is-a-lakebase)

---

# コスト効率の向上

LakeBase は簡単に言うと、**サーバーレスの Postgres（OLTP）データベース** を提供するサービスになります。

LakeBase の大きな特長は **ストレージとコンピューティングの分離** にあり、それぞれを独立に拡張することができます。

これにより：

- インスタンスの常時起動と容量確保が不要
- アイドル時には課金を抑えことが可能  

そのため、**開発・検証環境** や **断続的な負荷のワークロード** において、**コストを大幅に削減**できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4112227/a3d892cc-ba8b-46a1-9f0a-eab8634e0662.png)


---

# データ運用とガバナンス

Databricks が元々持っていた機能と組み合わさることで：

- Lakehouse環境とのデータ相互移動が容易になり、シームレスに運用レイヤーと分析レイヤーをつなげられる
- mlflowを使ったLLM/AI Agent開発へのシームレスなつなぎこみが可能
- 統一したデータガバナンス
など

ユーザーは**複雑な運用から解放**され、**サイロ化した環境**を整えることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4112227/064f4990-1a18-4230-b80d-1259c4c6e051.png)


---

# 開発ライフサイクルの高度化

LakeBase は **Git のようにデータのブランチを作成** することが可能であり、ソフトウェア**開発ライフサイクルをより円滑に**進めることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4112227/05b4885d-3df6-4761-93b5-6f0a25ece96b.png)


またLakeBaseは以下のような特長を持っており、今後到来する **AI Agent による開発** に向けても最適なツールと言えると思います。

- 高速なプロビジョニングで即座に環境を構築
- 人気なOSSであるPostgresを利用しており、LLMとの相性が良い

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4112227/8c0d8f50-77d6-473e-b7ed-8e683bd20549.png)


---

# さいごに

次世代の OLTP データベースとして、とても魅力的に感じました！

**Neon の持っていた高速プロビジョニングによるサーバーレス Postgres** と、**Databricks の持っていたレイクハウスやデータガバナンス機能** がうまく組み合わさっており、**非常に良いリリース** のように個人的には思っています。
AIで失われるもの

## トトロを夢中になって探したことはあるか

　今から20年ほど昔の話だ。テーブルとテレビしかない質素な部屋に少年が一人、釘付けになってテレビを見ていた。映っているのは、スタジオジブリ作品「となりのトトロ」。少年は心を弾ませ、眠っていた何かが沸き起こる、そんな気持ちの高ぶりを感じていた。こんな生き物がいるのか、あのおなかの感触が気になる、しがみつけば空だって飛べそう。そうだ、会いに行こう。メイちゃんのように、おばけが存在していたというビックニュースを学校で上げたい。こうなった少年を止めることはできない。好奇心絶賛、爆発中なのだ。家を飛び出し、トトロを探してくるという世迷言をいう少年に、母親は虫よけスプレーを渡した。
 
　小さい脳をめぐらした少年は、家の近くにある森へと向かった。そこは少年にとって木々が生い茂り、虫が飛び交う秘境の地だった。トトロはここにいるに違いない。背筋が伸び、歩みの早い少年はそんな無根拠な自信でいっぱいだ。森に入る陽光はまぶしく、木々たちは輝いて見える。夏の暑さに汗を流しても、少年がへこたれることはない。広大な森を探しつくすのには、時間がかかるのだ、えっへん。肩に止まり、一休みしているトンボに目もくれず、少年は進み続ける。やれやれもう諦めればいいのにと、トンボの声は少年の耳には届かない。とうとう日が暮れるまで大きな背中を求め、歩み続けたのであった。夕焼けがあたり一面を暗くし、風は強さを増してきた。自然の狂気を感じる。おっと言い忘れていた、少年は逢魔が時が苦手なのだ。暗いからだって？いいや違う。門限を守れなかった時の母親の怖さときたら、あれを本当の逢魔と呼ぶのだろう。今日は諦めて、明日は別の小道に行ってみよう。帰路に着く少年の足取りは軽い。
- - - 
　時は過ぎ、青年は立派(ホント？)な社会人になっていた。どうやらITの会社に就職したようだ。坊主頭の面影が残る青年のスーツ姿ときたら、似合わないにもほどがある。今はお世話になっている上司とお話し中だ。青年は言う。「研修で社内AIを多用していると、本当に利便性が高く、多大な恩恵を受けました。具体的には、Webと連携させた表計算ソフトに、ワンクリックで意味のある表を作るというGASを書きました。勿論、AIなしには作り上げることはできません。わからないことはとりあえず生成AIに投げます。情報量がすごいから。答えを地道に探すことなんてもうできませんよ。」
 
　ここ数年のAIの発展は目覚ましい。迅速に正しい情報を享受できるだなんて、少年はおろか周りの大人たちだって想像していなかっただろう。だってソースコードまで書けてしまうのだ、その価値を否定できまい。更に発展していくAIの技術を使うべく、青年はこれからもリテラシーを上げていくつもりのようだ。簡単に答えを知ることができるなんて便利な世の中になったものだ。
- - -
#### 本当にそうだろうか
　地平線の彼方を探しても、宝島がないことを青年は知ってしまった。好奇心と想像力の解放は少年たちの特権であったはずだ。非現実的な夢を追いかけることは間違っているのだろうか。利便性に憑りつかれ、トトロが見えなくなった大人たちに問いたい。

　トトロはどこにいるのかと青年はAIに聞いてみた。
　“架空の存在です”
　AIは何でも知っている。
 
　けれども、青年は何か大切なものをなくしたように見える。
 　それが何かをAIは知らない。
Data + AI Summit 2025-セッションレポート Summit Live: 業界トップ企業のDatabricks活用ユースケース事例

# はじめに
本記事は<b>Data + AI Summit 2025</b>のSummit Liveセッションで紹介された
各業界のDatabricks活用ユースケース事例をまとめたものになります。
※　セッションタイトル <b>「Summit Live: Industry-by-Industry - Customers, Solution Accelerators, and Use Cases Across Popular Industries」</b>


## セッション概要
このライブセッションでは、金融、医療、広告、サイバーセキュリティ、エネルギーなど、様々な業界のリーダーたちがDatabricksとAIの活用事例が紹介されました。

全体を通じて、「データの統合・ガバナンス・インテリジェンスの注入・知見の共有」といった共通テーマが浮き彫りになりました。
## 金融：RBC Capital Markets — DatabricksでのAI戦略全社展開
**登壇者**：Bobby Grubert氏（RBC Capital Markets AI & デジタルイノベーション責任者）

### 活用事例
- **AIモデルの学習・推論基盤としてDatabricksを活用**。
- AIエージェント「Aiden」開発・運用において、Databricksのスケーラブルな処理基盤とMLパイプライン機能を使用。
- データ統合・クレンジング・特徴量生成・推論・モニタリングまでをDatabricks上で一貫管理。

### 成果
- AIの社内展開（現在5,000人規模）を迅速に実施。
- 決算データ要約AI「QuickTakes」により分析時間を60%短縮。

---

## 広告：Integral Ad Science — Databricksによるデータメッシュ基盤構築とAI分析
**登壇者**：Bala RajagoPal氏（Integral Ad Science エンジニアチームマネジメント責任者）

### 活用事例
- **データメッシュアーキテクチャのコアプラットフォームとしてDatabricksを採用**。
- 各ドメインチームが自律的にデータを管理しつつ、メタデータ駆動でガバナンスを実現。
- MLモデルのリアルタイム適用、ストリーミングデータ処理、自然言語による分析にDatabricksを使用。

### 成果
- ダッシュボードに頼らず、**生成AIによる会話型データ分析環境**を構築。
- 広告主や代理店の意思決定スピードが大幅に向上。

---

## サイバーセキュリティ：Arctic Wolf — Databricks × LLMによるSOCの自動化と信頼性向上
**登壇者**：Michael MyIrea氏（Arctic Wolf AIフェロー・アーキテクト）

### 活用事例
- **膨大なセキュリティイベントログ（週8兆件）の取り込み・前処理にDatabricksを利用**。
- LLM評価フレームワーク「Mosaic LLM Judge」をDatabricks上で運用し、F1スコア管理や説明性のあるAIを構築。
- **AIエージェントのトレーサビリティと精度検証にDatabricksが中核**。

### 成果
- 人間と同等以上の精度で異常検出を実現。
- 高保証環境でも適用可能なAI運用体制を確立。

---

## エネルギー・製造：NOV — DatabricksでIoT×AIの現場実装を推進
**登壇者**：Even Skov-Skov（NOV 技術実装マネージャー）

### 活用事例
- **掘削機器に設置したセンサーから収集されるIoTデータをDatabricks上で集約・分析**。
- 動画・音声などのマルチモーダルデータ処理もDatabricksで一元管理。
- Edge-to-Cloudアーキテクチャのクラウド処理基盤として活用。

### 成果
- 異常検知、設備寿命予測、遠隔地での無人運用を実現。
- SCADA連携で食品業界など非エネルギー分野にも展開。

---

## 総括：Databricksが実現するAI活用の共通パターン

| 活用フェーズ             | 内容                                                                 |
|--------------------------|----------------------------------------------------------------------|
| データ統合               | マルチソース（IoT、ログ、業務データ）をDelta Lakeで統合             |
| モデル構築               | ノートブック・AutoML・MLflowによるスムーズなML開発                   |
| モデル適用と監視         | リアルタイムストリーミング、スケーラブルな推論、Mosaic LLM評価など  |
| エンドユーザーとの接続   | SQL・BI・AIチャットによる利用部門への直接提供                         |

> 💡 **ポイント**：Databricksは、データ活用の上流から下流までを一貫してサポートし、業界別の課題に合わせたスケーラビリティと柔軟性を提供しています。


# 終わりに

ナレッジコミュニケーションでは、Databricks Data + AI Summit 2025 開催にあわせてセッションレポートや、イベント情報を公開しております！

ぜひナレッジコミュニケーションDAIS2025 特設サイトからチェックしてみてください！

https://www.knowledgecommunication.jp/product/databricks-data-ai-summit-2025.html
カスタムフォントを適用【SwiftUI】

間違いや、改善などあればコメントいただけると幸いです。
## 環境
macOS - Sequoia 15.4.1
Xcode - vVersion 16.0

## 実装して発生したエラー
```
Multiple commands produce・・・/PracticeProject.app/Info.plist'
```
このエラーは、Info.plistがプロジェクト内で複数の場所から参照され、ビルド時に競合しているために発生
### 解決方法
プロジェクトファイル→BuildPhases→Copy Bundle ResourcesのInfo.plistを削除
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760972/6b9185b4-ada2-4faf-9346-29d56b2fb6c2.png" width=50%>

[参考](https://qiita.com/121a/items/b0b5ee053059e199bef4)


# やり方
### ①フォントファイルを用意
1-1　[ここ](https://fontmeme.com/jfont/free-fonts/1/)から、適用させる字体を選ぶ
　　今回はこれ↓
　 　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760972/1a1a86fa-acae-4d53-bbd2-0ac6e0a4b979.png" width=50%>

1-2　ダウンロードボタンを押下
1-3　Finderでダウンロードしたzipファイルを解凍
1-4　(今回は).ttfファイル（もしくわ.otf）を見つける

### ②ドラッグ&ドロップ
2-1　Xcodeの任意のファイルにダウンロードした.ttfファイルをドラッグ&ドロップ❶
2-2　Copy files・・・を選択、Targetsを選択→Finishを押下❷

❶
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760972/d73519cb-ddd1-46a6-8eec-62125499fc89.png" width=50%>
❷
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760972/ad6258f3-ebd0-4072-ab4c-edecceb16e42.png" width=50%>

### ③Info.plistの設定
3-1　プロジェクトファイル→TARGETS→Info→Custom ios Targets Properties
3-2　右クリックでAdd Rowを押下
3-3　Fonts provided by applicationを追加
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760972/f05ed0d6-e660-4054-8320-f981949238ff.png" width=50%>
3-4　Item0にドラッグ&ドロップしたファイル名を入力（.ttfまで入力！！！）
![スクリーンショット 2025-06-13 9.51.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760972/a98ea2c9-e86c-470f-9cd3-58494ff0b8c2.png)

### ④実装
4-1　フォントの名前を入力
```diff_ruby
Text("Hello, World!")
    .font(.custom("Praegefest", size: 20))
```
### 完了！
![スクリーンショット 2025-06-13 9.58.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760972/6a4a0b9e-4115-41e5-bf53-98aa178926e4.png)

# カスタムフォントサイト
https://fontmeme.com/jfont/free-fonts/1/

https://goodfreefonts.com/category/kanji-font/page/2/#google_vignette

https://sankoufont.com/tag/kanji-free-font/

https://fontfree.me/tag/%E6%BC%A2%E5%AD%97
Poetry × pyenv × direnv で Python プロジェクト環境を自動化する最強セットアップ

Python 開発において、以下のような課題を感じたことはありませんか？

* プロジェクトごとに異なる Python バージョンを使いたい
* 仮想環境を毎回手動で有効化するのが面倒
* `poetry run` を毎回つけるのが煩わしい

これらを一気に解決してくれるのが次の3つのツールです：

### ✅ pyenv

複数の Python バージョンをインストール・切り替えできるツール。
プロジェクトごとに `.python-version` を使ってバージョン固定可能。

### ✅ Poetry

Python のパッケージ管理・ビルド・仮想環境管理を統合したモダンなツール。
依存関係を `pyproject.toml` で管理し、安定した開発環境を再現できる。

### ✅ direnv

プロジェクトに入るだけで `.envrc` に書かれた設定を自動で実行してくれる環境ツール。
仮想環境の自動 `activate` に最適。

---

Python プロジェクトで複数バージョンの管理、仮想環境の分離、依存の整合性などを手動でやるのは地味に面倒ですよね。この記事では、Poetry・pyenv・direnv の3つを組み合わせて、**「プロジェクトに入るだけで」環境が完全に整う仕組み**を構築する手順を解説します。

---

## 🎯 この記事で目指すこと

プロジェクトディレクトリに入っただけで...

* 指定した **Python バージョン** に自動で切り替わる（`pyenv`）
* Poetry の **仮想環境が自動で有効化される**（`direnv`）
* `.venv` が使われていても問題なく連携される

開発者が手作業で `source` したり `poetry run` を付けたりする必要をなくします。

---

## Step 1: pyenv の導入と Python のインストール

```bash
brew install pyenv
pyenv install 3.10.14
```

プロジェクトに合わせた Python バージョンを pyenv 経由でインストールしておきましょう。

---

## Step 2: Poetry の設定（仮想環境をローカルに）

Poetry が `.venv/` をプロジェクト直下に作ってくれるように設定します。

```bash
poetry config virtualenvs.in-project true
```

---

## Step 3: direnv の導入とシェル設定

```bash
brew install direnv
```

シェル（zsh想定）に hook を追加します。

```bash
echo 'eval "$(direnv hook zsh)"' >> ~/.zshrc
source ~/.zshrc
```

---

## Step 4: `.envrc` を作って自動で仮想環境を activate

以下の内容で `.envrc` を作成します：

```bash
echo 'source $(poetry env info --path)/bin/activate' > .envrc
direnv allow
```

これにより、ディレクトリに入るたびに自動で Poetry の仮想環境が有効化されます。

---

## Step 5: `.python-version` を指定（pyenv にも教える）

```bash
echo "3.10.14" > .python-version
```

これで `cd` したときに pyenv が自動で Python 3.10.14 を選択してくれます。

---

## ディレクトリ構成イメージ

```
my-project/
├── .python-version         # pyenv 用
├── .envrc                  # direnv が読む
├── pyproject.toml          # Poetry 管理ファイル
├── poetry.lock
├── .venv/                  # Poetry の仮想環境（自動生成）
└── src/ ...
```

---

## `.envrc` を Git に含めない場合

```bash
echo .envrc >> .gitignore
```

開発者個人の環境依存ファイルなので、Git 管理から外しておくのが無難です。

---

## まとめ：3ツールの役割とメリット

| ツール        | 役割               | メリット                   |
| ---------- | ---------------- | ---------------------- |
| **pyenv**  | Python バージョン切り替え | プロジェクトごとにバージョンを固定できる   |
| **Poetry** | 依存・仮想環境の管理       | lock ファイルによる再現性の高い環境構築 |
| **direnv** | 自動 `activate`    | 手動操作なしで環境が整う快適な開発体験    |

---

## VSCode などと連携したい方へ

VSCode の Python インタプリタを `.venv/bin/python` に設定すれば、補完・デバッグ・実行すべてが Poetry 環境で動きます。

必要であればその設定方法も別記事で解説します。気になる方はコメントください！

----
※この記事はGenAIを使って書いております。
【Python初心者】よく使う文字列操作の基本メソッドまとめ

Pythonの文字列（`str` 型）には、便利なメソッドがたくさんあります。  
**基本的な文字列操作メソッド**を中心に、自分の学習のためにまとめてみました。


## 分割・結合

### メソッド一覧

| メソッド名 | 説明 |
|------------|------|
| `split()`  | 区切り文字で分割してリスト化 |
| `join()`   | リストを文字列として結合 |

### 使用例

```python
text = "apple,banana,orange"
result = text.split(",")
print(result)  # ['apple', 'banana', 'orange']

items = ['apple', 'banana', 'orange']
result = ",".join(items)
print(result)  # apple,banana,orange
```

---
## 置換・整形

### メソッド一覧

| メソッド名 | 説明 |
|------------|------|
| `replace()` | 指定した文字列を置き換え |
| `strip()`   | 前後の空白や改行を削除 |

### 使用例

```python
text = "hello world"
result = text.replace("world", "Python")
print(result)  # hello Python

text = "  hello\n"
result = text.strip()
print(result)  # 'hello'
```

※ `lstrip()`（左側のみ）、`rstrip()`（右側のみ）もあります。

---

## 検索・数え上げ

### メソッド一覧

| メソッド名 | 説明 |
|------------|------|
| `find()`   | 部分文字列の最初の位置を返す |
| `count()`  | 指定文字列の出現数を返す |

### 使用例

```python
text = "banana"
index = text.find("na")
print(index)  # 2

text = "banana"
count = text.count("a")
print(count)  # 3
```

---

## 判定（開始・終了）

### メソッド一覧

| メソッド名 | 説明 |
|------------|------|
| `startswith()` | 指定文字列で始まるか判定 |
| `endswith()`   | 指定文字列で終わるか判定 |

### 使用例

```python
filename = "test.py"
print(filename.startswith("test"))  # True
print(filename.endswith(".py"))     # True
```

---

## 大文字・小文字変換

### メソッド一覧

| メソッド名 | 説明 |
|------------|------|
| `upper()`      | すべて大文字に変換 |
| `lower()`      | すべて小文字に変換 |
| `capitalize()` | 先頭だけ大文字に |
| `title()`      | 各単語の先頭を大文字に |
| `swapcase()`   | 大文字と小文字を反転 |

### 使用例

```python
text = "hello"
print(text.upper())       # HELLO
print(text.capitalize())  # Hello

text = "HELLO"
print(text.lower())       # hello

text = "hello world"
print(text.title())       # Hello World

text = "AbC"
print(text.swapcase())    # aBc
```

---

## 文字構成の判定

### メソッド一覧

| メソッド名 | 説明 |
|------------|------|
| `isalpha()` | アルファベットのみか |
| `isdigit()` | 数字のみか |
| `isalnum()` | 英数字のみか |
| `isspace()` | 空白文字のみか |

### 使用例

```python
print("abc".isalpha())     # True
print("abc123".isalpha())  # False

print("123".isdigit())     # True
print("12a3".isdigit())    # False

print("abc123".isalnum())  # True
print("abc!".isalnum())    # False

print(" \t\n".isspace())   # True
print(" abc ".isspace())   # False
```

---

## まとめ

文字列に関する基本的なメソッドはとても多いですが、**実際によく使うものは限られている**ように思います。  
特に `split()`、`join()`、`replace()`、`strip()` あたりは実務でも試験でも頻出なので、使い方をしっかり覚えておきたいです。

自分の学習の整理として、また復習の際に役立てたいと思います。
GPT(GUID Partition Table) がどぉーのこぉーの言われちょう💦

# 謎の📝発見で記事を書いてみるw
2020年頃に旧 3ware 社(現 [Broadcom](https://jp.broadcom.com/) 社)の RAID カード [3ware 9650SE-2LP](https://www.ask-corp.jp/products/avago/3ware/3ware-9650se.html) を用いて RAID1 構成で利用しちゃっていた HDD を片方から RADI カード無しにマザーボードの I/F へ直接繋いで起動した時に出た dmesg(8) の抜粋なのだが、GEOM から見慣れんメッセージが出ちゃる
```text:dmesg
ada0 at ata2 bus 0 scbus1 target 0 lun 0
ada0: <WDC WD30EFRX-68EUZN0 82.00A82> ACS-2 ATA SATA 3.x device
ada0: Serial Number WD-WCC4N0******
ada0: 300.000MB/s transfers (SATA 2.x, UDMA5, PIO 8192bytes)
ada0: 2861588MB (5860533168 512 byte sectors)
ada0: quirks=0x1<4K>
GEOM: ada0: the secondary GPT header is not in the last LBA.
GEOM: diskid/DISK-WD-WCC4N0******: the secondary GPT header is not in the last LBA.
```
ザックリ説明しおると
__ada0 に GPT のセカンダリヘッダが無いど！__
って事。
RAID1 のミラーリングじゃけなんなん？と思いつつ、恐らく RAID カードの固有情報を最終セクタ辺りに記載しおる部分を残して実容量として OS に容量を伝えていたんじゃろ。

:::note info
詳細は調べとらんけん、あくまでもワシの独自研究wの情報じゃけ、この辺りの詳しい人はコメント下さい✌
:::
# テーブルを整えます
___無い___ って言われとるけん、ヘッダのプライマリからセカンダリへ転送し修復を試みる(大袈裟)
```cmd:wheel 権限でw
gpart recover ada0
```
```text:結果
ada0 recovered
```
あっさり完了
# 結び
折角出てきたメモじゃけ、なんとなく記事にしてみちゃったが、恐らくこういうのんダケを記事にしおるのは無さそうじゃけ、敢えてという気持ちも込めて記事にしてみたｗ
# そういえば🤔
GPT が採用される以前の RAID なネタ
[Promise Technology](https://www.promise.com/jp/Promotion/PromiseRAID) 社の FastTrak シリーズでも同様のメッセージが GEOM では無かったが出ていた気がする💦
IDE のドライヴで一発の容量が 120MB 程度じゃったかねぇ🤣
[Promise Ultra100](https://www.promise.com/media_bank/Download%20Bank/manual/Ultra100_quickly_installation_guide_Jp.pdf) のカードを増設して vinum(8) の構築して HDD が二台とも吹っ飛んで凹んだ事もウッスラ記憶しちょる😢
Pythonの便利な小ネタ集 ～実践試験で得た知見まとめ～

先日、[Python3 エンジニア認定実践試験に合格](https://qiita.com/knishizono04/items/e7502f2d795790398c1d) しました！
試験勉強を通して、個人的に「これは覚えておくと便利！」と感じた小技やモジュールたちを、備忘録がてら簡潔にまとめて紹介します。

# ① f文字列の変数表示
Python 3.8から、**f文字列で変数名と値を一緒に出力**できるようになりました。デバッグやログ出力の際に役立ちそうです。
```python
ans = 42

# いままでやっていたデバッグ出力
print(f'ans={ans}') # 出力: ans=42

# 以下のようにした方が、変数名を1つ書くだけで済む
print(f'{ans=}') # 出力: ans=42
```

# ② 要素の集計
複数の値が登場するリストなどから、「各要素が何回登場したか」を一瞬で集計できます。
```python
from collections import Counter

fruits = ['apple', 'banana', 'apple', 'orange', 'banana']
count = Counter(fruits)
print(count)
# 出力: Counter({'apple': 2, 'banana': 2, 'orange': 1})
```

# ③ 関数実行のパフォーマンス比較
関数の処理速度をミリ秒単位で精密に測れます。関数の最適化や比較検証に便利だと思いました。
```python
import timeit

def test():
    return sum(x for x in range(1000))

print(timeit.timeit(test, number=100)) # 関数testを100回実行したときの合計時間（秒単位）を測定。
# 出力: 0.01234
```

# ④ セキュアなランダム文字列を生成
randomよりも暗号論的に安全な乱数生成ができるsecretsを使えば、実用的なパスワードも安心して作れます。
```python
import secrets
import string

alphabet = string.ascii_letters + string.digits
password = ''.join(secrets.choice(alphabet) for _ in range(12))
print(password)
# 出力: a9ZkX2mLq7Ty
```

# ⑤ リスト結合で長さの違いを吸収
zip：最短の要素数に合わせてペアを作る
```python
a = [1, 2, 3]
b = ['A', 'B']
print(list(zip(a, b)))
# 出力: [(1, 'A'), (2, 'B')]
```
zip_longest：最長のリストに合わせる（不足分をfillvalueで補完）
```python
from itertools import zip_longest

print(list(zip_longest(a, b, fillvalue='-')))
# 出力: [(1, 'A'), (2, 'B'), (3, '-')]
```

# ⑥ オブジェクトコピーで浅い・深いを使い分け
copy.copy()：浅いコピー（オブジェクトの第一層だけコピーする）
```python
import copy

a = [1, 2, [3, 4]]
b = copy.copy(a)
b[0] = 10 # bの第一層は独立しているので影響なし
b[2][0] = 30 # b[2]は参照を共有しているのでa[2][0]も変わる

print(a) # [1, 2, [30, 4]]
print(b) # [10, 2, [30, 4]]
```
copy.deepcopy()：深いコピー（オブジェクトの中身すべてを再帰的にコピーする）
```python
import copy

a = [1, 2, [3, 4]]
b = copy.deepcopy(a)
b[2][0] = 30 # bの内部要素は独立しているのでaには影響なし

print(a) # [1, 2, [3, 4]]
print(b) # [1, 2, [30, 4]]
```

# 最後に
試験勉強をする中で、便利な技を知ることができたので良かったです。
この記事が、みなさんの開発のちょっとした手助けになれば幸いです！
他にも、覚えておくと便利な技がありましたら、コメントで教えていただけると嬉しいです🙇
自宅サーバーを公開するなら貸借ルーターのままVPNを使おう

自宅サーバーときくと「高そうな回線使用料金」が頭をよぎります。それでもしばらくすると「自サイトのFQDNとグローバルIPアドレス」が常に一致していれば問題なさそう！と思い直す。<!--この考えはあっています。-->どう実現するかが問題になります。

選択肢として入ってくるのが
* ISPとの間で固定IP契約する
普通は動的IP契約です。ルーター電源の再投入などでWAN側IPアドレス (グローバルIPアドレス) は替わります。にも関わらず困らないのは自分がクライアント側だから。今回は自分がサーバーになるのであえて固定にするのが `固定IP契約` です。
メリット：固定IPなので専用線と実質的に同じ
デメリット：毎月それ相当の額を払わなければならない
* ルータ製造会社が提供するDDNSサービスを利用する
メリット：上記とは逆のことをしますが目的は達成できます
デメリット：年に数千円程度の出費が必要になるのと、サブドメインでの運用を強いられる

いずれにせよ次の問題が発生します。
* ヘアピンNAT
ブラウザURLに自ドメインのFQDNを入れた時どう見えるか気になりますよね。この作業をしない人なんて決していません。やってみると大抵はエラーになります。一方、自宅じゃない…会社等からアクセスしてみると普通に見える！なぜ自宅LAN環境からだとエラーになるのか。ひとえに <strong>ルーターの問題</strong> なんです。<dl>
  <dt>ヘアピンNATあり</dt>
  <dd>家庭用で幾つか存在！意識して購入する<br>設定はありません。適時の判断で勝手にループバックさせて表示します。</dd>
  <dt>ヘアピンNATなし</dt>
  <dd>普通はこっち、業務用もこっち<br>機能がないのでエラーになりますが業務用の一部に、設定すればループバックできる機種も存在します。只デフォルトではループバックしないのでこちら側としました。</dd>
</dl>

<table>
<caption>自宅サーバー</caption>
<tr>
<td>ルーター</td><td>仮想化しない</td><td>仮想化する</td>
</tr>
<tr>
<td rowspan=2>方法</td><td>固定IP契約</td><td rowspan=2>VPNアプリを起動</td>
</tr>
<tr>
<td>ルーター製造会社のDDNS</td>
</tr>
<tr>
<td>装置</td><td>ヘアピンルーターを探そう</td><td>NTT貸借はグローバル<br>IPアドレスを変化させない</td>
</tr>
<tr>
<td>ヘアピン機能</td><td>必要</td><td>不要</td>
</tr>
<tr>
<td>Webアプリ</td><td>変更なしで動く</td><td>修正が必要になることも</td>
</tr>
<tr>
<td>費用</td><td>数千円～数百円/月</td><td>なし</td>
</tr>
</table>

ここからは本命 <strong>VPN</strong> の話をします。

世間の反応を確認したいWEBサービスをあなたはお持ちのはず！お金をかけるのは <strong>自分の中でゴーサインが出た後</strong> でしょう。費用を全くかけずにWEBサービスを公開できなければ何の意味もありません！それが <strong>VPN</strong> です。

先ず決めるべきは <strong>使うルーター</strong> です。個人契約でNTTから貸借ルーターを借りていれば <strong>何もしないでそのまま</strong> が一番良いです。と言うのも市販ルーターだと <strong>サーバー的使用が数時間続くとリセットがかかるもの</strong> が存在します。<strong>ヘアピンを有するもの</strong> は皆そうなる運命なのか？自分が購入した範囲での話。ここまでの内容を精査すると <strong>ISPかルーター製造会社</strong> の一方を無理矢理使わせる構造に見えます。むろん私は <strong>貸借ルーター＋VPN</strong> を選択しています。

ヘアピンを必要としない理由も書いておきます。
<strong>仮想ルーター</strong> を使うと言うことは、今の自分は <strong>米国だったり、韓国だったり</strong> に居るように見える。日本の自環境にアクセスできて当たり前。

最後に大仕事が待っているかも。<strong>Webアプリ</strong> に大掛かりな修正を施さなければならなくなる事を指します。詳細は別記事にします。
「Linuxとは？」初心者向けにわかりやすく解説！

# Linuxとは？

こんにちは！今回は **Linux** について解説していきます。

エンジニアとして、開発環境やサーバー構築の際に **Linux** を扱う機会は非常に多いですよね。  
特にインフラやバックエンドに関わる方にとっては、避けては通れない存在です。

そこで今回は、「Linuxってよく聞くけど、実際どんなもの？」「WindowsやmacOSと何が違うの?」という疑問を持っている方へ向けて、分かりやすく紹介します！

---

## Linuxとは？

**Linux（リナックス）** は、オープンソースのUNIX系OSです。  
無料で使える上にカスタマイズ性が高く、サーバー用途を中心に世界中で広く利用されています。

元々 **1991年に開発** され、現在では数多くの **ディストリビューション（派生版）** が存在します。

---

## よく使われるLinuxディストリビューション

Linuxには様々な **ディストリビューション** があります。  
**ディストリビューション**とは、Linuxカーネルに各種ツールやパッケージを組み合わせた「セット」のようなものです。

### 代表的なディストリビューション:
- **Ubuntu** : 初心者にも扱いやすく、デスクトップ用途にも人気  
- **CentOS / Rocky Linux** : 企業のサーバー用途でよく使われる  
- **Debian** : 安定性重視のディストリビューション  
- **Arch Linux** : 上級者向け。自分で構築する自由度が高い  

もちろん、上記は代表的なものです。  
他にも様々なディストリビューションがあるので、気になる方はぜひ調べてみてください。

---

## Linuxの特徴

- **無料で使える** : 商用利用もOK  
- **軽量で高速** : 古いPCでも動作可能  
- **セキュリティが高い** : ユーザー権限の管理がしっかりしている  
- **コマンド操作が基本** : GUIよりもCLI（コマンドライン）での操作が主流  

---

## Linuxの用途

Linuxは **幅広い用途** で利用されており、単なるサーバーOSにとどまらず、様々な分野で活用されています。

### **1. サーバー用途**
Linuxは **Webサーバー、データベースサーバー、メールサーバー** など、多くのサーバー用途で使われています。  
特に **Apache、Nginx、MySQL、PostgreSQL** などの技術と組み合わせることで、安定したシステム運用が可能です。

### **2. クラウド・仮想化環境**
AWS、Google Cloud、Azureなどの **クラウドサービス** では、LinuxベースのOSが主流です。  
また、**DockerやKubernetes** などのコンテナ技術もLinuxを基盤として動作します。

### **3. 組み込みシステム**
スマートフォンやIoTデバイスの **組み込みOS** としてもLinuxは利用されています。  
特に **Android** はLinuxカーネルをベースにしており、家電や自動車のシステムにも活用されています。

### **4. スーパーコンピューター**
世界のスーパーコンピューターの **ほぼすべて** はLinuxを使用しています。  
高性能計算（HPC）や科学技術計算に最適なOSとして、世界中の研究機関で導入されています。

### **5. デスクトップ環境**
一般のPCでも **Ubuntu、Fedora、Linux Mint** などを利用して、デスクトップ環境として活用できます。  
特に **開発者向けのカスタマイズ** や **セキュリティの高さ** を重視する人に人気があります。

### **6. セキュリティ・ペネトレーションテスト**
セキュリティの専門家は、Linuxを活用して **ペネトレーションテスト** （侵入テスト）を行うことがあります。  
特に **Kali Linux** などのセキュリティ向けディストリビューションが有名です。





## よく使うLinux用語

### **shell（シェル）**
コマンドを入力するためのインターフェイス。Linuxの一般的なシェルは **bash（バッシュ）** です。

### **パッケージ**
ソフトウェアのまとまり。**Aptコマンド** や **yumコマンド** で管理します。

### **rootユーザー**
管理者権限を持つユーザーのこと。操作には注意が必要。

### **カーネル**
OSの中核部分で、ハードウェアとの橋渡しをする重要な役割を持つ。

### **path（パス）**
ファイルやディレクトリ（フォルダ）の位置を示す指定方法。
- **絶対パス** : ルートディレクトリ（`/`）を起点に完全に指定する方法  
- **相対パス** : 現在の作業ディレクトリを基準に指定する方法  

---

## 最後に

ここまで読んでいただき、ありがとうございます！  
Linuxは **サーバーや開発環境を構築** する上で欠かせない存在です。

最初は **コマンド操作** に戸惑うかもしれませんが、まずは **Ubuntu** などの扱いやすいディストリビューションから試してみるのがオススメです。

この記事が少しでも参考になれば幸いです！
【PEGA】色々なバリーデーション紹介

# はじめに
PEGAでバリデーションを実装する際に、毎回以前の実装を探しに行っているので、この記事でまとめるともにバリデーションの紹介をしたいと思います。

# バリデーション紹介
# 必須（エラーメッセージを自分で設定したい場合など）
Select a function：value is [expression]
value is {""}

## 電話番号
半角数字のみ＋ハイフンなし
Select a function：[expression evaluates to true]
```
!@pxContainsViaRegex(.YourProperty,"^[0-9]{11}$",true)
``` 
半角数字のみ＋ハイフンあり
Select a function：[expression evaluates to true]
```
!@pxContainsViaRegex(.YourProperty,"^[0-9]{3}-[0-9]{4}-[0-9]{4}$",true)
```

## 半角大小英字＋半角数字＋15桁
Select a function：[expression evaluates to true]
```
!@pxContainsViaRegex(.YourProperty,"^[A-Z,a-z,0-9]{15}$",true)
```

## 全角大小英字＋全角スペース
Select a function：[expression evaluates to true]
```
!@pxContainsViaRegex(.YourProperty,"^[\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\u3000]*$",true)
```

## 15桁以下で入力
Select a function：length of [a pagelist property] is [comparison operator] [value]
length of　{.YourProperty} is Greater Than {15}

## ステージでバリデーションを適用する
Select a function：[expression evaluates to true]
```
.pxCurrentStage == "YourStageName"
```
ANDで条件を続ける

## デフォルトのバリデーションを適用させる（「DateyyyyMMdd」など）
Select a function：Validation of [Property Name] using [Edit Validate Name] fails
Validation of {.YourProperty} using {ValidateName}

## おまけ
エラーメッセージでプロパティの値を入れたい時、「Message」の中でプロパティを"と＋で囲うことによって可能です。
```
入力された " + .YourProperty + "の形式が間違っています。
```
# おわりに
ほとんど自分で見直すようで記事を書きましたが、これからバリデーションを実装する方の参考になったら幸いです
GitHub Actions × Xserver でサイト更新する方法【SSH接続で自動更新】

## GitHub Actions × Xserver で自動デプロイする方法【SSH接続で自動更新】

## この記事の目的

- GitHub から Xserver に **自動でサイト更新**したい
- `appleboy/ssh-action` を使って SSH 経由で `git pull` したい
- ローカル環境からGitHubに`push`したら自動で上記内容を実行してほしい

## 前提条件

- Xserver の契約済み
- Xserver の「SSH設定」ON
- GitHub リポジトリあり（`develop`ブランチを使う例で進行　mainにする場合はymlファイルの記述を変更）

## 手順まとめ

### ① SSH鍵の作成（GitHub Actions用）

```
ssh-keygen -m PEM -t rsa -b 4096 -f ~/.ssh/xserver_deploy
```
-m PEM：appleboy/ssh-action は PEM形式を必要とする

-b 4096：セキュリティ強化

-f：出力先ファイル名（例：xserver_deploy）

できたファイル：

秘密鍵 → ~/.ssh/xserver_deploy

公開鍵 → ~/.ssh/xserver_deploy.pub

### ② Xserver側に公開鍵を登録
サーバーパネル → SSH設定 → 公開鍵認証用鍵の登録

公開鍵の内容（xserver_deploy.pub）を貼り付け

「認証鍵を登録する」ボタンで登録

### ③ XserverのSSH接続制限を変更（重要！）
Xserverの「SSH接続制限」が初期状態だと 国内IP限定 になっており、GitHub Actions（海外サーバ）からは接続できません。

サーバーパネル → SSH設定 →
「SSH接続制限」 → 『すべてのIPアドレスから許可する』に変更

※必要に応じて、一時的に変更後デプロイ確認後、元に戻す方法もあり

### ④ GitHub側に秘密鍵などを登録（Secrets）
GitHub リポジトリの「Settings」 → 「Secrets and variables」 → 「Actions」へ

名前	内容
SSH_HOST	例: sv1234.xserver.jp
SSH_PORT	例: 10022(Xserverだと10022、通常は22が多いらしい)
SSH_USERNAME	例: xs123456
SSH_PRIVATE_KEY	xserver_deployの中身（秘密鍵）を改行含めて丸ごと貼る

### ⑤ .github/workflows/deploy.yml を作成

```yaml
name: Deploy to Xserver

on:
  push:
    branches:
      - develop

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Deploy to Xserver via SSH
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.SSH_HOST }}
          username: ${{ secrets.SSH_USERNAME }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          port: ${{ secrets.SSH_PORT }}
          script: |
            cd /home/xs123456/yourdomain.com/public_html/
            git checkout develop
            git pull origin develop
```
yourdomain.comはご自身のドメインに変更

cdで移動するディレクトリも正確に指定

ブランチはdevelopにpushした際に発火とあるが、ymlの記述を変えてブランチをmainに変えてもOK
```yml
  push:
    branches:
      - main
```

✅ 成功ログ例（Actions）
```
Already on 'develop'
From github.com:yourname/yourrepo
 * branch develop -> FETCH_HEAD
Updating a1b2c3d..d4e5f6g
Fast-forward
 index.html | 1 +
 1 file changed, 1 insertion(+)
✅ Successfully executed commands to all hosts.
```
### つまずいたポイント
トラブル	解決策
ssh: handshake failed	鍵形式が違う（PEMで再作成）
unable to authenticate	公開鍵登録ミス / ユーザー名・ポート間違い
secretがうまく認識されない	改行含めて貼れていない / 最終行に空白や改行不足
国内限定接続で弾かれる	SSH接続制限を「全て許可」に変更

自分が沼ったときに作った記事はこちら

https://qiita.com/Atsusan/items/b17bd78709ff2bc5dbe9

## まとめ
ssh-keygen -m PEM -b 4096 で鍵を作成

Xserverに公開鍵登録＆SSH制限を解除

GitHub Secrets に正しく情報を登録

appleboy/ssh-action で簡単自動デプロイ！

---
🔗 参考リンク
appleboy/ssh-action GitHub

Xserver公式マニュアル（SSH設定）

GitHub Actions ドキュメント

---
SafariのスタートページにWebサイトのアイコンが追加されない問題

# ChatGPTに聞いてみたが

apple-touch-icon.pngがブックマークのスタートページから読み取られない問題

・ルートディレクトリに置いているか？
・MIMEは正確か？
・キャッシュが働いているのではないか？

などでしたが、

## 解決策

プライベートブラウジングをやめて通常アクセスしたらブックマークのアイコンが更新されました。  

この解決策について、リダイレクトが働いていたためSafariがうまく読み取れなかったのではないか、とのこと。どうなんだろう。
女性型のモビルスーツ（グフ）の画像を作りたい

## 画像生成で、女性型のモビルスーツ（グフ）の画像を作りたい！！
カッコいいかどうかは置いておいて…
そんなの作りたいと思いませんか？思わないのですか？？
私は思いましたし、やっちゃいました（しらん）

## チャットGPTで、なんとかならんか？
やってみました。

■私
> グフを黒く染め女性型にしてください
細めの体型で胸は大きめ
頭はそのままで 背景はグランドキャニオンで

★ChatGpt
>>画像を生成するために、まず確認させてください。
あなたが希望しているのは、モビルスーツ「グフ」（『機動戦士ガンダム』シリーズに登場）のデザインをベースに、以下のような変更を加えたビジュアルですね：
>>
>>全身を黒くする
>>
>>女性型にする（細めの体型で、胸は大きめ）
>>
>>頭部はそのままグフのデザインを維持
>>
>>背景はグランドキャニオン
>> このような画像を作ることは可能ですが、より正確なビジュアルを提供するために、以下の点を明確にしてもらえると助かります：
>>
>>グフは アニメ風のスタイル（セル画調）をご希望ですか？それとも リアルなメカ風の質感がよいですか？
>>
>>グフの色は完全な黒（真っ黒）ですか？ それとも黒に近いグレーやダークパープルなどのニュアンスもOKですか？
>>
>>グランドキャニオンは昼間の明るい雰囲気がいいですか？ 夕焼けや夜など特定の時間帯の希望はありますか？
>>
>>ご希望に合わせて、すぐに画像を生成いたします！

■私
>リアルな感じで、ダークパープルでも良いですね 夕焼けでお願いいたします

![00992132-ba7e-4624-a2dd-5f2c8da0a6e4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490393/ac65ff25-79ac-4b66-9679-5501d4b29d7f.png)

・・・むぐ。できたはいいけど、、、アクション性足りないし。。。

■私
>頭を小さめにして、足もかなり細め、黒いハイヒールを履かせてください
>黒いムチを装備し、アクションポーズを決めてください

![fa63655d-cd35-45dd-81ff-edc71fecf3ac.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490393/589b5257-fcdd-4cbe-9308-afca73faa2bb.png)

・・・まぢか・・・グフじゃないじゃん


色々繰り返して・・・

![fa1b6f35-25d5-4be6-83cd-a401f66c0759.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490393/d018b7ed-d7ab-43f1-976b-fe767375fd2e.png)

とりあえずこれでいいや。鞭がフラフープになってるけど感じ出たから…

まぁ、妥協の産物の感じがしますが画像の生成の感覚はこんな感じで作るようです。仕事としてやっている人は、これではなくいろんな固定のスクリプトなんてものが有りそうですね。

キャラクター、衣装、背景、アクション、映像効果などをはじめから入力しておくと、比較的にそれなりのものが生成される可能性があります。
文系未経験からエンジニアを志すまで

### はじめに

はじめまして、suzu.treeです。

記念すべき初投稿は、文系未経験ながら私がエンジニアを目指した理由を自己紹介を兼ねてお話ししたいと思います。

私のエンジニアリングに関する関心は、主に以下の2つです。
　　①生成AI
　　②アクセシビリティ
今回は、エンジニアを目指すきっかけとなった「アクセシビリティ」について深掘りしていきます。

### アクセシビリティとの出会い

私は学部・大学院で、専門ではありませんが障害学を学んできました。
そのなかで、「アクセシビリティ」に関心を持ち、手話を学んでろうの友人と交流したり、文字起こしアプリ（UDトーク・YYProbe）を活用したり、関連書籍を読んだりして学びを深めてきました。

現在、Discordでコミュニティを運営しているのですが、そこには日本語を第一言語としない方や、漢字を読むのが難しい方も参加されています。
そのため、アクセシビリティを確保する目的で、メッセージの漢字には括弧書きでひらがなを併記するようにしていました。

しかし、この方法には課題がありました。
アクセシビリティ担保のためとはいえ、毎回手作業でひらがなを書くのは時間がかかり、**参加者個々の「やさしさ」に依存してしまう点**です。

### 「プログラミングならできるのに」その一言が世界を変えた

ある日、友人が手書きでひらがなを書いているのを見て、「**え、こんなのプログラミングでできるのに**」と言われ、衝撃を受けました。
その時まで、プログラミングで何ができるのか、基本的なことすら理解していなかったのです。

### プログラミングとの出会い

友人の言葉に希望を抱き、ChatGPTにDiscordのメッセージをひらがなにするBotの作り方を聞いて試作しました。
そして、ついにメッセージを自動でひらがな変換してくれるBotの作成に成功したのです！

### この経験から得た、2つの衝撃的な学び

この経験から、私は2つの重要な学びを得ました。
#### プログラミングの力は想像以上だった！

プログラミングで何ができるのかを知らなかった私にとって、コードを書くこと（実際はChatGPTに書いてもらったのですが😂）で、こんなにも多くのことができるのか、しかもアクセシビリティに貢献できるという事実に感動しました。
#### 既存のウェブサービスはアクセシビリティが圧倒的に不足している！

本来であれば、ふりがな入力がデフォルトで可能であること、代替テキストがデフォルトで設定できること、文字の大きさが変更できることなど、ウェブアクセシビリティが担保されているべきなのに、現状はそうではないという「怒り」と「これは変えなければならない」という強い思いが湧きました。
### アクセシビリティとプログラミングの交差点からエンジニアの道に

このように、自分の関心（アクセシビリティ）とプログラミングの交差点を知ることができたことで、「エンジニアになって、いつかアクセシビリティが担保されたプラットフォームを作れたら最高！」というモチベーションでエンジニアを志望するに至りました。

理系分野が苦手で、大学院まで文系だった未経験エンジニアという立場なので、正直焦りはありますが、自分のペースで学んでいきたいと思っています。

最後までお読みいただき、ありがとうございました！
【Haskell勉強メモ】Functor則とかいう高尚な名前にビビったけど、意外と普通のこと言ってた話

最近Haskellを勉強していて、Functor則なるものに遭遇しました。
「うわ、なんかやばそうなのきたな」と身構えたんですが、ちゃんと調べてみたら意外とシンプルな話だったので、忘備録も兼ねてまとめます。

# そもそもFunctorとは？

HaskellのFunctorはざっくり言うと

**「コンテナの中身に関数を適用できる仕組み」**

です。
実際は型クラスとして定義されていて、`fmap`という関数を持っています。

```haskell
class Functor f where
    fmap :: (a -> b) -> f a -> f b
```

要するに：

* `a -> b` という普通の関数を
* `f a` という「何かの中身（リスト、Maybe、など）」に適用して
* `f b` にしてくれる

例えば：

```haskell
fmap (+1) (Just 3)  -- 結果: Just 4
fmap (*2) [1,2,3]   -- 結果: [2,4,6]
```

かなり素朴です。要は中身に関数を適用するだけ。

# で、Functor則って何？

ここで出てくるのが**Functor則**。

「則」とか「法則」とか言われると身構えますが、やってることは本当に当たり前のことを保証してるだけです。

## Functor則は以下の2つ

### ① 恒等法則（Identity Law）

```haskell
fmap id == id
```

* 何もしない関数`id`を`fmap`しても、元の値は変わらないよね、という話。

### ② 合成法則（Composition Law）

```haskell
fmap (g . f) == (fmap g) . (fmap f)
```

* 関数の合成を`fmap`に渡すのと、`fmap`を順番に適用するのは同じ結果になるよね、という話。

# え、なんかめっちゃ普通のこと言ってね？

そう。
**それがFunctor則。**

一見「わざわざ法則とか大げさに言う必要ある？」と思うんですが、これをちゃんと定義することで

* **ライブラリ作者が変な`fmap`を書かないようにする**
* **抽象的なコードを書いても安心して動く**

というメリットがあります。

例えば、もし誰かが以下のような`fmap`を書いたら、Functor則は壊れます。

```haskell
instance Functor Maybe where
  fmap f (Just x) = Just (f (f x))  -- 2回適用してしまってる
  fmap f Nothing  = Nothing
```

これだと普通に`fmap id`しても元に戻らないし、合成法則も壊れます。

だから **「当たり前のことを当たり前にしてね」という最低限の契約** がFunctor則なんですね。

# 📝 用語にビビらないことも勉強のコツ

今回のFunctor則に限らず、Haskellや関数型プログラミングの世界は「名前だけ高尚」な概念が結構あります。
でも、一個一個よく見てみると

* 意味は結構シンプル
* 「当たり前」を保証してるだけ

というケースも多いです。

用語にビビらず、冷静に定義を見ていくのが大事だなと学びました。

# まとめ

* Functor則は **「当たり前をちゃんと保証するルール」**
* 恒等法則と合成法則、どちらも自然な話
* 名前に惑わされず、定義を落ち着いて読むのが大事
Meta XR SDKではじめようQuestアプリ開発

### 1. はじめに

Meta Quest 3の登場により、Mixed Reality（MR）アプリケーション開発は新たな段階に入りました。高解像度パススルー機能により、一台のデバイスでVRとARの両方の体験を提供したり、開発したりできる環境が整ったのです。

これまで本ブログではもOculus XRプラグインを使った Quest開発についての[記事](https://tks-yoshinaga.hatenablog.com/entry/quest-dev-index)を公開してきました。しかし昨今、Meta XR SDKが OpenXRベースのアーキテクチャを標準とするようになったことで、SDKで提供されるプレハブの構成や設定手順にも変更がありました。そのため既存の記事では最新の環境に対応できなくなったので、新しいMeta XR SDKに対応したチュートリアルを一から作り直すことにしました。

本連載の位置づけとしては、初心者がMeta XR SDKで提供されているプレハブやスクリプトの使い方を段階的に学習できるチュートリアルを目指しています。
同SDKを使った開発に関しては、Building Blocksという手軽にオブジェクトの表示やインタラクションを実現するツールも提供され、SDKに関する知識がなくても基本的な機能を試すことが可能になっています。

[Building Blocks | Oculus Developers](https://developer.oculus.com/documentation/unity/bb-overview/)

しかし、Building Blocksで作成したサンプルに物足りなさを感じ、サンプルを調整して自分が望む動作を実現しようとする段階になると、SDKの使い方を学ぶ必要がります。  
その際、Meta XR SDKは豊富なサンプルを提供してるので、これらを解析することでSDKの詳しい使い方を学ぶことができます。しかしサンプルを一つ一つ確認することは初心者にとっては情報量が多く、高いハードルとなり得ます。つまり、「ちょっと変更したい」という要望を実現するのが非常に大変なのです。実際、私自身も学習するのに苦労しました。

そこで、Questを使ったオブジェクトの表示やインタラクションを実現するための基本手順を学べる資料があると多くの方の学習の支援になるのではないかと考え、この連載を始めるに至りました。ノーコードのBuilding Blocksと公式サンプルの中間くらいのレベル感で、特定の機能を実現するための最小構成を学べる資料を作成しようと考えています。

### 2. 連載目次

- [Meta XR SDKのインストールとプロジェクトの設定](https://qiita.com/Tks_Yoshinaga/items/7bd7ee0f30702581f68b)
- [オブジェクトをVR表示](https://qiita.com/Tks_Yoshinaga/items/d4ce5cae11ffb0059190)
- [パススルー機能を使ったAR表示](https://qiita.com/Tks_Yoshinaga/items/a0c89be9c721dbdb4c00)
- [ロコモーションをオフにする](https://qiita.com/Tks_Yoshinaga/items/e1a69de743aa975310d5)
- [オブジェクトをつかむ(準備編)](https://qiita.com/Tks_Yoshinaga/items/c934e26cad88596da650)
    - [近くにあるオブジェクトをつかむ](https://qiita.com/Tks_Yoshinaga/items/30dfdc77533d43253c78)
    - [遠くにあるオブジェクトをつかむ](https://qiita.com/Tks_Yoshinaga/items/3440ea59af373b42a4ca)
- [Ray交差判定を用いたインタラクション](https://qiita.com/Tks_Yoshinaga/items/e8e56e8804f1b651e392)
- [UnityのUI操作 (ボタンを例に)](https://qiita.com/Tks_Yoshinaga/items/5d499b51869221d12301)
- [カスタムHand Poseを使った自然な操作](https://qiita.com/Tks_Yoshinaga/items/a53fe3a9be7c3cba2945)
- [PalmMenuを使った手のひらUI](https://qiita.com/Tks_Yoshinaga/items/5d3acfc9136a499555b4)

ほか、思いついたネタがあれば掲載していきたいと思います。

記事の間違いのご指摘や、修正のご提案、勉強してみたい内容などがあればぜひご連絡ください。  
X(旧Twitter): https://twitter.com/Taka_Yoshinaga

### 3. GitHub

本記事で作成したサンプルはGitHubでも公開しています。

[GitHub - TakashiYoshinaga/MetaXR-SDK-Samples](https://github.com/TakashiYoshinaga/MetaXR-SDK-Samples)
ChatGPTのコード、動いたけど“わかってない”あなたへ贈る記事【JavaScript初〜中級者向け】 Vol.2

## はじめに

前回の記事では、ChatGPTから得たコードを「分解して理解する力」をテーマに、非同期処理や配列操作を中心に解説しました。

http://qiita.com/mukai3/items/68c3280d1ec5198d2031

今回はさらに一歩踏み込んで、**「UIの振る舞い」や「イベント処理」など、ChatGPTがよく書いてくれるけど“腑に落ちない”JavaScriptのパターン**を深掘りしていきます。

---

## 1. addEventListenerってなんで使うの？

ChatGPTがよく出してくれるコード：

```js
document.getElementById("btn").addEventListener("click", () => {
  alert("押されました");
});
```

### ✅ そもそも「イベント」ってなに？

* ブラウザ上でのユーザー操作（クリック、スクロール、入力 など）
* それに「反応する仕組み」が addEventListener

### ✅ なぜ関数（コールバック）を渡すの？

* 「イベントが起きたらこれを実行してね」という予約
* すぐに実行ではなく、“あとで呼ばれる”から「関数をそのまま渡す」

---

## 2. DOMの取得方法、全部同じじゃない

```js
document.getElementById("app");
document.querySelector("#app");
document.querySelector(".item");
document.querySelectorAll(".item");
```

### ✅ よくある“どれを使えばいいの？”問題

| メソッド               | 取得対象    | 返すもの               |
| ------------------ | ------- | ------------------ |
| `getElementById`   | id指定    | 1つの要素 (Element)    |
| `querySelector`    | CSSセレクタ | 最初の1件だけ (Element)  |
| `querySelectorAll` | CSSセレクタ | 複数のNodeList（配列っぽい） |

👉 **複数取得はforEachで回せるNodeListになる点がポイント**

---

## 3. クラスの操作、意外と使われてる

ChatGPTがよくやるやつ：

```js
document.querySelector(".box").classList.add("active");
document.querySelector(".box").classList.remove("hidden");
document.querySelector(".box").classList.toggle("open");
```

### ✅ これ、何してるの？

* **classList.add/remove/toggle**：CSSのクラス名を操作して見た目や動きを制御
* JSで直接スタイル書かずに「CSSの定義と連携させる」思想

👉 **状態管理とスタイルの切り替えがシンプルに書けるようになる**

---

## 4. e.target / this の違いがわからない問題

```js
document.querySelector("button").addEventListener("click", function (e) {
  console.log("this:", this);       // クリックされたbutton
  console.log("e.target:", e.target); // 同じくbutton
});
```

### ✅ this と e.target の違いは？

* `this` は「誰がこの関数を実行したか」
* `e.target` は「どの要素が実際にクリックされたか」

→ 通常は同じになるけど、**イベントがバブリングしてる場合などは違ってくる**

👉 **ReactやVueでも this や event.target の理解は地味に効いてくる**

---

## 5. まとめ：ChatGPTに頼りながらも理解していく道

| よく出る構文             | 意味     | なぜそう書くか        |
| ------------------ | ------ | -------------- |
| `addEventListener` | イベント登録 | 後から処理を呼び出すため   |
| `querySelector`    | DOM取得  | CSSセレクタ使えて柔軟   |
| `classList.toggle` | クラス切替  | スタイル状態を簡潔に制御   |
| `e.target / this`  | 要素参照   | UIのどこを操作してるか把握 |

---

## おわりに

今回も、「ChatGPTのコードは動くけど“腹落ちしてない”層」に向けて、**原理を丁寧に解説する構成**でお届けしました。

次回は、**「関数定義・スコープ・クロージャ」などChatGPTが当たり前に使う“関数の深掘り”回**を予定しています。
MetaQuestのロコモーションをオフにする

## 0. 本記事の内容

本連載で使用している**OVRInteractionComprehensive**には手やコントローラを使ったインタラクションに関する基本的な設定が済んでいるオブジェクトが内包されています。これらの機能の中にはジョイスティックを使ったテレポートや視点の回転を行うロコモーション（Locomotion）も提供されていて、デフォルトで使用可能な状態になっています。

しかしコンテンツによっては（特にARコンテンツでは）このような機能が不要な場合もあります。本記事では、不要なロコモーション機能を無効化する設定方法について紹介します。

なおVRやARを実現するための基本的な設定は済んでいることを前提に解説を行います。VRやAR開発の基本設定についてご興味がある方は下記の記事もあわせてお読みください。

**[VR版]**

[MetaQuestでオブジェクトを表示](https://qiita.com/Tks_Yoshinaga/items/d4ce5cae11ffb0059190)

**[AR版]**

[MetaQuestのパススルーを使ったAR表示](https://qiita.com/Tks_Yoshinaga/items/a0c89be9c721dbdb4c00)

## 1. ロコモーション機能の無効化

**[右手コントローラーのロコモーション無効化]**

- Hierarchyの中から**OVRCameraRig**を見つける
- OVRCameraRigの子要素の**OVRInteractionComprehensive**を開く
- さらに**RightInteractions -> Interactors -> Controller -> LocomotionControllerInteractorGroup**の順に子要素を開く
- LocomotionControllerInteractorGroupの子要素の以下をそれぞれ非アクティブにする
  - **TeleportControllerInteractor**（テレポート機能）
  - **ControllerTurnerInteractor**（視点回転機能）
  - **ControllerSlideInteractor**

![LocomotionControllerInteractorGroup削除画面](https://github.com/TakashiYoshinaga/MetaXR-SDK-Samples/blob/main/Documents/materials/4/00.jpg?raw=true)

**[左手コントローラーのロコモーション無効化]**

- **LeftInteractions**についても同様の設定を行う
- **LeftInteractions -> Interactors -> Controller -> LocomotionControllerInteractorGroup**の順に子要素を開く
- LocomotionControllerInteractorGroupの子要素の以下をそれぞれ非アクティブにする
  - **TeleportControllerInteractor**
  - **ControllerTurnerInteractor**
  - **ControllerSlideInteractor**

**[Locomotorオブジェクトの無効化]**

- OVRInteractionComprehensiveの子要素の**Locomotor**を非アクティブにする

## 2. 無効化される機能

以上の設定により、以下のロコモーション機能が無効化されます：

| 機能 | 説明 | 対象コンテンツ |
|------|------|----------------|
| **テレポート** | ジョイスティックでの瞬間移動 | VR/AR共通 |
| **視点回転** | ジョイスティックでの視点の左右回転 | 主にVR |
| **連続移動** | ジョイスティックでの連続的な移動 | 主にVR |

これらの機能は特にARアプリケーションでは現実空間との整合性を保つために無効化することが推奨されます。

## 3. 次のステップ

ここまでの内容でロコモーション機能の無効化が完了しました。次はオブジェクトのマニピュレーション機能の準備について解説します。

[MetaQuestでオブジェクトをつかむ（準備編）](https://qiita.com/Tks_Yoshinaga/items/c934e26cad88596da650)

## 4. Meta XR SDKに関する記事一覧はこちら

[Meta XR SDK連載目次](https://qiita.com/Tks_Yoshinaga/items/32bfe7567abbb2ac9521)
【Day11】アプリが一通り完成！！

## はじめに

勉強とアウトプットを兼ねて、Webアプリ開発の記録を記事にしてみます。

個人のメモ的な側面が強いです。
Web開発初心者すぎて至らぬところだらけだと思いますが、暖かい目で見ていただければ幸いです。

↓ これまでの内容 ↓
[【Day0】アプリが完成するまで毎日投稿](https://qiita.com/midorigame/items/f9b9a445c945b4a837b1)
[【Day1】開発環境を考える](https://qiita.com/midorigame/items/e26344599e2ffaa22033)
[【Day2】開発環境を構築する、、、はずでした](https://qiita.com/midorigame/items/3f57f2691a8e1074adb8)
[【Day3】まずはフロントだけ開発環境を構築する](https://qiita.com/midorigame/items/9de27ba72aaef504a833)
[【Day4】バックエンドの開発環境を整えつつ、マルチコンテナ対応のDevcontainerにする](https://qiita.com/midorigame/items/5b95374cd85f715a6498)
[【Day5】お試し実装！ファイルをアップロードしてバックエンドで処理する](https://qiita.com/midorigame/items/9663f0063b95b501c08a)
[【Day6】Docker Desktopが起動しなくなり泣きながら原因調査する](https://qiita.com/midorigame/items/d07df1caf05267d0609d)
[【Day7】画像にフレームとExif情報を付けてみる](https://qiita.com/midorigame/items/e2d85ce8dd7a5bcb5daf)
[【Day8】フロントに表示する画像のサイズを小さくする](https://qiita.com/midorigame/items/f7f5f9b14fb79259c716)
[【Day9】フロントエンドとバックエンドをそれぞれデプロイする](https://qiita.com/midorigame/items/4c8037024e667ff1105b)
[【Day10】結局コンテナ1つで開発する方が楽かもしれない](https://qiita.com/midorigame/items/60b484b2007c3aab474b)

## 前回やったこと

開発環境のコンテナを1つに統合して、より開発しやすくしました。

## 今回やったこと

ついにアプリの全体感が完成しました！

### トップ画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307348/d51f80cc-bb72-4253-8085-a208a1483e8a.png)

Exif情報の有無を切り替えるトグルスイッチを実装しました！

### フレーム作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307348/fc4d499c-e412-46b4-a7ac-55eb968d1b53.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307348/e2b7a8b1-e878-4aaf-9f66-70a49abe95a5.png)

今までできていなかった縦画像にも対応させました。

### Exif情報の切り替え

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307348/9095ab49-ce9e-4655-98a1-1ee7a5f380dd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307348/4d9d978e-bf84-40cd-8226-90bfbf4bc3d8.png)

Exif情報を切り替えるとその部分にも画像を拡張します。
縦画像だとかなり印象が変わりますね。

## 全体のロジックの流れ

まずはフロント側でユーザーに画像ファイルを選択してもらいます。
アップロードボタンを押下すると、Exif情報のトグルスイッチのON/OFFに応じたtrue/falseとともに画像データをバックエンドにAPIリクエストを投げます。

この時にデータ容量を削減するために画像データを1350px x 1080pxに収まるようにサイズを縮小してます。
（これで無料サーバーの容量をちょっとは節約できる？）

その後、バックエンドではON/OFFのtrue/falseに応じて、フレーム作成ロジックでExif情報を取得するかどうかを決めています。

## おわりに

無事に一通りの実装ができました。
といってもChat GPTに頼りっぱなしなので、ソースはごちゃごちゃだし、1つのコンポーネントやメソッドがすごいボリュームになってます。

一旦リファクタリングをしようと思いますが、リファクタリングはChat GPTに頼らず自力でやりたいとおもい
LLM（大規模言語モデル）ってなんだっけ？

## LLM（大規模言語モデル）ってなんだっけ

大量のテキストデータを使って学習したAIの一種
一言で言うと、自然言語での会話や質問が処理できるプログラム群のことを指しています。

簡単に言えば、  
> 「めちゃくちゃたくさんの本やネット記事を読んだ、超おしゃべりAI」

LLMは、「言葉」に関することが得意となっています。  
たとえば、こんなことができます：

- 質問に答える（例：歴史、科学、雑学など）
- 長文を要約する
- 英語⇔日本語などの翻訳
- 文章の書き換えや校正
- アイデア出しや創作支援
- 人と自然に会話する（チャットボット）

## 💡 有名なLLMの例

| 名前 | 開発元 |
|------|--------|
| ChatGPT | OpenAI |
| Gemini | Google |
| Claude | Anthropic |
| Llama | Meta（旧Facebook） |

# LLMと旧チャットボットの違い

AIチャットが身近になった今、「LLM（大規模言語モデル）」と従来型チャットボットは何が違うの？ というのを纏めました。 
LLMでは資料さえ用意すれば、その資料に対して自然言語で返答できるようになる（ChatGPTは有償）便利なツールとみてイイと思います

| 比較項目 | LLM（大規模言語モデル） | 旧チャットボット（ルールベース） |
|----------|------------------------|-----------------------------|
| **会話の柔軟さ** | ◎ 自然な文章で応答可能 | △ パターン通りの応答 |
| **理解力** | ◎ 文脈や曖昧表現を把握 | △ キーワード一致が基本 |
| **知識の範囲** | ◎ 幅広い一般知識を網羅 | × 登録済みFAQのみ |
| **学習方法** | 機械学習（数十億文のテキスト） | 手動でルールやスクリプト設定 |
| **回答の多様性** | 同じ質問に複数表現で返せる | 基本的に1対1の対応 |
| **更新性** | モデル更新・微調整が可能 | スクリプトの手動修正が必要 |
| **導入難易度** | 高（API連携や設定が必要） | 低（ルール設定だけで済む） |
| **主な用途** | 高度な問答、文生成、創作支援 | 単純な問い合わせ、自動応答 |

昔のチャットボットのメンテナンスをあきらめたとか、どうにか更新しようと思っていたりした場合は切り替えたほうが良いのかもしれないですね。