つばろぐ

主に C#, .NET, Azure の備忘録です。たまに日記。

ふりかえり2020年

年越しまでに公開したいと思います。2020年もお世話になりました。2021年もよろしくお願いします。
色々あった2020年を簡単に振り返ります。

デブサミ2020に登壇しました(2月)

公募枠には落ちてしまいましたが、ありがたいことにパネルディスカッションにお呼びいただいて、本家のデブサミに初登壇させていただきました。
そのときの振り返りはブログにしたためています。

tsubalog.hatenablog.com

デブサミは2月でしたが東京でも COVID-19 にザワザワしはじめた時期で、結局2020年に東京に行ったのはデブサミが最初で最後でした。
思い起こせばオフラインのイベントって、すごく楽しかったなーとシミジミ。

緊急事態宣言&娘の入園延期&在宅カオス

緊急事態宣言が発出されたことで、4月に予定していた娘の幼稚園入園が延期になりました。あ、いや入園はしたんだけど休園になったというのが正しい。
結局「幼稚園に入園したけど通園できない」状態が6月中旬まで続きました。

ということで家族全員が家にいて、親二人は日中仕事をし、とはいえ娘の相手もしなくちゃいけないというカオスな状況が2ヶ月以上続いたということです。
大変だったという記憶しかないですが、その頃の葛藤もブログを書いていた。

tsubalog.hatenablog.com

引っ越し

4月末に人生で一番高い買い物をしたので、ゴールデンウィークに引っ越しをしました。これからも頑張る頑張る。

仕事関連

在宅勤務がメインとなり、会社に出社する機会がぐっと減りました。

例えば、私がオルターブースで関わっている KOSMISCH は2月以降、オンラインセミナー(俗にいうウェビナー)やオンラインハンズオンに周知活動の場を移して、月平均で1回以上は登壇していました。
何をやるにも試行錯誤。どうやったら集客できるんだろう、そもそもどうやってイベントがあることを知ってもらえるんだろう、などの試行錯誤の日々でした。
少しずつ軌道に乗っているような気はしています。これは開発メンバーをはじめ、オルターブースのイケてるメンバーがいたからこそです。

aadojo.alterbooth.com

コミュニティ活動

Fukuoka.NET の活動はほとんどできなかったというのが正直なところ。状況が状況なだけに、みんな忙しいので仕方ない。
ただ、他のコミュニティの皆様から機会をいただいて、オンラインイベントで Fukuoka.NET を紹介させていただくことは少しくらいはできました。

しかしオンラインでのコミュニティイベントが中心になり、Fukuoka.NET のような地方単独のコミュニティの存在意義についても考えさせられました。
情報を得ることを目的とすれば、オンラインイベントで機会としては足りますからね。

Fukuoka.NET Conf も今年は開催できませんでした。これはとても悔やまれます。
活動を続ければコミュニティは存続する。活動しなければコミュニティは廃れる。単純なことだと思うので、2021年はもうちょっと活動できればいいなと考えています。

あと PHPカンファレンス福岡も今年は中止になってしまいました。キックオフはやったんだけどね。

でも、3月末にこの判断ができたのは、みんな悔しかっただろうけどとても良い判断だったと思います。

2021年やりたいこと

2020年を振り返って、自分の技術的な伸び代の天井を感じました。
もちろん、好きな .NET や Azure をこれからも注力していくのは変わらないけど、新しい技術にチャレンジする必要性を感じています。

とりあえず、フロントエンドの技術と英語。この2つは頑張ろうと思う。英語をどうやって勉強したらいいか教えてください。

2020年に買って良かった物

2020年も年の瀬ですね。今年はホントに色々あった年でした。
引っ越しをして、在宅勤務が中心となり、家にお金を使うことが多かった一年でした。
ということで2020年に買って良かった物を振り返ります。順番は適当です。

ちなみに毎年恒例になりつつある、年末の大風邪をひいてしまい、お正月は Stay Home な予感です。

f:id:tech-tsubaki:20201230120849j:plain

電気シェーバー

パナソニックラムダッシュからの買い替えです。充電ケーブルがスリムになったので良かったです。

加湿器

懸賞で当たったダイソンの加湿器を使っていましたが、大して加湿量も強くもなかったのでダイニチの加湿器を買いました。
説明書によるとフィルターは3~4年に一度の買い替えで良いみたいですが、ワンシーズンそこそこ使うとフィルターが汚れてくるので、シーズンごとにフィルターを買い換えることをおすすめします。

