フッターコンテンツにスキップ
IRONSECUREDOCを使用する

immich Docker Compose (開発者向けの仕組み)

Immich Dockerは、Dockerコンテナ内でのオープンソースのセルフホスト型写真およびビデオバックアップソリューションであるImmichのセットアップです。 Dockerは、物理および仮想化サーバーでのアプリケーション開発、配布、および実行のための軽量で広く採用されているプラットフォームです。 Dockerのおかげで、Immichはほとんどのシステムで簡単にインストールでき、依存関係に関連する複雑な構成や頭痛のない運用が可能です。 このコンテナ化されたImmichの管理アプローチにより、メディアファイルを安全に保存、バックアップ、および管理することが容易になります。

さらに、Dockerは異なる環境間での一貫性を保証し、ユーザーが最小限の手間でImmichインスタンスを簡単に移動またはスケールすることができます。 これは、Dockerを使用して誰もがセルフホスト型メディアバックアップソリューションを最も効率的でシームレスな方法で行えることを意味します。

Immichの機能

Immich Dockerは、Immichの写真およびビデオバックアップソリューションの展開と管理をはるかに簡単にするいくつかの即座に利用可能な機能をインストールします。 これにより、メディアファイルを安全かつ効果的にセルフホストする人々にとって非常に魅力的になります。 Immich Dockerの主な機能には次のものがあります。

展開が簡単: Immich Dockerは標準のDockerイメージを提供しており、展開が簡単です。 さらに、依存パッケージや複雑な設定からユーザーを遠ざけます; したがって、ユーザーは即座にImmichを展開できます。

クロスプラットフォーム: 各Dockerコンテナは、Linux、macOS、およびWindows OSのDockerとともに、ほとんどのシステムでデバイスが実行できることを保証します。 これにより、プロジェクトは異なる環境間で非常に移植性が高くなります。

分離: さらに、Dockerコンテナ内で実行されるImmichサービスはホストマシン上の他のアプリケーションやサービスから分離されます。これにより、競合や互換性の問題が軽減され、Immichの運用環境がより安定します。

一般的に、特に多くのメディアデータ量が関与する場合、スケーラビリティは非常に簡単です。 Dockerは本質的にスケーラブルであるため、リソースのアップグレードや増強は非常に簡単です。

セキュリティ: Dockerコンテナは基盤となるシステムからの隔離層を導入し、追加のセキュリティを提供します。 さらに、Immichのセルフホスティングはユーザーにデータとデータベースの保存場所に対する完全な制御を可能にし、プライバシーとセキュリティを高めます。

自動更新: コンテナは比較的軽量で更新が容易で、メンテナンスがしやすいです; したがって、Dockerのユーザーは、非常に少ない、または全く中断なく、新しい機能を最新のセキュリティパッチとともに簡単に切り替えることができます。

バックアップと復元: Immich Dockerはメディアのバックアップに関する唯一の信頼できる情報源を作成し、写真やビデオを復元することができます。 Dockerはすべての展開に同じデータを確保します。

カスタマイズ可能: Immichはセルフホスト型なので、ユーザーは他のサービスとのより効果的な統合やスケーリングオプションのために要件に応じて変更できます。

コミュニティサポート: オープンソースプロジェクトであるがゆえに; コミュニティはユーザーに継続的な改善、バグ修正、サポートを提供しています。

Immich Dockerのインストール

前提条件

  • システムにDockerとDocker Composeをインストールします。
  • マシンに十分なリソースがあることを確認します:4GB以上のRAMを推奨。

Immichリポジトリのクローン化

GitHubからdocker-composeファイルをダウンロードします。

git clone https://github.com/immich-app/immich.git
cd immich
git clone https://github.com/immich-app/immich.git
cd immich
SHELL

環境変数の設定

サンプル環境ファイルとdocker-compose.ymlファイルのコピーを作成して変更します。

cp .env.example .env
cp .env.example .env
SHELL

.envファイルを開き、変数(ポート、ストレージの場所、データベースの資格情報など)を設定します。 ほとんどの構成では、デフォルト設定が十分です。

