OmniAICreator/Qiita-1.07M huggingface dataset:
iPhoneからMacOSにファイルをコピーする

# 確認した環境

- iMac Late 2015 + Sonoma 14.2.1
- iPhone SE2 + iOS 17.6.1


# 手順

## libimobiledeviceをインストールする

brew でインストール
セルフビルドは🦑などを参考

https://qiita.com/ta_yano/items/33195f8887fb1e32baac

## Xcodeのプロジェクトを作る

Create New Project
 -> macOS
  -> App -> 適当な場所に適当な名前で作成

### Bridging-Header.h とか

```objc
#ifndef Bridging_Header_h
#define Bridging_Header_h

#include <libimobiledevice/libimobiledevice.h>
#include <libimobiledevice/lockdown.h>
#include <libimobiledevice/afc.h>

#endif /* Bridging_Header_h */
```

Build Settings -> All
 -> Objective-C Bridging Header (`[プロジェクト名]/Bridging-Header.h`などを入力)

Build Settings
     -> Library Search Paths (`/usr/local/lib`)

Build Settings
     -> Header Search Paths (`/usr/local/include`)

Build Settings
     -> Other Linker Flags (`-limobiledevice-1.0`)

Build Settings
     -> Architectures 
       -> `$(ARCHS_STANDARD)` -> `x86_64`

## コードを書く

以下参照

https://github.com/tyano463/iphone_copy

# ビルドして実行

![スクリーンショット 2025-06-10 16.57.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3786381/54c12dca-2de0-441f-967b-bf567050cb70.png)

D&Dするとこんな感じでコピーできる
```
[ContentView.swift:256] copyFromIPhoneToMac(from:to:): copy //iTunes_Control/Music/F05 -> /Users/tyano
[ContentView.swift:249] copy_inner(using:from:to:): copy done //iTunes_Control/Music/F05/TTNW.m4a -> /Users/tyano/F05/TTNW.m4a
[ContentView.swift:249] copy_inner(using:from:to:): copy done //iTunes_Control/Music/F05/CEHQ.m4a -> /Users/tyano/F05/CEHQ.m4a
[ContentView.swift:249] copy_inner(using:from:to:): copy done //iTunes_Control/Music/F05/XRGK.mp3 -> /Users/tyano/F05/XRGK.mp3
[ContentView.swift:249] copy_inner(using:from:to:): copy done //iTunes_Control/Music/F05/SOQB.m4a -> /Users/tyano/F05/SOQB.m4a
[ContentView.swift:249] copy_inner(using:from:to:): copy done //iTunes_Control/Music/F05/ZQQI.m4a -> /Users/tyano/F05/ZQQI.m4a
```

```
tyano@macnoiMac ~ % ls -alrt ~/F05
total 93168
drwxr-x---+ 27 tyano  staff       864  6 10 16:57 ..
-rw-r--r--   1 tyano  staff   8460562  6 10 16:57 TTNW.m4a
-rw-r--r--   1 tyano  staff   8498602  6 10 16:57 CEHQ.m4a
-rw-r--r--   1 tyano  staff   9466819  6 10 16:57 XRGK.mp3
-rw-r--r--   1 tyano  staff   9588277  6 10 16:57 SOQB.m4a
drwxr-xr-x   7 tyano  staff       224  6 10 16:57 .
-rw-r--r--   1 tyano  staff  11679783  6 10 16:57 ZQQI.m4a
```

# その他

D&Dの反応がめちゃくちゃ悪くて10回くらい掴まないと反応しないんだけど
なんでだろう
nDisplayのあれこれ備忘録

# Shipping時に投影先にMeshを使用するには
投影先に使用したいStaticMeshの詳細からAllow CPUAccessを設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/559d507f-f9cc-4489-a5b4-e2d0f2a81be7.png)

# MRQでメッシュ投影を使う際の書き出し時の注意
画像の場合はJPEGで書き出す(png非対応）（※5.4以下時に確認）
5.6のmp4書き出しは対応

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/c56cecac-074d-40d4-ab73-36550ce4216f.png)
ゲームクリエイターになったら ～ 私の理想のゲーム制作と伝えたいこと

大学を卒業してから、今まで約2年間ゲーム会社で働いてきました。
さまざまなゲームの開発に関わる中で、良い経験もあれば、悪い経験もたくさんありました。

ゲームは楽しいものですが、「どうすれば楽しく遊べるか」については、人それぞれ意見が違います。
私は「ゲームはシェアしてこそ楽しい」と思っています。友達と一緒に遊ぶだけでなく、その体験を誰かに話したり共有したりすることも、とても楽しいことです。

ゲームを作るとき、私はいつもプレイヤーのことを考えています。たとえば、「HoloPoker（ホロポーカー）」というゲームを作ったときは、常にhololiveのファンのことを意識していました。

そして、昔の上司が言っていた「ゲームには必ず簡単な操作が必要だ」という言葉を大切にしています。
人生だけでも十分に大変なのに、ゲームまで難しかったら、もう疲れてしまいますよね。

さらに、意外とみんなが忘れがちなこととして、「手に入れやすい端末でプレイできること」があります。つまり、できるだけ多くの人が持っている端末向けにゲームを作るのが良いということです。
たとえば、Linuxはとても優れたシステムで、私自身もよく使っていますが、一般の人はあまり使っていないですよね？
そのため、せっかく一生懸命作ったゲームも、誰にも遊ばれなくなってしまうかもしれません。

以上が、私が今までに得た経験です。
もしあなたもゲーム作りに興味があるなら、ぜひ一度チャレンジしてみてください!
Androidアプリの配布方法まとめ【用途別・形式別に解説】

# Androidアプリの配布方法まとめ【用途別・形式別に解説】

Androidアプリの配布には、目的や対象ユーザーに応じて複数の方法があります。この記事では、一般公開から社内配布まで、代表的な方法を用途別に整理して解説します。

---

## ✅ 一般向け公開（パブリック）

### 1. Google Play ストア
最も一般的な方法です。

**メリット**
- ユーザーからの信頼性が高い
- 自動アップデートが可能
- Google Play Consoleでアプリの配信・管理が容易

**デメリット**
- 初回登録費用（25ドル）
- 審査が必要（数時間〜数日かかる）

---

### 2. 他のアプリストア
Amazon Appstore、Huawei AppGallery、Samsung Galaxy Store など。

**メリット**
- 特定地域や端末への訴求力がある

**デメリット**
- 各ストアごとに審査や手続きが異なる

---

## ✅ クローズド配布（テスト・社内利用）

### 3. Google Play Internal / Closed / Open Testing
Google Play Consoleの機能で、テスト目的の配布が可能です。

**メリット**
- 限定されたテスターへの配布が安全に行える
- テスト結果やフィードバック収集に適している

---

### 4. APKファイルの直接配布
APKをクラウド、Web、メールなどで手動配布する方法です。

**メリット**
- 手軽で即時配布が可能

**デメリット**
- ユーザーに「提供元不明のアプリ」のインストール許可が必要
- セキュリティリスクやアップデートの手間がある

---

### 5. Firebase App Distribution
GoogleのFirebaseを使って、テスターに向けて配布できます。

**メリット**
- テスター管理がしやすく、UIも直感的
- 複数端末への配布が簡単

**デメリット**
- Firebaseプロジェクトの設定が必要

---

## ✅ エンタープライズ用途（社内アプリ配布）

### 6. Managed Google Play（Android Enterprise）
MDM（モバイルデバイス管理）と連携して社内配布が可能です。

**メリット**
- アプリの配布・更新・削除を一元管理できる
- 特定端末への自動インストールや権限制御も可能

**デメリット**
- MDMサービスの導入・運用コストがかかる

---

## 📝 配布方法 まとめ表

| 方法                          | 対象ユーザー     | メリット                     | 注意点                         |
|-------------------------------|------------------|------------------------------|--------------------------------|
| Google Play ストア            | 一般ユーザー     | 信頼性・自動更新             | 審査あり、登録料あり           |
| 他アプリストア                | 特定地域/端末    | 多様なマーケットに対応       | 審査・対応がストアごとに異なる |
| Google Play テスト配布       | テスター         | 安全・簡単に限定配布可能     | Googleアカウントが必要         |
| APKファイル直接配布           | 限定ユーザー     | 手軽・即時配布可能           | セキュリティリスク・手動更新   |
| Firebase App Distribution    | テスター         | 管理しやすく柔軟             | Firebaseの設定が必要           |
| Managed Google Play（企業）   | 社内ユーザー     | MDMで一括管理可能            | MDM導入・設定が必要             |

---

## 🎯 まとめ

- 一般公開したい場合は **Google Play ストア** が最も安心で標準的な手段です。
- テストや限定公開の場合は **Firebase App Distribution** や **Google Playのテスト機能** が便利です。
- 社内用途では **Managed Google Play** と MDM の組み合わせでセキュアに運用できます。
- すぐに配布したいだけなら **APK直接配布** もありですが、セキュリティ面には注意。

---
Jetpack Compose × Camera × QRコードスキャンのためのライブラリ活用まとめ

# Jetpack Compose × Camera × QRコードスキャンQRコードを読み込むアプリを作成

今回は、Jetpack Compose を使った Android アプリ開発で利用したライブラリについてまとめてみました。  
特に、カメラ機能や QR コード読み取りを実装したい方の参考になればと思います。

---

## 📦 使用ライブラリ一覧とその用途

### 🧱 1. Jetpack Compose 基本構成

