OmniAICreator/Qiita-1.07M huggingface dataset:
【転職活動】0→1と10→100で経験できること

# はじめに

メリークリスマスイブ🎄

クリスマス前日の記事に選ばれたテーマは「0→1と10→100」です！

企業、部署によっては業務内容が0→1だったり、10→100だったり...
これらの違いによって、経験できることが大きく変わるなと感じている最近です。

本記事ではその違いをかんたんにまとめてみました。
転職活動を始める方、始めている方の参考になれば幸いです。

# 0→1

- プロジェクトの立ち上げから関わりやすい
- 市場調査、要件定義、設計、販売検証など幅広い経験がしやすい
- 環境構築に関われる
- システムの根幹部分の開発を経験できる
- インフラを触りやすい
- 新しい技術を触れる機会が多い
- プロジェクトが起動に乗らないと運用面は経験できない
- スピード優先になりがちなため、品質面のスキルは身につけるのが難しい
- 自動テストを入れるタイミングを逃すと後が大変
- お客さんがつくまでは売上に貢献している実感がない

# 10→100
- ある程度出来上がっているため、改修やバグ対応が多め
- すでに自動テストがあれば改修やバグ対応が安全（後からテストを入れる場合は大変）
- システムで使っている技術しか触れない
- 一定の運用対応が必要
- お客さんに影響があると解約される可能性があるため、コード品質などには気を遣う
- 障害対応の経験ができる
- 環境が出来上がっているため、環境を一から構築するスキルは身につけるのが難しい
- お客さんがついているので売上に貢献している実感がある
- 割とインフラが重要ポジション（障害や費用に直結するため）

# おわりに
入社後のギャップ（悪い意味）がないように、自分が経験したいこと・身につけたいスキルと企業プロダクトのフェーズを照らし合わせておくと良いかもしれません。
CloudShellからAmazon Translateを使ってみる

■APIキーと翻訳したいドキュメントを渡して結果を受け取るだけなのにPythonで長文書くのも面倒だったりするけれど、aws cliですぐ試せるのでありがたい。bashの範囲で書いたのでCloudShellでこのまま動く

PDF1ページの文字数は1200～1500文字だとして、300ページ程度だと36万〜46万文字
DeepLは50万文字まで無料なので失敗がなければギリギリなので失敗時のリ80文字のカバリは難しい
Amazon Translateなら200万文字まで無料なので、全体を取り込んで失敗してもリカバリできそう

■公式サイトからはコンソールやSDKのサンプルコードも確認できる
　APIキーの取得方法は省く。「aws configure」で設定済であればOK。

https://docs.aws.amazon.com/translate/latest/dg/get-started-cli.html

■aws cliのコードサンプルを参考にして、4行ヘッダを作って原文・訳文を出力
　「#」を80回繰り返し出力する行
 　日付と消費文字をカウントして、「aws_translate_年月」に追記
  200万文字を超えていないか累計チェックのため、実際に累計を出して表示
　「#」を80回繰り返し出力する行  
 
```
$ cat translate.sh 
#!/bin/bash

original="$(echo $@ | sed -e 's/\. /&\n/g')"

sumfile="aws_translate_$(date '+%Y%m')"

echo "#" | awk '{for(n=1;n<=80;n++){printf "%c",$1}}END{printf "\n"}'
echo $(date;echo -n "消費文字:";echo "${original}" | wc -c) | tee -a "${sumfile}"
awk -F":" '{sum+=$NF}END{print FILENAME,sum}'  "${sumfile}"
echo "#" | awk '{for(n=1;n<=80;n++){printf "%c",$1}}END{printf "\n"}'

echo "${original}"
#exit

aws translate translate-text \
        --region us-east-1 \
        --source-language-code "en" \
        --target-language-code "ja" \
        --text "${original}" | jq -r '.TranslatedText'
```

■実行日時と消費文字が347文字、累計が約4万文字になったことがわかる

```
$ ./translate.sh $(cat jobs_speech.txt )
################################################################################
Mon Dec 23 02:30:57 PM UTC 2024 消費文字:347
aws_translate_202412 39885
################################################################################
I am honored to be with you today at your commencement from one of the finest universities in the world. 
Truth be told, I never graduated from college. 
And um, this is the closest I’ve ever gotten to a college graduation. 
(audience: Laugh) Today I want to tell you three stories from my life. 
That’s it. 
No big deal. 
Just three stories.
本日、世界屈指の大学の卒業式に出席できることを光栄に思います。 
実を言うと、私は大学を卒業したことがない。 
そして、ええと、これは私が今までに大学卒業に最も近づいた時です。 
(観客:笑) 今日は、私の人生における3つの話をしたいと思います。 
それでおしまいです。 
大したことないよ。 
たった三つの物語。
```
■消費文字数はローカルなら1024文字に収めて、loggerでsyslogに書き込んでも良さそう
　累計は200万までの％表記もできるけど、まあ今回はスルー
 
```
$ logger "Mon Dec 23 02:30:57 PM UTC 2024 消費文字:347"
```

■ヘッダは先頭4行で、原文・訳文はそれぞれ同数行なので、全体行の半分がわかれば一行づつにもできる

```
 $ ./translate.sh $(cat jobs_speech.txt ) > jobs_speech.out
 $ awk '(NR>4){a[(NR-4)]=$0}END{b=(NR-4)/2;c=0; \
     for(n in a){if(c<b){print a[n]"\n"a[n+b]"\n";c++}}}' jobs_speech.out 
I am honored to be with you today at your commencement from one of the finest universities in the world. 
本日、世界屈指の大学の卒業式に出席できることを光栄に思います。 

Truth be told, I never graduated from college. 
実を言うと、私は大学を卒業したことがない。 

And um, this is the closest I’ve ever gotten to a college graduation. 
そして、ええと、これは私が今までに大学卒業に最も近づいた時です。 

(audience: Laugh) Today I want to tell you three stories from my life. 
(観客:笑) 今日は、私の人生における3つの話をしたいと思います。 

That’s it. 
それでおしまいです。 

No big deal. 
大したことないよ。 

Just three stories.
たった三つの物語。

```

■Amazon Translateの結果が、個人的には自然な訳文だったので良かった
kaggle tutorial Reinforcement Learning part 1

https://www.kaggle.com/learn/intro-to-game-ai-and-reinforcement-learning

part 1では

https://www.kaggle.com/code/alexisbcook/play-the-game

の確認をしていきます。強化学習は現在非常にホットな分野ですがこの部分のtutorialはあまり翻訳や解説がされていないようです。

コネクトフォー（四目並べ）のゲームAIを構築するためのオンラインコースの紹介文です。コースの概要、各レッスンの内容、そして学習することでどのようなAIエージェントが作れるようになるのかを説明しています。

# 流れ
１　開発環境の準備、ゲームルールの実装、簡単な思考ルーチンを持つAIの作成

２ ミニマックス法のような探索アルゴリズムを理解し、実装する

３　強化学習の基本的な概念（報酬、状態、行動など）を理解し、Q学習などのアルゴリズムを実装する

# 解説
kaggle_environmentライブラリで基本的なゲームを楽しむことはできます。視覚的にわかりやすいことが重要ですが、game AIは単に合法なランダムな手を打つことが最初の目標です。このあと、AIの性能を上げていきます

```
def agent_random(obs, config):
    valid_moves = [col for col in range(config.columns) if obs.board[col] == 0]
    return random.choice(valid_moves)
```
空いている列の中から、完全にランダムに次の手を決定します。特に戦略はないです。

```
def agent_middle(obs, config):
    return config.columns//2
```
中央の列が戦略的に有利な位置であることが多いため、常にそこを狙う戦略。

```
def agent_leftmost(obs, config):
    valid_moves = [col for col in range(config.columns) if obs.board[col] == 0]
    return valid_moves[0]
```
左から埋めていくという戦略。とりあえずランダムよりマシな合法の手を出すだけです。


- obs
AIエージェントは、この obs オブジェクトを通じて、ゲームの状況を認識し、次の手を決定します。  obs に含まれる情報は、エージェントが「今、盤面がどうなっているのか？」「自分はどちらのプレイヤーなのか？」を理解するために使用されます

- obs.board
コネクトフォーの盤面は通常、縦横にマスが並んだ2次元のグリッドですが、obs.board ではこれを1次元のリストとして表現しています。リストの要素は、盤面の上から下へ、そして左から右へと順番に並んでいます。実態はPythonリストです。

このあと、100ゲーム、1000ゲームと、より多くのゲームをプレイすることで、運による影響が小さくなり、エージェントの実力差がより明確に現れてきます。例えば、100ゲーム行った結果、エージェントAが70勝、エージェントBが30勝した場合、エージェントAの方がより高い勝率を示し、より強いエージェントである可能性が高いと判断できます。（将棋の例が分かりやすそうです）

ここでも、AIの性能の指標として、勝率を算出していきます。
```
get_win_percentages(agent1=hoge, agent2=fuga)
```
今回、３つのAI（?）を用意したので、性能を確認すると、agent_leftmostがかちます。なお、私がやってもagent_leftmostより少し強い程度ですので、次回以降私が４目ならべをする際にはagent_leftmostと同じ戦略を取ることにしました。考えずに手が出せそうですね。

ここまで、AIとは呼べないレベルのものを作りましたが、次回以降の部分で性能が急激に上昇していきます。
【GPTプロンプト講座基礎編⑧】プロンプトエンジニアリングの実務応用と高度な事例

# §プロンプトエンジニアリング基礎編⑧
※本記事は執筆にあたり生成AIツールを使用している箇所があります
※プロンプトの基礎部分は生成AIで作成し、具体例や体験談を自分の視点で補完しています

こんにちは。ゆずかきです。
前回は、プロンプトをシステム化して活用する方法についてお話ししました。今回は、さらに一歩進めて、 「プロンプトエンジニアリングを実務にどう応用するか」、そして 「高度な応用事例」 を紹介していきます。