# You can find documentation for all the supported env variables at https://immich.app/docs/install/environment-variables
# The location where your uploaded files are stored
UPLOAD_LOCATION=./library
# The location where your database files are stored
DB_DATA_LOCATION=./postgres
# To set a timezone, uncomment the next line and change Etc/UTC to a TZ identifier from this list: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List
# TZ=Etc/UTC
# The Immich version to use. You can pin this to a specific version like "v1.71.0"
IMMICH_VERSION=release
# Connection secret for postgres. You should change it to a random password
# Please use only the characters `A-Za-z0-9`, without special characters or spaces
DB_PASSWORD=postgres
# The values below this line do not need to be changed
###################################################################################
DB_USERNAME=postgres
DB_DATABASE_NAME=postgres

Immichの起動

Docker Composeを使用してImmichサーバーを開始します。

docker-compose up -d
docker-compose up -d
SHELL

immich Docker Compose(開発者向けの動作原理):図2 - Immichサーバーの実行

このコマンドは、必要なすべてのイメージをプルし、必要なコンテナを開始します:

  • バックエンド
  • フロントエンド
  • データベース(PostgreSQL)
  • キャッシュ用Redis
  • 機械学習モデル(顔認識などの機能用)

immich Docker Compose(開発者向けの動作原理):図3 - Docker Composeコマンド

ブラウザでImmichにアクセスする

すべてのファイルがダウンロードされたら、環境を更新してください。 コンテナが動作しているとき、ブラウザを開き、以下のURLを入力します。

http://localhost:2283

.envファイルでポートを変更した場合は、2283を指定されたポートで置き換えます。

Immichアカウントの作成またはログイン

初回使用:Immich URLに初めてアクセスすると、Web UIが表示されます。

immich Docker Compose(開発者向けの動作原理):図4 - Immich

管理者アカウントの作成を求められます。

immich Docker Compose(開発者向けの動作原理):図5 - 管理者アカウント

必要な情報を入力すると、Immichがセットアップを案内します。

immich Docker Compose(開発者向けの動作原理):図6 - セットアップ

WebインターフェースでのImmichのセットアップ

  • 設定: 管理者ダッシュボードからImmichの詳細設定にアクセスします。
  • メディアのアップロード: テスト用に写真やビデオをアップロードします。
  • 機能の探索: 顔認識、オブジェクトタグ付けなどの他の機能をお楽しみください。

immich Docker Compose(開発者向けの動作原理):図7 - Webインターフェース

セットアップが完了すると、ブラウザから直接Immichにアクセスでき、写真とビデオのライブラリを管理し始めることができます。

IronSecureDoc とは何ですか?

IronSecureDocは、強力な暗号化、進化したPDF操作、およびデジタル署名を特徴とする文書管理とセキュリティのための高度なユーティリティです。 それは企業や開発者に文書の機密性と完全性を提供し、円滑なアクセスを可能にし、したがってPDF文書の処理を簡素化します。 その機能を使用して開発者がプログラム的にPDFファイルおよび文書を作成、アップロード、操作、セキュア化できる場合、侵略的なPDF APIと呼ぶこともできます。

immich Docker Compose(開発者向けの動作原理):図8 - IronSecureDoc:PDFセキュリティおよびコンプライアンスサーバー

その他に、IronPDFはあらゆるデータ入力からのPDFの作成を可能にするPDF APIであり、テキスト、画像、メタデータなどのパラメータを使用してコンテンツを追加および編集することができます。 これには、複数のPDFをマージしてファイルを構成したり、文書を分割したり、コメント、ハイライト、ウォーターマークを注釈として追加する機能が含まれています。

そのセキュリティ機能には、パスワード保護、AES暗号化、認証ベースのアクセス制御があり、すべての機密情報とデータをセキュリティで保護します。 さらに、デジタル署名を行って文書を認証し、金融、医療、法務のような業界で非常に重要な特徴である否認防止も可能です。 監査証跡機能により、文書上で行われたすべての操作を追跡し、より良いコンプライアンスと説明責任を実現できます。