| ライブラリ | バージョン | 用途 | ライセンス | 商用利用 |
|-----------|------------|------|------------|------------|
| `androidx.activity:activity-compose` | 1.7.2 | `setContent {}` で Compose UI を表示 | Apache License 2.0 | ✅ 可能 |
| `androidx.lifecycle:lifecycle-viewmodel-compose` | 2.6.1 | ViewModel を Compose から使う | Apache License 2.0 | ✅ 可能 |
| `androidx.compose.material3:material3` | 1.2.0 | Material Design 3 の UI コンポーネント | Apache License 2.0 | ✅ 可能 |
| `androidx.compose.ui:ui` | 1.5.0 | 基本 UI 構築（Column, Row, Textなど） | Apache License 2.0 | ✅ 可能 |
| `androidx.compose.ui:ui-tooling-preview` | 1.5.0 | プレビュー機能付きのデザイン確認 | Apache License 2.0 | ✅ 可能 |


---

### 🔄 2. 非同期処理・ライフサイクル対応

| ライブラリ | バージョン | 用途 | ライセンス | 商用利用 |
|-----------|------------|------|------------|------------|
| `kotlinx-coroutines-android` | 1.7.1 | 非同期処理（例：ViewModel で API 呼び出し） | Apache License 2.0 | ✅ 可能 |
| `lifecycle-runtime-ktx` | 2.6.2 | `lifecycleScope` による簡単なライフサイクル制御 | Apache License 2.0 | ✅ 可能 |


---

### 📷 3. カメラ制御（CameraX）

| ライブラリ | バージョン | 用途 | ライセンス | 商用利用 |
|------------|------------|------|------------|------------|
| `camera-core` | 1.3.1 | カメラの基本制御 | Apache License 2.0 | ✅ 可能 |
| `camera-camera2` | 1.3.1 | Camera2 API ベースの拡張 | Apache License 2.0 | ✅ 可能 |
| `camera-lifecycle` | 1.3.1 | ライフサイクルと連動したカメラ制御 | Apache License 2.0 | ✅ 可能 |
| `camera-view` | 1.3.1 | プレビュー表示に対応したUIコンポーネント | Apache License 2.0 | ✅ 可能 |


---

### 📱 4. QRコード読み取り（ML Kit）

| ライブラリ | バージョン | 用途 | ライセンス | 商用利用 |
|------------|------------|------|------------|------------|
| `com.google.mlkit:barcode-scanning` | 17.2.0 | QRコードやバーコードをスキャンするためのライブラリ（ML Kit） | Apache License 2.0 | ✅ 可能 |

---

### 🔀 5. 画面遷移とアニメーション

| ライブラリ | バージョン | 用途 | ライセンス | 商用利用 |
|------------|------------|------|------------|------------|
| `navigation-compose` | 2.7.7 | Jetpack Compose 専用のナビゲーション | Apache License 2.0 | ✅ 可能 |
| `accompanist-navigation-animation` | 0.34.0 | スライド・フェードなどの遷移アニメーションを追加可能 | Apache License 2.0 | ✅ 可能 |


---

## ⚖️ ライセンスと利用条件

これらのライブラリは主に **Apache License 2.0** に基づいており、以下のような特徴があります：

- ✅ **商用・非商用ともに利用可能**
- ✅ **改変・再配布可能**
- ❗ **著作権とライセンスの記載保持が必要**
- ❗ **改変した場合は、その旨の明記が必要**

---

## 🔗 関連リンク

