OmniAICreator/Qiita-1.07M huggingface dataset:
CursorでC#のデバッグをする方法

## CursorではC#のデバッグができない！

CursorでC#のコンソールアプリを書き、デバッグボタンを押したところ、以下のエラーが出力されました。
![error-message-by-cursor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558837/1a477f04-4222-46bc-9a35-588d43a69262.png)

```txt
Unable to start debugging. .NET Debugging is supported only in Microsoft versions of VS Code. See https://aka.ms/VSCode-DotNet-DbgLicense for more information.
```

なんと、どうやらCursorでは.NETのデバッグができないらしい...。

この記事は、どうにかしてCursorでC#をデバッグ・実行できるようにするまでの記録です。

## 解決方法

結論から言うと、以下の記事を参考にすることで解決しました。

- <https://guiferreira.me/archive/2025/how-to-debug-dotnet-code-in-cursor-ai/>
- <https://engincanveske.substack.com/p/debug-your-net-apps-in-cursor-code>

しかし自分の環境だと、他にも色々工夫しなければ上手くいかないことも多々あったので、備忘録も兼ねて自分が何をしたか共有します。

### 前提

前提として、VSCodeから移行するなどして、通常C#の実行に必要な拡張機能は入っているものとします。

また、自分の実行環境は以下の通りです。

- Windows 11
- Cursor 0.49.x
- PowerShell 7.5.0

### 1. Samsungの.NET Core Runtimeデバッガーを導入する

どうやらあのSamsungが、.NET Coreのデバッガーをオープンソースで公開しているらしいです。
こちらを使用すればCursorでもデバッグ・実行が可能になる、という原理です。

Windowsの場合は、以下のURLから最新版の`netcoredbg-win64.zip`をダウンロードし、任意の場所に解凍してください。
<https://github.com/Samsung/netcoredbg/releases>

### 2. .vscode/launch.jsonを編集する

以下のように設定しました。

```json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "netcoredbg",
            "type": "coreclr",
            "request": "launch",
            "preLaunchTask": "dotnet: build",
            "program": "${workspaceFolder}\\ConsoleApp1\\bin\\Debug\\net9.0\\ConsoleApp1.dll",
            "args": [],
            "cwd": "${workspaceFolder}",
            "pipeTransport": {
                "pipeCwd": "${workspaceFolder}",
                "pipeProgram": "powershell",
                "pipeArgs": ["-Command"],
                "debuggerPath": "C:\\netcoredbg\\netcoredbg.exe",
                "debuggerArgs": ["--interpreter=vscode"],
                "quoteArgs": true
            },
            "env": {
                "DOTNET_ENVIRONMENT": "Development"
            }
        }
    ]
}
```

サイトによって書いてある内容にバラツキがあるのですが、自分の環境では上記で上手くいきました。

以下注意点です。

- `preLaunchTask`には`build`ではなく`dotnet: build`を指定する
  - .vscode/tasks.jsonを作成する必要もない
- `program`には実行したいアプリケーションの.dllファイルを指定する
  - 通常は`アプリケーション名.dll`という形式になるはず
- `pipeTransport.debuggerPath`には、手順1でダウンロードしたnetcoredbg.exeへのファイルパスを指定する
  - .exeは省略可

### 3. 実行する

左メニューの`Run and Debug`から`netcoredbg`を選択して、実行します。

![csharp-debug-works-in-cursor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558837/eebded45-884c-40b1-a550-b5283001da23.png)

無事に動きました！

## まとめ

Cursorでも、Samsungのデバッガーを導入することでC#のデバッグができるようになります。
C#はWeb開発をはじめ、ゲーム制作やWindowsアプリケーション、モバイルアプリなど、様々なフレームワークで活用できる言語です。
CursorでC#を動かせるようになることで、AIアシストを活用しながらC#の開発・デバッグができるようになり、開発の幅が大きく広がります。
本当はMicrosoftがCursorでもC#のデバッグができるようにしてくれるのが一番ではありますが、しばらくはこの方法で制限を回避するのが良いでしょう。
#0129（2025/05/11）Pythonの画像処理ライブラリ

# Pythonの画像処理ライブラリ

エンジニアにとって、画像処理ライブラリの選定は単なる実装効率の話に留まらず、パフォーマンス、保守性、スケーラビリティといった観点でも極めて重要です。本稿では、Pythonで主に使用される画像処理関連ライブラリについて、特徴、ユースケース、選定指針を整理し、プロダクションおよび研究環境での最適解を導く一助とします。

## ライブラリ別の特徴とユースケース

### Pillow

* **用途**：軽量な画像読み書き・変換・簡易加工
* **特徴**：JPEG/PNG/BMPなど多数の形式対応、文字描画、Exif情報操作、GUIとの親和性が高い
* **適用例**：Webアプリの画像アップロード処理、サムネイル生成、軽量スクリプト

### OpenCV

* **用途**：コンピュータビジョン全般、リアルタイム処理
* **特徴**：C++ベースの高性能ライブラリ。フィルタリング、特徴抽出、輪郭検出、顔検出など高機能なAPIを網羅。動画・Webカメラ対応
* **適用例**：リアルタイム顔認識、物体追跡、映像フィルタリング

### NumPy

* **用途**：画像を数値配列として直接操作
* **特徴**：低レベルの画像処理や数値変換に最適。PillowやOpenCVと併用されることが多い
* **適用例**：フィルター演算、ヒストグラム操作、カスタム前処理

### TensorFlow

* **用途**：深層学習（画像分類、物体検出、セグメンテーション）
* **特徴**：`tf.image`を用いた高性能前処理、TFLiteやTFServingなどの本番向け機能が豊富、Google製のフレームワーク、画像をテンソルとして扱う
* **適用例**：モバイル向け画像認識、クラウドベースのAI API開発

### PyTorch

* **用途**：深層学習、研究・プロトタイプ開発
* **特徴**：動的グラフによる柔軟な記述、`torchvision`による豊富な変換機能、HuggingFaceとの親和性、NumPyライクな操作性、Facebook製のフレームワーク
* **適用例**：研究用途の画像モデル、トランスフォーマーモデル開発

## PillowとOpenCVの選択観点

| 観点      | Pillow | OpenCV            |
| ------- | ------ | ----------------- |
| 軽量性     | ◎（数MB） | △（100MB以上）        |
| APIの簡潔さ | ◎      | △（やや学習コストあり）      |
| パフォーマンス | △      | ◎（C++ベース）         |
| 機能の幅    | △      | ◎（ビジョン処理全般）       |
| GUI環境依存 | なし     | 一部関数に依存（imshowなど） |

**選定指針**：

* 軽量な加工・入出力処理が目的 → Pillow
* 物体検出、リアルタイム映像処理、特徴点抽出などが目的 → OpenCV

## TensorFlowとPyTorchの選択観点

| 観点            | TensorFlow           | PyTorch              |
| ------------- | -------------------- | -------------------- |
| モデル開発の柔軟性     | △（Keras依存）           | ◎（NumPyライク）          |
| デバッグ性         | △                    | ◎（動的グラフ）             |
| 本番運用・スケーラビリティ | ◎（TFLite, TFServing） | △（TorchScript等はやや複雑） |
| 研究コミュニティ支持    | △                    | ◎（論文多数）              |
| クラウド親和性       | ◎（GCP）               | 〇（AWS, Azureも可）      |

**選定指針**：

* 研究・プロトタイピング → PyTorch
* 商用サービス、スケーラブルなクラウドデプロイ → TensorFlow

## 豆知識

* OpenCVの`imshow()`はGUI環境がないとクラッシュする。サーバ環境では`cv2.imwrite()`で画像出力を推奨。
* PillowはRGB、OpenCVはBGR表現のため、ライブラリ間の画像渡しでチャンネル順に注意。
* PyTorchの`DataLoader`と`torchvision.transforms`は前処理を逐次的に定義できるため、Augmentationの試行錯誤が高速。
* TensorFlowでは`tf.data`パイプラインに`tf.image`を組み込むことでGPU上での前処理が可能。

## その他の画像処理ライブラリ（紹介）

* **scikit-image**：NumPyベースの画像処理アルゴリズム集。ラベリング、スケルトン化、エッジ検出などに特化。
* **imageio**：画像・動画の入出力に特化した軽量ライブラリ。GIFやTIFFの扱いが容易。
* **Albumentations**：データ拡張ライブラリ。高速かつ柔軟な画像Augmentationが可能で、PyTorchやTensorFlowと併用される。
* **Kornia**：PyTorchベースの画像処理ライブラリ。OpenCVライクな機能をGPU上で高速に動作させられる。
* **SimpleITK**：医療画像（DICOMなど）向け処理に特化。3D画像やボリュームデータにも対応。

---

画像処理は手法・データ・目的によって必要なツールが変わります。エンジニアの成熟度が高いほど、"目的に最適な道具"を選ぶ意識が問われます。ぜひ各ライブラリの強みを活かし、精度と開発効率の両立を図ってください。
「考える・調べる・落とし込む」3ステップを意識して、学習の迷子にならない

## なぜ、この記事を書こうと思ったのか
普段、エンジニア向けの講師業・メンター業をしている際に、気づいたことを記述しておこう思います。どなたかのお役に立つ内容であれば幸いです。

私が講師として、メンターとして見てきた範囲で、なかなか伸び悩んでいる方の傾向としましては、用語や言葉の理解に終始してしまう方が多く、なかなかアウトプット（プログラムを実際に記述して実行してみる、または完成コードを実際に実行してみる、改造してみる…等）に取り組もうとしない方々が一定数いらっしゃいました。

また、アウトプットに取り組んでいる方でも、闇雲に調べたり、調べたものでエラーが発生してさらにハマってしまい、そもそも自身が何に取り組んでいたのか迷子になってらっしゃる方もしばしばお目にかかりました。

そこで、毎回個別にお伝えをしていることを、あらかじめ言語化しておこうと、この記事を執筆するものです。

