[[日本語化]]のページも参考にしてください。

SIZE(10):2003.04.11 (金) 22:13:04 <u*j*2*6*> BugTrackの一部をここに移動しました~
SIZE(10):2003.08.14 (木) 01:31:11 <Heracules> Redirectの仕様を若干更新。アドレス:ポート#13が正式な仕様の模様。~
SIZE(10):2003.08.21 (木) 04:54:04 <Heracules> Lopsterは、2番でログイン後、10203番コマンドと10112番コマンドを送信します。751を送ると752を返します。~
SIZE(10):2003.08.21 (木) 04:54:51 <Heracules> [10203] "+ERROR +BAN +CHANGE +KILL +LEVEL +SERVER +MUZZLE +PORT +WALLOP +CLOAK +FLOOD +PING +MSG +WHOIS +ANNOUNCE +BROWSE +MOTD +FRIEND +CHANNEL +REGISTER +VAR +ABUSE"~
SIZE(10):2003.08.21 (木) 04:55:08 <Heracules> 何を意味するのかはnap.txtにはなかったので不明です。~
SIZE(10):2003.08.21 (木) 04:56:54 <Heracules> AudioGnomeも10112を送るようです。~
SIZE(10):2003.08.21 (木) 05:05:08 <Heracules> 10203番コマンドの資料をみつけました(Slavaにも搭載されてました)。~
SIZE(10):2003.08.21 (木) 05:05:33 <Heracules> 10203 - set user mode [CLIENT]~
SIZE(10):2003.08.21 (木) 05:05:45 <Heracules> 書式:[-]{ALL,MUZZLE,BAN,KILL,PORT,WALLOP} [ ... ]~
SIZE(10):2003.08.31 (日) 07:54:26 <Heracules> Shift-JIS以外の2バイト文字を使わせたくない(外人の流入による文字化け等の防止)場合のための判別方法を追記。~
SIZE(10):2003.09.01 (月) 05:29:57 <えーと> Shift_JISの判定ですが、~
SIZE(10):2003.09.01 (月) 05:30:05 <えーと> LeadBytesってPublic変数がVCL(sysutils)にあるので、~
SIZE(10):2003.09.01 (月) 05:30:22 <えーと> それを使うと多少便利かもしれません。~
SIZE(10):2002.10.29 (火) 23:38:03 <u*j*2*6*> コンパイルしたら1時間おきにかたまる!!という人へ。Delphiのサービスパックいれてみてね~
SIZE(10):2002.10.29 (火) 23:40:20 <u*j*2*6*> http://www.borland.co.jp/delphi/del6up.html#del6up2~
SIZE(10):2002.10.29 (火) 23:41:41 <u*j*2*6*> http://www.borland.co.jp/delphi/del6up.html#del6rtl~
SIZE(10):2002.11.09 (土) 15:30:44 <Alan Smithee> DB書き出しのタイミング(だと思われる)でBANリスト等が巨大かつユニプロセッサだとやはり固まる。マルチプロセッサ環境や本家のSlavaNapでは固まらない。~
SIZE(10):2002.11.09 (土) 19:26:59 <u*j*2*6*> (・ロ・)ホ,('ロ')ホ--ッッ~
SIZE(10):2002.11.16 (土) 16:05:05 <Heracules> AthlonXP2000+ユニプロセッサ環境(Win2kSP3)では固まらないんですが?・・・なんででしょうねw~
SIZE(10):2003.04.10 (木) 15:38:39 <|-`)> 「サーバー」-「データベースの保存」 で再現するか試してみては?>Alan 少なくともDB保存時か否かははっきりするかと。~
SIZE(10):2003.08.01 (金) 19:45:30 <Heracules> わかると思うけど微妙なコメント:explorer.exe置き換えのときはタスクマネージャからプロセスを終了して置き換えてください。(あたりまえかw~
SIZE(10):2003.11.07 (金) 20:23:15 <u*j*2*6*> GPLの解釈ちがうかな?~
SIZE(10):2003.11.10 (月) 23:21:55 <Heracules> たぶんあってると思う・・・。ってことはDLLないと実行できないような場合はGPLの制約にしばられちゃうのか・・・。~
SIZE(10):2003.11.10 (月) 23:22:21 <Heracules> 別モジュール(同じメモリ空間で動作しない)ならば公開する義務はないとか。~
SIZE(10):2003.11.10 (月) 23:44:10 <u*j*2*6*> あ、前提を1コ忘れてた。ソース公開したくないdllには、GPLのソースが使われてないっていうのが前提ですね~
SIZE(10):2003.11.10 (月) 23:48:57 <u*j*2*6*> 別モジュールっていうのは下の4パターンのうち左下・右下のパターンのことでいい?~
SIZE(10):2003.11.15 (土) 21:20:11 <Heracules> たぶん、メモリ空間がいっしょじゃない(DLLとして別ファイル化し外に出している)ならば必須DLLでも問題ないと思う~
SIZE(10):2003.11.15 (土) 21:20:40 <Heracules> DLLにGPLコードが使われていないってのは当然の前提ですがw~
SIZE(10):2003.11.16 (日) 00:02:25 <u*j*2*6*> へー、そうなんだ~
SIZE(10):2003.11.16 (日) 00:44:20 <u*j*2*6*> DLLとして別ファイル化=メモリ空間がいっしょじゃないってことになるの?うーむ~
SIZE(10):2003.11.16 (日) 00:45:42 <u*j*2*6*> [[このあたり:http://www.gnu.org/licenses/gpl-faq.ja.html#GPLAndPlugins]]がポイントかな~
SIZE(10):2003.11.16 (日) 09:46:06 <Heracules> 完全な黒からグレーゾーンにもってけるって程度の微妙なとこかもw~
SIZE(10):2003.12.17 (水) 17:21:43 <Heracules> 一応コンパイルDelphi7でやってみたけど、安全でない型としてPointerがやっぱり警告でますね(一応動くと思うけど)。~
SIZE(10):2003.12.17 (水) 17:31:47 <Heracules> settings.pas書き加えようとしたらエラー(:が必要な場所に識別子がある云々)が出る(settings.pasを閉じた状態ではコンパイル可能)。~
&new{2008-05-02 (金) 14:36:27}; COMMENT{<qnmhxctsof> XnheRQvU}~

#comment
//#comment
#contents
*Delphi7でコンパイルするには(BugTrackの通りすがりの人ありがとう) [#v9a286b7]
下のような感じでDelphi7のVersion判断をRX.INCで定義すればOKのようです(試してないのでうまくいったら教えてください)
 {$IFDEF VER150} { Borland Delphi 7.0 }
   {$DEFINE RX_D3}
   {$DEFINE RX_D4}
   {$DEFINE RX_D5}
   {$DEFINE RX_D6}
   {$DEFINE RX_D7}
   {$WARN SYMBOL_PLATFORM OFF}
   {$WARN UNIT_PLATFORM OFF}
 {$ENDIF}

*GPL回避作戦 [#nb1cb9bf]
#ref(GPL対策.png,left,80%)
*DelphiのTTimerの精度について [#a2c4968b]
毎回のイベントごとに誤差がおおきくなっていく~
[[高精度タイマ:http://halbow.cool.ne.jp/Notes/N015.html]]~
[[(Delphi-ML:71547) Re: 計測時間間隔が重要:http://130.158.124.192/~takeuchi/delphi/browse.cgi?index=071547&back=http%3A%2F%2Fhalbow%2Ecool%2Ene%2Ejp%2FNotes%2FN015%2Ehtml]]

*XPのデザインに対応する [#q866de4a]
http://www.namakoworld.com/lowtech/d6tips/dtips4.htm~
http://homepage1.nifty.com/ht_deko/tech002.html#tech021

*Delphi 6 で Shift-JIS でフォームを保存する [#k9594094]
引用元:http://www.zoo.co.jp/solution/tech/delphi/
 Delphi 6 は Kylix との互換性のため、フォームファイル(.dfm ファイル)を
 UniCode で保存します。これを Delphi 5 同様に Shift-JIS で
 保存するには次のようにします。
 
 レジストリエディタを起動します。 
 HKEY_CURRENT_USER\Software\Borland\Delphi\6.0 とたどります。 
 [編集(E)] - [新規作成(N)] - [キー(K)] を選び、
 "FileFormat" という名前のキーを作成 します。 
 [編集(E)] - [新規作成(N)] - [DWORD 値(D)] を選び、
 "DFMFormat" という名前の DWORD 値を作成します。値 は初期値の 0 のままにします。 
 これでフォームファイルが Shift-JIS で保存されるようになります。
 ただし、Windows 95 + Delphi 6 SP2 の環境では
 フォームの 2 バイト文字が化けるバグがあります。
 Windows 95 で Delphi 6 をお使いの方は
 SP3 が出るまでは SP1 止まりにしておきましょう。

*Delphi IDEでの矩形選択 [#z5b0414d]
ALTをおしながら選択すると矩形選択できます
#ref(RectSelection.png,center,80%)

*Win2000タスクトレイの256色表示 [#z5ab05ad]
情報源:~
http://cyberfield.virtualave.net/ ~
http://www.dr-hoiby.com/TrayIconIn256Color/index.html ~
Windows2000では、タスクトレイアイコンの表示色が16色なので、
256色以上のアイコンがきれいに表示できません。~
が、Explorer.exeをバイナリエディタで書き換えると、256色にできます。
ここではWin2000sp3のものを書き換えます。

  name : explorer.exe
  size : 242960
  from : Windows 2000 build 5.00.2195 SP3 (JP)
  ver  : 5.0.3502.5321
  CRC  : 07B4
  CRC32: 34F4E3FD

  Offset 0x1CDE  : 01 -> 11
  Offset 0xD7E4  : 01 -> 11
  Offset 0x14CE9 : 01 -> 11
  Offset 0x14CFA : 01 -> 11

書き換え後のCRCは622D97B9(CRC32)になります。
これをオリジナルのExplorer.exeと置き換えればOK~
置き換えがうまくいかなかったらコメントください。

Win2000sp4の場合はつぎのとおりです。
  ファイル名 : Explorer.exe
  サイズ     : 237 KB (243,472 バイト)
  バージョン : 5.0.3700.6690
  CRC        : 7679
  
   88EE : 01 → 11
  14E25 : 01 → 11
  14E36 : 01 → 11
  
  書き換え後のCRC  : 5795

*Shift-JISかどうかの判定方法 [#l198c0d2]
 まず、通常のチェックを入れる。その後、Shift-JISを有効にする場合、
 以下の範囲かどうかをチェックする。
 Chr(129)..Chr(159),Chr(224)..Chr(234)でShift-JISコードの2バイト文字は
 始まるので、この範囲の文字の場合は次の1バイトをチェック対象からはずす。
 それ以外の場合は、 不正ということにすればよい。

*SlavaNapサーバーリンクの仕様(NET_BUILD=19) [#s479d6c3]
 SlavaNapサーバーリンク資料(NET_BUILD=19) 2003.08.09 usj12262@hotmail.com
 
**■コマンド表 [#j2f45ddd]
 NET_BUILD=19のとき
 920(MSG_CLIENT_BEFORELOGIN)
   書式: 00
 8000(MSG_SRV_LOGIN)[CLIENT]
   書式: "<host>" <port> "<version>" "<net_build>" <handle> "<console>"
         "<cons_reg_user>" "<conslist>" "<handlelist>"
 8001(MSG_SRV_LOGIN_ACK)[SERVER]
   書式: "<version>" <handle> <console> "<cons_reg_user>"
 8008(MSG_SRV_SYNCCH)// channel sync
   書式: <channel> <n> <topic> <limit> <level> <state>
   備考: <state>は数字で指定する
 8009(MSG_SRV_VOICE)// voice user in channel (done by server)
   書式: <channel> <nick> <handle> <IsOP(1|0)> <IsForwardAll(1|0)>
 8010(MSG_SRV_OP)// op user in channel (done by server)
   書式: <channel> <nick> <handle> <IsOP(1|0)> <IsForwardAll(1|0)>
 8011(MSG_SRV_SYNCSRV)[CLIENT]// sync linked server
   書式: <host> <port> "<version>" handle "<console>" <myhandle> <incoming> "<reg_user>"
 8012(MSG_SRV_SYNCUSER)// sync user
   書式: "<nick>" "<pass>" "<soft>" "<level>" "<ip>" "<dataport>" "<totalup>"
         "<totaldown>" "<ul>" "<dl>" "<maxup>" "<queue>" "<speed>" "<shared>"
         "<server>" "<state>" "<lastseen>"
 8013(MSG_SRV_PUBLICSYNCUSER)// sync user (sent to all servers)
   書式: "<nick>" "<pass>" "<soft>" "<level>" "<ip>" "<dataport>" "<totalup>"
         "<totaldown>" "<ul>" "<dl>" "<maxup>" "<queue>" "<speed>" "<shared>"
         "<server>" "<state>" "<lastseen>"
 8017(MSG_SRV_UPDATEUSER)// update user data
   書式: "<nick>" "<totalup>" "<totaldown>" "<up>" "<down>" "<maxup>" "<queue>"
         "<speed>" "<shared>"
 8023(MSG_SRV_SERVERBANCLEAR)// clear bans
   書式: empty
 8024(MSG_SRV_SERVERBANSYNC)// sync ban
   書式: <nick!ip> "<admin>" <bantime> <expire> <lastattempt> "<lastnick>"
         <tries> "<reason>"
 8025(MSG_SRV_REGISTEREDCLEAR)// sync regisreations start
   書式: empty
 8026(MSG_SRV_REGISTEREDSYNC)// sync registrations
   書式: "<nick>" "<pass>" "<level>" "<totaldown>" "<totalup>" "<lastip>"
         "<lastseen>" "<state>" "<createdtime>" "<createdby>" "<lastsetby>"
 8029(MSG_SRV_ALIAS)[CLIENT]// server alias
   書式: <host> "<alias>" "<1|0>"
 8031(MSG_SRV_BLOCKLISTCLEAR)// clear blocked files list
   書式: empty
 8032(MSG_SRV_BLOCKLISTSYNC)// sync blocked files list
   書式: <blockword1> [blockword2 [ blockword3 [...]]]
 
**■サーバー接続のながれ [#p52fbae2]
 I.接続元:サーバー窓で接続ボタンを押す
 
 TServer.Connect
   CreateConsoleList//ネットワークのコンソール・サーバーハンドルの
     リスト(自分を含む)を更新
   Self.thread:=TServerThread.Create(Self)
 
 II.接続元:サーバー接続用スレッド開始
 TServerThread.Execute
  srv.Exec(920,'00');//MSG_CLIENT_BEFORELOGIN=920
  8000を送信
 
 III.接続先:メインスレッドでサーバーコマンド8000番を受けとる
 TMainThread.Execute
   TMainThread.CheckServers
     TServer.Flush
     TServer.Receive
       ProcessServerCommand(Self)
         ProcessRemoteUserCommand// gcmd.id=8000の場合
           ProcessCommand
             Handler_ServerLogin// ここでNET_BUILDのチェック
               Handler_LinkServer
                 800を送信
                 TServer.Flush
                 CompleteSyncServer(srv,1)//1なら8000を受けた側。0なら8000を送った側。
                   8011,8029を送信
                   SyncServers(srv,srv2)
                     8011,8029を送信
                     SyncServers(srv,srv3)(db_servers.count繰り返し)
                   8023,8024を送信(srv.incoming=Trueの場合のみ)
                   8031,8032を送信(srv.incoming=Trueの場合のみ)
                   8025,8026を送信(srv.incoming=Trueの場合のみ,
                                     8026は登録ユーザーの数だけ繰り返し)
                   CompleteSyncUser(srv,user2)
                     if srv<>nil then 8012を送信 else 8013を送信
                   UpdateUser(user2,srv);
                     8017を送信
                   8008を送信
                   WriteAllServersEx(srv,MSG_CLIENT_JOIN,
                     user2^.username,ch.channel)//400
                   if ch.Operator(user2) then 8010を送信
                   else if (chModerated in ch.state) and
                     StrHash_FindString(ch.voices,
                       user2^.username,true) then 8009を送信
                   214を送信
       SERVER_MAX_RECEIVE_RECURSE(=10)回までReceiveを繰り返す
     TServer.Flush

*Redirectサーバの仕様(独自調査のため正式な仕様とは違うかもしれません) [#v69f481a]
 Redirectサーバは、使用するポートをあらかじめListenしています。
 クライアントがRedirectサーバにTCP接続をかけます。
 Redirectサーバはサーバのアドレスをクライアントに
 「最初に接続したTCPの接続」で送信します(書式:「サーバアドレス:ポート#13」)
 Redirectサーバ側からTCP接続をクローズします。
 クライアントは送信されてきたアドレスに接続を行います。
 
 Redirectが送信するアドレスはホスト名でもIPアドレスでもかまいません。
 
 なお、WinMXでの「OPENNAP***(REDIRECT)」は、
 OPENNAPのバージョンに対する互換のことなので、どれでもいいかと(SlavaNapの場合)

*クライアント判定 [#n2edca7b]
WinMX の仕様を調べたいのですが資料が少なく、ここでお聞きしてもかまいませんか。
リモートキューの方法とログイン時の挙動はこんな感じでOKでしょうか。by heavy_baby

リモートキューってあんまり確かめたことないけど、
キューの限界のところって、たしかにこういうかんじかもしれないですね!~
2.6から3.3へはキューがいれられないというのを聞いたことがあるのと、~
WantQueueは相手によって送られないこともあるとも聞いたような~

**WinMX 2.6 Remote Queue Requester [#a181e75f]
 203	download request [CLIENT]
 620	queue limit [SERVER]
 	<nick> "<filename>" <n>
 	if <n> = 0 then "busy queueble"
 205	private message to another user [CLIENT]
 	<nick> "//WantQueue"
 203	download request [CLIENT]
 620	queue limit [SERVER]
 	<nick> "<filename>" <n>
 	"queued at <n>"
 
 ダウンロード可能かの確認は一定時間ごとに
 205	private message to another user [CLIENT]
 	<nick> "//WantQueue"
 203	download request [CLIENT]
 を発信するようです。(thx! #Rufuさん)

**WinMX 3.3 Remote Queue Requester [#q374113b]
 203	download request [CLIENT]
 620	queue limit [SERVER]
 	<nick> "<filename>" <n>
 	if <n> > 999 then "busy queueble"
 205	private message to another user [CLIENT]
 	<nick> "//WantQueue"
 203	download request [CLIENT]
 620	queue limit [SERVER]
 	<nick> "<filename>" <n>
 	"queued at <n>"

**2get Login [#k2739a98]
 2	login [CLIENT]
 3	login ack [SERVER]
 621	message of the day [SERVER]
 214	server stats [SERVER]
 870	add files by directory [CLIENT]
 208	hotlist [CLIENT]
 209	hotlist [SERVER]
 326	clear ignore list [CLIENT]
 326	clear ignore list [SERVER]
 700	change link speed [CLIENT]

 ping に対して pong で応答する
 MD5は32バイトの小文字英数
 5分おきにキューの更新をする
 共有ファイルのパスにコロンを含まない

**WinMX3.3とWinMX2.6の違い [#z1233812]
http://tmp.2ch.net/test/read.cgi/download/1032973542/509~
 509 :ナナシサソ :02/10/21 17:33 ID:pAm9bIOw
 3.3と2.6のログイン時のログとってみますた
 コマンド番号とその詳細はSlavaNapに入ってるnap.txt見るなりで
 
 このように違いがあるので、クライアント申告偽っても弾ける可能性あり
 改造してる人頑張って(漏れはコーディング出来ないので)
 
 WinMX3.3とWinMX2.6の違い(ログイン時)
 
 3.3
 Hotlistはコマンド207で処理している
 Received command [207] "USER2" (USER1, WinMX v3.3, 127.0.0.1)
 Sending command [301] "USER2" (USER1, WinMX v3.3, 127.0.0.1)
 
 2.6
 Hotlistはコマンド208で処理している
 Received command [208] "USER2" (USER1, WinMX v2.6j, 127.0.0.1)
 
 無視リストの処理をしている(コマンド326)
 Received command [326] "" (USER1, WinMX v2.6j, 127.0.0.1)
 Sending command [326] "0" (USER1, WinMX v2.6j, 127.0.0.1)
 
 回線速度申告の処理をしている(コマンド700)
 Received command [700] "1" (USER1, WinMX v2.6j, 127.0.0.1)