HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
1023
foxtailnotesaveの動作について9解決


foxtail

リンク

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



この記事に返信する


Ruby(旧さっくん)

リンク

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行超えていたら行を削除する。になってんじゃないでしょうか?



foxtail

リンク

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行を表示するように別々に作らないと
あかんと思います。



cats

リンク

2014/10/23(Thu) 23:06:25|NO.65681

インターネットから少しずつ情報を得てそれを順番にバイナリファイルに保存します。
後で読み出すときは必要な部分だけを変数に受け渡します。
bsave, bload系ではインデックスやサイズが指定できるので大量のデータを
扱うときには非常に便利です。
これにより256バイトの変数でもファイルへ全てのデータを書き込めますし、
読み出すときも必要な文だけ順番に読みだして行けます。



foxtail

リンク

2014/10/23(Thu) 23:58:54|NO.65682

>>撃さん
成程。確かに分けて作る必要があるかもしれません。
ただ、作りたくてもどのように作ればいいのかがイマイチぴんと来ておらず…。
非表示の別ウィンドウで淡々と文字を出力させてそれを適時noresaveさせれば
良いのでしょうか?
※サンプルコードとかあれば助かるのですが…。

>>catsさん
少しずつ書き足し保存とテキスト再読み込みで
変更を加えていく風な形ということでしょうか?

処理的には
sockopenの結果を出力
⊇侘老覯未鬟Εンドウ上で表示(最新の結果を20項目まで)
テキストに保存
なので、テキストにずっと書き足していくイメージにしていけば
メモリ上での消費も少なくなるのかなと思っているのですが…。
※ただ、こちらもどのようなコードを書けばできるのか
 いまいちわかっていないですが…。



cats

リンク

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



foxtail

リンク

2014/10/26(Sun) 13:53:09|NO.65752

catsさん、とおりすがりさん
回答ありがとうございます。

結局のところ、notesaveを2つ用意して
出力した結果を毎回書き込むようにしました。
本当であれば一括して書き込めた方がDisk/IO処理的にいいのですが
仕事で使う関係上、途中でソフトが固まって結果が消えたら困るので
毎回書き込む仕様にしました。

回答頂いた方々、ありがとうございました。



ONION software Copyright 1997-2021(c) All rights reserved.