## スキル（プログラミング等）を習得する時に意識すること

日々の勉強や自己研鑽を効果的に進めるためには、ただ漫然と知識を追いかけるだけでは不十分で、かつ、非効率です。ここでは、効率よく自己学習を行うために、次の３ステップをまず念頭においてください。
1. 「考える」
2. 「調べる」
3. 「自分の中に落とし込む」
 
3ステップを具体的に解説します。

### 1. 「考える」―問題や疑問に向き合う

自己学習の第一歩は、目の前の問題や課題について「自分の頭で考える」ことです。何がわかっていて、何がわからないのかを明確にしましょう。この段階では、必ずしも答えが出なくても構いません。まずは自分が問題に対してどのような視点を持っているかを整理することが重要です。

例えば、「オブジェクト指向が難しい」と感じたら、具体的にどの部分が難しいのか（クラスやインスタンスの概念、継承やポリモーフィズムなど）を考えてみます。

### 2. 「調べる」―自力で解決できない部分を明らかにする

次に、自分で考えても解決できなかった部分を「調べる」段階です。この段階では、インターネット、書籍、オンラインチュートリアル、専門家の意見など多様なリソースを活用して情報収集します。ただし、調べる際にも目的意識を持つことが大切です。自分の疑問点を明確にし、それを解決する情報に集中して収集しましょう。

例えば、「ポリモーフィズムがわからない」と感じたら、「オブジェクト指向 ポリモーフィズム 具体例」など具体的なキーワードで検索し、有効な解説やサンプルコードを探しましょう。

### 3. 「自分の中に落とし込む」―学習を確かなものにする

最後は、調べて得た情報や知識を「自分の中に落とし込む」段階です。これは、単に情報を収集するだけでなく、理解し、自分なりの言葉で説明できる状態を目指す（あくまで”目指す”です。たまに”説明できる状態”を目指しすぎて時間をかけてしまう方もいらっしゃるので注意です。）ことを意味します。具体的には、自分で他人に説明するようにノートに書いたり、実際にコードを書いて試したりすることが効果的です。

例えば、ポリモーフィズムを利用したコードを書いてみて、その動きを確認し、自分の言葉で説明をまとめることで理解が深まります。

### なぜこの3ステップが重要か？

この「考える」「調べる」「自分の中に落とし込む」のサイクルを繰り返すことで、知識が着実に定着し、同時に問題解決能力や思考力が鍛えられます。

自己学習においては、ただ知識を覚えるのではなく、「なぜその仕組みが必要なのか」「どうすれば効率よく活用できるのか」を常に意識しながら取り組むことが重要です。この方法を継続的に実践することで、自分で学ぶ力が身につき、自己研鑽が自然と進んでいきます。

ぜひ、この3ステップを日々の学習に取り入れて、自分らしい成長を実現しましょう。

### 3ステップを実施するにあたっての注意点
これら３ステップに則って実施する際に、それぞれ注意点があります。

### 「考える」を実施する際の注意点
#### いきなり答えを見ない
 いきなり答えや正解を眺めてしまうのではなく、まずは制限時間（例:15分）を決めて自分で解法を考えましょう。制限時間を設けず、際限なく考えるのはNGです。「考える」は思っている以上に脳を使うため、長時間考えていると疲労が溜まり非効率になります。また、単純にレベルが不足している状態では、いくら時間をかけたところで解法が降ってくることはありません。
 
#### 「わからない」を放置しない
わからなかった点をメモに残します。これは後の「調べる」に使用する為です。メモは自身で見返してわかる程度にします。メモを残すこと自体に、あまり時間を使わないようにするのがコツです。

### 「調べる」を実施する際の注意点
#### 情報源を鵜呑みにしない
検索結果で出てきた内容の最終更新日付を確認します。プログラミング言語や技術内容にもよりますが、おおよそ3年以上経過している記事は、今では使用できない可能性が高いです。
また、AIから得られた回答も、ハルシネーションや誤った応答をすることがあることを念頭におきます。AIが回答のソースを提示している場合は、リンク先も参照しておくことをオススメします。

情報源通りにしたからと言って、必ずしも解決するとは限らない、ということを常に念頭に置いておきましょう。


#### 複数ソースで裏付けを取る
公式ドキュメント → (あれば)専門書 → 信頼できるブログや情報サイト(Qiita,Zenn等) → QAサイト(StackOverflow等)の優先順位で確認します。理解できたらメモに要約を書き出しておきます。


### 「落とし込む」を実施する際の注意点
#### インプットだけで終わらせない、アウトプットで理解を検証する
学んだ概念を使って小さなサンプルアプリを作ります。小さなサンプルアプリを書けない状態なのであれば、公式サイトやブログなどに掲載されているサンプルコードを写経してみます。AIに提示してもらうのも良いです。コードをそのまま打っても一見意味がないように思われますが、そもそもプログラミングをしている環境（PC操作やIDEの操作、コンパイル・ビルド・実行など）に慣れていない可能性もあり、「慣れる」という意味では意味があります。「慣れる」ことも「落とし込む」うちの一つ、と考えます。もちろん写経ばかりしていてもレベルアップしない為、ある程度の本数写経したら、小さなサンプルアプリを作る作業に戻ります。何を作ったら良いかわからない場合は、AIや講師・メンター等の援助を得ましょう。

## おわりに
改めて言語化すると、そこそこのボリュームになり、私自身驚いています。

今までは、向き合った人々一人一人に、これらの言葉を投げかけていましたが、今後はこの記事を使って、まずは内容を見てもらって活用していこうと思います。

もし、この記事を見てくださった方がいて、内容について、疑問点や質問がある場合はコメントをください。
Nuxt3とVuetify3を使ったページ遷移の実装

# サンプルイメージ
#### ヘッダー右端の`REGISTERボタン`をクリックすると...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/022ff9e3-f726-4bb1-be9b-c0a406b45d23.png)
#### 別ページの画面へ遷移する方法を紹介します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/8d3e905a-33dd-4715-afa1-b78106787968.png)



# ページ遷移するための実装はこれ
`@click`ディレクティブに、`"$router.push('遷移したいページのパス')"`を実装するだけで、ページ遷移することができます。

下記にサンプル例を載せておきます。

```sample.vue
<v-btn type="button" @click="$router.push('/registration/registration')">Register</v-btn>
```

全体のコード
```frontend/components/navbar/navbar.vue
<script setup lang="ts">

</script>

<style>

</style>

<template>
    <v-card>
        <v-layout>
            <v-app-bar color="primary">
                <v-app-bar-nav-icon variant="text" @click.stop="drawer = !drawer"></v-app-bar-nav-icon>
                <v-toolbar-title>My Todo Task</v-toolbar-title>
                <template v-if="$vuetify.display.mdAndUp">
                    <v-btn icon="mdi-magnify" variant="text"></v-btn>
                    <v-btn icon="mdi-filter" variant="text"></v-btn>
                </template>
                <v-btn type="button" @click="$router.push('/registration/registration')">Register</v-btn>
            </v-app-bar>
        </v-layout>
    </v-card>
</template>
```


# 参考にしたサイト

https://zenn.dev/code_diver/articles/94f6d7903fc81b
Ubuntsu 日本語入力設定（備忘録）

はまったので記録しておく。
## 問題
Mozcを選択してもローマ字入力が出来なかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/c1301d45-d782-4ee4-8c86-2622d6111486.png)

