OmniAICreator/Qiita-1.07M huggingface dataset:
Git リポジトリサーバーの構築方法

## きっかけ
社会人6年目になった自分
「自宅で色々コード書いたり回路図CADで色々設計したり3DCADで色々作ったりしてるけど、そろそろちゃんとそれらの創作ファイル群を管理したい」
「GitHubを使うのもなんか色々面倒だし、自宅でGitサーバーたててうまく運用できないかな」

## 構想
　今回は以下のようにラズパイ上にGitサーバーをたてて、各クライアントでワークスペースを作ったり自由にpush/pullできる簡単な仕組みが作れれば良いかな

![diagram.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513034/ebdac0fe-57a7-4099-836b-539f589bc2c4.jpeg)


## 手順

### リポジトリサーバー側

- gitサーバー用のストレージをマウントする
 こちらを参考にストレージをマウントする
 
https://qiita.com/_shin_/items/66ea48f2b282ce7a7cb4

今回はこの場所にマウントした
```
/mnt/repHDD
```

- gitのインストール
おそらくラズパイにはデフォルトでインストールされているかもしれないけど

```
$ sudo apt update
$ sudo apt install git
```

- ベアリポジトリを作成する
```
$ cd /mnt/repHDD                  #リポジトリを作成するストレージに移動する
$ modir -p rep/rep_name1/main.git #リポジトリのディレクトリを作成する
$ cd rep/rep_name1/main.git       #リポジトリを作成するディレクトリに移動する
$ git init --bare                 #ベアリポジトリを作成する
```

複数リポジトリを作成した場合は以下のような階層構造にする

```
/mnt/repHDD/rep/
            ├ rep_name1/main.git
            ├ rep_name2/main.git
            .
            .
            .
            └ rep_nameX/main.git
```
※リポジトリを作成する場所は特に決まりがあるわけではないので、自分なりにわかりやすく整理されていれば良い

### クライアント側

- sshの鍵認証設定
他のサイトやQiitaの記事でもやり方が載っていると思うが一応
```
#クライアント側
$ cd ~/.ssh                  #sshの設定ディレクトリに移動
$ ssh-keygen -t rsa -b 4096  #キーを作成
$ sftp server 　　　　　　　　　#サーバーにsftpでログイン
sftp> cd ~/.ssh              #サーバー上のssh設定ディレクトリに移動
sftp> put id_rsa.pub         #公開鍵をサーバー上に置く
sftp> exit

#サーバー側 
$ cat id_rsa.pub >> authorized_keys
$sudo vi cd /etc/ssh/sshd_config  #"sshd_config"を編集する
- sshd_config -
.
.
PubkeyAuthentication yes    #"PubkeyAuthentication yes"を有効にする
.
.

$ sudo systemctl restart sshd #sshdを再起動する

```

※ターミナル上でのpull/push操作では特に鍵認証設定しなくても毎回パスワードを訊かれるだけでgitは問題なく使えるが、パスワード入力が面倒な人は設定した方が良い。また、windows等で使えるSourceTree等のクライアントソフトは鍵認証設定をしないと使えない場合が多い


- gitのインストール
```
$ sudo apt update
$ sudo apt install git
```
- ローカルリポジトリの作成とマスターブランチ(リモートリポジトリ)の登録
```
$ mkdir -p [好きなディレクトリ]
$ git init
#ssh経由の場合 ([ポート番号]はデフォルトの22なら省略可)
$ git remote add [エイリアス名] ssh://pi@xxx.xxx.xxx.xxx:[ポート番号]/mnt/repHDD/rep/rep_name1/main.git
$ git push [エイリアス名] master #最初にpushが必要な模様
```
※詳細な設定は後で.git/configで編集できる

SourceTree等のクライアントソフトを使うとGUIベースで楽に設定できるかも


あとはよしなに運用する
User Authentication Troubleshooting Superbadge Unit



https://trailhead.salesforce.com/content/learn/superbadges/superbadge-user-authentication-troubleshooting

+ 新しいユーザーが Salesforce Authenticator アプリに接続できるように支援します。
+ シングル サインオン構成のトラブルシューティングを行います。
+ ユーザーの携帯電話が盗まれた後は、セキュリティ対策を講じてください。


# Salesforce Authenticator の設定

サリーが Salesforce Authenticator アプリをユーザーに接続できるように支援します。

:::note alert
We can't see that Sally Wu has successfully connected to your org with the Salesforce Authenticator app.


Sally Wu が Salesforce Authenticator アプリを使用して組織に正常に接続したことを確認できません。
:::



# シングルサインオンのトラブルシューティング

チームメイトのガブリエルがSAMLシングルサインオン設定のトラブルシューティングを行うのを手伝ってください。問題を特定し、修正して、更新された設定をテストしてください。

:::note alert
We can't find the expected SAML Single Sign-On settings.
:::

？？？　ちゃんとユーザでログインできてなかったような... 詳細はチェックして無さそう


# 盗まれた携帯電話

盗難された携帯電話に対応するための必要なセキュリティ対策を講じることで、組織を潜在的な悪意のある人物から保護しましょう。サリーが新しい携帯電話を受け取るまで、本人確認ができる手段を確保しましょう。


:::note alert
It looks like the Salesforce Authenticator app is still connected to the stolen phone. Make sure no one can access this app.


Salesforce Authenticator アプリが盗難された携帯電話にまだ接続されているようです。このアプリに誰もアクセスできないようにしてください。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/13bfdc6c-8176-4e83-a7e4-1e461bb698ed.png)


:::note alert

We can't see that a temporary verification code was made for Sally.
:::

ん、やり直し
Javaの「Immutableならばスレッドセーフである」から賢くなろう