IronSecureDoc をインストールして実行する

以下のリポジトリからIronSecureDocのDockerイメージを取得するには、このコマンドをコマンドプロンプトまたは開いているターミナルウィンドウで実行します。

docker pull ironsoftwareofficial/ironsecuredoc
docker pull ironsoftwareofficial/ironsecuredoc
SHELL

immich Docker Compose(開発者向けの動作原理):図9 - IronSecureDocのDockerイメージ

別のコマンドを使用して動作しているコンテナでIronSecureDocを開始します。

docker container run --rm -p 8080:8080 -e IronSecureDoc_LicenseKey=<IRONSECUREDOC_LICENSE_KEY> -e ENVIRONMENT=Development -e HTTP_PORTS=8080 ironsoftwareofficial/ironsecuredoc:latest
docker container run --rm -p 8080:8080 -e IronSecureDoc_LicenseKey=<IRONSECUREDOC_LICENSE_KEY> -e ENVIRONMENT=Development -e HTTP_PORTS=8080 ironsoftwareofficial/ironsecuredoc:latest
SHELL

Docker 実行コマンドは、IronSecureDoc のコンテナインスタンスを開始します。

Immichから署名をダウンロードし、署名済みのPDF文書を追加する

IronSecureDocのREST APIは、開発者がソフトウェアの文書管理およびPDF処理の機能と安全にやり取りできるモダンなWebインターフェースです。 RESTfulの原則を使用して、このAPIにより、使用する技術スタックに関係なく、IronSecureDocの機能のカスタムアプリケーションへの統合を簡単に理解し、標準化することが可能になります。

immich Docker Compose(開発者向けの動作原理):図10 - REST API

Immichからイメージをダウンロードする

immich Docker Compose(開発者向けの動作原理):図11 - イメージ

以下はImmichにアップロードされたサンプル署名ファイルです。

using System;
using System.Net.Http;
using System.Threading.Tasks;

class ImmichIntegration
{
    private static readonly HttpClient client = new HttpClient();

    public async Task<string> GetImageFromImmich(string imageId, string immichBaseUrl, string apiKey)
    {
        // Add authorization header
        client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");

        // Make a GET request to the Immich server
        var response = await client.GetAsync($"{immichBaseUrl}/api/media/{imageId}");
        response.EnsureSuccessStatusCode();

        // Read and return the response data
        var responseData = await response.Content.ReadAsStringAsync();
        Console.WriteLine("Image data retrieved successfully!");
        return responseData; // Contains image metadata or downloadable URL
    }
}
using System;
using System.Net.Http;
using System.Threading.Tasks;

class ImmichIntegration
{
    private static readonly HttpClient client = new HttpClient();

    public async Task<string> GetImageFromImmich(string imageId, string immichBaseUrl, string apiKey)
    {
        // Add authorization header
        client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");

        // Make a GET request to the Immich server
        var response = await client.GetAsync($"{immichBaseUrl}/api/media/{imageId}");
        response.EnsureSuccessStatusCode();

        // Read and return the response data
        var responseData = await response.Content.ReadAsStringAsync();
        Console.WriteLine("Image data retrieved successfully!");
        return responseData; // Contains image metadata or downloadable URL
    }
}
Imports System
Imports System.Net.Http
Imports System.Threading.Tasks

Friend Class ImmichIntegration
	Private Shared ReadOnly client As New HttpClient()

	Public Async Function GetImageFromImmich(ByVal imageId As String, ByVal immichBaseUrl As String, ByVal apiKey As String) As Task(Of String)
		' Add authorization header
		client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}")

		' Make a GET request to the Immich server
		Dim response = Await client.GetAsync($"{immichBaseUrl}/api/media/{imageId}")
		response.EnsureSuccessStatusCode()

		' Read and return the response data
		Dim responseData = Await response.Content.ReadAsStringAsync()
		Console.WriteLine("Image data retrieved successfully!")
		Return responseData ' Contains image metadata or downloadable URL
	End Function
End Class
$vbLabelText   $csharpLabel

このコードを使用して、Immichサーバーからイメージをダウンロードします。 ImmichサーバーからAPIキーを生成してください。

