OmniAICreator/Qiita-1.07M huggingface dataset:
【E資格取得後】感情分析アプリ 〜Python（TF-IDF）＋Streamlit＋ロジスティック回帰〜


前回は「画像分類アプリ」を作成しました。  
👉 [前回の記事はこちら！](https://qiita.com/atm_sakura/items/ad0e2566174635f08a59)　

今回はテーマを 自然言語処理（NLP） に変えて、テキストをポジティブ／ネガティブに分類するアプリを作ってみました。  
開発を通して以下のスキルを身につけることができました。

###  学んだこと

- `Tokenizer` を使った 分かち書き
- `TF-IDF` による 文章のベクトル化
- `LogisticRegression` による クラス分類


##  開発環境と使用ライブラリ

### 開発環境
- OS：Windows 11  
- Python：3.12.7

### 使用した主なライブラリ

| ライブラリ名 | 用途 |
|--------------|------|
| streamlit | Web UI作成 |
| janome | 日本語の形態素解析 |
| scikit-learn | 学習・推論ロジック（TF-IDF, ロジスティック回帰） |


##  モデル構成と学習内容

- 分かち書き：`janome` を使用
- 特徴量抽出：`TfidfVectorizer`（sklearn）
- 学習モデル：`LogisticRegression`（sklearn）

---

## Webアプリの概要

前回同様、UI は `Streamlit` を使って構築しました。  
入力された日本語の文章を **ポジティブ／ネガティブ** に分類して表示します。

---

##  アプリの使い方

### 1. モデルの学習（初回のみ）
ターミナルからスクリプトを実行して学習します。

---

### 2. `run.bat` を起動して、UI を表示

![起動画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4065772/f32fae42-d73a-42f5-afdd-ca1bca17a25d.png)

---

### 3. テキストを入力し、「分析する」ボタンをクリック！

![入力画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4065772/a1400914-b7f1-418f-ab32-b7c5a6e06083.png)

---

### 4. 分類結果が表示されます！

![結果表示](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4065772/de33b1d3-c4fe-4b05-8459-a6e2e025d726.png)

---

##  おわりに

今回は、ロジスティック回帰による文章分類 を体験しました。  
次回は、BERT（深層学習モデル） を使ってより高精度な分類にチャレンジします。

---

##  本記事のコード

https://github.com/Jatm1019/ai_application_sentiment
Linucレベル１勉強メモ　＃５３

# 第五章　ハードウェア、ディスク、パーティション、ファイルシステム

練習問題5.8
ネットワークインターフェースが有効にならないため、lsmodコマンドを実行してみると、ネットワークカードのデバイスドライバがロードされていませんでした。手動でロードするために実行すべきコマンドがどれですか。

A. loadmod

B. modload

C. modprobe

D. modinfo

E. rmmod

（解答）C

（解説）
Linuxでは、デバイスドライバは通常、カーネルモジュールとして用意されています。カーネルモジュールをロードするには、modprobeコマンドもしくはinsmodコマンドを使います。従って、正解は選択肢Cです。loadmodやmodloadといったコマンドはありません。modinfoはカーネルモジュールの情報を表示するコマンドです。rmmodはカーネルモジュールをとり外すコマンドです。

デバイスドライバのロード
デバイスを利用するために必要な制御プログラムをデバイスドライバと言います。Linuxでは、デバイスドライバはカーネルの一部（カーネルモジュール）として提供されています。必要なデバイスドライバをカーネルに組み込むことを「ロードする」と言います。ロードされているカーネルモジュールを確認するには lsmodコマンドを言います。
通常、必要なデバイスドライバは自動的にロードされますが、手動でロードする場合は、modprobeコマンドを実行します。次の例では、汎用CD-ROMドライバをロードし、lsmodコマンドで確認しています。
なお、カーネルモジュールをロードするinsmodコマンド、取り外すrmmodコマンドもありますが、カーネルモジュール同士の依存関係をユーザーが処理する必要があります。そのため、依存関係を自動的に解決するmodprobeコマンドを使うのが一般的です。
Elm の使い方

Ubuntu 25.04 で確認しました。

## インストール

こちらに書いてある通りです。
[Install Instructions](https://github.com/elm/compiler/blob/master/installers/linux/README.md)

コードのダウンロード

```bash
curl -L -o elm.gz https://github.com/elm/compiler/releases/download/0.19.1/binary-for-linux-64-bit.gz
```

解凍

```bash
gunzip elm.gz
```

実行権限をつける

```bash
chmod +x elm
```

elm を /usr/local/bin に移動

```bash
sudo mv elm /usr/local/bin/
```

バージョンの確認

```text
$ elm --version
0.19.1
```

## コードの作成

```bash
mkdir hello_world
cd hello_world
elm init
```

この時点でのフォルダー構成

```text
$ tree
.
├── elm.json
└── src
```

src/Main.elm を作成する

```elm:src/Main.elm
module Main exposing (main)
import Html exposing (text)

main = text "Hello World. Elm! May/18/2025"
```

この時点でのフォルダー構成

```text
$ tree
.
├── elm.json
└── src
    └── Main.elm
```

## コンパイル

```bash
elm make src/Main.elm
```

実行結果

```text
$ elm make src/Main.elm
Dependencies ready!         
Success! Compiled 1 module.

    Main ───> index.html
```

## 実行

```bash
elm reactor
```

```text
$ elm reactor
Go to http://localhost:8000 to see your project dashboard.
```

## ブラウザーでアクセス

http://localhost:8000
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/87f7d7fe-80dc-41b6-845c-40a42486f455.png)


index.html をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/6af180cf-427e-4db1-afca-6ce24adacf56.png)
パソコン操作が楽しくなる！ショートカット10選

## 仕事で毎日使うパソコン。やっぱり楽しくなくちゃ！
私の会社では細かく生産性を監視されており、作業効率化がマストです。
（10分単位で作業報告を出すため、トイレでサボることもできません😢）
こんな**監視会社**で必要に迫られショートカットを1年磨いてきました。

作業が早くなるだけでなく、パソコンを使いこなせる感じでキーボード操作が楽しくなってきます。
特に楽しくなるショートカットを10個選んだので、IT企業でない人もぜひ読んで下さい！
（仕事ができるように見え、モテ度も10%アップします）

### 🔄 全体で使える神ショートカット
Win + D
　→　全ウィンドウを一瞬で隠してデスクトップ表示。
　　　上司が来た時の「最終防衛ライン」です。再度押せば元通り。

Alt + Tab
　→　アプリを高速切り替え。
　　　1秒でも無駄にしたくないあなたに。切り替えのスムーズさで玄人感UP。

### 🌐 ブラウザで差がつくショートカット
Ctrl + W
　→　今見ているタブを即閉じ。
　　　「え、今の見てないっすよ？」とサッと画面を切り替える技。

Ctrl + T
　→　新しいタブを開く。
　　　調べものの始まりはいつもCtrl + T。

Ctrl + Shift + T
　→　さっき閉じたタブを復活。
　　　神レベルに便利。間違って閉じてもノープロブレム！

Ctrl + Tab
　→　タブを右に順番に移動。
　　　マウス要らずで情報を行き来できる。
　　　Ctrl + Shift + Tのように、Shiftを使えば左に移動できる。   

J / K / L（YouTubeで使える）
　→　J：10秒戻る　K：一時停止　L：10秒進む
　　　マウス使わずに動画を操る快感。もう戻れない。


### 💻 コーディング系（Visual Studio Code編）
Alt + Shift + ↓ or ↑
　→　行の複製。
　　　コードをコピーしてちょっとだけ編集したいときに神速！

Ctrl + /
　→　選択した行をコメントアウト。
　　　デバッグ中に「一時的に消すけど残したい」時の定番。

Ctrl + P → ファイル名入力
　→　どこでもファイルジャンプ。
　　　プロジェクトが巨大でも関係なし。すぐ目的地へ。

Ctrl + Tab
　→　開いているタブを移動できる。
　　　ブラウザと同じ理屈。

### 🎉 まとめ：ショートカットは、仕事の楽しさをくれる
最初は覚えるのが難しいかもしれませんが、慣れると作業が倍速になります。
ショートカットを覚えることでPC操作が楽しくなり、仕事も捗る相乗効果があると私は考えています。

いかにホームポジションから手を動かさないかが作業効率化の鍵です。
その他のPCテクニックについても、今度投稿しようと思っているのでお楽しみに！
CloudFront Functionsで静的サイトにBasic認証をかける方法

## はじめに
S3 + CloudFront でホスティングしている静的サイトに、**軽量なBasic認証を追加**する方法を紹介します。
Lambda\@Edgeを使わず、**CloudFront Functionsだけで簡単に導入可能**です。
また、必要に応じて「トップページだけに認証をかける」といった柔軟な制御も可能です。

## この方法の特徴

* CloudFront Functionsのみで完結（無料枠あり・高速）
* AWSキー管理不要（サーバーレスな認証追加）
* 認証をかけるパスを自由にコントロールできる
* 静的ファイルベースのサイトならどんな構成でも対応可能

## 🔧 ステップ1：CloudFront Function を作成

1. AWSコンソール → **CloudFront** → 「**Functions**」
2. 「**関数を作成**」をクリック
3. 任意の関数名（例：`static-site-basic-auth`）を入力
4. ランタイムは `cloudfront-js-1.0` を選択
5. 次のコードを貼り付けます：



### 🧑‍💻 関数コード（ユーザー名: `demo_user`、パスワード: `demo_pass123`）

