koboriakira.com

はじめに

Amazonが提供する現代的なウェブアプリケーションの構築を読み進めることにした。

なお実践はCloud9ではなくローカル端末で試すことにした。

また請求が発生する可能性があるため、早めに済ませること。EC2でめちゃくちゃお金がかかった。

モジュール1「静的ウェブサイトの構築」

(前提)AWS CLIの設定

AWS CLIを使う必要があるのでaws configureでAWSの設定ファイル(.aws)を作成した。アクセスキーが古くなってきたので新しくした。

(前提)S3とは

S3 は、保存されたオブジェクトをHTTP経由で直接提供できる、耐久性と可用性に優れた、低コストのオブジェクトストレージサービスです。

「ファイルをHTTPで転送できる」というのがポイント。つまりWebサイトにもなりうる。

S3バケットの作成

aws s3 mbコマンドでS3バケットを作成した。バケット名はaws-modern-application-workshop-koboriにしたので、具体的には次のコマンドを打つ。

bash aws s3 mb s3://aws-modern-application-workshop-kobori ### S3バケットの設定静的ウェブサイトのホスティングができるように、「ウェブサイトとして利用」と「外部からのアクセスを許可」の設定をする。

ホスティング

aws s3 websiteコマンドで静的Webサイトのホスティング設定をする。--index-documentオプションはindex.htmlを指定。

外部からのアクセスを許可

バケットを作成した時点ではプライベート(外部からはアクセスできない)ため、S3バケットポリシーを変更する必要がある。

バケットポリシーは一般的にはJSONファイルを定義して、これをaws s3api put-bucket-policyコマンドで送るのがいいみたい。そのためJSONファイルを次のように送ったbash aws s3api put-bucket-policy --bucket aws-modern-application-workshop-kobori --policy file://JSONファイルJSONファイルの中身は下記の通り。

json {"Id": "MyPolicy","Version": "2012-10-17","Statement": [{"Sid": "PublicReadForGetBucketObjects","Effect": "Allow","Principal": "*","Action": "s3:GetObject","Resource": "arn:aws:s3:::aws-modern-application-workshop-kobori/*"}]}### index.htmlをデプロイ最後に実際に利用されるindex.htmlをS3バケットに配置する。これはaws s3 cpコマンドで設定。

cpコマンドと同じなので、具体的には次のようにした。

bash aws s3 cp ローカルのindex.html s3://aws-modern-application-workshop-kobori/index.html これでウェブサイトが構築できた。というかこんなに簡単なのか。心配なのは金額だけ。

調子がよかったので「モジュール 2: ウェブサーバーでのアプリケーションのホスト」もちょっと読んでみよう。実際のメモは明日以降に。

モジュール2「静的ウェブサイトの構築」

(前提)各サービス、用語の概要

  • AWS CloudFormation: Amazon Web Servicesリソースのモデル化およびセットアップのサービス。インフラストラクチャ管理を簡略化する。

  • NLB: Network Load Balancer * Amazon ECR: Elastic Container Registry、完全マネージド型のDockerコンテナレジストリです。このレジストリを使うと、開発者はDockerコンテナイメージを簡単に保存、管理、デプロイできます。

  • Amazon ECS: Elastic Container Service、フルマネージド型のコンテナオーケストレーションサービスです。

  • AWS CodeCommit: Gitベースのリポジトリをセキュアにホストする完全マネージド型のソース管理サービスです。

  • AWS CodeBuild: ソースコードをコンパイルし、テストを実行し、デプロイ可能なソフトウェアパッケージを作成できる完全マネージド型のビルドサービスです。

  • AWS CodePipeline: 完全マネージド型の継続的デリバリーサービスで、素早く確実性のあるアプリケーションとインフラストラクチャのアップデートのための、パイプラインのリリースを自動化します### モジュール2A: CloudFormationのテンプレートをデプロイするaws cloudformation create-stackコマンドで、ローカルにあるテンプレートのymlとIAMリソースをつかってスタックを作成する。

