<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9175937</id><updated>2012-02-02T01:24:33.921-05:00</updated><category term='nostalgia'/><category term='yahoo'/><category term='cryptography'/><category term='admin'/><category term='debugging'/><category term='network admin'/><category term='emachines'/><category term='IT'/><category term='vs2008'/><category term='skype'/><category term='unit-testing'/><category term='bleeding edge'/><category term='Windows'/><category term='youtube'/><category term='nunitforms'/><category term='mssql'/><category term='software development'/><category term='sharepoint'/><category term='csharp'/><category term='social networking'/><category term='WiX'/><category term='Remote Desktop Connection'/><category term='kudos'/><category term='mix conference'/><category term='firewall'/><category term='dotnet'/><category term='NAnt'/><category term='vs2005'/><category term='thunderbird'/><category term='brand loyalty'/><category term='TODO'/><category term='entrepreneurs'/><category term='blogger.com'/><category term='high tech'/><category term='.net framework'/><category term='apache'/><category term='xml'/><category term='linq'/><category term='cvs'/><category term='java'/><category term='law'/><category term='vietnam'/><category term='programming'/><category term='customer service'/><category term='culture'/><category term='humour'/><category term='com'/><category term='putty'/><category term='ssh'/><category term='etc'/><category term='gaming'/><category term='com-interop'/><category term='windbg'/><category term='c'/><category term='vb6'/><category term='plug'/><category term='ado.net'/><category term='twitter'/><category term='Windows Installer'/><category term='intellectual property'/><category term='virus'/><category term='microsoft'/><category term='asp.net'/><category term='mozilla'/><category term='AppConnector'/><category term='SpamAssassin'/><category term='china'/><category term='architecture'/><category term='WPF'/><category term='google'/><title type='text'>Thanh Hai Tran's Techie Blog v3.0</title><subtitle type='html'>No longer eating and sleeping around computers, but still much senseless babbling.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default?start-index=101&amp;max-results=100'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>120</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9175937.post-298457403855463645</id><published>2011-06-04T00:29:00.001-04:00</published><updated>2011-06-04T00:45:40.705-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vietnam'/><category scheme='http://www.blogger.com/atom/ns#' term='etc'/><category scheme='http://www.blogger.com/atom/ns#' term='brand loyalty'/><category scheme='http://www.blogger.com/atom/ns#' term='china'/><title type='text'>A simple vow</title><content type='html'>&lt;p&gt;Starting tomorrow, I will continue to greet and speak to my Chinese friends as if nothing has changed. However, in order to show my love and solidarity towards a homeland on which I once felt like an outcast,&amp;#160; I will, from now on, go out of my way to avoid buying “made in china” products. This is but &lt;a href="http://www.smh.com.au/world/vietnam-accuses-china-of-sabotage-20110601-1fgec.html"&gt;one&lt;/a&gt; in many examples of why:&lt;/p&gt;  &lt;p&gt;&lt;iframe height="349" src="http://www.youtube.com/embed/QdCuDj9_j6A" frameborder="0" width="425" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;&lt;/p&gt;  &lt;p&gt;This ain’t gonna be easy, as it excludes any future possibility of owning an iPad. But it’s the principle of the thing.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-298457403855463645?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/298457403855463645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=298457403855463645' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/298457403855463645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/298457403855463645'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2011/06/simple-vow.html' title='A simple vow'/><author><name>th2tran</name><uri>http://www.blogger.com/profile/18129661984008864019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://2.bp.blogspot.com/_4MC2RcVuvck/S2xT2Kprx6I/AAAAAAAAAzA/-WA6FT4yv98/S220/ThanhHai.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/QdCuDj9_j6A/default.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-7741107967261965859</id><published>2011-06-01T23:33:00.001-04:00</published><updated>2011-06-01T23:33:09.189-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='culture'/><category scheme='http://www.blogger.com/atom/ns#' term='high tech'/><title type='text'>Workaholic culture (still)</title><content type='html'>&lt;p&gt;From the &lt;a href="http://engineering.twitter.com/2011/05/engineering-behind-twitters-new-search.html"&gt;Twitter Engineering blog&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;While on vacation in Germany, Michael Busch, one of our search engineers, implemented a demo of image and video search. A few weeks later, during Twitter's first &lt;a href="http://engineering.twitter.com/2010/10/hack-week.html"&gt;Hack Week&lt;/a&gt;, the search team, along with some members of other teams, completed the first demo of our new search experience. Feedback from the company was so positive that the demo became part of our product roadmap.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Impressive. But it reminds me of this CNN article I saw the other day, &lt;a href="http://articles.cnn.com/2011-05-23/travel/vacation.in.america_1_vacation-germans-long-holiday?_s=PM:TRAVEL"&gt;Why is America the 'no-vacation nation’?&lt;/a&gt;,&amp;#160; which starts with this line:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Let's be blunt: If you like to take lots of vacation, the United States is not the place to work.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I think this all started when I brought my sleeping bag into work one day back in 1999. Depressing.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-7741107967261965859?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/7741107967261965859/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=7741107967261965859' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/7741107967261965859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/7741107967261965859'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2011/06/workaholic-culture-still.html' title='Workaholic culture (still)'/><author><name>th2tran</name><uri>http://www.blogger.com/profile/18129661984008864019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://2.bp.blogspot.com/_4MC2RcVuvck/S2xT2Kprx6I/AAAAAAAAAzA/-WA6FT4yv98/S220/ThanhHai.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-1112557788157421142</id><published>2011-04-15T01:18:00.001-04:00</published><updated>2011-04-15T01:21:32.936-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='entrepreneurs'/><category scheme='http://www.blogger.com/atom/ns#' term='.net framework'/><title type='text'>Them’s fight’n woyds!</title><content type='html'>&lt;p&gt;&lt;a href="https://www.expensify.com/"&gt;Expensify&lt;/a&gt;‘s CEO on “&lt;a href="http://blog.expensify.com/2011/03/25/ceo-friday-why-we-dont-hire-net-programmers/"&gt;Why we don’t hire .NET programmers&lt;/a&gt;”:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;Programming with .NET is like cooking in a McDonalds kitchen.&amp;#160; It is full of amazing tools that automate absolutely everything.&amp;#160; Just press the right button and follow the beeping lights, and you can churn out flawless 1.6 oz burgers faster than anybody else on the planet.        &lt;br /&gt;…&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;So what’s the moral of this whole story?&amp;#160; Two things:&lt;/em&gt;&lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;&lt;em&gt;If you ever want to work in a startup, avoid .NET.&amp;#160; It does you no favors. &lt;/em&gt;&lt;/li&gt;      &lt;li&gt;&lt;em&gt;If you are a startup looking to hire really excellent people, take notice of .NET on a resume, and ask why it’s there. &lt;/em&gt;&lt;/li&gt;   &lt;/ol&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I recently knew of Expensify by reading &lt;a href="http://www.windley.com/archives/2011/03/leave_the_services_clients_to_the_services_and_build_something_really_interesting.shtml"&gt;this blog entry&lt;/a&gt; by Phil Windley. I can only guess from Mr. Barrett‘s conclusion that Expensify gets alot of resumes from .NET developers. From the employer’s perspective, following the law of averaging, it makes perfect sense. If your software platform is Linux, PHP and Bash, why would you hire a .NET developer? Rather, underlying the above two points is an implicit advice to startup employers—don’t use .NET technologies—which, I daresay, is ill-conceived. But hey, I’m not a CEO of a company. Not yet anyway. ;-)&lt;/p&gt;  &lt;p&gt;In the end, probably nothing more than simply a publicity stunt.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-1112557788157421142?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/1112557788157421142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=1112557788157421142' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/1112557788157421142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/1112557788157421142'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2011/04/thems-fightn-woyds.html' title='Them’s fight’n woyds!'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-3458565590324711645</id><published>2011-04-05T18:33:00.001-04:00</published><updated>2011-04-06T00:13:53.562-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='admin'/><category scheme='http://www.blogger.com/atom/ns#' term='cryptography'/><category scheme='http://www.blogger.com/atom/ns#' term='com-interop'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='IT'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='debugging'/><category scheme='http://www.blogger.com/atom/ns#' term='.net framework'/><title type='text'>What to do when CryptAcquireContext() fails</title><content type='html'>&lt;p&gt;I’m using CryptoAPI to do encryption and encountering an error on Win2008 Terminal Server which enforces Mandatory Profiles. &lt;em&gt;CryptAcquireContext()&lt;/em&gt; fails with a message of either “&lt;em&gt;keyset not found&lt;/em&gt;” or “&lt;em&gt;The profile for the user is a temporary profile&lt;/em&gt;”.&lt;/p&gt;  &lt;p&gt;I’ve tried the same test on WinXP using a guest account and got the same thing.&lt;/p&gt;  &lt;p&gt;So, what gives? &lt;/p&gt;  &lt;p&gt;Well, this blog post (&lt;a href="http://blogs.msdn.com/b/alejacma/archive/2007/10/23/rsacryptoserviceprovider-fails-when-used-with-mandatory-profiles.aspx"&gt;RSACryptoServiceProvider fails when used with mandatory profiles&lt;/a&gt;) way back in 2007 by &lt;a href="http://blogs.msdn.com/b/alejacma/"&gt;@alejacma&lt;/a&gt; explains:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;CryptAcquireContext will fail with &lt;strong&gt;NTE_TEMPORARY_PROFILE&lt;/strong&gt; error when called from a mandatory profile. &lt;/p&gt;    &lt;p&gt;Mandatory profiles are read-only user profiles. Since changes to the mandatory profile cannot be saved, PKI design doesn't allow this operation, and CryptAcquireContext prevents this scenario by failing.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The moral of this story is: RSA sucks, and I am now Rijndael’s new biggest fan.&lt;/p&gt;  &lt;p&gt;By the way, troubleshooting this problem had given me the chance to learn a few more WinDbg commands:&lt;/p&gt;  &lt;pre&gt;.sympath srv*http://msdl.microsoft.com/downloads/symbols&lt;br /&gt;.sympath+ c:\localsymbols&lt;br /&gt;.reload –f&lt;br /&gt;bm /a advapi32!CryptAcquireContext*&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-3458565590324711645?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/3458565590324711645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=3458565590324711645' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/3458565590324711645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/3458565590324711645'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2011/04/what-to-do-when-cryptacquirecontext.html' title='What to do when CryptAcquireContext() fails'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-4493447987869046866</id><published>2011-03-17T02:33:00.001-04:00</published><updated>2011-03-17T02:56:50.219-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='customer service'/><title type='text'>6 months</title><content type='html'>&lt;p&gt;The following event is happening to me now. There is a certain business Internet service provider in Toronto whose sales guy signed me up on an agreed network speed, whose installation technician, upon arrival at our site, made a judgment that they could never provide service at said speed and aborted the install, who sent us a bill 30 days later for service never rendered, which thus far has taken me 6 months to fight for a refund. I’m stuck with a jaded feeling as I sit here now preparing to fax back a copy of the receipt proving to them that I did indeed return their modem. This internet provider uses a third party to process equipment returns.&lt;/p&gt;  &lt;p&gt;The following event happened to me a couple of years ago. There is a certain home building materials vendor in Toronto, who uses a third party for their credit provisioning, who miscalculated my returns on their monthly statement, which took 6 months for me to successfully dispute the discrepancies.&lt;/p&gt;  &lt;p&gt;A couple of conspiracy theories is now bubbling in my head.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-4493447987869046866?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/4493447987869046866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=4493447987869046866' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/4493447987869046866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/4493447987869046866'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2011/03/6-months.html' title='6 months'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-2671018889550079338</id><published>2011-03-08T02:01:00.001-05:00</published><updated>2011-03-08T02:07:47.481-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='debugging'/><category scheme='http://www.blogger.com/atom/ns#' term='.net framework'/><title type='text'>XmlSerializer and the "Specified" suffix</title><content type='html'>&lt;p&gt;It took me 3 hours to figure out why &lt;em&gt;XmlSerializer&lt;/em&gt; wasn’t writing out a particular class property. &lt;a href="http://stackoverflow.com/questions/4261038/xmlserializer-specified-suffix-and-ireflect"&gt;This &lt;/a&gt;is why:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;…if a serializable &lt;em&gt;Field/Property&lt;/em&gt; has a corresponding field of type &lt;em&gt;Boolean&lt;/em&gt; having as a name the &lt;em&gt;Field/Property&lt;/em&gt; name with &amp;quot;Specified&amp;quot; suffix, the XmlSerializer conditionally exclude that &lt;em&gt;Field/Property&lt;/em&gt; from the serialization process.&lt;/p&gt;&lt;/blockquote&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-2671018889550079338?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/2671018889550079338/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=2671018889550079338' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/2671018889550079338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/2671018889550079338'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2011/03/xmlserializer-and-suffix.html' title='XmlSerializer and the &amp;quot;Specified&amp;quot; suffix'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-5350622361490213671</id><published>2011-02-17T00:50:00.001-05:00</published><updated>2011-02-17T01:04:36.866-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='.net framework'/><category scheme='http://www.blogger.com/atom/ns#' term='csharp'/><title type='text'>DateTime Serialization to XML</title><content type='html'>&lt;p&gt;I have an C# serializable object with a DateTime property like this:&lt;/p&gt; &lt;pre class="brush: csharp"&gt;        public class MyClass {&lt;br /&gt;            public DateTime Date1 {get;set;}&lt;br /&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;When serialized to XML, it gives me something like this&lt;/p&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;        &amp;lt;MyClass&amp;gt;&lt;br /&gt;              &amp;lt;Date1&amp;gt;2010-11-30T00:00:00&amp;lt;/Date1&amp;gt;&lt;br /&gt;        &amp;lt;/MyClass&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;I could not get it to give me this, which is in the proper&amp;#160; &lt;em&gt;&lt;a href="http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/#date"&gt;xml date&lt;/a&gt;&lt;/em&gt; format:&lt;/p&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;        &amp;lt;MyClass&amp;gt;&lt;br /&gt;              &amp;lt;Date1&amp;gt;2010-11-30&amp;lt;/Date1&amp;gt;&lt;br /&gt;        &amp;lt;/MyClass&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;After a couple of wasted days, it turned out that &lt;a href="http://msdn.microsoft.com/en-us/library/ms950721.aspx"&gt;the solution&lt;/a&gt; is really simple:&lt;/p&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;        public class MyClass {&lt;br /&gt;            [System.Xml.Serialization.XmlElement(&amp;quot;Date1&amp;quot;, DataType=&amp;quot;date&amp;quot;)]&lt;br /&gt;            public DateTime Date1 {get;set;}&lt;br /&gt;        }&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-5350622361490213671?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/5350622361490213671/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=5350622361490213671' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/5350622361490213671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/5350622361490213671'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2011/02/datetime-serialization-to-xml.html' title='DateTime Serialization to XML'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-2723552179433267864</id><published>2011-02-12T15:34:00.001-05:00</published><updated>2011-02-12T15:51:35.533-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='law'/><category scheme='http://www.blogger.com/atom/ns#' term='intellectual property'/><title type='text'>Does your employer own your side projects?</title><content type='html'>&lt;p&gt;Apparently, according to &lt;a href="http://joelonsoftware.com/"&gt;Joel Spolsky&lt;/a&gt;, they do:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;…So before you hire this guy, you agree, &amp;quot;hey listen, I know that inventing happens all the time, and it's impossible to prove whether you invented something while you were sitting in the chair I supplied in the cubicle I supplied or not. I don't just want to buy your 9-5 inventions. I want them all, and I'm going to pay you a nice salary to get them all,&amp;quot; and he agrees to that, so now you want to sign something that says that &lt;em&gt;all&lt;/em&gt; his inventions belong to the company as long as he is employed by the company.&lt;/p&gt;    &lt;p&gt;This is where we are by default. This is the &lt;em&gt;standard&lt;/em&gt; employment contract for programmers, inventors, and researchers.      &lt;br /&gt;[Read rest of the discussion at &lt;a href="http://answers.onstartups.com/questions/19422/if-im-working-at-a-company-do-they-have-intellectual-property-rights-to-the-stu/"&gt;answers.onstartups.com&lt;/a&gt;…]&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;One Interesting corollary: if you spend your day-time working for an employer and night time working on a &lt;a href="https://github.com/"&gt;github&lt;/a&gt; open source project, and 2 years from now the OS project becomes wildly popular (wink), your open source project is probably not very “open” afterall, unless you’ve had the appropriate work-for-hire clauses stipulated in your employment agreement. I’m reminded of a vaguely similar case in recent history: the infamous &lt;a href="http://en.wikipedia.org/wiki/SCO_v._IBM"&gt;SCO v. IBM&lt;/a&gt; debacle from a few years back.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-2723552179433267864?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/2723552179433267864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=2723552179433267864' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/2723552179433267864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/2723552179433267864'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2011/02/does-your-employer-own-your-side.html' title='Does your employer own your side projects?'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-4327638391434759675</id><published>2011-01-31T18:01:00.001-05:00</published><updated>2011-02-04T14:04:10.620-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='csharp'/><title type='text'>Convert string to DateTime object</title><content type='html'>&lt;p&gt;Two C# functions that may be useful in accepting date/time strings of various formats:&lt;/p&gt;  &lt;pre class="brush: csharp"&gt;        /// &amp;lt;summary&amp;gt;&lt;br /&gt;        /// Converts date string value, of various formats into DateTime object. &lt;br /&gt;        /// Example formats are DDMMYYYY,DD/MM/YYYY,MM/dd/YYYY,MMDDYYYY,... &lt;br /&gt;        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;        /// &amp;lt;param name=&amp;quot;dateValue&amp;quot;&amp;gt;date string&amp;lt;/param&amp;gt;&lt;br /&gt;        /// &amp;lt;returns&amp;gt;resulting DateTime object&amp;lt;/returns&amp;gt;&lt;br /&gt;        public DateTime ConvertDateStringToDateTime(string dateValue) {&lt;br /&gt;            string[] dateFormats = { &amp;quot;MM/yyyy&amp;quot;,&lt;br /&gt;                                     &amp;quot;M/d/yyyy&amp;quot;, &amp;quot;M/dd/yyyy&amp;quot;, &amp;quot;MM/dd/yyyy&amp;quot;,&lt;br /&gt;                                     &amp;quot;dd/MM/yyyy&amp;quot;, &amp;quot;ddMMyyyy&amp;quot;,&amp;quot;dd/MM/yyyy&amp;quot;,&amp;quot;MMddyyyy&amp;quot;, &lt;br /&gt;                                     &amp;quot;MM-dd-yyyy&amp;quot; };&lt;br /&gt;            try {&lt;br /&gt;                return DateTime.ParseExact(dateValue, dateFormats, CultureInfo.CurrentCulture, DateTimeStyles.None);&lt;br /&gt;            } catch (FormatException fe) {&lt;br /&gt;                throw new DataException(dateValue + &amp;quot;: &amp;quot; + fe.Message);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &amp;lt;summary&amp;gt;&lt;br /&gt;        /// Converts a time string of various formats into a DateTime object.&lt;br /&gt;        /// Example formats are: 7:00,700AM, 7:00AM, 7:00A, 0700AM, 07:00 AM, ... &lt;br /&gt;        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;        /// &amp;lt;param name=&amp;quot;timeValue&amp;quot;&amp;gt;time string&amp;lt;/param&amp;gt;&lt;br /&gt;        /// &amp;lt;returns&amp;gt;resulting DateTime object&amp;lt;/returns&amp;gt;&lt;br /&gt;        public DateTime ConvertTimeStringToDateTime(string timeValue) {&lt;br /&gt;            string[] timeFormats = {&amp;quot;HHmm&amp;quot;,&amp;quot;Hmmtt&amp;quot;, &lt;br /&gt;                                    &amp;quot;H:mm&amp;quot;, &amp;quot;H:mmtt&amp;quot;, &amp;quot;H:mmt&amp;quot;, &amp;quot;HHmmtt&amp;quot;, &amp;quot;HH:mm tt&amp;quot;, &amp;quot;HH:mmtt&amp;quot;,&amp;quot;HH:mmt&amp;quot;, &amp;quot;HHmmtt&amp;quot;, &amp;quot;HHMMt&amp;quot;};&lt;br /&gt;            // DateTime string cannot be blank, so if it is, assume &amp;quot;00:00&amp;quot;&lt;br /&gt;            if (string.IsNullOrEmpty(timeValue)) timeValue = &amp;quot;00:00&amp;quot;; &lt;br /&gt;            try {&lt;br /&gt;                return DateTime.ParseExact(timeValue.ToUpper(), timeFormats, CultureInfo.CurrentCulture, DateTimeStyles.None);&lt;br /&gt;            } catch (FormatException fe) {&lt;br /&gt;                throw new DataException(timeValue + &amp;quot;: &amp;quot; + fe.Message);&lt;br /&gt;            }&lt;br /&gt;        }&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-4327638391434759675?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/4327638391434759675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=4327638391434759675' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/4327638391434759675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/4327638391434759675'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2011/01/convert-string-to-datetime-object.html' title='Convert string to DateTime object'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-8697742409945033761</id><published>2011-01-29T16:12:00.001-05:00</published><updated>2011-01-31T00:08:19.674-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogger.com'/><category scheme='http://www.blogger.com/atom/ns#' term='csharp'/><title type='text'>Blog v3.0</title><content type='html'>&lt;p&gt;This old techie blog of mine seemed to be dead silent lately that I feel compelled to resurrect it. &lt;/p&gt;  &lt;p&gt;Let’s review a bit of history: In my mind, version 1.0 of my blog was on Bloglines (circa 2004). Version 2.0 was when I switch to blogspot and &lt;a href="/2006/08/new-look.html"&gt;using the Kubrick theme&lt;/a&gt;.&amp;#160; It’s now time once again to resharpen the toolkit, beginning with a fresh new look, hat tip to the fine folks at &lt;a href="http://www.deluxetemplates.net"&gt;Deluxe Templates&lt;/a&gt; for the &lt;a href="http://www.deluxetemplates.net/2009/06/inove-blogger-template.html"&gt;iNove theme&lt;/a&gt;.&amp;#160; &lt;/p&gt;  &lt;p&gt;TODO: I like this theme, but one thing I might change is to make a little more room for the content pane. &lt;/p&gt;  &lt;p&gt;Also trying to install Alex Gorbatchev’s &lt;a href="http://alexgorbatchev.com/SyntaxHighlighter"&gt;SyntaxHighligher&lt;/a&gt; scripts. Let’s see if this works:&lt;/p&gt;  &lt;pre class="brush: csharp"&gt;    /**&lt;br /&gt;     * Sample code in C# to test SyntaxHighlighter.&lt;br /&gt;     */&lt;br /&gt;    public Argument ArgueWith(Person person) {&lt;br /&gt;        if (person == null) {&lt;br /&gt;           throw new ArgumentException(&amp;quot;no object to argue with&amp;quot;);&lt;br /&gt;        }&lt;br /&gt;        // prepare argument&lt;br /&gt;        Argument arg = new Argument(person);&lt;br /&gt;        return arg;&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;em&gt;Update 01/30/2011 11:44pm EST: &lt;/em&gt;SyntaxHighlighter worked great. I had to use &lt;a href="http://db.tt/onPSA3Y"&gt;dropbox.com&lt;/a&gt; to host the scripts. I think I spotted a bug, though, on Safari for iOS 4.1: line number is a bit out of whack.&amp;#160; Let’s have a closer look at &lt;a href="http://pastebin.com"&gt;PasteBin&lt;/a&gt;, as Gavin suggested:&lt;/p&gt;&lt;br /&gt;&lt;script src="http://pastebin.com/embed_js.php?i=FwULfJQC"&gt;&lt;/script&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-8697742409945033761?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/8697742409945033761/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=8697742409945033761' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/8697742409945033761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/8697742409945033761'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2011/01/blog-v30.html' title='Blog v3.0'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-5007978029244977050</id><published>2010-05-17T15:22:00.001-04:00</published><updated>2010-05-17T15:42:16.961-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vb6'/><category scheme='http://www.blogger.com/atom/ns#' term='debugging'/><category scheme='http://www.blogger.com/atom/ns#' term='.net framework'/><category scheme='http://www.blogger.com/atom/ns#' term='windbg'/><category scheme='http://www.blogger.com/atom/ns#' term='dotnet'/><title type='text'>Debugging hybrid VB6/C/C# app crashes with WinDbg</title><content type='html'>&lt;p&gt;I was troubleshooting one of two (2) different app crashes this past week in which the app simply dies without any prior warning.&amp;#160; At first I thought: crappy VB6! But then, after looking in the &lt;em&gt;Event Log&lt;/em&gt;, I found out this was not Visual Basic 6.0 Runtime’s fault, but rather it’s the .&lt;em&gt;NET Runtime version 2.0 Fatal Execution Engine&lt;/em&gt; that erred fatally. Below is how I went about debugging the crash.&lt;/p&gt;  &lt;p&gt;First of all, two sets of tools are needed:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;a href="http://www.microsoft.com/whdc/DevTools/Debugging/default.mspx"&gt;Debugging Tools for Windows&lt;/a&gt; (WinDbg) &lt;/li&gt;    &lt;li&gt;Debugging symbol (.pdb) files. These are useful but not essential.&amp;#160;&amp;#160; PDB files are generated automatically in Visual Studio .NET, and can be turned on in VB6 IDE via the project properties under the &lt;strong&gt;Compile&lt;/strong&gt; tab. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;In using WinDbg to troubleshoot app crashes, I found this blog post &lt;a href="http://blogs.msdn.com/johan/archive/2008/01/31/using-windbg-hunting-exceptions.aspx"&gt;Using WinDbg - Hunting Exceptions&lt;/a&gt;&amp;#160; by &lt;a href="http://blogs.msdn.com/johan/default.aspx"&gt;Johan Straarup&lt;/a&gt; to be tremendously helpful.&lt;/p&gt;  &lt;p&gt;As anyone who’s ever involved in troubleshooting any software bug would know, the hardest part is to reproduce it in a consistent manner, and an app crash is (or should be) the rarest (and most feared by programmers) of bugs. Yet, an app crash is nothing more than an exception that has gone uncaught by the application.&lt;/p&gt;  &lt;p&gt;In WinDbg, I used the &lt;strong&gt;Attach to a Process&lt;/strong&gt; menu option to connect to the running app. Then, I issued the &lt;strong&gt;gn &lt;/strong&gt;command (Go [until] Unhandled Exception) command, and let the app run its course.&amp;#160; Eventually, it came a stop with this message:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;(4a4.1e4): CLR exception - code e0434f4d (!!! second chance !!!)      &lt;br /&gt;eax=0129ecfc ebx=0017d328 ecx=00000000 edx=00000025 esi=0129ed88 edi=e0434f4d       &lt;br /&gt;eip=7c812afb esp=0129ecf8 ebp=0129ed4c iopl=0&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; nv up ei pl nz na po nc       &lt;br /&gt;cs=001b&amp;#160; ss=0023&amp;#160; ds=0023&amp;#160; es=0023&amp;#160; fs=003b&amp;#160; gs=0000&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; efl=00000202       &lt;br /&gt;…&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I then used “&lt;em&gt;!analyze –v”&lt;/em&gt; and subsequently “!pe”, which gave me this:&lt;/p&gt;  &lt;p&gt;&lt;code&gt;0:002&amp;gt; !PrintException      &lt;br /&gt;*** ERROR: Symbol file could not be found.&amp;#160; Defaulted to export symbols for C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll -       &lt;br /&gt;PDB symbol for mscorwks.dll not loaded       &lt;br /&gt;Exception object: 019138a0       &lt;br /&gt;Exception type: System.IO.FileLoadException       &lt;br /&gt;Message: Could not load file or assembly 'Interop.SHDocVw, Version=1.1.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)       &lt;br /&gt;InnerException: &amp;lt;none&amp;gt;       &lt;br /&gt;StackTrace (generated):       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; SP&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IP&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Function       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; 00000000 00000001 MyAssembly1.MyClass1.Finalize() &lt;/code&gt;&lt;/p&gt;  &lt;p&gt;So, this crash was the result of a referenced assembly version mismatch in one of the plugin components. That's one easy problem solved. &lt;/p&gt;  &lt;p&gt;The other crash is a bit more elusive, which, after two weeks, I'm still in the process of trying to reproduce. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-5007978029244977050?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/5007978029244977050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=5007978029244977050' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/5007978029244977050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/5007978029244977050'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2010/05/debugging-hybrid-vb6cc-app-crashes-with.html' title='Debugging hybrid VB6/C/C# app crashes with WinDbg'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-687499134156421179</id><published>2009-09-24T13:59:00.001-04:00</published><updated>2009-09-24T17:53:32.998-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>FF 3.5.3 crashed again</title><content type='html'>&lt;p&gt;My Firefox 3.5.3 crashed again for the third time today:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="1"&gt;Add-ons: {2B8EFF80-1240-11DB-BF6C-934CD2EFDFE8}:20080728.334,{CF40ACC5-E1BB-4aff-AC72-04C2F616BCA7}:1.5.2.35,toolbar@alexa.com:1.3.0,{2fa4ed95-0317-4c6a-a74c-5f3e3912c1f9}:2.1.062,firebug@software.joehewitt.com:1.4.2,{d37dc5d0-431d-44e5-8c91-49419370caa1}:2.5.35,{e4a8a97b-f2ed-450b-b12d-ee082ba24781}:0.8.20090123.1,{CAFEEFAC-0016-0000-0007-ABCDEFFEDCBA}:6.0.07,{CAFEEFAC-0016-0000-0011-ABCDEFFEDCBA}:6.0.11,{CAFEEFAC-0016-0000-0015-ABCDEFFEDCBA}:6.0.15,LogMeInClient@logmein.com:1.0.0.460,{B7082FAA-CB62-4872-9106-E42DD88EDE45}:3.0,{20a82645-c095-46ed-80e3-08825760534b}:1.1,pencil@evolus.vn:1.0.6,refractor@developer.mozilla.org:1.0b2,twitternotifier@naan.net:1.8.3,web@veoh.com:1.4,{972ce4c6-7e08-4474-a285-3208198ce6fd}:3.5.3        &lt;br /&gt;BuildID: 20090824101458         &lt;br /&gt;CrashTime: 1253813633         &lt;br /&gt;InstallTime: 1252611358         &lt;br /&gt;ProductName: Firefox         &lt;br /&gt;SecondsSinceLastCrash: 70976         &lt;br /&gt;StartupTime: 1253811215         &lt;br /&gt;Theme: classic/1.0         &lt;br /&gt;Throttleable: 1         &lt;br /&gt;URL: about:blank         &lt;br /&gt;Vendor: Mozilla         &lt;br /&gt;Version: 3.5.3 &lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This happened while I was doing Google searches…probably one of the add-ons’ fault (probably the Alexa toolbar).&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;Update 17:40 EDT&lt;/strong&gt;: It’s not the Alexa toolbar. Next guess: McAfee SiteAdvisor 3.0&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;One of the design goals that one should aim to achieve, when building any plug-in architecture, is &lt;em&gt;isolation&lt;/em&gt;, to the extent that&amp;#160; a crash in one of the&amp;#160; plug-ins should not bring down the entire application. &lt;/p&gt;  &lt;p&gt;Somehow, that is very hard to do, isn’t it? &lt;/p&gt;  &lt;p&gt;Guilty as charged.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-687499134156421179?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/687499134156421179/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=687499134156421179' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/687499134156421179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/687499134156421179'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2009/09/ff-353-crashed-again.html' title='FF 3.5.3 crashed again'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-5833542347322647234</id><published>2009-09-01T16:40:00.001-04:00</published><updated>2009-09-01T16:40:57.565-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='com-interop'/><category scheme='http://www.blogger.com/atom/ns#' term='NAnt'/><title type='text'>COMException : Creating an instance of the COM component with CLSID {…}</title><content type='html'>&lt;p&gt;I recently changed my &lt;a href="http://nant.sourceforge.net/"&gt;NAnt&lt;/a&gt; build script, as part of its post-build cleanup step,&amp;#160; to unregister all .NET COM interop components after doing the build. Now my unit tests fails with this error:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;font size="1"&gt;System.Runtime.InteropServices.COMException : Creating an instance of the COM component with CLSID {596C3AA2-D5EC-4F86-85E3-7FAF86EC17A3} from the IClassFactory failed due to the following error: 800a005b.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;What’s the cause? &lt;/p&gt;  &lt;p&gt;Here are the facts: My .NET lib X depends on a&amp;#160; COM lib Y (596C3AA2-D5EC-4F86-85E3-7FAF86EC17A3), which depends on COM lib Z, which in turn invokes&amp;#160; .NET COM interop lib N.&lt;/p&gt;  &lt;p&gt;It turns out that the real culprit was N, which wasn’t registered for some reason, even though I’ve told it to register via the &lt;em&gt;regasm&lt;/em&gt; NAnt task.&lt;/p&gt;  &lt;p&gt;Well, as it turned out, I needed to add the &lt;em&gt;codebase=”true”&lt;/em&gt; attribute to the &lt;em&gt;regasm&lt;/em&gt; task that registers N, which makes sense in hindsight, because my DLLs are not all in the same directory. Another “doh!” I suppose.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-5833542347322647234?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/5833542347322647234/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=5833542347322647234' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/5833542347322647234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/5833542347322647234'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2009/09/comexception-creating-instance-of-com.html' title='COMException : Creating an instance of the COM component with CLSID {…}'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-3466874009619818318</id><published>2009-08-24T18:13:00.001-04:00</published><updated>2009-08-24T18:13:45.197-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='csharp'/><title type='text'>AccessViolationException in OpenFileDialog.ShowDialog()</title><content type='html'>&lt;p&gt;Note to self:&amp;#160; Next time I get this error, when running in a 64-bit OS, make sure to specify x86 for &lt;em&gt;Platform target&lt;/em&gt; in the Build options.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-3466874009619818318?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/3466874009619818318/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=3466874009619818318' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/3466874009619818318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/3466874009619818318'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2009/08/accessviolationexception-in.html' title='AccessViolationException in OpenFileDialog.ShowDialog()'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-7555172869051038399</id><published>2009-08-01T08:58:00.001-04:00</published><updated>2009-08-01T09:06:43.327-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><title type='text'>PageRequestManagerParserErrorException</title><content type='html'>&lt;p&gt;Good &lt;a href="http://weblogs.asp.net/leftslipper/archive/2007/02/26/sys-webforms-pagerequestmanagerparsererrorexception-what-it-is-and-how-to-avoid-it.aspx"&gt;tips&lt;/a&gt; from &lt;a href="http://weblogs.asp.net/leftslipper/default.aspx"&gt;Eilon Lipton&lt;/a&gt; on this error:&lt;/p&gt;  &lt;p&gt;&lt;code&gt;Microsoft Internet Explorer      &lt;br /&gt;---------------------------       &lt;br /&gt;Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed. Common causes for this error are when the response is modified by calls to Response.Write(), response filters, HttpModules, or server trace is enabled.&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;I suppose I fell into trap #5 listed on the article.&amp;#160; I was looking to do parameter passing from the current page to the redirected page. Basically, I had a general “catch all” event handler that catches unhandled exception, and forwards the detail to an error display page.&amp;#160; There doesn’t seem to be any direct way of passing parameters from one&amp;#160; .aspx page to another. So I stuffed this parameter into the &lt;em&gt;HttpContext&lt;/em&gt; object.&amp;#160; The problem is: &lt;em&gt;Reponse.Redirect()&lt;/em&gt; wipes out all parameters stored in the context. This problem doesn’t happen if I use &lt;em&gt;Server.Transfer()&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;All of this was happening inside an &lt;em&gt;UpdatePanel&lt;/em&gt;,&amp;#160; just as Eilon explained.&amp;#160; Hence, the &lt;em&gt;PageRequestManagerParserErrorException&lt;/em&gt;. I looked in my &lt;a href="http://www.errorstack.com/"&gt;ErrorStack&lt;/a&gt;, saw what the originating error was, fixed it, and the &lt;em&gt;PageRequestManagerParserErrorException &lt;/em&gt;was gone. &lt;/p&gt;  &lt;p&gt;I guess the next step would be to figure out how to display the error properly when invoked from an &lt;em&gt;UpdatePanel&lt;/em&gt;, as it is working well everywhere else. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-7555172869051038399?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/7555172869051038399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=7555172869051038399' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/7555172869051038399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/7555172869051038399'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2009/08/pagerequestmanagerparsererrorexception.html' title='PageRequestManagerParserErrorException'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-477243655570167781</id><published>2009-06-29T12:48:00.002-04:00</published><updated>2009-06-29T12:51:58.871-04:00</updated><title type='text'>Wow!</title><content type='html'>I want a Mac for Christmas:&lt;br /&gt;&lt;object width="450" height="370"&gt;&lt;param name="movie" value="http://www.liveleak.com/e/adf_1245828170"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.liveleak.com/e/adf_1245828170" type="application/x-shockwave-flash" wmode="transparent" width="450" height="370"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Just kidding.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-477243655570167781?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/477243655570167781/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=477243655570167781' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/477243655570167781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/477243655570167781'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2009/06/wow.html' title='Wow!'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-681799941037601452</id><published>2009-06-18T12:16:00.001-04:00</published><updated>2009-06-18T12:16:47.830-04:00</updated><title type='text'>Flight scheduling system test case: flight number re-use</title><content type='html'>&lt;p&gt;Scenario:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Mom books a flight from airline X, gets assigned flight number 123, arriving at airport YYZ @ 5:45am &lt;/li&gt;    &lt;li&gt;Mom tells son: “my flight #123 arrives tomorrow @ 5:45am” &lt;/li&gt;    &lt;li&gt;“Tomorrow” comes. Son goes online and checks flight info, which states that flight 123 is on-time. &lt;/li&gt;    &lt;li&gt;6:15am: son arrives at YYZ to pick up mom. &lt;/li&gt;    &lt;li&gt;Son checks the Arrivals Fight Info board, which says flight 123 has landed. Son waits at the Arrivals Area. &lt;/li&gt;    &lt;li&gt;Three hours later. Mom was “no show”. Son calls mom, who says “oh, did I say ‘today’? I meant ‘tomorrow’. Tomorrow @ 5:45am.” &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Why someone would design a flight number assignment algorithm such that any X flight departing XXX for YYZ at time hh:mm, on any day of the week, would get assigned the exact same flight number, is beyond me. Are flight numbers so scarce that they have to reuse the same numbers every day?    &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-681799941037601452?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/681799941037601452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=681799941037601452' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/681799941037601452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/681799941037601452'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2009/06/flight-scheduling-system-test-case.html' title='Flight scheduling system test case: flight number re-use'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-6080177421293428485</id><published>2009-06-12T22:56:00.001-04:00</published><updated>2009-06-12T23:30:30.047-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vs2008'/><category scheme='http://www.blogger.com/atom/ns#' term='ado.net'/><category scheme='http://www.blogger.com/atom/ns#' term='linq'/><title type='text'>LINQ to Entities does not recognize the method 'Boolean Like(System.String, System.String)' method</title><content type='html'>&lt;p&gt;I’ve been dabbling with the &lt;a href="http://en.wikipedia.org/wiki/ADO.NET_Entity_Framework"&gt;ADO.NET Entity Framework&lt;/a&gt; in .NET 3.5, was trying to convert this SQL WHERE clause, which uses the LIKE operator, into LINQ syntax:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="1"&gt;&lt;em&gt;String strWhereClause = String.Format(CultureInfo.CurrentCulture, &amp;quot;Type={0} AND Name LIKE '*{0}*'&amp;quot;, orgType, orgName); &lt;/em&gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I read somewhere which suggested to use the &lt;em&gt;SqlMethods&lt;/em&gt; helper class. So I tried:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;var objQuery = repository.Organization.Where(vendor =&amp;gt; vendor.Type == orgType &amp;amp;&amp;amp; SqlMethods.Like(vendor.Name, &amp;quot;”%” + orgName + “%”)); &lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The query is targeting an &lt;em&gt;Organization&lt;/em&gt; table. &lt;em&gt;repository&lt;/em&gt; is an instance of an &lt;em&gt;ObjectContext&lt;/em&gt; subclass which has been&amp;#160; auto generated by Visual Studio’s ADO.NET Entity Data Model wizard.&amp;#160; &lt;em&gt;orgType&lt;/em&gt; and &lt;em&gt;orgName&lt;/em&gt; are passed-in parameters.&lt;/p&gt;  &lt;p&gt;The above approach resulted in the following runtime error (notice the redundant occurrence of the word ‘method’ in the error message):&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="1"&gt;&lt;em&gt;LINQ to Entities does not recognize the method 'Boolean Like(System.String, System.String)' method, and this method cannot be translated into a store expression&lt;/em&gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I then saw &lt;a href="http://stackoverflow.com/questions/835790/how-to-do-sql-like-in-linq"&gt;a post&lt;/a&gt; on &lt;a href="http://stackoverflow.com"&gt;stackoverflow&lt;/a&gt; which suggested to use &lt;em&gt;Contains()&lt;/em&gt;, &lt;em&gt;StartsWith()&lt;/em&gt;, or &lt;em&gt;EndsWith() to mimick the LIKE operator&lt;/em&gt;. So I tried:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="1"&gt;&lt;em&gt;var objQuery = repository.Organization.Where(vendor =&amp;gt; vendor.Type == orgType &amp;amp;&amp;amp; vendor.Name.Contains(orgName)); &lt;/em&gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This works, but if &lt;em&gt;orgName.Length&lt;/em&gt; is zero, then the query returns zero rows.&amp;#160; So finally, a slight mod to the above query achieved the desired effect:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="1"&gt;&lt;em&gt;var objQuery = repository.Organization.Where(vendor =&amp;gt; vendor.Type == orgType &amp;amp;&amp;amp; (orgName.Length == 0 || vendor.Name.Contains(orgName))); &lt;/em&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-6080177421293428485?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/6080177421293428485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=6080177421293428485' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/6080177421293428485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/6080177421293428485'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2009/06/linq-to-entities-does-not-recognize.html' title='LINQ to Entities does not recognize the method &amp;#39;Boolean Like(System.String, System.String)&amp;#39; method'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-5811826453080489036</id><published>2009-06-12T17:03:00.001-04:00</published><updated>2009-06-12T17:06:25.476-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ado.net'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='mssql'/><title type='text'>“The underlying provider failed on Open.”</title><content type='html'>&lt;p&gt;I’m deploying my ASP.NET app to a brand new server with a fresh install of SQL Server 2008 Express. The db connection step failed with this error:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="1"&gt;&lt;font face="Courier New"&gt;&lt;b&gt;Message:&lt;/b&gt; The underlying provider failed on Open.           &lt;br /&gt;&lt;font face="Courier New"&gt;&lt;font size="1"&gt;&lt;b&gt;StackTrace:&lt;/b&gt;&amp;#160; at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean&amp;amp; closeStoreConnectionOnFailure) at System.Data.EntityClient.EntityConnection.Open() at System.Data.Objects.ObjectContext.EnsureConnection() at System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1&lt;/font&gt; forMergeOption)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I checked the &lt;em&gt;connectionString&lt;/em&gt;, which uses Windows authentication, and it looked fine.&lt;/p&gt;  &lt;p&gt;Somebody &lt;a href="http://www.eggheadcafe.com/conversation.aspx?messageid=34423314&amp;amp;threadid=34336970"&gt;suggested&lt;/a&gt; to &lt;em&gt;Allow Remote Clients&lt;/em&gt; in the &lt;em&gt;Network DTC Access&lt;/em&gt; settings. That option is already enabled on my environment.&lt;/p&gt;  &lt;p&gt;I looked at the Event Viewer, and noticed this entry:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New" size="1"&gt;Event Type:&amp;#160;&amp;#160;&amp;#160; Failure Audit        &lt;br /&gt;Event Source:&amp;#160;&amp;#160;&amp;#160; MSSQL$MSSQL         &lt;br /&gt;Event Category:&amp;#160;&amp;#160;&amp;#160; Logon         &lt;br /&gt;Event ID:&amp;#160;&amp;#160;&amp;#160; 18456         &lt;br /&gt;User:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NT AUTHORITY\NETWORK SERVICE         &lt;br /&gt;Description:         &lt;br /&gt;Login failed for user 'NT AUTHORITY\NETWORK SERVICE'. Reason: Failed to open the explicitly specified database. [CLIENT: &amp;lt;local machine&amp;gt;]&lt;/font&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;So IIS is trying to access the database under the credential&amp;#160;&amp;#160; 'NT AUTHORITY\NETWORK SERVICE' .&amp;#160; I looked that the db settings via &lt;em&gt;SQL Server Management Studio&lt;/em&gt; and, sure enough, that account is not listed as one of the users allowed to connect. So I added him. And the web app was able to connect successfully. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-5811826453080489036?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/5811826453080489036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=5811826453080489036' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/5811826453080489036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/5811826453080489036'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2009/06/underlying-provider-failed-on-open.html' title='“The underlying provider failed on Open.”'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-2992361029157932908</id><published>2009-06-09T14:25:00.001-04:00</published><updated>2009-06-09T16:38:20.268-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vs2008'/><category scheme='http://www.blogger.com/atom/ns#' term='ado.net'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='.net framework'/><title type='text'>Which config file to put the db connectionString for ADO.NET (3.5) Entity Data Model?</title><content type='html'>&lt;p&gt;Normally this goes in the App.config. VS2008 designer wizard automatically creates this file and puts it in the same location as the&amp;#160; assembly in which your database layer resides. But if you’re calling that assembly from an ASP.NET app, you’ll&amp;#160; need to move that &lt;em&gt;connectionString&lt;/em&gt; to the Web.config.&amp;#160; Otherwise, you’ll get this error upon&amp;#160; instantiation of the &lt;em&gt;ObjectContext&lt;/em&gt;: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;The specified named connection is either not found in the configuration, not intended to be used with the EntityClient provider, or not valid.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-2992361029157932908?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/2992361029157932908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=2992361029157932908' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/2992361029157932908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/2992361029157932908'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2009/06/which-config-file-to-put-db.html' title='Which config file to put the db connectionString for ADO.NET (3.5) Entity Data Model?'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-4034038355765912522</id><published>2009-05-30T08:53:00.003-04:00</published><updated>2009-05-31T06:24:13.818-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Google Wave</title><content type='html'>&lt;p&gt;Just watched the &lt;a href="http://wave.google.com/"&gt;Google Wave&lt;/a&gt; &lt;a href="http://bit.ly/qqpfM"&gt;demo&lt;/a&gt;, via &lt;a href="http://twitter.com/tylerwhitaker/status/1955949102"&gt;@tylerwhitaker&lt;/a&gt;. Board game playing via email--I've thought of this before but seeing it implemented with Wave is so much cooler!&lt;/p&gt;  &lt;br /&gt;&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/v_UyVmITiYQ&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/v_UyVmITiYQ&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="500" height="304"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-4034038355765912522?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/4034038355765912522/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=4034038355765912522' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/4034038355765912522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/4034038355765912522'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2009/05/google-wave.html' title='Google Wave'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-3150385498137226965</id><published>2009-05-08T16:42:00.000-04:00</published><updated>2009-05-08T16:48:48.142-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humour'/><title type='text'>Appropriate levels of abstraction</title><content type='html'>I've learned over the years, through the many facets of my job, to don a different hat depending to whether I'm talking to a programmer, a business person, or an end user.&lt;br /&gt;&lt;br /&gt;Which is why it always freaks me out when I see my fellow developers showing my CEO how to run regasm to get a particular new product feature to work. Good God!&lt;br /&gt;&lt;br /&gt;I guess in some sense it's good, because now when something is not working quite right, my CEO would ask "Do I need to rerun regasm?"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-3150385498137226965?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/3150385498137226965/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=3150385498137226965' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/3150385498137226965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/3150385498137226965'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2007/05/appropriate-levels-of-abstraction.html' title='Appropriate levels of abstraction'/><author><name>th2tran</name><uri>http://www.blogger.com/profile/18129661984008864019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://2.bp.blogspot.com/_4MC2RcVuvck/S2xT2Kprx6I/AAAAAAAAAzA/-WA6FT4yv98/S220/ThanhHai.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-4027421116979440149</id><published>2009-04-02T16:45:00.004-04:00</published><updated>2009-04-04T21:21:49.321-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='c'/><category scheme='http://www.blogger.com/atom/ns#' term='dotnet'/><category scheme='http://www.blogger.com/atom/ns#' term='csharp'/><title type='text'>Why does UnhookWindowsHookEx() fail?</title><content type='html'>&lt;p&gt;I’m debugging a Windows hook DLL that’s misbehaving.  Actually I’m still not sure whether it’s the hook DLL, or the C# library that calls it, that is the culprit. Here’s the problem symptom.  My app DLL installs a mouse hook into a running application. The running app terminates. My app detects that it has terminated and attempts to remove the hook—this fails (1).  On subsequent startup of the app in question, I try to re-install the hook onto it, and that fails (2). I’m actually more interested in failure #2 than failure #1, but  the latter is probably a consequence of the former. So I needed to track down why #1 happened.&lt;/p&gt;  &lt;p&gt;Side fact:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;When you install a thread-specific Windows hook,  your hook DLL is actually loaded in 2 places: one instance is loaded in your app's process space, and the other  in the target app's.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;At first, I thought that Windows was failing to do its DLL cleanup duties when the unhook step  failed, so I was ready to look into manually forcing the unload and reload of the native DLL—often a bad idea to circumvent the garbage collector, but, hey, what else can you do? &lt;/p&gt;  &lt;p&gt;Then I spotted the culprit:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;span style=";font-family:Courier New;font-size:78%;"  &gt;DLLEXPORT HHOOK SetHook(HWND hWndTarget, HWND hWndListener) {    &lt;br /&gt;if(m_hWndListener != NULL) return NULL; // already hooked!     &lt;br /&gt;// install the hook via SetWindowsHookEx()     &lt;br /&gt;…     &lt;br /&gt;…     &lt;br /&gt;m_hWndListener = hWndListener;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:Courier New;font-size:78%;"  &gt;   …     &lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:Courier New;font-size:78%;"  &gt;}&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style=";font-family:Courier New;font-size:78%;"  &gt;DLLEXPORT BOOL ClearHook(HHOOK hook) {    &lt;br /&gt;BOOL unhooked = UnhookWindowsHookEx(hook);     &lt;br /&gt;if (unhooked) {     &lt;br /&gt;    m_hWndListener = NULL;     &lt;br /&gt;    // do other cleanup stuff     &lt;br /&gt;}     &lt;br /&gt;return unhooked;     &lt;br /&gt;}&lt;/span&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;It turned out: &lt;span style="font-family:Courier New;"&gt;m_hWndListener&lt;/span&gt; was not being cleared when UnhookWindowsHookEx() failed.&lt;/p&gt;  &lt;p&gt;Yet again, it goes to show that: just when I thought that the developers at Microsoft are a bunch of idiots who had no clue what they were doing when they invented the Windows API, it turns out that the idiot is me.&lt;/p&gt;  &lt;p&gt;As to why UnhookWindowsHookEx() failed, my guess is that the hook was already being automatically removed by the OS  when the target app terminated.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-4027421116979440149?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/4027421116979440149/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=4027421116979440149' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/4027421116979440149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/4027421116979440149'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2009/04/why-does-unhookwindowshookex-fail.html' title='Why does UnhookWindowsHookEx() fail?'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-4909278661169213926</id><published>2009-03-23T12:40:00.001-04:00</published><updated>2009-03-23T12:44:42.412-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sharepoint'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>Adding custom properties to the MOSS2007 Advanced Search page</title><content type='html'>&lt;p&gt;Recently, I’ve been playing a bit with &lt;acronym title="Microsoft Office SharePoint Server 2007"&gt;MOSS2007&lt;/acronym&gt;. Actually I've dabbled with it a little bit when SharePoint 2003 came out, but not to the extent that I am now.&lt;/p&gt; Installation was a bitch at the start, but thankfully there is a lot of useful resources out on the web this time around. I was looking to set up metadata (custom column) searching, and this article, &lt;a href="http://www.jjfblog.com/2007/01/searching-custom-column-values-in-moss.html"&gt;Searching Custom Column Values in MOSS 2007&lt;/a&gt;&amp;#160; by &lt;a href="http://www.jjfblog.com"&gt;Jonathon Frost&lt;/a&gt;, was extremely helpful. I did find, however, a couple of subtleties not mentioned in Jonathan's post.  &lt;p&gt;For instance, I needed to add the corresponding &lt;em&gt;PropertyRefs&lt;/em&gt; in the &lt;strong&gt;All Results&lt;/strong&gt; &lt;em&gt;ResultType&lt;/em&gt; section:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="1"&gt;&amp;lt;PropertyDefs&amp;gt;        &lt;br /&gt;…         &lt;br /&gt;&amp;#160; &amp;lt;PropertyDef Name=&amp;quot;Vendor&amp;quot; DataType=&amp;quot;text&amp;quot; DisplayName=&amp;quot;Vendor#&amp;quot;/&amp;gt;         &lt;br /&gt;&amp;#160; &amp;lt;PropertyDef Name=&amp;quot;Invoice&amp;quot; DataType=&amp;quot;text&amp;quot; DisplayName=&amp;quot;Invoice#&amp;quot;/&amp;gt;         &lt;br /&gt;&amp;lt;/PropertyDefs&amp;gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font size="1"&gt;&amp;lt;ResultType DisplayName=&amp;quot;All Results&amp;quot; Name=&amp;quot;default&amp;quot;&amp;gt;        &lt;br /&gt;…        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;PropertyRef Name=&amp;quot;Vendor&amp;quot; /&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;PropertyRef Name=&amp;quot;Invoice&amp;quot; /&amp;gt;         &lt;br /&gt;&amp;lt;/ResultType&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Originally, I mistakenly added my &lt;em&gt;PropertyRefs&lt;/em&gt; in the “Word Documents” section, and was scratching my head for some time, wondering why my changes wouldn’t show up on the refresh of the Advanced Search page.&lt;/p&gt;  &lt;p&gt;I also noted that I needed to manually run a Full Crawl for the custom properties to show up in the &amp;quot;”Mappings to crawled properties” section—which makes sense in hindsight.&lt;/p&gt;  &lt;p&gt;Another thing I observed was that if I made changes to the Properties XML, I had to do an &lt;em&gt;Incremental Crawl&lt;/em&gt; for it to take effect. For instance, I originally had the &lt;em&gt;DisplayName&lt;/em&gt; for the “Vendor” property as simply “Vendor”. Later, I went back and changed this to Vendor#. The change would be reflected immediately on on the Advanced Search page, but the search was returning no results, until I manually ran the &lt;em&gt;Incremental Crawl&lt;/em&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-4909278661169213926?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/4909278661169213926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=4909278661169213926' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/4909278661169213926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/4909278661169213926'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2009/03/adding-custom-properties-to-moss2007.html' title='Adding custom properties to the MOSS2007 Advanced Search page'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-7450958144370044184</id><published>2009-03-16T17:26:00.001-04:00</published><updated>2009-03-16T17:26:11.750-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='com-interop'/><category scheme='http://www.blogger.com/atom/ns#' term='dotnet'/><title type='text'>stdole 7.0.3300.0</title><content type='html'>&lt;p&gt;When I first got this error during the initialization phase of my component:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;Could not load file or assembly 'stdole, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I thought that it wanted Interop.stdole.dll, which was sitting right there in the working directory. But as it turned out, it meant the Primary Interop Assembly called stdole.dll, which was indeed missing.&amp;#160; Duh!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-7450958144370044184?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/7450958144370044184/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=7450958144370044184' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/7450958144370044184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/7450958144370044184'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2009/03/stdole-7033000.html' title='stdole 7.0.3300.0'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-6985044111919317165</id><published>2009-02-17T19:19:00.001-05:00</published><updated>2009-02-18T12:16:22.349-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WiX'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Installer'/><category scheme='http://www.blogger.com/atom/ns#' term='com'/><title type='text'>Setting up a WIX 3.0 build environment</title><content type='html'>&lt;p&gt;I recently encountered some problem with heat.exe with respect to COM registry harvesting, and wanted to step through the code in the debugger, to see what was the problem.&lt;/p&gt;  &lt;p&gt;I had some initial trouble setting up a dev environment for &lt;a href="http://wix.sourceforge.net/"&gt;WiX&lt;/a&gt;, have read &lt;a href="http://neilsleightholm.blogspot.com"&gt;Neil Sleightholm's&lt;/a&gt; post on&amp;#160; &lt;a href="http://neilsleightholm.blogspot.com/2008/10/how-to-create-wix-build-machine.html"&gt;How To Create a WiX build machine&lt;/a&gt;, but it didn’t go so well for me.&amp;#160; The process is really simple, with the following commands:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;do a cvs checkout per instruction &lt;a href="https://sourceforge.net/cvs/?group_id=105970"&gt;here&lt;/a&gt;:       &lt;ul&gt;       &lt;li&gt;&lt;tt&gt;&lt;font size="1"&gt;cvs -d:pserver:anonymous@wix.cvs.sourceforge.net:/cvsroot/wix login&lt;/font&gt;&lt;/tt&gt; &lt;/li&gt;        &lt;li&gt;&lt;tt&gt;&lt;font size="1"&gt;cvs -z3 -d:pserver:anonymous@wix.cvs.sourceforge.net:/cvsroot/wix co -P &lt;i&gt;wix&lt;/i&gt;&lt;/font&gt;&lt;/tt&gt; &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;set WIX_ROOT environment variable &lt;/li&gt;    &lt;li&gt;cd to %WIX_ROOT% &lt;/li&gt;    &lt;li&gt;Run bin\wixenv.bat, &lt;/li&gt;    &lt;li&gt;Run NAnt &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Yet, when I ran the NAnt command, I kept getting &lt;a href="https://sourceforge.net/tracker/?func=detail&amp;amp;atid=402868&amp;amp;aid=1859708&amp;amp;group_id=31650"&gt;this error&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Failed to initialize the 'Microsoft .NET Framework 2.0' (net-2.0) target      &lt;br /&gt;framework. Property evaluation failed.       &lt;br /&gt;Expression: ${path::combine(sdkInstallRoot, 'bin')}       &lt;br /&gt;^^^^^^^^^^^^^^       &lt;br /&gt;Property 'sdkInstallRoot' has not been set.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Part of the problem was that it needed a post-0.86-beta1 build of &lt;a href="http://nant.sourceforge.net/"&gt;NAnt&lt;/a&gt;, which unfortunately, is not available on the NAnt project home page. I managed to find it by googling, leading to&amp;#160; &lt;a href="http://nant.sourceforge.net/nightly/latest/nant-bin.zip"&gt;this download link&lt;/a&gt; (the version I downloaded was 0.86.3317.0, 30/01/2009).&amp;#160; Once I got NAnt 0.86.3317.0 in place, the wix build finished without a hitch.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-6985044111919317165?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/6985044111919317165/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=6985044111919317165' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/6985044111919317165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/6985044111919317165'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2009/02/setting-up-wix-30-build-environment.html' title='Setting up a WIX 3.0 build environment'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-5033246001904743472</id><published>2009-02-14T09:01:00.000-05:00</published><updated>2009-02-18T12:14:54.762-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='virus'/><category scheme='http://www.blogger.com/atom/ns#' term='admin'/><category scheme='http://www.blogger.com/atom/ns#' term='kudos'/><category scheme='http://www.blogger.com/atom/ns#' term='IT'/><category scheme='http://www.blogger.com/atom/ns#' term='com'/><title type='text'>Vundo disabled Norton 360</title><content type='html'>&lt;p&gt;I had a full day of battle with &lt;a href="http://en.wikipedia.org/wiki/Vundo"&gt;Vundo&lt;/a&gt;.H Trojan last Sunday trying to get my dad’s infected computer cleaned up.&amp;#160; The parasite was occasionally popping this message:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“Your system is infected with dangerous virus! Note: Strongly recommend to install antispyware program to clean your system and avoid total crash of your computer!”&lt;a href="http://lh4.ggpht.com/__08kic1iueI/SZbT62DGvsI/AAAAAAAAABQ/H-nCkxUqMSQ/s1600-h/system-error%5B8%5D.jpg"&gt;&lt;img title="system-error" style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" height="242" alt="system-error" src="http://lh3.ggpht.com/__08kic1iueI/SZbT7c0_qUI/AAAAAAAAABU/HBAs2ZKcKTY/system-error_thumb%5B8%5D.jpg?imgmax=800" width="400" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;As well, it’s the root cause of a subsequent D&lt;acronym title="Denial of Service"&gt;oS &lt;/acronym&gt;(more later). &lt;/p&gt;  &lt;p&gt;One of the registry keys that was infected was the&amp;#160; &lt;em&gt;&lt;font size="1"&gt;AppInit_DLLs &lt;/font&gt;&lt;/em&gt;key, which Raymond Chen once wrote about in a blog entry aptly entitled&amp;#160; &lt;a href="http://blogs.msdn.com/oldnewthing/archive/2007/12/13/6648400.aspx"&gt;AppInit_DLLs should be renamed Deadlock_Or_Crash_Randomly_DLLs&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Anyway,&amp;#160; kudos to &lt;a href="http://malwarebytes.org/mbam.php"&gt;Malwarebytes' Anti-Malware&lt;/a&gt; for being a very useful tool.&amp;#160; But for a while there, as I sat and watched explorer.exe puts back this registry value no sooner than I deleted it, I felt like I was in the late 80s, early 90s, where viruses freely infected &lt;a href="http://en.wikipedia.org/wiki/MS-DOS"&gt;MS-DOS&lt;/a&gt; in similar manners.&amp;#160; I finally woke up and demoted my dad to non-administrative user level, which brings me to the next point about&amp;#160; antivirus.&lt;/p&gt;  &lt;p&gt;In addition to the annoying popup, Vundo also messed up the antivirus software.&amp;#160; My dad had Norton 360 installed on his system, with at least 30 days remaining in his update subscription.&amp;#160; Yet, Vundo managed to sneak through, and somehow confused it enough to D&lt;acronym title="Denial of Service"&gt;oS&lt;/acronym&gt; my attempt to access the Internet—not only port 80, but all ports were being blocked.&amp;#160; One note of interest: for a while there it was refusing Firefox but lets IE through, but after a while, even IE was returning the&amp;#160; “&lt;em&gt;Web page cannot be found&lt;/em&gt;” message.&amp;#160; Anyway,&amp;#160; I uninstalled Norton after cleaning Vundo and was then able to surf the web again.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;There seems to be some &lt;a href="http://tech.slashdot.org/tech/09/02/05/0221211.shtml"&gt;controversy&lt;/a&gt; about using antivirus software over running Windows under a&amp;#160; non-admin account.&amp;#160; Apparently, over 92% of Windows security vulnerabilities reported last year could have been prevented if users were not using admin accounts.&lt;/p&gt;  &lt;p&gt;I know that for me, running as a non-admin user will probably never fly in a software development environment where running a build requires elevated privilege in order to do COM registrations. As for my dad, non-admin account might suffice for now, but I wonder if it will prevent him from inadvertently falling victim to&amp;#160; phishing scams, which some antivirus software is able to prevent.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-5033246001904743472?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/5033246001904743472/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=5033246001904743472' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/5033246001904743472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/5033246001904743472'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2009/02/vundo-disabled-norton-360.html' title='Vundo disabled Norton 360'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/__08kic1iueI/SZbT7c0_qUI/AAAAAAAAABU/HBAs2ZKcKTY/s72-c/system-error_thumb%5B8%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-3397016410243556208</id><published>2009-02-10T17:58:00.001-05:00</published><updated>2009-02-10T18:00:19.392-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vb6'/><category scheme='http://www.blogger.com/atom/ns#' term='com-interop'/><category scheme='http://www.blogger.com/atom/ns#' term='dotnet'/><title type='text'>Unable to cast COM object of type ‘X’ to interface type ‘_X’</title><content type='html'>&lt;p&gt;I added a new property to my COM class and consequently bumped up its minor version by 1, did some testing with it, and then decided that I wanted to run a clean build.&amp;#160; Now my existing NUnit test cases that use this class are failing with the following message:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="1"&gt;&lt;em&gt;Unable to cast COM object of type MyLib.MyClass' to interface type MyLib._MyClass'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{…}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).,&lt;/em&gt; &lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The interesting thing is that everything compiled without a hitch.&amp;#160; Is this&amp;#160; .NET’s version of &lt;em&gt;BadImplementsRefInCompatLib&lt;/em&gt;?&lt;/p&gt;  &lt;p&gt;Looking that the COM library’s IDL info via oleview.exe , it turned out that the interop assembly was bound to version 1.3 of the COM library, whereas 1.2 was registered on my machine. I regenerated the COM interop assembly for 1.2, and the problem went away.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-3397016410243556208?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/3397016410243556208/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=3397016410243556208' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/3397016410243556208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/3397016410243556208'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2009/02/uanble-to-cast-com-object-of-type-x-to.html' title='Unable to cast COM object of type ‘X’ to interface type ‘_X’'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-4267571022191143171</id><published>2009-02-09T12:27:00.001-05:00</published><updated>2009-02-09T12:29:39.146-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='thunderbird'/><category scheme='http://www.blogger.com/atom/ns#' term='mozilla'/><title type='text'>Bogus TBird error message on 64-bit Windows Vista</title><content type='html'>&lt;p&gt;Thunderbird message:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;Thunderbird is already running, but is not responding. To open a new window, you must first close the existing Thunderbird process, or restart your system.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;At first, when I saw this message this morning, I thought: OMG, some Windows updates that I installed last Friday have actually gone and made TBird 2.0.0.19&amp;#160; incompatible with Vista 64!&amp;#160; &lt;/p&gt;  &lt;p&gt;But then, as hinted from &lt;a href="http://forums.mozillazine.org/viewtopic.php?f=39&amp;amp;t=1071185&amp;amp;p=5642715"&gt;this forum post&lt;/a&gt;, this bogus error actually means that there’s something wrong with the user profile. In my case, the mail folder was sitting on a disk drive that was disconnected. I reconnected it and all was well as before.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-4267571022191143171?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/4267571022191143171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=4267571022191143171' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/4267571022191143171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/4267571022191143171'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2009/02/bogus-tbird-error-message-on-64-bit.html' title='Bogus TBird error message on 64-bit Windows Vista'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-6338574729783723673</id><published>2009-02-03T09:02:00.001-05:00</published><updated>2009-02-03T09:18:36.346-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><title type='text'>The WPF UserControl experiment 1</title><content type='html'>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt;&amp;#160; &lt;br /&gt;To create a &lt;acronym title="Windows Presentation Foundation"&gt;WPF&lt;/acronym&gt; user control that implements basic functionality from a&amp;#160; non-GUI interface, and delegating the rest through abstract methods.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Attempt 1:&lt;/strong&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Defined a base WPF user control BaseWpfControl using XAML.      &lt;br /&gt;&lt;font size="1"&gt;public abstract partial class BaseWpfCustomPropertyEditor : UserControl, Interface1 { …}&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;Then, extend BaseWpfControl, like so:      &lt;br /&gt;&lt;font size="1"&gt;&amp;lt;local:BaseWpfControl x:Class=&amp;quot;MyNameSpace.LoginEditorControl&amp;quot;        &lt;br /&gt;&amp;#160;&amp;#160; xmlns=&amp;quot;&lt;/font&gt;&lt;a href="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&gt;&lt;font size="1"&gt;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;/font&gt;&lt;/a&gt;&lt;font size="1"&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; xmlns:x=&amp;quot;&lt;/font&gt;&lt;a href="http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;"&gt;&lt;font size="1"&gt;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&lt;/font&gt;&lt;/a&gt;&lt;font size="1"&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; xmlns:local=&amp;quot;clr-namespace:MyNameSpace&amp;quot;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Height=&amp;quot;206&amp;quot; Width=&amp;quot;595&amp;quot;&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Grid Height=&amp;quot;300&amp;quot; Width=&amp;quot;418&amp;quot;&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Grid Margin=&amp;quot;10,10,-75,120&amp;quot;&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Grid.ColumnDefinitions&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ColumnDefinition Width=&amp;quot;210*&amp;quot; /&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ColumnDefinition Width=&amp;quot;118*&amp;quot; /&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ColumnDefinition Width=&amp;quot;155*&amp;quot; /&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Grid.ColumnDefinitions&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Label Height=&amp;quot;33&amp;quot; Margin=&amp;quot;6,-1,67,0&amp;quot; Name=&amp;quot;label1&amp;quot; VerticalAlignment=&amp;quot;Top&amp;quot;&amp;gt;Host Name:&amp;lt;/Label&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;TextBox Height=&amp;quot;23&amp;quot; Margin=&amp;quot;12,25,23,0&amp;quot; Name=&amp;quot;txtHostName&amp;quot; TextChanged=&amp;quot;txtHostName_TextChanged&amp;quot; VerticalAlignment=&amp;quot;Top&amp;quot; Grid.ColumnSpan=&amp;quot;3&amp;quot; /&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Label Height=&amp;quot;29&amp;quot; Margin=&amp;quot;6,47,88,0&amp;quot; Name=&amp;quot;label2&amp;quot; VerticalAlignment=&amp;quot;Top&amp;quot;&amp;gt;User Name:&amp;lt;/Label&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;TextBox Height=&amp;quot;23&amp;quot; Margin=&amp;quot;12,71,23,0&amp;quot; Name=&amp;quot;textBox1&amp;quot; VerticalAlignment=&amp;quot;Top&amp;quot; Grid.ColumnSpan=&amp;quot;3&amp;quot; TextChanged=&amp;quot;textBox1_TextChanged&amp;quot; /&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Label Height=&amp;quot;25&amp;quot; Margin=&amp;quot;6,102,94,0&amp;quot; Name=&amp;quot;label3&amp;quot; VerticalAlignment=&amp;quot;Top&amp;quot;&amp;gt;Password:&amp;lt;/Label&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;PasswordBox Height=&amp;quot;23&amp;quot; Margin=&amp;quot;12,133,23,0&amp;quot; Name=&amp;quot;passwordBox1&amp;quot; VerticalAlignment=&amp;quot;Top&amp;quot; Grid.ColumnSpan=&amp;quot;3&amp;quot; PasswordChanged=&amp;quot;passwordBox1_PasswordChanged&amp;quot; /&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Grid&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Grid&amp;gt;         &lt;br /&gt;&amp;lt;/local:BaseWpfCustomPropertyEditor&amp;gt;&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;Got compile-time error: &amp;quot;&lt;a href="http://support.microsoft.com/kb/957231"&gt;cannot be the root of a XAML file because it was defined using XAML&lt;/a&gt;&lt;em&gt;&lt;/em&gt;&amp;quot;&amp;quot; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;em&gt;Conclusion&lt;/em&gt;: WPF user controls were designed for composition, not inheritance.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Attempt 2:&lt;/strong&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Instead of using XAML, simply defined&amp;#160; BaseWpfControl as a class that extends System.Windows.Controls.UserControl &lt;/li&gt;    &lt;li&gt;Repeat Attempt 1.2 &lt;/li&gt;    &lt;li&gt;Now compiles fine. But when trying to bring up LoginEditorControl, got error:      &lt;br /&gt;”&lt;em&gt;Problem Loading … Could not create an instance of&amp;#160; type “BaseWpfControl…”&lt;/em&gt; &lt;/li&gt;    &lt;li&gt;Double-checked, BaseWpfControl did have a default constructor &lt;/li&gt;    &lt;li&gt;Removed &lt;em&gt;abstract partial&lt;/em&gt; keyword in base class&amp;#160; Same problem &lt;/li&gt;    &lt;li&gt;Searched the web; found this &lt;a title="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=292693" href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=292693"&gt;https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=292693&lt;/a&gt;:       &lt;br /&gt;”Hello, if you mark your base generic class as abstract, the designer does not work. I understand this might not be a supported scenario and I'd live with this, if:       &lt;br /&gt;1) it would not work with non-abstract classes as well,       &lt;br /&gt;2) all the XAML code would not get underlined, that is really crazy.” &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;strong&gt;Sub-Goal 1.1:&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;how to make an abstract WPF base control editable in the UI designer? &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Attempt 1.1.1:&lt;/strong&gt;&lt;/p&gt; &lt;strong&gt;&lt;/strong&gt;  &lt;ol&gt;   &lt;li&gt;Per &lt;a title="http://www.urbanpotato.net/default.aspx/document/2001" href="http://www.urbanpotato.net/default.aspx/document/2001"&gt;http://www.urbanpotato.net/default.aspx/document/2001&lt;/a&gt;, annotated BaseWpfControl with       &lt;br /&gt;&lt;em&gt;[TypeDescriptionProvider(typeof(GeneralConcreteClassProvider))]        &lt;br /&gt;[ConcreteClass(typeof(UserControl))] &lt;/em&gt;&lt;/li&gt;    &lt;li&gt;didn’t help … same error “Could not create an instance of …”      &lt;br /&gt;&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;strong&gt;Attempt 1.1.2:&lt;/strong&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Removed &lt;strong&gt;abstract&lt;/strong&gt; keyword from BaseWpfControl . &lt;/li&gt;    &lt;li&gt;Bring LoginEditorControl control back in the VS2008 Visual Designer. Got message:      &lt;br /&gt;”&lt;a href="http://msdn.microsoft.com/en-us/library/bb907310.aspx"&gt;The document root element is not supported by the visual designer&lt;/a&gt;&lt;em&gt;&lt;/em&gt;” &lt;/li&gt;    &lt;li&gt;Changing base class for BaseWpfControl to &lt;em&gt;ContentControl&lt;/em&gt; didn’t help. &lt;/li&gt;    &lt;li&gt;If we changed to using XAML for BaseWpfControl, then we’d be back to problem 1.3 &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;strong&gt;Attempt 1.1.3: immediate work-around&lt;/strong&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Remove abstract keyword from BaseWpfControl &lt;/li&gt;    &lt;li&gt;commented out the line:      &lt;br /&gt;&lt;em&gt;&lt;font size="1"&gt;public partial class LoginEditorControl : UserControl, BaseWpfControl {&lt;/font&gt;&lt;/em&gt;&amp;#160; &lt;/li&gt;    &lt;li&gt;Replaced with:      &lt;br /&gt;&lt;em&gt;&lt;font size="1"&gt;public partial class LoginEditorControl : UserControl {&lt;/font&gt;&lt;/em&gt; &lt;/li&gt;    &lt;li&gt;Replaced XAML declaration      &lt;br /&gt;&lt;em&gt;&lt;font size="1"&gt;&amp;lt;local:BaseWpfControl&amp;#160; x:Class=&amp;quot;MyLib1.LoginEditorControl &amp;quot; xmlns:local=&amp;quot;clr-namespace:MyLib1&amp;quot;          &lt;br /&gt;&lt;/font&gt;&lt;/em&gt;with       &lt;br /&gt;&lt;em&gt;&lt;font size="1"&gt;&amp;lt;UserControl&lt;/font&gt;&lt;/em&gt; &lt;/li&gt;    &lt;li&gt;Edit the control in VS Visual Designer, then undo steps 1-4 prior to running.      &lt;br /&gt;&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Stopped experimenting here. If I had had more time, I would have liked to try these:&lt;/p&gt; &lt;font size="1"&gt;&lt;/font&gt;  &lt;p&gt;&lt;strong&gt;Attempt 1.1.4: better workaround – use XamlPad      &lt;br /&gt;&lt;/strong&gt;Previous process was too cumbersome to undo. Use XamlPad to edit the control GUI, and then paste he result back to the VS project.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Attempt 1.1.5: How to overcome restriction of “multiple class inheritance”?      &lt;br /&gt;&lt;/strong&gt;Use Events instead.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-6338574729783723673?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/6338574729783723673/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=6338574729783723673' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/6338574729783723673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/6338574729783723673'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2009/02/wpf-usercontrol-experiment-1.html' title='The WPF UserControl experiment 1'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-3470280925769220872</id><published>2009-01-19T07:35:00.007-05:00</published><updated>2009-01-19T09:02:56.964-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><title type='text'>citizen journalism</title><content type='html'>Recently, I've come to realize how useful a tool like &lt;a href="http://twitter.com"&gt;Twitter&lt;/a&gt; is, and then I read &lt;a href="http://www.jonathannguyen.net"&gt;Jonathan Nguyen&lt;/a&gt;'s post, claiming that &lt;a href="http://www.jonathannguyen.net/2009/01/citizen-journalism-is-not-journalism/"&gt;citizen journalism is not journalism&lt;/a&gt;. I thought a journalist was simply someone who keeps a journal. :-)&lt;br /&gt;&lt;br /&gt;All joking aside, as a user of software, I couldn't care less if the application, that I am using, has been written in VB, C#, or Python, so long as it gets the job done. The same goes for news: as a consumer of information, I just want to get up-to-the-minute information on the current issue, regardless of whether it was written in &lt;a href="http://en.wikipedia.org/wiki/Leet"&gt;leet&lt;/a&gt; or in perfect English. In that respect, twitterers sometimes do a much better job at it than official news agencies. &lt;br /&gt;&lt;br /&gt;The bottom line is: perhaps it is true that citizen journalism is not journalism, but as an end-user, I don't really care.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-3470280925769220872?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/3470280925769220872/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=3470280925769220872' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/3470280925769220872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/3470280925769220872'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2009/01/citizen-journalism.html' title='citizen journalism'/><author><name>th2tran</name><uri>http://www.blogger.com/profile/18129661984008864019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://2.bp.blogspot.com/_4MC2RcVuvck/S2xT2Kprx6I/AAAAAAAAAzA/-WA6FT4yv98/S220/ThanhHai.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-9080161546353145166</id><published>2009-01-16T18:54:00.005-05:00</published><updated>2009-01-19T01:03:07.655-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='social networking'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><title type='text'>Twittered</title><content type='html'>As usual, it finally took a necessity like &lt;a href="http://search.twitter.com/search?q=%23darkTO"&gt;#darkTO&lt;/a&gt; for me to jump onto the latest techno bandwagon such as &lt;a href="http://twitter.com"&gt;twitter&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-9080161546353145166?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/9080161546353145166/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=9080161546353145166' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/9080161546353145166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/9080161546353145166'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2009/01/twittered.html' title='Twittered'/><author><name>th2tran</name><uri>http://www.blogger.com/profile/18129661984008864019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://2.bp.blogspot.com/_4MC2RcVuvck/S2xT2Kprx6I/AAAAAAAAAzA/-WA6FT4yv98/S220/ThanhHai.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-3755479338515675786</id><published>2008-09-03T19:21:00.002-04:00</published><updated>2008-09-03T18:30:51.767-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='youtube'/><title type='text'>YouTube's 'Related Videos' feature</title><content type='html'>YouTube's 'Related Videos' feature has a serious issue with privacy. According to &lt;a href="http://research.google.com/pubs/author35.html"&gt;Shumeet Baluja&lt;/a&gt;'s paper entitled &lt;a href="http://www.esprockets.com/papers/adsorption-yt.pdf"&gt;Video Suggestion and Discovery for YouTube: Taking Random Walks Through the View Graph [pdf]&lt;/a&gt;, they're using a variant of the adsorption algorithm that is based on co-views statistics. That is: a bunch of people, who watches this video that you're watching, also watches the following videos that you might also enjoy, so here they are. &lt;br /&gt;&lt;br /&gt;Here's the problem. Let's say I'm John Doe. I opened a YouTube account called johndoe and uploaded some home videos here. I also have an alterego named James Bond so I created a second account where I post work related videos there. I am careful to keep the two egos separate: I don't cross link videos from one account to another. But from my home computer I do occasionally review videos from both accounts together. All of a sudden, my James Bond videos show up on the 'Related Videos' list to my John Doe videos. And boom! The whole world knows that John Doe is James Bond, thanks to YouTube.  &lt;br /&gt;&lt;br /&gt;This is an extreme and fictional scenario, but the issue is very real.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-3755479338515675786?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/3755479338515675786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=3755479338515675786' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/3755479338515675786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/3755479338515675786'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2008/09/youtubes-related-videos-feature.html' title='YouTube&apos;s &apos;Related Videos&apos; feature'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-4674213217370846781</id><published>2008-07-04T16:33:00.002-04:00</published><updated>2008-07-04T16:36:26.502-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='network admin'/><title type='text'>HOW TO retrieve the host name of an IP address</title><content type='html'>Use:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;ping -a &amp;lt;ip-address&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-4674213217370846781?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/4674213217370846781/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=4674213217370846781' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/4674213217370846781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/4674213217370846781'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2008/07/how-to-retrieve-host-name-of-ip-address.html' title='HOW TO retrieve the host name of an IP address'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-7398836382326329415</id><published>2008-06-19T18:20:00.007-04:00</published><updated>2008-06-23T13:56:10.144-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vb6'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='dotnet'/><title type='text'>VB6 BadImplementsRefInCompatLib and .NET-COM Interop</title><content type='html'>You've created a VB6 COM library, MyLib1 (1.0). &lt;br /&gt;You then have two usage scenarios for MyLib1:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;MyLib1 is, in turn, used by another VB6 library, MyLib2&lt;/li&gt;&lt;br /&gt;&lt;li&gt;MyLib1 is used to generate a COM Interop assembly which is consumed by a .NET assembly called MyDotNetLib, which itself is also a COM interop library.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;It so happened that you needed to add some new public methods to MyLib1, which would bring its versioning to 1.1. You were careful to craft the change such that it's backward compatible. Yet, something happened--you don't yet know exactly what it was--and when to try to recompile the above two libraries, you get the following problem scenarios:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Recompile MyLib2, you get this error: &lt;span style="font-style:italic;"&gt;BadImplementsRefInCompatLib&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Recompile MyDotNetLib, you get:&lt;br /&gt;&lt;code&gt;Error 63 The assembly "..MyDotNetLib.dll" could not be converted to a type library. Type library exporter encountered an error while processing 'MyDotNetLib.MyComponent, MyDotNetLib'. Error: Referenced type is defined in managed component, which is imported from a type library that could not be loaded (type: 'MyLib1._IComponent'; component: '...\Interop.MyLib1.dll')&lt;/code&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;What did you do wrong?&lt;/span&gt;&lt;br /&gt;As it turns out, the "something" in "something happened" above was an IDE debug session that had previously crashed, and MyLib1.vbp (1.1) remained registered in the system.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Why did that cause the above problems to occur?&lt;/span&gt;&lt;br /&gt;The IDE looks for the latest version of the library (same GUID) to bind to.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;How to avoid it?&lt;/span&gt;&lt;br /&gt;Well, you can't avoid it, any more than you can avoid making VB6 crash.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;What to do when it happens?&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Temporarily remove reference to MyLib1 from your MyLib2 project, then attempt to re-add the reference, looking through the list of registered libraries to see how many instances of MyLib1 are registered--there should be only one. If you see a MyLib1.vbp showing in your list, you'll need to go through the registry and manually remove all CLSIDs with InprocServer32="MyLib1.vbp". The automatic registry clean tools, that I've tried, couldn't remove these entries for me.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Retrace your changes to make sure that you haven't made any modification to public interfaces that could break binary compatibility.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Use the &lt;span style="font-weight:bold;"&gt;OLE/COM Object Viewer&lt;/span&gt; tool to view Type Library info of MyLib1.dll. Then compare the output with a previous version of the binary to see if any of the interface GUIDs got inadvertently changed. &lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;Pre-emptive comment:&lt;br /&gt;Yes, I know &lt;a href="http://msdn.microsoft.com/en-us/vbrun/ms788708.aspx"&gt;VB6 (the IDE) has reached its end-of-life&lt;/a&gt;, which means MS support for it will be scarce--all the more reason for writing this post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-7398836382326329415?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/7398836382326329415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=7398836382326329415' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/7398836382326329415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/7398836382326329415'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2008/06/vb6-badimplementsrefincompatlib-and-net.html' title='VB6 BadImplementsRefInCompatLib and .NET-COM Interop'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-3492743795817537906</id><published>2008-06-13T18:04:00.005-04:00</published><updated>2008-06-13T18:30:19.608-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kudos'/><category scheme='http://www.blogger.com/atom/ns#' term='unit-testing'/><category scheme='http://www.blogger.com/atom/ns#' term='nunitforms'/><category scheme='http://www.blogger.com/atom/ns#' term='dotnet'/><title type='text'>NUnitForms rocks!</title><content type='html'>This &lt;a href="http://nunitforms.sourceforge.net/"&gt;NunitForms&lt;/a&gt; tool is really cool. Kudos to &lt;a href="http://sourceforge.net/users/lukemaxon/"&gt;Luke Maxon&lt;/a&gt; and co. I'm running v2.0 alpha 5 and so far, my favourite feature has got to be &lt;span style="font-style:italic;"&gt;ControlTester.FireEvent()&lt;/span&gt;. For instance, I can simulate the drag operation with something like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;// initialize control tester for our Finder control&lt;br /&gt;ControlTester myControl = new ControlTester("picFinder", "MyTestForm");&lt;br /&gt;&lt;br /&gt;// simulate drag to coordinate (105,205)&lt;br /&gt;myControl.FireEvent("MouseDown", (EventArgs)null);&lt;br /&gt;Cursor.Position = new Point(105, 205); // drag mouse to here&lt;br /&gt;myControl.FireEvent("MouseMove", (EventArgs)null);&lt;br /&gt;myControl.FireEvent("MouseUp", (EventArgs)null);&lt;br /&gt;&lt;br /&gt;// Assert MyTestForm GUI states&lt;br /&gt;...&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Pretty neat.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-3492743795817537906?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/3492743795817537906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=3492743795817537906' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/3492743795817537906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/3492743795817537906'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2008/06/nunitforms-rocks.html' title='NUnitForms rocks!'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-2882785330414634540</id><published>2008-06-12T23:23:00.003-04:00</published><updated>2008-06-12T23:47:29.309-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SpamAssassin'/><category scheme='http://www.blogger.com/atom/ns#' term='admin'/><category scheme='http://www.blogger.com/atom/ns#' term='IT'/><category scheme='http://www.blogger.com/atom/ns#' term='csharp'/><title type='text'>spamc.exe hangs</title><content type='html'>For the past several weeks, our &lt;a href="http://th2tran.blogspot.com/2004/11/spamassassin-kills-spam-dead-on-its_18.html"&gt; ESA Sink&lt;/a&gt; has been clogging up once in a while. This is because spamc.exe, the SpamAssassin client program spawned by ESA, simply hung (probably due to a particularly large email). &lt;br /&gt;&lt;br /&gt;I was thinking of rewriting spamc using Uwe Keim's &lt;a href="http://www.codeproject.com/KB/cs/ZetaSpamAssassin.aspx"&gt;ZetaSpamAssassin Wrapper&lt;/a&gt;, but that's probably a weekend type of project that I might entertain in the future. In the mean time, I wrote this simple little Windows service that occasionally checks and reaps stale spamc.exe processes, allowing the filter to continue. Source code (C#) and binary are available &lt;a href="http://th2tran.googlepages.com/spamcmon.zip"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-2882785330414634540?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/2882785330414634540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=2882785330414634540' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/2882785330414634540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/2882785330414634540'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2008/06/spamcexe-hangs.html' title='spamc.exe hangs'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-2002615911860166348</id><published>2008-06-09T16:19:00.007-04:00</published><updated>2008-06-11T12:23:11.927-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unit-testing'/><category scheme='http://www.blogger.com/atom/ns#' term='dotnet'/><category scheme='http://www.blogger.com/atom/ns#' term='csharp'/><title type='text'>Rhino.Mocks ExpectationViolationException</title><content type='html'>I'm trying out &lt;a href="http://www.ayende.com/projects/rhino-mocks/documentation.aspx"&gt;Rhino.Mocks&lt;/a&gt; in my NUnit test suites. Why Rhino.Mocks instead of &lt;a href="http://www.nmock.org/"&gt;NMock&lt;/a&gt;, you ask? Well, because I've heard that Rhino.Mocks can mock classes as well as interfaces.&lt;br /&gt;&lt;br /&gt;Anyway, I was running into a little bit of a rookie's setback. I set up my mock objects like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;1   const string TESTNAME = @"My Component Name";&lt;br /&gt;2   MockRepository mocks = new MockRepository();&lt;br /&gt;3   MyLib.MyTestClass tw = mocks.CreateMock&amp;lt;MyLib.MyTestClass&amp;gt;();&lt;br /&gt;4   Expect.Call(tw.get_Name()).Return(TESTNAME);&lt;br /&gt;5   mocks.ReplayAll();&lt;br /&gt;    // Test first invocation of get_Name()&lt;br /&gt;6   Assert.AreEqual(tw.get_Name(), TESTNAME);&lt;br /&gt;    // Test second invocation of get_Name()&lt;br /&gt;7   Assert.AreEqual(tw.get_Name(), TESTNAME);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I should probably add that MyLib.MyTestClass is a COM Interop class.&lt;br /&gt;&lt;br /&gt;Executing line 7 resulted in this exception: &lt;span style="font-style:italic;"&gt;Rhino.Mocks.Exceptions.ExpectationViolationException : _MyTestClass.get_Name(); Expected #1, Actual #2.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A little bit of googling did not immediately hint at the proper solution for me, but looking at the API documentation  turned up this method: &lt;span style="font-style:italic;"&gt;Repeat.AtLeastOnce()&lt;/span&gt;. So adjusting line 4 above to this did the trick:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;4   Expect.Call(tw.get_Name()).Return(TESTNAME).Repeat.AtLeastOnce();&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-2002615911860166348?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/2002615911860166348/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=2002615911860166348' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/2002615911860166348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/2002615911860166348'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2008/06/rhinomocks-expectationviolationexceptio.html' title='Rhino.Mocks ExpectationViolationException'/><author><name>th2tran</name><uri>http://www.blogger.com/profile/18129661984008864019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://2.bp.blogspot.com/_4MC2RcVuvck/S2xT2Kprx6I/AAAAAAAAAzA/-WA6FT4yv98/S220/ThanhHai.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-3000171300847133213</id><published>2008-06-04T15:52:00.004-04:00</published><updated>2008-06-04T16:20:23.402-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plug'/><category scheme='http://www.blogger.com/atom/ns#' term='gaming'/><title type='text'>PMOG</title><content type='html'>Heard about this on CBC RadioOne's &lt;a href="http://www.cbc.ca/spark/"&gt;Spark&lt;/a&gt; this morning:&lt;br /&gt;The Passively Multiplayer Online Game (&lt;a href="http://pmog.com/"&gt;PMOG&lt;/a&gt;):&lt;br /&gt;&lt;object type="application/x-shockwave-flash" data="http://www.flickr.com/apps/video/stewart.swf?v=49235" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" height="225" width="400"&gt; &lt;param name="flashvars" value="intl_lang=en-us&amp;amp;photo_secret=97d67a84c2&amp;amp;photo_id=2486130080"&gt; &lt;param name="movie" value="http://www.flickr.com/apps/video/stewart.swf?v=49235"&gt; &lt;param name="bgcolor" value="#000000"&gt; &lt;param name="allowFullScreen" value="true"&gt;&lt;embed type="application/x-shockwave-flash" src="http://www.flickr.com/apps/video/stewart.swf?v=49235" bgcolor="#000000" allowfullscreen="true" flashvars="intl_lang=en-us&amp;amp;photo_secret=97d67a84c2&amp;amp;photo_id=2486130080" height="225" width="400"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Cool idea!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-3000171300847133213?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/3000171300847133213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=3000171300847133213' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/3000171300847133213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/3000171300847133213'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2008/06/pmog.html' title='PMOG'/><author><name>th2tran</name><uri>http://www.blogger.com/profile/18129661984008864019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://2.bp.blogspot.com/_4MC2RcVuvck/S2xT2Kprx6I/AAAAAAAAAzA/-WA6FT4yv98/S220/ThanhHai.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-4837848938347245539</id><published>2008-05-29T15:51:00.004-04:00</published><updated>2009-02-10T17:03:18.754-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='com-interop'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='dotnet'/><category scheme='http://www.blogger.com/atom/ns#' term='csharp'/><title type='text'>Why  it's good to use [System] Hungarian notation</title><content type='html'>One of our components has a property called--for reason of obscurity say--&lt;span style="font-weight:bold;"&gt;URL&lt;/span&gt;. The code behind it is quite simple:  &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;        public string &lt;span style="font-weight:bold;"&gt;URL&lt;/span&gt; {&lt;br /&gt;            get {&lt;br /&gt;                return mstrURL;&lt;br /&gt;            }&lt;br /&gt;            set {&lt;br /&gt;                mstrURL = value;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This property is being edited through our Property Editor component via a sort of &lt;a href="http://en.wikipedia.org/wiki/Reflection_%28computer_science%29"&gt;reflection mechanism&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Sometime ago, this component broke because the Property Editor was no longer able to "reflect" on the &lt;span style="font-weight:bold;"&gt;URL&lt;/span&gt; property.&lt;br /&gt;&lt;br /&gt;A bit of googling turned up &lt;a href="http://support.microsoft.com/kb/q220137/"&gt;this MSKB article&lt;/a&gt;: "Type library identifiers are not case sensitive by design".&lt;br /&gt;&lt;br /&gt;It turned out that somebody recently added this method in a completely different class, within the same assembly, but entirely unrelated to the component above:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;   public void LoadUrl(string &lt;span style="font-weight:bold;"&gt;url&lt;/span&gt;) {&lt;br /&gt;      ...&lt;br /&gt;   }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So the code that gets called by RegAsm to generate the type library must have found the &lt;span style="font-weight:bold;"&gt;url&lt;/span&gt; parameter of the LoadUrl method first, and decided to reuse it as the moniker for our &lt;span style="font-weight:bold;"&gt;URL&lt;/span&gt; property. &lt;br /&gt;&lt;br /&gt;I guess the moral of this story is: Stick with &lt;a href="http://en.wikipedia.org/wiki/Hungarian_notation#Systems_vs._Apps_Hungarian"&gt;System  Hungarian Notation&lt;/a&gt;.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;   public void LoadUrl(string &lt;span style="font-weight:bold;"&gt;strUrl&lt;/span&gt;) {&lt;br /&gt;      ...&lt;br /&gt;   }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;(Side Note: A good article on Hungarian Notation can be found at &lt;a href="http://www.joelonsoftware.com/articles/Wrong.html"&gt;Joel On Software&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-4837848938347245539?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/4837848938347245539/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=4837848938347245539' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/4837848938347245539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/4837848938347245539'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2008/05/why-its-good-to-use-system-hungarian.html' title='Why  it&apos;s good to use [System] Hungarian notation'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-663344724997076856</id><published>2008-03-28T07:10:00.002-04:00</published><updated>2008-03-28T07:14:16.124-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TODO'/><category scheme='http://www.blogger.com/atom/ns#' term='AppConnector'/><title type='text'>TODO: Add my AppConnector related posts to karora.com's blogroll</title><content type='html'>Here's the feed URL:&lt;br /&gt;&lt;a href="http://th2tran.blogspot.com/feeds/posts/default/-/AppConnector"&gt;http://th2tran.blogspot.com/feeds/posts/default/-/AppConnector&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-663344724997076856?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/663344724997076856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=663344724997076856' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/663344724997076856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/663344724997076856'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2008/03/todo-add-my-appconnector-related-posts.html' title='TODO: Add my AppConnector related posts to karora.com&apos;s blogroll'/><author><name>th2tran</name><uri>http://www.blogger.com/profile/18129661984008864019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://2.bp.blogspot.com/_4MC2RcVuvck/S2xT2Kprx6I/AAAAAAAAAzA/-WA6FT4yv98/S220/ThanhHai.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-7083611125991181073</id><published>2008-03-27T22:37:00.008-04:00</published><updated>2008-03-28T06:15:03.824-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AppConnector'/><title type='text'>Citrix published apps: no software to install? no problem.</title><content type='html'>Here's a challenge: You've got 2 web apps, pushed out to client PCs via Citrix as published apps,  running side by side on two browser instances. How do you make them talk to each other (i.e. exchange data between the two) without having to modify the 2 apps? &lt;br /&gt;&lt;br /&gt;That's the challenge that I was presented today as I was helping a partner build a &lt;acronym title="Proof Of Concept"&gt;POC&lt;/acronym&gt; for a prospect. The kicker of it was, I was told one of our biggest competitors was given this challenge and couldn't do it.&lt;br /&gt;&lt;br /&gt;Here's the specific scenario that we were able to get implemented within about 3 hours: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;user logs into Citrix web interface.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;user clicks on icon of published app--in this case it was JD Edwards EnterpriseOne web--to launch it.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;user navigates to JDE Supplier Ledger inquiry screen, brings up a supplier number and PO number.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;AppConnector KoolBar appears on the local desktop with a button labeled &lt;span style="font-weight:bold;"&gt;Get Image&lt;/span&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;User clicks on button, which triggers a search against Imaging system and brings up the scanned invoice image.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;And the kicker of it is, there is no AppConnector footprint on the local desktop.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-7083611125991181073?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/7083611125991181073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=7083611125991181073' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/7083611125991181073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/7083611125991181073'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2008/03/citrix-published-apps-no-software-to.html' title='Citrix published apps: no software to install? no problem.'/><author><name>th2tran</name><uri>http://www.blogger.com/profile/18129661984008864019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://2.bp.blogspot.com/_4MC2RcVuvck/S2xT2Kprx6I/AAAAAAAAAzA/-WA6FT4yv98/S220/ThanhHai.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-7487773367261627318</id><published>2008-03-17T15:45:00.005-04:00</published><updated>2008-03-17T16:12:49.305-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='admin'/><category scheme='http://www.blogger.com/atom/ns#' term='IT'/><category scheme='http://www.blogger.com/atom/ns#' term='ssh'/><title type='text'>svn over putty over http (over proxy)</title><content type='html'>A while ago, someone asked me about accessing their svn server from inside a customer network, which blocks everything except port 80. I didn't have an answer at the time.  Then, I was at a customer site last week and ran into a similar problem. This is how I overcame it:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Set up your HTTP server to proxy SSH. See &lt;a href="http://th2tran.blogspot.com/2006/12/ssh-proxying-via-apache.html"&gt;here&lt;/a&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Tunnel the svn port through PuTTY. See &lt;a href="http://th2tran.blogspot.com/2005/05/who-needs-gotomypc.html"&gt;here&lt;/a&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Add an entry to your %windir%\system32\drivers\etc\hosts file:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;# SVN Server&lt;br /&gt;127.0.0.1 svnhost.mycompany.com&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;This is done so that you don't have to change your current SVN client settings.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;If the customer network happens to use a web proxy, enter the proxy settings in the PuTTY's Connection\Proxy panel.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-7487773367261627318?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/7487773367261627318/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=7487773367261627318' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/7487773367261627318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/7487773367261627318'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2008/03/svn-over-putty-over-http-over-proxy.html' title='svn over putty over http (over proxy)'/><author><name>th2tran</name><uri>http://www.blogger.com/profile/18129661984008864019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://2.bp.blogspot.com/_4MC2RcVuvck/S2xT2Kprx6I/AAAAAAAAAzA/-WA6FT4yv98/S220/ThanhHai.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-733969114717027815</id><published>2008-03-12T15:47:00.000-04:00</published><updated>2008-03-12T16:00:39.783-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>My Google Desktop Search is Locked!</title><content type='html'>I accidentally locked my Desktop Search. And as far as I can tell, the systray memu item called "Unlock Search..." is just there for decoration (I have version 5.7.801.1629), because it did nothing for me when I clicked on it. I could only surmise that the menu item was trying to launch a URL in my default browser, failed for some reason, and decided to keep quiet about it.&lt;br /&gt;&lt;br /&gt;Eventually managed to find out the port (4664), went there and unlocked it via the web interface:  &lt;a href="http://127.0.0.1:4664/&amp;amp;s=P5Ll_bKEudrxKb_pU9NbZ9oulCc"&gt;http://127.0.0.1:4664/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4MC2RcVuvck/R9cI2KRvRYI/AAAAAAAAABQ/oBwQ7ixPNyM/s1600-h/unlock_gdesktop_search.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_4MC2RcVuvck/R9cI2KRvRYI/AAAAAAAAABQ/oBwQ7ixPNyM/s200/unlock_gdesktop_search.jpg" alt="" id="BLOGGER_PHOTO_ID_5176616023250388354" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I don't know how I had been able to live without &lt;a href="http://desktop.google.com/"&gt;Google Desktop&lt;/a&gt;. I use it primarily for searching my inbox (8 years' worth of emails).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-733969114717027815?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/733969114717027815/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=733969114717027815' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/733969114717027815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/733969114717027815'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2008/03/my-google-desktop-search-is-locked.html' title='My Google Desktop Search is Locked!'/><author><name>th2tran</name><uri>http://www.blogger.com/profile/18129661984008864019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://2.bp.blogspot.com/_4MC2RcVuvck/S2xT2Kprx6I/AAAAAAAAAzA/-WA6FT4yv98/S220/ThanhHai.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_4MC2RcVuvck/R9cI2KRvRYI/AAAAAAAAABQ/oBwQ7ixPNyM/s72-c/unlock_gdesktop_search.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-110932941280085177</id><published>2008-03-11T16:17:00.001-04:00</published><updated>2008-03-11T16:22:36.854-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AppConnector'/><title type='text'>ROI on process automation</title><content type='html'>I wrote this corny rant on 2-25-2005 but never posted. Upon re-reading, I think it's worth posting.&lt;br /&gt;---&lt;br /&gt;&lt;br /&gt;An A/P Clerk, and &lt;a href="http://www.karora.com/appconnector/appconnoview.htm"&gt;AppConnector&lt;/a&gt; user, called me up this week and happily proclaimed: "yesterday, I did four days' worth of work in one day".&lt;br /&gt;&lt;br /&gt;Wow...that's a 400% productivity improvement by using AppConnector simply to automate a multiple data entry process into the single-point data entry process. I did some simple (read: naive) calculations and...say, for an organization staffing 10 accounting clerks working on a $10/hr salary just keying and searching for invoices, in a month's time, the costs incurred would be as follows:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt; no AppConnector: 10 x 8 x 10 x 5 x 4=$16000&lt;br /&gt;&lt;li&gt; with AppConnector = 16000/4 = $4000, a saving of $12000.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;This means that in the short order of a few months, AppConnector would have paid for itself. Pretty good ROI, isn't it?&lt;br /&gt;&lt;br /&gt;I said that's a naive calculation because, amongst other things, this productivity gain usually has side benefits such as less data re-keying errors, which, in the first instance, would have incurred more costs of correcting the problem after-the-fact. This benefit results in data consistency across disparate systems.  Mind you, that's not to say that AppConnector will totally eliminate data entry errors altogether, because if the error was made in the originating system, it would be replicated in the second system as well when the data is brought over. But then this would be an entirely different problem, not one of re-keying errors.    &lt;br /&gt;&lt;br /&gt;Back in high school, I did an Economics research paper on process automation and fifth generation computers--the kind of computer systems referred as "expert systems" at the time. This was a time where there were rumbling apprehensions in the labour force about how these great evil things called "computers" would eventually take over the world and put people out of a job because everything would be automated by computers/robots. Anyway, my thesis for the paper was that computers were built to help mankind not to replace it. Any "unskilled" job that they might end up replacing would be an opportunity for people to learn new skills and adapt.  This is good for humanity because we don't want to be stuck with the same inefficiency all the time--whether we realize that it is an inefficiency or not--but we should strive to better ourselves each and every day. And isn't that what evolution is all about?&lt;br /&gt;&lt;br /&gt;But this was high school, and nearly 20 years ago when I was young(er) and (more) stupid, so what did I know!&lt;br /&gt;&lt;br /&gt;Definition: A change that is good is one that benefit you, your organization or, more generally, humanity, in the long run.&lt;br /&gt;&lt;br /&gt;When change is good, resistance is futile. Be one with the force (of change, that is)!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-110932941280085177?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/110932941280085177/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=110932941280085177' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/110932941280085177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/110932941280085177'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2008/03/roi-on-process-automation.html' title='ROI on process automation'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-294819193756726021</id><published>2008-03-10T11:36:00.016-04:00</published><updated>2008-03-10T12:30:10.274-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mix conference'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>Microsoft's CTO @ MIX08</title><content type='html'>&lt;a href="http://en.wikipedia.org/wiki/Ray_Ozzie"&gt;Ray Ozzie&lt;/a&gt;'s keynote @ &lt;a href="http://visitmix.com/2008/default.aspx"&gt;MIX08&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;embed type="application/x-mplayer2" pluginspage="http://www.microsoft.com/Windows/MediaPlayer/" src="http://wm.istreamplanet.com/customers/ms/100_microsoft_mix_080305.asx" name="MediaPlayer" transparentatstart="0" autostart="0" volume="100" animationAtStart="0" displaysize="0" width="480" height="270"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;Source: &lt;a href="http://www.microsoft.com/Presspass/exec/ozzie/03-05-08MIX.mspx"&gt;Microsoft PressPass&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-294819193756726021?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/294819193756726021/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=294819193756726021' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/294819193756726021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/294819193756726021'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2008/03/microsofts-cto-mix08.html' title='Microsoft&apos;s CTO @ MIX08'/><author><name>th2tran</name><uri>http://www.blogger.com/profile/18129661984008864019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://2.bp.blogspot.com/_4MC2RcVuvck/S2xT2Kprx6I/AAAAAAAAAzA/-WA6FT4yv98/S220/ThanhHai.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-2122741602003093089</id><published>2008-02-12T12:22:00.000-05:00</published><updated>2008-02-12T12:28:21.336-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>ROT Registration requires 'DCOM Server Process Launcher'</title><content type='html'>Interesting titbit I found yesterday after a two-hour troubleshooting session with a customer. One of our application components registers itself in the &lt;acronym title="Running Object Table"&gt;ROT&lt;/acronym&gt; so that it can be accessed by other application processes. In this particular instance, the ROT registration step fails with the usual cryptic error message "The system cannot find the file specified".&lt;br /&gt;As it turned out, the user had the 'DCOM Server Process Launcher' service disabled.&lt;br /&gt;&lt;br /&gt;More details &lt;a href="http://www.karora.ca/forums/kb.php?mode=article&amp;k=13"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Thanks, Ken, for providing the diagnostics.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-2122741602003093089?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/2122741602003093089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=2122741602003093089' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/2122741602003093089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/2122741602003093089'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2008/02/rot-registration-requires-dcom-server.html' title='ROT Registration requires &apos;DCOM Server Process Launcher&apos;'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-8970113649493800285</id><published>2008-01-31T13:23:00.000-05:00</published><updated>2008-01-31T13:42:12.740-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>A bug is still a bug by any other name</title><content type='html'>I don't understand why (some) people are (still?) so afraid of saying the word "bug" to a customer. It is what it is. Why mince words? Although...I've been known to call something a "bug" when in fact it was just a "configuration issue". :-)&lt;br /&gt;&lt;br /&gt;Read: &lt;a href="http://query.nytimes.com/gst/fullpage.html?res=9902E1D6113DF936A25755C0A961958260"&gt;A Bug by Any Other Name&lt;/a&gt; by &lt;a href="http://en.wikipedia.org/wiki/James_Gleick"&gt;James Gleick&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-8970113649493800285?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/8970113649493800285/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=8970113649493800285' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/8970113649493800285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/8970113649493800285'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2008/01/bug-is-still-bug-by-any-other-name.html' title='A bug is still a bug by any other name'/><author><name>th2tran</name><uri>http://www.blogger.com/profile/18129661984008864019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://2.bp.blogspot.com/_4MC2RcVuvck/S2xT2Kprx6I/AAAAAAAAAzA/-WA6FT4yv98/S220/ThanhHai.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-5852749526127106435</id><published>2007-11-09T12:55:00.000-05:00</published><updated>2007-11-09T13:13:40.998-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='admin'/><category scheme='http://www.blogger.com/atom/ns#' term='blogger.com'/><title type='text'>New Kubrick XML template applied</title><content type='html'>I finally got a few spare minutes to do some housekeeping on this blog, upgraded to the new Kubrick XML template (thanks to &lt;a href="htp://templatesforyou.blogspot.com"&gt;Erica&lt;/a&gt;, &lt;a href="http://chenkaie.blogspot.com"&gt;Kaie&lt;/a&gt;, and &lt;a href="http://www.geckoandfly.com"&gt;Michael&lt;/a&gt;). I liked &lt;a href="http://web.archive.org/web/20070528050852/th2tran.blogspot.com/2005/06/filming-of-sentinel-at-sherway-gardens.html"&gt;the old two-tab template&lt;/a&gt; better, though, but had to upgrade to the new Blogger XML template because I wanted to take advantage of the new widget feature.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-5852749526127106435?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/5852749526127106435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=5852749526127106435' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/5852749526127106435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/5852749526127106435'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2007/11/new-kubrick-xml-template-applied.html' title='New Kubrick XML template applied'/><author><name>th2tran</name><uri>http://www.blogger.com/profile/18129661984008864019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://2.bp.blogspot.com/_4MC2RcVuvck/S2xT2Kprx6I/AAAAAAAAAzA/-WA6FT4yv98/S220/ThanhHai.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-7544095764749412745</id><published>2007-10-30T11:41:00.000-04:00</published><updated>2007-11-09T13:27:00.497-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vs2005'/><category scheme='http://www.blogger.com/atom/ns#' term='vb6'/><category scheme='http://www.blogger.com/atom/ns#' term='dotnet'/><category scheme='http://www.blogger.com/atom/ns#' term='csharp'/><title type='text'>Hosting .NET controls in VB6</title><content type='html'>I recently ran into a need to interop a C# .NET user control with a VB6 form.&lt;br /&gt;&lt;br /&gt;We all know that VB6 only allows you to reference a user control if it resides in an OCX.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn2.microsoft.com/en-us/vbasic/aa701259.aspx"&gt;The Interop Forms Toolkit&lt;/a&gt;, mentioned &lt;a href="http://blogs.msdn.com/calvin_hsia/archive/2006/07/14/665830.aspx"&gt;here&lt;/a&gt;, seems to be only good for VB.NET user controls.&lt;br /&gt;&lt;br /&gt;Prior to this, I've been able to get by with dynamically adding the control via &lt;code&gt;Controls.Add {COMClassname}, {ControlName}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;But now, I need to be able to manipulate the control in design time.&lt;br /&gt;&lt;br /&gt;So, based on the above experience, I created a very basic VB6 user control called &lt;span style="font-weight:bold;"&gt;DotNetControlWrapper&lt;/span&gt;. The tricks with this control are the following:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;There's a public property called &lt;span style="font-weight:bold;"&gt;DotNetClassName&lt;/span&gt;, which is a COM class name of the .NET control.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;It delegates resizing logic to the .NET control.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;It exposes the .NET control via a &lt;span style="font-weight:bold;"&gt;DotNetObject&lt;/span&gt; property, thus allowing the user to sync the control's events if needed.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;The bulk of &lt;span style="font-weight:bold;"&gt;DotNetControlWrapper.ctl&lt;/span&gt; looks like this:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;font color="#a020f0"&gt;Option Explicit&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#a020f0"&gt;Private&lt;/font&gt; object As &lt;font color="#a020f0"&gt;Object&lt;/font&gt;&lt;br /&gt;&lt;font color="#a020f0"&gt;Private&lt;/font&gt; ctlExtender &lt;font color="#a020f0"&gt;As&lt;/font&gt; VBControlExtender&lt;br /&gt;&lt;font color="#a020f0"&gt;Private&lt;/font&gt;  mstrDotNetClass &lt;font color="#a020f0"&gt;As String&lt;/font&gt; &lt;br /&gt;&lt;br /&gt;&lt;font color="#a020f0"&gt;Public Property Get&lt;/font&gt;  DotNetClassName() As &lt;font color="#a020f0"&gt;String&lt;/font&gt;&lt;br /&gt;   DotNetClassName = mstrDotNetClass&lt;br /&gt;&lt;font color="#a020f0"&gt;End Property&lt;/font&gt; &lt;br /&gt;&lt;font color="#a020f0"&gt;Public Property Let&lt;/font&gt; DotNetClassName(&lt;font color="#a020f0"&gt;ByVal&lt;/font&gt; clsname &lt;font color="#a020f0"&gt;As String&lt;/font&gt;)&lt;br /&gt;   mstrDotNetClass = clsname&lt;br /&gt;   &lt;font color="#a020f0"&gt;If&lt;/font&gt; mstrDotNetClass = "" &lt;font color="#a020f0"&gt;Then Exit Property&lt;/font&gt;&lt;br /&gt;   ' initialize the .NET control&lt;br /&gt;   &lt;font color="#a020f0"&gt;If Not&lt;/font&gt; ctlExtender &lt;font color="#a020f0"&gt;Is Nothing Then&lt;/font&gt;&lt;br /&gt;     Controls.Remove UserControl.Extender.Name + "_dotnet"&lt;br /&gt;   &lt;font color="#a020f0"&gt;End If&lt;/font&gt;&lt;br /&gt;   &lt;font color="#a020f0"&gt;Set&lt;/font&gt; ctlExtender = Controls.Add(mstrDotNetClass, UserControl.Extender.Name + "_dotnet")&lt;br /&gt;   ctlExtender.ZOrder 0&lt;br /&gt;   &lt;font color="#a020f0"&gt;Set&lt;/font&gt; object = ctlExtender.object&lt;br /&gt;&lt;font color="#a020f0"&gt;End Property&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#a020f0"&gt;Private Sub&lt;/font&gt; UserControl_Resize()&lt;br /&gt;   &lt;font color="#a020f0"&gt;If&lt;/font&gt; object &lt;font color="#a020f0"&gt;Is Nothing Then Exit Sub&lt;/font&gt;&lt;br /&gt;   ctlExtender.Move 0, 0, UserControl.Width, UserControl.Height&lt;br /&gt;   object.BringToFront ' Bring the .NET control to foreground&lt;br /&gt;&lt;font color="#a020f0"&gt;End Sub&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#a020f0"&gt;Private Sub&lt;/font&gt; UserControl_Show()&lt;br /&gt;   &lt;font color="#a020f0"&gt;If&lt;/font&gt; ctlExtender &lt;font color="#a020f0"&gt;Is Nothing Then Exit Sub&lt;/font&gt;&lt;br /&gt;   ctlExtender.Visible = &lt;font color="#a020f0"&gt;True&lt;/font&gt;&lt;br /&gt;&lt;font color="#a020f0"&gt;End Sub&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#a020f0"&gt;Public Property Get&lt;/font&gt; DotNetObject() &lt;font color="#a020f0"&gt;As Object&lt;/font&gt;&lt;br /&gt;   &lt;font color="#a020f0"&gt;Set&lt;/font&gt; DotNetObject = object&lt;br /&gt;&lt;font color="#a020f0"&gt;End Property&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#a020f0"&gt;Private Sub&lt;/font&gt; UserControl_Terminate()&lt;br /&gt;   &lt;font color="#a020f0"&gt;If&lt;/font&gt; ctlExtender &lt;font color="#a020f0"&gt;Is Nothing Then Exit Sub&lt;/font&gt;&lt;br /&gt;   &lt;font color="#a020f0"&gt;Set&lt;/font&gt; ctlExtender = Nothing&lt;br /&gt;   object.Dispose&lt;br /&gt;   &lt;font color="#a020f0"&gt;Set&lt;/font&gt; object = Nothing&lt;br /&gt;&lt;font color="#a020f0"&gt;End Sub&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#a020f0"&gt;Private Sub&lt;/font&gt; UserControl_WriteProperties(PropBag As PropertyBag)&lt;br /&gt;   PropBag.WriteProperty "DotNetClassName", mstrDotNetClass&lt;br /&gt;   PropBag.WriteProperty "Width", UserControl.Width&lt;br /&gt;   PropBag.WriteProperty "Height", UserControl.Height&lt;br /&gt;&lt;font color="#a020f0"&gt;End Sub&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#a020f0"&gt;Private Sub&lt;/font&gt; UserControl_ReadProperties(PropBag As PropertyBag)&lt;br /&gt;   On Error Resume Next&lt;br /&gt;   DotNetClassName = PropBag.ReadProperty("DotNetClassName")&lt;br /&gt;   Width = PropBag.ReadProperty("Width")&lt;br /&gt;   Height = PropBag.ReadProperty("Height")&lt;br /&gt;&lt;font color="#a020f0"&gt;End Sub&lt;/font&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-7544095764749412745?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/7544095764749412745/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=7544095764749412745' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/7544095764749412745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/7544095764749412745'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2007/10/hosting-net-controls-in-vb6.html' title='Hosting .NET controls in VB6'/><author><name>th2tran</name><uri>http://www.blogger.com/profile/18129661984008864019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://2.bp.blogspot.com/_4MC2RcVuvck/S2xT2Kprx6I/AAAAAAAAAzA/-WA6FT4yv98/S220/ThanhHai.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-2609370317860610495</id><published>2007-05-29T16:48:00.000-04:00</published><updated>2007-05-29T17:07:59.417-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Open sauced Jaspersoft?</title><content type='html'>In the past, I've dabbled a bit with &lt;a href="http://www.jaspersoft.com/"&gt;Jaspersoft&lt;/a&gt;'s reporting engine, back in the days when it was still called Panscopic. I'm just getting back to working with Scope Server now as I'm revisiting an old project, did some checking and it turned out &lt;a href="http://weblog.infoworld.com/openresource/archives/2006/04/jaspersoft_anno.html"&gt;they've open sourced&lt;/a&gt; the product since early last year. &lt;a href="http://www.jasperforge.org/"&gt;Subscribed&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-2609370317860610495?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/2609370317860610495/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=2609370317860610495' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/2609370317860610495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/2609370317860610495'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2007/05/open-sauced-jaspersoft.html' title='Open sauced Jaspersoft?'/><author><name>th2tran</name><uri>http://www.blogger.com/profile/18129661984008864019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://2.bp.blogspot.com/_4MC2RcVuvck/S2xT2Kprx6I/AAAAAAAAAzA/-WA6FT4yv98/S220/ThanhHai.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-2039401288570908199</id><published>2007-04-05T17:41:00.000-04:00</published><updated>2007-04-05T18:09:33.438-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>I Don’t Care How Your Program Works</title><content type='html'>Found this from the &lt;a href="http://blogs.msdn.com/msdnmagazine/archive/2007/03/20/1920504.aspx"&gt;MSDN Blog&lt;/a&gt;: &lt;a href="http://www.whysoftwaresucks.com/"&gt;Why Software Sucks&lt;/a&gt;. It's an interesting title for a book by Harvard professor &lt;a href="http://www.rollthunder.com/"&gt;David S. Platt&lt;/a&gt;. The following snippet from his sample chapter really scratched my "itch":&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;&lt;br /&gt;I Don’t Care How Your Program Works&lt;br /&gt;&lt;br /&gt;[A] mistake that programmers make when they design user interfaces is to force users to understand the internal workings of their programs. Instead of the programmer adjusting her user interface to the user’s thought processes, she forces the user to adjust to hers. Furthermore, she’ll usually see nothing wrong with that approach. “That’s how my program works,” she’ll say, puzzled that anyone would even ask the question of why her user interface works the way it does. &lt;br /&gt;...&lt;br /&gt;You shouldn’t have to know or care about her program’s internal workings to use it successfully, as you shouldn’t have to know or care whether your car’s engine uses fuel-injection or a carburetor in order to drive it.&lt;br /&gt;&lt;/i&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;As programmers, we tend to think like....duh...programmers, and often forget to think like users. Being able to make this leap is probably one of the distinguishing factors between a seasoned programmer and a rookie.&lt;br /&gt;&lt;br /&gt;Note to Self: stop being a rookie.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-2039401288570908199?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/2039401288570908199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=2039401288570908199' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/2039401288570908199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/2039401288570908199'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2007/04/i-dont-care-how-your-program-works.html' title='I Don’t Care How Your Program Works'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-7823675147759029610</id><published>2007-03-14T12:56:00.001-04:00</published><updated>2007-03-14T14:38:18.769-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IT'/><category scheme='http://www.blogger.com/atom/ns#' term='Remote Desktop Connection'/><title type='text'>Ctrl-Alt-Del via Remote Desktop Connection</title><content type='html'>&lt;p&gt;Ever wonder how you could issue a Ctrl-Alt-Delete command to your remote desktop connection? Try &lt;strong&gt;Ctrl-Alt-End&lt;/strong&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-7823675147759029610?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/7823675147759029610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=7823675147759029610' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/7823675147759029610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/7823675147759029610'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2007/03/ctrl-alt-del-via-remote-desktop.html' title='Ctrl-Alt-Del via Remote Desktop Connection'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-4749967898258152373</id><published>2007-02-08T15:00:00.000-05:00</published><updated>2007-02-08T15:05:25.133-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bleeding edge'/><category scheme='http://www.blogger.com/atom/ns#' term='yahoo'/><title type='text'>Yahoo! Pipes</title><content type='html'>&lt;p&gt;Got the tip from &lt;a href="http://fishdujour.typepad.com/blog/"&gt;Gav&lt;/a&gt; last night about &lt;a href="http://www.digg.com/tech_news/What_is_Yahoo_Pipes"&gt;Yahoo! Pipes&lt;/a&gt; and trying to check it out just now.&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_4MC2RcVuvck/RcuBg7prgcI/AAAAAAAAAAY/OJyKEDv9oos/s1600-h/yahoo-pipes.jpg"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_4MC2RcVuvck/RcuBg7prgcI/AAAAAAAAAAY/OJyKEDv9oos/s200/yahoo-pipes.jpg" alt="" id="BLOGGER_PHOTO_ID_5029255811657597378" border="0" /&gt;&lt;/a&gt;&lt;p&gt; &lt;/p&gt;Too funny! Is it April already?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-4749967898258152373?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/4749967898258152373/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=4749967898258152373' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/4749967898258152373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/4749967898258152373'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2007/02/yahoo-pipes.html' title='Yahoo! Pipes'/><author><name>th2tran</name><uri>http://www.blogger.com/profile/18129661984008864019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://2.bp.blogspot.com/_4MC2RcVuvck/S2xT2Kprx6I/AAAAAAAAAzA/-WA6FT4yv98/S220/ThanhHai.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4MC2RcVuvck/RcuBg7prgcI/AAAAAAAAAAY/OJyKEDv9oos/s72-c/yahoo-pipes.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-7199667197020006053</id><published>2006-12-07T01:54:00.000-05:00</published><updated>2007-11-09T14:31:28.601-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firewall'/><category scheme='http://www.blogger.com/atom/ns#' term='IT'/><category scheme='http://www.blogger.com/atom/ns#' term='ssh'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><category scheme='http://www.blogger.com/atom/ns#' term='putty'/><title type='text'>SSH proxying via Apache</title><content type='html'>Been working out of a customer site in the past few weeks and their firewall is a bit finicky. One day it would let me ssh into my office fine and the next day it would just kick me out right after the initial handshake. It doesn't actually refuse the connection at the onset. It would connect and then immediately drop the connection. Their IT guys tried to tell me it's my server, not their firewall that was the culprit. Hey, I'm an IT guy too, buddy! (amongst other things). If I can connect fine from my home network and two other guys can also connect from their home, I'm no Sherlock but something tells me it ain't my server. As improbable as it may be, because I know you think your firewall is perfect and that you haven't made any change to it that might cause this. My friend, I'd hate to tell you this but, it's your firewall! ;-)&lt;br /&gt;&lt;br /&gt;Right. Next time, you try telling your customer's IT guy that his network firewall is faulty. See if that will get you anywhere.&lt;br /&gt;&lt;br /&gt;Oh well. At least this gave me the chance to look into enabling our web server to allow SSH proxying. Found a useful article here: &lt;a href="http://dag.wieers.com/howto/ssh-http-tunneling/"&gt;Tunneling SSH over HTTP(S)&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;This is essentially what you need to add to your httpd.conf on the Appache server:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;# HTTP Proxy for SSH&lt;br /&gt;AllowCONNECT 22&lt;br /&gt;ProxyVia On&lt;br /&gt;&amp;lt;ProxyMatch (192.168.1.1)&amp;gt; # Internal IP of your SSH server&lt;br /&gt;   Order deny,allow&lt;br /&gt;   Deny from all&lt;br /&gt;   ### External (customer) sites allowed to connect&lt;br /&gt;   Allow from 199.243.1.61&lt;br /&gt;   Allow from 74.100.102.21&lt;br /&gt;&amp;lt;/ProxyMatch&amp;gt;&lt;br /&gt;&lt;/code&gt; &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Then, to connect from the remote site, configure your PuTTY Connection host name to 192.168.1.1 (the internal IP address of your SSH server), set Connection&gt;&gt;Proxy setting to use HTTP proxy, enter in the public hostname and port of your Apache server.&lt;br /&gt;That's it. Painless.&lt;br /&gt;&lt;br /&gt;A slight diversion from real work, but this will come in handy the next time I'm at a customer site that blocks out all ports except port 80. I need my network to follow me everywhere I go. I'm effectively crippled without it.&lt;br /&gt;&lt;br /&gt;Unless...I wonder, what would happen if the customer's network itself uses a proxy server to get out to the Internet...&lt;br /&gt;Oh well. Not my problem to worry about right now. Will deal with it when I run into it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-7199667197020006053?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/7199667197020006053/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=7199667197020006053' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/7199667197020006053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/7199667197020006053'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2006/12/ssh-proxying-via-apache.html' title='SSH proxying via Apache'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-7833157553577558411</id><published>2006-10-21T15:58:00.000-04:00</published><updated>2006-10-21T17:14:36.247-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kudos'/><category scheme='http://www.blogger.com/atom/ns#' term='nostalgia'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='youtube'/><title type='text'>Google and YouTube</title><content type='html'>&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/9HJHrctlK_I"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/9HJHrctlK_I" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;From &lt;a href="http://www.youtube.com/watch?v=9HJHrctlK_I"&gt;YouTube&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This &lt;a href="http://en.wikipedia.org/wiki/The_Everly_Brothers"&gt;Everly Brothers&lt;/a&gt;' &lt;a href="http://en.wikipedia.org/wiki/All_I_Have_to_Do_Is_Dream" alt="All I Have To Do Is Dream"&gt;song&lt;/a&gt; is a classic--brings back old memories of high school nights, sitting by the radio, doing my homework.&lt;br /&gt;&lt;br /&gt;It wasn't until today when, by chance, I watched the video clip of this song, that the impact of &lt;a href="http://blog.wired.com/monkeybites/2006/10/google_hearts_y.html"&gt;Google's YouTube acquisition&lt;/a&gt; finally hit me: it's so totally consistent with their operational patterns ever since Google's &lt;a href="http://www.google.com/corporate/history.html#1998"&gt;inception in 1998&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In 2001, Google &lt;a href="http://www.google.com/press/pressrel/pressrelease48.html"&gt;acquired&lt;/a&gt; the archives of web based &lt;a href="http://en.wikipedia.org/wiki/UseNet"&gt;UseNet&lt;/a&gt; search service called &lt;a href="http://en.wikipedia.org/wiki/DejaNews"&gt;DejaNews&lt;/a&gt;, and as the result, surfers can search  UseNet archives dating back to 1981.  By the way, my "official" birth date as a netizen is &lt;a href="http://groups.google.com/group/comp.os.386bsd.questions/browse_thread/thread/90ad3ecb58a6de7e/c5e7e75d38dcf3a1?lnk=st&amp;q=th2tran&amp;rnum=25#c5e7e75d38dcf3a1"&gt;Mon, Jun 21 1993 12:08 pm&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;As the world turned, in 2003, Google acquired &lt;a href="http://en.wikipedia.org/wiki/Pyra_Labs"&gt;Pyra Labs&lt;/a&gt;, the maker of Blogger.com.&lt;br /&gt;&lt;br /&gt;And then now...YouTube.&lt;br /&gt;&lt;br /&gt;Microsoft's legacy may have been to make personal computers a common household name. Yahoo's legacy may have been to bring web based email to the consumers. But it may be the case that Google's legacy will be: to preserve memories.&lt;br /&gt;&lt;br /&gt;May be I'm giving them all too much undued credits.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-7833157553577558411?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/7833157553577558411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=7833157553577558411' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/7833157553577558411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/7833157553577558411'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2006/10/google-and-youtube.html' title='Google and YouTube'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-115871154259540861</id><published>2006-09-19T20:19:00.000-04:00</published><updated>2006-09-19T20:40:54.693-04:00</updated><title type='text'>Posting from Windows Live Writer</title><content type='html'>&lt;p&gt;&lt;a href="http://static.flickr.com/76/247870762_2cfbd3baf3_o.jpg" atomicselection="true"&gt;&lt;img height="173" src="http://static.flickr.com/76/247870762_2cfbd3baf3_o.jpg" width="240" align="left"&gt;&lt;/a&gt; Trying out the new &lt;a href="http://windowslivewriter.spaces.live.com/blog/cns%21D85741BB5E0BE8AA%21174.entry"&gt;Windows Live Writer Beta&lt;/a&gt;, posting to my blogspot blog.&amp;nbsp; Fingers crossed&amp;nbsp;and hoping that&amp;nbsp;it doesn't mess up my template (I have made a backup, just in case).&lt;/p&gt; &lt;p&gt;I'm liking it.&amp;nbsp; The user interface&amp;nbsp;for this thing looks pretty simple (I like it simple). Apparently it also supports &lt;a href="http://www.wordpress.com"&gt;WordPress&lt;/a&gt;,&amp;nbsp;&lt;a href="http://www.typepad.com/"&gt;TypePad&lt;/a&gt;, and a few others. I'll&amp;nbsp;try it out on WordPress next.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-115871154259540861?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/115871154259540861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=115871154259540861' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/115871154259540861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/115871154259540861'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2006/09/posting-from-windows-live-writer.html' title='Posting from Windows Live Writer'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-115706658801950813</id><published>2006-08-31T19:09:00.000-04:00</published><updated>2007-11-05T18:53:36.562-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vb6'/><title type='text'>VB Interview Question</title><content type='html'>This is one of the easy-level questions that I give my interview candidates on the written test part of the interview:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Assume that &lt;i&gt;a&lt;/i&gt; and &lt;i&gt;b&lt;/i&gt; are Integer variables.&lt;br /&gt;&lt;code&gt;&lt;br /&gt; i. &lt;font color="#a020f0"&gt;If&lt;/font&gt; a &lt;font color="#a020f0"&gt;And&lt;/font&gt; b &lt;font color="#a020f0"&gt;Then Call&lt;/font&gt; DoSomething()&lt;br /&gt;ii. &lt;font color="#a020f0"&gt;If&lt;/font&gt; (a &lt;font color="#a020f0"&gt;And&lt;/font&gt; b) = b &lt;font color="#a020f0"&gt;Then Call&lt;/font&gt; DoSomething()&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Statements (i) and (ii) are equivalent. True or False?&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I thought this was a no-brainer, but apparently not. This is often the source of many bugs in VB code.&lt;br /&gt;&lt;br /&gt;So how many of you think the answer is True? ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-115706658801950813?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/115706658801950813/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=115706658801950813' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/115706658801950813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/115706658801950813'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2006/08/vb-interview-question.html' title='VB Interview Question'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-115674211177112615</id><published>2006-08-28T00:55:00.000-04:00</published><updated>2006-08-28T01:15:11.783-04:00</updated><title type='text'>New Look</title><content type='html'>I recently tried the &lt;a href="http://wordpress.com"&gt;WordPress.com&lt;/a&gt; service. &lt;a href="http://wordpress.org/"&gt;WordPress&lt;/a&gt;, the software, is nice, but the hosted service itself is limiting in that you can't customize the layout template--well you can, but i'll cost you 15 credits to upgrade. Blogger.com, on the other hand gives you full freedom to customize the layout as you'd like--hence the new look of this blog. I was thinking of switching to WordPress, because of the lame layouts that Blogger provides, but having discovered &lt;a href="http://www.geckoandfly.com/2006/04/27/kubrick/"&gt;this&lt;/a&gt;, I think I'll stick with Blogger for a while longer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-115674211177112615?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/115674211177112615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=115674211177112615' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/115674211177112615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/115674211177112615'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2006/08/new-look.html' title='New Look'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-115462624548413704</id><published>2006-08-03T13:14:00.000-04:00</published><updated>2006-08-04T10:00:58.796-04:00</updated><title type='text'>Legend of the Pink Tie</title><content type='html'>&lt;a href="http://www.uwaterloo.ca"&gt;UW&lt;/a&gt; Math Faculty's web site has an interesting article about the &lt;a href="http://www.math.uwaterloo.ca/navigation/About/pinktie.shtml"&gt;Pink Tie&lt;/a&gt;--an icon for UW mathies.&lt;br /&gt;&lt;br /&gt;Back in those &lt;a href="http://en.wikipedia.org/wiki/Frosh"&gt;frosh&lt;/a&gt; days, my pink tie got tie-napped during orientation week by those damned artsies. Lousy TLO!  Sign me up for the TG. I want my pink tie back, damn it!&lt;br /&gt;:-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-115462624548413704?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/115462624548413704/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=115462624548413704' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/115462624548413704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/115462624548413704'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2006/08/legend-of-pink-tie.html' title='Legend of the Pink Tie'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-115260274030526221</id><published>2006-07-11T03:01:00.000-04:00</published><updated>2006-07-11T03:35:48.973-04:00</updated><title type='text'>ActiveLock lives on!</title><content type='html'>It's been over a year since the time I left the &lt;a href="http://www.activelocksoftware.com/"&gt;Activelock&lt;/a&gt; project, due to lack of time, after having coded the baseline for 2.0.  I just &lt;a href="http://forum.activelocksoftware.com/viewtopic.php?t=342"&gt;checked in&lt;/a&gt; to have a quick peek a few days ago, and it looks like it's made great strides since. Kudos to Ismail for doing a great job keeping the project alive.&lt;br /&gt;&lt;br /&gt;Back then I had to deal with low-level RSA and MD5 bit mangling in pure C/C++.  Granted that much of the encryption code was "borrowed" heavily from the &lt;a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/"&gt;PuTTY&lt;/a&gt; project, but, boy, was debugging it ever a nightmare.&lt;br /&gt;&lt;br /&gt;If I were to do it all over again now, I'd rewrite the core in .NET--It's sooo much easier now with all the encryption facilities built into the core .NET framework. &lt;br /&gt;&lt;br /&gt;I've noticed that every time I do any code weaving in .NET, it seems to take 10 times faster to get things done than doing it the old ways. Suddenly, you're presented with many new possibilities.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-115260274030526221?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/115260274030526221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=115260274030526221' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/115260274030526221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/115260274030526221'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2006/07/activelock-lives-on.html' title='ActiveLock lives on!'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-115038456049123664</id><published>2006-06-15T20:21:00.000-04:00</published><updated>2006-06-15T21:07:39.830-04:00</updated><title type='text'>How far is that extra mile anyway?</title><content type='html'>We have all heard of the phrase "going the extra mile" when people talk about providing exceptional service to their customers. And I'm definitely a proponent of this mentality.&lt;br /&gt;&lt;br /&gt;However, I've also once heard of the phrase "your lack of planning does not constitute my emergency", murmured by a former colleague when referring to a particularly demanding customer, and also think that it makes perfect sense.&lt;br /&gt;&lt;br /&gt;At the office, I sometimes get calls from our partners/resellers with requests of the kind "um...I've got this demo in 2 hours, and I need your help to build this integration against this application that I want to show for my demo." &lt;br /&gt;&lt;br /&gt;First thought that always came to my mind was that wonderful phrase uttered by the colleague. I mean, c'mon! My day is usually fully planned out and these kind of things really throw a monkey wrench into things.&lt;br /&gt;&lt;br /&gt;My following thought would be, well, they &lt;b&gt;are&lt;/b&gt; trying to sell our product for us, and   consider the alternative: I tell the partner to blow off and tell the customer to reschedule and give us more time. On such close notice, this would make the partner look very bad in front of the customer, not to mention the partner might have made a long trip onsite for this demo--all of which aren't the end of the world, but a lost opportunity nonetheless.&lt;br /&gt;&lt;br /&gt;With that thought, I put my regular schedule aside, got online with the partner and in 2 hours, whipped up a prototype demo into shape, in time for them to show the customer. Everyone was happy...well, except may be me! &amp;lt;whine&amp;gt;You've taken 2 hours of my life on something you could have done yourself, and I want it back!&amp;lt;/whine&amp;gt;.&lt;br /&gt;&lt;br /&gt;So, although I think that my colleague's "lack of planning" speech is absolutely spot-on--just like the theory of &lt;a href="http://www.google.ca/search?q=define%3Acommunism"&gt;communism&lt;/a&gt; is absolutely spot-on--unfortunately, just like communism, it's not very practical ;-)...which brings me to the subject of this blog post: how far is that extra mile? I'll get back to you when I have the answer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-115038456049123664?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/115038456049123664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=115038456049123664' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/115038456049123664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/115038456049123664'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2006/06/how-far-is-that-extra-mile-anyway.html' title='How far is that extra mile anyway?'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-115038453801678906</id><published>2006-06-15T11:15:00.000-04:00</published><updated>2006-06-15T19:13:53.630-04:00</updated><title type='text'>Dead Dog's back</title><content type='html'>I used to love listening to the &lt;a href="http://en.wikipedia.org/wiki/The_Dead_Dog_Cafe_Comedy_Hour"&gt;The Dead Dog Café&lt;/a&gt; on &lt;a href="http://www.cbc.ca/radioone/"&gt;CBC RadioOne&lt;/a&gt; every Sunday morning. It had some really witty silliness sketches, done from an aboriginal perspective. I'm not aboriginal (heck, I don't even know if I'm original) but I really enjoyed this show, which was why I really missed it when it suddenly disappeared off the airwaves in 2000.&lt;br /&gt;&lt;br /&gt;I tuned into CBC's &lt;a href="http://www.cbc.ca/soundslikecanada/"&gt;Sounds Like Canada&lt;/a&gt; program on the way to work this morning, and noticed that it's back--I guess after 6 years, somebody at the CBC finally decided to respond to popular demands. &lt;br /&gt;&lt;br /&gt;Noice!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-115038453801678906?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/115038453801678906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=115038453801678906' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/115038453801678906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/115038453801678906'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2006/06/dead-dogs-back.html' title='Dead Dog&apos;s back'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-114845138710992487</id><published>2006-06-08T23:48:00.000-04:00</published><updated>2006-06-09T20:46:33.286-04:00</updated><title type='text'>Ingenuity: striving to stay ahead of the curve</title><content type='html'>As we've been struggling a bit in the past several weeks, dealing with the slight inadequacies of some of the less user-friendly third-party SDKs that we've had to work with, I'm reminded of the tale that might help boost some creative mojo's for us all. It's a tale about how we created one of our very first plugins for &lt;a href="http://www.karora.com/appconnector/appconnoview.htm"&gt;AppConnector&lt;/a&gt; four, five years ago, an exercise that attested to the ingenuity of our research team, of  which yours truly had the great honour of being an insignificant contributing member. &lt;br /&gt;&lt;br /&gt;We needed to build a plugin to integrate with this other application, but it had no documented API into its user interface (AppConnector is all about integration at the UI level), and the vendor had neither the interest nor the intention of helping us find out. Hmm...Sounds familiar?  Anyway, our research team had to study it the hard way, devising various experiments to feed it various inputs and observed its responses to come up with some consistent patterns, and let me tell you, ladies and gentlemen, for a bunch of lowly developers and business analysts, our process was so scientific that we could have claimed a &lt;a href="http://www.cra-arc.gc.ca/taxcredit/sred/menu-e.html"&gt;SRED&lt;/a&gt; grant for it if we wanted to. It was. ;-)&lt;br /&gt;&lt;br /&gt;We did run into some snags, through no faults of our own, however, but rather it was a limitation in their product. I'll never forget the conversation with their support guys when we called. On the phone, we told them that we were trying to do this and this, driving the user interface using that and that, and we expected it to behave this way but it behaved that way, blah, blah, blah, and yadiyadiyada, is this a bug, and can you help? At the end, they said they would talk to their developers and get back to us.  What happened right after that was totally hilarious, my product manager and I couldn't stop snickering as we listened.  They started talking to each other as if we we had already gotten off the line. (sneaky us!). I'm paraphrasing from this point on as it is quite a few years back, but the jist of volleys were like this:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;b&gt;Guy A&lt;/b&gt;: &lt;i&gt;Did you get all that? Did you understand what they're trying to do?&lt;/i&gt;&lt;br /&gt;&lt;b&gt;Guy B&lt;/b&gt;: &lt;i&gt;Yeah, man, it's totally crazy s**t. Did you know that? What they're doing. Did you know that that can be done?&lt;/i&gt;&lt;br /&gt;&lt;b&gt;Guy A&lt;/b&gt;: &lt;i&gt;No, man, that's pretty wild.&lt;/i&gt;&lt;br /&gt;&lt;b&gt;Guy B&lt;/b&gt;: ....&lt;br /&gt;(dialogue continues for at least another minute...eventually)&lt;br /&gt;&lt;b&gt;Guy A&lt;/b&gt;: &lt;i&gt;Anyway, let me talk to X and see if we can fix this for them. I'll let you know.&lt;/i&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;So...We figured out how to use the software in a way that the original creator hadn't conceived. We took it to a new level they didn't think possible. If that's not ingenuity, then I don't know what is.&lt;br /&gt;&lt;br /&gt;The moral of the story here is this: we need to remind ourselves, from time to time, that we ARE the experts! People look to us for solutions to the problems, not the other way around--because we do things that they think impossible to achieve, and not because we're a small bunch of super geniuses, but because we invest, painstakingly, our blood and sweat, not to mention countless hours, in  figuring out things that are too time consuming for them to do had they attempted to do it themselves. And although it is sometimes unavoidable to need some guidance from our customers/partners, most of the time we are the ones to show them how it's done.  As little &lt;a href="http://en.wikipedia.org/wiki/Karora"&gt;karoras&lt;/a&gt; in our own rights, we all have the creative spirits within us to do that, to make a difference, and to be a part of something of revolutionary potentials.&lt;br /&gt;&lt;br /&gt;Recent breakthroughs made by one of the team members this week further convinced me that the feeling is mutual throughout our closed knit group. Kudos, MDM! Go get 'em, maestro!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-114845138710992487?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/114845138710992487/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=114845138710992487' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/114845138710992487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/114845138710992487'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2006/06/ingenuity-striving-to-stay-ahead-of.html' title='Ingenuity: striving to stay ahead of the curve'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-114850976678081868</id><published>2006-05-24T18:06:00.000-04:00</published><updated>2006-05-24T18:30:30.913-04:00</updated><title type='text'>Microsoft shocks world with  Longhorn betas</title><content type='html'>Hmm...I wonder why the world would be so "shocked", seeing how Vista Beta 2 was at least &lt;a href="http://www.windowsitpro.com/Article/ArticleID/47545/47545.html?Ad=1"&gt;6 months overdue&lt;/a&gt;. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-114850976678081868?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.itwire.com.au/content/view/4408/53/' title='Microsoft shocks world with  Longhorn betas'/><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/114850976678081868/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=114850976678081868' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/114850976678081868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/114850976678081868'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2006/05/microsoft-shocks-world-with-longhorn.html' title='Microsoft shocks world with  Longhorn betas'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-114774035352657940</id><published>2006-05-15T20:39:00.000-04:00</published><updated>2006-05-15T20:45:53.540-04:00</updated><title type='text'>Skype Offers Free Calls to Regular Phones</title><content type='html'>Yep! It's true. (I just tried it!) &lt;br /&gt;You can now skype out to regular North American phone numbers for free.  Well, at least &lt;a href="http://www.skype.com/help/guides/skypeout.html"&gt;until the end of 2006&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-114774035352657940?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://news.yahoo.com/s/ap/20060515/ap_on_hi_te/skype_free_calls' title='Skype Offers Free Calls to Regular Phones'/><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/114774035352657940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=114774035352657940' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/114774035352657940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/114774035352657940'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2006/05/skype-offers-free-calls-to-regular.html' title='Skype Offers Free Calls to Regular Phones'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-114646591760541847</id><published>2006-05-01T02:38:00.000-04:00</published><updated>2007-11-09T14:35:39.697-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vb6'/><category scheme='http://www.blogger.com/atom/ns#' term='.net framework'/><title type='text'>Using the .NET Framework Class Library from Visual Basic 6</title><content type='html'>I stumbled onto &lt;a href="http://msdn.microsoft.com/vbrun/default.aspx?pull=/library/en-us/dv_vstechart/html/VBUFCL.asp"&gt;this link&lt;/a&gt; while reading another blog. Using .NET framework classes from VB6? Now that's just plain crazy talk! &lt;br /&gt;Or is it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-114646591760541847?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://msdn.microsoft.com/vbrun/default.aspx?pull=/library/en-us/dv_vstechart/html/VBUFCL.asp' title='Using the .NET Framework Class Library from Visual Basic 6'/><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/114646591760541847/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=114646591760541847' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/114646591760541847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/114646591760541847'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2006/05/using-net-framework-class-library-from.html' title='Using the .NET Framework Class Library from Visual Basic 6'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-114477433364500701</id><published>2006-04-22T04:07:00.000-04:00</published><updated>2006-04-24T10:37:14.406-04:00</updated><title type='text'>Freetext Search ≠ Meta Data Search ?</title><content type='html'>&lt;a href="http://fishdujour.typepad.com/"&gt;Gav&lt;/a&gt; reminded me the other day, when we were discussing the problem of searching, that &lt;a href="http://en.wikipedia.org/wiki/Freetext"&gt;freetext search&lt;/a&gt; does not equal metadata search (also known as field restricted search). Gav was right, of course, as it takes no stretch of the imagination to see that doing a (freetext) search, for documents whose content contains the words "John Doe", is not exactly the same as searching for documents whose Author is "John Doe" (metadata search). The problem with the former is that you may get results back with documents having "John Doe" the Author, as well as "John Doe" the Reviewer.&lt;br /&gt;&lt;br /&gt;I claim, however, that metadata search and freetext search are computationally equivalent problems. That is, you can use a freetext search solution to solve the metadata search problem, and conversely, you can use a metadata search solution to solve the freetext search problem. In this post, though, I shall endeavour to prove the first part only, since that is the crux of the original point of discussion.&lt;br /&gt; &lt;br /&gt;First, let's do a little bit of review in computational theory. We say that a problem A is &lt;a href="http://en.wikipedia.org/wiki/Reduction_%28complexity%29"&gt;reducible&lt;/a&gt; to problem B if we can apply a series of transformations that turn problem A into problem B, which, we hope, is less complex and more solveable than problem A. In effect, we're saying that if we could find a solution to problem B, then we would know a solution to problem A as well.  It is a common approach that academic researchers like to use when dealing with computational complexity involving &lt;a href="http://en.wikipedia.org/wiki/NP-complete"&gt;NP-complete&lt;/a&gt; problems, i.e. problems for which no solution has been found that can be computed in polynomial time. Researchers try to prove that a problem is NP-complete by trying to reduce it to another known NP-complete problem.&lt;br /&gt;&lt;br /&gt;Well, I claim that the metadata search problem is reducible to freetext search. Or, in more layman's terms, you can satisfactorily simulate metadata searching using freetext searching capability. And below are the transformations that take the problem from the metadata search domain into the freetext search domain.&lt;br /&gt;&lt;br /&gt;Let's say you want to index a PDF document with the metadata field: &lt;code&gt;Invoice_Number = ABC100&lt;/code&gt;.&lt;br /&gt;For this document, you provide a secondary file which will serve as the "index file" whose content contains some sort of encoding of the above name-value pair, in addition to the link to the real document. Something like:&lt;br /&gt;&lt;font size="-1"&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;DocumentSummary&amp;gt;&lt;br /&gt;  &amp;lt;Invoice_Number&amp;gt;ABC100&amp;lt;/Invoice_Number&amp;gt;&lt;br /&gt;  &amp;lt;A HREF="file:///C:/Accounting_Data/DOC00000018567.PDF"&amp;gt;View Document&amp;lt;/A&amp;gt;&lt;br /&gt;  &amp;lt;HASHCODE&amp;gt;51E88D049A06D7018D38740772FCAA0A&amp;lt;HASHCODE&amp;lt;/CODE&amp;gt;&lt;br /&gt;&amp;lt;/DocumentSummary&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;where &lt;code&gt;51E88D049A06D7018D38740772FCAA0A&lt;/code&gt; is the computed MD5 hash of the text &lt;code&gt;&amp;lt;Invoice_Number&amp;gt;ABC100&amp;lt;/Invoice_Number&amp;gt;&lt;/code&gt;.  &lt;br /&gt;&lt;br /&gt;You will then feed those two files to the freetext indexing engine.&lt;br /&gt;&lt;br /&gt;Now then, since the MD5 hash is fairly unique, if I were to do a freetext search for the keyword &lt;code&gt;51E88D049A06D7018D38740772FCAA0A&lt;/code&gt;, it would be highly unlikely that I would get a mixed set of index file and real files in the search result, but rather I would only get a list of index files containing Invoice ABC100, which contained the link to the actual invoice PDF file itself.&lt;br /&gt;&lt;br /&gt;Hence, we've proven that we can use a freetext search capability to do metadata search.&lt;br /&gt;QED.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-114477433364500701?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/114477433364500701/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=114477433364500701' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/114477433364500701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/114477433364500701'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2006/04/freetext-search-meta-data-search.html' title='Freetext Search ≠ Meta Data Search ?'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-114420114921153520</id><published>2006-04-04T21:20:00.000-04:00</published><updated>2006-04-04T21:43:13.310-04:00</updated><title type='text'>GMail ATOM feeds</title><content type='html'>Hmm...It seems that Google has been providing &lt;a href="https://username:password@mail.google.com/mail/feed/atom/"&gt;ATOM feeds&lt;/a&gt; into your GMail inbox &lt;a href="http://www.webstractions.com/news/2004/10/adding-gmail-inbox-to-your-news-reader.html"&gt;for a while now&lt;/a&gt;. The question is, then, whether I should trust either of &lt;a href="http://www.bloglines.com"&gt;Bloglines&lt;/a&gt; or &lt;a href="http://www.newsgator.com"&gt;NewsGator&lt;/a&gt; enough to give them my GMail ID and password, so that they can fetch the mails for me. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-114420114921153520?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/114420114921153520/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=114420114921153520' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/114420114921153520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/114420114921153520'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2006/04/gmail-atom-feeds.html' title='GMail ATOM feeds'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-114322707751623624</id><published>2006-03-25T01:04:00.000-05:00</published><updated>2007-11-09T14:36:43.186-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AppConnector'/><title type='text'>AppConnector on Linux?</title><content type='html'>I've been tinkering a bit with the &lt;a href="http://www.gentoo.org/"&gt;Gentoo Linux&lt;/a&gt; distro, been scouring their documentation site, and I bumped into something interesting. This might make you feel a tiny bit dirty, but apparently you can &lt;a href="http://gentoo-wiki.com/HOWTO_Install_Internet_Explorer_6_SP1"&gt;run IE6 on Linux&lt;/a&gt;. So what does this mean? Cross-platform Windows binaries! &lt;a href="http://www.winehq.com/"&gt;Wine&lt;/a&gt; rocks! Years ago when playing with the earlier &lt;a href="http://en.wikipedia.org/wiki/Slackware"&gt;Slackware&lt;/a&gt; distribution, I got some msdos programs to run in Linux under Wine. But this is way more kewl!&lt;br /&gt;&lt;br /&gt;More importantly, it implies that we might be able to get &lt;a href="http://www.karora.com/appconnector/appconnoview.htm"&gt;AppConnector&lt;/a&gt; running on Linux, too--without a single line of code change!  AppConnector uses the MSXML Parser and the MS Scripting Engine which are bundled within &lt;a href="http://www.microsoft.com/windows/ie/"&gt;IE&lt;/a&gt;. So if IE can run on Linux, there's a good chance AC might run on it as well. Imagine the possibilities...being able to mashup KDE and GNOME apps.  I've got to try it sometime.&lt;br /&gt;&lt;br /&gt;Hmm...I wonder if there's any good MacOS port for Wine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-114322707751623624?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/114322707751623624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=114322707751623624' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/114322707751623624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/114322707751623624'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2006/03/appconnector-on-linux.html' title='AppConnector on Linux?'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-114175505449341661</id><published>2006-03-10T20:57:00.000-05:00</published><updated>2007-11-09T12:54:58.324-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vb6'/><title type='text'>HOW NOT TO compute the inverse of a colour</title><content type='html'>I once wrote a simple &lt;a href="http://en.wikipedia.org/wiki/Visual_Basic"&gt;VB&lt;/a&gt; utility that acted like a window &lt;a href="http://en.wikipedia.org/wiki/Decorator_pattern"&gt;decorator&lt;/a&gt;, allowing the user to redact any window on the desktop by highlighting on a rectangular region within it.   The highlighting code tracked the user mouse movements and drew the selected region as a hollow rectangle with black border.&lt;br /&gt;&lt;br /&gt;My highlighting code had a problem: what if the window you're highlighting had a black background? That would render the highlighting rectangle virtually invisible, wouldn't it?&lt;br /&gt;&lt;br /&gt;The code really should have used, for its border colour, the inverse colour of whatever the window's background colour is.  OK...How the heck do we compute the inverse colour in VB? &lt;br /&gt;&lt;br /&gt;Well, some quick googling yielded &lt;a href="http://www.soapplab.auckland.ac.nz/info/formats/rgbcube.htm"&gt;this link&lt;/a&gt;, which seemed to be somewhat useful:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Take any point in the [RGB] cube, then draw a line from this point to the centroid. If you then extend this line through the centroid the same length as between the original point and the centroid, you will have found the inverse colour to that defined by the original point. Inverting an RGB image involves a kind of turning inside out of the colour values.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;uhh, yeah...&lt;br /&gt;&lt;br /&gt;So, anyway, I did some more googling, and it turned out that there was a simpler way to do this in VB, thanks to &lt;a href="http://www.vb-helper.com/howto_draw_bar_gauge.html"&gt;this link&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The trick is in using a &lt;font color="#b22222"&gt;PictureBox&lt;/font&gt; and the &lt;font color="#b22222"&gt;vbInvert&lt;/font&gt; constant. The PictureBox will serve as the drawing canvas, onto which a snapshot of the actual window is placed for selection.  The following simplified pseudocode illustrates the rest:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;' Initializes PictureBox drawing settings&lt;br /&gt;&lt;font color="#a020f0"&gt;Private Sub&lt;/font&gt; Form_Load()&lt;br /&gt;   &lt;font color="#bc8f8f"&gt;' Set drawmode to draw using the invert of the background colour&lt;/font&gt;&lt;br /&gt;   Picture1.DrawMode = &lt;font color="#b22222"&gt;vbInvert&lt;/font&gt;&lt;br /&gt;   &lt;font color="#bc8f8f"&gt;' Set pen width&lt;/font&gt;&lt;br /&gt;   Picture1.DrawWidth = 2&lt;br /&gt;   ... &lt;br /&gt;&lt;font color="#a020f0"&gt;End Sub&lt;/font&gt;&lt;br /&gt;...&lt;br /&gt;...&lt;br /&gt;&lt;font color="#a020f0"&gt;Private Sub&lt;/font&gt; Picture1_MouseDown(Button &lt;font color="#a020f0"&gt;As Integer&lt;/font&gt;, _ &lt;br /&gt;                               Shift &lt;font color="#a020f0"&gt;As Integer&lt;/font&gt;, _&lt;br /&gt;                               X &lt;font color="#a020f0"&gt;As Single&lt;/font&gt;, _&lt;br /&gt;                               Y &lt;font color="#a020f0"&gt;As Single&lt;/font&gt;)&lt;br /&gt;   &lt;font color="#a020f0"&gt;If&lt;/font&gt; Button &amp;lt;&amp;gt; LEFT &lt;font color="#a020f0"&gt;Then Exit Sub&lt;/font&gt;&lt;br /&gt;   LeftDowned = &lt;font color="#a020f0"&gt;True&lt;/font&gt;&lt;br /&gt;   &lt;font color="#bc8f8f"&gt;' Store [X,Y] as [Left,Top]&lt;/font&gt;&lt;br /&gt;   ...&lt;br /&gt;   ...&lt;br /&gt;&lt;font color="#a020f0"&gt;End Sub&lt;/font&gt;&lt;br /&gt;...&lt;br /&gt;...&lt;br /&gt;&lt;font color="#a020f0"&gt;Private Sub&lt;/font&gt; Picture1_MouseMove(Button &lt;font color="#a020f0"&gt;As Integer&lt;/font&gt;, _&lt;br /&gt;                               Shift &lt;font color="#a020f0"&gt;As Integer&lt;/font&gt;, _&lt;br /&gt;                               X &lt;font color="#a020f0"&gt;As Single&lt;/font&gt;, _&lt;br /&gt;                               Y &lt;font color="#a020f0"&gt;As Single&lt;/font&gt;)&lt;br /&gt;   &lt;font color="#a020f0"&gt;If Not&lt;/font&gt; LeftDowned &lt;font color="#a020f0"&gt;Then Exit Sub&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;   &lt;font color="#bc8f8f"&gt;' Clear previous drawn rectangle&lt;/font&gt;&lt;br /&gt;   ...   &lt;br /&gt;   &lt;font color="#bc8f8f"&gt;' Get current drag region [Top, Left,Bottom,Right]&lt;/font&gt;&lt;br /&gt;   ...&lt;br /&gt;   &lt;font color="#bc8f8f"&gt;' Draw new rectangle&lt;/font&gt;&lt;br /&gt;   Picture1.Line (Left, Top)-(Right, Bottom), vbBlack, B&lt;br /&gt;&lt;font color="#a020f0"&gt;End Sub&lt;/font&gt;&lt;br /&gt;...&lt;br /&gt;...&lt;br /&gt;&lt;font color="#a020f0"&gt;Private Sub&lt;/font&gt; Picture1_MouseUp(Button &lt;font color="#a020f0"&gt;As Integer&lt;/font&gt;, _ &lt;br /&gt;                             Shift &lt;font color="#a020f0"&gt;As Integer&lt;/font&gt;, _&lt;br /&gt;                             X &lt;font color="#a020f0"&gt;As Single&lt;/font&gt;, _&lt;br /&gt;                             Y &lt;font color="#a020f0"&gt;As Single&lt;/font&gt;)&lt;br /&gt;   &lt;font color="#bc8f8f"&gt;' Re-set [Left,Top,Right,Bottom] = [0,0,0,0]&lt;/font&gt;&lt;br /&gt;   ...&lt;br /&gt;   LeftDowned = &lt;font color="#a020f0"&gt;False&lt;/font&gt;&lt;br /&gt;   ...&lt;br /&gt;&lt;font color="#a020f0"&gt;End Sub&lt;/font&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The moral of the story is this: There is a simple solution out there somewhere, waiting to be discovered. So keep googling, ya lazy bastard!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-114175505449341661?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/114175505449341661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=114175505449341661' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/114175505449341661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/114175505449341661'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2006/03/how-not-to-compute-inverse-of-colour.html' title='HOW NOT TO compute the inverse of a colour'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-114198264169339499</id><published>2006-03-10T03:54:00.000-05:00</published><updated>2006-03-10T04:33:07.830-05:00</updated><title type='text'>Google deleting GMail accounts?</title><content type='html'>Just caught wind of this news on the blogosphere: some people's GMail account got deleted.   Read the full story &lt;a href="http://blog.outer-court.com/forum/22209.html"&gt;here&lt;/a&gt; and &lt;a href="http://www.p2pnet.net/story/8124"&gt;here&lt;/a&gt;.  &lt;br /&gt;&lt;br /&gt;Sounds quite disturbing. This incident might send some users flocking back to the other free mail services. And to think that at one point, I had an idea to build a personal imaging app on top of GMail. It sounded like a good idea at the time.&lt;br /&gt;&lt;br /&gt;I never was a big fan of GMail. The lack of foldering capability was the breaker for me. And tagging just ain't the same thing as foldering.&lt;br /&gt;&lt;br /&gt;I highly doubt it, though,  that Google would actually and purposely delete people's accounts without prior warning. More likely, it's a bug in their system--and a fairly big one, if that indeed turns out to be the case.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-114198264169339499?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/114198264169339499/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=114198264169339499' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/114198264169339499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/114198264169339499'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2006/03/google-deleting-gmail-accounts.html' title='Google deleting GMail accounts?'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-114101949689710856</id><published>2006-02-27T00:28:00.001-05:00</published><updated>2009-02-08T13:21:00.310-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emachines'/><title type='text'>Weird problem with eMachines DVD-RW drive solved</title><content type='html'>I've been stumped by this problem with my eMachines M6809 laptop for a couple of years, ever since I first bought the beast. The problem was with the Slimtype SDW-431s DVD-RW drive when run under Windows XP. It would read the contents of the CD/DVD OK, but when I tried to launch a program from it, I'd get an error similar to this: &lt;br /&gt;&lt;img src="http://static.flickr.com/40/105120035_fef86eb8b7.jpg?v=0" width="450" /&gt;&lt;br /&gt;The procedure entry point blahblahblah could not be located in the dynamic link library blah blah blah.&lt;br /&gt;&lt;br /&gt;Notice the weird casing in the procedure name MsgWaitForMult&lt;i&gt;I&lt;/i&gt;pleObjects. It should have been MsgWaitForMult&lt;i&gt;i&lt;/i&gt;pleObjects.&lt;br /&gt;&lt;br /&gt;For a long time, I couldn't figure out what the heck that error was about, and had dismissed it as a defective DVD drive and left it at that...At least until this weekend.&lt;br /&gt;&lt;br /&gt;Last Friday, at approximately 9:30AM Eastern Standard Time, the hard drive on my lovely eMachine decided to pull a head-crash stunt, sending 5 years worth of my life into /dev/null (a long and painful story for another day), and once again I was motivated to get this damned DVD drive working so that I can do backups with.  &lt;br /&gt;&lt;br /&gt;This time, I stumbled onto this &lt;a href="http://club.cdfreaks.com/showthread.php?t=122237"&gt;discussion thread&lt;/a&gt; on cdfreaks.com, and figured out what the cause was: it had to do with the Secondary IDE Channel setting used by the DVD device driver on XP. This setting is accessible through the Control Panel Device Manager. By default, the Transfer Mode for Device 0 on this channel property was set to "use &lt;a href="http://en.wikipedia.org/wiki/Direct_memory_access"&gt;DMA&lt;/a&gt; if available".  I changed it to "use &lt;a href="http://en.wikipedia.org/wiki/Programmed_input/output"&gt;PIO&lt;/a&gt; only", and voilà! Everything started working like a charm. Now it can read and run programs off the DVD with no problem.&lt;br /&gt;&lt;img src="http://static.flickr.com/41/105064205_872661347e.jpg?v=0" width="450"/&gt;&lt;br /&gt;&lt;br /&gt;Prior to finding the solution, I had tried googling like nobody's business, hoping to find some other people who might have experienced similar symptoms, to no avail.  So now I thought I'd post my findings here, in hope that it could help some other poor souls out there who might have the misfortune of owning an eMachines laptop and have managed to bump into the same problem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-114101949689710856?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/114101949689710856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=114101949689710856' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/114101949689710856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/114101949689710856'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2006/02/weird-problem-with-emachines-dvd-rw.html' title='Weird problem with eMachines DVD-RW drive solved'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-114041423436111606</id><published>2006-02-23T00:34:00.000-05:00</published><updated>2007-11-09T14:37:55.319-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AppConnector'/><title type='text'>Mashing up the desktop?</title><content type='html'>Hey, have you tried out the new 3.0 release of &lt;a href="http://desktop.google.com"&gt;Google Desktop&lt;/a&gt;?  I've only begun trying it out for a few days now, but I must say that I really like it. Google Desktop can index everything from individual files, to emails stored within Microsoft Outlook or Mozilla Thunderbird. &lt;br /&gt;&lt;br /&gt;This is great!  Suddenly, my local hard drives have become one huge database that is easily and quickly searchable using one common interface, and the desktop becoming one integrated application. &lt;br /&gt;&lt;br /&gt;From a technical level, I'm intrigued that the Google Desktop Bar is able to:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;   &lt;li&gt;monitor new emails from my Microsoft Outlook accounts,&lt;br /&gt;   &lt;li&gt;monitor new emails from my Mozilla Thunderbird accounts,&lt;br /&gt;   &lt;li&gt;detect that the web page I'm viewing is a blog page, and monitor that blog for new entries (via its Web Clips feature), &lt;br /&gt;   &lt;li&gt;notify me of new items from all of those sources using one common notification popup interface.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;And then, when I click on the notification popup, it brings up the item in the native application: if it's an Outlook email, GD opens it up in Outlook; new Thunderbird emails get opened using Thunderbird; and new blog entries are brought up in the default browser.&lt;br /&gt;&lt;br /&gt;It seems to me that this is an example of what &lt;a href="http://fishdujour.typepad.com"&gt;Gavin&lt;/a&gt; called &lt;a  href="http://fishdujour.typepad.com/blog/2006/02/mashups_conside.html"&gt;"mashing up the desktop"&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It also seems to me that &lt;a href="http://www.karora.com/appconnector/appconnoview.htm"&gt;AppConnector&lt;/a&gt; is well on its way to be considered as a desktop mash-up tool, for the following reasons:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;It treats the desktop as one single integrated application.&lt;br /&gt;&lt;li&gt;It is able to re-use and leverage existing applications' GUI as-is, without the need embellish them into its own GUI, thereby avoiding legal implications involving  copyleft, copyright, and what-have-you.&lt;br /&gt;&lt;li&gt;It mashes up two otherwise disparate functions (e.g. entering A/P invoices and maintaining  electronic copies of PO's), normally provided by two different desktop applications,  into one integrated (and more complete) solution.&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Desktop_metaphor"&gt;Desktop&lt;/a&gt;, the final frontier.  These are the voyages of the toolship "AppConnector". Its continuing mission: to explore new desktop environments, to seek out new ways to mash up new desktop applications, to boldly go where no mash-up tool has gone before.&lt;br /&gt;(&lt;a href="http://en.wikipedia.org/wiki/Star_Trek:_The_Original_Series"&gt;Star Trek&lt;/a&gt; theme music begins...)&lt;br /&gt;&lt;br /&gt;And let the mash-up begin.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-114041423436111606?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/114041423436111606/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=114041423436111606' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/114041423436111606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/114041423436111606'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2006/02/mashing-up-desktop.html' title='Mashing up the desktop?'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-114019388271378167</id><published>2006-02-17T11:29:00.000-05:00</published><updated>2006-02-20T00:59:57.750-05:00</updated><title type='text'>Google and China</title><content type='html'>In the past several weeks, The People's Army of Geeks has &lt;a href="http://yro.slashdot.org/article.pl?sid=06/02/16/1350227&amp;from=rss"&gt;slash-dotted&lt;/a&gt; the heck out of recent news that Google began &lt;a href="http://www.cbsnews.com/stories/2006/01/25/tech/main1236273.shtml"&gt;censoring searches on google.com.cn&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Give it a break, folks! Google makes it easier for people to access information on the global scale. My prediction: Google's presence is one of the catalysts that will bring about a new kind of cultural revolution, one which will see the end of communism in China without bloodshed. &lt;br /&gt;&lt;br /&gt;The voice of democracy cannot be silenced forever.  And there will be democracy when the people of China (or Vietnam for that matter) want it so much that their government will have no choice but to give it to them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-114019388271378167?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/114019388271378167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=114019388271378167' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/114019388271378167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/114019388271378167'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2006/02/google-and-china.html' title='Google and China'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-113971496535754886</id><published>2006-02-11T20:27:00.000-05:00</published><updated>2006-02-11T23:55:09.170-05:00</updated><title type='text'>REST and the principle of encapsulation</title><content type='html'>I was playing around with my new Outlook Web Access (OWA) installation last night and it struck me that OWA appears to be a &lt;a href="http://en.wikipedia.org/wiki/REST"&gt;RESTful&lt;/a&gt; application. Good on Microsoft!&lt;br /&gt;&lt;br /&gt;One of the main concepts in REST is the idea that all resources (in a general sense, not technical sense) in the system are uniquely addressable via a URL. It implies that the URL only contains the business end of the feature (e.g. viewing my inbox) and should have no technology association whatsoever (e.g. this feature was implemented using ASP.NET, which, by the way, OWA was). &lt;br /&gt;&lt;br /&gt;In my simple-minded view, I think this encapsulation is very important for the following reasons.&lt;br /&gt;&lt;br /&gt;As a (somewhat) alert software user, I couldn't care less if you implemented your software using ASP, ASP.Net, Java, Python, Perl, PHP version 4 as opposed to version 5, or what-have-you. Having a URL containing a tail of .asp, .aspx, .jsp, or .py immediately clues me into what technology you're implementing your software in, which may not be a good thing (see next paragraph). Plus, having technically specific parameters in the URL that has nothing to do with what I'm trying to do, like whether  it should use UTF-8 or ISO-8859-1 encoding, is simply annoying.&lt;br /&gt;&lt;br /&gt;As a developer, I would want to abstract the underlying implementation language away from my users for many reasons, security being one. If there's a security bug found in the current version of PHP,  how do you think the hackers are going to target PHP sites? Yep, you guessed it: crawl the web searchhing for URLs with .php or .php4 extensions. Additionally, if later on, requirements change and it turns out that PHP just can't handle the scalability (sorry for the cheapshot, PHP fans), I can always pull the rug and re-implement the whole system using, oh I don't know, &lt;a href="http://www.ruby-lang.org/en/"&gt;Ruby&lt;/a&gt; for instance, and do it without breaking any hyperlink that my users may have bookmarked.  &lt;br /&gt;&lt;br /&gt;Web URLs should be treated as public interfaces, and if you could change the underlying implementation without changing the interface, that would be ideal.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-113971496535754886?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/113971496535754886/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=113971496535754886' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/113971496535754886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/113971496535754886'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2006/02/rest-and-principle-of-encapsulation.html' title='REST and the principle of encapsulation'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-113662764655172321</id><published>2006-01-07T03:43:00.000-05:00</published><updated>2006-12-07T02:34:20.531-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ssh'/><category scheme='http://www.blogger.com/atom/ns#' term='putty'/><title type='text'>Accessing your intranet web sites through an SSH tunnel</title><content type='html'>If, from your home, you're connecting to your company's network via a Linux SSH server, and would like to to be able to access all of the corporate intranet web sites, here's how.&lt;br /&gt;&lt;br /&gt;First, some assumptions, your SSH server machine must have the  following software installed:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;an SSH server that support SSH2 protocol&lt;br /&gt;&lt;li&gt;SSH daemon running with port-forwarding enabled. RedHat Linux has it enabled out-of-the-box.&lt;br /&gt;&lt;li&gt;a web (outbound) proxy/cache daemon. RedHat Linux comes with &lt;a href="http://www.squid-cache.org/"&gt;Squid&lt;/a&gt;. Note what port your proxy server is running on. Squid runs on port 3128 by default. &lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Instructions:&lt;br /&gt;You'll be connecting to the SSH server &lt;a href="http://th2tran.blogspot.com/2005/05/who-needs-gotomypc.html"&gt;using PuTTY&lt;/a&gt;.&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Set up a port-forwarding tunnel as follows: L3128=&amp;lt;your_proxy_server_ip_address&amp;gt;:3128&lt;br /&gt;&lt;img src="http://static.flickr.com/38/83298355_2d796d9cea.jpg?v=0" width="400"&gt;&lt;br /&gt;&lt;a href="http://static.flickr.com/38/83298355_2d796d9cea.jpg?v=0"&gt;View Full Image&lt;/a&gt;&lt;br /&gt;&lt;li&gt;Connect to your SSH server using the above new settings&lt;br /&gt;&lt;li&gt;Configure your browser proxy setting to use localhost:3128 as the proxy server.&lt;br /&gt;&lt;img src="http://static.flickr.com/40/83298356_5ba147df20.jpg?v=0" width="400"&gt;&lt;br /&gt;&lt;a href="http://static.flickr.com/40/83298356_5ba147df20.jpg?v=0"&gt;View Full Image&lt;/a&gt;&lt;br /&gt;&lt;li&gt;Now restart your browser, and try accessing an internal web site, for example: &lt;a href="http://shrike.karora.ca:8080/supportwiki/"&gt;http://shrike.karora.ca:8080/supportwiki/&lt;/a&gt; &lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Internal host names will work, since the browser now uses the DNS server on the proxy server for name resolution. The side effect to this is that you're now surfing the web as if you're doing it from your corporate office's computer. So beware of nosy, sniffy network administrators. ;-)&lt;br /&gt;&lt;br /&gt;The whole thing is relatively simple to set up.  The one pain point is the tunnel forwarding setup in PuTTY, not too intuitive for the non-techie users.&lt;br /&gt;&lt;br /&gt;I've been thinking of writing (if I ever get any down time, that is) a Java Webstart application that does what PuTTY does, but simplifies the setup for the novice users. The administrator would configure the appropriate tunnel setting on the server side, then send a &lt;a href="http://www.google.ca/search?q=define%3AJNLP"&gt;JNLP&lt;/a&gt; URL to the user to click on. The JWS application will launch and will take care of all the config stuff.  The user won't have to mess with port forwarding settings or browser proxy settings, whatsoever.&lt;br /&gt;&lt;br /&gt;If anyone knows anything out there that already does something like this, please let me know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-113662764655172321?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/113662764655172321/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=113662764655172321' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/113662764655172321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/113662764655172321'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2006/01/accessing-your-intranet-web-sites.html' title='Accessing your intranet web sites through an SSH tunnel'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-113566587547733196</id><published>2005-12-27T00:49:00.000-05:00</published><updated>2007-11-09T14:39:27.984-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AppConnector'/><title type='text'>AppConnector Ranking by Google - Year-End Review</title><content type='html'>Last year, I &lt;a href="http://th2tran.blogspot.com/2004/12/karoras-appconnector-finally-ranked-1.html#links"&gt;observed&lt;/a&gt; that &lt;a href="http://www.karora.com"&gt;Karora&lt;/a&gt; &lt;a href="http://www.karora.com/appconnector/appconnoview.htm"&gt;AppConnector&lt;/a&gt; finally got ranked #1 by the Google search engine for the "appconnector" search word, and suggested that we set our next goal to be ranked #1 for the phrase "desktop application integration".&lt;br /&gt;&lt;br /&gt;Well as you all know, over the past year, our marketing engine has been cranking hard ;-), and now it's that time again.  Let's &lt;a href="http://www.google.ca/search?hl=en&amp;q=%22desktop+application+integration%22"&gt;see&lt;/a&gt; how we faired:&lt;br /&gt;&lt;img src="http://static.flickr.com/38/77904382_1190e8a0eb_o.jpg" width="450" alt="appconn_ranking_2005" /&gt;&lt;br /&gt;&lt;a href="http://static.flickr.com/38/77904382_1190e8a0eb_o.jpg"&gt;View Full Image&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Eleventh place! &lt;br /&gt;Not quite the #1 billing we had hoped for, but not too shabby either, a vast improvement over last year's ranking for the same phrase. Woohoo!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-113566587547733196?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/113566587547733196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=113566587547733196' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/113566587547733196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/113566587547733196'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2005/12/appconnector-ranking-by-google-year.html' title='AppConnector Ranking by Google - Year-End Review'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-113527161869739032</id><published>2005-12-22T12:01:00.000-05:00</published><updated>2005-12-23T02:24:35.106-05:00</updated><title type='text'>Wally</title><content type='html'>That Wally, so wise!!! :-)&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.dilbert.com/comics/dilbert/archive/images/dilbert2002035151221.gif" width="460"&gt;&lt;br /&gt;Courtesy: &lt;a href="http://www.dilbert.com/comics/dilbert/archive/dilbert-20051222.html"&gt;dilbert.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Heehee, this is sooo true!!! It's also sooo ... me, minus the "existence of [my] wind" part. :-)&lt;br /&gt;&lt;br /&gt;"no one" has "seen [me] work" as well.  ;-)&lt;br /&gt;And this usually means that I actually get more work done than when some one does "see" me work. &lt;br /&gt;&lt;br /&gt;Now you've got to ask yourself one question: Who's this "no one" character?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-113527161869739032?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/113527161869739032/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=113527161869739032' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/113527161869739032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/113527161869739032'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2005/12/wally.html' title='Wally'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-113398505830383492</id><published>2005-12-07T18:49:00.001-05:00</published><updated>2008-06-12T11:47:47.726-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SpamAssassin'/><category scheme='http://www.blogger.com/atom/ns#' term='AppConnector'/><title type='text'>AppConnector Cookbook: A Spam Flood Notifier</title><content type='html'>End-user Problem Statement: &lt;br /&gt;You're an IT Director. Your mail server runs on Windows 2000 and uses a directory to queue incoming messages.  You want to be notified as soon as this queue becomes heavily loaded, by excessive spamming for instance, so that you can take the appropriate action in time to avoid mail delays for your users.  &lt;br /&gt;&lt;br /&gt;Motivation:&lt;br /&gt;I'm that "IT Director"! 8-|&lt;br /&gt;I got up this morning and found that my mail server has been so heavily bombarded by excessive spams for the last 12 hours that our &lt;a href="http://spamassassin.apache.org/"&gt;SpamAssassin&lt;/a&gt; filter was fuming, and there were in excess of 2000 messages stuck in the queue, and the number was rising. All hell broke loose! It took me three hours to stabilize the spam filter and clear out the message queue.&lt;br /&gt;&lt;br /&gt;A couple times a year, we tend to run into little fiascos like these. Alas, with each problem comes opportunity. &lt;br /&gt;&lt;br /&gt;Techie Translation of Problem Statement: &lt;br /&gt;Need a utility that lets grumpie here monitor a directory for changes, and it should email him when a directory content has exceeded a certain maximum number of files (say 1000).&lt;br /&gt;&lt;br /&gt;Solution:&lt;br /&gt;I don't know if Windoze server provides any built-in way to do what's required, but as the old adage goes: Stick with what you know. So here goes...&lt;br /&gt;&lt;br /&gt;Use &lt;a href="http://www.karora.com/appconnector/appconnoview.htm"&gt;AppConnector&lt;/a&gt; with the following recipe:&lt;br /&gt;&lt;br /&gt;Ingredients:&lt;br /&gt;- 1 Default Adapter&lt;br /&gt;- 1 File Monitor event&lt;br /&gt;- 1 Script task, with 1 input parameter&lt;br /&gt;- 1 Mail Task &lt;br /&gt;- some angel dust&lt;br /&gt;&lt;br /&gt;Instructions:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Start warming an empty KAP in 23C temperature environment for comfort&lt;br /&gt;&lt;li&gt;Add new application using Default Adapter&lt;br /&gt;&lt;li&gt;Add Script Task, sprinkle in 1 input parameter for flavour.&lt;br /&gt;&lt;li&gt;Add File Monitor event, set monitored directory to be the mail queue directory, notification type to ONLY ADDED FILES, and let it simmer.&lt;br /&gt;&lt;li&gt;Back to Script task, add a couple of lines of script to check number of files in the the directory. Set script so that if this number is below the set limit, it should FAIL. Otherwise, it should SUCCEED, to allow the successor task to run.&lt;br /&gt;&lt;li&gt;Add Mail task as a successor of Script task. Configure it to send email to IT director with an appropriate message body. Sprinkle in some angel dust for taste and stir well.&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Test well before serving.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-113398505830383492?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/113398505830383492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=113398505830383492' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/113398505830383492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/113398505830383492'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2005/12/appconnector-cookbook-spam-flood.html' title='AppConnector Cookbook: A Spam Flood Notifier'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-113391519569249980</id><published>2005-12-06T18:24:00.000-05:00</published><updated>2005-12-06T19:44:53.340-05:00</updated><title type='text'>Geek jokes, Java flavoured</title><content type='html'>Just read these jokes on &lt;a href="http://weblogs.java.net/blog/chet/archive/2005/10/two_items_walk.html"&gt; Chet Hasse's Java.Net blog&lt;/a&gt;, found them quite ... cute.  Thought I'd share them here.  You may need to have some programming background to appreciate ...&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt; Two items walk into a ToolBar.&lt;br /&gt; The bartender says, “Can I get you a menu?”&lt;br /&gt; “No thanks, we're looking for a little action.”&lt;br /&gt;&lt;br /&gt;                    ...&lt;br /&gt;&lt;br /&gt; An item walks into a ToolBar.&lt;br /&gt; The bartender says, “Where's your friend?”&lt;br /&gt; “Big event last night; he's disabled.”&lt;br /&gt;&lt;br /&gt;                    ...&lt;br /&gt;&lt;br /&gt;        Two ints and a Float are in a bar. &lt;br /&gt;        They spot an attractive Double on her own. &lt;br /&gt;        The first int walks up to her. &lt;br /&gt;        “Hey, baby”, he says, “my VM or yours”. &lt;br /&gt;        She slaps him and he walks back dejected. &lt;br /&gt;        The second int walks over. &lt;br /&gt;        “Hey, cute-stuff, can I cook your Beans for breakfast”. &lt;br /&gt;        After a quick slapping, he too walks back. &lt;br /&gt;        The Float then ambles over casually. &lt;br /&gt;        “Were those two primitive types bothering you?”, he remarks. &lt;br /&gt;        “Yes. I'm so glad you're here”, she says. “They just had no Class!”&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;And here are my two cents:&lt;br /&gt;&lt;br /&gt;Two items walk into a ToolBar.&lt;br /&gt;Waiter says "Would you like to sit in the menu or non-menu section?"&lt;br /&gt;Item: Non-menu please. Menu section will give us ClassCastException.  Can't you see that we're buttons?&lt;br /&gt;Waiter: Oh, I'm sorry. In that case, I can't seat you just yet. Wait here for your ActionListener please. He's busy serving other buttons right now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-113391519569249980?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/113391519569249980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=113391519569249980' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/113391519569249980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/113391519569249980'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2005/12/geek-jokes-java-flavoured.html' title='Geek jokes, Java flavoured'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-113377183852205402</id><published>2005-12-05T03:05:00.000-05:00</published><updated>2005-12-05T03:37:20.643-05:00</updated><title type='text'>Flickr</title><content type='html'>I just joined the &lt;a href="http://www.flickr.com/photos/86016339@N00/"&gt;Flickr&lt;/a&gt; bandwagon. Here's my very first post :-), taken on my business trip last June using my Canon PowerShot digicam:&lt;br /&gt;&lt;img src="http://static.flickr.com/34/70402277_33efbf38e4.jpg?v=0"&gt;&lt;br /&gt;&lt;br /&gt;Flickr will come in handy the next time I need to include images and illustrations in my blog entries.  It is, albeit, a copy-and-paste solution (urgh!) for the time being-- copy the image link from Flickr, paste into Blogger--but it'll do, at least until &lt;a href="http://www.blogger.com"&gt;Blogger&lt;/a&gt; finally clues in and supports image uploading in their blogging service. Or is that a premium option? ;-)  &lt;br /&gt;&lt;br /&gt;Yeah, Yeah, I know Blogger has a thing called Picasa that lets you upload photos. But it's not quite what I'm looking for, because each image uploaded via Picasa immediately shows up as a separate blog entry.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-113377183852205402?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/113377183852205402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=113377183852205402' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/113377183852205402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/113377183852205402'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2005/12/flickr.html' title='Flickr'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-113296995892261858</id><published>2005-11-25T20:40:00.000-05:00</published><updated>2005-11-25T20:52:38.933-05:00</updated><title type='text'>delicious Firefox</title><content type='html'>Just found &lt;a href="http://delicious.mozdev.org/installation.html"&gt;this little jem&lt;/a&gt;. It's a &lt;a href="http://www.mozilla.org/products/firefox/"&gt;Firefox&lt;/a&gt; extension for &lt;a href="http://del.icio.us/"&gt;del.icio.us&lt;/a&gt;. Very kewl!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-113296995892261858?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/113296995892261858/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=113296995892261858' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/113296995892261858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/113296995892261858'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2005/11/delicious-firefox.html' title='delicious Firefox'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-112914470243867403</id><published>2005-10-12T15:03:00.000-04:00</published><updated>2007-11-09T14:42:20.699-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>Custom Development???</title><content type='html'>Reading Joel's article today on &lt;a href="http://www.joelonsoftware.com/articles/SetYourPriorities.html"&gt;Set Your Priorities&lt;/a&gt;, I'm having problem getting past this paragraph:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Custom development is that murky world where a customer tells you what to build, and you say, "are you sure?" and they say yes, and you make an absolutely beautiful spec, and say, "is this what you want?" and they say yes, and you make them sign the spec in indelible ink, nay, blood, and they do, and then you build that thing they signed off on, promptly, precisely and exactly, and they see it and they are horrified and shocked, and you spend the rest of the week reading up on whether your E&amp;O insurance is going to cover the legal fees for the lawsuit you've gotten yourself into or merely the settlement cost. Or, if you're really lucky, the customer will smile wanly and put your code in a drawer and never use it again and never call you back.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I don't get it.  Why would doing custom (software) development be any different than any other type of development? Sparky, why the heck did you wait until you finished building the whole darn thing before showing it to your customer? Hint hint: &lt;a href="http://en.wikipedia.org/wiki/Iterative_development"&gt;Iterative Development&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-112914470243867403?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/112914470243867403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=112914470243867403' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/112914470243867403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/112914470243867403'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2005/10/custom-development.html' title='Custom Development???'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-112846213331957600</id><published>2005-10-04T17:36:00.000-04:00</published><updated>2007-11-09T14:46:56.236-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='skype'/><title type='text'>My First IM spam!</title><content type='html'>I got this message on Skype today:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_4MC2RcVuvck/RzS4yzrFp1I/AAAAAAAAAAw/UsK2oa94C1Y/s1600-h/spam-skype%5B1%5D.jpg"&gt;&lt;img style="cursor: pointer; width: 481px; height: 530px;" src="http://bp2.blogger.com/_4MC2RcVuvck/RzS4yzrFp1I/AAAAAAAAAAw/UsK2oa94C1Y/s200/spam-skype%5B1%5D.jpg" alt="" id="BLOGGER_PHOTO_ID_5130929058485741394" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Damn spammers!!!&lt;br /&gt;Since when did spamming start spreading onto instant messaging (IM) systems, I wonder.&lt;br /&gt;I also wonder if spamming really work for them.  I mean, what rate of response  do these spammers get from their unsolicited messages anyway.&lt;br /&gt;&lt;br /&gt;Oh well, here comes opportunity for IM spam filter software to bear.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-112846213331957600?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/112846213331957600/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=112846213331957600' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/112846213331957600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/112846213331957600'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2005/10/my-first-im-spam.html' title='My First IM spam!'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_4MC2RcVuvck/RzS4yzrFp1I/AAAAAAAAAAw/UsK2oa94C1Y/s72-c/spam-skype%5B1%5D.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-112579165336909891</id><published>2005-09-03T19:45:00.000-04:00</published><updated>2007-11-09T14:48:55.505-05:00</updated><title type='text'>Desktop wars???</title><content type='html'>Courtesy of &lt;a href="http://www.sfdt.com/"&gt;Stick Figure Death Theatre&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;embed src="http://codockhach.blogdns.net/public/17937-desktopwar.swf" border="0" height="500" width="450"&gt;&lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-112579165336909891?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/112579165336909891/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=112579165336909891' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/112579165336909891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/112579165336909891'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2005/09/desktop-wars.html' title='Desktop wars???'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-112542743950160060</id><published>2005-08-30T14:29:00.000-04:00</published><updated>2005-08-30T14:43:59.506-04:00</updated><title type='text'>Google Talk</title><content type='html'>Has anyone out there tried out the new &lt;a href="http://www.google.com/talk/"&gt;Google Talk&lt;/a&gt;? I need a talk buddy to try this with, to see if the quality is better (or worse) than &lt;a href="http://www.skype.com"&gt;Skype&lt;/a&gt;. You'll need a Google/GMail account in order to use it. I have a google-less-ninety-eight-zero invites left to spare so if you need a GMail account, let me know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-112542743950160060?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/112542743950160060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/112542743950160060'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2005/08/google-talk.html' title='Google Talk'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-112524852790499515</id><published>2005-08-28T12:42:00.000-04:00</published><updated>2005-11-02T01:59:31.446-05:00</updated><title type='text'>Spammers are an evil breed</title><content type='html'>So...the net parasites, otherwise known as spammers, have managed to creep into my blog page. Damn them! Damn them all to hell!!! &lt;br /&gt;What's that you said?  Cursing them won't help? Oh well, it's a good thing Blogger.com has added &lt;a href="http://en.wikipedia.org/wiki/Captcha"&gt;CAPTCHAs&lt;/a&gt; to their commenting facility. +1 &lt;br /&gt;&lt;br /&gt;On a side--but somewhat related--note...&lt;a href="http://fishdujour.typepad.com"&gt;Gav&lt;/a&gt; has recently forwarded to me a link to a CAPTCHA decoder page that claims to being able to defeat many CAPTCHA implementations. We might be able to use similar techniques to improve the screen scraping facility in &lt;a href="http://www.karora.com/appconnector/appconnoview.htm"&gt;AppConnector&lt;/a&gt;.  Too bad, though...No sample code is available yet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-112524852790499515?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/112524852790499515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=112524852790499515' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/112524852790499515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/112524852790499515'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2005/08/spammers-are-evil-breed.html' title='Spammers are an evil breed'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-111870553325801311</id><published>2005-06-13T19:24:00.000-04:00</published><updated>2005-06-13T20:21:41.490-04:00</updated><title type='text'>Filming of "The Sentinel" At Sherway Gardens</title><content type='html'>I walked over to &lt;a href="http://www.sherwaygardens.ca"&gt;Sherway Gardens&lt;/a&gt; for lunch today and was in for a pleasant surprise: they were filming &lt;a href="http://www.tribute.ca/synopsis.asp?m_id=10636"&gt;The Sentinel&lt;/a&gt; there. One stranger sitting next to me, in the food court, said he saw Michael Douglas (I guess he couldn't contain the excitement and had to tell some body). I missed him by an hour or so. Damn! No more late lunch for me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-111870553325801311?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/111870553325801311/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=111870553325801311' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/111870553325801311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/111870553325801311'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2005/06/filming-of-sentinel-at-sherway-gardens.html' title='Filming of &quot;The Sentinel&quot; At Sherway Gardens'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-111700240086346156</id><published>2005-05-25T01:38:00.000-04:00</published><updated>2007-04-27T11:08:20.272-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cvs'/><title type='text'>Source Code Repository: The Commit Paradox</title><content type='html'>I shot myself in the foot today, figuratively speaking of course, while struggling with this little subtle dilemma surrounding the rules of code commitment (aka check-in):&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;To make effective use of a version control system, you should commit your changes often, even if it means committing partially completed features.&lt;br /&gt;&lt;li&gt;As a responsible developer, you should not allow your commit to break the nightly build and regression tests.&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;I had a piece of enhancement work this morning that I had just finished coding for, but hadn't adequately been tested so I didn't want to commit them to the repository just yet (trying to follow rule #2: don't break the build). &lt;br /&gt;&lt;br /&gt;Just then, I realized that there's code duplication in a couple of places.  So I decided to do some refactoring. An hour later, a credit of my stunning optimization skills, the code had been nicely refactored.  The problem was: the feature enhancement no longer worked!  Oops! I must have cut out some vital piece of logic somewhere. The original spaghetti code (that used to work) is now gone--eaten by the refactoring monster.  &lt;br /&gt;&lt;br /&gt;So in failing to follow rule #1, that set me back by about half a day.&lt;br /&gt;&lt;br /&gt;But how can you follow two seemingly paradoxical rules such as ones above? On the one hand, you'd want to commit your changes as often as possible, and not wait until you've fully implemented the feature before committing.  On the other hand, you wouldn't want your partial commits to break the automated build and regression tests.&lt;br /&gt;&lt;br /&gt;Well, you might say that I should have made a back up of my changes before I start refactoring. Ah hah, but what's the point of a revision control system if you have to keep backups of your changes on the side?&lt;br /&gt;&lt;br /&gt;I think the correct solution to this "paradox" would have been to use branching: create a new developmental branch for your enhancement work, even if it was a relatively small enhancement. This would have given me my own sandbox to play with and make partial commits to my heart's content, without breaking the nightly build (because the build would have continued to work on the MAIN branch). And then when I'm satisfied with my implementation, I'd merge the latest changes back into the MAIN branch.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-111700240086346156?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/111700240086346156/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=111700240086346156' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/111700240086346156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/111700240086346156'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2005/05/source-code-repository-commit-paradox.html' title='Source Code Repository: The Commit Paradox'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-111549437253746568</id><published>2005-05-07T15:29:00.000-04:00</published><updated>2006-12-07T02:32:22.817-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ssh'/><category scheme='http://www.blogger.com/atom/ns#' term='Remote Desktop Connection'/><category scheme='http://www.blogger.com/atom/ns#' term='putty'/><title type='text'>Who needs GoToMyPC ;-)</title><content type='html'>&lt;a href="http://www.gotomypc.com"&gt;GoToMyPC&lt;/a&gt; lets you access your PC desktop remotely from a web browser, for a fee, of course.&lt;br /&gt;&lt;br /&gt;I think here's the next best thing: &lt;a href="http://en.wikipedia.org/wiki/SSH"&gt;SSH&lt;/a&gt; + Windows XP Remote Desktop Connection. You use your SSH client connection to create a secure tunnel to your Remote Desktop PC.  Granted, it's not the same as accessing your desktop through a browser, but...&lt;br /&gt;&lt;br /&gt;If you're using &lt;a href="http://www.microsoft.com/windowsxp/default.mspx"&gt;Windows XP&lt;/a&gt; at home and you have an SSH server running on your home network, chances are you already know how to do this. Go and read more &lt;a href="http://www.dilbert.com/"&gt;Dilbert&lt;/a&gt;--the rest of this article may not apply to you.&lt;br /&gt;&lt;br /&gt;If you don't have an SSH server, and want to, install &lt;a href="http://www.redhat.com/fedora/"&gt;RedHat Fedora&lt;/a&gt;.  &lt;br /&gt;&lt;br /&gt;By default  &lt;a href="http://en.wikipedia.org/wiki/Remote_Desktop_Protocol"&gt;Remote Desktop Sharing&lt;/a&gt; is disabled on XP.  You'll need to turn it on via the &lt;b&gt;My Computer&lt;/b&gt; properties dialog.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In order to set up your tunnel, first, you'll need to &lt;a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html"&gt;download PuTTY&lt;/a&gt;, a very well-known SSH client created by &lt;a href="http://www.chiark.greenend.org.uk/~sgtatham/"&gt;Simon Tatham&lt;/a&gt;. If you're not familiar with this tool, here's the &lt;a href="http://the.earth.li/~sgtatham/putty/0.58/htmldoc/"&gt;User Guide&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;To create an SSH tunnel through PuTTY is quite simple. From the &lt;a href="http://the.earth.li/~sgtatham/putty/0.58/htmldoc/Chapter4.html#config-ssh-portfwd"&gt;Tunnels Panel&lt;/a&gt; for your connection, add the following mapping:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Source Port: 127.0.0.2:3389&lt;br /&gt;&lt;li&gt;Destination: &amp;lt;Your RDP computer's IP address&amp;gt;:3389 &lt;br /&gt;    e.g. 192.168.2.100:3389&lt;br /&gt;&lt;li&gt;Type: Remote&lt;br /&gt;&lt;/ul&gt; &lt;br /&gt;&lt;br /&gt;Now, after you've established the SSH session with your server, you should be able to  start up your Remote Desktop Connection client and connect to your remote desktop by entering the 127.0.0.2[:3389] in the &lt;b&gt;Destination&lt;/b&gt; field (the part in the square brackets are optional). The Remote Desktop Connection client is found on your Start&gt;Program&gt;Accessories&gt;Communications menu, if installed. If you don't have it installed already, you can download it &lt;a href="http://www.microsoft.com/windowsxp/downloads/tools/rdclientdl.mspx"&gt;here&lt;/a&gt;  &lt;br /&gt;&lt;br /&gt;For convenience, I usually put a shortcut on my Desktop, pointing to &amp;lt;Path_To_PuTTY_Program_Folder&amp;gt;\plink.exe -load &amp;lt;My SSH Tunnel Session Name&amp;gt; -l &amp;lt;login name&amp;gt;. This allows me to establish the tunnel with one single click.  All I need to do after that would be to type in my password, when prompted.&lt;br /&gt;&lt;img src="http://www.karora.ca/users/ttran/ssh-rdp-putty1.jpg" alt="PuTTY configuration screen"/&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.karora.ca/users/ttran/ssh-rdp-putty2.jpg" alt="PuTTY Tunnel configuration screen"/&gt;&lt;br /&gt;&lt;br /&gt;So why 127.0.0.2 instead of localchost [127.0.0.1]?  Well, if you're using Windows XP on your local PC and you try to connect your Remote Desktop Client to localhost, you'd get a message by the application saying "I can't connect to myself" (I'm paraphrasing).  The 127.0.0.2 IP address tricks the app into thinking that it's actually connecting to a remote computer instead of localhost.  &lt;br /&gt;&lt;br /&gt;Some of you nerds out there might wonder: why hassle with the SSH tunnel? Why not just connect to RDP directly? Well, I'm of a suspicious mind, and for some strange reason, I feel a little more secure when connecting through a 1024-bit &lt;a href="http://en.wikipedia.org/wiki/DSA"&gt;DSA&lt;/a&gt; encrypted channel.&lt;br /&gt;&lt;br /&gt;You can probably see that SSH tunnelling approach is not only limited to RDP, but can be used to create a secure tunnel into virtually any TCP service on the remote network: NetMeeting, VNC, Exchange Server. &lt;br /&gt;&lt;br /&gt;I now have my mind set on my next toy: a wifi PDA running &lt;a href="http://www.microsoft.com/windowsmobile/"&gt;Windows Mobile&lt;/a&gt;.  This way I can access my office desktop PC everywhere I go.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-111549437253746568?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/111549437253746568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=111549437253746568' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/111549437253746568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/111549437253746568'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2005/05/who-needs-gotomypc.html' title='Who needs GoToMyPC ;-)'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-111361097480753984</id><published>2005-04-15T20:08:00.000-04:00</published><updated>2005-04-16T01:41:44.530-04:00</updated><title type='text'>Usability blooper?</title><content type='html'>I've installed this piece of software several times before and haven't actually noticed this, but now it strikes me as being quite hilarious.&lt;br /&gt;&lt;br /&gt;After I installed this piece of software, it politely asked me whether I wanted to restart the system. I answered "No".  It then told me something to the effect of "I'm just going to ignore your 'No' answer, because I know what's good for you. So I'm going to go ahead and reboot your system anyway."&lt;br /&gt;&lt;br /&gt;It then proceeded to shutdown my session and rebooted.&lt;br /&gt;&lt;br /&gt;Guess which piece of software I'm talking about. :-)&lt;br /&gt;&lt;br /&gt;Hint: it's a development tool. &lt;br /&gt;&lt;br /&gt;OK.  So it's a pretty old piece of software. But still...that's a pretty good usability screw-up, if there is such a thing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-111361097480753984?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/111361097480753984/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=111361097480753984' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/111361097480753984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/111361097480753984'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2005/04/usability-blooper.html' title='Usability blooper?'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-111017723004529170</id><published>2005-03-07T00:55:00.000-05:00</published><updated>2005-03-07T01:43:24.810-05:00</updated><title type='text'>Transferring your Skype settings to another computer</title><content type='html'>I installed &lt;a href="http://www.skype.com"&gt;Skype&lt;/a&gt; on my new computer and found that my contact list is empty.  So...this means Skype keeps my contact list locally instead of keeping it on the central server like &lt;a href="http://messenger.msn.com"&gt;MSN Messenger&lt;/a&gt; does.&lt;br /&gt;I wanted to transfer all my Skype contacts from my old computer to the new one. It would be nice if Skype provided a Contact List Export/Import feature, but until then, I found this simple hack on their &lt;a href="http://forum.skype.com/viewtopic.php?t=19854&amp;highlight=contacts+transfer"&gt;support forum&lt;/a&gt; that did just what was needed:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;On your old computer, go to the "%USERPROFILE%\Application Data\Skype folder.  There you should see a folder with your Skype ID as the name. &lt;br /&gt;&lt;li&gt;Copy that entire folder to your new computer, under the same location. Make sure you shut down Skype before copying, otherwise you'll get some sharing violations.&lt;br /&gt;&lt;li&gt;Start up Skype on the new computer.  You may be asked to enter your login information again. &lt;br /&gt;&lt;li&gt;After logging in, you may see that your contact list is empty.  Don't panic! Just restart Skype.  This time you should see your full "imported" contact list.&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;The above procedure not only imported the contact list, but also the chat history, call history, the works.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-111017723004529170?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/111017723004529170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=111017723004529170' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/111017723004529170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/111017723004529170'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2005/03/transferring-your-skype-settings-to.html' title='Transferring your Skype settings to another computer'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-111008413579636759</id><published>2005-03-05T23:36:00.001-05:00</published><updated>2009-02-08T13:20:43.770-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emachines'/><title type='text'>Visual Studio 6 and AMD64?</title><content type='html'>So after five years, I finally took the chance to upgrade to a (much) more powerful computer. And to add insult to injuries, it's a 64-bit machine (an AMD64 &lt;a href="http://www.emachines.com/"&gt;eMachine&lt;/a&gt; to be exact), running Windows XP.  An aside note of caution: if you're considering putting on Service Pack 2 (SP2) and have no real need for doing it other than wanting to get the latest and greatest, my advice: don't!  I found that a couple of my applications just won't run after it.  I had to take out SP2, put SP1 back on, and then things ran fine.&lt;br /&gt;&lt;br /&gt;Right now, I'm trying to install Visual Studio 6 on the new machine and having a hell of a time.  The installer refuses to run, giving weird error messages about missing kernel32.dll entry points.  I checked and the entry point is there in the DLL. I have a hunch it might have something to do with the 64-bit thing. I googled everywhere and so far haven't found a solution yet. Perhaps this is a sign to migrate to .NET? ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-111008413579636759?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/111008413579636759/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=111008413579636759' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/111008413579636759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/111008413579636759'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2005/03/visual-studio-6-and-amd64.html' title='Visual Studio 6 and AMD64?'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-111007063093528940</id><published>2005-03-05T19:42:00.000-05:00</published><updated>2005-03-05T23:31:16.893-05:00</updated><title type='text'>Firefox 1.0.1</title><content type='html'>It has begun: &lt;a href="http://www.computerworld.com/securitytopics/security/holes/story/0,10801,100060,00.html"&gt;Firefox security vulnerabilities&lt;/a&gt; are cropping up.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://secunia.com/graph/?type=adv&amp;period=all&amp;prod=4227"&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.webopedia.com/TERM/p/phishing.html"&gt;Phishers&lt;/a&gt; haven't seem to have paid too much attention because they're too busy hacking away at &lt;a href="http://www.microsoft.com/windows/ie/"&gt;IE&lt;/a&gt;. Or is it because they know it's a geek's browser of choice?  And when you touch geek, there's hell to pay.  :-) But all this geekosity can only protect us for so long. Being a target is inevitable as the browser gains more popularity.&lt;br /&gt;&lt;br /&gt;Interesting to see what the patch rate (turnaround time from discovery to patch availability) will be like for future vulnerabilities, compare to the likes of IE.&lt;br /&gt;&lt;img src="http://secunia.com/graph/?type=sol&amp;period=all&amp;prod=4227"&gt;&lt;br /&gt;&lt;br /&gt;Here's a &lt;a href="http://www.mozilla.org/projects/security/known-vulnerabilities.html"&gt;list of vulnerabilities&lt;/a&gt; patched in 1.0.1. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mozilla.org/products/firefox/"&gt;Ugrade&lt;/a&gt; now!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-111007063093528940?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/111007063093528940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=111007063093528940' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/111007063093528940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/111007063093528940'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2005/03/firefox-101.html' title='Firefox 1.0.1'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-110775723732856314</id><published>2005-02-07T01:10:00.000-05:00</published><updated>2005-02-07T01:24:20.753-05:00</updated><title type='text'>Why the heck did Sympatico disable SMTP authentication?</title><content type='html'>OK.  I'm really p.o'd about this.  I've been a (relatively) happy &lt;a href="http://www.sympatico.ca"&gt;Sympatico&lt;/a&gt; customer in the last four years, but recent development this past week makes me think again (hate it when I do that). I found out that I can no longer send my Sympatico emails from my office using my &lt;a href="www.mozilla.org/products/thunderbird"&gt;Thunderbird&lt;/a&gt; mail client. A little digging underneath the cover and it turned out they (Sympatico) disabled &lt;a href="http://www.google.com/search?q=define%3ASMTP"&gt;SMTP&lt;/a&gt; authentication on their mail server. &lt;br /&gt;&lt;br /&gt;If you don't know what SMTP Authentication is, it just means that the mail server requires you to enter a user name and password when you're sending mails through it.  In the case of Sympatico, they've turned it off, which isn't so bad except they've also disabled relaying.&lt;br /&gt;&lt;br /&gt;OK. What's "relaying"? It means the server's ability to deliver (relay) your mail message to a server other than itself. So if you're using mail1.com's SMTP mail server to send a message to someone@mail2.com, the server at mail1.com has to "relay" the message to mail2.com for delivery. It's not called "relaying" if I'm using mail1.com's server to send a message to someone_else@mail1.com. &lt;br /&gt;&lt;br /&gt;Back to Sympatico. What they've done is made it so that if I'm outside of my home office, I can't send mails!  A few emails back and forward with their support staff today and I still couldn't get a straight answer on why they did it. Instead, I was suggested to use their web based GetEmail service. Unacceptable workaround! Reason 1: the user interface is fuuugly! Reason 2: I no longer have control over my Sent Items because they're in two places--the web client and my Thunderbird archive. As a side remark, I never delete any of my legitimate emails. Instead, I archive them, which is why the concept of &lt;a href="http://gmail.google.com"&gt;GMail&lt;/a&gt; has some appeals to me. &lt;br /&gt;&lt;br /&gt;Now, they must have done it out of some sort of security concerns--I, of all people, should understand that. For a small organization, may be, but for an &lt;a href="http://www.google.com/search?q=define%3AISP"&gt;ISP &lt;/a&gt;to use this kind of heavy handed tactics? OK, Someone's been spamming our server, we don't know how to stop the individual spammers, so let's treat them all as spammers! They're all guilty! Let's nuke 'em all.  &lt;br /&gt; &lt;br /&gt;&lt;br /&gt;So thanks, Sympatico.  I think I'll switch off that email address from now on and seriously start using my &lt;a href="http://mail.yahoo.ca"&gt;YahooMail&lt;/a&gt; or &lt;a href="http://gmail.google.com"&gt;Gmail&lt;/a&gt; account, which, by the way, supports POP3 and SMTP.&lt;br /&gt;&lt;br /&gt;Hmm...Now that I think about it. Sympatico recently joined forces with MSN, and MSN never did like SMTP. I wonder if this isn't all part of some evil master plan to take over the world. &lt;br /&gt;&lt;br /&gt;Look at what they did to me: they've made me senile!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-110775723732856314?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/110775723732856314/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=110775723732856314' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/110775723732856314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/110775723732856314'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2005/02/why-heck-did-sympatico-disable-smtp.html' title='Why the heck did Sympatico disable SMTP authentication?'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-110762011780192800</id><published>2005-02-05T11:03:00.000-05:00</published><updated>2005-02-05T11:15:17.803-05:00</updated><title type='text'>Microsoft's AntiSpyware Tool Removes Internet Explorer?</title><content type='html'>Just came across this rather amusing &lt;a href="http://www.bbspot.com/News/2005/01/microsoft_antispyware.html"&gt;article&lt;/a&gt; on BBspot.com:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Many Microsoft Windows users who downloaded the recently released AntiSpyware program from Microsoft, or had it installed through an automatic Windows update, woke up to a surprise. Unintentionally, the heuristics of the software detected Internet Explorer as spyware, and removed the program from their systems.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;If only it were true....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-110762011780192800?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/110762011780192800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=110762011780192800' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/110762011780192800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/110762011780192800'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2005/02/microsofts-antispyware-tool-removes.html' title='Microsoft&apos;s AntiSpyware Tool Removes Internet Explorer?'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-110628246924109010</id><published>2005-01-20T23:36:00.000-05:00</published><updated>2005-01-20T23:41:09.240-05:00</updated><title type='text'>Two-faced</title><content type='html'>I started a &lt;a href="http://lytran.homeip.net/blog/"&gt;Vietnamese version&lt;/a&gt; of my blog this week, for those readers curious about that other side of me. Now I'm virtually bilingual.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-110628246924109010?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/110628246924109010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=110628246924109010' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/110628246924109010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/110628246924109010'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2005/01/two-faced.html' title='Two-faced'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-110566537699393041</id><published>2005-01-13T19:27:00.000-05:00</published><updated>2005-01-13T22:40:45.133-05:00</updated><title type='text'>Ease of Use</title><content type='html'>Lately, I've been making it a personal goal to study/research more on the latest &lt;a href="http://www.google.ca/search?q=define%3AGUI"&gt;GUI&lt;/a&gt; &lt;a href="http://www.google.ca/search?hl=en&amp;q=define%3Ausability"&gt;usability&lt;/a&gt; trends, in my continuing quest to build more and more intuitive UIs into the softwares that I work with.&lt;br /&gt;&lt;br /&gt;I was down at business partner's office this week conducting training, getting their folks up-to-speed on &lt;a href="http://www.karora.com/appconnector/appconnoview.htm"&gt;AppConnector&lt;/a&gt;. At the end of the session, one of my "students" made a comment which I thought was a really nice compliment.  She said "I really like [the fact] that [AppConnector Studio] is so easy to use". &lt;br /&gt;&lt;br /&gt;Yes, AppConnector is simple to use, but this was not by accident.  We really focused on the non-programmers as our typical user audience.  Sure, there's been some mistakes made in the beginning, but when we started version 3.0, our mind set was that someone without any programming knowledge should be able able to pick up and use the product in a day or so, and they should be able to do it in a few simple steps. Creating an integration project should be a matter of configuring a bunch of component properties.&lt;br /&gt;&lt;br /&gt;Although there's certainly room for the product to grow in terms of usability and functionality, the person's comment above showed us that we must be doing something right.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-110566537699393041?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/110566537699393041/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=110566537699393041' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/110566537699393041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/110566537699393041'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2005/01/ease-of-use.html' title='Ease of Use'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9175937.post-110497576571781344</id><published>2005-01-05T19:14:00.000-05:00</published><updated>2005-01-05T20:42:45.716-05:00</updated><title type='text'>Oh the joy of business travel</title><content type='html'>Well, I'm stuck here at the airport again because of flight delays. If it weren't for the airport's wifi hotspot, I'd be bored to death. Apparently, &lt;a href="http://www.americawest.com"&gt;America West&lt;/a&gt; is notorious for delays. I got hit with a three-hour delay on the way in, and this time, looks like it's going to be another &lt;a href="http://www.cogsci.princeton.edu/cgi-bin/webwn?stage=1&amp;word=red-eye"&gt;red-eye&lt;/a&gt;. There is a high probability that it's just me, but I keep bumping into craps like these whenever I travel.&lt;br /&gt;&lt;br /&gt;However, to be fair, I've got to say that their service reps are pretty good. What they lack in technical expertise (always some sort of problem with the airplanes--scary), they make up in customer service.  On the way in, I got off my initial flight, missed my connection by 1 hour, half expecting to go through hell to try to arrange another connection flight, but there they were, standing at the exit door with my rebooked boarding pass waiting. Now, eventhough it looks like I'll be sleeping on a plane tonight, at least I'll be sleeping in first-class.&lt;br /&gt;&lt;br /&gt;You may say that's nothing to write home about--it's to be expected.  After all, the delay is their fault.  That should be the least they can do.  Some people expect alot.  On the one hand, I've come to expect nothing from anyone.  That way if I get nothing, then there's nothing to be disappointed about.  On the other hand, you can argue that since you yourself uphold the best of standards, and, therefore, you should rightly expect--no, demand--the best in return. I'm not entirely sure which is a better character trait to have.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9175937-110497576571781344?l=th2tran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://th2tran.blogspot.com/feeds/110497576571781344/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9175937&amp;postID=110497576571781344' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/110497576571781344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9175937/posts/default/110497576571781344'/><link rel='alternate' type='text/html' href='http://th2tran.blogspot.com/2005/01/oh-joy-of-business-travel.html' title='Oh the joy of business travel'/><author><name>Thanh Hai Tran</name><uri>http://www.blogger.com/profile/18371882264327750704</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/47/105553475_f5bafa4166.jpg?v=0'/></author><thr:total>2</thr:total></entry></feed>
