Scott Hanselman

Hanselminutes Podcast 108 - Exploring Distributed Source Control with Git

April 16, '08 Comments [18] Posted in Podcast
Sponsored By

git-logo My one-hundred-and-eighth podcast is up. In this episode I sit down with Robby, Gary and Andy from Planet Argon, a local Rails shop in Portland, OR, and talk about their experience as they move from Subversion to Git for their source control.

Links from the Show

Subscribe: Subscribe to Hanselminutes Subscribe to my Podcast in iTunes

If you have trouble downloading, or your download is slow, do try the torrent with µtorrent or another BitTorrent Downloader.

Do also remember the complete archives are always up and they have PDF Transcripts, a little known feature that show up a few weeks after each show.

Telerik is our sponsor for this show.

Check out their UI Suite of controls for ASP.NET. It's very hardcore stuff. One of the things I appreciate about Telerik is their commitment to completeness. For example, they have a page about their Right-to-Left support while some vendors have zero support, or don't bother testing. They also are committed to XHTML compliance and publish their roadmap. It's nice when your controls vendor is very transparent.

As I've said before this show comes to you with the audio expertise and stewardship of Carl Franklin. The name comes from Travis Illig, but the goal of the show is simple. Avoid wasting the listener's time. (and make the commute less boring)

Enjoy. Who knows what'll happen in the next show?

Technorati Tags:

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by SherWeb

Putting ASP.NET Dynamic Data into Context

April 11, '08 Comments [25] Posted in ASP.NET | ASP.NET Dynamic Data
Sponsored By

There's a lot of folks excited about ASP.NET MVC as an option for creating ASP.NET websites. As I say in my ASP.NET MVC talks, however, I figure about 5% of people creating ASP.NET sites will care about ASP.NET MVC. I say that for a number of reasons. ASP.NET MVC is a big paradigm shift. It enables the developer to make a more testable site, to have absolute control over their markup, and to separate concerns in order to keep their code DRY (don't repeat yourself). However, MVC is not yet the ideal solution, in my opinion, for really data- and forms-heavy sites. Creating an data grid with editing in place with sorting, movable columns and all that coolness is hard in MVC as someone needs to manage all that state for you and there's some underlying infrastructure that's not there.

So, What about the other 95% of developers? Certainly WebForms isn't going away, and it is a proven solution for line of business apps. Personally, I'll probably use some kind of hybrid as I have in the past at other jobs. DasBlog doesn't use MVC (yet) but it's templating system is MVC-like and it lives side-by-side with WebForms. Basically, there's a lot of WebForms developers out there just trying to get data up into a Grid or Edit view and also keep it DRY.

You'll probably stumble onto information around ASP.NET Dynamic in your wanderings and I wanted to give you some information to put Dynamic Data's pending release into ASP.NET's larger context.

What is ASP.NET Dynamic Data?

Here's the Preview Drop of Dynamic Data for download. It'll be released later this year in a future Service Pack for .NET Framework 3.5. This is a pre-release build that's updated since the relatively quiet preview release last December.

Fundamentally, Dynamic data is new controls for DetailsView, FormView, GridView, or ListView controls along with a lot of meta-infrastructure classes to make it possible. The design uses convention over configuration in a number of places, and this marks, IMHO, the recognition of a simpler way to do things.

If you can point at one thing in Dynamic Data and say, "that's it!",  it'd be DynamicControl. it's a control that takes metadata from your Database model (LINQ to SQL or LINQ to Entities in v1, other POCOs (Plain Old CLR Objects) or ORM's possibly in v.Next) and selects from a FieldTemplateUserControl.

Stated differently, if you've got a field in a dozen places that should show Phone Numbers, you probably want a Textbox, some validators, maybe a MaskedEditControl, or perhaps some 3rd party controls. You think about it as a Phone Number. if you decide to change that control, you want to change it for the whole application. You want to keep it DRY (Don't Repeat Yourself). Currently, unless you had the discipline to create a PhoneNumberUserControl, you'd have to do "monkey work" and go find all the instances of that field and keep them up to date. You'll be repeating yourself all over with data that should exist in one place, like the length of the field in the database, gets copied into possibly dozens of places, validators, controls, etc.

