OmniAICreator/Qiita-1.07M huggingface dataset:
OCI Cloud Free Tier をもぎ取れ その2

# 概要
OCI Cloud Free Tierを取得してみた。
ログインするまで

# 手順
## ■ サインイン
クラウド・アカウント名 ：登録したクラウドアカウント名（テナンシ名ともいいます）
ドメイン ：Default
ユーザー名 ：登録したメールアドレス
パスワード ：登録したパスワード
サインインすると興味に合わせてコンソールを提案をカスタマイズできるような画面が出てきますが、後でも設定できるので 「skip」 を押します。
言語はデフォルトで英語になっているので、右上の 「地球儀マーク」 を押して言語を日本語にしましょう。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/13a742fe-3301-68e1-1e1f-f55a3f9fdae7.png)

## MFAの設定
ここからはMFA（Multi-Factor Authentication、多要素認証）の設定をしていきます。
特に有償環境にアップグレードしようと考えている方は、パスワード認証だけだと悪意のある第三者にパスワード認証を突破されてしまい高額なリソースを作成されてしまう可能性があるため、
MFAの設定はしておきましょう。

## Step1 モバイルアプリケーションの準備
本記事では Oracle Mobile Authenticator App というアプリケーションをダウンロードします。
CIでこのアプリケーションを使うと、6桁のコードを打ち込むワンタイムパスワードのほかに、 通知 が来て1タップで認証できる機能がすごく便利なのでこちらを紹介します。
お使いのアプリケーション・ストアから 「Oracle Mobile Authenticator App」 と検索し、ダウンロードします。Android9にインストールした。

## Step2 MFAの設定
MFAの設定は左上のOCI コンソール・メニュー「三」から、アイデンティティとセキュリティ - ドメイン - Default - セキュリティ - MFA でアクセスできます。
以下の2つにチェックを入れましょう。
モバイル・アプリケーション・パスコード
モバイル・アプリケーション通知

## Step3 MFAの登録
ここから今ログインしているユーザーと自分の端末をMFAで紐づけします。
この認証アプリは端末を機種変更をしてしまうと引継ぎができないので、QRコードを読み取る前にQRコードを画像を保管するか、二台目の端末も登録しておくことをおすすめします。
MFAの登録は右上の人型マークから、プロファイル - 自分のプロファイル - セキュリティ にアクセスします。
そして、2ステップ検証- 「右の?縦三点リーダー」- モバイルアプリケーションの追加をクリックします。
QRコード
このQRコードを 「Oracle Mobile Authenticator App」 で読み取ると自動で画面的に遷移して登録されます。
アプリは左上の「三」からリスト・ビューを選ぶと見やすいです。

## Step4 サインオンポリシーの設定
ここからOCIにログインする際のポリシーの設定をしていきます。
サインオンポリシーの設定は左上のOCI コンソール・メニュー「三」から、
アイデンティティとセキュリティ - ドメイン - Default - セキュリティ- サインオン・ポリシー - Default Sign-On Policyでアクセスできます。
詳細画面から 「サインオン・ルールの追加」
■ サインオン・ルールの追加
ルール名 ：任意（MFA_Rule）
条件 ：無条件（何も選択しないまま下のアクションの欄へ）
追加ファクタの要求 ：チェックをつける
頻度 ：毎回
以上4つの間違いがないかを確認して 「サインオン・ルールの追加」 をクリックします。
最後に 「優先度の編集」 をクリック、 「MFA_Ruleの優先度を上げる」 「優先度1がMFA_Rule」 になっていることを確認します。
サインオンポリシーで間違った設定をした場合、管理者を含む全員がOCIコンソールにアクセスできなくなり、設定修正を行うことができない状況になる可能性があります。
そのため、この後Step5で動作確認をする場合には、OCIコンソールにログインした状態のセッション(ブラウザ)を残したまま、別セッション（例えばシークレットブラウザ）で動作確認を行ってください。

## Step5 動作確認
シークレットブラウザや別の端末でOCIにログインしてみましょう。
以下のような流れになります。
いつものようにログインすると、モバイルの認証が求められます。
アプリから 「許可」 を押して少し経つと、画面が自動で遷移してログインできます。

以上
OutSystemsから呼び出したRestAPIのHTTPステータスコードを取得する

# はじめに
OutSystemsから外部のRestAPIを呼び出し、そのHTTPステータスコードによりその後の処理を分岐させたい。
ConsumeRestAPIを定義し、外部APIを呼び出し、OnAfterResponseにてHTTPステータスコードを取得して、Response内に格納して返却するようにした。
しかし、500番が返却されるようにAPIを実行した場合、ConsumeRestAPIは例外を発生させてしまい、HTTPステータスコードを取得することができなかった。
ConsumeRestAPIが返却されたHTTPステータスコードによってどのような挙動をするのか調査してみた。

# 環境
Service Studio Version 11.54.37


# 検証
## 検証内容
呼び出したAPIのHTTPステータスコードによりConsumeAPIはどう例外を発生させるか。

## 検証用のExposeAPIの準備
GetのAPIを準備した。
URL内で返却するHTTPステータスコードを指定すると、その通りにレスポンスを返す単純なAPI。

## 検証用のConsumeAPIの準備
上記のExposeAPIを実行するConsumeAPI。

## 検証結果
ConsumeAPIを実行した結果。
ExposeAPIのHTTPステータスコードにより以下のように例外が発生した。例外の文言は基本的に「***HTTPステータスコード*** ***詳細***」というメッセージになる。

100番台：例外
200番台：正常終了
300番台：正常終了
400番台：例外
500番台：例外

# 要求を実現するには
## 仮説
ConsumeAPIの後処理で、StatusCodeにより処理が分岐し200番台および300番台以外の場合は例外を発生させている？StatusCodeを上書きすることで例外を回避できないか。

## 検証用のConsumeAPIの準備
```OnAfterResponse```で```CustomizedResponse.StatusCode```を200番に上書きしたうえで、```CustomizedResponse.ResponseText```にHTTPステータスコードを付加する。

## 検証結果
おおむね臨むとおりにHTTPステータスコードを取得することができた。
一部のHTTPステータスコードでは「**サーバーによってプロトコル違反が発生しました. Section=ResponseStatusLine**」との例外が発生してしまうことが分かった。
例えば、```100```や```102```で発生する。
以下は推測となる。
リクエストヘッダに```Expect: 100-continue```を付加してアクセスするとリクエストを検証する、その際の応答として```100```が返される。今回はその作法にのっとっていないため例外として処理されている可能性がある。
また、```102```はすでに非推奨となっているコードのため例外として処理されている可能性がある。これらは```OnAfterResponse```で置き換える前に例外が発生していると考えられ、```400```番台等とは別の処理でエラーとなっていることが想像できる。

# 結論
```OnAfterResponse```で```CustomizedResponse.StatusCode```を200番に上書きしたうえで、```CustomizedResponse.ResponseText```にHTTPステータスコードを付加する。
上記の方法によりHTTPステータスコードを取得することができた。しかしそれでもHTTPステータスコードによっては、回避できない例外が発生することを確認できた。
ConsumeAPIをラップする形でアクションを作成し、そこで例外をキャッチして処理を分岐するのが想定された処理なのでないかと考える。
もう少しOutsystemsのConsumeAPI処理の流れを理解してみたいと思った調査だった。
Windows版Chromeのデフォルトフォントを変更する

デフォルトのメイリオやSegoe UIは、あまり好きではないので、別のフォントに変更する
### やること
1. フォントを準備する
1. 設定を変更する
1. Stylusを使う
1. 「やっぱりNoto Sans」をインストールする
### 1. フォントを準備する
欧文フォントと日本語フォントを準備する

私のおすすめは、Inter と Noto Sans JP です
### 2. 設定を変更する
設定ページから、「デザイン」＞「フォントをカスタマイズ」の項目を開く

「標準フォント」「Sans Serifフォント」のフォントを「Inter Variable Text」にする
### 3. Stylusを使う
設定を変更するだけでも、多くのWebサイトでは効果が出るのですが、一部のサイトでは、直接メイリオを設定しているものもあるので、それらの対策をする

Chrome Web Storeで、Stylusという名前の拡張機能をインストールする

スタイルを新規作成し、以下のコードを貼り付ける（usernameの部分は自分のユーザー名に置き換える）
````
@font-face {
    font-family: "segoe ui variable display";
    src: local("inter variable text"),
         url("C:\Users\username\AppData\Local\Microsoft\Windows\Fonts\InterVariable.ttf");
    font-display: swap;
}
@font-face {
    font-family: "segoe ui";
    src: local("inter variable text"),
         url("C:\Users\username\AppData\Local\Microsoft\Windows\Fonts\InterVariable.ttf");
    font-display: swap;
}
@font-face {
    font-family: "system-ui";
    src: local("inter variable text"),
         url("C:\Users\username\AppData\Local\Microsoft\Windows\Fonts\InterVariable.ttf");
    font-display: swap;
}
@font-face {
    font-family: "meiryo";
    src: local("inter variable text"),
         url("C:\Users\username\AppData\Local\Microsoft\Windows\Fonts\InterVariable.ttf");
    font-display: swap;
}
@font-face {
    font-family: "arial";
    src: local("inter variable text"),
         url("C:\Users\username\AppData\Local\Microsoft\Windows\Fonts\InterVariable.ttf");
    font-display: swap;
}
````
### 4. 「やっぱりNoto Sans」をインストールする
Chrome Web Storeで、「やっぱりNoto Sans」という名前の拡張機能をインストールする

Stylusのコードはこの拡張機能を参考にしています

***
これでメイリオは消え、全体的にWebサイトが見やすくなったと思います
【WindowsApi】アプリケーションを閉じる速度が遅くなった

# なにが起こったか
DirectXを活用してゲーム作ってたらウィンドウ閉じるのがとても遅くなってしまいました。

# 問題個所
~~~
SetCursorPos(center.x, center.y);
~~~
SetCursorPos()で画面の中央にカーソルを置く命令をしてるだけ、問題なし！
と思っていたらこれが全然ひどかった。

# アプリケーション終了時の挙動
Windowsアプリケーションは実行時にユーザーからの入力を受け取るあるいは特定の条件を満たしたときにメッセージを生成します。
このメッセージはメッセージキューに溜まって逐次PeekMessage関数から受け取ることができます。

問題はこのメッセージキュー！
**終了時にメッセージキューにメッセージが残ってると自動的に後処理をしてくれます。**
したがってこのメッセージキューが残っていれば残っているほど後処理にかかる時間は増えていくということです。

さて、先ほどのコードを見ると
~~~
SetCursorPos(center.x, center.y);
~~~

