Europe in Winter: Barcelona, Spain (Day 2)

The bus mentioned in yesterday’s post was the Barcelona Bus Turistic.  It turned out to be a lot of fun and would have been an even better value if we’d had the time to book it for 2 days instead of one.  We purchased two tickets for the north-south route via Viator.  Our hotel was conveniently located just a short walk from one of the stops.  The route takes you past every attraction of note in Barcelona, and with the option to get on and off the buses at various points when desired, it’s possible to see a lot of Barcelona this way.  In addition to the bus tickets, we received large coupon books of discounts to a large number of the attractions the bus takes you past.  Another underrated benefit of the bus–good wireless internet access.

One such discount is for the Montjuic cable car, which takes passengers to and from Montjuic Castle.  The views of the city from a cable car are pretty amazing, and the castle at the top is a nice place to walk around a bit, or just sit and relax.  There are many other stops worth getting off to see that I’d like to visit on a return trip, including Camp Nou, the Gothic quarter, and some of the museums.

Tomorrow, we bid a too-soon farewell to Barcelona and fly to Nice, France.


Europe in Winter: Barcelona, Spain

Barcelona is the first stop on our trip to Europe (hotels courtesy of my lovely wife, flights courtesy of me). In our first 36 hours here, we’ve managed to recover from the change in time zones between DC and Barcelona, visit La Sagrada Familia, and visit Park Guell. Both were highly-recommended by the concierge at our hotel (Ritz-Carlton Barcelona, also known as Hotel Arts Barcelona).

Buying tickets ahead of time for La Sagrada Familia is highly-recommended also. We bought a tour with an English-speaking guide on ticketmaster.es for under 40 euros and probably saved ourselves 2-3 hours of waiting in line to get in. The guided portion of the tour was around an hour–the guide shared a wealth of historical information about the architect (Gaudi), the building, some of the sculptors, Catholicism, and the Bible itself. As someone who appreciates history and churches, the tour was excellent.

Park Guell was quite a bit of walking, but also fun. The monument zone of the park charges admission, which gives you access to some of Gaudi’s interesting outdoor works (along with some shops and restrooms). Once you leave the monument zone however, you can’t return without paying the same fee again. The best views of Barcelona are actually outside the monument zone anyway (if you don’t mind climbing a lot of stairs).

We got to and from both attractions and our hotel by metered cab. Ride costs ranged between 8-12 euros. Only one of the four cab drivers we’ve had so far spoke enough English for us to have a conversation.

Tomorrow, we’ll probably try the 1-day hop-on, hop-off bus and see as many attractions as we can.


Candied Sweet Potatoes 2013

Since the first time I posted a candied sweet potato recipe, I’ve made it a few more times.  What follows is the 2013 version I made this past Thanksgiving (and will probably make for Christmas since family and in-laws have been asking):

Ingredients 4-5 lbs of sweet potatoes 1 20oz can of pineapple (preferably crushed) 1 1/2 cups of dark brown sugar 1 1/4 cup of unsalted butter cinnamon, nutmeg, & ground ginger to taste

Instructions If you only have regular pineapple instead of crushed pineapple, slice it up into small pieces. Otherwise, skip to the rest of the instructions below. Fill an 8qt pot 2/3rds of the way with water. Bring to a boil. Boil the sweet potatoes for around 15 minutes. Drain and set aside to cool for peeling and slicing later.

In a saucepan, melt the butter (over low heat), add the brown sugar and stir. Add cinnamon, nutmeg, and ginger until the sauce tastes how you want it.

After you’ve peeled and sliced the sweet potatoes, lay down a layer of them, drizzle/smear on some of the sauce, and sprinkle on some of the pineapple. Repeat until you’ve filled whatever casserole dish or foil pan you’re using.

Bake this at 425 degrees for around 55-60 minutes.


Re-Introducing NuGet (and introducing Chocolatey)

