<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">George V. Reilly's Technical Blog</title><subtitle type="html" /><id>http://weblogs.asp.net/george_v_reilly/atom.aspx</id><link rel="alternate" type="text/html" href="http://weblogs.asp.net/george_v_reilly/default.aspx" /><link rel="self" type="application/atom+xml" href="http://weblogs.asp.net/george_v_reilly/atom.aspx" /><generator uri="http://communityserver.org" version="3.0.20510.895">Community Server</generator><updated>2009-07-10T23:12:00Z</updated><entry><title>Building a static website</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/george_v_reilly/archive/2013/01/20/building-a-static-website.aspx" /><id>http://weblogs.asp.net/george_v_reilly/archive/2013/01/20/building-a-static-website.aspx</id><published>2013-01-20T08:11:00Z</published><updated>2013-01-20T08:11:00Z</updated><content type="html">
&lt;p&gt;I've spent time over the last three weeks
working on a new website for the &lt;a class="reference external" href="http://nwcpp.org/"&gt;Northwest C++ Users' Group&lt;/a&gt;.
I blogged about the &lt;a class="reference external" href="http://nwcpp.org/2013-website-refresh.html"&gt;NWCPP website refresh&lt;/a&gt; over there.
In brief, I moved the website
from an instance of the &lt;a class="reference external" href="http://www.joomla.org/"&gt;Joomla&lt;/a&gt; Content Management System at &lt;a class="reference external" href="http://www.justhost.com/"&gt;Just Host&lt;/a&gt;
to a static website generated by &lt;a class="reference external" href="http://blog.getpelican.com/"&gt;Pelican&lt;/a&gt; and hosted at &lt;a class="reference external" href="http://pages.github.com/"&gt;Github Pages&lt;/a&gt;,
and I'm happy with the results.&lt;/p&gt;

&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=9777168" width="1" height="1"&gt;</content><author><name>george_v_reilly</name><uri>http://weblogs.asp.net/members/george_5F00_v_5F00_reilly.aspx</uri></author></entry><entry><title>SerializationException: the constructor was not found</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/george_v_reilly/archive/2011/04/22/serializationexception-the-constructor-was-not-found.aspx" /><id>http://weblogs.asp.net/george_v_reilly/archive/2011/04/22/serializationexception-the-constructor-was-not-found.aspx</id><published>2011-04-22T22:39:00Z</published><updated>2011-04-22T22:39:00Z</updated><content type="html">&lt;a class="reference external image-reference" href="http://blogs.cozi.com/tech/2011/04/serializationexception-the-constructor-was-not-found.html"&gt;&lt;img alt="Serialization" src="http://blogs.cozi.com/.a/6a00d8341ca8a653ef01538e117a13970b-800wi" /&gt;&lt;/a&gt;
&lt;p&gt;I just finished another post at the Cozi Tech Blog,
&lt;a class="reference external" href="http://blogs.cozi.com/tech/2011/04/serializationexception-the-constructor-was-not-found.html"&gt;SerializationException: the constructor was not found&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7768195" width="1" height="1"&gt;</content><author><name>george_v_reilly</name><uri>http://weblogs.asp.net/members/george_5F00_v_5F00_reilly.aspx</uri></author><category term="C#" scheme="http://weblogs.asp.net/george_v_reilly/archive/tags/C_2300_/default.aspx" /></entry><entry><title>Security 101 for Developers</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/george_v_reilly/archive/2011/04/22/security-101-for-developers.aspx" /><id>http://weblogs.asp.net/george_v_reilly/archive/2011/04/22/security-101-for-developers.aspx</id><published>2011-04-22T22:31:00Z</published><updated>2011-04-22T22:31:00Z</updated><content type="html">&lt;a class="reference external image-reference" href="http://blogs.cozi.com/tech/2011/04/security-101-for-developers.html"&gt;&lt;img alt="Why should we care about Security?" src="http://blogs.cozi.com/.a/6a00d8341ca8a653ef014e607cbcb7970c-800wi" /&gt;&lt;/a&gt;
&lt;p&gt;The Cozi Tech Blog needed some love,
so I wrote a post a couple of weeks ago on
&lt;a class="reference external" href="http://blogs.cozi.com/tech/2011/04/security-101-for-developers.html"&gt;Security 101 for Developers&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7768189" width="1" height="1"&gt;</content><author><name>george_v_reilly</name><uri>http://weblogs.asp.net/members/george_5F00_v_5F00_reilly.aspx</uri></author></entry><entry><title>Generating UUIDs in JavaScript</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/george_v_reilly/archive/2010/05/04/generating-uuids-in-javascript.aspx" /><id>http://weblogs.asp.net/george_v_reilly/archive/2010/05/04/generating-uuids-in-javascript.aspx</id><published>2010-05-04T22:15:00Z</published><updated>2010-05-04T22:15:00Z</updated><content type="html">&lt;img src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/96/UUID_Format.svg/567px-UUID_Format.svg.png" alt="UUID layout"&gt;
&lt;p&gt;
Another Cozi Tech Blog post:
&lt;a href="http://blogs.cozi.com/tech/2010/04/generating-uuids-in-javascript.html"&gt;
    Generating UUIDs in JavaScript&lt;/a&gt;
