OmniAICreator/Qiita-1.07M huggingface dataset:
【ML初心者アドベントカレンダー】SageMakerのセキュリティとコンプライアンスについて


# この記事の目的

SageMakerを使用するにあたってのセキュリティと使用上のコンプライアンスについて学ぶ

 
# SageMaker Role Manager

SageMaker特有のセキュリティツールのひとつ。
事前に用視された三つのペルソナベースに基づいて最適なアクセス権限を設定してくれるサービス。

https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/role-manager.html

用意されているペルソナについては以下の通り。

 * データサイエンティストペルソナ
   * SageMaker で一般的な機械学習の開発と実験を実行する権限
 * MLOps ペルソナ
   * モデルの運用に必要な権限
 * SageMaker コンピューティングペルソナ
   * 必要な権限を追加できる

https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/role-manager-personas.html

実装方法は下記が参考になりました。

https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/role-manager-tutorial.html


# SageMaker のコンプライアンス

コンプライアンスに準拠するためのサービスを簡単にまとめます。

https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/sagemaker-compliance.html


## AWS Config

リソースの構成を記録して、継続的に評価、モニタリングを行うサービス。
現在の設定がガイドラインや規制にどの程度準拠しているかを評価できる。

https://aws.amazon.com/jp/config/

## AWS Security Hub

AWSアカウント全体のセキュリティを評価できる。また、セキュリティに関するアラートを一元化することができる。

https://aws.amazon.com/jp/security-hub/

## Amazon GuardDuty

AWS上の疑わしいアクティビティを検知、通知することができる。

https://aws.amazon.com/jp/guardduty/
舞台演劇とゲームプログラミングが似ていると感じた話

こちらは女性エンジニア応援！エンジニアとしてやりがいを感じた経験談をシェアしよう！ by パナソニック コネクト Advent Calendar 2024 の13日目の記事になります
https://qiita.com/advent-calendar/2024/panasonic_connect
 
 私は、役者とプログラマーという一見かけ離れた仕事をしています。そんな私が、舞台演劇とゲームプログラミングの共通点を発見したので、今日はそれを皆さんにお伝えしたいと思います。
 
　数ヶ月前のことです。ゲームアプリの大型アップデート開発を担当することになりました。プログラミング歴10ヶ月の新米である私にとっては、大きな挑戦です。「やります！」と元気よく返事をしたものの、心の中は不安でいっぱいでした。Unityを本格的に触れるのも初めてで、ましてや一人で大きな開発を任されることなど想像もしていなかったからです。
 「プロジェクトを止めるわけにはいかない」「任された期待に応えたい」「楽しんでもらえるアプリを作りたい」。そんな思いを胸に、激動の日々が始まりました。
　ある程度見通せるタスクもありますが、実現方法すらわからないものに直面すると答えに窮してしまいます。正直に「分かりません」と答えるのも相手を困らせるだけ。かといって、楽観的に期限を伝えてしまうと後で迷惑をかけるかもしれない。締切が迫る中、とにかく必死でパソコンに向かう毎日が続きました。

　そうしているとやがて心身ともに疲弊し、プロジェクトの終了間際にはぼろぼろの状態になっていた気がします。

　ついに社内リリースを迎えました。みんなの顔を見たいような見たくないような、ソワソワドキドキ落ち着かない気持ち。手を握りしめながら椅子に座っていました。するとすぐに「すごーい！」との声が聞こえました。顔を向けるとキラキラした表情で端末を操作している姿が。その心からの言葉がどれだけ私の心を癒やしてくれたか。
 その瞬間、「この感覚、知っている！」と気付きました。舞台でお客様から拍手をいただいた時や、楽しんでいる様子を間近で見た時と同じ気持ちだったのです。どんなに苦しいことがあっても、一瞬で報われたような気持ちになり、幸せに満たされる。この瞬間こそが、私にとってかけがえのない宝物なのだと実感しました。

　未知の世界に飛び込み、がむしゃらに突き進んだ数ヶ月間。自信のなさからできないことばかりに目を向け、本質を見失いそうになることもありました。それでも、こんな私でも、人を喜ばせるものを作れるのだと知ることができました。リリースを無事に終えた今、胸がいっぱいです。
 この経験を通じて、多くの人の支えがあったことを痛感しました。先輩方、手伝ってくれた大学生プログラマーさん、プロジェクトを共に進めたマーケターやデザイナーの皆さん、機会を与えてくれた代表、そして見守ってくれた家族。この場を借りて心から感謝申し上げます。本当にありがとうございました。

 もしもう一度、今の状態でこのプロジェクトに携われたら。段取りを組んで、ペース配分をしながらもっと効率よくできたのに。しかし、この経験を胸に、次のステップへ進む準備ができたと思っています。これからも役者として、プログラマーとして精進し、ユーザーさんの笑顔を思い浮かべながら、喜んでもらえるものをたくさん生み出していきたいと思います。
【個人開発】お店の混雑度を取得しようとしたら挫折した話

:::note warn
本記事は私の主観や推測を多分に含むのでご注意ください。
:::

少し強がると正直まだ挫折はしていません。いや折れても立ち直ったので挫折ではないです:flushed:笑


## 背景
そもそもなぜ「**お店の混雑度を取得しようとした**」のかですが、発端はNext.jsについて学習したいなという点でした。

![FireShot Capture 153 - スタバマップ - starbacks-bukrpzrc2-sakus-projects-f0f85947.vercel.app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624902/15f1fede-d403-bdfe-dcd5-8eb66ca68383.png)
<sub>制作挫折中のスタバマップ（現在の混雑度はモックデータで静的表示）</sub>

その過程でできれば自分が制作したいものだとモチベーションを安定させられると考え、「スタバマップ」なるものを作成しようとしました。私は常日頃カフェで作業する方が捗り、かなり使用させていただいてますが、どの店舗が空いているか一目でわかった方が良いなと思っていたからです。

![スクリーンショット 2024-12-25 13.11.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624902/e9f4eca4-23c0-b795-ba38-50d95d27c3af.png)
<sub>Google　Mapの棒グラフ（画像左）</sub>

GoogleさんのGoogle Mapはかなり高性能で文句などほぼないのですが、混雑度機能（あの棒グラフ）だけは個人的にそこまで精度が高くないと思っていて、そこに差別化要素を見出しました。

ただ地図を見たいだけならばGoogle MapやApple純正の地図アプリで事足りますし、あの2つの精度は正直群を抜いていると思います。毎日Google Mapを見ているユーザーとしてとてもよくわかっています。

これが混雑度を差別化ポイントとして地図アプリを作成しようとした経緯です。

## お店の混雑度を取得する方法
正直当初はNext.jsを学習するという大義名分がモチベの大部分を占めていたので、地図アプリ作成の難しさや混雑度をどのように取得するかは深く考えていませんでした。

なんなら「**Google Mapのあの棒グラフデータAPIで取得できるだろ**」くらいに思ってました。
こうして見事に路頭に迷う子羊の完成です。笑

### 実際に詰まったところ
実際に当時、混雑度を取得する方法をかき集め以下を検討しましたが、見事に動けなくなりました。

1. そのお店の社長になって店内にカメラを設置する
2. そのお店に交渉しデータをもらう
3. 自分で店舗に張り込んでデータを取り、計算する
4. Bluetoothや赤外線関係を操作する
5. Web上に転がってるものをかき集める
    - SNSのAPIで情報を入手
    - GoogleなどのAPIで情報を入手
6. 最初は混雑度機能を実装せず、ユーザーの回答が溜まってきたら表示されるようにする

最初は5の「GoogleなどのAPIで情報を入手」で実装できると思っていましたが、実際に公式で公開はされていませんでした。もしされていたら教えて欲しいですが、自分が調べた限りは無かったと思います。

その他、1の社長になることも考えましたが、流石にスタバの社長になるのは時間がかかりそうだなと思い、3や6を検討しました。（すみません冗談です。）
しかし、3は膨大な時間と費用がかかりますし、6は割と様々なアプリが取り組んでいて差別化しづらいなと感じました。こうして八方塞がり太郎の出来上がりです。

地図アプリ作る際は最初の構想段階で必要なコンテンツデータの取得経路を検討することがとても重要だと思いました。

## 学び
行動データって企業にとって、とても重要なものではないかと思いました。

無論、個人情報であるが故に開示されていない可能性も大いにありますが、行動データは他のビジネスに流用することが可能だと思っています。その為、膨大な行動データが蓄積されているGoogleやAmazon、国内で言えば楽天やNTTなどはその他のデータを持ち得ない企業に対し優位だと思います。

想像していただくと明らかだと思いますが、何か新規事業を始めたときも行動データの蓄積がある企業は**膨大なデータを元に大規模なマーケティング施作を実施できる**ので、必然と利益を得やすそうな気がします。

また、昨今でいうと生成AIがより真価を発揮するのは、良質で膨大なデータがある場合だと思うので、その観点からも優位だと感じます。

最後学びと言いながらかなり主観語りをしてしまいましたが、本記事を読んでいただきありがとうございました！
AWS Machine Learning Engineer Associate 対策：SageMaker Clarify

# SageMaker Clarifyとは

SageMaker Clarify は、以下のような目的で特化したツールです：

**<font color="MediumBlue">モデルの公平性評価：</font>**
- トレーニングデータやモデルの予測結果におけるバイアスを検出します。

**<font color="MediumBlue">説明可能性の提供：</font>**
- モデルがどのように予測を行ったかを解釈可能な形式で提供します。


SageMaker Clarify は、モデルの予測における各特徴量の影響度（特徴量属性）を評価し、時間の経過とともにその影響度が変化していないかをモニタリングする機能を提供します。

これにより、モデルが予測を行う際の判断基準が一貫しているかを確認し、特徴量属性のドリフトを検出することが可能です。


### モデルバイアスの検出

SageMaker Clarify では、モデルバイアスをモニタリングするために、**<font color="MediumVioletRed">特定の属性（「性別」「人種」...）に関する分析</font>** を行います。

分析したい属性やグループを Clarify の設定で指定し、それをもとにモデルの予測結果に偏りが存在するかどうかを検出します。