Last month, I presented on the topics of NuGet and Chocolatey at RockNUG as the lead-in to David Makogon’s Polyglot Persistence talk. Since the time I first gave a presentation on NuGet at a previous employer a couple years ago, the package manager has matured quite a bit. Because there was far more than 30 minutes worth of material to discuss, the rest of this post will cover material I didn’t get to, commentary from the audience, and the answer to a question about tags.

In discussing the term package manager, I indicated that it meant more than one thing:

  • automation of dependency management for operating systems (think Unix or Linux distributions)
  • automation of dependency management for programming languages (think Perl's CPAN, Ruby Gems, Node.js npm)
NuGet is the second type.  I find Chocolatey quite interesting because it's a package manager of the first type that leverages the capabilities of NuGet to accomplish its work.

NuGet enables us as developers to define and re-define what a third-party dependency is.  The team at Fortigent (one of RockNUG’s sponsors) has made packages out of some of the functionality they’ve developed internally.

There are a couple of different ways to create packages:

The second way is recommended for integration with build systems.  Typing "nuget spec" in the location of the csproj file you want to make a package out of will generate a "nuspec" file (in addition to automatically referencing other files as dependencies).  Edit this file in order to add tags, licensing, links and other information you want to make available in your package.  Typing "nuget pack" followed by the csproj file will generate a file with the .nupkg extension.  The extension merely hides the fact that it's a ZIP file with some additional information.

In addition to creating packages, NuGet gives us the ability to set up our own package feeds.  The feed can be a simple as a network share with packages in it.  One step up from that is to create an empty ASP.NET Web application and add NuGet.Server to it.  This will add everything to the application needed to host your own packages (or others from third parties).  You can even publish your packages to this type of application if you wish.  The pinnacle of NuGet package distribution is to host your own fork of the NuGet Gallery (available on GitHub).  One software vendor, JetBrains, forked the NuGet Gallery to publish documentation on all the plug-ins available for the latest version of ReSharper as well as make it possible to download ReSharper itself.  Chocolatey uses the NuGet Gallery code in a similar way.  Unlike the ReSharper gallery (which doesn’t let you download plugins), the Chocolatey gallery does allow it (though the actual installs require command-line interaction, which is helpfully displayed next to each package).

One of the NuGet-related projects I found particularly interesting is concierge.nuget.org.  Its objective is to recommend NuGet packages in the same way we receive movie, music and product recommendations from Netflix, Spotify or Amazon.  Simply upload the packages.config file for your project and get recommendations back.  I learned about this (and other .NET development-related topics) on The Morning Brew.

Q & A

While there weren’t any questions at the end, there was one asked during the presentation about the “tags” element of the nuspec file inside each package.  When you look at a package in the NuGet Gallery (like EntityFramework for example), you see a list of linkable tags.  Clicking on one actually triggers a search for each package that shares a particular tag.  So if  you’re a package author who wants their package to be discovered more easily, putting the right keywords in the “tags” element will help.


Reducing Duplication with Interfaces, Generics and Abstracts

The parts of our application (a long-term service and support system for the state of Maryland) that follow the DRY principle best tend to start with a combination of generic interfaces inherited by an abstract class that implements common functionality.  The end result–specific implementations that consist solely of a constructor.  I was able to accomplish this as well in one of my more recent domain implementations.  I’ve created a sample (using fantasy football as a domain) to demonstrate the ideas in a way that may be applied to future designs.

Let’s take the idea of a team roster.  A roster consists of players with a wide variety of roles that can be grouped this way:

  • QBs
  • offensive linemen
  • skill position players
  • defensive linemen
  • linebackers
  • defensive backs
  • special teams
Since I want specific implementations that are (very) small, I'll need to find common attributes between these different groups.  Each roster grouping above is just a list of players.  Things that are common to all players (regardless of position) include attributes like:
  • first name
  • last name
  • team name
  • position
The first three attributes are just strings of text, so I treat them as such in my implementation.  Position could be treated that way too, but instead I'll implement an enumeration with all the positions and leave the implementation of it to position-specific classes I'll create later.  Going back to the roster grouping idea as a list of players, we can use a generic interface implemented by an abstract class so that implementations of the groups above will differ only by constructor.  Now, when I implement a Quarterbacks group,  the only differences between it and the implementation of an OffensiveLinemen group are the class names and types.  The RosterGroup class contains all the important functionality, including the IEquatable implementation that enables comparison of groups.  I followed a ReSharper suggestion to make IRosterGroup explicitly covariant.

 


How can I become a world-class coder in under three years?

I came across this question on Quora today and decided I would answer it.  There were enough up-votes by people following the question that I’m re-posting my answer below:

I'm not sure what the term "world-class coder" means to you.  But I would actively discourage the notion that there is some point you can reach in the practice of software development (whether it's 3 years or 20 years) where you can look at yourself and say "Achievement unlocked!  I am a world-class coder at last."  What may give you more satisfaction over time than the question of "where do I rank" in some mythical best coders on Earth list is "Am I a better developer now than I was last week?  Last month? Last year?"

