OmniAICreator/Qiita-1.07M huggingface dataset:
自動化テストで品質を維持する方法：スクラム開発の成功体験から学ぶ


## 自動化テストの重要性

まず、自動化テストの重要性について触れておきましょう。手動テストは時間と労力がかかり、人的ミスも避けられません。一方、自動化テストを導入することで、以下のようなメリットがあります。

- **迅速なフィードバック**: コードの変更が即座にテストされるため、問題の早期発見が可能です。
- **一貫性のあるテスト**: 同じテストが何度でも正確に実行されるため、品質が安定します。
- **コスト削減**: 長期的には手動テストに比べてコストが削減されます。

## スクラム開発における自動化テストの導入

スクラム開発では、スプリントごとに新しい機能や改善がリリースされます。この高速な開発サイクルにおいて、自動化テストは特に有効です。以下は、私が実践してきた自動化テストの導入ステップです。

### 1. テスト戦略の策定

まずは、どの部分を自動化するかを決めるテスト戦略を策定します。ユニットテスト、統合テスト、エンドツーエンドテストなど、テストの種類ごとに優先順位をつけます。

### 2. テストツールの選定

次に、適切なテストツールを選定します。私の経験では、以下のツールが特に有効でした。

- **JUnit**: Javaのユニットテストに最適。
- **Selenium**: Webアプリケーションのエンドツーエンドテストに使用。
- **Jenkins**: CI/CDパイプラインの自動化に役立ちます。

### 3. テストの実装

テストツールが決まったら、実際にテストを実装します。ここで重要なのは、テストコードもプロダクトコードと同じくらいの品質を保つことです。リファクタリングやコードレビューを怠らないようにしましょう。

### 4. CI/CDパイプラインの構築

自動化テストを効果的に活用するためには、CI/CDパイプラインの構築が不可欠です。JenkinsやGitHub Actionsなどを使って、コードの変更がプッシュされるたびに自動でテストが実行されるように設定します。

### 5. テスト結果のモニタリングと改善

最後に、テスト結果を定期的にモニタリングし、必要に応じてテストケースを追加・修正します。テストのカバレッジを高めることで、品質をさらに向上させることができます。

## クラウドサービスの活用

最近では、クラウドベンダーが提供する様々なサービスを活用することで、自動化テストの導入がさらに容易になっています。例えば、AWSのCodePipelineやAzure DevOpsを使えば、インフラの構築からテストの実行まで一貫して自動化できます。

## まとめ

自動化テストを取り入れることで、スクラム開発における品質管理が大幅に向上します。迅速なフィードバック、一貫性のあるテスト、コスト削減といったメリットを享受しながら、クラウドサービスを活用して効率的に自動化を進めましょう。

皆さんもぜひ、自動化テストを導入して、プロジェクトの品質を高めてください。質問やコメントがあれば、気軽にどうぞ！

以上、今回は自動化テストを取り入れて品質を維持する方法についてお話ししました。次回もお楽しみに！
スプリントの範囲を厳守する重要性とその実践方法

## スプリントの範囲を厳守する理由

### 1. チームの集中力を維持する
スプリントの範囲を厳守することで、チームは一つの目標に集中できます。途中で変更が加わると、チームの集中力が散漫になり、結果として生産性が低下します。特にクラウドベースのプロジェクトでは、複数のサービスやAPIを統合する必要があるため、集中力の維持は非常に重要です。

### 2. 予測可能な進捗管理
スプリントの範囲を変更しないことで、進捗管理が容易になります。予測可能な進捗は、ステークホルダーとの信頼関係を築く上でも重要です。スプリントの途中で変更が加わると、進捗の予測が難しくなり、結果としてプロジェクト全体の遅延を招く可能性があります。

### 3. 品質の確保
スプリントの範囲を厳守することで、品質を確保することができます。途中で新しいタスクが追加されると、既存のタスクに対するテストやレビューの時間が削られ、品質が低下するリスクがあります。特にクラウド環境では、セキュリティやスケーラビリティのテストが重要であり、これらを疎かにすることは避けなければなりません。

## 実践方法

### 1. 明確なスプリントゴールの設定
スプリントの開始時に、明確なスプリントゴールを設定しましょう。これにより、チーム全員が何を達成すべきかを理解し、途中での変更を避けることができます。

### 2. プロダクトバックログの優先順位付け
プロダクトオーナーは、スプリントの開始前にプロダクトバックログの優先順位を明確にしておく必要があります。これにより、スプリント中に新しいタスクが追加されるリスクを最小限に抑えることができます。

### 3. デイリースクラムの活用
デイリースクラムを活用して、チームの進捗状況を確認し、問題が発生した場合は早期に対処しましょう。これにより、スプリントの範囲を変更せずに問題を解決することができます。

### 4. スプリントレビューとレトロスペクティブ
スプリントの終了時には、スプリントレビューとレトロスペクティブを実施し、次のスプリントに向けて改善点を洗い出しましょう。これにより、次のスプリントでの範囲変更を避けるための対策を講じることができます。

## まとめ

スプリントの範囲を厳守し、途中で変更を加えないことは、スクラム開発において非常に重要です。これにより、チームの集中力を維持し、予測可能な進捗管理を実現し、品質を確保することができます。明確なスプリントゴールの設定やプロダクトバックログの優先順位付け、デイリースクラムの活用、スプリントレビューとレトロスペクティブの実施など、具体的な実践方法を取り入れることで、スプリントの範囲を厳守することができます。
プロダクトオーナー必見！バックログの優先順位を適切に設定する方法

## バックログの優先順位設定の重要性

まず、なぜバックログの優先順位設定が重要なのかを理解しましょう。スクラム開発では、限られたリソースを最も価値のある機能に集中させることが求められます。優先順位が適切に設定されていないと、チームは重要でないタスクに時間を費やしてしまい、結果としてプロジェクト全体の進捗が遅れる可能性があります。

## 優先順位設定の基本原則

### 1. ビジネス価値を最優先に

バックログのアイテムを評価する際、最も重要な基準はビジネス価値です。どの機能がユーザーにとって最も価値があるのか、どの機能がビジネスの目標達成に最も寄与するのかを考慮しましょう。ビジネス価値が高いアイテムを優先することで、プロジェクトの成功確率が高まります。

### 2. リスクと不確実性の管理

次に考慮すべきはリスクと不確実性です。リスクが高いアイテムや不確実性が高いアイテムは、早期に取り組むことでリスクを軽減し、プロジェクトの安定性を高めることができます。特に技術的なリスクが高い場合は、早めに解決策を見つけることが重要です。

### 3. 依存関係の整理

バックログアイテム間の依存関係も重要な要素です。ある機能が他の機能に依存している場合、その依存関係を考慮して優先順位を設定する必要があります。依存関係を無視すると、後で大きな問題に発展する可能性があります。

## クラウドサービスの活用

クラウドベンダーの提供する様々なサービスを活用することで、バックログの優先順位設定がさらに効果的になります。例えば、AWSの「Amazon S3」や「Amazon RDS」を利用することで、インフラの管理を簡素化し、開発チームがより重要な機能に集中できるようになります。また、Azureの「Azure DevOps」や「Azure Boards」を使えば、バックログの管理が一層効率的になります。

## 実践的なステップ

### 1. バックログの定期的な見直し

バックログは一度設定したら終わりではありません。定期的に見直し、ビジネス環境やユーザーのフィードバックに応じて優先順位を調整することが重要です。スクラムのスプリントレビューやレトロスペクティブを活用して、チーム全体でバックログを見直す機会を設けましょう。

### 2. ステークホルダーとのコミュニケーション

プロダクトオーナーは、ステークホルダーとのコミュニケーションを密に行うことが求められます。ステークホルダーからのフィードバックを積極的に取り入れ、バックログの優先順位に反映させることで、プロジェクトの方向性を正しく保つことができます。

### 3. ツールの活用

最後に、バックログ管理ツールを活用することも重要です。JiraやTrelloなどのツールを使えば、バックログのアイテムを視覚的に管理しやすくなります。これにより、チーム全体が現在の優先順位を一目で把握できるようになります。

## まとめ

バックログの優先順位を適切に設定することは、スクラム開発において非常に重要な要素です。ビジネス価値、リスク、不確実性、依存関係を考慮し、クラウドサービスや管理ツールを活用することで、プロジェクトの成功に大きく寄与することができます。ぜひ、この記事のポイントを参考にして、バックログの優先順位設定を見直してみてください。
クロスファンクショナルなチームを編成するためのベストプラクティス


## クロスファンクショナルチームとは？

まず、クロスファンクショナルチームとは何かを簡単に説明します。これは、異なる専門分野のメンバーが集まり、一つのプロジェクトやプロダクトの目標に向かって協力するチームのことです。例えば、開発者、デザイナー、テスター、プロダクトオーナーなどが一つのチームに集まることが一般的です。

## なぜクロスファンクショナルチームが重要なのか？

### 1. 多様な視点とスキルセット
異なるバックグラウンドを持つメンバーが集まることで、多様な視点とスキルセットがチームにもたらされます。これにより、問題解決のアプローチが多様化し、より創造的な解決策が生まれやすくなります。

### 2. コミュニケーションの向上
異なる専門分野のメンバーが一つのチームにいることで、コミュニケーションが自然と促進されます。これにより、情報の共有がスムーズになり、プロジェクトの進行が円滑になります。

### 3. 迅速な意思決定
クロスファンクショナルなチームでは、必要なスキルセットがすべて揃っているため、意思決定が迅速に行えます。これにより、プロジェクトの進行がスピーディーになり、タイムリーなリリースが可能になります。

## クロスファンクショナルチームを編成するためのステップ

### 1. 目的と目標を明確にする
まず、チームの目的と目標を明確に設定しましょう。これにより、全員が同じ方向を向いて作業を進めることができます。

### 2. 適切なメンバーを選定する
次に、プロジェクトに必要なスキルセットを持つメンバーを選定します。開発者、デザイナー、テスター、プロダクトオーナーなど、必要な役割をすべてカバーすることが重要です。

### 3. コミュニケーションのルールを設定する
チーム内のコミュニケーションを円滑にするために、定期的なミーティングやチャットツールの利用など、コミュニケーションのルールを設定しましょう。

### 4. 継続的なフィードバックを行う
チームのパフォーマンスを向上させるために、定期的なフィードバックを行いましょう。これにより、問題点を早期に発見し、改善することができます。

## クラウドソリューションの活用