bash aws cloudformation create-stack --stack-name MythicalMysfitsCoreStack --capabilities CAPABILITY_NAMED_IAM --template-body file://module-2/cfn/core.yml スタックとは、

スタックは、単一のユニットとして管理できる AWS リソースのコレクションです。 つまり、スタックを作成、更新、削除することで、リソースのコレクションを作成、更新、削除できます。 … リソースが作成できない場合、AWS CloudFormation はスタックをロールバックし、作成されたリソースを自動的に削除します。

ちなみにスタックをつくるときにIAMロール(ポリシー)でつまづいた。EC2とIAMに関してフルアクセスの権限を付与して解決したが、ベストプラクティスがわからない。このあたりを勉強すべきか迷う。

モジュール2B: サービスをNLB経由でデプロイ・公開する

aws ecr create-repositoryコマンドでリポジトリを作成する。AmazonEC2ContainerRegistryFullAccessの権限を付与して実行した(FullAccessがベストではない気がするのだが、コマンドとポリシー、パーミッションの関係が見つけられない)。

このあとDockerログインをするのだが、aws ecr get-loginコマンドはセキュリティの関係から(コマンド履歴にパスワードが残る)使えなくなっていた。そのためこちらを参考にして、aws ecr get-login-passwordコマンドでdocker loginを進めた。IssueかPRを出せるといいな。

つぎにECRにプッシュしたイメージをECSにデプロイする。

aws ecs create-clusterでサーバのクラスター、aws logs create-log-groupでロググループをそれぞれ作成する。

与えられたテンプレートを使って、aws ecs register-task-definitionコマンドでECSタスク定義を登録する。

つぎにサービススタックに必要なインフラストラクチャをプロビジョニングする。

プロビジョニングとは、必要に応じてネットワークやコンピューターの設備などのリソースを提供できるよう予測し、準備しておくことです
https://www.idcf.jp/words/provisioning.html

ただ単純に公開するのではなくNLBをかませることで、実際のサービスのスケールイン/スケールアウトを容易にできる。

というわけでaws elbv2 create-load-balancerコマンドでロードバランサーを作成する。サブネットはCloudFormationで作成したスタックから利用。

次にaws elbv2 create-target-groupコマンドでNLBターゲットグループ、aws elbv2 create-listenerコマンドでNLBロードバランサーのリスナーをそれぞれ作成。これで80番ポートが受信したリクエストをターゲットグループに登録されているターゲットに転送することをロードバランサーに知らせる。あまり意味はわかっていないけど、とりあえず書いておこう。

よくわからないけど、はじめてECSを利用する場合はaws iam create-service-linked-role --aws-service-name ecs.amazonaws.comが必要なよう。

ECSで実際のサービスを作成するため、aws ecs create-serviceコマンドを実行するaws ecs create-service --cli-input-json file://service-definition.json これで実際のサービス(Flask)にNLBを介してアクセスできるようになった。NLBのDNSでcurlを飛ばしてみると、実際にレスポンスが帰ってくる。

ちなみに最初に時間がかかったのはコンテナを作成・起動しているからか。2度目は一瞬だったので。

このサービスを利用するようにフロントエンドのindex.htmlを修正して、モジュールBは終了。

モジュール2C: CD/CIの設定

上記のまま開発を続けると、デプロイする際にはイメージを更新、プッシュして、またタスク定義を更新しないといけなさそう(その方法はチュートリアルにない)。

そのためCD/CIを設定する。

まずCI/CDアーティファクト用のS3バケットをつくる。バケットポリシーはチュートリアル側で用意してくれたものを使う。GETとPUTを許可しているみたい。

つぎにaws codecommit create-repositoryでCodeCommitリポジトリ、aws codebuild create-projectでCodeBuildプロジェクトを作成。いろんな値をコピペするので忘れても調べられるようにしないといけないな。

