OmniAICreator/Qiita-1.07M huggingface dataset:
Firestore トリガーによるCloud Functionsの無限ループを抑える工夫

# 結論
Firestore トリガーによるCloud Functionsの無限ループを防ぐために、以下の管理フィールドを導入します。

```sql
prevent_trigger_at: timestamp
```

- **フィールドの役割:** ドキュメント更新時に、Cloud Functions内で現在時刻をこのフィールドに設定します
- **仕組み:** 次回トリガー発動時に、`prevent_trigger_at`の値が前回と異なるかを確認し、一致しない場合は処理をスキップします
- **ポイント:** このフィールドは**クライアントから更新せず**、サーバー側からのみ更新します

サーバー側（CloudFunction）からのみ、この項目を更新することにより、無限ループを抑止し、トリガー処理の安全性を向上させます。


# ここからは余談

みなさん、Firestore トリガーを使っていますか？便利すぎますよね。

私が1年以上関わっているモバイルアプリプロジェクトでは、FirestoreをメインDBとして採用しています。そして、Cloud Functionsを利用したバックエンド処理も多いため、Firestore トリガーは欠かせない存在です。

ところが、開発初期のスキーマ設計が不十分だったため、無限ループに悩まされる事態に陥りました。
コレクションに書き込みが発生すると、トリガー条件と同じコレクションを処理の中で更新して、それが再びトリガーを発動し、さらなる更新を引き起こす…という無限ループです。

初期対応として、トリガー内で「更新内容が前回と同じなら処理をスキップする」というロジックを導入しました。しかし、処理内容が増えるにつれ、スキップ条件が複雑化して破綻。結果、根本から解決する必要に迫られました。



そこでprevent_trigger_atという、トリガー実行を判断するフィールドを設けることにしたのです。

現在のスキップするコード（JavaScript）としては以下のようになっています。

```typescript
/**
 * Firestore トリガーのスキップロジック
 * - 新規作成時はスキップしない
 * - 削除イベントはスキップ
 * - prevent_trigger_atが更新されている場合はスキップ
 * - 古いイベント（一定時間経過）はスキップ
 */
private isSkip(event: FirestoreEvent<Change<DocumentSnapshot>>): boolean {
  const prev = event?.data?.before?.data?.(); // 前の状態
  const doc = event?.data?.after?.data?.();  // 現在の状態

  if (_.isNil(prev)) return false; // 新規作成イベント
  if (_.isNil(doc)) return true;  // 削除イベント

  // prevent_trigger_atが変更されている場合はスキップ
  if (prev.prevent_trigger_at?.toMillis() !== doc.prevent_trigger_at?.toMillis()) {
    return true;
  }

  /**
   * 古いイベントの破棄. サーキットブレーカー
   * https://cloud.google.com/functions/docs/samples/functions-tips-infinite-retries#functions_tips_infinite_retries-nodejs
   */
  const eventAge = Date.now() - Date.parse(event.time);
  const eventMaxAge = 10000; // 最大許容時間: 10秒
  if (eventAge > eventMaxAge) {
    logger.error(`Dropping event ${event} with age ${eventAge} ms.`);
    return true;
  }

  return false; // スキップ条件に該当しない場合は処理を実行
}
```

この処理がトリガーされた場合の共通処理として実行されるようにしてあり、これにより無限ループを止めることができています。
上記コードには、prevent_trigger_at以外にも共通のチェック項目はいれています。

それではよいFirestoreライフを。
Apple Silicon MacでHomebrewを使ったフレームワークのセットアップ

## はじめに
Apple Silicon（M1/M2チップなど）を搭載したMacでは、Homebrewでインストールしたライブラリやフレームワークのディレクトリ構成が少し異なります。本ガイドでは、OpenGLやSFMLなどのフレームワークをインストールした際に、`lib`や`include`ディレクトリの場所について説明します。

## ディレクトリの構成

### インストール後のディレクトリ場所
Homebrewを使用してライブラリをインストールすると、ファイルは以下のような場所に配置されます。

- **インストール元ディレクトリ**: `/opt/homebrew/Cellar`
  - このディレクトリの中に、インストールされた各ライブラリのディレクトリがあります
  
例えば、`sfml`をインストールした場合:
```bash
/opt/homebrew/Cellar/sfml/<バージョン番号>/
```

### 主なディレクトリ
- **ヘッダーファイル**(include)
    - `/opt/homebrew/Cellar/<ライブラリ名>/<バージョン番号/include/`
-  **ライブラリファイル**(lib)
    -  `/opt/homebrew/Celler/<ライブラリ名>/<バージョン名>/lib/`

## 実際の例

### 例: SFMLをインストールした場合

以下のコマンドでオーディオ、グラフィックス、ウィンドウなどのモジュールから構成されるC++のライブラリのsfmlをインストールします
```bash
brew install sfml
```
インストール後、ディレクトリ構成は以下のようになります
```plaintext
/opt/homebrew/Cellar/sfml/2.5.1/
├── include/
│   └── SFML/
├── lib/
│   ├── libsfml-graphics.dylib
│   ├── libsfml-window.dylib
│   └── libsfml-system.dylib
└── ...
```

## まとめ
Apple Silicon Macでは、Homebrewのインストール先が/opt/homebrewに固定されています。これを理解しておくことで、インクルードパスやライブラリパスの設定に迷うことが少なくなります。
「この書類はパスワードで保護されています。」解決方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3868342/e72225fa-a8ea-6cb0-1727-60cb6d40f01d.png)
# 経緯
会社から年末調整のPDFを記入し保存すると、以上のように無表示になった。
# 解決編
Adobe Acrobat Readerで編集する。

https://get.adobe.com/jp/reader/
[Webアプリ]初めてのWebアプリ開発

初めての投稿、初めてのWebアプリ開発をしました。是非！フィードバックをいただけるとありがたいです！

# アプリ名
服をECサイトで買う不安　その不安からあなたを**AI(アイ)**で**サポート**
**仮想試着-AI着(アイチャク)**
# 概要
「AI着」は、気になる服を仮想的に試着したり、2〜3着の服を試着して比較したりすることで、購入時の不安を解消することが可能でかゆいところに手が届くアプリです。
![スクリーンショット 2024-11-18 181933.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848466/cbd38525-0ba4-ab15-955b-4081c5343a13.png)
画像生成にはAPIを使用しており一日の生成数には制限があり今後の改善点の一つになります。

使用API : https://www.gradio.app/guides/getting-started-with-the-python-client

# URL
制作者のX(旧Twitter)
https://x.com/rioi7_0918


# なぜこのアプリを作成したのか
**個人的な意見**
世の中にあまり浸透していない目新しいものを開発してみたい！そのような思いで開発することにしました。

**アパレル業界のEC化**
このアプリ需要がかなりある！と感じたのもひとつの開発要因になります。
![スクリーンショット 2024-11-18 174812.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848466/5ecdc237-684e-993a-7e94-fb3e56f39626.png)


# アプリが解決できる問題点とは
**解決1: ECサイトでの購入ミス**
オンラインショッピングで衣服を購入する際、試着ができないために、想像していたイメージと異なる商品を購入してしまうことがあります。
→ 仮想試着機能を活用することで、実際の着用イメージを把握しやすくなります。

**解決2: 家族や友達に相談できない**
試着ができない場合、実際に着た姿を見せて家族や友達に相談することが難しいという課題があります。
→ 本WebアプリではSNS共有機能を搭載しており、仮想試着した姿を家族や友達と簡単に共有し、意見を求めることが可能です。

**解決3: 試着した服の比較が難しい**
複数の服を試着した際、それぞれの姿を比較することが困難です。
→ 過去に仮想試着した写真を保存・閲覧できるため、気になる服同士を並べて比較できます。

# 仮想試着の例
**使用画像は以下**

![zyosei1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848466/5b0dc466-33d4-70ba-caf4-a9d6cb6737d8.jpeg)
![bf8f14eef32dd0e8b9d8d9060f5af4106c85460903fd95b86f53157af0c0d27f.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848466/ff26ae42-85fc-6a64-b4cd-887ae3d7e18f.jpeg)

**結果画面**
![スクリーンショット 2024-11-25 103437.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848466/089abedf-d11c-af7b-03e4-8b2130924de6.png)

# 利用方法
~大まかな流れ~
①ECサイトにアクセス
②試着したい服の画面を表示
③スクリーンショットを撮影
④スクリーンショットをアップロード

※ 2024年11月25日現在、ローカルでのみ利用可能のため一般的に使用できません💦
(一般利用できるように頑張ります💦💦)

# 機能
・仮想試着
・いいね、ランキング
・SNS共有

# 技術スタック
Python,Flask,HTML,CSS,JS

# プレゼン資料
以下の資料は学内の二年個人開発発表で使用したものになります。

https://www.canva.com/design/DAGW0LzHRqk/4qW15Yc2nWr0-KgZf_NvmQ/view?utm_content=DAGW0LzHRqk&utm_campaign=designshare&utm_medium=link&utm_source=editor

# このアプリ制作者について

KIC 二年生(2024現在)でPython初学者です　このアプリの開発期間は3カ月と1週間かかりました。
一般公開でき次第、Qiitaに投稿したいと思います！
もし、改善点やこうしたらより良いとかありましたら、QiitaやX(旧Twitter)でDMを送ってくださると嬉しいです！
X : https://x.com/rioi7_0918

ここまで見ていただいてありがとうございます！
RedshiftとEMRの比較、一緒に使うユースケース

