e転転転転//// オブジェクト e e e転転 ...3DRotate).pdf · Ð K図図図図上で 6 eをををを e e e e転転転させる _ 1.回転するためにオブジェクトを選択します。
B lack jumbodog 運転と改造のすすめ
-
Upload
sin-furuya02 -
Category
Technology
-
view
7.679 -
download
1
Transcript of B lack jumbodog 運転と改造のすすめ
BLackJumboDog 運転と改造のすすめ
2011.11.19 by sapporowroks
自己紹介
• ハンドル SIN/古谷誠進
• Twitter @furuya02
• 仕事 某社でシステムサポートみたいな感じ
• 住居 札幌
• 年齢 アラフィフ
オヤジなので、新しいもの・・・
(SNS、スマフォ、F#などなど)よく分かりません。(悲)
アジェンダ
• BJD紹介と設定の勘所 各種機能の紹介
3ステップ、Web、DNSサーバの設定例
•プログラムの構造と改造要領 SAMPLEサーバ・主要クラス
Socket、オプション、ログの使用方法
運転
改造
BJD紹介と設定の勘所
BlackJumboDogとは
BlackJumboDogとは、Windowsで動作するフリーの簡易サーバです。
Web、メール、プロキシ、FTP、DNS、DHCPサーバなどが利用可能です。また、リモートで制御・メンテナンスが行えます。
【利用の制限など】
営利外の場合は 制限なし。
営利目的の場合は、連絡下さい。
過去に悪質業者に無断利用され、問題になりました。
悪意がないと判断される場合、承諾させて頂いています。
インストール
デフォルトでC:¥BlackJumboDogに展開されます
公開ファイルは3種類
1.bjd-x.x.x.zip バイナリ
2.bjd-src-x.x.x.zip ソース
3. bjd-x.x.x.msi インストーラー
ファイルの種類
BJD.exe 本体
BJD.exe.config アプリケーション構成ファイル
Option.def 設定のデフォルト値
*.ini オプション保存ファイル (削除で初期化)
*Server.dll 各種サーバ機能 (14種類)
*.Log ログファイル
named.ca ルートサーバ一覧(DNSサーバ用)
examlpe.pfx SSL証明書サンプル(Webサーバ用)
DLLを削除すると
資源節約
脆弱性リスク軽減
リモート制御
「BJD.exe 接続先アドレス」で起動する
リモート側で、BJDで行うすべての操作が可能になり、遠隔制御ができます。
※リモートサーバを使用する設定が、あらかじめ必要です。
IPv6設定
IPv6がインストールされていれば、IPv6でbindできます。
IPv4とIPv6のデュアルスタックも可能
トレース表示
サーバとクライアント間のデータを表示
SEND サーバ送信データ
RECV クライアント送信データ
サービス起動
メニューからサービスの登録・起動などが可能です。
設定の勘所(3ステップ)
サーバを使用する(必須)
ACL設定する(必須)
サーバごと必要なオプションを指定
STEP1
STEP2
STEP3
STEP3の設定で、必須のものが不足している場合は、明確なエラーが表示されますので、安心して使用してみて下さい。
サーバを使用する
xxxサーバを開始するにチェック
STEP1
当該オプションを開く
ACLを設定する
デフォルトでALL Deny
誰も接続できません
1.各サーバごとオプションの最後のページ「ACL」
2.アドレスを追加
3.指定のみを「許可」/「禁止」に設定する
STEP2
サーバ毎の設定 STEP3
・Webサーバ ドキュメントルート、CGI、SSI、WebDAV、alias、認証・・・・
・FTPサーバ ユーザ作成、バナーメッセージ、SYST、仮想フォルダ
・DNSサーバ ルートキャッシュ、再帰要求、SOAレコード、リソース追加・・・
・HTTPプロキシサーバ 上位プロキシ、キャッシュ、URL制限、コンテンツ制限・・・
・リモート制御 パスワード、Listenポート・・・
・DHCPサーバ 配布するアドレス範囲、DNSサーバ、リース時間、MAC制御、WPAD・・・
必須は赤字のみ、その他は、取りあえずデフォルトのままでOK
3ステップの例外
1つのサーバDLLで複数サーバを設定できる場合は、
「サーバの追加と削除」が必要
現在は、「Web」と「トンネル」のみ
3ステップの例外(Webの例)
「追加と削除」で複数のサーバ
を作成できる
メニューが増減する
設定のための参考
http://www.ssapporoworks.ne.jp/spw/bjd/support.html
Web・DNSサーバの設定例
•デモ
プログラムの
構造と改造要領
コードの展開と再構築
bjd-src-x.x.x.zip ソース
開発環境が構築済の場合は、BJD.slnをダブルクリック
そのまま再構築(F5)
NUnitの参照
テストプロジェクトは、nunit.feameworkを参照している
のでNUnitが無い場合、エラーとなります。
エラーとなるTestプロジェクトを 全部削除する。 BJDの構築には影響なし
NUnitをインストールする
Sampleサーバ(雛形)
構築(F5)すると「SAMPLEサーバ(Z)」を見つけることができます。
SampleServer.dllを配布していないので、
バイナリ配布物では見えません
ソースコードにはSampleServerというプロジェクトが存在します。
Server.cs (サーバ本体)
partial class Server : OneServer {
public Server(Kanel kanel, string nameTag, OneBind oneBind)
:base(kanel, nameTag,oneBind) { } //サーバ生成(BJD起動・設定変更)
public override void _dispose() { } //サーバ破棄(BJD停止・設定変更)
public override bool _before_loop() { return true; } //サーバ起動
public override void _after_loop() { } //サーバ停止
//接続毎
override public void _subThread(SockObj sockObj) {
TcpObj tcpObj = (TcpObj)sockObj;
//切断
}
}
1.接続単位のサーバ動作を記述
2.前処理等は、オーバライドメソッドを利用
Log.cs (ログ文字列)
partial class Server {
public override string GetMsg(int messageNo) {
switch (messageNo) {
case 1:return kanel.Jp ? “日本語” : “English”;
//この形式でログ用のメッセージ追加
}
return “unknown”;
}
} 1.ログ出力文字列の定義 ログとして出力したい文字列を番号で指定する 基底クラス(OneServer)でLoggerを初期化する際、delegateとして渡される
Option.cs (オプション設定)
public class Option : OneOption {
//メニューに表示される文字列
public override string JpMenu { get { return "SAMPLEサーバ(&Z)"; } }
public override string EnMenu { get { return "&Sample Server"; } }
public Option(Kanel kanel, string path, string nameTag)
: base(kanel, path, nameTag, true/*ACL*/) {
//「useServer」オプションは必須
Add(new OneVal("useServer", false, CRLF.NEXTLINE,
new CtrlCheckBox((kanel.Jp) ? "SAMPLEサーバを使用する" :
"Use Sample Server")));
{//PAGE 基本設定 ////////////////////////////////////////////////////////////////////////////////
・・・・・・・・・・・・・・・・・・・・・・・・
1.メニューの表示文字列
2.オプション設定ダイログ初期化
サーバ共通オプション
ページ構成
コントロール変化時の処理
主要クラス
OneOption
オプション基底
Option
オプション
OneServer
サーバ基底
TreadBase
スレッド起停
Server
サーバ
ListOption
オプション一覧
karnel
BJDカーネル
-------------------
+o : ListOption
+s : ListServer
ListServer
サーバ一覧
*.dllを検索し
OneOptionを列挙する ListOptionを元にOneServerを列挙する
BJD.exe
SampleServer.dll
サーバスレッド
//Server.cs
partial class Server : OneServer {
//接続毎
override public void _subThread(SockObj sockObj) {
TcpObj tcpObj = (TcpObj)sockObj;
//切断
}
}
1接続単位の処理をここで記述する
接続先(クライアント)との処理はsockObjを使用する
SockObj クラス
SockObj
TcpObj UdpObj
//1行受信
byte [] LineRecv(…)
string AsciiRecv(…)
//1行送信
int LineSend(byte[] buf, …)
Int AsciiSend(string str,…)
//送信
void SendTo(byte [] buf)
//受信
Bool ReceiveFrom(…)
…
//接続元IP
Ip RemoteAddr
//接続元ホスト
String RemoteHost
…
TcpObj若しくはUdpObjにキャストして作業する
ログ出力
//Server.cs
override public void _subThread(SockObj sockObj) {
TcpObj tcpObj = (TcpObj)sockObj;
Logger.Set(LOG_KIND.NOMAL, tcpObj, 1, "テストメッセージ");
//Log.cs
public override string GetMsg(int messageNo) {
switch (messageNo) {
case 1:return kanel.Jp ? “日本語” : “English”;
Logger クラス
Logger
--------------------------
--------------------------
+Set ( )
//コンストラクタ
public Logger(…GetMsgDelegate getMsg)
//ログ出力
void Set(LOG_KIND logKid,SockObj sockObj,int messageNo,string detailInfomation)
LOG_KIND 種類 ERROR,NOMAL,DETAILset
messageNo メッセ―番号 GetMsg()で定義
detailInfomation 詳細情報(任意)
OneServer
サーバ基底
--------------------------
#Logger : Logger
Server
サーバ
基底クラスで定義されているLoggerを使用し、Logger.Set(…)で出力する
メニュー文字列
//Option.cs
public class Option : OneOption {
//メニューに表示される文字列
public override string JpMenu { get { return "SAMPLEサーバ(&Z)"; } }
public override string EnMenu { get { return "&Sample Server"; } }
ACL有効・無効
public class Option : OneOption {
public Option(Kanel kanel, string path, string nameTag)
: base(kanel, path, nameTag, true/*ACL*/) {
Optionのコンストラクタ
public class Option : OneOption {
public Option(Kanel kanel, string path, string nameTag)
: base(kanel, path, nameTag, true/*ACL*/) {
Add(new OneVal()…);
{//PAGE 基本設定 ////////////////////////////////////////////////////////////////////////////////
Add(new OneVal()…..
}//PAGE 基本設定 ////////////////////////////////////////////////////////////////////////////////
Init();//ValListの初期化
}
OneValをAdd()してInit()する
値オブジェクトをリストに列挙して初期化する
OneVal(値)クラス
OneOption
--------------------------
-ar : ListVal
--------------------------
-Add (OneVal )
ListVal
--------------------------
--------------------------
+ CreateCtrl()//Ctrl生成
//リモート対応
OneVal
--------------------------
+Name:string
+Value:obj
--------------------------
- ToReg() //保存
- FromReg() //読込
List<OneVal>
Option
オプション OneValの値として
ListValを保持できる
public OneVal(
string name,//名前
object defaultValue,//デフォルト値
CRLF crlf,//改行指定
OneCtrl oneCtrl) //コントロール
OneCtrl(コントロール)クラス
OneCtrl
CtrlTextBox CtrlCehckBox Ctrlint CtrlMemo
CtrlTabPage
CtrlGroupBox public CtrlTextBox(string help, int width,bool hidden=false)
public CtrlCheckBox(string help)
public CtrlInt(string help, int len)
….
コントールの種類ごとにコンストラクタが違う
インテリセンスの言う通り・・・・
必須オプション
//「useServer」オプションは必須
Add(new OneVal("useServer", false, CRLF.NEXTLINE
, new CtrlCheckBox("SAMPLEサーバを使用する"));
//「AppendServerOption」は必須
PROTOCOL_KIND protocolKind = PROTOCOL_KIND.TCP;
int port = 9999;//ポート番号
int timeout = 30;//タイムアウト
int multiple = 10;//同時起動数
AppendServerOption(list, protocolKind,port, timeout, multiple);
これらのオプションは、必ず存在するという前提で各種の動作が組み立てられている
オプションの使用
//オプション値の取得
var aaa = (string)OneOption.GetValue("aaa");
//Option.cs
Add(new OneVal("test01", "サンプル",CRLF.NEXTLINE,
new CtrlTextBox("テストテキスト", 300));
全てのオプション値は、GetValue(“name”)で取得できる
データの種類によってキャストが必要
オプションのキャスト例
//CtrlInt
var port = (int)OneOption.GetValue("port");
//CtrlCheckBox
var detail = (bool)OneOption.GetValue("detail");
//CtrlRadio
var authType = (int)OneOption.GetValue("authType");
//CtrlComboBox
var matching = (int)OneOption.GetValue("matching");
Sampleサーバの修正
•デモ
[付録]サーバ名の変更 (1)
SampleServerのフォルダをコピーして名前を変更
プロジェクトを開いて名前を付けて保存
(プロジェクト名を変更)
[付録]サーバ名の変更 (2)
プロジェクトのプロパティで
「アセンブリ名」及び「既定の名前空間」を変更
Server.cs Log.cs Option.csの
名前空間を修正
[付録]サーバ名の変更 (3)
プロジェクトを閉じて不要ファイルを削除
SampleServer.csproj
Sample.sln
Sample.suo
Option.csでメニューに表示される文字列を修正
[付録]サーバ名の変更(4)
BJD.slnを開き直して作成したプロジェクトを追加する
再構築(F5)
ご清聴ありがとうございました。
2011.11.19 by sapporowroks