クラウドベンダーのサービスを活用することで、クロスファンクショナルチームの効率をさらに高めることができます。例えば、以下のようなサービスが役立ちます。

### 1. コラボレーションツール
SlackやMicrosoft Teamsなどのコラボレーションツールを利用することで、チーム内のコミュニケーションが円滑になります。

### 2. プロジェクト管理ツール
JiraやTrelloなどのプロジェクト管理ツールを利用することで、タスクの進行状況を可視化し、効率的に管理することができます。

### 3. クラウドインフラ
AWSやAzure、Google Cloudなどのクラウドインフラを利用することで、スケーラブルな環境を簡単に構築できます。これにより、開発・テスト・デプロイのプロセスがスムーズになります。

## まとめ

クロスファンクショナルなチームを編成することは、プロジェクトの成功に不可欠です。多様な視点とスキルセットを持つメンバーが集まることで、創造的な解決策が生まれやすくなり、コミュニケーションが向上し、迅速な意思決定が可能になります。さらに、クラウドソリューションを活用することで、チームの効率をさらに高めることができます。
スプリントレトロスペクティブでプロセスの改善点を見つける方法

スプリントレトロスペクティブは、スクラム開発において非常に重要なイベントの一つです。この時間を有効に活用することで、チームのプロセスを継続的に改善し、より効率的な開発を実現することができます。今回は、スプリントレトロスペクティブでプロセスの改善点を見つけるための具体的な方法についてお話しします。

## 1. レトロスペクティブの目的を明確にする

まず、レトロスペクティブの目的をチーム全員で共有することが大切です。レトロスペクティブは単なる振り返りの場ではなく、次のスプリントに向けて具体的な改善策を見つけるための時間です。この目的を明確にすることで、全員が積極的に参加しやすくなります。

## 2. データを活用する

感情や直感だけでなく、具体的なデータを基に議論を進めることが重要です。例えば、スプリントの進捗状況を示すバーンダウンチャートや、バグの発生件数、コードレビューの時間などのデータを用いることで、客観的な視点から改善点を見つけることができます。

## 3. KPTフレームワークを活用する

KPT（Keep, Problem, Try）フレームワークは、レトロスペクティブでよく使われる手法の一つです。以下のように進めます：

- **Keep**: うまくいったこと、続けたいことを挙げる
- **Problem**: 問題点や改善が必要な点を挙げる
- **Try**: 次のスプリントで試してみたいことを挙げる

このフレームワークを使うことで、具体的なアクションプランを立てやすくなります。

## 4. 全員の意見を尊重する

レトロスペクティブはチーム全員が参加するイベントです。全員の意見を尊重し、発言しやすい雰囲気を作ることが大切です。特に、内向的なメンバーや新人の意見も積極的に取り入れることで、多様な視点からの改善点を見つけることができます。

## 5. アクションアイテムを具体化する

改善点が見つかったら、それを具体的なアクションアイテムに落とし込むことが重要です。例えば、「コードレビューの時間を短縮する」という改善点が見つかった場合、「コードレビューのガイドラインを作成する」「レビューの時間を1時間以内に制限する」など、具体的なアクションを設定します。

## 6. フォローアップを忘れない

レトロスペクティブで決定したアクションアイテムは、次のスプリントで実行されるべきです。しかし、実行されないまま放置されることも少なくありません。定期的にフォローアップを行い、アクションアイテムが実行されているか確認することが大切です。

## まとめ

スプリントレトロスペクティブは、チームのプロセスを継続的に改善するための重要なイベントです。目的を明確にし、データを活用し、全員の意見を尊重しながら具体的なアクションアイテムを設定することで、より効果的なレトロスペクティブを実現できます。これらのポイントを押さえて、次のスプリントレトロスペクティブを成功させましょう！

---

以上、スプリントレトロスペクティブでプロセスの改善点を見つける方法についてお話ししました。皆さんのチームでもぜひ試してみてください。コメントやフィードバックもお待ちしています！

---
スプリントレビューで関係者からフィードバックを受けるコツ

スプリントレビューは、スクラム開発において非常に重要なイベントの一つです。ここでは、チームがスプリント中に達成した成果を関係者に対してデモンストレーションし、フィードバックを受け取ります。この記事では、スプリントレビューで関係者から効果的にフィードバックを受けるためのコツを紹介します。

#### 1. 事前準備をしっかりと行う
スプリントレビューの成功は、事前準備にかかっています。デモンストレーションする機能や成果物を事前に確認し、スムーズに進行できるように準備しましょう。特にクラウドベースのソリューションを使用している場合、デモ環境が正しく設定されているか確認することが重要です。

#### 2. 関係者を適切に招待する
スプリントレビューには、プロダクトオーナー、開発チーム、ステークホルダーなど、関係者全員を招待することが大切です。関係者が多岐にわたる場合、特にクラウドソリューションを利用している場合は、リモート参加が可能な環境を整えることも考慮しましょう。

#### 3. デモンストレーションを分かりやすく行う
デモンストレーションは、関係者がプロダクトの進捗を理解しやすいように行うことが重要です。技術的な詳細にこだわりすぎず、ユーザー視点での説明を心がけましょう。クラウドサービスの利用状況やパフォーマンスについても簡潔に説明すると良いでしょう。

#### 4. フィードバックを積極的に受け入れる
スプリントレビューの目的は、関係者からのフィードバックを受け取ることです。ポジティブなフィードバックだけでなく、改善点や課題についても積極的に受け入れましょう。フィードバックを受ける際には、感謝の意を示し、具体的な改善策を考える姿勢を持つことが大切です。

#### 5. フィードバックを次のスプリントに反映する
受け取ったフィードバックは、次のスプリント計画に反映させることが重要です。フィードバックを無視せず、具体的なアクションプランを立てることで、プロダクトの品質向上につながります。クラウドソリューションを活用している場合、フィードバックに基づいた迅速な改善が可能です。

#### 6. 継続的な改善を目指す
スプリントレビューは、単なる報告会ではなく、継続的な改善のための重要な機会です。関係者からのフィードバックを活かし、プロダクトの品質を向上させるための取り組みを続けましょう。クラウドサービスの新機能やベストプラクティスを取り入れることで、さらに効果的な改善が期待できます。

スプリントレビューで関係者からフィードバックを受けることは、プロダクトの成功に不可欠です。この記事で紹介したコツを参考に、効果的なスプリントレビューを実施し、プロダクトの品質向上を目指しましょう。
エッジコンピューティング（MEC）がなぜ流行らないのか

クラウドが流行ってる時代に相反するものだからです。

ハードウェアメーカーの需要が下がるのを回避するために躍起になっていると考えれば、納得の行く話です。

又、高信頼・低遅延通信を必要として片道 1msec未満のシステムがあったとする。
しかし、本当に高信頼なのかという謎が残ります。

干渉波による妨害があれば、いとも簡単に崩れ落ちることでしょう。

攻撃を避けるために、電波暗室化したりするとなると
大量に銀を使うようなことにもなり、銀の価格からしても現実感は全くというほどありません。