The things that previous commenters have suggested are great ideas for continuous improvement and refinement of your skills in programming.  Do as many of those things as you can.  Beyond those, I’d suggest the following:

  • Be willing to learn from anyone.  I've made my living writing software since 1996 and I regularly learn new things about my craft from people a decade or more younger than me.
  • Keep track of what you learn--and share it.  Whether it's through blogging, Stack Overflow contributions, or something else--write about it.  You may not encounter the exact problems you've solved in the future, but they will often be close enough that what you've captured will help you solve them much faster than you would have otherwise.  The ability to explain what you know to others is a very valuable and rare one.  The process of preparing to give a presentation to others on a topic has often been a good forcing function for me to learn that topic to the level where I can explain it well.
  • Learn about subjects beyond programming.  The importance of the ability to understand new domains well enough and deeply enough to design and implement useful software for them cannot be overstated.  I've delivered software solutions for news organizations, healthcare companies, marketing companies and defense/intelligence contractors in my career so far.  Making myself familiar with the sort of terminology they use and the way such companies operate (above and beyond a specific project) definitely results in a better end product.  One or more such topics can end up being great fodder for pet projects (which are great vehicles for learning things you aren't already learning in a job).

Book Review: Building Interactive Queries with LINQPad

Any new technical book has the challenge of adding value above and beyond what’s available for free on the web.  A new book on LINQPad has the additional challenge of adding value above and beyond the wealth of samples already included with LINQPad, including code samples from two LINQPad-enabled books.  So when I received my review copy of Building Interactive Queries with LINQPad, I was very curious to see what the author (Sebastien Finot) could accomplish in 126 pages.

Even as someone who has used LINQPad enough in the past few years to present on it on front of a .NET user group, I learned new things about the tool I hadn’t known before (such as the ability to interact with the console and CSS customization of the application’s look-and-feel).  The book might have been more accurately titled “Building Interactive Queries with LINQ and LINQPad”, as the book provided good examples of a wide variety for LINQs query operators.  Finot also mentioned the performance implications of ToList()–a very useful mention depending on the size of collection you might be dealing with in your queries.  All the code samples in the book are available for download as well.

The book missed some opportunities to add value for readers.  Fuller treatment of the NuGet dependency management capabilities in the paid versions of LINQPad would have been helpful in deciding if the feature was worth paying for.  Finot also mentioned the existence of LINQ to Twitter and LINQ to JSON APIs but didn’t link to the projects in the book.  More examples of using LINQ to parse and manipulate JSON (instead of XML) would have improved the book significantly, given the increased usage of JSON in .NET development these days.  Unfortunately, the code samples didn’t include databases, which would have enabled the author to go above and beyond the fairly standard Northwind database examples.  A custom OData feed for use in explaining the ability of LINQPad to query those data sources would have been a great help as well (given the rather tenuous availability of the sample services at odata.org).