## 解決
ibus-anthy導入後再起動
ブラウザ上では日本が入力できるようになった。
Libre Officeでは入力出来ない。
```
sudo apt install ibus-anthy
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/cebe2b94-080d-49a3-9b9f-a3b867a0b25d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/296d4fca-0f28-4623-a8f7-61050f12bc8f.png)
メモリ資源とDBMSアーキテクチャのトレードオフ

# メモリ資源とDBMSアーキテクチャのトレードオフ

## はじめに

DBMS（データベース管理システム）を設計・運用する際に避けて通れないのが、「検索と更新、どちらを優先するか」というリソース配分のトレードオフです。

本記事では、メモリという限られた資源をいかに活用するかという観点から、アウトプットを兼ねて、DBMS内部のキャッシュ戦略とパフォーマンスの関係を掘り下げて解説します。

## システムの特性とトレードオフ

DBMSでは、データキャッシュとログバッファという2つのメモリ領域をどう配分するかがパフォーマンスに直結します。

|                 | データの安全性 | パフォーマンス |
|----------------|----------------|----------------|
| データキャッシュ | ×              | ○              |
| ログバッファ     | ○              | ×              |

ログバッファを重視すれば更新処理のパフォーマンスが上がり、逆にデータキャッシュへ多くを割けば検索処理が高速になります。
このバランスはアプリケーションの性質により最適解が異なります。

## データキャッシュとログバッファの役割

ユーザのSQL要求がデータキャッシュにヒットすれば高速に応答できますが、更新処理にはログバッファが不可欠です。

キャッシュに載っていないデータが要求された場合はディスクI/Oが発生し、パフォーマンスが著しく低下します。そのため、頻繁に利用されるデータはキャッシュに載せておくことが重要です。

## 検索と更新、どちらを重視するか

メモリは有限なリソースであり、すべての用途に十分な量を割り当てることはできません。したがって、「検索性能を取るか、更新性能を取るか」という判断が求められます。

理想は検索・更新のどちらにも十分なメモリを割り当てることですが、それが難しい場合、アプリケーションの性質に応じた調整が必要です。

### 自動メモリ調整機能に頼りすぎない

近年のDBMSでは、リソース配分を自動で調整する機能もありますが、すべてを自動に任せるのは危険です。システムの設計思想を理解したうえでのチューニングが不可欠です。

## 設計から読み取れる意図

ログバッファのサイズが大きければ更新処理重視、データキャッシュが大きければ検索処理重視と考えることができます。これはDBMSが「どのような用途で設計されているか」を知る手がかりになります。

## まとめ

- データキャッシュとログバッファはトレードオフの関係
- アプリケーションの性質に応じたリソース配分が必要
- DBMSの設計思想を読み解くことで、最適なチューニングが可能になる

メモリという貴重な資源の配分を誤れば、どちらの処理も中途半端になり、システム全体のパフォーマンスが低下します。
この辺は意識しておきたいですね。

# 参考
[SQL実践入門──高速でわかりやすいクエリの書き方 (WEB+DB PRESS plus)](https://www.amazon.co.jp/SQL%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80%E2%94%80%E2%94%80%E9%AB%98%E9%80%9F%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%84%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9-WEB-DB-PRESS-plus/dp/4774173010)
【Windows】fnmを使って指定したバージョンのNodeを特定のフォルダ配下に適用する

# はじめに
**fnmを使って、WSL2環境で指定したバージョンのNodeを特定のフォルダ配下に適用する手順**をまとめます。
例えばですが、`project/aws`配下に下記を適用していくとします。
| Node.js |yarn  |
|---|---|
|14.21.3| 1.22.22| 

**fnmとは**
 Node.jsのバージョンを管理するものです。
スピード性を重視しており、Nodeインストール時にはこちらを使うことが推奨されています。
**fnmのインストール方法は下記のサイトに記載**されています。

 https://github.com/Schniz/fnm
 
# 手順
`project/aws`配下（Nodeを使用したい場所）で**希望するNodeのバージョンを指定してインストール**します。
```
fnm install 14.21.3
```

Windowsの場合、環境変数の設定をPowerShellに適用してfnm useを有効にします。
PowerShell配下で下記を実行しておかないとfnm useを使用できません。
```
fnm env --use-on-cd | Out-String | Invoke-Expression
```
Nodeを使用したいフォルダ配下に移動して`fnm use [node version]`を行うと、その通りに適用されます。
```
fnm use 14.21.3
```
`node-v`で`14.21.3`（指定したNodeのバージョン）が出ていれば成功です。
***

**希望のバージョンのyarnをグローバルにインストールする方法**も追記します。
これでfnmによって切り替えたNodeバージョン（今回はv14.21.3）に紐づくnpmのglobal領域にインストールされるため、**このバージョンのNodeを使っているときにだけ、指定したバージョンのYarnが使えます**。
```
npm install -g yarn@1.22.22
```

# 参考

https://qiita.com/heppokofrontend/items/fe1c3bc41a0ae943c2ca
Remove Background - 画像の背景を一瞬で削除！

皆さん、写真や画像の背景を簡単に削除したいと思ったことはありませんか？今日はそんな悩みを解決してくれる便利なウェブサイト「Remove Background」を紹介します！

🔗 [removebg]( https://removebg.123everything.com/ja)

このツールの特徴:

完全無料で利用可能

登録不要、すぐに使える

AIが自動的に背景を識別・削除

人物、商品、動物など様々な対象に対応

処理が驚くほど速い！

使い方はとっても簡単:

上記URLにアクセス

背景を削除したい画像をアップロード

数秒待つだけで完了！

透明背景のPNGとしてダウンロード可能

ECサイトの商品写真やSNS用のプロフィール画像、プレゼン資料など、様々なシーンで活用できます。ぜひ一度試してみてください！
AndroidStudio空白文字の表示方法

コードを読む時、読みやすい方が良いですよね。
空白文字の表示を行うと不自然な空白を見つけることができるので、綺麗なコードになると思います。

空白文字の表示方法です。macOSの場合です。

設定を開きます。
画像のようにEditor > General > Appearance を開きます。
![スクリーンショット 2025-05-11 10.25.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/8750382b-e604-4d42-a1d6-f97ba2ed3c72.png)

Show whitespacesにチェックを入れます。
![スクリーンショット 2025-05-11 10.25.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/e3e58e29-71bd-4b19-91cb-dc52b61f298d.png)

こちらで設定は終わりです。
アルゴリズムを基本からまとめてみた【基礎】

## アルゴリズムとは？
- アルゴリズムは3000年以上前から使われていた
- ある目的を達成するための作業手順 ⇨ 抽象的なアイデアや考え方を指す

| アルゴリズム |アルゴリズムを形にしたもの | 目的のモノ | 
| --- | --- | --- | 
| 料理の手順 | レシピ | カレー | 
| 演奏の方法 | 楽譜 | 演奏 | 
| 機械の操作方法 | 説明書 | 機械 | 

## アルゴリズム : 2つの特徴

①正しい結果が得られる
- 答えを求めるときの手順が具体的かつ明確に書かれている

②必ず終わる
- 無限ループを繰り返したり莫大な時間がかかるような作業ではいけない

## アルゴリズムとプログラムの違い

- アルゴリズム : 目的を達成するための作業手順
- プログラム : 目的を達成するための作業手順をコード・ソフト・アプリなどで形にしたモノ

アルゴリズム : 処理・結果
⇩
プログラム : プログラミング・コードを書く
⇩
具体的な処理





## 参考サイト
[【1/4】アルゴリズムの基礎を学ぼう！(これからの講義概要)](https://www.youtube.com/watch?v=v9knQAt1AEg)
[【2/4】アルゴリズムの基礎を学ぼう！(アルゴリズムとは何か？)](https://www.youtube.com/watch?v=S6-jtQiiV1E)
[【3/4】アルゴリズムの基礎を学ぼう！(アルゴリズムとプログラム)](https://www.youtube.com/watch?v=_MWM4fslPf4)
[【4/4】アルゴリズムの基礎を学ぼう！(アルゴリズムの２つの特徴)](https://www.youtube.com/watch?v=gOMMX9FxbJA)
自己紹介

# 初投稿です

私は現在、Qiita、Note、そしてLinkedInの3つのプラットフォームを通じて、技術的な内容からキャリアに関する話まで幅広い情報を発信しています。リンクはプロフィールに掲載しています。

Note: ここでは、技術者としての考え方や成長の過程、そして私の経験を通して学んだことを中心に語っています。

Qiita: 主に実践的な技術の問題解決手法や資格情報について紹介しています。

LinkedIn: 主にキャリアや資格に関する内容を発信しています。プロフィール全般です。

ここでは技術的なことだけ語ります。あと資格関係について。
まずはNoteと大分かぶりますが、自己紹介を兼ねて、少しだけ私の技術志向についてお話しさせていただきます。

## AIとの出会いと挫折

私がAIに興味を持ったのは、ニューラルネットワークが「過去のもの」と言われ、SVM（サポートベクターマシン）が最有力候補として注目されていた時代でした。2013年、私はアメリカのシカゴ大学に留学しており、そこでAIの限界に直面しました。

当時、ニューラルネットワークはまだ発展途上で、その可能性がどれほどのものかはっきりしなかったのです。さらに、数学的な難しさや研究の進展の遅さも感じ、AIの基盤を作る仕事には向いていないと判断して、私は一度AIの道から離れることを決めました。その後、別の道でキャリアを積みながら、しばらくはAIから距離を置いていました。

## 再び魅了されたAIの進化と事故経験

しかし、近年のAIの進化を目の当たりにし、再びその魅力に引き寄せられました。深層学習の進化、生成AIの登場、そしてGPT-4のような最先端技術の登場に至るまで、AIの可能性はかつてないほど広がっています。その進化を見て、再びAIの世界に足を踏み入れる決意を固めました。

一方、ChatGBT登場時、私は事故で死にかけていました。症状は足がつくので、ここでは割愛しますが、医者に障碍者手帳を与えられそうになりました。しかし、私は手帳交付を拒否して自分の力で医学を探求し、自分で東洋医学の中医鍼灸に治癒が見込める事を突き止めました。

保険も何も効きませんが、鍼灸院に通う事で、めきめきと回復し、医師に不可能と言われた復帰を実現したのです。そしてこのことから、最初が肝心であることを確認しました。
それを医師会に見せたら警察に通報されました。
警察は病院側に呆れるだけで帰っていきましたが、自分が知らないことを実現されると、相手は恐怖に陥る事を知りました。

もし最初から鍼灸院に通っていたら、数か月で治っていたことでしょう。
それを2年以上の時間をかけてしまったのです。
それ以降、私は要件定義と企画を最重要視することにしました。
後工程はAIがやってくれそう、ということもありましたが、とにかく最初が肝心なのです。

それが今の私の原点です。
久しぶりにGitHubにリポジトリ作成してローカルのブランチをプッシュしてみた

# モチベーション
昨日作成したコードをGitに上げたかったがリポジトリ作成していなかった。
久しぶりにGit、GitHubを使うので復習のため記載。

# 目次
[1. GitHub側の設定(リポジトリの作成)](#1.-GitHub側の設定(リポジトリの作成))
[2. ローカル側の設定](#2-ローカル側の設定)
[2-1. Git init実行]
[2-2. gitignore準備]
[2-3. 初回コミット]
[2-4. GitHubと接続してpush]
[2-Ex. Git未設定の場合の出力と対処法]
[最後に](#最後に)

# 1. GitHub側の設定(リポジトリの作成)
GitHubにログイン
画面右上の「＋」クリック、「New repository」選択
Repository Nameにアプリの名前、Descriptionに詳細(任意)、Visibilityに公開/非公開(何かあった時のため非公開に設定)、Initialize with a READMEはチェックしない(今回なかったためむし)
Createクリック

以上でGitHub上にデータを記録するためのリポジトリが作成できました。

# 2. ローカル側の設定

## 2-1. Git init実行


 ``` ruby:bash
 git init
 ```

⚫︎ git init 実行によってできるようになること(byChatGPT)
①現在のディレクトリがGit管理できるようになる。
②隠しフォルダである.gitが作られ、履歴、設定、ステージング情報が保存される。
③ローカルリポジトリとなり、Gitコマンドで履歴を保存(commit)できるようになる。

## 2-2. gitignore準備
パスワードなどが入っている.envやlog/などをgit上へ上げないようにする

```ruby:bash
echo ".env" >> .gitignore
```

## 2-3. 初回コミット
指定ディレクトリ以下をステージング(add)、ステージング済みをコミット(commit)。
コメントは自分の場合、「コミット年月日 コミット内容」にしました。

```ruby:bash
git add .
git commit -m "yyyy/mm/dd 初回コミット 〇〇機能追加"
```

## 2-4. GitHubと接続してpush
2-3まで実行したことでローカルリポジトリの設定済みブランチ(ターミナルの$マーク手前に書かれているmain)に保存できた。
以下のコマンドでローカルリポジトリにあるmainブランチをリモートリポジトリへpush

```ruby:bash
git remote add origin https://github.com/ユーザー名/リポジトリ名.git (←リポジトリ作成時に表示されたHTTPSのURLを書く。ローカルのGitにリモートリポジトリの名前とURLを登録するコマンド。)
git branch -M main (←ブランチ名を強制的にmainに変更。既にmainであれば不要)
git push -u origin main(←リモートリポジトリであるoriginにブランチmainを送るという意味)
```

ローカルリポジトリ: 自分作業用。他の人がGitHubを見ても閲覧できない。
リモートリポジトリ: プロジェクト共有者(同じプロジェクトにいるけど別ブランチで作業している人)が閲覧できる。


## 2-Ex. Git未設定の場合の出力と対処法
途中で以下のような内容が表示された場合、gitがユーザ情報を認識していないとのことなので、ユーザ情報をGitに設定する。(byChatGPT)
【表示内容】

``` ruby:bash
Author identity unknown
*** Please tell me who you are.
```

【入力内容】
Git Hubで使っている名前とメールアドレスを使うと便利。
--globalは「全プロジェクト共通でこの名前とメールアドレスを使う」という意味。

``` ruby:bash
git config --global user.name "あなたの名前"
git config --global user.email "あなたのメールアドレス"
```

上記完了次第、コメント表示されたところから再度コマンド入力。


# 最後に
ここまで読んでくださりありがとうございます！誰かの力になれれば幸いです！
第3

## 1.static（静态）
#### ①修饰成员变量
有stati修饰：类变量（在计算机里只有一份，会被类的全部对象共享）
某个数据只需要一份，且希望能够被共享（访问，修改），则该数据可以被定义成类变量来记住。
⭐类名.类变量
```java
static String name;
```
无stati修饰：实例变量（属于每个对象的）
⭐对象.实例变量
```java
int age;
```
#### ②修饰成员方法
有stati修饰：类方法，属于类
⭐类名.类方法
无stati修饰：实例方法，属于对象
⭐对象.实例方法
## 2.继承(extends)
让一个类与另一个类建立起父子关系。
#### 特点：
子类能继承父类的非私有成员（public:成员变量/方法）
## 3.方法重写
当子类觉得父类中的某个方法不好用，或者无法满足自己的需求时，子类可以重写一个方法名称，参数列表一样的方法，去覆盖父类的这个方法。
重写后，方法的访问，java会遵循就近原则
⭐注意事项：
①使用@Override注解
②子类重写父类方法时，访问权限必须大于或等于父类该方法的权限
③重写方法的返回值类型，必须与被重写方法的返回值类型一样，或者范围更小
④私有方法，静态方法不能被重写
⭐常见应用常见
子类重写Object类的toString()方法，以便返回对象的内容
## 4.final
#### ①修饰类：最终类，不能被继承了
#### ②修饰方法：最终方法，不能被重写了
#### ③修饰变量：该变量只能被赋值一次
## 5.泛型
可以避免强制类型转换，及其可能出现的异常
本质：把具体的数据类型作为参数传给类型变量
```java
        // <String>：list里面只能放String类型的数据
        ArrayList<String> list1 = new ArrayList<>();
        list1.add("java1");
        list1.add("java2");
        list1.add("java3");
        for (int i = 0; i < list1.size(); i++) {
        // 遍历出来的数据交给String
            String e = list1.get(i);
            System.out.println(e);
        }
