|
 |
|
2014/10/23(Thu) 21:15:38|NO.65672
いつもお世話になっています。foxtailです。
notesaveについて1点質問をさせてください。
下記のようなスクリプトでWebサーバが生きているかどうか
チェックするツールを作ったのですが、
確認結果をnotesaveでtxtに吐き出させようとすると
最新の20行分の確認結果しか保存されない事が判りました。
毎日デスクトップに張り付いて確認する事は出来ないので
1~2万行位まで保存できるようにしたいのですが、
なにか良い方法はないでしょうか?
このような質問で申し訳ありませんが、
ご教授頂けますと幸いです。
;========================================
;スクリプト
;========================================
title "webアクセス生存確認ツール"
;■コンパイルするファイル情報
#include "hspsock.as"
#include "hsp3util.as" ; gettimestr,getdatestrを使うため
;■メッセージイベントボックス背景設定値
color 192,192,192 ;背景色
boxf 0,0,500,200 ;メッセージボックスサイズ
color 0,0,0 ;メッセージ色
pos 0,0 :screen 0,1000,600,0,100,70 ;ウィンドサイズ
;■メッセージボックス
sdim logbuf,500000
;■Webサイト接続設定内容
;adr=""
adr="192.168.0.25"
port=80
sdim logbuf,1024
pos 800,50 :button "stop",*kill
pos 800,100 :button "Restart",*Aloop
*Aloop
;■時刻表示
gettimestr t1
getdatestr t2
kuuhaku=" "
asss=t2+kuuhaku+t1+kuuhaku+adr
AS=1
CountTime+=1
sockopen 0,adr,port
AA+=1
newlog=strf("%d回目の接続試行 ",AA);整数または実数値を適切な書式で文字列に変換した文字列を返します
;if AA>4 and AA<6:newlog+=""+asss
;if AA>5 and AA<7:newlog+=""+asss
if stat=1 : color 255,0,0:newlog+=asss+" TCP/IPがWindowsにインストールされていない":failed+=1 :Continuousfailure+=1
if stat=2 : color 255,0,0: newlog+=asss+" ソケットの初期化に失敗した":failed+=1 :Continuousfailure+=1
if stat=3 : color 255,0,0: newlog+=asss+" URLのサーバー名取得に失敗した":failed+=1 :Continuousfailure+=1
if stat=4 : color 255,0,0: newlog+=asss+" サーバーに接続できなかった" :failed+=1 :Continuousfailure+=1
if stat :else :newlog+=asss+" OK" :sent+=1 :Continuousfailure=0
gosub *ADD_LOG
redraw 0;チラツキ防止
color 0,0,0:pos 0,0:boxf;背景
;color 0,255,0:pos 0,0: mes logbuf;消すと文字が表示されない
pos 30,200:color 0,255,0:mes""+ logbuf
pos 30,130 :color 255,255,255:mes " 成功数:"+sent
pos 30,150 :mes " 失敗数:"+failed
pos 30,170 :mes "連続失敗数:"+Continuousfailure
notesave "savefile.txt"
redraw 1
;wait 6000;(60秒)
;wait 1000;(10秒)
wait 100;(1秒)
;adr="192.168.0.125"
if AA<10000000000:goto *Aloop
stop
*ADD_LOG
notesel logbuf;p1で指定した変数をメモリノートパッド命令のバッファに設定される
logbuf+=newlog+"\n";表示した文を下方に表示(全部かnewlog消すと表示されず、"\n"を消すと文が横に表示される)
while notemax>20;択されているメモリノートパッド全体の行数を示すシステム変数
notedel 0
wend
return
*kill
stop

