Thursday, December 28, 2006

Want to buy a cheap scanner?

UPDATE: Sold through the magic of craigslist!

I used my cache of Christmas gift Best Buy cards to buy a new printer (an HP Photosmart 5180) to replace my trusty Epson that died after 8 years of faithful service. This one is super fancy n' junk. It's an all-in-one, so there's a scanner built in. That means I no longer need my minimally used HP Scanjet 2200c (see the specs here and here)

Everything you need is here. You get the scanner, power cable, and USB cable. The software and drivers can be downloaded here. According to HP's site, it should work with pretty much any USB-equipped computer running a version of Windows from the last decade. This is not a super high end scanner, but does a good job of scanning photos and a fantastic job of scanning documents for archival or copying purposes.

$25 firm. Cash only. Local buyers only. You agree to meet in or near the Eagan or Lakeville area (where I live and work, respectively) to pay and pickup. Why so many stipulations? Because I'm not desperate to unload it. Just looking to reduce my clutter and keep a good scanner from collecting dust in a closet. If I can't find a buyer, I'll just give it to a friend or family member (man, I'm a demanding salesperson).

Saturday, December 16, 2006

Questions on embedding MP3's in a web page

March 12, 2008 UPDATE:

I'm not sure if this option was available when I wrote the original post (see below), but now Blogger makes it extremely easy to embed RSS and iTunes friendly references to media files in posts.
  1. Go to Blogger's Dashboard.
  2. Click the Settings link for the blog you want to change.
  3. Click the Formatting tab.
  4. Scroll down to Show Link Fields and select Yes from the dropdown.
  5. Create a new post (or edit an old one). You should now see a Link field and Add enclosure link.
  6. Click Add enclosure link. An Enclosures section should appear.
  7. Under the Enclosures section, enter the URL to your MP3 or other media file. Blogger should automatically populate the value for the MIME Type field when you tab to (or click on) the next field.


I'm playing around with podcasting (not really in the true iTunes sense yet, just embedding the file a blog entry) and am looking for information on how to prevent <embed> tag from automatically downloading the file. The idea is that I don't want my blog home page or archive pages that have multiple audio posts on them to take forever to load because they're downloading 4 or 5 MP3's. I know you can prevent the file from playing automatically, but I also don't want it to start downloading the file until the play button is pressed.

For that matter, perhaps <embed> is not the right solution. Is there a decent free flash player that anyone has experience with? I tried a few that I found via google, and wasn't too happy with them. Free is key. I'm hosting my MP3 files at OurMedia. Ideally the flash file itself would be a hosted situation, but I suppose I could find a free web host if it was something I had to download and host myself.

Another solution I'm considering is kind of workaround. Blogspot doesn't let you include javascript in your post html, but you can include it in your layout template. So I thought about assigning a specific id or class to the direct link I include in each audio post. e.g. <a href="" class="blogcast" >. The javascript would search each page for all links of class "blogcast" and prepend that section with a play button that when pressed would call a javascript function that would replace the button with the embed tag set to automatically play the file. Whew! Seems convoluted, but my attraction to that option is that it keeps things free. I'm cheap like that.

Extended warranties--sometimes it's worth it

Usually I poo poo the whole extended warranty thing, but in the rare cases I've caved to the extended warranty pitch, I seem to have had the strangest luck with picking the right products. When I bought a brand new NordicTrack Summit 4500X treadmill from Sears a little over 4 years ago, I didn't balk at the extended warranty because unless you think you'll use it a few times then hang laundry from it, that is the exact sort of product that seems like a prime candidate for shelling out for added coverage. If it's a decent brand, they'll usually cover the motor for the life of the product, but there are so many other potential mechanical and electronic failure points on treadmills. The display and controls, the incline motor, the belt rollers, on and on. Now take about 200+ pounds of a slab of pasty beef like me slamming against it for 5+ miles a day several months out of the year, and that treadmill is getting some serious use and abuse.

I figure in the time I've owned my treadmill, I have easily run close to 2,500 miles on it, if not more. So color me impressed that the thing didn't need a warranty repair until about a year ago when the belt started slipping to the point I couldn't tighten it. They came to my house and fixed it, no hassle, no fuss. A little over a month ago, the belt slippage situation happened again. This time the technician informed me he would have to replace the entire belt deck. Yikes! It took a few weeks for the parts to arrive, then a week or two more before he could show up again to make the repair. But he fixed it, and it now works like a champ.

