Server: 2005年10月アーカイブ

 先週はDBIやXML Parserに関して組み込みを行ったので今日は実際にソケットサーバーから利用してみる予定でしたが、PostgreSQLを利用するにはDBIだけでは足りなかった模様。そこでPgライブラリを組み込んだ。

 Active Perlでppmを使用したときのコマンドは以下の通り。Perl5.8より古い場合はURLが異なります。

ppm> install http://crazyinsomniac.perlmonk.org/perl/ppm/5.8/DBD-Pg.ppd

コマンド結果は続きを読んでください。

 先程、モジュールが組み込まれているかどうかuseで宣言してプログラムを走らせたところ、XMLパーサは大丈夫でしたがDBIが入ってなかったためインストールすることになりました。さて、どうやって手に入れるのか検索したら、ActivePerlの場合はppmコマンドを使ってネットからライブラリをダウンロードして組み込むことが出来るらしい。

早速、コマンドプロンプトを立ち上げてppmと打ってみると以下のようにPPMが起動した。

PPM - Programmer's Package Manager version 3.2.
Copyright (c) 2001 ActiveState Corp. All Rights Reserved.
ActiveState is a division of Sophos.

Entering interactive shell. Using Term::ReadLine::Perl as readline library.

Type 'help' to get started.

ppm>


ここで表示されているppmプロンプトに「install DBI」と打てばDBIのインストールが始まる。

ppm> install DBI
====================
Install 'DBI' version 1.48 in ActivePerl 5.8.7.813.
====================
Downloaded 548475 bytes.
Extracting 73/73: blib/arch/auto/DBI/Driver_xst.h
Installing C:\Perl\site\lib\auto\DBI\dbd_xsh.h
Installing C:\Perl\site\lib\auto\DBI\DBI.bs
Installing C:\Perl\site\lib\auto\DBI\DBI.dll

(中略)

Installing C:\Perl\bin\dbiproxy
Installing C:\Perl\bin\dbiproxy.bat
Successfully installed DBI version 1.48 in ActivePerl 5.8.7.813.

インストールが完了したらppmから抜け出して早速Perlプログラミング開始

ppm> q

インストールログは続きに全文掲載。

 昨日の書き忘れで、ソケットサーバーのPerlに必要なライブラリを確認。
一つはDB用でDBI、もう一つはXMLパーサ(XML::Parser)。まずはWindowsで構築するのでActivePerlに入っているかどうかを確認しないといけない。さらにライブラリの使い方を覚えないと・・・。

 この件で思い出してしまったのだが、「Perlを256倍使うための本 DBI編」を売却処分していた。多分当時使ってたPerlにDBIがインストールされて無かったためかDB自体理解できなくてあきらめたかのどちらかではあるが・・・。

 気を取り直して頑張ろう!

 MySQL5.0の正式版が発表されました。今週の発表なのでアプリ開発にはフライングなのにダウンロードしてインストールしてしまい、何の意味があるのか?と後で思っている始末です。(レンタルサーバーでMySQLを使用するのであまり新しいバージョン追いかけると開発機で動いたものが運用機で使えないとか問題起きそうだな…)

日本MySQLユーザー会
http://www.mysql.gr.jp/

 今回は、DreamweaverとPHPを使うわけでもないのでMySQLにこだわる必要が無くなったためPostgreSQLをインストール、今まではWindowsで一度もインストールに成功したこと無かったので嫌な予感はしていました。実は今回もインストーラーが致命的なエラーを出して何度入れてもダメ。エラーログをみながらユーザーをグループに追加したり、フォルダのアクセス権を緩めても失敗。こうなったら検索しかないので延々と調べてようやく分かった原因。

「WindowsではUNICODEでインストールできない。」

 何ですかこの結論は…。文字コード選択にShift-JISが無いためUNICODEにしたのに…。ロケールの選択もJapanにするとログ内でinvalid吐き出しているのでデフォルトに戻す。

 PostgreSQLに移行しようと思ったもう一つの原因は、以前MySQLを使ってて(ver4はあったが安定版はまだver3だった)連鎖削除が出来ない事に後で気づき使えねーとなったことがありました。

 でも、ホスティング会社ではMySQL派の方が多数ということもあって開発には両方使っていく必要がありますね。