```javascript
function handler(event) {
    var request = event.request;
    var headers = request.headers;

    // Base64("demo_user:demo_pass123")
    var expectedAuth = "Basic ZGVtb191c2VyOmRlbW9fcGFzczEyMw==";

    // 🔐 認証対象のパスをここで制御（例: index.html のみに認証）
    if (request.uri === "/index.html" || request.uri === "/") {
        if (
            !headers.authorization ||
            headers.authorization.value !== expectedAuth
        ) {
            return {
                statusCode: 401,
                statusDescription: 'Unauthorized',
                headers: {
                    'www-authenticate': {
                        value: 'Basic realm=\"Restricted Area\"'
                    }
                }
            };
        }
    }

    return request;
}
```

## 💾 ステップ2：関数の保存と発行（両方必須！）

* **右上の「保存」ボタンをクリック**
![スクリーンショット 2025-05-18 17.51.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/d9a76feb-8d5f-4555-81d9-a9d9953f1004.png)

* その後、必ず「**関数を発行**」をクリックして反映状態にします
  これを忘れると、CloudFrontに適用されません！
![スクリーンショット 2025-05-18 17.50.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/77590717-e839-4ccc-80c5-6581ea0ce32a.png)

## 🔗 ステップ3：CloudFrontビヘイビアに割り当て

1. CloudFront → 対象ディストリビューションを選択
2. 「ビヘイビア」タブを開き、認証をかけたいパス（例: `/`）を選んで「編集」
3. 「**関数の関連付け**」の「**Viewer Request**」に、作成した関数を割り当て
4. 保存して反映


## 🔍 ステップ4：動作確認

ブラウザで以下のようにアクセスし、Basic認証ダイアログが出るか確認します：

```text
https://<your-distribution>.cloudfront.net/index.html
```

| 項目    | 値              |
| ----- | -------------- |
| ユーザー名 | `demo_user`    |
| パスワード | `demo_pass123` |


## 🧩 オプション：特定のパスだけに認証をかけたいとき

関数のこの部分👇を使えば、**index.htmlやトップページだけに認証をかける**ことができます。

```javascript
if (request.uri === "/index.html" || request.uri === "/") {
```

これにより、`/index.html` や `/` にアクセスしたときだけ認証が求められ、
CSS や JS、他のHTMLファイル（例: `/page1.html`, `/assets/style.css`）には影響しません。

たとえば「トップページは限定公開だけど、ドキュメント詳細は誰でも見ていい」といった用途にぴったりです。

## ✅ まとめ

CloudFront Functions を使えば、**静的サイトに簡易なアクセス制限（Basic認証）をすばやく追加**できます。
認証対象のパスも細かく制御でき、コストも実質ゼロ。ちょっとした社内公開や限定公開サイトに最適です。
CTF Stegano

# 目次

