カテゴリー「麻雀ゲーム作成」の記事

麻雀ゲーム作成を待ってる人はいないですよね?

このblogで、麻雀ゲーム作成を宣言して途中で保留してしまってますが、完了を期待してる人とかいないですよね?

もしコメントがあれば、再開しなければならないと思ってるのですが、多分無いと思うので、気が向くまでは別の事に注力していこうと思っています。

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

作成途中のゲ-ムをUP

作成途中のSamuraiJanをダウンロ-ドできるようにしました。

右上のSamuraiJan Downloadからダウンロ-ドできます。

ソ-スはすぐしたのレポジトリから入手できます。 Subversionでアクセスできます。

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

サーバ構築 LinuxのGateway追加

wget --spider --http-user=<ログイン名> --http-password=<パスワ-ド>
3 http://www.mydns.jp/login.html でhttpアクセスしようとしても失敗するので、調べていたら、どうもgatewayが設定できていなかったみたい。

/sbin/route add で追加しても、ネットワ-ク再起動したら消えてしまうので、

/etc/sysconfig/network-scripts/ifcfg-eth0 へ、下記の1文を追加。
GATEWAY=192.168.11.1

/etc/rc.d/init.d/network restart
/sbin/route で、追加されている事を確認。

wget --spider --http-user=<ログイン名> --http-password=<パスワ-ド>
3 http://www.mydns.jp/login.html でLinuxからアクセスしてから、

http://www.mydns.jp/ のアクセスログ確認をしてOK。

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

サーバ構築 Emobile解約し、マンションネットへ変更

今までのネット環境はEmobileをUSBでLinuxに接続して、Linuxをル-タとして使用していたけど、今度はEtherealのマンション付属のネット環境を使用するように、変更になりました。

■変更前

Netenvold

■変更後

Netenv

これに伴い、LinuxをProxyサ-バとして使っていたのを全部やめたので、その備忘録。

Linuxをル-タに接続した状態で

ifconfig でeth0がLANケ-ブルIFである事を確認して、
vi /etc/sysconfig/network で、GATEWAY を変更

その後、各種ル-タとして使ってた時の機能をストップ、proxyのポ-トも受け付けないように変更

/etc/rc.d/init.d/ipmasq stop
chkconfig ipmasq off
/etc/rc.d/init.d/dhcpd stop
chkconfig dhcpd off
/etc/rc.d/init.d/squid stop
chkconfig squid off
iptables -D RH-Firewall-1-INPUT -p tcp -m tcp --dport 8080 -j ACCEPT

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

今週末か来週くらいにver0.01リリ-ス予定

今週末か来週くらいにver0.01リリ-スしようと思います。

ピンフだけ対応した状態の、使い物にならないレベルから・・・

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

ホ-ムペ-ジビルダ-を買うか迷い中

SamuraiJanを公開するにあたり、ホームページ・ビルダー を買うかどうか迷い中。

ゲ-ムのダウンロ-ド、ソ-スのダウンロ-ド、当ブログへのリンク、等くらいなのが、テキストでhtml書いてもいいかな、とも思っていますが。

5/Mに引っ越し予定で、そこには100Mのブロ-ドバンドが付いてるので、引っ越し後なるべく早いタイミングで公開できればと思っています。

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

NetJan実装 Linuxサ-バにサ-バソフト、Windowsパソコンにクライアントソフトで実行まで

Linuxサ-バにサ-バソフトを入れて、Windowsパソコンにてクライアントソフトを4つ実行させて、通信し、麻雀できるところまで、進みました。

そろそろ公開かな、と思います。

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

NetJan実装 JDKクラスのソースを設定

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

自動VersionUPを実装

自動でVersionUPするようにしました。 苦労したのは、なぜかcocologにUPしたjarファイルが期待通りダウンロードできなかった部分。 普通のバイナリダウンロード時によく使われる実装なのですが。

   connect = (HttpURLConnection)url.openConnection();
   is = connect.getInputStream();
   os = new FileOutputStream(file);

なぜか特定のクラスパッケージだけ、無くなった状態でダウンロードされます。 ファイルの拡張子をjar⇒ja_ に変更したらできるようになりました。

ココログのサーバでなんらかの特殊処理をしている? のかわかりませんが、取り敢えず解決

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

IEのプロキシ設定をjavaプログラムから読み込みたい

SamuraiJanを公開する前に、サーバ上に新しいバージョンがあったら自動で更新するようにしたい。 http通信で処理したいが、プロキシ設定していたらサーバデータの確認がうまくできない。 (UnknownHostException が発生)

System.setProperty("http.proxyHost", "proxy.******"); を使えばできるが、できればIEのプロキシ設定を自動で取得したいのですが。。。 答えにたどり着きませんでした。

仕方ないからUI上から設定変更できるようにしようか・・・

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

IzPackでインストーラ作成

IzPackを使ってインストーラを作成しました。 結構簡単にできました。 本当にフリ-でなんでも揃うものです。

Izpack

http://izpack.org/

このタイミングで作成した麻雀ゲームの名前をつけました。 途中で変更するかもしれませんが、SamuraiJanとします。

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

NetJan実装 平和を上がり判定できるところまで完成

ゲーム開始から、平和を上がり判定できるところまで完成しました。 役はタンヤオ、その他の頻出のものを実装したら、ボチボチ公開しようと思います。

Sc

サイコロ振りボタン画像は、http://sozai.akuseru-design.com/ からダウンロード。

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

NetJan設計 Model - ディープコピー

一部設計変更。 Modelの表示パフォーマンス目的の、Modelクラスを親クラスにして、上位Modelクラスに変更を通知する方法だと色々と不都合が生じてくる。

controlパッケージから新旧のModelをuiへ渡して、表示時に変更有無を判断させる方式とする。 旧Modelを持つためには、ディープコピーを行う必要があるが、javaのcloneメソッドを使うと各Model派生クラスでオーバーライドする必要があるため、Serializable(シリアライズ)を利用したディープコピーを行う。 下記のようなサービス関数を持つクラスを1つ作成してそれを利用する。

  public static Object deepCopy(Serializable original) {
    if (original == null) {
      return null;
    }
    Object ret_obj = null;
    ObjectInputStream in_obj;
    try {
      ByteArrayOutputStream out_byte = new ByteArrayOutputStream();
      ObjectOutputStream out_obj = new ObjectOutputStream(out_byte);
      out_obj.writeObject(original);
      ByteArrayInputStream in_byte =
      new ByteArrayInputStream(out_byte.toByteArray());
      in_obj = new ObjectInputStream(in_byte);
      ret_obj = in_obj.readObject();

    } catch (IOException e) {
      e.printStackTrace();
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    }
    return ret_obj;
  }

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

NetJan設計 Network - ソケット接続

ソケットの接続について、設計がもれてたので追加。

Sequence_networkconnect

NetworkDriver_Serverは4つのソケットスレッド、NetworkDriver_Clientは1つのソケットスレッドを持つのは前述した通り。 NetworkDriver_ServerはJDKのServerSocketクラスを利用して、クライアントからの接続要求を待ち、接続が成立した時点で生成されるSocketを元に、スレッドを生成する。
NetworkDriver_Clientは、JDKのSocketクラスを利用してサーバに接続要求を行い、接続成立したらそのソケットを元にスレッドを生成する。

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

NetJan実装 JDKクラスのソースを設定

JDKクラスの上でF3を押下しても、ソース参照はできないので、設定方法を調べて参照できるようにしました。  まず、PCの中に2つのJRE環境がある。 2つのうち、”jre6”フォルダはJREのみが格納されているので、ソースコードは存在しない。 

Java_2_folders

自分のEclipseはこの、”jre6”フォルダのほうが設定されているので、まずは”jdk1.6.0_11”フォルダを設定する。 Windows⇒Preferences から、設定。

Add_new_jre

ここ待て設定したうえで、参照したいクラスの上でF3キー押下。 ”参照できません”と表示された場合は、”ソースを添付”を選択して、jdk1.6.0_11 下の”src.zip”を選択。 これで次から表示される。

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

NetJan実装 クラス型枠作成

設計までほぼ完了したので、実装を進めていく。 まずは各パッケージの格となるクラスのクラス作成まで。

Coding_start

実装結果はSubversionリポジトリ に格納している。 この記事がUPされた後も随時更新している。

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

サーバ構築 目次

前回記事で設計フェーズの記事一覧を記載したので、サーバ構築についても目次を改めて作成

