OmniAICreator/Qiita-1.07M huggingface dataset:
AIツールが開発者のモチベーションに与える影響とは？JetBrainsの心理学的アプローチ

![ChatGPT Image 2025年6月20日 12_40_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3978583/32a590f2-5b23-44c7-8081-edd57e0d721d.png)


##  はじめに

みなさんこんにちは。JetBrains公式代理店NATTOSYSTEMの私です。


JetBrainsの研究チーム（DXおよびHAX：Human-AI eXperience）は、AIツールが開発者の**動機づけ**や**ウェルビーイング**に与える影響を調査しています。本記事では、従来の「生産性中心」の視点ではなく、**心理的ニーズ**に着目した分析をまとめました。
参照：[Software Developers on AI: Insights and Opportunities (JetBrains Blog)](https://blog.jetbrains.com/research/2025/06/software-developers-on-ai/)

---

## 理論的枠組み：自己決定理論（Self-Determination Theory, SDT）

SDTでは、人間が内発的に動機づけられるために以下の3つの基本的な欲求を満たす必要があるとされています：

- **自律性（Autonomy）**：自分で意思決定できる感覚  
- **有能感（Competence）**：スキルが認められ、上達しているという感覚  
- **関連性（Relatedness）**：他者とのつながり、協調性を感じること

JetBrainsはこの理論を、開発者とAIツールとの関係設計に応用しています。

---

## 開発者がAIに期待するもの

JetBrainsの調査によれば、開発者がAIに望むのは「困難な課題の解決」よりも「**繰り返しの多いタスクの自動化**」です。特に次のような期待が確認されました。

| ニーズ                         | 具体的なAIへの期待 |
|------------------------------|------------------|
| 自律性（Autonomy）            | カスタマイズ可能な補完、提案のオンオフ制御 |
| 有能感（Competence）         | 学習を支援する丁寧な補助、エラー説明 |
| 関連性（Relatedness）         | チームで共有できるAI知識、協調的な作業補助 |

例として、コードの自動生成、テストコードの補完、レビュー支援などがよく挙げられました。

---

##  デザインスペースの提案

JetBrainsは、AIが開発者の心理的ニーズを満たすための**設計視点**を複数提案しています：

- **補完品質のモード選択**（厳密／創造的）  
- **提案の透明性**（なぜその提案をしたのか）  
- **ユーザーによる操作制御**（どこを任せ、どこを自身で行うか）

これにより、AIが「押しつけがましい」存在になることを避け、開発者の主体性を保ちます。

---

## 関連プロジェクトと取り組み

JetBrainsでは以下のような研究・製品を通して、AIの効果的な活用を模索しています：

- **Human-AI eXperience (HAX)**：開発者がAIをどのように受け入れるかの研究  
- **Mellum**：コード補完に最適化されたLLM  
- **Junie**：コードを能動的に読み進める「AIエージェント」  
- **Context Collection Competition**：補完に必要な「文脈情報」の抽出法を競うイベント

---


## まとめ


私たちが今後AIを業務に取り入れる際、ただ便利なツールとして見るのではなく、**自分自身やチームの価値観に沿った使い方**を考えることが求められるのではないでしょうか。

---

## 参考リンク

- [Software Developers on AI: Insights and Opportunities](https://blog.jetbrains.com/research/2025/06/software-developers-on-ai/)
- [HAX（Human-AI eXperience）](https://research.jetbrains.org/hax/)
- [Mellum: JetBrains LLM](https://blog.jetbrains.com/blog/2024/10/17/introducing-mellum/)
- [Context Collection Competition](https://blog.jetbrains.com/research/2024/11/29/context-competition/)



##  JetBrains製品の最新情報を公式Xで投稿しています！


 **公式X - [Nattosystem](https://x.com/nattosystem)**  



---

> 📝 この記事は一部AIによって要約・編集されたものです。
【Python】例外処理の構文

```python:例外処理の構文
try:
    例外が発生する可能性のある処理
except 捕捉したい例外クラス:
    例外が発生したときの処理
else:
    try節で例外が発生しなかった場合のみ実行される処理
finally:
    例外の発生有無にかかわらず必ず実行される処理
```

## 参考文献
Pythonエンジニア育成推進協会監修 Python実践レシピ 単行本（ソフトカバー） – 2022/1/19
鈴木 たかのり (著), 筒井 隆次 (著), 寺田 学 (著), 杉田 雅子 (著), 門脇 諭 (著), 福田 隼也 (著)
p.042
NestJS + TypeORMでSQLタイムアウトを設定

## NestJS + TypeORMでSQLタイムアウトを設定

NestJS + TypeORMでSQLタイムアウトを設定するには、TypeORMのデータベース接続オプションでタイムアウト値を指定します。

```javascript
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql', // または 'postgres'
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: 'password',
      database: 'test',
      entities: [__dirname + '/**/*.entity{.ts,.js}'],
      synchronize: true,
      // タイムアウト設定（MySQL/MariaDBの場合）
      connectTimeout: 10000, // 接続タイムアウト（ミリ秒）
      // クエリタイムアウト（MySQLはサポートしていませんが、PostgreSQLは下記のように設定可能）
      // statement_timeout: 10000, // PostgreSQLの場合（ミリ秒）
    }),
  ],
})
export class AppModule {}
```

## 2. PostgreSQLでクエリタイムアウトを設定する場合

```javascript

TypeOrmModule.forRoot({
  type: 'postgres',
  // ......
  statement_timeout: 10000, // クエリタイムアウト（ミリ秒）
}),

```
## リポジトリで個別にタイムアウトを設定したい場合

TypeORM自体はクエリごとのタイムアウトを直接サポートしていませんが、
クエリランナーを使って生SQLでタイムアウトを設定することは可能です（PostgreSQLの場合）。

```typescript
// 任意のサービスやリポジトリ内
import { InjectRepository } from '@nestjs/typeorm';
import { Repository, DataSource } from 'typeorm';
import { Injectable } from '@nestjs/common';
import { User } from './user.entity';

@Injectable()
export class UserService {
  constructor(
    @InjectRepository(User)
    private userRepository: Repository<User>,
    private dataSource: DataSource,
  ) {}

  async findWithTimeout() {
    const queryRunner = this.dataSource.createQueryRunner();
    await queryRunner.connect();
    // クエリタイムアウトを設定（PostgreSQL）
    await queryRunner.query('SET statement_timeout TO 5000');
    const result = await queryRunner.query('SELECT * FROM user');
    await queryRunner.release();
    return result;
  }
}

```
Expoのグローバルインストール後にコマンドが通らない時の対処法

## はじめに

:::note alert
【注意】
記事を作成中に調べて気づいたのですが、expoをグローバル環境にインストールするのは非推奨となっているようです。

グローバルでインストールしちまったよ！という方は、
下記記事を参照のうえ、プロジェクトごとにインストールする方法をご確認ください。
https://zenn.dev/ohbashunsuke/scraps/79dbb5c3f597c2
参考：https://blog.expo.dev/the-new-expo-cli-f4250d8e3421
:::

# 発生事象
下記コマンドにて、expoをインストール実行。
```bash
$ npm install -g expo-cli
```
※管理者権限での実行が必要な場合はコマンドプロンプトを管理者権限で実行する

インストール後に、ちゃんと入ったか確認しようとしたところ以下エラーが表示された。
```bash
$ bash: command not found: expo
```
# 対処法
結論：expo.cmdがあるディレクトリをユーザー環境変数のパス（path）に登録する
私の場合は「C:\Program Files\Nodist\bin」が該当のディレクトリでしたが、環境変数に指定できていませんでした。
GUI上からユーザー環境変数＞Pathに変数を追加し、以下コマンドの出力結果を確認できました。(なんかワーニング出てるけど)
```
$ expo --version
WARNING: The legacy expo-cli does not support Node +17. Migrate to the new local Expo CLI: https://blog.expo.dev/the-new-expo-cli-f4250d8e3421.
6.3.12
```

# 原因
chatgptさんに確認した回答がこちら

>原因①：npmのグローバルパスが PATH に通っていない
expo コマンドは npm のグローバルパスに配置されますが、そのパスがOSの環境変数 PATH に通っていないと実行できません。
確認方法
コマンドプロンプトで以下を実行：
```bash
$ npm list -g --depth=0
```
>→ expo-cli が表示されれば、インストールは成功しています。
次に、npmのグローバルディレクトリを確認：
```bash
$ npm config get prefix
```
>C:\Users\あなたのユーザー名\AppData\Roaming\npm
このパスに expo.cmd があるか確認してください。


つまるところ、expo.cmdがあるディレクトリのパスが通ってない可能性があるよ！ということを調べてくれました。
指摘の通り、自分のローカル環境では、「C:\Program Files\Nodist\bin」が上記コマンド実行して出力されたのですが、ユーザー環境変数には登録されていませんでした。
私の場合はこれが原因でexpoのコマンドが通っていませんでしたので、備忘として。
※プロジェクトごとにインストールするときも同じような事象には出くわすはず…
テクノロジーと社会的不平等 📉: テクノロジーによって固定化される「見えない階級」



# テクノロジーによって固定化される「見えない階級」を読み解く：エンジニアとして私たちにできること

📉 社会的不平等とIT技術の交差点に立つ

## 1. はじめに：技術は中立ではない

テクノロジーは、我々の生活や仕事を効率化し、社会をより良く変える力を持っています。しかし近年、「AIによる差別的な採用選考」や「教育格差を拡大するオンライン学習環境」などの事例を通じて、**技術が社会的不平等を固定化・再生産する可能性**が指摘されるようになっています。

この記事では、「テクノロジーによって見えない階級（インビジブル・クラス）が強化される仕組み」に焦点を当てつつ、**現役エンジニアとして何ができるのか**を、実践的かつ技術的な観点から探っていきます。

---

## 2. テクノロジーと社会的不平等の関係とは？

### 見えない階級とは？

「見えない階級（インビジブル・クラス）」とは、表面上は平等に見えるが、実際には**情報アクセス、技術リテラシー、データの可視性**などの違いによって、無意識のうちに階級構造が作られている状態を指します。

たとえば：

* **AIモデルのトレーニングデータにマイノリティが反映されていない**
* **低所得層がインターネット学習にアクセスできない**
* **一部の都市エリアだけがスマートインフラの恩恵を受けている**

こうした「技術に組み込まれたバイアス」は、意図せずとも開発者やプロダクトに深く関係してきます。

---

## 3. 実例：推薦システムにおけるバイアスの検出と修正

ここでは、実際に推薦システムで発生しやすい「社会的バイアス」を検出し、修正する方法を簡単なコードで紹介します。

### 🧪 ケーススタディ：就職推薦システムと性別バイアス

#### ■ データ例（性別が含まれるユーザーデータ）

```python
import pandas as pd

# ユーザーデータ
df = pd.DataFrame({
    "user_id": [1, 2, 3, 4],
    "gender": ["male", "female", "male", "female"],
    "education_level": ["master", "bachelor", "phd", "highschool"],
    "recommended_jobs": [5, 2, 6, 1]
})

print(df)
```

#### ■ バイアス検出：性別と推薦スコアの相関

```python
import seaborn as sns
import matplotlib.pyplot as plt

df["gender_code"] = df["gender"].map({"male": 1, "female": 0})
sns.boxplot(x="gender", y="recommended_jobs", data=df)
plt.title("性別と推薦スコアの関係")
plt.show()
```

#### ■ 修正アプローチ：再重み付けによる補正（簡易）

```python
# 男性と女性で推薦スコアの分布を均一化するため、補正係数を導入
mean_male = df[df["gender"] == "male"]["recommended_jobs"].mean()
mean_female = df[df["gender"] == "female"]["recommended_jobs"].mean()
correction_ratio = mean_male / mean_female

df.loc[df["gender"] == "female", "corrected_score"] = df["recommended_jobs"] * correction_ratio
```

※ 現実のアルゴリズムでは、**公平性指標（Fairness Metrics）** や **差別的影響評価（Disparate Impact）** を組み合わせて検証する必要があります。

---

## 4. 現場で使える！バイアスを抑えるためのTips

| 課題               | 解決策                            | 備考            |
| ---------------- | ------------------------------ | ------------- |
| トレーニングデータの偏り     | データ収集時にマイノリティの声も含める            | サンプリングバイアスの防止 |
| モデルの説明性不足        | SHAPやLIMEなどのXAI技術を導入           | 意思決定の透明性を確保   |
| アルゴリズムのブラックボックス化 | フェアネス指標（Equal Opportunity等）を導入 | 運用上の責任を明確に    |

---

## 5. 応用編：公平性を考慮したAI開発のためのフレームワーク

以下のライブラリは、バイアスを測定・緩和するために使える便利なツールです：

### ✅ [AIF360 (AI Fairness 360)](https://aif360.mybluemix.net/)

IBMが提供するオープンソースフレームワーク。下記のような機能を提供：

* データのバイアス評価
* 各種フェアネス指標の計算
* 緩和アルゴリズム（Reweighing, Adversarial Debiasing等）

### ✅ [Fairlearn](https://fairlearn.org/)

Microsoft製の軽量ライブラリ。Scikit-learn互換で以下に強み：

* モデル選択とフェアネス制約のトレードオフを可視化
* デプロイ前後の評価に使いやすい

---

## 6. 結論：私たちエンジニアにできること

テクノロジーは中立である「べき」ですが、現実には**開発者の無意識な前提**や**社会構造の反映**によって偏りを生みやすいものです。

### ✅ 本記事のまとめ：

* 技術的なバイアスは「見えない階級」を固定化し得る
* 実装時にバイアス検出と修正を意識する必要がある
* AIF360やFairlearnなどのフレームワークを活用して公平性を評価・改善できる
* エンジニアは「ただ作る」だけでなく、「誰のために作るのか」を考える必要がある

---

## 🚀 明日からできる一歩

* 自分の使っているモデルにどんなデータが使われているか、今一度確認してみましょう。
* 「フェアネス」の観点から、自分のコードをレビューしてみましょう。
* 技術は人を助けるためにある。その原点を忘れずに、未来をつくる手を止めないように。

---

✍️ 本記事が少しでも参考になったら、ぜひスキ・フォローお願いします！
また、バイアスや倫理に関する議論に関心がある方、ぜひコメントで意見をシェアしてください。
【Python】PEP8の命名規約

関数や変数の名前は、lowercaseまたはlower_case_with_underscoreを使います（例：func）。

パッケージとモジュールの名前はlowercaseを使います（例：datetime）。

クラスの名前はCamelCaseを使います（例：ExamBasic）。

例外の名前はCamelCaseを使い、末尾にErrorを付けます（例：ZeroDivisionError）。
テクノロジーと社会的不平等 📉: AIが判断する「信用スコア」は差別を助長しないか？



# AIによる信用スコアリングは差別を助長するのか？実装と社会的リスクをエンジニア視点で解説する

## 🧭 はじめに：便利なAIがもたらす「見えない格差」

近年、AIによって個人の「信用スコア」を算出するサービスが急増しています。クレジットカードの審査やレンタル契約、果ては採用選考まで——。

しかしこの便利な仕組みが、\*\*特定の属性に対する「無意識の差別」\*\*を生んでしまうリスクがあることをご存知でしょうか？

本記事では、エンジニアの立場から以下の観点で掘り下げていきます。

* 信用スコアリングAIの技術的仕組み
* Pythonによる簡易実装例
* 現場で起きやすい落とし穴と対応策
* フェアネス（公平性）を考慮した機械学習のベストプラクティス

## 🧠 信用スコアリングAIとは？その仕組みと用途

信用スコアリングとは、個人の信用力を数値化する仕組みです。以下のようなデータを基に、機械学習モデルがスコアを予測します。

* 支払い履歴（例：クレジットカード返済）
* 年収や雇用形態
* ソーシャルメディアの活動履歴
* 居住地域、職種などの属性情報

主に用いられるモデルは以下のようなものです：

* **ロジスティック回帰**：可視化と解釈性に優れる
* **ランダムフォレスト / XGBoost**：高精度だがバイアスに注意
* **ニューラルネットワーク**：精度は高いがブラックボックス性が高い

### 社会問題になりやすい理由

一見「データドリブン」で中立に見えるこの仕組みですが、**過去の偏見を学習して再生産する**リスクがあります。例：

* 特定地域の居住者に対して低スコアが付きやすい
* 非正規雇用や女性に対するスコアの過小評価

## 💻 Pythonによる簡易スコアリングAIの実装例

以下は、架空の信用データを使った簡易スコアリングモデルの例です。目的は「返済能力の有無（0 or 1）」を予測することです。

```python
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report

# 仮のデータ
data = pd.DataFrame({
    '年収': [400, 800, 300, 500, 1000],
    '職種': ['契約', '正社員', '契約', '正社員', '役員'],
    '性別': ['女性', '男性', '女性', '男性', '男性'],
    '居住地': ['地方', '都市', '地方', '都市', '都市'],
    '返済履歴良好': [0, 1, 0, 1, 1],
    '返済能力あり': [0, 1, 0, 1, 1]
})

# カテゴリ変換
data = pd.get_dummies(data, columns=['職種', '性別', '居住地'])

X = data.drop('返済能力あり', axis=1)
y = data['返済能力あり']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

clf = RandomForestClassifier()
clf.fit(X_train, y_train)

y_pred = clf.predict(X_test)
print(classification_report(y_test, y_pred))
```

この例では、カテゴリ属性をone-hot encodingしていますが、**この処理自体が差別的な判断の温床**にもなり得ます。

## 🔍 現場での課題：フェアネスの落とし穴

### よくある問題

* モデル精度を優先して**バイアス分析をスキップ**してしまう
* 学習データ自体に偏りがあり、モデルがそれを忠実に再現
* 法的・倫理的な配慮がプロダクト設計に欠ける

### フェアネスを担保するためのテクニック

* **Disparate Impact（DI）**：特定属性に対する不利益の比率を測定
* **Fairlearn** ライブラリの活用
* **SHAP値**などを用いた特徴量の寄与分析

```python
# Fairlearnでグループ間の差を分析する例（簡易版）
from fairlearn.metrics import MetricFrame, selection_rate
group_membership = data['性別_女性']
mf = MetricFrame(metrics=selection_rate, y_true=y_test, y_pred=y_pred, sensitive_features=group_membership)
print(mf.by_group)
```

## 🚀 応用と今後の展望

* 「フェアネスを意識したAI開発」は今後の標準となる
* \*\*説明可能なAI（XAI）\*\*との組み合わせで透明性を高める
* 開発フェーズだけでなく、**運用フェーズでのモニタリング体制**が不可欠

また、技術的スキルだけでなく**倫理的な感覚**を持ったエンジニアがますます求められる時代になっています。

## ✅ まとめ：信用スコアAIの光と影を理解して使いこなそう

| 観点      | メリット        | リスク             |
| ------- | ----------- | --------------- |
| 精度・効率性  | 高速な判断・自動化   | ブラックボックス化       |
| 公平性     | 理論上は平等      | 偏見の再生産の可能性      |
| 実装のしやすさ | 汎用的ライブラリが豊富 | フェアネス対応は追加工数が必要 |

エンジニアとして、ただ精度の高いモデルを作るだけでは不十分です。**社会に与える影響まで含めた設計と運用**が、これからのAI開発における真の実力となるでしょう。

---

## 📚 参考リンク・ライブラリ

* [Fairlearn (Microsoft)](https://fairlearn.org/)
* [AI Fairness 360 (IBM)](https://aif360.mybluemix.net/)
* [SHAP（モデル解釈ライブラリ）](https://github.com/slundberg/shap)
【rails】Google認証のテスト(minitest)


## はじめに
こんにちは。アメリカ在住で独学エンジニアを目指している Taira です。

現在devise を用いてrails アプリを作成中ですが、ログインの認証にgoogle OAuth を取り入れてみました。

minitest でgoogle OAuth のテストケースを書いた記事があまりにも少なかったので、記事にするいい機会だと思いました。

なお、前提としてGoogleログインをOmniAuth + Deviseで実装していることを前提とします（OmniAuthのコールバックURLなどが定義されている状態）。

## Google OAuth の実態

Rails アプリで Google ログインを使うとき、通常は以下のようなフローになります：

1. ユーザーが Google にリダイレクト
2. Google で認証後、認可コードを Rails に返す
3. Rails はそのコードを使ってトークンを取得
4. 最終的にログイン処理へ

でも、**テスト時に実際に Google サーバーに接続するのは現実的ではありません**。
➡ だからこそ、「Google からこんなデータが返ってきたことにしよう」という **モック（偽物）データ** を用意するわけです。

---

## OmniAuthのmock設定

テストを書く前にtest\_helper.rbに以下を記述してください

```ruby
# test/test_helper.rb
OmniAuth.config.test_mode = true
```

`test_mode = true` でOmniAuthをmockモードにしてください

---

## Minitestコード例

```ruby
require "test_helper"

class GoogleAuthTest < ActionDispatch::IntegrationTest
  # google認証 true & user.persist? true
  test "valid infomation google auth" do
    OmniAuth.config.mock_auth[:google_oauth2] = OmniAuth::AuthHash.new({
    provider: "google_oauth2",
    uid: "1234567890",
    info: {
      name:  "test_user",
      email: "test@example.com"
    }
  })
    assert_difference "User.count", 1 do
      get user_google_oauth2_omniauth_callback_path
      follow_redirect! # userのパスにリダイレクト
      follow_redirect! # today_pathへリダイレクト
    end
    assert_equal I18n.t("devise.omniauth_callbacks.success", kind: "Google"), flash[:notice]
    assert_template "lists/today"
    assert_match    "test_user", response.body
    assert User.exists?(email: "test@example.com")
  end
```

---

## 失敗範囲のテスト

失敗情報をmockで作成する場合:

```ruby
OmniAuth.config.mock_auth[:google_oauth2] = :invalid_credentials
```

これにより、認証失敗時の振る舞いもテスト可能になります。

ここで、注意点ですが上記は認証失敗をテストするのであって、以下の`OmniauthCallbacksController`の`else` をテストしているわけではありません。

`else` は認証は問題なかったけど、`@user.persisted?` に問題があった処理であることを忘れないでください。

```ruby
def google_oauth2
    # You need to implement the method below in your model (e.g. app/models/user.rb)
    @user = User.from_omniauth(request.env["omniauth.auth"])

    if @user.persisted?
      flash[:notice] = I18n.t "devise.omniauth_callbacks.success", kind: "Google"
      sign_in_and_redirect @user, event: :authentication
    else
      session["devise.google_data"] = request.env["omniauth.auth"].except("extra")
      redirect_to request.referer || new_user_registration_url, alert: @user.errors.full_messages.join("\n")
    end
end
```
なので、もし`else `をテストする場合は以下のようなテストになるはずです

```ruby
# google認証 true & user.persist? false
test "success google authorization but failed save user " do
  OmniAuth.config.mock_auth[:google_oauth2] = OmniAuth::AuthHash.new({
    provider: "google_oauth2",
    uid: "1111",
    info: {
      name: nil,
      email: nil
    }
  })
  assert_no_difference "User.count" do
    get user_google_oauth2_omniauth_callback_path
  end
  assert_redirected_to new_user_registration_url
  assert_match "メールアドレスを入力してください\n名前を入力してください", flash[:alert]
end
```

---

## おわりに

Google OAuthのような外部サービス連携のテストは、mockを利用することでテストをすることが可能です
日本市場への進出を目指していますが、効果的なマーケティング方法についてアドバイスをいただけますでしょうか？

こんにちは。
私は日本がとても好きで、年に4回ほど旅行で訪れるほどです。
そのため、どの市場よりも日本市場に進出したいと強く思っています。
しかし、マーケティング面で非常に苦労しています。

私たちはEthernetコンバーターを製造している韓国企業です。
韓国国内でのマーケティングには慣れていますが、日本市場では思うようにいきません。
Qiitaなどに記事を投稿しても、宣伝のように見られると、ほとんど反応がありません。
どのような方法で日本市場に入り込むことができるのでしょうか？
もし効果的な方法があれば、どんなことでも挑戦したいと考えています。

ぜひアドバイスをいただけますと幸いです。
どうぞよろしくお願いいたします。

日本語の文書やサイトは、少しずつ準備を進めています。
現在、日本語を勉強中ですが、まだあまり上手ではないため、間違いも多いかもしれません。

https://jp.us-platypus.com/?redirect=no
テクノロジーと社会的不平等 📉: オープンソースと平等性：現実とのギャップ



# オープンソースと平等性：現実とのギャップを技術者目線で考える 🧩

## 1. はじめに：オープンソースは本当に「平等」なのか？

オープンソースの理念は「誰もが自由に使える技術を共有すること」。
この考え方は、テクノロジーを通じて社会的な平等を促進するものとして広く支持されてきました。

しかし実際には、GitHub上の主要なOSSプロジェクトの多くが特定の国・地域や企業に偏っていたり、貢献できる人材が限られていたりと、**理想と現実のギャップ**が存在します。

この記事では、

* なぜオープンソースが「平等」を掲げながらも不平等を生むのか
* その中でエンジニアがどんな立ち回りを取るべきか
* OSSに貢献するための技術・実践ノウハウ

を技術者目線で深掘りしていきます。

---

## 2. オープンソースと社会的不平等：概要と背景

### 🌐 オープンソースの理想

* ソースコードが誰でも閲覧・利用・改変・再配布可能
* 技術的イノベーションの民主化

### 🧩 現実の課題

* コントリビューターの偏り（北米・欧州中心、アジアやアフリカは少数）
* 言語の壁（英語が前提、非英語圏には高い参入障壁）
* 経済的余裕がないと「時間と知識を投資」できない

📊 **データ例：**
[GitHub Octoverse](https://octoverse.github.com/)によると、2023年時点で上位10プロジェクトの貢献者の約75%が北米と西ヨーロッパ出身。

---

## 3. 実践：OSSに初参加するまでのステップ（コード例あり）

### 🎯 目的：

初心者でも無理なくOSSに貢献できる環境を作ること。

### ✅ ステップ1：Issueを探す（Good First Issue）

GitHubの検索バーで以下のように入力：

```text
label:"good first issue" language:python
```

![](https://docs.github.com/assets/images/help/issues/good-first-issue.png)

### ✅ ステップ2：Fork → 修正 → PR作成

#### 例：Pythonプロジェクトに簡単なバグ修正を加える

```python
# 元の関数（誤動作あり）
def greet(name):
    return "Hello" + name  # スペースなし

# 修正後
def greet(name):
    return "Hello " + name
```

#### Git操作の流れ

```bash
git clone https://github.com/yourname/sample-repo.git
cd sample-repo
git checkout -b fix/greet-bug
# 修正作業
git add .
git commit -m "Fix: Add space in greeting"
git push origin fix/greet-bug
# GitHub上でPull Requestを作成
```

---

## 4. OSS貢献の実践Tipsと落とし穴

### 🌟 実践Tips

* 「コードを書くだけ」が貢献じゃない：ドキュメント修正や翻訳も立派な貢献
* READMEを丁寧に読むことでプロジェクト文化を理解できる
* Pull Requestには**背景・目的・変更点**を簡潔に明記する

### ⚠️ よくある落とし穴

| 落とし穴          | 回避方法                     |
| ------------- | ------------------------ |
| PRを投げたのに放置される | smallな変更で始める＋事前にissueで相談 |
| コミュニケーションの齟齬  | 英語での丁寧なやりとりを心がける         |
| 一人で完璧を目指す     | コミュニティの人にフィードバックを求める習慣   |

---

## 5. オープンソース × 技術的不平等：乗り越えるアプローチ

### 🌍 地域格差の是正に向けて

* アジア・アフリカ発のOSSプロジェクトに注目して参加する
* グローバルプロジェクトでも**日本語のIssue翻訳やナレッジ共有**をする

### 🤝 企業の役割と支援

* 勤務時間内にOSS貢献を認める文化（例：Googleの20%ルール）
* 技術ドキュメントの多言語対応支援（翻訳ツールやAI活用）

---

## 6. まとめ：平等に近づくOSS文化を目指して

### ✅ メリット

* 技術力アップの場として最適
* グローバルな繋がりが生まれる
* キャリアのポートフォリオにも直結

### ❌ 課題

* 言語・文化・経済的なバリアが依然として存在
* 一部の企業・地域に支配されがち

### 🔭 今後の展望

AIやLLMの進化により、ドキュメント翻訳やコードレビュー支援が自動化され、**真の意味で「誰でも貢献できる」OSS時代**が近づいています。
私たち一人一人が「入り口を広げる」行動を積み重ねることが、技術と社会の架け橋になるのです。

---

## 📌 参考リンク

* [GitHub Good First Issues](https://github.com/search?q=label%3A%22good+first+issue%22)
* [First Contributions](https://firstcontributions.github.io/)
* [Open Source Guides](https://opensource.guide/)

---

## 🏁最後に

この記事を読んだあなたが、「次のOSSコントリビューター」になってくれることを願っています。
不完全でも、まずは**一歩踏み出すこと**が、OSSと社会の未来を変える原動力です💪
AWSのIP変更通知、うるさすぎ問題を解決！Lambdaで対象だけを抽出する方法

## はじめに

AWSでは、各サービスで使用するIPアドレス範囲（プレフィックス）が定期的に変更される可能性があります。  
公式に提供されている [SNS通知](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/subscribe-notifications.html) を利用すれば変更の検知は可能ですが、
**すべての変更通知が一律で届くため、不要な情報まで含まれてしまいます**。

本記事では、**特定のサービス（例：Amazon Connect）やリージョン（例：ap-northeast-1）に絞った通知を実現する方法**を紹介します。

## 参考資料

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/subscribe-notifications.html

https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/ccp-networking.html

## 通常のSNS通知の課題

SNS経由で受け取る通知メールは以下のように、
どのサービス・リージョンのどの範囲が変更されたのかが不明瞭です。
正直、なんのこっちゃ。って感じです。

![SNS通知の例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717693/07307e00-e0e8-41ed-a80e-2e5d2e5ffec6.png)

このように、**業務上必要な情報（例：ap-northeast-1 の Amazon Connect 関連のIP変更）だけを抽出することはできません**。


## 特定のサービスやリージョンのIPアドレス変更のみを通知する方法

結論から言うと、
SNS単体では特定のサービスやリージョンのプレフィックス変更を直接検知することはできません。  
そこで、以下のような構成を用いたカスタム検知フローを構築します。

### アーキテクチャ概要


【アーキテクチャ】

![IPAddress_notification.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717693/d5ae07df-3db2-4fe5-b1fe-f414173571bc.png)

【処理内容】

1. **AWS提供のIPアドレスプレフィックス変更通知（SNS:us-east-1）を受信**
2. **SNSトピックをトリガーにLambdaを実行**
3. **Lambdaで前回のIPプレフィックス一覧（S3格納）と差分比較**
4. **対象サービス/リージョンに一致する場合のみ、通知SNSへ再送信**
5. **最新のIPリストをS3へ保存**

### 実際のメール

以下は、特定のサービス/リージョンに該当する変更が検知された場合に送信されるメールの一例です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717693/13a32592-c4ec-4ee9-bd58-1a95fde09389.png)

このように、**変更されたIP範囲が明確に通知されるため、セキュリティグループやファイアウォールの更新判断が即座に行えます。**

## まとめ

本記事では、AWSが提供するIPアドレス変更通知を活用しつつ、  
**特定のサービスやリージョンに限定して通知する方法**をご紹介しました。

- SNS単体では細かいフィルタリングができない
- LambdaとS3を活用することで差分判定と通知対象の選別が可能
- ノイズを減らした通知で、対応漏れや誤対応を防止

この仕組みによって、**変更を見落とすことなく、かつ重要な変更のみを把握する運用が実現できます**。  
セキュリティポリシーやネットワーク設定に依存するシステムを運用している方には、特に導入をおすすめします。
【読書感想】コンサル一年目が学ぶこと

ランニングしながらAudibleで聴いた本の感想です。
本のまとめというより、自分が心に残ったことを3つだけ書いてます。
とりあえず思ったことをメモするのが大切と思い、なるべく30分以内で書き上げています。

# 聴いた本
コンサル一年目が学ぶこと
大石 哲之 (著)

基本的な仕事術の本です。私は社会人6年目ということもあり、参考になった内容もあれば、常識だと思う部分も多かったです。
（個人的満足度２／３、一般的なおすすめ度２．５／３）

# 心に残ったこと

## 雲雨傘

別の本では「論理展開をわかりやすく」という文脈で使われていましたが、この本では、
**雲（事実）→雨（解釈）→傘（判断）をしっかり分けることが大切**、というメッセージで登場していました。
さらに、1年目という立場では解釈・判断が年長者に比べて弱みとなるため、「雲」＝データ・数字・ロジックの部分をしっかりすると立場が高い人とも対等に話ができる、とのことでした。

## 仮説思考

仮説を考えておいて＝**前提を作っておいて、実際の選択肢が現れたときに対応できるようにする**ことが重要、と述べられていました。
極端な例？かもしれませんが、夏休みの旅行プランを組む際に「3日程度だったらAに、5日休みが取れたらBに、1週間以上だったらCにしよう」などと選択肢を作っておいて、実際にA/B/Cの内容を作り込んでおく、選択肢が現れたらそれを実行するだけ、という方法も紹介されていました。

報連相する際も、仮説を作っておいてから行ったり、情報・ニュースを見るときも、自分の意見＝仮説を持っておいてから当たると良いそうです。
仕事上でもオープンに質問をして話が発散するケースがありますが、仮説A/Bを作っておいてから聞くと、良いアイデアCが出てくることもあるので、この考えは重要だなと思いました。

## コミットメントが大切

仕事では、コミットメント＝約束を守ることが何より大切だそうです。もちろん、「相手のためになる部分で」約束を守ることです。
締め切り前日にクライアント向け資料が1枚も出来ていないような状況でも、クライアントのことを考えて必死に資料を作るという例が紹介されていました。

この「コミットメント」を高める方法として、①コミットメントの高い組織にいる、②仕事の目的を理解する、ことが重要とのことでした。
逆に、組織のコミットメントを高めたい場合は、マネジメントの立場の人が自分のコミットメントを高めると良さそうです。
【Python】ソースコードを整形するBlack

import文は順序のチェックや修正を行わない。

コマンドラインのオプションで「-l」か「--line-length」を付けると、1行の最大文字数を指定できます。

--checkオプションを使うと、結果は出力されるがコードは修正されない。

--excludeオプションを使うと、除外するファイルやディレクトリを正規表現で指定できる。
なぜプロダクトマネージャーにとって「自信」が最強の武器なのか

### はじめに

プロダクトマネージャー（PdM）やプロダクト開発に携わる皆さん、「プロダクトを成功させるために最も重要なスキルは何ですか？」と聞かれたら、何と答えるでしょうか。

マーケット分析、UI/UXの知識、技術的な理解、さまざまな答えがあると思います。しかし私は、それらすべての土台となる「自信を高め続けること」こそが、PdMにとって最も重要で、最強の武器になると考えています。

この記事では、なぜ「自信」が重要なのか、そしてそれが単なる精神論ではなく、プロダクトを成功に導くための具体的な技術である理由について、私の考えを共有します。

### PdMと不確実な「仮説」という名の航海図

PdMの仕事は、一言で言えば「プロダクトを成功に導くため、リードし、責任を持ち、うまくいくようになんでもやること」です。その活動の出発点には、常に「仮説」があります。

- 「この機能があれば、ユーザーはもっと喜んでくれるはずだ」
- 「この新しい価値を提供すれば、市場で圧倒的な存在になれるはずだ」

これらは、未来への期待が込められた航海図のようなものですが、同時に大きな不確実性をはらんでいます。なぜなら、それはまだ「やってみなければわからない」ことだからです。

もし、この最初の仮説の筋が悪ければ、開発チームという船は、間違った目的地に向かって航海を続けることになります。チームは疲弊し、自信を失い、最悪の場合、プロジェクトそのものが崩壊してしまう危険性すらあります。

### なぜ「自信」がチームを動かす原動力になるのか？

不確実な航海において、船長であるPdMが「この航路で本当に合っているのだろうか…」と不安げにしていたら、船員であるチームメンバーはどう思うでしょうか？きっと、誰もが不安になり、船は前に進めなくなってしまいます。

ここで必要になるのが、PdMの「自信」です。

> **この仮説は絶対に正しい。これならうまくいく。**

この確固たる自信が、チームの迷いを払い、推進力を生み出します。PdMが自信を持って「こちらへ進むぞ！」と旗を振るからこそ、エンジニアやデザイナーは安心して自分の専門性を最大限に発揮し、最高のプロダTクト作りに集中できるのです。

### 「自信」は精神論ではない。確信へと変えるための具体的なアクション

「自信を持てと言われても、不安なものは不安だ」と感じるかもしれません。その通りです。ここで言う「自信」とは、根拠のない思い込みや精神論ではありません。それは、**日々の具体的なアクションによって自ら構築していくもの**です。

私が「自信を高めるため」に、そしてPdMが「なんでもやる」べきだと考えていることの具体例は以下の通りです。

- **徹底的なリサーチ**: ユーザーインタビューや市場調査を通じて、「ユーザーは本当にこれを求めている」という一次情報を掴みに行きます。
- **実験とプロトタイピング**: 不確実な要素を検証するために、小さく早くプロトタイプを作り、ユーザーに触ってもらいます。そのフィードバックが自信の源泉になります。
- **データの計測と分析**: リリースした機能がどう使われているか、数値を計測し、客観的な事実として把握します。データは、ときに厳しい現実を突きつけますが、同時に次の一手への確信を与えてくれます。
- **ステークホルダーとの対話**: 関係者と密にコミュニケーションを取り、期待値をコントロールし、仲間として巻き込みます。彼らの納得と協力も、自信を補強する重要な要素です。

これらの地道な活動一つひとつが、ぼんやりとした「仮説」を、輪郭のくっきりとした「確信」へと変えていくプロセスなのです。

### 「フリクションレス」な環境が自信を育む

以前、私は「フリクションレス（摩擦のない状態）」というテーマについて考えたことがあります。これも「自信」と深く関連しています。

上記の自信を高めるアクションを阻害する「摩擦」（例：煩雑な承認プロセス、チーム間の情報格差、使いにくいツールなど）を組織的に取り除いていくことで、チームはよりスピーディに仮説検証を回せるようになります。

動きやすい環境は、成功体験を生みやすくし、それがチーム全体の自信へと繋がっていきます。

### おわりに

プロダクト開発は、不確実性の海を渡る壮大な航海です。その中で、PdMが持つべき「自信」は、チームを導く北極星であり、荒波を乗り越えるための頑丈な船体そのものです。

それは生まれつきの才能ではなく、日々の地道な努力と探求によって磨かれる**技術**です。

この記事を読んでくださったあなたが、もし今、プロダクトの方向性に迷いや不安を感じているなら、ぜひ問いかけてみてください。

**「自分の、そしてチームの自信を高めるために、今日何ができるだろうか？」**

その一歩が、プロダクトを成功へと導く確かな推進力になるはずです。

---
**ハッシュタグ**
`#PdM` `#プロダクトマネジメント` `#プロダクト開発` `#チーム開発` `#マインドセット`
Labubuのライブ壁紙をスマホで楽しもう📱🎨

こんにちは。

最近、自分の趣味を活かして「Labubuのライブ壁紙サイト」を作ってみました。スマホ向けに最適化していて、すべて無料で使えます。

🖼️ アニメーション付きのLabubu壁紙をそのままスマホにダウンロード＆設定可能です。

▼ サイトはこちら：
🔗 https://labubu-live-wallpaper.com

🌟 特徴：

広告なし

プレビュー＆即ダウンロードOK

スマホ用に最適化済み

定期的に新作追加予定

Labubu好き、デザイナーズトイ好きな方にぜひ試してほしいです。
フィードバックや感想があれば気軽にコメントください☺️

![1750211451477.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4118348/46a3e7e9-025c-4792-bb9d-fe7c83c2f7f6.jpeg)
Python 基礎知識 if文　range文の使用方法

今現在はシドニーでワーキングホリデーをしているTaiheiです。
Freee code campというsiteでpythonのコースの動画を取りながら勉強をしています。

何か初心者の人に対してお勧めなサイト、本（当方software enginner）を希望です。
何かお勧めがあれば教えてほしいです。

今日は、if文とrange文の使用方法についてまとめようと思います。


x = 5

if x > 0:
    print("x is positive")  # 条件付きのステップ1
elif x == 0:
    print("x is zero")      # 条件付きのステップ2
else:
    print("x is negative")  # 条件付きのステップ3

<p>ifは最初の条件で、xが0より大きい場合はその条件がtrueとなり入る。</p>
<h3>elif</h3>
<p>elifは、ifがもしfalseだった場合に入る条件分岐になります。</p>
<p>この場合は、xが0だったらTrueになるように設定しています。</p>


<h3>else</h3>
<p>elseは、ifやelifが入らなかった(False)だった場合に必ずTrueになります。</p>
<p>この場合は、ただプリント文が実行されるようになってます。</p>


<h2>Range文の使用方法</h2>

<p>主にfor分やlistを作成したい時、len関数などと使用する場合が多いです。</p>

for i in range(5): # range文(0-4)
<p>この場合は、rangeの範囲が0-4まで出力される</p>

for i in range(1, 10, 2):　#1がstratで、10がend number, 2がstep #なので、1,3,5,7,9が出力されるようになる
    print(i)


nums = list(range(5)) # range0-4の範囲をlist型にするように設定

print(nums)

ここには、記載はしなかったがrange(start, stop)や、(5, 0, -1)、など応用する方法は山ほどあるので色々理解していく必要がある。

以上です。
【高山慶】エラーの裏にある"思考のクセ"に気づくとき



はじめに

フリーランスエンジニアとして様々な現場で開発に携わる中で、気づいたことがあります。
それは、エラーが発生したときの自分の思考パターンです。

「また同じパターンか」という気づき

先日、クライアントのWebAPIで500エラーが頻発する問題に遭遇しました。
最初は「データベース接続の問題かな」と推測し、コネクションプールの設定を確認。
しかし原因は全く別の箇所にありました。

振り返ってみると、私には「エラー＝インフラ系の問題」と決めつける思考のクセがあることに
気づきました。
新卒時代に基幹システムでDB周りのトラブルを多く経験したからかもしれません。

思考のクセが生む見落とし

このクセにより、アプリケーションロジックの検証を後回しにしがちでした。結果として

- デバッグ時間の無駄な延長
- 本質的な問題の見落とし
- クライアントへの報告の遅れ

今回の500エラーも、実際はフロントエンドから送信されるJSONの構造変更が原因でした。

## 意識的な思考の転換

現在は問題発生時に「いつものパターンで考えていないか？」と自問するようにしています。
フリーランスとして複数の技術領域を担当する今だからこそ、固定観念を捨てて柔軟に対応することが重要だと感じています。

エラーは技術的な問題であると同時に、自分の思考パターンを見直すきっかけでもあるのです。
PCBgogo & ELECROW　海外基板会社の比較をしてみた　

✅ 料金比較（100mm×100mm・10枚）

PCBgogo
新規ユーザー：10枚で5ドル
15件以上の注文履歴あり：10枚で10ドル
送料：15ドル（最安のOCS利用、納期も速い）
クレジット決済手数料：約2ドル
▶ 合計：約27ドル


ELECROW
基板製作：10枚で1ドル
送料：14ドル（OCS利用）
▶ 合計：約15ドル

💡 料金面ではELECROWが安価です。


✅ 提供サービスの違い

PCBgogo
基板製作
メタルマスク製作
部品実装
UV印刷対応（ロゴ、画像など）

ELECROW
基板製作
メタルマスク製作
部品実装
3Dプリント対応


✅ 納期比較
PCBgogo
注文日：5/19
製作完了：5/20
到着日：5/23
▶ 到着まで4日と非常にスピーディー

ELECROW
注文日：3/24
製作完了：3/30
到着日：4/1
▶ 到着まで8日

🚚 納期重視ならPCBgogoが有利です。

✅ 総評
価格だけを見るとELECROWのほうが安価ですが、
納期の速さや安定感を重視する場合はPCBgogoが安心です。
特に試作を急いでいるときには、<a href="https://www.pcbgogo.jp/promo/lge" target="_blank">PCBGOGO</a>の方が使いやすい印象です。
Java 17.0.15

以下は、Java SE 17.0.6（2023年1月リリース）と17.0.15（2025年4月リリース）の主な変更点を公式リリースノートからまとめたものです。セキュリティ強化、機能改善、非推奨化などが重点的に行われています。

---

### ⚠️ 1. **セキュリティ関連の変更点**  
- **Camerfirmaルート証明書の信頼停止**  
  - 2025年4月15日以降に発行され、特定のCamerfirmaルートCA（例: `Chambers of Commerce Root - 2008`）で署名されたTLSサーバー証明書は、デフォルトで信頼されなくなりました。影響を受ける証明書を使用する場合、TLS接続時に例外が発生します。  
  - **回避方法**:  
    ```bash
    # 証明書チェーンの確認
    keytool -v -list -alias <エイリアス名> -keystore <キーストアファイル>
    ```  
    `jdk.security.caDistrustPolicies`プロパティから`CAMERFIRMA_TLS`を削除することで元の信頼を復元可能。  

- **複数の脆弱性修正**  
  - 2025年4月のCPU（Critical Patch Update）として、CVE-2024-35195やCVE-2024-38357を含む**50件以上の脆弱性**に対処。リモートコード実行やサービス拒否（DoS）のリスクが軽減されています。

---

### 🔐 2. **暗号化/PKCS11関連の強化**  
- **SunPKCS11プロバイダーのレガシーメカニズムチェック改善**  
  - 暗号化/復号のみをサポートするネイティブPKCS11メカニズムが、署名機能の不足により従来は完全に無効化されていました。17.0.15では**サービスタイプごとのチェック**が導入され、暗号化機能は利用可能に（署名機能は依然無効）。`allowLegacy=true`設定で強制有効化も可能。  

- **OCSP/証明書/CRL取得のタイムアウト設定強化**  
  - 接続タイムアウト（`com.sun.security.ocsp.timeout`）に加え、**読み取りタイムアウト**（`com.sun.security.ocsp.readtimeout`）プロパティが追加。単位を秒（`15s`）またはミリ秒（`15000ms`）で指定可能。

---

### ✨ 3. **新機能とツール改善**  
- **`jarsigner`の検証機能強化**  
  - 署名済みJARからファイルが削除されたが署名が残るケースを検出可能に。`jarsigner -verify -verbose`で不一致の詳細を出力。  
- **IANAタイムゾーンデータ2025a**  
  - パラグアイのタイムゾーン変更（-03固定化）、フィリピンの1991年以前のデータ改善などを反映。  

---

### ⚙️ 4. **その他の重要変更**  
- **内部APIの強力なカプセル化**  
  - `--illegal-access`オプションが完全削除され、内部APIへのアクセスには`--add-opens`の明示が必要に（Java 16から継続する方針）。  
- **セキュリティマネージャの非推奨化**  
  - 将来の削除に向け、引き続き非推奨ステータスが維持されています。  
- **`JarInputStream`の挙動変更**  
  - 複数の`MANIFEST.MF`を含むJARは**未署名扱い**になり、警告が出力されます（デバッグモード時）。  

---

### 📅 5. **リリーススケジュールとサポート**  
- **17.0.15のサポート期限**: 次のCPU（2025年7月15日予定）までが推奨使用期間。  
- **OpenJDKディストリビューション**:  
  - Red Hat Build of OpenJDK 17.0.15はFIPSモード自動検出をサポート。  
  - Eclipse TemurinはmacOS/Windows/Linux用バイナリを提供。  

> **表**: 影響を受けるCamerfirmaルート証明書の一覧  
> | 識別名 (Distinguished Name) | SHA-256フィンガープリント |  
> |-----------------------------|--------------------------|  
> | `CN=Chambers of Commerce Root, OU=http://www.chambersign.org, O=AC Camerfirma SA...` | `0C:25:8A:12:A5:67:4A:EF:25:F2:8B:A7:DC:FA:EC:EE:A3:48:E5:41:E6:F5:CC:4E:E6:3B:71:B3:61:60:6A:C3` |  
> | `CN=Chambers of Commerce Root - 2008, O=AC Camerfirma S.A., SERIALNUMBER=A82743287...` | `06:3E:4A:FA:C4:91:DF:D3:32:F3:08:9B:85:42:E9:46:17:D8:93:D7:FE:94:4E:10:A7:93:7E:E2:9D:96:93:C0` |  
> | `CN=Global Chambersign Root - 2008, O=AC Camerfirma S.A., SERIALNUMBER=A82743287...` | `13:63:35:43:93:34:A7:69:80:16:A0:D3:24:DE:72:28:4E:07:9D:7B:52:20:BB:8F:BD:74:78:16:EE:BE:BA:CA` |  

---

### 💎 まとめと推奨アクション  
- **主な差分**: セキュリティポリシー（Camerfirma証明書）・脆弱性修正・PKCS11/jarsignerの機能改善が核心。  
- **アップグレード時の注意点**:  
  - TLS証明書チェーンの再検証（Camerfirma影響の有無）。  
  - 内部API使用箇所の`--add-opens`設定追加。  
  - 署名済みJARの検証プロセス見直し。  
- **次のステップ**:  
  [Oracle JDK 17.0.15リリースノート](https://www.oracle.com/java/technologies/javase/17-0-15-relnotes.html) または [Red Hat OpenJDK 17.0.15ドキュメント](https://docs.redhat.com/ja/documentation/red_hat_build_of_openjdk/17/html-single/release_notes_for_red_hat_build_of_openjdk_17.0.15/index) で詳細を確認できます。
[HackTheBox] Evaluative-writeup

- Challenges
- VeryEasy

# 問題
最初に係数のリストと`x`が渡されます。
`x`に対する多項式を計算し、あっているとflagが出力されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556452/f8a73cbf-d0a5-4040-9d6a-98a65f1ab860.png)


```python:anser.py
coefficients = list(map(int, input().split()))
x = int(input())

result = 0
for coff in reversed(coefficients):
    result = result *x + coff
print(result)
```
> HTB{eV4LuaT1nG_p0LyN0M1aL5_f0R_7H3_w1N}
Python 基礎知識　(自分のメモ用)

2年前に、エンジニアを鬱病になってから退職して、現在はAustraliaのWorking Holidayで生活しています。

久々に、自分を見つめなおしてやはり、PCやテクノロジーは好きだなと感じPythonをまた１から勉強します。

そのため、初心者になって0から勉強しているので、自分の知識のメモとしてこのQiitaで色々投稿しています。

<h2>定数、変数について</h2>

<p>constants(定数)</p>
    PI = 3.14159
　　MAX_USERS = 100
　　API_KEY = "abc123"</n>
  
#pythonで定数を使用する際は必ず大文字

<p>variable(変数)</p>
    name = "Alice" //string型
    age = 25　//整数
    is_student = True　//真偽値</n>
  
#pythonで変数はデータを1次的に保管しておく箱のようなもの

<h3>mnemonic variable name</h3>

変数、定数どちらでも作成する時は、他の人が見てもわかりやすいようにする名前を付ける。

以上です
WinSWでPythonアプリをWindowsサービス化する方法

FastAPIとかStreamlitとかでツールを作ったはいいが、使うたびに起動するのは面倒くさい。サービス化できればいいのにと思い、たどり着いたのが「[WinSW](https://github.com/winsw/winsw)」。任意のexeをWindowsサービス化（参考：[WinSWで任意のexeをWindowsサービス化する方法について](https://zenn.dev/0_0/articles/08a57797e62da4)）できる。
しかし、pythonだと、pyinstallerなどでexe化しなければいけないのか？と思ったが、python.exeを起動すればいいんじゃない？と思ったらできたので投稿しておく。

# 環境
Windows11

# 事前準備
WinSWの[Releases](https://github.com/winsw/winsw/releases)から、`WinSW-x64.exe`をダウンロードしておく。

FastAPIを想定して以下を進める。`main.py`として以下のファイルを作成しておく。
```python
from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def root():
    return {"message": "Hello World"}
```
```
python -m uvicorn main:app
```
で起動できることを確認しておく。

このファイル（サービス化したいpythonファイル）があるフォルダに`WinSW-x64.exe`をコピーし、名前を変更しておく。（例えば`WinSW-FastAPI.exe`と変更する）

# WinSWを使用するための設定ファイル作成
適当な名前（例えば、WinSW-FastAPI.xml）でxmlファイルを作成し、以下のような内容を記述する。

```xml
<service>
    <id>FastAPI</id>
    <name>FastAPI (powered by WinSW)</name>
    <description>APIサーバー</description>
    
    <workingdirectory>%BASE%</workingdirectory>
    
    <executable>C:/***{python.exeへのフルパス}****/python.exe</executable>
    <startarguments>-m uvicorn main:app</startarguments>
    
    <logpath>%BASE%\WinSW\logs</logpath>
    <log mode="roll-by-time">
        <pattern>yyyyMMdd</pattern>
        <keepFiles>8</keepFiles>
    </log>
</service>
```

ポイントは、「`<startarguments>-m uvicorn main:app</startarguments>`」の部分で、exeの引数として起動のコマンドを書くところ。結構なんでもありな気がしますね。

### 参考：streamlitの場合
`<startarguments>-m streamlit run app.py</startarguments>`

ただ、これで起動すると、以下の画面で止まっている。通常はエンターキーで次に進むのだが、サービス起動のため誰もエンターキーを押す人がいないわけだ
```
Welcome to Streamlit!

If you’d like to receive helpful onboarding emails, news, offers, promotions,
and the occasional swag, please enter your email address below. Otherwise,
leave this field blank.

Email: 
```
`~/.streamlit/credentials.toml`がないとこれが出る仕組みのようだが。（[参考](https://stackoverflow.com/questions/72515604/streamlit-showing-me-welcome-to-streamlit-message-when-executing-it-with-docke)）
サービスで起動する場合、それがどこかが分からなかった。（うまい回避方法をご存じの方、ぜひコメントください！）
なので、苦肉の策としてパッケージの中身を書き換える必要がある。

インストールされたパッケージの中からstreamlitのフォルダを探し
（{pythonインストールフォルダ}\Lib\site-packages\streamlit）
「runtime\credentials.py」の250行目あたり（streamlit 1.45.1）を以下の様に変える。
```diff_python
            while not activated:
                import click

-                email = click.prompt(
-                    text=email_prompt(),
-                    prompt_suffix="",
-                    default="",
-                    show_default=False,
-                )
+               email=""
                
                self.activation = _verify_email(email)
                if self.activation.is_valid:
```
これで、この処理をスルーすることができ、無事起動する。

# インストールと起動
あとは本家に従い、以下の順で実行する。
```
WinSW-FastAPI.exe install WinSW-FastAPI.xml
```
```
WinSW-FastAPI.exe start WinSW-FastAPI.xml
```

# まとめ

pythonを実行させているという記事を見つけられなかったので書いてみました。
Compute Engine

# Compute Engine(GCE)


Google Cloudで本格的な仮想マシン環境を構築したいときに、まず登場するのが **Compute Engine** です。AWSでいうEC2に相当し、IaaS（Infrastructure as a Service）の中核として位置づけられています。



## Compute Engineとは

**Compute Engine** は、Google Cloud が提供する仮想マシン（VM）サービスです。物理サーバを自前で管理せずとも、数クリック・数コマンドで仮想マシンを立ち上げて使い始めることができます。

### 主な特徴

- **高性能なVMを簡単に作成可能**
- **幅広いマシンタイプとOSの選択肢**
- **オートスケーリング・高可用性に対応**
- **柔軟なネットワーク／セキュリティ設計**



## インスタンスの作成方法（GUI & CLI）

### GUIでの作成手順（Cloud Console）

1. GCPコンソールにログイン  
2. 左メニューから「Compute Engine」→「VM インスタンス」へ  
3. 「インスタンスを作成」をクリック  
4. 以下を設定：
   - インスタンス名
   - リージョン／ゾーン
   - マシンタイプ（例：e2-medium）
   - OSイメージ（Debian, Ubuntu, Windowsなど）
   - ファイアウォール設定（HTTP/HTTPS開放など）  
5. 「作成」をクリックして起動！

### CLI（gcloud）での作成例

```bash
gcloud compute instances create example-instance \
  --zone=asia-northeast1-a \
  --machine-type=e2-medium \
  --image-family=debian-11 \
  --image-project=debian-cloud
```


マシンタイプの選び方

| マシンタイプ        | 特徴      | ユースケース例                  |
| ------------- | ------- | ------------------------ |
| `e2-micro`    | 非常に低コスト | テスト環境、学習用                |
| `n1-standard` | バランス型   | 一般的なWeb/APIサーバ           |
| `c2`          | CPU最適化  | 計算負荷の高い処理（機械学習、シミュレーション） |
| `m1`          | メモリ最適化  | インメモリDB、大規模キャッシュ処理       |


## ストレージとネットワークの基本構成

### ストレージ

- **ブートディスク**：OSイメージ（例：Debian, Ubuntu など）を格納。インスタンス起動に必須。
- **追加ディスク**：データ保存やアプリケーションログなど、用途に応じて後から追加可能。

### ネットワーク

- **VPCネットワーク**：GCP上で仮想ネットワークを設計・管理する仕組み。
- **ファイアウォールルール**：インバウンド／アウトバウンドの通信を制御。ポート指定も可能。
- **外部IP／内部IP**：インターネット経由のアクセスが必要かどうかで使い分ける。



## セキュリティ設定の基本

Compute Engine を安全に運用するために、以下の点を押さえておくとよいです。

- **SSH鍵によるアクセス制御**：パスワードではなく公開鍵認証を利用。
- **IAMロールによる権限管理**：最小権限の原則に基づき、ユーザーごとに操作範囲を制限。
- **ファイアウォールでのIP制限**：必要なポートだけを開放し、許可されたIPのみに制限。
- **OS／ソフトウェアの定期アップデート**：脆弱性対応はこまめに行う。



## 実践的な使い方・Tips集

### スナップショットでバックアップ

ブートディスクやデータディスクを定期的にスナップショットとして保存しておけば、障害時に迅速な復旧が可能です。

### 自動スケーリング設定の活用

マネージドインスタンスグループと組み合わせれば、アクセス負荷に応じてインスタンス数を自動調整できます。

### スタートアップスクリプトで自動構成

インスタンス起動時に自動でパッケージインストールや設定を行えます。例：

```bash
#!/bin/bash
apt update
apt install -y nginx
systemctl start nginx
```

## リンク

- [公式ドキュメント](https://cloud.google.com/compute/docs?hl=ja)
plenv, cpanm を ZScaler 配下で使う際のメモ

# はじめに

以前 [ZScaler 配下でnpm install ができなかったときの対応方法](https://qiita.com/keiichi-hikita/items/97b31480a604c2359791) のような記事を書きましたが、ちょっと Perl に相当久しぶりに触れる機会があり、その際にこの ZScaler 問題含めて色々覚えたことがあるのでメモ。

# plenv のインストール

Pythonに `pyenv` があるのと同じように、Perl には `plenv` というものがある。
以下で使えるようになる。

```bash
brew install plenv
```

`.zshrc` に以下を追記。

```
eval "$(plenv init -)"
```

使い方は `pyenv` とかとほぼ同じ感じなので割愛。

# plenv について ZSaler 問題を回避するための方法

ZScaler 配下だと、以下のようなエラーとなり `install -l` の時点で弾かれる。

```
% plenv install -l                                                                    
Available versions:
599 Internal Exception, https://fastapi.metacpan.org/v1/release/_search, SSL connection failed for fastapi.metacpan.org: SSL connect attempt failed error:14FFF086:SSL routines:(UNKNOWN)SSL_internal:certificate verify failed
```

この対策のため、`.zshrc` に以下を追記する。
`ca-bundle.pem` は冒頭に書いた以前の記事で作ったもの。

```
export SSL_CERT_FILE=/path/to/ca-bundle.pem
```

# cpanm のインストール

モジュールをインストールするためのツールとして、Node では `npm` , `yarn` があるのと同じで、Perl には `cpanm` というものがあると知った。
`plenv` でこれを使用したい場合、ストレートに以下のコマンドが存在する。

```
plenv install-cpanm
```

これが終わったら、 `cpanm` コマンドを使用して、以下のようにモジュールインストールができる。

```
cpanm JSON
```

結果こうなる。

```
plenv list-modules

App::cpanminus
JSON
```

Perl ほぼ覚えていないので、次やるとき絶対覚えてないと思って記事にしてみました。
久々にAmazon Qを起動したらコマンド補完機能がぱっと使えなかった

## 概要

筆者は割とターミナルを使う。
コマンドの入力補完にAmazon Qを使っている。Macを再起動しいつも通りAmazon Qを起動しようと思い`$ q`のコマンドを実行したら専用のターミナルが起動しclaude-4-sonnetと対話できるモードになってしまった。コマンド入力補完機能を再度使えるようにするまでの内容を記載する。

## 方法

せっかくclaude-4-sonnetくんとの対話ができるので本人に聞いてみた。

```
> amazon Qってターミナルの入力を補完する用途はありませんでしたっけ？
はい、その通りです！Amazon Q にはターミナルでのコマンド補完機能もあります。

Amazon Q Developer には主に2つの機能があります：

1. Amazon Q Developer Chat（現在使用中）
   • 対話形式での開発支援
   • コード生成、デバッグ、AWS サービスの相談など

2. Amazon Q Developer CLI Completions
   • ターミナルでのコマンド入力補完
   • コマンドの候補表示や説明
   • 自然言語でのコマンド生成

CLI 補完機能を使用するには、別途設定が必要です。q コマンドで以下のように確認・設定できます：

bash
q --help


もしくは CLI 補完機能を有効にしたい場合は：

bash
q configure


現在は Chat モードで対話していますが、ターミナルでの日常的なコマンド入力をサポートする機能も Amazon Q の重要な機能の一つです。どちらの機能についても詳しく説明できますので、お気軽にお聞きください！
```

どうやら2モードあるらしく（自分はターミナル入力補完用途以外使ってなかった）`$ q configure`を実行することで有効化できるらしい。
このままclaude-4-sonnetくんがやってくれたら楽だなーと思い、サジェストされたコマンド実行せずに自然言語でゴリ押ししてみる。

```
Allow this action? Use 't' to trust (always allow) this tool for the session. [y/n/t]:

> y
✔ bash pre post into .bashrc
✔ bash pre post into .profile
✔ bash pre post into .bash_profile
✔ zsh pre post into .zshrc
✔ zsh pre post into .zprofile
✔ fish pre
✔ fish post


 ⋮ 
 ● Completed in 0.248s

素晴らしいです！CLI補完機能が正常にインストールされました。

設定完了！ 以下の機能が有効になりました：

✅ bash - .bashrc, .profile, .bash_profile に統合
✅ zsh - .zshrc, .zprofile に統合  
✅ fish - pre/post フックが有効

使用方法：

1. 新しいターミナルセッションを開始するか、現在のシェルを再読み込みしてください：
  bash
   source ~/.zshrc  # zshの場合
   # または
   source ~/.bashrc  # bashの場合
   

2. CLI補完機能の使用：
   • ターミナルでコマンドを入力中に Tab キーを押すと Amazon Q が補完候補を表示
   • 自然言語でコマンドを説明すると、適切なコマンドを提案
   • q translate コマンドで自然言語をシェルコマンドに変換

3. インライン補完：
   • q inline コマンドでインライン補完機能も利用可能

新しいターミナルを開いて試してみてください！
```

現在の状況や必要なもののインストールまですべてclaude-4-sonnetくんがやってくれた。自分はただ内容を確認して`y`を押下していただけだった。
言われた通り`$ source ~/.bashrc`を実行する。ところがうまくいかない。自分はbashを使っているつもりだが念の為`$ source ~/.zshrc`を実行したら補完が動作した。
【Cursor】ルール設定がめんどくさい人向けの超絶簡単なルール設定（設定時間1分）

# はじめに
本記事では、個人開発や雑な開発で「ルール書くのめんどいけど、それなりなアウトプットが欲しい！」って方向けに、設定時間 **1分くらい** でできる設定を解説します。

:::note warn
基本的にProject Rulesはプロジェクト固有のコーディングスタイルや、ドメイン周りの知識などを用意し、AIにとってのガードレールを整備することでアウトプットが安定します。
:::

# 設定方法
`Cursor Chat`で参照されるべきルールを一つだけ作成するだけです。

## グローバルなルールを追加
`.cursor/rules/`配下に以下のファイルを追加し、ルールを記載しましょう。

`Rule Type`は `Always`にし、いつでも参照されるように設定します。
```text:000_grobal.mdc  (名前はなんでもいいです)
# 共通のルール
日本語で回答して下さい

# Agentモードでのルール
Chatの`Agentモード`でのみ参照されるべきルールです。
`Askモード`では参照しないでください。
ルールを参照したら「Agentモードのルールを参照しました」と言ってください

1. ユーザーからの指示もとにタスク計画を作成する
2. タスク計画の際に確信度が90%以上になるまで、ユーザーに対して不明点を聞きながらタスクの解像度を上げた上で、タスク計画を作成する
3. 作成したタスク計画をもとに、ユーザーに対して「変更予定の具体的なファイル名」と「変更内容」を提示し、必ずユーザーからのタスク実行の許可を受ける。
4. タスク実行の許可が降りたら、ユーザーによって許可された計画に基づきステップバイステップで実行する。

# Chatモードでのルール
Chatの`Askモード`でのみ参照されるべきルールです。
`Agentモード`では参照しないでください。
ルールを参照したら「Askモードのルールを参照しました」と言ってください。

1. ユーザーの質問に対して、必要であればライブラリのリファレンスを参照しながら、正確な情報を提示する。

```

## この設定でどのような挙動になる？
AgentモードとAskモードで別々のルールを参照することにより、「Askモードでタスク計画を立てる」ような不要な動作をしなくなります。

### `Agentモード` 
1. ユーザーの指示に対してタスク計画を作成し始めます。
2. タスク計画の中でCursor君が分からない点が出てきたらユーザーに対して質問をします。
3. 質問を通してCursor君のタスクに対しての確信度が `90%` になったら、ユーザーに対して具体的なタスク計画を提示します。
4. ユーザーの許可が下りたらタスクの実行を開始します。

### `Askモード`
とりあえず正確な情報を提示するよう徹するようになる

# まとめ
`Project Rules` をきちんと整備するのが良いアウトプットを出す秘訣ですが、今回はめんどくさがり屋のい人向けに最低限なルールを設定する方法を解説しました。

ルール設定に時間をかけたくない方、Cursor初心者の方、一度設定してみてはいかがでしょうか？
Pub/Sub

# Pub/Sub

Pub/Sub（Publish/Subscribe）は、Google Cloud のイベント駆動設計を支えるメッセージング基盤です。

AWSで相当するのは、SNS + SQSの組み合わせになります。



## 1. Pub/Subの思想：なぜ存在するのか？

Pub/Subの設計思想を一言で言えば、

> **「サービス間の独立性を保ちながら、情報を柔軟に中継する」**

です。

マイクロサービス時代において、以下のような課題が増えています：

- サービス同士が密結合になって変更に弱い
- 同じ情報を複数の場所で処理したいが冗長な連携が必要
- 非同期処理が必要なのに、都度HTTP連携している

Pub/Subはこうした構造の“ねじれ”を解消します。



## 2. ユースケース：こんなときに使える

### 例1：GCSにファイルがアップロードされたときに処理を走らせる

構成：
[ Cloud Storage ] → [ Pub/Sub ] → [ Cloud Function / Cloud Run ]

内容：
- バケットに画像がアップロードされる
- Pub/Subが通知メッセージを発行
- Cloud Functionがトリガされ、画像のリサイズやメタデータ抽出などを実行

### 例2：ユーザーのアクションをリアルタイム分析に回す

構成：
[ アプリ / API ] → [ Pub/Sub ] → [ Dataflow ] → [ BigQuery ]

内容：
- アプリケーションがユーザーイベント（例：クリック）をPub/Sub経由で送信
- DataflowがPub/Subのストリームを受信し、整形
- BigQueryに蓄積されてリアルタイム分析が可能に



## 3. 最小構成を実際に作ってみる

ここでは、手元で試せる**最小構成の例**を紹介します。

### 手順：シンプルなPub/Subパイプラインの構築

```bash
# 1. Topic作成
gcloud pubsub topics create my-topic

# 2. Subscription作成（Pull型）
gcloud pubsub subscriptions create my-sub --topic=my-topic

# 3. メッセージをPublish
gcloud pubsub topics publish my-topic --message="Hello, PubSub!"

# 4. メッセージをPullして読む
gcloud pubsub subscriptions pull my-sub --limit=1 --auto-ack
```
この例で確認できること：

Topicにメッセージを送り

Subscriptionがそれを受信・保持し

Pull型で読み出せる

非常に単純ですが、ここに非同期設計のエッセンスが凝縮されています。


## 4. 他サービスとの組み合わせ：より実用的に



| 組み合わせ           | 用途            | 補足                         |
| --------------- | ------------- | -------------------------- |
| Cloud Functions | 軽量処理・通知       | Push型サブスクリプションで自動起動        |
| Cloud Run       | バッチ・API処理     | 任意のランタイムで処理可能              |
| Dataflow        | 高速・大規模ストリーム処理 | Pub/SubがDataflowの入力になる     |
| BigQuery        | ログ分析          | Dataflow → BigQuery連携構成が鉄板 |
| Workflows       | 複数サービスの連携制御   | Pub/Subでイベント駆動化可能          |



## 5. 配信の保証とエラーハンドリング
Pub/Subは “少なくとも一度は届く（at-least-once delivery）” というポリシーです。

そのため：

重複処理に耐える設計が必要（冪等性が重要）

Dead-letterトピックの活用で、失敗メッセージを別途保存可能


## 6.リンク

- [公式ドキュメント](https://cloud.google.com/pubsub/docs?hl=ja)
今更 PHP PEAR を使ったQRコード生成

下記プログラムにて生成。
qrcnv.php
```
<?php
require_once("Image/QRCode.php"); 

$qr = new Image_QRCode();

$iamge=$qr->makeCode('http://example.com');

?>
```
下記QRcode表示処理。
qrdisp.php
```
<?php

<img src="./qrcnv.php">

?>
```
ブラウザにて確認。
![qrcnv_test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/c8f66335-6dec-4381-a763-cd66c7ea2a6b.png)
ここで問題があります。 PEARはすでに終わっているライブラリー何とか使える PHP7.3までしか使えません。
また、 Ubuntu 20.04では/usr/share/php/OS/Guess.phpにエラーが出ました。
split() ereg_replace()が PHP7では不可なのでexplode,preg_replaceに変更してインストール出来ました。
 ```
 pear install Image_QRCode-0.1.3
 ```
クライアントのブラウザが、サーバーからホームページを要求する一連の流れ

インターネット越しでホームページを取得する流れを、段階的に詳しく解説します。

## 1. ユーザーの操作開始

**ユーザーがブラウザでURLを入力またはリンクをクリック**
- 例：「https://www.example.com」を入力
- ブラウザがこの要求を受け取る

## 2. URL解析とプロトコル判定

**ブラウザがURLを解析**
- プロトコル：HTTPS
- ホスト名：www.example.com
- ポート番号：443（HTTPSのデフォルト）
- パス：/（ルート）

## 3. DNS（ドメイン名システム）による名前解決

**IPアドレスの取得プロセス**
1. **ブラウザキャッシュ確認** → 見つからない場合
2. **OSキャッシュ確認** → 見つからない場合
3. **ローカルDNSサーバー（ISP等）に問い合わせ**
4. **再帰的DNS検索**：
   - ルートDNSサーバー → .comドメインサーバー
   - .comサーバー → example.comの権威サーバー
   - 最終的にIPアドレス（例：192.0.2.1）を取得

## 4. TCP接続の確立

**3ウェイハンドシェイク**
1. **SYN**：クライアント → サーバー（接続要求）
2. **SYN-ACK**：サーバー → クライアント（接続受諾）
3. **ACK**：クライアント → サーバー（接続確立）

## 5. SSL/TLS暗号化接続（HTTPSの場合）

**セキュア接続の確立**
1. **Client Hello**：暗号化方式の提案
2. **Server Hello**：暗号化方式の決定 + サーバー証明書送信
3. **証明書検証**：認証局による署名確認
4. **暗号鍵交換**：共通鍵の生成
5. **暗号化通信開始**

## 6. HTTPリクエストの送信

**ブラウザがHTTPリクエストを作成・送信**
```
GET / HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: text/html,application/xhtml+xml,application/xml
Accept-Language: ja,en-US;q=0.9,en;q=0.8
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
```

## 7. インターネット経由でのデータ転送

**パケット配送プロセス**
1. **パケット分割**：データを小さな単位に分割
2. **ルーティング**：複数のルーター経由でサーバーまで配送
3. **各中継点**：ISP → バックボーン → 目的地ISP → サーバー

## 8. サーバーでの処理

**Webサーバーの動作**
1. **リクエスト受信**
2. **リクエスト解析**：HTTPヘッダーとパスの確認
3. **認証・権限チェック**（必要に応じて）
4. **ファイル検索または動的コンテンツ生成**
```
    4.1 **もし要求が静的なHTMLファイル（例: index.html）であれば、
    単にそのファイルを読み込みます。**
    
    4.2 **もし要求が動的なプログラム（例: search.php）であれば、
    アプリケーションサーバーがプログラムを実行します。
    プログラムは必要に応じてデータベースから商品情報を取得するなどして、
    その結果を元に動的にHTMLを生成します。** 
```
5. **HTTPレスポンス作成**

## 9. HTTPレスポンスの送信

**サーバーからクライアントへレスポンス送信**
```
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 1234
Server: Apache/2.4.41
Date: Mon, 01 Jan 2024 12:00:00 GMT

<!DOCTYPE html>
<html>
<head><title>Example</title></head>
<body>...</body>
</html>
```

## 10. レスポンスの受信と処理

**ブラウザでの処理**
1. **パケット再組立**
2. **HTTPヘッダー解析**
3. **ステータスコード確認**（200 OK等）
4. **コンテンツタイプ判定**

## 11. HTMLパースとレンダリング

**ページ表示プロセス**
1. **HTMLパース**：DOM（Document Object Model）ツリー構築
2. **外部リソース検出**：CSS、JavaScript、画像等
3. **追加リクエスト**：各リソースに対して上記プロセスを繰り返し
4. **CSSパース**：スタイル情報の適用
5. **レイアウト計算**：要素の配置決定
6. **描画**：画面への表示

## 12. 追加リソースの読み込み

**並行処理で効率化**
- 画像ファイル
- CSSファイル
- JavaScriptファイル
- フォントファイル等

## 13. JavaScript実行とページ完成

**動的コンテンツの処理**
1. **JavaScript実行**
2. **DOM操作**
3. **非同期通信**（Ajax等）
4. **ページ表示完了**

## まとめ

この一連の流れは通常数秒以内に完了しますが、実際には：
- **キャッシュ機能**により2回目以降は高速化
- **CDN（Content Delivery Network）**により地理的に近いサーバーから配信
- **HTTP/2やHTTP/3**により複数リソースの並行転送で効率化

といった最適化技術により、ユーザー体験が向上しています。
netkeiba-scraperが2025年6月現在動くかの話(Ubuntu 24.04.2 LTS)

## はじめに
netkeiba-scraperが2025年6月現在、Ubuntu 24.04.2 LTS / openjdk 17.0.15 2025-04-15で動作する確認が取れました。下記は今回の前身となる6年前の記事です。

https://qiita.com/dk4130523/items/2c13dd713e8a84693aa9

この間(6年間)、週1回ペースでこつこつと動作確認/若干の分析/研究を続けていました(!)。先日ふと「そういえば最新のJava LTSは21よね」「netkeiba-scraperはJava 8で動かしてきたはず」「EOL=2030年説もあるけど『8のまま』もいかがなものか(『座して腐食』は技術者として避けたい...stockedgeさんのほんとよくできたコード(*'▽'))」と考えました。

そこでまず21で試行しました。結果、エラーが出ました(今回は深追いしない)。次に、21でダメなら1個下の17では――と思い試行したところ、さらっと動きました。それでご報告といった次第です。

## 総じて
上記を総じて、今回わざわざ記事を起こす意図/ポイントは「公開当初(10年前(!))はJava 8だったと思います。それが(ソースコードはそのまま)17で動きます」です。

## 動作環境
### Ubuntu
```
$ cat /etc/issue
Ubuntu 24.04.2 LTS \n \l
```
### java
```
$ java -version
openjdk version "17.0.15" 2025-04-15
OpenJDK Runtime Environment Temurin-17.0.15+6 (build 17.0.15+6)
OpenJDK 64-Bit Server VM Temurin-17.0.15+6 (build 17.0.15+6, mixed mode, sharing)
```
### sbt
```
$ sbt --version
sbt runner version: 1.11.2
```
### free
```
$ free
               total        used        free      shared  buff/cache   available
Mem:         8131312     2643604      960836       39416     4880460     5487708
Swap:              0           0           0
```
#### 付記/備考
メモリ8GBのVPSで動かしています。2.2GB程度の安定的なメモリ消費で処理が回っているようです。

--
簡単ですが、以上です。
バックトラッキングについて調べてみる

# はじめに
以前、数独のウェブアプリを作った際にアルゴリズムの「バックトラッキング」というものをchatGPTから提案されました
一旦その場は理解しきれなかったので、今回で概念だけでも理解できればと思い記事にしようと思います

# バックトラッキングとは
> 組み合わせ探索問題や最適化問題を解くための汎用的なアルゴリズムです。簡単に言うと、「試行錯誤をしながら、間違えたら引き返して別の道を試す」というアプローチを取ります。

ということらしいです

# 具体的なイメージ
正直なところ説明の文章を読んでもなんじゃやそれ状態なので、もう少し深掘りをしてみます
簡単な例で行くと、迷路や2分木で表現すると分かりやすそうです

迷路であればスタートからゴールに向かうまでに幾つか分岐点がありますが、各分岐点で選択肢をひとつ残らず系統的に試していくというイメージです

2分技も親ノードから一番深い子ノードに辿り着くにはどのノードを辿っていけば良いのかを、間違えては分岐点まで戻り、間違えた選択肢とは別のものを選ぶということを繰り返します

段々と理解できてきた気がします

![test.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701238/1a2e4c3e-174e-47fb-89ad-33fe9c50b930.png)

こんな2分技があったとすると
回答の探し方としては以下が考えられます

> まずはAからBに進んでそのあとEに進みますが、正解ではないので次の答えの候補を探さないといけません
そこで次はAからBに行ってFまで進みますが、これも正解ではありませんね
じゃあ次はAからCに行ってG、、、、

明らかに重複している処理があるかと思います
最下層のノードを見る際にAまで戻る必要があるかという点ですね
例えばEやFが正解かを調べる場合にはBまで見ていたらそこまでは正解であると仮定して、
B、C、DからBを選んでという選択の回数が減りますね

これがバックトラッキングということになります
今回はまだ2分木の例が少ないので、あんまり関係ないのではと思われるかもしれませんが階層が深くなるごとに計算量が増えていくので、やはり余計な選択・処理はしない方が良いですよね(ゲームでもチェックポイントは欲しいですよね、初めからやり直すのは面倒ということです)

# 数独に当てはめて考えてみ
ことの発端は、数独の問題を作ってみたところから始まりますので、同じように考えてみます

9 x 9の盤面があり、そこに数字の1を全て入れるところから考えてみます

|   | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|---|---|---|---|---|---|---|---|---|---|
| A |   |   |   |   |   |   |   |   |   |
| B |   |   |   |   |   |   |   |   |   |
| C |   |   |   |   |   |   |   |   |   |
| D |   |   |   |   |   |   |   |   |   |
| E |   |   |   |   |   |   |   |   |   |
| F |   |   |   |   |   |   |   |   |   |
| G |   |   |   |   |   |   |   |   |   |
| H |   |   |   |   |   |   |   |   |   |
| I |   |   |   |   |   |   |   |   |   |

数独は同じ数字が縦横で重ならないというルールがあるので、それに違反した場合は手順戻ってやり直すという感じですね

判定として同じ行に同じ数字はあるか、同じ列に同じ数字があるかを確認して存在していれば間違っている、存在していなければ正解になります
A1に1を入れた場合、A2以降には数字が入らないので処理がスキップできます
次にB行についてですがここで、初めて同じ列に同じ数字が発生するのでB1に1は置くことができないという判定になります

その後の処理としてはもしもバックトラッキングを使っていなければ再びA1から考え直すことになりますがバックトラッキングを活用すると間違ったところ、つまりB列の2からやり直すという処理に変わりるので、かなり計算量を削減できていることがわかるかと思います

なんでもfor文で回しちゃいけないですね、本当に

実際のコードについては以下記事でも紹介しているので興味があれば覗いてみてください
↓
https://qiita.com/ryo0819/items/c70e7950ece35e1ca60c

# おわりに
ということで久方ぶりのアルゴリズムについて考えてみるという記事でした
深さ優先探索や幅優先探索など遠い昔にやったことがありますが、いざ活用しようと思うと適切に活用できていないので、日頃かそのような思考ができるように努力したいです