日本PostgreSQL
http://www.postgresql.jp/

 ソケット通信関係のプログラミングが一段落したので、本日よりプロジェクト開始とします。
今まで語る人も利用例も少ないFLASH XML Socketはかなり難解なものと思っていたら、関数も一桁の数しかないし、思いっきり単純でした。これで直ぐにチャット機能は完成しそうなんで実装して複数接続のテストを行います。

 因みに今回制作するコンテンツの詳細については、仕様を含め全ての詳細が決定しましたが、投稿作品として制作している理由上、作品そのものは発表時まで非公開になります。

 今日からFLASH側にテスト用クライアントを作成して動作の確認を行ってみた。
最初は接続・切断はうまくいくもののデータの受け渡しが上手くいってないようで、半日経過。
デフォルトの仕様から調査してみると、別にXML形式でやり取りする必要性はなく(FLASH側にとってはデータ処理が楽になるが)、1行ずつ読み込むPerl側はFLASHから改行コードが来ないため次の処理に進めず、FLASH側に\nつけて送ったら今度はサーバーからのエコーを処理できない。FLASHのXMLソケットはNULL(\0)を区切りとして処理しているのでサーバーからデータ送信する際に\0を付与すると解決した。
 一応1対1の通信が完了したので、今度はサーバーで同期配信を組み込めば大体処理は完了かな。
但し、サーバーのCPU負荷と通信量は十分考えなければいけない。

 通信量の節約:
究極はバイナリでbitごとに定義したデータだけど、多分チャットメッセージの方がずっと重いはず。
テキストだとコマンド部とデータ部を分ける処理をFLASH側で自作。XMLで在ればサーバーに解析処理が必要な場合も有り。例えば最大接続が1000人だとして大体位置的に自分の周り30人くらいのチャットを受け付けるとすると位置情報から絞り込んで送信すべきなのだろうか…CPU負荷と相談。

 CPU負荷の軽減:
これは、サーバー側での処理を極限までに少なくする必要がある。最初はコンパクトに実装するが通信量が見積もれる段階になったら考えてみよう…。

上記2つはタイムラグの発生を最小限にする為何度もシミュレートしてみる。
クライアント側の処理もなるべく軽くする予定だがPenIII-850未満のCPUは想定外。サーバーの通信帯域は32Mbpsを上限とする予定なので1クライアント32Kbpsつまり1秒間に4Kバイトまで、リフレッシュレートは10fps辺りで設定かな。(こんな通信仕様でレンタルサーバだったらプロセス停止食らいますね)
 

 マルチプレイサーバーを作るにあたって、自宅サーバーで運用すると仮定してもBSD辺りで最小限の構築をしようと思っていました。そのときの構成が以下の通り。

サーバー機1台新調。
FreeBSDをSSH,emacs,bcc,makeのみでインストール
Apache2.0+SSL(モジュール最小)…アカウント管理ツール用
Perl5.8.0(ライブラリはDB関連のみ)…ゲームサーバー・管理ツール用
Qmail…アカウント発行用
BIND…メールサーバー用
Postgresql…ゲームデータ保管用
ipfw…ファイヤーウォール

結構、これで多人数の利用を考えるとスペックが必要になります。

 STUDIO 8 アップデート版が欲しいのにその倍額を掛けてサーバー構築も大変だーと思っていたら、「別にゲームサーバーのみで全て受け付けて、FLASHクライアントにアカウント登録から組み込めばコンパクトかつ、どのOSでもパワーの余ったPC使えばいいのでは?」と閃いた。

 そういえば自宅のデスクトップは全然使ってない。スペックが劣っていてもノートで制作したりしている。そういうことなら移植性を考慮しながらWin用で作ればと思い考えたのはこの構成。
