Pyte端末エミュレーター



約束どおり、LGPL用のLinuxターミナルエミュレーターライブラリをリリースします。これは、クラウドに仮想マシンコンソールを表示するために使用します。 それぞれpyte(PYthonターミナルエミュレーター)と呼ばれます。



独自の推定によると、console_codesの「テキスト」機能のカバレッジは100%に近づいています(開発者の日和見主義者の間で悲観論者が示唆するように、80〜90%)。



実装されていません:VGAアダプターの文字ジェネレーターにフォントをロードするためのコード、VESA省エネ制御、可聴アラーム(サウンドの周波数と持続時間を制御するためのコード)、パレット管理、独自の文字セット。 一般に、テキストに関連しないすべてのもの。



ただし、記録、スクロール、行折り返しモードの管理、さまざまなタイプのテキスト削除の属性の正しい処理などのために画面領域をロックするなど、他のすべての複雑な機能が実装されています。 -nano、adom(写真ではESCコードの断片と結果の画像はADOMからのみ)、vim、emacs、mc、aptitude、dialog、yast2などの既存のアプリケーションに必要なものすべて 完全なレンダリング用。



ライブラリはpythonで記述されており、画面の操作の便宜のためにシャープ化されており、画像のグラフィカル表現から抽象化されているため、さらなる変換を実行するコードで使用できます(たとえば、画面をJSに転送したり、データベースにシリアライズしたりする)。



ライブラリの2番目の重要な機能は、画面の前の状態と現在の状態との間の差分(差分)のサポートです。 これは、制限された速度のチャネルを介した画像の経済的な送信(読み取り、インターネット)およびパフォーマンスが制限されたデバイスでのレンダリング(読み取り、javascript)に必要です。



創造の歴史

当初、 vt102ライブラリは素朴で目立っていました。 彼女はどうにかvt102 escコードの一部を描画し、ユニコード、画面のスクロール領域の微妙なニュアンス、パフォーマンス、安定性についてはまったく考えていません。 作者が彼女について書いたように、彼女はゲームのネットハックで不正行為をすることを意図していました。



私たちは彼女から始めました。 しばらくの間、エラーを修正して改善しようとしましたが、最初にvt102が一部のボタン(たとえば、PgUp)をサポートしていないことがわかりました。次に、...先ほど書いたように、Linuxターミナルの主な利点はデフォルトではLinuxを想定しています。



私はすべてのLinuxコンソール機能を「ゼロから」実装しなければなりませんでした(VGAアダプタと比較してシリアルポートの機能に上記の制限があります)。 したがって、ライブラリはvt102からpyte(Python Terminal Emulator)にスムーズに名前が変更されました。



ライブラリは現在ゼロから作成されているという事実にもかかわらず、私たちは主に著者vt102を尊重してLGPLの下でも公開することにしました。



内部デバイス



ライブラリは、画面クラスとストリームクラスで構成されています。 画面には画面(文字と属性)のコピーが含まれ、StreamはESCおよび(特に)CSIシーケンスの処理を担当する有限状態マシンです。 文字のシーケンスがストリームに送られ、ライブラリを使用するプログラムが「文字」について何も知らず、カスタマイズ可能なエンコード(インクリメンタルデコーダーを使用して、UTF-のギャップによる奇妙な四角がないバイトストリームで動作する状況があります。 8文字)。 原則として、UTF-8だけでなく、他のエンコーディングも使用します。 現在、クラウドではこの機能を使用していませんが、明確な良心のために実装しています。



CSIシーケンスを形成する文字のシーケンス全体を食べた後(これは、ESCコード[で始まる特別なクラスのESCシーケンスで、その後にパラメーターとコマンドが続きます。たとえば、ESC [1; 31mは赤い太字の音色を生成します。 各出力は、すべてのサブスクライバーに対して特定のイベント(シンボル出力、スクロールなど)を生成します。その中には、これらのイベントを処理するライブラリー自体があります。 もちろん、外部コードが必要な場合は、たとえば、この方法で新しい文字の外観について学習し、コントロールパネルでJavaスクリプトを通知します。



画面内のオブジェクトは、通常のpythonオブジェクトのように保存されます。 より高速な配列配列を使用するバージョンがありましたが、ライブラリの「便利な」形式と配列の間の変換でいくつかの困難に遭遇したため、定数変換によって配列のパフォーマンスが大きくぼやけました。 ところで、スネークオブジェクトを使用すると、そのGibletsへのアクセスが簡単になり、最も重要なのは、データベースへのシリアル化(コンソールの「キラー機能」であり、サーバー間で仮想マシンを中断せずに画面コンテンツをゼロにすることで存続します)。



ちなみに、このライブラリは2.6から3.2+までのpython、さらにはPyPyでもうまく機能します。



今後の計画



近い将来、ライブラリをスクロールサポート(同じShift-PgUp)で補完する予定です。ちなみに、これをクラウドに追加します。



さらに、少し役に立たない完璧主義を行い、Linuxコンソール自体よりも優れた標準を満たす、つまり単一のエラーなしでvttestを実行するという考えがあります。



私たちがまだ計画していないことは(喜んでコミットを受け入れますが)Unicodeのサポートの拡張です-文字の正規化、異なる幅の文字などのサポート。 原則として、これにはpythonにすべてがありますが、これは必要ありません(アジア市場に照準を合わせるまで)。



このライブラリが誰かに役立つなら、使用に関する報告、バグ報告、苦情に感謝します。



参照資料



easy_install pyte





github.com/selectel/pyte



誰がありがとうと言う?

コードのボブリー

o_lおよびakmeはLGPLに基づいて公開することに同意しました。



All Articles