OmniAICreator/Qiita-1.07M huggingface dataset:
Seeed の物理AIエージェントデバイス「SenseCAP Watcher W1-A」の APIキーを PC で扱う【機械学習-2】

この記事は 12/31 に書いたのですが、後から「[機械学習 Advent Calendar 2024](https://qiita.com/advent-calendar/2024/machine-learning)」で空きがあった 11日に後から登録してみました。
　
内容は、以下の記事を書いた際にも扱ったデバイス「[Seeedさんの SenseCAP Watcher W1-A](https://wiki.seeedstudio.com/watcher/)」関連です。[スイッチサイエンスさんのサイト](https://www.switch-science.com/products/10010)で「カメラ、マイク、スピーカーを備えた物理AIエージェント」と紹介されているデバイスになります。

●Seeed の「SenseCAP Watcher W1-A」を使い始めるための情報を集めてみる【電子工作】 - Qiita
　https://qiita.com/youtoy/items/6fba4f9462eb5ec788e2

ちなみに、機械学習のアドベントカレンダーに登録した記事としては 2つ目で、1つ目は以下を登録していました。

●「Phi-3 with ONNX Runtime」をブラウザで手軽に試す（Hugging Face Spaces にて）【機械学習】 - Qiita
　https://qiita.com/youtoy/items/103defd54ae22df0ce07

## はじめに
この「SenseCAP Watcher W1-A」は、デバイス上で AI・機械学習を使った処理が行えたり、外部の LLM を組み合わせた処理が行えたりするデバイスです。

また、それ以外にも外部との API を介したやりとりも行えます。

### Node-RED を使った外部との連携
外部連携について、例えば公式の情報で以下のように Node-RED を使った事例があります。

●SenseCAP WatcherのHTTP Push Notificationを試してみた - Seeed K.K. エンジニアブログ
　https://lab.seeed.co.jp/entry/2024/12/28/120000

●Watcher to Node-RED | Seeed Studio Wiki
　https://wiki.seeedstudio.com/watcher_to_node_red/

これらの手順では、スマホで扱える専用アプリ上で APIキーを発行します。

![IMG_0668.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/fd91a706-2b20-430b-75c6-3ca9f95cfb01.jpeg)

これを PC上で行えないかというのを探してみたのが、今回の記事を書くに到った発端の出来事です。

## 今回の本題
今回の本題について、上記の Node-RED を使った手順に出てきているノードの情報をたどると、わりと簡単に知ることができました。

### PC からも APIキーを扱えるポータル
先に PC からも APIキーを扱えるポータルと、そのポータル内での項目を掲載します。

ポータルの URL は「こちら ⇒ https://sensecap.seeed.cc/portal/ 」です。
このサイトでログインを求められますが「SenseCAP Watcher W1-A」を使い始める際に、スマホアプリで作ったものを使えば OK です。

そのポータル内の、以下の赤矢印で示したメニューを選ぶと APIキーを扱えるところにたどり着けました。

![2024-12-31_15-41-39.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/72d3c2ed-c1a4-53f3-668b-369d27d7a906.jpeg)

直リンクの URL は以下になります。

●Security Credentials(API key) - SenseCAP CC Portal
　https://sensecap.seeed.cc/portal/#/security

#### 情報源
上記のポータルにたどり着いた情報源は以下です。

●node-red-sensecap-paas (node) - Node-RED
　https://flows.nodered.org/node/node-red-sensecap-paas

この中の「SenseCAP OpenStream API Quickstart」というリンクをたどった先に情報がありました。

![2024-12-31_16-01-28.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/bb80d2fe-51ca-d5f6-eb00-fecb8fbb6749.jpeg)

具体的には、以下のクイックスタートの「SenseCAP Portal」という記載です。

●SenseCAP API Document
　https://sensecap-docs.seeed.cc/data_openstream_quickstart.html

![2024-12-31_16-02-47.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/fa73404f-4ab1-bf0c-5a07-d6b3d3db85ef.jpeg)

このキーワードで検索したことで、以下のダッシュボードのページなどにたどり着けました。

●Dashboard - SenseCAP CC Portal
　https://sensecap.seeed.cc/portal/#/dashboard

これで、「SenseCAP Watcher W1-A」を使った開発が便利に行えそうです。

## 余談
この記事を書いているのは、以下の [#大晦日ハッカソン 2024](https://omisoka-hackathon.connpass.com/event/340543/) に高速バス内で参加している途中だったりしました。

https://x.com/youtoy/status/1873963176876032188

https://x.com/youtoy/status/1873955397465510084
AWS Configの使い道

AWS認定試験を受験するエンジニアの皆様に役立つAWS Configの概要説明と利用例について解説します。

# AWS Configの概要
AWS Configは、AWSリソースの設定状況を継続的に監視・記録し、変更履歴を追跡するサービスです。リソースの作成、変更、削除などのイベントを検出し、リソース間の関係性や設定の詳細な情報を記録します。これにより、セキュリティ監査、コンプライアンス準拠、運用上のトラブルシューティング、変更管理などに役立ちます。また、定義済みのルールやカスタムルールを用いて、リソース設定が望ましい状態に準拠しているかを評価できます。

# AWS Configの利用が適しているケース
AWS Configは、以下のような状況で特に役立ちます。
•	コンプライアンス監査: 
例えば、「特定のセキュリティグループで特定のポートが開放されていないか」や「特定のEC2インスタンスタイプのみが使用されているか」などのコンプライアンス要件を検証する場合、Configルールを使用することで、自動的に評価し、違反があれば通知を受け取ることができます。

•	セキュリティ分析: 
例えば、「過去に特定のセキュリティグループがどのように変更されたか」や「特定のIAMユーザーがいつ作成されたか」などの情報を追跡する場合、Configの変更履歴を参照することで、詳細な情報を取得できます。これにより、セキュリティインシデントの調査や根本原因分析に役立ちます。

•	運用上のトラブルシューティング: 
例えば、「ある日突然Webサイトにアクセスできなくなった」という場合、Configの変更履歴を確認することで、問題発生前後のリソース設定の変更点を特定できます。これにより、問題の原因を迅速に特定し、復旧作業を行うことができます。

•	変更管理: 
例えば、「インフラストラクチャの変更をデプロイする前に、変更内容がポリシーに準拠しているかを確認したい」という場合、Configルールを使用して事前に検証することで、意図しない変更や設定ミスを未然に防ぐことができます。

•	インベントリ管理: 
AWS環境全体のリソース構成を把握したい場合に、Configは最新のインベントリ情報を提供します。どのリージョンにどのようなリソースが存在し、どのように構成されているのかを可視化できます。

AWS Configの主要な機能
•	リソース設定の記録: 
AWS環境内のリソースの設定情報を継続的に記録します。記録される情報には、リソースの属性、関係性、メタデータなどが含まれます。

•	リソース設定の変更履歴: 
リソース設定の変更履歴を追跡し、過去の状態を確認できます。

•	Configルール: 
定義済みのルールまたはカスタムルールを使用して、リソース設定が望ましい状態に準拠しているかを評価します。ルールに違反するリソースが検出された場合は、通知を受け取ることができます。

•	設定スナップショット: 
特定時点のリソース設定のスナップショットを取得できます。

•	設定ストリーム: 
リソース設定の変更イベントをリアルタイムでストリーム配信できます。

AWS Configルールについて
Configルールは、リソース設定が特定の条件を満たしているかどうかを評価するためのルールです。AWSが提供するマネージドルールと、ユーザーが独自に作成するカスタムルールがあります。
•	マネージドルール: 
AWSが提供する定義済みのルールです。一般的なコンプライアンス要件やセキュリティベストプラクティスに基づいたルールが多数用意されています。

•	カスタムルール: 
AWS Lambda関数を使用して独自に定義するルールです。特定の要件に合わせて柔軟にルールを作成できます。

# まとめ
AWS Configは、AWS環境のガバナンス、コンプライアンス、セキュリティ、運用管理を強化するための重要なサービスです。AWS認定試験においても、Configの基本的な概念、利用シナリオ、Configルールなどは頻出するため、しっかりと理解しておくことをお勧めします。特に、以下の点を意識して学習すると良いでしょう。
•	リソース設定の記録と変更履歴
•	Configルール（マネージドルールとカスタムルール）
•	利用シナリオ（コンプライアンス、セキュリティ、運用管理）
これらの情報を参考に、AWS環境の管理に役立ててください。

END
Amazon Inspectorの使い道

AWS認定試験を受験するエンジニアの皆様に役立つAmazon Inspectorの概要説明と利用例について解説します。

# Amazon Inspectorの概要
Amazon Inspectorは、AWSワークロードの脆弱性管理サービスです。EC2インスタンス、ECRのリポジトリにあるコンテナイメージ、Lambda関数を対象に、ソフトウェアの脆弱性や意図しないネットワーク露出を自動的に検出し、継続的にスキャンします。National Vulnerability Database (NVD)などの脆弱性データベースに基づいて脆弱性を評価し、深刻度をスコアリングします。これにより、セキュリティリスクを特定し、優先順位付けして対処することで、AWS環境のセキュリティ体制を強化できます。

# Amazon Inspectorの利用が適しているケース
Amazon Inspectorは、以下のような状況で特に役立ちます。
•	EC2インスタンスの脆弱性スキャン: 
例えば、運用中のEC2インスタンスにインストールされているOSやアプリケーションに既知の脆弱性がないかを確認する場合、Inspectorを使用することで、自動的に脆弱性を検出し、レポートを作成できます。これにより、セキュリティパッチの適用や設定変更などの対策を迅速に行うことができます。

•	コンテナイメージの脆弱性スキャン: 
例えば、ECRにプッシュされたコンテナイメージに脆弱性がないかを確認する場合、Inspectorを使用することで、イメージ内のソフトウェアパッケージをスキャンし、脆弱性を検出できます。これにより、脆弱性のあるコンテナイメージがデプロイされるのを防ぎ、アプリケーションのセキュリティを確保できます。

•	Lambda関数の脆弱性スキャン: 
例えば、Lambda関数で使用されているライブラリや依存関係に脆弱性がないかを確認する場合、Inspectorを使用することで、関数コードをスキャンし、脆弱性を検出できます。これにより、サーバーレスアプリケーションのセキュリティリスクを低減できます。

•	継続的な脆弱性管理: 
Inspectorは継続的なスキャンを提供するため、新しい脆弱性が発見された場合でも、自動的に検出して通知してくれます。これにより、常に最新のセキュリティ状況を把握し、迅速に対応することができます。

•	セキュリティコンプライアンスの遵守: 
多くのセキュリティコンプライアンス要件では、定期的な脆弱性スキャンと対応が求められます。Inspectorを使用することで、これらの要件を満たすための証跡を提供できます。

•	開発ライフサイクルへの統合: 
InspectorはAPIを通じて他のツールやCI/CDパイプラインと統合できます。これにより、開発段階からセキュリティテストを組み込み、早期に脆弱性を発見することができます。

# Amazon GuardDutyとの違い
Amazon InspectorとAmazon GuardDutyはどちらもAWSのセキュリティサービスですが、目的と対象が異なります。
•	Amazon Inspector: 
主に脆弱性の検出に焦点を当てています。EC2インスタンス、コンテナイメージ、Lambda関数内のソフトウェアの脆弱性を特定します。

•	Amazon GuardDuty: 
AWS環境全体における脅威の検出に焦点を当てています。CloudTrailログ、VPCフローログ、DNSログなどを分析し、不正アクセスやマルウェア感染などの疑いのあるアクティビティを検出します。

つまり、Inspectorは「既知の脆弱性がないか」をチェックし、GuardDutyは「不審なアクティビティがないか」をチェックします。両者を併用することで、より包括的なセキュリティ対策を実現できます。

# まとめ
Amazon Inspectorは、AWSワークロードのセキュリティを強化するための重要なツールです。AWS認定試験においても、Inspectorの基本的な概念、利用シナリオ、GuardDutyとの違いは頻出するため、しっかりと理解しておくことをお勧めします。特に、以下の点を意識して学習すると良いでしょう。
•	スキャン対象（EC2、ECR、Lambda）
•	脆弱性データベース（NVDなど）
•	継続的なスキャン
•	GuardDutyとの違い
これらの情報を参考に、AWS環境のセキュリティ向上に役立ててください。

END
Amazon GuardDutyの使い道

AWS認定試験を受験するエンジニアの皆様に役立つAmazon GuardDutyの概要説明と利用例について解説します。

# Amazon GuardDutyの概要
Amazon GuardDutyは、AWS環境における脅威検出サービスです。CloudTrailログ、VPCフローログ、DNSログ、S3データイベント、EKS監査ログなどを継続的にモニタリングし、機械学習、脅威インテリジェンス、異常検知を用いて、不正アクセス、マルウェア感染、データ流出などの疑いのあるアクティビティを検出します。サーバーレスで簡単に利用開始でき、セキュリティ運用の負荷を軽減し、AWS環境のセキュリティ状態を可視化します。

# Amazon GuardDutyの利用が適しているケース
Amazon GuardDutyは、以下のような状況で特に役立ちます。
•	不正アクセスの検出: 
例えば、「通常とは異なる場所からのAPIコール」や「不審なログイン試行」を検出することで、アカウントの乗っ取りや不正アクセスを早期に発見できます。

•	マルウェア感染の検出: 
例えば、「既知のマルウェア配布サイトへの通信」や「DNSクエリの異常」を検出することで、EC2インスタンスやコンテナがマルウェアに感染している可能性を特定できます。

•	データ流出の検出: 
例えば、「通常よりも大幅に多いデータ転送量」や「不審なS3バケットへのアクセス」を検出することで、機密データの流出を早期に発見できます。

•	暗号通貨マイニングの検出: 
例えば、「高CPU使用率が継続しているEC2インスタンス」や「マイニングプールへの通信」を検出することで、不正な暗号通貨マイニングが行われている可能性を特定できます。

•	異常なネットワークアクティビティの検出: 
例えば、「通常とは異なるポートへの通信」や「大量のポートスキャン」を検出することで、ネットワークへの攻撃や不正なアクティビティを早期に発見できます。

•	コンプライアンス要件への対応: 
多くのセキュリティコンプライアンス要件では、継続的なセキュリティモニタリングと脅威検出が求められます。GuardDutyを使用することで、これらの要件を満たすための証跡を提供できます。

# Amazon Inspectorとの違い
Amazon GuardDutyとAmazon InspectorはどちらもAWSのセキュリティサービスですが、目的と対象が異なります。
•	Amazon GuardDuty: 
AWS環境全体における脅威の検出に焦点を当てています。不正アクセス、マルウェア感染、データ流出などの疑いのあるアクティビティを検出します。

•	Amazon Inspector: 
EC2インスタンス、コンテナイメージ、Lambda関数内の脆弱性の検出に焦点を当てています。ソフトウェアの脆弱性を特定します。

GuardDutyは「環境全体で何が起こっているか」を監視し、Inspectorは「個々のリソースに脆弱性がないか」をチェックするという役割分担です。

# GuardDutyの仕組み
GuardDutyは、以下のデータソースを分析して脅威を検出します。
•	CloudTrailログ: 
AWS APIの呼び出し履歴を記録するログ。誰が、いつ、何をしたかを把握できます。

•	VPCフローログ: 
ネットワークインターフェースとの間のIPトラフィックに関する情報を記録するログ。ネットワーク通信の状況を把握できます。

•	DNSログ: 
DNSクエリに関する情報を記録するログ。ドメイン名解決の状況を把握できます。

•	S3データイベント: 
S3バケット内のオブジェクトへのアクセス状況を記録するログ。データへのアクセス状況を把握できます。

•	EKS監査ログ: 
Amazon EKSクラスター内で行われたAPIコールの記録。Kubernetes環境でのアクティビティを把握できます。

これらのログを機械学習、脅威インテリジェンス、異常検知などの技術を用いて分析し、脅威を検出します。検出された脅威は「検出結果」としてGuardDutyコンソールに表示され、詳細な情報や推奨される対応策を確認できます。また、CloudWatch Eventsと連携することで、検出結果に基づいて自動的に対応を行うことも可能です。

# まとめ
Amazon GuardDutyは、AWS環境のセキュリティを維持するために不可欠なサービスです。AWS認定試験においても、GuardDutyの基本的な概念、利用シナリオ、Inspectorとの違い、仕組みなどは頻出するため、しっかりと理解しておくことをお勧めします。特に、以下の点を意識して学習すると良いでしょう。
•	検出対象（不正アクセス、マルウェア、データ流出など）
•	データソース（CloudTrail、VPCフローログ、DNSログ、S3データイベント、EKS監査ログ）
•	Inspectorとの違い
これらの情報を参考に、AWS環境のセキュリティ向上に役立ててください。

END
AWS Trusted Advisorの使い道

AWS認定試験を受験するエンジニアの皆様に役立つTrusted Advisorの概要説明と利用例について解説します。

# Trusted Advisorの概要
AWS Trusted Advisorは、AWSのベストプラクティスに基づいてAWSアカウントを分析し、コスト最適化、パフォーマンス向上、セキュリティ強化、耐障害性向上、およびサービスクォータの確認に関する推奨事項を提供するサービスです。具体的には、未使用のEC2インスタンス、アイドル状態のEBSボリューム、セキュリティグループの過剰なアクセス許可などを検出し、改善策を提案します。これにより、AWS環境の効率性、安全性、信頼性を向上させることができます。基本チェックはすべてのユーザーが利用でき、有料のビジネスまたはエンタープライズサポートプランではより詳細なチェックが利用可能です。

# Trusted Advisorの利用が適しているケース
Trusted Advisorは、以下のような状況で特に役立ちます。
•	コスト削減: 
例えば、「アイドル状態のEC2インスタンス」や「アタッチされていないEBSボリューム」を検出することで、不要なリソースの削除を推奨し、コスト削減に貢献します。また、「予約インスタンスの最適化」を提案することで、オンデマンドインスタンスよりも安価な予約インスタンスの活用を促進します。

•	パフォーマンス向上: 
例えば、「使用率の低いEC2インスタンス」を検出することで、インスタンスタイプの変更やスケールアップ/ダウンを推奨し、パフォーマンスの最適化に貢献します。また、「高負荷のEC2インスタンス」を検出することで、負荷分散の改善やインスタンスのスケールアウトを推奨します。

•	セキュリティ強化: 
例えば、「セキュリティグループの過剰なアクセス許可」を検出することで、不要なポートの開放を制限し、セキュリティリスクを低減します。また、「MFAが有効になっていないルートアカウント」を検出することで、多要素認証の有効化を推奨し、アカウントのセキュリティを強化します。

•	耐障害性向上: 
例えば、「単一のアベイラビリティーゾーンにのみ存在するリソース」を検出することで、複数のアベイラビリティーゾーンへの分散を推奨し、高可用性を実現します。また、「バックアップが有効になっていないリソース」を検出することで、バックアップの有効化を推奨し、データ損失のリスクを低減します。

•	サービスクォータの確認: 
例えば、「使用量がクォータに近づいているサービス」を検出することで、クォータの引き上げを事前に検討することを促します。これにより、予期せぬサービス停止を防ぎます。

これらの例からわかるように、Trusted AdvisorはAWS環境の最適化を支援する重要なツールです。AWS認定試験においても、Trusted Advisorの基本的な概念と利用シナリオは頻出するため、しっかりと理解しておくことをお勧めします。特に、以下の5つのカテゴリ（コスト最適化、パフォーマンス、セキュリティ、耐障害性、サービスクォータ）と、それぞれのカテゴリに含まれるチェック項目について理解を深めておくことが重要です。

また、Trusted Advisorは定期的にチェックを実行し、結果を更新します。結果の確認はAWSマネジメントコンソールから行うことができます。ビジネスまたはエンタープライズサポートプランを利用している場合は、Trusted AdvisorのAPIを利用してプログラムから結果を取得することも可能です。

CloudTrailとTrusted Advisorは、AWS環境の運用において重要な役割を果たすサービスです。CloudTrailは「誰が何をしたのか」を記録し、Trusted Advisorは「環境が最適かどうか」を評価します。これらを適切に活用することで、AWS環境の安全性、効率性、信頼性を高めることができます。

END
AWS CloudTrailの使い道

AWS認定試験を受験するエンジニアの皆様に役立つCloudTrailの概要説明と利用例について解説します。

# CloudTrailの概要
AWS CloudTrailは、AWSアカウントにおけるAPIコールやイベントを記録・監査するサービスです。誰が、いつ、どのリソースに対してどのような操作（例：EC2インスタンスの起動、IAMユーザーの作成）を行ったかを詳細なログとして記録します。これにより、セキュリティ分析、コンプライアンス監査、運用上のトラブルシューティングに役立ちます。デフォルトで有効になっており、過去90日間のイベント履歴は無料で確認できます。長期保存や詳細な分析には、S3バケットへのログ保存やCloudWatch Logsとの連携が可能です。

# CloudTrailの利用が適しているケース
CloudTrailは、以下のような状況で特に役立ちます。
•	セキュリティインシデントの調査: 
例えば、「特定のEC2インスタンスが不審な時間帯に起動された」というアラートを受けた場合、CloudTrailのログを確認することで、誰が、いつ、どのようなAPIコールを使ってインスタンスを起動したのかを特定できます。これにより、不正アクセスの有無や原因を究明できます。

•	コンプライアンス監査: 
規制要件（例：PCI DSS、HIPAA）では、システムへのアクセスログの保存と監査が求められる場合があります。CloudTrailは、これらの要件を満たすための証跡を提供します。例えば、「過去1年間に特定のIAMユーザーが行った操作」を監査する場合、CloudTrailのログを分析することで、必要な情報を提供できます。

•	運用上のトラブルシューティング: 
例えば、「あるはずのS3バケットが削除されている」ことに気づいた場合、CloudTrailのログを確認することで、誰が、いつ、どのような操作でバケットを削除したのかを特定できます。これにより、原因の特定と復旧作業に役立ちます。

•	変更管理: 
インフラストラクチャの変更履歴を追跡する場合にも役立ちます。「最近変更されたセキュリティグループの設定」を確認することで、意図しない変更や設定ミスを発見できます。

これらの例からわかるように、CloudTrailはAWS環境における「いつ」「誰が」「何をしたのか」を把握するための重要なツールです。AWS認定試験においても、CloudTrailの基本的な概念と利用シナリオは頻出するため、しっかりと理解しておくことをお勧めします。

CloudTrailとTrusted Advisorは、AWS環境の運用において重要な役割を果たすサービスです。CloudTrailは「誰が何をしたのか」を記録し、Trusted Advisorは「環境が最適かどうか」を評価します。これらを適切に活用することで、AWS環境の安全性、効率性、信頼性を高めることができます。

END
X（旧ついったー)用の個人アカウントから個人単位で買い物代行の事業宣伝文と依頼文を生成するPGM(買い物代行ネット)

<h3>X（旧ついったー)用の個人アカウントから個人単位で買い物代行の事業宣伝文と依頼文を生成するPGM(買い物代行ネット)</h3>

X（旧ついったー)用の個人アカウントから個人単位で買い物代行の事業宣伝文と依頼文を生成するPGM(買い物代行ネット)をJavaScriptで作成しました.


