BB4W のプラグインの作り方。基本的なこと (というか私が詰まったところ) のみ。大体はソースコード読めば解るでしょう。ちなみに SDK だけを見ても解り難いです。本体の方も参照しましょう。
プラグインは beginPlugin()、endPlugin()、pluginInfo() を実装しなければなりません。beginPlugin() は本体がプラグインをロードする際に呼び出し、endPlugin() はアンロード時に呼び出されます。今のところ pluginInfo() を実装しなくても動くようになっていますが、それは少々気持ち悪い。
Bro@m や reconfig、restart などのメッセージに反応したい場合、そのメッセージが起きたら自分に通知するよう本体に登録しなければなりません。登録方法は、
int messages[] = {BB_RECONFIGURE, BB_BROADCAST, 0};
SeneMessage( GetBBWnd(), BB_REGISTERMESSAGE,
(WPARAM)hwnd_of_this_plugin, (LPARAM)messages );のようにします。lParam には通知して欲しいメッセージの配列を渡します。末尾は 0 でなければなりません。
通知の解除は同様にして BB_UNREGISTERMESSAGE を送るだけです。解除せずに放置すると多分すごいことになります。
スタイルの情報とか、.rc の読み書きとかは試してないので知りません。
たのしー。こんな感覚は久しぶりだ。コーディングしててすごく楽しい。
今まで「何となく難しそう」という先入観から BB4W のソースコードを見ませんでしたが、実際に中身を見てみると思ったより単純です。C++ ですが、実際は C + α程度。Windows 関連のプログラミングの基礎さえ押さえてれば難なく読めます。私はその基礎がないですけど。
めも。
cygwin 上の gcc で某かコンパイルすると cygwin1.dll が必要になる。cygwin1.dll を必要としないようなバイナリを吐かせるにはコンパイル時に -mno-cygwin オプションを付ける。別にリンク時に指定するだけでも構わないだろうけど、-mno-cygwin の有無で使える関数が変わるのでコンパイル時にも付けておいた方がいいような気がする。云うまでもないけど、cygwin の API 使ってると -mno-cygwin 付きでリンクできる訳がない。
あと、これではコンソールアプリケーションのままなので -mwindows も付けておく。
ld のオプションの --subsystem WHICH で、プログラムがどの subsystem で実行されるかを指定できる。subsystem の値は native、console、windows、posix のどれか。
C 言語で、
#define arraysizeof(a) (sizeof(a) / sizeof((a)[0])) int an_array[4472];
こういう定義があった場合、
int another_array[arraysizeof(an_array)];
という風に配列を定義しても怒られなかった。…… sizeof は定数式だったか。こんなことをして何が楽しいんだと言われると困るが。
See [2004-02-27T14:56] for newer version.
BBKontroller is like BBController, but it allows you to send bro@ms.
という訳でコマンドラインから bro@m を送るツールが完成。プラグイン作成のためのドキュメントがなかったので少々面倒でしたが、ソースコード漁ればすごく単純なものです。この単純さ故にドキュメントを書く気が起こらないんじゃないだろうか、と思ったり思わなかったり。
うおおおおおおおっしゃああああああああああああああああ!
プロセス間を跨いで任意の大きさのデータを送るには WM_COPYDATA を使えばいい。実際に任意の文字列の送受信ができた。
さて、となるとどうやって bro@m を送るかだ。WM_COPYDATA のような特殊な message でない限り、message の追加情報として渡せるデータは WPARAM と LPARAM に限られる。また、コア (Blackbox.exe) は弄るべきではない。これらのことを考えると、
他プロセス --(WM_COPYDATA)-> 仲介プラグイン --(bro@m)--> コア
のように仲介となるプラグインを置かなければ駄目だろう。
たかだか bro@m をコマンドラインから送るためにプラグイン作らなきゃ駄目ですか。何だかなー……
取り敢えず文字列へのポインタを与えたときはどうなっているか調べてみたけど、
$ ./message_receiver & [1] 4472 $ ./message_sender nenaiko dareda message_sender: 003D2499 `nenaiko' message_sender: 003D24A2 `dareda' $ message_receiver: entering loop... message_receiver: 0000006E message_receiver: 00000064 message_receiver: exit
そもそもプロセスを跨いでポインタを渡すのはアレなのか? アドレス空間は同じじゃないだろうし。
Broambox が文字列を渡せるのは、あれはプラグインなので Blackbox.exe のプロセスと同じ空間に存在するからか? となると別のプロセスから bro@m を送信するのは原理的に不可能ということになる。
プリミティブな値 (int とか char とか) なら、message queue に送られようが直接 window procedure に送られようが、送った message はその内容がコピーされるので、何も考えなくて済む。その証拠に、
#include <stdlib.h>
#include <windows.h>
#include "BBApi.h"
int main(void)
{
HWND hBBWnd;
hBBWnd = FindWindow(NULL, "Blackbox");
if (hBBWnd == NULL) exit(EXIT_FAILURE);
if (!IsWindow(hBBWnd)) exit(EXIT_FAILURE);
/* メインメニューを表示させる */
SendMessage(hBBWnd, BB_MENU, 0, 0);
return 0;
}これならちゃんと動く。
問題は文字列などはどう渡せと。
確認してみたら本当にゴミが届いてた。エコーだけがおかしいのならば window_procedure には期待している文字列が届いているはずだから、それに応じて処理を (例えば "bang" を受信すると終了するように) 変えてみたところ、無反応。
というか、そもそも window_procedure の処理が終わるまで待つはずの SendMessage を使っているのに何で message_sender はすぐに終了するんだ?
と思って PostMessage を使うように書き直すと今度はクラッシュしない。あーれーれー。
ははははは……そりゃ駄目だわ。昨日書いた PostMessage と SendMessage の違いを見れば一発だ。PostMessage だと message queue に message を放り込んだらさっさと終了してしまう。message_sender は message のパラメーターに av[i] ──言い換えれば auto な変数へのポインタ──を渡しているので、message_sender が終了すると無効なものになってしまう。で、message_receiver がそれを参照しようとしたときには既に無効なものなので、クラッシュする、という訳だ。
つまり、この場合は SendMessage を使わないと駄目 (別に PostMessage でも動的にメモリを確保しておいてそれを渡し、開放の責任を receiver 側に押し付けてもいいがそれはアレだし、それに単に malloc 使うだけでは駄目だろう。ライブラリ側の malloc の実装がどうなっているかは解らないし)。
で、SendMessage を使うように書き直すとちゃんと動きました。
しかし疑問なのが、message_sender から message が送られてきても、リアルタイムでエコーしないことです。(上記のコードとは違いますが) 例えば、
$ ./message_receiver & [1] 2376 $ ./message_sender love bang bang message_sender: send message `love' message_receiver: receive message `love' message_sender: send message `bang' message_receiver: receive message `bang' message_sender: send message `bang' message_receiver: receive message `bang'
のように即座にエコーされると思ったら、実際には、
$ ./message_receiver & [1] 2376 $ ./message_sender love bang bang message_sender: send message `love' message_sender: send message `bang' message_sender: send message `bang' $ message_receiver: receive message `@' message_receiver: receive message ' message_receiver: receive message `' echo [1]+ Done ./message_receiver $
のようにエコーが遅れます。正確には message_receiver を終了させたときにまとめてエコーされます。しかもゴミが表示されてるし……
Messages and Message Queues を読んでみた。
Windows ベースのアプリケーションはイベントドリブンで、送ったり受け取ったりするイベントのことを message という。システムは何らかの入力を message という形で window procedure に渡す。message はシステムやアプリケーションが生成する。システムはユーザーが文字を入力したとか、マウスが動いたとか、スクロールバーみたいなコントロールがクリックされたとか、そういう入力があるとそれを message にして送る。アプリケーションは他のアプリケーションなどと通信できるように独自の message を生成することができる。……らしい。
まずは独自のメッセージの送受信ができるかどうかから始めるべきだ。という訳で書いたのが以下のコード。いい加減なのはご愛嬌。
$cat message_receiver.c
/* Receive message and just echo it */
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include "message_test.h"
#define PROG_NAME "message_receiver"
void die(const char* message)
{
printf("%s: %s\n", PROG_NAME, message);
exit(EXIT_FAILURE);
}
LRESULT CALLBACK window_procedure(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
printf("%s: %d(0x%x)\n", PROG_NAME, msg, msg);
if (msg == WM_DESTROY) {
PostQuitMessage(EXIT_SUCCESS);
} else if (msg == MESSAGE_ECHO) {
printf( "%s: MESSAGE_ECHO: `%s'\n",
PROG_NAME, (const char*)lp );
}
return DefWindowProc(hwnd, msg, wp, lp);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR lpCmdLine, int nCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = window_procedure;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = MESSAGE_RECERIVER_CLASSNAME;
if (!RegisterClass(&wndclass)) die("RegisterClass failed");
hwnd = CreateWindow(
MESSAGE_RECERIVER_CLASSNAME,
"message_receiver/windowname",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
128, 128, 256, 256,
NULL, NULL,
hInstance,
NULL
);
if (hwnd == NULL) die("CreateWindow failed");
while (TRUE) {
if (GetMessage(&msg, NULL, 0, 0) == 0)
break;
DispatchMessage(&msg);
}
return msg.wParam;
}
/* __END__ */
$ cat message_sender.c
/* Send message */
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include "message_test.h"
#define PROG_NAME "message_sender"
void die(const char* message)
{
if (message != NULL) {
printf("%s: %s\n", PROG_NAME, message);
} else {
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER
| FORMAT_MESSAGE_FROM_SYSTEM
| FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpMsgBuf,
0,
NULL
);
printf("%s: %s\n", PROG_NAME, (const char*)lpMsgBuf);
LocalFree(lpMsgBuf);
}
exit(EXIT_FAILURE);
}
int main(int ac, char** av)
{
HWND message_receiver;
int i;
message_receiver = FindWindow(MESSAGE_RECERIVER_CLASSNAME, NULL);
if (message_receiver == NULL) die(NULL);
for (i = 1; i < ac; i++) {
PostMessage( message_receiver, MESSAGE_ECHO,
0, (LPARAM)(av[i]) );
}
return EXIT_SUCCESS;
}
/* __END__ */
$ cat message_test.h
#ifndef __MESSAGE_TEST_H__
#define __MESSAGE_TEST_H__
#include <windows.h>
#define MESSAGE_RECERIVER_CLASSNAME "message_receriver/classname"
#define MESSAGE_ECHO (WM_APP+0)
#endifmessage_sender から message_receiver へ適当に文字列を送るとそれをエコーするだけのもの。
これをコンパイルし、実行してみると、
$ gcc -Wall -o message_sender{,.c}
$ gcc -Wall -mwindows -mno-cygwin -o message_receiver{,.c}
$ ./message_receiver &
[1] 4472
$ ./message_sender din don dan「問題が発生したため、message_receriver.exe を終了します」……まあ、これでクラッシュするなら BBKontroller の方もクラッシュして当然。
で、問題はどの辺りなんだろ。
SystemBarEx の Child-Window Feature が発端となって、Slit の代替に BBInterface を使わないか、という話が出てきてます。
また、これを機に BBInterface のソースコードが公開されました。ライセンスは GPL。
どうでもいいですが、win32api について調べていたおかげか、上記スレッドの最初のポストの内容が何となく解るような、いややっぱり解らないような。最初見たときは何がなんだかさっぱりでしたが。
ああ、やっぱり。別に GetBBWnd を使わなくても FindWindow を使えば Blackbox.exe のハンドルを探せる。
で、見つかったハンドルへ PostMessage してみたら Blackbox.exe が落ちる……
そもそも PostMessage と SendMessage の違いって何だ。BB4W のソース見ても両者が混じってるし。
PostMessage: 指定されたウィンドウを作成したスレッドに関連付けられているメッセージキューにメッセージを放り込み、そのスレッドがメッセージを処理するのを待たずに戻ってくる。SendMessage: 指定されたメッセージをウィンドウに送信する。指定されたウィンドウのためのウィンドウプロシージャを呼び出し、ウィンドウプロシージャがメッセージを処理するまで戻ってこない。で、問題はハンドルなんだよな。
BBKontroller の続き。ふと BBController はどうなってるのかと思って調べてみると:
$ objdump -p BBController.exe | grep 'DLL N'
DLL Name: KERNEL32.dll
DLL Name: USER32.dllで、BBKontroller の方は:
$ objdump -p BBKontroller.exe | grep 'DLL N'
DLL Name: Blackbox.exe
DLL Name: cygwin1.dll
DLL Name: KERNEL32.dll
DLL Name: USER32.dllcygwin1.dll はどうでもいいとして、問題は Blackbox.exe。アプリケーションの初期化云々は依存しているファイルが見つからなかっただけだ。しかし、パスの通ってるところに Blackbox.exe をおいても (実行はできるが) 意味がないし、そもそも何故 BBController には Blackbox.exe がない? どうやったらなくても Ok なのだろうか。
Bro@m やその他コアに関わる操作 (ワークスペースの移動とか) をする場合、シェルのハンドルに PostMessage か SendMessage でメッセージを送るだけでよく、問題はそのハンドルをどこから探すか、かな。
Blackbox.exe が必要な理由は、GetBBWnd() が Blackbox.exe に含まれているグローバル変数 HWND hMainWnd (シェル起動時に呼び出される CreateWindowEx からの戻り値が入っている) を返しているからだと思うのですが。
あーれーれー。ということはプラグインなんかはどうなってるんだ? と思って調べてみると:
$ objdump -p /usr/win/bin/bbLean-1.12/Plugins/BBnetState/bbnstate.dll \
> | grep 'DLL N'
DLL Name: Blackbox.exe
DLL Name: iphlpapi.dll
DLL Name: KERNEL32.dll
DLL Name: USER32.dll
DLL Name: GDI32.dll
DLL Name: MSVCR70.dll依存してる。他のプラグインも同様 (全部は調べてないけど)。でも、これらは Blackbox.exe から動的にロードされるからなぁ……
(「Use headings to structure your document」適当訳)
ほとんどのページ (特にテキスト、しかし画像やマルチメディアも含む) にはその作者が内容を明らかにするために用いている構造があります。(X)HTML ではその構造を提供するための様々なレベルの見出し要素を使うことができます。
これは人々が目次として、あるいはページを小さな塊に分けたりするために利用することができます。例えば小さなデバイスに送信するために。また、(いくつかのサーチエンジンが行うように) ページのキーとなるコンセプトを決定するためにも使うことができます。
Markup validator は (X)HTML ページの構造を表示するためのアウトライン・ビューを提供しています──これは通常異なったテキスト・スタイルで表示されますが、表示の細かいことはスタイルシートを用いることで設定できます。もしあなたのページがいくつかの一貫したテキスト・スタイルはあるけれど見出し要素はない場合、多分それらは実際には見出しであるけれど、異なったスタイルのパラグラフとしてマークアップされているだけです。
(X)HTML は 6 レベルの見出しを定義しています: <h1>、<h2>、<h3>、<h4>、<h5>、<h6>。XHTML 2 では構造の深さによってレベルが決まる一般的な見出しも提供されるでしょう。
BBController が bro@m を送れたらいいのにとぼやいていましたが、ぼやく暇があったら自分で作ればいいんです。という訳で色々と調べてみたところ、これだけでいいのかと思うくらい単純なコードになってしまった。
$ cat BBKontroller.c
#include <windows.h>
#include "BBApi.h"
int main(int ac, char** av)
{
HWND hBBWnd;
int i;
hBBWnd = GetBBWnd();
for (i = 1; i < ac; i++) {
PostMessage(hBBWnd, BB_BROADCAST, 0, (LPARAM)(av[i]));
}
return 0;
}これだけ。プラグインなら色々とやらなければいけないお約束があるようですが、Bro@ms を送るだけならばこれだけでいいと思う。
で、問題はこれがコンパイルできて、リンクもできて、しかし実行できないこと。
$ make gcc -x c++ -I./include -c BBKontroller.c gcc -o BBKontroller BBKontroller.o -L./include -lBlackbox $ ./BBKontroller '@BBCore.toggleplugins'
Cygwin 上の gcc でコンパイルしているのですが、実行すると「アプリケーションを正しく初期化できませんでした (0xc000007b)」。
やってることは Broambox と変わりないんですが。
Blackbox for Windows 0.0.90 がリリースされました。
NC-17 さん曰く、次期メジャーバージョン (0.1.0) ではオリジナルの Blackbox の模倣という基本に立ち返り、小さく、シンプルで、不要なたるみのないものにする、らしいです。
できたー! いやっはぁぁぁ!! コホオォォォォッ!?
&PlugIn から呼び出す関数に WINAPI をつけてなかったからだ。ただ、つけると
$ nm se.dll | grep PLAY | sed -e 's/.* T //' _mayuPLAY@4
のようになって (頭の "_" はアセンブラ関連での識別子との衝突を避けるために自動的に付加され、末尾の "@xxx" は……何だろう、多分 C++ なんかでオーバーロードした関数などを区別するために付加されているのだろう)、このままだと繭が mayuPLAY を見つけれない。WINAPI をつけなければ "@xxx" が付かないので見つけられるけど、繭が要求する関数とはプロトタイプが異なるので繭がクラッシュする。WINAPI は windef.h で定義されていて、
#define WINAPI __stdcall
となっている。これを調べてみると関数の呼び出し規約の修飾子らしい。そりゃあ WINAPI をつけないとクラッシュするのは当然だ。
クラッシュする原因と理由は解ったけれど、繭が関数を見つけれないのが未解決。何となく ld --help を眺めてみたら
--kill-at Remove @nn from exported symbols
というオプションを発見。試しにこれを指定して dll を作成して、nm で確認してみると、
$ nm se.dll | grep PLAY | sed -e 's/.* T //' _mayuPLAY@4
えー……
何か駄目そうだと思ったけど試しに使ってみたら動作しました。何度か確認してみましたが、ちゃんと動いているようです。しかし、こんなので本当に大丈夫なのかな……
一応サンプルがてらに公開しておきます。繭のプラグインは窓使いの憂鬱のプラグインを公開するページ以外に見かけたことがありませんし、ここで公開されているものは VC++ 向けですから。
(「GIF or PNG?」適当訳)
このチップではウェブ上でシンプルな画像、図、またはロゴを表現するために使われる主な画像フォーマットの二つについて考えてみます。
GIF は、画像を劣化させずにファイルのサイズを小さくする LZW というアルゴリズムを用いてファイルを圧縮するフォーマットです。
GIF の強みは非常に幅広くサポートされているため、ウェブでシンプルなグラフのためのデフォルトの選択肢として認識されていることです。他の選択肢 (特に PNG) と比較しても GIF は技術的に優れているわけではありませんが、ウェブの最初の時代、PNG のサポートが始まったばかりの頃は確かに間違いのない選択肢で、このチップが書かれている時点でも多分まだ間違いのない選択肢でしょう。
GIF をめぐる問題の一つは LZW アルゴリズムがアメリカ合衆国では Unisys 社の所有する特許によって保護されているということです。アメリカ合衆国での Unisys の LZW の特許は 2003 年 6 月 20 日に期限が切れ、またカナダ、フランス、イタリア、ドイツ、イギリスそして日本でも期限が切れています。
PNG は可逆圧縮で、ポータブルで、ラスター画像ならより小さく圧縮することができるフォーマットです。PNG は特許に囚われない GIF の代替フォーマットを提供し、また多くの一般的な TIFF の用途も置き換えることができます。Indexed-color、グレースケール、フルカラーの画像 (truecolor images) がサポートされていて、さらにオプションとしてのアルファチャンネルがサポートされています。
ウェブにおいて、PNG には GIF に勝る三つの利点があります:
PNG はほとんどの場合 GIF よりも圧縮率が高いです (典型的には 5% から 25%)。
PNG は古いブラウザではサポートされていないことや、透明度のような特定の機能もサポートされていない場合があることに注意してください。異なるブラウザでの PNG のサポートのレベルを知るには以下の記事を読んでください:
で、色々と見直してみて以下のようにするとできた。
$ cat se-test.c
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
void die(const char* message)
{
printf("%s\n", message);
exit(EXIT_FAILURE);
}
int main(int ac, char** av)
{
void (*play)(const char* wavefilename);
int i;
void* handle;
const char* error;
handle = dlopen("se.dll", RTLD_LAZY);
if ((error = dlerror()) != NULL) die(error);
play = (void(*)(const char*))dlsym(handle, "PLAY");
if ((error = dlerror()) != NULL) die(error);
for (i = 1; i < ac; i++) {
(*play)(av[i]);
}
dlclose(handle);
return 0;
}
$ cat se.c
#include <w32api/windef.h>
#include <w32api/mmsystem.h>
__declspec(dllexport) void PLAY(const char* wavefilename)
{
PlaySound(wavefilename, NULL, SND_FILENAME | SND_SYNC);
}
$ gcc -c se.c
$ gcc -shared -o se.dll \
> -Wl,--whole-archive se.o \
> -Wl,--no-whole-archive -lwinmm
$ gcc -o se-test se-test.c
$ ./se-test ~/games/eroge/voices/haahaa.wavはぁはぁ。
で、このままだと se.dll は cygwin1.dll を使ってしまうので -mno-cygwin をつけて dll を作成しなおす。
$ gcc -mno-cygwin -shared -o se.dll \ > -Wl,--whole-archive se.o \ > -Wl,--no-whole-archive -lwinmm
別に se.dll が何に依存していようが、それを呼び出す側は無関係のはずなので se-test がちゃんと動くかどうか確認。
$ ./se-test ~/games/another-eroge/voices/haahaa.wav
はぁはぁ。
よし、これで se.dll を mayu の Plugins ディレクトリに放り込んで &PlugIn("se", "PLAY", "\\cygwin\\home\\kana\\games\\one-more-eroge\\voices\\haahaa.wav") とすれば……!
はぁは……あ、あれ、繭が落ちた。何も云わずに静かに終了する。何故だ。
うーむ。昨日の繭のプラグインの続きだけれど、Hello World が上手くいってたのはリンクのときに dll を指定していたからで、動的に dll を読み込んで関数を呼び出そうとする場合には上手くいかない、と思う。なので dlopen を使って Hello World ができるかどうか調べてみたところ、できなかった。dlerror からは
dlsym: Win32 error 127
と云われるので調べてみたところ、
$ net helpmsg 127 指定されたプロシージャが見つかりません。
とのこと。なら dll の作り方が悪い。
窓使いの憂鬱の &PlugIn 云々から思い立ち、プラグインを作れるかどうか試してみる。コンパイルは Cygwin 上の gcc で行うことにする (というか他にコンパイラがない)。
窓使いの憂鬱のプラグインは DLL なので、取り敢えず DLL の作り方から。Cygwin User's Guide の Building and Using DLLs を参考に Hello World から実験。これは成功。
さすがに Hellow World じゃ詰まらないので指定された wav ファイルを再生するプラグインを作るとします。
#include <w32api/windef.h>
#include <w32api/mmsystem.h>
void WINAPI mayuPLAY(const char* wavefilename)
{
PlaySound(wavefilename, NULL, SND_FILENAME | SND_SYNC);
}ファイル名は se.c とでもしておこうか。で、これをコンパイルする。手順は以下の通り:
$ gcc -c se.c; gcc -shared -o se.dll se.o -lwinmm
繭の方は以下のように割り当てておきます。
key W-_0 = &PlugIn("se", "PLAY", "somewhere/somewavefile")で、実行してみると「cygwin1.dll が見つからなかったため以下略」。-mno-cygwin 付け忘れてたか。コンパイルしなおし。
$ gcc -c se.c; gcc -mno-cygwin -shared -o se.dll se.o -lwinmm
今度は上手くいくか、と思いきや、繭のログには以下のようなエラーが:
error: &PlugIn() failed to find function "PLAY"
関数を見つけれない模様。どうしてだー。
ここで力尽きた……
(「Use international date format (ISO)」適当訳)
ウェブで日付を書くときにどう書いていますか? 多くのフォーマットがありますが、他のものと互換性のあるものはほとんどありません。ウェブのように国際的で、異なる文化の読者がいる場合、何かを書くときにこのようなフォーマットの中から日付の表現を選ぶことはユーザビリティの悪夢になるでしょう。幸運なことに、ISO が開発した国際的な日付のフォーマットという一つの答えがあります。
潜在的な最悪のユーザビリティの問題は以下の例のように日付が数字だけで書かれた場合に起こります。ある国とその他の国ではその日付の解釈が異なるからです。
次の日付を想像してください: 02/04/03
これはどの意味でしょうか?
大抵の場合、あなたがどの国に住んでいるかによって答えは異なるでしょう。
ほとんどの場合、完全な表記で日付を書く方が上記の例よりもよいです。例えば Apr. 3rd, 2002 は英語を話す読者であれば容易に理解できるでしょう。
しかしこの方法は数字だけの場合に比べて障害がないとはいえません: フランス語の 12 Août 2042 は、英語だと 8 月 (August) または 10 月 (October) の 12 日のどちらを意味するのでしょう?
ISO (ISO 8601) で定義された国際的なフォーマットは次のような数字による日付の体系を定義することでこれらの問題を全て解決しようと試みました: YYYY-MM-DD
例えば "3rd of April 2002" はこの国際的なフォーマットで 2002-04-03 と書きます。
このフォーマットはタイムゾーンの情報を付け加えるなど、より正確な日付と時間の表現にも用いることが可能なことに注意してください。
数字による日付の利用は日付のフォーマットに関する FAQ で説明されているような可読性とユーザビリティに関するいくつかの落とし穴を抱えています。ISO の日付のフォーマットは完全ではありませんが、しかしながら一般に (そして正確に) 理解できる日付の表現の最善のものです。
昨日のシェルスクリプトなのだけど、どうせならダウンロードに成功したら音を出して知らせてみたい。playsound ~/games/kouma/bgm/th06_01.wav のような感じで。
で、探してみると Play Sound Command とやらがあったのだけれど、Windows 用なので Cygwin から使おうとするとファイル名のことで少々問題が。cygpath を噛ませればいいのですが、面倒。
シェルスクリプトを書けばいいだけの話ですが、何となく気になったので cygpath が要らないように同じものを作ってみました。取り敢えず wav を再生するだけのもの。
$ cat test-wav.c
#include <stdio.h>
#include <w32api/windef.h>
#include <w32api/mmsystem.h>
int main(int ac, char** av)
{
int i;
for (i = 1; i < ac; i++) {
PlaySound(
av[i], NULL,
SND_FILENAME | SND_NODEFAULT | SND_SYNC
);
}
return 0;
}
/* __END__ */
$gcc -otest-wav test-wav.c -L/usr/lib/w32api -lwinmm
$このままでは POSIX 形式のファイル名を扱えないので少々書き加える必要がある。あと、PlaySound は扱えるファイルのサイズに上限があるので、長いものは途中で途切れてしまう。まあ、どうせ効果音再生なので構いませんが。
で、これを書くのに何時間かかったやら。w32api なんて触ったことないので何も解りませんよ。
ふと思ったのですが、窓使いの憂鬱 の &PlugIn を利用して何か素敵なことができたりしませんか。
&PlugIn(bb4w, send_broams, "Bro@ms...")
のような感じで。BBKeys より柔軟なキーバインドができますよ。欠点は窓使いの憂鬱の設定が難しいことくらいか。
別にプラグインでなくても単体で bro@ms を送れるようなコマンドがあれば &ShellExecute で代用できます。
BBController はある程度の操作はできるものの、bro@ms は直接送れませんし。
bbLean 1.12 になってからタスクマネージャを終了するとクラッシュしたり、bbLeanSkin でスキンを適用している状態でシェルを終了するとクラッシュすると報告したら、早速修正されたものがリリースされました。今のところクラッシュしてません。幸せー。
質問があったので答えておきます。
bbLeanBar のメニューにある Configuration -> Current Tasks Only というオプションですが、これをチェックすると bbLeanBar に表示されるタスクが現在表示しているワークスペースにあるものだけになります。
例えばワークスペースを alpha、beta として、alpha に Opera、beta に LimeChat を配置していたとしましょう (それ以外のアプリケーションは実行していないものとします)。この場合、alpha を表示しているときは Opera だけ、beta を表示しているときは LimeChat だけ表示されます。
ただ、タスクを最小化したり、最小化したタスクを元に戻した際、アイコンの表示が即座に反映されない場合があるのが少々問題。前者の場合、ワークスペースを移動してもそのタスクが最小化する前にいたワークスペースにいるものとしてアイコンが表示されます。後者の場合、ワークスペースを移動するまでアイコンは表示されないままの模様。どちらもワークスペースを移動しないと気付きませんが。
あまりワークスペースを使わない人には縁のないオプションですね。
タスクマネージャを終了すると bbLean 1.12 がクラッシュすると書きましたが、多分条件が解ったかも知れません。
クラッシュするための手順は、
となるはず……が、あれ、100% ではないな。でも何度かタスクマネージャの起動 / 終了を繰り返していると必ずクラッシュします。bbLean 1.10 ではクラッシュしませんし、プラグインを全くロードしていなくても状況は同じ。
取り敢えず報告々々。
i=1;
while [[ $i != -1 ]]; do
echo "Try: $i";
curl -C - -O SOMEWHERE/SOMEFILE;
if [[ SIZE_OF_SOMEFILE == `ls -l SOMEFILE | sed -e \
's/^[^ ]\+ \+[^ ]\+ \+[^ ]\+ \+[^ ]\+ \+\([^ ]\+\).*$/\1/'` ]];
then
i=-1;
else
echo {-,-,-}{-,-,-};
sleep 1m;
let i++;
fi;
doneSOMEWHERE/SOMEFILE をダウンロードする。接続が切れたりして完全にダウンロードできなかったら 1 分待ってから再度ダウンロードする。このとき、前に中断されたところから再開する。
で、何でこんなものを 1 行で入力するんだ、私。
(「Care With Font Size」適当訳)
デザイナーの間での主な傾向は、ウェブページの文字を小さくすることは見た目がおしゃれで、1 つのページに対してより多くの内容を詰め込めると思い込んでいて、ときにそれは信じられないほど小さなフォントを使うという結果になっています。
不幸なことに、これはウェプページにアクセスするために使われる多くのプラットフォーム、例えば小さなスクリーンのポータブルデバイスからコンピューターに接続されたプロジェクションデバイスまでにおいて上手くいくとは限りません。特定のプラットフォームに限定してもテキストの設定は多様です。
これは基本的なユーザービリティとアクセシビリティの問題です: よいデザインとはユーザーがフォントのサイズを変更させなくてもよく見えるべきです。
<font> は忘れ、CSS を使いましょうウェブページを表示する文字のサイズを設定する正しく近代的な方法は CSS を用いることです。これは HTML の <font> タグを使うことよりも強く推奨されています。これは CSS がより柔軟で、簡単にメンテナンスでき、さらに帯域の節約にもなるからです。このチップは CSS 対 <font> タグのことについて論じることが目的ではありませんので、この問題についてより詳しく知りたい方は関連情報をお好みのサーチエンジンで調べてください…… 私達は読みやすいウェブページを作成するための CSS のよい使い方に注目したいのです。
CSS の font プロパティを使うことで (十分に) 読みやすいウェブページを作成するために従うべきいくつかの基本的なルールは以下の通りです。
font-size に pt やその他の絶対値の長さの単位を指定しない。プラットフォーム間で同じように表示されませんし、ユーザーエージェント (例えばブラウザ) でサイズの変更ができなくなるかも知れません。font-size を使う場合、読みやすい font-family と高いアスペクト値 (アスペクト値に関する説明は CSS2 の仕様書の font-size-adjust セクションを参照してください) を設定する方が小さいサイズでもより読みやすくなります。font-family プロパティに複数の値を設定して使う (システムがリストから利用可能な最良のフォントを選べるようにする) 場合、特定のアスペクト値にするために font-size-adjust プロパティを使ってもよい。これとは異なったアドバイスが他にもあります。"Corpus 1em, nihil minor" - Bert Bos after Cato.
bbLean 1.12 なんですが、タスクマネージャを起動して、終了させるとシェルが落ちます。
何でだろ。bbLeanSkin をアンロードしてると問題ないようなのですが。
……ぬぅ。100% 落ちるわけではない模様。スキンの適用が問題だとは考えにくいのですが。taskmgr.exe は既に exclusions.rc に入れてますから。
最近頻繁にテストバージョンがリリースされているのですが、今回はなかなか面白い機能が追加されたようです。以下にその手順を示します。
つまり、BBInterface を Slit に見立てて、SystemBarEx をその中に入れられるということです (どちらかというと、BBInterface の子コントロールのように振舞える、の方が正確なような少し違うような……)。
ちなみにこうしてコントロールの中に入れた SystemBarEx は他の子コントロールと同じ扱いを受けるので、親コントロールが移動すると SystemBarEx も一緒に移動しますし、親の透明度を変更すると SystemBarEx の透明度も一緒に変更されます。
しかも、何故かフレーム以外のコントロールに入れることもできます。
(「If You Pick One Color, Pick Them All」適当訳)
驚くほど多くのウェブサイトが本文の文字、見出し、リンクに色を指定していますが、背景には指定していません。あなたのサイトの訪問者は任意の色を設定しているかも知れないので、
これらの問題を避けるための簡単な指針は次の通りです: ある箇所に色を指定したなら、他の全ての箇所に色を指定しなければならない。
<font> は忘れて、CSS を使いましょうウェブページに色を設定する適切で近代的な方法は CSS を用いることです。これは HTML の <body> の属性や <font> 要素を使うことよりも強く推奨されています。何故なら CSS はより柔軟で、簡単にメンテナンスでき、さらに帯域の節約にもなるからです。CSS の color と background-color (またはその省略形の background) プロパティを使いましょう。
以下はページの背景、文字色、そしてリンクの色を全て指定している簡単な例です。
html, body {
background: #fff;
color: #000;
}
a:link {
background: #fff;
color: #037;
}
a:visited {
background: #fff;
color: #636;
}bbLean 1.12、何か 1.10 に比べて不安定になってる気がする。不安定というか、不具合か。bbLeanSkin をロード (かつスキンを適用) した状態で bbLean を終了しようとするとクラッシュします。何もウィンドウを開いていなければクラッシュしませんが、いくつかウィンドウを開いていると「問題が発生したため blackbox.exe を (以下略)」。恐らく、FAQ にあった BBWinSkin の問題と同じでしょう。ただ、1.10 だとクラッシュしないんですよね。困ったもんだ。
loose-screws.com のフォーラムにある BBWinSkin のトピックでは「将来のリリースでこの不具合は修正されるでしょう」ということが書かれてますから、大人しく待ちますか。
bbLean のこと。BBKeys からメインメニュー (デスクトップを右クリックして出てくるアレ) を表示するには WithAction(ShowMenu) あるいは WithAction(ExecCommand), DoThis(@BBCore.showmainmenu) とすればいいのですが、少々挙動が違います。
ShowMenu の場合、
@BBCore.showmainmenu の場合、
という違いがあります。特に前者が致命的。ShowMenu だとキーボードでメニューを操作できる意味がありません。そういえば最近の nightly はどうなんでしょう。キーボードで操作できても ShowMenu しか使えなかったらアレですな。
ぶはははははは! bbLean 1.12 を試しているのですが、同梱されているスタイルに私の作った clovers が入ってました。思いっ切り不意打ちだ!
さて、気を取り直して気付いた点でも。
@BBCfg.showBr@ams が追加 ([config] -> Menus -> Show Bro@ms)。On でメニューの bro@m を送る項目が bro@m で表示されます。例えば [exec] (about BBLS) {@BBLeanSkinAbout} という項目だと "about BBLS" ではなく "@BBLeanSkinAbout" と表示されます。デフォルトではオフで、この設定は保存されない模様。ついでにこの bro@m はスペル間違ってるような気がしますが、どうなんでしょう。bbLean 1.12 がリリースされました。
変更点は、
(「Use <link>s in your document」適当訳)
HTML と XHTML はそのドキュメントに関する外部の情報を追加できるようなメカニズムを持っています。これらの外部のリソースはスタイルの情報 (CSS)、ナビゲーションの補助、別の形式での情報 (RSS)、連絡先の情報などであるかも知れません。
LINK 要素 (<link>) はこの情報を HEAD 要素にあるあなたのドキュメントのヘッダに追加するために使われます。
天文学に関するウェブサイトのあるページを例にしましょう。このページは太陽系について述べた章のうち、地球に関する部分です。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"hffp://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="hffp://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>Earth - Astronomy Weblog</title>これは HTML ドキュメントの典型的な最初の部分です。
<link rel="Start" href="/solar-system/" /> <link rel="Prev" href="/solar-system/venus/" /> <link rel="Next" href="/solar-system/mars/" />
これらのリンクはいくつかのユーザーエージェントでナビゲーションの補助となるでしょう。
Start はこの章の開始点Prev は前のページへの位置、この場合は金星Next は次のページへの位置、ここでは火星<link rel="Contents" href="/solar-system/contents.html" />
Contents は章の索引 (全体の目次) を指します。
<link rel="Help" href="/website-help.html" />
Help はあなたのサイトの訪問者の助けとなるようなページへのリンクを指します。
<link rel="alternate"
type="application/rss+xml"
title="RSS"
href="/updates.rdf" />これは RSS リーダーがウェブサイトの更新情報を探すことができるようにします。注意: これが書かれている時点では mime-type の application/rss+xml はまだドラフト (The application/rss+xml Media Type) で、IETF に受理されていませんし、最終案では動作しなくなるかも知れません。
<link rel="meta"
type="application/rdf+xml"
title="FOAF"
href="hffp://astro.example.org/foaf.xrdf" />これは FOAF リーダーがドキュメントのメタデータを探すことができるようにします。注意: これが書かれている辞典では、mime-type の application/rdf+xml はまだ IETF に受理されておらず、最終案では動作しなくなるかも知れません。
<link href="mailto:webmaster AT example DOT org" rev="made" />
ウェブサイトの製作者への連絡情報を示します。
<link rel="stylesheet"
type="text/css"
media="screen"
href="/style/astro.css" />ウェブサイトを表示する際に使う CSS を指定します。この例では、スクリーンでのレンダリングのためのスタイルシートを指定しています。異なったメディア用の異なったスタイルシートを指定することもできます。
<link rel="alternate"
href="/solar-system/earth.fr"
hreflang="fr"
title="French Translation" />これは他の言語 (この場合はフランス語) に翻訳されたドキュメントへのアクセスを提供します。
</head> <body> .... Here the rest of the page.
ここでヘッダ部分を終了してボディ部分を開始します。
これらのリンクはユーザーエージェント (ブラウザ) や他のアプリケーションによって利用され、あなたのウェブサイトを利用する人々の助けとなります。
「ウィンドウを最大化しても画面一杯に最大化されないのは何故?」という質問。FAQ に載ってるのですが、それには「デスクトップの範囲を設定するにはどうすればよいのですか?」という質問で載っているので見つけにくいんでしょうね。「ウィンドウを最大化してもツールバーが / で隠れないように隙間を空けるにはどうすればよいのですか?」というのも同じことだけど見つけにくいよな……
問題はそこじゃなくて、qwilk たんのナイスギャグ。面白すぎ。これでも十分笑えたけど、それに対する返信がさらに笑える。
既に翻訳されたものが ANCieNT MAGiC さんのところにありますが、オリジナルの方が更新されているので。
まだ訳しきれてませんが、取り敢えず。
一応全部訳しました。
lex と yaxx のもう一つの実装。Python 用。Python 用の解析ツールは他にもいくつかあるのだけれど、PLY はいくつかの特徴があって、
……らしい。先ほどあるプログラムを書き始めて、字句解析や構文解析に手をつけようとしたところで lex なり yacc なりを使えばいいじゃないかということに気付いた。
実は lex やその類は一度も使ったことがない。という訳で使ってみるかな。
(「Don't forget to add a doctypebi」適当訳)
HTML の種類は 1 つだけではありません。HTML 4.01 Strict、HTML 4.01 Transitional、XHTML 1.0 Strict、他にも多くの種類があります。どの種類もそれぞれの W3C の仕様で定義されています。しかし HTML の要素や属性、正しい構造などの指定をする機械可読な言語でも定義されています。
そのような定義は「文書型定義 (Doctype Type Definition)」または短く DTD と呼ばれています。
ウェブブラウザのように HTML ドキュメントを処理するツールはある (X)HTML ドキュメントがどの DTD を使っているかを知る必要があります。これがどの (X)HTML ドキュメントにも以下のようにその先頭に DTD 宣言を書かなければならない理由です:
<DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
この構文から、DTD 宣言はよく「doctype」と呼ばれます。
何故 doctype を指定するか? これはあなたのドキュメントが実際に使っている (X)HTML のバージョンがどれかを定義し、ドキュメントを処理するブラウザや他のツールが必要とする重要な情報の一つにもなるからです。
例えば、あなたのドキュメントに Doctype を指定すると、(X)HTML の文法のチェックをする (その結果多くのブラウザでレンダリングされるあなたのページに問題を起こすかも知れないエラーを発見する) Markup Validator のようなツールが利用できるようになります。このようなツールはドキュメントの種類が解らないと上手く動きません。
しかしほとんどのブラウザにおいて最も重要なことは、doctype 宣言が多くの不必要な推測をなくし、「標準」解析モードに切り替えることになるからです。これはドキュメントの解析 (とその結果としての表示内容) が早くなるだけでなく、一貫性があり、また doctype がないことによって引き起こされる悪い意味での驚きをなくすことになります。
ふと思った。BBampTitle、あるいは multiamp の Lilith 版を作れないものか。いちいちスタイルに合わせたフェイス (スキン) を作るのはアレだし。
いや、面倒なので汎用的なフェイスで誤魔化すかな。でも、最近は長いプレイリストを再生しっぱなしにしつつ最小化して放置してるので画面上になくても気にならないし、それ以前に (アプリケーションではなく家電の) CD プレイヤーの方を使ってるのでそもそも起動すらしてないという話。
You can download these plugins from Piece of a Puzzle.
These plugins were developed before releasing BBSlit, so these are not slittable.
Note: These plugins are developed by a Japanese BB4W user, and he/she distributed these plugins at an anonymous BBS about one year ago. Now these plugins are archived by Piece of a Puzzle, but the webmaster is not developer of these plugins, so you shouldn't ask him question or suggestion about these plugins.
These plugins can be in the slit by BBLoSlitta.
(「Use the alt attribute」適当訳)
alt 属性は一連のタグ (img、area、input、applet) にそのオブジェクトと同等のテキストを提供します。
このテキストは以下のよくあるシチュエーションにおいて、あなたのウェブサイトとその訪問者に以下の利益をもたらします:
alt 属性の中身についての一般的なルールは次の通りです: 画像と同等の働きをするテキストを使う。
さらなるルール:
(「Use <h1> for top level heading」適当訳)
<h1> はドキュメントの最上位の見出しを表すための HTML の要素です。
タイトルとは違い、この要素はリンクや強調、その他 HTML のフレーズ要素を含めることができます。
不幸なことに、いくつかのブラウザが内蔵している <h1> のデフォルトのフォントサイズが原因で多くの記者やツールが <h2> を代わりに使っています。これは Amaya の目次ビューのようにページの見出しの構造を利用するツールをミスリードすることになります。代わりに Cascading Style Sheets を使うことを考えてください。これは製作者が <h1> や <h2> のような要素に対応するフォントサイズを設定するために設計されています。
東方紅魔郷へたれリプレイ。霊夢(夢) で粘って粘ってみたものの、ステージ 4 ボスのパチュリー・ノーレッジにて撃沈 (粘り具合はパチュリーのシルフィホルン上級の後辺りに現れてる)。ノーコンテヌーで最後 (のボスを拝む) まで行きたかったのだけどまだまだ無理。
パチュリーはキャラ (及び武器) によってパターンが変わるのですが、霊夢(夢) だとかなり辛い。避けれないパターンばかりで死にすぎ。でも攻略サイトは見たくない。何か見ると負けた気分。
ついでに BB4W のスタイルでも。この間作った clovers は、あれはあれで気に入ってるのですが、いかんせん眩しすぎて目が疲れます。なので黒基調のものを。できるだけ暗くしてるので好みが分かれますが。
黒背景基調のスキーマを作り直そうとしたけれど、こっちを取ればあっちが立たずの繰り返し。
結局、以前作ったスキーマを使う。これもこれで多少問題はあるんだけれど、今のところこれ以上のものはない。
先日購入した蓮台野夜行を聞いているのですが。11 曲目の「幻想の永遠祭」のイントロのピアノの部分、東方幻想郷の「少女綺想曲 〜 Capriccio」に似てる気がするのですが。気のせいかな……
「少女綺想曲」は MIDI データや PMD データが公開されているものの、「幻想の永遠祭」は試聴できないので蓮台野夜行を持ってない人は比べようがないのでアレ。
後、「少女秘封倶楽部」が妙に音が割れて聞こえるのは気のせいかな。低ビットレートの mp3 っぽく聞こえて耳に痛い。曲は好きなのだけれど。
ユーザー同士でインターネット越しに会話することができる。基本的にオンラインゲームのバックグラウンドで実行されるようにデザインされている。アプリケーションはサーバーとクライアントに分かれてるので、その気になれば自分でサーバーを立てることができる。音声の品質 / 使用帯域は調整できるし、最大でも上り帯域は 25.9KBit/s (= 3.3 KB/s) しか使わない。何よりクロスプラットフォームなので TeamSpeak が動くのであれば OS を問わずにコミュニケーションできる。
ははーん。IRC と違って手が奪われない分、色々とアレなのだな。
(「Use standard redirects - don't break the back button!」適当訳)
もし http://www.example.org/foo で http://www.example.org/bar にあるものを表示させたい場合、以下のような "refresh" は使うべきではありません:
<meta http-equiv="refresh" content="1; URL=hffp://www.example.org/bar" />
何故でしょう? これは「戻る」ボタンを使えなくする可能性があるからです。ユーザーが「戻る」ボタンを押したと想像してください。refresh が再び動作して先に追いやられてしまいます。そのページの作者の想像とは裏腹に、大半のユーザーはこれに非常に苛立たち、ウィンドウを閉じてしまうでしょう。
リダイレクトのために "refresh" meta タグを使う場合、ドキュメントに埋め込まれた特定の命令を使っていることになります。ユーザーエージェント (ブラウザや文法チェッカなど) はページをダウンロードし、その内容を見て、"refresh" 命令を探し、指定された時間だけ待ち、そして新たなアドレスに進むようになっていることが期待されます。
一方「HTTP リダイレクト」は別の領域で処理されるため、より直接的に作用します。ユーザーエージェントがサーバーに接続して、あるドキュメントをリクエストすると、そのドキュメントを別のアドレスにリダイレクトするよう設定されているサーバーはユーザーエージェントに対し代わりに新しいアドレスを見るべきだと返答します。
「HTTP リダイレクト」はよりよいリダイレクトの方法でもあります。何故なら新たなアドレス以外の情報をユーザーエージェントに提供するからです: サーバーはユーザーエージェントがリダイレクトの種類に応じて異なった振る舞いができるように、リダイレクトの種類や目的に関するいくつかの情報も提供できます。HTTP リダイレクトの種類 (これはサーバーが送信する HTTP ステータスコードに関連します) については恒久的なリダイレクト (301)、一時的なリダイレクト (307)、未定義のリダイレクト (302) などがあります。
どのようにサーバーを設定すればいいかについては下記のドキュメントやチュートリアルを参照してください。
広告云々。何というかな。ソース見たところ以下のような配置になっているけれど、
+--------+------+ |広告 |リンク| | | | |タイトル| | | | | |本文 | | +--------+------+
広告が重なるというのであれば以下のように (広告を多段組のところから除外して) 配置すればよいのでは?
広告 +--------+------+ |タイトル|リンク| | | | |本文 | | +--------+------+
以前と同じ配置のような気がしますが。
全然関係ないですが、横スクロールバーが出なくなってて萌え。
本当に <title> は Web ページの品質で最も重要な要素ですね。loose-screws のフォーラム、どのページも <title>Loose-Screws.com Forums</title> なので、今見ているページがどこかさっぱり解りませんよ。
フォーラムで報告されてたいくつかの問題が修正された模様。変更点は:
Circle Mebius 新作きたー!
しかし、
もしプレイして全く満足できなかった場合、代金を返却します!
大丈夫か……? これで失敗すると解散するとか書かれてますし。がくがく。
(「Don't say "click here"; not everyone will be clicking」適当訳)
ユーザーに何らかのアクションをするよう呼びかける際には、簡潔だが十分に意味のある下記のようなリンクテキストを使うこと:
例えば、以下のような文は止めましょう:
これらの文はもえたんを購入するための工程を不必要に表しています。読者に何らかのアクションをするように呼びかけたいならば、次のようにするのです:
ここで「げっと」をハイパーテキストから除外していることに注意してください: 私達はリンクテキストに動詞を含めることを推奨しません。従って、以下のように書くのではなく:
次のように書くべきです:
(「<title>: the most important element of a quality Web page」適当訳)
HTML の <title> 要素は、例えば以下のような場合において、そのドキュメントを表す短いテキストを提供するためのものです。
そういう訳なので、ページに良いタイトルを付けることを忘れないでください:
BBStyleMaker 1.1 がリリースされた模様。WYSIWYG なスタイルエディタ。bbLean 1.10 以降で動作。見たまんまなので解説不要。
HTML、CSS、HTTP などに関するちっぷ。The W3C MarkUp Validation Service でチェックしたときに表示されるアレ。
Romancing Sa・Ga について色々と。確かオリジナル (スーパーファミコン) が発売されたのは 1990 年だったような。
ストーリー関係の文書がなかなか面白かったです。特にバファル編の補足や凍った城はなかなか。後者は最後に思いっ切り笑わされた。オブ (ザー) はどうよ。ああ、お腹痛い……
コーヒー入れて机の前に座ったら、机に置いた勢いからかキーボードにコーヒーがこぼれました……
どぼどぼと注ぐようにこぼしたのではなく、勢いで跳ねた分がかかった程度だったのと、その程度の量では致命的な部分に水分が入らないような構造だったのが幸いして、キーボードは無事でした。
しかし、ごく少量とはいえコーヒーが入ったまま放置する気にはなれなかったので掃除開始。もう少し暖かくなったら分解して掃除しようかと思っていたのに、何でこんなときにすることになるんだか……
一度分解して掃除した経験があったので作業は手間取らずに済みましたが、85 個ものキーをぱちぱち抜き差しするのは疲れるし、淹れたコーヒーは冷めるし、最悪。まあ、壊れなかっただけよかったです。
ちなみに HHK Lite 2 は先にキーを抜かなくても台座を外せますし、先に台座を外せば裏側から爪を上手く押すことで道具を使わずにキーが外せます。
ああ、今回は TYU の位置を間違えませんでしたよ。M と N はまた間違えましたが。
買おう買おうと思ってて何とはなしに先延ばしにしていたものを購入。上海アリス幻樂団の蓮台野夜行、青猫屋の影音、(本当はふるり。の影踏みがほしかったけどどこにもなかった)、でもってEMBRYOのEMBRYO Piano Works。
で、EMBRYO Piano Works がすごい。てっきり普通の CD ケースに少々解説の書かれたブックレット付き程度だと思ってたら、やたら大きいし装丁は凝ってるし解説はブックレットじゃなくて本だし。曲しか眼中になく、ろくに紹介ページに目を通してなかったので思いっきり不意打ち。
曲についてはノーコメント。聞くべし。
EMBRYO の存在を知ったのは Virtoso が最初で、そのときには既に Hammerklavier は手に入らない状況でした。なので Fantasia on Themes from the 'Atlach=Nacha' がようやく聞けて満足。他の曲もいいのですが、一番聞きたかったのはこれなので。
しかし、これ以降作品を発表することはないということなのが残念。
負荷をかけるべきなのは人間ではなくマシンなんだよな。うん。
うがーうがー。
863 : 名無しさん@お腹いっぱい。 : 03/11/10 23:32
はじめまして。
PC98 に含まれているフォントデータを使って、
個人的に使う ttf を作っています。
問題が起きたので、関連する話題ということで質問させて下さい。
Virtual98 形式の font.rom -> bdf -> ttf という方法で
やっていくことにしました。
bdf への変換は pc98e-0.22/asm/mkbdf.cc を hack したもので行いました。
そして bdf2ttf-2.0b で bdf から ttf への変換の過程で問題が生じました。
ttp://ash.jp/code/codetbl2.htm を秀丸でソース表示させることによって
確認したものが以下の画像です。実際に御覧ください。
ttp://220.109.132.202/broken.png
JIS の 3C28 は、示という文字なのですが、異なる字に化けています。
bdf に変換する段階で化けたのかと思ったのですが、
bdf2bmp で bmp に変換したものを見た限り bdf のデータは正常でした。
また bdf2ttf を Linux 上でビルドした物を使っても同じような
結果になりました。
同じような問題に遭遇された方はいらっしゃいますか?
また、解決法をご存じの方はいらっしゃいますか?
864 : KoRoN@Vim%Chalice ◆8XALICEsdk : 03/11/11 00:00
>>863
JISの0面(という言い方は正しくないですが)に定義されていない文字なので
エンコード変換に失敗して「示」を上書してしまっているようです。
とりあえずbdf2ttfを-vオプション付きで実行してみてください。
上書した際にエラーメッセージを吐いているハズです。
その文字を正しい場所にマップするためにucstable.d内のファイルに
0x793A 0x5022
という行を追加すればOKなんですが、
とりあえずJISX*.WIN.TXTなファイル全部へ追加してみてください。
865 : 863 : 03/11/11 00:24
>>864
どうもありがとうございます。
gcc-3.2.3-0vl5, glibc-2.3.2-57vl5 な環境で
bdf2ttf-2.0b を実行してみましたが、エラーは表示されませんでした。
$ ./bdf2ttf -v dummy0.ttf 98font.ini ../98ank.bdf ../98kanji.bdf
Input files:
../98ank.bdf
../98kanji.bdf
UCS の変換ルーチンって、iconv で UTF-8 あたりに
変換すればよいのでしょうか?
もしそうなら、コードを書いてみようと思うのですが。
866 : KoRoN@Vim%Chalice ◆8XALICEsdk : 03/11/11 00:30
>>865
> UCS の変換ルーチンって、iconv で UTF-8 あたりに
> 変換すればよいのでしょうか?
辞めといた方が良いでしょう。フォントグリフについては
正規ではない変換が多く大概のiconvの実装では対応しきれません。
変換テーブルをカスタマイズしなければならないケースなることが
多いですから今のデータファイル形式が一番楽です。
> その文字を正しい場所にマップするためにucstable.d内のファイルに
> 0x793A 0x5022
> という行を追加すればOKなんですが、
> とりあえずJISX*.WIN.TXTなファイル全部へ追加してみてください。
とりあえずコレを実行してみてください。
2.1 がリリースされました。変更点は:
昨日作ったスタイルに合わせて 3D Color Changer のカラースキーマも作ってみた。拡張子を .3dc に変えて使ってください。
control.exe desk.cpl,,3
「画面のプロパティ」を開く方法。末尾に ",,3" などとつけると特定のタブを指定して開ける。
タブの指定は知らなかった。
*box のスタイルのファイル名に ".style" という拡張子をつけるようにしよう、という話らしい。
bb4win.org や box.cm.us にも同じニュースが投稿されていますが、やはり賛否両論といったところですね。
拡張子をつけるべきだという理由が、(Windows) ユーザーがスタイルを扱いやすいように、ということだけなのが問題。関連付けなら .txt で代用するとか、あるいは自分で適当な拡張子を決めてそれを使えばいいだけなんですが。シェルを変えようなんてしている人間がそのくらいのこともできないなんて訳ないでしょう。
エンドユーザーにも親しみやすいように、というのは解らなくもないが。
なかなか面白い実験。簡単な質問文を入力すると、その解答を可能性の高いものから表示します。
検索できるのは「クヌースって誰?」のような簡単なものだけですが、それでもなかなか面白い。
解答の正確さを表すために、結果の横に「〜にちがいない」「〜だよね?」「〜かな?」のような文が添えられているのですが、それも相まってなかなか面白い結果が表示されたりします。
という訳でネタ検索。
- ¥485 じゃないよね?
- 8100円 じゃないよね?
- ¥15,000 じゃないよね?
- 1,000円 じゃないよね?
BB4W、本家 nightly の 2004-02-04 以降のバージョンで新しい API に MakeMenuItemString が追加されたようです。これで BBInterface の問題 (メニューから任意の文字が設定できないこと) が解決されたかな。他のブランチにも取り込まれるかどうかは解りませんが。
SetEnvIf User-Agent "The worst agent" BadRobot
としておいて
RewriteCond %{ENV:BadRobot} =1
RewriteRule ^.*$ Http://%{REMOTE_ADDR}/ [R=301,L]あるいは
Order allow,deny Allow from all Deny from env=BadRobot
とでもする。
UA で判断する場合は
SetEnvIf HTTP_USER_AGENT "The worst agent" BadRobot
だと駄目。
あのー、今ハードディスクから「ふしゅぅぅぅぅ……」という異音が聞こえてきたのですが……
$&@*!(_$&!@*%(*!@%!@{% いやいやいやいやいや、また聞こえてきたよ。「ガコンガコン」とか「ズガー」とか明らかに寿命目前の音ならいいんですが、何かこう、クトゥルーな音なので嫌。
一応定期的にバックアップは取っているのですが、取ってても取ってなくてもこんな音が出ると嫌だなぁ……
何かやたら Mozilla/3.0 (compatible; Indy Library) というのが多い。でもアクセスログの前後を見てみると動きが人間臭いし、第一 spam なんて来てない。
で、調べてみたら Indy Project というところのコンポーネントらしい。つまり、そのコンポーネントを利用したブラウザか。
さらに調べてみるといくつかのブラウザが使ってる模様。別にブラウザに限らず、他のアプリケーションでも使われていたりするようです。
loose-screws.com にある Blackbox for Windows のフォーラムを少し覗いてみたのですが、いくつか面白そうなものを発見。
What v2 does is to automatically change *all* UI colours to match the current style, and it actually works quite well - most of the time... :)
BBColor の次期バージョンの開発がされている模様。スタイルに応じて全てのインターフェースの色 (ツールチップとかウィンドウとか) を変更できるようになるようです。
BBWinSkin がリリースされてからかなり肩身が狭かったのだけれど、これでいい感じになりそうな予感。私は 3D Color Changer を併用してるのですが、それも不要になるかな。
BBColorEx で代替可能です。
なかなかいいですね。テキスト処理言語は下手に使うとアレだけど上手く使えば素敵。興味のある方はどうぞ。
私の場合、簡単なものは sed、ある程度面倒になったら Perl (か Python) を使いますね。awk はマニュアル見たことすらありません。上で間に合ってるので。
- Q: [blah1425] i just downloaded bb4win, and I was wondering if you guys could tell me what "HideExplorer" is used for.
- A: If blah1425 meant HideExplorer.dll, it simply hides Explorer when not running BB as the defualt shell.
(訳)
Windows 95 や NT4 ユーザー用のプラグイン。BB4W の設定のフォーカスモデル (session.screen0.focusModel) がありますが、一部の項目は 95 や NT4 に該当する機能がないため無効となっています。これはその機能を追加するためのプラグイン。
私の環境では試しようがありませんのでノーコメント。ドキュメントにも、
You should consider upgrading to at least win98 from 95 or 2k from nt4.
(訳) とにかく 95 ユーザーは 98、NT4 ユーザーは 2000 にアップグレードすることを検討すべきです。
なんて書かれてるくらいですし。
無視。プラグインではなく単体のアプリケーション。昔 (2002 年) のだし、ドキュメントがないし、試しに起動してみたが今一。やたらサイズが大きい (2M) し、インストーラ付きだし。
これは解説しなくていいや。これは昔 BB4W が Full Maximization (ウィンドウを最大化したとき、画面全体に最大化させないための設定。ツールバーが隠れたりツールバーで隠れたりするのを防ぐため) の設定を実装していなかったときの代用として作られたものです。
プラグインではなく、単体の実行ファイルです。BBKeys と絡めるか、スタートアップフォルダにショートカットを置いておくとか、そういう使い方をされていた模様。
BB4W 用プラグイン。導入は AppList.dll と AppList.rc を適当な場所に置いて、plugins.rc に AppList.dll へのパスを追加すれば Ok。
現在実行しているアプリケーションのリストを小さなアイコンで表示します。リストの背景は透過。
AppList.rc には表示位置が保存されます。それ以外の設定はありません。AppList.rc が見つからなければ表示位置は保存されません。
2002 年に作られたプラグインのようなので、恐らくどのブランチでも動作するかと思われます。bbLean 1.10 での動作を確認。
BB4W 関連のファイルが配布されてる模様。見たことない名前のものがいくつかあるので試してみるかな。
本家のバージョン 0.0.2 とかあるんですが……
というか、見たことないのってほとんど過去のものばかりだ。
BBInterface、メニューを pinned に (タイトルバーを左ドラッグ) してから何かの設定を変更しようとすると、一回目は変更が反映されるものの、二回目以降は変更が反映されない模様。例えば Window Options の Visible を一度クリックして Off にしたとすると、もう一度クリックしても反応がない。ついでに On/Off を示すブレットの表示が追従しなかったりします。
一度メニューを閉じてから開きなおせば設定はできますし、ブレットの表示も正しくなっているのですが、もう一度設定しようとすると同じことになります。
bbLean ではなく BBInterface の問題だと思います。bbLean のメニューはちゃんとした振る舞いですから。
……後でフォーラム見てみるか。
プラグインが古い API を利用していたり、新しい API を利用していても使い方によって上記の問題が起きるようです。
サブキーボードとやら。なかなか面白そう。
でも私は使わないかな。試しに触ってはみたいのだけれど、有効活用できそうにないです。
それに置く場所がない……「キーボードの奥行き + 手首を置く場所」を考えると Professional は明らかに奥行きが長すぎるし、横方向は何か別のものを置きたくはないし。
奥行きに関しては上記ページの他のキーボードとの比較写真を見れば解ります (私は HHK 使用)。横方向は既にマウスとマグカップの指定席なので空きはなし。
X-Keys Stick 辺りなら使ってみたいかなー。見た目も楽しいし。でも何に使うのかと聞かれると困る。
もしぐちゃぐちゃになって見える場合は .txt を付加したものにアクセスしてください。
# 私の Opera だと何故か HTML として表示しようとする。プレインテキストのはずなんですが。
何でそんなアホなもの作るんですか……大好きだ。
試しに実行してみましたが、カウントダウンの目標日は設定可能でした (デフォルトは無論「Quartett!」発売日)。
これはつまり、発売日が延期してもいいy(ザー
BBInterface について適当にまとめてみた。
今 BBInterface を試しているのだけれど……これはすごい。BBWinSkin かそれ以上だ。いくつかのプラグインは立つ瀬ないぞ。
簡単に云うと簡易プラグイン製造機。例えば「クリックしたら Winamp の再生を開始」するボタンとかが作れる。こういう部品を複数作れて、さらにそれをフレームに格納することができる (フレームは各種プラグインに対するスリットみたいなものだと思えばいい)。
やってることは、
の二つだけ。「コントロール」はボタンやスライダーなどの GUI の部品。割り当てれる機能は bro@m の送信、任意のファイルを開くなど。
他のプラグインと違い自由度が高いので、設定を手書きで行うのは少々面倒。もっとも、大抵のものは BBInterface のメニューから GUI で作れてしまうので気にはならないと思いますが。
面白い。すげー。psyci たん萌え。
また SakeBot か。去年の 11 月や 12 月にも来てたけど、それと比べての変化は UA が変わったことくらい。
拡張子なしの URI (例えば /2003/08/diary) を「ディレクトリにスラッシュ (/) を付け忘れてる」として、スラッシュを付加した URI にアクセスしてくるのはどうだか。404 の嵐だ。
何故か急に Opera7 が起動直後にクラッシュするようになった。\Documents and Settings\whoami\Application Data\Opera\Opera7\profile を消すと起動するようにはなるものの、一旦終了させて再び起動すると即座にクラッシュする。Opera7 を再インストールしても状況は同じ。再々インストールしても状況は同じ。
ふと、最近知人の PC がウィルスに冒されていたことを思い出したので、念のため全てのファイルをウィルスチェックにかけてみた。でもウィルスは見つからない (見つかったらそれはそれで嫌だが)。
そういえば前にも Opera6 で同じようにクラッシュしていたのを思い出したので、以前の状況との比較をしてみる。
……あー、もしや bbLeanSkin (ウィンドウの枠にスキンを適用するプラグイン) が原因か。この間から bbLean を使ってて、bbLeanSkin も常に適用しているし。そうすると今まで Opera7 がクラッシュしなかったのは何故だ。
取り敢えず bbLeanSkin を無効にした状態で起動してみると……ちゃんと動いた。原因は bbLeanSkin との相性の悪さの模様。今までクラッシュしていなかったのは、Opera7 を bbLean より先に起動していて、しかも一旦起動したら PC の電源を落とすまで起動しっぱなしだったからだ (と思う)。ひとまず Opera7 に bbLeanSkin を適用しないようにすることで問題を回避。
bbLean が原因でハングアップするみたい。
BBKeys に以下の設定をし、
KeyToGrab(Escape), WithModifier(Alt), WithAction(Minimize)
以上の条件 (or か and かは調べる気なし) を満たした状態で Alt-Esc を押すと OS ごと持っていかれかけた。幸い Ctrl-Alt-Del は利いたけど再起動等しかできなさそうだった。
まあ、あんまり使わないキーなので潰せばいいか。
bbLean 試用中。
BBWinSKin 1.1 がリリースされたので試してみようと nightly の Blackbox.exe を使おうとしたら何故か OS 道連れハングアップ。以前 xoblite でも似たようなことがあった気が。
そういう訳で bbLean を試しているところ。安定しているようであれば本家から乗り換えようか考え中。
本家 (0.0.82) と比べていい点は:
で、欠点は:
128 バイト以上の行なんてたくさんあるんですが……仕方がないので本家の BBKeys と置き換えています。
今のところ順調に動いている模様。