OmniAICreator/Qiita-1.07M huggingface dataset:
【メモ】Travis CI のビルドライフサイクルと .travis.yml の構成

# はじめに

Travis CI (以下 Travis) の仕組み、特にビルドのライフサイクルと設定ファイルである `.travis.yml` の構成について、調査中のメモです。
でも、調べてる限りでは、ビルドの構成に関する説明と、設定ファイルの構造とが一致してないような気がする… (後述)

# 想定されている Travis CI の使い方

ドキュメントを読むに

- レポジトリには「デプロイされるようなもの」のソースが置いてある
- 対象レポジトリをクローンする (自動)
- ソースをビルドするための前提条件をインストールする (install フェーズ)
- Travis はこれをビルド (コンパイルやパッケージング) してテストなどする (script フェーズ)
- 良さそうならサーバにデプロイする (deploy フェーズ)

のような使い方を想定しているっぽい。
例えば GitHub Action でよく見るような、更新されたソースに基づいて新たなファイルを生成して、それをレポジトリに夏季戻す、という用法はあまり想定していない。Travis は対象レポジトリへの書き込み権限を持っていないのでそう推測した。

# 「ビルド」の構成

## ビルド (Build)

Git のレポジトリにある `.travis.yml` ファイルが1つのビルド (の設定ファイル) にあたる。
レポジトリに commit が push されたり、PR が submit されたときに動くのはこれ。

## ステージ (Stage)

1つのビルドは複数のステージを含む。ステージはファイルへの記載順に順番に実行される。
**ステージ内のジョブ (後述) たちは並列に実行される。**
つまり、

### 例

ステージAとステージBがあるとして、これらは順番に実行される。
一方で、ステージ内にジョブ A, B, C があるとして、これはの3ジョブは並列に実行される。
互いに無関係な処理を実行したり、高速化のために並列実行させたりすることができる。

## ジョブ (Job)

ジョブは順番に実行されるフェーズからなる。

> ステージやジョブを明示的に書かない場合、全体が1つのステージ/ジョブとみなされる。

## フェーズ (Phase)

ジョブ内で逐次的に実行される処理の単位。オプショナルなものを含め、多数のフェーズがある。
メインのフェーズは `install` と `script` の2つである。

注意事項
- install フェーズには言語ごとにデフォルト実装がある。これを disable したいときには `install: skip` と書く
- (成果物の build を行う) script フェーズにもデフォルト実装が存在する場合がある
- デフォルトでは、deploy フェーズ前にレポジトリへの変更は stash される。これを避けたい場合は
  ```yaml
  deploy:
    skip_cleanup: true
  ```
  と書く
- フェーズ内の処理が失敗したときに、それをビルド全体の失敗とみなすかどうかはフェーズによって異なる。以下の一覧で先頭に (*) が付いているフェーズが失敗すると、ビルド自体の失敗とみなされる。

フェーズ一覧
- Install `apt addons` [Optional]
- Install `cache components` [Optional]
- (*) `before_install`
- (*) **`install`**
- (*) `before_script`
- (*) **`script`**
- before_cache (if and only if caching is effective) [Optional]
- after_success / after_failure
- (*) before_deploy (if and only if deployment is active) [Optional]
- (*) deploy [Optional]
- after_deploy (if and only if deployment is active) [Optional]
- after_script

# Job matrix を中心とした「ビルドの構成」の見直し
(以下ドラフト)

上記の構造を頭に入れてドキュメントを読んでもいまいちしっくり来なかった。ドキュメントではあまり前に出てこない Job matrix を中心に考えるのがいいと思った。

## 新・ビルドファイルの構成

ビルドファイルの構成を、記述されている順に従い、以下のように捉えるとよいと思った:

**前提: `script` がジョブの本質。これが定義されている部分がジョブ。**
- `install` とか `before_script` とかがあっても、それだけではジョブは定義されない

これを踏まえて、

- グローバル設定 (OS、distribution、キャッシュ設定、言語など)
- Expansion key による Job matrix の定義
  - たとえば Python のバージョンが3通り、環境変数の設定が2通りあるとすると、matrix 展開により6個のジョブが定義される
  - ここで定義するジョブが0個でもいい
- (`jobs`) 上記 matrix で定義されたジョブを含む、カスタムジョブの追加・除外
  - これによりジョブの全集合が定義される
  - 各ジョブの所属する stage をここで決める。同じ stage に所属するジョブたちは並列実行され得る
  - 各ジョブ個別の設定もここで決める

よくある記述パターンは次の2つだと思われる:

- `jobs` は何も書かずに、すべてを matrix 展開で済ませる。この場合 `script` などもすべてトップレベルに記述する
- Expansion key は何も書かずに matrix 展開をしない。必要なジョブはすべて `jobs` の下に個別に記述して、所属する stage などを決める。特にジョブによって使用する言語を変えたい場合にはこの方法を取り、ジョブごとに `language` を設定する

これを頭においてドキュメントを読むと、言わんとしていることが理解できるはず。
テーブルデータの探索的データ分析（EDA）とは？

### はじめに

データ分析の第一歩として欠かせないのが**探索的データ分析**です。特にテーブルデータにおいては、データの性質やパターンを理解することが、その後の分析やモデリングに大きく影響します。この記事では、テーブルデータのEDAで行うべき主要なステップや手法について解説します。

### EDAの目的

EDAの主な目的は、データの理解を深め、潜在的な問題を発見することです。これにより、データのクレンジングや特徴量エンジニアリング、さらにはモデル選定にも役立ちます。

### EDAの主要なステップ

1. **データの読み込みと基本情報の確認**

   - データを適切なライブラリ（例: Pandas）を使用して読み込みます。
   - 基本的な情報を確認することで、データの構造を理解します。
     ```python
     import pandas as pd
     df = pd.read_csv('data.csv')
     print(df.info())
     print(df.head())
     ```

2. **データの概要統計量の確認**

   - 数値データの基本統計量（平均、中央値、分散など）を確認します。
   - カテゴリカルデータのユニークな値や出現頻度を確認します。
     ```python
     print(df.describe())
     print(df['category_column'].value_counts())
     ```

3. **欠損値のチェック**

   - 欠損値が存在するかを確認し、その割合や分布を把握します。
   - 欠損値の処理方法を検討します。
     ```python
     print(df.isnull().sum())
     ```

4. **データの分布の可視化**

   - ヒストグラムやボックスプロットを使って、数値データの分布を視覚化します。
   - カテゴリカルデータの分布も棒グラフなどで確認します。
     ```python
     import matplotlib.pyplot as plt
     df['numeric_column'].hist(bins=30)
     plt.show()
     ```

5. **相関分析**

   - 数値データ同士の相関を確認し、強い相関関係がある特徴量を探します。
   - ヒートマップを用いて視覚化すると分かりやすいです。
     ```python
     import seaborn as sns
     sns.heatmap(df.corr(), annot=True)
     plt.show()
     ```

6. **外れ値の検出**

   - ボックスプロットや散布図を使って、外れ値を視覚化し、調査します。
   - 外れ値がデータ分析に与える影響を考慮します。

7. **特徴量のエンジニアリング**

   - 新しい特徴量を作成したり、既存の特徴量を変換したりして、モデルのパフォーマンスを向上させます。
   - 例えば、日付データから年、月、曜日を抽出するなどの処理を行います。

### まとめ

探索的データ分析（EDA）は、データの理解を深めるための重要なステップです。テーブルデータのEDAでは、基本的な統計量の確認、欠損値のチェック、データの分布の可視化、相関分析、外れ値の検出などを行います。これにより、データのクレンジングや特徴量エンジニアリングを行い、より良いモデルを構築するための基盤を作ります。
高い精度でも油断大敵！AUCの重要性を理解しよう

### はじめに

「精度95%！これはすごい！」と、つい喜んでしまうことがありますよね。しかし、果たしてその95%は本当に信頼できるものなのでしょうか？実は、精度が高くても、モデルの真の性能を正しく評価できていない可能性があります。そこで登場するのが**AUC**です。今回は、精度とAUCの違い、そしてなぜAUCを見るべきなのかをわかりやすく解説します！

### 精度とは？

まずは、精度についておさらいしましょう。

- **精度（Accuracy）**: 全体の予測の中で、正しく予測できた割合を示す指標です。計算式は以下の通りです。

  $$ 
  \text{Accuracy} = \frac{\text{True Positives} + \text{True Negatives}}{\text{Total Samples}} 
  $$

  例えば、100個のサンプルのうち95個を正しく予測できた場合、精度は95%です。

### AUCとは？

次に、AUCの説明です。

- **AUC（Area Under the Curve）**: ROC曲線の下の面積を表す指標で、モデルの性能を評価するために使われます。ROC曲線は、**真陽性率**を横軸に、**偽陽性率**を縦軸にとったグラフです。AUCの値は0から1の範囲で、1に近いほどモデルの性能が高いことを示します。

### 精度とAUCの違い

ここで、精度とAUCの違いを見てみましょう。

- **精度**: 正しく分類されたデータの割合を測りますが、クラスの不均衡があると偏った評価になることがあります。たとえば、クラス1のデータが99個、クラス0のデータが1個のデータセットで、すべてをクラス1と予測した場合、精度は99%になりますが、実際には全く意味がありません。

- **AUC**: クラスの不均衡に影響されず、モデルがどれだけ良いかを総合的に評価します。高いAUC値は、クラスをうまく区別できていることを示しています。

### なぜAUCを見るべきか？

1. **クラス不均衡に強い**  
   AUCは、クラスの不均衡を考慮に入れず、全体的な性能を評価するため、特に不均衡なデータセットで有効です。

2. **しっかりした性能評価**  
   AUCは、すべての閾値でのモデルの性能を考慮します。これにより、モデルがどの程度の精度でクラスを判別できるかを包括的に把握できます。

3. **適応性**  
   モデルの使用目的に応じて、最適な閾値を選ぶことで、精度や再現率を調整できるため、柔軟性があります。

