Archive for the 'Uncategorized' Category



So after trying to flex Git to use a huge software base, I’ve moved to Mercurial and am finding it really wonderful.

First off, windows integration is especially beautiful. You don’t need an extra shell, you don’t need Cygwin, you don’t need OpenSSH. It’s just a great experience in Windows. I’m also using TortoiseHg. TortoiseHg seems to be a better experience than TortoiseGit and they’ve paid closer attention to the collective dismissal of windows on pressing OK, an annoyance to me with TG.

Furthermore, UTF-16 files seem to be supported out of the box (probably because Hg’s written in Python). A project that I frustratingly tried to commit to a Git repo was a breeze with Mercurial due to the UTF-16 support. The way that Visual Studio saves files, you can’t be certain that UTF-16 won’t be the file format, but that is a non-issue for Mercurial, which eats ’em up with out a blink.

Lastly, support for massive code bases is a big win at my company where our source repo is upwards of multiple Gigs. Git’s premise that the Linux Kernel source is “huge” is utterly laughable. Mercurial swallowed up our code quickly and didn’t have any issues diffing changes and I didn’t have to go figure out creating sub-repositories to get better performance. This singular feature is HUGE to me.


Git Submodules

I have been wanting to learn more about Git Submodules and how they work, so I watched the screen cast at the bottom of (would have embedded it, but there were issues doing so). The bottom line is that the Super module contains a reference to a specific version of a Sub module. Git’s submodule command can then determine if you have a different version of the Sub than you should, it can fetch the current version, etc.

The process sort of goes like this, using C1 for Computer 1 and C2 for Computer 2:

  1. C1: change Submodule
  2. C1: commit Super module, freezing version of Sub used by Super
  3. C1: push Super module
  4. C2: pull Super module, gets the updated Sub module version SHA
  5. C2: submodule update, gets the updated Sub code corresponding to the version in #4.

Some observations:

  • Will a user ever do 4 and NOT do 5? Why?
  • If 4 and 5 are tied together, why is that not one step (ala git push = git fetch; git merge origin/master)?
  • C2 has no idea to update the Sub code unless they are carefully watching the pull output or run git submodule status directly after 4 above to know that a Sub update is needed
  • Possible source of issues if C2 has Version x+1 of Super but only version x of Sub

Now, I’m new to Git, but it would seem to me that one could write a hook that would automatically run git submodule update if .gitmodules is present in the directory. It would seem that an appropriate hook to git pull would be to add git submodule update after the pull. Am I missing something here?

I understand that git’s submodule support has been added-on as submodules were not something in the design of Git. I wonder if the lack of these hooks and a better user experience is the direct side effect of that bolt-on?

Mercurial seems to be trying to do this via it’s subrepos support:

Whenever newer Mercurial versions encounter this .hgsubstate file when updating your working directory, they’ll attempt to pull the specified subrepos and update them to the appropriate state.

Enough to make me switch? Not if I can write a hook.


Git on Windows

I’ve been trying to figure out how I might work with a DVCS with a huge code base, hundreds of developers and providing builds to people in a CI way. Git has my full attention at the moment, (Mercurial’s nice too, especially after reading about branching strategies and how universal it is); but there’s significant issues using it on Windows, mostly because Windows isn’t a POSIX system.

I had a small adventure trying to get OpenSSH setup on my windows machine through Cygwin and it was a mess, didn’t work and just overall felt clumsy. Next I tried serving through http, but still not what I’m looking for because in the end, a co-developer needs to push changes to me and Git requires SSH for that.

I also tried using a git-configured Virtual Appliance for VMWare. It wasn’t so much a pain, but slow across the network. I’m no VMWare guru, so I’m sure there’s certain things I could do to boost performance, but I didn’t know them. Furthermore, the SSH keys produced from Cygwin didn’t seem compatible with those produced by the appliance. In the end, I had to generate the keys on the appliance, scp them back to my windows machine and then use them as my local keys. Ugh… that won’t work for a massive audience unless I created a web service that gen’d keys and handed them to you over the connection (dangerous? risky?). Still a kludge.

Finally, after reading further documentation, I learned that I could merely use UNC file paths with Git instead of using a hosting server. Sure,  a hosting server is nice because through Gitosis, I can very easily add new repositories, expose them through a web interface, give the public access, etc. But using UNC paths allows me to do things more windows-eque. I can set user permissions in ActiveDirectory and create repository shares in a central location with global read access (allowing pulls and clones for anyone) and give group-based permissions to users for writing (pushes, merges, etc). Not bad.