2025.01.02:PGMを修正しました
2025.02.09:PGMを修正しました

<hr>
PGMページ

事業者用ページgithubPGM:https://github.com/NanjoMiyako2/KaimonoDaikoJigyosha
依頼者用ページgithubPGM:https://github.com/NanjoMiyako2/KaimonoDaikoIraisha

<hr>
サンプルページ

事業者サンプルページ:https://nanjomiyako2.github.io/KaimonoDaikoJigyosha/
依頼者サンプルページ:https://nanjomiyako2.github.io/KaimonoDaikoIraisha/

<hr>
サンプル画像

事業者

![スクリーンショット 2024-12-31 154445.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412430/5fcba080-e224-49e4-410a-278037c31f88.png)

![スクリーンショット 2024-12-31 154457.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412430/31c238d1-9642-56e3-9164-51ce6a4c7fbe.png)



<hr>
サンプル画像

依頼者

![スクリーンショット 2024-12-31 154634.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412430/98f0ac95-88cb-1d48-9b58-563ef27bc161.png)


![スクリーンショット 2024-12-31 154647.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412430/da893dca-60d4-4c99-18a4-7ad88f1f0376.png)
AlpacaHack Round 8 (Rev) Writeup - masking tape （解けてない）

2024年12月30日に開催された[AlpacaHack Round 8 (Rev)](https://alpacahack.com/ctfs/round-8)に参加しました。
1問も解けませんでした。
が、Writeupを書かないと、またgdbの書き方を忘れてしまうので、やったことを備忘として書きます。

# 1. gdbする前の事前調査
サイトから問題ファイルをダウンロードします。masking-tape というファイルでした。
lessします（私はいつでもlessします。「バイナリだけどほんとに見る？」と聞かれても見ます）。
elfでした。
objdump -d |less します。
ちゃんとobjdumpできているようなので、ファイルに書き出しました。
masking-tape.oを眺めます。難しくはなさそうですが、stackを使ってガチャガチャしているので、静的解析はいったん諦めました。

# 2. gdbで冒頭を眺める
gdbします。
~~~
$ gdb masking-tape
~~~
runします。
~~~
(gdb) run
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892015/b99ab6cf-9635-bb0c-b6c4-31d39f72e9bb.png)
第1引数に<input>が必要だよ、と怒られました。正解のフラグを第1引数に取ると良いことが起きるのでしょう。
第1引数に hoge を入れてみます。で、runします。
~~~
(gdb) set args hoge
(gdb) run
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892015/2b537e52-f175-a458-44f8-79ea940e4507.png)
お、出力が変わりました。wrongだそうです。

