Windows installer [sucks]

So, for whatever reason, Windows Installer service doesn’t just install crap. Instead, it runs through all of the steps to an installation in some kind of imaginary sandbox thing and then it runs everything again on the live system.

Sure, all of this is probably well and good. You don’t want to be halfway to rearranging some filesystem only to decide that you need to roll back. If only it worked that way. When it does its practice install, it doesn’t actually write files or twiddle IIS or any of those fun sorts of things. Nope. It just pretends. Except for when it doesn’t.

Because if you want to schedule features or components for install, this needs to be decided in the practice stage. Also, if you want to set properties to be used in a later custom action, you need to do this here.

But then, explicitly, you cannot reference these properties in the second, live run. Why? Because it’s Microsoft?!

No, in order to get a reference, you need to dump them into a for-special place and then use a different, for-special mechanism for retrieving them.

It just doesn’t get much stupider.

Hub ‘n’ spoke hilarity

I love the ol’ hub and spoke paradigm [1] for transporting things places. I mean, seriously, it is the most efficient methods of routing in that all points can be connected with the (number of points) minus one routes. All points can be reached in no more than two jumps. Totally efficient.

Except when it isn’t. For example, a shiny bauble I ordered is being shipped from Commerce City, CO (Denver) to Council Bluffs, IA. The shipping manifest so far looks like this:

Location Date Time Activity
Des Moines, IA, United States 05/30/2014 11:15 A.M. Arrival Scan
Omaha, NE, United States 05/30/2014 8:41 A.M. Departure Scan
05/30/2014 7:18 A.M. Arrival Scan
North Platte, NE, United States 05/30/2014 3:17 A.M. Departure Scan
05/30/2014 2:19 A.M. Arrival Scan
Commerce City, CO, United States 05/29/2014 9:35 P.M. Departure Scan
05/29/2014 7:24 P.M. Origin Scan

Now, then, the damn thing passed through Omaha at roughly the same time I was driving to work. I probably passed it on the Interstate. Council Bluffs is exactly the same thing as Omaha as far as UPS is concerned. Dump the damn thing off the truck here and get it on a delivery vehicle so I can play with it!

Instead, it traveled on to Des Moines. It’s probably on its way to Kansas City now, from which it will be shipped to back to Omaha where it will be removed from the truck this time and delivered to me. Hopefully. Perhaps it will make yet another trip around the Midwest first. Or maybe it will go off visiting the Southeast. I hear it isn’t too humid out that way yet.

All of this is really just a whinge because I want my shiny bauble now, not Monday. Why couldn’t they have just thrown it off the truck while it was here? If it was just passing through, don’t tell me about it on the package tracking page.

[1] https://en.wikipedia.org/wiki/Spoke-hub_distribution_paradigm

Victory

After several iterations of arguing the denials of my request for lxml to be installed as a Python egg, my web host finally acquiesced.

I think I’m going to print this out and get it framed:

Hello,

I apologize for the delay. We were able to install this for you:

xxxxxxx@xxxxxxxx.net [~/lxml-3.3.5]# CFLAGS=”-O0″ easy_install –install-dir=/xxxxx/xxxxxxx/xxxxx/xxxxxxx/python2.6/site-packages lxml
Searching for lxml
Reading http://pypi.python.org/simple/lxml/
Best match: lxml 3.3.5
Downloading https://pypi.python.org/packages/source/l/lxml/lxml-3.3.5.tar.gz#md5=88c75f4c73fc8f59c9ebb17495044f2f
Processing lxml-3.3.5.tar.gz
Running lxml-3.3.5/setup.py -q bdist_egg –dist-dir /tmp/easy_install-qdMwRH/lxml-3.3.5/egg-dist-tmp-bZ_ZZT
Building lxml version 3.3.5.
Building without Cython.
Using build configuration of libxslt 1.1.26
Building against libxml2/libxslt in the following directory: /usr/lib64
/usr/lib64/python2.6/distutils/dist.py:266: UserWarning: Unknown distribution option: ‘bugtrack_url’
warnings.warn(msg)
Adding lxml 3.3.5 to easy-install.pth file

Installed /xxxxx/xxxxxxx/xxxxx/xxxxxxx/python2.6/site-packages/lxml-3.3.5-py2.6-linux-x86_64.egg
Processing dependencies for lxml
Finished processing dependencies for lxml
———————————————-

A two-fer

A banner day for overhearing in the cube farm:

  1. [That guy] must get offended at the very idea of a functioning system

  2. In re the Winter Classic

    Next year they need to go the next step and play that on an actual pond

I think watching two NHL teams battle it out that way would probably be transcendent. No boards and no bleachers. Just two teams, an open pond, and about a billion television cameras.

Funner than it looks

A thing I’m working on is supposed to interact with a Scheduled Task [1] if it exists. Instead of writing out my own parser for this backwater of the Windows operating system I found something lying about at CodePlex [2]. As far as documentation goes, this one is pretty decent [3]…for a CodePlex project. Then again, that bar is pretty low.

So this afternoon has been brought to you by the method Console.WriteLine()

Don’t know what a thing does? Console.WriteLine( THING ) is great. If it’s a string, it’ll tell you what it represents. If it is something else, it’ll give you a clue as to how that method/object reference is employed. It’s nowhere near as cool or useful as Python's dir() [4] which is what I was really jonesing for this afternoon. Still, half an hour of iterating over Console.WriteLine( THING ), compile, run test executable made quick work of finding a solution.

Eventually I found Microsoft.Win32.TaskScheduler.Task.Definition.XmlText and this all the bait I need to make this an XML-based solution. Why use an object wrapper with moderately unhelpful documentation when you can just do a simple XPath operation? Pretty sure about half of the solutions I come up with eventually dump into XML and then leverage XPath. It is the very best hammer because it can turn virtually anything into a nail.

[1] http://msdn.microsoft.com/en-us/library/windows/desktop/aa383614%28v=vs.85%29.aspx
[2] http://taskscheduler.codeplex.com/
[3] http://taskscheduler.codeplex.com/documentation
[4] https://docs.python.org/3/library/functions.html?highlight=dir#dir