Here's a comment that my friend Peter Blum left on ScottGu's Blog. It actually was Peter, not the Product Team, who helped me "grok" Dynamic Data a few weeks ago. We spent a few hours on the phone talking and it finally popped for me.

I have been working with Dynamic Data for over a month and am very excited about it. I wanted promote an aspect of Dynamic Data that will be used in many other situations than the application Scott showed.

Dynamic Data introduces a new web control called DynamicControl. It can be used in FormView and ListView controls to provide a UI based on database-level schema. When using GridView and DetailsView, you add a DynamicField, which is a replacement for the BoundField that internally has a DynamicControl. (Thus has all of the features of a DynamicControl.)

This results in your Grids and data entry forms being built around tables and columns of your database with whatever smart data entry controls you like, such as the AJAX Control Toolkit's MaskedTextBoxExtender on a textbox or your favorite third party controls. The database schema also determines the validators for this column. That avoids errors implementing the right validators or updating them when the database schema is modified. (No more "how do I validate a BoundField?" issues!)

To me, Dynamic Data is a major step forward in developing data entry oriented web applications for ASP.NET.

imageOne of the demo's that is often shown is Dynamic Data's "scaffolding" feature. Basically, you point the wizard at a database and "poof" you've got a nice DataGrid Admin-like site. However, to dismiss it as a scaffolding tool is just the mistake I made when I first saw it.

How does it work?

There's a LOT of cool plumbing to Dynamic Data and I'll try to work with the team to get a podcast or two done and some articles explaining the deep how. Here's the basic how.

You can make a new Dynamic Data Website and it looks pretty much the same as any other site, because it is. It's a WebForms site just like any others, except for a new folder, called DynamicData. That folder has a web.config of its own to block access. This is the convention. Let's open it up.

image 

Let's say I want some serious customization. Let's so that the page for the Products table should be TOTALLY custom, but just the ListDetails page. I'll put that under /CustomPages. Let's say I want to use a Telerik control for DateTimes, Integers, and TextAreas, but just some of them.

 image

Nothing HAS to look the way it comes by default. Everything is customizable. If I want grid paging to look like whatever i want, I change the GridViewPager.ascx. You can customize at the Table, Column and DataType level.

I can put "hints" on a metadata-specific class like this:

[Range(0, 100)]
[UIHint("IntegerTelerik")]
public object UnitsOnOrder { get; set; }

That UIHint will be used later when I hook up a DynamicControl. As soon as DynamicData sees I'm bound to the UnitsOnOrder column, it'll automatically find IntegerTelerick_Edit - based on the naming and location convention - when it needs to show the "Edit" state. I can set it on a pull column basis, and then I can change it everywhere from one place.

Here's what that ASCX looks like in code:

<%@ Control Language="C#" Inherits="System.Web.DynamicData.FieldTemplateUserControl" %>
<%@ Import Namespace="System.Collections.Generic" %>
<%@ Import Namespace="System.Linq" %>
<%@ Register assembly="Telerik.Web.UI" namespace="Telerik.Web.UI" tagprefix="telerik" %>

<script runat="server">

protected void Page_Load(object sender, EventArgs e) {
var metadata = MetadataAttributes.OfType<System.ComponentModel.DataAnnotations.RangeAttribute>().FirstOrDefault();
if (metadata != null) {
RadSlider1.MinimumValue = (int)metadata.Minimum;
RadSlider1.MaximumValue = (int)metadata.Maximum;
}

}

protected override void ExtractValues(IOrderedDictionary dictionary) {
dictionary[Column.Name] = ConvertEditedValue(RadSlider1.Value.ToString());
}

</script>

<telerik:RadSlider ID="RadSlider1" runat="server" Value="<%# (short)FieldValue %>" />

See how it's generic (by that I mean non-specific, not CLR Generic)?  I've replaced the Textbox that is usually used for an Integer and am using a Telerik Slider. The [Range] attribute can be pulled off and popped into this instance of the control.

Here it is at runtime, next to some other Integer columns:

image

Now, I get to think about selecting the correct DataType via UIHint rather than using the ASCX directly. It makes the control really reusable within the context of data binding and keeps me from repeating myself.

I can add Validation Controls to a data type, so the Validation exists in one place, rather than repeated all over. For example, if you wanted to swap out validation for one, or all, your controls, to use Peter's Validation and More (which rocks, by the way, we bought a site license at my last job) than you'd do it once per data type.

