::::: : the wood : davidrobins.net

My name is David Robins: Christian, lead developer (resume), writer, photographer, runner, libertarian (voluntaryist), and student.

This is also my son David Geoffrey Robins' site.

That's so gay

News ·Wednesday February 28, 2007 @ 22:44 EST (link)

Silver Mazda MPV, WA 803 MDN, cuts me off driving down 163rd Avenue to 40th Street, honked my horn at him; almost got himself run right off the road, idiot.

A teenager gets harrassed, fires back with "That's so gay." Clearly, this is a matter that must be discussed in court. Rebeka, the teenager in question, is Mormon, and was asked questions such as, "Do you have 10 moms?"; she was sent to the principal and given a warning and a notation in her file (whatever that means). Her parents are suing to get it removed, which they shouldn't have to do; it never should have gone that far, and, what, it's fine to insult Mormons, but homosexuals are special (sort of like it's fine to insult Christians, but Muslims are special)? Equal punishment would have been nice; no punishment, better. Kids are kids, and they're pathological, but let's focus on educating them and save discipline for real personal harassment.

One of the Fark comments about it ended with
Anyhoos... of all those groups, the mormons singled themselves out... I mean seriously, they literally pulled their religion out of a hat! I mean, between them and the Scientologists, it's like some kind of functionally retarded race to see who can come up with the most implausible wacky ideas.
Which I think sums things up nicely.

Talk about recidivism: the Mexican drug smuggler that was given immunity in return for helping jail two Border Patrol agents is back at it; then again, I suppose if I had immunity for a crime that profitable I would be too. Here's hoping the full story about the Border Patrol agents comes out (no, I don't know what it is); there are a lot of murky edges. But if it's as simple as them taking potshots at a suspicious illegal alien that was trying to evade them, I hope they're set free and each given medals.

On the house: we have the big check from the insurance, but it has to go through the mortgage company, but we have all the forms so we'll mail that tomorrow and they'll send back part of it with the rest being contingent on their inspection of the work when it nears completion. The contractor and his crew are set to start removing broken trusses and putting in new ones next Thursday and will work over the weekend.