Building Interactive Queries with LINQPad is the only book I’ve seen dealing specifically with LINQPad.  If you use LINQPad on a regular basis (or plan to), the e-book is worth purchasing.  For an in-depth treatment of LINQ, you’ll have to look elsewhere.

Disclosure: I received the e-book free of charge from the publisher for the purpose of providing this review.


Binding Redirects, StructureMap and Dependency Version Upgrades

Dealing with the fallout in failing unit tests from a code merge is one of the most frustrating tasks in software development.  And as one of a (very) small number of developers on our team that believes in unit testing, it fell to me to determine the cause of multiple instances of the structuremap exception code 207 error.

As it turned out, the culprit was a tactic I’ve used in the past to work with code that only works with a specific version of an assembly–the binding redirect.  When the same person is in charge of upgrading dependencies, this tends not to be an issue because if they’ve used binding redirects, they know it’s necessary to update them when dependencies are upgraded.    In this case, the dependencies were upgraded and the redirects were not.  As a result, StructureMap tried to find a specific version of an assembly that was no longer available and threw exception code 207 when it failed.


Not Surprised, But Still Disappointed

After being told the composition of the jury considering the case against George Zimmerman the week before, I said he wouldn’t be found guilty.  I also posted comments to the same effect on Facebook.  But I was still disappointed to discover that he’d been found not guilty.

In (foolishly) arguing the outcome of the case with people on Facebook, I made the following comment:

Zimmerman effectively profiled and stalked a minor child while armed for the simple act of walking home from the store. Incompetent as the prosecution apparently was, the laws of Florida are culpable too. They enable and condone vigilantism, and the needless deaths that will certainly continue to result.
Andrew Sullivan's commentary on the verdict is well-worth reading.  It raises the very uncomfortable specter of lynching, as well as the prospect that this verdict might encourage it.  Given the widely-documented disparities in treatment of minorities when compared to whites in sentencing for the same crime, along with the highest rates of incarceration in the world, outcomes like the George Zimmerman verdict (and the perverse laws that enabled it) force me to question whether or not this country values my life, or those of other black males.

I’ve heard some talk of boycotting the state of Florida as a response to the verdict.  I can understand the sentiment.  What I’m less sure of is whether any such boycott could be effective without a clear objective (such as the repeal of Florida’s Stand Your Ground law).  There’s also a legitimate concern about such a boycott hurting people who have no choice but to remain in Florida.


Word Games

I love word games.  Whether it’s old-school ones like Scrabble and Boggle or the increasing number of iPhone word games (Words with Friends, Scramble with Friends, Letterpress, Ruzzle, etc), I play them all.  Our federal government is playing a different word game right now, by hesitating to describe the overthrow of the Morsi government in Egypt as a coup d' etat.

The Merriam-Webster dictionary defines coup d' etat this way:

: a sudden decisive exercise of force in politics; especially:the violent overthrow or alteration of an existing government by a small group
Here's how the Oxford Dictionaries define coup:
  • 1 (also coup d'état) a sudden, violent, and illegal seizure of power from a government:he was overthrown in an army coup
The Wikipedia entry on coup is more extensive, and is perhaps the best description of the current situation:
coup d'état (/ˌkuːdeɪˈtɑː/; plural: coups d'état), also known as a coup, a putsch, or an overthrow, is the sudden deposition of a government,[1][2][3][4] usually by a small group of the existing state establishment—typically the military—to depose the extant government and replace it with another body, civil or military.
Did the military depose the government?  Yes.  All indications are that Morsi is currently under house arrest.  Did they replace it with another body?  Yes.  The chief justice of Egypt's supreme court was sworn in and placed in charge mere hours after Morsi's removal.