### まとめ

精度が高いからといって安心してはいけません！AUCを併用することで、より正確にモデルの性能を評価できます。特にクラスの不均衡がある場合や、モデルを実際の状況に適用する際には、AUCが非常に重要です。次回の分析では、精度だけでなくAUCもしっかりと確認して、より信頼性の高い結果を目指しましょう！
Photon FusionのNetworkRunnerはStartGame時に生成したほうがいい

# 概要
NetworkRunner.StartGame() でセッションに入れなかった場合、NetworkRunnerが削除されてしまう仕様みたいなので入室の度に生成する必要があります。

# プログラム

以前書いた[photon-fusionに接続](https://qiita.com/matchyy/items/d19f4046ed3b5303374f#photon-fusion%E3%81%AB%E6%8E%A5%E7%B6%9A)のところを以下のように変更することで、必要に応じて生成してStartGameできるようになります。

```csharp
/* using 省略 */

public class PhotonManager : MonoBehaviour
{
    [SerializeField] private NetworkRunner networkRunner;

    public async UniTask<StartGameResult> StartGame(INetworkRunnerCallbacks networkRunnerCallbacks)
    {
        // ここで準備しておいた処理を登録、ルームに参加すると自動で呼び出されるようになる
        networkRunner.AddCallbacks(networkRunnerCallbacks);
        var startGameArgs = new StartGameArgs
        {
            GameMode = GameMode.Shared,
        };
        return await networkRunner.StartGame(startGameArgs);
    }

    // NetworkRunner.StartGame() でセッションに入れなかった場合、
    // NetworkRunnerが削除されてしまう仕様みたいなので入室の度に生成する
    private NetworkRunner GetOrInstantiateNetworkRunnerIfNeed()
    {
        var runner = FindObjectOfType<NetworkRunner>();
        if (runner == null)
        {
            runner = Instantiate(networkRunnerPrefab);
        }
        return runner;
    }
}
```
PRS解析入門: ポリジェニックリスクスコアでリスクを評価しよう

### はじめに

現代の医学研究において、遺伝的要因が疾病リスクに与える影響を評価することは非常に重要です。そのための手法の一つが**ポリジェニックリスクスコア（PRS）**解析です。この記事では、PRS解析の基本概念、手法、そしてその応用について初心者にもわかりやすく解説します。

### PRSとは？

ポリジェニックリスクスコア（PRS）は、特定の疾病に関連する複数の遺伝子変異の影響を総合的に評価する指標です。具体的には、個人の遺伝的情報をもとに、特定の疾病にかかるリスクを数値化したものです。

### PRSの基本的な考え方

1. **遺伝的変異の特定**  
   PRSを計算するには、まず対象となる疾病に関連する遺伝的変異を特定します。これには、GWAS（Genome-Wide Association Studies）などの大規模な研究が活用されます。

2. **リスクアレルの選定**  
   特定された遺伝的変異の中から、リスクを高める「リスクアレル」と呼ばれる変異を選定します。これらのアレルは、疾病の発症に対する影響度が統計的に有意である必要があります。

3. **スコアの計算**  
   各リスクアレルの影響を加味して、個々の遺伝子型に基づいてPRSを計算します。一般的には、リスクアレルの数とそのリスク係数を掛け合わせてスコアを算出します。

### PRS解析の手法

PRS解析の手法は、主に以下のようなステップで進行します。

1. **データの収集**  
   患者や対象者の遺伝情報を取得します。これは、血液検査や唾液検査などで得られるDNAからの情報です。

2. **GWASデータの活用**  
   大規模なGWASから得られたリスクアレルの情報を使用します。これにより、特定の疾病に関連する遺伝的変異を特定できます。

3. **スコア計算**  
   各個体の遺伝情報に基づいて、PRSを計算します。このスコアが高いほど、その個体が特定の疾病を発症するリスクが高いとされます。

### PRS解析の応用例

- **疾病予測**: PRSを用いて、特定の疾病（例: 糖尿病、心疾患、がん）の発症リスクを予測します。
- **個別化医療**: 患者ごとのリスクを評価することで、個別に適した予防策や治療法を選定できます。
- **公衆衛生の改善**: 集団レベルでのリスク評価により、予防策や健康教育の方針を策定するのに役立ちます。

### まとめ

ポリジェニックリスクスコア（PRS）解析は、遺伝的要因による疾病リスクを評価する強力な手法です。遺伝情報をもとにリスクを定量化することで、個別化医療や公衆衛生の改善に貢献しています。今後、PRS解析はますます重要な役割を果たすことが期待されています。
S3サービスの費用調べてみた

ChatGPTにお願いしてS3のサービスの費用調べてもらったので共有しておきます。※2024/09/21現在
有名どころ御三家は転送代金が馬鹿高いので、おそらく通信品質は高いんだと思う。
日本勢はちょっとストレージが割高だな。
個人て使うならWasabi一択だね、下りの通信品質は本家以上だ

| サービス名                               | ストレージ代金（1TB）    | 転送量の代金（1TB）       | 合計費用（1TB）           | 無料枠                                    | 上り（PUT）速度 | 下り（GET）速度  |
|------------------------------------------|-------------------------|---------------------------|---------------------------|-------------------------------------------|-----------------|-----------------|
| **Amazon S3**                            | $23.00                  | 約 $90.00                 | **約 $113.00**            | 5GBのストレージ、1GBの転送無料            | 約 182.5MB/s    | 約 60.1MB/s     |
| **Wasabi**                               | $5.99                   | 無料                      | **$5.99**                 | 30日間1TB無料                            | 約 75MB/s       | 最大 136.1MB/s  |
| **Backblaze B2**                         | $5.00                   | 約 $9.70                  | **約 $14.70**             | 10GBストレージ、30GB転送無料             | 小規模ファイルに優位  | 小規模ファイルに優位 |
| **DigitalOcean Spaces**                  | $5.00 （250GB含む）     | $15.00（追加750GB）       | **$20.00**                | $200クレジット（新規ユーザー向け）       | -               | 最大 1,500RPS   |
| **Linode Object Storage**                | $5.00 （250GB含む）     | $15.00（追加750GB）       | **$20.00**                | $100クレジット（新規ユーザー向け）       | -               | 高可用性で安定  |
| **Scaleway**                             | 約 $9.25                | 約 $9.25                  | **約 $18.50**             | 75GBのストレージ＆転送無料               | -               | -               |
| **Google Cloud Storage**                 | $26.00                  | 約 $108.30                | **約 $134.30**            | 5GBのストレージ、30GBの転送無料          | -               | -               |
| **Microsoft Azure**                      | $18.40                  | 約 $85.75                 | **約 $104.15**            | 5GBのストレージ＆転送無料                | -               | -               |
| **さくらのクラウド オブジェクトストレージ** | ¥4,950/月（約 $33.00）  | 無料                      | **約 $33.00**             | 1TBのストレージと転送が含まれる           | -               | 国内高速アクセス  |
| **NTT Com Cloudn オブジェクトストレージ** | ¥3,300/月（約 $22.00）  | ¥2/GB（約 $18/1TB）       | **約 $40.00**             | 100GBの無料転送枠                        | -               | 国内高速アクセス  |
| **IDCフロンティア オブジェクトストレージ** | ¥4,950/月（約 $33.00）  | ¥5/GB（約 $5.00/1TB）     | **約 $38.00**             | 10GBの無料転送枠                        | -               | 国内高速アクセス  |
コードが美しくなる: VSCodeのTomorrow Night Blueテーマの魅力

### はじめに

プログラミングをしていると、コードを書く環境の重要性を実感することが多いですよね。視覚的な要素は、集中力や作業効率に大きな影響を与えます。そこで、私が愛用しているのが**Tomorrow Night Blue**テーマです。今回は、このテーマの魅力と、なぜこれが私のお気に入りなのかを紹介します。

### Tomorrow Night Blueとは？

Tomorrow Night Blueは、視認性と美しさを兼ね備えた暗いテーマです。色のコントラストが良く、長時間のコーディングでも目に優しい設計がされています。特に、ブルー系の色合いが多く使われているため、洗練された印象を与えつつ、目の疲れを軽減してくれます。

![textmate-tomorrow-night-blue-syntax.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3246879/1e9f7836-3485-b254-8155-03b0d72b7fbf.png)
画像引用元https://github.com/phthhieu/textmate-tomorrow-night-blue-syntax
### 1. 目に優しい配色

暗い背景に青系の文字が映えるため、視認性が非常に高いです。コーディング中に目が疲れにくく、集中力を持続させるのに役立ちます。また、ハイライトされた部分も目に優しい色合いで、視覚的にストレスを感じません。

### 2. シンタックスハイライトの美しさ

Tomorrow Night Blueは、コードの構文を美しくハイライトしてくれます。関数名、変数、キーワードがそれぞれ異なる色で表示されるため、コードをスムーズに読み解くことができます。特に、エラーメッセージや警告も目立つため、コーディングのミスを見逃す心配が少なくなります。

### 3. カスタマイズの楽しさ

VSCodeはテーマを簡単に変更できるため、Tomorrow Night Blueを使いながら、さらに自分好みにカスタマイズする楽しみがあります。フォントやアイコンの変更、カラースキームの微調整を行うことで、まさに自分だけの開発環境を作り上げることができます。

### まとめ

Tomorrow Night Blueは、美しさと機能性を兼ね備えた素晴らしいVSCodeのテーマです。目に優しく、シンタックスハイライトも美しいため、コーディングの効率を大幅に向上させてくれます。自分好みにカスタマイズする楽しさもあり、ぜひ多くの人に試してみてほしいテーマです。次回のコーディングセッションでは、Tomorrow Night Blueを使って、より快適な環境でコードを書いてみましょう！
アンケート解析での重回帰分析

### はじめに

皆さん、アンケートを取るときってどんなことを考えますか？回答者が本音を言ってくれるかどうか、どんな質問が効果的か、さらには集めたデータをどう分析するか… そこで登場するのが、**重回帰分析**です！ 

### 重回帰分析とは？

重回帰分析は、複数の説明変数を使って、1つの目的変数を予測する統計手法です。例えば、アンケートで「満足度」に影響を与える要素（料金、サービス、施設の清潔さなど）を調べるときに使います。この分析を使うことで、各要素が満足度にどれだけ寄与しているのかがわかるのです。

### アンケート解析に重回帰分析が適している理由

1. **多角的な視点**  
   アンケートには、様々な質問が含まれています。重回帰分析を使うことで、複数の要因を同時に考慮し、どの要因が最も影響を与えているのかを明確にできます。まるで、探偵が様々な手がかりをもとに事件を解決するかのようです。

2. **数値での解釈**  
   重回帰分析の結果は、各説明変数の影響度を数値で示します。これにより、どの要因を改善すれば効果的なのか、具体的なアクションにつながります。たとえば、サービスの向上が満足度に大きな影響を与えているとわかれば、すぐに対策を講じることができます。

3. **予測力の向上**  
   重回帰分析を用いると、将来的な満足度やその他の指標を予測するのに役立ちます。データをもとにした予測は、まるで未来を占うかのように、組織の戦略をサポートします。

4. **因果関係の理解**  
   もちろん、重回帰分析は相関関係を示すだけではありません。どの要因が他の要因に影響を与えているのか、因果関係の理解にも役立ちます。これは、アンケート結果をもとにした意思決定において非常に重要です。

### まとめ

重回帰分析は、アンケート解析においてその能力を存分に発揮します。多角的な視点を持ち、数値的に解釈可能な結果を提供することで、効果的な戦略立案をサポートします。  
次回のアンケート結果を分析する際には、重回帰分析を実施してみてください。
あなたのデータ解析が、より深い洞察をもたらすこと間違いなしです！
PCファームウェアプログラミングをはじめよう (とりあえずHello World編)

これをビルドします https://github.com/tanakamura/my_firmware/blob/main/d945gclf_helloworld/

できた `rom` というファイルがファームウェアです。

これを焼きます。

https://www.amazon.co.jp/dp/B07W7RQ53X

このCH341Aとかいうのを用意します。

(本当はよくないです。CH341A は 5Vかけますが、SPI Flashに5Vかけるのは間違いらしいです。参考 : https://libreboot.org/docs/install/spi.html#do-not-use-ch341a 壊れたら困るマザボを使うときはやめましょう。raspi の spi などを使うとよいらしいです)

対応するマザーボードを用意します。ここで使っているプログラムは、D945GCLF(D945GCLF2でも可)とかいう今は売ってないマザーボードでしか動かないです。

PC ファームウェアプログラミングでは、マザーボード決め打ちでプログラムする必要があります。ハードルは高いですね。

(まあまだこれは特殊なことはしてないので、ich7 + smsc のsuperio積んでるマザボなら動く可能性ある)

CH341A のクリップで、SPI Flash をはさみます。D945GCLF2 の場合はここです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12877/d0ffd23e-cada-4636-79fd-4c71ec8c467a.png)

この写真でいう、1番と、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12877/fadc97eb-ab94-f236-eb5c-b99ee4719a90.png)


