Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 12797] ファイルの概要

このコミットは、Go言語の実験的なパッケージ exp/terminal を削除するものです。このパッケージは、VT100ターミナルとのインタラクション、特にライン入力の読み取りやパスワードの読み取り、カーソル操作などを扱う機能を提供していました。コミットメッセージによると、この機能は code.google.com/p/go.crypto/ssh/terminal という別のリポジトリに移行されたため、元の場所からは削除されました。

コミット

commit dc640ebd1a340a53db2c5520afca8643fd8f063e
Author: David Symonds <dsymonds@golang.org>
Date:   Fri Mar 30 15:27:39 2012 +1100

    exp/terminal: delete.
    
    This is now known as code.google.com/p/go.crypto/ssh/terminal.
    
    R=golang-dev, r
    CC=golang-dev
    https://golang.org/cl/5970044

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/dc640ebd1a3400a53db2c5520afca8643fd8f063e

元コミット内容

exp/terminal: delete.

This is now known as code.google.com/p/go.crypto/ssh/terminal.

変更の背景

このコミットの背景には、Go言語の標準ライブラリの整理と、特定の機能の専門化があります。exp (experimental) パッケージは、Goの標準ライブラリに含める前に、新しいアイデアやAPIを試すための場所として機能していました。exp/terminal パッケージは、ターミナル操作に関する低レベルな機能を提供していましたが、このような機能は、よりセキュリティに特化した文脈、特にSSHクライアントやサーバーの実装において重要になります。

Goプロジェクトは、標準ライブラリの肥大化を防ぎ、特定のドメインに特化した機能を適切な場所に配置する方針を持っています。terminal パッケージの機能が go.crypto/ssh/terminal に移動されたのは、この機能が暗号化やセキュアな通信に関連する ssh パッケージの一部としてより適切であると判断されたためと考えられます。これにより、標準ライブラリはよりスリムに保たれ、ターミナル操作の専門的な側面は、より適切な専門リポジトリで開発・保守されることになりました。

前提知識の解説

Go言語の exp パッケージ

Go言語の標準ライブラリには、exp というプレフィックスを持つパッケージ群が存在しました。これらは「実験的 (experimental)」なパッケージであり、将来的に標準ライブラリに取り込まれる可能性のある機能や、まだAPIが安定していない機能が置かれていました。exp パッケージのコードは、標準ライブラリの一部として配布されますが、そのAPIの安定性や将来的な存在は保証されません。開発者は、これらのパッケージを使用する際には、APIの変更や削除のリスクを考慮する必要がありました。

VT100ターミナルとエスケープシーケンス

