OmniAICreator/Qiita-1.07M huggingface dataset:
【Java】ソート時のComparison method violates its general contractの原因

先日、Javaのプログラムでソートを実行した際に、以下のような例外に遭遇しました。

```
Exception in thread "main" java.lang.IllegalArgumentException: Comparison method violates its general contract!
        at java.base/java.util.ComparableTimSort.mergeLo(ComparableTimSort.java:748)
        at java.base/java.util.ComparableTimSort.mergeAt(ComparableTimSort.java:485)
        at java.base/java.util.ComparableTimSort.mergeCollapse(ComparableTimSort.java:413)
        at java.base/java.util.ComparableTimSort.sort(ComparableTimSort.java:213)
        at java.base/java.util.Arrays.sort(Arrays.java:1249)
        at SortSample.main(SortSample.java:16)
```

実行したプログラムは以下のような感じです。
```Java:
class SortSample {
  public static void main(String[] args) {
    int N = 500;
    ComparableObject[] a = new ComparableObject[N];
    // 中略(値を設定する処理)
    Arrays.sort(a);
  }
}

class ComparableObject implements Comparable<ComparableObject> {
  double d = 0;
  ComparableObject(double d) {
    this.d = d;
  }
  @Override
  public int compareTo(ComparableObject o) {
    if ( d != o.d ) {
      return d < o.d ? -1 : 1;
    } else {
      return 0;
    }
  }
}
```

`ComparableObject`というクラスを、`d`の値の大小で比較可能なクラスとして定義し、それをソートしているだけに見えます。

`Comparison method violates its general contract!`というエラーメッセージを検索してみると、
- `compare(A, B) < 0`
- `compare(B, A) < 0`