プロンプトエンジニアリングの魅力は、その柔軟性と幅広い応用性にあります。日々の業務を効率化したり、クリエイティブなアイデアを支援したりと、使い方次第で可能性は無限大です。今回はその具体例を見ていきましょう！

# §実務におけるプロンプトエンジニアリングの活用
まずは、日常的な業務や実務で活用できる応用例をいくつか挙げていきます。

#### 1. 業務効率化
AI活用したプロンプトエンジニアリングは、定型業務の効率化に特に効果を発揮します。以下のようなタスクに活用してみてください。

**メール作成**
- 「顧客に送るお礼メールを200字以内で作成してください。」
- 「商品の発送遅延に対する謝罪文を丁寧なトーンで作成してください。」

**議事録の要約**
- 「次の議事録を3つのポイントにまとめてください。」
- 「会議内容を簡潔に100字以内で要約してください。」

　
**レポート生成**
- 「売上データをもとに、上司向けの週次レポートを作成してください。」
- 「次のデータセットから、重要なトレンドを箇条書きで挙げてください。」

#### 2. 顧客対応やカスタマーサポート
AIを使えば、顧客対応のスピードアップや品質向上が期待できます。以下はその具体例です。

**FAQの自動生成**
- 「次の商品に関するよくある質問とその回答を3つ作成してください。」

**クレーム対応案の作成**
- 「次の状況に対して、顧客満足度を向上させる対応案を考えてください：商品が破損して届いた。」

**チャットボット用のスクリプト作成**
- 「次のキーワードを基に、顧客チャットボットの応答例を3つ考えてください。」


# §高度な応用事例
次に、より高度なプロンプトエンジニアリングの事例を紹介します。ここでは、業務だけでなく創造的な活動や分析作業に焦点を当ててみました。

#### 1. データ分析の補助
AIは人間が苦労するような大量データの扱いこそ強みを持ちます。

**複雑なデータの要約**
- 「次の売上データを分析し、今後の課題と解決策を3つ挙げてください。」

**トレンド予測**
- 「次のデータセットを基に、来月の売上トレンドを予測してください。」

**データ可視化の提案**
- 「次のデータをわかりやすくグラフ化する方法を提案してください。」

#### 2. クリエイティブ活動のサポート
プロンプトエンジニアリングは、うまく使えば創作活動にも大きな力を発揮します。

**ストーリーアイデア出し**
- 「次のキャラクター設定を基に、小説の冒頭シーンを200字以内で書いてください。」
- 「次のテーマでアニメのストーリー概要を考えてください：近未来のロボット戦争。」

**デザインコンセプトの生成**
- 「次のテーマを基に、ポスターのデザインコンセプトを3つ提案してください：環境保護。」

**キャッチコピーの作成**
- 「次の製品のキャッチコピーを5つ考えてください：新型スマートウォッチ。」

#### 3. プログラミングサポート
- プログラミング作業でも、プロンプトを活用すれば効率が大幅に向上します

**コード生成**
- 「次の要件を満たすPythonコードを作成してください：リスト内の数値の平均を計算する。」

**コードレビュー**
- 「次のコードをレビューし、改善点を3つ挙げてください。」

**バグの修正**
- 「次のコードのバグを見つけて修正してください。」


# §プロンプト応用を成功させるコツ
高度な応用を実現するためには、以下のコツを押さえておくと効果的です。

**目的を明確にする**
- 「このプロンプトで何を達成したいのか」をはっきりさせることで、AIのアウトプットが的確になります

**具体的な指示を出す**
- 抽象的なプロンプトではなく、シンプルで具体的な指示を心がけましょう

**フィードバックを活用する**
- AIの応答が期待通りでなかった場合、その原因を探り、プロンプトを微調整していくことで精度が上がります

　
**この連載でもたびたび言及する通り、AIをツールではなく思考のパートナーとして扱うマインドセットを持つことが、地味ですがとても大切だと思います。**

# §まとめ
プロンプトエンジニアリングの実務応用や高度な応用事例は、AIの可能性を広げる大きな鍵です。特に、業務効率化やクリエイティブなタスクでその効果を発揮します。

まずは、日常のタスクから試し、自分なりの成功体験を積み重ねていきましょう。プロンプトエンジニアリングは、使いこなすほどに奥深いスキルです。
　
**🔑 この記事のポイントまとめ**
**業務効率化 → 定型タスクにAIを活用し、時間を削減せよ。**
**大量・高度なデータ分析 → トレンド予測や課題抽出をAIに任せること。**
**クリエイティブ活動の支援 → ストーリー構築やデザイン案を効率化せよ。**
**プログラミングサポート → コード生成・レビュー・バグ修正を依頼せよ。**
**成功のコツ → 目的の明確化と具体的な指示、フィードバックの活用が鍵。**
**「AIは思考のパートナー」というマインドセットを忘れないこと！**
　
次回は、プロンプトエンジニアリングにおける実践的な課題解決方法を具体例を交えて解説していきます。どうぞお楽しみに！

ご訪問ありがとうございました！
LT登壇について（2024年のまとめ）

Voicy で SRE してます。
今年やったLT登壇について少しばかり書いてみたいと思います。

## Before Voicy
Voicyに入社する前は、まったくもってLT登壇などはしませんでした。
外部のセミナーなどに少しは参加していましたが、参加するだけでした。

## Voicy入社後
まず、なぜLT登壇してみようかと思ったかですが、Voicy社内では
LT登壇してる人がそこそこいたというのが、一つの理由です。
もう一つは、社内でエンジニア発表会という、社内LTのような事を
やっているので、それに影響されたというのもあります。

## どんな分野？
基本、SRE系が多いです。
ただ、たまにAIとか、余り使ったことがないツール系のLTもやったりします。 

## 2024年は何回やったか？
多分、17回くらいLT登壇したみたいです（残ってる資料とかで数えました）
上を見たらキリはないですが、0回の時よりは増えてるはずです。

## ネタはどう考える？
発表するネタですが、コスト削減とか、Datadogとか大きな枠はだいたいあると思うので、
そこから当日の朝までぼちぼち考えます。パッと出る時はいいですが、たまに悩む時も・・・

## 資料作成
だいたい当日の朝に作成してます。
LTと言っても、発表時間は結構幅があり、5分~15分くらいという感じです。
発表資料を作成してから、多すぎたということもたまにあります。
ですが、だいたい15〜30枚くらいで作成する感じにしています。
小さい字だと見辛いので、大きめの字で作成するようにしてます（なるべく）

## LTの時に気をつけてること
最初の頃失敗していたのは、速く話しすぎて、半分くらいの時間とかで終わってしまった
ことがありました。最近は、スマホで時間を見ながら話すようにしてます。
後は、話す内容の細かいとこは、登壇した時に適当に話していることが多いです。

## LTやって良かったこと
登壇すると、少しは話しかけてくれる方がいます。
そして、登壇したことにより顔は知られてるので、若干話しかけやすいというのもあります。
チキンな私としては、そういう部分がすごくありがたいです。

## 今後
外部発信としてのLT登壇は今後も引き続きやっていきたいと思っています。
まだまだ下手ですが、少しずつでも進歩していければ良いかなと思っています。

## お勧め
LTやると、半強制的に登壇資料を作成するので、色々勉強になります。
発表する場に立つというのも良い経験ですし、知り合いも増えます。
ってことで、みなさんLTやりましょう！

## Voicy IT/エンジニアタブができました
Voicyのスマホアプリのみとなりますが、「IT/エンジニア」タブができました。
エンジニア専用のパーソナリティ応募フォームもありますので、ぜひご応募ください。

https://prtimes.jp/main/html/rd/p/000000390.000021111.html
IPA「2024年度未踏アドバンスト事業」に応募しました

# 結果
不採択でした:santa_tone2:

https://www.ipa.go.jp/jinzai/mitou/koubo/index.html

# はじめに
応募の具体的作業に入ってから認識したことですが、IPAの「未踏アドバンスト事業」って委託契約による有償開発作業だったのですね。これから応募されようと考えていらっしゃる方は、この点よく考慮した方がよいかと存じます。

わたしはどちらかというと、まじで委託契約獲得狙いで応募したわけではなく、自分の企画アイデアがどんな風に評価されるのかという点に興味があり、応募にいたったのです。

# 応募作業
## 工数見積もり

これがけっこう厳しい。基本的にひとり親方（自営業）で、他の継続案件で長時間稼働しているので、応募事案に割ける時間工数がおのずと限界があり、成果物想定もだいぶしょぼくなってしまいました。本業がある人材で対応するには、ある程度複数メンバーで作業分担できる体制を整えてから応募した方がよさそうです。（本気で委託契約を獲得めざす場合）

## 提案内容（抜粋）

プロジェクト名:日本語ロジック仕様記述言語 Re:Mind（リマインド）

①プロジェクトの背景、目的、目標
業務系システムエンジニアはソフトウェアエンジニアでありながら、要件定義や設計を主たる担当工程とするようになると、実装言語の記述作業から離れてしまい、仕様書も自然言語で記述することが多くなります。ソフトウェアエンジニアリングでありながらソフトウェアの支援をほとんど受けずに設計を行っている態様の現場が多くみられます。
設計モデリング用言語として構造化された日本語によるコンパイル言語を提供し、システムエンジニアの設計工程にコンパイル検証を導入することで後工程の品質を高めることが主たる狙いです。

◇メリット
1. 自然言語の母語が構造化された制約があるだけで、言語としての可読性が高い
この点でシステムエンジニアリングに疎いドメインエキスパートでも十分に意図を共有可能（特に上流のモデリング記述）
2.ロジックの意図の表現・精度が自然言語記述より格段に増す
数学的形式言語ほどではないにしろ、最上流から静的に型付けされた構造化言語による記述とすることでシステムに出現するデータの型の引き、戻りの一貫性は検証可能