- [Jetpack Compose 公式ドキュメント](https://developer.android.com/jetpack/compose)
- [Google ML Kit Barcode Scanning](https://developers.google.com/ml-kit/vision/barcode-scanning)
- [Accompanist GitHub リポジトリ](https://github.com/google/accompanist)
ノーコードからプログラマー転職で得た4つの経験と2つの苦労

## はじめに
こんにちは！TOMON_9912です！
今回は以前ノーコードエンジニアだった私がプログラマーに転職して感じたこと・ノーコードエンジニアを経由してよかったこと・大変なことを共有していこうと思います！

## ノーコードエンジニアを経験してよかったこと

私がノーコートエンジニアを経由して良かったと感じることは以下の3点です。

### 上流工程に誰よりも早く参画できた
ノーコード開発ツールの習得はそこまで時間がかからないため、一貫した開発ができるようになるためのコストがあまりかかりません。そのおかげで、当時、新卒二年目にして小さいプロジェクトながら**要件定義〜リリース**までを一通り経験することができました。

### テックリード枠で経験を積めた
私が入社した時期、ちょうどノーコードの導入時期だったため、私が拠点内で初めてこのツールを扱う人間に運良くなることができました。

その結果、同社別拠点の方や別PJからも頼られるようになり、「ノーコードでわからないことがあればあの人に聞いたらいいよ」と言ってもらえるような立場にまでなれました。また、一年目にして先輩社員の方にこのツールやRDBに関する研修を任せていただけるようになり、年齢に対してかなり良い経験をすることができたと思います。

かなり早い段階で有識者枠になれるため、上流工程やマネジメントをいち早く経験したい場合はおすすめのキャリアかもしれません。

### マネジメントに対する知見を得ることができた
人よりも技術的に覚えることが少なかったため、プロジェクトマネジメントに関して早い段階で興味を持つことができました。上述の通り、テックリード枠を勝ち取ることができたため、入社二年目にしてWBSの作成やプロジェクトルールの策定、コーディングルールのようなものを作成したりとマネジメントやリーダー業務に関する知見や経験を得ることができました。

### 要件定義〜リリースまでを担当できる案件が多い
上述の通り、要件定義〜リリースまでを担当できる案件が多かったです。
若手だとこのような経験はあまりできないため、これは貴重な経験をさせていただいたと思います。

## プログラマーに転職して大変だったこと
### プログラミングスキルが経験年数に対して少なくなる
業界歴に対してスキルが未熟なため、コーディングスキルがネックになります。
平日は定時後2時間、休日返上して勉強を一ヶ月続けてやっとある程度自走して開発ができるようになりました。

### キャリア形成が難しい
転職市場では、PG言語ベースで考えられていることが多いです。
PG言語を用いた開発経験がないため、開発経験年数も積めていないとみなされることもあり、転職市場での立場はあまり強くありません。
現職に転職した際も半分未経験枠のような形で入社させていただきましたので、運が良ければ製造から、悪いとテスターから再スタートする可能性があります。そのため、一度キャリアを戻す覚悟が必要かもしれません。ただ、一通り経験している状態で案件に参画できるため、信頼の得方やどのような立ち回りが喜ばれるかを理解した上で行動できるのでそこは強みに働くと思います。


## まとめ
あまりないキャリアなので役に立つ方もいるかもしれないと思い、こちらの記事を書いてみたのですがいかがだったでしょうか？どのようなキャリアに進んだとしても、今できること、今積むことができる経験を見極めて一生懸命泥臭く仕事をすることでさまざまな経験を積むことができると思います。
ROKS 4.15以降でOperatorHubに必要なOperatorが存在しなかったら

ROKSでは 4.15以降で [`Secure by Default Cluster VPC Networking`](https://cloud.ibm.com/docs/openshift?topic=openshift-vpc-security-group-reference) という新しいセキュリティー機能が導入され、デフォルト状態ではクラスターが機能するために必要なトラフィックのみが許可され、その他のアクセスはすべてブロックされるようになりました。 

そのため、OperatorHubにも最低限のOperatorしか存在しません。今回のクラスター(OCP 4.16) の場合は下の画面例のとおり6つだけでした。

デフォルト状態のOperatorHub画面例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/9ee03960-fbba-43c1-918b-cd047a26f264.png)

IBM CloudコンソールでクラスターのOverview画面を見ると、`Outbound traffic protection enabled` が ON になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/8e43224e-ed21-4019-bf1c-43ee0e74daf1.png)

## 通常どおり OperatorHub を使えるようにする

他のOperatorも使えるように設定を変更します。[Red Hat Marketplaceと OperatorHubへのアウトバウンドトラフィックを許可する](https://cloud.ibm.com/docs/openshift?topic=openshift-sbd-allow-outbound&locale=ja#sbd-example-oh) の手順を実行します。
＊ すべてのアウトバウンド・トラフィックを有効にする方法を実行しています。

１．IBM Cloud Shell で次のコマンドを実行します。
 ```
 ibmcloud oc vpc outbound-traffic-protection disable --cluster CLUSTER
 ```

このコマンドを実行したことで、IBM Cloudコンソールからも `Outbound traffic protection` が disabled になったことを確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/46a967d8-fabd-46ac-a59b-2aaa48096f8d.png)


２．クラスタ上の OperatorHub に次のコマンドでパッチを適用して、podを起動できるようにします。

```
oc patch OperatorHub cluster --type json -p '[{"op": "remove", "path": "/spec/disableAllDefaultSources"}]'
```

```text:(参考) patch前
$ oc get OperatorHub cluster -o yaml
(省略)
spec:
  disableAllDefaultSources: true
status:
  sources:
  - disabled: true
    name: redhat-operators
    status: Success
  - disabled: true
    name: certified-operators
    status: Success
  - disabled: true
    name: community-operators
    status: Success
  - disabled: true
    name: redhat-marketplace
    status: Success
```

```text:(参考) patch後
$ oc get OperatorHub cluster -o yaml
(省略)
spec: {}
status:
  sources:
  - disabled: false
    name: redhat-operators
    status: Success
  - disabled: false
    name: certified-operators
    status: Success
  - disabled: false
    name: community-operators
    status: Success
  - disabled: false
    name: redhat-marketplace
    status: Success
```


```text:(参考) 「podを起動できるようにします」のpod
$ oc get pod -n openshift-marketplace
NAME                                    READY   STATUS    RESTARTS   AGE
certified-operators-qpgjw               1/1     Running   0          58m
community-operators-zh5lc               1/1     Running   0          58m
marketplace-operator-699b5d89fd-4qg2s   1/1     Running   0          70m
redhat-marketplace-57dj6                1/1     Running   0          58m
redhat-operators-vjck9                  1/1     Running   0          58m
```

この作業により、OperatorHubに多数のOperatorが表示され、使用できるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/0175eee3-71a0-487f-b636-0e96d96728b5.png)


## 参考
https://qiita.com/khoshina/items/cd479dc1fbf99462c292
ウェブページをデプロイしたのに更新が反映されない！

## はじめに
HTML + CSSで書いたウェブページを修正してサーバにデプロイしたところ、インターネット経由でページにアクセスしても更新が反映されないという問題が起きたので、その解決までを備忘録的にまとめたいと思います。

## 構成
今回問題が起きたウェブサイトの技術構成は以下の通りです。

| 項目 | 内容 |
|:-|:-|
| サーバ | さくらのVPS |
| OS | Rocky Linux |
| ウェブサーバ | Nginx |
| ウェブページ | HTML + CSS |
| CDN | Cloudflare |

## さっそく結論
早速結論から申し上げます。
構成を見て気付いた方もいらっしゃるかと思いますが、**Cloudflareのキャッシュ更新が遅れていた**ことが原因でした。

## 解決までの流れ
ではここからは、トラブルの発生から解決までの流れをご説明します。

### 作業の流れ
1. ローカルでHTML, CSSを編集
1. SFTPでサーバへアップロード
1. 公開ディレクトリへコピーして公開

### トラブルの概要
- HTMLは更新されて見えている
- CSSが適用される場合とされない場合がある
- &uarr; ブラウザ、OS、インターネット回線によらずどちらの場合もある &larr; *これが厄介！！*
- 開発者ツールでは `style.css` は `200 OK` になっている
- サーバ側の権限管理なども問題なし
- 同じサーバで公開している他のページは問題なし

以上の状態から、次のことが分かります。

### トラブルの状況から分かること
- サーバ側のファイル、設定には問題はない
- 特定のブラウザ、OSによる問題ではない
- インターネット回線による問題ではない

さて、ここで私は頭を抱えました。
いったいどこに問題があるのだろう…？
近くにいた技術に明るい人たちにもいろいろ見てもらいましたが原因は分からず、果たしてどうしたものか…？

### 原因は…？
しばらく考えた末、ある言葉が思い浮かびました。
それが **Cloudflare** です。
はい、これが正解でした。

私のサーバではCDNとしてCloudflareを導入しており、コンテンツが随時キャッシュされています。
このキャッシュの更新に、HTMLファイルとCSSファイルとの間で遅れが生じ、CSSが更新されていないキャッシュサーバからの配信を受けた接続でCSSが正しく反映されていなかったわけです。

## Cloudflareでのキャッシュ更新方法
では、ここからはCloudflareのキャッシュを更新する方法を説明します。
しばらく待っていればCloudflareが自動的に更新してくれるので、わざわざする必要はないのですが、ページが変更できたかすぐに確認したい場合などには手動で更新も可能です。

1\. ドメインのダッシュボードのサイドバーから「Caching」を選択
2\. 「キャッシュをパージ」メニューから「すべてパージ」を選択

![画像1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1046350/672fba7f-6ad2-4970-9997-2bdab81b48cc.jpeg)

3\. 確認のモーダルウィンドウが出てくるので「すべてパージ」をクリック

![Screenshot 2025-06-10 at 11-36-31 Caching 構成 seclab-crea.net Sunrisefuji227@gmail.com's Account Cloudflare.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1046350/98d6789b-5179-4614-85ca-94c489e07c50.png)

:::note info
「カスタムパージ」で特定のファイルのキャッシュだけを削除することも可能です。（今回カスタムパージでは上手くいかなかったのですべてパージしています）
:::

:::note warn
キャッシュをすべてパージすると、一時的にオリジンサーバにトラフィックが集中し、動作が遅くなることがあるようです。サイトの規模などに応じて適切な方法を選択してください。
:::

キャッシュをパージ（削除）が完了した後、すぐに最新のコンテンツがオリジンサーバからキャッシュされ、キャッシュサーバ経由でもページが正しく表示されるようになります。

## おわりに
さて、今回はCloudflareのキャッシングによるウェブサイトのトラブルについてまとめました。
CDNはとても便利ですが、いろいろトラブルが起きるのですね…。
まだまだCloudflare初心者なのでお許しください。

ところで、CSSだけキャッシュが更新されなかったのはなぜなんでしょうね。詳しい方がいらっしゃれば教えてください m( _ _ )m

お読みいただきありがとうございました。
HSPでAWS Lambdaを作成する（その3・完）

[これ](https://qiita.com/kijuky/items/295273e3127c1857c70f)の続き。

デバッグしたところ、hsp3clで環境変数HOMEを取得する処理があったが、AWS Lambdaには環境変数HOMEが設定されておらず、NULLが返ってきて（おそらくmemcpyで）セグメンテーションフォールトが起こる、という流れだった。

https://x.com/kijuky/status/1932320904366920057

辛かったのが、デバッグ中はセグフォが起こる原因がわからなかったので、オブジェクトファイルを1つずつリンクを外していったり、デバッグプリントをしたりを逐一本番Lambdaにデプロイして確認するのが辛かった。原因がわかれば、rieでも再現可能なんだけどね。。。

というわけで、環境変数HOMEをLAMBDA_TASK_ROOTで設定することで、起動するようになりましたとさ。

https://github.com/kijuky/docker-openhsp-linux/blob/main/amazonlinux2/lambda/bootstrap#L4

エコーサンプルは、以前の記事で共有したリポジトリを参考にしてください。

https://github.com/kijuky/hsp-lambda
共用機に入ったOFFICEで注意すること

ある工場拠点の複数人で使う共用機をキッティングしています。
ActiveDirectoryでポリシーなどが管理されており、WindowsUpDateも管理されています。

各アカウントにはOFFICE365で使えることいなっておりますが、
この機体については指示でもともと機体にインストールされていたOFFICE2021を使うことになっています。

キッティングの手順書にはOutlookのメールの設定とアカウント設定の両方が書いてあります。

## 誤認：IDごとに紐づいているIDが違うということ
| ログインＩＤ・パスワード| それに紐づいたＯＦＦＩＣＥ |
|:-:|:-:|
|  会社付与のログインＩＤ・パスワード （@--co.jp）|  ＯＦＦＩＣＥ３６５ |
| 　共用機専用ＩＤ・パスワード （@outlook.jp） | ＯＦＦＩＣＥ２０２１  |


まず昔この機体に入っていたOFFICEを復活させるために
https://setup.office.com/?ms.officeurl=setup

<img width="450" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/e5e6db23-a779-4480-8ac6-884e40536355.png">
に飛んで、共有機用に別途アカウントを作成して
OFFICE2021のプロダクトキーの入ったPC専用箱を探してその中からOFFICEのDVDケースを探して
プロダクトキーを入手した。


初回にログインした際、エクセルのアカウント開き
下のように2021になっておらず、OFFICE３６５になっていたので、
右上にOFFICE365と見えたのでライセンスを切り替えないといけないと思い、
ライセンス切り替えをクリックして、**個人のIDを入れてしまった<font color="red">（ここで誤認）</font>**


<img width="450" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/2f03784b-9144-4721-8dd4-d1ce7b2b63c4.png">

３６５のダウンロードが始まった。

自分では３６５ではなく２０２１にダウンロードが始まったと勝手に勘違い。
もともとMicrosoft製品を開始するサイトからプロダクトキーをいれて
OFFICE２０２１をダウン路どしているにも関わらず

余計なことをやったおかげで共用機を使うすべてのアカウントで使う３６５をあらためてインストールしてしまった。
ダウンロードとインストールが完了してから３６５になっていることに気が付いて、最初はアカウントに紐づいているということを何度か自分でも口走っているのに実態が分かっていなかった。

きちんとした理解は大切です。

この失敗をここに残して自分の今後の戒めとします。

追記：メールアドレスは会社のアカウントをきちんと設定しました。

追記２：やはり自動でログインする機能があるらしく
Edgeでもこんな表示がでました。
<img width="450" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/e77b7769-521f-4131-997e-9dc53340efcd.png">

うちの会社はActiveDirectoryで管理されているので、IDを入れて同期することはできないにで、
すぐにサインアウトしました。（自動の機能は便利だけど勝手に設定しちゃうのでわからないときは余計に手がかかります）

追記３
他のIDでもサインインの間違いがあって
<img width="550" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/f876b761-7ae2-499d-9207-0bb97b542f59.png">
個人の会社IDではいってさらにサインアウトしてoutlook.jpでサインインしているのでちぐはぐになっていました。
アカウントはそのままでライセンス切り替えでプロダクトキーで認証で２買い進むと

<img width="550" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/46f53cbf-3e03-4468-9b88-e3d75ccf2372.png">

きちんとしたOFFICEの紐づけに戻りました。


追加４
さっき仲間に指摘されたけど
**<font color="blue">今使っているアカウントはOfficeダウンロードするための捨てアカウントだから
サインインしないでほしいとのこと。</font>**

もっとさらに詳しく教えてもらった
昔のOfficeはボリュームライセンス（買取型の製品）で買った
（１）アカウントでサインインするか
（２）プロダクトキーを入力するで使用可能となる
（１）（２）どちらの認証でもよい※どちらかで大丈夫

ただしoutlookだけはメールを使用するアカウントでサインインしないと使用できない。


現在のサブスクリプションのOffice365は必ず購入したアカウントに紐づくので、
購入アカウントのみのサインイン。**捨てアカウントをOffice（outlookはログインアカウントでサインイン）外しておくことでプロファイルを同期するきっかけ（トリガー）にもならない。**
React Nativeの実機テストでRails Active Storageの画像にアクセスする方法

# はじめに
ローカル環境にてActive Storageに保存された画像のURLパスを取得したとしても、実機では画像を表示できません。

この原因は、開発環境のデフォルト設定では、Active Storageの画像URLがhttp://localhost:3000/... のようになり、実機からアクセスできないためです。
（ これは実機からAPIを叩く場合でも同じですね ）

この記事では、この問題を解決し、React Nativeの実機からActive Storageの画像に正しくアクセスするための設定方法を解説します。


:::note warn
ここで解説する方法は開発環境向けです。本番環境ではS3などのオブジェクトストレージサービスを利用することが一般的であり、設定方法も異なります。
:::


# 解決策

具体的には ***config/enviroments/development.rb*** を編集していきます。
IPアドレスが必要なので、ターミナルにて以下を実行して取得しておきましょう。

<details><summary>Macの場合</summary>

```
ifconfig | grep "inet "
```

</details>

<details><summary>Windowsの場合</summary>

```bash
ipconfig | findstr "IPv4 アドレス"
```

</details>


IPアドレスの確認後に、以下を追加します。　

```config/enviroments/development.rb
Rails.application.configure do

    # 既存のコード

    # これを追加
    Rails.application.routes.default_url_options = {
        host: 'ここに自分のIPアドレスを追加',
        port: 3000,
        protocol: 'http'
    }

end
```

:::note info

複数人にて開発してる場合や、IPアドレスが良く変更される場合は、環境変数などに、それぞれのIPアドレスを格納するのがいいですね
:::



## 設定後のURLと実機からのアクセス
上記の設定を行うと、Active Storageが生成する画像のURLは以下のように変化します。

変更前: http://localhost:3000/rails/active_storage/blobs/redirect/...
変更後: http://設定したIPアドレス/rails/active_storage/blobs/...

これで、React Nativeの実機からこのURLにアクセスできるようになり、画像が表示されるはずです！

# まとめ
僕自身Railsに入門して間もないですが、とても便利な反面、自動的にこんなことまでしてくれてるのかと驚くことがあります。
何となく使えてるけど.. という点を減らしていけるよう頑張りたいです。
AWS ECS Execを有効化して、Fargateに接続する手順

ECS(Fargate)を使用していると、コンテナの中に入って操作をしたくなることがあると思いますが、昔はコンテナに入ること自体ができなかったそうです。

そこでECS Execという機能が登場し、コンテナにawsコマンドで接続できるようになりました（2021年3月に発表）
  
マネジメントコンソールではECS Execの有効化に対応しておらず、いくつか手順が必要なので流れをまとめてみました。

必要な手順は以下の通りです。
1. タスク定義のオプション追加
2. サービスのECS Exec有効化
3. IAMロールにSSM Session Managerのポリシー追加
4. タスク定義にタスクロールを追加
5. Fargateのコンテナに接続する

## 前提
- タスク・サービス作成時に有効化するのが楽かもしれません
- 私はすでにタスクとサービスを作成済みなので、作成後のECS Exec有効化の手順をまとめます

## タスク定義のオプション追加
ECS Execのドキュメントによると、
> タスク定義パラメータ initProcessEnabled を true に設定すると、コンテナ内で init プロセスが開始されます。この結果、見つかったゾンビ SSM エージェントの子プロセスはすべて削除されます。

とのことで、無駄にプロセスを残さないための設定のようです。ECS Execを使うに当たり設定必須ではないですが、特に長時間動作するようなコンテナでは設定しておいた方がいいと思います。

私はすでにタスク定義がJSON形式で管理されていたので、そこに以下のオプションを追加しました。

コンソールマネジメントで追加する場合も「JSONを使用した新しいリビジョンを作成」から追加できると思います。

```json
"containerDefinitions": [
    {
        "linuxParameters": {
            "initProcessEnabled": true
        }
    }
]
```

## サービスのECS Exec有効化
タスク定義のJSONがあれば、以下を追加します。
```json
"enableExecuteCommand": true
```

あるいは、以下のコマンドでもいけます。
タスクの再起動まで必要なので、`--force-new-deployment`します。

```bash
aws ecs update-service \
    --cluster <クラスター名> \
    --service <サービス名> \
    --enable-execute-command \
    --force-new-deployment
```

有効化できていること自体はコンソールマネジメントから確認できますので、実行中のタスクの設定を見てみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4024570/160aba3b-f7ea-480d-83ab-93201773969f.png)

## IAMロールにSSMのポリシー追加
ECS Execのドキュメントによると、
> ECS Exec は、AWS Systems Manager (SSM) セッションマネージャーを使用して実行中のコンテナとの接続を確立し、

とのことで、ECSのロールにSSMのSession Managerの権限を付ける必要があります。
ポリシーの付与が必要なのは、実行中のタスクが使用する`Task Role`です。

私は以下で設定しました。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssmmessages:CreateControlChannel",
                "ssmmessages:CreateDataChannel",
                "ssmmessages:OpenControlChannel",
                "ssmmessages:OpenDataChannel"
            ],
            "Resource": "*"
        }
    ]
}
```
:::note info
- Session Managerを使うに当たって、プラグインのインストールが必要です
- CloudShellでは、必要となるコマンドを打つと自動的にインストールしてくれました
:::

## タスク定義でタスクロールを指定
作成したタスクロールをタスク定義で指定する必要があります。これはJSONでも、コンソールマネジメントでも設定できます。

:::note warn
「タスク実行ロール」ではなく、「**タスクロール**」なので要注意です。
:::

```json
{
    "taskRoleArn": "arn:aws:iam::your-account:role/ecsTaskRole",
}
```

## コンテナに接続
Dockerを使って開発をされている方ならおなじみの`docker exec -it <コンテナ名> /bin/bash`のように接続するイメージですね。

コマンドは、以下の通りです。

```bash
aws ecs execute-command --cluster <クラスター名> \
    --task <タスクARN> \
    --container <コンテナ名> \
    --interactive \
    --command "/bin/bash"
