OmniAICreator/Qiita-1.07M huggingface dataset:
データベース選定基準: BigQuery, Redshift, Snowflake の比較

データウェアハウス（DWH）は、大量のデータを効率的に格納し、分析できるシステムです。現在、クラウドベースのDWHとして **BigQuery（Google Cloud）**、**Redshift（AWS）**、**Snowflake** の3つが特に人気があります。本記事では、それぞれの特徴や違い、選定基準について詳しく解説します。

---

## 1. **BigQuery（Google Cloud）**

### **概要**
BigQueryはGoogle Cloudが提供するフルマネージドのサーバーレスデータウェアハウスで、大規模なデータ分析向けに設計されています。

### **特徴**
- **サーバーレス**: インフラ管理不要でスケーラビリティが高い。
- **ペタバイト規模のデータをクエリ可能**: 大規模なデータ分析に向いている。
- **自動スケーリング**: 必要に応じて計算リソースを割り当てる。
- **SQLベースのクエリエンジン**: 標準SQLを使用可能。
- **ストレージとコンピュートの分離**: 柔軟なコスト管理が可能。

### **適した用途**
- ビッグデータ分析（機械学習、BIレポーティング）
- ストリーミングデータのリアルタイム分析
- マルチクラウド環境でのデータ処理

### **メリット**
✅ サーバーレスで運用管理不要  
✅ 自動スケーリングで大規模データも効率的に処理可能  
✅ Google Cloudの他のサービス（Cloud AI、Dataflowなど）と統合しやすい  
✅ REST API経由でのアクセスが容易  

### **デメリット**
❌ クエリ実行に応じた料金が発生し、長時間のクエリが高額になりがち  
❌ リアルタイムデータの頻繁な更新には向いていない（追加・変更に遅延が発生）  

---

## 2. **Redshift（AWS）**

### **概要**
RedshiftはAWSが提供するクラウドDWHで、オンプレミスのDWHのように使える高性能な分析プラットフォームです。

### **特徴**
- **カラムナーストレージ**: 高速な分析処理が可能。
- **クラスターベースのアーキテクチャ**: リソース管理が可能でスケールアップ/スケールアウトが柔軟。
- **データロードと並列処理が強力**: Amazon S3などからのデータロードが速い。
- **AWSエコシステムとの統合が容易**: S3, Glue, Athena, Lambdaとの連携がスムーズ。

### **適した用途**
- 企業向けDWHのクラウド移行
- 高速バッチ処理が必要な分析ワークロード
- AWS環境で統合されたデータ分析基盤

### **メリット**
✅ 高速なデータ分析（カラムナーストレージ）  
✅ AWSエコシステムとの統合が容易  
✅ クラスターベースでリソース管理が可能  
✅ クエリパフォーマンスのチューニングがしやすい  

### **デメリット**
❌ サーバー管理が必要（クラスターベースのため）  
❌ ストレージとコンピュートが分離されていない（ストレージを増やすにはクラスタを拡張する必要がある）  

---

## 3. **Snowflake**

### **概要**
Snowflakeは、クラウドネイティブなDWHとして、スケーラビリティと柔軟性に優れたプラットフォームです。

### **特徴**
- **完全なストレージとコンピュートの分離**: 柔軟なリソース割り当てが可能。
- **クラウドアグノスティック**: AWS, Azure, GCPで動作可能。
- **ゼロコピークローン**: データの複製なしで環境を複製できる。
- **セキュリティとコンプライアンスの充実**: エンタープライズ向けに適した機能。

### **適した用途**
- マルチクラウド環境でのDWH構築
- 柔軟なリソース管理が求められる大規模分析
- データの共有や複製が多い環境

### **メリット**
✅ ストレージとコンピュートが完全分離（柔軟なスケーリング）  
✅ クラウドアグノスティック（GCP, AWS, Azure対応）  
✅ データ共有が簡単で、マルチテナント環境に最適  
✅ セキュリティ対策が充実  

### **デメリット**
❌ コストが割高になりがち（従量課金モデルのため）  
❌ データのエクスポート機能が他と比べて制限されている  

---

## 4. **選定基準の比較**

| 項目 | BigQuery | Redshift | Snowflake |
|------|----------|----------|-----------|
| **運用管理** | サーバーレス（運用不要） | クラスタ管理が必要 | サーバーレス（運用不要） |
| **スケーラビリティ** | 自動スケール | クラスタ拡張 | 完全なスケール分離 |
| **パフォーマンス** | ビッグデータ向けに最適化 | 高速分析向け | 柔軟なリソース割り当て |
| **コストモデル** | クエリ実行ごと | クラスタサイズごと | ストレージとコンピュート分離（柔軟） |
| **AWS/GCP/Azure対応** | GCPのみ | AWSのみ | AWS/GCP/Azure |
| **主な用途** | ビッグデータ分析 | 企業向けDWH | マルチクラウド環境 |

---

## 5. **結論: どのDWHを選ぶべきか？**

| 条件 | 推奨DWH |
|------|---------|
| GCP環境でビッグデータ分析を行う | **BigQuery** |
| AWS環境で大規模なDWHを構築する | **Redshift** |
| マルチクラウド環境で柔軟に運用したい | **Snowflake** |
| ストレージとコンピュートを完全分離したい | **Snowflake** |

それぞれのDWHには特徴があり、ユースケースに応じて選定することが重要です。選定の際には、**データの規模、ワークロード、コスト、運用管理の手間**などを考慮しましょう。
Entity FrameworkとOracle使用時に「ORA-00904: "FALSE": 無効な識別子です。」が発生する

## 使用バージョン
* Blazor
* Microsoft.EntityFrameworkCore : Version="8.0.11"
* Oracle.EntityFrameworkCore : Version="8.21.170"

## 実行環境
* Oracle Database 21c

## 発生するエラー
SQL実行時に以下のエラーが発生する。
> ORA-00904: "FALSE": 無効な識別子です。

## 原因
EFにより自動生成されるCASE文の中でBoolean型が使用されているが、
Oracle Database 21cではBoolean型はサポートされていないためエラーになる。
→CASE文が生成されるコードを書いた場合のみエラーになる。

23c以降はサポートされるため、そちらの環境を前提に動作してしまっている。

## 改善方法
### OracleSQLCompatibilityを設定する
【推奨！】
バージョン21を指定することにより、21環境での動作を考慮してくれる。
~~~ C#
optionsBuilder.UseOracle("User Id=hr;Password=<password>;Data Source = inst1", b =>
b.UseOracleSQLCompatibility(OracleSQLCompatibility.DatabaseVersion21));
~~~

### Oracle.EntityFrameworkCoreのダウングレード
Oracle.EntityFrameworkCoreをバージョン「8.21.150」にダウングレードする。
このメジャーバージョンは非同期処理がうまく動作しないため、おすすめしない。
うまく動作させる方法はあるのかも？？？

### Oracle Databaseのバージョンアップ
Oracle Databaseを23c以降にバージョンアップする。

