OmniAICreator/Qiita-1.07M huggingface dataset:
エンジニアのポートフォリオサイト作ってみた

# はじめに
はじめまして。神奈川県でSEをしているoceantakoです。
自身の経験をまとめるためのポートフォリオを作ってみました。
アウトプットとして作ったものの紹介をしたいと思います。

# 作ったもの
自身の経験/技術をアピールするための静的ポートフォリオサイトです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4030011/fc6fc0de-0d92-4f1f-a031-1fc48955ce24.png)

http://ryo-ryo-taro.com/portfolio/

# 使用技術
bootstrap
javascript(jQuery)
nginx
github
sakura vps

bootstrap,jQueryを用いてフロントのみの静的サイトを作成し、
github経由でsakura vpsにデプロイしました。

# フロント
デザインの大枠はbootstrapのテンプレートを使用しました。
下記から無料で使いやすそうなものを選びました。
https://startbootstrap.com/

テンプレートを元にbootstrapの部品を使用して、自分なりにカスタマイズしました。


# サーバ
1\. サーバはsakuravpsを使用しました。
sakuravpsを選んだ理由は、下記の二点です。
・従量課金制ではないので、値段がわかりやすく安心。
・日本製なので使いやすい。（気がした）

2\. OSはRocky Linuxを使用しました。
選んだ理由はなんとなく名前がかっこよかったからです。
自分が使用したことがあるOSの中では、ubuntuなどの方が使いやすい気がしました。

3\. webサーバはnginxを使用しました。
nginx.confにて、/portfolio/へのアクセスでindexページを返却するように設定。
```
location /portfolio/ {
    root /home/rocky/html/;
    index index2.html;
}
```


# 工夫した点
### レスポンシブデザイン
フロントだけの静的サイトなので、見た目には結構こだわりました。
どんな端末でもきれいに表示されるようなレスポンシブデザインを意識して作りました。
bootstrapの部品はもともとレスポンシブなので、携帯で見てもある程度はきれいに表示されますが、細かいところの調整は必要でしたので調整しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4030011/b4b93370-1a61-4c5e-aa41-e14ed36829b3.png)


### アニメーション
bootstrapテンプレートをそのまま使用しただけのポートフォリオではなく、独自性があるサイトにしたかったので、タイトル横のボタン押下で背景のアニメーションが開始するようにしてみました。

↓緑のボタンを押すと、木が成長するようなアニメーションがスタートします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4030011/d4870a15-b0f0-4a54-8de2-51b55d40f3b6.png)
（ボタンの色によってアニメーションの種類は変わります。）

アニメーションはchatgptに作ってもらいました。
楽しくなって色々なアニメーションを作ってもらいました↓
https://github.com/oceantako/chatgpt-canvas


# さいごに
作成期間は5日ほどでしたが、bootstrapとchatgptを使って結構かっこいいページが作れました！
転職活動の際に、職務経歴書に貼ってみたのですが、面接中にサイトについて触れていただけることも多くて、面接の話題にもなりました。
Reqableで通信を覗く

執筆中です！！
こちらの記事は現在執筆中です。


# はじめに
iPhoneの通信をReqableというアプリを用いて覗いてみたいと思う。
有名どころだとBurpSuiteというツールがあるが、記事が少なかったのでReqableを紹介する。

# インストール
Reqableをインストールします。
ここからiPhoneとMacにそれぞれインストール。
※ intelはx86_64、M1〜はarm64
https://reqable.com/en-US/download


# Mac側設定
1. SSL Enabledにします。(画面右上部にある盾のマークを押すとオンになります。)
ここで証明書のインストールがあります。Automaticのタブの指示に従います。
先ほど押したマークが緑色になればOK。
1. 先ほどの左にあるSystem Proxyのマーク(地球マーク)を押します。
こちらも緑色になればOK。
1. 画面左上部にProxying~~~という文字があるので、その右にあるスマホのマークを押します。QRコードが表示されればMac側の準備は完了。

# iPhone側設定
⚠️ PCで通信を閲覧する場合は1,2,4...の順、iPhoneだけで閲覧する場合3,4...の順で進めること。
1. Work Modes -> Collaborative Mode (recommended)を選択
1. 画面右上の四角のマークからQRコード(Macで表示したやつ)を読み取り
1. Work Modes -> Collaborative Modeじゃない方を選択
1. メニュー -> Certificate Management
-> Install Root Certificate to Loal-Machine
ここで、オレンジ色のDownloadというところから構成プロファイルをダウンロードする。
※このとき標準のブラウザがSafariになっていないとうまくいかない。
1. 設定アプリ -> 一般 -> VPNとデバイス管理
ここにReqable CAという名前のプロファイルがあるはず。これをインストール
1. 次に設定アプリ -> 一般 -> 情報 -> 証明書信頼設定(下の方にある)
ここで先ほどのReqable CAをオンにする
1. ReqableにもどりメニューのTabsからMacを選ぶ。
Macの画面の左上に書かれているIPと同じもの(192.168.0.***:****)を選ぶ。
1. 右上の点が3つのマークからRecord Mode (Proxy)を押す。
ここでVPN Mode is onと出たらOK。
1. 右下の黄色の紙飛行機マークを押す。
1. VPN構成の追加を求めてくるので許可。
1. 準備完了！


# iPhoneだけでも通信を覗ける
実はこのアプリはPCを入れることなく単体でも動く。
メニューのTabs下のTraffic(0)と書かれたところを押すとiPhone単体で通信を覗ける。
またMac(Win)で閲覧したければ、Traffic()の下にあるPCのIP番号を選べば良い。しかし一定時間(数日)でPCのIPが変わるとアクセスできなくなるので、そのときはメニュー上部のQR読み取りからPCで表示したアクセス用のQRを読み込めば良い。
【Mac】コマンドでショートカットを実行する方法

## ショートカットを実行する

```terminal
shortcuts run "ショートカット名"
```

```terminal
shortcuts run "Combine Images"
```

`-i`を使用するとパスを渡せます。

```terminal
shortcuts run "Combine Images" -i ~/Desktop/*.jpg
```

## ショートカットのリストを表示

```terminal
shortcuts list
```

```terminal
$  shortcuts list
ショートカットとは?
休憩する
最新の写真をメッセージで送信
Shazamショートカット
...
```
AWS（S3＋CloudFront）でCDNを構築


## はじめに
現在、SPA (React + Rails API) を活用した個人開発を進めています。フロントエンドのデプロイには AWS の S3 と CloudFront を採用したので、その構成についてまとめました。また、今後の拡張として、CSR (クライアントサイドレンダリング) の課題についても考察します。

## なぜSPAか
SPA を採用した理由として、**ビルド済みのアセットを CDN で配信し、動的なデータのやり取りを API サーバーで処理することで、必要なリソースを最小限に抑え、運用コストを低くできる**点に注目したからです。この構成により、サーバー負荷を軽減しつつ、高速なコンテンツ配信を実現しています。

## システム構成図
全体のシステム構成図は以下の通りです。フロントエンドの構成は赤線で囲った範囲になります。

S3 バケットに React のビルドファイルを格納し、CloudFront を経由して独自ドメインかつ HTTPS 通信でアクセスできる Web サイトを構築しました。特に CloudFront を活用することで、CDN (Content Delivery Network) を構成し、高速なコンテンツ配信を実現できます。

![記事の写真.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3838211/dc1c8ad9-cb08-4248-a5bc-af191f4067bf.png)

## CDN とは
CDN (Content Delivery Network) とは、「Web サイトの表示やコンテンツ配信を高速化するネットワーク」のことです。

### メリット
#### サーバーやネットワークの負荷軽減
CDN では、「エッジサーバー」と呼ばれる代理サーバーが「オリジンサーバー」(今回は S3) に代わってコンテンツを配信します。

エッジサーバーはオリジンサーバーからキャッシュしたコンテンツを保持しているため、リクエストがあるとオリジンサーバーにアクセスすることなくレスポンスを返せます。その結果、ネットワークの負荷を軽減し、応答速度を向上させます。

#### 物理的距離の短縮
CDN のエッジサーバーは世界各地に分散しており、ユーザーから最も近いエッジサーバーがリクエストを処理します。

これにより、ユーザーとサーバーの物理的距離が短縮され、コンテンツの表示・配信速度を向上させることができます。

### デメリット
#### 古いコンテンツが配信される可能性
エッジサーバーが更新前のコンテンツをキャッシュしたままだと、新しいコンテンツが反映されず、古いデータが配信されてしまう可能性があります。

この問題を防ぐためには、**キャッシュの有効期限 (TTL) を適切に設定**したり、**キャッシュを手動で無効化 (Invalidation)** するなどの対応が必要です。

過去には、個人情報が掲載されたページがキャッシュされ、それが削除されずに第三者に見られてしまう「キャッシュ事故」が発生した例もあります。

## 今後の課題と CSR の課題
現在の構成では、ローカルで変更した内容を反映させるには、ビルドファイルを S3 にアップロードし、CloudFront のキャッシュを削除する必要があります。この作業を手動で行うのは煩雑なため、今後は CI/CD を導入し、自動化を進める予定です。

また、SPA では **CSR (クライアントサイドレンダリング)** を採用しており、初回ロード時に JavaScript の読み込みが必要なため、表示速度が遅くなることがあります。特に SEO や SNS でのプレビュー表示を考慮すると、以下の課題が発生します。

- **ページの初回表示速度の遅延**
- **SEO への影響** (クローラーが適切にコンテンツを取得できない可能性)
- **SNS での適切なメタ情報の表示が困難**

このような課題を考慮し、今後はキャッシュの最適化や、場合によっては静的サイト生成 (SSG) などのアプローチを検討していきます。

## さいごに
S3 と CloudFront を活用したフロントエンドのデプロイを実現しました。しかし、キャッシュ管理やデプロイ作業の効率化が課題として残っています。

今後は CI/CD によるデプロイの自動化を進めつつ、CSR の課題を改善し、より快適な Web サービスを提供できるよう改善を続けていきたいと考えています。
負の数の剰余演算(mod)がイメージしづらい方へ

glslｎ学習中に負の数の剰余演算がイメージできなかったので例えを考えました。

 **「借金返済の過払い金」** です。

mod(a, b)とした際に、aを借金額、bを毎月の返済金額と考えます。
例えばmod(-10.2, 1.0)だと、102,000円借金している状態で毎月固定で10,000円ずつ返済していきます。
110,000円払った時に8,000円の過払い金が発生するため、答えは0.8といったイメージです。

誰かの助けになれば幸いです😇
AWSの支払い用クレジットカードを更新する

# はじめに

先日にAWSから「お客様の末尾がXXXXのクレジットカードの有効期限がまもなく切れますが、このカードがデフォルトの支払い方法なので有効期限を過ぎると支払いできなくなります」という趣旨のメールが届き、クレジットカードの有効期限が来るとカード情報の更新が必要となることを知りました。
（クレジットカードの番号と一緒に、セキュリティコードを登録していたことを完全に失念していました）