```
:::note warn
タスクARNは、タスク定義ではなく実行中タスクのARNです。
:::

## 参考資料
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs-exec.html
【ChatGPT】“自分の新しい人生を選びたい”と思う人のためのPromptです。


　どうも、カーブミラーです。

　今回は、“自分の新しい人生を選びたい”と思う人のためのPromptです。

:::note info
本記事は、ChatGPT（Plus版）
で行なっております。
画像はありません。あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　こちらも載せますね。
　　[ChatGPTが使えない？ログインできない・反応しない原因やエラー時の対処法を解説](https://aismiley.co.jp/ai_news/chatgpt-error-resolution-explanation/)
***
　著作権法については
　　こちらを参照するのが
　　　良いのではないかと。

　文化庁レポートをもとにした
　　著作権法についての動画（約20分）
　　　[かいちのAI大学　【警告】ChatGPTの画像生成は危険です...【4o Image Generation】](https://youtu.be/8VLUnG-iyo0?si=rAfjMboqmNqppDGq)
***
　さっそく、【本題】です。

　今回は、
　　“自分の新しい人生を選びたい”
　　　と思う人のためのPromptです

　とはいえ、
　　ここから新しい人生を選び出す
　　　ものではありません。

　“現実逃避して
　　気分を良くしましょう”
　　　という目的のものです。

　なんせ今日（2025/06/10）の
　　東京は雨で、気分が落ち込んで
　　　仕事も捗りません。

　気分転換しないと
　　やっていられません😅

　ということで
　　Promptをどうぞ。

　使い方は
　　入力して送信するだけです。

　　あとはやり取りになります。

```Text:新しい人生を選びたいPrompt
「自分の新しい人生を選びたい」というテーマで、まったく新しい人生を自由に描いていきたい。今の現実の延長ではなく、場所・名前・生き方・過ごし方などすべてを一から再構成するつもりで、少しずつ丁寧に対話を進めていきたい。
私の気持ちを尊重しつつ、質問を通して想像力を引き出してほしい。詩的でも、実用的でもいい。今の私は、その新しい人生の「物語」を描くことで、自分自身を再発見したいと思っている。
```

　ゆっくりゆっくりと
　　イメージを伝えていって
　　　自分の行きたいところを
　　　　ふくらませてください。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
WordPress × Simple Membership × PayPay を連携して有料会員サイトを作る方法【PHP実装あり】

# WordPress × Simple Membership × PayPay を連携して有料会員サイトを作る方法【PHP実装あり】

## 🔰 はじめに

WordPress の会員管理プラグイン「Simple Membership」と、日本国内で普及している QR コード決済「PayPay」を連携し、  
PayPay決済後に **自動で有料会員登録を行う仕組み**を構築します。

- ✅ 月額制・回数制限なし（都度払い方式）
- ✅ 会員登録を自動化（メール認証リンク付き）
- ✅ Webhook対応で決済後の処理を完全自動化

---

## 🧩 使用技術・前提条件

- WordPress（任意テーマ）
- [Simple Membership プラグイン](https://wordpress.org/plugins/simple-membership/)
- PayPay for Developers（APIキー取得済み）
- Composer（PayPay SDK導入用）

---

## 💳 1. PayPay決済フォームをショートコードで実装

```php
add_shortcode('paypay_payment', 'paypay_payment_shortcode');

function paypay_payment_shortcode($atts) {
    ob_start();
    ?>
    <form method="POST">
        <label>メールアドレス:</label><br>
        <input type="email" name="email" required><br><br>
        <input type="hidden" name="paypay_payment" value="1">
        <button type="submit" name="amount" value="1000">1ヶ月プラン</button>
        <button type="submit" name="amount" value="3000">3ヶ月プラン</button>
    </form>
    <?php
    return ob_get_clean();
}


```
📤 2. フォーム送信時にQRコードを生成
```php

add_action('template_redirect', 'handle_paypay_payment_form');