## 参考資料
[stack overflow (Oracle EntityFramework can no longer handle boolean using EF)](https://stackoverflow.com/questions/78847924/oracle-entityframework-can-no-longer-handle-boolean-using-ef)

[Oracle ](https://docs.oracle.com/en/database/oracle/oracle-database/21/odpnt/EFCoreAPI.html#GUID-41786CF0-11E3-4AD2-8ED1-3D31D5FE2082)
Pythonのファイル操作

## テキストファイルの書き込み
```text_w.py
f = open("sample.txt", "w")
f.write("test")
f.close()
```

## ファイルのコピー
```text_copy.py
import shutil

source_file = "temp/file1.txt"  # コピー元のファイル
destination_file = "backup/file1.txt"  # コピー先のファイル

shutil.copy(source_file, destination_file)  # コピー実行

print(f"{source_file} を {destination_file} にコピーしました。")
```

## フォルダごとコピー
```directory_copy.py
import shutil

source_dir = "temp"  # コピー元のフォルダ
destination_dir = "backup"  # コピー先のフォルダ

shutil.copytree(source_dir, destination_dir)

print(f"{source_dir} を {destination_dir} にコピーしました。")
```

### フォルダとファイル全て読み込み

```All_read.py
import os

dir_path = "://Ftp名/フォルダ名"

# ディレクトリ内の全ファイルとフォルダを取得
items = os.listdir(dir_path)

# 結果をテキストファイルに書き込む
output_file = "items.txt"
with open(output_file, "w", encoding="utf-8") as f:
    for item in items:
        f.write(item + "\n")

print(f"フォルダとファイルの一覧を {output_file} に書き込みました。")
```

# Geminiで文字起こし
```testGemini.py
import google.generativeai as genai

# Gemini APIキー設定（実際には環境変数などを利用してください）
genai.configure(api_key="XXXXXXX")

# モデルの指定
model = genai.GenerativeModel("gemini-1.5-pro")

# 音声ファイル読み込み
with open("sample2.wav", "rb") as f:
    audio_data = f.read()

# 文字起こしリクエスト
response = model.generate_content([
    "この音声を文字起こししてください：話者を分け、00:00形式でタイムスタンプを付けてください。",
    {
        "mime_type": "audio/wav",
        "data": audio_data
    }
])

# 結果の出力
print(response.text)

# 結果をUTF-8で保存
with open("sample.txt", "w", encoding="utf-8") as f:
    f.write(response.text)
```
Macのスクリーンショットのタイマー

# スクリーンショットのタイマーで遅延させる方法

メモとして残しておきます
Macに備わっている標準のスクリーンショットの機能にあったので追加で何かインストールする必要はありませんでした。

参考にしたURL

https://www.lifehacker.jp/article/241385how-to-set-a-screenshot-timer-on-your-mac/

# Shift + command + 5 

![スクリーンショットのタイマー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957418/3b9a7a01-2022-4515-adde-667bfd35da99.jpeg)
[Poke-Pro]PC-G850(ポケコン)で除算の余りを出す

# [新企画]Poke-Pro
新企画`Poke-Pro`では、ポケコンで作成したプログラムを投稿していく企画です。シリーズとなります。BASIC言語に軸を置き、気まぐれでC言語にも触れていきます。

## はじめに
こんにちは、bockringです。シリーズ投稿の3本目は、「割り算で余りを出す」ことです。最近の関数電卓には`÷R`などの割り算で商と余りを出す関数がありますが、それを作っていきます。

## 目標と妥協点
まず目標です。以下の点を実装します。
- 対話形式の入力
- 入力と出力の画面の区別

逆に妥協点は、
- 表示のバグに対応するため2行で結果を表示すること

です。これらを踏まえて実装します。

## 実装
例によってBASICです。今回は1行コードにはしません。後で見やすいように分けて書きます。

```basic:devideR.TXT
10 CLS :PRINT "[/R CALC]":PRINT "A/B=Q...R"
20 PRINT "What is A?":INPUT "(A)",A
30 PRINT "What is B?":INPUT "(B)",B
40 Q=A/B
50 Q= INT (Q)
60 R=A-B*Q
70 A$= STR$ (A):B$= STR$ (B):Q$= STR$ (Q):R$= STR$ (R)
80 T$=A$+"/"+B$
90 CLS :PRINT "[RESULT]":PRINT T$
100 T$="="+Q$+"..."+R$
110 PRINT T$
```


## 改善点
- 数やその大きさによっては正しく表示できないこと

といったところです。この改善点は、入力された数の大きさを`9999999999`以下であることを確認したり、整数であることを確認するようにしたら大丈夫かなと思います。

## おわりに
今回は`INT()`関数を使って小数点以下を切り捨てられることを利用しました。

これからもポケコンBASICで遊んでいこうと思います

---

シリーズ記事の一覧

https://qiita.com/bockring/private/0cc7d2fbbdad53b25c1b

---
[DevContainer][PHP][PostgreSQL]PDO入れられねーじゃん（解決済み

# 未設定だと何も出来ない（当たり前
[前の記事](https://qiita.com/AsilHatake/items/6a47b58457192d669b19)でPHPとPostgreSQLの環境をDevContainerで作ってみた的なのをやってみましたが、作っただけだとPHPからPostgreSQLにPDO接続が出来ないと言う至極当たり前な状態だったたのと、それを設定するに当たり何か色々とハマったため備忘録も兼ねてPDOを入れる手順をココに残す。

# PHP 8.3 を使いたいのにPDO 7.X 入れようとしててエラー
普通に`sudo apt-get install php-pgsql`でイケるやろという安直な考えでコマンドぶっ叩いたのに。。。 
```terminal:エラー例
// 省略
Package php-pgsql is a virtual package provided by:
  php7.3-pgsql 7.3.31-1~deb10u1 [Not candidate version]
  php7.3-pgsql 7.3.29-1~deb10u1 [Not candidate version]
```
みたいなエラーが出てインストールに失敗するんじゃ。。。

おいおい、PHP8.3とバージョンが合わねぇって言ってるのはわかるけど、どうすりゃええんじゃ？

## 試したこと：バージョン指定してやればええんか？
`sudo apt-get install php8.3-pgsql`
これでイケると思うじゃん？
ところがどっこい同じエラーメッセージが出るんよ。
どんだけ7系を参照しに生きたいんだよお前は。。。

## 答え
```terminal:これで完璧
sudo apt update -q
sudo apt install -q -y libpq-dev
sudo docker-php-ext-install pdo_pgsql pgsql
```

# 後はphp.iniのextensionsのコメントアウトを外すだけ
コレでPHPからPostgreSQLに接続などが出来るようになりました。
`libpq-dev`を上げて`docker-php-ext-install`で入れないといけないと言うなんともDockerならではなエラーだったっぽい。
※ならではなのか？

普通にサーバー立てるだけならこんなんにハマることはなかったと思うので、まだまだコンテナ関係の知識がバブなんだなと。。。
Amazon EventBridge 設定メモ

AWS で cron のような定期イベント実行が簡単にできないか調査していたところ、Amazon EventBridge というサービスを見つけた。
今回は、Lambda 関数の定期(週1)実行を例に、連携の設定について、メモしたので以下に示す。

## 設定手順

1. Amazon EventBridge コンソールにアクセス

    - https://console.aws.amazon.com/events/

2. 画面左メニューから『バス』の「ルール」を選択

    <img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173180/b261ce68-4806-4c90-bef6-48e14299d8d6.png" alt="01" /><br>

3. 「ルールを作成」ボタンをクリック

    <img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173180/fe835277-0d2f-4b74-8292-e1d1b18ae794.png" alt="02" /><br>

4. ルールの詳細を指定

    - 名前
        - ルールの名前を入力
    - 説明 - オプション
        - ルールの説明を入力
    - イベントバス
        - 「default」を選択
        - 「選択したイベントバスでルールを有効にする」をON
    - ルールタイプ
        - 「スケジュール」を選択

    <img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173180/2aab4b3c-b2d4-4db8-9d75-15f88b6d3113.png" alt="03" /><br>

5. 「EventBridge Scheduler で続行」ボタンをクリック

6. スケジュールパターンを指定

    - 頻度
        - 「定期的なスケジュール」を選択
    - タイムゾーン
        - 「(UTC+09:00) Asia/Tokyo」を選択
    - スケジュールの種類
        - 「cron ベースのスケジュール」を選択
    - cron 式
        - 「分 時間 日付 月 曜日 年」を入力

            日本時間(JST)の毎週火曜4時 の場合
                「0 4 ? * Tue *」もしくは「0 4 ? * 3 *」

            曜日
                1：Sun
                2：Mon
                3：Tue
                4：Wed
                5：Thu
                6：Fri
                7：Sat

            ※ 日付もしくは曜日のどちらかに「?」を指定する必要あり

    - フレックスタイムウィンドウ
        - 「オフ」を選択

    <img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173180/c0a8e39a-dd64-4822-b003-ca11aabb73d9.png" alt="04" /><br>

7. 「次へ」ボタンをクリック

8. ターゲットの選択

    - ターゲット API
        - 「テンプレート化されたターゲット」を選択
        - 「AWS Lambda Invoke」を選択
    - Lambda 関数
        - 起動したい Lambda 関数を選択
    - ペイロード
        - Lambda 関数起動の際のパラメータを入力

    <img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173180/c57db48f-c5c2-4b73-82c3-1b20e13ba9af.png" alt="05" /><br>

9. 「次へ」ボタンをクリック

10. 設定 - オプションを指定

    - スケジュールを有効化
        - 「有効化」を選択
    - スケジュール完了後のアクション
        - 「NONE」を選択
    - 実行ロール
        - 「このスケジュールの新しいロールを作成」を選択
    - ロール名
        - 自動で入力されたロール名

    <img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173180/4d94a2ea-cceb-4fab-aa69-88c76d5434fe.png" alt="06" /><br>

11. 「次へ」ボタンをクリック

12. スケジュールを確認

    <img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173180/0f60bba5-5b96-4db4-acfd-1b1dd5fcc9c4.png" alt="07b" /><br>

13. 「スケジュールを作成」ボタンをクリック

    <img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173180/7aed73d7-8edf-4a08-a4cf-2743957fc118.png" alt="08b" /><br>


## 参考サイト

AWS Lambdaで遊ぼう #2 Lambda関数を定期実行する
https://benjamin.co.jp/blog/technologies/lambda-2-eventbridge/

EventBridge のスケジュールパターンで「CRON 式が無効です」が発生したときの対処方法
https://dev.classmethod.jp/articles/tsnote-eventbridge-cron-expression-is-invalid-in-eventbridge-schedule-pattern/

(2025/02 頃執筆)

---

株式会社ボトルキューブではお仕事を募集中です。
お問い合わせは下記リンク先のフォームからご連絡ください。
https://www.bottlecube.co.jp/contact
【SAP Learning Hub】アセスメントを受験してSAP認定資格の有効期限を延長した話

# 概要
受託開発企業で働くfussasyといいます。普段は、SAP BTP（PaaS）上でSAP Fioriアプリケーション開発をしています。SAP導入プロジェクトへ関わるようになると、多くの場合はSAP認定試験を受験することが多いかと思います。これまで、SAP認定資格は一度取得すると、その資格区分が残る限り有効のままでした。しかし、2025年から仕様が変わり、取得済のSAP認定資格について有効期限が設けられました。この有効期限までに、SAP Learning Hub上でアセスメント（ミニテスト）に合格し、期限を延長しなければ失効するようになりました。
本記事は、実際にSAP Learning Hub上でアセスメント（ミニテスト）を受験し有効期限を延長したので、その記録となります。

# 関連記事
**【SAP BTP】SAP認定試験の受験体験記、資格試験の情報と解説について**
初回、SAP認定資格区分について、SAP Certification Hub上で受験したときの情報と解説です。

https://qiita.com/fusassy/items/d56ee48a2771bebf06ee

**【Credly】SAP認定試験の合格証明書・バッジのダウンロード方法**
SAP認定試験に合格し、取得した資格証明書をCredlyからダウンロードするときの方法です。

https://qiita.com/fusassy/items/8406554631ca938459e2

# SAP認定資格の有効期限延長に関する各種情報
・2025年度から、合格したSAP認定資格は有効期限が1年となる。有効期限の延長には、アセスメント（ミニテスト）を受験し合格する必要がある。
・アセスメントはSAP Learning Hub上で実施されるため、SAP Learning Hubの契約は有効である必要がある。
・アセスメントは受験可能回数の制限もなく、受験費用もSAP Learning Hubに含まれている。
・アセスメントの合格基準は80%だが、回数制限がなく不合格の場合でも繰り返し受験可能。もちろん、4回分の資格受験チケットには影響しない。
・新たにSAP認定資格を取得する場合、従来通りSAP Certification Hubで受験する。
・新たにSAP認定資格を取得する場合、予め4回分の受験可能チケットがSAP Learning Hubの費用に含まれている。従来通り、6回分チケットまたは1回分チケットを別途、購入することも可能。
・アセスメントに合格すると、有効期限は合格後1年延長される。**最後にアセスメントを合格した日から、1年後が設定**される。情報は即時反映されず、翌日に反映される様子。
【例】25年3月末が有効期日の場合、2025年3月1日にアセスメントを合格すると、有効期日は2026年3月2日になる。**再度、2025年3月10日にアセスメントを受け直すと、資格の有効期日は2026年3月11日が設定される。**

# SAP Learning HubでSAP認定資格の有効期限延長のためのアセスメントを受験する
① SAP Learning より「**My Learning**」を押下する。

https://learning.sap.com/

![スクリーンショット 2025-02-26 124223.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727556/cadd87d1-f4c4-414c-9ca5-044c2ed73769.png)

② 「**Certification**」押下し、アセスメントを受けるSAP認定資格について、「**Manage certification**」ボタンを押下する。
![スクリーンショット 2025-02-26 124251.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727556/b476bdbb-339d-4539-a19f-1ad6e5e67c49.png)

③ SAP認定資格の有効情報を確認した後、「**Take assessment**」ボタンを押下する。
![スクリーンショット 2025-02-26 124335.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727556/5263ae8d-c424-4fb1-b105-784b59cfc2f3.png)

④ SAP Learning Hubにおけるアセスメントのページに移動するので、「**Start Course**」ボタンを押下する。
![スクリーンショット 2025-02-26 124428.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727556/0edd7202-5025-4ca7-a978-319774b89b99.png)

⑤ アセスメント受験ページに移るので問題を解いていく。解き終わったら最後に正答率が表示されるので、確認後に「**Verify course completion**」ボタンを押下して完了。
![スクリーンショット 2025-02-26 125048.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727556/d702e204-d33f-489e-8dca-ce0f4371382f.png)
アセスメントに通過したら、合格ページを印刷することも可能です。今回の場合、2025年2月24日にアセスメントを合格したので、SAP認定資格の維持期限は2026年2月25日までとなりました。資格情報が失効しないよう、定期的にアセスメントの受験を忘れないようにしなければいけません。
![スクリーンショット 2025-02-26 130045.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727556/38ccc43f-69e1-4eb2-9607-09a61a8ec7ab.png)

# おわりに
以上となります。SAP社のプロダクトは機能改善・刷新も多く、SAP認定資格を所有するエンジニア・コンサルタントは、SAP社のセミナーやレクチャーを通じた各情報提供を通じ、知識の最新化が求められています。今後、アセスメントも仕様の変更は起こるかもしれませんが、最新知識を有していてしてほしい、というSAP社の意図は続くと考えています。以上、本記事がお役に立てれば嬉しい限りです。
プログラミングよくわからんケモノのABC395

## [ABC395](https://atcoder.jp/contests/abc395)感想
初心者にとってはA～Cの3完をいかに早くとれるかって回でした。
今回C問題で大分痛い目を見たせいで、レートが初のマイナス。
せめて茶入りはしたいので次回はしっかりこなしていきたいですね……。

## [A問題](https://atcoder.jp/contests/abc395/tasks/abc395_a)
数列が昇順に並んでいるかって問題です。

同値が許されないことを除けば昇順に並んでいるかを確認するだけなので、その通りにやればいいですね。

```python abc395_a.py
N = input()
l = list(map(int, input().split()))

for i, j in zip(l, l[1:]):
  if i >= j:
    print("No")
    exit()
    
print("Yes")
```

## [B問題](https://atcoder.jp/contests/abc395/tasks/abc395_b)
漢字の回のような模様を作れって問題です。

一番外側の模様は固定なので、そこを基準に内側に内側に模様を入れていけばいいです。
もう少しスマートに書けた気がしますね、大分無駄が多い文だと思います。

```python abc395_b.py
import itertools as it

N = int(input())
l = [["."] * N for _ in [0] * N]

for i in range(0, N, 2):
  for y, x in it.product(range(i, N-i), range(i, N-i)):
    if x == i or y == i or x == N - i - 1 or y == N - i - 1:
      l[y][x] = "#"

for ll in l:    
  print(*ll, sep="")
```

## [C問題](https://atcoder.jp/contests/abc395/tasks/abc395_c)
同じ数字同士の線分の長さを最小化しろって問題です。

問題としては非常にシンプルで、制約的に数字の種類数も$10^6$程度であり、各数字ごとの最小値をとって、その中でさらに最小値を取るだけの問題です。

(失敗した提出)
```python abc395_c_mistake.py
import sys

N = int(sys.stdin.readline())
l = list(map(int, sys.stdin.readline().strip().split()))

d = {}

for i in range(len(l)):
  x = l[i]
  if x in d.keys():
    a = min(d[x][0], i - d[x][1])
    d[x] = [a, x]
    
  else:
    d[x] = [float("INF"), i]
  

print(x+1 if (x := min(d[key][0] for key in d.keys())) != float("INF") else -1)
```
さて、これが問題のコードなのですが、どこを間違えているか分かりますか。
<dt>d[x] = [a, x]</dt>これです。

iが現在確認している数字の<b>位置</b>を表していて、xが<b>値</b>を表しているのですが、誤って、値を挿入してしまっており、その結果、同じ数字同士の距離の測定が上手くいかなくなっているのです。
そもそもこれはx座標軸上の点の位置を表す数字と、値を表す数字の変数名が異常（本来はxを座標、iを数値としている。）なことが原因なのですが、スピードを求めすぎるあまり、レビューの質を下げるという悪い例を晒してしまった、ともとれるミスです。

この失敗のせいで15分ほどのロスが発生しており、順位としても500位程度下がる結果になってしまいました。
今後の反省とします。

```python abc395_c.py
import sys

N = int(sys.stdin.readline())
l = list(map(int, sys.stdin.readline().strip().split()))

d = {}

for i in range(len(l)):
  x = l[i]
  if x in d.keys():
    a = min(d[x][0], i - d[x][1])
    d[x] = [a, i]
    
  else:
    d[x] = [float("INF"), i]
  

print(x+1 if (x := min(d[key][0] for key in d.keys())) != float("INF") else -1)
```

## [D問題](https://atcoder.jp/contests/abcxxx/tasks/abcxxx_d)
鳥の移動、巣の入れ替え、鳥の巣の位置の出力を与えられた回数行え、っていう問題です。

課題となるのは巣の入れ替えですね。全く上手くいきませんでした。
AWS SESで遭遇したエラーまとめと考察

AWS SESを利用してメール送信機能を実装している際、下記の2つのエラーに遭遇しました。ここでは各エラーの内容と、それに対する調査結果および今後の対応方針についてまとめます。

## エラー1: `BadRequestException: Local address contains control or whitespace`

### エラー内容
- **エラーメッセージ**  
  `BadRequestException: Local address contains control or whitespace`  
  → ローカルアドレスに制御文字または空白が含まれているというエラーです。

### 調査内容
- **調査方法**  
  対象のテーブルから不正なメールアドレスが存在しないか確認しましたが、問題となるメールアドレスは発見できませんでした。
- **現状の課題**  
  テーブル上に不備がないため、エラー発生の根本原因が判明していません。  
  ※入力データのバリデーション処理や、AWS SES側での内部処理に起因する可能性も考慮する必要があります。

### 今後の対応
- さらなるログ出力や、メールアドレスの正規化処理の追加検討
- AWS公式ドキュメントやフォーラムで類似事例の確認

## エラー2: `BadRequestException: 1 validation error detected: Value at 'content.template.templateData' failed to satisfy constraint: Member must have length less than or equal to 262144`

### エラー内容
- **エラーメッセージ**  
  `BadRequestException: 1 validation error detected: Value at 'content.template.templateData' failed to satisfy constraint: Member must have length less than or equal to 262144`  
  → テンプレートデータとして渡している内容が、262144文字（約256KB）の上限を超えているために発生しています。

### 調査内容
- **調査方法**  
  テンプレートに渡しているデータ量を確認したところ、指定された上限を超えていることが判明しました。
- **現状の課題**  
  渡すデータが大きすぎるため、AWS SESのバリデーションに引っかかってしまっています。

### 今後の対応
- テンプレートに渡すデータ量の見直しおよび圧縮や分割処理の検討
- メール送信機能の仕様の再評価、もしくはテンプレートデータの構造改善

---

## まとめ

今回の調査では、1件目のエラーは原因が不明のためさらなる調査が必要であり、2件目のエラーについてはテンプレートデータのサイズ超過が原因であることが明確になりました。これらの知見を踏まえ、以下の対応を進めることが求められます。

- **エラー1について**: 入力データの再チェックと、AWS SES側の動作確認を実施する。
- **エラー2について**: メール送信機能の仕様を見直し、テンプレートデータ量の最適化を図る。

AWS SESの利用にあたっては、エラーメッセージやバリデーション制約を正確に把握し、適切な対策を講じることが重要です。今後も引き続き、ログの精査や仕様見直しを行い、安定したメール送信システムの構築を目指します。

---

以上、AWS SESでのエラー対応の経緯と今後の課題についてまとめました。読者の皆様も同様の問題に直面された際の参考になれば幸いです。
Cloud Firestoreの落とし穴：注意すべきポイントと回避策


## 1. はじめに

Cloud Firestoreは、Google Cloud Platform (GCP) の提供するNoSQLデータベースであり、リアルタイム同期やスケーラビリティの高さが魅力です。しかし、Firestoreにはいくつかの落とし穴があり、設計や運用の際に注意が必要です。

本記事では、Cloud Firestoreの代表的な落とし穴とその回避策について解説します。

---

## 2. Firestoreの落とし穴と回避策

### 2.1 課金モデルの罠（リクエスト課金）
#### ❌ 落とし穴：
Firestoreはリクエスト数に応じた課金モデルを採用しています。特に**大量の読み取り**が発生するアプリでは、予想以上にコストがかかることがあります。

#### ✅ 回避策：
- **データの正規化を見直す**（不要な読み取りを減らす）
- **オフラインキャッシュを活用**し、不要なリクエストを抑える
- **必要なフィールドのみ取得**（`select()` を活用）
  ```python
  doc_ref = db.collection("users").document("user_1")
  doc = doc_ref.select("name", "email").get()
  ```

---

### 2.2 クエリ制限の罠
#### ❌ 落とし穴：
Firestoreのクエリは柔軟ですが、**OR条件やネストされた条件のクエリが制限されている**ため、複雑な検索が困難です。

#### ✅ 回避策：
- **データの設計を工夫**し、必要なクエリを可能にする
- **Cloud Functions を活用**して、複雑なフィルタリングを行う
- **複数のクエリを組み合わせる**
  ```python
  users_ref = db.collection("users")
  query1 = users_ref.where("age", "<", 30).get()
  query2 = users_ref.where("city", "==", "Tokyo").get()
  combined_results = query1 + query2
  ```

---

### 2.3 インデックス制限の罠
#### ❌ 落とし穴：
Firestoreでは、すべてのクエリには**インデックスが必要**ですが、特定のフィールドの組み合わせでエラーが発生することがあります。

#### ✅ 回避策：
- **エラーメッセージに従って、手動でインデックスを作成**
- **不要なインデックスを削除し、コストを削減**
  ```python
  # Firebase Console > Firestore > インデックス から設定可能
  ```

---

### 2.4 トランザクションの罠
#### ❌ 落とし穴：
Firestoreは基本的にACIDトランザクションをサポートしていますが、**ネストされたコレクションを含む場合、トランザクションが制限される**ことがあります。

#### ✅ 回避策：
- **可能な限りフラットなデータ構造を設計**
- **バッチ処理 (`batch.commit()`) を活用**
  ```python
  batch = db.batch()
  doc1 = db.collection("users").document("user_1")
  batch.set(doc1, {"active": True})
  batch.commit()
  ```

---

### 2.5 書き込み制限の罠
#### ❌ 落とし穴：
Firestoreには**1秒あたりの書き込み制限**があり、大量の同時書き込みが発生するとスロットリングが発生します。

#### ✅ 回避策：
- **データを分散**させ、一度に書き込む数を減らす
- **バッチ書き込み (`batch.commit()`) を活用**し、トランザクションの効率を向上
- **キューを使って順番に書き込み**

---

## 3. まとめ

Cloud Firestoreは強力なデータベースですが、**リクエスト課金、クエリ制限、インデックス制限、トランザクション、書き込み制限**などの落とし穴に注意が必要です。

| 落とし穴 | 回避策 |
|----------|--------|
| 課金モデル | オフラインキャッシュ・データ設計の工夫 |
| クエリ制限 | クエリの組み合わせ・Cloud Functionsの活用 |
| インデックス | 必要なインデックスの設定・不要なインデックス削除 |
| トランザクション | フラットなデータ設計・バッチ処理の活用 |
| 書き込み制限 | データ分散・キューを活用 |

Firestoreを使用する際は、これらのポイントを理解し、最適な設計と運用を行うことが重要です！
【AtCoder】ダイクストラ法の使用するタイミング＆テンプレート

## 初めに
ダイクストラ法のテンプレートを作成しました。私自身、ダイクストラ法の問題にあたった経験は少なく、今後解く問題次第ではコードを改良する場合があります。

今回ダイクストラ法のテンプレートを作った理由ですが、使用するリストが多く実装に手間取ったからです。さらに時間制限の都合上AtCoderの問題では ${O(NlogN)}$のダイクストラを実装する必要のある場合が多く（${O(N^2)}$ のダイクストラもありますがこれだと時間が間に合わない）そのためにはヒープなど考える必要がありますが慣れていなくて面倒だったからです。

## ダイクストラ（ヒープ使用）のテンプレート
```python:dijkstra.py
import heapq

#必要な物：ノード数、テーブル（重み,ノード番号）、スタート、終了
def dijkstra(n,table,start,finish):
    visit = [False]*(n+2) #訪問行列
    length = [float("inf")]*(n+2) #startから各ノードまでの最短経路の長さ
    
    #準備＝＝＝＝＝＝＝＝＝＝
    length[start]=0#スタートの長さは０
    hp = []#未訪問の最短経路を記録
    heapq.heappush(hp,(0,start))#（0,start）＝（重み、ノード番号） #スタートを追加
    #＝＝＝＝＝＝＝＝＝＝＝＝
    
    
    while(hp):
        w,x = heapq.heappop(hp)
        
        if(visit[x]==True):
            #既に訪問が完了しているノードなので以下の操作は行わない。continueする。
            continue
        visit[x]=True
        
        for l,y in table[x]:
            if(not visit[y] and (length[y]>w+l)):
                length[y]=w+l
                heapq.heappush(hp,(length[y],y))
    
    #return length[n] #ノードnまでの最短経路を返す場合
    #return length #各ノードの最短路の長さを返す場合
```

引数は、**dijkstra( ①ノード数 , ②テーブル , ③開始地点 , ④終了地点 )** テーブルは二次元リストであり、table[1]には、「ノード1と繋がっている（ノード１から移動できる）ノードの情報（移動の際に通る辺の重みなど）」が記録されています。
上のコード文では、必要に応じて戻り値を複数指定してあります。（コメントアウトしてあります。）

## ダイクストラ法を使用するタイミング
私自身解説を見て初めてダイクストラ法で解ける問題であることを知る場合がほとんどでした。下２問はダイクストラで解けることに私が気づかなかった問題です。

ABC340 D問題

https://atcoder.jp/contests/abc340/tasks/abc340_d

ABC192 E問題

https://atcoder.jp/contests/abc192/tasks/abc192_e

この問題を解いた当時は、問題文を読んで「あ、これダイクストラ法だ」と瞬時に判断できることは**難しい**と感じました。上の２問から判断した、ダイクストラ法を見破るためのポイントを下にまとめます。（このポイントは自分の精進によって、変更される可能性があります。）

・グラフを使いそうなとき
・**最短経路**を知りたがっているとき（←これ大事なのではないか）
・グラフが有向グラフであるとき（無向でも良いが訪問行列を作る）
・辺に重みが関わっているとき（←重みが全て１の時もあった。）

これを書いているときに「BFSと指定されている問題でダイクストラ使えるのではないか？」と思って手を付けてみたら、ダイクストラは最短経路を求める物ということに気づきました。

## 結論

**辺に重みが存在していて、(全部重み１とかになっていることもある。)最短経路が絡んでいるときはダイクストラ法です。**

中々目にすることも少ない気がしますが、珍しいからこそコンテストで遭遇したときは確実に獲りたいです、
【備忘録】VSCodeでSSH接続できなくなったときに試したこと

# はじめに

VSCodeを使ってリモートのサーバーにSSH接続して開発を行っていると，突然SSH接続ができなくなることがあります．本記事では，SSH接続ができなくなった際に試した解決策を備忘録としてまとめます．

# 症状

- VSCodeからSSH接続を試みるとエラーが発生する．
- コマンドライン（ターミナル）から `ssh` コマンドを使うと接続できる．

この場合，VSCodeの設定やリモートサーバーの環境に問題がある可能性が高いです．

# 試した対処法

## 1. `.vscode-server` ディレクトリのリセット

VSCodeのRemote-SSH拡張機能が使用する `.vscode-server` ディレクトリに問題があるのかもと思い，これを削除して再作成してみました．

####  `.vscode-server` ディレクトリを削除
```bash
sudo rm -rf ~/.vscode-server
```

####  `.vscode-server` ディレクトリを再作成

```bash
mkdir ~/.vscode-server
```

#### パーミッションの設定（777ではなく，775でもいいかも）

```bash
sudo chmod 777 ~/.vscode-server
```

### 2. ディスク容量の確認

1をしてだけではだめだったので，次にしたことです．

ディスクの空き容量が不足していると，VSCodeのリモートサーバー関連の処理が正常に動作しないことがあります．空き容量を確認し，不要なデータを削除します．

#### ディスク使用状況の確認

```bash
df -h
```

#### 出力例（ディスク容量が不足している場合）

```
Filesystem      Size  Used Avail Use% Mounted on
/dev/nvme0n1p2  916G  881G     0 100% /
```

上記のように `Use%` が100%になっていると，空き容量がなくなっています．

#### 不要なデータを削除

私直近で大規模なデータをダウンロードしていたので，それが原因だったようです．
ディスクを圧迫している可能性があります．不要なファイルを削除し，容量を確保します．

#### 再確認（空き容量が確保されたか確認）

```bash
df -h
```

#### 出力例（空き容量が確保された場合）

```
Filesystem      Size  Used Avail Use% Mounted on
/dev/nvme0n1p2  916G  836G   34G  97% /
```

### 3. VSCodeからSSH接続を再試行

ディスク容量を確保し，`.vscode-server` の設定をリセットした後，VSCodeから再度SSH接続を試みます．

結果，無事にSSH接続できるようになりました．

## まとめ

VSCodeでSSH接続ができなくなった場合，以下の点を確認することで解決できる可能性があります．

1. `.vscode-server` ディレクトリのリセット
2. ディスク容量の確認と不要なデータの削除
3. 再度VSCodeからSSH接続を試す
ClosedXmlでセルの名前指定

# はじめに
ClosedXmlを使ってExcel出力を行っています。

https://qiita.com/masayasu_t/items/08cb5ce9cf88a6254ad1

出力ファイルのレイアウト変更を容易に行えるよう、テンプレートシートのセルに名前を付けてプログラムで指定しようと思います。

# 作ってみる
こんな感じのテンプレートを用意します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779420/93891361-71bd-45af-8662-e7bbb24ebb0c.png)

このテンプレートシートをコピーして、コピーしたシートに値を代入します。
```c#:ClosedXml
IXLWorksheet templateSheet = workbook.Worksheet("テンプレート");
IXLWorksheet worksheet = templateSheet.CopyTo("出力シート001");

worksheet.Cell("学籍番号").Value = "XXXX-YY-ZZZ";
worksheet.Cell("氏名").Value = "佐藤　太郎";
```
すると、以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779420/d7cd767f-5763-4092-8358-15366ba86d7a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779420/479e8b4d-4412-407a-b512-fe03936b9b4b.png)

こうなって欲しかったのに思ってたのと違う…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779420/1cd60195-2e91-496a-8381-66890b959604.png)

