SQLite3にformatみたいな関数がないのでTclでやる

1-12みたいな連番文字列を01012に一括変換したかった。別のカラムに分けるのが普通でしょうが、諸事情により。
SQLiteの組み込み関数には日付の操作関数は充実してるけど、文字列操作関数は大したものがない。
それで、Tclでやることにした。

package require sqlite3
sqlite3 db ./app.db; # handle and database file
 
db eval {SELECT * FROM squence WHERE field LIKE "%-%"} values {
	set R-V $values(field)
	if {[scan ${R-V} %d-%d R V] == 2} {
		set RRVVV [format %02d%03d $R $V]
		db eval [format {UPDATE squence SET field="%s" WHERE id=%d} $RRVVV $values(id)]
	}
}

02012みたいなのは、クォートしないと数値とみなされて2012みたいになってしまうので注意が必要です。
LIKE以外にもGLOBやREGEXPも使えるらしい。

050-で始まる電話番号を持つ人のリストを取得するなど。
select * from users where phone_number REGEXP "^050-.+$"

Tcl/TkでMutexを使った多重起動防止

Tcl単体でやろうとすると、ロックファイルでやりなさいということになるんですけど、その場合Tclの処理系が起動するまでに、別のインスタンスが起動できてしまう可能性があるので、厳密ではないです。たとえば、

package require sqlite3
sqlite3 db ./app.db; # handle and database file
 
db eval {SELECT * FROM squence WHERE field LIKE "%-%"} values {
	set R-V $values(field)
	if {[scan ${R-V} %d-%d R V] == 2} {
		set RRVVV [format %02d%03d $R $V]
		db eval [format {UPDATE squence SET field="%s" WHERE id=%d} $RRVVV $values(id)]
	}
}

とかやると、2重起動してしまいます。

プロセスリストを取得して処理する方法もあります http://goo.gl/K38a 。今まではこれを使っていました。ただ、プロセスリストの取得自体が結構時間かかるので、上記よりましですが確実ではないです。

別の方法として、socketで特定ポートをバインドして、多重起動時にエラーにするという方法があります。singleton application - Tcler's Wiki
ネットワークを使わないのにファイアウォールの例外にするか聞かれたりするのが嫌です。

Mutexを使うと、VBやC#とかでやってるみたいな厳密な多重起動防止対策ができます(Windows限定)。

twapi 2.2.3での実装

package require twapi 2.2.3
twapi::import_commands
 
set appname "My Application"
 
set handle [create_mutex -name $appname]
if {[lock_mutex $handle -wait 1] > 0} {
	tk_messageBox -icon error 
		-title "Startup error" 
		-message "Another instance is running." 
		-type ok
	exit
}
console show

twapi 3.0 正式版での実装

先日twapi3.0の正式版がリリースされました。
3.0では従来通りpackage require するか、dllを1個loadするかが選べるようになりました。
x86版はTcl8.4をサポートしています。
3.0ではAPIの仕様がいろいろ変わって、lock_mutexの返り値がsignalled, timeout, abandonedのいずれかとなっています。

load twapi-x86-3.0.29.dll
twapi::import_commands
 
set appname "My Application"
 
set handle [create_mutex -name $appname]
if {[lock_mutex $handle -wait 1] ne "signalled"} {
	tk_messageBox -icon error 
		-title "Startup error" 
		-message "Another instance is running." 
		-type ok
	exit
}
console show

先に起動してたウインドウを閉じるかユーザに聞く

そういうことをする実験です。実際にはプロセスをkillするとか、ウィンドウの存在を監視して、完全に終了するのを待つとかが必要になると思います。

package require Tk
load twapi-x86-3.0.29.dll
twapi::import_commands
 
set appname "My Application"
 
set handle [create_mutex -name $appname]
if {[lock_mutex $handle -wait 1] ne "signalled"} {
	set ans [tk_messageBox -icon error 
		-title "Startup error" 
		-message "Another instance is running. Kill it?" 
		-type yesno]
	switch $ans {
	yes {
		set hWnds [find_windows -text $appname]
		foreach hWnd $hWnds {
			close_window $hWnd
		}
	}
	no {
		exit
	}
	}
}
 