On Word: I'm finally finished the 11 sp3 OACR fixes, which is celebration-level great; we're still planning 14 (major features to be server and collaboration, I'd like to own a major portion of the server work); I've synced and built from the 14 depot but we won't be able to check in until mid-March (because the test team has screwed up all the tests and now needs to fix them).

I sent my N-400 (U.S. citizenship application) last week; current processing times are 8-9 months, so I expect to hear back then for fingerprinting, a civics exam (What are the branches of government?; How many senators are there? Why does the U.S. flag have 13 stripes? and other questions that Americans usually can't answer), and then if all goes well, to be given an oath ceremony date. I told some guys at work, they say they'll crash the ceremony, that should be fun.

And on the Perl front: I released HTTP::Parser 0.03 and Net::SSH2 0.10, fixing all the bugs for those modules; for the legacy Net::SSH::Perl and Net::SFTP modules, most of the bugs were bogus, but there are a few I plan to fix eventually. Regarding the (Microsoft) Office OpenXML modules, I decided against using the Relax NG schemas, since there are no good parsers for them and they're not easily LR(1) (James Clark's reference parser, written in Java, uses the LL(k) lookahead features of JavaCC), so I went with XSD, which is straight XML and can easily be converted to a tree of nodes which will convert between XML and perl objects.

Looking forward to garage sales

News ·Thursday February 15, 2007 @ 22:51 EST (link)

Yep, I'm looking forward to spring cleaning and garage sales, maybe I'll snag a couch for my new office (I moved into my new office Monday, we're at the far end of the building this time 'round). Maybe I like garage sales because it's one of the few places I can still haggle with sellers (the other place I used to haggle was buying lenses at used camera stores; for example, I recall getting my Nikor 105mm macro AF-D for $150 less than the asking price). One just needs to be willing to walk away; there's usually another sale just down the street. Also it's a fun thing to do on weekend mornings.

Honey wanted to get the Our Daily Bread daily meditation emailed to her, but they weren't offering the service any more, so I whipped up a quick perl script using LWP::UserAgent, naturally, pulled out the relevant bits of the page (with regular expressions; there was no need to parse the page), formatted an email with MIME::Lite, and sent it with Mail::QmailQueue. I added it to cron(1) and it's working just fine. I don't think they'd object (they send the paper version for free, and the page doesn't have ads), they just didn't want to be in the business of sending automated email any more.

Two events coming up, both Tuesdays: SPUG hackathon on the 20th and UW 50th anniversary celebration at the Bellevue Arts Museum on the 27th. The last UW event there was interesting and I won a sweater and a baseball cap, so we may go to this one too. (Excuse me while I break to clean up the SPUG wiki front page. That's much better.) Anyway, no, I haven't made a SPUG meeting yet but I hope to make the next one; a hackathon sounds like fun, and I hope rumors of the group's death are greatly exaggerated.

I taught myself a little about LDAP today and managed to muddle my way through getting the ActiveDirectory server to talk to me. Today was the first weekly Word "brown bag" (lunch meeting), each of which will have two people each cover a topic in Word (for example, today was Layout and Email (Word is the default Outlook viewer and editor)), so I was thinking that when I get to my topics (object model and autoformatter, possibly the idle loop too) I may want to use the wiki. But if I do, I'll want to provide a link to the "slides", and right now it rejects users not in the database out of hand (mod_auth_sspi knows their login names, though). Currently I lookup known users' real names in my login table, but it'd be nice to address guests by real name too, hence my poking at Active Directory. I tried Net::LDAP first, but it doesn't do authenticated logins, which would mean storing my password in the wiki code in plaintext (no thanks) so I looked at the RFC 1823 LDAP API, discovered that Windows supports it, and hacked together a few queries. Now I just need to wrap it in a perl module for easy access.

How can these people call themselves our representatives?

News ·Sunday February 11, 2007 @ 01:08 EST (link)

I recently found my way to Americans for Better Immigration, which provides immigration score cards for members of congress, and things aren't pretty. They also have grades for presidential candidates. News shows frequently show the majority of the people being against free handouts and benefits for illegal aliens (benefits that legal residents and citizens usually can't get), but many of these clods in Washington (D.C.) are voting to give away the farm at every turn. Why would anyone support in-state tuition for illegals, when someone from the next state over can't get it? Why not crack down on people stealing identities? Why shouldn't the loophole in the fourteenth amendment that spawns so-called "anchor babies" be closed? Our state senators, Maria Cantwell (votes) and Patty Murray (votes) both scored D-. Why vote against a border fence that helps keep drugs out (sure it's not perfect, but it's a great start)? Mine the borders, build the fence, require employers and landlords to check eligibility, fine the ones that fail it, and take away the free stuff. When they find themselves out in the cold, they'll get the hint and go home.

(Technically, my government representatives aren't responsible to me yet, neither should they be, since I'm not a United States citizen, although I'm preparing my N-400 package presently and after I get my two passport photos and make some photocopies I can send it all in and hopefully get called for a citizenship interview in about ten months.)

Now, how about China? We need to quit buying from them, post-haste; it's hurting the country in the long run. Export and sell goods, sure, but anything we can make here we shouldn't buy there, and a little protectionism and insularity is good for the country. What does the US need from the rest of the world? Just oil, and only because we don't want to drill in the ANWR. If we don't need goods, we shouldn't be importing them, but placing such restrictions is unfree and makes people cry, so instead, tax the hell out of it. Make people pay for propping up hostile foreign nations. Maximizing exports and minimizing imports is the route to long-term profitability. CEOs only care about the quarterly financial statement, so they don't mind exporting jobs overseas and raking in the savings that come from a lower standard of living; the representatives of our government should be looking further ahead. This nation was not founded to support Mexico, China, and a few plutocrats.

I've talked about property tax before, and how most of it goes to schools and since I don't have anyone in school, I shouldn't have to pay that part of it; I wonder if there are any (non-retirement) communities that have resolved not to have schools, and so have drastically lowered property taxes? Of course (for all intents and purposes) not having children in the community means a lack of low-skilled labor too (think service industry), so I may have to rethink my cunning plan; perhaps it'll help to think of my subsidizing schools as actually facilitating child labor. Don't any of you read too much into this, either; that really annoys me. Just take it as my personal musings and leave me alone.

House update: the bids are in

News ·Saturday February 10, 2007 @ 16:59 EST (link)

We heard from our contractor yesterday that he has all his estimates (the last one he was waiting on was the carpet; the insurance is going to replace the master bedroom, and the other bedroom and the hallway carpet too), except for the permits fees; apparently Duvall City Hall is closed most of the time (my tax dollars at work no doubt). His total was about $44k (before tax, overhead, and the aforementioned permits), the adjuster's total was about $47k (but he was too low for the roof and the painting costs); the contractor is going to fax his bids to the adjuster, so hopefully it won't be long before they can start repairs. In toto, these are: We picked up an electric toothbrush (Oral-B Triumph) at Costco, on the recommendation of my dentist (I just went in for my bi-annual cleaning). I expected bleeding when I first used it, but there was none, so I guess I was doing a pretty good job brushing. We also started replacing some of our claimed items, picking up a door mat and laundry sorter. We still need to keep receipts so the insurance will pay the depreciation that they're holding back.

Microsoft Word COM dispatch rewrite

News ·Wednesday February 7, 2007 @ 20:20 EST (link)

I came up with two major Office 14 M0 (milestone 0) projects: one to remove our use of C's setjmp and longjmp (which were used as a poor man's exception; Word was only converted to C++ early in version 12, aka 2007), and another to clean up the object model dispatch, including allowing direct dispatch to Word object methods. The setjmp cleanup could have been trivially done by changing the jumps to exceptions, but that's not the Word way; they were all laboriously changed to return codes, propagated as far up as needed.

Word's object model begins with the GOD structure, or Generic Object Descriptor, a structure of pointers to useful information: first of all, the vtbl (virtual method table, containing pointers to all of the methods implemented by the interface), various other tables, and then the Generic, a structure that naturally became an object during the C++ conversion. The Generic implements the standard IUnknown COM methods AddRef, Release, and QueryInterface, as well as IDispatch, and various internal bookkeeping (for example, keeping track of "advise lists" so, for example, parents can be notified of child deletion and vice versa). It also stores a void pointer which user data can be hung off of, usually a reference to some internal Word structure. Care is taken so that when the item referenced goes away (for example, a document is closed), the object is notified and can mark itself deleted so that it doesn't try to use invalid pointers and crash.

There are several ways to implement COM interfaces; in fact, I wrote a work report about some of them for school, which received a Microsoft-sponsored award. The most common is probably to simply define the interface an an IDL (Interface Definition Language) file, and generate a C or C++ header with MIDL, the Microsoft IDL compiler. Word does have an IDL-type file, but it's not IDL, probably because it had an object model before IDL existed (I don't know, I wasn't there, but we do use our own tools), and we have our own compiler, OAC (probably Office Automation Compiler). In it, one can specify a handler for each method: either a specific function, or a generic handler, which is called in much the same manner as IDispatch::Invoke, i.e. with an array of parameters and flags, as well as method-specific parameters. Handlers are useful for forwarding interfaces to internal classes implemented elsewhere, or for wrapping commands (e.g. one class of handler saves the old selection, selects the object called on, runs a command specified by a handler parameter, and restores the selection).

However, there's a lot of duplicated code in function handlers; many functions extract the previously mentioned void pointer from the generic and invoke a class method; the compiler should be able to generate this code. So, I added support for a class_handler directive to OAC, which would dispatch COM methods to a similarly-named method in a given class, automatically casting the generic's user pointer to an object of that class:

Old:
interface IDShape
{
...
   properties
   {
      VT_FLOAT Width
      dispid 999
      get proc HrOamShapeGetWidth
   }
}

...

STDMETHODIMPC HrOamShapeGetWidth(IDShape *pidsp, float *pflWidth) { int fIDispatch = vrf.fIDispatch; int fObjModelCall = vfObjModelCall;

Generic *pgen = PgenFromPunk(pidsp); OASO *poaso = (OASO *)LpvFromGenericInstanceData(

HRESULT hr = poaso->HrGetWidth(pflWidth);

vrf.fIDispatch = fIDispatch; vfObjModelCall = fObjModelCall;

return HrRaiseExcepHr(pidsp, hr); }
New:
interface IDShape
class_handler OASO
{
...
   properties
   {
      VT_FLOAT Width
      dispid 999
      read_only
   }
}
And both need:
HRESULT OASO::HrGetWidth(float *pflWidth)
{
   *pflWidth = PtFromEmu(PspInternal()->flWidth());
   return S_OK;
}
(Some code facts and names have been changed, but it's a representative sample.)

You won't believe how many times the save/restore of the object model flag code and call to HrRaiseExcepHr (or variants) are repeated. That's one of the things that this new dispatch solves, by going through a common function, the new HrOaDispatch, rather than dispatching directly to the function in question (which didn't always happen; the old code had wrappers too, to setup undo, for example; it was very crusty). True, it does add the overhead of an extra call, but the common entry point makes it easier to ensure that calls are safe (for example, avoiding reentrancy from event callbacks). But getting direct dispatch to C++ methods was decidedly nontrivial.

Fortunately, I started with a fairly pathological class: the shape class, which has virtual bases (there are four combinations: old or new shapes, and inline or floating shapes, all inheriting from a common virtual base, and, for example, there is a "new shape" mid-hierarchy class that provides functionality for both inline and floating new shapes; a new floating shape inherits from the new shape and the floating shape class, both of which derive from a common base). If I can dispatch to this guy, everything else is easy.

To start with, we have to know what method we're dispatching. The old code did this with #defined stubs, but now with C++ we can use templates. What exactly do we put into the object's vtbl? The functional case is easy: just store the function pointer, although to provide a little more information (such as the COM class and method index, for other lookups), a template function is used that accepts these all as template parameters and passes them on to HrOaDispatch. HrOaDispatch then uses the information to figure out how large the stack parameters are for the final function, copies them to the stack (yes Virginia, in assembly), and calls the function, which, in usual stdcall fashion, cleans up the stack for us before it returns.

However, I didn't know at first how complex object model calls can be, especially with virtual bases involved. My first plan was to store the method address and then set up the stack as for function dispatch, and somehow call the method with assembly. Bad idea; the assembly dispatch code generated by the compiler is varied and complex. Instead I wrote a template to do the call: HrOaCallMethodC, HRESULT (C::*)()(C* pC, void *pStack, size_t cbStack), and stored the address of that templated function to use to dispatch the call to the C++ method (letting the compiler do the work of setting it), using #pragma pointers_to_members to ensure all virtual pointers were the same size as well as turning off runtime stack checking for that code (the compiler gets upset when a method that says it takes no parameters has actually consumed parameters).

This took a lot longer to figure out than it takes to write; one of the snags I faced was having to build a separate version of the precompiled headers (PCH) with the runtime checks disabled (disabling them for all of Word wouldn't be looked on favorably); figuring out a way to dispatch to a general method was tough too; there was a lot of casting and gnashing of teeth. But it's worth it to have cleaned up and improved some very old object model dispatch code.

OACR almost whacked

News ·Tuesday February 6, 2007 @ 23:47 EST (link)

I've mentioned OACR1 before; we're still working on Office 11 sp3 (Office 2003 service pack 3 to the folks at home); OACR analyzes source code and points out vulnerabilities (or possible vulnerabilities), such as buffer overflows, and we fix the problem if there is one (usually not, but catching even one exploitable overrun makes much of the hassle worthwhile), or suppress the warning with a comment (OACR frequently isn't intelligent enough to understand how buffers are being managed), or add an annotation or OACR_ASSUME to help OACR understand. It's a massive pain in the behind; such things are the reason God invented interns, but we don't have any right now so we're all pitching in until the muck is raked and we can leave Office 11 alone forevermore (only to get into Office 12sp1, which won't be as bad). In these cases, it would be great to leave the past in the past; we make all these improvements to the product, including to the architecture and the source code, and then we have to abandon them (or copy them all over). Arggh! (For instance, Word 2003 isn't even in C++; it's straight C, the C++ port was done early in 12.)

There are quite a few people in the world that aren't aware that Washington Initiative 957 is just a ploy by gays and sympathizers in their continuing quest to validate and legalize gay marriage. In a nutshell, the Initiative proposes that marriages that don't produce children within three years be annulled; they're aiming at those that oppose gay marriage because it can't result in procreation. It's silly because that's a stupid reason to oppose gay marriage, but they're hoping that people will see the initiative, oppose it, and "throw the baby out with the bathwater" as someone on ChatMS so elegantly put it. One might hope that people aren't that stupid. Haha.

[1] Generally pronounced "whacker" (which makes the headline make more sense), but at least one person pronounces it "ochre".

Perl Office suite generates first document!

News ·Wednesday January 31, 2007 @ 20:09 EST (link)

Driving home today, around 1910 on Avondale Road: silver Mazda sedan, plate WA 092 VMW is weaving drunkenly back and forth onto the shoulder, and generally acting lethargic when it was time to go. Not quite sure what drug he was on.

The Office series of modules that I'm developing has generated its first valid Word document today; AB, a Word file format developer, helped me work through a minor hiccup (which also helped find a minor bug), and then everything worked as planned. The new .docx format (and .xlsx etc.) are actually zip files, although that's just the implementation of the package; you can easily look inside. LW, a recent ex-Word developer who moved into the web applications group, was also experimenting with generating new Word documents on the fly, but using C# he already had the System.IO.Packaging layer, whereas I had to write that from scratch. Well, not entirely; I drew on a host of existing CPAN modules: Archive::Zip for the physical package, XML::SAX and a host of filters (one of which, XML::Filter::NSNormalise (sic.) I sent in a patch for and the author got back to me the same day) for parsing and generating XML, DateTime (DateTime::Format::W3CDTF for xsi dates), Params::Validate, etc.

There are probably about 20 modules in the Office namespace (off the top of my head: Pkg, Pkg::Part, Pkg::Rels, Pkg::Rel, Pkg:ContentTypes, Pkg::CoreProps, Document, Document::AppProps, Word::Document (the abstract document), Word::Document::Document (represents the word/document.xml part), Word::Document::Para, Word::Document::Run, SAX::Writer, SAX::Parser (parser helpers, I've been using ExpatXS as my SAX parser of choice and Writer for output). And I've barely started—I can only write basic paragraphs with bold and italics. But this is a big step—adding other properties and part handlers will be incremental. Already it's a usable suite of modules, although I hope to get it to a somewhat more mature form before I make a release (I've registered the Office namespace in preparation). Sample working code, does what it says:
use Office::Word::Document;

my $docx = Office::Word::Document->new;

$docx->add_para('First paragraph.');

my $p = $docx->add_para('This second paragraph has some '); $p->add_run({ bold => 1 }, 'BOLD TEXT')->add_run(' in it.');

$docx->save('test.docx');
Doesn't do much yet, but watch this space, and watch for an alpha release coming soon. Note: This is not an officially supported Microsoft product; I'm doing it on my own using publicly available specifications. Right now I'm defaulting the Company property to Gippazoid Novelty; I'm debating leaving it in, and seeing how many documents show up with it set like that!

The pH (think acidity) markup language, an invention of mine which is basically just a more concise form of XML, which I use to write this log, among other things, has undergone the first change in a long time. Like perl, the definition of pH is in its single implementation, a perl XS C++ module called pH::Parser (no, it's not on CPAN, since it's not general enough, although that never stopped anyone else). pH is also my local wiki (here, it's a fairly old quick hack), which is about to get a big upgrade (for the Word development internal Wiki, but I'll port it back here).

To summarize, the pH markup language is XML without the close tags, or other unnecessary baggage, e.g. instead of <element attribute="value">some text</element>, it's <element attribute=value some text>. The equivalent of CDATA is << ... >>. Computer scientists have probably already noticed a few seeming flaw in it. What if your text begins with name=value? Well, you can escape the = as \= (and <, >, and & similarly), but that's annoying to check for in generated text (although it could be just auto-escaped along with the other markup characters). But the addition is to allow = as a lone pseudo-attribute which enforces the end of attributes for that element, e.g. <element a=b c=d = a=1 whenever b=2>. But, I also decided this was all somewhat silly (close tags are only a few bytes, and the expansion takes time, and there were other logistical problems getting pH expansion into the right place in the processing chain), and am primarily sticking with XHTML for the new wiki templates.

Back in reality-land, we're still waiting on the insurance (they're working on their estimate with the contractor, who thinks they're lowballing it a bit, and the contractor is getting more estimates to prove it). There may be some more (mainly cosmetic) damage downstairs&mdashlsome ripples in the ceiling and some nail pops. And I have a dental appointment (bi-annual clearning) tomorrow, fun.

Honey gave me a Leatherman tool and knife set for my birthday, and a nice card; we went out to eat on the day (yesterday), at a local Teriyaki-Sushi place (former for her, latter for me). One of the new GPM developers at Hilton wished me happy birthday—apparently I'd left my birthday in the code somewhere (in a test, I think, although I don't remember noting that it was my birthday; Honey's was there too). The spirit was nice, the English was a little broken. I don't remember Bob mentioning him, but apparently he's working out alright, which is nice after the hordes of idiots that have been paraded past them by the headhunters.

Next: designing the Office modules, and the new pH wiki (yes, I overloaded the name a little, it's short and succinct and fairly meaningless and I like it), and a little on the new Word COM dispatch. First, why I built my own: most of those out there are file-backed (ick, use a database, I'm using PostgreSQL but the layer is fairly flexible), or in PHP (a filthy language), or don't do revisions. It's definitely time for a good technical article.

15000% return on investment

News ·Tuesday January 23, 2007 @ 02:04 EST (link)

The snow finally left. Yay. Melted away to nothing. Our icy street, which some of the dimmer neighbors were sledding on, is clear again. And the tree at the back that got almost knocked over is still tied to the nearby rock and smaller tree and will probably recover. A smaller tree at the side also got knocked slantwise, but is being propped up by a log from the tree that fell (it's the least it could do). The rest of the tree has been removed from our yard; one of the trees near the fall point did have a main branch sheared right off, but another one right by the gap in the fence escaped almost unscathed. The rest of the tree remains for the neighbors to clean up; it's pretty huge in diameter, they're supposedly looking at some pretty whacked-out estimates and I don't think their insurance is covering it (since it didn't damage their house). To be honest, I don't really feel all that bad for them.

You're probably wondering about the title, or maybe you've figured it out by now: the ROI is for our homeowners insurance; we paid about $400, and the estimate for the tree removal, interior replacements, temporary repairs, and rebuilding work is about $60,000. The windstorm actually happened on our policy renewal date, so technically we'd been paying two years (and if you want to go that far, we'd also had a policy while living in our various apartments) so it probably comes to more like 5000%, which is still not too shabby.

However, to add insult to injury, our hot water went out last Thursday; we called Puget Sound Energy, they'll be sending someone out Tuesday (thanks). We showered in cold water (invigorating and then some), but I decided to hold off on shaving, although I suppose boiling water's not too much trouble. I took the cover off the heater Friday (when the stored water ran out; I'd noticed it being a little cool Thursday but not thought much of it); the pilot light was out; I re-lit it, but it didn't stay on; most sources seem to think the thermocouple's gone (or possibly dirty, but I tried to file it and no luck).

Snow stays in Duvall

News ·Sunday January 14, 2007 @ 15:10 EST (link)

I haven't seen snow stick around this long since Boston, or perhaps Canada; piles of the wretched stuff are all over the place. The roads, fortunately, are fairly navigable, with our street being the worst part of any trip.

I've been at work all week (remotely Wednesday, waiting for the no-show structural engineer), working on "OACR" bugs for Office 11; OACR is the Office Automated Code Review tool which finds things like potential buffer overflows or use of unsafe functions. Its error messages are cryptic and mercurial, but I'm plugging away through all 500 or so bugs that I've been assigned (others on the team will probably take some too). On Friday a few of us got together to talk about enhancing collaboration on Word documents—from making it easier to collaborate via email to Word as a wiki editor.

Speaking of wikis, I'm designing a new internal wiki for Word developers, based on my pH wiki: Apache 2, mod_perl (the wiki is structured as a response handler), Template Toolkit for formatting, and PostgreSQL for storage, and Subversion for (page) versioning (I'd use our Source Depot, but the layers of bureaucracy to get a wiki project added would be piled high and deep). Some criteria for it are on the NewWiki page on the old wiki. I may borrow some HTML templates from the MoinMoin wiki, since it looks pretty but unfortunately uses flat text storage (stupid, stupid, stupid!) so search is pathetic.

I was working on the new wiki remotely Saturday morning, installing some perl modules, when something caused a shutdown (not a reboot; it never came back). I drove into work at 0330 and restarted the machine, and then at around 0800 it happened again (I tried shutdown -a to abort it, but it was too fast), so I went to sleep and drove in when I woke up. I'd disabled the shutdown permissions for everyone except the local administrator account, but it didn't take effect until after a reboot. Also one of the perl modules was exec'ing ps in one of its tests, which lists processes under Unix but for us runs Product Studio, our bug database software. Finally, another module used variadic macros, which aren't supported on Visual C++ .NET (they are in 2005, but that machine needed to have .NET for compatibility), so I had to convert the macro into an inline function. Also, pH::Parser had to link msvcprt.lib rather than Unix's libstdc++.so to get non-inline C++ library code. But now things are looking good; database tables have been created; mod_auth_sspi is picking up the username; Template Toolkit is working, with a pH parser filter; soon people will be able to edit pages.

On Friday, I followed a white GMC Sierra truck most of the way home (Novelty Hill onward); A87522X; slowest driver I've ever seen, rode the brake all the way down Novelty Hill, never got above 5mph. It had snowed a few days before, but the road was pretty much clear. I started out in a long line of cars, but by the time this slowpoke got to the bottom of the hill, there wasn't a car to be seen in front of him.

Snow comes to Duvall

News ·Thursday January 11, 2007 @ 22:26 EST (link)

Off the wall: Catholic church is suing ICE for... doing their jobs (in this case, raiding a meat-packing plant looking for illegals). Unfortunately I can't find a link for it, so take with a grain of salt; however, if the Catholics are getting involved in politics, it's high time to take away their 501(c)(3) (charitable organization) status, especially since they're just doing it for the money and power (most Mexicans are Catholic, and are easily manipulated by Catholic priests since they've been brainwashed by that church all their lives). In searching, though, I did find this interesting blog and an article about the raids.

And then there was the illegal alien who claimed he only spoke Mayan so proceedings were halted to find him an interpreter. Time to make English the a national language, and you can get your own interpreter, and if you can't afford one, we can sentence as if it were in absentia.

January 3: Paid off the tree company (Alpine). I caught the Alpine "credit card guy" on the road, so he called back later to arrange payment.

January 4: Case Engineering called; Honey called back, arranged for him to be here on Wednesday at 1500. Called our mortgage company about the claim so they could fax me some forms that they'd need to release the bulk of the repair funds to us.

January 5: We heard we were going to get snow, so Jim Cameron came by again and strengthened the roof, putting up some beams and temporary trusses, and stacking some 1x4s on the roof to keep the tarps up. He also nailed the tarps down with 2x4s, since the last wind gusts had ripped the grommets out of the tied-down tarps. He also provided a heater for the room and removed most of the fans and dehumidifiers.

January 6: Watched the M*A*S*H original movie (MythTV, of course); not too bad, but Adam Alda is a much better Hawkeye than Donald Sutherland, especially with that annoying whistle. Honey worked today (got a job through a temp agency); might have gone longer (she was covering for someone that was trying to fly out for a funeral) but it was only to be the one day.

January 10: Cable (and hence Internet and phones) were out from 2130 until 0930 in the morning (I wrote a script with Net::Ping to beep when connectivity returned). The structural engineer from Case called about half an hour before he was due to arrive and canceled, rescheduling to next Tuesday. We wish we could've gone with Jim's engineer, but MetLife is forcing us to go with Case Engineering.

January 11: Saw some cracks in the kitchen/living room ceiling near the central supporting pillars; looks like just paint, tree damage further stressed by the weight of the snow. Doesn't look too serious. Thought I heard some snow and ice fall off the roof in the morning (loud rattle like someone dragging a ladder). A picture in a frame in the living room slipper down.

<Previous 10 entries>