# 比較表
|特徴|Redshift|EMR|
|:-|:-|:-|
|主用途|データウェアハウス、SQLベースの分析|分散処理、非構造化データのトランスフォーメーション|
|目的|データウェアハウス（OLAP）|ビッグデータ処理、ETL、機械学習、リアルタイム分析|
|データタイプ|構造化データ|非構造化、半構造化、構造化データ|
|操作性|SQLに最適化|Hadoop/Sparkベースのカスタム処理|
|スケーラビリティ|自動スケーリングが簡単|クラスターのサイズや設定を手動で変更、スケールの最適化が必要|
|ストレージ|内部ストレージ（スナップショット）、S3との統合（Redshift Spectrum）|外部ストレージ（S3、EBS、HDFS）|
|ストレージタイプ|カラム型（列指向）、並列処理最適化|分散ファイルシステム（HDFS）/オブジェクトストレージ（S3）|
|リアルタイム性|限定的（主にバッチ処理）|高い、ストリーム処理が可能（Flink, Kafkaなど）|
|データの永続性|Redshift内で保存、S3に長期保存可能|S3が永続的なデータストレージ、HDFSは一時的|
|コスト|予測しやすい（定額、オンデマンド）|柔軟（スポットインスタンスやシャットダウンで低コスト化）|
|統合性|BIツールとの統合が容易（Tableau、QuickSightなど）|データパイプラインやカスタムアプリケーション向け|
|運用の複雑さ|低（フルマネージドサービス）|高（クラスター管理と設定が必要）|

# Redshift単体のユースケース
### データ分析（データウェアハウス）
大量の構造化データをクエリするBIツールやSQLベースの分析。

例: BIツール（Tableau、Amazon QuickSight、Power BI）と連携し、ビジネスインテリジェンスの基盤として使用。

### OLAP（オンライン分析処理）
ユーザー行動分析や売上データ分析など、クエリパフォーマンスが重要なOLAPに対応。

### ETL後の集計データの保存と活用
他のETLツール（Glueなど）で前処理を行い、クリーンなデータをRedshiftに保存して分析。

### レポート生成
頻繁なデータ変更や複雑な処理ではなく、比較的固定的なデータセット、、主に分析用のデータを管理。

例：セールスや財務レポートを生成するためのアドホッククエリ。

### インタラクティブなSQLクエリ
KinesisやKafkaを利用してリアルタイムデータをRedshiftに取り込んでクエリ。

# EMR単体のユースケース
### ビッグデータ処理
ログデータやクリックストリームデータの処理（HadoopやSparkを活用）。

例: S3に保存された大量の未加工データを処理してクレンジング。

### 機械学習のトレーニングと予測
Apache SparkのMLlibやHadoopを使ったデータサイエンスパイプラインの構築。

### カスタムデータ処理ジョブ
Python、Scalaなどでカスタムジョブを構築し、分散処理を効率化。

### 大規模なバッチ処理
データトランスフォーメーション（ETL）

複雑なデータの変換・統合を並列処理。

### 大規模データ処理
数百TBまたはPBスケールの非構造化データに対する分散処理。

### ストリーミングデータ処理
Apache FlinkやSpark Streamingを活用して、リアルタイムでデータを処理。

### カスタム処理や複雑なアルゴリズム
Redshiftでは対応が難しいカスタム分析や特定のデータ処理要件を実現。

### コスト最適化が必要なワークロード
スポットインスタンスを利用してコストを最小化しつつ、大量のデータ処理を効率化。

# RedshiftとEMRを一緒に使うユースケース
### ETL処理（EMR）+ 分析BI（Redshift）
S3に保存された生データをEMRでクレンジング・変換し、Redshiftにロードして分析。

例: WebログデータのETL処理（EMR）→ 広告効果分析（Redshift）。

### Redshift Spectrum + EMR
データパイプラインの構築。

EMRで分散処理を実施した後、クエリ可能な形式（Parquet、ORCなど）でS3に保存し、それをRedshift Spectrumで直接クエリ。

逆でもOK、S3のデータをRedshift Spectrumでクエリし、必要に応じてEMRで高度なデータ処理を実施。


### 複雑なモデルのトレーニングと分析
EMRで機械学習モデルをトレーニングした後、モデルの結果をRedshiftに保存して分析。

### 大規模データの初期処理、データレイク
非構造化データをEMRで集計・整形し、分析可能な形式にしてRedshiftに移動。
S3をデータレイクとし、ETLにEMRを、OLAP分析にRedshiftを使用。

# 参考サイト
https://qiita.com/pontarou194/items/224d44fe7c17f0c75e24

https://www.kuix.co.jp/da-sys/?p=1281

https://gihyo.jp/article/2023/05/aws-data-analytics-0005
材料力学の単位仮想荷重法を調べた。Gemini先生へ単位仮想荷重法は、発見者?の名前がついていないのはどうしてですか？

# Gemini先生へ
```
フックの法則、カスチリアノの定理など、発見者?の名前がついているのに、
単位仮想荷重法は、発見者?の名前がついていないのはどうしてですか？
```
回答省略

```
単位仮想荷重法を英語で
```
回答抜粋
学術論文や技術報告書: より厳密な表現である「Unit virtual work method」や「Method of virtual forces」が適しています。

```
単位仮想荷重法は何年頃発見されましたか?
フックの法則やカスチリアノの定理の年代順に並べてください。
```
回答抜粋
フックの法則: 17世紀後半、ロバート・フック...
カスチリアノの定理: 19世紀後半、カルロ・アルベルト・カスチリアノ...
```
17世紀後半、
19世紀後半、
その頃日本で、何がありましたか？
```
回答省略

# 私の年代調査結果(wikipediaより）
フックは1676年に...
1873年にカルロ・アルベルト・カスティリャーノによって確立された。

＞1676年　【武士】大岡越前忠相(1677年-1752年)
＞1873年　岩倉使節団（いわくらしせつだん）が帰国	

https://www.google.com/search?q=1676%E5%B9%B4+%E6%97%A5%E6%9C%AC&rlz=1CAUHAM_enJP1105&oq=1676%E5%B9%B4%E3%80%80&gs_lcrp=EgZjaHJvbWUqBwgCEAAYgAQyDAgAEEUYORiABBiiBDIHCAEQABiABDIHCAIQABiABDIHCAMQABiABDIGCAQQABgeMgYIBRAAGB4yBggGEAAYHjIGCAcQABgeMgYICBAAGB4yBggJEAAYHtIBCTIyNDU5ajBqN6gCCLACAQ&sourceid=chrome&ie=UTF-8

https://www.google.com/search?q=1873%E5%B9%B4+%E6%97%A5%E6%9C%AC&sca_esv=3943d349ad615713&rlz=1CAUHAM_enJP1105&sxsrf=ADLYWILFTMJ4XCQkOlB23uot3sLXFG_wGw%3A1732502426014&ei=muNDZ4c-k83V7w_89sLQCQ&ved=0ahUKEwiH87K9uvaJAxWTZvUHHXy7EJoQ4dUDCA8&uact=5&oq=1873%E5%B9%B4+%E6%97%A5%E6%9C%AC&gs_lp=Egxnd3Mtd2l6LXNlcnAiDjE4NzPlubQg5pel5pysMgUQABiABDIFEAAYgAQyBRAAGIAEMgQQABgeMgQQABgeMggQABiABBiiBDIIEAAYgAQYogQyBhAAGAUYHkieH1DsCVi5GHABeACQAQCYAXugAaAGqgEDMC43uAEDyAEA-AEB-AECmAIHoAL8BcICChAAGLADGNYEGEfCAgYQABgHGB7CAgoQIxiABBgnGIoFwgIKEAAYgAQYQxiKBcICCBAAGIAEGLEDwgIOEAAYgAQYsQMYgwEYigXCAgsQABiABBixAxiDAZgDAIgGAZAGCpIHAzEuNqAHiho&sclient=gws-wiz-serp

参考
＞ChatGPT先生へ フックの法則がなかったらどうなります
https://qiita.com/mrrclb48z/items/07fb862d22e6debb3b1d

# wikipediaで
Unit virtual work method OR Method of virtual forces

https://en.wikipedia.org/w/index.php?search=Unit+virtual+work+method+OR+Method+of+virtual+forces&title=Special%3ASearch&ns0=1&searchToken=3y04n37gs2ivxht4ngeo00oce

以下？かも

https://en.wikipedia.org/wiki/Unit_dummy_force_method

# Youtubeで
⑥ 単位仮想荷重法 例題 ＞　仮想仕事の原理の教育に関する研究会 様

https://youtu.be/_AOjl7GmYZ0
物理系におけるJuliaコードに関する参考備忘録

今まで投稿してきたJuliaに関する記事をまとめておきます。
（随時更新していきます）



# Plots

https://qiita.com/ryoi084/items/d2f96e4d29012b2ae080

https://qiita.com/ryoi084/items/d7946488b923cd0498a4

https://qiita.com/ryoi084/items/36fab0c6b43336b2ad8e

https://qiita.com/ryoi084/items/3821138301e813f947c5

https://qiita.com/ryoi084/items/1d71caa791fe7e42211f



# GPU

https://qiita.com/ryoi084/items/59f68375c2fb1b1fcd47

https://qiita.com/ryoi084/items/2aad3cbe12d72ee6c489

https://qiita.com/ryoi084/items/fdb567d3a17928af569c


# ITensors

https://qiita.com/ryoi084/items/fdb567d3a17928af569c

# パッケージ

https://qiita.com/ryoi084/items/0172ac4544b0180a8158

https://qiita.com/ryoi084/items/9963b64ca5a51a80a42c

https://qiita.com/ryoi084/items/549a5caf9b3968b2f2d4



# 物理

https://qiita.com/ryoi084/items/bcc7d5ea443b6480f27a

https://qiita.com/ryoi084/items/f27dd0ad2ef17976fb4e

https://qiita.com/ryoi084/items/e5a49ba47fe03674d67b

https://qiita.com/ryoi084/items/616cb764c975ebee68cc
インターネットの原理