function handle_paypay_payment_form() {
    if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['paypay_payment'])) {
        $email = sanitize_email($_POST['email']);
        $amount = (int) $_POST['amount'];

        $merchantPaymentId = uniqid("pp_{$amount}_");

        require_once get_stylesheet_directory() . '/shortcodes/vendor/autoload.php';

        $client = new \PayPay\OpenPaymentAPI\Client([
            'API_KEY'     => 'API_KEY',
            'API_SECRET'  => 'API_SECRET',
            'MERCHANT_ID' => 'MERCHANT_ID'
        ], false); // 本番環境

        $payload = new \PayPay\OpenPaymentAPI\Models\CreateQrCodePayload();
        $payload->setMerchantPaymentId($merchantPaymentId);
        $payload->setRequestedAt(new DateTime());
        $payload->setCodeType("ORDER_QR");
        $payload->setAmount(["amount" => $amount, "currency" => "JPY"]);
        $payload->setRedirectType('WEB_LINK');
        $payload->setRedirectUrl(home_url('/thank-you/'));

        $result = $client->code->createQRCode($payload);

        if ($result['resultInfo']['code'] === 'SUCCESS') {
            $url = $result['data']['url'];

            // メールアドレスと紐づけてローカル保存
            $mapFile = $_SERVER['DOCUMENT_ROOT'] . '/paypay_payment_logs.json';
            $map = file_exists($mapFile) ? json_decode(file_get_contents($mapFile), true) : [];
            $map[$merchantPaymentId] = ['email' => $email, 'amount' => $amount];
            file_put_contents($mapFile, json_encode($map, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));

            wp_redirect($url);
            exit;
        }
    }
}

```
📩 3. PayPay Webhookで支払い完了を受信・会員登録

Webhook用ファイル（例：/paypay-webhook.php）を用意します。


✅ まとめ
	•	PayPayとSimple Membershipを連携することで、国内ユーザー向けの柔軟な会員サイト構築が可能です。
	•	QRコード払い＋メール認証によるアクティベーション方式は、定期課金を使わず安全に導入できます。
	•	PayPay決済の導入により、会員数の増加を見込めます。
	•	必要に応じて 返金処理、アカウント状態変更、通知メール強化も可能です。

📌 おまけ：今後の拡張案
	•	merchant_order_id による重複チェック強化
	•	Webhook署名検証（セキュリティ強化）
	•	会員の延長更新（現在は新規登録のみ）


「Simple Membership + PayPayで会員サイト構築したい」という方、気軽にコメントください。
Flutter既存プロジェクト参加時の環境構築手順


今回は、私自身が実務未経験の状態で初めて参加させてもらっている
Flutterプロジェクトにおける環境構築について備忘録を書いていきます。

準備のおおまかな流れしか書いていないのと、プロジェクトごとに必要な環境構築は異なるかと思いますので、あくまでも参考までにご覧ください。

## 前提条件

- Flutterで個人開発できる環境は出来上がっている状態
- iOS開発も含まれるためMac（Xcode）利用

## 1. リポジトリの確認

GitHubのprivate Repositoryに追加してもらい、フォルダ構成を自身がこれまで学習したFlutterプロジェクトと異なる部分がないか確認します。

私の場合は見覚えのないファイルが2つありました。

- `.mise.toml`
- `melos.yaml`

それぞれを調べてみると、miseはバージョン管理。melosはパッケージ管理のものだと分かりました。

詳細は以下の公式を確認するか、偉大な先人たちのありがたい記事をご参照ください。

- [mise公式サイト](https://mise.jdx.dev/)
- [melos公式サイト](https://melos.invertase.dev/)

## 2. 環境構築手順

### 2.1 必要ツールのセットアップ

それぞれを自分のパソコンへセットアップします。

```bash
# miseのインストール
curl https://mise.run | sh

# melosのインストール
dart pub global activate melos
```

> **注意**: インストール後、ターミナルを再起動するか `source ~/.bashrc` （または `~/.zshrc`）を実行してください

### 2.2 プロジェクトのクローンと初期設定

それが終わったら任意の場所にプロジェクトをクローンしてください。

```bash
git clone [プロジェクトのURL]
cd [プロジェクト名]

# miseでFlutterバージョンを確認・適用
mise install

# Melosを使用してパッケージをインストール
melos bootstrap
```

### 2.3 環境変数の設定

その他、必要に応じて環境変数の設定を行います。

私の場合は`.env`にBluetooth設定データが入っていたので、別途情報を共有いただき保存しました。

> **注意**: この時`.gitignore`に該当ファイルが設定されていることを確認した方が安心です

この辺りはプロジェクトの管理者、またはコントリビューターへ確認をお願いします。

## 3. 動作確認

これで基本的にベースとなる環境構築は完了です。

シミュレーターでビルドできるかを確認し、問題なければ開発を進められるはずです。



> **注意**: カメラ機能などを有するプロジェクトの場合、確認は実機でのビルドが必要になります。

## 番外編：iOS実機ビルドのための追加設定

### 推奨方法：Xcode自動管理を使用

1. **App Store Connectへのチーム招待を受ける**
   （もしアカウント自体を持っていない場合は作成→メールアドレスをチームへ共有してください）

2. **Xcodeでプロジェクトを開く**
   ```bash
   open ios/Runner.xcworkspace
   ```

3. **署名設定を自動化**
   - 左側のプロジェクトナビゲーターで「Runner」を選択
   - 「Signing & Capabilities」タブを開く
   - 「Automatically manage signing」にチェックを入れる
   - 「Team」で適切な開発チームを選択

4. **実機での動作確認**
   - 実機をMacに接続
   - `flutter run` を実行

Xcodeが証明書やプロビジョニングプロファイルを自動で管理してくれるため、手動での設定は不要です！

### 手動管理が必要な場合

特別な要件がある場合のみ、以下の手動設定を行います：

1. Apple Developer Portalで開発証明書を発行
2. 実機のUDIDを登録
3. プロビジョニングプロファイルを作成・ダウンロード
4. 証明書とプロファイルをMacにインストール

## 注意事項

- **自動管理を使用する場合**: Xcodeが証明書を自動更新するため、基本的にメンテナンス不要
- **手動管理を使用する場合**: 証明書やプロビジョニングプロファイルは定期的に更新が必要
- 別の実機でテストする場合は、その実機をMacに接続してXcodeで認識させる必要がある

## 補足：Wi-Fi接続での実機ビルド

PCと同一ネットワーク（同じWi-Fi）に接続している実機でも、追加設定を行えば実機ビルドが可能です。

ただし、ネットワークが不安定だとビルドに失敗しやすく、ログ取得が有線より遅いことがあるため、**有線接続が可能なら有線の方がおすすめ**です。

---

以上が基本的な環境構築の流れになります。
プロジェクトによって細かい設定は異なりますが、参考になれば幸いです。
Power Virtual ServerでのNIMサーバーの利用

Power VSへのオンプレ環境の移行方法と、その後のOSのバックアップ方法を検討する。

移行方法の選択肢としては、以下の3つがある。
参考：
柔らか層本
https://ibm.ent.box.com/v/ibmcloud-yawaraka

1. PowerVCのキャプチャー・イメージ
移行後OSのバージョンを塩漬けするのであれば、一度オンプレ環境にてPowerVCでキャプチャー・イメージを取得してPower VSへ転送するだけで良いが、Power VSでのOSのバックアップやメンテナンスも必要であれば別途仕組みを考える必要がある。
またOVA形式のイメージをキャプチャーするため、オンプレ側の環境によっては取得が難しい。

2. mksysb
mksysbについては、オンプレ環境でのクローニングと同等の手順となるため、移行については作業は容易である。
しかしながら、こちらも移行後の運用は別途検討が必要となる。

3. NIM (Network Install Manager)
NIMをオンプレ環境で使用している場合には、移行だけでなく、移行後のNIMクライアントの管理も現行と同様にできるメリットがある。
デメリットとしてはNIMサーバー用のリソースも必要となるため、普段使用していない間もPower VSの費用がかかることであるが、使用していない期間は最小のリソースで稼働させるなどの対応を取ることで費用を抑えることも可能である。

NIMの構築方法はPower VSだからといって特別な考慮点はなく、オンプレ環境と同様の作業となる。
NIMの構築手順は、2025年版に更新されたこちらのガイドが参考になる。

参考：
NIM環境の構築
https://ibm.box.com/s/llsotz4w9akcrssh9qlm76utz85zskgd



その他参考リンク：
https://www.ibm.com/support/pages/node/682655
https://qiita.com/c_u/items/1f748238c6b77aae2538
https://qiita.com/c_u/items/51ca941f4aaa164936e7
https://qiita.com/c_u/items/83700f147d8c750f1b2b
https://qiita.com/hiroyuki_z_tanaka/items/024b215c96b7a8456634
docker compose の環境変数の小ネタ

環境変数は設定されているような状態で，VAR1=$VAR1 みたいな設定は冗長だなと思っていたら，
いい感じにできそうだった

```
$ make
docker compose run --rm app
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=5ef67e50e0bb
TERM=xterm
HOME=/root
env XXX=yyy docker compose run -e XXX --rm app
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=ca8d5914553f
TERM=xterm
XXX=yyy
HOME=/root
env XXX=yyy docker compose run -e XXX --rm appenv
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=1981ac8e49d0
TERM=xterm
XXX=yyy
HOME=/root
```

<details><summary>sources</summary>

```compose.yml
services:
  app:
    image: alpine
    command: env
  appenv:
    image: alpine
    command: env
    env_file: .env
```

```make:Makefile
default: run env-run appenv-run

run:
	docker compose run --rm app

env-run:
	env XXX=yyy docker compose run -e XXX --rm app

appenv-run:
	env XXX=yyy docker compose run -e XXX --rm appenv