```
⭐泛型不支持基本数据类型，只能支持引用数据类型
ABC405回答メモ

# 0.はじめに
　落ちていくレートに歯止めを掛けたい今日この頃。
　A~Cは簡単に解けて迎えたD問題。
　最初の解法だとTLEだったので工夫してなんとか
　ACまで持っていきましたが3分ほどオーバーし
　あえなく3問まで。
　レートは-21の711と、某コンビニエンスストアのようになりました。
　21時過ぎに家に来た兄への対応が無ければ
　間に合ったのにな・・・と思いました。


# 1. A - Is it rated?
　今はレート外となってしまった懐かしいARCを題材にした問題。
　XとRの値をもとに場合分けして判定結果を出力して終了。

　https://atcoder.jp/contests/abc405/submissions/65643230


# 2.B - Not All
　問題がややこしく感じましたが、まぁ、B問題。
　制約も緩いので処理時間等気にせず分かりやすく実装しました。

　【実装】
　１）まずは、リストA内の数字毎の出現回数をリストLに集計。
　２）リストLを1からMまで見ていき、出現回数０の
　　　数値があれば、0を出力して終了。
　３）リストＡを後ろから見ていき、リストＡの値に基づき
　　　リストＬの出現回数をチェック
　　　→出現回数が１なら、チェック回数を出力して終了
　　　→1でなかったら（2以上）チェック回数を1マイナスする

　https://atcoder.jp/contests/abc405/submissions/65649577


# 3.C - Sum of Product
　制約から、普通にi×j回処理したらTLEなのは明白。

　【考え方】
　リストの数がA,B,C,Dの4つの場合
　ＡＢ＋ＡＣ＋ＡＤ+ＢＣ＋ＢＤ＋ＣＤ
　＝Ａ（Ｂ＋Ｃ＋Ｄ）+Ｂ（Ｃ＋Ｄ）+Ｃ（Ｄ）
　となるので、リストＡの後ろからの累積和リストＢを作り
　Ｂ＝[Ａ＋Ｂ＋Ｃ＋Ｄ,Ｂ＋Ｃ＋Ｄ,Ｃ＋Ｄ,Ｄ]
　リストＡを先頭からＮ－１個目まで見ていき(index=i)
　A[i]×B[i+1]を集計すれば、解が求まる。

　後で解説を見て、別にリスト化しないでも、合計から、掛ける数を
　引いていけばよかったことが分かりました。

　https://atcoder.jp/contests/abc405/submissions/65660774


# 4.D - Escape Route
　3分遅れでACとなった悔しい問題。

　【考え方】
　・各非常口から到達できるマスを幅優先で探索
　・各非常口からの探索時にどの非常口から来たかの方向と
　　非常口からの移動距離を保存
　・各非常口からの探索時にすでに他非常口からの到達が
　　出来てるマスであった場合、移動距離が少なければ上書きし
　　大きければそのルートの探索を終了する

　上記で進めましたが、TLE
　まぁ、上記方法だと、効率悪いのはわかっていたので
　探索のチェックをキューで管理し、各非常口から
　近いマスを埋めていく方式にかえてACとなりました。　

　https://atcoder.jp/contests/abc405/submissions/65694004


以上
(メモ)3Dプリンタ　フィラメント糸引き対処


# 1. リトラクション（引き戻し）設定の最適化
リトラクション距離と速度を調整します。一般的に、ボーデン式は2.0～6.0mm、ダイレクト式は0.5～2.0mm程度が目安です。速度は30～60mm/sが推奨されます。

スライサーソフトで「リトラクション有効」にし、適切な値を見つけるために「リトラクションタワー」をプリントしてテストするのが効果的です。

# 2. ノズル温度の調整
黒色は白色と違いすこし低温でよさげ
Geminiでシンバルを使う魔法少女を描いてみた。

# 概要

Geminiでシンバルを使う魔法少女を描いてみました。

# 実装

プロンプトと実行結果は以下の通りでした。

```
光のシンバルを使う魔法少女を描いてください。
```

![光のシンバルを使う魔法少女_20250511.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/84dbc74f-88e3-4d70-b4e4-e3b2111929dc.png)


```
闇のシンバルを使う魔法少女を描いてください。
```

![闇のシンバルを使う魔法少女_20250511.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/192f4b79-9a27-436c-aa61-607ebe3a75cb.png)



```
聖なるシンバルを使う魔法少女を描いてください。
```

![聖なるシンバルを使う魔法少女_20250511.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/67c57e03-a30c-46ab-b6e7-2e6019f4fc48.png)


# まとめ

聖の子は可愛い。
何かの役に立てばと。
若手モバイルエンジニアが設計をする際によく考えてることを殴り書きしてみた

# 自己紹介
職種：Androidエンジニア(最近は個人開発でiOSにも取り組み中)
年齢：23歳
学歴：高卒
資格：
* 基本情報技術者試験
* 応用情報技術者試験
* 情報処理安全確保支援士
* Google Cloud Digital Leader
* Google Cloud Associate Cloud Engineer
* Google Cloud Professional Security Engineer
* TOEIC LR 795

趣味：
* チェス
* ウィスキー(特にアイラ系好き)
* 個人アプリ開発
* 競技プログラミング(最近はLinked List勉強中)

# 本記事について
本記事は、若手エンジニア向けの設計シリーズの第1回目となります。
シリーズの予定は以下の通りです：

1. 第1回：設計の基礎概念（本記事）
   - 抽象的思考と具体的思考
   - 目的と手段の分離
   - 抽象化クラスの役割

2. 第2回：具体的な設計例や共通化パターン
   - コード例を用いた解説
   - よくある設計や関数の共通化の失敗とその解決策

# 執筆をしようと考えた背景
まず、現時点でも設計で迷う時は数多くあります。
ただ、自身がエンジニアとして就職した当時を振り返ると"設計"に関してはそもそも概念を掴めなかったり、参考書やサイトを見ても理解が進みませんでした。
他の若手エンジニアの方も同様に苦しんでいる人がいるのでは？と思い、役立てればと思い執筆にいたりました。

これから執筆する内容は、あくまで個人の意見であり決して正解を意味したり、またそれを押し付けるようなことが目的ではありません。

# 対象としている読み手
* 若手エンジニア
* 設計が分からないエンジニア("ﾁｮｯﾄﾃﾞｷﾙ"人は読む必要ありません！)

# 本質的に必要な思考能力
私が考えるに、クラス設計や関数の共通化をする上で理解しておきたい本質的な思考力がいくつかあります。

## 抽象的思考と具体的思考の操作
これが最も要求される思考であり、最も難しい思考であると考えてます。
あらゆる事象が、因果関係(原因と結果)から成り立つように"物"も全て具体と抽象で考えることが出来ます。
また、抽象化というものは縦方向と横方向に分けることが出来ます。

### 横方向
"りんご"・"ぶどう"・"れもん"を例として考えます。
これら3つは下記のように抽象化出来ると思いませんか？
* 食べられるもの
* 皮を剥けるもの
* 色味をもつもの

このように各物が持つ特性を並べたものは横方向の抽象化になりやすいです。
Appleが提唱している"プロトコルプログラミング"に近いですかね？

### 縦方向
また、物は縦方向に具体化及び抽象化することが可能です。
「スマートフォン」を例にして考えてみましょう。
スマートフォン
⇩
携帯電子機器
⇩
電子機器
⇩
機器
⇩
物(オブジェクト)

### 抽象化及び具体化は難しい
このように抽象化と具体化の操作は相当なバリエーションがあります。
クラス設計などを考える上では、この様々なバリエーションの中からどのように抽象化すればいいか？を見抜くことが一番大切なスキルです。
これを見誤ると悲惨なことになりやすいです。
* 過度に抽象的→抽象化の利点が無い
* 過度に具体的→抽象化クラスの使い回しが出来ない

そして、恐ろしいことに設計の正解/不正解は時と場合で無慈悲に変わります。
今まではこの抽象化で良かったのに急に新たな仕様のみ微妙に異なり抽象化が適用できないとか既存の仕様変更がガラッと入ったりとか...。
そのため、自身が作っているプロダクトの展開予測(ビジネス的視点)やSIerであれば顧客の特性(仕様変更依頼を頻繁に出すなど)の判断が必須になっているのです。こればっかりはAIも苦手だと思います...。

ではどのようにして抽象化する方向を決めるべきなのか？それが次の項目に絡みます。

## 目的と手段の分離
社会人になると度々指摘される内容です。
これが前項目の考え方を支える補助役としての思考の種類です。

そもそも、わざわざ設計において抽象化クラスを使い、抽象化及び具体化を行う目的はなんでしょうか。

本質は3つあると考えてます。
1. コードの共通化ができる
   - 同じ振る舞いを抽象化クラスに閉じ込めることができる
   - 例えば、for文で同じ抽象化クラスを持つ各インスタンスに同じ処理を適用できる
   - これにより、コードの重複を減らし、保守性を高めることができる

2. ドメイン知識(業務知識のこと)が浅くても実装ミスを防ぐことができる
   - 新しい機能を追加する際に、抽象化クラスが「ここに実装が必要」と教えてくれる
   - これにより、実装時に必要な要素が明確になり、ミスを防ぐことができる
   - 例えば、新しい種類の果物を追加する際に、「色」や「皮を剥く方法」などの必要な情報の実装が強制される

3. テストのしやすさ(テスタビリティの向上)
⚠️テストの話を持ち込むと長引いたり難しくなるので今回は簡単に紹介
   - 抽象化クラスを作っておくことでモックの挿入がやりやすい
   - DI(依存性注入)の導入に役立つ

# まとめ
設計において抽象化と具体化を考える際は、以下の点を意識することが重要です：

1. 抽象的思考と具体的思考の操作
   - 横方向と縦方向の抽象化を理解する
   - 適切な抽象化の度合いを見極める
   - ビジネス的な視点も考慮する

2. 目的と手段の分離
   - コードの共通化による保守性の向上
   - 実装ミスの防止
   - テストのしやすさの確保

設計は難しいですが、これらの基本的な考え方を理解しておくことで、より良い設計ができるようになると思います。

次回は、これらの考え方を踏まえた具体的な設計パターンについて解説する予定です。お楽しみに！
個人的備忘録：LambdaからECSを起動する構成について調べた内容を整理してみました

## はじめに

AWS Lambda から ECS のタスクを起動（run task）できるかどうかについて、個人的な開発メモとして整理しておきます。

**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**

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

受講しているITスクールのハッカソンの開発の一環で、Lambdaからマイグレーション用のECSタスクを起動する構成を検討することがありました。

※まだ実際に試したわけではありませんが、初歩的な情報として忘れないように記録しておきます。

## 内容

結論として、AWS Lambda から ECS タスクを `run_task` API 経由で起動することは可能なようです。

**参考文献**

https://zenn.dev/masmgr/articles/8a7751f5a3a5dc

https://qiita.com/kosuke-ikeura/items/277bb91e8d68d92500b1

https://qiita.com/Toyo_m/items/1e0a75911294eb475b68

Python（boto3）を使えば、以下のような実装が参考になりそうです。

### boto3 を使った実装例（未検証）

```python
import boto3