wm title . $appname
wm protocol . DELETE_WINDOW EXIT
proc EXIT {} {
	after 3000 exit
}

Tcl/Tkのいいところ

半年くらい前まではC#でGUIアプリケーションを作っていたけど、ここ数ヶ月は主にTcl/Tkを使っている。僕がTcl/Tkを使っている理由は、最初にまともなプログラムを書いたのがTcl/Tkからだったからだ。それ以外に必然的な理由はない。以前はプログラマを名乗るのならば、C/C++/Javaあたりは最低やっておかねばという強迫観念にとらわれていた自分だが、最近C#をやって静的型付言語の雰囲気をかじったことで、まあ、必要になったらやったらいいんじゃないかなくらいに思えてきた。

シェアの大きい言語をほとんど使いこなすことなく、Tcl/TkやRubyといったどちらかというとマイナーな言語ばかり使ってきた僕が、Tcl/Tkに客観的な評価を与えられるとは思わないが、5年間というプログラマー生活を共に過ごしてきたこの言語について、実用的観点でよいと思うことを挙げておきたいと思う。

I/Oの抽象化

ファイル、ソケット通信、シリアル通信などがチャネルというハンドルに対する共通のコマンドで操作できる。さらに、VFS(仮想ファイルシステム)といって、たとえばZIPファイルやFTPを普通のディレクトリと同じコマンドで扱えたりする。

wish.exeって便利

Tkアプリケーションで、console showとか書いとくと、アプリケーションを起動したときにシェルウィンドウが開く。ここからなんでもできてしまう。アプリケーションを走らせたまま書き換えることができる。Rubyでもできるけど、インタラクティブなシェルってコマンドライン上で動くirbしかないよね。Ruby/Tkでイベントループ走らせちゃったらもう何もできないし。

マニュアルが読みやすい

MSDNみたいな非人間的な解説じゃない。コマンドのカテゴリ分けが適切で、ひとつひとつのコマンドやオプションに必要かつ十分な説明が正確な英語で書かれている。サンプルスクリプトが少ないのが不満だったが、Tcler's Wikiという膨大なナレッジベースを参照すればいろいろ見つかる。

実用的なライブラリが豊富

およそライブラリというものには言語の機能を組み合わせて複雑な機能を実現してくれるものと、言語ではできないことを可能にしてくれるものがある。前者のバリエーションの豊富さは言語の力を示すものだ。後者は逆かもしれないが、インタープリタ言語には必要なものだ。そしてTclはどちらの種類のライブラリも本当にたくさん揃っていると思う。Perl,PHP,Rubyみたいなパッケージシステムでteapotレポジトリというのがでてきたので、そのうち実用的になっていくことだろう。Windows向けに、ActiveXコントロールをTkに埋め込むライブラリ、COMインターフェース、Win32APIのラッパーライブラリ、DLLのエクスポート関数を利用するライブラリも存在する。

デプロイが簡単

ActiveStateのTclDevKitを使えば、Tclインタープリタ、ライブラリ、ソースコード、フォント、画像など、すべてを単一の実行ファイルに固めて配布でき、ソースコードの隠蔽もできる。僕は複数のファイルからなる合計2万行程度のスクリプトと、ロゴなどの画像、十数種類のパッケージなどを単一ファイルにラップしているが、せいぜい6MB程度にしかならない。.NET Framework 4 client profileはダウンロードするだけで41MBもある。展開したらもっと大きくなるだろう。仕組みはよく分からないが、英語版WindowsXPに日本語フォントがなくてソースコードのコメントが文字化けしていたときも、コンパイルしたTcl/TkのGUIには日本語が表示できていた。

え、これだけ?とか、どれも言語の機能じゃないんですけど、とつっこまれそうなものばかりだな。。。来年あたり8.6が出るみたいだけど、こいつはかなり進化しているらしいですよ。lambda, coroutineに期待。最近は何でも屋さんの傾向は薄れつつあり、言語自体の近代化が進んでいるように思う。JimというTclのアナザー実装はガベージコレクタを持っているらしい。