```

</details>



## Refs

https://docs.docker.jp/compose/environment-variables.html#docker-compose-run
二次記憶利用ソート

# 状況
Pythonでデータ全部がメモリに乗り切らない状況でsortをする必要があった

# 対策
1. 全データをchunkに分けて二次記憶に入れる, chunkはchunk内部でソートしておく
2. 以下のようなアルゴリズムで二次記憶を利用したソートになる

```Python
def chunk_sort(filenames):
    heap = []
    files = []
    for idx, name in enumerate(filenames):
        f = open(name)
        files.append(f)
        line = f.readline()
        if line:
            heapq.heappush(heap, (int(line), idx)) # (値, どのfileから来たかのindex)

    with open("output.txt", "w") as f:
        while heap:
            value, idx = heapq.heappop(heap)
            f.write(f"{value}\n")
            line = files[idx].readline()
            if line:
                heapq.heappush(heap, (int(line), idx))
        f.close()
```
面接で「オブジェクト指向を説明して下さい」と聞かれてドギマギした話

# はじめに
お世話になっております。sm_beats_keysです。
今回は過去の面接中に心臓が**バク**ついた経験談を交え、エンジニアとして大事だなと思ったことについてお話しさせて下さい！

# オブジェクト指向を説明してください
面接官:「後輩がもし、『先輩！オブジェクト指向ってなんですか？』と聞いてきたら、あなたはなんと答えますか？」

私:「(ﾊｯ!この手の質問...!)...そう、です、ねぇ...モノを、そのまま、クラスなどで？表現する考え方？ですかね？」

面接官「なるほど」

私「(ﾄﾞｷﾄﾞｷ)」

というやりとりがありました。
頭では理解しているつもり！
なのですが、
こういう場で聞かれてスッと答えられない=しっかり整理がついていない
ということやなと思いました。

# GPTに聞いてみた。

**オブジェクト指向ってなんだろう。**

GPTに聞いてみました。

〜以下、回答〜
---
オブジェクト指向は、データ（状態）とそれに関わる処理（振る舞い）を1つの「オブジェクト」としてまとめて考えるプログラミングの考え方です。

現実のものごとを「モノ（オブジェクト）」として捉え、それらを組み合わせることで、全体のシステムを構築していきます。

特徴としては主に3つありまして、
1.	カプセル化：データと処理をオブジェクトに閉じ込め、外部から直接触らせないことで安全性や保守性を高めます。
2.	継承：共通の機能を持つクラスをベースにして、新しい機能を持ったクラスを作ることで、コードの再利用がしやすくなります。
3.	ポリモーフィズム（多態性）：同じ操作であっても、オブジェクトごとに異なる振る舞いができることで、柔軟性のある設計が可能になります。

---

なるほど、
私の面接での回答の貧相さが浮き彫りですね。

**不足していた説明**
・オブジェクトと一口に言っても、データと処理、の2パターンあるという説明
・複数のデータ体(クラス)がお互いに関係し合う、という説明
・カプセル化・継承・ポリモーフィズムの説明

「車」などの具体的なモノを出して説明するともっと分かりやすいですね。

# さいごに
私は思いました。
「これって初学時に読んだ入門書の1番最初に書いてるやつやん...」

大抵のエンジニアの方はこんな質問はあっさり答えてしまうことでしょう。
しかし、以下のような質問ならどうでしょうか。

「ジェネリクスって何？」
「依存がダメってゆうけど、どういう実装が依存している実装なの？」

これも余裕や！というお声も聞こえますが、
大事なのは**言語化**できる、ということかなと面接を通して学びました。

月並みですが
人に教えられるレベルまで理解して、はじめて手足のように有効活用できる
ということなんだろうなと、
そして面接官もそれを意図した上でそういう質問をされているんやろなぁと


以上、ご覧いただきありがとうございました！
【snowflake/Snowpark ML】Snowflake × Snowpark ML における機械学習パイプラインのベストプラクティス

　Snowparkを学ぶにあたりSnowpark MLについても概要を触れていきたいと思い

Snowflake はデータウェアハウスであると同時に、Snowpark ML を用いることで 機械学習モデルのトレーニングや推論も内部で実行することができる。
この記事では、Snowpark ML を用いた機械学習パイプラインの推奨構成と、その背景にある考え方の学習メモです。

## 推奨される機械学習パイプラインの構成
以下は、Snowflake による一般的な推奨事項です。

### 1. モデルのトレーニングは Snowpark 最適化済みウェアハウスで実行
`Snowpark-optimized warehouse`は、Python や ML ベースのワークロードに最適化されています。
fit() 関数を呼び出すと、自動的に Stored Procedure が作成され、Snowflake 内でモデル学習が行われます。
通常の標準ウェアハウスでも実行できますが、最適化済みのものを使うことでリソース効率が向上します。

### 2. モデルの推論はベクトル化された Python UDF で行う
predict() 関数を実行すると、ベクトル化された一時的な Python UDF が生成されます。

推論処理は `multi-node 標準ウェアハウス`上でスケーラブルに実行されるのが理想です。
UDFは軽量で高速、オンライン推論用途にも適しています。

###  3. モデルは Model Registry に保存・管理する
Snowflake では、Model Registry を提供しており、訓練済みモデルを保存・バージョン管理できます。
組織内での再利用や運用もこのレジストリを介して一元化して管理することができる。

### よくある誤解と注意点
誤り: 「モデル推論も Snowpark-optimized warehouse で行うべき」

→ 推論処理には一般的に `multi-node 標準ウェアハウス` が推奨されています。

誤り: 「Model Serving は Python UDTF を使うべき」

→ 現時点での推奨は ベクトル化 Python UDF を使った方式です（predict()で自動生成される）。

### Snowpark ML が自動的に行ってくれること
- fit() → モデル学習用のストアドプロシージャを自動生成
- predict() → ベクトル化された Python UDF を自動生成
- モデルの登録 → Model Registry への保存・管理
- 特徴量の管理 → Feature Store の活用も可能

---
以上、snowflakeでMLを実行する際のトレーニング、推論のベストプラクティスの概要について備忘メモで記載しました。
KotlinとType ScriptでToDoリストを作成

## KotlinとTypeScriptでToDoリストを作成

今回、これまでに使用したことのない言語である、KotlinとTypeScriptを使用してToDoリストを作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4098546/5bcfa120-ccf6-4913-9e67-ec2468dfce97.png)


### 1.環境構築
各言語の環境構築自体はそこまで難しくなかったです。
連携させる方法を調べるのは大変でしたが…

TypeScriptは以下の記事を参考に作成しました。
https://qiita.com/ochiochi/items/efdaa0ae7d8c972c8103

Kotlinは以下の記事を参考に作成しました。
https://qiita.com/suin/items/96799c9f50a31ae54969



### 2.設計
フロントエンド側をTypeScriptとejs、バックエンド側をKotlinで作成しました。
今回作成した機能は、ToDoリストの表示、作成、編集、削除機能を作成しました。（デザイン等はほとんど触っていないので結構汚いです…）
以下が今回作成したファイルとそれぞれの役割になります。

### フロントエンド
#### app.ts
  フロントエンド側のサーバーの起動、バックエンドとの連携を行うクラスです。expressフレームワークを使用する方法で作成しました。ここで使用した技術は以下のものです。(main.tsでも、使用しています)
  
  async
  非同期処理を実行します。この中で、API通信を行っています。
  
  fetch
  KotlinサーバーにHTTPリクエストを送りToDoリストの取得を行います。
  HTTPメソッドの「GET」を使用しています
  
#### main.ts
  画面に入力した項目を、バックエンドに送信する機能を制御するクラスです。HTTPメソッドのうち、「POST」「PUT」「DELETE」を使用しています。

#### index.ejs
  画面の表示を行っています。

### バックエンド

#### Main.kt
 バックエンド側のサーバーの起動、フロントエンドとの連携を行うクラスです。フロントエンドから送られてきたHTTPメソッド、リクエストボディで条件分岐し、ToDoリストの取得、更新、削除処理を呼び出します。
 
#### Todo.Kt
  Todoリストの各値を定義するエンティティです。
  
#### Database.kt
  データベース操作するためのクラスです。ToDoリストの取得、更新、削除を行うことができます。今回DBにはMySQLを使用しました。

### 3.今後の修正点
6月には、KotlinをSpringBootを使用して実装していこうと考えています。また、現在画面を１画面しか作っておらず、そこで表示、編集、削除全て行うようにしているため、編集画面、削除画面も作成しようと考えています。
【仮想環境】Djangoを勉強する初心者がPythonの仮想環境を構築

# 🥽 仮想環境【Python編】

## 🙋 はじめに
Djangoを学習しようと思い、仮想環境を構築する必要があるらしいと知り、ChatGPTさんに聞きながらまとめました。初心者なので間違ってたら修正してください～

## ✅ 仮想環境とは？

- **仮想環境（virtual environment）とは、プロジェクトごとにPython本体やライブラリのインストール先を分離**できる仕組み。
- 他のプロジェクトのライブラリやバージョンと干渉しない、安全な開発環境を作るためのもの。
- グローバル環境に直接インストールするリスク（他プロジェクトの破損）を防げる。

---

## ✅ Pythonの仮想環境構築方法（venv)

### ▶ Step 1：作業ディレクトリを作成
仮想環境を使用したいプロジェクトのフォルダをつくりましょう。
場所はお任せです。

```bash
mkdir myproject
cd myproject
```

### ▶ Step 2：仮想環境の作成

```bash
python -m venv venv
```

- `venv` は仮想環境フォルダの名前。任意だが慣例としてこうすることが多い。

### ▶ Step 3：仮想環境の有効化（activate）

- Windows（cmd / PowerShell）:
    
    ```bash
    venv\Scripts\activate
    ```
<br>
    
- MINGW / Git Bash とか:
    
    ```bash
    source venv/Scripts/activate
    ```
<br>

- 有効化に成功すると、プロンプトが `(venv)` 付きになる。

### ▶ Step 4：Djangoなど必要なパッケージをインストール

```bash
pip install django
```

---
## ✅ VS Codeで自動アクティベートの設定（任意）
上のStep3 activateはフォルダを開いたときに毎回しなければいけません（基本）。
単にフォルダに入るだけでは（venv）のpythonは使われない。
★ **VS Code**でフォルダを開いたときに `activate` するように設定できる。

### ▶ Step 1：.vscode/settings.json を作成

作業フォルダに .vscode/settings.json を以下の内容で作成：

![スクリーンショット 2025-06-10 152409.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713150/fba029f1-e519-4899-9d27-15d3692df0b9.png)


この例ではデフォルトのターミナルをコマンドプロンプトに指定していますが、これはご自由に！
自動activateに必要な`settings.json` の中身は以下 ⇓

```jsonc
{
  "python.defaultInterpreterPath": "venv/Scripts/python.exe", //デフォルトのインタプリタ
  "python.terminal.activateEnvironment": true,  //自動activate
}
```
### ▶ Step 2：ターミナルを再起動
→ (venv) が表示されていれば成功！

### ▶ チェックポイント
- 仮想環境が `venv/` に存在しているか
- VS CodeのPython拡張が有効になっているか
- VS Code最下部に記載のPythonインタプリタが `venv` を使っているか（変更可能）


## ✅ 仮想環境 Q&A

### ❓ 仮想環境の作成時のライブラリ

- 初期状態では以下のみ：
    - `python`
    - `pip`
    - `setuptools`
    - `wheel`
- NumPy や Django などは自分で `pip install` が必要。

---

### ❓ 仮想環境を作ると `python.exe` はどこにある？

- 仮想環境内に専用の `python.exe` がコピーまたはリンクされている。
    - 例：`venv\Scripts\python.exe`
- これを使うことで他のPython環境と分離される。

---

### ❓ どのPythonが使われているか確認するには？

```bash
where python    # Windows
which python    # bash系
```

または Python内で：

```python
import sys
print(sys.executable)
```

→ `venv\Scripts\python.exe` なら仮想環境が有効になっている証拠。

---

### ❓ 仮想環境の概念はPython以外にもあるの？

- **ある！**
    
    多くの言語やツールで同様の仕組みがある：
    

| 言語 / ツール | 仮想環境 or 分離の仕組み |
| --- | --- |
| Node.js | `node_modules`, `nvm` |
| Ruby | `Bundler`, `rbenv` |
| Java | `Maven`, `Gradle` |
| Rust | `cargo` |
| Docker | 言語に依存しない仮想実行環境 |

## おわり
ありがとうございました！
Hyper-V仮想マシンが表示されない・接続できない時の解決手順

# はじめに
使わない人のほうが多いと思いますが、WindowsOSで初めて仮想化環境に触りました。
`Hyper-V`とよばれるものです。細かい説明は省略しますが、なかなか癖のある仮想化システムで、
仮想マシンが突然見えなくなる（起動しなくなる）時があったので、今回はそんな状態になったときの解決方法を記事にします。

# 発生した問題
**解決時間：約30秒〜1分**

**症状:**
・仮想マシンを意図的に停止後、Hyper-Vマネージャーから仮想マシンが消失してしまう

・通常通り、`.vhdx`ファイルは存在している

・Hyper-Vマネージャーから「接続先」にも表示されていない状態

**エラーメッセージ:**
```
サーバー "DESKTOP-XXXXXXX" に接続中にエラーが発生しました。
仮想マシン管理サービスが実行されており、サーバーに接続する権限が与えられているかどうかを確認してください。
```

# 解決方法
## 手順1: サービス管理画面を開く

`Windows` + `R キー`を押したあと、`services.msc` と入力してEnter

## 手順2: Hyper-Vサービスを確認・開始

`services.msc`に入った後、以下の手順で解決できます。
1. サービス一覧から「**Hyper-V Virtual Machine Management**」を探す

2. 右クリックして「開始」を選択

3.サービスが開始されるまで少し待つ

## 手順3: Hyper-Vマネージャーを再起動
Hyper-Vマネージャーを一度閉じて、再度Hyper-Vマネージャーを開く。
そうすると、Hyper-Vが通常通りに戻っているはずです。

立ち上げ時の代替手順して、コマンドラインでも可能です。
管理者権限でcmdを開いて、以下を実行。

```powershell
net stop vmms
net start vmms
```

# 予防策
## 適切な仮想マシンの停止方法

**・仮想マシン内部からシャットダウン**
→ これが最も無難です。私はホストOSから無理やり切ってしまったので、今回のようなことが起きました。
仮想マシンに接続して、OS標準のシャットダウンを実行します。


**・Hyper-Vマネージャーからシャットダウン**
→理由は上記と同様です。仮想マシンを右クリック → 「シャットダウン」をします。



## 避けるべき操作
初めて扱ったとき、私は以下のようなことをしました。アンチパターンですのでご注意ください(´・ω・｀)

**・仮想マシンの強制停止（「オフ」）の多用**

**・Hyper-Vサービスが不安定な状態での操作**

### トラブルシューティング補足
その他のチェック項目として、エラーが出ても慌てないように確認しておきべきことです。

**1.Windowsの機能確認**

「Windowsの機能の有効化または無効化」
「Hyper-V」にチェックが入っているか確認


**2.管理者権限での実行**

Hyper-Vマネージャーを「管理者として実行」


**3.PC再起動**

上記で解決しない場合の最終手段



### .vhdxファイルが残っている場合の復旧
仮想マシンが完全に消失した場合でも、.vhdxファイルが残っていれば復旧可能です。
順序は以下のようになります。

Hyper-Vマネージャーで「操作」→「新規」→「仮想マシン」
↓
「既存の仮想ハードディスクを使用する」を選択
↓
残っている.vhdxファイルを指定
 
# 終わりに
わざわざ内容を一読していただいたのに恐縮なのですが、これは共有記事というより**完全に備忘録です。**
ただ、`Hyper-V`は単純な割に操作に苦戦を強いられたのと、`Hyper-V`自体普段触る機会が無いので、こうして記事にしておけば未来の誰かが（自分も含めて）意外に役立つかもしれないと思ったので公開記事化することにしました。

自分なりに調べましたが、往々にして、Hyper-Vの仮想マシンが表示されなくなる問題はHyper-V Virtual Machine Management」サービスの停止が原因です。

同様の問題で困っている方の参考になればうれしい限りです。
では、また今度！

# 参考情報
対象OS:Windows 10/11
Hyper-V: Windows標準搭載版
【DTOとは】


#### DTO（Data Transfer Object）
エンティティの中から必要な値だけを取得したクラス。データを転送する目的で定義されるクラス
だからエンティティの中に例えば、ユーザーエンティティの中に電話番号、氏名、住所、年齢が定義されてて、その中の氏名と年齢だけ使いたいのに、ユーザーごと呼び出したら、いらない電話番号とか住所も取得しちゃう。そうすると処理が重くなるから必要なものだけ欲しい…。そんな時DTOクラスを作れば、氏名と年齢の情報だけ取ってこれる的なイメージ。

#### DAO（Data Access Objec）
データベースなどから「情報を取り出したり、更新したりするための専用のクラス」
リポジトリクラスの子分みたいなやつ。


#### DAOとDTOを「おもちゃ箱」で例えると…
・DAOは「おもちゃ箱の管理人」みたいなもの！ → おもちゃ（データ）がたくさん入っているけど、どれを取り出すか決めて、箱から出し入れする役割だよ。
・DTOは「持ち運び用のおもちゃセット」みたいなもの！ → おもちゃ箱にはいろんな種類のおもちゃがあるけど、外で遊ぶときは全部持って行くのは大変だから、遊びたいものだけを小さなバッグに入れる感じ。

つまり、DAOがデータを取り出す仕事をして、DTOが「必要なデータだけ運ぶためのバッグ」になる。

#### DAOとリポジトリは何が違うの？
DAOとリポジトリ（Repository）は似ているけど、考え方がちょっと違う。
・DAO（データベース専用の管理人） → 「データベースとのやり取りに特化」した人。例えば、SQLを使って「このデータを取ってきて！」って指示する役割。
・リポジトリ（より広い管理人） → DAOを使いながら「データの管理を全般的にする」人。データベースだけじゃなくて、外部APIやキャッシュなども含めて、より抽象的にデータを取り扱う。つまりDAOより偉い人。
簡単に言、 DAOは「データベースのプロ」、リポジトリは「データ全体の管理者」！ リポジトリはDAOを使うことが多いけど、DAOより広い範囲を管理する


下記サイトを参考にしました
[4.2　DAO/DTOパターン | 神田ITスクール](https://kanda-it-school-kensyu.com/java-jdbc-contents/jj_ch04/jj_0402/)
[DAO,DTO,Entity, findAll, findByld - Qiita](https://qiita.com/y-t0910/items/ca879445ee3e8d90ec1c)
海外で Apple ID を作るときは回線が重要

# 経緯

滞在中のカナダにて「海外カナダ版のApple IDを作ってみよう」と思い、PCで https://account.apple.com/ からIDを作ってみようと思いました

ところがメールアドレス認証や電話認証で失敗が続きました

エラーメッセージは「"Your account cannot be created at this time."」なのでこのメッセージで検索する人も多いと思われます

半ばあきらめていましたが、最終的には作れました


# 結論

1. WiFiではなくスマホの回線でつないで作成する（日本で使ってるスマホ回線のローミングでOK。ただしローミングに対応しているかどうかは事前に確認が必要）

1. スマホ回線（ローミングでOK）で作成する場合、現地発行のクレジットカードや現地の電話番号も不要（事前に調べたときはいろいろなWebサイトにて現地クレジットカードが必要だとか、現地の Apple Gift Cardが必要だとか書いてあったが事実ではなく、25ドルも払って現地版 Apple Gift Card を入手する必要は無かった）

1. 電話番号は日本のものでOK。ローミングONにしているとSMSも転送されてくる。ただしWiFi経由で操作しているときは何度やってもアウトの判定だった

# その他に体験したこと

スーパーマーケットなどで買えるApple Giftcardは10ドルからとなっているが、実際には25ドルからしか買えない。

ベストバイ（カナダ）ではどういうわけかApple Giftcardの取り扱いが諸般の事情により無いとのこと

Apple Giftcardの支払いで現地カードでないとダメかもという話を見たが、現地カードでなくてもOKだった（JCBは使えなくてVisaまたはMaster）

# スクリーンショット

で、苦労して作れたApple IDのスクリーンショットが以下です。一部伏字にしております。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/568a683e-b489-4078-b987-9c6ece42c4b4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/d3aef4fb-24d3-45a9-8ba7-8aeb2ae5706b.png)

# 提案

海外旅行のお土産として海外版Apple IDはいかがでしょうか。


---


以上、参考になりましたら幸いです
スクラムマスターの研修で学んだこと

[Scrum.org](https://www.scrum.org/assessments/professional-scrum-master-i-certification)が提供しているスクラムマスター資格「Professional Scrum Master™（略してPSM）」を取得するために研修を受けました。

いくつかあるスクラムマスターの資格でコスパが一番いいのはPSM1なわけですが、試験が英語のみというところが最もネックになっていました。
ところが2025年4月から試験が[日本語に対応](https://www.itpreneurs.co.jp/news/20250403psm/)したことで最大のネックが解消されることに。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526938/16373ca4-8284-4bb6-9262-6d660f8a8b6d.png)

今回は[ITpreneurs（ITプレナーズ）さん提供](https://www.itpreneurs.co.jp/training/psm1/)の研修を受講したのでその中で学んだことを3つ書こうと思います。
# 1.スプリントレビューはデモではない
レビューではスプリントで開発した機能（成果物、インクリメント）について話し合うだけではない。
市場のトレンド・競合他社のプロダクトリリースによる影響など、
ビジネスの最新状況を共有してプロダクトの方向性を話し合う場でもある。
つまり未来・ビジョンについて話し合ってOKということですね。

# 2.スクラムが10人以下を推奨している理由
人数が増えればコミュニケーションパスが二次関数的に増えていくから。
以下の図が視覚的にとてもわかりやすかった。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526938/1ed7a11d-cc07-4c4d-95c1-559ed1537d18.jpeg">
https://images.app.goo.gl/MNxkLdbhdb7DVV4FA

# 3.チームのパフォーマンスの測り方
Googleのチームが作成した4つの指標があり、とても具体的なのですぐに使えた。
https://www.splunk.com/ja_jp/blog/devops/devops-metrics.html


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526938/9407d4ac-57de-411a-b3e4-bbf59e0ac488.png)


# 研修のおかげもあり翌日に試験合格
研修は座学ではなくグループワークが中心で、スクラムの考え方を実践的に理解できる構成となっていました。
試験はスクラムの本質を理解していないと正解できない問題が多かったので、受講して良かったと心底思いました。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526938/439418c3-1e3d-4f31-acaa-01baf0d10a13.jpeg">


# 最後に
ここまでお読みいただきありがとうございます。
スクラムを実践しているけれど体系的に学んだことがない方、これからスクラムを学びたい方、資格を取りたい方に、本研修はオススメです。
全国どこでも受講可能(オンライン受講)なので、興味のある方はぜひチャレンジしてみてください！
https://www.itpreneurs.co.jp/training/psm1/
[Problem] Windows10でロック画面の背景を変えられない

## 症状
- Wondows10で、設定からロック画面の背景を変更しても、結果が反映されない。

## 対策
- 壁紙の設定をリセットし、ロック画面の背景を画像にして固定する。
1. エクスプローラーで以下のパスをコピーして貼り付け
    ```
    %LOCALAPPDATA%\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets
    ```
2. 中にあるファイルをすべて削除
3. 管理者に昇格したPowerShellで以下のコマンドを実行
    ```powershell
    # レジストリのロック画面設定をリセット
    Remove-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Personalization" -Name "LockScreenImage" -ErrorAction SilentlyContinue
    Remove-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Personalization" -Name "NoLockScreen" -ErrorAction SilentlyContinue
    ```
4. .Windows10を再起動する。

## 感想
- ロック画面の背景にWindowsスポットライトを使うとおかしくなる時があります。
- Microsoftの更新プログラムのアウトバンドを一部、ブロックしていた時があったからかもしれないです。
- そもそも、Windowsスポッライトを使う必要はあるのでしょうか？　壁紙を自動的に変える必要はあるのでしょうか？　システムは安定性が重要なはずなので、わざわざ壁紙を変えて不安定な状態をアピールする必要はないと思います。（個人的な意見です）
Apache POI でセルの背景色・文字色を設定したい

Apache POI でセルの背景色・文字色を設定する方法はさまざまありますが、個人的には`IndexedColors`を利用する方法が好みです。

**例: 対象のセルの背景色を赤色に設定**

```java
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
cellStyle.setFillForegroundColor(IndexedColors.RED.getIndex());