This is just one VERY simple example, but it's, I think, I pretty good one. Thanks to Scott Hunter for helping me out with this as well as my talk at Devscovery last week. There are some good Dynamic Data samples he's done that you can download and check out. One includes a "before and after" application that shows how an address book would be coded using the new DynamicControl and the older way (using BoundControl).

An even cooler (and advanced) example is one where Scott Hunter wants to pull an funky binary encoded image out of an old database. He makes a custom control that handles a custom data type called "DbImage" and completely encapsulates the display of that column. From the point of view of the GridView, it's just a DynamicControl that shows itself as an <img> tag. 

Sheesh, ASP.NET is changing too fast, this is too much to absorb

This is a big deal to me because it's going to make a subset of my work easier. If I've got a database and I don't mind using LINQ to SQL or LINQ to Entities (for now), I'll be able to create CRUD (Create, Read, Update, Delete) websites WAY faster.

Projects with Dynamic Data will be more customizable than those "typical Microsoft demos" where someone drags a DataSource and GridView over to the Design Surface, shows you a list of Products from Northwind then waits for applause. ;)

Why is this NOT a big deal? Everything you are used to still works as before. This is additive and simple if you just want to avoid repeating yourself.

Why is it on Code Gallery?

You might notice that this pre-release drop is on MSDN Code Gallery, that's a temporary thing to get your feedback. It'll eventually find a home on http://www.asp.net as it's ultimately part of the larger ASP.NET framework.

Here's a diagram that we've used internally to decide where to put stuff. Consider this drop to be a "showcase" ;) as it'll only be up for a little while. If you have issues, bugs, opinions on Dynamic Data, go put them in the Issue Tracker as the team is watching closely!

clip_image001

Note: This Dynamic Data project at Code Gallery is a very temporary home for ASP.NET Dynamic Data in order to gather feedback. When ASP.NET Dynamic Data appears in an 'official' release, we will remove the release from this site and redirect you to the new 'official' release.

Should you Fear This Release?

It's a pre-release build, but it's pretty harmless. It does install a few Project Templates in VS, but it shouldn't screw up your VS install. If you are using ASP.NET MVC, be aware that this drop includes a version of the ASP.NET Routing. This will be reconciled when they all are released, but for now, be aware of your version numbers.

"This release includes the Dynamic Data runtime assemblies as well as versions of the System.Web.dll and System.Web.Extensions.dll assemblies that have been updated from the versions in the .NET Framework 3.5. The release also installs Visual Basic and C# templates that you can use in Visual Studio 2008 for creating a Dynamic Data Web site."

These updated DLLs will be GAC'ed, and there's a batch file for installing and uninstalling. The changes are largely additive, but if you're deeply risk-adverse, use a VM. The batch file will make it clear what's changing on your system and what's not. Be aware there's a different batch file for 64-bit vs. 32-bit systems. This will all be automatic in the final release as it'll be rolled into the .NET Framework.

Dynamic Data in a Nutshell

If you're using Data Binding and any of the DetailsView, FormView, GridView, or ListView controls to do CRUD, consider using Dynamic Data, especially if you're using the BoundColumn. It will save you time and trouble.

In the future, watch for the possibility of Dynamic Data for POCO (my term, not the teams), Dynamic Data for Silverlight and Dynamic Data for MVC. Now is your opportunity to be heard. I'd like the idea of Dynamic Data for NHibernate myself, so I'm pushing for that. Feel free to engage in the Dynamic Data Forums or post bugs on this release in the issue tracker.

Related Links

Technorati Tags: ,

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by SherWeb

The Weekly Source Code 23 - Big Solution Edition

April 10, '08 Comments [8] Posted in Source Code
Sponsored By

My source code reading didn't have any rhyme or reason to it this week, but most of them were large, so this is the Big Solution Edition. In my new ongoing quest to read source code to be a better developer, Dear Reader, I present to you twenty-third in a infinite number of posts of "The Weekly Source Code."

BigPicture

Vertigo Software, the folks that did the Deep Zoom Hard Rock site at Mix have released to CodePlex their mouse-wheel support in a project called Big Picture. When I saw this initially, I said, "meh" but then realized upon reading it that there's some clever stuff here that goes beyond the mouse-wheel support that folks rushed to add (myself included) to their DeepZoom Helloworld Examples.

