2010/08/17
SwiftPoint
Swiftpointが発売した
超小型のモバイルマウスが到着したので、
早速開封して MacBook に接続してみる。
自然に曲げた人差し指が丁度触れる位置に通常の左クリックボタン、
その手前に右クリックボタンがあるので、
特に右クリックボタンは最初のうちは意識しないと押し辛い気がする。
左クリックボタンの外側に設置されたスクロールホイールは、
指先で回転させても、本体を少し傾けて本体を上下させる
サイドスクロールでもなかなか使い易いので良いアイデアではないだろうか。
ペンを握る時の様な自然な持ち方で利用するので 細かな操作も可能という触れ込みなのだが、 一般のマウスとは若干異なる操作感なので慣れるまでには多少時間が必要そうだ。
2010/06/02
みずほ銀行
みずほ銀行のオンラインバンキングで振り込みをする場合に必要な
第2暗証番号から指定された4桁の番号を見つけ出すためのスクリプト。
awk (1) だけで書いたのでどんな環境でも動作する筈。
引数で番号を指定するか端末から入力すると、
対応する数字が表示されます。
こんなピンポイントでしか役立たないスクリプトを
利用する人がいるかどうか不明なのだが、
折角なので公開だけはしてみる。
あまり問題はないと思うのだが、
第2暗証番号を平文で保存するので
ご利用はくれぐれも自己責任で。
1#!/bin/sh 2# 3# $Id: mizuho,v 1.1 2010/01/06 07:15:54 mitz Exp $ 4# 5awk ' 6 BEGIN{ 7 base="第2暗証番号" 8 if("'$1'") 9 num = "'$1'" 10 11 if(!match(num, /^[0-9]{4}$/)){ 12 printf "Input number: " 13 getline num < "/dev/tty" 14 } 15 split(num, nums, ""); 16 for(i=1; i<=4; i++) 17 print substr(base, nums[i], 1) 18 print 19 } 20' < /dev/null
2010/05/13
ファイルの逆順出力
ファイルを逆順に出力したい事がたまにある。
FreeBSD の tail (1) には -r オプションがあって
ファイルを行単位で逆順に出力できるが、
これは POSIX.2 にはない拡張仕様なので汎用的ではない。
Linux では tac (1) (多分逆順に出力する cat だから tac)
というコマンドがインストールされている事もあるが、
これも POSIX.2 には存在せず
Linux でも標準ではインストールされていない場合がある。
ファイルの逆順を出力するなら ex (1) を利用して、
$ ex -s ファイル <<-FOF > g/^/mo0 > %p >EOFとするのが汎用的で良いと思う。
簡単に解説すると「行の先頭 (^) を 0 行目に移動(mo0)して、
全行を表示する(%p)」というコマンドを実行している。
行の先頭は全ての行に存在するので全ての行が処理対象になる。
各行を順番に 0 行目(1 行目の前の行なので先頭行)に移動するので、
結果としてファイルの内容が逆順に表示される。
2010/03/27
mnews
随分と長い間 mnews というソフトウェアを愛用している。
名前の通り、元々は Net News Reader として開発されたのだが、
MUA としての機能も備わっていて割と使いやすいので、
随分と以前より(1990年代の中盤頃から)愛用している。
最近はあまりメンテナンスもされていない様なのだが、
たまにネットで公開されている機能拡張用のパッチを適用したり、
自分でも簡単な改造をしながら長年愛用してきた。
今ではオリジナルにはない mime マルチパートメイルの送受信機能なども加わり、
今時の MUA としては最低限の機能は備える程度には機能が充実している。
最近は UNICODE で送られてくるメイルも増えて来たので、
UNICODE メイルを表示するためのパッチを適用し、
ついでに html メイルを lynx などのテキストベイスのブラウザで
表示する機能を追加した。
これで現状必要と思われる機能はほぼ網羅したと思われ、
届くメイルのほぼ全てを閲覧する事が出来るようになった(多分)。
まだまだ mnews を愛用できそうで嬉しい限りだ。
2010/03/18
GtkTwitter
FreeBSD 上で動作する twitter クライアントの GtkTwitter は 起動するたびにアカウント情報を入力する必要があり面倒だったので、 アカウント情報をファイルに保存して再利用するためのパッチを作成してみた。
自分が使う事だけを考えて適当に作ったので、
パスワードの暗号化すらしておらず、
シンタックスもセマンティックスもチェックしていない。
ただ単にアカウント情報を保存して再利用するだけの機能のみ。
ホームディレクトリに .gtktwitter があれば
保存されたアカウント情報を利用する。
$HOME/.gtktwitter がなければ
従来通りアカウント情報の入力ダイアログを表示し、
入力されたアカウント情報は $HOME/.gtktwitter に保存される。
$HOME/.gtktwitter は以下の書式なので、
アカウント情報は vi (1) を利用して入力する事も可能である。
勿論 cat (1) や echo (1) でも可。
ファイル中のスペースは文字そのものとして解釈されるので注意する事。
mail=ID pass=パスワード
diff -rc gtktwitter-0.0.4.orig/gtktwitter.c gtktwitter-0.0.4/gtktwitter.c
*** gtktwitter-0.0.4.orig/gtktwitter.c 2007-05-10 00:50:02.000000000 +0900
--- gtktwitter-0.0.4/gtktwitter.c 2010-03-18 20:15:01.000000000 +0900
***************
*** 724,729 ****
--- 724,783 ----
return FALSE;
}
+ #define CONFIG_FILE ".gtktwitter"
+
+ static gboolean getconfig(GtkWidget *window)
+ {
+
+ gchar *config;
+ char buff[1024],
+ *m = NULL,
+ *p = NULL;
+ FILE *fp;
+ gboolean ret = FALSE;
+
+ if((config = g_strdup_printf("%s/%s", getenv("HOME"), CONFIG_FILE))){
+ if((fp = fopen(config, "r"))){
+ while(fgets(buff, sizeof(buff), fp))
+ if(!strncmp(buff, "mail=", 5))
+ m = strdup(buff+5);
+ else if(!strncmp(buff, "pass=", 5))
+ p = strdup(buff+5);
+ fclose(fp);
+ }
+ g_free(config);
+
+ if(m && p){
+ g_object_set_data(G_OBJECT(window), "mail", m);
+ g_object_set_data(G_OBJECT(window), "pass", p);
+ ret = TRUE;
+ }
+ }
+
+ return (ret);
+
+ }
+
+ static void putconfig(const char *m, const char *p)
+ {
+
+ gchar *config;
+ FILE *fp;
+
+ if((config = g_strdup_printf("%s/%s", getenv("HOME"), CONFIG_FILE))){
+ if((fp = fopen(config, "w"))){
+ fprintf(fp, "mail=%s\n", m);
+ fprintf(fp, "pass=%s\n", p);
+ fclose(fp);
+ }
+ g_free(config);
+
+ }
+
+ return;
+
+ }
+
/**
* login dialog func
*/
***************
*** 735,740 ****
--- 789,798 ----
GtkWidget* pass = NULL;
gboolean ret = FALSE;
+ if(getconfig(window)){
+ ret = TRUE;
+ }
+ else{
/* login dialog */
dialog = gtk_dialog_new();
gtk_dialog_add_buttons(GTK_DIALOG(dialog),
***************
*** 804,812 ****
--- 862,873 ----
char* pass_text = (char*)gtk_entry_get_text(GTK_ENTRY(pass));
g_object_set_data(G_OBJECT(window), "mail", strdup(mail_text));
g_object_set_data(G_OBJECT(window), "pass", strdup(pass_text));
+ putconfig(mail_text, pass_text);
ret = TRUE;
}
+ }
+ if(dialog)
gtk_widget_destroy(dialog);
return ret;
}
2010/02/10
ディスプレイカードの温度表示
ディスプレイカードの温度上昇が原因と思われる
表示不正が稀に発生するので、
ディスプレイカードの温度を取得して表示してみた。
取得した温度は普段利用しているデスクトップ環境で常時表示している
GKrellM (1)
のセンサー表示部分に多少無理やり表示してしまう事にする。
GKrellM (1) は mbmon (1) をデーモンとして起動しておくと
mbmon (1) から取得した3種類の温度を表示できるので、
mbmon (1) を改造して3番目の温度を
ディスプレイカードの温度に変更してしまうというのが
「多少無理やり」な方法だ。
ディスプレイカードに nVidia の GeForce を使用しているので、
温度は nvidia-settings (1) の
--query オプションを利用すると取得できる。
まずは mbmon (1) のソースを改造し
nvidia-settings (1) を popen (3) で呼び出してみると
確にディスプレイカードの温度は取得できるのだが、
温度取得のたびに nvidia-settings (1) コマンドが起動されるので
システムリソースに負荷がかかり過ぎてしまう。
そこで nvidia-settings (1) のソースに付属している
サンプルプログラムを調べてみると、
割と簡単にディスプレイカードの温度を取得できる事が判ったので
mbmon (1) から直接ディスプレイカードの温度を取得する。
まずは、必要となる NVCtrl.h、NVCtrlLib.h、
libXNVCtrl.a の3ファイルを準備するために、
nvidia-settings をコンパイルする。
ports/x11/nvidia-settings で make (1) を実行すると、
ports/x11/nvidia-settings/work/nvidia-settings-1.0/src/libXNVCtrl
に上記3ファイルが作成される。
次に mbmon (1) を修正してプログラムをインストールする。
ports/sysutils/mbmon ディレクトリで
make configure まで実行した後で以下のパッチを適用し、
上記3ファイルを prts/sysutils/mbmon/work/xmbmon205にコピーして
make (1)すると
ディスプレイカードの温度を取得できる mbmon (1) ができる。
この mbmon (1) をデーモンとして起動すると
GKrellM (1) のセンサー表示部分の
温度表示の 3番目にディスプレイカードの温度が表示できる。
diff -rcN xmbmon205.orig/Makefile xmbmon205/Makefile
*** xmbmon205.orig/Makefile 2010-02-10 15:42:38.000000000 +0900
--- xmbmon205/Makefile 2010-02-10 15:45:16.000000000 +0900
***************
*** 25,30 ****
--- 25,34 ----
LIBS= -lm
LIBSX=$(LIBS) -L/usr/X11R6/lib -lXt -lSM -lICE -lX11
+ INCLUDES+= -I. -I/usr/X11R6/include
+ LIBS+= -L. -lXNVCtrl -L/usr/X11R6/lib -lXext -lX11
+ DEFS+= -DNVHACK
+
#CC=/compat/linux/usr/bin/gcc
CC=cc
CFLAGS+=$(INCLUDES) $(DEFS)
diff -rcN xmbmon205.orig/mbmon.c xmbmon205/mbmon.c
*** xmbmon205.orig/mbmon.c 2010-02-10 15:31:52.000000000 +0900
--- xmbmon205/mbmon.c 2010-02-10 15:17:02.000000000 +0900
***************
*** 36,41 ****
--- 36,47 ----
# include <sys/sysctl.h>
#endif
+ #ifdef NVHACK
+ #include <X11/Xlib.h>
+ #include "NVCtrl.h"
+ #include "NVCtrlLib.h"
+ #endif
+
#include "mbmon.h"
static const char *MyName = "mbmon";
***************
*** 510,515 ****
--- 516,536 ----
getTemp(&temp1, &temp2, &temp3);
+ #ifdef NVHACK
+ {
+
+ Display *dpy;
+ int temp;
+
+ if((dpy = XOpenDisplay(NULL))){
+ if(XNVCTRLQueryAttribute(dpy, 0, 0, NV_CTRL_GPU_CORE_TEMPERATURE, &temp))
+ temp3 = temp;
+ XCloseDisplay(dpy);
+ }
+
+ }
+ #endif
+
/* get fan speeds */
getFanSp(&rot1, &rot2, &rot3);
2010/01/14
MyJVN チェッカーサービス
JVN - Japan Vulnerability Notes - が
セキュリティ設定チェッカ、バージョンチェッカのサービスを実施している。
これらのサービスは Microsoft Windows 専用のサービスなのだが、
Windows の機能である USB メモリ自動実行機能の設定の確認や、
インストールされている Adobe Reader や Flash Player などの
バージョンをチェックしてくれる。
最近は GENO/Gumblar と呼ばれているマルウェアなど
悪意のあるソフトウェアによる Web サイトの改ざんなどが話題になっているが、
そういった悪意のソフトウェアによる被害を防ぐための一つの足がかりとして
こういったツールも積極的に利用すると良いだろう。
2009/10/16
php からのディスクアクセス
php だという時点で既にアレなんだが…php からディレクトリにある全ファイルの一覧を取得する処理のパフォーマンスを exec()、popen()、opendir() を利用した処理で比較してみる。
方法は単純にテスト用のディレクトリに 500 ファイルを用意して、 それぞれの関数を使用してファイル名一覧を取得する処理を 10 回実行した場合の処理速度を計測する。
| exec("ls -1") | 0.774762 |
| popen("ls -1") | 0.865914 |
| opendir() | 0.136642 |
外部 shell を実行しないので opendir() が早いだろうとは予想していたが、
これほど差が出るとは思わなかった。
パフォーマンスを優先する場合は勿論だが、
余計なプロセスを生成しないので opendir() が地球に優しい様だ。
1<? 2 3 $func = array("byexec", "bypopen", "byopendir"); 4 5 for($i=0; $i<3; $i++){ 6 $dist = array(); 7 $start[$i] = gett(); 8 for($j=0; $j<100; $j++) 9 $dist[$j] = $func[$i]("/tmp/test"); 10 $end[$i] = gett(); 11 12 printf("%-10s:%f\n", $func[$i], $end[$i] - $start[$i]); 13 } 14 15 function byexec($dir) 16 { 17 18 exec("ls -1 $dir", $output); 19 20 return($output); 21 22 } 23 24 function bypopen($dir) 25 { 26 27 if(($fp = popen("ls -1 $dir", "r"))){ 28 while($buf = fgets($fp)) 29 $output[] = trim($buf); 30 pclose($fp); 31 32 } 33 34 return($output); 35 36 } 37 38 function byopendir($dir) 39 { 40 41 if($dir = dir($dir)){ 42 while($file = $dir->read()) 43 $outout[] = trim($file); 44 $dir->close(); 45 } 46 47 } 48 49 function gett() 50 { 51 52 $t = gettimeofday(); 53 return((float)($t['sec'] + $t['usec'] / 1000000.0)); 54 55 } 56 57?>
ついでにシェルの glob なパターン指定を利用して 指定した文字列にマッチするファイル名の一覧取得を行う場合のテストもしてみた。
20090219000 から 20090219499 までの500個のファイルの中から、 200902192?? にマッチするファイル名の一覧取得で時間を計測してみる。
| exec("ls -1 200902192??") | 0.883770 |
| popen("ls -1 200902192??") | 0.902392 |
| opendir()→preg_match("/200902192../") | 0.188792 |
| glob("/200902192../") | 0.203928 |
exec()、popen() が遅いのは相変わらずだが、
preg_match()の呼出しが意外に早かったのが驚き。
正規表現のマッチ処理って基本的に相当時間がかかる筈なんだが…
glob() はファイルシステムに自分でアクセスしてる様なので早い。
複雑なパターン指定が必要ならpreg_match()の方が柔軟だが、
シェルに渡せる程度のパターン指定なら glob() を利用するのが
可読性やメンテナンス性と性能が両立できて良いのかも?
2009/08/20
Namazu
Namazu はオープンソースの全文検索システムで、
メイリングリストの検索やサイト内検索用のツールとして
様々な Web Site で利用されている。
2004年12月に公表されたその Namazu のセキュリティ・ホールである
「Namazu におけるクロスサイト・スクリプティングの脆弱性」の
対策を適用していないサイトが
非常に多く見受けられるそうだ。
もう4年半も前の脆弱性を対策せずに放置しているのは、
今の世の中では単なるサイト管理の怠慢では済まされない問題だと思う。
なぜなら、これらの脆弱性が悪用された場合に
ユーザのブラウザ上で任意のスクリプトが実行されてしまう事で、
最悪な場合フィッシング詐欺などの踏み台に使われてしまう可能性があるから。
管理者はもっと責任をもってサイトの管理を行うべきじゃないのか?
2009/07/03
ファイルのオーバーライド
通常のパイプ動作するフィルタコマンドでは
元ファイルを直接オーバライドできない。
例えば sort (1) の -o オプションの様に
元ファイルのオーバライド指定ができる
(この動作をスポンジ動作というらしい)もの以外での処理について。
一番簡単で誰でも思いつくのが一時ファイルを利用するやりかた。
$ command < foo.dat > foo.new $ mv foo.new foo.datこの方法だと command の実行中に割込が発生したりすると 一時ファイルが残ってしまい美しくない。
$ cat foo.dat | ( sleep 1; command > foo.dat)この方法だと sleep (1) の時間がうっとおしく、 データ量や command の速度などによって失敗する場合もありうる。
$ (rm foo.dat; command > foo.dat) < foo.dat若干判りづらいのだがこれで確実に成功する。
先行する rm (1) は必須である。 rm (1) がない場合は外側のシェルが '<' により O_RDONLY で open (2) するファイルと 内側のシェルが '>' により O_RDONLY|O_TRUNC で open (2) するファイルの inode が等しいので OS は同一ファイルと見做し、 command の標準入力は O_TRUC により truncate されたファイルとなってしまう。
対して rm (1) がある場合は外側のシェルが O_RDONLY で open (2) するファイルと 内側のシェルが O_RDONLY|O_TRUNC で open (2) するファイルの inode が異なるので O_TRUNC による truncate は影響を受けない。


