水曜日はユイデバッグの日
どうもシュクレールです。
クロシェーット!!
昨日忘れてた。
というわけで昨日の話の続きっていう感じ。
function event::onChannetText(prefix,channel,text){
setInterval(test,30000)
setinterval(test,50000)
}
function test(){
log("testpointA");
}
イベントトリガはONLoadでもonchanneltextでもどっちでもいいんすけど。
で、タイマーが1つしかなくてあとからのが上書きされるなら
5秒ごとにコンソールにログが吐き出されます。
最初のが有効なら3秒
タイマーが2つあってどっちもゆうこうになるなら
3,5,6,9,10,12,15・・・ってかんじになる。
2つあったばあい、そうなると、intervalで呼び出した崎の関数内にsetintervalを書きこむと多重かかって恐ろしいことに・・・。
でもってlogファイルについててきな。
まず書きこみ動作から
とりあえずグローバル変数の宣言。
var timelog = 'ファイルへの絶対パス';
function tracer(){
var tracerday = new Date();
var tracermin = tracerday.getMinutes();
var objFileSys = new ActiveXObject("Scripting.FileSystemObject");
var objOutFile = objFileSys.OpenTextFile(timelog, 2);
objOutFile.WriteLine(tracermin);
objOutFile.Close();
objFileSys = null;
objOutFile = null;
}
でもって、ユイの通常タスクの最後に
tracer()関数に飛ばせばOK
で、ログ抜けを監視するスクリプト
起動時に02秒を取得するスクリプトがあるんですがー
setTimeout(sysmes,next-now)
※つまりメインタスクの起動を02秒に行うってこと
ここでついでに、
setTimeout(kansi,next-now+13000)
って宣言しとけば、15秒の時に監視機能が働くはずです。
で、時間補正を行ったらあとは定時通りに回るだけ!!
function kansi(){
setinterval(maintask,60000)
}
function maintask(){
var file = OpenFile(timelog);
var s = file.readLine();
var day = new Date();
var min = day.getMinutes();
if(min != s){
send(channel,"データ抜けしてそうだぬ?"):
}else{
//log("OK");
}
}
ってかんじかなぁー
readlineはどうせ分の数字が1つはいってるだけだから全部読む必要はないだろうなといういめーじ。
これで動かんなら素直にwhile使うわ。
で、肝心要のlogファイルは
Limechatのfileフォルダに
time.log
とかいうテキストファイル(UTF-8)をおいとけばいいのだよ
まぁ、初期化の時にファイルチェック掛ける必要があるけどね・・・。
ふぅ。
どうもシュクレールです。
クロシェーット!!
昨日忘れてた。
というわけで昨日の話の続きっていう感じ。
function event::onChannetText(prefix,channel,text){
setInterval(test,30000)
setinterval(test,50000)
}
function test(){
log("testpointA");
}
イベントトリガはONLoadでもonchanneltextでもどっちでもいいんすけど。
で、タイマーが1つしかなくてあとからのが上書きされるなら
5秒ごとにコンソールにログが吐き出されます。
最初のが有効なら3秒
タイマーが2つあってどっちもゆうこうになるなら
3,5,6,9,10,12,15・・・ってかんじになる。
2つあったばあい、そうなると、intervalで呼び出した崎の関数内にsetintervalを書きこむと多重かかって恐ろしいことに・・・。
でもってlogファイルについててきな。
まず書きこみ動作から
とりあえずグローバル変数の宣言。
var timelog = 'ファイルへの絶対パス';
function tracer(){
var tracerday = new Date();
var tracermin = tracerday.getMinutes();
var objFileSys = new ActiveXObject("Scripting.FileSystemObject");
var objOutFile = objFileSys.OpenTextFile(timelog, 2);
objOutFile.WriteLine(tracermin);
objOutFile.Close();
objFileSys = null;
objOutFile = null;
}
でもって、ユイの通常タスクの最後に
tracer()関数に飛ばせばOK
で、ログ抜けを監視するスクリプト
起動時に02秒を取得するスクリプトがあるんですがー
setTimeout(sysmes,next-now)
※つまりメインタスクの起動を02秒に行うってこと
ここでついでに、
setTimeout(kansi,next-now+13000)
って宣言しとけば、15秒の時に監視機能が働くはずです。
で、時間補正を行ったらあとは定時通りに回るだけ!!
function kansi(){
setinterval(maintask,60000)
}
function maintask(){
var file = OpenFile(timelog);
var s = file.readLine();
var day = new Date();
var min = day.getMinutes();
if(min != s){
send(channel,"データ抜けしてそうだぬ?"):
}else{
//log("OK");
}
}
ってかんじかなぁー
readlineはどうせ分の数字が1つはいってるだけだから全部読む必要はないだろうなといういめーじ。
これで動かんなら素直にwhile使うわ。
で、肝心要のlogファイルは
Limechatのfileフォルダに
time.log
とかいうテキストファイル(UTF-8)をおいとけばいいのだよ
まぁ、初期化の時にファイルチェック掛ける必要があるけどね・・・。
ふぅ。
PR
きのうの誤字がすごかった
どうもシュクレールです。
えーっとcnannelのnが1つ多くてそもそもおかしいってのがありましたので。
function event::onChannetText(prefix,channel,text){
if(channel.match(/^#roomA$/)){
send(roomB,prefix.nick+" "+text);
}
if(channel.match(/^#roomB$/)){
send(roomA,prefix.nick+" "+text);
}
}
やまびこすくりぷと。
たぶんこれで動きますね。
でもって本題
同盟狩りの裏でスクリプトを弄ってました。
まずは機能の宿題事項であったタイムアウト動作時のsetinterval()について次のようなスクリプトを組みました。
function event::onLoad(){
setInterval(overflow,10000)
}
function overflow(){
log("testpointA");
for(var i=1;i>0;i++){
}
}
これをついでなのでやまびこに追記することに。
*PCの動作がタイムアウトまでの5秒止まりますのでご注意を(Limechat)
内容的には10秒ごとにoverflow関数を呼び出して、無限ループで5秒でLimechatのランニング限界なのでタイムアウトさせます。
でさらに5秒後に再度呼ばれるので無限にこの無駄なスクリプトが走ります。
あれ、flowってこっちのでいいんだっけ?
ま、いいか。
プログラム的には文字列があってればおk。
スクリプトコンソールには
testpointA
・・・タムアウト
testpointA
・・・タイムアウト
testpointA
・・・タイムアウト
ってのがずっと続きます。
・・・・
・・・
・・
・
ってことで、意図したとおりに動いてくれましたね。
タイムアウトしてもsetintervalは生きたままなので、再度関数がコールされるようです。
ちなみにこの処理中にやまびこスクリプトの方も動かして見ましたが、チャント動きました。
ってことで、ユイに還元しようって感じです。
現状は
functionA()
処理
settimeout(functionA,60000)
ッテ感じで最後にsettimeoutを使っていたのですが、
今度からはsetintervalでいいんじゃないかなとかおもった。
あ、60000は実際は丸めてから変数で入れてますよ。
けど、あれ?
単に置き換えると、関数内部でその関数をセットすると、合わせ鏡のように何重にもよぶことになるのか・・・?あるいはタイマーがあって上書きされるのか??
ってことで、コール間隔の違うやつでおなじ関数を呼んでみれば、先なのかあとなのか、もしくは2つのタイマーでよばれるのかどっちが優先度高いのかがわかりますね。
まぁ、何重にもコールするようなら、
処理の前にsettimeout宣言しとけば、処理でタイムアウトしても問題ないかなとは思ったり。
宿題事項
でもって、やっぱデータ落ちの時の警告が必要かなーとも思ってます。
setintervalで監視用の関数1個つくろうかなとか。
作業用エクセルに書きこむときに前回書き込み時間を見て、+1分以上だったら「データ抜けしてるんじゃない?」と警告するといいような気もする。
でも、今はログファイルの「更新日時」をつかって書き込んでいるので、古いsavechatlogの時刻を書き込んじゃったりするとめんどくせーので回避処理をつくってあげる必要性が発生する。
もしくは、メイン処理の一番最後に、処理が終わったらという意味で最終書き込み時間を作業用エクセルのどっかの1セルつかって書いてあげてもいいなとか思う。
けど、エクセル立ち上がってなかったらどうすんのさ!って問題と
書き込み処理以外の(非GV時間)ときはタイムアウトしないとおもってんの?(恐らくしませんが)
っていういみで、やっぱ「すべての」処理ルートの最後に入れるべきかなと思うと、それはもう手は2つしか考えられません
・logファイルを1つつくってそこに書きこむようにする。
・監視用chに処理最後にキーワード(現在時刻から"分")を発言して、別functionでそのキーワードを解析する
前者は、
PID制御と同じっすね。やり方は後者のと同じっす。ただ作業領域がlogファイルかchかってことだけ。
後者は、
ユイが02秒時にうごくので(分切り替わりの境界線である00はこわいのでマージン儲けてる)、まぁ10秒とか15秒のときに、chの発言から抽出して、「同じ"分"」でなかったらデータ抜けがあるんでないの?ってことで。
あれ、でもlimechat的に発言時のイベントはトリガーにできても、あとから発言を探るってできたんだっけ・・・?
limechatのログファイル見に行くのは非効率だな。設定してあげないといけないし。ファイル名の形式がカスタムできるから探すのたるいし。
かといって発言をトリガにすると、そもそもタイムアウトしたときに動いて欲しいんだから本末転倒と言うか。
ってーともうlogファイルしかねーっすねー。
'`,、('∀`) '`,、
あれこれやりたいことが次々湧いてくるのはいいことだ。
スパゲッティ化は、趣味プログラムなので(゚ε゚)キニシナイ!!
あ、あとログアウトきのうがほしいなー。
完全にしゅみだけどー。
自分以外の人間がログアウトコマンドしても
「わたしをログアウトさせれるのはマスターだけですぅ><」
ってかえす。
あほくさwwwww
wwwwwwwwww
勘違いしたSの人間が出てきそうだ。
まぁ、Limechatはマクロ停止がスクリプトで書けるので、
つくりますがね!!
どうもシュクレールです。
えーっとcnannelのnが1つ多くてそもそもおかしいってのがありましたので。
function event::onChannetText(prefix,channel,text){
if(channel.match(/^#roomA$/)){
send(roomB,prefix.nick+" "+text);
}
if(channel.match(/^#roomB$/)){
send(roomA,prefix.nick+" "+text);
}
}
やまびこすくりぷと。
たぶんこれで動きますね。
でもって本題
同盟狩りの裏でスクリプトを弄ってました。
まずは機能の宿題事項であったタイムアウト動作時のsetinterval()について次のようなスクリプトを組みました。
function event::onLoad(){
setInterval(overflow,10000)
}
function overflow(){
log("testpointA");
for(var i=1;i>0;i++){
}
}
これをついでなのでやまびこに追記することに。
*PCの動作がタイムアウトまでの5秒止まりますのでご注意を(Limechat)
内容的には10秒ごとにoverflow関数を呼び出して、無限ループで5秒でLimechatのランニング限界なのでタイムアウトさせます。
でさらに5秒後に再度呼ばれるので無限にこの無駄なスクリプトが走ります。
あれ、flowってこっちのでいいんだっけ?
ま、いいか。
プログラム的には文字列があってればおk。
スクリプトコンソールには
testpointA
・・・タムアウト
testpointA
・・・タイムアウト
testpointA
・・・タイムアウト
ってのがずっと続きます。
・・・・
・・・
・・
・
ってことで、意図したとおりに動いてくれましたね。
タイムアウトしてもsetintervalは生きたままなので、再度関数がコールされるようです。
ちなみにこの処理中にやまびこスクリプトの方も動かして見ましたが、チャント動きました。
ってことで、ユイに還元しようって感じです。
現状は
functionA()
処理
settimeout(functionA,60000)
ッテ感じで最後にsettimeoutを使っていたのですが、
今度からはsetintervalでいいんじゃないかなとかおもった。
あ、60000は実際は丸めてから変数で入れてますよ。
けど、あれ?
単に置き換えると、関数内部でその関数をセットすると、合わせ鏡のように何重にもよぶことになるのか・・・?あるいはタイマーがあって上書きされるのか??
ってことで、コール間隔の違うやつでおなじ関数を呼んでみれば、先なのかあとなのか、もしくは2つのタイマーでよばれるのかどっちが優先度高いのかがわかりますね。
まぁ、何重にもコールするようなら、
処理の前にsettimeout宣言しとけば、処理でタイムアウトしても問題ないかなとは思ったり。
宿題事項
でもって、やっぱデータ落ちの時の警告が必要かなーとも思ってます。
setintervalで監視用の関数1個つくろうかなとか。
作業用エクセルに書きこむときに前回書き込み時間を見て、+1分以上だったら「データ抜けしてるんじゃない?」と警告するといいような気もする。
でも、今はログファイルの「更新日時」をつかって書き込んでいるので、古いsavechatlogの時刻を書き込んじゃったりするとめんどくせーので回避処理をつくってあげる必要性が発生する。
もしくは、メイン処理の一番最後に、処理が終わったらという意味で最終書き込み時間を作業用エクセルのどっかの1セルつかって書いてあげてもいいなとか思う。
けど、エクセル立ち上がってなかったらどうすんのさ!って問題と
書き込み処理以外の(非GV時間)ときはタイムアウトしないとおもってんの?(恐らくしませんが)
っていういみで、やっぱ「すべての」処理ルートの最後に入れるべきかなと思うと、それはもう手は2つしか考えられません
・logファイルを1つつくってそこに書きこむようにする。
・監視用chに処理最後にキーワード(現在時刻から"分")を発言して、別functionでそのキーワードを解析する
前者は、
PID制御と同じっすね。やり方は後者のと同じっす。ただ作業領域がlogファイルかchかってことだけ。
後者は、
ユイが02秒時にうごくので(分切り替わりの境界線である00はこわいのでマージン儲けてる)、まぁ10秒とか15秒のときに、chの発言から抽出して、「同じ"分"」でなかったらデータ抜けがあるんでないの?ってことで。
あれ、でもlimechat的に発言時のイベントはトリガーにできても、あとから発言を探るってできたんだっけ・・・?
limechatのログファイル見に行くのは非効率だな。設定してあげないといけないし。ファイル名の形式がカスタムできるから探すのたるいし。
かといって発言をトリガにすると、そもそもタイムアウトしたときに動いて欲しいんだから本末転倒と言うか。
ってーともうlogファイルしかねーっすねー。
'`,、('∀`) '`,、
あれこれやりたいことが次々湧いてくるのはいいことだ。
スパゲッティ化は、趣味プログラムなので(゚ε゚)キニシナイ!!
あ、あとログアウトきのうがほしいなー。
完全にしゅみだけどー。
自分以外の人間がログアウトコマンドしても
「わたしをログアウトさせれるのはマスターだけですぅ><」
ってかえす。
あほくさwwwww
wwwwwwwwww
勘違いしたSの人間が出てきそうだ。
まぁ、Limechatはマクロ停止がスクリプトで書けるので、
つくりますがね!!
とんでもねぇバグがいたもんだ
どうもシュクレールです。
アウトプットの機能としては現在3つの機能があります。
1.注目ギルトおよび自ギルドの落城監視(1分サイクル)
2.注目ギルドの現在の取得砦のリストアップ(コマンド)
3.不落砦のリストアップ(コマンド)New!!
前回のバグ修正でnull抜けしたときにカウンタを1つ戻すっていうのをやったのですが、
まずこれが悪さをした。
簡略しますが以下のようなテーブルの時に
最新取得ギルドと時刻を得る関数を回したときに、
V1についてはギルド=null、時刻=8:02:00がはいるのですが
V2についてギルド=A、時刻=8:03:00がはいってしまっているのです。
ようは、全部に対して時刻カウンタを1つ戻してしまっていたんスね。
これについては、null抜けした時だけカウンタを1つ戻すという処理で解決
無事に解決。
で、問題は機能2と3の方
双方とも「書き込み済み」のエクセルに対して読みだす処理を行います。
まっさらな何もデータのないエクセルに対して読み込みを掛けたときには回避行動が取れるようにプログラムしています。
具体的には、時刻セルを覗いてnullの場合には「これデータ無いよ」って返します。
が、
以下のような状況が起こりうるのです
例えばGV前の19時58分とかにモニタ機能をONにしてデータ収拾に備えます。
2PC目も立てて、savechatログがALT+番号に登録されているのを実際にセーブしてみて確認してみます。
で、まっさらなエクセルに対してモニタ機能の命令にしたがって、その最新のsavechatログファイルを読み込んで書きこもうとします。
しかし、当然ながら砦の情報は含まれていないログファイルなので、V1~N5までのすべての砦にはnullが書きこまれ、時刻19:58:00が時刻セルに書きこまれます。
すると読み込み処理の中で次のようなことが起こります。
時刻セルにはデータが書き込まれているので「何かしらデータは入っているな」と判断し、処理をそのまま進めます。
そのなかで当然null抜けするのですが、この時のカウンタの戻り値を間違って2にしていたので1行目のtimeという文字列をいれてしまっていたので、処理でやっぱり躓いたってのがありました。
まぁ、バグ処理がうまく行ってなかったってのもあるんですけどね。
これ以降はカウンタ戻しても時刻が入っているので正常に処理が行われるので、本当にこの時刻が1つはいっている状態でnull抜けすると陥るという局所的なバグでした。
あと細かいバグを処理
・機能2、3のときにエクセルチェック行なっているんですが、そこでエクセルが立ち上がっていないときにエラー処理を行なっているんですが、それでも不落砦と注目ギルドの処理に入ってしまうってのがあったので、フラグ立てて、エラー処理が実行されたときは処理に入らないようにしました。
・機能2、3のときにデータがないときもエラーを出すようにしているんですが、結局処理に入ってしまうので、同じようにフラグを立てて処理に入らないようにしました。
というわけで新しく実装した「不落砦のリストアップ」機能についてすこし。
いつだかの記事で結構処理がメンドクサイって書きましたが、思ったよりは楽に出来ました。
(バグ取りと被ったのでなんか一瞬迷路に入り込みましたが・・・)
機能1~3はすべて通常処理関数をつくってそれを用いています。
その関数で以下のような情報が返ってきます。
outputarray[30]:全砦の現在の城主(null抜けした際はNO_INFOが返ってくる)
timearray[30]:現在の城主が落城させた時刻(24h表記)
disptime[30]:現在の城主が落城させた時刻と現在の時刻の差(分表記)
flagnavi[30]:最新ログで自ギルドが落城させたらフラグが立つ
checktarget[30]:最新ログで注目ギルドが落城させたらフラグが立つ
機能1については、flagnaviとchecktargetのフラグを見て、配列の番号が0ならV1、1ならV2と言った風に読み替えてsendでチャンネルに送信しています。
機能2についてはoutputarrayと注目ギルドをifで比較して、trueなら、同じく配列の番号から読み替えてsendでチャンネルに送信しています。あわせてdisptimeもくっつけることによって、何分前にその砦を取得したのかも表示させています。
機能3については
8時2分から何分経過しているのかをまず取得します。
それとdisptimeを比較して、disptimeが大きい場合に、不落と判断します。
(SEが開始から2分で落ちないという信頼のもとの機能)
この機能を使うために以下の制限を設けました。
outputarrayにNO_INFOがあった場合は開始時の一斉ログが取得出来なかったと判断しこの機能は使えませんと警告。
また、8時2分からの経過値がマイナス(つまり8時2分より前でこの機能をコールした場合)のときに同じくこの機能はまだ使えませんと警告。
おそらくこれで行数を削減できたと思われます。
バグ取りに追われて、20時頃からこの機能をつくり始めたのに、終わったのが23時。
ニーズヘッグに行かなきゃと思いながらも眠すぎて仮眠してそのまま。
いやまぁ仮眠で済むとは思ってなかったのですけどね。
今夜ニーズヘッグに行って、週末はGv後の24時頃に行くハメになるかなぁ・・・。
あ、私的メモ
クロシェットの通販が20日から受注開始だとおもったので忘れないように。
コミケで諦めた分です。
まぁ、これがあるから諦めたんですけどね。
どうもシュクレールです。
アウトプットの機能としては現在3つの機能があります。
1.注目ギルトおよび自ギルドの落城監視(1分サイクル)
2.注目ギルドの現在の取得砦のリストアップ(コマンド)
3.不落砦のリストアップ(コマンド)New!!
前回のバグ修正でnull抜けしたときにカウンタを1つ戻すっていうのをやったのですが、
まずこれが悪さをした。
簡略しますが以下のようなテーブルの時に
time | V1 | V2 |
8:03:00 |   | |
8:02:00 | A |
最新取得ギルドと時刻を得る関数を回したときに、
V1についてはギルド=null、時刻=8:02:00がはいるのですが
V2についてギルド=A、時刻=8:03:00がはいってしまっているのです。
ようは、全部に対して時刻カウンタを1つ戻してしまっていたんスね。
これについては、null抜けした時だけカウンタを1つ戻すという処理で解決
無事に解決。
で、問題は機能2と3の方
双方とも「書き込み済み」のエクセルに対して読みだす処理を行います。
まっさらな何もデータのないエクセルに対して読み込みを掛けたときには回避行動が取れるようにプログラムしています。
具体的には、時刻セルを覗いてnullの場合には「これデータ無いよ」って返します。
が、
以下のような状況が起こりうるのです
time | V1 | V2 |
19:58:00 |   | |
例えばGV前の19時58分とかにモニタ機能をONにしてデータ収拾に備えます。
2PC目も立てて、savechatログがALT+番号に登録されているのを実際にセーブしてみて確認してみます。
で、まっさらなエクセルに対してモニタ機能の命令にしたがって、その最新のsavechatログファイルを読み込んで書きこもうとします。
しかし、当然ながら砦の情報は含まれていないログファイルなので、V1~N5までのすべての砦にはnullが書きこまれ、時刻19:58:00が時刻セルに書きこまれます。
すると読み込み処理の中で次のようなことが起こります。
時刻セルにはデータが書き込まれているので「何かしらデータは入っているな」と判断し、処理をそのまま進めます。
そのなかで当然null抜けするのですが、この時のカウンタの戻り値を間違って2にしていたので1行目のtimeという文字列をいれてしまっていたので、処理でやっぱり躓いたってのがありました。
まぁ、バグ処理がうまく行ってなかったってのもあるんですけどね。
これ以降はカウンタ戻しても時刻が入っているので正常に処理が行われるので、本当にこの時刻が1つはいっている状態でnull抜けすると陥るという局所的なバグでした。
あと細かいバグを処理
・機能2、3のときにエクセルチェック行なっているんですが、そこでエクセルが立ち上がっていないときにエラー処理を行なっているんですが、それでも不落砦と注目ギルドの処理に入ってしまうってのがあったので、フラグ立てて、エラー処理が実行されたときは処理に入らないようにしました。
・機能2、3のときにデータがないときもエラーを出すようにしているんですが、結局処理に入ってしまうので、同じようにフラグを立てて処理に入らないようにしました。
というわけで新しく実装した「不落砦のリストアップ」機能についてすこし。
いつだかの記事で結構処理がメンドクサイって書きましたが、思ったよりは楽に出来ました。
(バグ取りと被ったのでなんか一瞬迷路に入り込みましたが・・・)
機能1~3はすべて通常処理関数をつくってそれを用いています。
その関数で以下のような情報が返ってきます。
outputarray[30]:全砦の現在の城主(null抜けした際はNO_INFOが返ってくる)
timearray[30]:現在の城主が落城させた時刻(24h表記)
disptime[30]:現在の城主が落城させた時刻と現在の時刻の差(分表記)
flagnavi[30]:最新ログで自ギルドが落城させたらフラグが立つ
checktarget[30]:最新ログで注目ギルドが落城させたらフラグが立つ
機能1については、flagnaviとchecktargetのフラグを見て、配列の番号が0ならV1、1ならV2と言った風に読み替えてsendでチャンネルに送信しています。
機能2についてはoutputarrayと注目ギルドをifで比較して、trueなら、同じく配列の番号から読み替えてsendでチャンネルに送信しています。あわせてdisptimeもくっつけることによって、何分前にその砦を取得したのかも表示させています。
機能3については
8時2分から何分経過しているのかをまず取得します。
それとdisptimeを比較して、disptimeが大きい場合に、不落と判断します。
(SEが開始から2分で落ちないという信頼のもとの機能)
この機能を使うために以下の制限を設けました。
outputarrayにNO_INFOがあった場合は開始時の一斉ログが取得出来なかったと判断しこの機能は使えませんと警告。
また、8時2分からの経過値がマイナス(つまり8時2分より前でこの機能をコールした場合)のときに同じくこの機能はまだ使えませんと警告。
おそらくこれで行数を削減できたと思われます。
バグ取りに追われて、20時頃からこの機能をつくり始めたのに、終わったのが23時。
ニーズヘッグに行かなきゃと思いながらも眠すぎて仮眠してそのまま。
いやまぁ仮眠で済むとは思ってなかったのですけどね。
今夜ニーズヘッグに行って、週末はGv後の24時頃に行くハメになるかなぁ・・・。
あ、私的メモ
クロシェットの通販が20日から受注開始だとおもったので忘れないように。
コミケで諦めた分です。
まぁ、これがあるから諦めたんですけどね。
やっぱり実際に動かすと色々出てくるなぁという
どうもシュクレールです。
最近はユイちゃんのおかげでネタが切れにくいです。
といっても休日は基本書かない主義なので、
しばらくぶりのブログ更新になります。
バグの内容ですが、
マスターPC(つまり自分)に作業用エクセルが立ち上がってないときに、モニタ機能がコールされると、エラーを吐く。のは意図した動作なのですが、その過程でポップアップ警告を出すように組んでるせいで、そのポップアップに対して[OK]ボタンを5秒以内に押さないと、Limechatのスクリプトランニング制限である5秒に引っかかって、強制的にタイムアウトさせられて動作が止まる。というのがありました。
うん、ながくて何言ってるかは伝わらなそうだ。
友達の友達の友達から聞いた話なんだけど―。
みたいな。
ようは、Limechatにはもともとスクリプトの走る秒数に制限を設けていて、ユーザーコールを求めるようなプログラムを書くと、それに引っかかってしまう。ということです。
なので、このバグについてはポップアップをやめて、chに直接警告を吐き出し、何度もエラーが呼ばれないようにモニタ機能を自動でオフにする。という対応にしました。
つぎに、作業エクセルに書きこむときの城主チェックでエラー。
発生条件:2回目の書き込み以降で、前回城主チェックを掛けたときにこれが空欄のときに書きこもうとすると起こる。プログラムがタイムアウトして止まる。
つまり、8時丁度の一斉ログが取得できない。もしくは、スタンバイで8時前にモニタ機能をONにしておくと発生する。
この機能は2PC目のsavechatログファイルから城主を抜き出して、作業用エクセルに書き込むものなのですが、書きこむときに、城主が前回書き込み時から変わっていない場合には空欄のままにして書き込まないというようにしています。
つまり、
すべての砦の「現在の城主」と「ログファイルから取得した最新城主」これを比較して、同じなら書きこまないよ。っていうふうにしています。
この過程で、do~whileを使っています。
こんな感じに書いてます
こういうテーブルで、V1みたいにギルド情報がひとつもない場合に前回城主のサーチをするとエラーになります。
それはなぜかというと、 スクリプトの一部ですが
var j=0;
do{
変数①=エクセルの(j+2)行i列の値;
変数②=エクセルの(j+2)行1列の値;
j++;
}while(変数①=null && 変数② !=null);
動作としては、変数①にまず2行1列(V1の8:03:00)の城主(この場合はnull)を入れます。
次に、変数②にそのときの時間(8:03:00)をいれます。
でもってjカウンタを1加算。
ループ条件は
変数がnullでありしかも、変数②がnullじゃない間は回ってろです。
つまり、城主がブランクで時間が何かしら入っている間は回ってろです。
城主を見つけた時はそこでストップ
時間がnullになる。つまりもう最終行ですよってときにも止めます。
で、その城主と時刻の値を後々の比較処理に使います
iについては2のときV1、3のときV2ってかんじに事前に宣言して、このdo~whileを内包する形でfor文で使っています。
つまり、do~whileでV1の城主探し終わったらiを1加算して、つぎはV2についてdo~whileで城主を探す。・・・・・で、すべての砦について行うって感じです。
うん、すごくわかりにくい説明。
まぁ、おいといて。
この何が問題かって言うと、do~whileのループの抜け方です。
城主を見つけて抜けたときはいいのですが、V1みたいに城主がない状態で時間がnullで抜けた場合に 、
数行前ですが、「その城主と時刻の値を後々の比較処理に使います」と書きました。
そうです、nullがはいったまま後処理を行なっていたのです。
つまり、時刻が入っているとして行なっている処理にnullを適応するので、なんかおかしーよ。
と怒られていたわけです。
ので、時刻のnull抜けした場合には、1行戻ったところ(jカウンタから-1する)の値をとらないとおかしくなるってことでした。
まぁ、do~whileはforと違ってループチェックが一番最後だからこうなってしまったんですね・・・。
あれ、バグ直したつもりでいたけど、これ通常抜けに影響及ぼさないように書いてるよね・・・?
と私的メモを残しておわり。
どうもシュクレールです。
最近はユイちゃんのおかげでネタが切れにくいです。
といっても休日は基本書かない主義なので、
しばらくぶりのブログ更新になります。
バグの内容ですが、
マスターPC(つまり自分)に作業用エクセルが立ち上がってないときに、モニタ機能がコールされると、エラーを吐く。のは意図した動作なのですが、その過程でポップアップ警告を出すように組んでるせいで、そのポップアップに対して[OK]ボタンを5秒以内に押さないと、Limechatのスクリプトランニング制限である5秒に引っかかって、強制的にタイムアウトさせられて動作が止まる。というのがありました。
うん、ながくて何言ってるかは伝わらなそうだ。
友達の友達の友達から聞いた話なんだけど―。
みたいな。
ようは、Limechatにはもともとスクリプトの走る秒数に制限を設けていて、ユーザーコールを求めるようなプログラムを書くと、それに引っかかってしまう。ということです。
なので、このバグについてはポップアップをやめて、chに直接警告を吐き出し、何度もエラーが呼ばれないようにモニタ機能を自動でオフにする。という対応にしました。
つぎに、作業エクセルに書きこむときの城主チェックでエラー。
発生条件:2回目の書き込み以降で、前回城主チェックを掛けたときにこれが空欄のときに書きこもうとすると起こる。プログラムがタイムアウトして止まる。
つまり、8時丁度の一斉ログが取得できない。もしくは、スタンバイで8時前にモニタ機能をONにしておくと発生する。
この機能は2PC目のsavechatログファイルから城主を抜き出して、作業用エクセルに書き込むものなのですが、書きこむときに、城主が前回書き込み時から変わっていない場合には空欄のままにして書き込まないというようにしています。
つまり、
すべての砦の「現在の城主」と「ログファイルから取得した最新城主」これを比較して、同じなら書きこまないよ。っていうふうにしています。
この過程で、do~whileを使っています。
こんな感じに書いてます
time | V1 | V2 | V3 | V4 |
8:03:00 | ||||
8:02:00 | ||||
8:01:00 | ||||
8:00:00 | ギルドA | ギルドB | ギルドC |
こういうテーブルで、V1みたいにギルド情報がひとつもない場合に前回城主のサーチをするとエラーになります。
それはなぜかというと、 スクリプトの一部ですが
var j=0;
do{
変数①=エクセルの(j+2)行i列の値;
変数②=エクセルの(j+2)行1列の値;
j++;
}while(変数①=null && 変数② !=null);
動作としては、変数①にまず2行1列(V1の8:03:00)の城主(この場合はnull)を入れます。
次に、変数②にそのときの時間(8:03:00)をいれます。
でもってjカウンタを1加算。
ループ条件は
変数がnullでありしかも、変数②がnullじゃない間は回ってろです。
つまり、城主がブランクで時間が何かしら入っている間は回ってろです。
城主を見つけた時はそこでストップ
時間がnullになる。つまりもう最終行ですよってときにも止めます。
で、その城主と時刻の値を後々の比較処理に使います
iについては2のときV1、3のときV2ってかんじに事前に宣言して、このdo~whileを内包する形でfor文で使っています。
つまり、do~whileでV1の城主探し終わったらiを1加算して、つぎはV2についてdo~whileで城主を探す。・・・・・で、すべての砦について行うって感じです。
うん、すごくわかりにくい説明。
まぁ、おいといて。
この何が問題かって言うと、do~whileのループの抜け方です。
城主を見つけて抜けたときはいいのですが、V1みたいに城主がない状態で時間がnullで抜けた場合に 、
数行前ですが、「その城主と時刻の値を後々の比較処理に使います」と書きました。
そうです、nullがはいったまま後処理を行なっていたのです。
つまり、時刻が入っているとして行なっている処理にnullを適応するので、なんかおかしーよ。
と怒られていたわけです。
ので、時刻のnull抜けした場合には、1行戻ったところ(jカウンタから-1する)の値をとらないとおかしくなるってことでした。
まぁ、do~whileはforと違ってループチェックが一番最後だからこうなってしまったんですね・・・。
あれ、バグ直したつもりでいたけど、これ通常抜けに影響及ぼさないように書いてるよね・・・?
と私的メモを残しておわり。
どうしてやすみすぐ逝ってしまうん
どうもシュクレールです。
(最後に書こうと思ったが文頭で言っときます。なんかわけわからん事やってる。と思っているでしょう!きっとソフトかじったことある人ならそこそこ面白いかな?とおもう今日の記事です。あしからず)
サポートツール開発が2倍のせいで進みません!
というか行き当たりばったりで作ってるので、そろそろ仕様をまとめておかないと頭がこんがらがる。
って前も煮たような記事書いた気もするけど、機能がはっきりしてきたので再度。
------------実装済み-------------------------------
◆基本動作
①定時アナウンス
19時台(集合開始/PTLからの集合状況報告を促す/セーブ確認)
20時台(開始/30分経過)
21時台(1時間経過/30分前/5分前)
などなど
②モニタ機能(ON/OFF切り替え可能)
いろんな制約(※1)を満たせるならば使える機能
予め設定した注目ギルドの陥落ログをIRCに報告
自ギルドが城主になったのを確認したらリンクフラッグをIRCに表示する。
※1 2PC目にて定期的に(理想は1分サイクル)savechatでログ取得が「手動で」できること
2PC目とメインPCがホームネットワークでつながっていること
◆コマンド動作
①リストアップ「注目ギルド」
モニタ機能がONの時、注目ギルドが現在取得している砦と陥落時間をすべてIRCに報告する
②モニタON[/OFF
モニタ機能をONとOFFに切り替える
③ヘルプ
ユイちゃんの使い方を表示する
------------未実装--------------------------------
①地域別取得ギルド一覧
N/F/V/L/C/B/FE/SE
などのくくりで取得ギルドの一覧表示
ぶっちゃけ使う?っておもってる。
機能の追加はすぐできるが、プログラムの行数がえらく増えるため実装検討中
②注目ギルドが城主のとき、陥落したらIRCに報告する
機能としているかなぁ?
実現方法はグローバルで配列宣言する
注目ギルドが取得した場合にフラグを立てて
ログチェック時にフラグチェックして、立ってたら報告とフラグリセット
そう難しくはないんだけどってところ。
③不陥砦の報告
今日まだ一回も落ちてない砦の報告
実は結構だるい。
最新取得ギルドがnullの場合に報告すればいいんだけど、
20時ピッタシの一斉ログがあるので、
20:02以降に落ちてない砦っていうふうにすると思う
2分以内に落ちた場合は・・・どうすんの?ッテ感じ。
2分では落ちないと信じたい。
まぁ主にSEで知りたい機能だから2分では落ちないと思うょ。
しかしながらsavechatのログ取得をこの2分間に一度行なっておかないと
時刻取得がsavechatファイルの作成日時なので、
2分以降にはじめて一斉ログを取得した場合に正常に動作しないっていう。
運用のバグが存在するハメになると思う。
確実に動かすなら、ファイルサーチ時に20:00~02分の間のファイルが存在するか。
もしくはすべての砦の更新情報がtrueの場合(一斉ログの判別)
これを除外してサーチするっていう感じになると思う。
うーんだるいし、プログラムが長くなると、それだけPCへの負荷とかが上がるので
考え中のこと。
制限付きなら結構楽に作れる。
もしくは書き込み用のエクセルを自分でみて判断するのがいいと思うんよね。
あるいは、一斉ログ(もしくは20:00~02分)がない場合には、
この機能は動作できませんと返すのがいいと思う。
④トピック書き換え機能
いる?っておもってる。
最初はリンクフラッグをトピックに書きこむって考えてたけど
アナウンスでいいやんっておもってる。
実現はすぐできる
⑤おはなし機能
個人的には作りこみたいなぁとおもうが
ウザイだけですよねん。ってことでおそらくこのまま没る。
⑥ROのGチャットへ転送(復唱)
特定のキーワードを含んだIRCの発言をGチャットで復唱。
規約と技術的にムリなので没。
------------------ユーザー設定部分-----------------------
①チャンネル設定
発言先のチャンネル
②注目ギルドの登録
一字一句正確に
③自ギルドの登録
一字一句正確に
④2PC目のROインストールフォルダへのネットワークパス
これがないとモニタ機能使えない
⑤マウントドライブの名称
デフォはZ:
個人PCでこの名前のマウントはないっしょ・・・。
まぁ、自分はないし。
⑥自および注目ギルドサーチのスクリプト追加
デフォはそれぞれ1つなので、2つ以上のサーチをしたい場合は
実作業部分(IF文)を3行追加する必要がある。
まぁコピペで済むんですがね。
--------------スクリプト主のコマンド--------------------
①FC:作業用エクセルの立ち上げとPID取得
これやっとかないとモニタ機能が使えない。
FAIRYCIRCLEの略
②CLEAR:作業用エクセルのクリア
実は未完成。
手動で消せばいいやん。状態
---------公開および配布に関する考え方------------------------
ソースの公開は可能だが配布はしない予定
理由は以下のとおり
①ユーザー設定が複雑でありPCとプログラムの知識をもってないとおそらくできない。
また、初心者向けにそれをサポートする気もない。
②2PC目が必要な上にネットワークの構築と手動でログ取得をしなくてはならないので、おおきくそのひとのPC数環境等に依存するため。またログの自動取得については規約的に自動化はしない、または技術的に私ができません。とういういみで使い勝手が非常に悪いため。
③エクセル周りはエラー警告を念密にやっていますが、ユーザー設定が不正の場合のエラー発生に対する警告が出来上がっていないし作る気もない。自分のPCおよびファイル構成にて問題なく動くという信頼のもとエラー処理を書かずにプログラムを作っている。つまり自分のPCにカスタマイズされすぎている。
④コマンドが自分のやりやすい単語になっているため
⑤自鯖の他の同盟に使われると困るなー
-------------------------------
特に③のエラー発生時に何が起こるか分からないのが一番大きい。自分のPCではエラーは潰して、そのエラーについては「このPCでは発生しない」ということになっているので、配布した場合にどうなるかは保証ができないのです。また、趣味のプログラムでそこまで作りこむ気も時間もないというのが実情。
あと⑤?w
クリエイターとしてこういうの作ったよ!
って発信したい気持ちは多分にあるのですけどね。
そういう意味で、フローチャートやjscriptのクラス・メソッド等の使い方、仕様の実現方法など、技術仕様書くらいはつくって公開するかもしれません。
時間があればな!!
ないけどー!!
まぁ、このブログが僻地にある以上はなんの問題もない、ただの自意識過剰なだけです。ってのはわかってますので。
CollectFort.jsはまだしも、WARGsについては結構な力作なのですよ。
まぁ、あれも力技ですけどね。
(/ω・\)チラッ
反響が何も無いのはクリエイターとして残念な一方。
このブログの客のいなさを再認識できるのです。
(まるでこのブログの人気があれば「すばらしいプログラムなので」いっぱい使ってもらえると思っているのかと小一時間)
Gvレポートも傭兵という立場上書けないので。(いまは昔ほど煩くないでしょうし同盟も許してくれると思いますが)
まぁ、メンドイよね。
ROに関する日記も少ないし、文字だけだし、私生活などごちゃまぜの日記だし。
誰ターゲットのブログだよっていう。
問題点わかりつつもメンドイの一言で賑わしいブログにするつもりはないのです。
(あれ、今日はS自虐だなぁ)
カウンター設置したらきっと挫けちゃうから設置しないのですまる
万が一結構人が着てたら逆に気負って書けなくなるのでこのままですまる
片手で収まる知り合いと、同盟の人がチラチラみてくれてるだけで十分ですの。
あ、ユイに追加したい機能あったら言って下さいネ。
どうもシュクレールです。
(最後に書こうと思ったが文頭で言っときます。なんかわけわからん事やってる。と思っているでしょう!きっとソフトかじったことある人ならそこそこ面白いかな?とおもう今日の記事です。あしからず)
サポートツール開発が2倍のせいで進みません!
というか行き当たりばったりで作ってるので、そろそろ仕様をまとめておかないと頭がこんがらがる。
って前も煮たような記事書いた気もするけど、機能がはっきりしてきたので再度。
------------実装済み-------------------------------
◆基本動作
①定時アナウンス
19時台(集合開始/PTLからの集合状況報告を促す/セーブ確認)
20時台(開始/30分経過)
21時台(1時間経過/30分前/5分前)
などなど
②モニタ機能(ON/OFF切り替え可能)
いろんな制約(※1)を満たせるならば使える機能
予め設定した注目ギルドの陥落ログをIRCに報告
自ギルドが城主になったのを確認したらリンクフラッグをIRCに表示する。
※1 2PC目にて定期的に(理想は1分サイクル)savechatでログ取得が「手動で」できること
2PC目とメインPCがホームネットワークでつながっていること
◆コマンド動作
①リストアップ「注目ギルド」
モニタ機能がONの時、注目ギルドが現在取得している砦と陥落時間をすべてIRCに報告する
②モニタON[/OFF
モニタ機能をONとOFFに切り替える
③ヘルプ
ユイちゃんの使い方を表示する
------------未実装--------------------------------
①地域別取得ギルド一覧
N/F/V/L/C/B/FE/SE
などのくくりで取得ギルドの一覧表示
ぶっちゃけ使う?っておもってる。
機能の追加はすぐできるが、プログラムの行数がえらく増えるため実装検討中
②注目ギルドが城主のとき、陥落したらIRCに報告する
機能としているかなぁ?
実現方法はグローバルで配列宣言する
注目ギルドが取得した場合にフラグを立てて
ログチェック時にフラグチェックして、立ってたら報告とフラグリセット
そう難しくはないんだけどってところ。
③不陥砦の報告
今日まだ一回も落ちてない砦の報告
実は結構だるい。
最新取得ギルドがnullの場合に報告すればいいんだけど、
20時ピッタシの一斉ログがあるので、
20:02以降に落ちてない砦っていうふうにすると思う
2分以内に落ちた場合は・・・どうすんの?ッテ感じ。
2分では落ちないと信じたい。
まぁ主にSEで知りたい機能だから2分では落ちないと思うょ。
しかしながらsavechatのログ取得をこの2分間に一度行なっておかないと
時刻取得がsavechatファイルの作成日時なので、
2分以降にはじめて一斉ログを取得した場合に正常に動作しないっていう。
運用のバグが存在するハメになると思う。
確実に動かすなら、ファイルサーチ時に20:00~02分の間のファイルが存在するか。
もしくはすべての砦の更新情報がtrueの場合(一斉ログの判別)
これを除外してサーチするっていう感じになると思う。
うーんだるいし、プログラムが長くなると、それだけPCへの負荷とかが上がるので
考え中のこと。
制限付きなら結構楽に作れる。
もしくは書き込み用のエクセルを自分でみて判断するのがいいと思うんよね。
あるいは、一斉ログ(もしくは20:00~02分)がない場合には、
この機能は動作できませんと返すのがいいと思う。
④トピック書き換え機能
いる?っておもってる。
最初はリンクフラッグをトピックに書きこむって考えてたけど
アナウンスでいいやんっておもってる。
実現はすぐできる
⑤おはなし機能
個人的には作りこみたいなぁとおもうが
ウザイだけですよねん。ってことでおそらくこのまま没る。
⑥ROのGチャットへ転送(復唱)
特定のキーワードを含んだIRCの発言をGチャットで復唱。
規約と技術的にムリなので没。
------------------ユーザー設定部分-----------------------
①チャンネル設定
発言先のチャンネル
②注目ギルドの登録
一字一句正確に
③自ギルドの登録
一字一句正確に
④2PC目のROインストールフォルダへのネットワークパス
これがないとモニタ機能使えない
⑤マウントドライブの名称
デフォはZ:
個人PCでこの名前のマウントはないっしょ・・・。
まぁ、自分はないし。
⑥自および注目ギルドサーチのスクリプト追加
デフォはそれぞれ1つなので、2つ以上のサーチをしたい場合は
実作業部分(IF文)を3行追加する必要がある。
まぁコピペで済むんですがね。
--------------スクリプト主のコマンド--------------------
①FC:作業用エクセルの立ち上げとPID取得
これやっとかないとモニタ機能が使えない。
FAIRYCIRCLEの略
②CLEAR:作業用エクセルのクリア
実は未完成。
手動で消せばいいやん。状態
---------公開および配布に関する考え方------------------------
ソースの公開は可能だが配布はしない予定
理由は以下のとおり
①ユーザー設定が複雑でありPCとプログラムの知識をもってないとおそらくできない。
また、初心者向けにそれをサポートする気もない。
②2PC目が必要な上にネットワークの構築と手動でログ取得をしなくてはならないので、おおきくそのひとのPC数環境等に依存するため。またログの自動取得については規約的に自動化はしない、または技術的に私ができません。とういういみで使い勝手が非常に悪いため。
③エクセル周りはエラー警告を念密にやっていますが、ユーザー設定が不正の場合のエラー発生に対する警告が出来上がっていないし作る気もない。自分のPCおよびファイル構成にて問題なく動くという信頼のもとエラー処理を書かずにプログラムを作っている。つまり自分のPCにカスタマイズされすぎている。
④コマンドが自分のやりやすい単語になっているため
⑤自鯖の他の同盟に使われると困るなー
-------------------------------
特に③のエラー発生時に何が起こるか分からないのが一番大きい。自分のPCではエラーは潰して、そのエラーについては「このPCでは発生しない」ということになっているので、配布した場合にどうなるかは保証ができないのです。また、趣味のプログラムでそこまで作りこむ気も時間もないというのが実情。
あと⑤?w
クリエイターとしてこういうの作ったよ!
って発信したい気持ちは多分にあるのですけどね。
そういう意味で、フローチャートやjscriptのクラス・メソッド等の使い方、仕様の実現方法など、技術仕様書くらいはつくって公開するかもしれません。
時間があればな!!
ないけどー!!
まぁ、このブログが僻地にある以上はなんの問題もない、ただの自意識過剰なだけです。ってのはわかってますので。
CollectFort.jsはまだしも、WARGsについては結構な力作なのですよ。
まぁ、あれも力技ですけどね。
(/ω・\)チラッ
反響が何も無いのはクリエイターとして残念な一方。
このブログの客のいなさを再認識できるのです。
(まるでこのブログの人気があれば「すばらしいプログラムなので」いっぱい使ってもらえると思っているのかと小一時間)
Gvレポートも傭兵という立場上書けないので。(いまは昔ほど煩くないでしょうし同盟も許してくれると思いますが)
まぁ、メンドイよね。
ROに関する日記も少ないし、文字だけだし、私生活などごちゃまぜの日記だし。
誰ターゲットのブログだよっていう。
問題点わかりつつもメンドイの一言で賑わしいブログにするつもりはないのです。
(あれ、今日はS自虐だなぁ)
カウンター設置したらきっと挫けちゃうから設置しないのですまる
万が一結構人が着てたら逆に気負って書けなくなるのでこのままですまる
片手で収まる知り合いと、同盟の人がチラチラみてくれてるだけで十分ですの。
あ、ユイに追加したい機能あったら言って下さいネ。
プロフィール
HN:
komyu/シュクレール/修造
性別:
非公開
自己紹介:
こうぶつはけものみみとのーびす(♀)とエリーン
主にROとTERAとラノベと雑多なkomyuの日記帳です。
主にROとTERAとラノベと雑多なkomyuの日記帳です。
TERAキャラ紹介
シュクレール(バサ)
syuzo(エレ)
サケマス(アチャ)
その他サブ
ウリエルキゥィス(スレLv54)
Vermillion(サラLv56)
パズドラ
157,318,362
フレンド募集中
枠なきゃ増やす
最終プレイ3日以上になったら消す
カレンダー
02 | 2025/03 | 04 |
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
最新記事
(12/02)
(07/07)
(07/06)
(06/14)
(05/31)
ブログ内検索
最新コメント