| |
|
2014/10/23(Thu) 21:27:16|NO.65674
>sdim logbuf,500000
500000=つまり500000Byte分しか保存されないということです。
でも、1000000以上だとメモリがやられてしまうので・・・(動作が重くなる)
メモリが4GBくらい=3GBくらいまでメモリ保存可能っつうことかな??
|
|
2014/10/23(Thu) 21:51:35|NO.65677
note系はよく理解していませんがとりあえず見たところ、
while notemax>20;択されているメモリノートパッド全体の行数を示すシステム変数
notedel 0
wend
データが20行超えていたら行を削除する。になってんじゃないでしょうか?
|
|
2014/10/23(Thu) 22:01:49|NO.65678
>>Ruby(旧さっくん) さん
なるほど…あまり大容量のデータを展開するのは難しいということですね。
>>撃さん
表示上はログがあがって消えていく(20行を超えた場合)にしているのですが
txt上としてはそのままずっと1行~2万行ぐらいまで残したいと考えています。
ですが、そういった動作は難しいのでしょうか?
|
|
2014/10/23(Thu) 22:09:40|NO.65679
少なくともこのスクリプトでは
最新20行以外のデータを捨ててからセーブしているようなので。
データベースは、ひたすら追記していく形で、
表示系はその中から任意の20行を表示するように別々に作らないと
あかんと思います。
|
|
2014/10/23(Thu) 23:06:25|NO.65681
インターネットから少しずつ情報を得てそれを順番にバイナリファイルに保存します。
後で読み出すときは必要な部分だけを変数に受け渡します。
bsave, bload系ではインデックスやサイズが指定できるので大量のデータを
扱うときには非常に便利です。
これにより256バイトの変数でもファイルへ全てのデータを書き込めますし、
読み出すときも必要な文だけ順番に読みだして行けます。
|
|
2014/10/23(Thu) 23:58:54|NO.65682
>>撃さん
成程。確かに分けて作る必要があるかもしれません。
ただ、作りたくてもどのように作ればいいのかがイマイチぴんと来ておらず…。
非表示の別ウィンドウで淡々と文字を出力させてそれを適時noresaveさせれば
良いのでしょうか?
※サンプルコードとかあれば助かるのですが…。
>>catsさん
少しずつ書き足し保存とテキスト再読み込みで
変更を加えていく風な形ということでしょうか?
処理的には
①sockopenの結果を出力
②出力結果をウィンドウ上で表示(最新の結果を20項目まで)
③テキストに保存
なので、テキストにずっと書き足していくイメージにしていけば
メモリ上での消費も少なくなるのかなと思っているのですが…。
※ただ、こちらもどのようなコードを書けばできるのか
いまいちわかっていないですが…。
|
|
2014/10/24(Fri) 18:15:08|NO.65700
bsaveを使うと指定した位置から保存することができます。
例えば以下のコードでは変数dataの内容を保存するために変数bufを使用していますが
実質bufは1バイト確保しておけばいいわけです。
buf = "" : chr = ""
sdim data, 256
ofs = 0
data = "This is a Test.\n"
repeat 256 ; dataを256回保存。
repeat
chr = strmid( data, cnt, 1 )
if peek(chr) == 0 : ofs += cnt : break
poke buf, 0, peek(chr)
bsave "savefile", buf, 1, ofs + cnt
loop
loop
mes "保存完了"
stop
dataの内容を少しずつ抽出してbsaveで保存することで大量のデータも少量のメモリで扱うことが出来ます。
|
|
2014/10/25(Sat) 00:09:26|NO.65720
とりあえず動作する実物が必要でしょうから貼っておきます。ご参考にどうぞ。
それと質問とは関係ないのですが、あまり頻繁にディスクアクセスするとHDDの寿命を縮めますから、
ログの保存は何行分かまとめてする、とか(notemaxをチェックすれば分かりますね)
一定時間ごとに保存するようになさるのがいいのではないかと思います。
;========================================
;スクリプト
;========================================
title "webアクセス生存確認ツール"
;■コンパイルするファイル情報
#include "hspsock.as"
#include "hsp3util.as" ; gettimestr,getdatestrを使うため
;■メッセージイベントボックス背景設定値
color 192,192,192 ;背景色
boxf 0,0,500,200 ;メッセージボックスサイズ
color 0,0,0 ;メッセージ色
pos 0,0 :screen 0,1000,600,0,100,70 ;ウィンドサイズ
;■メッセージボックス
sdim logbuf,500000
sdim log,5000 ;※追加しました
;■Webサイト接続設定内容
;adr=""
adr="192.168.0.25"
port=80
;sdim logbuf,1024
pos 800,50 :button "stop",*kill
pos 800,100 :button "Restart",*Aloop
*Aloop
;■時刻表示
gettimestr t1
getdatestr t2
kuuhaku=" "
asss=t2+kuuhaku+t1+kuuhaku+adr
AS=1
CountTime+=1
sockopen 0,adr,port
AA+=1
newlog=strf("%d回目の接続試行 ",AA);整数または実数値を適切な書式で文字列に変換した文字列を返します
;if AA>4 and AA<6:newlog+=""+asss
;if AA>5 and AA<7:newlog+=""+asss
if stat=1 : color 255,0,0: newlog+=asss+" TCP/IPがWindowsにインストールされていない":failed+=1 :Continuousfailure+=1
if stat=2 : color 255,0,0: newlog+=asss+" ソケットの初期化に失敗した":failed+=1 :Continuousfailure+=1
if stat=3 : color 255,0,0: newlog+=asss+" URLのサーバー名取得に失敗した":failed+=1 :Continuousfailure+=1
if stat=4 : color 255,0,0: newlog+=asss+" サーバーに接続できなかった" :failed+=1 :Continuousfailure+=1
if stat :else :newlog+=asss+" OK" :sent+=1 :Continuousfailure=0
gosub *ADD_LOG
redraw 0;チラツキ防止
color 0,0,0:pos 0,0:boxf;背景
gosub *DISP_LOG ;※追加しました
pos 30,130 :color 255,255,255:mes " 成功数:"+sent
pos 30,150 :mes " 失敗数:"+failed
pos 30,170 :mes "連続失敗数:"+Continuousfailure
notesave "savefile.txt"
redraw 1
;wait 6000;(60秒)
;wait 1000;(10秒)
wait 100;(1秒)
;adr="192.168.0.125"
if AA<10000000000:goto *Aloop
stop
*ADD_LOG
notesel logbuf;p1で指定した変数をメモリノートパッド命令のバッファに設定される
noteadd newlog;変更しました。noteaddで行の追加ができます。
return
;※追加しました
*DISP_LOG
pos 30,200
color 0,255,0
notesel log
if notemax >= 20 : notedel 0
noteadd newlog
mes log
return
*kill
stop

| |
|
2014/10/26(Sun) 13:53:09|NO.65752
catsさん、とおりすがりさん
回答ありがとうございます。
結局のところ、notesaveを2つ用意して
出力した結果を毎回書き込むようにしました。
本当であれば一括して書き込めた方がDisk/IO処理的にいいのですが
仕事で使う関係上、途中でソフトが固まって結果が消えたら困るので
毎回書き込む仕様にしました。
回答頂いた方々、ありがとうございました。
|
|