OmniAICreator/Qiita-1.07M huggingface dataset:
Rust版CoreutilsがGNUを上回る性能を実現！「uutils 0.1」リリース

LinuxやmacOSで日常的に使っている `ls`、`cat`、`wc` などのコマンドは「Coreutils」と呼ばれるパッケージに含まれており、従来はC言語で書かれたGNU Coreutilsが標準でした。

しかし今、RustでゼロからCore toolsを書き直した「uutils」プロジェクトが大きな転換点を迎えています。2025年1月にリリースされたuutils 0.1では、ついにGNU Coreutilsに匹敵、場合によってはそれを上回る性能を実現しました。さらに、Ubuntu 25.10でuutilsをデフォルトで採用する計画が発表され、大手ディストリビューションにおけるRustの採用が現実味を帯びてきています。

## uutilsとは何か？

uutilsは、GNU Coreutilsの完全なRust実装です。2013年にJordi Boggianoによって始められたこのプロジェクトは、UNIXライクシステムで必要不可欠なコマンドラインツールをRustで再実装することを目標としています。

GNU Coreutilsには以下のようなコマンドが含まれています：

- ファイル操作：`ls`、`cp`、`mv`、`rm`、`mkdir`など
- テキスト処理：`cat`、`wc`、`sort`、`grep`など
- システム情報：`date`、`whoami`、`uname`など

uutilsプロジェクトでは、これらすべてのコマンドをRustで再実装し、完全な互換性を保ちながら、Rustのメモリ安全性と性能の恩恵を受けることを目指しています。

## uutils 0.1の成果

### 性能の大幅向上

uutils 0.1の最も注目すべき成果は、多くのコマンドでGNU Coreutilsと同等以上の性能を実現したことです。具体的には以下のコマンドで顕著な改善が見られます：

- `cat`：ファイル内容の表示
- `ls`：ディレクトリ一覧の表示
- `wc`：行数・文字数・バイト数の計算
- `tail`：ファイル末尾の表示
- `seq`：数値シーケンスの生成

これらの性能向上は、Rustの効率的なメモリ管理と並行処理能力によるものです。特に大きなファイルを扱う場面や、スクリプトで同じコマンドを大量に実行する場面では、その差が顕著に現れます。

### SELinuxサポートの追加

セキュリティ面でも大きな進歩がありました。uutils 0.1では、以下のコマンドでSELinux統合が実現されています：

- `cp`、`ls`、`mkdir`、`mknod`、`mkfifo`、`install`、`stat`

この改善により、企業環境やセキュリティが重視される環境でもuutilsを安心して採用できるようになりました。

### GNU互換性の向上