VT100は、DEC(Digital Equipment Corporation)が開発したビデオディスプレイターミナルで、1978年にリリースされました。これは、現代の多くのターミナルエミュレータの事実上の標準となり、その制御シーケンス(エスケープシーケンス)は、テキストの色付け、カーソル移動、画面クリアなど、ターミナル上での様々な操作を行うための標準的な方法として広く採用されています。エスケープシーケンスは、ASCIIのエスケープ文字(\x1b または ESC)で始まり、その後に特定の文字の組み合わせが続きます。例えば、\x1b[31m はテキストを赤色にするためのシーケンスです。

ターミナルの「raw mode」

ターミナルは通常、「カノニカルモード(cooked mode)」で動作します。このモードでは、入力された文字はすぐにアプリケーションに渡されず、行全体が入力されてEnterキーが押されるまでバッファリングされます。また、バックスペースやCtrl+Cなどの特殊なキー入力は、ターミナルドライバによって処理されます。

一方、「raw mode(生モード)」では、これらの処理が無効になります。入力された文字は即座にアプリケーションに渡され、特殊なキー入力もそのままアプリケーションに送られます。これにより、アプリケーションはキー入力に対してより細かく制御できるようになり、インタラクティブなコマンドラインインターフェースや、パスワード入力時のエコーバック抑制(入力文字が表示されないようにする)などを実装することが可能になります。exp/terminal パッケージは、このようなraw modeへの切り替えや、その状態の管理を行う機能を含んでいました。

code.google.com/p/go.crypto/ssh/terminal

go.crypto は、Go言語における暗号化および関連するセキュリティプロトコルを扱うためのパッケージ群を含むリポジトリです。このリポジトリは、Goの標準ライブラリとは別に開発・配布されており、より専門的なセキュリティ関連の機能を提供しています。ssh/terminal は、Secure Shell (SSH) プロトコルに関連するターミナル操作の機能、特にパスワード入力時のエコー抑制や、SSHセッション内でのターミナル設定の管理などを担当しています。exp/terminal の機能がここに移行されたのは、その機能がSSHのようなセキュリティが重視される文脈で特に有用であるためです。

技術的詳細

このコミットは、src/pkg/exp/terminal ディレクトリとその内容を完全に削除するものです。削除されたファイルは以下の3つです。

  1. src/pkg/exp/terminal/terminal.go: ターミナル操作の主要なロジックが含まれていました。Terminal 構造体、エスケープシーケンスの定義、キー入力の処理 (handleKey メソッド)、カーソル移動、ラインの書き込み、パスワードの読み取り (ReadPassword)、ラインの読み取り (ReadLine) などの機能が実装されていました。
  2. src/pkg/exp/terminal/terminal_test.go: terminal.go の機能に対するテストコードが含まれていました。MockTerminal を使用してターミナルをシミュレートし、キー入力やラインの読み取りが正しく動作するかを検証していました。
  3. src/pkg/exp/terminal/util.go: ターミナルに関する低レベルなユーティリティ関数が含まれていました。具体的には、ファイルディスクリプタがターミナルであるかどうかの判定 (IsTerminal)、ターミナルをraw modeに設定する (MakeRaw)、元の状態に戻す (Restore)、ターミナルのサイズを取得する (GetSize)、そしてエコーなしでパスワードを読み取る (ReadPassword) といった機能が、syscall パッケージを使用して実装されていました。特に util.go は、Linuxシステムコールを直接利用してターミナル設定を変更しており、OS依存のコードでした。

これらのファイルが削除されたことにより、Goの標準ライブラリからターミナル操作に関する実験的な機能が完全に消滅しました。これにより、Goの標準ライブラリはよりコアな機能に集中し、ターミナル操作のような専門的な機能は、より適切な外部パッケージ (go.crypto/ssh/terminal) で管理されることになりました。

コアとなるコードの変更箇所

このコミットは、既存のコードの変更ではなく、ファイルの削除のみを行っています。

削除されたファイル:

  • src/pkg/exp/terminal/terminal.go (520行削除)
  • src/pkg/exp/terminal/terminal_test.go (110行削除)
  • src/pkg/exp/terminal/util.go (115行削除)

合計で745行が削除されています。

コアとなるコードの解説

このコミットには、新しいコードの追加や既存コードの修正は含まれていません。代わりに、src/pkg/exp/terminal ディレクトリ内の全てのファイルが削除されています。これは、このパッケージの機能が別の場所 (code.google.com/p/go.crypto/ssh/terminal) に完全に移行されたため、元の場所での存在意義がなくなったことを意味します。

削除されたコードは、Go言語でターミナルとインタラクトするための基本的な機能を提供していました。例えば、terminal.go は、ユーザーからのキー入力を処理し、カーソルを移動させ、ラインを編集するなどの、インタラクティブなシェルやCLIアプリケーションで必要となる機能を提供していました。util.go は、OSのシステムコールを利用してターミナルの設定(例: エコーの有無、カノニカルモード/rawモード)を直接操作する低レベルな機能を提供していました。これらの機能は、Goの標準ライブラリの exp パッケージとして提供されていましたが、より専門的な go.crypto/ssh パッケージの一部として再構築されたため、削除されました。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント
  • go.crypto リポジトリのソースコード
  • VT100ターミナルに関する一般的な情報源 (例: Wikipedia)
  • ターミナルI/Oに関するUNIX/Linuxのドキュメント (termiosなど)