&lt;/p&gt;
&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7470330" width="1" height="1"&gt;</content><author><name>george_v_reilly</name><uri>http://weblogs.asp.net/members/george_5F00_v_5F00_reilly.aspx</uri></author></entry><entry><title>SQLAlchemy Sharding</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/george_v_reilly/archive/2010/04/04/sqlalchemy-sharding.aspx" /><id>http://weblogs.asp.net/george_v_reilly/archive/2010/04/04/sqlalchemy-sharding.aspx</id><published>2010-04-04T07:21:00Z</published><updated>2010-04-04T07:21:00Z</updated><content type="html">&lt;img src="http://www.sqlalchemy.org/_img/sqla-logo6.gif"&gt;

&lt;p&gt;I wrote up some lessons that I learned about &lt;a href="http://blogs.cozi.com/tech/2010/04/sqlalchemy-sharding.html"&gt;SQLAlchemy Sharding&lt;/a&gt; at the Cozi Tech Blog.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7429679" width="1" height="1"&gt;</content><author><name>george_v_reilly</name><uri>http://weblogs.asp.net/members/george_5F00_v_5F00_reilly.aspx</uri></author><category term="Python" scheme="http://weblogs.asp.net/george_v_reilly/archive/tags/Python/default.aspx" /></entry><entry><title>Engineering Jobs at Cozi</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/george_v_reilly/archive/2010/03/26/engineering-jobs-at-cozi.aspx" /><id>http://weblogs.asp.net/george_v_reilly/archive/2010/03/26/engineering-jobs-at-cozi.aspx</id><published>2010-03-27T06:03:00Z</published><updated>2010-03-27T06:03:00Z</updated><content type="html">&lt;p&gt;Cozi is hiring. We have positions in Web Development, Software Engineering, and System Engineering at our headquarters in Seattle.&lt;/p&gt;