So why won’t our government call this change what it is?  Perhaps because the U.S. provides more foreign aid to Egypt than to any other country except Israel for the purpose of preventing another shooting war between Egypt and Israel.  Perhaps because a section of the Foreign Assistance Act of 1961 “restricts assistance to the government of any country whose duly elected head of government is deposed by military coup or decree”.  Whatever the reason, now that the Egyptian army has killed 51 and injured hundreds in clashes yesterday, it’s unclear how much longer the Washington word games can (or should) continue.


The App Store Economy Ain't Broken (So Don't Fix It)

I came across this article via Daring Fireball, and figured I’d post my two cents about it.  I disagree with the both the premise of the article and some of the specifics.

To the question of “why are so many of us so surprisingly cheap when browsing the virtual shelves of the App Store?” I’d say because quite a few vendors have conditioned us to expect high-quality apps for a fairly low price. It’s the same reason that the vast majority of people expect news to be free on the Internet.  Those news sources that went online with paywalls at the beginning (The Wall Street Journal and The Economist are two publications I read for example) are still doing just fine financially.  Those that didn’t are struggling financially (or going out of business altogether).

The idea that “we as cheap customers are having a negative impact on a lot of both real and potential businesses” is one I disagree with.  One, because the author doesn’t quantify the negative impact.  Two, because a potential business is a valueless unknown (and as such, can’t have any real weight in a discussion of what to pay for products from real companies).  I’ll certainly buy an app if I use it a lot (and/or get tired of seeing ads in the case of most games).  The benefit of the low pricing both to us as consumers and to app developers is that we can buy multiple apps that do similar things without having to think much about the cost (it’s why I own more than one photography app, for example).

I’m not a big fan of in-app purchases (especially after finding out how much my wife spent on a single game), but I don’t see much of a difference between that model and the licensing/subscription model that more and more software companies (Adobe, Microsoft) and others (Netflix, Hulu, Spotify, Pandora) are moving (or have already moved) to.  The author’s focus on social media apps and games leaves out more serious “service-backed” apps like Evernote, GitHub, Flickr, DropBox, Box, LinkedIn and Google Drive that let you use a limited set of functionality for free and pay more for additional features or storage space.

Companies who sell apps aren’t doing it for charity.  So if they’re any good at business at all, they’ll sell their products at a price that will keep them in business–or they’ll go out of business.  It isn’t our job as consumers to keep poorly run companies in business by buying their software.  And despite the author’s suggestion, paying for great apps now certainly doesn’t mean great apps later.


The Dreaded CISPA is Back


My 2 Cents on SXSW 2013

Size

I hadn’t been to a conference so large (whether you’re counting people or land area covered) since Microsoft’s PDC in 2001–and that was held at Staples Center in Los Angeles.

Sessions

Even though I only attended Interactive (they have Music and Film too), there were a ton of choices of sessions across a wide variety of technical, creative and other disciplines.  In addition the technical topics I was looking for, I got to learn about the quantified self movement, 3-D printing, wearable computing and entrepreneurship.

Swag

Between the vendors in the exhibit hall and all the companies there recruiting new people, I’ve never gotten so much free stuff in my entire life.

Keynotes

I’d attended keynote speeches at conferences before, but hadn’t seen keynote interviews before.  Elon Musk and Al Gore were both entertaining and thought-provoking.  While it wasn’t billed as a keynote, the best solo talk I heard during the entire conference was Phil Libin’s Chaotic Good.

Panels

Many sessions weren’t just a single person speaking, but a group speaking in front of an audience.  Making it Rain in Non-Techy Markets was the best panel I attended during the conference.  While I’m not an entrepreneur (yet), all four panelists gave really helpful advice.

People

I met people from all over the world at this conference.  Just on the rides to and from the convention center each morning and evening I met people from the Netherlands, Australia and Italy–as well as from all over the U.S.  In the airport on the way back, I met 3 people from a company that happens to be across the parking lot from mine!

