やばいっ!ヤバすぎる!今年遣り残したことが盛り沢山。とてもお正月どころではないので後5日間デスマーチだ!
2005年12月アーカイブ
日経平均が1万6千円超えるとは思わなかったなー。結局堅調過ぎて自分の手元には約定なし失効通知だけでしたよ。来年の景気はどうなるかなぁ?
ここ数日分見てないので一気にイベント系のFLASH鑑賞中。
マルチスレッドについて少々調査していたらどうもWindowsとUNIXで移植性の高いコードを書くのは難しそうであることが分かった。別にスレッドで処理する部分は共通だからsocketの時のように根気よく#ifdefしていれば大丈夫だと思うがあまり可読性を犠牲にしたくないこともある。まぁチャットサーバーだからマルチスレッドにしたところで速度的なメリットはないし返って同期処理に苦労するだけかな。一応selectならOS間での移植性も高いしこれを元に各OS用のマルチスレッド版作ればいいと判断。年末発行のメルマガはselect版echoサーバーで決まり。Perl版完全移植なのでlistenをselectして1socketで多数のクライアントとの接続を行います。(完全移植という事は次はPostgreSQLとの接続か…)
VS.NETだとちょっと高価だし、WindowsでC言語の勉強がしたいなという方はこちらがオススメ。
下記URLより無償でダウンロードできます。
Microsoft .NET Framework ダウンロード情報
MFCとか使わずDirectXプログラミングやコマンドツール中心なら導入&運用コストを考えても最強だと思う。←この分野の開発はIDEに頼るレベルじゃやっていけないし自動化も自力でスクリプト書くのに苦労はしないスキルはお持ちだと思う。
インストールに関してはダウンロードしたsetup.exeを実行して指示に従い、後は下記のようにPathの追加を行えば完了。
標準でインストールすればC:\Program Files\Microsoft.NET\SDK\v2.0\Binの下にsdkvars.batがあるのでこれを実行するとclコマンドが何処からでも使用可能になる。毎回実行コマンド入力も大変なのでmakeバッチを作ってこの記述を入れておくのもいいですね。
…とちょいとこの前のソケットサーバーコンパイルしたらwinsock.hが無いと言う。コンパイラがフリーといってもライブラリに制限あるみたいですね。.NETなのにWinsockが無いなんて驚きです。多分C#とかのFrameworkを使うほうで組まないとダメなんでしょうね。メルマガではWin環境をVS.NETとしてやってるから間違っては無いが、Winでフリー環境はいろいろと大変だなという事でした。
※BCCにはWinsockあります。(でも今は使ってないのでノンサポート)
マルチスレッドと言ってもいろいろありますね(もしかすると名称が違うだけで同じ物があるかもしれない)、2002~2003年頃はVC++とeVC++でワーカースレッドを使ってガリガリとプログラム組んでいましたが、排他は問題ないとして同期に失敗して何度もプログラムをフリーズさせてしまった事があります。今度はFreeBSDで制作するのですが、kqueue()とkevent()というものがあるらしい。これはpthreadとはまた別物のようです。
fork()については元々windowsでサポートしない様なので作成は控えました。
そういうわけで最初はselect()でシングルプロセス・シングルスレッドだけど多数接続の同期配信という形のサーバーを作成します。これはすぐにチャットサーバーに改造可能。その後にマルチスレッドはどのライブラリを使用するか検討。kqueue()を使うとBSD以外で使えなくなるのでpthreadかな?Windowsのコンソールレベルではどういうライブラリなんだろ?pthreadで底なし沼のようなデバッグにハマりそうな悪寒。
もう冬休みということもあってネット上も賑やかですね。slashupも昨日からFLASHが続々発表されていますしその他の場所でもFLASHイベントが開催されていますが、『街はクリスマス、俺は急いでます。』状態なのでそれどころじゃない。今日から1週間位は殆ど整理ばかりで費やしそう…。
これは便利いいなー。今時はcvsというツールもあるが、そっちの方はまだよく使い方が判ってないので暫くはdiffで。
まず、hello.cの中のprintf文で表示するテキストの内容を変えてみる。差分を取るためには2つファイルが必要になるのでhello.cとコピーした後編集したファイルのhello2.cを作成。
# cp hello.c hello2.c
# vi hello2.c
次にdiffコマンドを使い差分をとる、因みにオプション無しの場合はファイル情報が出力されなかったのでpatchの当て方が判らなかったので-cか-uを使用する。両者の違いは次の通り。
# diff -u hello.c hello2.c
--- hello.c Fri Dec 23 17:56:29 2005
+++ hello2.c Fri Dec 23 17:58:05 2005
@@ -2,7 +2,7 @@
int main()
{
- printf("Hello, world!\n");
+ printf("ハローワールド!\n");
return 0;
}
# diff -c hello.c hello2.c
*** hello.c Fri Dec 23 17:56:29 2005
--- hello2.c Fri Dec 23 17:58:05 2005
***************
*** 2,8 ****
int main()
{
! printf("Hello, world!\n");
return 0;
}
--- 2,8 ----
int main()
{
! printf("ハローワールド!\n");
return 0;
}
-cだと2つのソース全てを書き出してかなり冗長している。これなら-uでいいかな。通常はこれを差分ファイルとして保存するのでコマンドは『diff -c hello.c hello2.c > hello.diff』の様にする。
そして、実際にhello.cをhello2.cの状態にするには、
# patch < hello.c
でOK。もう一度同じコマンドを使用すると確認を要求されるがpacheを当てる前に戻してくれる。
只今、メルマガ向けのSocketプログラミングをしているところですが(UNIX版は終了)、同じソースで条件分けする際にヘッダーファイルで定義しないとダメのかなと思っていたら、コンパイラ自身である程度定義が入っているとネット上の情報で発見。実際はコンパイル時に必ず読み込まれるヘッダー辺りにも書いていると思いますが、その内容の今回使用する部分を抜粋。
GCC(UNIX系)の場合
#define __GNUC__
Windowsの場合
#define _WIN32
つまり、ヘッダーファイルの名前が違うとか、ライブラリ関数の差異を埋めるためには、
#ifdef __GNUC__
// ここにUNIX版の処理を記述
#endif
#ifdef
// ここにWindows版の処理を記述
#endif
このようにすればOK
参考:Hey! Java Programming! --移植性--http://www.mars.dti.ne.jp/~torao/program/general/portability.html
現在、開発に使用しているポート番号を5000にしているが、外部からの接続に成功しない。サーバー自身のFWやクライアントのFWで制限していないし、PHSでもダメなのでもしかしたらISP側で制限されているのかも?
現在調査中で、どうしてもダメなら使えるポートを探すしかなさそう…。
追記:調べたらやっぱり外部から届いてない。BSDのFWで5000番はpassでもlog取得にして確認。ルーター内のグローバルIPからは接続に問題なくログに出力されています。ISPで制限しなければいけないほど危ないポートなのかなー?
この前から、基本ライブラリはincludeしなくてもコンパイルが通ってしまう件について、コンパイルオプションで厳格にチェックが可能かググってみた。すぐに見つかりました。UNIXでC言語の授業あったのになにやってたんだろオレ。確か98年頃だったかな…。
まずは、-Wallオプション。これで#include忘れを解消。ワーニングがなくなるまで続ける。
あとは -02とか-04ってあるけど今のところは気にしなくてもいいかな。
参考:gccのデバッグ術
http://www-or.amp.i.kyoto-u.ac.jp/algo-eng/db/debug.html
ずっと放置していたが、ドメインの有効期限を確認。実は2つもっていて一つはココ。もう一つは占有サーバー用で今度Webサーバーを復活させたときに再設定を行う予定。このもう一つの方が自動更新ではないので期限が気になって検索したら3年契約であと1年半あった。それだけ。
結局ソースを一通り見てみたらgethostbyaddrを使っていた。orz...
ありがちなオチでした。とりあえず必要ないだけでなく遅延の原因となるだけなので消去して1クライアント用echoサーバーが完成、Perl版の移植ということであればこれからselectを組み込むのだが折角なのでマルチスレッドに挑戦してみようかな。メルマガは時間切れなので発行なし。
まさか、ソケットプログラミングで停滞するとは思ってなかった。というのもPerlでは何の問題もないのがC言語に移植した途端コア吐き出した。原因を調べてみるとC言語版はDNSの問い合わせをしているらしい。それまでFWで閉じていたDNSを許可したら問題なく動くのだ。でもDNSが必要な場面が全くないのでこれは1行ずつ解析して不要部分を取り除かないといけない。さらにgccってヘッダ書き忘れてもコンパイラが補完してくれるので便利といえばそうなのだが逆に移植性の低いソースを書く危険性が高くなるので個人的にはおせっかい機能。厳格にコンパイルするオプションはないのか?(Vcみたいに厳格すぎるのも悩みの種ですが)
去年は、ヤフオクで小遣い稼ぎをするも元々収入が20万円未満になるように手仕舞いしましたが、自分で使用した物の売却所得は非課税なんですね。今年は全く物がないのでヤフオクやお休みしていましたが、株式売買を始めたこともあって確定申告する必要があります。(熊谷組が9円になったときに1万株買ってみたいと思ったのがきっかけだがあまりにも無知過ぎて3年近くかかった…その間は売買の仕方がわからず株価を見るだけの日々)
今まで確定申告する機会がなかったので早速調べてみたら、既に必要書類はネットで手に入るというか金額入力をして作成まで出来るようになっているんですね。今日、国税庁のページを見たら平成16年分と会ったので年明けて再度行ってみよう。源泉徴収も特定口座の申告用書類も年明けなので、忘れないようにだけしておこう。
あと、12月15日付で『平成17年中に上場株式等を売却された方へ(平成17年12月)』のPDF資料が公開されているので参考になります。
国税庁ホームページ
http://www.nta.go.jp/
ジェイコムショックに乗じて個人で大量に稼いだ人が出てきました。
東京都港区在住の会社役員(24) 3,701株取得 約563,000,000円の利益
千葉県市川市在住の無職男性(27) 7,100株取得 約2,000,000,000円の利益
会社役員なら業務上で、無職なら自由に板見れるって訳か…。
それにしても株って元々お金を持っている人の為にあるようなものだなぁとつくづく感じる。
無職が成金?って言うと驚くが自己資金34億持っている時点で働く必要性がない、働くといっても経営側でないとやってられないと思う。
某掲示板で3000株あまり当日で売買したと書き込んだ人は出てくるのかな?
Cプロ本体のサイトですが、そろそろ一斉更新の時期が近づいてきた、新しいコンテンツもないまま一斉更新しているのはページ下部のコピーライト。全体的に見た目も良くないのでリニューアルしたほうがっかなと思っています。一気には難しいのでアクセスの多いコンテンツから順番にということでC言語講座→トップページとその周辺とします。ネタ日記は放置。
現在、Project-MMOで使用しているサーバーとは別にウェブシステム開発用サーバーが必要になってきた。DNSを入れるので別サーバーにしたい。最終的には、そこでサイト運営する予定もあるが最近話題になっている白箱や玄箱を調べていたら、CPUの能力が心配…。昔のPocketPCと同じでZaurus未満のCPUじゃDNS、Mail、Apache、Tomcat、PostgreSQLを入れたら絶対システムダウンする気がする。かと言ってスペース的に普通のPCは厳しいし…。SUMICOMファンレス辺りが性能も良くて場所取らないからいいかも、ウェブサーバーのOSはフリーのLinuxを入れる予定でパッケージは使用しない。
結局、正確な時期は未定だが来年早々には構築するかも…。
結局、強制買取で落ち着いたようですが、東証のシステム不具合発表でみずほ証券から東証そして富士通へと責任転嫁が始まりました。ところで不具合がどういったものか発表しないのは修正完了するまで絶対公表できないほど危険度の高いものか、設計ミスによる仕様上の問題でこれから原因追求の可能性がありそうです。
昨日の夕方TVニュースで出てきた内容ですが、今のところこれ以上の進展はないです。実際のところどういう不具合なのかが全く報道されてないのでスッキリしないなぁ。これが東証と証券会社間のインターフェース仕様に欠陥があった等の内容なら、みずほ証券をフォローする作戦なのかも知れない。現金で強制決済やるのなら責任は東証にあったほうが都合が良いはず。続報が待ち遠しい。
ずっとconfigureの書き方について検索していたらautoconfとツールに辿り着いた。あれは手書きじゃなかったのか?とりあえず入れておくと後々便利そうなのでインストールすることに、
因みに、私の環境ではgnu m4を別途インストールする必要があった、makeの時と同じで最小構成で入っているm4ではautoconfのインストールが出来なかった。libtoolの必要性は不明だが多くのサイトで3つを一緒に扱っているので念のためインストール
コマンドと順序は次の通り
# tar zxvf m4-1.4.4.tar.gz
# cd m4-1.4.4
# ./configure
# make
# make install
何も設定せずインストールされたのでシステムの/usr/bin/m4は上書きされず/usr/local/bin/m4としてインストールされたので/usr/bin/m4はリネームした。
# tar zxvf libtool-1.5.20.tar.gz
# cd libtool-1.5.20
# ./configure
# make
# make install
# tar zxvf autoconf-2.59.tar.gz
# cd autoconf-2.59
# ./configure
# make
# make install
# tar zxvf automake-1.9.tar.gz
# cd automake-1.9
# ./configure
# make
# make install
インストールできたので早速使ってみる。
ソースファイルがあるディレクトリで
> autoscan
autom4te: configure.ac: no such file or directory
autoscan: /usr/local/bin/autom4te failed with exit status: 1
これでconfigure.scanが作られるのでこれを参考にconfigure.acを作る。
> cat configure.scan
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_CONFIG_SRCDIR([bench.c])
AC_CONFIG_HEADER([config.h])
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT
作ったconfigure.acは以下の内容
AC_PREREQ(2.59)
AC_INIT(bench, 1.0.0, no-define)
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([bench.c])
AC_PROG_CC
AC_OUTPUT(Makefile)
configure.acの作成が終わったら、Makefile.amの作成に入る。
> vi Makefile.am
bin_PROGRAMS = hello
hello_SOURCES = hello.c
ソース1個ならこれだけでOK
次に必要なファイルを準備するため(?)aclocalを使う。
> aclocal
これで*.m4ファイルなど自動生成。
そしてautomakeする。
> automake -a -c
configure.ac: installing `./install-sh'
configure.ac: installing `./missing'
Makefile.am: installing `./INSTALL'
Makefile.am: required file `./NEWS' not found
Makefile.am: required file `./README' not found
Makefile.am: required file `./AUTHORS' not found
Makefile.am: required file `./ChangeLog' not found
Makefile.am: installing `./COPYING'
Makefile.am: installing `./depcomp'
これでも4つ準備しなければいけないファイルがあるが唯のテキストなのでダミーで誤魔化す。
> touch NEWS
> touch README
> touch AUTHORS
> touch ChangeLog
> automake -a -c
これでautomakeが成功してMakefile.inが生成されたので最後にautoconfで仕上げる。
> autoconf
configureの出来上がり。
実際に使ってみた。
> ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... no
checking for mawk... no
checking for nawk... nawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
configure: creating ./config.status
config.status: creating Makefile
config.status: executing depfiles commands
> make
if gcc -DPACKAGE_NAME=\"bench\" -DPACKAGE_TARNAME=\"bench\" -DPACKAGE_VERSION=\"1.0.0\" -DPACKAGE_STRING=\"bench\ 1.0.0\" -DPACKAGE_BUGREPORT=\"no-define\" -DPACKAGE=\"bench\" -DVERSION=\"1.0.0\" -I. -I. -g -O2 -MT hello.o -MD -MP -MF ".deps/hello.Tpo" -c -o hello.o hello.c; then mv -f ".deps/hello.Tpo" ".deps/hello.Po"; else rm -f ".deps/hello.Tpo"; exit 1; fi
gcc -g -O2 -o hello hello.o
試しに使ってみたし生成されたconfigureやMakefile.inをみてみたが大きすぎてカスタマイズの方法が探れなかった。1ソースなのに生成されるテキストでか過ぎ…。
Makefile書くのは今のところ困ってないので変数変換のカラクリを解析してautoconfのみするかconfigure直書きを目指してみよう。
今回、構築したBSDサーバーにWinSCPでログインできなかったのは単なるIPアドレスの設定が間違っている凡ミス。pscpがあるからずっと問題を放置していたがアイコン整理時にもう一度チェックしたら気づいた。Teratermで繋げてWinSCPがダメなのは何でだろ?と思っていたが結局凡ミスだったりする。orz....
さて、これでプログラミングに日本語が使える、というのもWinSCPだとローカルにファイルを持っているのと近いイメージでファイル編集ができるから、実際は読み込み時にテンポラリーにダウンロードして保存時にアップロードしているが、操作としては直接開いて編集保存しているのに近い。しかもサーバーとはファイルのやり取りだけなので日本語環境もエディタも必要なし。つまり開発用環境も殆ど入れなくてOKという事で効率的な開発ができます。
事件から2日経ちましたが、これまで新聞・報道・ネット等で判ってきた内容(信憑性の高い情報のみ)を纏めると。
東証のシステム
T1. ジェイコムは上場初日だったので初値が付くまで値幅制限がなく1円注文は可能だった。
T2. 初値が付いた後みずほ証券の注文はストップ安の572,000円に自動修正された。
T3. 注文株数の上限をチェックしてない。(この機構を入れると大幅な処理負荷が増大すると説明)
T4. 注文の取り消しは修正された注文金額ではなく1円で来ていたので受け付けなかった。
みずほ証券のシステム
M1. 入力後のチェックで大きな注文株数については警告が表示される。
M2. 発行株式数を超える発注が可能。
こんなところですね。
ここで一番問題なのは東証が注文株数の上限をチェックしてない点だと思う。確かに資金さえあれば一日に何度も取引が可能なので証券会社が注文管理なんてやってられないのも理解できるが誤注文防止の為に1注文の制限は発行済みの80%以内とかで、売買システムの前段に別サーバーで構えても大した負荷にはならないはず。但しメンテするサーバー台数は増えるので保守コストは増えるかな。東証なら必要経費で普通にOKだと思う。これによってみずほ証券の誤発注を許しただけでなく、取り消しに失敗した後の反対売買も許している点を見逃してはいけない。
逆に証券会社側は十分にシステムに組み込む必要があるが、現実の取引は受け渡しまでの4日間に遣り繰りするというグレーゾーンがあるため禁止してない様だ。(情報元:日経朝刊)
次に、運用面でどうだったか
・システムのチェックが厳しいのかは不明だが、警告画面を無視したという事実から慣れによるチェック機構が機能していない。
・寄り付き前に誤発注したため1円注文が受け付けられた。
・すぐに取り消しを行ったが注文金額が修正されることに気づかず取り消し失敗を繰り返す。
※この間に売買が次々と成立しストップ安になる。
・反対売買を注文で証券取引法違反(自己売買)
※後付でクロス取引と誤魔化しているが現物どころか実態すらない。実態がない部分を取引を複数回繰り返したとみなして処理すれば証券取引法違反(売りの差金決済)。この影響で株価は反転し一気にストップ高へ。
・自己売買でも処理できなかった残りの10万株弱は溶け合いの可能性。
※これは株主にとっては納得がいかないでしょう。要するに8日に取得した人に対して現金買取ですからね。
ジェイコムがみずほ証券宛の割当増資をしても今度は上場廃止基準に引っかかるし(というか現時点で上場廃止基準どころではないバランス崩れを起こしているから市場で解決は無理だと思う)
さてさてどうなるか・・・。
今日の朝刊みたら、昨日はそんな事が起きていたのかと世間から離れている自分に気づく。急騰急落見てみたかったなぁ…その時間は電車の中。
というか証券会社だと数量に際限なく注文が出せる時点でどうなんだ?普通発行株式数以上だと信用でもできないじゃないかな。というか増資でもない限り買戻しする株式が存在しないし、後々になって注文取消しも難しすぎるし…。
61万円以上で1株売りのつもりが1円以上で61万株の売りで注文して、一応余りに額面も桁外れな注文なので警告は出たそうだが無視したらしい。周りにも聞こえるようなサイレン鳴らしたほうがいんじゃね?
サミットで酒買うとレジで未成年販売確認の警告音(けっこうデカイ)がなるぞ。
バックエンドで自動起動とか条件付コンパイル等いろいろ検索してみて一応答えが出ました。具体的なプログラミングもわかったので簡単に紹介、実際のコードはメルマガのネタにします。因みにpidの取得に関しては自動起動スクリプト内で可能でした。
インストーラーからサービス起動までのコード群:
configure(shスクリプト)
Makefileのテンプレート
条件分け用のヘッダテンプレート(ヘッダファイル)
起動スクリプトのテンプレート(shスクリプト)
実行順:
# ./configure [オプション]
まず、configureにmakeでしようする変数を引数に渡す。configureは受け取った引数をテンプレート内の変数定義に置換しMakefileとヘッダファイル、自動起動スクリプトを作成する。
# make
ソースをコンパイル
# make install
コンパイル済みのプログラムを指定されたディレクトリへインストール
# make clean
ソースディレクトリ内のコンパイル済みファイルを削除
# make uninstall
インストール先ディレクトリ内のコンパイル済みファイルを削除、空のディレクトリも削除
# make uninstall-force (勝手に命名)
インストール先ディレクトリをまるごと強制的に削除
一番単純な形式だと思いますが簡単に作成できました。
※因みに条件付きコンパイルはソースを書き換えているのであまりよくないかも、ただしコマンドラインでdefineする方法知らないためこうなりました。もしかするとmakeのターゲットで読み込むヘッダファイルを変えれば良いだけかもと思ってきました。make debugとするとdefineだけ書いたdebug.hを読み込むとか。
あとmake testとかって何をテストしているのか良く知らないまま使っていたりします。(←ダメですね)
Winny関連のニュースが飛び込んできたので記録。
これは情報管理に問題ありですね。ニュース記事で確認できる範囲では、情報の持ち出しに関してファイルなのかPCなのかは不明ですが、現在のネット環境が考えれば業務上必要だとしてもファイル持ち出しは論外。紛失や盗難から守ることは可能でも、他のPCで利用している最中での流出には全く無防備なので会社が管理するPC以外へのコピーを厳禁にするのは常識。次にノートPC等会社が管理するPCで持ち出しを行っているのであれば、ソフトのインストールや許可されたネットワーク以外への接続は一切出来ないようにしないと無意味。この辺は後付でどんな強固なセキュリティソフトを入れてもPCの管理者権限があれば簡単に穴が空くのでシステム構築側に責任がある。盗難・紛失対策はHDDの暗号化+パスワードか指紋認証をつけておくといいですね。パスワードだと知っていれば誰でもアクセスできるという欠点でパワハラによる強引な聞き出しや担当の管理怠慢による共有流出等が多いので生体認証か物理的な鍵を別途必要とする方法にしないとダメですね。
http://headlines.yahoo.co.jp/hl?a=20051208-00000138-mai-soci
クライアント開発に使っているノートPCとBSDサーバーのノートPCがメモリ量とビデオ周り以外のスペックが同一なため同じプログラムを用いてベンチマークをしてみた。空きメモリの量に殆ど影響しない計測方法で純粋にOSとコンパイラがどれだけ最適化されているかの確認。
Windows側はVc7、BSDはgccを利用。
ベンチマークの結果BSDの勝ち。Vcはかなりパフォーマンスの良いコンパイラだが、それに勝ったのは以外だった。(本当はBSDがボロ負けすると思っていた)
テストに使ったプログラムは素数を少ない方から10万個抽出するもの。Vcで294秒、gccで278秒。因みに素数の一覧表示は行わず処理に掛かった秒数のみ表示。(一覧表示するとリモートSSHで操作しているBSDに通信ラグが影響するため)
参考書籍:
C言語による最新アルゴリズム事典
プログラムのソースはこちら
UNIXで開発するのに後何が必要か検討したところ、まずWin/UNIX両対応のサーバープログラムを作るということでMakefileを条件分けしないといけない。昔メルマガで条件付コンパイルについて書いたことがあったけどそのときはデバッグモードコンパイルの為に書いていてソースにdefineしていた。今度はmakeコマンドでそれを実現しないといけない。さらにUNIXの場合は起動時にpidファイルを書き出せるようにしないと後々終了時が面倒だ。さらにサービスとして起動することはバックエンドで動作するのが基本なのでシェルスクリプトでstartとstopのオプションを作る。
この辺の情報って日本語じゃあまりないかな…
あるとすれば既にBSDの中にあるはずなのでfindで検索。
# pwd
/usr/include
# find ./ -type f | grep sock
./netgraph/bluetooth/include/ng_btsocket.h
./netgraph/bluetooth/include/ng_btsocket_hci_raw.h
./netgraph/bluetooth/include/ng_btsocket_l2cap.h
./netgraph/bluetooth/include/ng_btsocket_rfcomm.h
./netgraph/ng_ksocket.h
./netgraph/ng_socket.h
./netgraph/ng_socketvar.h
./netipsec/keysock.h
./netkey/keysock.h
./netncp/ncp_sock.h
./sys/socket.h
./sys/socketvar.h
./sys/sockio.h
ブルートゥース用とかある…ある意味凄い。因みにC++用ライブラリは/usr/include/c++/3.4以下なので
上記には当てはまっていない。
3.4以下も探したがそれらしき名前するないです。ということはC用で構造体として組むわけですね。
それならばWindows-C/UNIX-C/UNIX-C++で使いまわしのできるコーディングで組んでみます。
Windows-C++だと殆どのケースはVC++なのでVC用クラスライブラリの方がいいと思う。
C++用ライブラリ
PostgreSQL: libpq++
http://www.postgresql.jp/document/pg653doc/ej/programmer/libpqplusplus.htm
C++とソケット(UNIX)についてはまだ検索中。C言語用ならあるんだけど、C++用クラスライブラリは無いのかな?ピュアC++で組めない予感。
今週からC++移植を始めるわけですが、ライブラリ関連の情報がなかなかヒットしない…。
現在の時点で必要だとわかっているのは、ソケット・XMLパーサ・DBコネクタの3つで、XMLパーサはすぐに見つかったがライセンス上制限があるし、簡単なXMLでやり取りするだけなので自作予定。次にDBコネクタに関しては以前見つけたような気がするが全く入手していない状況。ソケットについては元々あるはずなので入手する必要はないが手持ちの資料は全てwinsock用でC++に至ってはVC++用しか持っていなかったのでプログラミング資料探しの段階。
実際にコーディングする時間は少ないので週末まではこんな状況かも。
仕様変更後の凡ミスで発生したシステム障害から1ヶ月、日経12/3付朝刊に気になる記事があった。
金融取材メモというカラムだが、そこではナズダックやロンドン証券取引所に比べ格段に東証の注文処理が遅いことが書かれている。東証の数秒はインターネットを使用した注文なら普通かなと思っていたらあっちは10ミリ~200ミリ秒の世界ですか…。どうもネットゲーに限らずオンライン関係弱いなぁ。アメリカはIBMが率先して気合満々でグリッドコンピューティングやっているから強いのかも、ネットゲー(MMO本家が韓国とすると元祖がアメリカ)は成熟しきって今では斜陽だし、逆に医療・天文での解析ではリードしていますね。
ところでは国内はどうかというと、私の身の回りの感じではハードウェアの増強で処理能力を上げようとする傾向があります。確かにハードウェアの性能も大事ですがどんなに頑張っても2倍は無理ですね。ただソフト側を見直すとなると人材とコストが足りないのかも知れません。注文を受け付けている正確な時間は知りませんがザラ場のみで注文とすれば5時間(18,000秒)で720万件処理できるから大したものだと思います。1秒当たり400件の処理ができるんですから。回線増強やフロント側のサーバーは幾らでも分散できるとしてやはりボトルネックはDBかな。DBの負荷分散は構造的に難しそう…。グリッドはフロントの分散のみで解析できるのはフロント同士がデータの同期を取り必要がないからかなー。
早速、C++に久しぶり挑戦なのだが今までC++といえばMFCで単機能ツール作ったり、仕事ではPocketPC2002~2003で組み込みをやっていただけなのでピュアなC++を知らなかったりする。つまりC言語で言うstdio.hのiostream.hでガリガリ組んだ事ないのです。
今回はBSDサーバーなのでMFCとかのライブラリ無しで組むので少々敷居が高いかも知れませんが、パフォーマンスは出ると思います。
さてさて早速C++のコンパイルが可能かどうか確認をしてC++の再勉強をします。
先程のPerlヤバい件で、直ぐにC++への移植を決意と同時に連動予定のメルマガを再開しました。具体的なソースプログラム等はここに書くとだらだら長くなるので長くなりそうな部分はBlogでは続きの中に隠して、メルマガで公開という形がいいかも、あとテキスト整形の都合からもメルマガの方がやり易いメリットあるし。Blogの中ではメルマガのカテゴリは敢えてつくりません。連動になるのでプロジェクトごとです。本日から1~2年間はずっとProject MMOだと思います。
登録ページはこちら
http://c-production.com/service/mag-cpro/
紹介コメントが5年前のままとか、広告提携解消したリンク貼ったままとか読者3000部切って殿堂じゃなくなっているとか突っ込みどころ満載。メインサイトのメンテの方放置しすぎだな…。 orz.....
クライアントの開発も進めて、いざテストをしたところ文字化けが発生。そもそもクライアント、サーバースクリプト、データーベース全てにおいてUNICODEで統一したのになんで文字化け?しかも全部化けるなら納得がいくが名前欄のみ化ける。
原因を切り分けていくうちに最初に疑ったのはDBから取得した文字が化けていたので、psqlで確認するとコンソール上では問題なし、変だな~と化け文字の入った変数をダンプするとutf-8ではなくutf-8nになっていた。調べると両者の違いは先頭にBOMコードが付いているかどうかだけ。
そこでバイナリエディタでBOMコードを調べつけてみた。
UTF-8N→UTF8の変換
頭に3バイトのBOM(Byte Order Mark)コードをつけるバイナリでEF-BB-BF
$bom = "\xEF\xBB\xBF";
でも、化け文字の先頭にゴミが増えただけで化けたまま…。
意味がわからずいろいろ弄っているとこんな事に気づいた。
print $fh "name =$name message=$message";
実際はFLASHクライアントなのでXMLタグが付いているが説明に不要なので省略。
ここで$nameはDBからアカウントIDで検索したキャラクターの名前が入り、$messageはクライアントから直接送られた会話が入る。ここで文字化けを起こしていたのは$name。もちろん$nameに日本語を使ってなければ何ら問題はでない。この時点で$messageの方は日本語でも文字化けしないのでDBを疑っていた。
化けているのが$nameなのでメッセージを日本語にしてテストするのも面倒・意味無しと思いメッセージを英数字にしたら、なんと$nameが文字化けせずに表示された。さらにメッセージ部分をクライアントからの入力ではなくソース内に固定の文字(日本語)を入れても化けない。
ここまで来ると、何故他の変数が日本語かどうかによって化けるのか意味不明。最後に$nameが化ける条件でダンプ(つまりダンプするのにも$nameだけでなくほかの文字列変数(日本語)を連結)するとバイナリレベルで相違が発生していた。
[例]あいう(utf-8n) UNICODEは3バイト文字です。
DBから取り出し変数に格納した状態:E3 81 82 E3 81 84 E3 81 86
他の文字列変数と連結すると変化 :C3 A3 C2 81 C2 82 C3 A3 C2 81 C2 84 C3 A3 C2 81 C2 86
何故か6バイト文字です。
よく見るとこんなルールで変換されている。
E3 -> C3 A3
81 -> C2 81
82 -> C2 82
84 -> C2 84
86 -> C2 86
どう見てもPerlのバグです。
本当にありがとうございました
Perl5.8.7だからUNICODE大丈夫と思ったのに、Perl4からの付き合いだがホント日本語に弱い言語だなぁ…と、このままではいけないので対策を考える。
1. UNICODE禁止(FLASHはSJIS、PerlとDBはEUC)
2. この段階でC++言語へ移植を考える
1だとPerl内での変換ミスが恐いところだが慣れている変換方法なので実現は可能、但しDBは一度ドロップしないとだめ、FLASHも改造の必要あり。
2の場合は元々の目標内なので逆に近道かも知れない、但しC言語のXMLパーサとか調査が必要なので暫くプログラム組めないかも。
答えは2、Perlはお手軽実装だけの目的だったので今後はパーサを用いない小規模ブロードキャスト型のサーバースクリプトとして保管。(そのレベルでは汎用サーバーとして使用できるので使い道あり)
で、明日からはC++で組みますか。
とりあえず、サーバー側の組み込みは完了。但しテストとデバッグはまだです。何故かクライアントの方が非常に開発しにくい状況。主な原因はASのXMLパーサーが非効率な仕様のため。
ところで、つい最近オンラインゲームに関する書籍が販売されていることを知って早速購入。
オンラインゲームプログラミングはDirectXでクライアント開発している為参考書に、MMORPGゲームサーバープログラミングはタイムラグや分散処理のノウハウを積むために購入。どちらも著者は韓国の技術者でMMORPGにおいては既に成熟期になっているから本に書けるのだなと関心。というか最近の技術和書は入門書レベル未満(要するにネット検索で済んでしまうレベル)ばかりだし、海外の良書の翻訳本はなかなか出版されないし(正直専門書は売れる売れないの予測で出版を決めて欲しくない)、この本にいたってはMMORPGという事で一番ホットな題材でありながら国内の開発レベルが成熟してないから翻訳出版されたんだと思う。
それともう一つ驚いたのはソースコードの入ったCDが付いていたこと。こういうのがあるとついCDのソースから弄りたくなりますが、なるべく使わない方向で勉強します。
プログラミングの勉強は数学の勉強に通じるところがあり、初めてみるアルゴリズムや関数は数学でいうと公式。公式を使えば簡単に答えが出るが、その公式がどうやって出来ているか基礎理論がわかってないとその公式が適用できないケースが発生してときに問題が解けなくなる。プログラムでも同じで参考ソースのコピペだけで組み立てると非常に無駄な処理が増えたり、適用できないケースが発生するとバグるので急がずに着実に理解しないといけないですね。