実はここでは目をつむった悪いところもたくさんあるんですけど、デプロイがここまで簡単なスクリプト言語ってほかに知らないなあ。あと、目が悪いせいか、美しいとか言われてるRubyのソースコードより、Tclのほうが美しく見えてしまうのですよね。

なんか思いついたら追加するかも。

DataGridViewをActiveXコントロールにラップしてTcl/Tkのウィンドウに埋め込む(3)

これまでの経緯
DataGridViewをActiveXコントロールにラップしてTcl/Tkのウィンドウに埋め込む(1)
DataGridViewをActiveXコントロールにラップしてTcl/Tkのウィンドウに埋め込む(2)

去年やってたoptclによるDataGridView埋め込みが、ようやく役に立つときが来た。
しかし、イベントを追加しようとしたところ、いきなり壁にぶち当たってしまった。

新たに定義したイベントにコールバックを登録できない。

続きを読む

C#とSQLiteの日時データ型とパフォーマンス

1年ほど前に手がけた仕事では、C#+Windows.Forms+Entity Framework+System.Data.SQLite という組み合わせでアプリケーションを作成しました。

次に始まる開発でもこの組み合わせにするつもりですが、いろいろとやりにくかった点をまとめておきたいと思います。まずは、SQLiteの日時カラムについて。

続きを読む

Atermのログを解析する

昨日あたりからしょっちゅうネットが見れなくなって、NECのルータのPPPoE接続をOFF/ONすることで一時的に回復させていた。最初はルータが寿命か?と思ったけど、どうやらそうでもなさそう。

外部からのハッキングについては今まであまり調べたことがなかったんだけど、この機会に調べてみようと思い、TclでAtermのログを解析するスクリプトを書いてみた。

書いた後で気づくのもなんだけど、誰がアクセスしてきてるのか分かったところで、こっちから逆に攻撃するわけにもいかず、大して役に立たない。

強力なルータに変えたら攻撃に耐えられるようになるのだろうか?その辺よく分からない。とりあえず早まってLa Fonera 2.0nを注文してしまった。前から買うつもりだったので、「しまった」というのはわざとらしいですが。

内容的には以下のようなもの。

  1. ログを読み込んで"NAT RX Not Found : TCP"という怪しいログを探す。
  2. その行から送り元のIPアドレスを抽出する。IPアドレスのヒストグラムを作成する。
  3. IPアドレスをwhoisに投げて、ドメインの情報を取得する。
  4. IPアドレスごとに、アクセスランキング、whoisの情報を列挙する。

続きを読む

ChromePlus & Extensions

しばらく安定版のGoogle Chromeに戻してたけど、マウスジェスチャの拡張はどうしてもサンドボックスの制限を受けるらしく、全画面トグルや特殊ページでのジェスチャを実現できるものはなかった。ChromePlusに戻ってきて、組み込みジェスチャはやっぱり快適だと思う。

ChromeとChromePlusの相互乗り換えは自動的にできないので、拡張の再インストールとXmarksからブックマークのダウンロードをする必要がある。後者の作業はできればChromeのブックマーク同期機能が使えればいいが、初期同期の動作がよく分からないので場合によっては大量の重複ブックマークができてしまう。Xmarksのようにローカルを捨ててサーバーからダウンロードするというような初期化動作が指定できるオプションがあればいいのに。

僕がインストールしている拡張は以下のとおり。