Quite a few people I met were founders or co-founders of their own companies.  I heard a number of start-up pitches and met a venture capitalist who was in town looking for companies to invest in.

The locals who were brave enough to stay in town for South By were very friendly and helpful.  One guy even gave a couple of us a ride to the convention center when our shuttle was running late.

Traffic

Speaking of shuttles, R & R Limousine and Bus (the exclusive shuttle provider between hotels and SXSW venues) did a pretty poor job serving my hotel (one of two close to the airport).  When we didn’t resort to bumming rides from strangers or calling cabs, we usually ended up waiting a long time for our to show up.  The traffic did us no favors either.  Between the construction on the roads and street closures, it took a long time to get in and out of downtown.

Overall

SXSW Interactive 2013 was a great (if tiring) time.  I really enjoyed Austin as a town.  It has a buzz, an energy to it unlike any city I’ve ever visited.  I hope to go back–if not for SXSW 2014, then a different time of year to enjoy the rest of Austin.


Replicating Folder Structures in New Environments with MSBuild

I recently received the task of modifying an existing MSBuild script to copy configuration files from one location to another while preserving all but the top levels of their original folder structure.  Completing this task required a refresher in MSBuild well-known metadata and task batching (among other things), so I’m recounting my process here for future reference.

The config files that needed copying were already collected into an item via a CreateItem task.  Since we’re using MSBuild 4.0 though, I replaced it with the simpler ItemGroup.  CreateItem has been deprecated for awhile, but can still be used.  There is a bit of debate over the precise differences between CreateItem and ItemGroup, but for me the bottom line is the same (or superior) functionality with less XML.

Creating a new folder on the fly is easy enough with the MakeDir task.  There’s no need to manually check whether or not the directory you’re trying to create already exists or not.  The task just works.

The trickiest part of  this task was figuring out what combination of well-known metadata needed to go in the DestinationFiles attribute of the Copy task to achieve the desired result.  The answer ended up looking like this:

<Copy SourceFiles="@(ConfigFiles)" DestinationFiles="$(OutDir)_Config\$(Environment)\%(ConfigFiles.RecursiveDir)%(ConfigFiles.Filename)%(ConfigFiles.Extension)" />

The key bit of metadata is the RecursiveDir part.  Since the ItemGroup that builds the file collection uses the ** wildcard, and it covered all the original folder structure I needed, putting after the new “root” destination and before the file names gave me the result I wanted.  Another reason that well-known metadata was vital to the task is that all the files have the same name (Web.config), so the easiest way to differentiate them for the purpose of copying was their location in the folder structure.

In addition to the links above, this book by Sayed Ibrahim Hashimi was very helpful.  In a previous job where configuration management was a much larger part of my role, I referred to it (and sedodream.com) on a daily basis.


Fixing MVC Sitemap Errors

When attempting to manually test a .NET MVC application, I got the following exception from Visual Studio: MvcSiteMapException

Looking at the inner exception revealed this message:

An item with the same key has already been added.
The sitemap file for our application is pretty long (over 1300 lines of XML), but a co-worker pointed me to the potential culprit right away. There was a sitemap node near the end of the file that had empty strings for its controller and action attributes. As far as I can tell, this generates the default url for the site's home page. Since it already exists, this results in the exception that's thrown. Removing the sitemap node resolved our issue.  A couple of threads that I checked on stackoverflow (here and here) provide other possible causes for the error.

Identifying All Bad Mappings with AutoMapper

One of the long-running annoyances we’ve had with our test of AutoMapper configuration validity on my current project is that a test failure only revealed the first mapping that was wrong. I haven’t figured out why this is the case, but I’ve come up with a work-around that displays all the necessary information.

