Tuesday, November 25, 2014

SAS: Enterprise Guide AUTOEXEC

Wthin Enterprise Guide, if you name a Process Flow AUTOEXEC, EG will prompt you to run that process when you open the project.  Note you need to name the Process, not the Program.



Saturday, November 22, 2014

Linux: Run a program every hour

Saw this here (http://linux.die.net/Linux-CLI/scheduling.html):

You can also use the -f option to have at execute a particular file (a shell script).


at -f shell_script now + 1 hour

This would run the shell script 1 hour from now.



So I tested it as follows.  First, here is SAS program test_hourly.sas:

filename outbox email 'bqualls@firstanalytics.com';

data _null_;

file outbox
    to=('bqualls@firstanalytics.com')
    subject="Test hourly process"
    ;

put "This is a test run at &SYSDATE9 at &SYSTIME..";
put "This program will run again one hour from now.";
put " ";
put " ";
put " ";
put "(signed)";
put "The First Analytics Team";
run;



And here is the script:

#!/bin/bash
#schedule this same script to run again one hour from now
echo "sh test_hourly.sh" | at now + 1hr
#run sas program
sh runsas.sh test_hourly



And I started the script for this first time like this:

echo "sh test_hourly.sh" | at 5:30pm November 22



Note: must cd to the directory where test_hourly.sh exists before issuing the above instruction.



Thursday, November 13, 2014

Excel: #VALUE error when using SUMPRODUCT and INDIRECT

This is a weird one...

This gives #VALUE error:

     =SUMPRODUCT(INDIRECT("CP!"&ROW()&":"&ROW()),INDIRECT("CP!"&COLUMN()&":"&COLUMN()))

but this works:

     =SUMPRODUCT(INDIRECT("CP!"&SUM(ROW())&":"&SUM(ROW())),INDIRECT("CP!"&SUM(COLUMN())&":"&SUM(COLUMN())))

Got the answer from http://stackoverflow.com/questions/22746000/using-indirect-function-in-the-sumproduct-formula-for-true-false-cell-refere:

I'm not sure why you need INDIRECT instead of ordinary cell references but the specific problem here is that ROW function returns an "array", even when it returns a single value, e.g. it returns {"x"} rather than just "x" - and in some circumstances Excel can't process that.

Try wrapping the second ROW function in a SUM function - the value doesn't change but it gets rid of the array, i.e.

=SUMPRODUCT((INDIRECT("A2"):INDIRECT("A"&(ROW()-1))=INDIRECT("A"&SUM(ROW())))*1)

This will eliminate #VALUE! eror while leaving the essential structure of your formula unchanged.





Tuesday, September 23, 2014

Java: Including jar files

To compile:

/software/java64/jdk1.7.0_60/bin/javac -cp ~/class -d ~/class -extdirs ~/jars ~/src/MyProgram.java


To execute:

/software/java64/jdk1.7.0_60/bin/java -Djava.ext.dirs=/privdir/xcnb804/jars -cp ~/class MyProgram


Where I got burned was this: while compiling you can use the tilde on the -d option, but while executing you cannot use the tilde on the java.ext.dirs system property.



Monday, September 15, 2014

Java: Get system property from the command line

 
 
 
java -Dmy.prop="my value" MyApp


public class Main {
  public static void main(String[] argv) throws Exception {
 
    String prop = System.getProperty("my.prop");
 
  }
}
 
 
 
 
 

Tuesday, September 9, 2014

SAS: proc sql nowarnrecurs

If your PROC SQL overwrites one if its inputs then you will get a warning message.  You can eliminate that message by using the nowarnrecurs option.  For example:

proc sql noprint nowarnrecurs;
create table work.a as
select * from work.a;
quit;
run;






Wednesday, August 13, 2014

SAS: Can I use a macro variable within a macro name? (Yes)

I have need to use a macro variable within a macro name. (Sounds crazy, I know, and it borders on writing "write-only code", but it is a legitimate need.) Not knowing if this was possible, I wrote the following program:

* Can I use a macro variable inside a macro name? ;
* This would allow me to iterate through a series of macros. ;

%macro mac1;
%put mac1 was executed;
%mend mac1;

%macro mac2;
%put mac2 was executed;
%mend mac2;

%macro mac3;
%put mac3 was executed;
%mend mac3;

%macro main;

%do i = 1 %to 3;
    %mac&i;
%end;

%mend main;

%main;



Output was as I had hoped:

mac1 was executed
mac2 was executed
mac3 was executed



So the answer to my question is Yes.