Chromed Bird
- バージョン:
1.8.0
(無効)
(開発中)
Chromed Bird is a Twitter extension that allows you to follow your timelines and interact with your Twitter account.
FreshStart - Cross Browser Session Manager
- バージョン:
1.3.4
(無効)
(開発中)
Need simple session management? Several users on the same Chrome? FreshStart is a simple cross browser session manager.
Google Mail Checker Plus
- バージョン:
1.1.7
(無効)
(開発中)
Displays the number of unread messages in your Gmail and Google Apps inbox. Preview mail, read, delete, archive and mark as spam!
PBTweet+
- バージョン:
0.2
(無効)
(開発中)
Pretty good, Better tweeting + Tweet
RSS Subscription Extension(by Google)
- バージョン:
2.1.1
(無効)
(開発中)
ワンクリックで登録できるボタンをツールバーに追加します。
SEO Site Tools
- バージョン:
2.78
(無効)
(開発中)
On-Page / External metrics, Social Media info, Metrics / numbering on Yahoo, Bing, Google SERPs.Extends WMT, YSE and GA with metrics
Xmarks Bookmarks Sync
- バージョン:
0.7.1
(無効)
(開発中)
Backup and sync your bookmarks across computers and browsers. Xmarks is also available for Firefox, Safari and IE.

ネット端末としては最高。ガラケーの代替としては失格。

一週間前にXperia購入しました。

価格.comにレビューを書いたので、ここにもメモっておきます。

【デザイン】
ボディのデザインはカッコいいです。他のスマホの出来が可哀想になるくらい。

【携帯性】
意外と重い。サイズ的にもジーンズだと前ポケットには入らないので、後ろポケットに入れますが、壊れないか心配。バッグに入れる人は問題なし。キーロックは電源ボタンを短く押せばいいんですが、条件反射的に押せる位置じゃないので忘れていろんなアプリが起動したり勝手に着信したりします。

【ボタン操作】
ボタンはタッチパネルなわけですが、特に左右の端っこに表示されるボタンの反応が悪いです。ソフトキーボードの押し間違えは頻繁にやってしまいます。パソコンと違ってUndoがないので間違えると修正が面倒。ボリュームボタンに人差し指がかかるので、マナーモードが解除されたり、ボリュームが変化したりします。

【文字変換】
変換精度は非常に良いです。アルファベットの単語は予測変換を使うと後ろに半角スペースが入ってしまいます。英語圏の人は文章打ちに効率がいいでしょうが、日本人の私がアルファベットを打つのはログイン名やメールアドレスです。毎回スペースを削除する必要があるので逆におせっかいな機能です。またピリオドを打つと自動的に確定されるので、メールアドレスの自動学習は出来ません。メルアドやログイン名は単語登録しとくと便利です。パスワードは登録しちゃ駄目。

【レスポンス】
良いです。サクサク動きます。アプリの起動も非常に速いです。マルチタスクなので、ブラウザなどの場合はバックグラウンドで常駐しているためというのもありますが、新規に起動する場合も速いです。CPUが高速なおかげでしょう。iアプリのようにJAVAの起動画面がクルクル回るような待ち時間はありません。スクロールがぎこちないことはよくあります。

【メニュー】
画面下にある3つのボタンの機能は左からサブメニュー、ホーム、バック、となっています。困ったら左ボタンをおしましょう。常駐系アプリは終了メニューがなく、ホームを押すとバックグランドで常駐します。終了するにはjkAppSwitchなどのアプリをインストールして下さい。

【画面表示】
大画面、高解像度で、非常に美しいです。文句のつけようがありません。汚れないように液晶保護フィルムを貼ると良いです。画面の汚れふきで油汚れをとり、セロファンテープで糸埃を除去しつつ、泡が入らないように貼ります。大画面ゆえに結構難しいです。

【通話音質】
家族(docomo)に電話したら金属音のようなノイズがたえず入ると言われました。電話としてのXperiaは以下の点で不満があります。

・電話アプリの品質が悪く、着信動作でフリーズすることがある。・通話中にフリーズして電話を切ることが出来ないことがある。・キーロックを忘れるとポケットの中で通話開始していたりする。・バイブレータの振動が弱い。
フリーズは制限なしのマルチタスクゆえかもしれません。ガラケーのマルチタスクは制限だらけにして割込みを排除していたのでしょう。