ecs = boto3.client('ecs')

response = ecs.run_task(
    cluster='your-cluster-name',
    launchType='FARGATE',
    taskDefinition='your-task-def-name',
    count=1,
    platformVersion='LATEST',
    networkConfiguration={
        'awsvpcConfiguration': {
            'subnets': ['subnet-xxxxxxxx'],
            'assignPublicIp': 'ENABLED',
            'securityGroups': ['sg-xxxxxxxx']
        }
    }
)

print(response)
```

### Lambda 側の設定ポイント（調査ベース）

* `ecs:RunTask`, `iam:PassRole` 権限を持つ IAM ロールを Lambda に付与する必要がある
* ECS 側では `executionRoleArn` と `taskRoleArn` を定義しておく
* VPC, サブネット, セキュリティグループなどネットワーク構成も忘れずに
* CloudWatch Event や S3 イベントなどをトリガーとして Lambda を動かす構成も可能

## まとめ

Lambda から `run_task` で ECS タスクを動かす構成は、調べた限りでは実用的なアプローチに思えます。

:::note warn
**特にバッチ処理や一時的なマイグレーションタスクに向いていそうです。今後実際に試す際のベースとしてこの情報を残しておきます。**
:::

※本記事は、あくまで個人の備忘録レベルで記載しています。実際に動作確認はまだ行っていません。
Automating GIS Processes 2024 写経　Exercise １（Problems 4）、Lesson 1振り返り


[前回](https://qiita.com/t_t_japan/items/cab98430a95384722b8a)の続きです。

https://github.com/Automating-GIS-processes-II-2024/exercise-1/blob/main/Exercise-1-problem-3-4.ipynb

# Problem 4: Creating LineStrings that represent the movements (5 points):

> This problem continues where we left off after completing Problem 3.
> The task is to:
> 1. create a list lines (shapely.geometry.LineString) between each pair of origin and destination points, and
> 2. calculate the over-all total_length of all those lines.
Store the list of lines in a variable called lines, and the sum of lengths in a variable called total_length.

> Once you have working solutions for both tasks,
> 3. create functions for them so you can apply them to other similar data sets in the future (see instructions below).

Problems 3が終わっていることが前提でです。
Problems 3で作成した`origin_points`・`destination_points`から、`LineString`のリストを作って、各`LineString`の長さの合計を`total_length`に格納します。
今回は上記の処理を関数にすることで、再利用可能にします。

(1)・(2)・(3）まとめてやってしまいます。
`create_od_lines`関数は`LineString`のリストを作ります。
`calculate_total_distance`関数は`LineString`のリストから`LineString`の長さの合計を出します。
```
from shapely.geometry import Point, LineString

def create_od_lines(origin_points: list[Point], destination_points: list[Point]) -> LineString:

    return [LineString([origin, destination]) for origin, destination in zip(origin_points, destination_points)]

def calculate_total_distance(lines: list[LineString]) -> float:

    return sum([line.length for line in lines])