最後に、CodeBuildプロジェクトを使用してCodeCommitリポジトリを継続的に統合することと、新しくビルドされたアーティファクトをECSのサービスに継続的に提供するサービスとして、AWS CodePipelineをつくる。

aws codepipeline create-pipelineコマンドで、CodePipelineのパイプラインを作成。

そしてCodeBuildがECRリポジトリにアクセスできるよう設定する。具体的にはaws ecr set-repository-policyコマンドでECRリポジトリのポリシーを設定する。

これで使えるようになったのでテストをする。gitの認証まわりに関する設定を行った後、codecommitの空リポジトリをクローンして、今回のアプリケーションのソースをcommitしてpush。

CodePipelineのコンソールで自動ビルドが行われていることを確認して完了。

モジュール3「情報の保存」

テーブル、データの追加

aws dynamodb create-tableコマンドでデータベースを作成。aws dynamodb scanコマンドでテーブルの中身が見れる(見れるということは作成に成功している証拠)。

aws dynamodb batch-write-itemコマンドでレコードを追加する。scanして追加されたことを確認。

ウェブサイトの更新

つぎにこのDBを使うようにアプリを直してcommit, pushしたのだが、403エラーで失敗してしまった。

どうやらHTTPSでやるとMacのキーチェーンの問題があるようなので、SSHを使って回避するようにした。具体的には、

  1. IAMユーザの「AWS CodeCommit の SSH キー」に公開鍵を設定する
  2. SSHキーIDが発行されるので、これを使った~/.ssh/configを設定(下記参照)
  3. ssh git-codecommit.ap-northeast-1.amazonaws.comで疎通確認

~/.ssh/config Host git-codecommit.*.amazonaws.com User <SSHキーID>IdentityFile ~/.ssh/id_rsa またフロントのindex.htmlも更新。

パイプラインが成功したらサイトを確認。API、DBを使ってリストを描画していることを確認して終了。

モジュール4「ユーザ登録の設定」

(前提)Amazon Cognitoとは

ウェブアプリケーションおよびモバイルアプリに素早く簡単にユーザーのサインアップ/サインインおよびアクセスコントロールの機能を追加する。

ユーザプールの作成

aws cognito-idp create-user-poolコマンドで、Cognitoユーザープールを作成する。オプションも入れると次の通り。

bash aws cognito-idp create-user-pool --pool-name MysfitsUserPool --auto-verified-attributes email またユーザプールとセットで、aws cognito-idp create-user-pool-clientコマンドで、ユーザープールクライアントも作成する。

bash aws cognito-idp create-user-pool-client --user-pool-id <ユーザプールのID> --client-name MysfitsUserPoolClient “Id”: “ap-northeast-1_RoHXOwkFB”,“Arn”: “arn:aws:cognito-idp:ap-northeast-1:365487138721:userpool/ap-northeast-1_RoHXOwkFB”{“UserPoolClient”: {“UserPoolId”: “ap-northeast-1_RoHXOwkFB”,“ClientName”: “MysfitsUserPoolClient”,“ClientId”: “71gov86tiiphs9amjmd6kjopje”,“LastModifiedDate”: “2020-09-20T09:36:05.872000+09:00”,“CreationDate”: “2020-09-20T09:36:05.872000+09:00”,“RefreshTokenValidity”: 30,“AllowedOAuthFlowsUserPoolClient”: false }}### REST APIとAmazon API Gatewayの設定NLBの前にAmazon API Gatewayをはさんで、GatewayがCognitoを利用するようにする。またGatewayがNLBとプライベートで疎通するように、API Gateway VPCリンクも必要となる。

まずaws apigateway create-vpc-linkコマンドでNLBへのVPCリンクを作成。


2020年9月18日、金曜日。

強風注意報が出ていたことやベビーベッドの回収がいつ来るかわからないこともあり、今朝の散歩は諦めた。

