OmniAICreator/Qiita-1.07M huggingface dataset:
Linuxログ解析をAIで効率化するツールを作ってみた

## はじめに

Linuxシステムを運用していると、ログ解析が避けられません。しかし、膨大な量のログを人力で確認するのは大変な作業であり、かなり属人化する作業でもあります。そこで、OpenAIのGPT-4を活用してログ解析を効率化するツール「**LogAnalyzerGPT**」を作成しました。

この記事では、LogAnalyzerGPTの概要、特徴、使い方について紹介します。

---

## LogAnalyzerGPTの概要

### **LogAnalyzerGPTとは？**
LogAnalyzerGPTは、Linuxシステムのログを収集・解析し、エラーや警告、潜在的な問題をAI（GPT-4）を使って要約するPythonツールです。

このツールを使うことで、システム管理者や開発者が問題を素早く把握し、効率的に対応できるようになります。

### **対象とするログ**
以下のログファイルを解析対象としています：
- `/var/log/syslog`
- `/var/log/messages`
- `/var/log/dmesg`
- `/var/log/auth.log`
- その他の主要なログファイル（カスタマイズ可能）

---

## 主な特徴

### 1. **エラーと警告の自動抽出**
`error`, `failed`, `critical` などのキーワードを基に、重要なログだけをフィルタリングします。

### 2. **AIによるログの要約**
OpenAIのGPT-4を利用して、フィルタリングされたログを要約し、システムの状態や潜在的な問題を簡潔に伝えます。

### 3. **カスタマイズ性**
- 対象とするログファイルや検索キーワードを自由に変更可能。
- 出力結果はテキストファイルとして保存。

### 4. **スケーラブルな設計**
膨大なログにも対応可能。必要に応じてログのサイズや解析範囲を調整できます。

---

## 使用方法

### 1. **GitHubリポジトリをクローン**
まずはリポジトリをクローンします。

```bash
git clone https://github.com/takurot/LogAnalyzerGPT.git
cd LogAnalyzerGPT
```

### 2. **必要なライブラリをインストール**
Pythonの依存ライブラリをインストールします。

```bash
pip install openai
```

### 3. **OpenAI APIキーを環境変数に設定**
`~/.bashrc` または `~/.zshrc` に以下を追加してください。
```bash
export OPENAI_API_KEY="your_openai_api_key"
```

### 4. **スクリプトを実行**
`sudo` 権限でスクリプトを実行します。

```bash
sudo python3 log_analyzer_gpt.py
```

### 5. **結果を確認**
スクリプト実行後、生成された `log_summary.txt` ファイルに要約結果が保存されます。

---

## スクリプト内での環境変数利用

スクリプトでは、環境変数からAPIキーを取得するようになっています。

```python
import os
import openai

# Get the OpenAI API key from environment variables
openai.api_key = os.getenv("OPENAI_API_KEY")

if not openai.api_key:
    raise ValueError("The OpenAI API key is not set. Please set it as an environment variable: OPENAI_API_KEY.")
```

---

## セキュリティ注意点

1. **APIキーの管理**
APIキーはコード内に直接記述せず、環境変数を利用することでセキュリティを向上させます。キーを公開しないよう十分注意してください。

2. **ログファイルのアクセス権**
ログファイルへのアクセスには管理者権限が必要です。特定のユーザーに権限を付与する場合は以下を参考にしてください：
```bash
sudo chmod 644 /var/log/syslog
```