## 目次
- [1. 基本的な論理関係](#1-基本的な論理関係)
- [2. 集合論における表現](#2-集合論における表現)
- [3. 具体例：不変性とスレッドセーフ性](#3-具体例不変性とスレッドセーフ性)
- [4. 包含関係](#4-包含関係)
- [5. 成り立たない関係](#5-成り立たない関係)
- [6. 数学的表現](#6-数学的表現)
- [7. 結論](#7-結論)

## <a id="1-基本的な論理関係"></a>1. 基本的な論理関係

A ⇒ B（AならばB）の場合：
- AはBの十分条件
- BはAの必要条件

## <a id="2-集合論における表現"></a>2. 集合論における表現

A ⇒ B は A ⊆ B と表せる（AはBの部分集合）

### ベン図による表現
```
    +------------------+
    |        B         |
    |  +--------+     |
    |  |   A    |     |
    |  +--------+     |
    |                 |
    +------------------+
```

## <a id="3-具体例不変性とスレッドセーフ性"></a>3. 具体例：不変性とスレッドセーフ性

### 不変なオブジェクト（A）の例
- String
- LocalDateTime
- Integer
- BigDecimal

### スレッドセーフなオブジェクト（B）の例
- 不変オブジェクト
- 同期化されたリスト
- アトミック変数
- ThreadLocal

## <a id="4-包含関係"></a>4. 包含関係

- A ⊆ B（不変オブジェクトは全てスレッドセーフ）
- B ⊇ A（スレッドセーフなオブジェクトは不変オブジェクトを含む）

## <a id="5-成り立たない関係"></a>5. 成り立たない関係

B ⇒ A（スレッドセーフならば不変、は成り立たない）

### 反例
- Vector（スレッドセーフだが可変）
- ConcurrentHashMap（スレッドセーフだが可変）

## <a id="6-数学的表現"></a>6. 数学的表現

- A ⇒ B は真
- B ⇒ A は偽
- A ⊆ B は真
- B ⊆ A は偽

## <a id="7-結論"></a>7. 結論

- A（不変性）はB（スレッドセーフ性）の十分条件
- B（スレッドセーフ性）はA（不変性）の必要条件ではない
- A（不変オブジェクト）はB（スレッドセーフオブジェクト）の部分集合
- B（スレッドセーフオブジェクト）はA（不変オブジェクト）を包含する

これらの関係から、不変オブジェクトはスレッドセーフであるが、スレッドセーフなオブジェクトが必ずしも不変であるとは限らないことがわかります。
AWS Cloud Quest クラウドプラクティショナーをクリアした感想

こんにちは、クラウド案件に参画したいな…と思いAWS_SAPの取得はしましたが、
テキストベースの理解だけで実機を全然触ったことがなかったので
今回Cloud Questに手を出してみました。

本日クラウドプラクティショナーをクリアすることができたので、
その感想を書いていきます！

![スクリーンショット 2025-04-29 130700.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194659/ebd5a8a1-a3ac-48cc-8dba-9eb678333e3d.png)

[1.Cloud_Questとは](#1-Cloud_Questとは)
[2.プレイしてみた感想](#2-プレイしてみた感想)
[3.まとめ](#3-まとめ)

# 1. Cloud_Questとは

https://aws.amazon.com/jp/training/digital/aws-cloud-quest/

システム課題に困ってる人（NPC）にAWSを使って解決していくゲームです。
課題に挑戦する際は、①解決に使う機能の説明②ハンズオンチュートリアル③DIY（自身で課題解決を行う）順番に進めていきます。

一部英語表記の部分もありますが、日本語対応しています。

# 2. プレイしてみた感想
### 良かった点
・AWSの操作を全然知らない状態でも進めることができた
・AWSについて何となく感覚をつかむことができた
・AWSの操作環境は無料なので、金額についてビビらずに触れる
・クラウドプラクティショナーについては無料で最後までできる

### いまいちだった点
・一部英語表記のままなので、英語が苦手な方は戸惑いそう
・最近のゲーム並みにグラフィックが良いわけではないので、
　純粋なゲームとして触るといまいちかも

# 3. まとめ
個人的に始めてAWSを触る時は、どこで金額が発生するのわからない。
機能が多く何から触ればいいのかわからない。といった障壁がありましたが、
Cloud Questはそれらを解決してくれたので大変満足でした。

AWSに興味があるけど何から始めればいいのかわからない…方に大変おすすめです。

次のステップとして、AWS公式にはRamp-up（ロードマップ）がいくつかのパターンで設けられているので、次はそちらを進めていきます。

https://aws.amazon.com/jp/training/ramp-up-guides/
Step-Scalable-CSSで素早くプロジェクトを始めるためのスターターキット

# Step-Scalable CSSベースで、プロジェクト立ち上げを加速するスタートダッシュセットを作成しました

> 📎 関連記事  
> 本セットのコアとなるCSS設計思想「Step-Scalable CSS」については、以下の記事で詳しく解説しています。  
> 👉 [スケール+リキッドレイアウトを段階的に組み合わせたベースCSS](https://qiita.com/takutas/items/6b2cacf5f3e96da18b52)

## はじめに

本記事では、**プロジェクト立ち上げ用のsassBaseセット**をご紹介します。

制作現場で「毎回必要になる最低限の機能・設計」をまとめたもので、  
新規サイト制作を高速にスタートさせたい人に向けたセットです。

## 作成の経緯

もともとはCSSフレームワーク「Step-Scalable CSS」の開発中に着想しました。

制作する中で、

- プロジェクト開始時に「必ず整える作業」が毎回発生する
- 案件に応じてカスタマイズできる、軽量なベースが欲しい
- CSSだけでなく、最初からシンプルなJSも欲しい

と感じたため、別途スタートダッシュ用のセットとしてまとめることにしました。

## セット内容の紹介

このスタートセットには、以下のような要素が含まれています。

- **SassベースのCSS設計**
  - シンプルでカスタマイズ前提のベースCSS
- **レスポンシブ対応（Step Scaling）**
  - ブレイクポイントごとに段階的に拡大・縮小
- **シンプルなJavaScript機能**
  - ドロワーメニュー
  - ページトップボタン
  - スムーススクロール
- **カスタムプロパティ管理**
  - スクロールバー幅、ヘッダー高さなどをCSS変数で制御
- **機能の取捨選択が容易**
  - 案件ごとのニーズに合わせて必要な機能だけ残せる

## 使用用途・ユースケース

このセットは、以下のようなシーンで活用できます。

- 新規サイト制作時のスタートセット
- ランディングページ（LP）制作
- コーポレートサイト、ブランドサイトの立ち上げ
- シンプルなCMSテーマ開発
- 制作スピードを重視する案件対応

特に、最初の環境構築に工数をかけたくない場合に重宝します。

## 使い方

1. GitHubからクローンまたはダウンロードします。

   ```bash
   git clone https://github.com/takutas/kickoff-step-scalable-css.git
リダイレクト演算子について深堀りしてみる

## 大前提

- `>` は **標準出力 (STDOUT)** に対して作用するリダイレクト演算子
- `echo` や `print`は、すべて **STDOUT** に出力される
- `fwrite()` は出力先を指定できるので
  - `fwrite(STDOUT, ...)` とすれば標準出力
  - `fwrite(STDERR, ...)` とすれば標準エラー出力

## で、ポイントはここ。

> 標準エラー出力にした場合、`>` だけではファイルに出力されない

- これをログに残すには、`2>` または `2>&1`のような表記が必要

## 確かに実際の体験として

Webサーバーで webhook を利用して、
GitHub で push されたら本番端末で `git pull` するよう実装し、
そのとき、ログを保存する処理を入れたが、失敗時のエラーが保存されなかった。

原因は、`git pull` のエラー出力が `STDERR`に出力されていたため、`>` ではキャッチされなかったためだった。

## まとめ

- `>` は標準出力(STDOUT)にしか動作しない
- `print` `echo` = STDOUT
- `fwrite()` は出力先を指定できる
- `fwrite(STDERR, ...)`で出力されたメッセージをログに残すには `2>` や `2>&1`のような表記が必要
社内ポータル開発はじめました！

# 社内ポータル開発はじめました！
～Notionでつくる、みんなの情報ハブ～
こんにちは！
今回から、社内ポータルの開発状況や使ってみての発見を、記事で共有していこうと思います。
**初めての投稿なので、あたたかく見守ってもらえると嬉しいです。**
---
## なぜNotionを選んだのか？
社内の情報をひとつにまとめて、誰でもアクセスしやすくしたい…！
そんな想いから、いろんなツールを比較した結果、**Notion**に決定しました。
- 見た目がキレイで直感的に使える
- ドキュメントとデータベースが一体化していて情報整理しやすい
- アップデートやテンプレートが豊富
開発チームだけでなく、全社的に「使いたくなるポータル」を目指しています！
---
## Notionの契約と初期準備
### プラン選定
- **Teamプラン**を選びました。
- 理由は、複数人で編集・管理する前提だったからです。
### 支払い方法などの注意点
- 年払いにすると少し安くなります。
- 招待したメンバーは課金対象になるため、**編集権限と閲覧専用を使い分けること**がポイントです。
---
## 初期設定でやったこと（環境構築編）
- ホームページのデザイン作成
- 「会社全体」「技術共有」「勤怠関連」などのカテゴリ分け
- 権限を部署ごとに設定し、誤編集防止も意識しました
今後、テンプレートやFAQページも追加していく予定です！
---
## 使ってみて感じた「よかったこと」と「注意点」
### :+1: よかったこと
- 編集がスムーズで気軽に直せる
- コメント機能で気軽にやり取りできる
### :tongue:注意点
- 編集権限を広くしすぎると混乱の原因に…
- モバイルで見るとレイアウトが少し崩れるときがある
---
## :pray:これからとお願い:pray:
これから追加していきたいものとしては、
- チーム別のページ
- 社内手続きガイド
- ナレッジ共有ページ など！
**「こんなページが欲しい！」**
**「ここが分かりにくかった」**
など、どんな意見でも大歓迎です:ピカピカ:
---
最後まで読んでくださってありがとうございます！
初めての投稿でドキドキしていますが、これからも少しずつ発信していきたいと思います。
次回は「ページ設計とナビゲーションの工夫」について書いていく予定です:風船:
引き続き、よろしくお願いします！
macのdata.frame::fread()でShift-JISのデータを読み込む

Rでcsvデータを読み込む方法は色々あります。
- read.csv()
- readr::read_csv()
- data.table::fread()

その中で高速に読み込むことができるのはdata.table::fread()なのですが、WindwosのShift-JISデータを読み込むと文字化けが発生するので少し工夫が必要です。

## freadのhelp

>encoding: 
>default is "unknown". Other possible options are "UTF-8" and "Latin-1". Note: it is not used to re-encode the input, rather enables handling of encoded strings in their native encoding.

## 対処法

```{r}
# ライブラリの読み込み
# install.packages("tidyverse")
# install.packages("data.table")

library(tidyverse)

# 都道府県別の面積（km2）と人口（人）データ
prefecture_data <- tibble(
  都道府県 = c(
    "北海道","青森県","岩手県","宮城県","秋田県","山形県","福島県",
    "茨城県","栃木県","群馬県","埼玉県","千葉県","東京都","神奈川県",
    "新潟県","富山県","石川県","福井県","山梨県","長野県","岐阜県",
    "静岡県","愛知県","三重県","滋賀県","京都府","大阪府","兵庫県",
    "奈良県","和歌山県","鳥取県","島根県","岡山県","広島県","山口県",
    "徳島県","香川県","愛媛県","高知県","福岡県","佐賀県","長崎県",
    "熊本県","大分県","宮崎県","鹿児島県","沖縄県"
  ),
  面積_km2 = c(
    83422.27, 9645.10, 15275.05, 7282.30, 11637.52, 9323.15, 13784.39,
    6098.31, 6408.09, 6362.28, 3797.75, 5156.48, 2199.94, 2416.55,
    12583.88, 4247.54, 4186.20, 4190.57, 4465.27, 13561.56, 10621.29,
    7776.99, 5173.21, 5774.48, 4017.38, 4612.21, 1905.34, 8400.82,
    3690.94, 4724.66, 3507.03, 6707.78, 7114.44, 8478.16, 6113.00,
    4147.00, 1876.86, 5675.89, 7102.28, 4987.66, 2440.64, 4131.20,
    7409.18, 6340.70, 7734.16, 9186.20, 2282.11
  ),
  人口_人 = c(
    3820016, 754751, 783242, 1829565, 560429, 710838, 1247000,
    2245065, 1502202, 1520630, 6633932, 5690156, 14399144, 8524492,
    1525004, 761719, 896801, 572885, 611586, 1581949, 1468392,
    2828823, 6676331, 1347202, 1222791, 2075975, 7263182, 4357576,
    950365, 631619, 405528, 496994, 1510460, 2229527, 926183,
    480669, 724120, 944634, 450980, 4479021, 620873, 868817,
    1355329, 841343, 796631, 1170602, 1391013
  )
)

# データの確認
print(prefecture_data)

# CSVファイルへ書き出し, Shift-JIS(cp932)で保存
write.csv(prefecture_data, "prefecture_data.csv", fileEncoding = "cp932")

library(data.table)

# 普通にfreadで読み込むと文字化けする
fread("prefecture_data.csv")

# 文字コードを指定して読み込む
f <- "prefecture_data.csv"
fread(cmd = paste("iconv -f CP932 -t UTF-8", shQuote(f)))

```

## 解説

### iconv
- iconv は文字コードを変換するコマンド
- -f CP932 は Shift-JIS を指定
- -t UTF-8 は UTF-8 に変換

```{bash}
iconv -f CP932 -t UTF-8 ファイル名
```
と実行すると、変換後のテキストを標準出力に流します。

### shQuote(f)
- f：対象ファイルのパスを表す文字列（例："データ/売上.csv"）
- shQuote()：シェル特殊文字（スペースや日本語、記号など）を適切にクオートし、安全なコマンド引数にする

```{r}
f <- "C:/データ/売上 2025.csv"
shQuote(f)
# => "'C:/データ/売上 2025.csv'"
```

### fread(cmd = cmdstr)
- fread() の cmd= 引数にシェルコマンドを渡すと、そのコマンドの標準出力を読み込む
- cmd= 経由で入ってきたテキストをパースし、data.table オブジェクトとして返す

## まとめ

paste("iconv -f CP932 -t UTF-8", shQuote(f)) でシェルコマンド文字列を生成
fread(cmd = <その文字列>) で、生成したコマンドの標準出力を直接読み込む
【備忘録】MySQL8.0が使用するポート番号の変更

# 概要
MySQL8.0の初期設定でポート番号を明示的に使用しない場合 `3306` が使用される。
これによる不都合（Dockerコンテナが立ち上がらない等）解消のため、MySQL8.0が使用するポート番号変更する

# 手順
1. 管理者権限でコマンドプロンプトを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3751450/2db30d5d-0218-4b16-9e9b-42d416c8addf.png)

1. `ProgramData`のMySQL Server 8.0へ移動（以下はデフォルトのパス）
- `ProgramFile`ではなく、デフォルト表示だと`ProgramData`は隠しフォルダになっているので注意

    ```
    cd C:\ProgramData\MySQL\MySQL Server 8.0
    ```

1. エディタを開く（ここではメモ帳を使用していますが、VScode等でも可）

    ```
    notepad my.ini
    ```

1. 設定ファイルが開くので、 `[mysqld]` 欄内の `port=3306` の部分を変更する
（画像では3307に変更している）
![mysqld2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3751450/ac3f468b-809e-49b0-b927-2f2acc8a626b.png)

1. 保存する

1. MySQL8.0を再起動する
    1. 停止
        ```
        net stop MySQL80
        ```
    
    1. 開始
        ```
        net start MySQL80
        ```

以上でMySQL8.0の使用するポート番号が変更されます

# 変更されたかの確認
1. コマンドプロンプトで以下を実行
    ```
    netstat -ano | findstr /C:":3306 “
    ```


# 余談
私は`ProgramFile`ではなく`ProgramData`内という点で長時間詰まりました...
私の所属する大学では毎年同じ問題が発生する（講義でMySQL8.0を使用するため）上、起動する度にタスクマネージャーから `mysqld.exe`を終了する人が多かったため、一度で済むポート番号変更の方法を備忘録として残しました。
初投稿となるため、もし改善点ありましたら教えていただけると幸いです。🙇‍♂️

# 参考
- [XAMPPのMySQLポート競合を解決する方法（Windows & Mac）](https://qiita.com/TakanoriVega/items/bfd92e8fc15c7c565292) 参照：2025/04/23
- [MySQLのポートを3306から変更する方法](https://job-info.hateblo.jp/entry/2024/09/03/145204) 参照：2025/04/23
- [ハマりメモ：Windows10にインストールしたMySQL5.7のmy.iniをいくら修正しても反映されない](https://qiita.com/marsa746079/items/6a3aeb107059ad39cea5) 参照：2025/04/23
-  [【MySQL】Windows ServerにMySQL8.0を導入してmy.iniを編集するときにハマった話](https://qiita.com/reiku19753/items/51a996fd2d84e9c535fe) 参照：2025/04/23
F1スコア


---

# 🌟 F1スコアとは？

**F1スコア（F1 score）**とは、  
**「精度（Precision）」と「再現率（Recall）」のバランスを測る指標**です。  
機械学習の分類モデル（例えばスパム判定など）で、  
**モデルの性能を評価するため**によく使われます。

---

# ✅ まず、前提になる2つの指標

| 指標 | 説明 |
|:---|:---|
| **精度（Precision）** | モデルが「正しい」と判定した中で、本当に正しかった割合<br>（例：スパムと言った中で本当にスパムだった割合） |
| **再現率（Recall）** | 実際に正しかったものの中で、ちゃんと正しく判定できた割合<br>（例：すべてのスパムのうち、何件正しくスパムと見抜けたか） |

---

# ✅ F1スコアの式

\[
\text{F1スコア} = 2 \times \frac{(\text{精度} \times \text{再現率})}{(\text{精度} + \text{再現率})}
\]

つまり、  
- 精度と再現率を両方バランスよく高めると、F1スコアも高くなる
- どちらか一方だけ高くてもダメ

---

# ✅ F1スコアを使うべきとき

| 状況 | なぜ使うか |
|:---|:---|
| **クラスに偏りがあるとき** | 例：99%が「非スパム」だと、単純な正解率（Accuracy）が高くても意味がない |
| **精度と再現率の両方を重視したいとき** | 例：医療診断など、見逃し（再現率）も誤判定（精度）もどちらも重要なとき |

---

# ✅ イメージ例

たとえば、モデルがある検査で100人中…

- 20人を「陽性」と判定した
- そのうち15人は本当に陽性だった（Precision = 15/20 = 0.75）
- 実際の陽性者は30人いて、そのうち15人を当てた（Recall = 15/30 = 0.5）

この場合、

\[
F1スコア = 2 \times \frac{(0.75 \times 0.5)}{(0.75 + 0.5)} = 0.6
\]

となります。

---

# 📝 まとめ

| 項目 | 内容 |
|:---|:---|
| **F1スコアとは** | 精度と再現率のバランスを取った評価指標 |
| **高いとき** | 精度も再現率も両方高い |
| **使う場面** | クラスに偏りがあるとき、両方の指標が大事なとき |

---
[C++]ラムダ式を第3引数に持つsort()の使い方

### sort(始まり, 終わり, 比較関数);
昇順，降順に並び替えのがメインです．

参考：[AtCoderABC354-C](https://atcoder.jp/contests/abc354/tasks/abc354_c)
### 
```cpp: cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i,n) for(long long i=0; i<n; i++)
int main() {

int n;
cin >> n;
vector<int> a(n),c(n);
rep(i,n) cin >> a[i] >> c[i];

//index用の配列
//これを後に並び替える．
vector<int> is(n);
rep(i,n)is[i] =i;

sort(is.begin(),is.end(), [&](int i, int j){
  return a[i] > a[j];
});

vector<int> ans;
for(int i: is){
  if(ans.size() == 0 || c[ans.back()] > c[i]){
    ans.push_back(i);
  }
}
sort(ans.begin(), ans.end());
cout << ans.size() << endl;
for(int i : ans) cout << i+1 << ' ';
cout << endl;

  
    return 0;
}
```

### 注目してほしい所
```cpp: cpp
sort(is.begin(),is.end(), [&](int i, int j){
  return a[i] > a[j];
});
```
### 解説
通常，sortは，
```cpp: cpp
sort(is.begin(),is.end())
```
で配列を昇順で並べることができます．
しかしsort()は第三引数を取ることができ，その一つが，ラムダ式です．
ラムダ式とは，その場で定義した簡易的な関数のことです．

ここでは，a[i]とa[j]を比較して，a[i]が大きければtrueを返すという関数になっています．
この関数を第三引数に指定しているということは，配列aの大きさを昇順にsortしたときのindex（ここでは配列is）を並べている，ということになります．

[ 具体例を用いた説明 ]
sortした後のisとそれに対応するa[i]はこうなります．
| index（配列「is」） |   a[i]   |
|--------------|------|
| 2            | 50   |
| 0            | 30   |
| 3            | 20   |
| 1            | 10   |
ユーザーセグメンテーション


---

# 🌟 ユーザーセグメンテーションとは？

**ユーザーセグメンテーション（User Segmentation）**とは、  
**共通の特徴を持つユーザー同士をグループに分けること**を指します。

つまり、大勢のユーザーを一まとめにせず、  
**年齢・性別・趣味・行動パターン**などによって分類して、  
それぞれに合った対応やサービスをするための方法です。

---

# ✅ ユーザーセグメンテーションの目的

| 目的 | 説明 |
|:---|:---|
| **マーケティングの最適化** | ターゲットごとに広告やキャンペーンを変えられる |
| **サービス改善** | それぞれのニーズに合わせた機能追加や改善ができる |
| **満足度向上** | 個別に合わせた体験を提供できる |

---

# ✅ どんな基準でセグメント分けする？

| 分類基準 | 例 |
|:---|:---|
| **人口統計的情報（デモグラフィック）** | 年齢、性別、収入、職業、居住地など |
| **心理的特性（サイコグラフィック）** | 趣味、ライフスタイル、価値観など |
| **行動情報** | 購入履歴、サイトの閲覧履歴、アプリ利用状況など |
| **技術利用特性** | デバイスの種類（スマホ／PC）、OS、ブラウザなど |

---

# ✅ ユーザーセグメンテーションの活用例

| 活用シーン | 内容 |
|:---|:---|
| **ECサイト** | よく買う商品ジャンルごとにおすすめ商品を変える |
| **アプリ** | 初心者向けと上級者向けにチュートリアルを出し分ける |
| **広告** | 若者向け、ビジネスパーソン向けで広告文を変える |

---

# 📝 まとめ

| 項目 | 内容 |
|:---|:---|
| **ユーザーセグメンテーションとは** | 共通点をもつユーザーをグループに分けること |
| **目的** | ターゲットに合ったアプローチで効果を最大化する |
| **分類方法** | 年齢、趣味、行動パターン、デバイス利用などさまざま |

---
エポック


---

# 🌟 エポック（Epoch）とは？

**エポック**とは、  
**機械学習やディープラーニングで、トレーニングデータ全体を1回使ってモデルを学習させること**を指します。

つまり、  
- **学習データセットを全部1回使ったら、それで「1エポック」**
- **10エポックなら、データセットを10回使って学習した**  
という意味になります。

---

# ✅ エポックのイメージ

例えば、あなたが持っている学習データが1000件だとしましょう。

1エポック → この1000件すべてを使ってモデルを一通り学習する。  
2エポック → さらにもう1回、同じ1000件で学習する。  
3エポック → またもう1回、学習する。  
…という流れです。

**何回も学習することで、モデルの精度を高めていきます。**

---

# ✅ エポック数（Epoch数）を増やすとどうなる？

| 増やすと | 減らすと |
|:---|:---|
| モデルがより深く学習できる | 学習が浅くなる |
| ただし、**過学習（オーバーフィッティング）**のリスクも出てくる | 精度が上がりきらない可能性がある |
| 時間がかかる | 学習時間は短くて済む |

---

# ✅ 関連用語も簡単に

| 用語 | 説明 |
|:---|:---|
| **エポック** | データセット全体を1回使った学習の単位 |
| **バッチ（Batch）** | データを小分けにして、1回にまとめて学習する単位（例：100件ずつ） |
| **ステップ（Step）** | 1バッチを処理するごとの回数 |

👉 通常、**「1エポック＝複数ステップ」**になります！

---

# 📝 まとめ

| 項目 | 内容 |
|:---|:---|
| **エポックとは** | トレーニングデータ全体を1回学習させること |
| **エポック数** | 何回データセット全体で学習するか |
| **注意点** | エポック数を増やしすぎると過学習することがある |

---
EC2上でFFmpegを使用する

## はじめに

この記事は、FFmpegとFFprobeの基本的な説明と、Amazon EC2インスタンス上でのインストール方法について実際に行った手順を記事に残しておく目的で書いています。

## FFmpegとFFprobeとは

FFmpegは、オープンソースのマルチメディアフレームワークで、動画や音声の変換、処理、ストリーミングなどが可能な強力なコマンドラインツールです。様々な形式の動画・音声ファイルを処理できることから、メディア関連のアプリケーション開発では必須のツールとなっています。

FFprobeはFFmpegプロジェクトの一部であり、マルチメディアファイルの情報（コーデック、解像度、ビットレート、メタデータなど）を解析・取得するためのツールです。FFprobeを使用することで、ファイルの詳細情報を簡単に取得でき、その情報に基づいて適切な処理が可能になります。

## プロジェクトでの使用例

今回私が実装していたプロジェクト内の例として、FFmpegとFFprobeは以下のライブラリを通じて使用されていました。

### 主要な依存ライブラリ
1. **MoviePy (1.0.3)**
   - 動画処理の主要ライブラリ
   - 内部でFFmpegとFFprobeを使用
   - 提供する主な機能：
     - `VideoFileClip`: 動画ファイルの読み込み
     - `CompositeVideoClip`: 動画の合成
     - `concatenate_videoclips`: 動画の連結
     - `write_videofile`: 動画の書き出し

2. **imageio-ffmpeg (0.6.0)**
   - MoviePyの依存ライブラリ
   - FFmpegとのインターフェースを提供
   - 動画の読み書き処理を担当


これらの機能はすべてMoviePyライブラリを通じて間接的に使用されており、MoviePyが内部でFFmpegとFFprobeを呼び出して処理を行っています。

## インストール方法

### Amazon EC2インスタンスの場合

#### 静的ビルド版のインストール
John Van Sickleが提供する静的ビルド版を使用します。このビルドは依存関係なしで動作する完全な実行ファイルで、EC2などのクラウド環境で特に便利です。

```bash
# 開発ツールのインストール
sudo yum install -y git bzip2 tar gcc make openssl-devel readline-devel zlib-devel wget xz xz-devel

# FFmpegのダウンロードと解凍
mkdir ffmpeg
cd ffmpeg
wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz
tar -xf ffmpeg-release-amd64-static.tar.xz
rm ffmpeg-release-amd64-static.tar.xz

# FFmpegへのシンボリックリンクの作成
sudo ln -sf /home/ec2-user/ffmpeg/ffmpeg-7.0.2-amd64-static/ffmpeg /usr/bin/ffmpeg

# FFprobeへのシンボリックリンクの作成
sudo ln -s /home/ec2-user/ffmpeg/ffmpeg-7.0.2-amd64-static/ffprobe /usr/bin/ffprobe

# ハッシュテーブルの更新
hash -r

# インストールの確認
which ffmpeg
which ffprobe

# 必要に応じて実行権限の付与
chmod +x /home/ec2-user/ffmpeg/ffmpeg-7.0.2-amd64-static/ffmpeg
```

> **注意**: このインストール方法ではJohn Van Sickleが提供する静的ビルド版を使用しています。John Van Sickleは長年FFmpegの静的ビルドを個人的に提供しているコントリビューターで、これらのビルドは多くのサーバー環境で広く利用されています。公式のFFmpegプロジェクトではありませんが、信頼性の高いソースとして知られています。

### ローカル環境（macOS）の場合
```bash
brew install ffmpeg
```

## インストール後の確認

インストールが正しく完了したか確認するには、以下のコマンドを実行してください：

```bash
ffmpeg -version
ffprobe -version
```

#### システム情報の確認
```bash
cat /etc/os-release
```

出力例（AWS Linux 2023の場合）:
```
NAME="Amazon Linux"
VERSION="2023"
ID="amzn"
ID_LIKE="fedora"
VERSION_ID="2023"
PLATFORM_ID="platform:al2023"
PRETTY_NAME="Amazon Linux 2023"
HOME_URL="https://aws.amazon.com/linux/amazon-linux-2023/"
BUG_REPORT_URL="https://github.com/amazonlinux/amazon-linux-2023"
```

## 参考資料
- [FFmpeg公式サイト](https://ffmpeg.org/)
- [MoviePy公式ドキュメント](https://zulko.github.io/moviepy/)
- [John Van Sickle's FFmpeg Builds](https://johnvansickle.com/ffmpeg/)
Python のリストを辞書に変換

以下のリストを id をキーとする辞書に変換します。
```python:
books = [
    {'id': '1', 'title': 'Python 入門'},
    {'id': '2', 'title': 'PostgreSQL 入門'},
    {'id': '3', 'title': 'Nginx 入門'},
]
```

以下で変換を行います。

```python:
book_dict = {book['id']: book for book in books}
```

```text:実行結果
{
  '1': {'id': '1', 'title': 'Python 入門'},
  '2': {'id': '2', 'title': 'PostgreSQL 入門'},
  '3': {'id': '3', 'title': 'Nginx 入門'}
}
```
Google Drive上のExcelファイルをGoogleスプレッドシート形式で複製する

## 概要

Google Drive に保存されている Excel ファイル（.xlsx）を、同じGoogle Drive上にGoogle スプレッドシート形式で複製するための GAS（Google Apps Script）です。

Excel ファイルはそのままでは `IMPORTRANGE` 関数や他の GAS から参照できないため、本スクリプトで「別のスプレッドシートへコピー」を自動化します。

なお、ネット上のサンプルコードを試したところ拡張子が `.pdf` や `.doc` に変わってしまう現象が起きたため、動作が安定する方法を改めて検討・実装しました。

### Googleドライブ上のExcelファイル
Googleドライブ上のExcelファイルは緑色のラベルで「.XLSX」と表示されます。

![スクリーンショット 2025-01-31 9.24.13（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147689/64ca354b-f90d-a8ce-bf01-16d485bea69a.png)



## DriveAPIを追加
Apps Script画面の「サービス」からDrive API V2を追加してください。  

![スクリーンショット 2025-01-31 9.16.02（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147689/db6a4562-a9bc-a40b-533e-d217e9780094.png)


## Script
以下のコードをApps Scriptに貼り付けて保存します。

```javascript
const sourceFileId = 'XXXX'; // 元のExcelファイルのID
const existingSpreadsheetId = 'YYYY'; // 上書きしたいスプレッドシートのID

function excel_to_gsheet_converter() {
    // Excelファイルを取得
    const sourceFile = DriveApp.getFileById(sourceFileId);

    // ExcelファイルをGoogleスプレッドシートに変換して上書き
    overwriteSpreadsheet(sourceFile, existingSpreadsheetId);
}

function overwriteSpreadsheet(file, spreadsheetId) {
    try {
        // ExcelファイルをGoogleスプレッドシートに変換するためにバイナリデータを取得
        const blob = file.getBlob();

        // 既存のスプレッドシートに内容を上書き
        const updatedFile = Drive.Files.update(
            {
                title: DriveApp.getFileById(spreadsheetId).getName(), // ファイル名は変更しない
                mimeType: MimeType.GOOGLE_SHEETS // MIMEタイプはGoogleスプレッドシート
            },
            spreadsheetId,
            blob
        );
        Logger.log(`ファイルを上書きしました: ${updatedFile.id}`);
    } catch (e) {
        Logger.log(`エラーが発生しました: ${e.message}`);
    }
}
```

## トリガーを設定


1. エディタ右側の「トリガー」 から「＋」をクリック
2. 実行する関数に excelToGsheetConverter を選択
3. イベントのソース：時間主導型
4. 時間ベースのタイプ：時間ベースのタイマー
5. 時間の間隔：例）1 時間おき
6. 保存 をクリックして完了

![スクリーンショット 2025-01-31 9.20.00（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147689/8ba375ff-550a-a98e-d4d4-461c12464c28.png)

以上です。
このスクリプトを有効にすると、指定した間隔でExcelファイルが自動的にGoogleスプレッドシートへ複製され、他のシートやGASから参照できるようになります。
AIを活用した無料の一時的なメールサービスをシェアする

# ChatTempMail
👉 [https://chat-tempmail.com](https://chat-tempmail.com)

AI搭載の使い捨てメールサービスで、**完全無料**の安全・高速・スパムフリーなメール体験を提供します。多言語対応のリアルタイム翻訳やコンテンツ要約、AI質問応答機能で、プライバシーを守りながら効率的なメール管理が可能です。

![Screenshot 2025-04-29 at 11.30.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3908420/70e84ab7-36f7-4eaf-89d6-2ead3f41bc52.png)

## **主な特徴**
- **無料使い捨てメール**：短期利用向けの仮メールアドレスを**無料で即時発行**
- **リアルタイム翻訳機能**：言語の壁を越えたコミュニケーションを**無料でサポート**
- **AI自動要約**：長文メールを瞬時に理解できる**無料要約サービス**
- **インテリジェントQ&A**：メール内容への質問に**無料で即回答**
- **強固なプライバシー保護**：個人情報を守る**無料セキュリティ対策**

![Screenshot 2025-04-29 at 11.31.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3908420/2922fe0d-a17f-4664-b7ae-9cd239e63c28.png)


## **無料で使える主な場面**
- **オンライン登録**：本メールを公開せずに**無料でサービス登録**
- **スパム対策**：**無料**使い捨てアドレスで迷惑メールを完全遮断
- **国際対応**：**無料**翻訳機能で海外取引をスムーズに
- **業務効率化**：**無料**AI機能でメール処理時間を90%短縮

**完全無料**で利用可能なChatTempMailは、プライバシー保護と生産性向上を両立する次世代メールソリューションです。広告なし・登録不要で今すぐご利用いただけます。

![Screenshot 2025-04-29 at 11.31.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3908420/86fa2ed1-67b0-44d5-8128-89e49efbb88a.png)


👉 [https://chat-tempmail.com](https://chat-tempmail.com)
迷路作ってみた　#100日チャレンジ　に感化されて

#### 今日は迷路作ってみた！
Cell_SIZEとCOLS,ROWSの数字を変えるとより複雑化するけど，難易度設定ってどうやるんだろう:rolling_eyes:
壁を先に作ってランダムに掘り進めるという逆転の発想，考えた人すごいな！

##### #100日チャレンジ

![タイトルなし.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668168/83212a8f-9a77-4f73-998f-926f0b25d858.gif)

```python
import pygame
import sys
import random

# Pygame初期化
pygame.init()

# サイズ設定
CELL_SIZE = 40
COLS, ROWS = 15, 11
WIDTH, HEIGHT = COLS * CELL_SIZE, ROWS * CELL_SIZE
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("自動生成迷路")

# 色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)

# 迷路マップ初期化（全部壁）
maze = [[1 for _ in range(COLS)] for _ in range(ROWS)]

# プレイヤー初期位置
player_x, player_y = 1, 1

# ゴール位置
goal_x, goal_y = COLS - 2, ROWS - 2

# 迷路生成関数（深さ優先探索）
def generate_maze(x, y):
    maze[y][x] = 0  # 通路にする
    directions = [(0, -2), (2, 0), (0, 2), (-2, 0)]
    random.shuffle(directions)

    for dx, dy in directions:
        nx, ny = x + dx, y + dy
        if 1 <= nx < COLS-1 and 1 <= ny < ROWS-1 and maze[ny][nx] == 1:
            maze[y + dy//2][x + dx//2] = 0  # 間の壁も壊す
            generate_maze(nx, ny)

# 迷路を生成
generate_maze(1, 1)

# メインループ
clock = pygame.time.Clock()
running = True
while running:
    clock.tick(60)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # キー入力
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        if player_x > 0 and maze[player_y][player_x - 1] == 0:
            player_x -= 1
    if keys[pygame.K_RIGHT]:
        if player_x < COLS-1 and maze[player_y][player_x + 1] == 0:
            player_x += 1
    if keys[pygame.K_UP]:
        if player_y > 0 and maze[player_y - 1][player_x] == 0:
            player_y -= 1
    if keys[pygame.K_DOWN]:
        if player_y < ROWS-1 and maze[player_y + 1][player_x] == 0:
            player_y += 1

    # ゴール到達判定
    if player_x == goal_x and player_y == goal_y:
    
        # ゴールメッセージを表示
        font = pygame.font.SysFont(None, 80)  # フォントサイズ80
        text = font.render("Goal", True, (255, 0, 0))  # 赤色の文字
        text_rect = text.get_rect(center=(WIDTH // 2, HEIGHT // 2))  # 中央に配置
    
        screen.fill(WHITE)  # 一度背景を白く塗る
        screen.blit(text, text_rect)  # メッセージを画面に貼る
        pygame.display.flip()  # 画面更新
    
        pygame.time.delay(2000)  # 2秒待つ
    
        # 新しい迷路にリセット
        maze = [[1 for _ in range(COLS)] for _ in range(ROWS)]  # 全壁にリセット
        generate_maze(1, 1)  # 新しい迷路生成
        player_x, player_y = 1, 1
        goal_x, goal_y = COLS - 2, ROWS - 2
        
        continue
    
    # 描画
    screen.fill(WHITE)

    for y in range(ROWS):
        for x in range(COLS):
            if maze[y][x] == 1:
                pygame.draw.rect(screen, BLACK, (x*CELL_SIZE, y*CELL_SIZE, CELL_SIZE, CELL_SIZE))

    # プレイヤー
    pygame.draw.rect(screen, BLUE, (player_x*CELL_SIZE, player_y*CELL_SIZE, CELL_SIZE, CELL_SIZE))

    # ゴール
    pygame.draw.rect(screen, GREEN, (goal_x*CELL_SIZE, goal_y*CELL_SIZE, CELL_SIZE, CELL_SIZE))

    pygame.display.flip()
```
Choosing antidetect browser

### Quick guide to choosing an [antidetect browser](https://hidemyacc.com/):

- Fingerprint Management: Choose one that lets you deeply customize fingerprints (IP, OS, device, fonts, etc.).

- Profile Isolation: Make sure each browser profile is truly independent and secure.

- Proxy Support: It should easily integrate with proxies for each account.

- Ease of Use: Look for a user-friendly dashboard, especially if managing many profiles.

- Automation Options: Some antidetect browsers support automation tools for scaling tasks.

- Pricing: Find a plan that fits your team size and business model.

- Reputation: Check user reviews and real-world feedback.

Some antidetect browsers you can refer to: [Multilogin](https://hidemyacc.com/multilogin-antidetect-browser), Hidemyacc, Gologin, [Dolphin Anty](https://hidemyacc.com/dolphin-anty-antidetect-browser) and Adspower
【Go】import cycle not allowedが発生する原因と解決策

## はじめに

`import cycle not allowed`というエラーに遭遇したため、備忘録としてまとめます。

この記事におけるGoのバージョンは以下のとおりです。

```bash
% go version
go version go1.24.2 darwin/arm64
```

## 問題
パッケージのimport文で`import cycle not allowed`というコンパイルエラーが発生してしまう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325281/8d1a7a12-99e3-4417-978f-e23d1d593c39.png)

## 解決策

循環参照が発生してしまっているため、以下のような対応が必要。

- 原因となっている型や機能を他のパッケージへ移動させる
- 原因となっている型や機能を新しいパッケージへ切り出す
- インターフェースを利用して依存関係の向きを変える
- パッケージ構成の全面的な見直し

## エラーの詳細

`import cycle not allowed`はパッケージ間で循環参照が発生していることを意味します。

循環参照とは、複数のパッケージがお互いをインポートしている状態です。

### 直接的な循環参照

たとえば次のコードでは、パッケージ`a`と`b`がお互いをインポートしているため、`import cycle not allowed`が発生します。

```go:a/a.go
package a

import (
	"fmt"
	"go-sample/b"
)

func PrintA() {
	fmt.Println("Function PrintA called")
	b.PrintB()
}
```

```go:b/b.go
package b

import (
	"fmt"
	"go-sample/a"
)

func PrintB() {
	fmt.Println("Function PrintB called")
	a.PrintA()
}
```

上記2ファイルで`go vet ./...`を実行するとエラーが発生します。

```bash
% go vet ./...
package go-sample/a
        imports go-sample/b from a.go
        imports go-sample/a from b.go: import cycle not allowed
```

### 間接的な循環参照

上記は直接的な循環参照ですが、パッケージ`a`・`b`・`c`がa→b→c→aのようにインポートしている場合も循環参照となります。

```go:a/a.go
package a

import (
	"fmt"
	"go-sample/b"
)

func PrintA() {
	fmt.Println("Function PrintA called")
	b.PrintB()
}
```

```go:b/b.go
package b

import (
	"fmt"
	"go-sample/c"
)

func PrintB() {
	fmt.Println("Function PrintB called")
	c.PrintC()
}
```

```go:c/c.go
package c

import (
	"fmt"
	"go-sample/a"
)

func PrintC() {
	fmt.Println("Function PrintC called")
	a.PrintA()
}
```

上記3ファイルで`go vet ./...`を実行するとエラーが発生します。

```bash
% go vet ./...
package go-sample
        imports go-sample/a from main.go
        imports go-sample/b from a.go
        imports go-sample/c from b.go
        imports go-sample/a from c.go: import cycle not allowed
```

### なぜ循環参照がダメなのか？

循環参照があると、Goのコンパイラはパッケージをビルドする際に依存関係を解決できません。

どのパッケージからビルドを開始すればよいか分からないからです。

また循環参照が発生するということは、パッケージ間の依存関係が複雑になりすぎている兆候であり、ソフトウェア設計の観点でも好ましくないです。

そのためGoでは意図的に禁止されています。

## おわりに

この記事では`import cycle not allowed`が発生する原因と解決策についてまとめました。

参考になれば幸いです。

このエラーに頻繁に遭遇するようであれば、パッケージ構成に改善の余地があるかもしれません。

アーキテクチャを見直す機会とするのも有効だと思いました。
Review antidetect browser Hidemyacc

**Hidemyacc** is one of the antidetect browsers that helps users manage multiple accounts at the same time without worrying about being detected or locked out.

Hidemyacc's strengths lie in:
- Creating separate browser profiles with custom fingerprints
- Flexible proxy integration
- Sharing and transferring profiles between devices
- Supporting automation

With its flexible pricing and friendly interface, Hidemyacc is an ideal choice for online merchants, affiliate marketers, and anyone who needs to operate multiple online identities securely and efficiently.

### Some reviews about antidetect browser Hidemyacc:
- [Big News Network Review](https://www.bignewsnetwork.com/news/278177525/review-antidetect-browser-hidemyacc-features-pricing-and-privacy-checks)
- [London Daily News Review](https://www.londondaily.news/review-hidemyacc-best-antidetect-browser-multiple-accounts-across-the-platforms/)
- [What is an Antidetect Browser - Techbullion](https://techbullion.com/what-is-an-antidetect-browser/)
【ネットワーク】ハブとスイッチ


# はじめに

こんにちは。アメリカに住みながら、独学でエンジニアを目指している Taira です。
現在インターネットクイズを定期的に自分に課しているのですが、その中で出てきた「ハブ」と「スイッチ」について、簡潔にまとめていきたいと思います。

---

## ハブとは？

ハブ（リピータハブ）は、複数の機器を結ぶための製品です。
データを受け取ると，言われた先などは分からず、繰り返し「すべてのポート」に送信します。

### 特徴

- 全ての接続機器にデータを送り出す
- 同時に複数の通信が発生すると、データが衝突（コリジョン）する
- コリジョン発生により、通信が遅くなる

このため、ハブは少し大きめのネットワークには向いていません。

---

## スイッチとは？

スイッチ（L2 スイッチ）は、ハブの進化バージョンです。
接続された機器の MAC アドレスを記憶し、相手先に合わせて適切なポートへの送信を行います。

### 特徴

- MAC アドレスをベースに送信先を分別
- 同時に複数の通信が可能
- コリジョンが起きにくいので、通信が経路效率よく高速

現代の家庭やオフィスで LAN を組む場合、使われているのはほとんどこのスイッチです。

---

## 大きな違い

| 項目       | ハブ       | スイッチ               |
| :--------- | :--------- | :--------------------- |
| 送信方法   | 全てに送信 | 対象のポートだけに送信 |
| コリジョン | 起こる     | 起こりにくい           |
| 通信速度   | 遅い       | 高速                   |

---

## おわりに

ハブとスイッチは一見似ていますが、力を発揮す場所や使用方法に大きな違いがあります。

現代の社会では、無線 Wi-Fi が発達しているので、やや隐れがちですが、背後の有線 LAN では、スイッチが必要不可欠の技術となっています。
TypeScript:8.状態を保存(localStorage)

## やりたいこと
ページをリロードしても選択中の食べ物の状態やスコアがそのまま保持されている。

## こういう時はlocalStrageを使う
保存先　　　：　　ブラウザ
保存期間　　：　　永続（リロードや再起動しても残る）
扱える型　　：　　文字列（JSON.stringify()で保存、JSON.parse()で復元）
ブラウザ上に文字列を保存して、リロードする際に保存した文字列を利用して元の状態に復元するという事を実施する！！


## 実装ステップ

### ①保存する：選択されているfoodのインデックスを保存する
```typescript:ts
private saveState(): void {
    const selectedIndexes = this.foodItems
        .map((item, index) => selected ? index : null)
        .filter((i): i is number => i !==null);

    localStorage.setItem('selectedFoods',JSON.stringify(selectedIndees));
}
```
1.this.foodItemsの中で選択されているものはインデックスを返す。
　違う場合はNULLを返す
2.数字だけを返す
　　⇒　選択されているインデックス番号だけの配列を作る


  ### ②復元する：初期化時にlocalStorageを読み取り復元

```typescript:ts
private loadState(): void {
    const stored = localStorage.getItem('selectedFoods');
    if(!stored)return;

    const indexes = JSON.parse(stored) as number[];

    indexes.forEach(indes => {
        const item = this.foodItem[index];
        item.selected = true;
        item.element.classList.add('food--active');
    });

    this.TdScore = this.foodItems
        .filter(item => item.selected)
        .reduce((sum, item) => sum + item.score, 0);

    this.score.update(this.TdScore);
    this.updateSelectedList();
    this.updateScoreMessage?.();
}
```
1.localStorageに保存した「selectedFoods」の文字列を「stored」に代入
2.storedを配列に戻し「indexes」に代入
3.インデックスを同じfoodItemをセレクト状態にする
4.スコアを集計
5.各メソッドを実行して元の状態に復元する


  ### ③各処理の最後に保存を追加
```typescript:ts
this.saveState(); //reset(),handleClick().removeButtonなどの最後に追加
```
localStorageを常に最新状態にするため各メソッドにsaveStateを配置する。

  ### ④初期化時にloadStateを呼び出す
```typescript:ts
constructor(){
    this.setupFoods();
    this.loadState();
}
```
setupFood()を読んで、fooditemsのリストが完成してから復元する。
「foodItemを作る⇒保存されてた選択を復元する」この順番が大切。

## 大まかな流れ
1.localStorageにインデックスを保存
2.初期化時にlocalStorageからインデックスを読み取る
3.読み取ったインデックスを利用してページを復元
.NETのSpeech.Recognitionをバッチファイルから使う

音声認識のエンジンそのものを自作するのはしんどすぎますが、一方で音声認識のソリューションは「ごつすぎる」という特徴もあります。

WordやGoogleDocumentにも音声認識機能がありますが、音声認識単体の機能を取り出すこともできません。そこで.NETフレームワークのSpeech.Recognition APIだけを使ってみましょう。

Speech.Recognition APIもPowerShellから直接呼び出すことができます。ただよくある音声認識ツールと同様に一回でそのターンは終わってしまうので、バッチファイルで無限ループにしましょう。

以下完成形です。


```ssr.bat
@echo off
:LOOP
powershell -Command "Add-Type -AssemblyName System.Speech; $r = New-Object System.Speech.Recognition.SpeechRecognitionEngine; $r.LoadGrammar((New-Object System.Speech.Recognition.DictationGrammar)); $r.SetInputToDefaultAudioDevice(); $r.Recognize().Text"
goto LOOP
```

バッチファイルを起動するとマイクからの入力待ちになります。話しかけて終わるとテキストが吐き出されて次の入力待ちになります。

以下「音声認識の精度はどうでしょう？」と繰り返し聞いてるテスト結果です。

```
をする認識や制度を低
音声の認識の世論の批判
音声認識の政府を急ぐ
音声認識も歳暮と評
```

全然ダメですね。今どきのクラウドベースで機械学習で何だったらLLMで「辻褄のあった自然な文章」まで再構築する音声認識に比べるとかなり精度が低いです。

Chromeにも音声認識APIはありますが、あれはChromeからGoogleのクラウドベースのAPIを呼び出してるだけなのでライブラリとしての機能ではありません。オフラインで動作する音声認識ライブラリではvoskなどがありましてそれを使えばもっと精度は高くなります。
Qiiterこそ最高到達点である


## アウトプットしないと知識は腐る

エンジニアなら普段自己学習に励んでいる人も多いでしょう。
さて。今日勉強したことはなにか説明してみてください。
ここに来るまでに見たQiitaの記事の内容を説明してみてください。
ほとんどの人が説明できないはずです。
それはアウトプットしていないからです。
インプットは知的好奇心を満たせる楽しい時間です。
一方アウトプットは学習したことを頭から出力する退屈で負荷のかかる作業です。
しかしアウトプットしないとインプットした知識はすぐに腐ってしまいます。

## どこにアウトプットするか？

さてアウトプットの重要性を説明しました。
ではどうやってアウトプットしますか？
実務で活かしますか？手元のコードで動かしてみますか？
素敵な方法ですが、インプットした知識の80%以上は実務でもすぐには活かせないし、
手元のコードで動かせないものもあるはずです。

## Qiiterになる前

私はQiitaに記事を書く前はNotionに自分用に文章に残してアウトプットしていました。
これもアウトプットとして１つの方法です。
ではなぜQiitaに書くようにしたのか？
それは外部のフィードバックがあるからです。
Qiitaに記事を書くと「ここは良い表現があるよ」だったり、
「いいね」されることによるフィードバックがあります。
Notionは外部に公開しない限りフィードバックがありません。
フィードバックは記事を書くモチベーションになり、アウトプットは加速して好循環を得ることができます。

## 君もQiiterにならないか？

そこで解決策としてQiitaに記事を書くことがあります。
Qiiterです。文章に書くことでインプットした知識は血肉になります。
またQiitaに記事を書くということは人に教えられるレベルまで理解している必要があります。
有名なLearningピラミッドというものがあります。
人に教えられるレベルは学習の最高到達点です。
いきなりギア5を発動できるということです。
最強の技術力を身につけることができます。

https://career-ed-lab.mynavi.jp/career-column/707/

## まとめ

100冊の技術書を読むよりも1冊の技術書をQiitaにアウトプットしましょう。
手を動かさないと人は覚えないのです。
Power Appsでの罠が多いカメラコントロールを使ってGPT-4.1の画像認識を試す


罠が多いカメラです。

## カメラ関連ややり方何個かあります

https://qiita.com/Yellow11/items/8206debc747cc3a4f16d

その中でカメラを使います。

## 最終的にこれでいけた

**ボタンのonSelectではなくCameraのonSelectなのが超重要。**

```js
Set(varPhoto, Camera1.Photo);
Set(varDataUri, JSON(varPhoto, JSONFormat.IncludeBinaryData));
Set(varPureBase64, Substitute(varDataUri, """", ""));
UpdateContext({ newLabelText: 'のびすけ検証3-GPT画像読み取り'.Run(varPureBase64).response });
```

> ![CleanShot 2025-04-29 at 11.36.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/97955324-8905-495d-9d97-96779c18f3ac.png)
> まさかすぎる

画像上に"カメラ撮影"ってボタンを作ってそっちで試してましたが、これだとうまくいきません。


## ボタンのonSelectが使えない罠

この記事が神だったのですが、まずボタンを押してカメラの制御ができず、カメラのプレビュー画面を押してコントロールする感じみたいです。普通に考えるとそんな使い方しないのにな... そっちのほうが直感的なのか...? 

https://qiita.com/yamad365/items/c44c2c3bd5bd31f06892

## Base64文字列にする処理

```js
Set(varPhoto, Camera1.Photo);
Set(varDataUri, JSON(varPhoto, JSONFormat.IncludeBinaryData));
Set(varPureBase64, Substitute(varDataUri, """", ""));
UpdateContext({ newLabelText: 'のびすけ検証3-GPT画像読み取り'.Run(varPureBase64).response });
```

これを解説すると

```js
Set(varPhoto, Camera1.Photo);
Set(varDataUri, JSON(varPhoto, JSONFormat.IncludeBinaryData));
```

ここでvarDataUriにBase64変換した`data:image/png;base64,iVBORw0KGgoAAAANS…==`といった文字列に。ただダブルクォート("")で囲まれた状態になってるので、次のSubstitureで""を消しています。

```js
Set(varPureBase64, Substitute(varDataUri, """", ""));```
```

## 関係ないけど

Power Appsの式って言語なんなんだろう。JS指定にしたらQiita上だとアラートでなかったのでとりあえずJS指定にしています。

> ![CleanShot 2025-04-29 at 11.31.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/46dd817a-11c8-4a1d-9400-c9ea723987aa.png)
古いSSHサーバーに接続できないときの対処法

# 概要

古いSSHサーバー（MySQLの踏み台サーバーなど）に接続しようとすると、次のようなエラーが出ることがあります。

```bash
Unable to negotiate with 192.168.XXX.XXX port 22: no matching host key type found.
Their offer: ssh-rsa,ssh-dss
```

> （日本語訳）
192.168.XXX.XXX（ポート22）との交渉に失敗しました：一致するホスト鍵の種類が見つかりません。
相手側が提示した鍵の種類：ssh-rsa、ssh-dss
> 

このエラーは、接続先のSSHサーバーが**古い鍵アルゴリズム（`ssh-rsa`や`ssh-dss`）のみをサポートしており、クライアント側がそれらを許可していない**ために発生します。

`ssh-rsa` および `ssh-dss` はともにセキュリティ上の理由から、OpenSSH 8.8以降では**デフォルトで無効化**されています。

:::note info
補足（技術的背景）

**■ssh-rsa**
署名に使われるSHA-1が脆弱なため、**衝突攻撃のリスクが現実的**になり、OpenSSH 8.8以降でデフォルト無効化。

**■ssh-dss（DSA）**
安全なハッシュ関数が使えず、鍵長も短いため、**OpenSSHでは完全に非推奨**。`ssh-rsa`より危険。
:::

# 対処法

以下のように `~/.ssh/config` に接続設定を追加することで、一時的に `ssh-rsa` を許可して接続できるようになります。

```bash
Host 192.168.XXX.XXX
	HostKeyAlgorithms +ssh-rsa        # サーバーのホスト鍵としてssh-rsaを許可
	PubkeyAcceptedAlgorithms +ssh-rsa # クライアント認証にもssh-rsaを許可
```

各設定の意味：

- `Host`：この設定を適用する対象ホスト（IPアドレス）を指定。
- `HostKeyAlgorithms`：サーバーのホスト鍵に `ssh-rsa` を追加で許可。
- `PubkeyAcceptedAlgorithms`：クライアントの公開鍵認証にも `ssh-rsa` を追加で許可。
 
公開鍵の種類や認証方式に応じて記述してください。


:::note alert
**セキュリティ注意**

この設定は「古いサーバーへの接続を許可するための一時的対応」です。

可能であれば、**サーバー側のSSHバージョンアップ**や、**より安全な鍵方式（例：ed25519）への移行**を検討してください。
:::
📝 【Rails】初学者の学習記録-設計において押さえておくべきポイント

# 

こんにちは！今日はRailsアプリケーションの開発を始める前に知っておくべき設計のポイントについて学習しました。以下に、学んだ内容を整理して記録します。

---

## 🔁 Railsの7つの基本アクション

Railsでは、RESTfulな設計に基づいて、コントローラーに以下の7つの基本アクションを定義することが一般的です。これらのアクションは、CRUD（Create, Read, Update, Delete）操作に対応しています。

| アクション名 | 機能             | HTTPメソッド | 説明                               |
|--------------|------------------|--------------|------------------------------------|
| `index`      | 一覧表示         | GET          | 全てのレコードを表示する           |
| `show`       | 詳細表示         | GET          | 特定のレコードの詳細を表示する     |
| `new`        | 新規作成フォーム | GET          | 新しいレコードを作成するフォームを表示する |
| `create`     | 新規作成         | POST         | フォームから送信されたデータを保存する |
| `edit`       | 編集フォーム     | GET          | 既存のレコードを編集するフォームを表示する |
| `update`     | 更新             | PATCH/PUT    | 編集されたデータを保存する         |
| `destroy`    | 削除             | DELETE       | 特定のレコードを削除する           |

これらのアクションを理解し、適切に使用することで、コードの可読性と保守性が向上します。

---

## 🧾 Railsの命名規則

Railsでは、「**規約より設定（Convention over Configuration）**」の原則に従い、特定の命名規則を採用しています。これにより、開発効率が向上し、コードの一貫性が保たれます。

### モデルの命名規則

- **単数形**を使用します。
  - 例：`Tweet`モデル → データベーステーブルは`tweets`となります。

### コントローラーの命名規則

- **複数形**を使用し、`Controller`を接尾辞として付けます。
  - 例：`TweetsController` → `Tweet`モデルを扱うコントローラー

この命名規則に従うことで、Railsの自動ルーティングやビューの関連付けがスムーズに行われます。

---

## 🧠 学んだことのまとめ

- Railsの7つの基本アクション（`index`、`show`、`new`、`create`、`edit`、`update`、`destroy`）は、CRUD操作に対応しています。
- モデルは単数形、コントローラーは複数形で命名することで、Railsの規約に従った開発が可能になります。
- 命名規則を守ることで、コードの可読性が向上し、他の開発者との協業が円滑になります。

これらの基本をしっかりと理解し、今後の開発に活かしていきたいと思います。

---

以上、今回の学習記録でした！引き続き、Railsの学習を進めていきます。🚀
機械学習プロジェクトの流れ

## この記事は

機械学習プロジェクトの大きな流れとそれぞれのポイントで何を考えるべきなのかをまとめたものです。

## 機械学習プロジェクトの流れ
まず大きな流れを説明した後に各項目について深堀りします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3937496/3587072b-b63f-4dbc-8171-524a3b2b619b.png)


### 1.問題提起

ビジネス領域で機械学習によって解くことができる課題は何なのか考える。
一番難易度が高く、ただ精度の高いモデルを作ればよいわけではない。
現場のニーズに合ったものを開発しなければ使われないモデルが作られるだけ。

### 2.モデルの開発

汎用性能が高いモデルを開発する。
未学習のデータに対して精度が担保される状態を作る。

### 3.モデルのデプロイ

Webサーバー、アプリ、Webページにモデルを導入して使用者が使える状態にする。

### 4.監視

本番環境での性能を監視して、次の世代のモデル開発のヒントを得る
データドリフト、コンセプトドリフトに注意する

## 1.問題提起

機械学習によって解くべき課題は何なのか？そもそも機械学習を使う必要があるのか？
簡単に済ませる方法はないのか？などビジネス領域と話し合う。
話すポイントの具体例です。

- 予測したいものは何か？
- データとしては何が使えそうか？
- データは作成する必要があるのか？
- 既存の解決策で良いのではないか？
- 特定の制約はあるか？
- 目指すべき指標は？

## 2.モデル開発

データの準備、前処理、評価指標の選択、バリデーション、ベースラインモデルの選定、過学習できるモデルの開発、正則化＆パラメーターチューニング、汎用モデルの開発の順番で進めていく。
多くの場合、既に開発された事例があるのでそれを参考にしよう。

## 3.モデルのデプロイ

モデルを開発してノートブックに保存したら終了ではありません。
本番環境にデプロイしなくてはなりません。
このときデプロイ先の環境はPythonで書かれていないかもしれません。
異なるプログラミング言語間で連携させると処理速度が低下したり、リソースの過剰消費が懸念されます。デプロイについては下記の記事を御覧ください。

https://qiita.com/ktdatascience/items/230a3e26c9d1c3db480c

## 4. モデルの監視

モデルはデプロイしたら終了ではありません。
継続的にアップデートする必要があります。
また新しいモデルをデプロイしたらABテストを実施して、
古いモデルとどちらが良いのかの検証をしましょう。
各種クラウドサービスにはABテストをするためのデプロイ方法が存在します。

またデータ自体の性質や定義が変わってしまうかもしれません。
データドリフトとコンセプトドリフトです。

### データドリフト

データドリフトとは、本番環境に投入される入力データ（特徴量）の分布が、
モデルを学習したときのデータ分布から時間とともに変化してしまう現象を指します。
モデルは学習時の分布を前提に最適化されているため、
入力の偏りや外れ値の増加などが起こると、予測性能が低下するリスクがあります。

**主な原因例**

- 新しい顧客層／利用パターンの登場
- センサーやログ収集システムの変更
- 季節要因やキャンペーンによる一時的ピーク

**検出方法**

- **統計的検定**：Kolmogorov–Smirnov検定、Jensen–Shannon Divergenceなどで特徴量分布の変化をモニタリング
- **Population Stability Index（PSI）**：ビン分けしたヒストグラム間の変化度合いを数値化
- **可視化ツール**：時系列プロットやヒストグラムを定期的に比較

**対応策**

1. **再学習（リトレーニング）**：ドリフト検出後に最新データでモデルを再学習
2. **オンライン学習**：逐次データ取り込み型のアルゴリズム（e.g. SGD, Hoeffding Tree）を利用
3. **特徴量選定の見直し**：ドリフトしやすい特徴量を除外または変換
4. **アラートとダッシュボード**：閾値を超えたら担当チームへ通知

---

### コンセプトドリフト

コンセプトドリフトとは、特徴量 XX と目的変数 YY の関係性（条件付き分布 P(Y∣X)P(Y|X)）自体が変化してしまう現象を指します。たとえば、ある閾値以下の購買金額を「低」としたモデルが作ったが、マーケット環境の変更で顧客の購買行動そのものが変わる場合などです。

**主な原因例**

- ビジネスルールや法規制の変更
- 競合サービスの新規参入による顧客行動変化
- 時間経過によるユーザー心理の変化

**検出方法**

- **モデル性能低下**：AUC、F1、RMSEなど評価指標の急激な悪化を監視
- **オンラインドリフト検出器**：ADWIN、DDM（Drift Detection Method）などで逐次検定
- **予測値 vs 実測値の乖離分析**：Residual 分布の変化や累積誤差プロット

**対応策**

1. **定期再学習**：性能が落ちたタイミングでラベル付きデータを集め再学習
2. **モデルアンサンブル**：古いモデルと新しいモデルを組み合わせ、重み付けでスムーズに切り替え
3. **オンライン学習アルゴリズム**：変化の検出と同時にモデル更新が可能な手法を利用
4. **A/Bテスト／カナリアリリース**：新旧モデルを並行運用し、徐々に移行

---

## まとめ

この記事では機械学習プロセスの流れを解説しました。
４つのフェーズがあり、それぞれ下記のような点に注目する必要がありました。

- **問題提起**
    - ビジネス上の真のニーズを特定
    - 予測対象／KPIの明確化
    - 利用可能データの確認・品質検討
    - 既存ソリューションとの比較、ROI試算
- **モデルの開発**
    - データ収集・前処理 → EDA
    - ベースラインモデル構築と評価指標選定（RMSE、AUCなど）
    - 特徴量エンジニアリング・ハイパーパラメータ調整
    - 過学習対策（正則化・early stopping）
    - モデル解釈性（SHAPなど）と再現性の担保
- **モデルのデプロイ**
    - 推論方式の選定：バッチ／オンライン
    - コンテナ化（Docker＋Kubernetesなど）やサーバーレス化
    - CI/CDパイプライン構築（自動テスト・自動デプロイ）
    - API設計（エンドポイント・認証）・スケーリング設定
    - ロギング／モニタリング基盤の整備
- **モデルの監視・保守**
    - 本番での性能監視（精度・レイテンシ・エラー率）
    - **データドリフト**／**コンセプトドリフト**の検出
    - アラート設定と定期的なレトレーニング
    - A/Bテスト／カナリアリリースによる新旧モデル比較
    - モデルバージョン管理と変更履歴のドキュメント化
モデレーションAPI

**モデレーションAPI**は、主に生成AI（Generative AI）やコンテンツ管理の分野で利用されるAPIで、**生成されたコンテンツが不適切でないか**を自動的にチェックし、モデレーションを行うためのツールです。このAPIを使うことで、企業や開発者は、コンテンツが公開される前に**不適切な内容**（暴力的、差別的、攻撃的、成人向けコンテンツなど）を検出してフィルタリングすることができます。

### 🌟 **モデレーションAPIの特徴**

1. **不適切なコンテンツの自動検出**  
   モデレーションAPIは、テキストや画像、音声などの生成コンテンツに対して、不適切なコンテンツ（暴力的、差別的、侮辱的な表現や成人向け内容など）を自動的に検出します。これにより、人力でのコンテンツチェックが不要になります。

2. **リアルタイム検査**  
   コンテンツが生成されるたびに、リアルタイムでモデレーションを行い、不適切なコンテンツが即座に検出されます。これにより、問題が発生する前に事前に対処が可能です。

3. **複数のメディア形式に対応**  
   モデレーションAPIは、テキストだけでなく、**画像や音声**などさまざまなメディア形式にも対応しており、あらゆるコンテンツに対して検査を行います。

4. **カスタマイズ可能な設定**  
   ユーザーや企業のニーズに合わせて、検出するコンテンツの種類やフィルタリングの強度をカスタマイズできる場合があります。例えば、特定のキーワードやフレーズを検出対象にしたり、成人向けコンテンツの検出を強化することができます。

5. **レポートとフィードバック**  
   モデレーションAPIを使用すると、検出された不適切なコンテンツに関する詳細なレポートを受け取ることができます。また、その結果をもとに、システムがどのようにコンテンツをモデレートしたかを確認することができます。

---

### ✅ **モデレーションAPIの利用シーン**
- **SNSや掲示板のコンテンツ管理**  
   SNSや掲示板などで、ユーザーが生成するコンテンツが不適切でないかを監視するために使用されます。これにより、ユーザーが不快なコンテンツを投稿することを防ぎ、コミュニティの安全性を保ちます。

- **自動生成コンテンツのフィルタリング**  
   生成AIによって作成されたテキスト、画像、動画、音声などが不適切でないかを事前に検査し、公開する前に不適切な内容を排除するために使用されます。

- **カスタマーサポートやレビュー管理**  
   顧客の投稿やレビューが不適切でないかをモニタリングし、問題のある内容を速やかに削除するために使用されます。

---

### ✅ **特徴まとめ**

| 項目 | 内容 |
|:---|:---|
| **目的** | 生成されたコンテンツが不適切でないかをチェック・フィルタリング |
| **対応メディア** | テキスト、画像、音声など多様なメディア形式に対応 |
| **リアルタイム検査** | コンテンツが生成されるたびに即座にチェック |
| **カスタマイズ** | 検出対象となるコンテンツやフィルタリング強度を調整可能 |
| **レポート** | 検出結果をレポートとして提供 |

---

### 📝 **まとめ**
モデレーションAPIは、生成コンテンツに対して自動的に不適切な内容を検出し、**安全で倫理的なコンテンツ管理**をサポートするツールです。これを使うことで、企業やサービス提供者は、コンテンツが公開される前に問題を発見し、リスクを回避することができます。

---
Windows上でsayコマンド

Macにはsayコマンドがあります。コマンドライン上でttsを実現してくれるコマンドです。そんなに用途はありませんが、せっかくなので「意地で」Windowsでもやってみましょう。制約としては「追加インストールなし」「コンパイルなし」という範囲でやります。この制約は単なる意地でありお遊びですが「依存モジュールが最小限である」というのはエンジニアリングの美学でもあります。

### .NETのAPIをPowerShellから呼び出す

まず回答から。以下のワンライナーをPowerShell上で呼び出します。

```powershell
Add-Type -AssemblyName System.Speech; (New-Object System.Speech.Synthesis.SpeechSynthesizer).Speak("こんにちは")
```

C#のコードを書かずとも.NETフレームワークが直接呼び出せるというのがPowerShellのいいところ。

これでも用は足ります。ただせっかくなので第一引数をもらってsayコマンドに近づけましょう。

PowerShellを単品で動かすのは面倒で、だったら先のワンライナーで十分です。そこで古き良きバッチファイルに変換します。第一引数をもらって音声に変換するバッチファイルバージョンがこちら。

```say.bat
@echo off
setlocal
set "text=%~1"
powershell -Command "Add-Type -AssemblyName System.Speech; (New-Object System.Speech.Synthesis.SpeechSynthesizer).Speak(
'%text%')"
```

powershellという比較的モダンなスクリプト単品を動かすために30年前から受け継がれてるバッチファイルというのも気持ちが悪いですが仕方ありません。

あとはこんな感じで使えます。

```
PS C:\Users\yugoy> C:\Users\yugoy\Desktop\say.bat こんにちは
```

バッチファイルなので、パスの通ったところにおけばよりコマンドっぽく使えます。

### ポイント

- PowerShellを通じて.NETフレームワークのAPIをスクリプトっぽく呼び出せる
- シンプルなスクリプトならワンライナーにできる
- ワンライナーを実行可能にするにはバッチファイルにする

この手法を使えば、「.NETフレームワークのこの機能だけ使いたい」ということができます。単機能のバッチファイルを複数作ることで、UNIX哲学の「一つのことをうまくやるプログラムを書く」が実現できます。

### WSLからでも使えるの？

WSLからでもPowerShell経由の.NETは呼び出せます。こんな感じでbash上から起動できます。

```
powershell.exe 'Add-Type -AssemblyName System.Speech; (New-Object System.Speech.Synthesis.SpeechSynthesizer).Speak("こ
んにちは")'
```
Amazon Bedrock ガードレール

**Amazon Bedrock ガードレール**は、**生成AI（Generative AI）モデル**の使用において、**倫理的なガイドラインと安全性を確保するための制約やポリシー**です。これにより、生成AIを使用する際に不適切なコンテンツが生成されないようにし、企業や開発者が安心してAIを活用できるようにサポートします。

---

### 🌟 **Amazon Bedrock ガードレールの特徴**

1. **不適切なコンテンツの制御**  
   ガードレールは、生成AIモデルが**不適切な、攻撃的、または有害なコンテンツ**を生成するのを防ぐための安全策を提供します。例えば、差別的な言葉や不快な表現を生成しないように制限を設けます。

2. **コンプライアンスの遵守**  
   法的および規制に準拠した内容を生成するよう、コンテンツが**倫理的基準に合致**することを保証します。これにより、企業はコンテンツの生成に関する規制を遵守しやすくなります。

3. **カスタマイズ可能なポリシー**  
   ユーザーは、**ガードレールの設定をカスタマイズ**して、特定のユースケースや業界に合わせた制約を設定できます。たとえば、特定のトピックについて生成される内容を制限することが可能です。

4. **透明性とトレーサビリティ**  
   生成されたコンテンツがどのようなガードレールによって制御されているかの情報を提供し、**生成プロセスの透明性**を確保します。これにより、AIの出力がどのように影響を受けているかを追跡できます。

5. **リアルタイム監視と警告**  
   生成されたコンテンツに対して、**リアルタイムで監視**が行われ、不適切なコンテンツが生成される前に警告を受け取ることができます。

---

### ✅ **利用シーン**
- **企業のコンテンツ生成**  
   企業が自社のコンテンツを生成する際に、**倫理的で安全な内容**を保つために使用します。特にカスタマーサポートやマーケティングコンテンツの自動生成において、問題のある内容が出力されないようにします。

- **規制を遵守したAI使用**  
   法的規制や業界のガイドラインに従って、生成AIを適切に使用するために利用されます。例えば、金融業界や医療業界での使用において、特定のコンテンツの生成を制限することができます。

- **AIの安全な活用**  
   不適切なコンテンツが生成されるリスクを最小限に抑えることで、**AIをより安全に活用**するためのガイドラインとして機能します。

---

### ✅ **特徴まとめ**

| 項目 | 内容 |
|:---|:---|
| **目的** | 生成AIによる不適切なコンテンツ生成を防止するためのガイドライン |
| **不適切なコンテンツの制御** | 攻撃的、差別的、または不快な内容を制限 |
| **カスタマイズ可能な制限** | ユーザーの要件に合わせてガードレールを調整可能 |
| **透明性とトレーサビリティ** | 生成されたコンテンツとその制限の情報を提供 |
| **リアルタイム監視** | 不適切なコンテンツの生成を監視し、警告を出す |

---

### 📝 **まとめ**
**Amazon Bedrock ガードレール**は、生成AIを安全かつ倫理的に使用するための重要なツールです。生成されるコンテンツが適切であることを保証し、企業や開発者が安心してAIを活用できる環境を提供します。これにより、不適切なコンテンツの生成を未然に防ぎ、業界の規制を遵守する手助けをします。

---