このプロセスでは、評価する属性や条件が重要な要素となります。

:::note info
特に医療のようなセンシティブな分野で重要です。例えば、患者の年齢、性別、地域などの属性に基づいてモデルが異なる予測を行い、意図しない差別が発生する可能性を検出できます。
:::

## **<font color="MediumBlue">部分依存プロット (PDP)</font>**

PDPは、**<font color="MediumVioletRed">特定の特徴量がモデルの予測に与える影響を可視化</font>** する手法です。

具体的には、選択した特徴量の値が変化したときに、他の特徴量の影響を一定に保ったまま予測結果がどのように変動するかを示します。

これにより、特徴量と予測結果の関係性を視覚的に理解でき、モデルの解釈可能性を高めることができます。

したがって、SageMaker Clarifyで特徴量の影響を可視化したい場合、PDPが適しています。

## **<font color="MediumBlue">SHAP</font>**

SHAPは、**<font color="MediumVioletRed">各特徴量がモデルの予測に与える影響を定量化</font>** する手法であり、モデルがどの特徴量に基づいて予測を行っているかを可視化します。

特徴量の影響度が時間とともに変化した場合、それは **<font color="MediumBlue">「特徴量属性ドリフト」</font>** として検知されます。

このようにSHAPを活用することで、どの特徴量の影響が変化しているかを詳細に理解し、必要に応じてモデルの再訓練や特徴量の再検討を行うことができます。

## SageMaker Model Monitorとの統合

SageMaker Model Monitor と統合することで、時間の経過に伴うデータや予測の分布の変化（バイアスドリフト）を監視することが可能です。

**監視効果：**
- **<font color="Darkcyan">モデルのバイアスドリフト</font>**

## SageMaker Studio内でのビジュアル化

SageMaker Clarifyでは、バイアスや解釈可能性に関するレポートを生成し、SageMaker Studio内でビジュアル化された形で確認することができます。

これにより、モデルの予測結果におけるバイアスの有無や影響度の高い特徴量を直感的に把握することができ、モデルの公平性や解釈可能性の向上に役立てることが可能です。

Studioを使うことで、データサイエンティストは **<font color="MediumVioletRed">視覚的</font>** にレポートを分析しやすくなります。
MCP as a Language：Roo-Clineによる新しいMCP開発手法の提案

## はじめに
Model Context Protocol (MCP)は、アプリケーションがLLMにコンテキストを提供する方法を標準化するオープンプロトコルです。本記事では、MCPの開発に新しいアプローチ「MCP as a Language」を提案します。

## MCPとは
MCPは「AIアプリケーション用のUSB-Cポート」と例えられます。USB-Cがデバイスと周辺機器を標準化された方法で接続するように、MCPはAIモデルと様々なデータソースやツールを標準化された方法で接続します。

## MCP as a Languageの概念

### 定義

MCP as a Language（MaaL）は、自然言語による指示書からMCPサーバーを自動実装する新しい開発手法です。

### 主要な特徴

1. **指令書ベースの開発**
```bash
# 指令書の基本構造
- 環境設定
- リポジトリ設定
- 開発要件
- APIドキュメント
```

2. **自動化されたMCPサーバー生成**
- TypeScriptコードの自動生成
- APIクライアントの実装
- 環境変数の設定
- Gitリポジトリの管理

### 利点

1. **開発の効率化**
   - 指令書による要件の明確化
   - コードの自動生成
   - 設定の自動化

2. **標準化**
   - 一貫した実装パターン
   - 再利用可能なテンプレート
   - ドキュメントの自動生成

3. **品質保証**
   - 型安全性の確保
   - エラーハンドリングの標準化
   - テストの自動化

## 実装例：Ideogram MCP Server

https://hamaruki.com/mcp-as-a-language-experiment/

### 指令書の構造
```bash
# 🛠️ 環境設定
- GitHub CLI設定
- リポジトリ設定

# 開発要件
1. リポジトリ名: ideagram-mcp-server
2. タスク管理：GitHub Issues
3. API実装：Ideogram API
4. 環境変数：IDEOGRAM_API_KEY
```

### 自動生成されるコンポーネント

1. **APIクライアント**
```typescript
class IdeogramClient {
    constructor(private apiKey: string) {}
    async generateImage(prompt: string) {
        // API実装
    }
}
```

2. **MCPツール定義**
```typescript
const generateImageTool = {
    name: 'generate_image',
    description: '画像生成ツール',
    parameters: {
        prompt: { type: 'string' }
    }
}
```

## MCP as a Languageの開発フロー

1. **指令書の作成**
   - 要件の定義
   - API仕様の記述
   - 環境設定の指定

2. **自動実装**
   - Roo-Clineによるコード生成
   - 設定ファイルの生成
   - ドキュメントの生成

3. **レビューと調整**
   - 生成されたコードの確認
   - 必要に応じた微調整
   - テストの実行


## 今後の展望

1. **テンプレートライブラリ**
   - 共通パターンの蓄積
   - ベストプラクティスの共有
   - 再利用可能なコンポーネント

2. **開発ツールの拡充**
   - より高度な自動化
   - より詳細なカスタマイズオプション
   - より強力なデバッグ機能

## まとめ

MCP as a Languageは、MCPサーバーの開発を大幅に効率化する新しいアプローチを提供します。Roo-Clineとの組み合わせにより、開発者は複雑なMCPサーバーを簡単に実装できるようになります。