>インターネット層におけるネットワーク層の詳細に触れていく。しかしその前に、過去のネットワーク層の設計の下となり、インターネットを今日の成功への導いたある原理について着目しておこう。近年この原理が忘れられることが多い。
...
ここでは、トップ１０の原理について議論し要約する

### 動作の保証
>プロトタイプを作成してお互いに通信できるようになるまで、設計や標準を最終決定しない。
...
欠陥が見つかってから、バージョン1.1の標準が作成されるのは好ましいことではない。

### 単純さの維持
>疑問を持ったとは、最も単純な解決方法を採用せよ。
...
主要点を比較せよという意味になる。もし一つの特徴が必須のものでないなら、とりわけ他の性質を組み合わせて同じ効果が得られるなら、その特徴を無視せよ

### 明確な選択
>もし同じことをするのに複数の方法があれば、そのうちの一つのみを選択せよ。同じ処理を行うのに複数の選択肢があるのはトラブルの元である。標準はよく複数のオプションやモード、パラメータがある。なぜなら、多くの関係者が自分の方法が一番良い選択であると主張してしまうためである。

### モジュール単位の開発
>この原理はプロトコル・スタックのアイデアに直接結びついている。　それぞれの層は他の層とすべて独立している。このように、`あるモジュールや層が変更されて環境が変化したとしても、他の部分には影響が起こらない`ようにすべきである。

### 異種性の容認
>ハードウェア、通信機器、アプリケーションの`違いは巨大なネットワークではよくある`ことである。
これらの違いに対処するために、`ネットワーク設計は単純で一般的に柔軟性`がなければならない。

### 静的なオプションやパラメータの回避
>（パケットの最大サイズのように）パラメータが必要な場合には、固定値を用いるのではなく、送信側と受信側で協議して値を設定できるようにしたほうがよい。

### （完全である必要はないが）良い設計を探せ
>設計者は良い設計をしても、奇妙な特殊ケースに対応できないことがよくある。設計者は、変わった要求に対して設計を台無しにするより、良い設計を採用し、変わった要求を行う人々の考えを変更させるようにしたほうがよい。

### 送信時の正確さと受信時の耐性
>言い換えると、`送信パケットは完全に標準に準拠すべき`であり、受信パケットは`規則に従っていない場合でも、それを受け取れるよう工夫すべき`である。

### スケーラビリティを考えよ
>`システムが多様のホストやユーザーを効率的に処理`しようとする場合、集中型のデータベースでは対処できないので、`負荷を利用可能なリソースに均一に分散`しなければならない

### 性能とコストを考慮せよ
>`ネットワークの性能が貧弱であったり、コストが非常に掛かってしまったりする場合は、誰もそのネットワークを利用しない`。
注目！ GitLabのマージリクエストと、GitHubのプルリクエストの違い (同じではありません)

GitLabのマージリクエストとGitHubのプルリクエストは、どちらもコードレビューやコラボレーションを目的とした機能で、リポジトリへの変更提案を管理しますが、それぞれにいくつかの違いがあります。

---

### **1. 基本的な概念の違い**
- **GitHub: プルリクエスト**
  - 「プルリクエスト」という名称は、変更を他のブランチやリポジトリに「プル（取り込む）」ことをリクエストするという考え方に基づいています。
  - 主に「変更のレビューとマージの依頼」という視点に重点を置いています。

- **GitLab: マージリクエスト**
  - GitLabでは「マージリクエスト」という名称を使い、目的は変更をターゲットブランチに「マージする」ためのプロセス全体を表します。
  - 名前からして、最終目標が「マージ」であることが明確にされています。

---

### **2. 機能の違い**
- **GitHub**
  - **レビューの柔軟性**: 外部サービス（例えば、CIツール）との連携が幅広い。
  - **ドラフトプルリクエスト**: 作業中の状態でレビューを求められる。
  - **テンプレートの利用**: プルリクエストの説明文に標準テンプレートを利用可能。
  - **レビューリクエスト**: 特定のレビュアーを簡単に指定して依頼。
  - **マージ戦略**: 複数のマージオプション（squashマージやリベースマージなど）を選択可能。

- **GitLab**
  - **統合されたパイプライン機能**: GitLabはCI/CD機能が内蔵されているため、マージリクエスト内でビルドやテスト結果を確認できる。
  - **承認ルール**: マージ前に指定されたユーザーの承認を必須とするルールを設定可能。
  - **WIP（Work In Progress）フラグ**: マージリクエストが完成していない場合、明示的に「作業中」とマークする機能。
  - **レビュー専用環境**: 「レビューアプリ」を簡単にデプロイしてプレビュー可能。
  - **ターゲットブランチの保護**: 厳密な承認プロセスを強制する機能が強力。

---

### **3. コラボレーションのスタイル**
- **GitHub**は、オープンソースコミュニティや広く分散したコラボレーションの場としての利用が主流で、世界中の貢献者が簡単にプルリクエストを送れるよう設計されています。

- **GitLab**は、主に企業内のエンタープライズ用途に最適化されており、チームでの効率的な開発フローやセキュリティ管理が重視されています。

---

### **4. ユーザー体験の違い**
- **GitHub**
  - シンプルで使いやすいインターフェース。
  - 他のツールとの連携が豊富。
- **GitLab**
  - ワンストップのプラットフォーム。
  - DevOpsサイクル全体を一元管理可能。

---

**結論として、どちらのツールも非常に強力ですが、GitHubはオープンソースのコラボレーション向き、GitLabは統合されたDevOps環境や企業内利用に適しているという特徴があります。**
AIモデルのFine-Tuningの概要

# AIモデルのFine-Tuning

## 用語
事前学習モデル：Pretrained model == Base model == Foundation model

## Fine-Tuningとは
Fine-Tuningとは事前学習させたAIモデルの重み（weight）を**サイズのより小さいデータセット**で再学習させるというとこです。

## 方法論
### データセットを変更する
- Instruction Fine Tuning
    - 知識の正誤を教える
- Domain-Specific Fine-Tuning
    - 特定分野の知識を学習させる
### 学習方法を変更する
- Full Fine-Tuning
    - すべての重みを更新する
    - コストが高い
- Parameter Efficient Fine-Tuning (PEFT)
    - 一部の重みのみを更新する
    - コスト削減できる
    - 例：LoRa
- Last Layer Fine-Tuning
    - 出力層のみを学習させる

## パラメータや重みを削減する
- Pruning
    - パラメータ削減
    - Train-Time Pruning
        - 学習時にモデルを自身のパラメータを削減させる
    - Post-Traning Pruning
        - 学習させたモデルの重みファイルを手動で編集する
SESの良し悪しについて見解をまとめる

Twitterで定期的に盛り上がるIT業界のSES賛否両論問題について、自身の私見をまとめます。

# 私自身について

1991年生まれの現在33歳。一応情報系の大学卒業してエンジニア歴10年。スマホAndroidメインでやってきました。

### 社歴
2014~2016:1社目。目黒駅が最寄り。某モーターの会社と同じ漢字だけ違う感じって会社名のSES企業。手取り15万は生活できなかったわー
2016~2018:2社目。1社目で飛ばされた流通センターで一緒になった別会社の方と仲良くなって転職。人間らしい生活を送れるようになった。働き方としては変わらず、単純にお金が増えた。2018~2022:3社目。渋谷の宮益坂の方。SESと受託半分の会社。転職エージェント使って転職。最初の1年は受託やりつつ、それ以降はSES。コロナ挟んで色々と働き方が変わって出社したりしなかったり。
2022~2024:4社目。同じく渋谷だけど駅直結のビル。フリーランス業務委託を経て正社員。ほぼほぼ受託のみでちょいSESやってる感じ。
今現在：また転職して神谷町。正直転職失敗した...


まとめると仕事してきた時間の半分SES、半分受託でやってきたと思っています。

現場歴は短くて3ヶ月~長くて2年くらいやりました。

# 結論
経験した身として、7:3で反対です。ただメリット/デメリットあると思うので書きます。

## メリット

### スキルアップになる

未経験でJavaやってたとはいえHelloWorldしか書いたことがない自分としては、スキルアップできる環境に身を置いて技術力が伸びたという点では良かったと思います。
強制的にランニングマシーン乗らされるイメージかな。そりゃ走らないとヤバいってなるんなら走るでしょ嫌でも。。

### 自社の政治イザコザに巻き込まれなくなる

派遣されると所属している自社内の政治があった経験があります。これSES企業の共通なのかな!?
1社目がひどかったな。。副社長の高齢女性が権力あったので、自社内華やかにするわ、土日にほぼ強制の勉強会開くわ、、自社の雰囲気もカオスだったと記憶しています。
そういうのとは関わらなくなり、自身の直近の課題にだけ向き合って集中できるという点では良かったかなと思います。

## デメリット

### 商流が深い

SES企業によりますが、営業力がないところだと4,5次受けで作業やったりします。
ってなると連絡事や情報共有が都度会社経由で来るので遅くなりがちです。
風邪で休むにしても、先方→先方→先方→先方って連絡してたりしました。
また情報が遅くなるせいで退職なり引き継ぎが雑になりがちです。

商流が深いと潜在的な意識として自身の **自己肯定感が低く** なるんですよね。これデカいです。
奴隷根性ってやつ!?何にしてもお伺いたてないといけないという感じが出てくるんですよね。

### 帰社を要求される

所属会社に所属している以上、一応は元々いる会社の社員な訳で、、月1は戻ってこいという文化がありました。
現場の業務しつつ帰社するのも身体的にしんどかったです。あと普段から関わりないのに何話せばいいんだって感じでした。業界的にアニメやゲームの話していたよな。自分もサブカル好きだし。。

### 契約周りがブラックボックスになりがち

