日記緑ログ

2006/02/03 ~ 2006/02/25

目次

戻る

Blog

画像の貼り付け失敗原因

[Create: 2006/02/03 21:59] [LastUpdate: 2006/02/03 22:38]

原因は画像の名前が

20060201-2006_0201デジカメ画像0033.JPG

とかになっているからのようで。

20060201-2006_0201_0033.JPG

とでも変えれば(数字と英文字だけにする)OKでしょう。

でもIEじゃみれないけどFireFoxなら見えるんですけどね。はじめは、なんで取り乱しているか分からなかった。

ち なみに、でかくなるほうのwidth="640" height="480"をwidth="160" height="120"とかにすれば小さくなるけどまあanimate blogの仕様はわからないからそういった編集ができるのか、あるいはなにか面白設定があるのか分からないのですが。直に編集できるなら話は早いんですが ね。

他にも言ってる人いるか。意味無いか。

一応技術的な(とかいうほど大層なもんじゃないけど)話で言えば、でかくなるほうは

<img alt="" width="640" src="ほげほげ/20060201-2006_0201デジカメ画像0033.JPG" / height="480" title="">

とimgタグで指定されているわけで、IEでも文字コードをあれして何して送信するのですが

IEででないほうは

a href="index.php?imagepopup=38/20060201-2006_0201デジカメ画像0033.JPG&amp; width=640&amp;height=480&amp;amp;imagetext="(長いので略)

と、aタグのhref属性で指定してあるのはさておき、index.phpに?以下のパラメータを渡しているのですが、このなかに英数字以外の文字が入ったときの挙動がIEとFireFoxで違うよと。エスケープしないねというはなしです。

リサイズは…覚えるしかないですね。ツールは…よくわからないけど http://www.vector.co.jp/soft/win95/art/se242146.html このあたりなら結構簡単なんですかね。

以上でございます。

Shift_JIS-2004のテキストを手っ取り早く読みたいんですが

[Create: 2006/02/04 20:21] [LastUpdate: 2006/02/04 20:23]

Shift_JIS-2004テキストビューア

さくっと。適当なんで色々あるかもしれませんが。

.NET Framework 1.1が必要です。ごめんなさい。自分が見れりゃいいや。濃霧が読めりゃいいや的思考。

PDS扱いでOK。ソース付。

今だけ落とせる新開発。そのうち停止するかもしれません。

ニュース・プラス1 無料ストリーミング配信

[Create: 2006/02/06 22:32] [LastUpdate: 2006/02/06 22:42]

日本テレビのニュース番組「ニュース・プラス1」の全国版がストリーミングVOD配信されるそうです。

『第2日本テレビ』で『ニュース・プラス1』の動画配信をスタート!

形式はWindows Mediaで300kbpsです。解像度は320×240。フレームレートは恐らく30fpsかと思われますが、WMVなもので正確な所はわかりません(基本的に可変フレームレートなのでドロップしたりするため)。

ニュースなのでこのぐらいあれば大抵の場合十分でしょう。

ニュースはどうせなら(見られて困るものでもないだろうし)過去のものもいつでも見れるといいのですが、現場では(サーバー側の問題で)難しいでしょうね。

四代目スケバン刑事

[Create: 2006/02/11 15:29] [LastUpdate: 2006/02/11 15:58]

http://www.sanspo.com/geino/top/gt200602/gt2006020601.html

http://www.nikkansports.com/ns/entertainment/p-et-tp0-060206-0009.html

http://www.daily.co.jp/gossip/2006/02/06/204019.shtml

20年ぐらい前にやっていたドラマのスケバン刑事は初代から三代目まであったのですが、このたび四代目を松浦亜弥さんが襲名したとかいうことです。

どうにも三代目あたりの二の舞になりそうな気配と恐らく三代目よりももっとこけるだろうという予感がひしひしとする上に、落胆と、汚されたという想いがあるのは私だけではないでしょう。

私の中では初代と二代目はまったくの神格扱いになっていますから、どうせなら別物としておいて欲しいのですが、それはどうでもいいか。