### :thinking:なぜだろう

ClosedXmlでコピーしたシートの名前定義を見てみると、シート範囲の定義のみがコピーされました。Excelでコピーした場合と仕様が異なるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779420/5cfe995c-44e5-484f-9907-abcafcd81085.png)
その為、テンプレートの「学籍番号」と出力シート001の「氏名」に値が入っていました。
つまり、ClosedXmlでテンプレートを使う場合はシート範囲で名前を定義する必要があります。

すると、思った通りにできました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779420/1cd60195-2e91-496a-8381-66890b959604.png)


# 参考
Excelでコピーしたシートの名前の定義について

https://qiita.com/masayasu_t/items/5d4cf9e5a2d66f4293de
[Poke-Pro]PC-G850のBASICで対数関数を拡張する

# [新企画]Poke-Pro
新企画`Poke-Pro`では、ポケコンで作成したプログラムを投稿していく企画です。シリーズとなります。BASIC言語に軸を置き、気まぐれでC言語にも触れていきます。

## はじめに
こんにちは、bockringです。シリーズ投稿の2本目は、対数関数を拡張します。

## 目標と妥協点
まず目標です。以下の点を実装します。
- 対数関数の拡張(底を$10$と$e$以外に対応させる)
- 対話形式の入力
- 1行のコードで作成