今回はAWSの支払い用クレジットカードを初めて更新するため、その時の記録を記事としてまとめてみました。

```text:AWSからのメールの一部
Dear Amazon Web Services Customer,

As per our records, the card ending XXXX you have recently used for payments on your account is expiring soon. If this is your default payment method and you don't update your card, any upcoming payment(s) for your account may fail.

...
```

# さらにメールを読んでみる

上記の「はじめに」に載せた部分に続いて、以下のように書かれていました。

どうやら［設定］セクションに移動して、請求コンソールの［支払い設定］でカード情報を更新すれば良さそうです。

```text:AWSからのメールの一部
You can update your card details by going to the ‘Preferences’ section and clicking on the 'Payment Preferences' page of the Billing Console - https://console.aws.amazon.com/billing/home#/paymentmethods.
```

# クレジットカード情報の更新

まず、［請求とコスト管理］のページへ移動します。
ここで画面左側のパネルを下にスクロールさせて...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/2622b465-04c3-4dfa-a899-347aac92406e.png)

［設定］>［支払い設定］を選択すると、［お支払いの詳細設定］と書かれた画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/5a8e277e-3636-49f3-b25d-5cb3a7fd80e1.png)

［お支払いの詳細設定］画面の右側にある［支払い方法の追加］ボタンを押して、新しいクレジットカードの情報を登録（追加）します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/8472528b-2730-4faa-aa77-aa568cdea5b9.png)


［支払い方法を選択］と書かれた画面で、新しいクレジットカードの情報を記入し、［デフォルトの支払い方法として設定］にチェックを入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/2d159225-0a31-41c4-8397-611bc2279529.png)

［支払い方法を選択］と書かれた画面を下にスクロールさせると、さらに［請求先住所］の入力欄が現れますが、ここは［既存の住所を利用］を選択すれば、以前のカード情報とセットで入力した情報が自動的に入力されます。

ここまでの作業が完了したら、［支払い方法を追加］ボタンを押して登録処理を終えます。

# 登録内容の確認

ここまでの登録処理が終わると、［お支払いの詳細設定］画面へと遷移して以下の通知が表示されます。
これにてクレジットカードの更新作業は終わりとなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/53e6169e-db1a-457a-9fd9-e197301a3c53.png)

# 参考URL

（今回は特にありません）
エンジニア2年目の挑戦！Qiitaで学びをアウトプットする理由

初めまして、大手エレクトロニクスメーカー勤務2年目でSEPGのタカタカです。

今日から自分のアウトプット力を高めるために、Qiitaで記事を投稿することにしました！

この記事では、Qiitaを始めた理由について書いていきます。

バックグラウンド

大学時代は化学を専攻していましたが、インターンを通じてIoTの面白さに気付き、気がつけば全く畑違いの会社に就職していました。

とはいえ、大学時代に触れたプログラミング言語はC言語のみ。知識もスキルも乏しいまま、なぜか現在は SEPG（Software Engineering Process Group） という、エンジニアリングプロセスの改善を担当する職種で働いています。