# 3. 中身を見ていく
~~~
(gdb) layout asm
(gdb) break main
(gdb) run
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892015/0fab4ee5-9f9c-70a6-1305-7ac1b5b21b09.png)

少し進めましょう。
~~~
(gdb) stepi
(gdb) stepi
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892015/e2cc41ef-5455-fed2-b8d0-0dc9c0e06aef.png)

一応、レジスタを見ておきましょう。
i rは省略しないと info registerです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892015/31fd9a9f-2ba8-a5e7-f043-b716205f274c.png)
このあとは c [Enter] と打てば抜けられます（必要回数だけ、c [Enter]を打ちます）。
レジスタを指定することもできます。i r rax などと打ちます。

あてはありませんが、-0x34(%rbp)の中身を見てみましょう
（これの記法をいつも忘れる）。
~~~
(gdb) p/x *(char *)($rbp-0x34)
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892015/a91e679a-876d-1f48-8c86-aefdce28bf42.png)
0x2が入っていました。\<main+19\>の行の比較から想像するに、ガードの一種でしょうか？
と思っていたのですが、あとから実験したら、入力文字列がないときには0x1でした。ということはargc？いつか調べましょう。

# 4. 進む
下矢印キーで、見ていきましょう。
一行前のコマンドをもう一度入力したいときは、上矢印ではなくて Ctrl-p を必要回数押しましょう。ちなみに、コマンドの方では左右矢印も使えません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892015/861c0110-bd44-d0f5-3d98-854a430d5d74.png)
ずーっと下の方まで見ていくと、strcmpしています。ブレイクポイントを貼って、そこまで行きましょう。
~~~
(gdb) b *main+398
(gdb) c
~~~
雰囲気的に rsiの中身と rdiの中身を比較しているのでしょう。
値を見てみましょう。
~~~
(gdb) p/x *(char *)($rsi)
(gdb) p/x *(char *)($rdi)
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892015/f8597da6-a5a8-a9ab-ea11-ef461e8eb77c.png)
0x3と0x8ですね。合わないのですね。Flagはhogeではないのでしょう。
ここまでで入力文字列をぐちゃぐちゃにして（=マスキングテープを使って）、同じようにぐちゃぐちゃにしたFlagと比較するのでしょう。

\\nがあるか探してみましょう。strcmpを使うのであれば、0x0で終わらなければなりません。strcmpが困らないよう、0x0は0x0に写像されるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892015/e69b04f2-83ad-39cb-9b46-443d7b06733c.png)

rsiの5文字目が0x0でした！入力した文字はhoge（4文字）なので、理屈は通っています。

# 5. その後
このあと、入力文字列を Alpaca などにして試してみましたが、解答にはたどり着けませんでした。
他の方のWriteupを読んで復習します。
AlpacaHackの中の方、いつも楽しい時間をありがとうございます。
今一度基礎からアウトプットしていこう。AWSサービス【サーバ関連その他】編

### Elastic Load Balancing(ELB)
![Arch_Elastic-Load-Balancing_64.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332976/194e762c-68ea-da81-b506-b45efa142d2a.png)
- 同じ構成を持ったEC2インスタンスを、**別のAZに配置することができる**サービス。
マルチAZ構成にすることで、インスタンスでなくAZ単位で障害が発生してもシステム継続が可能。主に四種類に分けられる。

#### ロードバランシングタイプ
- Application Load Balancer(ALB)・・・HTTPまたはHTTPSの負荷分散に使用する。
- Network Load Balancer(NLB)・・・HTTP,HTTPS以外に使用する。静的IPアドレスを利用できる。
- Classic Load Balancer(CLB)・・・古いタイプのロードバランサー
- Gateway Load Balancer(GLB)・・・仮想アプライアンスのデプロイ、スケーリング、管理