②開発に関する未踏性の主張、期待される効果など
本プロジェクト成果物の日本語プログラミング言語仕様としては、制御構文の開始シンボルとして、◇、〇、□、・などの全角記号を用い、箇条書きされた日本文としての体裁をトランスコンパイラ言語としての Re:Mindの構文と共有しています。◇は分岐構文、〇はループ構文の開始と終了を表し、これらの構文のシステムトークン・予約語に対して冗⾧な日本語表記がなくてもフロー図の表現に慣れている方が直感的に認識できることを考慮しています。


表１ 現存する日本語プログラミング言語との基本的な相違

|言語名 |日本語語彙 |日本語語順 |分ち書き |オブジェクト指向|
| --- | ----- | ----- |----- |----- |
|なでしこ |使用する |使用する |しない |対応しない|
|プロデル |使用する |使用する |しない |対応する|
|Mind |使用する |使用する |する |対応しない|
|Re:Mind |使用する |使用しない |する |対応する|

# 審査結果
不採択（書類選考）

# 評価された点
「実用性は高いと思われます。」:tada:

# 評価できなかった点
「普通のプログラミング言語との大きな差別化がなされている印象がない。」
その他開発体制的なお話。:sweat_smile:

# おわりに（私の感想）
おおっ、「実用性は高い」とはうれしいおことばというのが率直な感想。「普通のプログラミング言語との大きな差別化」はめざすところではないので、そんなこと言われてもという感じではあります:santa_tone2:
【UiPath】「範囲を読み込み」を高速化するには「表示行のみ」をオフにする

モダンの「範囲を読み込み」アクティビティには、「表示行のみ」というプロパティがある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/c63f0ee5-f224-0056-d1e1-ae47c591d369.png)

>- 表示行のみ
表示されている行のみを読み取る場合は、このオプションを選択します。フィルター処理された値および非表示の値は無視します。

https://docs.uipath.com/ja/activities/other/latest/productivity/read-range-x

このプロパティはデフォルトでオンになっているが、どうもこの設定が速度に強く影響を及ぼしているようだ。フィルターや非表示を使っていなければオフにしても問題ないため、必要なければオフにしておこう。

## 検証
速度の検証として、「範囲を読み込み」で1000行ほどのExcelを読み込み、処理にかかる時間を計測する。また、これを連続して5回繰り返す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/16d06372-f605-1a5d-cb91-6ccd36dc8b68.png)

### 表示行のみ：オン
平均して1回あたり20秒ほど。それなりに時間がかかっていることが確認できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/fa5e82f5-1bdb-7566-94a3-a0aaef76258f.png)

### 表示行のみ：オフ
なんと平均して1回あたり1秒もかかっておらず、速度に大きな違いが出ている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/a3197c5b-6537-a2dc-af29-9bd3303404f6.png)

## まとめ
必要なければ「表示行のみ」はオフにしよう！


## 参考
サンプルのExcelファイルについてはこちらのサイトから拝借した。

https://note.com/yutanarikawa/n/n5a64a4b45b3c?utm_source=chatgpt.com

## 動作環境
UiPath.Excel.Activity v2.24.4
Cloudflareをビジネスとして使う際の自分なりの心構え

# はじめに

近年、Web技術の進化とともに、開発者が迅速にサービスを構築・提供できるプラットフォームが増えています。
その中でも、Cloudflare や Hono など、手軽で強力なエッジコンピューティングや高速なAPIフレームワークが注目を集めおり、スピード感を求められる現代のビジネス環境において、非常に魅力的だと思っております。

しかしながらビジネスの長期的な安定性を考慮すると、特定のサービスやプラットフォームに過度に依存することにはリスクも伴います。
今回はこれらのリスクについて自分なりの心構えをご紹介いたします。

# Cloudflareとは？

Cloudflareは、2009年に設立された企業であり、世界中のWebサイトやアプリケーションのセキュリティ向上やパフォーマンス最適化を目的とした幅広いサービスを提供しています。

https://www.cloudflare.com/ja-jp/

Cloudflareと言えば、かつては **CDN（コンテンツ配信ネットワーク）** の印象が強いサービスでした。Webサイトを高速化し、DDoS攻撃から保護するサービスとして知られています。
しかし近年、Cloudflare Workers というエッジコンピューティングプラットフォームの登場により、その利用範囲は大きく広がっています。

## Cloudflare Workersとは？

Cloudflare Workers は、Cloudflareのグローバルなエッジネットワーク上でコードを実行できるサーバーレスプラットフォームです。
従来のクラウドサーバーとは異なり、リクエストがユーザーに最も近いエッジロケーションで処理されるため、高速で応答性の高いアプリケーションを構築することが可能です。

https://www.cloudflare.com/ja-jp/developer-platform/products/workers/

## Cloudflareへの依存が引き起こすベンダーロックイン問題

界隈では、押せ押せモードになっているような感じがしますが、やはりCloudflareにもベンダーロックインというビジネス上の大きな課題が潜んでいます。

### 料金体系の変更

クラウドサービス全般に共通するリスクとして、料金体系が突然変更される可能性があります。

### サービス終了や仕様変更

Cloudflareが特定のサービスを終了したり、APIの仕様を変更した場合、既存のシステムが動作しなくなるリスクがあります。

:::note warn
少し話が逸れますが、Cloudflareで障害が起きたときも考慮した方が良いですね。
:::

### 余談

昔、狂四郎2030という漫画があり、「おかわりもいいぞ！」という有名な１シーンがあります。（詳しくは調べてください）
ベンダーロックインも謂わばカレー問題と同じだとは思っており、依存すればするほど苦痛は続くようになっているということです。

私の中で記憶に新しいのは、某ネットショップサービスの料金改定です。
突然の発表でしたし、料金が三倍以上になったのも衝撃的でしたね。

## 対策 - 退路を確保する

怖いことを書きましたが、
ゴルゴ13のように、有事の事があった際でも常に退路を確保していれば大丈夫です。

### Hono

今流行っているHonoは、Web標準で実装されたフレームワークなので、Cloudflareに依存している訳ではありません。
これは別に移行がしやすいかなと思います。

### Cloudflare Workers

他のサービスでも同様の機能（Lambda@Edge など）を提供しているものがあり、これも代替がまだ可能です。

# 問題はこの後

Cloudflareには色々なサービスがありますが、Cloudflare以外に代替が出来ない技術・サービスについては特に警戒が必要です。

Cloudflareが安すぎるのが、自分の中で特に警戒しているところでもあります。
ドメインの更新費用が安いし、PagesもWorkersもCDNも無料プランがあるので、慈善団体か何かと勘違いしてしまいそうですが、しっかりと取捨選択をしながら判断していきたいところですね。
常に危機管理をしながら、技術・サービス選定をしていただきたいという話でした！
node.js stdinの超簡単なmock関数

node.jsでstdinを受け取る関数のテストを書きたいときに、ユーザー側の入力を最初から注入しておきたい。一応、stdinのmockをjestとかvitestに入れるツールもあるけれど、そこまではしなくて良い場合。

例として、こんな関数があったとする。

```ts
import { stdin, stdout } from "node:process";
import { createInterface } from "node:readline/promises";

const rl = createInterface({
	input: stdin,
	output: stdout,
});

const main = async (props: {
	interfaceFn: { question: (query: string) => Promise<string> };
}) => {
	const { interfaceFn } = props;
	const name = await interfaceFn.question("");
	console.log(`Hello, ${name}!`);
};

main({ interfaceFn: rl }).catch(console.error);
```

普通に`rl.question("")`でユーザーの入力を受ける。そのユーザーの入力を受ける関数を引数にしているだけ。

それではmockの場合。

```ts
const main = async (props: {
	interfaceFn: { question: (query: string) => Promise<string> };
}) => {
	const { interfaceFn } = props;
	const name = await interfaceFn.question("");
	console.log(`Hello, ${name}!`);
};

const mock1 = (response: string) => ({
	question: () => Promise.resolve(response),
});

main({ interfaceFn: mock1("TEST") }).catch(console.error);
```

こうしてquestion関数を持つオブジェクトを返す関数を作成し、先に返り値を指定できるようにした。これで、テストのときはmock1関数を使って、それ以外のときはrl.questionを使えばだいたい同じような動きになる。このあと、入力された値をバリデーションしたりとか、いろいろするわけだ。

そんな感じですね。
インプットの量を増やすためにやっていること

こんにちは、ふるすです。  
アドカレ期間ということもあり、なるべく毎日投稿をしようと奮闘中なのですが…  
当然アウトプットを増やすにはその分ネタが必要＝インプットが必要なわけでして。

普段やっていることから、この期間中に始めたこと、これからスタートしようと思っていることなどまとめてシェアできればと思います。

## 普段やっていること

1. **各種メディア記事やニュース記事のランキングとトレンド検索**

    Qiitaやnote、LINEニュースやyahooニュースといった主要メディアのランキングとトレンド検索です。パーソナライズされてしまったSNSだと自分の好きな記事しか出てこなくなってしまうため、何が話題になっているのか広く調べるには有効かと思っています。  
    ちなみに自宅にはテレビがありません。。

2. **各種SNS**

    主にXとInstagramからのインプットが多いです。  
    必ずしも良質な投稿ばかりではないですし、ほぼ流し見ですがたまに良い出会いがあります。  
    また技術広報という仕事をしている関係上、SNSからあまり離れすぎると訴求したい方との価値観の差が乖離してしまうことへの恐怖もあります。  

    ちなみにXのアカウントはこちらなので、よろしければフォローしてください！(宣伝)  

https://x.com/Devrel_yulah

3. **社内Slackのチャンネルやtimes確認**

    社内のトレンドを掴むには社内のコミュニケーションツールが一番！  
    テレワークが恒常化してからは、Slackでのやりとりが基本となりましたので、情報収集にはもってこいです。  
    コロナ以前は出社して人に会うことで、社内の人同士の関係値が見えてきたものですが、今はそうもいかなくなりました。ただ自分の性格上、お話したことのない方の考えや関係性がSlackによって見えてくるのはやりやすいなと感じています。

## この期間中に始めたこと

1. **読書でインプット**

 https://amzn.asia/d/05EXlZs