![](https://www.phoronix.net/image.php?id=2025&image=rust_coreutils_01)

uutils 0.1では、GNU Test Suiteの522のテストに合格しており、前バージョンの507テストから改善されています。完全な互換性にはまだ距離がありますが、実用的なレベルでの互換性は十分に確保されています。

興味深いことに、失敗しているテストの多くは、非常に特殊な使用ケースや、GNU固有の動作に関するものです。日常的な使用において問題になることはほとんどありません。

## Ubuntuの「酸化」戦略

uutilsの採用を後押ししているのが、Ubuntuの新しい戦略です。Ubuntu開発チームは「Carefully But Purposefully Oxidising Ubuntu（慎重かつ意図的なUbuntuの酸化）」というテーマの下、システムの重要なコンポーネントをRustで書き直す取り組みを進めています。

この戦略では、以下の理由からRustの採用を推進しています：

1. **メモリ安全性**：バッファオーバーフローなどの脆弱性を根本的に防止
2. **保守性**：現代的な言語設計により、長期的な保守が容易
3. **性能**：C言語と同等以上の性能を実現

Ubuntu 25.10でのuutils採用は、この戦略の重要な一歩となります。

## 開発体制の活発化

uutils 0.1のリリースでは、もう一つ注目すべき点があります。それは開発体制の大幅な強化です：

- **843のコミット**が含まれる
- **60人以上の貢献者**が参加
- そのうち**40人が新規参加者**

この活発な開発体制は、Ubuntuでの採用発表の影響もあると考えられます。プロジェクトの将来性と実用性が認知されることで、より多くの開発者が参加するようになっています。

## 技術的な課題と今後の展望

### 残る課題

uutilsが完全にGNU Coreutilsを置き換えるためには、まだいくつかの課題があります：

1. **互換性の完全達成**：残る100以上のテストケースへの対応
2. **ロケールサポート**：国際化対応の強化
3. **プラットフォームサポート**：より幅広いプラットフォームでの動作確認

## まとめ

uutils 0.1のリリースは、Rustエコシステムにとって重要なマイルストーンです。性能面でGNU Coreutilsに匹敵する成果を上げ、Ubuntuでの採用が計画されています。

まだ完全な置き換えには時間がかかりますが、メモリ安全性、性能、保守性の観点から、uutilsの将来性は非常に明るいと言えるでしょう。特に、新しいプロジェクトや個人の開発環境では、積極的に試してみる価値があります。

## 参考リンク

- [uutils/coreutils GitHub リポジトリ](https://github.com/uutils/coreutils)
- [uutils 0.1.0 リリースノート](https://github.com/uutils/coreutils/releases/tag/0.1.0)
- [Ubuntu の酸化戦略について](https://discourse.ubuntu.com/t/carefully-but-purposefully-oxidising-ubuntu/56995)
- [プロジェクト拡大に関するブログ記事](https://uutils.github.io/blog/2025-02-extending/)
AlmaLinuxで構築するWeb3層構造：Webサーバ編(Apache httpdの導入と設定)

## １．はじめに
前回は仮想環境を構築しました。今回はWebサーバ（httpd）のインストールと基本的な設定を行います。
Apacheは最も広く利用されているWebサーバソフトウェアで、HTMLファイルの配信やリバースプロキシなど多用途に使えます。

## ２．環境構成と前提
| ホスト名 | 役割 | IPアドレス |
|---------|--------|--------|
| webserver | Webサーバ | 192.168.56.10 |
| apserver | APサーバ | 192.168.56.20 |
| dbserver | DBサーバ | 192.168.56.30 |

※ AlmaLinux 9.x 、SELinux無効の状態を前提とします。

## ３．名前解決設定
### 3-1.DNS参照順設定（/etc/nsswitch.conf）
/etc/nsswitch.confファイルを編集し、名前解決の参照順を調整します。
| パラメータ | 設定値 |
|---|------|
|passwd: | files |
|shadow: | files |
| group: | files |
| hosts: | files dns myhostname |
| services: | files |
| netgroup: | files |
| automount: | files |

hostsはfiles dns myhostnameの順にして、まず/etc/hostsを優先します。

### 3-2./etc/hostsに固定IPとホスト名の紐付けを記述
以下のように記述し、名前解決を行います。
```bash
192.168.56.11  dbserver
192.168.56.12  apserver
192.168.56.13  webserver
```

## ４．ファイアウォール設定
HTTPアクセスを許可します。
```bash
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --reload
```

## ５．NTP設定（時刻同期）
/etc/chrony.confに以下を追記し、時刻の精度と安定性を確保します。
```bash
server ntp.nict.jp iburst
server ntp1.jst.mfeed.ad.jp iburst
server time.google.com iburst
allow 192.168.56.0/24
```

## ６．Webサーバ構築
### 5-1.Apacheインストール・起動
```bash
dnf install httpd -y
systemctl start httpd
systemctl enable httpd
```

### 5-2.動作確認用のHTMLの設置
```bash
echo "Hello,World" > /var/www/html/index.html
```
### ブラウザで確認
以下にアクセスして、Hello, Worldが表示されれば成功です。
```bash
http://<WebサーバのIPアドレス>/index.html
```

## まとめ
Apache httpdの導入と設定が完了し、Webページの表示確認もできました。
次回はAPサーバであるTomcatを導入し、JSPページの実行環境を構築します。

本記事は「AlmaLinuxで構築するWeb3層構造」シリーズの第2弾です。
前回までの内容はこちらからどうぞ：
- 第1回：仮想環境とAlmaLinux構築
- 第3回：APサーバ（Tomcat）構築
- 第4回：DBサーバ（MySQL + sakila）構築
- 第5回：Web/AP/DB連携編
プリザンターの選択肢でラジオボタンを読取専用で使う方法

## はじめに
プリザンターの分類項目で使用可能な「選択肢一覧」。標準機能ではドロップダウンリスト、ラジオボタン、モーダル(検索画面)の3パターンが使用可能です。選択肢を有効にした状態で読取専用とすることも可能なのですが、ラジオボタンで読取専用にするとラジオボタン表示ではなくなってしまうという欠点があります。今回はこれを改善してみます。

## 現状を見てみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3555395/c1f8bf7e-314b-423b-89a8-2ac4eb67f8f0.png)
分類009を読取専用、分類010を通常に設定してみました。分類009がラジオボタンでなくなってしまっています。

## 解決作を考えてみる
プリザンターではHTMLの組み立てをサーバ側でおこなっているため読取専用設定のままで、クライアント側だけでどうにかすることが出来ません。そのため、画面の表示モード毎に吐き出されるHTMLを制御しつつ、属性を書き換えることで実現してみます。

まずは、読取専用としたい項目のコントロールCSSに`readonly`を設定します。このときに読取専用チェックボックスはONにしてください。次に、サーバスクリプトを2つ作成します。
```js:条件:レコード読み取り時
if(context.Action !== 'edit'){
    columns.Class009.ReadOnly = false;//項目名は環境に応じて書き換えてください
}
```

```js:条件:画面表示の前
if(context.Action === 'edit') {
   context.AddResponse(
       'Attr',
       'input.readonly[type="radio"]',
       $ps.JSON.stringify({ Name: 'disabled', Value: '' })
    );
}
```

編集画面以外のページでは項目に設定した読取専用設定を使い、編集画面では読取専用設定を外してHTMLの属性を書き換えることで読取専用設定を実現しています。

## 実際に動きをみてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3555395/39d76b67-0ee7-4bd7-a859-6c1bdec6ecd5.png)
これを環境に適用してみると編集画面ではラジオボタンのままで読取専用とすることができました。

## まとめ
今回は選択肢一覧項目でラジオボタン使用時にラジオボタンのまま読取専用設定を実現する方法を紹介しました。項目ごとにサーバスクリプト・コントロールCSSの設定をおこなう必要があるので、少し手間ではありますがUI/UXを改善することが出来るので、是非試してみてください。
Python の sys.settrace() で関数呼び出しをトレース

Python で sys.settrace() で関数呼び出しをたどることができ、プログラムがどこまで実行されているかがわかる。

# プログラム例
```python
import sys

def trace(frame, event, arg):
    print("--")
    print(f"file={frame.f_code.co_filename}, func={frame.f_code.co_name}, lineno={frame.f_lineno}")
    print(f"event={event}")
    print(f"arg={arg}") # call では常に None

def func(a, b):
    return a / b

def main():
    try:
        func(2, 1)
        func(1, 0)
        func(1, 2)
    except Exception as e:
        pass

sys.settrace(trace)
if __name__ == '__main__':
    main()
```

# 実行結果
```text
--
file=/home/.../test.py, func=main, lineno=19
event=call
arg=None
--
file=/home/.../test.py, func=func, lineno=15
event=call
arg=None
--
file=/home/.../test.py, func=func, lineno=15
event=call
arg=None
```

# 参考
* [sys.settrace](https://docs.python.org/3/library/sys.html#sys.settrace)
GitHubにAPIキーなどの機密データを上げてしまった場合の対処方法

APIキーなどの機密情報をGitHubに上げてしまった場合の対処方法を検索すると、リポジトリの履歴書き換えツールとして、以下のコマンドを用いた解決方法が見つかりました。

- git-filter-branch (git標準ツール)
- git-filter-repo (別途インストール)
- BFG Repo-Cleaner (別途インストール)

## 結論
先に結論を書かせていただきますと、`git-filter-repo`を使うべきです。
理由は、git公式で推奨しているツールであり、他のツールと比較して処理が高速で柔軟性のある操作が可能なためです。
使用方法は、下記サイトを参照してください。それ以降に結論に至った理由を記載しています。
[git-filter-repo 使用方法(公式GitHubリポジトリ)](https://github.com/newren/git-filter-repo/)
[git-filter-repo 使用方法(GitHub Docs)](https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository#purging-a-file-from-your-local-repositorys-history-using-git-filter-repo)


## git-filter-branch(非推奨)
個人的には別途インストールする必要のない、git標準ツールである`git-filter-branch`を使用するのが、ベストだと思いましたが、下記git公式サイトの通り現在は非推奨のツールとなっており、代替ツールとして`git-filter-repo` の利用が推奨されていました。
補足：非推奨の理由や、それでも使いたい場合の説明、コマンド実行時のオプションなどが書かれているので、気になる方は参考にしてみてください。
[git-filter-branch ドキュメント](https://git-scm.com/docs/git-filter-branch#_warning)


## git-filter-repo(git公式が推奨)
git公式でも推奨していると記載しましたが、下記GitHubのサイトでも、リポジトリからの機密データの削除についてというドキュメントで、`git-filter-repo`を使用した方法が紹介されています。
[リポジトリからの機微なデータの削除](https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository)



## BFG Repo-Cleaner
`git-filter-branch`と比較すると、処理速度が速く簡単に使用することができるが、`git-filter-repo`と比較すると機能が限定的で柔軟性に欠けるとのことです。候補に挙げましたが、詳しく調査していません。
Tips: claude-code.nvimを使ってNeovimでClaude Codeを使いやすくする

## 初めに
最近Claude Opus 4, Claude Sonnet 4がリリースされました。

https://www.anthropic.com/news/claude-4

今までいわゆる「バイブコーディング」はVSCodeのClineを使うことが多かったのですが、これを機にClaude Codeを使い始めました。

普段エディタはNeovimを使っているので、
NeovimでClaude Codeを使いやすくするために行なったことをTipsとしてまとめます。

## Claude Codeについて
Claude Codeとは、ClaudeのLLMモデルを用いて自律コーディングを行えるようにするためのツールです。

https://docs.anthropic.com/ja/docs/claude-code/overview

こちらの記事もご参考ください。

https://qiita.com/syukan3/items/f3027b45ba26185addc7

## 前準備

前準備として、Claude Codeのセットアップを行ってください。

セットアップ手順は以下をご参考ください。

https://docs.anthropic.com/ja/docs/claude-code/getting-started

Claude Codeの利用には

- APIキーの利用
- Claude Maxプランへの加入

のどちらかが必要です。

Claude Maxプランを利用すると、Claude Codeが定額（rate limitあり）で利用可能なため、
ある程度の頻度で利用をする方はMaxプランへの加入をお勧めします。

## Neovimとの連携
Claude CodeはCLIツールのため、Neovimのターミナル上で立ち上げることも可能です。
ただ、僕はClaude Codeをターミナルとは分けて利用できるようにしたかったので、プラグインを利用することにしました。

https://github.com/greggh/claude-code.nvim

を利用することで、Neovim上からシームレスにClaude Codeの立ち上げを行うことができるようになります。

プラグインの設定は以下をご参考ください。

https://github.com/getty104/dotfiles/blob/056be9050a29a66597dd39b9e230b5ecc50258a0/nvim/lua/lazy-nvim/plugins.lua#L124


## 感想
根っからのNeovimユーザーのため、最近はAIエージェント開発ツールの登場によって

- AIによるコーディングはVSCodeを使用
- 手作業によるコードの修正はNeovimを使用

という、複数のエディタを使い分ける複雑な開発体験になっていました。
Claude Codeの利用によってNeovim上で全て完結できるようになり、かなり体験が良くなりました。
Claude CodeもClineでできることは大体できますし、Claude 4の登場によってアウトプットのクオリティもかなり良くなっている印象です。
単純な先入観で

- 複数行のプロンプトは打ち込みづらそう
- 画像などの添付が難しそう

と考えていたのですが、どちらも簡単にできますし本当に印象だけで食わず嫌いになっていたなと感じます。

もしNeovimを使っていてまだ良いAIエージェント開発ツールを見つけられていない方は、Claude Codeをぜひご検討ください。
【時系列異常検知】手法まとめ

# 📈 時系列の異常検知 まとめ【異常検知 × 時系列 × AI】

## ✅ はじめに

時系列データは多くの現場（製造・金融・IoT・医療）で蓄積されており、その異常検知は重要なテーマです。  
この記事では、**時系列異常検知の考え方・代表的手法・実装ポイント**を体系的にまとめます。
※本記事は生成AIを活用しています。

---

## 🧠 1. 時系列異常検知とは？

通常の異常検知とは異なり、時系列異常検知では以下の特徴があります：

- データに**時間的な依存性（自己相関・季節性など）**がある
- **異常の種類が多様**（スパイク、ドリフト、変化点、周期の乱れなど）
- ラベル付きデータが少ない or 無い（教師なしが多い）

---

## 🚨 2. 異常のタイプ

| 種類       | 説明                           | 例                                 |
|------------|--------------------------------|------------------------------------|
| スパイク型 | 一時的に異常な値が現れる       | センサの瞬間的な異常値            |
| レベル変化 | ある時点から平均値が変化       | 機器の設定ミスなど                 |
| ドリフト型 | 徐々に値が上昇／下降           | 劣化や経年変化                     |
| パターン逸脱 | 過去と異なる挙動を示す       | 異常なシフトパターン              |

---

## 🛠 3. 代表的な手法カテゴリ

### 🔹 3.1 統計的手法（軽量で解釈性あり）

- 移動平均＋しきい値
- ARIMA（自己回帰移動平均）
- 季節性分解（STL分解）

```python
from statsmodels.tsa.seasonal import STL

res = STL(series, period=24).fit()
res.plot()
```

### 🔹 3.3 深層学習ベース（時系列に強い）

| モデル                   | 特徴                                                                 |
|--------------------------|----------------------------------------------------------------------|
| LSTM-AutoEncoder         | 入力を復元しにくい箇所＝異常として検出                             |
| Variational AutoEncoder  | 潜在空間の分布に基づいて異常スコアを算出                            |
| Transformer系            | 長期依存を捉えられる（例：Anomaly Transformer など）               |
| GDN（Graph Deviation Network） | 複数センサ間の関係をグラフ構造で学習し、異常検出性能を向上         |

---

### 💡 4. 評価指標と注意点

- **Precision / Recall / F1-score**
- **AUC-ROC / PR曲線**（※データが不均衡な場合はPR曲線が有効）
- **異常スコアのしきい値設定が難しい**
  - 正規分布仮定
  - IQR（四分位範囲）法
  - 層別ヒストグラムによるクラスタごとの設定

---

### 📊 5. 有名な時系列データセット

| 名称     | 説明                             | リンク                                                                 |
|----------|----------------------------------|------------------------------------------------------------------------|
| NAB      | 実世界の時系列＋ラベル付き       | [Numenta/NAB](https://github.com/numenta/NAB)                         |
| Yahoo A1 | Webトラフィックの異常検知データ | [Yahoo Anomaly Dataset](https://webscope.sandbox.yahoo.com/)         |
| SWaT     | 水処理インフラのサイバー攻撃検出 | [SWaT Dataset](https://itrust.sutd.edu.sg/itrust-labs_datasets/)     |

---

### 🔁 6. 応用分野と実運用のポイント

- **製造**：設備監視、予知保全（例：MCC / PLCログの異常検出）
- **金融**：不正取引、株価の異常変動など
- **医療**：心拍数・呼吸・脳波などの生体信号の異常検出

✅ **ノイズ・欠損・外れ値処理が重要！**  
→ 欠損補完、デノイジング、適切なウィンドウサイズの選定が性能に直結します。

---

### 📘 7. 参考論文・記事

- [Deep Learning for Time Series Anomaly Detection（Amazon Research）](https://arxiv.org/abs/1905.13628)
- [Graph Deviation Network for Multivariate Time Series Anomaly Detection](https://arxiv.org/abs/2106.08770)
- Qiita記事：[異常検知と変化検知」読書メモシリーズ](https://qiita.com/)

---

### 📝 まとめ

- 時系列異常検知では、**時間依存性**や**多様な異常パターン**に注目すべき。
- 手法は **統計 → 機械学習 → 深層学習**と段階的に導入できる。
- 実データでは、**可視化・前処理・評価方法の選定が成果を左右**する。

---

### ✨ 関連記事（投稿予定）

- GDN（Graphベース異常検知）の実装解説
- LiNGAMなどを用いた因果分析と異常要因特定
- 時系列異常検知 × Explainable AI（SHAPやAttentionで解釈）

---

🧑‍🔬 本記事は、**製造業のデータサイエンティスト**としての実務＋研究の経験をもとにまとめました。  
異常検知や因果推論に関心のある方、ぜひコメント・フィードバックお待ちしています！
三菱樹脂事件

事件名：労働契約関係存在確認請求事件
いわゆる事件名：三菱樹脂本採用拒否事件
http://www.zenkiren.com/Portals/0/html/jinji/hannrei/shoshi/00044.html
http://www.zenkiren.com/Portals/0/html/jinji/hannrei/shoshi/00044.html
>参照法条：日本国憲法１４条，１９条，２２条，２９条



労働基準法３条，２章
>第三条　使用者は、労働者の国籍、信条又は社会的身分を理由として、賃金、労働時間その他の労働条件について、差別的取扱をしてはならない。



>出典：民集２７巻１１号１５３６頁／時報７２４号１８頁／タイムズ３０２号１１２頁／裁判所時報６３２号４頁／裁判集民１１０号６７５頁
審級関係：控訴審／００１８８／東京高／昭４３．　６．１２／昭和４２年（ネ）１５９０号
評釈論文：阿部照哉・判例時報７２４号６頁／阿部照哉・民商法雑誌７１巻５号９２７頁／安田叡・労働判例１９０号１２頁／磯田進ほか・ジュリスト５５３号１７頁／奥平康弘・ジュリスト５５３号４４頁／奥平康弘・労働法律旬報８５１号４頁／花見忠・ジュリスト５５３号６２頁／宮沢俊義・ジュリスト５５３号４２頁／今村成和・ジュリスト５５３号５１頁／佐藤昭夫・ジュリスト５５３号５７頁／佐藤昭夫・判例時報７２４号１５頁／坂本重雄・昭４８重判解説１８４頁／山口浩一郎・色川，石川編・最高裁労働判例批評〔２〕民事編３５６頁／山口浩一郎・色川，石川編・最高裁労働判例批評〔２〕民事編４５９頁／山口浩一郎・判例タイムズ３０６号１１頁／山田弘之助・経営法曹会議編・最高裁労働判例２巻３５８頁／山本吉人・季刊労働法９１号４頁／松岡三郎・労働判例１９０号３頁／松岡三郎・労働法律旬報８５１号３６頁／沼田稲次郎・労働法学研究会報１０２９号１頁／沼田稲次郎ほか・労働経済旬報９１６号７頁／深瀬忠一・憲法判例百選２６頁／正田彬ほか・季刊労働法９１号６２頁／川井健・判例時報７２４号１２頁／川添利幸ほか・判例評論１８１号２頁／田口精一・判例時報７２４号９頁／渡辺洋三ほか・労働法律旬報８５１号１２頁／藤田若雄・季刊労働法９１号５１頁／萩沢清彦・労働判例百選＜第三版＞〔別冊ジュリスト４５号〕３２頁／富沢達・法曹時報２７巻１号２０９頁／本多淳亮・労働法律旬報８５１号４３頁／林信雄・労働判例１９０号１０頁／和田英夫・判例時報７２４号３頁
AZ-204の合格体験記

先日、az-104に続きましてaz-204に合格しました。


> AZ-204 は、Microsoft Azure 向けソリューションの開発 (Developing Solutions for Microsoft Azure) 試験の略称です。この試験に合格することで、Microsoft Certified: Azure Developer Associate という認定資格が得られます。
この資格は、要件の収集、設計、開発、デプロイ、セキュリティ、メンテナンス、パフォーマンス チューニング、監視など、開発の全フェーズに携わる開発者を対象としています。

az-104の体験記は下記参照

https://qiita.com/frajt/items/c058c037dbf27acae649

# 勉強方法
udemyのみを使用しました。

まず、日本語で書かれている参考書、問題集がとても少ないです。
日本語のものもちらほらありますが、高かったり、問題数が少なかったりするので
海外の問題集を使いました。

その問題集をそのまま英語で読む必要はなく、udemyをgoogle chromeで開いて自動翻訳するといい感じの日本語で表示されるのでオススメです。

問題集や参考書は最近アップデートされているものか、最近作成されたものかつ評価やコメントがいいものを選ぶと最新の試験の問題に対応しているものが出題される可能性が高いです。
噂によると、試験は三ヶ月おきに新しい問題が増えるらしいです。

# 感想
海外の問題を扱ったせいか、az-104よりかaz-204の方が内容の理解が難しいと感じました。

また、az-104の試験は内容を理解すると別の問題は理解した知識を活かしt推論して解くみたいなことが多少できていましたが、az-204は解答の推論が難しく、知っているか知っていないかの問題が多いと思いました。

試験本番ではMicrosoft Learnが使えるので、その場で調べて解答に辿り着けるかが鍵です。日頃からMicrosoft Learnを使って、解答まで辿り着けるように訓練すればとても良いと思います。

次はaz-305！
対数らせんと複素数列

# はじめに

対数らせんの基本方程式は、極座標方式では、$r=r_0^{a\theta}$と表すことができる。ただし、$a,r_0$は定数とする。ここで、複素数列$z_n=z_{n-1}+z^n$を考える。このとき、$z_n$をプロットしていくと、以下のような対数らせんを描くことができる。今回はこのことに調査する。

![fkususosuu_moyou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/745b5f8a-f580-405d-939e-0f25a9921c70.png)

$|z|$が1未満かつ1に近い場合は以下のような綺麗な対数らせんを描くことができる。

![fkususosuu_moyou2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/7cedfe50-c9c6-41d5-a3cb-c662ba02de44.png)

# 対数らせんについて
極座標表示「$r=r_0^{a\theta}$」のように表される対数らせんについて、$xy$座標系では以下のように表すことができると考える（定数$a$の値とかは適当）。ただし、$(x_n,y_n)$という点の集合を考える。

```math
\begin{cases}
x_n=r_0^n cos(n \theta)\\
y_n=r_0^n sin(n \theta)
\end{cases}
```
これをプログラムで表すと以下のようになる。
```python rasen.py
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
import math

n=1000

theta = np.linspace(0, 10 * np.pi, n)
r=0.99

x_ary= []
y_ary= []

for i in range(n):
  x=r**i*np.cos(theta[i])
  y=r**i*np.sin(theta[i])
  x_ary.append(x)
  y_ary.append(y)

plt.plot(x_ary, y_ary, color='blue', linewidth=0.5)
plt.savefig("対数らせん.png")
plt.show()
```

![対数らせん.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/bd9ccb42-1bd4-4912-9351-4d3ded220c84.png)

# 複素数列
さて、ここではじめにで述べたように、複素数列$z_n=z_{n-1}+z^n$を考える。（$z_0=0$）

```math
z_n=z_{n-1}+z^n
```
両辺を$z^n$で除する。
```math
\frac{z_n}{z^n}=\frac{1}{z}\frac{z_{n-1}}{z^{n-1}}+1
```

ここで、$b_n=\frac{z_n}{z^n}$とおくと、

```math
b_n=\frac{1}{z}b_{n-1}+1
```

ここで、以下のような特性方程式を考える。

```math
b=\frac{1}{z}b+1
```

したがって、

```math
b_n-\frac{1}{z-1}=\frac{1}{z}(b_{n-1}-\frac{1}{z-1})
```

```math
b_n-\frac{1}{z-1}=(\frac{1}{z})^n(b_{0}-\frac{1}{z-1})
```

```math
b_n-\frac{1}{z-1}=-\frac{1}{z-1}(\frac{1}{z})^n
```

```math
b_n=\frac{1}{z-1}-\frac{1}{z-1}(\frac{1}{z})^n
```
ここで、$b_n=\frac{z_n}{z^n}$より、

```math
z_n=\frac{1}{z-1}z^n-\frac{1}{z-1}
```

ここで、$\frac{1}{z-1}=\alpha$(複素定数)とおく。

$z=r_0(\cos \theta+j\sin \theta)$と考えると、



```math
\begin{cases}
x_n=kr_0^n cos(n \theta)-Real(\alpha)\\
y_n=kr_0^n sin(n \theta)-Imag(\alpha)
\end{cases}
```
と表せる($k$は実数の定数)。

これは、対数らせんを描くと考えられる。

# プログラム
以下のようなプログラムを作成した。

```python rasen_2.py
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
import math
n=1000
z=0

r=0.99
theta=(math.pi/180)*1

for i in range(n):
  z0=z
  z=z+r**(i)*(np.cos(i*theta)+1j*np.sin(i*theta))
  z1=z
  plt.plot([z0.real,z1.real],[z0.imag,z1.imag],color='blue',alpha=0.5)

plt.savefig('fkususosuu_moyou2.png')

plt.show()
```

![fkususosuu_moyou2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/cad220fc-02cb-4874-ad58-e7f31c22f76f.png)

# まとめ

今回は、複素平面上に対数らせんを描写するプログラムを作成した。具体的には、高校数学の数列で扱うような漸化式を利用して、対数らせんを描写した。この漸化式で表される数列は指数で効いてくるので、最初は変化が大きいが$n$が大きくなるにつれてある定点に収束する。

# 参考文献

対数らせんについて

https://manabitimes.jp/math/1389
DINOv2で変わる画像理解：自己教師あり学習とクラスタリングの違いとは？

# はじめに
深層学習の進化とともに、教師あり学習の限界が見えてきました。特に、膨大なラベル付きデータを必要とすることは、多くの分野で実用を妨げています。こうした背景から近年注目を集めているのが、**自己教師あり学習（Self-Supervised Learning, SSL）**です。

本記事では、Meta AIが開発した自己教師ありモデル「DINOv2」の概要とともに、よく混同されがちな「自己教師あり学習とクラスタリングの違い」についても掘り下げて解説します。

# 自己教師あり学習とは？
[定義]
自己教師あり学習は、「人間がつけたラベルに頼らず、データそのものから構造を学ぶ学習方式」です。教師なし学習の一種ですが、タスクを人工的に作り出してモデルを訓練する点で、単なるクラスタリングとは異なります。

・同じ画像をランダムに変換 → 異なるビューだが「同じもの」として学習

・次の単語を予測（BERTなど）→ ラベル不要で言語理解が可能


# クラスタリングとの違い
| 項目   | 自己教師あり学習          | クラスタリング             |
| ---- | ----------------- | ------------------- |
| 学習目的 | 表現を学習（embedding）  | データを分類（grouping）    |
| 出力   | ベクトル表現            | クラスタラベル（例：0,1,2）    |
| 学習方式 | パラメトリック（モデルを学習）   | ノンパラメトリック（KMeansなど） |
| 応用性  | 学習後に様々なタスクに再利用可能  | クラスタ分けそのものが目的       |
| 学習構造 | 損失関数による教師信号あり（擬似） | 一般に損失関数なし（または距離最小化） |

クラスタリング：KMeansで画像特徴をグループ化 → ラベルはつくが「なぜその分類か」は学習されない

自己教師あり学習：DINOで画像の意味構造をベクトルで学習 → 分類や検索、セグメンテーションなどに再利用可能

# DINOv2の概要
DINOv2（2023, Meta）は、自己教師あり学習の文脈で開発されたVision Transformer (ViT) ベースの大規模特徴抽出モデルです。

[主な特徴]
教師ラベル不要：完全にラベルなしで学習

ViTベース：長距離関係を捉えるトランスフォーマ構造

スケーラブル：ViT-B/L/Gモデルに対応

意味的に優れた特徴表現：クラスタリングにも強い

[仕組み]
画像を複数のビューに変換（例：拡大、色変更）

同じ画像の異なるビューに対し、student/teacherモデルを通す

学習目標：studentがteacherの出力に一致するよう学習

結果：意味的に類似した画像がベクトル空間で近くにマッピングされる

[DINOv2とクラスタリングの接点]
興味深いことに、DINOv2で抽出されたベクトルを使うと、従来のクラスタリング手法（KMeansやt-SNE）でも視覚的・意味的に美しいクラスタリング結果が得られることがわかっています。

クラスタリング：DINOv2のベクトルを「クラスタリング対象」にする

自己教師あり学習：クラスタリングが「内包された構造」の一部として学習される（実際にDINOv1ではSinkhorn-KMeansが内部で使用されていた）

実装例
import torch
import torchvision.transforms as T
from torchvision.io import read_image
from torchvision.models.detection import dinov2_vitb14

#画像読み込みと前処理
img = read_image("dog.jpg").float() / 255.0
transform = T.Compose([
    T.Resize(224),
    T.CenterCrop(224),
    T.Normalize(mean=[0.5]*3, std=[0.5]*3)
])
img = transform(img).unsqueeze(0)

#DINOv2モデル呼び出し（vitb14, vitl14 などあり）
model = dinov2_vitb14(pretrained=True)
model.eval()

#特徴抽出
with torch.no_grad():
    features = model(img)  # 特徴量の形状


# まとめ
自己教師あり学習とクラスタリングは目的も仕組みも異なるが、連携可能

DINOv2は画像の意味構造を捉える汎用ベクトル抽出器として非常に強力

ラベルのないデータセットでも、高精度な画像解析が可能に
OCIコンソールの「ホーム・ページ」のコスト分析を表示させたい

# 何を表示させたいの？
これです。これ。ホーム・ページのやつ。[請求詳細の表示](https://docs.oracle.com/ja-jp/iaas/Content/GSG/Concepts/console_topic-AccountCenter-Billing.htm)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781934/507732f5-8535-488c-9e1e-c846e50e723f.png)


予算の設定していたとしても、ログインしたときに毎回確認したいじゃないですか。
それも、コスト分析のページじゃなくて、ログインしたら表示されるところで簡単に確認したいじゃないですか。

でも、これを表示させるための権限って、どこにも載ってないんですよね。

もちろん、Administratorsグループ（to manage all-resources in tenancy権限）があれば表示されますが、それ以外のグループでも表示させたいって思うことありますよね。

# コスト分析が見れる権限があればいいんじゃないの？
それがねえ、、、ダメなんすよぉ、、、。[コスト分析](https://docs.oracle.com/ja-jp/iaas/Content/Billing/Concepts/costanalysisoverview.htm)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781934/5bfb4cc5-2cdb-4b41-8be5-0c4b3af58edc.png)

# 請求ツールも追加すればいいんじゃないの？
それもねえ、、、ダメなんすよぉ、、、。[請求ツールの概要](https://docs.oracle.com/ja-jp/iaas/Content/Billing/Concepts/billingtoolsoverview.htm#subs_inv_paymenthist_required_IAM_policy)

# 結局、何が必要なの？
どうも、組織管理の権限も必要らしいです。え、そんなの分らんって。[組織管理の詳細](https://docs.oracle.com/ja-jp/iaas/Content/Identity/Reference/organizationsreference.htm)

```
Allow group <グループ名> to read organizations-entity in tenancy
Allow group <グループ名> to read organizations-subscription in tenancy
Allow group <グループ名> to read organizations-assigned-subscription in tenancy
Allow group <グループ名> to read organizations-subscription-region in tenancy
```

~~ところで、デザイン変更後、なんでこれのデフォルトの表示位置変えたんすか、オラクルさん~~
出張時の移動時間は労働時間になるのか？

社会保険労務士試験 2024 選択1-25
https://qiita.com/kaizen_nagoya/items/32a6860b0c1a681113e0

プログラマが知っているとよい労働基準法　
https://qiita.com/kaizen_nagoya/items/f9621a4ed74967b7a1e8

# 労働時間制度について
労働基準関係法制研究会（第２回） 資料 No.１ 令和６年２月21日
https://www.mhlw.go.jp/content/11201250/001212920.pdf

# 出張時の移動時間は労働時間になるのか？
https://e-sr.net/10350/
（昭和23年3月17日基発461号、昭和33年2月13日基発90号）

# 基補発 0330 第1号 令和3年3月 30 日
都道府県労働局労働基準部労災補償課長 殿
厚生労働省労働基準局補償課長
https://www.mhlw.go.jp/content/000900450.pdf

>問9 移動時間は労働時間に該当するか。
(答) 移動時間については、使用者が、業務に従事するために必要な移動を命じ、当該時間の自由利用が労働者に保障されていないと認められる場合には、労働時間に該当するものであ ること。
この基本的な考え方により、所定労働時間内に業務上必要な移動を行った時間について は、一般的には、労働時間に該当すると考えられるが、所定労働時間外であっても、自ら乗 用車を運転して移動する場合、移動時間中にパソコンで資料作成を行う場合、車中の物品の 監視を命じられた出張(※)の場合、物品を運搬すること自体を目的とした出張の場合等で あって、これらの労働者の行為が使用者から義務付けられ、又はこれを余儀なくされていた ものであれば、労働時間として取り扱うことが妥当であり、労働時間に該当するか否かを、 実態に応じて個別に適切に判断すること。
また、休日の出張の取扱いは、昭和 23 年3月 17 日付け基発第 461 号・昭和 33 年2月 13 日付け基発第 90 号を参考にすること。
なお、出張や事業場外の移動時間が労働時間に該当しない場合であっても、脳・心臓疾患 の請求事案に当たっては、移動時間及び移動時間中の状況の観点等から、労働時間以外の負 荷要因である「出張の多い業務」としての評価を十分に検討すること。
※ 出張とは、一般的に、使用者の指揮命令により、特定の用務を果たすために通常の勤務 地を離れて用務地へ赴き、用務を果たして戻るまでの一連の過程をいう。
(調査の留意点) 移動時間についても、出張先や事業場外での労働実態を明らかにするため、業務日報、パソコンのログ、メールの送信記録、ETC 等の入場出場記録、旅券や領収書等の清算に係る書 類等の客観的な記録を可能な限り収集すること。
また、請求人、事業場関係者への聴取等により、出張や事業場外における移動手段、移動 手段の指示・指定の有無、携行物や運搬物、移動時間中の業務の従事状況、移動中の自由利 用が保障されているか否か、使用者からの指示や命令及び使用者の認識等を確認すること。
(参考)
1 労働保険審査会裁決
【平成 29 年労第 118 号】 (争点:休業補償給付等の支給に関する給付基礎日額の取消請求)
会社に集合し、一定の作業を行った後に建設現場に移動する場合、どこから労働時間に該当するか (裁決概要)会社事務所に出勤した際及び現場作業終了後会社事務所に戻った際に一定の作業を行うことが常態であったものとみるのが相当である。
そうすると、請求人は、使用者の明示または黙示の指示により会社事務所に出勤し、準備 作業に従事した後、現場へ移動しているものであって、会社事務所に出勤し準備作業を開始 した時点をもって始業時刻とされるべきであり、同様に、現場から会社事務所に戻って後始 末作業を終了した時点をもって終業時刻とされるべきものとなる。したがって、会社事務所 と現場を会社所有の自動車で往復する時間については、 引き続き業務に従事していたもの とみなすことが相当であり、その移動中自動車の運転を行っていたか否かにかかわらず、当該所要時間については、労働時間と判断すべきものとなる。
2 参考事例
 事例2、事例7参照
052 AI屋さんの　音声概要（gemini）　LLMにトークン全文入力


052 AI屋さんの　音声概要（gemini）　LLMにトークン全文入力


Geminiのマルチモーダル出力で、自家製　音声概要完成です。

自然な音声で、無限の会話、
ラジオでもコントでも解説でも
なんでも楽しくお話ししてくれます。
回数制限を気にすることなく、
音声概要し放題です。
　恋愛ドラマ：太郎と花子　
超おすすめです。




日本語も流暢です。
当然英語もペラペラです。
gemini本体も、大進化中のようで
一通り触るだけでも大変です。

これから何を作ろうか、楽しみでしょうがありません。

---


https://blog.google/intl/ja-jp/company-news/technology/gemini-app-updates-io-2025/


https://blog.google/intl/ja-jp/company-news/technology/google-gemini-updates-io-2025/


![スクリーンショット 2025-05-25 21.35.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/5a6cd83d-123b-42d6-b694-a4f68a6df9e2.png)





---

自家製　音声概要

恋愛ドラマ：太郎と花子

https://storage.googleapis.com/bono0_202505/ENTER_FILE_NAME03.wav

https://storage.googleapis.com/bono0_202505/ENTER_FILE_NAME04.wav

---

コント：太郎と花子

https://storage.googleapis.com/bono0_202505/ENTER_FILE_NAME01.wav

https://storage.googleapis.com/bono0_202505/ENTER_FILE_NAME02.wav


---

目次

https://qiita.com/bono0/items/dc1d000c98af7e07c9a7

今回も無事に、本家本元のGeminiを使って、音声概要


　052 AI屋さんの　音声概要（gemini）　LLMにトークン全文入力


完成です。おめでとうございます。



ー以上ー
[競プロ]未満フラグのDPを知る

## はじめに
精進してますか？僕はしてます。
動的計画法はとても便利です。目的重視の考え方なので、データ構造さえ知ってしまえば、どんな問題にも応用できそうな気がします。

そんなつもりでしたが、今回とある問題にかなり詰まったので、未満フラグの真骨頂を伝授できればと思います。

## N以下の非負正数でpopcountがKの総和を求めよ
これは[ABC406_Eの問題](https://atcoder.jp/contests/abc406/tasks/abc406_e)です。
一瞬「全bit探索で解けるか...？」と頭に過ぎったのですが、陳腐なforループではN以下という制限を守るような探索が出来ません。

そこで、このような考えを持つことが重要です。
1. Nを2進数に分解する
1. 各'1'に対して、それ未満でpopcountが特定の数値の総和を調べる
1. '1'の探索レベルを落とすたびに使えるpopcountの数を落としつつ、自分未満の数値の総和を調べる

これをすれば、論理的にはみ出ることも、総和が重複することもありません。考えついた人は天才だ...!
<br>

先ほど出た要件に基づくと、**2^i未満の非負整数でpopcountがjの総和**を保持する二次元配列が欲しいです。(そして、上記条件で数値の数を保持する別の二次元配列があれば、計算し放題です)

こういった要領で、未満フラグのDPは有効活用されるんですね〜

## まとめ
精進せずに記事書いてる時間が途中で惜しくなったので、早々に切り上げました。(ｽﾐﾏｾﾝ)
このような美しい実装法を知ると、嫌でも頭に出てきそうですよね。レートを上げるという名目では非論理的ではありますが、あくまで競プロはゲームなので、それもまた一興と考えてます(灰er並感)
<br>
お疲れ様でした。
VSCodeのターミナルでTouchが使えない問題

# VSCodeターミナルで `touch`が使えない問題と解決法<br>


## はじめに
GitHubの勉強中、VS Code 内のターミナルで新しいファイルを作ろうと `touch` コマンドを使ったが、Windows 環境ではエラーが発生した。

## エラー内容
`touch`コマンドで`a.py`を作成しようとしたが、下記のエラーが発生した。
~~~
> touch a.py
touch : 用語 'touch' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正しく記述されていることを
確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してください。
発生場所 行:1 文字:1
+ touch a.py
+ ~~~~~
    + CategoryInfo          : ObjectNotFound: (touch:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
~~~

## エラーメッセージの原因
Windows の標準ターミナル（PowerShell や cmd.exe）では、`touch` コマンドは使えない。`touch` は Linux や macOS のシェルで使うコマンドで、Windows のネイティブコマンドセットには含まれていないからだ。

## 解決方法：Git Bash を使う
`Git Bash` は、Git をインストールしたときに提供されるシェルで、Linux のコマンド（`touch` も含めて）を Windows 上で使えるようにするツールだ。

### 使い方

1. VS Code のターミナルを開く
2. 画面下の矢印をクリックし、`Git Bash` を選ぶ

これで、Git Bash ターミナル内で `touch` コマンドを使えるようになる。新しいファイルも簡単に作れる。

---

## まとめ
`Git Bash` を使うのが最も簡単で快適な方法だ。Linux のコマンドがそのまま使えるから、特に問題もなく作業が進む。
Windows AI Foundryをインストールする

[![Azure AI Foundaryとは？できるや使い方、料金体系をわかりやすく解説 | AI総合研究所 | AI総合研究所](https://tse1.mm.bing.net/th?id=OIP.JYC3POI0vZPY8iY2pUxv6QHaEF\&pid=Api)](https://www.ai-souken.com/article/azure-ai-foundary-overview)

Windows AI Foundryは、Microsoftが提供する最新のAI開発プラットフォームで、ローカル環境でのAIモデルの実行やカスタマイズを可能にします。特に、Foundry Localを利用することで、Windows上でAIモデルを簡単に導入・実行できます。以下に、Windows AI Foundryのインストール手順をご案内します。([Publickey][1])

---

## ✅ Windows AI Foundry（Foundry Local）のインストール手順

### 1. システム要件の確認

* **対応OS**: Windows 10 (x64)、Windows 11 (x64/ARM)、Windows Server 2025
* **ハードウェア要件**:

  * 最小: 8 GB RAM、3 GBの空きディスク容量
  * 推奨: 16 GB RAM、15 GBの空きディスク容量
* **対応ハードウェアアクセラレーション（任意）**:

  * NVIDIA GPU（2000シリーズ以降）
  * AMD GPU（6000シリーズ以降）
  * Qualcomm Snapdragon X Elite（8 GB以上のメモリ）
  * Appleシリコン
* **ネットワーク**: 初回モデルダウンロード時にインターネット接続が必要（オフライン使用も可能）([Microsoft Learn][2])

### 2. Foundry Localのインストール

Windowsのターミナル（PowerShellまたはコマンドプロンプト）を開き、以下のコマンドを実行します。([Microsoft Learn][2])

```bash
winget install Microsoft.FoundryLocal
```

このコマンドにより、Foundry Localがインストールされ、ハードウェア構成に応じた最適な推論環境が自動的に設定されます。 ([AI総合研究所][3])

### 3. 初めてのAIモデルの実行

インストール後、以下のコマンドでAIモデルを実行できます。

```bash
foundry model run phi-3.5-mini
```

このコマンドは、`phi-3.5-mini`モデルをダウンロードし、実行します。ダウンロードには数分かかる場合があります。実行後、コマンドラインでモデルと対話できます。 ([Microsoft Learn][4], [Microsoft Learn][2])

---

## 🔍 補足情報

* **モデルの一覧表示**: 利用可能なモデルを確認するには、以下のコマンドを使用します。

  ```bash
  foundry model list
  ```

* **CLIヘルプの表示**: Foundry CLIの全コマンドと使用方法を確認するには、以下のコマンドを使用します。

  ```bash
  foundry --help
  ```

* **モデルの最適化**: Foundry Localは、システムのハードウェアとソフトウェアの構成に最も一致するモデルバリアントを自動的にダウンロードします。たとえば、NVIDIA GPUを使用している場合、モデルのCUDAバージョンがダウンロードされます。GPUやNPUがない場合は、CPUバージョンがダウンロードされます。 ([Microsoft Learn][2])

---

Windows AI Foundryを活用することで、ローカル環境でのAIモデルの実行やカスタマイズが容易になり、開発効率が向上します。さらに、OllamaやNVIDIA NIMsなどの他のモデルカタログとも連携し、多様なAIモデルへのアクセスが可能です。 ([Windows Blog][5])

ぜひ、Windows AI Foundryを導入して、AI開発の新たな可能性を体験してください。

[1]: https://www.publickey1.jp/blog/25/aiwindowsmacosazure_ai_foundry_local.html?utm_source=chatgpt.com "［速報］マイクロソフト、AIモデルをWindows/macOSローカルで ..."
[2]: https://learn.microsoft.com/ja-jp/azure/ai-foundry/foundry-local/get-started?utm_source=chatgpt.com "Foundry Local の概要 - Learn Microsoft"
[3]: https://www.ai-souken.com/article/what-is-windows-ai-foundry?utm_source=chatgpt.com "Windows AI Foundryとは？Build 2025で示されたMicrosoftの新しい ..."
[4]: https://learn.microsoft.com/en-us/azure/ai-foundry/foundry-local/get-started?utm_source=chatgpt.com "Get started with Foundry Local - Learn Microsoft"
[5]: https://blogs.windows.com/japan/2025/05/23/advancing-windows-for-ai-development-new-platform-capabilities-and-tools-introduced-at-build-2025/?utm_source=chatgpt.com "AI開発のためのWindowsの進化：Build 2025で発表された"
【初心者向け】GCPのブートディスクと非ブートディスクの違いとは？

# 【初心者向け】GCPのブートディスクと非ブートディスクの違いとは？

Google Cloud（GCP）で仮想マシン（VM）を使うとき、  
「ブートディスク」と「非ブートディスク」という言葉が出てきます。

> なんとなく使ってるけど、どう違うの？

という方向けに、違いを分かりやすく整理しました。

---

## 🔹ブートディスクとは？

> VMが起動するために必要な「OS入りのディスク」

- UbuntuやCentOSなどの**OSが入っている**
- VM作成時に**自動で1つ作られる**
- **削除するとVMが起動できなくなる**
- デフォルトでは、**VM削除時に一緒に削除される**

---

## 🔸非ブートディスクとは？

> データやログを保存するための**追加ディスク**

- OSは入っていない
- **手動で追加する**
- VMがなくてもディスクだけ**残せる**
- 永続ディスクとして、**データストレージ用途に便利**

---

## ✅ 比較まとめ表

| 項目           | ブートディスク                     | 非ブートディスク                 |
|----------------|------------------------------------|----------------------------------|
| OSが入ってる？   | ✅ はい                             | ❌ いいえ                         |
| 自動で作られる？ | ✅ VM作成時に自動                   | ❌ 手動で追加が必要               |
| 削除の扱い       | VM削除時に一緒に削除（デフォルト）  | 残る（別途削除が必要）           |
| 用途            | VMの起動（システム用）             | データ保存（アプリ・DBなど）     |

---

## 💡補足：非ブートディスクの活用例

- DBのデータ領域
- 大容量ログ保存
- コンテナの一時ストレージ（永続化用途）

---

## 🧩まとめ

GCPでVMを使うときは、

- **ブートディスク**：VMを動かすために必須  
- **非ブートディスク**：必要に応じて追加する保存場所

と覚えておけばOKです！
Dockerでbundle installができない

## 概要
Dockerで以下のエラーが出た際に、自分が対応した方法を記載します。
エラー
```ruby
rails@hoge:/rails$ bundle install
Bundler::PermissionError: There was an error while trying to write to `/usr/local/bundle/ruby/3.4.0/cache`. It is likely that you need to grant write permissions for that path.
```

## 解決策
- 以下コマンドを入力
    - webの名前はご自身のコンテナ名に置き換えて下さい
```ruby
`docker compose exec -it -u root web bash`
```

- 無事`bundle install`できると思います

## 原因
railsユーザーでコマンドを入力したため、権限がなくinstallできないとのことでした。
Dockerでbundle installの権限をrailsユーザーでも許可をするようにするか、今回の対応のようにrootユーザーでコンテナに入ることによって解決します。
Difyローカル版インストール

# 環境
| 項目 | 内容 |
|:-:|:-:|
| OS | AlmaLinux9.5 |
| IP | 192.168.0.10 |

# 準備
DockerとGitをインストールしておく。
```
# dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
# dnf -y install docker-ce docker-ce-cli containerd.io
# systemctl start docker
# systemctl enable docker
# curl -L "https://github.com/docker/compose/releases/download/v2.36.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
```
```
# dnf -y install git
# git config --global user.name "XXXXXX"
# git config --global user.email "XXXXXX@gmail.com"
```

# Dify起動まで
Gitからダウンロードしてくる。
https://github.com/langgenius/dify
```
# cd /usr/local/src/
# git clone https://github.com/langgenius/dify.git
# cd dify/docker
# cp -p .env.example .env
# docker-compose up -d --build
```

# Difyにアクセス
アカウント作成
http://192.168.0.10/install

ログイン
http://192.168.0.10/signin

# モデル追加
設定 > モデルプロバイダー を選択。
利用したいモデルをインストールする。ボタンポチポチでいける。
APIKEY設定をすればモデル利用できるようになる。

# Gemini
無料で使えるAPIといえばGeminiがある。
APIKEYは、Google AI StudioのGetAPIKEYから発行できる。
https://aistudio.google.com/prompts/new_chat

設定してチャットボット作ってみたけど返事がない。
サーバーからcurlコマンド打ってみると応答あるんだけど・・・。

# Llama3
Geminiがダメだったので、Llamaで試してみる。
こちらはHuggingFaceでAPIKEY取得する。
右上のプロフィールアイコン > AccessTokens > Create new tokenから発行できる。
設定は、Writeを選択、Token nameには適当な名前を設定して発行。
https://huggingface.co/settings/tokens

APIKEYとは別に利用許可が必要。ユーザー情報入力＆ライセンス同意して、利用承認が下りれば利用可能となる。
https://huggingface.co/meta-llama/Llama-3.3-70B-Instruct
利用承認待ちは以下のメッセージが表示される。何分か待ったら承認が下りた。承認時は登録のメールアドレスにメールが届きました。
```
Your request to access this repository has been submitted and is awaiting a review from the repository authors. You can check the status of all your access requests in your settings.
```
Difyのモデル設定は、
Model Type: LLM
Model Name: meta-llama/Llama-3.3-70B-Instruct
Endpoint Type: Hosted Interface API
API Token: <HuggingFaceで取得したAPIKEY>
Difyで"2025年の崖"を乗り越えようぜ

こんばんは。座禅いぬです。
タイトルはちょっと大げさなのですが、非エンジニアの心境だと本当にこんな感じ。

## Difyとは
Difyは**ノーコードでAIアプリを作成できるツール**です。有名なので、ここでは詳細は説明を省かせていただきます。

余談ですが、DifyとはDefine（定義する）+ Modify（改良する）から来ているそうです。（[公式ドキュメント](https://docs.dify.ai/ja-jp/introduction)より）。Difyは日本市場に力を入れているのか、**日本語ドキュメントが読みやすい**のも素敵。

### ここがいいよね

- ノーコードorローコードで実行が可能。ワークフローを組み立てて作っていくことが可能で、**学習コストが低い！**
- 勉強会でも**多くの人が使っているため情報が多い！**
- つまり**ユースケースが豊富！**
　→[M_R_K_Wさんの解説noteがおすすめ！](https://note.com/m_r_k_w/n/n26698cd1c4b4)→[続編](https://note.com/m_r_k_w/n/nd95faaf5cdfb)
 
## 「2025年の崖」とは

2018年ごろから、経産省が「**2025年の崖**」を克服しましょう、そのためにDXが必要ですよ、という文脈でDXを推進してきたわけです（[DXレポート～ITシステム「2025年の崖」の克服とDXの本格的な展開～](https://www.meti.go.jp/shingikai/mono_info_service/digital_transformation/pdf/20180907_01.pdf)）。

その中で出てくるワードが「**レガシーシステム**」や「**ブラックボックス**」です。
レガシーシステムとは、「老朽化、肥大化・複雑化、ブラックボックス化したシステム」の事だそうですが、率直に言って**非エンジニアからしたら全部ブラックボックス**なんですよね。

ましてデータがオープンな形式になっていなかったら、**仕事のデータを人質に取られたようなもん**です。みんな当たり前と思ってるけど**これはおかしい**。

### 自分的課題
- 今使っているソフトウェアが、データがオープンな形式でない上にデータのエクスポートができない
- ニッチ業種なので競合が少ないせいか、データのオープン化をどこもしていない
- 先代から引き継いだデータがこのままだと失われてしまう

## どうやって乗り越える？
今回は先に述べた課題のひとつとして、**「業務用ソフトウェアから文章データが取り出せない問題」に対し、AI-OCRとして使ってみる**ことにしました。

### 実験してみた
Difyはまだ触り始めたばかりの初心者なため、まずはOCRの練習から。
仕組みは前の記事でも書いたDify本の作例をモディファイします。
（参考記事：[今更だがDifyに入門するぜ！コミュニティ版で。](https://qiita.com/zazen_inu/items/771f409c368f5da5b659)

アンケートを読み込んでみたところ、あんまりちゃんと読み込めない。
そこで、いくつかの実験用アンケートを作成し、プロンプトとしてアンケート内容を教え込んだうえでいろんな形式で回答を読み込ませてみました。

まず○を付ける形式。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/850275/97033de2-bead-4460-b65d-3fa3ab8fb75e.png)
プロンプトなしでもまあまあ読み込んでくれます。ただ、漢字はよく間違えるので、回答をあらかじめ教えておくことが有効。ちなみに実務で使うと、一定数○じゃなくてチェックする人がいます。それもプロンプトに含めておけば対応可能。

続いて、マーク形式を模して○を埋めてもらう方式。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/850275/5c16b502-664f-48ed-9368-a6a7322b7be1.png)
これ一番有効だろうと思ったらそこまで変わらなかった。

さらに、もっとざっくりの文字列に○形式。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/850275/3f7a0a4f-0581-424b-83d2-e61c8d3b3636.png)
実務で、プロンプト無しで試したところだいたいミスがあったので、これ絶対無理だと思ったけど意外といけました。あらかじめ選択肢を教えておくことｄ間違えずに対応できていました。

最後。手書き。敢えてとても汚く書いてみました。（普段も敢えてとても汚いです。敢えて。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/850275/6137d6fc-fed6-44ad-9bf1-42bb98f1384e.png)
これちょっと面白いなと思ったのが、あらかじめ選択肢を教えておけば、菊正宗をちゃんと読んだことです。

### ここまでのまとめ
実験とは言っても真面目にN増やしたり、条件統一したりしているわけではないので、これで言えるのは「**プロンプトで精度高められる可能性あるんじゃない...?**」って可能性を感じる程度までですね。特に、文字数や選択肢がもっと増えるとかなり難しくなると思うので、それはまた改めてやってみようと思います。

## じゃあ本番だ。文章データのスクショから読ませる
さて、上記を踏まえてプロンプトを書きます。内容としては
- **文章の構造と意味**
- **使われている用語**
- **人物名**
- **注意事項**

人物名をあらかじめ教えておくと間違いがだいぶなくなります。
画面データだしスクショで画素数も結構あるから読みやすいとおもいきや、結構ミスをします。たぶん文字数が多いとミスりやすい。でも、結構精度が上がることがわかりました。また、**よく間違える部分は注意事項で教えておくと間違いが減ります**。

## さいごに
実務のデータはちょっとお見せ難しいと思ったので最後が少し寂しいですが、かなりの精度でデータの変換ができそうです。何よりうれしいのは、Difyで作ったアプリなら**LINE使えるくらいの経験さえあれば業務としてバリバリ使ってくれる**ことです。Chat形式はそういう素晴らしさがありますね。しかもノーコードですぐ作れる。

以上、簡単なトライの報告ではありますが、Difyは非エンジニアにとって魔法みたいなツールになりえるんじゃないかなと思います。もっと勉強してみたい。
【Rails】既存DB内のテーブルの照合順序を統一する

# はじめに
既存のデータベース内のテーブル、カラムの照合順序が統一されていないため、統一する作業について調べた内容を記録します。

# 方法①
#### 各テーブルごとに変更する
```
mysql> ALTER TABLE テーブル名 CONVERT TO CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci;
```
===
下記のSQLを実行すると、データベース内の全テーブルへのSQL文の一覧が出力されるので、一行ずつコピペをして各テーブルごとのSQLを実行することができる
```
mysql> SELECT CONCAT('ALTER TABLE ', table_name, ' CONVERT TO CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci;') AS alter_sql FROM information_schema.tables WHERE table_schema = 'データベース名';
```
```
+---------------------------------------------------------------------------------------------------------+
| alter_sql                                                                                               |
+---------------------------------------------------------------------------------------------------------+
| ALTER TABLE active_storage_attachments CONVERT TO CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci;     |
| ALTER TABLE active_storage_blobs CONVERT TO CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci;           |
| ALTER TABLE active_storage_variant_records CONVERT TO CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci; |
| ALTER TABLE ar_internal_metadata CONVERT TO CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci; 
|
(省略)
```

# 方法②
#### マイグレーションでまとめて実行する
- 下記のようなマイグレーションファイルを作成し、`rails db:migrate` を実行する
```rb
class ChangeCollation < ActiveRecord::Migration[6.1]
  def up
    ActiveRecord::Base.connection.tables.each do |table_name|
      execute "ALTER TABLE #{table_name} CONVERT TO CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci;"
    end
  end
end
```
- ` ActiveRecord::Base.connection.tables`
  - ActiveRecordを使って全テーブル名が入った配列を返す
```
irb(main):001:0> ActiveRecord::Base.connection.tables
=> ["active_storage_attachments", "active_storage_blobs", "active_storage_variant_records", "ar_internal_metadata", ...]
```
- `execute` メソッド
  - 任意のSQLを実行できる
  - Railsガイドでは「データをマイグレーションでみだりに直接変更しないよう注意が必要です」とあるので実行に際しては十分に検討してください

https://railsguides.jp/v8.0/active_record_migrations.html#%E7%94%9Fsql%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B
IAMポリシー・ロールの文法(Principal, Resource, Condition)の説明

# はじめに
IAMポリシー、IAMロールを作成する際に毎回Principal、Resource、Conditionって何指定するんだっけ？ってことがあったので、まとめておきます。

## Principal要素
IAMロールの信頼ポリシーまたは、リソースベースのポリシー（S3バケットポリシーなど）で指定するもので、アクションを実行する人、ユーザ、アプリケーションを指す。
つまり、誰がこの権限を用いて実行してもいいのか、どのサービスがこの権限を用いて実行していいのかを記載する要素です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005551/a4f18ec2-2be8-410b-9b1b-150ac8316d1f.png)

書き方としては以下になります。
※大文字小文字も区別され、「*」は使用できません。

- "Principal": { "AWS": "arn:aws:iam::123456789012:root" }
- "Principal": { "AWS": "arn:aws:iam::123456789012:user/role/ロール名" }
- "Principal": { "AWS": "arn:aws:iam::123456789012:user/ユーザー名" } 
- "Principal": { "Service": "lambda.amazonaws.com（どのAWSサービスで利用するか）" }

Black Beltでも以下のように紹介されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005551/0b009994-e702-4ce7-8a80-b48632541534.png)

## Resource要素
どのAWSリソースに対してアクション内容を許可・拒否するのかを記述する。
例えば、S3の特定のバケットの特定オブジェクトに対する操作を行う場合、
Resource要素には、S3の特定のバケットの特定オブジェクトを指定する。

例：
```
"Resource": "arn:aws:s3:::${bucketName}"
```

## Condition要素
ポリシーを適用する際の条件を記載する。
条件演算子は[この記事](https://qiita.com/shota_hagiwara/items/e9cf6413c5c99335e658)を参考にしてください。

```
// ユーザー名のPrefixが"Hoge"だった場合のみ適用させたい
Condition: {
    "ArnEqals": {
        "aws:PrincipalArn": "arn:aws:iam::account-id:user/Hoge*"
    }
}
```

以上になります。



## 参考
- https://qiita.com/miyuki_samitani/items/2d38d29c0f602931dd1a
- https://www.youtube.com/watch?v=K7F5yTThynw
- https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/intro-structure.html
- https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_elements_resource.html
【備忘録】Macのセットアップ

久しぶりに個人用のMacを新調したため、設定を引き継がずに綺麗な状態からセットアップしてみた

## OS設定まわり
1. ナチュラルなスクロールを解除
> ナチュラルなスクロールにあまり慣れていないため

## アプリ
1. Chrome
1. FireFox
1. Ollama

## エディタ周り
1. VSCode
1. Cursor
1. Windsurf
1. Obsidian
1. [!] Xcode

> Xcodeも入れるが、後述のXcodesでinstallする

## VSCode拡張
1. 日本語
1. Python
1. GitHub Copilot
1. Gemini Code Assist
1. Markdown

## ツール/コマンド周り
1. brew
    1. asdf
    1. git
    1. GitHub CLI
    1. pipx
    1. Xcodes (cask)
    1. CopilotForXcode（cask）
1. asdf
    1. nodejs
    1. Python
    1. Ruby
1. pipx
    1. uv
1. npm
    1. Claude Code

## コンテナ周り
競合するので、以下のいずれか
- Docker Desktop（個人PC）
- Podman Desktop (会社PC）
- Rancher Desktop
> - 会社だとライセンスの関係上、Podman Desktopを使ってる。Podmanの理由は人柱になるため
> - 個人PCだと気にしなくても良いので、Docker Desktopを使う

## エイリアス設定
```
alias reload='exec $SHELL -l'
alias ll='ls -al'
alias ls='ls -GF'
```
DatabricksでClaude Sonnet 4がサポートされました！

先走ってこちらの記事を書きました。

https://qiita.com/taka_yayoi/items/0e9cbd385f70c2d44550

そんなこと言っている間に、AWSとAzureの東京リージョンでClaude Sonnet 4の存在を確認できました！Databricks環境でネイティブで利用できます！

![Screenshot 2025-05-25 at 20.46.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/8dd7eb95-fc0f-4c64-9f5f-f1fb4909c86d.png)

![Screenshot 2025-05-25 at 20.57.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0574b907-3f46-4627-af83-48947d021e05.png)


![Screenshot 2025-05-25 at 20.54.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/fe0dfe47-5d26-418e-a06b-b9bf2701595d.png)


Playgroundで試します。

![Screenshot 2025-05-25 at 20.50.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6e63626d-127b-4c17-b607-81c3c1f90781.png)

![Screenshot 2025-05-25 at 20.47.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3cd90463-a8a7-48a9-a17d-9e48f1daa4bd.png)

問題なく動いています。
![Screenshot 2025-05-25 at 20.50.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ddf2ede8-bd9e-4933-bad5-118b28189318.png)

ご活用ください！

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
今週の学習記録（2025/05/18～2025/05/24）


## 🔍 学習内容
- **学習テーマ**: Rails, RSpec, データベース設計, OCI
- **使用した教材**: Udemy, 公式ラーニング
- **学習時間**: 15h


## 💡 学び・反省点
### 学び
- 論理削除、物理削除、中間テーブルなど
- Renderを使用したRailsアプリのデプロイ方法
- RSpec導入方法

### 反省点
- 学習時間が短すぎること。

## 📆 次週の予定
### 目標
- RSpecのUdemy講座を完了させる。
- Reactの学習に入る。

## 🏄‍♂️所感
　またまたしばらく投稿し忘れていました。先月あたりから作成し始めたチームで管理できるTodoアプリが完成しデプロイまで完了しました。かなり質素な感じで実用性は皆無ですが、RailsやScssの理解が深まりとてもいい経験になりました。来週からはRSpecを使用したテストツールの使用方法を学び、テスト駆動開発もやってみたいと考えています。また、ReactとTypescriptの学習も再開しポートフォリを作成に組み込みたいと思います。
　来月あたりから、LPIC Level1-102も取得し会社で学習している資格もあるので多忙になる気がしますが頑張っていきます。
X86　同じMOVでも機械語は複数ある

## 検証の目的
普段アセンブリ言語でプログラムを書いていると使う頻度が一番高いMOV命令。
アセンブリの表記ではMOVと書きますが、実際に吐き出されるオペコードは一種類ではなく、多数あるのではないかと思い、気になったため検証してみました。

## 検証コード
```
BITS 16

mov ax, bx       ; 89 D8    : レジスタ間転送 (16-bit)
mov al, bl       ; 88 D8    : レジスタ間転送 (8-bit)

mov ax, 0x1234   ; B8 34 12 : 即値からレジスタ (16-bit)
mov al, 0x12     ; B0 12    : 即値からレジスタ (8-bit)

mov [0x7E00], ax ; A3 00 7E : レジスタからメモリ (絶対アドレス)
mov ax, [0x7E00] ; A1 00 7E : メモリからレジスタ (絶対アドレス)

mov [bx], ax     ; 89 07    : レジスタからメモリ (BX間接)
mov ax, [bx]     ; 8B 07    : メモリからレジスタ (BX間接)

mov [bx+si], ax  ; 89 00    : レジスタからメモリ (BX+SI)
mov ax, [bx+si]  ; 8B 00    : メモリからレジスタ (BX+SI)

mov [bx+0x10], ax; 89 47 10 : レジスタからメモリ (BX+即値)
mov ax, [bx+0x10]; 8B 47 10 : メモリからレジスタ (BX+即値)

mov ax, [di+2]   ; 8B 45 02 : メモリからレジスタ (DI+即値)
mov [di+2], ax   ; 89 45 02 : レジスタからメモリ (DI+即値)

; 異なるセグメントレジスタの例
mov ax, ds       ; 8C D8    : セグメントレジスタから一般レジスタ
mov ds, ax       ; 8E D8    : 一般レジスタからセグメントレジスタ

; 即値からメモリへの保存
mov word [0x1000], 0xABCD ; C7 06 00 10 CD AB
mov byte [0x1000], 0x12   ; C6 06 00 10 12
```

## 結果
```
ubuntu@ubuntu:~/kaihatsu/mov$ nasm -f bin mov.asm -o mov.bin
ubuntu@ubuntu:~/kaihatsu/mov$ ndisasm -b 16 mov.bin
00000000  89D8              mov ax,bx
00000002  88D8              mov al,bl
00000004  B83412            mov ax,0x1234
00000007  B012              mov al,0x12
00000009  A3007E            mov [0x7e00],ax
0000000C  A1007E            mov ax,[0x7e00]
0000000F  8907              mov [bx],ax
00000011  8B07              mov ax,[bx]
00000013  8900              mov [bx+si],ax
00000015  8B00              mov ax,[bx+si]
00000017  894710            mov [bx+0x10],ax
0000001A  8B4710            mov ax,[bx+0x10]
0000001D  8B4502            mov ax,[di+0x2]
00000020  894502            mov [di+0x2],ax
00000023  8CD8              mov ax,ds
00000025  8ED8              mov ds,ax
00000027  C7060010CDAB      mov word [0x1000],0xabcd
0000002D  C606001012        mov byte [0x1000],0x12
```
[Android]ソフトキーボードが表示開始される直前を検知する

## はじめに
TextFieldにフォーカスが当たるとキーボードが表示されます。このキーボートはOSによって自動的に表示されるものですが、表示開始直前を検知したいということがあったので書き残しておきます

### いつ

- キーボード表示設定を`windowSoftInputMode:adjustResize`にしている
- 画面下部にフローティングボタンやタブといった（アプリの要件によっては）入力時に不要なUIがあり、コンテンツ領域を圧迫してしまっているとき

これらのときに、「キーボード表示時に下部のタブ等のUIも一緒にせり上がってしまう」という問題がありそれを解決するために必要となりました。


![8843973fd2a0aa50ecc3eccbc02e463a.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662505/4bdae681-1b4c-4ee7-83a8-6d01247fa6ef.gif)



### やりたいこと

キーボードが表示されているときには対象のUIを非表示にしたい

- ただし表示されてから非表示にすると遅いので、表示処理が開始される`前`に消したい
- キーボードが表示中かどうかの状態を取れるようにしてScreen側で柔軟に使いたい

### 実装

WindowInsetsAnimationを使う。

```kotlin
override fun onPrepare(animation: WindowInsetsAnimation) {
    val type = animation.typeMask
    if ((type and WindowInsetsCompat.Type.ime()) != 0) {
        // 準備時の表示状態（表示前 or 閉じる前）
        decorView.rootWindowInsets.isVisible(WindowInsetsCompat.Type.ime())
    }
}
```

onPrepareはWindowInsetsAnimationが開始される前に処理が入るため、ここでキーボードが今現在どのような状態なのかを判定することができる。

### 全体コード

上記を使って良い感じにキーボードの状態を取れるようにしたもの。

```kotlin
enum class Keyboard {
    Opened, Closed;

    val isVisible: Boolean
        get() = this == Opened
}

@Composable
fun rememberKeyboardState(): Keyboard {
    val context = LocalContext.current
    val activity = context.findActivity() // ※1
    val decorView = activity.window.decorView
    
    var isVisible by remember {
        mutableStateOf(false)
    }
    
    DisposableEffect(decorView) {
        val callback = object : WindowInsetsAnimation.Callback(DISPATCH_MODE_STOP) {
            override fun onPrepare(animation: WindowInsetsAnimation) {
                val type = animation.typeMask
                if ((type and WindowInsetsCompat.Type.ime()) != 0) {
                    isVisible = !decorView.rootWindowInsets.isVisible(WindowInsetsCompat.Type.ime())
                }
            }

            override fun onProgress(
                insets: WindowInsets,
                animations: MutableList<WindowInsetsAnimation>
            ): WindowInsets {
                return insets
            }
        }
        decorView.setWindowInsetsAnimationCallback(callback)

        onDispose {
            decorView.setWindowInsetsAnimationCallback(null)
        }
    }

    return remember(isVisible) {
        if (isVisible) {
            Keyboard.Opened
        } else {
            Keyboard.Closed
        }
    }
}
```

onPrepareで取れた状態を反転させてStateを更新することで、表示が切り替わる直前の状態を保持できるようにしています。

```kotlin
@Composable
fun SampleScreen() {
    val keyboardState = rememberKeyboardState()
    if (!keyboardState.isVisible) {
        BottomContent()
    }
}
```

![82378ff963e6da6ca3b855e82a7fb866.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662505/e101ab88-1676-4fb0-b1ea-1879a19d83e9.gif)


※1 findActivity()はこの記事を参考にしたものです。（https://stackoverflow.com/questions/64675386/how-to-get-activity-in-compose）
ComposableからActivityを取る正規の方法が分からなかったため

※ Build.VERSION_CODES.R以上が必要だったりしますが、記事では省略しています。

## 終わりに

なんかたまにボタンがチラついて見える場合があって気になる...
試行錯誤して作ったんですが、もっと一般的な方法があるのかもしれない
X86 ORG命令の本質

## 実験目的
ORGは自分の書いたプログラムがメモリ上のどこに読み込まれるかを指定する命令です。
ブートローダーであれば7c00、MSDOSのCOMファイルなら100等、余り意識せずに書いてきましたが実際どんな機械語が生成されるのか気になったため、検証してみました。

## 検証コード
```org1000.asm
org 0x1000

start:
    mov ax, [label]
    jmp $

label:
    dw 0x1234
```
```org2000.asm
org 0x2000

start:
    mov ax, [label]
    jmp $

label:
    dw 0x1234
```

## 逆アセンブリ結果
ORG　1000、2000それぞれをコンパイル後、逆アセンブリした結果が以下になります。
ORGに対応する機械語は存在しないようです。
ソース`mov ax, [label]`の`label`が絶対アドレスに変換されています。
ORGで指定した基準アドレスに、`mov ax,[0x1005]`の機械語`A10510`が3バイト、`jmp short 0x3`の機械語`EBFE`を合わせたアドレスが`label`の絶対アドレスとなっていることが確認できます。

```
ubuntu@ubuntu:~/kaihatsu/org$ nasm -f bin org1000.asm -o org1000.bin
ubuntu@ubuntu:~/kaihatsu/org$ ndisasm -b 16 org1000.bin
00000000  A10510            mov ax,[0x1005]
00000003  EBFE              jmp short 0x3
00000005  3412              xor al,0x12
ubuntu@ubuntu:~/kaihatsu/org$ nasm -f bin org2000.asm -o org2000.bin
ubuntu@ubuntu:~/kaihatsu/org$ ndisasm -b 16 org2000.bin
00000000  A10520            mov ax,[0x2005]
00000003  EBFE              jmp short 0x3
00000005  3412              xor al,0x12
ubuntu@ubuntu:~/kaihatsu/org$ 

```
AWS CloudShellのPythonバージョンを上げる方法

個人的な備忘です。
デフォルトのPython 3.9はちょっと古すぎる😅

# アプデ手順

```zsh: CloudShell
# Python 3.12をインストール
sudo yum install python3.12

# シンボリックリンクを修正
sudo ln -sf /usr/bin/python3.12 /usr/bin/python3

# pipもアップグレード
sudo python -m ensurepip --upgrade
```


# 何が嬉しいの？

- Lmabdaレイヤーをマネコンでサクッと作るとき
- 新しいPythonライブラリを実行したいとき



# 参考文献

DENETさん、ありがとうございます！

https://blog.denet.co.jp/adcale2024_cloudshell-lambda/