これも会社によりますが
・自身がいくらの単価で契約されているのか
・プロジェクト全体の予算
・いつまで自分がアサインされるのか
などなどが営業通して聞かないといけないし、かつ直で聞くのはタブーになってます。
営業も教えてくれなかったり、先方に聞いてもわからんの一点張りだったり。。

# まとめ

自分の経験を踏まえての感想なので意見色々あると思います。
日本の労働環境、雇用形態を考えるとSES自体はなくならないんじゃないかと思います。
自身の自己肯定感が疎がれるんですよね。あくまで対等な関係なのに上下関係になりがち。

SESで参画する前に面談があるのも異常だし、案件ガチャになってること自体が異常。

やるにしても、未経験の方がスキルアップのためと割り切って、いつでも辞められる気概を持ちながら目の前のタスクに集中するのが良いんじゃないかなと思います。。
直角三角形を調べた。Gemini先生へ 直角三角形の隣辺、対辺を英語で。

??? 対辺の意味は複雑なようです。

# 参照 Qiita　 

https://qiita.com/mrrclb48z/items/ff4388ace062b63e98a8

# Gemini先生へ

```
直角三角形の隣辺、対辺を英語で。
```
回答抜粋
斜辺: hypotenuse
直角をはさむ2辺のうち、ある角に対して:
隣辺 (adjacent side): その角に隣接している辺
対辺 (opposite side): その角と向かい合っている辺

# 参照　wikipedia

https://en.wikipedia.org/wiki/Right_triangle

https://ja.wikipedia.org/wiki/%E7%9B%B4%E8%A7%92%E4%B8%89%E8%A7%92%E5%BD%A2

https://ja.wikipedia.org/wiki/直角三角形#三辺の長さが整数になる直角三角形

# 参考
以下idが、ちょっとずれています。2ページほど？下です。

??? 基準となる角
＞　・「**基準となる角度**と向かい合っている辺」を「対辺（読み方：たいへん）」
＞　・「直角と向かい合っている辺」を「斜辺（読み方：しゃへん）」
＞　・「**基準となる角**と直角を両端にもつ辺」を「隣辺（読み方：りんぺん）」

https://shingakunet.com/journal/exam/20201215000010/#i-4

# 大学入問題過去問
"隣辺" "直角三角形" で検索。

一致する結果はありません

https://cse.google.com/cse?cx=a8908fbc24340ebc5&q=%22%E9%9A%A3%E8%BE%BA%22+%22%E7%9B%B4%E8%A7%92%E4%B8%89%E8%A7%92%E5%BD%A2%22&oq=%22%E9%9A%A3%E8%BE%BA%22+%22%E7%9B%B4%E8%A7%92%E4%B8%89%E8%A7%92%E5%BD%A2%22&gs_l=partner-web.12..0i8i30.3562.18634.0.20809.44.28.0.0.0.9.148.2119.13j13.26.0.csems%2Cnrl%3D10...0....1.34.partner-web..39.5.253.AKzDpLR-Bqk

site://kamelink.com "隣辺" "直角三角形"との一致はありません。

site://mathmathmass.exblog.jp "隣辺" "直角三角形"との一致はありません。
lambda 

```
# メンションするユーザーリスト
mention_users = [
    {"name": "Li Hao", "id": "hao14.li.bp@jp.nttdata.com"},
    {"name": "John Doe", "id": "john.doe@example.com"},
    {"name": "Jane Smith", "id": "jane.smith@example.com"}
]

# 各ユーザーの<at>メンションテキストを生成
mention_texts = [f"<at>{user['name']}</at>" for user in mention_users]

# Teams用のメンションエンティティを作成
entities = [
    {
        "type": "mention",
        "text": f"<at>{user['name']}</at>",
        "mentioned": {
            "id": user["id"],
            "name": user["name"]
        }
    }
    for user in mention_users
]

# 最終的なAdaptive Cardを作成
card = {
    "type": "message",
    "attachments": [
        {
            "contentType": "application/vnd.microsoft.card.adaptive",
            "contentUrl": None,
            "content": {
                # Adaptive Cardのスキーマ
                "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
                "type": "AdaptiveCard",
                "version": "1.4",
                # Teamsメンションエンティティの定義
                "msteams": {
                    "entities": entities
                },
                "body": [
                    # タイトル部分
                    {
                        "type": "TextBlock",
                        "text": "🚨 アラーム通知",
                        "size": "Large",  # フォントサイズを大きく
                        "weight": "Bolder",  # 太字
                        "color": "Attention",  # 強調色
                        "wrap": True
                    },
                    # メンション部分
                    {
                        "type": "TextBlock",
                        "text": " ".join(mention_texts),  # 全ユーザーのメンションを1行で結合
                        "size": "Small",  # フォントサイズを小さく
                        "weight": "Lighter",  # 軽いスタイル
                        "color": "Default",
                        "wrap": True  # 自動改行を有効化
                    },
                    # 本文の説明部分
                    {
                        "type": "TextBlock",
                        "text": "以下のアラート詳細を確認してください:",
                        "size": "Default",
                        "wrap": True
                    }
                ]
            }
        }
    ]
}
```
make関数の使い方をまとめてみる[Go]

みなさん、Goのmake関数って使いこなせましたか?

考え方としてはデータ構造を作成するものなイメージはありますが、すぐ使ってみろと言われたら無理だなと感じ、理解が浅いなと思ったので、今回はmake関数について簡単にまとめようと思います。

# make関数とは

動的にデータ構造であるスライス、マップを作成することができるgoの組み込み関数のことです。


### スライス
配列とは少し異なった、入れることのできる要素数を可変長にしたものです。

Python等でいうリストに近いです。

:::note
#### 配列
特定のデータ型の要素を等間隔で並べて集めたもののことを言います。
配列は入れられる要素数を最初に決めて作成する必要があります。
:::

### マップ
連想配列と呼ばれるもので、キーに対してバリューを対応させて配列のように並べていくデータ構造のことです。
<br>

### 長さと容量
また、これらのデータ構造には長さと容量という概念が存在します。

#### 長さ
スライスにおける現在存在している要素の数のことです。

#### 容量
スライスの元となる配列の要素数のことです。

わかりづらいですが、配列はスライスからできているので、要素が追加してもまたメモリ空間を作らなくてもいいように、先に取っておいた空間のことと認識するとわかりやすいかなと思います。

# 実際にmake関数を作ってみる

### 配列

配列は、makeを使わない場合は下のように宣言します。
```go
var 変数名 [len]type
```

### スライス

スライスは下のように使用することが可能です。

```go
make([]type, len)
make([]type, len, cap)
```

入れる要素の型をstringとすると下のように作成します。
```go
nameSlice := make([]int, 0)
```

長さを指定すると表示はデータ型によって異なります。
```go
make([]int, 2) //[0,0]
make([]bool, 2) //[false,false]
make([]string,2) //["",""]
```

ここに初期容量3とすると下のようになります。
```go
nameSlice := make([]int, 0, 3)
```

### マップ

マップを作成するには下のような感じにコードを生成します。

```go
make(map[key_type]value_type)
make(map[key_type]value_type, cap_first_value)
```


マップは下のように作ります。
```go
nameList := make(map[int]string)
```

初期容量を100とすると下のようになります。
```go
nameList := make(map[int]string,100)
```

:::note
#### mapにおける要素があるかどうかの確認方法

mapを使って既に出たデータをキャッシュすることとかあると思うのですが、その際に使えるmapにキーがあるかどうか調べるときは下のコードを使います。

```go
if elem, ok := m[key] ; ok{
}else{
}
```

:::
生成AIパスポート試験の受験記

# はじめに
先日、第3回目の生成AIパスポート試験を受け、合格しましたので、試験の概要や自分なりの勉強方法などについて記事にしたいと思います。
これから試験を受けようと考えている人の参考になれば幸いです。
# 生成AIパスポート試験とは
https://guga.or.jp/generativeaiexam/

■試験概要
・名称	生成AIパスポート試験
・開催形式	オンライン（IBT方式）
・試験時間	60分間
・問題数	60問
・問題形式 四股択一式
・出題範囲	シラバスより出題
※シラバスが改訂されたため、2024年第3回目までの試験範囲と2025年第1回目以降の試験では試験出題範囲が変更となります。
詳しくは公式サイトの試験出題範囲をご確認ください。

https://guga.or.jp/outline/

 
・受験費用	11,000円(税込) ※学生は5,500円(税込)
・年間スケジュール（全３回）
・主催　一般社団法人生成AI活用普及協会(GUGA)
・受験資格なし

■申込期間	受験期間
・第1回	10月1日 0:00 〜1月31日 23:59	2月1日 0:00 〜2月29日 23:59
・第2回	2月1日 0:00 〜5月31日 23:59	6月1日 0:00 〜6月30日 23:59
・第3回	6月1日 0:00 〜9月30日 23:59	10月1日 0:00 〜10月31日 23:59
※2024年時点の情報になります。

# 受験のきっかけ
　生成AIについての試験があることを知り、生成AIについて勉強したいと考えていたこと、また生成AIについての理解度の証明に役立つと考えましたので、この度試験を受験をしました。

# 勉強方法
私の試験対策で使った教材は以下になります。
・生成AIパスポート公式テキスト
・生成AIパスポート AIクイズアプリ

試験対策として、まず公式テキストを一通り読みました。
最初は理解できない部分が多かったですが、理解できないキーワードはネットでも調べ、また、テキストを何度か読み返すことで内容を理解していきました。
またクイズアプリは手軽にできるものでしたので、隙間時間を使って勉強しました。
クイズアプリは第１章から５章まであり問題数もありますので、繰り返し問題を解き、間違えた箇所については、テキストを読み返したり、自分なりに書き出して整理することで知識を深めていきました。

