2025/9/19-やったことリスト
この記事を作った動機 2025/9/10 から、今日に至るまでの間で OneNote 代替に関して、実装をするなど研究を進めているうちにわかったことなどを簡易的に記録する。 Networking フロントエンドがレスポンスを識別できない可能性 作っている途中でわかったこととして、今回の websocket による実装だと、無数の React コンポーネントがデータサーバに対してリクエストを送った場合、どのコンポーネントがリクエストを送ったのかレスポンスが帰ってきたときにわからないという問題があった。 具体的には、リクエストに対して、”誰”がリクエストを送ったのかという識別子がないことと、バックエンドからメッセージが帰ってくると一斉に、addEventListener で onmessage イベントを待っているコンポーネント全体にメッセージが届いてしまい、結果としてレスポンスの受け取りで整合性が取れなくなるというものである。 そこで今回は、各リクエストに対し、UUIDを付与し、データサーバから返信するときはそのUUIDとリクエストしたコマンド名をレスポンスに含めるようにすることで、フロントエンドの各コンポーネントが自分が送ったリクエストかどうか識別できるようにした。 ちなみに今回のような問題は HTTP プロトコルで実装すると起こらなそうである。 パフォーマンスの懸念 フロントエンド側の websocket の addEventListener の onmessage イベントは現状の実装だと、コンポーネントの数次第でその数だけコールバック関数があり、処理が走ることになる。 そのため、その数だけ自分に対するリクエストのレスポンスかどうか識別することになり、パフォーマンスにおいて懸念がある。とりあえずは顕著になるまではこの問題はおいておこうと思う。 データサーバとフロントエンドが分離しているアーキテクチャについて 現状のアーキテクチャだと、例えばリモートのデータサーバにアクセスしていて、必ずしもネットワークが安定していなかったり、一時的にオフラインになる可能性がある環境において、安定しないことが考えられた。 そこで、ローカルでスタンドアロンで動かすときと、データサーバがVPN経由などで遠隔地にある場合の2つで異なる考え方をすることにしてみた。 スタンドアロンでデータサーバもローカルで動いているとき 単純にデータサーバが一つ起動し接続される。 データサーバがリモートにあるとき フロントエンドが動いているクライアント側にもcacheとしてデータサーバーがある。開いたページやインデックスを保持したりする。 フロントエンドは、リモートのデータサーバと直接通信せず、フロントエンド側にあるデータサーバからリダイレクトしてもらうように指示する。 cacheは通常のノートブックと同じようなデータ形式で保存する。 cacheには、notebook を保存する場所にしてされたフォルダ内に、サーバーごとに専用のフォルダが作られる。 serverName はホスト名やIPアドレスとする。 notebooksFolderRoot localNotebook1 localNotebook2 localNotebook3 … serverName-cache remoteNotebook1 remoteNotebook2 remoteNotebook3 … 各ページと各ファイルのメタデータ メタデータの扱いで悩んだこと。info と pageInfo コマンドを作っていて悩んだことがある。 各ページのメタデータ 今の仕組みだとpageとしては、markdown 形式と、独自に自由に定義できる json 形式のものがあり、json形式の物に関してはどんなファイルが添付されているかとか、どんなタグが付いているかとか、独自に定義して、容易に管理することが可能である。 { "pageType": "free", "tags": ["This","is","testpage"], "files": ["testfile.txt"], "pageData":{ /* page data */ } } しかし、markdown については、あんまり markdown に特殊なデータを埋め込みたくないことから、専用の.metadataファイルでも設置しようかと悩んだ。 ...