【AWSコンテナ入門】簡単なPythonアプリをECSにデプロイしてみよう!
この記事では、AWSにおけるPythonアプリのデプロイ方法について詳しく解説されています。特に、このハンズオンでは、Streamlitを用いた簡単なチャットアプリをAWSのECSにデプロイする手順を紹介しています。まず、AWS環境の構築から始まり、IAMユーザーの作成や必要なポリシーの設定、AIモデルの有効化、DynamoDBのテーブル作成、コンテナレジストリの作成までの準備が説明されています。 作業環境はMacbookを使用し、Pythonのバージョンは3.9以降が推奨されています。AWSの利用には費用が発生するため、利用後は不要なリソースを停止・削除することが推奨されています。また、セキュリティの観点から多要素認証の設定が強く勧められています。 次に、Pythonコードの作成に進みます。VS Codeを用いて、必要な外部モジュールをインポートし、セッションIDや会話履歴の管理を行うコードが記述されます。アプリケーションの主要機能であるAIチャットのための処理チェーンも定義されます。 後半では、AWSインフラの構築が続き、VPCの作成、セキュリティグループの設定、IAMロールの作成、ECSのクラスターとサービスの作成が行われます。ALB(Application Load Balancer)の設定も重要なポイントで、インターネットからのアクセスを許可するための設定が詳述されています。 最後に、デプロイ後の動作確認が行われ、ALBのDNS名を使用してアプリにアクセスする手順が説明されます。トラブルシューティングのためのヒントも提供され、さらに進んで独自ドメインの取得や認証機能の導入、バックエンド機能の拡張についての提案がなされています。記事の内容は、AWSを用いた生成AIの実践的なハンズオンとして、新しい技術を学ぶための有益なリソースとなっています。
元 paiza アルバイトが解説する S,A,B,C,D 全 25 問!
この記事は、元paizaアルバイトのryusukeによる「paiza x Qiita コラボキャンペーン」に関連した解説記事であり、DランクからSランクまでの合計25問を詳しく解説しています。ryusukeは2021年から1年間、paizaで問題や解説コードの作成に従事しており、その経験を基に今回の解説に挑みました。最初は1問だけを解説するつもりでしたが、全問解説することに決め、結果として予想以上の労力がかかりました。 記事では、各ランクごとに対象者の勉強に役立つ情報が提供されています。Dランクの問題は、アルゴリズムやデータ構造に興味を持つ初心者向けで、標準入出力が必要な問題が含まれています。次に、Cランクは基礎的な文法を理解した人向けの演習問題、Bランクは実装が難しい問題に取り組むことを目的としたもの、Aランクは高度なアルゴリズムを駆使する問題、そしてSランクは更なる高みを目指したい中上級者向けの問題が紹介されています。 最後に、ryusukeは全ての問題を解くのに想定以上の時間がかかったことを述べ、この記事を通じて競技プログラミングに取り組む人々に何らかの価値が提供できればと願っています。また、解説内容の正確性についても誤りがあれば指摘してほしいと呼びかけています。興味のある人には、GitHubに公開されているコードも参照するよう勧めています。
次世代の高速計算。自動で高効率なGPU対応コードに変換するプログラム。
東京の青山に住むプログラマーの田中健太は、GPUの力を活用して非効率なNAMPyコードを自動で高効率なGPU対応コードに変換するプログラムの開発に取り組んでいました。彼は、古いループ処理の問題から解放されることを目指し、手動での最適化から自動化へと進んでいきました。彼のプログラムは、NAMPyコードを解析し、cupyを利用してGPUの処理能力を最大限に引き出すものでした。 田中はプログラムのテストを重ね、正確な変換を行うことに成功し、処理速度が劇的に向上したことを確認しました。彼の努力により、複雑な計算が瞬時に完了する様子を目の当たりにし、達成感を味わいました。田中は、自分の作り上げたプログラムが他のプログラマーやデータサイエンティストの助けとなることを願い、次の挑戦に向けて準備を始めました。 次に、GPUでの並列計算を行うコードの自動生成の試みとして、cp.linspaceとcp.meshgridを使用し、放物線の計算を配列操作で行う方法が紹介されました。メッシュグリッドを使うことで、全ての座標点を同時に計算し、結果をCPUメモリに戻すことができます。具体的なコード例も示され、ループ計算と比較することで計算効率を評価する方法が解説されました。GPUを使用したメッシュグリッド計算の時間は、CPUでのループ計算に比べて圧倒的に短くなることが明らかになりました。 また、1重から4重のループをそれぞれCuPyを用いて変換する方法も示され、元のコードと変換後のコードの比較が行われました。さらに、CuPyの主要な関数の説明や、メッシュグリッドの作成方法、用途についても触れられました。これにより、GPU上での効率的な計算が可能になることが強調され、特に3Dプロットや数値シミュレーションにおける利点が説明されました。
10ヶ月で50個の日本製Shopifyアプリを作った話。あるいは、未経験エンジニアの教育について。
この文章では、著者が未経験エンジニアを育成し、10ヶ月で50個の日本製Shopifyアプリを開発した経験について詳細に語られています。著者は27歳で、大学卒業後にIT企業を起業し、これまでインターンシップを通じて採用を行っていましたが、新しい風を取り入れるために未経験エンジニアを求人サイトを通じて採用しました。開発体制は、著者自身と数人のエンジニア、新米エンジニアが混在し、主に新米エンジニアが活躍する環境を整えることが重要であると述べています。 最初に開発したアプリは「シンプルポイント」というポイントアプリで、開発には約2週間かかりました。このアプリは簡単に作成できるもので、初めての試みとして新米エンジニアが活躍できる体制を整えるために、社内用のアプリのテンプレートを作成しました。このテンプレートには、APIの使用法やフォルダの構成、データ型の付け方などが含まれ、全ての作業に対して仕様書が作成されました。 新米エンジニアは、実際の開発において苦労をしながらも、最初に開発したアプリは簡単なもので、約1ヶ月かかりました。著者は新米エンジニアの実力不足を感じ、学習期間を設けることにしました。具体的なコードの書き方やJavaScriptの文法を教えるために、動画教材を作成し、Udemyで販売しました。 再び開発に戻った新米エンジニアたちは、今度はShopifyのLiquidを使用したアプリを作成し、詰まった際にはすぐに質問できる環境を整えました。これにより、進捗報告や問題点の共有が行われ、全体の生産性が向上しました。難易度を上げたアプリの開発においても、未経験者が仕様を確認せずに進めてしまう問題が見られ、コードレビューやプルリクエストのタイミングについても指導が行われました。 未経験エンジニアの採用基準は緩やかであり、著者は技術力を重視していないことを認めていますが、今後は技術力をしっかり判断する必要があると感じています。さらに、福岡でエンジニアを目指す方へのメッセージも含まれており、教育に労力がかかることを痛感している著者の姿勢が示されています。 最後に、弊社が開発したShopifyアプリの紹介が行われ、具体的なアプリ名や開発にかかった日数が列挙されており、インターン生が関わったアプリも多く含まれています。全体を通じて、未経験エンジニアの教育とアプリ開発に関するノウハウが詰まった内容となっています。
アプリの★5評価が激増!不満をもらう&応援してもらう方法
私は、AndroidとWindows向けのドラマティック高校野球シミュレーションゲーム「栄冠にゃいん2024」を公開しています。このアプリはGoogle Playで評価数800件、平均評価4.7を獲得していますが、他の有名な野球ゲームと比較すると完成度は低いです。しかし、平均評価4.7はトップクラスです。この記事では、個人開発者として★5評価を増やす方法を紹介します。内容は大きく2つの章に分かれています。 第1章では、低評価の要因を解消することが重要です。具体的には、ユーザーがアプリに不満を持ったとき、簡単に要望を報告できる手段を設けることが効果的です。私のアプリでは、画面に「報」ボタンを設置し、ユーザーが不満を容易に伝えられるようにしています。このボタンを通じて多くの要望や不具合報告を受けることができ、低評価を減少させることに成功しました。また、報告をしてくれたユーザーには感謝の返信とゲーム内ポイントを贈呈する制度を設けており、ユーザーとのコミュニケーションを強化しています。 さらに、初めはゲーム内ポイントに意味がなくても、将来的に役立つ可能性を示すことで、ユーザーの興味を引き続けることができます。私のアプリでは、1年半ポイントが無意味であったにもかかわらず、不満を受けることはありませんでした。 第2章では、レビュー依頼の戦略を説明します。レビュー依頼はユーザーがアプリに熱中した後、達成感を得たタイミングで行うのが望ましいです。具体的には、私のアプリでは「甲子園出場の決定時」にレビュー依頼を行います。また、ユーザーの期待感を高めるために、個人開発者としての努力や感謝の気持ちを伝えることが重要です。レビュー依頼の直前には、感謝の気持ちを込めてゲーム内ポイントをプレゼントし、好意の返報性を利用します。 また、開発やサポートが滞る時には、その理由を正直に告知することで、ユーザーの理解を得やすくなります。私の経験では、開発を停止していた際に★5評価が増え続けたことがあり、ユーザーの応援を実感しました。これにより、評価数500件以上で平均評価4.9を達成することができました。 最後に、個人開発者としての特性を活かし、ユーザーとの距離を縮めながら感謝の気持ちを伝えていくことで、応援を得やすくなると感じています。この記事で紹介した方法を他の開発者にも活用していただきたいと思います。興味を持たれた方は、ぜひゲームをダウンロードしてみてください。
React|TechPitの『ゴルフ場検索サービス』を作ってみた
本記事では、ReactとTypeScriptを使用した『ゴルフ場検索サービス』の開発について紹介しています。特に、サーバーレス開発やAWSのサービスに興味があるエンジニアに向けて、実際の学習体験がシェアされています。TechPitの教材を通じて、ReactやTypeScriptの使い方が丁寧に解説されており、特にAWS関連のサービスを利用する際の敷居が下がったことが強調されています。 具体的には、AWS AmplifyやAmazon DynamoDB、AWS Lambda、Amazon API Gatewayを活用し、GUI操作で簡単に構築できることが述べられています。また、外部APIの利用方法として、楽天GORA系APIやGoogle Maps Platformが取り上げられ、登録手順や設定方法についても詳細な説明が行われています。 教材は2023年3月に最終更新されており、ユーザーは各パートでバージョン指定を行うことで、最新の情報にアクセスできるようになっています。著者はフロントエンドとバックエンドの両方を最新バージョンで試し、コードの違いを見ながらデバッグを行った経験を共有しています。 最後に、他の言語での実装も学びに役立つと示唆され、興味を持った読者に対して教材の活用を推奨しています。また、記事の中で著者が所属する企業の紹介も行われており、メンバーが学んだ内容をQiitaにアウトプットしていることや求人情報へのリンクも提供されています。興味のある方はぜひチェックしてほしいとのことで、記事は感謝の言葉で締めくくられています。
Elixir スクリプト で /dev/stdin
を File.read
で直接読むには?
Elixirスクリプトで/dev/stdin
をFile.read
で直接読む方法についての質問がelixir.jpのSlackで話題になりました。この質問に関連して、質問者はFile.read("/dev/stdin")
の動作が納得できず、手元でテストを行った結果を共有しました。具体的には、Linux環境でelixir test.exs < test.exs
を実行したところ、期待通りの出力が得られましたが、cat test.exs | elixir test.exs
を実行した際には予期しない空の結果が得られました。 質問者は手元にMacがないため、以降のテストはLinux環境で行いました。スクリプトとしてpipe_test_with_file_read.exs
とpipe_test_with_io_read.exs
の2つを用意しました。前者はFile.read!("/dev/stdin")
を用いて、後者はIO.read(:stdio, :eof)
を用いて標準入力を読み取る内容になっています。興味深いことに、echo hello | elixir pipe_test_with_file_read.exs
を実行すると空文字列が返され、一方でecho hello | elixir pipe_test_with_io_read.exs
では期待通りの"hello"が出力されました。 これは、File.read
が期待通りに動作しなかった理由に疑問を抱く結果となりました。また、ping
コマンドを使ったテストではpipe_test_with_file_read.exs
でも出力が得られましたが、最初の出力が欠けるという現象も確認されました。質問者はこの挙動について、Elixirのリポジトリで問題を提起し、Erlangのバッファリングが影響している可能性を指摘されました。 さらに、Erlangの-noinput
オプションを使うことで問題を解決できることが分かり、特定のスクリプトを作成し実行したところ、期待通りに動作することが確認されました。このオプションを用いることで/dev/stdin
を直接読むことができ、競合を避けることができました。 最後に、質問者はIO.readが遅いために/dev/stdin
を直接使用したいと考えた背景があり、そのパフォーマンス向上に貢献することができれば、他の利用者にもメリットがあるかもしれないと結論づけました。以上がこの話題に関する詳細な要約です。
JISOUコミュニティのイベントを通して
今期、私が所属するJISOUコミュニティで開催された「HARD DAY」というイベントについてお伝えします。このイベントは、単に作業をするだけでなく、参加者同士がコミュニケーションを取りながら進め、時には筋トレを行うという非常にハードな内容です。それでも、このイベントを通じて得た学びは非常に豊富であり、その内容を共有します。 まず、他の人と作業をすることのメリットについてですが、自己学習は通常一人で行うことが多い中、今回のイベントで仲間と一緒に作業することで自分のスキルの限界を実感しました。他の参加者のレベルの高さを知ることで、自分ももっと成長できると感じました。 次に、コードのリファクタリングに関しての学びです。リファクタリングの本質は、コードを見やすくすることにあると理解しました。たとえば、短いコードと長いコードのどちらが読みやすいかという観点で考えると、簡潔さだけではなく、可読性が重要であることが分かりました。関数名やコメントを工夫することで、コードの意図がより明確になり、理解しやすくなることを学びました。 また、ポモドーロテクニックを用いた作業も行いました。これは25分間集中して作業し、5分間休憩を挟むという方法で、集中力を維持するのに役立ちました。このテクニックを取り入れることで、作業中に気持ちがリセットされ、効率が向上したと感じました。 作業の合間には筋トレも行いましたが、これは非常に効果的でした。筋トレの後は作業が捗り、自己学習においては自分との戦いが多い中で、身体的な疲労を感じながらも精神的なリフレッシュができました。特に、バーピージャンプなどの運動はおすすめです。 総じて、今回のイベントに参加したことで、Reactの知識を深めるだけでなく、一人での学習では得られない多くのことを学べました。他の参加者との共同作業が、自分のスキル向上に非常に重要であると強く感じました。最後に、プログラミングコーチングJISOUでは新しいメンバーを募集中です。興味のある方はぜひHPをご覧ください。
Quest3のアプリ開発でパススルー機能を使う方法
この記事では、Quest3のアプリ開発におけるパススルー機能の使用方法について、筆者が経験したエラーと解決策を共有しています。筆者はジョジョ好きなXRクリエイターであり、同じような困難に直面している開発者に向けて情報を提供することを目的としています。まず、Meta Quest Linkの設定を確認し、パススルー機能を有効にすることが重要であると強調しています。 開発環境としては、Unity 2022.3.22f1、Meta Quest3、Meta Quest Linkを使用しています。環境構築の手順として、Unity Hubから新しいプロジェクトを作成し、Meta XR Core SDKをインポート、Project Settingsでの設定を行うことが求められます。特に、Outstanding Issuesを解決するために「Fix All」を押し、赤いビックリマークを消す作業が必要です。 次に、パススルー機能の実装手順として、Main Cameraを削除し、OVRCameraRigをHierarchyに追加します。その後、OVRCameraRigの設定を行い、パススルー機能を有効にするために必要なチェックボックスを選択し、OVR Passthrough Layerを追加することが説明されています。特に、CameraのClear FlagsをSolid Colorに設定し、背景を完全透明にすることが重要です。 さらに、Meta Quest Linkの設定で「開発者ランタイム機能」と「Meta Quest Link経由でのパススルー」をオンにすることが必須であり、これを忘れたために筆者はエラーに悩まされた経験を語っています。最終的に、パススルー機能は再生ボタンを押しても動作することが判明し、ビルドターゲットの設定に関しては特に問題がないことを指摘しています。 筆者は、他の記事では触れられていないこの設定の重要性を再認識し、初めてパススルー機能に挑戦する開発者へ参考になればと願っています。また、最後にQuest開発への励ましの言葉を記しています。
UnityのVRアプリサンプルからVisionProアプリの開発を始める(導入編)
UnityのVRアプリサンプルを基に、VisionProアプリの開発を始めるための導入編です。著者はApple Vision Proの開発に従事しつつ、個人開発の機会を利用してXR関連の基本的なフレームワークを学んでいます。その結果、UnityのPolySpatialのサンプルを利用しなくても、従来のVRアプリ開発スタイルでVision Proアプリを開発できる可能性があることが分かりました。本記事では、従来のVRアプリのサンプルに変更を加え、VisionPro実機での動作を取り上げます。ただし、PolySpatialの利用にはUnity Proのライセンスが必要であり、将来的にこの記事の方法では動作しなくなる可能性もあります。 本記事はVisionProのImmersive Spaceモードに焦点を当てており、WindowやVolumeモードには対応していません。また、Play To Deviceの動作確認は行っていません。使用したUnityのバージョンは2022.3.42f1で、プロジェクトで使用するパッケージにはCore RP LibraryやShader Graph、XR Plugin Management、XR Interaction Toolkit、XR Hands、Apple visionOS XR Plugin、PolySpatial関連のパッケージが含まれています。 プロジェクトのセットアップでは、まずXR Plug-in Managementの設定を行い、Apple visionOSを選択します。次にApp ModeをMixed Realityに設定し、Hands TrackingとWorld SensingのUsage Descriptionを記入します。続いてXR Handsのサンプルファイルをインポートし、必須コンポーネントを追加します。シーンの設定では、Volume Camera Window Configurationを作成し、Unboundedに変更します。また、Volume Cameraを追加し、XR Originの子要素としてAR SessionとInteraction Managerを設定します。手のモデルのマテリアルもUniversal Render Pipeline/Litに差し替えます。 ビルド手順では、UnityからXcodeプロジェクトへの出力を行い、VisionOSに切り替えた後、ビルドを実行します。Xcodeでのプロジェクト設定を行い、アプリを実行するとXR HandsのサンプルアプリがVision Proで動作することを確認できます。 最後に、Vision Proのアプリ開発は従来のVR開発とシナジーがあり、今後も他のVR HMDとのクロスプラットフォーム開発が可能になると期待されています。また、XR Interaction ToolkitベースのサンプルアプリもVision Proで動作するため、将来的に関連する記事を執筆する予定です。
Pythonで Yahoo! ファイナンス の情報を取得する。
Pythonを用いてYahoo!ファイナンスの情報を取得する方法について解説しています。まず、yfinanceというライブラリを使うことで、株価、為替、主要な株式指数などの情報を簡単に取得できることが特徴です。このライブラリは、pip install yfinanceでインストールが可能で、指定した期間や間隔で株価を取得し、グラフにすることもできます。さらに、企業の財務三表や配当金情報なども取得できるため、企業情報の分析やカスタマイズしたスクリーニングが可能ですが、個人使用を目的としたツールであることに注意が必要です。 株情報の取得については、yf.Tickerを用いてシンボルを指定し、企業情報を取得します。シンボルはYahoo!ファイナンスで確認でき、例えば日本の東証のシンボルは.Tを付けて指定します。具体例として、トヨタ自動車やソニーグループ、アメリカの企業ではAppleやAmazonなどのシンボルが挙げられています。また、企業の財務三表は年毎と四半期毎に取得でき、損益計算書、貸借対照表、キャッシュフロー計算書をそれぞれ取得し、CSV形式で出力可能です。 配当金の情報は、.dividendsを使用して取得でき、具体的なデータを表示することができます。為替情報も取得でき、通貨のシンボルを指定して、例えば米ドルと日本円の為替情報を取得することが可能です。こちらもyf.downloadを使用して、株価と同様にデータを取得できます。さらに、日経225やS&P500などの株価指数もyf.downloadを用いて取得できるため、幅広い市場のデータ分析が可能です。 このように、yfinanceを活用することで、株式市場や為替市場に関する情報を多角的に取得し、分析することができるため、投資判断に役立てることが期待されます。これにより、個人投資家やアナリストが市場の動向を把握しやすくなるのです。
1次元配列上のアルゴリズム
最近、AtCoder社主催のプログラミングコンテストに参加する中で、ヒューリスティックコンテストに偏り、アルゴリズムの勉強が疎かになっていることに気づきました。そこで、1次元配列に関するアルゴリズムの復習を行うことにしました。特に、文字列処理や動的計画法、データ構造に直接関係しないものに焦点を当てて整理しています。 まず、累積和に基づく部分和について説明します。与えられた配列から特定の区間の和を求める際、愚直な方法ではO(N)の計算時間がかかりますが、累積和を用いることで、事前にO(N)の準備を行うことで、各クエリはO(1)で解決できます。次に、最大部分配列問題では、Kadaneのアルゴリズムを用いて、連続部分列の総和の最大値をO(N)で求めることが可能です。このアルゴリズムは、任意の演算においても適用できる特性を持っています。 次に、しゃくとり法(Two Pointers)により、正整数の配列に対して、総和がK以下になる連続部分列の最大長をO(N)で求めることができます。この方法では、左端と右端を動かしながら条件を満たす部分列を見つけます。 また、累積和の逆演算による区間更新(Difference Array)では、特定の区間に値を加算する操作を効率的に行うことができ、最終的にO(M + N)の時間で求めることが可能です。数直線上の特定の点での値を求める際には、事前に差分の累積和を計算します。 転倒数問題では、整数列の置換による転倒数をBinary Indexed Treeやセグメント木を用いてO(N log N)で計算できます。これにより、特定の順序での置換の回数を効率的に求めることができます。 さらに、Moのアルゴリズムは、複数の区間クエリを効率的に処理するための手法であり、O((N + Q)√Q)の計算時間で、各区間における特性を求めることができます。クエリの順序を工夫することで、計算の重複を避けることができます。 最後に、Sliding Window Aggregationでは、長さNの配列上でM個の区間に対するモノイド演算の結果をO(N + M)で求めるデータ構造を実装しています。この実装では、4つのスタックを使用し、効率的に演算を行います。 今後、思い出したことを追記しながら、アルゴリズムの理解を深めていく予定です。
ライブラリ管理とは何をするのか
ライブラリ管理についての業務を担当している著者は、数か月間の経験を通じてこの分野の理解を深め、ライブラリ管理の役割や使用ツールについてまとめています。ライブラリ管理は、モジュール管理やIT資産の管理、環境整備と提供を行う業務であり、モジュールとはソフトウェア開発やシステム設計における特定の機能を持つ独立した部品を指します。 使用しているツールの一例として、TortoiseSVNやSVN(Subversion)が挙げられ、これらはバージョン管理システムとしてファイルの変更履歴を管理する役割を果たします。特にTortoiseSVNは、ユーザーがGUIを介して操作できるため、業務でのファイル管理やモジュール管理において重要な役割を担っています。また、GitLabはアプリケーション開発におけるバージョン管理を中心としたツールで、納品や変更履歴の確認が可能です。さらに、JenkinsはCI/CD化を支援し、業務効率を向上させるためにSVNと連携して使用されています。 業務内容は主に開発環境、予備開発環境、検証環境、本番環境の4つに分かれており、各環境でバージョンを管理しながら進める必要があります。このように、ライブラリ管理はそれぞれのバージョンの資産を管理し、工程に応じた環境を整えることが主な業務です。しかし、現場ではまだ管理方法が確立していないものが多く、自ら考え提案しなければならないため、著者は苦労を感じつつも成長を実感しています。責任が伴う業務であるため、正確な管理が求められ、誤った管理が顧客に迷惑をかける可能性もあるため、その重要性を強調しています。 お読みいただきありがとうございました。
RAIDとは
RAID(Redundant Array of Inexpensive Disks)は、複数の汎用HDDを利用して冗長性を持たせることで、システムの可用性を向上させる技術です。今回は、特に使用されるRAIDの方式として0、1、5、6、10について詳しく説明します。 RAID0は、2台以上のHDDを一つのドライブとして扱い、データをブロック単位で分散して記録する方式です。この方式のメリットは、データ処理速度が速く、HDDの容量を最大限に活用できる点ですが、冗長性がないためデータ損失のリスクが高まります。また、リビルドができないため、安全性には欠けます。 RAID1は、2つのHDDに同じデータを保持する技術で、片方のHDDが故障してもデータが保護されるため、システムの継続運用が可能です。しかし、この方式は2台のHDDを使用するにもかかわらず、実際の保存容量は1つ分しかありません。 RAID5は、3台以上のHDDを用いてデータを分散し、同時に誤り訂正符号を生成して保存する技術です。処理速度と容量の向上が可能で、冗長性も確保されていますが、パリティ保存のための容量が必要であり、2台以上のHDD故障時には復元が難しいというデメリットがあります。 RAID6はRAID5の進化版で、2つのパリティデータを持つため、2台のHDDが同時に故障してもデータを保護できます。こうした高い安全性を持つ一方で、パリティ工法の計算により書き込みパフォーマンスは低下することがあります。 最後にRAID10は、RAID1とRAID0を組み合わせた構成で、高速化と耐障害性を実現します。ミラーリング機能によりデータの重複が可能で、ストライピングにより読み書き速度が向上しますが、基本的に4台のHDDが必要なため導入コストが高くなり、故障時には同期に時間がかかり脆弱性が高まることもあります。 このように、RAIDの各方式にはそれぞれ利点と欠点があります。今後は、どの状況でどのRAID方式が適切かを検討していく必要があります。
【UE5】傾斜フローマップをランタイムで計算する
本記事では、Unreal Engine 5(UE5)における傾斜フローマップのランタイム計算について説明しています。具体的には、マテリアルを用いて傾斜ベクトルを計算し、テクスチャを使用せずに流体の表現を実現する方法が紹介されています。使用されたエンジンバージョンは5.4.3であり、このアプローチにより様々な形状やアクタの回転にも柔軟に対応できる点が強調されています。 傾斜ベクトルの求め方は、HoudiniのSOPノードLabs FlowmapのSlopeメソッドを参考にしており、法線と下方向のベクトルの外積を用いて従法線を導出し、さらにその従法線と法線の外積から傾斜ベクトルを計算しています。UEのマテリアルでも同様の処理を再現可能であり、得られた傾斜ベクトルはワールド空間のベクトルとして機能します。 フローマップに関しては、いくつかの便利な関数が用意されていますが、本記事ではFlowMaps_Simpleを使用しています。DiffuseまたはNormal Mapインプットにフローマップで変形させるテクスチャオブジェクトを設定し、計算した傾斜ベクトルをワールド空間からタンジェント空間に変換するプロセスも詳述されています。具体的には、Transformノードを使用して、ノードのDetailsからSourceをWorld Space、DestinationをTangent Spaceに設定する必要があります。 最後に、実装における制限についても触れられており、メッシュの法線が正しい方向を向いていることが前提条件であることや、法線の再計算を行わない場合、正確な傾斜を計算できないことが指摘されています。また、タンジェント空間での計算のため、UVシームによるテクスチャの切れ目やUVアイランド毎のスケールの違いが流れる速度や見え方に影響を与える点についても注意が必要です。
.ps1をダブルクリックで実行したい
.ps1ファイルをダブルクリックで実行することは、セキュリティの観点から直接的にはできませんが、使い勝手を向上させるために.batファイルを利用して実行する方法があります。この方法では、.batファイルを作成し、同じフォルダにある.ps1ファイルを呼び出すことができます。具体的には、以下のようなバッチファイルを使用します。 plaintext @echo off powershell -ExecutionPolicy Bypass -NoProfile -File %~dpn0.ps1 %* if %errorlevel% neq 0 ( pause )
さらに、複数の.ps1ファイルと.batファイルが同じフォルダにあると見栄えが悪くなることから、.ps1ファイルを別のフォルダにまとめたくなることもあります。その場合は、バッチファイル内のパスを調整することで対応できます。例えば、以下のように記述することで、ps1フォルダ内の.ps1ファイルを実行することが可能です。 plaintext @echo off powershell -ExecutionPolicy Bypass -NoProfile -File %~dp0\ps1\%~n0.ps1 %* if %errorlevel% neq 0 ( pause )
このようにして、.ps1ファイルをダブルクリックで実行するための便利な方法を確立できます。
Qwen AIによる、自動で高効率なGPU対応コードに変換するプログラム。
Qwen AIによる自動で高効率なGPU対応コードに変換するプログラムについての物語が描かれています。物語は東京の千代田区にある小さなオフィスで、プログラマの佐藤健一が主役です。彼は最新の技術を追求し、CuPyを使ってGPU計算の最適化に取り組んでいます。彼の夢は、大規模データをリアルタイムで処理することですが、エラーコードに悩まされていました。 健一は3日間の試行錯誤の末に、物理学の教科書の一節「シンプルさが美しさだ」を思い出し、コードをシンプルにすることを決意します。新たなアプローチでCuPyを駆使し、メッシュグリッドを使った並列計算に挑戦すると、ついに正しい計算結果を得ることに成功しました。この成功は彼にとって、技術の最前線に立つ姿勢を証明するものであり、未来へ一歩近づいた瞬間でした。 続いて、CuPyライブラリを使用してGPU上で動作するコードを生成するプログラムの具体的な実装が紹介されています。プログラムは、必要なライブラリをインストールし、GPUの利用可能性を確認した後、言語モデルとトークナイザーを読み込みます。プロンプトに基づいてコードを生成し、生成されたコードを実行する流れが説明されています。 具体的には、CuPyを用いた配列の要素を2倍にするコードの例が示され、実行結果も提示されています。ユーザーは、生成されたコードをPythonファイルとして保存し、実行することができ、実行結果をUI上で確認することができます。このプログラムによって、CuPyを活用したGPUコードの生成と実行が簡単に行えるようになっています。
動画生成AIは、4次元重みテンソルニューラルネットワークが効くのかな。
動画生成AIについてのストーリーは、プログラマーの篠田が東京の夜に新しいアイデアを思いつくところから始まります。彼は、動画生成AIのプロジェクトに取り組んでいましたが、従来の2次元フレームに基づくアプローチには限界があると感じていました。篠田は、動画の動きや時間の流れを正確に捉えるためには、より複雑な方法が必要だと考えました。 彼は、入力データを2次元から3次元のテンソルに変換し、さらに4次元の重みテンソルを用いることで、動きと空間情報を同時に学習させるアイデアを思いつきました。この新しいアプローチにより、AIは時間的な変化と空間的な情報を捉え、より自然な映像を生成できると確信しました。 篠田は、3x3x3のテンソルを用いてコードを作成し、4次元重みテンソルとの掛け算を行うことで、AIが映像の動きや変化を学習できるようにしました。プログラムを実行すると、これまでのAIでは生成できなかった自然な流れの映像が表示され、彼はその成果に満足しました。 さらに、篠田は勾配降下法を用いた重みの調整を行い、目標となるテンソルに近づけるための最適化を進めました。彼の取り組みは、動画生成AIの未来を切り開く重要なステップとなると信じています。最終的には、生成された出力テンソルとターゲットテンソルの比較を行い、学習の進捗を確認することができました。篠田は新たな挑戦へ向けて心を新たにし、AIの可能性を探求し続ける決意を固めました。
レッドチーム戦略で強化するサイバーセキュリティ
レッドチーム戦略は、企業や組織がサイバーセキュリティを強化するために重要な手法です。近年、サイバー攻撃は高度化し、複雑化しているため、組織はその脅威に対して効果的な対策を講じる必要があります。レッドチームとは、サイバー攻撃者の視点から組織のセキュリティを評価し、脆弱性を発見して攻撃を行う専門チームを指します。これにより、理論的な防御策を超え、現実的な脅威に対する防御力を測定することができます。 レッドチーム戦略には多くのメリットがあります。まず、リアルな脅威のシミュレーションが可能であり、実際の攻撃者の視点で評価することで防御策の強化が図れます。また、従業員のセキュリティ意識が向上し、日常業務におけるリスク対応能力が高まります。しかし、コストやリソースの負担、誤った優先順位設定のリスク、業務への影響といったデメリットも考慮する必要があります。 具体的な実施例として、A社が2020年の東京オリンピックに向けて行ったレッドチーム演習があります。演習では、マルウェア感染や物理的侵入のシナリオが設定され、実施期間は職員に事前通知されずに進行しました。結果として、メールを通じたマルウェア感染や、管理者が入室する部屋への物理的侵入が明らかになり、セキュリティ教育の強化と運用見直しが求められました。 演習後には、結果の評価と報告が必要です。発見された脆弱性に対しては迅速に修正を行い、フォローアップテストを実施して修正が確実であることを確認します。さらに、演習結果を基に社員向けのセキュリティ教育を見直し、特にフィッシング攻撃やソーシャルエンジニアリングに対する対策を強化します。 まとめとして、レッドチーム戦略は組織のサイバーセキュリティを強化するための強力な手法であり、攻撃者の視点から自社のセキュリティを評価することで、現実的な脅威に対する対応力を向上させることができます。今後のサイバー攻撃に備えるためには、理論的な防御策だけでなく、実践的な防御策を確立することが求められます。この記事を通じて、守るために攻め方を知ることの重要性を伝えたかったということです。
[DB設計]インデックス設計の基本と注意点
データベース設計におけるインデックス設計の基本について解説します。初めてDB設計を担当する際、インデックスの重要性を理解することは欠かせません。インデックスはデータベース内のデータを効率的に検索するための仕組みで、特定のカラムに対して作成されます。これにより、データベースは迅速に目的のデータを見つけることが可能になりますが、インデックスの設計にはメリットとデメリットがあります。 インデックスの主なメリットは検索処理の高速化ですが、デメリットにはディスク領域の消費やテーブルの変更時に処理速度が遅くなること、さらにはメンテナンスが必要となる点があります。したがって、インデックスを作成する際には、その必要性を慎重に検討することが重要です。 インデックスが必要なパターンとしては、レコード数の多いテーブル、カーディナリティの高いカラム、SQLの抽出条件や結合条件に使われるカラムが挙げられます。特にカーディナリティは、値の多様性を示す指標であり、高いほどインデックスの効果が高まります。一方で、主キー制約や一意制約が付与されているカラムには自動的にインデックスが付与されるため、別途作成する必要はありません。 注意すべき点として、データに偏りがあるカラムや抽出対象が全データに対して多すぎる場合はインデックスの効果が薄れます。また、データの変更が多いテーブルは、インデックスの更新が必要となり処理速度が遅くなるため、使用目的を把握することが求められます。 さらに、インデックスを活用できないSQLの例には、NULL検索、OR検索、否定系検索、演算の使用、中間一致や後方一致、暗黙の型変換があります。これらの構文ではインデックスが適用されず、フルスキャンが必要になることがあります。 DB設計を行う機会は少ないですが、インデックスの知識を深めることで、より効率的なデータベース設計が可能となります。初学者やこれからDB設計に挑戦する方にとって、この記事が参考となることを願っています。
FlutterでのGoogle Books APIを利用した書籍検索機能の実装
Flutterを使用してGoogle Books APIを活用した書籍検索機能の実装について解説します。記事では、hukusuke1007のflutter_app_templateを基に開発を進めており、このテンプレートはFlutterとFirebaseを組み合わせたアプリケーションのスターターキットとして、サンプル機能が豊富です。前提条件として、git cloneからflutter runまでの導入が完了している必要があります。特に新しいFirebaseプロジェクトの構築が必要です。この機能のゴールは、Google Books APIを用いて書籍データを取得し、結果を表示することです。検索タブを開いた際にキーワードを入力できるようにしたいと考えているものの、この記事では特定のキーワードで固定してデータを取得する方法に焦点を当てます。 実装に入る前に、APIキーの設定や使用するパッケージの確認を行います。まず、Google Books APIを使用するためのAPIキーを作成します。次に、使用するパッケージをpubspec.yamlで確認します。主に使用するパッケージには、hooks_riverpod、freezed_annotation、json_annotation、retrofit、dioが含まれています。記事に記載している内容では使用しなかったパッケージも存在しますが、今回は書籍検索に特化しているため、切り替える必要はないと判断しました。また、Postmanを用いてGoogle Books APIのリクエストをテストし、期待されるレスポンスが得られることを確認しました。 アプリ内での実装はモデル、プロバイダー、リポジトリ、コントローラー、UIの各コンポーネントに分かれています。具体的には、エラーメッセージを表示するErrorMessageウィジェットを作成し、エラー発生時に再試行ボタンを表示する機能も実装しました。自動生成にはbuild_runnerを用い、freezedやriverpodに関するファイルを生成するコマンドを実行しました。最終的に、プロジェクトをビルドし、Google Books APIからデータを取得できるか確認します。現時点では「ノラネコぐんだん」という特定のキーワードで結果を固定していますが、将来的には検索フィールドにユーザーが入力できる仕様に変更する予定です。 この記事では、FlutterアプリケーションでのGoogle Books APIの利用方法を詳しくまとめました。今後の実装に役立てていただければ幸いです。ありがとうございました。
【Nerves】WindowsのUSB Ethernet/RNDIS Gadget driver 問題
Raspi Zero WなどのUSB Gadgetモード対応機器は、PCとUSB接続することでEthernetデバイスとして機能し、TCP/IP通信が可能になりますが、最近のWindowsではそのためのドライバーが存在しないため、機能しません。具体的な解決策として、Nerves Livebookのドキュメントによると、Windows 11でcabファイルはダウンロードできたものの、infファイルが欠如しているためドライバーを読み込むことができない状況が報告されています。また、mod-duo-rndis.zipを使用した結果、Raspi Zero WがCOMポートとして認識され、ドライバーを適用することで、Windowsのブラウザーからnerves.localに接続することが可能となりました。しかし、WSL側からsshで接続を試みてもできず、mDNSが機能していないことが問題視されています。一方、Windowsではブラウザーとコンソールからnerves.localに接続できるため、接続環境に差異が見られます。
Apple Vision Pro の WorldAnchor をUnityで使う
Apple Vision ProのWorldAnchorをUnityで利用する方法について詳しく検証しました。World AnchorはAR Kitが提供する機能で、現実空間の位置を記録し、追従することが可能です。この機能により、Vision Proを一度外したりアプリを終了したり、デバイスの電源をオフにした場合でも、次回アプリを立ち上げた時に同じ位置にコンテンツを再表示することができます。UnityではAR Foundationを通じてこの機能を使うことが可能ですが、Vision Proではデバイス間でアンカーを共有するARWorldMapには対応していません。 開発環境としては、Unityのバージョン2022.3.27f1、PolySpatial 1.3.1、AR Foundation 5.1.5を使用しています。手軽に試すためには、公式サンプルを利用するのが良いでしょう。World Anchorを使用したサンプルはApple visionOS XR PluginのSampleにあり、Built-in用とURP用の2種類から選べるため、プロジェクトに適したものをインポートします。エアタップした場所にAnchorが配置され、Digital Crownを長押ししたりデバイスを再起動しても、アプリを起動すれば同じ位置にAnchorオブジェクトが配置されていることが確認できます。ただし、UnityEditorでは一応動作しますが、実機で試すことが推奨されます。Vision OSシミュレーターでは動作しないため注意が必要です。また、サンプルはFully-immersive(VR)ですが、Immersive(Unbounded MR)でも動作しますが、Share Space(Bounded)では動作しません。 AR Anchorを使用するためには、AR Anchor ManagerとAR Sessionが必要です。Anchorを追加する際は、ARAnchorコンポーネントをGameObjectに追加するだけで、非常に簡単です。追加したGameObjectの子にコンテンツを配置することで、アンカーに追従させることができます。Anchorを削除する際もARAnchorコンポーネントを削除するか、GameObjectごと削除することで行えます。複数のAnchorを配置することができ、各AR AnchorにはユニークなTrackableIdが割り当てられます。このTrackableIdを用いることで、配置したAR Anchorごとに異なるコンテンツを割り当てることが可能となります。 TrackableIdを取得する方法としては、GameObjectからARAnchorコンポーネントを取得し、trackableIdを参照します。ARAnchorManagerからTrackableIdを使ってARAnchorを取得することもできます。また、アプリ再起動後にAnchorを取得する際もTrackableIdが引き継がれますので、PlayerPrefsなどに保存しておくと便利です。注意点として、ARAnchorの復元には時間がかかることがあり、アプリ起動直後に実行すると取得に失敗する可能性があるため、適切な待ち処理を実装することが推奨されます。 最後に、全てのAnchorを破棄する場合ですが、ARAnchorはリソースを大量に消費するため、必要以上に使用することは避けるべきです。公式サンプルのClearWorldAnchorsを参考にし、不要になったアンカーは適宜削除することが重要です。以上がApple Vision ProのWorldAnchorをUnityで利用するための詳細な説明です。
Nerves Livebookで取り込んだデータをグラフ表示
Nerves Livebookを使用して、MPU6050センサーから取り込んだデータをグラフ表示することが可能になりました。測定結果を確認するために、グラフ表示機能を活用しました。Livebookを使うことで、簡単にデータを視覚化できるため、初めての利用に際して気になる点をメモしました。特に、Mix.installではモジュールのインストールができないものの、必要なCircuits.I2C、Circuits.GPIO、Nxなどのモジュールはあらかじめインストールされており、特に問題はありませんでした。また、VegaLiteを使ってデータをグラフ表示できることも確認しました。 一方で、いくつかのハマりポイントも発生しました。第一に、GenServerとの通信でタイムアウトが発生し、簡単なGenServerでは問題がないものの、デフォルトの5秒のタイムアウト設定では不足していることが分かりました。GenServer.callのタイムアウトを長く設定することで、問題を解決しました。さらに、素のNervesのiexからは問題なく操作できたものの、Livebookから使用する際には時間がかかることが確認されました。第二のハマりポイントとして、GenServerを一度起動すると、そのプロセスが終了しないため、Livebookを再起動しなければ再実行できないことが挙げられます。この問題は、通常のセル内にコードを書くとプロセスが終了せず、Reconnect and setupのセルにプログラムを書くことで、セルの評価時にGenServerが正しく止まることが理解できました。 取得したデータをグラフ表示するためには、まずデータをマップに変換し、VegaLiteの仕様を設定しました。測定結果としては、rollやpitch方向に傾けた際に、水平に戻した際に正確に0に戻ることが確認でき、精度も良好であることが示されました。まとめとして、Raspberry Pi Zero Wでは動作が遅いものの、Livebookを利用することで取り込んだデータを便利に表示できることが明らかになりました。初期化が必要なコードはsetupのセルに記述することが推奨され、今回の角度取得にはcomplementaryフィルタを使用しましたが、Nxを利用することでカルマンフィルターの実装も容易になる可能性があります。カルマンフィルターについて更に理解を深めた上で、試してみたいと考えています。
【小ネタ】Teamsの「ミーティング」がCopilotでさかのぼるのに便利
TeamsのCopilotは、特に「ミーティング」アプリを利用することで便利さが際立ちます。このアプリでは、今後の予定や過去の会議が一覧で表示され、録音済みの会議をフィルタリングすることで、文字起こしや録画された内容に簡単にアクセスできます。そして、右側にマウスを置くと「要約を表示」ボタンが出現し、これをクリックすると自動生成された会議メモやStreamサムネイルが表示されます。これにより、欠席した会議や議事録がない会議でも、録画を見たり他の人に聞いたりせずに内容を把握することが可能になります。
【合格体験記】Python 3 エンジニア認定実践試験
Python 3 エンジニア認定実践試験の受験体験について、筆者は前回のデータ分析試験に続き、受験所感を記録しています。この試験は、一般社団法人Pythonエンジニア育成推進協会が主催し、実践的なPython文法を出題するもので、75分間に40問の選択式問題が出されます。合格ラインは70%、つまり28問以上の正解が必要で、受験料金は一般が13,200円、学生が6,600円です。試験会場は全国のオデッセイコミュニケーションズCBTテストセンターで、出題範囲が公開されているため、効率的な学習が可能です。 筆者は実務経験がなく、データ分析業務に従事しているものの、自身のプライベートでPythonに触れた経験がある程度です。また、基礎試験をスキップし、データ分析試験は取得済みですが、実践試験を受けることで実務に必要な文法知識を学べたと感じています。資格勉強にあたっては、主教材である「Python実践レシピ」を学び、模擬試験アプリで実践を重ねることで合格に至りました。特に、模擬試験アプリは非常に役立ち、安心して試験に臨むことができたと述べています。 試験中はメモ用紙が配布されず、頭の中で解答を整理しながら進める必要がありました。特に「得られる結果はどれか?」という問題では、メモがあれば良かったと感じたものの、試験時間はデータ分析試験よりも長めで、見直しを重ねる中で不安を感じながらも試験を終了しました。結果的には合格できたことに安堵し、今後は新たに登場したデータ分析試験の上位資格にも挑戦したいと考えています。最後に、記事を読んでくれたことへの感謝を述べています。
学生の50%以上が使う大学非公認アプリを作った話
学生の50%以上が使用する大学非公認アプリ「トクメモ+」の開発についての記録です。徳島大学院の修士2年生、akidon0000が3年前に個人でこのアプリをiOSとAndroid向けに開発しました。アプリは、講義情報やレポート提出、学内情報を一元化することを目的とし、学生生活の多くを一つのアプリで完結させる仕組みを提供しています。アプリのダウンロード数は5200件、MAUは3259ユーザーに達し、学生からの評価も高く、レビュー評価は平均4.7を記録しています。 「トクメモ+」の開発は、既存の大学公式アプリが持つ機能的な欠点に着目し、より便利で効率的なアプリを作ることを目指して始まりました。特に、大学のWebサービスが抱えるログインの煩雑さや情報の分散状態を解消するため、パスワードの自動入力や一元的な情報提供を実現する仕組みを構築しました。開発の過程では、友人や学生の声を反映し、実装を進めていきました。 アプリの運用にあたり、大学の公認を得ることが難しいとされ、個人情報の保存に関する大学側の懸念や責任問題も浮上しました。そのため、学生団体を設立し、大学と連携を図ろうとしましたが、大学側からは責任を負うことができないとの理由で断念。アプリの利用に関する呼び出しもあり、学生の誤解を解くためにアプリの改善が求められました。 また、アプリの構造を守りつつ、DOS攻撃への対策やタイムアウト問題にも取り組みました。特に、ログイン処理における状態管理を強化し、システムが正常に稼働するように工夫しました。開館カレンダーの情報取得に関しては、Webスクレイピングを用いて対応しました。 開発コストを抑えるために、GitHubのホスティングサービスやGoogle Apps Scriptsを活用し、運営に必要なインフラを整えました。さらに、コミュニケーションツールとしてDiscordを採用し、開発メンバー間の情報共有や雑談が行える環境を構築しました。これにより、属人性を減らし、継続的な運営を目指しています。 振り返ると、アプリの開発を通じてさまざまな経験を積んできたことに気付き、今後は他の開発者とも協力しながら、さらなる機能向上を目指していきたいと考えています。現在、iOSとAndroidの開発を一手に担っている状況で、今後は企業との連携を模索し、大学公認アプリとしての道を開くことを目指しています。
ResoniteがUbuntu 22.04 LTSでfpsがでない原因を調べる
ResoniteがUbuntu 22.04 LTSでfpsが出ない原因について調査した結果、2024年3月1日以降、Resoniteが正常に動作しないことが判明し、その対策として「互換性」設定をやめることが推奨されている。最近のテストでは、これまで70fpsを超えていたのが、現在は25fpsにまで低下している。興味深いことに、もはや「互換性」設定を行わなくても動作するようになった。これまでの経験則から、GPUのドライバーを更新することや、マルチモニター環境では全モニターの周波数を統一することが効果的であることが示唆されている。特に、240Hzのモニターに液タブ60Hzを追加した際には、fpsが60Hz以上に達しなくなったことがあるが、他のアプリケーションでは240Hz近くのfpsが出ていた。
ABC367回答メモ
ABC367の回答メモでは、問題に対する取り組みや解法が詳細に述べられています。最初の目標はD問題でしたが、最終的にはC問題までの解答に留まりました。DおよびEに関しては解説を参考にして理解しましたが、理解度は約60%であり、難易度の高い問題によりレートがわずかに低下したことが記されています。 A問題「Shout Everyday」では、叫ぶ時刻と就寝時刻、起床時刻の関係を見極める必要があり、場合分けが甘かったために最初は不正解となりました。しかし、再度場合分けを行った結果、正解を得ることができました。この過程では、0時をまたぐ場合の考慮も含め、少し時間をロスしたことが反省点として挙げられています。 B問題「Cut .0」では、リストを使って入力データを処理しました。具体的には、文字をリストに格納し、末尾の0を省く処理を行い、最終的に条件に従った出力を実現しました。実装を素直に行い、早めの解答を心掛けたことが記載されています。 C問題「Enumerate Sequences」では、条件に該当するリストを全て列挙し、集約した値がKで割り切れるもののみを選び出して正解を得ました。この方法は一見簡単そうに見えますが、実際にはNが1から8までの場合分けを行い、それぞれのループを作成するという手間がかかりました。 全体として、各問題に対するアプローチとその結果が詳細に述べられており、特に反省点や実装方法の工夫が強調されています。
不正なExtraを含んだIntentを受け取ったことによるクラッシュに対処する
不正なExtraを含むIntentを受け取った際のAndroidアプリのクラッシュへの対処方法について述べられています。Androidアプリは外部からIntentで起動され、Extrasという任意の引数を渡しますが、これに不適切な情報が含まれるとアプリがクラッシュする可能性があります。たとえば、アプリAがIntentから"foo"というキーでデータを取得しようとした際、アプリBから送信されたデータクラスがアプリAに存在しない場合、BadParcelableExceptionが発生し、クラッシュします。また、Extraを読み出さなくても、SavedStateHandleを受け取るViewModelを使用する場合、同様のクラッシュが起こることがあります。 クラッシュの原因として、異なるKeyのExtraを読み出す際に、ActivityがIntentを受け取った時点でExtraの内部情報がシリアライズされたままであり、unparcel()が呼ばれるまでデシリアライズされないことが挙げられます。これにより、デシリアライズできないデータが含まれていると、データ型の不一致などから例外が発生します。API 33以降ではこの挙動が変更され、デシリアライズが必要なオブジェクトがLazyValueとして格納されるため、直接その値を読み出すまで例外が発生しませんが、SavedStateHandleを使用する場合には依然として注意が必要です。 SavedStateHandleは初回作成時にIntentのExtrasを格納し、ActivityのViewModelで使用されます。API 33未満ではkeySetの呼び出し時にクラッシュし、API 33以上ではその後のgetでクラッシュするため、どちらの場合でもクラッシュを防ぐための対策が必要です。対策としては、Extraをtry-catchで囲んで扱うユーティリティクラスを作成する方法がありますが、SavedStateHandleには適用できません。 最終的な対処法として、IntentのExtraを読み出してExceptionが発生するかチェックし、発生した場合には他の要素をコピーしたIntentで上書きする方法が提案されています。この手法により、アプリは無効なデータを含むIntentを受け取った場合でも、クラッシュを防ぎ、アプリの安定性を保つことができます。具体的には、ActivityのonCreateメソッドやonNewIntentメソッドの中で、Intentを事前に検査してsanitizeすることで、問題のあるExtraを排除します