- Setup
    - [Kali Setup](https://qiita.com/kannkyo/items/3c29df1c2df60926d47d)
- [Pwn](https://qiita.com/kannkyo/items/92fa2e19ad4f31141190)
- [Stegano](https://qiita.com/kannkyo/items/776996b9b7fe1779690c)
- Web
    - [Web Awesome Injection](https://qiita.com/kannkyo/items/b334bca02c8a24331615)

# 偵察

```bash
FILE=

# binary extract
binwalk -e $FILE
exiftool $FILE
foremost $FILE
strings $FILE

# for png
pngcheck -cvt $FILE
```
「アﾞッﾞッﾞ！！」本番サーバーを指先１つでダウンさせた男 〜I am Shock〜

# サーバーを誤って、シャットダウンさせた事ありますか？
経験した事はございますか？

あの瞬間、「ア゛ッ゛ッ゛ッ゛ッ゛ッ゛ッ゛ッ゛ッ゛ッ゛ッ゛ッ゛ッ゛ッ゛ッ゛ッッ゛ッ゛ッ゛ッ゛ッ゛ッ゛ッ゛ッ゛ッ゛ッ゛！゛！゛！゛！゛！゛！゛」という声が思わず出てしまいました。今思い出しても、背筋が凍るような感覚です。遊園地のフリーフォールに乗った直後のような、あの何とも言えない浮遊感。わかるかな...？

つい先日、サーバーメンテナンス作業前に、よりによって本番環境で稼働しているサーバーを誤ってダウンさせてしまいました。本当に指先１つでダウンです。


# ある晴れた日のこと
メンテナンス作業の手順を行う際に、実際にサーバーにログインして、設定内容の確認や動いているサービスの確認を行なっていました。

確認作業は、手順書内のコマンドをコピペして、行なっていました。systemctl status 〇〇等のステータス確認系のコマンドを主に叩いていました。確認自体は無事滞りなく、完了しました。

次は手順書を印刷しようと思い、メモ帳に手順書をコピペしました。(プロジェクト管理ツールのコメントに手順書が記載されていた為。印刷する際に、メモ帳等に転記する必要があった。)

メモ帳にコマンドを貼り付けた瞬間に、やたらとコンソール上に文字が流れていきます。
「コピペミスった。CTRL + Cでキャンセルと...」
キャンセル出来ません。しかも、最終行に下記メッセージが出力されていました。

```
Connection to サーバ名 closed.
```

最初は、ssh切れてしまったと呑気に考えていましたが、pingも通りません。
コンソールに流れているコマンド等を確認してみます。`sudo shutdown -h now`が流れているではありませんか。

ここでやっと...気付きました。

手順書には改行コードが含まれており、私が貼り付けした瞬間に、上から順番に、コマンドが実行されていったのです。まるで、ドミノ倒しのように。そして、そのドミノの最後には、恐ろしい「sudo shutdown -h now」の文字が鎮座していたというわけです。

コピペという名の甘い罠。そして、無駄にコンソールを開いていたという油断。この二つが、見事に私を地獄へと突き落としたのです。

完全に頭真っ白になりかけましたが、誤ってメンテナンス前に、サーバーをシャットダウンしてしまった旨をチャットで報告し、データセンターまで復旧に行きました。
復旧自体は、手順書内にサービスの立ち上げコマンドが既に用意されている状態だったので、すんなり復旧出来ました。

データセンターまで向かう私の気持ちは、文字通り、爆散です。物理的には無事でしたが、私の精神は粉々に砕け散りました。

幸いにも、サービスに影響がなかったので、その点だけは救いでした。(監視サーバーをシャットダウンした。)
これがDB等を扱っている主要なサーバーだったら、おそらく物理的にも私は爆散していた事でしょう。


# 何か対策方法あるの？
色々思いつきますが、うちでは手順書を作る際に、`sudo`コマンドをつけない方向となりました。
確認作業は個人ユーザーで行うので、万が一同じ事が起こっても、コマンドが実行されません。

その他にも、sudoersを適切に運用する方法やシャットダウン専用のスクリプトを用意する等も思いつきますが、既存サーバーや構成完了ツールの設定変更の作業も別途発生する可能性があります。

ちゃんとした対策を考えると、運用コストが大きくなってしまう可能性を懸念して、`sudo`コマンドをつけない方針になりました。（今後同じ事象が多発する場合は、別途対策を考える必要は勿論あります。）

# やらかす前の私へ、まだやらかす前の君へ
あの時、確認作業が終わった際にコンソールを閉じなかった自分に、事故るから作業終了後には、コンソール閉じろと膝蹴りかましたい。
これがコンソールではなく、別のところに貼り付けが行われていたのであれば、こんな事故はおこらなかったはずだ。

作業が終わったら、コンソールは閉じよう。
そして、コンソールを複数開くのも、危険だ。

そして、`shutdown -h now`じゃなくて、`shutdown -h 5`等でシャットダウンに間を持たせても良かったんじゃないか？
いきなり死なれたら、私何も出来ないよ...。

# 最後に
やらかした瞬間は、かなり焦りましたし、落ち込みました、
でも、世の中には自分以上にやらかしてる人もいます。`rm -rf コマンドでサーバー壊した人`や`drop databaseで本番DB飛ばした人`など色んな人がいるようですw
それに比べたら、大したことはありません。

いつか後輩ができたら、私も昔こんな事やらかしたと笑って、話したいと思います。
「稼働中のサーバーをシャットダウンした事あるんだ」って...

この悲しみを、いつか優しさに昇華させます。
Linucレベル１勉強メモ　＃５２

# 第五章　ハードウェア、ディスク、パーティション、ファイルシステム

練習問題5.7
PCIデバイスの１つが不具合を起こしているようです。PCIデバイスの情報を詳細に表示したい場合に実行すべきコマンドはどれですか。

A. cat /dev/pci

B. lspci -vv

C. cat /dev/bus/pci

D. cat /proc/bus/pci

（解答）B

（解説）PCIデバイスの情報を確認するには、lspciコマンドを使います。-vオプションを指定すると詳細な情報が、-vvオプションではさらに詳細な情報が表示されます。「/dev/pci」「/dev/bus/pci」といったファイルはないので、選択肢A, Cは不正解です。また「/proc/bus/pci」はディレクトリなので、選択肢Dは不正解です。

lscpiコマンド
PCIデバイスの情報を表示するためのコマンド
-vオプションを使うと詳細な情報を、-vvオプションを使うとさらに詳細な情報を表示できる。
Amazon API GatewayのLambda プロキシ統合

Amazon API Gateway の **Lambda プロキシ統合** は、API Gateway から AWS Lambda 関数へリクエストをそのまま渡し、Lambda のレスポンスをそのままクライアントへ返す **シンプルかつ柔軟な統合方式** です。

---

## ✅ 概要：Lambda プロキシ統合とは

* API Gateway から Lambda に HTTP リクエスト情報（メソッド、パス、ヘッダー、クエリなど）を **JSON 形式で一括転送**
* Lambda はその JSON をパースし、適切な処理をして **構造化された JSON レスポンスを返す**
* API Gateway 側のマッピングテンプレート設定などは **不要**

---

## 🔁 リクエストとレスポンスの流れ

### 🔹 API Gateway → Lambda（入力イベント）

Lambda 関数には、以下のようなイベント JSON が渡されます：

```json
{
  "resource": "/example",
  "path": "/example",
  "httpMethod": "GET",
  "headers": { "Host": "...", "User-Agent": "..." },
  "queryStringParameters": { "key": "value" },
  "pathParameters": null,
  "body": null,
  "isBase64Encoded": false
}
```

---

### 🔹 Lambda → API Gateway（出力）

Lambda 関数の返却は、**以下の形式**で返す必要があります：

```json
{
  "statusCode": 200,
  "headers": {
    "Content-Type": "application/json"
  },
  "body": "{\"message\": \"Hello from Lambda!\"}",
  "isBase64Encoded": false
}
```

---

## 🛠 メリット

| 特徴        | 説明                                  |
| --------- | ----------------------------------- |
| シンプル      | API Gateway 側でマッピングテンプレートの設定不要      |
| 拡張性       | Lambda でリクエストを完全に制御できる（自由なパース、認証など） |
| 統一フォーマット  | 単一形式のイベントで全ての情報を取得できる               |
| モダンな構成に最適 | REST API や HTTP API 両方で利用可能         |

---

## ⚠️ 注意点

| 注意点               | 説明                                       |
| ----------------- | ---------------------------------------- |
| Lambda 側の実装責任が大きい | リクエストパースやエラーハンドリングなどを Lambda 内で全て行う必要がある |
| レスポンス形式は固定        | 特定の JSON 形式でないと API Gateway で正常に処理されない   |

---

## 💡 利用例（Node.js）

```javascript
exports.handler = async (event) => {
    console.log("Event:", event);

    const response = {
        statusCode: 200,
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({ message: "Hello from Lambda!" }),
    };

    return response;
};
```

---

## 🧩 Lambda プロキシ統合 vs 非プロキシ統合

| 項目      | Lambda プロキシ統合    | 非プロキシ統合           |
| ------- | ---------------- | ----------------- |
| リクエスト形式 | 自動で構造化 JSON イベント | マッピングテンプレートで定義必要  |
| レスポンス形式 | 固定の JSON 構造が必要   | フレキシブル（テンプレートで変換） |
| 管理場所    | Lambda 中心        | API Gateway 中心    |

---

## 🚀 よく使われるユースケース

* シンプルな API（GET/POST）を Lambda 関数で完結させたいとき
* Lambda\@Edge や API Gateway + Lambda のサーバーレス構成
* 認証情報やパス、クエリ文字列をまとめて受け取りたいとき

---
C言語でのsystem()関数の使い方


## 基本的な使い方
system()関数は、引数に文字列で渡したコマンドやシェルスクリプトをシェル（通常 /bin/sh）経由で実行するために使われます。
たとえば system("ls") とすれば、ターミナル上で ls を実行するのと同じような結果になります。
以下は、hello.sh というシェルスクリプトを実行するサンプルです。サンプルコードをコンパイルして実行すると、次のような出力が得られます。
```sh:出力
シェルスクリプト hello.sh を実行します:
Hello from shell script!
Sun May 18 05:33:04 UTC 2025

system() の戻り値: 0
```
<サンプルコード>
```sh:hello.sh
#!/bin/sh
echo "Hello from shell script!"
date
```
```c:sample.c
#include <stdio.h>
#include <stdlib.h>

int main() {
    printf("シェルスクリプト hello.sh を実行します:\n");

    int status = system("./hello.sh");

    printf("\nsystem() の戻り値: %d\n", status);

    return 0;
}
```

## エラーになるパターン
`system()`関数に類似した関数として`execvp()`関数 がありますが、以下のような違いがあります。
* `execvp()`：コマンドと**コマンドライン引数を分けて**指定できる。 
* `system()`：コマンドと**コマンドライン引数を1つの文字列**として渡す必要がある（分離不可）。 

そのため、以下に示すコード内のNGのような書き方をするとコンパイルエラーが発生します。
```c:info.c
#include <stdio.h>
#include <unistd.h>

int main() {
    char *args[] = {"./info.sh", "Alice", "25", "Tokyo", NULL};

    execvp("./info.sh", args); // OK
    system(args); // NG

    // execvpが失敗した場合のみここに来る
    perror("execvp failed");
    return 1;
}

```
```sh:コンパイル
[root@85110ffae5b1 workspace]# gcc -g info.c -o info
execvp_info.c: In function ‘main’:
execvp_info.c:9:12: warning: passing argument 1 of ‘system’ from incompatible pointer type [-Wincompatible-pointer-types]
     system(args);
            ^~~~
In file included from execvp_info.c:2:
/usr/include/stdlib.h:781:32: note: expected ‘const char *’ but argument is of type ‘char **’
 extern int system (const char *__command) __wur;
                    ~~~~~~~~~~~~^~~~~~~~~
```

## 複数のパラメーターを渡したい場合
上記のことから、`system()`関数には以下のようにコマンドとコマンドライン引数を1つの文字列として渡します。
```c:system_info.c
#include <stdio.h>
#include <stdlib.h>

int main() {
    const char *name = "Alice";
    const char *age = "25";
    const char *city = "Tokyo";

    char command[256];

    // コマンドを文字列として組み立てる（引数付き）
    snprintf(command, sizeof(command), "./info.sh %s %s %s", name, age, city);

    printf("実行するコマンド: %s\n", command);

    int status = system(command);

    printf("system() の戻り値: %d\n", status);

    return 0;
}

```

```sh:実行結果
root@85110ffae5b1 workspace]# ./system_info
実行するコマンド: ./info.sh Alice 25 Tokyo
Name: Alice
Age: 25
City: Tokyo
system() の戻り値: 0
```

以上です。最後までお読みいただきありがとうございました！
[失敗談]AWS Bedrock × Strands でLLMを動かそうとしたらダメだった話（全工程＆ハマりポイントまとめ）



## はじめに

AWSの「Bedrock」× OSSエージェントフレームワーク「Strands」で、  
**LLM（大規模言語モデル）をローカルCLIから対話的に動かそう！**  
――そう意気込んでチャレンジしたエンジニアの体験記です。

結論：**「権限周り、想像以上に沼で諦めました」**  
でも、同じところでハマる人がきっといるはず。  
そのための**「備忘録＋ハマりポイント共有」**として残します。

---

## ゴール

- AWS BedrockのClaudeやTitanなどのモデルを**Strands CLIから動かしたい**
- Mac（Apple Silicon）＋ AWS個人アカウント利用
- 最低限「何かが動く」体験をしたい！

---

## やったこと全まとめ

### 1. IAMユーザーとポリシーの設定

- 会社用と個人用のAWSアカウントを明確に分離（今回は個人用のみ利用）
- 個人用IAMユーザーを新規作成し、**必要なBedrockポリシー**をアタッチ
- `aws configure` で新しいプロファイル（例: `personal`）を追加

```sh
aws configure --profile personal
````

### 2. 利用可能なモデル一覧の取得

```sh
aws bedrock list-foundation-models --region us-east-1 --profile personal \
  | jq '.modelSummaries[] | select(.providerName=="Anthropic" or .providerName=="Amazon") | {modelId, modelName, status: .modelLifecycle.status}'
```

* **Anthropic（Claude）系**は`LEGACY` or `ACTIVE`だが、「利用不可」なものもある
* **Amazon Titan/Nova**系は `ACTIVE` だが、動く保証はない

### 3. CLI単体でBedrockモデルAPIを叩くテスト

**（準備）input.json を用意**

```json
{"inputText": "Hello"}
```

**（実行）**

```sh
aws bedrock-runtime invoke-model \
  --region us-east-1 \
  --model-id amazon.titan-text-lite-v1 \
  --body fileb://input.json \
  --content-type 'application/json' \
  --accept 'application/json' \
  --profile personal \
  outfile.txt
```

**（結果）**

```json
{"inputTextTokenCount":3,"results":[{"tokenCount":13,"outputText":"\nBot: Hello! How can I help you today?","completionReason":"FINISH"}]}
```

👉 **CLI単体なら "動作OK"。**

---

### 4. Strands からBedrock経由でモデル実行

```sh
AWS_PROFILE=personal strands --model-provider bedrock --model-config '{"region": "us-east-1", "model_id": "amazon.titan-text-lite-v1"}'
```

**（結果）**

* 何度試しても\*\*`AccessDeniedException`\*\*（権限エラー）
* モデルIDを `ACTIVE`なものに変えても状況変わらず
* **「CLI単体では動作する」**のに、Strands経由では**常にエラー**

---

## ハマりポイント・得られた知見

### 1. Bedrockモデルの「アクセス権」は本当に厳しい

* IAMで\*\*「Bedrockフル権限」\*\*を明示的に付与してもダメな場合あり
* **アカウント/リージョン/モデルの状態**が絡む
* \*\*「モデルはACTIVEでもアクセス権自体は付与されていない」\*\*というケースに注意

### 2. Strandsは「推論API」のラッパーであり、AWS SDKの権限エラーは内部的に伝播してくる

* 権限エラーがそのまま出て**デバッグがつらい**
* SDKレイヤーの動作確認は**まずaws CLI単体で**

### 3. 公式サポート状況・実装依存に要注意

* Strands側のBedrock対応実装に**制約やバグがある可能性**
* \*\*（執筆時点2025年5月）Claude/Haikuなど最新モデルは「表示はされるが、実際には権限エラー」\*\*が出る状況

---

## 最後に（これから挑戦する人へ）

* **IAM・Bedrock・モデルID・API実行権限**の4点セットは絶対チェック
* 「CLIで動く → SDK/OSSツールで動かない」の場合は**OSS側の実装やバグも疑う**
* 権限沼にハマっても\*\*「あなただけじゃない」ので安心して！\*\*

---

### 参考コマンド集

```sh
# プロファイル確認
aws sts get-caller-identity --profile personal

# 利用可能なモデル一覧
aws bedrock list-foundation-models --region us-east-1 --profile personal | jq '.modelSummaries[] | {providerName, modelId, modelName, status: .modelLifecycle.status}'

# Bedrock推論API動作テスト
aws bedrock-runtime invoke-model \
  --region us-east-1 \
  --model-id amazon.titan-text-lite-v1 \
  --body fileb://input.json \
  --content-type 'application/json' \
  --accept 'application/json' \
  --profile personal \
  outfile.txt
```

---

## おまけ

> **「OSSフレームワーク×クラウドLLM」** は今後どんどん発展する分野！
> 今回は苦戦したけど、「沼った知見」もいつか誰かの役に立つはず。
> この記事が誰かの参考になれば嬉しいです。
Next.jsとTailwind CSSで書体ジェネレーターを開発した話


## はじめに
最近、書道フォントを簡単に生成できるWebツール「**Calligraphy Font Generator**」を開発しました。このプロジェクトでは、Next.js（Reactフレームワーク）とTailwind CSSを採用し、SSR（サーバーサイドレンダリング）と静的生成を活用しました。今回はその技術的選択と実装のポイントを共有します。

## 技術選定の理由

### 1. Next.jsのメリット
- **SSR/SSGによるSEO最適化**  
  書体プレビュー画面は検索エンジンでの表示が重要だったため、SSRを採用
- **API Routes**  
  フォント生成の計算処理を`/api/generate`で簡単に実装
- **Dynamic Routes**  
  `pages/fonts/[style].js`で各書体スタイルのページを自動生成

```typescript
// 動的ルーティングの例
export async function getStaticPaths() {
  const styles = await fetchFontStyles();
  return {
    paths: styles.map(style => ({ params: { style } })),
    fallback: false
  };
}
```
## 2. Tailwind CSSの活用
Utility-Firstの特徴を活かし、迅速なUI開発を実現：

```jsx
<div className="max-w-2xl mx-auto p-6 bg-white rounded-lg shadow-md">
  <h1 className="text-3xl font-bold text-gray-800 mb-4">書体ジェネレーター</h1>
  <input 
    className="w-full p-3 border border-gray-300 rounded-md focus:ring-2 focus:ring-blue-500"
    placeholder="文字を入力..."
  />
</div>
```
## 参考にした既存ツール
開発にあたり、既存の[Calligraphy Font Generator](https://calligraphyfontgenerator.org/)からUI/UXのインスピレーションを得ました。特に：

リアルタイムプレビュー機能

マルチデバイス対応

シンプルなインターフェース

これらの要素をNext.jsで再実装する際、VercelのEdge Functionsを使ってレイテンシを削減しました。

## パフォーマンス最適化
Font Loading：Google Fontsを最適化読み込み

Lazy Loading：書体サンプル画像の遅延読み込み

Cache Strategy：Stale-While-Revalidateを採用

## まとめ
Next.jsとTailwind CSSの組み合わせは、次のようなツール開発に最適です：
✓ SEOが重要なプロジェクト
✓ 迅速なプロトタイピングが必要な場合
✓ モダンなUXを実装したい場合
【TypeScript×React×Chakra UI】学習記録アプリをリニューアルしました

## はじめに
以前に作った学習記録アプリをアップデートし、新規機能を追加したりUIコンポーネントを採用したデザインを実装したものを作成しました。

実際の動きとしては以下のようなものです。

![new.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4021196/5bdc0fde-fd42-4f1e-a358-3b113b836d1e.gif)

https://study-record-ts-c0aac.web.app/

## 何をやったのか
今回のアプリ制作では以下の内容を実装に取り入れました。

* **TypeScript**を用いたアプリ内のデータに型定義を導入
* **Chakra UI**を用いたUIコンポーネントの実装
* **React Hook Form**を用いたフォーム内のバリデーション
* **Jestのモック関数**を用いて、実際にデータベースと連携しなくても実行できるテストコードの作成
* Chakra UI内の同じコンポーネント内で処理を変える動作の実装(追加と編集)

いずれも今回のアプリ作成を通して初めて触れるものばかりで当初は何をすればいいか見当がつかず苦戦していました。

ですが、最終的には試行錯誤を通して形になるものを作り上げることができ、自分の中で貴重な経験とノウハウを得ることができました。

## 大変だったこと/工夫したこと
### 未体験のツールへの対応方法
今回のアプリの中で**React Hook Form**、**モック関数**など未体験のツールを用いた実装が必要となる箇所がいくつか発生しました。

初見で苦労するところが多く発生する中で、以下の方法を試してみました。

#### ①公式ドキュメント上のサンプルコードを有効活用する
公式ドキュメントには`Quick Start`のようなサンプルコードがあります。

どうしても手掛かりが掴めない際には、**Quick Startのコードをコピペしてみて一部の値を変えながらどの部分が実際に変わるのか**を検証しながら進めました。
その際にわからない部分は公式ドキュメントや各種記事を見て理解を深めるようにしました。

サンプルコードは公式が提供してくれる最高の教材と言ってもいいものでした。実装や理解を進める上で大きな味方になってくれました。

#### ②ChatGPTを有効活用する
公式ドキュメントやWebの記事だけではどうしても理解が追いつかない部分もあります。その際は適宜**ChatGPT**の力を借りるのも有用でした。

ただしChatGPTを丸写ししただけでは実力がつかないので、『答えではなくヒントを得るための質問にすること』と『どうしても答えを聞く場合は実装理由も細かく聞く+あとで調べる』ことは意識していました。

はじめはAIの力を借りていたとしても次に実装する時は自分の頭で理解している状態を目指すようにしていました。


### 非同期処理の概念をより実感できた
今回の実装の中では、
* データベース(supabase)との連携
* そのための関数の作成、アプリ上の`useEffect`での非同期対応
* React Testing Library上のテストコード(`waitFor`など)

などで非同期処理が絡む実装箇所が複数存在しました。

非同期処理は概念として難しい箇所ですが、様々な形態で登場するたびにその都度調べてみることで、非同期処理全体の理解が以前よりも深まった気がしています。


## 気づいたこと
### 動画を見ただけでは理解しきれない。自分で手を動かす試行錯誤を通して理解度が深まる
今回のアプリ制作を行う前に別の教材でTypeScriptの型定義やモック関数についてはハンズオン教材を見ており、ある程度のノウハウはあるつもりで制作に入りました。

しかし実際に手を動かそうとすると何も覚えていない......という事象が頻発。
結局、**ハンズオン教材はあくまでインプットでしかなく、実際にその知識を"使う"ことによって初めてノウハウになる**ということを改めて実感しました。

バットの正しい振り方の本をいくら読んでも野球の試合でヒットが打てるようにならないのと同じ理屈ですね。

新しい技術・仕事中で理解度が足りていない部分などは再度手を動かしたり誰かに説明するようなアウトプットの機会を設けることが重要と感じました。

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

### 実装方法を先に書き出してみるとスムーズに進める
プログラムのロジックや実装を進めるための手掛かりとして**実装方法をメモなどに書き出して明示化すること**がかなり有効でした。

この方法を取ることで暗中模索の中で闇雲に手を動かすことが減り、ゴールから逆算するようなロジックを組める確率が上がりました。

# 最後に
今回のアプリ実装を通してこれまでインプットしてきた知識やノウハウがスキルとなって血肉になってきた感覚があります。

今後はさらに実践的なアプリ制作をする機会が出てくると思うので、今以上に制作フローの中で学びを増やしていきたいです。

## JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
興味のある方は、ぜひホームページをのぞいてみてください！
▼▼▼

https://projisou.jp
Linucレベル１勉強メモ　＃５１

# 第五章　ハードウェア、ディスク、パーティション、ファイルシステム

練習問題5.6
システムを構成するハードウェアに関する情報を確認するためには、＿＿＿＿＿＿＿＿＿ディレクトリ以下のファイルが役に立ちます。例えば、cpuinfoファイルにはCPUに関する情報が格納されています。下線部に当てはまるディレクトリ名を絶対パスで記述してください。

（解答）/proc

（解説）
/procディレクトリ以下のファイルを見ることで、カーネルが認識しているハードウェア情報を取得することができます。

デバイス情報の確認
Linuxは、ハードウェアのアクセスを抽象化するデバイスファイルを持っています。すべてのハードウェアがデバイスファイルとして表され、デバイスファイルの読み書きを通じてハードウェアにアクセスできるようになっています。デバイスファイルは/devディレクトリ以下にあります。これらのデバイスファイルは、udevという仕組みによって自動的に作成されます。

Linuxカーネルが認識しているデバイスに関す情報の一部は/procディレクトリ以下のファイルで確認できます。

/procディレクトリ以下の主なファイル
1. /proc/cpuinfo<br>CPU情報
1. /proc/interrupts<br>IRQ情報
1. /proc/ioports<br>I/Oアドレス情報
1. /proc/meminfo<br>メモリ情報
1. /proc/swaps<br>スワップ領域情報
1. /proc/bus/usb/*<br>USBデバイス情報
1. /proc/bus/pci/*<br>PCIデバイス情報

/procディレクトリ以下のファイルは、ファイルとしての実体がない仮想的なファイルです。一部のファイルは、テキストファイルとして、catコマンド等で閲覧できます。
【AppleCare に未加入】クレカ付帯の保険でiPhone画面ひび割れをAppleで5000円で修復する方法 #qiita


<img src="https://android.benigumo.com/wp-content/uploads/2025/05/a9659ef1-ad22-446d-8092-f2eadf47574f.png"  class="aligncenter" />

iPhoneの画面をうっかり割ってしまったとき、高額な修理代にため息をついたことはありませんか？実は、クレジットカードに付帯している保険を活用すれば、Appleの正規修理でも実質5000円で済むことがあります。

この記事では、「クレカの保険でiPhone画面をお得に修理する方法」について、仕組み・対応カード・実際の流れを解説します。

<p>&nbsp;</p>
<h3>&#x1f914; これで私も、実質19400円 → 5000円 となりました。</h3>

手が滑って画面がひび割れてしまった iPhone が、

<img src="https://android.benigumo.com/wp-content/uploads/2025/05/e31af3442de6f9c2032f34199c9f6e00.jpg"  class="aligncenter" />

<img width="320" src="https://android.benigumo.com/wp-content/uploads/2025/05/7c13dcd4e523895ffeafa34e5aaa49c0.png"  class="aligncenter" />

Apple 作業にて、実質支払5000円で復活。

<img src="https://android.benigumo.com/wp-content/uploads/2025/05/sc-2025-05-18-at-15.31.54.png"  class="aligncenter" />

<img src="https://android.benigumo.com/wp-content/uploads/2025/05/PXL_20250517_105953780.jpg"  class="aligncenter" />

本家 Apple で修理するのが一番安心です。

詳細は以下参考から。

# 😀 参考

[【AppleCare に未加入】クレカ付帯の保険でiPhone画面ひび割れをAppleで5000円で修復する方法](https://android.benigumo.com/20250517/smartphone-protection/)
UMLツール astahの活用法

# はじめに

UML（統一モデリング言語）は、ソフトウェア設計やシステム開発において、構造や振る舞いを視覚的に表現するための標準的な手法です。そのUMLモデリングを効率的に行えるツールが「astah」です。  
本記事では、**astahの基本的な使い方から、実務で役立つ活用法、便利な機能やチュートリアル情報まで**をまとめて紹介します。

---

# astahとは？

- **astah**は、UML 2.xに対応した国産のモデリングツールで、クラス図・シーケンス図・ユースケース図・マインドマップなど多彩な図を作成できます。
- 軽快な操作性と豊富な機能、シンプルなUIが特長で、個人からチーム開発まで幅広く利用されています。
- 20日間の無料トライアルも提供されています。

---

# astahの基本操作

## 画面構成と主要エリア

- **メインメニュー**：プロジェクト作成・保存・各種設定
- **プロジェクトビュー**：図やモデルの一覧表示・編集
- **ダイアグラムエディタ**：図の作成・編集
- **マップビュー**：図全体の俯瞰表示
- **プロパティビュー**：選択したモデルや図要素の詳細設定

## プロジェクトと図の作成

1. **新規プロジェクト作成**  
   [ファイル] → [プロジェクトの新規作成]で開始
2. **図の追加**  
   メインメニューやツールバーから「クラス図」「ユースケース図」など目的の図を選択
3. **モデル要素の配置**  
   ツールパレットからドラッグ＆ドロップ、またはダブルクリックで要素を追加
4. **要素の編集・削除**  
   プロパティビューやコンテキストメニューから編集・削除が可能

---

## よく使うUML図と活用例

| 図の種類       | 主な用途・特徴                                                                 |
|----------------|------------------------------------------------------------------------------|
| クラス図       | オブジェクト指向設計の基本。クラスの属性・操作・関連を整理                    |
| シーケンス図   | オブジェクト間のメッセージや処理の流れを時系列で可視化                        |
| ユースケース図 | システムの利用者（アクター）と機能（ユースケース）の関係を把握                |
| オブジェクト図 | 実際のインスタンス間の関係や値の例示に便利                                    |
| ステートマシン図 | オブジェクトやシステムの状態遷移を表現                                       |
| アクティビティ図 | 業務フローやアルゴリズムの処理手順を図解                                     |
| マインドマップ   | 要求分析やアイデア整理、要件定義の思考整理に活用                              |

---

# astah活用のポイント・便利機能

- **モデルと図要素の分離管理**  
  1つのモデルを複数の図で表現でき、変更は全図に自動反映。設計の整合性を保てます。
- **図間のトレーサビリティ**  
  クラス図とシーケンス図など、異なる図間での要素追跡が容易です。
- **マインドマップ・ER図対応**  
  要求分析やデータベース設計にも活用可能。
- **リバースエンジニアリング・コード生成**  
  Java/C#/C++のコードからモデル生成や、モデルからソースコード出力も可能。
- **チーム開発機能**  
  モデルの共有やバージョン管理、画像出力やドキュメント生成もサポート。

---

# チュートリアル・学習リソース

- **公式スタートガイド・機能ガイド**  
  画面構成や基本操作、各図の作成方法などを丁寧に解説。
- **公式チュートリアル**  
  UML初学者向けに、実際のモデル作成やソフトウェア開発への活用例を演習形式で学べます。
- **Qiita記事・ユーザー事例**  
  オブジェクト図の描き方や、実務での便利な使い方もQiitaで多数紹介されています。

---

# まとめ

astahは、**UMLモデリングを効率化し、設計の品質向上やチーム開発の円滑化を実現する強力なツール**です。  
基本操作を押さえれば、クラス図やシーケンス図だけでなく、マインドマップやER図、コード生成まで幅広く活用できます。  
公式マニュアルやチュートリアルも充実しているので、初学者から実務エンジニアまで安心して使いこなせます。

---
# 参考文献

**まずは無料トライアルやサンプルプロジェクトから、astahの操作感を体験してみましょう！**


https://astah.change-vision.com/ja/shopping/price.html


https://astah.change-vision.com/ja/manual.html


https://astah.change-vision.com/ja/tutorial.html

 
https://astah.change-vision.com/ja/manual/start-guide.html

 
https://qiita.com/WestRiver/items/89fd9c8a8cc3abecf589

https://www.componentsource.co.jp/product/astah-uml-j

https://astah.change-vision.com/ja/tutorial/uml-modeling-bs.html


https://astah.change-vision.com/ja/product/astah-uml.html
AWSとその周辺サービスをなるべくハードに例えてイメージをつきやすくする

## VPC (Virtual Private Cloud)
作成したアプリのデータを入れるレンタルパソコンがおけるレンタルスペース
東京と大阪にある

## EC2 (Elastic Compute Cloud)
 アプリを販売するときに使うレンタルパソコン。OS、メモリ等のスペックを最初に自由に選べる。アプリのデータもここに入れることができる。

## Fargate 
アプリを販売するときに使うレンタルミニパソコン。アプリがめっちゃ使われてる時は、勝手に追加のミニパソコンを追加してくれる。

## Docker
アプリと実行する環境を持ち運べるようにするために、それらを箱に入れたもの。
また必要な時に箱を作動させることができる。
開発時は自分のパソコンに入っている。実際にアプリを発売するときは上記のレンタルパソコンに移す

## ECS（Elastic Container Service）
上記の箱がしっかり動いているか、運用、監視するサービス。FargateかEC2に入れる。

## RDS (Relational Database Service)
アプリに登録される個人情報とかが入っている、上のパソコンとは別のパソコン
Windowsアプリ用アイコンと favicon.ico の違い ｜ 作成方法

# Windowsアプリ用アイコンと favicon.ico の違い

アプリやウェブサイトを作るときに必ず出てくる「アイコン」
「Windowsアプリ用のアイコンファイル（.ico）」と「favicon.ico」何が違うのかを調べた

- `.ico` ファイルの基本
- Windowsアプリ用アイコンと favicon.ico の違い
- 作成方法と設定手順
---

## `.ico` ファイルとは？

`.ico` ファイルは、Windowsで使用される **アイコン画像専用の形式** で、以下の特徴があります：

- 複数のサイズの画像を1つにまとめて持てる
- 透明背景（アルファチャンネル）対応
- 主に **Windowsアプリ** や **ウェブブラウザのファビコン** などで使われる

---

## Windowsアプリ用アイコンと favicon.ico の違い

| 項目 | Windowsアプリ用アイコン | favicon.ico |
|------|--------------------------|-------------|
| 使用先 | 実行ファイル（.exe）などのアプリケーション | Webサイトのタブやブックマーク、スマホのホーム画面 |
| 必須サイズ | 最低 16×16 ～ 最大 256×256 | 主に 16×16, 32×32（modern browsersでは PNG も対応） |
| 配置場所 | Visual Studioでプロジェクトに埋め込む | Webサーバー上の `/favicon.ico` または `<link rel="icon">` |
| 表示対象 | デスクトップ、エクスプローラー、タスクバーなど | ブラウザのタブやアドレスバー、ブックマークなど |
| 作成方法 | 多サイズ対応の `.ico` ファイルが必須 | `.ico` もしくは `.png`（現代的） |

**✔ 主な違い：**  
Windowsアプリ用は「多サイズ埋め込みが必須」なのに対し、faviconは16〜32px程度の軽量ファイルが求められます。

---

## `.ico` ファイルの作り方（両方に対応）

### 1. アイコン画像をデザイン

PNG形式（透過推奨）で以下のツールを使って作成します：

- Illustrator / Photoshop
- Figma
- Iconfinder / Flaticon などのアイコン素材サイト

などPNG出力できるならなんでもOK

### 2. `.ico` に変換する

#### オンラインツール
https://mjeld.com/makefavicon/

#### オフラインアプリ
https://apps.microsoft.com/store/detail/9PHML8RX0KF2?cid=DevShareMCLPCS

**Windowsアプリ向けには以下のサイズを含めると安心：**

- 16×16
- 32×32
- 48×48
- 64×64
- 128×128
- 256×256

---

## Windowsアプリでアイコンを設定する手順（Visual Studio）

1. `.ico` ファイルを作成
2. Visual Studio でプロジェクトを開く
3. プロパティ → 「アプリケーション」タブを開く
4. 「アイコンとマニフェスト」欄の「アイコン」で `.ico` を指定
5. ビルドして `.exe` ファイルのアイコンを確認

---

## Webサイト用 favicon の設定方法

### 1. サイトのルートに `favicon.ico` を配置（旧方式）
### 2. htmlのheadタグに埋める
icoの場合
```html
<link rel="icon" href="favicon.ico" type="image/x-icon">
```
PNGの場合
```html
<link rel="icon" type="image/png" sizes="32x32" href="images/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="images/favicon-16x16.png">
<link rel="icon" href="/icons/favicon.png" type="image/png">
```
### 3. Appleデバイス対応（iOSホーム画面アイコンなど）
```haml
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
```

---

| 用途              | 推奨形式              | サイズ      | 配置方法                        |
| --------------- | ----------------- | -------- | --------------------------- |
| Windowsアプリのアイコン | `.ico`（多サイズ）      | 16〜256px | EXEに埋め込み                    |
| Webサイトのファビコン    | `.ico` または `.png` | 16〜64px  | `<link rel="icon">` タグなどで指定 |
Linucレベル１勉強メモ　＃５０

# 第五章　ハードウェア、ディスク、パーティション、ファイルシステム

練習問題5.4
マウントしているファイルシステムをアンマウントするコマンド名を記述してください。

＿＿＿＿＿＿＿＿

（解答）umount

（解説）
「unmount」と間違えないように。
「unmount」というコマンドはありません。

書式 umount [オプション]
    umount [オプション] デバイス名またはマウントポイント

umountコマンドの主なオプション
* a<br>/etc/mtabに記述されているファイルシステムをすべてアンマウントする。
* -t ファイルシステム名<br>指定した種類のファイルシステムだけをアンマウントする。
Photo Pickerの使い方を改めて整理する（Kotlin + ActivityResult対応）

# はじめに

Androidアプリで画像や動画を扱う機能は非常に一般的ですが、ストレージ権限の取り扱いには常に注意が必要でした。  
特にAndroid 10以降はストレージアクセスに関する制限が厳しくなり、ユーザーのプライバシーを守りつつ、快適なメディア選択体験をどう提供するかが開発者の課題となっています。

そんな中登場したのが **Photo Picker** です。  
これはシステムが提供する共通のUIを使って、ユーザーに安全かつ直感的に画像や動画を選ばせることができる仕組みで、端末内メディアだけでなく、Googleフォトなどのクラウドサービスとも連携可能になっています。

さらに、**アプリにストレージの権限を与える必要がない** という点でも、非常に優れた設計となっており、今後のメディア選択の標準になる存在です。

そこでこの記事では、Photo Pickerの基本的な考え方と導入方法を、Kotlinコード付きでご紹介します。

## Photo Pickerとは？

Photo Pickerは、ユーザーが画像や動画を選択するための **システム提供のUI** です。  
従来のように `READ_EXTERNAL_STORAGE` 権限を使わずに、必要なメディアだけにアクセスできます。

## 主なメリット

- **クラウド連携**：Googleフォト上の画像にもアクセス可能
- **権限不要**：ストレージアクセス権限をリクエストしなくてOK
- **統一UI**：OS提供のUIで端末ごとの違いを吸収

## 導入方法（Kotlin + Jetpack Activity Result API）

### 1. 依存関係の追加（必要に応じて）

```groovy
// Photo Picker は AndroidX Activity に含まれています
implementation "androidx.activity:activity-ktx:1.7.0"
```

---

### 2. Media Pickerのコントラクトを定義

```sample.kt
private val pickMedia =
    registerForActivityResult(PickVisualMedia()) { uri ->
        if (uri != null) {
            imageView.setImageURI(uri)
        } else {
            Log.d("PhotoPicker", "画像が選択されませんでした")
        }
    }
```

---

### 3. 実行トリガー

```sample.kt
button.setOnClickListener {
    pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
}
```

## 注意点

- **クラウド画像は非同期取得** になることがあるため、ローディング表示を考慮すると◎
- 古い端末では `ACTION_PICK` や SAF（ストレージアクセスフレームワーク）との使い分けが必要
- 複数選択や動画の選択には以下のようなリクエストも可能

```kotlin
PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.VideoOnly)
```

## まとめ

Photo Pickerを活用することで、**安全かつ直感的な画像選択機能**をユーザーに提供できます。  
クラウド連携や権限削減が当たり前になりつつある今、積極的に取り入れていくのがオススメです。
技術選定に関する読み物まとめ

## 技術選定に関する読み物のまとめ
https://speakerdeck.com/nnaka2992/detabesunoji-shu-xuan-ding-wotu-kijie-meru-fu-shu-shi-li-karakao-eruzui-shi-nadetabesunoxuan-bifang

https://speakerdeck.com/morookacube/dbttoribasuetldedetalian-xi-nofu-za-sanili-tixiang-kau

https://speakerdeck.com/okaru/ji-shu-xuan-ding-wotu-kijie-meru-ken-qin-hui-lt

https://speakerdeck.com/yo4raw/ren-jian-xing-wo

https://speakerdeck.com/genax/gen-ax-20250514kai-cui-findyonrainibento-ji-shu-xuan-ding-wotu-kijie-meru?slide=3

https://speakerdeck.com/shinnosuke0522/fei-tong-qi-lian-xi-notameno-metusezingusabisuwokao-eru

https://speakerdeck.com/tomohisa/aikodeingunoli-xiang-toxian-shi?slide=24

https://speakerdeck.com/pei0804/selecting-the-right-data-technology

https://speakerdeck.com/moznion/from-grounded-tech-choices-to-magical-ux-a-case-study-of-ai-receipt-scanning

https://buildersbox.corp-sansan.com/entry/2020/08/21/110000

https://qiita.com/hirokidaichi/items/a746062917595619720b
【Rails】[モジュール名]_support.rbについて

# 記事概要
Ruby on Railsのサポートモジュール用ファイルについて、まとめる

# 前提
- Ruby on Railsでアプリケーションを作成している
- アプリにRSpecをインストールしている
- RSpecの設定が完了している

# 基本情報
## ファイルパス
spec/support/[モジュール名]_support.rb

# 手順(テストコード記述)
1. どのような処理かわかるように、モジュール名を命名する([モジュール名]Suppoort)
    ```sign_in_support.rb
    module SignInSupport
    end
    ```
1. モジュール名で、クラスを作成(モジュール名はキャメル形式、メソッド名スネーク形式)
    ```sign_in_support.rb
    module SignInSupport
      def sign_in(user)
      end
    end
    ```
1. 繰り返し処理を記述
    ```sign_in_support.rb
    module SignInSupport
      def sign_in(user)
        visit new_user_session_path
        fill_in 'Email', with: user.email
        fill_in 'Password', with: user.password
        find('input[name="commit"]').click
        expect(page).to have_current_path(root_path)
      end
    end
    ```

# サポートモジュール
https://qiita.com/likapantrip/items/e1e8630d06d205fb4528
【Rails】サポートモジュール

# 記事概要
Ruby on Railsのテストで使用するサポートモジュールについて、まとめる

# 前提
- Ruby on Railsでアプリケーションを作成している
- アプリにRSpecをインストールしている
- RSpecの設定が完了している

# サポートモジュール
RSpecに用意されている、メソッド等をまとめる機能

# 手順(サポートモジュール用ファイル作成)
1. `spec`ディレクトリ配下に、`support`フォルダを作成する
1. 上記フォルダに、`[モジュール名]_support.rb`を作成する

# 手順(設定変更)
1. `spec/rails_helper.rb`を開く
1. `Rails.root.glob('spec/support/**/*.rb').sort_by(&:to_s).each { |f| require f }`という記述のコメントアウトを外し、ファイルを読み込めるようにする
    ```rails_helper.rb
    # require only the support files necessary.
    #
    Rails.root.glob('spec/support/**/*.rb').sort_by(&:to_s).each { |f| require f }
    ```
1. `RSpec.configure`の中に、モジュール名を明記する
    ```rails_helper.rb
    # 省略
    
    RSpec.configure do |config|
      # SignInSupportモジュールを追加
      config.include SignInSupport
      # 省略
    end
    ```

# 手順(テストコードの置換)
1. [[モジュール名]_support.rb](https://qiita.com/likapantrip/items/58a57345ad8f859722ba)に、共通処理部分のテストコードを記述する
1. テストファイルのコードを置換する
    1. 1.で切り出したコードを削除する
    1. 2-1.でコードを削除した箇所に、サポートモジュールのメソッドを記述する
        ```ruby
        # ログインする
        
        # 2-1で削除 visit new_user_session_path
        # 2-1で削除 fill_in 'Email', with: user.email
        # 2-1で削除 fill_in 'Password', with: user.password
        # 2-1で削除 find('input[name="commit"]').click
        # 2-1で削除 expect(page).to have_current_path(root_path)
        sign_in(@user)
        ```

# RSpec
https://qiita.com/likapantrip/items/5bff444bf5edfe4f1436
Linucレベル１勉強メモ　＃４９

# 第五章　ハードウェア、ディスク、パーティション、ファイルシステム

練習問題5.3
mountコマンドを使って、DVD-ROMドライブを/media/dvdromにマウントしようとしています。DVD-ROMドライブは、/dev/sr0として認識されています。/etc/fstabファイルには、このデバイスに関する記述がありません。mountコマンドにどのようなオプション、引数を指定すれば良いか記述してください。なお、ファイルシステムタイプ(udf)も明示的に指定してください。

＃ mount _____________

（解答）-t udf /dev/sr0 /media/dvdrom

（解説）
/etc/fstabファイルにDVD-ROMデバイスに関する記述がある場合は「mount/dev/sr0」もしくは「mount /media/dvdrom」だけでもマウントできます。記述がない場合は、デバイス名、マウントポイント、オプションを指定する必要があります。
デバイス名：dev/sr0
マウントポイント：media/dvdrom
オプション：-t
EBAZ4205 FPGA Xilinx編 第2版　演習2-3

# PC用ディスプレイにパターンを表示
以下にアップしています。。。
- https://github.com/ShigeoYakuno/EBAZ4205

## 3bit　RGBのカラーパレットで色を8種の表現
3'b000 → 黒 (0,0,0)  
3'b001 → 青 (0,0,255)  
3'b010 → 緑 (0,255,0)  
3'b011 → シアン (0,255,255)  
3'b100 → 赤 (255,0,0)  
3'b101 → マゼンタ (255,0,255)  
3'b110 → 黄 (255,255,0)  
3'b111 → 白 (255,255,255)

## 全体の動作まとめ
次のような流れで動作している:

1. pckgen が 25.175 MHz のピクセルクロックを生成
2. syncgen がこのクロックを基に VGAタイミング（水平/垂直カウンタと同期信号）を生成
3. pattern がカウンタ値に応じた RGB パターンを生成（縦ストライプ＋上下で反転）
4. HDMI 用の rgb2dvi IP に信号を渡し、HDMI 出力として信号を生成
5. ディスプレイにパターンが表示される

## 表示されるパターンについて
- 水平方向に 8 段階（80ピクセルごと）で色が変化
- 奇数行と偶数行でカラー順序が反転（アップカウント・ダウンカウント切り替え）
- 色の表現：rgb_1 は3ビット値で、各ビットがそれぞれRGBのON/OFFに対応
- 例: 3'b101 → 赤と青が最大輝度 → 紫

## ソース解説

### pattern_hdmi (トップモジュール)
- 機能:HDMI出力付きのパターン表示システムの最上位モジュール。
- 構成:pattern モジュールでRGBデータと同期信号を生成
- rgb2dvi モジュール (HDMI変換IP) によりRGB信号をTMDS (HDMI) 信号に変換


### pattern (パターン生成モジュール)
- 機能:VGA規格（640x480）の解像度で、縦縞模様を上下交互に反転させたパターンを生成
- 内部構成:syncgen モジュール: 垂直/水平同期信号とピクセルクロックを生成
- VGA画面表示領域内 (disp_enable) で、HCNT(水平位置) に基づいてカラーが変化するストライプ模様を生成
- 垂直位置 (VCNT) に応じて奇数/偶数行ごとにカラーの並び順を反転

### pckgen (ピクセルクロック生成モジュール)
- 機能:125 MHz のシステムクロックから VGA 用の 25.175 MHz ピクセルクロックを生成。
- 実装:Xilinx FPGA の MMCME2_BASE IPコアを使用

### syncgen (同期信号生成モジュール)
- 機能1: VGAのタイミングに従い、水平/垂直カウンタを制御し、同期信号を生成
- 機能2: pckgen を使用して PCK を得る

### vga_param.vh (パラメータファイル)
- 内容:VGA 640x480（60Hz）のタイミングパラメータ定義
- 水平 総周期: 800クロック 表示期間: 約640クロック (計算より)
- 垂直 総周期: 525ライン 表示期間: 約480ライン

## EBAZ4205での変更点

- pckgen.vのみ変更
- CLKINの周期を実際のクロックに合わせる

~~~verilog
   MMCME2_BASE #(
      .BANDWIDTH("OPTIMIZED"),  // Jitter programming (OPTIMIZED, HIGH, LOW)
      .CLKFBOUT_MULT_F(36.0),   // 乗数M(2.000-64.000)
      .CLKFBOUT_PHASE(0.0),     // 位相(-360.000-360.000)
      .CLKIN1_PERIOD(20.0),     // CLKINの周期 @yaku 20.0
      // CLKOUT0_DIVIDE - CLKOUT6_DIVIDE: Divide amount for each CLKOUT (1-128)
      .CLKOUT1_DIVIDE(1),
      .CLKOUT2_DIVIDE(1),
      .CLKOUT3_DIVIDE(1),
      .CLKOUT4_DIVIDE(1),
      .CLKOUT5_DIVIDE(1),
      .CLKOUT6_DIVIDE(1),
      .CLKOUT0_DIVIDE_F(35.75),  // 除数Q(1.000-128.000)
      // CLKOUT0_DUTY_CYCLE - CLKOUT6_DUTY_CYCLE: Duty cycle for each CLKOUT (0.01-0.99).
      .CLKOUT0_DUTY_CYCLE(0.5), // デューティ比
      .CLKOUT1_DUTY_CYCLE(0.5),
      .CLKOUT2_DUTY_CYCLE(0.5),
      .CLKOUT3_DUTY_CYCLE(0.5),
      .CLKOUT4_DUTY_CYCLE(0.5),
      .CLKOUT5_DUTY_CYCLE(0.5),
      .CLKOUT6_DUTY_CYCLE(0.5),
      // CLKOUT0_PHASE - CLKOUT6_PHASE: Phase offset for each CLKOUT (-360.000-360.000).
      .CLKOUT0_PHASE(0.0),
      .CLKOUT1_PHASE(0.0),
      .CLKOUT2_PHASE(0.0),
      .CLKOUT3_PHASE(0.0),
      .CLKOUT4_PHASE(0.0),
      .CLKOUT5_PHASE(0.0),
      .CLKOUT6_PHASE(0.0),
      .CLKOUT4_CASCADE("FALSE"), // Cascade CLKOUT4 counter with CLKOUT6 (FALSE, TRUE)
      .DIVCLK_DIVIDE(2),         // 除数D(1-106)  @yaku 2
      .REF_JITTER1(0.0),         // Reference input jitter in UI (0.000-0.999).
      .STARTUP_WAIT("FALSE")     // Delays DONE until MMCM is locked (FALSE, TRUE)
   )
~~~


## 課題の画像

![IMG_1842.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657924/67e17663-6a63-4fb3-99e0-0367f666a8f7.jpeg)

### 今日はここまで
IPA(データベーススペシャリスト他)の過去問をコマンド一つでダウンロードする

## 経緯
データベーススペシャリストの試験対策で公式過去問をダウンロードしたいと思ったが一つ一つ行うのがめんどくさいと思いCHAT GPTに一括でダウンロードしてもらうコードを作成してもらった。(午前Ⅰ以外)

## 使い方(令和6年度の過去問をダウンロードする場合)
* 環境
PC：Windows
ブラウザ：Chrome

* IPAの令和6年度の過去問ページを開く
https://www.ipa.go.jp/shiken/mondai-kaiotu/2024r06.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670485/7306d71a-82b2-4f38-8f33-c17dd6a58fe6.png)


* F12 → 「Console」タブを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670485/3d57f88e-7761-4dc4-be07-7600672316de.png)


* 下記コードを貼り付けて Enter
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670485/f517e417-7b15-492a-a891-82e215c4658f.png)

```
(async () => {
  // JSZip をCDNから読み込む
  const script = document.createElement('script');
  script.src = 'https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js';
  document.head.appendChild(script);

  script.onload = async () => {
    const zip = new JSZip();
    const folderName = prompt("保存するフォルダ名を入力してください", "DB_PDFs");
    const folder = zip.folder(folderName || "DB_PDFs");

    // DB関連PDFリンクを取得
    const links = Array.from(document.querySelectorAll('a[href$=".pdf"]'));
    const dbLinks = links.filter(link => {
      const url = link.href;
      const fileName = url.split('/').pop().toLowerCase();
      return fileName.includes('_db_');
    });

    // 各PDFを取得してZIPに追加
    for (const link of dbLinks) {
      const url = link.href;
      const fileName = url.split('/').pop();
      const response = await fetch(url);
      const blob = await response.blob();
      const arrayBuffer = await blob.arrayBuffer();
      folder.file(fileName, arrayBuffer);
    }

    // ZIPを生成して保存
    const content = await zip.generateAsync({ type: "blob" });
    const a = document.createElement('a');
    a.href = URL.createObjectURL(content);
    a.download = `${folderName || "DB_PDFs"}.zip`;
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
  };
})();
```

* フォルダ名を入力するプロンプトが表示されるので、好きな名前を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670485/6793c788-cc25-4aad-ad94-4c0bbbaea2e9.png)

* _db_を含むPDFファイルが ZIP にまとめられ、指定フォルダ名でダウンロードされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670485/b6d026fc-d0cd-4b18-a0b4-90a9265c919a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670485/8fe927ce-a990-4dad-9d99-4b87d5fa9b37.png)

## 注意点
* 何回も実行するとサーバーに負荷がかかるため実施するのは最低限にしましょう

## 応用
* 今回はデータベーススペシャリストをダウンロードしましたが以下の部分を変更すると他の試験も可能です

変更前
データベーススペシャリスト試験（DB）
```
return fileName.includes('_db_');
```

応用情報技術者試験（AP）
```
return fileName.includes('_ap_');
```

情報処理安全確保支援士試験（SC）
```
return fileName.includes('_sc_');
```

プロジェクトマネージャ試験（PM）
```
return fileName.includes('a_pm_');
```

システム監査技術者試験（AU）
```
return fileName.includes('_au_');
```

エンベデッドシステムスペシャリスト試験（ES）
```
return fileName.includes('_es_');
```

ITストラテジスト試験（ST）
```
return fileName.includes('_st_');
```

ネットワークスペシャリスト試験（NW）
```
return fileName.includes('_nw_');
```

ITサービスマネージャ試験（SM）
```
return fileName.includes('_sm_');
```


## 最後に
CHAT GPTはやっぱりすごい
ODBC_FDWでPostgreSQLからSQLServerに接続する

# 概要
PostgreSQLの拡張機能odbc_fdwを使用し、
PostgreSQLからSQL Server上のテーブルを直接参照する方法について記述する。

## 経緯
メインのDBとしてPostgreSQLを使用していたが、別用途で使用しているSQL ServerのデータをPostgreSQLに連携する必要が出てきた。
このためにpythonやjavascriptを書くのがめんどくさかったので最近知った本機能を試した。

## 検証環境
OS: Windows11
PostgreSQL: 10.6
SQL Server: SQL Server2022 16.0.1000.6 NT

## 手順
1. PostgreSQLのバージョンを確認し、対応するodbc_fdwのパッケージを取得する。
	バージョンを確認 `psql -V`
	下記URLから対応パッケージを取得
	https://www.postgresonline.com/winextensions.php

2. odbc_fdwをインストールする。
	パッケージに含まれる libやbinフォルダをPostgreSQLの同フォルダにコピーする。
	
3. SQL ServerのODBCを作成する。
	Windowsシステム検索からODBC データソースを起動する。
	システムDSNタブで追加を押下する。
	データソースドライバー: `SQL Server` を選択する。
	任意の名前、説明を入力、サーバーにはSQL Serverのホストを入力する。
	SQL Serverのログイン方法を`ユーザーが入力するSQL Server用のログインIDとパスワードを使う`に設定する。
	疎通テスト用にログインID、パスワードを入力し 次へ。
	その後の項目は変更せずデータソースのテストの画面まで進む。
	テストは無事に完了しました。のダイアログが出れば成功。
	
4. odbc_fdwを有効化する。
	PostgreSQLコンソールに入る。
	`psql -U xxx`
	有効化
	`create extension odbc_fdw;`
	拡張機能確認
	`\dx`

5. 外部サーバを作成する。
	`create server {作成したODBC名} foreign data wrapper odbc_fdw options(dsn '{作成したODBC名}');`

	参照先に日本語を含むレコードが存在する場合、オプションにエンコードを追加する。
	`options(dsn '{作成したODBC名}', encode 'sjis')`

	確認
	`\des`

6. ユーザーマッピングを作成する。
	`create user mapping for postgres server {外部サーバ名} options (odbc_UID '{ODBC作成で入力したログインID}', odbc_PWD '{ODBC作成で入力したパスワード}');`

7. 外部テーブルを作成する。
	`create foreign table {テーブル名}({カラム名} {型}, ...) server {外部サーバ名} options (schema '{参照先schema名}', table '参照先テーブル名');`

	型はPostgreSQLで使用可能な型にすること。

## 参考
[PostgreSQLでODBC_FDWを使ってSQL Serverを参照する方法(pgAdmin4)](https://www.saimonn.net/postgresql%E3%81%A7odbc_fdw%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6sql-server%E3%82%92%E5%8F%82%E7%85%A7%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95pgadmin4/)
[PostgreSQL 10.5文書 付録F 追加で提供されるモジュール](https://www.postgresql.jp/docs/9.4/postgres-fdw.html)
聞いたことはあるけど触ったことはなかったGit

# はじめに
GitやGithubは聞いたことあるけど触ったことがありませんでした。エンジニア転職する上で必要不可欠だと思ったので、このままではいけないと思い、学習を始めました！

# そもそもGitってなに？
Gitとは、コードの変更履歴を管理するバージョン管理システムです。チーム開発や、過去の状態に戻したりできます。

# 使用頻度が高そうなGitコマンド

| コマンド                         | 説明                             |
|----------------------------------|----------------------------------|
| `git init`                       | Gitリポジトリを作る              |
| `git add <file>`                | ファイルをステージングする       |
| `git commit -m "コメント"`       | コミット（変更を記録）する       |
| `git push origin main`          | GitHubにpush（アップロード）する |
| `git pull origin main`          | GitHubからpull（取得）する       |
| `git status`                    | 現在の状態を確認する             |
| `git log`                       | コミット履歴を見る               |

# さいごに
GitやGithubを初めて触ってみて、まだしたことはないですがチーム開発などでは頻繁に使われる理由がわかりました。
まだ理解度は全然浅いので継続してGitの学習も進めたいと思います！
VagrantからUbuntu 24.04 ARM + Docker 環境構築（Apple Silicon）

# はじめに

Vagrant で VirtualBox 上に、Ubuntu 24.04 ARM + Docker の環境構築を一撃で行います。
Apple Silicon（Mシリーズ Mac）では、x86版だと動かないので ARM 版のUbuntuを使います。

実行ファイルの構成はシンプルで、`Vagrantfile` で VirtualBox 上に Ubuntu 24.04 ARM 環境を構築する。
`Vagrantfile` の中で、Ubuntu の初期設定と Docker のセットアップを行う `provision.sh` を呼び出して実行する流れです。

## 構成

```
.
├── Vagrantfile　 ※ VirtualBox 上に Ubuntu をプロビジョニング
└── provision.sh　※ Ubuntu の初期設定と Docker のインストール＆セットアップ
```

## 実行環境

```
•	Mac（Apple Silicon）
•	VirtualBox : 7.1.6
•	Vagrant : 2.4.3
```

# 手順

Vagrant と VirturalBox の導入手順は記載していませんので、ご了承ください。
今回紹介する Vagrant の資産は、Github に置いているので、`git clone`して使ってもらっても構いません。

https://github.com/y-omr/vagrant-ubuntu/blob/main/README.md

---

## 1. `Vagrantfile`の作成
`vagrant init`コマンドで作成してから、修正してもいいと思いますが
普通にファイル作成してもOKです。

```bash:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  # Ubuntu 24.04（ARM）
  config.vm.box = "bento/ubuntu-24.04"
  config.vm.hostname = "ubuntu-arm64"
  config.vm.network "private_network", ip: "192.168.2.99"

  # 仮想マシンのリソース設定
  config.vm.provider "virtualbox" do |vb|
    vb.name = "ubuntu-vm"
    vb.memory = "2048"
    vb.cpus = 2
  end

  # ホストとゲスト間のフォルダ同期設定（任意）
  config.vm.synced_folder ".", "/vagrant", type: "virtualbox"
  
  # プロビジョニングスクリプトの指定
  config.vm.provision "shell", path: "provision.sh"
end
```

ホスト名やポートフォワード、IPとかは、環境や好みに応じてお好きに変更してください。

## 2. `provision.sh`の作成

```bash:provision.sh
#!/bin/bash

# パッケージの更新
sudo apt-get update
sudo apt-get upgrade -y

# ロケールの変更
sudo apt install -y language-pack-ja
sudo update-locale LANG=ja_JP.UTF-8

# タイムゾーンの変更
sudo timedatectl set-timezone Asia/Tokyo

# Dockerセットアップ
sudo apt-get install -y curl
curl https://get.docker.com | sudo sh

# Docker サービスの起動と自動起動設定
sudo systemctl start docker
sudo systemctl enable docker

# vagrant ユーザーを docker グループに追加
sudo usermod -aG docker vagrant
```

root の権限設定や、FWのポート設定などを組み込みたい場合は、このスクリプト内に追記するといいと思います。

## 3. Ubuntu のプロビジョニング

`Vagrantfile`があるディレクトリで、以下のコマンドを実行する。

```
vagrant up
```
初回は実行完了するまで数分かかるので、コーヒーブレイクすると丁度いいです。


## 4. 接続確認

Ubuntuのプロビジョニングが終わったら、以下のコマンドでSSH接続できます。

```
vangrant ssh
```

## その他コマンド

VM の動作確認コマンド

```
vagrant status
```

VM の停止コマンド

```
vagrant halt
```

VM の削除コマンド

```
vagrant destroy
```

# さいごに

今回は、Vagrant 使ってVMとして Ubuntu を構築して、Docker をインストールしました。
ただ Docker を使いたいだけなら、DockerDesktop でローカルに環境構築する方が手っ取り早くて楽です。

他には、`provision.sh`ではなく **Ansible** とかで Ubuntu と Docker の設定をしてもいいと思います。
pythonのlistを重複削除してソートするならsorted(set(list))がいいですよ

# pythonのlistを重複削除してソートする
````python
a = [3, 1, 2, 2, 3]
````

これを

````python
b = [1, 2, 3]
````
こうしたい。

# 解法
````python
b = sorted(set(a))
````

# list(set(a)).sort()はNoneを返す
listをソートするにはsortedの他にsortというのもあります。それを使ってlist(set(a)).sort()と書いてみるとうまく動かなかったという話です。

ChatGPTに理由を聞いてみたんですがよくわかりません。ChatGPT曰く、

>list(set(a)).sort() が None を返す理由は、
>list(set(a)) が 一時的に作られたリストであり、
>そのリストに対して .sort() を インプレース（その場）で実行し、
>戻り値は常に None だからです。

どうしてもsortを使いたいときは以下のようにすると良いです。
````python
b = list(set(a))
b.sort()
````
【自然言語処理データサイエンティスト2年目】参考にしている記事リスト

私物のパソコンで使っているGoogleアカウントで会社のパソコンにログインしようとしたらブロックされたため、どこからでもアクセスできるようQiitaにひたすら載せていきます。

[精度向上のために機械学習プロダクト全体をフルスクラッチで書き直した話](https://yag-ays.github.io/article/refactor-them-all/)
この記事を見つけた当時、私は社内でユーザロイヤルティ向上を目的とした検索ワードの分類プロジェクトを立ち上げてクライアント提案・研究開発を同時並行で進めていたので、そんな自分に気合を教えてくれた記事でした。

[reco(gaijineersさんが立ち上げた人材会社)](https://app.reco.sh/)
AndroidStudio 作業スペースを広げるために、ツールバーを小さく表示する設定

開発を行う上で、作業スペースを広くする方法です。
ツールバーを小さく表示することができます。

設定方法です。
Settings > Appearance & Behavior > Appearance > UI Options

Compact modeにチェックを入れると設定することができます。


![スクリーンショット 2025-05-18 16.14.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/4f2a2ecb-8452-453d-8880-f8b340f7e232.png)

こちらで上下左右のツールバーのサイズが小さくなります。

ノートPCなど小さい画面の時など便利だと思います。