AWSのチュートリアルは、モジュール2「静的ウェブサイトの構築」に進む。フロントエンドとバックエンドのサービス公開までできた。またCD/CIも準備。設定ファイルをAmazonで準備してくれているのでチュートリアルはスムーズに進むが(それでも難しい)、このファイルを用意するのが大変なのだろうと感じた。一通りやったら設定ファイルを見直す時間を設けないと。

保育園の見学申込を調べたあと、パッカーズ公式サイトのプレイ分析を翻訳。公式サイトなだけに反省点はなく、ぜんぶ気持ちよくなるコンテンツでよかった。

また家族で相談して、すこし一人旅行に出かけさせてもらうことになった。以前から気になっていた箱根のホテルを予約。GoToトラベルの割引が適用されるはずで、2泊で15,000円を切るから驚き。この期間でアプリ開発を一気にできるように、AWSのチュートリアルを進めておこう。


ふと思ったことだが、localhost内で開発しているだけではあまり技術が伸びないことに気づいた。どんなものでもいいから「外部へ公開すること」が重要、という意味だ。

たとえばlocalhostまたはDocker内で動かすことができたいたサービスを実際に誰かに使ってもらおうとすると、そのためのノウハウやスキルがないことに気がつく。これの専門性が高まれば「インフラ」という領域になってくるが、アジャイル・DevOpsの時代においては、ある程度はデプロイまでできないと意味がないだろう。個人開発が好きならなおさらだ。

ということもあって、昨日からAWSのことを再学習しているんだと把握した。つまるところ「アウトプット=開発」というのは「開かれた」状態でないかぎり、それと見なされない。チュートリアルそのままでもいいから、とにかく誰かが使える状態にまで作業を完了させよう。今後の(ITにおける)目標設定はこれを意識しようと思った。ITだけでなくて何でもそうかもな。


2020年9月12日、日曜日。

朝から大変な一日だった。Bがうんちを漏らして、それを洗おうとちょっと目を離したすきにBがベビーベッドから転落した。ギリギリ落ちる前のところで救えたのだが、配偶者が起きてくるまで気が気でなく過ごした(一応、半日経っても異常は見られなかったので安心している)。

そんな感じで昼までは放心状態のような感じだったので、時間をもらって外出。まだ落ち着いたとは言えないが、すこしだけ日常に戻ってきた。昨日書いていたQiitaの記事を完成させたので明日朝にポストしようと思う。

ApacheのSSL化を学習するにあたって、せっかくならAnsibleも使ってみたいなと思った。Ansible トレイルブックという面白いチュートリアルを公式が出しているので、これを明日読んでみようと思う。

2020年9月13日、月曜日。

Bを連れて散歩は継続。今日は涼しかったので、久しぶりに昼間に出かけた。通りがかりの人に話しかけられ、比較的大きめの赤ん坊だと教えてもらう。

2020年9月14日、火曜日。

なんとなく気分が乗っていたので、家族で東京港野鳥公園に出かけてみる。コロナ禍のためかほとんど人がおらず、気楽に散策できた。楽しかった訳ではないけれど。

結構歩いたので帰ってきてBをお風呂に入れたあとは、ほとんどエネルギー切れ。やらないといけないこと/やりたいことが増えてきたので、そろそろタスク整理をちゃんと導入しようかと思う。

2020年9月15日、水曜日。

Bを連れて散歩。今日もおばあさんが話しかけてきた。「迷惑にならないように(喋りかけるのは控えよう)」という気持ちを、「かわいい」という気持ちが少し上回っているようによく感じる。

帰宅してからは、お昼頃までBと遊びながらライオンズvsベアーズ戦を視聴。「去年のほうがちゃんとプレーを観戦、分析できてたな」と思い、どんなふうにプレイを見てたかを書き出してみた。これもブログにする予定。

試合鑑賞後は、すこし時間をもらってライオンズについてブログを書いた。2時間ぐらいあればとりあえず執筆はできそう。