この写真でいう、丸が付いてる部分(左上)を繋ぐようにします。(線が赤く塗ってあるのでそれを目印にします)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12877/74190339-3461-a56a-db3d-6e2709ebc8ef.png)


うまく接続できていれば、 `flashrom` というプログラムで、SPI Flash ROM の中身にアクセスできます。

必ずバックアップをとります。

```sh
$ # original.rom というファイルに保存されます
$ sudo flashrom -p ch341a_spi -r original.rom
$ # D945GCLFの場合はチップ認識が自動でできないので指定がいる
$ # sudo flashrom -p ch341a_spi -r original.rom -c SST25LF040A
```

CH341Aのクリップはスーパー不安定なので、難易度は高いです。成功するまでクリップの接続をためしましょう。(CH341Aのクリップというかはんだ付けしてあるチップを外から挟もうというのがよくないです)

さっきビルドした`rom`を焼きます。

```
 $ sudo flashrom -p ch341a_spi -w -c SST25LF040A -l init.layout -i init:rom
```

(最後の64KiBに書けばいいだけなので、範囲を書いた`init.layout`というファイルを使って書く時間を短縮してます)


シリアルケーブルを繋ぎます。え？シリアルケーブル持ってない？ファームウェア開発では必須なので必ず用意してください。USB-シリアル変換でも可。


`minicom` などのシリアルが見れるプログラムでシリアルを見ます
```
 $ LANG=C sudo minicom -D /dev/ttyS0
```


電源ON。

```
Hello, World!
```

Hello, World! の文字が見れましたね！


https://qiita.com/tanakmura/items/2a631a3b81bf583bf4b3 解説
EfficientNetB3: おすすめの効率的な転移学習モデル

### はじめに

EfficientNetB3は、転移学習に適したニューラルネットワークモデルで、特に計算効率と精度のバランスに優れています。この記事では、EfficientNetB3の概要や特徴、実際の利用方法について紹介します。

### EfficientNetB3の概要

EfficientNetB3は、Googleが提案したEfficientNetファミリーの一つで、**少ない計算リソース**で**高精度**を達成するために設計されたモデルです。EfficientNetはB0からB7までの異なるサイズのモデルがあり、B3はその中で中規模のモデルに位置しています。

EfficientNetの設計では、モデルの**幅**（ニューロン数）、**深さ**（レイヤーの数）、および**解像度**（入力画像のサイズ）を適切にスケーリングすることで、パフォーマンスを向上させています。

### 特徴

EfficientNetB3は以下の点で優れています。

- **計算効率が高い**: モデルの計算量を抑えながらも高い精度を保つことができるため、大規模な計算リソースがない環境でも使用可能です。
- **高い精度**: 転移学習を用いることで、比較的少ないデータセットでも優れた結果を得ることができます。
- **適用範囲が広い**: 様々な画像分類タスクに対応しており、医療や産業分野でも広く使われています。

### EfficientNetB3のスケーリング

EfficientNetの最大の特徴であるスケーリングは、**幅（Width Scaling）**、**深さ（Depth Scaling）**、**解像度（Resolution Scaling）**という3つの要素を同時に調整することによって、最適なモデルサイズと精度を実現しています。

- **幅のスケーリング**: ネットワークの各レイヤーに含まれるフィルターの数を増やします。
- **深さのスケーリング**: レイヤーの数を増やして、より複雑な特徴を学習します。
- **解像度のスケーリング**: 入力画像の解像度を高くして、詳細な特徴を捉えます。

### 転移学習での利用

EfficientNetB3は、ImageNetのような大規模データセットで事前学習されています。これにより、少ないデータセットであっても、事前学習済みのモデルを**ファインチューニング**することで新しいタスクに適応できます。ファインチューニングでは、最終層を調整し、新しいデータセットに合わせて微調整するだけで高精度な予測が可能です。

### 実際の使用例

EfficientNetB3は、多くの画像分類タスクに使用されています。医療画像解析や産業分野での物体認識など、さまざまな応用がされています。実際に利用する際は、事前学習済みのモデルを用い、転移学習の手法でカスタマイズすることで、効率的に高精度なモデルを構築することができます。

### まとめ

EfficientNetB3は、**高効率かつ高精度**なモデルとして、転移学習に非常に適しています。特に、限られた計算リソースやデータセットで効果的に利用できる点が大きな利点です。画像分類タスクにEfficientNetB3を導入することで、精度向上と計算コスト削減の両方を実現することができます。
JITERAを使ってみた感想【AI開発エージェント】

## JITERAを使ってみた正直な感想【AI開発エージェント】
こんばんは。今日はJITERAというAI開発エージェントを使ってみた感想をざっくばらんに書いていこうと思います。

#### まずは、使ってみた印象
ぶっちゃけ最初は「AIでシステム設計、要件定義までできる？？本当かよ」って感じで半信半疑でした。けど、VS Codeの拡張機能としてサクッと使えるんで、軽い気持ちで試してみたんです。

使ってみての正直な感想は…結構すごい。いや、マジで。まだYouTubeのチャンネル登録者数が7人とかで「これ大丈夫？」って思ったんですけど、システム設計書を自動で生成する機能を使ってみたら、驚きました。これ、本当に革命的かも？って。

#### システム設計書の自動生成
これがJITERAの一番の売りです。ソースコードをポンッとインポートするだけで、システム設計書がAIによって自動生成されます。

具体的にはこんなものを自動生成してくれるんですよ：

データベース設計
ビジネスロジック
API設計書
「ドキュメント作成めんどくせぇ！」って人には最高です。正直、これだけでも試す価値あり。

#### JITERAの主な機能
使ってみて思ったのは、AIがただの補助じゃなくて、開発をガッツリサポートしてくれることです。以下の機能が特に印象的でした。

コード自動生成: 例えばFigmaのデザインデータをインポートしたら、それをもとにフロントエンドとバックエンドのコードを自動で生成してくれる。コード書く手間が省けるのはデカい。
AIチャット機能: 質問したり指示を出すと、AIがちゃんと応答してくれて、そのままコードを生成してくれる。なんだこれ、未来かよ。
リアルタイムサポート: コードを書いてる最中にサポートしてくれる。地味にこれがありがたい。
デバッグとエラー対応: エラーを見つけたら自動で修正案を提示してくれる。修正も勝手にやってくれるから、手間が省ける。
気になる料金プラン
無料で5ドル分のトークンが付いてきますが、正直消費が早いです。「無料でたくさん使いたいぜ！」って人にはちょっと物足りないかも。これ使い切ったらどうなるのか？料金については公式に問い合わせるしかないですね。月額プランとかあれば嬉しいんですが、詳細は不明。