IronSecureDocにイメージをアップロードする

using System.IO;
using System.Net.Http;
using System.Threading.Tasks;

class IronSecureDocIntegration
{
    private static readonly HttpClient client = new HttpClient();

    public async Task UploadImageToIronSecureDoc(string imagePath)
    {
        var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost:8080/v1/document-services/pdfs/sign?sign_specific_page=0&signature_image_x=100&signature_image_y=150&signature_image_w=300&signature_image_h=400&certificate_password=********&certificate_permissions=1");

        // Set headers to simulate a browser request
        request.Headers.Add("sec-ch-ua-platform", "\"Windows\"");
        request.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36");
        request.Headers.Add("accept", "*/*");
        request.Headers.Add("sec-ch-ua", "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"");
        request.Headers.Add("sec-ch-ua-mobile", "?0");
        request.Headers.Add("Sec-Fetch-Site", "same-origin");
        request.Headers.Add("Sec-Fetch-Mode", "cors");
        request.Headers.Add("Sec-Fetch-Dest", "empty");
        request.Headers.Add("host", "localhost");

        // Create and add image and certificate files to the request content
        var content = new MultipartFormDataContent();
        content.Add(new StreamContent(File.OpenRead(imagePath)), "signature_image_file", Path.GetFileName(imagePath));
        content.Add(new StreamContent(File.OpenRead("IronsecureDoc.pfx")), "certificate_file", "IronsecureDoc.pfx");
        content.Add(new StreamContent(File.OpenRead("Input.pdf")), "pdf_file", "Input.pdf");
        request.Content = content;

        // Send the request and ensure success
        var response = await client.SendAsync(request);
        response.EnsureSuccessStatusCode();

        // Output the result of the PDF signing
        Console.WriteLine(await response.Content.ReadAsStringAsync());
    }
}
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;

class IronSecureDocIntegration
{
    private static readonly HttpClient client = new HttpClient();

    public async Task UploadImageToIronSecureDoc(string imagePath)
    {
        var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost:8080/v1/document-services/pdfs/sign?sign_specific_page=0&signature_image_x=100&signature_image_y=150&signature_image_w=300&signature_image_h=400&certificate_password=********&certificate_permissions=1");

        // Set headers to simulate a browser request
        request.Headers.Add("sec-ch-ua-platform", "\"Windows\"");
        request.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36");
        request.Headers.Add("accept", "*/*");
        request.Headers.Add("sec-ch-ua", "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"");
        request.Headers.Add("sec-ch-ua-mobile", "?0");
        request.Headers.Add("Sec-Fetch-Site", "same-origin");
        request.Headers.Add("Sec-Fetch-Mode", "cors");
        request.Headers.Add("Sec-Fetch-Dest", "empty");
        request.Headers.Add("host", "localhost");

        // Create and add image and certificate files to the request content
        var content = new MultipartFormDataContent();
        content.Add(new StreamContent(File.OpenRead(imagePath)), "signature_image_file", Path.GetFileName(imagePath));
        content.Add(new StreamContent(File.OpenRead("IronsecureDoc.pfx")), "certificate_file", "IronsecureDoc.pfx");
        content.Add(new StreamContent(File.OpenRead("Input.pdf")), "pdf_file", "Input.pdf");
        request.Content = content;

        // Send the request and ensure success
        var response = await client.SendAsync(request);
        response.EnsureSuccessStatusCode();

        // Output the result of the PDF signing
        Console.WriteLine(await response.Content.ReadAsStringAsync());
    }
}
Imports System.IO
Imports System.Net.Http
Imports System.Threading.Tasks

Friend Class IronSecureDocIntegration
	Private Shared ReadOnly client As New HttpClient()

	Public Async Function UploadImageToIronSecureDoc(ByVal imagePath As String) As Task
		Dim request = New HttpRequestMessage(HttpMethod.Post, "http://localhost:8080/v1/document-services/pdfs/sign?sign_specific_page=0&signature_image_x=100&signature_image_y=150&signature_image_w=300&signature_image_h=400&certificate_password=********&certificate_permissions=1")