数年前に流行したこちらの本。  
    何度か途中で挫折してはまた一週目から読み直し…をしていたのですが、また読み始めました。  
    本からのインプットを増やしたいな～というのと、引き出しを増やすには一般教養を広く学ぶのがいいかなと思い読んでいます。  
    そしてこの本がブームになってから、同じスタイルの書籍が増えているようでいろんなテーマのものがありました。シリーズ化もされているようですね。

2. **技術関係のインプット**

    実務では使わないものの、開発部門にいる以上技術関係の勉強もしなければと思い始めました。今はコチラの本でAWSの勉強をしています。

https://amzn.asia/d/dTXlLTe

技術関係はもっといろいろなインプットのやり方があるよなぁと思い模索中です。  
これもやってみたら？というおすすめがありましたらぜひ教えてください！

ここまでお読みいただきありがとうございました😊
新たな自由を求めて！Discord鯖探しの旅 (Distopiaレビュー)

# 新たな自由を求めて！Discord鯖探しの旅

2024年12月20日

最近、Discordでのコミュニケーションが楽しくて仕方がない私ですが、自由に発言できるコミュニティを見つけるのが本当に難しいと感じています。特に、言論の制限が少ないサーバーを探しているのですが、なかなか理想の場所に出会えません。

## 現在のDiscord環境の課題

Discord公式やDisboard、ディス速などの掲示板は、規制が厳しく、すぐにサーバーが消されてしまったり、制限が設けられたりすることが多いです。そんな中、最近知り合いのサーバーで紹介されたのが「Distopia」という新しい掲示板です。これは、私が求めていた自由なコミュニティかもしれません！

## Distopiaの魅力的な特徴

Distopiaは、制限が少ないDiscord鯖掲示板として注目されています。サイトにアクセスしてみると、非常に洗練されたデザインで、最近サービスが開始されたばかりのようです。登録されているサーバーはまだ少ないですが、どれも個性的で無法地帯な雰囲気が漂っています（笑）。

### 運営者のビジョン

Distopiaの運営者は、極端な規制を排除したプラットフォームを目指しているとのこと。組織的な犯罪や不正行為を除けば、基本的に削除されることはないそうです。私のサーバーも少し過激な内容が含まれているので、この方針は非常に安心できます。

### 特徴的な機能とアクティブレート

Distopiaには「アクティブレート」という独自の機能があり、各サーバーのボイスチャットやチャットのアクティブ度を数値化しているようです。ランキングのトップに位置するサーバーは驚異的な600万という数字を誇っています。私も上位に入れるように頑張りたいです！

### プレゼント企画の楽しみ

定期的にNitroなどのプレゼント企画も行われているようで、私も登録後に応募してみようと思っています。

## 技術的な背景

DistopiaはSvelteKitを使用して構築されているようで、データベース管理にはPrisma Clientが使われているとのこと。具体的な技術的な詳細は教えてもらえませんでしたが、アクティブレートなどの秘密にしたい部分が多いようです。

## 未来への期待

Distopiaのサーバー登録数はまだ少ないですが、リリースされたばかりのサービスなので、今後Disboardなどと肩を並べる存在になる可能性は十分にあります。私もこの先の展開に期待しています。

## 結論

最近リリースされたばかりのDistopiaは、登録サーバー数は少ないものの、今後の発展が楽しみなサイトです。もしこのブログを鯖主さんが見ていたら、ぜひ登録してあげてください！

ぜひ皆さんもDistopiaのサイトを一度訪れてみてください！

[Distopiaの公式サイトはこちら](https://distopia.top/)
【Next.js】useSearchParamsの使い方

## 概要

`useSearchParams`は、`URLSearchParams`インターフェースの読み取り専用バージョンを返します。これにより、URLのクエリパラメータを取得できます。ただし、`useSearchParams`はサーバーコンポーネントではサポートされていないため、クライアントサイドでのみ使用可能です。

## 使用方法

以下は、`useSearchParams`を使用してURLのクエリパラメータを取得する例です。

```tsx
'use client'

import { useSearchParams } from 'next/navigation'

export default function SearchBar() {
  const searchParams = useSearchParams()

  const search = searchParams.get('search')

  // URL -> `/dashboard?search=my-project`
  // `search` -> 'my-project'
  return <>Search: {search}</>
}
```

## クエリパラメータの取得

`useSearchParams`は、以下のメソッドを提供しています：

- `get()`: 指定したクエリパラメータの最初の値を返します
- `has()`: 指定したクエリパラメータが存在するかどうかを返します

その他、`getAll()`, `keys()`, `values()`, `entries()`, `forEach()`, `toString()`などがあります

```tsx
'use client'

import { useSearchParams } from 'next/navigation'

export default function SearchBar() {
  const searchParams = useSearchParams()

  const search = searchParams.get('search')
  const hasSearch = searchParams.has('search')

  console.log(search)       // クライアントサイドでのログ
  console.log(hasSearch)   // クエリパラメータの存在確認

  return (
    <>
      Search: {search}
      {hasSearch ? ' - 検索結果あり' : ' - 検索結果なし'}
    </>
  )
}
```

## 静的レンダリング時の挙動

静的にレンダリングされたルートで`useSearchParams`を呼び出すと、最も近い`Suspense`までのクライアントコンポーネントツリーがクライアントサイドでレンダリングされます。これにより、静的にレンダリングされた部分と動的にレンダリングされた部分を組み合わせることができます。

```tsx
import { Suspense } from 'react'
import SearchBar from './search-bar'

// フォールバックとして使用されるコンポーネント
function SearchBarFallback() {
  return <>placeholder</>
}

export default function Page() {
  return (
    <>
      <nav>
        <Suspense fallback={<SearchBarFallback />}>
          <SearchBar />
        </Suspense>
      </nav>
      <h1>Dashboard</h1>
    </>
  )
}
```

上記の例では、`SearchBar`コンポーネントがSuspense境界でラップされており、初期HTMLでは`SearchBarFallback`が表示されます。Reactのハイドレーション中に値が利用可能になると、`SearchBar`コンポーネントに置き換わります。

## 動的レンダリング時の挙動

動的にレンダリングされたルートでは、`useSearchParams`がサーバーサイドの初期レンダー時に利用可能になります。

```typescript
import SearchBar from './search-bar'

export const dynamic = 'force-dynamic'

export default function Page() {
  return (
    <>
      <nav>
        <SearchBar />
      </nav>
      <h1>Dashboard</h1>
    </>
  )
}
```
量子プログラミングを初めて5年目。振り返りと、来年はどんな年にするか？

# 昔話
文章ばかりですみません。
自分でもよくやってきたと思います。

## 1年目(2020)
Qiitaに初めて量子コンピュータのプログラミング記事を投稿したのが**2020/12/17**。
この時はPythonとは何ぞや？でした。
量子コンピュータを叩くライブラリがPythonばかりのために、まずはPythonを必死に覚えました。

## 2年目(2021)
1年ほど頑張った結果。
今の量子コンピュータ(NISQ)では実用上何もできないことを悟った。
基本的なアルゴリズムをフルスクラッチしまくり、ごり押し力を付けた。
qiskit textbookのバグとか結構見つけて報告してた頃。
以降も、このころの貯金で走っているところがあるので、やっぱり地道に力をつけることは大事。
このころ知り合った人たちと、今もお友達。

## 3年目(2022)
2年ほど頑張った結果。
相変わらずオブジェクト指向すらよくわかっていなかったが、とりあえずライブラリを動かすぐらいには苦労しなくなった。
このころには、覚えたPythonのテクニックで、仕事の効率化ツールを作りまくっていた。

量子プログラミングも、そろそろなんか出来そうだな、ということで、本業の研究の土俵で
量子機械学習の論文を書いて国際学会に投稿した。
査読者の方はかなり困ったと思われるが、ポスターで通して頂いた。
おそらく、**社内で(ゲート型の)量子コンピュータで初めて国際学会に論文を通した人間**になった。
量子機械学習はやっぱり挙動がよくわからないな、という感覚もあったので、
本業の少し外れた分野の研究会に、Grover系の決定論的な量子加速アルゴリズムを提案した。
チュートリアルを少しmodifyした程度のものではあったが、量子アルゴリズムという斬新さから、この論文は表彰対象となった。
**社内で(ゲート型の)量子コンピュータで初めて表彰された人間になった。**
このころから、社内でも認知され始めていた。

## 4年目(2023)
社会人博士を取りに行った関係で、量子コンピュータ関連はほとんど出来なかった。
**とかいいつつ、本格化する前に、量子機械学習の論文を1本書いて、国際学会に投稿した。**
**これはオーラル（ポスターより格上）で採録された。**
内容としてはちょっとごり押しだったが、継続するということも重視した。
共同研究として先生に教えてもらいながらやったので、
**社内で(ゲート型の)量子コンピュータで共同研究をした初めて(少なくとも、ごく初期の)の人間になった。**
このころから、社外の人にも認知され始めていたと思う。

## 5年目(2024)
ここまでの量子コンピュータ関連の作業は、すべて**趣味**としてやってきた。
なので、どこにも所属していない。
色々あって、そろそろ人材育成含めて真面目にやったほうがいいんじゃないかと思って、**仕事にすることにした。**
幸いにも社内に量子コンピュータを真面目にやろうという機運が少しあったので、ありがたいことに歓迎された。

すぐに量子コンピュータの研究をしたかったが、「少し違う研究のほうで困っていて、やってくれないか」ということだった。
素人発想・玄人実行を胸に、「普通に考えたら無理だろ」と思うアイデアだったが、「無理だということを誰も真面目に検証してないんだったら、やろう」という気持ちでやった。
勝ち筋はそれほど見えていなかったが、今の自分であれば倒れこみながらでも何かは出せるという根拠のない自信はあった。

これが、やってみると、そこそこうまくいき、論文を書こうという話になった。
これでいけることがわかったので、今ちょっと真面目にやりこんでいる。
**この仕事の脇道で、特許も書いているところだ。
こういう「脇道」「寄り道」というのは、研究者は大事にしないといけない。

また、量子コンピュータ関連でも、何かできるんじゃないかと思い始めているところ。
勝ち筋は見えてない。
今のところは、空き時間は量子コンピュータの論文を読み漁っていて、自分より若い人に教えたりしている。

# 来年の抱負
目標というのは、高ければ高いほど良いと思う。
ということで、高い目標を掲げる。達成できなかったら、やけ酒を飲もう。

- 量子で国際学会または論文誌に、論文を2本以上通す。
- 量子コンピュータに本質的な貢献をする。ユースケースではなく、概念を作る。
- 量子で特許を2本以上書く。
- 量子で認知度を上げる。具体的には、客観的な役回りだったり、PJ推進をする。
- 量子で人材育成をする。量子技術に限らず、研究スタイル等をしっかり教えていく。
- 上記をやりつつ、本業でも国際学会または論文誌に論文を2本以上通す。

無茶に思えるが、大体いつも10個前後の研究ネタを並行でやっているので、全く無理とも思っていない。

# 結論
これまで、夢を描き、楽しく元気にやってきました。
これからも、そうありたいと思います。
量子は、夢を語らないとつまらないでしょう。


# ちなみに
アドベントカレンダーを縦ビンゴしました。
初ですかね？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/c18260b2-37d3-dc7e-ed17-94824ab4183f.png)
Vimを使えるようになりたくて

