この記事を作った動機
2025/10/30 から、2025/11/6 に至るまでの間で OneNote 代替に関して、実装をするなど研究を進めているうちにわかったことなどを簡易的に記録する。
動作の様子 (まだ)
TODOs
2025/11/6 になる間やる項目たち。やりきれなかった分は次に持ち越し。
メイン(持ち越し、新規混合)
-
free ページの実装
- フロントエンド
- 共通のUIについて、使い方の説明について、ドキュメントを書いた。
- overlayWindow
- messagebox
- toolsbar
- page
- 実際に変更があったら、変更内容をリアルタイムで保存するようにする。
- 別のページを開いたときとかに、バグって変なタイミングでデータを保存しようとするのを止める
- セーブする際に、ページのUUIDが一致するか確かめてからセーブする。
- 書式設定に関する edit toggleable を作る。文章をどこに寄せるかとか、フォントサイズとか、フォントカラーとかそういう細かい設定ができるようにする。
- アイテムが何もないページにおいて、アイテムの追加時に、どんなアイテムタイプが利用可能か取得するのに失敗するのをどうにかする。
- リアルタイムセーブがバグることについて調査する。別のページを開いたとき、Freeページコンポーネント自体やその変数の中身が、どういう状態になっているのかを調べる。
- Metadata を表示できるようにする
- Free ページの要素について、基本要素の項目にアイテムの色をRGBAで設定できるようにする。
- とりあえず、まだ色を変更するUIがないが、RGBAとしてCSSスタイルを設定してアイテムごとの色を反映するようにFreeページの実装を更新はした。
- 色を設定するUIや項目へのアクセスボタンを実装する。
- z-index をちゃんと更新するようにする
- useFreePageItemsStore の items や activeItems の配列をページごとに分離して管理するようにする。
- 共通のUIについて、使い方の説明について、ドキュメントを書いた。
- フロントエンド
-
編集機能、データセーブ(更新)の実装
- free ページにおいて、保存が成功するまでは、変更があってから保存されるまでの間に、バッファーを保持するようにする。
-
バックエンド割り込みの実装
-
updatePageの割り込みがあった時に、どのページがセーブされたかIDをUUIDをデータとして含める -
updatePageがあったら差分を扱えるように、先にセーブされたデータをバッファーにためるようにして、diffをマージできるようにする
-
-
データサーバに接続されているかどうかなどの、ステータスインジゲーターを作る
-
データサーバの
updatePageコマンドのUUID検証ロジックについて正しく機能しているか調べる。 -
データサーバの実装
- addTag deleteTag コマンドの実装
- queryTag コマンドの実装
前回からの持ち越し
持ち越し分
-
内部構造を説明する図とかドキュメントを作る
- フロントエンド
- drawio で説明する図を作る
- 他人が構造の理解に必要な分を記録できたか
- drawio で説明する図を作る
- バックエンド(更新)
-
新たに追加した、task の仕組みについて、ドキュメントを整備する。
-
フロントエンドを拡張するうえで重要そうな zustand のデータストアの仕様リストを作り、記録を行う。
-
- バックエンド
- フロントエンド
-
OverlayWindow において、リサイズやサイズ制限をオプションで付ける。デフォルトでは無効にして、とりあえず selector においてそれが機能するようにする。
-
全体的な未保存、保存、バッファーの管理について考える
-
pageType などは現状のままで、増やさず、free と markdown に専念する
-
tasks -> jobs で定期的に実行されるバックエンドの関数群において、pageCleaner.py を実装する。各ノートにある、参照が消され、deleted.json に記録されていて、一定期間たったページを時期が来たら本当にファイルシステム上から削除する実装をする。コード自体は、tasks.py の設定に依存し、現状では10秒ごとに消す時が来ていないかポーリングする簡易的な実装である。
-
再接続機能が正しく機能しない場合を検証する
- WebSokcet が正常に閉じられなかった場合、自動的にそれを検出して再接続するようにフロントエンドを改修する。
- WebSocket が正常に閉じられていないとき、誤作動を起こす件について、データサーバ側を改修することで、ある程度改善を行った。再接続機能改善の試みを詳細は参考にすること。
-
except asyncio.CancelledErrorがmainLoop内で機能していない可能性について調べる。 - 実はなんか思ってるのと違う WebSocket の閉じ方をしているかもしれないことについて調べる。
-
opening handshake failed
Traceback (most recent call last):
File "C:\Users\username\AppData\Roaming\Python\Python312\site-packages\websockets\http11.py", line 138, in parse
request_line = yield from parse_line(read_line)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\username\AppData\Roaming\Python\Python312\site-packages\websockets\http11.py", line 309, in parse_line
line = yield from read_line(MAX_LINE_LENGTH)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\username\AppData\Roaming\Python\Python312\site-packages\websockets\streams.py", line 46, in read_line
raise EOFError(f"stream ends after {p} bytes, before end of line")
EOFError: stream ends after 0 bytes, before end of line
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:\Users\username\AppData\Roaming\Python\Python312\site-packages\websockets\server.py", line 545, in parse
request = yield from Request.parse(
^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\username\AppData\Roaming\Python\Python312\site-packages\websockets\http11.py", line 140, in parse
raise EOFError("connection closed while reading HTTP request line") from exc
EOFError: connection closed while reading HTTP request line
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:\Users\username\AppData\Roaming\Python\Python312\site-packages\websockets\asyncio\server.py", line 356, in conn_handler
await connection.handshake(
File "C:\Users\username\AppData\Roaming\Python\Python312\site-packages\websockets\asyncio\server.py", line 207, in handshake
raise self.protocol.handshake_exc
websockets.exceptions.InvalidMessage: did not receive a valid HTTP request
他の事項
- File API 周りの実装
- マルチメディアの対応
- selector を複数ページ選択に対応させる