ちなみに色々とあれですが、この場合、技の一号、力の二号というような勢いですが、投げのバリエーションは二代目のほうが豊富です。力関係は恐らく五分ということで(公式のファンブックにそう書いてある)すが、初代は殉職という設定になっております。

二代目なんて名前が偽名で重ねて麻宮サキと偽名ですからね。エンディングでは平凡な学園生活に戻ったのに、三代目とのコラボ劇場版では二代目と仲間はいつのまにかばらばらだったりします。どうでもいい突込みですが。

で、三代目は惰性によったような部分が大きく、右利きですし、どちらかといえば神がかった人気は無かったような気がします。

恐らくは人間関係のバランスは二代目が一番よく表現されていますし、スケバン刑事としての強さは初代かと。まあ二代目は他の意味でも最強ですが、初代は原作を再現する意味があったこともありますし、唯一孤独に戦っていますし、ジンは別の意味で最強です。

三 代目は少々方向性が微妙なのでさておきますが、スケバン刑事襲名したのは三姉妹の末妹ですが、姉より弱いです。リーダー格じゃないです。あと精神的にも未 熟なキャラとなっております。突っ張ったというか強さがスケバンの売りだと思う向きがあるのでこのあたりで私は若干マイナスということになっております。

さて四代目ですが、田中秀夫じゃないのか…。ここですでに見る気持ちはありませんが、松浦亜弥は個人としてはあまり好きではありません。まあどうでもいいか。

ア クションですが、シリーズを通して最強のアクションをしたのはお京(相良晴子)以外にいないので、あれは超えられない壁でしょう。え?スタント無しなの? というシーンが盛りだくさんです。豆知識ですが。次点は斉藤由貴でしょうか。立ち泳ぎ30分の人です。いや、撮影の合間ぐらい陸に上がれとか。

さて、問題は服装です。

>長かったセーラー服のスカート丈もひざ上になり、戦闘モードの衣装も用意される。

こ れはいけない。ああ、いけない。長いスカートの何がいいかといえばまあ露出が少ないことは精神の質を表すのですが、長いのは和に通じる部分があるのもポイ ントなのです。和服で膝上は基本的にありませんので。二代目の仲間としての矢島雪乃(=お嬢様)はしょっぱな和服で登場した、真面目な優等生タイプなので すが、そういったキャラクターでも当時グレた人がはくロングスカートは違和感が無いものです。あとはロングだと布がひらひらして動きがあっていいのです。 ロングヘアーが好きな人でごめんなさい。

さらに、戦闘モードの衣装がよくない。劇場版でもしっかりとうたわれていたようにセーラー服こそ戦闘服であって、わざわざセーラー服に着替えてまで戦闘していたんです。

というわけで、悪いけどまったく期待していないのですが、まあ別物としてこれはこれで楽しめばいいんじゃないでしょうかね。

FreeTypeで縦書き用グリフ表示

[Create: 2006/02/12 20:22] [LastUpdate: 2006/02/12 20:55]

The FreeType Project

FreeType 2.1.10 を使いました。

環境はWindows 2000 SP4です。

ち なみにコンパイラは日本語対応がいいのでBorland C++ Compiler 5.5.1(しかしいいかげん古臭い気もするのだが未だにMingwあたりに移行する気が起きていない)です。余談ですがBorlandは先日開発環境製 造部門の買い手を探していたのでもはやBorlandは駄目なのかもしれません。好きだったのに。

あと、フォントはTrueTypeで行きます。BDFとか言われても知りません。

検証はMSゴシックとか、和田研細丸ゴシックとかXANO明朝あたりです。XANO明朝はUnicode版。和田研細丸ゴシックはcharset.infoのunicmap 1.09でUnicodeマッピングを追加してUnicodeで使ったりしていますが、ついさっき、変換していない生の(つまりShift_JISエンコードの)ものでも縦書き表示が出来そうなことを確認しました。

実際は十分な検証が必要だと思いますが、大雑把になんかいけてる気がする程度です。ご了承ください。

で、日本語での情報が結構少ないような気がするのでちょっと参りましたが、フォントのGSUBテーブルを引っ張ってきて、自分でばらしてやる必要があります。