I’m sure it would also be easy to configure gitweb to use UNC paths or mounted drives so that I can have that lovely web interface as well, or write my own.

Now I just have to experiment with very, very large code bases, figure out how to package a build, and make it generally very, very easy for people to pull and push.



I literally sighed when I read this about REXML, the XML parser for Ruby:

Some of the common differences are that the Ruby API relies on block enumerations, rather than iterators. For example, the Java code:

for (Enumeration e=parent.getChildren(); e.hasMoreElements(); ) {
  Element child = (Element)e.nextElement(); // Do something with child

In Ruby beccomes

parent.each_child{ |child| # Do something with child }

Twitter is like Radio, Only Different

It’s easy to understand if you put it in your context. In Radio, you have air time, callers phoning up to give you feedback and your real-time response to that feedback during the show. People can tune in to the show if they want to hear what you’re talking about. You’re constrained by the air time of your show, that is, you can only say what you can say within that time span and the rest will have to wait for the next opportunity, which is the next show. Your show consists of your own discretionary content that you wish to share with Radioland. You could choose to talk about exercise, food, sports, politics, what you’re wearing, whatever you want, it’s your show. You talk into a mic and the magic of radio brings it to the folks like me in their vehicles.

Twitter can be thought of in much the same fashion:

  • Instead of being constrained by air time, you’re constrained by characters typed, specifically 140 of them. Each 140-character-or-less chunk of text is called a “tweet”, whereas each timespan of radio is called a “show”.
  • The content is purely discretionary. I can choose to tweet about anything from what I’m wearing to my general mood to writing recipes and helping Iran’s democracy.
  • People can “tune in” by “following me”, which is to say they can receive my tweets specifically (sort of like email, but in mostly-real-time). With Radio, you can tune in to one show at a time, but with Twitter you can “tune in” to many “shows” at the same time. They get shuffled together in real time and you can read the stream of information at your own pace.
  • While in Radio you have callers giving you feedback, with Twitter, your followers (or random Twitter users) can respond to something you wrote through a “referral”. Suppose you tweeted “Man, I hate traffic on the belt line at 8am!”, I could respond to you with “@mitchhenck yeah, traffic’s a real pain! But if you get off at Park, it’s clear sailing to the square!”. “@mitchhenck” can be read as “AT Mitch Henck”, that is to say, “this tweet’s for you!” (sorta like this bud’s for you, only without the unappealing weight gain).
  • Anyone following you can see it. Just like in radio, anyone listening can hear the callers-in (except the ones filtered out by your staff, of course). Which leads to the next idea, direct messages, like if your wife called into the show to tell you not to forget to pick up that extra strong toilet plunger at Walgreens on the way home, which you wouldn’t want all your listeners to hear about 😉
  • People can re-broadcast your show by taping it and playing it for their friends at Sunday brunch, but with Twitter, you’d rebroadcast a tweet using “RT”, as in “RT @mitchhenck Can’t believe wife needs the extra strong toilet plunger today of all days! What did the kids get into this time?” Sometimes adding their own comment: “ROFL RT @mitchhenck found out it was a drown python of all things! How’d the kids get a python!? How’d it get in the toilet!??” Twitter being constrained by characters, I’d choose to say “ROFL” instead of “Rolling on the floor laughing”, which of course, I’m not really doing, but expressing an idea, you see.
  • Twitter makes it possible to share audio, video and pictures with your followers and the general internet just like Radio… er, sorta like Radio. With radio you’d tell your listeners to call in and submit your address so you could send out an autographed picture of you at the grill roasting eggplants, rather than a little post from DestroyTwitter.
  • With Radio, you, well, have a radio tuner to listen with. With Twitter, you have many choices to view with. Primarily, you can view tweets through a web browser (like Internet Explorer, Firefox or Safari). But the real deal are the stand alone clients for mobile and desktop computers. They make ’em for iPhone, Blackberry, Mac, PC, Linux and even Typewriters. With clients, you are free to follow both users and topics (#icereamr00lz), along with loads of other options per client.

Twitter becomes interesting through the use of what’s known as a “hashtag” which is a keyword prefixed by the “#” symbol, like “#stupidteentricks” or “#golf” or “#whyarealiensgoingthroughmygarbage”. People stick these in a tweet to provide search context. Suppose I’m really into aliens getting into people’s garbage. I could use twitter search to find “#whyarealiensgoingthroughmygarbage” and it would provide me real-time search results of that keyword. I could then “follow” this live search result to know about anyone ever having problems with aliens in their garbage. Then I could tweet them and make friends, starting community. “@roswelln00b geez aliens in the gar’ge again? wtf? wanna come over for a bbq 2nite?” This kinda thing can never happen with radio because people don’t know who else is listening. Twitter’s great while watching a sporting event (#superbowlXX), an important announcement (#CaronWedding2009) or while watching TV (#loveboat).

The whole naming convention comes from the birds. Birds are out there 24-7 just chirping away, tweet tweet tweet. They chirp here. They chirp there. But it’s all out in the open and any bird can hear it. To listen to the whole thing all at once is pretty confusing. But to certain birds, paying attention to certain other birds, certain tweets make sense. That’s how Twitter works. All these people blasting 140-character bits of thought out into the internet for whomever cares to read, some paying attention to others more carefully. That’s why Lance Armstrong can find a stolen bike within days.

Here’s hoping for the social network of the future, “YouTwitFace” (thanks Conan!).


Apple treating developers like sheep?

Ok, so I wasn’t there. But like most apple fans–isn’t that the most interesting phenomena? that we are “fans” of a corporation? anyway–I watched the liveblog while it happened. I ooed and aahed about the slick new updates to the best operating system out there, and lusted after a new iPhone with a compass and a video camera. I had my laughs when they poked fun at Microsoft. It was a nice time.

Today, I’m watching the keynote for the OS X update closer. I’ve got my popcorn and easy chair, only the popcorn is my lunch and the easy chair is my ergonomic desk chair. I’ve got my joy on, but I’ve got some gripes too.

This is a developer conference, right? That means it’s geared towards tech folk, right? So why does Bertrand assert that one of Windows’ downfalls is DLLs? Os X has the same thing, only they’re “.so” files, or Shared Object files. It’s the same with Linux. The thing about DLLs, a thing fading into history since the GAC entered the scene with .NET, is the registry. THAT is the problem, not that windows has DLLs. Come on, Bertrand, you know this.

It’s really the fact that he calls DLLs “the same old technology” which bothers me. If we’re going to talk about “the same old technology”, let’s put Xcode on the table, shall we? No? Ok, I didn’t think you wanted to go there either, Bertrand. So let’s take off the brass knuckles and play nice.

Let’s talk about Disk Defragmentation. Mac users still experience disk fragmentation. I have, certainly. No, it’s not as bad because Apple’s installer does some disk optimization, but the problem is still there. That’s why Coriolis Systems can make money selling iDefrag (which is awesome b.t.w.). I agree with you, Bert–you don’t mind if I call you Bert, do you?–the user shouldn’t have to know about disk fragmentation, but it’s still a problem and until OS X builds a better filesystem that defrags while-u-wait, we’re all stuck. So don’t go pointing fingers here either, or they’ll get slapped. Naughty, naughty.

Everyone’s favorite, User Account Control, came up too. Bert, Bert, Bert. In Vista, yes, UAC was horribly implemented, coercing many to turn it off completely, including me. It behaved like a nagging back seat driver, always asking if you really know where you’re going. Sheesh, it sucked! But hey, everyone learns lessons and in Windows 7, UAC is so much more out of your way. It’s much more like when OS X asks you to authenticate before you do something potentially harmful, like do a software update, or alter some system settings. It’s a lock down, just like yours.

And it’s funny to me, that you say at the end of just a few rants, “…so that’s Windows 7. Same old technology.” Bert, just know that moonlighting as a lawyer will never work out for you, mmm kay? Keep your cushy job at Apple, further innovating the greatest OS out there–really, I believe that as a proud mac user–but. I mean, come on, there’s so much more to Windows 7 than what you listed. This is a technical conference, Bert, so be technical! Don’t just feed us some koolaid and think we’re dumb sheep, that’s disrespectful.

Thanks for listening.


Visual Studio 2010 Adventure

So I chose to give VS 2010 a spin today, creating a C++/CLI win form library. It’s a simple OpenGL container for using in other forms.

In attempting to create the form, I tried to hit [Ctrl]-[Space] to get a completion on System::Windows::Forms::Nat (native window), but was met with this little message in the status window:


How’s that for acknowledgement, eh? Come on, Microsoft, give us C++ guys something to play with. IntelliSense was supposed to be improved for native development, so what’s this?

There’s also funny behavior with the mouse cursor in the edit window, as in, I can’t see the cursor when I’m merely moving the mouse! If I click somewhere in the screen, it shows up, but upon movement it disappears again. Really annoying bug. Can haz update?

Twitter Updates