開発ツール

  • Java開発環境 Jude
  • Java開発環境 eclipse
  • サーバ構築

  • 機材 壊れたPCの部品買い替え検討
  • 機材 結局ベアボーンとCPU買い替え
  • 機材 新ベアボーン組立て
  • サーバ構築 Linuxインストール
  • サーバ構築 Linux基本設定
  • サーバ構築 Linuxサービス等設定
  • サーバ構築 Linuxサービス等設定の続き
  • サーバ構築 不具合対応(Stopping irqbalance がFAILになる)
  • サーバ構築 Webサーバ
  • サーバ構築 Samba、SSH、NTP
  • サーバ構築 cgiが正しく動作しない問題
  • サーバ構築 CVS、xinetd インストール
  • サーバ構築 mydnsへの登録
  • サーバ構築 mydnsのアクセス確認
  • サーバ構築 LinuxサーバでのEmobileの利用
  • サーバ構築 Linuxをproxyサーバとして使う
  • サーバ構築 webalizerインストール
  • リポジトリ/Subversion/TortoiseSvn

  • サーバ構築 SubVersion導入
  • サーバ構築 subversionのインストール成功!
  • サーバ構築 subversionの設定
  • サーバ構築 TortoiseSvnのインストール
  • サーバ構築 Apacheとsubversionの連携設定
  • サーバ構築 subversionのリポジトリアクセス改善
  • サーバ構築 Subversionへの格納構成
  • サーバ構築 Subversionリポジトリへ格納
  • サーバ構築 EclipseとSubversionの連携
  • サーバ構築 Subclipse導入
  • サーバ構築 Subclipseでのtag作成
  • | | コメント (0) | トラックバック (0)

    NetJan設計 一旦完了

    ほぼ設計が完了したので、目次の意味を兼ねてUPしたきた記事の一覧を下記に記載した。 設計書はSubversionリポジトリ に格納してるので、ワードの設計書を見れば全体像を見やすいように構成している。 ※つもり

    全体

  • Java開発環境 Jude
  • NetJan設計 設計書構成変更
  • NetJan設計 クライアントとサーバ間の排他制御について
  • NetJan設計 MVC間の排他制御について
  • NetJan設計 設計方針 追加
  • control

  • NetJan設計 control - 内部構成
  • NetJan設計 control - コマンド自動生成
  • NetJan設計 Network - クラス
  • NetJan設計 Network - 詳細シーケンス
  • NetJan設計 Network - ソケットスレッド含有イメージ
  • ui

  • NetJan設計 ui の役割について
  • NetJan設計 表示パフォーマンス設計
  • NetJan設計 ui - GUIの表示 - 表示位置判断
  • model

  • NetJan設計 Model派生クラス
  • NetJan設計 Modelデータ構成
  • NetJan設計 Model-プレーヤー識別概念について
  • NetJan設計 Model-識別概念-gpos(ゲームポジション)
  • NetJan設計 Model-識別概念-役割
  • NetJan設計 Model_TileHolder
  • NetJan設計 model - ゲーム状態
  • NetJan設計 model - ゲームサブ状態
  • command

  • NetJan設計 Com派生クラス
  • NetJan設計 Com実行前確認と実行
  • NetJan設計 Com - 各Com処理内容 - 1
  • NetJan設計 Com - 各Com処理内容 - 2
  • NetJan設計 Com - 各Com処理内容 - 3
  • NetJan設計 Com - 各Com処理内容 - 4
  • NetJan設計 Com - 上がり判定
  • NetJan設計 Com - 上がり判定処理構成
  • NetJan設計 Com - 上がり判定 - 組合せパターン検索1
  • NetJan設計 Com - 上がり判定 - 組合せパターン検索2
  • NetJan設計 Com - 上がり判定 - 組合せパターン検索3
  • NetJan設計 Com - 上がり判定 - 組合せパターン検索4
  • | | コメント (0) | トラックバック (0)

    NetJan設計 ui - 牌表示座標計算6

    基準座標から、差分オフセットを足して表示座標を計算する。

    Each_disp_pos

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

    NetJan設計 ui - 牌表示座標計算5

    表示posの0~3、holder種別3種あるので、4×3=12種類の基準座標を算出しておく。 下記図は表示pos=3の山牌、表示pos=0の手配、表示pos=1の捨牌の例。

    Kijun

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

    NetJan設計 ui - 牌表示座標計算4

    下記は一要素サイズの算出 (山牌、手配)の図。

    Size1_pile

    下記は捨て牌の図

    Size1_discard

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

    NetJan設計 ui - 牌表示座標計算3

    牌画像の表示座標計算方法については、下記図のようにボード幅から位置計算の一要素サイズを算出し、一要素サイズから基準座標を算出し、基準座標から各牌の表示座標を計算する。

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

    NetJan設計 ui - 牌表示座標計算2

    表示座標計算における、”内枠”の考え方は、ui 牌画像立体表示 シートの”共通表部分画像” とは異なり、少し広い。 特に幅に関しては、内枠と外枠で同サイズとなる。

    Kousei

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

    NetJan設計 ui - 牌表示座標計算1

    牌の表示位置については、ボードのサイズに応じて柔軟に調整できるようにする。

    牌は重なって表示された場合に、立体部分を表示しないほうが自然なので、その場合は立体の一部を除いて表示する。下記が立体部分を全て表示した例と、一部重ねた表示の例。
    Rittai_3   Kasane

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

    NetJan設計 デバッグ用処理

    デバッグ用の処理として、Com送受信、Com実行判断時のデータ状態、をログに残す。 下記、デバッグ関係クラスのクラス図。

    Class_debug

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

    NetJan設計 ui - GUI牌の立体表示、共通部分構成

    牌画像の共通表部分画像と、型枠部分の構成は下記のようにする。

    Hai_kousei

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

    NetJan設計 ui - GUI牌の立体表示について

    牌画像データはまつせんさんのサイトからDLしたものを使用する。 

    DLした画像は下記のサイズ。

    • 縦version 24×34
    • 横version 32×24

    ただし、後述するように縦横で画像の”内部分”を共有するため、横画像についてはDLしたものは使わず、縦画像の内部分から生成する。

    牌は、縦/横、立ち状態/捨て状態 がある事を考えると、下記の4種類がある。画像については、内側部分を共有して4種類の画像を生成するようにする。 赤枠の部分が”共通表部分画像”となる。

    Hai_4kinds

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

    NetJan設計 自動生成コマンド一覧

    コマンドの種別毎に、サーバで自動生成するもの、クライアントで自動生成するもの、を分ける。 下記が自動生成されるコマンドの一覧。

    Auto

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

    NetJan設計 Com - 上がり判定 - 特殊組合せ役判定

    国士無双、七対子の判定を行い、もし成立する場合は、④の出力結果と比較して、得点の高いほうを採用する。

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

    NetJan設計 Com - 上がり判定 - 役判定2

    役判定と得点計算は、役判定 → 符判定の順に行われる。 役判定は、各役の判定メソッドを用意し、順に判断していく。  1つの役が成立したらもう1つの役が消えるケースにおいては、下位の役から判定する。 (一盃口 ⇒ 二盃口) 

    各判定メソッドには、成立パターンとツモ牌位置、その他情報、その時点で成立している役の一覧を入力情報として渡し、出力情報は成立した役の一覧となる。

    Yaku2

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

    NetJan設計 Com - 上がり判定 - 役判定1

    成立した各パターンに対して、役の判定をしていく。 判定のためには、成立パターン以外に、下記の情報が必要となる。

    • ドラ
    • リーチ
    • 上がり牌種別
    • ツモ/ロン
    • 海底

    ModelScoreHolder の一部のメンバを使用して、最大点数になる役を保持する。 上がり牌種別 のデータを複数個持っている場合、1つの成立パターンで2つ以上の点数計算結果を出す必要があるケースがある。
    例えば、③.重複成立パターン削除 の結果、2つに絞られた成立パターンを
    入力とした場合を考える。 この時、上がり牌種別が”4”であった場合、1つの成立パターンにつき、2つの計算結果を出す必要がある。 対子の一部が上がり牌だったら単騎待ちの2符が付くが、平和の役は付かない、等の違いが発生のが理由。

    Yaku1

    仮に上記4つのパターンでの得点計算結果が下記のように異なる場合、最も高い点数が採用され、このプロセスの出力としてはこの1パターンに絞られる。

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

    NetJan設計 Com - 上がり判定 - 組合せパターン検索7

    • 1-2 1に戻り、右接続から開始して、同様にパターンが成立するか、確認していく。 確定面子を確定ボックスへ

    Seq12

    • 1-2の続き1 左下からパターン検索を続けていく。

    Seq121

    • 1-2の続き2 このルートで検索を進めていくと、最終的には下記のようにパターンが成立する。 ただ、このパターンは1-1-2で成立したパターンと同じになってしまうので、再起検索が完了した時点で重複パターンとして削除される。

    Seq122

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

    NetJan設計 Com - 上がり判定 - 組合せパターン検索6

    • 1-1-2 対子を確定させて確定ボックスへ移動し、処理を続けていく。

    Seq112

    • 1-1-2の続き1 選択肢は右接続のみ。 確定したら確定ボックスへ。

    Seq1121

    • 1-1-2の続き2 同様に処理を続けていく

    Seq1122

    • 1-1-2の続き3 同様に処理を続けていく。 ②の上接続を1回した時点で、対子確定の選択肢があるようにも見えるが、確定ボックス内に、確定した対子がある場合は選択肢として認めない。 よって上接続のみ。

    Seq1123

    • 1-1-2の続き4 同様に処理を続けていくと、最終的に下記の状態になり、4面子と1対子が確定した状態になる。 これで、1つの組合せパターンが"成立"した。 成立したパターンは確定ボックスとは別途記憶し、再起処理を続ける。

    Seq1124

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

    NetJan設計 Com - 上がり判定 - 組合せパターン検索5

    1-1-1の続き1
    一番左にある牌から処理を続けていく。

    Seq1111

    1-1-1の続き2
    選択肢はないので、右接続していき、確定ボックスへ。

    Seq1112

    1-1-1の続き3
    右下の牌に注目して処理を継続。 右接続しか選択肢がない。

    Seq1113

    1-1-1の続き4
    右接続するが、ここで選択肢が無くなってしまうので、この続きはできないので破棄となる。 再起処理で1-1へ戻る。

    Seq1114

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

    NetJan設計 Com - 上がり判定 - 組合せパターン検索4

    1-1
    左下の”一”からスタートして、上接続する。 この時点で、更に上接続する、対子確定させる、の2つの選択肢がある。

    Seq11

    1-1-1
    更に上接続する。 この時点で1面子確定し、確定ボックスへ移動。

    Seq111

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

    NetJan設計 Com - 上がり判定 - 組合せパターン検索3

    例えば、手配が下記だとする。

    Kensaku3

    検索配列に格納すると、下記のようになる。 左下から開始する。 この時点では、上接続、右接続、の選択肢がある。

    Seq1_2

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

    NetJan設計 Com - 上がり判定 - 組合せパターン検索2

    検索処理の具体的方法としては、34種×4個の配列に、手牌を並べて、左下の牌から順に上接続/右接続/対子確定 を再帰的に検索していき、成立するパターンを洗い出す。 配列イメージにおいては、順子にできない(右接続できない)は青線部で表す。 検索配列のイメージで、”九①②”という順子は作成できないので右接続しない事がわかる。

    Kensaku2_2

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

    NetJan設計 Com - 上がり判定 - 組合せパターン検索1

    組合せパターン検索とは、14個の牌で4つの面子と1つの頭を構成するにあたり、構成の組合せのパターンを洗い出す処理を指す。 この時点では役の事は考えない。
    例えば下記の例なら、5つの組合せパターンが成立する。 

    Agari2_1

    2番目と3番目等は組合せパターン検索において2つ成立してしまうが、その後の重複成立パターン削除で、削除される。

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

    NetJan設計 Com - 上がり判定 - 流局

    流局判定は単純で、Com_Winの上がり種別が流局で、残り牌が14個であれば成立し、テンパイしているものへ点数が流れる。

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

    NetJan設計 Com - 上がり判定処理構成

    上がり判定は、

    • 流局判定
    • 組合せパターン検索
    • 重複成立パターン削除
    • 上がり役判定
    • 特殊組合せ役判定

    の順で行う。 各処理詳細は後述する。

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

    NetJan設計 Com - 上がり判定

    次は上がり判定について。

    上がり判定メソッドはCom_Winに持たせる。 上がり種別には3種類ある。

    • 流局

    これも上がりの一種として処理するようにする。 残り山牌が14枚であれば、即成立するので、まず流局かどうかを確認する。

    • ツモ上がり

    1人のプレイヤーが14個の牌を持っている状態でCom_Winコマンドを送信する事になる。 

    Agari_tumo

    • ロン上がり

    捨て牌されたタイミングで、他家プレイヤーがCom_Winコマンドを送信する事になる。

    Agari_ron

    2番目と3番目のケースで上がり判定メソッドを共有できるようにするため、14枚目の牌を内部的に”上がり牌”として認識しつつ、それ以外の組合せパターン判定ロジックにおいては14牌をソートした状態で判断処理を行う。

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

    NetJan設計 設計方針 追加

    設計基本方針に1つ追加。 頭の中ではそういう事になっていたけど、明記していなかった点をNetJan設計書.doc (svnリポジトリ) へ追記。 

    基本的に、サーバとクライアントは常に同じデータを保持する方針とする。 こうする事により、設計とデバッグをシンプルにさせる。 伴い、Com送信も常にサーバが処理したら必ずクライアントに送信して同じ処理をクライアント側でも行うようにする。 

    例えば、得点計算画面表示中において、4つのクライアントから計算画面のClose要求を受信してから次の局に移る。 設計選択肢の1つとして、4つのクライアント全員からClose要求が集まってから、サーバ→クライアントへ計算画面Close通知コマンドを送信する事もできるが、そうではなく、1つのクライアントから要求が来る度に全員にその都度伝え、”どのクライアントからClose要求が来てるか”というフラグについてサーバ/クライアントで共有する。

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

    NetJan設計 Com - 各Com処理内容 - 4

    最後に、各局の終了時に使用されるコマンド

    Com_4

    • Com_Win はサブステータスがWAIT_DISCARDの時はツモ上がりとして、AFTER_DISCARD/STEAL_REQUESTEDの場合はロン上がりか流局として、それぞれ許可判断される。 ModelScoreHolderのclose_request はfalseでリセットされ、その他メンバは上がりに応じてセットされる。 このコマンドでSCORE_CALCULATEステータスに遷移した時点から、UIで得点画面等が表示される。
    • Com_CloseScore は得点計算画面を閉じる等の操作を行った時に、各プレイヤーから送信され、全員が得点計算から受信した時点で次の局に移る準備を行い、GAME_SHUFFLEステータスへ遷移する。

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

    NetJan設計 Com - 各Com処理内容 - 3

    次はゲーム中に使用されるコマンド。 これらのコマンド群の使われ方を理解するには、サブ状態 を十分に理解している必要がある。

    Com_3

    • Com_DiscardはサブステータスがWAIT_DISCARDの時のみ許可される。 切り番の人が、指定した牌を山へ移動する。
    • Com_StealはサブステータスがWAIT_DISCARDの時とSTEAL_REQUESTEDの時のみ許可される。 許可されてもすぐには“鳴き”の処理は行われず、STEAL_REQUESTEDの状態で一定時間経過するか、あるいは、要求者以外全員からCom_NoStealを受信した時点で、次のサブステータス(STEALING)に遷移する。 例えば、東家が牌を捨ててWAIT_DISCARDサブステータスにある時、南家から“チー”の要求があったとする。 この時、南家の手配がチー可能な状態であったら、stealrequests[南家のgpos] に”チー”をセットする。 ただ、この直後に“ロン”、“ポン”の要求が来る可能性があるので、STEAL_REQUESTEDで待機する。
    • Com_ChooseStealは、サブステータスがSTEALINGの時のみ許可される。 要求者は自分の手配のどの牌と組み合わせて“鳴く“かを要求コマンドの付加情報として送信する。 クライアントは鳴き方の選択肢が1つしか無い場合もSTEALINGから抜けるために、このコマンドを送信しなければならない。
    • Com_NoStealはサブステータスがWAIT_DISCARDの時とSTEAL_REQUESTEDの時のみ許可される。 捨てられた牌に対して、チー/ポン/ロンをしない事の宣言をするコマンドとなり、クライアント側は鳴く事ができない状況の場合、ユーザアクション無しにこのコマンドを発行するようにする。 この発行はコマンドの自動生成について の仕組みを用いて実現される。

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

    NetJan設計 Com - 各Com処理内容 - 2

    Com_2

    Com_ShuffleはCom_DiceSeat処理時に自分が親だったら自動で要求発行される。 親以外からの要求は拒否する。 サーバ側は牌をシャッフルし、134個の牌の配列をまず作成し、クライアントへ送信、134個をModelHolderPileへセットする。 クライアントは配列を受信したら同じようにセットする。

    Com_DiceDevide も親からの要求のみ許可される。 サイを振り、結果によってModelBoardのgpos_nexttake、ModelHolderPileのnexttake、をそれぞれセットする。 例えば、サイの目が“3”であった場合、gpos_nexttake=2、nexttake=7となる。 ここでの6は、西家プレイヤーの右手から見て何牌目のところから配牌するか、を示す。

    Com_Distribute も親からの要求のみ許可される。 牌を山から手牌へ移動する。 親には14枚目まで配る。 この時点で、6.6.2サブ状態 のWAIT_DISCARDになり、親の捨て牌を待つ形となる。

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

    NetJan設計 Com - 各Com処理内容 - 1

    各Comコマンドのトリガ条件、Requestコマンドに付加されるデータ、(許可された場合の)サーバでの実行内容、Notifyコマンドに付加されるデータ、クライアントでの実行内容、を表にしたもの。 これら以外に、許可条件があるがこれについては以下表では省略する。

    Com_1

    Com_Startはサーバへのゲーム参加要求。 サーバから許可通知を受信した場合、受信したloginnames配列と自分のログイン名(myloginname)を比較し、例えば配列のloginnames[3]とmyloginnameが等しい場合、myloginindexは“3”になる。 

    次にCom_SeatConfigコマンドにて、席順を決める。 本来は東南西北の牌をそれぞれが引いて決めるが、まずは固定とする。 gpos[0] (サーバ) = 5、gpos[1] (ゲームに最初に参加した人) = 3、gpos[2] = 2、gpos[3] = 1、gpos[4] (ゲームに最後に参加した人) = 0 と割り振る。 あえて参加順序と逆にするのは、そのほうがデバッグがしやすいと考えるから。 ただ、loginindexはゲームが開始されれば、ほとんど意識しない識別概念となる。

    この時点でgpos=0の人が仮親なので、Com_DiceSeatで親決める事になる。 サイコロを振る権利の無い人からのコマンドは拒否される。

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

    NetJan設計 model - ゲームサブ状態

    サブ状態の定義のさせ方により要求の輻輳に対する処理方法を設計する。 例えば、プレイヤーAからのチー要求と、プレイヤーBからのポン要求が輻輳した場合、プレイヤーAからのチー要求を受けたサーバーは、チーが可能な状況でもすぐには許可せず、一旦、待ち状態(STEAL_REQUESTED)に移り、もっと優先度の高い要求が来ないかを確認してから、許可通知を行う。

    • WAIT_DISCARD   :プレイヤーの1人が牌を14枚持っている状態。 つまり、そのプレイヤーが捨てるのを待っている状態。
    • AFTER_DISCARD  :プレイヤーが牌を捨てた後の状態、誰かがロン上がり、鳴き、下家が牌取り(時間切れによる自動ツモ含)、のいづれかのアクションを起こすまで、このステートになる。
    • STEAL_REQUESTED:捨牌に対していづれかのプレイヤーから鳴き要求があった場合。 上がり要求よりも弱いため、上がり要求が無い事(他家からのNoAction)を確認してから、STEALINGに遷移する。
    • STEALING     :鳴きが認められて、鳴き方(チーの場合)を選択している最中。 選択不要な場合は、自動的にCom_ChooseStealが発生して捨て待ちとなる。

    下記がその状態遷移図(ステートチャート図)

    Gamesubstate

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

    NetJan設計 model - ゲーム状態

    メイン状態のステートチャート図は下記の通り。 ゲーム開始、サイコロで席決め、牌混ぜと山積み、サイコロで山の分け目決め、配牌、ゲーム(PLAY状態)、ゲーム終了(点数計算)、という流れ。
    PLAY状態は更に細分化されたサブステートにて表される。
    Gamestate

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

    NetJan設計 Model_TileHolder

    捨て牌、手配、山牌はそれぞれModel_TileHolderの派生クラスにより保持される。
    ツモ、泣き、牌捨て、等の牌の移動を伴う操作は、各TileHolder派生クラスのメソッドを2つ組み合わせる事によって行う。 例えば、gpos=1の山から、gpos=0のプレイヤーが牌をツモる場合、

    • TileHolder_Pile(gpos=1) のtakeメソッド
    • TileHolder_Hand(gpos=0) のtakeメソッド

    を組合せる事により実行する。

    Tile_holder_xls

    Class_model_tileholder

    これで疎結合になっているか? と考えながらこのクラスが使われる各場面を想像してみる。

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

    NetJan設計 Network - ソケットスレッド含有イメージ

    サーバは4つのクライアントと同時に、非同期で送受信を行う必要があるため、4つのソケットスレッドを持つ。

    Network_socketthread

    ソケットの実際の最下層の処理は、ネットで調べたところ、java.io.InputStream、java.io.OutputStream、java.net.Socket 等を使う事になりそう。 細かい話は実装フェーズで決める。

    設計書は随時Subversionにコミット。 ※blog右下のリポジトリへ

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

    NetJan設計 Network - 詳細シーケンス

    通信シーケンス内、TCP通信を行うのはSocketThreadクラス。 このクラスはNetJanのその他処理(表示等)とは非同期でデータ送受信ができるように、スレッドとする。 このクラスから、SDK共通クラスのTCP送受信クラスを利用して送受信を行う。

    Sequence_network_cs

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

    NetJan設計 Network - クラス

    Network関係のクラスもcontrolパッケージの一部に属する。 下記はNetwork関係のクラス図。 サーバ用とクライアント用で、Networkのドライバクラスが異なる。 ドライバクラスの違いは、複数の送受信スレッドを持つかどうか、と、起動時に接続待ちになるか、それとも接続依頼する側になるか、の点。

    Class_network

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

    NetJan設計 control - コマンド自動生成

    内部クラス図内、ControlComGeneratorは、コマンドの自動生成を行うクラス。 通常のコマンド処理は、クライアントからの要求が元となって、サーバで実行可否判断が行われるが、サーバで自動生成されるケースもある。

    例えば、プレイヤーの1人が牌を“ツモ“ると、一定時間内に捨てる必要がある場合。 そうしないと、他のプレイヤーは永久に“ツモ“をしたプレイヤーの捨て待ちとなってしまうからである。 このようなケースにおいて、ControlMainからControlComGeneratorへ“ツモ“コマンドが発生した事を通知し、Generator側はその時点からのタイマーで、”捨てる“コマンドの自動生成を行う。

    Com_timer

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

    NetJan設計 control - 内部構成

    controlパッケージは、メインクラス(ControlMain), Com生成クラス, キュー、タイマー等で構成される。
    Class_control

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

    NetJan設計 ui - GUIの表示 - 表示位置判断

    modelの識別概念の続きで、uiの関係する部分である、表示位置判断について記載する。

    表示ポジションは、どの視点からゲーム盤を表示するかという概念。 Modelクラス、controlクラスでは、この概念は意識しない。
    自分の位置を目の前とするので、そこを0とした時、席順(反時計周り)に、90、180、270という反時計周りに何度回転した状態か、というデータで保持する。

    例えば、modelの状態が下記の状態であったとする。

    Ui_pos1

    ”南”家のプレイヤーの表示をする際には、下記のように、gpos=0の部分を目の前として表示する。 ”自分がgpos=0である”という事は、myloginindexが”2”であるところから、導き出せる。

    Ui_pos2

    同じデータ状態でも、”西”家プレイヤーから見ると、下記のようになる。 このイメージ図では、南が下にあるが、西プレイヤーの画面には、西が一番下に表示される。

    Ui_pos3

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

    NetJan設計 Model-識別概念-役割

    この後、サイコロで実際の起家が決まるが、gpos(Gameポジション)は変化しない。 例えば、仮親だった人が南になったとすると、下記のようになり、gpos_dealerのみ変化する。 ここで、役割は変化する

    Gpos3

    このように、gposはゲーム開始時点で確定してから、席替えするまでは、変化しない。 表示ポジションの概念については、”表示位置判断について”にて説明する。

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

    NetJan設計 Model-識別概念-gpos(ゲームポジション)

    次に、各ログインindexを持ったプレイヤーの中で、座り位置と仮親が決められる。 gpos=0が仮親、そこちら座り順(反時計周り)に、1⇒2⇒3となる。

    Gpos1

    上記のようにgposが決まった場合、席順のイメージに合わせると、下記のようになる。

    Gpos2

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

    NetJan設計 Model-プレーヤー識別概念について

    麻雀は4人で行うゲームであるため、4人を識別を行う必要があるが、識別概念には、4つの種類がある。ログインindex、Gameポジション、役割、表示ポジションの4種。

    • ログインindex  :ゲームに参加表明した順に与えられるインデックス。
    • Gameポジション : 仮親になった人を0(東)として、席順(反時計周り)に割り当てられる識別子。  Modelの配列添字やメンバのほとんどは、gposで表される。
    • 役割       :各プレイヤーが、東南西北のどの役割なのか、という概念
    • 表示ポジション  :各プレイヤー毎に、自分の座り位置を0として、考える位置概念

    ログインindexは、ゲームへの参加要求順番に割り当てられる。

    Login_index

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

    NetJan設計 Modelデータ構成

    下記のデータで、NetJanの全ての状態を表せるようにする。 
    基本的に、下記の全てのデータは、サーバと4つのクライアント全てで共有する事になるが、ModelLoginInfo 内のmy****メンバについては、それぞれが自分自身の情報のみを保持する。 この情報を利用する事により、自分自身が4人の参加プレイヤーの中のどの人なのかを識別できる。 

    Model内のデータ構造について、loginindexとgameposの違いを理解している必要かある。
    これについては、"プレーヤー識別概念について"、で記述する。

    Data1

    Data2

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

    NetJan設計 Model派生クラス

    ui、controlに対して、modelパッケージからのIFとなるのは、ModelMainで、このクラスが他の全てのデータクラスを含有する構成となる。 また、3.1.3表示パフォーマンス設計 にあるように、各モデルクラスは更新が発生した時に親クラスに通知する。

    _model

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

    NetJan設計 Com実行前確認と実行

    Comは、クライアント側で、実行前確認/OKならサーバへの要求送信、サーバ側では、受信/サーバ側での実行前確認/実行とクライアントへの実行許可通知、クライアントは許可通知受信し、実行、という順序で処理が行われる。

    _com_2

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

    NetJan設計 Com派生クラス

    ComはCom基本クラスから派生した各種コマンドクラスで構成される。

    _com

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

    NetJan設計 ui の役割について

    uiと外部のインターフェースは、

    • ユーザからの操作受け付け
    • 要求コマンド発行(ユーザから明示的に操作がなく、タイムアウト等で発生するコマンドも含む)
    • controlからの表示命令受け付け
    • 表示処理

    という4つに分けられる。

    _ui

    また、uiパッケージの方針として、

    表示処理、及び、ユーザ操作の受け付けをつかさどるuiパッケージについては、さまざまな形を提供できるようにする。 最終的にはGUI、CUIの両方でのIFを提供する。 GUIについては、画面サイズの違いによる異なるUIのあり方を実現できるようにする。 
    ただし、control, modelとは同じインターフェースにて設計する。

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

    サーバ構築 Apacheのアクセスログ表示ができない

    先日設定したWebalizerの集計を見ようとして、開くと、下記エラーが発生。 先日は見れてたのに・・・ httpdの再起動で無理になったのかな。

    Forbidden
    You don't have permission to ~

    /etc/httpd/conf.d/webalizer.confに、下記行を追加

    Allow from 192.168.11.0/24

    /etc/rc.d/init.d/httpd restart

    これでも同じ結果・・・ 仕方ないので、Wiresharkでパケット解析。 

    どうもLinuxサーバにDNSしにいこうとしてるみたい。 ブラウザのツール⇒インターネットオプション⇒接続⇒LANの設定⇒詳細設定 に、LinuxのURLを追加して解決。

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

    NetJan設計 表示パフォーマンス設計

    表示更新処理は、uiパッケージ内のクラスで行うが、表示更新のパフォーマンスを確保するため、下記の2点を設計方針とする。

    • modelクラスの階層において、元祖 デザインパターンのCompositeパターンを変形させた形を用い、子側のデータ更新が、親側に伝わるようにする。 この事により、親側は自分の子も含めてデータ更新が発生しているかどうかが判断できるようになり、自管轄に変更が無い場合は何も処理しないようにできる。 この事により、パフォーマンス改善を狙う。
    • 子側は、データ更新時に親側に更新を伝える必要があるため、子に対して誰が親なのかを知らせておく必要がある。 注意点として、途中で親が変わるようなケースにおいて、親設定を随時更新する必要がある。

    _composite

    _composite_2

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

    NetJan設計 MVC間の排他制御について

    MVC間の排他制御は、Model部へのデータ更新(Comクラス経由にて行う)、View部への表示指を、ControlMainクラスが一括で行う事により行う。

    独習Javaを見てsynchronized化部分を理解し直して作成。

    _mvc

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

    NetJan設計 クライアントとサーバ間の排他制御について

    クライアントとサーバ間の排他制御は下記設計方針にて行う。

    • クライアントは4つあるので、サーバは複数のクライアントからのパケット受信をするために、4つのソケットスレッドを立てて通信を行う。 但し、受信したパケットの処理は、1つずつ行う事によりパケットが錯綜しても大丈夫なようにする。
    • また、クライアント側でユーザ操作が発生等した場合、クライアントはサーバに要求を行うが、全ての処理において、あくまで“要求”であり、サーバから“許可通知”が来ない限りは処理しない。 また、要求と異なる“許可通知”がきても、それを処理する。

    _cs

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

    NetJan設計 設計書構成変更

    Subversionの整理が完了したので、設計書を見直していたら、どうも見づらく感じました。 Word、Excel、Judeの3つの良いとこどりをして、それぞれの形式で表現しやすい部分をそれぞれのファイルに記載する方針としていましたが、どの情報がどこに書かれているか、全体像が掴みにくいです。 

    なので、基本、Wordをメインの設計書とし、ExcelやJudeで作成したものは画像等にしてインポートして、Wordに全体像がわかりやすく表されてる事を目標とします。

    0

    今回、モデリングツールとして何を使うか色々調べました。 前に活動していたのが1年前なので、もっと良い、Eclipse上でソースと綺麗に連携できるフリーのツール等出てきてるかと思いましたが、まだまだ発展途上な感があります。 なので、Judeを継続して使う事に決めました。

    また、設計内容についても、modelパッケージについては元祖 デザインパターンで紹介されている、Compositeパターンを使ったほうがうまく作れそうなので、この点、方針変更します。

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

    サーバ構築 webalizerインストール

    LinuxサーバはEmobileのカードで繋いでおり、公開用として使う状態にはなってないけど、先にWebalizerを入れておく事にしました。

    Webalizer

    インストールして、

    yum install webalizer

    /etc/webalizer.conf を編集。  ローカルからのアクセス集計をして欲しくないから、IgnoreSiteで設定。 格納場所はデフォルトでクライアント側からhttp://www.alesi.mydns.jp/usage で見れるように、htmlディレクトリ内に指定

    HostName       alesi.mydns.jp
    OutputDir      /var/www/html/usage
    IgnoreSite      192.168.11.*

    集計実行。 

    /usr/bin/webalizer

    IgnoreSiteで設定したのに、反映されず集計されてしまう。 色々調べてると、どうも、 /etc/webalizer.conf 内の、HistoryName、IncrementalName で設定されているファイルに、キャッシュみたいなものが残ってるみたい。 /etc/webalizer.conf を開いて、

    HistoryName     /var/lib/webalizer/webalizer.hist
    IncrementalName /var/lib/webalizer/webalizer.current

    hist、currentの2ファイルを削除してから、再び集計実行させると、うまくいきました。

    解析作業は定期的に行うように設定しておく。 wgetの時同様、crontab -e で定期実行を指定するファイルを開き、下記の行を追加して保存。

    0 9 * * * /usr/bin/webalizer

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

    サーバ構築 Subclipseでのtag作成

    前回記事で作成した、テスト用のクラスを削除し、この時点の環境をSubclipseでtag作成。

    クラス削除してCommitしたうえで、SVNリポジトリViewへ移動して、tag作成。

    31_tag_make

    32_tag_name_input

    Subversion導入時にもtagを作成してるので、これで2つ目のtag。 この様子がわかりやすいのが、TortoiseSvnのrevisiongraph機能

    33_revision_graph_2

    下記のように表示されます。

    34_graph_displayed

    この画面上で2つのrevisionを選択し(Ctrlを押しながら2つクリック)、比較とかもできます。 便利ですね。

    フリーでここまでできるって、最近はすごいと感じます。

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

    サーバ構築 Subclipse導入

    Eclipse上のSVNリポジトリViewから、ブランチやタグの操作ができるみたいなので、やはりtrunkからでなく、その親フォルダから登録し直す。

    11_parent_folder

    既にリポジトリに作成済みの空フォルダ、”6_ソースコード/NetJan” フォルダにソースとプロジェクトが入るようにしたいので、Eclipseプロジェクトを作成する。 Eclipseのファイル ⇒ Import ⇒ SVNからプロジェクトをチェックアウト 既存のリポジトリロケーション利用を選択 

    12_existing_svn

    SVNリポジトリのどの部分からImportするか選択できるので、~ 6_ソースコード/NetJan を指定。 

    13_specify_svn_folder

    新規プロジェクトウィザードを使ってプロジェクトとしてチェックアウト ⇒ JavaProject 選択。 既存ソースから作成、を選択してローカルの”~ 6_ソースコード/NetJan”に対応するフォルダを指定。 

    14_create_project

    Finishボタンを押して終わり、のはずが、 ”This client is too old to work with working copy”とかいうエラーが発生。 メッセージ内容からして、ローカルリポジトリのSubversionのversionと、Subclipseのものが違ってそう。 調べてみると、Subversionの1.5移行のリポジトリの場合、Subclipseはversoin1.4.7以降を使う必要があるとの事。。。

    前回記事で http://subclipse.tigris.org/update をEclipseのUpdateサイトとして登録したが、ここからだとSubclipseの1.4.7以降はDLできないみたい。 なので、削除して、代わりに、 http://subclipse.tigris.org/ で紹介されている最新のversion1.4.7用のURL、http://subclipse.tigris.org/update_1.4.x を登録。 ここからSubclipseをDL(ダウンロード)。

    update_1.4.x 下のもの全てにチェックを付けて、Install

    21_install_new_subclipse

    (中途半端に作成されたものを削除してから) 改めて同じ手順を踏んで、プロジェクトを作成。 今度こそ成功した!

    実験的にクラスを作成し、Commitしてみる。

    22_create_class

    23_commit_test_class

    チェックイン成功したので、今度はTortoiseSvnから確認してみる。 ローカルの”~ 6_ソースコード/NetJan”で右クリックして、RepositoryBrowserで確認すると、Eclipseのプロジェクトファイル、作成した試験クラス、等がCommitされているのがわかる

    24_check_with_tortoisesvn

    それにしても、今後はSubversionのDBのversionが変わる事に注意しなければないない、と思いました。

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

    サーバ構築 EclipseとSubversionの連携

    EclipseとSubversionの連携をしていきます。 Subclipseというものを使えば、できるらしいので、Eclipseに組み込みます。 Help -> Software Update -> Available Software から、”Add Site”を選んで、http://subclipse.tigris.org/update を入力。

    1_add_site

    すると・・・ ”No repository found at eclipse” とかいうエラーが発生。 通信エラー発生時の頼みの綱、WireShark で確認すると、何とパケットが全く流れていない。 そもそもパケット送信する前にエラー発生したと判定されてしまってるという事か。 もしかして、proxyを通ってくれていないのかな? と思い、proxyの設定をできる項目を探したらありました。

    Windows -> Preferences -> Network Connections

    2_proxy_set

    もう一度”Add Site”すると成功。 追加したサイトをチェックして、Install。

    3_install

    4_installing 

    Eclipse再起動するよう聞かれるので、再起動。 次に、Eclipse左したのボタンから、Other選択

    5_other

    SVNリポジトリを選択。 

    6_svn_repo_add

    SVNリポジトリ画面が開くので、リポジトリの追加ボタンを押して、作成したtrunkのリポジトリを入力。 trunkの親を指定したほうがやりやすいのかもしれないが、必要なら変更します。

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

    サーバ構築 Subversionリポジトリへ格納

    リポジトリ内に、trunk、branches、tagsを作成。 適当なフォルダから右クリックしてリポジトリブラウザを開き、

    Ws000000

    フォルダを作成 ⇒ ”trunk”入力 のようにして作成していく。

    Ws000001

    次に、ローカルの”svn”フォルダを右クリックし、SVNCheckout 

    URL部分には、http://www.alesi.mydns.jp/svn/netjan/trunk

    チェックアウトディレクトリ部分には、C:\work\Job\Output\NetJan\svn\

    を入力

    Ws000002

    今までの過程で作成したものを、格納する。 格納の方法はTortoiseSvnの説明書を見なくてもわかる。 この時点でtagを作成しておく。 RevisionGraph使うと、格納された様がわかりやすい。

    Ws000004 Ws000003

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

    サーバ構築 Subversionへの格納構成

    Subversionのリポジトリに、設計書、ソースコード、その他をどのように格納していくか、を決めていきます。 

    • バージョン管理する必要の無さそうなものは、svn外 フォルダ内に格納する。
    • svnはいづれ公開する予定なので、公開するものはsvnフォルダにおいておく。

    くらいの基準で、まずは決めて進めていく。

    Folder_2

    当然、Subversion内には、trunk、tags、branchesを持たせた上で、上記のフォルダイメージを1つの固まりとして管理する。

    Svn_2

    閲覧は、http://www.alesi.mydns.jp/svn/netjan で外からもできるようにしておくが、現時点、Emobileのカードを抜いた時点で、外からのアクセスは途絶えてしまう状態。

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

    サーバ構築 subversionのリポジトリアクセス改善

    前回記事では、Apacheと連携したsubversion設定について記載したけど、今の設定方法では、リポジトリが全ユーザから書き込み可能な設定になっている。

    drwxrwxrwx 7 toshiki toshiki 4096 2009-01-01 23:37 test

    これはあまりよくないので、NetJan開発用のリポジトリはグループユーザのみフルアクセスを許可する形にする。 httpdはapacheというユーザで実行されているので、apacheとtoshikiを同じグループに所属させ、このグループに書き込み許可を行う。

    groupadd subversion
    usermod -G subversion apache
    usermod -G subversion toshiki

    vi /etc/group でグループ作成されているのを確認しておく。 

    ついでに、新しいsubversoinユーザを作成しておく

    cd /etc/httpd/conf.d/
    htpasswd -mc svn.passwd nj_dev

    パスワードは非公開 ★非公開010★

    TortoiseSvnからnj_dev でtestリポジトリにチェックインできる事を確認。 OK! 次に、新しいNetJan用リポジトリを作成し、グループまでしかアクセスできないように設定

    chmod 774 netjan -R

    ノートPCから同じようにアクセスしようとすると、”Could not open the requested SVN filesystem” とエラー

    ・・・ Linuxの事をよくわかっていなかっけど、作成時にプライマリグループがtoshikiになってしまってると、ownerが、toshiki:toshikiになってしまい、せっかく作成したsubversionグループに属していない事になるみたい。 なので、chownで補正

    chown -R toshiki:subversion netjan

    もう一度 ノートPCからアクセスすると、成功した!

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

    サーバ構築 Apacheとsubversionの連携設定

    先日の記事にて、TortoiseSvnからのアクセスがうまくいかなかったが、それ以前にhttp経由でアクセスできるようにしてから、問題解決しようと思い、まずはhttpd(Apache)にsvn(subversion)を連携させました。 

    まずは、mod_dav_svn をイントール。

    yum install mod_dav_svn

    次に、/etc/httpd/conf.d/subversion.conf を編集

    <Location /svn>
       DAV svn
       SVNParentPath /var/www/svn/repo
       # Limit write permission to list of valid users.
       <LimitExcept GET PROPFIND OPTIONS REPORT>
          # Require SSL connection for password protection.
          # SSLRequireSSL
          AuthType Basic
          AuthName "Authorization Realm"
          AuthUserFile /etc/httpd/conf.d/svn.passwd
          Require valid-user
       </LimitExcept>
    </Location>

    /etc/httpd/conf.d/svn.passwd にユーザ一覧とパスワードが登録される事になる。 次はこのファイルの設定。 

    htpasswd -mc svn.passwd ★非公開009★

    パスワードを聞かれるので、入力して設定する。 ★非公開009★

    apacheを再起動。 httpdデーモンで動作するので、iptablesのsvnデーモン用のポートをアクセスさせないようにする。 ※”iptables -D~”で削除

    /etc/rc.d/init.d/httpd restart
    iptables -D RH-Firewall-1-INPUT -p tcp -m tcp --dport cvspserver -j ACCEPT
    iptables -D RH-Firewall-1-INPUT -p udp -m udp --dport cvspserver -j ACCEPT

    次に、ノートPC側(ローカル)に、適当なフォルダを作成する。 右クリックし、”SVN Checkout” サーバ側のURLと、ノートPC側の作成したフォルダのパスを入力してOK。 成功したらその旨ダイアログBoxが表示される。

    サーバ側のURLは、

    Checkout Checkout_success

    しかし、ローカルフォルダ内に適当なテキストファイルを作成して、Commitしようとすると、”Can't create directory '/var/www/svn/repo/test/db/transactions/1-1.txn': Permission denied”のエラー発生。。。

    色々調べてると、Subversionの情報サイト に、解決方法が記載されていた。 どうも、Apacheを実行しているユーザに対して、リポジトリ内の全てのフォルダ、ファイルへのアクセスを許可する必要があるみたい。 

    Apacheを実行しているユーザ というのは、恐らく、/etc/httpd/conf/httpd.conf 内、”User”で設定されているユーザの事。 今日のところは、"chmod 777~" を使ってこのユーザ以外も含めて全てのユーザにアクセス許可する。

    リポジトリがあるフォルダに移動して、chmod実行 ※-Rは、testフォルダ以下の全てのファイルとフォルダに対しての設定

    cd /var/www/svn/repo
    chmod 777 test -R

    再び、ローカルPCの作成したフォルダから、右クリック⇒SvnCommitを選択すると、ユーザとパスワードを聞いてくるので、htpasswd で作成したユーザとパスワードを入力して 成功!

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

    サーバ構築 Linuxをproxyサーバとして使う

    前回記事にて、D02HW を使ってLinuxサーバからネットアクセスできるようにしたので、今度は、ノートPC2つ(Let’sNoteとVaio)から、Linuxをproxyとして使ってネットアクセスできるようにします。

    Lan_

    まず、/etc/sysconfig/network のゲートウェイを、eth0に設定する。 

    GATEWAY=ppp0

    yumコマンドで、dhcp, squidをインストール

    yum install dhcp

    yum install squid

    次に、できるPRO Fedora 8 Linux (DVD付) から、NATの設定をコピーし、アクセス制限変更。

    mount /dev/cdrom /mnt

    cp /mnt/dekiru/ipmasq /etc/rc.d/init.d

    chmod 755 /etc/rc.d/init.d/ipmasq

    /etc/rc.d/init.d/ipmasq を編集する。 私の自宅の場合、eth0がハブ(ルータ)に繋がってる、イントラネットのデバイスで、ppp0がemobileが繋がってる、外部インターネットへのデバイスなので、下記のように修正

    IF_OUT=ppp0

    IF_IN=eth0

    LOCALNET=192.168.11.0/255.255.255.0

    iptables -I RH-Firewall-1-INPUT -i eth0 -o ppp0 -j ACCEPT

    iptables -D RH-Firewall-1-INPUT -i eth0 -o ppp0 -j ACCEPT

    NATを起動させ、また次回Linux起動時に自動で立ち上がるようにしておきます。

    /etc/rc.d/init.d/ipmasq start
    chkconfig ipmasq on

    次に、DHCPの設定をします。 /etc/dhcpd.conf のモード変更を行い(chmod 644 /etc/dhcpd.conf)、その後下記編集

        subnet 192.168.11.0 netmask 255.255.255.0 {
            range 192.168.11.16 192.168.11.240;
            option broadcast-address 192.168.11.255;
            option routers 192.168.11.100;
            option domain-name "alesi.mydns.jp";
            option domain-name-servers 60.254.193.158;
            option netbios-name-servers 192.168.11.100;
        }

    次に、DHCPのデーモンファイルを、できるPRO Fedora 8 Linux (DVD付) からコピー。 その前に現時点のものをバックアップしておく。 

    mv /etc/rc.d/init.d/dhcpd /etc/rc.d/init.d/dhcpd.20090102
    cp /mnt/dekiru/dhcpd /etc/rc.d/init.d
    chmod 755 /etc/rc.d/init.d/dhcpd

    /etc/rc.d/init.d/dhcpd を編集し、eth0 をinputとして設定

    IF_IN=eth0

    DHCPを起動させ、また次回Linux起動時に自動で立ち上がるようにしておきます

    /etc/rc.d/init.d/dhcpd start
    chkconfig dhcpd on

    次に、squidサービス(proxyサービス)を設定していきます。 /etc/squid/squid.conf を編集。  squidサービスは一般的に8080ポートを使うので、8080を設定。

    http_port 8080
    ftp_user Squid@alesi.mydns.jp
     ※ "acl CONNECT method CONNECT" の上に追加
    acl localnet src 192.168.11.0/24 119.72.29.75/29 

     ※ "http_access allow localhost"の下に追加
    http_access allow localnet

    8080に対して、パケットを受け付けるようにiptableを設定、その後、squidサービスを起動。

    iptables -I RH-Firewall-1-INPUT -p tcp -m tcp --dport 8080 -j ACCEPT
    /etc/rc.d/init.d/iptables save
    /etc/rc.d/init.d/squid start
    chkconfig squid on

    ここまでで、Linuxサーバ側の設定は完了。 次はノートPC側の設定。

    C:\WINDOWS\system32\drivers\etc\hosts ファイルに、"proxy.alesi.mydns.jp"を192.168.11.100 として登録。 

    その後、ブラウザにproxy.alesi.mydns.jpを登録する

    • ツール
    • インターネットオプション
    • 接続 タブ
    • LANの設定
    • Proxyサーバのアドレスとポート、に”proxy.alesi.mydns.jp”と”8080”を入力

    ノートPCから適当にネットサーフィンしてみる・・・ 成功!

    ■■■■■■■ 参考図書 ■■■■■■■
    できるPRO Fedora 8 Linux (DVD付)
    Linuxの仕組み
    しっかり学べるUML2.0
    元祖 デザインパターン
    独習Java
    入門Subversion
    ■■■■■■■■■■■■■■■■■■■■

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

    サーバ構築 LinuxサーバでのEmobileの利用

    年末にLetsNoteを買った事により、今まで使ってたノートPCを妻用にしました。 ただ、これにより、Emobileカードを何回も差し替えないといけないという事になり、 ”Linuxサーバ(Fedora8)にEmobileを繋げて、proxyにしたらいいんでは?” と思い立って、やってみました。 ただ、大抵の設定例はGUIなので、コマンドラインだけでの対応にはなかなか苦労したので、メモを残しておきます。

    今回思ったのは、英語がスラスラ読めるメリットの大きさです。 英語のサイトまで足を広げると、大分助かりました。

    まずは、Emobile(D02HW)をLinuxに差し込みます。 この時点で、Linuxがモデムを認識していないと、以下の手順以前の状態なので、このサイトだけでは解決できません。

    まずは、モデムのシリアルが認識されているか、下記コマンド実行。 Linuxでは、モデムはシリアルとして扱われるそうです。

    dmesg | grep tty

    下記のように、"ttyUSB0"のような表示がされれば、認識OK。

    usb 4-1: GSM modem (1-port) converter now attached to ttyUSB0
    usb 4-1: GSM modem (1-port) converter now attached to ttyUSB1

    次に、モデムからのダイアリングをするモジュールをインストールします。 

    yum install wvdial

    インストール完了したら、etc/wvdial.conf を作成します。

    [Dialer Defaults]
    Phone = *99***1#
    Username = em
    Password = em
    Stupid Mode = 1
    Dial Command = ATDT
    Modem = /dev/ttyUSB0
    Baud = 3500000
    Init2 = ATZ
    Init3 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
    Modem Type = Analog Modem
    ISDN = 0

    wvdial を実行し、接続成功したら、Ctrl+Cで止めます。 

    次に、今まで私の自宅LinuxはノートPC経由してネット接続していたので、defaultのゲートウェイがノートPCを指してるので、これを削除します。

    /sbin/route delete default

    wvdial & で、改めてモデムからダイアルし、Ctrl+Cではなく、リターンで接続継続したままコマンドプロンプトへ。 /etc/resolv.conf のDNSサーバのIPを、wvdialで取得したEmobile経由のものに更新。

    先日、ノートPC経由でyumwgetを行うように設定したので、これらを元に戻しました。 この状態で、yumとwgetが成功する事を確認成功!

    次記事では、ノートPCからのネットサーフィンができるところまで。

    ■■■■■■■ 参考 ■■■■■■■
    できるPRO Fedora 8 Linux (DVD付)
    Linuxの仕組み
    しっかり学べるUML2.0
    元祖 デザインパターン
    独習Java
    入門Subversion
    ■■■■■■■■■■■■■■■■■

    テキスト コマンドライン CUI コマンドプロンプト イーモバイル 通信カード

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

    サーバ構築 TortoiseSvnのインストール

    次はノートPCにTortoiseSvnをインストール、設定していく。 まずは、http://tortoisesvn.tigris.org/ から、TortoiseSVN-1.5.6.14908-win32-svn-1.5.5.msi をダウンロードし、インストール。 普通に”次へ”を選択していくだけでOK。

    インストールが完了すると、Windows上のどのフォルダからでも、右クリックするとTortoiseSvnのメニューが選択できるようになる。 

    まずは、リポジトリブラウザで、リポジトリが見れるか確認。 なんと・・・

    ”no access allowed to this repository” と表示され、いきなりこけた。 色々調べてみると、/var/www/svn/repo/test/conf/ ディレクトリ内、

    • svnserve.conf の、anon-access = none を、anon-access = read に変更、
    • passwdの、ユーザ=パスワードの"="の前後にスペースを入れる

    と、見れるようになった。 ただ、気になるのは、なぜ認証を聞いてこないのか、こちらはtoshikiユーザとしてアクセスしたいのに。 

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

    サーバ構築 subversionの設定

    次はLinuxサーバ(Fedora)Subversionの設定を行っていく。 

    • /var/www/svn/repo を作成
    • chown toshiki:toshiki repo で、ディレクトリのオーナをtoshikiに変更
    • /etc/xinetd.d の下に、svnserveを作成し、下記の内容を記載。 当然、user, server, server_argsは環境に合わせる必要あり。 only_fromの192.168.11.0の部分も、自分の自宅内ネットのサブネットに合わせてる

    ------------------------------------------------
    service svnserve
    {
    disable = no
    socket_type = stream
    wait = no
    user = toshiki
    server = /usr/bin/svnserve
    server_args = -i -r /var/www/svn/repo
    log_on_failure += USERID
    only_from = 192.168.11.0/24 127.0.0.1
    }
    ------------------------------------------------

    • 同フォルダ内にcvsというファイルがあるが、これはcvsを使ってたころのものなので、削除する。
    • /etc/services に下記を追加する

    ------------------------------------------------
    svnserve 3690/tcp # Subversion
    svnserve 3690/udp # Subversion
    ------------------------------------------------

    • 同ファイル内に、cvs、svnで始まる行があれば、それらを削除しておく。 片方はcvsを使ってた頃のもの、svnはFedoraインストール時点で入ってるみたい。
    • 下記命令にて、svnのパケットを受け付けるようにする

    ------------------------------------------------
    iptables -I RH-Firewall-1-INPUT -p tcp -m tcp --dport 3690 -j ACCEPT
    iptables -I RH-Firewall-1-INPUT -p udp -m udp --dport 3690 -j ACCEPT
    ------------------------------------------------

    • cvs用のパケットを受け付けるようになっているものは、削除する

    ------------------------------------------------
    iptables -D RH-Firewall-1-INPUT -p tcp -m tcp --dport 2401 -j ACCEPT
    iptables -D RH-Firewall-1-INPUT -p udp -m udp --dport 2401 -j ACCEPT
    ------------------------------------------------

    • iptables --listでパケット受け付けの追加と削除が反映されているか確認する
    • /etc/hosts.allow ファイルに、”svnserve : 192.168.11. 127.0.0.1”を追加する。
    • xinetdにsvnserveを認識させる。 まずは、chkconfig --list で現状確認。
    • もしsvnserveが無いなら、下記にて追加作業

    ------------------------------------------------
    chkconfig --add svnserve
    service xinetd restart
    ------------------------------------------------

    • 上記で設定したアクセス権のあるユーザにて、 telnet localhost 3690 でsvnserveの動作確認。 ”Connected to ”と出れば接続成功!

    • 次に、アクセスするユーザの登録を行う
    • 作成したリポジトリ用のディレクトリ (/var/www/svn/repo) の下に、リポジトリを作成  ”svnadmin create test”で、今回はtestという名前のリポジトリを作成。
    • testディレクトリが作成され、この中のsvnserve.confとpasswdを編集する
    • svnserve.confについては、下記のようにする

    ------------------------------------------------
    anon-access = none # Anonymous(匿名)ユーザのアクセスを許可しない
    auth-access = write # 認証済みユーザには書き込み権限を与える
    password-db = passwd # パスワードファイルをpasswdとする
    realm = sample repository # リポジトリの説明(適当でOK)
    ------------------------------------------------

    • passwd については、下記のようにユーザ=パスワード の形式。 登録したいユーザの数だけ、行追加する事。 

    ------------------------------------------------
    [users]
    toshiki=★非公開009★
    ------------------------------------------------

    ここまでで、設定作業は完了。

    ■■■■■■■ 参考 ■■■■■■■
    できるPRO Fedora 8 Linux (DVD付)
    その場でつかえるしっかり学べるUML2.0
    元祖 デザインパターン
    独習Java
    入門Subversion
    ■■■■■■■■■■■■■■■■■

    次回はノートPCからのアクセスについて

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

    サーバ構築 mydnsのアクセス確認

    さて、先日の記事で登録したmydnsについて、Linuxからアクセスしてみる。 http://connect2.jp/weblog/2007/05/linuxproxy.html を参考に、下記のproxy設定を行う。

    ■wgetの設定
    /etc/wgetrc
    http_proxy=http://[servername or server IP] :[port number]/

    できるPRO Fedora 8 Linux (DVD付) の284ページを見ながら、”wget --spider --http-user=mydns33333 --http-password=<登録したパスワード> http://www.mydns.jp/login.html”を実行。 mydns サイトを見て、Linuxからアクセスされた事を確認できた。

    ■■■■■■■ 参考 ■■■■■■■
    できるPRO Fedora 8 Linux (DVD付)
    その場でつかえるしっかり学べるUML2.0
    元祖 デザインパターン
    独習Java
    入門Subversion
    ■■■■■■■■■■■■■■■■■

    上記の本とネットで調べながら、ここまでの作業を行ってます。

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

    サーバ構築 subversionのインストール成功!

    先日の記事にて、subversionのインストールができてなかったのですが、色々試行錯誤の末、できました。 

    そもそも、事をややこしくしてるのは我が家のネットワーク環境。 後はLinuxの仕組みの理解不足。 HOW LINUX WORKS を買って勉強予定。

    Lan_

    上記のように、ノートPC(LetsNote)からしか、インターネットにアクセスできないようにしてるので、LinuxServerも、ノートを経由させなければインストール等ができない。 麻雀ゲーム完成して、稼働する段になれば別のネットサービス申し込みますが。

    Linuxから”yum install subversion”としても、失敗するので、まずはノートPCとLinuxがネット的に接続されているのかを確認していく。 フリーソフトのWireShark を使って、パケットをモニタリングしながら、コマンドラインからping。 すると、パケットは流れてるけど、pingはタイムアウトしてる。。。 つまり、データはきてるけど、アプリ(ここではping)までは届いていない状態。

    ファイアウォール関係でブロックされてるみたい。 ウイルスバスタを見ていくと、どうもここでブロックされてるみたい。 192.168.11から始まるIPなら、すべて受け付けるように設定。

    Ws000000_2 Ws000001 Ws000002 Ws000003 Ws000004

    ここまでしても・・・ yumコマンドは失敗。 WireShark を再び使って調べてると、yumコマンドをLinux側で実行してもノートまで来てない。 linuxがノートPCをproxyとして認識しなければならないが、それができてないのか。 http://connect2.jp/weblog/2007/05/linuxproxy.html を参考にして設定し、更に・・・フリーソフトのproxyソフトをノートPCに入れる( BlackJumboDog ) 

    ここまで設定すると、やっとLinuxのYumが成功! 

    下記はyum通信をproxy経由で行うための設定。

    yumの設定
    /etc/yum.conf
    proxy=http:// [servername or server IP] :[port number]/

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

    Java開発環境 eclipse

    次は、Java開発環境のデファクトスタンダードである、eclipseをhttp://www.eclipse.org/downloads/からダウンロードする。

    Eclipse

    For_windows

    Windows用のものをダウンロード。 解凍して、適当なところに移動するだけです。 起動はフォルダ内のeclipse.exe をクリックで。 初めて立ち上げると、ワークスペースをどこにするか聞かれるが、適当なところにワークスペース用のフォルダを作成して、そこを指定する。

    Javaの言語の勉強は、独習Java でOKと思います。 今回の麻雀ゲーム作成にあたって、ちょっと読み直そうと思ってます。 

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

    Java開発環境 Jude

    今後の麻雀ゲーム作成は、最近買ったLetsNoteで行うため、改めて必要なソフトをインストールする。 

    まずは、JavaのSDKを http://www.sun.com/ からDL。 

    Java

    その次に、Judeをhttps://jude.change-vision.com/jude-web/index.html からインストール。

    Jude

    JudeはUMLモデリングツール。 UMLについては、その場でつかえるしっかり学べるUML2.0 がお勧め。 この本を見ながら設計を進めていく予定。

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

    サーバ構築 mydnsへの登録

    インターネットからアクセスできるようにするため、http://www.mydns.jp/ にて、ドメイン登録をしました。 お金がかからないのが良いですね。

    Mydns

    ユーザ登録の後、上記のように入力してドメイン登録。

    久しぶりにこの本を引っ張りだしてきて、対応しました。

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

    サーバ構築 SubVersion導入

    次に、SubVersionを導入する。 実際のメーカ等でも、事実上のデファクトスタンダードになりつつあるのを感じるこのソフトを使わない手は無いです。

    rpm -qi subversion

    yum install subversion

    コマンドで、subversionインストール済か確認後、インストールされていない事を確認のうえ(自分のサーバなのでわかってるけど)、インストール。 ただ、ここでエラーが大量に発生。 以前はLinuxから直接ケーブルテレビのモデムに繋いでたけど、これが無いのでノートPCのEmobile経由してインストールする必要がある。。

    http://park15.wakwak.com/~unixlife/linux/net-gateway.html を参考にして、192.168.11.200(ノートPC) をデフォルトゲートウェイに設定へ変更。

    不要かもしれないが、shutdown -r now で再起動させておく。 これでうまくいかない・・・

    ”not using ftp, http”とかいうエラーでyumが失敗する。 色々調べて見るが解決まで至りませんでした。

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

    サーバ構築 開発ネットワーク環境

    不景気により、自宅で過ごす時間が増えそうなので、麻雀ゲーム開発を再開します。 以前と違うのが、引っ越しによりケーブルテレビからのネット環境が無くなり、代わりにEmobileを使ってるので、それに合わせて構築を微調整。

    まず、開発中にネットで調べ物等をするのは、ノートパソコンにEmobileで行います。 Linuxサーバは運用できる状態になったら、ADSL等で外部に公開するとして、それまでは自宅内の無線ルータに優先接続しておき、ノートパソコンから無線でアクセスできるようにしておきます。

    ■開発環境

    Lan_

    ■運用環境

    Lan__2

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

    NetJan設計 Com設計 Part2

    麻雀ゲーム、NetJanの設計をようやく再開。 サーバとクライアントの間のコマンドのやりとりについて、Comクラスの送受信で行うが、このクラスの派生クラスをそれぞれ設計していく。

    サイコロを振って山を分けるところまでのコマンドについて、完成

    Com2

    最近迷ってる事があって、これが一通り終わると、大体ゲームの一連の流れの設計ができたことになるけど、あがり判定も設計書に落としてからコーディングすべきか、コーディングの着手を早めるか、どっちにしようか。

    ■■■■■■■ これまでの作業で読んだ本 ■■■■■■■
    できるPRO Fedora 8 Linux 完全活用編(DVD付)
     この本に付属のCDで自作PCにLinuxインストールし、麻雀サーバとして立ち上げました。
    その場でつかえるしっかり学べるUML2.0
     UMLとは何か? から説明しています。 わかりやすいのでお勧めです。
    オブジェクト指向における再利用のためのデザインパターン
     設計時にデザインパターンを参考にしながら行っているので、辞書的に使ってます
    他にもいくつか本を買いましたが、ここまでの過程で必須ではないので割愛します。
    ■■■■■■■■■■■■■■■■■■■■■■■■■■■

    blog

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

    NetJan設計 Com設計 Part1

    Com(コマンド)の処理を決めていく。 ステートチャート図設計時に定めたステートの遷移をたどりつつ、各コマンドで更新するModelも決めていく。

    今日はCom_DiceSeatまで完了し、次回はCom_Shuffleから進めていく。

    Com_1

    ■■■■■■■ これまでの作業で読んだ本 ■■■■■■■
    できるPRO Fedora 8 Linux 完全活用編(DVD付)
     この本に付属のCDで自作PCにLinuxインストールし、麻雀サーバとして立ち上げました。
    その場でつかえるしっかり学べるUML2.0
     UMLとは何か? から説明しています。 わかりやすいのでお勧めです。
    オブジェクト指向における再利用のためのデザインパターン
     設計時にデザインパターンを参考にしながら行っているので、辞書的に使ってます
    他にもいくつか本を買いましたが、ここまでの過程で必須ではないので割愛します。
    ■■■■■■■■■■■■■■■■■■■■■■■■■■■

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

    NetJan設計 ここまでの設計書をUP 2回目

    設計が進んできたので、今までの設計の記事を再度列挙。  以前設計記事を列挙した記事を一度UPしたけど、それも含める形で列挙。

    ここまでの設計書をUP ⇒ 「NetJan_20080202_2005.zip」をダウンロード

    ■■■■■■■ これまでの作業で読んだ本 ■■■■■■■
    できるPRO Fedora 8 Linux 完全活用編(DVD付)
     この本に付属のCDで自作PCにLinuxインストールし、麻雀サーバとして立ち上げました。
    その場でつかえるしっかり学べるUML2.0
     UMLとは何か? から説明しています。 わかりやすいのでお勧めです。
    オブジェクト指向における再利用のためのデザインパターン
     設計時にデザインパターンを参考にしながら行っているので、辞書的に使ってます
    他にもいくつか本を買いましたが、ここまでの過程で必須ではないので割愛します。
    ■■■■■■■■■■■■■■■■■■■■■■■■■■■

    ここらへんでレビューしてもらいたいところだけど、1人のプロジェクトなのでできない。

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

    NetJan設計 データ設計完了

    Excelでのデータ設計が完了した。 大体思いつく限りでは、ここで定義したデータがあれば、ゲームの状態を表せるはず。 あとは微調整レベルくらいで済むはず。

    Modelexcel_full

    ■■■■■■■ これまでの作業で読んだ本 ■■■■■■■
    できるPRO Fedora 8 Linux 完全活用編(DVD付)
     この本に付属のCDで自作PCにLinuxインストールし、麻雀サーバとして立ち上げました。
    その場でつかえるしっかり学べるUML2.0
     UMLとは何か? から説明しています。 わかりやすいのでお勧めです。
    オブジェクト指向における再利用のためのデザインパターン
     設計時にデザインパターンを参考にしながら行っているので、辞書的に使ってます
    他にもいくつか本を買いましたが、ここまでの過程で必須ではないので割愛します。
    ■■■■■■■■■■■■■■■■■■■■■■■■■■■

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

    NetJan設計 データ設計(Excel設計書) Part1

    各Model派生クラスのメンバについては、Excelのほうが見やすいので、こちらで表すようにする。

    Modelexcel1

    続き

    Modelexcel2_2

    ModelBoard については、明日以降に追記予定。

    ■■■■■■■ これまでの作業で読んだ本 ■■■■■■■
    できるPRO Fedora 8 Linux 完全活用編(DVD付)
     この本に付属のCDで自作PCにLinuxインストールし、麻雀サーバとして立ち上げました。
    その場でつかえるしっかり学べるUML2.0
     UMLとは何か? から説明しています。 わかりやすいのでお勧めです。
    オブジェクト指向における再利用のためのデザインパターン
     設計時にデザインパターンを参考にしながら行っているので、辞書的に使ってます
    他にもいくつか本を買いましたが、ここまでの過程で必須ではないので割愛します。
    ■■■■■■■■■■■■■■■■■■■■■■■■■■■

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

    NetJan設計 データ設計(クラス図) Part4

    ModelHolder派生クラス、各派生クラスのメソッドを決める。 捨牌、手配、山牌、のそれぞれで、必要なメソッドが少しずつ異なる。

    Holder3

    ■■■■■■■ これまでの作業で読んだ本 ■■■■■■■
    できるPRO Fedora 8 Linux 完全活用編(DVD付)
     この本に付属のCDで自作PCにLinuxインストールし、麻雀サーバとして立ち上げました。
    その場でつかえるしっかり学べるUML2.0
     UMLとは何か? から説明しています。 わかりやすいのでお勧めです。
    オブジェクト指向における再利用のためのデザインパターン
     設計時にデザインパターンを参考にしながら行っているので、辞書的に使ってます
    他にもいくつか本を買いましたが、ここまでの過程で必須ではないので割愛します。
    ■■■■■■■■■■■■■■■■■■■■■■■■■■■

    技評の記事で勉強もします。

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

    NetJan設計 データ設計(クラス図) Part3

    ModelTileHolderについて、派生クラスとの関係を考えつつ、メソッドを追加していく。 牌をホルダーに追加するメソッド、削除するメソッド、並べるメソッド、等。

    Holder2

    ■■■■■■■ これまでの作業で読んだ本 ■■■■■■■
    できるPRO Fedora 8 Linux 完全活用編(DVD付)
     この本に付属のCDで自作PCにLinuxインストールし、麻雀サーバとして立ち上げました。
    その場でつかえるしっかり学べるUML2.0
     UMLとは何か? から説明しています。 わかりやすいのでお勧めです。
    オブジェクト指向における再利用のためのデザインパターン
     設計時にデザインパターンを参考にしながら行っているので、辞書的に使ってます
    他にもいくつか本を買いましたが、ここまでの過程で必須ではないので割愛します。
    ■■■■■■■■■■■■■■■■■■■■■■■■■■■

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

    NetJan設計 データ設計(クラス図) Part2

    今度は牌を保持する、ModelHolder派生クラスの派生クラス図を作成。

    Holder

    ■■■■■■■ これまでの作業で読んだ本 ■■■■■■■
    できるPRO Fedora 8 Linux 完全活用編(DVD付)
     この本に付属のCDで自作PCにLinuxインストールし、麻雀サーバとして立ち上げました。
    その場でつかえるしっかり学べるUML2.0
     UMLとは何か? から説明しています。 わかりやすいのでお勧めです。
    オブジェクト指向における再利用のためのデザインパターン
     設計時にデザインパターンを参考にしながら行っているので、辞書的に使ってます
    他にもいくつか本を買いましたが、ここまでの過程で必須ではないので割愛します。
    ■■■■■■■■■■■■■■■■■■■■■■■■■■■

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

    NetJan設計 データ設計(クラス図) Part1

    データ構造の設計をしていく。 ModelPositionクラスについては、staticなメンバを1つ持ち、このメンバがプレイヤーがどの位置(東南西北)にいるか、を表す。 各牌はこのクラスを内部に持ち、その牌がどの位置(絶対位置、ゲーム位置)にあるかがわかる。

    Class_model

    ■■■■■■■ これまでの作業で読んだ本 ■■■■■■■
    できるPRO Fedora 8 Linux 完全活用編(DVD付)
     この本に付属のCDで自作PCにLinuxインストールし、麻雀サーバとして立ち上げました。
    その場でつかえるしっかり学べるUML2.0
     UMLとは何か? から説明しています。 わかりやすいのでお勧めです。
    オブジェクト指向における再利用のためのデザインパターン
     設計時にデザインパターンを参考にしながら行っているので、辞書的に使ってます
    他にもいくつか本を買いましたが、ここまでの過程で必須ではないので割愛します。
    ■■■■■■■■■■■■■■■■■■■■■■■■■■■

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

    NetJan設計 データ設計

    次はデータの詳細設計をしていく。 どのModelクラスにどのようなデータを持たせるかを考えていく。 その中でも、色々なModel派生クラスで使用されるであろう、東南西北を表す概念について、1つのクラスで表すようにする。

    牌、ユーザ、その他のデータについて、”位置”の概念を含有するクラスがいくつか存在する事になるが、その際、JAN_POSITIONクラスを利用する。 
    絶対位置、ゲーム位置、の2つの概念を持ち合わせるクラスで、2つの概念の違いは下記の通り 

    • 絶対位置: プレイヤーから見たときの位置。 自分自身を1、右隣の人を2、対面を3、左隣を4、とする
    • ゲーム位置: ゲームとしての位置。 南家なら"南"が位置となる。

    下記図において、南家のプレイヤーから見ると下記の位置だとしても、同じ状況を西家から見ると、絶対位置は異なる。  (例えば、西家のプレイヤーから見れば南家の人の絶対位置は4となる) 

    Position

    ■■■■■ これまでの作業で読んだ本 ■■■■■
    できるPRO Fedora 8 Linux 完全活用編(DVD付)
     この本に付属のCDで自作PCにLinuxインストールし、麻雀サーバとして立ち上げました。
    その場でつかえるしっかり学べるUML2.0
     UMLとは何か? から説明しています。 わかりやすいのでお勧めです。
    オブジェクト指向における再利用のためのデザインパターン
     設計時にデザインパターンを参考にしながら行っているので、辞書的に使ってます
    他にもいくつか本を買いましたが、ここまでの過程で必須ではないので割愛します。
    ■■■■■■■■■■■■■■■■■■■■■■■

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

    NetJan設計 ステートチャート図、微調整

    Gameのステートチャート図、詳細への記事で設計したステートチャート図の各ステートの意味を忘れないように図中のノートに各ステートの意味を書いていく。

    書いてて思ったが、TAKE_REQUESTEDの状態は持ってても意味がないという結論に達した。 というのも、AFTER_DISCARD 状態と結局は同じ(ロンか鳴きがなければ、WAIT_DISCARDに遷移する、というのがポイントなので)状態だから。 同時に、Com_Takeもなくし、替わりにCom_NoAction(捨牌後、上がりも鳴きもしない事を意味する)を追加。

    下記、調整したステートチャート図

    Gamesubstate_new

    ■■■■■ これまでの作業で読んだ本 ■■■■■
    できるPRO Fedora 8 Linux 完全活用編(DVD付)
     この本に付属のCDで自作PCにLinuxインストールし、麻雀サーバとして立ち上げました。
    その場でつかえるしっかり学べるUML2.0
     UMLとは何か? から説明しています。 わかりやすいのでお勧めです。
    オブジェクト指向における再利用のためのデザインパターン
     設計時にデザインパターンを参考にしながら行っているので、辞書的に使ってます
    他にもいくつか本を買いましたが、ここまでの過程で必須ではないので割愛します。
    ■■■■■■■■■■■■■■■■■■■■■■■

    ステートチャート図を説明したような記事ってなぜか少ないと感じます。。

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

    NetJan設計 Com送受信

    クライアント~サーバ間のコマンド(Com)の送受信のシーケンスを作成する。 

    Seq_com_sendrcv

    このシーケンス作成にあたり、NetworkMainからは、ドライバレペルの違いを意識しないようにしてる事を再認識した。 よく考えたら起動時のシーケンスでNetworkMainからドライバの区別をしているように設計してしまってたので、一部修正する。

    Set_start_mvc2

    ■■■■■ これまでの作業で読んだ本 ■■■■
    できるPRO Fedora 8 Linux 完全活用編(DVD付)
     この本に付属のCDで自作PCにLinuxインストールし、麻雀サーバとして立ち上げました。
    その場でつかえるしっかり学べるUML2.0
     UMLとは何か? から説明しています。 わかりやすいのでお勧めです。
    オブジェクト指向における再利用のためのデザインパターン
     設計時にデザインパターンを参考にしながら行っているので、辞書的に使ってます
    他にもいくつか本を買いましたが、ここまでの過程で必須ではないので割愛します。
    ■■■■■■■■■■■■■■■■■■■■■■■

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

    NetJan設計 起動時のオブジェクト生成と連携

    起動時にMVCの各オブジェクトの生成と連携必要部分について、参照できるようにセットするシーケンスを作成。 

    Seq_start_mvc

    ■■■■■■ これまでの作業要約 ■■■■■■
    できるPRO Fedora 8 Linux 完全活用編(DVD付) を使って、自作PCにLinuxインストールし、麻雀サーバとして立ち上げました。
    今はUMLで麻雀ソフトを設計中です。 UMLに関しては、その場でつかえるしっかり学べるUML2.0を、デザインパターンに関しては、オブジェクト指向における再利用のためのデザインパターン を参考にして進めています。
    他にもいくつか本を買いましたが、ここまでの過程で必須ではないので割愛します。
    ■■■■■■■■■■■■■■■■■■■■■■■

    MVCでちょっとググッてみました。

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

    NetJan設計 ネットワーク部クラス図

    ネットワークのクラス設計を行う。 サーバは4つのクライアントとやりとりをする必要があるが、クライアントからすれば相手はサーバ1つ。 この違いを、Neetwork層の外のクラスからは意識不要な疎結合設計にする。 

    Class_net

    ■■■■■■ これまでの作業要約 ■■■■■■
    できるPRO Fedora 8 Linux 完全活用編(DVD付) を使って、自作PCにLinuxインストールし、麻雀サーバとして立ち上げました。
    今はUMLで麻雀ソフトを設計中です。 UMLに関しては、その場でつかえるしっかり学べるUML2.0を、デザインパターンに関しては、オブジェクト指向における再利用のためのデザインパターン を参考にして進めています。
    他にもいくつか本を買いましたが、ここまでの過程で必須ではないので割愛します。
    ■■■■■■■■■■■■■■■■■■■■■■■

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

    NetJan設計 タイマーによるCom実行

    今度はコマンド(Com)の実行について、viewから(ユーザから)のアクションをトリガとして実行されるのではなく、タイマー満了による実行をする仕組みの設計。

    例えば、プレーヤーAが牌を場から取得した場合、プレーヤーAがいつまでも捨てる牌を選ばない場合、ずっと待つわけにはいかないので、取得した時点でタイマーを開始し、一定時間経過したら、プレーヤーAは自動で牌を捨てるようになる。 

    Control_class

    Timer_com

    ■■■■■これまでの作業要約■■■■■
    できるPRO Fedora 8 Linux 完全活用編(DVD付) を使って、自作PCにLinuxインストールし、麻雀サーバとして立ち上げました。
    今はUMLで麻雀ソフトを設計中です。 UMLに関しては、その場でつかえるしっかり学べるUML2.0を、デザインパターンに関しては、オブジェクト指向における再利用のためのデザインパターン を参考にして進めています。
    他にもいくつか本を買いましたが、ここまでの過程で必須ではないので割愛します。
    ■■■■■■■■■■■■■■■■■■■

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

    NetJan設計 起動処理の設計

    次は起動処理を設計していく。 GUIとCUIの両方で起動できるようにする。 これはmainメソッドを持つStartUpクラスに渡すパラメータにより、どのクラスを生成するかを判断する。

    Start_model

    Start

    ■これまでの作業要約
    できるPRO Fedora 8 Linux 完全活用編(DVD付) を使って、自作PCにLinuxインストールし、麻雀サーバとして立ち上げました。
    今はUMLで麻雀ソフトを設計中です。 UMLに関しては、その場でつかえるしっかり学べるUML2.0を、デザインパターンに関しては、オブジェクト指向における再利用のためのデザインパターン を参考にして進めています。
    他にもいくつか本を買いましたが、ここまでの過程で必須ではないので割愛します。

    ※参考にした記事

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

    NetJan設計 ここまでの設計書をUP 1回目

    今までの設計の記事を列挙してみました。

    ここまでの設計書をUP ⇒ 「NetJan_20080123_0039.zip」をダウンロード

    ■これまでの作業要約
    できるPRO Fedora 8 Linux 完全活用編(DVD付) を使って、自作PCにLinuxインストールし、麻雀サーバとして立ち上げました。
    今はUMLで麻雀ソフトを設計中です。 UMLに関しては、その場でつかえるしっかり学べるUML2.0を、デザインパターンに関しては、オブジェクト指向における再利用のためのデザインパターン を参考にして進めています。
    他にもいくつか本を買いましたが、ここまでの過程で必須ではないので割愛します。

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

    NetJan設計 Gameのステートチャート図、詳細へ

    前回記事で、Game状態を表すEnumを2つ作成した。 GameStateと、その中のPLAY Stateの中を詳細化した、GameSubState、との2つ。 下記はTree図。

    Tree

    前回記事で作成したステートチャート図を少し並び替える。 ここにGameSubStateも記載してしまおうと思っていたけど、少し大きくなりそうなので、図も別々にする。

    State2

    State2_sub

    ■これまでの作業要約
    できるPRO Fedora 8 Linux 完全活用編(DVD付) を使って、自作PCにLinuxインストールし、麻雀サーバとして立ち上げました。
    今はUMLで麻雀ソフトを設計中です。 UMLに関しては、その場でつかえるしっかり学べるUML2.0を、デザインパターンに関しては、オブジェクト指向における再利用のためのデザインパターン を参考にして進めています。
    他にもいくつか本を買いましたが、ここまでの過程で必須ではないので割愛します。

    ステートチャート図を説明したような記事ってなぜか少ないと感じます。。

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

    NetJan設計 Gameのステートチャート図

    ModelMain内に含有される、ModelGameが、ゲームの状態を表す、state、substateメンバを持つようにする。 この組み合わせで、ゲーム中の状態を表す。

    状態の変化は、コマンドの実行によって行われる。

    まずはコマンドの実行なしで、単純に状態を並べてみる。

    State

    ■これまでの作業要約
    できるPRO Fedora 8 Linux 完全活用編(DVD付) を使って、自作PCにLinuxインストールし、麻雀サーバとして立ち上げました。
    今はUMLで麻雀ソフトを設計中です。 UMLに関しては、その場でつかえるしっかり学べるUML2.0を、デザインパターンに関しては、オブジェクト指向における再利用のためのデザインパターン を参考にして進めています。
    他にもいくつか本を買いましたが、ここまでの過程で必須ではないので割愛します。

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

    NetJan設計 Com派生クラス

    ユーザからのアクションをViewからControlに伝える手段、そしてC/S間で要求、受理判断を行ううえで常に使用するのが、Comから派生した各クラスとする。

    例えば、"牌を捨てる"というアクションをユーザが希望した時(捨てるボタンを押下した時)、Com_Discardクラスが生成され、Comの配送のシーケンスのように処理される。

    アクション毎にクラスを作成するので、Comから派生するクラスは多岐にわたる事になる。

    Com

    ■これまでの作業要約
    できるPRO Fedora 8 Linux 完全活用編(DVD付) を使って、自作PCにLinuxインストールし、麻雀サーバとして立ち上げました。
    今はUMLで麻雀ソフトを設計中です。 UMLに関しては、その場でつかえるしっかり学べるUML2.0を、デザインパターンに関しては、オブジェクト指向における再利用のためのデザインパターン を参考にして進めています。
    他にもいくつか本を買いましたが、ここまでの過程で必須ではないので割愛します。

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

    NetJan設計 データ構造

    次はデータ構造を決めていく。 modelパッケージのクラス図を作成し、モレが無いか考えていく。 ModelMain内部に全てのデータクラスを含有する形にしていく。 

    Model

    ■ここまで
    できるPRO Fedora 8 Linux 完全活用編(DVD付) を使って、自作PCにLinuxインストールし、麻雀サーバとして立ち上げました。
    今はUMLで麻雀ソフトを設計中です。 UMLに関しては、その場でつかえるしっかり学べるUML2.0を、デザインパターンに関しては、オブジェクト指向における再利用のためのデザインパターン を参考にして進めています。

    他にもいくつか本を買いましたが、ここまでの過程で必須ではないので割愛します。

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

    NetJan設計 ユースケース図更新

    ユースケース図を更新した。 よく考えたら、viewの先までユースケース図で表す必要は無いので消した。 ついでに、"ゲーム中"というユースケースを動詞に変更。 同時にそこから派生するユースケースを洗い出してみる。

    Usercases

    ここまでの設計書をUP 「NetJan_20080121_0209.zip」をダウンロード

    ■ここまで
    できるPRO Fedora 8 Linux 完全活用編(DVD付) を使って、自作PCにLinuxインストールし、麻雀サーバとして立ち上げました。
    今はUMLで麻雀ソフトを設計中です。 UMLに関しては、その場でつかえるしっかり学べるUML2.0を、デザインパターンに関しては、オブジェクト指向における再利用のためのデザインパターン を参考にして進めています。
    他にもいくつか本を買いましたが、ここまでの過程で必須ではないので割愛します。

    ※時々見てるblog でもユースケースの事書いてた事だし。

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

    NetJan設計 コマンドの配送と実行

    ユーザアクションはViewで検知させ、それをcontrol内にpushで渡し、キューイングする。 controlはタイマーで定期的にキューのチェックを行い、1つずつ取り出して実行(execute)するようにする。

    排他処理は2つの部分で行う。

    1. Modelのデータ編集、Modelのデータ参照とその結果を踏まえたコマンド(Com)の実行可否判断、は、checkQueueのコンテキスト内で行うようにする。 この事により、複数のスレッドが同時にModelにアクセスして、片方で編集中にもう片方でコマンドの実行可否を判断する、といった輻輳を防ぐ。
    2. キューイング処理の排他。 キューイングへのpushとpopが輻輳しないよう、synchronizedさせる。 pushとpopそれぞれのメソッドをsynchronizedメソッドにしても意味がないので、pushとpopで連携して排他できるよう、下記のような方法を取る。

      synchronized (this){

        処理内容

      }

    上記実現のため、controlパッケージ内のクラスに、メソッドを追加する。

    Class_control

    ここまでの決定を元にシーケンス図を作成する。

    Com_mvc

    ■ここまで
    できるPRO Fedora 8 Linux 完全活用編(DVD付) を参考にして自作PCにLinuxインストールし、麻雀サーバとして立ち上げました。
    今はUMLで麻雀ソフトを設計中です。 UMLに関しては、その場でつかえるしっかり学べるUML2.0を、デザインパターンに関しては、オブジェクト指向における再利用のためのデザインパターン を参考にして進めています。

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

    NetJan設計 ユーザアクション時のMVCのやりとり

    ユーザアクション(牌を捨てる、その他)が発生した時のMVC間でどのように伝えるか、を考えていく。 考えるうちに思ったが、View⇒Controlの結合はもっと疎結合にするため、ControlMainをViewMainから参照するのではなく、ControlIFというインターフェースを用意する。 ViewIFはこのインターフェースに対して、Comを設定していく。

    Controlif

    その設計を元に、MVCのやりとりをシーケンス図に落とし込む。

    Sequence

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

    NetJan設計 ViewとModelの連携クラス図

    ViewとControlのやりとりは、ViewIFをインターフェースにする事で考えていった。 次はViewとModelのやりとり。 Modelのデータが変更した時にViewに通知して、View側で表示変更するかたちになる。 

    今回は、Observer/Observableのパターンを使う。 このパターンはデザインパターンという非常に有名な本でも紹介されてる設計パターン。 java.utilに元々存在するので、これらを利用してクラス図を作成。 ついでに、今まで作成した配置図、コンポーネント図、クラス図の図名を少しだけ変更。

    Class_viewmodel

    ここまでの設計書をUPする。 「NetJan_20080119_1134.zip」をダウンロード 

    デザインパターンという本はカスタマーレビューでも非常に評価が高い、お勧めの本。

    勉強のため、http://blog.goo.ne.jp/cilsetyu も少し確認しておく。

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

    NetJan設計 ユースケース図変更に伴う他変更

    ユースケース図作成にあたって、ViewをIF化したので、他の図も変化する。

    クラス図とコンポーネント図の変更版

    Component2

    Class2

    ユースケース図の作成の考え方がそもそも合ってるのかわからない。 http://www.rmake-labo.com/akasata/articles/show/229 で少し説明を見てみる。

    また、お勧めの本も購入。

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

    NetJan設計 ユースケース図作成

    次にユースケース図を作成する。 ユースケースの大分類として、ゲーム開始/ゲーム中/ゲーム終了の3つを作成。 ゲーム中がダントツで大きい処理にはなるが、取り合えずこの分類で整理してみる。

    また、ここで作成したクラスについて再考。 ViewMainがControlMainとやりとりするクラス設計で考えていたが、Viewは抽象化して色々なタイプのUIをサポートしたほうが良いと判断。 なので、ViewMainとControlMainの関係は削除し、代わりにViewIFをインターフェースとして用意。 このIFでControlMain, ModelMainとやりとりする。

    Usecase

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

    NetJan設計 コンポーネント図

    次はコンポーネント図を作成していく。 配置図の中にNetJanというコンポーネントを持たせたが、この、コンポーネントの中のソフトウェアの構成を表す感じ。

    judeで引き続き作成する。

    Component

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

    NetJan設計 配置図作成

    次にNetJanをインストールするPCを表した配置図を作成。

    まずはモデリングのために、"PC"というノードの中に、"NetJan"というコンポーネントがある事を表す。 これを配置図_モデリングという図名で作成。

    Haichi_model

    次に、実際の物理的な関係を表すために、ノードインスタンス、コンポーネントインスタンスを含めた配置図を作成し、配置図_インスタンスという図名で保存。

    Haichi_instance

    引き続き、UMLを勉強しながら設計していく。

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

    NetJan設計 MVCによるクラス設計

    基本設計を始めていく。 MVCアーキテクチャをベースとする。 Modelは牌、その他のデータを格納するクラス郡、Viewは表示とユーザからのアクションを受け付けるクラス郡、Controlは他のノードからコマンドパケットを受信してコマンド実行をしたりするクラス郡。

    Mvc

    これまでの画像、設計書:「NetJan_20080116_2220.zip」をダウンロード

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

    NetJan設計 構成図

    NetJanは、基本的にサーバ1台、クライアント4台の構成で動作する事を想定する。

    Nodes

    また、C/Sソフトウェアを起動するためには、C/S識別文字列(ソフトウェアをクライアントとして動作させるか、サーバとして動作させるか)の指定、をパラメータにて明示しなければならない事とする。

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

    牌画像 4種の表示パターン作成

    前回の記事の続きで、足りない牌表示パターンについて考えていく。 縦の牌の寝てる板は、立ってる牌の外枠部分を上下を逆にする感じで作成する。

    表示パターンは4つに分ける事ができる。 下記、設計書の分類。 横立のパターンは不要となる。 この不要なパターンも含めた4種類の画像を作成する。

    4kinds

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

    牌画像 縦横状態、立捨状態の表示

    全然回の考察を更に詳しくしていき、設計書に落とす。

    ※クリックしたら拡大表示されます。

    Hai_display_way

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

    牌画像 画像の編集

    前回記事 での牌画像の編集を行うため、GIMPという画像編集用フリーソフトをDLし、共通部分画像外枠画像の分割等を行った時のイメージを掴む。 ただ、実際に画像データを編集するのは、プログラムで行う予定。 というのも、34種全て牌について、この作業をツールで行うのはツライので。

    http://www004.upp.so-net.ne.jp/iccii/usegimp/usegimp.htmlhttp://e0166.blog89.fc2.com/blog-entry-244.htmlに、かなりわかりやすく使い方が説明されていたので、それを参考にしました。

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

    牌画像 立ててる時と寝かしてる時の牌の表示のさせ方について

    DLしてきた画像ファイルは、縦表示用と横表示用がある。

    Hatu_3 Yhatu

    ゲームを作成しようとすると、これ以外にも色々なパターンが必要になる。 

    1. 縦の牌を立った状態で表示する場合: 自牌、対面の自牌
    2. 縦の牌を寝た状態で表示する場合: 自分の捨牌、対面の捨牌、上家、下家が鳴いた時(or リーチした場合)の横向けにしてる牌(自分から見ると縦を向く)
    3. 横の牌を寝た状態で表示する場合: 自分、対面が鳴いた時(or リーチした場合)の横向けにしてる牌、上家、下家の捨牌
    4. 横の牌を立った状態で表示する場合: 無し

    この4つのパターンに分けられると思う。 この時、DLしてきた画像の横versionは、ゲームにおいては使わない画像になりそう。 逆に必要なパターンが欠けてる事になる。 

    そう考えたとき、できれば1つの画像データを元に、全ての必要なパターンの画像を作成すれば楽になると考える。

    例えば縦の画像を拡大してみると、”面”部分(共通部分画像)と、立体的に見せる部分(外枠部分画像)に分けて考える事ができる。

    ■元画像

    Hatsu_large_2

    ■元画像の”面”部分を黒塗りしたもの

    Hatsu_large_inside_empty_4

    そう考えたとき、この”面”の部分を”共通部分画像と考え、それ以外の部分を”外枠部分画像”とする事により、各パターンで”共通部分画像を流用できるようにしようと思う。

    ゲームで遊んじゃうblog で紹介してる麻雀ゲームみたいにリアルには作るのしんどそう。

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

    牌画像 牌画像等探し

    NetJanで使用する牌画像を色々googleで検索。 色々と使用制限がないものがあれば助かるが、何かしら制限はついてしまうか、と思っていたけど、まつセン というサイトで完全フリーの画像を提供していた。

    ここの画像をDLする。 麻雀ゲーム作成に使いたい事を作者に連絡しておこう。

    ちなみに牌の画像はこんな感じ。

    Hatu_2 Man1 Man2 Man3

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

    Java開発環境 大体準備完了

    実際に設計~コーディングを始めたら、色々と出てきそうな気はするけど、機材配置、サーバ構築から、Java開発環境を整えるところまで、大体の準備は完了したので、今までの作業をリンクとしてまとめます。

    機材

    サーバ構築

    Java開発環境

    この後は牌画像をDLできるところを探したり(最悪、フリーで使えないなら自分で作成?)、LinuxサーバでNetJanのサーバサイド動作させるために、サーバにJavaをインストールしたり、と必要ですが、それは開発がある程度進んで通信ができるようになってから、にします。

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

    Java開発環境 NetJanソースの自動圧縮

    次に、作成したソースコード等をこのblogにUPするために、ソースフォルダ等を圧縮するバッチファイルを作成する。

    圧縮処理がWindowsのデフォルトのコマンドラインにあればいいんですが、無いので、perlで圧縮部分だけ作成。

    xcopy C:\Work\toshiki\NetJan\4_画像 %ZIPWORK_PATH%\4_画像 /c /e /i /y /z
    xcopy C:\Work\toshiki\NetJan\6_Src %ZIPWORK_PATH%\6_Src /c /e /i /y /z

    でワークフォルダに必要なフォルダをコピーした後に、perlのArchive::Zip を使ってそのワークフォルダを圧縮する。  ※Perl自体を持ってない場合は、ココからDLできます

    use Archive::Zip;

    my $zip = Archive::Zip->new();

    # 第1引数は圧縮するフォルダ
    # 第2引数は出力先フォルダ
    $src = $ARGV[0];
    $dst = $ARGV[1];

    print "$src 圧縮⇒ $dst \n";
    $zip->addTree($src);

    ($ss, $min, $hh, $dd, $mm, $yy) = localtime(time);
    $yy += 1900;
    $mm++;
    $datetime = sprintf("%04d%02d%02d_%02d%02d", $yy, $mm, $dd, $hh, $min);

    $dst_fullpath = "$dst\\zipped_$datetime.zip";
    print "making $dst_fullpath \n";
    $zip->writeToFileNamed($dst_fullpath);

    ただ、スクリプトを組んで実行してみると、出力ファイルの中身に余分なファイルがある。

    Zipped

    各フォルダと同じ名前のファイルが存在する。 これはなんだろう。 でも、解凍したら余分なファイルは残らないので、まぁ良しとします。

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

    Java開発環境 NetJanをCVSに登録

    Ec_cvs_existing

    NetJanプロジェクトをcvsに登録する。 プロジェクトを右クリック ⇒ Team ⇒ ShareProject を選択。

    Ec_share

    リポジトリはeclipseからcvsアクセス で作成したリポジトリを使うので、Use existing repository location を選択してNext ⇒ Use project name as module nameを選択してNext。

    cvsのパスワードを聞かれるので、★非公開007★を入力。 そのままデフォルトで進めていき、Commitコメントを聞かれるので、適当に入力する。 

    これで完了

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

    Java開発環境 eclipse設定続き

    Junit_src 続いて、eclipseの設定を行う。 まずはJunitインストール でインストールしたJunitのライブラリを追加する。

    NetJanプロジェクトを右クリック ⇒ JavaBuildPath ⇒ Libraries ⇒ AddExternalJars から、インストールしたJunit.jarを選択する。

    Add_junit

    次に、http://www.javadrive.jp/eclipse3/help/index4.html を参考にして、jdkのsrc.zipを設定する。 

    同様に、junitもソースを設定する。 junitから右クリックして、ソース添付させる。 junitをインストールした場所を選択し、junit-4.4.jar を設定。

    Junit_src_2

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

    Java開発環境 フォルダ構成

    次に開発ソースの格納場所等を決める。 下記のような構成とした。

    Folder

    これにあわせてecipseのプロジェクト作成を行う。

    eclipseの画面から

    Create_project1

    右クリック ⇒ 新規作成 ⇒ JavaProject を選び、Project名はNetJanとし、ソースフォルダは作成した 6_Src を指定する。 

    Create_project2

    あとはNext ⇒ FinishでProject作成完了。

    eclipseの勉強もしておく必要がありそう。

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

    Java開発環境 Judeインストール

    次はeclipseの設定を進めていく。 ソースは自分の指定した場所にしたいので、色々触ってやり方を確認。  どうもその後色々実験してみると、開発環境を共有したらeclipseUMLは使えない、とある (http://www.eclipsewiki.net/eclipse/index.php?EclipseUML

    それならeclipseUMLを使うのはやめよう。 ソースと同期が取れるのが魅力的だったけど、cvsを諦めてまでは不要。 やっぱりみんなが使ってるJudeにする。

    Jude

    ここからJudeCommunityというフリー版を落としてくる。 DLしたファイルは、jude-community-5_1_1-setup.exe (7,546 KB) (Windows インストーラ)推奨

    DLしてインストール

    UMLの勉強は独習シリーズの本で少しした事があるくらい。 

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

    Java開発環境 eclipseからCVSアクセス

    今度は準備したLinux上のCVSにノートPCからアクセス。 eclipseを立ち上げ、Window->perspective->Other からCVS Repositoryを選択。 

    Eclipse_cvs

    CVS Repositories のコンテキストで右クリック ⇒ New ⇒ Repository Location を選択する。

    Eclipse_cvs_connect

    • Host: www.ts.mydns.jp
    • RepositoryPath: /var/www/cvs
    • User: netjancvs
    • Password: ★非公開007★

    を入力して、Finish

    Eclipse_cvs_connected

    アクセス成功!

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

    サーバ構築 CVS、xinetd インストール

    段々環境が整ってきた。 今回開発する麻雀ゲーム、本当なら仕様書から作成したいところだけど、ソフト開発しながら仕様を決めていく。

    開発途中のソースの管理のために、ソース管理システムを導入したいところなので、これもフリーのCVSをインストールする。 eclipseはデフォルトでCVSのクライアント機能が付いてるようなのでインストールは不要。  今回構築したLinuxサーバをCVSサーバとするために、こちらにインストールする。 TeraTermから、

    yum install cvs

    でインストールする。

    次に、pserver設定方法サイト を参考にしながら設定していく。

    1. まずは、/var/www/ の下に cvs というcvs用のフォルダを作成する。
    2. export CVSROOT=/var/www/cvs/ で、ルートフォルダ設定
    3. /var/www/cvs に移動し、cvs init で初期化
    4. /var/www/cvs の下にREPOSITORYというフォルダができる

    ここまでで、LinuxサーバへのCVSリポジトリの作成は完了。 次にノートPCからソースのUP/DLをできるようにする必要がある。 色々調べてわかったことだが、LinuxをCVSサーバとして動かすためには、xinetd の説明サイト の説明に書いてるように、スーパーサーバのデーモンを動かしたり、そのためのパケットを受け付けたりする必要があるみたい。

    pserver設定方法サイト の説明を参考にして設定を進めていく。

    iptables -I RH-Firewall-1-INPUT -p tcp -m tcp --dport ★非公開006★ -j ACCEPT
    iptables -I RH-Firewall-1-INPUT -p udp -m udp --dport ★非公開006★ -j ACCEPT

    で、使うポートのアクセスを許可。 次に、/etc/services に下記の2つを追記

    cvspserver 2401/tcp
    cvspserver 2401/udp

    次に、CVSアクセスのためのユーザを追加する。 

    1. adduser -p '' netjancvs
    2. passwd netjancvs
    3. パスワードを聞かれるので、★非公開007★を入力
    4. sshdで操作できるようにするため、sshdのAllowUsers設定にもnetjancvsを追加
    5. /etc/xinetd.d/cvs というファイルを下記のように編集

    service cvspserver
    {
            disable                 = no
            port                    = 2401
            socket_type             = stream
            protocol                = tcp
            wait                    = no
            user                    = netjancvs
            passenv                 =
            server                  = /usr/bin/cvs
            env                     = HOME=/var/www/cvs
            server_args             = -f --allow-root=/var/www/cvs pserver
    #       bind                    = 127.0.0.1
    }

    service xinetd restart でxinetdを再起動、させようとしたが、ここで、"xinetd: unrecognized service"のエラーが出る。 インストールしてなかった。。

    yum install xinetd

    でインストール。 改めて service xinetd restart 

    CVSのコマンドの使い方は本を見て勉強する。

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

    Java開発環境 SDK、EclipseUMLインストール

    サーバ構築が終わったので、Java開発環境の準備に戻る。

    http://java.sun.com からjdk-6u3-windows-i586-p.exe をDLし、インストール。 途中で色々聞かれるが、Nextを選択し続ける。 インストールが終わったら、readme.txtを読んでおく。 色んなソフトインストール時のreadme.txtは昔は読まなかったけど、最近は有用な情報が詰まってる事を実感しているので、一応読むようにしてる。

    Omondo

    http://www.omondo.com/ からEclipseUML 2007 3.3.0 Free(version:3.3.0.v20071210) をDLし、同サイトのHtml Documentation を見ながらインストールしたら特につまる事なくできた。

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

    サーバ構築 cgiが正しく動作しない問題

    前の記事 では、cgiは正しく動作した記憶があったのですが、今ノートPCから http://www.ts.mydns.jp/cgi_test.cgi にアクセスすると、"このファイルを開くか、または保存しますか?"とファイルのダウンロードDialogが表示されてしまうようになりました。

    Googleで色々と調べ、http://webmemo.flaps-web.com/2007/06/cgi.html で解決。 引用すると、

    Dialogからダウンロードしてどこかに保存しテキストエディタで開いてみてください。
    perlのCGIだと仮定すると3つの状態が想定できます。

    1. CGIの実行結果が記述されている場合
     ヘッダの不良、 またはContent-type:text/plain\n\nと言うヘッダの場合、文法的には正しいのですが、MSIEのおかしな仕様により開けません。
      Content-type:text/html\n\n をつけてHTML文を出力しましょう

    2. 実行結果ではなく #! /usr/local/bin/perl などを含むスクリプトのソースそのものが記述されている場合
     httpd.confまたは有効な .htaccessで AddHandler cgi-script .cgi が効いていません

    3. エラーメッセージが記述されている場合
     error.logを見て参考にしましょう 場所はデフォルトなら C:\Program Files\Apache Group\Apache\logs
     内容を見ても判らなければ logの一番下から3行分を補足に貼り付けてください

    という事で、cgi_test.cgi のtext/plainの部分を、text/htmlに変更して保存、http://www.ts.mydns.jp/cgi_test.cgi にアクセスしてみるとうまくいった。 また、今後の対比実験のために、もとのtext/plain のままのものは、cgi_test_plain.cgi で保存。 http://www.ts.mydns.jp/cgi_test_plain.cgi にアクセスすると確認できるようにしておきました。

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

    サーバ構築 Samba、SSH、NTP

    これまでは、本の前から割りと順番に進めてきたけど、後は必要なものだけをインストールしていく。

    ■まずはSamba

    1. Sambaをyumでインストール yum install samba
    2. iptablesでTCP/UDPの135~139のPortを許可する iptables -I RH-Firewall-1-INPUT -p tcp -m tcp --dport 135:139 -j ACCEPT、iptables -I RH-Firewall-1-INPUT -p udp -m udp --dport 135:139 -j ACCEPT、/etc/rc.d/init.d/iptables save
    3. pdbedit -a toshiki でSamba利用ユーザ登録。 パスワードは★非公開004★
    4. /etc/samba/smb.conf のworkgroupを"TOSHIKIHOME"、server stringを"XcCube"に、wins support = yes がコメントアウトされているものを有効に、globalセクションの最後に、”passdb expand explicit = no”を追加
    5. Sambaを起動(/etc/rc.d/init.d/smb start、/etc/rc.d/init.d/nmb start)、次回Linux起動時にもSambaが起動するように設定(chkconfig smb on、chkconfig nmb on)
    6. exitしてroot権限を放したうえで、/home/toshikiの下に、smb_test.txtで適当な内容のファイルを作成する。
    7. PCのWorkGroupもTOSHIKIHOMEになっていることを確認し、"ネットワーク"からサーバのフォルダにアクセスする。

    Workgroup Linux

    ■次はSSH

    1. /etc/ssh/sshd_config のPermitRootLoginをnoに、ファイルの一番下に、”AllowUsers toshiki”を追加
    2. sshdの起動と、次回Linux起動時にも起動する設定(/etc/rc.d/init.d/sshd start、chkconfig sshd on)を行う。
    3. ノートPCにTeraTermをインストール。 http://sourceforge.jp/projects/ttssh2/ から UTF-8 TeraTerm Pro with TTSSH2 を選択しDLしてインストール
    4. 実行し、ホストに192.168.11.100を入力、SSHのSSH2で接続。
    5. 証明書保存するかどうかが聞かれたり、ユーザ名/パスワードが聞かれたりするが、入力して進める。 
    6. これでログイン完了!

    更に安全にリモート操作するために、公開鍵認証の設定を行おうとしたけど、うまくいかない。 なので、仕方なくPort番号だけ、★非公開005★ に変更する。 

    また、SMTP/POP/FTP等のためのPortはACCEPTにしてたものを削除、同時にルータの設定も同様に不要なPortの転送ルールは削除する。

    ■NTP

    1. yumでntpをインストール
    2. 付属CDから設定をコピー
    3. ntpdateコマンド実行
    4. ntpdの起動、Linux起動時に起動する設定
    5. ntpq -p で動作確認
    6. ノートPC側で、コントロールパネル ⇒ 日付と時刻 ⇒ インターネット時刻 から、LinuxサーバのIPを設定。 今すぐ更新はまだ押さない。
    7. iptablesコマンドで、ノートPCからの同期を受け付けるよう、Port123のUDPをACCEPTする
    8. ノートPC側で、今すぐ更新 を選択 ⇒ 成功!

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

    サーバ構築 Webサーバ

    今度は同本の14-1から進めていく。

    1. まずはApache httpdのインストール。 yum install httpd httpd-manualに