#### ↓公式サイトはこちら

JITERA公式サイト JITERAサービス紹介
https://jitera.com/ja

https://jitera.com/ja/services

https://jitera.com/ja/works

https://www.youtube.com/watch?v=W-UiA1wfavA

https://www.youtube.com/watch?v=W-UiA1wfavA


#### 素朴な感想：CursolをやめてJITERAに乗り換えたい？
正直、今はCursolの有料会員をやめてJITERAに乗り換えようかと考えています。Cursolも悪くはありません。ちゃんと質問すれば、それなりに良い回答が返ってくるし、コマンド+エンターで全文検索ができるというのも大きな魅力でした。だからこそ、有料会員にしたんですが…。

ただ、使っているうちに、「本当に全文検索してるの？」と疑問に思うことが何度かありました。質問が荒かったり雑だったのかもしれませんが、返ってくる検索結果が完全に全文を見たものではないように感じることがあり、少し物足りなさを感じました。

#### ↓公式サイトはこちら
https://www.cursor.com/

そのタイミングでJITERAを試してみたんですが、確かにシステム設計やER図の生成など、高精度な部分もあります。ただし、まだ**「生まれたて」感が強いのが正直なところです。たとえば、Cursolではシンタックスハイライトがしっかり当たっていて**、コードが視覚的に確認しやすいですが、JITERAはその機能がまだ未対応。そこが若干「未完成」な印象です。

さらに、JITERAはもともとB2B向けのサービスとして、エンジニアとプロジェクトマネージャーをセットにして企業向けに提供しているように見えます。個人開発者向けやB2C向けはサブ的な位置づけなのかもしれません。だから、CursolのようなIDEとしてのポジションと完全に重なるかどうかはまだ分からないところがあり、少し様子見をしながら使っている感じです。

とはいえ、JITERAには大きな可能性があると思っています。ユーザーのフィードバックを反映し、さらに成長していけば、素晴らしいツールに進化するかもしれません。現時点では、どちらが最終的に自分に合うかは決めきれていませんが、JITERAの今後に期待しつつ、もう少し試してみたいと思います。



以上が私のJITERAを使ってみた感想です。少しでも皆さんの参考になれば幸いです。
iPhone の eSIM がつながらなくなって詰んだ時のメモ

今回はいつもとはちょっと毛色が違う記事です。
先日、iPhoneのメイン回線を他社キャリアに乗り換えました。その時に詰んでしまったことと、その解決方法です。

# eSIMの開通設定
キャリアからの開通手順のお知らせが届き、早速eSIMの開通設定を行い、無事、電話が繋がったので安心してた。
デュアルSIMでキャリアを切り替えたり、喜んで色々と遊んでいると、キャリアのインターネット通信ができなくなってしまった。
機内モードのオンオフ、端末の再起動でもダメ。

# APNの設定
以前つながっていたはずのキャリアのeSIMに切り替えてもダメ。
APNプロファイルをインストールしてもダメ。
（後からわかったのですが、APNプロファイルのインストールは不要なキャリアでしたww）

完全に詰んでしまった orz

どうしようもないので、諦めて、ダメもとで物理SIMに切り替えようとSIMの再発行手続きをして、モヤモヤした気持ちでしばらく過ごしていた。

# ドキドキの解決法
そういえば以前にも同様のことがあったような気がして、その時の記憶を搾り出して、対処法を思い出した。
「ネットワーク設定のリセット」だ。
でも、ネットワーク関係も色々設定してるし、解決できなかったらショックは大きい。リセットは勇気がいる。
ただ、リセットされると言っても自宅のWiFiのパスワードはすぐに再設定できるし、どこぞのカフェやホテルなどのWiFiパスワードも別に消えても大きな支障はないし、VPNの設定もいっぱいあるけど、今は使ってないものばっかりだし、えいっ！

ドキドキしながらリセットが完了するのを待って繋いでみると、繋がった！

リセットした後、VPNやインターネット共有の設定などは残っており、設定をし直したのはWiFiのパスワードぐらいだった。
無事解決し、被害もそれほど多くなかったのでよかった。
なぜ繋がらなくなったかは今だに謎で解せませんが、今度はすぐに対処法を思い出せるよう、本記事にメモっておきます。
apache の 755 権限はなんで 755 なのか調べてみた

apache を何回か触った時に、web サーバーのフォルダを 755 権限にしないとうまく閲覧できなかったりした記憶があったのですが、なんで 755 出なければいけないのか気になったので今更ながら調べてみました。

# 1. なぜ 744 だとダメなのか
web サイトでサーバーのフォルダ内のファイルを閲覧するだけなので、execution の権限はいらないのではないかと考えたのですが、以下にそれに関する内容が載っていました。

https://superuser.com/questions/168578/why-must-a-folder-be-executable

要するに、フォルダ内のファイルを閲覧するするために execution 権限も付与しないといけないみたいです。

```
# ディレクトリ構造
- dir
  - file    / 444

# dir に execution 権限がない場合
$ cat dir/file
cat: dir/file: Permission denied

# dir に execution 権限がある場合
$ cat dir/file
Hello World!
```

# 2. なぜ 711 だとダメなのか
（こちらはまだ調べきれてないです）
１．で述べたように execution 権限を付けるだけでディレクトリ内のファイルを読み取れるようになるので、read 権限はいらないのではないかと思いました。
それで read 権限をディレクトリに付与すると何ができるかを調べたのですが、以下のように ls などでディレクトリの中身を「読む」ことができるみたいでした。
```
$ mkdir tmp
$ chmod 555 tmp
$ ls tmp
.
..
```

これがなぜ apache プログラムにおいて必要なのかですが、あまり詳しく調べきれてないのですが
[こういうこと](https://www.sciencedirect.com/topics/computer-science/directory-listing) をするときに必要になるみたいでした。
全ての本試験合否から進級を予測！ロジスティック回帰で挑戦してみた結果…特異度100%、感度50%！

# はじめに
こんにちは。今回は、去年の本試験の合否データを使って、自分が今年進級できるかどうかを**ロジスティック回帰**で予測してみました。結果は**特異度100%**、**感度50%**。この数字、どういう意味か気になりますよね？ここではその内容と実験の流れを紹介していきます。

## 進級予測ってできるの？
進級がかかっているテストは、まさに人生の一大事ですよね。私たち医学生にとって、再試験の結果がどうなるかは神のみぞ知る…と言いたいところですが、**本試験の結果**を使って進級を予測できないか、ちょっと試してみました。

## データの準備
まず、去年の全ての**本試験の合否**をデータ化しました。  
これを説明変数（入力データ）として使います。各試験は**合格: 1**、**不合格: 0**という形でバイナリ化しました。そして、**進級できたかどうか**を目的変数（ターゲット）にしました。進級したら**1**、進級できなければ**0**です。

### データ例

| 試験1 | 試験2 | 試験3 | 進級 |
|-------|-------|-------|------|
| 1     | 1     | 0     | 1    |
| 1     | 0     | 1     | 0    |
| 0     | 1     | 1     | 1    |

このように、試験ごとの合否をバイナリで表現し、進級結果もバイナリにしてロジスティック回帰で分析します。

## ロジスティック回帰で予測！
ロジスティック回帰は、入力データをもとに**0か1か**の2値を予測するのに適しています。つまり、各試験の合否データから「進級できるかどうか」を予測することができるんです。

:::note info

ロジスティック回帰とは？
ロジスティック回帰は、分類問題に使われる統計モデルで、与えられた入力データ（説明変数）が、0 か 1（もしくは Yes か No、合格 か 不合格 など）の2つのクラスのうち、どちらに分類されるかを予測する方法です。

例えば、この実験では、本試験の合否結果をもとに、「進級できるか？」を予測しています。ロジスティック回帰の結果は、0から1の間の値として出てきますが、最終的にその値が 0 に近ければ「進級できない」、1 に近ければ「進級できる」という判断をします。

ロジスティック回帰の特徴は、「確率」で結果を表すことです。例えば、「70%の確率で進級できる」という形で、どちらのクラスに属する可能性が高いかを予測するための手法です。 
:::



### コードの簡単な説明

```python
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix, accuracy_score

# データの準備（ここでは仮のデータフレームを使っています）
data = {
    '試験1': [1, 1, 0, 1, 0],
    '試験2': [1, 0, 1, 0, 1],
    '試験3': [0, 1, 1, 1, 0],
    '進級': [1, 0, 1, 1, 0]
}
df = pd.DataFrame(data)

# 説明変数と目的変数に分ける
X = df[['試験1', '試験2', '試験3']]
y = df['進級']

# モデルを定義して学習
model = LogisticRegression()
model.fit(X, y)

# 予測
y_pred = model.predict(X)

# 結果の評価
cm = confusion_matrix(y, y_pred)
accuracy = accuracy_score(y, y_pred)

print("Confusion Matrix:")
print(cm)
print(f"Accuracy: {accuracy}")
```

このコードでは、試験の結果（説明変数）を使って、進級できるか（目的変数）をロジスティック回帰で予測しています。`confusion_matrix`で結果の評価もできます。

## 結果は…特異度100%、感度50%！
### 結果の意味
ロジスティック回帰の結果として留年の予測は、**特異度100%**, **感度50%**が出ました。


## 特徴量の重要さから見えた真実！「予備校の映像講義じゃ太刀打ちできない、大学独自の講座がリスクファクター」

ロジスティック回帰のもう一つの強みは、**各特徴量の重要度**を定量化できることです。つまり、どの試験が進級にどれだけの影響を与えているかがはっきりします。ここで驚くべき事実が発覚しました！

実は、**医学部生用予備校の映像講義で対策できる試験**ではなく、**この大学特有の講座**を落とした学生が、進級できないリスクが大きくなるという結果が出たんです。具体的には、**「大学独自のカラーが強い試験」**、つまり先生たちが強調する重要事項や、臨床現場を意識した内容が中心の講座を落とすと、留年リスクが急上昇するんです。

### どうやってわかったのか？
ロジスティック回帰で各試験の合否データを使って進級を予測した際、いくつかの科目が他に比べて非常に重みを持っていることがわかりました。これらの科目は、予備校の映像講義や過去問対策ではカバーしきれない内容で、先生たちの独自の考えや臨床経験が色濃く反映された講座だったんです。

つまり、**予備校の映像講義だけで対策していると、大学特有の試験で苦戦して進級リスクが大幅に上がる**ということが、データからもはっきりしたんです！

## まとめ
ロジスティック回帰を使って去年の本試験の合否から今年の進級を予測してみましたが、留年予測の結果は**特異度100%、感度50%**。進級できる人は完璧に予測できた一方、進級できない人は完全に当てるのは難しかったです。医学生ならではの進級予測ですが、データサイエンスの力を使えば、未来の自分の進級も予測できるかも？
【ReactHookForm】「型 'FieldError | Merge<FieldError, FieldErrorsImpl<any>> | undefined' を型 'XXX' に割り当てることはできません。」の解決方法

## 状況

ReactHookFormを使用してフォームを実装していたところ`errors`を子コンポーネントに渡す箇所で以下のような型エラーが発生しました。

```
型 'FieldError | Merge<FieldError, FieldErrorsImpl<any>> | undefined' を型 'FieldError | undefined' に割り当てることはできません。
  プロパティ 'type' は型 'Merge<FieldError, FieldErrorsImpl<any>>' にありませんが、型 'FieldError' では必須です。ts(2322)
```

## 原因

以下のように`useForm`に型引数を渡さず、かつ、`defaultValues`も設定していなかったため。

```ts
// ...
  const {
    register,
    handleSubmit,
    setError,
    formState: { isDirty, isSubmitting, errors },
  } = useForm({
    mode: 'onChange',
    resolver: zodResolver(schema),
  })
// ...
```

## 解決方法

`useForm`に型引数を渡すか`defaultValues`を設定する。

```ts:型引数を渡す
// ...
  const {
    register,
    handleSubmit,
    setError,
    formState: { isDirty, isSubmitting, errors },
  } = useForm<FormValue>({
    mode: 'onChange',
    resolver: zodResolver(schema),
  })
// ...
```

```ts:defaultValuesを設定する
// ...
  const {
    register,
    handleSubmit,
    setError,
    formState: { isDirty, isSubmitting, errors },
  } = useForm({
    mode: 'onChange',
    resolver: zodResolver(schema),
    defaultValues: {
      test: 'data'
    },
  })
// ...
```

## 参考

https://github.com/react-hook-form/react-hook-form/issues/8805
Oh My Poshを使用してプロンプトの見た目をカスタマイズ【bash】

前回の記事の続きです。

https://qiita.com/poyotanp/items/8832d2d081cdd8c8294f

今回はOh My Poshをインストールし、シェルプロンプトの見た目をカスタマイズする方法について解説していきます。

例えば、このようなプロンプトにカスタマイズしたり...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3901368/714d02e4-0116-bc2a-a2ff-e8199a09c1e8.png)

