I'm J Wynia. I'm a software consultant by trade who lives in Minneapolis. I'm a dabbler (see cyclical enthusiast and here) who enjoys a wide variety of pursuits. The world is an interesting place full of things worth knowing. This site is part of how I explore my curiosity and share what I learn.
The site name sums up a philosophy I have that inherently distrusts dichotomies. They are so often false dichotomies that a default assumption to that effect has served me well. I wrote up a little parable that describes that philosophy.
If you're on social networks, I can usually be found under the username: "jwynia". I'm currently most active on Twitter and you can follow me here.
For my upcoming software products, I’m carrying forward a strategy I’ve used at several clients for skinning/theming the application: a template engine. I like to think of my template engine approach as the “reverse” of what usually gets called a “content management system”.
See, most CMS’s force you to let their app run your site as well as manage your content. If you want to write custom business logic or customize what they can do, you have to write it as a plugin to the CMS. I’d rather have content/templates available as subordinate to my application. I’ve used that approach often enough now that I’ve grown to love it and consider it one of my most useful tools.
In past implementations, I’ve used various templating languages. Back in the PHP days, I used Smarty and for the last few years, I’ve used NVelocity. It’s nice enough, but it’s different than the view engine we use for things like our back end admin portions of our platform. So, you end up jumping back and forth for syntax in views, depending on whether you’re working on the back end or the front end of the whole deal.
Since we chose NVelocity, Microsoft added the “Razor” view engine to ASP.NET MVC. I’d seen several people mention that you can use it to do “in memory” templating like what I’m used to doing with NVelocity. I wanted to do a quick prototype to get a handle on how it works. Right after doing my IronRuby prototype, I tackled a quick one using Razor to put together a templated email.
It was really easy. And, since I was already in the groove, I recorded a screencast walkthrough of the prototype, such as it is. Here you go:
So, one of the products I’m building needs several points of extensibility that can be dropped in. For a certain type of extension, we’re using MEF. I’ve been using MEF on my current client project for a while and have worked out many of its quirks. But, MEF still puts the author of extended logic in Visual Studio.
On the other side, we’ve got a templating/snippet system that stores chunks of “views” for rendering pages, emails, etc. that provide a mechanism so that the entire look and feel of the application is stored in chunks in a database. They’re editable via a web app by people other than web developers. I’ve built similar for several projects and it works out really nicely.
I want something closer to that templating solution for simple business logic and rules. There’s still a definite place in my architecture for MEF plugins. C# does heavy lifting well. However, I have long been intrigued by IronRuby as an embedded scripting engine. So, this morning, I did a quick prototype to determine how much effort it was going to be to use it in the way I want.
Turns out, it’s pretty damned easy. When I mentioned that I was doing this prototype, someone asked if I was going to blog it. It’s often easier to just record a quick explanation/walkthrough, so that’s what I did. The video is below.
IronRuby Scripting in .NET from J Wynia on Vimeo.
Since 1999, I’ve been in the software consulting business, selling my skills, either directly or through an employer who was a consulting company of some sort. In fact, since graduating from college in February of 1998, only 18 months of my working history has been in any other context than consulting.
I’ve built a decent business/career doing consulting and it’s clear that I can continue that for a good long while. However, as I headed into 2011, something was very clear to me. I need to have some ways of making money that aren’t me directly selling my time/skills.
Over 2009-2010, I billed a LOT of hours. 4 x 40 hour weeks yields “fulltime” months of 160 hours. However, rather than seeing that number regularly, I’ve had 300 hour months and rarely bill fewer than 200. In doing so, I made pretty good money during that timeframe. But, it’s tiring and isn’t something I can keep up for very long.
At this point, the only ways I can make more money selling my time directly is bill more hours (been there for 2-3 years now) or raise my rates. I am raising my rates, but the local market for contract dev work is weird for how it responds to rates. Beyond that, I just don’t like having my options limited like that.
So, I’m now working on 2 software products/services/platforms that I can use to make money via licensing, monthly fees, per-project billing, etc. In short, I’m building levers to harvest the reward of working smarter.
So, what am I building?
The biggest is a framework for building document/data workflow applications for businesses. It’s right in line with the kinds of stuff I’ve been doing in my consulting practice for years. And, that’s where that platform will be applied first. We’re going to use it as the starting point for consulting projects where we charge a licensing fee for the platform and then do the customization and extension as a more typical consulting project.
I’m really excited for the possibilities this offers to do more value-based pricing, which gets the focus on ROI instead of clients focusing on the hourly rate.
If I told you that if you give me $10 and I guarantee that I’ll bring you $20 immediately after walking outside, you probably wouldn’t question it much. In fact, you’d probably start looking for as many $10 as you could find. Yet, somehow, when it comes to software consulting, people focus on the fact that $10 for 5 minutes’ work is $120/hr and they start negotiating like mad to reduce that number.
Anyway, this product is shaping up nicely and I’m working hard to get it ready for my next consulting project. It’s .NET and is based on the tools I’ve come to rely on in the last few years: ASP.NET MVC and related tools.
The other project is a web application for managing conferences/codecamps, etc. running on Google App Engine. There’s a gap for a really cohesive app in this space and we have a pretty good plan for building one that works well.
So, while I’m cutting down on the hours billed, I’m still working like mad to get these things built, aiming for a day when the leverage starts paying off and I can shift my income away from selling my time. Until then, it’s nose to the grindstone ‘round here.
So, in an archived episode of Basic Brewing Radio (from 2009), Charlie Papazian referenced a magazine article he’d written about a mead from the 40s labelled “1949 Gulval Bochet”. In the article, he described the amazing complex flavors. In the panel discussion, he asked the other meadmakers (all world class meadmakers) if any of them had made bochet. There was basically silence. Clearly none of them had ever made it. Given Charlie P’s description, and it’s apparent obscurity, my interest was suitably piqued.
Bochet is “A mead where the honey is caramelized or burned separately before adding the water. Gives toffee, chocolate, marshmallow flavors.”
Anyway, a few weeks later, while heating some sugar for priming some beer, I forgot about it on the stove and burnt it completely to charcoal. When I tweeted about that, someone asked if I was making bochet. Suitably reminded about the idea, I decided to dig into a it a bit and ran across this video of caramelizing/”burning” the honey:
Further intrigued, I decided to pilot a small batch on the stove. I used just a single pound of honey (it’s pretty heavy and a pound is less than you think) to see how it works, how much it foams, etc.
I didn’t use an open fire, and with the controlled heat of a burner, it was pretty easy to turn the honey into a dark mahogany and it developed a wonderful caramelized flavor. I pitched that honey into a concoction of Trader Joe’s juices as a test, 1 gallon batch of cider (still fermenting). While that’s still not done, I was encouraged by the results.
While I do want to make a full bochet mead, what I’m most interested in trying first is a cyser made using the “burnt” honey. My ciders have all been getting pretty good reviews from those who’ve tried them and I’d like to enter something interesting into competitions for the cider categories (in particular the MN State Fair this summer).
Today, I took the idea up to a full 5 gallon batch size and I’m really excited about the possibilities.
Here’s what I did, in a nutshell.
I took 5 pounds of clover honey, into my 10 gallon kettle, outside, over my Blichmann burner. Given how much honey foams when you boil it, I wanted to give it plenty of room. I probably would have been fine with my 5 gallon kettle, but better safe than sorry.
I lit the burner and got the honey going. I let it go until I just started smelling burnt marshmallow and then killed the heat.
In order to ensure that the honey would be able to be poured into the fermenter, I wanted to dilute it a bit, so I grabbed half a gallon of water and SLOWLY added it into the honey. If you decide to do this, be VERY careful in this step because it will bubble and spatter quite a bit as you add water. Boiled honey/sugar is like napalm if it gets on you and it sticks like glue, so be careful.
Anyway, after I added the water, it was a nice dark liquid. In the bottom of the pot and on the sides, etc. were little chunks of solid, caramelized honey. Since I wanted that dissolved, I needed more liquid.
I took one of the 4 gallons of apple juice destined for the final recipe and added it too. For most of my “off-season” ciders, I use “bottom shelf” apple juice. Anything that’s pasteurized and has no preservatives (except Vitamin C, that’s OK) works. I’ve been using the stuff I get from Costco for about $4/gallon.
That gave me enough liquid to cover nearly all of the solid chunks of caramelized honey. I lit the burner to heat it a bit and stirred until all of the bits were dissolved.
From there, it was pretty much like most of my ciders. I put the remaining 3 gallons of juice into the fermenter. On top of that, I poured the apple juice/bochet honey mixture and topped with a bit of water. If I get this recipe refined, I’d rather have that extra liquid be apple juice or apple juice concentrate, but I didn’t have any on hand.
I was tempted to add some of the things I’ve gotten used to adding to my ciders: black tea, vanilla, etc. However, when entering cysers in competition, it’s only supposed to have apples and honey as the ingredients, and I have high hopes for this one, so I want it eligible for the cyser category and not just the “Open Mead” (which is basically the miscellaneous category).
For yeast, I went with what’s become my “old standby” for ciders: Irish Ale yeast. While I really need to do some side-by-side experiments to determine for sure, my anecdotal experience says the Irish Ale Yeast compliments ciders well, so unless I have a good reason to use something else, Irish Ale it is.
I pitched the yeast and set the carboy in my shower for the first 48 hours of fermentation. As you can see in the blurry photo below, the final pre-fermentation result is really dark. It will be interesting to see how it turns out.
Last week, a series of unfortunate events led to major problems in the production environment. The mad rush to get these problems diagnosed and fixed is something that’s pretty much part of the job when you are a software developer. It usually ends up with a steady stream of visitors to the cubicle of someone who can actually move the problem forward.
During this last round, I noticed a pattern and it struck me as funny.
If you watch TV dramas, you’re probably used to a little “recap” that happens at the beginning of an episode, particularly if it’s been a while since the last episode aired. It typically starts with the phrase “Previously On…”.
That phrase kept running through my mind as I watched people join our little scrum trying to fix the production problem. Each new person would arrive and ask the same set of questions, which had already been answered 5 or 6 times over the course of the previous half hour.
When you aren’t planning on this pattern appearing, it’s irritating. The thing is, that this is pretty much the way these things always go, so it shouldn’t be unexpected.
Once you recognize the pattern, you can deal with it. When a new person joins the room, you just accept it, give the most concise “Previously On…” and move on to solving the problem. We started doing that and found that the time spent catching the new person up went much faster than when left to happen “organically”.
I’m going to have to watch more carefully the next time to see if there are ways to make this even more efficient.
Like a lot of geeks and digerati, I register a lot of domains only to discover that I never get around to using them for anything. In the spirit of spring cleaning, I’m getting rid of some to cut my portfolio down. I could just release them, but figure the people I know (even just casually online) should get first crack at them.
This list represents a batch of projects that I thought I’d get around to at some point. I am growing more and more willing to abandon such notions when it’s clear that I’m actually not going to get around to doing anything with the idea.
Then there’s the effort I’m putting into ideas that I have a much better chance of actually executing on.
Maybe you have a use for one of these domains. If you do, let me know and I’ll transfer it over to you instead of just deleting my claim on it.
BetterIcedTea.com – was going to be for a niche blog about making good iced tea instead of just using Lipton tea bags
AutodidactUniversity.com – I am largely self-educated. Wanted to build a site to help others do the same.
Chainlink.me – aimed at being a not-all-that-short URL shortener.
CraftBeerCooking.com – Intended for a blog of recipes using beer. Even started this one, but got nowhere.
EmpireOfBlog.com – Back in the days of “pro” blogging and blog “networks”, I registered this.
RepublicOfBlog.com – Same day. Same reason.
FromTheCommons.com – This was intended to help highlight content licensed under Creative Commons licenses. Used it for a bit with subdomains like photos.fromthecommons.com to highlight CC-BY photos from Flickr. Like this idea, but I never invested enough time in it.
FromTheCommons.org – Paired with the above for covering the common domains.
HowToAskAGeek.com – I get sick of the poor way people ask technical questions. They don’t include the stuff that geeks need to actually help and often include lots of irrelevant info. Was planning on writing up a guide to asking technical questions of geeks.
MakerExchange.com – Intended to be used for a StackOverflow for “maker” culture (see Make Magazine)
MovieBits.org – Was going to be a blog of movie reviews with a binary rating system (i.e. a single bit): 1 if I would pay to see it if I had it to do over again, 0 if I wouldn’t.
OpenFiction.org – Like FromTheCommons.com, intended to highlight CC-licensed fiction. Turned out to be really hard to find much of it to feature.
So, just let me know in the comments that you want the domain. First come, first served. Anything not claimed by next week will just be released to the domain pool.
Now that such magic is no longer involved, posts are looking strange. However, rather than attempting to re-invent the magic, I’m aiming to actually fix the HTML on the articles instead. That will fix the problem forever, but takes a bit longer.
So, I’m just working my way through articles to get them all compliant.
In my exploration of KnockoutJS for a variety of projects, I’ve had several instances of a tricky requirement. “Normally”, you know in advance the kind of object your AJAX/JSON search will bring back and you can template the output grid accordingly.
However, in several of my projects, I have very good reasons and situations where the results coming back will be different columns, depending on the search criteria. That means that the KnockoutJS/jQuery template that displays the data can’t go after properties by their names.
That proves tricky to figure out within the layers of frameworks involved. There are plenty of examples of how to do a procedural loop on the list of properties of a Javascript object, but that’s within a normal Javascript “foreach”, not the jQuery templates version.
A normal Javascript foreach includes the name to be used to refer to the object that is the subject of each iteration. For the jQuery template/Knockout version, that variable isn’t visible. Instead, you just see {{each Collection}}.
After a bit of digging, I finally found the information that a couple of “magic” variables are available in the loop: $value and $index. So, if you loop on a collection, the $value is the subject of each iteration. Then, if you take that a step further and loop on the non-array object, its *properties* become the collection and thus $index becomes the name of the property and $value is the value.
Combined, that lets you dig through any unknown object (at least of known depth) and create a display template for it. This works for my need where server-side plugins will determine at runtime what the “shape” of the data being returned is, depending on the inputs.
Here’s a KnockoutJS/jQuery template that displays the values out of an unknown object.
1: <script type="text/html">
2: {{each resultRow}}
3: <tr>
4: {{each $value}}
5: <td data-bind="text: $value">
6: {{/each}}
7: </tr>
8: {{/each}}
9: </script>
Here’s a version that uses the other “magic” variable: $index, which is the actual property name.
1: <script type="text/html">
2: {{each resultRow}}
3: <tr>
4: {{each $value}}
5: <td data-bind="text: $index">
6: {{/each}}
7: </tr>
8: {{/each}}
9: </script>
If you use both $index and $value (on multiple levels (which is when things get confusing)), you can build a grid out of any list of properties off an object.
Also hugely helpful is the following combination of investigation tools. You can subscribe to the changes on a portion of your ViewModel and window.alert the new data. If you first call JSON.stringify on that data, you can get a nice, JSON version of the object. Take that JSON over to the JSON Formatter and you can see it all nicely indented and organized.
I find that to be really helpful given you don’t get code completion when writing templates to display this JSON data. The formatted JSON code gives you “documentation” for working off of.
P.S. Sorry for all of the “quoted strings” in this article. It’s a bad habit, but they all seem necessary to me.
P.P.S. This is another of those kind of article where I’m as much posting this for my future self as anything else. if it helps you too, great.
So, back this summer, I yanked this site off of Wordpress and put it on a temporary solution, powered by Lucene. That appeared to work well, but cracks started showing in that setup recently. See, this site is hosted on a cloud hosting environment.
That works great for distributing load across servers. What it’s not so good at is handling changes to the files. When, like with Lucene, the data is stored directly in files within a site, as the individual servers in the cluster attempt to sync up, they get confused.
That’s what’s been happening with this site. As I updated the Lucene indexes, all would be fine for a bit and then gradually, duplicate content started showing up on the site.
I figured it was time to switch it back to being database-powered to get around that problem. I’ve converted the dominant content over and this should make it much easier to update the site. Only time will tell if that reduced friction will result in me writing more. One can hold hope, right?
The last few years, nearly every web application I’ve built has been using the MVC pattern, and pretty much all of those using the ASP.NET MVC framework. I’ve worked out some repeatable patterns that make building a certain kind of application (straightforward CRUD and similar apps) very straightforward. That’s a good thing given how often the projects in front of me line up with that pattern.
But, there’s another kind of application I’m wanting to build and being asked to build. It’s characterized with a more sophisticated UI that has “richer” interactions. While that could be steered in the direction of Silverlight, most of the time, my clients (and myself for a couple of upcoming applications) really want more devices targeted than Silverlight supports.
That points to a Javascript/AJAX powered application. However, the looking at Silverlight I’ve done has highlighted how useful the MVVM pattern is for richer client applications. Just about the time I was thinking about whether or not that pattern might work well in Javascript, I listened to an episode of Hanselminutes where he interviewed Steve Sanderson (who has done quite a bit of interesting work using ASP.NET MVC) about his MVVM Javascript framework: KnockoutJS.
The framework drives the entire UI from a “view model” Javascript object. The UI/HTML is bound to that object and any changes to either are rippled through to all other bound elements in a really elegant way.
I did a bit of digging into the framework, looking through the examples and it all just “clicked” with me. It makes so much sense for client-side heavy web apps. I’ve got some needs on client projects as well as 2 products that I’m 50% owner of underway right now where KnockoutJS is a really good fit, so I’m plowing ahead with it.
That, of course, necessitated a prototype to get myself a little bit oriented to the framework. I figured a good place to start is with an “advanced search” screen. These are screens that are nearly always asked for in apps. But, with all of the moving parts, they’re actually tricky to get right and to include everything people want.
What usually happens (at least what I’ve seen) is that most of the feature makes it in, but there’s always at least some that gets left out from the following list:
Given that that’s usually a screen that’s more tricky to build than your typical CRUD screen, I figured it would be a good prototype for me to determine how difficult KnockoutJS was going to be to work with.
I started with a database I’ve got for generating data for other databases. For instance, if you join a few tables together, you can generate random “fake” users for your site, chosen by gender, give them semi-realistic fake addresses, etc.
Part of that database is a list of cities of the world, the regions and countries they are in. So, I built an advanced search over the cities.
I used ASP.NET MVC as the back end, writing a quick Entity Framework layer over the database. The search controller action itself is pretty hacky/basic code, but it served the purpose of letting me exercise KnockoutJS.
Once I got going, I also got curious about how this might work with OData. Since KnockoutJS in my prototype (and in general) is sending data to and fro in JSON and OData lets you put a URL-addressable layer over your data on the web, I wondered if you could expose an OData service directly to your KnockoutJS client-side app and let it access the data directly.
Enter DataJS, which handles the data out of OData and makes it more digestible as JSON. So, I included a view that did a more basic search directly to the OData service, which was a little different, but still fairly straightforward.
All told, I’m really happy with how quickly this prototype came together and how well it works. This has me really excited to implement this in all 3 of the projects I’m juggling right now. If you’ve been dabbling with (or working more seriously with) rich UI Javascript web applications, KnockoutJS is something you should really check out.
If you’d like to take a look at the code for my prototype, you can download it here.
In my last post, I mentioned that I've begun running and some other exercise as part of my quest to improve my health and decrease my risk of dying early. That activity was at the top of my list because it has a high return on investment and it's something where the effort IS the result.
That's in contrast with "losing weight", where complicated factors can mean that a tremendous effort can result in no change and no improvement in the metric that correlates with the risk of an early death.
The distinction has moved "losing weight" lower on my list than it used to be.
It's also responsible for the second item on my health improvement list: brewing and drinking beer.
Based on my experience with our culture, that statement probably alarmed more than a few of you. However, I assure you that this is actually a well thought out decision, based on good evidence.
It first came up when I was searching for the most impactful ways to reduce, in particular, heart disease. The following quote jumped out at me when I was digging around:
The American Heart Association, based on the research evidence, concludes that the "Consumption of one or two drinks per day is associated with a reduction in risk of (coronary heart disease) approximately 30% to 50%."
Read that twice. If there was a new drug, from one of the major drug companies that, when taken daily, cuts your risk of dying from heart disease by UP TO HALF, they'd be shouting it from the hilltops. For aspirin, which has a large, similar effect, we *do* hear all of the time about how it will help and doctors *do* put an awful lot of people my age and older on the low-dosage aspirin. However, I've never had anyone in the medical profession even hint at these facts when it comes to alcohol and heart disease.
So, I started digging deeper and kept coming up with more and more studies related to a reduction in risk of death. This article (on a university site) serves as a really nice summary of what the complete body of scientific study on this topic says. In short, the fact that I used to abstain from alcohol on all but a few days per year was actually one of my greatest risks for dying early.
That summary doesn't just talk about the benefits related to heart disease, but a whole range of other diseases and illnesses like Alzheimer's and Parkinsons. In other words, that cliche of a 100 year old person being asked what their secret to longevity is, and answering "a daily shot of whisky/beer/sake" may not be far off from reality.
Now, while I'm frustrated that this info wasn't shoved in front of me sooner, I understand why, even though I think that the reasons don't hold up.
See, the benefits are in a weird "U" shaped curve. If you don't drink at all, you have a high risk of dying early. If you drink more than 3 drinks per day, you have a high risk of dying early (though from different things from what I understand). Only in this narrow little band of 1-3 drinks per day and only when that level is actually consistent (no saving them all up for one day), does the big benefit exist.
I know that if this recommendation were generally made, people would miss the end of the "U" where drinking more than the 3 daily drinks eliminates the benefit. I know that's true, in part, because nearly every single person I've told about the benefits of moderate alcohol consumption has made the same joke: "Then I'm the healthiest person around because I drink a lot".
In online discussions of this research, I've seen people wonder "aloud" about "all of the people those drunk drivers kill" and heard people wonder aloud how I'll "function when I'm drunk all of the time". We have a seriously strange relationship with alcohol in this country.
Keep in mind that as an adult male of my weight and height, even under the newer 0.08 BAC standards, I'm OK to drive even after 5 beers and no waiting. Given that the benefits only exist at the 1-3 drinks per day level (and are therefore my exact level of drinking), I will never be in jeopardy for a driving violation. I won't ever reach anything resembling "drunk".
So, from about 2 months ago, I've been following the 1-3 drink regimen, like most humans historically and most places on earth other than the US.
Of course, because of how I tend to do things, rather than just going to the liquor store and picking up my "prescription", I've actually begun brewing my own beer and cider, a hobby that's proving enjoyable and paced appropriately given all of the other stuff I've got going on.
It's one of the few hobbies you can be really "into" while only putting in a few hours once every few weeks. I'm on a quest to brew what I want to drink. I think I'm on the right trail.
I have never been "in shape". Sure, at various times in my life, I've been skinny, but, despite what lots of people want to make you think, skinny doesn't necessarily mean you're healthy.
In elementary school, my lifelong dislike of participation in sports really bloomed and was joined by an ankle problem diagnosed as "tendonitis". Looking back, I believe that it was probably mostly me not wanting to exercise and blowing a little pain out of proportion.
Regardless, when the other kids were running, I spent 6th grade walking instead during gym class and getting even less exercise at recess.
In junior high and high school, my dislike of exercise continued. I played a couple of seasons of basketball, and spent most of that time doing physical, hard work on farms. However, in all of those pursuits, my goal was to get them over with as soon as possible.
Up through 10th grade, every so often, seemingly randomly, we'd be asked to do the physical fitness assessment with no real preparation beforehand. Thus, while I ran a mile a couple of times a year, I never did so easily and never in any sort of reasonable timeframe.
In college, the closest I came to exercise was riding my bike to and from class (entirely because parking was too difficult), or walking around campus in my work study job doing desktop support for faculty and students.
I've gained weight, lost it, gained it again, been diagnosed with high blood pressure, high cholesterol, etc. and am coming up on my 35th birthday. I clearly need to improve my health or start facing the fact that I'm going to live a shorter life than I want.
So, I'm attempting for the Nth time to get healthy, but with a slightly different approach than in the past. Rather than just assuming that things like "lose some weight" are the right thing to do first, I am trying to do things rationally and aim for the low-hanging fruit.
When I went looking for studies and numbers to make those decisions, I found that the level of discussion of risk factors for dying early isn't in line with how those factors actually line up in order of risk.
There's a lot of digging to come up with what I did and a lot more for me to do yet that may revise this plan, but I'm working on the few that are the evidence in front of me says will deliver the greatest reduction in my early death and can be acted on immediately.
The first thing I'm tackling is to get physically fit. When I read through the literature, it's clear that a fat person who is physically fit is much less likely to die early than one who's not physically fit. Plus, the studies also make it fairly clear that virtually no one loses and keeps weight off without exercise.
So, the beginning of this long journey is to get physically fit. But, doing what?
Basically, I hate pretty much all forms of exercise. So, I approached this logically as well. Anthropologists say that before human beings invented stone tools, our primary biological advantages consisted of 2 things: our ability to strategize and our ability to walk and run all day long and wear out our target prey.
If there's one physical activity that human beings seem built for, it's walking and running. It also seems to be the very definition of "physically fit" to be able to run reasonable distances and for reasonable amounts of time. This is confirmed by the fact that the US military uses a 3 mile run (along with a couple of other things) to determine physical fitness for officers and enlisted alike right up until retirement at 62+.
As such, it strikes me as a reasonable metric as a goal. So, I'm aiming to hit and maintain the minimum for my age. I'm starting with the running part.
I started by using the plan at Couch to 5K and am actually up to running 1.5 miles at a time over 20 minutes. For a bit in the first few weeks, my shins hurt (even on my off days), but other than that, despite my current weight of 262 pounds, my knees don't hurt, etc. at all.
I believe this is due in large part to learning some proper form and no longer landing on my heels when running. See this video for the difference.
At any rate, there are a few other things I'm doing on this journey toward living better, and hopefully, I'll share more of them soon. In the mean time, I keep increasing my running time aiming at that 3 mile distance in reasonable time.
Anyone who has done web application development "behind the firewall" has been asked to put together "a basic admin screen" for managing a work queue or other basic utility task.
I know I’ve built so many of them I’ve lost count at this point. And there’s this thing that pops up over and over again as a trend: no one ever wants to spend time or money on a visual design for them.
It makes sense, really. These apps are often quickly thrown together and frequently for really temporary purposes or in situations where the goal is just getting something working to keep people moving forward on the problem these apps solve.
From that perspective, I completely get why an internal design team or outside design firm isn’t ever engaged for these kinds of projects.
Unfortunately, there’s another trend I’ve noticed on these apps that makes that disregard for visual design a problem. Rightly or wrongly, people judge these apps largely by how they look. So, while the developer is told to "not worry" about how it looks and "just put something basic together" , as soon as people start using the less than attractive version most of us developers put together, they invariably say things about the app that are less than flattering.
I dislike it, but all of the evidence says that people do judge things by how they look. Even if it works exactly like it should, if it looks clunky, users will think it *is* clunky.
Even if you, as a dev, have good design skills (and I like to think I have at least mediocre design skills), there often isn't any time to apply them to these kinds of apps. That combination of circumstances led me, quite a while ago, to look for a decent template that I could apply to all of these kinds of apps to make them look at least "decent" while not having to spend any project time doing so.
Thus began a frustrating quest.
I looked on some of the usual places I'd looked for CSS templates before: OSWD, Free CSS Templates, etc. and didn't find much. Sure, there were hundreds of blog-like templates, but nothing that really worked for the kinds of "admin" apps I get asked to build. Then I ran across Theme Forest and thought I'd finally found my solution.
They've quickly built up a pretty extensive section of exactly this kind of admin theme. And, I've bought about half of them. Really. You should see this "themeforest" folder on my hard drive. It's packed with them.
So, having bought so many of them, which one do I recommend? None of them.
Each one in turn ended up driving me nuts and proving to be very difficult to use in the very place they're intended to be used: applications.
While they look like they'd be just the thing you'd need in these situations, for whatever reason (I don't want to speculate on what's driving this reality), they're structured in ways that make building applications using them frustrating.
As a general rule, whatever framework you're using to build your app, you've probably got various bits of code responsible for generating different portions of pages. You've probably got a loop of some sort that generates the menu, etc. The problem with many of these templates is that they spread out the responsibility for a given chunk of HTML too far apart in the file.
In several cases, i tried to add a subsection or move a few things around only to discover that these templates fought me the entire way.
So, a few months ago, I took a few hours to see if I could come up with something on my own that I could share with the world. I was surprisingly happy with the results and put in a bit more effort on it, and have now used it on a couple of quick apps, ironing out kinks in the process.
The theme is called Benevolent Dictator and I'm licensing it about as liberally as you can without making it public domain. Hopefully you can get some use out of it too.
It's based on the grid framework: Blueprint CSS, which makes the modular blocks easy to size. I've tried to include a little bit of all of the common stuff my apps need, as samples, but if there are widgets, blocks, etc. that you think are missing, please let me know. There's also a version with a dropdown "mega menu" that's proving useful in one of my current projects.
The github repository for it also includes a copy of some open source icon libraries that take up quite a bit of space, so if you don't need icons, just grab the .html and .css, etc. instead of cloning the whole repository.
As I’ve gotten more and more into using my smoker to make BBQ, I started paying more attention to my side dishes. Among my favorites has always been baked beans.
Unfortunately, when I went looking on recipe sites for inspiration, I discovered that a startlingly high percentage of the baked bean recipes are little more than cracking open a can of Bush’s Baked Beans and doctoring them in one way or another with additions.
That’s fine, as far as it goes. However, I took it as a challenge to create my own recipe for baked beans from more “raw” ingredients.
The result has had several outings now and every time, these beans have been a big hit. While I don’t make them the same way every time, the basic pattern is definitely holding up and everyone at the outings I’ve brought them to says they like ‘em.
In the tradition of a lot of BBQ, I figured if I was going to make my own, they should have beer and whiskey in them. That results in some really interesting and complex flavors that I really like.
The prep time is pretty quick, but then they sit in a crock pot for 24 hours. That sounds like a long time, but it’s really the last 12 of those hours when they really transform into what you’re after.
Anyway, here’s the recipe. Any improvements and suggestions are welcome. This is for the large oval crock pot pictured above. If you only have one of the smaller, round crock pot/slow cookers, you’ll need to cut the recipe in half.
1/4 pound of bacon or salt pork
1 lb pork sausage
1 lb of diced onions
3T of diced garlic
2 lbs of dried great northern beans
1 29 oz can of diced tomatoes
1 6 oz can of tomato paste
2 cups of brown sugar (going to raise this to 2.5 cups next time)
4 cans of beer
2 shots of whiskey
That’s the general idea. From there, I usually do something different and play with it a little bit. Last weekend, when I made them, instead of the pork sausage, I used smoked pulled pork that I had in the freezer. I’ve made them with several different varieties of beer, but use Guinness most often (also works really well in beef stew). Same for the whiskey. I usually use an Irish whiskey, but have used bourbon instead and, while they taste slightly different, they all come out good.
Because I pay a lot of attention to words and phrases, contemplating the implications and meanings wrapped up in them, there are some that really upset me when I hear them. Among the most upsetting is one that seems completely innocent at first. You probably heard this one when you were young and most likely have heard it said in your company later in life.
"These are the best years of your life. Enjoy them."
This is almost always uttered toward someone in high school or college from someone at least 10-15 years older. I can't think of a single non-ironic instance where that wasn't the case. I also can't think of a case where the person who uttered it had anything but good intentions when saying so.
But, I hate this phrase and want to smack every person I hear say it.
Part of that reaction comes from some personal baggage. I kept this a secret for nearly 20 years, but when I was in high school, I attempted suicide. I put the barrel of a 20 gauge shotgun in my mouth and pulled the trigger. The only thing that saved me was the fact that the safety just barely stayed engaged.
I suddenly realized what I was doing and felt so bad about the problems I'd cause that I was even more depressed for a while, but never tried it again.
Hearing that phrase when you are so miserable you want to end your life is quite probably the most depressing thing you can hear. If true, the statement means that the moment of your greatest misery is as good as it's ever going to get.
Fortunately, that statement is crap.
Well, not 100%.
See, for the person saying it, based on their experience, it *is* true. I didn't understand this when I was young. For the person who says this, high school, college or whatever truly *was* the best time in their life and the rest has been downhill (that's sometimes even said out loud as a followup).
However, they always say it like it's a universal truth and that's why I hate it and the damage it causes. It steals hope for the future from kids like I was. It tells kids that life "just doesn't get any better", which can often be the most depressing thing a kid can hear.
I'm writing this post to counteract this phrase in whatever way I can. I'm 34 years old and I am far happier than I ever was in junior high, high school OR college. I've talked with MANY people just like me, for whom life gets better and better as they get older.
For those people and for me, those years were, in fact, the WORST years of our lives and life got so much better after they were over that you couldn't pay me to go back to re-live that time in my life.
If you're a kid who hears this said to you, don't despair. Feel sorry for the person who said it to you. Dream big for the life still ahead of you.
Whether or not these turn out to be the best years of your life is a determination to be made by one person: the 90 year old version of YOU. Your job is to make that determination as difficult as possible by making the best of every phase of life you can with what you're given.
P.S. If you are a person who says this, stop it. At best, the person you say it to will realize it just means that YOU really enjoyed that phase of life, leaving them to basically respond, "good for you", which isn't exactly great conversation. At worst, you destroy the last shreds of hope for someone who might be suffering silently, putting up a good front to fool you. I say that because when I finally shared my secret with friends and family recently, they were ALL surprised.
For my personal projects, however, I often don't have cheap/ready access to SQL Server. However, MySQL, SQLite, PostgreSQL are not only available nearly everywhere, but solutions like Amazon's RDS are based on MySQL.
Ever since hearing that Entity Framework could work over nearly any ADO.NET data provider, I decided to do a few experiments to get a handle on where the edges are with Entity Framework over, in particular, MySQL, PostgreSQL and SQLite.
As I've also been trying to get more into user group speaking and screencasting, so I took this as an opportunity to put together a quick intro to Entity Framework over MySQL. Hopefully, more screencasts of a similar nature are in the pipeline soon.
Always one to be interested when food gets mentioned, I bid on and won one of those afternoons. A few weeks ago, my turn came around and Shelly and I went over to St. Paul to make some bread.
Cooking spray (the Baking kind with flour *and* oil) a 9 inch round pan
4c flour
1/2 c sugar
1 tsp baking soda
2 1/2 tsp baking powder
1/4 tsp salt
1 stick of cold unsalted butter
2 cups raisins (optional)
1 egg
1 1/2 c buttermilk
Mix all of the dry ingredients (flour, baking powder and soda, salt) into a large bowl.
Using a pastry blender, "cut" the butter into the dry ingredients. What you're aiming to do here is slice the butter into tiny pieces and coat them with flour. The pastry blender makes this easy. You're done when the butter is in pea-sized pieces at the largest. Pre-slicing the butter into relatively small bits before putting it in the bowl helps here.
On to the wet ingredients. You use buttermilk here for 2 reasons: flavor and acidity. The flavor part is just that buttermilk has a wonderful, complex flavor in baked goods. On the acidity part, quick breads (as opposed to yeast breads) use chemical processes to provide the lift. Buttermilk is an acid and baking soda is a base, and when they come together, it's your basic 4th grade volcano science experiment.
Baking powder cheats a little bit because it includes both the acid AND the base in the same powder, but they don't come into chemical contact with each other until it gets wet (and a second reaction when it reaches a certain temperature, hence the "double-acting" on the label). Usually, they use something like a tiny amount of corn starch to keep them apart until the reaction is to be unleashed.
As baking powder wasn't invented until the middle of the 19th century, this recipe isn't the kind of traditional that goes back hundreds of years. Those would require all of the lift to come from the soda and buttermilk. However, 150 years of tradition is plenty good for me, so we go with the baking powder augmentation to help things out.
All of that is worth knowing, however, should you not have buttermilk on hand. Swapping out regular milk, for instance, won't bring any of the acid to the party, and you won't get as much lift. Dump in a teaspoon of regular vinegar and you'll put things back in balance.
Mix the egg and the buttermilk together and then add that to the dry mix. You may need more or less buttermilk depending on your flour and humidity. What you're after is a sticky, wet mass. If it pours like a batter, you've got way too much liquid and if there's dry flour in the bowl you don't have enough.
If you aren't particularly fond of raisins, leave 'em out or swap out for a handful of oatmeal or pump up the sugar beyond the half cup, and swap chocolate chips in for the raisins and make this a dessert bread.
Dump the mixture into the pre-greased pan and smooth out the top. Use a knife to cut an "X" into the top, which will help it split in an aesthetically pleasing way when it rises.
Bake for 45 minutes to an hour, until golden brown and a toothpick/knife inserted into the middle comes out clean.
Let it cool all of the way before slicing for best results.
Serve warm with butter for amazing flavor. Otherwise, it makes a great side to soup, as part of a quick and tasty breakfast, etc. Enjoy.
Then, if you looked anywhere online for how to access your setting, you almost certainly wrote something similar or identical to this:
var exportPath = ConfigurationSettings.AppSettings.Get("ExportPath");
The problem is that, while I've seen that chunk of code literally hundreds if not thousands of times, I can recall nearly NO instances where it had much of anything for error handling around it. It doesn't handle renaming, removing or otherwise mucking with the config file. This and the related problems are often referred to as the "magic string" problem. And, if you're going to take on the downsides of statically typed languages (and there are definite downsides), you might as well get the compiler to act as a first level unit tester of everything you can reasonably do so for.
For quite a while, to help with this, I've created a class in every project with properties for everything I care about in the AppSettings section. Those properties called a method with a little bit of error handling that actually hits the config file. That moved all of the strings to that single class, threw useful errors when settings went missing and generally worked, but it required adding a new setting to both the config file and to the AppSettings.cs class.
That results in code to access your settings that looks like:
var exportPath = AppSettings.ExportPath;
That was fine, but when I started using T4MVC, I knew I needed to convert my solution over to using T4 templates.
It's worth noting that T4 templates, while they sit in your project, don't exist in the scope of your project, so if you want access to your project's config file from a .tt file, you have to do some more heavy lifting than you might first think.
Fortunately, having worked with Subsonic 3.x's T4 templates quite a bit, I knew there was some stuff in there I could steal (they grab a bunch of stuff from the connection strings), and so I did.
A bit of trial and error later and now, anything that gets added to my AppSettings in the config file gets picked up when you run the T4 template (by right clicking in Visual Studio and choosing "Run Custom Tool").
If you want it for your own use, download it here. Any suggestions or improvements are welcome.
It's been clear to me that the era of the lifelong job with bi-directional loyalty was a historical fluke that died years ago, but not everyone noticed. Linchpin just spells out the logical conclusions of that reality and offers some guidance for what to do about it if you're on the short end of that particular shift.
At any rate, you'll find much more articulate reviews of the book elsewhere. What prompted this post, however, is a reference Godin makes repeatedly that struck me oddly. He refers regularly to "The American Dream", using the following definition:
"Do you remember the old American Dream?It struck a chord with millions of people (in the United States and in the rest of the world, too). Here's how it goes:
Keep your head down
Follow instructions
Show up on time
Work hard
Suck it up... you will be rewarded. As we've seen, that dream is over."
The reason is that I've never heard "The American Dream" described that way. Sure, I've heard the social contract he's talking about articulated by many people, but never with that label slapped on it.
The social contract he's talking about is one of those weird mid-20th century flukes that only really existed from the 1940's until the 1970's. Yes, that means that an entire generation or 2 of Baby Boomers and their kids saw their parents covered by that arrangement only to have it disappear as they entered the workforce.
But, I am one of them and always heard The American Dream articulated and described very differently. The understanding I've always had is far more entrepreneurial in nature. It frames America as a land of opportunity, where, despite where you come from, your social standing, your ethnicity (with some shameful exceptions), how much money you came from, etc. you can make something of yourself.
I'm curious if Seth's definition and understanding is now the prevailing understanding of the term. If so, that ambiguity in the meaning might say a lot about why many people claim to have lost faith in the idea.
However, I think that "The American Dream" is one of a class of phrases that are troublesome in a particular way.
They're common to the point of cliche, but loaded with meaning and critical to identity. As such, people all have an immediate concept or set of concepts that pop into their heads when they hear these phrases. Because they're so common, however, everyone also assumes that everyone shares their definition. That's where the trouble starts because the actual definitions vary wildly, but you'd only know that if you ask people.
I think this is what's going on here. So, I'm curious what your definition is of "The American Dream". Here's mine.
America is a land of opportunity where someone can start with nothing: no social standing, no money, not speaking the language. That person can, through hard work, build a life for themselves and their family. They can own their own home, run a business and otherwise enjoy the prosperity that this country has to offer. And, that while pursuing that dream, the playing field will be kept level.
Is my definition the same as yours?
However, it's tax season in the USA. If you work as a W-2 employee, you still have a month to get the old 1040 filled out. For those of us who own corporations, even the single-owner "S" corporations like mine, we have to get the corporate taxes filed by March 15.
The result of that whole process turns into one number representing the profit or loss for my consulting company. And, in turn, that's the amount I pay federal and state taxes on.
Planning for that is one of the biggest concerns people have when they ask me questions about being self-employed for consulting/contracting work (along with "stability" and what to do about health insurance). I have a very basic approach to the whole thing that ensures I always have enough funds to pay the taxes comfortably.
First, since I do run my consulting as an "S corporation", the finances are completely separate. If you hire me to do some work, you'll be paying my company. I have checking accounts and credit cards specifically for the business and never, under ANY circumstances, use those for personal use.
When it comes to business expenses, I only ever spend in completely above board ways. I will stand behind every business expense as being ethical to anyone who needs to care. That's a much higher standard than is generally required, but it means I never have to worry about it.
I'm sure I'm missing out on some things I could expense, but as far as I'm concerned it's not worth it. So, when money comes into the company, I pay for things like the web hosting, hardware (laptops, etc.), MSDN subscription and other software expenses, cell phone, etc.
What's left over is destined for our household. Here's where you've got to be careful. I've seen more than a few people just write themselves a check for everything and move on, only to seriously regret it come tax time.
The basic rule here is that every single dollar that goes from your company to you needs to go through one of 3 channels and taxes set aside. Either you pay it to yourself as a salary, you reimburse yourself for expenses or you pay it out as profit.
For the salary payments, regular payroll taxes will apply and payroll services are usually the best way to handle it. The IRS requires that for businesses like mine you pay yourself a "reasonable salary". I know of people who do software consulting and pay themselves $12,000 a year. That's not "reasonable" and, while they may have gotten away with it, it's not something I'm willing to risk.
However, dollars paid out as profit aren't subject to Medicare/Social Security withholding, so there's an incentive to minimize the portion that goes through as salary. I base my own salary on whatever a developer here on an H1B Visa would get paid. That's "reasonable" for one federal program, so it's good enough for me, despite typically being lower than the job pays a citizen (a topic for a whole other post).
Using a payroll service, you get a regular W-2 at the end of the year, which also makes things like applying for mortgages much easier than other forms of self-employment (it's stupid that paying myself as an employee makes it easier to get a loan, but reality is what it is). They'll send the money to the feds and any state entity that needs it.
For the reimbursement, I usually only pay for my car mileage and health insurance (since Blue Cross insists it's paid by me as an individual and not by a business). Since those reimbursements go on the corporate books as expenses, this is the only money I pay myself that I don't set tax money aside, though for 2010, I'm changing that behavior.
For any other money I pay out, I take 40% of it and put it into a specific personal savings account that I call "Tax Savings". That is its ONLY purpose. Why 40% instead of the 28% that my tax bracket calls for? Partly because I also will have to pay MN state taxes. However, this also works really well as a buffer in case I miscalculated something somewhere along the way and as a pretty good forced retirement savings plan.
When I go to pay my taxes on April 15 (and working this way, you'll always owe), I get to write a check on funds that have been earning interest instead of sitting in Uncle Sam's accounts all year. Any extra can be considered my "refund" and I usually contribute it to my retirement accounts for the previous year. Because you can make those contributions up until April 15, this also lets me reduce the amount I owe.
So, while I hate doing all of the paperwork and am never thrilled to send Uncle Sam that check, it's never a panic to figure out how to pay it and along the way I am helping out my retirement savings. Overall, I think it's a pretty good approach. Since it has those secondary benefits, I'm going to start doing the 40% on the reimbursement money too.
Since that 40% comes out immediately when I receive the money, I never really miss it, making the savings automatic and it adds up to more than you might think.
In that argument, not a week goes by without hearing from a high-profile someone in one of those industries lashing out against the Internet, "kids today", lack of respect for their creative work, and otherwise bemoaning their situation to a journalist or just any microphone within earshot.
While I have plenty of opinions about the substance of those arguments (think much more Larry Lessig than Michael Eisner if you want to know), what strikes me about nearly every one of those "creatives" is the sense of entitlement that underlies their argument.
One such incident came from the widow of a 70's rock icon who was complaining that she was having a hard time making ends meet from the sales of his CD's, some 10+ years after his death. While I always find the loss of a spouse and parent from a family a tragedy, the fact that she *has* income other than a life insurance settlement puts her in some pretty privileged company.
Every single day in this country, regular working people who put in 2000+ hours a year doing things like building houses, cooking in restaurants, managing software projects, etc. have their lives tragically ended much sooner than their years dictate. They leave behind families who may get a small sum from life insurance (after expenses and debt are covered) and face the rest of their lives with no further income from that family member.
In nearly none of those situations (union or pension situations aside) is the remaining family going to the employer and saying, "Joe worked here for 10 years, putting in fulltime effort, so you need to keep paying us his salary for the next 90 years". If they did, they'd be laughed out of the office.
I'm curious how these specific kinds of work came to be privileged above all others. Why is a poem jotted on a napkin protected for decades after I die, but if I design and commission the construction of a building, it's not in the same way? It's all so odd.
For more tweets, follow me here.
Definitely getting the MINI, but complications in the supply chain may mean a wait for what I want to be orderable.
So, when you eat dinner at 4:30, do they just send you your AARP membership packet or do you have to fill something out first?
Just test drove the MINI Countryman and think I'm gonna get one. Now the giant pile of details.
Also "glasses in about an hour" now means "glasses in 12-14 business days, with loaner lenses in 4 days".
New LASIK slogan: "You were going to spend this much on your next pair of glasses anyway."
Based on the price I was charged for new prescription sunglasses, I believe Lenscrafters may have ties to a certain Sicilian family.
My morning has been full of difficult dilemmas, like "does it look better here...or here? How about here...or here?
It's a good thing my appointment is with the eye doctor and not ear, because the concert left my ears ringing.
Back from the vet. That. Fscking. Sucked.
Thanks everyone for the condolences.
Bailey 10 years ago: http://flic.kr/p/dLGMt
Bailey got cancer, was given 1-2 months to live. 16 months later it's caught up with her. We've had her for 11 years.
Just had to make the call to put one of our dogs to sleep. This sucks.
In the waiting room getting the car fixed again. Obnoxious Bravo reality TV is blaring. So glad I have a spare set of headphones in my bag.
Guess who's really glad today that he pays for the $3.99/mo "Packrat" feature of Dropbox, which archives all old files, including deleted?
"Most people over-estimate what they can do in one year, and under-estimate what they can do in 10 years." -Derek Sivers
I'm using LINQPad so much to quickly patch together scripts that stand in for admin screens, it deserves it's own spot in the arch diagram.
Crap. Left the power adapter for my MacBook Pro at the client office. Music's now battery-bound.
Moving the rest of this day from client office to my office for some hard-core productivity. And music without headphones.
Scheduled an eye exam at the "1 hour glasses" place for Saturday. Also scheduled a MINI test drive afterward. The latter will be more fun.