Thursday, December 24, 2009

Merry Christmas And Happy New Year

I'll be incommunicado these following days

Monday, December 21, 2009

Moving Again

Looks like I am going to be moving out of my hole, has been hitting up Craig's List for several weeks and there are lots of openings in Sillycone Valley.

Friday, December 18, 2009

Hilo Is A Culinary Sink Hole

Don't eat there, or lower your expectation, even your baseline.

Thursday, December 17, 2009

Taking Caltrain From SFO

This is what happened last night:
834pm Grabbed the bag
839pm Blue line starts
848pm BART: SFO-Millbrae starts
857pm On Caltrain southbound platform - very close!
904pm Caltrain 192 is on time.

Yeah, 30 min is too close to catch a Caltrain from SFO

Wednesday, November 25, 2009

Blogs.Perl.Org is MT

More incentive to install MT on angrybots.com

Monday, October 19, 2009

Google Translation Perfected The Art of Lost In Translation

Koorts is weg, maar zo slap als een vaatdoek. Mis voor het eerst in lange tijd een TV. Beetje zinloos zappen bij de kachel lijkt me heerlijk
http://twitter.com/silvertje/status/4998571402

Google Translation sez: Fever is gone, but as limp as a dish cloth. Mass for the first time in a long time TV. Bit pointless zapping the stove seems wonderful

har3 - omg ...

Friday, September 11, 2009

Need Editor

Re-reading the posts, I realize I need an editor.

Thursday, September 10, 2009

Persisting LR Data Using MySQL

In the beginning it was horrible: not knowing what kind of C compiler LoadRunner is using, I experience with several header files from cygwin and mingw, which I know, deep inside, won’t work.

But RTFM saved the day, by merging the header files to $LR/include MySQL C code can be compiled by only tweaking one 64 bits reference.

Below is the final code to commit unique users, I totally rely on MySQL’s ACID to do the right thing. Hopefully I put my belief at the right place.
int commit_user() {
int rc = 0;
char *exec;
int good = 0;
int available = 1;

db_connection = mysql_init(NULL);
if (db_connection == NULL) {
lr_error_message("Insufficient memory");
return -1;
}

// Connect to the database
if (mysql_real_connect(db_connection, server, user, password, database, port, NULL, 0) == NULL) {
lr_error_message("error on connect: %s", mysql_error(db_connection));
mysql_close(db_connection);
return -1;
}
lr_output_message("Connection to DB is established");

while (!good) {
available = 1;

while (available) {
exec = lr_eval_string("SELECT EXISTS (select login from LATLogin WHERE login = '{pUserName}');");
if (mysql_query(db_connection, exec)!= 0) {
lr_error_message("%s;error on query: %s", exec, mysql_error(db_connection));
mysql_close(db_connection);
return -1;
}
lr_output_message("exec: %s", exec);

if ((query_result = mysql_store_result(db_connection)) == NULL) {
lr_error_message("%s;error on store: %s", exec, mysql_error(db_connection));
mysql_close(db_connection);
return -1;
}

result_row = mysql_fetch_row(query_result);
available = atoi(result_row[0]);
lr_output_message("available=%d", available);

if (available) { //exists
lr_advance_param("pDataFileUserName");
lr_output_message("Advance pDataFileUserName = %s", lr_eval_string("{pDataFileUserName}"));
while (strcmp(lr_eval_string("{pDataFileUserName}"), lr_eval_string("{pUserName}")) == 0) {
lr_advance_param("pDataFileUserName");
lr_output_message("Advance pDataFileUserName = %s", lr_eval_string("{pDataFileUserName}"));
}
lr_save_string(lr_eval_string("{pDataFileUserName}"), "pUserName");
}
mysql_free_result(query_result);
}

exec = lr_eval_string("INSERT INTO LATLogin VALUES('{pUserName}');");
if (mysql_query(db_connection, exec)!= 0) {
rc = mysql_errno(db_connection);

if (rc == 1062) {
lr_output_message("%s is too late, duplicate exists", exec);

//when pUserName exists, probably some else took it already
lr_advance_param("pDataFileUserName");
lr_output_message("Advance pDataFileUserName = %s", lr_eval_string("{pDataFileUserName}"));
while (strcmp(lr_eval_string("{pDataFileUserName}"), lr_eval_string("{pUserName}")) == 0) {
lr_advance_param("pDataFileUserName");
lr_output_message("Advance pDataFileUserName = %s", lr_eval_string("{pDataFileUserName}"));
}
lr_save_string(lr_eval_string("{pDataFileUserName}"), "pUserName");
}
else {
lr_error_message("%s, error(%d): %s", exec, mysql_errno(db_connection), mysql_error(db_connection));
mysql_close(db_connection);
return -1;
}
}
else {
lr_output_message("exec: %s", exec);
good = 1;
user_removed = 0;
}
}
mysql_close(db_connection);
lr_output_message("Connection to DB is closed");
return 0;
}
The final result: running 90 virtual users (I ran out of login), each running 20 seconds transactions.
GetUniqueUserName
  • 75% of population: 0.028 +/- 0.02
  • 90Percentile: 0.043