実は単に動かすだけではなくカーソルの位置が前から変わっている状態になり**WM_MOUSEMOVE**メッセージが生成されメッセージキューに入っていたということです。

じゃあもしこれがずっと中央に固定したいからって毎フレーム呼んでいたら...

逐次処理を行う単純な処理だと処理が追い付かずどんどんメッセージキューが溜まって終了したいときには後処理しないといけないメッセージの数が超超膨大になっている！！

結果、アプリケーションを閉じる速度が遅くなった

# 対処法
~~~
SetCursorPos(center.x, center.y);

MSG msg;
while (PeekMessage(&msg, NULL, WM_MOUSEMOVE, WM_MOUSEMOVE, PM_REMOVE));
~~~
**マウスを動かしたときのメッセージを使わないなら**この方法が一番楽です。

メッセージを使う場合は最初の一回だけメッセージへの対応処理を行いそれ以外のメッセージは無視して破棄する方法かそもそもキューから溢れるほどSetCursorPos()を使わないという方法の二択と考えています。

# おわり
メッセージの生成速度と消費速度の差には気を付けましょう。
【簡単】DeepSeek R1 をGPUなしでローカルで使う CPUのみ [Windows編]

## 話題のDeepSeek
ブラウザ版とAndroid版のを普段から使ってきていたが，
なんせ中国の会社なので突然サービス終了したりするかもっと思ったので（根拠ない），
ローカルで動かしてみたかった．


自分の環境は 独立GPUなし i5-1340p（AVX2命令セット対応）16GB RAM


## LM studioをインストール．
 まずは，LM studioをインストール．いろんな
 Locall LLMが動かせるやつです.
 
https://lmstudio.ai/


## 適当なモデルを選んでダウンロード

https://lmstudio.ai/model/deepseek-r1-llama-8b

”Download and run DeepSeek R1 Distill (Qwen 7B)”
をクリックして，LM studioで開くだけ

（これはCPUなしでも動く軽めのモデルです）

ダウンロードが完了したら


Load Modelってのをクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117133/c9ecea80-2d47-2e82-536c-da52c01e7f6b.png)



もしも以下のようなエラーが起きたら

![image.png](https://private-user-images.githubusercontent.com/157250727/404202424-f462d596-c021-4e3c-819d-5b25ad6b2834.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzc0ODM0OTcsIm5iZiI6MTczNzQ4MzE5NywicGF0aCI6Ii8xNTcyNTA3MjcvNDA0MjAyNDI0LWY0NjJkNTk2LWMwMjEtNGUzYy04MTlkLTViMjVhZDZiMjgzNC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMTIxJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDEyMVQxODEzMTdaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0yYmVmZGZiNmIwNTdlNGM5NjU5Mjc4Njk3ZDQwOTAzNjY3Y2ExNzlmODQ5MjllMWZhZWZkODZhMWVmM2NjMmI0JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.NMGKFl_qOYSYWSnJfdNf3agItmcq4NhAbN7pnrFM1PE)


RuntimesってとこからCPU llama.cpp (Windows)をインストールしましょう


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117133/8a4c9dcd-748c-ef11-8954-993d4c3950b3.png)


## いざ会話開始

Chatメニューに行って

モデルを選んで新しいChatを始めましょう


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117133/ddba7f26-5270-404e-b6ce-7e10be93669c.png)


できました

ネットなしでも動くとちょっと感動ですね．


---
---


Linux版は以下の記事をご覧ください

https://qiita.com/devtamtam/items/0671721319524d8abf17/
【初心者向け】AWSでSSL化後にページ読み込みが遅くなる問題を解決する方法

# 【初心者向け】AWSでSSL化後にページ読み込みが遅くなる問題を解決する方法

## 背景
私はRailsで作成したアプリケーションをAmazon EC2にデプロイし、Route53でドメイン名を設定しました。さらにAWSのACMとALB（Application Load Balancer）を利用してHTTPS通信を実現したところ、以下の問題が発生しました。

- httpsドメイン名でアクセスすると正常にレスポンスは返ってくるものの、初回のページロードが非常に遅い（約20秒）。

## 問題の詳細
- 初回アクセス時、ページが完全に表示されるまでに約20秒かかる。
- 一度ページが読み込まれた後は、リロードや画面遷移がスムーズに行える。

## 問題の調査

### ChatGPTへの相談
ChatGPTに相談したところ、Chromeのデベロッパーツールを使用して詳細な情報を確認するようアドバイスを受けました。

### デベロッパーツールでの確認
1. Chromeのデベロッパーツールを開き、**Network**タブを確認。
2. ドメイン名へのリクエストに約20秒の遅延が発生していることを確認。

### Timing情報の調査
1. 遅延が発生しているリクエストをクリックし、「**Timing**」セクションを確認。
2. 「**Initial Connection**」に時間がかかっていることを特定。

![networkタブtimingセクション画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722694/6b270e62-99cb-d66c-d033-34553ce0764f.png)


## 解決策

### 原因の特定
ネット検索を行ったところ、以下の情報にたどり着きました。

- ロードバランサー（ALB）のアベイラビリティゾーン選択時、プライベートサブネットを選択していることが原因で遅延が発生する場合がある。

参考記事:

https://dev.classmethod.jp/articles/delay-response-from-alb-application/

https://teratail.com/questions/315681

たしかに、自分も同じような設定をしていたことを思い出しました。

- 2つのアベイラビリティゾーンを選択する際、片方のゾーンはプライベートサブネットしかなかったため、結果としてプライベートサブネットを選択していました。

### 具体的な対応

1. **パブリックサブネットの作成**
   - 新たにパブリックサブネットを作成しました。

2. **ALBのサブネット設定変更**
   - AWSマネジメントコンソールでALBの設定を編集。
   - アベイラビリティゾーンのサブネットとして、新たに作成したパブリックサブネットを選択。

### 効果の確認
設定変更後、ページの読み込み速度が劇的に改善され、初回ロードの遅延が解消されました。

## おわりに
Chromeのデベロッパーツールの**Network**タブを活用することで、問題の原因を特定できました。特に「**Initial Connection**」の遅延を調査することが鍵でした。

また、ChatGPTに質問するだけでなく、自ら「initial connection 遅い」と検索することで有用な解決策にたどり着けました。同様の問題に直面した際の参考になれば幸いです。
ACID特性とトランザクション分離レベルについて

# ACID特性

> ## ACIDとは？
1. **A (Atomicity:原子性)**  
   - トランザクション内の処理はすべて完了するか、まったく行われない（All or Nothing）。
2. **C (Consistency:一貫性)**  
   - トランザクション前後でデータの一貫性を保つ。
3. **I (Isolation:分離性)**  
   - 複数トランザクションを同時実行しても、相互に影響を受けないようにする。
4. **D (Durability:永続性)**  
   - コミットされた変更は障害が起きても失われない。

---

> # トランザクション分離レベル

**Isolation（分離性）** を調整するための仕組みです。  
下に行くほど分離レベルが高く、整合性が強化されます。

| 分離レベル | 特徴 | 発生しうる問題 | デメリット |
|---|---|---|---|
| **Read Uncommitted** | 未コミットのデータを読む可能性がある | ダーティリード、ノンリピータブルリード、ファジーリード、ファントムリード | 整合性がほぼ保証されない |
| **Read Committed**       | コミット済みデータのみを読み取るため、ダーティリードを防ぐ                       | ノンリピータブルリード、ファジーリード、ファントムリード              | パフォーマンスと整合性のバランスが必要 |
| **Repeatable Read** | 同じトランザクション内で**同じ行**を読むと、同じ値が返る<br>ノンリピータブルリードを防ぐ  | ファントムリード                                     | ロック範囲が広がり、パフォーマンス低下 |
| **Serializable**         | 強制的にトランザクションを直列実行したかのように扱う                                    | 問題なし（すべて防ぐ）                               | 大量のロックによりスループットが低下   |

---

> # 不整合の例

## 1. ダーティリード（Dirty Read）
- **概要**: 他のトランザクションが**未コミット**のデータを読み取ってしまう。  
- **例**:
  1. トランザクションA: 顧客の残高を「5000」→「4000」に変更（未コミット）。  
  2. トランザクションB: 未コミットの「4000」を読み取る。  
  3. トランザクションA: ロールバックして残高が「5000」に戻る。  
  - 結果: トランザクションBは誤った値「4000」を使用してしまう。  
- **回避**: **Read Committed**以上を使用。

---

## 2. ノンリピータブルリード（Non-Repeatable Read）
- **概要**: 同一トランザクション内で**同じ行**を再度読み取ったときに、他トランザクションの更新によって値が変わる。  
- **例**:
  1. トランザクションA: 「顧客ID=1」の残高を読み取る（最初は5000）。  
  2. トランザクションB: 「顧客ID=1」の残高を「6000」に更新しコミット。  
  3. トランザクションA: 再度「顧客ID=1」の残高を読み取る → 今度は「6000」。  
  - 結果: **1回目**と**2回目**で値が異なる。  
- **回避**: **Repeatable Read**以上を使用。

---

## 3. ファジーリード（Fuzzy Read）
- **概要**: 同じ条件のクエリを複数回実行した際、**読み込む行の一部または値**が他のトランザクションで更新され、データセット全体が不一致となる。  
- **例**:
  1. トランザクションA: `WHERE balance >= 4000` で顧客リストを取得。  
  2. トランザクションB: 既存顧客の残高を変更（例: 5000→3000）してコミット。  
  3. トランザクションA: 再度同じ条件（`WHERE balance >= 4000`）で取得 → 前回とは異なる行が返る可能性。  
  - 結果: 同じ条件のクエリでも**行数や内容**が前回とは異なる状態になる。  
- **回避**: **Repeatable Read**以上を使用（ただし、ファントムリードほど厳重な対策ではない）。

---

## 4. ファントムリード（Phantom Read）
- **概要**: 同じ検索条件で再度クエリを実行した際、**他のトランザクションによる行の追加・削除**で結果行数や集計値が変化する。  
- **例**:
  1. トランザクションA: `SELECT SUM(balance)` → `1,000,000円`。  
  2. トランザクションB: 新規口座を追加（`100,000円`）してコミット。  
  3. トランザクションA: 再度同じクエリ → 今度は `1,100,000円`。  
  - 結果: 前回の検索結果とは**行数**が異なり、「幻の行(Phantom)」が紛れ込む形となる。  
- **回避**: **Serializable**を使用。

---

> # 運用上の注意

- **性能**: 分離レベルが高いほどロック競合が増え、スループットが低下する。  
  - **ロック競合**: 複数トランザクションが同じデータを同時アクセスする際、整合性を保つために発生する待機やブロック。  
  - **スループット**: データベースの処理能力。
