Ajax Server Search: BF2142 を追加
2006/09/11 に Ajax Server Search に BF2142 を追加しました。 が、すでに現在 beta テストは終了しているようで、サーバリストは取得できますが、プレーヤは誰もいません :)
BF2142 demo が出たらすぐに対応するつもりです。
2006/09/11 に Ajax Server Search に BF2142 を追加しました。 が、すでに現在 beta テストは終了しているようで、サーバリストは取得できますが、プレーヤは誰もいません :)
BF2142 demo が出たらすぐに対応するつもりです。
CountryFilter server plugin for CS:S/HL2DM の新しいバージョンを現在開発中です。maxmind.com が GeoLiteCity という、国だけでなく都道府県や都市の情報を得ることができる DB の無料版をリリ−スしたようです。それに伴い CountryFilter もアップデ−トしようかと考えています。
この連休中になんとかなるかな :P
Ajax Server Search に Warsow を追加しました。
追加した理由は、解像度 1600x1200 にて内蔵のサーバブラウザを使うと、「Search」ボタンが出ないため検索できないというバグ(?)があるようなので、自分がプレイしてみるために追加しました :)
需要がどのくらいあるかわかりませんが、しばらく様子をみてみます。
Ajax Server Search に Quake3 1.16 を追加しました。
マスターサーバとの通信プロトコルが 1.32 と 1.16 で違うようで、今まで表示されていなかったようです。
J's さん thx!
先週の連休中にどうにかするつもりだったのにどうにもならなかった CountryFilter server plugin for CS:S/HL2DM ですが、結局マイナーバージョンアップにすることにしました。
コード自体を変更するのは結構サッサッとできるんですが、Windows 用と Linux 用の DLL をコンパイルして、それぞれテストして、ドキュメントを日本語と英語でそれぞれ書くのはあまりにもダルすぎ ;(
とりあえず、GeoIP Country の最新 API に対応(GeoIP-1.3.10 → GeoIP-1.4.0)して、最新の Source SDK でコンパイルしました。ただ、これだけだとつまらないので、他のプラグインが国情報を利用できるような仕組みを追加しました。この週末に終わるかと思ったけど、まだドキュメント書きが残ってます、やれやれ :/
Ajax Server Search に BF2142 Demo に対応しました。ただ、サーバリスト表示、ゲーム起動は出来ますが、サーバに join することができません。詳しいことがわかり次第対応します。
ちょっとプレイしてみましたが、なかなか面白そうです。ただ、ポイント集めて装備を強化するっていうシステムは面倒なのでやめてほしいなー :)
Ajax Server Search を BF2142 製品版に対応しました。ただし、Demo と同様、起動オプションの詳細が分からないため。まだサーバに join することができません。詳しいことをご存知の方がおられたら教えてくださると助かります。
ちなみに私も製品版買ってきましたよ :) 最近毎晩 10 時頃から clubDOOM のメンツで Skype 使いながらやってますので、一緒にプレイしたい方は IRC の #clubDOOM へどうぞ :)
Ajax Server Search を GyaASE - Guwashi's yet another ASE に改名しました :)
名前を考えるのが面倒で適当な名前にしていたのですが、色々とリンクしていただいてる方々サイトを見ると、Ajax Server Search だと長すぎて省略名の呼び方に困ってるような感じで、さらに こちら でも名前が不評のようでしたので、一晩考えて決めました :)
なんというか、ベタな名前ですが ASE が死んでしまったから作ったということがよくわかる名前にしました。読み方はなんでも結構なんですが、私は「ギャース」と呼ぶことにしました :) イメージとしてはこんな感じです。
<「ギャース!」
リンクしていただいている方々、どうもありがとうございます。お手数をおかけして申し訳ありませんが、リンク先の変更をよろしくお願いします。
GyaASE に BF2142 demo, DoD:S, TFC, CoD, CoD2 を追加しました。
コメント等でいくつかリクエストいただいていたゲームについて、国内サーバの状況を検討して追加しました。他にも追加してほしいゲームがありましたらご連絡ください。多少やる気のある今のうちにリクエスト出していただけると助かります。かなり気分屋なので :P
現在、Q4, Q3, ET, Warsow, CS1.6, CS:S, HL2DM, DoD:S, TFC, UT2004, BF1942, BF2, BF2142, BF2142 Demo, AA:O, FEAR, CoD, CoD2 に対応しています。これでだいたい国内でプレーヤがそこそこいるゲームは網羅したかな? あと何かあったっけ?
GyaASE に、コメントで希望いただいていた BF2 demo, CoD:UO, RO:O を追加しました。これらのゲームは私は持っていないので、サーバ join できるかどうかわかりません、お手数ですがテストをしていただけると助かります。
それともうひとつ。検索オプションを追加しました。Search のテキストボックスに、"-keyword" で keyword 以外のサーバを検索します。また "/keyword" で 正規表現 による検索をします。
例として ET のリストから TC:E だけを取り除くには Search のテキストボックスに以下のように入力します。
-tcetest
別の例。ET のリストから etpro と etpub だけを表示するには Search のテキストボックスに正規表現で以下のように入力します。
/(etpro|etpub)
GyaASE に、MOHAA を追加しました。お手数ですがテストをしていただけると助かります。
それから Ajax を使ったメッセージボードを追加しました。1v1 の募集をしたり、時間を決めて集合等に使ってみてください。全体で 50 件までメッセージは表示され、1 日経つと自動的に消去されます。また 1 個の IP あたり 5 件までメッセージを書きこめます。5 件以上書くと古いメッセージは消去されます。
Warsow 用の RocketArena MOD を作りました。とりあえず以下の機能が実装されています。
ダウンロードはこちら warsow_ra_a2.zip です。先週の週末2日間をかけてざっくり作ったものなので細かいこと(ラウンド制等)は作ってませんが、RA の雰囲気は味わっていただけるかと思います :)
まだ 1v1 の RocketArena だけですが ClanArena もぼちぼち実装してみたいと思います。
CTF、TDM、紅白戦などのチーム戦を即席チームで遊ぶための IRC Bot を作りました。ircpickupbot-1.0.0.zip からダウンロードできます(要 Java Runtime Environment 5.0)。これまた1日2日で適当に作ったものなのでまだ色々とやらないといけないことがあります :)
現在この Bot は friend 系 IRC の #warsow に夜 9 時頃から居て Warsow CTF の募集をしています。とりあえずドキュメントを書いている時間がなかったので、Warsow Japanese Wiki: PickUp ゲーム を参照してください :)
画像は Bot とは関係ありません :) すみません。
GyaASE に、MOHAAS(Medal of Honor: Allied Assault Spearhead). MOHAAB(Medal of Honor: Allied Assault Breakthrough) を追加しました。私はこれらのゲームを持っていないので、お手数ですがテストをしていただけると助かります。
Warsow 用の RocketArena MOD に ClanArena (CA) を追加しました。Team Deathmatch をベースにして、以下の機能を追加しています。
ダウンロードはこちら warsow_ra_a3.zip です。
なお、以下の RA/CA の特徴はまだ実装していません。
今のところ大きめのバグ?として、プレーヤ数が多いとマップによってはリスポーンポイントが重なってしまい、マッチ開始直後にテレフラグで死亡というバグ? があります :) 現状では、リスポーンポイントのロジックはデフォルトから何もいじっていないため、Warsow 自体の仕様だと思われます。つまり、CA だけでなく、DM や TDM でも同様の現象が起きると思います。このバグ、今度 Clanbase TDM Cup があるそうなんですが、大丈夫なんですかね :)
とりあえず、今後の開発の方針としては、大がかりな変更となる機能は実装しないつもりです。理由は、Warsow はまだ開発段階なので、今後大幅にコードが変更になる可能性があります。つまり、細かいところまでいじってしまうと、新しいリリースが出たときに MOD 側の修正が大変なことになりそうです。また、自分の力量/時間の問題もあります。それに某情報筋 :) によると、開発チームがいずれは RA/CA をオフィシャルリリースに追加するだろうとのことです(現在は別の優先順位の高い仕事があるので時間がないらしいです)。ですので、出来るだけ開発チームにに貢献できる形で進められるようにしたいと思います :)
当面、以下の追加/修正を考えています。
コメントやリクエストがありましたら、この Blog のコメントか 公式のフォーラム(英語) にお願いします :)
Warsownews.net で 記事 にしていただいたようです。いつも すばやい情報 Thx です Layzie さん :P
Warsow 用の RocketArena MOD に Linux 版を追加しました。
ダウンロードはこちら warsow_ra_a4.zip です。
Windows マシンの VMWare の Fedora Core 3 でコンパイルしました :)
GyaASE に、Nexuiz を追加しました。
ネタが特にないので... Warsow 開発風景として、開発マシンのデスクトップの様子を載せてみます :) (解像度は 1600x1200 で 20 インチ液晶モニタを使ってます)
右の黒いウィンドウでソースコードを表示しているのは Meadow というエディタです。Meadow は GNU Emacs の Windows 版クローンです(Wikipedia の説明)。これでソースコードをいじっています。もうかれこれ 10 年以上 GNU Emacs を使っていて、このエディタなしには仕事ができない体になってしまいました :)。 ちなみにメール等もこのエディタ上で読み書きしています。
左上のウィンドウは Microsoft Visual C++ というコンパイラで、これで Windows 版のバイナリをコンパイルしてます。
左下のウィンドウは VMWare という仮想的に PC をエミュレートするソフトで、この仮想マシンの中に Linux の Fedora Core というディストリビューションを入れて GCC というコンパイラで Linux 版のバイナリをコンパイルしてます。
最近はこんな感じでガリガリとコーディングしております =)
前からちょこちょこと作っていた Pick Up ゲーム用 IRC ボットを大幅に改良してリリースしました(gyapickupbot-1.2.0.zip)。お正月休みで実家に帰っていたときに、ノート PC で FPS を遊ぶことできなかったため、こればっかりやってました(タッチパッドで FPS はムリ =))。
簡単な使い方を載せておきます。これらのコマンドのほとんどは、QuakeNet で稼働している echbot という PickUp BOT とほぼ同じように動くように作ってあります。
- !add [gameid[,gameid,...]] 参加登録する。 例: !add ctf - !remove [gameid[,gameid,...]] 参加をキャンセルする。 例: !remove ctf - !who [gameid[,gameid,...]] 参加者リストを見る。 例: !who ctf - !ip <gameid> [newips] ゲームサーバの IP アドレスを設定する(管理者のみ)。 例: !ip ctf 1.2.3.4:5555 - !motd <message> メッセージオブザデイ(MOTD)を設定する(管理者のみ)。MOTD はトピックに表示される。 例: !motd 新しい BOT 完成したよ - !lastgame 直近のゲームの参加者と時間を表示する。 例: !lastgame - !promote [gameid[,gameid,...]] 参加を促すメッセージを表示する。 例: !promote ctf - !status <gameid> ゲームサーバの状態を表示する。 例: !status ctf - !pickups [gameid[,gameid,...]] ゲームタイプを設定する(管理者のみ)。 例: !pickups ctf:10,duel:2,tdm:8 - !set [variable [value]] 各種変数を設定する(管理者のみ)。 例: !set pickup,format Next Games: [%games%] || %motd% - !help コマンド一覧を表示する。
現在、friend 系 IRC の #warsow で稼働しています :)
#include <stdio.h>
int main(int argc, char* argv[])
{
int data[] = { 4, 6, 4, 9 };
int i, sum = 0;
for (i = 0; i < sizeof(data) / sizeof(int); i++) {
sum += data[i];
}
printf("%d\n", sum);
return 0;
}
#include <vector>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
vector<int> data(4);
data[0] = 4; data[1] = 6; data[2] = 4; data[3] = 9;
int sum = 0;
for (vector<int>::iterator it = data.begin(); it != data.end(); ++it) {
sum += *it;
}
cout << sum << endl;
return 0;
}
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList<Integer> data = new ArrayList<Integer>();
data.add(4); data.add(6); data.add(4); data.add(9);
int sum = 0;
for (int i : data) {
sum += i;
}
System.out.println(sum);
}
}
var data = new Array();
data[0] = 4; data[1] = 6; data[2] = 4; data[3] = 9;
var sum = 0;
for (var i in data) {
sum += data[i];
}
alert(sum);
@data = (4, 6, 4, 9);
foreach $i (@data) {
$sum += $i;
}
print $sum, "\n";
import operator data = [4, 6, 4, 9] print reduce(operator.add, data, 0)
(define data '(4 6 4 9)) (display (apply + data)) (newline)
(defvar data '(4 6 4 9)) (print (apply #'+ data))
Links:
Warsow の フォーラム を眺めていたら demoavi でキャプチャしたシーンが実際のゲームより遅くてサウンドと同期しないバグ が報告されていました(しかも 検証ムービー 付き)。
ってこれたぶん fumio さんの POV ですよね。で、日本人でこんな検証ムービーをささっと作れる人って... て感じで誰が投稿した人かなんとなくわかってしまったので、早速検証してみました :P
自分のデモを使って cl_demoavi_fps を色々変えて demoavi をテストしてみたところ、cl_demoavi_fps 160 を指定すると出力される jpeg の fps は 166 になり、cl_demoavi_fps 300 を指定すると出力される jpeg の fps は 333 になりました。で、フォーラムを検索したところ、この 記事 によると、Warsow のエンジンの仕様で fps (cl_maxfps、cl_demoavi_fps) は 1000 / n (n は自然数) の値しか指定できないようです(Cyph3R さん情報 thx)。
例えば、
という感じで、任意の fps を指定しても 1000 / n に相当する値になる仕様のようです。1000 / 11 = 90 1000 / 8 = 125 1000 / 6 = 166 1000 / 3 = 333
P.S. fumio the movie の続編(?)を楽しみにしてます :D
Warsow forum の ここ とか ここ でも次のバージョンの話題が盛り上がっていますが、新しいアイデアをあれこれ考えるのは楽しいですね。Warsow は オープンソース のゲームなので、気にいらなければ自由に変更できるところが魅力だと思います。Warsow に限らず、自分で新しい FPS を作るのはプレイするよりも楽しいと思います :)
新しいゲーム(or パッチ)が出るらしい → 期待 → リリース → ガッカリ ;(
というパターンに食傷気味の方、自分の手で FPS を作ってみませんか?
こちらは最近 G-Gamma さんが作った Warsow のカスタムモデルです。forum でも 好評 のようです。
P.S. 近いうちに nip (Lead Development) と ETR (Newser, Mapper, etc.) への インタビューが予定されている そうです =)
warsownews.net に nip (Lead Development) と ETR (Newser, Mapper, etc.) へのインタビューが掲載されています。
9 ページ目に 新マップのスクリーンショット が 4 枚あります。よく見れば、それぞれどのゲームタイプ用のマップかすぐわかると思います :)
このマップかなりカッコイイです。どのゲームタイプ用かわかりますよね? :D
日本発の Warsow 用 カスタム HUD を二つ紹介します。どちらもとてもよく出来ています GJ :D
一つ目は mapi さん作の wa-wa- HUD です。この HUD は、画面下部に必要な情報がコンパクトにまとまっていてとても見易いです。また、ヘルス/アーマーの値によってバーの色が変わるので、直感的に状況を把握できるのでとても気に入っています。公式フォーラム(英語)でも好評のようです :) 現在私はこの HUD をベースにして ちょっと改良したもの を使っています。
二つ目は bluespear さん作の bluespear HUD です。下の画像は TV 放送用の bluespear_show HUD です。こちらも 公式フォーラム(英語)で好評のようです :) この TV 用 HUD は放送用(低解像度)に最適化されていて、大きめのフォントを使っていたり、チームカラーが見易くなっています。こちらは今後の SSSP.TV FPS.ch の放送で使われていくようですので楽しみにしています :D
こういった感じで Warsow では自分好みの HUD がかなり自由に作成できます。カスタム HUD の作成方法については、Warsow Japanese Wiki - HUD (日本語) と Warsow Wiki -HUD (英語) が参考になります。
今回取り上げた二つの HUD はどちらも 公式フォーラム(英語) に投稿されています。こうやって日本の Warsow コミュニティから世界に発信されていくことがとてもうれしいです :) もちろん、英語で投稿しなければならないという難しさはありますが、HUD に関して言えば、スクリーンショットとダウンロードリンクがあれば通じます :P Warsow はオープンソースのソフトウェアですので、コミュニティの影響力がとても強いゲームだと思います。こういったコミュニティからの寄与がよりゲームを楽しくしていくと思いますので、どんどん投稿してみてください。また、出来のよい HUD は Warsow の公式リリースパッケージに取り込まれるかもしれません :D
GyaASE に Savage を追加しました。マスターサーバから各ゲームサーバの IP, Port を取得するのに以下のような方法を使っているんですが大丈夫かな :P もし、もっとまともな方法があれば教えてください :)
wget -q -O- http://masterserver.savage.s2games.com/ | perl -nle 'print $1 if (/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\:\d{1,5})/)'
また、チャットのスクリプトをすこしいじって、国旗表示、ID表示を出来るようにしてみました。
P.S. ASE が復旧? したとか、しないとか。後で試してみたいと思います :)
GyaASE に Counter-Strike: Condition Zero を追加しました。これで対応ゲーム数が30になったので、これ以上ゲームを追加する場合はアクセスの少ないゲームから入れ替えになります。
また、チャットのスクリプトをいじって、オンラインユーザの表示、現在 GyaASE で検索しているゲームの表示、ゲームアイコンの表示を出来るようにしました。Name の欄に名前を入力しておくと、Online の部分に表示されます(特に Message は入力する必要はありません)。
あ、それと、どうでもいいですが favicon を追加しておきました
GyaASE API をリリースしました。GyaASE API とは、GyaASE の内部で使っているサーバ検索バックエンドを Web API として呼びだせるようにしたものです。この GyaASE API を使うと、自分の Web ページや Blog にサーバの一覧を表示させたり、オリジナルのサーバブラウザを作ることができます。
例えば、こんな感じで簡単にサーバ一覧を埋め込むことができます :)
GyaASE に RSS 配信機能を追加しました。サーバ情報の最下段に RSS というリンクをクリックすると RSS が取得できます。例: Warsow の日本サーバの RSS フィード
Firefox の ライブブックマーク を使うと、こんな感じでブックマークみたいにサーバが表示でき、さらに、クリックするとそのままサーバに入れます。また、こちらでは Google Reader と livedoor Reader でも動作することを確認してます。
Firefox を使っている方は、 IE Tab というプラグインを入れて、以下のようにサイトフィルタのところで http://d3.jpn.org/gyaase/* を指定しておくと、サーバ起動のバッチファイル(.bat)が保存せずにそのまま起動できて便利です。
今回この機能を作るために、 RSS についてすこし調べた のですが、RSS1.0, RSS2.0, Atom 等の規格があって、どれで対応するか迷いました。ちょっと前の情報だと RSS 1.0 あたりが無難らしいということで RSS 1.0 を生成するようにしたんですが、最近はどの規格がメジャーなんでしょうかね。詳しい方が居られたら教えてください :)
GyaASE に ET:QW (Enemy Territory: Quake Wars) を追加しました。
↑夕日をバックにスクリーンショットを撮るとかっこよく見える法則 :P
また、Bot の数を表示してほしいというリクエストをいただいたので、人数表示のフォーマットを "プレーヤ数(人間の数)/スロット数" に変更してみました。とりあえず Ping が 0 かどうかで Bot かどうかを判断しているので、id系ゲーム以外のゲームで表示が若干変になるかもしれません :) また時間のあるときに調べてみます。
それと、GyaASE で内部の色々な情報を、ぼちぼちドキュメントに書いています。サーバブラウザ関連に興味のある方はどうぞ :) 今のところ マスターサーバの情報 をまとめおわりました。
Google Translate (自動翻訳)をサイドバーに追加してみました。
<script type="text/javascript"><!--
var target = encodeURIComponent(document.location.href);
document.write('<a href="http://translate.google.com/translate?u=' + target + '">English</a>');
//-->
</script>
こんな感じでちょっと JavaScript を使うと見ているページに合わせて URL を自動で書きかえられます :)
実行結果:
まだ情報が少ないため、ゲーム起動のプロトコル名がわかりませんでした。応急措置として .bat ファイルで対処しています。UT99 の時は unreal://IP:PORT で、UT2004 は ut2004://IP:PORT だったので、類似のものがあるはずなんですがまだ見つかっていません。情報求む :)
こちらで把握できた範囲でのまとめ
まず、マスターサーバは GameSpy 系 (master.gamespy.com:28900) なので、GSlist を使うと簡単にゲームサーバの IP リストが取得できます。ゲーム名は ut3pcd を指定します。
gslist -q -o 5 -n ut3pcd
ゲームサーバ内の情報を取得するには QStat で -gs4 オプションを付けると情報を取得できます。
qstat -gs4 IP:PORT -P -R
なお、サーバ情報取得のプロトコルは gs4 の拡張?になっているみたいで、まだ QStat が正式には対応していないみたいです。が、以下のようにルール中に、マップ名(p1073741825)、ゲームタイプ(p1073741826)、サーバ名(p1073741827)が書かれているので、こちらから取得できます。
<rule name="p1073741825">VCTF-SUSPENSE</rule>
<rule name="p1073741826">UTGameContent.UTVehicleCTFGame_Content</rule>
<rule name="p1073741827">UT3 VCTF server</rule>
ゲーム起動は、ut3://IP:PORT だろうと思ったんですが、まだ出来ないみたいなので、とりあえず以下のコマンドを .bat ファイルで実行させています。
C:\Program Files\Unreal Tournament 3 Demo\Binaries\UT3Demo.exe IP:PORT
情報は、Wiki にまとめておきましたので、新しいことがわかったら更新しておきます :)
追記2007/12/21: 検索エンジンで "CoD4 Wiki" でこのページに飛んでくる方がたくさんいるのですが、たぶんお求めのものはこちらです→ http://www41.atwiki.jp/cod4/
QStat の SVN rev.280 で CoD4 対応がされたようです。以下にまとめておきます。
情報は、Wiki にまとめておきましたので、新しいことがわかったら更新しておきます :)
Layzie さんの blog を見ていたら閉鎖されるとのこと。どうもおつかれさまでした。一時期、お昼休みの楽しみは Layzie さんの blog でしたよ(朝記事が更新されていたので) :P
んで Layzie さんのはてなダイアリー を見てたら、何やら Twitter にハマっているみたいだったので、前から気になっていることもあって、登録してみました。
もし Twitter をやっている方がいたら登録してやってください :)
Twitter の話題。とりあえず、friend を登録しないとはじまらないみたいだったので、ちょっとスクリプトを書いて、キーワードに関連する記事を書いた人を自動的に登録してみました。
まず、Twitter 検索 という便利なサイトを見つけたので、このページ からキーワードで検索をして、その結果からユーザ名を抽出しました。
で、そのユーザ名を Twitter API (日本語訳) に渡して自動的に登録するようにしてみました。スクリプトはこちら。
wget -O- "http://twitter.1x1.jp/rss/search/?keyword=foo&text=1" | perl -nle 'print $1 if (m|<title>.*@(.+?)\s.*</title>|)' | sort | uniq | perl -nle 'print "wget --save-headers -O- --user=\"email\" --password=\"pass\" http://twitter.com/friendships/create/$_.xml";' | sh > result.log
foo にキーワード、email に登録時のメールアドレス、pass にパスワードを置き替えてください。これでキーワードに関連する記事を書いたユーザを friend (Following?) に登録できます。なお、既に登録されているユーザを再度登録しようとすると 403 Forbidden、また、60分間に70リクエスト以上送信すると 400 Bad Request が返って来るので注意。
スクリプトをちゃんと書かないとダメかと思ったけど、やや強引に one liner で済ませました :D
Twitter の Followers を friends(Following) に一括登録する shell script を書いてみました。
user と pass は自分のアカウントのものに書き換えてください :)
有名な Lisp ハッカー Paul Graham が Arc という新しい Lisp 系言語を リリースしました。
以下、Windows でのインストール方法です。
@echo off cd /d C:\MzScheme\arc0 ..\MzScheme -m -f as.scm
とりあえず Arc 関連のリンクをまとめておきました。他にもあったら教えてください。
Arc のソースをつらつらと眺めているので、ついでにメモを書いてみる。チュートリアルと Arc Cross Reference も適宜参照してもらうとよいかも。
まず、Arc を起動するときに最初に読み込む Scheme のスタートアップファイル as.scm から。(as.scm の as は Arc Startup の略?)
(require mzscheme) ; promise we won't redefine mzscheme bindings (load "ac.scm") (require "brackets.scm") (use-bracket-readtable) (aload "arc.arc") (aload "libs.arc") (tl)
いくつかのファイルが順にロードされていて、どうやら以下のように分かれているようだ。
ac.scm (ac は Arc Core の略?)は Arc の式を Scheme に変換して実行するコア部分。Arc から Scheme に変換するコンパイラと、プリミティブな関数が Scheme にて書かれている。
brackets.scm は Scheme のリードテーブルを拡張して [+ _ 1] のような式を扱えるようにしている("[" と "]" というトークンはもともと Scheme にはないため)。
arc.arc で様々な関数/マクロが Arc にて記述されている。
libs.arc では HTTP サーバやアプリケーションサーバ等のライブラリをロードしている。
次に ac.scm (Arc Core?)。まず as.scm の最後で呼ばれている (tl) を見てみる。tl は Top Level の略か。
(define (tl)
(display "Use (quit) to quit, (tl) to return here after an interrupt.\n")
(tl2))
(define (tl2)
(display "arc> ")
(on-err (lambda (c)
(set! last-condition* c)
(display "Error: ")
(write (exn-message c))
(newline)
(tl2))
(lambda ()
(let ((expr (read)))
(if (eqv? expr ':a)
'done
(let ((val (arc-eval expr)))
(write (ac-denil val))
(namespace-set-variable-value! '_that val)
(namespace-set-variable-value! '_thatexpr expr)
(newline)
(tl2)))))))
これは典型的な read-eval-print loop (repl)。on-err の部分はエラー処理で、エラーが起きたらそっちに飛んで、最後にまた tl2 を呼びだしている。
read は Scheme のをそのまま使っている(前述の "[" と "]" を扱うためにリードテーブルはいじってある)。Arc も Scheme も S 式なので楽できるね :D
eval は当然 Arc から Scheme に変換しないと評価できないので arc-eval という関数でやってる。arc-eval については後述。
で、評価結果を write で表示。ここで、ac-denil って関数でラップしてるんだけど、この ac-denil や ac-niltree 等の関数は他の部分でも沢山ある。Arc をも含めた一般的な Lisp では、真偽値は t と nil で空リストも nil で表わすことになっている一方、Scheme だと真偽値は #t と #f で、空リストは '() で表わすことになっている。で、その辺の差異を ac-denil 等の関数を使って吸収してると思っておけば OK。
コードを見るとわかるけど、Arc のプロンプトで :a と入力すると Scheme に戻ってこれる。で再度 Arc に入るには (tl)。
次は arc-eval。arc-eval は単に Arc の式(expr)を ac という関数で Scheme の式に変換して Scheme の eval に渡しているだけ。つまり ac が Arc→Scheme のコンパイラになっている。ac は Arc Compile(r) の略?
(define (arc-eval expr)
(eval (ac expr '()) (interaction-environment)))
(define (ac s env)
(cond ((string? s) (string-copy s)) ; to avoid immutable strings
((literal? s) s)
((eqv? s 'nil) (list 'quote 'nil))
((ssyntax? s) (ac (expand-ssyntax s) env))
((symbol? s) (ac-var-ref s env))
((ssyntax? (xcar s)) (ac (cons (expand-ssyntax (car s)) (cdr s)) env))
((eq? (xcar s) 'quote) (list 'quote (ac-niltree (cadr s))))
((eq? (xcar s) 'quasiquote) (ac-qq (cadr s) env))
((eq? (xcar s) 'if) (ac-if (cdr s) env))
((eq? (xcar s) 'fn) (ac-fn (cadr s) (cddr s) env))
((eq? (xcar s) 'set) (ac-set (cdr s) env))
; this line could be removed without changing semantics
((eq? (xcar (xcar s)) 'compose) (ac (decompose (cdar s) (cdr s)) env))
((pair? s) (ac-call (car s) (cdr s) env))
(#t (err "Bad object in expression" s))))
で ac は Shiro Kawai さんの 2008/01/30 の日記にある通り、
よく、「Schemeはdefine, quote, if, lambda, set!の基本構文があれば残りの構文はそれで書ける」と言うけれど、ほんとにそれをやっちゃった。コアで定義されている構文は quote, quasiquote, if, fn (lambdaに相当), set (defineとset!に相当)だけ。
数値等のリテラルならそのまま。シンボルなら ac-var-ref で値を返す。シンタックスなら expand-ssyntax で展開して再度コンパイル。式がペアなら関数呼び出し。で、あとは quote, quasiquote, if, fn, set をそれぞれ専用の関数(ac-*)で処理してる。
シンプルな Lisp ですね :D
もし、Arc→Scheme の変換結果を見てみたければ、以下のように arc-eval をちょっと変更してやって、Scheme のコードを表示させるようにしてみるとよいかも。
#|
(define (arc-eval expr)
(eval (ac expr '()) (interaction-environment)))
|#
(define (arc-eval expr)
(let ((scm (ac expr '())))
(display "scm: ")
(newline)
(pretty-print scm)
(eval scm (interaction-environment))))
実行してみるとこんな感じ。
arc> 1
scm:
1
1
arc> (+ 1 2)
scm:
(ar-funcall2 _+ 1 2)
3
arc> (= a 1)
scm:
((lambda ()
'nil
(begin (let ((| a| 1)) (namespace-set-variable-value! '_a | a|) | a|))))
1
arc> a
scm:
_a
1
arc> (def fact (n)
(if (<= n 1) 1 (* n (fact (- n 1))))))
scm:
((lambda ()
'nil
(ar-funcall3 _sref _sig '(n . nil) 'fact)
((lambda ()
'nil
(if (not (ar-false? (ar-funcall1 _bound 'fact)))
((lambda ()
'nil
(ar-funcall1 _disp "*** redefining ")
(ar-funcall1 _disp 'fact)
(ar-funcall1 _writec #\newline)))
'nil)
(begin
(let ((| fact|
(lambda (n)
'nil
(if (not (ar-false? (ar-funcall2 _<= n 1)))
1
(ar-funcall2
_*
n
(ar-funcall1 _fact (ar-funcall2 _- n 1)))))))
(namespace-set-variable-value! '_fact | fact|)
| fact|))))))
#<procedure: fact>
arc> (fact 5)
scm:
(ar-funcall1 _fact 5)
120
とりあえず今日はここまで。次回は、個別のコンパイル関数(ac-fn等)やマクロ関連を見ていくつもり :D
Arc のフォーラムで見つけたEmacs での Arc開発環境の話。いずれ近いうちに Arc 専用のモードが出てくると思うんですが、それまでの一時しのぎとして lisp-mode を乗っ取る形で対応する方法です。以下は Meadow でのやり方ですが、Unix 系では .bat を .sh に置き換えてください。
Arc 起動用のバッチファイルを作成。例) C:\MzScheme\arc0\arc.bat
@echo off cd /d C:\MzScheme\arc0 ..\MzScheme -m -f as.scm
~/.emacs.el に
;;;
;;; for Arc
;;; see http://www.robblackwell.org.uk/?p=88
;;;
(setq inferior-lisp-program "C:\\MzScheme\\arc0\\arc.bat")
(setq inferior-lisp-prompt "^arc>+ *")
(add-to-list 'auto-mode-alist '("\\.arc$" . lisp-mode))
(put 'def 'lisp-indent-function 'defun)
(put 'if 'lisp-indent-function 0)
(put 'do 'lisp-indent-function 0)
;; TODO: more indent definitions
などと書くと普通の Lisp のように M-x run-lisp でArc を立ち上げたり、ソースコード中で C-x C-e で直前の S 式を評価したり、C-M-x で def を評価したりできます。インデントについてはやりかけなので、もっと追加する必要があります。
需要があるかどうかわかりませんが、QStat の Windows 32bit 用の exe を置いておきます。ET:QW 1.4 対応の patch をあててあります。 SVN で新しいバージョンが出ても zip 中の src/qstat.vcproj をコピーして、Visual Studio で開いてビルドすれば OK だとおもいます。こちらでは Microsoft Visual C++ 2008 Express Edition でコンパイルしました。Unix 系 OS でのコンパイル方法は GyaASE:Compiling Qstat を参照してください。
Arc の新しいバージョンが出ました。arc1.tar ダウンロードして、MzScheme のディレクトリに展開で OK です。
今回の目玉?は
The most dramatic change is probably the ability to use x.y and x!y as abbreviations for (x y) and (x 'y) respectively.ということなので、ちょっといじってみました。
うーん、なんかこれはやりすぎのような気がしないでもない...Use (quit) to quit, (tl) to return here after an interrupt. arc> prn.1 1 1 arc> =.x.1 1 arc> x 1 arc> +.1.2 3 arc> prn!hello hello hello arc> (= lst '(1 2 (3 4) 5 (6))) (1 2 (3 4) 5 (6)) arc> lst.0 1 arc> lst.2 (3 4) arc> lst.2.1 (3 4) arc> (lst.2 1) 4
Warsow Mumble Mod をリリースしました。この MOD は、Warsow のプレーヤの位置情報(場所、見ている方向)に応じて、声の聞こえる方向や音量を調節してくれます。例えば、右にいるプレーヤがしゃべると、右のヘッドフォンから声が聞こえます。また、遠くにいる人の声は小さく聞こえます(設定で調節可能)。Mumble は、主にゲームで使われることを想定した、オープンソース、低レイテンシ、高品質なボイスチャット(VC)ソフトウェアです。
GyaASE に faker が出現して blog のアクセスを増やしてもらったので、ついでになにか記事を書いてみた :P
Chat のほうにも書きましたが、とりあえず、来年の3月までサーバ会社にお金を払っているので、特別な事情が起こらない限りサービスを続ける予定です。それと最近すごく忙しいのでコーディングできてないのですが、ひと段落したら GyaASE 2.0 もぼちぼち作っていきたいと思います :D
それと、寄付にご協力していただいている皆様、ありがとうございます :D
EDIT: faker 対策もしておきました。faker は IP の一部が表示されるようにして、Guwashi 本人の投稿は id のところに admin と表示されるようにしました。
たぶん、超ニッチな情報だと思うんですが、一応書いておこう :)
QStat の UTF-8 対応はかなりいい加減になっているようなので、以下のように修正すると、Source 系のゲームで日本語のサーバ名等が表示できます。あまりよくわからんのですが、Source 系は既に UTF-8 でサーバ名等を返してくるので、わざわざ Unicode から UTF-8 に変換しなくてもいいって感じなのかな。
% svn diff qstat.c
Index: qstat.c
===================================================================
--- qstat.c (revision 310)
+++ qstat.c (working copy)
@@ -11771,7 +11771,7 @@
static unsigned char _buf[4][MAXSTRLEN + 8];
static int _buf_index = 0;
unsigned char *result, *b, *end;
- unsigned int c;
+ unsigned char c;
if (string == NULL)
{
@@ -11843,7 +11843,7 @@
{
fprintf(stderr, "Encoding error (%d) for U+%x, D+%d\n", 1, c, c);
}
- else if (xml_encoding == ENCODING_LATIN_1)
+ else if (xml_encoding == ENCODING_LATIN_1 || xml_encoding == ENCODING_UTF_8)
{
if (!name_xforms)
{
実行例はこんな感じ。
% qstat -utf8 -xml -a2s 121.113.186.235:27015
<?xml version="1.0" encoding="UTF-8"?>
<qstat>
<server type="A2S" address="121.113.186.235:27015" status="UP">
<hostname>121.113.186.235:27015</hostname>
<name>[JP](test-L) 鉄砲倶楽部/部室</name>
<gametype>cstrike</gametype>
<map>de_dust2</map>
<numplayers>0</numplayers>
<maxplayers>32</maxplayers>
<numspectators>0</numspectators>
<maxspectators>0</maxspectators>
<ping>47</ping>
<retries>0</retries>
</server>
</qstat>
ちなみに -utf8 をつけないとこんな感じ。
% qstat -xml -a2s 121.113.186.235:27015
<?xml version="1.0" encoding="iso-8859-1"?>
<qstat>
<server type="A2S" address="121.113.186.235:27015" status="UP">
<hostname>121.113.186.235:27015</hostname>
<name>[JP](test-L) IG 2E(6F%=I(/I(E.$</name>
<gametype>cstrike</gametype>
<map>de_dust2</map>
<numplayers>0</numplayers>
<maxplayers>32</maxplayers>
<numspectators>0</numspectators>
<maxspectators>0</maxspectators>
<ping>31</ping>
<retries>0</retries>
</server>
</qstat>
.NET Framework を使ってちょっとしたアプリケーションを作るために Windows PowerShell をお勉強中。今作ってるのは...
サーバに空きがあるとバルーンで通知してくれたり、
登録しておいたフレンドがサーバにいると通知したり、って感じ。
近いうちに公開できると思います :D