逆に妥協点は、
- `logab(a,b)`関数への表示埋め込み

です。これらを踏まえて実装します。

## 実装
今回もBASICで作成します。1行コードなので、`:`を多用します。

```basic:logab.TXT
10 CLS :PRINT "[logab(a,b) Calc]":PRINT "Input a(Base)":INPUT "[A]",A:PRINT "Input b":INPUT "[B]",B:PRINT "logab=",(LN B)/( LN A)
```

この様になります。これを通常のコードに噛み砕くと、以下の様になります。

```basic:logab.TXT
10 CLS 
20 PRINT "[logab(a,b) Calc]"
30 PRINT "Input a(Base)"
40 INPUT "[A]",A
50 PRINT "Input b"
60 INPUT "[B]",B
70 PRINT "logab=",(LN B)/( LN A)
```

このようになります。非常に単純なコードですが、これで毎回公式に当てはめて入力する必要がなくなります。

実行結果は以下の様になります。

```:Shell
[logab(a,b) Calc]
Input a(Base)
5
Input b
3
logab=6.82606E-01
>
```

最終の桁数が物足りないですが、`ANS`レジスタに保存されているので、実行画面で`ANS`キーを押すとフルの桁数の解が呼び出されます。この場合、`6.826061945E-01`です。

## 改善点
- 特になし

