久々の更新

1年半放置しっぱなしでごめんなさい。
鯖が変わって色々と変化があったので、まとめときます。

現在の鯖構成は以下のような感じ。

ところで、頒布元のサイト(しぃ堂)が消えましたねぇ…
バグだらけのVer3.66も、これ以上の更新は望めないかぁ('A`)

鯖をXwindow下にしたら色々変わってしまいました。

特に変化があったのが、Javaアプリの動作状態で、今までSNMPから取得していた接続人数が取得できなくなってしまいまして、よくよく見てみたら、IPv6下でListenするようになってしまったようです。
Javaの設定を変更すればいいような気もしましたが、それでは一々面倒な変更を要する事になるかもしれなかったので、NETSTATコマンドから接続人数を取得する手法(あん氏と同様)に変更しました。
ここで、あん氏が2/20に書き込んでくれたレスに話が来るわけですが…

あん 『⊂二二二( ^ω^)二⊃ブーン
ROOM1=`netstat -a -t -o -n|grep ”ESTABLISHED”|sed s/” ¥+”/”,”/g |cut -d”,” -f4|grep ”任意のポート番号”|wc -l`』 (2007/02/20 22:59)

正直言いまして、2ヶ月ほどレスに気付きませんでした('A`)あん氏超ごめん
うちは、今現在以下のような感じです

walk=(`netstat -6|grep $1|awk '{if($6=="ESTABLISHED"){cnt++}print cnt}'`)

$1は、コマンドラインからportcon.sh “任意のポート番号”で取得できるようにする変数です。

おまけ キャッシュサイズのグラフ表示に使ったスクリプト

たぶん誰でもできるものなので省略してもよさそうだけど、いちおう。


cachesize.sh

#!/bin/sh
if [ -f /www/c.grph.jp/$1/save_server/line_cash.tmp ] ;then
ls -la /www/c.grph.jp/$1/save_server/line_cash.tmp|awk '{print $5}'
else echo "0"
fi
echo "0"

mrtg_cachesize.cfg

Target[cache_erocg]: `/hogehoge/cachesize.sh erocg`
MaxBytes[cache_erocg]: 10000000
Title[cache_erocg]: c.grph.jp/erocg/
Options[cache_erocg]: growright,absolute,gauge,nopercent,noinfo,integer
WithPeak[cache_erocg]: ymw
Step[cache_erocg]: 60
ShortLegend[cache_erocg]: Byte
YLegend[cache_erocg]: erocg
LegendI[cache_erocg]: cache size
LegendO[cache_erocg]:
Legend1[cache_erocg]: Byte
Legend2[cache_erocg]:

proftpdが重かったので

もうかなり前からLIST更新時やら接続時に重いなぁーと思ってたのですが
どうやらデフォ設定が以前と変わっているらしく、以下の項目を追加して解決しました。

/etc/proftpd/proftpd.conf
UseReverseDNS off
IdentLookups off

要は、DNS逆引きが重かったのと、Identプロトコルへの接続に時間を要していた、と。

http://dp04022987.lolipop.jp/blog/cgi/mt/archives/2005/11/proftpd.html

絵チャに接続している人数を拾ってMRTGでグラフ化

スクリプト初心者です。 もっと綺麗に書ける人はトラックバックでレスください('A`)※

はじまりはここから。
http://pie.bbspink.com/test/read.cgi/erocg/1135503973/534

>>533
入室はアパッチからカスタムログで.jarへのアクセスログ抜き出しで
人数カウントは各部屋のportのコネクション数見てます

という話だったので、じゃあMRTGでグラフ化してみようじゃない。
…と思ったのが、多分25日あたり。完成が3日だから8日(実質作業日数20時間くらい)… 初心者*1なので見逃してくださいorz


port接続をnetstatで見てもいいんだけど、どうもそれだけでは面白くなかったので、snmpから抜き出そうと思いつく。
snmpdとsnmp-toolをaptでインストールし、snmpwalkで確認。
19031をpaintchatの接続portと仮定して進めます…

# snmpwalk -v 1 -c public localhost tcpConnState|grep 19031

で、出てくる結果のうち、established(5)が接続してる分とおもうんだけど、何故か2ヶ出てくる。
通常であればこれの行数をカウントするだけだから1行スクリプトで済むんだけど、計算が混じっちゃうので1行は無理とシェルスクリプト直打ちでやることにしました。

# cat portcon

#!/bin/sh
walk=(`snmpwalk -v 1 -c public localhost tcpConnState |grep $1|awk '{if($4=="established(5)"){cnt++}print cnt}'`)
num=1
while [ "${walk[$num]}" != "" ];do
shift 1
num=`expr $num + 1`
done
num=`expr $num - 1`
if [ "${walk[$num]}" == "" ];then
echo "0"
else
echo `expr ${walk[$num]} / 2`
fi

これで、接続者が1人の場合は

# portcon 19031
1

と出ます。
しかし、MRTGは2ヶ以上のデータを必要とするので、これだけではだめです。*2
仕方ないので、最後のif〜fiを2回続けてデータ捏造。(なげやり)
これで出力は

# portcon 19031
1
1

となって、MRTGへの入力が可能になりました。
あとは、MRTG.cfgを編集。

Target[19031]: `/hogehoge/portcon 19031`
MaxBytes[19031]: 100
Title[19031]: TCP19031 connections...
Options[19031]: growright,absolute,gauge,nopercent,noinfo,integer
WithPeak[19031]: ymw
ShortLegend[19031]: 人
YLegend[19031]: port: 19031
LegendI[19031]: 接続数
LegendO[19031]:
Legend1[19031]: nums
Legend2[19031]:

これでMRTGを動かして、19031.htmlを参照すればグラフが出ます。
当然ですが、÷2を無くしてやれば別のポート監視にも使えます。

*1:免罪符

*2:本来は4ヶ必要とあり。 しかも、他を"0"とすると正常なデータの保存ができない。 このあたりで3日ほど悩みました

PaintChatApp on Linuxまとめ

お絵描きしぃちゃっと PaintChatApp に関連するエントリー一覧


上記で稼働してる鯖


現在のシステム構成

  • Xubuntu 8.04
    • Apache 2.2
    • JavaJRE(build 1.6.0_xx-xxx)
    • PaintChatApp v3.66 / v2.51

しぃ絵チャ(PaintChatApp)のTip

そういやすっかり忘れてました。

キャッシュサイズの取得方法

ラインキャッシュは、PaintChat.jarの下層ディレクトリ"save_server"内に"line_cash.tmp"として保存されます。
私はSSIを使用しているので、以下のような書き方となります。

<!--#config errmsg="0K" -->
<!--#fsize file="./paintchat/save_server/line_cash.tmp" -->Byte

1行目はエラーメッセージの定義なのですが、ファイルなしエラーが殆ど*1なので、便宜上0Kと書いてあります。
2行目がサイズ表示の命令です。 ここで上記エラーの場合「0KByte」となり、キャッシュが12Kの場合は「12KByte」となります。

サイズ取得ができるものであれば、ぶっちゃけjavascriptでも可能な方法です。*2

しかし気を付けなければならないのは、リアルタイムにラインキャッシュを生成しているわけではないため、多人数でチャットをしている場合などは実際にJavaが保存している量よりも少なめに表示される事です。
この方法でキャッシュサイズを表示させる方は、サイト内に注意を記載しておいたほうが無難でしょう。

1ページに複数のユーザーリスト

ユーザーリストは、"pchat_user_list.swf"が"pconfig.xml"を参照し、そこに記載されたポートを監視する事によりユーザ名を把握しています。 しかし後者のファイルにはポート番号と更新間隔の他に設定箇所が無く、また前者のファイルにも、後者のファイル名を指定する箇所がありません。 さらに、これらのファイルは同じディレクトリにないと稼働できませんし、別ディレクトリからの参照も不可能です。*3
まぁ要は、

  • 2つのファイルが対となっていること
  • 同じディレクトリから参照させること

を満たせればいいわけで、"pchat_user_list.swf"と"pconfig.xml"と、参照するHTMLを同じ場所に置けば良いという結論になります。

…ただ、2部屋以上準備したい場合、上記の制約があるために1つのHTMLに2つ以上のユーザリストを記載する事は不可能となります。
この場合に使える方法は(考えつく限りでは)2つのみ。
フレームで画面そのものを分割するか、もしくはiframeタグで別HTMLを読み込むか です。
たとえば以下のファイル構成の場合

  • index.html ←※1
  • room1
    • PaintChat.jar
    • pchat_user_list.html ←※2
    • pchat_user_list.swf
    • pconfig.xml
  • room2
    • PaintChat.jar
    • pchat_user_list.html ←※2
    • pchat_user_list.swf
    • pconfig.xml

※1のindex.htmlの一部

<iframe src="room1/pchat_user_list.html" width="160" height="240" marginwidth="0" marginheight="0" scrolling="no" frameborder="0"></iframe>
<iframe src="room2/pchat_user_list.html" width="160" height="240" marginwidth="0" marginheight="0" scrolling="no" frameborder="0"></iframe>

※2のpchat_user_list.html(room1、room2とも同じもので良いが、pconfig.xmlは書き換える事)

<html><head></head><body style="margin:0px;padding:0px;">
<object height="240" width="160" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0">
<param name="allowScriptAccess" value="sameDomain">
<param name="movie" value="pchat_user_list.swf">
<param name="quality" value="low">
<param name="bgcolor" value="#ffffff">
<embed height="240" width="160" src="pchat_user_list.swf" quality="low" allowscriptaccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer">
</object>
</body></html>

これは現在の仕様からやむなしに採っている方法なので、バージョンアップ等がされた場合、今以上に簡単になる可能性はあります。 まぁ今のところはこれが限界でしょう。

ちなみに、iframeは複数のHTMLを解釈しなければならないため、見る側(ユーザー)のPCへの負荷が大きいです。 使いすぎに注意しましょう。

これを活用する事もできます。

  1. 複数の仲間で 個々人々がPaintChatApp付属httpdを立ち上げる
  2. それぞれに同じiframe用のHTMLを準備
  3. 普通のWebサイトで、複数のホストを記載したiframeタグを書く
  4. 擬似的な“複数部屋のお絵かきチャットロビー”が完成ヽ(´ー`)ノ

ただし、ブラウザで「別ドメインのiframeは読み込まない」等にチェックが入っていると意味が無いという罠がありますので注意が必要です。

*1:起動(または全消し)から絵を描いて一定量のキャッシュを貯めるまでキャッシュファイルが生成されないため、その場合はエラーが出ます

*2:まぁ、javascriptでsave_serverディレクトリにアクセスさせるためにはネットワークから可視状態にしなければならない=ログファイルが盗まれる危険性があるため、あまりオススメはできません

*3:変数が隠されているだけかもしれませんが、逆コンパイルする環境が無いので確認できません