フォームローラー

肩こり解消のために買いました。YouTubeやプライムビデオを見ながらゴリゴリやるととても気持ちがいいです。

L字デスク

このあたりから在宅勤務環境を整えるために買い揃えたものになります。
これまで作業机は大学入学のときに購入したものを使ってしましたが、さすがに狭くなってきたのでL字デスクを購入しました。
おかげでモニターを2つ置いても狭さを感じなくなりました。

インクジェットプリンター

緊急事態宣言下において、元々印刷を多用する業務の妻も在宅勤務となったためプリンターを購入しました。
と同時に幼稚園入園が延びた娘が家で過ごすときにひらがな練習や塗り絵をさせるためにも使いました。(結局テレビばかりであまりやってくれなかったけど)

Acer モニター27インチ

数年前に購入したプリンストンの23インチモニターしか持っていなかったので、セールで安かった Acer の27インチのフルHDモニターを買いました。
しかし結局フルHDでは物足りなくなり、4Kモニターを買うことになります。なのでこのモニターは現在は妻が使っています。

PHILIPS 4Kモニター

広い解像度は正義でした。コーディングのときなどの作業効率が爆上がりでした。

Anker のワイヤレスイヤホン

左右分離型のワイヤレスイヤホンも初体験。iPhone ユーザーでないため AirPods は選択肢外だったので、とりあえず Anker のワイヤレスイヤホンを購入。
散歩やたまの通勤時に使っています。一応マイクもついているので、オンラインミーティングでも使っています。

マランツのマイク

これまでオンラインミーティングは SONY のヘッドホンを使っていましたが、さすがに真夏はヘッドホンを使うのは暑くて無理でした。
なのでマイクを購入。音響機器もまったく興味がなかったので、ググったり色々買ってる人に聞いたりして、とりあえず無難そうなマランツのマイクを買いました。
PCとの相性で音量が安定しないときがありますが、それ以外は特に不満なし。

モニターアーム

PHILIPS の 4Kモニターが VESA マウントに対応しているので、モニターアームも初購入。
Amazon を眺めていて 50% オフだったので聞いたことないメーカーだったけど失敗してもいいやくらいで購入。
結果的には何の不満もなく使用できています。モニターアーム超便利ですね。

ゲーミング PC

娘とマインクラフトをしたい一心でゲーミングPCをずっと探していました。
はじめはドスパラで考えていましたが、なかなか踏ん切りがつかないときに HP がセールをやっていて、Core i7, RTX 2060, メモリ16GBという構成が結構値下がりしていたので、家族会議を経て購入。

今年一番 QoL があがったものでした。GPUの効果ってすごいなーと感じたのは、Microsoft Teamsのビデオ会議を使っていても全然操作がもっさりしないことでしたw
(それってアプリとしてどうなのとは思います。せめて Surface Book2 では Teams会議がもっさりしない程度には Teamsアプリが改善してほしい)

ニトリのカラーボックス(2段)

ゲーミングPCを買ったはいいものの置き場所問題がありました。はじめは床に直置きしていましたがホコリがつきそうだし掃除が面倒でした。
次にL字デスクの上に置いていましたが、それはそれで場所を取るので邪魔でした。

そこで L字デスクの下に棚を入れてそこにゲーミングPCを入れようと思い、サイズ感的にニトリの Nクリックというカラーボックスを購入。
これ組み立てにドライバーいらずでとても楽ですね。本当はキャスターもつけたかったけど、純正のはあまり良くなさそうだったので断念。

とはいえ机周りがとてもスッキリしました。(個人比)

www.nitori-net.jp


結構散財してしまった感はありますが、道具や機材によるストレスを抱えないようにした結果、以上の物を今年購入していました。
細々としたものは他にも購入していますがこのあたりで。

Project Tye 0.5.0-alpha.20555.1 で .NET 5 環境で実行できるようになりました

.NET 5 が GA しましたね。どんどんインストールしていきましょう。

dotnet.microsoft.com

さて Project Tye はこれまで .NET 5 では動きませんでした。
バージョンでいうと 0.4.0-alpha.20371.1 ですね。

$ tye --version
0.4.0-alpha.20371.1+d7623120d66b85bfeda8ab69eb5ff792df6b7243

.NET 5 の GA のタイミングと合わせたかどうかはわかりませんが、11月5日にバージョン 0.5.0-alpha.20555.1 がリリースされて .NET 5 でも動作するようになりました。