```
今回は、[リストの内包表記](https://docs.python.org/ja/3/tutorial/datastructures.html#list-comprehensions)を使いました。

> リスト内包表記はリストを生成する簡潔な手段を提供しています。主な利用場面は、あるシーケンスや iterable (イテレート可能オブジェクト) のそれぞれの要素に対してある操作を行った結果を要素にしたリストを作ったり、ある条件を満たす要素だけからなる部分シーケンスを作成することです。

（愚痴）リストの内包表記は、ネストさせることもできます。が、個人としてはやらないでほしいです。for loop の順番なんぞ覚えたくないです。

結果確認です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076503/cf0942b7-bb63-4e9a-bc55-b7014a3873ee.png)


# Lesson 1振り返り

https://autogis-site.readthedocs.io/en/latest/lessons/lesson-1/overview.html#Overview

> Overview
> Before we start to work with entire data sets next week, we first have to become familiar with basic geometric objects (primitives): in the centre of this week’s lesson stand points, lines, and polygons.
> We will learn how to create and manipulate ‘simple features’ in Python, using the Python package shapely.

pointとかpolygonが何なのかわかって、Pythonのshapelyパッケージ使って自分で作れる→できました

> Learning goals:

> - find Python packages for GIS and spatial analysis,
> - understand and describe how geometric objects (points, lines, polygons) are handled and stored by shapely, and
> - create geometries given their coordinate values.

- GISや空間分析のPythonライブラリを見つける→できました
- shapelyパッケージ使ってgeometricなオブジェクトを扱う方法が説明できる→できました
- 座標からgeometryが作成できる→できました

次は Lession 2です。いわゆる「ここからが本番」です。
【公ド読】Copilot Chat の AI モデルを変更する

【公式ドキュメントを読もうシリーズ】Copilot Chat の AI モデルを変更する

## シリーズ概要

[https://qiita.com/yasu_programming/items/cec66f9e8d5d571e9ce3](https://qiita.com/yasu_programming/items/cec66f9e8d5d571e9ce3)

## URL

[https://docs.github.com/ja/copilot/using-github-copilot/ai-models/changing-the-ai-model-for-copilot-chat](https://docs.github.com/ja/copilot/using-github-copilot/ai-models/changing-the-ai-model-for-copilot-chat)

## 説明

AIモデルを変更する方法が書かれている。
私はCopilot Free(無料枠)で触っているが、モデルごとに全然Premium リクエストの数が違うことにびっくりした。
参考リンクを見る限り、GPT-4.5はClaude 3.7 Sonnetの50倍の使用量がかかるということですよね・・・？(2025年5月11日現在)

### 参考リンク
[https://docs.github.com/ja/copilot/managing-copilot/monitoring-usage-and-entitlements/about-premium-requests](https://docs.github.com/ja/copilot/managing-copilot/monitoring-usage-and-entitlements/about-premium-requests)

### リクエストとは

> リクエストとは、コードの生成、質問への回答、拡張機能による支援など、Copilot に何らかの処理を依頼するあらゆるやり取りを指します。 チャット ウィンドウでプロンプトを送信するたび、または Copilot からの回答をトリガーするたびに、1 リクエストとカウントされます。

### Premium リクエストとは

> 一部の Copilot 機能は、より高度な処理能力が必要であり、Premium リクエストとしてカウントされます。 1 つの機能が消費する Premium リクエスト数は、機能と使われる AI モデルによって異なります。

> - Copilot Chat
> - Copilot agent モード
> - Copilot のコード レビュー
> - Copilot Extensions

つまりは参考リンクを見る限り、Copilot Chat とかCopilot agent モードで実行すると、Premiumリクエストの使用量が加算されるってことなんだろう。

## 所感

Premium リクエストのカウントがモデルによって全然違うことにびっくりした。
AIモデルによってタスクの適切かどうかなども[公式ドキュメント](https://docs.github.com/ja/copilot/using-github-copilot/ai-models/choosing-the-right-ai-model-for-your-task)に載っていたので、コツコツ学んでいこうと思います。
ChatGPTを使用したアプリ開発記【TailwindCSSを使用してUIを改修】

## 1. TailwindCSSをインストール
```json
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init
touch postcss.config.js
```

## 2.TailwindCSSのスタイルをインポート
```src/index.css
@tailwind base;
@tailwind component;
@tailwind utilities;
```

## 3. TailwindCSSの設定ファイル（tailwind.config.js）の編集
デフォルトでは、Tailwindはすべてのファイルにスタイルを適用します。Reactコンポーネントやindex.htmlにもスタイルを適用するため、tailwind.config.jsのcontent配列を編集して、スタイルを適用するファイルのパスを指定します。
```tailwind.config.js
/** @type {import('tailwindcss').Config} */
module.exports = {
  content: [
    "./index.html",
    "./src/**/*.{js,jsx,ts,tsx}",
  ],
  theme: {
    extend: {
      fontFamily: {
        audiowide: ['Audiowide', 'sans-serif'],
      },
    },
  },
  plugins: [],
}

```

## 4.投稿画面の改修
```App.js
// アプリ名のフォント
<h1 className="font-audiowide text-3xl">Tomomitsu Keruma SNS</h1>

// フォームのデザイン
<form onSubmit={handleSubmit} className="bg-white p-4 rounded shadow-md space-y-4">

//ボタンのデザイン
        <button
          type="submit"
          className="bg-blue-500 text-white px-4 py-2 rounded-2xl hover:bg-blue-600 transition duration-200 shadow-md"
        >
          投稿する
        </button>
```


## UI

![スクリーンショット 2025-05-10 9.48.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058366/933e786e-51d4-4d2d-a505-00ddf15b1cce.png)
ABC405振り返り

## はじめに

AtCoder Beginner Contest 405(ABC405)に参加しましたので報告します。

## 概要

- 今回はA問題とB問題を解いた
- B問題は力技になってしまい、時間がかかってしまった
- C問題が簡単らしかったようで、ランキング(パフォーマンス)が落ちてしまった

## A - Is it rated?

2つの条件で分岐させる問題です。AtCoder Regular Contest(Div.1, Div.2)をモチーフとしています。
最初に共通の範囲外で弾くようにしていますが、不要だったかなと思います。

```cpp:A.cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
  int r, x;
  cin >> r >> x;
  if (r < 1200 || r > 2999) {
    cout << "No" << endl;
    return 0;
  }
  if (x == 1) {
    if (r >= 1600 && r < 3000) {
      cout << "Yes" << endl;
      return 0;
    } else {
      cout << "No" << endl;
      return 0;
    }
  } else {
    if (r >= 1200 && r < 2400) {
      cout << "Yes" << endl;
      return 0;
    } else {
      cout << "No" << endl;
      return 0;
    }
  }
  return 0;
}
```

## B - Not All

setで同じ数字をまとめて数字が抜けていないかを判定、という愚直な手段を取っています。
他の方の回答を見ると、もうちょっとスムーズなんですけど、みんなPythonなんですよね。

今回はPythonの方が有利だったのかもしれません。

```cpp:B.cpp
#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for (int i = 0; i < (n); i++)

bool loop_check(set<int>& a, int m) {
  for (int i = 1; i <= m; i++) {
    if (a.find(i) == a.end()) {
      return false;
    }
  }
  return true;
}

set<int> copy_to_set(vector<int>& a) {
  set<int> ret_val;
  for (int i = 0; i < (int)a.size(); i++) {
    ret_val.insert(a[i]);
  }
  return ret_val;
}

int main() {
  int n, m;
  cin >> n >> m;
  vector<int> a(n);
  set<int> b;
  rep(i, n) cin >> a[i];

  int count = 0;
  b = copy_to_set(a);
  while (loop_check(b, m)) {
    a.pop_back();
    b = copy_to_set(a);
    count++;
  }
  cout << count << endl;
  return 0;
}
```

## C問題以降

C問題は問題文を見て、ああこれは愚直にやったらTLE(CPU時間制限オーバー・誤答扱い)だな、と思い諦めました。時間的に眠いのもありましたし。
解説を見ると典型的累積和問題。アルゴ数学本で出てたのにうわーという感じです。こういう応用がとっさに出てこないあたりがまだまだ勉強不足なのかなと思うところです。
なおD問題以降は見ていません。

## 結果

- パフォーマンス：173
- レーティング：74→86(+12)

とりあえずパフォーマンスは閾値147を上回った、程度です。
才能の有無以前に、まだまだ学習時間が足りていない模様。

## 今後の課題

- やはり数理素養が低い(忘れている)ので、その辺をどうにかする
  - アルゴ数学本を進める
  - 高校数学の書籍で学習する
- 鉄則本を読む。こちらはアルゴ数学本の後でもいいか
- 今回はコードが冗長になってしまった。AtCoder Daily Trainingを活用して短時間の回答を目指す
DBの基本概念をなるべく分かりやすく書いてみた

今回はデータベースの基本概念を
初心者に教えるなら。

というテーマで書いてみようと思います。

自分自身まだ実務未経験の
ひよっこエンジニアですらない
状態ではありますが、

自分の復習のためと
初学者の方のとっかかりになれば幸いです。


### **データベースってなに？**

すごく簡単に言うと、
たくさんの情報をまとめて、
使いやすく整理しておいた
「情報の倉庫」のようなものです。

本棚に本を種類別に並べたり、
引き出しに書類を分類してしまうのと似ています。

それがもっと大きくて
賢くなった図書館がデータベース。

みたいなイメージでOKです。


### **なんでデータベースが必要なの？**

一言で言うなら膨大なデータを
人力で管理するのは不可能に近いからです。

私たちは普段からたくさんの情報を扱っています。

お店の商品の情報、お客さんの情報、
学校の成績、ウェブサイトのデータなど、
情報はどんどん増えていきます。

増え続ける膨大な情報を手作業で管理するのは大変ですし、
間違いも起こりやすくなります。

例えば会社で働いてるとして
何日から働いてるか、１日あたりの給料はいくらか、
有給は何日あるのか、退職金の金額はいくらか。

これらのことを自分で覚えておけ！
なんて言われたら大変ですよね？

ですがデータベースを使うと、
これらの情報を効率的に、
正確に管理できるようになります。

会社のデータベースがあれば先ほどの情報を
そこで管理していつでも見れるようになるわけですね。


### **データベースの「基本概念」って？**

なんとなくデータベースについて理解したところで
もう少し踏み込んでデータベースについて理解していきましょう。

* **データとは何か**: そもそも「データ」って何でしょう？ 名前や数字、日付など、コンピュータで扱える情報のひとつひとつのことを「データ」といいます。
* **データベースシステム**: データベース自体だけでなく、データを管理したり、取り出したりするためのソフトウェア（データベースマネジメントシステム）なども含めた全体の仕組みを「データベースシステム」と呼びます。
* **どんなことができるようになるの？**: データベースシステムを使うと、必要な情報を素早く見つけたり（検索）、新しい情報を追加したり、間違った情報を直したり（更新）、いらなくなった情報を捨てたり（削除）といったことが簡単にできるようになります。

データベースはとても便利なものですが
それだけだと膨大な情報を取り扱えません。

なのでデータベースマネジメントシステムを利用することで
私たちが普段活用してるような形で情報を扱うことができるわけです。

そしてこれら全体を通してデータベースシステムって呼ばれてるわけですね。

ちなみに全体と言いましたが、実はこの全体には私たちユーザーも含まれてます。
また、データベースを管理する人や管理する場所。

そういったデータベースに関する全てのものを含めて
データベースシステムと呼んでいると覚えてください。


### **DBMSを例えるなら？**

図書館を想像してみてください。

たくさんの本（データ）が
種類や著者ごとに整理されています（データベース）。

司書さんがいれば、あなたが借りたい本（必要な情報）を、
整理された中から素早く見つけ出してくれますよね？

この司書さんがDBMS（データベースマネジメントシステム）です。


### まとめ

さて、なんとなくデータベースについて理解できたでしょうか？

今回の記事はあくまで初心者にもわかるように
簡単にさわりとなる部分だけを解説しました。

実際にデータベースを実務で利用するとなると、

・どうやってデータを保存するの？
・その時の保存形式は？
・そもそもデータを取り出すにはどうしたら？

こういった問題が出てきます。

これらを解決するにはデータベースの設計についてや
SQLというデータベースからデータをとってくるための
プログラミング言語を学ぶ必要が出てきます。

ぜひ、今回の記事で、
データベースってこんな便利なものなんだ。
と思って頂けたのなら設計やSQLについても学んでみてください。

それぞれについても分かりやすく解説する記事を
投稿しようと思っています。

では、最後まで読んでいただきありがとうございました。
Python in Excel で数理最適化問題を解いてみる

## はじめに

Python in Excelは，2023年3月にプレビュー版が発表され，2024年3月にGA（General Availability）として正式リリースされた機能である．この機能により，Excel上でPythonコードを直接実行できるようになった．従来はVBAや外部ツールを必要としていた数理最適化やデータ分析を，より柔軟に実装できるようになった．

本記事では，PuLPなどの外部ライブラリを使用せず，標準的なSciPyライブラリとNumPyによって，簡単な線形最適化問題をExcel上で解決する手法を紹介する．外部ライブラリを使用しない理由としては，現在のPython in ExcelがMicrosoft提供の標準ライブラリセットに制限されており，PuLPのような特殊なライブラリは自由にインストールできないためである．しかし，基本的な数理最適化であれば，すでに利用可能なSciPyライブラリで十分対応できることを本記事で示す．

なお，本記事で扱うような線形計画問題は，従来からExcelのソルバーアドインを使用して解くことも可能である．ソルバーはシンプルな問題を視覚的に解くには便利だが，Pythonを用いることで複雑なロジックの組み込みが可能になり，大規模な問題や繰り返し計算が必要なケースでより柔軟に対応できる利点がある．

## 問題設定

以下のような最適化問題を想定する．

- **目的関数**：コストの最小化  
- **制約条件**：特定の制約を満たす選択肢（バイナリ変数）を選ぶ  
- **バイナリ変数**：選ぶか選ばないかを0か1で表現する  

Excel上では以下のように設定される（画像参照）：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880471/9d0a29bf-a5f5-441c-a18d-0087d84ff23d.png)

- セル`D5:G5`：コスト  
- セル`D9:G12`：制約係数行列  
- セル`I9:I12`：制約の上限値

## Python in Excelの準備

1. Excelの「数式」タブ → 「Pythonエディター」を開く  
2. 以下のライブラリをインポートする：

```python
import numpy as np
import pandas as pd
from scipy.optimize import linprog
```

## Pythonスクリプトの構成

以下に示すのは，Excelのセルから読み取ったデータをもとに最適解を求めるコードである．バイナリ変数を用いており，まず連続変数として解いた後にバイナリに丸め，制約を満たすように調整を行う．

```python
# Excelからデータを取得
c_values = np.array(excel("D5:G5")).flatten()
A_values = np.array(excel("D9:G12"))
b_values = np.array(excel("I9:I12")).flatten()

