tag:blogger.com,1999:blog-55347657093375527532024-03-13T14:00:45.804-04:00ihumanableusable in any place a human can be usedMatt Nowackhttp://www.blogger.com/profile/00930543505232276126noreply@blogger.comBlogger141125tag:blogger.com,1999:blog-5534765709337552753.post-61593334986972871412011-05-11T11:08:00.000-04:002013-10-31T22:44:05.585-04:00One Year Later[caption id="attachment_930" align="alignright" width="300" caption="Where I've hung my hat this last year"]<a href="http://ihumanable.com/blog/wp-content/uploads/2011/05/logo_header.jpg"><img src="http://ihumanable.com/blog/wp-content/uploads/2011/05/logo_header-300x111.jpg" alt="614 Media Group Header" title="logo_header" width="300" height="111" class="size-medium wp-image-930" /></a>[/caption]<br/><br/><p>For the last year I've worked as the <em>Director of New Media and Web Development</em> for 614 Media Group. It's a lofty title, meant to inspire all who read my email signature that, "Hey this guy is a bigshot." In reality what I did was much more mundane, I wrote LAMP applications. For the last year I've sat down everyday at this Mac, popped into TextMate, and wrote PHP. I was king of the castle, and being king is good, I got to choose my tools: Mac + TextMate + Git + MAMP + MacGDBp + GitHub + GitHub Issues + Flourish. I got to work on interesting products, if you had told me a year ago that in a year's time I would have written both a Groupon Competitor and a full CMS system, I would have told you that was crazy talk.</p><br/><p>Over the last year I have grown as a developer and as a system administrator and as someone trying to get traction for a new product and as a million other hats I got to wear. For the first time in my career I was able to go from concept to "functioning-putting-money-in-the-bank" web application. This is huge. Having been a consultant for years before this job, I spent most of my time maintaining other peoples systems, throwing in a feature here or there, coding up a new report, stuff like that. At 614 I was able to start from nothing, build up a database schema, create the framework and the code, paint it all pretty, launch, iterate, relaunch, iterate, tear my hair out, wake up to fix problems at 3am, curse the server for being slightly different than development, drink more caffeine than any human should drink, but most importantly <strong>learn and grow</strong>.</p><br/><p>With learning and growing in mind, I have an announcement to make, at the end of this month I will be leaving my job at 614 Media Group. I leave on a good note though, the software is stable and quietly humming along bringing in revenue. I am leaving behind a framework with a proven track record, a stable foundation that can be built upon. But most importantly I'm leaving as a friend and supporter of 614, wishing them nothing but the best for the future. 614's curse is that they put a lot of responsibility into your hands and if you are good at it, other people will take notice, and those other people may come in and make you an offer you can't refuse.</p><br/>[caption id="attachment_935" align="alignleft" width="245" caption="They made me an offer I couldn't refuse"]<a href="http://ihumanable.com/blog/wp-content/uploads/2011/05/gangster-movies-the-godfather-brando.jpg"><img src="http://ihumanable.com/blog/wp-content/uploads/2011/05/gangster-movies-the-godfather-brando-245x300.jpg" alt="Marlon Brando as The Godfather" title="gangster-movies-the-godfather-brando" width="245" height="300" class="size-medium wp-image-935" /></a>[/caption]<br/><p>I'm not sure how much I'm allowed to say about the new position, but I will be moving out to the West Coast this month to start a new chapter in my career. For the PHP folks out there, do not worry, I will still be rocking PHP (but also probably rocking some ruby and java as well and anything else they want me to learn). This is a big, stressful, somewhat scary decision to make, but I believe in the company that I will be joining, and after meeting with their people am nothing but excited to work with and learn from them.</p><br/><p>Growth and change are good things, they can be painful and stressful and sad sometimes, but the minute you stop growing as a developer you've given up, and I love programming too much to give up. This next month is going to be a blur of packing and moving and unpacking and learning a new area and learning a new codebase and new people and new places. Parts of it will be uncomfortable, parts will be stressful, but overall it will be a learning experience I couldn't get anywhere else, and I wouldn't have it any other way.</p>Matt Nowackhttp://www.blogger.com/profile/00930543505232276126noreply@blogger.com0tag:blogger.com,1999:blog-5534765709337552753.post-84395632186282428982011-04-19T14:08:00.000-04:002013-10-31T22:44:05.576-04:00Excel and PHP[caption id="attachment_920" align="alignright" width="380" caption="You got Spreadsheet in my Web App, you got Web App in my Spreadsheet... and it's delicious!"]<img src="http://ihumanable.com/blog/wp-content/uploads/2011/04/image.png" alt="Reese's Peanut Butter Cups" title="image" width="380" height="150" class="size-full wp-image-920" />[/caption]<br/><p><em>Note: I may seem a bit harsh on Excel, but I actually think it's an amazing piece of technology, I just don't like how people abuse it.</em></p><br/><p>Web development for business people follows a fairly predictable path. Here is a generalized form of it.</p><br/><ol><br/> <li>Business person encounters problem</li><br/> <li>Grabs Excel, Excel being the magic fix for everything</li><br/> <li>Creates abomination of a solution in Excel, it grows too large, concurrency and consistency issues creep in</li><br/> <li>At this point normally a web developer will be brought in to "Make this Excel sheet work on the internets"</li><br/> <li>Work work work work work...</li><br/> <li>Everyone is delighted</li><br/> <li>Hey is there anyway we can dump these value back into Excel?!</li><br/> <li>At some point they will use the dump to create some new spreadsheet, go back to step 3.</li><br/></ol><br/><p>Now of course it's not always this bad and normally there are really good reasons to dump things back into Excel, instead of bothering the web developer with a bunch of business analysis, they can dump the data and perform the Excel wizardry they love so much. I actually think this is a good idea, instead of me baking in calculated values or reinventing Averages and Means and all the other cool stuff Excel can already do, I just drop them off some nice raw data and let them have their business fun. They get exactly what they need, I get exactly what I want (less fragile code with less crazy business rules) and everyone is happy.</p><br/><p>Now in PHP there are various solutions to dumping out Excel. The first would be the venerable <a href="http://pear.php.net/package/Spreadsheet_Excel_Writer/redirected">Spreadsheet_Excel_Writer</a>. I've used it before and it works, it's a port of a Perl library called Spreadsheet::WriteExcel, but there are a few drawbacks. The first is that it's a PEAR module, you use PEAR to install it and it brings along all kind of PEAR stuff like PEAR_Exception and the like. The second is that on the homepage for Spreadsheet_Excel_Writer is this very happy message, "Spreadsheet_Excel_Writer is outdated and needs a complete rewrite. If you want to help with this task please get in touch with us. Otherwise we don't recommend this package for new development." So in short, we should avoid Spreadsheet_Excel_Writer.</p><br/><p>The next thing you might find in your googling is <a href="http://phpexcel.codeplex.com/">PHPExcel</a> which writes out OpenXML 2007 files. This is another large and much more well maintained library for working with Excel files. If you need any advanced features I would highly suggest looking into this one.</p><br/><p>But I want something simpler than this, I just want to dump some data out. I don't need to have all these bells and whistles. Also I hate the fact that to write out a few cells in most of these Excel Libraries requires the following.</p><br/>[php]<br/>$objPHPExcel = new PHPExcel();<br/>// Add some data<br/>$objPHPExcel->setActiveSheetIndex(0);<br/>$objPHPExcel->getActiveSheet()->SetCellValue('A1', 'Hello');<br/>$objPHPExcel->getActiveSheet()->SetCellValue('B2', 'world!');<br/>$objPHPExcel->getActiveSheet()->SetCellValue('C1', 'Hello');<br/>$objPHPExcel->getActiveSheet()->SetCellValue('D2', 'world!');<br/>[/php]<br/><p>The way these libraries work are just, ugh. They are very heavy and when you are just trying to plop some values into a spreadsheet so someone can have at them, they are overkill. I found myself rewriting the same solution again and again, it's a fancy little solution using some <tt>pack()</tt> magic that I found over <a href="http://www.dotvoid.com/2007/07/generating-excel-files-with-php/">here</a>. Here's what a simple little spreadsheet looks like.</p><br/>[php]<br/>require_once('Excel.php');<br/>$sheet = new Excel('My Awesome Spreadsheet');<br/>$sheet->label('Hello'); //Write out 'Hello'<br/>$sheet->left(); //Move the cursor left<br/>$sheet->label('World'); //Write out 'World'<br/>$sheet->down(); //Move the cursor down<br/>$sheet->home(); //Head as far left as possible<br/>$sheet->number(1337); //We are so 1337<br/>$sheet->send(); //Melt the user's face off<br/>[/php]<br/><p>This has met my needs and you can find it as a Gist right over <a href="https://gist.github.com/929039">here</a>. I wanted an object oriented way to use those functions and I wanted some help in moving the cursor around and some simple sanity checks on things so that I didn't ruin anything. It's got plenty of comments in code and should be pretty simple to pick up. You can write out labels or numbers and you can move the cursor all around, left, right, up, down, top, and home (top being the first row, home being the first column).</p><br/><p>For right now this is meeting all my needs and more, I've recently been playing around with the fact that Excel will happily turn HTML Tables into Spreadsheets, I've got a library cooking for this but have been playing around with some interesting ideas for styling and other advanced features. Until then hopefully this will help any PHP programmer who just wants to dump out some data without going into dependency hell.</p><br/><p>Happy Coding</p><br/><h2><a href="https://gist.github.com/929039">Get my handy dandy Excel Writer here</a></h2>Matt Nowackhttp://www.blogger.com/profile/00930543505232276126noreply@blogger.com2tag:blogger.com,1999:blog-5534765709337552753.post-67500256072947497192011-03-18T14:04:00.000-04:002013-10-31T22:44:05.473-04:00Fuck You Internet Explorer[caption id="attachment_907" align="alignright" width="360" caption="This is for you IE"]<img src="http://ihumanable.com/blog/wp-content/uploads/2011/03/fuckyou.jpg" alt="Girl holding sign reading "Fuck You"" title="fuckyou" width="360" height="437" class="size-full wp-image-907" />[/caption]<br/><p><em>Be Warned: This post has very little technical value, more just a rant against my most hated enemy</em></p><br/><p>I hate Internet Explorer, with a fiery passion. Normally I just code along in beautiful browsers and use cross browser CSS and JavaScript frameworks. It's gotten to the point that I can code something up in Firefox and make it pretty and go over to old IE-saurus Rex and load it up and it looks 90% of the way there and a few hacks later it's fine. You see I still hate IE, but I've ingrained in my brain somewhere what things are "safe" and will probably work in that POS browser and which will require hours of tweaking, reading, googling, hacking, gnashing of teeth, and general misery. I try to avoid the latter.</p><br/><p>So If I've developed this system to insulate myself from the misery of IE, why the hate today? IE9, that's why. I've read several reviews both positive and negative, but at the end of the day I'm not switching browsers, so I really care about one thing and one thing only, does IE9 make my job as a web developer better or worse. I've come to the conclusion that it's worse, and for that I have a lovely pile of "Fuck You" cake sitting right here with IE's name on it.</p><br/><h3>Not Available for Windows XP</h3><br/><p>First of all, IE9 is not available for Windows XP. Great, game over right there you fucking idiots. I don't think people should use 10 year old operating systems, but people are stupid, see: the continued popularity of American Idol for proof. Firefox is <a href="http://www.geekwire.com/2011/firefox-4-engineers-decided-stick-windows-xp">taking the responsible route</a> and helping these poor souls bring their browser into the 21st century even if they are fine with an ancient OS. As Firefox Engineering Director Johnathan Nightingale says about XP, "...the best metrics that we’ve got say 40 to 50 percent of the web is still on XP. That’s too big for us to just leave them behind"</p><br/><h3>Missing a metric ton of shit</h3><br/><p>IE9 is just missing a ton of stuff. Stuff that web developers care about, stuff that would make our lives easier and happier, stuff that IE9 rapes right before sleeping soundly on a pile of skulls. <a href="http://people.mozilla.com/~prouget/ie9/">Paul Rouget of Mozilla</a> makes this case, let me quote some of the juicier parts.</p><br/><h5>No CSS3 for you</h5><br/><p>Here's a list of CSS3 stuff IE9 won't support: CSS3 Transitions (for animations), CSS3 Text Shadow, CSS3 Gradients, CSS3 Border Image, CSS3 Flex box model. Great news, don't put photoshop away just yet, you are going to need 1px wide gradients and text with shadows baked in, and fuck it.</p><br/><h5>Suck it UX</h5><br/><p>Hoping you might get HTML5 History API, Drag'n Drop from Desktop, or Web Workers to speed up your applications. Not with IE9 you won't.</p><br/><h5>Not the point though</h5><br/><p>Let's not get caught up in a feature list shoot out though, because that's not the point. Let's move onto the next subject.</p><br/><h3>Fractured even further</h3><br/><p>Does IE9 make my job easier, nope not at all. Microsoft's all consuming obsession with backwards compatibility means that they won't force anyone to upgrade. While other major browsers are moving to a model of strongly-recommended / automatic background updates to keep everyone on the latest and greatest, Microsoft is still playing the game by the old rules. Now the browser landscaped is fractured even further, I have to make sure my code works in IE6, IE7, IE8, and IE9, and if I want to be really sure I should also check in IE7-compatibility, IE8-compatibility, and Quirks Mode. Microsoft has never made it easy to run different IE versions side by side, I've used several products to do this and they all work to varying degrees. Now I will have to run another different virtual machine with either Vista or Win7 so I can test in IE9. And with no / terrible developer tools for all of these browsers, well its a fucking nightmare.</p><br/><h3>Conclusion</h3><br/><p>I wish I had one. At this point the only thing I've concluded is Fuck You Very Much Internet Explorer. Here's an idea, stop already Microsoft. I don't care how good you make IE10, the fact of the matter is that since you won't force upgrades, it isn't fucking helping. The only thing you are doing is making more work for the people that actually make the web beautiful. I fucking hate you. Fuck you very much.</p>Matt Nowackhttp://www.blogger.com/profile/00930543505232276126noreply@blogger.com15tag:blogger.com,1999:blog-5534765709337552753.post-81011117811961322812011-02-02T23:44:00.000-05:002013-10-31T22:44:05.455-04:00Lipsum Lives[caption id="attachment_903" align="alignright" width="300" caption="This is how I feel right now"]<img src="http://ihumanable.com/blog/wp-content/uploads/2011/02/tired-300x199.gif" alt="Kitten passed out in food" title="tired" width="300" height="199" class="size-medium wp-image-903" />[/caption]<br/><p>I've been hard at work for the last 7 weeks, sprinting from start to finish on a custom CMS system that will manage our company's various online publications. It has been a grueling experience. When I started my friend, <a href="http://facility9.com">Jeremiah</a>, told me, you are crazy, don't do that, I'm going to hit you in the face. And yet, undeterred, I soldiered on.</p><br/><p>I was not so foolish or prideful to think that other CMS systems were inferior or stupid or ugly. I use WordPress to power this blog, and let me tell you, WordPress is friggin sweet. Drupal 7 just came out, it looks to be an amazing piece of software as well. I looked at various PHP CMS systems, but at the end of the day I decided to build my own for the following reasons.</p><br/><ul><br/> <li>I have no experience with developing for WordPress / Drupal / Insert favorite CMS here</li><br/> <li>Time was at a premium</li><br/> <li>Flexibility is a must</li><br/></ul><br/><p>Now I'm sure there are Drupal Ninjas and WordPress Wizards out there, thinking, if you need to get a flexible website up fast, just use [the CMS system I know and love] and it will be easy peasy. I'm not against learning, and I try hard to fight NIH syndrome. The long story short version of this was I was told, "5 weeks we need A, B, C, D, E, F, G and it needs to work in X, Y, Z, (several other alphabets worth of letters) ways." I knew that I didn't have the time to climb up the learning curve of a CMS and become a WordPress Guru or Drupal High Priest. I did have time to write software, and since I know PHP and <a href="http://flourishlib.com">Flourish</a> like a fat kid knows cake (aka, like I know cake), I decided that the route with the highest possible success was to write something.</p><br/><p>The next most important point is that I work for an amazing company. We are growing fast and the future is anything but certain. Ideas for the publication sites come fast and furious, sometimes radical, sometimes insane, sometimes brilliant, having total control of the software is a must. Getting something up was important, but building a solid foundation that would allow us to build new engaging features in the future was even more important. With our custom framework we will be able to pivot and experiment in a way that we simply couldn't with off-the-shelf CMS software given the engineering skills at hand.</p><br/><p>Here's what I learned building a "successful so far" CMS system. CMS systems are hard. They are really really really friggin hard. They are hard in stupid ways and hard in smart ways. Getting it just right is impossible, getting it half-way good is a tremendous challenge. Every feature is 10x more complicated than it looks on the surface and you won't know how until you talk to the person that cares about that feature. Every feature, no matter how much you talk to people while building it and no matter how much you model and poke and prod, is going to be wrong in some way. You have to simultaneously be so cocksure that you look at this mountain of a task and say, I can take this on, and humble enough to listen to bug reports, user frustrations, and endless visual tweaks so that it's actually worth using.</p><br/><p>I have a new found respect for the tremendous task software like WordPress and Drupal and Joomla and so many others try to tackle. I want to go and learn one, Drupal 7 looks nifty, just to see how the pros do it. I have also been reminded that even when you are Inventing it Here, you don't need to go NIH crazy. Building this software was an exercise in standing on the shoulders of giants. Our avatars are powered by <a href="http://gravatar.com">Gravatar</a> which easily has the most straightforward and easy API ever. Our comments are protected by <a href="http://www.google.com/recaptcha">ReCaptcha</a> cutting edge captcha technology that also helps read unOCRable books. Our email campaigns are being handled by the amazing <a href="http://mailchimp.com">MailChimp</a>. And of course the whole project is built on my favorite unframework, <a href="http://flourishlib.com">Flourish</a>.</p><br/><p>So now it's live, you can go view the fruits of my labor at <a href="http://digbatonrouge.com">DIG Baton Rouge</a>. It's the first of four sites that will be moved over to the new Lipsum CMS engine. I will spend the following weeks, tweaking, adding new features, fine tuning and bug smashing. I'm incredibly proud of what our small team was able to accomplish in such a short time. Lipsum represents a solid technical foundation on which we will build the future of our publication sites. It was not easy, but it was necessary, and I for one am glad we took the road less traveled. As Joel Spolsky <a href="http://www.joelonsoftware.com/articles/fog0000000007.html">famously wrote</a>, "If it's a core business function -- do it yourself, no matter what." </p>Matt Nowackhttp://www.blogger.com/profile/00930543505232276126noreply@blogger.com2tag:blogger.com,1999:blog-5534765709337552753.post-56806541981907670552011-01-11T22:28:00.000-05:002013-10-31T22:44:05.448-04:00Form Generator for Flourish[caption id="attachment_892" align="alignright" width="300" caption="Machines are complicated, so is software"]<img src="http://ihumanable.com/blog/wp-content/uploads/2011/01/gears-300x185.jpg" alt="Interlocking Gears" title="gears" width="300" height="185" class="size-medium wp-image-892" />[/caption]<br/><p>A while back I saw a post in the <a href="http://flourishlib.com">Flourish</a> discussion boards requesting a Form Generation system, <a href="http://flourishlib.com/discussion/2/250">see here</a>. The short discussion that follows basically argues that form generation is too subjective and although it may at some point be added to Flourish it won't be anytime soon. I work in Flourish all day, everyday, and I love every minute of it. I'm probably beating a dead horse at this point, but Flourish really is just a tremendously solid core to build off of. Working with Flourish so much and finding myself performing the same form mark-up again and again, I've given some serious thought to building a Form Generation system and have been using a prototype system for a week or two. Having built a working Form Generation system and used it for a while I want to talk about the good, the bad, and the ugly.</p><br/><p><strong>The Good</strong></p><br/><p>As a programmer there is nothing more frustrating than finding a library or an API you want to use and having it just be an absolute nightmare to integrate with. I spend a lot of time, ever since <a href="http://prosper-lib.com">Prosper</a>, thinking very hard about how to provide great APIs that make people <em>want</em> to use my software. After a lot of thought about how to go about building a Form Generator library, I've come to what I think is the right balance. The ideal API should fit well with the Flourish way of doing things, be flexible, powerful, expressive, and extensible. So without any further bloviating, here is my proposed syntax, in this example I will use a simple sign-in form.</p><br/>[php]<br/>echo fForm::post()<br/> ->add(fForm::text('Username'))<br/> ->add(fForm::password('Password'))<br/> ->add(fForm::submit('Sign In')); <br/>[/php]<br/><p>This would produce the following output</p><br/>[html]<br/><form action="http://the/current/url/" method="post"><br/> <label for="username">Username</label><br/> <input type="text" id="username" name="username" /><br/> <br><br/> <label for="password">Password</label><br/> <input type="password" id="password" name="password" /><br/> <br><br/> <input type="submit" id="sign_in" name="sign_in" value="Sign In" /><br/></form><br/>[/html]<br/><p>The API is fluid, simple, and concise. It follows the Flourish style and uses fGrammar::underscorize() to turn labels into ids. It produces clean simple markup and doesn't mangle any ids, allowing for JavaScript to be easily attached. As far as the API goes, I'm really quite happy. The other powerful thing this allows you to do is tightly integrate your Form Generation with value repopulation, for automatically refilling in values when an error occurs. With this tight integration I've been able to create a prototype system that automatically repopulates across posts when an error occurs, can use an existing fActiveRecord instance as a seed to make editing amazingly easy, and display beautiful inline errors on the form.</p><br/><p><strong>The Bad</strong></p><br/><p>Having used the prototype for a while I can say it's not all great. Simple CRUD style forms are incredibly easy to mock up, having error values persist automatically is really nice, and having inline error message (especially those from fActiveRecord::validate()) work with little fuss has been a huge speed boost. I can knock out simple pages in a fraction of the time. The problem comes when I want to do some edge case, PHP's greatest strength is easily outputting whatever markup you want, by introducing this layer of indirection you give up this inherent strength for whiz-bang features. It's still incredibly easy to output whatever markup you like, but the disparity between the automatic features the fForm library gives you and your own simple markup is stark and will bewilder a normal user. The problem here isn't that fForm lacks power, it's that it imbues certain elements with too many features and makes creating a one off element prohibitively expensive.</p><br/><p><strong>The Ugly</strong></p><br/><p>The architecture that worked best for implementing the prototype was a tangled mess of inheritance, and no matter how much I tried to refactor I still haven't found an inheritance graph that I find acceptable. Using my prototype has considerably cut down on development time, but the amount of memory used holding a object graph in memory to represent complex forms is a trade-off. The API has several inconsistencies that bother me, but don't really impact the performance or usability of the library.</p><br/><p><strong>The Future</strong></p><br/><p>So where to go from here? That's the question I keep coming back to. I want to introduce a layer between object graph and view, this way a plugin system can be used to change the rendering of elements and the form itself in a fundamental way. As soon as possible I plan on releasing a clean room open source version of the fForm library for use with Flourish on GitHub. I believe I've come up with a way to make an easily extensible widget system, now I just need to get something out the door. I will release it with my alpha framework, <a href="https://github.com/ihumanable/rigby">Rigby</a>, in the coming weeks. Comments, and of course forks, are welcome. I will release some screencasts about how to use Rigby once I get it into a stable state. Stay Tuned!</p>Matt Nowackhttp://www.blogger.com/profile/00930543505232276126noreply@blogger.com0tag:blogger.com,1999:blog-5534765709337552753.post-36580058473597525812010-11-02T15:20:00.000-04:002013-10-31T22:44:05.434-04:00Second System[caption id="attachment_883" align="alignright" width="300" caption="Just a little more to the left...."]<a href="http://ihumanable.com/blog/wp-content/uploads/2010/11/dominos.jpg"><img src="http://ihumanable.com/blog/wp-content/uploads/2010/11/dominos-300x225.jpg" alt="Cargo ship with containers crashing" title="Cargo ship with containers crashing" width="300" height="225" class="size-medium wp-image-883" /></a>[/caption]<br/><p>I've been working, both on the job and as a <a href="http://ihumanable.com/blog/2010/10/22/freelance/">freelancer</a>, right now my 9-5 is starting to enter that ever so exciting phase where one project enters maintenance mode and another project starts to spin up. The new project starting to spin up is to rewrite the CMS system that powers our various publication websites. Now for those of you not in the know, a CMS system is crazy complicated. I'm writing this current blogpost in a very specialized CMS system called WordPress, just for blogging. This software probably has had somewhere upwards of eleventy-billion man hours go into it (once you factor in themes and plugins and all that jazz).</p><br/><p>Of course whenever you are faced with a complex problem that's been <em>solved to death</em> your best bet is to look around and see if anyone has done the heavy lifting for you already. So I started looking around, WordPress, Joomla, Drupal, all mature PHP CMS systems, none that I'm familiar with even a little. I started reading, out of the three I ended up liking Drupal the best, it seems well engineered, flexible, and very stable. I read and read and read about nodes and the way Drupal thinks about content and I started to think, ok maybe we can use this. The problem is that management is used to a level a flexibility that I won't have with Drupal for months, maybe even years. They want this flexibility from the beginning and that was making using Drupal seem less and less likely. Then some requirements filtered in and out and it looks like a custom solution is going to be best... c'est la vie.</p><br/><p>Now this is in no way a slight against Drupal or Joomla or any other CMS system out there, I'm sure in the hands of Drupal Ninja or Joomla Gurus this would be easy as pie. For me though, building a solid system on my time tested and well worn toolbox of PHP, SQL, and <a href="http://flourishlib.com/">Flourish</a> will probably be the best way to deal with the constantly changing features and requirements that we need to support. Now I'm going to start building, start sketching out how things will work, how data will be thought of in the system, user models, documents, revisions, all kinds of fun stuff. It's a bit intimidating, but as a Software Developer this is really the stuff I live for, big gnarly problem, blank TextMate buffer, well known tools, get cracking.</p><br/><p>The big problem I'm fighting right now is the dreaded <a href="http://en.wikipedia.org/wiki/Second-system_effect">Second-system effect</a>. Watch out for this my dear friends, it's not a nice trap to get caught in. It works a little something like this.</p><br/><ol><br/> <li>Build a system, this is the First-system, it works, celebrate and have a shot of Jack.</li><br/> <li>That stupid "real world" comes in and messes up your data model, you add a little hack to compensate.</li><br/> <li>Oh, it has to be able to do what? No, you said it didn't have to do that!! Fine, hack hack hack.</li><br/> <li>Maybe some cleanup, probably some more hacking and bending.</li><br/> <li>You've tried your best to keep First-system shiny and new, but the shine's off the apple.</li><br/> <li>Crazy requirement, requires rewriting huge parts of the system, oh noes!</li><br/> <li>Alright, now that we know so much more let's build Second-system.</li><br/></ol><br/><p>Herein lies the danger. You get the go ahead to build Second-system, and you have all this experience from First-system, you really think you understand the problem domain a lot better, so far so good. Here's where things get hairy though, you start thinking about how you would build the system so that you don't run into the same problem First-system had, you start abstracting and abstracting, it gets more and more complicated, but you are now a master in this domain, you can handle it. Users who have been frustrated for months or years using First-system start throwing in their advice, things that have always bugged them, their nice-to-haves, and hell, you haven't built anything yet, chuck that automated-frog-boiler in your system plan.</p><br/><p>Before you know it you've got a beautiful masterpiece, it handles everything, all the problems encountered in the First-system, all the nice-to-haves, everything, it is a theoretical thing of beauty. Now all you need is 6 maybe 7 years to build it.... oh shit. But there's something even more wrong about the Second-system, it has buried in it a dirty lie, that you understand the problem domain. You probably have a pretty good understanding of the problem domain, <strong>as it stands right now</strong>. Having already tackled this problem once does not make you clairvoyant, there will be changes to the system and your system will have to adapt to those new realities. This compounds the Second-system effect, because your Second-system is almost inevitably <em>more</em> complicated than the First-system and therefore harder to change and bend and make work in that pesky "real-world."</p><br/><p>Right now I have to fight the urge to over-engineer, to outwit this problem, because I'm just not smart enough to solve this problem forever and ever into the future. So I'm going to focus on building a solid platform that let's me build out modules and snap them off when they aren't needed anymore. Something robust but <strong>simpler</strong> than the current system. Doing this will mean trading things off, it will mean making hard decisions upfront about architecture to meet our current needs but also look to the future, and this is what a good Software Developer is supposed to do. And once my current project is safely resting in maintenance mode, quietly humming along making my company money, I will begin building a Second-system and hopefully avoid Second-system effect.</p>Matt Nowackhttp://www.blogger.com/profile/00930543505232276126noreply@blogger.com2tag:blogger.com,1999:blog-5534765709337552753.post-15952194640518828092010-10-29T14:04:00.000-04:002013-10-31T22:44:05.427-04:00Auto-timestamps in Flourish<p>This will be a short post, I just wanted to share a protip for anyone using <a href="http://flourishlib.com/">Flourish</a> and in particular using the fActiveRecord ORM. fActiveRecord is pretty awesome, with it and fRecordSet I find myself very rarely having to drop down to raw SQL, although for some reports it can't be avoided and then fORMDatabase::retrieve()->query() is your friend. Anyways one of the really cool features about fActiveRecord is that it has a plug in module based off of hooks and I wanted to pass along something that I've started doing as a convention that's worked out really well for me.</p><br/><p>I like all of my model classes to have a <tt>created_at</tt> and an <tt>updated_at</tt> timestamp that automatically do the correct thing to provide a very basic audit trail. This does not let you off the hook for doing actual auditing, but it is a nice way to do sanity checks and get some instant information about records. fActiveRecord makes this pretty easy to do, let's dive into some code.</p><br/>[php]<br/>class someModel extends fActiveRecord {<br/> /**<br/> * The fActiveRecord class provides the configure function to let you set-up Active Record hooks. Let's do that now<br/> */<br/> protected function configure() {<br/> fORMDate::configureDateCreatedColumn($this, 'created_at');<br/> fORMDate::configureDateUpdatedColumn($this, 'updated_at');<br/> }<br/>}<br/>[/php]<br/><p>Easy as that you now have your <tt>created_at</tt>s and <tt>updated_at</tt>s working great for the someModel class. Here's the cool part though, because boilerplate code is stupid ugly code, if you want to use this across your project simply do the following.<br/>[php]<br/>class ActiveRecord extends fActiveRecord {<br/> /**<br/> * For this project every model should record created_at and updated_at<br/> */<br/> protected function configure() {<br/> fORMDate::configureDateCreatedColumn($this, 'created_at');<br/> fORMDate::configureDateUpdatedColumn($this, 'updated_at');<br/> }<br/>}<br/>[/php]<br/><p>Now when you need to create a new model simply extend <tt>ActiveRecord</tt> instead of <tt>fActiveRecord</tt> and auto timestamps are done.</p>Matt Nowackhttp://www.blogger.com/profile/00930543505232276126noreply@blogger.com0tag:blogger.com,1999:blog-5534765709337552753.post-26760977726828407252010-10-22T10:35:00.000-04:002013-10-31T22:44:05.412-04:00freelance[caption id="attachment_875" align="alignright" width="300" caption="I\'m not sure what this has to do with Freelancing, thanks Google!"]<a href="http://ihumanable.com/blog/wp-content/uploads/2010/10/freelance_taxesdeductions.jpg"><img src="http://ihumanable.com/blog/wp-content/uploads/2010/10/freelance_taxesdeductions.jpg" alt="House made out of $50 bills" title="freelance_taxesdeductions" width="300" height="300" class="size-full wp-image-875" /></a>[/caption]<br/><p>I've been hard at work making sure that <a href="http://faveroo.com/">Faveroo</a> keeps humming along, pushing out new features here and there and making sure everyone is happy. The growth we've seen has been steady and we are continuing to push forward. Work has been a little hectic lately, if anyone ever tells you that growing a product and a brand is easy, you just punch them right in the face, I don't care that it's your Grandma, do what I say, I'm a blogger. Anyways this blog post isn't about my 9-5 it's about my 6-10.</p><br/><p>I do a lot of cool side projects, some of them like <a href="http://prosper-lib.com/">Prosper</a> are just for fun, they scratch an itch I have and I think I might be able to use them later. Some never see the light of day, they lose momentum or turn into something that I can't figure out how to make any money or help anyone with so they just languish on my hard drive. Lately I've been trying to break into the freelancing stuff, I thought, how hard could this be, I have years of experience, I'm willing to work for a reasonable price, I write high quality code really fast, and I tend to think that I'm a fairly nice person to work with. Well its been an uphill battle so far, but I want to share my thoughts with you.</p><br/><p><strong>Online freelance boards just suck.</strong> They do, I hate you, I hate them, hate is really the only emotion I can feel about these boards. 90% of the posts are for ridiculously ill-defined or impossible jobs, 99.999% of the replies are someone in some third world country willing to write the new facebook for a shiny new nickel, and there is no way to get the point across to anyone that <em>you get what you pay for</em>. I've yet to find any useful paying work from these sites.</p><br/><p><strong>Craigslist is a mixed bag so far.</strong> When I started on this journey I got some help from <a href="http://facility9.com">a friend</a> who basically just spammed me with every blog post they could find on the subject of freelance consulting. <a href="http://news.ycombinator.com/item?id=1759653">A nice thread on Hacker News</a>, here's a <a href="http://ryanwaggoner.com/2010/10/how-to-become-a-freelance-web-developer/">Two</a> <a href="http://ryanwaggoner.com/2010/10/how-to-be-a-freelance-web-developer-part-2/">part</a> series by Ryan Waggoner on freelancing. One of the pieces of advice was to use Craigslist, so I tried that, there is a ridiculous volume of stuff in the Computer Gigs section, and since you aren't constrained by geography you can apply to a huge amount of them. I tried this for a few weeks but after sending out tens of emails, most custom written specifically for the project and only receiving one reply, I decided to try another avenue. I'm not giving up on the Craigslist approach yet, if for no other reason then the absolute mass of postings there.</p><br/><p><strong>Friends of friends.</strong> Right now this is where I've seen my only success. I'm currently working on a project for a friend of a friend and so far things are looking great. I'm enjoying the work, sweet lady PHP with my favorite unframework, <a href="http://flourishlib.com">Flourish</a>, and I'm making great progress. It's been a good project to work on so far, the client has been great to work with, and the code has been flowing. I'm sure there's a downside to to this course, friends of friends will want you to do extra work for them for free or change things up as a solid, but so far so good.</p><br/><p><strong>Future plans.</strong> This blog post is part of it, but basically some self-promotion is in order. I'm going to be putting together an online portfolio of stuff I've done, <a href="http://proser-lib.com/">Prosper</a> is a nice large code base for someone to look at to see the quality of my PHP code. I realized I just need to get my name out there as an option, the current project I got was because I happened to tell my friend I'm trying to start consulting on the side, bam, first paying gig. I'm going to keep fighting the good fight on Craigslist, maybe come up with a more efficient system for submitting my name into consideration for postings.</p><br/><p>If you need a good PHP programmer drop me a line in the comments or send an email to <a href="mailto:ihumanable@gmail.com">ihumanable@gmail.com</a> and maybe I can write some awesome code for you.</p>Matt Nowackhttp://www.blogger.com/profile/00930543505232276126noreply@blogger.com3tag:blogger.com,1999:blog-5534765709337552753.post-68308072233923233982010-10-04T12:33:00.000-04:002013-10-31T22:44:05.402-04:00sanity please<p>I'm sure this tale of woe will be shared by many of my web development colleagues, it has to do with Facebook. As a web developer I have to pay a Facebook Tax, Facebook has an API (I think they might be up to their fourth API now) and they have 500 million people, and so management everywhere wants their product to integrate with Facebook. Here's the problem, Facebook fucking sucks at documentation.</p><br/><p>There are as far as I can tell at least 4 competing technology stacks going on over at Facebook: FBML, Javascript SDK, Old REST API, and Graph API. There could be more, some of those might not be fully APIs and are just components, I'm not really sure. I've been reading the pages at <a href="http://developers.facebook.com/">the official documentation website</a> for weeks now trying to wrap my head around this thing. Maybe it's just me, maybe I'm dense or something, but I can't seem to figure out what the fuck is going on or what I should be using.</p><br/><p>Here's a great example, let's say you want to integrate Facebook Connect (if that's still a thing, I'm not really sure), but more succinctly you just want to allow users to sign in using Facebook as their identity provider. How are you supposed to do this. Well there is this section on <a href="http://developers.facebook.com/docs/guides/web#login">Single Sign-On</a> that looks promising. But then later on if you follow the link to learn more about the Graph API you will find a section about Authorization that will lead you to <a href="http://developers.facebook.com/docs/authentication/">this page on Authentication</a> which I think is showing you how to do the same thing, maybe.</p><br/><p>The problem seems to be too many ways and pages explaining the same thing or slightly different things, I just want one canonical authoritative place to look that says, "This is the API you <strong>MUST</strong> use for Authentication." I don't think that is asking too much. But I'm sure once I finish my primer on <a href="http://tools.ietf.org/html/draft-ietf-oauth-v2-10">OAuth 2.0</a> and figure out how the extended permissions works it will all be more clear.</p><br/><p>The API could be forgiven for giving you more than one way to skin a cat, if it then gave you specific details on how this stuff actually works. Let's say I want to build a website that displays events and then let's people use my website to mark themselves as attending that event in Facebook, is that possible... I have no idea. <a href="http://developers.facebook.com/docs/api#publishing">Here's a section of the Graph API about Publishing data to Facebook</a> and it might be in there somewhere, but I can't tell. I guess I'll have to play around with how this supposedly RESTful API works when I have some state, maybe if I've successfully negotiated an OAuth Secret Consumer Token UID then I can call /EVENT_ID/attending and that will mark me as attending the Event with EVENT_ID, it seems to make sense a little bit, but the extremely helpful description of "attend the given event" and the arguments of <em>none</em> make me have to play around to figure it out.</p><br/><p><a href="http://www.sethcall.com/blog/2010/09/30/facebook-api-does-not-care/">Seth Call</a> is similarly frustrated and makes a very nice detailed case for why the Facebook API is so woefully inadequate. I couldn't agree more, and I hope that help is on the way.</p><br/><p>The problem I'm running into now is frustration and discoverability. There doesn't seem to be a particular flow to these documents, they are just disparate documents hyperlinked together in no particular order. I'm new is there a tutorial or common use case section, maybe somewhere buried 9 links deep. If you are going to embrace and extend then at least have the common courtesy to make our lives easier as you try to take over the world.</p><br/><p>Facebook seems to have too many developers working in the API space not communicating, the "Old" and "New" APIs overlap in some areas and miss each other in other areas, there's no definitive answer on when support will end for any of the "Old" APIs, is it safe to use the "Old" REST API for functionality the Graph API doesn't support or will they turn off the tap at some point. When trying to navigate through the documentation it just feels like they made someone do a braindump and didn't try to organize it in any fashion.</p><br/><p>Well I'm going to head back in because with the draw of 500,000,000 potential users we can't afford not to pay the Facebook Tax, which is a real shame considering how shitty the Tax Code they published is.</p>Matt Nowackhttp://www.blogger.com/profile/00930543505232276126noreply@blogger.com0tag:blogger.com,1999:blog-5534765709337552753.post-20757493875362368302010-08-31T15:02:00.000-04:002013-10-31T22:44:05.394-04:002 months[caption id="attachment_864" align="aligncenter" width="590" caption="that\'s a pretty sweet logo"]<a href="http://ihumanable.com/blog/wp-content/uploads/2010/08/header.jpg"><img src="http://ihumanable.com/blog/wp-content/uploads/2010/08/header.jpg" alt="Faveroo Logo" title="that's a pretty sweet logo" width="590" height="96" class="size-full wp-image-864" /></a>[/caption]<br/><p>On June 3rd I typed the following into my Terminal.</p><br/><pre><br/>mkdir faveroo<br/>cd faveroo<br/>git init<br/></pre><br/><p>On August 15th I typed the following into my Terminal.</p><br/><pre><br/>cd ~/src/faveroo<br/>php deploy.php production<br/></pre><br/><p>Then I watched and held my breath as my carefully crafted deployment script worked its way through 2 months of code and pushed them across the line. Then I fired up my browser and went to <a href="http://faveroo.com">http://faveroo.com</a> and waited for the now familiar homepage to show up... I'm sure it took less than a second to load, but it seemed like an eternity, finally it was up. I worked for the next few hours exercising the application through all its various operations, squishing little bugs here and there that popped up from being in a different environment. Two months of development, and finally it was live, and it actually worked. A few hours later we started hooking up people with sweet deals and putting money in the bank, mission accomplished.</p><br/><p>Faveroo.com is my first project at my new job at 614 Media Group. It was a skunkworks project up through the end of July, so I couldn't come to this blog and talk about it. I did all of the coding for Faveroo and my colleague Jeff Guciardo did all the design work to make it look so pretty (it's probably the prettiest thing I've ever had the opportunity to create). The basic premise of the website is that our team of dedicated sales people go and find great local deals, then we throw them up on Faveroo.com, and then we help people save some cash. When you buy a Faveroo you save some money, the business makes money, we make money, and 3% of the sale automatically goes to charity, it's win-win-win-win. But I'm neither marketing nor sales, so I will stick with what I know and what I knows is tech, so let's talk about that for a minute.</p><br/><p>Faveroo is a PHP website that includes the public frontend, a private backend, and a series of maintenance scripts that make sure everything works like clockwork. When I was starting up the Faveroo project I was given carte blanche as to how to build it. All of our other web properties use the classic LAMP stack, so to keep operations fairly sane and because I deeply love PHP, I decided to build out Faveroo on a classic LAMP stack as well. The code is Object Oriented, nearly MVC, PHP 5.2 code. I looked around, had been for a long time, at various PHP Web Frameworks. I had just come off of working with rails on a side project and so I knew the joy and frustration of work with a framework.</p><br/><p>As you may be aware, I'm crazy in love with <a href="http://flourishlib.com">Flourish</a> and decided that I would use it as a major component. I have been a fan of Flourish for a while now, probably over a year, but this was the first big application I was going to use it on, and really the first large scale from scratch application I have ever written. Now don't get me wrong, I'm no rookie to this slinging code stuff, I've maintained huge legacy applications, built middle-ware up from nothing, and even rewritten large applications to the point that almost all of the original code has been replaced. But this would be the first time that if I didn't like something in my code, it was because I was the stupid jack-ass that made such a boneheaded decision. Well, not the first time, but the first time I couldn't easily blame someone else ;)</p><br/><p>I want to say that the decision to go with Flourish is probably what made the rapid turn around time possible. It's a wonderful library that helps you do things right but doesn't force you to do anything you don't need. The thing that amazed me as I used it is I started off only wanting to pull bits and pieces, maybe some fCryptography here and a little fMessaging there, but as I got familiar (and boy howdy did I get familiar) with the docs, I just found more and more amazing functionality and a beautifully coherent system. Flourish was clearly written to be used, and by the end of the project I found I was using almost every class. It's clearly a tool written for real world use from real world experience.</p><br/><p>Flourish and jQuery are really the 2 big external dependencies for Faveroo, the rest of the code was written by me. I found this minimal system worked very well for me. I wrote a router in about 100 lines of PHP code, it's nothing earth shattering but I think it has a few novel ideas. I've since built a new version of this router that is shorter and has less complex code paths. At some point in the future I may try to make a more generic version of this router and release it open source. All of the model classes are fairly straightforward using the excellent fActiveRecord as a base.</p><br/><p>I spent about a week spinning up my minimalist framework, but it paid off big. I knew how the system worked every step of the way, and more importantly, I could alter it in minor ways to achieve dramatic results. All of this is possible with established frameworks, but here I got away without having to climb up a learning curve. This gave me more time to understand the problem domain and to learn how to best use Flourish.</p><br/><p>With this experience under my belt I'm looking forward to continuing to learn, and hopefully to contribute back to, Flourish and PHP development in general. This project has shown me that in 2 months I can go from nothing to cash hitting the bank account. I feel reinvigorated to make cool things that add value to people's lives and reassured of my abilities as a programmer. After a long period feeling burned out and wasted, I remember why I love programming, and why I love creating, and why this is the only thing I can ever see myself doing.</p>Matt Nowackhttp://www.blogger.com/profile/00930543505232276126noreply@blogger.com0tag:blogger.com,1999:blog-5534765709337552753.post-9165552173451630692010-08-05T11:18:00.000-04:002013-10-31T22:44:05.380-04:00Flourishing[caption id="attachment_859" align="alignleft" width="204" caption="Flourish\'s sweet logo"]<a href="http://flourishlib.com"><img src="http://ihumanable.com/blog/wp-content/uploads/2010/08/header_logo_beta.gif" alt="flourish logo" title="header_logo_beta" width="204" height="70" class="size-full wp-image-859" /></a>[/caption]<br/><p>Looks like my claim of writing fast and furious didn't come to pass, oh well. For the last few weeks I've been working on a hush hush project for work. It's not done yet but we are nearing the end of the road for the MVP to be released soon. I wanted to write a quick update to discuss what it's been like getting back on my developer feet after burning out.</p><br/><p>First off I'm engaged in my work again. For months I had felt disconnected, on autopilot, just trying to get through the day and hit some milestones. Secondly, I enjoyed playing cowboy for a while but have cone to realize that not all the habits I picked up in Corporate America were bad. Thirdly, I'm back to getting serious amounts of work done and am solving interesting problems.</p><br/><p>Enough touchy feely hippie bullshit, let's get down to some business. I've been building a largish scale php application for the last couple of weeks and I wanted to reflect on the process.</p><br/><p>I started off looking at various php frameworks a few weeks before starting this new project. I had kept an ear to the ground in the php framework area since forever so I knew the big players. I had also dabbled in some ruby on rails so I knew the bliss of when a framework gets it right, and the frustration of running up against something you would have done differently.</p><br/><p>I looked into several frameworks <a href="http://cakephp.org/">CakePHP</a>, <a href="http://www.symfony-project.org/">Symfony</a>, <a href="http://framework.zend.com/">Zend Framework</a>, <a href="http://fatfree.sourceforge.net/">Fat Free PHP</a>, <a href="http://www.yiiframework.com/">Yii</a>, <a href="http://www.noloh.com/#/home/">Noloh</a>, and <a href="http://www.recessframework.org/">Recess!</a> to name a few. They were all quite interesting but they all felt oddly foreign. Imagine if ruby on rails came out and it was a port of .Net web forms for ruby, blech. All the frameworks I looked at felt like they were trying to pave over PHP and make it into ruby lite or .Net lite. Each one was well put together on the whole and with some effort I'm sure I could have become proficient in any of them. Then I remembered an old friend I had played with before, Will Bond's unframework <a href="http://flourishlib.com">Flourish</a>.</p><br/><p>If you haven't taken a look before I urge you to <a href="http://flourishlib.com">do so now</a>. Flourish is exactly what PHP needs, a strong core of classes geared toward common web tasks, with an eye towards simplicity, security, and consistency. After having used Flourish for a few weeks I can do nothing but sing its praises. Let me say that working with the combination of Flourish + PHP is a completely different experience than just writing PHP. Flourish gives you a sane construct around which you can build high quality applications. Here's a list of things Flourish provides:</p><br/><ul><br/> <li>Cross Database support for DB2, MSSQL, MySQL, Oracle, PostgreSQL, and SQLite</li><br/> <li>An extremely good ActiveRecord implementation</li><br/> <li>Filesystem with psuedo-transactions</li><br/> <li>Safe consistent handling of Requests</li><br/> <li>Session handling with special resources for Authentication</li><br/> <li>Classes for creating HTML including a quality Templating mechanism</li><br/> <li>Great Utility classes (think ActiveRecord rails people)</li><br/> <li>Amazing Email support</li><br/> <li>Classes for handling Dates, Numbers, and Money</li><br/> <li>High quality Exceptions and Handling Facilities</li><br/></ul><br/><p>The thing that you will notice with <a href="http://flourishlib.com">Flourish</a> is that it's a library that's seen real world use. It provides a high quality core but understands that it shouldn't try to be everything to everyone. The components interoperate nicely but you also function in isolation quite capably. It truly hits all the high points you would want from a library, but there is even more.</p><br/><p><strong>DOCUMENTATION:</strong> The Flourish documentation is some of the best I've ever seen. There is full PHPDoc for every class, which is nice, but more importantly there is "Class Documentation" that explains how the class is intended to be used, with code examples to get you started. The documentation is written very well and is incredibly in-depth. You could sit down and read it like a book, it's that good.</p><br/><p><strong>COMMUNITY:</strong> The Flourish discussion boards are active and I have never seen a posting go unanswered. Will Bond himself usually answers within a few hours of your posting, I know he has more than once helped me fix some tricky bug or better explained how something worked to me. The ability to reach out and communicate with the author is amazing, it also makes you want to provide support for the project.</p><br/><p><strong>CONSISTENCY:</strong> The Flourish API is amazingly consistent. I keep finding myself saying, "That's how I would have written it" while using it. If you learn how fCookie works, you know how fSession works, and you even know how fRequest works. Flourish simplifies things to the point that it's worth it to go the extra mile to add a bit of security to your code, because it makes it dead simple. Then you look back and realize that it also has helped you write self-documenting code, and jesus, did it just fucking cut my lawn too, what the hell?</p><br/><p><strong>SECURITY:</strong> As I alluded to earlier, Flourish encourages writing secure code. Flourish takes security seriously enough to have <a href="http://flourishlib.com/docs/Security">an entire compendium</a> on just that topic and how it relates to PHP. My code is definitely more secure now that I use Flourish, from better security in parsing Request variables, to easily preventing Cross Site Request Forgeries, Flourish has you covered.</p><br/><hr><br/><p>Ok, so I didn't really expect this to turn into a huge love fest about how much I love <a href="http://flourishlib.com/">Flourish</a> but that's where we are at. I want to over the course of a few blog posts really explore Flourish. I haven't fully figured out what format these are going to take, but if you are a PHP developer who wants to take their code to the next level, stay tuned.</p>Matt Nowackhttp://www.blogger.com/profile/00930543505232276126noreply@blogger.com2tag:blogger.com,1999:blog-5534765709337552753.post-49918210502218150292010-06-25T06:00:00.000-04:002013-10-31T22:44:05.367-04:00Out of the world[caption id="attachment_853" align="alignright" width="400" caption="This smarmy bastard\'s finally come back to Ohio"]<a href="http://ihumanable.com/blog/wp-content/uploads/2010/06/sun.jpg"><img src="http://ihumanable.com/blog/wp-content/uploads/2010/06/sun.jpg" alt="The sun" title="sun" width="400" height="387" class="size-full wp-image-853" /></a>[/caption]<br/><p>I've been out of the world for a little while, approximately 40 some days. I unplugged from a lot of things to focus on some big changes in my life. There was a kind of, cliche alert, perfect storm of events that made me feel like dropping off the grid for a while and just relaxing.</p><br/><p>First off, this blog, which brings immeasurable joy to so many (for free I might add, actually the hosting costs me money) got 1337 h4x0rz pwned. You see I made this mistake where by I tried to express myself... foolish bastard that I am. Someone decided that all the good will and popularity I had generated through months of concerted effort and promotion would be better used to sell some scummy fake AV software. I quickly fired up my ftp and an editor to find out what was going on, I was able to detect the hack right away (normally don't have giant evals at the top of my pages), some quick regex work and I was able to disable the attack within less than an hour of detecting it. But I had been compromised, and even though I had been able to address the immediate issue steps needed to be taken to protect my blog and the fine people that come and read it. I decided to take it down until I could get it cleaned up properly. I felt terrible, but I had taken steps to prevent such a hack from occurring, I couldn't figure out what had happened. <a href="http://smackdown.blogsblogsblogs.com/2010/05/13/hosting-with-godaddy-might-want-to-rethink-that-decision/">Then I saw this</a> and realized that is exactly what had happened to my site. I felt a little bit better that this wasn't my fault and I wasn't alone.</p><br/><p>The second major thing is that I quit my job. I worked at HMB for just over 2 years, and I learned an immense amount, worked with some of the best people I've ever met, and went from Ramen Noodles on milkcrates to my comfy house and filet mignon (if Burger King is still putting filet mignon in their hamburgers). It was a fantastic place to work right out of college but towards the end I felt like it wasn't where I wanted to be in life. I found an opportunity to go work for a young media company in town that needed an experienced PHP programmer to take over for their "web guru." I'm incredibly happy to report that I took that opportunity and am currently running with it.</p><br/><p>The third major thing is that I was burned out. My last project at HMB was difficult, difficult for me personally in every way I can think of. I realized near the end that I was at my breaking point, I was frustrated, angry, and plain unhappy. I felt like I had nothing left to give, I felt completely worn down, and I knew that something would have to give.</p><br/><p>That's where I found myself a month and half ago, in a strange position where I was frazzled and broken but ahead of me sat this golden opportunity. I decided that I would unplug, unwind, and rebuild. I had become that proverbial Windows XP box with the 2 years expired Kapersky that was slowing to a crawl. My hardware was fine, but I needed to reformat (preferably with Ubuntu or maybe into a Hackintosh) and recover. One of the things that went on the chopping block was blogging, not intentionally at first, but once I stopped, well an object at rest tends to remain at rest...</p><br/><p>I'm happy to announce with the relaunch of this blog that the "reformat" worked. What you see before your eyes is a fresh WordPress 3.0 install (with all the old content recovered from my numerous backups), a visual reboot (this is an out of the box cleanr right now, I'm planning on adding my own personality in gradually), but most importantly, a happy blogger typing. I've spent the last month and half settling into my new job at <a href="http://614mediagroup.com">614 Media Group</a>. I'm not sure what my title is, on one piece of paper it says Web Guru, which I don't much care for, I've seen and heard "Head of Web Development and New Media" which I like, even though its a bit wordy. I can tell you though that I'm in charge of PHP development (along with iPad and iPhone development to come) and that I'm loving it. I have a swanky new office, I get to work in TextMate and git and PHP all day, it's a dream come true. I work with friendly, hip, funny people. I'm still finding my place there, but I have already figured out it's where I belong. For the first time in a long time, I'm building things, and it feels so good to build again.</p><br/><p>I'm not really sure what else to put in this post, I plan to start up the blogging again, refreshed and reinvigorated. You can expect to see a heavier focus on PHP and Cocoa, but I will still go off on my other loves, Ruby, LISP, JavaScript, and probably fall in love with some more. And even though I'm happy and contented I will still have amusing rants (just ask <a href="http://wearesomethingelse.wordpress.com">Heather</a> if you don't believe me.) I haven't decided how much I'm going to blog yet, I'm hoping for a couple posts a week, but I'm sure I have plenty of topics to cover from the time I was gone so it might be coming a bit fast and furious for a while.</p><br/><p>In conclusion I just want to thank all the people that helped support me when I wasn't feeling at my best. My wonderful girl Heather, my dear friend <a href="http://facility9.com">Jeremiah</a>, my family, and so many others. I also want to thank HMB for giving me a place to grow and learn, I'm still proud of the work I did there and proud of the work they do. I'm sorry I was gone for so long, if you come back and give me your eyeballs I hope to open them a little and maybe make you smile.</p>Matt Nowackhttp://www.blogger.com/profile/00930543505232276126noreply@blogger.com2tag:blogger.com,1999:blog-5534765709337552753.post-50303203959986945602010-05-07T04:32:00.000-04:002013-10-31T22:44:05.362-04:00stir trek[caption id="attachment_844" align="alignnone" width="539" caption="They are watching Iron Man 2 this time, but kept the Stir Trek name"]<img src="http://ihumanable.com/blog/wp-content/uploads/2010/05/stirtrek.png" alt="Stir Trek 2010: Iron Man Edition" title="stirtrek" width="539" height="250" class="size-full wp-image-844" />[/caption]<br/><p>This post is a little bit late but c'est la vie. I will be talking at Stir Trek today about all the new goodness baked into the latest release of jQuery, version 1.4. I'm taking a page from this very cool <a href="http://apirocks.com/html5/html5.html#slide1">HTML5 Presentation</a> and have decided to skip the normal PowerPoint and do the whole presentation in HTML5. It was actually quite easy to do and since I'm showing off jQuery I can have live demos in my slides, so no fumbling between PowerPoint and a browser. I used the <a href="http://apirocks.com/html5/html5.html#slide1">HTML5 Presentation</a> as a template so you will notice that the look very similar, I've kept their stylesheet and their slide javascript. The presentation is functional in most modern browsers but is definitely fine tuned for Google's Chrome browser.</p><br/><p>My presentation tries to be a quick redux of the information found at the <a href="http://jquery14.com">jQuery 1.4 Launch Site</a>, specifically the great introductory series jQuery 1.4 Hawtness by the very talented Paul Irish. I took the javascript code examples from the jQuery 1.4 Hawtness videos and built functioning demos around them to better illustrate how they work to an audience.</p><br/><p>Keeping in the spirit of my open-source free-love hippie nature, the presentation is completely free for anyone to use. You can find the full source of it <a href="http://github.com/ihumanable/stir-trek-2010-jquery-14">on github</a>, feel free to download it or fork it and make it better. Well I'm going to go run through the things I plan on saying for the next couple of hours, so pardon the brief post. It's been an interesting time in my life recently and once everything settles down I'll have some big news for everyone, so stay posted.</p><br/><p>Edit: Realized that I can host whatever I want on my domain so instead of just linking to the source code on github I can actually host the presentation on this server. If you want to check it out go to <a href="http://ihumanable.com/jquery/presentation.html">http://ihumanable.com/jquery/presentation.html</a>, remember it works best in Chrome but should work ok in other modern browsers, for IE users you will have to load up Chrome Frame.</p>Matt Nowackhttp://www.blogger.com/profile/00930543505232276126noreply@blogger.com0tag:blogger.com,1999:blog-5534765709337552753.post-46921706149756713042010-04-12T10:34:00.000-04:002013-10-31T22:44:05.356-04:00saying nothing[caption id="attachment_838" align="alignright" width="326" caption="Thank you, very helpful"]<a href="http://ihumanable.com/blog/wp-content/uploads/2010/04/error-dialog.png"><img src="http://ihumanable.com/blog/wp-content/uploads/2010/04/error-dialog.png" alt="Dialog saying "Error: An Error has Occurred"" title="error-dialog" width="326" height="116" class="size-full wp-image-838" /></a>[/caption]<br/><p>As a software developer I have the great joy of making things that piss people off. Nothing makes someone angrier than after an hour of meticulously entering financial data, you hit the submit button and get back the error pictured to the right. In actuality, good software developers go to great pains to make their systems as resilient as possible. A large amount of the code written for any complex piece of software will be dealing with error conditions, recovering from the recoverable, and gracefully reporting fatal errors in a way that indicates exactly what happened and why and what to do about it.</p><br/><p>One of the best features an error message can have is Google-ability. If the error has a prominent and distinct feature, then a Google (insert your favorite search engine here) Search will be able to deliver relevant results with a much higher degree of accuracy.</p><br/><p>Good Error Message Example:</p><br/><blockquote><br/><tt>Error ERS1708A - Invalid Character<br/>The field "Zip Code" should only contain numbers, "47CD101" is invalid.<br/>Examples of valid input: 44130, 90210, 43220</tt><br/></blockquote><br/><p>Bad Error Message Example:</p><br/><blockquote><tt>Form Invalid!!</tt></blockquote><br/><p>The first error might be a little overkill, but the first part meets are Google-ability test. Typing <tt>ERS1708A</tt> into Google will pull up solutions for this problem. The error goes on to report exactly what went wrong in a user friendly way, it even goes so far as to give some samples of what correct input looks like. The second example gives you a vague idea that something bad has happened, something dealing with a form, and if that form happens to have 100 fields on it, well good luck figuring it out (maybe it's even one of those awesome programs that will clear your entire form on error). The problem is that you are equally likely to get either of these error messages from the same input depending on how much effort the programmer put into error recovery and reporting.</p><br/><p>We all know that we should strive to help out the end-user and give them good error messages (even better if we can have robust recovery so we don't have to report errors). The problem is that programmers often have to be <a href="http://ihumanable.com/blog/2010/01/toolmaker/">toolmakers</a> as well. Sometimes when making a tool for other programmers to use we let our error reporting skills slip, these aren't mouth breathing users, these are 1337h4x0rz and will find your undocumented command line tool completely natural. I ran into this mentality today while troubleshooting a Windows Service installation problem. The Service works great on my development machine, works fine on other peoples laptops, but on the security locked down Mobile Data Terminals that the Service actually has to run on, no dice. The error that was being reported during installation was...</p><br/><blockquote><tt>The system cannot execute the specified program</tt></blockquote><br/><p>This fails in every way imaginable. Completely un-Google-able, go ahead and try it, you will find everything from people installing things on WinPE, to game development, web controls, Server installation.... a deluge of crap. The error message is amazingly useless, the system can't do something, what can't it do, I don't know, it doesn't even tell me. Can it not execute the install.bat file, maybe the executable called by the install.bat, maybe the executable that executable invokes, who knows?!</p><br/><p>Well being a clever programmer and systematic debugger I was able to isolate each piece working towards the fact that what the message actually should have said was, "Although I have all the permissions necessary to access and execute all the programs you want me too, one of the programs requires that the system have the Microsoft Visual C++ 2008 SP1 Redistributable Package (x86) installed on the machine before you try to execute it. If you install that, then I can find the dependencies I'm missing and everything will be cool, kthxbye!"</p><br/><p>Error messages are one of the few times that we as programmers get to actually directly communicate to the user. Don't waste this opportunity by effectively <strong>saying nothing</strong> to the user. The error message is a traumatic thing for most users, happily working along until it pops up, keep it short, sweet, descriptive and helpful.</p>Matt Nowackhttp://www.blogger.com/profile/00930543505232276126noreply@blogger.com0tag:blogger.com,1999:blog-5534765709337552753.post-70080517137894598912010-04-07T06:59:00.000-04:002013-10-31T22:44:05.345-04:00sitting[caption id="attachment_827" align="alignright" width="300" caption="In case you didn\'t read it: None of Us is as dumb as All of Us."]<a href="http://ihumanable.com/blog/wp-content/uploads/2010/04/meetings.jpg"><img src="http://ihumanable.com/blog/wp-content/uploads/2010/04/meetings-300x251.jpg" alt="meetings demotivational poster" title="meetings" width="300" height="251" class="size-medium wp-image-827" /></a>[/caption]<br/><p><rant></p><br/><p>There is a lie we like to tell ourselves that goes something like this, "I am in control of my life." You are not, it's a cultural lie though, one of those things that we've all agreed makes us feel better so we politely nod our heads and lie to each other and all get through the day a little easier. It's similar to that radical 90's style lie I grew up with during school that went something along the lines of, "Everyone is special and magical and made out of ponies." Everyone gets a trophy, even if you didn't win, because you are special just for trying. It's a lie that everyone knows is a lie, but it makes people feel better, so what's the harm.</p><br/><p>Well over the last few months it's become apparent to me that these things are lies, that I'm no more in control of what goes on in my life then my dog is of his own. At any moment someone could walk through the door and kill us all just for laughs, or someone could hand me a million dollars. The uncertainty of it all is unsettling and exciting. The one thing that has slowly crept into my life recently is the subject of my post, and that is the hallowed institute of meetings. Somehow I went from a code ninja hacking down mountains of whatever was thrown in front of me to a table jockey. I am now scheduled to attend no fewer than 8 meetings per work week.</p><br/><p>That works out to 1.6 meetings/day, and rest assured there is at least 1 meeting everyday. I know people that do nothing all day but meetings, it boggles the mind. I would say that I "hate" meetings, but that really doesn't convey the depth of my loathing for them. Meetings are the bane of my existence, I could stomach maybe 1 a week, a short sweet status meeting, but what I can't handle is the bread and butter corporate meeting, and I'm going to detail why.</p><br/><ol><br/> <li><strong>Marketspeak</strong>: I don't know what the fuck happens to people when they get in meetings but everything, <strong><em>everything</em></strong> gets some fancy new moniker. Sure I could say that I'm working on some stuff, but wouldn't it be better to say that goal-forwarding has been achieved on several Tier-1 action items. There are no people anymore, just assets and resources, dehumanized by the cruel tongue of Marketspeak. Every concept, no matter how simple, is wrapped in shiny new clothes, as though you might confuse the dog turd covered in whipped cream as a delicious fudge sundae.</li><br/> <li><strong>Teleconferencing</strong>: There is always some person (sorry, meant to say "stakeholder touchpoint") who thinks its appropriate to call into the meeting on a 1992 Nokia Celfone while in the middle of a monsoon while driving through a tunnel. Bonus points if this person has a thick accent that makes even high-fidelity communication less than understandable. The other issue is having 10 people on one side of the conference line and 10 on the other, and the fun of each side trying to figure out who is talking.</li> <br/> <li><strong>Pointless Status</strong>: Managing people is difficult, so management is obsessed with the idea of status. The problem is that status is normally not quantitative but qualitative, too bad that doesn't fit into the Holy Spreadsheet. People are forced to turn things into percentages, I'm 80% done reflanging the spline, even if that doesn't make any sense. Status reports are a proxy for involvement, they are a way to feel connected to a process you don't have any part in.</li><br/> <li><strong>Workturbation</strong>: Meetings are insidious, if you have 8 hours of meetings you will go home mentally exhausted, more than likely frustrated, and with a feeling that you've really put in a hard day's work. The problem is that when you try to figure out what you've actually accomplished the list is either non-existent or incredibly paltry. Meetings feel like work but rarely accomplish anything of actual significance. Meetings also have the incredible ability of spawning meta-work just for the sake of the meeting itself. Before the meeting you have to prepare whatever pointless agenda you have for your meeting, secure a place to have the meeting, work around everyone's schedules. Afterward someone prepares the minutes and it gets emailed to the <em>companyname</em>-all mailing list where inevitably the tiny list of things that were actually decided are rehashed again and again. Personal <a href="http://en.wikipedia.org/wiki/Parkinson%27s_Law_of_Triviality">bikesheds</a> are floated around, and more than likely all the chatter on the email list will require <strong>ANOTHER FUCKING MEETING</strong> to sort out.</li><br/> <li><strong>Punting</strong>: Punting is the amazing technique where something interferes with the meeting so it is moved down the road to another meeting. Punting is sometimes necessary when someone wants to discuss in detail some trivial point, but the best and most frequent kind of punting is the following. Design meeting is convened, difficult non-trivial thing is brought up that requires actual thinking and problem solving, meeting participants get frightened by the idea of actually having to dust off the critical thinking part of their brain instead of blithely parroting made up statuses of underlings, issue is tabled to be dealt with in the future, a piece of me dies inside. Keeping the meeting moving becomes <strong>MORE</strong> important than getting anything decided or accomplished.</li><br/></ol><br/><p>The list is in no way exhaustive or universal. At the end of the day though, a meeting is taking up time you could be doing something, they should be looked at that way. All that time you are sitting in meetings talking about all the stuff that could be getting done if everyone wasn't stuck in meetings all the time... my head hurts. What we need are people with their hands on the problem empowered to make decisions and move things forward. Then we can meet once a week to talk about how things are going, instead of sitting around all week wondering why nothing is getting done.</p><br/><p></rant></p>Matt Nowackhttp://www.blogger.com/profile/00930543505232276126noreply@blogger.com1tag:blogger.com,1999:blog-5534765709337552753.post-38054859982814958702010-03-31T09:28:00.000-04:002013-10-31T22:44:05.328-04:00micro-optimization[caption id="attachment_818" align="alignright" width="277" caption="Yea, I know it\'s on fire, but check it, I almost got Freebird down pat."]<img src="http://ihumanable.com/blog/wp-content/uploads/2010/03/nero-fiddling-as-rome-burns.jpg" alt="nero fiddling as rome burns" title="nero-fiddling-as-rome-burns" width="277" height="270" class="size-full wp-image-818" />[/caption]<br/><p>As all good developers should know, one of the cardinal sins of software development is premature optimization. <a href="http://en.wikipedia.org/wiki/Program_optimization#When_to_optimize">Premature optimization</a> is <a href="http://c2.com/cgi/wiki?PrematureOptimization">bad</a> for a <a href="http://daringfireball.net/2009/02/do_shell_script_premature_optimization">whole host</a> of <a href="http://startup-marketing.com/optimization-mistakes-that-kill-startups/">reasons</a>. But there is another set of optimizations that are in the same realm of bad, micro-optimizations.</p><br/><p>I recall learning at some point that in C and C++ it is more efficient to use the pre-increment operator rather than the post-increment operator. Why is this the case, well it's because of the minor difference in behavior between the following two snippets.</p><br/>[cpp]<br/> int source = 10;<br/> int destination = 0;<br/><br/> destination = ++source;<br/><br/> printf("Destination: %d", destination); //Prints "Destination: 11"<br/>[/cpp] <br/><p>Compare with this snippet</p><br/>[cpp]<br/> int source = 10;<br/> int destination = 0;<br/><br/> destination = source++;<br/><br/> printf("Destination: %d", destination); //Prints "Destination: 10"<br/>[/cpp]<br/><p>WHA!? This is actually exactly what we would expect, pre-increment increments the value <strong>BEFORE</strong> assignment while post-increment increments the value <strong>AFTER</strong> assignment. What does this all mean, well basically that if you use post-increment you are executing more instructions, because the compiler has to keep the old value around to return to the assignment. That means that unless you are assigning the value and require the particular behavior that post-increment gives you, you can generate faster code by using the pre-increment operator (this may be handled by compiler optimizations these days).</p><br/><p>All of the for-loops that you've written <tt>for(int i = 0; i < something; i++)</tt> are identical to and <strong>SLOWER</strong> than <tt>for(int i = 0; i < something; <strong>++i</strong>)</tt>. NOOOOO!!!!! Don't worry though, because this is a micro-optimization, its something to not care about, because in reality that one or two extra machine instructions isn't your bottleneck. Micro-optimizations are all those tricks that make code faster that in the vast majority of cases (although not all cases) don't really amount to any actual noticeable performance gain. A <a href="http://en.wikipedia.org/wiki/Instructions_per_second#Timeline_of_instructions_per_second">new processor</a> can do something in the magnitude of 100,000 MIPS (Millions of Instructions Per Second). Every second it does 100,000,000,000 Instructions, that is 100 billion instructions. every. single. second. Changing from post- to pre- increment saves 1 or 2 instructions, so for every time that gets executed you have saved a 100th of a nanosecond.</p><br/><p>Micro-optimizations are rarely worth the hassle, and, as with premature optimization, the solution is to benchmark and trace where your actual bottlenecks are and go about solving those. It doesn't matter if you're screaming through your increments saving a whole nanosecond if your crappy no index having table is taking a whole minute to read because you are doing a table-scan.</p><br/><p>But wait, there's more. Micro-optimization, like everything in programming, can be directly applied to life in general. I work with a person who will spend 5 minutes discussing how to save 30 seconds, this is another incarnation of the micro-optimization. It's that shortcut you take home that actually takes longer, or some everyday voodoo that is draining your time without paying you back, or that client that provides you with 2% of your income but eats up 40% of your effort. Micro-optimizations abound all around us, in the little picture they seem ok, but in the big picture they are nonsense. Take a fresh look at the things and obligations around you and examine them for micro-optimizations, see if the things you do make sense in the big picture.</p>Matt Nowackhttp://www.blogger.com/profile/00930543505232276126noreply@blogger.com3tag:blogger.com,1999:blog-5534765709337552753.post-52152056408483835662010-03-18T06:13:00.000-04:002013-10-31T22:44:05.302-04:00kids writing code[caption id="attachment_810" align="alignright" width="311" caption="you doody head you forgot to clean up your EventStruct!"]<img src="http://ihumanable.com/blog/wp-content/uploads/2010/03/children-computer.jpg" alt="3 children at a computer" title="children-computer" width="311" height="258" class="size-full wp-image-810" />[/caption]<br/><p>Last night I went out to get some dinner and as I sat in the drive-through waiting for the unbridled joy that is Cain's chicken I listened to the radio. WOSU's <a href="http://www.wosu.org/allsides/">All Sides</a> had a <a href="http://streaming.osu.edu/wosu/allsides/031710aOL.mp3">piece about child poverty and mentoring</a>. It was interesting and thought provoking, one of the guests said something that rang true and made me think. (Paraphrasing because the audio is currently unavailable) He started to realize that the kids were excited to have him come talk to the class every week, not because they were interested in his stories about the Post Office, but because they wanted to know that someone cared about them. It was a powerful thing to remember, that children <em>need</em> to know that someone cares for them, and that not all children are that lucky.</p><br/><p>In writing this blog one of my favorite memories is doing the research to write the <a href="http://ihumanable.com/blog/2009/11/teaching/">teaching</a> post. It reminded me of the heady days of my youth spending hours inside of the amazingly good QBasic help file trying to get something to work, stumbling and bumbling, put beaming with pride and a giddy happiness when I finally got the program to work. These days the amount of programming languages geared towards teaching have only expanded, and systems like <a href="http://www.alice.org/">Alice</a> put LOGO's turtle graphics to shame (although I still love that LISP-laden turtle).</p><br/><p>This started the old gears turning in my head, and although this thought is pre-pre-alpha, I thought I would get some feedback and just jot down what I'm thinking. What if there were an after school program for elementary school aged children where IT professionals donated their time and talent to helping kids learn how to program. Children need mentoring, the IT community has a wealth of talented and caring people, let's put these two things together and see if we can do some good. The logistics of this are a little daunting, but I want to lay out the reasons why now is the right time for just such a program.</p><br/><p>Programming is the new literacy. Don't believe me, here is an article entitled <a href="http://www.edutopia.org/literacy-computer-programming">Programming is the new literacy</a>. As we move forward into an increasingly wired future, programming, scripting, mark-up, are going to become skills that are normal to have. Children are already more "plugged-in" then ever before, the benefits of understanding the machine they've been using since they were in diapers is apparent. As the information economy continues its march into the 21<sup>st</sup> century, people will <em>need</em> these skills. From a simple formula in an Excel Spreadsheet to whipping up a ruby script to do batch processing, these will become the differentiators of tomorrow, helping people achieve.</p><br/><p>Hardware has never been more accessible. Moore's Law is a thing of beauty, I just bought a more than capable HP refurb for $150 to act as a media server. OLPC has shown that putting affordable computers into children's hands is possible, and it looks more and more likely that school districts in the Industrialized Nations will be following suit in the next decade or so. Companies routinely <a href="http://www.epa.gov/osw/conserve/materials/ecycling/donate.htm">donate their old computers</a> which means that if $150 is too much (which it is for a lot of low income families) then you can <a href="http://www.ehow.com/how_5047081_donated-computer.html">get a donated computer free</a>. Children can also access computers at libraries and schools for free.</p><br/><p>Software has never been more accessible. The number of languages specifically targeting teaching has only been growing. If you haven't already, go read the <a href="http://ihumanable.com/blog/2009/11/teaching/">teaching</a> post, it is a round-up of just a handful of the neat and nifty software meant to help kids learn to program. The learning curve has never been gentler, you can go from a learning language like Hackity Hack (which is based off of Ruby) to the full Ruby language fairly easily, and from there you can explore the whole world of Ruby development from Rails to Unicorn and back again.</p><br/><p>Programming is about more than computers. Although the immediate goal of learning to program is to instruct a computer in how to perform a given task, the side benefits are immense. Programming teaches children a structured way to solve problems, learning about control structures teaches the ideas of Boolean Logic, writing formulae increases and reinforces the understanding of mathematics. Programming is also empowering, being able to sit down at a keyboard with nothing more than your wits and a good idea and turn it into something real is an amazing feeling for a child. Programs let children learn and explore, make mistakes and figure out how to solve them, with gentle encouragement and careful guidance a child can turn their ideas into reality, and that's a powerful lesson.</p><br/><p>Where to go from here? I'm not exactly sure, the logistics of setting something like this up are a little out of my league. For right now this is just a good idea, I'm at <a href="http://ihumanable.com/blog/2010/03/ideas/">step 3</a> of the idea ladder. Leave a comment, let me know what you think, if you are a parent, would this kind of program interest you? If you are an IT professional, would you volunteer at such an organization? If you are a business owner, would you support such an organization? If you are a child, would you like to learn to program?</p><br/><p>I'm not sure where this idea will go from here, but I'm excited to find out.</p>Matt Nowackhttp://www.blogger.com/profile/00930543505232276126noreply@blogger.com6tag:blogger.com,1999:blog-5534765709337552753.post-5250495289728292742010-03-17T10:25:00.000-04:002013-10-31T22:44:05.277-04:00let me google that for you[caption id="attachment_805" align="alignleft" width="300" caption="I wonder what Google\'s legal team thinks of this website"]<a href="http://ihumanable.com/blog/wp-content/uploads/2010/03/lmgtfy.png"><img src="http://ihumanable.com/blog/wp-content/uploads/2010/03/lmgtfy-300x121.png" alt="let me google that for you" title="lmgtfy" width="300" height="121" class="size-medium wp-image-805" /></a>[/caption]<br/><p>I was recently given the task of writing a Windows Service in Managed C++ (or C++/CLI I can't quite figure out what it's actually called). Having had 3.5 years of C++ experience from college and basic literacy I started clicking around in Visual Studio like a blind man searching for a nickle. Everything was going great until I got to the code it generated... there were ^'s and gcnew's and all kinds of craziness. It looked like the Standard Template Library and C# had gotten together with a bottle of tequila, the next day C++ was knocked up and throwing up carets all over the place. This was not the C++ I had learned back in college on our quaint little Unix box editing code in pico, this was some new monster that vaguely resembled an old friend. Undaunted I clicked <a href="http://lmgtfy.com/?q=writing+a+windows+service">this link</a> and began the journey on the road of enlightenment. Right now I have a Windows Service that builds and hopefully over the next few days I can confirm that it <em>actually works</em>.</p><br/><p>This got me to thinking about the vast wealth of information sitting literally at our fingertips. I recalled the phone call I had with my mom over the weekend that went something like this.</p><br/><blockquote><br/>Mom: They asked me at work to archive some files by burning them to a CD.<br/>Me: Oh, how'd that go?<br/>Mom: Well I had to use a Mac, and I don't know those so I asked for help.<br/>Me: Makes sense.<br/>Mom: The only person who knew how to do it said to use Toast, but that wasn't installed. :( <br/>Me: What did you do?<br/>Mom: Well I thought, how hard can this be, googled it, and followed the tutorial, it was really simple.<br/>Me: You've just taken your first step on the road to geekdom, congratulations.<br/></blockquote><br/><p>The dirty little secret is that for anyone that's good with computers, unless you ask them a question directly in their area of expertise, they might have some vague notion but will more than likely just end up Googling it. "My computer crashed and the BSOD said STOP CODE 0xA70000084, what does that mean?" What you will hear on the other end of the phone is me biding my time while I type "STOP CODE 0xA70000084" into Google and look for the answer. Because, and this may surprise everyone who is not a computer person, having a CS or MSI degree does not mean that you programmed Windows. There is a world of stuff for us programmers to try to hold in our brains, and every error code shooting out of Redmond is low on the totem poll.</p><br/><p>If all us nerds are just Googling things, then why don't normal people do it. We know that everyone Googles stuff: "Naked ladies", "Hot naked ladies", "Other naked ladies I haven't already seen", "How to erase your browsing history", etc. Why don't non-technical people think about typing that perfectly searchable error code into that happy little textbox? There are a litany of reasons from laziness to sloth, but I think the one that most people fall into is intimidation.</p><br/><p>Google is power!!! You ask it a question and you get a list of a gajillion results. Don't believe me, I'm going to search for <a href="http://www.google.com/search?hl=en&client=firefox-a&hs=eFy&rls=org.mozilla%3Aen-US%3Aofficial&q=blue+screen+of+death&aq=f&aqi=g10&aql=&oq=&gs_rfai=">blue screen of death</a> and it returns 9,710,000 results in less than half a second. If you are a non-technical person that is a sea of information, its even worse for technical problems, as the most relevant links are normally some discussion board with a thread 900 replies deep, the solution normally some incantation you chant over the motherboard while spraying the monitor with goat's blood. For the technical doing things like digging around in the System32 directory and clicking around is everyday no big deal stuff. For the non-technical, who normally have the "I hid this for your protection, don't touch these files or your computer will explode" screens still on, it can be a terrifying leap of faith.</p><br/>[caption id="attachment_806" align="alignleft" width="300" caption="for a normal user this is like a grizzly bear with chainsaw arms"]<a href="http://ihumanable.com/blog/wp-content/uploads/2010/03/system32.png"><img src="http://ihumanable.com/blog/wp-content/uploads/2010/03/system32-300x225.png" alt="system32 scare screen" title="system32" width="300" height="225" class="size-medium wp-image-806" /></a>[/caption]<br/><p>The thing that we can do to encourage our non-technical friends and families is to teach them to fish. Normally we just want to give them a fish and get on with our lives. When you take the time to explain how resilient a computer is and how easy it is to find the information, after a while they will come around to solving their own problems. And it's like sweet sexy meth when they do. Try to remember what it was like to have that thrill for the first time of being able to command the computer to do your bidding, once they get a taste they will want more, which may actually end up being more work for you, but it's the good kind of work that furthers another's understanding of the world.</p><br/><p>Drop some <a href="http://lmgtfy.com">lmgtfy</a> love on your loved ones, help them help themselves, introduce them to the intoxication of solving their own technical problems. Once people realize that computers do what we tell them and not the other way around, the world will be a much better place.</p>Matt Nowackhttp://www.blogger.com/profile/00930543505232276126noreply@blogger.com5tag:blogger.com,1999:blog-5534765709337552753.post-14466788086589453812010-03-16T09:55:00.000-04:002013-10-31T22:44:05.271-04:00ideas[caption id="attachment_800" align="alignright" width="234" caption="In the future, we will rule this world!"]<a href="http://ihumanable.com/blog/wp-content/uploads/2010/03/chimpanzee-thinking.jpg"><img src="http://ihumanable.com/blog/wp-content/uploads/2010/03/chimpanzee-thinking-234x300.jpg" alt="chimpanzee in classic thinker pose" title="chimpanzee-thinking" width="234" height="300" class="size-medium wp-image-800" /></a>[/caption]<br/><p>Ideas are interesting things, we have them all the time, we dismiss them frequently, and we value them heartily. Some people don't like to talk about their ideas, don't want people to steal their million dollar brain baby, and I can respect that, but a million dollar idea with zero execution is worth nothing.</p><br/><p>Ideas, like misery, love company, if I tell you an idea your brain will immediately start thinking about it, having its own ideas and interpretations. Then you tell me your ideas that my ideas caused and I get more ideas and so on and so forth, this is the basis of a conversation. That our ideas can grow and change organically, that we can piggy back off of each other, this is the basis of our society. But let's get out of the woods of the abstract and into the city of concrete.</p><br/><p>What I want to talk about today are those entrepreneurial ideas that we all have from time to time. Those things that you are certain will make you rich and famous, or the ideas that leap back into our minds when we see some new thing, a worldwide pornography distribution network, <a href="http://www.w3.org/People/Berners-Lee/">Tim Berners-Lee</a> stole my idea! What should you do with these ideas, how should you handle them, and why and what and huh.</p><br/><p>Every person will have their own way of handling the little lightning bolts that leap into their head but I want to take you through the path that I've found helpful for me.</p><br/><ol><br/> <li><strong>Write it down</strong> - I write down almost every business thought I have, no matter how far fetched, and no matter how overloaded with tasks I am. This seems a little silly, if you are actively working at one thing it can even feel disloyal to start thinking about something else, what am I a squirrel easily distracted by a shiny piece of tinfoil? No, in my opinion you can never have enough ideas in reserve. It doesn't take too much time to jot down enough information to be able to recall it later, and it doesn't mean you aren't serious about your current set of priorities. We would all like to think that everything we are working on will always work out, but you will never be sad that you have more ideas to fall back on.</li><br/> <li><strong>Percolate</strong> - Go do something else, even if you aren't actively thinking about something, after writing it down it will be floating around in your brain someplace. Great ideas refuse to fall to the wayside, if you find yourself coming back to something in your head more than a few times, move onto step 3.</li><br/> <li><strong>Talk it out</strong> - Share your idea with other people, sanity check it, see if they laugh at you. Don't get discouraged too easily though, great ideas can sound crazy and still be great ideas. After discussing it with a few people you can get a handle on how realistic it is and how excited you should be about your new idea.</li><br/> <li><strong>Prototype or Shelf</strong> - If you've made it to step 4 you have to look around and prioritize, it's easy to be swept up in the novelty of a new idea, but strive to objectively adjudicate whether or not you have the free time to move forward. If you do, grab some technology you are comfortable with and make a prototype, don't invest too much time or money. If not shelf the idea, keep a short list of things ready made to work on and add this idea to it.</li><br/> <li><strong>Focus Group <em>Lite</em></strong> - If you made a prototype put it in front of some people, or float a pilot program. See how people react, sometimes an idea can sound great until you see it, then you realize some fundamental flaw. If this stage is good then move onto step 6.</li><br/> <li><strong>Jump in with both feet</strong> - Get cracking. If you have the time, passion, and indication that people could use your idea, go for it. It will be difficult and you will probably fail, but you will be better for it.</li><br/></ol><br/><p>Ideas are nothing without execution, but they are still valuable. Make sure you save your ideas, bounce them off of other people, and if your gut and other people tell you to go for it, take the chance. You may not always succeed, but you will rarely be disappointed that you tried.</p>Matt Nowackhttp://www.blogger.com/profile/00930543505232276126noreply@blogger.com0tag:blogger.com,1999:blog-5534765709337552753.post-2858675711776877652010-03-09T04:43:00.000-05:002013-10-31T22:44:05.260-04:00100th Post Review[caption id="attachment_792" align="alignright" width="300" caption="smile for now, soon I will devour you!"]<img src="http://ihumanable.com/blog/wp-content/uploads/2010/03/monkey-tiger-300x197.jpg" alt="monkey and tiger" title="monkey-tiger" width="300" height="197" class="size-medium wp-image-792" />[/caption]<br/><p>Here we are, my <strong><em>100<sup>th</sup> Post</em></strong>! I'm going to give you an unprecedented look behind the scenes of ihumanable.com to see the magic that is my technology blog.</p><br/><p>This blog started on October 2nd, 2009 (158 days ago). I have had a great time writing and have more or less kept up with my goal of blogging every weekday. I want to recap the numbers so far, talk about the best parts of the last 158 days, and talk about where I plan on taking this blog in the future.</p><br/><h2>By the numbers</h2><br/><ul><br/> <li>Posts: 100</li><br/> <li>Comments: 440 (239 rejected as spam)</li><br/> <li>Subscribers: 183</li><br/> <li>Visits: 32,395</li><br/> <li>Pageviews: 46,664</li><br/> <li>Most viewed post: <a href="http://ihumanable.com/blog/2010/01/hustle/">hustle</a></li><br/></ul><br/><h2>Best of the blog</h2><br/><p>It is hard to sum up what has been my best experience so far blogging. This blog has always served as a dumping ground for my day to day thoughts about developing software and exploring the fantastic world of technology all around us. One of the best outcomes of this blog is getting to know other bloggers, people who you may not always agree with but that are friendly and thought-provoking. Some of the great bloggers that I've had the pleasure of communicating with more through my blog have been:</p><br/><ul><br/> <li><a href="http://www.rickdoes.net">Rick Kierner</a></li><br/> <li><a href="http://www.facility9.com">Jeremiah Peschka</a></li><br/> <li><a href="http://www.victusspiritus.com/">Mark Essel</a></li><br/> <li><a href="http://www.brentozar.com/">Brent Ozar</a></li><br/> <li><a href="http://www.made2mentor.com/">David Stein</a></li><br/> <li>and the many people whose comments have enriched this blog</li><br/></ul><br/><p>I have had a few of my blog posts go viral mostly through the amazing community at <a href="http://news.ycombinator.com">Hacker News</a> where I occasionally submit a post. My biggest honor by far though was having <a href="http://lifehacker.com/5456544/dont-waithustle-when-you-want-to-learn-new-things">hustle featured in Lifehacker</a>. It came as a big surprise to me, I got some pingbacks and before I knew it my server was feeling the squeeze, but thankfully (and with a little help from SuperCache) it stayed up.</p><br/><p>If I had to pick my all time favorite post though, it would be one of my snarkiest, rantiest, and at least in my humble opinion, funniest posts to date. <a href="http://ihumanable.com/blog/2009/12/making-a-sandwich/">Making a sandwich</a>, it's not a very funny title, but if you haven't read it, click through, it will at least make you smile.</p><br/><p>This blog has been a great source of strength and a fantastic point of release for me over the last few months. I have used it to share my <a href="http://ihumanable.com/blog/2010/02/experience-as-a-force-multiplier/">triumphs</a> as well as my <a href="http://ihumanable.com/blog/2009/11/spinning-wheels/">despair</a>. It has been my megaphone, my confessional, and my soapbox. This has been the home of <a href="http://prosper-lib.com">my baby</a> and has sparked numerous discussions and debates that have made me a better person.</p><br/><h2>Into the future</h2><br/><p>After 100 posts, is there anything left to say? Of course there is, I plan on continuing this blog for as long as people still want to read it, and probably a good while past that as well. I recently attended <a href="http://ihumanable.com/blog/2010/01/codemash-review/">codemash</a> and the one thing I remember most was sitting at a table blathering away like normal and my good friend <a href="http://codeforward.blogspot.com/">Jose</a> says, "I didn't understand how you could blog everyday, but now that I've spent a few days with you I understand completely." Suffice it to say, I have a lot to say and I can't wait to start saying it. I'm not sure what I will <a href="http://ihumanable.com/blog/2009/10/falling-in-love/">fall in love</a> with next, but rest assured you will be kept fully informed.</p><br/><h2>Takeaway</h2><br/>[caption id="attachment_795" align="alignleft" width="300" caption="the blogspot version of ihumanable.com... humble beginnings"]<img src="http://ihumanable.com/blog/wp-content/uploads/2010/03/old-site-300x145.png" alt="blogspot version of ihumanable" title="old-site" width="300" height="145" class="size-medium wp-image-795" />[/caption]<br/><p>Here is what I want you to take away from all of this. I started this experiment in social media with a simple free blogspot blog and a twitter account. I scaled out to this WordPress install on my own domain after I got a bit of a following. Then I just wrote, and I kept writing, and I promoted what I thought was important or particularly good, and you can too. For years I wanted to blog and just kept putting it off, one excuse or another would pop up. Then one day I decided to do it, and I made a deal with myself that I would blog every weekday, and I kept that promise (with a few extenuating exceptions).</p><br/><p>There is no time like the present, if you have something to say, fire up a free blog and start typing. At first you may just be talking to yourself, but over time people will listen, people will comment, people will come to understand you and the things that are important to you in a way that they never could otherwise. There is no reason to hold out now, go out there and make a mark, you may be barking at the moon but it's better then staying quiet and wishing you had later.</p><br/><p>Thank you to everyone that has taken this ride with me so far, the last 100 posts have forever changed the person that I am, and I'm excited to see where the next 100 will take me.</p>Matt Nowackhttp://www.blogger.com/profile/00930543505232276126noreply@blogger.com1tag:blogger.com,1999:blog-5534765709337552753.post-34170336022003134172010-03-08T10:16:00.000-05:002013-10-31T22:44:05.245-04:00settling in[caption id="attachment_787" align="alignright" width="209" caption="No, no, not you Hugh Laurie"]<img src="http://ihumanable.com/blog/wp-content/uploads/2010/03/house-md-209x300.jpg" alt="House surrounded by prescription bottles" title="house-md" width="209" height="300" class="size-medium wp-image-787" />[/caption]<br/><p>Here is a rare post, something not bitching and not about technology. Let's say that this is a meta-post, a kind of explanation for why my posting has slowed down the last week and some personal news. First to address the slow down. Last week I had the luxury of experiencing business travel for a <strong>whole week!</strong>. Now to the grizzled road warriors out there who do this all the time I will come off as a whiny little boy, but I didn't have the time (nor the internet connection thank you very much Merrillville Courtyard) to do much blogging with the 10 hours of meetings daily. Don't worry though I have some good thoughts ruminating from the experience.</p><br/><p>Secondly I have just moved into my *fanfare goes here* new house with my lovely girlfriend Heather. Having these two events juxtaposed was a bit stressful and difficult, but we pulled through. Trying to merge all of our stuff together and get everything in order is a bit trickier than just <tt>git merge matt heather</tt>. Its very much worth it though as we now have a lovely little home to call our own and my dog has a backyard to play in instead of tearing up my apartment.</p><br/><p>This is going to be a short one today, I've been keeping busy working my 9 to 5, my side projects, traveling and blogging and <a href="http://ihumanable.com/blog/2010/03/prosper-0-8/">releasing point-releases of Prosper</a>. Tomorrow I will post my <strong><em>100<sup>th</sup> POST!!!</em></strong>. I hope to make it a good one, it will be full of numbers and analytics, lessons learned, people met, and the story of how my inability to shut up has turned into a somewhat successful blog. I hope you will all enjoy it, but you'll have to wait for tomorrow.</p>Matt Nowackhttp://www.blogger.com/profile/00930543505232276126noreply@blogger.com1tag:blogger.com,1999:blog-5534765709337552753.post-32342705266010407342010-03-02T11:05:00.000-05:002013-10-31T22:44:05.234-04:00macgyver[caption id="attachment_781" align="alignright" width="216" caption="All I need are these everyday objects — a toothpick, some liquor, a gun with no bullets, bullets, and three of my MacGyver writers. "]<img src="http://ihumanable.com/blog/wp-content/uploads/2010/03/mcgyver-216x300.jpg" alt="McGyver" title="mcgyver" width="216" height="300" class="size-medium wp-image-781" />[/caption]<br/><p>So it's come to this, a blog meme post. Every so often in the hallowed world of writing content for free to be distributed to people that you don't know for no particular reason other than hearing your fingers clickity-clack, you meet someone else doing the same thing and they challenge you. Considering that this is a hobby built upon the sturdy foundation of honor, glory, and red bull, you must rise to meet this challenge, and write a themed blog post. <a href="http://www.made2mentor.com/2010/02/macgyver-moments/">David Stein started this</a> and it continued to <a href="http://www.brentozar.com/archive/2010/02/my-macgyver-moment-meme-by-made2mentor/">Brent Ozar</a> who has called out my name in the darkness, to answer the call to write about: My MacGyver Moment.</p><br/><p>Now I've written about my favorite MacGyver Moment before in a previous post <a href="http://ihumanable.com/blog/2010/01/toolmaker/">toolmaker</a>, the time that I wrote an automated PL/SQL to T-SQL translation program. In that post though the MacGyver moment played a small roll and didn't get the attention it deserved, so I will go into its history and explain it in greater detail.</p><br/><h2>The seed is planted</h2><br/>[caption id="attachment_782" align="alignleft" width="300" caption="This is how MacGyver would solve most of his problems in the future."]<a href="http://ihumanable.com/blog/wp-content/uploads/2010/03/sg1-gun.jpg"><img src="http://ihumanable.com/blog/wp-content/uploads/2010/03/sg1-gun-300x225.jpg" alt="jack o'neill shooting a p90" title="sg1-gun" width="300" height="225" class="size-medium wp-image-782" /></a>[/caption]<br/><p>It was my last semester in college, I had finished up all the required course work and just needed to take some 400-level electives to finish off my degree. I looked through the catalog and found a course that looked interesting, "Language Design and Implementation." The course seemed exciting for a few reasons, the professor had worked as a professional compiler writer for years and was a decided brilliant and fun teacher, the course work included building a compiler, and compiling source code was a part of the development chain that I had a theoretical understanding of but was still somewhat of a blackbox. I signed up for the course, it was fun, it was hard, I built a compiler (for a made up language called LITTLE targeting the JVM), and I learned a lot. I learned about parsers, tokenizers, compiler optimizations, bootstrapping, and a hundred other interesting concepts. The value that I took away from the course was a litany of problem solving techniques and an appreciation for what runs under the <tt>gcc</tt> hood.</p><br/><h2>The problem</h2><br/><p>My company sold some software. Doesn't seem like a problem at first, in fact, it's how the company does all those little things like pay my salary, so it's actually a good thing. The problem was that the software was written to run on an Oracle backend and we sold it to an organization that only had a SQL Server backend. There we sit looking at a mountain of PL/SQL code that does everything from execute a simple search to closing out and actualizing a fiscal year. 60,000 LoC representing tens of man-<strong>years</strong> of effort. Take this and put it in an extremely aggressive timeframe for porting and limited resources... suddenly the problem is easy to understand.</p><br/><h2>Bubblegum, paperclips, and string functions</h2><br/><p>60,000 lines of PL/SQL needed to become T-SQL, looks like compiling code to me. I knew my source language and my target language, time to write up a parser, tokenizer, emitter, etc. Then I noticed something while scanning through the PL/SQL, the problem domain was constrained, although PL/SQL <em>can</em> be constructed in a number of permutations all syntactically different, this was not the case. This PL/SQL was very uniform in construction, I didn't need all the pieces parts of an actual compiler. I didn't need to tokenizer and parse into abstract syntax trees for emission into the target language, I could just cheat, there were only 3-4 syntactic structures present in the source file.</p><br/><p>I began writing the translator, after quieting that part of my brain that was telling me I was wasting time, just trying to avoid the unpleasant task of translating this by hand. Hackity hack hack, code is complete, hack up some nifty progress bars, run run run... translation complete! I looked at it, not quite perfect but I would estimate that the success rate on translation was around 99%.</p><br/><h2>The lesson</h2><br/><p>Sometimes hacking up a kludge to transmogrify data is the best course of action. Shutting up the part of your brain that doubts your ability, or the part telling you to do something the "right way" is the best way forward. Learning something for no other reason than that it seems interesting can provide you with the tools necessary to solve thorny problems down the road. Sometimes you really can defuse the bomb with a rubber band, #2 pencil, and thumbtack.</p>Matt Nowackhttp://www.blogger.com/profile/00930543505232276126noreply@blogger.com1tag:blogger.com,1999:blog-5534765709337552753.post-38382852108278791472010-03-01T11:02:00.000-05:002013-10-31T22:44:05.225-04:00prosper 0.8[caption id="attachment_248" align="alignright" width="128" caption="prosper"]<a href="http://prosper-lib.com"><img src="http://ihumanable.com/blog/wp-content/uploads/2009/11/prosper-128.png" alt="prosper logo" title="prosper-128" width="128" height="64" class="size-full wp-image-248" /></a>[/caption]<br/><p>As the "pay the bills" work has gotten more fast and furious these last couple of months, Prosper development has started getting less and less priority. Today though I would like to announce that Propser v0.8 is officially ready for consumption. This is still a pre-1.0 release so its use in your multi-million dollar project should wait a while still.</p><br/><p>Prosper is currently very stable and its stability is increasing as Unit Tests are being written, ferreting out many tiny bugs. Right now the MySQL and SQL Server adapters are the most heavily tested adapters, but full test coverage is a priority before the 1.0 release.</p><br/><p>There are a lot of new things to be excited about, a new <a href="http://magicscalingsprinkles.wordpress.com/2010/01/28/why-i-wrote-arel/">AREL</a> inspired way to handle result sets by making the query object itself iterable. This new semantic way of working separates processing from execution and provides a nice new way to interact with the data backend. Support has been added for the <tt>GROUP BY</tt> and <tt>HAVING</tt> SQL clauses.</p><br/><p>Prosper has a new home <a href="http://prosper-lib.com">http://prosper-lib.com</a> which will be getting a snazzy new design just as soon as I free up a couple of hours to make one. I have worked with the incredibly talented <a href="http://ashleykruso.com">Ashley Kruso</a> to get a new logo designed for Prosper.</p><br/><p>Big thanks to Ian Potter who provided bug reports and even some nifty patches that have been incorporated into this release. It's your turn to go forth, <a href="http://github.com/ihumanable/prosper-lib/downloads">play with Prosper</a>, and submit to me feedback. Happy PHPing.</p>Matt Nowackhttp://www.blogger.com/profile/00930543505232276126noreply@blogger.com1tag:blogger.com,1999:blog-5534765709337552753.post-83391666138929276552010-02-25T07:45:00.000-05:002013-10-31T22:44:05.211-04:00road trip[caption id="attachment_772" align="alignright" width="300" caption="sitting... check. staring... check. boredom... check. Looks like we\'ve got ourselves a good old fashioned road trip!"]<img src="http://ihumanable.com/blog/wp-content/uploads/2010/02/road-trip-300x295.png" alt="road trip sign" title="road-trip" width="300" height="295" class="size-medium wp-image-772" />[/caption]<br/><p>I have a road trip coming up, one of those magical adventures where you sit quietly staring at the vast cornfields of the rust belt trying to keep from falling asleep and crashing into a cow or something. I've been preparing for this road trip and decided that instead of trying to find 5 hours worth of music to listen to that I could multitask and <strong>read while driving!</strong></p><br/><p>No I'm not some sort of superhero that can both read a book and drive, I am of course talking about audiobooks. Being a nerd I already have some audiobooks, I have <em>Jon Stewart's America</em> and <em>Steven Colbert's I Am America (And So Can You!)</em> but I thought that I could get some sweet programming knowledge in my brain while on the road. And so I have set out to find the best programming audiobooks / podcasts around, and I need your help!</p><br/><p>So here is the challenge, if you so choose to accept it. Help me assemble a sweet list of programming audiobooks / podcasts, then I will subject them to my brain for 10 hours and come back and write a review of the good, bad, and ugly. Together we can produce the go to list for programmer road trip aural stimulation. Leave a comment with any audiobook / podcast related to programming, software development, or any other sufficiently nerdy subject. Let the miracle of crowdsourcing begin!!!</p>Matt Nowackhttp://www.blogger.com/profile/00930543505232276126noreply@blogger.com2tag:blogger.com,1999:blog-5534765709337552753.post-31259046316622940562010-02-24T09:11:00.000-05:002013-10-31T22:44:05.205-04:00blackbox revisited[caption id="attachment_767" align="alignright" width="275" caption="Oh shit they\'ve miniaturized HAL "]<img src="http://ihumanable.com/blog/wp-content/uploads/2010/02/gear4-blackbox.jpg" alt="blackbox" title="gear4-blackbox" width="275" height="292" class="size-full wp-image-767" />[/caption]<br/><p>The other day <a href="http://ihumanable.com/blog/2010/02/blackbox/">I wrote about the concept of the blackbox</a>. I focused specifically on the idea of a blackbox as us programmers think about it. I've been thinking about it more and more though and realized that there are blackboxes all around us. There are processes that our often complicated, confusing, manual messes that our non-programming friends and family have to suffer through. If they knew a little bit of ruby or maybe some batch programming they would be able to save mountains of time and effort, but they don't, so that's where programmers can shine. The problem is that to help our friends and family we have to shine some light into their blackbox tasks and figure out what they do, that's not the easiest task for a programmer to take on.</p><br/><p>Recently at work they announced a change to the timecard system that we use, all timecards <strong>MUST</strong> be submitted by 10:00am Monday morning. The old system was, they should be in sometime on Monday and if not then our very nice receptionist will send out a sternly worded email shaming you into submitting you timecard. Being curious (and being that the explanation was just a few more lines down in the email) I wondered what change had occurred to the system to require this 10:00am deadline. Ends up that our receptionist used to enter this data by hand from the system we enter it in into the accounting software. This was a tedious and error-prone task, once someone bothered to look at it they realized that with a little bit of code they could automate this all and get these programs chatting back and forth like old bridge partners. A couple hours of programmer effort later and now our receptionist is able to answer calls and do all the other receptionisty things that she is great at instead of spending time copying numbers from one program to another.</p><br/><p>The blackbox, timecards turning into accounting information, was illuminated and the process was horrible, a little bit of code applied and BAM new productivity abounds. It gets me to wondering, how many other blackboxes are all around me, waiting for someone to shine some light in, see the inefficiencies, and offer up some soothing code. I've given myself a new little game to play when talking to my friends and loved ones, when they start complaining about something that they have to do in their day to day, instead of just offering a sympathetic, "Sucks to be you loser" I start digging deeper. "These reticulated splines are giving you a lot of trouble, how exactly do you make them?" Normally they will reply with a bit of hesitation, maybe even a polite, "Oh, its boring, you don't need to know about that." But if you keep on gently nudging, you can find out enough of the process to help.</p><br/><p>It doesn't always have to be by providing code, sometimes just the general nerdy computer knowledge that we have can be incredibly beneficial. It's easy to forget that not everyone knows the little tricks to make the computer easier and more fun to use. I was able to save my mother hours a day by explaining to her that despite what her boss told her, she does not have to shut down Photoshop between opening every file. Until then she had been instructed and believed that she had to wait a good minute for Photoshop to boot up in between every file, opening hundreds of files a day, you do the math. By asking my girlfriend some questions about something she does at work I was able to throw together an Excel spreadsheet to save her a ton of time. The magic of VLOOKUP and some well placed formulas was all that was needed to take a boring repetitive task and make it much simpler and less error-prone.</p><br/><p>For those in the computer-know it's easy to look at the computer as a simple tool, something to be mastered and leveraged to make our lives easier. For many people though, computers <em>are</em> blackboxes, confusing little machines that spit out weird error messages and are constantly fighting them to get things done. And there is the other edge of this sword, by shining light into a process blackbox and making life easier you do the double duty of helping illuminate the blackbox for a computer novice. You help show by example that the computer is not mean or frustrating (well sometimes they are frustrating) but just a tool that with careful skill, some essential knowledge, and most importantly a lack of fear, you can make bend to your will.</p><br/><p>Go find the blackboxes around you, help someone save 15-20 minutes a day, show someone that computers are not just useful in general but can be made personally useful. You will be a technology hero to them, you will find an interesting puzzle to play with for yourself, and at the end of the day everyone will be better off. Find the blackboxes and start pouring in light, you will be pleasantly surprised at what you find.</p>Matt Nowackhttp://www.blogger.com/profile/00930543505232276126noreply@blogger.com0