#### ヘルスチェック
- 指定されたパスへの接続施行により、インスタンスが正常かどうかを確認する
#### 内部にも組み込み可能
- インターネット向けELBのDNSにはパブリックIPアドレス、内向けにはプライベートIPアドレスが付与される。
#### ELB自体が単一障害点とならないのか
- 他AZに変えたところで、ELB自身が単一障害点にならないのかと考えられるが、**ELB自体が高可用性の持つマネージドサービス**のため問題ない。
---
### API Gateway
![Arch_Amazon-API-Gateway_64.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332976/2f43829e-4b01-d690-aba2-50fbea51fa77.png)
- Lamdaと一緒によく使うサービス。外部からリクエストを受け付けるためのRESTAPIを構築できる。APIにリクエストがあった後に、Lamda関数を呼び出す。という流れでよく使われる。
lamdaと併用することでAPI作成を簡単に行うことができる。
---
### Simple Notification Service(SNS)
![Arch_Amazon-Simple-Notification-Service_64.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332976/47bf2762-64e3-e2e9-ec2d-b9e8829cd94f.png)
- メッセージ通知サービス。SNSトピックに送信（パブリッシュ）したメッセージは、あらかじめ設定しておいたサブスクリプションに送信される。サブスクリプションが複数ある場合は並列的にそれぞれにメッセージが送信される。Eメール送信などのメッセージ通知にはSNSが使用できる。
---
### Simple Queue Service(SQS)
![Arch_Amazon-Simple-Queue-Service_64.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332976/7d331d9a-a3d8-7f4f-8ffc-4448ad4e44b7.png)
- メッセージキューサービス。メッセージを送るサービスと、メッセージを受け取るサービスの間で行われるメッセージのために、一時保存するサービス。送信元、送信先ともに状態を確認する必要がないので、都合の良いタイミングで処理できるので、非同期的な設計が可能になる。非同期的処理などでキューが必要な場合はSQSを使用できる。

### Step Functions
![Arch_AWS-Step-Functions_64.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332976/ce40f7ae-c78a-14f9-83c3-787bed538fa1.png)
- 複数のサービスを組み合わせるワークフロー、フロー制御を伴うワークフローを簡単に作成するサービス。
単調性とは

# 大きくなることはあっても小さくなることはない
>変数xの値が大きくなるにつれてfが定める値f(x)が大きくなることはあっても小さくなることはない場合、この関数fを単調増加関数（monotonically increasing function）や単調非減少関数（monotonicallynon-decreasing function）などと呼びます。

https://wiis.info/math/real-number/function/monotone-function/#elementor-toc__heading-anchor-0:~:text=%E6%88%90%E3%82%8A%E7%AB%8B%E3%81%A4%E5%A0%B4%E5%90%88%E3%80%81%E3%81%A4%E3%81%BE%E3%82%8A%E3%80%81-,%E5%A4%89%E6%95%B0,%E6%B8%9B%E5%B0%91%E9%96%A2%E6%95%B0%EF%BC%88monotonicallynon%2Ddecreasing%20function%EF%BC%89%E3%81%AA%E3%81%A9%E3%81%A8%E5%91%BC%E3%81%B3%E3%81%BE%E3%81%99%E3%80%82,-%E9%96%A2%E6%95%B0

### この図を見ると2分探索を思い出す
>考えている区間による
関数の単調性は，考えている区間によります。
例4
y=x^2という関数について考える。
>* 実数全体では，単調増加でも単調減少でもない。
>* x≥0 の範囲では単調増加
>* x≤0 の範囲では単調減少

https://manabitimes.jp/math/1289#3:~:text=%E6%B8%9B%E5%B0%91%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84%E3%80%82-,%E8%80%83%E3%81%88%E3%81%A6%E3%81%84%E3%82%8B%E5%8C%BA%E9%96%93%E3%81%AB%E3%82%88%E3%82%8B,%E3%81%AE%E7%AF%84%E5%9B%B2%E3%81%A7%E3%81%AF%E5%8D%98%E8%AA%BF%E6%B8%9B%E5%B0%91,-%E3%81%93%E3%81%93%E3%81%BE%E3%81%A7%E3%81%AE
【Ruby】gsubにブロックを使用できるんだって！

# はじめに
Rubyで文字列置換を行う際に大活躍するgsubメソッドですが、ブロックを用いた使用方法があることを知りました。
便利だと思ったので記事にして紹介しようと思います。

# gsubの基本的な使い方
まずは基本的な使用方法から見ていきましょう。
第一引数には文字列および正規表現を渡すことができ、第二引数には第一引数にマッチしたパターンを置換する文字列を渡します。

まずは文字列をマッチさせるケースから書いてみます。
```ruby
original = 'わたしはイヌを飼っています。わたしが飼っているイヌの名前は太郎です。'

replaced = original.gsub('イヌ', 'ネコ')

puts replaced
# => 'わたしはネコを飼っています。わたしが飼っているネコの名前は太郎です。'
```

このように、第一引数の文字列(イヌ)に合致する箇所全てを第二引数の文字列(ネコ)に置換した結果を返却します。

同様に、第一引数に正規表現を使用した例を考えてみます。
```ruby 
original = 'わたしは2024年生まれです。電話番号は123-456-789です。'

replaced = original.gsub(/[0-9]/, '*')

puts replaced 
# => 'わたしは****年生まれです。電話番号は***-***-***です。'
```

[0-9]は任意の整数を表す正規表現です。今回は文中の数字を全て*に置き換えることで、個人情報を隠すプログラムを想定してみました。

## [余談]破壊的メソッド
今回のテーマとは少し離れてしまいますが、`gsub`には破壊的メソッド`gsub!`があります。
`gsub`は元の文字列には変更を加えないのに対して、`gsub!`は元の文字列に変更を加えてしまいます。

```ruby
original = 'わたしはイヌを飼っています。わたしが飼っているイヌの名前は太郎です。'

original.gsub!('イヌ', 'ネコ')

puts original 
# => 'わたしはネコを飼っています。わたしが飼っているネコの名前は太郎です。'
```

# ブロックを使用してみる

今までの例は比較的わかりやすい例でしたが、もう少し複雑な例をみてみましょう。


## 例その1
例えば、以下の文字列を置換することを考えて見ます。

```ruby 
'I have a dog. His name is Taro.'
```

この分のdogを大文字にしたい時、どうやって書きますか？
ブロックを使用するとこれがシンプルに実現できます。

```ruby
original = 'I have a dog. His name is Taro.'

replaced = original.gsub('dog') {|s| s.upcase}

puts replaced 
# => 'I have a DOG. His name is Taro.'
```

このように、パターンマッチした箇所を順番にブロックに渡し、その実行結果で置き換えた文字列を生成して返します。

これを使用することでより複雑な文字列置換処理でもシンプルに書くことが可能です。

## 例その2

以下のような文章があると考えてみます。

```ruby 
original = <<~EOS
名前: 田中

職業: 会社員

掲載: 可
------------
名前: 山田

職業: 自営業

掲載: 不可
------------
名前: 鈴木

職業: 専業主婦

掲載: 可
------------
EOS
```

ここから、掲載可能なプロフィールだけを残し、掲載不可の人のプロフィールを非公開にするプログラムを作成してみます。

作戦は以下の通りです。

1. 各人のプロフィール(名前: xxxの部分から------------の部分まで)を読み込む
1. プロフィール部分に`掲載: 不可`の記述があるかどうかを判定する
1. `掲載: 不可`の場合は「このプロフィールは非公開です」に置換、そうでない場合はプロフィールをそのまま残す

### いざ実装
```ruby
original.gsub!(/(名前: .*?------------)$/m) do |profile|
    # 正規表現にマッチした部分がprofileとしてブロックに渡される
    # 掲載: 不可の記述がある場合は置換、ない場合はそのまま返却
    profile.include?('掲載: 不可') ? "このプロフィールは非公開です\n------------" : profile
end
```

### 結果
```plaintext
名前: 田中

職業: 会社員

掲載: 可
------------
このプロフィールは非公開です
------------
名前: 鈴木

職業: 専業主婦

掲載: 可
------------
```

無事に`掲載: 不可`の人のプロフィールを隠すことができましたね。

# 感想
普段からよく使用するメソッドでもまだまだ知らない使い方があるのだなと思いました。
これに懲りずにまだまだ精進したい所存です。

では、良いお年を。

# 参考
https://docs.ruby-lang.org/ja/latest/method/String/i/gsub.html
LeetCodeを1日1題解いてみる (day50)

50日目に取り組んだ問題はこちら！
本日がこのシリーズのラストになります！また、別の勉強を始める予定です！

# 151. Reverse Words in a String

https://leetcode.com/problems/reverse-words-in-a-string/?envType=study-plan-v2&envId=top-interview-150

## 問題文
Given an input string s, reverse the order of the words.

A word is defined as a sequence of non-space characters. The words in s will be separated by at least one space.

Return a string of the words in reverse order concatenated by a single space.

Note that s may contain leading or trailing spaces or multiple spaces between two words. The returned string should only have a single space separating the words. Do not include any extra spaces.


## 僕の回答
```py
class Solution:
    def reverseWords(self, s: str) -> str:
        s_arr = s.split()
        result = " ".join(s_arr[::-1]) 
        return result
```

## より効率の良い回答例
特になし

## 学んだこと
- `text.split()`: 文字列`text`を空白で区切り、リストを返す
- `" ".join(array)`: リストの要素を空白で区切り一つの文字列にする

## コメント
以前使ったことのあるメソッドのみで実装できたのですぐに完成できた
【SwiftUI】自分用初学者メモ

この年末年始に今まで触れたことのないiosアプリ開発について興味が湧いたので、そこで詰まった点を備忘録として残していく。

## ライブラリの適用手順
そもそもライブラリ管理には、「CocoaPods」と「SPM(Swift Package Manager)」の大きく2種類存在する。

今回は、 Apple公式かつ推奨のSPMの導入手順を記載する。

1. 使用したいプロジェクトをxcodeで開く
2. xcodeの左上のFile > Add Package Dependencies...を選択する
3. 右上のSerchから使用したいライブラリのURLを入力する
    githubのreadmeにインストール方法でSPMのURLが記載されている事が多い
    例：https://github.com/hoge/huga.git
4. 入力したら追加したいライブラリが表示されるので、「Dependency Rule」と「Add to Project」を選択して、右下のAdd Packageを押下する
5. xcodeの左のフォルダエリアのPackage Dependenciesに追加されていることを確認する
6. プロジェクトの設定ファイルを開く
7. Frameworks, Libraries, and Embedded Contentに使用したいライブラリを追加する

以上
離散量とは