Cell cell = ...;
cell.setCellStyle(cellStyle);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/ec92454b-7ffa-fe40-7e4c-76d48f9b336f.png)

**例: 対象のセルの文字色を赤色にする**

```java
Font font = workbook.createFont();
font.setColor(IndexedColors.RED.getIndex());

CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setFont(font);

Cell cell = ...;
cell.setCellValue("This is a pen.");
cell.setCellStyle(cellStyle);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/7ec3477d-5822-06de-b826-41d2b4f7aeb1.png)

**環境情報**

```pom.xml
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.3.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.3.0</version>
</dependency>
```
エラーログ通知の改良について

# はじめに

こんにちは、Gakken LEAPインフラエンジニアの丹羽です。

今回はエラーログの通知を改良した件についてお話ししたいと思います。

# きっかけ

弊社サービスのアプリケーションではログをCloudwatchログに出力しており、エラーログがあった場合は社内チャットツールに通知を飛ばしています。

通知自体にログ内容は含まれないので、AWSコンソールに実際のログを確認しに行く必要があるわけですが、今までは業務のルーチンに含めていたこともありそれほど気にしていませんでした。

しかし先日、アラートが多かった日にふと「これ、面倒だな…」と思ってしまいました。

プログラマーの三大美徳に「怠惰」があるように、面倒と思った気持ちを放置するのは良くありませんし、逆に効率化のチャンスにつながる可能性を秘めています。

というわけで、面倒さが軽減するよう通知を改良してみることにしました。

# 改良方針

既存の構成は下記の通りです。

![previous_alert_flow.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712998/fe089fa4-bc43-4d58-8346-c92763c01015.png)

Cloudwatchログに送信されたログをメトリクスフィルターで検索し、エラーと思われる文言があればカスタムメトリクスに記録します。このカスタムメトリクスを監視するCloudwatchアラームを別途設定し、メトリクスに動きがあればSNSに通知するわけです。

今回、面倒と感じた原因は、通知を見る=>実際のログを確認する、という2アクションが必要な点にあったので、単純に通知内容にログ内容を含めてしまおうと考えました。

Cloudwatchログにはメトリクスフィルターの他にサブスクリプションフィルターという機能があり、こちらはフィルタに該当したログ内容そのものを別サービス（Kinesis, Lambda, OpenSearchなど）に転送することができます。

このサブスクリプションフィルターを使って、改良した構成が下記です。

![current_alert_flow.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712998/0c080469-0f82-47e7-82b1-63238b104ac4.png)

CloudwatchログとSNSトピックの中継ぎをCloudwatchアラームの代わりにLambda関数が担っています。Lambda関数の処理は下記の通りです。

```python
sns = boto3.client('sns')