【呼出音・音楽】
呼び出し音はデフォルトしか使っていません。音楽を着信音に使ったりもできるみたいです。
音楽プレーヤーとしてのXperiaは、ネット端末ならではの機能を備えていますが、電池消費が激しく音楽転送用のPCソフトMedia Goの出来が悪いことからおすすめできるものではありません。Media Goの代わりにdoubleTwistというPCソフトを使ってますが転送速度が異常に遅いです。XperiaのプレイヤーであるMediaScapeは悪くないですが、動作が重いし、ワンタッチで再生という訳にはいかないのでちょっと面倒です。音楽はやはりXperiaでなく専用プレイヤーが良いでしょう。

【バッテリー】
待受300時間とありますが、何も起動しない状態にしてXperiaを使うということはメリットをかなり削いでしまうため、ある程度アプリを常駐させた状態を前提に考えるべきでしょう。その上で300時間というのは全く期待できない数字です。現実にはその10分の1ですら不可能でしょう。

Xperiaがウリにしている機能を普通に使った場合は非常に悪いです。Timescapeの自動更新やGmail、Mediascapeの再生を停止した状態などといったアプリがバックグランドで生きていると、朝フル充電していても昼にはなくなってしまいます。私はiMoNiというiモードメール用のアプリだけを活かして、それ以外はAdvanced Task Cleanerというソフトで自動終了するように設定しています。どこまで伸ばせるか、実験中です。

【総評】
スマートフォンは通信業界に革命をもたらす言われています。今は発展途上なので、ガラパゴスケータイ(日本の従来型携帯)の代替としては機能不足です(おサイフケータイや赤外線通信非対応など。)それは知った上で購入したものの、1週間使ってみて、日本の携帯の素晴らしさを改めて実感しています。前の機種は4年前に発売された同じくソニエリのSO902iでした。これも電池のもちは良い方ではないですが、まだまだ現役で使えます。
2回線契約できる人(Xperia用にはb-mobileSIMというデータ通信専用のSIMもあるので実質1.3回線分くらいの料金になります)なら、ネット専用の超小型端末として最大のメリットを享受できるでしょう。ガラケーのフルブラウザは使ったことがありませんが、Xperiaのブラウザの性能はおそらくそれらに勝ります。特にDolphin BrowserというサードパーティのブラウザはAjaxだらけのページでさえPCと同等にレンダリングします。
Flash Playerはないので、Youtubeなどは付属の専用アプリを使います。
内蔵カメラの性能が優れている上、写真をすぐにWebサービス(Facebook, Picasa, Flickrなど)にアップロードすることが出来ます。これはとても便利です。
無料のアプリがたくさん出ていますが、審査がないため、スパムに近いアプリも沢山あります。気を付けましょう。

-- 2010-04-19追記

通話品質ですが、通話中にスピーカーをONにしてハンズフリー通話にした場合、ノイズだらけになります。これはXperiaのマイク感度が良すぎることと、ガラケーでは全機種が搭載していたノイズキャンセラがないことが原因のようです。まともにハンズフリーするにはヘッドセットが必須です。私は純正Bluetoothヘッドセットを注文しました。

WordPressはじめました。

WordPress前から使いたかったんですが、ようやく居場所を見つけることができました。

wordpress.comっていう無料でWordPressを解説できるサービスがあるんですが、これの場合は無料プランではプラグインが使えないので魅力半減なのです。

そもそもWordPressがいいと思ったのは、まともなHTMLが書けそうなことと、ソースコードのハイライトが簡単にできるWP-Syntaxというプラグインがあるためです。もっともほかのCMSでそういうことができないのかは全部調べたわけじゃないのですが。

ちょっと前まで、MicrosoftのLiveSpacesというブログサービスを使っていましたが、DIVタグだらけで再編集のしようもないよっていうソースを吐くので、気に入りませんでした。あとレスポンス超遅い。ブログ更新用のLiveWriterという.NETのソフトがあって、ソースコードのハイライトができるんですが、結局単に書式設定済みHTMLを生成して貼り付けるだけなので、汚いです。

そういうわけで、WordPressはきっとベストなはずです。