# 線形計画法で連続変数として最適化
result = linprog(c_values, A_ub=A_values, b_ub=b_values, bounds=(0, None), method='highs')
continuous_x = result.x

# バイナリに丸める
best_x = np.round(continuous_x).astype(int)

# 制約違反がある場合の調整
while np.any(A_values.dot(best_x) > b_values):
    violated = np.where(A_values.dot(best_x) > b_values)[0][0]
    impacts = [(i, A_values[violated, i]) for i in range(len(best_x)) if best_x[i] == 1]
    impacts.sort(reverse=True)
    for i, _ in impacts:
        best_x[i] = 0
        if np.all(A_values.dot(best_x) <= b_values):
            break

# 最適解のみを返す（シンプルなリスト形式）
best_x.reshape(1, -1)  # 1行×N列の横向き配列に変換
```
最終行を`best_x.reshape(1, -1)`としている理由は，計算結果をExcelのセル範囲（例：`D3:G3`）に直接返すためである．これにより，最適化で得られた0/1のバイナリ値を横一列のセルに表示することができ，Excelでの可視化や後続の計算に利用しやすくなる．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880471/33c6ee30-86c6-4151-822f-1ba255d54b0c.png)


## クラウドのウェアハウスとの連携の可能性

Python in Excelの現状では，外部ライブラリやドライバのインストールに制限があるため，Snowflakeや Microsoft Fabricなどのクラウドサービスと直接連携することはまだ難しい．しかし，今後のアップデートでは，以下のような連携が期待される：

1. **Microsoftエコシステムとの連携強化**：
   Microsoft Fabricや Azure Synapse Analyticsとの統合が進み，Python in Excelから直接これらのサービスにアクセスできるようになる可能性がある．

2. **サードパーティのデータサービス連携**：
   Snowflakeなどの主要なデータプラットフォーム用のコネクタがPython in Excelの標準ライブラリとして追加される可能性がある．

3. **カスタムパッケージのサポート**：
   将来的には，独自のPythonパッケージをインストールする機能が追加され，必要なコネクタライブラリを自由に使えるようになることが期待される．

これらの機能が実装されれば，Excel上での最適化計算結果を直接クラウドのウェアハウスにデータを送信し，データ分析パイプラインの一部として組み込むことが可能となる．


## おわりに

Python in Excelは，これまで表計算ツールとして利用されていたExcelに，より柔軟な数値計算・最適化を行えるようになる．

本記事ではPuLPやOR-Toolsのような最適化ライブラリを用いずに，標準的なSciPyライブラリのみで解法を示した．今後のアップデートにより，さらに高度なライブラリが利用可能になることが期待される．
確率分布～正規分布

# <font color="Red">正規分布</font>

自然なバラつきを表現する確率分布。
実験誤差など、一般的な自然に生まれるバラつきはこれに従う。

**<INS>式</INS>**

```math
f(x) = \frac{1}{\sqrt {2\pi} \cdot \sigma}\exp{\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)}
```

- 期待値：$\mu$
- 分散：$\sigma^2$


<INS>**標記（記号）**</INS>
```math
N(\mu, \sigma^2)
```

<INS>**形**</INS>
($\mu=0$、$\sigma = 1$)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800268/80481ef8-b795-43fc-82e1-faf03dcc25f7.png)



# <font color="Red">標準正規分布</font>
正規分布のうち、$\mu = 0$、 $\sigma = 1$　としたもの。
- 標記（記号）：$N(0,1)$
- 式：
```math
f(x) = \frac{1}{\sqrt {2\pi}}\exp{\left(-\frac{x^2}{2}\right)}
```

標準正規分布表から数値を読み解く場合や、スケーリングの異なる条件での変数間を共通の尺度化する際によく用いられる。

なお、確率変数xを標準化したものをzとすると、
```math
z = \frac{x-\mu}{\sigma}
```
標準正規分布は正規部布確率変数xをzに置き換えて、
```math
f(x) = \frac{1}{\sqrt {2\pi}}\exp{\left(-\frac{z^2}{2}\right)}
```
と表示したものになる。



# <font color="Red">式について考察</font>

自然な表現の式に類似しており、意外と理解しやすい。

**<INS><導入></INS>**
良く知られている、以下の状況について。
- 体温計の温度平衡（体温への漸近）
- コンデンサに一定電圧印加時の電荷の充電の時間変化の式

これら、一定環境下に置かれた対象がその環境に漸近（収束）していく時間推移は、
```math
f(t) = A\cdot\left(1-\exp\left(-\frac{t}{B}\right)\right)+C
```
これはよく見かける。


**<INS><正規分布類似式></INS>**
逆に、高温物が低温環境温度に漸近する挙動、コンデンサの電荷の放電は、
```math
f(t) = A' \cdot\left(\exp\left(-\frac{t}{B'}\right)\right)+C'
```

として表現可能。
C'は収束値であり、電荷の放電のように0に落ち着く場合にはC'=0。
0に落ち着くとすると、
```math
f(t) = A' \cdot\left(\exp\left(-\frac{t}{B'}\right)\right) \tag{1}
```
正規分布は、式（１）と同じ形。
```math
f(x) = \frac{1}{\sqrt {2\pi} \cdot \sigma}\exp{\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)}
```
```math
f(z) = \frac{1}{\sqrt {2\pi}}\exp{\left(-\frac{z^2}{2}\right)}
```

係数の　$\frac{1}{\sqrt{2\pi}\cdot\sigma}$　は、積分して1になるように調整した係数。
（確率分布なので、積分すると1にならないといけない）
式(1)は変数が時刻なので基本的に正の値を取る、一方向の思想。
正規分布は正負を考え、左右対称で且つ微分可能な自然さを表現するため2乗している、というイメージ。

たしかに、非常に自然な分布を表現していることが理解できる。
Jupyter Tips

# ログの重複出力抑止

Jupyterではルートロガーにハンドラーが設定されてるので、
子ロガーにハンドラーを設定しログ出力すると、ルートロガーに伝搬し、ルートロガーのハンドラーでも出力される。（子ロガーとルートロガーで重複出力される）

これを防ぐにはlogger.propagete=Falseを設定すればいい

```python
from logging import getLogger,DEBUG

logger = getLogger(<logger name>) # 子ロガー取得
logger.propergate = False # 親ロガーへの伝搬抑止
logger.setLevel(DEBUG)
if not logger.hasHandlers():
    logger.addHandler(<your handler>)