3. **`sudo` をパスワードなしで実行**
特定のコマンドに対してパスワードなしで `sudo` を許可する方法については、[README](https://github.com/takurot/LogAnalyzerGPT) をご参照ください。

---

## 今後の改善予定

- ログ解析結果の可視化（グラフ化やダッシュボード作成）
- アラート機能の追加（深刻なエラーをメールやSlackで通知）

---

## おわりに

LogAnalyzerGPTは、システムログ解析の効率化を目指して開発したツールです。GitHubリポジトリにて公開しています。

🔗 **GitHubリポジトリ**: [https://github.com/takurot/LogAnalyzerGPT](https://github.com/takurot/LogAnalyzerGPT)
アプリケーションのQoS要件

### フローとは
https://qiita.com/masatom86650860/items/993ded9c699b894ab19c

# フローに要求される品質 : QoS
>`帯域`、`遅延`、`ジッター`、`ロス`の四つのパラメータで特徴づけられる。これらすべてのパラメータによって、フローに要求される`QoS(Quality of Service:サービス品質)`で決まる

* 帯域はHzかな？
* 遅延は出力に時間がかかってるとしか分かっていない
* ジッターとは？
* ロスとは?

# アプリケーションの種類ごとの要求されるQoS

>例えば、ネットワークは`信頼性の高いファイル転送のためにロスのない通信を実現する必要がない`し、`音楽や動画の再生のために常に一定の遅延での通信を実現する必要もない`。
>
>`前者の例ではある程度のパケットロスが発生しても再送を行えば修復可能`であるし、`後者の例では受信側でバッファリング`を行うことによって、ある程度のジッターであれば平滑化できる。しかしながら、`ネットワークの帯域が狭すぎ`たり`遅延が大きすぎ`たりすると場合は、アプリケーションによる品質の改善は期待できない。

* すべてのアプリケーションが上の４つの要件をすべて優れたものにしなくてもいい
* それぞれでカバー（再送、バッファリングなど）すればなんとかなる
* 帯域が狭すぎたり遅延があまりにも大きいとカバーが間に合わない
* バッファリングに関しての体験はyoutube再生時、いきなりオフラインにしても少しの間だけ再生される
* 帯域はパケットがどれだけ流れるか
* 一定の遅延とは？

### 通信の遅延
> 電子メールやビデオなどのファイル転送アプリケーションは遅延に敏感ではない。すべてのパケットに一様に数秒の遅れがあっても、特に害はない。いっっぽう、`ウェブサーフィンやリモートログインなどのインタラクティブなアプリケーションは、それらよりも遅延に敏感`である。電話やビデオ会議のおゆな`リアルタイム・アプリケーションは、遅延に対する要求`がさらに厳しい。例えば、`電話での会話のごとばがすべておくれて相手に届いた場合、その電話は使い物にならない`であろう。一方、`サーバー上にある音声や動画を再生する場合には、遅延が多少多くても問題`にはならない。

* 電話、テレビ電話などのリアルタイムに要求されるものは遅延に敏感
* 電話が遅れたりすると会話ができない
* インターネットで調べ物をするときもサイトの開く時間が遅れるとイライラする

### ジッター: 遅延やパケット到着時間の変化
>遅延やパケット到着時間の変化(標準偏差)

>（電子メール、ファイル転送、Webアクセスは）パケットの到着時間が不規則であっても影響を受けない。`遠隔ログインはややその影響を受け、ジッターが大きい場合には画面の更新がぎこちなくなってしまう`。`動画や、とりわけ音声は、非常にジッターに敏感`である。ユーザーがネットワークを通して動画を見ている時に、`すべてのフレームパケットが正確に2000秒だけ遅延しているような時は全く問題は起きない`が、`遅延が１秒と２秒の間でランダムに変化するような場合には、アプリケーション側でジッターを隠さない限り、視聴に支障をきたす`ことになる。`オーディオの場合は、数ミリ秒のジッターでもはっきりと聞き取ることができる`。

* 2000秒は30分以上だが正確に遅延すればいいのか？
* 遅延やパケットの到着時間の変化あると滑らかに出力できないのか

### パケットロス
>（電子メール、ファイル転送、Webアクセス、遠隔ログインは）すべてのビットが正しく配信される必要があるため、`動画や音声よりもロスに関する要求品質が高い`。通常は、`トランスポート層で、ロスしたパケットの再送を行うことで、この要求品質が達成`される。これは無駄な処理であるため、パケットロスが発生しそうなことが`事前に分かっている場合には、ネットワークがパケットの転送を拒否する方が本来は望ましい`。`音声や動画のアプリケーションでは、一瞬の音声が停止したり時折フレームが飛ばされたりしてもユーザーは気づかない`ため、ロスが発生しても再送を行う必要はない。

* 一つ一つのパケットの内容が重要なアプリケーションはロスに対して高い要求がある
* 連続性のある音声、動画は小さなコマが飛んでも気づかない

# QoSの種類
>* 固定ビット・レート（例：電話）
>* リアルタイム可変ビット・レート（例：圧縮ビデオ会議）
>* 非リアルタイム可変ビット・レート（例：オン・デマンド映画視聴）
>* 利用可能ビット・レート（例：ファイル転送）

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/
chromebookで、vscodeとsympyの組み合わせ調子悪いです。突然反応なし。メッセージなし。バージョン調査中。本文なし。

本文なし。
バージョン調査中。

再起動？だめ
終了。OFFONで復帰。

全部消えていなくてヨカッタです。
TypeScriptの習得はJS知ってたらラク

こんにちは。少々、記事タイトルの表現がうざったいですね。ごめんなさい。
# そもそも
TypeScriptは、JavaScriptにﾁｮｯﾄ機能を追加したものと考えて大丈夫です。
コンパイルすると、JavaScriptが生成できます。
# Q.なぜわざわざTypeScriptに
A. コード補完がたくさん出てくる！

VSCode等エディタでは、コード補完機能として、インテリセンスが使用できます。
が、JavaScriptにおいてはWindow、document等などは補完してくれますが、それら以外は結構出てこないです。

TypeScriptは変数に型がほぼ必ず(例外あり)ついているので、十分に補完できるわけですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3342510/18991347-a0f7-120b-e10a-7eb8e36f902e.png)

他にもあるんですが私は主にこういうメリットで使用しているのでこれしか解説できません...

こちらの記事はより詳しい事を書いてくださっているので是非

https://qiita.com/panda76/items/db29d135380cafed207b
# 使い方は？
パッケージを初期化してtypescriptをインストールします。私はpnpmを使います。
```bat
> mkdir typescript_test
> cd typescript_test
> pnpm init
> pnpm i -D typescript
```
次にtsconfigを生成しましょう。オプションがずらりと並んでいて怖いですが、重要なところだけ書いておけば大丈夫です。興味があったらこちらの記事が分かりやすいと思います。

https://qiita.com/crml1206/items/8fbfbecc0b40968bfc42

```bat
> pnpm tsc --init
```
開けてみると非常に多くのオプションがコメントアウトされていますね。
コメントを除去して見てみましょう。
```json
{
  "compilerOptions": {
    "target": "es2016",
    "module": "commonjs",
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "skipLibCheck": true
  }
}
```
es2016、commonjsという単語、見覚えがありますね(無かったら申し訳ないです)
compilerOptionsでは名前の通りコンパイラの設定を書きます。

"target"はes2016(ES7)になっていますね、多くのブラウザでサポートされているためTypeScript公式サイトではes2015(ES6)が推奨されています。お好みで(コンパイルの変化が見たいので私はこの記事ではes5を使いますね。)
"module"は出力するときにどういうモジュールシステムでコンパイルするかという事ですね。
他にもオプションがあるんですが、主にこれを環境に合わせて変えれば多くのフレームワークで使用できると思います。

書きましょう。

```ts:index.ts
class Nazokake {
    a = ""
    b = ""
    c = ""

    output() {
        console.log(this.a, "とときまして", this.b, "とかけます。その心はどちらも", this.c, "でしょう")
    }
}

const n = new Nazokake()
n.a = "TypeScript"
n.b = "にんじんじゃがいもカレールー"
n.c = "スーパー(マーケット)セット"
n.output()
```

なんということでしょう、ぜんぜん型がついているというTypeScriptのメリットが活かしきれてないし、私のセンスがつまらなすぎます。tscくんごめんね。

```bat
> pnpm tsc
```

```js:index.js
"use strict";
var Nazokake = /** @class */ (function () {
    function Nazokake() {
        this.a = "";
        this.b = "";
        this.c = "";
    }
    Nazokake.prototype.output = function () {
        console.log(this.a, "とときまして", this.b, "とかけます。その心はどちらも", this.c, "でしょう");
    };
    return Nazokake;
}());
var n = new Nazokake();
n.a = "TypeScript";
n.b = "にんじんじゃがいもカレールー";
n.c = "スーパー(マーケット)セット";
n.output();
```

このようにちゃんとtargetに合わせて出力してくれるわけですね。
では、TypeScriptでコンパイルする時にちゃんと指摘してくれるか検証してみましょう。

```ts:index.ts
let stringvar: string

stringvar = "TypeScript" // String
stringvar = 1            // Number
stringvar = false        // Boolean
```

おっと！

```bat
C:\Users\hoge\typescript_test> pnpm tsc
index.ts:4:1 - error TS2322: Type 'number' is not assignable to type 'string'.

4 stringvar = 1
  ~~~~~~~~~

index.ts:5:1 - error TS2322: Type 'boolean' is not assignable to type 'string'.

5 stringvar = false
  ~~~~~~~~~


Found 2 errors in the same file, starting at: index.ts:4
```

ちゃんとツッコんでくれましたね。
「なんでやねん！stringにnumber代入するなゆうたやろがい！」

...はい。
# 以上です
大規模開発で本領を発揮してくるTypeScript、ぜひ試してみてはいかがでしょうか
（イベントレポート）【Qiita Bash】アドベントカレンダーお疲れ様会

発表ではない

## 本稿のセミナー・イベントページ
https://increments.connpass.com/event/338077/

登壇参加だけど、イベントレポートも書きますよ！っていうので、いつものスタンスは崩さず行きます！

## ごあいさつ
25記事以上書いた猛者がいるぞ！っていうので上がってくる話
運営もエアプではない（迫真）

Qiita Bashの話とかHRTの話とか、すごいカッツリした感あるな

## スポンサーLT「課題 is 何」とアドカレの振り返りの話
レトロスペクティブ（振り返り）
→結構体系化されてるな。看板をうまく使ってる印象

議論の発散と収束をどうしようという話。
発散させた後にどうやって収束させるか？がポイント

- 時間の使い方
- 改善案の出し方
- ファシリテーターのスキルに依存する

すぐに解決策の話をしてしまうため、課題感の共有ができていない
→全員の「課題 is 何」を共有する
話していると忘れてしまうので、これを忘れないようにZoom背景に「課題 is 何」を書いておく
↑簡単に作れる仕組みを考えられると良さそう。そして、ありそう。

SmartHRさんは色んな場所で見るね、社内メンバーだと露出の機会も多く作れそう。
（良いか悪いかは人によるので、合う人にはクリティカル）

:::note
コミュニティ（カンファレンスを通じて参加）　は　いいぞ
:::

ただのおぢさんのコメント：挑戦意欲高い若手はいいね！

## 【伝統と】10年続いてるクソアプリアドベントカレンダーで発表された作品紹介【格式】
オンライン登壇のこと、会場で音声トラブルが！！
機材トラブルはあるあるですねー。

タイトルは釣りで、大したことないよ（ご本人）
役にたたないアプリを紹介

対多
嘘ポケ画像メーカー
瞬き耐久チャレンジ
画像をプルプルさせるアプリ
地獄のハイトーン攻略道場
人力オートクルーズ
GamePad Launcher
5秒で告白
うにが歩くAAがコンソールでアニメーション

am.sontixyou.com/r/ Musubu 絵文字がいっぱい

動くものを作っただけで百万点

クソアプリ＝ハッカソンで受賞しなかった作品を供養する場所が発端

## OpenAIの(Chat以外の)機能検証してみた
（直前なので甘め）

Chat以外の使い方を知りたい！
AI連携のライブラリを理解したい

- SpringAI
- Embedding AI
  - ベクトル値の傾向調査
  - 具体的には記事書いてるのでそっち見て
- Function Calling

現在地（指定地）から目的地まで行くための気温判定とアドバイスをもらうというシチュエーション。アウトプットが日本語ではなく英語になったり…

## 完走賞を目指すためにやったこと
（後で書きます。ほかの人の話が一番いいかな）

時間がなかった（知ってた）

## 一人ぼっちアドベントカレンダー
生成AIで遊ぼ
初アドカレ。全部埋まらなかった話
最終的にはぼっちカレンダーから脱却できた！

feloにアドカレ成功のコツを聞いてみた
→経験から書くといいよ！という天啓を得た
→計画を立てよう：これはできない

予約投稿をする→25日までかけたので誤差でしょ（ギリギリ）
AIが出してきた内容を踏まえて2025に入れよう

:::note
コミュニケーションを楽しもう
:::

スケジュール管理をちゃんとやろう

## 2025アドベントカレンダーふりかえり(仮)
:::note
- 遠慮せずに声をかけまくるとアーリーアダプタと出会える
- ポテンシャルはこんなものではない
- 一緒に仕事をしたり、場を作った仲間は本当に頼りになる
:::

会社としてアウトプットを推奨する文化がある！
個人で書くと自分が頑張ればいい
組織で書くと仲間づくりができるか？
→立ち上げは一人、宣伝しまくって埋めていった

キーマンに刺されば一気にバズる可能性がある

## Unityと.NETでオニオンアーキテクチャ
このツールなんだろ？cursor:VSCode？の拡張らしい？
→自前のアプリのビューだった！

Unityと.NETコンソールアプリを作ってコードを共有した

オニオンアーキテクチャとは？
後で調べよう

- (root)
  - Domain：ビジネスルール
  - UseCase: TODOを追加したりする機能とか
  - UI: コンソールとUnityで振る舞いが異なるのでかき分けている

共有のコツはDLLにまとめたこと。マルチプラットフォームに対応しやすいのいいぞ

## プロダクトのみんなで取り組む アドベントカレンダー（仮）
🎄🎅🎄
かわいい

組織で2シリーズ全部埋めたのすごい
参加率もチームメンバー全体で80%！
推進・協力づくりがうまいメンバーを据えて、EM以外がやっていくのが大事
なお、声掛けは何度もやる（元々発信をする文化がある）

心理的ハードルを下げる施策
書きたい・話したいテーマで書く。ネタが決まってなかったり、力作は求めてないことを強調！
つよつよ発信者をつなぐ
Slackスタンプで「アドカレ〇〇〇」を
記事公開をしたらプレゼント（チョコレート）

Qiitaではなく、通常のアドベントカレンダーそのものの話をした

## サポーターLT「jQuery」
SmartHR基本機能の話。ReactとjQueryの合わせ技
コンポーネントの一部かな？

チームメンバーが刷新されてjQueryが陳腐化してきている（が、Reactを推進するのも難しい）
レガシーシステムのあるある
リファクタより短期開発ができる現状案を優先しがち

SmartHR Design System/SmartHR UIというフレームワークを活用している（外部公開しているもの）
多言語化対応：WORNからPhraseに移行していきたいがライセンスとかの課題もあり
とはいえ、バックエンド側に寄せてRailsの話もある

リファクタするにしても優先順位とか、レガシー画面をモダンに変えた時のユーザーの反響とかも見るよ
ユーザーにRPA組んでもらっているので画面が変わると困る問題。これは難しいな

## Qiita運営より
イベント関連

https://increments.connpass.com/event/336093/

Qiita Bashの話。2月やるよ（まだない？）

## 全体所感
「もう最後か…、ここまでめちゃくちゃ笑ったわ」というコメントをサポーターLTにかいてたぐらい楽しんだ
この後の懇親会も楽しみ（だが、いつものごとく酔って何話したか覚えてないパターンに突入しそうで書けない…）
Java学習時の気づき

# Java学習時の気づき

## 変数の型
### boolean型
true,falseのいずれかの値のみ、代入することができる。そのため、真偽値型とも呼ばれる。
### charとStringの区別
・char → 文字（一つの文字）を格納し、引用符（'）で囲む。

・String → 文字列（文字の並び）を格納し、二重引用符（"）で囲む。

```sample.java
char zodiac;
zodiac = '辰';
String name;
name = "よしすえ"
```

## 算術演算子
### 商の結果について
整数同士の割り算に除算演算子（/）を用いると、結果として出力される商は整数のみを返してしまう。そのため、以下のように片方のオペランドを少数にすることで、正確な出力を得ることができる。
```sample.java
public class Main {
  public static void main(String[] args) {
    System.out.println("9/2") //4
    System.out.println("9.0/2") //4.5
  }
}
```
この結果が得られる理由としては、`9.0/2`では自動型変換が行われているからである。`9.0`は`double`型で`2`は`int`型だが、このとき、「意味的に大きな型」に統一されてから演算が開始される。したがって、今回であれば`2`が`2.0`の`double`型に変換されている。


### ++や--は他の演算子と使ってはならない
以下のサンプルコードを基に説明する。
```sample.java
public class Main {
  public static void main(String[] args) {
    int a = 10;
    int b = 10;
    System.out.println("++a + 50") //61 (a = 11)
    System.out.println("b++ + 50") //60 (b = 11)
  }
}
```
`++a`のとき、先にaがインクリメントされ、その後に50と加算される。一方、`b++`のとき、先に`b + 50`の加算が行われ、その後にbがインクリメントされる。このエラーを防ぐためにも、++や--は他の演算子と使ってはならない。

## オーバーロードの利用
基本、複数のメソッドに同じ名前を付けることはできない。しかし、以下の場合のみ、同じ名前を付けることができる。
・仮引数の変数の型が異なる
・仮引数の変数の数が異なる
すなわち、シグネチャ（下のコードの`add(int x, int y)`に該当）が重複しない場合にのみ、同じ命名が許される。
```sample.java
public static int add(int x, int y){
  ..............
}
```

## コマンドライン引数
mainメソッドでは文字列配列を引数として受け取るように定義されている。
`public static void main(String[] args) {`
この`String`配列には何が格納されるのかというと、`コマンドライン引数`である。コマンドライン引数とは、javaプログラム起動時にユーザーが追加できる情報のこと。
【AWS】静的Webホスティング方法の比較

# はじめに
静的Webホスティングをする必要があり、その際に調べ物をしたので記事にします。
2024/11版です！（重要）

以下のケースを比較します
- S3 のみ
- S3 + CloudFront
- S3 + Amplify

2024/11～、S3＋Amplifyで簡単に静的Webホスティングできるようになりました。その構成も含めた記事です。
参考：[AWS Amplify ホスティングで Amazon S3 静的ウェブサイトホスティングを簡素化および強化](https://aws.amazon.com/jp/blogs/news/simplify-and-enhance-amazon-s3-static-website-hosting-with-aws-amplify/)

# この記事で記載を省略すること
- 各サービスの設定方法
- 各サービスの概要

# シンプルフローチャート
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620254/135d5d2b-352c-0834-00f8-24e40c49f5cb.png" width=70%>

# 静的Webホスティングの公開方法の比較

|  | S3 | S3+CloudFront | S3+Amplify |
|--:|:--|:--|:--|
| よくある構成 | S3, Route53  | S3, CloudFront, ACM, Route53| S3, Amplify, ACM, Route53  |
| httpsアクセス  | 不可  | 可  | 可  |
| 設定の楽さ | ◎<br>コンテンツの格納＋アクセス制限  | △<br>S3＋<br>ACM,Route53,CloudFront  | ◯<br>S3+<br>Amplify ※1  |
| セキュリティ | △<br>バケットポリシー  | ◎<br>WAF,バケットポリシー（OAC）  | △<br>バケットポリシー  |
| 遅延 | △<br>アクセス元の地域に依存  | ◎<br>エッジロケーションを利用可  | △<br>アクセス元の地域に依存  |
| リクエスト/レスポンスのカスタマイズ | 不可  | 可<br>CloudFront関数、Lambda@Edgeを利用可  | 不可  |

△◯◎：行単位で３者を比較する指標と思っていただければよいです。雰囲気です。

※1
Amplifyは以下を自動で設定してくれるため、迷わず＆少ない操作で配信できます。

- S3バケットポリシー設定
- ACMの証明書作成
- Route53のドメイン設定

## 参考）料金比較 
下記は私のユースケースにおける料金比較です。
料金計算ツールを使い、利用規模に合わせて料金を見積もってください。

- 前提：
    - S3保存ボリューム：100GB
    - 月間データ転送量：50GB
    - 月間リクエスト数：10,000
    - 東京リージョン（ap-northeast-1）


- 月当たり料金：

|| S3 | S3+CloudFront | S3+Amplify |
|:--|:--|:--|:--|
|合計 | 4.5＄ | 8.2＄ | 12.6＄ |
|内訳 | S3：4.5＄ | S3：2.5＄<br>CloudFront：5.7＄ | S3：4.5＄<br>Amplify：8.1＄ |

S3→CloudFront間の通信は無料です。
S3→Amplify間の通信は料金計算ツールにおいて特別な記載はありません。
VisualStudioCode Git ソース管理ビュー ファイルの状態を示す文字

VisualStudioCode Git ソース管理ビュー ファイルの状態を示す文字
|文字|単語|説明|
|---|---|---|
|U|Untracked|Gitの管理下にないファイル|
|A|Added|今までのコミットに含まれてなく、新たにステージに登録されたファイル|
|M|Modified|編集されたファイル|
|D|Deleted|削除されたファイル|
|R|Renamed|ファイル名が変更されたファイル|
|C|Conflict|競合したファイル|
PM（プロジェクトマネージャー）とは？

## はじめに
PM（プロジェクトマネージャー）という言葉はよく耳にしますが、具体的な役割や意味はさまざまに捉えられています。
特にエンジニアがPMを目指す場合、現場での技術的な経験をどう活かすか、どのようなスキルを新たに習得すべきかを考える必要があります。
本記事では、自分の理解をもとにPMの役割や重要性について考えていきます。

## PMの役割
PMの役割を考えるにあたり、まずはPMの定義を確認してみます。

### PM（プロジェクトマネージャー）とは？
>プロジェクトマネージャーには明確な定義がなく、その仕事内容も企業や文献によって多少の幅があります。ここでは、IPA（情報処理推進機構）のプロジェクトマネージャー試験の情報をもとに紹介します。
>プロジェクトマネージャーとは、Q（Quality：品質）・C（Cost：プロジェクト原価）、D（Delivery：納期）といったプロジェクトの目的を達成する役割を担い、目標を達成するためにさまざまなマネジメント業務を行う職種です。また、プロジェクトチームメンバーだけではなく、ステークホルダー（利害関係者）との信頼関係や協力関係を結ぶ役割も求められます。

*引用記事*
https://doda.jp/engineer/guide/it/043.html


### 自分が考えるPMの役割
上記記事の引用ですが自分の中で一番腑に落ちたPMの定義です。
要するに、PMとはプロジェクトを完遂させるために責任を負う存在としての役割が与えられていると理解しています。

もちろん、会社やプロジェクトによってPMの役割範囲は異なる場合があります。しかし、共通して求められるのは以下のような3つの要素です：

1. ソフトスキル
問題解決力やコミュニケーション能力といった、チームをまとめたり調整したりする力。

1. ハードスキル
スケジュール管理やリソース配分、コスト管理など、プロジェクト運営に必要なマネジメントスキル。

1. テクニカルスキル
業界知識や技術的な理解を深め、エンジニアやステークホルダーとの効果的な対話を可能にする専門知識。

これら3つの要素をバランスよく持ち合わせ、プロジェクトの円滑な進行を実現するのがPMの本質的な役割だと考えます。

## PMに求められるスキル
では、PMの役割を果たすためには、具体的にはどのようなスキルが必要でしょうか？
私が考えるPMに求められるスキルは以下の通りです。

- **コミュニケーション能力**  
チームメンバーやステークホルダーと効果的に情報を共有し、信頼を築く能力です。
PMはプロジェクトを円滑に完遂させるため、チーム内外の連携を深めるコミュニケーション力が求められます。
この能力には、会議や議論を円滑に進めるファシリテーションスキルも含まれます。
- **技術的知識**  
プロジェクトによっては、PMが開発リード的な立ち位置を担う場合もあります。この場合、PMにも技術的な知識が求められます。
さらに、PMには技術的な専門用語や制約を理解し、それを非エンジニアにも分かりやすく説明するスキルが求められます。
これにより、技術的なリスクや決定事項を全員で共有しプロジェクトを効率的に進めることが可能となります。

- **問題解決能力**  
リスクや課題を早期に発見し、迅速かつ的確に対応する能力が求められます。
特に問題発生時には、冷静に状況を分析し適切な対応策を見つける力が重要です。

これは製造メンバーとしてプロジェクトに入る際よく感じることですが、問題解決能力のおいては、特に初動が非常重要だと考えます。
何かしらトラブルが発生しても初動が適切であれば問題が大きくなる前に収束させることができますが、初動が遅れたり誤った判断をした場合、その影響がプロジェクト全体にも広がる可能性があります。

- **計画力**  
プロジェクト全体のロードマップを作成し、スケジュールやリソースを適切に管理する能力です。
良いPMと悪いPMの違いが最も顕著に現れるのが、このスキルと私は考えます。

以前、上司から言われた言葉がとても印象に残っています。それは、「**プロジェクトの忙しさは、PMの計画力次第で大きく変わる**」というものでした。

良いPMが進めるプロジェクトでは、要件定義や開発フェーズにおいて非常に忙しい時間が続きます。しかし、この時期にしっかりとした計画と段取りを整えることで、その後の製造フェーズではスムーズに進行し、プロジェクトの終盤にはむしろ手が空くほど落ち着いた状態になります。
一方で、悪いPMのプロジェクトは最初の進行が緩やかで一見順調そうに見えるのですが、製造フェーズに入ってから計画の甘さが露呈し、次々とトラブルが発生します。その結果、プロジェクト終盤にトラブル対応が集中し、大きな混乱を招くケースが多いです。

## エンジニアがPMになるために必要なこと
エンジニアとしての経験を活かしながらPMを目指すには、以下の3つのポイントを意識して日頃の業務を取り組むと良いでしょう。

- **技術(知識)の習得**
エンジニアとして既にプログラミングスキルを持っている方も多いと思いますが、PMを目指す上ではこれらの知識をさらに広げ、プロジェクト全体を俯瞰できる技術的な基盤を築くことが大切です。
単にフレームワークを習得するだけではよくなくて、ネットワーク全体の基礎知識やシステム全体のアーキテクチャ設計の理解を深めるとともに、最近では生成AIなど新しい技術を活用した効率化の手法を学ぶことも身につけなればいけません。

- **経験の積み重ね**
PMとして成長するには、とにかく現場で経験を積むことが重要です。
小規模なプロジェクトやチーム内でのリーダーシップを取ることからなど、小さなところから経験していき徐々に大きなプロジェクトで実践的なスキルを磨いていくのが理想的です。
社内でチャンスがあったらとにかく手を挙げてみるべきだと思います。

- **リーダーシップ**
リーダーシップは、習得しようとしてすぐに身に付くものではありませんが、経験を積み重ねることで身に付いてい苦ものと考えます。
リーダーシップの習得のためには、意思決定の積み重ねが重要です。たとえメンバーレベルであってもプロジェクトの一部で自分が主体的に判断をし、他のメンバーを巻き込むことで部分的に経験を積めるのではないかと考えます。

## まとめ
PMは、単なる管理者ではなく、プロジェクトやプロダクトの「推進力」として重要な役割を果たします。私自身も日々学びながら、より良いPMを目指して仕事に取り組んでいます。
AWSでデプロイして、一度停止させたものをpumaで再起動するときのエラー【Rails puma】

RailsのアプリをEC２で作成しました。
その後、EC２、RDS、puma、nginxなどを停止させていましたが、再起動させようとしてデータベースコネクションエラーが出てしまったときの解決方法の備忘録です。

AWSにIAMユーザーでログイン

EC2インスタンスを起動
ElasticIPアドレスが関連付ける
RDSを起動
Route53で独自ドメインのAレコードをElasticIPを指定

ターミナルでSSH接続
```
$ ssh -i "◯◯◯.pem" ec2-user@◯◯.◯◯.◯◯.◯◯◯
```
nginx起動
```
$ sudo nginx
```
puma起動
```
$ bundle exec pumactl start
```
ブラウザでドメインを入力して起動を確認します。

ここでエラーが発生しました。
```
ActiveRecord::DatabaseConnectionError
There is an issue connecting to your database with your username/password, username: root.
Please check your database configuration to ensure the username/password are valid.
```
ユーザーネームとパスワードの組み合わせが正しくないのでデータベースに接続できないようです。

Pumaの起動時にdevelopment環境で起動しているような文言が合ったのが気になりました。
```
Puma starting in single mode...
*  Environment: development
```
**`起動前にproduction環境にしてあげる必要があるようです。`**
```
export RAILS_ENV=production
```
上記を実行
```
[ec2-user@ip-10-0-10-11 アプリ名]$ export RAILS_ENV=production
[ec2-user@ip-10-0-10-11 アプリ名]$ bundle exec pumactl start
*  Environment: production
```
production環境になりました。

ブラウザでドメインを入力して起動を確認します。
無事に起動が確認できました。
今回のエラーはproduction環境に設定しないで起動をしようとしたのが原因だったようです。
エンジニアのための(SEO)ライティング

ライティングってそれ、エンジニアの仕事ですの？ と言われれば間違いなくそんなことはないわけですが、何から何まで一人でこなす個人開発者を例に上げるまでもなく、生きていれば文章を書く機会は避けられません。

たとえば[リリースノート](https://qiita.com/release-notes)であればエンジニア自ら筆を執ることもあるでしょう。
またある時はせっせとドキュメントを書く必要に迫られるかも知れません。
そうでなくともコロナ禍以降、テキストコミュニケーションの重要性の高まりは天井知らずです。

導入で風呂敷を広げすぎて早くも着地点が見えませんが、明日からのライティングが少しでもいい感じになるあれやこれやをご紹介します。

# ターゲットを絞る

まずは誰に読ませたい文章なのかをイメージしましょう。
たとえば当記事であれば、

1. 何かライティングのメモ書いとくか
2. どうせならSEOとかのこととかも触れよう
3. じゃあ自分に近い属性の人の役には立つかもなぁ
4. ハイ、エンジニア向け

みたいな流れです(私がエンジニアかはさておき)。
ターゲットが「自分に近い属性のエンジニア(風の人)」と決まれば、次はふわっと内容を考えていきます。

具体的には「私は文章を書く時、何で困って、どういうキーワードで調べるっけ？」です。

## キーワードを選ぶ

ふわっと考えたら、今度は無心でそれっぽいキーワードをリストアップします。

- タイトル
- キーワード
- SEOライティング
- 長さ
- 起承転結
- 導入
- ドキュメント
- リリースノート
- テキストコミュニケーション
- 改行

あまり長々書いてもアレなのでざっくり10個くらい書きました。
これだけでもすでに当記事で登場しているキーワードがいくつかありますね。

もっと広げたい場合は、このキーワードからGoogleでサジェストされるものを見てみたり、[Google トレンド](https://trends.google.co.jp/trends/)なんかを見てみるのもおすすめです。

# 文章の骨子、プロットを書く

プロットは、シナリオライティングなんかで用いられる手法で、あらかじめ起承転結のざっくりとした道筋を立てておくやり方です。
あまり私以外でこの手法をWebライティングに取り入れている人を見たことがないのですが、めちゃくちゃ親和性が高いのでおすすめです。

さっそく先述のキーワードをパズルが如く散りばめつつ、プロットを考えていきましょう。

> - **導入**
>   - **リリースノート・ドキュメント・テキストコミュニケーション**
> - ターゲット設定
>   - **キーワード**選定
> - プロットの紹介
>   - 具体例(**起承転結**)
> - 文章の広げ方
>   - **長さ**
>   - **SEOライティング**
> - **タイトル**の付け方
> - おわり

まだ「改行」が漏れていますが、なんとなくキーワードを網羅しつつ、ざっくりとしたプロットができました。
このままだとそのままただのプロットですが、これを下記のように書き換えるとあら不思議、そのままマークダウン記法での記事のテンプレートになります。

> \# 導入
> リリースノート・ドキュメント・テキストコミュニケーション
> \# ターゲット設定
> キーワード選定
> \# プロットの紹介
> 具体例(起承転結)
> \# 文章の広げ方
> SEOライティング
> 長さ
> \# タイトルの付け方
> \# おわり

本当はリストのネストされていた部分は `h2` にしたいところですが、そこまでやるとめちゃくちゃ文字数が増えます。
個人的にWebの文章は長すぎてもかったるいため、2,000文字程度に抑えたく、ここでは一旦ただの段落 `p` にする方向で進めます。

しれっと「長さ」に触れたところでついでに改行にも触れると、だいたい2-3行程度が読んでいて疲れない間隔だと聞いたことがあります(諸説あり)。
最近だとモバイル(スマホ)が主流だと思うのでもっと短いくらいでもいいのかも知れないですね。

# プロットから文章を広げる

上記ではめちゃくちゃ雑に広げましたが、プロットをもとにすればスタートとゴール(次の章)が決まっているので過不足なく進めやすいです。

例えば、この「プロットから文章を広げる」の章では文章の広げ方を説明しつつSEOライティングに触れ、次の「タイトルの付け方」に繋げなければなりません。
なおかつ、1段落を2-3行、章ごとに3-5段落程度で次の章に進みたい、みたいなことも事前に決めておくと迷わず書き進めやすい気がします。

さて、SEOライティングについてですが、ハック的なものはどうしてもGoogle先生といたちごっこの末いずれは廃れてしまいます。
あくまで少しでも有益なコンテンツを残そうという気持ちと、そのコンテンツを必要としている人に届けたいという気持ちだけあれば良いのではないでしょうか。

それはそれとして、

- キーワード選定を頑張る
  - 表記揺れを避ける
  - 避けつつも類義語なんかは入れてみたりする
- 定期的にアップデートして情報を古くしない
- トレンドには乗れたら乗る
- プラットフォームの優位なタイミングに投稿する

みたいな定石？ はあるかも知れません。

# タイトルの付け方

ここまできたらもうほぼ本文はできているので、あとは命名するだけです。
奇をてらう必要は全然ないのですが、

- 重要なキーワードを(私的)重要度ランキングの上からひとつかふたつ含む
- (場合によっては)ありがちすぎない

くらいは抑える必要があります。
重要なキーワードは言わずもがなですが、あまりにありがちなタイトルでも他と重複して検索性が下がります。
Xに関する変数名を未だに`twitter`にしているのと同じです。

# おわりに

「風呂敷を広げすぎて早くも着地点が見えません」なんて導入で書いておきながら、すべてはプロット様のお導きのままでした。

こういうのを書くと、日頃からすごく計算高く書いているみたいに思われそうで若干アレなのですが、一生懸命書いたものが誰にも見られない悲しさったらないのでしょうがないですね！

あと、豆知識なんですが、あんまり漢字を多用しすぎないほうが一周回って賢そうに見えるそうです(「開く言葉」でぐぐってください)！

以上です！
フローとは

>送信元からあて先までのパケットの流れをフロー(flow)と呼ぶ。フローとは、コネクション指向ネットワークにおいて、あるコネクション上の全パケットを指すこともあれば、コネクションレス型のネットワークにおいて、あるプロセスから別のプロセスへ送られる全パケットを指す

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/

* コネクション指向ネットワークとは？
* コネクションレス型のネットワークとは？
* コネクションとは？
* `プロセスから別のプロセスへ送られる`のプロセスとは？

# 感想
上の用語は後から投稿したい。
とりあえず`パケットの流れをフロー`ということだけ覚える
【Flutter】初心者必見！ローカルで取得するデータとAPI経由で取得する外部データの流れをざっくり理解しよう

## はじめに
みなさんこんにちは！
Flutterでアプリを開発する際に、データの流れが分かりづらいと感じることはありませんか？
今回は大きく分けて２つのデータ取得の流れを説明します。
- **ローカル環境でデータを取得する流れ**
- **APIを経由して外部データを取得する流れ**

この2つのデータ取得の流れをざっくりでもイメージできれば、アプリ開発がもっと楽しくなると思います！



## 1. ローカル環境のデータ取得の流れ

ローカル環境のデータ取得は、アプリ内でデバイスに保存されているデータを直接利用します。

### データの流れ

- **ビュー（クライアント）**
    ユーザーがアプリを操作します。
    
- **プロバイダ**
    プロバイダはステートを通じて、ローカルデータベースにデータを取得しにいきます。
    
- **ステート**
    アプリ内部の状態を一時的に管理します。プロバイダ経由でローカルDBから取得したデータを保持し、それをビューに渡します。
    
- **アプリDB**
    デバイス内部に保存されているデータにアクセスし、必要な情報を提供します。
    
- **ビュー（クライアント）**
    ステートから取得したデータをUIに反映します。
    

### メリット
ローカルデータ取得のメリットは、ネットワーク接続が不要なため、高速かつ安定した動作が可能なことです。

---

## 2. API経由の外部データ取得の流れ

API経由のデータ取得は、外部のDBからリアルタイムでデータを取得します。
### データの流れ

- **ビュー（クライアント）**
    ユーザーが操作する画面のことです。

- **プロバイダ**
    リポジトリを通じて、外部のAPIサーバーにデータ取得を指示します。
  
- **リポジトリ**
    リクエストをAPIサーバーに送信し、必要なデータを取得します。
    
- **APIサーバ**
    外部サーバーがリクエストを受け取り、内部のデータベースから必要な情報を取得します。そして、リクエストに応じたデータを返します。
    
- **リポジトリ**
    サーバーからデータを取得しアプリ内で使いやすい形に加工します。その後、プロバイダを通じてステートに渡します。
    
- **ステート**
    リポジトリから渡されたデータを一時的に保持します。
    
- **ビュー（クライアント）**
    ステートに保持されたデータがUIに反映され、ユーザーに表示されます。

### メリット

API経由のデータ取得のメリットは、**外部サーバーの膨大なデータにアクセスできること**です。
その代わり、ネットワーク接続が必須であるため、通信環境に応じて動作が遅くなる場合もあります。
改行コードでrailsコマンド打てない

rails db:migrateとかうつと以下のエラー
```
/usr/bin/env: ‘ruby\r’: No such file or directory
```

docker 内に入ってappsが入っているディレクトリにて以下コマンドで解決できた。
```
 dos2unix ./bin/rails
```
Claude APIを活用した究極のPCリモート制御ツール - Computer Use - OOTB

## リポジトリ概要

このリポジトリは、Anthropic社の**Claude API** を利用して、コンピュータをリモートで制御できる**Out-of-the-Box (OOTB)** ソリューションを提供しています。**Docker** を必要とせず、**Windows** と **macOS** の両方をサポート。**Gradio** をベースとしたユーザーフレンドリーなインターフェースが特徴です。高解像度スクリーンショットにも対応しており、コストを抑えながら快適なリモート操作を実現します。モバイルデバイスからの操作も可能で、アプリのインストールも不要です。

<blockquote class="twitter-tweet" data-media-max-width="800"><p lang="ja" dir="ltr">Windowsで動く！ClaudeのComputer Use APIを活用した画期的なツール「Computer Use • OOTB」使ってみた①<br>まだ、実用的にはちょっと厳しいかも、、、<br>デスクトップをAI 用に整理とかすればイケルかも？？<br>あとは解像度を落とすとかかな？？<br>＊動画は3回とも失敗、、、 <a href="https://t.co/58qzNfVjHu">https://t.co/58qzNfVjHu</a> <a href="https://t.co/HPQ0G8bkyM">pic.twitter.com/HPQ0G8bkyM</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1858485236843335713?ref_src=twsrc%5Etfw">November 18, 2024</a></blockquote> 

## 🎯 主要機能

* **リモートコンピュータ制御:**  インターネットに接続された任意のデバイスから、コンピュータをリモートで制御できます。
* **モバイル対応:** モバイルブラウザから操作可能。アプリインストール不要。
* **高解像度スクリーンショット対応:**  Anthropic社のAPIの解像度制限を克服し、高解像度スクリーンショットでも低コストを実現。
* **クロスプラットフォーム対応:** WindowsとmacOSの両方をサポート。
* **GradioベースのUI:** 直感的で使いやすいインターフェースを提供。
* **Anthropic Claude API 統合:**  Claude 3.5 Sonnet を利用し、自然言語コマンドによる操作を実現。


## 💻 技術スタック

* **Python (>= 3.11):** プログラミング言語
* **Gradio:** ユーザーインターフェースライブラリ
* **Miniconda:** Python環境管理ツール
* **Anthropic Claude API:**  AIモデルとAPI
* **Git:** バージョン管理システム


## 🚀 ユースケース

* リモートワークでのPC操作
* モバイルデバイスからのPC操作
* アクセシビリティ支援
* AIアシスタントによる自動化タスクの実行


## 📦 インストール方法

1. **Minicondaのインストール:** [公式ウェブサイト](https://www.anaconda.com/download?utm_source=anacondadocs&utm_medium=documentation&utm_campaign=download&utm_content=topnavalldocs)からMinicondaをインストールします。(Python 3.11以上が必要です)
2. **リポジトリのクローン:** **Conda Terminal** を開き、以下のコマンドを実行します。
   ```bash
   git clone https://github.com/showlab/computer_use_ootb.git
   cd computer_use_ootb
   ```
3. **依存関係のインストール:** 以下のコマンドを実行します。
   ```bash
   pip install -r dev-requirements.txt
   ```
4. **インターフェースの起動:** 以下のコマンドを実行します。
   ```bash
   python app.py
   ```
   ターミナルにローカルURLとパブリックURLが表示されます。パブリックURLは他者と共有しないように注意してください。


## 🔧 使用方法

1. ローカルURL (http://127.0.0.1:7860) またはパブリックURLをブラウザで開きます。
2. Anthropic APIキーを入力します。( [Anthropicコンソール](https://console.anthropic.com/settings/keys) で取得できます)
3. 自然言語コマンドを入力して、AIにタスクを実行させます。


## 📈 パフォーマンスと特徴

* **高解像度対応:**  従来の解像度制限を克服し、高解像度スクリーンショットでも低コストを実現しています。
* **クロスプラットフォーム:** WindowsとmacOSの両方で動作します。
* **モバイルフレンドリー:** モバイルデバイスからの操作も容易です。
* **コスト効率:** 高解像度対応により、スクリーンショットのコストを抑えることができます。(ただし、タスクによっては高額になる可能性もあります)
* **安全性:**  モデルの出力は常に監視する必要があります。予期せぬ動作や有害な出力の可能性があることに注意してください。


## 🌟 まとめ

Computer Use - OOTB は、**Claude API** を活用した革新的なPCリモート制御ツールです。**Gradio** の直感的なインターフェースとクロスプラットフォーム対応により、誰でも簡単に利用できます。高解像度スクリーンショットへの対応とコスト効率の高さも大きな魅力です。ただし、AIモデルの潜在的なリスクを理解し、適切な監視を行うことが重要です。今後の開発では、より多くの**LLM**への対応や、プロンプトエンジニアリングの最適化などが予定されています。

## リポジトリ

https://github.com/showlab/computer_use_ootb

<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Salesforce認定資格が2025年2月から受験料が変更される件についてまとめてみた

本橋孝昭です

今回はSalesforce認定資格が2025年2月から受験料が変更される件についてまとめてみた。

今回の内容は動画でも解説しています

https://www.youtube.com/watch?v=zFJS76ebwtM

<iframe width="560" height="315" src="https://www.youtube.com/embed/zFJS76ebwtM?si=HttHGGPx1gkuIUKp" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

## アナウンス
こちらの投稿で
Salesforce 認定資格受験料が変更されるという投稿がされています


https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000J5jIb0AJ

こちらから一部抜粋します

>2025年2月1日より日本におけるSalesforce 認定資格の価格が一部変更されることになりました。2025年2月1日以降にお申し込みされる資格に関しては、新価格が適用されますのでお知らせいたします。

>＜変更価格について＞
>- Salesforce / MuleSoft 本試験
 (現在の価格) 20,000 円 → (変更後の価格) 30,000 円
>- Salesforce/ MuleSoft アーキテクト、デザイナー試験
 (現在の価格) 40,000 円 → (変更後の価格) 60,000 円

>下記試験についての価格変更は予定していません。
>- アソシエイト試験
>- テクニカルアーキテクト事前評価
>- レビューボード試験
>- Tableau 資格試験


このことから一部の試験の価格変更はないですが試験の価格が2025年2月から高くなることが分かります。

詳細な資格料金はこちらに記載されています

https://tandc.salesforce.com/CertCatalog?_ga=2.99314462.1047125818.1731933037-10249004.1728103161


## 2025年1月31日まではこちら

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/b3f61ec6-6e41-aa27-e23d-ddacfd0f541c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/6c0a1770-4e06-b1e2-edb0-778e85a4f8ba.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/9df450b1-78af-cede-2ea6-4cfe9ea170e3.png)

## 2025年2月1日からはこちら

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/ffb31dc0-d0f7-d15c-2ae5-f60f3d81668d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/4b3a0bbe-f624-3383-25fe-24b4f7c69ac4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/895ab0ba-0e21-7781-a818-47f54853c035.png)



## 注目点

Salesforce認定アドミニストレーター試験などの試験料が20,000円（税抜）から30,000円（税抜）に変更されてしまいますね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/2fcaf505-5642-d192-2724-b1fbb48a7191.png)


## 対策

今回の価格改定に備えての対策を考えます


### 対策1　なにかしらの企画に乗っかり試験料を抑えて受験する

Salesforceは何かしらの企画を通じて試験料を安く受験することが可能です

例えばSalesforce認定AIスペシャリスト試験は試験料が20,000円（税抜）から30,000円（税抜）に変更されますが、2025年12月31日まで無料で受けることが可能です。

※詳細はこちらを参照

https://qiita.com/Takaa/items/358a60ec45ebfe41515a


このような企画を通じて試験料を抑えて受験できます


### 対策2 無料バウチャーをもらう
Salesforceはイベントを通じ無料バウチャーを配布することもたまにあります

過去のキャンペーンはこちら

https://tandc.salesforce.com/earn-your-first-certification-giveaway-faq


現在ではQuestを通じて試験の無料バウチャーをもらえるチャンスがあります。
ぜひQuestに挑戦してみてください

https://trailhead.salesforce.com/quests

### 対策3 2025年1月31日までに試験を受験する

当たり前ですが価格改定前の2025年1月31日までに試験を受けるという発想も大事ですね


## 所感
最近がいろいろなところでいろいろなものが値上げされてますが、Salesforce試験の受験料も値上げの波が来たという感じでしょうか。
試験の受験料が安くなる企画は今でもいろいろありますので、ぜひ活用したいところ。
そして今後もこのような企画が増えて欲しいですね。

また、これからもSalesforce資格の勉強になる情報を発信していこうと思います

https://qiita.com/Takaa/items/485dc2dd1e61f31f2ff9
DKIM 2048 が使用されている場合、リリース更新「送信者検証のために返信メールアドレスを確認する」は適用されないことを確認できますか?

**使っているクラウドなどの小ネタ Advent Calendar 2024 7日目**


+ [DKIM 2048 が使用されている場合、リリース更新「送信者検証のために返信メールアドレスを確認する」は適用されないことを確認できますか?](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000nEjA)

数か月前、送信者のメール検証（以前の強制更新）のために DKIM 2048 を実装するための大規模なアップグレードを実施しましたが、数か月後に別のメール検証がユーザーに影響を与えることが判明しました。

「送信者検証のために返信メール アドレスを確認する」というタイトルのリリース アップデートに関するケース 469045783 がオープンされていましたが、DKIM が設定されているためこのリリース アップデートは不要であるという点についてはサポートから何も言われませんでした。

 ----

これは、サポート エンジニアによって投稿されたケースの情報です。

バックエンド チームからさらに確認したところ、この機能は Spring '25 リリースが利用可能になってからのみテスト可能であり、事前にテスト リリースは提供されないことがわかりました。

メールアドレスの確認をまだ行っていないユーザーには、リリース後に確認リンクが送信されます。これを無視すると、「マイメール設定」の下に「メールアドレスの確認」ボタンが表示され、確認を完了できます。

ユーザーがメールアドレスを検証しないと、Salesforce からメールを送信できなくなります。

各ユーザーは、ユーザー レコード レベルで 1 つ、および「マイ メール設定」で 1 つの合計 2 つのメール アドレスを確認する必要があります。

Spring '25 の機能はまだリリースされていません。リリースが利用可能になると、「確認」オプションが表示されます。更新がまだリリースされていないため、このオプションは現在利用できません。


# Salesforceのヘルプ

+ [2024/5 Account Engagement で 2048ビットの DKIM 鍵を使用する](https://help.salesforce.com/s/articleView?id=000394788&type=1)

:::note
注: カスタムの 2048 ビットの DKIM 鍵を使用すると、Account Engagement のドメイン管理ページのメール送信ドメインテーブルでエラーが発生します。このテーブルはデフォルトの 1024 ビット鍵の検証結果のみ表示します。2048 ビットの鍵を使用している場合、このエラーは無視できます。疑問が生じた場合は、簡単なテストで DKIM 認証を確認できます。
:::

+ [【Salesforce Spring ’19 リリースノート】より長い RSA 鍵サイズを使用した安全な DKIM 鍵の作成](https://help.salesforce.com/s/articleView?id=release-notes.rn_sales_productivity_email_dkim_size.htm&release=218&type=5)

DKIM (DomainKeys Identified Mail) 鍵を作成する場合、1024 ビットまたは 2048 ビットの RSA 鍵サイズを選択できるようになりました。鍵サイズを選択する前に、FIPS (Federal Information Processing Standards) のような業界固有のセキュリティ規則の順守など、考えられる制限とセキュリティ要件を調査してください。既存の DKIM 鍵は 1024 ビットサイズに設定されます。RSA 鍵サイズは新しい DKIM 鍵に対してのみ指定できます。

+ [How to Setup DKIM in Salesforce](https://salesforcetime.com/2024/06/22/how-to-setup-dkim-in-salesforce/)
【Suno AIでつくった楽曲】声でつながるAIとの対談: 挿入曲 #1【動画 3分31秒】【YouTubeチャンネルからの転記です】

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

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

こちらが動画内容です👇

***

![サムネイル 01 YouTube再生中の画像 Suno AI _ 声でつながるAIとの対談_ 挿入曲 #1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386308/98ba4e17-5bdd-f003-c71d-98ded3a131b3.png)




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

<br>

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

<br>

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

📅撮影日 = 2024-11-19(火)

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

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

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

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


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

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

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

作曲日:
2024-11-18(月)

Suno AI 契約の種類:
Pro Plan

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

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

Custom Mode: On

Audio Inputs: Not Used

Instrumental:


---


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


🇬🇧English

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


🇯🇵日本語訳

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


---


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


---


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


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


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


✓ 🎥Shortened URL for this video | この動画の短縮URL ↙
　https://bit.ly/40ODfVV
【Rails】Capistranoでデプロイ時エラーが出る

## はじめに
CapistranoでRailsアプリをデプロイする時にエラーが出たので、その対応をまとめます。

## 問題
エラー文
```
env: python: No such file or directory
```

## 解決方法
capistrano-git-copyはローカルPCにPythonをインストールする必要があるので、Pythonがインストールされていないと発生します。
MacOS12.3でPythonが同梱されなくなったので、ローカルPCでMacを使っているときはPythonをインストールする必要があります。
ローカルPCにHomebrewなどでPythonをインストールすると解消します。

## 参考
https://srcw.net/wiki/?Capistrano3/%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0
プロジェクト ウォーターフォール開発の流れ

こんにちは、小磯と申します。
プロジェクトにはウォーターフォール開発とアジャイル開発の2種類があります。
今回はウォーターフォール開発について纏めようと思います。
初めて業務を行うPM(PMO)の方へ参考になればと思います。

### ウォーターフォール開発
要件定義から設計、開発、テストへと滝のように上流から下流へ水が流れているようにプロジェクトが進められる開発の手法です。
工程や作業内容が明確に決められているため、大規模プロジェクトや、品質を重視する場合に向いています。

### 1.ウォーターフォール開発工程の流れ
ウォーターフォールでは、各工程で実施すべき内容が明確に決められています。
工程は以下に記載します。

### 2.要件定義
　作成するシステムやプログラムで満たす要件を決めていきます。
　顧客が解決したい課題や実装すべき必要な機能を定義し確定させます。
　要件定義を可能な限り決めておかないと、後の工程で仕様変更が発生し手戻りの要因となるため最も重要な工程です。
　要件定義を纏めた成果物が要件定義書です。

### 3.基本設計
　要件定義より詳細に機能を設計していきます。
　画面設計から帳票、ネットワーク構成、テーブルまでシステムに関わる重要な要素の詳細を決めていきます。

### 4.詳細設計
　システムの内部構造について専門的な設計を行うことです。
　システム構築の前段階に行われる工程で、プログラマーやエンジニアに基本設計で定義した内容を伝えることが目的です。

### 5.開発（構築）
　基本設計、詳細設計の内容に基づき、実際にプログラミングしていきます。

### 6.テスト
　作成したプログラムが正常に動作するか確認していきます。チェックする範囲によってテストが分けられます。
　テストの流れは以下になります。
　①単体テスト
　②結合テスト
　③システムテスト（総合テスト）
　④運用テスト

### 7.システム移行（リリース）
　開発したシステムをリリースする時は、旧システムから新システムに移行する工程が必要となります。

### 8.運用、保守
　リリースしたシステムを問題なく稼働し続けるには保守・運用業務が必要になります。

### まとめ
それぞれの工程は重要な役割があります。
その役割の中で1つでも間違っていた場合はプロジェクト失敗になりかねません。
失敗してしまうと時間や工数が無駄になってしまうので、確実に工程を行っていただければと思います。

他にもプロジェクトに関する記事を投稿しておりますのでお役に立てればと思います。
[プロジェクト ウォーターフォールとアジャイルの違い](https://qiita.com/pesysyon/items/e77b869b5c90b667680b)

[初めてプロジェクトに参画する方へプロジェクトとタスクの意味について](https://qiita.com/pesysyon/items/a7da021a7d596df5e5fd)

[初めて参画するプロジェクトPM(PMO) 要件定義の工程](https://qiita.com/pesysyon/items/cf40037f484b99e16621)

以上、小磯でした。
sfdx-lwc-jest　のまとめ



# "Using the Apex Wire Adapter" error: "TypeError: getAccountList.emit is not a function"

+ ["Using the Apex Wire Adapter" error: "TypeError: getAccountList.emit is not a function"](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HEK2oSAH)
+ [【Salesforce】Trailheadの Jest モック(Apexワイヤーアダプター)サンプルコードの誤り](https://lowpolysnow.com/wp/)

:::note
Try this

```
import getAccountList from '@salesforce/apex/AccountController.getAccountList';

jest.mock(
  '@salesforce/apex/AccountController.getAccountList',
  ()=>{
    const { createApexTestWireAdapter } = require("@salesforce/sfdx-lwc-jest");
    return {
      default: createApexTestWireAdapter(jest.fn()),
    };
  },
  {virtual: true}
);
```

In the test class, execute the following emit ()

```
getAccountList.emit(mockGetAccountList);
```
:::

# インストールできていない？

+ [I am stuck in the unit-Lightning Web Components Tests : Write a Jest Test](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000nHQO)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/54e30082-09a9-06ad-2464-aa36d8022eb0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a8aa5c50-c962-d2bd-94d4-8396cf2028d7.png)


:::note
I've changed the default package.json to use eslint ^8.57.0 like eslint-plugin-lwc does for now and it's working.

https://github.com/forcedotcom/cli/issues/3056
:::
【TypeScript】+【keyof型演算子】について

## はじめに
この記事は【TypeScript】+【keyof型演算子】の環境構築についての備忘録である
## 【keyof型演算子】とは
`keyof`はオブジェクトの型からプロパティ名を型として返す型演算子である
`name`プロパティを持つ型に対して、`keyof`を使うと文字列リテラル型の`"name"`が得られる
``` typescript:keyof.ts
type Person = {
  name: string;
};
// type PersonKey = "name"
type PersonKey = keyof Person;
```
2つ以上のプロパティがあるオブジェクトの型に`keyof`を使った場合は、すべてのプロパティ名がユニオン型で返される
``` typescript:keyof.ts
type Book = {
  title: string;
  price: number;
  rating: number;
};
type BookKey = keyof Book;
// 上は次と同じ意味になる
type BookKey = "title" | "price" | "rating";
```
インデックス型にkeyofを使うと、インデックスキーの型が返る
``` typescript:keyof.ts
type MapLike = { [K: string]: any };
// type MapKeys = string | number
type MapKeys = keyof MapLike;
```
## keyofのメリット
- #### 保守性の向上
オブジェクトの型とは別にプロパティ名のユニオン型を定義していると、オブジェクトの型のプロパティを変更したときに、そのユニオン型のほうも修正が必要になる
`keyof`を使って、オブジェクトの型からキーを導出するようにしておけば、変更箇所はオブジェクトの型のところだけになる
【TypeScript】+【Generics（ジェネリクス）】について

## はじめに
この記事は【TypeScript】+【Generics（ジェネリクス）】についての備忘録である
## 【Generics（ジェネリクス）】とは
- 抽象的な型引数を使用して、実際に利用されるまで型が確定しないクラス・関数・インターフェイスを実現する
- ジェネリクスは、型も引数のように扱うという発想
- ジェネリクスは、コードの共通化と型の安全性を両立するための言語機能
``` typescript:generics.ts
// <T> が型変数名の定義である
function changeBackgroundColor<T>(element: T) {
  // any に型アサーションすればコンパイルエラーは回避できる
  // 型チェックされないのでバグの可能性
  (element as any).style.backgroundColor = "red";
  return element;
}
```
## 【Generics（ジェネリクス）】に制約をつける
TypeScriptではextendsキーワードを用いることでジェネリクスの型Tを特定の型に限定することができる
以下の例では`<T extends HTMLElement>`とすることで型`T`は必ず`HTMLElement`またはそのサブタイプの`HTMLButtonElement`や`HTMLDivElement`であることが保証されるため`style`プロパティに安全にアクセスできるようになる
``` typescript:extends.ts
function changeBackgroundColor<T extends HTMLElement>(element: T) {
  element.style.backgroundColor = "red";
  return element;
}
```
OMC232B(935)

https://onlinemathcontest.com/contests/omc232/tasks/12123


$△PI_kQ$の内心は$∠P$の二等分線と$∠Q$の二等分線の交点なので、
$∠I_{k+1}PQ=\frac{1}{2}∠I_kPQ$ $…①$
$∠I_{k+1}QP=\frac{1}{2}∠I_kQP$ $…②$
が言えます。

$①+②$より
$∠I_{k+1}PQ+∠I_{k+1}QP=\frac{1}{2}(∠I_kPQ+∠I_kQP)$ $…③$
です。

また、三角形の内角の和は$180°$なので、$③$の両辺を変形して、
$180°-∠PI_{k+1}Q=\frac{1}{2}(180°-∠PI_kQ)$ $…④$
になります。

$④$の$180°-∠PI_□Q$は$∠PI_□Q$の外角です。
つまり$∠PI_kQ$の外角の半分の角度が$∠PI_{k+1}Q$の外角です。

$k=1,2,…$となると、$∠PI_kQ$の外角が半分、また半分と小さくなっていきます。
$∠PI_kQ$が整数なので、$∠PI_kQ$の外角、つまり$180°-∠PI_kQ$も整数にならないといけません。

ここから$N$を求めます。
$180°-∠PI_nQ$
$=\frac{1}{2}×(180°-∠PI_{n-1}Q)$ ($()$内は$2$の倍数)
$=\frac{1}{2^2}×(180°-∠PI_{n-2}Q)$ ($()$内は$2^2$の倍数)
$=\frac{1}{2^3}×(180°-∠PI_{n-3}Q)$ ($()$内は$2^3$の倍数) $…⑤$

$2^□$で$180$以下の最大値は$128(=2^7)$です。
$∠PI_1Q$の外角が$128°$のとき、$N=7$でこれが唯一$N=7$になるパターンです。
($0$〜$180$のうち、$128$で割り切れるのは$128$だけなので。)

$∠PI_1Q$の外角が$128°$(の倍数)なので、$180-128=52°$が解になります。
QRコード・メーラー起動QRコード作成アプリ

### QRコードを使って業務をしたいと思ったので作ってみた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/5db27be2-5ff8-8d34-a15d-37467b8a0f64.png)

まずは`QRコードの内容となるTextInput`を配置
次に、QRコード作成については下記サイトより
https://goqr.me/api/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/01b3a30b-0139-c602-5a87-ab1e3cad5024.png)
Exampleの部分をTextInput.Textとすれば良いので

`imageコントロール`を配置して
`imageプロパティ`に
```
"https://api.qrserver.com/v1/create-qr-code/?size=150x150&data="&TextInput.Text
```
と記述する。

これで良い感じにQRコードが作成できる。

ただ、これだけでは面白くないので良く使いそうな機能を追加する。

### QRを読んだらメーラーが起動する機能である。
### QRコードの内容をCopilot様に聞いてみた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/a5b4641d-cbfa-8836-cdcf-88fe4d1d52d8.png)

快く教えてもらったので下記の様にコントロールを置いて
先ほどと同じように`imageコントロール`の`imageプロパティ`を
下記の様に記述
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/f2e1df6e-4cbe-abcd-dba6-e010cc1cdd7c.png)

```
"https://api.qrserver.com/v1/create-qr-code/?size=150x150&data="&
"MATMSG:TO:"&txtToDetailMailQR.Text&
";SUB:"&txtSubDetailMailQR.Text&
";BODY:"&txtBodyDetailMailQR.Text&";;"
```
説明不要と思うが上から宛先、タイトル、本文のTextの値である。
こんな感じで簡単にメーラー起動のQRコード作成アプリもできる。

業務の利用想定では例えば、
補充が必要な物品棚などにQRコードを貼って
補充が必要なタイミングでQRコードを読んでそのままメールを送るだけで
担当者に補充を要求するメールを送信する。
みたいな事に利用できる。
Amazon SESのメール配信に関する整理

# はじめに
最近Amazon SESをよく利用しています。SESでは送信したメールが正しく配信されたかどうかを確認する機能が豊富に用意されているのですが、メール配信に対する自分の理解が乏しいためなんとなくふわっとした状態でSESのコンソールを眺めていることが多いです。エンジニアとして健全な状態ではないので、今一度学習し直そうと思います。
# 送信と配信の違い
SESの仕様以前に、メールの世界には「送信」と「配信」という似た言葉があります。同じ意味のように見えますが意味が異なります。
### 送信
送信とは「メールが送信者の手元から離れ受信者に向けて送られたこと」を指します。
メールが手元から離れるというのは具体的にどういうことでしょうか。これは視点によって解釈が異なってきます。

例えばアプリサーバーの視点から見た場合、アプリからメールの送信リクエストを送りそのリクエストがSMTPサーバに問題なく到達した時点で「送信された」と判断することが多いです。一方でSMTPサーバの視点から見た場合、メール送信リクエストを受信しただけではメールを送信したとは言い難いです。SMTPサーバは宛先の受信サーバであるPOP3/IMAPサーバに送る義務があるので、受信サーバへリクエストを問題なく送信した時点で「送信した」と言えます。
### 配信
配信とは「メールが受信者のメールボックスに届いたこと」を指します。受信トレイだろうと迷惑メールフォルダだろうと、受信者のメールボックスに届いていればそれは配信されたと言えます。バウンスにより受信者に届かなかった場合は配信に失敗したことになります。

参考：

https://docs.aws.amazon.com/ses/latest/dg/send-email-concepts-deliverability.html

# 配信におけるイベント
メールが正しく配信された後、そのメールがどう扱われるかによって名付けられる事象が変化します。

### ハードバウンス/Hard Bounce
メール配信が永続的に失敗する状況にある時、SESはハードバウンスとして処理します。具体的には、存在しないメールアドレスであったり、メールアドレスドメインのDNSの名前解決に失敗したりなどが考えられます。ハードバウンスは基本的に何度リトライしてもメールが配信されることは望めないので、宛先メールアドレスの見直しなどの調査を行う必要があります。SESの公式ドキュメントにも以下の記載があります。

> We strongly recommend that you do not make repeated delivery attempts to email addresses that hard bounce.

https://docs.aws.amazon.com/ses/latest/dg/send-email-concepts-deliverability.html#:~:text=We%20strongly%20recommend%20that%20you%20do%20not%20make%20repeated%20delivery%20attempts%20to%20email%20addresses%20that%20hard%20bounce.

### ソフトバウンス/Soft Bounce
一時的な配信失敗はソフトバウンスとして処理されます。宛先のメールボックスが満杯だったり、何らかの理由で宛先とのコネクションが確立できなかったりなどが考えられます。ソフトバウンスの場合SESは何度かリトライを試みます。（リトライの試行上限回数まで）

:::note info
bounceとは英語で「跳ね返る」という意味です。メールを送ったが跳ね返ってきた、みたいなイメージでしょうか。
:::

### 苦情/Complaint
受信者がメールを迷惑メールフォルダに移動したりスパムとして設定したりした場合、Eメールプロバイダーは「苦情」をSESに送ります。SESコンソールで「苦情」と表示されるメールアドレスは受信者側でスパム扱いされていることになります。

### サプレッションリスト/Suppression list
サプレッションリストとはメール送信を抑制するメールアドレスのリストです。リストに登録されているメールアドレスにSESから送信を実施しようとした場合、送信処理としては成功しますがメール配信は実施されず、自動的にハードバウンスとして処理されます。何をしたらリストに登録されるのか？という具体的なロジックを見つけることはできませんでしたが、ハードバウンスされたメールアドレスはリストに登録される可能性が高いと思われます。

サプレッションリストにはGlobal suppression list/Account-level suppression listの2種類が存在します。Globalの方はSESが管理するマネージドなリストであり、Account-levelはユーザーがAWSアカウント単位で自由に管理できるリストです。
https://docs.aws.amazon.com/ses/latest/dg/sending-email-suppression-list.html
STLファイルの形状と原点座標をさくっと確認したい

# STLファイル（３次元モデル）の形状と原点座標を確認するためのPython表示プログラム
例として，下図に示すような形状を3D-CADで作成し，3Dプリンタ用にSTLファイルフォーマットで保存したとします．
![スクリーンショット 2024-11-15 12.25.47.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1979979/3656eaa3-8076-2d69-9e7a-5bd7970ba73b.jpeg)
ファイルエクスプローラでのファイル名だけでは，どんな形状で原点座標がどこだったかなと確認したい時があります．
そんな時には，以下のplot_stl.pyをPythonで実行すれば，プロット表示されます．
ただ，ファイルサイズが10MB越える様な大きなモデルになると，高性能なPCでないと表示するだけでも非常に時間がかかります．

![スクリーンショット 2024-11-15 12.23.51.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1979979/ab9d48e5-2c56-1a58-f6fa-eb0976cb6978.jpeg)

マウスのドラッグ操作で回転できます．
赤字で，原点座標が表示されます．

```plot_stl.py
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D, art3d
from stl import mesh
import tkinter as tk
from tkinter import filedialog

# ダイアログボックスでSTLファイルを選択
root = tk.Tk()
root.withdraw()
file_path = filedialog.askopenfilename(filetypes=[("STL files", "*.stl")])

# STLファイルの読み込み
your_mesh = mesh.Mesh.from_file(file_path)

# プロットの設定
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# STLメッシュのプロット
ax.add_collection3d(art3d.Poly3DCollection(your_mesh.vectors, facecolor=[0.5, 0.5, 1], linewidths=1, edgecolor='k', alpha=.25))

# 軸範囲の設定
scale = your_mesh.points.flatten('F')
ax.auto_scale_xyz(scale, scale, scale)

# 原点に赤丸と座標値の表示
ax.scatter([0], [0], [0], color="red", s=100)  # 赤丸
ax.text(0, 0, 0, "(0,0,0)", color='red')  # 座標値

# プロットの表示
plt.show()
```
3時間でできるクリーンインストールからの復元

よくクリーンインストールするからメモ書き
Cドライブの中身バックアップしていること前提として

【上から順に】

1. スタートアップの`onedrive無効化`

2. pc名の変更

3. ドライブレターの変更

4. エクスプローラーの表示設定（開く設定PC, 隠しファイル）

5. タスクバーの設定（小さいアイコン，全て非表示）

6. 固定アイコン（Chrome, explorer, discord, line）

7. 個人設定（透過オフ）

8. Cドライブにｂアックアップしたユーザーディレクトリ以下をコピー
    - C:/Windows/Fonts のコピー
    - C:/ProgramFilesのコピー（上書きしない，スキップ）

9. 一度再起動

10.  スタートメニューいらんものアンインストール

11. chromeインストール

12. lghub

13. nvidia graphics driver
14. イーサネット設定
15. 電源管理設定
16. シンボリックリンクの再構築
17. マザーボードドライバーインストール
18. `optionalfeatures`で以下をオンにする
    - Windowsサブシステム
    - HyperV
    - コンテナー
【Prettier】prettier-plugin-organize-imports を特定のファイルのみ無効にする

# はじめに
この記事では、Prettier のプラグインである **`prettier-plugin-organize-imports`** を特定のファイルのみ無効にする方法を記載します。

https://github.com/simonhaenisch/prettier-plugin-organize-imports

prettier-plugin-organize-imports では、import の並び替えや未使用の import の削除が自動できます。
ただ、場合によっては、意図的に import の並び順を指定したいケースも思います。例えば、React 向けのコンポーネントライブラリである Mantine では、指定された import 順にしないと、スタイルが適用されないこともあります。

https://mantine.dev/styles/mantine-styles/#styles-import-order

上記のケースなどに対応するため prettier-plugin-organize-imports には、特定のファイルで

# 開発環境
開発環境は以下の通りです。

- Windows 11
- React 18.3.1
- TypeScript 5.5.2
- Vite 5.4.10
- Prettier 3.3.3
- prettier-plugin-organize-imports 4.1.0
- @mantine/core 7.13.5
- @mantine/hooks 7.13.5
- PostCSS 8.4.47

# prettier-plugin-organize-imports のインストールと設定
まずは prettier-plugin-organize-imports のインストールと設定方法を記載します。

以下のコマンドで prettier-plugin-organize-imports をインストールします。

```powershell
npm install --save-dev prettier-plugin-organize-imports
```

次に  `.prettierrc` で prettier-plugin-organize-imports を読み込みます。

```.prettierrc
{
  "plugins": ["prettier-plugin-organize-imports"]
}
```

以上で設定は完了です。

動作確認をします。
保存時に自動で import 順が変わります。

![●-App.tsx-mantine-vite-ts-Visual-Studio-Code-2024-11-15-06-34-29.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/3e61da2b-c3b4-0ab0-3aa8-be16da631caa.gif)


# prettier-plugin-organize-imports を特定のファイルのみ無効にする
無効にしたいファイルへ `// organize-imports-ignore` もしくは `// tslint:disable:ordered-imports` と記載することで無効にできます。

```App.tsx
// organize-imports-ignore
import "@mantine/core/styles.css";
import { Center, MantineProvider, Stepper, StepperStep } from "@mantine/core";
import classes from "./css_modules/Stepper.module.css";
```

動作確認をします。
保存しても import 順は変わりません。

![●-App.tsx-mantine-vite-ts-Visual-Studio-Code-2024-11-15-06-41-12.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/9a81afb5-40e3-3131-1408-12b7673d359e.gif)


# 参考
- [prettier-plugin-organize-imports](https://github.com/simonhaenisch/prettier-plugin-organize-imports)
- [Mantine styles](https://mantine.dev/styles/mantine-styles/)
オフラインイベントレポート 「ITエンジニアのためのミートアップイベント2024 October」

# 自己紹介
こんにちは！
エンジニアコミュニティ LinuC Open Networkメンバーの安藤浩士です。

**パソコン歴34年・サーバーキッティング歴20年・IT業務経歴0年！**
前職は**電気工事のお仕事**をしていた私がイベントレポートします。
そんな私でも、あたたかく受け入れてくださるコミュニティーです。

この記事を読んでいる方々は、**成長過程のじぶんをより成長させる目的で**読まれていると思われるので、初心者がイベントに参加する上で知りたい内容に重点を置いて書いていきたいと思います。


https://lion.connpass.com/event/333109/

**ITエンジニアのためのミートアップイベント2024 October**

# ( °д°)?　パソコン歴34年・サーバーキッティング歴20年・IT業務経歴0年？
そうです！本職は電気工事をしており、趣味で秋葉原へ通う少年が、大人になっても大人になりきれず、コロナを契機に夢へ向かって再チャレンジしている人間になります。
**翼を持った少年**でした。


# イベント開始～
オフラインイベントは初参加なのでどんな流れなのか？全く分からず緊張したが、イベント開始前に会場の入り口エレベーターでLPI-Japanの方にお会いできたので心の準備ができた。**本番前の心構えって本当に重要だと思う。**

## イベント全体の流れ
- LT（ライトニングトーク）
- 日本PostgreSQLユーザ会　理事長　喜田紘介　エンジニアのキャリア戦略
- 自己紹介＆交流会

## LT（ライトニングトーク）
![20241024_192416.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572553/97498d6b-973e-8ccd-06f9-2f6329946d85.jpeg)
登壇予定の方はよく存じ上げている方でしたので、ドキドキすることもなく落ち着いてお話を伺う事ができた。
IT業界へ入るきっかけが非常に興味深かった。ものごとのタイミングってものすごい重要だと思う。タイミングを間違え、成功せずに **失敗してしまう仲間**を、わたしはよく見てきた。

## 日本PostgreSQLユーザ会　理事長　喜田紘介　エンジニアのキャリア戦略

![20241024_194013.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572553/6c0652d4-4f00-7019-63e6-d8631d7d4fd7.jpeg)

**資格は無意味？！**
こういった話が登場し、意外に思った。
個人的には面接時に過小評価されることが多く、一つでも多くの資格を取りたいと、わたしは考えているのだが。
無意味？！寧ろ、コネや実績の方が転職には重要？
......

**(🤔そのアプリ、実は俺が動くようにしたんだけどな。。。)**

HandheldPC 2002の動画も再生できるバージョンのWindowsMediaPlayerを動くようにしたのは実は**私**なんです！
PocketPC2002用のWindowsMediaPlayerの利用しているdllを探してSigmarion2にコピーしたら見事！動いたのですが。
当時、大喜びで2chのSigmarionスレに書き込みましたね。
匿名での活動では全く実績にならないですね。
時間の無駄ですね。

**何をやってきた人物なのか**、よくわからない時に**資格がものさしとして強力な武器になる**と、私は考えるのですが。

## 自己紹介＆交流会
**業界未経験の電気屋が何話せばいいの！**
👿お前さ、ivtv初期の頃メーカー名いじってドライバー書いた
じゃん。あの話すれば？
👼ivtvのドライバー書いたって、2chの情報丸こぴじゃないの！
👿なんで？一応makeとか分かってるアピールになるじゃん。
👼しかも、メーカー名buffaloに変えただけ。。。
👿なんだと？
👿💥💥💥👼
￣V￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣
🤔🧠

もちろんIT業界での実績が無いと、匿名での活動のみでは、**話が続きません。**

5chでこんなアスキーアート書いて遊んでいても*時間の無駄*です。
(#\<blink>ノ\</blink>‐＿‐)\<blink>ノ┻┻\</blink>
![TP13EXoXmOLTTpl2xzRB1731954902-1731954913.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572553/f9a80b4c-2af4-174e-9811-92db652e0180.gif)


**電気屋さんが何しに来たのですか？** と、言われてしまいます。
まったくの未経験の方は、予めイベント参加前に**じぶんの下地**をつくっておいた方がいいでしょう。

話が続かない時の潤滑油として**テレビゲームの話題**が有効でありました。
(Baroque知らないなんて.....マジか。)


# 最後に
![20241024_194703.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572553/9d5558af-1b37-26eb-9b82-abbf6b4bef73.jpeg)

**喜田氏の仰る通り**IT業界でアウトプットは大事だよ！積極的に自己アピールしましょう。
(建設業界では必ず **余計なことするな！自己アレンジするな！** と言われるんですけどね。真逆です。)
同じ間違いは繰り返さず、時間は有効にね！
😊*Sok szerencsét!*　～ෆ