今日Microsoftからこんなメールが来た。

アクションパックという便利サービス
Microsoftの色々なサービスを開発用途に限って使えるMicrosoft Action Pack(アクションパック)というサービスがあって、Visual StudioやSQL Server、Windowsなどを便利に使わせてもらっている。
その中にはMicrosoft Office 365 E3を5人まで使えるライセンスもあるのだ。
アクションパック自体のサブスクリプションは先月に更新したのだが、個別のサービス(特典)は自分でライセンスキーを発行して更新しないといけないらしく、Office 365のサブスクリプションはまだ更新していなかった。
中国のインターネット規制(金盾: Great Firewall)対策として、これまでMicrosoft Azure上に ShadowSocksRやOpenConnectといったVPNを構築してきた。
自前設置のため速度が遅く使い勝手は微妙だったが、中国渡航中にはきちんと金盾を回避してLINEやGoogleを使うことができた。
ただ、新型コロナウィルスの影響で中国への渡航が制限されて以来、自前のVPNを使う機会が無くなってしまって早3年が経過し、気が付いたら金盾やVPNを取り巻く環境も変わってしまっていた。
一言でいえば「金盾がShadowSocksを検知するようになった」ことによりSSやSSRが廃れ、より新しい"Trojan-GFW"という回避プロトコルが使われるようになっているらしい。
そこで、まだ中国への渡航の目途はたっていないが、今のうちに自前でTrojan-GFWを構築できないか模索してみた。
あるところにC# / .NET Frameworkで作られている業務システムありけり。
ある日ユーザーから「メインメニューから子画面を開いた後、メインメニューがずっと残りっぱなしで移動もできないのは邪魔すぎる何を考えとるんか誰じゃこんなシステムを作ったやつは(以下略)」とお叱りを受けた。
※修正後、しばらくして今度は「何で子画面を開いたらメインメニューが消えるんだ何を考えとるんか誰じゃこんなシステムを作ったやつは(以下略)」とお叱りを受けたので元に戻した。何なんだ一体。
調べてみると子画面をモーダルウィンドウとして表示しており、ほんならモードレスに変えましょうと相成った。
この記事の続き。手こずっているシステムのバグ対応でまた躓いた。
Entity Frameworkなんて使ったことねぇよ。わかんねー
事の発端
とある画面を表示する際、初期表示データを取得するためのDBアクセス時にEntity Frameworkが例外エラーを吐くことがある。
A second operation was started on this context before a previous operation completed. This is usually caused by different threads concurrently using the same instance of DbContext. For more information on how to avoid threading issues with DbContext, see https://go.microsoft.com/fwlink/?linkid=2097913.
at Microsoft.EntityFrameworkCore.Internal.ConcurrencyDetector.EnterCriticalSection()
at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.AsyncEnumerator.MoveNextAsync()
at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.SingleAsync[TSource](IAsyncEnumerable`1 asyncEnumerable, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.SingleAsync[TSource](IAsyncEnumerable`1 asyncEnumerable, CancellationToken cancellationToken)
at NameSpace.DataAccess.CustomerMasterAccess.GetItem(String customerCode) in C:\*****.cs:line 74
at NameSpace.DataAccess.MasterAccess.GetCustomerName(String customerCode) in C:\*****.cs:line 125
at NameSpace.Forms.DataInput.SetCustomerName(String customerCode, String customerCode2, String customerCode3) in C:\*****.cs:line 475
at NameSpace.Forms.DataInput.DisplayItems() in C:\*****.cs:line 90
at NameSpace.Forms.DataInput.Initial() in C:\*****.cs:line 71
at System.Threading.Tasks.Task.<>c.<ThrowAsync>b__140_0(Object state)
"A second operation started on this context before a previous operation completed"というエラーメッセージでググってみると、「DbContext はスレッドセーフではないので、スレッド間で使いまわしてはいけない」という文言が見つかる。
つまりこのエラーは複数スレッドから同じDbContextにアクセスしてしまったため発生しているようだ(エラーメッセージに書いている通りやね)
格安モバイル回線(MVNO)の一つであるmineoには「パケット放題 Plus」というオプションがあり、月額350円で1.5Mbpsの通信が使い放題になる。

1.5Mbpsあれば画像コンテンツはもちろんのこと、動画コンテンツについても480pならYoutube動画も見られるしビデオ通話もできる。基本的に困ることはない。
ただし通信量の制限がある
ただ一つだけ落とし穴があり「3日間で10GB以上利用すると速度制限がかかる」という制約がある。
まぁ本当に無制限となると無茶な使い方をする人が出てくるので仕方がない。
そんなに使うこともないし大丈夫だろう、と思っていた。