# それ以上分割できない、整数で表される量のこと
>デジタル量（digital quantity）とは、`大きさや強さが段階的に変化するような量`のこと。`整数で表されるような量`で、`個数や金額`などが該当する。無段階で連続的に変化する「アナログ量」(連続量)と対比される。

>個数や人数、金額などは、`それ以上分割できない最小単位`が決まっており、中間のない等間隔の飛び飛びの値を取る。`すべての量は最小単位の整数倍`として表すことができる。このような量をデジタル量あるいは離散量、分離量と呼び、量を離散量として表す情報の表現方式を「デジタル」（digital）という。

https://e-words.jp/w/%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E9%87%8F.html#google_vignette:~:text=%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E9%87%8F%EF%BC%88digital,digital%EF%BC%89%E3%81%A8%E3%81%84%E3%81%86%E3%80%82

>貨幣や個数などのように、`それ以上分割できない最小量が存在する量`のこと。分離量とも呼ばれる。

https://www.weblio.jp/content/%E9%9B%A2%E6%95%A3%E9%87%8F#goog_rewarded:~:text=%E8%B2%A8%E5%B9%A3%E3%82%84%E5%80%8B%E6%95%B0%E3%81%AA%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E3%80%81%E3%81%9D%E3%82%8C%E4%BB%A5%E4%B8%8A%E5%88%86%E5%89%B2%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E6%9C%80%E5%B0%8F%E9%87%8F%E3%81%8C%E5%AD%98%E5%9C%A8%E3%81%99%E3%82%8B%E9%87%8F%E3%81%AE%E3%81%93%E3%81%A8%E3%80%82%E5%88%86%E9%9B%A2%E9%87%8F%E3%81%A8%E3%82%82%E5%91%BC%E3%81%B0%E3%82%8C%E3%82%8B%E3%80%82
tarとgzipについて

## tarとgzipについて
tarとgzipは、主にUnix/Linux系システムで使われるアーカイブ化・ファイル圧縮のツールです。それぞれの役割と違いについてまとめました。

### tar (Tape Archive)
複数のファイルやディレクトリを1つのアーカイブにまとめるためのツール。
複数のファイルをまとめるだけで、ファイルサイズを圧縮したりはしないためgzipなどを利用する必要がある。

- 拡張子: `.tar`

- 特徴:
    - ファイルやディレクトリを1つのアーカイブにまとめる。
    - 圧縮機能はない（単体ではファイルサイズは変わらない）。
- 使用例
     file1.txtとfile2.txtをarchive.tarという一つのファイルにまとめる。
    ```zsh
    tar -cvf archive.tar file1.txt file2.txt
    tar -xvf archive.tar
    ```
    `-c`：アーカイブを作成
    `-x`：アーカイブを展開
    `-v`：処理中のファイルを表示
    `-f`：出力ファイルを指定

###  Gzip (GNU zip)
ファイルを圧縮するためのツール。

- 拡張子: `.gz` or `.gzip`

- 特徴:
    - 単一ファイルを圧縮する。
    - 圧縮率が高い。
    - gunzip コマンドで展開できる。
- 使用例:
    gzipはfile.txtを圧縮してfile.txt.gzにする。
    gunzipはその逆でfile.txt.gzを元のfile.txtに戻す。
    ```zsh
    gzip file.txt
    gunzip file.txt.gz
    ```
### tarとgzipの連携
tarとgzipを組み合わせることで、複数ファイルを1つにまとめ、その後圧縮することができます。

- 拡張子: `.tar.gz` または `.tgz`
- 使用例:
    - アーカイブ + 圧縮
    ```zsh 
    tar -czvf archive.tar.gz file1.txt file2.txt
    ```
    - 展開 + 解凍
    ```zsh
    tar -xzvf archive.tar.gz
    ```
### 使用場面
バックアップやファイル転送、CI/CDなどで使われています。



### 参考
https://www.gnu.org/software/tar/
https://datatracker.ietf.org/doc/html/rfc1952
https://www.gzip.org/
find + xargs + awk + cksum

```bash
find . -type f -ls
```
or
```bash
find . -type f | xargs ls -dils
```
```bash
find . -type f | xargs ls -dils | awk '{print $11}'
```
```bash
find `pwd` -type f | xargs ls -dils | awk '{print $11}'
```
絶対パスにする
```bash
find `pwd` -type f | xargs ls -dils | awk '{cmd=sprintf("cksum %s", $11);system(cmd);close(cmd)}'
```
結果：
```bash
136308519 39 /home/syslinks/www/oldhp/include/fileSQL/data/fields.fql
3255405174 505 /home/syslinks/www/oldhp/include/fileSQL/data/news.txt
1933580744 464 /home/syslinks/www/oldhp/include/fileSQL/data/news.txt.2024.12.31
97555143 23940 /home/syslinks/www/oldhp/include/fileSQL/fileSQL.php
```
136308519 : cksum の結果
39 : ファイルサイズ

awk の中で、コマンドを発行
```bash
cmd=....;system(cmd);......;close(cmd);
```
cmd はこうなる：
```bash
cksum /home/fileSQL.php | awk '{printf "%s ", $0}'
```
結果：
```bash
97555143 23940 /home/fileSQL.php #
```
cksum の結果を改行がなくした
```bash
find `pwd` -type f | xargs ls -dils | awk '{cmd=sprintf("cksum %s | awk '{printf "%s ", $0}'", $11);system(cmd);printf "%s\n",$0;close(cmd);}'
```
を

```bash
find `pwd` -type f | xargs ls -dils | awk '{cmd=sprintf("cksum %s | awk '\''{printf \"%%s \", $0}'\''", $11);system(cmd);printf "%s\n",$0;close(cmd);}'
```
にエスケープ
```bash
'  -> '\''
" -> \"
%s -> %%s
```
結果：
```bash
136308519 39 /home/data/fields.fql 97435929  4 -rw----r--  1 syslinks  users     39  4月 22  2008 /home/data/fields.fql
3255405174 505 /home/data/news.txt 97435930  4 -rw----r--  1 syslinks  users    505 12月 31 12:33 /home/data/news.txt
1933580744 464 /home/data/news.txt.2024.12.31 97463922  4 -rw----r--  1 syslinks  users    464  4月 22  2008 /home/data/news.txt.2024.12.31
97555143 23940 /home/fileSQL.php 97435928 24 -rw----r--  1 syslinks  users  23940  4月 22  2008 /home/fileSQL.php
```
あとは、必要なカラムを再出力
```bash
find `pwd` -type f \
| xargs ls -dils \
| awk '{cmd=sprintf("cksum %s | awk '\''{printf \"%%s \", $0}'\''", $11);system(cmd);printf "%s\n",$0;close(cmd);}' \
| awk '{printf "%12s %10s %s %s %s %5s %2s %5s %s\n",$1,$2,$6,$8,$9,$11,$12,$13,$3}'
```
結果：
```bash
   136308519         39 -rw----r-- syslinks users  4月 22  2008 /home/data/fields.fql
  3255405174        505 -rw----r-- syslinks users 12月 31 12:33 /home/data/news.txt
  1933580744        464 -rw----r-- syslinks users  4月 22  2008 /home/data/news.txt.2024.12.31
    97555143      23940 -rw----r-- syslinks users  4月 22  2008 /home/fileSQL.php
```
以上。

リンク集
https://www.ibm.com/docs/ja/aix/7.3?topic=files-finding-find-command
https://www.ibm.com/docs/ja/aix/7.3?topic=x-xargs-command
https://www.ibm.com/docs/ja/aix/7.3?topic=c-cksum-command
https://www.ibm.com/docs/ja/aix/7.3?topic=awk-command
https://www.ibm.com/docs/ja/aix/7.3?topic=d-diff-command

https://stackoverflow.com/questions/20646819/how-can-i-pass-variables-from-awk-to-a-shell-command
https://www.tohoho-web.com/ex/awk.html
https://genzouw.com/entry/2021/08/08/085930/2756/
https://www.rough-and-cheap.jp/linux/find_result_formatting/
【Python】Alembicの「FAILED: All MySQL CHANGE/MODIFY COLUMN operations require the existing type.」エラーの原因

# 概要
Alembicでカラム情報を変更しようとしたら以下のエラーになりました。
原因と解決方法がわかったので紹介します。

> ERROR [alembic.util.messaging] All MySQL CHANGE/MODIFY COLUMN operations require the existing type. FAILED: All MySQL CHANGE/MODIFY COLUMN operations require the existing type.

### 前提
- db：mysql8.0
- python：3.12
- alembic：1.13.2
- SQLAlchemy：2.0.32

# 原因
Alembic（SQLAlchemy？）ではカラム情報を変更する際に、既存のカラムの型を指定する必要があるため、上記のエラーが発生していました。
`ALTER COLUMN`操作を行う際に、既存のカラムの型を明示的に指定する必要があるとのこと。
エラーメッセージにもある`existing_type`で指定ができそうです。

# 解決方法
以下が、Alembicのマイグレーションファイルのビフォーアフターです。
`create_date`カラムに`server_default`（デフォルト値）を新規に追加するマイグレーションでした。

### before(エラーが表示されたコード)

```py
    op.alter_column('sample_table', 'create_date', server_default=None), nullable=False)
```

### after(エラーが解消されたコード)

```py
    op.alter_column('sample_table', 'create_date', existing_type=mysql.DATETIME(), server_default=sa.text('now()'), nullable=False)
```

上記のように、`existing_type`引数を使用して既存のカラムの型を指定することで、エラーがなくなりました。

### 参考

> existing_type – Optional; a TypeEngine type object to specify the previous type. This is required for all MySQL column alter operations that don’t otherwise specify a new type, as well as for when nullability is being changed on a SQL Server column. It is also used if the type is a so-called SQLAlchemy “schema” type which may define a constraint (i.e. Boolean, Enum), so that the constraint can be dropped.
https://alembic.sqlalchemy.org/en/latest/ops.html
ゲームボーイ RGBDS 開発メモ 第7回 チュートリアルを読んでいく オブジェクト(2)

前回からひきつづき

