OmniAICreator/Qiita-1.07M huggingface dataset:
育休をとりながら、AWS全冠を達成した男のはなし

# はじめに

<!-- 挨拶文を入れてください -->
みなさん、こんにちは。  
育児休暇と平行してAWS認定取得を行い、  
この度、**[2024 Japan AWS All Certifications Engineers ](https://aws.amazon.com/jp/blogs/psa/2024-japan-aws-all-certifications-engineers/)に初選出**いただきました。  
育児に取り組みながらの認定試験対策で得た、学びを記載します。  
育児休暇中のリスキングに関しては、批判的な意見もあるとは思います。  
当然私も子どもと妻を最優先、次点で認定資格対策に取り組みました。  
育児をしながらのリスキングは大変な面もありましたが、  
疲れた時も、我が子の寝顔でやる気をだして、乗り切ることができました。  
私の周りでも育児休暇中にリスキングに取り組まれる方は増えており、  
この内容が、そのような方の参考になれば幸いです。  
認定試験の学習ノウハウは他の方が多く記事を書かれているので、今回は割愛します。  


<!-- 挨拶文を入れてください -->

# 男性の育児休暇取得状況
政府として、男性育休取得の促進しており、  
令和5年の男性育休等取得率は46.2％、男性の育休等平均取得日数は46.5日(速報値)です。  
参考: [「令和５年度男性の育児休業等取得率の公表状況調査」 （速報値）](https://www.mhlw.go.jp/content/001128241.pdf)  


# 育休開始前の経験、取得済み認定

パブリッククラウド関連業務に2019年から従事しており、主にAWSを使用してきました。  
以下は全冠を目指して学習を始めた時点で当時取得済みだった認定資格です。  

- AWS Certified Solutions Architect - Associate
- AWS Certified SysOps Administrator - Associate
- AWS Certified Developer - Associate
- AWS Certified Solutions Architect - Professional
- AWS Certified DevOps Engineer - Professional

# 育休と認定試験のスケジュール

| 日付 | イベント | 
| --- | --- | 
| 2023年11月中旬 | AWS全認定を取ろうと決断。職場上司、家族に目標を伝える。 | 
| 2023年12月2日 | Machine Learning - Specialty取得 | 
| 2023年12月10日 | Data Analytics - Specialty取得 | 
| 2023年12月下旬 | 育休開始 | 
| 2023年12月末 | 第一子誕生 | 
| 2023年12月30日 | Database - Specialty取得 | 
| 2024年1月上旬 | 妻＆子供退院 | 
| 2024年1月10日 | Security - Specialty取得 | 
| 2024年1月20日 | SAP on AWS - Specialty取得 | 
| 2024年2月上旬 | 育休終了。職場復帰(リモート勤務) | 
| 2024年2月12日 | Cloud Practitioner＆Advanced Networking - Specialty取得 |
| 2024年6月 | AWS All Certifications Engineersに選出 |

# 育休中の過ごし方
- 何よりも子どもと妻が最優先です。  
- 基本的には私が深夜から朝までの育児をメインで担当し、妻は日中の育児をメインで担当していました。残りの時間は二人で分担をしました。  
- 深夜から早朝は、ミルクをあげながらYouTube動画の音だけ聞いて学習を実施。  
- 子どもが寝ている間には書籍やUdemy、ハンズオンで勉強。  
- 試験は全てオンラインで受験しました。(試験前後の移動時間を節約するため)  

# 気づき事項
- 家族や職場の同僚へ全冠を目指すこと宣言することが重要でした。  
- 子どもが生まれる前に育児用品を予め揃えておくことをお勧めします。子どもが生まれてからの準備は大変です。  
- 妻と私だけで育児を行うことはハードルが高く、周囲の支援を頼ることが重要でした。  
私の場合は、妻のご両親の手厚い支援(家事、炊事、洗濯、その他諸々)を頂きました。  
- 12月30日にオンライン受験時に、オンライン試験のチェックインが通常時よりとても長かったです。受験者が多いのか、試験監督が少ないのか。。。  
- 試験間隔をあけずに受験をすることで、再学習の工数を減らすことができました。  
- 生まれたばかりのわが子と過ごす時間は、かけがえのない貴重なものでした。  


# 終わりに

<!-- 〆の挨拶文を入れてください -->
最後までお読みいただき、ありがとうございました。  
大事なことなので繰り返しますが、育休中は**子どもと妻が最優先です**。  
本記事が育休中にリスキングに挑まれる方の参考、今後育休を取得される方の数の増加につながれば幸いです。  
<!-- 〆の挨拶文を入れてください -->

---

<!-- 他社商標に関する記載を適宜修正してください -->

- AWS は、米国その他の諸国における Amazon.com, Inc. またはその関連会社の商標です。
- その他、記載されている会社名および商品・製品・サービス名は、各社の商標または登録商標です。
【生物物理屋による論文紹介】複数種類の物理モデルを学習したシミュレーター

## はじめに
この記事は「[ただただアウトプットを癖付けるための Advent Calendar 2024](https://qiita.com/advent-calendar/2024/newbie2024)」に投稿した記事です。

[最初の記事](https://qiita.com/yotabouya/items/e63c53c5e18b3cf6a454#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB)にも書いた通り、私は生物物理の実験を専門にしている研究者です。
最近はデータ解析のため機械学習のコード開発も行っており、幸いにもその成果が[NeurIPSに採択されました](https://neurips.cc/virtual/2024/poster/93465)。

アドベントカレンダー最終日の論文紹介は、機械学習によるシミュレーターについてです。
前回の論文紹介と同様、NeurIPS2024に参加した際にポスターを見つけて興味を持った論文です。

## 関連記事

#### 前の記事 「[生物物理屋が数理最適化でブラックジャックに勝つ手を探してみた話 後編その2](https://qiita.com/yotabouya/private/60c3dfcac8ad04ce2372)」

#### 次の記事「[]()」

## TL;DR


## 論文

[Multiple Physics Pretraining for Physical Surrogate Models](https://arxiv.org/abs/2310.02994)

こちらはarXivに投稿されたプレプリントです。
前述の通り、NeurIPS2024に採択された論文です。その際のページは[こちら](https://neurips.cc/virtual/2023/75763)です。

## 誰が書いたのか

著者のほとんどは、Fratiron Instituteに所属する研究者らです。
残る2人は、ケンブリッジのMiles Cranmer氏と、ニューヨーク大学のKyunghyun Cho氏という構成です。

## 論文の概要

この論文は、様々な種類の物理モデルおよびデータを学習し、シミュレーターとして機能するニューラルネットワークを提案しています。

大前提として、この研究の対象はPDE（偏微分方程式）を含む物理モデルです。
PDEは、物理現象を記述するための数学的なモデルであり、例えば流体力学や熱伝導などの分野で広く用いられています。
PDEのキモになるのは、場の存在です。
これは流体の速度や、濃度などの物理量を空間座標の関数として表現するもので、PDEはこの場の時間変化を記述します。

## 学習

想定される学習対象は、物理モデルによるシミュレーション結果や、実際に測定されたデータです。
これは空間座標に対応する数値データが、サンプリングされた時間座標の数だけ存在するものです。
このデータを、Field Embeddingと呼ばれる手法で、ニューラルネットワークに入力します。
これは各座標に対応する埋め込みベクトルを得る操作です。
すなわちこれは時空間方向に連なる埋め込みベクトルの集団を有むことになります。
これを小さなトークンに分割し、トランスフォーマーに入力することで、物理モデルを学習します。
これはちょうど、日本語の文章をトークンに分割し、BERTに入力するのと似ていますね。
１次元に連なる文章と、何次元かに連なる時空間データという違いはありますが。
実際、この論文においても、事前学習ののちに、特定の物理モデルに対してファインチューニングを行っています。
事前学習は多様なPDEのシミュレーション結果を含んだ大規模なデータセットでおこない、ファインチューニングは特定のデータに対して行います。これがこの論文の特徴です。

## Field Embedding

この部分は、物理モデルの場の情報を埋め込むための手法です。
学習データにはしばしば複数の物理量が含まれますが、ここではそれらを線形に混合して、ひとつの埋め込みベクトルの場を作ります。
これによって、様々な種類の物理量を同時に扱うことができます。
また、これの前処理として、データの正規化を行います。
しかもこの正規化は可逆なもので、学習後にも逆変換が可能です。
これによって、任意のスケールのデータを扱うことができます。

## 検証

このシステムの検証は、非線形PDEによる流体シミュレーション結果を用いて行われました。
具体的には、Navier-Stokes方程式や、浅い水の方程式、反応拡散方程式が用いられました。
これらの物理モデルは、流体の速度や圧力、濃度などの場を記述するものです。
これらのデータは乱流などを含むものですが、ファインチューニング後のモデルは、これらの物理モデルによるシミュレーション結果と非常によく一致したと報告されています。
3Dの流体シミュレーションにおいても、高い精度が得られたとのことです。

## まとめ

トランスフォーマーを用いた物理モデルの学習を、広範な物理モデルに対して行っておくことにより、特定のタスクにも精度向上がみられることが示されました。
気になるのは、データセットが基本的には流体に閉じていることです。
これを量子系や、確率系に拡張していくことができたら、個人的には非常に面白いと思います。
リロードしても更新されない時のスーパーリロード

フロントエンドのコードを修正したのに関わらず反映されないって時や、画像ファイルが（キャッシュのせいで）更新されないときなどに有効です。  
Ex：ファビコンの修正、チャットボットアプリなどでアイコンを新しく追加したときなど  

[詳しくはこちら](https://managesite.jp/resource/1638)

### 方法

#### Windows

**Google Chrome**  
- 「Ctrl + Shift + R」  
- 「Shift + F5」  
- 「Ctrl + F5」  
- 「Shift」キーを押しながら「再読み込みボタン」をクリック  
- 「Ctrl」キーを押しながら「再読み込みボタン」をクリック  

**Microsoft Edge**  
- 「Ctrl + Shift + R」  
- 「Shift + F5」  
- 「Ctrl + F5」  
- 「Shift」キーを押しながら「再読み込みボタン」をクリック  
- 「Ctrl」キーを押しながら「再読み込みボタン」をクリック  

#### Mac

**Google Chrome**  
- 「Cmd + Shift + R」  
- 「Shift」キーを押しながら「再読み込みボタン」をクリック  

**Safari**  
- 「Shift」キーを押しながら「再読み込みボタン」をクリック
休職を決断した話

初めての投稿となりますので温かい目で閲覧していただくと主が喜びます:relaxed:

2024年の4月から未経験でインフラエンジニアとして入社し早8か月。
不安ばかりでできないことも多く、客先に迷惑となることも多々ありましたがこの度、適応障害からうつ病に進化したため休職させていただくことになりました。
少し早すぎない！？と思うかもしれませんがお気になさらず。:raised_hand:

# 経緯
2022年4月~2024年3月　陸上自衛隊に勤務し2年間の任期を満了し退職
2024年4月~ ITエンジニアに興味があり未経験からでも挑戦できるインフラエンジニアとして入社。

### 精神崩壊レベル１
入社説明では3か月間の研修があると聞いていたにもかかわらず、入社後1週間で現場に1人で突っ込まれる。
右も左もわからないにも関わらず、客先からはプロとして扱われ、「分からないです」「時間がかかります」と答えると罵詈雑言が飛んでくる始末。
　⇒ 営業担当が何でもできますと客先に言っていたそう・・・:frowning2:
 
できることは増えてきたが流石に資格とかもっていないと証明にはならないので「LinuC Level１,２」「CCNA」「基本情報」を取得。
　⇒ この資格でお給料も上がると聞いていたのに１円も上がらない始末:frowning2:（くそが）

### 精神崩壊レベル２
そんなこんなで仕事をしていると、休日にも仕事のこと（次ミスしたらどうしよう？分からなくても聞く人いないしどうしよう？）を考えてしまい不眠症に。
一旦病院で事の顛末を大まかに伝え、睡眠薬ゲット！まだ働ける！と考えて仕事をしていましたが、会社からもっとこうしてほしい、未経験だから何？、お前何ができるの？、そんな理由で病院に行くなと言われる。
　⇒ 過呼吸、対人恐怖症、食欲不振が追加され適応障害と診断。

### 精神崩壊レベルMAX
担当営業が出向先に何を言ったのか知らないけど、休日明けて出向先に行くと私のありもしないような噂話（親が人殺し）や悪口（いる必要ある？）、誰から聞いたのか元をたどるとうちの会社。（絶句）
　⇒ 上記に加えて人間不信も追加。

 ある日会社に行こうとすると、体が全く動かなくなって有休使って休んだけど、休み中にも担当営業から電話があり、その内容が「有休使うな」でした。
 うるせえよ。と思い無視して精神科を受診（適応障害になってから3か月）すると、うつ病と診断され、休職を促されました。
 とりあえず、休職しよう思い、事前に会社へ伝えてから「診断書」「休職願」を会社にもっていくとまさかの、受理されない！？！？
 　⇒ 事前に伝えたときは引継ぎなしでいいよと聞いていたのに、会社ではあと数か月引継ぎを用意するまで待て。と。
  　　もう無理限界:pensive:←今ココ


また進展がありましたら、投稿させていただきます。
長々と、失礼いたしました。
【TypeScript】type-challenges 中級編 2・Get Return Type 解説

## お題
`ReturnType<T>`を使用せず、`T`の戻り値の型を取得する型`MyReturnType`を実装する。

## やりたいこと
```ts
type Result1 = MyReturnType<() => string>; // => string

const fn = (v: boolean) => {
  if (v)
    return 1
  else
    return 2
}
  
type Result2 = MyReturnType<typeof fn>; // => "1 | 2"
```

## 解答
```ts
type MyReturnType<T extends (...args: any[]) => any> = 
  T extends (...args: any[]) => infer U
  ? U
  : never;
```

## 解説
### 処理の流れ
- `<T extends (...args: any[]) => any>`
`T`が関数の型であることを制約
- `T extends (...args: any[]) => infer U ? U : never;`
`Infer`を使って、関数の戻り値の型を推論
条件分岐に従って、戻り値の型か`never`を返す

**今回の問題は、初級編 3312・Parametersと似ています。こちらの[解説記事](https://qiita.com/yuto99999/items/5f18cf1697d6c8e09349)を参考にしてみてください！**

### 関数の型を宣言するには？
https://qiita.com/yuto99999/items/5f18cf1697d6c8e09349#%E9%96%A2%E6%95%B0%E3%81%AE%E5%9E%8B%E3%82%92%E5%AE%A3%E8%A8%80%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF

### 残余引数とは...
https://qiita.com/yuto99999/items/5f18cf1697d6c8e09349#%E6%AE%8B%E4%BD%99%E5%BC%95%E6%95%B0%E5%8F%AF%E5%A4%89%E9%95%B7%E5%BC%95%E6%95%B0%E3%81%A8%E3%81%AF

### inferとは...
https://qiita.com/yuto99999/items/057e28323118c4ac5de0#infer%E3%81%A8%E3%81%AF

## 今回の問題
https://github.com/type-challenges/type-challenges/blob/main/questions/00002-medium-return-type/README.ja.md
FinOps X Europe参加　虎の巻


# はじめに

<!-- 挨拶文を入れてください -->
みなさん、こんにちは。  
今回、バルセロナで開催されたFinOps X Europeに初めて参加してきました。  
今後参加される方が、FinOps Xを存分に楽しむ為のTipsを残します。
<!-- 挨拶文を入れてください -->

# FinOpsとは？
>"FinOps is an operational framework and cultural practice which maximizes
>the business value of cloud, enables timely data-driven decision making,
>and creates financial accountability through collaboration between
>engineering, finance, and business teams."  

FinOpsのベストプラクティスや教育、標準化を通じてFinOpsを実践する人々を支援する非営利団体であるFinOps Foundationは、上記のように定義しています。  
単純にクラウドのコストを削減するのではなく、ビジネスの価値を最大化する為のフレームワークやプラクティスがまとめられています。  
参考: [- FinOps Foundation, What is FinOps?](https://www.finops.org/introduction/what-is-finops/)  

# FinOps Xとは？
FinOps Xは、FinOps Foundationが主催するイベントであり、最新のトレンド、ベストプラクティス、ツール、技術について学ぶセッションが実施されます。  
組織や国境を超えてFinOpsに関わる人たちがネットワーキングを行い、知識を共有することができます。  
2024年はアメリカのサンディエゴとスペインのバルセロナで開催されました。  
私は11/11から11/14に行われたバルセロナのイベントに参加しました。  

# FinOps Xを存分に楽しむためのTips

### イベント参加前
- イベント会場に近いホテルを取りましょう。  
今回はイベント会場にもなっているホテルに泊まりました。
自部屋での小休憩や移動の手間を省略できます。  
- 事前申し込みが必要かつ人数制限があるセッションには、早めに申し込みましょう。
- LinkedInのアカウントは準備しておきましょう。
ネットワーキングで必要です。
- 出張不在中の業務は調整しましょう。
- 飛行機では時差ボケにならない程度に寝ましょう。
- FinOpsや各パブクラの認定をとりましょう。
日本国内ではAWS全認定者は飽和状態で価値が下がっていますが、  
AWS全認定を持っているというと、現地では羨望の眼差しで見られます。  

### イベント中
- 積極的に参加しましょう。
恥はかき捨て。スピーカーやブースの展示員を捕まえてガンガン質問をしましょう。  
パブリッククラウドが主催するイベントに比べると参加者数が少ないため、  
各社のFinOpsのミッションを担うエグゼクティブと会話ができたりします。
- 会話ネタ/雑談ネタを用意しておきましょう。
イベント主催元であるFinOps Foundationは参加者同士のネットワーキングを推奨しています。  
朝食/昼食/ディナー、エレベータでの移動中に話しかけられる、話しかけるチャンスがたくさんあります。  
是非参加者と会話をしましょう。  
会話ネタ/雑談ネタに困らないように、事前にいくつか考えておくことを推奨します。
	- ネタ例1：今日のキーノートの話○○だったよね。
	- ネタ例2：FinOpsにどう関わっているの？
	- ネタ例3：日本からのロングフライトかつ時差ですごい眠いんだよね。with 大げさな眠いリアクション。

### イベント後
イベントで得た情報をアウトプットしましょう。←私は今ここ。

# 終わりに
FinOps X Europeで発表された内容については、以下のFinOps Foundation Insightsや公式Youtubeに公開されています。  
興味のある方は、そちらを見てください。  
- [Keynote Day 1: Themes in FinOps at X Europe 2024](https://www.finops.org/insights/finops-x-europe-day-1-keynote/)
- [Keynote Day 2: Themes in FinOps at X Europe 2024](https://www.finops.org/insights/finops-x-europe-day-2-keynote/)
- [FinOps Foundation 公式Youtube動画](https://www.youtube.com/@finopsfoundation/videos)  


<!-- 〆の挨拶文を入れてください -->
FinOps自体は日本での注目度はまだ高くありませんが、グローバルでは広く取り入れられています。  
本記事が今後FinOps Xに参加される方の参考になれば幸いです。  
<!-- 〆の挨拶文を入れてください -->

---

<!-- 他社商標に関する記載を適宜修正してください -->

- The Linux Foundationは、The Linux Foundationの米国およびその他の国における登録商標または商標です。  
- その他、記載されている会社名および商品・製品・サービス名は、各社の商標または登録商標です。
生物物理屋がファインチューニングに挑戦してみた話その１

## はじめに
この記事は「[ただただアウトプットを癖付けるための Advent Calendar 2024](https://qiita.com/advent-calendar/2024/newbie2024)」に投稿した記事です。

[最初の記事](https://qiita.com/yotabouya/items/e63c53c5e18b3cf6a454#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB)にも書いた通り、私は生物物理の実験を専門にしている研究者です。
最近はデータ解析のため機械学習のコード開発も行っており、幸いにもその成果が[NeurIPSに採択されました](https://neurips.cc/virtual/2024/poster/93465)。

ここまでいくつかの記事でLLMについて触れてきましたが、あくまでも使う側であったり、論文を読むというところでした。
今回からは、自分でファインチューニングを行ってみることにしました。

## 関連記事

#### 前の記事 「[生物物理屋によるNeurIPS2024の感想](https://qiita.com/yotabouya/private/bcf2cb8c910964a14919)」

#### 次の記事「[生物物理屋がファインチューニングに挑戦してみた話その２](https://qiita.com/yotabouya/private/96a47b54715c163a36f8)」

## 参考書

[今日から使えるファインチューニングレシピ AI・機械学習の技術と実用をつなぐ基本テクニック](https://www.ohmsha.co.jp/book/9784274232381/)

githubに[リポジトリ](https://github.com/laboroai/finetuning_cookbook)があります。

## 今回の目標

教師なし異常検知のファインチューニングに関するレシピを体験してみる

## タスク

anomalibという異常検知用ライブラリのPatchCoreモデルを、テストデータでファインチューニングする

## やったこと

リポジトリのReadMeから、異常検知のjupyter notebookのところにあるopen in colabをクリックして、Colabで開きました。
セッションをGPU使用に変更し、セルを実行していきます。
画像データのダウンロードにおいてkaleidoというパッケージが必要だといわれたので、最初のセルのpip installに追加しました。
セッションを再起動して、セルを実行すると、最後まで回り切りました。

事前学習のみのPatchCoreモデルを使った場合にどうなるか確認してみようとしましたが、エラーが出てしまいました。
PatchCoreモデルの出力は、あくまでもファインチューニングを介して保持した特徴量との比較を前提として構築されるため、事前学習なしにはそもそも予測が不可能なようです。
この特徴量は、model.memory_bankに格納されていました。上記のエラー内容を見ると、これとデータの特徴量との距離を計算することで、異常度を算出しています。
生物物理屋がファインチューニングに挑戦してみた話その２

## はじめに
この記事は「[ただただアウトプットを癖付けるための Advent Calendar 2024](https://qiita.com/advent-calendar/2024/newbie2024)」に投稿した記事です。

[最初の記事](https://qiita.com/yotabouya/items/e63c53c5e18b3cf6a454#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB)にも書いた通り、私は生物物理の実験を専門にしている研究者です。
最近はデータ解析のため機械学習のコード開発も行っており、幸いにもその成果が[NeurIPSに採択されました](https://neurips.cc/virtual/2024/poster/93465)。

前回の記事から、LLMのファインチューニングに挑戦しています。
今回はその続きとして、自然言語処理の章から、類似文章検索のファインチューニングに関するレシピを体験してみることにしました。

## 関連記事

#### 前の記事 「[生物物理屋がファインチューニングに挑戦してみた話その１](https://qiita.com/yotabouya/private/f0a4732ef1dbe983913d)」

#### 次の記事「[生物物理屋がファインチューニングに挑戦してみた話その３](https://qiita.com/yotabouya/private/849dffed4a380f7105fa)」

## 参考書

[今日から使えるファインチューニングレシピ AI・機械学習の技術と実用をつなぐ基本テクニック](https://www.ohmsha.co.jp/book/9784274232381/)

githubに[リポジトリ](https://github.com/laboroai/finetuning_cookbook)があります。

## 今回の目標

類似文章検索のファインチューニングに関するレシピを体験してみる

## タスク

日本語BERTであるbert-base-japanese-v3を使って、テストデータでファインチューニングする

## やったこと

リポジトリのReadMeから、類似文章検索の学習用jupyter notebookのところにあるopen in colabをクリックして、Colabで開きました。
セッションをGPU使用に変更し、セルを実行していきます。

途中でweight & biasesのアカウントを作成し、APIキーを取得して、セルに入力しました。

その後はすんなりと回りました。

モデルはColabのストレージに保存されます。

さらに、評価用jupyter notebookからセルをコピーして、継続して走らせました。
類似度スコアの予測ができていることが確認できました。

追加で、ファインチューニング前のモデルでも評価をおこなってみました。
類似度スコアは算出されたものの、ほとんど定数（１）であり、まったく予測ができていないことがわかりました。
生物物理屋がファインチューニングに挑戦してみた話その３

## はじめに
この記事は「[ただただアウトプットを癖付けるための Advent Calendar 2024](https://qiita.com/advent-calendar/2024/newbie2024)」に投稿した記事です。

[最初の記事](https://qiita.com/yotabouya/items/e63c53c5e18b3cf6a454#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB)にも書いた通り、私は生物物理の実験を専門にしている研究者です。
最近はデータ解析のため機械学習のコード開発も行っており、幸いにもその成果が[NeurIPSに採択されました](https://neurips.cc/virtual/2024/poster/93465)。

前々回の記事から、LLMのファインチューニングに挑戦しています。
今回はその続きとして、強化学習のレシピを体験してみることにしました。
これは、RLHF(Reinforcement Learning from Human Feedback)という手法を使って、エージェントを学習させるものです。

## 関連記事

#### 前の記事 「[生物物理屋がファインチューニングに挑戦してみた話その２](https://qiita.com/yotabouya/private/96a47b54715c163a36f8)」

#### 次の記事「[【生物物理屋による論文紹介】グラフニューラルネットワークによる多変数パーシステントホモロジーの解析](https://qiita.com/yotabouya/private/a693a7d23f51358c5183)」

## 参考書

[今日から使えるファインチューニングレシピ AI・機械学習の技術と実用をつなぐ基本テクニック](https://www.ohmsha.co.jp/book/9784274232381/)

githubに[リポジトリ](https://github.com/laboroai/finetuning_cookbook)があります。

## 今回の目標

RLHFに関するレシピを体験してみる

## タスク

japanese-large-llm-1.7bをファインチューニングし、ポジティブな文を生成する

## やったこと

リポジトリのReadMeから、類似文章検索の学習用jupyter notebookのところにあるopen in colabをクリックして、Colabで開きました。
セッションをGPU使用に変更し、セルを実行していきます。

残念ながらimportでエラーが出てしまいました。
peftのLoraConfigのインポート時にtransformers.Cacheをインポートしようとしているのですが、見つからないと言われてしまいました。

pip install するtransformersのバージョンを最新の4.47.1に変更したところ、peftのインポートエラーは解消しました。 
しかしながら、trlのインポートでエラーが出てしまいました。
機械学習用のライブラリは変遷が早いのか、なかなかにバージョンがシビアですね。
【生物物理屋による論文紹介】グラフニューラルネットワークによる多変数パーシステントホモロジーの解析

## はじめに
この記事は「[ただただアウトプットを癖付けるための Advent Calendar 2024](https://qiita.com/advent-calendar/2024/newbie2024)」に投稿した記事です。

[最初の記事](https://qiita.com/yotabouya/items/e63c53c5e18b3cf6a454#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB)にも書いた通り、私は生物物理の実験を専門にしている研究者です。
最近はデータ解析のため機械学習のコード開発も行っており、幸いにもその成果が[NeurIPSに採択されました](https://neurips.cc/virtual/2024/poster/93465)。

今回の論文紹介は、トポロジカルデータ解析に踏み込んでみようと思います。
トポロジカルデータ解析とは、データのトポロジー的な特徴を解析する手法です。
私自身、もともと多変数パーシステントホモロジーに興味があり、NeurIPS2024に参加した際にこの論文のポスターを見つけて興味を持ちました。

## 関連記事

#### 前の記事 「[生物物理屋がファインチューニングに挑戦してみた話その３](https://qiita.com/yotabouya/private/849dffed4a380f7105fa)」

#### 次の記事「[生物物理屋がAWSに手を出してみた話](https://qiita.com/yotabouya/private/b185754378cb338da070)」

## TL;DR

多変数パーシステントホモロジーの解析を、グラフニューラルネットワークを用いて行う手法を提案しています。

## 論文

[Graphcode: Learning from multiparameter persistent homology using graph neural networks](https://arxiv.org/abs/2405.14302)

こちらはarXivに投稿されたプレプリントです。
前述の通り、NeurIPS2024にポスター発表された論文です。その際のポスターや説明動画は[こちら](https://neurips.cc/virtual/2024/poster/95396)です。

## 誰が書いたのか？

オーストリアのグラーツ工科大学の研究者らによって執筆されました。

## パーシステントホモロジー

パーシステントホモロジーとは、いわゆるトポロジカルデータ解析の手法の一つです。
ある形があるとき、どことどこが繋がっていて、そしてどこは切れているかということに着目した抽象化をホモロジーといいます。(実際には主に、どこに穴があるかということに着目します。)
この抽象化はデータに含まれるスケール(距離)を忘れることに対応しているので、実際のデータ解析においてデータ点間の距離を考慮したい場合には不都合が出てきます。(そもそも点群データに対しては、点がたくさんあるという情報しか拾えません)
ここの利便性を向上したのがパーシステントホモロジーです。
パーシステントホモロジーは、各データ点をある大きさに膨らませ、互いに重なったら繋げるというルールによって、点群から形を構築します。
この'ある大きさ'の値をパラメーターとして振り、それぞれに対してホモロジーを考えることで、どの値からどどこに穴ができて、どの値でふさがるか、という情報を揃えることができます。

## Birth-Deathプロット

パーシステントホモロジーにおける穴の生成と消滅の情報は、生成時と消滅時のパラメーターの値という、2次元のデータ点群として整理することができます。
このような整理によって描かれた図を、Birth-Deathプロットといいます。
トポロジカルデータ解析に用いる場合には、このBirth-Deathプロットを機械学習などにインプットすることが多いです。

## 多変数パーシステントホモロジー

上で説明したパーシステントホモロジーでは、点群データの"形状"がひとつのパラメーターに対してどう変遷するか、という情報が得られます。
対して、二つ以上のパラメーターに対する変遷を追うのが、多変数パーシステントホモロジーです。
これは、データ空間の各軸を同等に扱いたくない場合(時間座標と空間座標の混在など)や、データ点を選別するパラメーターを加えたい場合などに有効です。
特に後者については、データ点を局所密度によって選別するパラメーターを加えることで、ノイズあるいは外れ値に対する耐性を備えた解析につながることが報告されています。

ただし、多変数パーシステントホモロジーは、そのデータを処理可能な形に整理する難易度が跳ね上がっています。
Birth-Deathプロットを描こうとしても、BirthやDeathが曲線あるいは超曲面となってしまい、プロットに押し込めません。
データを整理する方法はいくつか提案されているのですが、煩雑で、少なくとも非数学者が扱うには難があるという印象です。
この点への解法となるのが、この論文の手法になります。

## グラフによる多変数パーシステントホモロジーの整理

筆者らは、グラフによる多変数パーシステントホモロジーの整理を提案しました。
これは、以下のように実現されます。
- 1つ以外のパラメーターを固定し、そこでのパーシステントホモロジーからBirth-Deathプロットを取得
- 固定されるパラメーターの値を振って、それぞれで得られたBirth-Deathプロットを保存していく
- こうして得られたBirth-Death点のそれぞれをグラフのノードとする
- 固定パラメーターの値が近いBirth-Deathプロットのペアを取り、そこに含まれて同じ穴に対応するノード間はエッジを持つとする

要するに、BirthやDeathの曲線あるいは超曲面について、1つ以外のパラメーターを固定することで得られる軸(あるいはBirth値とDeath値からなる平面)との交点の集合として取り扱うようなことをするわけです。
これはかなり直観的な操作ですので、出力されたものの意味を理解しやすい手法になっていると思います。

## 多変数パーシステントホモロジーの、グラフニューラルネットワークによる取り扱い

上記の手法で出力されるものはグラフですから、ただちにグラフニューラルネットワークによって扱うことができます。これも本手法の重要な利点です。
実際に論文の中でも多変数パーシステントホモロジーからグラフニューラルネットワークを介して分類タスクなどを試し、従来手法より良い精度を得たと報告しています。

## まとめ

多変数パーシステントホモロジーは複雑なデータ空間を扱うのに適した手法ですが、その出力もまた複雑でした。
この論文の手法により多変数パーシステントホモロジーの学習コストが下がれば、データ点群の形状に着目した解析が盛んになると思います。
パーシステントホモロジー自体、ホモロジーに根ざしているという解釈の透明さが魅力の一つになるのだと思います。
これが盛んに用いられ、データが溜まっていくことで、各種データが生まれる背景とデータ形状との関係性がより深く理解されていく、そういう道筋も期待したいところです。
P1P2片持ち梁の複数荷重 はりのたわみと不静定はり 基本例題6.12 P164「材料力学演習(20221021)」をsympyでやってみたい。


 

:::note info
前　　　 [問題8A) 　 　 P123 組合せ応力
](https://qiita.com/mrrclb48z/items/7ff5fd4dba41eb0cfdef)別解法　 [基本例題8.33 P289 ひずみエネルギとそれを使った材料力学
](https://qiita.com/mrrclb48z/items/f2ffdeba7c5d4058c8ea)
:::

# オリジナル
[基本例題6.12 P164 (pdf)](http://zairikiweb.starfree.jp/zai_enshuh/zai_enshuh_ver.3.3.pdf#page=169)＜[「材料力学演習(20221021)一括(ver.3.3)」を勉強したい。#sympy](https://qiita.com/mrrclb48z/items/c3274daf5f7a99cfe027#%E4%BD%9C%E6%A5%AD%E4%B8%AD%E7%A7%81%E3%81%AE%E8%A7%A3%E7%AD%94sympy)
？？？タブレット等で、pdfを開く事ができないかも。？？？　

# (???途中です)sympyで
・ver0.1
```python
# ver0.1
# 基本例題6.12 P164
# from sympy import *
# var('EI,P1,P2,a,b,x')
# var('MA,RA,θA,vA,l')
# MAB_str="MA+RA*x"                        #;print("#",MAB_str)
# MBC_str=MAB_str+"-P1*(x-a) "             #;print("#",MBC_str)
# MAB=sympify(MAB_str)                            
# MBC=sympify(MBC_str)                            
# θAB=-1/EI*(integrate(MAB,x)  )+θA        ;print("#",θAB)
# vAB=-1/EI*(integrate(MAB,x,x))+θA*x+vA   ;print("#",vAB)
# θBC=-1/EI*(integrate(MBC,x)  )           ;print("#",θBC.factor())
# vBC=-1/EI*(integrate(MBC,x,x))           ;print("#",vBC.factor())
# repC={x:l,RA:P1+P2,MA:-P1*a-P2*l}
# θC=θBC.subs(repC).simplify() ;θC_numer=(numer(θC)  ).expand() ;θC_denom=denom(θC)
# vC=vBC.subs(repC).simplify() ;vC_numer=(numer(θC)*2).expand() ;vC_denom=denom(vC)*2
# # 
# print("#",θC_numer,θC_denom)
# print("#",vC_numer,vC_denom)
```
# sympyで。モーメントのつりあいより　
#### 微分方程式の直接解法で 
・ver0.2
```python
# 基本例題6.12 P164
# ver0.2
from sympy import *
var('EI,P1,P2,a,b,x')
var('C0,C1,C2,C3')
M01_str="-(P1*(a-x)+P2*(a+b-x))"                              #;print("#",M01_str)
M12_str=          "-P2*(a+b-x) "                              #;print("#",M12_str)
M01=sympify(M01_str)                            
M12=sympify(M12_str)                            
v01=integrate(M01,x,x)+C0*x+C1                                 #;print("#",v01)
v12=integrate(M12,x,x)+C2*x+C3                                 #;print("#",v12)
rep0={x:0}
repa={x:a}
sol=solve([Eq(     v01   .subs(rep0),0),
           Eq(diff(v01,x).subs(rep0),0),
           Eq(     v01   .subs(repa),     v12   .subs(repa)),
           Eq(diff(v01,x).subs(repa),diff(v12,x).subs(repa))],
          [C0,C1,C2,C3])                                       #;print("#",sol)
rep={C0:sol[C0],C1:sol[C1],C2:sol[C2],C3:sol[C3]}
v01=collect(v01.subs(rep).expand(),[P1,P2])                    ;print("#",v01)
v12=collect(v12.subs(rep),[P1,P2])                             ;print("#",v12)
# P1*(-a*x**2/2 + x**3/6) + P2*(-a*x**2/2 - b*x**2/2 + x**3/6)
# P1*(a**3/6 - a**2*x/2) + P2*(x**3/6 + x**2*(-a/2 - b/2))
```

# 申し訳ありません。作図は適当にしました。sympyのBeamで。

https://qiita.com/mrrclb48z/items/f2ffdeba7c5d4058c8ea#%E7%94%B3%E3%81%97%E8%A8%B3%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E4%BD%9C%E5%9B%B3%E3%81%AF%E9%81%A9%E5%BD%93%E3%81%AB%E3%81%97%E3%81%BE%E3%81%97%E3%81%9Fsympy%E3%81%AEbeam%E3%81%A7

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

# いつもと違うおすすめです。


#### 参考文献
SSDでのFAT32フォーマット マツダコネクト対策

## 経緯
2019年1月に新車で買ったCX-5に乗っており、車内で音楽を聴くのだが。MP3ファイルを入れたUSBメモリーについて以下とある。

``
FAT16､およびFAT32でフォーマットされたUSB機器を接続してください。
``

とある。しかしながら市販のUSBメモリーでは、数多ある音楽ファイルの転送が遅い。更にUSBメモリー自体がけっこう発熱してきて、危ない。

## 行ったこと
そこでSSDを音楽メディアとして使いたくなり表題の試みを行ったものである。
使用したSSDなどは、こちら。

[SPATIUM S270 SATA 2.5 240GB](https://kakaku.com/item/K0001511032/)

[GW2.5-KRU3](https://www.kuroutoshikou.com/product/detail/gw2-5-kru3.html)

![20241216_134526289.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2356942/41962a34-27d1-1d5b-ff95-bcc732b7ff2c.jpeg)
~~シールきれいに剥がせよ~~

SSD自体は以前に他の機器で使用をしていたものなので、純粋に購入時とは異なるであろうが、Windows機を用いて**NTFS**にフォーマットをしてからスタートした。


![20241216_134508192.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2356942/8c713feb-153e-c4be-c851-0579610ce0e2.jpeg)
~~すまんスクショじゃないけど~~

使用したのはUbuntu24.04.1LTSを載せた**純粋Ubuntu機**です。WSLとかじゃありません。

![20241216_140811165.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2356942/97ab57ac-54c5-a3db-6582-7009a8dca1e8.jpeg)

個人的にですが、CLIだけにこだわらずUbuntuでもGUIで行けるところは使っていいと思うんです。

![20241216_140823156.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2356942/9e3aedcb-9c4a-bcee-eb68-b59d9acdc7b5.jpeg)

完全にきれいにしました。それで

```
/dev/sda
```
にマウントされているのがわかりますが、フォーマットの前にアンマウントしてください。それから、

```
sudo mkdosfs -F32 -nMUSIC /dev/sda
```

みたとおりなんですが、「-n」にそのままタイトルをつけて打つんですね。

![20241216_140859901.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2356942/76f9b8cf-a5cd-6243-cebe-dbac7de576a0.jpeg)

となります。これで終わりですがマウントしているとうまく行きませんよ。

![20241216_140905229.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2356942/49e32506-782a-0337-78ae-0982eb331dde.jpeg)

**FAT32**になっているのが確認できました。

![20241216_140934068.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2356942/eb40a2aa-e4ef-eb18-15ff-9c80db714ea8.jpeg)

Windows機で**FAT32**が確認できましたね。

![20241216_141143705.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2356942/dd794b18-01d0-9d0c-8301-8caffdc0d23c.jpeg)

なお余談なんですがWindows機に挿しただけで、「System Volume Information」っていうのが出来るんですがこいつは一体何をしているんでしょうか？！誰か教えてほしいです。もちろん、Ubuntu機でこの謎のフォルダは削除します。

試しにYOASOBIのフォルダを入れたあとCX-5に挿してみました。


![20241216_141503515.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2356942/b9ddb5a4-4fc9-dd65-c0ff-65afcc0e2274.jpeg)

![20241216_141601271.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2356942/9fb4f336-cd53-f5bb-67fb-ac8398dfc867.jpeg)

これで**FAT32**にフォーマットしたSSDを認識しYOASOBIが再生できました。

## まとめ
- **FAT32フォーマット**が無理なはずの240GBのSSDに**FAT32**フォーマットを行った。
- Ubuntu機を用いた。

です。ご意見お待ちしております。
デザインを先に作って気づく、ゴールイメージの大切さ。

こんにちは。
@zt_megane です。
この記事は[ARIアドベントカレンダー](https://qiita.com/advent-calendar/2024/ari-group)の14日目の記事です。

皆さんシステム開発をするときに画面デザインっていつ作りますか？
アジャイル開発なら早めにワイヤーフレームを作って、デザインせずに作るかもしれないですし、ウォーターフォール開発なら設計フェーズになるでしょうか。

私も今でもそういう開発のマネジメントはしますが、ARIの中にはデザイナーがいるので、デザイナーが開発工程の先にお客さんとヒアリングをしながら、UI/UXを作っていくデザイン先行開発というプロセスで開発をすることがあります。

今回はそのプロセス開発をマネジメントしながら得た知見を少し紹介したいと思います。

# デザイン先行開発とは
デザイン先行開発とは、最初にシステムのUI/UX設計をデザイナーが行い、そこから要件定義を進めていく手法です。
詳しくはこちらを見てください。
https://ari-jp.com/service/design-first-development/

## デザインが先行すると開発はどう変わるのか？

アウトプットベースで考えると、画面一覧、画面遷移図、画面デザインなんかが先に決まるだけのイメージになるので、作業順番を入れ替えただけのように見えるかもしれません。
しかし、実はそれ以外にもデザインを先行して決めることで決まっていくものがあります。
私の体感ですが、これくらいのことはデザインを検討しながら決まっていくイメージがあります。

### 機能要件の1/3くらい
基本、要件の上でデザインが成立するので、デザインを考える時点である程度の機能要件をヒアリングまたは調整をしています。

### 非機能要件の一部
ユーザー数や性能など、アプリケーション側の要件の一部が決まりやすいです。

### 詳細設計の1/3～場合によっては半分
デザインを考えるときには、機能要件を画面毎に想像していくことになるので、自ずとデザインが決まる頃には画面機能の要件もほぼ決まっていることが多いです。
さらにそれに付随した仕様なども決まっていくこともあります。

## デザインを先行することの効果
ではなぜこれだけの事がデザインを先にすることで決まるのでしょうか？
色々と考えてその事象を紐解いていくと、大きく2つの理由があると思いました。

### １．デザインを前にして人はアイディアが生まれやすくなり、周辺のアイディアが残りやすい。

二重符号化理論（デュアルコーディング理論）という理論がありますが、これは人は文字のみより、文字とそれに関連するイメージを見たほうが、思い出せる確率が約2倍に跳ね上がるという仮説になります。

たぶん皆さんも実感として理解できる話ではないでしょうか。
デザインが先に来ることでこの効果を発揮して、思い出しやすくなっていることが考えられます。

### ２．デザインを共有することで、お互いにゴールイメージが明確化し、やりたいことが見えてくる。

チームワーク研究の中で、個々に人はメンタルモデル（物事の見方や行動を決める際の前提となるイメージ）を持っているというものがあります。
そして、チームワークで重要なのは、情報共有しながらメンバー同士がメンタルモデルを共有できるかどうかにかかっていて、関係者が多くて複雑性の高い業務を成功に導くためには、チーム内で共通のメンタルモデルを持つことが重要だと考えられています。

その共通のメンタルモデルを持つ助けとして、デザインされたシステムイメージというのがうまく効果を発揮していると思います。

## ゴールイメージを早めに共有することが大事

これら2つの理由を考えると、結局「ゴールイメージを早めに共有する」ということが、大事なんだと私の中では結論づきました。

でも、これって言われてみれば当たり前の事なんですよね。
家を作るときには先に外観とか内観のイメージを作りながら設計しますし、モノを作るときもある程度ビジュアルを決めてから作り始めると思います。

想像してみてください。
初めて作る外国料理の、写真がない文字だけのレシピを渡されて、これを作ってほしいと頼まれたら、どう思いますか？
私は不安しか覚えません。
調理の途中も、「これで合ってるのか？ほんとに？」とまな板の上に置かれた食材達を見つめながら、そして、フライパンで焼かれている正解が分からない「何か」を見ながら思う事でしょう。

では、写真があったらどうでしょう。
少なくとも、これがどういう見た目で、焼くのか煮るのか、調理法も少しイメージが湧きます。
なるほど切り方もこんな感じねと、頭の中に正解のイメージ像が湧きます。
これならやれそうかもと思いませんか？
調理中も写真と違うか？いや一緒か？と軌道修正しながら調理ができるでしょう。

1人でもこんな感じでゴールイメージがないと不安なのです。
システム開発のような、人も多く複雑な工程がある作業であれば、なおさら不安は増しますし、その果てには混乱とイメージをすり合わせる為の膨大な時間がかかることでしょう。

ですから、ゴールイメージをまず決める。
正しい将来の姿を早めに定めて皆がそれを理解するという事が、システム開発プロジェクトを成功させる為の重要な要因だと考えています。


## 最後に
ここまで書きましたが、これはデザイン先行開発をしてきて考察したほんの一部です。
デザイン先行開発は他にもメリットがあり、そしてデメリットもあります。詳しいことが知りたい方はぜひコメントなどで連絡ください。
ありがとうございました。
アジャイル開発における「技術」とは何か？

## はじめに

こんにちは、Graatでアジャイルコーチをしている斎藤です。
この記事はグロースエクスパートナーズ[Advent Calendar 2024](https://qiita.com/advent-calendar/2024/gxp)の17日目の記事です。

アジャイルソフトウェア開発宣言には、次のような一節があります：

「技術的卓越性と優れた設計に対する不断の注意が機敏さを高めます。」

「技術的卓越性」という言葉を目にしたとき、多くの人がまず思い浮かべるのは、ソースコードの可読性の向上やテスト駆動開発の導入、DevOpsなどといった、いわゆるIT技術ではないでしょうか。私もかつてはそのように解釈していました。しかし、様々なお客様に関わらせていただいた現在、この一節にある「機敏さ」は単にソフトウェア開発におけるスピードや効率性だけに留まらないと思うようになりました。

ソフトウェア開発を超えて、ビジネス全体で得られるフィードバックを活用し、事業としての変化への対応力や適応力を高めることが、真に求められる「機敏さ」ではないでしょうか。そして、この機敏さを高めるための「卓越した技術」は、IT技術やプログラミングスキルに留まりません。

## 「技術」の定義を広げる

さて、多くのスクラムチームでは、プログラマー、アーキテクト、QAエンジニアといったITエンジニアが自分たちを「技術者」と認識する一方で、プロダクトオーナーやビジネス部門、スクラムマスターを「非技術者」とみなす傾向が見受けられます。

しかし、プロダクトマネジメントもまた、れっきとした「技術」です。市場調査や戦略立案、予算の確保といった活動から、仮説検証やステークホルダーのマネジメントまで、これらはすべて長い歴史を持つ技術の集積と言えます。

さらに、一見、ふんわりとした印象を持たれがちなスクラムマスターの活動も同様です。チームビルディング、ファシリテーション、ティーチング、ワークショップデザインといったスクラムマスターの活動も、それぞれ一つ一つが一生掛かってもマスターできないほど高度に体系化された技術領域なのです。

## チーム外に目を向けても

たとえば、カスタマーリレーション。はじめは怒っていたユーザーを笑顔にさせ、その背後にあるニーズを掴み、いつの間にかプロダクトのファンにさせる.....魔法のような素晴らしい技術だと思います。ここに詳しくは挙げられませんが、マネジメント、営業、経営、人事....などなど、すべてソフトウェア事業全体の機敏さを高めることには欠かせない「技術」です。

## まとめ

最近、IT技術者が自分たちだけを「技術者」とみなし、他の職種を少し下に見るような場面にいくつか遭遇することがありました。確かに、ITはその厳格さや論理性ゆえに「技術」として認識されやすい一方で、他の分野の技術のいくつかは一見ファジーに見えるため「技術」に見えづらいことがあります。さらに、「技術」には希少性や市場価値、習得の難易度の差があるかもしれません。（2024年現在、IT技術者は依然として希少性が高く、市場価値も高い状態にあります。）

しかし、「技術的卓越性」とは、単にIT技術における優秀さを指すのではなく、プロダクトマネジメントやチームビルディング、ファシリテーション、カスタマーサポート、マネジメント、営業、経営、人事など、幅広い領域において高度なスキルを追求することを意味します。そして、これらの技術を磨くことこそが、真の「機敏さ」を生み出す原動力となるのです。

ソフトウェアビジネスに関わるすべての人が、自分の専門性を「技術」として認識し、そしてその卓越性を追求し続け、そのようなお互いを「尊敬」し合える文化を築くことが、GxPグループを含めたこれからのソフトウェア企業の成功に繋がるのではないでしょうか。
kintone でアクションの一覧をダウンロードする PHP プログラム

前回記事の PHP 版です。

実行すると、
　　アクション_123.txt
のテキストファイルを作成します（数字は指定したアプリID）。

「sample.cybozu.com」や「UserName:YourPassWord」はお使いの環境に合わせて変更してください。

Python の結果と比較すると、空の配列が、
Python：　{},
PHP：　[],
となります。
　

```php:12_action_list.php
<?php
$appno = "123";
//$appno = "124";
//$appno = "125";
//$appno = "126";

$text = 'UserName:YourPassWord';

$option = array(
    'http'=>array(
        'method'=>"GET",
        'header'=>"Host: sample.cybozu.com:443\r\n" .
                  "X-Cybozu-Authorization: " . base64_encode($text) . "\r\n",
                  "Content-Type: application/json\r\n"
    )
);

$context = stream_context_create($option);

$response_action = file_get_contents("https://sample.cybozu.com/k/v1/app/actions.json?lang=ja&app=" . $appno , false, $context);

if ($response_action !== false) {
    $decodedJson = json_decode($response_action, true);
    $prettyJson = json_encode($decodedJson, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    file_put_contents("アクション_" . $appno . ".txt", $prettyJson);
    echo "アクション_" . $appno . ".txt\n";
} else {
    echo "データの取得に失敗しました。\n";
}
?>
```
neosvr（異空間の内)でcpuを自作した件

# 概要
neosにはVR内でプログラム開発できるLogiXというノード言語があります
neosvrでcpuを自作しました。それをverilogで書き直しましたので、ご報告致します。


![2021-12-28 04.41.33.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c1dd590e-79af-3a01-b8cc-89b3d7c1f545.jpeg)

# neosvrでcpuを自作したページ

https://qiita.com/ohisama@github/items/f3aeda815c031a431d5a

https://qiita.com/ohisama@github/items/1fc82e1babb470206541

# それをverilogで書いたページ

https://qiita.com/ohisama@github/items/13c13d3935fdadffa95c

# iverilogで実行結果

```
>vvp a.out
  x
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
neos.v:95: $finish called at 904 (1s)




```


以上。
TypeScriptでのundefinedとnullを徹底解説：違いと実践的な使い方

# TypeScriptでの`undefined`と`null`を徹底解説

TypeScriptを学び始めた初心者の方にとって、`undefined`と`null`の違いは混乱しやすいポイントの一つです。この2つは似ているようで異なる意味を持ち、TypeScriptでコードを書く際にそれぞれ適切に扱う必要があります。本記事では、この2つの違い、TypeScriptにおける特徴、そして実践的な使用例を詳しく解説します。

---

## **1. `undefined`と`null`とは？**
- **`undefined`**  
  変数が値を割り当てられていない場合に自動的に持つ値です。何も設定されていない状態を表します。

  ```typescript
  let x: undefined; // 値は`undefined`のみ
  console.log(x); // undefined
  ```

- **`null`**  
  開発者が明示的に「値が空である」と設定する際に使用します。

  ```typescript
  let y: null; // 値は`null`のみ
  console.log(y); // null
  ```

---

## **2. `undefined`と`null`の違い**

| 特徴            | `undefined`                                   | `null`                                |
|-----------------|-----------------------------------------------|---------------------------------------|
| **意味**        | 値が未定義（未割当）                     | 空である（意固的に値がない）          |
| **デフォルト値** | 変数を宣言したが値を割り当てていない場合の初期値 | 開発者が明示的に設定する              |
| **型**          | `undefined`                                  | `object`                              |

```typescript
let a;
console.log(a); // undefined

let b = null;
console.log(b); // null
```

---

## **3. TypeScriptでの`undefined`と`null`**
TypeScriptでは`undefined`と`null`の両方が有効な値ですが、デフォルトの型チェックでは注意が必要です。特に、`strictNullChecks`を有効にすると、コード内で`null`や`undefined`をより固く扱うことができます。

```typescript
let a: string | null;
a = "Hello"; // OK
a = null; // OK

let b: string | undefined;
b = "World"; // OK
b = undefined; // OK
```

---

## **4. `strictNullChecks`オプションとは？**  
TypeScriptでは、`strictNullChecks`を有効にすると、`undefined`や`null`を安全に扱うことが求められます。この設定はエラーを未然に防ぐ強力な方法です。

- **設定方法**（`tsconfig.json`）
  ```json
  {
    "compilerOptions": {
      "strictNullChecks": true
    }
  }
  ```

- **エラー例**
  ```typescript
  let c: string | null = null;
  console.log(c.length); // Error: Object is possibly 'null'.

  if (c !== null) {
    console.log(c.length); // OK
  }
  ```

---

## **5. `undefined`と`null`のチェック方法**
- **比較演算子を使ったチェック**  
  ```typescript
    let value: string | null | undefined = null;
        
    if (value === null) {
      console.log("値はnullです");
    } else if (value === undefined) {
      console.log("値はundefinedです");
    } else {
      console.log("値は:", value);
    }

 
  ```

- **デフォルト値の設定（||や??を使用）**
  ```typescript
    let name: string | null | undefined;
    console.log(name || "デフォルト名"); // "デフォルト名"
    console.log(name ?? "デフォルト名"); // "デフォルト名"
     
  ```

## **6. undefinedとnullの使い分け**
- `undefined`を使うべき場合：
変数が初期化されていない状態を表したいとき。
- `null`を使うべき場合：
値が空であることを意図的に示したいとき。


## **7. 結論**
- `undefined`と`null`は、それぞれ異なる用途と意味を持つ重要な値です。
- TypeScriptで安全なコードを書くには、`strictNullChecks`を有効にし、`null`や`undefined`を適切にチェックする習慣をつけましょう。
- 本記事で紹介した実践的な例を参考に、ミスの少ないコードを書くスキルを磨いてください！
NSBundle file:///System/Library/PrivateFrameworks/MetalTools~ みたいなエラー(警告)の対処法

## はじめに
xcodeでの実機ビルドテストをしている場合に発生したエラー(警告⚠️)

```
NSBundle file:///System/Library/PrivateFrameworks/MetalTools.framework/ principal class is nil because all fallbacks have failed
```


## 対処法について
1.xcodeのメニューバー(画面トップ)にて Product　→ Scheme → Edit Scheme を選択
2.手順１にて表示されるウィンドウから run▶ → Metal API の**チェックを外す**


![スクリーンショット 2024-12-16 14.37.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875272/4e4c3750-43e6-cd59-928f-c2fa4ed350a4.png)
kintone でアクションの一覧をダウンロードする Python プログラム

kintone でアクションの一覧をダウンロードする Python プログラムを作りました。実行すると、
　　アクション_123.txt
のテキストファイルを作成します（数字は指定したアプリID）。

「sample.cybozu.com」や「UserName:YourPassWord」はお使いの環境に合わせて変更してください。

以下のページを参照しました。

Top > kintone > kintone APIドキュメント > kintone REST API > アプリ > 設定 > アプリのアクション設定を取得する
https://cybozu.dev/ja/kintone/docs/rest-api/apps/settings/get-action-settings/

　

```python:12_action_list.py
import base64
import urllib.request
import json
from pathlib import Path

appno = 123
#appno = 124
#appno = 125
#appno = 126

uri_action = "https://sample.cybozu.com/k/v1/app/actions.json"

username_password = "UserName:YourPassWord"
auth_header = base64.b64encode(username_password.encode())

headers = {
    "Host": "sample.cybozu.com:443",
    "X-Cybozu-Authorization": auth_header,
    "Content-Type": "application/json",
}

body = {
    "app": appno,
    "lang": "ja",
}

req_action = urllib.request.Request(
            url=uri_action,
            data=json.dumps(body).encode(),
            headers=headers,
            method="GET",
            )

response_action = urllib.request.urlopen(req_action)
res_dict_action = json.load(response_action)

#print(json.dumps(res_dict_action, indent=4, ensure_ascii=False))

with open("アクション_" + str(appno) + ".txt", "w", encoding="utf-8") as f:
    json.dump(res_dict_action, f, indent=4, ensure_ascii=False)
    print(f"{f.name}")

```
forkしたGitリポジトリの扱い

# 想定
- fork元リポジトリ
    - https://github.com/octocat/Hello-World.git
    - GitHubの公式マスコット?のやつにしてみました
- 上記リポジトリをforkした自分アカウントのリポジトリ
    - https://github.com/****/Hello-World.git

fork元は不特定多数の人からのプルリクエストにより更新される。  
自分のリポジトリは基本自分のみが作業する。  
自分もfork元にcontributeするには
- クローンしたリポジトリを更新する
- クローン元に対してプルリクエストを出す

という手順を踏む

# クローン
自分のリポジトリをクローン
```
git clone https://github.com/****/Hello-World.git
```

# remote設定
remoteにfork元追加
```
git remote add upstream https://github.com/octocat/Hello-World.git
```
ただしこれではpush先としても登録されてしまう。
```
git remote -v
upstream    https://github.com/octocat/Hello-World.git (fetch)
upstream    https://github.com/octocat/Hello-World.git (push)
origin    https://github.com/****/Hello-World.git (fetch)
origin https://github.com/****/Hello-World.git (push)
```
もちろんpush時にoriginを指定していれば問題ないが、万が一があるのでupstreamへのpushを行わないようにする。
```
git remote set-url --push upstream ""
```
upstreamのpushが空白となる
```
git remote -v
upstream    https://github.com/octocat/Hello-World.git (fetch)
upstream     (push)
origin    https://github.com/****/Hello-World.git (fetch)
origin https://github.com/****/Hello-World.git (push)
```

# fork元の変更を取り込む
fork元の最新(mainブランチ)を取得
```
git fetch upstream/main
```
ローカルにマージする
```
git merge upstream/main
```
ISUCONに初参加して得た学び

ジョブカン事業部のアドベントカレンダー22日目です。

https://qiita.com/advent-calendar/2024/jobcan

ジョブカン事業部 開発エンジニアの[@hana_9](https://qiita.com/hana_9)です！
DONUTSの札幌オフィスでジョブカン勤怠管理の開発をしています。

先日、「ISUCON14」に参加してきました。
今回は、初めてISUCONに参加した体験から学んだことを紹介していこうと思います。

## そもそもISUCONってなに？
ISUCONとは、「**I**ikanjini **S**peed **U**p **CON**test」の略称で、LINEヤフー株式会社が運営窓口となって開催している、お題となるWebサービスを決められたレギュレーションの中で限界まで高速化を図るチューニングバトルです。

1〜3名のチームで参加する必要があります。
私は、2人のチームで参加しました。

## なぜ参加しようと思ったのか
知ったきっかけは、チームメンバー含むエンジニア数人との会話で話題に上がったことです。
その後調べてみて、楽しそうなイベントだと感じ、力試しをしてみたいと思ったことが参加の動機です。今回は初参加ということもあり、大会の雰囲気を掴むことに重きを置いて、気負い過ぎずに楽しんで戦おうというモチベーションでした。

## 事前にやったこと
- [ISUCON本](https://www.amazon.co.jp/%E9%81%94%E4%BA%BA%E3%81%8C%E6%95%99%E3%81%88%E3%82%8BWeb%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0-%E3%80%9CISUCON%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%B6%E9%AB%98%E9%80%9F%E5%8C%96%E3%81%AE%E5%AE%9F%E8%B7%B5-%E8%97%A4%E5%8E%9F-%E4%BF%8A%E4%B8%80%E9%83%8E/dp/4297128462)をざっと一通り読み雰囲気を掴む
- チームメンバーと[過去問](https://isucon.net/archives/54946542.html)に1度挑戦

## 大会当日の流れ
大まかに以下の手順で作業を行いました。
1. 支給されたCloudFormationテンプレートを元にAWS環境を作成し、[マニュアル](https://github.com/isucon/isucon14/blob/main/docs/manual.md)を確認
2. 競技者ページにて、初回ベンチマーク計測
3. 計測ツール導入・調査
4. 実際にパフォーマンスチューニング

## 方針・進め方

### アプリケーションで使用する言語は、Go言語を選択
ISUCONにおいて圧倒的に使用率が高く、アプリケーションのデフォルト設定でも使われています。参考になる記事も多いため採用しました。

### チームメンバーとはオフラインで作業
細かいコミュニケーションを素早く取りやすいという理由からオフラインでやることにしました。

### サーバー設定、Git設定、ボトルネック調査ツール導入などを役割分担して作業
役割分担できるのは複数人チームで参加しているメリットでした。作業を効率よく進めることができました。事前にスクリプトなどを用意できればもっと良かったと思います。
[ISUCON初心者向け講習会](https://isucon-workshop.trap.show/)という記事を参考に各種設定などを行いました。とても分かりやすくて助かりました。

### 昼ご飯はしっかり食べる
1時間くらいは離席。

### ボトルネック調査、インデックス追加、アプリケーションのボトルネック改善作業
DBのCPU使用率が高かったため、インデックス追加を実施しました。今回行った改善対応の中で最もスコアが伸びました。N+1調査・改善を試しましたが、Go言語に不慣れ＋アプリケーション仕様理解不足によりデグレが発生し、ベンチマーク実行時にエラーとなったため、revert対応を繰り返すことになり、ほとんど改善できずタイムオーバーとなりました。

終了30分前には作業を止めて、ログ出力設定などを元に戻し、ベンチマーク実行して終了。

# 結果
惨敗でした...。
最終スコア「3216」、順位は443/831位でした。

![isucon14-score.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865401/ba200f26-77a4-8c2a-5fbf-68c268e9f360.png)

準備不足と単純な実力不足が大きな要因だと思います。
不甲斐ない結果に、めっちゃ悔しかったです。
来年は、スコア「10000」を目指してリベンジしようと思います。

## 学んだこと

### 事前準備はしっかりやっておこう
8時間と限られた中では、いかに仕様把握やボトルネック改善に時間割けるかが重要です。事前にできることは用意しておき、時短できる仕組みを作るろうと思います。

### 利用する言語やミドルウェアの知識を深めておこう
大会前に焦ってやっても遅いので、普段から利用してある程度扱える状態にしておくべきだと思います。その状態になっていないと手も足も出ないです。個々で勉強しつつ、チームメンバー同士で勉強会を開催してアウトプットしながら知識を深めようと思います。

### 計測ツールは自由に扱えるようにしておこう
扱いに慣れてないとどうしても時間がかかります。事前にたくさん利用して慣れておこうと思います。

### 過去問をたくさんやって慣れておこう
チームメンバーとの連携や効率の良い作業するには、実践形式にも慣れておく必要はあると思います。次回は、最低3回過去問で予行練習をしてから臨みたいと思います。

### 楽しくやろう
今回、上手くいかないことも多くありましたが、その中でも喜びや発見を見つけて楽しく作業ができたのは良かったことです。次回また参加したいと思えるきっかけにもなったので、継続したいと思います。

## さいごに
DONUTSでは、新卒中途を問わず積極的に採用活動を行っています。
我々ジョブカン事業部も、一緒に働くエンジニアを募集しています。気になる方はお気軽に応募してみてください。

https://www.donuts.ne.jp/recruit/

https://recruit.jobcan.jp/donuts/show/B001/1396297
「IBM Cloud 構成パターン」集 （25年4月版）

## 「IBM Cloud 構成パターン」 集とは

IBM Cloud は、ウェブサイト・ウェブアプリケーションとしてはもちろん、基幹系業務アプリケーションからファイルサーバー、社内業務アプリケーション、IoT、AI/機械学習、災害対策までにいたるまで、非常に多くのお客様に数多くの用途で活用されています。

そうした中で、今回、IBM Cloudの主要サービスを利用した代表的なソリューションごとの「構成パターン」と「料金の試算例」を１つの<b>「IBM Cloud 構成パターン」</b>集という資料としてまとめておりますので、ご紹介いたします。<br>

<br>
<b>現在の最新版は、「2025年4月11日版」となっております！！
</b>

#### <INS>「IBM Cloud 構成パターン」集

<iframe src="https://drive.google.com/file/d/1w5uTXgIUksq9sBxvyuwTItyT8qIYihI6/preview" width="640" height="480" allow="autoplay"></iframe>

<iframe src="https://docs.google.com/presentation/d/e/2PACX-1vQxE6oki_GyAhgh78YdiYy3-CPO4zWdnF4LMq9RYD-dWF5VfJ__jsuKGd2Nd0g_X3uTUfG2CLLJxNcX/embed?start=false&loop=false&delayms=3000" frameborder="0" width="1200" height="440" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>


※こちらの資料は、25年4月版のものとなります。

<b>最新版はこちら: [https://ibm.box.com/v/ibmcloud-pattern](https://ibm.box.com/v/ibmcloud-pattern)

## 「IBM Cloud 構成パターン」集の内容

2023年12月現在、以下の25種類くらいの構成パターンが資料としてまとまっています。

#### <INS>構成パターンの一覧（目次）</INS>

<b>VPC / コンテナ基盤(OpenShift) / VMWare Solutions / PowerVS / AI (watsonx)</b> など主要ソリューションごとに章立てして構成パターンをまとめております。

本年の新規の拡充ポイントとしては、「watsonx(生成AI)関連」や「Power Virtual Server関連(PER)」のパターンを充実させております。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239309/b1847a8d-bd33-05cf-80c5-da8876634d71.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239309/0bc3b2ce-c8e3-222a-1292-c346b2789c96.png)


#### <INS>各構成パターンの中身

「IBM Cloud 構成パターン」集は、それぞれの構成パターンごとに以下の２ページからなっております。

1. 構成パターンのイメージ図／構成のポイント／システム構成要素　
1. 構成パターンの概算費用

構成イメージとともに、構成するときのポイントや必要なサービスコンポーネントなどが簡単に理解できるようになっております。またそれぞれの構成パターンに対する概算費用も提示することで、費用感をイメージしやすくできるようになっております。
<br>

<b>【例：構成パターンのイメージ図/構成ポイント/システム構成要素】</b>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239309/68e4d43d-b2e1-3c01-d2d4-e0ec985c6da3.png)


<b>【例：構成パターンの概算費用】</b>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239309/cd8b16eb-b8f6-9925-b164-76cea987df9f.png)

## 「IBM Cloud 構成パターン」集のダウンロード
<b>「IBM Cloud 構成パターン」</b>集の最新版は、以下のサイトよりダウンロードできます。

　<b>URL:</b> [https://ibm.box.com/v/ibmcloud-pattern](https://ibm.box.com/v/ibmcloud-pattern)

## 今後について

来年(2025年)はいろいろなところで、この <b>「IBM Cloud 構成パターン」集</b>を紹介していきたいと考えております。また役立ちそうな構成パターンもどんどん増やし、資料も充実させていく予定ですので、ぜひ定期的にチェックいただければと思います。<br>

IBM Cloud導入検討時の情報として、ご利用目的に応じたかたちで、是非ご活用ください。

<b> （活用例） </b>
・構成パターンをベースとしたお客様要件に合わせた構成の検討
・構成パターンを参考にしたCloudの構成概要図の作成
・主要なCloudサービスの料金見積方法の確認

###  _Have_ _a_ _great_ _"IBM Cloud"_ _journey_ _!!_
文系エンジニアの数学再入門の道

### はじめに
近年エンジニアにとって数学は、避けて通れない壁の一つと感じています。
今回は数学超超超超超初学者状態の文系エンジニアの私が数学への再入門をした体験について書いていきます。
入門前のレベルとしては中学数学の知識もほぼ抜け落ちていたような状態です。

参考になれば幸いです。


### そもそもなぜ数学を再度勉強する気になったか
私は今年から大学でコンピュータサイエンスを勉強しており、線形代数や論理数学、微分積分などの科目を履修する必要があるからです。
ちなみに大学の入学試験は小論文のみでしたので、受験にあたって数学の勉強はしていません。
悩んだ末に幾つかの数学の授業を今年の後期で取ることを決めましたので、約半年で大学数学の入り口レベルまで到達する必要がありました。



## 勉強方法

### 高校数学復習編

#### 1. 動画学習
参考書を読む学習方法は自分には向いていなかったので、YouTubeの数学解説動画を探してイチから総ざらいしました。
自分のレベルが低すぎて数１Aの参考書を読んでもあまり理解できなかったので、中学数学から復習することにしました。

無料で質のいい授業が受けれて本当にいい時代になりました・・・

また、動画学習の良いところとしては、「参考書を読む」「練習問題を解く」と比較して学習のハードルが低く、「とりあえず流し見するか〜」というノリで継続できるのがよかったです。

おすすめのチャンネルはこちらです。

https://www.youtube.com/@TryIT_official

https://www.youtube.com/@toaruotoko

#### 2. 問題を解く
動画を視聴した後は、必ず問題を解きました。
解説を聞くだけでは理解した気になるだけなので、実際に手を動かすことが重要です。
短時間で高校数学を総復習する必要があったので、公式は100%暗記せず「この公式を使えばいいだろう」というアタリがつくならOKとしました。

参考書は以下を使いました。
なお大学入試を見据えた難しめの問題はスキップしました。

##### マセマシリーズ
数学が得意な人に聞いたところ、これが一番わかりやすいと評判だったため数学1A〜3Cまで買い揃えました。
参考書の中で一番解説が親切だと思います。
高校生の時に出会いたかった。

https://books.mathema.jp/categories/13?book_type=BOOK


##### チャート式
今回の再入門前に何度かいきなりチャート式に挑んで挫折するのを繰り返していましたが、基礎をある程度おさえた上で問題を解くとよく理解できました。
いろんなシリーズがありますが、基礎編の青を利用しました。

https://www.chart.co.jp/goods/sugaku_list/s001.html

### 大学数学入門編
中学〜高校数学をザッと総ざらいした後は大学数学入門に向けた勉強です。

#### 1. 参考書を利用した知識の整理

##### 数学読本シリーズ
この本は「大学数学の入り口まで独習できるように解説する」というコンセプトの本です。
これは、数学1・数学Aなどの分類ではなく、例えば「自然数、整数、有理数や無理数、実数」など単元に分かれているので、知識を整理するのにとても良かったです。
解説も丁寧ですし問題も豊富に掲載されており、大学数学に必要な基礎的な内容を体系的に学べる内容になっていると思います。

https://www.iwanami.co.jp/book/b452033.html

##### マセマシリーズ
ちょっとまだ時間がなくて積んでいる状態なのですが、大学数学に関するものも出ています。
時間を見つけて進めていきたいと思っています。

https://books.mathema.jp/categories/20?page=1&per_page=8&book_type=BOOK


#### 2. 動画学習
##### ヨビノリ
こちらも数学が得意な人に教えてもらいました。
予備校で授業を受けている雰囲気で丁寧に解説してくれるため、難しい分野もスムーズに理解できました。
わかりやすくて感動したので書籍も買いました。

https://www.youtube.com/@yobinori

---

### そのほか
#### 継続する仕組み
ちょっとでもサボるとすぐわからなくなってしまうので毎日少しずつでも数学に触れ続けることが、大事だと感じました。
そこで心がけたことは以下です。

- 心理的ハードルを下げる
    - 疲れている時は動画を1分でも見ればOKにした
    - 参考書を電子書籍でも購入し、電車の待ち時間などちょっとしたスキマ時間があれば眺めるようにした
- 習慣化する
    - 数学に限らずですが土日は必ずコワーキングスペースに行って大学の勉強をする時間に充てています

---

### まとめ
文系エンジニアが数学を再入門するのは、決して簡単なことではありません。（何度か卒業できない夢を見てうなされるレベルでした）
しかし、「基礎から始める」「手を動かす」「継続する」という3つのポイントを意識することで、以前は理解できなかった内容も徐々にクリアに見えてくるようになります。

10回以上数学入門に挫折しているような人間でしたが同じように数学に苦手意識を持つ方にとって、この記事が少しでも参考になれば幸いです。
大学数学は挫折しないように頑張ります。
実例で学ぶアラート改善：基準見直しと自動化の工夫

# はじめに
こんにちは。技術本部MA部の林です。MAとは「マーケティングオートメーション」の略です！
今回は、MA部で行ったアラート改善について、どのような視点でアラートを改善したか、具体例を交えてお話しします。

# 1. アラートの基準を実際のデータ量などを加味して調整する
まず1つ目は、**アラートの基準（集計期間や閾値）が、監視したい状況に合っているか？** という視点です。

### 具体例
MA部では、Google CloudのDatastoreで`Transaction Failed`エラーが頻発していたことを受け、エラー監視用のモニターをCloud Monitoringで作成しました。
Datastoreで実行したい処理はリトライで最終的には成功していること、Datastore自体のオートスケールで時間があれば収束していくことから、エラーの発生自体は問題ないと考えています。それを踏まえてモニターを作成したのは、万が一エラーが多発した場合に、Datastoreが過負荷になり他のシステムに影響が出ることを懸念したためです。

最初に設定したアラート条件は、下記のようになりました。
- 1分間に合計して500回以上のエラーが発生した場合に通知

数ヶ月モニターを運用してみて、以下の傾向がつかめました。
- 特定のDatastoreに大量のデータが流入する時間帯がある
    - その時にエラーが頻発している
- 大量のデータは1時間以上かけて入る場合があり、その間に閾値を超えたり下がったりしてしまう

![Datastoreモニターアラート見直し前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037146/b589783a-e2e2-a304-5d2b-28e93832aa83.png)


そこで、アラート条件を下記のように見直しました。
- 集計時間: **1分ごと** → **10分ごと** に変更
- 閾値: **合計500回以上 → 平均2000回以上** に引き上げ


まず、エラーの発生傾向を踏まえて時間のスパンを伸ばし、平均値を取ることで過度なアラート発生を防ぎました。
また、モニター作成後、Datastoreが起因の問題は特に発生していませんでした。よって、仮に他のシステムに影響を与えるとしてももっと大量のエラーが出ている時だと考え、アラートの閾値を直近のエラー発生数を踏まえて2000回まで引き上げました。

![Datastoreモニターアラート見直し後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037146/8322bb43-40f3-a25f-67ca-2e9cde626cf2.png)

これにより、アラートの過剰検知を減らし、エンジニアの負荷を緩和することができました。今後も状況を見つつ、Datastoreの問題が発生しなければ、さらに閾値を見直していく予定です！

# 2. アラート後の対応が毎回同じなら、システムに組み込む
次に2つ目は、**アラート後に毎回同じ対応手順を取っているなら、それをシステムに組み込もう** という視点です。

### 具体例
MA部では、ビジネス部門が管理画面で入力したデータを元に、メール配信のバッチ処理を行っています。この管理画面は、他のエンジニア部門が管理しているため、入力時点でバリデーションチェックを行うことができません。そのため、メール配信時にバリデーションエラーが発生した場合、以下のオペレーションを実施していました。

1. バッチ処理がバリデーションエラー検知 
2. MA部エンジニアはアラートを受け、調査用SQLを実行
3. SQLの実行結果を元に、ビジネス部門の担当者に報告

全体のフローを図にまとめました。
![バッチ処理のバリデーションエラー発生時のオペレーション.drawio (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037146/d51894fe-ceae-19a9-8d1c-263b1b45f607.png)

何度かこのオペレーションを行ううちに、「このSQLを定番としてシステムに組み込めばいいのでは？」 という結論に至りました。つまり、以下のフローです。

1. バッチ処理がバリデーションエラー検知
2. バッチ処理自身が調査用SQLを実行
3. バッチ処理自身がSlackに調査結果を投稿

改善後の全体のフローを図にまとめました。
![バッチ処理のバリデーションエラー発生時の新しいオペレーション.drawio (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037146/008caf7a-c1c4-3f11-e038-725302557369.png)




この改善により、MA部エンジニアはアラート調査の手間が省けるようになりました。また、ビジネス部門の入力担当者も調査待ちの時間を省略でき、双方に取って効率的なフローになりました！

# まとめ
今回は、MA部で実際に行ったアラート改善について、具体例を交えながら紹介しました。
1. アラートの基準を実際のデータ量などを加味して調整する
2. アラート後の対応が毎回同じなら、システムに組み込む

アラートの根本原因を修正するのは大前提としつつ、修正に時間がかかる場合や、ハードリミットのために修正したくてもできない場合があると思います。そんな時に、小さな改善を積み重ねて、アラートの品質は落とさずに、エンジニアの負担を減らせればと思っています。

ちなみに、Datastoreのアラート見直しの過程で、保存されているデータが、ストレージ容量を圧迫していることがわかりました。これにより、不要なデータを消すなどの対策を早めに検討することができました。

このように、アラート見直しをきっかけに新たな発見があるかもしれませんので、気になるアラートがあれば、ぜひ見直してみてください！
広告停止！問い合わせ繋がらない！八方塞がり！

ある日、自分の作ったアプリを開くと、

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3808248/96f2969c-947c-49b5-dc22-96ddebb4bc23.png">（画像：amime）

❓❓❓

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3808248/57c61b30-e7db-5f09-d2da-64b6c7ee4b22.png">（画像：DuplesS）

❓❓❓❓❓❓

<br>

画面上部にあるはずの広告が表示されていない、何で❓❓❓

<br>

Google AdSenseにアクセスすると、
![スクリーンショット 2024-12-15 19.12.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3808248/5f3a9c5b-1604-9c3c-4167-5ad9e90e8b55.png)
こんな恐ろしい警告が表示されていました！

<br>

さっそく「確認」から身元確認の手続きを進めていると、
![スクリーンショット 2024-12-15 18.12.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3808248/d433273a-fd9d-463c-35fc-c53bbb9a6128.png)
免許証の画像がアップロードできない❓❓❓

<br>

画像の形式はJPEGでした。

<br>

「JPEGが無効なんてことあるのかな？まぁエラー出てるし他の形式にしてみるか。」と今度は拡張子を「PNG」にしてアップロードしてみました。

<br>

また同じエラーが表示されました。

<br>

「PNGもダメなの？そんなことある？」となり、調べても特に解決策は見つけられず、それならGoogleに問い合わせようとメールを送ろうとしたら、
![スクリーンショット 2024-12-15 18.54.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3808248/ebe6155a-559f-1f1d-c7e9-5997c1a5f075.png)
エラーで送れない！

<br>

何回かメールボタンを押下したり、リロードしたり、ブラウザを変えたりしてもダメだった。。。

<br>

仕方ない、日を改めて再度やってみようと後日やってみるも、ダメだった。。。

<br>

八方塞がり。

<br>

と諦めかけていたところ、コミュニティで質問することができることを知り、最後の望みだとコミュニティに投稿してみると、「画像の実際の形式が別のもので、拡張子だけJPEGなどにしている」場合はアップロードができないとのこと。

<br>

そうなの！知らなかったよ！

<br>

そう私はiPhoneからiMacにairdropで画像を送ってアップロードしようとしていました。
しかし、airdropで画像を送ると「.HEIC」形式になっていたので、拡張子を「JPEG/JPG/PNG」に変換してアップロードしようとしていました。

<br>

これが原因だったようです。

<br>

そして、下記のサイトを参考にHEIC形式の画像をJPEG形式に変換したら、無事アップロードできました❗️❗️❗️
よかった、一件落着❗️❗️❗️

https://allabout.co.jp/gm/gc/492960/


## さいごに
下記は私の作成したアプリです。
今後も開発とアップデートをしていきます！
まだまだ些末な部分があると思うので、「もっとこうした方がいいよ！」とか、「こんなアプリ作ってみるのはどう？」とか、みなさんのご意見をお聞きしたいです！

https://apps.apple.com/jp/app/muupa/id6502267909

https://apps.apple.com/jp/app/dupless/id6504234469

https://apps.apple.com/jp/app/tenbin/id6670417709

https://apps.apple.com/jp/app/amime/id6736557722

おわり