夜になってBを寝かしてからは、保育園の入園応募の準備をはじめた。とりあえずおおまかなスケジュールを組みたかったので、いくつかサイトを検索。自宅まわりの保育園をGoogleマップに配置して、とりあえず候補をしぼった。各保育園の情報をまとめるのは明日やろう。

2020年9月16日、木曜日。

7時頃に起きて、バターコーヒーを飲んで、Bにもミルクをあげる。Bのおかげで、人生ではじめて「正しい生活リズム」で暮らしている。どうせいずれ(10年後ぐらいには)元に戻るだろうけど、10年間ぐらいは真人間で暮らせるのかもしれない。Bはすでに家庭に貢献していると言える。

Plantuml用にJavaをインストールしたあとは、マイナンバーカード取得のための準備をした。暗証番号が4種類もあるので、だいたいの人は忘れるだろうなと思った(実際それでマイナポイントは進んでないと聞いたことがある)。1Passwordがなければ自分も忘れる確信がある。

マイナンバーカードとは別に、入園手続きのための質問と必要な書類の準備がしたかったので、Bの散歩がてら区役所へ。育休期間と入園タイミングについて質問して、解決した。これもnote行きかな。

帰宅してからは昨日まとめた保育園の通園時間や保育時間、見学申し込みなどを調べた。往復はがきでないと申し込めない施設もあることにちょっと驚く。とりあえず10ヶ所の候補を集めて、本命2つ、対抗4つにしぼった。住民税額も再確認。

昼食後は、現代的なウェブアプリケーションの構築を読み進めることにした。


2020年9月11日、金曜日。

Bを散歩に連れ、寝てくれたところで、こうしてキーパンチしている。これがルーティンになりつつあり、裏を返せば、Bを散歩に連れていかないと日記をつけないことになってきた。過去2日間はそういうこと。

その間のことで明記しておかないといけないのは、『有田Pおもてなす』の滝沢カレン回だ。滝沢カレン脚本のコントをラバーガールに作らせるのだが、これがちょっと感動するレベルでよかった。

まずひとつめに「滝沢カレンを笑わそうとしていること」。そして「ゲストプレーヤーの持ち味を最大限に活かしたこと」。最後に「ちゃんとラバーガールの持ち味も含んでいること」。

こんな感想は野暮だけど、思考と努力の跡がとても見てとれて、それが感動につながった。もしこれが「コロナ禍によりスケジュールに余裕ができ、台本を練る時間を多くつくれた」とかであれば、コロナ禍バンザイ、という側面に気づける。いつだって物事は多面的だ。熱意が持続すればnoteにちゃんと書こう。

そして今日はNFL開幕の日でもある。いまは開幕戦を見ながら、パッカーズのブログを久しぶりに更新して今シーズンの準備をする。

Bが生まれる前はある程度チーム状況を追えていたが、今はさっぱりわからない。昨日調べたら、ジミー・グラハムやブライアン・ブラガがチームを去ったことを知った。

まあRB陣とディフェンス陣にそれほど変わりがないので、ある程度は去年と同じように戦ってプレイオフには進出できるのでは、と思っている。

ちなみに野球ではスワローズを応援しているのでよく思うが、常勝チームを応援するほうがはるかに楽しい。「たまに勝つチームのほうが応援のしがいがある」というのは、「よく殴られるけど優しいところもあるから別れられない」みたいなのに近い。オリックスを応援している友人には、どうか別競技の常勝チームも応援してバランスを調整してほしいところ。


2020年9月12日、土曜日。

Bを連れて散歩。最近公園に連れていっていなかったので公園に行ってみる。が、途中で寝られてしまった。『オブジェクト指向uiデザイン』を読みながら過ごす。最近思いついたアプリの画面設計に活かしながら読んでみる。

帰宅後、gunicornの自動起動にチャレンジ。前回使っていたコマンドをすこし修正しながら利用。設定ファイルgunicorn.conf.pyをつくったうえで gunicorn --config gunicorn.conf.py Pythonのファイル名 & でバックグラウンド実行させてみた。

