インフラジスティクス バーコード vs IronBarcode: WPF専用リーダー対プラットフォームに依存しないAPI
Infragisticsのバーコード読み取り機能はWPFで動作します。 そこに到達するには、BarcodeReader インスタンス、DecodeComplete イベントハンドラ、コールバックを非同期コードにブリッジする TaskCompletionSource<string> 、URIからの BitmapImage のロード、サポートしたい各 Symbology ファミリーのビット単位ORが必要です。それは Decode() への2つ目の引数として渡されます。 ファミリーを省くと—例えば、Symbology.QRCode をフラグから外す—画像内のQRバーコードは静かに何も返しません。 例外なし。 警告なし。 何も結果が表示されませんでした。
これはWPF側です。WinForms側では、Infragistics.Win.UltraWinBarcode パッケージは生成コントロールを含みますが、読み取りクラスは全く含まれていません。 WinFormsプロジェクトでバーコードを読み取る必要がある場合、Infragisticsバーコードパッケージには呼び出せる関数はありません。 これは、 ASP.NET Coreコントローラー、コンソールツール、Azure Functions、 Blazorサーバー コンポーネント、または Docker コンテナにも同様に当てはまります。 InfragisticsのバーコードサポートはUIフレームワークの境界内に存在します。WPFでは、生成とイベント駆動型の読み取りが実現されます。 WinFormsは生成機能のみを取得します。 それ以外のものには何も与えられない。
この比較では、その分割が実際には何を意味するのかを検証し、次にIronBarcodeがすべてのプロジェクトタイプで同じように動作する単一の静的APIを使用して同じ作業をどのように処理するかを見ていきます。
Infragisticsのバーコードサポートについて
Infragisticsは、最も実績のある.NET UIコンポーネントベンダーの1つです。 バーコード機能を提供するInfragistics UltimateSuite(サブスクリプション)には、WinForms、WPF、 ASP.NET、 Blazor、モバイル向けの数百ものコントロールが含まれています。Infragisticsのグリッド、チャート、スケジューラーを既に利用しているチームにとって、バーコードコントロールは論理的な追加機能です。なぜなら、既にサブスクリプション料金を支払っているからです。
しかし、バーコードのサポートは統一されたライブラリではありません。 これらは、それぞれ異なる機能を持ち、部分的にしか重複しない2つの独立したアセンブリである。
WinForms:ウルトラウィン・バーコード
Infragistics.Win.UltraWinBarcode パッケージは、UltraWinBarcode クラスを通じてWinFormsアプリケーションでのバーコード生成を提供します。 APIはシンプルです。
// InfragisticsWinFormsgeneration
using Infragistics.Win.UltraWinBarcode;
var barcode = new UltraWinBarcode();
barcode.Symbology = Symbology.Code128;
barcode.Data = "ITEM-12345";
barcode.SaveTo(outputPath);Imports Infragistics.Win.UltraWinBarcode
Dim barcode As New UltraWinBarcode()
barcode.Symbology = Symbology.Code128
barcode.Data = "ITEM-12345"
barcode.SaveTo(outputPath)シンボロジーを設定し、データを割り当て、SaveTo() を呼び出します。 WinFormsにおける生成のみのシナリオでは、これは機能します。 Symbology 列挙型には、Code128、Code39、QR、EAN13、その他の一般的なフォーマットが含まれます。
このアセンブリには、リーダーが存在しない。 UltraBarcodeReader クラスは存在しません。 Scan() メソッドは存在しません。 WinFormsアプリケーションで Infragistics.Win.UltraWinBarcode パッケージのみを使用してバーコード画像を読もうとすると、呼び出すものは何もありません。
WPF: XamBarcodeとBarcodeReader
WPF側には、生成コントロール (XamBarcode) と別のリーダークラス (BarcodeReader イン Infragistics.WPF.BarcodeReader アセンブリから) の両方が含まれています。 このリーダーはイベント駆動型であり、WPFのスレッド処理およびイメージングモデルに基づいて設計されています。
WPFでバーコードを読むには、DecodeComplete イベントを配線し、画像をファイルパスではなく BitmapSource オブジェクトとしてロードし、コードが非同期の場合、コールバックパターンを待機可能なものに変換する必要があります。
ASP.NET Core、コンソール、Docker: なし
WPFやWinForms UIアセンブリなしで net8.0 を対象とするInfragisticsバーコードパッケージは存在しません。 ASP.NET Coreプロジェクト、コンソールツール、Azure Functions、 Blazor Server、およびLinux Dockerコンテナには、Infragisticsバーコードオプションがありません。 このライブラリはUIフレームワークと連携しています。
WPFの読み方パターン
Infragisticsを使用したWPFでバーコードを読み取ると、実際には次のような画面になります。
// InfragisticsWPFreading: event-driven, requiresWPFassemblies
using Infragistics.Controls.Barcodes;
using System.Windows.Media.Imaging;
private BarcodeReader _reader;
private TaskCompletionSource<string> _result;
public InfragisticsBarcodeService()
{
_reader = new BarcodeReader();
_reader.DecodeComplete += OnDecodeComplete;
}
public async Task<string> ReadBarcodeAsync(string imagePath)
{
_result = new TaskCompletionSource<string>();
// Load asWPFBitmapSource — not a file path
var bitmap = new BitmapImage(new Uri(imagePath, UriKind.Absolute));
// Build the Symbology flags. The enum is [Flags];
// EAN-8/EAN-13/UPC-A/UPC-E share a single EanUpc flag,
// and Code 39 is exposed as Code39Ext. Use Symbology.All
// to search every supported family.
var symbologies = Symbology.Code128 |
Symbology.Code39Ext |
Symbology.QRCode |
Symbology.EanUpc |
Symbology.Interleaved2Of5;
// Symbology is the second argument to Decode/DecodeAsync,
// not a property on the reader. Result comes via callback.
_reader.DecodeAsync(bitmap, symbologies);
return await _result.Task;
}
private void OnDecodeComplete(object sender, ReaderDecodeArgs e)
{
_result?.TrySetResult(e.SymbolFound ? e.Value : "No barcode found");
}
public void Dispose()
{
if (_reader != null)
{
_reader.DecodeComplete -= OnDecodeComplete;
_reader = null;
}
}
これは、1つのバーコードを読み取るために約35本のインフララインが必要になることを意味します。 実際に何が起こっているのかを数えてみましょう。
BarcodeReaderインスタンスが作成され、フィールドとして生存します。- コンストラクタにイベントハンドラが組み込まれています。
ReadBarcodeAsyncへのすべての呼び出しは、共有フィールドに割り当てられる新しいTaskCompletionSource<string>を作成します — つまり、このサービスは書かれたままではスレッドセーフではありません。 同時呼び出しは_resultを上書きします。- 画像は、ファイルパスの文字列でもバイト配列でもストリームでもなく、
BitmapImageとしてUriからロードする必要があります。 DecodeAsync()はイベントを非同期に発火します。TaskCompletionSourceはコールバックの世界と非同期/待機の世界を結びつける接着剤です。- コールバックは
e.SymbolFoundが真であるときにe.Valueを抽出します。 Dispose()メソッドは、メモリリークを防ぐためにイベントハンドラをデタッチする必要があります。
この論理はどれもバーコードとは関係ありません。 これは、イベント駆動型設計に対応するために必要なインフラストラクチャです。 本番コードでは、_result.Task が完了しない場合に備えて、タイムアウト、キャンセレーショントークン、またはイベントが発火しないことを防ぐ何かを処理する必要があります。
WinFormsのギャップ
WinFormsの性能差は、一見したところよりもずっと顕著だ。 WinFormsアプリケーションを開発するチームは、Infragisticsのバーコードページにアクセスした際、両方のUIフレームワークでバーコードの生成と読み取りが対称的に行えることを期待することが多い。 彼らが見つけたのは、Infragistics.Win.UltraWinBarcode が全く読み取り機能を提供しないということです。
これは文書上の見落としではありません。 WinFormsのバーコードアセンブリは、生成制御として設計されました。 WinFormsアプリケーションでバーコードをスキャンする必要がある場合(例えば、ユーザーがアップロードした画像ファイルからバーコードを読み取ったり、カメラ映像からバーコードをデコードしたりする場合)、Infragisticsのバーコードツールでは実行できません。 そうなると、全く別のライブラリを導入する必要が生じ、Infragisticsを生成ツールとして使用する根拠が弱まることになる。
この非対称性により、混合フレームワークプロジェクトを運営するチームにカバレッジギャップが生じます。 WPFデスクトップクライアントとWinFormsデスクトップクライアントの両方を使用しているチームは、他のすべての場所でInfragisticsを使用している場合でも、WinFormsプロジェクトではInfragisticsを使用してバーコードを読み取ることはできません。
シンボル仕様:サイレント障害モード
WPFリーダーでの Decode() への Symbology フラグ引数は、失敗モードがサイレントであるため、その独自のセクションに値します。欠落しているフラグは、エラーなしで空の結果を返します。
リーダーにコールするときは、検索したいすべてのバーコードファミリーをOR演算子で結合します。 サポートされているファミリーは、QR、EAN/UPC (EanUpc)、Code 39 (Code39Ext)、Code 128、MaxiCode、Interleaved 2 of 5です — DataMatrixは列挙型には全く含まれていないので、WPFリーダーではデコードできません。 Symbology.All は列挙型のすべてをカバーします:
// Build flags explicitly, or use Symbology.All to search every family
var symbologies = Symbology.Code128 |
Symbology.Code39Ext |
Symbology.QRCode |
Symbology.EanUpc |
Symbology.Interleaved2Of5;
_reader.DecodeAsync(bitmap, symbologies);' Build flags explicitly, or use Symbology.All to search every family
Dim symbologies = Symbology.Code128 Or
Symbology.Code39Ext Or
Symbology.QRCode Or
Symbology.EanUpc Or
Symbology.Interleaved2Of5
_reader.DecodeAsync(bitmap, symbologies)バーコード画像がQRコードを含んでいても、フラグに Symbology.QRCode が含まれていない場合、e.SymbolFound は偽となり、e.Value は空です。 デコードイベントは引き続き発生します。 例外は発生しません。 発信者は"バーコードが見つかりません"というメッセージを受け取りますが、画像が読み取れなかったのか、単に設定されていなかったのかは分かりません。
実際には、これは次のことを意味します。 開発者がテストしたフォーマットでは、初期設定は問題なく動作します。
- 新しいバーコード形式がシステムに導入される(サプライヤーがラベルの種類を変更したり、新しい製品ラインで異なるシンボル体系が使用される場合など)。
- リーダーは、そのファミリーの画像すべてに対してサイレントに失敗します。
- このエラーは、"フォーマットが設定されていません"ではなく、"画像にバーコードがありません"というエラーと全く同じように見えます。
これをデバッグするチームは、フラグリストにファミリーが存在しないことに気付くまで、画像品質の確認に時間を費やします。特にDataMatrixは、追加するフラグがないため、WPFリーダーが全くサポートしていない尖ったケースです。
IronBarcodeはフォーマット引数を必要としません。 読取りごとにサポートされているすべてのフォーマットを自動検出します。 忘れるべき旗など存在しない。
プラットフォームマトリックス
プラットフォーム間の機能格差を理解することが、アーキテクチャ上の制約を理解する最も明確な方法である。
| プラットフォーム | インフラジスティクス・ジェネレーション | インフラジスティクス読解 | IronBarcode生成 | IronBarcodeの読み取り |
|---|---|---|---|---|
| WPF | XamBarcodeコントロール | バーコードリーダー(イベント駆動型) | はい | はい |
| WinForms | ウルトラウィンバーコード | 利用不可 | はい | はい |
| .NET Core | 利用不可 | 利用不可 | はい | はい |
| コンソール | 利用不可 | 利用不可 | はい | はい |
| Blazorサーバー | 利用不可 | 利用不可 | はい | はい |
| Docker / Linux | 利用不可 | 利用不可 | はい | はい |
| Azure Functions | 利用不可 | 利用不可 | はい | はい |
この表は、純粋なWPFデスクトップアプリケーション以外のアプリケーションを実行しているチームが、Infragisticsのバーコードサポートでは不十分だと感じる理由を示しています。 プロジェクトがWinFormsとASP.NET Core 、あるいはWPFとバックグラウンドワーカーサービスにまたがる場合、Infragisticsのバーコードライブラリはコードベースの一部しかカバーしません。
IronBarcodeを理解する
IronBarcodeは、WinForms、WPF、またはUIフレームワークに依存しない、 .NET専用のバーコードライブラリです。 同じNuGetパッケージ、同じ名前空間、同じ API は、WinForms、WPF、 ASP.NET Core、コンソール、 Blazor Server、Docker、Azure Functions、AWS Lambda など、あらゆる.NETプロジェクトで動作します。
// IronBarcode: identical code in WinForms, WPF, ASP.NET Core, console, Docker
// NuGet: dotnet add package BarCode
using IronBarCode;
// Read — 2 lines, any platform
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No barcode found";Imports IronBarCode
' Read — 2 lines, any platform
Dim results = BarcodeReader.Read(imagePath)
Return If(results.FirstOrDefault()?.Value, "No barcode found")BarcodeReader.Read() は静的メソッドです。 管理するインスタンスもなく、配線するイベントもなく、コールバックパターンをブリッジする TaskCompletionSource もありません。 ファイルパス文字列、バイト配列、Stream、またはそのいずれかのバッチ処理用の配列を受け入れます。
生成用には、BarcodeWriter.CreateBarcode() はPNG、JPEG、SVGに保存することができるバーコードオブジェクトを返すか、バイナリデータとして取得することができます:
using IronBarCode;
// Generate Code 128
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("barcode.png");
// Generate QR code
QRCodeWriter.CreateQrCode("https://example.com", 500,
QRCodeWriter.QrErrorCorrectionLevel.Highest)
.SaveAsPng("qr.png");Imports IronBarCode
' Generate Code 128
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.SaveAsPng("barcode.png")
' Generate QR code
QRCodeWriter.CreateQrCode("https://example.com", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest) _
.SaveAsPng("qr.png")ライセンスの初期化は、アプリケーションの起動時に一度だけ行われます。
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"並列表示:バッチ処理
バッチ処理は、Infragistics WPFリーダーにおける別の構造的な制約を露呈する。 リーダーが共有イベントハンドラを使用し、すべての呼び出しで _result フィールドが上書きされるため、上記のサービスクラスは複数の画像を同時に安全に処理することができません。 呼び出しは順番に行う必要があります。
// Infragistics: must process sequentially — shared event handler and TaskCompletionSource
// field mean concurrent calls would overwrite _result before the previous decode completes
var service = new InfragisticsBarcodeService();
var results = new List<string>();
foreach (var file in imageFiles)
{
// Each call must await before starting the next
var value = await service.ReadBarcodeAsync(file);
results.Add(value);
}Imports System.Collections.Generic
Imports System.Threading.Tasks
' Infragistics: must process sequentially — shared event handler and TaskCompletionSource
' field mean concurrent calls would overwrite _result before the previous decode completes
Dim service As New InfragisticsBarcodeService()
Dim results As New List(Of String)()
For Each file In imageFiles
' Each call must await before starting the next
Dim value As String = Await service.ReadBarcodeAsync(file)
results.Add(value)
Nextこれを同時に行うには、以前のデコードがまだ進行中の間に _result が上書きされないようにするためのロック、キュー、またはセマフォなど、大幅な追加インフラストラクチャが必要です。 これは、本来単純な入出力操作であるはずなのに、決して軽視できない並行処理の問題である。
IronBarcodeの静的 BarcodeReader.Read() はスレッドセーフです。 追加の同期処理なしに、複数のスレッドから同時に呼び出すことができます。 バッチワークロードの場合、Parallel.ForEach を直接利用できます:
using IronBarCode;
// IronBarcode: parallel batch with thread-safe static API
var results = new System.Collections.Concurrent.ConcurrentBag<string>();
Parallel.ForEach(imageFiles, file =>
{
var barcodeResults = BarcodeReader.Read(file);
foreach (var result in barcodeResults)
{
results.Add(result.Value);
}
});Imports IronBarCode
Imports System.Collections.Concurrent
Imports System.Threading.Tasks
' IronBarcode: parallel batch with thread-safe static API
Dim results As New ConcurrentBag(Of String)()
Parallel.ForEach(imageFiles, Sub(file)
Dim barcodeResults = BarcodeReader.Read(file)
For Each result In barcodeResults
results.Add(result.Value)
Next
End Sub)また、1回の呼び出しで複数のファイルを渡し、BarcodeReaderOptions によって並行処理を設定できます:
using IronBarCode;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
var results = BarcodeReader.Read(imageFiles, options);
foreach (var result in results)
{
Console.WriteLine($"{result.Value} ({result.Format})");
}Imports IronBarCode
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.MaxParallelThreads = 4
}
Dim results = BarcodeReader.Read(imageFiles, options)
For Each result In results
Console.WriteLine($"{result.Value} ({result.Format})")
Next機能比較
| フィーチャー | インフラジスティクス バーコード | IronBarcode |
|---|---|---|
| WinFormsでのバーコード読み取り | 不可 | はい |
| WPFバーコード読み取り | はい(イベント駆動型) | はい(同期) |
| .NET Coreのサポート | 不可 | はい |
| コンソール/ワーカーサービス | 不可 | はい |
| Docker / Linux | 不可 | はい |
| Azure Functions | 不可 | はい |
| Blazorサーバー | 不可 | はい |
| 自動フォーマット検出 | いいえ — SymbologyフラグをDecode()に渡す必要があります | はい — フォーマットは自動検出されます |
| PDFバーコード読み取り | 不可 | はい、ネイティブで追加パッケージは不要です。 |
| スレッドセーフな読書 | いいえ(共有イベントハンドラ) | はい(静的API) |
| イベント駆動型APIが必要 | はい(WPF) | なし |
| 明示的な画像読み込み(BitmapSource) | はい | いいえ — ファイルパス、バイト、ストリームを受け入れます |
| 同時読書 | いいえ(TaskCompletionSource を介してブリッジする必要があります) | はい |
| バッチ処理 | 逐次処理のみ(並行処理は安全ではありません) | 組み込みの並列処理 |
| サイレントフォーマットエラー | はい(省略されたSymbologyファミリー) | なし |
| Suiteの依存関係が必要です | はい — Infragistics Ultimate サブスクリプション | いいえ — 単体パッケージ |
| 永久ライセンスオプション | いいえ - 年間購読 | はい |
| おおよそのライセンス費用 | 年間サブスクリプション(Infragistics Ultimate) | 749ドルから(Lite、永久ライセンス) |
APIマッピングリファレンス
###WinForms(UltraWinBarcode) からIronBarcodeへ
| InfragisticsWinForms- UltraWinBarcode | IronBarcode |
|---|---|
new UltraWinBarcode() | BarcodeWriter.CreateBarcode(data, encoding) |
barcode.Symbology = Symbology.Code128 | BarcodeEncoding.Code128 ( CreateBarcode のパラメータ) |
barcode.Data = "ITEM-12345" | CreateBarcode() の第一引数 |
barcode.SaveTo(outputPath) | .SaveAsPng(outputPath) |
| 読み取りAPIは存在しません | BarcodeReader.Read(imagePath) |
###WPF(BarcodeReader) からIronBarcodeへ
| InfragisticsWPF— バーコードリーダー | IronBarcode |
|---|---|
new BarcodeReader() | 静的クラス - インスタンスは不要 |
_reader.DecodeComplete += OnDecodeComplete | 不要 |
_reader.DecodeAsync(bitmap, Symbology.X |Symbology.Y) | 自動検出 - 設定不要 |
new BitmapImage(new Uri(path)) + _reader.Decode(bitmap, ...) | BarcodeReader.Read(path) |
e.Value ( ReaderDecodeArgs に) | result.Value |
e.Symbology ( ReaderDecodeArgs に) | result.Format |
TaskCompletionSource<string> 非同期ラッパー | 同期処理 - ラッパー不要 |
Dispose() — イベントハンドラをデタッチします | 不要 — インスタンスまたはイベントなし |
| WPFプロジェクトのみ | あらゆる.NETプロジェクトタイプ |
チームが切り替わるとき
いくつかの特定の状況が、一貫してチームをInfragisticsのバーコードサポートから遠ざけている。
**WinFormsでは、読解力が必要です。**これは最も一般的なシナリオです。 WinFormsアプリケーションは UltraWinBarcode でバーコードを正常に生成しますが、新しい要件が到着します: アップロードされた画像からバーコードをスキャンしたり、印刷前にラベルを検証したりする必要があります。 InfragisticsにはWinForms用の読み取りAPIはありません。 チームは別のライブラリを取り込むか、両方の機能を備えた生成コードを置き換えるかのどちらかを選択する。
新しいASP.NET Coreエンドポイント。Infragisticsのバーコード生成機能を搭載したデスクトップアプリケーションに、専用のWeb APIが追加されました。 エンドポイントは、画像のアップロードを受け付けてバーコード値を返すか、必要に応じてバーコード画像を生成する必要があります。 ASP.NET CoreプロジェクトでInfragisticsのバーコードパッケージを使用する場合、どちらも不可能です。 IronBarcodeは dotnet add package BarCode でインストールされ、コンソールメソッドと同じ方法でコントローラーアクションで動作します。
Dockerデプロイメント。WPFアプリケーションがコンテナ化されるか、そのバーコードロジックがマイクロサービスに抽出されます。WPFアセンブリはLinux Dockerコンテナ内では実行されません。 InfragisticsWPFBarcodeReader が彼らについていきます。 IronBarcodeはLinux x64をネイティブターゲットとしています。
**バッチ処理のパフォーマンス。**ワークフローは、数百または数千のバーコード画像を処理します。 イベント駆動型のInfragisticsリーダーは、それらを順次処理します。 IronBarcodeの静的リーダーはスレッドセーフで、 Parallel.ForEach または組み込みの MaxParallelThreads オプションを使用することができ、同時実行インフラストラクチャは不要です。
本番での静かなフォーマットの失敗。 チームは、特定のファミリーのバーコードが数週間にわたり静かに失敗していたことを発見しました。これは、Symbology フラグが Decode() に渡されるときにそのファミリーが含まれていなかったためです。 自動検出に切り替えることで、この故障モードは完全に解消されます。
**Infragisticsのサブスクリプション範囲を縮小する。**一部のチームは、バーコード制御機能が含まれているという理由だけで、Infragistics Ultimateのサブスクリプション料金を支払っている。 バーコードが必要なことだけが契約の理由である場合、はるかに低コストで利用できる専用のバーコードライブラリを検討する価値がある。
結論
Infragisticsのバーコードサポートにおける中心的な問題は、機能面ではなく、アーキテクチャ面にある。WPFBarcodeReader はバーコードを読み取ります。WinFormsUltraWinBarcode はそれらを生成します。 各コンポーネントは、それぞれ設計された狭い範囲内においてのみ機能します。 問題は、これら2つのコンテキストでは、ほとんど for .NETチームが実際に必要としているものを網羅できないという点です。
現代 for .NETアプリケーションにおけるバーコード機能は、単一のUIフレームワーク内に存在することは稀である。 これはWinFormsクライアントとWeb APIに登場します。 これはDockerコンテナとデスクトップ上で動作します。ASP.NETエンドポイントにASP.NETされた画像をスキャンし、コンソールツールからラベルを印刷する必要があります。 これらの方法はどれもInfragisticsのバーコードパッケージでは機能せず、WPFリーダーのイベント駆動型パターンと必須シンボルフラグは、機能する唯一の状況においても、著しい複雑さを増す。
IronBarcodeは、バーコードの読み取りと生成という同じ問題を、あらゆる.NETプロジェクトタイプで同じようにコンパイルおよび実行される静的APIによって解決します。 WPFサービスクラスで書いた BarcodeReader.Read() コールは、ASP.NET Coreコントローラーで書いたものと同じであり、Linux Dockerコンテナで書いたものとも同じです。 イベントもフラグも TaskCompletionSource もありません。 バーコードのロジックは35行ではなく2行で構成されており、その2行はどこでも機能します。

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。