The generator machine CPU consumption is hovering around 25% - I give this method of persisting LR data a stamp of approval.

Tuesday, September 8, 2009

Perl Now Runs On Android Scripting Environment (ASE)

I think I have heard about it before, but I managed to push it down to my subconscious level. Now off to figure out which android phone to throw into the ring of my gadget wishlist.

Sunday, September 6, 2009

Internet Is Humming Fine

The tech is a magician! He fixed AT&T's crappy DSL line. No red DSL light blinking this week, not once.

DSL Training Errors, Time Since Last Event: 5 days 6:51:19

House of Prime Rib

1906 Van Ness Ave
San Francisco, CA 94109
Tel:(415) 885-4605
http://houseofprimerib.net

They are doing a good imitation of Lawry's, or is it the other way around?

Friday, September 4, 2009

RTFM Saved The Day

Friday afternoon, and I am very down since nothing works.

I admit, Wilsonmar webpage's not the official one, but it's damn close. But then, I noticed this:
LoadRunner uses A website external to this site 1994 GNU C Pre-Processor options and the A website external to this site 1995 LCC-win32 Retargetable C Compiler/Linker from the Free Software Foundation via Chris Fraser of AT&T and Dave Hanson of Princeton.
MySQL C code is compiling nicely now (after one 64bits ref is tweaked).

The New Multi Protocol Script On LR9.1 Is A Useless POS

Q: Can I record ODBC traffic for Action1.c and then record Web traffic for Action2.c (or vice versa)?
A: No.

Thursday, September 3, 2009

El Burro's Mexican Restaurant

1875 S Bascom Ave # 570 (The Pruneyard #570)
Campbell, CA 95008-2389
Tel: (408) 371-5800

Not bad, not bad at all

Next Stop: SQLite

Actually no, I was thinking about something more ambitious (MySQL). The fact that I have to hunt down other C library files, forces me to consider SQLite. Just drop sqlite3.dll to $LR/bin, sqlite3.h to $LR/include and trim off the 64 bit references in sqlite3.h to make it works.

But simpler solution doesn’t make my life easier, since writing SQLite code (or any db code), in C, that doesn’t leak memory or crashes the db, is fairly hard.

But finally, I get this:
rc = sqlite3_open("test.db", &db);
if (rc) {
lr_output_message("Can't open database: %s", sqlite3_errmsg(db));
sqlite3_close(db);
return -1;
}
exec = "NO RESULT QUERY SUCH AS: DELETE, INSERT”;
isPrepared = 0;
while (!isPrepared) {
rc = sqlite3_prepare(db, exec, -1, &stmt, 0);
if (rc == SQLITE_OK) { //SQLITE_OK == 0
isPrepared = 1;
isExecuted = 0;
while (!isExecuted) {
rc = sqlite3_step(stmt);
/* uncomment this section when exec is a query that return result
while ((rc == SQLITE_ROW)||(rc == SQLITE_BUSY) ) {
if (rc == SQLITE_BUSY ) {
lr_output_message("SQLITE_BUSY - wait for 0.1 seconds");
lr_think_time(0.1); // TODO: tweak the wait time to your need
}
else {
// extract data
rc = sqlite3_step(stmt);
}
}
*/
if (rc == SQLITE_DONE) {
isExecuted = 1;
sqlite3_finalize(stmt);
}
else if (rc == SQLITE_BUSY) { // DB is locked
lr_output_message("SQLITE_BUSY - wait for 0.1 seconds");
lr_think_time(0.1); // TODO: tweak the wait time to your need
}
else { // real bad stuff usually happens here
lr_output_message("Cannot execute step, rc = %d", rc);
lr_output_message("sqlite3_errmsg: %s", sqlite3_errmsg(db));
lr_output_message("sqlite3_extended_errcode, rc = %d", sqlite3_extended_errcode(db));
sqlite3_finalize(stmt);
sqlite3_close(db);
return -1;
}
}
}
else if (rc == SQLITE_BUSY) { // DB is locked
lr_output_message("SQLITE_BUSY - wait for 0.1 seconds");
lr_think_time(0.1); // TODO: tweak the wait time to your need
}
else { // real bad stuff usually happens here
lr_output_message("Could not prepare statement, rc=%d", rc);
lr_output_message("sqlite3_errmsg: %s", sqlite3_errmsg(db));
lr_output_message("sqlite3_extended_errcode, rc = %d", sqlite3_extended_errcode(db));
sqlite3_close(db);
return -1;
}
}
sqlite3_close(db);
Functionally the script works, at 50 virtual users, each running 20 seconds transactions, even the GetUniqueUserName transaction is fairly fast:
  • 75% of population: 0.269 +/- 0.731
  • 90Percentile: 0.655
But, it doesn’t work at 60 virtual users, it also locks the controller. Not good, need to look into MySQL solution.

Wednesday, September 2, 2009

ActiveState - People Don't Like You?

This is the first time I heard about people emitting strong comments against ActiveState, but I agree with Dami, ActiveState has been making my life very productive, it's products and business practices has been very satisfactory to me.

