OmniAICreator/Qiita-1.07M huggingface dataset:
作ったゲームをSteamで公開するまでのフロー【事前調査】

# 用意するもの
- Steamアカウント
- 登録料（＄100）
- 銀行口座（報酬の受取用）
- 本人確認書類（マイナンバーカードでもOKらしい）
- 作ったゲーム
- 根気



# 1. Steamworksに登録
1. [パートナー登録ページ](https://partner.steamgames.com/)にアクセスしてSteamアカウントでサインイン
1. サイトのダッシュボードで「Steamworksに登録しようと思った理由は何ですか？」の項目の適当な「登録」ボタンを選んで登録
1. ガイドラインやら本人情報の登録やら署名やらのページに飛ぶので、案内に従って入力する
1. 登録料＄100を支払う （売り上げが$1000以上になると返還されるらしい？）
1. 本人確認の手続きの為に本人確認書類（写真？）を提出する
1. 承認されるまで待機


# 2. ゲームのアプリIDを取得
1. Steamworksのサイトで「新しいアプリケーションを作成」
1. ゲームの基本情報（タイトル、ジャンル等）を入力
1. アプリIDが発行される


# 3. ゲームをビルド
1. SteamPipe用にWindowsビルド（またはMac、Linux）を作成
1. Steamworks内の「ビルドとデポ」設定画面で「アプリ構成」「デポ」「インストールディレクトリ」を設定
1. SteamCMDを使ってビルドをアップロード
    ``` bash:bash
    steamcmd +login your_username +run_app_build build.vdf +quit
    ```
    ::: note info
    build.vdf はアップロード設定のファイル
    Steamworksでテンプレートが配布されている

### ▶デポ（Depot）とはなんぞや？ 
　Steamでは、ゲームの実行ファイル・アセット・DLL・データなどをまとめて「Depot（デポ）」という単位で管理する。
　要するにユーザーに提供するパッケージ。
　複数OS対応ゲームでは、OSごとにDepotを分けるのが基本らしい。
 
 - Depotの作成手順
   1. アプリ（App）を作成した後にDepotを作る
   1. Depotの設定ファイル（VDF）を作成（テンプレあり）
   1. SteamCMDでアップロード（上記）


# 4.ストアページの作成
### 必要なもの
- カプセル画像（小・中・大）
- スクリーンショット（JPEG推奨）
- ゲームの説明（英語必須、日本語も可）
- トレーラー（YouTubeにアップ後、URL指定）


# 5. ストアページとビルドの審査申請

ストアページの内容とゲームの動作の確認が行われる。
ここで苦戦する人が多いらしい。
### 審査に落ちたら？
→ 修正ポイントを教えてくれるので、直して再申請する。
　場合によってはこれを何度も繰り返すことがあるので、根気が必要。


# 6. リリース
審査が通ったら、ストアページが下書き→「Coming Soon（近日公開）」モードになる。
リリース日の2週間前にはこのモードに切り替える必要がある。
### 最終ステップ：
1. 公開日時を設定（JST可）
1. リリース当日に「公開ボタン」を押す


# 以上で公開までのフロー終了


# おわりに
### Steamworks SDK について
　ゲームの公開に一旦は必要無いが、
　Steamの機能（実績、クラウドセーブ、Steam Overlayなど）を使う場合は、SDKの組み込みが必要になる。
　これについてはまた今度調査する。
【ChatGPT】スタバでのドリンクの頼み方を教えてもらうPromptです。


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

　今回は、スタバでのドリンクの頼み方を教えてもらうPromptです。

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

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

　ChatGPTのような生成AIが
　　なぜ人間みたいに回答するのか
　　　それが、根本から分かる
　　　　優良な動画がありました。

　[LLMの仕組み（簡単バージョン）](https://youtu.be/y7NQiNER6r4?si=pW-ezXdXNiXaT2og)
***
　では、【本題】です。

　今回は、
　　スタバでのドリンクの頼み方を
　　　教えてもらうPromptです。

　最近、自宅近くに
　　スターバックス（以降、スタバ）が
　　　できました。

　でも、スタバでの頼み方が
　　オジサンとしてはムズくて、
　　　行こうという気になりません。

　それでも
　　気にはなります。
　　　一度くらいは
　　　　飛び込んでみたいものです。
***
　そこで
　　ChatGPT先生に
　　　ドリンクの頼み方を
　　　　教えてもらうことにしました。

　こちらがそのPromptです。
　　ご自分の好みに合わせて
　　　みてください。

　　ほかのお店やドリンクを
　　　変えてもイケると思います。

```Text:スタバでのドリンクの頼み方Prompt
日本のスタバのドリンクメニューの頼み方がわかりません。
普段は喫茶店のブレンドコーヒーを頼んでいるのですが。

必要ならばWeb検索してください。
文章は最後まで出して。
箇条書きも最後まで出して。
```

　今度、これでブレンドコーヒーを
　　頼んでみたいと思います。

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

　今回は、ここまで。
Amazon Q CLI だけでシューティングゲームを作成してみた


# Amazon Q CLI だけでシューティングゲームを作ってみた感想

## はじめに

先日、Amazon Q CLI のキャンペーンが開催されていたのをきっかけに、**Amazon Q CLI だけで簡単なシューティングゲーム** を作成してみました。

この記事では、実際に触ってみて感じた「よかった点」と「改善してほしい点」を中心にまとめています。  
作成手順そのものは、Amazon Q CLI に指示を出すだけで完結するため、今回は省略します。

ちなみに、完成したゲームは以下になります。

![amazon-q-cli-game.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317229/45e010a1-e2ad-4168-afa5-2a638a2a613f.gif)

---

## Amazon Q CLI のよかったところ

### ✅ 日本語対応がとてもスムーズ

まず驚いたのは、**日本語でそのまま指示ができる**という点です。  
曖昧な表現やカジュアルな言い回しでもしっかりと意図を汲み取ってくれ、自然な日本語で出力してくれる点はとてもありがたかったです。

英語に翻訳してから指示を出す手間がなく、作業スピードも格段に上がりました。

---

### ✅ コード生成後に「次のステップ」を提案してくれる

とりあえず動くものを作ろうと思い簡単なシューティングゲームを作成するところから始めたのですが、実装後に**「次にこういう機能を追加してはどうか？」**といった提案があり、ちょうど追加しようとしていた機能を先回りで案内してくれる場面もありました。

非常にスムーズに開発を進められました。

---

### ✅ エラー検知から修正までを自動でやってくれる

初回起動時、ゲームにエラーが発生してクラッシュしたのですが、**エラーの検出 → 原因の特定 → 修正までを一連の流れで対応**してくれたのは驚きでした。

手元でデバッグしなくても、Amazon Q CLI がエラー内容を分析し、すぐに修正したコードを提案してくれたため、ストレスなく開発が進められました。

## Amazon Q CLI の改善してほしいところ

### ❌ ターミナルの補完機能がまだ不十分

Amazon Q CLI をインストールすると、ターミナルでコマンドの補完が有効になるのですが、**補完内容が的外れ**なことが多く、逆に邪魔に感じる場面がありました。

たとえば `git commit -m 'メッセージ'` と入力しようとした際に、過去のコミットメッセージを勝手に補完しようとしたり、全く関係ない候補が出てくることが多かったです。  
もう少し精度の高い補完や、学習済みの候補が出ると嬉しいです。

### ❌ コード生成に時間がかかる

これは生成する内容にもよると思いますが、**体感として 1 つの指示に対して、Qiita の記事を 1 本読むくらいの時間**がかかることもありました。

実際に手を動かしているわけではない分、もう少しテンポよくレスポンスが返ってくると、ストレスが減ると感じました。

## おわりに

今回は、`pygame` を使った**シューティングゲームの開発**に Amazon Q CLI を活用してみましたが、**思った以上に簡単にゲームが作れて驚きました**。

次回は、**AWS CDK**や**CloudFormation**を活用した IaC（Infrastructure as Code）の自動化など、**より実務寄りのユースケース**で試してみようと思っています。

Amazon Q CLI の今後のアップデートに期待したいと思います！
Gitlabのミラーリング機能を利用せずにGithubをミラーリング


# はじめに
Github上のOSSプロジェクトをベースに、とあるソフトウェアを開発する。
ソースコードの管理は、オンプレに構築するGitlab CEを利用する。

原則、Github上のOSSプロジェクトから、Gitlab側のソースのコピーは一回のみとするが、深刻な脆弱性が見つかった場合などは、その修正を取り込みたい。
しかし、Gitlab CEでは、プルミラーリングは利用できない。このため、Gitlabのミラーリング機能を使用せずに、Gitlab上でGithub上のリポジトリをミラーリングし、必要に応じて最新のソースコードをGitlab側の開発ブランチに取り込める手順を整理した。

■イメージ図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072158/b0f02cd6-3b46-438e-8d62-30c6c4670df6.png)



# 1. Gitlabで空のプロジェクトを作成
Gitlabにログインし、空のプロジェクトを作成する。

# 2. GitlabにGithubのリポジトリをミラーリング

github上のプロジェクトの情報をgitlabにすべてコピーする。
この時点でgitlab上のmainブランチでは、github上のプロジェクトのソースが参照可能となる。
またた、github上で行われたすべての変更履歴を確認することも可能。

```bash
Git clone --mirror https://github.com/oss_comunity/oss_project.git
cd oss_project.git
git push --mirror https://gitlab.on-premises.com/my-project.git
```

# 3. リモートリポジトリ登録

githubのプロジェクトをリモートリポジトリとして、githubという名前で登録する。
こうしておくことで、gitlabのプロジェクトのgitの作業ディレクトリから、githubのリポジトリが参照できるようになる。

```bash
cd ../
git clone https://gitlab.on-premises.com/my-project.git
cd my-project
# githubのプロジェクトをリモートリポジトリとしてついあk
git remote add github https://github.com/oss_comunity/oss_project.git
```

# 4. mirrorブランチを作成
リモートリポジトリ(github)のmainブランチをcheckoutし、それをgitlabにmirrorというブランチ名称で登録する。
このmirrorリポジトリは、github側のmainブランチを追跡するように設定しておくのがポイント

```bash
# GitHubから最新の変更を取得
git fetch github
# github側のmainブランチを追跡するmirrorブランチを作成
git checkout -b mirror github/main
# gitlab側にpush
git push -u origin mirror          
```

ここまでで基本的な設定は完了。

# 5. Githubの変更を定期的に取り込む
あとは以降の手順を必要に応じて実行することで、github上の最新の情報をオンプレのgitlabに反映することができる。

# 5.1 githubのmainブランチの最新情報をmirrorブランチに取り込み

githubのmainブランチから最新の情報を持ってきて、mirrorブランチにマージする。

```bash
# GitHubから最新の変更を取得
git fetch github 
# mirrorブランチに切り替え
git checkout mirror
git merge github/main --ff-only
# GitLabに変更をプッシュ
git push origin mirror
```

# 5.2 mirrorブランチをgitlab側のmasterブランチにマージ

最新のgithubの情報が反映されたmirrorブランチをgitlab側のmainにマージする

```bash
# mainブランチに切り替え
git checkout main
git merge mirror --no-ff
# GitLabに変更をプッシュ
git push origin main
```


\- 以上 -
SupabaseでGoogle認証/Googleログインを実装するための下準備

SupabaseとGoogle認証を実現するための下準備について備忘録も兼ねて紹介します。
具体的にはGoogleでクライアントIDとクライアントシークレットを取得してSupabaseに設定するための手順を記載します。また、「承認済みのリダイレクトURI」には何を入力するのかという点についても触れています。

## クライアントIDとクライアントシークレットの取得とSupabaseへの設定
Google Cloudのコンソール画面にアクセスし認証画面を選択します。
![スクリーンショット 2025-05-31 140908.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3439167/2f5d71cd-55e8-4342-866c-97bb73837c74.png)

以下のように黄色のウォーニングが出る場合は「同意画面を構成」をクリックして必要事項を入力して同意画面を作成します。

![スクリーンショット 2025-05-31 141124.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3439167/aa7fe09a-4ccc-4dc5-ad5f-0abe3d6059f9.png)

上記作業が完了したら「認証情報を作成」から「OAthクライアントID」を選択します。
![スクリーンショット 2025-05-31 141243.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3439167/d20ebd72-a6bb-4682-8a2e-cb67654d1a05.png)

アプリケーションの種類は「ウェブアプリケーション」、名前は任意の名前を入力します。
承認済みのJavaScript生成元には、アプリのURL、具体的には「http\://localhost:3000」と本番環境のURLである「https://・・・.vercel.app」を入力します。私の場合は本番環境としてはvercelを使用しました。

![スクリーンショット 2025-05-31 141331.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3439167/ce5ea33f-c108-4050-868c-d34de1b84d26.png)

### 承認済みのリダイレクトURI
 「承認済みのリダイレクトURI」はSupabaseのプロジェクトのdashboardを確認します。「Authentication」→「CONFIGURATION」の「Sign In / Providers」→「Auth Providers」のGoogleを選択します。

![スクリーンショット 2025-05-31 141345.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3439167/bc434084-4800-4118-bb1f-075c71f71bdf.png)

![スクリーンショット 2025-05-31 141353.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3439167/aaa58925-b2f0-44bd-967f-a9bb637e0e29.png)



そうすると、以下のように「Callback URL (for OAuth)」が表示されますのでこれをコピーして先ほどの「承認済みのリダイレクトURI」にペーストして、Google Cloudで認証情報の作成を完了します。

![スクリーンショット 2025-05-31 141404.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3439167/60b7027b-9393-4670-ae5e-e512dcd71cae.png)

### クライアントIDとクライアントシークレットの設定

作成後以下のようにクライアントIDとクライアントシークレットが表示れますのでこれを控えておきます。JSONをダウンロードしておいても良いかもしれません。


![スクリーンショット 2025-05-31 141426.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3439167/9f126d66-90b7-4ab2-bdfb-f4bbd00a03eb.png)


クライアントIDとクライアントシークレットをSupabaseの方にコピペします。

![スクリーンショット 2025-05-31 141459.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3439167/43de234b-944d-4693-8c27-9bd1b42ae278.png)

以上で「Save」をしてGoogle認証を実装するための下準備が完了です。


## 参考
https://supabase.com/docs/guides/auth/social-login/auth-google?queryGroups=platform&platform=web&queryGroups=environment&environment=server
【Rails】Rakeタスク

# はじめに
Rakeタスクの作成・実行方法についてまとめます。

# Rakeタスクとは
- 特定のタスクをコマンドラインで実行できる機能

# 作成方法
#### ファイルの作成
- `rails g task [名前空間] [タスク名]` を実行しファイルを作成する
```
$ rails g task namespace_name task_name
```
- lib/tasks配下に、[名前空間].rakeファイルが作成される
```lib/tasks/namespace_name.rake
namespace :namespace_name do
  desc "TODO"
  task task_name: :environment do
  end

end
```
#### タスクの定義
- 実行したい処理を定義する 
```lib/tasks/namespace_name.rake
namespace :namespace_name do
  desc "Hello, worldの出力"
  task task_name: :environment do
    puts "Hello, world!"　# 実行したい処理をコードブロック内に書く
  end
end
```
###### namesace 
- 省略可
- 名前空間を定義する事で、
タスクをグループ化できる
###### desc
- 省略可
- タスクの説明文を定義する
###### task
- タスク名と実行したい処理を定義する
- `:environment`を指定することで、Railsのクラスやモジュールを呼び出すことができるようになる 

#### 定義が出来たことを確認
- 名前空間名、タスク名、説明文を確認できる
```
$ rake -vT | grep namespace_name
rake namespace_name:task_name          # Hello, world!の出力
```

#### タスクを実行
- `rake [名前空間]:[タスク名]` でタスクを実行する
  - 名前空間を省略した場合は `rake [タスク名]` 
```
$ rake namespace_name:task_name
```
【初心者向け🔰】SwiftUIのTextの使い方：フォントサイズや太さの設定方法

SwiftUIでアプリを作る際、画面に文字を表示するにはTextビューを使います。この記事では、Textのフォントサイズやフォントの太さ（font weight）の設定方法を、初心者向けにわかりやすく解説します。

Textの基本の使い方
---
フォントサイズの変更
フォントサイズを変えるには、.font()を使います


フォントサイズの変更
---
フォントサイズを変えるには、.font()を使います。

```swift
Text("大きな文字")
    .font(.largeTitle)
```
例
![Screenshot 2025-05-31 at 15.16.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3977742/14b9b6e8-58dd-4ad8-a4ac-3e000f2719e6.png)

フォントサイズの様々なサイズ

| 設定             | 説明         |
| -------------- | ---------- |
| `.largeTitle`  | 一番大きな見出し文字 |
| `.title`       | 見出し        |
| `.title2`      | 少し小さめの見出し  |
| `.title3`      | さらに小さい見出し  |
| `.headline`    | 強調された小見出し  |
| `.subheadline` | 小さなサブ見出し   |
| `.body`        | 通常の本文      |
| `.callout`     | 補足的な内容     |
| `.footnote`    | 脚注などの小さい文字 |
| `.caption`     | さらに小さな文字   |
| `.caption2`    | 一番小さい文字    |


フォントの太さを変える（font weight）
---

```swift
Text("これはタイトル")
    .font(.title)

Text("これは本文")
    .font(.body)
```
例
![Screenshot 2025-05-31 at 15.18.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3977742/095c0b7e-c1b2-42a5-8ab8-0e68d43d1428.png)


 フォントの太さを変える（font weight）
 ---
 文字の太さを変えるには、.fontWeight()を使います。

 ```swift
Text("太い文字")
    .fontWeight(.bold)
 ```
様々なフォントの太さの種類
| 設定            | 見た目の太さ |
| ------------- | ------ |
| `.ultraLight` | とても細い  |
| `.thin`       | 細い     |
| `.light`      | やや細い   |
| `.regular`    | 標準     |
| `.medium`     | 少し太め   |
| `.semibold`   | やや太い   |
| `.bold`       | 太い     |
| `.heavy`      | さらに太い  |
| `.black`      | 一番太い   |

例

```swift
Text("普通の文字")
    .fontWeight(.regular)

Text("強調した文字")
    .fontWeight(.semibold)
```
![Screenshot 2025-05-31 at 15.23.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3977742/bfe5ae39-1a1f-4730-897b-f234e1c197da.png)


 フォントサイズと太さを両方設定する
 ---

 ```swift
 Text("大きくて太い文字")
.font(.title)
.fontWeight(.bold)
 ```
 例
 ![Screenshot 2025-05-31 at 15.24.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3977742/ca6d3fce-edfe-4fea-bca6-095d229963f3.png)

カスタムサイズを使いたいとき
---

もっと細かくサイズを調整したい！という場合は、.font(.system(size:))が便利です。

```swift
Text("カスタムサイズ")
    .font(.system(size: 24)) // 24ポイントの文字
```
```swift
Text("カスタムサイズで太い文字")
    .font(.system(size: 24, weight: .bold))
```
例
![Screenshot 2025-05-31 at 15.29.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3977742/9c016389-31ab-4e82-80a3-11d0cf5d4057.png)


まとめ
---

| やりたいこと      | コード例                                      |
| ----------- | ----------------------------------------- |
| フォントサイズを変える | `.font(.title)`                           |
| フォントの太さを変える | `.fontWeight(.semibold)`                  |
| サイズと太さをカスタム | `.font(.system(size: 20, weight: .bold))` |


おわりに
---
TextはSwiftUIの中でもよく使う要素なので、まずはこの基本をしっかり押さえておきましょう！
SwiftUIのTextの使い方：フォントサイズや太さの設定方法をまとめてみましたぜひ参考に！🙌
Ubuntu 24.04.2のWSL2環境構築メモ

# WSL2環境構築メモ(Ubuntu 24.04.2)

個人的な構築メモです

```bash
# Elixir
# Miseのインストールスクリプトを実行
curl https://mise.jdx.dev/install.sh | sh
# ~/.bashrc にMiseを追加
echo 'eval "$(~/.local/bin/mise activate bash)"' >> ~/.bashrc
# 現在のシェルに反映
source ~/.bashrc
# build toolのインストール
sudo apt update
sudo apt install -y build-essential autoconf libncurses5-dev libssl-dev \
libwxgtk3.2-dev libgl1-mesa-dev libglu1-mesa-dev libpng-dev \
libssh-dev unixodbc-dev xsltproc fop libxml2-utils openjdk-11-jdk
mise ls-remote erlang
sudo apt install libwxgtk3.2-dev libwxgtk-webview3.2-dev
mise install erlang@27.3.4
mise use -g erlang@27.3.4
mise install  elixir@1.18.4-otp-27
mise use -g  elixir@1.18.4-otp-27
# python
mise use -g python@3.13.3
# node.js
mise use -g node@24.1.0
# atcoder環境
mise install python@pypy3.10-7.3.12
mise alias set python atcoder pypy3.10-7.3.12
cd ~/atcoder-workspace 
mise use python@atcoder
pip install --upgrade pip
pip install atcoder-tools
pip install "markupsafe==2.0.1"
pip install sortedcontainers
pip install git+https://github.com/not522/ac-library-python
ln -s ~/atcoder-workspace/atcodertools.toml ~/.atcodertools.toml
# /home/masa/.local/share/atcoder-tools/cookie.txtをログインできる環境からコピーする
mise install python@3.11.0
mise alias set python atcoder-ex 3.11.0
cd ~/atcoder-workspace-ex
mise use python@atcoder-ex
pip install git+https://github.com/masahiro-999/atcoder-tools.git@elixir
# rust
mise install rust@1.87.0
mise use rust
```
【初心者向け】写真を Google Drive に格納してリンクを取得する方法

Google Drive を使えば、写真を簡単に他の人と共有することができます。このガイドでは、初心者向けに「写真を Google Drive にアップロードし、リンクを取得して他人と共有する方法」を手順ごとに解説します。

本記事では macOS + Google Chrome を前提にしていますが、Windows や他のブラウザでも操作はほぼ同じです。

## 前提

Google Drive を使うには Google アカウントでログインしている必要があります。事前にログインを済ませておいてください。
    
## ステップ 1：共有用フォルダ「share」を作成する【初回のみ】

まずは共有専用のフォルダを作成しましょう。

1. Google Drive（[https://drive.google.com](https://drive.google.com)）にアクセスします。
2. 左上の「新規」ボタンをクリックし、「フォルダ」を選択します。
3. フォルダ名に `share` と入力し、「作成」をクリックします。

![step03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105739/00586db5-a05a-4f20-9bf2-c3f7a4ac2470.png)
![step02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105739/8130e9cb-8b59-495a-b7e7-eae2495a3a14.png)

このフォルダは、他人と共有するためのフォルダです。名前は `share` に限らず、自分が管理しやすい名称でも構いません。

![step01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105739/18e3c52e-ea6b-4987-967e-e93707c6f6b9.png)


## ステップ 2：共有したい内容ごとにサブフォルダを作成する

「share」フォルダを開いた状態で、以下の操作を行ってください。

1. 「新規」→「新しいフォルダ」をクリックします。
2. 例として「20250531-写真共有」など、共有する写真の内容に合った名前を付けてフォルダを作成します。

このようにサブフォルダを作成しておくと、複数の写真共有を整理しやすくなります。

![step03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105739/00586db5-a05a-4f20-9bf2-c3f7a4ac2470.png)
![step02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105739/8130e9cb-8b59-495a-b7e7-eae2495a3a14.png)
![step04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105739/11a38dce-d4a2-46a5-a1a3-6976a9de858b.png)

## ステップ 3: 写真をアップロードする

作成したサブフォルダを開いた状態で以下を実行します。

- Finder（macOS）やエクスプローラー（Windows）から直接ドラッグ＆ドロップしてアップロードできます。

※アップロード後すぐには共有されません。次のステップで共有設定が必要です。

![step05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105739/73589d0d-311c-475f-a7f7-2c4ce2a278d1.png)

## ステップ 4: 共有設定を変更してリンクを取得する

アップロードした写真（またはフォルダ）を共有するには、以下の操作を行います。

1. サブフォルダ（または特定の写真ファイル）を右クリックし、「共有」を選択します。
2. 「一般的なアクセス」の欄で「制限付き」と表示されている場合、右側の「▼」をクリックして「リンクを知っている全員」に変更します。
3. 権限は「閲覧者」になっていることを確認してください（初期設定では閲覧者です）。
4. 「リンクをコピー」をクリックして、共有リンクを取得します。
5. 完了をクリックします。

このリンクを知っている人は、Google アカウントがなくても写真にアクセスできます。

![step06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105739/4a07d9b2-af4d-4942-b662-92d573d82369.png)
![step07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105739/a47ce4f6-fb16-4f24-bd65-d648bfbf2fcf.png)

## ステップ 5: 共有リンクを相手に伝える

コピーしたリンクを、メールやチャットツール（LINE、Slack など）で相手に送れば、写真を共有できます。
**注意:** このリンクを知っている人なら誰でもアクセス可能なので、SNSや不特定多数の場に不用意に貼らないようにしましょう。

## ステップ 6: 共有の解除や整理について

共有が不要になった場合、以下のいずれかの方法で対応可能です。

- **共有設定を「制限付き」に戻す**：これによりリンクを知っている他人からのアクセスが無効になります。
- **サブフォルダや写真を削除する**：不要になった共有用ファイルやフォルダを削除することで整理ができます。

## まとめ

Google Drive を使えば、写真の共有は簡単に行えます。今回ご紹介したように、

- 専用フォルダで整理する
- サブフォルダ単位で写真を格納する
- 共有設定でアクセス範囲をコントロールする

といった工夫をすることで、より安全かつ効率的に情報共有ができます。

Google Drive の共有機能は写真に限らず、PDFや動画、ドキュメントなどにも使える便利な機能です。ぜひ活用してみたいですね。
Djangoモデルに@propertyを使う理由と実装例

## はじめに
Djangoアプリを開発していると、「データベースには持たせないけど、テンプレートで表示したい情報」が出てくることがあります。
例えば、データベースの項目にある値同士での計算が必要なもの（進捗率や経過日数など）が挙げられます。

こうしたデータをビューやテンプレートでその都度計算すると、同じロジックをビューやテンプレートで何度も書くことになり、修正漏れや混乱を招きやすくなります。
そこで役に立つ仕組みとして、Python標準の`@property`デコレーターが便利です。

## `@property`とは
Pythonの組み込み機能で、「本来なら関数として呼び出すメソッドを、変数のように扱える」仕組みです。
つまり、モデル内に計算ロジックを持たせておくことで、ビューやテンプレートからは、普通のモデルの変数（属性）のように呼び出せるようになります。
Djangoのモデルで使うと、「計算結果フィールド」を定義できるため、表示やビューの可読性を高めることが可能です。

## モデルでの具体的な使い方
例えば、ToDoモデルで「進捗率」を計算する例を下記に示します。
```todos/models.py
@property
def progress_percent(self):
    actual = self.actual_value # 実績値
    target = self.target_value # 目標値
    # 実績値はNoneでないこと、目標値はNone及び0でないこと
    # 念のため例外をキャッチ
    if actual is not None and target is not None and target != 0:
        try:
            # 実績値／目標値で進捗率を出している
            return int((actual / target) * 100)
        except ZeroDivisionError:
            return 0
    return None
```

 ## テンプレートでの使い方
Djangoテンプレートでは、通常のフィールドのように使えます。
上記で設定した`progress_percent`がテンプレートで使えるようになります。

```todos/templates/todos/index.html
<p>進捗率: {{ todo.progress_percent }}%</p>
```

## どんな場面で有効か？
- モデルに直接DBカラムを作るほどではない、動的な計算結果を表示したいとき
- フロント側で計算するとコードが分散するため、「表示専用のロジックはモデル側に寄せたい」とき
- 例としては：
  - 進捗率・残日数などの算出
  - フォーマット済みの文字列化（例：苗字と名前を別カラムに入れている場合で、フルネームでテンプレートに表示させたいとき）

## 実務的なまとめ
- DBに格納する必要がある値→モデルフィールド
- 表示専用・計算結果→`@property`で定義する

## まとめ
Djangoモデルにおける`@property`は、「DBには無いが計算で得られる値」を整理しておく手段です。
これにより、開発中・運用中にロジックの所在が分かりやすくなり、将来的な改修時にも役立ちます。
LPIC101 受験記


## 初めに
こんにちは！
少し前ですが、LPIC101試験に合格したので合格までの勉強方法を記事にしたいと思います。
どなたかの参考になれば幸いです。

# LPI認定試験の概要 (LPIC101、LPIC102)
LPIC(Linux Professional Institute Certification)は、Linux技術者としてのスキルを証明する国際的な認定資格です。
レベル1は、Linuxの基本操作やシステム管理の知識を問う初級レベルの試験となっており、以下2つの試験に合格する必要があります。
・LPIC-101 : Linuxの基本コマンド、ファイルシステム、パッケージ管理など
・LPIC-102 : シェルスクリプト、ネットワーク設定、セキュリティ、ユーザー管理など


## 試験情報
試験数 : 101試験と102試験の2つ(どちらの合格も必要)
試験時間 : 各90分
出題数 : 各60分(65%前後で合格)
受験料 : 1科目あたり16,500円(税込)
有効期限 : 5年以内に両方合格する必要あり

## 試験結果
比較的余裕をもって合格できました。


## 学習時間
ほとんどLinuxを触る機会はなく、今回の試験勉強で始めて触れたに近い感じです。
なかなか休日に長時間勉強が苦手なので、勉強期間としては長めです
平日 : 2時間(ほとんど通勤時間のみ)
休日 : 3時間
日数 : 約2か月
試験への申込タイミング : あずき本を終えて、白本の1週目が終わったくらいのタイミングで申込みました。

## 試験対策
・Linux教科書 LPICレベル1 Version5.0 対応  (通称: あずき本)
・Linux教科書 LPICレベル1 スピードマスター問題集 Version5.0 対応  (通称: 白本)
・Ping-t

## 勉強の流れ
### 1. Linux教科書 LPICレベル1 Version5.0 対応  (通称: あずき本)
まずは最初は、あずき本の101試験範囲を読みました。全部理解するよりはこんな事やるのか程度です。
この段階でオプションまで覚えようとするとパンクしそうになります。(私はパンクしかけましたｗｗ)
mkdirコマンドでディレクトリをつくるんだなー程度です。
コマンドを実行できる環境があったら、打ちながら進めるのもありだと思います。

### 2. Linux教科書 LPICレベル1 スピードマスター問題集 Version5.0 対応  (通称: 白本)
あずき本の1週目が終わったら、白本を解きました。解答はノートに記載する形で進め、わからないところはすぐに解答を見て赤ペンでメモリました。
1週目は、解答はノートに記載する形で進め、わからないところはすぐに解答を見て赤ペンでメモリました。(ほとんど赤ペン状態でした。。)
2週目は、1週目のノートを確認して、同様にわからないところは都度赤ペンでメモリました。(1週目よりできてればOK)
3週目は、章ごとに解き、都度解答は見ずに章の最後まで解いてから、回答を確認しました。章を全部正解できるまで次の章にはいかないやり方をしました。

### 3.Ping-t
ほぼこれだけをやってても大丈夫なくらい試験範囲は網羅されてます。
この段階では、あずき本、白本と説いてきているので割と知識がありました。まず最強WEB問題集を解きました。
単元ごとに10問ずつ解いていき、10問全部正解できるまでやり、単元が全て解き終わったタイミングで、章全部の単元を対象に問題を解きました。
各章、上記のように勧め全て終わったら、コマ問をやりました。
Lpicの試験では何問かコマンドを記述したり、オプションを記述するような問題が出題されます。
コマ問はそれの対策のつもりで解きました。

後半は、ずっとping-tを解き、飽きたら気分転換に白本を解いてといった形で試験を迎えました。
ping-tで9割取れれば試験は安心だと思います。

## 試験当日
試験当日はめちゃめちゃ緊張しました。
なんせ一回の試験の値段が高い、、そしてテストセンターも初、、
時間には余裕をもっていきました。また、当日新しい問題を解くのはやめて、試験勉強で解いていた問題を直前まで見直していました。(白本の模擬演習を見てました)
新しい問題(サイト)を利用しなかった理由は、今更わからない問題が出ても、焦って自信がなくなるのを避けたかったからです。
試験が始まり、問題は、日本語訳がおかしいものもあり、初めは焦りましたが、ゆっくり説いているうちに試験勉強で解いていたような問題が多く安心しました。
悩む問題は、マークをつけれるのでマークをつけておいて最後にもう一度考えるのがいいと思います。時間が無くなることはほぼないと思いますので、どんどん解いてわからない問題は最後が一番いいと思います。

## 反省点
コマンドを検証できる環境があった方がより覚えるのが早かったかなと思います。
今は簡単に検証環境は準備できるかと思いますので、検証環境でコマンドを打ちつつ学習を進める方がより効率的かもしれません。

## 終わりに
私は、勉強が得意ではなく、心配性なので試験の受験までには時間がかかってしまいました。
1日の勉強時間、特に休日にもっと取れる方はこの勉強方法でももっと短時間で取得可能かと思います。
こんなやり方で合格したんだとここまで読んでいただいた方の勉強スタイルの参考になれば幸いです。
タスク処理手順について (例：Laravel 修正タスク)

## 1. 初めに
##### 簡単な自己紹介及び本記事の背景

現在、`` エンジニア実務未経験の地方消防士 ``として、約1年間プログラミングの学習を続けています。

消防の現場でも、作業の流れには必ず
「状況判断 → 情報収集 → 危険評価 → 対応策決定 → 実施」を繰り返すサイクルがあり、
エンジニアリング業務においても、タスク処理手順の明文化は非常に重要だと感じています。

本記事では、自身の経験をもとに整理した「タスク処理の8ステップ」と、その具体例（LaravelでのEnum化タスク）を紹介します。
## 2. タスクの処理(8step)
タスクを円滑に進めるために、以下の8ステップを意識して進めています。

##### ① 仕様確認
・Issueを読み、背景・目的・仕様を把握。
・ゴールはどこか？どの仕様を満たせば完了かを明確に。
・不明点は早めにPM等に確認し、認識ズレを防ぐ。

##### ② 変更箇所確認
・該当機能のコードを確認し、修正や追加が必要な箇所を洗い出す。

##### ③ 影響調査
・修正に伴い影響が出る機能を調査（デグレ防止）。
・他機能への影響を最小限に抑えるため、入口〜出口まで丁寧に追う。

##### ④ 実装処理内容確認
・実装の全体像を把握。
・必要な修正箇所を大まかにリストアップし、実装の流れを頭の中で組み立てる。

##### ⑤ 作業見積もり
・実装時間・PR作成・レビュー期間を含めて概算。
・イレギュラー対応も考慮し、見積もり × 1.5〜1.8倍が目安。
・PRレビューは2~3日間ほど？

##### ⑥ 実装開始
・自分が後で見てもわかるように、コメントやメモを残しながら実装。
・1週間後の自分に説明できるコードを目指す。

##### ⑦ テスト
・機能が正常に動作するか確認。
・成功ケースだけでなく、エラー時の挙動もしっかりテスト。

##### ⑧ 反省、課題

・今後のために、反省点と改善策をメモ。
・反省、課題なしに成長は無い。
・技術選定は適格だったか検討。
・技術選定・保守性・再利用性・チーム工数削減の視点で振り返る。
・次に同様のタスクがあったらどのようにこなすか。　等

## 3.実装例：LaravelのRuleクラスをEnumクラスへ修正
#### Ruleクラスを、Laravel9（PHP8.1以降）で利用可能なEnumクラスへ置き換えるという保守性向上のタスク。

##### ① 仕様確認
・Laravel9からEnumが正式サポートされたことを踏まえ、旧RuleクラスをEnumへ置き換え。
・目的：保守性・再利用性の向上。作業工数削減にも繋がる。
・ゴール：既存のRuleクラスの機能をEnumクラスへ移行し、影響範囲を含めて正常動作の確認。

##### ② 変更箇所確認
・Ruleクラス → 削除対象。
・Enumクラス → artisanコマンドで新規作成。
・Requestクラス → バリデーションでRuleを使用している箇所を修正。
・Model → $castsの記述と、Rule依存部分をEnumに対応。
・Migration → enum型を利用するように修正。

##### ③ 影響調査
・②で洗い出した各ファイルについて、処理の入口・出口を確認。
・他の機能との関連性をチェックして、影響がないかを確認。

##### ④　処理内容確認
・Ruleクラス：書き換えの後、削除(使用しないファイルは削除しないと以後のエラーにつながる)。
・Enumクラス作成：php artisan コマンドから作成、Ruleクラスのロジックを移行。
・Requestクラス：バリデーションで使用していたRuleをEnumへ修正。
・Model：$castsを記載、Ruleで使用していた削除箇所有。
・Migration：emum仕様へ修正。

##### ⑤ 作業見積もり
・実装：2日（本来1日で終わるが、イレギュラー対応を考慮）。
・PRレビュー：2日。
・PRレビュー：2日。
・合計：6日（他業務と並行して対応する場合を想定）。

##### ⑥ 実装開始
・④で確認した内容の通り
・前もって確認することで全体像が掴めるので作業効率アップ、抜け防止になる

##### ⑦ テスト
・本プロジェクトはpostmanを使用しテストを実施。
・正常・異常時のレスポンスを確認。

###### ⑧ 反省、課題
・【反省】ＰＲレビュー修正のまとめ（指摘受けたことは以後しないようにまとめる）
・【課題】Enumクラスについて、再利用性が高く、今後バリデーションを伴う実装時に採用しチームの工数削減を提案する
・【課題】今後、同様のタスクをしょりするメンバーのためにも修正箇所、影響箇所をドキュメント化しチームの作業工数を削減する。

## 4. まとめ
今回は、タスク処理を「8つのステップ」に分解し、実例としてLaravelの修正タスクを紹介しました。
自分はNotionで下記のようなテンプレートを用いて、タスク終了後に必ずその日の作業を振り返る時間を取るようにしています。
![スクリーンショット (53).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842139/9a2391b8-9842-4694-bd0b-0bf2d405051b.png)

この記事が、タスク管理や実装方針で悩んでいる誰かの参考になれば幸いです！
Geminiで人形を使う魔法少女を描いてみた。

# 概要

Geminiで人形を使う魔法少女を描いてみました。

# 実装

プロンプトと実行結果は以下の通りでした。

```
聖なる人形を使う魔法少女を描いてください。
```

![聖なる人形を使う魔法少女_20250531.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/ad730549-e0a4-4f4d-a902-6ed26b8c09ec.png)

# まとめ

可愛いかも。何かの役に立てばと。
Airflow × 生成AI でデータエンジニアリングを楽にする


## 1. はじめに

GCS から BigQuery へのデータ連携や Dataform でのテーブル加工は、データ基盤における重要な ETL 処理です。これらを Airflow で制御するケースは多いですが、最近では LLM（大規模言語モデル）などの生成AI を活用し、運用や監視、トラブル対応の効率化を図る動きが増えています。

ここでは、Airflow で構築された ETL パイプラインを AI で高度化・自動化するステップを解説します。

## 2. 既存の Airflow ワークフロー概要

例として、以下のような DAG 構成を想定します。

- **GCS から BQ へのロード**
- **Dataform によるテーブル加工**

Airflow では、DAG 内で以下のようなオペレーターを使用します。

- `GCSToBigQueryOperator`
- `BashOperator` や `PythonOperator` で Dataform CLI 実行

## 3. AI が担う役割とユースケース

✅ DAG 作成支援  

✅ コードレビュー・最適化  

✅ 障害対応の自動化  

✅ ドキュメント生成  


## 4. AI 組み込みの手順

### ステップ1: 対象 DAG の可視化
Airflow DAG ファイルを読み込み、依存関係をグラフ化します。これによりタスク間の関連性やボトルネックを視覚的に確認できます。
### ステップ2: 生成AI による解析・提案
DAG コードを生成AI に入力し、以下を依頼します:

- 不要な処理の削除提案

- エラーハンドリングの改善

- パフォーマンス最適化の提案


### ステップ3: 自動リファクタリング
AI が提案した内容に基づき、コードの可読性・保守性を向上させるリファクタリングを実施します。共通処理は関数化し、タスク設計の見直しも検討します。

### ステップ4: Dataform の運用補助
AI を活用し、Dataform の依存関係・スケジュール設定の最適化を支援します。AI でコードレビューを行い、エラーやパフォーマンス問題を早期に検知します。
### ステップ5: 本番適用とモニタリング
改善後の DAG を本番環境にデプロイし、Airflow のモニタリング機能で動作を確認します。さらに、AI による障害解析・一次対応フローも構築し、自動復旧の仕組みを検討します。
## 5. Airflow × 生成AI の活用例

以下は、Airflow で生成AI を活用する簡単な PythonOperator の例です。

```python
from airflow import DAG
from airflow.operators.python import PythonOperator
from datetime import datetime
from openai import OpenAI

client = OpenAI()

def analyze_failure(**context):
    error_log = context['ti'].xcom_pull(task_ids='task_with_error')
    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {"role": "system", "content": "あなたは障害対応エキスパートです。"},
            {"role": "user", "content": f"エラーログ: {error_log}"}
        ]
    )
    print(response.choices[0].message.content)

with DAG(
    dag_id="ai_failure_analysis",
    start_date=datetime(2024, 1, 1),
    schedule_interval=None,
    catchup=False
) as dag:
    analyze_task = PythonOperator(
        task_id='analyze_failure',
        python_callable=analyze_failure,
        provide_context=True
    )
```

## 6. まとめ

Airflow での GCS → BQ → Dataform のパイプラインは、AI によりさらに強化できます。
- DAG コードの自動生成・リファクタリング
- エラー解析・障害対応フローの自動化
- Dataform の依存関係管理・スケジュール最適化
ハッシュ関数について

業務に出てきたので、メモ

## ハッシュ関数とは
任意の入力データを固定長のハッシュ値に**変換する関数**
特徴は、入力の長さに関わらず常に固定長の出力を返し、同じ入力に対しては常に同じハッシュ値を返すが、異なる入力に対してはできるだけ異なるハッシュ値を返すように設計されている﻿

**ハッシュ関数と暗号化の違い**
ハッシュ関数は暗号化と混同されやすいですが、ハッシュ関数は暗号化と異なり、**ハッシュ値から元のデータを復元することはできない**、不可逆性があります。

暗号化は、データを暗号化して保護し、鍵を使って復号することができます。
ハッシュ化は、データの秘匿性を高めるために使われることが多いです。

## SHA256
「Secure Hash Algorithm 256」の略で、ハッシュ関数の一種
- 256ビット（32バイト、64文字の16進数文字列）のハッシュ値を出力する
- 入力がどんな長さでも、**出力は常に256ビット固定**
- 暗号学的に安全（衝突や逆算が極めて困難）
- 一方向性（ハッシュ値から元のデータを復元できない）

#### 具体的な用途
1. ファイルやデータの改ざん検知
ソフトウェア配布サイト等でダウンロードするファイルの「SHA-256ハッシュ値」が公式サイトに記載されていることがあります。
利用者はダウンロード後にファイルのSHA-256ハッシュ値を計算し、公式値と一致するか確認することで改ざんの有無をチェックできます。
2. パスワードのハッシュ化・保存
Webサービスの認証システムで、ユーザーパスワードを生のまま保存せず、SHA-256でハッシュ化してからデータベースに保存します（実際はソルトやストレッチングも併用されます）。
3. 電子署名や証明書
SSL/TLS証明書で、証明書の内容をSHA-256でハッシュ化し、そのハッシュ値をもとに署名します。これにより証明書の改ざん検知が可能です。
4. ブロックチェーン・暗号資産
ビットコインで、ブロックのハッシュ計算やマイニング（プルーフ・オブ・ワーク）、アドレス生成などにSHA-256が使われています。
5. バージョン管理システム
Gitはコミットやオブジェクトの識別子にSHA-1を使っていますが、セキュリティ強化によりSHA-256へ移行する動きもあります。
6. APIのリクエスト署名
AWSやGCPなどクラウドサービスのAPI認証で、リクエスト内容をSHA-256でハッシュ化し署名することで「なりすまし」や「改ざん」を防ぐ仕組みがあります。

#### 以下、JavaScriptでテキストをSHA256化するサンプル

```javascript
const sha256 = async (userId: string) => {
  // テキストをエンコード
  const encoder = new TextEncoder()
  const data = encoder.encode(userId)

  // SHA-256でハッシュ化
  const hashBuffer = await crypto.subtle.digest('SHA-256', data)

  // ArrayBufferを16進数文字列に変換
  const hashArray = Array.from(new Uint8Array(hashBuffer))

  return hashArray.map(b => b.toString(16).padStart(2, '0')).join('')
}
```
crypto-jsとかライブラリを使えばもっと簡単にできます。
https://www.npmjs.com/package/crypto-js
pgAdmin4：サーバに接続できません:

flaskの環境構築備忘録です。

# 😞問題
flaskとデータベースをpgAdmin4を使って❌接続できない

## 💻環境＆前提
- macOS Sequoia 15.5
- brew経由でPostgreSQLをインストール済

 ## ❌出力されたエラー文
pgAdmin4で新しいサーバー情報を保存しようとすると下記エラー文が出る。

```
 サーバに接続できません:

connection failed: connection to server at "127.0.0.1", port 5432 failed: FATAL: role "postgres" does not exist
Multiple connection attempts failed. All failures were:
- host: 'localhost', port: '5432', hostaddr: '::1': connection failed: connection to server at "::1", port 5432 failed: FATAL: role "postgres" does not exist
- host: 'localhost', port: '5432', hostaddr: '127.0.0.1': connection failed: connection to server at "127.0.0.1", port 5432 failed: FATAL: role "postgres" does not exist 

```

## 🔍問題の本質

```
FATAL: role "postgres" does not exist
```
pgAdmin4でログインしようとしている「ユーザー名（role）」がpostgresであるのに、そのユーザーがデータベース側に存在しない、というエラー。

## ✅解決方法
## 方法１：```postgres``` ロールを作成する（推奨）　⬅️こちらを実施した

ターミナルを開いて、PostgreSQLにpsqlでログイン（macOSユーザー名と同じ名前のロールで入る）
PostgreSQL を初めてセットアップした直後は、macOSのログインユーザー名と同じ名前のロールが自動的に作成されている場合が多い。
まずはそれでログインできるか試す。
```
psql postgres
```

接続ができた場合、次のようなプロンプトが表示される：
```
postgres=#
```

※ 上記で接続できない場合は、以下で指定してみる（ex.自分のmacOSのユーザー名がyournameなら）
```
psql -U yourname -d postgres
```

以下のSQLを実行して```postgres```ロールを作成：
```
CREATE ROLE postgres WITH LOGIN SUPERUSER PASSWORD '任意のパスワード';
```
※ パスワードを設定した場合はあとで pgAdmin4 に入力する必要がある。

## 方法2：自分のmacOSのユーザー名に合わせてpgAdmin4を設定する

PostgreSQLはインストール直後、macOSの現在のログインユーザーと同じ名前のロールだけが存在している場合が多い。
そのため、pgAdmin4の「接続」タブで以下のように設定する：
- ユーザー名：macOSのログインユーザー名（whoamiで確認できます）
- パスワード：そのロールに設定されたもの（未設定なら空でOK）
---
### ➕補足：ロール確認＆終了コマンド
どのロールが存在するか確認するには、```psql```に入って以下を実行してください：

```
\du
```

```psql```を終了する
```
\q
```

# 🔆まとめ

|原因|解決策|
|---|---|
|```postgres``` ロールが存在しない|```CREATE ROLE postgres WITH LOGIN...```で作成する|
|ログイン名が間違っている|自分のmacOSユーザー名に設定を変更する|
|パスワードが間違っている|正しいパスワードを確認・設定する|

## ❤️情報源
ChatGPT
【Flutter】小さいアプリの開発　ランダムカラー表示アプリ

### 動きの想定
ランダム変数でカラーコード取得
カラーコードを背景に反映させてどんな色なのかわかりやすくする
画面中央にカラーコード（#ffffffなど）を表示させる
`floatingactionbutton`で更新して色を変更

### ソースコード

https://github.com/kmiono/color_app

### カラーコード取得
カラーコードは16進なので、数値型（10進）を変換する
`toRadixString()`で16進の`string`型の返り値を取得できる

```
//ランダムな値を生成
var random = math.Random();

//ランダムな値をint型で受け取る
//16進に変換
String hex = random.nextInt(256).toRadixString(16);
```

加えて、Flutterの`Color`プロパティでカラーコードを使うにはカラーコードの先頭に`0xFF`が必要なため、16進にした値を整形する必要がある。
あとカラーコードは大文字であることが望ましいので`toUpperCase()`をかけた

```
class HexColor extends Color {
  static int _getColorFromHex(String hexColor) {
    hexColor = hexColor.toUpperCase().replaceAll('#', '');
    if (hexColor.length == 6) {
      hexColor = 'FF' + hexColor;
    }
    return int.parse(hexColor, radix: 16);
  }
  
  HexColor(final String hexColor) : super(_getColorFromHex(hexColor));
}
```

### Material3とケンカ
色は反映されたがAppBarにしか反映されねえな？？？　とちょこちょこ調べながら唸る。
間違いなく`Scafold`配下の`backdroundColor`にカラーコード設定しているのに何故…
そもそもAppBar以外の背景色どこで設定しているんだ…？　`MaterialApp`？　`colorScheme`は削除したはずだが……
えいや！　と`useMaterial3`を`false`にしたところ背景色がカラーコードの色に染まった。

多分私の想定（背景全体を染める）がMaterial3と相容れなかったんだろうな。

### 文字が見づらい問題を解決したい
画面全体がランダムな色になったところで、画面中央に表示しているカラーコードが見づらい。
以下のコードで解決を図る。

```
Text(
	'#$hex',
	style: TextStyle(
		fontSize: 20,
		color: Color(0xFF00677F).computeLuminance() < 0.5
		? Colors.white // 背景が暗いとき
		: Colors.black,
	),
```

`computeLuminance()`で背景色に合わせて黒くする/白くする方法。ただ輝度で黒にするか白にするか決めるので、場合によっては想定通りに動いてくれないみたい……？
要調査。

### 更新ボタンの追加

非同期処理とかやってないので、更新処理は空の`setState(() {});`入れるだけのお手軽なもの。
動作確認の上、多少の位置調整とアイコン表示をして完了

```
floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
floatingActionButton: FloatingActionButton(
	child: Icon(Icons.refresh),
	onPressed: () {
		setState(() {});
	},
),
```

### 反省点

文字の明暗判定が上手くいっていない所。
他の方法を調べるか。

#### 参考リンク
[[Dart]10進数(decimal number)を16進数(to hexadecimal)の文字列(string)に変換するには？ | ちょげぶろぐ](https://www.choge-blog.com/programming/dartdecimanumbertohexadecimal/)
[【Flutter】CSSみたいに色をカラーコード(#******)で指定する｜Flutterラボ](https://note.com/hatchoutschool/n/nce2fc32662f2)
[【Flutter】画面全体に背景色を設定する #Flutter - Qiita](https://qiita.com/tsuruken/items/dcdf9284655c65064429)
[【Flutter】 文字色と背景色のコントラスト比を維持して自動で変更させる方法｜PCロール](https://pc.gajeroll.com/programming/flutter/auto-font-color)
[# FloatingActionButton (FAB) - Flutter 今週のウィジェット](https://www.youtube.com/watch?v=2uaoEDOgk_I)
【論文紹介】広告画像の画像処理に基づく感情喚起状態の推定とCTR予測


勉強会用に呼んだ論文の整理を自分用に残しておきます。

# 読んだ論文
https://www.jstage.jst.go.jp/article/pjsai/JSAI2024/0/JSAI2024_1L3GS1004/_pdf/-char/ja

# なぜ読んだのか
* 2024年人工知能学会の優秀賞に選ばれた論文で注目度が高い。
* ラッセルの感情円環モデルの応用について興味があったため。

# 感想
* データのラベリング方法が気になる。
	* この辺りをLLMでやれそう。
* Russellの感情円環モデルを他のコンテンツに応用する事例をほかにも見てみたい。

# 背景
* 人の意思決定には多様な要因が絡み合っていることが先行研究によりわかった。
* 感情と意思決定の関係性から、広告画像の感情喚起指標とCTRの関係性を分析する。

# Russellの感情円環モデル
valence(感情価)とarousal(覚醒度)の２つの軸で感情を定量化したモデル。
上記２つを特徴量になるように計算し、CTRを予測して関連性を考察する

# データ
* データ
	* Open Affective Standardized Image Set（OASIS）
	* Emo Madrid
* 事前学習モデル
	* BEIT
	* https://huggingface.co/microsoft/beit-large-patch16-384

# 手順
1. 用意した事前学習モデルを使って、感情喚起指標推定モデルを作成
	1. ２値の連続値をする出力する線型層にする
	2. EmoMadridでファインチューニング
	3. OASISでファインチューニング
	4. 訓練データと検証データは8:2で分割
	5. 平均二乗誤差(MSE)で評価
2. 感情喚起指標推定モデルを使い、9913枚のWeb広告画像を分析のvalenceとarousalを予測する。
3. CTRを予測する。
	1. valece, arousal以外に業種や媒体のダミー変数を利用
	2. ランダムフォレストを使って推定。
	3. 訓練データとテストデータは9:1で分割し、10回繰り替えす
	4. 決定係数で評価し、1番高いモデルを最終的な予測モデルとした。

# 結果
* 【図2】OASISとEmoMadridのvalence-arousal散布図
* 【図3】広告画像のvalence-arousal散布図
	* 全体的に第4象限に集中している。
		* arousalが低く、valenceが若干高い。
* 採用したモデルの決定係数は0.537
* 【図4】CTR予測における特徴量の寄与度を可視化した
	* valenceとarousal, 媒体ダミーの一部の寄与度が高い。
* 【図5】Partial Dependence Plots
	* 特定の特徴量とターゲット変数との平均的な関係を示す出力
	* **arousalが低く、valenceが若干ポジティブ寄りの広告画像のCTRが最も高くなることがわかった。**
【論文紹介】 マルチモーダル機械学習によるニュース記事の閲覧時間予測


勉強会用に呼んだ論文の整理を自分用に残しておきます。

# 読んだ論文
[マルチモーダル機械学習によるニュース記事の閲覧時間予測](https://www.jstage.jst.go.jp/article/pjsai/JSAI2023/0/JSAI2023_3Xin458/_pdf/-char/ja)

# なぜこの論文を読んだのか
* 自分が関与する業界におり、参考になりそうだったため。

# 読んだ感想
* シンプルに「この記事は〇分で読めます」という機能は便利そうな印象。
* 画像を特徴量にして精度が上がる理由をもっと深く知りたい。
* クリックベイトについては業界として課題になっているはずなので参考になる。

# 1. はじめに
* 日経ではユーザーの記事の閲覧数と閲覧頻度が解約行動と相関する傾向を確認から定期観測指標として活用している。
* 中には意図しない閲覧やクリック、即時の離脱などユーザーの趣向をとらえるのに適切でない場合もある。
* 閲覧時間の予測器を使って記事と併記することでユーザーの意思決定をサポートしたり、推定閲覧時間を追加することでユーザーのエンゲージメントが高まったという報告もある。
※ここでいう閲覧時間というのは「何分かかるか」という話。

下記の問いに対し、
1. 本文の長さは閲覧時間とどの程度相関しているのか
2. 本文の長さ以外の特徴をくわえることで予測性能が改善するか

以下の分析を行う。
1. 日本語の経済ニュースの閲覧時間を記録した大規模なデータセットの構築
2. 分析した結果、閲覧時間は本文の長さと強い相関がなかった。
3. マルチモーダル情報をもちいることで、より正確な機械学習モデルを構築できた。

# 2. 問題設定とデータセットの構築
日経電子版の記事データとユーザーの行動データを利用した。（表１）
2021年12月1日, 8日, 15日から10万セッションを抽出し、学習・検証・評価用として利用した。

# 3. 提案手法
下記の手法をくみあわせる。
* BERT
	* 事前学習済みのBERTを使って特徴量(768次元)を抽出する。
	* 2013年9月21日-2019年9月20日の6年分を事前学習に利用した。
* Swin Transformer
	* 画像に適用可能なTransformer機構を利用。
	* サムネイル画像を特徴量(768次元)に変換する。
* LSTM
	* BERTとSwin Transformerで作成した特徴量を過去の閲覧時間と連結した上で時系列順にLSTMに入力し予測する。

# 4. 実験
## 本文の長さと閲覧時間の相関
相関を計算し、散布図で確認した。（図2, 3）
結果、本文の長さと閲覧時間には相関0.04とほとんど相関はなかった。

## 本文の長さ以外の特徴量
まずは先ほどのデータセットを使って、LightGBMを使い特徴量の有無で精度がどう変わるかを実験した（表2）
次に特徴量を固定して、提案手法とその他のモデルとの性能の違いを観察した。（表3）

結果、
* 特徴量を追加するにつれ、評価指標が改善した。
* モデルについてはリッジ回帰や多層パーセプトロンにすると性能が悪化。過去の履歴を含んだLSTM出ないと超えられない。

## 欠損モダリティの影響
ニュース記事によってはサムネイル画像がないこともある。
特徴量をすべて0にして予測すると性能が悪化した。ほかの比較もいくつか行った（図5）

# 5. 結論と今後の展望
* マルチモーダル機械学習の手法で本文の長さを用いるよりも高性能に閲覧時間が予測できることを示した。
* 今後は予測モデルを活用し、実際のユーザーに良質な体験ができるかを確認する。
* 「クリックベイト」と呼ばれる問題の対応策となる可能性がある。
JREとJRubyのインストール（2025年）


手順をメモしておきます。

- OS のパッケージ管理の仕組みや SDKMAN などを使う方法もありますが、この記事では素朴にアーカイブをダウンロードしてインストールする手順について扱います
- Java（OpenJDK）には複数のディストリビューションがあるのですが、今回は Temurin というディストリビューションを使います
- Windows, Mac での手順も気が向いたら追記するかも。だいたい同じだと思います。


# Linux（Ubuntu 24.04）

クリーンな環境で試す目的で Docker コンテナを使っていて、その都合で root ユーザで作業しています。それ以外に root でなければいけない理由はありませんので、ユーザやパスは適宜読み替えてください。

```sh
docker run \
  --rm -it -v "$(pwd):/root/work" \
  ubuntu:24.04
```


---

ダウンロードページ
[https://adoptium.net/temurin/releases/](https://adoptium.net/temurin/releases/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234055/67c05889-827c-4292-830f-766362201f97.png)

ここで「JRE」を選択するのがポイント。

`OpenJDK21U-jre_x64_linux_hotspot_21.0.7_6.tar.gz` というファイルがダウンロードできました。

:::note

Q: JDK じゃだめなの？

A: JDK を選んでもたぶん大丈夫です。
JDK ＝ JRE ＋ コンパイラ（javac）などの開発用ツール
なので、Java のプログラムのコンパイルなどが不要なら JRE で問題ないはず。

ちなみに JDK は Java Development Kit、JRE は Java Runtime Environment の略です。

:::


---

アーカイブを展開します。

```sh
tar xvf OpenJDK21U-jre_x64_linux_hotspot_21.0.7_6.tar.gz 
```

展開すると`jdk-21.0.7+6-jre` というディレクトリができ、その中に `bin/`, `bin/` の中に `java` コマンドなどが入っています。

```
jdk-21.0.7+6-jre/
    bin/
        java
        ...
    ...
```

---

上記の `bin/` にパスを通します。

```sh
export PATH="/root/work/jdk-21.0.7+6-jre/bin:${PATH}"
```



パスが通って `java` コマンドが使えるようになっていればOK。

```terminal
  # which java  
/root/work/jdk-21.0.7+6-jre/bin/java

  # java --version
openjdk 21.0.7 2025-04-15 LTS
OpenJDK Runtime Environment Temurin-21.0.7+6 (build 21.0.7+6-LTS)
OpenJDK 64-Bit Server VM Temurin-21.0.7+6 (build 21.0.7+6-LTS, mixed mode, sharing)
```

---

あとは [JRuby のサイト](https://www.jruby.org/) からアーカイブをダウンロードして展開してパスを通せば `jruby` コマンドが使えるようになります。

```sh
wget https://repo1.maven.org/maven2/org/jruby/jruby-dist/10.0.0.1/jruby-dist-10.0.0.1-bin.tar.gz

tar xvf jruby-dist-10.0.0.1-bin.tar.gz

export PATH="/root/work/jruby-10.0.0.1/bin:${PATH}"
```

```terminal
  # which jruby
/root/work/jruby-10.0.0.1/bin/jruby

  # jruby -v
jruby 10.0.0.1 (3.4.2) 2025-05-07 79cf1e4aec OpenJDK 64-Bit Server VM 21.0.7+6-LTS on 21.0.7+6-LTS +indy +jit [x86_64-linux]

  # cat hello.rb 
puts "hello"

  # jruby hello.rb 
hello
```

ちなみに Java のパスが通っていない状態だと以下のようなエラーになります。

```terminal
  # jruby -v
jruby: Error: Java executable not found!
```

---

`jrubyc` コマンドを使ったスクリプトのコンパイルも試してみます。

```terminal
  # cat hello.rb 
puts "hello"

  # jrubyc hello.rb 

  # jruby hello.class 
hello
```

コンパイルする場合は JRE じゃなくて JDK が必要かな？ と思いましたが、JRE でも大丈夫なんですね。

# この記事を読んだ人は（ひょっとしたら）こちらも読んでいます

<!-- LibreOffice Calcのfodsファイルを読み書きするサンプルをweb API化してみた -->
https://qiita.com/sonota88/items/2412dc6389d9bae3add6

<!-- JRubyでLibreOffice Calcのfodsファイルを読み書きするサンプル 2021 -->
https://qiita.com/sonota88/items/b88c89d763cf872db5a1
Vue.jsのnextTickについて

## Vue.jsのnextTickについて
状態を変更した直後に `nextTick()` を使用すると、**DOM 更新が完了するのを待つことができます。** 引数としてコールバックを渡すか、戻り値の Promise を使用できます。

例
```vuejs
<script setup>
import { ref, nextTick } from 'vue'

const count = ref(0)

async function increment() {
  count.value++

  // DOM はまだ更新されていない
  console.log(document.getElementById('counter').textContent) // 0

  await nextTick()

  // ここでは DOM が更新されている
  console.log(document.getElementById('counter').textContent) // 1
}
</script>

<template>
  <button id="counter" @click="increment">{{ count }}</button>
</template>
```
上記は公式ドキュメントから引用

## 実サンプル
バーコードのライブラリを使って会員IDをバーコードで表示した時の例です。
**注意：不要な箇所は省略してます**

```vuejs
<template>
  <div>
    <img ref="barcodeRef" alt="" src="" />
  </div>
</template>
<script lang="ts">
import JsBarcode from 'jsbarcode'
const barcodeRef = ref(null)

watch(
  () => props.barcodeId,
  () => {
    nextTick(() => {
      if (barcodeRef.value && props.barcodeId) {
        JsBarcode(barcodeRef.value, props.barcodeId, {
          format: 'CODE128',
          lineColor: '#000000',
          width: 2,
          height: 50,
          fontSize: 15,
          textMargin: 2,
          displayValue: true,
        })
      }
    })
  },
  { immediate: true },
)
</script>
```
nextTickを使わなくても問題なく表示されるのですが、別のコンポーネントを開いて、閉じた際にバーコードが表示されなくなるケースもありました。
原因は`barcodeRef.value`が`null`の状態でwatchが動いてしまう為。
再マウント時に DOM が揃った後に処理するできるようにnextTickを使うことで防ぐことができました。

公式ではnextTick()した後にDOMが更新後の処理を書いてますが、DOM更新後の処理をコールバック関数として引数に渡してもOKです。

```javascript
// 以下どちらも同じ

await nextTick()
// DOMが更新後の処理をnextTick実行後に書く

await nextTick(() => {
// DOMが更新後の処理をコールバック関数内に書く
})

```
InstagramのWeb APIを使ってフォロワーの推移やコメント、インプレッション情報を集めよう！

Instagramを運用していて、公式アカウントのフォロワー数の推移や投稿したメディアに対するいいね数といったインプレッション数を分析したいといったことはありませんか？また、各投稿についているコメントを俯瞰して見ることができれば、ユーザーの傾向を把握するといったことも可能です。

本記事では、Pythonを経由してInstagramのAPIを叩いて情報を取得・加工する方法を紹介します。

:::note info
本記事は元々、データパレード様のブログに私が執筆した技術ノウハウとして掲載したものです（下記）。Qiitaを通じてより多くの方に届けられれば、そして技術者の方と知見を共有し、フィードバックをいただく目的で許可をいただき掲載しました。
:::
https://data-parade.com/get-follower-impressions-with-instagram-by-web-api/

# APIの利用設定

InstagramのAPIを使うためにいくつか設定が必要です。本記事ではPythonでのデータ取得にフォーカスするため割愛しますが、利用開始には公式ページおよびこちらの記事が参考になりました。

https://developers.facebook.com/docs/instagram-basic-display-api?locale=ja_JP

https://zenn.dev/game8_blog/articles/577b28e6055afd

# Pythonを使ってデータを取得

## データ取得に必要な情報

サンプルスクリプトはこちらからダウンロード可能です。

https://github.com/ebi-ebi-dev/get_Instagram

こちらのconfigsフォルダに、ユーザーIDやアクセストークンを指定する設定ファイルがあります。

```ini:config_instagram.ini
[DEFAULT]
IG_USER_ID = XXXXXXXXXXXXX
ACCESS_TOKEN = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
API_VERSION = v17.0
USER_NAME = hogehoge.official

[LOG]
PATH = C:\logs\Instagram
FILENAME = instagram
```

IG_USER_IDやACCESS_TOKENは前章のページの手順で取得できます。

## 取得できる情報

Pythonスクリプトからは下記の情報が取得できるようになっています。

#### アカウント情報
* アカウント名
* フォロー/フォロワー数
* 投稿数

https://developers.facebook.com/docs/instagram-basic-display-api/reference/me?locale=ja_JP

#### 投稿情報
* 投稿内容
* コメント数
* いいね数
* リール/アルバムといった分類

https://developers.facebook.com/docs/instagram-basic-display-api/reference/media?locale=ja_JP

#### コメント
* コメントしたアカウント名
* コメントした時刻
* アカウントが投稿につけたコメント内容

https://developers.facebook.com/docs/instagram-platform/instagram-api-with-facebook-login/comment-moderation?locale=ja_JP

#### 各メディア（リール/アルバム）情報
* 再生数
* インプレッション数

※リールの例
![reel1-1024x633.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4099119/74e33886-1353-4c9a-9800-a4317c30df94.png)

![reel2-1024x467.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4099119/5eced952-9a12-4b70-a658-429a89d441fe.png)

https://developers.facebook.com/docs/instagram-platform/instagram-api-with-facebook-login/insights?locale=ja_JP

## 実行方法
下記のようにスクリプトを実行すると、dataフォルダに取得した情報が出力されます。前章で紹介したデータをPython内でCSVの形式になるよう加工して出力されます。

```
python src\main.py -configfile_path "C:\Workspace\python\get_Instagram\configs\config_instagram.ini" -csv_path "C:\Workspace\python\get_Instagram\data" -sleep_sec 0.3
```

出力CSV|内容
----|----
me.csv|アカウント情報
media.csv|投稿情報
comments.csv|コメント情報
reel.csv|メディア（リール）情報
album.csv|メディア（アルバム）情報

## どうやって分析すればよい？

出力されたCSV同士は、各投稿の情報（media.csv）を基本情報として下記のように関連付けて分析することができます。

![simple_ER.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4099119/0f7df5c6-fd3b-49ef-b78f-f91a43d159f5.png)

media.csvにあるidが各種エンゲージメントデータ（comments.csv, reel.csv, album.csv）のmedia_idに紐づきます。

日付の情報と合わせて、フォロワーの増減数やリール・インプレッションなどの推移を確認することができます。どのような投稿がユーザーに見られているのかを確認しながら、インスタを運用できるようになりますね。

# さいごに
本記事では、InstagramのAPIを使ってアカウント及び投稿情報、インプレッションなどを取得する方法を紹介しました。今回インプレッション数などをExcelやBIツール等で分析しやすいようCSVの形式で出力しています。少し高度ではありますが、投稿についたコメント内容を形態素解析することで、ユーザーの興味を大まかに可視化してみるのも面白そうですね。
Supabase+Prismaで「Error: P1001: Can't reach database server at」を解決した方法

Supabaseのデータベースに対してPrismaでmigrateをしたところ以下のようなエラーに遭遇しました。初歩的なミスでしたが備忘録として記録します。

```
Error: P1001: Can't reach database server at `****:5432`
```

## 解決方法
SupabaseのDASHBOARDのConnectを選択します。
![スクリーンショット 2025-05-31 134203.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3439167/55c724dc-fb50-4a68-b750-0ad994f9a433.png)

ORMsの.env.localとprisma/schema.prismaの記載どおりに環境変数とschema.prismaを設定します。ここで、schema.prismaのほうにはデフォルトでは記載のないdirectUrlを設定する必要がある点に注意です。私はこれの記載を忘れて上記エラーにずっとはまっていました。

![スクリーンショット 2025-05-31 134352.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3439167/7d4b65b2-230e-49a3-badd-e4484fdf766c.png)
![スクリーンショット 2025-05-31 134400.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3439167/a2671b77-cceb-4594-98b5-47d1d8455fd5.png)

以上の設定をして再度以下のようにmigrateすると無事動作しました。

```
prisma migrate dev --name init
```
WSLを削除しました

# WSLを削除してWindows環境へ完全移行

数年ほど利用していたWSLを削除(inactivate)し、すべての開発環境をWindows側へ移行しました。これまでWSLを活用していましたが、環境の整理を進める中で、その必要性が薄れてきたためです。

## WSLを利用していた経緯  

もともと、Linuxの利便性を活かした開発環境を求めてわざわざOS（当時は10）を32bit環境から64bitへ移行し、WSLを導入しました。Git, Mutt, `todo.txt-cli`, Calcurse, dockerなどをWSL上で利用し、CLIベースの作業を快適に行っていました。Muttとはメールユーザーエージェントのことです。しかし、gitコマンドが遅いことが気になるなど、より統合されたWindows環境への移行を検討するようになりました。

## Windows環境への移行

まず、GitはWindows側にインストールし、直接扱うようにしました。わたくしがgithub-gitを始めたころは、CLIのgitアプリがWindows側でなかったような気がしますが、気づいたら便利なCLIアプリがwingetでインストールできるようになってました。さすがにメールクライアント（MUA）もCLIはいろいろとしんどいということで、変更し、Muttを使わなくなりました。カレンダー管理もCalcurseをやめ、Outlookカレンダーへ移行することで、他のツールとの連携を強化しました。`todo.txt`はもともとGUIのものとの併用だったですが、CLIアプリはなくても困らないのでやめました。

さらに、タスク管理もCLIベースの`todo.txt-cli`から、GUI対応の`todotxt.net`へ乗り換えました。これにより、視覚的にタスクを管理しやすくなり、作業の効率が向上しました。

## Dockerがらみでトラブル

ある日、WSLが23GBもディスク領域を占領しているということに気づきました。しかたがないので、WSLを外し、関連するext4.vhdxを削除して、リセットすることにしました。そうするとなぜか一つのdockerイメージがうごかなくなりました。いまだに原因がわかりません。冷静に考えると、わざわざdocker経由で使わなくても、win側にインストールすればいいことを思い出しまして、WSLやdockerと別れることとなりました。

`DockerForDesktop`にはいい思い出がないので、そこまでしてDockerやんなくても・・・というのもありました。

## WSLとの別れ  

これらの変更を経て、WSLを削除する決断に至りました。導入当初は便利でしたが、現在の環境では不要となったためです。長年活用してきたツールを手放すのは少し寂しさもありますが、よりスムーズな作業環境を手に入れることができました。

WSLを活用している方でも、現在のワークフローを見直すことで、より適した環境に移行できるかもしれません。ツールの整理は定期的に行うと、より快適な作業が実現できます。
AWS Solutions Architect Associate (SAA) 合格記

今後の業務でもAWSを扱う機会が多く、知識を深めるためにAWS Solutions Architect Associate（SAA）の資格を取得しました。
勉強方法や試験の傾向、当日の流れを共有し、これからSAA取得を目指す方の参考になればと思います。


それでは


行ってみよーう👉
![ちょーさん.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929257/4df31b3a-3306-449a-a4c8-5549aa1b9e80.jpeg)




本記事は以下の流れになります。
　＃勉強期間
　＃勉強方法
　＃出題傾向と難易度
　＃試験当日の流れと注意点
　　・持ち物
　　・試験会場での流れ
　　・時間配分と試験中のポイント
　　・アンケート
　＃合否の確認方法
　＃結論と最後に一言

＃勉強期間
2025/1月、3~4月の約3ヶ月です。

＃勉強方法
使用した教材は以下の3種類です。 上から順番に取り組みました。
* 書籍　
    * AWS認定資格試験テキスト AWS認定ソリューションアーキテクト - アソシエイト 改訂第3版 （これ⇨https://amzn.asia/d/1gsnYKx）

    * SAAに出題されるAWSサービスの概要と各機能を解説した一冊です。AWSの経験があまりない方や、一部のサービスしか使った事のない方は、前提知識を身につける為にもオススメの一冊。資格取得を考えてい        ない方でも、業務上の環境に必須のサービスはほとんど載っているので、キャッチアップ用としてもオススメ        です。
* 問題集
    * Cloud License
        * ＃61~75と#150~170を実施しました。理由として、#61~159が最新の問題に更新されているとのことから。ちなみに理由は後述の通りですが課金は必須です。
        * 模擬試験を解いた後にすぐに間違えた問題を見直し、その問題を再度解くという方法を繰り返し、サービスの理解を深め、試験の一週間前からはあえて考えながら問題を解かず、適当に選択してから回答を確認して知識を固めていく方法を取りました。個人的には問題の解き方のコツが掴めたら後は後者のひたすら問題を回して回答を頭に刷り込んでいく方法が量も質も合格するには一番効率の良い方法だと感じました。後、解説読んでもさっぱりわからないサービスや説明はChatGPTに解説してもらうとかなり捗ります。
    * Ping-t
        * サービスに対する基礎知識を固めるために利用しました。
        * CloudLicenseで分かりにくい解説や、理解できなかったサービスが出てきた時に各分野ごとの問題を解き、分野別の知識を確実に固めました。

＃出題傾向と難易度
本試験は、130分の試験時間で65問が出題されます。 問題文の書かれ方や内容はCloudLicenseにかなり似た内容で出る印象です。中にはそっくりそのまま出ている問題も数問見受けられました。またサービスとしてもAmazon Neptune、AWS Elastic Beanstalkなど知らないサービスも1~2割程度出る印象ですが、得点対象外の問題も散りばめられているので、直近の最新１００問程度は必須で抑えておき、心配であればできる限りCloudLicenseの問題を網羅しておくことをオススメします。


●模擬試験の活用法
賛否両論ではありますが、個人的にはあまりやる必要はないかと思います。それよりも、その時間を使って前述の方法で出題される問題の内容や傾向と回答をひたすた頭に詰め込む方に費やした方がいいように感じるからです。模擬試験とは言え、本番試験の内容に似ていたか問うとそうでもなく、ただCloudLicenseの問題集からランダムに出題されているだけなので、じゃあ最初から最新の問題順に覚えて行っちゃえばいーじゃん。という結論です。どちらかと言えば、以下に幅広く学習し知識が身に付いているかが、本番試験を解くにあたり必要な事だと思いました。


＃試験当日の流れと注意点

・持ち物
身分証明書が2種類。 ※顔写真付が一つと氏名、生年月日付きのもので一つ。マイナンバーカードか運転免許証かパスポート＋健康保険証があれば安心です。

・試験会場での流れ
まずは試験会場に着いて受付。署名が必要な書類に記載があるのと、顔認証があります。
すっぴんが気になるレディーや青髭が気になる紳士の方は整えておいてもいいでしょう。知らんけど。
時間が近づくと試験室へ案内されるので早めに行ってお手洗いは済ましておきましょう。
ちなみに待機場所での学習は禁止でした。悪あがきは許されません、事前にいっぱい勉強しておきましょう。直前に15分程度頑張ったとて結果が変わるような試験ではないので安心してください。
会場内に私物はペンと計算用の白紙シートが渡されます。入る前に所持品は全てロッカーにしまいます。※メガネをかける人は、メガネもチェックされたらしい。

・時間配分と試験中のポイント
試験は130分ですが、私は１問ずつじっくり解いて行きました。とはいえ1~2分考えても結論が出ないような問題は試それっぽい答えをパッと決めて他の問題を解いた後に解き直しました。フラグをつけられるのでおすすめのやり方です。問題数が多い分、時間は十分に与えられているため、時間配分を意識しすぎず、問題を一つずつ読み解いていくことが肝要です。

・アンケート
試験後にはアンケートがあります。なるべく問題を解く時間に使いたかったので、とりあえず全て最高評価にしておきました。頑張って問題を作ってくれた方達へのせめてものお礼です。とはいえ問題もしっかり作り込まれている印象だったので概ね相違はないし大丈夫でしょう。



＃合否の確認方法
終了後はその場で結果の開示はなく、20時頃にCredlyからメールで試験結果が届きました。

＃結論と最後に一言
結論、CloudLicenseいっぱいやっとけば大丈夫。
オンライン試験は手続きと準備がめんどくさい上に、システムトラブルで試験が受けられないことも。最初は2月に受ける予定でしたが、私もそれで試験が4月末にリスケになってしまった為、会場での受験を強くお勧めします。以上、現場からでした。
Django の session をまとめて確認する


# Django の session をまとめて確認する

Django でセッション情報をまとめて確認したい場合の方法を紹介します。

## セッション情報の保存場所

Django では、デフォルトでセッション情報はデータベース（`django_session` テーブル）に保存されます。
設定によってはキャッシュやファイル、Cookie なども利用可能です。

## セッション情報の確認方法

### 1. 管理画面から確認

Django の管理画面（admin）で `Session` モデルを有効にしていれば、
`/admin/sessions/session/` からセッション情報を確認できます。

### 2. シェルから確認

```python
from django.contrib.sessions.models import Session

for session in Session.objects.all():
    print(session.session_key, session.get_decoded())
```

### 3. DB から確認

SQL で直接 `django_session` テーブルを参照することも可能です。

``` sql
SELECT * FROM django_session;
```