First, they've figured out (as of Silverlight 2.0 beta 1) how to disable the initial "zoom from nowhere" animation in DeepZoom. They turn UseSprings off initially, then turn it back on after the first motion has completed:

/// 
/// Handles the "MotionFinished" event fired by the MultiScaleImage, but only re-enables the "UseSprings"
/// property after the first motion completes (a little trick to properly bypass the initial "zoom in
/// from nowhere" animation when first loading)
///
/// The MultiScaleImage instance.
/// Unused RoutedEvent arguments.
void image_InitialMotionFinished(object sender, RoutedEventArgs e)
{
if (!isInitialMotionFinished)
{
isInitialMotionFinished = true;
image.UseSprings = true;
}
}

Simple, and obvious after the fact, but I hadn't figured it out. They also handle the issue of funky Uris in development vs. production by using App.Current.Host.Source:

Uri collectionUri;
if (Uri.TryCreate(App.Current.Host.Source, "/Collection/items.bin", out collectionUri))
image.Source = collectionUri;

They've also created a nice MultiScaleImageWrapper to encapsulate all the panning and zooming into one class.

DevServer

I wasn't sure what to make of this project when I started looking at it. The Project Description kind of made my eyes gloss over:

NetFXHarmonics DevServer is a web server hosting environment built on WPF and WCF technologies that allows multiple instances of Cassini-like web servers to run in parallel. DevServer also includes tracing capabilities for monitoring requests and responses, request filtering, automatic ViewState and ControlState parsing, visually enhanced HTTP status codes, IP binding modes for both local-only as well as remote access, and easy to use XML configuration.

Other than the WCF app we built at my last company, I haven't seen a lot of WCF stuff, and DevServer is an interesting and complete example of a Cassini-like Web Server. He wrote it because he wanted to more easily debug multiple WCF Services and ASP.NET Web Sites all working together. Rather than using client-side or sniffing tools, why not just take over the server?

The source is interesting to read holistically, but is also full of little useful utility methods. He parses out, decodes, and displays ViewState, shows headers, formatted and raw content, etc.

image_2

David Betz is a very prolific writer of code and has a number of projects up on CodePlex he's given back to the community. One particularly interesting one is his Minima .NET 3.5 Blog Engine that he uses as a training tool. It also, of course, runs his blog. Spend some time over there, there's lots to learn.

Visual LINQ Query Builder

LINQ is a little confusing and it can be difficult to visualize your queries and write them. Mitsu from MS France and his two French Students Simon Ferquel and Johanna Piou have written a Visual Query Builder for LINQ and enabled it in Visual Studio as an Add-In.

The Add-In uses WPF and has a number of cool animations and a fresh UI design. You can drag your LINQ to SQL classes in from the Class View and visually build the LINQ query using dynamically generated Listboxes and an innovative Tree View I've not seen before.

The Results pane shows not only a preview of the data that will be returned, but also the generated SQL and the generated LINQ query and code. The results are put in a static method in a static utility class.

 vlinq

image All the better, the code is available and while it feels early and beta-esque, it's an interesting read. I really enjoy looking at how folks lay out their solution structures.

They've also made liberal use of Class Diagrams, presumably because they're students, but also because they are attentive to detail, so for the harder parts, like Query Formatting, there is an associated Class Diagram. Another feature of VS2008 I always forget.

They've factored out an interesting VS Integration Project that could be of help to folks who are interested in making a Visual Designer and plugging it into Visual Studio. There's also a number of interesting WPF Controls like a "MultiStepControl" and "TreeListView."

This is an exceedingly large amount of work, and it's going to take me a while to digest it. In some ways it feels brilliant and in others it seems incredibly complex, possibly overly so. Fortunately, you don't have to read the source, you can just use by installing their MSI if you like.

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by SherWeb

Packing Light for Travel with Power and Geek Style

April 9, '08 Comments [39] Posted in Musings
Sponsored By

I've been traveling lately, and last week I posted 10 Guerilla Airline Travel Tips for the Geek-Minded Person. Next week I'm going to Seattle for the week and I really prefer to pack as light as possible. There's lots of tips on the net on how to squish your clothes (I use SpaceBags) and what luggage to use (I like half-sized wheeled totes) but what's really interesting to me is what gadgets and electronic equipment to pack that gives me the most functionality in the least space.

