Friday, June 29, 2012

[CMD.EXE] Console weirdness

What do you make of a command line tool that stops working and seems to wait for keyboard input, but the code doesn't have a keyboard input instruction anywhere in it? I just had a batch file (that calls two PHP files and an EXE) sit idle for 2 hours and then start working as soon as I hit a key in its window.

After digging around a bit for a solution, where should I find it but at PerlMonks:

If your cmd.exe windows have "Quick edit" mode enabled, then if you (or somebody) left-clicks in the window (say to bring it to the top of the window stack), then it can select (highlight for copy & paste), one or more characters. A side effect of this is that output to the screen is suspended until the C&P is completed by right-clicking.


And if the program is regularly outputting to the screen, then undisplayed output will accumulate until the internal buffer fills, at which point the next write attempt will block until the select state is ended. Effectively suspending the program. The select state can be ended by right-clicking in the window so completing the copy & paste operation.


It can also be ended by typing any key, which abandons the C&P and allow the blocked write to succeed and the program to continue. Ie. Exactly the symptoms you've described.


The Quick-edit mode is very useful, but it can be confusing if you are not aware of it, or its affects.
        -- Re^3: Perl suddenly pauses for key input
Weird ... can it get any weirder than this?
© Copyright Bruce M. Axtens, 2012

[Batch] Running on Low

Running on LOW priority (or any other priority class) can be done from the command line with the START command, e.g.
START /LOW SomeBatch.cmd
Alternatively, one can embed the START command with the priority class modifier within the batch file itself, viz
@echo off
 setlocal enableextensions
 if %1@==@ (
  start /low %0 running
 goto :eof
 )
 echo This instance is running at LOW priority class
 pause
 exit
One could even make the priority class one of the parameters to the call, e.g.
@echo off
 setlocal enableextensions
 set PC=%1
 if %PC%@==@ (
 echo Please specify priority class as first argument.
 goto :eof
 ) 
 if %2@==@ (
 start /%PC% %0 %1 running
 goto :eof
 )
 echo Supposedly running %PC%
 pause
 exit
The trick is to check, in the first instance, for something in the %1 slot, and in the second, in the %2 slot, with the assumption that 'nothing' means %0 is running for the first time. Note also, that no checking of meaningful priority classes is done. That's left as an exercise for the reader.
© Copyright Bruce M. Axtens, 2012

Thursday, June 28, 2012

[Backup] Genie9 Free Timeline

Gratuitous ad:
The PC equivalent of Apple's TimeMachine: Genie Timeline

[PearlTrees] Programming Languages

I've created a PearlTrees account and have part populated it with some programming language research which you can get to directly here.

Thursday, June 21, 2012

[JScript] The name of the caller


A few postings back I demonstrated how to pull the name of the current function out of arguments.callee. Now to finding out the name of the caller:

function foo() {
 try {
  var myCaller = foo.caller.toString().split(/ /)[1].split(/\(/)[0];
 } catch( e ) {
  myCaller = e.message;
 }
 WScript.Echo(myCaller );

}

function bar() {
 foo();
}

bar();
foo();
The output from all that is
bar
'foo.caller' is null or not an object
So if foo is called from bar then myCaller contains "bar" otherwise an error is raised as the global context doesn't qualify as a "caller". Notice, too, that unlike getting the callee, the caller requires the name of the current function, not arguments.© Copyright Bruce M. Axtens, 2012

[Codeaholic] Well that was intelligent ... NOT!

As you may have noticed, the layout has changed. What you wouldn't have noticed is that my Google Analytics javascript got clobbered in the process. So even if my readership have noticed, I've no record of them having noticed. Smart move, Bruce, real smart move. Oh well, fixed now.
© Copyright Bruce M. Axtens, 2012

Wednesday, June 20, 2012

[Go] Out with JScript, in with Go?

Today I ran a large JScript against a month's worth of hourly REST traffic logs. The logs were parsed and manipulated into a series of tables in an Access database. It took about 12 hours to run. 12 hours ... and on a decently-specced laptop -- a Toshiba Satellite Pro L670.

So I'm looking around for something as flexible as JScript/javascript but which produces native binaries ... and Go seems like a good possibility. Any other suggestions?




I know, I did say 24 hours initially. Frightening the effect of 4 hours sleep on the middle-aged mind.

© Copyright Bruce M. Axtens, 2012

Monday, June 18, 2012

[JScript] Scatter redux

The previous version has a problem: when the recordset has zero records, it falls over. The updated version is below:

function Scatter( o ) {
 var result = {};
 var bEmpty = true;
 var vba = {};
 if ( o.RecordCount > 0 ) {
  bEmpty = false;
  vba = new VBArray( o.GetRows() );
 }
 var fldCount = o.Fields.Count;
 for (var i = 0; i < fldCount; i++ ) {
  result[o.Fields(i).Name] = [];
  if ( ! bEmpty ) {
   for ( var j = vba.lbound(2); j <= vba.ubound(2); j++ ) {
    result[o.Fields(i).Name].push( vba.getItem(i,j) );
   }
  }
 }
 return result;
}


© Copyright Bruce M. Axtens, 2012

Saturday, June 16, 2012

[JScript] Scatter (like the FoxPro function)

On a roll tonight!

Scatter and Gather are a pair of functions in FoxPro and related languages which would take a record and copy it into the memvar space, naming the memvar the same as the field name and storing the field's value. Gather did the opposite.

Now I've got that working in JScript. I hand it a recordset and it creates an object with the field names as property names and the values of each as a list attached to the property. This makes things like this possible:

var X = Scatter( oRS );
 for (var i = 0; i < X.AdvertiserParentFK.length; i++ ) {
  WScript.Echo( i, X.AdvertiserParentFK[i]);
 }
And so here's the function:
function Scatter( o ) {
  var result = {};
  var vba = new VBArray( o.GetRows() );
  var fldCount = o.Fields.Count;
  for (var i = 0; i < fldCount; i++ ) {
   result[o.Fields(i).Name] = [];
   for ( var j = vba.lbound(2); j <= vba.ubound(2); j++ ) {
    result[o.Fields(i).Name].push( vba.getItem(i,j) );
   }
  }
  return result;
 }

More to enjoy! 


© Copyright Bruce M. Axtens, 2012.

[JScript] ADODB GetRows to JScript

StackOverflow to the rescue again. Where would I be without them?

Anyway, I was looking up how to return a GetRows() call on an ADODB recordset to JScript and worked out the following from this posting about returning SafeArrays to JScript


function getRowsToMatrix( o ) {
  var vba = new VBArray( o );
  var dims = vba.dimensions();
  var result = [];
  for ( var i = vba.lbound(2); i <= vba.ubound(2); i++ ) {
   result[i] = [];
   for ( var j = vba.lbound(1); j <= vba.ubound(1); j++ ) {
    result[i].push(vba.getItem(j,i));
   }
  }
  return result;
 }

What I end up with is an array of arrays, which I can address as follows:


var X = getRowsToMatrix( oRS.GetRows() );
var recs = X.length;
var flds = X[0].length;
var lastFldLastRec = X[recs-1][flds-1]; // X is zero-based

Enjoy!



© Copyright Bruce M. Axtens, 2012

[JScript] The name of the current function

This is a plug for StackOverflow, where I spend a fair bit of time.

Today I went looking for Javascript code to give me the name of the currently executing function. I found answers
here and here. And now I have the following in my script:

var fname = arguments.callee.toString().split(/ /)[1].split(/\(/)[0];

Woe betide if callee is ever disabled!


© Copyright Bruce M. Axtens, 2012