		' Set headers to simulate a browser request
		request.Headers.Add("sec-ch-ua-platform", """Windows""")
		request.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36")
		request.Headers.Add("accept", "*/*")
		request.Headers.Add("sec-ch-ua", """Google Chrome"";v=""131"", ""Chromium"";v=""131"", ""Not_A Brand"";v=""24""")
		request.Headers.Add("sec-ch-ua-mobile", "?0")
		request.Headers.Add("Sec-Fetch-Site", "same-origin")
		request.Headers.Add("Sec-Fetch-Mode", "cors")
		request.Headers.Add("Sec-Fetch-Dest", "empty")
		request.Headers.Add("host", "localhost")

		' Create and add image and certificate files to the request content
		Dim content = New MultipartFormDataContent()
		content.Add(New StreamContent(File.OpenRead(imagePath)), "signature_image_file", Path.GetFileName(imagePath))
		content.Add(New StreamContent(File.OpenRead("IronsecureDoc.pfx")), "certificate_file", "IronsecureDoc.pfx")
		content.Add(New StreamContent(File.OpenRead("Input.pdf")), "pdf_file", "Input.pdf")
		request.Content = content

		' Send the request and ensure success
		Dim response = Await client.SendAsync(request)
		response.EnsureSuccessStatusCode()

		' Output the result of the PDF signing
		Console.WriteLine(Await response.Content.ReadAsStringAsync())
	End Function
End Class
$vbLabelText   $csharpLabel

ImmichおよびIronSecureDocの呼び出し

以下のコードは、統合を支援します。

using System.Threading.Tasks;

class Integration
{
    public async Task IntegrateImmichWithIronSecureDoc(string immichImageId, string immichBaseUrl, string immichApiKey, string imagePath)
    {
        var immich = new ImmichIntegration();
        var ironSecureDoc = new IronSecureDocIntegration();

        // Step 1: Fetch image metadata or download from Immich
        string imageData = await immich.GetImageFromImmich(immichImageId, immichBaseUrl, immichApiKey);

        // Step 2: Optionally download the image locally using imageData URL (not shown here)
        // Assume imagePath is the downloaded image file path

        // Step 3: Upload the image to IronSecureDoc
        await ironSecureDoc.UploadImageToIronSecureDoc(imagePath);
    }
}
using System.Threading.Tasks;

class Integration
{
    public async Task IntegrateImmichWithIronSecureDoc(string immichImageId, string immichBaseUrl, string immichApiKey, string imagePath)
    {
        var immich = new ImmichIntegration();
        var ironSecureDoc = new IronSecureDocIntegration();

        // Step 1: Fetch image metadata or download from Immich
        string imageData = await immich.GetImageFromImmich(immichImageId, immichBaseUrl, immichApiKey);

        // Step 2: Optionally download the image locally using imageData URL (not shown here)
        // Assume imagePath is the downloaded image file path

        // Step 3: Upload the image to IronSecureDoc
        await ironSecureDoc.UploadImageToIronSecureDoc(imagePath);
    }
}
Imports System.Threading.Tasks

Friend Class Integration
	Public Async Function IntegrateImmichWithIronSecureDoc(ByVal immichImageId As String, ByVal immichBaseUrl As String, ByVal immichApiKey As String, ByVal imagePath As String) As Task
		Dim immich = New ImmichIntegration()
		Dim ironSecureDoc = New IronSecureDocIntegration()

		' Step 1: Fetch image metadata or download from Immich
		Dim imageData As String = Await immich.GetImageFromImmich(immichImageId, immichBaseUrl, immichApiKey)

		' Step 2: Optionally download the image locally using imageData URL (not shown here)
		' Assume imagePath is the downloaded image file path

