tput – 端末入力で遊ぶ

wget のプログレスバーや, lynx, w3m などの CUI ブラウザ、NetHack などの CUI ゲームなどのように、CUI 画面内の一部だけを動的に書き換える、という処理を実装する方法をメモしておきます。
 
基本として、CUI の描画方法を制御するには特定のキーコードに割り当てられている画面描画の処理命令を利用します。
標準出力に出力された時点で命令が実行されるので、制御コードを知ってさえいれば echo だけで画面描画が実現できてしまいます。次のように入力すると画面をクリアします。

$ echo \


capname については man terminfo の Cap-Name を参照。
例:

% zmodload zsh/terminfo
% echoti setaf 2
% echo Hello,world
Hello,world

参考: http://d.hatena.ne.jp/lurker/20061121
 
・tput
zsh 以外のシェルからでも使える汎用プログラム。Curses や NCurses に含まれています。なお、FreeBSD に最初から含まれている /usr/bin/tput は Curses 版です。
Curses 版の書式 (FreeBSDなど):

$ tput <TCapCode> [ 引数… ]

TCapCode については man termcap の TCapCode を参照。
 
NCurses 版の書式 (FreeBSD ports や Linux など):

$ tput <CapName>

CapName については man terminfo の Cap-Name を参照。
curses よりこちらのほうが一般的です。

curses tput の例:
15 行 20 文字目に文字列 OK を書き込む。

$ tput sc; tput cm 20 15; tput al;echo OK; tput rc

文字に下線を入れる

$ tput us ; echo hello; tput ue

Ncurses tput の例:
文字の色を赤に。

$ tput setaf 1

白に戻す。

$ tput setaf 9

参考: http://www.ibm.com/developerworks/jp/linux/aix/library/au-learningtput/index.html

pkgdb – Segmentation fault

portupgrade をやろうとしたら