Apache…ここのドメインを使用(告知・宣伝・クライアント配布用)
ActivePerl…ゲームサーバー・アカウント管理
Qmail…ここのドメインを使用(連絡用)
Postgresql…ゲームデータ保管用(使用しない場合も想定)
NAT…WindowsPCはルーターの下に接続しているのでここでポートフィルタリング
ウィルスバスター2006…パーソナルファイヤーウォール

これならハードウェアの追加はいらないどころか最大のパフォーマンスがだせるかも。

 あまり残りの期間もないので早速サーバーサイドのプログラムから書き始めました。FLASHのテストクライアントは週末にでも。
 ただ、自宅サーバーを休止した上にサーバー機を処分してしまった為にWindows用にテストサーバーを作ることになりました。
 …で。数年もやってないことはすっかり忘れているのかPerlでforkを使ってしまい撃沈。やっぱりUNIX系クライアントは必要だなー。cygwinと言う手もあるけど、妙なところでWindows絡むので信頼できないし。

 結局、思い出すために昔の雑誌やら書籍や参考にしていたサイトを探していました。
よくよく思い出してみるとソケットとforkの両方を使ったプログラムは組んだ事なかったのです。だからMMOがどうやって実現しているのか設計内容が分からなかったのか…。ソケット通信はHTTP/FTP/メールクライアントで作成して、fork関係は途中で投げ出していた…。

 とりあえず、forkの代わりにselectを使用して対処。

以前から大変に参考にしています。

ネットワークプログラミングの基礎知識
http://x68000.q-e-d.net/~68user/net/

 ソケット通信って自分にとっては凄く懐かしい響きだ…。C言語やPerlでソケット通信プログラムを組んでいたのは5年も前だし。その頃はPerlでサーバー間のデータ受け渡しに凝っていました。CGIの使えないレンタルサーバーが多かった頃でサイト更新システムを外部に作成しPerl上でFTPクライアント組み込んだり、後はVC++で同じような物を作成していました。

 でも、これを応用してマルチプレイヤー型ゲームを作っているなんて目からウロコ。実はかなり特殊なことをやっていると思っていたけれど基本的なネットワークプログラミングでサーバー側は出来てしまうんだなーと納得しました。

 それが分かれば早速、仕様を確定してサーバー側のプログラミングを始めるのですが、実はC言語ではVC++が開発環境だったためかwinsockばかり使っていた記憶しかない。(でもVCでsocket.hも使えたような気がします。)今度はUNIX型サーバーに組み込むのでとりあえずはPerlで制作してみることにします。レンタルサーバーにはファイヤーウォールの関係で多分組み込めない気がするのでまた1台サーバー立てないとダメかな…。

 Windowsのプログラムを制作していてスタートアップとかではなくてサービスに登録してサーバーとして運用したいなーと思うことがありますが、3年程前サービスプログラムを組んでいて結局失敗した事があります。当時は.NET用の情報が殆ど無く私が.NETしか持ってなかったためATLやら色々いじった挙句ダメだったわけです。(※仕様変更って恐ろしいですね)

いつごろから存在するのか知りませんでしたがsexeというソフトがあり、これを使うとサービス用に制作されていないプログラム、良くある例としてはLinux用プログラムのソースをWindows用に移植してコンパイルしたものを登録するなど、非常にありがたいソフトだなと思います。ニッチな需要ですね。


sexe
普通のプログラムを WindowsNT/2000/XP のサービスとして動作させる
http://www.vector.co.jp/soft/winnt/util/se227419.html

Dos攻撃対策