# はじめに
キーボードを打って目にも止まらぬ速さでカーソルが動くのを見ると、「Vimかっこいい」と憧れたことはありませんか？私も憧れました。
けどいざ独学で調べてやってみると、ijklでの移動やモードの概念を理解しても、Vimを触っている人たちと同じ動きができなくてもどかしく思いました。
周りにVimmer(Vim使い)もおらず、いつか使えたらなと半分諦めていたら、UdemyでVimの日本語講座があったのでやってみました！

# 対象読者
- Vim初心者
- Vimmerが近くにいない人

# 受講した講座
私が実際に受講した講座はUdemyの講座です。
[現役シリコンバレーエンジニアが教える NeoVim(VIM) + Tmux + Zsh 入門](https://www.udemy.com/course/vim-tmux-zsh/?couponCode=ACCAGE0923)

https://www.udemy.com/course/vim-tmux-zsh/?couponCode=ACCAGE0923

# なぜ動画を選んだか
動画でVimを学習しようかと思った理由は以下です。
- Vimmerが周りにいない
- 書籍だと視線の動かす幅が広い
- 合わなかったらすぐに変えたい

プログラミングのツールの勉強なので、動くものを見て実際に動かして確認しながら学習したかったのが大きな理由です。

# なぜUdemyの動画を選んだか
- YouTubeだと音質が悪かったり途中で更新停止の動画も多かった
- 日本語で受けられる講座が複数あった
- 割引期間で __80%オフ__ だった

講座内容や音質や画質が安定していることが理由ですが、割引期間だったことも大きいです笑

# 講座内容と感想
受講した講座ではVimのインストール方法から、基本的な移動やモード、プラグインの導入など流れに添いつつ内容が多岐に渡っていました。
特に画面分割は、エンジニアっぽくてかっこよくて学べてよかったです！
Vimを使ったゲームの紹介や、シリコンバレーの話など、遊び要素もあり受講していて飽きませんでした。

受講前には気づいていなかったのですが、好きなチャプターを見直すことが簡単で、買ってよかったと満足しています。

# 独学では「体系的な学び」は難しかった
独学でVimに挑戦したとき、最初に挫折したのは「何を覚えればいいのか分からない」という問題でした。情報はネット上にあふれているものの、断片的で体系的に学ぶのが難しかったのです。
それが、Udemyの講座では、順序立てて丁寧に解説してくれたので、「Vimの全体像」が掴めたのが大きな収穫でした。

# おわり
最初はVimをすごく難しいと思っていましたが、学び方を工夫すれば使いこなせるようになることがある程度わかりました。Udemyの講座は体系的にまとめられており、何度でも見返せます。
これからVimを学びたいと考えている方は、ぜひUdemyで受講して「かっこいいVim」を自分の手で実現してみてください！
Polarsでよく使われているエクスプレッション

Polarsには多くのエクスプレッションが用意されていますが、その数は多く全部を覚えるのは大変ですよね。覚えるのであればよく使われているものから効率的に覚えたいです。

ということで、よく使われているエクスプレッションを調べてみました。
Kaggle notebookで「Polars」で検索して出てくるnotebook上位100件からエクスプレッションを集計しました。
構文解析で集計したかったですが、ちょっと面倒だったのでGPT-4oにnotebookを渡してエクスプレッションを抽出させました。

# 集計結果
さっそくですが集計結果のよく使われているエクスプレッションTOP5は以下の通りでした。（記事の最後にTOP100まで載せています。）
エクスプレッションを抽出するようにGPT-4oに指示してもwith_columnsなどのエクスプレッション以外も抽出してきていたので、GPT-4oの抽出結果を人力でフィルタしました。
```
 1, col
 2, alias
 3, cast
 4, mean
 5, max
```
もうちょっと意外なエクスプレッションも上位に入ってくるかと思ったのですが、言われたらそりゃこのあたりが上位だよなという結果でした。

# 利用頻度上位エクスプレッション
ひとつづず使い方を見ていきます。

## col

`col` は「列を指定する」ためのエクスプレッションですね。
`select()` や `with_columns()` などの中で、どの列に対してどんな操作をするかを宣言する際によく使います。
```python
df = pl.DataFrame({
    "id": [1, 2, 3],
    "name": ["Alice", "Bob", "Charlie"],
    "age": [25, 30, 28]
})

# name列を選択
name_series = df.select(
    pl.col("name")
)
```
## alias
`alias` は、エクスプレッションの結果に新しい名前（エイリアス）を付けるために使用するものですね。複雑な処理を行う際に、中間結果に分かりやすい名前を付けることで、コードの可読性を向上させることができます。
```python
df.select(
    pl.col("salary") * 1.1).alias("salary_with_bonus")
)
```

## cast

cast は、カラムのデータ型を変換するために使用するものですね。例えば、整数型を浮動小数点数型に変換したりします。

```python
# age を浮動小数点数型に変換
result = df.select(
    pl.col("age").cast(pl.Float64)
)
```

## mean, max
`mean` は、カラムの平均値、`max` は最大値を計算するために使用します。
`min`、`std`など統計量を求めるエクスプレッションも `mean`、`max`と同じくらい使う気がします。
```python
result = df.select(
    pl.col("age").mean().alias("age_mean"), # age の平均値を算出
    pl.col("age").max().alias("age_max"),  # age の最大値を算出
)
```

# そのほか使われているもの
よく使われていたものTOP100は次の通りです。（エクスプレッション以外も含まれています。）
```
'col', 'alias', 'with_columns', 'cast', 'join', 'filter', 'group_by', 'mean', 'drop', 'duration', 'max', 'agg', 'rename', 'select', 'unique', 'map_elements', 'over', 'min', 'sqrt', 'dt', 'sum', 'concat', 'count', 'read_csv', 'last', 'sort', 'str', 'abs', 'apply', 'first', 'rolling_mean', 'sin', 'cos', 'is_not_null', 'explode', 'collect', 'transpose', 'read_parquet', 'to_pandas', 'quantile', 'std', 'from_pandas', 'lit', 'split', 'n_unique', 'pipe', 'fill_null', 'is_in', 'get_column', 'ewm_mean', 'groupby', 'Series', 'drop_nulls', 'rolling_std', 'concat_str', 'to_datetime', 'month', 'scan_parquet', 'to_numpy', 'kurtosis', 'median', 'len', 'replace', 'to_series', 'head', 'diff', 'year', 'lazy', 'hour', 'total_days', 'day', 'when', 'then', 'shift', 'strptime', 'value_counts', 'struct', 'weekday', 'sample', 'Float32', 'null_count', 'is_null', 'to_list', 'rolling_max', 'vstack', 'str.extract', 'suffix', 'describe', 'date', 'exclude', 'fill_nan', 'str.split', 'otherwise', 'on', 'how', 'reverse', 'DataFrame', 'log', 'write_csv', 'display'
```

さすがに、上位は見たことあるエクスプレッションばかりですが、`ewm_mean`など私は使ったことないものもありました。

また、meanとstdは同じくらい使われている気がするのですが、順位に差がありました。
ここはGPT-4oの抽出が失敗していたり、人気のkaggle notebookはよくフォークされていたりするので、集計対象のnotebookにバイアスがかかっている可能性も考えられます。

# 最後に
本当は、よく使われているエクスプレッションを抽出して、逆に全く使われていないエクスプレッションを洗い出そうとしたのですが、使われていないエクスプレッションが多すぎて断念しました。機会があればチャレンジします。
アプリケーションの設計アンチパターン：BBoM（Big Ball of Mud / 大きな泥だんご）

O'Reilly『C#クックブック』 p.19 に出てきた設計アンチパターン「BBoM」が初知りだったのでメモ

https://www.oreilly.co.jp/books/9784814400188/

## BBoM（Big Ball of Mud / 大きな泥だんご）とは

オライリー本に出てきたのは「BBoM」という用語。
アンチパターンを **「BBoMパターン」** というそうだ。

Googleでググった感じ、2024年12月現在では、日本語では「大きな泥だんご」と訳した言葉を使用することのほうが多そう。

※「BBoM」で検索してもQiitaの脚注1～2個しか引っかからなかったが、「大きな泥だんご」で検索したらたくさんの記事がヒットした。とりわけ、観測圏内ではQiita上にはBBoMについて書かれた記事は見当たらなかった。
（ということもあり、「BBoM」という見出しでこの記事を書いています。個人技術ブログにはポツポツと扱われているサイトがありました）

<br>

本中では **「このパターンでは、プロジェクトを１つ作成し、アプリケーションのすべてのコードを同じ層に詰め込もうとします」** と説明されている。
書き捨てならともかく、そうでないのなら端的に最悪ですね！

下記、Wikipediaの説明。

>大きな泥だんご (おおきなどろだんご、英: Big ball of mud) は理解可能なアーキテクチャが欠けている ソフトウェアシステム のことを指す。 ソフトウェア工学の視点から望ましくない状態にもかかわらず、このようなシステムは事業の圧力、開発者の 刷新 や コードエントロピー などの理由によって当たり前に発生している、アンチパターン の1つである。 🔗 [Wikipedia](https://ja.wikipedia.org/wiki/%E5%A4%A7%E3%81%8D%E3%81%AA%E6%B3%A5%E3%81%A0%E3%82%93%E3%81%94)

ちなみに初出は Brian Foote、Joseph Yoderによって書かれた1997年の論文「Big Ball of Mud」で、[ここから](http://www.laputan.org/mud/mud.html)論文を読むことができます。

<br>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632896/e361e63b-1b77-f8bb-1a1d-c3926765510a.jpeg" width=60%>

（見るからにつらそうな画像が生成された）

## BBoMのメリット(?)
- プロトタイプを素早く完成させることができる

<br>

とはいえ、個人的な経験で言えば、プロトタイプとして作成したものが思いの外反応がよく「これをそのまま育てて！」と言われることも少なくないため、後々つらい目に合うことも少なくないような気が……

## BBoMのデメリット
- 開発が長期にわたると致命的に複雑化する
- 機能追加・バグの修正の積み重ねにより、さらにコードが肥大化
    - 重複するコードも増える
        - コードが重複しているため、1ヵ所で修正したバグが別の場所に残っていて、同じバグを起こすことがある…
    - いわゆる「スパゲッティコード」の出来上がり！
        - **スパゲッティコードに機能追加・バグ修正を行う時間は、ずさんなプロトタイプにすることで稼いだ時間を簡単に上回る**
        - コードを管理することができなくなる
- 開発者がバグを何度も修正しなければならないだけにとどまらず、QA、開発、顧客報告、ヘルプデスクサービス、ソフトウェア管理のライフサイクル全体を必要以上に上回って余計な時間がかかる

<br>

結論：[メリット](https://qiita.com/drafts/5a6c326e6921a5c8dc1c/edit#bbom%E3%81%AE%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88)はメリットではありませんでした

## BBoMを避けるための方法

### 方法
- 関心の分離
    - 階層化のアプローチを採用することによって、関心の分離を実現することができる
- 結合度の低い設計
    - ex. SOLID, GRASP, KISS...

### 受けられる恩恵
- 同じデータを別のプロジェクトデータアクセス層からアクセスすることになった場合でもプロジェクトを再利用できる
    - 場合によっては難しいが、コードの重複を避けることと、データアクセスのロジックがある場所を把握できる

## 他参考

https://speakerdeck.com/masuda220/big-ball-of-mud

https://okuzawats.com/blog/big-ball-of-mud/

https://www.infoq.com/jp/news/2010/09/big-ball-of-mud/

https://blog.codinghorror.com/the-big-ball-of-mud-and-other-architectural-disasters/

<br>
自己紹介

初めまして。セキュリティ会社に勤めている社会人2年目のRuiです。
現在は脆弱性診断業務に行っており、来年からペネトレーションテストの業務を担当する予定です。その準備として、現在「TryHackMe」で学習を進めています。（将来的には「Hack The Box」にも挑戦したいと考えています。）

ペネトレーションテストに関してはまだ初心者ですが、自分の備忘録としてQiitaに記事を投稿していきたいと思います。
技術広報の目標設定とKPI設定

こんにちは、ふるすです。
技術広報アドカレ23日目を担当します:christmas_tree:

今年7月にフロント部門から異動してきてはや5か月が経ってしまいました。
異動してから今に至るまでずっと悩みの種になっていることがあります。
それが**目標設定**です。
多くの方がすでに技術広報のKPI設定や目標設定について語っているかと思うのですが、あえて私も自分の頭の中にあることをアウトプットしておこうと思います。

かつてピーター・F・ドラッカーが『現代の経営』で唱えたように、目標設定による自己管理が働くうえで重要だ…と頭では理解しているのですが、技術広報の目標設定、難しくないですか？
そもそも日本における「技術広報」の業務範囲って…などと考えるとさらにややこしくなるのですが、
・エンジニア採用のための広報活動
・自社エンジニアのブランディング活動
・自社エンジニア部門の認知度向上
このあたりを前提に置くと、いずれにしても私たちの活動だけが良い影響を与えたとは言えず効果測定がとても難しそうです。

そして目標達成のためのKPI設定も難しいです。
数値化できるKPIの例をmegayaさんの記事より引用させていただきます。

https://note.com/megaya/n/n126b618d96e6


>・技術ブログ
　・月間の投稿数
　・PV / MAU
　・記事内のリンクから求人媒体へのクリック数
　・SNSやはてなブックマークのシェア数
　・記事を書いてくれたエンジニアの人数
　・他社とのリレーション数
　・記事によって他社との合同イベントにつながる
　・他社メディアからインタビュー依頼がくる
・イベント / 協賛イベント
　・イベント実施数
　・協賛を行った数
　・グッズを配布した数
　・登壇数
　・来客人数
　・名刺交換数
　・公式Twitterのフォロワー数
　・協賛ブースなどの企画で「フォローしてくれたら〇〇プレゼント」などを行う
　・SNSでのシェア数
　・イベント導線からの面談応募数
　・イベントの感想アンケートの満足度
・人事
　・面談の応募数
　・採用人数
　・入社した自社エンジニアへの調査 / アンケート
　　・効果があった施策を記録していく
　・エンジニアに直接コンタクトした数
・技術ブランディング
　・SNSの反響数
　・公式Twitterのフォロワー数
　・アンケート
　　・企業にアンケートを依頼して1年で自社の印象が変わったのか確認
　　・現在と1年後の数値で比較

きれいにまとめていらっしゃってすごい。  
それぞれの数を出すことは容易かもしれませんが、じゃあどれくらいの数を稼げたから「すごいね」になるのか？比較対象は昨年の数値？もしくは同業他社のもの？いまいちぴんときません。

**じゃあどうする？**
たしかに目標設定はしづらいし、成果は測りづらいですが、かと言ってこういった活動を取りやめて外向けの発信をやめてしまうのが得策とはとても思えません。
自社エンジニアの魅力を社外に発信したり、エンジニアの皆さんに発信してもらうことで、テック企業としての認知度を高めることは、優秀で多様なエンジニアの採用や維持に間違いなく寄与すると思っていますし、牽いては製品力向上、企業への貢献に繋がると信じているからです。

**つまりやるしかないのだ**
結論それかい！と思われるかもしれませんが、考えや価値観にアップデートがあればまたアウトプットしたいな。

ここまでお読みいただきありがとうございました:santa_tone1:
Qiita Advent Calendar 2024に参加してみて

# はじめに
個人としても、企業としても始めてAdvent Calendarに参加しました。
振り返りをおこない、課題と来年への計画を考えてみました。

# 課題
#### 準備不足
今年は年初から、Advent Calendarやりたいねーって話をまわりにして、
機運を高めてきたつもりでした。
しかし、当事者の私を含め全然準備をしてこなくて、
11月末ぐらいに他メンバーより、カレンダー作りました！って連絡を受けてからの
スタートとなったため、記事のストックはおろか、ネタのストックもない状態でした。

カレンダーを作ってから、乗り気なメンバーは私ぐらいで、
近しいメンバーにお願いして数本記事を書いてもらい、残りは私が量産するという流れで
結果、低品質な記事を量産してしまいました。

#### 記事の品質
上記でも書きましたが、記事の内容が他の方の参考になるものと、駄文に近いものと、
玉石混交な状態になってしまい、企業として参加しているにもかかわらず、
企業価値の向上に寄与できなかったのは失敗でした。

本来は、
- 弊社はこんな技術を持っています！
- 弊社はこんな分野に興味があります！
- 弊社にはこんなエンジニアがいます！

といったような、広報活動も兼ねた取り組みにしたかったのですが、
そこには至らず終わってしまいました。

# 来年の取り組み
#### 方針
今年と変わらず、企業紹介、企業広報も兼ねて、
Qiita Advent Calendar には参加する予定です。

#### 役割分担
特定メンバーに依存してしまったのが、敗因のひとつです。
もっと多くのメンバーが参加できるようにQiitaとは？といったような勉強会などを行い、
基礎知識をつけてもらうとともに、アウトプットの練習としても積極的にQiitaに投稿する
ような機運を高めていけたら、と考えています。

せっかく弊社にはいくつもプロジェクトがあるので、その単位で半期に1本ぐらい
記事を書いてもらうような働きかけもしていきたいです。

#### 品質担保
記事の品質低下の原因のひとつとして、余裕のなさがありました。
とりあえず書ききって、即投稿、みたいな流れでしたので、推敲が十分でなかったり。
来年は複数人で相互レビューするなど、投稿前・投稿後のリファクタリングを行えたら、
と考えています。

PGも同じですが、可読性が低いものは間違いなく品質も低いですよね。
レビューを重ねることにより、各自の品質も、レビューアのレビュー観点も
向上していくので、ここはメンバー間で積極的に取り組んでいきたいところです。

# おわりに
本当にお疲れ様でした。
来年こそはご期待ください！
引き続き、よろしくお願いいたします。
ブラウザ拡張機能で検索バーのアレを実装する（omnibox）

# 概要

これは[初心者のブラウザ拡張機能 Advent Calendar 2024](https://qiita.com/advent-calendar/2024/browser-extension)の22日目の記事です。

検索バーで使える`omnibox`を実装します。

# omniboxとは

検索バーで文字列を入力してスペースを押したときに表示されるドロップダウンリストのことです。

![omnibox](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302006/34034757-e7f1-0d3c-2fe5-9563c4d15679.png)

# 操作イメージ

ここでは文字列`in`を入力すると`omnibox`が出てきて、`hugahuga`を選択すると通知が飛ぶようにします。
※とりあえず動かすためのサンプルです

![omnibox 操作イメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302006/39c1c166-a710-fa31-7be1-3f1cfc670b4a.png)


# 具体的なソースコード

`in`を入力すると`omnibox`を作り出して、選択すると通知されるようにします。

```json:manifest.json
{
    "browser_specific_settings": {
        "gecko": {
          "id": "the-town-sample-omnibox@example.com"
        }
    },
    "manifest_version": 3,
    "name": "init-extention",
    "version": "0.1",
  
    "omnibox": { "keyword" : "in" },
    "description": "omniboxサンプル",
  
    "icons": {
      "48": "icons/icon-48.png"
    },

    "background": {
        "scripts": ["background.js"]
      },
  
      "permissions": [
        "notifications"
      ]
}
```

`"omnibox": { "keyword" : "in" }`でキーワードを指定します。

```javascript:background.js
browser.omnibox.setDefaultSuggestion({
    description: "これはテストです"
});


function onChanged(input) {
    const result = [];
    result.push({
        "content": input + "hogehoge",
        "description": "hugahuga"
    })
    return result
}


function onEntered() {
    browser.notifications.create({
        type: "basic",
        iconUrl: browser.runtime.getURL("icons/icon-48.png"),
        title: "Enter",
        message: "選択しました",
    });
}


browser.omnibox.onInputChanged.addListener((input, suggest) => {
    suggest(onChanged(input));
});


browser.omnibox.onInputEntered.addListener(onEntered);
```

イベントは入力時に反応する`browser.omnibox.onInputChanged`と選択時に反応する`browser.omnibox.onInputEntered`を主に使うと想定されます。

# 参考

[omnibox](https://developer.mozilla.org/ja/docs/Mozilla/Add-ons/WebExtensions/API/omnibox)

[firefox-code-search](https://github.com/mdn/webextensions-examples/tree/main/firefox-code-search)
【競技プログラミング】AtCoder Beginner Contest 006_B問題

# 問題
https://atcoder.jp/contests/abc006/tasks/abc006_2

## 要約

1. トリボナッチ数列の定義
   - a₁ = 0
   - a₂ = 0
   - a₃ = 1
   - aₙ = aₙ₋₁ + aₙ₋₂ + aₙ₋₃ (n ≥ 4)

2. 数列の最初の8項
   0, 0, 1, 1, 2, 4, 7, 13

3. 求めるもの
   aₙ mod 10007 （aₙを10007で割った余り）

変数
   n: 求めたい項の番号
   aₙ: トリボナッチ数列の第n項


# 既存投稿一覧ページへのリンク
[一覧ページ](https://qiita.com/o_chan_t/items/fc759695acfaef8df2cc)

# アプローチ
トリボナッチ数列は、直前の3項の和が次の項となる数列であり、初期値は0, 0, 1である。
大きな数値を扱う可能性があるため、各計算ステップで10007の剰余を取る

# 解法手順

1. 入力値nを整数として受け取る。
2. n+5の長さを持つリストaを0で初期化する。これは、インデックスのオーバーフローを防ぐためである。
3. トリボナッチ数列の初期値をセットする：a[0] = 0, a[1] = 0, a[2] = 1。
4. 3からn-1までのループを回し、各項を計算する。
5. 各項の計算では、直前の3項の和を求め、その結果を10007で割った余りを保存する。
6. ループ終了後、a[n-1]を出力する。これが求める解となる。


# ACコード
```python:ac.py

def io_func():
    # 入力値nを整数として受け取る
    n = int(input())
    return n

def solve(n):
    # n+5の長さを持つリストaを0で初期化する
    a = [0 for i in range(n+5)]
    
    # トリボナッチ数列の初期値をセットする
    a[0] = 0
    a[1] = 0
    a[2] = 1
    
    # 3からn-1までのループを回し、各項を計算する
    for i in range(3, n):
        # 直前の3項の和を求め、10007で割った余りを保存する
        a[i] = (a[i-1] + a[i-2] + a[i-3]) % 10007
    
    # n番目の項（インデックスはn-1）を返す
    return a[n-1]

if __name__=="__main__":
    # メイン処理
    n = io_func()
    result = solve(n)
    print(result)

###
# n: 求めるトリボナッチ数列の項数
# a: トリボナッチ数列の値を保存するリスト
# i: ループカウンタ
# result: 計算結果（n番目のトリボナッチ数を10007で割った余り）

# 1. io_func関数:
#    - 標準入力から整数nを読み取る
# 2. solve関数:
#    - 引数nを受け取り、n番目のトリボナッチ数を10007で割った余りを計算する
#    - n+5の長さのリストaを0で初期化
#    - トリボナッチ数列の初期値（0, 0, 1）をセット
#    - 3からn-1までループを回し、各項を計算
#    - 各項は直前の3項の和を10007で割った余り
#    - n番目の項（a[n-1]）を返す
# 3. メイン処理:
#    - io_func関数で入力を受け取る
#    - solve関数で結果を計算
#    - 結果を出力


```
3. Remove Duplicates from Sorted List

問題: Given the head of a sorted linked list, delete all duplicates such that each element appears only once. Return the linked list sorted as well.

## 1 brute force

```python3
class Solution:
    def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
        found_values = []
        current_node = head

        while current_node:
            if current_node.val not in found_values:
                found_values.append(current_node.val)
            current_node = current_node.next
        
        dummy = ListNode()
        last_node = dummy

        for value in found_values:
            last_node.next = ListNode(value)
            last_node = last_node.next
        
        return dummy.next
```
brute force 
時間計算量: O(n)  空間計算量: O(n)
いっちゃんわかりやすいのでは！！？？

## 2 いらないノードを外していく。
```python3
class Solution:
    def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
        current = head

        while current:
            while current.next and current.val == current.next.val:
                current.next = current.next.next
            current = current.next
        
        return head
```
時間計算量: O(n)  空間計算量: O(1)
既存の連結リストをあれこれやって作る。
自分のノード視点から次のやつを見ていく気持ち。
「次のやつ……あー同じやつや、スキップ、また同じや、スキップ……違うやつきた! `current = current.next`で飛び移れ！」

## 3 
```python3
class Solution:
    def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
        current = head

        while current:
            if current.next and current.val == current.next.val:
                current.next = current.next.next
                continue
            current = current.next
        
        return head
```

```python3
while conditions:
    # do something 
```
を
```python3
if conditions:
    # do something
    continue
```
に変換。自明すぎる。

```python3
class Solution:
    def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
        current = head

        while current and current.next:
            if current.val == current.next.val:
                current.next = current.next.next
                continue
            current = current.next
        
        return head
```

こいつも自明な書き換え

```python3
class Solution:
    def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if not head:
            return None
            
        else:
            node_in_original = head
            head_in_removed = ListNode(head.val)
            node_in_removed = head_in_removed

        while node_in_original:
            while node_in_original.next and node_in_original.val == node_in_original.next.val:
                node_in_original.next = node_in_original.next.next
            node_in_original = node_in_original.next
            node_in_removed.next = node_in_original
            node_in_removed = node_in_removed.next
        
        return head_in_removed
```
一応書いたけどうまみがなさげ。空間計算量は定数倍かな、多分。それにせよわざわざこれはないわ。
VSCodeで書式ごとコピーしないようにする方法

## はじめに
VSCodeにいったん記載して、Wordや他のテキストなどに貼り付けしようとすると
デフォルトでは背景色など書式ごとコピーされてしまうことがあります。


VSCodeでコピーして、
![スクリーンショット 2024-12-23 224005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/7bec876f-0821-0885-9da5-b68b56966333.png)
Wordなどにそのまま貼り付けると、
![スクリーンショット 2024-12-23 224028.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/a91c087c-b294-152e-a7b3-cfe5c13152c7.png)
このようになります。

このデフォルト設定を書式ごとコピーしない設定に変更することができます。

## 前提
・バージョン: 1.95.3
・OS: Windows


## 設定方法
VSCodeを開いて
「ファイル」→「ユーザー設定」→「設定」→「テキストエディター」と選択し「Copy With Syntax Highlighting」を検索してチェックを外します。
設定はこれだけです。
![VSCodepng.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/ff9ca4af-05fd-2408-e596-f3dc51568cda.png)



これでコピー時の設定をデフォルト書式なしに変更することができます。
この状態で、先ほどと同じくVSCodeからコピーして貼り付けると以下のようになります。
![スクリーンショット 2024-12-23 224524.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/30e6c383-ec3b-4078-542c-0b3f0ac0565e.png)

このデフォルト書式なし状態で、書式ごとコピーしたいとなった場合は以下の手順で実施することができます。
### 書式ごとコピーする方法
書式ごとコピーしたい範囲を選択して、
右クリックから「コマンドパレット」を選択し「Copy With Syntax Highlighting」と入力すれば書式ごとコピーすることが出来ます。
(コマンドパレットはCtrl+Shift+pまたはF1キーを押しても開くことができます。)
![Sntax.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/1a457a35-47ba-4811-3a6b-03e21a408cae.png)


## 参考サイト
公式のサイトでPDF形式のキーボードショートカットがあります。
こちらも便利ですので記載しておきます。

https://code.visualstudio.com/docs/getstarted/keybindings#_keyboard-shortcuts-reference

[windowsはこちら](https://code.visualstudio.com/shortcuts/keyboard-shortcuts-windows.pdf)
[macOSはこちら](https://code.visualstudio.com/shortcuts/keyboard-shortcuts-macos.pdf)
[Linuxはこちら](https://code.visualstudio.com/shortcuts/keyboard-shortcuts-linux.pdf)

## まとめ
VSCodeは色々とカスタムできて、使いやすい機能がありますので、今後も記事にしてみたいと思います。
Sequence Makerで「別のプログラムでのOLEの操作が完了するまで待機します。」というエラーが出た😃

## はじめに
Sequence MakerはExcelから測定器を制御可能にするアドインです。Sequence Makerを使っていると「別のプログラムでのOLEの操作が完了するまで待機します」というエラーメッセージが表示されて、動作が停止していまうことがあります。長期試験中だと悲劇です。今回はこのエラーへの対処法を紹介します（が、正直原因不明なので、根本解決にはならないかもしれません）なお、Sequence Makerについての詳細は以下の記事を参照ください。

https://qiita.com/sequencemaker/items/8e6a370ab0a793a06a3b

:::note warn
***お断り***
本記事の内容はSequence Maker開発元の公式見解ではなく、あくまでも個人が趣味の範囲内で執筆しているものです。記事の内容について開発元へ問い合わせることはお控えください。ご質問・要望などは各記事のコメント欄へお願いいたします。
:::

## エラーメッセージ
「別のプログラムでのOLEの操作が完了するまで待機します。」という内容のメッセージボックスが表示されて、動作が停止します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/b0cc783c-4a1b-d191-ac2c-2a4e1bcb5f47.png)

このメッセージが表示されたら、残念ですが、素直に諦めた方が良いです。データが保存できない場合もありますし、Excelの動作が不安定になったり、強制終了するしかない場合もあります。可能であれば、念のためWindowsごと再起動してしまったほうが良いでしょう。

## どうすれば良いか？
まず試してみて欲しいのは、Excelの設定変更です。
「Excelのオプション」→「詳細設定」→「全般」→「Dynamic Data Exchange(DDE)を使用する他のアプリケーションを無視する」に✅を入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/d2fd1c8b-9706-9cbc-a2dd-47ad8704951b.png)

これで改善するか様子を見ましょう。

## それでもダメなら。。。
- PCをそれなりのスペックのモノに変更してみましょう。目安としては↓ぐらいかなと思います。
    - インテル® Core™ i5 プロセッサー以上
    - メモリ16Gバイト以上（できれば32G以上）
        - 昔からメモリは多ければ多いほど良い、多くて困ることは無い、心が落ち着くと言われています:upside_down:
- Excel以外に起動しているアプリがあれば終了しておきましょう
- Excelで他のアドインがインストールされていれば、無効にしておきましょう
- 常駐アプリなどがあれば終了しておきましょう
- インターネット接続をOFFにして（Wi-Fiなら機内モード）おきましょう
- 動作中はPCで作業しないようにしましょう（Sequence Maker専用PCを用意する）

## まとめ
今回は「別のプログラムでのOLEの操作が完了するまで待機します。」というエラーの対処法を紹介しました。結局根本原因はわからないのですが、何かお気づきの方法があればコメントをお願いします。
Salesforceエンジニアの年収とかできる限りぶっちゃける


こんにちは、ぴえさんです。
クリスマスといえばアドベントカレンダーの時期ですね。

2022年、2023年に続き2024年3回めのSalesforceアドベントカレンダーの投稿です。
常連になったと自称してもいいでしょうか？

https://qiita.com/advent-calendar/2024/salesforce

2024年、ぴえは転職をしましてキャリアとかいろいろ考えたのです。
結局、スキルや経験を最大限に生かして条件の良いところとなったら
Salesforceを扱う仕事になったのですが。

Salesforceエンジニアの年収とか気になってる人いるかなと思うので
できるかぎりぶっちゃけて書こうと思います。

とはいえSalesforceアドベントカレンダーの主旨が

> Salesforce の設定・開発や学習のノウハウなどを投稿する

なので、本当に今更ですが
さぼっていたWinter'25の気になるトピックも取り上げます。（後付け）


ちなみに転職活動についての雑記はこちら↓に書いてます。

https://qiita.com/piepie1231/items/566eafcb78c7146b1bee



# 職務経歴
**※前職までの情報になります。**
　**現職については言及しないのであしからず。**

ざっくりですが
- 新卒～２年目　ソフトウェア開発　PG
- ３～４年目　Salesforce開発　PG
- ５～６年目　Salesforce開発　PM

こんなに綺麗に分けられませんが大体こんなかんじです。
新卒でソフトウェアの会社に入って、そのあと2回転職してどちらもSIerでした。

言語はC#とJavaと、SalesforceなのでApex・VF・LWCが書けます。
DBはOracleとSQL Serverを扱っていた時期もありますが今はもう忘れまくっています。
Gitはそれなりに使ってます。ただしコマンド分からないのでGUIツールでぽちぽち。

PMは数か月～1年くらいの期間の案件をやっていました。規模は最大10人いかないくらいです。
個人的にはガリガリ開発しているほうが好きなのですが、
日本語が堪能？なのでフロントに立つことが多かったです。
プリセとか工数算出とかの作業もこなしてました。今考えるとすごく働いてましたね。

# 年収

**※しつこいですが、前職までの情報になります。**
　**現職はご想像にお任せします。**

具体的な数字は生々しいので割合で、、
- 新卒～２年目　を 100% とすると
- ３～４年目　が 130% 
- ５～６年目　が 180%　

ぐらいです。2回目の転職の後から大幅に上がっています。
５～６年目は役職もついていたのですが、それにしては低いかもしれません。

個人的な感覚としては
- 会社の規模はあんまり関係ない
- 年齢や年数はある程度いくと関係なくなる
- 外資系企業とか行けばもっと上がるかも

です。

SIerやSESの色んな人と話して
めちゃくちゃシゴデキなのに年収めちゃ低い人も見たことありますし
めちゃくちゃな仕事のやり方なのに年収めちゃ高い人も見たことあります

**正味、スキルよりもどこの会社に属するかで年収は決まる。**

なので転職して待遇上げるのはすごく賛成です。

とはいえ、スキルや実績がないとどこかでボロが出るので
誇張してアピールするのはほどほどにしましょう。

# Winter'25リリースノート気になるまとめ

こちらが本題です（あてつけ）

### [リアルタイムプレビューでの Lightning Web コンポーネント開発の高速化 (ベータ)](https://help.salesforce.com/s/articleView?id=release-notes.rn_lwc_local_dev.htm&release=252&type=5)

Local Devというのを使うとローカルでのLWCの更新がブラウザに自動適用されるらしい。
デプロイして画面を手動更新するのが地味に時間かかるのでありがたい機能強化だと思います。
Spring’25からはLightning Experience アプリ (デスクトップおよび Salesforce モバイル アプリ)も対象ということです。

### [Apex コードの実行で発生する予期せぬ例外の対象範囲の拡大](https://help.salesforce.com/s/articleView?id=release-notes.rn_apex_exceptions_morecoverage.htm&release=252&type=5)

`@AuraEnabled` `@RestResource` `@InvocableAction`での例外がイベントログに残るようになりました。ありがたいですね！


### [送信者検証のための返信先メールアドレスの検証 (リリース更新)](https://help.salesforce.com/s/articleView?id=release-notes.rn_general_verify_your_return_email_address_for_senders.htm&release=252&type=5)
ユーザーに結構影響のある変更が出ていました。
各ユーザーに確認メールが届くから、リンク踏んでメールアドレスを検証をしてってことらしいです。

もうすぐSpring’25も出ますね、次はさぼらないようにします。
これまでのまとめはこちら↓にまとめてます。

https://qiita.com/piepie1231/items/4c368e41a89a45766b96

# さいごに
今年の転職活動中にゲーム会社とかメディア会社とか
Salesforce扱わない開発系も検討したんですよね
実際1社受けましたが落ちました。笑

なのでまだしばらくSalesforceエンジニアとしてやってくと思います。
資格はもう取らない予定ですが、技術記事は今後もぼちぼち書いてくので
今後もよろしくお願いします。

それでは皆さん、メリクリ＆よいお年を('・ω・)
shadcn/uiのSidebarで発生するDialogContentエラーの解決方法

# はじめに
shadcn/uiの公式ドキュメントの[Sidebarテンプレート](https://ui.shadcn.com/docs/components/sidebar)を使用した際に、モバイル画面でサイドバーを開くトリガーを押すと、以下のエラーが発生しました。
```console
`DialogContent` requires a `DialogTitle` for the component to be accessible for screen reader users.

If you want to hide the `DialogTitle`, you can wrap it with our VisuallyHidden component.

For more information, see https://radix-ui.com/primitives/docs/components/dialog
```
この記事では、このエラーの原因と解決方法について説明します。

# エラー原因
エラー内容から、DialogContentにおいて、アクセシビリティを確保するためにDialogTitleが必要であることがわかりました。

# 解決方法
shadcn/uiの公式リポジトリの[issue #430](https://github.com/shadcn-ui/ui/issues/4302)で一時的に解消する方法を見つけている方がいました。

SheetTitle(またはDialogTitle)を一時的に利用し、それを隠すことで問題を解決できました。


# 修正したコード
修正箇所:components/ui/sidebar.tsx(201行目あたり)
- 修正前
    ```ts
    if (isMobile) {
      return (
        <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>
          <SheetContent
            data-sidebar="sidebar"
            data-mobile="true"
            className="w-[--sidebar-width] bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden"
            style={
              {
                "--sidebar-width": SIDEBAR_WIDTH_MOBILE,
              } as React.CSSProperties
            }
            side={side}
          >
            <div className="flex h-full w-full flex-col">{children}</div>
          </SheetContent>
        </Sheet>
      );
    }
    ```
 - 修正後
    ```ts
    if (isMobile) {
      return (
        <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>
        // コードを追加する
        <SheetTitle className="hidden"></SheetTitle>
          <SheetContent
            data-sidebar="sidebar"
            data-mobile="true"
            className="w-[--sidebar-width] bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden"
            style={
              {
                "--sidebar-width": SIDEBAR_WIDTH_MOBILE,
              } as React.CSSProperties
            }
            side={side}
          >
            <div className="flex h-full w-full flex-col">{children}</div>
          </SheetContent>
        </Sheet>
      );
    }
    ```
# さいごに
一時的な措置ですが、エラーが解消できてよかったです！誰かの助けになると幸いです！