といったところです。満足いってます。

## おわりに
なかなか上手くいったと思います。これだけで対数が出せるなら使うと思います。

---

シリーズ記事の一覧

https://qiita.com/bockring/private/0cc7d2fbbdad53b25c1b

---
ラジオ波線インテグレーテッドサーキット(RFIC)の概要

ラジオ波線インテグレーテッドサーキット(RFIC)は、スマートフォンから衛星通信まで、現代の無線通信システムの核心となる要素です。これらの高専門チップは、高周波信号を最小のノイズで処理し、効率的な電力消費を実現するよう設計されています。アンプなどの必須要素を一つのチップに結合することにより、無線通信技術に革新をもたらし、現代のコネクティビティに必要不可欠な要素となっています。

![rfic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4026686/8477d2e8-5b5c-40a3-aad9-d6dfffe46b60.png)


ラジオ波線インテグレーテッドサーキット(RFIC)とは何か?

ラジオ波線インテグレーテッドサーキット(RFIC)は、無線通信を実現するための小型の電子因子です。CMOS技術を利用し、アンプ、ミキサー、オシレーター、モジュレーターなどの重要な要素を一つのチップに結合しています。発信と受信機能を搭載したデバイスや無線ルーターに活用され、現代のネットワーク技術の核心となっています。

RFICの主な要素

RFICは以下のような重要な要素を含みます。

低ノイズアンプリファイア(LNA): 弱信号を増強しながら、ノイズを最小化する。

ミキサー: 入力信号を局所作成信号と混合し、新しい周波数を生成する。

パワーアンプリファイア(PA): 信号の出力を増強し、遠くまで送信可能にする。

トランシーバ: 送信と受信を組み合わせたチップで、電波通信を実現する。

RFICの特徴

高周波対応: MHzからGHzの幅広い周波数で操作可能。

低ノイズ、高増強: 信号質を向上させ、通信の精度を高める。

省電力設計: エネルギー効率が高く、バッテリー駆動のデバイスに適している。

小型・軽量: 一体化設計により、デバイスのコンパクト化が可能。

RFICの応用分野

RFICはさまざまな分野で活用されています。

スマートフォンとタブレット: 高速通信を実現するための主要コンポーネント。

Wi-FiおよびBluetoothデバイス: ワイヤレス接続を可能にする中核技術。

自動車レーダーシステム: 衝突回避や自動運転支援に活用。

IoTデバイス: 低消費電力で広範なネットワーク接続を提供。

衛星通信: 高精度な通信システムを支える。

まとめ

RFICは、現代の無線通信技術の進化を支える重要な技術要素であり、スマートデバイスから産業用途まで幅広く応用されています。高周波対応、低ノイズ、省電力設計などの特性により、今後も通信技術の発展において不可欠な役割を果たすでしょう。
【2025年版】Wordpressでデバッグする時に wp-config.php に設定すべきもの

ずばり　これなの

```php:wp-config.php
if(1) {
	// 必ず必須
	define('WP_DEBUG', true);

	// デバッグログを出力する
	define('WP_DEBUG_LOG', true);

	// 画面に出力する
	define('WP_DEBUG_DISPLAY', true);
	ini_set('display_errors', 1);

	// 非奨励関数を使用するとき
	define('SCRIPT_DEBUG', true);
	define('SAVEQUERIES', true); // SQLクエリのログを記録
}
```

## if(1) { ～ } をつける理由

これをつけることにより、0 にするだけで簡単にデバッグ環境を止めることができます

これ以外のものはコメントアウトして対応してください
GPOについて

# GPOとは
ActiveDirectory環境においてコンピューターやユーザーの設定を一元管理するための仕組み

# GPO適用範囲
### ローカルグループポリシー
そのPC単体に適用されるポリシー
### サイトレベルのGPO
ADのサイト（物理的なネットワーク単位）に適用
### ドメインレベルのGPO
ドメイン全体に適用されるポリシー
### OU（組織単位）レベルのGPO
特定のOUに所属するユーザーやコンピューターに適用

# GPOの適用順序
GPOは下記の順で適用され、後のポリシーが優先される
OUのGPOが最も優先されるためOU単位で細かい設定を適用可能
1.ローカルポリシー（PC単体）
2.サイトのGPO
3.ドメインのGPO
4.OUのGPO

# GPOとOU
GPO：グループポリシー
ユーザーやコンピューターの設定を管理・制御するためのポリシー

OU：組織単位
ActiveDirectory内でユーザーやコンピューター、グループを整理・管理するための「フォルダ」のようなもの
【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/)
***
　では、【本題】です。

　今回は、
　　課題を
　　　第一原理の考え方で
　　　　紐解くPromptです。