SEPGとは？ → [こちらの記事](https://www.dentsusoken.com/case_report/glossary/sepg.html#:~:text=%E5%93%81%E8%B3%AA%E9%9D%A2%E3%82%84%E6%A5%AD%E5%8B%99%E5%8A%B9%E7%8E%87,%E3%81%A8%E5%91%BC%E3%81%B6%E3%82%B1%E3%83%BC%E3%82%B9%E3%82%82%E3%81%82%E3%82%8B%E3%80%82)

知識をつけるため、

- ITパスポート
- 基本情報技術者試験
- 応用情報技術者試験

と立て続けに挑戦しましたが、今のところ合格しているのは ITパスポートのみ……。

（なぜ試験に受からないのかは、また別の記事で書こうと思います！）

Qiitaを始めたきっかけ

ある日、X（旧Twitter）で 「エンジニア1.2年目で知りたかったこと」 というポストを見つけ、衝撃を受けました。

➡ [ポストはこちら](https://x.com/sicut_study/status/1897781738950041935?s=46)

今の自分の勉強方法や働き方とは、まったく真逆の内容が書かれていたのです。

さらに、ポスト主の別の投稿に 「1日30分の積み重ねを半年間続けることで達成できること」 というリストがあり、その中に 「Qiita 50本投稿」 という目標がありました。

➡ [このポスト](https://x.com/sicut_study/status/1896758193516359884?s=46)

「よし、やってみよう！」と思い立ち、Qiita投稿を始めることにしました。

思いつきのスタートではありますが、これから継続し、自分の市場価値を高めていきたいと思っています！

これから エンジニア2年目目線での学び や SEPGの業務で得た知見 を共有していくので、よろしくお願いします！
#0064（2024/03/05）pythonのcopy/deep copy

# Pythonのcopyとdeep copyの違い

Pythonでは、オブジェクトのコピーを行う際に「浅いコピー（shallow copy）」と「深いコピー（deep copy）」の2種類の方法があります。  
これらは主に、オブジェクト内のネストされた（入れ子になった）オブジェクトのコピーの仕方に違いがあり、その結果、メモリの使い方や振る舞いにも違いが現れます。

---

## 1. 浅いコピー（shallow copy）

### 概要
- **浅いコピー**は、元のオブジェクトの**トップレベル**のコピーを作成します。  
  つまり、オブジェクト自体は新しいメモリ領域に作られますが、オブジェクト内に含まれる参照（リスト、辞書、他のオブジェクトなど）は**そのままの参照**がコピーされます。
- 結果として、コピー後のオブジェクトと元のオブジェクトは、入れ子になったオブジェクトを**共有**することになります。

### メモリの使い方
- トップレベルのオブジェクトは新しく作成されるため、その分だけ新しいメモリが使われます。  
- しかし、内部のネストされたオブジェクトはコピーされずに参照が共有されるため、追加のメモリ使用はほとんどありません。

### 例

```python
import copy

original = [1, 2, [3, 4]]
shallow = copy.copy(original)

# 浅いコピーの場合、リスト自体は別のオブジェクト
print(original is shallow)  # False

# しかし、内部のリストは同じオブジェクトを参照している
print(original[2] is shallow[2])  # True

# 内部リストを変更すると、両方に影響する
shallow[2][0] = 'changed'
print(original)  # [1, 2, ['changed', 4]]
```


## 2. 深いコピー（deep copy）

### 概要
- 深いコピーは、元のオブジェクトのすべての階層を再帰的にコピーして、新たな完全な複製を作成します。
そのため、元のオブジェクトとコピーされたオブジェクトは、内部のすべてのオブジェクトにおいて独立しています。

### メモリの使い方
- 全てのネストされたオブジェクトが再帰的にコピーされるため、追加のメモリが多く使われます。
元のオブジェクトの構造が複雑であればあるほど、メモリの消費量は増加します。

### 例

``` python
import copy

original = [1, 2, [3, 4]]
deep = copy.deepcopy(original)

# 深いコピーの場合、トップレベルも内部のリストもすべて新しいオブジェクト
print(original is deep)         # False
print(original[2] is deep[2])     # False

# 内部リストを変更しても、元のオブジェクトには影響しない
deep[2][0] = 'changed'
print(original)  # [1, 2, [3, 4]]
print(deep)      # [1, 2, ['changed', 4]]
```

## 3. まとめ
- 浅いコピー（copy.copy）
    - トップレベルのオブジェクトのみが新しく作成され、ネストされたオブジェクトは参照を共有する。
    - メモリ使用量は比較的少ないが、内部オブジェクトの変更が共有されるリスクがある。
- 深いコピー（copy.deepcopy）
    - オブジェクト全体を再帰的にコピーするため、元のオブジェクトと完全に独立した新しいオブジェクトが得られる。
    - メモリ使用量は多くなるが、内部オブジェクトの変更が他に影響しない。
systemd.timerで起動するserviceにdateコマンドの文字列を渡す

# 概要

定期実行するコマンドに、dateコマンドで得た文字列を渡したい。
というのを、crontabでは特に問題なくできていたが、
systemd.timer で同じことをやろうとすると少々はまったという話。

# 本記事における前提

スクリプトへの引数として、「先月の1日」のYYYYMMDD文字列を渡す、とします

# 1. シェル

まずシェルで、dateコマンドで先月1日を得る方法。

```shell:コマンド直打ち
# 本体
date "+%Y%m%d" --date "$(date '+%Y%m01') 1 month ago"


# 確認用
$ sudo date -s '20250331'; date "+%Y%m%d" --date "$(date '+%Y%m01') 1 month ago"; date
Mon Mar 31 12:00:00 AM JST 2025
20250201
Mon Mar 31 12:00:00 AM JST 2025
$
```

# 2. crontab

crontabでの方法も対比として記載します。

```
* * * * * /vagrant/test.sh -d $(date "+\%Y\%m\%d" --date "$(date '+\%Y\%m01') 1 month ago")
```

%を¥でエスケープ

```text:/var/log/syslog
2025-03-08T10:09:01.129375+09:00 vm017 CRON[6853]: (vagrant) CMD (/vagrant/test.sh -d $(date "+%Y%m%d" --date "$(date '+%Y%m01') 1 month ago") )
```

コマンドが通りました

```shell:test.sh
echo "[$(date '+%Y%m%d')] \$@: $@" >> test.log
```

```text:test.log
[2025-03-07 22:11:01] $@: -d 20250301
```

出力されました


# 3. service

本命、serviceの場合。

```shell:test.service
[Unit]
Description="test.sh"

[Service]
User=vagrant
ExecStart=/bin/sh -c '/vagrant/test.sh -d $(date '+%%Y%%m%%d' -d "$(date '+%%Y%%m01') 1 month ago")'
```

`/bin/sh -c` の引数として渡すことで$()が使えるようにして、
%を重ねることでエスケープ

```shell:打鍵
sudo systemctl start test.service
```

```text:test.log
[2025-03-07 22:18:24] $@: -d 20250201
```

期待通りの結果となりました。

完全に裏取りできたわけではないのですが、とりあえず動いたぞと。

# 参考サイト
コウモリのちょーおんぱ：systemd unit fileでは%のエスケープが必要
https://komorinfo.com/blog/systemd-unit-file-escape/
man/lastest/systemd.unit
https://www.freedesktop.org/software/systemd/man/latest/systemd.unit.html
stackoverflow：systemd からのサービス起動時にHOME環境変数を設定したい（/bin/sh -c じゃないとだめという情報）
https://ja.stackoverflow.com/questions/62360/
Slurm:job_submit.luaを使ったライセンス管理①

# 使い所
slurmに投入されるジョブは比較的自作のプログラムやOSSツールが多いですが、有償ツールをジョブに投入することがあります。通常有償ツール自身にライセンス管理機能があり、ライセンス違反が起こると自動的に止まります。

この適切なライセンス管理がslurmでジョブを投げる時には、少し注意が必要です。  

slurmで大量のジョブを投入する場合、通常このライセンス数を考慮すること無くジョブが投げられますが、ライセンス数を違反したら自動的にジョブが全部エラーになってしまいます。

本来はライセンス数が解放されるまでジョブを待機して欲しい。  

そのためには簡単に実装する方法としては以下の２つの方法があります。

### 同時に実行出来るジョブ数の制限を制限する

パーティション単位で同時に実行出来るジョブ数```MaxJobsPerPartition```をライセンス数の上限に設定することで擬似的にライセンス管理をすることが出来ます。  

```:slurm.conf
PartitionName=licpart PartitionType=normal Nodes=node[01-04] MaxJobsPerPartition=1 Default=YES State=UP
```
```:bash
sbatch --partition=licpart test.sh
```

### slurmのライセンス管理機能を使う

もう一つの方法としては、slurm.confにLicenses項目に管理したいライセンス名：ライセンス数を指定することで
同時に実行出来るジョブを制限することが出来ます。

```:slurm.conf
Licenses=fluent:30
```
しかし、このslurm側のライセンス管理を正常に動作させるためには、下記のようにライセンス名と消費するライセンス数をユーザー側が指定する必要がある。

```:bash
sbatch -L fluent:1 test.sh
```

# 簡易的なライセンス制御の問題点

性善説でエンドユーザーが正しくライセンス違反しないように指定して頂く事を期待したいところですが、オペミス含めて、正しく利用されないことをインフラ屋としては想定しなくてはなりません。

:::note alert
上記の問題点は、パーティションの最大数制限は、設定しているパーティションのみしか効果がないため、別のパーティションでジョブを実行されてしまえば制御は出来ません。  

またライセンス機能の方もsbatchを実行時に明示的にライセンス指定をしない限り管理することが出来ません。

:::

この問題を解決するためには、ジョブが投入された時にライセンス管理が必要なツールを使っている場合、適切なオプションに補正してあげる必要があります。


# job_submit.luaを使ったライセンス管理

このジョブ（ジョブスクリプト）が投入された時に、制御を入れる機能が「job submit plugins」です。
今回その中でluaスクリプトで制御するやり方を今回は取り上げます。  

今回は、sleepコマンドを有償ツールに見立てて、ライセンス数：１としてjob_submit.luaを使った制御を設定してみます。

```:slurm.conf
Licenses=lic:1
JobSubmitPlugins=lua
```

```:/etc/slurm/job_submit.lua
function slurm_job_submit(job_desc, part_list, submit_uid)

        -- ジョブスクリプトの内容を読み取る
        if job_desc.script ~= nil then
                if string.find(job_desc.script, "sleep") then
                        if job_desc.licenses == nil then
                                job_desc.licenses = "lic:1"
                        else
                                job_desc.licenses = job_desc.licenses .. ",lic:1"
                        end
                else
                        slurm.log_info("slurm_job_submit: Unable to read job script at path: %s", script_path)
                end
        end

        return slurm.SUCCESS
end

```

```:bash
scontrol show lic
LicenseName=lic
    Total=1 Used=0 Free=1 Reserved=0 Remote=no

sbatch sleep.sh 
Submitted batch job 275

scontrol show lic
LicenseName=lic
    Total=1 Used=1 Free=0 Reserved=0 Remote=no
```

これでライセンス設定を忘れたとしても、ジョブが投入された時に自動的にライセンス設定をしてくれるようになります。
and-let* はどうも怖くてしょうがない

Scheme SRFI-2 の ``and-let*`` は怖い。

ヒューマンエラーに対して脆弱。

ガード節は ``((even? n))`` のように二重括弧である必要があるところ

```scheme:
(and-let*
  (
      :
  (n (何か計算式))
  ((even? n))
      :
  )
  ...)
```

を、うっかり、非重括弧の ``(even? n)`` で、

```scheme:
(and-let*
  (
      :
  (n (何か計算式))
  (even? n)
      :
  )
  ...)
```

と書いても問題なく通ってしまって、気づけないんだもの。

``and-let*`` をコード中につかっていると、どうも怖くてしょうがない。
やらかしているんじゃないかと「ソワソワ」「ハラハラ」落ち着かない。

ヒューマンエラーをわざわざ誘発するような邪悪な構文だ。

## ``(VAR EXPR)`` 節でのショートカットは危険

SRFI-2 の仕様では ``(何か計算式)`` の値として ``#f`` が許容されないというのはヒューマンエラー以外の意味でも問題。``#f`` をデータとして扱いたい場合だってあるはずだから。

SRFI-2 のこの部分の定義がよろしくない。

```
eval_claw[ (VARIABLE EXPRESSION), env ] =
   eval[ EXPRESSION, env ]
```

もっとも、この部分こそが、SRFI-2 が考案された最大の理由だとも言えそうな気もするものの、つまり、例えば連想リストの値の取り出しのようなケース

```scheme:
(and-let*
  (
  (entry (assoc key assoc-list))
  )
  ...)
```

でコードをシンプルに書けるというのが、``and-let*`` 最大のメリットのような気もするのだけど、そうだとしても、これの場合でさえ、連想リストの値を変数に束縛するような一行を追加すると問題を抱えるようになる。

```scheme:
(and-let*
  (
  (entry (assoc key assoc-list))
  (value (cdr entry))
  )
  ...)
```

問題というのは ``value`` が ``#f`` の場合。それを見過ごして、``let*`` のようなつもりでウッカリこういった束縛節を書いてしまうとバグを抱えることになるというわけ。ガードのつもりは全くないのにガードとして機能してしまう。

## まとめ

``and-let*`` のダメな点をまとまるとこうだ。

* ガードをうっかり非重括弧で書いても、構文的には適法なので、ミスを発見できない。
* ``#f`` を値として扱うことができない。
* ガードのつもりがない単なる束縛のつもりで書いてもガードとして機能してしまう。

こう考えると、``and-let*`` はヤラカシた仕様のように思える

そしてこれをよく考えると ``(VAR EXPR)`` 節でショートカットさせる仕様が潜在的なバグを誘発する諸悪の根源だとわかる。この仕組みを除去すれば、上の３つの問題は解決できる。

## 案

束縛節が ```(変数名 式)``` の場合は ```式``` の評価値が何であろうとも ``and`` をショートカットさせずに次の式を評価するということにしつつ、束縛節の第３項に ``(where ...)`` がある節だけショートカット評価させる。``let*-and`` とでもいうべきか、そういうのはどうだろう？

```scheme:
(let*-and
  (
      :
  (n (何か計算式) (where (even? n)))
      :
  )
  ...)
```

または第１項目で条件節の記号を指定できる「マーカー付き``let-and*``」もいいかもしれない。マーカーはどんな記号でもよくて、

```scheme:
(let*-and satisfies
  (
      :
  (p (何か計算式➊))
  (q (何か計算式➋))
  (satisfies (even? (+ p q)))
      :
  )
  ...)
```

とか、

```scheme:
(let*-and where
  (
      :
  (p (何か計算式➊))
  (q (何か計算式➋))
  (where (even? (+ p q)))
      :
  )
  ...)
```

とか。

なんにせよ、抜き身の「``((...))``」というような、ヒューマンエラーを誘発するような邪悪な書式を許さない書き方。

連想配列の中身を取り出すコードはこれを使うとこうなる。``(cdr entry)`` が ``#f#`` だとしても期待どおりに動く。

```scheme:
(let*-and
  (
  (entry (assoc key assoc-list) (where entry))
  (value (cdr entry))
  )
  ...)
```

これで記述が少し増えるくらい良いし、むしろ、明示的なコーディングスタイルは読み良いと思う。
Rook Ceph再入門

# はじめに懺悔

KubernetesクラスタでPVの基盤となる分散ストレージ機能を提供するためにRook Cephを導入した。

中身を詳しく把握してなくても少しいじれば良い感じに動いてたのでそのまま使ってたが、ぼちぼちちゃんと向き合う必要が出てきたので調べた結果をここに書き残す。

# Cephとは

まずCephから説明した方がスムーズなのでこちらから説明する。

https://docs.ceph.com/en/latest/

>Ceph delivers **object, block, and file storage in one unified system**.

公式ドキュメントに記載の通り、Cephは

- オブジェクトストレージ
- ブロックストレージ
- ファイルストレージ

これらを提供する統合システムである。
Cephを導入すると必要に応じて上記3種を使い分けられる。

また、CephはRADOS(Reliable Autonomic Distributed Object Storage)という機能に基づきストレージクラスタを提供する。

つまり、複数のノードでクラスタを構成し、データはクラスタを構成する複数のノードに複製する形となる。

### Cephのコンポーネント

Cephは複数のコンポーネントからなる。

- Ceph Monitor
    - クラスターの状態とそのマップを保持する
    - 最低1台必要だが、高可用性を保持するためにはクラスタに3台以上存在する必要がある
- Ceph OSD Daemon
    - 論理ディスクとやり取りする
    (ディスクと紐づき実際にデータの複製や書き込みを行う、特にクリティカルなコンポーネントという理解)
    - 自身と他のOSDの状態をチェックしMonitorに報告する
    - Cephではデータの複製数が設定できるが、その数以上の台数がクラスタに必要となる
        - 高可用性を保持するためには3台以上になるように
- Ceph Manager
    - クラスタの状態とメトリクスを追跡する
    - 最低1台必要だが、高可用性を保持するためにはクラスタに2台以上存在する必要がある
- Ceph Metadata Server
    - ファイルシステムのメタデータを保持する
    - ファイルストレージ機能(Ceph File System)を使う場合は必須となる

## Rookとは

いよいよRookである。

https://rook.io/docs/rook/latest-release/Getting-Started/intro/

RookはざっくりCephをK8s上に展開するためのもの。
そのためのコンポーネントとしてOperatorを提供する。

### アーキテクチャ

https://rook.io/docs/rook/latest-release/Getting-Started/storage-architecture/#architecture

青い層がOperator、赤い層がCephコンポーネント。
間のオレンジの層がCSIプラグインとプロビジョナー。
CSI(Container Storage Interface)とはコンテナオーケストレーションシステム(K8sとか)とストレージプロバイダー(Ceph)を接続するための標準インタフェースである。

# 雑にまとめ

Cephが分散ストレージ機能とクラスタを提供する。
(実際使ってる体感だが、必要な知識としてこっちのウェイトが現状大きい)

RookはCephをK8s上に展開、管理するためのツール。
自己紹介と今回の初投稿の経緯

## 自己紹介
はじめまして！よしきといいます。2025年4月で社会人4年目になるエンジニアです。

これまでの業務では、SalesforceのApexやLightning Web Component(JavaScript)を中心に開発をしてきました。少しだけTypeScriptベースでNext.jsを使ったこともあります。

アピールポイントは英語です。もし何か書きたいようなきっかけがあれば、英語学習についても投稿してみようかなと思っています。

自己学習ではPython, Java, React、AWSなどを学習してきました。今後も引き続き楽しみながら取り組んでいきます！よろしくお願いいたします。


## 今回の投稿の経緯
今回の初投稿のきっかけとしては、(1)今後学んだことを実際の場面で活用できるようにアウトプットしていく必要性、(2)ソフトウェア設計やインフラ、ネットワーク、CI/CD、アルゴリズム、サイバーセキュリティなどのソフトウェア開発における幅広い知識を身につける必要性を感じたからです。

一点目に関して、これまで業務や自己学習を通じて、バックエンド・フロントエンド開発、クラウド、Salesforce関連を中心に学習してきました。しかし、どうしてもインプットに偏った偏りがちで、「なんとなくは分かるけど上手くできないなあ」と感じることが最近は特に多いです。こういったブログでのアウトプットや自己開発なども含め、頭の中にあるものを使って何かを生み出す経験が圧倒的に不足していることを痛感しています。今後はここでの投稿を含め、インプット/アウトプットのサイクルを短く繰り返すことで、学んだことを現実でも活用していけるように努めます。

もう一点ですが、ソフトウェア開発における幅広い知識の必要性を感じさせられた実際の経験がありました。幸いにも1度、自社開発のテック企業の面接を受けさせていただく機会があったんです。ただ、皆様の想像の通り、全く歯が立たず。。。ボコボコにされたという言葉がぴったりかもしれません（面接してくださったエンジニアの方は大変気遣いをしてくださって、かなり温かい言葉をかけてもらえたのは救いでした）。それでも、面接を受けて本当に良かったと思える自分がいて、メガベンチャーのエンジニアと張り合えるようになるには、どういった知識・経験が必要か肌感覚で体験できる機会になりました。今はまだまだ遠い目標ですが、ソフトウェア設計やインフラ、ネットワーク、CI/CD、アルゴリズム、サイバーセキュリティなども一層学んでいきたいと考えています。もちろん全ての分野でエキスパートになる必要はないとはいえ（恐れ多くてエキスパートになれるなんて言えませんが）、そういったエンジニアの方々と対等に議論が出来るようなレベルになるのが目標です。

上記の理由で、更に効果的かつ効率的に新しいことを吸収するために、Qiitaをアウトプットの場としていきたいと考えている次第です。社会人3年目の終わりから始めるのは少し遅いかもしれませんが、これからコツコツ続けていきます。
加えて、これまで皆さんの記事に助けられた回数は数え切れないです。改めてこの場で感謝させていただければと思っております。お返しとして、私も投稿を通じて今後もし誰かの助けになれば嬉しいです。


## 今後について
新年度から別の会社で、webアプリケーション開発に携わることが出来そうです。インフラやCI/CDの経験も積ませていただけそうです。しっかりと準備していきたいと思います。

最後に、ここでの投稿を通じて自分自身のレベルアップに繋げると同時に、ここにいらっしゃる方々と交流・情報交換できれば幸いです。
よろしくお願いいたします。

P.S. 自己紹介とはいえ、文章を書くのは大変でした。。。
AtCoder水色あるある

## はじめに
水色になってからもうすぐ一年なので水色あるあるを紹介したいと思います。だいたい愚痴です

## F問題一生解けないがち
水色になったときは緑diffのE問題を解ければFがだいたい難しいおかげでレートが盛りやすいけど青になるためにはFを解かないといけないから停滞する
## chokudaiさんの評価に疑問を持ちがち
AtCoderに出てくる簡単なアルゴリズムは理解してるつもりだけど正直あの文章の内容レベルの自身がない

## 精進中の理解できない問題に深夜まで粘りがち
粘るからこそレートが上がるというのもあるけど生活習慣がくずれやすい。ABCの直後とかどうにも寝る気になれなくて気づいたら3時くらいになってる

## 実力伸び悩みがち
個人的な体感として、灰、茶、緑の頃は基礎的なアルゴリズムをマスターして過去問を解いていればレートが上がった、しかし水色から青になる方法が明確じゃない、過去問とか解いてて効果あるのかな～と不安になる
## AJLのボーダーがきつすぎるがち(愚痴)
これは自分だけが感じてる内容だけどAJL高2のボーダーがえぐすぎる、水色コーダーって多少すごいのに多少すごいやつを超えてる人が多すぎる。夏の枠で黄パフォ取ったのに最終22位ってどういうこと...?
## 500点以上の問題を解けて喜んでたらdiff低いがち
水色の人は400点以下の問題は大体解ける、450点でたまに解けないやつがある(セグ木の堀りみたいなやつ)。500点以上の問題は基本FとG問題に配置されてて、Eまでの5完ができたら挑戦するんだけど、自分が解ける分野だったときに他の水色コーダーも解けてAC数が1000を余裕で超えて(Nimのやつとか)悲しくなる
## 水色まで競プロしても正直プログラミングのことなんもわからん
プログラミングという作業において言語ごとの分野とかできることがあるという認識自体はあって、自分が文化祭でhtml,css,javascriptを使って作品を作った時は競プロのおかげで言語の文法がAIのおかげもあって理解しやすかった。しかし具体的なプログラミングの話がわからん。あまり関係ないけどバーコードを読み込むとそのバーコードの数字だけ読み取れると知ったとき一瞬でこれmap使えば金額と紐づけできるじゃんと気づけたのはうれしかった
## 競プロの話を友達にしにくいがち(愚痴)
学校で友人と話していて **「お前最近何やってるの？」** みたいなことを言われたときに、水色コーダーになるくらいまでAtCoderに取り組んでいて、立派な趣味の1つなので **「競プロしてる」ってほんとは言いたいんだけど競技プログラミングっていう存在を知ってる人が少なすぎるし、競技プログラミングの「競技」の時点でなんかすごそうでそこにさらに「プログラミング」が入るから「競プロしてる」といって競技プログラミングの紹介みたいなことをすると、「こいつすごそう」みたいなレッテルが貼られそうで嫌だ。** 自分は「ゲームしてる…」と濁してる。一回だけ競プロの話をしたことがあるが全く興味をもってもらえなかった、おもしろい部分を理解しようとすると3か月くらい競プロを実際にするのが必要ｄと思っている。情報系のすごい大学だったら結構知名度ありそうだから競プロについてワイワイ話せそうでうらやましい、学力がないからそういう大学に行かないので悲しい。競プロ教室も落ちたから誰とも競プロの話できない...強くなればなるほど孤独感は加速していく。

## インタラクティブな問題ACできなさすぎてAtCoder社のジャッジを疑う(愚痴)
ARC184-Aみたいな適応的系のインタラクティブな問題だとデバックがむずすぎて一生ACできない、WAになっても原因が見つけにくすぎてこのタイプを自力ACできたことがない。解説見て理解して解説とほぼ同じコードなのに一生ACできなくて機械に懐疑心を持つ(自分が下手くそなだけです)

## 精進を始めた最初の週はぼろ負けする
これはガチである。problemsの精進開始日とコンテストの結果を見比べるとわかるけど絶対負けてる。新しい知識を使おうとしてるとか、頭の疲れとか色々原因があると思うけど、競プロの精進においてぶつかりやすい1つの壁だと思う。悔しさで萎えて精進をストップすると一生レートは停滞する...。
フォルダの Shift-右クリックで WSL2 を起動する「Ubuntu Here」

# フォルダの Shift-右クリックで WSL2 の Ubuntu を起動する「Ubuntu Here」
Windows のフォルダーを指定して Shift-右クリックで WSL2 の Ubuntsu のシェルを起動する Ubuntu Here を作りました。この右クリックメニューは Microsoft PowerToys に付属の Open Command Window Here を修正して作成しています。
## Ubuntuhere.inf のコード
以下のテキストで Ubuntuhere.inf を作成します。  
作成したファイルを右クリックしてインストールします。  
この inf ファイルはアンインストールに対応しています。
```ini:Ubuntuhere.inf
[Version]
Signature=$CHICAGO$

[DefaultInstall]
AddReg=Reg.Settings
AddReg=Reg.Uninstall
CopyFiles=Inf.Copy

[DefaultUninstall]
DelReg=Reg.Settings
DelReg=Reg.Uninstall
DelFiles=Inf.Copy

[Reg.Settings]
HKCR,Directory\Shell\Ubuntuhere
HKCR,Directory\Shell\Ubuntuhere,,,"%MENUITEM%"
HKCR,Directory\Shell\Ubuntuhere\command,,,"%11%\cmd.exe /c ""cd """"%1"""" && wsl -d Ubuntu-24.04"""
HKCR,Drive\Shell\Ubuntuhere
HKCR,Drive\Shell\Ubuntuhere,,,"%MENUITEM%"
HKCR,Drive\Shell\Ubuntuhere\command,,,"%11%\cmd.exe /c ""cd """"%1"""" && wsl -d Ubuntu-24.04"""

[Reg.Uninstall]
HKLM,Software\Microsoft\Windows\CurrentVersion\Uninstall\%NAME%
HKLM,Software\Microsoft\Windows\CurrentVersion\Uninstall\%NAME%,DisplayName,,"%NAME%"
HKLM,Software\Microsoft\Windows\CurrentVersion\Uninstall\%NAME%,UninstallString,,"Rundll32.exe setupapi.dll,InstallHinfSection DefaultUninstall 132 %17%\Ubuntuhere.inf"

[Inf.Copy]
Ubuntuhere.inf

[DestinationDirs]
Inf.Copy=17

[SourceDisksNames]
55=%DISKNAME%

[SourceDisksFiles]
Ubuntuhere.inf=55

[Strings]
NAME     = "Ubuntu Here"
MENUITEM = "Ubuntu Here"
DISKNAME = "Setup Files"
```
## フォルダーの Shit-右クリックで起動
フォルダーの Shift-右クリックのメニューで Ubuntu Here を選択すると WSL2 の Ubuntu の Shell が起動します。  

Shift-右クリックメニュー  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601615/866a14fe-6e61-4039-b374-0891348fff06.png"  width=70%>  
起動したWSLのShell  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601615/f761ebc6-d1df-4346-877d-ca9c19389f4f.png" width=70%>  
## カスタマイズ方法
独自のコマンドを右クリックで実行するためのカスタマイズ方法の解説です。この修正方法を使うと powershell を起動する右クリックメニューなども作成可能です。  

### 1. 右クリックの名前変更
`Ubuntu Here`を検索して置換します。例えば`Ubuntu 20.04`に置換します。
### 2. inf ファイル名の変更
`Ubuntuhere.inf`を検索して置換します。例えば`Ubuntu20_04.inf`に置換します。ファイル名も`Ubuntu20_04.inf`に変更します
### 3. 右クリックで実行するコマンドの変更
`"%11%\cmd.exe /c ""cd """"%1"""" && wsl -d Ubuntu-24.04"""`を検索して置換します。例えば`"%11%\cmd.exe /c ""cd """"%1"""" && wsl -d Ubuntu-20.04"""`に置換します。  
コマンドの記述方法について、`%1`は右クリックしたフォルダ名です。`"`ダブルクオートをコマンドに含める場合は、`""`二つのダブルクオートを使用します。上のコマンドは`cmd.exe /c "cd ""%1"" && wsl -d Ubuntu-20.04"`が元のコマンドです。
【MLA-C01】AWS Certified Machine Learning Associate 合格体験記

# はじめに
2025年の2/14にAWSのAssociate資格である、MLAに合格することができました。
~~怠惰な性格のせいで~~試験対策に当てられる時間が短かったのですが、合格することのできたので、勉強方法を共有していきたいと思います。
参考にしてもらえたらありがたいです:pray:

## 私の試験結果
スコアは874でした。
合格スコアが720なので、点数的には余裕を持って合格することができました。

![22617491-FE1B-434D-82EF-A463221A2D0C_1_201_a.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828633/6b5f52ff-382b-4670-8402-9c841f1c3a89.jpeg)

ちなみにMLAは2/15までに取得するとEarly Adopterのバッジがもらえたので、そのために少し日程的に無理をして取得をしました笑

トータルの勉強時間は大体10時間ほどで、AIFから期間を開けずに受けたこともあって、インプットの部分で詰まるところなく、演習中心に試験対策をすることができました。

## 勉強方法
まずは[MLAの試験ガイド](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-machine-learning-engineer-associate/AWS-Certified-Machine-Learning-Engineer-Associate_Exam-Guide.pdf)を確認しました。
AWS資格の試験ガイドには、その資格を合格するのに必要な知識が丁寧に書かれているので、試験勉強を始める前に一度読んでおくことをおすすめします。

https://d1.awsstatic.com/ja_JP/training-and-certification/docs-machine-learning-engineer-associate/AWS-Certified-Machine-Learning-Engineer-Associate_Exam-Guide.pdf

次に[SkillBuilderの公式練習問題](https://explore.skillbuilder.aws/learn/courses/19689/exam-prep-official-practice-question-set-aws-certified-machine-learning-engineer-associate-mla-c01-ri-ben-yu)の演習を行いました。問題数が20問しかありませんが、本番と変わらない質の高い問題を解くことができるので、これも一度はやっておくことを強くおすすめします。

https://explore.skillbuilder.aws/learn/courses/19689/exam-prep-official-practice-question-set-aws-certified-machine-learning-engineer-associate-mla-c01-ri-ben-yu

あとは[英語版Udemy](https://www.udemy.com/course/practice-exams-aws-certified-machine-learning-engineer-associate/?srsltid=AfmBOooG4pPNbJoqDSZG9kw74eQsMIHhuOpqPRL1HqLP8B9vxnOARlQW&couponCode=V2JPLETSLEARN)と[CloudLicense](https://cloud-license.com/exam/mla/)で練習問題をひたすら解くといったことを行いました。この辺の問題集は問題数がこなせれば良いと思っているので個人の好きなものを選んで大丈夫だと思います。
個人的には英語版Udemyは本番よりも難しい問題が多かったため、時間に余裕のない人は無理せずやらなくてもいいかなとは思いました。(逆にMLSとかを見据えてMLAに挑戦する人はおすすめです)

https://www.udemy.com/course/practice-exams-aws-certified-machine-learning-engineer-associate/?srsltid=AfmBOooG4pPNbJoqDSZG9kw74eQsMIHhuOpqPRL1HqLP8B9vxnOARlQW&couponCode=V2JPLETSLEARN

https://cloud-license.com/exam/mla/

## おすすめのBlackbelt
一つ目のおすすめは[Amazon Bedrock Overview](https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2024_Amazon-Bedrock-Overview_v1.pdf)です。
Bedrockの各機能について簡潔でわかりやすく書いてありながら、生成AI関連では頻出のRAGなどの技術が図でとてもわかりやすく解説されています。

https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2024_Amazon-Bedrock-Overview_v1.pdf

二つ目のおすすめは[AWSの⾔語系AIサービス](https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2024_AWS-Language-AI-Services_0425_v1.pdf)です。TranscribeやPollyなどの特定の用途に特化したAWSサービスについて、実際のユースケースを示しながら紹介をしてくれている資料です。正直、この資料を読んでおけば特化系のAIサービスの問題についてはMLSまで対応可能になると思います。

https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2024_AWS-Language-AI-Services_0425_v1.pdf

## おわりに
これで、AWSのAI/ML系資格をコンプリートすることができました。
全て受けた感触としては、MLSはかなりAI/MLのモデルやアルゴリズム勝負の試験であるのに対して、MLAはMLOps的な運用に焦点を当てた試験だなと感じました。問題の傾向が結構違うので一概にMLS受かったからMLAも楽勝とはなりづらい印象でした。

今後、生成AIを使った製品をリリースするとなった時に役に立ちそうな知識をたくさん学べたので、実務でも活かしていきたいです。
GitのPushエラーで詰んだけど、意外と簡単に解決した話


## はじめに

マジでイライラした。GitHubにpushしようとしたら見慣れないエラーが出てきやがって、何度やっても同じ結果。「あぁ、今日は徹夜コースか...」って思ったけど、意外と簡単に解決できたから共有しとく。

## 発生した問題

```
error: RPC failed; curl 18 transfer closed with outstanding read data remaining
fatal: the remote end hung up unexpectedly
fatal: the remote end hung up unexpectedly
```

みたいなクソエラーが出てきて、しかも大きいファイル追加した直後だからめっちゃ焦った。何度やっても同じエラーでpushできねぇ。

## 解決策

結局、以下の2つのコマンドを順番に実行したらあっさり解決した。

```bash
# リポジトリ内の不要なオブジェクトを整理して断片化を解消
git gc --prune=now

# HTTPポストバッファサイズの設定（大容量ファイルがある場合の対策）
git config http.postBuffer 524288000
```

## なぜ解決したのか？

### `git gc --prune=now`

これ、リポジトリ内のゴミみたいな不要オブジェクトを掃除するコマンド。Gitは差分を管理してるからどんどんゴミが溜まる。`gc`はガベージコレクションの略で、`--prune=now`オプションは「今すぐ掃除しろよ」って命令。

断片化してたファイルが整理されて、転送がスムーズになった感じ。

### `git config http.postBuffer 524288000`

これはHTTPでのpush時のバッファサイズを増やすコマンド。デフォルトだと100MBくらいなんだけど、これを500MBに増やしてる。大きなファイルをpushするときに「バッファ小さすぎだろ！」ってなるのを防止してる。

## まとめ

ぶっちゃけ、大きいファイルをコミットした後にpushでエラー出るのはよくあること。特に画像とかバイナリファイルとか追加した時に起きがち。

今回の対処法は：
1. ゴミを掃除 (`git gc --prune=now`)
2. バッファサイズを増やす (`git config http.postBuffer 524288000`)

この2つでほとんどのpushエラーは解決するはず。

あと、そもそも論として大きいバイナリファイルはGit LFSを使うとかgitignoreに追加するとかした方がいいんだけど、それはまた今度書く。とりあえず今回のエラーはこれで解決！

## おまけ

pushエラーでググると色々な解決策出てくるけど、個人的には上記2つが一番シンプルで効果あった。他には以下も試したけど、結局上の2つで解決した：

- `git config --global core.compression 0` (圧縮を無効化)
- `git config --global http.lowSpeedLimit 1000` (低速制限の設定)
- `git config --global http.lowSpeedTime 60` (低速制限の時間設定)

お前らも同じエラーに遭遇したら、まず上の2つを試してみてくれ。多分解決する。
【GA4】テストのときだけIPアドレスのフィルターを貫通する

GoogleAnalytics4(以下、GA4)では、内部トラフィックをIPアドレスで除外できる設定がありますが、テストを実施したときだけIPアドレス除外を超えてトラフィックが計測される事象が発生していました。
落ち着いて整理してみると大した問題ではなかったのですが、備忘録として残します

## 事象
・社内ネットワークからdockerのローカル環境でテストしたときに、GA4のIPアドレス除外が効かずにトラフィックが計測されてしまう
・具体的にはリリース前の新機能へのアクセスが計測されていた

## 確認したこと
・社内ネットワーク外からアクセスしていないか→テスト担当者に確認したが問題なし
・設定したIPアドレスがおかしいのでは→ifconfig(ipconfig)や[確認サイト](https://www.cman.jp/network/support/go_access.cgi)と一致
・GA4のリアルタイムページを開きながらローカルでテスト→計測されない(再現せず)

## 結局の原因はSafariのプライバシー機能
・「そういえばUI改修のテストのときにトラフィックが増えがちだな」という傾向から、テストに使用している全ブラウザでテストしたところ、Safariの場合でのみGA4のフィルターを貫通していることが分かった
・調べてみるとSafariにはプライバシー関連の「IPアドレスを非公開にする」機能がある
> IPアドレスを非公開にする: IPアドレスが既知のトラッカーから自動的に保護されます。iCloudに登録している対象ユーザの場合、Safariでのブラウズ中にIPアドレスがトラッカーやWebサイトから保護されます。このオプションをオフにすると、IPアドレスは非公開になりません。
https://support.apple.com/ja-jp/guide/iphone/iphb01fc3c85/ios

・ここでいうトラッカーにあたるGA4へは偽装したIPアドレスが送られ、IPアドレス確認サイトには正規のIPアドレスが送られていたのだと思われる
・本番でもSafariアクセスすれば内部トラフィックとして除外されていない状態だったが、社内でSafariを使ってアクセスすることがなかったので気が付かなかった

## テストのときは、Safariのプライバシーを蔑ろにしよう
・テストのトラフィックが計測されないよう、PC/SP共にSafariの当該機能をオフにしたところ、無事IPアドレスフィルターが有効になり、安心してテストできるようになりました。

Mac版Safariの「プライバシー」タブ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3808054/bf858a6d-7063-4015-8fdc-3ecf24b0a17b.png)

iPhone版Safariの「プライバシーとセキュリティ」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3808054/789bbea9-af10-42f0-8477-9a5059676cf7.png)

（ちなみに[iCloudプライベートリレー](https://support.apple.com/ja-jp/guide/iphone/iph499d287c2/18.0/ios/18.0)という似たIPアドレス偽装の機能もあるが、こちらはiCloud+のサブスクリプション登録の必要があるので気にしなくて良さそうである）
記録を兼ねてアウトプットをしてみる

TS/JS書いていて、これめっちゃ便利じゃん！と思った2つ！

１つ目
&& (論理 AND 演算子) 
#【ふるまい】：
##左側が true の場合にのみ、右側を評価します。
#【具体例】：
##{value == 5 && value}
valueがtrue(valueが5)なら、右側を評価（valueを表示）する。

２つ目
boolean型を使った三項演算子
#【ふるまい】：
##　一番始めに条件となる関数とはてな記号（？）をおいて、trueなら２つ目の値、falseなら3つめの値をとる
#【具体例】：
##(editable ? "white" : "lightgray")
##editableという関数が、正しければwhiteという値を取る。間違いならLightgrayという値を取る。*これをスタイルシートに使えば関数を用いて切り替えができる！
イラレで必要なフォントをダウンロードして使えるようにする方法 2025年ver.

## この記事の目的
目的のフォントを探し出して、手元のイラストレーターでそれを使えるようにする。
(環境 Windows11 / MacOS , illustrator 2025)

#### 自分の環境でうまくいかなかったこと
- イラレの文字パネルを介して直接検索したりダウンロードしようとする
- Adobeの公式ヘルプを見てあれこれ考える

## 解決手段
イラレの他、2つのアプリ・サービスを介する必要がある。

#### 文章で書くと
まずCreativeCloud(デスクトップアプリ)を起動し、自分のアカウントでログイン。画面右上に表示される[AdobeFont]をクリックしてさらに起動。立ち上がったブラウザの検索窓で目的のフォントを検索する。表示されたフォントの隣に表示される[ファミリーを追加]ボタンを押す。イラレに戻り、フォントがインストールされているか確認する。ない場合、PCを再起動する。


#### ステップバイステップ+画像で書くと
以下の順番でアプリを操作する。

1. Illustrator
    - 必要なフォント名を確認してメモ (記憶orコピペ)
1. Adobe Creative Cloud
    1. デスクトップアプリを起動してログイン
        <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4029866/c7d0c6bf-cc95-4d2a-8830-58ab55a7554c.png" alt="image.png" width="300px">
    1. 右上の [f] を押す
        <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4029866/aad7ad83-11c4-4e51-b5c6-2b97dfb84c24.png" alt="image.png" width="300px">
    1. [別のフォントを探す]を押す
        <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4029866/f0bcadc2-fde5-4903-bdbb-ce008950ea33.png" alt="image.png" width="300px">
1. AdobeFonts
    1. (前記操作の別ブラウザで勝手に起動)
    1. 検索窓に必要なフォント名を入力
        <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4029866/c70db7d3-db33-422c-8b94-ec45de5412bc.png" alt="image.png" width="300px">
        - 幅が狭いと表示されないので注意
    1. 必要なフォントを探す
        <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4029866/6f9d4666-3ffd-4e20-a295-0a200f027bc9.png" alt="image.png" width="300px">
    1. [ファミリーを追加] を押す
        <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4029866/7d45c3e8-0a2a-40b5-b150-dffbc2d1c885.png" alt="image.png" width="300px">
1. Illustrotor
    1. フォントパネルに、必要なフォント名があるか確認
    1. もしない場合はPCを再起動させる

## こうなってほしい、こうしたい、なところ

- イラレのパレットから直でサクッとダウンロードできないんだろか
- サービスやアプリ間の担当と守備範囲、ログイン順序要請とかわかる早見表とかないだろか

#### 自分が困ったこと
macOS側から作成したイラレデータのテキストに、あるフォントを割り当てていたが、そのデータをwindows側から開くとそのフォントが「見つからない」ときた。
たぶん適切なフォントをwindows側にインストールすれば解決するんだろうけど、そもそもどこからインストールすればいいのか、公式ヘルプ等探したけど色々方法があって、イマイチはっきりしなかったのであった。

以上
コードコンプリート＜上＞　−3−

第3章　2回測って一度で切る：上流工程の必要性
コンストラクションの準備は品質向上のため。
品質向上のためには
プロジェクトの
- 終わり＝システムテストの強化
- 途中＝コンストラクションのプラクティスの強化
- 最初＝高品質な製品計画、要求、設計


上流工程（アーキテクチャ、設計、プロジェクト計画）
この工程の目標は、リスクを減らすこと

例えば、組み込み医療システムのライフサイクルモデルは、
- 段階的デリバリー
- スパイラル型開発
- 進化型デリバリー
がある。他にも、進化がプロトタイプなど、規模が小さいもの向けのモデルが有る。

要求の80%を事前に指定し、後から要求を追加する時間を設ける（逐次性）
要求の最重要な20%を指定し、残りを少しずつ開発しながら、要求設計を追加していく（反復性）
という２つの手法がある。
形式や環境、スキル、ビジネスゴール似合わせて選択すると良い。

コンストラクションの準備
１．課題定義：ユーザーの立場での課題の説明
２．要求：ソフトウェアシステムが何をすべきか
３．アーキテクチャ：システムの概念的な整合性に必要な構造を提供する
    良いアーキテクチャ：分割できるので、複数の開発者、複数の開発チーム、それぞれが個別に作業できる。
    悪いアーキテクチャ：コンストラクションはほぼ無理
優れたアーキテクチャの要素
- プログラムの構成：システム全体像を説明する概要
- 主要なクラス：主なクラスの役割と、他のクラスとのやり取りする方法、クラス従属、状態遷移図、オブジェクトの永続性について
- データ設計：使用する主なファイルやテーブル設計の説明。他に検討されたデータ構造の説明と選ばなかった理由の説明
- 業務ルール：よくわからない！！！
- ユーザーインターフェースの設計：インターフェースは要求か、アーキテクチャで説明する。
- リソース管理
- セキュリティ：脅威モデルの構築
- パフォーマンス
- スケーラビリティ：将来の要求に応えてシステムを拡張できる
- 相互運用性
- 国際かと地域化：文字などローカルサポート
- 入出力
- エラー処理
    - エラーを修正するか、検出するか。修正するなら回復、検出するなら継続、中止どうするか　
    - エラー検出は能動的？受動的？
    - エラーをどのように伝達するか
    - エラーメッセージのための規約
    - 例外は度のタイミングでどのように処理されるのか
    - 入出力データをどの程度検証するのか
    - どの例外処理メカニズムを使うのか（独自のものか、実環境のものか）
- フォールトトレランス：どのようなフォールトレランスが想定されているのか）フォールトレランスとは、障害の検出をし、回復を試み、失敗したら除外の悪影響を阻止。例えば、部分的運用二変更、機能セーブ、自動シャットダウン・再起動）
- アーキテクチャの実現可能性
- オーバーエンジニアリング（堅牢性）：エラーが検出された後でも、システムを継続的にどれだけのレベルで運用できるか
- 購入か、構築か
- 再利用の決断：前も使っていたからは不十分
- 変更方針：変更できるような柔軟性
- アーキテクチャの全体的な品質
汎化誤差と評価方法

# 汎化誤差（Generalization Error）とは？

汎化誤差とは、機械学習モデルが学習データに対しては高い精度を発揮するが、未知のデータ（テストデータや実際の運用環境でのデータ）に対してどれだけ正しく予測できるかを示す指標です。

簡単に言うと、**「新しいデータに対してどれだけうまく対応できるか？」**を評価するための指標と考えられます。

---

## 1. 汎化誤差の計算方法

汎化誤差は、訓練データとテストデータにおける誤差の差として捉えることができます。

$$
\text{汎化誤差} = \text{テスト誤差} - \text{訓練誤差}
$$

- **訓練誤差（Training Error）**: モデルが学習データにどれだけ適合しているかを示す誤差
- **テスト誤差（Test Error）**: 学習していない新しいデータに対する誤差

---

## 2. 汎化誤差の要因

汎化誤差が大きくなる要因として、主に以下の2つが挙げられます。

### ① 過学習（Overfitting）
- 訓練データに過剰に適合しすぎることで、テストデータでの誤差が大きくなる。
- **例:** 特定のデータに依存したルールを学んでしまい、新しいデータに適用できない。

### ② 過小学習（Underfitting）
- 訓練データでもテストデータでも誤差が大きく、モデルが十分に学習できていない。
- **例:** 線形モデルを用いて非線形なデータを予測しようとする。

---

## 3. 汎化誤差を小さくする方法

汎化誤差を抑えるためには、以下のような対策が有効です。

### ① 適切なモデルの選択
- **複雑すぎるモデル** → 過学習
- **単純すぎるモデル** → 過小学習
- **適切なモデルの選択が重要！**

### ② 十分なデータの確保
- 訓練データを増やすことで、より一般化しやすいモデルを構築できる。
- **データ拡張（Data Augmentation）**などの手法も有効。

### ③ 正則化（Regularization）
- **L1正則化（Lasso）**や**L2正則化（Ridge）**を用いることで、モデルの複雑さを抑える。
- 過学習を防ぐための手法として有効。

### ④ クロスバリデーション（Cross Validation）
- 訓練データを複数の分割に分けて学習・評価を繰り返すことで、モデルの汎化性能を確認する。
- **代表的な方法:** k-分割交差検証（k-fold Cross Validation）

### ⑤ ドロップアウト（Dropout）
- **ニューラルネットワーク**では、一定の割合のノードをランダムに無効化することで、過学習を防ぐ。

---

## 4. 具体例

### 例1: 手書き数字認識（MNISTデータセット）
- **問題:** ニューラルネットワークを訓練すると、訓練データの精度は **99%** だが、テストデータでは **85%**。
- **原因:** 学習データには適合しているが、新しいデータにはうまく対応できていない（過学習）。
- **対策:** 正則化、データ拡張、ドロップアウトなどを導入。

### 例2: 株価予測
- **問題:** 過去の株価データを学習したモデルが、訓練データで **95%の精度** だが、翌月のデータでは **60%**。
- **原因:** 過学習の可能性が高く、モデルが特定のパターンを学びすぎた。
- **対策:** 特徴量の選択、L2正則化、時系列クロスバリデーションの実施。

---

## 5. 汎化誤差のまとめ

- **汎化誤差** ＝ 訓練データとテストデータの誤差の差
- **小さいほど**、未知のデータにも強いモデル
- **大きい場合の原因**
  - **過学習（Overfitting）**
  - **過小学習（Underfitting）**
- **対策**
  - 適切なモデルの選択
  - データ量の確保
  - 正則化、クロスバリデーションの活用
  - ドロップアウト（Deep Learning向け）

**「学習データではうまくいくけど、実際に使うとうまくいかない…」というときは、汎化誤差が大きい可能性を疑いましょう！**

---

# 汎化誤差を評価しよう！

機械学習におけるモデル評価のためのデータ分割手法の3つを紹介します。

## 1. 交差検証法（Cross Validation）

データセットを複数の分割に分けてモデルを学習・評価する手法。

### **k-分割交差検証（k-fold Cross Validation）**
- データセットを **k個に分割** し、1つをテストデータ、それ以外を訓練データとして **k回繰り返す** 方法。

### **メリット**
- すべてのデータを訓練と評価に使用できるため、汎化性能を正確に測れる。
- データの分割による影響が少ない。

### **デメリット**
- k回学習を繰り返すため、計算コストが高い。

---

## 2. ローテーション法（Leave-One-Out Cross Validation, LOOCV）

**1つのデータをテストデータとし、残りを訓練データとする手法。**
- **100個のデータがある場合：**
  - 99個で学習し、1個でテスト。
  - これを **100回繰り返し**、すべてのデータをテストデータに使う。

### **メリット**
- データ数が少ない場合でも、データを最大限活用できる。
- データの分割による偏りがない。

### **デメリット**
- データ数が多いと計算コストが非常に高くなる（1000個のデータなら1000回学習が必要）。

---

## 3. ホールドアウト法（Holdout Method）

データセットを **訓練データとテストデータに分け、一度だけ学習・評価する手法**。

### **メリット**
- 計算コストが低く、素早く評価できる。
- **大量のデータ** がある場合に適している。

### **デメリット**
- データの分割が固定されるため、評価結果が変わる。
- データ量が少ない場合、汎化性能が正しく測れない可能性がある。

---

## 4. どの手法を選ぶべきか？

| 手法 | 計算コスト | データの有効活用 | 汎化性能の評価精度 | データが少ない場合の適性 |
|------|----------|----------------|----------------|------------------|
| ホールドアウト法 | 低い | 低い | 低い | ❌ |
| k-分割交差検証 | 中程度 | 高い | 高い | ⭕ |
| ローテーション法（LOOCV） | 高い | 非常に高い | 非常に高い | ⭕ |

---

## 5. まとめ
計算コストと精度のバランス を考えて手法を選ぶ！

データが多いなら → ホールドアウト法
データが中程度なら → k-分割交差検証
データが少ないなら → ローテーション法（LOOCV）
S3の替わりにminioを入れよう

docker-compose.ymlの良きところへ以下を記述


```yaml
  minio:
    container_name: "${COMPOSE_PROJECT_NAME}.${APP_ENV}.minio"
    image: "minio/minio:RELEASE.2022-06-25T15-50-16Z.fips"
    environment:
      MINIO_ROOT_USER: "asdfghjASDFGHJ"
      MINIO_ROOT_PASSWORD: "asdfghj1234567"
    entrypoint: "bash"
    command: '-c "/opt/bin/minio server /data --address :9000 --console-address :9001"'
    volumes:
      - "./s3/data:/data"
    ports:
      - "9000:9000"
      - "9001:9001"
    networks:
      - "backend"
```

```.env
COMPOSE_PROJECT_NAME=test_project
APP_ENV=local
WEB_PORT=80

```

DIRは
```
プロジェクトDIR
│
└environments\local
       └local
           ├ s3
           │    └data
           ├.env
           └docker-compose.yml
````
AIエージェントデザインパターン実践：リフレクション

## AIエージェントのデザインパターンを実装する

AIエージェントをLanggraphで実装する「LangChainとLangGraphによるRAG・AIエージェント［実践］入門」を読み、AIエージェントのデザインパターンを実際のユースケースに当てはめてColaboratory上で実装してみる。

https://gihyo.jp/book/2024/978-4-297-14530-9

今回は「リフレクション」パターンを実装してみる。
リフレクションパターンは、LLMが生成した回答について、内容が十分かを検証して内容に情報を付与したり、再度回答を生成させて回答の精度を上げることを目的とする。

## セルフリフレクション、クロスリフレクション

LLMが生成した回答について、同じLLMが回答を検証する場合は「セルフリフレクション」、検証は別のLLMが行う場合は「クロスリフレクション」となる。
Colaboratory中のllm_judgeを同一のLLMモデルにすると前者、異なるLLMモデルにするとクロスリフレクションとなる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517503/b9db3bc5-63bf-4877-9d42-be2b655a9629.png)

https://colab.research.google.com/drive/1VxX8mNIvsqxJrp1SOy0KSdqD6Igphbmg?usp=sharing

質問例としては、「スマートフォンの電源が入らなくなってしまいました。原因を教えてください。」と入力して原因と考えられることが複数回答として返ってきた。

## ヒューマンリフレクション

LLMが生成した回答について、人間がジャッジを行うことを「ヒューマンリフレクション」となる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517503/a39afe5d-62aa-440f-9dd4-ddc62b9c7e12.png)

https://colab.research.google.com/drive/19jmUPqTVZrDRp9KD0Zx4_oRARXGPLqGZ?usp=sharing

質問例としては、上記と同じものを入力し、出力を確認してユーザーが満足するまで繰り返し回答を作成した。
【個人開発】Flutter×ChatGPTで実現！単語メモアプリ『Hello Word』

# 「Hello Word」で語学学習をもっとスマートに！

## はじめに
語学学習者向けの新しい単語メモアプリ「Hello Word」をご紹介します。今回の記事では、アプリの背景、特徴、開発過程での工夫、そして今後の展望について詳しくお伝えします。使いやすさと利便性にこだわった本アプリが、皆さんの学習のパートナーとしてお役に立てれば幸いです。

## アプリの概要
「Hello Word」は、従来の単語帳の枠を超え、ユーザーが自由に単語や例文、説明を登録・管理できるシンプルなツールです。  
アプリ名の由来は、プログラミングの世界でおなじみの「Hello World」から「l」を取り除いたもので、単語をしっかり覚えたら次のステップへ進めるという前向きな意味が込められています。さらに、英語仕様で設計することで、世界中のユーザーが利用できるグローバルなツールを目指しています。

## 開発の背景とモチベーション
海外出張中、現地で目にした看板やメニュー、さらには日常の中でふと調べた単語がすぐに記録できず、後で見返す際に不便さを感じた経験から、本アプリの開発に至りました。  
また、Duolingoなどで間違えた単語を復習したいと思いつつ、iOSの標準メモアプリでは検索や整理が難しいという課題もありました。こうした学習者の悩みに応えるため、シンプルながらも機能性に富んだアプリを作ることが目的です。

## 開発環境と技術的な工夫
本プロジェクトは、以下の環境で開発されました。

- **ハードウェア:** M2 MacBook Air  
- **ソフトウェア:** Visual Studio、Flutter  
- **支援ツール:** ChatGPT o3 mini high  
  - このツールは軽量ながらも最新のプログラミング情報やライブラリへの対応情報を迅速に提供してくれるため、エラーの削減やコード補完に大いに役立ちました。開発者の皆さんには、特に最新の検索機能との連携で、よりスムーズな開発プロセスを実感いただけるでしょう。

特に、最新のライブラリや検索機能を駆使することで、従来の開発時に頻発していた構文エラーやバージョン非対応の問題を解消。これにより、よりスムーズな開発プロセスと高品質なアプリケーションの実現が可能となりました。

## アプリの主な機能
「Hello Word」には、語学学習を効果的にサポートするための多彩な機能が搭載されています。

1. **単語の登録と管理**  
   ユーザー自身が単語を自由に登録でき、意味、説明、例文、さらには関連するタグ付けなど、細かな情報管理が可能です。カテゴリー分けにより、後からの検索や復習が容易になります。

2. **復習機能**  
   覚えた単語や苦手な単語をリスト化し、定期的に復習できる仕組みを実装。今後は、学習スケジュールの自動生成機能も追加予定で、より効率的な学習が実現します。

3. **写真保存機能**  
   現地で見た看板やメニューの写真を取り込み、該当の単語と連動させることで、視覚情報をもとに記憶の定着を促進。リアルな学習体験をサポートします。

4. **フラッシュカードモード**  
   正解・不正解の記録を基に、出題順序を自動調整するフラッシュカード機能を搭載。自分の苦手分野を重点的に復習することで、効率的なスキルアップを図れます。

## 今後の展望とフィードバック募集
「Hello Word」は、ユーザーの皆さんからのフィードバックをもとに、以下のような機能拡充を計画中です。

- **多言語対応の強化:** 日本語以外の言語にも対応し、世界中の学習者が利用できる環境を整備します。  
- **コミュニティ機能:** ユーザー同士で学習の進捗やコツを共有できるコミュニティ機能の実装を検討しています。  
- **AIを活用した自動復習スケジュール:** ユーザーの学習履歴に基づき、最適な復習タイミングを提案する機能を導入予定です。

語学学習に励む皆さんが、より効果的に学習を進められるよう、日々改善とアップデートを重ねていく所存です。ぜひ、「Hello Word」を活用し、楽しく着実に語学力を向上させてください。

## アプリのダウンロード
現時点ではiOS版のみリリース済みです。今後、Android版など他プラットフォームへの展開も検討中です。  
以下のリンクから「Hello Word」をダウンロードいただけます。ぜひお試しください！  
[Hello Word をダウンロードする](https://apps.apple.com/app/id6742373610)

https://apps.apple.com/app/id6742373610

## まとめ
今回、シンプルな単語メモアプリ「Hello Word」の開発を行いました。  
皆さんのご意見・ご質問をお待ちしておりますので、ぜひコメント欄からお寄せください。

皆さんと一緒に、より良い学習環境を作り上げていきましょう！
新米データサイエンティストの日常（架空）｜ビジネス視点編

# はじめに
今回は、「新米データサイエンティストの日常」シリーズの第３弾になります。
新米データサイエンティストが躓きがちなテーマについて、先輩データサイエンティストと会話しているシーンをChatGPTに生成してもらいました。

第２弾はこちら↓

https://qiita.com/UKI_datascience/items/d29c89f24cc042450320

---

# **登場人物（架空）**
- **佐藤**：入社１年目の新米データサイエンティスト。
- **田中**：入社５年目の先輩データサイエンティスト。
- **山本**：クライアント企業のマーケティング部長であり、今回のプロジェクトの意思決定者。
- **鈴木**：クライアント企業のデータ担当。

---

**📍 クライアントのオフィス or オンライン会議**  

**佐藤**：「本日は、弊社で実施した顧客離反予測の分析結果についてご報告いたします。」  

**山本**：「よろしくお願いします。」  

**佐藤**：「まず、過去2年間の購買データをもとに、ランダムフォレストを用いた離反予測モデルを構築しました。その結果、モデルの精度は85%となり、主要な特徴量として『購入頻度』と『最終購入日』が特に影響を与えていることが分かりました。」  

**山本**：「ええと、つまり？」  

**佐藤**：「つまり、このモデルを使えば、どの顧客が離反しやすいかを事前に予測できます。」  

**鈴木**：「85%の精度というのは、高いのでしょうか？ それとも普通？」  

**佐藤**：「業界の一般的な水準と比べると、比較的高い精度が出ていると思います。」  

**山本**：「うーん、正直、私たちとしては数値の良し悪しよりも、この結果をどうビジネスに活かせるのかが知りたいんですが…。」  

**佐藤**：「あっ…そうですよね…。えっと…この結果をもとに、離反しそうな顧客に対してアプローチが可能になります。」  

**山本**：「例えば？」  

**佐藤**：「えっと…例えば…、えーと…」  

（沈黙が流れる）  

**山本**：「正直、この結果をどう活用すればいいのか、今のところピンとこないですね。具体的に、どんな施策につなげればいいのか提案できますか？」  

**佐藤**：「……すみません、そこまでは考えられていませんでした。」  

**山本**：「分かりました。では、このデータを活用するための具体的なアクションプランも含めて、再度ご提案いただけますか？」  

**佐藤**：「はい…申し訳ありません…。持ち帰って、検討いたします。」  

（報告終了後、佐藤は落ち込んだ様子でオフィスに戻る）

---

**【シーン2：オフィスでの振り返り（先輩データサイエンティスト・田中とのやり取り）】** 

**佐藤**：「田中先輩、ちょっといいですか？ さっきクライアントの意思決定者の方に分析結果を報告したんですけど、なんか思ったより反応が悪くて……。ちゃんとモデルの精度とか特徴量の重要度も説明したのに、微妙な感じでした。」  

**田中**：「なるほど。具体的にどんな説明をしたの？」  

**佐藤**：「はい。まず、過去の購買データを使って顧客の離反を予測するモデルを作ったので、その精度が85%あることを伝えました。それから、ランダムフォレストを使って重要な特徴量を分析した結果、『購入頻度』と『最終購入日』が特に影響していることを示しました。」  

**田中**：「うん、それ自体は悪くないね。でも、クライアントはどんな反応だった？」  

**佐藤**：「『それで結局、どうすればいいの？』って言われました…。せっかく高精度なモデルができたのに、なんか納得してもらえなかったんですよね。」  

**田中**：「あー、よくあるやつだね。佐藤の説明は“データサイエンス的には”正しいんだけど、“ビジネス的には”まだ足りないんだよ。」  

**佐藤**：「えっ、どういうことでしょうか？」  

**田中**：「クライアントが知りたいのは、“高精度なモデルができた”って話じゃなくて、“このモデルをどう活用すればビジネスが良くなるのか”ってこと。たとえば、離反しそうな顧客がわかるなら、どういう施策を打てばいいのかまで提案した？」  

**佐藤**：「えっと…そこまでは考えてなかったです。分析結果を報告すれば、あとはクライアントが判断するのかなと思っていました。」  

**田中**：「うん、それがデータサイエンティストが陥りがちな落とし穴なんだよね。データ分析はあくまで手段であって、目的はクライアントの課題解決でしょ？」  

**佐藤**：「確かに…。でも、どうやってそこまで踏み込めばいいんでしょうか？」  

**田中**：「まずは、クライアントのビジネスゴールをもっと深く理解すること。今回のケースなら、“離反を防ぎたい”っていうのが目的だよね？」  

**佐藤**：「はい、そうですね。」  

**田中**：「じゃあ、“離反しそうな顧客が分かったら、どういうアクションができるか”って考える。例えば、『クーポンを配る』とか、『個別フォローをする』とか、具体的な施策を提案できたら、クライアントも『それなら活用できそうだ』って納得しやすくなるよ。」  

**佐藤**：「なるほど…！ただ分析結果を報告するだけじゃなくて、それをどうビジネスに活かせるかまで考えないとダメなんですね。」  

**田中**：「そうそう。それと、報告のときは技術的な話をしすぎないことも大事。クライアントの意思決定者はデータサイエンスに詳しくないことが多いから、例えば『モデルの精度が85%です』って言われても、それが良いのか悪いのかピンとこない場合がある。」  

**佐藤**：「あ、それも言われました！『85%って十分なの？』って。」  

**田中**：「でしょ？ だから、ビジネス的な視点で意味を補足してあげる。たとえば、『このモデルを使うと、100人のうち85人は正しく離反を予測できるので、優先的にフォローするべき顧客を見極められます』みたいに伝えると、もっと納得感が出るよ。」  

**佐藤**：「確かに、それならイメージしやすいですね…！」  

**田中**：「うん。それに、クライアントと話すときは“分析結果の提示”じゃなくて“意思決定のサポート”を意識すること。データの裏付けを持った“次のアクション”を示せるようになると、一気に信頼されるようになるよ。」  

**佐藤**：「なるほど…！今日の報告は“データを見せる”だけになってたので、次は“ビジネスに活かす”ところまで考えて話してみます！」  

**田中**：「いいね！ せっかくの分析結果を最大限に活かすためにも、クライアントの視点を持つことを忘れないようにしよう！」
【CUI】vimの使い方【vim】

C UIとgitを使ったことある人ならほぼ100%の人が使ったことであるであろう、デフォルトで入っている簡易テキストエディタ、vim。

`git commit`コマンドで-gオプションを追加せずに行うとコミットメッセージを入力する画面、あのエディタがvimです。

特にテキストエディタをダウンロードしていないならこれが起動すると思います。

なかなか使い方がわからない人も多いと思います。
なので使い方を紹介します。

# vimの起動法
とても簡単で、以下のコマンドを実行するだけです。
```zsh
vim (アクセスしたいファイルの相対パス or 絶対パス)
```

とても簡単ですね。

しかし、キーを打ってもエラーが出ますし、保存や終了の仕方もイマイチ分かりにくいですよね。

# vimの操作の仕方
まず入力。これがないと何もできません。

### 入力
簡単です。
入力したい行で`i`キーを押すだけです。
そうすると下に`--INSERT--`と出てきます。
これで入力モードになりました。

### 入力の終了
これはとても簡単で`esc`。これだけです。

### 保存して終了
下に`--INSERT--`が出ていない状態で、`:wq`

### 保存せずに終了
`:q!`です。

`:q`でもいいのですが、何かしら変更がある場合は変更があるよと言われてしまいます。
![Screenshot 2025-03-07 at 21.07.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3660371/7c7380c1-a27a-47fa-9f3e-8e64b9efece3.png)

なので、強制終了の意を表す`!`をつけるのです。

# まとめ
vimは慣れないと大変なテキストエディタですが、やはりCLI上で実行できるというのは大きいですので、慣れておくといいと思います。

では、楽しいCLI人生をお送りください。
VBAのディクショナリーのネスト（親ディクショナリー、子ディクショナリー）

はじめに
値　以外をデバックプリントしようとしないでください


    Sub 都道府県市区町村()

    ' 都道府県ディクショナリを作成
    Dim 都道府県 As Object, 市区 As Variant
    Set 都道府県 = CreateObject("scripting.dictionary")

    ' Excelテーブルのデータを配列に格納
    Dim arr As Variant
    '注目！　テーブル　のデータ行は　.DataBodyRange　です
    arr = list.ListObjects(1).DataBodyRange

    Dim r As Long

    ' 各行をループ処理
    'ヘッダーが含まれていないので　1　始まり
    For r = 1 To list.ListObjects(1).DataBodyRange.Rows.Count

        ' 親キー（都道府県）と子キー（市区）を取得
        Dim 親キー As String, 子キー As String
        親キー = arr(r, 2)
        子キー = arr(r, 3)

        ' 親キーがディクショナリに存在しない場合、新しい辞書を作成して追加
        If Not 都道府県.exists(親キー) Then
        
            Set 市区 = CreateObject("scripting.dictionary")
            
            都道府県.Add 親キー, 市区
            
        End If

        ' 子キーが親キーの辞書に存在しない場合、新しい項目を追加
        If Not 都道府県(親キー).exists(子キー) Then
        
            都道府県(親キー).Add 子キー, arr(r, 4)
            
        End If

    Next r

    ' 都道府県ディクショナリのアイテムを出力
    Dim 出力 As Variant
    Dim 出力1 As Variant
    アイテム　ズ　は全てのアイテム（データ、値）を返します

    For Each 出力 In 都道府県.items
    都道府県から直接、市区ディクショナリーを取り出します
        For Each 出力1 In 出力.items
        出力にはそれぞれの市区辞書が取り出され、市区辞書には町村が登録されています
            Debug.Print 出力1 ' 子キーの値を出力
            
        Next 出力1
        
    Next 出力

    End Sub
    都道府県キー　市区辞書　市区キー　町村名
MS700に合格しました

先日MS700試験に合格しました。試験勉強と自宅受験について残します。

試験サイト
https://learn.microsoft.com/ja-jp/credentials/certifications/m365-teams-administrator-associate/?practice-assessment-type=certification

合格！
1000点中770点(700点合格)でした。
50問ほど
140分だったと思います。

ケーススタディ数問や1問1答、回答後見直し不可の問題が6問ほど出ました。

トレーニングコースになかった(と思われる)部分が出て驚きましたが、試験中に使えるMSLearnの検索でどうにか乗り切りました。MSLearnの検索は慣れと大体のアタリをつける必要があるので、試験前に触っておいた方がいいですね。

試験勉強
・上に貼ったサイト上のトレーニングコースを勉強しました
・Udemyの講座を通して観ました
https://www.udemy.com/course/microsoft-teams-examlabpractice/
・上に貼ったサイトの模擬試験を(解答を覚えてしまうくらい)やりこみました

自宅受験
初めて自宅受験をしました。楽でした。おすすめです。
事前にOnVueのサイトとMicrosoftのサイトは見ておくといいと思います。
https://www.pearsonvue.com/jp/ja/microsoft.html
https://www.microsoft.com/ja-jp/events/top/certification

準備〜結果
まずはPCのシステムテスト。試験1週間前くらい及び前日あたりに受験する場所でやりました。ネットワークやカメラ、マイクのテストがあります。Mac対応か心配していましたが問題なくクリア！

試験当日は免許、パスポート、マイナンバーあたりの準備も忘れずに。試験直前に指示に従って写真撮ったものを送付しました。

手の届く範囲を片付けました。モニターやメモ帳、筆記用具、本あたりはNGだったと思います。怖いので手の届く範囲はPC以外何も置きませんでした。

上記諸々実施後、順番待ちとなり、担当の方の判断でチェックインが完了します。順番がくれば試験時間より早く開始になることもあります。

チェックイン後、急に試験についての説明画面になり、試験スタートしました。様々なタイプの問題が出たので、答え方で悩まないためにも、事前にMS試験サイト上のサンドボックスは何回かやっておくと安心！

時間いっぱい使ったので、残り時間0になった途端に結果が表示されました。

その後メールが届きました。領収書が必要だったので、受験後にOnVueのFAQを参考に発行依頼しました。

あまり整理の時間が取れなかったので作り込めませんでした、、、
以上です。これから受験する方の助けになりますように！