# 勉強期間
試験の申し込みとテキスト購入からは３ヶ月程度期間がありましたので、テキストを少しづつ読んだりはしていましたが、集中して試験勉強を始めたのは試験の３週間前ぐらいからでした。
毎日クイズアプリをやり、休日によく間違える箇所や苦手の箇所について２～３時間勉強をしました。

# 試験結果について
合否の連絡はメールとマイページで確認できます。
自分はまず合否メールが来て、マイページにはその翌日ぐらいに結果が反映されました。
なお試験の合格ラインや自分の点数などについては開示されないようです。

# 試験の難易度
問題はすべて公式テキストを理解していれば解ける問題で、ひねった問題もなかったと思いますので、それほど難しい試験ではないかなと感じました。
60問60分なので、時間には少し注意が必要です。

# 試験を受けた感想
生成AIの基本的な知識を確認する試験としては丁度よい難易度の試験かなと思いました。
生成AIに関する知識は今後必ず必要になる知識だと思いますので、引き続き学んでいきたいとおもいます。
なお生成Aパスポートはシラバス改訂に伴い資格所有者の更新テストも開催されるということなので、知識のアップデートと証明には良いなと思いました。

https://guga.or.jp/outline/
formatter の便利な使い方

こんにちは、新人エンジニアの三上です。

本日は formatter の便利な使用方法を紹介します。

## formatter
以下のように formatter を使用すると1つの処理で
LocalDateTime から string 型への変換と、任意の文字列の付加を同時に行うことが出来ます。

```kotlin:formatter
    val tmpTime = LocalDateTime.now()
    val formatterTime = tmpTime.format(DateTimeFormatter.ofPattern("yyyy/M月対象"))
    println(formatterTime)
```

出力結果（※本日日付 2024/11/24）
> 2024/11月対象


## まとめ
今回紹介した実装を使用することで、簡潔で分かりやすく実装を記載することが出来ます。

以上、三上でした。
入力ボックスのスピナーの落とし穴

こんにちは、新人エンジニアの三上です。

今回は私が実際に実装を行った際に失敗した記録を残していきます。

## 入力ボックス
以下のタグを使用することで入力ボックスを作成することが出来ます。

```vuejs:input
    v-text-field(type="number")
```
上記のように、type に 「number」を指定することで
以下の入力ボックスのようにスピナーボタンが付加される。

![200907_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/99c5ff59-4d83-3022-547c-2e660693ed97.png)

この入力ボックスの入力値は操作方法によって型が異なる。
　・スピナー押下によって入力 → **int**
　・キーボードによって入力 → **string**


### まとめ
以上のように、型が1つに定まらないためバリデーションチェックを行う際などのように、入力値に対して桁数のチェックをする場合は注意が必要となります。
文字列に変換したうえで、桁数の判定を行うことで問題なく判定することができます。

以上、三上でした。
【Rails】production環境でサーバーが起動できない

## はじめに
Railsのアップデート中にproduction環境でサーバーを起動する時にエラーが出たので、その対応をまとめます。

## 問題
エラー文
```ruby
app/shared/bundle/ruby/3.2.0/gems/zeitwerk-2.6.14/lib/zeitwerk/loader/helpers.rb:139:in `const_get': uninitialized constant xxx (NameError)

    parent.const_get(cname, false)
          ^^^^^^^^^^
```
または、
```ruby
app/shared/bundle/ruby/3.2.0/gems/zeitwerk-2.6.14/lib/zeitwerk/loader/callbacks.rb:33:in `on_file_autoloaded': expected file /path/xxx.rb to define constant yyy, but didn't (Zeitwerk::NameError)

      raise Zeitwerk::NameError.new(msg, cref.last)
```

## 解決方法
Rails6からオートローディングが、Zeitwerkモードによって行われるようになったことが原因です。
解消方法は、エラー文からどのファイル、定数でエラーが出ているか確認し、ファイル名、定数名が正しいものになっているか確認します。

まずは、Railsのオートローディングについてです。
### オートローディング
クラスやモジュールを手動でrequireしなくても、必要なときに自動的に読み込んでくれる仕組み。
クラスやモジュールが必要になった時点で自動的にRailsがファイルを探してロードしてくれます。
#### 環境での違い
* development環境
  * 変更したファイルは再度ロードされ、最新の状態でアプリケーションが実行されます。
  * 必要になった時に、クラスやモジュールを読み込みます。
* production環境
  * 全てのクラスはアプリケーションの起動時にロードされ、一度ロードされたクラスは再読み込みされません。
  * 最新のコードを反映するには、サーバーの再起動が必要です。

次に、Rails5以前のオートローダーとRails6以降のオートローダーの違いです。
### オートローダー
#### Zeitwerkモード（Rails6以降）
* ファイル名から定数名を推測する（ファイル名：スネークケース、クラス名：パスカルケース）
  * app/models/user_content.rbにはUserContentクラスが定義されている必要がある
  * app/models/admin/user.rbにはAdmin::Userが定義されている必要がある
* コードの読み込みが安定、高速
* スレッドセーフ
#### Classicモード（Rails5以前）
* ファイル名と定数名が一致していなくても動く
  * app/models/user.rbにmyUserクラスが定義されていても大丈夫
* 複雑な名前空間を使用した際には、ファイルの配置や読み込み順序で問題が発生することがある
* スレッドセーフではない

これを元に、ファイル名とクラス名がZeitwerkモードのルールに則っているかを確認してください。
オートローディングのdevelopment環境とproduction環境の動作の違いから、development環境では、使用されるコードのみ読み込まれますが、production環境では使用の有無に関わらず、全てのファイルをサーバー起動時に読み込むので、production環境でのみエラーが出ることがあります。
また、Rails7.0まではZeitwerkモードのファイル読み込みの対象は、appディレクトリ配下のみでしたが、Rails7.1からはlibディレクトリ配下もファイル読み込みの対象となっています。

## 参考
https://railsguides.jp/autoloading_and_reloading_constants.html

https://railsguides.jp/classic_to_zeitwerk_howto.html

https://qiita.com/gobtktk/items/662d3b06a09e84c3cc49

https://tech.forstartups.com/entry/2021/06/11/194804

https://paulownia.hatenablog.com/entry/2023/11/04/184011
サーバーの起動コマンドをsystemdで管理する

# 概要
EC2で稼働する`Webサーバー`を構築しました。
構築〜起動手順をレビュー依頼をしたところ、エンジニアから以下の指摘を受けました。

**「起動処理を`systemd`で管理すると良いかも」**

確かに...！
`systemd` サービス定義を自作する経験がなかったため、備忘録も含め本記事を執筆することにしました。

## 前提知識
前提知識について触れておきます。

### systemd とは？
`Linux`の起動処理やシステム管理を行う仕組み。

`systemd`にプログラムを登録しておくことで、`Linux`起動時に自動で任意のプログラムを実行することができる。

#### 参考

https://qiita.com/bluesDD/items/eaf14408d635ffd55a18


### systemd でプログラムを管理するメリット
- WEBサーバーの起動など、`EC2`再起動時にも実行しておきたいプログラムなどを登録する
- `OOM Killer`（Out-Of-Memory Killer）によるプロセス停止時も再起動される

### OOM Killerとは？
Linuxのメモリ管理機構の一部であり、システムが利用可能なメモリを使い果たした際に、システム全体の安定性を維持するために自動的にプロセスを終了させる仕組み。

システムがメモリ不足（`Out of Memory`, `OOM`）状態に陥った際、どのプロセスを終了させるかを判断し、選定されたプロセスを強制終了する。

## [hands-on] WEBサーバーの起動をsystemdで管理する

WEBサーバーの起動は `Ruby` スクリプトで実行しています。
以下実行コマンドを `systemd` で管理していきたいと思います。
- `/usr/bin/ruby deploy_server.rb`

### 1. サービスファイルの作成
サービスファイルは`/etc/systemd/system`配下に作成します。

```bash
sudo vi /etc/systemd/system/deploy_server.service
```

### 2. サービスファイルの編集
**Unit**, **Service**, **Install** の定義を行います。
```ini
[Unit]
Description=Deploy Server Service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=ec2-user
WorkingDirectory=/home/ec2-user/
ExecStart=/usr/bin/ruby deploy_server.rb
Restart=on-failure

[Install]
WantedBy=multi-user.target
```

#### 解説
- `After=network-online.target`
    - ネットワーク接続確立後にコマンドを実行する
- `WorkingDirectory`
    - コマンドディレクトリ
- `ExecStart`
    - 実行スクリプト
- `Restart=on-failure`
    - プロセスが異常終了した場合、リスタートする

### 3. `systemd` のリロード

```bash
sudo systemctl daemon-reload
```

### 4. サービスの有効化

```bash
sudo systemctl enable deploy_server.service
```

### 5. サービスの起動

```bash
sudo systemctl start deploy_server.service
```

### 6. サービスの動作確認

```bash
sudo systemctl status deploy_server.service
```

## まとめ
サービスが起動されていることを確認してください。
pythonでファイル名に作成日を一括付与する

# 背景
趣味のイラストデータのファイル名管理のために、pythonを使用し一括で作成日時の付与を行う処理を作成してみました。

# 動作環境
Windows11
Python 3.12.7

# 実際の動作
↓renameフォルダ配下の「start.bat」から実際のコードが入っている「rename.py」を実行します（コマンドプロンプトからの実行も可能）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727407/df77de32-1d0c-d947-5afa-5f2bb46d0323.png)

↓renameフォルダ配下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727407/9293deaa-1d24-9c5e-9567-69c20a417d59.png)

↓実行後　フォルダ以外のファイルに「YYYY-MM-DD_」が付与されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727407/b50eb452-e5af-5549-432a-790b287232fe.png)