www.nuget.org

ただし公式には特にアナウンスが出ていないため、何かしら不具合があるかもしれません。そういうときはフィードバックしましょう。

github.com

.NET 5 + 0.4.0-alpha.20371.1

まず動作しなかったときのログを貼っときます。

$ tye run -v Debug
Loading Application Details...
Locating .NET SDK...
Found .NET SDK at: C:\Program Files\dotnet\sdk\5.0.100\
Registered .NET SDK.Loading project 'D:\src\yuta\netcore\project-tye\project-tye-sample\backend\backend.csproj'.
Drats! 'run' failed:
        Failed to load project: 'D:\src\yuta\netcore\project-tye\project-tye-sample\backend\backend.csproj'.

Microsoft.Build.Exceptions.InvalidProjectFileException: SDK 競合回避モジュールの型 "WorkloadSdkResolver" を読み込めま
せんでした。Could not load file or assembly 'System.Runtime, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. 指定されたファイルが見つかりません。  D:\src\yuta\netcore\project-tye\project-tye-sample\backend\backend.csproj
 ---> System.IO.FileNotFoundException: Could not load file or assembly 'System.Runtime, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. 指定されたファイルが見つかりません。
File name: 'System.Runtime, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
   at Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver.WorkloadSdkResolver..ctor()


   --- End of inner exception stack trace ---
   at Microsoft.Build.Shared.ProjectFileErrorUtilities.VerifyThrowInvalidProjectFile(Boolean condition, String errorSubCategoryResourceName, BuildEventFileInfo projectFile, Exception innerException, String resourceName, Object[] args)
   at Microsoft.Build.Shared.ProjectFileErrorUtilities.ThrowInvalidProjectFile(BuildEventFileInfo projectFile, Exception innerException, String resourceName, Object[] args)
   at Microsoft.Build.BackEnd.SdkResolution.SdkResolverLoader.LoadResolvers(String resolverPath, LoggingContext loggingContext, ElementLocation location, List`1 resolvers)
   at Microsoft.Build.BackEnd.SdkResolution.SdkResolverLoader.LoadResolvers(LoggingContext loggingContext, ElementLocation location)
   at Microsoft.Build.BackEnd.SdkResolution.SdkResolverService.Initialize(LoggingContext loggingContext, ElementLocation location)
   at Microsoft.Build.BackEnd.SdkResolution.SdkResolverService.ResolveSdk(Int32 submissionId, SdkReference sdk, LoggingContext loggingContext, ElementLocation sdkReferenceLocation, String solutionPath, String projectPath, Boolean interactive, Boolean isRunningInVisualStudio)
   at Microsoft.Build.BackEnd.SdkResolution.CachingSdkResolverService.<>n__0(Int32 submissionId, SdkReference sdk, LoggingContext loggingContext, ElementLocation sdkReferenceLocation, String solutionPath, String projectPath, Boolean interactive, Boolean isRunningInVisualStudio)
   at Microsoft.Build.BackEnd.SdkResolution.CachingSdkResolverService.<>c__DisplayClass3_0.<ResolveSdk>b__1()
   at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode)
   at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor)
   at System.Lazy`1.CreateValue()
   at System.Lazy`1.get_Value()
   at Microsoft.Build.BackEnd.SdkResolution.CachingSdkResolverService.ResolveSdk(Int32 submissionId, SdkReference sdk, LoggingContext loggingContext, ElementLocation sdkReferenceLocation, String solutionPath, String projectPath, Boolean interactive, Boolean isRunningInVisualStudio)
   at Microsoft.Build.Evaluation.Evaluator`4.ExpandAndLoadImportsFromUnescapedImportExpressionConditioned(String directoryOfImportingFile, ProjectImportElement importElement, List`1& projects, SdkResult& sdkResult, Boolean throwOnFileNotExistsError)
   at Microsoft.Build.Evaluation.Evaluator`4.ExpandAndLoadImports(String directoryOfImportingFile, ProjectImportElement importElement, SdkResult& sdkResult)
   at Microsoft.Build.Evaluation.Evaluator`4.EvaluateImportElement(String directoryOfImportingFile, ProjectImportElement importElement)
   at Microsoft.Build.Evaluation.Evaluator`4.PerformDepthFirstPass(ProjectRootElement currentProjectOrImport)
   at Microsoft.Build.Evaluation.Evaluator`4.Evaluate()
   at Microsoft.Build.Evaluation.Evaluator`4.Evaluate(IEvaluatorData`4 data, ProjectRootElement root, ProjectLoadSettings loadSettings, Int32 maxNodeCount, PropertyDictionary`1 environmentProperties, ILoggingService loggingService, IItemFactory`2 itemFactory, IToolsetProvider toolsetProvider, ProjectRootElementCacheBase projectRootElementCache, BuildEventContext buildEventContext, ISdkResolverService sdkResolverService, Int32 submissionId, EvaluationContext evaluationContext, Boolean interactive)
   at Microsoft.Build.Evaluation.Project.ProjectImpl.Reevaluate(ILoggingService loggingServiceForEvaluation, ProjectLoadSettings loadSettings, EvaluationContext evaluationContext)
   at Microsoft.Build.Evaluation.Project.ProjectImpl.ReevaluateIfNecessary(ILoggingService loggingServiceForEvaluation, ProjectLoadSettings loadSettings, EvaluationContext evaluationContext)
   at Microsoft.Build.Evaluation.Project.ProjectImpl.ReevaluateIfNecessary(ILoggingService loggingServiceForEvaluation, EvaluationContext evaluationContext)
   at Microsoft.Build.Evaluation.Project.ProjectImpl.ReevaluateIfNecessary(EvaluationContext evaluationContext)
   at Microsoft.Build.Evaluation.Project.ProjectImpl.Initialize(IDictionary`2 globalProperties, String toolsVersion, String subToolsetVersion, ProjectLoadSettings loadSettings, EvaluationContext evaluationContext)
   at Microsoft.Build.Evaluation.Project..ctor(String projectFile, IDictionary`2 globalProperties, String toolsVersion, String subToolsetVersion, ProjectCollection projectCollection, ProjectLoadSettings loadSettings, EvaluationContext evaluationContext)
   at Microsoft.Build.Evaluation.Project.FromFile(String file, ProjectOptions options)
   at Microsoft.Tye.ProjectReader.EvaluateProject(OutputContext output, DotnetProjectServiceBuilder project) in /_/src/Microsoft.Tye.Core/ProjectReader.cs:line 166

Tye のアップデート

Tye は .NET Core グローバルツール であるため .NET CLI でアップデートを行います。

$ dotnet tool update -g Microsoft.Tye --version "0.5.0-alpha.20555.1"
ツール 'microsoft.tye' がバージョン '0.4.0-alpha.20371.1' からバージョン '0.5.0-alpha.20555.1' に正常に更新されました。

 $ tye --version
0.5.0-alpha.20555.1+fae47325b0c8d7dafcdec5d1248191b24b2adc23

.NET 5 で動くようになった

ツールをバージョンアップすればアプリケーションや tye.yaml を変更することなく動作しました。

$ cat tye.yaml
# tye application configuration file
# read all about it at https://github.com/dotnet/tye
#
# when you've given us a try, we'd love to know what you think:
#    https://aka.ms/AA7q20u
#
name: microservice
registry: tsubakimoto
services:
- name: backend
  project: backend\backend.csproj
- name: frontend
  project: frontend\frontend.csproj
  env:
  - name: YOUR_NAME
    value: "YUTA in YAML"
- name: redis
  image: redis
  bindings:
  - port: 6379
    connectionString: "${host}:${port}"
- name: redis-cli
  image: redis
  args: "redis-cli -h redis MONITOR"

$ tye run -v Debug
Loading Application Details...
Restoring and evaluating projects
Resolved metadata for service backend at D:\src\yuta\netcore\project-tye-sample\backend\obj\Debug\netcoreapp3.1\MicrosoftTye.ProjectMetadata.txt
Resolved metadata for service frontend at D:\src\yuta\netcore\project-tye-sample\frontend\obj\Debug\netcoreapp3.1\MicrosoftTye.ProjectMetadata.txt
Restore and project evaluation took: 4318.6486ms
Found application version: 1.0.0
RunCommand=D:\src\yuta\netcore\project-tye-sample\backend\bin\Debug\netcoreapp3.1\backend.exe
RunArguments=
TargetPath=D:\src\yuta\netcore\project-tye-sample\backend\bin\Debug\netcoreapp3.1\backend.dll
PublishDir=bin\Debug\netcoreapp3.1\publish\
AssemblyName=backend
IntermediateOutputPath=obj\Debug\netcoreapp3.1\
Found target framework: netcoreapp3.1
Parsed target framework name: netcoreapp
Parsed target framework version: 3.1
Found shared frameworks: Microsoft.NETCore.App, Microsoft.AspNetCore.App
IsAspNet=True
Evaluation Took: 7.4286ms
Found application version: 1.0.0
RunCommand=D:\src\yuta\netcore\project-tye-sample\frontend\bin\Debug\netcoreapp3.1\frontend.exe
RunArguments=
TargetPath=D:\src\yuta\netcore\project-tye-sample\frontend\bin\Debug\netcoreapp3.1\frontend.dll
PublishDir=bin\Debug\netcoreapp3.1\publish\
AssemblyName=frontend
IntermediateOutputPath=obj\Debug\netcoreapp3.1\
Found target framework: netcoreapp3.1
Parsed target framework name: netcoreapp
Parsed target framework version: 3.1
Found shared frameworks: Microsoft.NETCore.App, Microsoft.AspNetCore.App
IsAspNet=True
Evaluation Took: 4.5876ms
Launching Tye Host...

[09:23:22 INF] Executing application from D:\src\yuta\netcore\project-tye-sample\tye.yaml
[09:23:23 INF] Dashboard running on http://127.0.0.1:8000
[09:23:26 INF] Docker image redis already installed
[09:23:26 INF] Creating docker network tye_network_5b44c29a-7
[09:23:26 INF] Running docker command network create --driver bridge tye_network_5b44c29a-7
[09:23:27 INF] Running image redis for redis_2390830d-a
[09:23:27 INF] Running image redis for redis-cli_94877efc-3
[09:23:27 INF] Running image mcr.microsoft.com/dotnet/core/sdk:3.1 for backend-proxy_c7967b52-b
[09:23:27 INF] Running image mcr.microsoft.com/dotnet/core/sdk:3.1 for frontend-proxy_f67a9f1e-9
[09:23:27 INF] Building projects
[09:23:31 INF] Running container redis_2390830d-a with ID e1c1c6eae24b
[09:23:31 INF] Running container redis-cli_94877efc-3 with ID 5b5a0450106a
[09:23:31 INF] Running docker command network connect tye_network_5b44c29a-7 redis_2390830d-a --alias redis
[09:23:31 INF] Running docker command network connect tye_network_5b44c29a-7 redis-cli_94877efc-3 --alias redis-cli
[09:23:33 INF] Replica redis_2390830d-a is moving to a ready state
[09:23:33 INF] Collecting docker logs for redis_2390830d-a.
[09:23:33 INF] Replica redis-cli_94877efc-3 is moving to a ready state
[09:23:33 INF] Collecting docker logs for redis-cli_94877efc-3.
[09:23:34 INF] Running container backend-proxy_c7967b52-b with ID f436fa86c3e4
[09:23:34 INF] Running docker command network connect tye_network_5b44c29a-7 backend-proxy_c7967b52-b --alias backend
[09:23:34 INF] Running container frontend-proxy_f67a9f1e-9 with ID e34e0f29521d
[09:23:34 INF] Running docker command network connect tye_network_5b44c29a-7 frontend-proxy_f67a9f1e-9 --alias frontend
[09:23:35 INF] Collecting docker logs for frontend-proxy_f67a9f1e-9.
[09:23:35 INF] Collecting docker logs for backend-proxy_c7967b52-b.
[09:23:37 INF] Launching service backend_937c6cf4-7: D:\src\yuta\netcore\project-tye-sample\backend\bin\Debug\netcoreapp3.1\backend.exe
[09:23:37 INF] Launching service frontend_418c4bc0-4: D:\src\yuta\netcore\project-tye-sample\frontend\bin\Debug\netcoreapp3.1\frontend.exe
[09:23:37 INF] backend_937c6cf4-7 running on process id 7760 bound to http://localhost:59007, https://localhost:59008
[09:23:37 INF] frontend_418c4bc0-4 running on process id 36020 bound to http://localhost:59009, https://localhost:59010
[09:23:37 INF] Replica backend_937c6cf4-7 is moving to a ready state
[09:23:37 INF] Replica frontend_418c4bc0-4 is moving to a ready state
[09:23:38 INF] Selected process 7760.
[09:23:38 INF] Selected process 36020.
[09:23:38 INF] Listening for event pipe events for backend_937c6cf4-7 on process id 7760
[09:23:38 INF] Listening for event pipe events for frontend_418c4bc0-4 on process id 36020