※本記事は [いるかナレッジ](https://iruka.irukango.com/) より一部記事を流用しています。
バックログリファインメントの重要性とその効果的な実践方法

## バックログリファインメントとは？

バックログリファインメントとは、プロダクトバックログに含まれるアイテムを定期的に見直し、詳細化し、優先順位をつけるプロセスです。このプロセスを通じて、チームは次のスプリントで取り組むべきアイテムを明確にし、スムーズな開発を実現します。

## なぜバックログリファインメントが重要なのか？

### 1. 明確なタスク定義
バックログリファインメントを行うことで、各アイテムの詳細が明確になります。これにより、開発チームは具体的なタスクを理解しやすくなり、スプリント中の混乱を避けることができます。

### 2. 優先順位の見直し
プロダクトの要件や市場の状況は常に変化します。定期的なリファインメントを通じて、プロダクトオーナーは最新の情報に基づいてアイテムの優先順位を見直すことができます。

### 3. リスクの早期発見
リファインメントの過程で、技術的な課題やリスクが早期に発見されることがあります。これにより、事前に対策を講じることができ、スプリント中のトラブルを未然に防ぐことができます。

## 効果的なバックログリファインメントの方法

### 1. 定期的なスケジュール
バックログリファインメントは定期的に行うことが重要です。週に一度、またはスプリントの中間に時間を設けることで、継続的にバックログを最新の状態に保つことができます。

### 2. 全員参加
リファインメントには、プロダクトオーナー、スクラムマスター、開発チーム全員が参加することが理想です。全員が参加することで、多角的な視点からアイテムを評価し、より良い決定を下すことができます。

### 3. 具体的な基準
リファインメントの際には、各アイテムに対して具体的な基準を設けることが重要です。例えば、「このアイテムはユーザーストーリーとして明確か？」「技術的な詳細は十分か？」などのチェックリストを用いることで、リファインメントの質を高めることができます。

### 4. 適切なツールの活用
クラウドベースのプロジェクト管理ツール（例：Jira、Trelloなど）を活用することで、バックログの管理が容易になります。これらのツールを使って、アイテムの詳細や優先順位を視覚的に管理することができます。

## まとめ

バックログリファインメントは、スクラム開発において非常に重要なプロセスです。定期的に行うことで、タスクの明確化、優先順位の見直し、リスクの早期発見が可能となり、スムーズなプロダクト開発を実現します。皆さんもぜひ、効果的なリファインメントを実践して、プロジェクトの成功に繋げてください。
毎日のスタンドアップミーティングを定期的に行う重要性

## デイリースクラムとは？

デイリースクラムは、スクラム開発における短いミーティングで、通常は15分以内に収めることが推奨されています。このミーティングでは、チームメンバーが以下の3つの質問に答えます：

1. 昨日何を達成したか？
2. 今日何をする予定か？
3. 進行中のタスクに障害はあるか？

このシンプルなフォーマットが、チーム全体の進捗状況を把握し、問題を早期に発見するための強力なツールとなります。

## デイリースクラムのメリット

### 1. コミュニケーションの促進

デイリースクラムは、チームメンバーが毎日顔を合わせて話す機会を提供します。これにより、情報の共有がスムーズになり、誤解や情報の漏れを防ぐことができます。

### 2. 早期の問題発見

タスクの進行状況や障害を毎日確認することで、問題が大きくなる前に対処することができます。これにより、プロジェクトの遅延を防ぎ、品質を保つことができます。

### 3. チームの一体感

毎日のミーティングを通じて、チームメンバーはお互いの進捗状況を把握し、協力し合うことができます。これにより、チームの一体感が高まり、モチベーションも向上します。

## デイリースクラムの実施方法

### 1. 時間と場所を固定する

デイリースクラムは毎日同じ時間、同じ場所で行うことが重要です。これにより、チームメンバーがミーティングを習慣化しやすくなります。

### 2. 立ったままで行う

デイリースクラムは短時間で終わらせることが目的です。立ったままで行うことで、ダラダラと長引くことを防ぎます。

### 3. フォーカスを保つ

デイリースクラムでは、進捗状況と障害にフォーカスすることが重要です。議論が脱線しないように注意し、必要に応じて別のミーティングを設定することも考慮しましょう。

## まとめ

デイリースクラムは、スクラム開発における重要な要素であり、チームのコミュニケーションを促進し、問題を早期に発見するための強力なツールです。毎日定期的に行うことで、プロジェクトの進行をスムーズにし、チームの一体感を高めることができます。ぜひ、皆さんのプロジェクトでもデイリースクラムを取り入れてみてください。
スプリント計画を成功させる秘訣：チーム全員が目標を理解するためのステップ

## スプリント計画の重要性

スプリント計画は、スクラム開発の中で非常に重要なフェーズです。この計画がしっかりと立てられていないと、プロジェクト全体が混乱し、最終的な成果物の品質にも影響が出てしまいます。スプリント計画を綿密に行うことで、以下のようなメリットがあります。

- **目標の明確化**：チーム全員が何を達成すべきかを理解する。
- **リソースの最適化**：必要なリソースを適切に配分できる。
- **リスクの軽減**：潜在的な問題を事前に洗い出し、対策を講じることができる。

## スプリント計画を成功させるためのステップ

### 1. バックログの精査

まずはプロダクトバックログを精査しましょう。バックログには、プロダクトオーナーが優先順位をつけたタスクがリストアップされています。これを基に、次のスプリントで取り組むべきタスクを選定します。

### 2. タスクの見積もり

選定したタスクに対して、チーム全員で見積もりを行います。見積もりには、ストーリーポイントや時間を使うことが一般的です。ここで重要なのは、全員が納得する見積もりを出すことです。

### 3. スプリントゴールの設定

次に、スプリントゴールを設定します。これは、スプリントの終了時に達成すべき具体的な目標です。スプリントゴールが明確であれば、チーム全員が同じ方向を向いて作業を進めることができます。

### 4. タスクの分解と割り当て

大きなタスクは小さなタスクに分解し、それぞれのタスクをチームメンバーに割り当てます。この際、各メンバーのスキルセットや現在の負荷を考慮することが重要です。

### 5. リスクの洗い出しと対策

最後に、スプリント中に発生しうるリスクを洗い出し、それに対する対策を考えます。リスク管理がしっかりしていれば、予期せぬ問題が発生した際にも迅速に対応できます。

## チーム全員が目標を理解するために

スプリント計画が完了したら、チーム全員が目標を理解しているか確認しましょう。以下の方法が効果的です。

- **デイリースクラム**：毎日の短いミーティングで進捗を確認し、問題があれば早期に解決します。
- **透明性の確保**：タスクの進捗状況を可視化するために、カンバンボードやデジタルツールを活用します。
- **フィードバックの奨励**：チームメンバーが自由に意見を言える環境を作り、継続的な改善を目指します。

## まとめ

スプリント計画を綿密に行い、チーム全員が目標を理解することは、スクラム開発の成功に不可欠です。バックログの精査からリスク管理まで、各ステップをしっかりと踏むことで、プロジェクトをスムーズに進めることができます。皆さんもぜひ、これらのステップを実践して、より良いスプリント計画を立ててみてください！

それでは、次回の記事でお会いしましょう！Happy Coding!

---

以上が、スプリント計画を成功させるための秘訣です。皆さんのプロジェクトがうまくいくことを願っています。質問やコメントがあれば、ぜひお寄せください！

---
【初心者】Unifi Expressルーターを試してみました

# 背景
・中小零細企業のIT環境をサポートして微力ながら役立ちたいマン（長い）としては、気になっている製品でした。
・無線LANの整備は2024年現在でもサポートニーズがある分野ですからね。

# Unifiとは
・Ubiquiti（ユビキティ）社のブランド名
・WAN/LANの統合環境を提供
・なんかApple製品っぽくておしゃれ

# Unifi Expressとは
・詳しくはこれらのレビューを読んで頂くのが良いと思います。
・個人的には、USB-C通電するのと、ルーター前面の小窓？にステータス表示をしてくれるのが斬新でよいと思いました。

https://internet.watch.impress.co.jp/docs/column/shunlabo/1567056.html
https://rewse.jp/blog/ubiquiti-unifi-express-review-hardware-initial-setup/
https://waterclover.com/pr/unifi-express-review/
https://taishon.jp/unifi-express/

# 初期設定
・スマホから行えるようです。UnifiのアプリをDLしておきます。
・通電すると、アプリからつないで下さい的な表示が小窓に出ますので、アプリでつなぎます。
・Bluetoothでつなぐようです。日本のメーカーが好きなWPSじゃないんですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/3c6cc779-b984-e1cf-4fa5-bae2bc2e1463.png)

・WANポートに別のルーターのLANと接続し、DHCPでIPをもらうとネット接続して自動的に設定完了してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/c467e64e-2a0c-d891-fe20-11078603c1d5.png)


# 接続完了
・ルーターとして一通り設定できそうな画面が出てきました。
・一般的な家庭用ルーターよりは多くのことができそうですが、知識が追い付いてませんのでゆっくり慣れていきたいと思います。
・WIFI Manというアプリで無線のシグナルなども見れるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/724952f9-5311-5281-3a35-cf21d4ee85a9.png)



# まとめ
・最新製品だけあって、サイズやデザインや給電など洗練されている印象でした。
・WPSとかのボタンがないからMac Miniっぽいスタイル感があります。
・おしゃれで場所を取らないので、小規模オフィスや店舗などの拠点ルーターとしていいかもしれませんね。

# 機能について
・Unifi製品群でまとめると、UIでの管理が一元化できたりするそうです。
・あとはクラウド管理が無料ということですかね。
・YAMAHA製品とかだとクラウド管理やVPNライセンスは有料だった気がします。
・同時接続は60デバイスが目安とのことですが、上限ではないとのこと。このサイズ感としては驚きですね。

# ほか
他のUnifi製品とのスペックの違いなどがまとめられていました。

UniFi Express Comparison Charts
https://evanmccann.net/blog/2023/12/unifi-express-preview
LeetCode挑戦日記：Day16

# はじめに

最近、業務で実装する時間よりも資料作成やレビューをする時間が多くなってきました。
このままでは自身のコーディング能力が落ちそうで怖いので、LeetCodeを始めてみました。

自身の学習の記録 & LeetCodeに興味のある人が挑戦しやすいように、記事に残していきます。
このような競技プログラミングをした経験がないので、ひよってEasyからやっていきます...

# [Medium] 1004. Max Consecutive Ones III

2進数の配列`nums`と整数`k`が与えられたとき、最大で`k`個の`0`を`1`に反転できる場合、配列内で連続する`1`の最大数を返してください。

## 素直に解いてみる → NG

### 考え方

1. `nums`を前から0を1に変えていき、1が連続する最大数を確認する

### コーディング

```typescript
function longestOnes(nums: number[], k: number): number {
    let max = 0;

    for (let i = 0; i < nums.length; i++) {
        let remainingFlips = k;

        for (let j = i; j < nums.length; j++) {
            if (nums[j] === 0) {
                if (remainingFlips === 0) {
                    break;
                } else {
                    remainingFlips--;
                }
            }
            let length = j - i + 1;
            if (max < length) {
                max = length;
            }
        }
    }

    return max;
}
```

### 結果

Time Limit Exceeded

## 改善：ループ数の削減

### 考え方

自分では思いつけず...
以下を参考に改善しました。

https://leetcode.com/problems/max-consecutive-ones-iii/solutions/5292165/beginner-friendly-solution-brute-better-best-complete-explanation

### コーディング

```typescript
function longestOnes(nums: number[], k: number): number {
    let max = 0;

    let left = 0;
    let right = 0;
    let remainingFlips = k;

    while (right < nums.length) {
        if (nums[right] === 0) {
            while (remainingFlips === 0) {
                if (nums[left] === 0) {
                    remainingFlips++;
                }
                left++;
            }
            remainingFlips--;
        }
        max = Math.max(max, right - left + 1);
        right++;
    }

    return max;
}
```

### 結果

Runtime：59ms
Beats 92.95%

Memory：55.06MB
Beats 87.21%
JavascriptでPPM画像を作ってみる。

# PPMとは？
とてもシンプルな画像形式です。
[Wikipediaの解説](https://w.wiki/s5z)
# グラデーション
```js
var ppm="P3 256 256 255 ";
var n=255
for(i=0;i<=n;i++){
    for(j=0;j<=n;j++){
        ppm=ppm+String(j)+" "+String(i)+" 0 ";
    }
}
var blob=new Blob([ppm],{type:"text/plain"});
const link=document.createElement("a");
link.href=URL.createObjectURL(blob);
link.download="image.ppm";
link.click();
```
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479123/0e397ad1-3d4c-6eb1-20e5-a8e7bc1b97be.jpeg)

# リサジュー曲線
```js
var ppm="P3 100 100 255 ";
var list=[];
var n=100
for(i=0;i<=n;i++){
    for(j=0;j<=n;j++){
            list.push(" 0 0 0");
    }
}
for(theta=0;theta<2*Math.PI;theta+=0.01){
    var y=Math.floor(50+50*Math.cos(6*theta));
    var x=Math.floor(50+50*Math.sin(5*theta));
    list[100*y+x]=" 255 255 255";
}
for(i=0;i<=n**2;i++){
        ppm+=list[i];
    }
var blob=new Blob([ppm],{type:"text/plain"});
const link=document.createElement("a");
link.href=URL.createObjectURL(blob);
link.download="image.ppm";
link.click();
```
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479123/55fabaab-4427-bac1-6b5b-1ace51e3e553.jpeg)