Here's what I'm packing for next week's trip:

Monster 4 Outlet Mini Power StripMonster 4 Outlet Mini Power Strip - Ordinarily I dislike Monster's stuff because its's so expensive, but this little gem is only $12. Paul Mooney gave me one of these and I love it. It's got four-outlets and a small extension core. The cord wraps around and it plugs into itself for storage. As Paul says, "When you're at the airport and you're looking for a plug, you're pushy. If you show up with one of these, you'll make three new friends!" They're amazingly useful when plugged into those lamps with outlets at the hotel.

Kensington Travel Plug Adapter Kensington 33117 International All-in-One Travel Plug Adapter - I love this plug. We took it all over Africa and Europe and it hasn't failed me yet. It even has a spare fuse inside. This plug is all-in-one with no pieces to lose. The plug tips are all stored inside and slide in and out. Use it along with the mini-power strip above and suddenly you've got four US power plugs. It doesn't convert voltage, but most electronic device adapters will convert voltage for you.

Maxtor 250 GB OneTouch Hard Drive Maxtor 250 GB OneTouch 4 Mini Portable Hard Drive - I've recently started doing all my presentations using Virtual Machines on this little drive. It's a great drive because it doesn't require external power, rather it uses a double USB cable to draw power. I have six VMs on this drive.

Kensington Power AdapterKensington K33197 120W Auto/Air Ultra Portable Notebook PC Power Adapter - This has replaced all my power bricks. It powers my PSP, iPod, anything USB, nearly any notebook, phone, digital camera. It'll even charge one high-power (laptop) and one low-power (phone) device at once with the Y-adapter. The brick is also about half the size of whatever came with your laptop. It's creepy small.

USB Mini CableUSB 2.0 A/Mini-B Cable (Black)- You literally can't have enough tiny USB cables. They are good for charging things, tethering with your SmartPhone for Internet access, or connecting to a portable hard drive. I keep at least four in my bag.

Garmin nuvi 350

Garmin nüvi 350 3.5-Inch Portable GPS Navigator - There just isn't a better GPS for your dollar than the Garmin Nuvi 250. I paid twice this and it was still worth it. The feature I like the most is that it speaks the street names using text-to-speech. The interface is clean and easy to use, and it has a mode for walking/hiking which is great around unknown cities. As an aside, it's got an SD Card slot, supports Audible audio-books, it's a passable MP3 player. It also charges via Tiny USB!

 

webcam Microsoft LifeCam VX-7000 Win USB - Don't listen to the low Amazon Reviews on this one. The early drivers sucked and the LifeCam software is a little "meh." However, the secret to this webcam is a Driver Only install. I use it in 64-bit Vista and do 640x480 high-res video calls with the family whenever I'm on the road, using the Skype Hi-Res Hack.

presentermouse

Microsoft Wireless Notebook Presenter Mouse 8000 - I've tried every little notebook mouse/usb dongle combo there is. Some have hidden USB receivers, some recess in the bottom, etc. This mouse has both a dongle, but also bluetooth. I've left the dongle at home and I just have to turn this mouse on and since I paired it once with my laptop, it just works. One less thing to sweat. Plus, it's a presenter mouse, so you just flip it over and it has a laser pointer, on screen magnifier, and Presentation Forward/Back buttons. It lets me move more freely when presenting, and my recent Mix presentation was better for it.

HTC Excalibur Dash

HTC S620 PDA Black Smartphone (Unlocked, Intl. Version) - I've got an HTC Excalibur unlocked phone that's hooked up to Cingular/AT&T. The best think I ever did was turn on unlimited data. Now I can use "Internet Sharing" with Windows Mobile. I can "tether" the laptop and the SmartPhone with two clicks, using either Bluetooth or USB (I use USB as it charges the phone also) and I've got pretty decent speed Internet (25k/sec) pretty much anywhere largish in the US. When I find a Wi-Fi hotspot that wants to charge me money, bam, I bust out the phone. I've found myself using public Wi-Fi less and less, as it's really dodgy in both reliability and speed, and just going with the slower, but always available AT&T Edge network. Both Gmail and Outlook notice when they are on slow connections and will adjust. Also, I don't need to carry around (or pay for) a Network Aircard for the laptop.

