トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

独り言日記(2005/11)

独り言日記

掲示板を更新しました(2005/11/30)

ft-lab.ne.jpの掲示板を作り直しました。過去の履歴はそのままデータベース移行して生かしてます。

http://ft-lab.ne.jp/fl_bbs/bbs

デザインの一新と、UTF-8対応(日本語以外の他の言語体系でもフォームに入力・表示が可能です)、[code]〜[/code]で囲む処理の実装、を行いました。

まだ「削除」ボタンは使えない(削除キーが使い道がない)ですが、それ以外は完成しています。Javaでリハビリ的に作ったのですが、今度こそサーバが落ちやすい原因が回避できてますように・・・・

しかし、前は無駄な恥ずかしくなるようなコーディングが多かったなぁと。時間があればこのサイトでもシステマチックなことを表に出していくことにします。

Apache2入れ替え(2005/11/29)

このサイトのApacheが古かったため、新しいのに入れ替えました。BBS復旧は、もうしばらく時間がかかりそうです。ApacheとJava(tomcat)をつなぐモジュールとして「mod_jk2」があるのですが、前はこのビルドが中途半端な状態のものを入れてしまってました(というか、ずっとえらい不安定運用してたなぁと(^_^;;)。

RedHat9のデフォルトのApache2(RPMインストール)だといろいろ制約がありますね。Apache2をソースからビルドしてmod_jk2もリビルドをかけたらどうやら安定していそうでした。またこの辺の奮闘記はTipsとして書いておきますね。

物理でとっても参考になるサイト(2005/11/25)

すばらしいサイトを見つけました。

「物理のかぎしっぽ」
http://www12.plala.or.jp/ksp/index.html

高校物理・数学で止まってしまった人や復習のために非常に参考になります。勉強というよりも、楽しい書き方で図も多いですので「なるほど!」と思いながら読ませていただいてます。

誰もが言うのですが、人生はいつまでも勉強の繰り返しで終わりはないですねぇ。私もまだまだ中途半端なんで勉強していかないと。

以前量子コンピュータの本を買ってきたのですが、さっぱり理解できませんでした(T_T)。といっても、学生時代はレイトレーシングのプログラム、アフィン変換の行列すらも理解できずに「きれいだなぁ」と眺めること専門でしたので(中学生くらいかな、「Oh!FM」というソフトバンク社の雑誌があり、そこに記事があった記憶があります)、いずれは理解できるようになるかな、と楽観視してます。

またまた鯖ダウンしてました(2005/11/24)

う〜む、なぜだろう・・・・またまたft-lab.ne.jpのサーバが落ちてました。しばらくBBSのほうを閉鎖して原因探ってみます。土日あたりでメンテすることにしますです。ログを見ても特に目立ったアタックなどはなかったのですが・・・

鯖ダウンしてました(2005/11/23)

真夜中にダウンしてましたので、サーバを再起動かけてもらいました(すばやい対応に感謝です、さくらインターネットさん)。原因はいつもどおり分からないですねぇ(^_^;;。まれにハングするんだよなぁ、めぼしはついているのですが(Javaで使ってるmod_jk2かな?)。

セキュリティーログを見ると、sshへのアタックが結構ありました。fromが日本の会社もありますねぇ、、、、表には出しませんがリストアップしております。日本語名でよく使われるようなユーザ名でたたいてますが、うちには表に出している情報以上のものはないので入ったところで何もないですよ(苦笑)。

Nortonのアウトブレイク警告は直っているようです。現在のLiveUpdateの更新で改善されてました。

Nortonが・・・(2005/11/22)

アウトブレイク警告(「W32.Sober.X@mm」が非保護)というのがいきなり出てきました。LiveUpdateかけろとのことでしたが、かけたところで警告は出っ放し、はて?

2ちゃんねるのセキュリティ板見ても同じ症状の方もいるようで(こういうときは便利ですね)、ちょっとわからんです。次のアップデータで解決してほしいもんですが・・・。ウイルスに感染してしまったのかとびっくりしました。

パソコンの「パ」も知らない人達の世界(2005/11/21)

普段私たちが当たり前に使っているインターネットやメール。これをパソコンや携帯電話を使ったこともない人に教える、というのはえらい苦労しますね。

いろいろな情報を仕入れるのにネットは有効だよ、ということで布教活動に行っていたのですが、メールってどんなもん?というのを教えるのにさてどうしようか、とちと悩みました。

住所に値するのがメールアドレスではないしなぁ、、、。住所というとURLを指したほうがそれっぽいと感じましたので。手紙みたいなものがメールでメールアドレスは電話番号みたいなもの、と言っておいたのですが伝わったんだろうか?(そもそも、メールのことを 電話のようにすぐに受けて返事を返すものと思っていた模様。「電話」という比喩説明だとたしかにそう感じるわなぁ)

プロバイダ選びからネットワークの接続(配線含む)、って素人さんにはたしかに壁になりますね。電話回線も使えるようにしてネットも有効にするには(ADSLの場合は)「スプリッター」というのがいる、という説明をすると、モデムのような機器(というか、分からない人から見ると電気の通っている得体の知れない「機械」)と勘違いされて「そうきたか!」と思ってしまいました(^_^;;。

とそんなこんなで、説明の際にはパソコンを使わない方々にも視点をあわせないとダメだなぁと再認識しました。ITの常識は別の世界では通じないですね。ただ、昨今はネットを利用しないとどんどん情報格差が開いていくため、ちょっとでも理解できている人が教えていくことも必要だとは思ってます。

で、これは実は私の実家の話です(苦笑)。もう昨今の小学生の子でもパソコンは使いこなせてるわけで(学校でやってるしね)、縁がなかった人はどんどん差が開いていくなぁと。(ただ、うちの親の友達のおばちゃん連中はメールを使ってたりしてるので、それでやる気になったらしい。恐るべし、ネットの浸透度。)

続・UTF-8(2005/11/17)

JavaですべてUTF-8で扱ったとしても、
フォームでの入力文字列処理の取得・変換などで化けてしまいますね。

という部分、なんてことはなかったです。

str = request.getParameter("f_in_text");
str = new String(str.getBytes("8859_1"), "UTF-8");

みたいにフォーム(name="f_in_text"とします)から取得したテキストをUTF-8に変換してあげると万事OK。HTMLソースをUTF-8で統一すると、後は何の苦労もせずに多言語対応できてます。早トチリすみません(^_^;;。

これで、in(フォームからの入力)とout(HTMLとしての表示)両方ともOKかな。

しかし、今までシステム開発はいろいろしたのですが 改めて見返してみると、日本語のしかやってなかったなぁ(英語はShiftJISのシステムでも問題ないですしね)。多言語を考えると、いろいろ新鮮に感じます。

UTF-8(2005/11/16)

多言語対応のWebアプリを作る場合は、UTF-8であるのが便利でいいのですが この文字コードについてちょっと掘っていました。Webブラウザのフォーム入力エリアでのコピー&ペーストは普通に処理できますね。

なんと、FreeStyleWiki(EUCで文字コードを管理)に日本語でない文字列を貼り付けるときちんと反映されるじゃないですか、これは知りませんでした。

성공

上記はハングルでの日本語で言う「成功」の意味になるらしいですが(自動翻訳様のお答え)、FreeStyleWikiのソース上では以下のようになってます。

う〜む、FreeStyleWikiでも「&#xxxx;」のテキストを入れると自動的に変換処理が起きてしまいますね。あえて多言語を意識しないと完全にはいかないかなぁ・・・。

UTF-8で扱うと、全角1文字(?)が3バイトで済みますので やっぱり多言語化を考えるとUTF-8で行くべきですねぇ。XOOPSではハングル文字を貼り付けてもうまく表示できませんでした。うちの掲示板でもダメです(^_^;;。JavaですべてUTF-8で扱ったとしても、フォームでの入力文字列処理の取得・変換などで化けてしまいますね。意外とやっかいかも。

英語圏の人が、よく「多言語対応しました」というシステムで 実は多言語対応できてない、というのを目にします。表示だけじゃなくUTF-8を使ったとしても何かしらの処理をしないといけない部分がある、というのも原因かもしれませんね。

今作っている(微妙に仕事ではないやつですが)システムのハングル表示バージョン。

このためにJavaのテンプレートエンジン作りました(たぶんJavaのテンプレートエンジンはStruts(これだとフレームワークかな・・・もう使い方忘れてしまいました(^_^;;)とかが有用だと思うのですが、リハビリもかねて)。

有名どころですが、翻訳には欠かせないものとして以下のサイトを重宝してます。

http://www.excite.co.jp/world/english/

英語・韓国語・中国語に対応してますので、大変役立ってます。ここの変換後のテキストをコピー&ペーストしてテキストエディタに持っていっても、問題なく使えますね。

MacOSXバージョン(versリソース)の文字化け(2005/11/14)

OSX 10.4.0 〜 10.4.2のCarbonアプリにおいて リソースの"vers"に日本語を入れると化ける、というのがありました(これは、ファイル情報の「バージョン」にて表示される文字列です)。OSX 10.4.3ではこの問題は直っています。なお、OSX 10.3.xでは問題なかったので、一時的に先祖がえりして10.4.3で直したのかな?

MacOSXでのウィンドウリージョンアニメーション(2005/11/14)

ちょっと日が過ぎましたが、MacOSXでのリージョンアニメーションについてです。これは、CreateCustomWindowで生成した非矩形のウィンドウに対して、パラパラアニメのようにリージョンおよび画像を入れ替えてアニメーションさせることを目的とします。

たとえば、スクリーン上を飛び回る蝶を表現するとしましょう。

非矩形ウィンドウを実装するには、

  • リージョン(kWindowMsgGetRegionイベントを受け取ったときにMapRgnで指定)
  • 描画画像(画面再描画のイベントを受け取ったときにCopyBitsで描画)

の2つの要素が必要です。リージョンはウィンドウ自身をマスクするもの、画像はその上にかぶせるものに相当します。

アニメーションさせる場合は、構造体配列を作って「リージョン(RgnHandle)」「画像(GrafPtr)」をフレーム数分あらかじめ格納しておきます。これをタイマーイベントのタイミングで入れ替えてあげればアニメーションできそうです。タイマーは「InstallEventLoopTimer」で与えます。

では、非矩形ウィンドウおよび画像の更新をOSに促してあげるのはどうするのでしょうか?リージョン・画像は分けて考えます。第一のトリガーはタイマーイベントです。これは周期的に与えることができます。

画像の置き換え

画面の「再描画」ですので、ウィンドウイベントとして再描画をキックすると解決しそうです。

Rect rec;

// WinRefはウィンドウ自身のWindowRef情報
// ウィンドウの矩形領域を取得する ==> recに格納される
GetWindowBounds(WinRef, kWindowGlobalPortRgn, &rec);

// 指定の矩形内の再描画を促す
InvalWindowRect(WinRef, &rec);

しかし、これでは駄目だったりします。たとえば、スクリーン上のメニューを選択中やポップアップメニューを出したときは、この間中の描画が反映されません。この別処理中もタイマーは動いているわけですので、強制的に描画を行ってやります。

どうするのかというと、

GrafPtr oldPort, thePort;
Rect rec;
RGBColor col;

// ポートを保持
GetPort(&oldPort);

// ポートを描画先のWinRef(WindowRef)に変える
SetPortWindowPort(WinRef);
 
// 描画色を黒に初期化(CopyBitsで影響を受けないようにするため)
col.red   = 0;
col.green = 0;
col.blue  = 0;
RGBForeColor(&col);

rec.left = 0;
rec.top  = 0;
rec.right  = rec.left + 画像の幅 ;
rec.bottom = rec.top  + 画像の高さ ;

GetPort(&thePort);  // カレントのポートを取得

// hImg(GrafPtr) に画像情報が入っている。
// CopyBitsで hImg ==> thePortに画像コピーを行う。
CopyBits(GetPortBitmapForCopyBits(hImg),
         GetPortBitmapForCopyBits(thePort),
         &rec, &rec, srcCopy, NULL);

// ポートを元に戻す
SetPort(oldPort);

のようにダイレクトにCopyBitsを呼んであげてます。再描画イベントがキックされたときに呼ばれる描画処理をそのまま呼んでいるだけです。注意点として(これはOS9以前からあった決まりごとなのですが)、CopyBitsする前は RGBForeColorで描画色を黒に設定するようにしてください。これは別のところで描画色が変わったままだと、CopyBitsが変な色づけになることがあるためです。

これで、描画する画像に関してはアニメーションできてます。次に外枠であるリージョンのアニメーションです。

リージョンの置き換え

たぶんですが、OSのバグがあって まともなやり方では解決できません(OSX10.4.3でも)。OS9とOSXで挙動が違う、というやっかいな問題も絡んでます。

コールバック関数の「kWindowMsgGetRegion」イベントを発生させるときに、引数にRgnHandleがありますのでこれを変えてあげるといい、というのが分かります。では、「kWindowMsgGetRegion」を強制的に発生させるには?

InvalWindowRect/InvalWindowRgnがトリガーっぽいのですが、これでも呼ばれませんでした。

トリガーはなぜか「SizeWindow」です。

SizeWindow(WinRef, 画像の幅, 画像の高さ, false);

OS9では、タイマーイベントでアニメーションのタイミングが来るたびに上記のようにSizeWindowを呼んであげると、無事リージョンアニメーションが行われます。リージョンを変えてから再描画を行うといいでしょう。第四引数は再描画する場合はtrueですが、どうせすぐ強制的に再描画するわけですのでfalseにしてます。

ですが・・・・OSXではこれだけではリージョンアニメーションできません。SizeWindowで「画像の幅」「画像の高さ」をピクセル単位で指定するのですが、これが固定値のままだとリージョン君が落ち着いてしまって、リージョンのアニメーション処理を怠けてしまうようです(よく分からないと思いますが、マジでそんな感じです^_^;;)。

頻繁にSizeWindowで うにょうにょ突っついてあげないとアニメーションしてくれません。回避策としては、「1ドットくらい拡大してSizeWindowを行い、すぐに元のサイズに戻す」、これです。下記のソースではフレームが更新されるたびに幅が「画像の幅 + 1、画像の幅」次の回では「画像の幅 + 2、画像の幅」「画像の幅 + 1、画像の幅」「画像の幅 + 2、画像の幅」のように繰り返されます。

// 画像をわざと揺らす(1、2、1、2ドットと順繰りに変化させて、幅を変える)
static int rx = 1;
SizeWindow(WinRef, 画像の幅 + rx, 画像の高さ, false);
if(rx == 1) rx = 2;
else rx = 1;

// 画像を元のサイズに戻す
SizeWindow(WinRef, 画像の幅, 画像の高さ, false);

なんという無駄!!でも結局これしか回避策はありませんでした。1-2ドットの変化なら、見た目上は気がつきませんのでスムーズに動いているようには見えます。ちらつきも起こりません。

実際、ウィンドウアニメーションを使うアプリにどれだけ出会うかは分かりませんが、少なくともMacでは見たことがないです(時計とかで円状に抜くのとかはありますが)。結局はこの手の問題が絡んでいるのかなぁと思ってます。

まだまだ他にも問題がある箇所があるのですが、OSがバージョンアップしたからといって改善されない部分も多いですね<Mac。Macでの開発では、OSのバグ(もしくは作法が分からないこと)に悩まされることが多いです。逆に、押さえるところを押さえると強みにはなるのですが・・・。Mac対応ツール(Shadeとか)で落ちやすかったりOSバージョンアップで動かなくなったり、というのもこのへんの苦労を背負わされてるのかもしれません。

Wikiでのサイト管理(2005/11/13)

ずっとこのサイトでは FreeStyleWikiで管理しているのですが、なにげに総ページ数を数えたら130ページを超えてました。ちょっと一部のコンテンツが重くなってきたなぁと感じてきてます。Perlでファイルにてページ管理ですので限界が近いのかなぁ。でも、非常に役立ってますし作者様には感謝です。

現状ではある意味、実験的にページを追加していて(しかし、一応は何かしらに使えるかもしれない情報を記述しているつもり)、もっと大量(たとえば何十万ページとか)に扱うにはデータベースに蓄えていくようにしないといけないかも、と思ってます。

ほか、こうしたい、とか個人的な要望がWikiに対してあったりします。今ちょっと時間に余裕があるのでシステム化してみようかなぁ・・・。

USBフラッシュメモリ(2005/11/03)

USBフラッシュメモリを買ってきました、256MBで4000円切ってるんですね、安くなりましたねぇ。といいつつ、実は今までフラッシュメモリなるものを買ったことがなかったので便利さを味わってるところだったりします。

Win/Mac間のデータの移動はローテクですが(手元にHUBがないので)CDに焼くか、一度仕事用サーバにネット経由でアップしてケーブルを差し替えて再びダウンロード、とか手間なことをしてました。が、さすがに面倒だったので・・・・。

しかし、OSXでUSBフラッシュメモリを抜くときってゴミ箱にドロップするだけでOKなんだろうか?Macでは初めて使ってみたのですが・・・・。ゴミ箱にドラッグで持っていってデスクトップからアイコンが消えた後、何もメッセージが出ない状態で抜いたのですが、これでデータが消えてしまってました(再フォーマットしてください、とか出てましたし)。う〜ん、抜くときはWinでは問題なくいけたのですが、Macでは(ゴミ箱に入れても)USBメモリのランプは点灯したまま。今はMacの電源を落としてからUSBメモリを抜いてます。でも、隠し属性のゴミが大量に。・・・な、何か間違ったことしてる予感・・・・。

OSX 10.4.3(2005/11/03)

最近出たOSX10.4.3アップデートですが、内部的にも改善しているみたいです。まず、CreateCustomWindowのアップルのサンプルがまともに動くようになってます(以下のサイトのもの)。

http://developer.apple.com/samplecode/CustomWindow/listing3.html

リージョンの勝手にトリミングは、まだOSX10.4.3でも改善はされてませんでした。きちんと自前で事前にトリミングしないと以下のようになります。

この問題は、OS9ではリージョンは正常なのですが座標がずれてしまいます。

Shade8プラグインSDKに関しての情報、その他いろいろ(2005/11/02)

ココにいろいろ追加しておきました。どうもtexture_interfaceが全滅っぽく、まともに動かないですね。その他は動いていたのですが、多少変更がいる箇所があります。注意点は書いておいたのですが、また何かあったら追加しておきます。

ようやく、1つ大きな仕事が終わりました。日記でずっと書いているMac関連がそうなんですが、約1ヶ月で10本のミニアプリケーション開発でWin/Mac両方対応、という壮絶なものです。Winは98からXPまで、MacはOS9.0からOSX10.4.3まで。アプリの性質上、FlashとかDirectorで楽はできないんですよ。C++でカリカリです(^_^;;。1人でプログラムしました。おかげさまで遅れも無く納品完了したのですが、お客さんサイドが気に入ってくれて次の仕事も用意してくれているようです。OSネイティブのアプリケーション開発は、Javaなどの流行りと違い、できる人はやはり少ないみたいです。特にMacとなると、元価格を上げたとしてもなかなかプログラムできる人はいない、ということで、ある意味ニッチな産業であるかもしれません。

しかし、次の仕事はすでに別のも動かしますのでちょっとキャパを増やしていかないといけないなぁと思う今日この頃です。もうちょっとこちら側の基盤が整ってからまじめに人募集しないといけないのですが、もし、ここにある内容(Macだけじゃないです、Java使ったシステムとかもありますし・・・基本的にプログラムと名の付くものならなんでもやってたり)に興味のある方・仕事としてしたい方がいらっしゃいましたらメール(「y_yutaka@fa2.so-net.ne.jp」宛て)でもいただければうれしいかもしれません。月最低30万はお支払いできると思いますが、そもそも簡単な仕事を私自身が請けないのでハイレベルにはなります。ので条件が厳しくなりますが・・・。

また時が来たら話題に出しますね。オフィシャルサイトが整い次第(はやくしてくれ〜)誘導させていただきます(^_^;;。日記の内容は、なにげに仕事に沿ったヒントを書いたりしますので観察してますと、何かしらやっていることが見えてしまうかと思います(苦笑)。

関係ないですが、ずっとiTunesで曲をあさるのにはまってます。平原綾香さんのアルバム「From To」がもう出てるやん、ということで購入。10/2発売なのに、iTunesではほぼ同時に買えるんですね。CD買おうと思ってたんですが、iTunesでのダウンロードが楽でいいっす。しかし、いい時代になったもんだ・・・・。

Mac(Carbon)日本語リソースを扱う(2005/11/01)

以前振っておいて忘れていたTipsがありました。CodeWarriorでCarbonアプリを作成するときの日本語リソースの扱いについて、です。

ProjectBuilder/XCodeでは、「info.plist」というXML形式のファイルでアプリケーション名、タイプ、アイコンなどの指定を行います。これをビルド時にプロジェクトに加えることで情報が組み込まれます。

CodeWarriorでは、「xxxx.plc」ファイルというのがCarbonプロジェクトを作ったときにデフォルトで用意されます。これは、plistのCodeWarriorバージョンで以下のような内容が記載されてます。

// Change this to your bundle identifier string
#define kBundleIdentifier "com.metrowerks.stationery"

// Change this to your short version string
#define kBundleShortVersion __OUTPUT_FILENAME__ " version 1.0"

// Change this to the string to display in the Finder's Get Info window
#define kBundleGetInfo kBundleShortVersion ", Copyright ?U00A9 2002 by
             Metrowerks Corporation.  All rights reserved."

plist
{
	dictionary
 {
    key "CFBundleIdentifier" value string kBundleIdentifier
    key "CFBundleName" value string __OUTPUT_FILENAME__
    key "CFBundleGetInfoString" value string kBundleGetInfo
    key "CFBundleShortVersionString" value string kBundleShortVersion
  
    key "CFBundlePackageType" value string __OUTPUT_TYPE__
    key "CFBundleSignature" value string __OUTPUT_CREATOR__
    key "CFBundleVersion" value string "1.0"
  
    key "CFBundleDevelopmentRegion" value string "English"
    key "CFBundleInfoDictionaryVersion" value string "6.0"
    key "LSPrefersCarbon" value boolean true
 }
}

ここで変えるべきところは

key "CFBundleDevelopmentRegion" value string "English"

key "CFBundleDevelopmentRegion" value string "Japanese"

と、Japaneseにします。これで、リソース(xxxx.rsrc)内の日本語表記がOSX上で化けずに正常に表示されます。「CFBundleName」はアプリケーション名でOSX上で実行したときにトップメニューに表示される名称です。もし、プロジェクトが吐き出す名称と異なる指定をする場合はこれに直接文字列を指定します。

ビルド時のplcファイルを反映させるために、一度plcファイル自身を再コンパイルする必要があります。CodeWarriorでは、plist形式も(出力用に)吐き出すことができます。Settingダイアログの「Target-Property List」にて、「Property List Compiler Output」で「Output as file」を選択、「File Name」に「info.plist」と指定します。

これで、リビルドすると「info.plist」ファイルが出力されてます。

ただ、アプリケーション名(CFBundleName)で日本語を使うと化けてしまいますね。また、生成したアプリケーションの情報での「バージョン」部分で日本語を使うと(リソースの「vers」情報)これまた化けますね。OSX10.3.9では化けないのですが...。

Future's Laboratory 技術格納庫 2004-2013 Yutaka Yoshisaka.