Last Thursday, the day after my last repair appointment, the technician called me to essentially say, "Oh, by the way, I forgot to tell you that I noticed your treadmill's frame is cracked. That is not a repairable defect, so I emailed the company, and they will be in touch with you about giving you a new treadmill." Nice!

Tuesday I arrived home to find an UPS express letter from Icon Fitness propped against my front door. It contained the form I would need to request my replacement and a letter explaining that I needed to go to their website, pick a new treadmill from any of their brands, and call them to check the stock before mailing in the form. Ugh...seems very 20th century, but whatever. I was given a budget of 1,499.99 (and I won't be charged tax or shipping and handling), as that is evidently what I paid for the first treadmill (I don't recall paying that much, but I wasn't about to argue).

Since the tread I own is a NordicTrack, and I was quite pleased with it, I decided to go with a another of their models. I went to the website, and they had suggested retail prices and "web only" prices. I wasn't sure which price was going to count against my 1,499.99, so I called the warranty company and left a message (it's nearly impossible to get through to a live operator, even waiting on hold). Last night one of them called me back, and fortunately, it sounds like I can go by the web only price. He also told me that when I picked something out, give him a call, and he'd give his honest opinion on the product. Boosting his credibility, he told me straight out, "Don't bother getting any of the models with a flat panel tv built in. We've had a lot of problems with those." A tv wasn't going to be a selling point, but that was good to know.

