2007/01/31

[技術系]   Vistaのリモートデスクトップの改善点

at 02:43JST
Vistaから既存のWindowsにリモートデスクトップ接続すると、
「相手のバージョンが古いけど、
 それでも接続するぅ?」
みたいなワーニングが出る。

「どこが変わったんだ?」というのがわからなかったのだが、MSのKBを見たらあった。

リモート デスクトップ接続 6.0 アップデート クライアントが Microsoft ダウンロード センターのダウンロードの入手できます。
http://support.microsoft.com/kb/925876

機械翻訳版なので日本語になっておりません!

まあ、でも大意をつかんだところでは
・認証がより安全になりました
・リモートコンピュータのリソースの共有が、
 プラグ&プレイデバイスのより多くに拡張された(?)
・ゲートウェイ対応
 RDP over HTTPSっぽい?
・ローカルコンピュータのメンテナンスを可能にするスクリプティング?
・マルチディスプレイ対応
・フォントスムージング
ってあたりが改善点らしい。

ふむう。RDP over HTTPSは(間違いじゃなきゃ)魅力的かも。

2007/01/30

[技術系]   有害サイトに認定されました

at 04:02JST
子どもがいる家庭では、
「インターネットのどのサイトは見せて、
 どのサイトは見せたくない」
とかいうのはけっこう切実な問題で。

検閲云々というより生活時間の管理とかいう視点もあるので、やはり必要だ。ぼくは以前、自分でプロキシーを立ててコントロールしたりVNCサーバを入れたりとかしてたのだが、ふつうはそんなことはできない。

子どもを守る有害サイトフィルタリング | Yahoo!あんしんねっと
http://anshin.yahoo.co.jp/

は、無料でかなりの機能を提供してくれる。

ためしにインストールしてみた。

事前に、
・親用
・子ども用
など、パソコンを使う人の人数ぶんのYahoo!アカウントを取得しておくといい。

で、インストール&再起動すると、

20070130mage2.png


のように、使用時に簡単に利用者を切り替えられる。もちろん、切り替え時にはパスワードを尋ねられる。子どものパスワードだけ自動保存にしておくことも可能。よくできてる。

20070130mage3.png


閲覧制限は、ブラックリストまたはホワイトリスト形式で、さらに時間制限もかけられる(クライアントのみで動作するしくみだとタイマーをいじって逃げられてしまうのでASPというのはいい案だ。まあそこまでやるような子どもはパソコンのプロになれるだろうから発想を切り替えたほうがいいと思うが)。デフォルトでは「ブログ」もブロック対象になってる。

で、実際に使用してみたらもののみごとにぼくのサイトがブロックされた。

20070130mage4.png


…-_-#

そんな18禁なこと書いて…書きまくってるぞ。

しかもキーワードブロックとかではなく、思いっきり「あんしんサービス」の監視対象になってるらしい。ここらへん、理由とかの開示ってどうなってんだろ。fj系の人でそこらへんをしつこく追及し続けてる人がいたが。

ま、子どもに読んでもらいたいわけじゃないんですけどね。

[技術系]   サルベージ不可

at 02:04JST
ぶっとんだHDD、サルベージできなかった…。

ページング以外に、ドライバファイルやオンラインソフトのアーカイブにしていたのだが。

オンラインソフトは大学時代から集積していたものだから、けっこう貴重だったんだけどなあ。ちぇっ。Netscape全バージョンが…βも全部そろってたのに。32ビット版以降のリリースバージョンは残ってるから、まあいいか…。

教訓としては、
・ページング、テンポラリ用のドライブをほかのことに使わないほうがいい?
 (アクセス頻度が高い)
・なんか磁気テープかなんかのバックアップ体制を敷いたほうがいいのか…
ってことか。

後者はともかく前者は、うーん。もう空きポートがないんだよ。

2007/01/25

[技術系]   amazonのURLからASINを取得する正規表現