| | コメント(0) | トラックバック(0)

 最近、ニュースでよく聞く不正アクセスといえばDos攻撃だと思う、5年前にネットワークの勉強をしているときに新しいタイプの攻撃方法として紹介されて初めて知りましたが未だに有効な解決法がないようです。対策法として「ダイナミックファイヤーウォール」なんて言葉を考えて見ましたが、現在ダイナミックファイヤーウォールと呼ばれている製品はDos攻撃の根本的な対策を行う仕様には至ってないようです。

 実際のダイナミックファイヤーウォールは普段ポートを閉じていて、正当なパケットの応答に対して一時的にポート開くようなものでした。一応これでサーバー自身は守られるかもしれませんが、外部に公開しているサーバーである以上ユーザーの不便が解消されなければ殆ど意味が無いわけです。Dos攻撃の目的は脆弱性の突いた乗っ取りかサービス不能状態に陥らせる嫌がらせなのでサーバー単体や側近のルーターでどんな対策をしても防げないというわけです。

 そこで私の考えているものはDNSのような仕組みで禁止ルーティング情報を伝播させ、サーバーが不正アクセスと判断した端末側のルーターにルーティング禁止をしてもらうってことは出来ないだろうかということです。もちろん世界標準なデーモンになってくれなければ意味が無いのですが…。
 つまり発信元の側近ルーターで防いでしまえば他のネットワーク利用者に与える被害も最小限になるのではということです。可否を判別するのはサーバー側。

 よくメールマガジンや掲示板等ではドメインレベルで接続を禁止したりしてISPやホスティング同士で抗争していますが結局サーバーの負荷を下げる為だけに一般ユーザーが不便を強いられる事になります。
 プロバイダもホスティングからサービス拒否されると対象が有名サイトだった場合、顧客流出の危機にもなりますし、自衛の為にも必要なんじゃないかなと思う。

 もしかしたらそんな製品あるかもですが、あったら教えてくださいまし。

ネットゲーの企画

| | コメント(0)

 最近カテゴリーがクロスすようなことばかりですが、またプログラミングをするようになったので今度はネットワーク関連でやってみようかなと思っています。(1からは無理です。)昔C言語のメルマガを発行(現在休刊中)していたときは、C言語→C++→MFC→DirectXと展開する予定でしたが、結局時間が無くて書けないままです。実際モデルとしてUnrealTournamentのようなゲームが制作できたらいいなぁの気持ちだったのですが、最近はネットゲームでも5000人同時接続規模のMMOが流行なのでいつの間にかはるか雲の上の技術です。冷静になって考えてみれば、サーバー側はデータの同期と判定関係が殆どぽくて、それ以外は全てクライアント側プログラムだと思います。そう切り分けるとイキナリ気合いれてDirectXする前にFLASH対戦ゲーから作ってみようなという気になりました。これはUNIX無関係かな。一応大規模MMOを目指して個人でも運用できるプログラムならWinXP Pro+Postgreがいいのかな?

ColdFusion高っ!

| | コメント(0)

 昨日に続き、価格コムで値段をを調べたらサーバーが100万円近くするのか…。個人では買えません。若しCF用プログラム作っても配布するだけで、運用は他の有志にやってもらうしかないです。

 こういうのって職業病なのかな、現在のプロジェクトでウェブサーバーの構築とかやってるのでまたサーバーを立てたくなってしまった。今度は殆どパッケージを使用しないつもりですが、ここに来てLunixの方が相性がいいのかもと思うようになりました。BSDの方が一元性があって良いと思うのですが、最近のデーモンがLinuxをターゲットに作られてきているし、Java環境に至ってはSolaris/Linux/Windowsのバイナリしか配布していないのでBSDではエミュレートして使うような状態になるのも気に食わない。気に食わないのはBSDに対してではなくBSDやMacOS用を制作せず放置しておきながらマルチプラットホームとか言っているあの会社についてですが。そう言えばColdFusionやってみるのもいいかな。これもまたシステム要件にBSDがない。開発用ならSTUDIOについていたのでWinXPに入れておきますか…。

このアーカイブについて

このページには、2005年10月以降に書かれたブログ記事のうちServerカテゴリに属しているものが含まれています。

前のアーカイブはServer: 2005年9月です。

次のアーカイブはServer: 2005年11月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

Powered by Movable Type 4.1