kindle Amazon Kindle - It's official, I loves my Amazon Kindle (my review). Sure, it's ugly. But it works. I don't have to sync it. I hate having one more thing to sync to some other thing. If it works wirelessly and I don't have to push any buttons, I like it. The Kindle delivers me the New York Times, Newsweek, and the Huffington Post, every day (or week, for Newsweek) and it just works. I've added a 2gig SD Card and put all my Audible books on it. I've got a dozen books, many free. The one caveat so far, I have had the battery run down over a few day period and the battery go dead when the wireless has been left on and constantly updates blogs, so I've started turning it all the way off at night and charging it like a cell phone. However, with wireless off, it'll go for 1000+ page turns before running down, plus it'll trickle charge from tiny USB.

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by SherWeb

Memories of Zimbabwe - You can't afford to go home

April 5, '08 Comments [32] Posted in Africa
Sponsored By

800px-Dol_zimbabwe My wife and I have been married going on eight years. We try to go to Africa every two years as she's from Zimbabwe originally. We wanted to go to Zim last year, but ended up going to Tanzania instead as we were taking our (at the time) one year old, and my sister-in-law works for the Rwandan War Crimes Tribunal there. Zim didn't seem like a good first trip for the baby.

I remember when we went to Zim for the first time in 2001. I was meeting my then fiancée's family for the first time and was deep in lobola negotiations with her father. The exchange rate was US$1 to Z$55, and it was about Z$50 to ride in a combi (minibus/taxi).

My wife remembered at the time how she could go downtown and buy gum for a single Zim penny. Once, my sister-in-law got into huge trouble as a child when she asked a visiting relative for a penny.

When we returned two years later, the exchange rate was US$1 to $Z50,000. Mo's father passed away while we were there and it was surreal to spend a solid hour counting out $Z2,000,000 for his casket in Z$100 bills in the midst of our grief.

zim100kTake a good look at the Zim $50 note in the picture above. It had an expiration date.

Today, whatever Zim currency you have in your pocket loses value of Z$70 a minute just sitting there.

In January of 2008 the exchange rate was US$1 to Z$1,900,000 (1.9M). On March 1st, it was US$1 to $Z 24 million. Today, just two weeks later it's US$1 to Z$70 million. Arguably, Iraq has a significantly better economy than Zimbabwe as Zim's current inflation rate is in excess of 100,000%.  (Some figures point to it being around 164,000%, others closer to 200,000%.)

This Z$100,000 Bearer Cheque is not only two years expired, but were it not, it'd be worth 14/10,000ths of a US dollar, but that worth would last only a few hours.

f9e06f45-c479-4084-be83-68eb5c6da48d_mnThe gift that I gave my father-in-law to buy cows with would today be worth over $Z140,000,000,000, or 140 billion Zim dollars.

If these numbers seem overwhelming, they are. Recently the new Z$50 million dollar note came out, and it will by three loaves of bread (assuming you can find bread) a Z$16M each.

I can't tell you how painful it is to watch a country you love collapse from the outside when we have family there, but it's nothing considering what it's like on the inside. We talk to family there each week and each week the stories get worse.

I could tell you what it used to be like. I could tell you about the time we went to Chipangali Zoo with my mother-in-law and a mini-bus full of 6th graders. I could tell you about the two classrooms and bathroom (real flush toilets!) that we worked to get built.

P0004995 CIMG1645

I could tell you about the time we went to Victoria Falls and slept a hundred yards from an elephant watering hole. I could tell you about the time we went ekhaya to my wife's ancestral home to bury her father.

P0005136 P0005132

I could tell you about the time I found a goat in the my morning bathtub, then it disappeared, only to reappear on my breakfast plate the next morning. I could tell you about freaking out abantu abamnyama nxa ikhiwa likhuluma isiNdebele.

CIMG1653 Cropped CIMG1362

But, those days are gone and we have only pictures and memories. The Zim that we knew is gone and it's unclear what is coming. God help the people of Zimbabwe and our family overseas.

For updated news about the Zimbabwean elections, see the BBC Zimbabwe section or check Google News on Zimbabwe.

Related Links

Technorati Tags: ,

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by SherWeb

Disclaimer: The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.