:::note
前回の記事でフォントの設定は行ったので、
この記事ではフォントについては触れません。
:::

# Oh My Poshのインストール
インストールは公式のシェルスクリプトを使えば簡単に行えます。
ターミナルに以下のコマンドを入力し、実行するだけで完了します。
```bash
$ curl -s https://ohmyposh.dev/install.sh | bash -s
```
インストール先のディレクトリを指定したい場合は、次のようなコマンドを使います。
```bash
$ curl -s https://ohmyposh.dev/install.sh | bash -s -- -d ~/bin
```

# Oh My Poshを適用
インストールが完了したら、次に`~/.bashrc`を編集してOh My Poshを有効化します。

まずは、vimで.bashrcファイルを開きます。
```bash
$ vim ~/.bashrc
```
Insertキーで挿入モードに入り、
ファイルの一番下に以下の行を追加します。
```bash
eval "$(oh-my-posh init bash)"
```

以下のようにOh My Poshの有効化に条件分岐を持たせることも可能です。

例:
```bash
if [ "$ENABLE_OMP" = "1" ]; then
    eval "$(oh-my-posh init bash)"
fi
```
自分はKonsoleのプロファイルに環境変数を設定し、
環境変数が設定されている場合のみ有効化すると言った感じに設定しています。

# Oh My Poshのテーマを変更

これでインストール自体は完了ですが、
デフォルトだと以下のようなテーマになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3901368/293fcf3c-ee9a-88a6-fca6-5ba7047e8e2b.png)

このテーマを変更していきたいと思います。

テーマは自分で1から作ることもできますが、
公式のテーマを以下のサイトからダウンロードして自分好みに改良するのがおすすめです。

https://ohmyposh.dev/docs/themes

今回自分は、この「atomicBit」というテーマを使用しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3901368/f3fc56d9-e8f8-ac1c-b16c-08e0993f6fe9.png)

テーマ名のところをクリックするとGitHubのページに飛ぶので、
以下の画像のように「Download raw file」をクリックすることでjsonファイルをダウンロードすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3901368/a83a1df7-8601-2b68-2c85-5133fb1dbc61.png)


テーマを適用するには、先程`~/.bashrc`に書いた`oh-my-posh init bash`の後に、
以下のように`--config`という引数を追加する必要があります。

```diff_shell
- eval "$(oh-my-posh init bash)"
+ eval "$(oh-my-posh init bash --config テーマのjsonファイルへのパス)"
```

例えば、自分の環境ではこのように設定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3901368/e2999d9b-f70f-137b-20f1-9da56477827b.png)

`~/.bashrc`を変更できたら、ターミナルを再起動するか、以下のコマンドでbashrcを最読み込みしましょう。
```bash
$ source ~/.bashrc
```

テーマの詳しい作り方については、公式ページでわかりやすく説明されています。

https://ohmyposh.dev/docs/configuration/general

# あとがき
今回はプロンプトの見た目をカスタマイズしました。
テーマを編集すれば、
例えばgitのブランチや状態などをプロンプト上に表示することもできます。
今回公式ページからダウンロードした「atomicBit」というテーマにもデフォルトでブランチ表示機能がついています。

今回の記事もちょっと急いで書いた記事なので、もしかしたら誤字脱字などがあるかもしれません。
ミスなどを見つけたらコメントで教えてもらえると幸いです。
では、また次回の記事で〜！
「生成AIをめぐる競争」ディスカッションペーパーについてのメモ

「競争」に焦点をあてた公正取引委員会によるディスカッションペーパーの内容についてのメモです。
https://www.jftc.go.jp/houdou/pressrelease/2024/oct/241002_generativeai.html

「第一章：はじめに」について
ここでは、このペーパーが、生成AIの競争上のリスクが発展を阻害し、社会への恩恵を減少させる可能性があるため、競争政策上の論点を整理することを目的としていることを説明してます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/40bfdc5c-848b-dd98-4593-9ccf16dd7bc6.png)

「第２章：生成AI関連市場の市場構造」について
生成AIは、特定のタスクや分野に特化したAIモデルを利用して提供されるアプリケーションやサービスの総称であることが示されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/70765b8d-9d82-3fdf-2df8-092899c80abd.png)

下図はディスカッションペーパーからの引用です（PDEの4ページ目より）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/102de3d9-1cec-40d6-189f-8cf7f76af4f6.png)
PowerAutomateでエクスポートしたファイルのリンクを変数で取得する方法

