TypeScriptDjangoのテンプレートにReactを埋め込むとかいう、妙なことをしているときに、とある理由からwindowにReactやらを追加しておく必要ができたのですが、TypeScriptだとそのまま突っ込むと型の関係で怒られました。調べてみるとほぼこのタイトルの記事があったのですが、他にもいくつか解決策が出たので残しておきます。blogちなみに、怒られたのはuseStateがReact自身の同一性を見ているからでした。windowを作り直す最初は上記の記事にあるように、window.tsファイルを作成して実装しました。こんな感じで書いたらいけるはずです。document.getElementById('hoge_container'));これで、hoge_containerタグの場所の表示を置き換えて表示しました。HogeFormの型はCommentでいけます。この場合、表示するクラスやらが増える度にwindow.tsを修正することになります。anyを使う管理ファイルが増えるのも煩わしいなぁとぼやいていたら、同僚にanyを使ったらやり方を教えてもらいました。これだとファイルも増えないので、わかりやすさは上がった気がします。TypeScript使っててanyって明示するのもなぁと、同僚と唸ることに。expose-loaderを使うといったわけで、最終的にはexpose-loaderを使って解消しました。ライブラリを追加する必要はありますが、コード自体はだいぶスッキリしたので、対価には見合っているかなと。関数をロードすると、呼び出す側が正しく認識できなかったので、いったんObjectにするようにしています(ここではContainers)。%}のようになります。今年は忘れないうちにアウトプットしていきたいところです。いい加減(自分のためにも)PBLのフォーマットを決め、テンプレートを用意するようにしました。最強なのかはともかく、現時点で一番わかりやすく運用しやすいPBLのフォーマットは、以下のようになりました。テンプレートにはGoogleスプレッドシートを利用しています。いうと、現状ではこれが一番全体の把握がしやすく、多くの人が特に追加費用無しでアクセス可能であり、独自カスタマイズを許容できるツールになるからです。強いこだわりがないのであれば、現状はスプレッドシート一択で良いのではないでしょうか。PBL項目スプレッドシートの各項目は以下のような用途を想定しています。開発範囲を示すときに使う。誰のための価値になるものを作るのかを明示する。いったことを実現するのか。いう価値が提供されるのか(リリース後に検証する内容)を書く。このアイテムでどういったことを実現するのかを具体的に書く。SKIPにした理由や、アイテム分割した際の情報などを書くPBLに携わる人数が多ければ、起票者の項目もあると便利ですスクラムでのPBL運用フローではこのPBLをスクラムのイベントに沿って運用するフローを提示してみたいと思います。各自がプロダクトバックログにTODOでアイテムを追加する(事前記入だったり、時間を取ってやったりする)プロダクトバックログリファインメントを実施し、アイテムの上の方から内容を確認していくTODOを追加した人から内容の説明を受け、チーム内のゴール認識を合わせる(レビューチェック内容を決める)アイテムのストーリーポイントを見積もるアイテムの状況に合わせて、ステータスを変更するアイテムの粒度が大きすぎたり、不明瞭な場合は、実現可能な粒度にアイテムを分割して、再度内容を精査するステータスは以下のような意味合いで利用します。スプリントプランニングを実施PBL上位のアイテムでステータスがREADYとなっているものからスプリントで実施するアイテムを決め、そのアイテムのステータスをDOINGにする。選んだアイテムはスプリントバックログ(ホワイトボードを使うのがお奨め)に移動し、タスクを詳細化・細分化する。スプリントレビューを実施スプリントで作成した成果(プロダクトインクリメント)を、PBLのレビューチェック内容と照らし合わせながらレビューする。実現できていればステータスはDONEにし、追加で実現したいことが見つかったならPBLに新しいアイテムをTODOで追加する。繰り返しこれらを繰り返していく。まとめ個人的には、価値を生み出す作業にどれだけ注力できるかが、アジャイル開発の目指すところかなと思っているので、それ以外の部分については可能な限り力をかけずに済ませるようにしたいです。PBLのフォーマットに迷うくらいであれば、とりあえずこのフォーマットに書き殴ってみて、後で適当なものに切り替えてみるとかはどうでしょうか。Migrationsをコンテナで使えるようしたので、その手順をまとめておきます。作っていた開発環境のマイグレーション関連部分に絞ってディレクトリ構成を表すと、以下のようになっています。dataプロジェクトルートにdocker-compose.ymlを置き、それ起因でコンテナを運用するようにしています。cloneして利用するイメージです。8のコンテナを立ち上げ、その後マイグレーション用のコンテナを立ち上げています。DBは複数利用することを考え、コンテナイメージ作成時に実行されるinit.sqlで作成するようにしています。Migrationsのコンテナイメージは、OpenJDKのイメージをベースに作成します。-d後(コンテナイメージ起動後)、コンテナに入ってマイグレーションスクリプトのテンプレートを作成します。initこの際、コマンド実行ディレクトリにdriversディレクトリが作成されますが、複数DBのスクリプト管理をすることを考え、WORKDIR配下にdriversを移動させます。実際に利用するMySQLのJDBCコネクタは、以下からダウンロードし、先ほどのディレクトリに配置してください。Connector/Jその後、プロパティの以下を生成された値から変更します。ip_address=192.168.0.1これで準備完了です。upを実行でもいいですが、以下のように直接実行することもできます。up"初回の起動スクリプトなどを組む場合は、こちらの使い方が便利です。LambdaLambdaを使うことになった経緯Lambdaの利用経験がなかった私が、Lambda利用を決めた流れは1日1回のS3のファイルチェック処理が必要になるファイルがなかったらSlack通知してくれればいい(簡単なスクリプトでOK今のところ、AWS上にサーバは立ってない調べてみたらLambdaもスケジュール実行できるらしいならインフラコストを考えるとLambdaがいいかでした。Lambdaで利用する言語については、JupyterやGlueと合わせてPythonに。「ついに私もサーバレスか・・・」と感慨深く利用を始めました。Console内で作業ができるようになっています。エディタも用意されており、そこのテンプレートコードにあるlambda_handle関数に処理を書けば、指定のトリガーで実行される仕組みです。言えば簡単なのですが、以下を懸念していました。Pythonのライブラリ利用についてコード管理ログ管理テスト実行(テストコードではなく)デプロイの自動化なので、今回はこれらについて記事にしようと思います。Pythonのライブラリ利用についてLambdaを利用した際に、最初から用意されているライブラリはBoto3で、それ以外を利用したい場合は、利用するPythonのコードと一緒にzipでまとめて、アップロードする必要がありました。Lambda今回はSlack通知の処理部分にrequestsを使いたかったので、zipでまとめてアップロードしています。コード管理そんな事もあって、幸か不幸かLambdaのコンソール上だけでは完結しなかったため、Lambdaプロジェクト用のGitHubリポジトリを作成し、コードは当該リポジトリ配下で記述するようにしました。ディレクトリ構成はLambdaコンソールを参考に、リポジトリルート直下に関数名のディレクトリを作成して、そこにコードを置き、リポジトリルート直下には以下のようなシェルファイルを作成して、アップロード用のzipを作る、といった具合の構成です。*しくじりポイントzipは展開後が関数名のディレクトリになるのではなく、ソースコードの配置になっていないと駄目でした。Lambdaコンソール上では、例えばsomeLambdaFunction/lambda_function.pyのような構成になっているので、てっきりsomeLambdaFunctionディレクトリもzipに含めるのかと思っていましたが、含めてしまうとsomeLambdaFunction/someLambdaFunction/lambda_function.pyのようになり、動作しなくなります。環境変数の利用WebhookのURLなどは環境変数を利用することで、コードから除去することができます。Logsで見れました。テスト実行(テストコードではなく)関数のテスト実行はLambda上でテスト用のトリガーを作成して、それを実行すればできます。処理内部で外部パラメータを利用しないのであれば、トリガーで渡すパラメータはデフォルトのままで問題ありません。ローカルで開発・実行できるように準備もしたのですが、アクセスキーの発行を渋られて、結局Lambda上でのみ動作テストすることになってしまいました。デプロイの自動化デプロイは少し曲者で、AWSのマネージドで完結させることはできなそうでした。最初はCodeDeployでいけるかと思ったのですが、CodeDeployはデプロイされているLambdaのバージョンを切り替えることしかできないようでした。CloudFormationを使えばいけるのかもしれませんが、ちょっとイメージしているのとは違うというか、CIと流れるように実行したかったといいますか。DevelopersIOというわけで、これはまだ手動です。Lambdaを使ってみて「思っていたより簡単に利用できてびっくりした」というのが素直な感想です。サーバの用意もいらないし、実行のコスト(金額的な意味で)もほとんどかからないしで、いいとこづくめだなと。その恩恵に預かれるのはLambdaを知っている人だけなんだなぁと思うと、読みかけのサーバレス本をちゃんと読んで、もっと使いこなせるようになっておこうという気になりました。知は力なりとは言ったものですね。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。