&lt;p&gt;Full details at the &lt;a href="http://www.cozi.com/Careers-Jobs-Engineering.htm"&gt;Careers Page&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7416760" width="1" height="1"&gt;</content><author><name>george_v_reilly</name><uri>http://weblogs.asp.net/members/george_5F00_v_5F00_reilly.aspx</uri></author></entry><entry><title>StackOverflow DevDays Seattle 2009</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/george_v_reilly/archive/2009/10/27/stackoverflow-devdays-seattle-2009.aspx" /><id>http://weblogs.asp.net/george_v_reilly/archive/2009/10/27/stackoverflow-devdays-seattle-2009.aspx</id><published>2009-10-27T07:17:00Z</published><updated>2009-10-27T07:17:00Z</updated><content type="html">&lt;a class="reference external image-reference" href="http://www.flickr.com/photos/neoeinstein/sets/72157622407907283/"&gt;&lt;img alt="DevDays Boston photos" class="right-float" src="http://blog.xpdm.us/wp-content/uploads/2009/10/MG_0567.w.s-150x150.jpg" /&gt;&lt;/a&gt;
&lt;p&gt;I spent last Wednesday at Benaroya Hall,
attending the Seattle edition of StackOverflow's traveling &lt;a class="reference external" href="http://blog.stackoverflow.com/2009/05/stack-overflow-developer-days-conference/"&gt;DevDays conference&lt;/a&gt;.
It was well worth $99.&lt;/p&gt;
&lt;p&gt;Joel Spolsky, owner of FogCreek Software and co-founder of StackOverflow,
opened the conference with a keynote about the
dichotomy of power and simplicity.
People are happier when not overwhelmed with choices.
Many of the choices that software forces users to make
are essentially meaningless to the users.
However, even though people want simplicity, they also want features
and different people use different features.
Powerful software sells more copies.&lt;/p&gt;
&lt;p&gt;He argues that developers and designers should put in the extra work to make good choices
on behalf of the users: don't make users feel bad about themselves.
Undo is better than a confirmation dialog.
You are not in charge of what your users do.&lt;/p&gt;
&lt;p&gt;Scott Hanselman spoke about ASP.NET MVC.
We're moving away from ASP.NET to Python,
but if we were to use ASP.NET again, MVC would be a compelling feature.
His presentation was entertaining, if gimmicky.&lt;/p&gt;
&lt;p&gt;Rory Blyth introduced iPhone development, in a tone of snarky ambivalence.
He mentioned the Stockholm Syndrome.
He stressed that Apple's Design &amp;quot;Guidelines&amp;quot; are effectively laws:
violate them and you won't make it into the App Store.
Looks like there's a lot of tedious messing around to hook things up in Objective-C.
At the very end, he briefly demoed MonoTouch, which seemeed a little less tedious.&lt;/p&gt;
&lt;p&gt;Cody Lindley introduced jQuery.
I've done a lot of work with jQuery, but I still learned a few things.
He worked through five facets of jQuery: Find something, do something;
Create something, do something; Chaining; Implicit iteration; and jQuery parameters.
He has an ebook at &lt;a class="reference external" href="http://jqueryenlightenment.com/"&gt;jqueryenlightenment.com&lt;/a&gt;, which I just picked up.&lt;/p&gt;
&lt;p&gt;Daniel Rocha of Nokia talked about the cross-platform Qt (/cute/) toolkit,
which runs on Windows, Mac, and Linux.
More importantly from Nokia's point of view, it runs on their smartphones.
Nokia has changed the licensing of Qt—once very expensive for closed-source apps,
it's now free for apps that don't modify the Qt source.
Qt is for C++, but there are bindings for other languages, such as Python.&lt;/p&gt;
&lt;p&gt;Joel Spolsky came back and treated us to a half-hour demonstration
of Fogbugz&amp;nbsp;7, Evidence-Based Scheduling, and Kiln,
their new hosted Mercurial repository.
Not terribly interesting to me, but the conference was only $99.&lt;/p&gt;
&lt;p&gt;Ted Leung gave us a rather dry Hacker's Introduction to Python
from slides rendered unreadable by a poor choice of colors.
I've done a lot of Python, so I didn't learn much new.
&lt;a class="reference external" href="http://clemesha.org/blog/2009/jul/05/modern-python-hacker-tools-virtualenv-fabric-pip/"&gt;pip&lt;/a&gt; is an easy_install replacement that uninstalls;
&lt;a class="reference external" href="http://pypi.python.org/pypi/zc.buildout"&gt;zc.buildout&lt;/a&gt; assembles apps from multiple parts;
&lt;a class="reference external" href="http://www.bpython-interpreter.org/"&gt;bpython&lt;/a&gt; is a fancy REPL.&lt;/p&gt;
&lt;p&gt;Dan Sanderson talked about Google App Engine
and demoed building apps with Java and with Python.
Looked pretty cool and straightforward.
We probably won't go that route, since we're pushing data to
Amazon's S3, so EC2 makes more sense for us.&lt;/p&gt;
&lt;p&gt;Finally, Steve Seitz from the University of Washington
gave a cool talk on Modeling the World from Internet Photos.
Some of this technology ended up in &lt;a class="reference external" href="http://photosynth.net/"&gt;Photosynth&lt;/a&gt;.
See &lt;a class="reference external" href="http://grail.cs.washington.edu/rome/"&gt;Building Rome in a Day&lt;/a&gt; for some demos.&lt;/p&gt;
&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7240248" width="1" height="1"&gt;</content><author><name>george_v_reilly</name><uri>http://weblogs.asp.net/members/george_5F00_v_5F00_reilly.aspx</uri></author><category term="devdays" scheme="http://weblogs.asp.net/george_v_reilly/archive/tags/devdays/default.aspx" /></entry><entry><title>Review: Pragmatic Version Control Using Git</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/george_v_reilly/archive/2009/10/18/review-pragmatic-version-control-using-git.aspx" /><id>http://weblogs.asp.net/george_v_reilly/archive/2009/10/18/review-pragmatic-version-control-using-git.aspx</id><published>2009-10-19T05:44:00Z</published><updated>2009-10-19T05:44:00Z</updated><content type="html">&lt;a class="reference external image-reference" href="http://www.elliottbaybook.com/product/info.jsp?isbn=1934356158"&gt;&lt;img alt="Pragmatic Version Control Using Git" class="right-float" src="http://images.amazon.com/images/P/1934356158.01.MZZZZZZZ.jpg" /&gt;&lt;/a&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Title: Pragmatic Version Control Using Git&lt;/div&gt;
&lt;div class="line"&gt;Author: Travis Swicegood&lt;/div&gt;
&lt;div class="line"&gt;Rating: $stars(4)&lt;/div&gt;
&lt;div class="line"&gt;Publisher: Pragmatic Bookshelf&lt;/div&gt;
&lt;div class="line"&gt;Copyright: 2008&lt;/div&gt;
&lt;div class="line"&gt;ISBN: &lt;a class="reference external" href="http://www.elliottbaybook.com/product/info.jsp?isbn=1934356158"&gt;1934356158&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;Pages: 179&lt;/div&gt;
&lt;div class="line"&gt;Keywords: computers&lt;/div&gt;
&lt;div class="line"&gt;Reading period: 10–18 October, 2009&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;As part of my &lt;a class="reference external" href="http://www.georgevreilly.com/blog/2009/10/15/GittingAlong.aspx"&gt;personal conversion to Git&lt;/a&gt;, I read Swicegood's Git book.
It's a decent introduction to Git and you learn how to
do all the basic tasks as well as some more advanced topics.
The examples are clear and well-paced.&lt;/p&gt;
&lt;p&gt;I would have liked to see more about collaboration and workflow in a DVCS world,
perhaps a few case studies:
how is Git used in the Linux kernel development process;
how a small, distributed team uses Git and GitHub;
how a collocated team migrates from more traditional tools.&lt;/p&gt;
&lt;p&gt;The book avoids discussing the lower levels of the Git object model,
which is a reasonable choice for a pragmatic guide.&lt;/p&gt;
&lt;p&gt;Recommended.&lt;/p&gt;
&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7232792" width="1" height="1"&gt;</content><author><name>george_v_reilly</name><uri>http://weblogs.asp.net/members/george_5F00_v_5F00_reilly.aspx</uri></author><category term="Books" scheme="http://weblogs.asp.net/george_v_reilly/archive/tags/Books/default.aspx" /><category term="General Software Development" scheme="http://weblogs.asp.net/george_v_reilly/archive/tags/General+Software+Development/default.aspx" /><category term="git" scheme="http://weblogs.asp.net/george_v_reilly/archive/tags/git/default.aspx" /></entry><entry><title>Third-Party Cookies</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/george_v_reilly/archive/2009/10/17/third-party-cookies.aspx" /><id>http://weblogs.asp.net/george_v_reilly/archive/2009/10/17/third-party-cookies.aspx</id><published>2009-10-17T07:15:00Z</published><updated>2009-10-17T07:15:00Z</updated><content type="html">&lt;a class="reference external image-reference" href="http://lifehacker.com/5334984/web-sites-using-flash-instead-of-browser-cookies-to-track-your-activity"&gt;&lt;img alt="C is for Cookie" class="right-float" src="http://cache.gawker.com/assets/images/lifehacker/2009/08/C_is_for_Cookie.jpg" style="width: 200px;" /&gt;&lt;/a&gt;
&lt;p&gt;Over the last few weeks,
I built a PHP application that &lt;a class="reference external" href="http://approvereferendum71.org/create-a-profile-picture"&gt;overlays Approve 71 banners on profile pictures&lt;/a&gt;.
The actual application is hosted in an iframe
and lives on a server in a different domain, &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;eq.dm&lt;/span&gt;&lt;/tt&gt;,
than the main server at &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;approvereferendum71.org&lt;/span&gt;&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;This works fine in most browsers.
Then we started getting reports that it wasn't working in IE8 on Win7 RC1.
The iframe content was blank.&lt;/p&gt;
&lt;p&gt;Poking around, I found the problem with the &lt;a class="reference external" href="http://www.fiddler2.com/fiddler2/"&gt;Fiddler proxy&lt;/a&gt;.
The landing page on &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;eq.dm&lt;/span&gt;&lt;/tt&gt; was supposed to stick some information into the PHP session,
then redirect to a second page at the same site.
The second page was in an endless loop, redirecting to itself.
In Fiddler, I saw a different PHPSESSID cookie on each response,
and no cookie in the requests.&lt;/p&gt;
&lt;p&gt;After reading &lt;a class="reference external" href="http://stackoverflow.com/questions/1003490/ie-8-only-has-access-to-session-cookies"&gt;IE 8 only has access to session cookies&lt;/a&gt;,
I told IE8 to Accept All Cookies and the iframe content appeared.
That fixed it for me, but we could hardly ask people to lower their security sessions.&lt;/p&gt;
&lt;p&gt;I created a P3P file for the second domain, using the &lt;a class="reference external" href="http://www.alphaworks.ibm.com/tech/p3peditor"&gt;IBM P3P Policy Editor&lt;/a&gt;.
(&lt;a class="reference external" href="http://support.microsoft.com/default.aspx/kb/323752/EN-US/"&gt;KB 323752&lt;/a&gt; has more background on P3P and third-party cookies.)&lt;/p&gt;
&lt;p&gt;IE now worked at its default security level.
Problem solved!
Or so I thought.&lt;/p&gt;
&lt;p&gt;A day later, we got reports of similar problems with Safari&amp;nbsp;4 on Mac OS&amp;nbsp;X.&lt;/p&gt;
&lt;p&gt;I sniffed the traffic with &lt;a class="reference external" href="http://www.wireshark.org/"&gt;Wireshark&lt;/a&gt;.
Same problem: the “third-party“ cookie wasn't being accepted by Safari.&lt;/p&gt;
&lt;p&gt;Unfortunately, &lt;a class="reference external" href="http://stackoverflow.com/questions/408582/setting-cross-domain-cookies-in-safari"&gt;Setting cross-domain cookies in Safari&lt;/a&gt;
indicated that there was no reasonable workaround.&lt;/p&gt;
&lt;p&gt;We overcame the issue up playing some DNS games,
which was only possible because we control both servers.
The second server is now also acting as a subdomain of the first,
at &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;dev.approvereferendum71.org&lt;/span&gt;&lt;/tt&gt;.
We used &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;ini_set(&amp;quot;session.cookie_domain&amp;quot;,&amp;quot;.approvereferendum71.org&amp;quot;)&lt;/span&gt;&lt;/tt&gt;
to scope the iframe cookies.
I've tried it in a variety of Windows, Mac, and Linux browsers,
and it works in all of them.&lt;/p&gt;
&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7231927" width="1" height="1"&gt;</content><author><name>george_v_reilly</name><uri>http://weblogs.asp.net/members/george_5F00_v_5F00_reilly.aspx</uri></author><category term="General Software Development" scheme="http://weblogs.asp.net/george_v_reilly/archive/tags/General+Software+Development/default.aspx" /></entry><entry><title>Gitting Along</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/george_v_reilly/archive/2009/10/15/gitting-along.aspx" /><id>http://weblogs.asp.net/george_v_reilly/archive/2009/10/15/gitting-along.aspx</id><published>2009-10-15T15:24:00Z</published><updated>2009-10-15T15:24:00Z</updated><content type="html">&lt;a class="reference external image-reference" href="http://git-scm.com/"&gt;&lt;img alt="Git logo" class="right-float" src="http://www.georgevreilly.com/blog/content/binary/gitlogo.png" /&gt;&lt;/a&gt;
&lt;p&gt;In the last few weeks, I've switched over to &lt;a class="reference external" href="http://git-scm.com/"&gt;Git&lt;/a&gt; for most of my version-control needs,
at home and at work, after putting it on the long finger for months.&lt;/p&gt;
&lt;p&gt;We continue to use &lt;a class="reference external" href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; at work,
but I've recently followed Pavel and Eric's lead in using &lt;a class="reference external" href="http://andy.delcambre.com/2008/03/04/git-svn-workflow.html"&gt;git-svn&lt;/a&gt;.
I work locally on my own private branches and
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;git&lt;/span&gt; &lt;span class="pre"&gt;svn&lt;/span&gt; &lt;span class="pre"&gt;dcommit&lt;/span&gt;&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;git&lt;/span&gt; &lt;span class="pre"&gt;svn&lt;/span&gt; &lt;span class="pre"&gt;rebase&lt;/span&gt;&lt;/tt&gt; occasionally.
I'm primarily on Windows at work, but I have a Linux box and a Mac Mini too,
while at home, I have a MacBook, a Linux netbook, and a Vista desktop.
I'm using &lt;a class="reference external" href="http://code.google.com/p/msysgit/"&gt;msysGit&lt;/a&gt;, occasionally supplemented by &lt;a class="reference external" href="http://code.google.com/p/tortoisegit/"&gt;TortoiseGit&lt;/a&gt; and &lt;a class="reference external" href="http://sourceforge.net/projects/qgit/files/"&gt;QGit&lt;/a&gt;.
Pavel's on a Mac and Eric's mostly on Ubuntu, so git adoption was easy for them.&lt;/p&gt;
&lt;p&gt;When I first tried git-svn under msysGit about a year ago,
it didn't work worth a damn.
Git-svn works fine now, but it's slow compared to the *nix implementation.
The developers say that's due to the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;fork()&lt;/span&gt;&lt;/tt&gt; emulation
of the MSys/Cygwin layer.
The rest of msysGit is much faster.&lt;/p&gt;
&lt;p&gt;For my home needs, I've had private Subversion repositories at
&lt;a class="reference external" href="http://devjavu.com"&gt;DevjaVu.com&lt;/a&gt; and &lt;a class="reference external" href="http://opensvn.csie.org"&gt;OpenSvn.csie.org&lt;/a&gt;.
DevjaVu has gone out of business and OpenSvn has been unavailable too often for my liking.
It was time to find some new hosting.&lt;/p&gt;
&lt;p&gt;I've experimented with private Git repositories at
&lt;a class="reference external" href="http://www.github.com/"&gt;GitHub&lt;/a&gt; and &lt;a class="reference external" href="http://www.projectlocker.com/"&gt;ProjectLocker&lt;/a&gt;.
GitHub is &lt;em&gt;very&lt;/em&gt; nice, but charges for private repositories.
ProjectLocker provides free private repositories,
but is comparatively clunky.&lt;/p&gt;
&lt;p&gt;ProjectLocker lets you set up a fresh repository on their server.
They tell you how to clone from that, which is great for a new repository.
But they don't tell you how to hook it up to an existing local repository.
Since I had some difficulty in figuring it out, here's the recipe:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
git remote add origin git-foobar&amp;#64;freeN.projectlocker.com:foobar.git
git pull origin master
... merge, local edits and commits ...
git push origin master
&lt;/pre&gt;
&lt;p&gt;I found &lt;a class="reference external" href="http://rudifa.wordpress.com/2009/05/19/git-xcode-and-projectlocker/"&gt;Git, Xcode and ProjectLocker&lt;/a&gt; and &lt;a class="reference external" href="http://www.cforcoding.com/2009/09/windows-git-tutorial-cygwin-ssh-and.html"&gt;Cygwin, SSH and ProjectLocker&lt;/a&gt;
useful in figuring this out.&lt;/p&gt;
&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7230696" width="1" height="1"&gt;</content><author><name>george_v_reilly</name><uri>http://weblogs.asp.net/members/george_5F00_v_5F00_reilly.aspx</uri></author><category term="General Software Development" scheme="http://weblogs.asp.net/george_v_reilly/archive/tags/General+Software+Development/default.aspx" /><category term="git" scheme="http://weblogs.asp.net/george_v_reilly/archive/tags/git/default.aspx" /></entry><entry><title>Launching 32-bit applications from batchfiles on Win64</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/george_v_reilly/archive/2009/09/11/launching-32-bit-applications-from-batchfiles-on-win64.aspx" /><id>http://weblogs.asp.net/george_v_reilly/archive/2009/09/11/launching-32-bit-applications-from-batchfiles-on-win64.aspx</id><published>2009-09-12T06:16:00Z</published><updated>2009-09-12T06:16:00Z</updated><content type="html">&lt;img alt="Win64" class="right-float" src="http://www.georgevreilly.com/blog/content/binary/win64-biticon.gif" /&gt;
&lt;p&gt;I've been running the &lt;a class="reference external" href="http://www.georgevreilly.com/blog/2009/06/20/WhenVideoCardsGoBad.aspx"&gt;64-bit version of Windows 7 RC&lt;/a&gt; since June.
It's been quite painless on the whole.&lt;/p&gt;
&lt;p&gt;One wrinkle that I ran into was with some batchfiles which
launch applications in &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;%ProgramFiles%&lt;/span&gt;&lt;/tt&gt; (normally &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;C:\Program&amp;nbsp;Files&lt;/span&gt;&lt;/tt&gt;).
Due to the magic &lt;a class="reference external" href="http://blogs.msdn.com/craigmcmurtry/archive/2004/12/14/301155.aspx"&gt;WOW64 redirector&lt;/a&gt;, 32-bit applications
are actually installed into &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;%ProgramFiles(x86)%&lt;/span&gt;&lt;/tt&gt;—normally &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;C:\Program&amp;nbsp;Files&amp;nbsp;(x86)&lt;/span&gt;&lt;/tt&gt;—instead of &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;%ProgramFiles%&lt;/span&gt;&lt;/tt&gt;.
This is transparent to the 32-bit applications,
which think they're running in &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;%ProgramFiles%&lt;/span&gt;&lt;/tt&gt; (&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;C:\Program&amp;nbsp;Files&lt;/span&gt;&lt;/tt&gt;).&lt;/p&gt;
&lt;p&gt;However, the cmd.exe shell is 64-bit
(unless you make a special effort to run the 32-bit cmd.exe in SysWOW64),
so batchfiles see the 64-bit &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;%ProgramFiles%&lt;/span&gt;&lt;/tt&gt; which contains 64-bit applications.&lt;/p&gt;
&lt;p&gt;Hence, a batchfile that launches an installed 32-bit application on Win64
must use &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;%ProgramFiles(x86)%&lt;/span&gt;&lt;/tt&gt;, not &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;%ProgramFiles%&lt;/span&gt;&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;It sounds trivial to have a batchfile detect
which flavor of &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;%ProgramFiles%&lt;/span&gt;&lt;/tt&gt; it should use,
but the parentheses in the environment variable name make it &lt;a class="reference external" href="http://marsbox.com/blog/howtos/batch-file-programfiles-x86-parenthesis-anomaly/"&gt;tricky&lt;/a&gt; to parse.
On earlier versions of Win64, the environment variable was called &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;%ProgramFilesx86%&lt;/span&gt;&lt;/tt&gt;.
Presumably they added the strange parentheses into the variable name
because the directory name always included them.&lt;/p&gt;
&lt;p&gt;Here's a tiny batchfile that will launch the 32-bit &lt;a class="reference external" href="http://www.sourcegear.com/diffmerge/"&gt;DiffMerge&lt;/a&gt;
correctly on both Win64 and Win32 platforms.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;@&lt;span style="color: #008000; font-weight: bold"&gt;setlocal&lt;/span&gt;
@&lt;span style="color: #008000; font-weight: bold"&gt;set&lt;/span&gt; &lt;span style="color: #19177C"&gt;_pf&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;&lt;span style="color: #19177C"&gt;%ProgramFiles%&lt;/span&gt;
@&lt;span style="color: #008000; font-weight: bold"&gt;if&lt;/span&gt; not &lt;span style="color: #BA2121"&gt;&amp;quot;[%ProgramFiles(x86)%]&amp;quot;&lt;/span&gt;&lt;span style="color: #666666"&gt;==&lt;/span&gt;&lt;span style="color: #BA2121"&gt;&amp;quot;[]&amp;quot;&lt;/span&gt; &lt;span style="color: #008000; font-weight: bold"&gt;set&lt;/span&gt; &lt;span style="color: #19177C"&gt;_pf&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;&lt;span style="color: #19177C"&gt;%ProgramFiles&lt;/span&gt;(x&lt;span style="color: #666666"&gt;86&lt;/span&gt;)%
@start &lt;span style="color: #BA2121"&gt;&amp;quot;&amp;quot;&lt;/span&gt; /b &lt;span style="color: #BA2121"&gt;&amp;quot;%_pf%\SourceGear\DiffMerge\DiffMerge.exe&amp;quot;&lt;/span&gt; %*
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I long ago found that the safest way to test environment variables
whose values may include spaces, is to surround them with
both double quotes and square brackets.&lt;/p&gt;
&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7201960" width="1" height="1"&gt;</content><author><name>george_v_reilly</name><uri>http://weblogs.asp.net/members/george_5F00_v_5F00_reilly.aspx</uri></author><category term="Win64" scheme="http://weblogs.asp.net/george_v_reilly/archive/tags/Win64/default.aspx" /></entry><entry><title>Recovering photos from a corrupted card</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/george_v_reilly/archive/2009/09/05/recovering-photos-from-a-corrupted-card.aspx" /><id>http://weblogs.asp.net/george_v_reilly/archive/2009/09/05/recovering-photos-from-a-corrupted-card.aspx</id><published>2009-09-05T07:45:00Z</published><updated>2009-09-05T07:45:00Z</updated><content type="html">&lt;a class="reference external image-reference" href="http://www.z-a-recovery.com/info_zar32.htm"&gt;&lt;img alt="ZAR: Zero Assumption Recovery" class="right-float" src="http://www.z-a-recovery.com/images/logo.gif" /&gt;&lt;/a&gt;
&lt;p&gt;I had about 60 apparently corrupted photos on a CompactFlash card the other evening.
It might have been due to Lightroom going berserk,
but it was more likely from my pulling the card reader out of the computer
without ejecting it first.&lt;/p&gt;
&lt;p&gt;The photos wouldn't show up under Mac, Linux, or Windows.
I tried to &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;chkdsk&lt;/span&gt;&lt;/tt&gt; the card under Windows, which complained about a “raw” disk.
That led me to &lt;a class="reference external" href="http://www.z-a-recovery.com/info_zar32.htm"&gt;ZAR&lt;/a&gt;, the Zero Assumption Recovery toolkit.
The evaluation copy retrieved the photos very nicely.
Whew!&lt;/p&gt;
&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7192822" width="1" height="1"&gt;</content><author><name>george_v_reilly</name><uri>http://weblogs.asp.net/members/george_5F00_v_5F00_reilly.aspx</uri></author><category term="Software" scheme="http://weblogs.asp.net/george_v_reilly/archive/tags/Software/default.aspx" /></entry><entry><title>XKCD's Tech Support Cheat Sheet</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/george_v_reilly/archive/2009/08/24/xkcd-s-tech-support-cheat-sheet.aspx" /><id>http://weblogs.asp.net/george_v_reilly/archive/2009/08/24/xkcd-s-tech-support-cheat-sheet.aspx</id><published>2009-08-25T06:57:00Z</published><updated>2009-08-25T06:57:00Z</updated><content type="html">&lt;a class="reference external image-reference" href="http://xkcd.com/627/"&gt;&lt;img alt="XKCD's Tech Support Cheat Sheet" src="http://imgs.xkcd.com/comics/tech_support_cheat_sheet.png" /&gt;&lt;/a&gt;
&lt;p&gt;To my tech supportees:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://xkcd.com/627/"&gt;XKCD's Tech Support Cheat Sheet&lt;/a&gt; nails it!
This is essentially what I'm doing when I sit down
at your computer and dig you out of your latest hole.&lt;/p&gt;
&lt;p&gt;If only you'd make some more intelligent guesses for yourself,
you might be able to solve more of your problems.&lt;/p&gt;
&lt;p&gt;But it's not quite that simple.&lt;/p&gt;
&lt;p&gt;You probably don't understand very much about what you're doing.
I have enormous depth and breadth of experience which informs my investigation.
I am—no false modesty here—a master of debugging.
The extra context helps me hone in on a solution more often than not.&lt;/p&gt;
&lt;p&gt;Still, do give the flowchart a shot.
Being able to solve your own problems is very empowering.&lt;/p&gt;
&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7180781" width="1" height="1"&gt;</content><author><name>george_v_reilly</name><uri>http://weblogs.asp.net/members/george_5F00_v_5F00_reilly.aspx</uri></author><category term="Tech Support" scheme="http://weblogs.asp.net/george_v_reilly/archive/tags/Tech+Support/default.aspx" /></entry><entry><title>Moving Photos in Lightroom</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/george_v_reilly/archive/2009/08/17/moving-photos-in-lightroom.aspx" /><id>http://weblogs.asp.net/george_v_reilly/archive/2009/08/17/moving-photos-in-lightroom.aspx</id><published>2009-08-18T05:42:00Z</published><updated>2009-08-18T05:42:00Z</updated><content type="html">&lt;a class="reference external image-reference" href="http://www.peachpit.com/guides/content.aspx?g=lightroom&amp;amp;seqNum=168"&gt;&lt;img alt="Moving Photos in Lightroom" src="http://ptgmedia.pearsoncmg.com/images/irf_guide_photoshop_lightroom/elementLinks/082908fig02.jpg" style="width: 500px;" /&gt;&lt;/a&gt;
&lt;p&gt;When using Lightroom before, I was never able to figure out how
to move photos from one folder to another.
You'd think that you could just click on a photo and drag it.
I just spent twenty minutes figuring out what I've been doing wrong.
After you've selected multiple photos,
click on the &lt;em&gt;photo thumbnail&lt;/em&gt; and &lt;em&gt;not&lt;/em&gt; the surrounding gray frame,
and then you can drag the photos to the target folder.&lt;/p&gt;
&lt;p&gt;I had become accustomed to clicking on the frames to multi-select photos,
so naturally I assumed that was also how you dragged a set of photos.
But clicking on a frame of a selected photo merely deselects all the other photos.&lt;/p&gt;
&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7172088" width="1" height="1"&gt;</content><author><name>george_v_reilly</name><uri>http://weblogs.asp.net/members/george_5F00_v_5F00_reilly.aspx</uri></author><category term="Lightroom" scheme="http://weblogs.asp.net/george_v_reilly/archive/tags/Lightroom/default.aspx" /></entry><entry><title>64-bit Windows 7</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/george_v_reilly/archive/2009/07/10/64-bit-windows-7.aspx" /><id>http://weblogs.asp.net/george_v_reilly/archive/2009/07/10/64-bit-windows-7.aspx</id><published>2009-07-11T06:12:00Z</published><updated>2009-07-11T06:12:00Z</updated><content type="html">&lt;a class="reference external image-reference" href="http://www.georgevreilly.com/blog/content/binary/win64-clr-jit-leak.png"&gt;&lt;img alt="Humongous JIT memory leak" class="right-float" src="http://www.georgevreilly.com/blog/content/binary/win64-clr-jit-leak.png" style="width: 400px;" /&gt;&lt;/a&gt;
&lt;p&gt;I mentioned &lt;a class="reference external" href="http://www.georgevreilly.com/blog/2009/06/20/WhenVideoCardsGoBad.aspx"&gt;three weeks ago&lt;/a&gt; that I had just repaved my work dev box
and installed the 64-bit version of the Windows&amp;nbsp;7&amp;nbsp;RC.
Nine or ten years after I first ported parts of IIS to Win64,
I am finally running my main desktop on 64-bit Windows.
With one exception, it's been painless.
Programs have just worked, devices have just worked.
There are relatively few native x64 applications,
but for the most part it doesn't matter.
The cases where it does matter—e.g., shell extensions such as &lt;a class="reference external" href="http://tortoisesvn.net/"&gt;TortoiseSVN&lt;/a&gt;—are available as 64-bit binaries.&lt;/p&gt;
&lt;p&gt;I briefly flirted with using the 64-bit build of Python,
but realized that I would have to recompile several eggs as 64-bit binaries.
That was too painful and the 32-bit binary did everything I needed.&lt;/p&gt;
&lt;p&gt;Building in Visual Studio 2005 is noticeably faster.
I'm not sure how much of it was due to accumulated cruft after 18&amp;nbsp;months on Vista,
but builds there were very slow.&lt;/p&gt;
&lt;p&gt;The one exception was a major problem for the first week and a half.
Whenever I ran our ASP.NET web application,
it would go berserk, eat up all 4GB of my physical RAM,
push the working set of IIS's w3wp.exe to &lt;em&gt;12GB&lt;/em&gt;,
and max out one of my 4&amp;nbsp;cores!
The only way to maintain any sanity was to run &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;iisreset&lt;/span&gt;&lt;/tt&gt;
every 20&amp;nbsp;minutes to gently kill the process.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://www.microsoft.com/whdc/devtools/debugging/default.mspx"&gt;WinDbg&lt;/a&gt; and &lt;a class="reference external" href="http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx"&gt;Process Explorer&lt;/a&gt; showed that the rogue thread was stuck in a loop in
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;mscorjit!LifetimesListInteriorBlocksHelperIterative&amp;lt;GCInfoLiveRecordManipulator&amp;gt;&lt;/span&gt;&lt;/tt&gt;.
I passed a minidump on to my former colleagues in IIS, who sent it to the CLR team.
They said:&lt;/p&gt;
&lt;blockquote&gt;
The only thing I can tell is that it is Regex,
and some regex expression compiled down to a method with 456KB of IL.
That is &lt;em&gt;huge&lt;/em&gt;, and yes 12GB of RAM consumed for something like that is expected.&lt;/blockquote&gt;
&lt;p&gt;With that clue, I was able to track down the problem,
a particularly foul regex, built from a 10KB string, with 32&amp;nbsp;alternating expressions,
each of which contains dozens of alternated subexpressions.
The string is built from many smaller strings,
so it's not obvious in the source just how ugly it is.
I commented out the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;new&lt;/span&gt; &lt;span class="pre"&gt;Regex()&lt;/span&gt;&lt;/tt&gt; and my problems went away.&lt;/p&gt;
&lt;p&gt;Regardless of how ugly the regex is, this is a major regression in the CLR.
This code has been working without blatant problems for two years
on the 32-bit flavors of XP, Server&amp;nbsp;2003, Vista, and Server&amp;nbsp;2008.
I've been meaning to try this code on 32-bit Windows&amp;nbsp;7,
but have been too busy.&lt;/p&gt;
&lt;p&gt;(The original, long-gone author was apparently aware that the regex
is expensive to create because he runs a background thread to &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;new&lt;/span&gt;&lt;/tt&gt; the regex,
which should have told him something.
We'll fix the code that uses the regex to do something saner, soon.)&lt;/p&gt;
&lt;p&gt;All that aside, I've been happy with the 64-bit version of Windows&amp;nbsp;7.&lt;/p&gt;
&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7145323" width="1" height="1"&gt;</content><author><name>george_v_reilly</name><uri>http://weblogs.asp.net/members/george_5F00_v_5F00_reilly.aspx</uri></author><category term="Win64" scheme="http://weblogs.asp.net/george_v_reilly/archive/tags/Win64/default.aspx" /><category term="Windows 7" scheme="http://weblogs.asp.net/george_v_reilly/archive/tags/Windows+7/default.aspx" /><category term="CLR" scheme="http://weblogs.asp.net/george_v_reilly/archive/tags/CLR/default.aspx" /></entry></feed>