今回の記事はこちらの続きになります。
未読の方は是非合わせて読んでみてください。
[PowerAppsのギャラリーをCSVでエクスポートする方法【PowerAutomate】](https://qiita.com/hedaozhenye/items/f86136bd99631ed2f405)

## この開発を行った経緯
PowerAutomateを使用して作成したファイルのパスの作成は本来「パスによるファイルコンテンツの取得」のアクションを使いファイルの作成から動的なコンテンツを参照することで使うことができると考えていました。
開発の時間はありましたがとりあえず動くものを作りたかったので、力業でリンクを作成することになったためこの開発に取り組みました。

## 作成したファイルのURLの解析
今回のゴールは、「作成したファイルのリンクをメールに添付してユーザーに送信すること」でした。なので実際にSharepointの画面で作成されたファイルからリンクのコピーを行い確認することで、それと同じものを作成することができればとりあえずの目的は果たせると考えURLのコピーを行いました。
実際のURLを確認すると下のような構成になっていることが確認できました。
```
[サイトのアドレス(base)][フォルダのパス(path)][ファイル名(path)][?d=w(query)][Eタグの値の一部(tag)]
```
リンクがこのような5つのパーツで構成されていることが分かったため「これは変数にそれぞれのパーツを定義して最後につなげれば行けるんじゃないか？」と考え実際の作業に入りました。

## 変数の作成
先程の項でリンクが5つのページに分かれていることが明らかになったのでここからURLを作成するための文字列を定義していきます。
まず簡単に定義できるものとして、[サイトのアドレス]と[?d=w]は動的なコンテンツを使用しなくても定義できるため「変数を初期化する」のアクションを使用し定義しました。

次に[フォルダのパス]と[ファイル名]は動的なコンテンツのpathの項目を使用することで定義することができます。
しかし注意点として、pathに半角スペースが入っている場合はリンクでは"%20"といった値に書き換わっていることがあります。その場合はreplace関数を使用して使っている環境に合うように調整しましょう。
値の部分にこのように数式を入れてあげることで解決できると思います。
```
replace(outputs('ファイルの作成')?['body/Path'],' ','%20')
```

最後にEtagの部分ですが、これも動的なコンテンツから参照することができます。
"Etagは{00000000-aaaa-1111-bbbb-123456789abc},0"のような形で出力されますが必要なのは{}の中の値だけなので次のような数式を使い必要な部分だけを抽出します。
```
toLower(split(split(outputs('ファイルの作成')?['body/ETag'],'{')?[1],'}')?[0])
```
## リンクの作成
ここまでの作業で必要な要素を準備することができたので、いよいよリンクの作成に入ります。
新しく「変数を初期化する」のアクションを使用し今まで準備したものを次のような数式で結合します。
```
concat(variables('base'),variables('path'),variables('query'),replace(variables('tag'),'-',''))
```
これを行うことで力業ですがリンクの準備ができました。
あとは動的なコンテンツとしてメールに添付をすることで、エクスポートしたファイルのリンクをメールで通知することができます。
ダウンロードしたCSVファイルの自動文字化け対策ツールを作ってみた。

# 概要
MySQLWorkbenchでCSVファイルをダウンロードすると、文字コードがBOM無しのUTF-8のため、エクセルで開いたときに文字化けしてしまうことがあります。
ダウンロードしたCSVファイルの文字コードを自動でBOMを付けるツールを作成しました。

# ツール作成方法
1. 各種コマンドをインストール
    ```
    brew install fswatch
    brew install nkf
    ```

2. 下記のファイルを作成
    ```shell:watch_csv.sh
    #!/bin/bash
    
    file_name=""
    
    # スクリプトのプロセスが既に実行中かどうかを確認
    if pgrep -f "$(basename "$0")" > /dev/null 2>&1; then
        exit 1
    fi
    
    # ~/Downloads フォルダを監視
    fswatch ~/Downloads | while read event; do
        # 最新のCSVファイルを取得
        new_file=$(find ~/Downloads -type f -name "*.csv" -print0 | xargs -0 ls -t | head -n 1)
    
        # 前回処理したファイルと同じ場合、スキップ
        [[ "$new_file" == "$file_name" ]] && continue
    
        # CSVファイルをUTF-8-BOMに変換
        nkf --overwrite --oc=UTF-8-BOM "$new_file"
    
        # 処理済みのファイル名を保存
        file_name="$new_file"
    done

    ```

3. zshrcにコマンドを追加
    ```
    vi ~/.zshrc
    ```
    ```:.zshrc
    bash ~/watch_csv.sh &
    ```

# 補足

- `fswatch`コマンド
`fswatch`の`read event`は、ファイルが追加、編集された際にスクリプトを実行します。ファイルが編集された場合にもイベントを検知してしまうため、スクリプト内では、すでに処理済みのファイルが再度実行されないよう工夫しています。

- `find`と`xargs`の連携
`find`で指定したフォルダ内のCSVファイルをリストアップし、`xargs`でその結果を`ls`に渡して最新のファイルを取得しています。
恐らくWindowsUpdateにガチで殺されかけた件

# やつは突然やってきた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557059/64319df8-06a2-d026-7d17-8cf375587e44.png)

sshで適当なサーバーにつなげようとコマンドたたいたら出てきた恐怖アラート、当然ssh接続できるわけなく戦慄しました。

# これはなんのメッセージ？
実はこんな感じのエラーはgcc関連で一度お目にかかってるのでDLLファイルの依存関係なんだろうなっていう予想は立ちました。 BN_set_flags っていう名前のオブジェクトが見つからないよっていう話なんだろうなって、ただそいつはどのファイルにあるのって話

# 思い当たる節が
事件の朝、起きてPCの画面を見たらロック画面。当時の私は「またWindowsUpdateか」って思いましたが、まさかこのような事態になるとは

# とりあえずぐぐる
https://docs.huihoo.com/doxygen/openssl/1.0.1c/crypto_2bn_2bn_8h_source.html

ここにありました、で戻るとcryptoなるプロジェクト名？ファイル名？で作成されてるところまでわかるのでおそらく慣例で"libcrypto.dll"とか"crypto.dll"って感じのファイル名なんだろうなって予想はつきます。
あとは探してなかったらダウンロードするだけの簡単な話、だったのですが

# あるやんけ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557059/21cf6def-b25b-cd99-0a44-fb05080facd0.png)
同じディレクトリ上にあって草
いやこいつ偽物なのか？って思ってデコンパイルとかして中身調べようとしたのですが、あまりにもめんどくさいので却下。別の方法をとってみることにしました

# OpenSSH再インストール
とりあえず最初にやるべきことだった。Windows標準の設定から行いましたが効果なし

# whereコマンドでdllファイルを探す
もしかしたら同じディレクトリにあるdllではなく別のdllを参照してるのではないかと疑ってwhereコマンドで調べてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557059/f8d3e7bd-bbcf-77ec-1044-a295c7b6c74b.png)

やはりか、って当時の私は某探偵アニメの毛利小●郎みたいに推理を決めたのでした。そしてこの問題を解決するために環境パスの優先順位をいじりましたが

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557059/64319df8-06a2-d026-7d17-8cf375587e44.png)

変わらず...

# 更新日時
実は答えにつながる決定的なヒントは隠した私なのですが、ここで当時の私はとあることに気づきます。
C:\Windows\System32\
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557059/c15cafe4-ae95-4183-6e20-d3049e4e3d65.png )
うん？
C:\Windows\System32\OpenSSH\
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557059/19551108-8c46-66fe-e164-e9151cd5ed4e.png)

System32配下にあるファイルの方が新しい...?

そして新しい方の日付がWindowsUpdateを行ったとおぼしき日時と合致してるような

# DLLの優先順位
https://t-s-s-i.hatenadiary.org/entry/20070828/1188902981

https://learn.microsoft.com/ja-jp/windows/win32/dlls/dynamic-link-library-redirection

DLLファイルの読み込みには当然優先順位があります。
そして開発で自作したDLLファイルをどうするかを考えれば当たり前のことなのですが最初に読み込まれるのは実行アプリケーションと同じディレクトリにあるDLLファイルです。つまり環境変数いじるパートは全くの無意味な上に見当違いだったわけですね。

# 解決策
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557059/9dcffa94-cf71-dd71-a6c6-babf80246674.png)
消しました

System32配下のdllファイルも読み込み対象なので問題ないと判断したからです。

結果は
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557059/a353a432-8f03-e0dc-ae0f-881530fd8e55.png)

やった、治った

# 残る疑問
やはりWindowsUpdateでシステムファイルが書き換わったのが原因であるのは間違いないようですが、問題は再インストールしたOpenSSHの更新日時が2021となんかめちゃくちゃ古い点

https://qiita.com/Brutus/items/19b6f088ba2acacf1608

こういうのが最近あったばかりなのでWindowsUpdate経由で更新されるはずなのですがされてないのは非常に謎

と記事を書く前は思ってたのですが、記事を書きながらOpenSSHフォルダを見返したらexeは全部10/9だったんですよね。

これ、**私のせいか？**
相手によって変わってくるシステム構成図

# その資料は誰のため？

どんなプレゼンテーション資料にも言えることですが、何らかの資料を作る以上は、その資料は**誰に**向けたものなのか、**何をどこまで**伝えたいのかは、作成する前に最低限考えるべきポイントです。

- **誰に**向けたものなのか
  - 対象者の背景知識や専門性のレベルは？
  - 彼らの興味・関心事は何か？
  - どのような立場や役割の人々か？

- **何をどこまで**伝えたいのか
  - 伝えるべき核心的なメッセージは何か？
  - どの程度の詳細さが必要か？
  - 時間や空間の制約はあるか？

ターゲットとなる相手が理解しやすい資料であれば、その先の **「考えてほしいのか」** **「どんなアクションを取ってほしいのか」** などが続くことになりますが、その前提として **「誰宛に」「何を」** がまず大事です。


:::note warn
まじめな書き出しとなっていますが、以下、若干ネタ的な記事になります。
:::

## 簡単なシステム構成図を例に

例として、既にお客様がクラウドのオブジェクトストレージを利用しているとします。そのお客様に対して、現在のセキュリティ設定は安全です、セキュアな構成です、というメッセージを伝えたいとします。
そこに、簡単なシステム構成図を資料に含めます。

システム構成図と言っても、AWSのAmazon S3、AzureのAzure Blob Storage、Google CloudのCloud Storage を使っているだけのシンプルなものです。

### その１．非IT技術者のお客様向けの構成図

![systemconf1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204490/da91ab94-596a-f8f3-c894-b1e223ee7479.png)

説明先のお客様が、３つのクラウドをまるで自社のデータセンターのようにイメージしておられる場合だと、**「クラウド環境（データセンター群）」** みたいな表現でお客様に寄せています。

どのクラウドも、インターネット上の悪意ある攻撃から守られていて、セキュアな環境にありますよ、ということをメッセージするための構成図です。

なんじゃこりゃ！？そう思ったあなたは、どっぷりIT技術者ではないですか。


### その２．実態に近いシステム構成図

![systemconf2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204490/e02f7ec8-927e-0745-01ac-0f855bdcc845.png)

で、こちらが実態に近いのシステム構成図です。
お客様向けの資料と全然違いますよね。