# 参考
[JavaScriptで文字列をファイル出力する方法を現役エンジニアが解説【初心者向け】](https://magazine.techacademy.jp/magazine/28206)
モバイルバッテリーの分解

## はじめに
こんにちは、劣化モバイルバッテリー所有中のbockringです。

前回の記事で容量チェックをしたら40%程まで劣化していて、よく見たらバッテリーが膨らんでいるのかケースがほんの少しだけ曲がり、浮いていました。

前回の記事も併せてご覧ください(当該章が開きます)。

https://qiita.com/bockring/items/65d7a50f39f84ba64a71#%E3%83%A2%E3%83%90%E3%82%A4%E3%83%AB%E3%83%90%E3%83%83%E3%83%86%E3%83%AA%E3%83%BC%E3%81%AE%E5%AE%B9%E9%87%8F%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF

ということでバッテリーセルはリサイクル確定なので完全放電の後、分解していきます。基板は充放電の管理基板として使用します。これこそ3R。

:::note alert
充電池(特にLi-ion)を含む製品の分解は必ず完全放電してからにしましょう。なお分解の際も金属系のヘラは使ってはいけません。セルに傷を付けてしまったら最悪の場合火事コースです。

モバイルバッテリーの完全放電は、時間がかかりますが1A以下(500mA程度を推奨)でゆっくりセルへの影響を最小に抑えつつ放電を行いましょう。

私は約0.6Aで放電が可能な放電装置(USBのVBUSとGNDに10W16Ωのセメント抵抗を2個並列に接続(20W8Ω)したものを使用しました。
:::
なお、バッテリーは本来膨張しているものは回収対象外ですが、初期段階なので膨張していないということにして(おい)、衝撃にも耐えられるよう丁寧に緩衝材を用いて梱包してリサイクルボックスに入れておきました。

ちなみに、膨張度合いは
　**「軽く押したらちょっとペコペコするし空気層があるなぁ」**
といった程度です。

~~こんなこと言ったら怒られそうですが、大体の人は膨張していることに気付かないような段階なので許してください。~~

## 仕様
モバイルバッテリーの仕様です。新品での公称仕様はこちらです。
| 項目 | 仕様 |
|:-:|:-:|
| セル容量 | 13800mAh |
| 出力 | 5V2A |
| 入力 | 5V2A |

と、なんとも無難な雰囲気ですが、劣化の影響で以下のようになっています。(また後でも言いますが13800mAhは詐欺です。実際は10000mAhでした。)
| 項目 | 詳細 |
|:-:|:-:|
| セル容量 | 5200mAh |
| 出力 | 5V1A |
| 入力 | 5V2A |

※セル容量は内部の昇圧効率を75%として計算しています。

と、出力が1Aに制限される程には劣化しているのに充電は2Aという劣化推進設計(?)になっています。おそらくこの充電スピードがセルに負荷をかけていたのでしょう。出力を1Aに制限していただけマシと考えた方が良さそうです。Amazonの安いやつを5年使っていましたし。

## 分解
**事故だけには気を付けて**
分解していきます。

**分解は完全放電してからです。何があっても放電しきってください。過放電でも良いです。絶対に完全放電してください。**
超大事なので3回言いました。

### 注意点など
用意するものは
・ナイロンスパッジャ(樹脂製のヘラ)
・無水エタノール(又はIPA)
・静電防止作業マット
・絶縁テープ(ビニールテープなど・幅15mm程度推奨)
は最低限必要です。機種によっては
・ニッパ
・半田ごて
なども必要です。使用の機器に合わせてご用意ください。

金属ヘラは使ってはいけません。内部回路のショートやセルの損傷に繋がる可能性があります。

あなたがプロだっていうならなんでも好きな方法でどうぞ(というか我流でどうぞ)。

### 分解開始
バッテリー分解の時に定期的に写真を撮るなんてできません(でした)。セルを外し、基板を外し、ついでにUSB-Aの端子も取りました。

**ここで悲報(?)。分かってはいましたが容量詐欺していました。表示値13800mAhのところ、中には1セルあたり5000mAhのLi-Poバッテリーが2セル並列になっていました。初期状態でも10000mAhですね。**
だとしても劣化率50%だから捨てるには変わりないのですが。

基板はこんな感じです。

![IMG_1437.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777721/00d212e6-d9aa-79c1-5076-fe81433f34d8.jpeg)
表側です。7セグの上にはUSB-Aがありました。

![IMG_1438.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777721/a6216fb7-bbe7-3010-9b20-5dbb414d511c.jpeg)
裏側です。入力端子はUSB-CとMicro USBです。

単純に充放電管理ICや残量処理用のマイコン、入出力のインターフェース、そして昇圧回路などが載ってるだけです。

とはいえ、基板のシルク印刷もあるので(普通だけど)、このまま流用できそうです。
VIN+/VIN- : 入力端子
B+/B- : バッテリー端子
V+/V- : 出力端子
です。そのままですね。充放電基板は規格上(というかセル初期状態)では2A引き出せていたのでまぁ普通に使えるでしょう。ストックします。

## おわりに
充放電管理基板ゲットやったね！以上です。
必要になったらUSB-CやMicro USBも頂いていきます。別に専用の端子がそれぞれ存在しますし。

それではまた〜(これだけ？！)
【HTML】bodyの高さをぴったりにしたい！

# はじめに

```css
body {
   min-height: 100vh;
}
```

**※コメントいただきました。↑この記述のみでOKです。**
これがうまくいかない方は
「`--watch`によるCSSファイルの変更共有」や
「コンパイルがうまくいってるか」を確認してください
（私はこれをミスりました）

---

以下、読む価値なし

---

`document.body`は、必ずしもページ全体をラップできるわけではないようです。
例えば、コンテンツが少ない場合は `document.body`（以下`body`）はページの半分ほどになってしまいます。

|                                                                                                                                                    |
| :------------------------------------------------------------------------------------------------------------------------------------------------: |
| ![スクリーンショット 2024-05-24 20.25.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/3faafb2d-13fe-d1d2-605d-a99ac6996a29.png) |
|                                                        水色の部分が`body`（`background-color`で色付け）                                                        |
「スワイプでタブ切り替え」を設定したい時<br>水色部分はスワイプに反応するが、白部分はスワイプに反応しない

こうなると、`body` を使って、ページ全体にイベントを設定することができなくなります。

# 解決方法

```js
const setBodyHeight = () => {
  document.body.style.height = window.innerHeight + 'px';
}

window.addEventListener('resize', setBodyHeight);
window.addEventListener('load', setBodyHeight);
```

このように`window.innerHeight`を取得し、`document.body`の`height`に設定することで、ページの高さぴったりに`body`を設定できました。

`resize` / `load` 時に発火させることで、ページを開いた時・再読み込みした時・リサイズした時に高さを合わせることができます。

| |
| :---: |
|![スクリーンショット 2024-05-24 20.54.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/e3708c87-08e2-4102-30d5-366fb6603901.png) |
|`body`がページ全体の高さになった|

# 余談：`window`に対するイベント設定

https://hammerjs.github.io/getting-started/

今回はHammer.jsを使用しましたが、少なくとも調べた限りでは`window`に対しイベントを設定することはできませんでした。`body`の高さを調整することが大切ですね。

個人的な感覚でも、`window`はグローバルオブジェクトかつ、HTML要素ではないためイベント設定対象としてはふさわしくないと思います。

間違ってたら / 他にやり方があったら教えてください。
# おわりに

以上、`body`の高さをぴったりにする方法でした。

次は何を書こうかしら・・・
react-iconsを使用してアイコンボタンを実装してみる

# はじめに
現在React×TypeScriptで個人開発を行っています。
今回は**react-iconsを使ってボタンの実装を行ってみた**ので、使用方法を簡単にまとめます。
# react-iconsとは
**Reactライブラリの一種で、種類豊富なアイコンを手軽に使用できます。**

HP上で使いたいアイコンをクリックすると、インポート文が出てくるのでそのままコピペで使えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3675500/7fabe56d-9308-a62c-48a9-a027e29faa8a.png)

# 使用例
今回は**削除ボタンの実装でアイコンを使用**してみました。

・`IconButton`コンポーネントを使用（Chakura Ui）
→通常のButtonコンポーネントと異なり、テキストではなくアイコンのみを表示するときに使う
・`BsFillTrashFill`というReactアイコンを使用
・`colorScheme`と`variant`で今回はグレーの色調＆外枠をつけた
・アクセシビリティ向上のため`aria-label`を使用
（視覚に障害がある方にもボタンの機能がわかるように使用）
・`onClick`で各自適切なクリックイベントを付与する

```tsx:tsx
<IconButton
  colorScheme="gray"
  variant="outline"
  icon={<BsFillTrashFill />}
  aria-label="Delete"
  onClick={onOpen}
/>
```

イメージ（右側のごみ箱のイラストが削除ボタンです。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3675500/a1c4cd20-d624-ee97-91a8-fbda7943f372.png)

# おわりに
アイコンを使うことでユーザーにとって直感的な操作がしやすくなりますよね。
手軽に使えるのでぜひ試してみてください！
# 参考
https://react-icons.github.io/react-icons/
スクラム開発を加速する「Communities of Practice」の重要性と構築方法

## はじめに
スクラム開発を効果的に進めるためには、チームの連携と知識の共有が不可欠です。そのために役立つのが「Communities of Practice（CoP）」です。本記事では、CoPの重要性とその構築方法について詳しく解説します。

## Communities of Practiceとは
Communities of Practice（CoP）は、共通の関心や課題を持つ人々が集まり、情報や知識を共有し、互いに学び合うコミュニティのことを指します。スクラム開発においては、CoPを通じてベストプラクティスの共有や技術の向上を図ることができます。

### CoPの目的
1. **知識の共有**：専門的な知識や経験を持つメンバーが集まり、互いに情報を共有することで、全体のスキルレベルを向上させます。
2. **継続的な学習**：新しい技術や方法論を取り入れ、常に最新の情報を得ることで、チームの技術力を維持・向上させます。
3. **ネットワーキング**：他のチームや組織のメンバーとつながり、異なる視点やアイデアを取り入れることで、イノベーションを促進します。

## CoPの構築方法
### 1. 目標と目的の設定
まず、CoPの目的や目標を明確にします。例えば、「特定の技術に関するベストプラクティスを共有する」や「新しいツールの評価を行う」など、具体的な目標を設定します。

### 2. メンバーの選定
CoPのメンバーは、共通の関心を持つ人々で構成されるべきです。多様なスキルやバックグラウンドを持つメンバーを集めることで、幅広い視点からの議論が可能となります。

### 3. 定期的なミーティングの開催
定期的なミーティングを設定し、メンバーが集まって情報を共有できる場を提供します。ミーティングの内容は、プレゼンテーション、ディスカッション、ワークショップなど、様々な形式を取り入れると良いでしょう。

