Mark2 とは
Mark2 は Blazor WebAssembly で動くマークシートシステムです。スキャンした画像ファイルから、マーク欄の塗りつぶし情報を画像処理で認識して、ファイルに出力します。開発の経緯などは、以前のアドベントカレンダーの記事で公開しました。
2025年の振り返り
2025年は Mark2 の開発は何もできなかったです。引き続き自治体の学力調査や、全国各地の調査で利用されているのですが、私にとって2025年は高速で過ぎていき、いつの間にかアドベントカレンダーの季節になってしまいました。
アドベントカレンダーに書けるような作業内容が無いので、まずは .NET 10 に対応しようと思います。
作業開始
Mark2は基本的には単一画面のみのシンプルなアプリなので、既存のプロジェクトをアップデートするのではなく、 .NET 10 でプロジェクトを作成してから Mark2 のファイルをコピーしていく方法にしました。
まずは以下のコマンドを実行します。
dotnet new blazorwasm -o Mark2
あとで気づいたのですが、 Mark2 は PWA に対応しているので、以下のオプションを有効にしておくべきでした。
dotnet new blazorwasm -o Mark2 --pwa
そして既存のファイルをコピーしてきます。コピーする際、 .NET 10 で書き方が変わったところなどがあれば注意して、新しい書き方をするようにします。
変更した箇所
主な変更箇所は以下になります。もしかしたら .NET 10 ではなく、それ以前の変更に関する箇所があるかもしれません。
NotFound ページ
以前の Mark2 では<NotFound>というタグを利用していたのですが、新しい書き方になっていたので、それに合わせて変更しました。
+ <Router AppAssembly="@typeof(App).Assembly" OnNavigateAsync="OnNavigateAsync">
- <Router AppAssembly="@typeof(App).Assembly" NotFoundPage="typeof(Pages.NotFound)">
<Found Context="routeData">
<RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)"/>
<FocusOnNavigate RouteData="@routeData" Selector="h1" />
</Found>
- <NotFound>
- <PageTitle>Not found</PageTitle>
- <LayoutView Layout="@typeof(MainLayout)">
- <p role="alert">Sorry, there's nothing at this address.</p>
- </LayoutView>
- </NotFound>
</Router>
以下のファイルが追加されています。別のファイルになり、管理しやすくなりました。こうやって分割できていると、きれいな Not Found ページを作ろうという気になります。
@page "/not-found"
@layout MainLayout
<h3>Not Found</h3>
<p>Sorry, the content you are looking for does not exist.</p>
静的アセットのフィンガープリント
これは Blazor Advent Calendar 2025 の19日目で @jsakamoto さんが投稿されていた記事です。私の場合はプロジェクトをゼロから作成してコピーしたので問題なかったですが、既存のプロジェクトをアップデートする場合は注意する必要がありそうです。
Mark2 で廃止した機能
.NET 10 とは関係ないのですが、いくつかの機能を廃止しました。
WebAssemblyの判定を削除
Mark2 を公開した2021年当時はブラウザのセキュリティ設定次第で WebAssembly が実行できなかったので、以下のような処理をしていました。 HTML の <noscript> みたいな役割の処理です。
- <script>
- if (typeof WebAssembly !== "object") {
- if (navigator.language.startsWith("ja")) {
- document.getElementById("wasm-error-message").innerHTML =
- "このブラウザーはWebAssemblyが有効になっていないため、Mark2を実行できません。";
- } else {
- document.getElementById("wasm-error-message").innerHTML =
- "This browser cannot run Mark2 because WebAssembly is not enabled.";
- }
- document.getElementById("app").style.display = "none";
- document.getElementById("wasm-error").style.display = "block";
- }
- </script>
最近のブラウザでは WebAssembly の実行ができないというケースを聞かなくなったので、この処理は削除することにしました。利用トラブルが報告されたら、復活させるかもしれません。
Google Analytics のアクセス解析を削除
アプリを公開していると、どのくらい利用されているかは気になるもので、 Google Analytics でアクセス解析を導入していました。ただ、結局はアクセス解析の結果を見ることはなく、この機会に該当するコードを削除しました。
ONNX Runtime の手書き数字認識機能を削除
こちらも Mark2 の開発当初に導入した機能でしたが、あまり利用されることがなく、ひとまず削除することにしました。 ONNX Runtime の呼び出しが少し面倒なので、このあたりが解決したら、また復活させるかもしれません。
2026年に向けて
Mark2については、いろいろと取り組んでみたいこともあったのですが、それができなかったのは残念でした。ただ、安定してサービスを提供するという最低限の目標は達成できましたし、 .NET 10 にも対応できて、また少し Mark2 の寿命も延びたかなと思います。
来年のアドベントカレンダーではおもしろい報告ができるよう、取り組んでいきたいと思います。