インターネット上の悪意ある攻撃は、お客様のロケーションとは直接関係なく、クラウドを攻撃します。それを確実な設定やサービスで守る必要があるわけです。そうなりますよね。改めて説明するまでもなく、**クラウドって、インターネット上にあるわけですからね！**
（正確には、クラウド事業者によってはインターネットに見えているプライベートネットワークの場合もあります　[AWSの例](https://tech.nri-net.com/entry/2021/05/10/085654)）

あらためてお客様向けの資料と見比べると、どうですか。最初の資料が、実態と乖離した不正確な構成図だなぁ、と思ってしまいますね。

ですが、正確なシステム構成よりも、セキュアであることをメッセージしたいだけの場合は、最初の図でもいいんです。


## IT技術者が作成する資料

どうしても正確に書きたくなりますよね。
分かります。そうですよ。技術者ですから。
詳細に、正確に、完璧に、最新化して、すべてをきれいに網羅して、、

でも説明する相手にとって「不要」であり「過剰」であると判断されるのであれば、大胆に省きましょう。大胆に書き換えましょう。

冒頭に書いたように、**「誰宛に」「何をどこまで」** を意識することで、確実に伝えたいメッセージが目立って伝わるような資料を、一緒に心がけていきましょう。
【SIer必見】AsciiDocとPlantUMLでドキュメント作成環境を作った

## これは何?

Asciidoctor（AsciiDoc）は、特に技術文書やプロジェクトドキュメントの作成でよく使用されるマークアップ言語です。Markdownよりも柔軟な表現ができる一方で，html等よりも記述が簡単であり，htmlやpdfとしてexportすることもできます。
しかし，意外と環境構築が面倒です。

この記事ではDocker/DevContainerを使ってすぐにAsciiDocをbuildできる環境を作成しました。

---

## AsciiDocとは

- Asciidoctor（AsciiDoc）は、特に技術文書やプロジェクトドキュメントの作成でよく使用されるマークアップ言語の一つ
- markdownよりも表現力がある一方で，HTMLような高い表現力

自分の記事ではないですが，このQiitaがわかりやすかったので貼っておきます。

https://qiita.com/xmeta/items/de667a8b8a0f982e123a#-%E3%81%AA%E3%81%9Casciidoc%E3%82%92%E4%BD%BF%E3%81%86%E3%81%AE%E3%81%8B

---

## ビルド方法の歴史

もともとは[asciidoctor](https://github.com/asciidoctor/asciidoctor/blob/main/README-jp.adoc)というRuby製のツールを使ってビルドを行うのが一般的でした。
しかし，関連ツールの依存性を解決したりPlantUMLと連携することを考えるとコマンドがとても長くなってしまいます。
そこで，[Asciidoctor Gradle Plugin](https://asciidoctor.org/docs/asciidoctor-gradle-plugin/)が作成され，build環境を整えやすくなったという歴史的背景があるようです。
そのため，本記事でもGradleを使ってbuildを行います。

---

## AsciiDocをビルドしてみる

[今回作成したサンプルリポジトリ](https://github.com/RyosukeDTomita/asciidoc_env)ではDockerでBuild環境を整えました。詳しくはこちらをご覧ください。

::: note info
VSCodeのDev Containerについてはスペースの問題上割愛します。
Dev Containerについては

https://qiita.com/sigma_devsecops/items/79db1640d1a1cd82343d

を参考にしてください。
:::

```dockerfile
FROM gradle:8.10.2-jdk17-jammy AS devcontainer
WORKDIR /app

RUN apt-get update -y

RUN <<EOF bash -ex
apt-get install -y --no-install-recommends libxext6 libxrender1 libxtst6 libxi6
rm -rf /var/lib/lists
EOF

CMD ["gradle", "asciidoctor"]
```

```shell
git clone https://github.com/RyosukeDTomita/asciidoc_env
cd asciidoc_env
docker buildx bake
docker compose up # ./build配下にhtmlが作成される。
```

前述したようにビルドにGradleを使うのでGradleイメージをベースイメージに使用しています。
また，PlantUML作って作成したシーケンス図等を埋め込むため，必要なツールをインストールしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/eaf4c63c-b0e6-247d-adfd-3da639d6d5c0.png)

最低限の構成だとこんな感じになります。テーマ等もカスタマイズ可能なので，Orilly用のテーマとか探してみても面白いかも。

---

## 追記

日本語が重なる場合には日本語フォントをいれると解決できた。

https://qiita.com/yomon8/items/a3e016b7ffc3e4fbb7e5
Salesforceリストビューの検索条件で「$USER」を使う

# はじめに  
現在ログインしているユーザーを条件にリストビューを絞り込みたい時ありますよね?  
例えば数式項目をリストビューの検索条件として使用する下記のような方法もあります。  
* 数式の戻り値のデータ型をチェックボックスとして「ログイン中のユーザーIDが○○と同じ」場合にtrueを返す。  
* 数式の戻り値のデータ型をテキストとして「ログイン中のユーザーID」を返す。  

しかし、`$USER`を使用すれば数式項目は不要です😎  

## 検証してみた
### 前提条件
3つずつ最終更新者が違うレコードを用意してみました。  
* 1つ目： 確■ユ■ザ  
* 2つ目： 管理者 ユーザー  
* 3つ目： 検証ユーザ  

![listview_all.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772806/ad2bd8d1-c35c-601e-d03b-2dd3970721a1.png)

### 検索条件を設定
検索条件を下記に条件を設定します。  
* 項目：  
  * 最終更新者  
* 演算子：
  * 次の文字列と一致する  
* 値：
  * `$USER`

![listview_filter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772806/81cf3a0d-d3cd-e5a0-2ae4-7a79b1d571b5.png)

### 各3ユーザーにログインして確認

#### 1つ目：確■ユ■ザでログイン
確■ユ■ザが最終更新者のレコードのみ表示されています。  

![listview_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772806/51a81879-628c-23aa-d577-bf8aef0cd064.png)

#### 2つ目：管理者 ユーザーでログイン
管理者 ユーザーが最終更新者のレコードのみ表示されています。  

![listview_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772806/774bdfcc-d98b-4e83-88de-67dca0241010.png)

#### 3つ目：検証ユーザでログイン
検証ユーザが最終更新者のレコードのみ表示されています。  

![listview_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772806/af2f531c-39bf-cae8-8cbb-cc4986e1de93.png)

## さいごに
とても便利な機能ですね！
Nuxt.jsで静的サイトを作り、Github Pagesにデプロイする

# Nuxt.jsで静的サイト実装

Nuxt.jsでプロジェクトを立ち上げる
```
npx create-nuxt-app my-project
```
設定を適宜行い、ページを実装する。

# GitHubPagesに適したパスの設定

```nuxt.config.js
  router: {
    base: "/{リポジトリ名}/",
  },
```
GitHub Pagesがホストする静的サイトの正しいルーティングを行うために必要。

# 静的ファイルの出力先の設定
```nuxt.config.js
generate: {
  dir: 'docs'
}
```
nuxt generateを行って生成される静的ファイルの出力先を設定する。
GitHubPagesではブランチのrootかdocsを指定することができるのでdocsとする。

# docsディレクトリ生成
`npm run generate`を実行するとroot配下にdocsディレクトリができ、その中にindex.htmlなど静的ファイルが生成される。

# GitHubからサイトの確認
作成したリモートリポジトリに実装した内容をプッシュしたあと、
Settings→PagesからBranch項目のmasterのdocsを選択する。
gh-pagesというブランチを作ってそっちでrootかdocsを選択しても良い。
今回はmasterブランチのままdocsというディレクトリを作って静的ファイルをそこに入れたためその指定とする。

`Your site is live at サイト名` と上に表示されるので、そこからアクセスして表示確認。
【個人開発mini.vol1】食品ロスをなくしたいのでまずはミニアプリを作成！

# はじめに
はじめまして。
2024年3月よりプログラミングスクールRUNTEQに通っている、わーちゃんと申します。
未経験からのWebエンジニア転職を目指して、学習を続けております。
今回スクールの卒業制作とは関係ありませんが、ミニアプリを作成しました。
#### ▶サービスURL：[野菜保存の泉](https://vegetable-preservation.glitch.me)
#### ▶Github：[リポジトリ](https://github.com/canopus222/vegetable-preservation)

![喜びと野菜](https://cdn.glitch.global/ab084784-c4a3-4722-80d0-0643af950a89/dbd961c9-c81c-4b8a-a12b-620900a2550a.%E5%96%9C%E3%81%B3%E3%81%A8%E9%87%8E%E8%8F%9C.jpg?v=1727744546830)


## 開発した理由
- 使う人によっては、時には魔の巣窟になるうる冷蔵庫。
- 賞味期限や消費期限が記載されている商品は、商品記載内容の通り適切に保存すればいいのですが、野菜は季節や状態によって保存方法が少し異なる。
- つまり、野菜は保存方法が難しい。
- 何も知らないで野菜を保存して腐らせてしまう前に、ゲームを通じて少しでも使いかけにした野菜の保存方法に興味関心を持ってもらい、食品ロス削減につなげたいと考えた。

## 使用技術と選定理由
| カテゴリー     | 使用技術                                                                            | 
| -------------- | ----------------------------------------------------------------------------------- | 
| フロントエンド | HTML (Hypertext Markup Language)<br>CSS (Cascading Style Sheets)<br>JavaScript (JS) | 
| 開発環境       | Glitch（ホスティングと開発プラットフォーム）                                        | 
| インフラ       | Glitch（サーバーを運営する環境）                                                    | 

- ミニアプリ作成は今回が2度目ですが、1度目の作成ではただボタンをクリックすると色が変わるだけのアプリとも言えないアプリを制作しました。
- 2作品目？の今回はページ遷移の流れなどをより理解した状態、かつコードの意味もある程度理解した状態での挑戦になりました。
- GlitchではNode.jsやReact、SQliteを使用して作成することもできますが、フロントエンドの基本的構造を理解したかったので、ベーシックなwebsiteを作成できる「glitch-hello-website」を選択しました。（css、js、htmlの構造）


## 頑張った点やこだわった点
- GithubとGlitchとの連携は個人的に地味に頑張った点。
- こだわりは「はい」と「いいえ」をアイコン表記にすることで見た目から楽しんでもらえるようにした点
- 問題1つ1つに対してファイルを作成して、どの問題がどのファイルにあるかわかりやすいようにした。
- 一つのファイルに問題をまとめて、引っ張てくるように設定することも可能だったが、細かく分けることのメリットデメリットを把握したかった


## 今後の展望
- バックエンドをつけたもので再開発
- ユーザー登録機能。賞味期限、消費期限を簡単に把握できるもの
- 食材の保存方法に関する情報を増やす

## おわりに
1作品目とは違い、今回の2作品目ではちゃんとした形のミニアプリを作成することができてよかったです。
ミニアプリを利用してくださったからありがとうございます。この場を借りて改めて伝えたいと思います。
技術力向上のためにもミニアプリ制作は続けていきたいと考えています。

https://school.runteq.jp/social_portfolios/wak_128
【個人開発mini.vol2】日本文化を伝えたいと思ったのでまずはミニアプリを作成！


# はじめに
はじめまして。
2024年3月よりプログラミングスクールRUNTEQに通っている、わーちゃんと申します。
未経験からのWebエンジニア転職を目指して、学習を続けております。
今回スクールの卒業制作とは関係ありませんが、ミニアプリを作成しました。

**▶サービスURL：[mosaic-japan-culture](https://mosaic-japan-culture.glitch.me)**
**▶Github：[リポジトリ](https://github.com/canopus222/mosaic-japan-culture)**

![Mosaic Japan Culture](https://cdn.glitch.global/cf4d2441-d52f-444c-848a-1a7d7c967fff/08dfad83-2551-4539-861b-8554fed98685.mosaic-japan-culture.png?v=1728535098745)


## サービス概要と開発した理由
#### 概要
- 日本の文化に関する写真をモザイクをかけて出題。手がかりを元に何の写真かを当てるゲームです。
#### 開発理由
外国の方と触れ合う機会が多くなっている昨今、私自身海外の方とお話をしてみたいと感じる時がありました。
話すきっかけとなるものについて考えた時、互いの文化を話すことができたら素敵だなと思いましたが、日本の文化や食べ物について名前は知っているけど、背景・概要まで含めた部分に関する知識が皆無でした。
私と同じような状況の方は少なからずいるのではないでしょうか。
ミニアプリを通じて、楽しみながら日本文化への理解と興味関心を持っていただきたいと思いこのミニアプリを開発しました。


## 使用技術と選定理由
| カテゴリー     | 使用技術                                                                                                                 | 
| -------------- | ------------------------------------------------------------------------------------------------------------------------ | 
| フロントエンド | HTML (Hypertext Markup Language)<br>CSS (Cascading Style Sheets)<br>JavaScript (JS)<br>JSON (JavaScript Object Notation) | 
| 開発環境       | Glitch（ホスティングと開発プラットフォーム）                                                                             | 
| インフラ       | Glitch（サーバーを運営する環境）  | 

- 2作品目に引き続きGlitchとフロントエンドで開発
- フロントエンドでどこまでできるのか。Githubのフォークのような機能（Remix）を試して自分のプロジェクトに落とし込んだ後、どこまで調整できるかを試したかったので再びGlitchを使用しました。
- 2作品目では問題ごとにファイルを作成していましたが、問題は1つのファイルにまとめて、そこから引っ張てくる形の表示にするためjsonを使用しました。


## 頑張った点、こだわった点
- なじみのある日本文化内容の選定と英文表記。
- フォークしてきた段階では問題表示のページだけだったが、トップページを設けて遷移する形とした点。


## 今後の展望
- 日本文化をカテゴリ分けにして問題を作成してみたい
- 日本という広い枠から都道府県ごととかにカテゴリ分けしてみたい
- 英語と日本語の切替ができるようにしてみたい


# 最後に
今回Glitchを使用して2作品目（正確には3作品目）を作成し、純粋にミニアプリ開発が楽しいと感じています。
はじめにフロントエンドやバックエンドの話をきいたときは「？」の状態でしたが、2024年3月から学び始めて10月に入ったこの段階で理解が追い付いた感じです。
引き続き技術力向上に向け精進していきたい所存です。
このミニアプリを利用してくれた方にはこの場を借りて、ありがとうございます。
【個人開発mini.vol3】診断アプリパパスキルまずはミニアプリを作成！

# はじめに
はじめまして。
2024年3月よりプログラミングスクールRUNTEQに通っている、わーちゃんと申します。
未経験からのWebエンジニア転職を目指して、学習を続けております。
今回スクールの卒業制作とは関係ありませんが、ミニアプリを作成しました。

**▶サービスURL：[Papa Skill Check](https://papa-skill-check.glitch.me)**
**▶Github：[リポジトリ](https://github.com/canopus222/papashindan_glitch)**

![Papaskillcheckreadme](https://cdn.glitch.global/acdfe30f-e98e-4661-b72e-b710b7879b96/f0425aa1-82b8-49a5-bfcb-f06ce3e6b2b6.PSC%20(2)readme.png?v=1728558382578)


## サービス概要と開発した理由
#### 概要
5つの設問に「はい」「いいえ」で答えることで現段階での父親度を客観的にみてみるサービスです
> 
> 個人的見解を含みます。あくまでゲームですので寛大な心をもち結果を見てください。

#### 開発理由
ママサイトの記事や漫画を見ていると結構パートナーに不満等様々な思いを抱えて生活されている方が多いことを知ると同時に、私の近しい人もどうやって相手に伝えるか、結構試行錯誤しているのを見て、うまく相手に伝える方法はないものか、と考えていました。
なので、まずはこのサービスを利用し、客観的に、第三者からどう見られているのかパートナーが把握することで何かいい方向に変化すればいいなと思いこのサービスを作成しました。


## 使用技術と選定理由
| カテゴリー     | 使用技術                                     | 
| -------------- | -------------------------------------------- | 
| フロントエンド | HTML<br>CSS<br>JavaScript                    | 
| API            | Intent API                                   | 
| 開発環境       | Glitch（ホスティングと開発プラットフォーム） | 
| インフラ       | Glitch（サーバーを運営する環境）             | 

- 診断アプリを作成したかった。
- 結果をシェアできるような実装を試したかった。
- Glitchでどこまでできるのかを知りたいという興味。
- フロントエンドをもっと深ぼりたい


## 頑張った点、こだわった点
- 診断結果をツイッターでシェアできる機能を実装した点。
- はいといいえの数で診断結果が変わるような実装した点。

## 今後の展望
- 私が作成した設問ですが、ユーザーごとに自分で設問又は回答を作成できるようにしたい

## さいごに
はじめて診断アプリを作成するにあたり、バックエンドを使用しないといけないのかなと不安でしたが、いい感じにフロントエンドだけで制作することができてよかったです。
もともとこちらのミニアプリはRubyを使用し開発していたものになります。Rubyでバックエンドを使用した場合とコードの書き方が若干違う事を知ることもできてよかったです。
こちらのアプリの利用者はまだ指で数えられる程度かと思いますが、使用してみてくださった方にはこの場をかりてありがとうございます。
ジオメトリノードで　カメラからの深度で押し出ししたメッシュを作成する

最近 ３Dスキャナや生成AI等の手段で　奥行の画像を得る手段が増えてきました
GeometryNodes深度（デプス）画像を元にメッシュを得る方法を少し書き残しておこうかと思います
Blender4.2での内容になります

## 深度画像の用意
まずはテストのための深度画像を用意する方法を簡単に触れておきます

ビューレイヤプロパティのZのパスをオンにしてレンダリングすることで作成します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/b791ab1d-cd95-0563-ae7f-ad97f6275e0e.png)

深度のデータを浮動小数点で保存するために**OpenEXR**形式で保存します
ノード補助のアドオン「Node Wrangler」を利用しているなら
コンポジットのビューアーのノードに
サイドバーに「この画像を保存」(Save This Image)のボタンが追加されていて　ビューアーで利用している画像を簡単に保存できます。

## ジオメトリノードでの変形
まずは 深度画像でメッシュを歪めてみます
メッシュプリミティブの「グリッド」で作成した平面を歪めています

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/a645a048-ec57-08ee-30b7-3aeed487d2fd.png)

**グリッド**は指定した数の格子状のメッシュでUVマップには均等に分割したUV座標が出力されています
画像テクスチャのベクトルに入力することで　UV値に対応した深度の値を取得できます
移動させたい方向を表すベクトルと乗算し　**位置設定**で頂点を移動させています

::: note
ベクトルがZ -1としたのは　平行投影した時に下向きに見るのと
Blenderのカメラの初期値が　Zのマイナスを向く方向になっているためです
:::

これをカメラからの見た目の座標軸に変換すれば　深度に応じたメッシュにすることができます
## カメラ座標への変換
グリッドのプリミティブは初期状態だと原点上のXY平面上に大きさ1の平面を作るので
その位置のベクトルをｰ1して仮想の平面としたものに深度を掛けると原点を基準とした三角座標に変形できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/b8ae097f-da1c-1311-c70e-75bc612f52e1.png)
これを任意の方向を向いたアクティブカメラの位置や回転の情報に合わせるとこうなります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/70157569-2143-04ec-ce8d-09800ff7d5f3.png)
この時点ではカメラの縦横比や画角は考慮されていませんので

さらに縦横比の補正や　画角の計算を入れるとこうなります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/4fba7dc1-c731-cd6a-057a-4a4ee58dbc8e.png)
横長画像の場合　比率に合わせて縦を縮める形になり
画角の数値に応じて　縦横を拡縮しています

さらに縦長構図や　画角の指定を焦点距離と角度の切り替えに対応させてグループ化すると こんな感じです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/1a7d79c9-75db-4ea0-26ca-e2f4d26120e7.png)
これでは画像の縦横の解像度を手入力していますが
入力＞定数の「画像」ノードと　入力＞シーンの「画像情報」のノードを使うと自動縦横は取得できるので
画像解像度はノード内部で設定してしまってもいいかもしれないですね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/e04ec3a7-a7e7-d42f-9dd6-1104307991fe.png)


また、EXRの距離のデータそのものでなく　PNGのようにグレースケールデータの場合には
画像データを深度としてベクトルと乗算する部分の前に　範囲マッピングで値を置き換え設定できるように設定すると利用できるかと思います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/a99e80f5-a731-ca4c-9ca1-0c97e7982e95.png)
深度としてはデータの諧調が少ないのと
手元のテストでは距離を正規化してカラースペースをノンカラーにしてみたものの少々うまくいかなかったので
参考程度の扱いとさせていただきます


何かの手助けになれば幸いです