python import multiprocessing # bind bind = '127.0.0.1:8080'# Worker Processes workers = 2 worker_class = 'uvicorn.workers.UvicornWorker'# Logging logfile = '/var/www/apps/tabelogger/app.log'loglevel = 'info'logconfig = None ただ色々と考えた結果、「デーモンとして起動させたい」ということにたどりつき調べるとビンゴ。文字通り--daemonオプションをつけてgunicornを起動すればいいことがわかった。これで解決したと思う。

ただ自分の作りたいアプリは、最後SSLで接続しないといけない(位置情報を使うため)。そのためApacheをSSL化するのが最後の作業になりそう。言い換えればこれが終わると、**やっと「プロトタイプ」を利用できることになる。**長かったなー。時間があれば明日にでも全体像をまとめてみよう。

その他、月曜朝のパッカーズ初戦に向けてブログを執筆。明日ははじめてのファンタジー・ドラフトにチャレンジできたらいいな。


2020年9月3日、木曜日。九州地方に台風の特別警戒が流れている。

通り雨をやり過ごしたあと、Bを連れて買い物。オイスターソースのチューブが売られていたのですぐ買う。使い切る/捨てるのが大変だったので、とても嬉しい。帰宅後はバウンサーで寝てくれたので、一気に洗濯などをした。

それでもまだ時間があったので、この前立てたAPIを利用するフロントエンドの開発をはじめた。

無印でいくつか収納グッズを購入。好きな色じゃないファイルボックスを買うかどうかで15分ぐらい迷ってしまった(買わなかった)。


2020年9月4日、金曜日。

Bを連れての散歩は、だんだん習慣に近づいてきた。B自身も外に出て少し揺られたら寝る準備ができている感じ。今日は4,5分で寝はじめた。すこし時間があったのでReactのドキュメントを読み始めた。propsの扱い方をまったく覚えていなくて、結構苦労しそう。


2020年9月5日、土曜日。2020年9月6日、日曜日。

台風の影響か、頭痛が激しく、あまり使い物にならなかった。


2020年9月7日、月曜日。

ひきつづき頭痛に悩まされつつも7時起床。身体の換気も兼ねてBを久々に散歩に連れ出す。やっぱりグッスリ寝てくれるので、こうして日記も書き留めておける。ありがたい。頭痛もすこし改善された。

Bの面倒をみたあと、昼間は外で自由時間。帰りしな大雨に見舞われ、すこし予定を変更して居残った。

Reactについて少し学習。つまるところReactで使われるFunctionとClassの違いがわかっていなかった。つまるところ、

  • stateやLifecycleがあるなら、Class Componentを使う* それ以外は、Functional Componentを使うということ。だからフォームとかはClass Componentを使うべきだし(stateをイジくるから)、propsの代入だけでなんとかなるならFunctional Componentを使えばいい。

実際にドキュメントを読んではいないけれど、おそらくFuntional Componentの寄せ集めがClass Componentになるんだろうなと予想。

そしてもうひとつ。stateはthis.setStateで変更するということ。ここが(たぶん)Vueと違っていて、とっつきづらかった。まだ実践が足りないけれど、大体わかってきた感じがする。ライフサイクルごとに自動で呼び出せるメソッドを知りたいかな(Vueのmountedみたいな)。

ほかにはPythonの話だけど、uvicornでサーバ起動をしていたのだけど、自動起動など本番稼働を考えるとgunicornじゃないといけなそう。また何度uvicornを起動しても、よく503で落ちるのでワーカーのことを勉強しないといけないかも(的外れかもしれない)。


2020年9月8日、火曜日。

7時に起きてBを連れて散歩に。「以下略」程度にBが寝てくれている間に、今日はgunicornとSQLAlchemyをすこし学ぶ。

WSGIサーバであるgunicornは、(理由は知らないけれど)単独のHTTPサーバとしては利用できなくて、ApacheやnginxなどのHTTPプロキシサーバ経由で使わないといけないみたい。とりあえず、