[https://gbdev.io/gb-asm-tutorial/part2/objects.html](https://gbdev.io/gb-asm-tutorial/part2/objects.html)

を読みすすめていきます。

### オブジェクトを動かしてみる

```
Main:
    ; Wait until it's *not* VBlank
    ld a, [rLY]
    cp 144
    jp nc, Main
WaitVBlank2:
    ld a, [rLY]
    cp 144
    jp c, WaitVBlank2

    ; Move the paddle one pixel to the right.
    ld a, [_OAMRAM + 1]
    inc a
    ld [_OAMRAM + 1], a
    jp Main
```

今までなにもしない無限ループだった部分を移動させるループに変更です。

Mainループで VBlankでなくなるまで待って、WaitVBlank2 でVBlankになるまで待ちます。
こうすることにより、次のVBlankまで待つことになり、表示されるのかな。

あとは X座標をインクリメントすると・・・

![a.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733735/dc7554f3-f072-cf8e-991d-0ec1fd5e107d.gif)

動きました！なるほど255になったあと、0に戻るので、左端からまたでてきます（笑）
1/60秒に一回インクリメントされるので、1秒間に60ピクセル動きます。

これを遅くするには毎回ではなくて15フレームに一回など制限させます。

```
SECTION "Counter", WRAM0
wFrameCounter: db
```

WRAM0は読み書きできる領域で、グローバル変数として利用できる感じでしょうか。

```
    ld a, 0
    ld [wFrameCounter], a
```

0で初期化しまして、

```
Main:
    ld a, [rLY]
    cp 144
    jp nc, Main
WaitVBlank2:
    ld a, [rLY]
    cp 144
    jp c, WaitVBlank2

    ld a, [wFrameCounter]
    inc a
    ld [wFrameCounter], a
    cp a, 15 ; Every 15 frames (a quarter of a second), run the following code
    jp nz, Main

    ; Reset the frame counter back to 0
    ld a, 0
    ld [wFrameCounter], a

    ; Move the paddle one pixel to the right.
    ld a, [_OAMRAM + 1]
    inc a
    ld [_OAMRAM + 1], a
    jp Main
```

aが15になるまでMainループに戻り、15になったら、0に戻して X座標をインクリメントします。

これで遅くすることができました。`cp a, 15`  は `cp 15` でも動きました。

### 余談

Qiita って動画貼れないんですね・・・。しょうがなくアニメgifに変換しました。

### 次回
次回はFunction(サブルーチン)です！
好きな画像で遊べる「なんでもタワーバトル」を作りたかった話

## あいさつ
皆さんは一昨年の8月ごろの流行りを覚えていますか？
あの「スイカゲーム」が大流行しました。皆さんも一回くらい見たり、聞いたり、遊んだりしたのではないでしょうか？
さて、ところで一度なにかのゲームが大流行するとそれをリスペクトした派生作品が数多く登場してきます。
試しに「unityroom スイカゲーム」で検索してみると１００件ほどヒットします。

https://unityroom.com/rankings/tags/7110

これらのゲームはただスイカゲームを模倣しているのでは無く、製作者の好みによる画像素材がオブジェクトとして登場し、各作品ごとにさまざまなテーマが存在します。
みなさんも自分の好きな画像でゲームしたいと思ったこともあるのではないでしょうか？
しかし、実際にはプログラミングの技術を持っている者でしかそのようなゲームを作ることができず、自分のゲームを作りたいと思ってもプログラミングの勉強からしなければなりません。
**楽に自分好みの画像に変えて遊びたいですよね？**
そこから発案したプロジェクトになります。

**※注意！！  本プロジェクトは完成しておりません！！  制作過程の日記的なものだと思ってくれると幸いです、、、**

## はじめに
このプロジェクトは私の所属するC0deという団体の企画の元、ピクシブ株式会社様および団体のOBの皆様の多大なご協力のもと開催されたpixivハッカソンにて建ったプロジェクトです。

https://www.pixiv.co.jp/

約２週間という短い期間の中、多岐に渡るご協力のもと開発をすることができたのでものすごい感謝です。
## 1.概要？（作る予定だったもの・当初予定していた機能）
先ほどはスイカゲームの話を書きましたが、ゲームシステムがより簡素などうぶつタワーバトルを完成させようと目指しました。

https://play.google.com/store/apps/details?id=jp.planet12.AnimalTowerBattle&hl=ja

当初予定していた機能として『Webアプリとして作り、画像選択画面からパソコンの中の画像を選択、必要に応じてクロマキーを施し、そこからゲームシステムが完了しているUnityを立ち上げ、ゲームが開始する』というものでした。
自分のパソコンに保存してあるpng画像（透過画像）を１０枚持ってくることで１０個のオブジェクトによるタワーバトルゲームを想定していました。
## 2.制作日記
### 初日
メンバーは４人でプロジェクトを始めることになりました
２人はUnity開発（ゲームシステム構築）、１人は透過する部分の実装、そしてあと１人がUnityとWebをつなぐ部分で役割分担をし、制作が始まりました。
### 開発前期
Unityの部門はゲームシステムとして、どうぶつタワーバトルを作るということでどうぶつタワーバトルを作っている記事やChatGPTなどを活用し、基礎的な部分は大体完成しました。
しかし、画像透過する技術がどうしても間に合いそうにない、、、
画像透過する部分はあきらめて、まだ実装できていないUnityへの画像入力の部分に２人で力を注ぐことになりました。
画像入力の方は、Unityの外部からの画像ダウンロードに関する記事を見つけては試して失敗、見つけては試して失敗の繰り返しでなかなか前に進まず、、、
OBの方に意見を聞いてみたところ下の記事を紹介され、テストしてみたところようやく上手くいったので別の新しい方針で進めることにしました。ありがとうございます。

https://zenn.dev/plumchang/articles/9187928bcbcf93

**方針の変更**
```
Webで画像選択してUnityを開く --> Unityで完結させる（選択画面を用意する）
```
### 開発後期
このころUnityのゲームシステムの方は、オブジェクトの回転やスコアの実装、ゲームオーバー・リセットなどいろいろなところで苦戦し、こちらもなかなかギリギリになりました。
しかし、画像選択の方が長いことうまく進まず、ダウンロードした画像をオブジェクトにできるまでに開発期間残り３日というところまできてしまいました。
さらに、大変なことに元々作っていたゲームシステムの中の画像を外部から入手した画像に差し替えることにうまくいかず、中身の部分をかなり変更することになってしまいました。
### 結果
結果的に完成せず、ゲームシステム側で構成したSampleのものと、外部から入手した画像１枚だけでできるタワーバトルとなってしまいました。
本当はこの状態でもWebGLにしてunity roomにでも投稿したかったのですが、画像選択の部分でエラーが出てしまいビルドすることも出来ませんでした、、、無念。
## 3.工夫した点
工夫した点というかUnityのゲームシステムの部分はほぼどうぶつタワーバトルを作るということで、今までの経験みたいなところが多く記事にするようなものでもないので割愛します。
ついでに、ここに実際に制作できたものの一部の画像を置いておきます。
↓　スタート画面　↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967038/60d01ecb-98f0-0777-ed5b-f09f46300d1c.png)
↓　遊ぶ画面　↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967038/c8d7206d-9687-d02c-1ba8-fb643d234bff.png)

また、Unityに外部画像をダウンロードするところの技術・工夫した点については私が記事にしたので良ければ見てみてください。

https://qiita.com/negisalt/items/884a8231059f9b9cd2da

工夫した点といえばこれくらいですかね、、、
## 最後に
ここまで長い文を読んでくださってありがとうございました。技術的な部分を書けず日記になってしまいましたが少しでも何かの役に立てば幸いです。

私たちのプロジェクトは失敗でしたが、よかったところもあります。
よかったところの一番は、全員共同開発の初心者でしたが今回のハッカソンにおいて貴重な体験をすることができたことです。
ハッカソン・共同開発自体そんなに頻繁にあるものでもないですし、役割分担をして開発することの難しさみたいなものを知れたと思います。とてもありがたい経験ができました。

初のハッカソンとして楽しいものになりました。
ありがとうございました！
2024年の資格取得をまとめてみる

# 概要
2024年1年間で新たに8個資格(級の更新はカウントせず)を取得しました。結果として取得した資格数は50個となりました。この50個についてのまとめ記事はまたの機会に投稿するとして、折角なので2024年最終日に今年取得した資格のまとめ記事を投稿しようと思います。

# 取得した資格
2024年は以下の過去記事で近々取得したいと記載していた資格の中から幾つか取得することが出来ました。取得出来た資格について投稿した過去記事のリンクをまとめておこうと思います。また、過去記事の一覧のうち取得が完了したものについては~~取り消し線~~を付けて更新しています。

https://qiita.com/y-vectorfield/items/1f09263963b87d8c0f9c

## IPv6 基礎検定
NW(ネットワークスペシャリスト)の前哨戦になればと思い取得しましたが、正直この試験は前哨戦にはなりませんでした。公式テキストは言ってみればIPv6プロトコルの仕様書の様な仕上がりで、単調で面白くなく、試験問題は拍子抜けするほどに簡単な問題が出るなど、意表を突かれた試験であったことは否めません。

https://qiita.com/y-vectorfield/items/5661ed03a804e0fccaac

## JDLA Generative AI Test 2024#1
昨年6月に第1回の試験に合格後、試験形式が変更され、記述問題も加わったため、昨年末に第2回を受験したものの、試験時間終了間際に滑り込みで受験したのが災いして不合格に。。。そこでリベンジを掛けるために、再挑戦し、無事合格しました。業界のキャッチアップのために定期的に受験することが推奨されていますが、また数年後に受験するのも悪く無いと思える試験でした。

https://qiita.com/y-vectorfield/items/7af3c625528bfe6d1a77

https://qiita.com/y-vectorfield/items/b515508ae2d6ed0fb581

## Kubernetes and Cloud Native Associate(KCNA)
この試験はAWS認定で言うところのCloud Practitionerに相当？する試験でした。現在の部署に異動前に居た本部の教育部門がKubernetes資格の余剰バウチャーの処分に困っているのを見て貰い受けたバウチャーを有効利用するために受験しました。後述のCKAとは異なり、多肢選択式の試験であったため、試験自体はそれほど難しい試験ではありませんでしたが、この手の試験独特の試験システムに悩まされた受験となりました。

