3 ポイント 投稿者 GN⁺ 2024-08-12 | 1件のコメント | WhatsAppで共有

モダンなTUIフレームワークを構築しながら学んだ7つのこと

ターミナルは速い

  • モダンなターミナルエミュレーターは非常に洗練されたソフトウェア
  • ハードウェアアクセラレーションレンダリングを使うことで画面のちらつきを減らせる
  • ちらつきを減らす3つのテクニック:
    • 画面を消去せず上書きする
    • 標準出力へまとめて一度に書き込む
    • Synchronized Outputプロトコルを使う
  • Textualはデフォルトで60fpsを使用し、滑らかなアニメーションを提供する

DictViewsは驚き

  • Pythonのdictsの keys()items() メソッドはKeysViewとItemsViewを返す
  • ItemsViewオブジェクトの対称差を使うことで、変更された項目を簡単に見つけられる
  • Textualでは、CSSプロパティが変更されたときの最適化された更新に使われている

lru_cache は速い

  • functoolsモジュールの @lru_cache デコレーターは関数の戻り値をキャッシュする
  • Textualでは頻繁に呼ばれる小さな関数に @lru_cache を使って性能を向上させている
  • キャッシュ情報 (cache_info()) を確認して、キャッシュが効果的かどうかを確かめるべき

不変オブジェクトは最高

  • Pythonのタプル、NamedTuples、またはfrozen dataclassesを使うことで不変オブジェクトの利点を得られる
  • 不変オブジェクトを使えば副作用のないコードを書けるため、テストやキャッシュが容易になる

Unicodeアートは良い

  • Unicodeのボックス描画文字を使った図はドキュメント化に非常に有用
  • よく書かれたdocstringと一緒に使うと大いに役立つ

分数は正確

  • Pythonのfractionsモジュールは浮動小数点誤差を避けられる
  • Textualでは画面を比率に応じて分割するとき、分数を使って正確なレイアウトを実現している

絵文字はひどい

  • ターミナルでの絵文字サポートは予測不能で複雑
  • Unicodeデータベースを使って絵文字の幅を確認するが、最新の絵文字は予測できない結果を招くことがある
  • 複数コードポイントの絵文字はさらに大きな問題を引き起こす

GN⁺のまとめ

  • この記事はPythonのターミナルアプリケーション開発で役立つヒントとテクニックを提供する
  • Textualフレームワークの開発経験を通じて得た実践的な助言を共有する
  • 絵文字のような複雑な問題への対処法を説明し、開発者の助けになる
  • 類似した機能を持つプロジェクトとしてはurwidとprompt_toolkitがある

1件のコメント

 
GN⁺ 2024-08-12
Hacker Newsの意見
  • TUI開発者は、Unicode・国際文字・絵文字の処理を別プロジェクトとして扱うことになる

    • rivo/tview と rivo/uniseg パッケージでも同じ問題が起きている
    • 各TUIライブラリのメンテナは独自の解決策を開発している
    • 文字幅が標準化されておらず、ターミナルは複雑だ
    • OPは Unicode 9 までしかサポートしていない(現在のUnicodeバージョンは15.1)
    • 結局、ユーザーは特定の絵文字や国際文字が正しくレンダリングされないと不満を言うことになる
  • Textual が React を模倣しようとしている点が不満

    • React は人気のあるフレームワークだが、ユーザーインターフェースを作る良い方法ではない
    • 基本的なレスポンシブデザインは、よく知られた手法だ
    • CSS を使うのはやりすぎに思える
    • React モデルはすでに CSS の概念を多く壊している
    • CSS を使わなくてよいなら問題ない
  • Textual を使ってみた結果、CSS を使わなければならない

    • 良い標準コンポーネントがなく、自分で作らなければならない
    • Python クラスではなく外部スタイルシートを使う
    • こうした理由から、Textual はまだ自分には合わない
    • Python では明確なやり方が一つあるべきだ
    • React をあまりに密接に模倣しており、JavaScript コミュニティの欠点を反映している
  • この TUI はきれいだが、実際に使う場面が思い浮かばない

    • 最低限の機能で満足するか、すぐに GUI を使う
    • YouTube リンクではセルのハイライトが可能なテーブルを見せている
    • TUI でなぜそれが必要なのか理解できない
    • 結局、まともな GUI が必要になるだろう
  • kitty はより多くの機能を提供する

  • ソフトウェアエンジニアが、なぜ TUI にそれほど関心を持つのか理解できない

    • 良いコマンドラインプログラムは好きだが、TUI には魅力を感じない
  • Monodraw は MacOS 専用だが、他のプラットフォームにも良い代替がある

  • 「上書きして、消さない」は昔のゲーム開発のやり方だった

    • DirectX 以前は、フレームバッファに直接書き込み、変更された部分だけを再描画していた
  • ターミナルでカーソル位置を確認して Unicode バージョンを推定する方法がある

    • ターミナルは絵文字を予測不能な形でレンダリングする
    • 文字列幅を決めるたびにこの方法を使うことができる
    • wcwidth にうんざりして、この方法を使ったことがある
  • 複数の TUI ライブラリを評価した結果、FTXUI が最も使いやすく信頼できた

    • FTXUI
    • キーボードとマウスをサポートする対話型ダッシュボードを作るのに役立つ