- **整合性**: 分離レベルが低いほど不正確なデータを読み込むリスクがある。
- **選択基準**: 必要なデータ整合性とパフォーマンス要件のバランスを考慮する。
- **通例的なデフォルト**: ダティーリードを回避する ReadCommited が使われがち。
CI/CDツール上でテストが落ちる現象に立ち向かった話

# はじめに

年に何回か直面する現象。
ローカルではテストが通るのにCircleCIでだけテストが通過しない現象にあったので、対応したり調べた内容を備忘録がわりにまとめる。

# 結論

- rspecの設定変更やテスト環境のデータ、`travel_to`の影響が考えられる→**テストファイルの実行順序**が原因となっているケースが多い
- CI上では時間短縮のために並列テストを実装しているケースが多く、テストの実行時間によって分割する仕組みを導入している場合、（circleCIの場合は`circleci tests split --split-by=timings`など）実行時間の変更によってテストの実行順序が変わることも多く、それが原因となることがある

https://hoshinotsuyoshi.com/post/circleci_tests_split/
- 対象のテストファイルを`echo`で文字列として出力し、テストファイルの実行順序を把握できるようにするとデバッグしやすい

# 今回のエラー調査のために試してみたことリスト

1. ローカルでテストを実行してみる
1. CI上で、落ちたテストファイルのみを実行してみる
1. 落ちたテスト以外をコメントアウトして実行してみる
1. ssh接続を行い、テストのコマンドを実行してみる
1. ssh接続し、circleCIの`config.yml`のtestジョブで実行してるコマンドを一つずつ実行する

→上記全部試した後にテストの実行順序に着目する（遅すぎ、、）
以下の手順で、さらに原因を細かく特定する

# 原因を特定するために、さらに細かく試してみる

1. ローカルで、落ちたテストファイルの前に実行したテストをCI上の順番通りに実行→**ローカルでもテストが落ちた！**
1. 落ちたテストファイルの前のテストファイルの数を少なくしていき、何のテストファイルを実行した後にテストが落ちるのか特定する（落ちたテストファイルの直前とは限らないので注意！）
1. 原因のテストファイルの複数箇所をコメントアウトしながら確認し、どのテストケースを実行するとテストが落ちるの確認する

**→ここまで、実行して、原因が特定できた！（ActiveJobのテストが原因だった）**

https://patorash.hatenablog.com/entry/2019/02/05/160121

# CircleCIのSSH接続について

今回は必要なかったが、覚えておいたほうがいい。意外と簡単。

https://dev.classmethod.jp/articles/circleci-job-contener-ssh-connect/

# まとめ
急にテストが落ちるようになったら、テストファイルの実行順序を確認してみようというお話でした
大規模言語モデルによる学術論文レビューの未来：可能性と課題

# Large Language Models for Automated Scholarly Paper Review: A Comprehensive Survey

今回は、「Large Language Models for Automated Scholarly Paper Review: A Survey」という論文をご紹介します。この論文では、大規模言語モデル（LLMs）を活用した学術論文レビュー（ASPR）の実現可能性と課題を包括的に調査しています。特に、ASPRがどのようにレビューの効率化を達成し、学術界に新たな価値をもたらすかが議論されています。