# コード全体
```diff_python:rename.py
import os
import time
import re

# フォルダのパスを指定
folder_path = r'../'

# フォルダ内のファイルを取得
for filename in os.listdir(folder_path):
    file_path = os.path.join(folder_path, filename)

    # # ファイルかどうかを確認
    if os.path.isfile(file_path) and not re.match(r'^\d{4}-\d{2}-\d{2}_', filename):
        
        creation_time = os.path.getmtime(file_path)

        # 作成日時をフォーマットしてファイル名に追加
        creation_time_str = time.strftime('%Y-%m-%d', time.localtime(creation_time))

        # 新しいファイル名を作成
        new_filename = f"{creation_time_str}_{filename}"
        new_file_path = os.path.join(folder_path, new_filename)

        # ファイル名を変更
        os.rename(file_path, new_file_path)
        print(f"Renamed: {filename} -> {new_filename}")

print("日付追加が完了しました")
input()
```
# コードの説明

```diff_python:rename.py
import os
import time
import re
```
まずはライブラリのインポート、今回は
・ファイル名書き換えのためのosモジュール
・時間変換のためのtimeモジュール
・正規表現使用のためのreモジュール
をインポートしていきます。

```diff_python:rename.py
# フォルダ内のファイルを取得
for filename in os.listdir(folder_path):
    file_path = os.path.join(folder_path, filename)

    # # ファイルかどうかを確認
    if os.path.isfile(file_path) and not re.match(r'^\d{4}-\d{2}-\d{2}_', filename):
```
該当フォルダからすべてのファイルを取得し処理を行っていきます。
今回フォルダは名前変更をしないので、スキップします。

また複数回起動したときに作成日が重複して付与されないように、既に「YYYY-MM-DD_」の作成日が付与されているかどうかを正規表現でチェックしています

```diff_python:rename.py
        creation_time = os.path.getmtime(file_path)

        # 作成日時をフォーマットしてファイル名に追加
        creation_time_str = time.strftime('%Y-%m-%d', time.localtime(creation_time))

```
「os.path.getmtime()」で作成日を取得し該当の形式にフォーマットしていきます

>ちなみに「os.path.getatime()」を使用すると更新日の取得が可能です。

```diff_python:rename.py
        # 新しいファイル名を作成
        new_filename = f"{creation_time_str}_{filename}"
        new_file_path = os.path.join(folder_path, new_filename)

        # ファイル名を変更
        os.rename(file_path, new_file_path)
        print(f"Renamed: {filename} -> {new_filename}")
```
フォーマットした日付とファイル名をくっつけて、ファイル名を作成し、osモジュールでリネームを行って1回の処理が完了します。


# まとめ
仕事でpythonを勉強する必要があるため、勉強のとっかかりとして作ってみました。

これから勉強のアウトプットのために記事の作成も出来ればと思います。
Get an Account