Right now, I plan on getting NordicTrack Elite 2900. Retail is $1999, and the web only price is $1499. Perfect! I left a message yesterday for the very helpful Icon Fitness support rep, and he called me back, gave it his thumbs up, and said they have it in stock. I faxed them the form last night and will follow up with a phone call Monday (I faxed them the form via a web to fax service I've never used before, so I want to make sure they got it).

Thursday, December 14, 2006

The HDTV hunt continues

I stopped by Ultimate Electronics in Burnsville on the way home from work tonight to get a gander at a few more HDTV models. I was pleased to see they had one of the new Samsung HL-S5679W units on display. It's a 56 inch LED-based DLP rear projection. LED in DLPs is quite new. I was excited after reading about it because the LEDs are supposed to last for 20,000 hours. That's 6+ years if you watch 8 hours of tv every single day. The CNET review I read of this one raved about the color reproduction, but knocked off points for poor black levels and a "hot spot" or a spot on the screen noticeably brighter than the rest. Well now I've seen one in action, and sitting next to a Toshiba and a JVC bulb-based DLP, the Samsung's picture was underwhelming to say the least. The brightness was extremely uneven. I stooped down, looked from different angles, and tried every which way, but could not get a good viewing angle on the thing. Not impressed. So draw a line through that option.

NuVision, evidently a relative newcomer in the states in the tv market, also has an LED-based 52 inch DLP, but I have yet to see one in action for myself. I've heard good reviews on this model, but I'm hesitant to drop 4 digits on a first generation product from a company whose history of quality I'm not familiar with.

One thing I got out of my window shopping tonight was that some of the other tv models that haven't rated all that great in CNET's reviews looked just fine to me (I'm reading other sites, Consumer Reports, but I just trust CNET more on consumer electronics reviews--they are picky, but not ridiculously so like some hardcore videophile reviews). I also loved the picture on the Samsung 1080p LCD flat panels and was blown away by the picture on the Sony flat panels. But those sell at a premium.

Time will tell. Soon, my pretties. Soon.

Sunday, December 10, 2006

In the market for an HDTV

I've decided the time is nearing to upgrade my 27-inch old school CRT television to something more 21st century. Granted, I briefly owned a 50 inch rear projection DLP HDTV about 4 years ago, but severe buyer's remorse guilted me into returning it. DLP HDTV's were relatively new at the time, giving the unit a price tag north of $4,000. The moment I got home with it, I realized that spending that much money was not a prudent decision at the time, nor was it smart to buy an HDTV without fully understanding all of the available options and technologies.

This time, however, I'm prepared. I'm up to snuff on the technology (or so I think). I'm reading reviews and comparing prices online. I've stopped by stores to see display models in action. I also have a pretty firm budget. Here are my criteria and nice-to-haves:

-50 inches or larger.
-Must be 1080p and have at least 2 HDMI inputs that accept 1080p/60fps (I'm aware that 1080i vs 1080p makes little difference for movies and tv at 24fps, but I foresee using the tv for gaming from my PC)
-Built-in QAM/ATSC highly preferable, but not required.
-CableCARD nice, but not required.
-$3,000 or less.

I had originally decided on buying either the Sony KDS-60A2000 ($2200+) or the KDS-R60XBR2 ($3000+). Both are 60 inch rear projection LCOS models. The former has 2 1080p HDMI inputs, while the latter has 3. The latter also has an updated LCOS engine, a slightly brighter picture, and comes with a replacement bulb.

Every review I read said the picture on both models was essentially the same as the other, save a glitch or two in earlier production models of the KDS-60A2000. While the KDS-R60XBR2 had a brighter picture, it was not significantly brighter. There was also the somewhat shady issue where Sony took the unusual step of not providing a life expectancy on the projection bulb for the newer model. Is that why they provided the extra bulb? Is it going to fade out in a year, sticking me with an annual $300 bulb replacement bill? Nuts to that! So I decided on the KDS-60A2000. It's been around a while, and is proven technology.

Then I read in several forums about color uniformity and other issues that have popped up with the KDS-60A2000 after a few months of use. Some people had it, others didn't. But it was enough to give me pause. Then I thought if that was the case, perhaps the newer model was a better choice. But will people be complaining of the same thing for that one a few months down the road? Then I began thinking about the issue of bulb replacement. The thought of having to dole out a hefty $250-$300 on a bulb every 2 or 3 years dimmed the appeal of a rear projection model, despite getting massive size for the buck.

It also occurred to me that in the next 2 or 3 years, I'll probably want to buy at least one more HDTV to replace the one I watch while running on my treadmill. Perhaps going smaller and getting a plasma or LCD model is the way to go. 40 to 50 inches now, and 3 years from now, I'll probably be able to get a 70 inch or larger LCD or even OLED for the same price, if not cheaper. Ok, back to square one.

After several evenings of additional reading and research, I now think I've settled on the Samsung LNS5296D. It's 52 inches, has a 6000:1 contrast ratio, an 8ms response time, 1080p over the VGA input and HDMI inputs, and all of the other goodies I need. Some over at have complained of its overscan, but I can't say I'm personally all that concerned about it, though I will definitely try to see one in action in a store before purchasing one.

The downside? Currently the cheapest price I could find from a reputable online retailer was over $3500. But I'm not in a hurry. I'm optimistic that prices will come down in January. After Christmas and before the Superbowl is a prime time for tv purchases, and retailers will be trying to lure men into getting something to watch the big game on. For me, I'm not terribly concerned about the timing. If the prices and features aren't in line with my requirements, then I'm willing to wait a little longer.

Wednesday, December 06, 2006

James Kim

I wanted to comment on sad news of the discovery of the body of James Kim. You may have been following this story in the national news lately. He, his wife, and two young daughters became stranded in the Oregon wilderness while returning home from a Thanksgiving trip. Finally this past Saturday, he left them in a desperate attempt to find help. On Monday, his wife and children were rescued, but the search for him continued.

Kim was a senior editor for, a computer and consumer technology news and review website. He wrote regular reviews of digital music products and appeared regularly in vlog postings to CNET's sister site Crave. He also appeared each week in a segment broadcast to Tivo subscribers.

I had come to enjoy Kim's writings and appearances and trusted his opinions on digital entertainment products. Such an offhand and indirect connection seems trivial, but today's news hit me like a punch to the gut. I feel terribly for the wife, baby, and 4 year old daughter he left behind.

It's amazing the bonds we sometimes unknowingly form with people we've never met or likely never will meet. Perhaps that's why the community of bloggers seem to huddle together. We somehow feel involved in each others lives (and in some cases actually do become involved). When one of us feels joy, we celebrate with them. And when one of us suffers tragedy, we feel as though it were happening to a friend or family member. So here's to James Kim. He will be missed.

James Kim found dead

Sadly, reports are coming in that CNET senior editor James Kim has been found dead days after he left his stranded family in search of help and the subsequent rescue of his wife and daughters.

Full story at CNN

Friday, December 01, 2006

UPDATED: CNET senior editor James Kim and family missing

December 4, 2006 UPDATE: Kim's wife and children have been found safe and have been transported by helicopter to a hospital. James Kim evidently set out on foot 2 days ago to seek help for the family, but has not been heard from since. Find the latest here and here.

If you keep up with a lot of the tech sites and blogs, you may already have run across this story today, but James Kim, a senior editor with CNET, has gone missing along with his wife and two daughters during a road trip in Oregon. For more information on the story and info on how to provide tips to police, see the full story at

I very much enjoy Kim's appearances and postings on CNET and Crave, as well as his review segments on the 15 minute episodes of "'s tech tips and reviews" available through Tivo's subscription service. I hope they are found safe and sound.

San Francisco Police Department's missing persons flyer

Thursday, November 16, 2006

Mystery of the missing wsdl stub class: another clue(?)

As previously bemoaned here and here, I ran into a problem with ColdFusion failing to generate and compile all of the necessary java classes from Netsuite's wsdl when invoking a new web service object. Meanwhile, I run wsdl2java from the command line, and get each and every one of the 500+ java source code files from the wsdl.

Tell me, is Netsuite's wsdl really so complex that ColdFusion misses some of the class files? I find that very hard to believe. In any case, one of my coworkers today discovered that ColdFusion seems to come with two copies of Apache Axis, which includes the wsdl2java class. Apparently axis is not only in [cfusion install]/lib/axis.jar, but is also mixed in with other packages in [cfusion install]/runtime/lib/webservices.jar. So that makes me wonder if ColdFusion is using the version that I was not calling from the command line. I think it warrants a little test. Hopefully I'll get a chance tomorrow. I'll post my findings here.

UPDATE: I actually found a THIRD place where wdsl2java exists in the CF installation. I was able to test two of them, but both generated all of the java source files. Curious indeed.

Friday, November 10, 2006

Preventing ColdFusion from recompiling web service stub classes

UPDATE March 8, 2009: Since this was first posted, I verified that the incomplete stub file compilation issue appears to be an issue in ColdFusion 8, as well. I haven't tested it, but I have no reason to believe that the workaround described below wouldn't work in 8.

As I have been for the past few months, I'm currently working on an interface Netsuite via their web service. As posted here previously, it's brought up a few interesting challenges using ColdFusion. One annoyance was that following a ColdFusion service restart the next call to the Netsuite web service would take for-friggin-ever. I figured out it was because ColdFusion was refreshing and recompiling the stub Java classes generated from Netsuite's very deep and complex WSDL. Their WSDL results in over 500 distinct class files. From my local machine on which I was developing the code, it would take 5 to 10 minutes. When you're testing, screwing things up, and restarting ColdFusion regularly, this gets to be more than a little tedious.

I looked online to see if I could find any information about preventing ColdFusion from refreshing the stub classes, but no dice. I could only find information about how to force it to recompile. Not what I wanted. But perhaps someone out there knows of a server setting or some sort of parameter to prevent refreshing from the WSDL.

Now you might ask why I wouldn't want to make sure I have the latest and greatest from Netsuite. The problem is that for some unknown reason, ColdFusion refuses to generate and compile all of the necessary stub classes, so I can't rely on that process to get me everything I need. Perhaps the WSDL is too nested and complex? But that doesn't make sense because ColdFusion (I would presume) is using wsdl2java, which comes with Apache Axis. So why when I run wsdl2java from the command line does it successfully generate each and every java source file? I'm still scratching my head over that one. In any case, to ensure I had all necessary stub classes, I manually ran wsdl2java and compiled all of the resulting java files into class files from the command line, then whisked them away into a jar file that I dumped in the \CFusionMX7\lib directory.

Once I figured that the delay after the service restart was due to the stub classes being refreshed and ruled out preventing it with server settings or parameters, I realized I could simply avoid creating a ColdFusion web service object entirely by directly creating a java object from the stub classes. Unfortunately, the renders useless some of ColdFusion's handy functions like getSOAPRequest and getSOAPResponse.

<!--- Create a plain old coldfusion web service object (could also do a cfinvoke).---> 
<cfset ws = CreateObject("webservice", "")>
<!--- call some function from that web service --->
<cfset ws.MakeSomethingHappen()>
<!--- dump the entire soap request --->
<cfdump var="#getSOAPRequest(ws)#">
<!------ --- ----- ------ --------- ------------- --->
<!--- Create an equivalent java object directly from the service locator stub class (the class name "[web service name]ServiceLocator" and method "get[web service name]Port()" will be what to look for; i.e. NetsuiteServiceLocator.getNetsuitePort(), MyWebServiceNameServiceLocator.getMyWebServiceNamePort(), etc) --->
<cfset ws = CreateObject("java", "com.netsuite.webservices.platform_2_5.NetSuiteServiceLocator").getNetSuitePort()>
<!--- call the same function from that web service as the previous example --->
<cfset ws.MakeSomethingHappen()>
<!--- dump the entire soap request (it's a little messy, but you can always write your own udf that returns the same thing)... --->
<cfdump var="#ws._getService().getCall().getMessageContext().getRequestMessage().getSOAPEnvelope().toString()#">
<!--- ... or dump only the request body --->
<cfdump var="#ws._getService().getCall().getMessageContext().getRequestMessage().getSOAPBody().toString()#">

Thursday, September 07, 2006

ColdFusion and Netsuite, a cautionary tale

This post is about Netsuite's web service, but perhaps you've run into similar issues trying to use other web services in ColdFusion. For several weeks, I have been working on a project to integrate a ColdFusion-based system with Netsuite through Netsuite's web service. Netsuite's documentation for the web service is somewhat spotty, but I now realize it was not as entirely inaccurate as I had thought. Here is a somewhat simplified breakdown of the issue.

-When first creating an instance of a given web service using CreateObject("webservice", http://url.of.wsdl), ColdFusion generates stub class files using Apache Axis' wsdl2java. However, I found that not all of the java class files I needed were being compiled. For example, a class file was never generated for CustomerAddressbookList or SearchMultiSelectField. I would try wiping the stubs directory, restarting the ColdFusion service, and running the code to create the web service object again with the exact same results. At first, I compensated by using javac to compile the missing class files myself, however other issues popped up such as...

-Calls to several methods in certain classes like Customer and CustomerSearchBasic would complain about the datatypes of objects being passed to them. For example, according to the source code in and Netsuite's own sample code, the setInternalId method in CustomerSearchBasic expected an object of type SearchMultiSelectField. However, running Ben Nadel's useful function to return all of the exposed methods and expected datatypes for a given class showed that CustomerSearchBasic's setInternalId method was actually expecting a RecordRef object. See a more detailed example here.

-Further adding to the confusion, if there are references to SearchMultiSelectField in CustomerSearchBasic, and a class file for SearchMultiSelectField was never compiled, how on earth is CustomerSearchBasic compiling without failing completely?

Finally at the end of my rope, I write a script to compile all 397 individual source code files generated by wsdl2java. Lo and behold, that fixed it! Suddenly all of my previous problems were gone, all of the methods were accepting the documented datatypes, and life was good.

But there are still some open questions. Namely, what the heck was that all about? How did some of these classes compile correctly if other classes they referenced hadn't been compiled at all? What happened that changed the datatypes expected by so many of those methods? Is this an issue with ColdFusion? With Apache Axis? If you've run into similar issues connecting to web services using ColdFusion or have any insight into what could have caused this, I'd love to get an earful.

Monday, August 28, 2006

Netsuite, ColdFusion, Java, and a lot of gray hair

Ok, so I'm more likely to lose my hair over this than have it turn gray, but I'm working with creating a ColdFusion interface with Netsuite's web service. I'm running into the source of a common complaint from other developers trying to use Netsuite's web service: the documentation is spotty, and what is available is often outright wrong, leaving us to a maddening cycle of herky jerky trial and error. Some of my issues have been solved handily by Netsuite's support staff through their user forum and a conversation with one of their engineers, but this one is particularly puzzling and troubling.

Here is a paraphrased version of an issue I posted in the Netsuite support forum (note that I had moved to writing the code directly in Java since most of the sample code in the documentation is in Java, and I wanted to ensure my problems were not ColdFusion-specific). If you have any ideas, I'm all ears, but if I find or am given a solution, I will be certain to post it here.

I'm trying to write what I thought would be a simple search that will return all of the subcustomers of a given customer. I'm trying to get my feet wet with the following Java sample code from page 91 of the Platform Guide. I'm using the 2.0 wsdl, and the Platform Guide document I'm reading also says it's for 2.0.

RecordRef[] rr = new RecordRef[] {new RecordRef("1", Recordtype.customer), new RecordRef("2", RecordType.customer), new RecordRef("3", RecordType.customer)};
CustomerSearchBasic customerSearchBasic = new CustomerSearchBasic();
customerSearchBasic.setInternalId(new SearchMultiSelectField(rr, SearchMultiSelectFieldOperator.anyOf));

When I try to run this code, it complains about my trying to pass a SearchMultiSelectField object to the setInternalId method. Looking at the java source generated by Axis 1.2 wsdl2java, it does look like the setInternalId method for CustomerSearchBasic is supposed to accept a SearchMultiSelectField object as a parameter. Here is the code snippet from the generated file:

public void setInternalId(com.netsuite.webservices.platform.core_2_0.SearchMultiSelectField internalId) {
this.internalId = internalId;

However, I became suspicious and found some code to retrieve the list of available methods and parameter types from the CustomerSearchBasic object. It appeared that the setInternalId parameter actually is expecting an array of RecordRef objects.

So I compiled and ran the following. No errors!

RecordRef[] rr = new RecordRef[] {new RecordRef("1", Recordtype.customer), new RecordRef("2", RecordType.customer), new RecordRef("3", RecordType.customer)};
CustomerSearchBasic customerSearchBasic = new CustomerSearchBasic();

Am I missing something? Is it possible I'm somehow referencing an old java class from the 1.3.2 wsdl?

Tuesday, August 01, 2006

XMLSearch, XPath, and XML namespaces in ColdFusion

Sample code used in this posting is ColdFusion-specific, but the XPath syntax will likely apply to many XPath implementations in other languages.
I was looking a specific set of elements in a SOAP response and kept getting an empty array returned from XMLSearch. Turns out this was related to how the namespaces in the response were defined and/or assigned to certain elements. (see this Talking Tree posting)
The information in the Talking Tree posting helped me identify my problem, but in my case, it wasn't about noname namespaces. In fact, what if you want to find all elements of a given name and don't care about the namespace or even where it lies in the hierarchy? In the example below, I want to quickly retrieve all of the Response elements. Note that one Response element is a child of Other, while the remaining are direct descendants of ResponseList.

<ResponseList xmlns="">
<ns1:success xmlns:ns1="">true</ns1:success>
<baseRef internalId="1234" xmlns:ns2=""/>
<ns3:success xmlns:ns3="">false</ns3:success>
<ns3:statusDetail type="ERROR">
<ns3:message>That record does not exist.</ns3:message>
<baseRef internalId="4421" xmlns:ns4=""/>
<ns3:success xmlns:ns3="">false</ns3:success>
<ns3:statusDetail type="ERROR">
<ns3:message>That record does not exist.</ns3:message>
<warning>Import timed out briefly and process was restarted. No further errors were reported.</warning>

Now if it weren't for the namespaces, I could simply use the following:
<cfset MyArray = XMLSearch(MyXMLDoc, "//Response")> 

...but in this case that would return an empty array.

Ok, but what about the noname namespace syntax:
<cfset MyArray = XMLSearch(MyXMLDoc, "//:Response")> 

That's fine if there's an actual noname namespace assigned to that element, but in this case there isn't one assigned.

After trying countless variations of XPath syntax, I still couldn't get anything other than a blank array returned. I became desperate and quickly wrote a function that strips all of the namespace definitions and labels out of the XML, then searched on the results of that. But I felt this was rather convoluted and added too much overhead. Surely there was a better way. I kept searching, and lo and behold, came across the local-name function. If you want to ignore namespaces and hierarchical context completely, you can search by the local name of the element:
<cfset MyArray = XMLSearch(MyXMLDoc, "//*[local-name()='Response']" 

And now you have your array containing the three Response elements.

March 11, 2008 UPDATE: Ryan commented that he had tried the syntax below with similar success. I have not tried this myself, but give it a shot:
<cfset MyArray = XMLSearch(MyXMLDoc, "//*:Response")>

Thursday, July 20, 2006

Welcome to aftergeek!

Welcome to aftergeek, the less foul-mouthed and hopefully more relevant child of my creative outlet afterglide. Where afterglide is full of potty-mouthed humor and rantings that are sometimes not work safe, I occasionally used it to post gadget and consumer product reviews and other geeky subjects that seemed out of place given the usual subject matter. I intend to make such postings here in the future so as not to bore my non-geek readers at afterglide. Hopefully you can learn from my mistakes and experiences, and I hope to learn in kind from yours.