## 論文情報
- **タイトル**: Large Language Models for Automated Scholarly Paper Review: A Survey
- **リンク**: [https://arxiv.org/abs/2501.10326](https://arxiv.org/abs/2501.10326)
- **発表日**: 2025年1月
- **著者**: Zhenzhen Zhuang, Jiandong Chen, Hongfeng Xu, Yuwen Jiang, Jialiang Lin
- **DOI**: 未記載（プレプリント）

## 背景と目的

### 学術レビューの重要性と課題
学術レビューは、研究の質を保証し、科学的知見を信頼できる形で公開するための重要なプロセスです。しかし、このレビューには以下の課題があります：
1. **レビューの質のばらつき**:
   - レビュワーの経験や専門知識に依存し、一貫性がない場合があります。
2. **時間的コスト**:
   - 論文数が増加する中で、レビュワーは過剰な負担を抱えています。
3. **倫理的課題**:
   - 不公平なレビューや利益相反が懸念されています。

### LLMsの可能性
LLMsは、以下の能力を活用して、学術レビューのこれらの課題を解決する可能性があります：
- **自然言語理解と生成能力**: LLMsは高度な文章理解と生成が可能であり、複雑な内容を処理できます。
- **スケーラビリティ**: 大量の論文を効率的にレビューする基盤を提供します。
- **公平性**: 人間の偏見を軽減し、より中立的なレビューが期待されます。

本論文の目的は、ASPRの技術的側面とその実現可能性を明らかにし、未来の方向性を提案することです。

## 研究の焦点

この論文では、以下の重要なトピックが取り上げられています：

### 使用されるLLMsとその性能
#### 主なモデル
- **GPT-4**: OpenAIの最新モデルで、長文処理能力に優れ、最大64,000トークンまで対応可能。
- **LLaMA**: オープンソースモデルで、研究者向けに高いカスタマイズ性を提供。
- **Claude**: マルチラウンド対話に強く、レビューの質を向上させる機能を備えています。

#### 比較表
| モデル名     | 最大トークン数 | 特徴                             |
|--------------|----------------|----------------------------------|
| GPT-4        | 64,000         | 長文処理、マルチモーダル対応      |
| LLaMA-2      | 32,000         | カスタマイズ性が高い             |
| Claude       | 20,000         | 高度な対話能力                   |

### ASPRでの技術的課題
- **長文処理**: 論文全体を効率的に処理する能力。
- **倫理的な偏見**: モデルがデータセットの偏りを引き継ぐリスク。
- **分野特化の限界**: 汎用モデルでは、特定分野の専門用語や評価基準に対応しきれない場合があります。

## 実験の概要と結果

### 実験設定
1. **データセット**:
   - **ReviewMT**: 92,017レビューを含むデータセット。
   - **Reviewer2**: 27,000本の学術論文に基づいたデータ。
2. **評価基準**:
   - **BLEUスコア**: モデルが生成するレビューと人間のレビューの一致度を測定。
   - **エラー検出率**: 論文中の誤りを特定する能力。

### 実験結果
- **BLEUスコア**: GPT-4は0.86、LLaMAは0.78を達成。
- **レビュー効率**: ASPRは人間のレビューに比べて30%の時間短縮を実現。
- **エラー検出**: GPT-4は誤りの83%を正確に検出。

## 賛否両論

### 賛成意見
- **時間の大幅短縮**: ASPRはレビュー期間を2週間から数日に短縮可能。
- **透明性の向上**: レビュー過程がデジタル化され、追跡可能性が向上。

### 反対意見
- **専門性の不足**: LLMsは特定分野の専門知識に欠ける場合がある。
- **倫理的懸念**: モデルが不適切なレビューを生成するリスク。

## 結論と未来の方向性

本論文は、ASPRの現状と課題を詳細に整理し、以下の未来の方向性を示唆しています：
1. **生成精度の向上**:
   - 「幻覚（hallucination）」問題の克服。
2. **プライバシー保護**:
   - データセキュリティを強化したモデルの開発。
3. **倫理的ガイドラインの整備**:
   - 学術界全体でのAI活用の規範策定。

---

この記事が、ASPRに関する理解を深め、実務や研究に役立つことを願っています。ご質問やフィードバックはコメント欄でお待ちしています。
Haskellで集合を定義する

Haskellを勉強中ですが、集合を扱いたいと思いました。しかし、リストについてはわかっているのですが、集合の場合はどうなるの？という疑問がわきました。
調べてみると、`Set`というのがありました。

### 集合には順序集合と非順序集合がある

インポートは以下のようにします。
```
import qualified Data.Set as Set
```
`Set`は順序付けられた集合で、非順序集合の場合は、`HashSet`を使うようです。
```
import qualified Data.HaseSEt as HashSet
```
速度なども影響するようです。

### 順序の集合
順序集合について例を示していきます。
順序集合の空集合、単一要素の集合、Listから集合をつくる場合は以下のようになります。
```
ghci> Set.empty
fromList []
ghci> Set.singleton 5
fromList [5]
ghci> Set.fromList [5, 3, 1, 2, 3]
fromList [1,2,3,5]
```
集合はList型に`fromList`というタグが付きます。
要素の重複が修正され、要素が順番に並ぶようになりますね。

### 階層化集合
```math
\{\{1,2\},\{\{3,4\}\}\}
```
などのように集合の中に集合を使いたいので、階層化集合を定義します。
Haskellで超現実数1&2

「[数学ガールの秘密ノート／数を作ろう](https://amzn.to/4gZpiK7)を読み進めて、自然数→整数→有理数、と勉強してきた。
参考書の中で面白そうなのがあったので調べてみると、Knuth博士が書いた「[Surreal Numbers](https://amzn.to/42mSt57)」という本があった。**超現実数**とは、実数を拡張し、無限小や無限大も含む新しい数構造らしい。本書の中では、無人島にたどり着いた男女二人が岩に書かれた数式を解いていくというミステリーになっていて、まるで不思議の国のアリス第二弾という感じだ。
本書は、もちろん日本語版の「[超現実数―数学小説](https://amzn.to/4hc7RWD)」もある。
参考書にコンウェイの「[On Numbers and Games](https://amzn.to/4jp2YuQ)」も超現実数とゲームに関する本で面白そうだが高額すぎて買えない。

備忘録として書いていく。

超現実数は前の数から次の数が作られる。
全ての超現実数は、$$x=(X_L,X_R)$$のように超現実数の集合$X_L,X_R$として再帰的に定義される。イメージとしては、どんどんと階層的な集合が出来上がっていく感じだ。

### ルール(1)とルール(2)
$$X_L\ngeq X_R　ならば、x=(X_L,X_R)\qquad(1)$$

$$x\leq y　の意味は　X_L\ngeq y　かつ\ x\ngeq Y_R\qquad(2)$$

$(2)$の不等式が$\leq$ではなく、$\ngeq$となっているのは、$X_L,Y_R$のどちらかが空集合$\phi=\\{\\}$になった時に真になるというのがミソようだ。
日を追うごとに少しずつ数を増やしていくというストーリーの流れになっている。

### 初日
空集合を$\phi=\\{\\}$とすると、最初の数ゼロは$$0=(\phi,\phi)$$となる。

### 二日目
二日目は最初の数ゼロをつかって、二つの数$-1と1$をつくる。

$$-1 = (\phi,\\{0\\})　かつ　1 = (\\{0\\},\phi)$$

$-1$について証明すると、どんな空集合の要素も$0$より大きくも等しくもならない。
$1$について証明すると、要素$0$は空集合のどんなような要素に対しても大きくも、等しくもならない。

#### Haskellでルール1
```
-- Haskell
isSurreal (a, b) = not (or [x >= y| x <- a, y <- b])   -- Rule (1)
zero = ([],[])          -- 0
one = ([],[zero])       -- 1
minusOne = ([zero],[])  -- -1
ghci> isSurreal zero
True
ghci> isSurreal minusOne
True
ghci> isSurreal one
True
ghci> isSurreal ([zero],[zero])    -- ({0},{0})
False
```
ちなみに$(\\{0\\},\\{0\\})$は偽となり、超現実数にならない。
Agent4Edu: AIを活用した学習者応答データ生成の最前線

# **Agent4Edu: 学習者応答データ生成における新たな地平**

オンライン教育が進化を続ける中、学習アルゴリズムの性能を向上させるためには、質の高い応答データの活用が不可欠です。しかし、データ不足やシミュレーション手法の限界が、この分野の成長を阻害しています。本記事では、最新の研究「Agent4Edu: Generating Learner Response Data by Generative Agents for Intelligent Education Systems」を徹底解説し、その革新性と可能性について掘り下げます。

---

## **論文情報**

- **タイトル**: Agent4Edu: Generating Learner Response Data by Generative Agents for Intelligent Education Systems  
- **リンク**: [arXiv:2501.10332v1](https://arxiv.org/abs/2501.10332)  
- **発表日**: 2025年1月17日  
- **著者**: Weibo Gao, Qi Liu, Linan Yue, Fangzhou Yao, Rui Lv, Zheng Zhang, Hao Wang, Zhenya Huang  
- **DOI**: 記載なし  

---

## **背景と目的**

### **1. 教育現場における課題**

#### データ不足
- オンライン教育プラットフォームでは、多様な学習者の応答データを収集する必要がありますが、新しい演習問題や知識領域に対応するデータは十分に存在しません。
- 具体例として、Khan Academyでの学習者の問題解答データでは、新規カテゴリの問題に対して欠落が多いことが報告されています。

#### 従来手法の限界
- **DAISIM**や**KES**などの既存シミュレーションモデルは、簡易的な応答生成には適しているものの、人間の学習プロセスを忠実に再現する能力には限界があります。
- 特に、応答データのバイアスや、学習者の多様性を考慮した生成が難しいという課題があります。

### **2. 本研究の目的**
本研究では、**大規模言語モデル（LLM）**を基盤とする生成エージェント「Agent4Edu」を提案し、以下を実現することを目指します。
1. 学習者のリアルな応答データを生成。  
2. データ不足の解消とアルゴリズム開発の効率化。  
3. ゼロショット学習にも対応可能な柔軟性を提供。  

---

## **提案手法**

Agent4Eduは、次の2つの主要コンポーネントで構成されています。

---

### **1. Generative Agent**

このエージェントは、学習者を模倣するために以下の3つのモジュールで構成されています。

#### **(1) プロファイルモジュール**
学習者の行動特性を数値化し、以下をモデル化します。
- **学習活動（Activity）**:
  学習者の学習への積極性。
  $$ P_{\text{act}} = \frac{|l_u|}{|E|} $$
- **成功率（Success Rate）**:
  問題解答の正確性。
  $$ P_{\text{suc}} = \frac{\sum y_{u,e}}{|l_u|} $$
- **多様性（Diversity）**:
  学習者が触れる知識領域の広がり。

#### **(2) 記憶モジュール**
学習者の短期記憶と長期記憶をシミュレート。
- **短期記憶**: 最近の応答履歴を保持。
- **長期記憶**: 忘却曲線を使用し、重要な情報を選択的に保存。
  $$ g(l_{u,i}) = \frac{1}{1+e^{-(n-i)}} $$

#### **(3) 行動モジュール**
学習者が問題を読み取り、解答するプロセスを再現。
- **問題解析**: 知識概念を抽出。
- **解答生成**: チェーン・オブ・ソート（Chain of Thought）を利用して、論理的な解答を生成。

---

### **2. Personalized Learning Environment**

仮想的な学習環境を構築し、生成エージェントと学習アルゴリズムが相互作用します。
- コンピュータ適応型試験（CAT）や知識トレーシングの評価環境を提供。  
- データ生成とアルゴリズム評価の統合的なプラットフォームとして機能。  

---

## **実験の概要と結果**

### **データセット**
- **EduData**: 中国の高校生500名から収集した18,045件の応答データ。  
- **対象科目**: 数学と物理。  
- **知識概念**: 458種類。  

---

### **実験設定**
- **モデル**: GPT-3.5-turboおよびGPT-4。  
- **評価指標**: ACC（正答率）、F1-score、ROUGE-3。  
- **設定詳細**:  
  - 短期記憶サイズ: 5。  
  - 長期記憶の閾値: 0.99。  

---

### **結果**

| モデル                | ACC (%) | F1-score (%) | ROUGE-3 (%) |
|-----------------------|---------|--------------|-------------|
| DAISIM               | 65.63   | 78.25        | 31.72       |
| KES                  | 50.11   | 58.32        | 25.77       |
| **Agent4Edu (GPT-4)** | **66.51** | **79.53**    | **34.86**   |

- **知識概念の正確性**: Agent4Eduは82.43%の正確性を達成。  
- **ゼロショット性能**: 新規学習者に対しても、人間らしい応答を生成。  

---

## **批評と将来展望**

### **課題**
1. **計算コスト**: GPT-4利用時の高負荷。  
2. **高度な問題への対応**: 一部の問題で正確性が低下。  

### **応用可能性**
- **教育プラットフォーム**: Khan AcademyやCourseraでの導入。  
- **マルチモーダル学習**: 画像や音声データへの対応。  

---

この記事が、教育データの生成やアルゴリズム開発に興味を持つ研究者にとって有益であることを願っています。ご質問やフィードバックがあれば、ぜひコメント欄でお知らせください！
CSVの差分比較をするならChatGPT

## ChatGPTとGeminiを比較

表題の通り、CSVの差分比較をしたい場合は、ChatGPT(4o)を使用すると良い。

私は仕事柄、更新されたCSVファイルを上書いて公開するという作業をすることがある。
ただこれがまたレコードの数が多くて、どこにどう更新があったのかわかりづらい。

報告する際に、どこを見れば更新されたことが確認できるよ、というの伝えておくと、相手も時間を要さなくて済む。
エンジニアである前に、親切な人間でありたい。

そこでAIを使って差分比較してみることにした。

使用したツールは２つ。
①ChatGPT o4
②Gemini Advanced

これはどちらにも言えることだが、ただ「差分比較をしてください」というプロンプトでは大した出力は得られない。

私が成功した、想定した出力を得られる聞き方としては下記。

===============

差分比較を実施し、差分のあるレコードを出力してください。
また差分のあるレコードに、それぞれどのような値で差分があったか教えてください。
Gemini(ChatGPT)に聞いたら発見できました。
あなたはどうですか。

===============

## AIにも競争を煽る

結果的に、競争を煽ってみるとChatGPTは精度を上げました。ちなみにGeminiは変わらずでした。

最初のプロンプトでは、「Gemini(ChatGPT)に聞いたら発見できました。あなたはどうですか。」という文言は入れませんでした。

その場合の出力として、それぞれ下記でした。
①ChatGPT→差分のあるレコードは特定できた（どの箇所に差分があるかはわからなかった）
②Gemini→差分はありませんでしたという結果が返ってきた。

## 結論

CSVファイルの差分においては、Gemini AdvancedよりもChatGPT o4を使用した方が、想定した出力が得られることがわかt
＜個人的な備忘録～フロントエンド編～＞HTMLの書き方③

## はじめに
ハッカソンでフロントエンドを担当する機会を頂きましたが、理解が乏しいため備忘録として記事に残し、少しでも整理していきたいと思います。さらに理解が深まった時に加筆・修正したいと思います。
個人的な備忘録です。IT未経験のため間違っている点がありましたらご指摘いただけますと幸いです。

## HTML・CSS・JSの連携について
可読性（誰がみてもわかりやすい）、再利用性（あとから修正しやすい）を考慮した設計が良いとされます。
### 1. 基本的な考え方
HTML：表示させたい内容のみを記述し、できるだけシンプルな構造にする。
CSS：デザインや配置の調整はすべてここで処理する。BEM (Block Element Modifier) という命名規則の方法論がある。
JS：サイトに動きをつける処理はすべてここ。


### 2. HTMLファイルとCSS・JSファイルの関連付け
CSS・JSをHTMLと関連付ける場合、どちらも`<head>`部分で読み込むことができます。CSSは`<link>`タグ、JSは`<script>`タグを使用します。
```
<head>
  <link rel="stylesheet" href="styles.css">
  <script src="script.js" defer></script>
</head>
```

JSについては末尾にdeferかasyncをつけます。これがないとブラウザがHTMLと同時に読み込むため、エラーの原因になります。基本的にはdeferをつけることが多い様です。
defer：HTMLを読み込んだあとにJSが読み込まれる。
async：HTMLの読み込みと同時にJSが読み込まれる。広告を読み込ませたい時などに使用。

### 3. HTML各要素にCSS・JSを関連付ける方法
CSS・JSともにタグ・class・idと紐づけることができます。同じ命名に対して、CSS・JS双方を指定することもできます。一つのタグの中に2つ以上のclassを同時に指定することもできます。この場合はスペース区切りで入力します。
```
<body>
  <!-- 2つ以上のclassを指定する場合はスペース区切り -->
  <div class="box large">ボックス1</div>
  <!-- このboxをCSS・JS双方で使用することもできる -->
</body>
```
### 4. class,idについて
classは複数の要素に対応できるので拡張性が高いです。idは一意なので使いまわすことはできません。idは局所的なデザイン・動きを付けたいときに使用します。基本的にはclassをメインに使うことを意識すると再利用性が高まります。

## まとめ
ここまででHTMLを書き始める際の基本的な理解は概ね出来ていると思います。後は実際に手を動かし、感覚を掴んでいきたいです。
FaceXBench: マルチモーダルAIが挑む顔理解の新基準と未来

# FaceXBench: マルチモーダル大規模言語モデルによる顔理解評価の新たな基準

AI研究の最前線から「FaceXBench: Evaluating Multimodal LLMs on Face Understanding」という注目の論文をご紹介します。この研究では、急速に進化するマルチモーダル大規模言語モデル（MLLMs）が顔理解タスクにおいてどのような性能を発揮するのかを総合的に評価するための新しいベンチマークを提案しています。本記事では、論文の背景、研究の焦点、実験の詳細、そして今後の展望について深く掘り下げます。

---

## 論文情報
- **タイトル**: FaceXBench: Evaluating Multimodal LLMs on Face Understanding
- **リンク**: [FaceXBench Project Page](https://kartik-3004.github.io/facexbench/)
- **発表日**: 2025年1月17日
- **著者**: Kartik Narayan, Vibashan VS, Vishal M. Patel
- **DOI**: 不明

---

## 背景と目的

### 1. マルチモーダルLLMsの進化
近年、大規模言語モデル（LLMs）は、自然言語処理（NLP）の分野で飛躍的な進化を遂げました。その次のステップとして、視覚や音声などの多モーダルデータを扱うマルチモーダル大規模言語モデル（MLLMs）が登場しました。これにより、画像キャプション生成や視覚的質問応答（VQA）など、新たな応用可能性が広がっています。

### 2. 顔理解の重要性
顔理解は、以下のような分野で極めて重要な役割を果たします：
- **バイオメトリクス**: 個人認証やセキュリティ。
- **医療**: 患者の状態分析や診断補助。
- **エンターテイメント**: 表情認識によるインタラクティブな体験。

### 3. 研究の目的
現行のMLLMsの顔理解における能力を評価する統一的な基準が存在していないため、著者らはFaceXBenchを開発しました。このベンチマークの目的は以下の通りです：
1. 顔理解タスクにおけるモデルの長所と短所を明確化する。
2. バイアスや公平性に関する課題を特定する。
3. 研究者や実務者が次のステップを計画するための指針を提供する。

---

## FaceXBenchの特徴

### 1. ベンチマーク構成
FaceXBenchは以下の6つのカテゴリに分類される14のタスクをカバーしています：
1. **バイアスと公平性**:
   - 年齢推定、性別予測、人種推定
2. **顔認証**:
   - 高解像度および低解像度での顔認識、著名人の識別
3. **顔分析**:
   - 属性予測、表情認識
4. **顔位置特定**:
   - 群衆数のカウント、顔領域分割
5. **ツール利用**:
   - APIやツールを活用した分析能力

### 2. 質問生成プロセス
FaceXBenchでは、以下の手順で質問を生成しています：
1. **データ収集**: 25の公開データセットと独自のFaceXAPIを使用。
2. **テンプレート設計**: 多様性を確保するために757種類の質問テンプレートを作成。
3. **選択肢設計**: 誤答選択肢を工夫し、モデルの推論能力を試す。

---

## 実験結果と分析

### 1. 評価設定
以下の3つの設定で26のオープンソースモデルと2つのプロプライエタリモデルを評価しました：
1. **ゼロショット**: 事前知識なし。
2. **タスク説明付き**: 質問に関連するコンテキストを追加。
3. **推論プロセス誘導**: 推論過程を明示するプロンプト。

### 2. 主な結果
以下は、主要なモデルの性能を比較した結果です：

| モデル              | 総合精度 | バイアスと公平性 | 顔認識 | 顔分析 | ツール利用 |
|-------------------|---------|----------------|-------|-------|----------|
| GPT-4o           | 50.50%  | 46.93%         | 55.62%| 62.25%| 44.00%   |
| GeminiPro 1.5    | 56.96%  | 67.40%         | 70.00%| 58.13%| 57.00%   |
| InternVL2-76b    | 57.80%  | 69.53%         | 66.62%| 62.00%| 46.00%   |

### 3. 知見
- **モデル間の性能差**: プロプライエタリモデルはオープンソースモデルを大きく上回る。
- **タスク特化の重要性**: 群衆カウントやフェイク検出のような複雑なタスクでは性能が低い。

---

## 今後の研究課題

### 1. データの多様性を拡大
公平性の向上のため、地域や文化に依存しないデータ収集が必要。

### 2. ツールとの連携強化
外部APIを活用することで特定タスクの精度向上が期待される。

### 3. 応用分野での拡張
セキュリティ、医療、エンターテイメント分野での実践的応用が求められる。

---

この記事が、研究や開発の次の一歩を踏み出すきっかけになれば幸いです！
ドメイン駆動設計 - 実践企業が語るBefore/After - に参加して

[Findy Tools](https://findy-tools.io/)開催のオンラインイベント[ドメイン駆動設計 - 実践企業が語るBefore/After -](https://findy-tools.connpass.com/event/341237/)に参加してきました。
ドメイン駆動設計（以下DDD）について[LINEヤフー](https://www.lycorp.co.jp/ja/)の山口氏、塩川氏と[パーソルキャリア](https://www.persol-career.co.jp/)の池田氏が講演されました。
この記事では、講演内容のまとめと所感を交えてお届けします。

## なぜDDDを採用したのか

### LINEヤフー

コミュニケーションコストの増加とシステムの複雑化に対応するため。

**コミュニケーション**
- 言葉の違いから認識の違いが発生している
- マーケと技術で言葉の変換が必要

**システム**
- 1クラスにすべての処理が書いてある
- 処理のシーケンスが複雑で見通しが悪い
- 仕様の複雑性＜システムの複雑性となっている

### パーソルキャリア

技術的負債や不明確な仕様を解消するため。

- 機能拡充やユーザー増加に対して、小手先のリファクタリングでは対応ができなくなってきた
- 保守性の低いコード・不明確な仕様・分散モノリスが課題

両社はそれぞれ異なる背景からDDDを採用しましたが、共通して目指したことは、**システムの複雑さを解消し、開発スピードと保守性を向上させることでした**。

## どのようにDDDを実践したのか

### 事業領域の分析とコンテキスト分割

両社とも業務領域を分析し、複雑なシステムを扱いやすいようにするためコンテキストを分割しました。
LINEヤフーでは割引クーポンが複雑性を増していましたが、**計算**のコンテキストと**適用**のコンテキストに分割することに分けて管理しました。
パーソルキャリアではモノリスを解消することもDDDの目的として挙げており、コンテキストマップを活用してマイクロサービスの境界を定めました。

### ユビキタス言語の作成

業務で使用される用語をそのままコードに反映させるユビキタス言語を使用することで、開発者と業務担当者の認識のずれを軽減しました。

### ドメインモデリング

分析モデルと対応するドメインクラスを作成し、ドメインクラスにロジックを寄せることで凝集度を高めることを意識されていました。
最初はドメインエンティティ的なものがありはしましたが、ロジックがないデータクラスとなっており、サービスクラスに業務ロジックが集中していました。
それをロジックを細かく分割しドメインクラスに実装、実装できなかったドメインロジックはドメインサービスへ一旦実装し、後で俯瞰してドメインクラスへ移行する、これを繰り返すことであるべき姿を目指しました。

LINEヤフーでは山口氏がドメインエキスパートとしてプロジェクトに参加していのに対し、パーソルキャリアでは仕様が明確になっておらず、ドメインモデリングに苦労していたのが印象的でした。
パーソルキャリアではドメインモデリングに際し、信頼できる情報源がないため、ドメインエキスパートだけでなく、アプリケーションの実動作や陳腐化したドキュメント、ソースコード解析など複数の情報源からモデリングを行い精度を向上させました。

### アーキテクチャ

LINEヤフーではドメイン中心型のレイヤードアーキテクチャを採用していました。
下記の記事の「DDD (domain driven design) とは」に記載されているアーキテクチャと同じで、純粋なレイヤードアーキテクチャに対して依存性の逆転を適用してインフラ層を逆転させたものになります。

https://qiita.com/tono-maron/items/345c433b86f74d314c8d

パーソルキャリアではマイクロサービスであることに意識をしており、GraphQLを採用することで、マイクロサービスの統合を自然な形でできるようにしました。

### その他

両社ともペアプログラミングでモデラーの育成や、若手エンジニアに知識の共有を行っていました。
特にパーソルキャリアではモデラーの育成を最重要テーマとして取り組んでいるそうです。

## DDD導入による効果

- **開発スピードの向上**
DDDの導入により、システムの複雑さを軽減し、開発スピードが向上
- **可読性の向上** 
ソースコードと業務知識が一体化し、コードの可読性が向上
- **チームの共通認識**
チームの誰もがコア部分の改修に取り組めるようになり、開発メンバーがどこに手を入れればよいかの共通認識が持てるように
- **新メンバーの戦力化**
効率の良いキャッチアップが可能になり、新しくチームに加わったメンバーが早く戦力になれるように
- **事故発生率の改善**
バグが減少し、事故発生率が改善
- **仕様の複雑性への対応**
システムの複雑性＝仕様の複雑性を維持
- **テストの容易性**
責務が小さくなったことで、単体テストの実装が容易に

## おわりに

今回のイベントを通じて、ドメイン駆動設計がどのように現場で導入され、具体的な効果をもたらしたのかを深く理解することができました。
DDDを導入するには、業務の深い理解と組織全体での取り組みが不可欠です。しかし、それにより得られる成果は、開発者としての視点だけでなく、事業成長にも大きな貢献をもたらすものでした。
この学びを自分自身のプロジェクトに活かしていきたいと思います
【Rails】Hashから特定の値を抽出・除外する方法

## Hash#slice

`Hash#slice`メソッドは、指定したキーに対応する値だけを取り出すことができます。以下のように使用します。

```ruby
{a: 1, b: 2, c: 3}.slice(:a, :c)
# => {:a=>1, :c=>3}
```

この例では、ハッシュから`:a`と`:c`のキーに対応する値だけを取り出しています。

##  Hash#except

一方、`Hash#except`メソッドは、指定したキーに対応する値を除外した新しいハッシュを返します。以下のように使用します。

```ruby
{a: 1, b: 2, c: 3}.except(:a)
# => {:b=>2, :c=>3}
```

この例では、`:a`のキーに対応する値を除外したハッシュを取得しています。
Python　初級者向けに__init__.pyを超わかりやすく解説 

_init__pyはなかなか理解が難しいものです。難しくしているのは、"古いバージョンでは...."など多くのことを一度に理解しようとするからです。中級者になって古いバージョンのプログラムを見るときになってから、古いバージョンのことを覚えればいいのです。数多くの関数をパッケージにしたい、テスト開発で簡単にパッケージを作りたい、といった使い方は後になってから扱いましょう。
ここでは１つの使い方に絞って、 \_\_init\_\_.py を解きほぐしていきます。


ここに挙げるのはパッケージらしいパッケージの簡単な形です。

package1　
  |
  |-- \_\_init\_\_.py
  |-- module1.py
  |-- module2.py

```Python:module1.py

def hello():
    print( "Hello, world!" )
```

```Python:module2.py

def hi():
    print( "Hi, everybody!" )
```

```Python:\_\_init\_\_.py

from package1.module1 import hello 
from package1.module2 import hi 
```
:::note info
読み飛ばしていい話　パスが気になる人に向けて
  package1はパスが切られている前提で話をしています。
  例えば site-packages の下に置かれているとかを想定しています。
:::  
このパッケージを利用するにはカレントディレクトリから次のスクリプトを実行します。
```Python:main.py

import package1
package1.hello()

from package1 import  hi
hi()

#実行結果
#Hello, world!
#Hi, everybody!
```

パッケージの提供者は　パッケージ名 package1、関数名 hello、hi、 関数の機能を公開します。
パッケージの利用者は パッケージ名、　関数名、関数の機能を知るだけで利用でき、パッケージの内部構造を知りません。
パッケージに関数が追加され内部構造が変わっても、パッケージ利用者は従来の使用法を変えずに使用できます。内部構造が隠蔽されていると言えます。パッケージを公開しやすい仕組みになっています。
ここでは関数の提供になっていますが、パッケージは関数のみならす、クラス、定数なども提供できます。

利用者から見るとパッケージには、 パッケージ名、　関数名しかありません。つまり見えるのはこの形になります。
```Python:package1.py

def hello():
    print( "Hello, world!" )

def hi():
    print( "Hi, everybody!" )
 ```
パッケージは外からは仮想的な１つのモジュールに見えます。　package1ディレクトリがpackage1.pyモジュールに変わり、内部構造が隠蔽されている。これがパッケージです。

あるディレクトリをパッケージとして扱うには、それを仮想的に１つのモジュールに見せる仕組みが必要になります。
これを実現するのが__init__.pyの働きです。

ディレクトリはその配下にモジュールを持つ器にすぎず、中身(プログラムを置く場所)がありません。どこかにパッケージの初期化を行うプログラムを置く場所が必要です。そこで、\_\_init\_\_.pyが次の役割を持ちます。
・ディレクトリの下に__init__.pyがあるとき、このディレクトリをパッケージとします。
・パッケージにアクセスがあると、\_\_init\_\_.pyの中身を走らせて仮想的なモジュールを作ってから、アクセスを処理します。
　 \_\_init\_\_.pyの中身にあるimport文が実行されると、インポートされます、ロードされます、コピーされます、となって
　 import文は関数の定義文に置き換わります（importが関数の場合）
　 つまり上に書いた仮想的モジュールが完成します。その後にアクセスが仮想的モジュールで処理されます。

これをまとめると
1.	\_\_init\_\_.py は、パッケージのマーカーとなる。
2.	\_\_init\_\_.py は、パッケージの初期化を行う。
となります。

Web記事には名前空間を使って説明しているものもありますが、違いはありません。
次の3つは目線が違うだけで同じ内容です、
・モジュールに関数が定義されている　　-------------------- プログラムから見る
・モジュールオブジェクトが関数を属性として持っている　　-----　オブジェクトから見る
・モジュールの名前空間に関数名が定義されている　　----------　名前空間から見る

最後に動作環境についてですが、これはPython V3.3以上で、\_\_init\_\_.pyに明示的に 関数をimportする文を書いている場合になります。

まとめ
\_\_init\_\_.py がimport <関数名>　なら　外部から見えるのは　<パッケージ名>.<関数名> です。

では応用です
\_\_init\_\_.py がimport <モジュール名>　なら　外部から見えるのは　<パッケージ名>.<モジュール名>.<関数名>
となります。
\_\_init\_\_.py が空なら　外部からフルパスが見えます、というかフルパスを指定する必要があります。

注意点として、外部で書くimport文は以下の形式となります、フルパスを自由にカットして指定できるものではありません。
import <パッケージ名>
import <パッケージ名>.<モジュール名>
from <パッケージ名> import <モジュール名>
from <パッケージ名>.<モジュール名> import <関数名>
もちろん モジュール名が見えないときは"<モジュール名>"はありません。


以上枝葉を徹底的に切り取って__init__.pyの説明をしました。また動作環境が違えば違う動きになります。それは、ここを出た後にさまざまなパッケージや__init__.pyを見ながら修正を図ってください。
git = GitHubではないというお話

### 背景
お話しする中で、「git」と「GitHub」の違いを理解していないケースがよく見受けられるなという印象がありました。認識が双方違っているといけないので違いを書き留めておきます。

---
### gitとは？
**git**は、オープンソースの**分散型バージョン管理システム**です。下記のような特徴があります。
- **ソースコードのバージョン管理**が可能
- **ローカル環境で動作**
- 過去の変更履歴を追跡し、特定のバージョンに戻したり、変更を比較が可能
- チーム開発での作業を効率化するための**ブランチ機能**や**マージ**が利用可能

#### 例）gitを単体で使う場面
- 個人プロジェクトのコードをローカル環境で管理
- チーム開発での作業内容を整理するために履歴を残す場合

---

### GitHubとは？
**GitHub**は、gitのリポジトリをインターネット上でホスティングするサービスの一つです。下記のような特徴があります。
- **gitで管理されたプロジェクトをオンライン上に保存**が可能
- チームメンバーや他の開発者とコードを共有し、**コラボレーション**が可能
- **プルリクエスト**や**イシュー**など、プロジェクト管理を支援する機能が充実
- オープンソースプロジェクトの公開や参加が可能

#### 例）GitHubを使う場面
- 他の開発者と共同でプロジェクトを進行
- コードレビュー
- ソースコードを公開が可能

---

### 両者の違いを整理
| 項目        | git                      | GitHub                       |
|-------------------|--------------------------|------------------------------|
| 定義        | 分散型バージョン管理システム | gitリポジトリのホスティングサービス |
| 使用目的    | バージョン管理           | コラボレーション、共有、公開 |
| 主な機能    | コミット、ブランチ管理    | プルリクエスト、イシュー管理 |
| 動作場所    | ローカル環境              | クラウド環境                 |

---

### 誤解しやすいポイント
- **GitHub = gitではない**  
  GitHubはgitをベースにしたサービスであり、gitそのものではありません。
- 他にもGitHubのようなサービス（GitLab、Bitbucketなど）が存在する。  
  GitHubはその中でも代表的な選択肢という位置づけです。

---

### 結論
「git」はバージョン管理システム、「GitHub」はそれを補助するクラウドサービスという位置づけです。それぞれの役割を理解して適切に使い分けるが共通言語を持つということでも必要です。
【aws-ec2-ebs】 ルートデバイスのスナップショットを取るとき、インスタンスを停止すべきか

いつも迷うのですが、公式に

> Amazon EC2 インスタンスのルートデバイスとして機能するボリュームのスナップショットを作成する場合は、スナップショットを作成する前にインスタンスを停止することをお勧めします。

https://docs.aws.amazon.com/ja_jp/ebs/latest/userguide/ebs-creating-snapshot.html

とあるので、スナップショット取るときはおとなしくインスタンスを停止した方が良さそうです。

ただし、スナップショットを取得開始して、"保留中"(pending) ステータスになれば、インスタンスを起動してokです。

上記サイトに

> スナップショットの作成は非同期です。スナップショットはすぐに作成されますが、すべてのデータが Amazon S3 に転送されるまで pending 状態のままになります。これには、ボリュームで変更されたブロックの数に応じて、完了までに数時間かかることがあります。この間、スナップショットに影響を与えずにボリュームを引き続き使用できます。スナップショットには、スナップショットのリクエスト時にボリュームに書き込まれたデータのみが含まれます。

と書かれているとおり、スナップショットをリクエストしたタイミングのデータが保存され、その後の変更はスナップショットには記録されない、のでインスタンスは起動してかまわない、ということのようです。

以上

*ちなみに同じことを自分のサイトのブログにも書きました。こちらです→ https://0x0c.info/?p=380*
This app was built for an older version of android. It might not work properly and doesn't include the ..の解消法

## エラーというか警告本文
特定の端末で以下のメッセージが現れました。

![スクリーンショット 2025-01-21 23.27.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844247/9c25ddd4-f82f-4c05-1996-5e30774b0dbc.png)

一応、OKをすれば動作はすr、、、解消したい。

## 環境
- Android Studio Jellyfish | 2023.3.1 Patch 2
- Flutter 3.24.4


## この警告が出る原因
ndroid Gradle Plugin（AGP）バージョン7.0.0以上で`compileSdkVersion`などがdeprecatedになったため

https://developer.android.com/about/versions/13/setup-sdk?hl=JA

## 解消法
- android/app/build.gradle
```diff_groovy
android {
-    compileSdkVersion 31
-    defaultConfig {
-      targetSdkVersion 31
-   }
+   compileSdk = 31
+   defaultConfig {
+      targetSdk = 31
+   }
}
```
再度Buildをすると消えました！

## 参考
https://stackoverflow.com/questions/73517346/this-app-was-built-for-an-older-version-of-android-and-doesnt-include-the-lates

https://developer.android.com/about/versions/13/setup-sdk?hl=JA
WordPressのオリジナルテーマ内で利用される主要なファイル

## オリジナルテーマ(自作テーマ)とは

WordPressではほとんどの場合、テーマというものを利用してWebサイトを構築します。

- 元々WordPressに用意されているテーマ
- 課金したら利用できるテーマ
- 自分でカスタマイズできるテーマ

など様々です。

:::note info
テーマとは...
html,css,phpで既に作成されているWebサイトのテンプレートのようなもの
:::

## オリジナルテーマ内で利用される主要なファイルとその解説

### style.css

- テーマのスタイルシート
- 「テーマの名称・作者・バージョン」などのメタ情報も記述されている
- テーマで利用されるcssファイルはこれ1つのみのものが大半

### index.php

- WordPressテンプレート階層における最下層(フォールバック)のテンプレート
- 他のテンプレートが存在しない場合などは最終的にこのファイルが読み込まれる(大半はindex.phpを利用しない)
- しかし、すべてのテーマで必ず存在しなければならないファイル

### functions.php

- テーマ全体の機能を管理するファイル

### front-page.php

- ファイルが存在する限り一番優先されてトップページに表示されるファイル

[WordPress 公式サイトから引用](https://developer.wordpress.org/themes/basics/template-files/)

>**front-page.php (classic theme) or front-page.html (block theme)**
>
>The front page template is always used as the site front page if it exists, regardless of what settings on Admin > Settings > Reading.

### home.php

- 静的なフロントページを設定していない場合、このファイルは投稿の一覧ページを表示
- 最初からある「投稿」のアーカイブページで、初めはトップページに設定されてある
- このファイルがトップページに使われているサイトは、主にブログサイト

[WordPress 公式サイトから引用](https://developer.wordpress.org/themes/basics/template-files/)

>**home.php (classic theme) or home.html (block theme)**
>
>The home page template is the front page by default. If you do not set WordPress to use a static front page, this template is used to show latest posts.

### single.php

- 個別投稿(Single Post)を表示するテンプレート
- single-{post_type}.phpを作成することで、特定の投稿タイプ専用テンプレートが利用できる

### page.php

- 固定ページを表示するテンプレート
- 「会社概要」「問い合わせ」「利用規約」など

### archive.php

- アーカイブページ(カテゴリ一覧、タグ一覧、投稿タイプ一覧など)で利用されるテンプレート

### search.php

- 検索結果一覧ページを表示するテンプレート

### 404.php

- ページが見つからない場合に表示されるテンプレート
- よく見る「404 Not Found」と同じ

### sidebar.php

- サイドバーに表示するウィジェットやメニューなどをまとめるテンプレート

:::note info
ウィジェットとは...
サイトやブログを作成した際に、上部や横部分、下部などの位置に配置できるパーツ
:::

### header.php/footer.php

- ページ全体で共通するヘッダー部分やフッター部分のテンプレート

### comments.php

- 投稿や固定ページのコメント欄の表示をカスタマイズするファイル

## 備考

WordPressのテーマにおいて、`style.css`と`index.php`は最低限必要なファイルです。逆にいうと、この二つのファイルさえ存在すればテーマと呼ばれるようです。(まあ実際のところ`functions.php`など上記で紹介したファイルはすべて必須レベルでテーマには必要ですが)

## 注意(初学者向け)

PHPを普段利用されない方は、WordPress内のPHPファイル(index.php, front-page.php ...)を見ると、phpとあるので処理が実装されているのではないかと一瞬思ってしまうかもしれません。

しかし、PHPはHTMLを出力(生成)できるので、PHPファイル内でがっつりHTMLが書かれています。

つまり、フロントの役割を担うphpファイルも当然存在するので、PHPファイルを見たからといってバックエンド側の処理ファイルだと判断しないようにしましょう。
家の回線の帯域の状態を可視化したい！

# about

いい感じに家のNWの安定性とか可視化したくて、[speedtest.net](https://www.speedtest.net/)を利用したexporterを自作した。

# motivation

家の回線がなんか不安定な気がしたとき、スピテス走らせたりしがち。
でも、

- まいどまいど手動でスピテスしたくない
- grafana cloudを利用した監視環境がある
- 世の中にすでにいくつかそれっぽいexporterはあるが、issueみるとbugがそれなりにありそう
- goを勉強し始めたので自作してみたい
 
って感じのモチベがあったので雑にexporterを作った。

# output

作ったのがこのexporter。

https://github.com/miutaku/speedtest-exporter

こんな感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271301/b8fd28ff-54df-ce42-3417-ffcb4afbc934.png)

1. 家のPVE(Proxmox VE)でこのexporter専用のマシン用意
2. prometheusから2分おきにscrape

みたいな感じで計測。

```:prometheus.yml
  - job_name: 'speedtest_exporter_myhome'
    metrics_path: /metrics
    static_configs:
      - targets: ['192.168.0.122:8080']
```

# warn

測定したい環境にてこのexporterを動かすとスピテスできるけど、ISPとかに怒られない範囲で測定したほうがよい。
うちはenひかりのv6プラスだけど今のところ何もおこられていない(し、Xとか見るとJPNEな回線の人結構こういうことしてる人いる？)
AIを駆使してコーディングを学ぶ：３つのプロンプト

# はじめに
オンラインコースやプログラミングスクールはたくさんあるけど、どれも固定のカリキュラムでみんなと同じコースを受けることが多い。
けれども、何かを学習することに、「これさえやればOK」みたいな汎用的な方法はない。
どこでつまずくか、物事をどうやって理解するか、どれくらいかかるのかは人によって当然異なる。

そこで、AIを利用してみよう。
AIは人間と違い情報のリソースは原理的に無限で、インターネット上に転がる膨大な情報を精査・整理することに長けている。
だから、AIを用いれば、自分の関心をつたえるだけで自分専用のカリキュラムを作ることも不可能ではない。
人間のチューターと違って時間も場所も選ばずに質問できて、デバッグもしてくれる。

ただし、注意深く指示しないと、ただ質問に対して答えとなるコードを即座に送るだけになってしまう。それは学習とは言えない。

当記事では、生成AIを自分専用のチューターとして設定し、学習に役立てるためのプロンプトを紹介する。

なお、私はClaudeを愛用しているが、ChatGPTでも特に問題はない。

# 学習ロードマップ作成
### ・プロンプト例

> 私は【A】を学びたいと思っています。80対20の法則に従った包括的な学習プランを作成してください。【B】週間、各週ごとに特定のトピックを取り上げる構成にしてください。
> 【B】週間の核となる学習期間の後、【A】の知識を応用し、強化するのに役立つプロジェクトを（初心者から上級者へと徐々に難易度が上がっていくように）5つ提案してください。各プロジェクトについて、簡単な説明と知識の強化に役立つ主要な概念を挙げてください。
> 学習プランは、初心者でも理解できるような詳細なものでありながら、私自身が自主的に考え、問題解決に取り組めるようなものにしてください。

【A】には学びたいトピックを、【B】には数字（何週間で学びたいか）を入力。
【A】は「Java」や「Spring Boot」のような大きな主題よりも、「Javaでのファイル処理」「Springを用いた基本的なRESTful APIの開発」のように具体的であればあるほど、良いロードマップを提供してくれます。

※20対80の法則とは、プログラミングの文脈で簡単に言うと、「全コードの80％は、その言語の持つ機能・ツールのうちの20％によって書かれている」というもので、最初から全てを理解しようとせず、核となる概念から学びましょうと言う意味で使われる。

# 学習方法の学習
### ・プロンプト例
> 【言語】で【A】について学んでいます。
> 
> 1. 【A】について、それを用いる目的や、一般的にどのような場面で使用されるかなどを簡潔に説明してください。
> 
> 2. 【A】を示す簡単なコード例を提示してください。
> 
> 3. 【A】に関して初心者が陥りがちな3つの間違いや誤解と、それを避ける方法を教えてください。
> 
> 4. 【A】が特に役に立つような、実際のアプリケーション例やシナリオを2つ教えてください。
> 
> 5. 【A】の使い方を練習するのに役立つ、徐々に難易度が上がる３つの練習問題を出してください。その際、解答は提供しないでください。
> 
> これらの情報を提供した後、【A】について、その応用事例についてより深く考えるきっかけとなるような質問を私に投げかけてください。

【言語】にはそのまま学習中の言語を、【A】には「ロードマップ」と同じようにトピックを入力してください。
# プロジェクト作成
### ・プロンプト例
> 【A】を実際に駆使した【B】に取りかかろうとしています。【言語】に関する私の現在の技術レベルは[初級／中級／上級]です。
> 1. このプロジェクトの主要なコンポーネントや機能についての、ハイレベルな概要。
> 2. 私が作成する必要がある主なファイルやモジュールを含む、プロジェクトの構造。
> 3. このプロジェクトの進行中に遭遇する可能性のある3つの主要な課題と、それを克服するための戦略（具体的なコードによる解決策は送らないでください）。
> 4. 基本的な機能を完成させた後、より複雑なプロジェクトにするための2つの発展的な目標。
> 5. このプロジェクトでを通して強化される、【言語】の重要なコンセプトやスキルを3つ挙げてください。
> 答えをすぐに提示するのではなく、私の思考を導くような表現で答えてください。
> 私は、様々な機能の開発や実装の方法を、まずは自分で考えたいです。

【A】は「ロードマップ」や「学習方法の学習」でのトピックのような、ある程度具体的な方がいいでしょう。ただ、【A】はなくても大丈夫です。
【B】には実際に作ってみたいアプリ（や機能）を入れてください。
【言語】はそのまま、学習中の言語です。

ロードマップは、かなり大雑把なものが上がってくるので、それでは右も左も分からないという人のために、詳細なロードマップを作らせるプロンプトも考案中です。
こちらも洗練されてきたらどこかのタイミングで記事にしたいと思います。
ツールヒントの文字列がNULLの時の挙動について

はじめに
--
Tableauのツールヒントについて、
NULLの時どのようになるかまとまった情報がなかったため、確認しました。
※Tableauのバージョンは2023.3、データは[サンプル - スーパーストア]のデータを使用しています。

ツールヒントとは
--
グラフにカーソルを合わせた時に表示される、ポップアップのことです。
ツールヒントに必要な情報を表示することで、
グラフで表示している情報以外も表示し、参照することができます。

NULL時の挙動
--
確認したところ、NULLの場合はその行を飛ばして表示されました。
ただし、TableauDesktopでは行が表示されており、
TableauServerへアップロードしたものを確認すると
NULLの行が表示されない次第です。

ツールヒント設定
NULLフィールドの値がNULLになっています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3671775/614c0811-3397-b72f-17d8-a38d336c0367.png)


TableauDesktop
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3671775/f9ae634b-e609-a60b-88a2-7637d2bdb225.png)


TableauServer
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3671775/74f9a526-836f-d290-0799-a0b3707223c9.png)

NULLでも行が飛ばないようにする方法
--
ツールヒントの枠の表示でNULL行を飛ばして表示すると
画面差異が出て困る場合もあるので、行が飛ばない方法も記載します。
結論としては半角スペースや文字など、
何らかのNULLではない値が存在すれば行が一つ飛ばしにならないです。

下記例ではNULLフィールドの後ろに半角スペースを入力しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3671775/3e7642ff-6617-b80d-7328-34974e872e7c.png)

TableauServer
先ほどと異なり、空白の行が飛ばずに表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3671775/044fab5d-ea88-42a7-0232-8cb957039cc5.png)

半角スペースや文字を直接入力してもよいですし、
NULLではないフィールドを挿入する形でも行が飛ばなくなります。

逆に、NULLの時に行を飛ばして表示したい場合は
その行にNULLではない情報が含まれていないか確認して実装する必要があります。

終わりに
--
Tableauでの表示がうまくいかないケースの一つについて解消方法を記載しました。
今後もTableau含むBIツールの問題解決の一助となるような記事を作成していこうと思います。
離散数学(超入門) - 論理学 - 2

[前回](https://qiita.com/minyuqiaoben/items/100eb04c4f1801989770)に引き続き, 論理学について説明します.
今回は, 論理を演算によって処理するための基礎的な内容である, **論理演算**と**条件命題**を学習します.
これを論理演算というのですが, 論理演算ができれば難しい推論を機械的に行えるようになります.


# はじめに
前回は命題や推論, 演繹といった論理学の基礎的なことを学びました.
例えば, 推論の例として以下の3段論法を挙げました.

```
P Q それゆえ, R 
```

具体的な値を入れると次のようになりました

 - 前提: P すべての犬は哺乳類である.
 - 前提: Q ポチは犬である.
 - 結論: R ポチは哺乳類である.

```
すべての犬は哺乳類である.ポチは犬である. それゆえ, ポチは哺乳類である.
```

これはP, Qといった前提から, Rという結論を導きだす**推論**です.
**演繹**という言葉を用いると, RはP, Qから演繹的に導きだせるというふうにも考えられます.

3段論法程度であれば推論は比較的簡単ですが, 前提が増えたり論理が複雑になると, 頭で考えるには少し難しくなりそうです.

そのような場合には, **論理演算**が役に立ちます.
命題の真偽値を基に演算することで, 答えを導き出せるのです.

# 論理演算
命題に対する演算を論理演算といいます.
論理演算は *選言(or)*, *連言(and)*, *否定(not)* の３つが基本です.
命題は True と False の2つの値(真偽値)を基に演算されます. 
(本記事では, True = 1, False = 0 と表しています)

論理における演算とその値を表にしたものを**真理値表**といいます.
先ほどの3つの論理演算の真理値表を載せます.
pやqは命題を表し, p ∨ q などは演算の結果を表します.
普段からプログラミングに親しんでいる方であれば, 見慣れた演算結果だと思います.

### 論理和 (選言, or)
![スクリーンショット 2025-01-21 21.38.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670178/b0b9c325-cb4c-07f8-ee07-f0ce08f0fe0a.png)


### 論理積 (連言, and)
![スクリーンショット 2025-01-21 21.38.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670178/2a212432-2df0-b3d5-10a2-8fff1046b576.png)


### 論理否定 (否定, not)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670178/ee8db3d2-2127-93ec-308e-b3a3f30326bd.png)


# 条件命題

条件命題とは, 「もし 命題A ならば 命題B である」という形の**命題**を指します.
つまり, 条件命題自体も命題です.
例を以下に示します.

```
命題A：「雨が降る」
命題B：「道が濡れる」
条件命題：「もし雨が降れば, 道が濡れる.」
```

続いて, 条件命題の真理値表は以下のようになります. 


![スクリーンショット 2025-01-21 22.13.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670178/2f4a2e57-a03a-34e9-da1a-07007ee667fe.png)

ここで, 真理値表について, 上の条件命題の例を参考に考えてみます.

(再掲)
```
命題A：「雨が降る」
命題B：「道が濡れる」
条件命題：「もし雨が降れば, 道が濡れる.」
```


最初に, 真理値表の一番下の「pとqが真」の場合を考えてみます.
pが真なので「雨が降る」qも真なので「道が濡れる」. 条件命題は「もし 雨が降る　ならば　道が濡れる」となります. これは一般的な感覚としても問題なさそうです. 演算結果の方でも, もちろん真となります.
次に, 真理値表の上から3番目の「pが真で, qが偽」の場合を考えてみます.
pが真なので「雨が降る」qも真なので「道が濡れない」. 条件命題は「もし 雨が降る　ならば　道が濡れない」となります. これは少し違和感がありますね. 演算結果は偽となります.
下２つは納得のいく演算結果でした. では, 残りの上2つはどうでしょうか？
先に結論を言っておくと, 条件命題の演算結果は, pが偽の場合にはqの真偽に関わらず真とみなします. これは, 論理学のきまりのようなもので, ひとまずはこういうものなんだろうと覚えておくのがいいと思います. (僕も詳しいところは分かりません... 気になる方は論理学の公理などを調べると分かるかもしれません)
とはいえ, この演算の場合はこうなるという規則さえ知っていれば, 道具として使うことが出来ます.


# おわりに
前回は自然言語で論理学を解説しましたが, 今回はそれを真偽値（0と1の数値）で表現したり, 論理記号を用いて演算を行うなど, ややシステマティックで数学らしくなってきたのではないでしょうか. 
様々な概念を記号を用いて抽象化することは, その本質を明確にするのに役立ちます. さらにそれが演算可能であれば, 演算によって簡単に答えを導いたり, 場合によっては演算のショートカットが出来る可能性もあります.

例えば恋占いで, 花びらを1つずつちぎって, 意中の相手が自分を好きか嫌いかを言い当てるものがります(今考えると少し残酷ですが...)
幼いうちは花びらを１つずつちぎりながら, 好き, 嫌い と繰り返していきます. 大人になった今では, 恐らくもっと本質的で平和的なアプローチを取るはずです. (様々な方法がありそうですが, 読者の想像にお任せします)

このように記号化と演算を活用することで, 複雑な問題をより効率的に解決することができます.

次回は論理演算を用いて実際に推論を行なってみます.
頭で考えてもなかなか解けないものを, 論理学の力を使って簡単にとくことで, 改めて論理学の力を実感できると思います.
【InfluxDB-1.8】 autogenに無期限に溜まったデータを削除する

何も考えず InfluxDB の運用を始めてしまい、 `/var/lib/influxdb/data/xxx/autogen/` にがっつり昔のデータが溜まってきて、なんかディスクが一杯だし昼頃サーバに負荷がかかるなーとお悩みの諸兄

`ALTER RETENTION POLICY "autogen" ON "xxx" DURATION 800d`

で autogen の保存期限を無期限から800日に変更できます。 上記のクエリを発行してから1時間程度で、実際にディスクからデータも削除されて、すっきりです。

以上

*ちなみに同じことを自分のサイトのブログにも書きました。こちらです→ https://0x0c.info/?p=377*
template.ymlとsamconfig.tomlの役割の違い

社内システムの自動化を進めていく中で、SAMでインフラ構成のリソースを管理していてふと気になったので、備忘録的にざっくりまとめてみた。

SAMを触り始めたら、templateとsamconfigはセットでついてくるようなものなので、ここでちゃんと理解しておこうと思う。

# **template.yml**

- **目的**:
    - AWS CloudFormation を使用してリソース（Lambda 関数や API Gateway など）を定義し、インフラを構築するためのテンプレート
- **役割**:
    - リソース構成、環境変数、ポリシーなどを定義
    - `sam deploy` 実行時に必要なリソース定義を提供
- **内容例**:
    - **Lambdaのコード場所**（`CodeUri`）やハンドラー（`Handler`）
    - **環境変数**（`Environment`）や IAM ポリシー（`Policies`）
    - CloudFormation に渡すパラメータ

# **samconfig.toml**

- **目的**:
    - SAM CLI の動作をカスタマイズするための設定ファイル。
- **役割**:
    - 環境別の詳細設定（パラメータ名、デプロイ先のスタック、リージョンなど）を管理
    - `sam deploy` コマンドを簡便化するため、補足実行情報を保持
- **内容例**:
    - `stack_name`: デプロイ対象のスタック名
    - `parameter_overrides`: デプロイ時に渡すパラメータの上書き
    - `region`: AWS リージョン

# **主な違い**

| **項目** | **template.yml** | **samconfig.toml** |
| --- | --- | --- |
| **目的** | リソース全体を定義するテンプレートファイル | デプロイ時のカスタマイズ設定 |
| **役割** | リソース構築 | デプロイ設定 |
| **作成先** | CloudFormation スタック作成 | SAM CLI 設定 |
| **内容の要項** | インフラ全体の構成を詳細に定義 | 環境ごとの設定パラメータを管理 |
| **実行時の利用方法** | `sam deploy` 実行に必須 | `sam deploy` 時にオプションで活用 |

# **結論:**

- **template.yml**: ```インフラ全体の構成を定義する主要なテンプレートファイル``` 
- **samconfig.toml**: ```環境ごとのデプロイパラメータを管理し、sam deploy 実行時に利用する設定ファイル ```
Laravel プロジェクトを作成して編集準備までやってみる

## 事前にVSCodeがターミナルのコマンドを受け付けるようにPATHを通す必要あり

VSCode開いて

cmd + Shift + P で　コマンドパレット開いたら

```
Shell Command: Install 'code' command in PATH
```

これでPATHが通ってターミナルからVSCodeを起動できるようになる


## Project作成

```
composer create-project --prefer-dist laravel/laravel NewProjectName
```

## Mysqlにデータベースを作成

```
mysql -u {DB_USER} -p{DB_PASS} -e "CREATE DATABASE IF NOT EXISTS {DB_NAME} CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"

```

新しいプロジェクトの名前でディレクトリができる

## 作成されたディレクトリに入って、VScodeを開く

```
cd NewProjectName
code .
```

## VSCodeのターミナルを開く

Shift + control + ^

## .envファイルを生成
なかったらexampleから複製する

### 手順
1. 以下のコマンドを使用して `.env.example` を `.env` にコピーします。
   ```bash
   cp .env.example .env
   ```

2. 作成された `.env` ファイルを確認・編集します。
   必要に応じて、以下のようにデータベース設定やアプリ名を変更してください。

   ```env
   APP_NAME=LaravelApp
   APP_ENV=local
   APP_KEY=
   APP_DEBUG=true
   APP_URL=http://localhost

   APP_LOCALE=ja
   APP_FALLBACK_LOCALE=ja
   APP_FAKER_LOCALE=ja_JP

   DB_CONNECTION=mysql
   DB_HOST=127.0.0.1
   DB_PORT=3306
   DB_DATABASE=your_database_name
   DB_USERNAME=your_username
   DB_PASSWORD=your_password
   ```

3. `.env` の編集が完了したら、以下のコマンドでアプリケーションキーを生成します。
   ```bash
   php artisan key:generate
   ```

これにより、セキュアなアプリケーションキーが `.env` ファイルに自動的に設定されます。

## データベースに必要なテーブルを作成
Laravelでは、マイグレーションを利用してデータベースにテーブルを作成できます。

1. **マイグレーションを実行する**
   以下のコマンドを実行して、デフォルトで用意されているマイグレーションファイルをもとにテーブルを作成します。

   ```bash
   php artisan migrate
   ```

   このコマンドで、`users`、`password_resets`、`failed_jobs` などのテーブルが作成されます。

2. **カスタムテーブルの作成**
   必要に応じて、新しいマイグレーションファイルを作成してカスタムテーブルを定義できます。

   例: 新しい `posts` テーブルを作成するマイグレーションファイルを作成。
   ```bash
   php artisan make:migration create_posts_table
   ```

   作成されたマイグレーションファイル（`database/migrations`ディレクトリ内）を編集して、カラムを追加します。

   ```php
   public function up()
   {
       Schema::create('posts', function (Blueprint $table) {
           $table->id();
           $table->string('title');
           $table->text('content');
           $table->timestamps();
       });
   }
   ```

3. **カスタムマイグレーションの適用**
   再度、以下のコマンドを実行して新しいテーブルを作成します。
   ```bash
   php artisan migrate
   ```

これでデータベースに必要なテーブルが作成されます。