Because the exception thrown if one or more incorrect mappings is found is AutoMapperConfigurationException, my revised test catches that exception in order to print the source type, destination type, and the list of unmapped property names. Re-throwing the exception at the end ensures that the test still reports a failure. The XUnit test which demonstrates this is available as a GitHub gist. If you’re using NUnit or MSTest in your application, minor revisions to this test will give you the same results.


Ours At Last

After about two weeks of homelessness (a.k.a. living in my wife’s condo and hotels), we finally completed the settlement process on our shiny new townhouse around 3 pm this afternoon. Less than two hours later, we’d spent some of the profit left over from the sale of my old townhouse on new furniture for the main level. Between working full-time, preparing a house to sell, and buying a new one, the past four months have been incredibly busy. It still won’t be slowing down anytime soon. Tomorrow is move-in day, since PODS is coming to pick up their storage unit at noon. There’s still Verizon FIOS to install, furniture deliveries to accept, more furniture and electronics to buy (not to mention a new washer and dryer). I’ll be glad when we’re finally settled in so we can invite some friends to hang out.

Our new neighborhood is still in the process of being built, but what we’ve seen so far of where we’ll be living looks great. I’m looking forward to getting to know our new neighbors.


Fastest Realtor in the East?

I didn’t think a house could be sold in just 4 days, but I was wrong. We got a list price, all-cash offer on the house yesterday. Many thanks to our realtor and friend Karane Campbell. I couldn’t recommend her more highly. She priced the place perfectly and worked hard on the three interested parties to get us the best price.


First-Time Home Seller

Since my wife and I are buying a new place together, I’m selling the townhouse we currently live in. If you’re looking to move into Montgomery County, Maryland you won’t find a better value.

The $285,900 list price gets you a 3-level interior unit townhouse with 2300 square feet of living space; 4 bedrooms, 3 1/2 baths, 2 fireplaces, and a fully-finished walkout basement. The $125 monthly homeowners' association dues cover your water bill, assigned parking space, trash, recycling, maintenance of community common areas and snow removal. Whether you work in DC, Maryland or northern Virginia, this location puts them well within reach. Metro’s Red Line is a 10-minute walk from the front door. The Beltway and Route 29 are just minutes away by car. I’ve had career opportunities in each of these areas over my 14 years here and having these transit options made it a lot easier than it might have been otherwise.

When it comes to shopping, dining, or entertainment, this area is hard to beat. Wheaton Plaza is just around the corner. The area’s newest Costco store will soon be open there. There are multiple CVS pharmacies, a Target and a Giant Food store. A brand-new Safeway is also scheduled to open within a year. There a few good Thai and Vietnamese restaurants within a short drive or a walk. Everything that downtown Silver Spring has to offer is a short drive (or two Metro stops) away.

If you’re into exercise, this area has you covered there too. LA Fitness has a facility in the Wheaton Plaza complex. The paved trails of the Sligo Creek Parkway are not far away either if you run or cycle.

Contact our realtor, Karane Campbell at (240) 393-8906 if you’re interested in finding out more.

MLS# MC7968156


How to Be Black

I finished reading this provocatively-titled book a couple of days ago. I expected Baratunde Thurston’s memoir to have its funny moments (he worked for The Onion until recently) and it did. I was not expecting the deep insights about black identity I found throughout the book. I also wasn’t expecting to see as much of myself in the author (beyond the unpleasant childhood experiences I had as a result of not fitting the stereotypes of what black kids are supposed to do and be). It was a pleasant surprise to discover that Thurston and I have Washington Post internships in common (as does my friend Sandro, one of the handful of other black computer scientists I know).

I was also pleasantly surprised to discover that Thurston’s interest in technology was inspired (at least in part) by his mother, who made a living writing COBOL for the Office of the Comptroller of the Currency.  One of the other technologists that blogs whom I admire greatly, raganwald, was inspired into his career by his mother as well.

If you enjoy stories about people destroying stereotypes in general (or stereotypes of black people in particular), How to Be Black is well worth reading.