OpenType Layout Common Table Formatsとか

The Glyph Substitution Tableあたりを見て適当にやっただけです。

Class Definition Tableの類とかDevice Tableは使っていません。つまりは手抜きですが、FeatureもFeatureTagが'vert'のもの、LookupListの SubTableもLookupType = 1のSingle Substitution Subtableしか読んでいません。'vrt2'とかもやらないとまずいのかもしれませんが、とりあえずなんとか表示だけしたかったのでこの程度で。

Lookup tableのLookupTypeによってSubTableが

1 Single

2 Multiple

3 Alternate

4 Ligature

などと変化して面倒です。いやSingleしか読んでないのですが。

で、 このGSUBはFreeTypeのFT_OpenType_Validateを使ってあげれば取得できます。いやあ便利だ。ただ、一つのヘッダだけ取得し たくて他のパラメータにNULLを渡すとなぜか失敗しますので全部渡してあげないと駄目っぽいです。もちろん他のテーブルも取得できますが、ここではパ ス。ちなみにBigEndianのようです(ろくに規格も把握していなくてすいません)。

肝心の表示処理のフローですが特に難しいところはありません。

FT_Get_Char_Index でキャラクタのグリフを取得して、

そ れを読み込んだデータで(対応はまずいのだけれども)Scriptはさておき、FeatureからFeatureTagが'vert'のものをとり、 LookupListIndexで対応付けられているLookupの中からLookupTypeが1のものをとり、SingleSubstFormat1 か SingleSubstFormat2 になりますが、それの Coverage をみて、glyphIDが範囲内か確認し、SingleSubstFormat1 ならDeltaGlyphIDをもとのグリフ番号に足してやればいいし、SingleSubstFormat2 ならば Coverage 内のglyphのインデックスをもらって、Substituteの対応するインデックスのものをそのまま使えばいいのです。それらが縦書き用のグリフの IDになります(16ビット整数なのでグリフ数が6万5千越えとかしたらどうなるのか私にはわかりませんが)。

で、そのグリフIDを使ってFT_Load_GlyphしてFT_Render_GlyphすればOKと。そういう感じのようです。

いいかげんにしか試していませんがなんとなく希望が湧いたのでよし。

EVT_SCROLLWIN がらみ

[Create: 2006/02/17 20:17] [LastUpdate: 2006/02/17 20:36]

wxWidgets を適当に触ってみてますが、慣れてくると面白そうな感じです。

まだまったくこれっぽっちも慣れていませんけれど。

ビジュアルなデザイナというかフォームデザイナのようなものをまったく使っていないあほなので、複雑なデザインは知りませんが、今回はスクロールバーについて、それもWindow付属のスクロールバーについてです。

まあFrameでスクロールバーを表示しても何でもいいのですが、今回は面倒だったのでPanelにしました。wxPanelをpublic継承してMyPanelを作成。なんて安直な名前なんだ。いいんです。どうせsampleのminimalから作ってるんだし。

BEGIN_EVENT_TABLE(MyPanel, wxPanel)

EVT_SCROLLWIN(MyPanel::OnScrollWin)

END_EVENT_TABLE()

てな具合にしてイベントを掻っ攫います。

いやもうこれだけのために継承ですけどね。

classは

class MyPanel: public wxPanel{

public:

MyPanel(wxWindow* parent):wxPanel(parent),m_isVertical(false){}

void OnScrollWin(wxScrollWinEvent& event);

private:

DECLARE_EVENT_TABLE()

};

とりあえずこのぐらい。コンストラクタにやる気が感じられません。

で、イベント関数を

void MyPanel::OnScrollWin(wxScrollWinEvent& event){

SetScrollPos(event.GetOrientation(), event.GetPosition());

}

などとしてみますが、うまくいきません。event.GetPosition()が常に0を返しています。なぜ?

よく分からないので

BEGIN_EVENT_TABLE(MyPanel, wxPanel)

EVT_SCROLLWIN_TOP(MyPanel::OnScrollWinTop)

EVT_SCROLLWIN_BOTTOM(MyPanel::OnScrollWinBottom)