logger.debug("Hello World")
```
# 参考
* [Logging Flow](https://docs.python.org/ja/3/howto/logging.html)
Ubuntuでは管理者権限で置いたhtmlが読めない?のでwxWebViewを使った話

# 前提
Ubuntu Desktop 24.04.2 LTS, 2025-05-10 現在の話です。かつ、私が何か勘違いしている可能性あり。

直前二つと同じく[szmCt](https://www.dlsite.com/maniax/work/=/product_id/RJ01387146.html) 開発時のお話。

# sudo make install で置いた html
szmCt の元になった [openMSX/catapult](https://github.com/openMSX/catapult) はクロスプラットフォームのソフトでありまして、とりあえず Windows と macOS で動かせるのを確認しつつ、いくつか Linux でもビルドしとこうと考えてたわけですよ。

catapult には説明書を呼び出す機能がなかったので、独自に html で説明書を用意して[wxLaunchDefaultBrowser](https://docs.wxwidgets.org/3.2/group__group__funcmacro__misc.html) で読めるように書きました。

Windows では .exe ファイルの近くに、macOS では .app ファイルに入れておけばいいのでしょうが、はて Linux ではどこに置けばいいのかと。

話が前後しますが、元の catapult から [wxWidgets](https://wxwidgets.org/) を使っておりまして、wxWidgets は [CMake](https://cmake.org/) でライブラリビルドすることが推奨されています。

そこで CMake 側で何かないかと調べたところ、CMakeLists.txt に `include(GNUInstallDirs)` と書いた上で `${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DOCDIR}` を使えばいいらしい[^1]とわかりました。

Linux ディストリビューションは色々ありますが、とりあえず Ubuntu 使っときゃ大丈夫やろってんで用意。コードを用意して、`cmake --build . -j8` して、`sudo make install`。これでいいでしょう…あれ？

# wxWebView でなんとか回避

**ブラウザは起動するのに表示してくれません**。ちょっと待たんかい。

ファイラや端末から見ると、確かにそこに html ファイルがある。ところが szmCt 関係なく直接ブラウザで開こうとしても開けない。デフォルトブラウザを変更してもやっぱりダメ。

これはちょっとまずい。て言うか、同じような構造であろう openMSX 本体側でも説明書出せないんですけど。

仕方がないので別手段を模索します。で、webView なるものがあって、幸い wxWidgets に wxWebView [^2] もありますよと。そんじゃーそっち使いますか。てことで、`make install` された html を読むときは webView で、リンクで外部ページを要求されたデフォルトブラウザを呼ぶ、というコードにしました。軽く書いてますがなかなかめんどくさかったです。

# 問題なのは Ubuntu だけ?
さて、そもそもなんでそんなことになるのか原因はよくわからないのですけれど、そういや近頃は html で何でもできるからセキュリティ対策で実行可能ファイルと同じ扱いになってるのかしら、とか思ったんですが、どうもそうでもないらしい。

試しに fedora 使ってみたら問題なかったし、それどころか Ubuntu 派生のはずの Linux Mint でも問題は起きませんでした。冒頭でも記したとおり、私が何か思い違いをしてる可能性があるんで詳しい人とかちょっと調査してみてください。

なお、元々この作業がいらない Windows と macOS は webView 使ってません。というか少なくとも wxWebView は今回の用途では使い物になりません。独自プロトコル不可とかで。

[^1]: [GNUInstallDirs](https://cmake.org/cmake/help/latest/module/GNUInstallDirs.html)
[^2]: [wxWebView](https://docs.wxwidgets.org/3.2/classwx_web_view.html)
【過去記事移植】iOSアプリ｜プライバシーマニフェスト対応要否の確認方法

> ※この記事はもともと 2024年6月 に執筆した内容を移行したものです。

## Apple公式の告知情報

『リマインダー：アプリ提出時のプライバシー要件が5月1日から適用されます』  
https://developer.apple.com/jp/news/?id=pvszzano

## 手探りで確認するとしたら...

Xcodeの検索機能を用いてCoreAPIでピックアップされているモノを全て検索すれば、テキストベースで目視確認できます。各自でチェックシートを作り、`creationDate`や`fstat`を探し出せば網羅できるはずです。

サードパーティーのライブラリも`pod install`したのであればPodfile.lockを確認すれば導入状況をチェックできるはずです。

ですが、規模の大きなアプリケーションとなるとチェック漏れ防止のためにも上記手段は避けたいところです。何時間も掛かる訳だし、「ボーッとした瞬間」に確認漏れのリスクが高まります。
個人的には規模に限らず、闇雲にチェックする方法は避けた方が良いと思っています。
−−−−というか、世界中のエンジニアがそう思ってるはずです。。。

## 待ってました自動チェックツール！！

GitHubで機械的にチェックできるソースを公開してくれています。（ありがとぉぉぉぉWooderさん!!）

GitHub - Wooder/ios_17_required_reason_api_scanner:  
https://github.com/Wooder/ios_17_required_reason_api_scanner

> 【 "ios_17_required_reason_api_scanner" を利用する注意点】
> Appleが公言しているサードパーティライブラリ、CoreAPIはカバーできています。（記事執筆時点）
> このツールを利用すれば審査に100%通るという保証はありませんのでご承知おきください。

ちなみに、私の仲間うちでは「公言されていないライブラリも指摘を受けた」との報告がありました。
厳しい審査員に当たってしまったのかもしれないですね。。。

## 実際に使ってみよう

まずはXcodeでプロジェクトを用意しましょう。WelcomeウィンドウからCreateメニューで作ったばかりのプロジェクトをWorkフォルダに設置しました。

![image001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990015/22c9e6e3-2a9a-4af1-94ba-2bbb5593be2a.png)

次にターミナルを使ってGitのcloneコマンドでリポジトリをローカルにダウンロードします。clone先はXcodeのプロジェクトと同じく、Workフォルダに設置しました。

```bash
# bashコマンド

cd /Users/Shared/work/   # 場所は任意のフォルダでOKです。
git clone git@github.com:Wooder/ios_17_required_reason_api_scanner.git
```

![image002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990015/6ace5835-1dee-4773-8aec-ad8849347532.png)

では、新品箱出し状態のTest001プロジェクトをツールでスキャンしてみましょう。以下はターミナルでテキストベースのスキャンを行う例です。

```bash
# bashコマンド

cd ./ios_17_required_reason_api_scanner
sh required_reason_api_text_scanner.sh ../Test001
```

![image003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990015/20945f6d-4318-461c-8afa-00d5b37faaeb.png)

正常にスキャンが走りました。何もCoreAPIやサードパーティライブラリを導入していないので、スキャン結果が空っぽですね。プライバシーマニフェスト対応が必要無いということが確認できました。

次に、検索結果が出てくる表示パターンが気になってきますね。
XcodeでTest001プロジェクトを修正します。よく利用されている「UserDefaults」を記述してみましょう。

```swift
// ContentView.swiftに追加したコード

init() {
    UserDefaults.standard.object(forKey: "")
}
```

![image004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990015/0919fdf6-b0fd-476d-b12d-d090857cce6a.png)

再度ターミナルでスキャンします。

```bash
# bashコマンド

cd ./ios_17_required_reason_api_scanner
sh required_reason_api_text_scanner.sh ../Test001
```

「UserDefaults」がヒットしました。「Line numbers」でコードの行番号まで表示されています。
ちなみにCoreAPIをコメント化していてもスキャンでヒットします。不要なコメントは削除しましょうね。

ーーということで以上のスキャン結果から、

- どのファイルが
- 何のAPIを使用していて
- マニフェストにAPI使用理由を書かないとリリース審査で落ちる

ということが分かりました。
的確ですね...自分もこのツールを使用してチェックしたかったです...

※次の記事ではプライバシーマニフェストファイルをプロジェクトに追加して何を記入すれば良いのかを記事にしてみたいと思います。

## 最後に - メーロンで働いてみませんか？

もしメーロン株式会社にご興味をお持ちいただけましたら、随時採用も行っております！  
下記リンクのWantedlyページをご覧いただき、気になる点があればお気軽にご相談ください。

- **在宅ワーク希望**  
- **出社と在宅のハイブリッド勤務**  
- **インフラエンジニアからのキャリアチェンジ**  

など、ご要望があれば柔軟に対応いたします！

https://www.wantedly.com/companies/company_2563374
位置情報を取得する方法のメモ

Androidで位置情報を取得する方法とオプションをメモします。
Android で位置情報を取得するには、[Fused Location Provider API](https://developer.android.com/develop/sensors-and-location/location?hl=ja)を利用するのがいいです。`FusedLocationProviderClient` を通じて現在地の取得・更新を簡単に実装できます。位置情報をリアルタイムで取得したい場合や、1回だけ取得したい場合など設定できます。


```kotlin
private lateinit var fusedLocationClient: FusedLocationProviderClient
private val locationCallback = object : LocationCallback() {
    override fun onLocationResult(locationResult: LocationResult) {
        super.onLocationResult(locationResult)

        for (location in locationResult.locations) {
            println( "位置を取得しました: 緯度${location.latitude}, 経度${location.longitude}")
        }
    }
}

val locationRequest = LocationRequest.Builder(
    Priority.PRIORITY_HIGH_ACCURACY, // 優先度の設定
    2000L // 更新間隔
).apply {
    setMinUpdateIntervalMillis(2000L) // 最小の更新間隔の設定
    setMaxUpdateDelayMillis(5000L) // 最小の更新間隔の設定
    setWaitForAccurateLocation(true) // 最小の更新間隔の設定
}.build()

fusedLocationClient = LocationServices.getFusedLocationProviderClient(requireContext())

fusedLocationClient.requestLocationUpdates(
    locationRequest,
    locationCallback,
    Looper.getMainLooper()
)
// 位置を取得しました: 緯度xxx, 経度xxx
```
```kotlin
override fun onPause() {
    super.onPause()
    fusedLocationClient.removeLocationUpdates(locationCallback) // 位置情報取得を停止する。
}
```

#### 参考
https://developer.android.com/develop/sensors-and-location/location/retrieve-current?hl=ja