が同時に成立してしまうようなケース、という情報が出てきました。(参考：[Error: Comparison method violates its general contract! の対処法](https://silight.hatenablog.jp/entry/2014/09/21/231123))
ただし、このサイトでは`compareTo()`の実装に問題があり、状況によって`compare(A, B) < 0`と`compare(B, A) < 0`の両方を満たしてしまうケースがある、というものでした。

今回のケースは、単純に`double`の大小で比較しているだけなので、一見問題なさそうに見えます。

しかし、この単純な実装でも`compare(A, B) < 0`と`compare(B, A) < 0`を両方満たしてしまうケースがあることがわかりました。(本当は両方とも`< 0`が成り立つのではなく、両方とも`> 0`が成り立ちます)

それは、`double`の値が`NaN`の場合です。

試してみましょう。

```Java:
double a = 0.0 / 0.0; // NaN
double b = 1.0;
System.out.println(String.format("a <  b  => %s", a < b));
System.out.println(String.format("a >  b  => %s", a > b));
System.out.println(String.format("a == b  => %s", a == b));
System.out.println(String.format("a != b  => %s", a != b));
```
実行結果：
```
a <  b  => false
a >  b  => false
a == b  => false
a != b  => true
```

恐ろしいことに、`NaN`との比較をすると、`<`も`>`も`==`も成り立たず、`!=`のみが成り立つという状況になります。
さらに恐ろしいことに、`a`と`b`の両方とも`NaN`の場合も全く同じ結果になります。

なかなか気づきにくい原因なので、記事として残しておくことにしました。
kaptが残ったままKotlin2.xに移行したらビルドが通らなくなった

先日時間がなくてできていなかったKotlin2.x系へのアップデートをしたのですが、ローカルビルドやCIがよく失敗するようになりました。
安定したビルドに戻すまでに行なった対応を残しておきます。

Kotlinのバージョンは以下のようにアップデートしました。

移行前：1.8.21
移行後：2.1.20

参考にしたのは主に以下の動画からです。

https://2024.droidkaigi.jp/timetable/693342/

# 原因

推測の域を出ていませんが、おそらくkaptが残ったまま2.xに移行したためです。
上記参考動画でも言及されていますが、kaptが残ったままだとビルドプロセスが複雑になり、コンパイル速度が速くなるどころか、従来よりも遅くなる可能性があります。
kaptはXMLビューでデータバインディングを使用していると消すことができないため、ビューバインディングか、Jetpack Composeに書き直してkaptを消してkspへの移行が必要になります。

今回移行したこちらのプロジェクトではデータバインディングを使用しているXMLビューがまだ残っていました。
「まあ大丈夫だろう」と思って移行したのが失敗でしたね...

# 対策

ローカルビルドでは時々失敗する程度でしたが、Github Actionsを使用したCIはほぼ毎回失敗するようになっていました。
その際のエラー文言で以下のように書いてありました。

```
Not enough memory to run compilation. Try to increase it via 'gradle.properties':
kotlin.daemon.jvmargs=-Xmx<size>
```

どうやらメモリ不足でDaemonプロセスが終了していたようです。
以下を参考にgradle.propertiesを見直しました。

https://qiita.com/irgaly/items/4c22d233caf8ec55512e

具体的には以下のように直しています。

```gradle.properties
# before
org.gradle.jvmargs=-Xmx1536m
# after
org.gradle.jvmargs=-Xmx2048m -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParallelGC -XX:MaxMetaspaceSize=1024m
```

元々のヒープメモリサイズが小さかったので少し増やしたのと、ガベージコレクションを並列スレッドで行うオプションを追加しました。
ローカルビルドもCIも失敗しなくなり、むしろ速くなったと思います。

# おまけ

上記のエラーの他に、Jetpack Composeで構成している画面が一部描画されなくなる事象が起きました。
これは、MutableListをそのままビューに渡している部分があり、Strong Skipping Modeが再composeをうまく抑制していたためでした。

```
// ViewModel側で定義
val hogeLists = mutableListOf()

// View側
LazyColumn {
    viewModel.hogeLists.forEach {...}
}
```

元々の書き方が良くないと言えばそうなのですが、Strong Skipping Modeの実装によりUIの描画のされ方も変わってくるので、バージョンアップした際はコードだけでなくUIも見直した方が良いかもしれません。
【.NET 10 Preview3】C# 14 新機能まとめ

# `extension`ブロック
静的メソッド、インスタンスプロパティ、静的プロパティの拡張がサポートされ、これまで以上に多彩な拡張が可能になりました。
C# 13まではメソッドのみが拡張可能でした。
```c#
public static class Extensions
{
    public static IEnumerable<int> WhereGreaterThan(this IEnumerable<int> source, int threshold) 
        => source.Where(x => x > threshold);
}
```
この例では、`this`キーワードが付けられた`source`パラメーターがレシーバーです。しかしプロパティ宣言には、同じようなレシーバーの指定場所がありません。そこでC# 14では「`extension`ブロック」が導入されました。これは、レシーバーをそのブロック内のメンバーに公開するスコープです。
先ほどの`WhereGreaterThan`メソッドを書き換え、さらに`IsEmpty`プロパティを追加すると以下のようになります。
```c#
public static class Extensions
{
    extension(IEnumerable<int> source) 
    {
        public IEnumerable<int> WhereGreaterThan(int threshold)
            => source.Where(x => x > threshold);

        public bool IsEmpty
            => !source.Any();
    }
}
```
使い方は簡単です。
```c#
var list = new List<int> { 1, 2, 3, 4, 5 };
var large = list.WhereGreaterThan(3);
if (large.IsEmpty)
{
    Console.WriteLine("No large numbers");
}
else
{
    Console.WriteLine("Found large numbers");
}
```
ジェネリックにも対応しており、解決ルールは従来の拡張メソッドと同じです。以下のように`WhereGreaterThan`と`IsEmpty`をジェネリックにすることもできます。
ここで`INumber<T>`の制約は、> 演算子を使用可能にするために必要です。
```c#
extension<T>(IEnumerable<T> source)
    where T : INumber<T>
{
    public IEnumerable<T> WhereGreaterThan(T threshold)
        => source.Where(x => x > threshold);

    public bool IsEmpty
        => !source.Any();
}
```
静的メソッドや静的プロパティにはレシーバーが不要なので、`extension`ブロックでは型だけを指定します。
```c#
extension<T>(List<T>)
{
    public static List<T> Create()
        => [];
}
```
`extension`ブロックはこれまでの拡張メソッドと共存可能です。既存の構文に変える必要はなく、両者はまったく同じように実行されます。
既存の拡張メソッドを含む静的クラスに`extension`ブロックを追加するだけでOKです。
```c#
public static class MyExtensions
{
    // 従来の拡張メソッド
    public static IEnumerable<int> WhereEven(this IEnumerable<int> source)
        => source.Where(x => x % 2 == 0);

    // 新構文：extension ブロック
    extension(IEnumerable<int> source)
    {
        public bool IsEmpty => !source.Any();

        public int SumAll() => source.Sum();
    }

    // 静的メンバーの拡張（新構文）
    extension<T>(List<T>)
    {
        public static List<T> CreateEmpty() => new List<T>();
    }
}
```

:::note info
今後のリリースではさらに多くの拡張がサポートされる予定とのこと。
:::

# Null条件付き代入
null条件演算子「?.」を右辺値（読み取り）だけでなく、**左辺値（代入対象）でも**使用できるようになります。
以下のような`UpdateAge`メソッドを例にします
```c#
public class Customer
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class UpdateCustomer
{
    public static void UpdateAge(Customer? customer, int newAge)
    {
        if (customer is not null)
        {
            customer.Age = newAge;
        }
    }
}
```
Null条件付き代入を使うことで、`UpdateAge`メソッドを以下のように書き換えることが可能になります。`customer`が`null`でなければ`Age`を更新し、`null`であれば何もしません。
```c#
public static void UpdateAge(Customer? customer, int newAge)
{
    customer?.Age = newAge;
}
```

:::note info
IDEが、この変更を提案するために電球アイコン:bulb:でサポートしてくれるようになるそうです。
:::

# 参考
* https://github.com/dotnet/core/blob/main/release-notes/10.0/preview/preview3/csharp.md
謎のバイナリプロトコルを手動で喋りたい時の小技

## TL;DR
```
tail -f hoge.bin | nc localhost 8000 | hexdump -C
```
hoge.bin に向かって `printf "\x01\x02"` とか打つと捗る


## 前置き
未知のプロトコルを実装したいとき、手元で作ったバイナリを投げて実験しながら実装していきたいですよね。

そこで丹精込めて作ったお手製のバイナリ`hoge.bin`を、特定の TCP サーバーに投げようとすると
```
cat hoge.bin | nc localhost 8000 | hexdump -C
```
みたいなことをすると思います。

出力は hexdump に渡すと、サーバーから返ってきたバイナリをギリ人間が解読できる状態にできてとても便利です。

ただ、nc は入力が EOF になるとすぐにコネクションを閉じてしまいます。サーバーからのレスポンスを受け取り切る前に終了したり、1コネクションが1ラリーで終了しないインタラクティブなプロトコルの実験ができなかったりします。

困りましたね。

## 銀の弾丸
要は EOF を送らなければ良いので、cat の代わりに tail -f でファイルを開いてあげましょう。
```
tail -f hoge.bin | nc localhost 8000 | hexdump -C
```

これで hoge.bin の内容を出力し終えた後も nc が終了することはありません。
しかも tail -f のおかげで hoge.bin に追記すればそれも nc で送信してくれます。最高ですね。

あとは出力結果を見ながら、`printf "\x01\x02" >> hoge.bin` みたいな感じで追記してあげれば、いつでもどこでもオレオレプロトコルが喋れちゃいます。

## 余談
こんなことしなくても nc のオプションをよく調べたり、やりたいことにぴったりなスマートなコマンドを探したりすれば解決できると思いますが、そんな使用頻度の低い知識はどうせすぐ忘れるので、よく使うコマンドとよく使うオプションで代替できるのならそれが一番です。
【TypeScript】関数の引数の型を構築する方法

`Parameters<Type>` を使用すると関数の引数の型を生成できます。

以下のように記述すると型引数に指定した関数の引数の型が生成されます。

```typescript
function sample({a: string, b: number}) {
	console.log('関数のサンプル')
}

type FunctionParams = Parameters<typeof sample>
  
// type FunctionParams = {
//   a: string;
//   b: number;
// }
```

## 参考

https://www.typescriptlang.org/docs/handbook/utility-types.html#parameterstype
【書評】図解まるわかり PMO・PMのきほん

## 読んだ本

https://www.shoeisha.co.jp/book/detail/9784798185965

## 感想

PMの役割はふんわりと理解していたつもりだったが、PMOの役割はよくわからなかったため読みはじめた。本書はPM・PMOがやるべき業務内容について、ITプロジェクトとDXプログラムという２つの視点で解説される。

ITプロジェクトは普段接しているとおりの一般的なプロジェクトと言われる単位だ。エンジニアの視点で基本情報などの形で学んだ内容よりもやるべきことが多いように感じた。PMBOKの内容に沿ってかなり細かくプロジェクトの工程とやるべきことが説明されていて、理解が捗った。PMとPMOの役割の違いについてもわかりやすかった。

DXプログラムについてはニュースなどで大企業が進めている等を見聞きしたことがある程度だったが、ITプロジェクトの上位概念で、プログラムを達成するための過程にプロジェクトが存在しているとのことだった。イメージはしづらかったが、かなり長期間で規模の大きい業務であるように感じた。実際に担当することは今のところなさそうだが担当のしがいがありそうだ。

## おすすめの人

- PMやPMOの役割について知りたい人
- ITプロジェクトの進め方について理解を深めたい人

## 次に読むなら

- PMBOKになるのだろうか、まだ難しそうなので他の易しめな本を読もうと思う
個人的備忘録：フレームワークの基本と、各言語での使いどころをざっくり整理してみた

## はじめに
フレームワークは、共通する機能を効率的に再利用するための仕組みであり、開発速度の向上や保守性の確保に大きく貢献します。

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

この備忘録では、主要なプログラミング言語と、それぞれの代表的なフレームワークを整理して記録しておきます。

## Java: Spring Framework
Springは、Javaで使われる代表的なフレームワークです。DIやAOPなどの機能があり、複雑なシステムも効率的に構築できます。

https://cmc-japan.co.jp/blog/what-is-spring-framework/

Spring Bootを使えば、設定も簡単でスムーズな開発が可能です。

## Ruby: Ruby on Rails
Railsは、Rubyで使われるWebフレームワークで、"規約に従う"ことで少ないコード量で開発が進められます。

https://railstutorial.jp/

素早いプロトタイプ開発に向いており、スタートアップにも人気です。

## PHP: Laravel
Laravelは、PHPの人気フレームワークで、読みやすく整理されたコードが書けます。

https://www.kagoya.jp/howto/it-glossary/develop/laravel/

ルーティングや認証などの機能が充実しており、開発者の負担を軽減します。

## Python: Django
Djangoは、セキュリティと効率を重視したPythonのフレームワークです。

https://qiita.com/pythonista/items/19613663ef7bb3c57d4f

管理画面の自動生成や認証機能があり、大規模なWebアプリ開発にも適しています。

## JavaScript: Vue.js
Vue.jsは、軽量でわかりやすいJavaScriptフレームワークです。

https://qiita.com/Hashimoto-Noriaki/items/ea60d5932f13a9cd5707

コンポーネントを使った開発ができ、動きのあるWeb画面を作るのに向いています。必要に応じてVue RouterやVuexで機能拡張も可能です。

## まとめ
それぞれのフレームワークは、対象とするプロジェクトの要件や開発チームのスキルセットに応じて選択されます。

:::note warn
**開発効率の向上や保守性の確保を図る上で、自分の目的に合ったフレームワークを選ぶことが重要です。**
:::

フレームワークの選定は、プロジェクトの成功に大きな影響を与えるため、特徴や強みを理解したうえで適切に選ぶことが求められます！
初心者用ライブラリの読み方/書き方習得方法

# はじめに

- 筆者は「Python何それおいしいの？」っていうレベルのプログラミング経験なしで情報系の学部に入学。
- 学部3年まではなんとか授業についていっていたものの、学部4年以降の研究でライブラリを読む際に挫折しかけました。
- そんな中でどうやってプログラミングスキルやライブラリの読み方、オープンソースの実装方法などを学んでいったかを、当時を思い出しながらここにまとめました。
- ターゲット：ネット上に転がってるサンプルコードやOSSのコードをどう読み進めればいいのか分からないorどうしたら書けるようになるのか分からない、かつ時間と根気がある人（どちらかがない人は恥を偲んで先輩に頼る、これしかないです）

## （備考）筆者のプログラミング歴

学部1年：プログラミング経験ゼロで情報系学部に入学、Pythonについて学ぶ教養科目で初めてプログラミングを経験
学部2年：授業を通してPython、Ｃ、Java等のプログラミング課題をやりまくる
学部3年：初めてハッカソンに参加、OSSという概念をここで初めて知る
学部4年：Anaconda初めまして
修士1年：サークル（OBOG含）でアプリ共同開発を開始（修士2年次にリリース）
修士2年：AtCoder茶色（競プロのレートが特別高いわけではない）
社会人（現在）：某企業のAI研究開発職のひよっこ🐤

---

# プログラミング学習ステージ

## **Stage 1: スクリプト（自己完結型）**
- まずは**単一スクリプト**（1つの `.py` ファイルまたは `.ipynb`）でコードを書けるようになりましょう。
    - 例: PyTorch / TensorFlow を用いた MNIST分類をQiitaの記事を参考にしながら実装or写経。
    （参考：[PyTorchでMNISTを扱ってみた (機械学習)](https://qiita.com/TaigaMasuda/items/24d85860ffcd724de9eb)）
- **可読性の高いコードを書く練習**。
  - 関数やクラス定義の冒頭に**どんな関数・クラスなのかコメントを記述**。3日後、1週間後に読み直してもどんなコードか分かるように書くことが大事。
  - 入出力のデータ形式もメモするとなおよし。
    ```python
    # input: [N, 8], output: [N, 1]
    ```

## **Stage 2: ライブラリを読む（複数ファイル構成のコード）**
- 複数のファイルやフォルダから構成されているライブラリのコードを読むときは**重要なファイルや関数をたどる**ことで整理。
    - `README.md` を読んで、メインスクリプトを特定（例：`train.py`, `test.py`）。
    - **ツリー構造で整理**し、理解を深める。
- デバッグは **logging を活用**。例えば以下のように設定しておくとどのファイルで起きたエラーなのか一目瞭然になる。
  ```python
  import logging
  
  logger = logging.getLogger(__name__)
  log_format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
  logging.basicConfig(level=logging.DEBUG, format=log_format)
  ```

## **Stage 3: ライブラリを作る**
- ライブラリが読めるようになったら書けるようにもなろう
    - 機械学習系のライブラリは少なくとも**モデル系とデータセット系の分離**を意識。
        - それ以外は正直好みの問題。色んなライブラリを読みながら自分の好きなフォルダ構成を固めていきましょう。
- **再現実験ができるように管理**
    - 実行毎に**ログフォルダ**を作成し、モデルやハイパーパラメータを保存。
    - **importlib を活用し、変更に強い設計をする**。以下はファイル名(文字列)からモジュール(import ○○と同等)として使えるようにするコードの例
 
      ```python
      import importlib.util
      import sys
      import os
      
      def import_module_from_file(file_path):
          module_name = os.path.basename(file_path).split('.')[0]
          spec = importlib.util.spec_from_file_location(module_name, file_path)
          module = importlib.util.module_from_spec(spec)
          sys.modules[module_name] = module
          spec.loader.exec_module(module)
          return module
      ```

## **Stage 4: 環境構築**
- 複雑な環境構築が必要な場合も対処できるようになればもう完璧。
    - **必要なパッケージのインストール方法を理解**
        - `conda` / `pip` を活用。
        - `environment.yml` や `requirements.txt` があれば利用。
    - **インストール時のトラブル対処**
        - `torch` や `torch-geometric` を先にインストール。
        - `conda` の `base` 環境にインストールしていないか確認。
        - バージョン違いによるエラーはネットで調査 or ChatGPT に質問。
- そうはいってもどうしても環境構築ができない場合がある
  - 必要なモジュールがpip/conda/GitHub で探しても見つからない場合
  - どうしても使っているPythonのバージョンと合わない場合
  - 関数が削除されている
    →**実装を諦めるor他のモジュールで代用する判断も必要**。

---

# まとめ

- 最初からコードが読める/書ける人なんていない。**学習ステップは段階的に進めることが大事**。初めの方は質より量。
- 他人のコードを読むことで沢山ノウハウを得られる。**真似できる部分は真似する、ダメなところは反面教師**。
- 環境構築に関してはマシン依存・他パッケージ依存な部分もあるので**時には諦めも肝心**。他に使えるオープンソースを探したり、別のライブラリで代用できないかを考えたり、最悪読んで参考にし自環境で使えるように再構築しましょう。
PDF / ExcelをSQL操作したい

# どれ使うとええのん？

```code:概要
Excelのみ : duckdb

PDFのみ sqlite3

PDFとExcel両方 : pfdplumber + sqlite3 
```

<h3>いるもん</h3>

```ruby:
pip install duckdb
```

# pdfのみ

```ruby:
import pdfplumber
import pandas as pd
import sqlite3

# PDFの表を抽出
with pdfplumber.open("data.pdf") as pdf:
    table = pdf.pages[0].extract_table()

df = pd.DataFrame(table[1:], columns=table[0])  # 最初の行をヘッダーに

# SQLiteでSQL実行
conn = sqlite3.connect(":memory:")
df.to_sql("table_name", conn, index=False, if_exists="replace")

query = "SELECT * FROM table_name WHERE age > 30"
result = pd.read_sql(query, conn)
print(result)
```

# excelのみ

```code:
import duckdb

query = "SELECT * FROM read_excel('data.xlsx', sheet='Sheet1') WHERE age > 30"
result = duckdb.query(query).to_df()
print(result)

か、

import sqlite3
import pandas as pd

df = pd.read_excel("data.xlsx")
conn = sqlite3.connect(":memory:")
df.to_sql("table_name", conn, index=False, if_exists="replace")

query = "SELECT * FROM table_name WHERE age > 30"
result = pd.read_sql(query, conn)
print(result)

```
応募ボタン探し、応募ボタン自動でぽちぃ

<h3>データを自動送信するには</h3>
<p>htmlからidを自動取得</p>
<p>BeautifulSoupとrequest 2つ使う</p>


<br>
<h3>インスト方法</h3>

```ruby:インスト
pip install beautifulsoup4
pip install lxml
```

<br>
<h3>動作確認</h3>

```ruby:sample.py
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time

# WebDriverの設定（Chromeを使用）
driver = webdriver.Chrome()  

# 応募ページを開く
url = "https://example.com/apply"  # ここを実際のURLに変更
driver.get(url)

# ページの読み込み待機
time.sleep(3)

try:
    # 応募ボタンを探す（buttonタグ or input[type="submit"] など）
    apply_button = driver.find_element(By.XPATH, "//button[contains(text(),'応募') or contains(text(),'Apply')]")

    # 応募ボタンをクリック
    apply_button.click()
except Exception as e:
    print("ボタンめよら:", e)

# 数秒待ってから閉じる
time.sleep(5)
driver.quit()

```
Flask note. /  はてな 記事取得

<br>
<h3>やり方</h3>

```ruby: ✅ 

はてな API：デベロッパーページ APIキー取得
Note API：デベロッパーページ APIキー取得
```

<br>
<h3>code</h3>

```ruby: ✅ 

```

<br>
<h3> oath認証 やり方 </h3>

https://qiita.com/TakahikoKawasaki/items/e37caf50776e00e733be?utm_source=chatgpt.com

https://zenn.dev/crebo_tech/articles/article-0011-20241006?utm_source=chatgpt.com

https://techblog.asia-quest.jp/202410/what-is-oauth-2.0-authentication-and-authorization?utm_source=chatgpt.com


<br>
<h3>request : ログインデータ取得
フォーム送信処理</h3>

```ruby: ✅ 
from flask import Flask,request

app = Flask(__name__)

@app.route('/login', methods=['POST'])
def login():
    username = request.form.get('username')  # フォームの値を取得
    password = request.form.get('password')
    return f"ログインユーザー: {username}, パスワード: {password}"

if __name__ == '__main__':
    app.run(debug=True)

```

<br>
<h3>request APIデータ受け取り</h3>

```ruby: ✅ 
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/api/data', methods=['POST'])
def get_data():
    data = request.json  # JSONデータを取得
    return jsonify({"受け取ったデータ": data})

if __name__ == '__main__':
    app.run(debug=True)

```

<br>
<h3>response エラーメッセージを変えれる</h3>

```ruby: ✅ 
from flask import Flask, jsonify, make_response

app = Flask(__name__)

@app.route('/custom_response')
def custom_response():
    response_data = {"message": "成功！", "status": "OK"}
    response = make_response(jsonify(response_data), 200)  # 200: 成功
    response.headers["Content-Type"] = "application/json"  # ヘッダー指定
    return response

if __name__ == '__main__':
    app.run(debug=True)
```

<br>
<h3>response エラーになったら、エラーメッセージページにジャンプさせる</h3>

```ruby: ✅
@app.route('/error')
def error():
    response = jsonify({"error": "データが見つかりません"})
    return response, 404  # 404エラーを返す
```



<br>
<h3>response request </h3>

```ruby: ✅ 
requestオブジェクト : サーバー → クライアント情報 保存

responseオブジェクト : クライアント → サーバー 情報 保存
```

<br>
<h3>HTTPリクエスト</h3>

```ruby: ✅ 
# GET /users - ユーザーの一覧を取得
# POST /users - 新しいユーザーを作成
# GET /users/<id> - 特定のユーザーを取得
# PUT /users/<id> - 特定のユーザーを更新
# DELETE /users/<id> - 特定のユーザーを削除
```

<br>
<h3>作ったURL 動いてるかテスト</h3>

```ruby: ✅
curl -X POST http://localhost:5000/submit \
     -H "Content-Type: application/json" \
     -d '{"name": "Bob", "age": 25}'
```

<br>
<h3>天気APIから気温データのみ取り出したい (レスポンス解析)</h3>

```ruby: ✅ 
import requests

# APIのURL（仮のAPIキーを使用）
url = "https://api.openweathermap.org/data/2.5/weather"
params = {
    "q": "Tokyo",  # 都市名
    "appid": "YOUR_API_KEY",  # APIキーをここに入れる
    "units": "metric"  # 摂氏（°C）で取得
}

# APIリクエストを送信
response = requests.get(url, params=params)

# レスポンス解析
if response.status_code == 200:  # 成功した場合
    data = response.json()  # JSONデータを取得
    temp = data["main"]["temp"]  # 気温を取得
    print(f"東京の気温: {temp}°C")
else:  # エラー処理
    print(f"エラー発生: {response.status_code}, {response.text}")

```
Windows11(Cline)からAWS Documentation MCP Serverを呼ぶのに詰まった話

# 前提
環境
- Windows11
- VSCode
- Cline


公式ドキュメントより Prerequisites の設定が済んでいること
https://awslabs.github.io/mcp/servers/aws-documentation-mcp-server/

# 事象
ドキュメントのInstallationの通りのmcp設定ファイルを記載
```json
{
  "mcpServers": {
    "awslabs.aws-documentation-mcp-server": {
        "command": "uvx",
        "args": ["awslabs.aws-documentation-mcp-server@latest"],
        "env": {
          "FASTMCP_LOG_LEVEL": "ERROR"
        },
        "disabled": false,
        "autoApprove": []
    }
  }
}
```
するとClineからこんなエラーが出力された
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754476/bca95d1c-9892-41e2-8954-c84bf8cdc8e2.png)

# 解決法
公式ドキュメントのInstallationから、下記のようにargsの設定を変更する必要があった

```json
{
  "mcpServers": {
    "awslabs.aws-documentation-mcp-server": {
      "command": "uvx",
      "args": [
        "--from",
        "awslabs-aws-documentation-mcp-server",
        "awslabs.aws-documentation-mcp-server.exe"
      ],
      "env": {
        "FASTMCP_LOG_LEVEL": "ERROR"
      },
      "disabled": false,
      "autoApprove": []
    }
  }
}

```

エラー解消 :grinning:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754476/e9694969-f0bb-4a0c-9101-8c758ce64cf2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754476/a84cf01d-c9cd-43b6-bc79-77a4b76723db.png)
個人的備忘録：これだけは押さえたい！人気プログラミング言語別ライブラリまとめてみた

## はじめに

プログラミングを学び始めたばかりの人にとって、「ライブラリ」という言葉は少し難しく感じるかもしれません。

:::note info
**しかし、ライブラリを使うことで自分のコードを簡潔にし、複雑な処理を短時間で実現できるようになります。**
:::

本記事では、さまざまなプログラミング言語における代表的なライブラリを紹介し、開発現場で役立つ知識をまとめます。

---

## 一般的なプログラミング言語でよく使われるライブラリ紹介

プログラミングにおいて、ライブラリは開発を効率的に進めるための重要なツールです。各プログラミング言語には、目的に応じた定番のライブラリが存在します。

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

本記事では、主要なプログラミング言語ごとに、よく使われる代表的なライブラリを紹介します。

https://wa3.i-3-i.info/word1473.html

---

### Python

- **NumPy**：数値計算ライブラリ。配列処理や数学関数に強く、データ分析の基盤として使われます。
- **Pandas**：データ分析用ライブラリ。表形式のデータ処理が簡単にでき、CSVやExcelの読み書きも可能。
- **Matplotlib / Seaborn**：可視化用ライブラリ。グラフやヒートマップなどを作成できます。
- **scikit-learn**：機械学習用ライブラリ。分類、回帰、クラスタリングなどのアルゴリズムが豊富。

**参考文献**

https://qiita.com/python_academia/items/62aefbf4e373cd2aa496

---

### JavaScript（Node.js含む）

- **React**：UI構築ライブラリ。コンポーネントベースで動的なWebアプリを構築できます。
- **Express**：Node.jsでWebサーバを作るための軽量フレームワーク。
- **Lodash**：配列やオブジェクトの操作を簡潔にするユーティリティライブラリ。
- **Axios**：HTTP通信を簡単に扱えるPromiseベースのクライアント。
- **Chart.js / D3.js**：データ可視化ライブラリ。

**参考文献**

https://www.sejuku.net/blog/4559

---

### Java

- **Spring Framework**：エンタープライズアプリケーション向けの強力なフレームワーク。
- **Hibernate**：ORM（Object-Relational Mapping）ライブラリ。
- **Apache Commons**：日常的な開発で役立つユーティリティクラス群。
- **JUnit**：単体テストのための標準ライブラリ。

**参考文献**

https://www.sejuku.net/blog/65313

---

### Ruby

- **Rails（Ruby on Rails）**：Webアプリケーション開発のためのフルスタックフレームワーク。
- **RSpec**：テストフレームワーク。
- **Pry**：インタラクティブなデバッグツール。
- **Sinatra**：軽量なWebアプリケーションフレームワーク。

**参考文献**

https://zenn.dev/ae__b/articles/202208_ruby_library

---

### Go（Golang）

- **Gin**：高性能なWebフレームワーク。
- **Gorm**：ORMライブラリ。
- **Cobra**：CLIアプリケーション構築用のライブラリ。
- **Viper**：設定ファイルの読み込み管理。

**参考文献**

https://qiita.com/twrcd1227/items/1a05ffa459f45b2968e4

---

## まとめ

開発するアプリケーションの種類や求められるパフォーマンス、保守性などに応じて、適切なライブラリを選ぶことが開発の成功に繋がります。

**今回のまとめた内容が誰かの技術の支えになれば幸いです！**
複素数平面上の円の軌跡に関する京大入試数学について

# はじめに
円の軌跡を描く方程式を手計算で考えるのは少し複雑なので、頭が痛い。したがって、受験数学ではちょうどいいレベルの問題設定になりがちである。そこで、今回は、一文で問題文が完結する京大入試数学を用いて複素数平面の証明問題の解法の流れをつかむことを目指す。

ただし問題は、以下のサイト記事にある2004年の京大数学を用いた。

https://mikiotaniguchi.com/main/c/kc_035fukusosuu_heimen_zukeimondai_main.htm


# 問題
複素数平面上に$1,-1,\alpha$という点が存在するとき、$-\frac{1}{\bar{\alpha}}$を含めた4点はなんと以下のように同一円周上にある。これを示す。


![厳密解による外接円の描写.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/45be61c1-4c0c-4b9a-8673-2dfe64366ffc.png)

# 解法

まず、天才ではない我々一般人は、部分点を稼ぐために少しでも粘りずよく答案を書きあげる必要性がある。なので、まずは『すぐわかりそうなこと』をあぶりだしていくことである。この場合、すぐわかりそうなことは、点1,-1の垂直二等分線上に円の中心は存在することから、円の中心座標は純虚数である。
つまり、中心を$\beta$ とおいた場合

```math
\beta=k i
```
ただし、$k$は実数

と表すことができる。

この情報は点1,-1に関わる情報なので、$\alpha$に関する情報も入れたい。そこで、点1と中心$\beta$と点$\alpha$と中心$\beta$の距離は円の性質上等しい。

このことを武器にして、その値が点$-\frac{1}{\alpha}$と中心$\beta$の距離に等しければ証明終了となる。

なので、その方針で考える。

点1と中心$\beta$と点$\alpha$と中心$\beta$の距離は円の性質上等しいを式にすると以下のようになる。



```math
|1-\beta|=|\alpha-\beta|
```
ここで、

```math
\beta=k i
```

を代入し、両辺を2乗すると以下のようになる。


```math
1+k^2=(\alpha-ki)\overline{(\alpha-ki)}
```


```math
1+k^2=(\alpha-ki)(\overline{\alpha}+ki)
```

```math
1=|\alpha|^2+k(\alpha-\bar{\alpha})i
```

一方で、

```math
|\beta-\frac{1}{\bar{\alpha}}|^2=|ki-\frac{1}{\bar{\alpha}}|^2=(ki-\frac{1}{\bar{\alpha}})(-ki-\frac{1}{\alpha})=k^2-\frac{-k(\alpha-\bar{\alpha})i+1}{|\alpha|^2}=k^2+1
```

となる。

（最後の計算で、

```math
1=|\alpha|^2+k(\alpha-\bar{\alpha})i
```

を用いた。）

# プログラム

さて、上記の例をプログラムを用いて図示してみよう。

``` python circle_alpha.py
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
import math


alpha=3+2j

aa=1
bb=-1
cc= alpha

#三角形の座標
x1=np.real(aa)
y1=np.imag(aa)

x2=np.real(bb)
y2=np.imag(bb)

x3=np.real(cc)
y3=np.imag(cc)
#クラメルの公式の準備（行列式の計算）
A=x3-x1
B=y3-y1

D=x2-x1
E=y2-y1

C=0.5*(x3**2-x1**2+y3**2-y1**2)
F=0.5*(x2**2-x1**2+y2**2-y1**2)

#行列式の計算
delta=(A*E-B*D)
delta1=(C*E-B*F)
delta2=(A*F-C*D)
# クラメルの公式による解の計算
a=delta1/delta
b=delta2/delta

r=((x1-a)**2+(y1-b)**2)**0.5

plt.plot(x1,y1,color='red',marker='o')
plt.plot(x2,y2,color='red',marker='o')
plt.plot(x3,y3,color='red',marker='o')

plt.plot(np.real(-1/np.conj(alpha)),np.imag(-1/np.conj(alpha)),color='black',marker='o')

#極座標方式、つまり媒介変数表示で円を描写する。
theta=np.linspace(0,math.pi*2,100)

x=a+r*np.cos(theta)
y=b+r*np.sin(theta)

plt.plot(x,y,color='blue')
plt.axis('equal')
plt.savefig('厳密解による外接円の描写.png')
plt.show()
```

これを実行すると以下のような画像になる。


![厳密解による外接円の描写.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/45be61c1-4c0c-4b9a-8673-2dfe64366ffc.png)

このように、4点は同一円周上にあることが分かる。

ちなみに、このプログラムについて詳しく知りたい方は以下の記事を参考にされたい。

https://qiita.com/arairuca/items/fbecad249f8d4dced499


# まとめ
今回は、複素数平面上の円に関する問題を扱った。受験数学で大事なのは、分かるところをまずは書き出し、そこから解法の糸口を広げるといった試行錯誤を行うという訓練である。今回の証明問題は、シンプルなゆえに、解析的な解き方や幾何学的な解き方など多くの別解が考えられるはずである。したがってこのような質の高い問題を別の分野の視点から眺めてみるというのも一つの数学的思考力を磨く方法になるだろう。
建築に使える機械学習データセット(日記)

自分用にメモ
---

## 1. 建物外観（外装）データセット

| データセット名 | 内容 | 規模・備考 | URL |
|----------------|------|------------|-----|
| eTRIMS Image Database | 都市景観＋建物ラベル | 60シーン | [リンク](https://www.ipb.uni-bonn.de/html/projects/etrims_db/) |
|  [建築物]画像分類データセット | 建物種別（住宅、オフィスビル等）分類 | 955枚 | [リンク](https://data.harbest.io/ja/datasets/building1) |

---

## 2. 建物内部・構造系データセット

| データセット名 | 内容 | 規模・備考 | URL |
|----------------|------|------------|-----|
| Structured3D Dataset | 室内3D＋セマンティックマスク | 約21,000シーン | [リンク](https://structured3d-dataset.org/) |
| Matterport3D | 実空間3Dスキャン＋RGB-D | RGB-D画像付き | [リンク](https://niessner.github.io/Matterport/) |

---

## 3. 建物損傷・災害判定用データセット

| データセット名 | 内容 | 規模・備考 | URL |
|----------------|------|------------|-----|
| xBD Dataset | 災害後衛星画像＋損傷ラベル | 45,000件超 | [リンク](https://xview2.org/) |

---

## 4. 建築設計・都市計画向けデータセット

| データセット名 | 内容 | 規模・備考 | URL |
|----------------|------|------------|-----|
| OSM Buildings | OSM建物3D/2Dデータ | 世界中 | [リンク](https://osmbuildings.org/) |
|  LIFULL HOME'Sデータセット | 間取り図・室内写真・物件属性 | 約8,300万枚の画像 | [リンク](https://www.nii.ac.jp/dsc/idr/lifull/) |

---

## 6. 建物セグメンテーション・認識

| データセット名 | 内容 | 規模・備考 | URL |
|----------------|------|------------|-----|
| Inria Aerial | 航空写真＋建物マスク | 0.3m/pixel | [リンク](https://project.inria.fr/aerialimagelabeling/) |
|  GSIデータセット（普通建物） | 航空写真＋建物マスク（マゼンタ） | 約7,200ペア | [リンク](https://gisstar.gsi.go.jp/gsi-dataset/09/index.html) |
|  SpaceNetデータセット | 衛星画像＋建物・道路ポリゴン | SpaceNet1〜7 | [リンク](https://aidata.jp/blog/spacenet-dataset/) |

---

## 7. BIM・構造工学向けデータセット

| データセット名 | 内容 | 規模・備考 | URL |
|----------------|------|------------|-----|
| TUM RGB-D | Kinect室内スキャン | - | [リンク](https://vision.in.tum.de/data/datasets/rgbd-dataset) |
| BIMCV | 建物換気・空間モデリング | Revit対応 | [リンク](https://bimcv.cipf.es/) |
|  BuildingNet | 3D建物メッシュ＋部位ラベル | 2,000棟・29万部位 | [論文](https://arxiv.org/abs/2110.04955) |

---

## 8. 建築文化・歴史建築向け

| データセット名 | 内容 | 規模・備考 | URL |
|----------------|------|------------|-----|
| WikiArt Architecture | 建築様式画像 | - | [リンク](https://www.wikiart.org/) |
| Google Landmarks v2 | ランドマーク画像＋ラベル | 5M画像以上 | [リンク](https://github.com/cvdfoundation/google-landmark) |

---

## 9. 建築生成・AI合成モデル用

| データセット名 | 内容 | 規模・備考 | URL |
|----------------|------|------------|-----|
| ArchiGAN | 平面図＋3Dレイアウト生成用 | - | [論文](https://arxiv.org/abs/1904.03798) |

---

## 10. オープンGIS/地図系建物データ

| データセット名 | 内容 | 規模・備考 | URL |
|----------------|------|------------|-----|
| Microsoft US Building Footprints | 全米建物輪郭（GeoJSON） | 1億棟以上 | [リンク](https://github.com/microsoft/USBuildingFootprints) |
| Google Open Buildings | アフリカ・アジア建物輪郭 | 20億棟以上 | [リンク](https://sites.research.google/open-buildings/) |

---
社会保険診療支払基金のオンライン請求をインストール

「マイナンバーカードでの資格認証にチャレンジ!」
https://qiita.com/nanbuwks/items/e100ea418d58697aa881

でセットアップしたPCに、オンライン請求のプログラムを設定します。


# 事前準備

今回は顔認証機器を接続せずに、マイナンバーカードで資格認証せず、ネットワークや証明書の設定だけ済ませておきます。


# ダウンロード

説明書ダウンロードはこちらから

https://www.ssk.or.jp/seikyushiharai/online/index.html


# 説明書を開く
解凍して Top.html を開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/396310d1-b53d-4063-99e3-0d3772722e43.png)

OSや接続を選んで進め、この画面の「電子証明書ダンロードサイト等」を開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/134f2f47-265e-4cd1-aa33-c5e673fd59ea.png)

「オンライン請求システム セットアッププログラム」から `OnlineSetup_Iryou_windows.zip` をダウンロード。
![Screenshot from 2025-04-11 18-45-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/3bc83846-1d6e-468f-9e1a-ab390b1b8e19.png)

解凍して、
![Screenshot from 2025-04-11 19-07-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/c202f63e-37ec-4612-8569-ff92902546a6.png)
Windowsフォルダ中のSetup.exeを開く。
![Screenshot from 2025-04-11 19-07-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/a82961cf-26cc-4b21-933e-332d58a494bf.png)
環境設定ツールが起動するので適宜選択し、「環境設定」
![Screenshot from 2025-04-11 19-08-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/4756cebd-838b-4800-85b4-91998750c161.png)
デスクトップにアイコンができる。
![Screenshot from 2025-04-11 19-10-53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/7d03e6bb-cde8-4207-b526-1a4a3d8919cc.png)
【Markdown PDF】ファイル名・日付とページ数を非表示にする

## はじめに

[Markdown PDF（VSCodeの拡張機能）](https://github.com/yzane/vscode-markdown-pdf) ではデフォルトで、出力されたPDFにファイル名・日付とページ数を表示するようになっています。しかし、簡単なレポートを書く際に、そのどちらも表示したくない場合がありました。本稿では、Markdown PDFでファイル名・日付とページ数を非表示にするように設定する手順を記します。

## 結論

`settings.json` に以下を追加する。

```json: settings.json
{
    "markdown-pdf.footerTemplate": " ",
    "markdown-pdf.headerTemplate": " ",
}
```

[公式ドキュメント](https://github.com/yzane/vscode-markdown-pdf/blob/master/README.ja.md#markdown-pdfdisplayheaderfooter) には、値を `""` にすると書いてありますが、それだと反映されないっぽいです。代わりに、スペース１文字にしています。[こちら](https://github.com/yzane/vscode-markdown-pdf/issues/331) に、issue がありました。

> ## こだわり（どうでもいい）
> header と footer についての設定ですが、キーの順番はアルファベット順に従って footer -> header にしています。しかし、ヘッダとフッタという概念に従うと、キーの順は逆になるかと思います。それでも、この場合はアルファベット順にするメリットがあると考えています。
>
> **メリット**
> - キーの順番を迷うことなく決定できる
>   - たとえば、`markdown-pdf.format` というキーが用意されている
>   - これを追加で指定する場合、`markdown-pdf.headerTemplate` および `markdown-pdf.footerTemplate` よりも上位に配置するか、下位に配置するかを、アルファベット順にすれば迷うことがない
>   - ただし、header と footer （ほかには、width と height など）は、概念に従う場合でも迷うことなく決定できそうではある
> - キーを探しやすい
>   - 大量のキーの中でもすぐに場所を特定できる
>   - キーをすでに追加しているかいないかもすぐに特定することができる（検索機能を使えばいい話だけど）
>
> **デメリット**
> - 感覚的・概念的に違和感がある
>   - `height -> width` になってしまう（これはかなり痛い）

## さいごに

お読みいただきありがとうございました。参考になれれば幸いです。

Markdown PDF めちゃくちゃ便利です。ドキュメントも見やすい👀　しかも、GitHubアカウントを見たかんじ、日本の方が作ったっぽいです。かっこいい！

## 参考

👉 公式 GitHub

https://github.com/yzane/vscode-markdown-pdf

👉 公式ドキュメント（参考箇所）

https://github.com/yzane/vscode-markdown-pdf?tab=readme-ov-file#markdown-pdfdisplayheaderfooter

👉 ヘッダとフッタの非表示機能に関する issue

https://github.com/yzane/vscode-markdown-pdf/issues/331
PlayMakerで数式を簡単に扱う方法【MathExpressionのススメ】

こんにちは、ARエンジニアのせぎゅです！  
私はPlayMakerを使ってXRコンテンツを日々制作しています。

今回は、PlayMakerで複雑な数式をシンプルに記述するための便利なTIPSをご紹介します。  
STYLYユーザーにもオススメの内容です！



## 四則演算は`Float Operator`でできるけど…

PlayMakerで基本的な加減乗除を行うには、`Float Operator`アクションを使います。

https://hutonggames.fogbugz.com/default.asp?W81

例：`10 * 5` の計算  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/d4473fc0-3a08-48c1-ad67-c725ce7c98e9.png)

```
Float Operatorアクションの設定
- 値1: 10
- 値2: 5
- 演算: Multiply
- 結果: ResultA
```

結果は`ResultA`に50として保存されます。



## 複雑な数式になると手間が増える…

例えば `10 * 5 + 20 * 2` のような数式を処理するには、複数の`Float Operator`が必要です。

1. `10 * 5 → ResultA`  
2. `20 * 2 → ResultB`  
3. `ResultA + ResultB → ResultC`

といったように、3つのアクションと中間変数が必要になります。  
これでは見通しが悪く、保守性も下がります…



## 解決策：`MathExpression`アクションの活用！

そんなときに役立つのが、非常に便利なアクション  
`MathExpression` です！

このアクションでは、以下のように**数式を直接記述**できます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/9586ffb4-85e2-4b24-a46c-2d20d57d2839.png)

```cs
10*5+20*2
```

以下のように変数を組み合わせることも可能です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/a74c6054-4d12-457e-8d36-a920186367cb.png)


```cs
ResultA+20*2
```

このMath Expression、なぜかPlayMakerの公式Action Referenceには載っていません…

https://hutonggames.fogbugz.com/default.asp?W41

私自身、2年間このアクションの存在を知りませんでした。  
（もっと早く知りたかった…！）



## まとめ

`MathExpression`アクションを使うことで、

- 複雑な数式も1アクションで完結
- 中間変数が不要
- ステートがスッキリ整理できる

PlayMakerをもっとスマートに使いたい方は、ぜひこのアクションを試してみてください！
【競技プログラミング:リハビリ】巡回セールスマン問題(総当たり)

# 既存投稿一覧ページへのリンク
[一覧ページ](https://qiita.com/o_chan_t/items/fc759695acfaef8df2cc)

# 巡回セールスマン問題(総当たり)
```python:sample_code.py
import itertools
import math

def calculate_distance(point1, point2):
    """2点間のユークリッド距離を計算"""
    return math.sqrt((point1[0]-point2[0])**2 + (point1[1]-point2[1])**2)

def total_path_distance(path):
    """経路の総距離を計算（開始地点への戻りを含む）"""
    total = 0.0
    for i in range(len(path)):
        total += calculate_distance(path[i-1], path[i])  # 最後の要素で自動的に開始地点に戻る
    return total

def tsp_bruteforce(cities):
    """ブルートフォースで最適経路を探索"""
    min_distance = float('inf')
    best_path = []
    
    # 全ての順列を生成（開始地点固定で効率化）
    for permutation in itertools.permutations(cities[1:]):
        current_path = [cities[0]] + list(permutation)
        current_distance = total_path_distance(current_path)
        
        if current_distance < min_distance:
            min_distance = current_distance
            best_path = current_path
            
    return best_path, min_distance

if __name__ == "__main__":
    # テキストファイルを読み込む
    with open('./input_data/01.txt', 'r') as file:
        # 各行をタプルに変換してリストに格納
        cities = [tuple(map(int, line.split())) for line in file]

    optimal_path, min_distance = tsp_bruteforce(cities)
    
    print("都市情報")
    print(*cities)
    print("最適経路:")
    print(" → ".join([str(point) for point in optimal_path]))
    print(f"総移動距離: {min_distance:.2f}")

```

```./input_data/01.txt
2 1
9 2
10 9
6 10
10 1
```

# イメージ
## 例01
```
都市情報
(2, 1) (9, 2) (10, 9) (6, 10) (10, 1)
最適経路:
(2, 1) → (9, 2) → (10, 1) → (10, 9) → (6, 10)
総移動距離: 30.46
```

![base_image.create_20250411191615.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530912/c5b90c9e-edf7-4c1e-bbd5-1f302bac24ba.png)

## 例02
```
都市情報
(8, 8) (8, 10) (3, 4) (7, 7) (1, 9) (5, 6) (3, 9)
最適経路:
(8, 8) → (8, 10) → (3, 9) → (1, 9) → (3, 4) → (5, 6) → (7, 7)
総移動距離: 20.96
```

![base_image.create_20250411192233.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530912/fde7e363-9fb4-4b09-8c7a-37122b1eae25.png)
XIAO ESP32C6でカラーLED、Grove - Chainable RGB LEDで遊ぶ(P9813)



いろいろ、注意
----

- 過去ログを見てね、おねがいします。
- まぶしい
- 3.2.0


結果
----

![image_original (83).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/37a8d4d0-8121-4915-9795-9808b9134164.jpeg)

![image_original (84).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/2cbf2041-b113-4e2e-8f03-57848a217c66.jpeg)

![image_original (85).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/6b98feea-dae4-4379-90b7-48aa28b5d40e.jpeg)



プログラム
----

```c++


//Chainable_LED_XIAO_ESP32C6_1
//1個専用のカラーRGB LEDのライブラリ


//送信クロックの発生
void clk() {

  digitalWrite(D9, LOW);//clk
  delay(20);                       // wait for a second
  digitalWrite(D9, HIGH);//clk
  delay(20);                       // wait for a second

}//clk


//1バイトを送信する
void sendByte(int b) {

  for (int i = 0; i < 8; i++) {
    if ( (b & 0x80) == 0) {
      digitalWrite(D10, LOW);//data
    } else {
      digitalWrite(D10, HIGH);//data
    }//endif
    clk();
    b = b << 1;
  }//for i

}//sendByte


//1個のLED専用
void setColorRGB(int red, int green, int blue) {

  //開始
  sendByte(0);
  sendByte(0);
  sendByte(0);
  sendByte(0);

  //ここから
  int prefix = 0b11000000;
  if( (blue  & 0x80)==0 ) {prefix = prefix | 0b00100000;}
  if( (blue  & 0x40)==0 ) {prefix = prefix | 0b00010000;}

  if( (green & 0x80)==0 ) {prefix = prefix | 0b00001000;}
  if( (green & 0x40)==0 ) {prefix = prefix | 0b00000100;}

  if( (red   & 0x80)==0 ) {prefix = prefix | 0b00000010;}
  if( (red   & 0x40)==0 ) {prefix = prefix | 0b00000001;}
  sendByte(prefix);

  sendByte(blue);
  sendByte(green);
  sendByte(red);
  //ここまで

  //終了
  sendByte(0);
  sendByte(0);
  sendByte(0);
  sendByte(0);

}//setColorRGB


// the setup function runs once when you press reset or power the board
void setup() {
  //GPIOポートの初期化
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(D10, OUTPUT); //data
  pinMode(D9, OUTPUT); //clk
}//setup


// the loop function runs over and over again forever
void loop() {

  //赤
  setColorRGB(0x55, 0x00, 0x00);
  delay(500);                       // wait for a second

  //緑
  setColorRGB(0x00, 0x55, 0x00);
  delay(500);                       // wait for a second

  //青
  setColorRGB(0x00, 0x00, 0x55);
  delay(500);                       // wait for a second
  
}//loop



```
A2A対MCP：AIアーキテクチャにおけるプロトコル革命

現在の急速に進化するAI分野において、2つの重要なプロトコルがインテリジェントシステムの構築方法を再形成しています：GoogleのAgent-to-Agent Protocol (A2A)とModel Context Protocol (MCP)です。これらのプロトコルはAIアーキテクチャ開発の異なる側面を表していますが、共に一つの未来を指し示しています：私たちは決定論的なプログラミングから自律的な協調システムへと移行しているのです。

## 根本的な違い：ツール対エージェント

**MCP**（Model Context Protocol）は本質的に**ツールアクセス**のためのプロトコルです。これは大規模言語モデルが様々なツール、データ、リソースと相互作用するための標準的な方法を定義します。簡単に言えば、MCPはAIがプログラマーが関数を呼び出すように、様々な機能を使用できるようにします。

**A2A**（Agent-to-Agent Protocol）は**エージェント間の協力**に焦点を当てています。これはインテリジェントエージェントが互いを発見し、通信し、協力する方法を確立し、異なるAIシステムが人間のチームのように一緒に働けるようにします。

## 分かりやすい比喩：作業場対会議室

これらのプロトコルの違いをこのように考えてみましょう：

- **MCPは工具作業場**：作業員（AIモデル）に各ツール（API、関数）の場所、目的、使用方法を知らせますが、作業員同士がどのように協力するかは指導しません。
- **A2Aは会議室**：異なる専門家（専門化したAIエージェント）が集まり、互いの専門知識を理解し、複雑なタスクを共同で完了する方法を調整できるようにします。

## 自動車修理工場の例

複数のAI整備士を持つ自律型自動車修理工場を想像してみましょう：

- **MCPの役割**：整備士がジャッキ、レンチ、テスト機器などの特定のツールの使用方法を知ることを可能にします。「プラットフォームを2メートル上げる」や「レンチを右に4mm回す」といった構造化された指示です。
- **A2Aの役割**：顧客が整備士と通信できるようにし（「車からガタガタ音がします」）、整備士同士や部品供給業者エージェントと協力できるようにします。「左のホイールの写真を送ってください」、「液漏れに気づきました。これはどのくらい続いていますか？」

## 技術比較

|側面|MCP|A2A|
|---|---|---|
|**主な焦点**|モデルとツールの接続|エージェント間の協力|
|**相互作用モード**|関数呼び出し、構造化I/O|会話型、長時間実行タスク|
|**応用シナリオ**|ツール統合、API呼び出し、リソースアクセス|マルチエージェント協力、複雑なタスク分解、サービス発見|
|**抽象レベル**|低レベル（特定の機能）|高レベル（意図と能力）|
|**標準化状況**|徐々に標準化中|初期開発段階|

## 利点と課題

### MCPの利点
- 明確な構造、予測可能な実行
- 既存のAPIフレームワークとの簡単な統合
- AIとツールの接続の複雑さを軽減
- 比較的低いパフォーマンスオーバーヘッド

### MCPの課題
- 柔軟性が限られ、各ツールの明示的な定義が必要
- 高度に動的または未知のタスクには理想的ではない
- 複雑な協力要件の表現が困難

### A2Aの利点
- 動的な発見と即興の協力をサポート
- オープンエンドで複雑なタスクに適している
- 自然な人間のチーム協力パターンに近い
- 高度にスケーラブルで、新しいエージェントの追加が容易

### A2Aの課題
- 複雑な状態一貫性管理
- セキュリティとアクセス制御の課題
- 重要な推論オーバーヘッド
- 未熟な部分的障害処理メカニズム

## 競合ではなく補完的

A2AとMCPは競合技術ではなく、補完的なものです。実際のアプリケーションでは、両方を一緒に使用する必要があることが多いです：

- MCPはエージェントがツールにアクセスするための標準的な方法を提供します
- A2Aは複数のエージェント間で協力とタスク委任を実装するための標準的な方法を提供します

実際には、完全なAIシステムアーキテクチャは一般的に以下を必要とします：
1. MCPを使用してAIと様々なツールやデータソースを接続する
2. A2Aを使用して複数のエージェント間の協力とタスク委任を実装する

## 将来の発展傾向

### 短期的に可能性のある発展
- MCPは標準化を続け、モデルやフレームワークを越えた普遍的なツールアクセスプロトコルになる
- A2Aは複雑なビジネスアプリケーションで検証され始める
- 両方のプロトコルが主流のAI開発フレームワークに統合される

### 長期的展望
- 決定論的プログラミングから意図指向プログラミングへの移行が見られる
- ソフトウェアシステムは固定プロセスよりも有能なインテリジェントチームに似てくる
- エージェント協力を中心とした新世代のセキュリティ標準とベストプラクティスが登場する
- 開発者の役割は「指示書き手」から「能力記述者」や「協力デザイナー」へと変わる可能性がある

## 結論

MCPとA2Aは、AIシステム構築における2つの重要な側面を表しています - 一方はツール統合に向けられ、もう一方はエージェント協力に向けられています。共に、ソフトウェア開発パラダイムの根本的な変化を示しています：明示的なプログラミングから記述的、自律的、協調的なシステムへの移行です。

これらのプロトコルが成熟するにつれて、ますますインテリジェントで柔軟、そして強力なAIアプリケーションが期待できます - これらのアプリケーションは単に事前定義された指示を実行するだけでなく、自律的に考え、適応し、協力して複雑なタスクを達成できます。私たちはもはやソフトウェアをプログラミングしているだけではなく、インテリジェントシステムと協力しているのです。

これはAIアーキテクチャの進化にとどまらず、ソフトウェア開発全体のアプローチにおける革命なのです。

[A2A vs MCP](https://a2aprotocol.ai/blog/a2a-vs-mcp)
建物と機械学習AIライブラリまとめ




##  建物解析に使えるライブラリと特徴・用途まとめ

| ライブラリ名 | 特徴 | おすすめ用途 |
|--------------|------|----------------------------|
| **YOLOv8（Ultralytics）** | 軽量・高速・Anchor-Free、簡単導入 | 建物検出、構造部位（窓・柱・屋根など）の物体検出 |
| **Detectron2** | Facebook製、高精度の検出・セグメンテーション対応、Mask R-CNN搭載 | 建物構造の**ピクセル単位分割**、部位認識 |
| **Segmentation Models PyTorch** | U-Net、DeepLabV3など豊富なモデルが簡単に使用可能 | ファサードの**セグメンテーション・部位認識**に最適 |

---

## 建物関連の有用な画像データセットまとめ

| データセット名 | URL | 内容・カテゴリ | 主な用途 |
|----------------|-----|----------------|---------|
| **2.1 CMP Facade Dataset** | [CMP Facade](https://cmp.felk.cvut.cz/~tylecr1/facade/) | 建物の**ファサード画像**と**部位ラベル**（窓・ドア・壁など） | ファサード分類、建築スタイル分析、構造部位認識 |
| **2.2 Places365** | [Places365](http://places2.csail.mit.edu/) | **365種類のシーン**（教会・家・工業地域など建物多） | 建物画像分類、転移学習の事前学習にも好適 |
| **2.3 UC Merced Land Use** | [UC Merced](https://weegee.vision.ucmerced.edu/datasets/landuse.html) | **21種類の土地利用カテゴリ**（住宅地・商業地・工業地など） | 空中写真からの**都市分類・建物用途識別** |
| **2.4 Flickr / Wikimedia（自作）** | - | スクラピングで収集、キーワード：*Gothic*, *Baroque*, *Modern* | 建築スタイルの収集・分類・時代的傾向の学習 |
| **2.5 Google Open Buildings** | [Open Buildings](https://sites.research.google/open-buildings/) | 衛星写真と**建物のポリゴン形状データ** | 建物の自動検出、都市レベルの大規模マッピング |

---

##  おすすめ組み合わせ例

| ライブラリ | データセット | 活用例 |
|------------|---------------|--------|
| **YOLOv8** | CMP Facade / Open Buildings | 建物・窓・屋根のリアルタイム検出 |
| **Detectron2** | CMP Facade / UC Merced | 建物の部位ごとの領域分割（Mask R-CNN） |
| **Segmentation Models PyTorch** | CMP Facade | ファサードのセグメンテーション（U-Net / DeepLabV3） |
| **Places365 + ResNet** | Places365 / Flickr | スタイル分類・シーン認識の転移学習モデル構築 |
| **Flickr + 自作学習** | Flickr / Wikimedia | バロック・モダン様式の分類モデルを独自作成 |

---

必要であれば、上記のどれか1つを選んで、**PyTorch学習コードのテンプレート**や**YOLO学習データフォーマット作成コード**も提供できます。どれに興味がありますか？
続spotifyの再生中の曲をgoogleで検索する

# 新シーズンですよ！

新シーズンを迎え、新曲を聞く機会が増えた今日この頃
新曲を聞きながら仕事をノリノリで進めております。

## 事件は起きた

この曲よいなぁ、何の主題歌か調べようとしたその時！
あれ、曲検索のブックマークレットが動かない！？

スポティファイのページ内容を確認する……
再生バーのタグ構造が変わっている！！

## 新ブックマークレット

ということで、早速新しい構造に対応したブックマークレットを作ってみました。
前回のコードは１行にしていましたが、ちょこっと修正する時に面倒なので今回は整形なしですｗ
改行があってもURL欄にいつも通りぶち込めば動くはずです。

```bookmarklet
javascript:(function () {
	let ci = document.querySelector('a[data-testid="context-item-link"]');
	let cs = document.querySelector('div[data-testid="context-item-info-subtitles"]');
	let ca = cs.querySelectorAll('a[data-testid="context-item-info-artist"]');
	if (ca.length <= 0) return;
	let name = ci.textContent.trim() + " " + Array.from(ca).map(element => element.textContent.trim()).join(" ");
	let query = encodeURIComponent(name);
	window.open('https://www.google.com/search?q=' + query, '_blank');
})();
```

## どうでもよい個人的な感想

スポティファイの広告なにげに好きなんですよね。
特に牛丼屋の話。

客「一番プレミアムなものをお願いします。」
店員「特盛いっちょう！」

何というか、店員の機転な対応でこいつ出来る！と思いながらほっこりしてしまう。

ということで、良いスポティファイライフを！
アンチパターン駆動デザインパターン・チュートリアル

## はじめに

最近、とある会社でアジャイル・コーチのようなことをしている。その中で、以下の3点を口うるさく唱えている。

- しっかり分析しよう
- なんのためにやってるか考えよう
- 技術力で解決しよう

RCA やレトロスペクティブでたびたび問題となる、影響範囲に起因した課題。どう見ても設計が悪いんだから、それを直しちゃえば良いし、それはコミュニケーションの改善では直らない。

でも稼働実績のあるお客様のコードを、がっつりリファクタリングするのは怖い。もはやハウルの動く城みたいになっちゃったレガシーコードをどうやってリファクタリングしてったら良いか分からない。次のメジャーバージョンアップまで塩漬けだ！

私が見ているチームだけでなく、割とどこでもある状況、もしくはリファクタリングしなきゃと思ってないかも知れない。

レトロスペクティブでディスカッションされる KAIZEN の半分くらいを設計やリファクタリングの話題が占めるようなデザイン力の強いチームにしたいと思った。やる気もあるし、うまく導ければできそうな雰囲気だし。

## デザインパターンは難しい

デザインパターンは、ソフトウェアデザインの一部でしかないが、その習得はぶっちゃけ難しい。Head First Design Pattern を手にして、挫折した人も多いのではないだろうか。

デザインパターンを知っているのと、使えるのは違う。
デザインパターンを使えるのと、効果的に使えるのも違う。

そもそもデザインパターンは、複合的に使われることが多く、単品で使われることはあまりない。

超サイヤ人である状態が通常状態になるくらいに、デザインパターンが日常会話に溶け込んでいるのが望ましい。でも、そんなのどんだけ時間がかかるんだ？精神と時の部屋もないのに。というわけで、効率的に教えられる必要があって、通常業務に織り交ぜて検討できるようになっていて、やってるうちに最終的にはどういう意図でこの設計にしたのかを、言語化して説明できるようになっちゃうような教材が必要だった。

そんな教材はない。

ないので作った。作ってたらボリューミーになってしまったので、いつもは作った資料は PDF にして渡していたけど、どうせなんで Web にして公開した。

https://takt.dev/design-pattern/

コーチしているチームには日本語が通じないので、英語で書いたが、ちゃんと日本語版も用意した。ベトナム語でくれとリクエストされたら翻訳するかも知れない。AIが。

## アンチパターン駆動でやる

◯◯パターンを学習して、それを使ってなにかを作ってみよう！は、効率が悪いし、あんまり身にならない（かった）。いま、我々の眼の前には、ハウルの動く城という強大なアセットがそびえ立っているので、それをリファクタリングする過程で学べるのが良い。リファクタリングは、長年の運用でできがちなアンチパターンをみつけて、それを起点につぶしていくのがやりやすい。

という訳で、現場でありがちなアンチパターン（う◯こーど）を題材（11種類）に、問題点を明らかにしてリファクタリングをしていく。

## リファクタリングは複数やる

デザインパターンに限らず設計は、何がしたいのか？何に困っているのか？何を解決したいのか？によって、最適なものが異なる。唯一無二の設計などないのだ。

アンチパターンを◯◯パターンを使ってリファクタリングしました。だけでは、どのような背景・意図でこのパターンを選んでリファクタリングしたのか、他の方法ではダメなのか説明できるようにならない。ここまでできて初めて「デザインパターン使えます」だと、私は思うので、そうできるように複数の異なるパターンでのリファクタリング例を付け加え、その比較を付けた。

デザインパターンはその適用意図を明確に説明できることが大事。

なお、より深い理解のための応用編として、デザインパターンの組み合わせ、似たようなパターンの比較、困りごとからのデザインパターンの適用などを付け加えた。

リファレンス的な使い方は推奨されていないが、手元に Head First Design Pattern（第2版が出てる！） などを置いて、比較しながら読み進めると、更に理解が深まることでしょう。

## 実務コードへの導入

勉強会しやすいように、各アンチパターンに、練習課題も付けた。勉強会がうまく回り始めたら、実務のコードで、紹介したアンチパターンに該当するようなコードや、良くないコードを引っ張ってきて、同じフォーマットで勉強会という名のペアプロならぬグルプロでリファクタリングを行えば良い。

無駄に会議を増やすのはオススメしないが、意味のある会議なら週1定例で1時間くらいとっても十分お釣りがくる。こなれてきたら、レトロスペクティブ内で済ませられるようになるかも知れない。

これで設計力強強のチームが出来上がるはずだが、やってみて改善点があれば随時アップデートしていく。やってみたけど、うまくいかなかった・こうしたら良かったなどのフィードバックをもらえたりなんかすると嬉しい。

ソースコードもドキュメントもサンプルコードも MIT/CC-BY-NC4.0 DEEDで公開した。

https://github.com/TAKT-R-D/design-pattern

## その他のこだわり

今回テキストを書き下ろすにあたり、これが原因で、デザインパターンや設計、ひいてはオブジェクト指向プログラミングが習得しづらくなってるんじゃないの？と思うことがある。

サンプルコードが Java

そんなこと！！と思うかも知れないが、世界で最も使われているプログラミング言語は、みんなにバカにされがちな PHP だし、学校で習うのは Python だし。学習コスト・教育コストの低い PHP や Python から入るエンジニアは多いというよりは、ほとんどだ。2025年のいま、Java で説明されましても感は否めない。

というわけで全ての例に、弊社でよく使う TypeScript に加え、PHP と Python のサンプルコードを付けた。

そして、今回、現場でよく見かけるアンチパターンも、割と実務で遭遇しそうな例を選んだ。というのも、設計系技術書やアジャイル指南書でよくあるような、車の製造で例えられたり、動物クラスを拡張してアヒルクラスを…など、分かりやすいのか分かりにくいのか分からず、実務のコードであぁこれ何か見たことある！って絶対ならないような例で学ぶのは、時間の無駄だと思うからだ。学んだだけで実際に使ったことのない知識は、時折思い出して復習することでより実務に接地した知識になる。どっかで見たことあるかもと思えるような例になっているべきである。

## まとめ

アジャイル開発をより効果的に進める施策の一環として、設計力向上のために、実務ファーストで、実際の現場でお目にかかりそうなアンチパターンを起点に、複数のデザインパターンでリファクタリングを行い、その違いなどを吟味するチュートリアルサイトを作った。

勉強して終わりではなく、設計ディスカションが日常的にできるよう、実務に組み込めるような形で構成した（つもり）。

割と読み応えのあるボリュームになっているので、設計力に課題のあるチームやイマイチ効果の上がらないアジャイルチームなどで活用いただければ幸いです。

https://takt.dev/design-pattern/
機械学習AIプロパガンダ画像

##  はじめに
本記事では、視覚的プ○パガンダの効果を模擬する目的で、画像生成AIを活用してビジュアルを画像生成しました。

##  画像生成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043781/ac815b27-1147-4121-90af-da18fba96961.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043781/c881965a-5c19-4274-b8f9-3fd8376628f5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043781/edc4d7c9-08ae-4d4e-b85b-42e770a519a9.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043781/33a5d691-d4a3-4658-9c11-ad99a36199a3.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043781/2f65011a-e49d-4b68-aa4f-cd9095622752.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043781/ad83c589-c200-43d1-9b55-9f1e0bbc9954.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043781/7239cc19-17bb-44cc-8e7c-beffc4fdfcb7.png)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043781/6b5fcf0a-379b-4b66-9f34-b3f25e031cc6.png)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043781/8d4db47c-240b-463b-8305-3d3415249ff0.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043781/5e3be439-9c49-41ff-a2b6-73a15d390feb.png)




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043781/5fb9c5f4-2b3c-46b4-a5a1-8950eaf9322d.png)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043781/fb5731ae-43f2-4ec5-a4b2-d4b2e4e72ee3.png)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043781/b626ab81-41fb-41d5-a4ab-d656c1769617.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043781/e3988419-8a04-458d-8eaf-6a75a332cc38.png)
[Linux][command] ファイル管理_ファイル削除_rm, rmdir

# rmコマンド
~~~terminal
$ rm [オプション] ファイル名
~~~

| オプション | 由来 | 説明 |
|:--|:--|:--|
| (default) | remove | - 指定したファイルを削除する |
| `-r`<br>`-R` | recursive | - ディレクトリとその中身を再帰的に削除する |
| `-f` | force | - 確認なしで強制的に削除する |
| `-i` | interactive | - 削除前に確認を求める |

# rmdirコマンド
~~~terminal
$ rmdir [オプション] ディレクトリ名
~~~

| オプション | 由来 | 説明 |
|:--|:--|:--|
| (デフォルト) | remove directory | - 指定した**空のディレクトリ**を削除します。 |
| `-p`<br>`--parents` | parents | - 指定したディレクトリが削除された後、**親ディレクトリ**も空であれば再帰的に削除します。 |
| `--ignore-fail-on-non-empty` | ignore fail on non-empty | - **空でないディレクトリ**を削除しようとした際のエラーメッセージを表示しません。 |
| `-v`<br>`--verbose` | verbose | - 削除するディレクトリの名前を**詳細に表示**します。 |
| `--help` | help | - コマンドの**ヘルプ情報**を表示します。 |
| `--version` | version | - コマンドの**バージョン情報**を表示します。 |

# Ping0-t
rm
- [3163_rm -ir, rm -iR]()
- [3601_rm -f](https://mondai.ping-t.com/question_subjects/31/question_sessions/31355318/progressing_questions/480441629)
- [3665_rm -r](https://mondai.ping-t.com/question_subjects/31/question_sessions/31969785/progressing_questions/489837014)

rmdir
- [3161_rmdir](https://mondai.ping-t.com/question_subjects/31/question_sessions/31869840/progressing_questions/488361811)
- [3279_rmdir -p](https://mondai.ping-t.com/question_subjects/31/question_sessions/31541108/progressing_questions/483298460)