EVT_SCROLLWIN_LINEUP(MyPanel::OnScrollWinLineup)

EVT_SCROLLWIN_LINEDOWN(MyPanel::OnScrollWinLinedown)

EVT_SCROLLWIN_PAGEUP(MyPanel::OnScrollWinPageup)

EVT_SCROLLWIN_PAGEDOWN(MyPanel::OnScrollWinPagedown)

EVT_SCROLLWIN_THUMBTRACK(MyPanel::OnScrollWin)

EVT_SCROLLWIN_THUMBRELEASE(MyPanel::OnScrollWin)

END_EVENT_TABLE()

などとしました。

EVT_SCROLLWIN_THUMBTRACK と EVT_SCROLLWIN_THUMBRELEASE は上記のまま流用しています。それで動くようです。というか当然動いてくれるぜ。

その他の連中は、EVT_SCROLLWIN_LINEUP で event.GetPosition() が0を返してきた時点で event.GetPosition() を使うことをあきらめ、自分で適当に計算することにしました。面倒。

要するに

void MyPanel::OnScrollWinLineup(wxScrollWinEvent& event)

{

int newpos = GetScrollPos(event.GetOrientation()) - 1;

if(newpos < 0)

{

newpos = 0;

}

SetScrollPos(event.GetOrientation(), newpos);

}

こういった形。やる気無い。

ついでなのでキー入力でもやれるようにイベントテーブルに

EVT_KEY_DOWN(MyPanel::OnKeyDown)

等と追加。

void MyPanel::OnKeyDown(wxKeyEvent& event){

switch(event.GetKeyCode()){

case WXK_UP:

// SetScrollPos で適当にやっつけコード

break;

// 以下略

}

}

等としておきました。

ど うでもいいんですが PageUp キーと PageDown キー(98x1だとRollDown と RollUpですな)は WXK_PRIOR と WXK_NEXT なんですね。始め WXK_PAGEUP とか WXK_PAGEDOWN を使って動かなくておかしいと思いましたよ。ええ。

余談も余談ですが、bcc32でビルドしたブツをUPXで圧縮してやるとこけるようなので不思議です。何が悪いんだろ(でも他のコンパイラを試すのは面倒なのでやらない)。

(インデントはつぶれてると思いますが許してください)

テキストレンダリング

[Create: 2006/02/18 21:38] [LastUpdate: 2006/02/18 21:40]

AoviewでJIS X0213表示

いやもう、適当もいいところなんですが、UTF-16のテキストを読み込んで表示してみようかなと。面倒なのできちんとした処理(カーニングとか合成とかそのたもろもろ)はこれっぽっちもしていません。

サロゲートペアで表現されているものもでています(レンダリングはFreeType、ガワはwxWidgets、フォントは和田研細丸ゴシック2004をそれぞれ使用)。

ただですね、FreeTypeを適当に使っているためにめちゃくちゃ遅いんですよ。FreeTypeにはそのためのキャッシュも用意してあるようなのですが使い方がいまいち分からない状態です。

ちなみに、折り返しとか、横にスクロールとかはまだ作っていません。

まあ参考になるかもしれないので欲しい人がいたらプレゼントするかもしれません。

少々疲れました…。

wxConfig で設定保存

[Create: 2006/02/21 20:34] [LastUpdate: 2006/02/21 20:34]

まず本題に入る前にひとつ。

Borland C++ Compiler 5.5.1でwxWidgetsを使うと(バージョンは2.6.2ですが以前のバージョンでも同じでしょう)、wxLocaleあたりを使うと面白いようにうまく動きません。

intl.cppを見ていくと