Monday, August 31, 2009

Cable Problem Causing The Internet To Fritz

Today, the DSL just decided not to work - again - ever. A technician is scheduled and he replaces the cable and everything works - so far.

Friday, August 28, 2009

LoadRunner Doesn't Like 64 Bit Emulation

LoadRunner doesn't like 64 bit emulation over 32 bit machine. It doesn't like long long declaration on .h header file. It spews:
invalid use of `long'
Thus begin the hacking and slashing of sqlite3.h

Wednesday, August 26, 2009

Each VUser Must Use Unique Login ID

This is a problem: the web app that I am testing is using the login id as session id. Since I am furnished with data, that has multiple non-unique logins, I have to make sure that all of virtual users are using unique login id.

Several solutions come to mind, but I decided to give LoadRunner VTS a whirl.

Perusing VTS2.doc I quickly hone in lrvtc_send_if_unique function:
VTCERR lrvtc_send_if_unique(char *columnName, char *message)
But this function is pretty much useless since the VTCERR equals 1 no matter if the insertion is successful or not. Trying its cousin instead:
VTCERR vtc_send_if_unique(PVCI pvci, char *columnName, char *message, unsigned short *outRc)
This function returns successful insertion status in outRc parameter (1 = Pass, 0 = Fail).
lr_start_transaction("GetUniqueUserName");
status = 0;
while (status == 0) {
lr_save_string(lr_eval_string("{pDATAFILEUserName}"), "pUserName");

pvci = lrvtc_connect(lr_eval_string("{pVTSServer}"), 8888, 0);
rc = vtc_send_if_unique(pvci, "pUserName1", lr_eval_string("{pUserName}"), &status);
lr_output_message("Insert if unique, rc = %d, status: = %d", rc, status);
lrvtc_disconnect();

if (status == 0) //try another login in the data file if fail
lr_advance_param("pDATAFILEUserName ");
else
user_removed = 0; // just another flag
}
lr_end_transaction("GetUniqueUserName", LR_AUTO);
The login removal process is a trickier than the insert process, since VTS doesn’t have a function to look up a value in a column, a value has to be looked up (one by one):
int removePreviousUserName() { // to eliviate the nasty side effect of exit when error
int rc = 0;
unsigned short status;
int EOT = 0;
int i;
int user_removed = 0;

lr_start_transaction("RemovePreviousUserName");
i=lastrowID;

while (!EOT) {
i++;
pvci = lrvtc_connect(lr_eval_string("{pVTSServer}"), 8888, 0);

rc = lrvtc_query_column("pUserName1", i);
lr_output_message("query row %d, rc = %d", i, rc);

if (rc!=0)
EOT = 1;
else {
if (stricmp(lr_eval_string("{pUserName}"), lr_eval_string("{pUserName1}")) == 0) {
lr_output_message("Del msg (%s) at row %d", lr_eval_string("{pUserName1}"), i);
rc = vtc_clear_message(pvci, "pUserName1", i, &status);
lr_output_message("Del msg, rc = %d, Status = %d", rc, status);
lastrowID = i;
EOT = 1; // exit anyway
user_removed = 1;
}
}
lrvtc_disconnect();
}
lr_end_transaction("RemovePreviousUserName", LR_AUTO);
return user_removed;
}
A little explanation about lastrowID, when a data is deleted from VTS, a value can never be re-inserted into that row again via vtc_send_if_unique function. So, there are lots of empty rows at the lower index after the value is deleted. Thus there is no point for the script to start the search for a login to delete from row 1; instead it should start the search from the last deletion point.

Functionally the script works, but VTS system is not capable of handling multiple virtual users. At 10 virtual users, each running 20 seconds transactions, VTS is throwing numerous -10003 errors, that causes slow GetUniqueUserName transaction:
  • 75% of population: 2.201 +/- 2.912
  • 90 Percentile: 6.506
2.2 seconds on the average to insert unique value? I don’t think so. I need a better solution.

Tuesday, August 25, 2009

Internet Is All Good

The Alarm app on my BlackBerry seg-faulted this morning. Too bad I was too groggy & pissed off to take a picture, it would be interesting.

Note to self: steal an olde alarm clock from Lisa.

Btw: Internet is all good, looks like I don't need to talk to the good people in St Louis after all.

Monday, August 24, 2009

AT&T Support, The Competency May Varies

AT&T support @ 800-288-2020: FireFox's history/cookies causes the router's red light (DSL) to blink & drop the internet.

I think I should better wait for the good AT&T support (866-865-7685) in St Louis to wake up.

Wednesday, August 12, 2009

Identifying Location Based On The Soil's Microbial Makeup

Received this email and it raised little hairs on my neck.
from Melanie S
date Wed, Aug 12, 2009 at 6:05 PM
subject JOB: soil microbiome profiling @ LLNL (must be US citizen)

Tom Slezak, Biodefense Group Leader, Lawrence Livermore National Laboratory, https://www.llnl.gov/str/April04/Slezak.html, mentioned last week at the Microarray World Congress, http://www.selectbiosciences.com/conferences/MWC2009/Agenda.aspx, that he has a funded soil microbiome profiling position currently available.

The candidate must be a US citizen, and should ideally have a PhD in a related field such as bioinformatics and 1-4 years work experience. Tom’s contact information is here: https://www.llnl.gov/str/April04/Slezak.html

Specifically, the position/project entails looking at:

* Can soil microbiome profiling characterize locations? To what resolution?
* Determine the ability to characterize locations by analyzing microbial content
* Utilize microarrays and sequencing to determine the ability to resolve where a soil sample came from or rule out locations
* Develop a soil microbiome microarray to provide a low-cost way to ‘fingerprint’ locations
* Determine degree of location resolution possible due to species-level soil microbe differences


Uh-oh Dexter, beware of that dirt on your shoes.

Translating The Name of Month To Number

Another Perl code posted since I am getting tired of rewriting it all the time.
my %months = (
Jan=>1, Feb=>2, Mar=>3, Apr=>4, May=>5, Jun=>6,
Jul=>7, Aug=>8, Sep=>9, Oct=>10, Nov=>11, Dec=>12,
January=>1, February=>2, March=>3,
April=>4, May=>5, June=>6,
July=>7, August=>8, September=>9,
October=>10, November=>11, December=>12,
);
eg:
parseDate('Jan  1 2009 12:00:00:000AM');

sub parseSQLDate {
my ($txt) = @_;

if ($txt =~ /^(\w+)\s+(\d+)\s+(\d+)\s+(\d+):(\d+):(\d+):(\d+)/) {
use DateTime;

my %months = (
Jan=>1, Feb=>2, Mar=>3, Apr=>4, May=>5, Jun=>6,
Jul=>7, Aug=>8, Sep=>9, Oct=>10, Nov=>11, Dec=>12,
January=>1, February=>2, March=>3,
April=>4, May=>5, June=>6,
July=>7, August=>8, September=>9,
October=>10, November=>11, December=>12,
);

my $dt = DateTime->new(
year => $3,
month => $months{$1},
day => $2,
time_zone => 'floating',
);

return $dt;
}
}

Tuesday, August 11, 2009

SQL Server Version

From: How to identify your SQL Server version and edition
SELECT @@VERSION
or
SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition')

Thursday, July 30, 2009

Ambigous Win32:OLE::LastError() Message

Running this code snippet:
use Win32::OLE;
$lrEngine = Win32::OLE->new('wlrun.LrEngine');
$lrScenario = $lrEngine->Scenario();
$rc = $lrScenario->new(0, 1);
# do not save previous
# regular vusers based scenario

$scriptLocation = 'PATH\TO\SCRIPTNAME\SCRIPTNAME.usr';
$scriptName = 'SCRIPTNAME';
$lrScenario->Scripts->Add($scriptLocation, $scriptName);
print "Win32::OLE::LastError: ".Win32::OLE::LastError()."\n";
Yields:
Win32::OLE::LastError: Win32::OLE(0.1709) error 0x80020005: "Type mismatch"
in METHOD/PROPERTYGET "Add" argument 2
Yes, the code passes string, even changing the code to force COM BSTR usage still generates the same error message
use Win32::OLE::Variant;
$scriptName = Variant(VT_BSTR, 'SCRIPTNAME');
What gives? The code definitely follows the documentation to the dot
Function Add(Path As String, Name As String) As Long
Add Script to Scenario
The answer: Variants by reference, changing the code, to reflect the snippet below, fixes the problem.
use Win32::OLE::Variant;
$scriptName = Variant(VT_BSTR|VT_BYREF, 'SCRIPTNAME');

Wednesday, July 29, 2009

Submitted 1st Perl Bug To ActiveState

http://bugs.activestate.com/show_bug.cgi?id=83895

--Note: I see, basically reverse doesn't sort the list in reverse order, but it will reverse the list.

Reverse Function Is Not Working Properly

Dan caught it, not me
use strict;
my $DATA;
{
local $/ = undef;
my $DATA_text = ;
eval "$DATA_text";
die $@ if $@;
}
print "# incorrect reverse sort using reverse function\n";
foreach my $date (reverse keys %{$DATA}) {
print "$date\n";
}
print "\n";
print "# correct reverse sort\n";
foreach my $date (sort {$b cmp $a} keys %{$DATA}) {
print "$date\n";
}

__DATA__
$DATA = {
'2009/07/19' => {
files => 1,
},
'2009/07/12' => {
files => 1,
},
'2009/07/05' => {
files => 1,
},
'2009/06/28' => {
files => 1,
},
'2009/06/21' => {
files => 1,
},
};

It prints:
>perl reverse_problem.pl
# incorrect reverse sort using reverse function
2009/07/12
2009/07/05
2009/07/19
2009/06/28
2009/06/21

# correct reverse sort
2009/07/19
2009/07/12
2009/07/05
2009/06/28
2009/06/21

>perl -v

This is perl, v5.8.8 built for MSWin32-x86-multi-thread
(with 18 registered patches, see perl -V for more detail)

Copyright 1987-2007, Larry Wall

Binary build 822 [280952] provided by ActiveState http://www.ActiveState.com
Built Jul 31 2007 19:34:48

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

--Apparently I can reproduced this using ActiveState v5.10.0 build 1001 [283495]

Monday, June 15, 2009

Collect My Passport

The window opens from 13:30 to 16:00. I arrived 15:55. I hate LA's traffic.

Thursday, June 11, 2009

Ambiguous Extraction

Say you need to extract the id of Company A as originator ({pOriginatorName}) and Company A as underwriter ({pUnderwriterName}), what should you do when you encounter this response?

<html>
<head />
<body>
...
<select name="originator">
<option selected value="0">Company A</value>
<option value="1">Company B</value>
<option value="2">Company C</value>
</select>
...
<select name="underwriter">
<option value="-1">Please select</value>
<option value="9005">Company A</value>
<option value="9006">Company B</value>
</select>
...
</body>
</html>
Then it's time to use the XML functions provided by the good people of Mercury (now HP), first extract the options inside the select element by using web_reg_save_param function:
web_reg_save_param("pOriginatorIDText",
"LB/IC=name=\"originator\"",
"RB/IC=</select>",
"Ord=1",
"Search=body",
LAST);

web_reg_save_param("pUnderwriterIDText",
"LB/IC=name=\"underwriter\"",
"RB/IC=</select>",
"Ord=1",
"Search=body",
LAST);


Follow by the functions to extract the related values:
iNumOfValues = lr_xml_get_values("XML=<select {pOriginatorIDText}</select>",
"ValueParam=pCollectedOriginatorName",
"Query=/select/option",
"SelectAll=yes",
LAST);

iNumOfValues = lr_xml_get_values("XML=<select {pOriginatorIDText}</select>",
"ValueParam=pCollectedOriginatorID",
"Query=/select/option/@value",
"SelectAll=yes",
LAST);

for (i = 0; i < iNumOfValues; i++) {
sprintf(buf, "{pCollectedOriginatorName_%d}", i+1);
sprintf(buf, rtrim(lr_eval_string(buf)) );
sprintf(sParamName, "pCollectedOriginatorName_%d", i+1);
lr_save_string(buf, sParamName);

if (strcmp(buf, lr_eval_string("{pOriginatorName}")) == 0) {
lr_output_message("Originator name found");
sprintf (buf, "{pCollectedOriginatorID_%d}", i+1);
lr_save_string(lr_eval_string(buf), "pOriginatorID");
}

sprintf (buf, "Retrieved value %d : {pCollectedOriginatorName_%d}", i+1, i+1);
lr_output_message(lr_eval_string(buf));
}
//#####################################
iNumOfValues = lr_xml_get_values("XML=<select {pUnderwriterIDText}</select>",
"ValueParam=pCollectedUnderwriterName",
"Query=/select/option",
"SelectAll=yes",
LAST);

iNumOfValues = lr_xml_get_values("XML=<select {pUnderwriterIDText}</select>",
"ValueParam=pCollectedUnderwriterID",
"Query=/select/option/@value",
"SelectAll=yes",
LAST);

for (i = 0; i < iNumOfValues; i++) {
sprintf(buf, "{pCollectedUnderwriterName_%d}", i+1);
sprintf(buf, rtrim(lr_eval_string(buf)) );
sprintf(sParamName, "pCollectedUnderwriterName_%d", i+1);
lr_save_string(buf, sParamName);

if (strcmp(buf, lr_eval_string("{pUnderwriterName}")) == 0) {
lr_output_message("Underwriter name found");
sprintf (buf, "{pCollectedUnderwriterID_%d}", i+1);
lr_save_string(lr_eval_string(buf), "pUnderwriterID");
}

sprintf (buf, "Retrieved value %d : {pCollectedUnderwriterName_%d}", i+1, i+1);
lr_output_message(lr_eval_string(buf));
}

Yes, it looks complicated, but:
pOriginatorID = 0
pUnderwriterID = 9005

Mish Mash Of Different Version Work

This is weird, but LR controller v9.1 can talk & run scripts when paired with generator v7.8FP1, vice versa.

Test it this morning.

Wednesday, June 10, 2009

rtrim

Delete trailing spaces
char *rtrim(char * string)
{
while (strcmp(strrchr(string, ' '), " ") == 0) {
string[strlen(string)-1] = 0;
}
return string;
}
Googled this and can't find good solution.

Wednesday, June 3, 2009

Use PPM-Make To Make My Own PPM Repository

After getting tired of disappearing modules @ theoryx5.uwinnipeg.ca, and having to merge the files between several machines manually, I decided to build my own repository.

Luckily, Randy Kobes (the maintainer of theoryx5.uwinnipeg.ca) also releases PPM-Make to compile the code from scratch, together with the release of MinGW under PPM, these make my life a lot easier to compile and host the ppm myself.

Playing with the PPM-Make module for a while, I realized that I sorely need:
  1. To organize the directory structure
    • The .ppd & .tar.gz files: http://angrybots.com/ppm/as_p5_8_b822/x86/sandbox/
    • Archive (zip file for local install): http://angrybots.com/ppm/as_p5_8_b822/x86/sandbox/zips/
  2. Another option (I named it vsz) to insert the version of the module to the zip file name for archiving purposes.
After hacking and gluing everything together, I present Acme-Bleach from my repository. To install:
> ppm install http://angrybots.com/ppm/as_p5_8_b822/x86/sandbox/Acme-Bleach.ppd

I'll upload more modules as I get them successfully compiled and tested.

Tuesday, June 2, 2009

PPM-Make

Just research the PPM::Make problem on my desktop, it appears that it has v0.94, I need to upgrade it to v0.96, and that's not half of the problem: apparently the ppm repository at theoryx5.uwinnipeg.ca doesn't have v0.96. Surprise!

So I need to add tcool.org PPM repository:
> ppm repo add http://ppm.tcool.org/archives/package.xml

Researching the module again:
>ppm search ppm-make
1: PPM-Make
Make a ppm package from a CPAN distribution
Version: 0.940
Repo: theoryx5.uwinnipeg.ca

2: PPM-Make
Make a ppm package from a CPAN distribution
Version: 0.96
Repo: ppm.tcool.org

Remedy:
>ppm install 2 --force
Downloading PPM-Make-0.96...done
Downloading libwww-perl-5.826...done
Downloading version-0.76...done
Downloading IO-Compress-2.019...done
Downloading Compress-Raw-Bzip2-2.019...done
Downloading Compress-Raw-Zlib-2.019...done
Unpacking PPM-Make-0.96...done
Unpacking libwww-perl-5.826...done
Unpacking version-0.76...done
Unpacking IO-Compress-2.019...done
Unpacking Compress-Raw-Bzip2-2.019...done
Unpacking Compress-Raw-Zlib-2.019...done
Generating HTML for PPM-Make-0.96...done
Generating HTML for libwww-perl-5.826...done
Generating HTML for version-0.76...done
Generating HTML for IO-Compress-2.019...done
Generating HTML for Compress-Raw-Bzip2-2.019...done
Generating HTML for Compress-Raw-Zlib-2.019...done
Updating files in site area...done
169 files installed
8 files unchanged
22 files updated

Last, for $ENV{PATH} move C:\Perl5.8.8\site\bin to the front of C:\Perl5.8.8\bin

Friday, May 29, 2009

PPM-Make Is Goodz

Last night, I half jokingly installed PPM::Make and MinGW for Perl 5.8.8 on the laptop and built ORM 0.95. It worked. What was going on with my desktop?

Thursday, May 28, 2009

ATM Eats Ma Check!

Oh, how I hate these old ATM that eat checks in envelope

The Hole Feels Like Home Now

After AT&T opens the tap, now go back to hacking the power outlets/cabling ...

Tuesday, May 26, 2009

Leeching Moment - Last Day

Arrived at the hole 2AM in the morning after driving all the way from LA only to find non-working internet. Re-register the modem, no luck. Reboot modem - wait - no packet. Re-register the modem again, no internet. Tired, I decided to go to sleep.

Wake up 6:30AM hoping the people in St Louis have fixed it since they have a head start. No luck, no internet. Call the AT&T Broadband Customer Care, someone run basic test again and tell me to call back in 2 hours since he just files a ticket.

Why new ticket? The little voice in my head query - no time to think, time to work. Suckling the wifi at Starbucks at 7:30AM.

Around 10, I decided that I had enough fiddling with the script, decided to go home and follow up with AT&T. To my dismay, the pipe wasn't working and someone named Renee from AT&T had to hear me screaming like a mad man about their stupid bot closing the previous ticket and demanded her to follow up personally since today is the 6th day of their nonoperational service.

Miraculously, the internet starts working around 11:30 - yay!

Btw, I borrowed Mr Smith Goes to Washington, Gattaca, The Fountain and The Painted Veil from Sunnyvale Public Library.

Monday, May 25, 2009

Memorial Day

First thing first - sleep - but the AT&T bot woke up me up, I hit the red button and resumed sleeping until Stanley was about to leave, helped him with the luggage.

Caught some sleep - but I had to break for lunch.

Napping again, I need to be on top of my game tonight since we are to leave LA late, forced myself to wake up around 16:30 and drive to Simi Valley.

Had BBQ dinner and we leave for Bay Area at 20:00.

Sunday, May 24, 2009

Stella's Wedding

Spend the morning sleeping - break for lunch - and back to spend the whole afternoon with myself, enjoying coffee with Top Gear.

Get out of the house around 3:30, pick up the family and arrive at the Muckenthaler Cultural Center at 5PM sharp.

Ceremony starts around 17:15, tea ceremony, photo ops and reception afterward.

The party ends at 10PM, I help with shuttling the gifts and we hang out at the hotel with the family members until 1AM in the morning. Bone tired ... but happy.

Friday, May 22, 2009

Leeching Moment - Day #5

Last night I arrived home sleepy and hit the hay without checking the status of the pipe. Today, I pay for it.

Thinking that I need to give the people head start, I went to Starbucks and sapped the line until 9. Called the support but they sent me home since they needed me to eyeball the blinking lights of the modem.

Got home, another support team member ran basic diagnostic and he tried to get me to pay for the cavalry to sweep in and fix my problem. A threat to switch to cable tamed him and the little cunt trouble himself by created a trouble ticket.

In mere 15 minutes - AT&T bot called me, telling me that the connection was restored but it wasn't. The support team member rerouted the ticket back to the central office.

Several hours passed, nothing happened, several phone calls to several support members didn't solve the issue. I left for LA.

-- the stupid bot called, but I hang up since I couldn't verify if the pipe was fully operational.

Thursday, May 21, 2009

Leeching Moment - Day #4

Work in the hole for the whole day, tinkering with the scripts and wait patiently as packet trickles in via 3G connectivity. AT&T man shows up around noon, having trouble with the wires but solved the problem. Told me to wait 30 minutes for the pipe to be connected at the central office.

One hour later, still no packet, AT&T person told me to hold the horses until 8PM.

Pick up Ida's mom at SFO, and work from Starbucks.

Wednesday, May 20, 2009

Leeching Moment - Day #3

Same as yesterday, Starbucks and Sunnyvale Public Library.

While perusing DVD, I found several good titles: Pathfinder, Mapping Stem Cell Research (documentary), The X Files 2, The Battle Of Algiers and Donnie Darko (dir cut).

Did I mention I found The Savages, yesterday?

Looks like I'll be frequenting this library, Pasadena Central Library's DVD collection is nothing compared to this one.

Tuesday, May 19, 2009

Leeching Moment - Day #2

Start my day at 7, went straight to Starbucks. I want to visit it first since I didn't get a seat and electrical outlet yesterday at 10AM.

I figured I could probably get one if I go there earlier, knowing Sillycone Valley wakes up around 9AM.

Starbucks' pipe is the best, using my AT&T account: I get a stable VPN connection (no drop) and a decent bandwidth to the office. Decide to linger for a while until 11AM.

Second and last stop is Sunnyvale Public Library ...

The Cabling in This Hole Is Abominable

Just realized that all electrical outlet is type A. Except two of them, inconveniently located. Also, the phone jack is only available in the bed room.

Time to visit Home Depot.

Monday, May 18, 2009

Leeching Moment - Day #1

Started the day early, went to get my car diagnosed since it is severely overdue for one, Toyota sent me to the street in 1 hr at 8 AM with no vehicle problem, except dirty air filter. Not bad.

Next off to Peet's. Bad news, they only allowed me to leech for 2 hours max. Don't feel like asking for second wi-fi id since the quality of the pipe is bad, got kicked off the VPN several times and the speed is horrible. Fire up the EVDO 3G to finish a recording. Get out to Starbucks at 11 AM.

Starbucks is filled to the brim, with only 2 electrical outlets spotted, and they are all occupied.

Settle for Borders, fire up EVDO 3G again, work till 3PM. Finishing up at Sunnyvale Public Library.

Sunday, May 17, 2009

Moving

Scrubbed the apartment clean after meeting with photographer.

Meet with a videographer.

Moved my last stuff out of the apartment (jug of water and mug) - and turn in the keys.

Slept with the light on, even though Mr Shinozaki guarded the door.

Leeching Moment

Since I am not going to have DSL connection for a couple of days (AT&T will connect the pipe next Thursday), I have decided to brave the Sillycone Valley and leech the pipe from friendly sources.

Thursday, April 30, 2009

The First 5 Things I do When I Get a New BlackBerry

Riz from Inside BlackBerry Blog ask this question: "what do you do when you first get your device?" in this article.

This is what I always do, after upgrading from 7520 -> 8703e -> 8830:
  1. Make sure the device works: make call to office land line and TALK to real person, shoot an email to people in the office and off-site (personal email account) & setup voice mailbox. This device should function as phone after all.
  2. Just like Riz, change font size: BB Millbank 7 or 8, and make sure I still can read: "The quick brown fox jumps over the lazy dog".
  3. Download favorite apps:
    • Gmail client
    • Google Maps - a recent favorite app after upgrading to 8830
    • Yahoo Messenger
    • Facebook
  4. Again, following Riz, rearrange the application icons (X being non important application):
    • Top: Messages, Call Log, Browser, Gmail, Calendar, Address Book
    • Middle: Alarm, Keyboard Lock, Media Player, X, X, X
    • Bottom: BrickBreaker, Calculator, Google Map, X, X, X
  5. Get the latest OS and desktop upgrade, and test internet tethering.

I Hate April

Tons of crap happened this month - I don't want to look back.

Saturday, April 18, 2009

R&G Lounge

631 Kearny St
San Francisco, CA 94108
Tel: (415) 982-7877

http://rnglounge.com/

Saturday, April 11, 2009

Finally we are set, the paper work is done

Looks like we set to have a reception at Ritz Carlton, HMB. Ida received the countersigned agreement.

Friday, April 10, 2009

Kozy Korner

213 W Wilson Ave
Glendale, CA 91203
Tel: (818) 242-6608

Nice & small Thai restaurants, but parking is bad and the food is bastardized to suit gringo taste. John loves the Orange Chicken, I agree that it is good.

Wednesday, March 25, 2009

FB Application Notification Filter

I welcome this new FB feature: Hide the application spam only, not all notifications from your friends.

From Noodles

Monday, March 23, 2009

La Bodeguita del Medio

463 South California Ave
Palo Alto, CA 94306
Tel: 650 326 7762

http://www.labodeguita.com/

Order the skirt steak ... I would put the food at 4.5 stars

Saturday, March 21, 2009

Anh Hong Saigon

233 W Calaveras Blvd
Milpitas, CA 95035
Tel: (408) 946-9046

http://www.anhhong.com

Friday, March 6, 2009

Jang-Tu Restaurant

1012 E. El Camino Real
Sunnyvale, CA 94087
Tel: (408) 245-5720

I have never seen so many 'intestine' written on the menu.

Wednesday, March 4, 2009

Back To Blogging Again

After 3 months hiatus, I think I might want to start blogging again, need to journal my adventure in creating my own ppm repository and wedding planning.

This is going to be a fun spring.

PS: expect lots of back dating posts.

Thursday, February 26, 2009

New Fire Code

Got this from the management:
February 25, 2009

New Regulation:
The new regulation enforced by local fire department reads as follows:

2007 California Fire Code, Section 308.3.1 open-flame cooking devices.
Charcoal burners and other open-flame cooking devices shall not be operated on combustible balconies or within 10 feet of combustible construction.

Exceptions:
1. Single family homes and duplexes.
2. Where buildings, balconies, and decks are protected by an automatic sprinkler system.
3. Liquefied-petroleum LP (which includes propane) gas fueled cooking devices having LP gas container with a water capacity not greater than 2.5 pounds (1 pound LP-gas capacity)

Alright - time to move out.

Tuesday, February 24, 2009

Shalimar

1146 W El Camino Real
Sunnyvale, CA 94087
Tel: (408) 530-0300

http://www.shalimarsf.com/

Monday, February 23, 2009

Microblogging

Prime example of Web 2.0 terminology inflation, and rightfully NYT is confused:
But Facebook also contains a similar feature called the “status update,” and a program called Yammer lets office workers post short updates about their activities.
Not to mention status in AOL/YIM/MSN/Plaxo and 'What are you working on?' in Linkedin. All those stuff (whatever you may call it) can be linked together and should be linked together.

Currently, I am writing my status at Twitter and it feeds to Facebook and Plaxo.

NYT article: Tweeting? Odds Are You Live in a City

Monday, February 16, 2009

Santa Ramen

1944 S El Camino Real
San Mateo, CA 94403
Tel: (650) 344-5918

Wednesday, January 14, 2009

The Genius Of Exchanging Wood/Rock for Gold

Burn traitors 20 energy
10 warriors Warriors
4,000 wood Wood

Requirement Info

This item is required and will also be depleted from your stats/inventory.
23-28 experience
3000-3250 goldGold



Quest Successful!

A rip roaring fire and the crackling of human fat goes a long way to pacifying the populace.

You used: 20 energy, 4000 wood
You gained: 27 experience, 3051 gold


Repair outer walls 20 energy
10 warriors Warriors
4,000 stone Stone

Requirement Info

This item is required and will also be depleted from your stats/inventory.
23-27 experience
3000-3250 goldGold

Quest Successful!

Solid stone walls make for good neighbors.

You used: 20 energy, 4000 stone
You gained: 23 experience, 3111 gold

Monday, January 12, 2009

50 Most Loathsome People In USA 2008, According To Buffalo Beast

I liken this one:
13. Joe Lieberman

Charges: A fickle, flabbery fiend reviled by both parties, Lieberman somehow finds himself more powerful than ever, failing forward by virtue of the Democrats’ unfalteringly chumpish lack of discipline. After promising that he was “not going to go to…the Republican convention, and spend my time attacking Barack Obama,” Lieberman went to the Republican convention and attacked Barack Obama. But that was just the beginning of his descent into a self-dug hole of betrayal that should have proved inescapable. Lieberman thought it was “a good question” to ask if Obama was a Marxist. He campaigned not just with McCain, but with Palin and down-ticket Republicans, another thing he said he wouldn’t do. But the most loathsome trait Lieberman exhibits is that most loathsome of all: Smearing dissent as treasonous. The kind of suppressive asshole who would accuse you of helping terrorists by beating him at checkers should not be Chairman of the Committee on Homeland Security, and is not someone worth rewarding for his own dissent.

Exhibit A: “In matters of war, we undermine presidential credibility at our nation's peril.” “Sen. Obama doesn't come to this debate with a lot of credibility.”

Sentence: Lieberman awakes to find himself in the body of an impoverished Iraqi living in a small apartment with 12 family members and no electricity. Shocked by this inexplicable turn of events, he stumbles outside and cries to God, looking up just in time for the white phosphorous to hit him in the face.

THE BEAST 50 MOST LOATHSOME PEOPLE IN AMERICA, 2008

Thursday, January 8, 2009

Coffee Production

Taken from The Economist: Coffee King