Android 3.1 on Asus Transformerで本気でサーバー管理するためのConnectBot

Asus TransformerはAndroid3.0(3.1にアップグレード可能)搭載の、タブレット型とノートPC型に変形可能な変態端末である。

キーボードは本気で実用性を考慮されて作られており、そのへんのノートPCより(筆者が昔使っていたLet’s NoteやMacBookより)格段に打ちやすい。ヨドバシカメラの店頭で出会った際、キーボードの打ちやすさに感心し、「ノート型のAndroidもこれだけ打ちやすいキーボードが付いてるなら悪くないナァ…」と思ったのだが、その後タブレット部が外れてそのまま使えるということに気がついてノックアウトされ、次の日には買っていた。(いちおう、2chで評判を確かめたので次の日なのです)

transformerのキーボードドック部は重く(620g)、タブレット側(680g)と合わせると1.3Kgくらいになってしまうので一般人が持ち歩くにはかなり重い。しかし、Thinkpad+デカバッテリーで1.9Kgを常に持ち歩いている筆者から見ると非常に軽い。しかも、電車の中等、移動中にはタブレット側のみ出して作業をすることができる。さらにさらに、異常にバッテリーの保ちがいいので、使い倒したくても使い倒せないという魅力がある。先日のMongoDB勉強会でも終始WiFiオンで使い続けていたが、結局ドック部のバッテリーだけで足りてしまい、タブレット側は終始97%〜99%バッテリーが残っているという驚異的な状況だった。

作りも非常にしっかりしていて好印象である。Amazonのレビューかどこかで誰かも書いていたが、隅々にまで剛性感があり、往年の(15年くらい前の)日本製品を思わせるような安心感がある。プラスチックぽくてぺらぺらしているSonyタブレットとは天と地の差である。(Sonyタブレットはその分軽いのかもしれないですけど…)

そんなわけでかなり気に入ったので、モバイルとして実用しようと思った際に問題になったのが、サーバ管理のSSHターミナルクライアントをどうするのかということだ。AndroidではConnectBotというよく知られたソフトウェアがあるのだが、transformerのハードウェアキーボードではCtrlキーやShiftキー、Escキー等が効かないためにviなどを実用レベルで使うことができないのである。どうしようかと思っていたところ、こちらのエントリでConnectBotの改造方法が紹介されているのを発見した。そこで、同じ方法でソースコードを書き換え、transformer用に改造したところ、各キーともにうまく動くようになり、viやscreenが問題なく使えるようになった。筆者以外にもtransformerでSSHを使いたい人はいるだろうと思うので、ここに置いておく。

APKファイル
Eclipseプロジェクトディレクトリ(全ソースコードを含む)

・「戻る」キー(キーボード上の一番左上)は、Escとして動作する
・「戻る」キーを本来の「戻る」キーとして動作させるには、Shift+「戻る」キーを押せばOK
・「半角/全角」キーは、Escとして動作する
・「カタカナ・ひらがな・ローマ字」キーも、Escとして動作する
・CtrlとShiftは普通にそのまま動く

ようになっている。なお、Simejiを使っている人はSimeji側を無効にするなどしないと、Shift+7でシングルクォートを打つことができないので注意。

書き換えを行ったファイルはTerminalKeyListener.javaで、2カ所にそれぞれ次のソースコードを追加した。

118行めから:

  //Ctrl
if( keyCode == 113 || keyCode == 114 )
  {
  if( event.getAction() == KeyEvent.ACTION_UP )
    {
    metaState &= ~META_CTRL_ON;
    bridge.redraw();
    }
  else if( event.getAction() == KeyEvent.ACTION_DOWN )
    {
      //disable ctrl_lock
    if ( ( metaState & META_CTRL_ON ) != 0)
      {
      return true;
      }

    metaPress( META_CTRL_ON );
    return true;
    }
  }

235行目から:

  //Escape
if( keyCode == 208 || keyCode == 204 )
  {
  sendEscape();
  return true;
  }

  //Shift+Number
else if( 8 <= keyCode && keyCode <= 16 )
  {
  final char[] _keyMap = new char[]{ '!', '"', '#', '$', '%', '&', '\'', '(', ')' };
  if ( ( metaState & META_SHIFT_ON ) != 0)
    {
    bridge.transport.write( _keyMap[ keyCode - 8 ] );
    metaPress(META_SHIFT_ON);
    metaPress(META_SHIFT_ON);

    }
  else
    {
    bridge.transport.write(key);
    }
  return true;
  }

  //Ctrl
if ((metaState & META_CTRL_MASK) != 0)
  {
  int k = event.getUnicodeChar(0);
  int oldK = k;
  k = keyAsControl( k );
  if( k != oldK )
    {
    bridge.transport.write(k);
    }
  return true;
  }

  //back
if( keyCode == 4 )
  {
  if ( ( metaState & META_SHIFT_ON ) == 0)
    {
    sendEscape();
    return true;
    }
  }

不具合の連絡など、フィードバックは@kinyukaまで。


SSL中間CA証明書を検索するウェブサービス、SSLDB.info

SSLの中間CA証明書を、サーバ証明書をキーに検索するウェブサービスを開発した。
Search for SSL Intermediate CA Certificates – SSLDB.info

また、詳しい内容をWAF Tech Blogにまとめたのでご参考まで。

後日、裏話的な小ネタをこちらのブログに書く予定。