https://qiita.com/y-vectorfield/items/12acd820268d9976b1d3

## 生成AIパスポート
よく似た名前にITパスポートが有るととあるYouTubeチャンネルで名前が挙がっていましたが、ITパスポートはIPAが実施している国家試験、生成AIパスポートは民間資格という違いがあります。資格の内容自体は悪く無いと思いますが、受験料が高いのが難点。もう少しリーズナブルな受験料にして貰えると試験団体が提唱する理念が広まって良いのではと思います。

https://qiita.com/y-vectorfield/items/b946bf10214c6487d304

https://qiita.com/y-vectorfield/items/a4c2f17dc936a1a0fbaa

## Certified Kubernetes Administrator(CKA)
KCNA同様に貰い物のバウチャーを無駄にするのが勿体無く必死で対策をして試験に臨みました。最初はクーポンの消化ぐらいのつもりで対策に乗り出しましたが、KCNAに合格した後ぐらいから、合格を目指す様になりました。この試験を通してKubernetesについて今まで分かっていなかった部分まで触れることが出来た上に、CKADやCKSの受験も考える様になりました。近い将来残り2つも受験してみようと思います。

https://qiita.com/y-vectorfield/items/08caf0d87ff998725fb3

## インテルPCマイスター 中級
この資格はひょんなことからセミナーの受講を決め、取得してしまった資格です。筆者の現状の業務で直接活用する場面は有りませんが、今後もインテルの最新プロセッサー技術には注目していきたいと思います。

https://qiita.com/y-vectorfield/items/f830fe0fee94b4e94637

## 量子アニーリング エントリー、アドバンス
筆者は学生時代一度は量子力学に挫折し、量子コンピュータの勉強にも数度挫折していますが、今回は挫折せず、認定試験合格まで辿り着けました。そういう意味で受講して良かったと思います。引き続き量子コンピューティング技術の発展には注目していきたいと思います。

https://qiita.com/y-vectorfield/items/9fbd04f3d9be76b0fcb9

https://qiita.com/y-vectorfield/items/841fea38e21bf7f8d178

## AWS Certified Solution Architect Associate
今年最も苦しめられた資格試験がこの試験です。勉強を始めた当初は手持ちのバウチャーを使わないままにするのが前部署の呪縛を引き摺ったままで後味が悪いという理由だけであったため、ほぼAWS利用経験が無い状態で、膨大な量のサービス名を覚えなければならず、モチベーションの維持に苦しみました。後半は業務でも利用するようになり、また、今後のAWS認定取得計画も立ったことから、無事合格出来ました。但し、数年後の更新時が地獄の再来。。。:scream: :scream_cat: 

https://qiita.com/y-vectorfield/items/a9e889e1d511e06af630

# 受験した資格
合否は出ていませんが、今年受験した資格です。自己採点では合格してそうな感触です。

## 技術士(情報工学部門) 1次試験

https://qiita.com/y-vectorfield/items/f392b298d359cc5936db

https://qiita.com/y-vectorfield/items/d8d03287a325448cc306

# 更新した資格
3年前に登録した情報処理安全確保支援士を更新しました。資格の登録証は緑から青に変わりました。また3年後、今度は金色に変わるのを楽しみにして情報セキュリティのキャッチアップに励みたいと思います。

## 情報処理安全確保支援士

https://qiita.com/y-vectorfield/items/2b8b44b066e1b4af12d0

# まとめ
2024年の資格取得についてまとめました。2025年も新しい資格に挑戦したいと思います。特に以下は優先して臨みたいなと思います。

* IPAの高度試験: NW、DB
* 一陸技(最悪科目合格)
* 統計検定(専門統計調査士、データサイエンス発展)
* 日商簿記3級、2級
* 第二種電気工事士
ATOMS3R M12を工場出荷時のファームウェアに戻すメモ

# はじめに

Moddable SDK 5.2.0で追加されたカメラ機能の動作確認をしている時にATOMS3R M12を連続で動作させると画像が乱れ始めました。

https://qiita.com/kitazaki/items/bc23b0a4956295804cfd

デバイスの初期不良か切り分けるために工場出荷時のファームウェアに戻して動作を確認します。


# 工場出荷時のファームウェアをダウンロードする

製品ページからファームウェアをダウンロードします。

https://docs.m5stack.com/en/core/AtomS3R-M12

ファームウェアのURL(直リンク)はこちらです。

https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/docs/products/core/AtomS3R-M12/ATOMS3R-CAM-M12-UserDemo-M5Stack-20240927.zip

zipファイルを展開します。

```bash
unzip ATOMS3R-CAM-M12-UserDemo-M5Stack-20240927.zip
cd ATOMS3R-CAM-M12-UserDemo
```

README.mdにビルド手順が記載されています。
ESP-IDF v5.1.4でビルドする必要があります。(v5.1の最新版v5.1.5では動作しませんでした)


# ESP-IDFのバージョンをv5.1に戻す

Moddable SDK 5.2.0はESP-IDF v5.3.0が必要ですが、ファームウェアのビルドでエラーが出るため、インストールされているESP-IDF v5.3.0を削除します。

```bash
cd $IDF_PATH
rm -rf esp-idf
```

ESP-IDFのv5.1.4)をダウンロード(git clone)します。

```bash
git clone -b v5.1.4 --recursive https://github.com/espressif/esp-idf.git
```

ESP-IDFをインストールします。

```bash
cd esp-idf
./install.sh
```

環境変数を設定します。(ターミナルを開くたびに実行します)

```bash
cd $IDF_PATH
. ./export.sh
```


# ファームウェア(ソースコード)をビルドする

ファームウェアを展開したディレクトリに移動します。

```bash
cd ATOMS3R-CAM-M12-UserDemo
```

ファームウェアをビルドします。

```bash
idf.py build
```


# ファームウェアをデバイスに書き込む

ファームウェアをデバイスに書き込みます。
(デバイスが認識されていない場合は、リセットボタンを2秒以上長押しします)

```bash
idf.py -p /dev/cu.usbmodem101 flash
```


# 動作確認

UVCカメラとして動作するので、PC(Mac)のカメラアプリで確認します。
デバイス名は「AtomS3R-M12」でした。

![0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/f31fd73a-8c6a-07c7-d1e2-cdcfaa7719b5.jpeg)

正常に動作しました。
デバイスの初期不要ではなさそうです。
AndroidでGoogle Location Services APIを利用しワンショットで位置情報取得

## 概要
Google Location Services API を利用してワンショットで最新の位置情報を取得したい場面があったのですが、
定期的に取得し続ける方法のドキュメントは一定数あったもののワンショットで取得する方法についてはあまりなかったので、軽くまとめてみました。

## ワンショットで取得する方法
- 定期的に取得する方法と同様に `fusedLocationClient` を利用することに変わりないですが、`requestLocationUpdates()`ではなく `getCurrentLocation()` を利用する必要があります
- `getCurrentLocation()` をコールする際、第1引数に`CurrentLocationRequest.Builder` のインスタンスが必要なので、作成の上セットしています
- 以下はサンプルコードになります

##### サンプルコード

```kotlin
val locationProviderClient = LocationServices.getFusedLocationProviderClient(activity)
val currentLocationRequestBuilder = CurrentLocationRequest.Builder().apply {
    setPriority(Priority.PRIORITY_HIGH_ACCURACY)
    setDurationMillis(durationMillis)
}.build()

locationProviderClient
    .getCurrentLocation(currentLocationRequestBuilder, null)
    .addOnSuccessListener { location ->
        // 位置情報取得に成功
    }
    
    .addOnFailureListener {
        // 位置情報取得に失敗
    }
    .addOnCompleteListener {
       // 位置情報取得リクエスト完了時
    }
```