### 4. オンラインプラットフォームの活用
地理的に離れたメンバーともコミュニケーションを取るために、オンラインプラットフォームを活用します。Slack、Microsoft Teams、Zoomなど、適切なツールを選定し、効果的に活用します。

### 5. 成果の共有と評価
CoPの活動の成果を定期的に評価し、必要に応じて改善を行います。また、成果を組織全体に共有することで、他のチームやプロジェクトにも良い影響を与えることができます。

## まとめ
Communities of Practiceは、スクラム開発において知識の共有と技術の向上を促進する重要な要素です。目的の設定、メンバーの選定、定期的なミーティングの開催、オンラインプラットフォームの活用、そして成果の共有と評価を通じて、効果的なCoPを構築し、チーム全体の成長を促しましょう。

皆さんのチームでも、ぜひCoPを導入してみてください。共に学び、成長することで、より強力なスクラムチームを作り上げましょう。

---
【Salesforce】トリガーの実行順序

# はじめに

今日はSalesforceのトリガーの実行順序について説明します。

### トリガーの実行順序
Salesforceでは、トリガーが実行される順序が決まっています。この順序があることで、データが正しく処理されます。ここでは、トリガーの実行順序をステップごとに説明します。

1\. レコードの初期設定：
最初に、元のレコードがデータベースから読み込まれるか、、upsert ステートメント用にレコードが初期設定されます。

#### "upsert"
挿入（insert）と更新（update）を組み合わせた操作です。もしレコードが存在しなければ新しく作成し、存在すれば更新します。この初期設定は、どのレコードが新規で、どのレコードが既存かを決めるための準備です。例えば、新しい顧客情報を追加する場合や、既存の顧客情報を更新する場合に、適切に対応できるように準備をします。

2\. 値の上書き：
要求から新しいレコード項目の値が読み込まれ、古い値を上書きします。Salesforceは、要求の種類に応じてさまざまな検証チェックを実行します。

- 標準UI編集ページからの要求：
    - レイアウト固有のルール
    - レイアウトレベルおよび項目定義レベルで必要な値
    - 有効な項目形式
    - 最大項目サイズ
- ユーザーオブジェクトからの要求：
    - カスタム検証ルール
- 複数行品目の作成からの要求：
    - カスタム検証ルール

- ApexアプリケーションやSOAP APIコールからの要求：
    - 外部キーと制限付き選択リストの検証
    - カスタム外部キーがオブジェクト自体を参照しないことの確認

3\. レコードトリガーフローの実行：
保存前に実行されるように設定されたレコードトリガーフローが実行されます。

4\. beforeトリガーの実行：
すべてのbeforeトリガーが実行されます。

5\. システム検証の再実行：
必須項目の確認やカスタムの入力規則の実行など、システム検証のほとんどの手順がもう一度実行されます。ただし、標準UI編集ページからの要求に対しては、レイアウト固有のルールの適用は再実行されません。

6\. 重複ルールの実行：
重複するレコードを特定し、ブロックアクションを実行します。重複が検出された場合、レコードは保存されず、後続のステップも実行されません。

7\. レコードの保存：
レコードはデータベースに保存されますが、まだ確定されません。

8\. afterトリガーの実行：
すべてのafterトリガーが実行されます。

9\. 割り当てルールの実行：
割り当てルールが実行されます。

10\. 自動応答ルールの実行：
自動応答ルールが実行されます。

11\. ワークフロールールの実行：
ワークフロールールが実行され、ワークフロー項目自動更新が存在する場合、次の手順が実行されます。

- レコードの再更新：
    - レコードが再度更新されます。
-システム検証の再実行：
    カスタム入力規則、フロー、重複ルール、プロセスおよびエスカレーションルールは再実行されません。
- before updateトリガーとafter updateトリガーの再実行：
    - レコードの操作（挿入または更新）に関わらず、もう一度実行されます。

12\. エスカレーションルールの実行：
エスカレーションルールが実行されます。

13\. Salesforceフロー自動化の実行：
次のSalesforceフロー自動化が実行されますが、順序は保証されません。

- プロセス
- プロセスによって起動されたフロー
- プロセスまたはフローでDML操作が実行されるとき、影響を受けるレコードに対して保存手順が実行されます。

14\. レコードトリガーフローの実行：
保存後に実行されるように設定されたレコードトリガーフローが実行されます。

15\. エンタイトルメントルールの実行：
エンタイトルメントルールが実行されます。

16\. 積み上げ集計項目の計算：
レコードに積み上げ集計項目が含まれる場合、またはレコードがクロスオブジェクトワークフローの一部である場合、計算が実行され、親レコードの積み上げ集計項目が更新されます。親レコードに対して保存手順が実行されます。

17\. 親レコードの更新：
親レコードが更新され、さらにその親レコードに積み上げ集計項目が含まれるか、その親レコードがクロスオブジェクトワークフローの一部である場合、計算が実行され、親の親レコードの積み上げ集計項目が更新されます。親の親レコードに対して保存手順が実行されます。

18\. 条件に基づく共有の評価：
条件に基づく共有の評価が実行されます。

19\. DML操作の確定：
すべてのDML操作がデータベースで確定されます。

#### "DML"
Data Manipulation Language（データ操作言語）の略です。DML操作は、データベース内のデータを操作するための命令のことです。

20\. コミット後ロジックの実行：
変更がデータベースにコミットされた後、コミット後ロジックが実行されます。コミット後ロジックの例を次に示します。
- メールの送信
- キューに登録された非同期Apexジョブ（キュー可能ジョブやfutureメソッドを含む）
- レコードトリガーフローの非同期パス

# まとめ

Salesforceのトリガーは、データが正しく処理されるために重要な役割を果たしています。これらのステップを順番に実行することで、Salesforceは効率的で信頼性の高いシステムとなっています。

### 資料
詳しい情報はSalesforceの公式ドキュメントを参照してください。トリガーの実行順序についての詳細な説明が記載されています。

https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_triggers_order_of_execution.htm

この記事が、Salesforceのトリガーについての理解を深める手助けになれば嬉しいです！
JavaScript　勉強

お疲れ様です。

今朝は少し早く起きられたので、JavaScriptの勉強を進めました。
勉強と言っても、最近全然コードを書いたりしておらず、触れられていなかったので数か月前に解いた課題をもう一度解きなおし、復習をしております:writing_hand:

最初は変数 let と定数 const を使って、四則演算する課題。
スクショはありませんが、特につまずくこともありませんでしたが本当に久々コードを書いたなーという感想でした。

次は、if文を使った課題。条件は以下の通りです。
![スクリーンショット 2024-06-23 073420.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/2fd56f75-a431-d490-19ce-ee7cfb0020d4.png)
見直したら3か月前に提出しているそうですが、おぼろげにしか覚えていませんでした…
というわけで、if文について復習しながら取り組みます。
<br>
![js.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/7b8ba43e-5927-d79d-b6f0-b2f0cc401ddd.png)
![スクリーンショット 2024-06-23 073211.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/4ddc235b-5ac1-cfdd-273b-9da5c1238cc9.png)
**||（または）**　と　**&&（かつ）**　を逆に覚えてしまっていた末路ですね:cold_sweat:
21が3と5の倍数になってしまいました…
<br>
![change.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/a6fb7252-36c3-8140-ff92-adf91f5e2cfb.png)
![スクリーンショット 2024-06-23 073343.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/f23f8d95-2c50-9c68-b82c-bea376fb7574.png)
今回、変数宣言のところで、0～30までの数字をランダム表示としていますので、「単純に15で割れたら3と5の倍数だ！」と思って書き直しました。これで、21は3と5の倍数でなくなりました。
<br>
![mihon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/b6843521-8730-72d9-a6a4-e1c58898559d.png)

最後に今回の学びですが、
画像のようなコードにすると、**if文は上から順番に判定が行われる**ため、15が「3の倍数です」と表示されてしまいます。
そのため、今回のような課題の場合は「3と5の倍数です」となるコードを一番上に持ってきた方がよいとのことでした。

また、else if の回数について疑問があったため、chatGPT先生に聞きました。
こういった教材や例文では、 else if が一度しか登場しないため、勝手に「一回しか書けないんだ」と思い込んでおりましたが、**必要なだけ使用できます**との返答をいただけたので、今回の課題も30分ほどでできました:relaxed:
思い込みはよくないなと改めて思いました。
ABC359回答メモ

# 0.はじめに
　問題が難しくなったのか自分が衰えたのか最近は
　調子があがりません。
　と、臨んだ今回ですが、ABまでで終了と2問だけのAC。
　今回はC問題の難度が高かったためかレートは-19と
　そこまで落ちず764となりました。


# 1.A - Count Takahashi
　単純に1個ずつ入力しTakahashiと
　一致した入力をカウントして最後に出力でACでした。

　https://atcoder.jp/contests/abc359/submissions/54793228


# 2.B - Couples
　リストを3個目から見ていき2個前と同じならカウントし
　最後に出力してACでした。

　https://atcoder.jp/contests/abc359/submissions/54802133


# 3. C - Tile Distance 2
　コンテスト時1時間以上悩んでもWA9個がなくせませんでした。
　コンテスト終了後解説をさらっとみてなるほどと実装しても
　結局うまくいかず、解説の実装例を見てマネしつつ
　元の自分の考えを合わせてやっとACとなりました。
　【考え方】
　　・2点をタイルの左端に合わせる
　　・2点間のX軸の距離XとY軸の距離Yを求める
　　・Y分はタイルは必ず通る
　　・XはYの1タイル分移動する際にXの1だけ移動できるので
　　　X<=Yであれば、Y個のタイルで済むのでYを出力して終了。
　　・それ以上の場合は、X軸はタイル1個で距離2個分なので
　　　X-Yを2で割った分をYに足した値を出力して終了

　https://atcoder.jp/contests/abc359/submissions/54861025


以上
lambdaレイヤーを作成する(Python3.10 psycopg2) 