[Previous << Super Commands](https://qiita.com/flowcadence/items/7009b1f3b889e7923acc)
[Next >> Create an Account](https://qiita.com/flowcadence/items/4348fc03cefc88920920)

https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a#flow-cli-と-fcl


Flow CLIは、Flowネットワーク上のアドレスからアカウント情報を取得するコマンドを提供しています。
```ruby
flow accounts get <address>
```

<h1>Example Usage</h1>


```ruby
flow accounts get 0xf8d6e0586b0a20c7
```

<h3>Example response</h3>

```ruby
Address	 0xf8d6e0586b0a20c7
Balance	 99999999999.70000000
Keys	 1

Key 0	Public Key		 640a5a359bf3536d15192f18d872d57c98a96cb871b92b70cecb0739c2d5c37b4be12548d3526933c2cda9b0b9c69412f45ffb6b85b6840d8569d969fe84e5b7
	Weight			 1000
	Signature Algorithm	 ECDSA_P256
	Hash Algorithm		 SHA3_256
	Revoked 		 false
	Sequence Number 	 6
	Index 			 0

Contracts Deployed: 2
Contract: 'FlowServiceAccount'
Contract: 'FlowStorageFees'
```
<h1>Arguments</h1>

<h3>Address</h3>

* Name: `address`
* Valid Input: Flow account address

Flow [account address](https://qiita.com/flowcadence/items/83d778f84f462cb43318) (prefixed with `0x` or not).


<h1>Flags</h1>

<h3>Include Fields</h3>

* Flag: `--include`
* Valid inputs: `contracts`

結果の出力に含めるフィールドを指定します。テキスト形式の出力のみに適用されます。<h3>Host</h3>

* Flag: `--host`
* Valid inputs: an IP address or hostname.
* Default: `127.0.0.1:3569` (Flow Emulator)

コマンドの実行に使用する Access API のホスト名を指定します。このフラグは、`--network` フラグで定義されたホストをすべて上書きします。

<h3>Network Key</h3>

* Flag: `--network-key`
* Valid inputs: ホストの有効なネットワーク公開鍵の 16 進数文字列

コマンドを実行する際に、セキュアなGRPCクライアントを作成するために使用するAccess APIのネットワーク公開鍵を指定します。

<h3>Network</h3>

* Flag: `--network`
* Short Flag: `-n`
* Valid inputs: the name of a network defined in the configuration (`flow.json`)
* Default: `emulator`

どのネットワークに対してコマンドを実行するのかを指定します。

<h3>Filter</h3>

* Flag: `--filter`
* Short Flag: `-x`
* Valid inputs: a case-sensitive name of the result property.

結果から、唯一の値として取得したいプロパティの名前を指定します。

<h3>Output</h3>

* Flag: `--output`
* Short Flag: `-o`
* Valid inputs: `json`, `inline`

コマンド結果のフォーマットを指定します。

<h3>Save</h3>

* Flag: `--save`
* Short Flag: `-s`
* Valid inputs: a path in the current filesystem.

結果を保存したいファイル名を指定してください。

<h3>Log</h3>

* Flag: `--log`
* Short Flag: `-l`
* Valid inputs: `none`, `error`, `debug`
* Default: `info`

ログレベルを指定します。コマンド実行中に表示する出力を制御します。

<h3>Configuration</h3>

* Flag: `--config-path`
* Short Flag: `-f`
* Valid inputs: a path in the current filesystem.
* Default: `flow.json`

`flow.json` コンフィギュレーションファイルへのパスを指定します。`-f` フラグを複数回使用して複数のコンフィグレーションファイルをマージすることもできます。

<h3>Version Check</h3>

* Flag: `--skip-version-check`
* Default: `false`

低速な接続を避けて処理を高速化するために、起動時のバージョンチェックをスキップします。

*Last updated on **Nov 5, 2024** by Giovanni Sanchez*

翻訳元

https://developers.flow.com/tools/flow-cli/accounts/get-accounts

***



<b>Flow BlockchainのCadence version1.0ドキュメント (Get an Account)</b>



***
<b>[Previous << Super Commands](https://qiita.com/flowcadence/items/7009b1f3b889e7923acc)
</b>

[Flow blockchain / Cadence version1.0ドキュメント](https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a) (Get an Account)

<b>[Next >> Create an Account](https://qiita.com/flowcadence/items/4348fc03cefc88920920)</b>
TextInputコントロール　Defaultプロパティ　""と空白のトラップ

アプリを開発するときによく設定する
`Buttonコントロール`の`DisplayModeプロパティ`として
`TextInputコントロール`のTextが入力されていないときに
```
DisplayMode.Disabled
```
にする事があると思います。

適当にTextInputとButtonコントロールを設置すると以下の様になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/96fd5fe7-7115-9584-107b-bde980965ef9.png)

何も考えず`Defaultプロパティ`を全部消して
空白にして`Buttonコントロール`の`DisplayModeプロパティ`を以下の様にすると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/c38a8072-7985-7b25-2bcd-84967d1cdf47.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/f6a61e8f-c732-829b-f35f-aec55d8657ff.png)

```
If(TextInput.Text=Blank(),
    DisplayMode.Disabled,
    DisplayMode.Edit
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/f092173a-cde7-32f6-e4d8-077d2ca7f267.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/33417707-d22e-e771-e233-89582cdb891e.png)

この様に意図したとおりの動きになった様に見えます。

#### ところがどっこい←（これが言いたかっただけ）

この入力したTextを消してみると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/832f8fd7-e4e3-e807-a2d5-28dfbe025eec.png)

うげげ？`Buttonコントロール`の`DisplayModeプロパティ`が
```
DisplayMode.Disabled
```
にならない！！！！！

この原因はたまに陥る""と空白の違いで
一度TextInputのTextを変更してすべてのTextを消した場合
空白ではなく""として扱われるからです。

そのため、このような場合には`Defaultプロパティ`は""と記載して
ButtonコントロールのDisplayModeプロパティは
```
If(TextInput.Text="",
    DisplayMode.Disabled,
    DisplayMode.Edit
    )
```
と記載するとうまく動作します。
Rails: db:rollbackがエラーになったが、なんとかロールバックしたい。

# 環境
Docker Desktop 4.35.1 (173168)
Debian GNU/Linux 12 (bookworm) 
ruby 3.2.2 (2023-03-30 revision e51014f9c0) [x86_64-linux]
Rails 7.1.5
# 事象
今回は２つのテーブルのカラムを追加したり削除したりしてデータパッチするmigrationを実行後、rollbackしようとしたらエラーになった。
```
# rails db:rollback
== 20241124220824 XXXXXXXXXXXXXXXXXX: reverting ===========================
bin/rails aborted!
StandardError: An error has occurred, this and all later migrations canceled: (StandardError)
```
このマイグレーション（20241124220824）をなかったことにしたい。
# 対応
1. 手動でSQLを実行し、カラム追加・削除、データパッチを戻す。（ここは頑張る）
1. データベースのschema_migrationsテーブルから、`20241124220824`のレコードを削除する。
1. `db/schema.rb`のversionを１つ前のマイグレーションファイルに戻す。
   書き換え前：
   ```
   ActiveRecord::Schema[7.1].define(version: 2024_11_24_220824)
   ```
   書き換え後：
   ```
   ActiveRecord::Schema[7.1].define(version: 2024_11_24_004258) 
   ```
隠し機能】あなたはWindows神モードを信じますか？【Windows God Mode

## Windows10,11の隠し機能
Windows God Mode、日本語圏では"神モード"という愛称で親しまれているWin10,11の機能が存在するらしいですが、皆様はご存知ですか？
職場で真面目な顔して｢神モードで～｣とか言ってるの聞くとちょっとおもしろくなってしまうのは私だけでしょうか。
ネーミングセンス小学生か？



## 神になる方法
1.何の変哲もない新しいフォルダーを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835749/3c350f73-85f8-70f4-e3fa-7807ffb7aebc.png)
2.種も仕掛けもありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835749/3b449e87-5b1b-b210-acc0-b8e8421392fd.png)
3.フォルダー名をこれにします。（唐突）

    .{ED7BA470-8E54-465E-825C-99712043E01C}    

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835749/a2263b59-cd45-0aa6-dc47-4833a673d2b0.png)

4.え？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835749/9b24ee1e-8531-645a-6e57-25e248809ed4.png)

5.うわ怖　なんかいっぱい入ってる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835749/219a06fc-f646-5417-1604-3131321170f0.png)

なんのしてへんのにパソコンこわれた！！！


## 案外便利
上記のアイコンや内容から察した方は多いかと存じますが、そうです。
あなたは神になりました。
コントロールパネルの各機能に階層？というか導線？みたいなの無く一覧から直でアクセスできるようになっています。
え、すご、思ったより便利。神の御業。人によるとは思う。






## 誰がこんなふざけた名前にしたんだよ

機能については各々使って体感していただくとして名称のWindows God Modeってなんやねん、神モードってなんやねんとはなります。僕はなりました。

その秘密は"神になる方法"で出てきた文字の羅列
`ED7BA470-8E54-465E-825C-99712043E01C`に隠されています。神秘的ですよね。
これはクラス識別子 (CLSID)というもので、
>クラス識別子 (CLSID) は、プロパティ値へのプログラムによるアクセスを表示または提供できるクラスの識別子です。by Microsoft

よくわからないですがレジストリエディターでここ見てもらうと、すべてが明かされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835749/d9fb7538-c605-7ffb-ae36-0a1e30a94ba4.png)

いやデータ名『All Tasks』やないかい！！！


ここまで調べるとより一層｢God Mode｣ってなんやねん！！となってくる。
レジストリのAll Tasksを採用せず、なにゆえ神モードなのだろうか。第一発見者が小学生だったのだろうか。

さすがに気になったので調べたが英語版Wikipediaによると
Windows Master Control Panel shortcutというのがこの機能の名称のよう？
Microsoft公式による文章が見当たらなかったのでこれすら正式名称か怪しいが。。。

https://en.wikipedia.org/wiki/Windows_Master_Control_Panel_shortcut

Wikipediaでは、Windows Master Control Panel shortcutの他にAll Tasksのレジストリのこともやはり記載されていたが、それでも当然のようにWindows God Modeにも触れられている。
ふむ、Win7の頃の海外のブロガーが発信元なのか…？
初出がどこかは定かではないが、このブロガーが預言者ということなのだろう。
小学生のブロガーだったのか？


## あとがき
私が職場で笑いをこらえなければならないのはこのブロガーのせいだとわかってよかった
たださすがに小学生が付けたみたいなネーミングセンスはいかがなものか。。。

私ならこう呼ぶね
***全知全能-The World is Mine-***

皆様ならどんな名称を付けますか？ぜひここのコメントに遺憾なくそのネーミングセンスを披露して恥をさらしてくださいね。
それでは皆様も良き神モード生活を。


## あとがきのあとがき
何やらたくさんの方にいまだに読んでいただいてありがとうございます。
いいねもいただきまして、励みになります。

隠し機能シリーズ第2弾も書きましたので是非。
https://qiita.com/gunslinger/items/0a820ea61a3bd30436ac
【Suno AIでつくった楽曲】声でつながるAIとの対談: 挿入曲 #2【動画 3分42秒】【YouTubeチャンネルからの転記です】

この記事は、わたしの[YouTubeチャンネル](https://bit.ly/Yamanaka-YouTube "Living without things. 持たない生き方 手放す生き方")にある公開動画を転記しております。
( どこかのタイミングで、プログラミング-Google Apps Script or iPaaS-Zapier をつかって自動転記させる予定です )

転記のための時間コストを少なくしたいので、文字装飾( Markdown記法 )を極力つかわずに書いております。

こちらが動画内容です👇

***

![01 YouTube再生中の画像 Suno AI _ 声でつながるAIとの対談_ 挿入曲 #2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386308/0f14388b-ae83-fee0-6f09-9618d6e4a722.png)




* # 動画URL
    * https://youtu.be/tIBDjyZzAoM

<br>

* # 動画タイトル
    * 【Suno AIでつくった楽曲】声でつながるAIとの対談: 挿入曲 #2【動画 3分42秒】

<br>

* # 動画の説明欄(一部を抜粋)

📅撮影日 = 2024-11-24(日)

Suno AIとは、文章から音楽を生成することができるAI( Text-to-Music-AI )です。
わたしは、2024-04-02(火)に初めてSuno AIで有償プランを契約してから、時々楽曲をつくって遊んでいます。

🎦【Suno AI】文章から音楽を生成するAI( Text-to-Music-AI )で、3分間で2曲、6分間で4曲作りました【試聴可能】1)伴侶の曲 2)税理士の曲【動画 16分11秒】
https://youtu.be/QKfhk4HgQ_g

🎦“Suno AIでつくった楽曲”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghMLdiSVqwvSs_Z5y0H4VGOe

🎦“効果的にSuno AIを活用するヒント”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghPuaNOVZn-N53wVvsBkeHdI


今回は、Suno AIでつくった曲を WAV で出力してから、動画編集いたしました。

“声でつながるAIとの対談”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghOpTHU0rmfXSgjqV1_j6Eao
👆の挿入曲としてつかう予定です。

ぜひ聴いてみてください。
そして、ぜひみなさんも、ご自身の対談、番組、コンテンツのために楽曲をつくってみてください！

作曲日:
2024-11-20(水)

Suno AI 契約の種類:
Pro Plan

Suno AI Version:
v4

楽曲の正式名称:
声でつながるAIとの対談: 挿入曲 #2 - AI Voice Talks: Minimal Melody #2

Suno AI Library URL:
https://bit.ly/AI-Voice-Talks-Minimal-Melody-02

Custom Mode: On

Audio Inputs: Not Used

Instrumental:


---


Suno AIへの指示文章( プロンプト/Prompt ): Custom Modeの場合は”Style of Music”を指定します。


🇬🇧English

[Jazz][Piano][Bass][Ballad][220 Seconds][Break][Outro]


🇯🇵日本語訳

[ジャズ][ピアノ][ベース][バラード][220秒][ブレイク][アウトロ]


---


Suno AI 公式URL
https://accounts.suno.ai


---


✓ 🎥この動画と関連が強いわたしの動画 ↙
　・“Suno AIでつくった楽曲”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMLdiSVqwvSs_Z5y0H4VGOe


　・“効果的にSuno AIを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPuaNOVZn-N53wVvsBkeHdI


　・“声でつながるAIとの対談”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghOpTHU0rmfXSgjqV1_j6Eao


✓ 🎥Shortened URL for this video | この動画の短縮URL ↙
　https://bit.ly/3ZlZf9A
S3に保存した画像データがWordpressで表示できなかった件


タイトル通りですが、AWSでWordpressの環境を構築した際、S3に画像データ保存を行った時に私がハマってしまった内容を載せようかと思います。
殆ど自身のための備忘録です。

## 構成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3902743/5f4bc1c5-70b9-0a78-6009-19b194f02b18.png)

作りたかった構成はこんな感じ。
Wordpressで投稿した画像をS3に保存する。今回は一旦CloudFrontは使わない構成で設定しました。
（本来は使う予定でしたがS3に保存した画像が上手く表示されなかったので予定変更）

行った手順としては他のサイトで紹介されているのと同じです。私はUdemyの動画で学習した内容を実践しているような感じ。内容は似たようなものでした。
手順通り進めたはずですが発生したトラブルはこんな感じ↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3902743/739f2a5d-7172-c41f-7484-2d511c3aa1a5.png)

画像が上手く表示されてない(^^;;
S3の方を確認すると上手く保存されてるよな〜とかで余計分からなくなった。（ちなみにWordpressからの削除も問題なく行えます。）
WordpressのEC2にはS3フルアクセス権限を付与したIAMロールを付けてるのに。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3902743/cf38c7df-88e9-1474-5033-4d96ec4d17c4.png)

ちゃんと説明の通り進めたのにな〜とかいろいろ考えながら原因探し。
ChatGPTやGeminiにも聞いたが「URLは合ってますか〜」とか返事ありましたがURLは合ってるし、ブロックパブリックアクセスもオフにしてます。

いろいろと原因を探していった結果、バケットポリシーに記述がないのが表示されない原因っぽいことが判明。
動画でも他のサイトでもバケットポリシーに一切触れてないので気付くのに遅れました🧐

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3902743/707433a9-a85f-dca8-e897-bc6f4da7f80b.png)

上手く表示されました🎉
紹介するならちゃんと紹介してとか若干恨みながらも諦めずに表示できたので結果オーライですね！

この構成ですが、バケットポリシーでアクセス元を全許可にしているのでURLをブラウザに入力すれば誰でも表示される状態。
バケットポリシーには特定のロールからのみなどの制限をつけるべきかもですね。
多分ですがCloudFrontと連携させるとCloudFrontからのみのアクセスに限定する（オリジンアクセスコントロール：OAC）のでバケットポリシーとかはこの段階でスルーされたのかも？
設定しても変更するからとかですかね🤨
サイトによってCloudFrontを設定した場合のブロックパブリックアクセスのON/OFFも違うので自身で試すのが一番ですね。

やっとできたので次はCloudFrontかELBで冗長構成にするかを検討中です。
jupyter をpowershellから始めるには？

# jupyter をpowershellから始めるには

いつもJuliaつかっていて、REPLから立ち上げてます。他の言語使うために立ち上げたいときはどうすればいいのか。わかりました。以下に手順を列挙します

## Jupyter のpip経由でのインストール

Python's pip使ってJupyterインストール. 

```powershell
pip install notebook
```

## インストレーションを検証

Jupyterがインストールできているか検証するには:

```powershell
jupyter --version
```

## Jupyter Notebookを開始

```powershell
jupyter notebook
```
React ChakraUIで、「ログインしました」や「ログインに失敗しました」などToastが表示できない


# はじめに
長時間はまったので記事にします。

# 問題
「ログインしました」や「ログインに失敗しました」など、一時的なメッセージを表示ができませんでした

# 解決方法

<details open><summary>/src/hooks/useAuth.ts</summary>

```/src/hooks/useAuth.ts
//toaster.create〜を仕込む


export const useAuth = () => {
    const navigate = useNavigate();
    const [loading, setLoading] = useState(false);

    const login = useCallback((id: string) => {
        setLoading(true);
        axios
            .get<User>(`https://jsonplaceholder.typicode.com/users/${id}`)
            .then((res) => {
                if (res.data) {
                    toaster.create({
                        description: "ログインしました",
                        type: "success",
                    });
                    navigate("/home");
                } else {
                    toaster.create({
                        description: "ユーザーが見つかりませんでした",
                        type: "error",
                    });
                }
            })
            .catch(() => {
                toaster.create({
                    description: "ログインに失敗しました",
                    type: "error",
                });
            })
            .finally(() => setLoading(false));
    }, [navigate]);

    return { login, loading,};
};
```
</details>

<details open><summary>src/App.tsx</summary>

```src/App.tsx
import { Toaster } from "@/components/ui/toaster"

const App = () => {
    return (
        <>
            <Provider>
                <Box>
                    {/* Toasterを設置 */}
                    <Toaster />
                    <RouterProvider router={Router} />
                </Box>
            </Provider>
        </>
    )
};

export default App;
```
</details>

`<Toaster />`と、
`toaster.create({
  title: "Toast Title",
  description: "Toast Description",
})`
を、同じファイル内で記述しなければならないと思い込んでしまっていました。

また、srcの中の、Login.tsxに<Toaster />を仕込んだところ、
「ログインに失敗しました」は出るものの、
「ログインしました」は出なくて困っていましたが、
navigate("/home")で移動してしまっているので出なくて当たり前でした。
(App.tsxに書かなければならない)


# おわりに
終わってみればそれほど難しくなかったですが、長時間かかってしまいました。
処理の流れを正確に理解する必要があると思いました。


# 参考
https://www.chakra-ui.com/docs/components/toast
Eclipse (MCUXpresso IDE)で既存のフォルダをビルド対象のフォルダに指定する

前にも一度調べたことがあったのに忘れてしまってた．なのでここに書いておく．  

Eclipse (MCUXpresso IDE)で既存のフォルダをビルド対象のフォルダに指定する方法を調べた．  
対象のフォルダを右クリックして，属性を変更するようなことはできず，プロジェクトのプロパティから変更する．  

![スクリーンショット 2024-11-25 6.11.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/234315fc-4284-8018-3785-bd55dd6a3cc4.png)
SQLパズルを学習する上で工夫したこと


## SQLを勉強しようと思った動機

きっかけとしては、実務でSQLを扱う機会があり理解不足を痛感したためです。
同時にSQLの有用性も認識し、習得するモチベーションも湧きました。
自分がSQLを習得したいと思った理由は以下の2点です。
- RDBMSを使うシステムなら必ずSQLは出てくるため。バックエンドの言語が何であれSQLは共通。
- 10年後も使えるスキルだと思うため。

## SQLパズルで勉強しようと思った理由

ミックさん著の本『達人に学ぶSQL徹底指南書』で参考書籍に挙がっていたためです。

自分のイメージとしては以下のような関係です。

- 『達人に学ぶSQL徹底指南書』 ← 教科書  
- 『SQLパズル』 ← 練習問題集  

## 学習の流れ

最初にSQLパズルを目にしたとき、難しいと感じました。そこで、なるべくスモールステップで学習できるよう心がけました。

### 1. SQLを動かせる環境を用意する

自分が作った環境は以下の通りです。

| 名前                | Version  | 説明                                  |
|---------------------|----------|---------------------------------------|
| Ubuntu             | 22.04    | OS                                   |
| PostgreSQL         | 14       | RDBMS                                |
| pgAdmin4           | 8.4      | ブラウザで動くPostgreSQLクライアントソフト |
| Docker             |          | コンテナ型仮想環境                     |
| GitHub CodeSpaces  |          | クラウドIDE                           |

GitHubのアカウントがあれば、どのPCでも動かせるようにGitHub CodeSpacesで構築しました。

### 2. 答えのSQLを写経する

1. で作った環境にSQLファイルを作り、脳死で写経しました。目的はSQLに慣れることです。

この時点でやったことは以下の通りです。

- SQLの写経とそのSQLファイルを保存する  
  （DDLはミックさんのサポートページから拝借したことが多かったです）
- エラーにならず結果が取得されることを確認する  

やらなかったことは以下の通りです。

- どんなデータを取得したいのか理解すること  
- SQLの意味を理解すること  
  （自己結合や`EXISTS`述語の意味もこの時点では理解していませんでした）  
- 難しい問題はスルー  
  例: パズル3「忙しい麻酔医」、パズル12「訴訟の進行状態」  
  （パズル3「忙しい麻酔医」は挫折しそうになりました。「これ70番目くらいに出る問題じゃないのか…」と思ったくらいです）

### 3. 入力と結果のレコードをまとめて具体的な処理を調べる

処理を理解しやすくするため、入力と結果の具体的なレコードの画像をまとめました。自分の場合は紙媒体のほうが理解しやすいので印刷しました。
下の画像はFigmaで入力と結果の具体的なレコードの画像を貼り付けた図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/ad4a1ebc-f8a6-e132-bd22-5b4a82c7d81a.png)

下の画像は印刷した紙
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/4fe634cc-48aa-e680-b0c4-1cda4bfe3c2a.png)


#### 作業内容
- 具体的なレコードを見て、取得したいデータを自分の言葉で文字化
- 『達人に学ぶSQL徹底指南書』で紹介されている問題から解く  
  例: 自己結合の「パズル4 入館証」、`HAVING`句の「パズル21 飛行機と飛行士」「パズル20 テスト結果」など
- 類題があれば、ページ数をメモ  
- 答えのSQLを分解し、処理を追って確認  
  例: `HAVING`句をコメントアウトして、`GROUP BY`のみの結果を確認する

#### やらなかったこと
- 実行計画について考えること  
  SQLの速度について考える余裕はありませんでした。いつか確認します！
- 別解を考えること  

### 4. 3の内容を清書してQiitaに投稿する

3で書いた内容を清書してQiitaに投稿しました。
投稿の目的は理解の定着度を上げるためです。

## 感想

割と満足しています。
SQLに対する苦手意識はなくなりました。  
自己結合、`HAVING`句、`CASE`式についてはだいぶ慣れたと思います。一方、外部結合やウィンドウ関数についてはまだ慣れていません。
今年中は勉強を続け、外部結合も使いこなせるようにしたいと思います。

## 参考

- 書籍  
  『SQLパズル 第2版』  
  『達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ』  
- 『SQLパズル 第2版』サポートページ  
  [https://mickindex.sakura.ne.jp/database/db_support_sqlpuzzle.html](https://mickindex.sakura.ne.jp/database/db_support_sqlpuzzle.html)  
- 自分のリポジトリ  
  [https://github.com/RYA234/SQL_Puzzle_Learning](https://github.com/RYA234/SQL_Puzzle_Learning)
EarTrumpet でマルチリモートミーティングを乗り切る

皆さん、リモート会議してますか？

複数のリモート会議に同時に参加してますか？

複数のリモート会議に参加しているとき、どうしても片方だけに集中したいこと、ありませんか？

それを叶えてくれるのが今回紹介する EarTrumpet です。

https://apps.microsoft.com/detail/9nblggh516xp?launch=true&mode=full&hl=ja-jp&gl=jp&ocid=bingwebsearch

このツールは、通常 PC 全体でしか設定できないボリューム制御をアプリケーション単位で行えるようにするものです。

![EarTrumpet](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31613/7de88939-53c6-f940-d546-3540251d07f2.png)

例えば Edge で Google Meet をしつつ、Zoom と Teams でもミーティングをしているという場合で Zoom に集中したい、といったケースでは、以下のように Edge と Teams のボリュームを下げることで Zoom に集中することができます。

![EarTrumpet](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31613/3bc1d9e9-92e4-a456-c0de-b3fd5167f3b8.png)

また、以下のようにオーディオの出力先単位でも音量を個別に設定可能なので、カナル型イヤホンと骨伝導イヤホンを装着して音量を調整、会議を聞き分ける、という変態行為も可能になります🥳

![EarTrumpet](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31613/fe16fd6a-a1a9-25e9-f3f9-5e501d4cfcfd.png)

Google Meet が被ってしまった場合は、Edge と Chrome を使い分ける、Teams のミーティングが被ってしまった場合もアプリとブラウザを使い分ける、などで対処可能です😎

お忙しい方は是非導入して運用してみてください😊