- リクエストの結果ごとにコールバックが各種用意されているので、必要に応じて実装を追加することが可能
- `getCurrentLocation()`の第2引数には [CancellationToken](https://developers.google.com/android/reference/com/google/android/gms/tasks/CancellationToken) を設定できますが、今回は不要だったためnullとしています
- 参考：[CurrentLocationRequest.Builder()](https://developers.google.com/android/reference/com/google/android/gms/location/CurrentLocationRequest.Builder)、[getCurrentLocation()](https://developers.google.com/android/reference/com/google/android/gms/location/FusedLocationProviderClient#public-abstract-tasklocation-getcurrentlocation-currentlocationrequest-request,-cancellationtoken-cancellationtoken)

##### サンプルコード上のCurrentLocationRequest.Builder()のプロパティについて
- [setPriority](https://developers.google.com/android/reference/com/google/android/gms/location/CurrentLocationRequest.Builder#public-currentlocationrequest.builder-setpriority-int-priority)
  - 位置情報を取得する際の精度で、LocationRequestと同様
  - デフォルト値: `Priority.PRIORITY_BALANCED_POWER_ACCURACY`
- [setDurationMillis](https://developers.google.com/android/reference/com/google/android/gms/location/CurrentLocationRequest.Builder#public-currentlocationrequest.builder-setdurationmillis-long-durationmillis)
  - リクエストのタイムアウトのリミット
  - 公式では30秒が推奨されているが、将来的に変わる可能性を見込んでおく必要があるとの記載あり
  - デフォルト値: `Long.MAX_VALUE`
- 他の設定値もあるので、必要に応じて設定することも可能です

## ハマりポイント
- 実際に上記のように位置情報を取得できた場合には、locationが返却されるのですが
nullableになっているためnullで返ってくる可能性があります。
なのでnullチェック等を自前でやってあげないと予期せぬ挙動となってしまうこともあると思われるので注意が必要です。

--- 
以上です。

定期的に取得する方法とワンショットで取得する方法の２通りを知ることにより、電池の寿命を考慮しつつユースケースに応じてリクエスト方法を選べるようになるので、公式でも記載しておいてくれるといいなと思いました
【TS】forEachの中でasync,awaitは使えない

## forEachの中でasync,awaitは使えない

forEachのコールバック関数はasync,awaitに対応していないので以下のエラーとなる
```ts
Object.values(validationErrors).forEach(val => {
  // 'await' 式は、非同期関数内と、モジュールのトップ レベルでのみ許可されます。
  await new Promise((resolve) => setTimeout(resolve, 500))
  console.error(val)
})
```

## ループでasync,awaitを使いたいならconst x of Objectを使う

`const x of Object`の中であれば、awaitだけで非同期処理を同期的に使える
```ts
for (const val of Object.values(validationErrors)) {
  await new Promise((resolve) => setTimeout(resolve, 1000));
  console.error(val)
}
```
量子コンパイラを作る。 その10

# 概要
量子コンパイラを作る。
blueqatから、qiskitに変更する。
論理回路を作ってみた。
全パターンを一度に求めるタイプ。
a,bが入力、ｃが出力。

# and

| c | b| a|
|:-----------------:|:------------------:|:------------------:|
| 0             |      0 |        0      |
| 0             |      1 |        0      |
| 0             |      0 |        1      |
| 1             |      1 |        1      |


```
qc = QuantumCircuit(3)
qc.h(0)
qc.h(1)
qc.ccx(0, 1, 2)


```

# xor

| c | b| a|
|:-----------------:|:------------------:|:------------------:|
| 0             |      0 |        0      |
| 1             |      1 |        0      |
| 1             |      0 |        1      |
| 0             |      1 |        1      |

```
qc = QuantumCircuit(3)
qc.h(0)
qc.h(1)
qc.cx(0, 2)
qc.cx(1, 2)



```

# or

| c | b| a|
|:-----------------:|:------------------:|:------------------:|
| 0             |      0 |        0      |
| 1             |      1 |        0      |
| 1             |      0 |        1      |
| 1             |      1 |        1      |

```
qc = QuantumCircuit(3)
qc.h(0)
qc.h(1)
qc.ccx(0, 1, 2)
qc.cx(0, 2)
qc.cx(1, 2)




```

以上。
paiza 勉強記録【検索履歴】【Java】

paizaでの勉強記録です。
今回は下記のレベルアップ問題集のCランク問題の「検索履歴」を実施しました。
ArrayListを検索履歴の格納用として使用しました。
Listからremoveした後に勝手に要素の前詰めをしてくれるんですね
設計段階で検索履歴にある文字列が来た場合の既にある要素の削除や、履歴の先頭に持ってくる処理をどうすればいいのかと悩みましたが、ArrayListが全部解決してくれました、、、

https://paiza.jp/works/mondai/c_rank_skillcheck_archive/search_history

```java
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
//        検索ワードの数
        int number = sc.nextInt();
//        検索履歴
        List<String> searchHistory = new ArrayList<>();
        
        for (int i = 0; i < number; i++) {
//        	検索ワードの取得
        	String inputWord = sc.next();
//        	取得した検索ワードが検索履歴に存在するかのチェック
        	if (searchHistory.contains(inputWord)) {
//        		先に存在している検索履歴を削除してから、検索履歴の先頭に追加
//        		後に削除にする場合はlastindexofで削除対象の場所を探す
        		searchHistory.remove(searchHistory.indexOf(inputWord));
        		searchHistory.add(0, inputWord);
			} else {
				searchHistory.add(0, inputWord);
			}
		}
        
//        検索履歴を先頭から出力
        for (String word: searchHistory) {
			System.out.println(word);
		}
        
        sc.close();
    }
}
```

### 参考

https://www.javadrive.jp/start/collection/index1.html#section8
SSO(シングルサインオン)についてざっくりまとめ

## 前置き
SSO(シングルサインオン)についてざっくりまとめた記事です。
備忘録として残しています。

## SSO(シングルサインオン)ってなに？

シングルサインオン(Single Sign On)は１回の認証で複数のシステムやサービスを利用できるようにする認証の方式

→利用者は、１回認証が通れば、許可されている複数のサービスを利用できる

## 導入のメリットは？
・パスワード管理の煩雑さ(手間やコスト)を大幅に軽減できる！
・業務効率(利便性)が向上する！
・セキュリティ向上！

## 導入のデメリットは？
・認証システムへの依存度の高まり
→認証基盤が障害等によりダウンしていた場合、関連サービスへ接続できなくなり業務へ影響を及ぼすおそれがある！

・情報漏洩による不正アクセス時の被害拡大
→アカウント乗っ取りなどにより、権限を突破されてしまうと、関連するサービス等不正利用につながり、影響範囲が拡大するおそれがある！

・シングルサインオンを使用できないケースの存在
→システムに応じて、SSOが利用できないおそれがあり、その場合管理が煩雑になるおそれがある。

## SSO実現方式
・フェデレーション方式
・エージェント方式
・リバースプロキシ方式
・代理認証方式

→最も採用されがちなのは **フェデレーション方式**

代表的プロトコル
・SAML
・OpenID Connect(OIDC)

## フェデレーション方式
**認証連携**の意味
複数のサービスを利用する際に、ひとつのシステムで認証済みであれば、他のシステムを利用した際に、改めて認証要求せずに利用できるよう連携する仕組み

```
例：一連の流れ
利用者がAサービスにログインしBサービスを利用しようと考える
サービスBはサービスAに「チケット」とよぶ利用者認証情報を要求
利用者がサービスAにログインしてると、AがBに利用者の認証が完了していることを伝える
利用者はサービスAのID/PassでサービスBをログイン操作なしで利用できる
```

## エージェント方式
SSOを利用したい全てのサービスにエージェントを導入し、その認証情報からSSOサーバで認証する方式
```
例：一連の流れ
SSOの対象となるサーバ(サービス提供側)すべてにエージェントと呼ぶモジュールをインストールする
利用者はSSOサーバから認証済資格情報が含まれたCokkie(クッキー)を受け取る。
SSOの対象サーバに導入されたエージェントが利用者の認証済みCokkieを確認し、サービス利用の許可、拒否を判定する
ただし、Cokkieの仕様上、Cokkieが有効となる同一ドメイン内でしか利用できない！
```

## リバースプロキシ方式
利用者とサービスの間に、書くサービスの代わりとしてリバースプロキシサーバを配置し、そのリバースプロキシサーバで認証する方式

```
例：一連の流れ
リバースプロキシサーバにエージェント導入することで、SSOを実現する
サービスへ接続は、リバースプロキシサーバ経由でのアクセスとなる、および、エージェントなどのプログラムがリバースプロキシサーバ以外では不要となることが特徴
ただし、リバースプロキシ経由となると、すべての認証がこのサーバを経由して行うことになるため、アクセスが集中し、リバースプロキシサーバに障害が発生するとシステム全体に影響が波及する
```

## 代理認証方式
    
利用者の端末へエージェントを導入し、そのエージェントがユーザに変わって各サービスへのログインを行う。エージェントがユーザのものであることの認証はSSOサーバが行う

```
例：一連の流れ
利用者の端末に導入したエージェントには、あらかじめユーザID/Passを保持させておき、利用するサービスのログイン画面が表示された時、エージェントがログインのために必要な認証情報を代理で入力する。
エージェント方式では、サービス提供側にエージェントを導入したが、代理認証方式では、サービスの利用者側にエージェントを導入するという違いがポイント！
```

お疲れ様でした。
以上、ざっくりまとめでした！
空のディレクトリをgit管理したい

空のディレクトリをgit管理したいことがある。
例えばdockerでmysql環境を作る時など。sockファイルやその他もろもろはコンテナ作成時にローカルにマウントすれば自動生成されるから、いちいち管理がいらなかったり、そもそもsockファイルは管理できない。

# .gitignore
通常のgitignoreに加えて、空のディレクトリ配下にも.gitignoreを置く
```
* //　このディレクトリのすべてのファイルを無視して！
!.gitignore //ただしこのファイルは上記から外して！（git管理して！）
```
以下のように書くことで、ディレクトリの中身を管理しないようにできる。
なお、この方法では今後このディレクトリに何か追加されても管理されない。

# .gitkeep
こちらも空のディレクトリに配置する。
上記とは違い、中身は何も書かなくていい。
ただし、今後このディレクトリに何か追加されたときはgit管理されてしまう。
【AWS SAP】AWS Control Towerのライディングゾーンとは

# 概要
AWS Control Towerは、AWSアカウントを管理するためのツールです。これを使うと、複数のAWSアカウントを統一されたルールやベストプラクティスに基づいて管理できます。

## ランディングゾーンとは
ランディングゾーンは、AWS Control Towerが作成する管理用の基盤環境です。この環境には、以下のような設定が含まれます：
- セキュリティのベストプラクティス（ガードレール）
- アカウント管理の仕組み（AWS Organizations）
- ログ管理や監査のためのAWSリソース
- ランディングゾーンを作成することで、複数のAWSアカウントを統一して管理できる基盤が整います。

## 本番アカウントと開発アカウント
- 本番アカウント: 実際のサービスを提供するための環境
- 開発アカウント: テストや新しい機能の試験を行うための環境

この2つのアカウントを、用途に応じて別々に作成します。

## OU (Organizational Unit)とは
AWS Organizationsで使われる、アカウントをグループ分けするための単位です。
- 本番OU: 本番環境用アカウントをまとめたグループ
- 開発OU: 開発環境用アカウントをまとめたグループ

これにより、各グループごとに異なるポリシーや制限を適用することができます。

## 簡単にいうと「会社のオフィス環境」
- ランディングゾーン
    - ビル全体の設計図と管理ルール（セキュリティゲート、監視カメラなど）。
　
- 本番アカウントと開発アカウント
    - ビル内の2つの部屋（1つは顧客対応用の「本番オフィス」、もう1つは実験や新規プロジェクト用の「開発オフィス」）。
　
- 本番OUと開発OU
    - 部屋の用途ごとに異なる鍵やアクセスルールを適用。
## メリット
- 本番環境と開発環境を分けることで、セキュリティや運用ミスのリスクを軽減。
- AWS Control Towerが提供するルールで、効率的に管理と監視が可能。
- 環境ごとのポリシー適用で柔軟性を確保。