		' Step 3: Upload the image to IronSecureDoc
		Await ironSecureDoc.UploadImageToIronSecureDoc(imagePath)
	End Function
End Class
$vbLabelText   $csharpLabel

写真を添付し、デジタル署名を適用するためにIronSecureDocのAPIを使用します。 IronSecureDocIntegrationクラス内に必要なAPIコールを追加して文書を完成させます。 以下は、署名を追加した後のIronSecureDocから生成されたサンプルPDFです。

immich Docker Compose(開発者向けの動作原理):図12 - PDF出力

結論

ImmichとIronSecureDocはいずれも特定のニーズに応える素晴らしい仕事をしていますが、それぞれ異なるユースケースに最適に対応します。Immichはセルフホスト型で豊富な機能を持つ写真およびビデオ管理を行っており、顔認識、オブジェクト検出、マルチメディアファイルの効率的な整理などに優れています。 それは個人的または小規模なメディア保存場所管理に理想的で、ユーザーのニーズに合わせて正確にカスタマイズされたソリューションが求められている場合に最適です。

IronSecureDocは、組織全体のセキュアな文書および署名ソリューションであり、進化した暗号化の素晴らしい利点を統合したワークフローの簡潔な統合を可能にし、それによってセキュリティ、スケーラビリティ、プロフェッショナルグレードの文書処理が組み合わされます。

信頼性と遵守:強力なセキュリティと完全な監査機能を提供しているため、信頼性があり法令遵守します。 IronSecureDocのREST APIを使用することで、Web、モバイル、および企業システムの開発者がアプリケーションに安全な印刷と効率的なPDFの形式と処理を簡単に統合できます。 IronSecureDocのライセンスについて詳しくは、ライセンスページをご確認ください。 Iron Softwareの提供内容について詳しくは、Iron Suiteページをご覧ください。

よくある質問

DockerはImmichのデプロイをどのように簡素化できますか?

Dockerは、さまざまなプラットフォーム全体でのインストールと管理を容易にし、複雑な設定や依存関係の問題を回避するコンテナ化された環境を提供することにより、Immichのデプロイを簡素化します。

メディア管理のためにImmichを使用する利点は何ですか?

Immichは、自己ホスティング、顔認識やオブジェクトタグ付けを含む広範な機能セット、高度なカスタマイズを提供し、データ管理とストレージの制御を強化します。

DockerはImmichのセキュリティをどのように強化しますか?

Dockerは、アプリケーションをコンテナ内で分離することにより、システムの脆弱性のリスクを最小限に抑え、一貫した環境を確保し、メディアファイルを保護します。

Docker Composeを使用したImmichのインストールにどのようなステップが含まれていますか?

Docker Composeを使用してImmichをインストールするには、Immichリポジトリをクローンし、環境変数を設定し、Docker Composeコマンドを実行してImmichサーバーを開始します。

IronSecureDocは文書管理のためにDockerをどのように活用していますか?

IronSecureDocは、コンテナ化されたセットアップ内でPDF操作やデジタル署名などの高度な文書管理とセキュリティ機能を可能にし、シームレスなデプロイメントと統合を実現します。

ImmichとIronSecureDocを統合して機能を強化することは可能ですか?

はい、ImmichはIronSecureDocと統合して、REST APIを使用してImmichから画像をダウンロードし、デジタル署名などのアクションを実行することで、メディアおよび文書管理の全体的な機能を強化できます。

IronSecureDocは文書のセキュリティのためにどのような機能を提供していますか?

IronSecureDocは、強力な暗号化、パスワード保護、高度なPDF操作などの機能を提供し、文書の機密性と整合性を確保します。

Immichの使用においてコミュニティサポートはどのような役割を果たしますか?

コミュニティサポートは、リソース提供やトラブルシューティングでImmichの信頼性を高めます。

開発者はImmichとIronSecureDocを一緒に使用することでどのような利益を得られますか?

開発者は、Immichのメディア管理機能とIronSecureDocの文書セキュリティ機能を組み合わせることで、データ処理の包括的なソリューションを構築することができます。

ImmichとIronSecureDocの主な違いは何ですか?

主な違いは、Immichが個人使用向けのメディア管理とストレージに焦点を当てているのに対し、IronSecureDocは高度な文書管理とセキュリティ機能を提供し、組織のワークフローに適しています。

カーティス・チャウ
テクニカルライター

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

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。