at 04:34JST
$urlにURLが入ってるとして、
my ( $asin ) = 
( $url =~ m#^.*(?:ASIN|product|dp)/([^/]+)(?:/.*)*$# );

の一行で、
http://www.amazon.co.jp/gp/product/B0006VNERE
http://www.amazon.co.jp/gp/product/B0006VNERE/
http://www.amazon.co.jp/gp/product/B0006VNERE/ref=pd_qpt_gw/249-9689538-8557126

のいずれの場合も取得できるな。

量指定子の使い方で悩んでてわかんなかった。これならJavaScriptでも動くか。

[技術系]   gooメモリ・リトリーバβ

at 02:09JST
gooメモリ・リトリーバβ - gooラボ
http://labs.goo.ne.jp/mr/

予言。
こいつぁ、日本版alexaを目指すつもりだね。

…まぁ、利用者が増えなきゃどうしようもないんだけど。

2007/01/23

[技術系]   iTMS/LinkShareのアフィリエイトサービス

at 17:59JST
「そういえば、iTunes Music Storeのアフィリエイトって、
 いまどういう状況になってるんだろ…」

と思って、むかし申請したきりになっていたアフィリエイトサービスをチェックしてみた。

…-"- 苦労の連続。

まず第一に、iTMSアフィリエイトを国内のどの業者が提供しているか忘れた。ニュース記事を検索して「LinkShare」だったことを思い出す。
http://www.linkshare.ne.jp/

そしてIDとパスワードを忘れた。過去のメールを検索してみてIDはわかったが、パスワードがハネられる。…思い出した。このサイト、むちゃくちゃ
「強いパスワード」
じゃないと受け付けてくれないんだ…。

そしてCAPTCHAに答える。なぜたかがアフィリエイトにCAPTCHAをつける! ぼくが使ってる銀行のオンラインバンキングだって採用してないのに!

なんとかサービス画面ログインに成功すると、
「おまえのパスワードは期限切れだから変更しろ」
と言われる。おおい! しかたないので変更する。

さらにさらに! パスワード変更すると
「変更後2時間はレポートの確認ができません」
と平然と告げられる。なんじゃそりゃああ!

で、ようやくiTMSの商品リンクビルダーの画面にたどりついたのだが、やっぱりココは
「個別の商品ごとにリンクビルダーを操作しないと
 アフィリエイト掲載ができない(少なくとも建前は)」
のね。…たかが楽曲ひとつ掲載するためにここまでの手順をイチイチ踏めって? -"-#

LinkShareは
「Webサービス(ベータ版)」
というかたちで製品情報のバッチ提供をしているので、それを利用できればいいのだが、驚くなかれ、現在このサービスに参加しているマーチャントは
ニッセン
ただ一社である。
http://www.linkshare.ne.jp/af_center/special/webservice/index.html#EC

…もう「死ね、死んでくれ」としか言いようがない。

まだ続きがある。

実際にどのようにリンクされるのかをチェックするために、他blogにあったiTMS楽曲リンクをクリックしてみると、突然PCがウンともスンとも言わなくなった。?? LinkShareが重いのか? しばらくするとあのヘンでキモいデザインのiTunesが立ち上がってきた…。

なんとiTMSのアフィリエイトリンクは、クリックするとiTunesを起動するのだ(途中でポップアンダーウィンドウが一瞬出るが)。ひえー。

iTunesアフィリエイトはブラウザクラッシャー? - LogJET
http://www.fsiki.com/jet/web/itunes_1.html

ブラウザクラッシャーだとまでは思わないが、ここまで使いづらいと何かに使おうという気にはちょっとならないな…。iPod使いな人にとってはどうなんだろう。

まあ、そういうことでぼくはAppleはキライですよ。フン。

[技術系]   アラン・ハボット氏

at 14:34JST
Apacheのアクセスログを眺めていたら、
「aranhabot」
という名の見慣れないロボットが来ていることに気づいた。

aranhabotがちょっと気になったので - cles::blog
http://blog.cles.jp/item/924

AmazonのXSLT取得用スパイダーかぁ^^; ヘンな名前。xsltのパス以下をログ記録しないようにしたので、もうお見かけすることはないであろう。ばいばい。

[技術系]   Seesaa BLOGの過去記事をまとめてMTエクスポートする

at 11:14JST
ミラーリングしてるだけじゃ、blogのバックアップをしたことにはならない。ので、Seesaa BLOGの過去記事をまとめてエクスポートするスクリプト。

Seesaaは一ヶ月分しか一度にエクスポートできない(まあ負荷を考えれば当然)ので、過去分を全部自動的に処理してくれるようにMechで書いてある。で、たまに動かすと(しつこく動かすと店員ににらまれる両刃の剣)。

スクリプトの最後に
保存用名称[TAB]Seesaaアカウント[TAB]Seesaaパスワード[TAB]blogID

と列記しておくと、列記したblogすべてについて作業してくれる。

某blogはgzip圧縮前に3MBちょいあった。

#!/usr/bin/perl 

# saveexport.pl

use strict;
use WWW::Mechanize;
# install Crypt::SSLeay on Win32(ActivePerl):
# > ppm install http://theoryx5.uwinnipeg.ca/ppms/Crypt-SSLeay.ppd
# or do on Fedora :
# % sudo yum install openssl-devel
# then install it via CPAN.

my $MAILTO = 'めるあど';
my $URL_INIT = 'http://blog.seesaa.jp/pages/my/home/index';

mkdir( '.saveexport', 0755 )
or die;
END {
rmdir( '.saveexport' );
}

my $startTime = scalar( localtime() );

my @done;
while ( my $line = <DATA> ) {
$line =~ tr/\r\n//d;
my( $ident, $mailaddr, $password, $blogid ) =
split( /\t/, $line );

eval {
getEx( $ident, $mailaddr, $password, $blogid );
};
if ( $@ ) {
push( @done, "$ident...ERROR!$@" );
} else {
push( @done, $ident );
}
}

my $endTime = scalar( localtime() );

my $mail = <<"_EOF_";
SAVEEXPORT RESULT REPORT
========================

start time: $startTime
end time: $endTime

- Processed sites -
@{[ do {
join( "\n", @done );
} ]}
_EOF_

open( MAIL, "|/bin/mail -s 'SAVEEXPORT RESULT REPORT' $MAILTO" );
print MAIL $mail;
close( MAIL );

exit;

sub getEx {
my( $ident, $mailaddr, $password, $blogid ) = @_;

my $mech = WWW::Mechanize->new( autocheck => 1 );
$mech->agent_alias( 'Windows IE 6' );

# 初期画面
$mech->get( $URL_INIT );

# ログイン
$mech->submit_form(
fields =>
{
'member__email' => $mailaddr,
'member__password' => $password,
}
);
while (
$mech->response()->header('refresh') =~ /url=([^\s;]+)/i
) {
$mech->get( $1 );
}

# 「MTインポート」
$mech->follow_link(
url =>
"/pages/my/blog/home/?blog_id=$blogid" .
"&goto=/pages/my/blog/tools/mt/input"
);

# 「取得範囲」取得
my $selection = $mech->content();
$selection =~
s#^.*<form action="export"[^>]+>(.*)</form>.*$#$1#s;
$selection =~
s#^.*<select name="year_month">(.*)</select>.*#$1#s;
my @options =
sort
grep !/^$/,
( $selection =~ /value="(.*)"/g );

my @t = localtime();
my $filename =
sprintf(
"ex.${ident}_%04d%02d%02d-%02d%02d%02d",
$t[5]+1900, $t[4]+1, $t[3], $t[2], $t[1], $t[0]
);

open( MT, ">$filename" );
binmode MT;
# MTエクスポートフォーム
my $length;
foreach my $option ( @options ) {
$mech->form_number( 3 );
$mech->set_fields(
'year_month' => $option,
'comment' => 1,
'tb' => 1,
'encode' => 'sjis',
);
$mech->click();

$length += length( $mech->content() );
print MT $mech->content();
$mech->back();
}
close( MT );

if ( $length < 2 ) {
unlink $filename;
die "nocontents";
} else {
system( "gzip $filename" );
}

return;
}

__DATA__
memo.hirosiki.jp めるあど ぱすわーど ぶろぐid

2007/01/22

[技術系]   pinghttp

at 18:41JST
8年くらい前にでっち上げたスクリプトを引っ張り出してきて、簡単なサーバモニターを設置した。

その中で他サイトのWebサーバに100kbのファイルを置き、それの所要取得時間を計測する…というのがあるのだが。@niftyにファイルを置いたら結果が異常に遅い。自宅サーバと通信させたほうがぜんぜん速いのだ。

「@niftyはダメだなあ…」

と思ったのだが、ちょっ待てよ!(キムタク) そんなわけねー! だって自分ちの接続回線も@niftyじゃねーか!

スクリプトの該当部分は、
#!/bin/sh 
URL=$1
if [ -z "$URL" ];
then
echo "Usage: $0 url_somewhere" 1>&2
exit 1
fi
WGET='wget --output-document=/dev/null --timeout=60'

RESULT=`$WGET $URL 2>&1 |grep ' saved ' |tail -1 |cut -d' ' -f 2 |tr -d '('`
if [ ! `echo "$RESULT" | grep '^[0-9.][0-9.]*$' 2>/dev/null` ] ;
then
RESULT=0
fi
echo $RESULT
# in KB/sec
となっていて、wgetの出力を利用している。

…調べてみると、wgetは回線が8年くらい前のようにKB/secで計れるときは
 (234 KB/s) - `/dev/null' saved [102400/102400]
となるのだが、昨今のように高速大容量な環境が当たり前だと
 (1.36 MB/s) - `/dev/null' saved [102400/102400]
と「MB」単位になるのだった。道理でな…_| ̄|O

perlで書けばよかったんだけど、当時はこういうスクリプトは全部shで組んでいたし、perlの標準ライブラリは秒単位の計測しかできなかったのだ。

で、書き直した。
#!/usr/bin/perl 
use LWP::UserAgent;
use Time::HiRes;

my $url = shift @ARGV;

my $sec = Time::HiRes::time;
my $ua = LWP::UserAgent->new(
agent => 'Mozilla/4.0 (compatible; MSIE 6.0)',
timeout => 60,
# max_size => 32 * 1024,
);
my $response = $ua->get( $url );
if ( $response->is_success ) {
$sec = ( Time::HiRes::time ) - $sec;
} else {
$sec = 0;
}

my $kbSec = length( $response->content ) / 1024 / $sec;
print $kbSec . "\n";


どう考えてもこっちのほうが負荷は軽そうだ。

10年前にさかのぼると、ぼくはCMSすらBourneShellオンリーで書いていたんだが。ある意味富豪プログラミング。

[技術系]   apacheで特定リクエストをアクセスログに記録しない

at 11:11JST
忘れ。めもめも。

- CustomLog の env= 節
 http://httpd.apache.org/docs/1.3/mod/mod_log_config.html#customlog
- SetEnvIf
 http://httpd.apache.org/docs/1.3/mod/mod_setenvif.html#setenvif
- 2.x
 http://httpd.apache.org/docs/2.0/ja/logs.html#accesslog

SetEnvIf Request_URI "^/パス" dontlog
CustomLog logs/access_log usertrack env=!dontlog


みたいな。

tools:
/files/
/patrate/
/feed2list/
a:
/xslt/

[技術系]   続々・pavukでミラー

at 03:17JST
http://memo.hirosiki.jp/article/30973975.html

ということで、
「Seesaa BLOGでホストしているblogを
 pavukで定時ミラーするperlスクリプト」
をでっち上げてみた。ぐちゃぐちゃすくりぷと。

・__DATA__以降に、
 
ミラー対象ホスト名[TAB]画像アップ先を含む対象ホスト名の列記

 を羅列する
・メンテナンス検知のために、対象blogのトップページに
 
<!-- SANE:ホスト名 -->

 という文字列を挿入しておく(超アドホック)

感じ。もちろんUNIXじゃないと動きませんよ。/bin/rmとか堂々と使ってますんで。

使い物になるかどうかはともかく、バックアップしておけるのはずいぶんマシだ…。

#!/usr/bin/perl 

# smirror.pl

use FileHandle;

my $MAILTO = 'めーるあどれす';

my $TMP_DIR = '/tmp';
my $PAVUK =
join( ' ',
(
"pavuk",
"-mode mirror",
"-index_name index.html",
"-fnrules F '*' '/%d/%n'",
"-logfile pavuk.log",
"-quiet",
"-noRobots"
)
);

my $startTime = scalar( localtime() );

my @done;
while ( <DATA> ) {
s/^\s+//;
s/\s+$//;
next if ( /^$/ );
my $line = $_;
my( $target, $asite ) = split( /\s/, $line );

if ( ! -d $target ) {
mkdir $target, 0755
or die "Cannot mkdir to store site";
}
my $lockDir = "$target/.smirror";
mkdir $lockDir, 0755
or die "Another smirror is working";
my $tmpMirrorDir = "$TMP_DIR/$target.$$";
mkdir $tmpMirrorDir, 0755
or die "Cannot mkdir for mirroring";
eval {
system(
"cd $tmpMirrorDir &&" .
"$PAVUK -asite $asite http://$target"
);
};
# SANE?
# <!-- SANE:memo.hirosiki.jp -->
my $tophtml = Slurp( "$tmpMirrorDir/index.html" );
if ( $tophtml =~ /-- SANE:$target --/ ) {
system( "/bin/mv -f $tmpMirrorDir/* $target" );
push( @done, $target );
} else {
push( @done, "$target ... INSANE!!" );
}
system( "/bin/rm -rf $tmpMirrorDir" );
rmdir $lockDir;
}

my $endTime = scalar( localtime() );

my $mail = <<"_EOF_";
SMIRROR WITH PAVUK RESULT REPORT
================================

start time: $startTime
end time: $endTime

- Processed sites -
@{[ do {
join( "\n", @done );
} ]}
_EOF_

open( MAIL, "|/bin/mail -s 'SMIRROR RESULT REPORT' $MAILTO" );
print MAIL $mail;
close( MAIL );

sub Slurp {
my $fn = shift @_;
my $cnt = do {
local $/;
my $fh = FileHandle->new( $fn, 'r' );
local $_ = <$fh>;
$_;
};
return $cnt;
}

__DATA__
memo.hirosiki.jp memo.hirosiki.jp,hirosiki.up.seesaa.net

[技術系]   ヒアドキュメント中で任意の処理結果を挿入する

at 02:55JST
perlのヒアドキュメントで。なんかいっつも忘れるのでメモ。
こんな感じ。

my $mail = <<"_EOF_"; 
SMIRROR WITH PAVUK RESULT REPORT
================================

start time: $startTime
end time: $endTime

- Processed sites -
@{[ do {
join( "\n", @done );
} ]}
_EOF_


do { } の中で最後に評価した値が挿入される。便利。…これを便利と言い切ってやまないのはぼくくらい(悪い意味で)だと思うが。

2007/01/21

[技術系]   webalizer

at 04:51JST
で、何がやりたかったかというと、webalizerをインストールしたかったのよ。

$ yum install webalizer

とかやると、どうやらapacheとかとの依存を処理しないとインストールできないらしい…(当然apacheも素でmakeしてるのでダメ)。うおー、だからパッケージ管理システムはキライなんだよ! つーか、NTT PCがFedoraなんて提供してなければオレは死んでもつかわねーぜ!

…とか言ってる場合でもないので、適当にmakeする。jpeg-6bとGDも入ってなかったのでついでに。
% wget http://www.ijg.org/files/jpegsrc.v6b.tar.gz 
% tar xvfz jpegsrc.v6b.tar.gz
% cd jpeg-6b
% ./configure --enable-shared --enable-static
% make
% sudo make install

% wget http://www.boutell.com/gd/http/gd-2.0.33.tar.gz
% tar xvfz gd-2.0.33.tar.gz
% cd gd-2.0.33
% ./configure
% make
% sudo make install

% wget ftp://ftp.mrunix.net/pub/webalizer/webalizer-2.01-10-src.tgz
% tar xvfz webalizer-2.01-10-src.tgz
% cd webalizer-2.01-10
% ./configure --enable-dns --with-dblib=/usr/lib --with-language=japanese
% make
% sudo install


なぜか --with-dblib=/usr/lib を指定しないとdb 1.85コンパチのヘッダを見に行ってくれないので、勘違いしてdb 1.85をインストールしようと四苦八苦してしまった。ぷんすか。

ていうかこれ、単にIP→ホスト名の巨大ハッシュを一時展開するのにBerkeleyDB使ってるだけなんだよね。だったらバージョンなんて何でもええやん! ぷんぷん! こんなことにすぐdb使うのは誰だ! …ってぼくもよくやるので人のこと言えない。

百年くらい放置しておいた作業なので、ちょっとホッ。

[技術系]   BerkeleyDB 1.85

at 04:43JST
BerkeleyDBの1系が入ってなかった。

% wget http://download.oracle.com/berkeley-db/db.1.85.tar.gz
% tar xvfz db.1.85.tar.gz
% cd db.1.85/PORT/linux
% make

すればいいはずなのだが、
cc -c -D__DBINTERFACE_PRIVATE -O -I. -Iinclude -I../../hash ../../hash/hash.c
In file included from ../../hash/hash.c:55:
../../hash/hash.h:106: error: field `__errno_location' declared as a function
  :

云々と出てmakeできない。

Fedoraなのでyumすればいいか…とも思ったが、パッケージが提供されてない…。これだから男は黙ってSlackwareなんだよ!

と言っているわけにもいかないので、カンでこんなふうにしてみた。
*** db.1.85/hash/hash.h.org     Sun Jan 21 03:52:10 2007
--- db.1.85/hash/hash.h Sun Jan 21 03:53:23 2007
*************** typedef struct htab { /* Memory reside
*** 103,109 ****
BUFHEAD *cpage; /* Current page */
int cbucket; /* Current bucket */
int cndx; /* Index of next item on cpage */
! int errno; /* Error Number -- for DBM
* compatability */
int new_file; /* Indicates if fd is backing store
* or no */
--- 103,109 ----
BUFHEAD *cpage; /* Current page */
int cbucket; /* Current bucket */
int cndx; /* Index of next item on cpage */
! int err_no; /* Error Number -- for DBM
* compatability */
int new_file; /* Indicates if fd is backing store
* or no */

*** db.1.85/hash/hash.c.org Sun Jan 21 04:36:01 2007
--- db.1.85/hash/hash.c Sun Jan 21 03:55:00 2007
*************** flush_meta(hashp)
*** 505,511 ****
else
if (wsize != sizeof(HASHHDR)) {
errno = EFTYPE;
! hashp->errno = errno;
return (-1);
}
for (i = 0; i < NCACHED; i++)
--- 505,511 ----
else
if (wsize != sizeof(HASHHDR)) {
errno = EFTYPE;
! hashp->err_no = errno;
return (-1);
}
for (i = 0; i < NCACHED; i++)
*************** hash_get(dbp, key, data, flag)
*** 536,542 ****

hashp = (HTAB *)dbp->internal;
if (flag) {
! hashp->errno = errno = EINVAL;
return (ERROR);
}
return (hash_access(hashp, HASH_GET, (DBT *)key, data));
--- 536,542 ----

hashp = (HTAB *)dbp->internal;
if (flag) {
! hashp->err_no = errno = EINVAL;
return (ERROR);
}
return (hash_access(hashp, HASH_GET, (DBT *)key, data));
*************** hash_put(dbp, key, data, flag)
*** 553,563 ****

hashp = (HTAB *)dbp->internal;
if (flag && flag != R_NOOVERWRITE) {
! hashp->errno = errno = EINVAL;
return (ERROR);
}
if ((hashp->flags & O_ACCMODE) == O_RDONLY) {
! hashp->errno = errno = EPERM;
return (ERROR);
}
return (hash_access(hashp, flag == R_NOOVERWRITE ?
--- 553,563 ----

hashp = (HTAB *)dbp->internal;
if (flag && flag != R_NOOVERWRITE) {
! hashp->err_no = errno = EINVAL;
return (ERROR);
}
if ((hashp->flags & O_ACCMODE) == O_RDONLY) {
! hashp->err_no = errno = EPERM;
return (ERROR);
}
return (hash_access(hashp, flag == R_NOOVERWRITE ?
*************** hash_delete(dbp, key, flag)
*** 574,584 ****

hashp = (HTAB *)dbp->internal;
if (flag && flag != R_CURSOR) {
! hashp->errno = errno = EINVAL;
return (ERROR);
}
if ((hashp->flags & O_ACCMODE) == O_RDONLY) {
! hashp->errno = errno = EPERM;
return (ERROR);
}
return (hash_access(hashp, HASH_DELETE, (DBT *)key, NULL));
--- 574,584 ----

hashp = (HTAB *)dbp->internal;
if (flag && flag != R_CURSOR) {
! hashp->err_no = errno = EINVAL;
return (ERROR);
}
if ((hashp->flags & O_ACCMODE) == O_RDONLY) {
! hashp->err_no = errno = EPERM;
return (ERROR);
}
return (hash_access(hashp, HASH_DELETE, (DBT *)key, NULL));
*************** hash_seq(dbp, key, data, flag)
*** 729,735 ****

hashp = (HTAB *)dbp->internal;
if (flag && flag != R_FIRST && flag != R_NEXT) {
! hashp->errno = errno = EINVAL;
return (ERROR);
}
#ifdef HASH_STATISTICS
--- 729,735 ----

hashp = (HTAB *)dbp->internal;
if (flag && flag != R_FIRST && flag != R_NEXT) {
! hashp->err_no = errno = EINVAL;
return (ERROR);
}
#ifdef HASH_STATISTICS

*** db.1.85/hash/ndbm.c.org Sun Jan 21 04:36:14 2007
--- db.1.85/hash/ndbm.c Sun Jan 21 03:55:57 2007
*************** dbm_error(db)
*** 180,186 ****
HTAB *hp;

hp = (HTAB *)db->internal;
! return (hp->errno);
}

extern int
--- 180,186 ----
HTAB *hp;

hp = (HTAB *)db->internal;
! return (hp->err_no);
}

extern int
*************** dbm_clearerr(db)
*** 190,196 ****
HTAB *hp;

hp = (HTAB *)db->internal;
! hp->errno = 0;
return (0);
}

--- 190,196 ----
HTAB *hp;

hp = (HTAB *)db->internal;
! hp->err_no = 0;
return (0);
}

なぜかmakeできる…。

あとは
% sudo cp libdb.a /usr/local/lib/
% sudo mkdir /usr/local/include/db185
% sudo cp include/* /usr/local/include/db185
% sudo mkdir /usr/local/include/db185/sys
% sudo cp sys/* /usr/local/include/db185/sys
いいんかいな、これで…。

2007/01/20

[技術系]   USBスピーカー

at 04:12JST
http://memo.hirosiki.jp/article/31535454.html

で、書いた「音が出なくなったPC」。結局、作業にならないので音源を別途買うことにした。

しかしサウンドカードは今どきハイエンドの高いものしか見かけない。USB音源ユニットなら安いが…どっちにしても外にアクティブスピーカーをつけなきゃいけないから電源も必要になる。

と悩んでハタと思い出した。最近は「USBスピーカー」というものもあったんだ。

 SANWA SUPPLY MM-SPU2SV USBスピーカー シルバー: エレクトロニクスSANWA SUPPLY
MM-SPU2SV USBスピーカー


早い話、USBのサウンドユニットとスピーカーを一体化させたものだが、これならUSBポートに刺すだけでOK。スピーカーのアンプ用電源を取る必要もないからエコロジカルでお金もかからない。おまけに店頭で念入りに探したら1,000円台だった。ほっ。

このスピーカーはWindows標準ドライバで動作する素直なやつ。添付ソフトで疑似5.1ch化が可能だ。…やってみたけど効果はぜんぜんわからんかった。どうでもいいや。

USBサウンドユニットはWindows 98くらいのときに試して、
「なんかCPU負荷が気になるな…」
ということで使わなくなっていた。音質がいいとか言われてもわかんないし。

最近のPCでは、そもそもオンボードの音源もそもそも半分ソフトウェア処理みたいなもんだし、そんなに負荷は気にならないようだ。それに、しつこいようだがスピーカーの電源を別に用意しなくていいのがうれしい。昔のP6とか
「スピーカーなんぞマイコンに内蔵されてるのが当然」
だった機械に慣れ親しんでいると、どうもね…。自作では必ず3.5インチベイにスピーカー内蔵させたりしてたし。

まあ、音源が壊れるなんて経験は滅多にないことだけれど、今後も同じ目に遭ったらUSBスピーカーで解決しよう。

[技術系]   あっ、これ、FlipBookだったのか!

at 02:53JST
asahi.com:購読無料の電子書籍サイト 広告が収入源 SB関連会社 - ビジネス
http://www.asahi.com/business/update/0119/158.html

え?
http://flib.jp/
がソフトバンク関連? と、この記事を読んではじめて気がついた。これだから一般紙もあなどれない。

そーだよ、これFlipBook使ったサービスなんだよ。まったく気づかなかった。

むかし、
「FlipBookってどーよ?」
という話があったとき、ぼくはソッコーで
「ダメでしょ」
と結論を出したのだが…。

理由は、
「FlipBookは著作権保護が厳しすぎる」
だ。

試しに、Flib.jpでコミック・ガンボあたりを開いて、そのあとALT-TABを押してほかのウィンドウをアクティブにしてみる。すると
「著作権保護のため表示がオフになります」
というような警告が出てくる。

さらにさらに。
手近にあるスクリーンキャプチャソフトを立ち上げてほしい。
「キャプチャソフトを感知しました」
というようなエラーが出て表示が止まるはずだ。

すごいのは、あらゆるキャプチャソフトのブラックリストをもっていて、Paintshopみたいな画像操作ソフトはもちろん、ぼくが以前さわったときはVNC Serverまでブロックする…というところだ。そこまでリストアップするか。ただ、保護レベルは提供者側でいじれるので、Flib.jpではVNCは特に対処していないようだ。

こんなの全然消費者には受け入れられないと思っていたんだけど、いろいろからめ手でビジネスにしてくるんだな。すごいよなあ、バンクは…。

2007/01/19

[技術系]   DVDラベル印刷

at 15:18JST
きのう、ショップでDVDドライブをぼーっと見ていたとき。
「LabelFlash」対応ドライブがけっこう出回っているのに気づいた。

LabelFlashはドライブのレーザーを使ってDVDの表面ラベルに疑似印刷する機能だ。モノクロとはいえプリンタが不要なのでけっこう魅力的。しかし、
「専用のDVDメディアじゃないと印刷できない」
という弱点があって…。ぼくはマイナーなメディアにはかつてのPDで懲りたので手を出さずに帰ってきた。

さっき、類似技術の「LightScribe」を搭載した製品のニュースを見かけた。そういえばなぜか二種類あるんだよな…とちょっと調べてみた。

・LightScribe

推進主体:アジア系メーカー+三菱化学メディア
印刷部分:メディア表面
メディア:専用メディア必須

・LabelFlash

推進主体:ヤマハ+富士写真フイルム
印刷部分:ポリカーボネート層の下
メディア:専用メディア、または通常DVD-Rの記録面


なんと!
LabelFlashはDVD-Rの記録面にも焼けるのか!
ただし、ドライブとライターソフトの組み合わせによっては対応しないようだが。へー。

なかなかおもしろいね。買うならLabelFlashだな。

[技術系]   JScreenFix:なんか怪しい気が…

at 04:54JST
LCDのデッドピクセル・スタックピクセルの生き返らせ方
- World Wide Walker
http://yoosee.net/d/archives/2007/01/09/002.html

で話題になってた「液晶のドット欠けを直すツール」。
どうも個人的に「マユツバ」な気がする…。

常時点灯・消灯ともに、該当画素部分をデコピンしてやったりすると直ることがあるというのはよく知られている。しかし、
JScreenFix と言うソフトを使い、スタックしたピクセルに表示部分を重ねてしばらく点滅を続けさせる。ハイコントラストのRGBピクセルを次々に変化させて表示させることで、ピクセルを活性化させるという方法のようだ

というのは納得いかない。「活性化」ってなんだ…って、World Wide Walkerの人はあくまで紹介しているだけなので責めてもしょうがないけれど。

該当ピクセル部分を酷使することでその部分のトランジスタが直る…って、そんなことあるかなあ。それって逆に言うと、壊れることもあるってことだよね。…?

JScreenFix
http://www.jscreenfix.com/

たまたま、中古で6,000円で買った液晶に画素欠け(ここで言うスタックピクセル)があったので試してみたけどダメだった。

…納得できない理由のひとつは、このサイトが
「JScreenFixを使うにはFirefoxをゲットしよう」
って誘導してることなんだが…誘導している先がGoogleの報償が入る例のアレなんだよね。ぼくはアフィリエイトは否定しないけれど、この場合はどうもうさんくさい…。

やってることは単純なので、別にJavaだのなんだの使わなくてもいいはず。むしろGIFアニメーションでやったほうが確実なんじゃないかという気がする。

英語圏での評判を知りたくてちょっとだけググってみたが、download.comとかしか見あたらなかった。去年の8月から1,600回くらいダウンロードされている。…そんなに霊験あらたかなものならもっとメジャーでもいい気もするが。

ああ、人を疑うことしか知らない自分が悲しいぜ。

[技術系]   DeepBurner

at 02:01JST
DVDドライブをDVD±RW DLスーパーマルチのヤツに取り替えた。

試しに4GBのデータを

DeepBurner
http://www.deepburner.com/

で焼いてみてびっくり。45分もかかった。えー。45分もかかるんじゃ、もう金輪際焼く気がしないぞ!

今までのドライブはDVD+Rだったが…それは関係ないよなあ。と思いつつ、添付されていたライターソフトで焼いてみた。…今度は7分強。えらい違いだ。

DeepBurnerのバージョンをチェックしてみたが、1.8xxxで最新版だ。別に古いからじゃないな。

まあ、フリーソフトに過度な要求をしてはいかんよね。DeepBurnerだってPro版があるわけだし。しかし、UIがシンプルなのが気に入ってたのにぃ。がまんしてバンドルソフトを使おう。

2007/01/16

[技術系]   音が出ない

at 23:55JST
余ってるパーツで、また一台パソコンを組んだ。座り作業用のターミナルにしようかと。

すると音が出ない。あれ?

ドライバはきちんと入ってるし、挿入ジャックが間違ってるわけでもない。んー…。

思い出した。そういえば、このマザーボード、雑音が入るようになったから使うのやめたんじゃなかったっけ…。

どうしようかな。1,000円くらいでオーディオボードを探してくるか。それとも腐敗が進むのをきらって使うのをやめるべきか。
さらに過去の記事
2009/04 (1)   2008/12 (3)   2008/11 (9)   2008/10 (10)   2008/09 (20)   2008/08 (2)   2008/07 (23)   2008/06 (16)   2008/05 (22)   2008/04 (11)   2008/03 (21)   2008/02 (20)   2008/01 (21)   2007/12 (32)   2007/11 (37)   2007/10 (46)   2007/09 (63)   2007/08 (33)   2007/07 (41)   2007/06 (81)   2007/05 (173)   2007/04 (168)   2007/03 (113)   2007/02 (123)   2007/01 (92)   2006/12 (111)   2006/11 (185)   2006/10 (20)  

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。