## 参考リンク
- [MCPドキュメント](https://modelcontextprotocol.github.io/)
- [Roo-Cline GitHub](https://github.com/RooVetGit/Roo-Cline)
インシデント・デグレードに対する避難訓練、実施していますか？

# はじめに

開発者であれば誰しも、予期しないトラブルに直面する日が来ます。
開発フローを通し、出荷までに然るべきフローで評価されたものであっても、思わぬデグレード（不具合）が発生してしまう可能性があります。
デグレードを防ぐ工夫をするのはもちろんですが、もし仮にこの記事を読んでいる今、重大不具合が検知されたら、インシデントトラブルが発生したら、あなたのチームでは速やかにミスなく対応することができるでしょうか？

本記事は、先日デグレードが顧客先で検知された際、チームで備えられていなかったために、多くの対応を一人で実施することになった経験から、チームおよび部署に対して「避難訓練」という内容で勉強会を開催したので、その内容を記載しています。

# インシデントとデグレード

## インシデント発生時のフロー

弊社では顧客が製品を利用している中で発生した、緊急対応を求められる事象のことをインシデントと呼びます。

インシデントが発生した際、コンサルタントから連絡を受け、開発部署で体制構築をします。

体制構築後は、可及的速やかに事象を解消する必要があります。

## インシデントにおいて大切なスキル

私はインシデントにおいては以下の2つが大切だと考えています。

- トラブルを一時的でも解消できるアイデアの引き出し
- 相談に乗ってもらえる同僚を捕まえられること

日頃の顧客問い合わせ対応では、時間がかかったとしても、根本原因の解明が必要ですが、インシデントにおいては原因解明よりも、まずはその場を何とか打開する力が必要です。
問い合わせ対応を常に実施しているチームでは、いつもとは初動が変わるというのが若手のうちは難しい点かと思います。

インシデントは特性上、スピードが肝心です。
判断に迷う場合、広く知見を集めたい場合もあります。
その際、相談できる相手を素早く捕まえるには、日頃から多くの人と繋がりを持っている必要があります。
まだ多くの人と関わっていないメンバーがインシデントを受けた場合は、チームとしてサポートできるように、ルールなどを決めておくと良いと思います。

## デグレード発生時のフロー

デグレードが見つかった際、弊社では緊急不具合報告（Emergency）を行います。
報告とともに、不具合が発生する可能性を持つユーザーの抽出や今後の対応を決めます。

Emergencyは全コンサルタントに周知され、原則顧客にも周知されます。
すなわち、発生条件や不具合の内容の記載には丁寧さが要求されます。

今後の対応としては、出荷物の再リリースや顧客ごとの暫定物出荷などがあります。
どの方法を選択するかは、影響の大きさなどから判断します。

## デグレード発生時に必要なスキル

デグレードにおいては、以下の3つが大切と考えています。

- そもそもデグレードであることを判断する力
- 速やかに事象をまとめ報告できること
- 対応方針を決定できること

デグレードはいきなりデグレードとして報告されるわけではないため、エラー発生などの事象から、デグレードであるかどうかを判断する力が必要です。
新しいバージョンを適用直後に発生しているなど、報告されている内容を読み取ったり、書かれていなければヒアリングする必要があります。

デグレードが分かった場合、その内容を速やかかつ丁寧にテキストでまとめる力も必要です。
顧客にも周知されるため、確実な内容にし、明瞭な文書にする必要があります。
日頃の不具合修正時の説明においても身につけられる力ですが、意識しているのとそうでないのでは力の差が生まれると思います。

対応方針については、まずそもそもどのような対応が取れるのかを知っている必要があります。
これについては、経験がない場合、いきなり判断を求められても右も左も分からない状態になるかと思います。

# 避難訓練をしよう

インシデントやデグレード発生時の行動は、いずれも迅速かつ丁寧に様々なタスクを短期間で遂行する必要があります。

一部のスキルは日頃でも鍛えることができますが、「この力が必要になる場合」を意識して仕事をしているかしていないかで、身につき方が変わります。

また、日頃では鍛えることのできない、対応全般に対する知識も必要です。
それらに対し、事前にチームで知識共有を行い、どう行動するか備えることが大切です。

今いる周りのメンバーが経験者ばかりであっても、その経験が最新のフローやルールに沿ったものではないかもしれません。

新しく入ってきたメンバーは、備えずにその場が来てしまうと、慌てている先輩たちを横目にどう動いていいか声をかけづらい状況になってしまうかもしれません。

自然災害が防げないのと同じように、開発者にとってインシデントやデグレードはどれだけ頑張っても100%防げるものではありません。
起きてしまうかもしれない事象に対し、起きたらどうするか？を定期的に見直し、備えてみても良いのではないでしょうか。

# まとめ

IT業界におけるインシデントに対する避難訓練は、単なる形式的なものではなく、実際に役立つ「備え」として重要です。
サイバー攻撃やシステム障害など、多様なリスクに備えるため、定期的な訓練を実施し、改善を重ねることが、開発者の安全を守ることに繋がると考えます。

まだ避難訓練を実施していないチームは、ぜひその重要性を再認識し、早急に計画を立てて実行に移すことをお勧めします。
その position: fixed、画面基準にならずお困りですか？

# 概要
Web 制作において、レイアウト設計は非常に重要な要素です。
`position` の設定や `z-index` の設定や管理など、仕様を理解してしまえば問題ないものの、思いもしなかった挙動で想定以上に時間を取られてしまうことがあります。

さて、この記事に辿り着いている人はひょっとしたら `position: fixed;` が画面基準で配置されず、absolute のような配置になってしまってお困りなのではないでしょうか？
実は意外と知られていない `position: fixed;` の仕様があり、要素配置の基準位置が画面基準とならないケースがあります。
本記事ではこの挙動に焦点を当て、なぜそれがウインドウに固定されない場合があるのかを確認していきます。

# position: fixed による配置の仕様

[包含ブロックの識別](https://developer.mozilla.org/ja/docs/Web/CSS/Containing_block#%E5%8C%85%E5%90%AB%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%AE%E8%AD%98%E5%88%A5)

まず MDN の仕様を確認していきましょう。
包含ブロックのセクション、3 の項目を確認します。

> position プロパティが fixed の場合、包含ブロックはビューポート (連続的なメディアの場合) またはページ領域 (ページメディアの場合) によって確立されます。

おそらくこちらは fixed を使用する上でおおむね想定されている挙動かと思いますが、続けて 4 の項目を。

> position プロパティが absolute または fixed の場合、包含ブロックは以下の条件を持った直近の祖先要素におけるパディングボックスの辺によって構成されることがあります。
> 1. transform または perspective の値が none 以外である
> 2. will-change の値が transform または perspective である
> 3. filter の値が none 以外、または will-change の値が filter の場合 (Firefox のみで動作)
> 4. contain の値が paint の場合 (例 contain: paint;)

`position: fixed;` が想定されている箇所に配置されない場合、fixed を指定している親要素に上記の CSS プロパティを持つものが設定されている可能性が高そうです。
「されることがあります」なのでこの動作にならないパターンもありそうなので、実際の動作を確認していきます。

# 動作確認

CodePen で実際に 4 つのプロパティを親要素に指定して確認します。

<p class="codepen" data-height="400" data-default-tab="html,result" data-slug-hash="GgKEBja"</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

上記で確認した限りでは、どのパターンでもビューポート基準でない配置となっていそうです。
MDN の仕様通りの挙動ですね。

# 解決策

実装のされているケースにもよるかと思いますが、大きく二つ解決策が考えられるかと思います。

1. 親要素に指定している該当のプロパティを除去、または可能であれば別のプロパティや他の実装方法に置き換える（`drop-shadow` → `box-shadow` への置き換えなど）
2. fixed に指定している要素の HTML 上の配置を変更する（HTML 側を該当するプロパティの外に出す）

# 結論
包含ブロックと fixed の仕様を確認することで、ビューポートに固定されない fixed の配置が仕様通りであることを確認できました。原因が特定できたことで、上記のもの以外の解決方法を検討できるケースもありそうです。
本記事が同じようにお困りの方の解決の一助となれば嬉しく思います。
メリークリスマス！🎄
Roo-Clineで「MCP as a Language」開発実験レポート 🚀


## はじめに

この記事では、Roo-Clineを使用してModel Context Protocol (MCP)サーバーを自然言語の指示書から実装する実験について詳しく解説します。Ideogram APIを活用した画像生成MCPサーバーの開発プロセスを追跡し、AIによる自動化の可能性と課題を探ります。

<blockquote class="twitter-tweet" data-media-max-width="800"><p lang="ja" dir="ltr">MCP as a language 実験①<br>IdegramのAPIのMCPサーバーを MaL で作ってみた<br>入れたドキュメントが悪かったの原因で最後まではフルオートでいけなかったが、結構いい線言ってる気がする！ <a href="https://t.co/WNmlEfDvyK">pic.twitter.com/WNmlEfDvyK</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1871188403255119964?ref_src=twsrc%5Etfw">December 23, 2024</a></blockquote> 

## 実験概要

### 目的
- 自然言語による指示書からMCPサーバーの自動実装
- Roo-Clineの自動コード生成能力の検証
- GitHub統合とイシュー管理の自動化評価

### 使用技術
- Roo-Cline（AIコーディング支援ツール）
- TypeScript
- Ideogram API（画像生成API）
- GitHub CLI

## 指示書の構造分析

指示書は以下の主要セクションで構成されています：

https://github.com/Sunwood-ai-labs/MysticLibrary/blob/main/prompts/coding/Roo-cline/MCP-as-a-Language-01.md

### 🛠️ 環境設定
```markdown
- GitHub CLI設定（ghコマンド認証済み）
- リポジトリ設定
  - mainブランチをベース
  - developブランチでの開発
```

### 主要タスク
1. `ideagram-mcp-server`リポジトリの作成
2. タスクの洗い出しとイシュー登録
3. Ideogram API統合によるMCPサーバー実装
4. 環境変数（IDEOGRAM_API_KEY）の設定

## Roo-Clineの実行プロセス

### 1. プロジェクト初期化とパッケージインストール
```bash
cd C:\Prj\MCP\ideagram-mcp-server
npm install
npm install axios
```

### 2. TypeScript実装
Roo-Clineは以下の主要コンポーネントを自動生成：

- IdeogramClientクラス（API通信用）
- 画像生成ツール実装
- 型定義とインターフェース

### 3. 環境変数設定
```typescript
const apiKey = process.env.IDEOGRAM_API_KEY;
if (!apiKey) {
    throw new Error('IDEOGRAM_API_KEY is required');
}
```

### 4. Gitリポジトリ初期化と公開
```bash
git init
git add .
git commit -m "🎉 feat #1: プロジェクトの初期設定"
git branch -M main
git remote add origin https://github.com/Sunwood-ai-labs/ideagram-mcp-server.git
git push -u origin main
```

### 5. MCPサーバー設定
```json
{
    "name": "ideagram-mcp-server",
    "command": "node dist/index.js",
    "cwd": "C:\\Prj\\MCP\\ideagram-mcp-server",
    "env": {
        "IDEOGRAM_API_KEY": ""
    },
    "disabled": false,
    "alwaysAllow": []
}
```

## 実装の成果

### 完了したタスク ✅
1. リポジトリ作成とGitHub連携
2. MCPサーバーの基本構造実装
3. Ideogram APIクライアント実装
4. 画像生成ツール実装
5. ドキュメント作成
6. MCP設定完了

### 未完了タスク ❌
1. developブランチでの開発フロー
2. 一部の高度な機能実装

## 考察と発見

### Roo-Clineの強み
1. **自動コード生成能力**
   - TypeScriptの型安全な実装
   - APIクライアントの適切な構造化

2. **エラーハンドリング**
   - 型エラーの自動検出と修正
   - 環境設定の検証

3. **ドキュメント生成**
   - READMEの自動作成
   - 使用方法の明確な説明

### 改善点
1. **ブランチ戦略**
   - develop/mainブランチの運用が未実装
   - より複雑なGit操作の対応

2. **イシュー管理**
   - イシューの自動作成機能の強化
   - タスク分割の最適化

## まとめ

本実験では、Roo-Clineを使用した「MCP as a Language」開発の可能性を検証しました。9割程度の実装を自動化できた一方で、より複雑なGit操作やブランチ戦略の実装には課題が残りました。

### 主な成果
- 自然言語からの自動コード生成
- APIクライアントの適切な実装
- 基本的なGitHub操作の自動化

### 今後の展望
- ブランチ戦略の改善
- イシュー管理の強化
- より複雑なMCP機能の実装

## 参考リンク
- [Roo-Cline GitHub](https://github.com/RooVetGit/Roo-Cline)
- [Ideogram API Documentation](https://api.ideogram.ai/generate)
- [プロジェクトリポジトリ](https://github.com/Sunwood-ai-labs/ideagram-mcp-server)

<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
【ANS-C01】ANS合格体験記

## はじめに
先日AWS Certified Advanced Networking - Specialtyを受検し、合格しました。

## 受検時の状態
- 入社3年
- 業務でAWSを触る環境だが、ネットワーク系は全く触らない
- AWS CLF, SAA, SOA, DVA, SCS, MLS取得済み

## 勉強期間
2か月

## 勉強時間

平日：就業後0.5~1時間 休日：直前の日曜日に4時間

## 使ったもの
:::note
AWS Certified Advanced Networking - Specialty Official Practice Question Set (ANS-C01 - Japanese)
:::

:::note
[AWS認定高度なネットワーク - 専門知識（ANS-C01）完全対応テキスト](https://amzn.asia/d/bzIpLGQ)
:::
:::note
[Cloud Licence](https://cloud-license.com/)
:::
:::note
AWS Black Belt Route 53, Direct Connect, Site to Site VPN 
:::

<iframe width="560" height="315" src="https://www.youtube.com/embed/Yi-e5O_jd6o?si=1tttL3RSR8dChrj3" 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>

<iframe width="560" height="315" src="https://www.youtube.com/embed/mEtluVrgXlk?si=48xyzwYfNJtAYMjd" 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>

<iframe width="560" height="315" src="https://www.youtube.com/embed/RxiARNnP3nM?si=AmYyllMBwXBq09pf" 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>



- ネットワーク系のサービスを普段触ることが無いので、まずは本やBlack Beltで、サービスの特徴やユースケースを学びました。
- そこから問題演習に入りました。一日10~20問を目安に問題を解いて、分からないところを調べて、自作のノートに書きこんでいきました。そのノートを寝る前や朝に見て暗記しました。
- 平日は1問でもいいから必ず問題を解くことを意識し、勉強を継続しました。ANSは問題文が長いので、それに慣れる意味でも継続してよかったなと思いました。
- Cloud Licenceは、2~3周したら、本試験モードで10問くらい解く→間違えたものをお気に入りにいれる→お気に入りを解くを繰り返し、苦手分野の対策に努めました。


## 本番のスケジュール
9:30 会場着　本人確認や写真撮影を済ませる　
テスト前の受付は30分前からとのことで、10時予約で9時半から受付し始めしました

9:45-12:45ごろ　受検

20:16にバッジ認定メール
20:21にスコアレポートのメールが来ました。（結果：767点）

## どうすれば高得点を狙えたか
今回ギリギリの合格だったので、実際受けてみてどうしたら高得点を狙えたか反省点を2つ書いていきます。

- 試験分野の中で第4分野：ネットワークセキュリティ、コンプライアンス、ガバナンスについて、「改善が必要」となっていました。AWS Network Firewallや、暗号化、証明書管理について、理解が浅かったかなと思うので、その辺を対策できると良かったなと思いました。

https://d1.awsstatic.com/ja_JP/training-and-certification/docs-advnetworking-spec/AWS-Certified-Advanced-Networking-Specialty_Exam-Guide.pdf

- 180分でギリギリ解ききったので、65問を解く練習をやれたらよかったと思いました。

当日受けてて本当に難しいなと思ったので、次受検する時は、他のAWS試験の2割増しくらいで対策したいと思います。

## おわりに

受検中は、「絶対落ちた...700点くらいだろうな...」と思っていたので、なんとか合格できて嬉しかったです😊
今後も資格取得と実務を通じて、スキル向上に励んでいきたいと思います。

以上です。ありがとうございました。
転職して1ヶ月、『世界一流エンジニアの思考法』に支えられた話

この記事は [株式会社うるる（ULURU）Advent Calendar 2024](https://qiita.com/advent-calendar/2024/uluru) の25日目の記事です。

## はじめに
2024年11月に株式会社うるるに入社し、[fondesk](https://www.fondesk.jp/)の開発をしている中谷です。
早いもので、入社から約1ヶ月が過ぎました。

この記事では、最近改めて読んだ『[世界一流エンジニアの思考法](https://books.bunshun.jp/ud/book/num/9784163917689)』（牛尾 剛、文藝春秋、2023年）から得た学びと共に、うるるに入社してからの約1ヶ月を簡単に振り返ります。
就職や転職、学習、日々の開発など、あらゆる場面で参考になる書籍だと思うので、興味がある方はぜひ読んでみてください。

なお、今回は本書の中から下記の思考法をピックアップしています。
- 頭の中にメンタルモデルをつくる
- 感覚で判断せずファクトを積み重ねる
- 不確実性を受け入れる
- どんなに頭がいい人でも理解には時間がかかるもの

![sekaiichiryuuennzinianoshikouhou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737380/e895698e-a4c6-df1d-8e56-e44bf7398984.png)
> 出典: https://books.bunshun.jp/ud/book/num/9784163917689

## 「頭の中にメンタルモデルをつくる」を意識して技術のキャッチアップをしてみた
著者と同僚との間で、こんなやりとりがあったそうです。

> 「どうしてそんなに多くのことを把握できるのか？」と尋ねたら、「メンタルモデルをつくるとそれができるようになる」と教えてくれた。

前後の文脈は省略しますが、要するに、頭の中で素早く情報処理を行うためには何らかの脳内イメージを持っていることが大事なのだそう。確かに、知見のない技術のキャッチアップを行う際も、内部のアーキテクチャやクラス構造、API仕様など、ドキュメントのテキストを追いかけるだけではなかなか理解できないと感じることがあります。

自分は現在、fondeskで採用されている技術への理解を深めるため[Twilio](https://www.twilio.com/)というサービスのキャッチアップを行っています。Twilioを利用することで、例としてブラウザ上で通話機能を実装できます。

以下は、Twilio Voice JavaScript SDKを用いた通話接続の処理フローを示した図です。通話開始から接続完了までの具体的な手順を視覚的に理解できます。

![twilio-sdk-image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737380/651dfa92-da33-f7ea-381b-b1468b2ca68d.png)
> 出典: https://www.twilio.com/docs/voice/sdks/javascript

自分の場合は、このようにドキュメントで図が提供されている場合でも、敢えて自分なりの図を紙に書き出してみるということをしています。アナログですし殴り書きなので体裁は悪いですが、メモや補足を加えながら手を動かす方が理解につながる気がしています。

方法論はともかく、自分なりのメンタルモデルを作ってみると、複雑に感じていたドキュメントもそれまでより読み進められるようになりました。比較的参考情報が少ない技術や、複雑化した関連性を整理するときなどに有効かも知れません。

## 「感覚で判断せずファクトを積み重ねる」ができていなかった
本書では、著者自身の体験に基づき下記のような気づきがあったと述べられています。

> 「感覚」でこれが問題だろうと決めつけてしまったのが今回のミスで、あくまでファクトを積み重ねるべきだった。

> 自分でログなどを検証して問題解決をするようにしないと「思い込み」の穴に落ちてしまう。

実際、ハッとするような体験がチーム内でありました。

ある時、プルリクエストの内容の動作確認をせず、ソースコードの変更箇所のみを基に「おそらく大丈夫だろう。」という判断で承認が行われ、結果的に本番環境で予期せぬ不具合が起きてしまうことがありました。

まさに「思い込み」の穴に落ちた瞬間であり、開発においていかに「感覚」による決めつけを避けるべきかを考え直すきっかけになりました。

チームとしては、人為的な事故につながり得るリスクは新たにCIを構築することで対応し、個人としてはログの検証や動作確認はもちろん、判断に迷ったら意見を仰ぐように努めています。

## 「不確実性を受け入れる」ようにしてみた
本書では、業務が計画通りに進まないことを快く受け入れるマインドが推奨されており、具体的には下記のような思考法が紹介されています。

>- マネジメントは詳細まで細かく練られた計画を期待しない
>- 事前に全ての問題分析が完了せずとも新しいことに挑戦する姿勢を持つ
>- 内部プロセスは計画や優先順位の変更に柔軟である

先日、fondesk事業部では[fondesk IVR](https://ivr.fondesk.jp/)という新サービスをリリースしました。
これに伴い、開発チームはリリース直前までデモ環境での動作確認やレビュー、機能修正などの作業に追われていました。

入社して間もない自分が出来ることは限定的でしたが、オンボーディングに留まらず新サービスのリリース期に携われたことで、入社前には想定してなかったことまで経験することができています。一方、オンボーディングの予定が変更になるなどのトレードオフももちろんあります。

このような状況下で、目まぐるしく変化するチームと自分の業務を前向きに捉えられたのは、不確実性を受け入れるというマインドを参考にしていたからかも知れません。

就職や転職の文脈で言えば入社前後のギャップであるとか、ソフトウェア開発の文脈で言えば納期や品質、スコープなど、不確実性の高い分野においてこれらを正確に予見することはとても難しいと思います。寧ろ、状況や進捗に応じて柔軟に変化できる方が、チームにとってもプロダクトとしても健康的であると実感できました。

## おわりに: 「どんなに頭がいい人でも理解には時間がかかるもの」というマインドで1ヶ月を過ごしてみて
この記事では、転職してから約1ヶ月間の取り組みや感じたことを、『世界一流エンジニアの思考法』の紹介とともに振り返りました。振り返ることで改めて、焦らず着実に理解を深めていく重要性を感じています。

自分は今回が初めての転職ということもあってか、「早くチームに貢献できるようにならなければ」という思考が必要以上に強く働いてしまうことも多かったように思います。そんな思考のもとで行われる「何かを早くできるように急ぐ努力」は、寧ろ本質的な理解を遠ざけてしまうことが本書では解説されています。

あやふやな試行錯誤や判断を生む「思い込み」ではなく、「理解」して「実践可能」な状態を作るために、焦らず地道に日々を積み重ねていこうと思います。
FinchをMacOS/Windows用との違いを意識しながらAmazon Linux 2023で動かす

ozawaです。実はQiita初投稿です。メリークリスマス。

# Finch
Amazonが開発したコンテナコマンドラインツールです。現状のサポートOSとしてMacOS/Windows/Linuxがあります。
https://runfinch.com/

# Amazon Linux 2023でFinchを動かす
元々は違う検証のためにAmazon Linux 2023上でFinchを動かそうと思っていたのですが、意外とハマったので今回はこちらの備忘録を書いていきます。

## MacOS/Windows用パッケージとLinux用パッケージの構造の違い
ここがうまく掴めずに苦労しました。
改めて考えると割と当たり前なのですが、何も考えずに使おうと思った際にハマったのでここの違いについてまとめます。

結論から言うと、**MacOS/Windowsでは、Finchは各OSによってサポートされた仮想VM上で起動しますが、Linux上では直接サービスとして起動します。**

MacOS/WindowsにおけるFinchのアーキテクチャは下記を参照ください。
https://runfinch.com/architecture/

Finchは、**MacOSではLima VM、WindowsではWSL 2**を前提として動きます。その仮想VM内においてcontainerdを起動し、操作することでFinchとして機能します。

Linuxの場合どうなるかというと、下記のAWSブログにおいてアーキテクチャが示されています。
https://aws.amazon.com/jp/blogs/opensource/announcing-finch-on-linux-for-container-development/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3927523/cbfbcec2-4319-c4ec-b5ef-58792d6f33cd.png)

Linuxの場合は、FinchがLinux上のcontainerdを直接呼び出す形で機能します。
言い換えると、**containerdサービスが起動していないとFinchが起動しません。**
なので、Linuxで扱う場合は依存するサービスの起動設定を有効化しておく等の対応が必要です。

改めてですが、サポートOS毎に下記のような前提の違いがあります。

| サポートOS | 仮想VMの有無 | 起動に必要な設定 |
|:-----------:|:------------:|:------------:|
| MacOS       | 有        | 仮想VMの起動         |
| Windows     | 有      | WSL 2のセットアップ<br>仮想VMの起動       |
| **Linux**     | **無**      | **containerdサービスの起動<br>finchサービスの起動**       |

## 実際にセットアップしてみた
Linuxでのインストール方法については下記ドキュメント内で詳細が記載されています。
https://runfinch.com/docs/managing-finch/linux/installation/

基本的にはこのやり方通りなのですが、今回実行したコマンドを下記に載せておきます
```bash
dnf upgrade --releasever=2023.6.20241121 -y
dnf install -y runfinch-finch
systemctl start containerd
systemctl start finch
```

- dnfパッケージは一応最新化しました
- Amazon Linux 2023ではdnfパッケージとして公開されているため、こちらでインストールしました
- containerdとfinchのsystemdサービスを起動しておきます

これで、Amazon Linux 2023上で動くようになりました。

## SOCI snapshotter/ECR Credential Helperの設定
MacOS/Windowsの場合は、これらのツールが仮想VM内でプレインストールされているため、finch.yml内で定義すれば使える状態となっています。

Linuxの場合、これらツールについてはLinuxホストマシンにインストールした上で利用する形になります。

詳細は下記ドキュメント内にも記載されています。
https://runfinch.com/docs/managing-finch/linux/optional-components/

# まとめ
Finchの原理を押さえておけば、Linux上でどのように動くのかはある程度予想はついたのですが、MacOSやWindowsでの使い方に慣れていると、ここの違いに少しハマりました。
MacOS/Windowsでは、１ツールとしての位置付けで捉えがちでしたが、Linuxで動かす場合には他サービスとの依存関係を意識する必要があり、少し戸惑いました。
ただ、改めてFinchの構造について意識することができ、勉強になったなーと思います。
【ChatGPT＋DALL-E3】のPromptで効果的なキーワード一覧です。


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

　今回は、DALL-E3のPromptで効果的なキーワード一覧です。ChatGPTに出してもらいました。

:::note info
本記事は、ChatGPT（Plus版）
で行なっております。
画像はありません。あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　SoraのPlus/Teamユーザーへの
　　クリスマスプレゼント🎁は
　　　現在も有効ですよ😸

　どんどん動画生成しましょうね。
***
　まずは、ニュース？です。

　サムがネタ募集中w

[サム・アルトマンポスト](https://x.com/sama/status/1871730475909419115?t=PrgTgAeXihrKzrjL240h8g&s=19)
>（DeepL翻訳）
>2025年、openaiに何を作ってほしいですか？

　あなたは何を求めますか？
***
　では、【本題】です。

　今回は、
　　DALL-E3のPromptで
　　　効果的なキーワード一覧を
　　　　示します。

　DALL-E3を使用して
　　画像生成を行う際、
　　　具体的で詳細なPromptを
　　　　作成することが、
　　　　　理想の結果を得るための
　　　　　　鍵となります。

　以下にChatGPTが出力してくれた
　　一覧を示します。
***
***ChatGPT***
１. スタイル・アート的な表現

スタイルやアートの方向性を明確に指定することで、作品の雰囲気や仕上がりを左右できます。

realistic（リアルな）
minimalist（ミニマリスト）
surreal（シュール）
abstract（抽象的な）
cyberpunk（サイバーパンク）
steampunk（スチームパンク）
futuristic（未来的な）
vintage（ヴィンテージ）
baroque（バロック風）
modernist（モダン）
impressionist（印象派）
cubist（キュビスム）
expressionist（表現主義）
art deco（アールデコ）
art nouveau（アールヌーボー）
gothic（ゴシック）
Renaissance（ルネサンス風）
pixel art（ピクセルアート）
watercolor painting（水彩画風）
oil painting（油絵風）


２. 光と影の演出

光と影の設定により、画像のムードや深みが大きく変わります。

vivid colors（鮮やかな色彩）
monochrome（モノクローム）
high contrast（高コントラスト）
soft lighting（柔らかい照明）
dramatic lighting（ドラマチックな照明）
backlit（逆光）
golden hour（ゴールデンアワー）
moonlit（月明かり）
neon lights（ネオンの光）
shadow play（影の演出）
lens flare（レンズフレア）
translucent（半透明な）
glowing edges（輝く輪郭）
chiaroscuro（明暗対比）
prismatic（プリズム効果）


３. 質感・素材感

質感や表面のディテールを指定すると、画像のリアルさや独自性が際立ちます。

metallic finish（金属的な質感）
matte texture（マットな質感）
silky smooth（シルクのように滑らか）
rough surface（粗い表面）
crystalline（結晶のような）
wooden texture（木目調）
marble pattern（大理石模様）
velvet softness（ベルベットのような柔らかさ）
liquid form（液体のような形状）
holographic（ホログラム風）


４. 構図・視点

構図や視点をコントロールすることで、画像に動きや奥行きを与えることができます。

bird's eye view（俯瞰視点）
worm's eye view（下からの視点）
fisheye perspective（魚眼レンズの視点）
symmetrical（対称的な）
asymmetrical（非対称的な）
close-up（クローズアップ）
panoramic（パノラマ）
fragmented（分解された）
center-focused（中心に焦点を当てた）
dynamic angle（ダイナミックな角度）


５. テーマ・ムード

特定のテーマやムードを強調することで、作品全体の感情的な方向性をコントロールします。

majestic landscape（荘厳な風景）
urban skyline（都会のスカイライン）
fantasy creature（ファンタジーの生物）
mythological（神話的な）
robotic design（ロボットデザイン）
whimsical（風変わりな）
magical realism（魔術的リアリズム）
post-apocalyptic（ポストアポカリプス）
nature-inspired（自然にインスパイアされた）
otherworldly（異世界風）
serene（穏やかな）
chaotic（混沌とした）
melancholic（憂鬱な）
romantic（ロマンチックな）
mysterious（神秘的な）
eerie（不気味な）
uplifting（希望に満ちた）
nostalgic（ノスタルジックな）
energetic（エネルギッシュな）
dark fantasy（ダークファンタジー）


６. その他のアイデアを広げる要素

さらに独創的なアイデアを引き出すための補助的なキーワードです。

mythical（神話のような）
bioluminescent（生物発光する）
submerged（水中に沈む）
floating（浮遊する）
organic shapes（有機的な形状）
mechanical structures（機械的な構造）
alien-like（エイリアンのような）
ancient ruins（古代遺跡）
frozen landscape（凍てついた風景）
volcanic environment（火山環境）


結論

これらのキーワードを活用してPromptを組み立てることで、DALL-Eでの画像生成の自由度と完成度が格段に向上します。テーマやスタイルをしっかりと伝えることが、理想の作品を得る第一歩です。ぜひ試してみてください！
***

　私も
　　まだ一部しか使えていません。

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

　今回は、ここまで。
　　メリークリスマス🧑‍🎄
MarkdownAIで記事の紹介文生成アプリを作ってみた

# 概要

これは[Markdown AIのサーバーAI機能を使ってWebサイトを作ってみよう by MarkdownAI Advent Calendar 2024](https://qiita.com/advent-calendar/2024/markdownai)の24日目の記事です。

URLを入れると記事の紹介文を生成してくれるアプリを作ってみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302006/33f9198e-6080-b82a-b40d-f3dc6c92acf8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302006/d32b242c-df02-e790-365a-75ab0a6e6917.png)

# アプリはこちら

https://mdown.ai/content/e6d05db0-6a40-4ce0-9a97-c41fc8809283

# 具体的なコード

```html
<div style="
  max-width: 800px;
  margin: 0 auto;
  padding: 20px;
  text-align: center;
  font-family: system-ui, -apple-system, sans-serif;
">
  <div style="display: inline-block;">
    <input 
      class="input" 
      type="text" 
      id="text-1735033881" 
      style="
        width: 300px;
        padding: 8px 12px;
        border: 2px solid #333;
        border-radius: 6px;
        font-size: 14px;
        transition: all 0.2s ease;
        outline: none;
        margin-right: 8px;
      "
      value="URL"
    >
    <button 
      class="button is-info" 
      type="button" 
      id="button-1735033881"
      style="
        background-color: #333;
        color: white;
        border: none;
        padding: 10px 20px;
        border-radius: 6px;
        font-size: 14px;
        cursor: pointer;
        transition: all 0.2s ease;
      "
      onmouseover="this.style.backgroundColor='#555'"
      onmouseout="this.style.backgroundColor='#333'"
    >紹介文を作る</button>
  </div>
  <div 
    id="answer-1735033881"
    style="
      margin-top: 16px;
      font-family: system-ui, -apple-system, sans-serif;
    "
  ></div>
</div>

<script>
(() => {
  const button = document.getElementById('button-1735033881');
  button.addEventListener('click', async event => {
    button.classList.add('is-loading');
    button.disabled = true;
    
    const serverAi = new ServerAI();
    const message = document.getElementById('text-1735033881').value;
    const answer = await serverAi.getAnswerText('hwxqUCQfhBPuy6J3jDneJ1', '', message);
    
    document.getElementById('answer-1735033881').innerText = answer;
    button.classList.remove('is-loading');
    button.disabled = false;
  });
})();
</script>
```

```tex:プロンプト
入力されたURLのなかを確認して内容を要約して、SNSでほかのユーザーへ紹介するために具体的で簡潔で読みたくなるような文章を100文字以内で書いてください。
```
MLOpsとは？AI時代を支える仕組みをわかりやすく解説

今日は、MLOpsについて話します。この言葉を聞いたことがある人もいるかもしれませんが、「難しそう」という印象を持つことが多いでしょう。そこで、中学生でも理解できるように、わかりやすく解説します。
※この記事は、ChatGPTの出力を基に作成しています。

## MLOpsって何？
MLOpsは「機械学習」と「運用」を組み合わせた言葉です。簡単に言うと、**AIや機械学習を使ったシステムを作ったり、動かしたり、管理したりするためのやり方**のことを指します。

## MLOpsの必要性
機械学習の基本は、たくさんのデータを使って「コンピュータが自動的に答えを学ぶ」ことです。例えば：
- 自動翻訳アプリが言葉を翻訳する
- 写真から動物や顔を識別する
- ゲームで自動的に相手が強くなる

こんなAIを作るには、たくさんのステップが必要です：
1. **データを集める** - AIに学ばせるための材料を集めます
2. **学習させる** - AIがデータからルールを学びます
3. **テストする** - 本当にうまく動くか確認します
4. **実際に使う** - 完成したAIを人々が使えるようにします

ただし、これらの作業を一回やるだけでは事足りません。現実の世界では：
- 新しいデータが出てきたらAIを作り直さないといけない
- 問題があったらすぐ直さないといけない
- 大勢の人が同時に作業しやすい環境が必要

これが「MLOps」が必要な理由です。

## MLOpsは何をするの？
MLOpsの主な目的は、機械学習の作業をすむずしくすることです。例えば：
- **自動化** - 学習から運用までの流れを自動化する
- **監視とアップデート** - AIの動作を監視し、問題があれば直す
- **協業しやすい環境作り** - データサイエンティストやAIエンジニアが便利に作業できるようにする

## わかりやすく例えると…
MLOpsをレストランのキッチンに例えてみましょう！

- **シェフ**：AIを作る人。
- **料理**：作られたAI。
- **お客さん**：AIを使う人。
- **キッチン**：MLOpsの環境。シェフがすむずしく料理できるようにしたり、たいていの確保に動くようにします。

これがあるおかげで、AIをもっと安全に、もっと早く、もっと簡単に使えるようになるのです。

## 結論
MLOpsは、機械学習を使うための「環境作り」ということができました。AIをもっと利用しやすくするために必要な技術ですので、これからさらに大事になっていくでしょう。
Javaで日本語入力が文字化け！原因と解決方法を徹底解説

### **はじめに**
Javaで標準入力を使って日本語を処理しようとしたとき、**文字化け**が発生することがあります。この問題に悩まされた経験がある方も多いのではないでしょうか？この記事では、文字化けの原因と解決策を、シンプルな「連絡先検索アプリ」を例に解説します。

---

### **文字化けの問題とは**
#### **問題のコード**
次のコードをコマンドプロンプトで実行すると、入力した日本語が正しく表示されません。

```java
import java.util.Scanner;

public class ContactManager {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("名前を入力してください:");
        String name = scanner.nextLine();
        System.out.println("こんにちは、" + name + "さん！");
    }
}
```

#### **実行例**
```plaintext
名前を入力してください:
山田
こんにちは、????さん！
```

---

### **文字化けの原因**
#### **エンコーディングの不一致**
- **コマンドプロンプト（cmd.exe）**:
  - デフォルトのエンコーディングは `Shift-JIS`。
- **Javaプログラム**:
  - デフォルトのエンコーディングは環境依存（多くの場合 `UTF-8`）。

エンコーディングが一致しないため、日本語入力が正しく解釈されず、文字化けが発生します。

---

### **解決方法**
文字化けを解消するには、**エンコーディングを明示的に指定**して、Javaプログラムとコマンドプロンプトのエンコーディングを一致させる必要があります。

#### **修正版コード**
```java
import java.util.Scanner;

public class ContactManager {
    public static void main(String[] args) {
        // Shift-JISエンコーディングを指定
        try (Scanner scanner = new Scanner(System.in, "Shift-JIS")) {
            System.out.println("名前を入力してください:");
            String name = scanner.nextLine().trim();
            System.out.println("こんにちは、" + name + "さん！");
        } catch (Exception e) {
            System.out.println("エラーが発生しました: " + e.getMessage());
        }
    }
}
```

#### **ポイント**
1. **`Scanner` にエンコーディングを指定**：
   - `new Scanner(System.in, "Shift-JIS")` を使用して、標準入力を `Shift-JIS` エンコーディングで処理します。
2. **`trim` で余分な空白を削除**：
   - 入力時に発生する不要な空白を削除して、正確にデータを処理します。

---

### **実行手順**
#### **1. コードを保存**
ファイル名を `ContactManager.java` として保存します。

#### **2. コードをコンパイル**
```cmd
javac ContactManager.java
```

#### **3. コマンドプロンプトのコードページを設定**
コマンドプロンプトが `Shift-JIS` を使用するように設定します。
```cmd
chcp 932
```

#### **4. プログラムを実行**
```cmd
java ContactManager
```

---

### **動作確認**

#### **入力例**
```
名前を入力してください:
山田
```

#### **出力例**
```
こんにちは、山田さん！
```

---

### **文字化けを防ぐ仕組みの解説**
#### **なぜこれで解決するのか？**
1. **`Scanner` のエンコーディングを指定**
   - `Shift-JIS` は、コマンドプロンプトのデフォルトエンコーディングです。これに合わせることで、Javaプログラムが入力された日本語を正しく解釈します。

2. **エンコーディングの統一**
   - `Scanner` で `Shift-JIS` を指定することで、プログラム全体のエンコーディングを統一します。

---

### **応用例: UTF-8を使用する場合**
もし `UTF-8` を使用する環境（例: Windows Terminal, PowerShell）で動作させたい場合は、以下のようにコードを修正します。

#### **UTF-8対応コード**
```java
import java.util.Scanner;

public class ContactManager {
    public static void main(String[] args) {
        // UTF-8エンコーディングを指定
        try (Scanner scanner = new Scanner(System.in, "UTF-8")) {
            System.out.println("名前を入力してください:");
            String name = scanner.nextLine().trim();
            System.out.println("こんにちは、" + name + "さん！");
        } catch (Exception e) {
            System.out.println("エラーが発生しました: " + e.getMessage());
        }
    }
}
```

#### **実行手順**
1. コードページをUTF-8に変更：
   ```cmd
   chcp 65001
   ```
2. プログラムを実行。

---

### **まとめ**
1. **文字化けの原因**:
   - Javaプログラムと実行環境（コマンドプロンプトなど）のエンコーディングが一致していない。
2. **解決方法**:
   - `Scanner` にエンコーディングを明示的に指定する。
3. **応用**:
   - `Shift-JIS` と `UTF-8` を切り替えて、さまざまな環境で動作するように対応可能。
Wat で "Hello, World!" は面倒

# はじめに
`WebAssembly` は Web ブラウザ上で実行できる効率的で軽量なバイナリ形式の技術として注目されています。

しかし、そのテキスト形式である `Wat`（WebAssembly Text Format）で「`Hello, World!`」を実装しようとすると、意外と手間がかかります。

本記事では、その理由を解説します。

# WebAssembly での「文字列」の扱い
WebAssembly 自体には文字列型が存在しません。文字列はバイト列として表現され、通常は**メモリ**（単一の連続したバイト配列）上の特定の位置に保存されます。

これを操作するには、以下のような手順が必要です。

1. **文字列をメモリに格納する。**
2. **メモリのアドレスを管理する。**
3. **必要に応じて文字列を 1 バイトずつ処理する。**

これにより、`Wat` で「`Hello, World!`」を表示するコードを書くのは意外と手間がかかります。

# Wat で「Hello, World!」を実装

以下は、`Wat` で「`Hello, World!`」を出力するためのコード例です。このコードは、文字列をメモリに格納し、それをJavaScript側で取得して出力します。

```lisp
(module
  (memory (export "memory") 1) ;; メモリを1ページ(64KB)確保
  (data (i32.const 0) "Hello, World!\00") ;; メモリの先頭に文字列データを配置

  (func (export "get_hello_world_ptr") (result i32)
    (i32.const 0) ;; メモリ上の文字列のアドレスを返す
  )
  
  (func (export "get_hello_world_len") (result i32)
    (i32.const 13) ;; 文字列の長さを返す（"Hello, World!"は13バイト）
  )
)
```
このコードでは、以下のことをしています。
1. メモリの確保: `memory` セクションで1ページ分のメモリを確保します。
2. 文字列データの配置: `data` セクションを使い、文字列データをメモリに格納します。
3. エクスポート関数の定義: `JavaScript` 側で文字列の位置（アドレス）と長さを取得できる関数を用意します。



次に `;;` 以降のコメントを消して、WebAssembly 形式に変換します。

ブラウザ上で変換したい場合は、以下のサイトでできます。`WAT` の欄に上記のコードを記述し、`Download` ボタンをクリックするとダウンロードできます。

https://webassembly.github.io/wabt/demo/wat2wasm/

WebAssembly のファイル名は `hello_world.wasm` とし、これから記述するファイルと同じディレクトリに配置してください。

<!--
Wat を WebAssembly に変換して JavaScript から呼び出すのが一般的ですが、今回は Base64 形式に変換して、直接 JavaScript のコードに記述します。
https://qiita.com/shikuno_dev/items/9f210f5339ee05575618
-->

## JavaScript 側での出力処理
`Wat` 単体では文字列を直接出力することはできません。`JavaScript` を使ってメモリから文字列を読み取る必要があります。


```javascript
fetch('hello_world.wasm').then(response =>
    response.arrayBuffer()
).then(bytes =>
    WebAssembly.instantiate(bytes, {}).then(results => {
        const instance = results.instance;

        // メモリビューを取得
        const memory = new Uint8Array(instance.exports.memory.buffer);

        // 文字列の位置と長さを取得
        const ptr = instance.exports.get_hello_world_ptr();
        const len = instance.exports.get_hello_world_len();

        // メモリから文字列を読み取る
        const text = new TextDecoder('utf-8').decode(memory.subarray(ptr, ptr + len));
        console.log(text); // "Hello, World!"
    })
);
```

上記のコードでは、メモリバッファを参照して文字列データを取得し、`JavaScript` の `console.log` で出力しています。

# おわりに
本記事で見てきたように、

- `Wat` で作業すると、メモリ管理やデータ配置といった低レベルな操作が必要です。
- また、`WebAssembly` には標準ライブラリがないため、文字列操作や I/O（入力/出力）を直接扱う機能がありません。これらの機能はすべて、ホスト環境（`JavaScript` など）に依存します。

そのため、`Wat` で `"Hello, World!"` を表示することは手間がかかります。
早期リターンが必要な場合、そうでない場合

## 早期リターンとは

早期リターンを行うことで、特定の条件を満たした場合にすぐに関数から抜け出すことができます。
必要な条件が満たされなかった場合に関数の処理を無駄に実行しないことで、保守性にも繋がります。
またコードの読みやすさにも繋がります。

### NG例

ユーザー情報の種類（infoType）に基づいてその情報を取得する目的の関数です。

```ts
export const getUserInfo = (
  infoType: string,  
  user: {
    details: {
      [key: string]: number | null;
    };
  },
  userInfoItems: {
    [key: string]: {
      [key: string]: string;
    };
  }
) => {
  const detailValue = user.details[infoType];

  if (infoType === 'age') { 
    return userInfoItems.age === null ? "" : userInfoItems.age[detailValue]
  }

  if (infoType === 'hobby') { 
    return userInfoItems.hobby === null ? "" : userInfoItems.hobby[detailValue]
  } 

   if (detailValue === null) {
    return "" ? userInfoItems[infoType][detailValue];
  }
};
```

上記のコードは関数の途中で終了（リターン）するポイントがなく、条件の最後でのみ結果がresultに集積されます。

また、NG例では条件の判定をする順番が適切ではありません。まずは`detailValue === null`が通ってからでなければ、`infoType === 'age'`、`infoType === 'hobby'`が正しく動かないはずなので、`detailValue === null`の条件は一番初めにリターンする方が適切です。


### OK例

```ts
export const getUserInfoEarlyReturn = (
  infoType: string,  
  user: {
    details: {
      [key: string]: number | null;
    };
  },
  userInfoItems: {
    [key: string]: {
      [key: string]: string;
    };
  }
) => {
  const detailValue = user.details[infoType];

  if (detailValue === null) return "";


  if (infoType === 'age') {
    return userInfoItems.age[detailValue];
  }

  if (infoType === 'hobby') {
    return userInfoItems.hobby[detailValue];
  }

  return userInfoItems[infoType]?.[detailValue];
};
```

OK例ではnull条件を最初にチェックすることで、結果に応じた即時リターンを可能にして効率を高めています。

ロジックフローが明確になることで、保守性が向上します。

このように、早期リターンは本質的にコードをシンプルにし、特定の条件が満たされなくなった時点で処理を中断させられる点で非常に便利です。
しかし、すべてのケースにおいて早期リターンが適用されるわけではありません。

## 早期リターンが適切でない場合

その１つが「多段階処理が必要な場合」です。

### 具体例

```ts
export const processAllSteps = (data) => {
  if (!initialize(data)) {
    console.error('Initialization failed');
    return;
  }
  
  if (!loadData(data)) {
    console.error('Data loading failed');
    return;
  }
  
  if (!transformData(data)) {
    console.error('Data transformation failed');
    return;
  }
  
  finalizeProcessing(data);
};
```

上記の例では初期化、データ読み込み、データ変換のすべてが成功した場合にのみ実行されます。失敗した場合、そこでプロセスは終了します。

各処理ステップ（initialize, loadData, transformData）が独立しており、どれか一つが失敗するとその時点で処理を止め、以降のステップを中断します。
これにより、終わるべき処理やクリーンアップが実行されないままリターンしてしまいます。

早期リターンが導入されると、何が完了し、何が完了していないかを把握するのが難しくなることがあります。

早期リターンを用いるならば、各リターンポイントで保証するべき後処理を明確にし、処理が途中で止まっても害が少ないロジック構造を持たせる必要があります。

## まとめ

早期リターンは便利ですが、使用箇所や主題によっては、返ってコードが不明瞭になることを避けるため、慎重に採用する必要があります。

適切な設計指針に従って、利点と欠点のバランスを計ることが重要です。

## 参考

https://qiita.com/laineus/items/d618ff90a82891691153
自宅と離れのネットワーク

離れを立てたので、自宅と離れのネットワークを整備しました。

離れは、1Fは事務所、2Fは賃貸用です。
自宅から離れには、1F用と2F用の2本のLANケーブルが敷かれています。
プロバイダーはplalaです。ひかり電話とフレッツフォン(050)両方入っています。
また、民泊やるのでゲスト用WiFiも用意しました。

まずは、各ネットの図
![home-network-name.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1224558/446c9479-6371-cca8-f930-d178dc9f2840.png)
アドレスは、172.16.z.zを使っています。

離れ2Fの賃貸用のルーターは未設置で、ご要望に応じてルーターモードでもブリッジモードでも使ってもらって構わないとしました。

次は、アドレスとインターネットへの経路の図
![home-network.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1224558/224f76db-b978-17ff-8b0d-2a6e8b5bf489.png)
IPoEとPPPoE2セッション使っています。RT-400NEはデフォルトでPPPoEとipv6パススルーでした。

### ルーターの設定など
* 2.xのネットはマスカレードしています。2.xへのアクセスはwireguard経由としました。 
* 3.xのネットはマスカレードしていません。そうするとひかり電話の内線としてすぐ使えました(ルーティングは必要)。3.x外からのアクセスはできません。 
* 100.xはインターネットからのhttp(s)のアクセスは、サーバーにポートフォワードしています。1.2以外の1.x発信のアクセスは禁止しました。1.2と3.xからのアクセスはhttp(s)以外も許可しました。 
* 5.xはWiFiでopenwrtの設定でisolationの項目にチェックをいれました。民泊のお客さんが民泊のホームページがみれないとこまることもあると思い、それはできるようにしました。 

### ローカルDNSサーバー
openwrt2、openwrt100、friendlywrtは、公開用サーバーの内部アドレスを返すDNSサーバーとしています。RT-400NEでそれができればいいのですが、一般用のルーターにはローカルDNSサーバー機能がないのはどうしてでしょうか？技術的問題なのか、需要がないのか？

### 電話について
* ひかり電話は、事務所用としてHT812のIP電話アダプターを通して電話とFAXを使っています。 
* フレッツフォンは、自宅のお遊び用としてHT802にアナログ電話、openwrt2にasteriskをいれfaxと留守電として使っています。 

### LarkBox XのWiFi
openwrtの23.05では、ax101チップのfirmwareがないようなので、24.10rc2を使いました。channelがautoでは使えませんでしたが、指定したら使えました。


### あとがき
前からLarkBox X(Ryzen CPU)を使っていたのですが、今回SSDを交換しようとして電源アダプターをつけたままのところに、ねじをおとしてしまい火花がでてこわしてしまいました。仕方がないのとついでに、N100のLarkBox Xを2台購入しました。
DAO？DTO？ビジネスロジック？

# DAO
データベースにアクセスする機能をまとめたデータベースアクセス専用のクラスを指します。DAOを定義し、データベースアクセス処理とビジネスロジックを切り離して管理するシステム設計方法を**DAOパターン**といいます。これにより、データベース関連の変更の影響をDAOに限定させることができます。

# DTO
クラスやメソッド間で複数のデータをまとめて受け渡す際に使用されるクラスです。基本的には、そのクラスブロック内にフィールドとgetter/setterのみを持ちます。DTOは主にテーブルの1レコード分のデータを格納する目的で定義されます。

# ビジネスロジック
ある一連のプログラムにおいて、他のプログラムから使いまわされることのないプログラム固有の処理を指します。
2024年に読んだ本

通勤時間ができて読書が捗るようになったので、去年の数倍ぐらい本を読んだ。
読む本の種類も増えた。
媒体はこれまではKindle中心だったが、物理本やオーディオブックも併用するようになった。

特に面白かった本は太字にした。

## 技術書

- データ指向アプリケーションデザイン
- LangChain完全入門
- Clean Architecture

## ビジネス書

- DXの思考法
- Sales is
- The Intelligent Sales
- その仕事、AIエージェントがやっておきました。
- 決算書は、ここしか読まない
- 生成AI時代のプロダクトマネジメント
- **THE COMING WAVE AIを封じ込めよ**

## 新書

生物学関連の本にハマった。

- AIなき世界に戻れるか? 物理学者、17の思考実験
- 学力喪失
- 棋士とAI
- 行動経済学の使い方
- **DNAとはなんだろう**
- タンパク質入門
- タンパク質の一生
- 睡眠の科学
- ゲノム編集を問う
- ジョブ型雇用社会とは何か

## その他

お笑い芸人の本は本当は読みたいが、ハマりすぎて他の本読めなくなってしまいそうなのでセーブしてる。

- **漫才過剰考察**
- 目の見えない私が「真っ白な世界」で見つけたこと
- 目の見えない人は世界をどう見ているのか
- The Albert Einstein Story

## 小説

成瀬シリーズから入って、本屋大賞の歴代受賞作を順番に読んだ。

- 傲慢と善良 辻村深月
- 火花 又吉直樹
- 成瀬は天下を取りにいく 宮島未奈
- 成瀬は信じた道をいく 宮島未奈
- 汝、星のごとく 凪良ゆう
- 星を編む 凪良ゆう
- 同志少女よ、敵を撃て 逢坂冬馬
- 52ヘルツのクジラたち 町田そのこ
- 流浪の月 凪良ゆう
- **そして、バトンは渡された** 瀬尾まいこ
- かがみの孤城 辻村深月
- 蜜蜂と遠雷 恩田陸
- 羊と鋼の森 宮下奈都
- 鹿の王 上橋菜穂子
- 村上海賊の娘 和田竜
- 海賊とよばれた男 百田尚樹
- 天地明察 冲方丁
【Python】UYVY形式のバイナリファイルをRGB画像に変換

## プログラム
```
import numpy as np
import cv2
from pathlib import Path

file_list = []

for file in file_list:
    # (height, width, 2)の形にreshape
    yuv_array = np.fromfile(file, np.uint8).reshape([1200, 1920, 2])
    bgr = cv2.cvtColor(yuv_array, cv2.COLOR_YUV2BGR_UYVY)
    cv2.imwrite(str(Path(file).with_suffix('.jpg')), bgr)
```

`bgr = cv2.cvtColor(yuv_array, cv2.COLOR_YUV2BGR_UYVY)`の`cv2.COLOR_YUV2BGR_UYVY`部分をバイナリファイルの形式に合わせれば、他のYUV形式に応用可能。
Raspberry Pi Pico Wの開発環境構築

ThonnyやArduinoIDEの環境構築は調べれば出てきますが、VSCodeの拡張機能だけで開発環境ができるようなので、実際にやってみました。

# 必要なもの
- PC
- Visual Studio Code

# 構築手順
1. VS Codeを起動
1. 左のサイドバーの"Extensions"(Ctrl + Shift + X)に移動
1. 検索画面に```Raspberry Pi Pico```と入力
![スクリーンショット 2024-12-24 210120.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951138/f3124dde-a83b-3a05-5d40-18dfe51acb44.png)
1. Installをクリックして、インストール

これで、拡張機能のRaspberry Pi Picoがインストールされました。

すると、左のサイドバーに新たにRaspberry Pi Picoのアイコンが出てきます。
![スクリーンショット 2024-12-24 211114.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951138/0947bbf6-7edb-e58d-f3bd-e40b5d25f30b.png)

Generalタブから、新しいプロジェクトを作ったり、既存のプロジェクトをインポートしたり、もしくはサンプルプロジェクトを作ったりします。
Projectタブでは、デバッグやコンパイル、実行、Picoに書き込みなどです。
picoCTF 2024 writeup IntroToBurp

## IntroToBurp (Web Exploitation)

Try [here](http://titan.picoctf.net:52444/) to find the flag

とりあえず、リンクに飛ぶ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638553/585c1dc4-5573-51de-918d-47787c86a5bb.png)
registerしてみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638553/693a1f4d-7329-6c53-4550-740e812fb03a.png)
registerボタンを押すと何か出てきた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638553/40d00d55-092a-12ad-ab78-fdace918a544.png)
2fa authenticationとは、2要素認証のこと。OTPとは、one time passwordのこと。
テキトーな値を入れてsubmitする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638553/f72a4f7e-1949-5f51-9ed7-8c3ee1d5e083.png)
invalidが返ってきた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638553/d2fa1967-3d60-9726-04ff-cd12537b18f5.png)
タイトル通り、BurpSuiteを使ってみる。
2要素認証のところで、何らかの文字を入力してsubmitし、BurpSuiteでRequestのotp部分を削除して、forwardする。すると、以下のようなresponseが得られた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638553/50a31a90-239c-7976-00c8-3610c8ca8011.png)

フラグが得られた。

`picoCTF{#0TP_Bypvss_SuCc3$S_2e80f1fd}`
Difyで管理者用アカウントをCUI上で初期化する方法

# はじめに
一般的にはDifyの管理者アカウントのパスワードを忘れた場合は、ログイン画面にあるパスワードリセットを行えばよいです。
ですがCommunity版を使用している場合は.envファイルにメールサーバーの設定をしていない場合が多いのではないのでしょうか？
その場合はパスワードのリセットができなくなり、コンテナを作り直すしかなくなってしまいます。
私も2回ぐらいこの状況に陥り詰んでしまいました。

ですが、上記以外のパスワードのリセット方法が用意されています。

# 結論

`docker exec -it docker-api-1 flask reset-password`

このコマンドを dify/docker のディレクトリ上で実行するだけです。

# 詳細
https://docs.dify.ai/getting-started/install-self-hosted/faqs#id-4.-how-to-reset-the-password-of-the-admin-account

Difyの公式サイトにリセット方法が記載されています。

`docker exec -it docker-api-1 flask reset-password`

これだけでパスワードをCUI上でリセットすることができます。


```sample.bash
dify@my-pc:~/hello/dify/docker$ docker compose up -d
[+] Running 9/9
 ✔ Container docker-web-1         Started                                                              0.1s 
 ✔ Container docker-sandbox-1     Started                                                              0.1s 
 ✔ Container docker-db-1          Started                                                              0.1s 
 ✔ Container docker-redis-1       Started                                                              0.1s 
 ✔ Container docker-weaviate-1    Started                                                              0.1s 
 ✔ Container docker-ssrf_proxy-1  Started                                                              0.1s 
 ✔ Container docker-api-1         Started                                                              0.1s 
 ✔ Container docker-worker-1      Started                                                              0.1s 
 ✔ Container docker-nginx-1       Started                                                              0.1s 
dify@my-pc:~/hello/dify/docker$ docker exec -it docker-api-1 flask reset-password
None of PyTorch, TensorFlow >= 2.0, or Flax have been found. Models won't be available and only tokenizers, configuration and file/data utilities can be used.
sagemaker.config INFO - Not applying SDK defaults from location: /etc/xdg/sagemaker/config.yaml
sagemaker.config INFO - Not applying SDK defaults from location: /root/.config/sagemaker/config.yaml
Email: hello@dify.ai
New password: newpassword4567
Password confirm: newpassword4567
Password reset successfully.
```


# 関連書籍
[未来を創るDify入門: RAG・チャットボット・ワークフローの基本をマスター](https://amzn.to/4fu6alT)
[入門 Dify: 1時間で学ぶ基礎+エージェント・RAG作成 1時間で学ぶLLMツール](https://amzn.to/3Dxn99s)
[Difyで作る生成AIアプリ完全入門 ](https://amzn.to/4iOiyjt)
改めて2024年DevRelチームの活動を振り返ってみる

こんにちは、ふるすです。
毎日投稿を続ける中で、他社様のDevRel活動のまとめ記事をたくさん拝見しました。以下読ませていただいたものをいくつかピックアップさせていただきます。
(※なお振り返り記事は昨年以前のものを含みます。)

https://qiita.com/molmolken/items/cd1d3262144feaaca99c

https://qiita.com/Taeko_ito/items/dea992e2ecd6b3f45435

https://qiita.com/80andco_tech_pr/items/3dce34a22b38e04155d6

https://qiita.com/kamiko_koho/items/9acf63a0d7eea86a2980

https://qiita.com/newta/items/dae21376c29496854bf2

https://tech.giftee.co.jp/entry/2024/12/10/060000

**みなさん、日々本当にお疲れ様です…！**

今年の営業日数も残りわずかとなってきたので、7月に異動して以降の私のDevRelとしての活動を少し振り返ってみようかなと思います。

## 収穫祭(社内製品発表会)の運営企画
弊社では毎年10月に収穫祭という社内イベントを行うのですが、運営としてがっつり入らせてもらいました(異動の最初の大仕事がこちらでした)。
一年で収穫したもの(=サービス)やその収穫過程をフロント部門などの非エンジニアの方に発表し、お客様に還元していこうというこのイベント。
コンサル時代からとても好きなイベントだったので運営に入らせてもらったのはとても嬉しかったです。なんと閉会式の進行までさせてもらい、貴重な体験ができました。
開発の方からは、「**自分たちのやってきたことを大々的に、自分たちの口から発表できる場があるのはうれしい**」というお声をいただけましたし、逆にフロント部門からは「**普段なかなか見えづらい開発の仕事を垣間見ることができて、仕事のモチベーションがあがる**」というお声をいただきました。
イベントによってエンジニアにもフロント部門にもとてもよい影響を与えていることを感じることができ、一番やりがいを感じた仕事でした。

## SNSでの発信強化
開発として持っているSNSアカウントはXのみですが、ありがたいことにテックブログを日々書いてくださる方が多いため、その投稿報告が日々流されているという状況になっていましたので、そもそもSNSをどのように使っていくか？といった検討から、発信内容の改善、発信数の増加など行ってきました。

## イベント登壇サポート
デブサミやデブキャリといった大型イベントのご登壇者検討から、主催者様とのやりとりまで入らせてもらいました。
そもそもこういったエンジニア向けイベントへの参加は今年が初めてでしたので、過去のイベントアーカイブや参加者の発信情報などは大変参考になりました。

## 社内勉強会の企画
こちらも企画検討段階から入らせてもらい、エンジニアの方にヒアリングをしたりご協力をいただきながらコンテンツ企画をしました。

## アドカレ関連活動
弊社では一昨年からアドカレに参加させていただいておりますので、今年もプレゼントカレンダーの検討企画や、社内告知、カレンダーが埋まっていない箇所にはどのようにアプローチして書いてもらうか、など考えていきました。

## アドカレ毎日投稿
こちらは大変個人的な活動ですが、非エンジニアの私が突然DevRelとして質の高いアウトプットを出すのは難しそうだ！というわけでまずは数をこなしてみようと始めたものです。
アドカレを毎日埋めようと決めたのが12月も半ばでしたので慌てて記事を書き始めて投稿しています。

## 個人のXアカウント解説
DevRelの一員として外部イベントに参加することが増えそうなのと、発信業務をスムーズにするため個人アカウントも開設しました。

https://x.com/Devrel_yulah

もしよろしければフォローしてくださいね。

## 来年はどうする？
さて、今年はDevRelチームのこれまでの業務を一度経験してみるという毛色が強かったので、来年はもっと開発部門の魅力が伝わるような発信を増やしたり、自分自身も外に出て行って関係性構築をしたり、「技術」自体の勉強をしていきたいなと思っています。

さっそく1月にあるこちらの技術広報イベントに参加して3分の発表枠ももらえたので、今から何を話そうか、どんなお話が聞けるのかわくわくしています。

https://techpr.connpass.com/event/339814/

ここまでお読みいただきありがとうございました！
API Best Practices ~【Appendix】パフォーマンスの最適化

## 【Appendix】パフォーマンスの最適化

https://protobuf.dev/programming-guides/api/#performance-optimizations

プロトコルのパース性能を向上させるために、以下のような手法が存在するが、型安全性や可読性とのトレードオフを考慮する必要がある。

型安全性や可読性を犠牲にすることで、プロトコルのパース性能を向上できる場合があります。

本項でターゲットとしているパフォーマンス低下要因:
- フィールド数が多いプロトコル（特にメッセージ型フィールドが多い場合）
- 深くネストされたメッセージ

### 高速化手法
#### トリムされたプロトコルの作成
必要とするフィールドのみを含む軽量なプロトコルを作成し、パース時に使用する。
#### 遅延パース
[lazy=true]アノテーションを使用して、必要な場合にのみフィールドをパースする。
#### バイト列として宣言
フィールドをバイト列として宣言し、クライアント側で必要に応じて手動でパースする。（PII/プライバシーリスクを考慮し、ログに書き込まれるプロトコルでは使用すべきではない。）

### 補足
パース性能の向上は、特にモバイルデバイスや高負荷環境において重要です。
パフォーマンス向上のための最適化は、トレードオフを考慮し、慎重に選択する必要があります。