## Python3.8 サポート終了
[こちらの記事](https://qiita.com/daiki7010/items/a2ad976b625be579a9c0)でlambda（python3.8）を使用したRDSの接続方法についての記事を書きましたが、2024年10月をもってPython3.8のサポートが終了するらしく、pythonのバージョンをあげた対応をしてみました。

## 作成するpythonのバージョン
今回は「<font color="Red">Python3.10.14</font>」で作成していきます。

## python3.10.14の理由
ランタイムを「Python３.12」、「Python３.11」それぞれ試しましたが、どちらも下記のエラーとなってしまいました。
```
import module 'lambda_function': No module named 'psycopg2._psycopg'
```

[AWSドキュメント](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html)ではPython3.12もサポートされているようですが、これはおそらくランタイム「Amazon　Linux2023」の場合だと想定

ランタイム「python3.x」はAmazon Linux2 なんだと思います。

Python3.11がダメな理由は・・・なんだろう？
いつかリベンジしたいと思いますが、今回は3.10で

## 手順

### 1.Amazon Linux 2のDockerコンテナ起動
```
docker run -it amazonlinux:2 /bin/bash
```

### 2.OpenSSL 1.1インストール
```
yum update -y
yum install -y openssl11 openssl11-devel
```

### 3.開発ツールインストール
※GCCやMakeに必要です
```
yum groupinstall -y "Development Tools"
```

### 4.開発ライブラリとwgetインストール
```
yum install -y bzip2-devel libffi-devel zlib-devel wget
```

### 5.Pythonダウンロード
```
cd /usr/src
wget https://www.python.org/ftp/python/3.10.14/Python-3.10.14.tgz
tar xzf Python-3.10.14.tgz
cd Python-3.10.14
./configure --enable-optimizations
make altinstall
```

### ６.PostgreSQLの開発パッケージをインストール
```
yum install -y postgresql-devel
```

### ７.Lambdaレイヤーのディレクトリ作成
```
mkdir -p /opt/python/lib/python3.10/site-packages
```
※AWS Lambdaは、レイヤーをデプロイする際に、この特定のディレクトリ構造（python/lib/python3.x(ランタイム)/site-packages）を期待しています。この構造に従うことで、Lambda関数が実行時に自動的にこれらのライブラリを読み込むことが可能となる


### 8.psycopg2インストール
```
python3.10 -m pip install aws-psycopg2 -t /opt/python/lib/python3.10/site-packages
```
:::note warn
ポイントは<font color="Red">aws-psycopg2</font>にすることです。
psycopg2だと↓のエラーになってしまいました

import module 'lambda_function': No module named 'psycopg2._psycopg'
:::

### ９.アップロード用のzipファイルを作成
```
cd /opt
zip -r /opt/psycopg2_layer.zip python
```

以上です。

作成したlambdaレイヤーのアップロード方法等は[こちらの記事](https://qiita.com/daiki7010/items/52f53c11b608cec6f931)も参考にしてみてください
Javaで「配列の要素を逆順に並び替える」の動作を確認してみた

# 概要

Javaで「配列の要素を逆順に並び替える」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/array/index15.html

# 実装

以下のファイルを作成しました。
```JSample15_1.java
import java.util.Arrays;

class JSample15_1{
  public static void main(String[] args){
    int[] src = {12, 24, 18, 31, 17};
    System.out.println(Arrays.toString(src));

    for (int f = 0, l = src.length - 1; f < l; f++, l--){
      int temp = src[f];
      src[f]  = src[l];
      src[l] = temp;
    }

    System.out.println(Arrays.toString(src));
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample15_1.java 
$ java JSample15_1 
[12, 24, 18, 31, 17]
[17, 31, 18, 24, 12]
```

# まとめ

何かの役に立てばと。
【2024マラソン07】immersedでタイピング練習をしたらとても集中できてよかった話

immersedでタイピング練習をしたらVR特有の没入感 x 手元を強制的に見れない仕様
……によって、タイピング練習がとてつもなく捗ったので紹介します。
# 誰向け？ どんな役にたつ？
- VR機器を持っていてタイピング練習をしたい人
- タイピング中に手元を見ないようにしたい人
- タイピングに集中したい人
- immersedのおすすめの使い方を知りたい人

# あらすじ
## immersedとは

quest2で使えるバーチャルデスクトップアプリです。
詳しくは下記記事にて。

https://qiita.com/c9h11o2/items/a05db8489d22dd78fede

# 具体的に何を使ったか
- immersed
- e-typing
- HHKB
- iPad or PC（スマホでも行けるかも？）

# 何をやったか
immersedで接続し、VR空間でタイピング練習する。以上！

# オススメポイント
- VR空間=タイピングだけに集中できる
- キーボードが見えない為ブラインドタッチが捗る
- キーボードの打鍵感や手と各キーの距離や感覚だけに集中できる
- タイピング中の空間を気に入ったものにできる


# デメリット、できなかったことなど
- 手元を見ずにタイピングするのがおぼつかないレベルだとストレスが溜まる
- ショートカットキーなども覚えていないと操作がまごつく
アニメ一覧APIでアニメ情報を取得をする


# はじめに

こんにちは、エンジニアのkeitaMaxです。

今回はAnnictというサービスを使用してアニメの一覧を取得してみようと思います。

https://annict.com

# Annictとは
>Annict (アニクト) は、アニメの視聴記録ができるWebサービスです。
何話まで見たかを記録したり、友達の視聴記録などから好きなアニメを見つけて、管理することができます。
(引用:https://annict.com)

# 新規登録

以下のURLで新規登録をします。

https://annict.com/sign_up

# APIKEYの取得

以下のドキュメントに記載してあるように、APIKeyの登録をして取得します。

https://developers.annict.com/docs/authentication/personal-access-token

# APIを叩く

取得したAPIKeyを以下のように付与するとAPIを叩くことができます。

Talendを使用して叩いてみました。

![スクリーンショット 2024-06-22 10.13.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715123/25286824-9e0e-2519-51b1-cb7093bd6f7e.png)

```
URL: 
    https://api.annict.com/v1/works
Headers: 
    Authorization: Bearer xxxxxxxxxxxxxxxxxx //取得したAPIKey
```
すると以下のような感じで取得しできていることがわかります。

![スクリーンショット 2024-06-22 10.16.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715123/73bc2d2e-658f-4878-f437-485ebedd7417.png)

また、２０２４年春に放送したアニメを一覧で撮りたい時は、以下のようなURLでAPIを叩くと取得することができます。

```
https://api.annict.com/v1/works?filter_season=2024-spring
```

# おわりに

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！

# 参考

https://developers.annict.com/docs/rest-api/v1

# 次の記事

https://qiita.com/keitaMax/private/19dd4c4fde030dec1011
SL に PBR Material がきた　座ったオブジェクトを消そう

以下表題ご参考まで
旧来の Blinn-Phong Shading マテリアル と PBR マテリアルを一緒に透過設定するという感じ
```LS
string org_pbr_uuid ="";
string alpha_pbr_uuid ="7472bcba-5923-cf0b-4b9f-c6d8d397ceef";

default {
    state_entry(){
        org_pbr_uuid = llGetRenderMaterial(0);
        llSitTarget(<0.0, 0.0, 0.5>, ZERO_ROTATION);
    }
    changed(integer change){
        if (change & CHANGED_LINK) {
            key av = llAvatarOnSitTarget();
            if (av != NULL_KEY) {
                llSetAlpha(0,ALL_SIDES);
                llSetRenderMaterial(alpha_pbr_uuid, ALL_SIDES);
            } else {
                llSetAlpha(1,ALL_SIDES);
                llSetRenderMaterial(org_pbr_uuid, ALL_SIDES);
            }
        }
    }
}
```
https://gyazo.com/55a5c108208f14bccae591e1e252a7fc
ファイルアクセスエラーを一度に解決したい！

# ファイルアクセスエラーをはくファイルが複数あります

ファイルをひらくときにエラーが発生します。アクセスの許可がおかしくなりました。
いろいろと相談した結果、パワーシェルを管理者権限で実行し、エラーファイルの
Fullパスを指定すると、問題解決するところまでたどりつきました。

そのときのワンライナーコードが次のものです。

```
$filePath = "C:\\Path\\ToFile.txt"; 
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule("Authenticated Users", "FullControl", "Allow");
$acl = Get-Acl $filePath; 
$acl.AddAccessRule($rule); 
Set-Acl $filePath $acl
```

# そういうファイルが複数あるとき

問題のファイルが複数あるとき、どうすればいいのでしょうか？
あるフォルダーの下のファイルがすべてそういう問題ファイルなら
ワイルドカードでいけるとおもいます。
しかしじっさいはそうではないです。
正常なのもあれば、異常なのもあります。

## 異常なファイルだけを一か所に集めればいい？

そういうファイルだけをあたらしく作ったフォルダーの下に集めればいいのでしょうか？
そうすればワイルドカードつかえるので、上記のコードを少し改変するだけで
いけますかね？
SQL Serverでテーブルを指定せず列のみを記述した場合の型の正体を知る

# はじめに
**SQL Serverに限った話ではありませんが**、テーブルを指定せずSELECTだけでもクエリを実行することができます。

通常、From句でテーブルを指定してデータ出力する場合、テーブル列の型で出力されますが、下記クエリの場合でも、SQL Serverが出力可能な型を選択して出力してくれます。

#### サンプルクエリ

```SQL
SELECT
 0      AS Num_A
,1 + 1  AS Num_B
,0.1    AS Num_C
,'abc'  AS Str_A
,N'def' AS Str_B
```

#### 結果

| Num_A | Num_B | Num_C | Str_A | Str_B |
|-------|-------|-------|-------|-------|
| 0     | 2     | 0.1   | abc   | def   |

# 各列の型を知る
SQL Server Management Studioで各列の型を知る場合、1段階ネストして列名にフォーカスを当てるとポップアップで列の型が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119455/ba0cd5ef-f5db-1cae-4603-62d2d67326d3.png)

その他、VIEWを作成しても同様の事が行えます。

#### サンプルクエリ

各列の型をコメントに記載しています。

```SQL
SELECT
 X.Num_A -- INT
,X.Num_B -- INT
,X.Num_C -- NUMERIC
,X.Str_A -- VARCHAR
,X.Str_B -- NVARCHAR
FROM
(
  SELECT
   0      AS Num_A
  ,1 + 1  AS Num_B
  ,0.1    AS Num_C
  ,'abc'  AS Str_A
  ,N'def' AS Str_B
) AS X
```

## 明示的に型を指定する
CONVERTで型を明示的に指定します。

```SQL
SELECT
 CONVERT(INT,1)          AS INT_A
,CONVERT(NVARCHAR,'abc') AS NVARCHAR_A
```

# おまけ
SQL Serverで以下のクエリを投げると、1件のデータが返ってきます。

```SQL
SELECT COUNT(*)
```

| (列名なし) |
|------------|
| 1          |

OracleのDUALの様な挙動をするので実行計画で見てみると、テーブル指定をしてないのにテーブルスキャンを行っていました（これが1の正体か不明）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119455/44b9eb42-d359-1a00-47f5-5649d937f0bd.png)
体育科出身の僕がLeetCode入門してみた - Day1 2667. Create Hello World Function

# 概要
文系（体育科）卒業の僕が、人並みのアルゴリズムを身につけるためにLeetCodeを初めてみました。
日本だとAtCoderが一般的なようですが、海外エンジニアへの憧れを持つ僕はLeetCodeを選びました。

フロントの言語しかほぼ触ったことがないのでJavaScriptでやっていこうと思います。

## 問題
[2667. Create Hello World Function](https://leetcode.com/problems/create-hello-world-function/description/?envType=study-plan-v2&envId=30-days-of-javascript)

問題文
>Write a function createHelloWorld. It should return a new function that always returns "Hello World".

初期コード
```javascript
/**
 * @return {Function}
 */
var createHelloWorld = function() {
    
    return function(...args) {
        
    }
};

/**
 * const f = createHelloWorld();
 * f(); // "Hello World"
 */
```
常に"Hello World"をリターンする新しい関数をリターンする`createHelloWorld`を作れば良さそうです。
実際に値を入れてみたケースも例として出ています。
![CleanShot 2024-06-23 at 04.50.44@2x.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/ea0dc968-7cbc-c84d-452b-ce183010e2dc.jpeg)

流石に初見の僕でもこれは解けそう...!
今回は引数は関係ないのでとりあえずreturnを追加すればいいんじゃない？と思ったので下記のようにしてみた。

```diff:javascript
var createHelloWorld = function() {
    
    return function(...args) {
+        return "Hello World"        
    }
};
```

Submitボタンを押すと...どうやら成功したようです。
例1の空の配列を渡すケース、例2の`[{},null,42]`を渡すコードでテストがされるようです。

成功すると自分の順位が出るようです。

![CleanShot 2024-06-23 at 04.59.00@2x.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/a92812a7-49ef-0587-37f0-c13a16b31770.jpeg)
UE5.4 キャラクターの複数視点切り替え

# 目的
　UE5.4にてキャラクターの視点をボタン操作で切り替える

# 環境
### バージョン等
|種別|概要|バージョン|
|:--:|:--:|:--:|
|OS|Mac|M1 2020/Sonoma 14.4.1|
|Engine|UnrealEngine|UE5.4.2|
|テンプレート|ThardParthon| -|
|Plugin| - | -|

### 階層
```
root/
└Content
    └BluePrint
     ├BP_Character ※キャラクターのブループリント定義ファイル
     ├GM_Defoult ※ゲームモード設定ファイル
     └Input　
      ├IMC_DF ※キャラクターの入力マッピングコンテキスト 
    　  └Change
      　　　 └ IA_SwitchCamera ※カメラ用入力アセット
```
# 手順

### [1] キャラクターへ視点カメラの追加
[1] コンテンツブラウザから「BP_Character」をダブルクリックして編集ビューを表示
[2] コンポーネントパネルから「BP_Character(Self)」→「Capsule Component」→「CameraBoom」配下にカメラコンポーネントを追加
[3]GUIエリアにて好みの視点になるように[2]で追加したカメラコンポーネントを設置
[4]各カメラコンポーネントの詳細タブにて「Auto Activate」パラメータからチェックを外す

![スクリーンショット 2024-06-23 3.59.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3711564/c7def7ca-9be6-95eb-5044-a6028816d847.png)


### [2] カメラ用入力アセットの作成
[1]コンテキストブラウザから「追加」→「入力」→「入力アセット」にてカメラ用の入力アセットを作成
[2]カメラ用入力アセットの編集画面を表示し、「詳細」タブから下記パラメータを修正
#### パラメータ
「アクション」→「Value Type」：~~Axis2D(Vector2D)~~ Digtal(bool) ※押下されたかの判定のみのため　boolに変更
「アクション」→「Triggers」：タップ ※設定しないとアクションが安定しない。押下後キャンセルしたい時用に「タップ」を設定した![スクリーンショット 2024-06-23 22.43.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3711564/c1c13823-9cf6-07f1-2b9b-b8540824f81a.png)




### [3]キャラクターの入力マッピングコンテキストの修正
[1]コンテキストブラウザからキャラクターの入力マッピングコンテキストを展開。
[2]「詳細」タブ→「マッピング」→「Mapping」にセットアクションを追加。対象をカメラ用入力アセットと選択し下記パラメータを設定
#### パラメータ
入力トリガー: キーボード　C　※任意のボタンを選択
Setting Belaviar:Inherit Settings from Action

![スクリーンショット 2024-06-23 4.16.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3711564/11db6670-8097-e331-3ad3-0c885f3ba760.png)

### [4]カメラ切り替え処理の実装
[1]コンテンツブラウザからキャラクター用ブループリントを開く
[2]「イベントグラフ」を開き下記ノードを追加
#### 追加ノード
|ノード名|種別|用途|
|:--:|:--:|:--:|
|EnhancedInputAction IA_SwitchCamera|イベント|カメラ切り替え処理の入力イベント|
|Flip Flop|フローコントロール| 単一のイベントを特定の処理に交互に振り分ける|
|set active(*)|コンポーネント|カメラコンポーネントの有効無効のパラメータ格納変数|
|Use Controller Rotation Yaw| ボーン変数|ボーンへの回転操作の有効無効パラメータ格納変数|

[3]各ノードをキャプチャのように接続
![スクリーンショット 2024-06-23 4.45.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3711564/2ffc04d6-a606-c91b-654b-70c01ca8de97.png)

以上

# 課題
### [1]視点を切り替える際に一人称視点が入り込む
####　概要
    視点切り替えを行なった際、一人称視点がワンクッション入り込む
    想定：[三人称視点]→[一人称視点]→[自撮り視点]→[三人称視点]...
    現在：[三人称視点]→[一人称視点]→[自撮り視点]→[一人称視点]→[三人称視点]...

#### 原因
    　切り替え処理をイベントグラフで「Flip Flap」関数を入れ子にして実装したため。
     当関数は２つの処理コンポーネント処理を交互に行うコンポーネントであるため

# 予定する更改
・課題[1]の解消
・UIからの視点切り替え実装
・Clientにてスケルトンメッシュを変更してもカメラ切り替え処理が利用できる
2024/6/23主にITとかセキュリティの記事

政府、大規模SNS事業者に「偽広告」への対応強化を要請
https://www.security-next.com/158764

「Rancher」にセキュリティアップデート - 複数脆弱性を修正
https://www.security-next.com/158725

個人情報漏洩などの報告処理、前年比約1.7倍に - 指導や助言も大幅増
https://www.security-next.com/158247

東芝テックや沖電気の複合機、脆弱性43件が明らかに
https://www.security-next.com/158735

メールアカウントが乗っ取り被害、大量のスパム配信 - 三重県文化振興事業団
https://www.security-next.com/158634

SonicWall製機器の「VPN」などにDoS脆弱性 - アップデートで修正
https://www.security-next.com/158731

講演会の申込フォームの設定ミス、個人情報が閲覧可能に - お茶の水女子大
https://www.security-next.com/158742

セキュリティアドバイザリのレーティングを引き上げ - Zoom
https://www.security-next.com/158723

JAXAに複数回のサイバー攻撃、情報流出の可能性も(6/21)
https://xtech.nikkei.com/atcl/nxt/news/24/01043/
ER図作図のお勉強に良いツールDraw.ioを見つけた

# 概要
データベーススペシャリスト試験を今年の秋に受験しようと考えています。データベーススペシャリストの最大の難関は矢張りER図の作図(通称：お絵かき)だと思います。試験対策時は手書きでER図をせっせと練習するにしても、ER図のお勉強時にも手書きは少し骨が折れます。サクサク描けるツールはないかと探していた所、Draw.ioという良いツールを見つけました。

# 参考にしたWebページ
ER図の描き方を解説した専門書を購入した時にER図をお絵かきするソフトの体験版が付属していました。しかし、バージョンが古い上に、Windowsのみの対応、体験版のため期間限定など本当にお試しソフトでした。よって、Macでも利用できて、無料で利用可能なツールはないものかと探してみることにしました。以下のページは説明が詳しく参考になりました。

https://gitmind.com/jp/er-diagram-tool-free.html

https://www.itreview.jp/categories/er-diagram-creation-tool?page=2&sort=review_num_desc

# Draw.ioに決定
筆者はDraw.ioを使ってみることにしました。[Web版](https://app.diagrams.net/?src=about)ですぐに始められます。登録は不要で無料です。筆者はアプリ版をダウンロードして利用することにしました。実際に少し操作してみましたが、直感的なUIで使い易い印象を受けました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/7c0542ba-6d72-3204-e981-ea9641bbf6a5.png)


アプリ版のダウンロードは以下から可能です。

https://www.drawio.com/

どうやら、Visual Studio Code(VSCode)上で作図が出来るプラグインも有る様です。

https://marketplace.visualstudio.com/items?itemName=hediet.vscode-drawio

# まとめ
Draw.ioを活用してデータベーススペシャリストのER図お絵かきのお勉強をやってみようと思います。実際に使ってみての気付き等は、今後別記事で取り上げるかもしれません。
Heroku + Rails + S3 Google Search Console で「サイトマップを読み込めませんでした」を解消する

# 背景
herokuで動かしている web ページのサイトマップをGoogle Search Console で登録したい。

※ Herokuのダイナモはエフェメラル（一時的）ファイルシステムを採用しているため、デプロイごとにリセットされます。そのため、サイトマップのような定期的に更新されるファイルは、Heroku上で直接生成しても、次のデプロイ時に消えてしまいます。そのため、永続的なストレージへの保存（例えばAmazon S3など）が必要になります。

> Storing static files elsewhere is crucial for Heroku apps since dynos have an ephemeral filesystem. Whenever you replace a dyno or when it restarts, which happens daily, all files that aren’t part of your application’s slug are lost. Use a storage solution like S3 to offload the storage of static files from your app.

https://devcenter.heroku.com/articles/s3

下記のような色んな参考記事が出てきますが、

https://qiita.com/you8/items/71a07ada6fd8661b5ddb

https://qiita.com/d0ne1s/items/6a12f537e47d65d626d8

Googl Search Consoleのサイトマップ登録では、/sitemap で S3 の sitemap.xml.gz ヘリダイレクトがうまくいかずに失敗しているようでした。

# 原因
Amazon S3 のパス形式の URL を使っていることが原因でした。

> 現在、Amazon S3 はすべての AWS リージョンで仮想ホスト スタイルとパス スタイルの両方の URL アクセスをサポートしています。ただし、パス スタイルの URL は将来廃止される予定です。詳細については、次の重要な注意事項を参照してください。

https://docs.aws.amazon.com/AmazonS3/latest/userguide/VirtualHosting.html

[Virtual Hosted-Style URL](https://docs.aws.amazon.com/AmazonS3/latest/userguide/VirtualHosting.html)を使用することで、解決しました。

```diff:route.rb
- get '/sitemap', to: redirect("https://s3-ap-northeast-1.amazonaws.com/#{バケット名}/sitemaps/sitemap.xml.gz")
+ get '/sitemap', to: redirect("https://#{バケット名}.s3.ap-northeast-1.amazonaws.com/sitemaps/sitemap.xml.gz")
```
もとの状態でも正常にサイトマップのダウンロードがうまくいくので、気付くまでとても時間がかかりました。
Pythonでキューを list, deque で実装したときの速度比較

# Pythonでキューを実装

キューを実装したときパフォーマンスを比較するため、次の5パターンを用意した

1. dequeを使ってpopleft→append
1. dequeを使ってappend→popleft
1. dequeを使ってmaxlen指定でappend
1. listでpop→append
1. listでappend→pop

### コード

```python
import timeit
from collections import deque

import matplotlib.pyplot as plt
import numpy as np

LIST_LEN = 10**8
APPEND_REP = 10**6
LOOP = 15

def que_test1(list_len=LIST_LEN, append_rep=APPEND_REP):
    que = deque([.0]*list_len)
    for i in range(append_rep-1):
        que.popleft()
        que.append(i)

def que_test2(list_len=LIST_LEN, append_rep=APPEND_REP):
    que = deque([.0]*list_len)
    for i in range(append_rep-1):
        que.append(i)
        que.popleft()

def que_test3(list_len=LIST_LEN, append_rep=APPEND_REP):
    que = deque([.0]*list_len, maxlen=list_len)
    for i in range(append_rep-1):
        que.append(i)

def lst_test1(list_len=LIST_LEN, append_rep=APPEND_REP):
    lst = [.0]*list_len
    for i in range(append_rep-1):
        lst.pop(0)
        lst.append(i)

def lst_test2(list_len=LIST_LEN, append_rep=APPEND_REP):
    lst = [.0]*list_len
    for i in range(append_rep-1):
        lst.append(i)
        lst.pop(0)
```

## 条件
キューの長さとアペンドの回数を $10^0$ - $10^5$ で条件を振って計算した

### コード

```python
r_list = list(range(0, 6))
l_list = list(range(0, 6))
funcs = [que_test1, que_test2, que_test3, lst_test1, lst_test2]

time_arr = np.zeros((len(r_list), len(l_list), len(funcs)))

for i, r in enumerate(r_list):
    def get_time(f, list_len, append_rep):
        return timeit.timeit(lambda: f(list_len, append_rep), number=LOOP)/LOOP

    for k, func in enumerate(funcs):
        for j, l in enumerate(l_list):
            print(f"{func.__name__}(append_rep={r}, list_len={l})")
            time_arr[i,j,k] = get_time(f=func, list_len=10**l, append_rep=10**r)
```

## 結果

### アペンド回数を固定したときの各キュー長でのパフォーマンス

ただし`Append times: 10**0`のときアペンド回数は0回（イニシャルだけ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662712/bc1f6bef-1565-ada6-9bf6-1c24d18f3ee8.png)

アペンド回数0回のときはイニシャルコストの関係でdequeが遅い
しかし、アペンド回数が少しでも多いと明確にdequeが速い


### キュー長を固定したときの各アペンド回数でのパフォーマンス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662712/2dac41ce-83c5-1772-afe2-4bd3af3432d9.png)

先ほどの結果のグラフの描画を変更した図

deque を用いたときが速いがその中でも固定長の場合は maxlen を指定することでより高速
pop と append の順場は deque の場合 apopend を先にしたほうが若干速いようだ

list は直感的には pop を先にしたほうが速いが、誤差もあり定まらなかった

## 文献

> Deque はどちらの側からも append と pop が可能で、スレッドセーフでメモリ効率がよく、どちらの方向からもおよそ O(1) のパフォーマンスで実行できます。
> list オブジェクトでも同様の操作を実現できますが、これは高速な固定長の操作に特化されており、基礎のデータ表現形式のサイズと位置を両方変えるような pop(0) や insert(0, v) などの操作ではメモリ移動のために O(n) のコストを必要とします。
> https://docs.python.org/ja/3/library/collections.html#collections.deque
システムインフラを勉強するために何を準備すればいいだろうか

## ・たまにはこういう記事もいいかも
筆者は、Qiitaを備忘録として活用している。
備忘録とは、自分が忘れないようにするため・・・という前置きを置いて自分が困っているのだからほかの人も困っているだろうの精神で解決方法を書くエンジニアの文化である。

備忘録は全エンジニアにとっての生命線であり、誰かの備忘録は時を超えて自分を救ってくれる。
筆者は、多大な恩を受けたからにはその恩に対して自ら備忘録を書くという形で報いたいと考えている。

##
時に、筆者は常日頃から、インフラを勉強する機会が少ないと考えている。
「スクールに通えば経験ゼロでもエンジニアに！」なんて言うものが目につくがそれはプログラマーやデザイナー向けのものがほとんどである。

せっかく「Qiita Engineer Festa 2024」がやっているんだから今日は備忘録から離れてインフラエンジニアの勉強方法について、少しだけ解説していくことにする。

### ・この記事の注記
この記事では細かな手順を記載しない。あくまで考え方を説明する記事である。
気になった単語があれば、Googleの検索窓に入力してみることをお勧めする。

## ・インフラエンジニアに必要なもの
システムインフラを仕事で扱うために必要なものは実はあまりない。
結局のところ、
1.Officeシリーズ
2.エディタ
3.SSHソフト
4.ブラウザ
5.リモートデスクトップ接続
6.サーバー(オンプレの仕事であれば)
7.ネットワーク機器(ネットワークの仕事であれば)
があれば仕事は完ぺきに遂行ができる。

## ・じゃあ勉強するために必要なものは？
以上が仕事をするために必要なものであるがじゃあ勉強に必要なものは？と聞かれたらOfficeは設計書を書くためのものなのでそれを外すとしても結局はこれなのである。
1.エディタ
2.SSHソフト
3.ブラウザ
4.リモートデスクトップ接続
5.サーバー(オンプレの仕事であれば)
6.ネットワーク機器(ネットワークの仕事であれば)
ex.ドメイン(インフラについて勉強するならドメインは用意したほうがいい。自宅で勉強するなら無料のDDNSでいい)
これだけを用意すればオンプレの勉強だってAWSなどクラウドの勉強だってネットワークの勉強だって出来てしまうわけである。

#### ・CCNAとかの資格勉強はしなくていいのかって？
初めての人は資格勉強をしたほうがいいという話を聞くが、実機を触ってから勉強すると一気にインプットが進むためぜひ実機を触ることをオススメする。

## ・ソフトは安いし分かった。でもサーバー機器は？
さあ勉強しよう！となってもオンプレサーバーやネットワーク機器は高いしクラウドは月額がかかるんでしょ？と思われるかもしれない。
たしかに業務用サーバー機器は高い。平気で何百万円もする。でもサーバーというのは「serve」つまりサービスを「提供」すればサーバーである。Minecraftのサーバーをパソコンで立てれば立派なサーバーである。

だから低スペックのPCを買ってそれをサーバーとして勉強に使用する！とするのが一番コスパいいわけである。（筆者はよくベアボーンPCやラズパイを推奨している）

だからと言ってそのPCがWindows11では意味がない。業務で使用するサーバにWindows11を入れることは無い。(シンクライアントのホストサーバは除く)

この世のサーバはWindowsServerやRed Hat Enterprise Linux(RHEL)で動いている。WindowsServerはOSだけで10万以上するから、まぁ勉強にRHEL(無料)を買ったPCに入れてみる。

これだけであなたは **「自分でサーバを構築した」** と言い張れるわけである。

#### ・ネットワーク
ネットワーク機器もCISCOやYAMAHAのルーター・スイッチを見てみれば、やっぱり「うっ」となる金額である。

だが、よくよく考えてみてほしい。ルーターは各家庭にあるではないか。あれも立派なルーターである。
十分ネットワークについて勉強することが出来る。

深くネットワークについて勉強したいならヤフオクに行くことをお勧めする。駆け出しでも十分出せるような1万円未満で機器が売っている。

## ・じゃあクラウドは？
ここまでの説明はオンプレに関する記載であったがではクラウドはどうだろうか？

実はオンプレと考え方は変わらない。
安いプランを契約して、サーバー用のOSを入れればいいだけである。それで完成だ。

## ・機器をそろえたぞ！何をすればいい？
機器を揃えたらいよいよ勉強が出来る。
しかし、システムインフラというのは「インフラを勉強をする！」というやり方では**勉強を行うことが出来ない。**

なぜなら先ほども言ったがサーバは「Serve」つまりサービスを提供しなければ意味がない。
だから、「～のサービスを提供するために仕組みを勉強する！」という気持ちで臨まなければならない。

サービスと言っても色々あるが代表例で言えば、
・自分だけのメールサービスを立ててみる！
・WebサイトをWebサーバから立てて運用してみたい！
・ファイルサーバを作っていろんなものを入れたい！
・GitHubは恥ずかしいから自分専用のGitに仕舞いたい！
・Twitterみたいな自由にイラストを投稿したり交流できるSNSであるMisskeyを運用したい！[PR]
などなど、挙げればキリがないがこれらをどんどんと叶えていった結果、体に染みつくのがインフラの勉強方法だと筆者は思っている。

## ・終わりに
以上がシステムインフラの勉強を開始するまでのささやかな解説である。
どちらかと言えば日記のようになってしまったがまあ仕方ない。
「Qiita engineer-festa 2024」に浮かれて書きなぐったのだから多めに見てもらえるとありがたい。

そして未来のインフラエンジニアが、筆者が備忘で書いた他記事の備忘録に恩を感じる日が来たらとても素晴らしいことである。