gunicorn -k uvicorn.workers.UvicornWorker --bind 127.0.0.1:8080 --log-level debug 起動するPythonファイルで起動させておいて、あとはApacheから8080番ポートにポートフォワードさせるように設定して、なんとか動かせるようになった。

もうひとつサーバサイド側で、SQLAlchemyを使ってORMを実装することにした。

Docker Composeでも問題が発生した。いくらファイルを更新しても最新のイメージ、コンテナを使ってくれない。調べたらdocker-compose builddocker-compose up --buildをしないといけないみたいだ。理由はあとで調べよう。


2020年8月28日、金曜日。

Bを連れて実家に。配偶者のいない3日間が始まるが、Bは気づいてなさそう。

ただ夜中になると気づいたようで、はじめて1時間ぐらい続けて号泣していた。抱っこしたりミルクをあげたりして、なんとかなだめた。

日中は実家にあるCDの整理。たぶん1000枚ぐらいあるんじゃないか。思い切ってほぼすべてを捨てることにしたので、リッピングできていないものを区別して取り込み作業を開始。週末はこの作業に従事する予定。


2020年8月29日、土曜日。

実家でCDを取り込みながらBの世話。ほとんど「世話」に時間が割かれてしまったが30枚ぐらいはインポートできたかも。

three NationとかTomato Cubeとか、もう誰に言ったって伝わらないアーティストのCDばかりが積まれていき、後世に伝えるのは自分ぐらいだと認識しつつも、断腸の思いで(安倍総理の言葉を借りる)、このタイミングしかないと思い、捨てることにした。いい曲をありがとうございました。


2020年8月30日、日曜日。

昨日の夜のBは結構寝てくれた。一人で面倒を診ているのでかなり気が張ってしまい、あまり眠れはしなかったけどそれでもまあまあ気分はいい。

Starshipを導入してみる。これを機にzshからfishにしてみようかと思っている。

またpipenvも入れておいた。実際に使いこなせるかは、もうちょっと時間が経ってから判断しよう。

実家から帰る前に自室をもう一度見直したら、ベッドの下にCDを200枚ぐらい入れてたのを見つけた。たかが2日で人生分のCDを処分するのは難しい。

夕方頃に実家から帰宅。電車の中で泣きそうになったが必死にお願いしつづけたらなんとか寝てくれた。無事自宅に戻ることができ、さっそくおっぱいを飲んで寝た。


2020年8月31日、月曜日。

帰省中、朝早くに散歩に連れてた流れに乗って今日も早めに散歩に出発。ちょっと遠くの公園まで行って涼んだあと、帰りしなに寝てくれたので、そのまま自宅に。

昼は配偶者に預けて少し作業。


2020年9月1日、火曜日。もう9月に入ったのかと、あらためて驚く。

KAGOYAで借りているサーバーにPythonをインストール。非公式Pythonダウンロードリンクを見ながら進めたらすぐできた。

サーバとして利用できるようにApacheをインストール。プロキシを設定するのは初めてで、結構手間取った。このサイトなどを参考に、mod_proxyを設定。MySQLもインストール。とりあえずfastapiを外部から呼び出すことがでっきるようになった。


2020年9月2日、水曜日。

雨が降る前にBを連れて買い物。はじめて帽子をかぶったり、どんどん人間になっている。

昼頃、Google Lighthouseでブログを評価してみた。アクセシビリティ以外は満点をとっていて安心。ついでに指摘されたアクセシビリティの問題点を修正した。ひとつ知らなかったことがあったので、リストを<a>で囲ったらGoogle Lighthouseに叱られたを、Qiitaに投稿した。

noteにも【わたしのドーナツ盤】SMOOTH ACE「プラスアルファ幸せ」 / BLACK BISCUITS「タイミング 〜Timing〜」を投稿。自分の音楽観にロックが入らなかったことは、「ジブリ観たことない」と同じレベルでちょっとだけ自信を持っている。