bool ret = Init(name, canonical, retloc,

という行があるのですが、これは

bool ret = Init(name, canonical, szLocale,

でしょう。

ちなみにintl.cppは-O2で最適化するとこけるので

#if defined(__BORLAND__) && !defined(__WXDEBUG__)

// There's a bug in Borland's compiler that breaks wxLocale with -O2,

// so make sure that flag is not used for this file:

#pragma option -O1

#endif

といった記述があるのですがこれってどうやったらpragma実行されるんでしょうかね。

defined(__BORLANDC__)なら通るんですけどね。これも記述ミスなんだろうか。

ともかくそう変更するとReleaseでも落ちません。

さて、本題。

wxWidgetsには設定を保存するためのクラスがしっかりあります。

wxConfig というのがそれなんですがこれを使うとWindowsではwxRegConfigあたりに(16ビットではwxIniConfigだとか)、*nixあた りだとwxFileConfigあたりにマッピング(というよりはdefineか)されるということです。レジストリは肥大化すると遅くなる(とはいって もNTカーネルならそれほどでもない)し、不安定になる(ともいうもののNTカーネルだとそうでもない)わ、基本的にコンパクションはできない(98以降 ではDOSモードでコンパクションできるのだが、NT系ではできない。が、HDDがFATなら98からコマンドを拾ってくればできないこともない。でも NTFSのほうがいろいろといいので基本的にできないと思ったほうがいいだろう)し、ということで嫌う人が多数です。マイクロソフトでもでかいバイナリと かはレジストリにいれちゃいやん。といっているので(その場合はファイルに書き出してファイルのパスをレジストリに入れなさいということになっている。 ボーダーは大体1kByteだそうだ。)どうなの?という気持ちがある。

Win16では(テキストベースの)INIファイル

Win32では(バイナリデータベースの)レジストリ

.NET世代では(XMLの)configファイル。あるいは構成ファイル。

と いう宣伝をしているMSですが、ユーザーはINIのまま止まっているような気がします。まあXMLベースは取って代われるポテンシャルはあるような気がし ますが、書き下ろすとでかくなるし、INIより遅そうだし、そもそも階層構造ぐらいはINIでもできるしとか、使い方は煩雑だしとか、結構散々です。

まあさておき、UNIX系ではずっとテキストベースなような気がしますが、それはそれ。wxFileConfigを使うのはWindowsでももちろん可能なのでそうしてしまうことも可能です。今回はその方向で。もちろん変更も容易なので。

このクラスもいろいろ面倒だったり、便利だったり多機能なのですが、簡単に済ませるなら

wxFileConfig *config = new wxFileConfig();

ぐらいでもOKです。コンストラクタの引数は

appName

vendorName

localFilename

globalFilename

style

などとあるのですがデフォルト値だと、おそらくHOMEに設定ファイルが置かれると思います。Windowsだと(あるなら)Documents and Settings以下のアカウントのフォルダに入れられるっぽいです。ちなみに拡張子がini。

INIファイルのセクションだったり、レジストリのキーだったりするところは

config->SetPath(wxT("/Application"));

で指定します。階層分けはスラッシュで。

ちなみにパスを移動しまくる場合で多階層の場合はいろいろこんがらがることが予想されますから

wxString strOldPath = config->GetPath();

config->SetPath("/Foo/Data");

...

config->SetPath(strOldPath);

などとした関数を呼び出し呼び出しすることが推奨されております。

config->Write(wxT("foo"), wxT("bar"));

などとすれば値が書き込まれます。

書き込みは文字列、整数(long)値、浮動少数(double)値、論理(bool)値がサポートされております(オーバーロードで)。

読み込みは

config->Read(wxT("foo"), &variable);

などとすればいい感じです。ただ、オーバーロード関数が豊富すぎて書き方が不揃いになるかもしれないので注意が必要でしょう。

ちなみに一階層で使うとまるっきりWindowsのiniと同じような構文になります。

とりあえずこんなところですがもっと便利に使うための機能があります。そのへんは適当にリファレンスを見るといいんじゃないでしょうか。

BCC32とUPX

[Create: 2006/02/23 16:48] [LastUpdate: 2006/02/23 16:57]

wxWidgetsを使った実行ファイルをUPXで圧縮するとスタートアップ時にエラーが出て起動できないなあ、おかしいなあと思っていてぱらっと見たんですが、どうも

CW32MTI.LIB

あたりをリンクしているんですね。

これはランタイムライブラリであるCC3250MT.DLLを使うようにするためのライブラリで実行ファイルが若干小さくなる特典があるのですね。

ちなみにシングルスレッドだとCW32I.LIBをリンクしてCC3250.DLLを使うようになります。ね。

これは、配布のときも神経質になりそうなのでやめたほうがいいと思います。素直にCW32MT.LIBやCW32.LIBをリンクしましょう。wxWidgetsがでかいのでさほど変わったような気がしませんし。

wxWidgetsなら

make -DRUNTIME_LIBS=static ほにゃらら

とでもしてビルドすればいいんじゃないでしょうかね。

で、こうしてやるとUPXで圧縮してあげてもきっちり起動するようになってくれます。どういう相関関係になるのかはわかりませんがこれで一段落というところでしょうかね。

wxWidgets Window::GetScrollPos と bcc32

[Create: 2006/02/24 10:58] [LastUpdate: 2006/02/24 11:03]

なめてます。

releaseモードにするとなんか変だなあ。スクロールがおかしいなあ。

GetScrollPosが0しか返してこないなあ。と思ってごにょごにょして眺めてみたんですが、

wxWidgets/src/msw/window.cpp line 840 のところに

inline int GetScrollPosition(HWND hWnd, int wOrient)

というのがあるのです。

GetScrollInfo でPOSを拾って返しているのですが、ためしにGetScrollPosを使うと動きます。ううむ。まあどちらでも32ビット値で問題は無いはずですが MSはGetScrollInfoを推奨(GetScrollPosは過去の遺物扱い)していますから、そのままにするのであれば、

int wxWindowMSW::GetScrollPos(int orient) const

の中に直に展開してやるのがいいのかな。と思いきや、inlineをはずすとすんなり動きました。こんなところ特にパフォーマンスも重視しないのでこれでいいや。

今やってるビューアでの悩み

[Create: 2006/02/25 20:47] [LastUpdate: 2006/02/28 18:31]

さて、前前からwxWidgetsをとFreeTypeを使ってJIS X0213:2004形式に対応したビューアをどうのと言っているのだが幾つか悩みがあるのです。

設定のダイアログ

ダイアログを作ったほうが色々と親切でというかわかりやすいのはわかっているのですが、結構面倒です。

フォント

FreeTypeに書かせているのでファイル名がぜひともほしいのです。

でもファイル選択のダイアログだとフォントフォルダ内(Windowsね)のファイル名は取れません。

かといってフォント選択用のダイアログだとファイル名が取れません。

ローカライズ

wxWidgetsには専用の機能があるがディレクトリが鬱陶しい。

----2006/02/27

ローカライズは専用のを利用しました。まあいいや。

ダイアログを作ろうとしてごにょごにょしていたのですが、力尽きました。挙動が怪しすぎます。もういやだ。

一応書いておきますが、Borland C++ Compiler 5.5.1 + wxWidgets 2.6.2 という環境です。リソースエディタというかXRCエディタであるところの

wxGlade

XRCed

等は使っていません。Python、あるいはwxPythonが鬱陶しい。いやユーザーには伝播しませんがね。さらに

wx-Devcpp

等の統合開発環境も使用しておりません。

が、XRCを手でごりごり書くのは面倒だし、コード上で書くとますます面倒だしということで、今後何か使うかもしれません。

さて、ローカライズですが、wxWidgetsはgettextの形式をサポートしておりというか内蔵しており、そういった形でローカライズが容易に可能になっています。WindowsならGnu Win32あ たりでgettextを拾ってくるといいと思いますが(UNIX系ならそもそもあるような気がしますが無いならPortsでもRPMでも何でもいいので入 れたらいいでしょう)、gettext-0.?.?-bin.zipだけではなくgettext-0.?.?-dep.zipも必要です。気をつけて。

xgettext -k_ *.c* *.h* -o a.pot

とでもして、書き出して翻訳してja.poとでもしておいておいて、必要になったらもう一回やってa.potの必要な部分を翻訳しなおし、

msgmerge ja.po a.pot -o ja.po

とでもしてマージし、

msgfmt -o ja.gmo ja.po

とでもしてやっつけ仕事OKです。

ja(日本語)なので

app/ja/LC_MESSAGES/*.mo

とでもすりゃいいんじゃないでしょうかね。