# portversion -vl”<"
—> Checking the package registry database
[Updating the pkgdb <format:dbm_hash> in /var/db/pkg … ** Database file locked. Waiting.
** Stale lock file was found. Removed.
– 635 packages found (-2 +1) (…)/usr/local/lib/ruby/site_ruby/1.8/pkgdb.rb:431: [BUG] Segmentation fault
ruby 1.8.6 (2008-08-11) [i386-freebsd7]

といわれてしまったので

# mv /var/db/pkg/pkgdb.db /tmp/pkgdb.db.bak
# pkgdb -F

で pkgdb.db を再構築して対応した。

Ubiquity – 任意のテキストの QR コードを表示する

Firefox アドオンの Ubiquity が便利!ということで、Ubiquity で使える QR コード表示コマンドを作ってみました(Ubiquity 0.1.1 で動作確認)。

// text to QR code
const QRCODE_WIDTH = 150;
const QRCODE_HEIGHT = 150;
const QRCODE_URI = ‘http://chart.apis.google.com/chart?chs=’+QRCODE_WIDTH+’x’+QRCODE_HEIGHT+’&cht=qr&choe=Shift_JIS&chl=’;
CmdUtils.CreateCommand({
name: “qrcode”,
takes: {“Any text(URL, email..)”: noun_arb_text},
preview: function(pblock, arg){
    pblock.innerHTML = ‘Inserts qrcode: <i>’+arg.text+
‘<br><img width=”‘+QRCODE_WIDTH+'” height=”‘+QRCODE_HEIGHT+'” src=”‘ + QRCODE_URI + encodeURIComponent(arg.text) + ‘”>’;
},
execute: function(arg) {
  if(arg.text != “”){
    CmdUtils.setSelection(‘<img src=”‘ + QRCODE_URI + encodeURIComponent(arg.text) + ‘”>’);
  }
}
});

導入方法:
1. Ctrl+Space キーを押して command-editor と入力して改行キーで実行。
2.上のスクリプトをテキスト領域にコピー&ペースト。
 
これで qrcode コマンドが使えるようになります。
 
利用方法:
ページ内の適当な文字列を選択したあと Ctrl+Space を押して qrcode と入力。
または、qrcode コマンドの引数として適当な文字列を入力。
 
例:

qrcode http://google.co.jp/

Ubiquity qrcode command screenshot

 
参考:
Labs/Ubiquity(mozilla.org)
 
Google Chart API(google.com)

Microsoft から Windows 版 GUI フォルダ同期ツールが出た

http://journal.mycom.co.jp/news/2008/08/19/044/index.html

SyncToyは、フォルダの内容を同期するWindows用フリーウェア。同期する1対のフォルダ (フォルダペア) を登録しておくと、サブフォルダを含めるかどうか、コピーは片方向か双方向かなど、あらかじめ設定した条件に従い同期処理が実行される。ローカル / ネットワークを問わず利用できるため、ノートPCとデスクトップPCを同期させる目的などに使用できる。

 
だそうで。
フォルダの同期は Linux 同様 rsync (Cygwin 版) を使うスクリプトを書いて自動化していましたが、SyncToy は GUI ということで手軽に利用できそうです。
 
参考:
米MS、Windows用フォルダ同期ツール「SyncToy 2.0」を無償公開
SyncToy v2.0(Microsoft)

ブラウザを HTML 開発環境にするツール

Firefox (Firefox2, Firefox3)の場合:
Firebug
HTML/CSS/JavaScript の調査、編集を動的に行えるアドオン。
インストールすると「ツール(T) -> Firebug」メニューが追加されます。
 
Web Developer 日本語版(本家: Web Developer)
最近は Firebug に水をあけられていますが Firefox 1 の時代からあるアドオン。
HTML/CSS の調査、CSS の編集ができます。
また、CSS, JavaScript や一部HTML要素の無効化、FORM の GET <-> POST 変換など痒いところに手が届く機能があります。一般ユーザ向けには Firebug よりこちらのほうがよさそうです。
 
Live HTTP Headers
HTTP リクエストヘッダ、レスポンスヘッダの閲覧ができるようになるアドオン。
インストールすると「ツール(T) -> Live HTTP headers」メニューが追加されます。


Internet Explorer (IE6,IE7) の場合:
Internet Explorer Developer Toolbar(Microsoft 公式)
インストールすると「表示(V) -> エクスプローラバー(E) -> IE Developer Toolbar 」を選択することで HTML/CSS の調査ができるようになります。
編集は Attribute: の項目からの各タグの属性(name=”” や id=””, style=””, onClick=”” など)の変更のみに限られているようです。
ちなみに、IE8 では開発ツールが標準搭載されていて Shift+F12 を押すと起動できるとのことです(参考)。
 
ieHTTPHeaders
Live HTTP headers の IE 版。HTTP リクエストヘッダ、レスポンスヘッダの閲覧ができます。
インストールすると「表示(V) -> エクスプローラバー(E) -> ieHTTPHeaders 」メニューが追加されます。


参考:
http://labs.unoh.net/2008/08/introduction-of-css-coding-tools.html

CPAN の IO/Uncompress/RawInflate.pm でエラー

CPAN を更新しようとしたら次のようなエラーが出た。

# cpan
cpan> install CPAN
..中略..
can’t call method “value” on an undefined value at /usr/local/lib/perl5/5.8.8/IO/Uncompress/RawInflate.pm line 64.

どうも展開に失敗しているようで、パッケージのインストール、更新ができなくなってしまっていた。
調べたところ, perl 用の Raw-Zlib 圧縮ライブラリに問題があるようだったので

pkg_deinstall p5-Compress-Raw-Zlib bsdpan-Compress-Raw-Zlib

で削除し、その後通常通り cpan コマンドを走らせたところ無事動作しました(*)。
Ubuntu なら libcompress-raw-zlib-perl を削除すればいいとのこと。
 


(*)実際には

# pkg_deinstall p5-Compress-Raw-Zlib

だけでは途中でエラーになったため

pkg_deinstall bsdpan-Compress-Raw-Zlib bsdpan-Compress-Zlib bsdpan-IO-Compress-Zlib bsdpan-IO-Zlib

で関係ありそうな port をいったん全て削除しました。
参考:
yclog: Can’t call method “value” on an undefined value at /usr/share/perl5/IO/Uncompress/RawInflate.pm line 64

error_reporting=E_ALL のススメ

初歩ではありますが、error_reporting = E_ALL ^ E_PHP_NOTICE な環境に慣れている人のためのコーディングルールを探してもすぐに見つけられなかったため、書いておきます。
 
□変数は代入してから使うこと
定義済みの(値が入っている)変数のみ参照するべきです。
もしもグローバル変数など、値が入っているかわからない場合は isset() や empty() で存在を確認しましょう。接頭文字 @ を使ってもいいですが、 isset() や empty() のほうが望ましいです。
なお、null を代入した変数も定義済みの変数です。

<?php
// —————–
// 未定義の変数参照
// —————–
// NG
echo $foo; // PHP Notice: Undefined variable: foo
// ——–
// OK
$foo = “abc”;
echo $foo;

 
□配列、連想配列の要素も存在するもののみ参照すること
配列の要素の一つ一つについても、変数同様に定義済みのもののみ参照しましょう。
リクエスト値など、値が入っているかわからない場合は isset() や empty() で存在を確認しましょう。

<?php
// —————–
// 未定義の配列要素/連想配列要素の参照
// —————–
// NG
$id = $_GET[‘id’]; // PHP Notice: Undefined index: id (引数省略リクエストの場合)
// ——–
// OK ※省略不可能なパラメータの場合
if(empty($_GET[‘id’])){ // または if( !isset($_GET[‘id’]) )
// エラー処理
exit;
}
$id = $_GET[‘id’];
// ——–
// OK-2 ※省略可能なパラメータの場合
$id = isset($_GET[‘id’])? $_GET[‘id’]: null;

 
□定数の定義方法に注意しましょう。
定数の定義関数は

define(定数名文字列, 値)

です。
第一引数はシンボルではなく文字列です。’〜’ や “〜” で括ることを忘れないようにしましょう。

<?php
// —————–
// 未定義の定数参照(定義時)
// —————–
// NG
define(FOO, 123); // PHP Notice: Use of undefined constant FOO – assumed ‘FOO’
// ——–
// OK
define(“FOO”, 123);

 
□文字列中の連想配列のキー指定時もクォーテーションにも注意

“{$assoc[key]}”

は key が定数値とみなされます。
連想配列のキーをダブルクォーテーションまたはシングルクォーテーションで囲むようにしましょう。

<?php
// —————–
// 未定義の定数参照(文字列内での連想配列参照)
// —————–
// NG
$foo=array();
$foo[“name”] = ”John”;
echo “{$foo[name]}\n”; // Use of undefined constant name – assumed ‘name’
// ——–
// OK
$foo=array();
$foo[“name”] = ”John”;
echo “{$foo[‘name’]}\n”;

ブラウザで見ているページを編集可能にする

javascript:document.body.contentEditable=’true’; document.designMode=’on’; void 0

をアドレスバーで実行すれば、ブラウザで開いているページの画像やテキストを自由に書き換えることができます(IE6, Firefox3 で確認)。
 
編集をやめたいときは↓の一行を実行します。

javascript:document.body.contentEditable=’false’; document.designMode=’off’; void 0

 
参考:
Cut and paste one line of code to make any website editable

Firefox 3 用アドオン/テーマ

本日 Firefox 3.0 公開、ということで、おいておきますね。
それぞれ公式サイトのものを改造した非公式版なので、正式版が対応するまでの間に合わせに自己責任でご利用ください。
 
All In One Gesture Version 0.1.8 for Firefox 3.0
 
フォクすけテーマ 1.0 for Firefox 3.0
 ※タブだけテーマが適用されない不具合あり。