　サム・アルトマンが
　　GPT-4.5に対してした質問を
　　　参考にしました。
　　　　[サム・アルトマンポスト](https://x.com/sama/status/1896651354648818121?t=NZ23a3dGwHJyWlJIwEzU1g&s=19)

　ポストでは
　　“first principles”という言葉が
　　　出てきました。

　これが
　　“第一原理”ですね。

　では、
　　“第一原理的な考え方”とは
　　　どういう考え方なのでしょうか？

***（ChatGPT）***
**「第一原理の考え方」**とは、物事を根本から捉え、最も基本的な前提や法則に立ち戻って思考する方法です。これは、すでに確立された概念や常識にとらわれず、問題を最も基本的なレベルまで分解し、そこから論理的に組み立て直すアプローチを指します。

### **第一原理思考のポイント**
1. **前提を疑う**  
   - 一般的に信じられていることをそのまま受け入れず、本当に正しいのかを問い直す。
  
2. **物事を最小単位に分解する**  
   - 問題を構成する要素を根本的な法則や性質まで分解し、本質的な部分を理解する。
  
3. **ゼロベースで組み立てる**  
   - 既存の方法ではなく、基本的な要素から新しい解決策を論理的に導き出す。

### **具体例**
（割愛）

### **第一原理思考と類似の考え方**
- **帰納法・演繹法と違う点**：  
  - 帰納法：過去のデータや経験から一般法則を導く  
  - 演繹法：既存の理論やルールを使って結論を導く  
  - 第一原理思考：過去の経験やルールに頼らず、根本原理から考え直す

- **アナロジー思考（類推思考）との違い**：  
  - アナロジー思考：過去の成功例や他の分野の事例を応用する  
  - 第一原理思考：過去の事例を基にせず、一から論理的に構築する

### **第一原理思考の活用**
第一原理思考は、以下のような場面で有効です。
- **イノベーションの創出**（従来の常識を打ち破る）
- **問題解決**（根本的な原因を突き止める）
- **意思決定**（本質的な要因を見極める）

この思考法を身につけることで、固定観念にとらわれず、より本質的で創造的なアプローチが可能になります。
***

　“前提を疑う”というのは
　　ふつうの人ならば、
　　　なかなかできないものです。

　でも、そこを崩せば、
　　やりたいことは
　　　意外と簡単なのかもしれません。
***
　こちらが、そのPromptです。
　　＊＊＊に課題を入力して、
　　　送信してください。
```Text:第一原理的な考え方による課題解決Prompt
ChatGPTの第一原理的な考え方に基づくと、「＊＊＊」は？
```

　私は試しに
　　「売れるラノベ小説の書き方」
　　　と入れました。

　別にそこまで
　　売れることを
　　　欲していませんけど😅

　結果は、
　　“売れる”から
　　　“読者の求めるもの”と考え、
　　　　そこから必要な要素を
　　　　　書き出してくれました。

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

　今回は、ここまで。
日本におけるOSS開発者の現状と改善の課題


**オープンソースソフトウェア（OSS）** は、現代のITインフラから産業基盤に至るまで欠かせない要素です。OSSの普及と発展は、技術の共有とオープンなコミュニティ運営によって進められますが、その背後にいるOSS開発者の持続可能性や活躍の場の確保は課題として残されています。特に日本では、OSS開発者が少なく、フルタイムでOSS活動を行う人材の育成や支援が進んでいないのが現状です。

本記事では、OSS開発者の主な収益源、日本と海外のOSS開発における経済的・文化的違い、日本でOSS開発が広がらない背景、そしてそれを克服するための方向性について深掘りしていきます。

---

## 1. OSS開発者の収入モデル

OSS開発者は、以下のような多様な方法で生計を立てています。

### 1.1. **企業支援と雇用**
多くのOSS開発者は、企業に雇用される形でOSSプロジェクトに従事しています。例えば、GoogleやMicrosoftといった企業では社員がOSS貢献に時間を費やすことを許可しており、OSS活動が業務の一環となっています。また、企業がスポンサーとしてOSSプロジェクトに直接的な資金を提供する「Open Source Program Office (OSPO)」などの専門組織も注目されています。

### 1.2. **寄付プラットフォーム**
個人のOSS開発者は**GitHub Sponsors** や **Patreon**、**Open Collective** といった寄付プラットフォームを利用できます。例えば、「Vue.js」の開発者 Evan You 氏は Patreonで月額約16,500ドル（約180万円）を集めており、OSS活動専念の環境を確立しました。

### 1.3. **クラウドファンディング**
OSSプロジェクトの立ち上げや機能改善には **Kickstarter** などのクラウドファンディングが利用されます。例えば「Font Awesome 5」はKickstarterで約1.1億円を調達し、OSS開発の成功事例となっています。

### 1.4. **サポートビジネスやSaaSモデル**
Red Hat社などはOSSを基としたエンタープライズサポートやトレーニングを提供することで収入を得ています。また、GitLabのようにOSSをサービスとして提供する**SaaS（Software as a Service）モデル**が成り立つ場合もあります。

---

## 2. 日本と海外におけるOSS開発の違い

OSSは急速に普及していますが、日本と海外では文化的・経済的な違いがあります。

### 2.1. 政府支援の格差
米国や欧州ではOSS開発が国家規模で支援されています。例えばEUの「欧州OSS戦略2020-2023」では、OSSを公共システムの重要要素と位置付け、政府主導でセキュリティ監査や研究資金の提供が行われています。一方、日本では政府の取り組みや予算措置が限られており、IPA（情報処理推進機構）による啓発活動程度に留まっています。

### 2.2. 企業文化の違い
欧米の企業では「OSSへの貢献＝競争力向上」と捉える考えが一般的です。OSSを戦略的に活用しつつ、従業員のOSS活動を評価する仕組みを整えています。一方で多くの日本企業では、OSSへの貢献が個人の努力に任されており、評価指標に組み込まれるケースはまだ少数です。

### 2.3. 社会的評価の差
OSSに対するエンジニアの評価も温度差があります。海外ではOSS活動が採用やキャリアアップで高く評価されますが、日本ではそれがほぼ評価されない風潮があり、OSS開発者のモチベーション低下につながっています。

---

## 3. 日本でOSS開発が広がらない理由

日本においてOSS開発者が少ない背景を、3つの観点から整理します。

### 3.1. **文化的要因**
- 副業や社外活動が「本業への忠誠心が低い」と捉えられやすい企業文化
- 国際プロジェクトでの言語・発信力不足
- 「OSSは無料で使えるものである」という固定概念

### 3.2. **経済的課題**
- OSSへの寄付を企業会計システムが認めないケースが多い
- 優れたプロジェクトでも十分な収益化が難しい市場構造

### 3.3. **教育と制度の未発展**
- OSS開発を推奨する教育カリキュラムが不足
- OSSスキルを評価する企業制度の未整備

---

## 4. 改善提案：OSS開発者を増やすために

### 4.1. **政府主導の支援**
OSSを国家的なインフラとして位置付けるための戦略立案が緊急課題です。
- **OSSプロジェクト支援基金** の創設
- **政府調達にOSSを優先採用** する方針の徹底
- OSS開発者に奨学金や助成金を提供

### 4.2. **企業文化の構築**
日本企業にOSS活用の価値を理解させ、以下のような制度整備を推奨します。
- 社員のOSS活動を評価するためのガイドライン作成
- 従業員がOSS活動を行いやすい勤務環境の整備（勤務時間充当、寄付支援など）

### 4.3. **教育機関による人材育成**
- 学生がOSSプロジェクトにコントリビュートする課題を授業に取り入れる
- OSS関連のハッカソンやコンテスト開催

### 4.4. **成功事例の発信**
国内外の成功事例を紹介し、「OSSで成功するキャリア」のモデルを提示します。
Rubyの成功や、SaaSを構築したOSSプロジェクトを頻繁に取り上げることが有効です。

---

## 5. 成功する未来に向けて

OSSが重要な技術基盤であることは今や疑いようがありません。日本におけるOSSの課題を解決し、企業と開発者双方が恩恵を享受できる環境を作ることが欠かせません。

### 理想像：
- フルタイムOSS開発者が増加し、経済的にも社会的にも報われる環境
- 日本発のOSSプロジェクトが世界を牽引する
- 企業がOSSによる競争力向上を実現

これらの目標を達成するために、政府・企業・教育機関そして個々のコミュニティが協力し、オープンイノベーションを推進する時期が来ています。

---

**参考資料**
- [2024 オープンソースソフトウェア資金提供レポート - The Linux Foundation](https://www.linuxfoundation.jp/publications/2025/01/open-source-funding-2024-jp)
- [開発者のOSS活動を評価する文化を創る - CodeZine](https://codezine.jp/article/detail/20610)
- [趣味だったOSS活動で収入を得られるようになるまで - Findy Engineer Lab](https://findy-code.io/engineer-lab/sosukesuzuki)
如果excel中有重复的数值，高亮显示

「ホーム」ー＞「条件付き書式」ー＞「セルの強調表示ルール」ー＞「重複する値」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/11b2675e-0c2f-46c9-9f19-836a3db1cd4d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/60f8de00-f097-483e-b183-4b2a994f0d8b.png)
Nextjsをvercelに上げたらでたエラーその1: シングルクォート　

vercelでいくつかアプリを上げてきましたが
相当な頻度でエラーが起きたので備忘録で書きます
基本eslintを使用しているのでそのせいかもしれませんが

# エラー内容
```sql
Failed to compile.
./src/app/account/page.tsx
20:30  Error: ' can be escaped with &apos;, &lsquo;, &#39;, &rsquo;.  react/no-unescaped-entities
info  - Need to disable some ESLint rules? Learn more here: https://nextjs.org/docs/app/api-reference/config/eslint#disabling-rules
Error: Command "npm run build" exited with 1
```

# エラー理由
このエラーは、ESLintのルールに基づいて、コード内に不正な引用符（'）がそのまま使われているため発生しています。特に、HTMLやJSXで直接シングルクォート（'）が使われると、react/no-unescaped-entitiesというルールが警告を出します。このルールを回避するために、シングルクォートをエスケープする必要があります。

# 解決方法

```tsx
<h1>
  {session.user.name}さんのアカウント
</h1>

```

このように、「さん」の後のシングルクォートが原因になることがあります。これをエスケープすることでエラーを回避できます。
修正方法： シングルクォートを&apos;に変えることでエラーを防げます。
例えば、「さん」のアカウントの部分を以下のように修正します。

```tsx
<h1>
  {session.user.name}&apos;さんのアカウント
</h1>
```

# 強引な方法

もしくは、単にESLintの設定を変更して、このルールを無効化することもできます。next.config.jsに以下を追加することで、エラーを無視する設定ができます。

```javascript
module.exports = {
  eslint: {
    ignoreDuringBuilds: true,
  },
}
```
MetaGPTでGemini 1.5 Flash 8bを使用する方法

## はじめに
MetaGPTは強力なAIエージェントフレームワークですが、デフォルトではGeminiモデルが「gemini-pro」にハードコードされています。この記事では、無料で長いコンテキストが使える「gemini-1.5-flash-8b」を設定ファイルから指定できるように修正する方法を紹介します。

## 問題点
MetaGPTのコードを確認すると、`provider/google_gemini_api.py`ファイルの中で、Geminiモデルが以下のようにハードコードされていることがわかります：

```python
def __init__(self, config: LLMConfig):
    self.use_system_prompt = False  # google gemini has no system prompt when use api
    self.__init_gemini(config)
    self.config = config
    self.model = "gemini-pro"  # so far only one model
    self.pricing_plan = self.config.pricing_plan or self.model
    self.llm = GeminiGenerativeModel(model_name=self.model)
```

これでは、設定ファイルでモデルを変更することができず、無料で長いコンテキストが利用できる「gemini-1.5-flash-8b」を利用できません。

## 解決方法
以下のように、ハードコードされた「gemini-pro」を設定ファイルから読み込むように修正します：

```python
def __init__(self, config: LLMConfig):
    self.use_system_prompt = False  # google gemini has no system prompt when use api
    self.__init_gemini(config)
    self.config = config
    self.model = config.model or "gemini-pro"  # デフォルトはgemini-proだが、設定ファイルで上書き可能
    self.pricing_plan = self.config.pricing_plan or self.model
    self.llm = GeminiGenerativeModel(model_name=self.model)
```

この修正により、設定ファイル（`~/.metagpt/config2.yaml`）で「gemini-1.5-flash-8b」を指定できるようになります。

## 実際の修正手順
1. MetaGPTのインストールディレクトリを確認します
   ```bash
   pip show metagpt | grep Location
   ```

2. `google_gemini_api.py`ファイルを編集します
   ```bash
   # Windowsの場合
   notepad <インストールパス>/metagpt/provider/google_gemini_api.py
   
   # Linuxの場合
   nano <インストールパス>/metagpt/provider/google_gemini_api.py
   ```

3. 53行目付近の`self.model = "gemini-pro"`を`self.model = config.model or "gemini-pro"`に変更します
4. ファイルを保存して閉じます

## Gemini 1.5 Flash 8bの特徴
「gemini-1.5-flash-8b」モデルには、以下の特徴があります：

- **無料で利用可能**：Google AI Studioで無料枠として提供
- **長いコンテキスト**：最大128Kトークン（約10万単語）を処理可能
- **高速処理**：軽量設計のため、レスポンスが速い
- **高い頻度**：1分あたり最大60リクエスト可能

この無料モデルは、通常有料のような長いコンテキスト処理が可能で、MetaGPTのようなエージェントフレームワークで特に有用です。

## 設定ファイルの例
以下は、gemini-1.5-flash-8bを使用するための設定ファイルの例です：

```yaml
llm:
  api_key: "YOUR_GEMINI_API_KEY"
  api_type: "gemini"
  model: "gemini-1.5-flash-8b"  # 無料で長いコンテキストが使えるモデルを指定
  temperature: 0.3
  max_token: 4096
  timeout: 600
# グローバルプロキシ設定（必要な場合）
# proxy: "http://127.0.0.1:7890"
# ワークスペース設定
workspace:
  root: ""  # 空の場合、デフォルトのワークスペースが使用されます
# 言語設定
language: "Japanese"  # 出力言語を日本語に設定
```

## 利点
この修正により、以下のメリットがあります：

1. **無料で長いコンテキスト**：有料プランを契約せずに、長いテキストやコードを処理できる
2. **設定ファイルだけで変更可能**：コードを修正する必要がない
3. **コスト削減**：通常有料で提供される長いコンテキスト処理を無料で実現
4. **将来のモデル対応**：Googleが新しいモデルをリリースした場合も、設定ファイルの変更だけで対応可能

## まとめ
MetaGPTでGemini 1.5 Flash 8bモデルを設定ファイルから指定できるようにする簡単な修正方法を紹介しました。この修正により、無料で長いコンテキスト処理が可能になり、MetaGPTの費用対効果が大幅に向上します。

この小さな改善がMetaGPTコミュニティにとって役立つことを願っています。オープンソースプロジェクトへの貢献は、多くのユーザーにとって大きな価値をもたらすことがあります。
调整画面大小

按住ctrl＋「鼠标滚轮」即可出现下图右上角的调大小的东西。
按「リセット」之后变成100%
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/23ae8829-f4f1-4f1e-88ed-c28f95370245.png)
supabaseでデータベースの設定が上手くいかなかった話


この記事ではNextjsのsupabaseにおけるデータベース設定で起きたエラーについて書きます

# 起きたエラー　P1013

```sql
PS 当該フォルダ> npx prisma migrate dev --name init
>> 
Environment variables loaded from .env
Prisma schema loaded from prisma\schema.prisma
Datasource "db": PostgreSQL database

Error: P1013: The provided database string is invalid. invalid port number in database URL. Please refer to the documentation in https://www.prisma.io/docs/reference/database-reference/connection-urls for constructing a correct connection string. In some cases, certain characters must be escaped. Please check the string for any illegal characters.
````

# なぜ起きたのか？
内容から.envの読み込みより
supabaseからデータベースをアドレスをもってきましたが
そのままコピペしただけなのにどういうことか

プロジェクトの上部のconnectから
![db1-m.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754121/1c110971-13ae-4425-9fd2-725f754cbe76.png)

session poolerより
![db2-m.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754121/55d2a973-6620-4473-a804-1f373179d64f.png)

your-passwordの部分を自分のにしっかり変えて張り付けたのにも関わらず
```.env
# .envより
DATABASE_URL="postgresql://postgres.・・・・:[your-password]"
```


# 解決方法
パスワードの特殊文字をエンコードで解決しました。
なぜか特殊文字(@,#,!他)は適用外なので
下記のリンクでまるまる変換してなんとかしました。
https://tech-unlimited.com/urlencode.html
LLMで再び輝くキャリアと社会の未来


## はじめに

単調な毎日を繰り返していると、「情熱」をどこかで置き去りにしてしまったような感覚になることがあります。仕事に追われ、管理業務ばかりが増えたり、そもそも何のために働いているのか見失ってしまったり。

でも、今そんな状況にちょっと変化が起きつつあります。それが最新のLLM（大規模言語モデル）の登場です。これが意外なほど、僕らの働き方やキャリアのあり方を大きく変えようとしています。「一度失った情熱」を取り戻すきっかけになるかもしれません。

この記事では、LLMが各世代にどのような影響を与え、今後の社会やキャリアがどう変わっていくのか、一緒に考えてみたいと思います。

---

## 1. 現状の課題と「英雄」たちの沈黙

### 「英雄」が輝きを失う理由

かつて、現場で活躍していた専門家たちは、「英雄」のように情熱的に仕事をしていました。でも昇進や組織の変化で管理業務が増えると、専門性を発揮する機会はどんどん減っていきます。

結果として、書類や会議ばかりの日々になり、彼らの目の輝きが失われてしまった……そんな姿を見てきました。

---

## 2. LLMがもたらす「働き方」の変化

大規模言語モデル（LLM）という技術は、テキスト処理や情報分析を人間よりも早く正確に行えるAIの一種です。

- **面倒な仕事をスピーディーに**：書類整理や議事録作成などを短時間で終わらせてくれる。
- **知識の穴を埋める**：わからないことをすぐに調べて、意思決定を助けてくれる。
- **ずっと学び続けられる**：最新の情報を常にキャッチアップできる環境を整える。

つまり、LLMのおかげで余計な管理業務から解放され、自分が本当にやりたかった仕事に再び集中できるようになるんです。

---

## 3. 世代ごとにみるLLMのインパクト

### 3.1 ベテラン世代（50代〜70代）：『もう一度輝くために』

#### 今の課題：
- 管理ばかりで専門性を活かせない。
- 若手との距離感があり、新しい技術についていけない。

#### LLMがもたらす変化：
- 管理業務が減り、自分の専門分野に戻れる。
- 新しい技術やトレンドを簡単にキャッチアップできる。
- 過去の経験が再び評価され、「復活した英雄」として活躍の場が広がる。

#### 社会への影響：
- シニア世代が再び活躍し、多世代チームが当たり前になる。

---

### 3.2 ミドル世代（30代〜40代）：『スキルアップと新しい競争』

#### 今の課題：
- 管理職として現場業務も兼務し、忙しさに追われている。
- 昇進のためにはマネジメント能力が必須という固定観念がある。

#### LLMがもたらす変化：
- 管理業務から解放され、自分の専門スキルを磨く時間が生まれる。
- 若手やシニアとスキル面で対等に競い合えるようになる。
- 専門的な能力がキャリアを支える柱になる。

#### 社会への影響：
- 管理職の役割が「専門家型マネージャー」へとシフト。
- 生涯を通じてスキルアップが求められる時代へ。

---

### 3.3 若手世代（10代〜20代）：『専門性をいち早く身につける時代』

#### 今の課題：
- 経験不足から上の世代の指導が必要。
- 組織内の上下関係で負担が大きい場合がある。

#### LLMがもたらす変化：
- 上位世代の知識やノウハウを直接・即座に学べる。
- ルーチン業務をAIが担当し、自分の専門性を高める環境が整う。
- 年齢や勤続年数に関係なく、実力を正当に評価される社会になる。

#### 社会への影響：
- 若いうちから専門性が高い人材が増える。
- 早期にキャリアを加速させる人が多くなる。

---

## 4. 社会全体への影響とこれからの課題

### 全体的な変化
- 年齢や勤続年数ではなく、「能力とスキル」を重視する社会へ。
- 定年制や年功序列が崩れ、生涯現役時代が始まる。
- シニア世代の復帰により人材不足や高齢化社会の課題が緩和される。

### これから取り組むべきこと
- **教育の見直し**：LLMを活用できる人材を育てるための教育改革。
- **公平な評価制度の構築**：スキルや専門性を正当に評価できる仕組みづくり。
- **メンタルケアや支援制度の充実**：世代間競争やストレスを軽減するサポート体制。

---

## 5. 最後に：未来への一歩を今すぐに

LLMはただの効率化ツールではなく、僕たちが持つ可能性を最大限に引き出してくれる存在です。その恩恵はすべての人が享受できるものになるでしょう。

今こそ情熱を取り戻し、自分の得意分野で再び輝きましょう。LLMと一緒に新しい未来への一歩を踏み出す時です。

その未来は、もうすぐそこまで来ています。Enjoy!!
nginxログ集計

## 概要
nginxのaccess.logやerror.logから条件に応じて集計するコマンド一覧。
（サンプルとして記載しているログのIPアドレスやドメインは適当です。）

### access.log

対象の形式

```
0.136 - - 51.69.40.73 - - [29/Jan/2025:16:35:20 +0900] "GET /wp/wp-login.php HTTP/1.1" 200 3240 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36" "52.68.40.71"
```

#### ログファイルの行数

```
wc -l access.log
```

圧縮ファイルに対して行う場合

```
zcat access.log-20250221.gz | wc -l
```

#### 時間ごとにアクセス数を集計

60分ごとに集計する場合

```sh
cat access.log | awk -F'[][]' '{print $2}' | awk -F: '{printf "%s:%s:%02d\n", $1, $2, int($3/60)*60}' | sort | uniq -c
```

対象時間帯を10分ごとに集計する場合

```sh
cat access.log | awk -F'[][]' '{print $2}' | awk -F: '{printf "%s:%s:%02d\n", $1, $2, int($3/10)*10}' | sort | uniq -c
```

#### リクエストURLを集計

特定の特定の時間帯のトップ10を集計する場合

```sh
cat access.log | awk -F'"'  '{print $2}' | sort | uniq -c | sort -rn | head -n 10
```

クエリ文字を無視する場合

```sh
cat access.log | awk -F'"'  '{print $2}' | cut -d'?' -f1 | sort | uniq -c | sort -rn | head -n 10
```

#### リクエスト元ユーザーエージェント

```sh
cat access.log | awk -F'"'  '{print $6}' | sort | uniq -c | sort -rn | head -n 10
```

#### リクエスト元IP

```sh
cat access.log | awk -F'"'  '{print $8}' | sort | uniq -c | sort -rn | head -n 10
```

### error.log

```
2025/01/29 17:48:01 [error] 1026355#1026355: *755254 FastCGI sent in stderr: "; PHP message: PHP Warning:  Undefined variable $product_sub_text in /path/to/dir/test.php on line 26" while reading upstream, client: 66.249.64.103, server: aaa.test.jp, request: "GET /snap/1234/ HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "aaa.test.jp"
```

#### PHP Warningを集計

通常ファイルに対して行う場合

```sh
grep -oP 'PHP message:.*?(;|PHP message|upstream)' error.log | sort | uniq -c | sort -nr
```

圧縮ファイルに対して行う場合

```sh
zgrep -oP 'PHP message:.*?(;|PHP message|upstream)' error.log-20250110.gz | sort | uniq -c | sort -nr
```

#### PHP Fatal Errorを集計

通常ファイルに対して行う場合

```sh
grep -oP 'PHP Fatal error:(.*)' error.log | sort | uniq -c | sort -nr
```

圧縮ファイルに対して行う場合

```sh
zgrep -oP 'PHP Fatal error:(.*)' error.log-20250110.gz | sort | uniq -c | sort -nr
```
新しい環境を学ぶ際に役立つLLMへの質問方法


# はじめに

技術の習得には、主に公式ドキュメントやチュートリアルなどが役立ちますが、時にはそれだけでは深く理解するのが難しい場合があります。そんな時、**LLM（Large Language Models）** を活用することで、疑問を解消し、効率的に学ぶことができます。

この記事では、特に **"歴史的背景"** という観点で質問することで、技術を深く理解する方法をご紹介します。具体例として、Supabaseを学び始めた際やnpmのコマンドを実行する際の質問方法を取り上げながら解説します。

---

# 効率的に学ぶためのLLMへの質問のポイント

新しい技術の習得には次のようなステップを踏むのが効果的です。それぞれのステップで、LLMへの質問の仕方を工夫することで学習効率を上げられます。

## ステップ1: 基本的な質問をする

まずは疑問を直球で投げましょう。知らない状態から出発する際には、コマンドや機能を単に理解するための基本的な質問が有効です。

プロンプト：
```
このコマンドについて詳しく教えて。
npm install supabase --save-dev
```

LLMの回答:
> 
> `npm install supabase --save-dev` は、SupabaseのCLIツールをプロジェクトの開発依存関係としてインストールするためのコマンドです。 
> 
> Supabaseは、Firebaseのオープンソース代替として、リアルタイムデータベース、認証、ストレージなどのバックエンドサービスを提供するプラットフォームです。 このCLIツールを使用すると、ローカル環境でSupabaseの全スタックを実行したり、データベースのマイグレーションを管理したり、Supabase Functionsを作成・デプロイしたり、データベーススキーマから直接型を生成したり、管理APIへの認証付きHTTPリクエストを行うことができます。 
> 
> `--save-dev` オプションは、`supabase` パッケージを開発依存関係として `package.json` ファイルの `devDependencies` セクションに追加します。 これにより、本番環境ではなく、開発時にのみこのパッケージが必要であることを示します。
> 
> （中略）
> 
> これにより、ローカル環境でSupabaseの各種サービスを利用しながら開発を進めることができます。 

👀 上記に対して「なるほど...でも、--save-devのオプションが何をしているのか深く理解できない」と感じることがあります。

---

## ステップ2: 歴史や背景、仕組みを聞く

すでに普及している技術には、必ず「歴史的な背景」や「理由」があります。この背景を把握することで、コマンドや技術の目的だけでなく、「なぜそれがそうあるべきか」を理解しやすくなります。

`--save-dev` オプションを深掘りする場合、以下のような追加で有益な質問ができます。

プロンプト：
```
--save-dev の役割と歴史的背景を教えて。
```

LLMの回答:
> `--save-dev` オプションは、npmを使用してパッケージをインストールする際に、そのパッケージを開発環境専用の依存関係として `package.json` ファイルの `devDependencies` セクションに追加するためのものです。 
> 
> 開発依存関係（devDependencies）は、テストフレームワークやビルドツールなど、開発中にのみ必要なパッケージを指します。 これらは本番環境では不要であり、`devDependencies` にリストされているパッケージは、通常、本番環境でのデプロイ時にはインストールされません。
> 
> 歴史的に、npmのバージョン5.0.0以前では、パッケージをインストールしても自動的に `package.json` の `dependencies` セクションに追加されることはありませんでした。 そのため、開発者は `--save` オプションを使用して手動で依存関係を追加する必要がありました。 しかし、npm 5.0.0以降では、`npm install` コマンドを実行すると、デフォルトでパッケージが `dependencies` に追加されるようになりました。 一方、開発時のみ必要なパッケージを `devDependencies` に追加するためには、引き続き `--save-dev` オプションを使用する必要があります。
> 
> このように、`--save-dev` オプションは、開発環境と本番環境での依存関係を明確に分離し、プロジェクトの管理と保守を容易にするために重要な役割を果たしています。

🔎 ここで歴史的背景の説明を追加で聞くことで、`--save-dev` が単なるオプションである以上に「どういう経緯によって作られ、どんな役割を果たしているか」を理解できます。これにより、知識が単なる「使い方」ではなく「本質的な理解」へと進むわけです。

---

# 歴史的背景を聞く重要性

なぜ歴史的背景を聞くと学習効率が上がるのでしょうか。この理由には以下の点が挙げられます。

1. **「なぜこれがあるのか」が理解できる**
   コマンドの存在理由や仕様の背景が分かることで、表面的な「使い方」以上の理解が得られます。

2. **知識の文脈化が進む**  
   歴史的背景を理解することで、新しい技術や概念がどのような問題を解決するために生まれたのか、あるいは以前の技術に対してどのような改善を行ったのかという「文脈」が明確になります。

3. **記憶への定着度が高まる**  
   「ストーリー」や「背景情報」を伴ったほうがより強く記憶することができます。知識を単なる断片的な情報ではなく、一貫した物語として理解できます。

4. **問題解決能力が向上する**  
   技術的な課題に直面した際に、背景情報を理解していると、「なぜこの仕様なのか」「なぜこの機能が存在するのか」を元に考え、応用が効く解決策を考えやすくなります。

5. **技術選定や判断力が高まる**  
   新しいプロジェクトや技術選定の際に、「この技術が今後どのように進化する可能性があるか」や「既存の問題点やリスクは何か」をより正確に評価できます。結果として、将来的なトラブルを避け、より良い意思決定を行えるようになります。

---

# おわりに

たとえ「npmすら初心者」の段階であっても、LLMを活用して疑問点を「何をしているのか」だけでなく「なぜこうなったのか」「どうして必要なのか」といった歴史的背景まで聞くことで、効率的に学習を進めることができます。

まずは基本的な質問から始め、そこから補完的な情報や技術的な背景、さらには将来的な応用を見据えた質問を展開していくことで、Supabaseやnpmといったツールだけでなく、技術全般に対する理解が深まるはずです。ぜひ活用してみてください！Enjoy!!
Giteaで組織(Group)が持つリポジトリをまとめてクローンするスクリプト

# 環境

- Windows 10
- Python 3.9.7

# 準備

## モジュールのインストール

```bash
$ pip install requests
```

## アクセストークンの取得

Giteaのブラウザ上でサインインし、[設定] -> [アプリケーション]からトークンを生成する。

![スクリーンショット 2025-03-04 103201.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404447/4a8c1df1-ca29-4fc1-98bb-176fe199aa68.png)

# 作成したPythonスクリプト

```py: gitea_clone.py

import requests
import os
import subprocess

GITEA_URL = ""
ORG_NAME = ""
TOKEN = ""  # ここにアクセストークンを設定
CLONE_DIR = "./"

# 保存ディレクトリを作成
os.makedirs(CLONE_DIR, exist_ok=True)

def get_all_repos():
    repos = []
    page = 1
    while True:
        url = f"{GITEA_URL}/api/v1/orgs/{ORG_NAME}/repos?limit=50&page={page}"
        headers = {"Authorization": f"token {TOKEN}"}
        response = requests.get(url, headers=headers)

        if response.status_code != 200:
            print(f"Error: {response.status_code}, {response.text}")
            break

        data = response.json()
        if not data:
            break  # データが空なら終了

        repos.extend(data)
        page += 1  # 次のページへ

    return repos

def clone_repos():
    repos = get_all_repos()
    for repo in repos:
        clone_url = repo["clone_url"]
        repo_name = repo["name"]
        repo_path = os.path.join(CLONE_DIR, repo_name)

        if os.path.exists(repo_path):
            print(f"Skipping {repo_name}, already cloned.")
        else:
            print(f"Cloning {repo_name}...")
            subprocess.run(["git", "clone", clone_url, repo_path])

if __name__ == "__main__":
    clone_repos()

```

GiteaのURL, グループ名、アクセストークン、保存ディレクトリを適宜入力し、実行する。
rex0220 印刷屋プラグイン ボタン表示権限

rex0220 印刷屋プラグインで、見積書発行のボタンを表示する権限を設定します。

# 概要

印刷屋プラグインでは、帳票ごとにボタンを表示する権限を設定できます。
プラグイン設定画面で「権限」をチェックすると、権限を設定する項目が表示されます。
指定されたユーザー・ユーザー・組織・グループのみにボタンを表示します。
ゲストスペースの場合は、ゲストユーザーの指定が可能です。

![2025-03-04_09h59_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/87996ccb-9199-4392-bf88-3ce723e4bd19.png)

![2025-03-04_10h00_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/9f6b0ef9-a0f8-4aa6-9f21-1de8c7f57291.png)

# ゲストユーザーの設定

あらかじめ「ゲスト」ボタンをクリックして、指定するゲストユーザー情報の登録が必要です。

![2025-03-04_10h07_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/289bbd3d-eb82-4972-91f4-c82d345f89e6.png)

![2025-03-04_10h19_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/6bcbba14-fcf3-423f-8f65-b3a43722ed40.png)