def lambda_handler(event, context):
    # SNSトピックのARNを環境変数から取得
    topic_arn = os.environ['SNS_TOPIC_ARN']

    # CloudWatchログのデータをデコード&解凍
    compressed_payload = base64.b64decode(event['awslogs']['data'])
    uncompressed_payload = gzip.decompress(compressed_payload)
    log_data = json.loads(uncompressed_payload)

    # エラーログのメッセージを抽出して結合
    error_messages = "\n".join([log_event['message'] for log_event in log_data['logEvents']])
    error_log_group = log_data['logGroup']
    error_log_stream = log_data['logStream']
    subject = "{0}:{1}".format(error_log_group, error_log_stream)

    # SNSに送信
    response = sns.publish(
        TopicArn=topic_arn,
        Subject=subject,
        Message=error_messages
    )
```

ポイントとしては、サブスクリプションフィルターから送られてくるデータはbase64エンコード＆gzip圧縮されているため、デコードと解凍を行ってやる必要があります。

また、エラーログ本文だけでなく参照元のロググループやログストリームの情報も含まれているので、詳細なログ解析などでAWSコンソールに見に行く時のために、これらの情報も通知に含めてあげると親切でしょう。

# まとめ

エラーログ通知にログ本文が含まれるように改良し、AWSコンソールに見に行く手間が省けるようになりました。

実際のところ、これらの通知を一番よく見るのは開発チームなので、今後は開発チームの感想もうかがいながら実用的な通知を目指していきたいと思います。

また、メトリクスフィルター方式の通知はここ以外にもあるので、将来的には横展開してそちらの改良にも活用できればと期待しています。

# エンジニア募集

Gakken LEAP では教育をアップデートしていきたいエンジニアを絶賛大募集しています！！
ぜひお気軽にカジュアル面談へお越しください！！

https://gakken-leap.co.jp/recruit/