<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-13706479</id><updated>2012-01-17T13:37:25.315-08:00</updated><title type='text'>Thoughts of Me</title><subtitle type='html'>Ideas and thoughts from the world of software development, finance, sci-fi, disney world, and who knows what else!</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default?start-index=101&amp;max-results=100'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>209</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-13706479.post-4347038378334900753</id><published>2010-03-28T23:25:00.000-07:00</published><updated>2010-03-29T00:08:13.760-07:00</updated><title type='text'>A new language</title><content type='html'>Why, oh why, would I curse the world with another programming language?  The answer is my typical, "Why not?".  More seriously, there are minor deficiencies that I would like to address in the modern mainstream languages.  The language I will design will be an incremental improvement over what we currently have.  I don't expect it to gain much traction, but it should be enjoyable to program in and it will make for a nice side project.&lt;br /&gt;&lt;br /&gt;Here are the major things I wish to have in my language&lt;br /&gt;1. Type inferencing&lt;br /&gt;2. Mutable/Immutable variables - you should be able to specify if a variable is mutable or immutable.  By default, local variables are mutable.  Non local variables (member variables and static variables) are by default immutable.&lt;br /&gt;3. Non-nullable types - By default all types are non-nullable.  You can wrap the type in a Nullable&amp;lt;T&amp;gt; and use the Nullable&amp;lt;T&amp;gt;.Null object to represent null.&lt;br /&gt;4. Generic types - types can be generic.&lt;br /&gt;5. "Duck" interfaces - types can be cast to an interface that they don't implement so long as they implement the correct functions.  It must be an explicit cast (unless the interface is unnamed), but the cast will succeed.&lt;br /&gt;6. Unnamed interfaces - When defining a generic function, you can specify an interface that the parameter must implement.  The incoming object will be implicitly cast to this unnamed interface.&lt;br /&gt;For example:&lt;br /&gt;int f&amp;lt;T implements { void foo(); }&amp;gt;(T incoming)&lt;br /&gt;{&lt;br /&gt;  incoming.foo();&lt;br /&gt;}&lt;br /&gt;7. immutable methods - methods are, by default, immutable.  They can not change any of the mutable or immutable members.  A method may be specified as mutable, but mutable methods may not be called on immutable objects.&lt;br /&gt;8. Metaprogramming support - Compile time support for metaprogramming should come from a few different sources.  First, a standard AST will be provided that can be manipulated through annotation.  Basically, an annotation is like a macro that takes a statement and transforms the AST into a different statement.  For example, you could write a "memoize" functional annotation that accepts a function declaration and replaces it with a different declaration that is memoized.  In addition, metaprogramming can come through compiler event hooks such as "onInheritance", "onCast", "onDeclaration", etc...&lt;br /&gt;9. Unit test support - I'm not yet sure what this will end up looking like, but I do plan on having the ability to write short, inline unit tests at the point of method declaration.  It will act as both a user guide as well as a documented test.&lt;br /&gt;10. No "new" keyword - I have never understood the point of the "new" keyword in Java and C#.  Therefore, it is gone.&lt;br /&gt;11. No more try - I really hate the try/catch thing.  In &lt;i&gt;The Design and Evolution of C++&lt;/i&gt;, Bjarne writes about how he had a version without try, but it was confusing.  I think it is time to resurrect his experiments.  I'm not yet sure of the final form, but I'm sure it will be tryless.&lt;br /&gt;12. Inheritance is deprecated - Other than interfacing with other languages, there should be no need or desire for inheritance.  Much of what it was designed to accomplish can be done better through syntax macros and composition.  Inheritance will be kept for compatibility with Java/C#/etc..., but its use in native libraries will be deprecated.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ok, that's 12 things that I see for my language.  I don't have a name for it yet, but will accept any suggestions :)  I plan to target the .net runtime at first, but the JVM should be a target as well.  Comments are welcome.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-4347038378334900753?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/4347038378334900753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=4347038378334900753' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/4347038378334900753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/4347038378334900753'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2010/03/new-language.html' title='A new language'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-5390057054850928332</id><published>2010-03-19T03:05:00.000-07:00</published><updated>2010-03-19T03:40:23.798-07:00</updated><title type='text'>Passing the Microsoft Interview</title><content type='html'>As you know, I work for Microsoft - specifically on the bing.com team, more specifically on the core core relevance team (yes, that's two cores...don't ask).  Even more specifically on the anchor team in the core core relevance team of bing.com in Microsoft.  Wow, that's a mouthful.&lt;br /&gt;&lt;br /&gt;Anyway, bing is hiring and that means I'm interviewing a lot these days.  I'm doing at least one interview every other week, sometimes more.  In addition, not many people are passing.  So, to help everyone out, I thought I would put together a list of tips to help you pass the Microsoft Interview.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Tip #1: Know your stuff&lt;/h3&gt;&lt;br /&gt;Yeah, easier said than done.  However, there are a number of resources out there that can help you.  I've listed them in a &lt;a href="http://blogginman.blogspot.com/2008/08/live-search-interview.html"&gt;previous blog post&lt;/a&gt;, so study up and have a good understanding of data structures, algorithms, and Big O notation before getting here.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Tip #2: Understand the problem&lt;/h3&gt;&lt;br /&gt;A lot of people encourage you to ask lots of clarifying questions.  I think that is good practice and would also encourage you to do it.  In addition, I think you should also spend quite a bit of time at the beginning to list out examples, both positive and negative.&lt;br /&gt;Let's use a concrete example.  One question that I see posted all over the web is to write a function to take a string as input and reverse the order of the words in the string.  So, for example, "Hello World" would get reversed to "World Hello".&lt;br /&gt;The first thing you should do is ask clarifying questions.  Here are some examples:&lt;br /&gt;1) Should I reverse the string in place, or create a new string?&lt;br /&gt;2) What is the return value for the empty string?&lt;br /&gt;3) How should a null pointer be handled?&lt;br /&gt;4) What constitutes a word separator?&lt;br /&gt;5) ASCII or Unicode?&lt;br /&gt;6) How should punctuation at the end of the string be handled?&lt;br /&gt;7) What about capitalization?&lt;br /&gt;8) Is it a c style string or are embedded nulls allowed?&lt;br /&gt;&lt;br /&gt;Now that you have fleshed out the problem, the next thing to do is think of some example inputs and see what the outputs would be.  I would think of this in a tabular format with input on the left and output on the right&lt;br /&gt;&lt;table border=1&gt;&lt;br /&gt;&lt;tr&gt;&lt;th align=left&gt;input&lt;/th&gt;&lt;th align=left&gt;output&lt;/th&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;null&lt;/td&gt;&lt;td&gt;assertion failure&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;""&lt;/td&gt;&lt;td&gt;""&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;"Hello"&lt;/td&gt;&lt;td&gt;"Hello"&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;"Hello world"&lt;/td&gt;&lt;td&gt;"world Hello"&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;"Hello from Microsoft"&lt;/td&gt;&lt;td&gt;"Microsoft from Hello"&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;There may be more examples depending on the answer to the clarifying questions, but these would be the minimum examples necessary.  Go through each example with your interviewer and make sure he or she agrees with your mapping function.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Tip #3: Describe the algorithm&lt;/h3&gt;&lt;br /&gt;After you have created your examples, but before you start to code, describe, in English, the algorithm you have devised.  First, this helps you to think about the algorithm before you code it and second it gives your interviewer a chance to hint at the right solution if you missed it.  If, instead, you immediately start coding a poorly performing algorithm, you give your interviewer no choice but to sit idly by while you waste his time coding something he knows won't work.  If you, instead, discuss the algorithm with the interviewer, it gives him or her the chance to point you in the right direction and lets you write code that the interviewer wants to see.&lt;br /&gt;&lt;br /&gt;In our word reversal example, you might start by describing an algorithm whereby you find the first space and the last space and then swap the words and repeat until the spaces are the same.  The interviewer might ask you about the complexity of this approach and then ask if there is a less expensive algorithm.  Doing things in this order makes sure that you are coding the algorithm the interviewer wants to see.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Tip #4: Don't mention a naive algorithm to fill time&lt;/h3&gt;&lt;br /&gt;The interviewer has asked you a difficult question.  You're not sure of the correct way to solve it.  Don't just mention the first, most naive, solution that pops into your head.  If you think your first solution is a good one, then by all means mention it, but if you know it sucks and is O(n!) or some such nonsense, then stop, think, and come up with something better.  By giving a poor solution to begin with you are just giving the interviewer a reason to reject you.  You don't have to get the right solution to begin with, just make sure it's not horrible.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Tip #5: When coding, make sure you check your boundary conditions&lt;/h3&gt;&lt;br /&gt;Nothing sets me off more than when someone forgets a null check or a boundary condition check.  This is just Engineering 101 and is critical for a system such as bing.  If you can't be bothered to check for null in all the right situations, then don't even apply.  Sure, everyone makes mistakes, but in the interview keep null checks on the top of your mind.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Tip #6: After coding, run through your examples and make sure your code works&lt;/h3&gt;&lt;br /&gt;I've seen too many people write code on the whiteboard, spend 5 seconds looking at it, and then say "Yes, that looks good."  There is NO way you have tested it in your head after 5 seconds.  Even if it is correct, how do you know?  The best thing to do is to use your examples that you generated to walk through your code.  You might discover, for instance, that you assumed there would always be a space, when there might not.  This gives you a chance to correct your own mistakes without forcing the interviewer to intervene.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Tip #7: Ask questions about the interviewer&lt;/h3&gt;&lt;br /&gt;This is just good psychology.  Make the interviewer feel important by spending a few minutes at the end asking about the interviewer's team and work.  The benefit to you is that you get to hear about the day to day activities and make sure they sound interesting.  The benefit to the interviewer is that he or she gets to talk about his or her exciting projects.  This leaves the interviewer with a good feeling leaving the interview, which is always a good thing.  So, the next time you are stuck without a question, ask the interviewer to tell you about a recent project - and hopefully it excites you both!&lt;br /&gt;&lt;br /&gt;There you have it, 7 tips on getting through a Microsoft interview.  Of course, I honed in on coding, but many of the same ideas apply to the design based interview questions, as well.  Regardless, be prepared, be confident, and most of all, have fun!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-5390057054850928332?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/5390057054850928332/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=5390057054850928332' title='18 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/5390057054850928332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/5390057054850928332'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2010/03/passing-microsoft-interview.html' title='Passing the Microsoft Interview'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>18</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-3702401582672448750</id><published>2010-02-12T00:32:00.000-08:00</published><updated>2010-03-26T00:10:47.177-07:00</updated><title type='text'>What have we programmers learned?</title><content type='html'>Remember when everyone wrote spaghetti code littered with gotos?  Ok, I don't, and I doubt there was such a time.  The really great people never wrote spaghetti code littered with gotos.  They used gotos because they were all that was available, but they wrote structured code before structured code was cool.  It took time, and language advances, but eventually the average joe programmer like me caught on to the practice.  This led to much rejoicing and greatly improved software.  Of course, by that time, the great programmers were already moving on to things like object-oriented programming and generic programming.  There is always a downdraft from the great programmers exploring and pioneering to the average joe learning and improving the mean.&lt;br /&gt;&lt;br /&gt;The questions were are here to ask (and answer) are&lt;br /&gt;1) What has the average joe programmer learned over the last 10 years?&lt;br /&gt;and&lt;br /&gt;2) What are the great programmers exploring and pioneering today?&lt;br /&gt;&lt;br /&gt;It is interesting to note that most of the things I'm going to discuss were practiced since the beginning of the computer era.  They are not new ideas or inventions, it is just that it has taken this long for the rest of us to catch up and realize their significance and importance.&lt;br /&gt;&lt;br /&gt;In this post, I'll list out what I believe we have learned and are learning and in future posts, we'll go into each in more depth.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;What have we learned over the last 10 years?&lt;/h3&gt;&lt;br /&gt;1) Automated unit testing - Note, this doesn't necessarily mean TDD, BDD or any other methodology, just that we should have unit tests and they should be run automatically.&lt;br /&gt;2) Refactoring&lt;br /&gt;3) Small methods&lt;br /&gt;4) Value Semantics - How can I say this when most VMs use references? Think immutable reference types!&lt;br /&gt;5) Functional extensions to procedural languages&lt;br /&gt;6) VMs are good&lt;br /&gt;7) OO is not a silver bullet&lt;br /&gt;8) ORM is hard&lt;br /&gt;9) IDEs are vital&lt;br /&gt;10) XML was a cruel joke&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;What are we learning?&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;In most of these cases, we know the concept is important, but we're still quite unsure of how to quite integrate it into our everyday lives.  There are still many fledgling attempts, but nothing has quite been standardized.  In some cases, it could be that web search has clouded my view of what is importat.&lt;br /&gt;&lt;br /&gt;1) Non-nullable types&lt;br /&gt;2) DSLs&lt;br /&gt;3) Metaprogramming is important&lt;br /&gt;4) MapReduce [or parallelism is all about the programming model]&lt;br /&gt;5) Statistics&lt;br /&gt;6) Column-Store DBs have a place, but so do RDBMS's&lt;br /&gt;7) Convention vs Specification&lt;br /&gt;8) Patterns are not a silver bullet, nor are functional languages&lt;br /&gt;9) Type inferencing is a benefit&lt;br /&gt;10) XML was a cruel joke (yes, it goes in both)&lt;br /&gt;&lt;br /&gt;Please feel free to comment if you disagree or want to add.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-3702401582672448750?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/3702401582672448750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=3702401582672448750' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/3702401582672448750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/3702401582672448750'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2010/02/what-have-we-programmers-learned.html' title='What have we programmers learned?'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-5664919325352501264</id><published>2010-01-06T08:15:00.000-08:00</published><updated>2010-01-06T08:44:13.743-08:00</updated><title type='text'>My new browser</title><content type='html'>For years I have been a faithful IE user.  I say faithful and not loyal because I have only used it because it suited my needs and other browsers were too cumbersome or clumsy to hold my attention for long.  &lt;br /&gt;&lt;br /&gt;FireFox is infinitely customizable, but it never &lt;i&gt;felt&lt;/i&gt; like a well designed app - it felt clumsy to me.  Plus, it always had problems rendering tables in an appropriate manner.&lt;br /&gt;&lt;br /&gt;Chrome is sleek, fast and elegant, but in many cases it just doesn't work.  I'm always finding some site that it doesn't render quite right, a video that it won't play, or a simple customization that doesn't exist.&lt;br /&gt;&lt;br /&gt;I've also tried Safari from time to time, but never long enough because I never saw any advantages over IE.&lt;br /&gt;&lt;br /&gt;However, a new version of an old browser has impressed me so much that I have switched for what I hope is good.  &lt;a href="www.opera.com"&gt;Opera version 10.10&lt;/a&gt; is an amazing piece of art.  It renders fast and correctly, plays all the video sites I need (though I did have to "Mask as FireFox" for Netflix!), and has the simple customizations I want.  For instance, I can use the address bar to search on various search engines (I'm not limited to Google like I am with Chrome.)  If I want to search &lt;a href="www.bing.com"&gt;Bing&lt;/a&gt;, then I just type "b " followed by the search string into the address bar and viola! it goes to Bing and searches (I did have to manually set this up, but it was quick and easy).  Other niceties include movable tabs for web pages with hover preview and a "speed dial" page that is much nicer and more customizable than Chrome's.&lt;br /&gt;&lt;br /&gt;My requirements are simple.  I want a browser that is easy to use, works on the sites I frequent, and has simple customizations.  I don't want to spend a lifetime studying all the intricacies and hunting down new plug ins.  I just want a browser that works.  Opera satisfies those needs and left me happier than I was before.  Give it a try and let me know if you feel the same way!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-5664919325352501264?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/5664919325352501264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=5664919325352501264' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/5664919325352501264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/5664919325352501264'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2010/01/my-new-browser.html' title='My new browser'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-1732702204514763252</id><published>2009-09-05T21:19:00.000-07:00</published><updated>2009-09-05T21:39:03.333-07:00</updated><title type='text'>C# Timings</title><content type='html'>Recently, I was adding a bit of debug code to measure how long it took to run various parts of my program (yes, I know a profiler would be more accurate, but I just needed a rough estimate).  So, I had 3 or 4 areas in my code where I did something akin to&lt;br /&gt;&lt;code&gt;&lt;br /&gt;TimeSpan timer = new TimeSpan();&lt;br /&gt;DateTime startTime = DateTime.Now;&lt;br /&gt;Type1 rval = DoIt(a, b);&lt;br /&gt;timer += DateTime.Now - startTime;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Firstly, this code is ugly.  I'm obviously doing many different things here: timing code, calling a function, storing it's result, etc....  It would be much better if I could wrap the timing code into its own function.  So, I esentially want something like:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;TimeSpam timer = TimeIt( () =&gt; DoIt(a, b) );&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;The code for TimeIt is simple to write&lt;br /&gt;&lt;code&gt;&lt;br /&gt;TimeSpan TimeIt(Action a)&lt;br /&gt;{&lt;br /&gt;  DateTime startTime = DateTime.Now;&lt;br /&gt;  a.Invoke();&lt;br /&gt;  return DateTime.Now - startTime;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;However, that doesn't save the return value of DoIt, so that is useless for my purposes.  I need TimeIt to return the value from DoIt.  To do this, I make TimeIt a generic method and have it accept a function instead of an action.  I pass the TimeSpan in as a reference argument.  The calling code looks like&lt;br /&gt;&lt;code&gt;&lt;br /&gt;TimeSpan timeSpan = new TimeSpan();&lt;br /&gt;Type1 rValue = TimeIt(() =&gt; DoIt(a, b), ref timeSpan);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;The TimeIt function looks like&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public static T TimeIt&lt;T&gt;(Func&lt;T&gt; f, ref TimeSpan timeSpan)&lt;br /&gt;{&lt;br /&gt;  DateTime startTime = DateTime.Now;&lt;br /&gt;  T rVal = f.Invoke();&lt;br /&gt;  timeSpan += DateTime.Now - startTime;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;There, now we have a simple and generic way to time a single method that returns a value.  If you wanted to go further, you could create a class that held the TimeSpan value so that you wouldn't have to pass it in as a ref, but this worked for my needs and was clean enough so I stopped here.  If I need this code again, I'll refactor it into another library and perhaps into its own class.  Until then, I'll enjoy the cleanliness and conciseness.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-1732702204514763252?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/1732702204514763252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=1732702204514763252' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/1732702204514763252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/1732702204514763252'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2009/09/c-timings.html' title='C# Timings'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-4373583407119459378</id><published>2009-07-20T19:09:00.000-07:00</published><updated>2009-07-20T19:10:12.071-07:00</updated><title type='text'>A letter to my representative</title><content type='html'>I sent a letter to my representative regarding the health care bill and would like to repost it here for others to comment.&lt;br /&gt;&lt;br /&gt;Hello Representative Inslee,&lt;br /&gt;&lt;br /&gt;I wanted to write a quick letter in opposition to the upcoming health care reform.  Believe it or not, health care is undergoing a major revolution today.  The problem is that the traditional "insurance" programs of the past are becoming harder to use because people have confused "insurance" with "comprehensive coverage".  Allergy medicine, maintenance meds, etc... are not part of any insurance program.  Insurance is responsible for covering major and unexpected medical issues.  Over the last 5 years, more insurance companies are coming to terms with this and are inventing things like Health Savings Accounts, which, though unpalatble to many consumers, are a cost effective means of giving consumers choice over how to best spend thier medical allowance.  Unfortunately, the private sector has not sorted everything out yet, so now is a very inopportune time for the government to intervene.  The government is not innovative nor is it cost effective.  Instead, it simply throws constiutents money at a problem with little effect until they stop complaining about it.  I do recognize the importance of helping our elderly and needy, but I also recognize the precarious position of the american economy and the health care industry.  Despite Obama's claim, now is NOT the time to act.  Now is the time to rely on capitalism and market forces to sort out what the future should hold and then fit our current medicare and medicaid plans into that future.  The economy, the health care industry, and your constituents need you, Representative Inslee, to be a pillar of salt in today's wax and wane congress.  You have been in the past and I trust you will be again.&lt;br /&gt;&lt;br /&gt;Thanks for your time,&lt;br /&gt;Tanton Gibbs&lt;br /&gt;Redmond, WA&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-4373583407119459378?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/4373583407119459378/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=4373583407119459378' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/4373583407119459378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/4373583407119459378'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2009/07/letter-to-my-representative.html' title='A letter to my representative'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-5943874605838091538</id><published>2009-06-28T02:04:00.000-07:00</published><updated>2009-07-06T02:29:00.552-07:00</updated><title type='text'>What should Yahoo! do?</title><content type='html'>Yahoo!'s CEO, Carol Bartz, has stated firmly that &lt;a href="http://www.cnbc.com/id/15840232?video=1134895115"&gt;Yahoo! is not a search company&lt;/a&gt;. In fact, Yahoo!, she states, &lt;a href="http://online.wsj.com/article/SB10001424052970203431004574196080698220124.html"&gt;is much closer to a portal&lt;/a&gt;. The goal is not search, but editorial comments and a local feel. A portal, if you will, from a major media/technology firm. Unfortunately, in the coming years, portals will be less and less necessary as people will get their news from a swath of algorithmically mined sources across the social media landscape. I'm afraid the era of Yahoo! dominance has ended and will not return.&lt;br /&gt;&lt;br /&gt;Like &lt;a href="http://www.amazon.com/Elephants-Dance-Inside-Historic-Turnaround/dp/0060523794"&gt;IBM in the 90's, Yahoo! must redefine itself.&lt;/a&gt; Yahoo! must &lt;a href="http://www.fastcompany.com/magazine/51/goodtogreat.html?page=0%2C4"&gt;sell the mills&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Again, like IBM, who has become a major integrator, and Kimberly-Clark, who has become a consumer goods powerhouse, Yahoo! must set out on the next phase of it's life - it must enter and dominate a new area or be relegated to a technological side show until it dies. But what should it pursue? To answer that question, we need to look at its strengths and products, especially those that are hard to mimic, such as those related to its core technology.&lt;br /&gt;&lt;br /&gt;Yahoo! has &lt;a href="http://www.datacenterknowledge.com/archives/2009/06/24/yahoos-unstealths-its-data-center-efficiency/"&gt;world class data centers&lt;/a&gt;, meaning they can store and process data cheaper than anyone else (except, perhaps, google). Yahoo! also has a &lt;a href="http://www.idevnews.com/IntegrationNews.asp?ID=913"&gt;data processing platform&lt;/a&gt; that allows it to analyze web scale data quickly and efficiently. It's also beginning to build &lt;a href="http://hadoop.apache.org/pig/"&gt;a dataflow language&lt;/a&gt; which allows developers to be productive. Finally, Yahoo! has a &lt;a href="http://research.yahoo.com/"&gt;respected research organization&lt;/a&gt; which keeps it at the forefront of areas such as machine learning and information retrieval.&lt;br /&gt;&lt;br /&gt;The question then becomes: "What business needs massive computational power, data storage and processing ability, and makes heavy use of machine learning and information retrieval?" The biggest one I can think of is data marketing. Analyzing billions of consumer and business records as quickly as possible and making decisions on the fly is what data marketing is all about.&lt;br /&gt;&lt;br /&gt;Imagine a person walking into an electronics store. Currently, if the person buys something he may get a coupon to promote his buying something more, later. However, this is suboptimal for two reasons. The simplest reason is that the coupon may be unnecessary. The patron may have been planning to return even without the coupon and so the coupon represents wasted revenue. The second reason is that the coupon may be too late. It could be that if the patron would have been given the coupon on the way in then he might have bought more or upgraded or any other number of things that could have produced more revenue. It could even be that a customer doesn't buy anything at all, but would have purchased if a coupon was given beforehand. The holy grail of marketing is to sell an item to each person at an individualized cost. You want that person to pay as much as possible for the item. If person A will pay $100 for a camera and person B will pay $300 for the same camera then you want to issue the $200 off coupon to person A and no coupon to person B.&lt;br /&gt;&lt;br /&gt;Now, imagine a system where a customer is recognized by an &lt;a href="http://research.yahoo.com/search/node/image"&gt;image recognition system&lt;/a&gt; the moment they walk in. Their data is retrieved instantly and a &lt;a href="http://research.yahoo.com/Machine_Learning"&gt;machine learning algorithm&lt;/a&gt; is run to determine what the person is shopping for and what the person is willing to pay. From their online profile and &lt;a href="http://www.twitter.com"&gt;twitter account&lt;/a&gt;, the algorithm is able to determine that the person recently broke their camera and is looking to replace one. Using data from &lt;a href="http://www.acxiom.com"&gt;a company such as this one&lt;/a&gt; the algorithm can tell that they are struggling economically and will want to buy a cheaper camera. However, it also knows from statistics that a coupon for the higher priced camera has a good probability to make the consumer stretch his budget and go for the "prestige" item. A few more checks against the data center reveals that the current store location has excess inventory of the higher priced camera and therefore the algorithm decides to dispatch a bigger discount coupon for the better model. The sales attendant walks to the customer and presents the coupon, escorting the customer to the camera aisle. The sale is made and the computer gets an extra volt in its bedtime snack ;-)&lt;br /&gt;&lt;br /&gt;More seriously, Yahoo! could perform those computations more efficiently and with better accuracy than an enterprise. Enterprise data centers are not going to reach the efficiency of Yahoo!'s data center. Moreover, enterprise IT programmers are not going to have the time or penchant to do the necessary IR and ML research. Yahoo! is uniquely positioned to do those things; furthermore, since it is dangling on the precipice of disaster now is a good time to bite the bullet and make the change. Not that I expect them to. Change is something that is hard to accept and Ms Bartz doesn't seem like the type to change their core business...if she ever figures out what that is. More than likely the model I express above will be adopted by a new comer...perhaps by &lt;a href="http://flamingo.ics.uci.edu/"&gt;these guys.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-5943874605838091538?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/5943874605838091538/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=5943874605838091538' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/5943874605838091538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/5943874605838091538'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2009/06/what-should-yahoo-do.html' title='What should Yahoo! do?'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-3621789080120249741</id><published>2009-05-24T13:01:00.000-07:00</published><updated>2009-05-24T13:43:32.136-07:00</updated><title type='text'>The Perils of Fanaticism</title><content type='html'>I found &lt;a href="http://www.computerworld.com/action/article.do?command=viewArticleBasic&amp;taxonomyName=windows_and_linux_pcs&amp;articleId=9133381&amp;taxonomyId=64&amp;intsrc=kc_feat"&gt;this article&lt;/a&gt; on reddit the other day and was immediately struck by its stupidity.  Now, usually I wouldn't use such a harsh word, but the ideas contained in it are so preposterous that it doesn't really deserve any better word.&lt;br /&gt;&lt;br /&gt;I first want to say that I have no opinion about the book described or the author of the book.  I have not read the book and I don't know the author.  For all I know, &lt;a href="http://www.amazon.com/After-Software-Wars-Keith-Curtis/dp/0578011891"&gt;After the Software Wars&lt;/a&gt; could be about bunny slippers.  Instead, I want to be very clear that I'm arguing only with the points contained in the article.&lt;br /&gt;&lt;br /&gt;The article describes how open source produces superior software to a closed source model and uses, as its first example, &lt;a href="http://www.wikipedia.org"&gt;Wikipedia&lt;/a&gt;.  It mentions that Wikipedia is not software, but uses it as an example anyway.  Seriously.  I can't deny that no closed source institution can provide the same quality of data as Wikipedia.  However, Wikipedia deals with data, not code, and data entry can be done by anyone.  It is very different from a program that requires someone know how to program before they change it.&lt;br /&gt;&lt;br /&gt;Next, the article uses two examples to &lt;b&gt;prove&lt;/b&gt; that open source software is better than closed source: FireFox and the Linux kernel (over IE and Windows).  Wow, this is the height of arrogance and a circular argument.  There is no demonstrable way to prove their superiority; I doubt even 4 out of 5 dentists would agree that one is better than the other.&lt;br /&gt;&lt;br /&gt;The next part of the article that I find incredulous is that he believes that Google Docs will never catch on, while Linux and OpenOffice will.  Yeah, sure.  People are going to avoid using something that doesn't take any effort to change to, makes your data available everywhere, and is constantly updated versus something requiring a complete modification of your current computing environment, has to be shared separately, and is updated using magic incantations.  While this may sound like I'm a Linux newbie, I'm not.  I'm just pointing out the fact that, to most people, yum is something you say before dinner, not the way to update your programs.&lt;br /&gt;&lt;br /&gt;The MOST ignorant thing, however, was the following: "If Microsoft, 20 years ago, built Windows in an open way, Linux wouldn't exist, and millions of programmers would be improving it rather than competing with it."&lt;br /&gt;&lt;br /&gt;Yeah, right.  We don't have various flavors of Linux.  We don't have emacs and Xemacs.  We don't have hundreds of open source projects that do the same thing in slightly different ways.  Come ON!  Competition is in our blood.  Doing things "our way" is what makes programmers unique.  You could have the most awesome open source project on the planet and someone would find a reason to fork and change it.  That's just how we work.  The idea that everyone will give up their belongings, join a commune, and hum "Linux is king" is not realistic.  Just look how many open source programming languages there are.  Look how many open source unix-like variants there are.  Get a grip on reality and stop pontificating your idiotic ideals.&lt;br /&gt;&lt;br /&gt;Ok, next quote.  "The biggest difference between Windows and Linux is that free software contains thousands of applications, installable with one click, and managed as one set."  First off, I'm not sure what that means.  I have never seen a Linux application that was installable with one click.  I definitely prefer the Windows model of installation to the Linux model.  In addition, the Windows and Linux model of uninstallation is similar, IMO, so I'm not sure what it means to be "managed as one set", nor how that differs from Windows.  As for thousands of applications, that is true, but Windows also has a number of free applications and that seems to be growing as the .NET platform usage increases.&lt;br /&gt;&lt;br /&gt;The idea that software developers around the world will just give up the idea of profits and join together in harmony is ridiculous.  Furthermore, proprietary software has benefits.  You can judge the financial soundness of a company to see whether their software will be around in 10, 15, or 20 years.  Just look at &lt;a href="http://sourceforge.net"&gt;sourceforge&lt;/a&gt; to see the number of free software projects that are abandoned.&lt;br /&gt;&lt;br /&gt;I believe strongly in the value of free software and open source software (and I even know the difference).  However, I also believe strongly in the value of proprietary software.  For a case study in what happens when you are the champion of free software, just look at Sun.  Oh, you can't, &lt;a href="http://www.oracle.com/us/corporate/press/018363"&gt;it's been bought by Oracle&lt;/a&gt;, a closed source shop.  Yeah, Microsoft should really follow in their footsteps.  Sheesh.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-3621789080120249741?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/3621789080120249741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=3621789080120249741' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/3621789080120249741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/3621789080120249741'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2009/05/perils-of-fanaticism.html' title='The Perils of Fanaticism'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-96360225186110639</id><published>2009-02-23T19:42:00.001-08:00</published><updated>2009-03-30T22:41:19.176-07:00</updated><title type='text'>Yahoo! Interview</title><content type='html'>I realize this write up is a bit late, seeing that I already work for Microsoft, but I wanted my interview collection to be complete, so I want to add this one and the interview with Google.  Realize, that it has been six or so months since I interviewed with Yahoo!, so my memory has faded a bit.  However, I'll go over what I remember.&lt;br /&gt;&lt;br /&gt;After my interview with Google, I didn't think I would interview with Yahoo! because it was in the same area of the country - an area I was not impressed with.  However, a friend of mine, who works for Yahoo! talked me into interviewing.  He said that he could show me around so that I would enjoy the area.  I wasn't convinced of that, but at the least it was a free trip to see an old friend, so I decided to take him up on it.  In hindsight, I'm very glad I did.  First, because getting the Yahoo! offer allowed me to get other offers, but, more importantly, because my friend would passed away in December of last year and it was to be the last time I saw him.&lt;br /&gt;&lt;br /&gt;My friend, Nathan, submitted my resume to two groups in Yahoo!  The group that contacted me was the &lt;a href="http://hadoop.apache.org/pig/"&gt;Pig group.&lt;/a&gt;  This was fortunate, because I had just begun using Pig and &lt;a href="http://hadoop.apache.org/core/"&gt;Hadoop&lt;/a&gt; at work.  I had also begun interacting with the Pig group through their mailing list.  Therefore, I was familiar with the product and could talk about it in our very first call.&lt;br /&gt;&lt;br /&gt;I was actually impressed with the phone screenings for Pig.  We talked about things relevant to the product, such as how to handle large memory footprints with Java and various join algorithms for large data sets.  We also discussed some more trivial things such as some of the differences between C++ and Java and what a virtual function is.  I actually got confused at this point and described how compilers typically implemented a virtual function instead of what they did, but we eventually sorted things out.&lt;br /&gt;&lt;br /&gt;After the first phone interview, I was fairly confident that things went well.  This was mostly due to the fact that the interviewer told me that things went well :)  She was the only phone screener to be that blunt.  The next phone screener discussed process with me.  We talked about TDD, documentation, program management and other things similar to that.  It went well and they invited me to Silicon Valley to interview in person.&lt;br /&gt;&lt;br /&gt;In retrospect, the best part about going to the Yahoo! interview was getting to see Nathan again.  It was the last time I was to see him before the motorcycle accident that led to his death.  He took me around the coast and we picked up some strawberries and cherries at a roadside stand. He also took me for a "backstage" view of the Yahoo! scene.  It appeared rather normal, other than the guy who had a mini-bar in his cube.&lt;br /&gt;&lt;br /&gt;Back to the interview.  Like the Amazon interview, all of the Yahoo! interviews took place in the same room.  The interviews varied in style, some were more puzzling (how do you find a loop in a linked list), some were more practical (tell everything you would do to design a highly available high throughput web server).&lt;br /&gt;&lt;br /&gt;Throughout the interview, I felt I needed far too many hints.  I think I did well on the design portions, but the algorithm sections were my weak point.  I ended up getting the answers, but hints were necessary.  Toward the end, I was just being self-deprecating.  I remember one question they asked about how many people I had recommended for hiring (not many about 3) and how many I had interviewed (lots).  I made the comment that for my previous company we didn't get Stanford grads and I qualified it by saying that not even I could be a Stanford grad, I just wasn't that good.  This interview plus the Google interview plus Microsoft interviews from years before had beaten me down.  I was now completely convinced I was useless.&lt;br /&gt;&lt;br /&gt;In the end, though, I came away with the impression that the people were very intelligent and would have been great to work with.  They talked about the "architect" path that I could take so that I didn't have to become a "people manager" (which sounded good).  They seemed to have a great company and it would have been loads of fun.  However, I didn't expect an offer.&lt;br /&gt;&lt;br /&gt;Surprisingly, they called not too long after the interview with an offer.  By this time, I had an interview scheduled with Amazon.com and so I asked to make my decision after that point.&lt;br /&gt;&lt;br /&gt;As you know, I didn't choose to go to Yahoo!, but that interview and offer gave me the confidence going into the Amazon.com and Microsoft interviews.  Had I not gone to the Yahoo! interview I don't know how I would have done in the other interviews.  I know I would not have been as confident and that could have prevented me from getting the position I have now.  For that, I'm thankful to both Yahoo! and Nathan.&lt;br /&gt;&lt;br /&gt;Thanks Nathan, I'll miss you, prophet!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-96360225186110639?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/96360225186110639/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=96360225186110639' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/96360225186110639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/96360225186110639'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2009/02/yahoo-interview.html' title='Yahoo! Interview'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-977138317648973708</id><published>2009-01-27T21:29:00.000-08:00</published><updated>2009-01-28T23:04:05.333-08:00</updated><title type='text'>Short-sightedness</title><content type='html'>A friend of mine sent me &lt;a href="http://blog.wired.com/business/2009/01/why-a-google-we.html"&gt;this blog post on why google web drive won't kill windows or anything else&lt;/a&gt;.  To be honest, I'm surprised by the author's short-sightedness.&lt;br /&gt;&lt;br /&gt;First, Scott mentions DropBox as a pre-existing replacement for GDrive.  He then points out that Google plans to tie the GDrive in to Google Docs and that DropBox doesn't currently have that functionality.  However, he doesn't see that as a game changer.  What he doesn't comprehend is that Google has more than just Google Docs.  Google has Gmail, Calendar, YouTube, Blogger, and an ever growing number of other sites.  They also have an operating system (Android).  So, you'll be able to turn on your netbook and have it sync your email, documents, favorite shows and blogs, etc... immediately from the cloud.  Don't think that will happen?  &lt;a href="http://gmailblog.blogspot.com/2009/01/new-in-labs-offline-gmail.html"&gt;GMail is already offering an offline syncing mechanism through Gears through GMail Labs&lt;/a&gt;  How much longer before they expand the syncing mechansim to work with other things like Google Docs, YouTube, etc...  Google has consistently been able to deliver on big ideas and this one is one of the biggest.&lt;br /&gt;&lt;br /&gt;Scott also mentions the trust issue.  Who wants Google to store their most personal documents?  I think this will become less of an issue over time.  Already people are using services such as &lt;a href="http://www.carbonite.com"&gt;carbonite&lt;/a&gt; to back thier computer up online.  How much different is it to trust an encrypted Google cloud?  I think this issue will stay a hot topic for a few years, but in 4 or 5 years when everyone is using the cloud more and more it will become a non-issue except for the most sensitive documents.  Google is already heavily advertising its security features.&lt;br /&gt;&lt;br /&gt;Another issue is downtime.  What happens when the cloud goes offline?  Once again, I think this will be less of an issue over time as the cloud becomes more stable.  Even now, how often does GMail go down?  I think my internet provider goes down more often than GMail does.  Moreover, I can't get much done without an internet connection anyway, so offline availability doesn't really help me out much.  I think the more Google convinces people that the cloud technology is stable the more they will flock to it and use it.  After all there are many benefits to cloud technology such as redundency, multi-computer availability, etc...&lt;br /&gt;&lt;br /&gt;Scott is right in saying that there are currently alternatives in DropBox and Windows Live Sync, but only Windows Live Sync has the capability of rivaling GDrive.  Microsoft has services in its &lt;a href="mail.live.com"&gt;hotmail mail service&lt;/a&gt; and its &lt;a href="http://office.live.com"&gt;online office suite&lt;/a&gt;.  They will have to continue to integrate those into the cloud to keep up with Google.  Not only that, but if they could integrate their next XBox platform into the cloud so that you could store your games on the cloud (or just download them directly from the cloud) then that would be a big plus and something that Google can't currently rival.  Having a home media system synced to Microsoft's cloud could promote using the Microsoft cloud for other things such as mail and documents.&lt;br /&gt;&lt;br /&gt;I certainly believe in Microsoft's ability to beat back the Google threat, but I'm not narrow minded enough to think that GDrive is not a threat.  It is the backbone of the internet operating system that Google is building to take on Microsoft.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-977138317648973708?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/977138317648973708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=977138317648973708' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/977138317648973708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/977138317648973708'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2009/01/short-sightedness.html' title='Short-sightedness'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-2122696767719796326</id><published>2009-01-26T23:47:00.001-08:00</published><updated>2009-01-27T00:34:03.047-08:00</updated><title type='text'>The Google Threat</title><content type='html'>Disclaimer: I work for Microsoft on their &lt;a href="www.live.com"&gt;Live Search&lt;/a&gt; product.  In no way is what I'm blogging about representative of the actual views of Microsoft.  I'm much too low level to have any input or insight into Microsoft's thought process.&lt;br /&gt;&lt;br /&gt;I see a lot of people on various message boards comment on how Microsoft should stop funding Live Search and Online Services.  Many people say that Microsoft should just focus on what they do best (developer tools, operating systems, and office) and ignore this whole "Internet Thing (TM)".  Microsoft loses millions of dollars a year competing with the Google Behemouth with very little to show for it in terms of market share.  Why not just cut your losses, spin off the division, and let it die a horrible death?&lt;br /&gt;&lt;br /&gt;I'll tell you why.  Google is Microsoft's biggest threat.  Google threatens Microsoft's operating system dominance, their developer tools dominance, and their office dominance.  If this were the Civil War, Google would be the North.  They are the ones competing on Microsoft's home turf.  They are trying to burn Atlanta, and some would say they are succeeding.  As a Microsoft employee, I am not at all scared of Apple.  They will continue to tinker with their iPhone and Macs and a few hardcore Apple fans will always be there to keep them going.  Don't get me wrong, I think the iPhone is a huge improvement.  I own one.  I like it (but don't love it).  However, Apple isn't making inroads into Microsoft's core.  Objective C is not the Visual Studio killer and OS X won't kill Windows.  Apple wants to produce the "perfect system".  And that's fine.  They'll end up creating something very beautiful that will be mimiced by others, but it will take them years to do so and they'll do so single mindedly.  They won't be diverse enough to kill the Microsoft behemouth.  Google, on the other hand, is thinking big.  They have a plan that goes after all of Microsoft's core competencies and they are taking the fight to MS.&lt;br /&gt;&lt;br /&gt;Let's look at a few examples: &lt;br /&gt;&lt;br /&gt;1. Office vs Google Apps for Business - Take a look at a number of &lt;a href="http://www.google.com/apps/intl/en/business/customers.html"&gt;business that are evaluating or have switched to Google Apps for Business&lt;/a&gt;.  Now a few things have to be said.  Many of these companies are using Google Aps in addition to MS Office.  They are using Office for thier internal communications and confidential emails and Google Aps for less sensitive material.  For now, that is the best they can do.  In addition, many of the companies are switching from other systems such as sendmail, so that's not a direct gain against MS.  Nevertheless, how long is it before Google provides encrypted email and a guarantee of privacy?  How long before they win a big MS client and other companies start looking at the cheaper Gmail system with reduced administrative costs?  This is an obvious attack and one that is gaining momentum.&lt;br /&gt;&lt;br /&gt;2. Visual Studio vs Google Web Toolkit - This is a bit of a misclassification.  Really, &lt;a href="http://code.google.com/webtoolkit/"&gt;Google Web Toolkit&lt;/a&gt; is more of an attack on Microsoft's &lt;a href="http://www.microsoft.com/azure"&gt;Azure Platform&lt;/a&gt; than on Visual Studio itself.  However, Visual Studio is included in the assault.  With Eclipse, Google Web Toolkit, and many libraries such as jUnit, Guice, etc... Google has teamed up with the Open Source community to take on MS.  Google wants developers to develop on its "platform" just like Microsfot wants developers to develop on its "platform".  That is why Microsoft developed &lt;a href="http://silverlight.net"&gt;Silverlight&lt;/a&gt;.  Silverlight allows developers to take their .NET familiarity and transfer it to the browser.  This keeps people in the Microsoft environment.  Google takes the same approach.  They want people to use its services, so they provide the Google Web Toolkit to keep people in their environment.  It's also a good testing ground for larger conquests, providing computing power and frameworks for the enterprise.  Once developers become comfortable with the Google environment, it will be an easy transition to open up their cloud to businesses and allow them to develop and deploy on it.&lt;br /&gt;&lt;br /&gt;3. Windows vs Android - Shouldn't this be Windows Mobile vs Android?  &lt;b&gt;No&lt;/b&gt;, definitley not.  Android is a direct attack on Windows and the desktop.  Already many people are speculating that Android will be released on netbooks soon.&lt;br /&gt;&lt;br /&gt;See &lt;a href="http://d0od.blogspot.com/2008/12/android-netbook-coming-early-next-year.html"&gt;Android notebook coming early next year?&lt;/a&gt;, &lt;a href="http://education.zdnet.com/?p=1970"&gt;Android netbooks? Wouldn't it be lovely&lt;/a&gt;, and &lt;a href="http://www.theinquirer.net/inquirer/news/209/1050209/android-netbook-is-a-possibility"&gt;Android netbook is a possibility&lt;/a&gt;.  Google will use their operating system to keep your information and applications in the cloud and you will be able to access them from any computer, especially your Android netbook.  You'll log in and immediately see your desktop with your applications that are stored on the cloud.  When you click on an application, it will download and begin running immediately (though many applications will still work through the web, like GMail, blogger, etc...).  &lt;a href="http://www.thevarguy.com/2008/10/24/linux-netbooks-impact-microsoft-sales/"&gt;Netbooks are already taking a chunk out of Microsoft's sales&lt;/a&gt; and having Google's name on it will only increase sales.  Also see this article on how &lt;a href="http://blogs.computerworld.com/microsoft_layoffs_netbooks_sales_are_killing_us"&gt;Netbooks sales are killing Microsoft&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I haven't tried to paint bleak picture on purpose.  Instead, I was trying to show that Google is taking the battle to Microsoft and Microsoft must respond.  Search, in particular &lt;a href="http://www.live.com"&gt;Live Search&lt;/a&gt; is a key component to that.  But, it is not the only component.  &lt;a href="http://www.microsoft.com/windows/windows-7/"&gt;Windows 7&lt;/a&gt; and Azure are other key components.  In the future, people's computers will live on the cloud.  Search will go beyond finding web pages.  Instead, you'll perform searches for applications that will fit with your current settings.  You might even rebuild your OS components in the cloud specifically to fit your library versions.  You'll search for a song and not only get an mp3, but also a list of movies that you own that have that song in them.  You might, if your search options are set correctly, even get a list of similar songs, or songs you played before or after that song.  Search is the backbone of the next generation computer and the next generation HCI.  Google, I believe, backed into this and is now expanding it to its inevitable conclusion.  Microsoft realized it after the fact and is rushing to catch up.  Regardless, we need competition and I believe that Microsoft has the resources and the dedication to provide that competition.&lt;br /&gt;&lt;br /&gt;Needless to say, the things I outlined above are not going to happen overnight, but Google is taking a long term view.  So is Microsoft.  Google is using their advertising revenue to subsidize their desktop pursuits.  Microsoft is using their desktop revenue to subsidize thier advertising pursuits.  Both are in it for the long haul.  It will take years for Google to implement some of the things I discussed above.  I expect 8-10 years will pass before all of our data and programs live in the cloud.  I expect another 10 years will pass before most businesses data and programs live in the cloud.  Both companies will be here after that time has passed, which company will be the dominant one?  I have no idea, but it will be exciting to find out!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-2122696767719796326?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/2122696767719796326/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=2122696767719796326' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/2122696767719796326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/2122696767719796326'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2009/01/google-threat.html' title='The Google Threat'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-418875118890694246</id><published>2009-01-10T16:45:00.000-08:00</published><updated>2009-05-28T00:15:44.952-07:00</updated><title type='text'>Browser Toolbars</title><content type='html'>Recently, Microsoft announced &lt;a href="http://ces.cnet.com/8301-19167_1-10135067-100.html"&gt;a deal with Dell to distribute the MSN toolbar with new computer purchases&lt;/a&gt;.  This comes after previous announcements with &lt;a href="http://www.pcworld.com/article/153589/msn_sun_deal.html"&gt;Sun&lt;/a&gt; and &lt;a href="http://www.microsoft.com/presspass/press/2007/mar07/03-13LenovoLivePR.mspx"&gt;Lenovo&lt;/a&gt;.  While I am excited about the traffic this will bring to &lt;a href="http://www.live.com"&gt;Live Search&lt;/a&gt;, I have to say that I hate browser toolbars.  Seriously, what good are they?  Most browsers already have the functinality that the toolbar provides: search box, term highlighting, etc...  The MSN Toolbar does provide a few interesting twists like automatically launching Live Messenger, but on the whole, who needs them?  They just use up space and memory.  My wife's computer has both the Yahoo! toolbar and the Google toolbar on it.  I have to go take them both off now...&lt;br /&gt;&lt;br /&gt;You know, what I'd really like is a browser that prohibits toolbars, that I could use.  And while I'm on that topic, over Christmas I installed extra RAM in my father-in-laws computer because it was going slow (it only had 256 MB of RAM).  I also noticed that he hadn't upgraded from IE 6 and had some Yahoo! toolbar that provided virtual tabs of some sort.  Why hadn't the browser updated itself to IE7?  Seriously, why doesn't our software just fix itself?  Why don't my drivers automatically update?   ARRRGGG!!!!&lt;br /&gt;&lt;br /&gt;Ok, I feel better.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-418875118890694246?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/418875118890694246/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=418875118890694246' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/418875118890694246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/418875118890694246'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2009/01/browser-toolbars.html' title='Browser Toolbars'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-6205869772527623053</id><published>2009-01-09T22:52:00.000-08:00</published><updated>2009-01-09T22:53:04.459-08:00</updated><title type='text'>New Layout</title><content type='html'>As you can tell, I picked a new layout from blogger.  Let me know what you think.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-6205869772527623053?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/6205869772527623053/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=6205869772527623053' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/6205869772527623053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/6205869772527623053'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2009/01/new-layout.html' title='New Layout'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-6888644665003287981</id><published>2009-01-08T07:01:00.000-08:00</published><updated>2009-01-09T22:51:47.641-08:00</updated><title type='text'>Rules for running an IT organization</title><content type='html'>The last post was how to run a research organization.  In this post, I'm going to set my sights even higher and tell how to run an IT organization.  These rules have been picked through my studies of various companies.&lt;br /&gt;&lt;br /&gt;1. &lt;b&gt;Hire the best people&lt;/b&gt; - I've harped on this before.  So have &lt;a href="http://www.joelonsoftware.com/articles/HighNotes.html"&gt;others&lt;/a&gt; and &lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=4738"&gt;others&lt;/a&gt; and still &lt;a href="http://blogs.construx.com/blogs/stevemcc/archive/2008/03/27/productivity-variations-among-software-developers-and-teams-the-origin-of-quot-10x-quot.aspx"&gt;others&lt;/a&gt;.  If you don't know by now that there is at least a 10x difference between the top programmers and everyone else then you haven't been paying attention.  I can't say much on this topic that hasn't already been written, but I will point out that you need to be proactive about hiring the right people.  It's not just the &lt;a href="http://money.cnn.com/galleries/2008/fortune/0801/gallery.BestCo_Google_8.fortune/9.html"&gt;free food&lt;/a&gt;.  It's about providing employees with incentives to do &lt;i&gt;great&lt;/i&gt; work.  If you just need a warm body, then provide him with a steady paycheck.  But if you work in IT, you don't want warm bodies, they are not in the 10x group.  You want the best, so you have to make it worth it.  You have to make them feel important and wanted.  You have to put effort into finding them at the top colleges, recruting them, and retaining them.  If you are a small company, you can provide stock options.  A large company?  You can provide free food :-)  Either way, you have to provide challenging problems, a sense of ownership, and other fantastic people to work with.  Remember, if you have ten of the 10x group that is equivalent to one-hundred of everyone else.  If you don't think that is true because of parallelism, etc... you are wrong.  Parallelism doesn't apply because the communication pathways increase leading to &lt;a href="http://portal.acm.org/citation.cfm?id=1010809.1010812&amp;coll=GUIDE&amp;dl=GUIDE"&gt;lower overall productivity&lt;/a&gt;.  Just like you don't get a linear increase with most parallel algorithms, the same applies for programmers.  The &lt;a href="http://en.wikipedia.org/wiki/Brooks'_law"&gt;communication overhead gets in the way&lt;/a&gt;.  Therefore, with ten 10x programmers you can be &lt;b&gt;more productive&lt;/b&gt; than with one-hundred other programmers.  And you don't even have to pay them 10x as much, though you will have to pay some extra.  With the savings, you can provide more stock options or free food :-)&lt;br /&gt;&lt;br /&gt;2. &lt;b&gt;Make the source available to all&lt;/b&gt; - Everyone in the company should have access to all the source code.  At Google, the designers of the library can easily update it, because they can open everyone else's code up in eclipse, choose refactor, and then save and recommit it.  They are &lt;a href="http://butunclebob.com/ArticleS.UncleBob.ThePrimeDirectiveOfAgileDevelopment"&gt;not blocked.&lt;/a&gt;  In addition, an open code base implies group accountability.  Too often, programmers get too attached to their work.  They don't see the flaws that are inevitable in their programs.  An open code base allows everyone to view and comment on everyone else's work.  It forces programmers to realize that they are mortal and make mistakes.  Eventually, they will come to know that the group is better than the individual and their work improves due to peer review.  Forcing an open code base allows this to happen sooner and with more acceptance.&lt;br /&gt;&lt;br /&gt;3. &lt;b&gt;Dedication to infrastructure&lt;/b&gt; - Who is responsible for the build system?  Who writes the core infrastructure components?  Who sets up the distributed computing system?  Who determines which dependency injection framework should be used?  All of these are core infrastructure decisions and they all matter.  As we'll see in a future bullet point, standardizing the infrastructure is vital.  You want your application programmers to focus on their individual application.  If every application programmer has to focus on their infrastructure, then you are losing 3 to 6 months out of every project.  If it takes a week to set up an automated build system and a week to attach the test harness and another week to set up the distributed key/value store, then you have lost 3 weeks of your project to things that have to occur for nearly every project!  Instead, you want application programmers to think about their application.  You want them to worry about delighting their customers.  They need an automated build system, but they shouldn't have to think about which one to use, how to set it up, or what happens when it isn't working.  That is infrastructure.  In the past, there were extra teams responsible for hardware, networking, and OS setup.  These were not the responsibility of programmers.  Now, we're adding additional layers.  The build system, test framework, and distributed computing platform are additional infrastructure components that must be standardized and managed elsewhere.  There could be additional infrastructure components for your organization as well.  For instance, &lt;a href="http://code.google.com/p/google-guice/"&gt;Google uses dependency injection so often that they wrote their own framework for it.&lt;/a&gt;  Notice that I didn't say every team wrote their own framework.  Instead, one team wrote it and maintains it and everyone else uses it.  This consistency and willingness to use other people's work makes for a successful company.  As another example, Google has a &lt;a href="http://code.google.com/p/google-collections/"&gt;Java collections library&lt;/a&gt; that the company uses.  Every team can take advantage of this without having to rewrite it.  &lt;b&gt;&lt;i&gt;In other words, the goal of the infrastructure group is to find and eliminate duplication throughout the company.&lt;/i&gt;&lt;/b&gt;  This could be with hardware, applications, or libraries.  Regardless, duplication is the enemy of the IT organization and it must be eliminated!&lt;br /&gt;&lt;br /&gt;4. &lt;b&gt;Repeatability&lt;/b&gt; - Everything that is put into production must be a repeatable process.  Not only that, but it must be repeatable by someone else!  This means both applications and documentation must be written and available that show how to repeat it.  Once again, we're trying to seek out and eliminate duplication.  Programmers in the future shouldn't have to reverse engineer or re-create your application.  If it is worth putting into production, then it is worth documenting and ensuring repeatability.&lt;br /&gt;&lt;br /&gt;5. &lt;b&gt;Enforcing standards&lt;/b&gt; - You want programmers to feel empowered, but you also want productivity.  You need standards to ensure the latter, but you need only the &lt;i&gt;right&lt;/i&gt; standards to ensure the former.  Standardizing on one build system (perhaps per language) ensures that everyone can access and build everyone else's code.  Standardizing on a common base class ensures pandamonium.  You want to standardize tools, not techniques.  Not only does this allow programmers to quickly move from one project to the next, but it also provides continual feedback and improvement on your internal tools.  When a programmer says, "Tool X doesn't provide capability Y so I'll write my own" you are in for disaster.  Now, every project begins with a 3 week tool writing cycle.  Instead, if the programmer would just fix Tool X then everyone else can take advantage of capability Y.  Libraries work the same way.  Pick a dependency injection library and use it across the organization.  It doesn't matter if one team happens to like Spring over Guice.  They are both open source and you can alter it to suit your needs.  Just pick one and be consistent.  &lt;b&gt;&lt;i&gt;Get everyone moving in the same direction.&lt;/i&gt;&lt;/b&gt;  That way, when they increase others' velocity &lt;b&gt;&lt;i&gt;they move in that direction even faster&lt;/i&gt;&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;6. &lt;b&gt;Don't start from scratch&lt;/b&gt; - If nothing exists, then you have to start from scratch.  However, if you have a working product, then &lt;a href="http://www.joelonsoftware.com/articles/fog0000000069.html"&gt;don't start rewriting it from scratch&lt;/a&gt;.  The only thing you do is create new bugs that you don't know about instead of fixing the old ones you already knew about.  Now, that doesn't mean that you shouldn't take a troublesome component and rewrite it.  That doesn't even mean that over the course of a year you don't eventually rewrite 90% of the application.  It does mean that you work piecemeal, with &lt;a href="http://www.amazon.com/Working-Effectively-Legacy-Robert-Martin/dp/0131177052"&gt;legacy code&lt;/a&gt;.  You create tests, if you don't have them.  You write documents, if you don't have them.  You continually improve the product you have.  Then, when you are ready, you begin &lt;a href="http://www.refactoring.com/"&gt;refactoring&lt;/a&gt;.  You improve its structure a little bit at a time.  Just enough to add your new functionality with new tests.  Then a little more and a little more.  Eventually, your crufty working system blossoms into a beautiful piece of artwork.  Well, you'll think so anyway, but the next developer won't understand why you did X, Y, and Z and he'll want to rewrite it from scratch.  That's the problem and the point.  When we don't understand how something works, we want to rewrite it so that we do.  However, the next maintainner doesn't understand it either, so the rewrite circle continues and is vicious.  If something works, use it, clean it, modify it.  Don't rewrite it.&lt;br /&gt;&lt;br /&gt;7. &lt;b&gt;Be dedicated to testing&lt;/b&gt; - The best organizations have dedicated testers.  This is not a coincidence.  Recognizing quality as a core attribute of a product is vital to having a quality product.  Manufacturing companies have known this forever.  Why is it that IT shops think they can ignore quality and still have a quality product?  Google's Chrome has &lt;a href="http://velocipeek.com/2008/09/02/new-browser-google-chrome/"&gt;unit tests for highly ranked web pages, automated UI testing, and random input testing&lt;/a&gt;.  Not only that, but they also ran other test suites against it.  For instance, it passes 99% of webkit's layout tests and passes all but 2 of jQuery's unit tests.  Quality is a core attribute.  At Microsoft, there is a &lt;a href="http://blogs.msdn.com/jobsblog/archive/2004/05/27/143419.aspx"&gt;Software Development in Test job role.&lt;/a&gt;  Each team is assigned one or more of these resources to ensure they deliver a quality product.  These people are top notch programmers that love to break things.  They are not random guys off the street.  They can code just as well as the SDE's and it is vital that they can do so.  Testing today is about coding.  It is about &lt;a href="http://butunclebob.com/ArticleS.UncleBob.TheSensitivityProblem"&gt;double entry bookkeeping&lt;/a&gt;.  It is about automation and repeatability.  People expect thier products to work, out of the box.  They expect future releases to be backwards compatible.  They expect a quality product.  To delivery that, quality must be a feature.  The organization must be dedicated to quality - having a special testing division is one way to commit to that level of dedication.&lt;br /&gt;&lt;br /&gt;8. &lt;b&gt;Metrics&lt;/b&gt; - "&lt;i&gt;In God we trust, all others bring data.&lt;/i&gt;"  Metrics are at the core of process improvement.  How can you possibly know if you are improving if you don't measure that improvement?  Would you be satisfied with your water treatment plant if it told you the water quality was improving because it looked a bit clearer?  No.  You'd want to know the Ph levels, the amount of sediment in the water, etc...  You expect a quality product to have metrics that back up its quality.  If speed is a feature, then you'd expect metrics around how fast the product will go in certain conditions.  If accuracy is a feature, then you'd expect benchmarks showing the accuracy against other products or human judges.  In all cases, metrics are vital to a product in order to show improvement and achievement of goals.  The one caveat is to be sure you are measuring the right thing.  It is inevitable that programmers will find a way to improve the metrics.  If the metrics are measuring the right thing, then that is great.  If the metrics are measuring the wrong thing, say lines of code, then you have a recipe for disaster.  Make sure that your metrics are measuring externally visible things, not internal ones.  You want improvements to your metrics to affect the customer, not your programmer's salary.  &lt;a href="http://thedailywtf.com/Articles/Productivity-20.aspx"&gt;Everyone cheats the system&lt;/a&gt;, you want those cheats to have a positive impact on your final product.&lt;br /&gt;&lt;br /&gt;Well, there you have it.  8 rules for running an IT organization.  Hopefully they will make your company the next IT powerhouse!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-6888644665003287981?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/6888644665003287981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=6888644665003287981' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/6888644665003287981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/6888644665003287981'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2009/01/rules-for-running-it-organization.html' title='Rules for running an IT organization'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-7229412490457349579</id><published>2009-01-06T22:44:00.000-08:00</published><updated>2010-05-07T15:40:13.166-07:00</updated><title type='text'>Applied Research</title><content type='html'>At one point in my career, I had the experience of being on an applied research team.  In fact, I was one of its founding members.  At the time, I wasn't sure what applied research was; even now, I can't say for sure I know.&lt;br /&gt;&lt;br /&gt;For our team, applied research was new product development.  Honestly, I think that had disastrous effects.  We were in limbo between delivering a new product and maintaining our "research" mantra.  In the end, we wanted product teams to adopt and maintain our product.  This, too, led to tension.  Product teams want to feel comfortable with what they will eventually own.  They want to use and support things they have used and supported in the past.  Research products are wild-cards and not to be used unless nothing else like it exists.  Even then, most product teams will choose to rewrite it.  Take, for instance, &lt;a href="http://hadoop.apache.org/pig/"&gt;Pig&lt;/a&gt;.  Pig is a dataflow language created by Yahoo! Research to run on &lt;a href="http://hadoop.apache.org"&gt;Hadoop&lt;/a&gt;.  It was created to prove a point, but it was also created to be used.  However, once it transfered to a product team in Yahoo!, it was scheduled for rewrite.  I'm not sure the cause.  It could be &lt;a href="http://en.wikipedia.org/wiki/Not_Invented_Here"&gt;Not Invented Here&lt;/a&gt; syndrome.  It could be that research teams are not focused on the long term, so they deliver a short term product.  It could be that research teams don't know how to code or that product teams and research teams speak a different language, so they can't see eye to eye.  Regardless, having a research team deliver to a product team is doomed to failure, if you count failure as an eventual rewrite of the product or technology.&lt;br /&gt;&lt;br /&gt;To help guide my thoughts on this matter, I had the good fortune to speak to &lt;a href="http://en.wikipedia.org/wiki/Hector_Garcia_Molina"&gt;Hector Garcia-Molina&lt;/a&gt; of Stanford University.  If you don't know who this guy is, you are missing out.  Stop and go read the wikipedia entry linked to above.  He recounted to me his description of what a research organization should do.  I'll recount here and embelish a little.&lt;br /&gt;&lt;br /&gt;First, a research organization should publish.  The benefit of publishing is that it brings notariety/publicity to your organization.  The company's sales force can go to battle with slides that reference conference proceedings.  Of course, no sales person would read the proceedings, but it does make their presentation look legit.  In addition, presenting at conferences allows the researches to make the aquantence of people like Dr. Garcia-Molina and bring new insight and innovations back.  Finally, publishing creates an attractive employment environment.  New graduates from top schools want to go to a place that has a publishing history so that they can continue their research.  To get a graduate of MIT or Stanford, you need a publication record.  I'll add one more to his list.  I think a research department that publishes shows a commitment to innovation by the company; a commitment that roots itself in the culture and makes the company a hotbed of innovation.&lt;br /&gt;&lt;br /&gt;Second, a research organization can be used as a SWAT force.  Tackling a hard problem or subset of the problem.  I think this can be the area where the most "good" can be done internally.  Instead of creating a product, create an extension to an existing product.  There are always "next version" features that never get created.  These features either provide too little value or are too difficult.  It is that latter segment where the research department can really shine.  Since they are not constrained by time to market, etc..., the research department can think outside the box and take the time to create an "academic" solution.  For example, &lt;a href="http://en.wikipedia.org/wiki/PageRank"&gt;PageRank&lt;/a&gt; was an academic solution to the problem of which web sites were more popular.  It is a beautiful recursive algorithm that just happens to produce great results.  Is it a perfect algorithm?  No, of course not.  Was it better than the "engineering" algorithms of the time?  You betcha!  It was what happened when two academics got together and had the time to think about the problem.  They realized the probelm was similar to that of research paper citations, so they devised an algorithm that treated the problem thusly.  Had they had to meet an arbitrary deadline so that their employer could make the trade show deadline, they would not have come up with PageRank.  That is the benefit of a research team.  Not to create some fancy product for the trade show, but to take the existing product the next step.  To finish out the "next version" features and do so elegantly.&lt;br /&gt;&lt;br /&gt;The final task for a research organization is to benefit the company at large.  There are many ways to do this.  One is to create best practices and spread them out to the other development teams.  Another is to investigate various technologies and report on how they could/should be used throughout the company.  An additional way could be to create the infrastructure to ensure developer productivity if no other team is responsible for it.  Do developers have access to distributed key/value stores?  If not, install &lt;a href="http://memcachedb.org/"&gt;MemcacheDB&lt;/a&gt; or &lt;a href="http://couchdb.apache.org/"&gt;CouchDB&lt;/a&gt;, and help developers to connect to it by creating modules in various languages.  Do developers understand and have access to technologies like Hadoop and Pig?  If not, create demos and give a roadshow.  All of these things lay in the "best practices" umbrella and often organizations don't have the teams in place to create and distribute the "know-how" required to use them.&lt;br /&gt;&lt;br /&gt;In all three cases, the applied research team stayed away from the product team's core product.  Instead, the research team focuses on small, manageable pieces that fit nicely into the strategy already outlined by the product team.  This creates trust and will foster future collaborations between the product and research teams.&lt;br /&gt;&lt;br /&gt;Good luck and let me know of your experiences dealing with research teams!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-7229412490457349579?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/7229412490457349579/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=7229412490457349579' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/7229412490457349579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/7229412490457349579'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2009/01/applied-research.html' title='Applied Research'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-9115081174750719289</id><published>2009-01-03T15:50:00.000-08:00</published><updated>2009-01-03T15:51:49.096-08:00</updated><title type='text'>Gay Boyfriend</title><content type='html'>I'm not sure which one I like the best&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=38UnUqIDY5w&amp;NR=1"&gt;dorky fan version&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=7nAond4ZQHQ"&gt;dorky house version&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-9115081174750719289?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/9115081174750719289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=9115081174750719289' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/9115081174750719289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/9115081174750719289'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2009/01/gay-boyfriend.html' title='Gay Boyfriend'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-5622752160884200517</id><published>2009-01-03T13:34:00.000-08:00</published><updated>2009-01-03T13:35:01.051-08:00</updated><title type='text'>Ouch</title><content type='html'>&lt;a href="http://searchengineland.com/report-microsoft-to-lay-off-15000-workers-15986"&gt;I hope not&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-5622752160884200517?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/5622752160884200517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=5622752160884200517' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/5622752160884200517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/5622752160884200517'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2009/01/ouch.html' title='Ouch'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-2459754336704122643</id><published>2009-01-01T19:30:00.001-08:00</published><updated>2009-01-01T19:32:52.734-08:00</updated><title type='text'>Facebook lament</title><content type='html'>I have too many facebook friends.  I lament it.  I only have about 5 that I actually want to monitor and communicate with; however, when people request friendship I don't want to say 'no, I care nothing for you.'  I really want a "preferred facebook" view where I can just track and interact with those I care to.  One would think that it is not that big of a deal, but it really is.  For instance, I just went to superpoke a friend of mine and it took far too long because I had to find that person in my list of friends (and I don't have *that* many).  It actually reduces the amount of time I spend on facebook.&lt;br /&gt;&lt;br /&gt;Less is more.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-2459754336704122643?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/2459754336704122643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=2459754336704122643' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/2459754336704122643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/2459754336704122643'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2009/01/facebook-lament.html' title='Facebook lament'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-7393089158349438580</id><published>2009-01-01T17:51:00.000-08:00</published><updated>2009-01-01T18:40:34.497-08:00</updated><title type='text'>Infinities and Series</title><content type='html'>Those of you who read this blog (all 1 of you!) know that the number of integers is infinite and the number of irrational numbers is infinite, but the latter infinity is greater than the former infinity.  I tend to think of this as mathematical shenanigans.  The idea that one infinity is larger than another just doesn't meet the "beauty" test that accompanies mathematics.  In the past, I've argued that infinities don't exist, so we can make contradicting remarks about them to our hearts content.  It's similar to asking the question "Can God make a rock so big even he can't lift it?"  The words make sense and are in the right order, but the semantics of the sentence are off.  They produce a &lt;a href="http://en.wikipedia.org/wiki/Barber_paradox"&gt;barber paradox&lt;/a&gt; that belongs to the realm of meaninglessness. They show that &lt;a href="http://en.wikipedia.org/wiki/Goedel"&gt;Goedel&lt;/a&gt; is alive and well and relevant for today's meta-mathematical problems, if only we'd heed his words.  Ok, back to infinities.&lt;br /&gt;&lt;br /&gt;First, can we create a more intuitive reason for why one infinity might be greater than the other, a reason that doesn't fall back on establishing a one-to-one correspondence with the integers?&lt;br /&gt;&lt;br /&gt;First, let's establish that the integers exist in one-dimensional space.  In fact, they exist on a number line which is the definition of one-dimensional space :-)  But, let's consider a slightly different definition of dimensionality.  In this definition, we'll look at the number of infinite dimensions.  In the case of integers, the length of the integer is finite.  No matter how big the integer becomes, there is always a finite number of digits.  Even if the integer explodes to a googolplex digits, there is still a finite number of them.  Therefore, the only infinity is in how many integers there are, the size of the actual integer is finite.  So, there is only one dimension of infinity.&lt;br /&gt;&lt;br /&gt;Let's now look at rational numbers.  In the case of rational numbers you might say that there are two dimensions of infinities.  The first dimension is the number of rational numbers.  There are an infinite number of rational numbers.  The second dimension is that some rational numbers have an infinite decimal expansion.  For example, 1/3 has an infinite expansion of 0.333333333...  Therefore, rational numbers have two dimensions of infinity and should be larger than integral numbers, right?  Not so fast.  That's just their decimal expansion.  If you keep them in their functional form, then we get a different story.  All rational numbers can be expressed as the division of two integers.  Moreover, we know that both integers have a finite number of digits.  Finally, we know that adding two integers with a finite number of digits will produce a third integer with a finite number of digits.  Therefore, there is a representation that is finite in length for every rational number.  That leads to the logical conclusion that all rational numbers have one dimension of infinity.&lt;br /&gt;&lt;br /&gt;Next up, irrational numbers.  Irrational numbers extend to positive and negative infinity, giving one dimension of infinity.  In addition, they have an infinite expansion &lt;i&gt;in every base&lt;/i&gt;, which gives them a second dimension of infinity.  So, we can easily see why there are more irrational numbers than rational numbers, because we allow irrational numbers to have an infinite expansion!&lt;br /&gt;&lt;br /&gt;So, if we can't represent irrational numbers with a fixed number of rational numbers, what can we represent them with?  Why, an infinite number of rational numbers, of course!  For example, PI can be represented by the following series (&lt;a href="http://functions.wolfram.com/Constants/Pi/06/01/01/"&gt;one of many&lt;/a&gt;): PI = 4 * (SUM[k=0 to inf] (-1^k)/(2k+1))&lt;br /&gt;&lt;br /&gt;So, in essence, we have an infinite set of numbers each composed of an infinite set of numbers.  Two dimensions of infinity!&lt;br /&gt;&lt;br /&gt;But wait!  If we can create a series to represent each irrational number, does that mean that there exists a representation that is not infinite and therefore we can count them, similar to the rational numbers above?  No. With rational numbers there was a &lt;i&gt;finite&lt;/i&gt; number of integers that created the rational number.  With irrational numbers there is an &lt;i&gt;infinite&lt;/i&gt; number of rational numbers.&lt;br /&gt;&lt;br /&gt;So, it is true that the number of irrational numbers exceeds the number of rational numbers, right?  Well, maybe.  I think it is fair to say that an infinitely expanded irrational number doesn't exist, so we're back to the land of Goedel.  It is worth thinking of an irrational number as a function of an infinite number of rational numbers much the same as a rational number is a function (division) of two integers.  Functions are often useful in mathematical manipulations, but that doesn't make them "real".  The number 3 is a physical, real number.  You can count out 3 things.  The number PI is not a physical, real number.  We can only approximate it.  In fact, complex analysis is based around the number i, which is a function (sqrt) applied to -1.  As long as we don't expand the function, we can do mathematics with it, but if we ever need to expand it our equations blow up.  The same thing is true with irrational numbers, they are mathematical niceties.  Abstractions that we can manipulate as long as we don't look too closely.  Similarly, questions about abstractions such as if one abstraction is infinitely larger than another abstraction requires you to look to closely, so you get crazy results, just like if you had really taken the sqrt of -1 or divided by infinity (another function).&lt;br /&gt;&lt;br /&gt;So, the next time you see PI, take it for what it is, a function that can be evaluated to the necessary precision.  A mathematical abstraction that can be admired from afar.  Just don't get too close.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-7393089158349438580?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/7393089158349438580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=7393089158349438580' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/7393089158349438580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/7393089158349438580'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2009/01/infinities-and-series.html' title='Infinities and Series'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-4244768829400950641</id><published>2008-12-30T18:40:00.000-08:00</published><updated>2008-12-30T20:03:47.417-08:00</updated><title type='text'>North vs South</title><content type='html'>I've been in the Pacific Northwest for four months now and I thought I'd share a few of the differences I've noticed.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;In the South, we have sweet tea.  In fact, we have most any fattening item you can imagine: gravy, lard, fatback, etc...  In the Northwest, everyone drinks their tea unsweetened and even IHOP lists the number of calories in their food.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;In the South, you drive everywhere.  If you take the bus or walk you are most likely poor and almost always frowned upon.  In the Northwest, you are hailed as a hero and considered "green".&lt;/li&gt;&lt;br /&gt;&lt;li&gt;In the South, PTA was for the crazies who had nothing better to do with their money.  In the Northwest, our PTA paticipation is at 100% for the third year straight.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;In the South, the kids look forward to deer season.  In the Northwest, the kids look forward to the new Star Trek movie.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;In the South, teachers send letters home with the children.  In the Northwest, teachers email the parents&lt;/li&gt;&lt;br /&gt;&lt;li&gt;In the South, we get our coffee from McDonalds.  In the Northwest, the city would shut down if Starbucks closed.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;In the South, the biggest technical gathering is when Ma Potter drops the security on her wireless router.  In the Northwest, you are constantly bombarded with invites to technical events.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;In the South, a top IT graduate comes from Vanderbilt.  In the Northwest, a mediocre hire comes from Berkeley.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;In the South, the churches are dense, huge and filled with Southerners.  In the Northwest, the churches are sparse, huge and filled with former Southerners.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;I'll pause here and reflect on a few things.  First, with regards to schools, it is easy to find a correlation between money spent and quality.  The schools in the Northwest are better funded.  Heck, my daughter's school here has a buffet!  However, those people who feel that spending more on education will fix it have missed the boat.  The real issue is parental involvement and peer pressure.  In our schools the children challenge each other and the parents are involved.  At our PTA social events nearly everyone is there.  We, and the children, want each other to succeed.  No amount of money will make kids want to have a read-in instead of play outside.  No amount of money will make kids come to school dressed as their favorite storybook character instead of their favorite pop-star.  No amount of money will make kids succeed.  It takes dedicated parents.  Moreover, it takes a school full of dedicated parents.  Otherwise, you will run into the problems faced by other behavioral economists.  The smart kid with dedicated parents will be ostracized.  He or she will be considered an outcast.  After all, they aren't going to be staying around after graduation, so why invest your friendship in them?  You need an entire school full of dedicated children and dedicated parents in order to succeed.  Money won't help, changing the culture is required.&lt;br /&gt;&lt;br /&gt;Secondly, you can see the failure of the church in the Northwest.  The educated, affluent people avoid the church while the Southerners flock to it.  I think there are a number of factors at play here.  First, the larger churches are getting the publicity and they are taking a stance against education.  I have personally been in a church where the pastor said that anyone who believed in the Big Bang is going to hell.  I didn't go back to that church.  However, if a church accepts everyone and everything then there is no point in going.  You can socialize on the net.  So, there is no middle ground.  The educated people are turned off from the backwards southern denominations and have no reason to attend the more "progressive"/"liberal" variants.  If higher education becomes the norm in the South (which is a big question mark), then the church as we know it is doomed.  The church must find its way in a new era.  It must bridge what we know to be true, scientifically, with what we believe to be true, spiritually.  It must exclude certain things as immoral, even though it accepts them civically.  For instance, homosexuality is banned in the Bible.  However, so is adultery.  No churchmember protests the legality of adultery; hell, half of them have committed it themselves.  But homosexuality is an abomination!  The same goes with other moral sins such as lying and blaspheming.  The church needs to realize that it does NOT have a civic duty to outlaw immoral behavior.  No one can legislate morality and those that do are seen as haughty and hippocritical.  Instead, they should accept that the world's morality and the church's morality are different.  Christians are "sanctified".  Before Christianity, to sanctify something was simply to set it apart; there was no religious meaning.  If the church gets to legislate everything, then there is no more sanctification; we are just like everyone else and that is not our mandate.  We are to work in the world and change the people.  That can only be done by example.  Right now, we're not setting a good example.  It won't be long until the church is completely irrelevant outside a few poor areas where their only role is to give the poor hope.&lt;br /&gt;&lt;br /&gt;In total, I've really enjoyed living in the North.  I have no idea if I'll stay here long term, but it's been a great experience so far and I'm glad I was given the opportunity.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-4244768829400950641?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/4244768829400950641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=4244768829400950641' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/4244768829400950641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/4244768829400950641'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/12/north-vs-south.html' title='North vs South'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-3330196066745497002</id><published>2008-11-23T03:35:00.000-08:00</published><updated>2008-11-23T04:24:24.646-08:00</updated><title type='text'>C# Awesomeness</title><content type='html'>As you can imagine, my &lt;a href="http://www.live.com"&gt;current employer&lt;/a&gt; gives me a number of opportunities to work in C#.  I've really been enjoying myself, but only scratching the surface of what C# was capable of.  So, tonight, I tried a few more interesting ideas that use the C# anonymous types and lambda function capabilities.&lt;br /&gt;&lt;br /&gt;The first one is a pretty simple copy of &lt;a href="http://www.ruby-doc.org/core/classes/IO.html#M002280"&gt;ruby's IO.each_line&lt;/a&gt; function.  My goal is to have the C# function encapsulate the logic of opening and closing the file and me pass in a lambda that does the processing I want (just like Ruby's).&lt;br /&gt;&lt;br /&gt;Here's the code&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;1    public delegate void IOProcessor&amp;lt;T&amp;gt;(T line);&lt;br /&gt;2    public static void ForEachLine(string fileName, IOProcessor&amp;lt;string&amp;gt; processor)&lt;br /&gt;3    {&lt;br /&gt;4        using (StreamReader reader = new StreamReader(fileName, Encoding.UTF8))&lt;br /&gt;5        {&lt;br /&gt;6            while (!reader.EndOfStream)&lt;br /&gt;7            {&lt;br /&gt;8                processor(reader.ReadLine());&lt;br /&gt;9            }&lt;br /&gt;10       }&lt;br /&gt;11   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;First, I declare a delegate.  In C or C++, it would be a function pointer.  Here, it is more than that because it can be generic, which is utter coolness in a box.  We'll see the point of the genericity in a moment.&lt;br /&gt;&lt;br /&gt;The next line declares my function which takes the file name and the delegate (we will be giving it a lambda.)  Here, we explicitly set the generic parameter to a string because we know that is what we are retrieving from the file.&lt;br /&gt;&lt;br /&gt;The using statement opens the file, specifying a UTF-8 encoding.  It will also ensure the file is closed whether or not an exception occurs.&lt;br /&gt;&lt;br /&gt;Finally, we have a loop that reads each line and passes it to the delegate until we run out of lines.  Very simple and straightforward.&lt;br /&gt;&lt;br /&gt;If we wanted to use this code to sum up the lines in a file we could write code like the following.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;1    int sum = 0;&lt;br /&gt;2    &lt;br /&gt;3    ForEachLine("my_integers.txt", (line) =&gt; { sum += int.Parse(line); });&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;After line 3 finishes, sum contains the sum of each line in the file.&lt;br /&gt;For instance, if the file was&lt;br /&gt;10&lt;br /&gt;20&lt;br /&gt;30&lt;br /&gt;40&lt;br /&gt;Then sum would be 100.&lt;br /&gt;&lt;br /&gt;Another thing I do a lot of is handle delimited files.  Usually, I'll open one up, perform a line by line manipulation of the file, and close it back.  Of course, the obvious string.Split() method comes to mind, but that is somewhat unsatisfactory because you are still dealing with integer offsets into an array.  How do I know that offset 3 is the anchor text and offset 7 is the ubercool feature?  It would be nice, if I could specify their names in the beginning and then work with objects.&lt;br /&gt;&lt;br /&gt;So, to handle that, I created a function that would objectify my delimited files.&lt;br /&gt;&lt;br /&gt;Here goes:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;1    public static IEnumerable&amp;lt;T&amp;gt; EachDelimitedLine&amp;lt;T&amp;gt;(&lt;br /&gt;2           string fileName, char delimiter, T outputObject)&lt;br /&gt;3    {&lt;br /&gt;4        Type outputType = outputObject.GetType();&lt;br /&gt;5        using (StreamReader reader = new StreamReader(fileName, Encoding.UTF8))&lt;br /&gt;6        {&lt;br /&gt;7            while (!reader.EndOfStream)&lt;br /&gt;8            {&lt;br /&gt;9                string[] fields = reader.ReadLine().Split(delimiter);&lt;br /&gt;10               yield return (T) Activator.CreateInstance(outputType, fields);&lt;br /&gt;11           }&lt;br /&gt;12       }&lt;br /&gt;13   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I'll break this function down line by line in the next blog.  Specifically, it takes in a prototype object called outputObject and creates an object like that from each line of the delimited file, using the strings after splitting to initialize the object.  I call this function like&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;1    foreach(var x in &lt;br /&gt;2       EachDelimitedLine("delimitedFile.txt", ',', &lt;br /&gt;3                         new { Title = "", Body = "", Anchor = "" }) &lt;br /&gt;4    {&lt;br /&gt;5       if (x.Title == "Thoughts of Me")&lt;br /&gt;6       {&lt;br /&gt;7         // do something with my blog...&lt;br /&gt;8       }&lt;br /&gt;9    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;As you can see, I specify a prototype object of an anonymous type and my code uses that prototype to create objects from the delimited file.  Of course, in production code you would want checks for too few fields or too many fields so that you don't get the weird error messages you would get from this code by default.  However, I think it gives you a flavor of the power of C#.&lt;br /&gt;&lt;br /&gt;Now, for the final piece, we combine the ideas of the ForEachLine function and the EachDelimitedLine function to get a ForEachDelimitedLine Function.  This also shows you the power of the generic delegate.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;1    public static void ForEachDelimitedLine&amp;lt;T&amp;gt;(&lt;br /&gt;2        string fileName, char delimter, T outputObject, IOProcessor&lt;T&gt; processor)&lt;br /&gt;3    {&lt;br /&gt;4        foreach (var x in EachDelimitedLine(fileName, delimter, outputObject))&lt;br /&gt;5        {&lt;br /&gt;6            processor(x);&lt;br /&gt;7        }&lt;br /&gt;8    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In this case, the IOProcessor now accepts a generic argument T which is the same type as the prototype object I pass in (called outputObject).&lt;br /&gt;&lt;br /&gt;Let's look at the above example code redone to use the ForEachDelimitedLine function&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;1    ForEachDelimitedLine(&lt;br /&gt;2        "delimitedFile.txt", ',', new { Title = "", Body = "", Anchor = "" }, (x) =&gt;&lt;br /&gt;3    {&lt;br /&gt;4      if (x.Title == "Thoughts of Me")&lt;br /&gt;5      {&lt;br /&gt;6        // do something with my blog...&lt;br /&gt;7      }&lt;br /&gt;8    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;There, no more foreach statement.  Now, the logic is part of the function itself.&lt;br /&gt;&lt;br /&gt;Next, I plan to extend my C# emacs mode to generate a class around my static functions and compile and run for me so I can have a C#-script of sorts.  Don't get me wrong, I still love and use perl on a daily basis, but C# is often much faster than perl, surprisingly enough, and seems to be able to handle memory more efficiently as well.  However, I do admit that is anecdotal and not based on any tests I have performed.  On a more pragmatic side, it is easier to integrate with exsiting C# libraries from C# rather than writing a SWIG interface.&lt;br /&gt;&lt;br /&gt;Hope you enjoyed!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-3330196066745497002?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/3330196066745497002/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=3330196066745497002' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/3330196066745497002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/3330196066745497002'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/11/c-awesomeness.html' title='C# Awesomeness'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-3113712358874379546</id><published>2008-11-22T22:38:00.000-08:00</published><updated>2008-11-22T22:41:59.531-08:00</updated><title type='text'>disgruntled iPhone user</title><content type='html'>I'm tired of the Apple iPhone.  As long as you don't need to do anything unusual, it is fine, but try to go outside what the folks at Apple have deemed appropriate for you and it blows up.  For example, if you want to sync with two computers, you are hosed.  If you want to make a different interface (for example, I want playlists to have folders), you are hosed.  If you want to do anything custom, you are up a creek - I'm tired of it.  When my contract expires, I will be moving to a different phone.  No more Apple for me, I want something more open.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-3113712358874379546?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/3113712358874379546/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=3113712358874379546' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/3113712358874379546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/3113712358874379546'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/11/disgruntled-iphone-user.html' title='disgruntled iPhone user'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-4886042242695300021</id><published>2008-11-22T22:35:00.000-08:00</published><updated>2008-11-22T22:38:17.523-08:00</updated><title type='text'>Midomi</title><content type='html'>Just a quick post to give props to the &lt;a href="http://www.midomi.com"&gt;Midomi&lt;/a&gt; team.  I always enjoyed Shazam, but it only works for commercially recorded songs.  Midomi lets you sing and then tries to determine what song you were singing.  It is great karaoke fun!  My wife and I played a game of Horse with it recently and had a blast.&lt;br /&gt;&lt;br /&gt;Great job, guys!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-4886042242695300021?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/4886042242695300021/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=4886042242695300021' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/4886042242695300021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/4886042242695300021'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/11/midomi.html' title='Midomi'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-2184477450005371449</id><published>2008-09-01T23:22:00.001-07:00</published><updated>2008-09-01T23:28:10.704-07:00</updated><title type='text'>The end of broadcast TV</title><content type='html'>Seems like broadcast TV should be in its death throws.  I give it no more than 7 years.  I imagine within 5 everyone else will chime in with its death.  I wonder how Dish/Comcast/DirectTV/etc... will fight back.  Will they try to lure the RIAA into banning places like &lt;a href="http://hulu.com"&gt;hulu.com&lt;/a&gt;?  Or will they hold out hope that people will want to see their shows as soon as possible instead of waiting for them to come online?  At what point do they stop coming out in broadcast form first?  Seriously, between &lt;a href="http://netflix.com"&gt;netflix&lt;/a&gt;, &lt;a href="http://hulu.com"&gt;hulu&lt;/a&gt;, &lt;a href="http://veoh.com"&gt;veoh&lt;/a&gt;, and &lt;a href="http://mtv.com"&gt;mtv.com&lt;/a&gt; I don't really need cable.  I have enough entertainment with just those sites.  That doesn't even include iTunes and the paid providers.  The tail is growing in this area and it will only be a few more years before it becomes mainstream.  Not only that, but the monitization ability is already there through commercials, so it is a viable model.  I do hope it doesn't get bogged down by commercials though - and I hope the commercials become personalized.  Just because I'm watching The Hills doesn't mean I want to see a cosmetics commercial...however, my eyebrows do look a bit...nevermind.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-2184477450005371449?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/2184477450005371449/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=2184477450005371449' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/2184477450005371449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/2184477450005371449'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/09/end-of-broadcast-tv.html' title='The end of broadcast TV'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-7370603046613308312</id><published>2008-08-24T09:15:00.000-07:00</published><updated>2008-08-24T09:19:50.611-07:00</updated><title type='text'>What a great family</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_UYCGzj11GeM/SLGJlNz_wkI/AAAAAAAAAAM/WD9Lrvqv5kw/s1600-h/Ipic.jpeg"&gt;&lt;img style="float:top; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_UYCGzj11GeM/SLGJlNz_wkI/AAAAAAAAAAM/WD9Lrvqv5kw/s320/Ipic.jpeg" border="0" alt=""id="BLOGGER_PHOTO_ID_5238119114064511554" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_UYCGzj11GeM/SLGJl1dobcI/AAAAAAAAAAU/rpmZICVwd8M/s1600-h/lovepic.jpeg"&gt;&lt;img style="float:top; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_UYCGzj11GeM/SLGJl1dobcI/AAAAAAAAAAU/rpmZICVwd8M/s320/lovepic.jpeg" border="0" alt=""id="BLOGGER_PHOTO_ID_5238119124708126146" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_UYCGzj11GeM/SLGJmOuFvfI/AAAAAAAAAAc/UMuHOv7DxdU/s1600-h/youpic.jpeg"&gt;&lt;img style="float:top; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_UYCGzj11GeM/SLGJmOuFvfI/AAAAAAAAAAc/UMuHOv7DxdU/s320/youpic.jpeg" border="0" alt=""id="BLOGGER_PHOTO_ID_5238119131488042482" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p/&gt;&lt;br /&gt;I received these pictures from my wife and kids when I arrived in Seattle.  They are a great family and I miss them.  From left to right is my niece Ashlan, my daughter Brooklyn, and my son Carter.  See you soon!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-7370603046613308312?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/7370603046613308312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=7370603046613308312' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/7370603046613308312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/7370603046613308312'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/08/what-great-family.html' title='What a great family'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_UYCGzj11GeM/SLGJlNz_wkI/AAAAAAAAAAM/WD9Lrvqv5kw/s72-c/Ipic.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-2228730646600619498</id><published>2008-08-13T22:51:00.001-07:00</published><updated>2008-08-17T14:59:20.918-07:00</updated><title type='text'>Amazon Interview</title><content type='html'>I went through my interview with Microsoft in my &lt;a href="http://blogginman.blogspot.com/2008/08/live-search-interview.html"&gt;previous blog entry&lt;/a&gt;.  In this entry I plan to discuss my Amazon interview.  I applied to Amazon after having visited the Silicon Valley area.  I knew that I didn't want to work in that area and hoped the Seattle area would be nicer.  Amazon gets tons of traffic daily and I'd been very impressed with their &lt;a href="http://www.amazon.com/gp/browse.html?node=16427261"&gt;S3&lt;/a&gt; and &lt;a href="http://www.amazon.com/gp/browse.html?node=201590011"&gt;EC2&lt;/a&gt; technologies, which I discuss &lt;a href="http://blogginman.blogspot.com/2008/06/future-of-enterprise.html"&gt;here&lt;/a&gt;.  I wanted to work at internet scale and Amazon seemed to be a prosperous and growing company.&lt;br /&gt;&lt;br /&gt;I received an email from an Amazon recruiter not too long after submitting my resume.  She described the process: two phone screens where I would have to write code over the phone and then they would fly me to Seattle.  I had just come off my interviews with Google and Yahoo, so I was excited to have another opportunity ahead of me.&lt;br /&gt;&lt;br /&gt;For my first phone screen, I was out of town, so I had to do it in my car.  They mentioned I would have to write code and I shouldn't be driving.  I had pulled over in a parking lot and was ready with pencil and paper when the call came.  I had also turned off my car and it was about 100 degrees F outside; it was definitely uncomfortable.  In this first interview, he asked me to write a binary search function for an integer array.  Normally I don't describe the questions that are asked; however, in this case I don't think I'm giving away any big secrets.&lt;br /&gt;&lt;br /&gt;I wrote a recursive binary search implementation and read it back to him over the phone.  It was a bit odd to read code over the phone.  I had to read out curly braces, square brackets, the whole works!  When I finished reading it he asked me if line X was ok.  I told him that I thought it needed a +1 to it.  He said ok and then asked me why I chose a recursive implementation.  I told  him that I thought it would be easier to write.  I tend to think recursively.  He asked me what the downsides of a recursive implementation are.  I told him that it requires time to push on and off the stack.  I also mentioned something about stack overflow, but in hindsight that  was a bit silly.  The greatest stack depth you can ever have for a binary search is 32 (on a 32 bit machine).  I also mentioned that a tail call optimizer would eliminate the performance penalty.  I'm not sure he understood that, so I didn't pursue it.  Besides, I don't know of any C++ compilers that include tail-call optimizations.&lt;br /&gt;&lt;br /&gt;We had plenty of time left, so he asked me to rewrite it iteratively.  I complied and started writing it.  In the middle of writing it, I realized I screwed up the recursive version.  I told him about my screw up over the phone and called myself an idiot.  We both got a laugh out of that.  I finished my iterative implementation, double checked it for accuracy, and read it to him over the phone.  He seemed happy with that approach and I mentioned that it was easier to write than the recursive version.  However, I imagine that is because I had calmed down some and the recursive version had prepped me.  He asked me about some of the test cases I would run on it.  I mentioned as many as I could such as element not in the array, element at each end of the array, element in the middle of the array, duplicate elements, etc...  He seemed satisfied and began telling me about their team and projects.  In the end he asked me if I had any questions.  I only had one or two about the team and working conditions.  I'm not a huge questioner, I guess.&lt;br /&gt;&lt;br /&gt;Honestly, at that point I wasn't sure I'd be getting a call back.  I had flubbed the recursive version of a binary sort for goodness sake.  I mean, come on, who does that?  I should have nailed that one.  I was a bit disappointed.  (On a side note, there is a really great article on binary search in &lt;a href="http://www.amazon.com/Beautiful-Code-Leading-Programmers-Practice/dp/0596510047/ref=pd_bbs_sr_1?ie=UTF8&amp;s=books&amp;qid=1219009106&amp;sr=8-1"&gt;Beautiful Code&lt;/a&gt;.  If you don't have that book, you really should.)  Since my phone screen was on a Thursday evening I had to wait until the next week to hear my results.  The recruiter called and told me that they were interested in talking to me further and they would like to set up another phone screen.  I was excited to be moving on to the next round!&lt;br /&gt;&lt;br /&gt;The next interviewer also asked me a fairly basic programming question.  It is one that I ask a lot in interviews and therefore quickly pounded out the optimal solution.  In this case, it seemed to take him a few minutes to verify that it worked.  I was a bit surprised - I figured if you asked a question you should know the optimal answer for it.  It could be that he was testing me to see if I would rush to change anything, but I was confident in my answer.  He seemed pleased and we moved on to talking about other things.  After this interview, I was  pretty confident that I would be getting to go to Seattle and after a few days, the recruiter called to confirm it.&lt;br /&gt;&lt;br /&gt;There were a few negatives about the trip to Seattle with regards to Amazon.  First, the put you in a hotel downtown, which means that you are within walking distance to everything.  That's not a negative.  However, they don't imagine you need a rental car, so they don't provide one.  Instead, they reimburse you for taxis.  Now, I appreciate being reimbursed, but it is a lot of trouble.  I have to find the cash to pay the taxis, get receipts, keep the receipts, turn them in, and wait 6 weeks for the money.  Honestly, it's just not worth it.  Secondly, the hotel they put me in didn't have free in room internet.  I wasn't going to pay $10 a day to get it, either.  They did have free internet in the lobby, so I would go down there, download an &lt;a href="http://aduni.org"&gt;Ars Digita Video Lecture&lt;/a&gt; and go back to the room to watch it.  I will say that the staff at the hotel was very courteous and the restaurant was great, but not having in-room internet sucks.  Big time.&lt;br /&gt;&lt;br /&gt;Amazon flew me in a day before the interview, so the first day I was there I went and walked around the downtown area.  I found it vibrant and clean.  I went to a suggested restaurant nearby and had some really amazing food.  However, it was getting late and I was tired, so I went back to my room to rest up for the next day.&lt;br /&gt;&lt;br /&gt;The next day I awoke and took a taxi to the Amazon building.   It was on 5th street South.  Either that or 4th Street South.  I forget.  But the reason I bring it up is because the directions explicitly say that South is different from not South :)  In other words, they are on different ends of the town.  I'm paranoid that my taxi driver won't know that and keep repeating to him, "South, right?  I mean it's a different street or something."  We get on 4th Street (or 5th Street...who knows...) and it's not South and I'm repeating again "4th Street South!".  Finally, he assures me that he knows where he is going and I should just let him take me there.  I sit back, say "ok", and enjoy the ride.  We drove by the &lt;a href="http://www.tdanet.com/images/SeattlePublicLibrary.jpg"&gt;Seattle Public Library&lt;/a&gt; and I am amazed by its architecture.  It is truly stunning.  &lt;br /&gt;&lt;br /&gt;Finally, we arrive at our destination.  He lets me out and he pulls off after giving me a blank receipt.  For that matter, all the taxi drivers have given me blank receipts.  Do I fill in the amount and sign them myself?  I have no idea.  Anyway, I'm looking around and I don't see an Amazon sign anywhere.  I'm freaking out thinking "Oh my gosh, he has taken me to the wrong street!"  However, I do see a street sign and it has  South on it, so I must be in the right place.&lt;br /&gt;&lt;br /&gt;Finally, I see an entryway on the side of the building with "Amazon" on it.  I go inside and speak to the receptionist.  I'm about 30 minutes early, so she asks me to take a seat.  Interestingly enough, as I'm sitting there thumbing through magazines, I find an advertisement for my current company, &lt;a href="www.acxiom.com"&gt;Acxiom&lt;/a&gt;.  It had to be the worst advertisement I'd seen.  It was a city-scape with a lake and the words "We make information intelligent."  What does that even mean?  How do I know what Acxiom does from that?  I sat there for about 10 minutes coming up with better advertising campaigns.  It wasn't hard.  Having worked at Acxiom, I am Jack's complete lack of surprise.&lt;br /&gt;&lt;br /&gt;A little after the appointed time, my first interviewer came and got me.  He didn't say much as he walked me to the room where I would spend the rest of the day.  In fact, once we were in the room he immediately asked me to code the solution to a problem.  There was no introduction, soft-skills questions, or questions to make you comfortable.  It was just an immediate call for action.  I did well on the first question, though it took the entire time.  The next interviewer had to wait outside the door a bit for us to finish up.  The only odd thing was that I still have no idea what the first interviewer's name was or on what team he worked.&lt;br /&gt;&lt;br /&gt;The second interviewer was a bit better, I think he told me his name :)  However, he once again avoided any comfort questions and went straight to the coding ones.  He asked a question that I put to my CS 101 students.  I told him that it is a programming assignment that I give them and that it is usually a bit long to write out; however, I hoped I could do a better job than they could.  Still, the program just takes time to write and it took up an entire whiteboard by the time we were done.  He asked quite a few questions about it and I fixed a few bugs reading back through it.  He also asked me how I would test it and I went through the various scenarios.  One of those scenarios failed with my current implementation, so we fixed that as well.  Then, it was time for the next interviewer.&lt;br /&gt;&lt;br /&gt;The next interviewer asked a design question.  It was a question that I had some familiarity with it as it included aspects of record linkage.  In fact, I explained a few things to him from the leading edge of research that he was not familiar with.  We got into a little debate about whether user click-streams could be substituted for a heuristic algorithm, but on the whole it was a good interview.&lt;br /&gt;&lt;br /&gt;After that, it was the team's boss's turn to take me out to lunch.  Amazon doesn't have a cafeteria (at least they didn't take me to it), so we went across the street to a Thai restaurant.  Turns out my interviewer liked the same type of food I did and we ended up ordering the exact same thing.  We talked about my experience and work history over lunch and he talked about the team.  He mentioned a number of times that it was a production team and I would have to carry a pager.  He wanted to make sure I was ok with that.  I told him that I was and that I had done support in the past and was fine with it.&lt;br /&gt;&lt;br /&gt;When we returned to the office, it was his turn to ask questions.  His were more logic/match puzzles.  At first, he started by saying "You have an array..." and I thought, "Oh boy, here we go again."  Pretty much every company asks the same array question.  "You are given an array with N integers.  Each integer is in the range of [1,N-1].  Furthermore only one integer is repeated.  How can you find the repeated integer?"  I got this question and variants of it in 3 of the 4 interviews.  I was getting ready to answer it again for Amazon when he threw a curve ball and asked a variant of it that I had never heard.  This one was more interesting and actually fun.  Now, I don't think that this type of question shows anything about the programmer other than whether or not he's heard the question before.  It's kind of like the moving Mt. Fuji questions of old.  However, I worked through the question, got the "Aha!" moment, and solved it.  I tend to like solving those questions.  Even though it didn't say anything about me as a programmer, I had fun with it.&lt;br /&gt;&lt;br /&gt;The next interviewer was to assess my C++ and OO design skills.  He asked me stock C++ questions, which I answered without difficulty.  He then posed a coding question that was really more about interface design than actual coding.  I had to do things like make sure my constructor was correct and write operator + in terms of operator+=, etc...  I wasn't familiar with the domain (and told him so), but in the end I came up with a solution.  He told me that it was the same solution he came up with when he first attempted the problem.  However, he had to do it in a production setting, not an interview setting.  I felt like coming up with the same solution as my interviewer was a good thing, so I was ok with that.&lt;br /&gt;&lt;br /&gt;The final technical interview of the day was another design question.  It was with this question that I had the most trouble.  It was a question that was directly related to how they track and update pricing information.  I tried to use a database to help solve the problem.  I'm not sure if this was the right approach or not as it really constricted me.  In the end, I came up with a pretty pathetic solution to a very complex problem.  I don't think either the interviewer or I was happy with it.  It was the one interview that I sucked at :)&lt;br /&gt;&lt;br /&gt;After that was supposed to be the boss of the second team I interviewed with.  However, he was out of town so he sent a sub :)  This person described his team and the other team that I was interviewing for.  I asked a lot of questions trying to distinguish the teams.  I don't know that I ever could distinguish between the two teams, they were so similar.  The only difference I could gather is that one was also responsible for a new framework.&lt;br /&gt;&lt;br /&gt;After not getting the team structure sorted out, I was on to the final meeting of the day.  It was with the human resources person.  He and I chatted about a few HR matters and then he showed me to the lobby where they called a taxi for me.&lt;br /&gt;&lt;br /&gt;On the whole, my experience with Amazon was just "OK".  They were obviously not a "tech" company.  Their dress code, lack of free drinks, and general frugality said that they were a retail business.  The employees were smart, but seemed a bit like "cowboys".  Their plans were overly ambitious and I wondered about their success rate.  I'd also read online about how hard they worked and how little they were rewarded for it.  Now, I certainly don't believe everything I read online, but it can't help but color your views.&lt;br /&gt;&lt;br /&gt;In the end, I thought that Microsoft would be the better choice.  I've never worked for a "true" tech company and the search space was very exciting.  I really enjoyed visiting Amazon and I'm sure it would be a fantastic company to work for, but in the end the prospect of working for Microsoft was too good to pass up.&lt;br /&gt;&lt;br /&gt;Well, I hope you enjoyed this second installment of my interviews and be sure to look for the third (Yahoo!) and fourth (Google) installments.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-2228730646600619498?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/2228730646600619498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=2228730646600619498' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/2228730646600619498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/2228730646600619498'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/08/amazon-interview.html' title='Amazon Interview'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-4413180269372653267</id><published>2008-08-12T22:58:00.001-07:00</published><updated>2009-04-14T00:35:19.960-07:00</updated><title type='text'>Microsoft Interview - Live Search</title><content type='html'>After reading about &lt;a href="http://www.philosophicalgeek.com/2008/08/10/my-interview-experience-at-microsoft/"&gt;Ben's interview at Microsoft&lt;/a&gt;, I thought I would post my own.  Perhaps I'll post my interviews at Google, Yahoo, and Amazon later.&lt;br /&gt;&lt;br /&gt;Where to begin?  Let me start by saying I'm not a Microsoft fanboy.  I don't have anything against them and use Windows on my home desktop and Office at work, but that's about it.  I spend most of my time in &lt;a href="http://www.cygwin.com"&gt;Cygwin&lt;/a&gt;: a linux environment for Windows.  In addition, I use &lt;a href="http://www.gnu.org/software/emacs/"&gt;Emacs&lt;/a&gt; and &lt;a href="http://www.eclipse.org"&gt;Eclipse&lt;/a&gt;.  I have programmed professionally for 8 years, 7 1/2 of those years have been exclusively in a Linux or Unix environment.  My primary languages have been C++, Perl and more recently Java.  For a while, I ran Ubuntu on my desktop, but the kids and wife didn't like that so much :)  Nevertheless, I think you can see that I am by no means a Microsoft fanboy.&lt;br /&gt;&lt;br /&gt;I first applied for a position at Microsoft in 2003 in their Visual Studio group.  I had recently completed my Ph.D. at Clemson and thought I was God's gift to programmers.  I won't go into that interview at this time, since this entry is focusing on my latest interview, but I will say I bombed badly.  For one thing, I ate something that disagreed with me and spent more time in the bathroom than in the interviewer's offices.  Secondly, I was interviewing for both a PM role and an SDE role and so I kept having to switch modes.  Thirdly, I was bull headed and wouldn't listen to any of the interviewers.  I just sucked.  They said I could apply again in a year, but I didn't.  I figured they had a big red X on my submission folder.&lt;br /&gt;&lt;br /&gt;Most of my professional career has been spent at &lt;a href="http://www.acxiom.com"&gt;Acxiom&lt;/a&gt;, a global interactive marketing services firm.  Primarily, I study and implement ideas around matching and &lt;a href="http://tanton.gibbs.googlepages.com"&gt;record linkage&lt;/a&gt;.  Over the last two years, we've been bringing machine learning and information retrieval research to bear on the record linkage problem and it has been very exciting.  I wanted to spend more time working on those large scale problems.  Therefore, I submitted my resume to a few of the larger companies: Google, Yahoo, Amazon, and Microsoft.  I got callbacks from the first three.  Microsoft still had that big ole X on my folder.&lt;br /&gt;&lt;br /&gt;My Google interview was first.  I'll describe it in another post, but I bombed it.  I didn't study and they didn't give hints.  They were a great group of people, but it just wasn't my day.&lt;br /&gt;&lt;br /&gt;Next up was the &lt;a href="http://blogginman.blogspot.com/2009/02/yahoo-interview.html"&gt;Yahoo! interview&lt;/a&gt;.  I thought I had bombed it as well, but apparently not.  I got an offer to work with the &lt;a href="http://incubator.apache.org/pig/"&gt;Pig team&lt;/a&gt;.  However, by this time I also had &lt;a href="http://blogginman.blogspot.com/2008/08/amazon-interview.html"&gt;an interview with Amazon&lt;/a&gt; upcoming, so I requested that they wait for my decision until after that interview.  On a side note, I think the Pig team is great and I wish them all the best in the future.&lt;br /&gt;&lt;br /&gt;Needless to say, I was very excited after receiving the Yahoo! offer.  Perhaps I wasn't an idiot after all (I had begun to wonder after the Google interview - and my wife was making fun of me!).  The first thing I did was announce it on &lt;a href="http://www.twitter.com/tgibbs"&gt;twitter&lt;/a&gt;.  The funny thing is, Gretchen, of &lt;a href="http://www.jobsblog.com"&gt;JobsBlog&lt;/a&gt; fame, follows me on twitter.  Her response? "Congratulations! Sounds like we'll have to do something about that." (Note: Since twitter is public, I don't have a problem reposting her words here).  By the end of the day, I had three Microsoft teams contacting me.  Among those teams was the Live Search team.  Since I was interested in machine learning and information retrieval, I requested that team be the one I interview for.&lt;br /&gt;&lt;br /&gt;I wasn't too worried on the day of the phone screening.  After all, I had passed two phone screens for each of the three other companies; how hard could this one be?  Turns out, it could be pretty hard.  The screener started out by asking if I primarily used live search.  My response, "No, I prefer Google."  Once it escaped my mouth I immediately knew I bombed.  How could I interview for a product that I didn't even use!  She then asked if I had ever used Live Search,  to which I responded positively.  I told her I didn't see much difference in the results, which was true.  She then moved on to the "coding" question.  I won't go into the question, but I will say I didn't do too well on it.  I started out trying to use a dynamic programming algorithm.  She quickly informed me that the problem could be solved in linear time.  Ouch!  We worked on the program for quite some time.  I got down the right path, but needed quite a bit of help.  She then took questions from me and the interview was over.  I knew I wouldn't be moving to the second round.  I even sent out a few text messages saying "When interviewing with Microsoft, the answer to 'Do you use live search?' is not 'No, I prefer Google'".&lt;br /&gt;&lt;br /&gt;A few days later I was driving my family to a local water park when I got the call from Microsoft.  They wanted to fly me out!  Wow!  Apparently it is OK to use Google after all!  I certainly didn't expect that.  I was already going to be in the Seattle area for my interview with Amazon, so I asked if they could schedule their interview at the same time.  It required some fast moving on their part as my interview with Amazon was only a week away.  However, they responded brilliantly and set up my accommodations and new return flight.  The only thing left for me to do was choose which teams inside of live search I would prefer to interview with.  They gave me a list of teams and their descriptions and I ranked them.&lt;br /&gt;&lt;br /&gt;At this point, I'll skip over the Amazon interview and move forward in time to the day before the Microsoft interview.  Amazon does not provide a rental car, but instead reimburses you for taxis.  Therefore, I had to take a Taxi back to the airport and then get the rental car from Microsoft.  From there, I drove to Redmond and found my hotel.  It was in the Redmond Town Center, which provided a great venue for eating and shopping.  I got there in the afternoon and I found greek diner in the town center.  After lunch I went back to my hotel and watched some &lt;a href="http://aduni.org"&gt;Ars Digita University&lt;/a&gt; algorithms classes.  In addition, I had also spent some time reading the &lt;a href="http://projects.csail.mit.edu/clrs/"&gt;CLRS Algorithms book&lt;/a&gt;.  Those two things, coupled with an online MIT course on algorithms would be my primary study guide.  Unlike Ben, I didn't work too many problems out on my own, just geeked out over videos :)  On a side note, the hotel that Amazon provided didn't have free in-room internet, so it was nice to be in a hotel that did.&lt;br /&gt;&lt;br /&gt;At this point, my worst nightmare happened.  My stomach began to churn and I started spending more time in the bathroom than out.  Why did this keep happening to me?  Was it nerves or do I REALLY not like Seattle food?  I tried a couple of times to wander around the Redmond Town Center, but each time I kept having to run (literally) back to my hotel room.  If this didn't pass by the next day, I was going to just die.&lt;br /&gt;&lt;br /&gt;Luckily it went away.  I ended up eating something light for supper instead of all the greek and italian food I'd been eating.  That seemed to help.  By the morning, I was going to the bathroom at a much slower pace, so maybe I'd be ok.&lt;br /&gt;&lt;br /&gt;I left very early in order to get to Building 19 on time.  I didn't map out the route the day before, so I wanted to be sure I could find it.  I'm glad I did leave early because the signs to it aren't overly visible and I looped the Microsoft campus a few times before finding the right building.&lt;br /&gt;&lt;br /&gt;The receptionist inside the Lobby of Bldg 19 took my name.  I commented on her ear thingies.  She had &lt;a href="http://en.wikipedia.org/wiki/Stretching_(body_piercing)"&gt;things in her earlobes like they have in Africa.&lt;/a&gt;  I asked her what they were called and she said, "Gauges."  I told her I was from Arkansas and we don't see too many things like that, but I thought they were cool.  She thanked me and pointed to the waiting area. Yes, right, don't flirt with the receptionist...go sit down.&lt;br /&gt;&lt;br /&gt;The waiting area came complete with an XBox 360 and a copy of Guitar Hero, which another candidate was playing.  Well, at least I thought it was a candidate.  I have to admit, she was really tearing up Guitar Hero - definitely a pro!  After her turn ended, she looked back over at the receptionist and said, "Ok, your turn!". It turns out she was the OTHER receptionist.  They swapped places and Gauge Girl began playing Guitar Hero (well, she offered it to me first, but I politely refused).  Sadly, I began wondering if that was a test.  Maybe they only hired people that played Guitar Hero when given the chance? (yeah, I'm sad like that)&lt;br /&gt;&lt;br /&gt;After a bit of waiting, my recruiter came in.  He took me back to his office and we began to talk about Microsoft.  He gave me a great spiel about the company; he was a good salesman.   We ended up talking longer than we should have and I had to hurry to get to a bus.  Unfortunately, all the buses were gone and we had to wait for one to come back.  It made me late to my first appointment :(  He said not to worry, he would call over and tell them I was going to be late.  Furthermore, like Ben, I was give a schedule that only went until 2:00.  If I didn't perform, I'd be done then.&lt;br /&gt;&lt;br /&gt;My first interview went ok.  I never do great in the mornings, but I answered his questions satisfactorily.  I forgot one simple case which finally came to me, but other than that, I did fine.  I mentioned this failing to the next interviewer who said not to worry about it.  The next interview was more challenging, I had read a bit about what he was asking, so I had some background, which I explained to him.  However, I only had the broad theory, not the intricate details, so we proceeded to hammer out the details over the board.  It was actually a lot of fun because I knew certain things to be true, but didn't know why. We discovered why together over the board.  It caused a lot of "Aha!" moments.  The only downside is that I missed a key part that caused my runtime to explode.  I figured this out as he was chatting with the next interviewer and when they returned I mentioned the optimization to him.  He nodded his agreement and passed me off.&lt;br /&gt;&lt;br /&gt;At this point, it was lunchtime.  My interviewer took me to the cafeteria.  I got Chinese food because I thought I could eat the rice without it upsetting my stomach.  We talked over lunch and I didn't eat much.  We mainly discussed coding styles, agile methods, etc...  Turns out he was interested in a book club I had started with my current company because he was running one for his team.&lt;br /&gt;&lt;br /&gt;After lunch, we returned to his office for some interface design.  I teach a UML class at &lt;a href="http://ualr.edu"&gt;The University of Arkansas at Little Rock&lt;/a&gt; so I sketched out my interface and design in UML.  We went into detail around some of the decisions, like whether to use a visitor pattern and factory pattern.  I think I did ok, but it is hard to design an interface without seeing use cases for it first.  I mentioned this toward the end and he agreed.  At the end of this interview it was 2:00...and...he took me to the next interview!&lt;br /&gt;&lt;br /&gt;During this interview I was back to coding.  Actually, I never got around to coding too much as I spent most of my time determining the algorithm.  This is a big difference from my first Microsoft interview as I would have gone straight to the code.  In this interview, I stepped back, looked at a number of examples and came up with the right solution first.  I coded it pretty quickly, but no major mistakes.   He showed me some of the cool things his team had been working on.  I was really impressed!  Then, he took me to the  next interviewer.  This interviewer focused me on a "real world" problem.  In other words, this problem was one that they had seen and solved in the past.  It took me about half the interview, but I came up with the solution.  He seemed impressed and said that not many of their interviewers come up with that solution and it is the one that they actually used in production.  I was pretty pleased with myself at that point.  We spent the rest of the time talking about their projects, team structure, etc...  It turns out that both teams I interviewed with spend a lot of time working with Microsoft Research, which is really cool for an academic like me :)&lt;br /&gt;&lt;br /&gt;That was the last interview before the "big boss", who took me to get a drink and a snack.  I was hungry since I didn't eat much lunch, so I took him up on a granola bar and a bottle of water.  He spent a lot of time telling me about Microsoft and asking me about my previous experience and the work I did with my current company.  I told him what I could without violating any NDAs.  He seemed pleased with what I told him and I was very impressed with what he was saying about the future of the team.  He described a lot of their internal systems and frameworks, all of which excited me.  Like the recruiter, he was a great salesman.  That must be a Microsoft thing :)&lt;br /&gt;&lt;br /&gt;After our discussion, he said that I should meet the other team's "big boss" (my words, not his).  He left me in the lobby of his building and went to hunt the other one down.  Turns out the other "big boss" had just gotten done playing softball with the interns and needed to clean up, but offered to take me to dinner.  I graciously accepted and sat down to wait as he got ready.  I went to eat with him and one of his team leads (who I had interviewed with previously) at an Italian restaurant in the Redmond Town Center.  We talked about Microsoft, the Yahoo deal, Google, our mutual desire to WIN, etc...  He was also a great salesman.&lt;br /&gt;&lt;br /&gt;I was pretty pumped after leaving there that night and couldn't sleep a bit on my red-eye flight back home.  I called my wife and told her that I was pretty sure we'd have an offer from Microsoft to consider.  Turns out we would also have an offer from Amazon.&lt;br /&gt;&lt;br /&gt;I won't go too much into my decision making process other than to say that I did not like the Silicon Valley area.  It just felt dirty to me.  I was much more at home in Seattle.   I liked the contemporary vibe and the fact that there were actual trees.  Lots of trees.  Yeah, I know it rains, but I don't like the sun much, anyway :)  Therefore, though the Yahoo! job was very attractive, I just could not accept it.  My decision was between Amazon and Microsoft.&lt;br /&gt;&lt;br /&gt;At one point, I thought I wasn't going to accept any of the offers.  We are settled, the kids are in school, we own our home, and life isn't too bad.  However, I think the ability to work with some amazingly smart people and have Microsoft on the resume is too good to pass up.  It is not often that you get to work with internet scale data.  My work at Acxiom is on billions of records, but nothing like what you see when you consider search.  The playing field is very, very different and you have to think WAY outside the box, which I love to do.  Moreover, I think it would benefit our kids to be in an environment like Seattle.  There's a lot to see and do there and there are many more opportunities there than there are here in Arkansas.  Finally, the school systems there are very good and I think the kids will benefit greatly from that.&lt;br /&gt;&lt;br /&gt;I start on August 25th and I am very excited.  I'll be sad to leave a great team behind, but I know they wish me the best as well.  Now, I'm looking forward to starting the next phase of my life as a member of the Live Search team.  Google, look out!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-4413180269372653267?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/4413180269372653267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=4413180269372653267' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/4413180269372653267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/4413180269372653267'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/08/live-search-interview.html' title='Microsoft Interview - Live Search'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-6389297580458530304</id><published>2008-08-12T15:18:00.000-07:00</published><updated>2008-08-12T15:19:50.807-07:00</updated><title type='text'>New Job</title><content type='html'>I'm excited to announce that I am joining Microsoft to work on their &lt;a href="http://live.com"&gt;Microsoft Live Search Engine&lt;/a&gt;.  It's going to be a big transition, but I've never lived in the northwest, so it is a very exciting time as well.  I begin there on August 25 and am very excited!&lt;br /&gt;&lt;br /&gt;Please keep me in your prayers during this exciting, but stressful time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-6389297580458530304?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/6389297580458530304/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=6389297580458530304' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/6389297580458530304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/6389297580458530304'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/08/new-job.html' title='New Job'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-7442821870402396021</id><published>2008-07-12T00:25:00.000-07:00</published><updated>2008-07-12T00:36:34.024-07:00</updated><title type='text'>The last month</title><content type='html'>Hopefully my employer doesn't have my blog in his RSS feed :)&lt;br /&gt;&lt;br /&gt;Over the last month I have interviewed with a number of great companies.  I have had a blast going and visiting with the brilliant people that inhabit the halls of &lt;a href="http://www.google.com"&gt;Google&lt;/a&gt;, &lt;a href="http://www.yahoo.com"&gt;Yahoo!&lt;/a&gt;, &lt;a href="http://www.amazon.com"&gt;Amazon&lt;/a&gt;, and &lt;a href="http://www.microsoft.com"&gt;Microsoft&lt;/a&gt;.  I have, or am receiving, offers from three of the four.  It is definitely an exciting time as I rush to look at places to live, schools for the children and compare things like benefits, stock prices, growth potential, and perks.&lt;br /&gt;&lt;br /&gt;It will be sad to leave my family and friends; adjustments will be necessary all the way around.  However, I am very excited about the opportunities that lay ahead.&lt;br /&gt;&lt;br /&gt;I won't describe the interview process or questions.  However, I will say that all of the questions were very intelligent and relevant.  It helps to know core algorithms and data structures such as lists, queues, and trees.  Graph algorithms and advanced data structures like heaps and splay trees are also good to know.  More generally, you just need to be able to tear a problem apart and reduce it to its essence.  They want to see that you can analyze a problem and coming up with the right solution immediately is not as valuable as coming up with many solutions and being able to weigh them.&lt;br /&gt;&lt;br /&gt;All of the companies had extraordinary employees, a great culture, and innovative systems.  They all operate at "web scale" which means their problems are MASSIVE.  No matter which company I choose, it will be a great choice.&lt;br /&gt;&lt;br /&gt;I'm looking forward to the journey and I'll keep you all updated.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-7442821870402396021?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/7442821870402396021/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=7442821870402396021' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/7442821870402396021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/7442821870402396021'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/07/last-month.html' title='The last month'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-6275180649754504520</id><published>2008-07-08T23:25:00.001-07:00</published><updated>2008-07-08T23:27:20.769-07:00</updated><title type='text'>ArsDigita University</title><content type='html'>There are a lot of great free videos from &lt;a href="http://www.aduni.org/courses/"&gt;Ars Digita University&lt;/a&gt;.  Check them out!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-6275180649754504520?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/6275180649754504520/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=6275180649754504520' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/6275180649754504520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/6275180649754504520'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/07/arsdigita-university.html' title='ArsDigita University'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-4806872232549911312</id><published>2008-07-01T21:54:00.001-07:00</published><updated>2008-07-01T22:52:22.747-07:00</updated><title type='text'>Researching in a Search 2.0 world</title><content type='html'>A lot of my time is spent researching.  A LOT of my time is spent researching.  I research things around &lt;a href="http://tanton.gibbs.googlepages.com"&gt;record linkage&lt;/a&gt;.  I also research clustering, classification, natural language processing, and machine learning, in general.  Quite a few times, I have to get up to speed.  I need to understand what &lt;a href="http://www.jstor.org/pss/2286061"&gt;Felligi and Sunter did in the 1960s&lt;/a&gt; before I can understand what &lt;a href="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.39.5567"&gt;Winkler added to it in the 90s&lt;/a&gt; and what the &lt;a href="http://jeffjonas.typepad.com/jeff_jonas/2007/09/entity-resoluti.html"&gt;general entity resolution research&lt;/a&gt; is all about now.  Or, perhaps I just want to be a better programmer.  Perhaps move from a O(N) to O(log N) on the &lt;a href="http://www.indiangeek.net/wp-content/uploads/Programmer%20competency%20matrix.htm"&gt;Programmer Competency Matrix&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For Search 2.0, much of the hullabaloo has been about Natural Language Processing (NLP).  Companies such as &lt;a href="http://www.powerset.com"&gt;Powerset&lt;/a&gt; have touted their products as being able to understand a human query.  For instance, the powerset engineers have &lt;a href="http://videolectures.net/iswc07_pell_nlpsw/"&gt;given demos&lt;/a&gt; where they ask their engine "Which politicians died of disease?" and it gives back a list.  This approach is great if I'm after general information, or if I'm helping my kid with her homework.  However, it doesn't give me perspective about research.  Why am I asking about politicians and disease anyway?  Am I trying to get a statistical view of politicians that die of disease vs the health of the rest of the populace?  Am I trying to understand the effects of an ill politician on the society?  I might wish to see the sites that others also searched for, much like the &lt;a href="http://www.amazon.com"&gt;Amazon&lt;/a&gt; feature.  Or, maybe I want additional statistics about that country during the time period.  In other words, I need more than just the answer to my question.  I need a path that others have followed that I can follow as well.  Eventually, I'll have to get off the path, but I want to stay on it as long as possible.&lt;br /&gt;&lt;br /&gt;In addition, I want to quickly understand an author's position.  I want to know, with my search results, whether this author is an expert or a novice in the field.  I want to know where his or her funding comes from.  I want to know, based on statistical analysis of their previous posts, if they are conservative or liberal.  Have they published papers?  If so, in what journals?  Are they top journals?  It is this &lt;i&gt;&lt;b&gt;context&lt;/b&gt;&lt;/i&gt; that will make search valuable.  Whether or not I can ask a specific question is irrelevant to me.  I'll figure out a way to ask the question; however, I want more information back in an easy to understand manner.  I want the site's &lt;a href="http://en.wikipedia.org/wiki/PageRank"&gt;PageRank&lt;/a&gt;, I want a general view of how other sites have posted about the site in question (positive or negative), I want to see complaints or complements if it is a potential employer.  I want &lt;b&gt;&lt;i&gt;CONTEXT&lt;/i&gt;&lt;/b&gt;.  It seems to me that people get on the internet a lot for research.  You research a good book to buy or what digital camera to get or where to go on vacation.  All of these things could be enhanced by adding more context, more data mining, and better presentation of the information.&lt;br /&gt;&lt;br /&gt;That will be search 2.0.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-4806872232549911312?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/4806872232549911312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=4806872232549911312' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/4806872232549911312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/4806872232549911312'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/07/researching-in-search-20-world.html' title='Researching in a Search 2.0 world'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-4268081331735667519</id><published>2008-06-20T15:24:00.000-07:00</published><updated>2008-06-20T15:38:01.712-07:00</updated><title type='text'>Where is the software that enables the long tail?</title><content type='html'>For a product to reach &lt;a href="http://www.amazon.com/gp/product/1401302378"&gt;the long tail&lt;/a&gt;, it has to have three things.  &lt;br /&gt;First, it has to have &lt;b&gt;a low barrier of entry&lt;/b&gt;.  Anyone needs to be able to create content and publish it.  Second, it has to be &lt;b&gt;easy to access&lt;/b&gt;.  This means it must be &lt;i&gt;searchable&lt;/i&gt;.  Finally, it has to allow others to &lt;b&gt;review and comment&lt;/b&gt;.  That's it.  It's not rocket science.  &lt;br /&gt;&lt;br /&gt;Unfortunately, I'm having tremendous trouble finding software to enable the long tail.  I really don't have overly strict requirements.  In application 1, I want to be able to allow people to post Java jar files.  I might want to check things on post, such as does it have a MANIFEST?  In application 2, I have a site where I am putting up &lt;a href="http://tanton.gibbs.googlepages.com"&gt;papers about record linkage&lt;/a&gt;.  I want others to be able to post links and have the software verify that the links exist.  In each application, I'd like to also allow them to associate a title with either the jar file or the link.&lt;br /&gt;&lt;br /&gt;For search, I want application 1 to be able to search the javadocs that I generate from the source in the jar files.  In application 2, I would love to have the content of the links searchable (so that people can find which PDFs contain information about blocking), but I'd settle for just being able to search the title that was given to the link.&lt;br /&gt;&lt;br /&gt;For ratings/reviews I would like to have a 5-star rating system and comments.  However, I'd settle for just the comments.  I want people to say which papers they found readable or which jar files they found useful.&lt;br /&gt;&lt;br /&gt;There are a lot of features you could add such as an RSS feed, etc..., but I'm willing to ignore all of that for right now.  &lt;i&gt;&lt;b&gt;I just need the basics&lt;/b&gt;&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Am I asking for too much?  Why doesn't this already exist?  In the world of &lt;a href="http://search.cpan.org"&gt;CPAN&lt;/a&gt;, &lt;a href="http://reddit.com"&gt;reddit&lt;/a&gt;, etc... why doesn't a generic version of long tail software exist?  Perhaps I'm just overlooking it.  If not, I guess I'll just have to write it, but I'd much rather use something already written.&lt;br /&gt;&lt;br /&gt;Let me know if I missed something!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-4268081331735667519?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/4268081331735667519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=4268081331735667519' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/4268081331735667519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/4268081331735667519'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/06/where-is-software-that-enables-long.html' title='Where is the software that enables the long tail?'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-5478637771083287952</id><published>2008-06-16T23:37:00.001-07:00</published><updated>2008-06-16T23:47:27.436-07:00</updated><title type='text'>19th Century Reading Habits in Australia</title><content type='html'>Here is a blog post describing data mining of &lt;a href="http://conflate.net/inductio/2008/06/visualising-reading/"&gt;19th Century reading habits in Australia&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It is a fascinating application of PCA and clustering.&lt;br /&gt;&lt;br /&gt;I don't think it will be long before commercial databases include standard data mining abilities such as &lt;a href="http://en.wikipedia.org/wiki/Feature_selection"&gt;feature selection&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Principal_components_analysis"&gt;PCA&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Latent_semantic_analysis"&gt;LSA&lt;/a&gt;, regressions,  &lt;a href="http://en.wikipedia.org/wiki/K-means"&gt;k-means&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Support_vector_machine"&gt;SVM&lt;/a&gt;, etc...  The blog poster above had to use a combination of things, including the great &lt;a href="http://www.r-project.org/"&gt;R&lt;/a&gt;, to prep his data for the analysis; this should all be done inside a database.  Perhaps this is the straw that broke SQL's back?  Perhaps that is where a language such as &lt;a href="http://wiki.apache.org/pig/FrontPage"&gt;Pig&lt;/a&gt; is needed?  Pig's niche could very well be in prepping data for data mining tasks and streaming them through a map-reduce library such as &lt;a href="http://lucene.apache.org/mahout/"&gt;mahout&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Regardless, business users are already there: companies like Harrah's, CitiBank, and Nationwide live and die by their analysis.  Now, we just have to build the tools to let them bring new products up quickly and effortlessly.  We are on the forefront of a huge explosion in statistical tools, modeling techniques, and machine learning.  As much as the internet helped in providing ubiquitous access to data, these tools and techniques will help computers learn and understand us and our preferences.  The internet revolution will appear to be a tiny blip on the screen compared to the wonders that are to come.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-5478637771083287952?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/5478637771083287952/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=5478637771083287952' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/5478637771083287952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/5478637771083287952'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/06/19th-century-reading-habits-in.html' title='19th Century Reading Habits in Australia'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-4794476054420477081</id><published>2008-06-04T21:45:00.000-07:00</published><updated>2008-06-04T22:19:55.214-07:00</updated><title type='text'>The Future of Enterprise</title><content type='html'>What is the future of enterprise software?  Is it &lt;a href="http://jruby.codehaus.org"&gt;JRuby&lt;/a&gt; on &lt;a href="http://www.rubyonrails.org/"&gt;Rails&lt;/a&gt;?  What about &lt;a href="http://www.scala-lang.org"&gt;Scala&lt;/a&gt;?  Maybe a &lt;a href="www.microsoft.com/net/"&gt;.NET stack&lt;/a&gt;?  What is the next big shift?&lt;br /&gt;&lt;br /&gt;In my opinion, the next big shift is to grid computing.  Things like &lt;a href="aws.amazon.com/ec2"&gt;EC2&lt;/a&gt;, &lt;a href="http://hadoop.apache.org"&gt;Hadoop&lt;/a&gt;, and &lt;a href="hadoop.apache.org/hbase/"&gt;HBase&lt;/a&gt; will become more and more popular.  Commercial versions and vendors will spring up over the next few years.  Enterprises will start pushing more and more of their computation into batch grid work.  Column store databases will replace traditional RDBMS's for data warehousing (this is already happening with &lt;a href="www.teradata.com"&gt;Teradata&lt;/a&gt;).  Transactional applications will work on cached stores that are pulled from a large grid where they were processed and analyzed.  Marketing will be on demand, but pre-computed.&lt;br /&gt;&lt;br /&gt;In the rush to understand and market to the consumer, more and more companies have been moving to real-time analytics.  However, the faster you need a decision, the less time you have to think about it.  That is why grid computing will be so important.  Your think time has to be done in advance.  Transactional queries will be relegated to closing deals or finding a pre-computed offer.&lt;br /&gt;&lt;br /&gt;The main challenge, as I see it, will be to find and use data structures that can be refreshed quickly.  &lt;a href="www.google.com"&gt;Google&lt;/a&gt; is in a fortunate position.  They can refresh boxes asynchronously.  If customer A enters query Q1 and then enters query Q2 it is ok if those two queries hit different data sets and return different results.  However, if we're not dealing with a search application but instead something akin to a &lt;a href="http://www.dbmarketing.com/articles/Art130.htm"&gt;customer recognition&lt;/a&gt; or record linkage application, then the same person should always receive the same link.  This is why &lt;i&gt;versioning&lt;/i&gt; will become so important in the future.  The customer will get a certain version of the data sets and will continue to use that version until their application finishes at which point they can be upgraded.  This requires more server side storage, but allows the client the ability to use a consistent data set.  This type of versioning and auto-update software will be necessary in a commercial form.  In addition, quick nearest-neighbor searches will need to be commercialized.  Clients will want to know quickly which market segment a client falls into.  Nearest neighbor searches are the key to understanding that and they will need to be generalized and distributed over the next few years.&lt;br /&gt;&lt;br /&gt;So, the enterprise is changing.  The relational database will move from its position of dominance to just another tool.  The grid will take its place as a hammer looking for nails, and applications that can process terabytes of data quickly will be deemed must haves for enterprise data centers across the world.  The Enterprise Service Bus  (ESB) will continue to shuffle transactional data around, but the backend will now be distributed data stores that will be versioned and querable by categorized nearest neighbor searches.  Who will be the vendor of these tools?  I have no idea.  Many, like Hadoop, will be open source.  Some, like Teradata, already exist.  Others will be proprietary and don't even exist currently.  Regardless, it will be a lot of fun and I'm looking forward to the ride.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-4794476054420477081?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/4794476054420477081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=4794476054420477081' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/4794476054420477081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/4794476054420477081'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/06/future-of-enterprise.html' title='The Future of Enterprise'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-2458705584716411386</id><published>2008-05-29T14:02:00.000-07:00</published><updated>2008-05-29T14:04:53.077-07:00</updated><title type='text'>Including other jars in your hadoop job jar</title><content type='html'>I learned that you can include other jars in your hadoop job jar by placing them in the lib/ directory under your job jar.  Very nice and convenient!&lt;br /&gt;&lt;br /&gt;Now, if I can only make the DistributedCache work.  Right now, it just isn't.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-2458705584716411386?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/2458705584716411386/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=2458705584716411386' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/2458705584716411386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/2458705584716411386'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/05/including-other-jars-in-your-hadoop-job.html' title='Including other jars in your hadoop job jar'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-7307573176146208975</id><published>2008-05-27T11:28:00.000-07:00</published><updated>2008-06-08T14:02:04.950-07:00</updated><title type='text'>ICWSM '08 Lectures online</title><content type='html'>I've not seen &lt;a href="http://videolectures.net"&gt;videolectures.net&lt;/a&gt;, but I got tipped off that they have &lt;a href="http://videolectures.net/icwsm08_seattle/"&gt;the presentations from the 2008 International Conference of Weblogs and Social Media&lt;/a&gt; from &lt;a href="http://datamining.typepad.com/data_mining"&gt;The data mining blog&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-7307573176146208975?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/7307573176146208975/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=7307573176146208975' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/7307573176146208975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/7307573176146208975'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/05/icwsm-08-lectures-online.html' title='ICWSM &apos;08 Lectures online'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-3890952003997722395</id><published>2008-05-26T22:17:00.000-07:00</published><updated>2008-06-16T21:48:08.208-07:00</updated><title type='text'>Record Linkage Papers</title><content type='html'>I have created a &lt;a href="http://Tanton.Gibbs.googlepages.com/home"&gt;site where I am putting up links to record linkage papers&lt;/a&gt;.  I hope to include comments on them soon.  If you have a paper you'd like put on the site, just leave me a comment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-3890952003997722395?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/3890952003997722395/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=3890952003997722395' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/3890952003997722395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/3890952003997722395'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/05/record-linkage-papers.html' title='Record Linkage Papers'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-4639324819570821998</id><published>2008-05-24T13:36:00.000-07:00</published><updated>2008-05-24T14:03:51.590-07:00</updated><title type='text'>Min-Hash signature for bigrams</title><content type='html'>I don't believe there is a decent description of how to create a min-hash signature for bigrams on the web, so I'm going to try and provide one.  Of course, my description will probably be flawed, but I hope that it will be better than what is out there currently.&lt;br /&gt;&lt;br /&gt;First, what is a min-hash signature?&lt;br /&gt;&lt;br /&gt;The idea is that, given two records, you can provide signatures such that the similarity of the signatures is approximately equal to the similarity of the records.&lt;br /&gt;&lt;br /&gt;Here is a &lt;a href="http://softbase.uwaterloo.ca/~tozsu/courses/cs856/F05/Presentations/Week9/fuzzy%20matching.pdf"&gt;slide show&lt;/a&gt; based around using min-hash signature to provide keys for indexing into a database.   Here is the &lt;a href="http://citeseerx.ist.psu.edu/viewdoc/summary;jsessionid=B1011CA38DE5FF14A7CA14F10231F47E?doi=10.1.1.89.231"&gt;relevant paper&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So, basically it is a way of generating a fuzzy key such that if the two keys match there is a high probability that the two records will match.&lt;br /&gt;&lt;br /&gt;We're going to examine a way of doing this using bigrams.&lt;br /&gt;&lt;br /&gt;Let's assume we have the local part of an email address.  In our base file, we have the following entries:&lt;br /&gt;&lt;br /&gt;tgibbs&lt;br /&gt;tanton_gibbs&lt;br /&gt;bbarker&lt;br /&gt;tkieth&lt;br /&gt;bspears&lt;br /&gt;&lt;br /&gt;If we look at the bigrams generated for each local part, we have the following:&lt;br /&gt;tgibbs = { tg, gi, ib, bb, bs }&lt;br /&gt;tanton_gibbs = {ta, an, nt, to,  on, n_, _g,  gi, ib, bb, bs}&lt;br /&gt;gbarker =  {gb, ba, ar, rk, ke, er}&lt;br /&gt;tkisth = {tk, ki, is, et, th}&lt;br /&gt;bspears = {bs, sp, pe, ea, ar, rs}&lt;br /&gt;&lt;br /&gt;If we order all the bigrams alphabetically, then we have the following universe of bigrams: {an, ba, bb, bs, ... th}&lt;br /&gt;&lt;br /&gt;Now, a min hash signature requires an input f that tells how many hash functions to use.   Let's set f to 3.  That means we'll hash each record in 3 different ways.&lt;br /&gt;&lt;br /&gt;To generate a hash function, we randomly permute the bigram universe.&lt;br /&gt;&lt;br /&gt;So, our first permutation may look like:&lt;br /&gt;&lt;br /&gt;{tk, ib, an, pe,  ... rs}&lt;br /&gt;&lt;br /&gt;our second permutation may look like:&lt;br /&gt;&lt;br /&gt;{rk, gi, bs, th, ... pe}&lt;br /&gt;&lt;br /&gt;and our third permutation may look like:&lt;br /&gt;&lt;br /&gt;{bb, ba, er, ke, ... an} &lt;br /&gt;&lt;br /&gt;Now, the next thing we need is a similarity threshold, t.  Let's assume t is 0.8.&lt;br /&gt;So, for each record, we will use 80% of the bigrams to produce the hash.&lt;br /&gt;&lt;br /&gt;So, if our input record is tgbbis, then we have the following bigrams to choose from&lt;br /&gt;{tg, gb, bb, bi, is}  We would choose 3 or 4 bigrams (probably both) to produce the hash.   But, which 3 or 4 do we choose?&lt;br /&gt;&lt;br /&gt;For each permutation of our bigram universe that we produced above, we will pick the bigrams that appear the earliest.  So, for permutation 1, we might end up choosing {gb, bi, is}.   For permutation 2, we  might end up with {bi, tg, bb}.  For permutation  3, we  might have {bb, is, gb}.  We would do the same thing for combinations of 4 bigrams.&lt;br /&gt;&lt;br /&gt;Now, we can create a string from the bigrams {gbbiis, bitgbb, bbisgb}.  These strings become our prospecting keys.  We perform the same key generation routine on the base records.  Then we can join our input keys to our base record keys to find our match candidates.&lt;br /&gt;&lt;br /&gt;If we want a more approximate min-hash signature, we could sort the bigrams before  creating the key so that we would have the keys {bigbis, bbbitg, bbgbis}.  Obviously, the duplicate key could be thrown away.  This has the effect of handling more transpositions in the input at the cost of bringing back more candidates.&lt;br /&gt;&lt;br /&gt;Hopefully this illuminates min-hash signatures a bit more so that the references above make sense.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-4639324819570821998?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/4639324819570821998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=4639324819570821998' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/4639324819570821998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/4639324819570821998'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/05/min-hash-signature-for-bigrams.html' title='Min-Hash signature for bigrams'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-4111891422620082898</id><published>2008-05-23T17:12:00.001-07:00</published><updated>2008-07-01T08:52:25.922-07:00</updated><title type='text'>pig.properties</title><content type='html'>If you are going to set up pig, you need to be aware of the pig.properties file.&lt;br /&gt;&lt;br /&gt;It has things like the cluster setting, which is important to set correctly. It also has things like whether or not to run it locally or remotely.&lt;br /&gt;&lt;br /&gt;See &lt;a href="http://mail-archives.apache.org/mod_mbox/incubator-pig-user/200805.mbox/browser"&gt;this thread on the Pig mailing list&lt;/a&gt; for how to set the cluster setting:&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-4111891422620082898?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/4111891422620082898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=4111891422620082898' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/4111891422620082898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/4111891422620082898'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/05/pigproperties.html' title='pig.properties'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-7936805332728304418</id><published>2008-05-22T21:27:00.000-07:00</published><updated>2008-05-22T21:32:44.665-07:00</updated><title type='text'>Pig redux</title><content type='html'>I rewrote my original pig script to use a local foreach block.&lt;br /&gt;&lt;br /&gt;It now looks like:&lt;br /&gt;&lt;br /&gt;A = load 'myInputFile' using PigStorage(',') as (seqid, cl, local, domain, fn, ln, zip, email);&lt;br /&gt;B = foreach A  generate flatten(SortChars(local)) as sorted_local, cl;&lt;br /&gt;C = GROUP B by sorted_local PARALLEL 10;&lt;br /&gt;D = FOREACH C {&lt;br /&gt;  CLS = B.cl;&lt;br /&gt;  DCLS = DISTINCT CLS;&lt;br /&gt;  GENERATE group, COUNT(DCLS) as clCount;&lt;br /&gt;}&lt;br /&gt;E = FILTER D by clCount &gt; 1;&lt;br /&gt;F = FOREACH E GENERATE group;&lt;br /&gt;store F into 'myDir' using PigStorage();&lt;br /&gt;&lt;br /&gt;A, B, and C are the same as before.  However, we now push the distinct into the FOREACH loop for D.  This allows Pig to use a DistinctBag to dedup the CLs for a sorted_local part.  Before, the DISTINCT had to use a separate map-reduce step; however, now it can do it all in only one map-reduce job.  This effectively halves the time the script takes.&lt;br /&gt;&lt;br /&gt;For more on how things get executed, you can use the &lt;i&gt;explain&lt;/i&gt; option.  For instance, &lt;b&gt;explain F;&lt;/b&gt; will show how F gets executed.  More information can also be found on &lt;a href="http://wiki.apache.org/pig/PigExecutionModel"&gt;the pig wiki&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-7936805332728304418?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/7936805332728304418/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=7936805332728304418' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/7936805332728304418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/7936805332728304418'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/05/pig-redux.html' title='Pig redux'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-692916499266263874</id><published>2008-05-22T15:48:00.000-07:00</published><updated>2008-05-22T15:54:55.744-07:00</updated><title type='text'>Pig continued</title><content type='html'>Now that I have the sorted local parts of an email address, I want to know which emails are identified by those sorted local parts.  So, I know that bbgist has more than one  CL associated with it.  Now, I want to know that tgibbs and tgbbis both go to bbgist.  Also, I only want those emails with more than one CL, so I don't want tgobbs because it (let's pretend) only associated with one CL.&lt;br /&gt;&lt;br /&gt;Here is the pig script to do that:&lt;br /&gt;&lt;br /&gt;register /home/tgibbs/pig/pig/myPigFunctions.jar&lt;br /&gt;A = load 'myFile' using PigStorage(',') as (seqid, cl, local, domain, fn, ln, email);&lt;br /&gt;B = load 'mySortedLocalFile' using PigStorage() as (sorted_local);&lt;br /&gt;C = foreach A generate local;&lt;br /&gt;D = DISTINCT C PARALLEL 10;&lt;br /&gt;E  = FOREACH D generate local, flatten(SortChars(local)) as sorted_local;&lt;br /&gt;F = JOIN E by sorted_local, B by sorted_local PARALLEL 10;&lt;br /&gt;G = FOREACH F generate local;&lt;br /&gt;store G into '/user/tgibbs/eproducts-local-merged-out' using PigStorage();&lt;br /&gt;&lt;br /&gt;On line 1, once again, I register my SortChars function that is in my jar file.&lt;br /&gt;Line 2 loads the original email file.&lt;br /&gt;Line 3 loads the file of sorted local parts that I created last blog entry.&lt;br /&gt;Line 4 reduces the original email file down to just the local part.&lt;br /&gt;Line 5 (the D line) gets rid of any duplicate local parts, since I don't care that tgibbs appears 10 times and it reduces the amount of data I have to deal with later.&lt;br /&gt;Line 6 (the E line) generates the sorted version of the local part and keeps the original local part as well.&lt;br /&gt;Line 7 (F) joins the two files by the sorted local portion.  It's schema looks something like (E::local, sorted_local, sorted_local).&lt;br /&gt;As an example, it would have (tgibbs, bbgist, bbgist) and (tgbbis, bbgist, bbgist).&lt;br /&gt;Line 8 (G) just gets the local part, which is what I want to store and the last line stores it.&lt;br /&gt;&lt;br /&gt;Next up, I plan to try out the Illustrate command which should  display the execution plan.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-692916499266263874?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/692916499266263874/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=692916499266263874' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/692916499266263874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/692916499266263874'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/05/pig-continued.html' title='Pig continued'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-562249439996328283</id><published>2008-05-22T13:04:00.000-07:00</published><updated>2008-05-22T14:43:52.807-07:00</updated><title type='text'>Mahout</title><content type='html'>Just a quick post to point out &lt;a href="http://lucene.apache.org/mahout/"&gt;Mahout&lt;/a&gt;.  Mahout is a machine learning library built on top of Hadoop.  They are still fairly pre-alpha, but they already have some interesting algorithms developed.  I plan on trying out their canopy clustering algorithm relatively soon.&lt;br /&gt;&lt;br /&gt;On a second note, I've gotten  &lt;a href="http://incubator.apache.org/pig/"&gt;Pig&lt;/a&gt; up and running and have successfully run some large jobs.  Woot!&lt;br /&gt;&lt;br /&gt;Here is a pig script to count the number of &lt;a href="www.acxiom.com"&gt;AbiliTec Consumer Links&lt;/a&gt; associated with the sorted local part of an email address.&lt;br /&gt;&lt;br /&gt;In other words, if there were two emails tgibbs@blah.com and tgbbis@blah.com, the sorted local part of both would be bbgist.  If they were each associated with a different consumer link, then the following pig script would output bbgist.  Otherwise, it would not.&lt;br /&gt;&lt;br /&gt;register /home/tgibbs/pig/pig/myPigFunctions.jar&lt;br /&gt;A = LOAD '/user/tgibbs/eproducts' USING PigStorage(',') AS (seqid, cl, local, domain, fn, ln, zip, email);&lt;br /&gt;B = FOREACH A  GENERATE FLATTEN(SortChars(local)) as sorted_local, cl;&lt;br /&gt;BDIST = DISTINCT  B PARALLEL 10;&lt;br /&gt;C = GROUP BDIST BY sorted_local PARALLEL 10;&lt;br /&gt;D =  FILTER C BY COUNT(BDIST.cl)  &gt; 1;&lt;br /&gt;E = FOREACH D GENERATE group;&lt;br /&gt;STORE E INTO '/user/tgibbs/eproducts-sorted-local-out' USING PigStorage();&lt;br /&gt;&lt;br /&gt;The register line loads a custom jar file so that I can call my &lt;a href="http://wiki.apache.org/pig/PigFunctions"&gt;custom functions&lt;/a&gt;.  More on that later.&lt;br /&gt;&lt;br /&gt;The next line, the assignment of A, just reads a comma delimited file into A.  It also associates a name with each of the comma delimited fields.  So, field 0 is seqid, field 1 is cl, etc...&lt;br /&gt;&lt;br /&gt;The third line loops through each record in A (that's the FOREACH) and sorts the characters in the local part.  I wrote the SortChars class and will post that at the end of this entry.  The FLATTEN is needed because SortChars returns a tuple and since I only have one element going in, there is only one element coming out and I want to treat that one element as an &lt;a href="http://wiki.apache.org/pig/PigLatin#head-b5560f89fbdeaead846eade0ee9585183736ba85"&gt;atomic data item instead of as a tuple &lt;/a&gt;.  The 'as sorted_local' portion renames the data item.&lt;br /&gt;&lt;br /&gt;The type of B is now a tuple (sorted_local, cl).&lt;br /&gt;&lt;br /&gt;The next line eliminates duplicates.  So, if two records have the same sorted local part AND cl, then we can safely erase the duplicate because it will not affect our final count.  In fact, we'll need to eliminate it for the rest of our logic to work.  The PARALLEL keyword ups the number of reduces.  This means we'll end up with 10 output files instead of 1, but that's ok because we'll process them all later, anyway.&lt;br /&gt;&lt;br /&gt;In the end BDIST has the same type as B (sorted_local, cl).&lt;br /&gt;&lt;br /&gt;The line that aliases C groups BDIST by its sorted_local part.  This basically creates one record for each distinct sorted_local part.  The value is a data bag that  contains one BDIST record for each distinct sorted local part.&lt;br /&gt;&lt;br /&gt;So, C now has the type (group, BDIST:{sorted_local, cl}).&lt;br /&gt;&lt;br /&gt;The D line gets rid of any groups that have only one cl.  D has the same type as C.&lt;br /&gt;&lt;br /&gt;The E line gets only the groups, ignoring the actual values.  And the store line writes those groups out.  So, now I have one group for every sorted local part that has more than one CL.  How cool is that!&lt;br /&gt;&lt;br /&gt;Here is my PigFunction for sorting the characters:&lt;br /&gt;&lt;br /&gt;import org.apache.pig.data.Tuple;&lt;br /&gt;import org.apache.pig.data.DataBag;&lt;br /&gt;import org.apache.pig.EvalFunc;&lt;br /&gt;import java.util.Arrays;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;&lt;br /&gt;public class SortChars extends EvalFunc&lt;Tuple&gt;  {&lt;br /&gt;  @Override&lt;br /&gt;  public void exec(Tuple input, Tuple output) throws IOException {&lt;br /&gt;    String str = input.getAtomField(0).strval();&lt;br /&gt;    byte[] bytes = str.getBytes();&lt;br /&gt;    Arrays.sort(bytes);&lt;br /&gt;    str = new String(bytes);&lt;br /&gt;    Tuple newOut = new Tuple(str);&lt;br /&gt;    output.copyFrom(newOut);&lt;br /&gt;  }&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-562249439996328283?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/562249439996328283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=562249439996328283' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/562249439996328283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/562249439996328283'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/05/mahout.html' title='Mahout'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-2030224575770397951</id><published>2008-05-21T15:50:00.000-07:00</published><updated>2008-05-21T15:59:15.926-07:00</updated><title type='text'>Pig</title><content type='html'>&lt;a href="http://incubator.apache.org/pig/"&gt;Pig&lt;/a&gt; is Yahoo!'s data flow language that is designed to run atop hadoop.  I've spent a few hours today getting it set up and running.  One thing I would like to point out is that you can't run the &lt;i&gt;pig&lt;/i&gt; script in the bin directory (or at least not and connect to the hadoop cluster).&lt;br /&gt;&lt;br /&gt;I had to manually run:&lt;br /&gt;java -cp pig.jar:$HADOOPSITECONFIG org.apache.pig.Main&lt;br /&gt;&lt;br /&gt;Also, if you dump a variable, it  has to run the map phases to get to it.  I thought  it would just tell the schema, but no....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-2030224575770397951?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/2030224575770397951/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=2030224575770397951' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/2030224575770397951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/2030224575770397951'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/05/pig.html' title='Pig'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-1862771096803352184</id><published>2008-05-21T10:38:00.000-07:00</published><updated>2008-05-21T10:41:30.890-07:00</updated><title type='text'>Hadoop Streaming</title><content type='html'>&lt;a href="http://hadoop.apache.org/core/docs/r0.15.2/streaming.html"&gt;Hadoop Streaming&lt;/a&gt; appears to be a way to write quick hadoop jobs.  I've recently been playing with it and have finally gotten it to work for me.&lt;br /&gt;&lt;br /&gt;The main parameter that I had to add was -jobconf stream.shipped.hadoopstreaming=$HADOOP_HOME/contrib/streaming&lt;br /&gt;&lt;br /&gt;It was somehow getting set to /tmp which was causing everything in my /tmp directory to get added to the job jar it generates.&lt;br /&gt;&lt;br /&gt;Another good thing to keep in mind is the -verbose flag.  It can help figure out what is going on under the hood.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-1862771096803352184?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/1862771096803352184/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=1862771096803352184' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/1862771096803352184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/1862771096803352184'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/05/hadoop-streaming.html' title='Hadoop Streaming'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-1530230921343427663</id><published>2008-05-20T12:34:00.000-07:00</published><updated>2008-05-20T12:42:29.751-07:00</updated><title type='text'>Multi-User Hadoop</title><content type='html'>I've been setting up &lt;a href="hadoop.apache.org"&gt;hadoop&lt;/a&gt; on a few (6) boxes and have been attempting to make it work for multiple users.  It is not as easy as it sounds because the docs are a bit spread out.&lt;br /&gt;&lt;br /&gt;Nevertheless, if everyone is in the same group, then you need to set your default group to represent that.&lt;br /&gt;&lt;br /&gt;&lt;property&gt;&lt;br /&gt;  &lt;name&gt;dfs.permissions.supergroup&lt;/name&gt;&lt;br /&gt;  &lt;value&gt;groupname&lt;/value&gt;&lt;br /&gt;&lt;/property&gt;&lt;br /&gt;&lt;br /&gt;You'll also need to change the group of any files you've already created.&lt;br /&gt;hadoop dfs chgrp -R groupname /&lt;br /&gt;&lt;br /&gt;Next, to allow multiple users to run mapreduce jobs, you'll need to set your configuration directory to be a place that is accessible to ALL the boxes.  I'm using an nfs mount, but you could use hdfs just as easily.&lt;br /&gt;&lt;br /&gt;&lt;property&gt;&lt;br /&gt;  &lt;name&gt;mapred.system.dir&lt;/name&gt;&lt;br /&gt;  &lt;value&gt;/mnt/myNFSMount/hadoop/mapred/system&lt;/value&gt;&lt;br /&gt;&lt;/property&gt;&lt;br /&gt;&lt;br /&gt;Make sure that directory exists and is writable by the group mentioned above (or at least that all your mapreduce users can write to it).&lt;br /&gt;&lt;br /&gt;At this point, that is all that I know needs to be changed.  I have two people (including myself) using our hadoop cluster.  So, I'll let you know as we run into more problems.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-1530230921343427663?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/1530230921343427663/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=1530230921343427663' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/1530230921343427663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/1530230921343427663'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/05/multi-user-hadoop.html' title='Multi-User Hadoop'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-591032145428301577</id><published>2008-05-03T18:32:00.000-07:00</published><updated>2008-05-03T18:34:26.008-07:00</updated><title type='text'>Linear Algebra</title><content type='html'>A great undergraduate linear algebra class from MIT's Open Courseware program can be found &lt;a href="http://www.youtube.com/view_play_list?p=E7DDD91010BC51F8&amp;page=1"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Other MIT Open Courseware courses with heavy video/audio content can be found &lt;a href="http://ocw.mit.edu/OcwWeb/web/courses/av/index.htm"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-591032145428301577?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/591032145428301577/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=591032145428301577' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/591032145428301577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/591032145428301577'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/05/linear-algebra.html' title='Linear Algebra'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-1171994185194720755</id><published>2008-04-27T00:20:00.001-07:00</published><updated>2008-04-27T00:26:32.549-07:00</updated><title type='text'>You Tube Videos</title><content type='html'>Google Tech Talks has a number of great video lectures on You Tube.  I thought I would share some that I found interesting.&lt;br /&gt;&lt;br /&gt;First, there is a &lt;a href="http://www.youtube.com/watch?v=zRsMEl6PHhM"&gt;13 part series on statistical aspects of data mining&lt;/a&gt;.  The presenter is giving the class at Stanford and decides to also give the class for fellow Googlers.  He is a very good instructor and takes people through an introduction of how to use statistics in data mining.  This is definitely required watching.&lt;br /&gt;&lt;br /&gt;Second, Andrew McCallum has a lecture on &lt;a href="http://www.youtube.com/watch?v=LFVf629jATY"&gt;enabling object search instead of page search&lt;/a&gt;.  Basically, his work is in entity resolution and graph approaches.&lt;br /&gt;&lt;br /&gt;More to come...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-1171994185194720755?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/1171994185194720755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=1171994185194720755' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/1171994185194720755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/1171994185194720755'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/04/you-tube-videos.html' title='You Tube Videos'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-3197067936219674807</id><published>2008-03-20T06:27:00.000-07:00</published><updated>2008-03-20T06:42:53.993-07:00</updated><title type='text'>Toyota</title><content type='html'>I couldn't agree more&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.sun.com/jimgris/entry/toyota_don_t_measure_against"&gt;Don't measure against rivals&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It seems like companies, when they develop a new product, just try to emulate what is already available in the market.  Unfortunately, it takes 3 to 5 years to create a mature product.  What is currently available is somewhere in that 3 to 5 year span.  If you attempt to emulate that, you will also take 3 to 5 years.  However, by that time, the market will have moved on.  You will always be reactionary and you will always be behind the competition.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-3197067936219674807?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/3197067936219674807/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=3197067936219674807' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/3197067936219674807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/3197067936219674807'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/03/toyota.html' title='Toyota'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-8114966857867807570</id><published>2008-03-18T04:23:00.000-07:00</published><updated>2008-03-18T04:30:36.955-07:00</updated><title type='text'>Data mining</title><content type='html'>To feed my continuing interest in behavioral economics, I've decided to dig deeper into data mining.  It seems that every researcher uses data mining in some way.  I'm taking a course in statistical approaches to natural language processing.  It is definitely improving my understanding of the difficulties involved in analyzing the data.  I also hope to get a few books on the subject soon.&lt;br /&gt;&lt;br /&gt;It seems that real estate data is quite the gem of the behavioral economics world.  I guess because it is free and easily accessible, it gets more interest, much like blogs  for the search community.&lt;br /&gt;&lt;br /&gt;Probably the best thing to do would be start with a question.  What do I want to know about the world?  And then start finding the right ways to answer it.  I'm not sure what my question will be.  Stay tuned.  In the mean time, I wonder where you find real estate data...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-8114966857867807570?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/8114966857867807570/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=8114966857867807570' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/8114966857867807570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/8114966857867807570'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/03/data-mining.html' title='Data mining'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-6647812567204886102</id><published>2008-03-13T21:15:00.001-07:00</published><updated>2008-03-13T21:19:07.065-07:00</updated><title type='text'>Lost</title><content type='html'>The other day, we lost a student in our program.  Our website, still in beta, was a bit too buggy and too confusing.  He or she was right to leave, we should have put more time into user testing.  Instead of throwing out half-baked ideas, we should have made them a little more solid.  We released a student site and sent them a link, but didn't link to it on our homepage.  We did have a link to our forum, but our forum username wasn't the same as the student username and password.  But we learned from that experience.  We're focusing heavily now on usability.  We're trimming unnecessary fat and trying to unify our systems.  I lost one student, but I don't want to lose another for similar reasons.&lt;br /&gt;&lt;br /&gt;So, if we send out a link to it, the link better be on the front page.  Also, people like to have a button that says "login".  Finally, if you have multiple features, the login information should be consistent among all three.  Since we grew organically and a little haphazardly, we didn't think of these things.  Now they've bitten us and it is time to fix them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-6647812567204886102?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/6647812567204886102/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=6647812567204886102' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/6647812567204886102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/6647812567204886102'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/03/lost.html' title='Lost'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-4013974510235085645</id><published>2008-03-11T17:01:00.000-07:00</published><updated>2008-03-11T17:04:45.697-07:00</updated><title type='text'>Michael Buble</title><content type='html'>My wife and I went to see Michael Buble' last night in Memphis.  He's a very good entertainer.  However, it was sad to think that he is the best standards singer of our time.  He's not on the level of a Frank Sinatra or even a Bing Crosby.  I think of him more like a Sammy Davis Jr. type.  I actually like his original compositions more than I do his take on the standards.  Anyway, I would recommend going if you get the chance, he's worth that.  I just wouldn't go more than once.&lt;br /&gt;&lt;br /&gt;At least Memphis in May is coming up soon.  I am looking forward to that!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-4013974510235085645?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/4013974510235085645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=4013974510235085645' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/4013974510235085645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/4013974510235085645'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/03/michael-buble.html' title='Michael Buble'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-7892946019142000753</id><published>2008-03-07T22:35:00.000-08:00</published><updated>2008-03-07T22:39:16.764-08:00</updated><title type='text'>Remote users</title><content type='html'>Remote users are the worst.  It was nice when all I had to deal with were me and my friend.  There were no versioning problems and when differences did arise, I just drove down the street and took care of them.  Now, my software has to run on XP and Vista (yes, that can be problematic).  It has to run with different versions of Internet Explorer.  It has to deal with all sorts of problems that it didn't have to when it was just for me.  However, I have to say I'm learning a lot.  I can now manipulate the DOM like nobody's business.  Is that useful?  Probably not.  But then again, when have I cared about usefulness, as long as its cool :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-7892946019142000753?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/7892946019142000753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=7892946019142000753' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/7892946019142000753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/7892946019142000753'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/03/remote-users.html' title='Remote users'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-282509827099957856</id><published>2008-03-07T03:49:00.000-08:00</published><updated>2008-03-07T04:05:28.032-08:00</updated><title type='text'>Why doesn't everyone use unicode?</title><content type='html'>Well, my promise to blog daily was short lived, but I'm back now.  Wednesday's are going to be hard for me to blog because I teach a night class about 2 hours from where I live.  But, I should have blogged on Thursday, no excuses there.&lt;br /&gt;&lt;br /&gt;On to today's topic.&lt;br /&gt;&lt;br /&gt;I spent multiple hours yesterday dealing with a character set encoding issue.  As I've mentioned, our &lt;a href="www.personalchesstraining.com"&gt;chess training site&lt;/a&gt; is multi-lingual.  Therefore, we store all of our messages in UTF-8.  Our database, MySQL, is set to use unicode as is our server side language, PHP.  Our client side language, perl, is also set to use unicode.  However, no matter how hard I tried, whenever I sent a message using red hot pawn via our software, the message got corrupted.  I could manually copy and paste the message from our database viewer to the message sender and it would work fine, but when my software did it, the &amp;auml; came out looking like &amp;Atilde; and some other symbol that I wasn't familiar with.  Of course, having it print to my screen from perl caused it to come out looking like a third symbol &amp;#931;.  Obviously, Internet Explorer, perl, and my windows console were all using different character sets.  I found my setting for Internet Explorer.  It was set to ISO-8859-1 (Latin 1).  I did not find the setting for my windows command prompt.  I assume it was using some Windows character set.  I tried changing the Internet Explorer setting, but it didn't seem to have an effect.  Finally, after a few hours of hunting and validating various settings, I checked the encoding on the red hot pawn page.  It was set to ISO-8859-1.  Ah ha!  So, they were enforcing their own encoding on the page.  Apparently, when I copy and paste, the operating system does the conversion in the background for me.  However, when my program does it, I have to do the conversion myself.  Because of a few limitations, using the perl Encode module was not an option for me.  So, I settled on utf8::downgrade.  This won't work if someone's desktop settings are not Latin-1, but is suits my needs at the moment.  Why can't everyone just use unicode?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-282509827099957856?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/282509827099957856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=282509827099957856' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/282509827099957856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/282509827099957856'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/03/why-doesnt-everyone-use-unicode.html' title='Why doesn&apos;t everyone use unicode?'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-192630190780285904</id><published>2008-03-04T22:46:00.000-08:00</published><updated>2008-03-04T23:18:04.006-08:00</updated><title type='text'>The value of free</title><content type='html'>&lt;a href="http://www.amazon.com/gp/product/006135323X/ref=s9_asin_image_1_subs_c2_95_2_2_1_1?pf_rd_m=ATVPDKIKX0DER&amp;pf_rd_s=center-2&amp;pf_rd_r=1F4ZY9NGTFYC182KREP3&amp;pf_rd_t=101&amp;pf_rd_p=278240301&amp;pf_rd_i=507846"&gt;Predictably Irrational&lt;/a&gt; spends quite a bit of time talking about the value of free.  Apparently, free makes you go bananas.  For instance, if you are checking out at a store and are offered a hershey's kiss for free or a &lt;a href="http://www.worldwidechocolate.com/shop_lindt.html"&gt;lindt chocolate truffle&lt;/a&gt; for $.14, over 70% of the people take the free kiss.  If you charge just $.01 for the hershey's kiss, then over 70% of the people will take the truffle, even though it is $.15 (adding the penny back in for relative difference reasons).  Free makes people bananas.&lt;br /&gt;&lt;br /&gt;Another study came from &lt;a href="www.amazon.com"&gt;Amazon&lt;/a&gt;.  When Amazon started offering free shipping, their sales increased dramatically everywhere but in France.  France saw no difference.  After researching it, they discovered that the French division had decided not to go completely free, but instead charge 1 Franc (about US $.20 at the time).  This small fee was enough to change people's brain chemistry.  When they reduced the price to free, France also saw a big jump in purchases.&lt;br /&gt;&lt;br /&gt;The next chapter expands this by considering social norms and market norms.  We deal with both every day, but we try not to mix them.  If you are using a social norm (like eating dinner at a friend's house), you don't offer to pay.  You can give a small gift as appreciation, but you NEVER bring up money.  Contrariwise, if you are using a market norm, then you want the best deal - you act selfish.  What their research found was that the smallest payment was enough to change people from a social norm to a market norm.  In fact, even the idea of money was enough to make the change.  For instance, if you ask someone off the street to help you move a couch, they will agree.  If, instead, you offer to pay them $1.00 to help you, they will turn and run because they are insulted.  When operating in market norm phase they want the best deal, when operating in social norm phase, they want to help.&lt;br /&gt;&lt;br /&gt;Perhaps we take the free Hershey's kiss over the lindt truffle because we want to operate in a social norm.  We are social creatures and we want to be unselfish.  Perhaps by thinking of the kiss as a free gift, we get to stay in our social environment that much longer, keeping out the harsh market realities.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-192630190780285904?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/192630190780285904/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=192630190780285904' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/192630190780285904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/192630190780285904'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/03/value-of-free.html' title='The value of free'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-8108672943299766944</id><published>2008-03-03T22:46:00.000-08:00</published><updated>2008-03-03T22:52:07.500-08:00</updated><title type='text'>Force and Counterforce</title><content type='html'>I'm programming the &lt;a href="www.personalchesstraining.com"&gt;Personal Chess Training website&lt;/a&gt; with a friend.  He does most of the content work (web design, chess problems, hints, etc...).  I do most of the hard core programming.  We split the database work, the hard stuff goes to me and he picks up the easier things.&lt;br /&gt;&lt;br /&gt;The one thing that is interesting is how force and counterforce work together between us.  For example, I prefer to take things slow and steadily.  He prefers to rush in and see what breaks.  I have my students set to 1 or 2 problems at a time, he sent out 25 to all of his students at once.  I had hoped to add 1 or 2 additional teachers, he signed up 10.  Often, his forces create counter forces in the code base.  For instance, I got tired of hardcoding the teacher name in the code, so now I pull it automatically from their cookies.  We needed some way to handle his problem load, so we created tracks and simultaneous games that could be set per teacher.  I also added automatic restarting of mates in 1 since he was having to work through so many that students missed.  Each push that he has given has resulted in a counter push by me to automate the site to reduce my workload.&lt;br /&gt;&lt;br /&gt;I wonder how many other things have come about from a force and a counter force.  After all, necessity is the mother of invention.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-8108672943299766944?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/8108672943299766944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=8108672943299766944' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/8108672943299766944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/8108672943299766944'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/03/force-and-counterforce.html' title='Force and Counterforce'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-16979995198582387</id><published>2008-03-02T19:25:00.001-08:00</published><updated>2008-03-02T19:27:55.643-08:00</updated><title type='text'>Personal Chess Training</title><content type='html'>Recently, I've been working on a chess training site with a friend.  He's around 2100 and is a very good endgame technician.  We designed a course to help others with their endgames.  If you are interested in improving your chess endgame (for free!), then please visit &lt;a href="www.personalchesstraining.com"&gt;our site&lt;/a&gt;.  You use a free correspondence chess site &lt;a href="www.redhotpawn.com"&gt;www.redhotpawn.com&lt;/a&gt; to play the games with REAL HUMANS.  We've had a number of great comments on the redhotpawn forum that we can direct you to if you are interested.&lt;br /&gt;&lt;br /&gt;To subscribe, just join red hot pawn and message me (thgibbs) or my friend (petrovitch) with a message indicating your interest.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-16979995198582387?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/16979995198582387/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=16979995198582387' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/16979995198582387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/16979995198582387'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/03/personal-chess-training.html' title='Personal Chess Training'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-785319288265719435</id><published>2008-03-02T19:06:00.000-08:00</published><updated>2008-03-02T19:23:02.077-08:00</updated><title type='text'>Comparisons and Anchors</title><content type='html'>It's been a while since I posted, but I'm going to try and post daily from this point on - we'll see.&lt;br /&gt;&lt;br /&gt;I've been listening to the book &lt;a href="http://www.amazon.com/Predictably-Irrational-Hidden-Forces-Decisions/dp/006135323X/ref=pd_bbs_1?ie=UTF8&amp;s=books&amp;qid=1204513745&amp;sr=1-1"&gt;Predictably Irrational: The Hidden Forces that Shape Our Decisions&lt;/a&gt; on my &lt;a href="http://www.apple.com/iphone/"&gt;iPhone&lt;/a&gt; that I got from my &lt;a href="www.audible.com"&gt;audible subscription&lt;/a&gt;.  In this book, the author describes how we compare things and how anchors affect us.  In short, an anchor is the first thing that we related to a category.  I'll give an example.  If we see a bicycle advertised for $20, then $20 becomes the anchor price for all bicycles.  If we later see a bicycle for $40 we believe that it is either better in some way or overpriced, but we always go back and compare it to the first price we saw.  He performed studies where anchors were used to manipulate the amount people would pay for an item.  For instance, if people were asked if $10 were a reasonable price for an item, their maximum price was much higher than those people who were asked if $0.10 were a reasonable price.  The initial anchor greatly affects how we view future spending on an item.&lt;br /&gt;&lt;br /&gt;I believe that an iterative approach to software development should be described in these terms.  With the first iteration we give the user an anchor.  He then can make decisions about that program with the initial program in mind.  His requests should be more rational because he is going to frame them in the context of the initial anchor.  With a traditional waterfall approach, the user has to create the requirements without an anchor.  This leads to unnecessary requirements and unused features because the anchor isn't present.  There doesn't exist a "good" or "bad" context to help shape the program, there is only air.  By creating an initial draft of the program, we create an anchor that guides the user, giving them the all important context that ensures a successful program.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-785319288265719435?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/785319288265719435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=785319288265719435' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/785319288265719435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/785319288265719435'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2008/03/comparisons-and-anchors.html' title='Comparisons and Anchors'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-4561823549147243186</id><published>2007-05-01T10:36:00.001-07:00</published><updated>2007-05-01T10:36:48.910-07:00</updated><title type='text'>Fox News</title><content type='html'>Gotta love Fox News and Katrina Victims getting together.&lt;br /&gt;&lt;br /&gt;Warning: Not work safe!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/?v=W1iaNaYT4wc"&gt;Here's the link&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-4561823549147243186?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/4561823549147243186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=4561823549147243186' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/4561823549147243186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/4561823549147243186'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2007/05/fox-news.html' title='Fox News'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-7370688624751675777</id><published>2007-05-01T10:32:00.000-07:00</published><updated>2007-05-01T10:33:15.083-07:00</updated><title type='text'>iGoogle</title><content type='html'>I really like iGoogle, it helps me keep all my blogs and news together on one web page and it is with me wherever I go.&lt;br /&gt;&lt;br /&gt;However, this morning, I logged in to check it and all my content was gone.  I had spent a lot of time setting it up, now I'll have to go back through and do it again :-(  How disappointing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-7370688624751675777?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/7370688624751675777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=7370688624751675777' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/7370688624751675777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/7370688624751675777'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2007/05/igoogle.html' title='iGoogle'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-7446777480506688967</id><published>2007-04-28T09:21:00.000-07:00</published><updated>2007-04-28T09:24:46.774-07:00</updated><title type='text'>Google Themes</title><content type='html'>Wow, Google has done it again!  I opened up my Google homepage to notice that you can set the theme for your homepage.  I picked the seasonal theme, because I like the whimsy.  The really cool thing is that it changes based on the time of day, season, etc...&lt;br /&gt;&lt;br /&gt;Google has a brilliant strategy.  They are slowly making you productive and happy on the web.  It's not a huge shift, just small steps, each one increasing your happiness.    Eventually, you won't even consider using a desktop app, because you'll be completely comfortable with the web based ones.  The content can be updated constantly, you take it with you wherever you go, you can share it easily with others, etc...&lt;br /&gt;&lt;br /&gt;The people at Google are brilliant.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-7446777480506688967?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/7446777480506688967/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=7446777480506688967' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/7446777480506688967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/7446777480506688967'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2007/04/google-themes.html' title='Google Themes'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-6596375702882176848</id><published>2007-02-26T07:29:00.000-08:00</published><updated>2007-02-26T07:37:47.727-08:00</updated><title type='text'>What I've Learned</title><content type='html'>I learned a number of things over the last week, so I thought I'd share&lt;br /&gt;&lt;br /&gt;1) I could never be an academic, I don't own a suit&lt;br /&gt;2) I really like playing the piano, even though I suck at it&lt;br /&gt;3) The good thing is, I suck at everything, so there's not much incentive not to do it&lt;br /&gt;4) I am an idiot (Actually, I already knew that, I just keep learning that I'm more of an idiot than I previously thought.)&lt;br /&gt;5) RFID tags will be the next big thing.  There's going to be some cool stuff done with those.&lt;br /&gt;6) Ecclesiastes is the coolest book :-)&lt;br /&gt;7) I like the term psychological gymnastics.  I tend to perform them often.  It's a constant struggle between seeing what you want to see and seeing what is really there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-6596375702882176848?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/6596375702882176848/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=6596375702882176848' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/6596375702882176848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/6596375702882176848'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2007/02/what-ive-learned.html' title='What I&apos;ve Learned'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-5558635611940426254</id><published>2007-02-20T03:55:00.000-08:00</published><updated>2007-02-20T04:08:29.794-08:00</updated><title type='text'>The Shape of Data</title><content type='html'>The first time I heard anyone talk about the shape of data, it was &lt;a href="http://en.wikipedia.org/wiki/Anders_Hejlsberg"&gt;Anders Hejlsberg&lt;/a&gt;.  He was discussing &lt;a href="http://en.wikipedia.org/wiki/C_Sharp"&gt;C#&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Language_Integrated_Query"&gt;LINQ&lt;/a&gt;.  I distinctly remember him discussing the shape of arrays as being rectangular.  He contrasted this with the more jagged shape of XML data.  Not only that, but one can change the shape of the XML by choosing to use attributes instead of tags.  I tended to think this was fascinating and worth further thought.  The ability to view data structures geometrically could lead to some amazing insights.  Of course, after the initial flash, I gave it no more thought.  However, the folks at Microsoft Research did, and they've produced &lt;a href="ftp://ftp.research.microsoft.com/pub/tr/TR-2007-13.pdf"&gt;this paper&lt;/a&gt;.  I hope it is as interesting as Anders' initial insights were.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-5558635611940426254?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/5558635611940426254/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=5558635611940426254' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/5558635611940426254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/5558635611940426254'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2007/02/shape-of-data.html' title='The Shape of Data'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-8093531032031724166</id><published>2007-02-16T07:22:00.000-08:00</published><updated>2007-02-16T07:25:19.332-08:00</updated><title type='text'>Meta Math!</title><content type='html'>I've been reading &lt;a href="http://en.wikipedia.org/wiki/Chaitin"&gt;Chaitin's&lt;/a&gt; book Meta Math! about Chaitin's Constant.  I can't really say I enjoy his writing, but his ideas are very interesting.  If he were less of an arrogant, self-centered prat, the book would be more enjoyable.&lt;br /&gt;&lt;br /&gt;The section that was most interesting to me was the one in which he argues that trancendental numbers aren't really numbers.  This reflects some of my earlier blog posts where I also say those numbers don't exist.  Instead, I believe they are functions which generate the numbers to a specified precision.&lt;br /&gt;&lt;br /&gt;Anyway, the book is interesting, though poorly written.  Maybe some of his other books are better.  Probably not.  I'm sure they are also full of self-gloating and self-adoration.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-8093531032031724166?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/8093531032031724166/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=8093531032031724166' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/8093531032031724166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/8093531032031724166'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2007/02/meta-math.html' title='Meta Math!'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-934113098768047049</id><published>2007-02-16T07:11:00.000-08:00</published><updated>2007-02-16T07:19:10.638-08:00</updated><title type='text'>Ecclesiastes 1</title><content type='html'>I always felt I understood Solomon and wanted to pattern my life after his.  Here, at this point, I understand Ecclesiastes and continue to follow in the Teacher's wake.&lt;br /&gt;&lt;br /&gt;Vanity of vanities," says the Teacher,&lt;br /&gt;"Vanity of vanities! All is vanity."&lt;br /&gt;&lt;br /&gt;What advantage does man have in all his work&lt;br /&gt;Which he does under the sun?&lt;br /&gt;&lt;br /&gt;A generation goes and a generation comes,&lt;br /&gt;But the earth remains forever.&lt;br /&gt;&lt;br /&gt;Also, the sun rises and the sun sets;&lt;br /&gt;And hastening to its place it rises there again.&lt;br /&gt;&lt;br /&gt;Blowing toward the south,&lt;br /&gt;Then turning toward the north,&lt;br /&gt;The wind continues swirling along;&lt;br /&gt;And on its circular courses the wind returns.&lt;br /&gt;&lt;br /&gt;All the rivers flow into the sea,&lt;br /&gt;Yet the sea is not full.&lt;br /&gt;To the place where the rivers flow,&lt;br /&gt;There they flow again.&lt;br /&gt;&lt;br /&gt;All things are wearisome;&lt;br /&gt;Man is not able to tell it.&lt;br /&gt;The eye is not satisfied with seeing,&lt;br /&gt;Nor is the ear filled with hearing.&lt;br /&gt;&lt;br /&gt;That which has been is that which will be,&lt;br /&gt;And that which has been done is that which will be done.&lt;br /&gt;So there is nothing new under the sun.&lt;br /&gt;&lt;br /&gt;Is there anything of which one might say,&lt;br /&gt;"See this, it is new"?&lt;br /&gt;Already it has existed for ages&lt;br /&gt;Which were before us.&lt;br /&gt;&lt;br /&gt;There is no remembrance of earlier things;&lt;br /&gt;And also of the later things which will occur,&lt;br /&gt;There will be for them no remembrance&lt;br /&gt;Among those who will come later still.&lt;br /&gt;&lt;br /&gt;I, the Teacher, have been king over Israel in Jerusalem.&lt;br /&gt;&lt;br /&gt;And I set my mind to seek and explore by wisdom concerning all that has been done under heaven It is a grievous task which God has given to the sons of men to be afflicted with.&lt;br /&gt;&lt;br /&gt;I have seen all the works which have been done under the sun, and behold, all is vanity and striving after wind.&lt;br /&gt;&lt;br /&gt;What is crooked cannot be straightened and what is lacking cannot be counted.&lt;br /&gt;&lt;br /&gt;I said to myself, "Behold, I have magnified and increased wisdom more than all who were over Jerusalem before me; and my mind has observed a wealth of wisdom and knowledge."&lt;br /&gt;&lt;br /&gt;And I set my mind to know wisdom and to know madness and folly; I realized that this also is striving after wind.&lt;br /&gt;&lt;br /&gt;Because in much wisdom there is much grief, and increasing knowledge results in increasing pain.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-934113098768047049?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/934113098768047049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=934113098768047049' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/934113098768047049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/934113098768047049'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2007/02/ecclesiastes-1.html' title='Ecclesiastes 1'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-6040767374664594007</id><published>2007-02-15T19:49:00.000-08:00</published><updated>2007-02-15T19:56:45.557-08:00</updated><title type='text'>Dark</title><content type='html'>I've been in a dark mood lately for various reasons.  Today, I went to visit random blogs, I thought it might cheer me up.  Boy, was I wrong.  People write the most mundane, idiotic things.  I don't care about your shopping list.  I don't care about what you got for Valentine's day.  Write something with some substance, try to make a freaking difference!  Don't depress me further.&lt;br /&gt;&lt;br /&gt;Life sucks and then you die.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-6040767374664594007?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/6040767374664594007/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=6040767374664594007' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/6040767374664594007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/6040767374664594007'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2007/02/dark.html' title='Dark'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-8889763697860255391</id><published>2007-02-14T04:52:00.000-08:00</published><updated>2007-02-14T04:58:39.603-08:00</updated><title type='text'>Poem</title><content type='html'>I once wrote a poem in high school for a class.  I always liked the poem.  I don't have it anymore, but I remember the last verse.  I thought I would create a new poem that was similar and used the last verse.  Here goes.&lt;br /&gt;&lt;br /&gt;Shadows lurk on closed windows.&lt;br /&gt;The moon's luster provides&lt;br /&gt;a fitting nursery.&lt;br /&gt;&lt;br /&gt;Monsters spring forth&lt;br /&gt;depriving me of slumber,&lt;br /&gt;laughing at my countenance.&lt;br /&gt;&lt;br /&gt;I turn away,&lt;br /&gt;horrified.&lt;br /&gt;They persist;&lt;br /&gt;they encircle me.&lt;br /&gt;&lt;br /&gt;I board up the window&lt;br /&gt;with long nails,&lt;br /&gt;and time-worn planks.&lt;br /&gt;&lt;br /&gt;The monsters vanish,&lt;br /&gt;but their tendrils remain.&lt;br /&gt;They prod me,&lt;br /&gt;tease me,&lt;br /&gt;remind me.&lt;br /&gt;&lt;br /&gt;The warmth on my back is shocking.&lt;br /&gt;I turn.&lt;br /&gt;A new window has opened.&lt;br /&gt;&lt;br /&gt;Its light is brilliant.&lt;br /&gt;There are no shadows here,&lt;br /&gt;but the sun will set;&lt;br /&gt;they will come.&lt;br /&gt;&lt;br /&gt;For a moment,&lt;br /&gt;I bask in the warmth;&lt;br /&gt;I feed off the glow.&lt;br /&gt;&lt;br /&gt;But shadows lurk on closed windows.&lt;br /&gt;Cold,&lt;br /&gt;  Dark,&lt;br /&gt;    Lonely,&lt;br /&gt;I will never forget.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It needs some work, but I'll try and edit it from time to time.  Stop back by to check on its progress.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-8889763697860255391?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/8889763697860255391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=8889763697860255391' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/8889763697860255391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/8889763697860255391'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2007/02/poem.html' title='Poem'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-759034392126075770</id><published>2007-02-13T14:14:00.000-08:00</published><updated>2007-02-04T21:06:58.092-08:00</updated><title type='text'>I hate dreaming</title><content type='html'>I hate dreaming.  I absolutely hate it.  Most of my dreams are awful.  When I was a child, I had &lt;a href="http://en.wikipedia.org/wiki/Night_terror"&gt;night terrors&lt;/a&gt;.  Like most cases, they went away as I grew up.  Unfortunately, mine returned after my father died.  It is said that they can return after a stressful or traumatic event, and  they did.  What's worse is that I've always been able to recall them.  Most people just wake up screaming with no idea why.  Me?  I have full recollection of the terrors.  Luckily, my wife is used to it, she just ignores me when I wake up screaming; although I'm sure it annoys her.&lt;br /&gt;&lt;br /&gt;Other dreams are just as bad.  They usually represent something I've repressed and don't want to think about.  So now, I've done a good job of not thinking about certain topics and my dreams just drag them up and force me to confront them.  I can't win.  The whole point of repressing things is so that I don't have to deal with them.  What good does it do if my subconcious is plotting against me!  Arrrrggggg!&lt;br /&gt;&lt;br /&gt;Anyway, the whole point of this post is to say that I hate dreaming.  It sucks.  Anybody have any good dream experiences and maybe some advice on how to get those instead of the ones I have?  It would be most appreciated.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-759034392126075770?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/759034392126075770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=759034392126075770' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/759034392126075770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/759034392126075770'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2007/02/i-hate-dreaming.html' title='I hate dreaming'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-6899561142301677837</id><published>2007-02-04T17:13:00.000-08:00</published><updated>2007-02-04T17:18:50.352-08:00</updated><title type='text'>Dr Jim Gray is missing</title><content type='html'>It is a very sad day.  Dr. Jim Gray, brilliant database researcher (two phase commits, anyone?) has gone missing.  Apparently, he was on a boat trip to scatter his mother's ashes and no one has heard from him since.  Amazon has set up a number of satellite images that you can manually inspect to see if you can help find his boat.  You can read more about it &lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=194115."&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;My prayers go out to Dr. Gray and his family.&lt;br /&gt;&lt;br /&gt;And, if you don't have a copy of his book, &lt;a href="http://www.amazon.com/Transaction-Processing-Concepts-Techniques-Management/dp/1558601902/sr=1-1/qid=1170638233/ref=pd_bbs_sr_1/102-1204746-2375319?ie=UTF8&amp;s=books"&gt;Transaction Processing&lt;/a&gt;, you should.  It is a must read, especially in the coming world of multi-core processors.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-6899561142301677837?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/6899561142301677837/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=6899561142301677837' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/6899561142301677837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/6899561142301677837'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2007/02/dr-jim-gray-is-missing.html' title='Dr Jim Gray is missing'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-5749898825696805240</id><published>2007-02-03T23:17:00.000-08:00</published><updated>2007-02-03T23:29:51.988-08:00</updated><title type='text'>Why I hate working from home</title><content type='html'>I work from home for a living.  I go into the office, on average, once a week.  At the present, I don't really work closely with a team of people, so I really don't have a need to go into the office.  However, I have to say that I absolutely hate working from home.  The main thing I miss is the people.  I like working with people.  I like to run my ideas past people and get their opinions.  I like to help other people with their problems.  Right now, I live my life behind a mask of email and text messages.  It is &lt;span style="font-style:italic;"&gt;so boring.&lt;/span&gt;  I don't get to hear another adult's voice until my wife comes home at night, and you can only listen to the TV or radio for so long before it affects your concentration.  Furthermore, working from home severely limits your career movement.  That's not something I'm overly concerned about, but it certainly doesn't add anything.&lt;br /&gt;&lt;br /&gt;So, why do I work from home?  For my kids.  My wife works an hour from where we live; she's a nurse in a children's hospital and she loves her job.  I wouldn't ask her to change that for anything.  However, with two children, someone has to be available to pick them up in the afternoons from school and watch them.  This is the job that I have chosen to do.  When my wife was in nursing school, I worked for a company that was an hour away.  I really did enjoy it.  The company and the people were great and I loved being in an office atmosphere.  When my wife graduated, we moved away and we both worked near the home.  However, this meant that the kids were in day care until 5:30 or 6:00 every day.  That was not how I wanted my kids to be raised.  So, we moved back home and I took a job working out of my home again.  It was a hard thing for me to do; those closest to me know it was a real struggle.  Nevertheless, it was the right choice.  The kids are the most important thing and one day they will be old enough such that they won't need me here.  Until then, I'll chat away online and thinking to myself that working from home sucks.&lt;br /&gt;&lt;br /&gt;Don't get me wrong, if you work in an office for a living, then working from home occasionally is a nice change of pace.  On the other hand, working from home permanently is like being locked away in solitary confinement.  You end up stir crazy talking to the dog or yourself, typically both.  I often wonder what other people do in this situation.  Does one of them not work?  I can't imagine asking my wife to not work, she loves what she does.  Do people leave their kids with other family members?  Perhaps they go the day care route, or maybe something else that I'm not considering?  I know my solution to the problem, but I'd be curious to know others' solutions and why.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-5749898825696805240?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/5749898825696805240/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=5749898825696805240' title='22 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/5749898825696805240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/5749898825696805240'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2007/02/why-i-hate-working-from-home.html' title='Why I hate working from home'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>22</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-1307976561479256536</id><published>2007-01-29T22:39:00.000-08:00</published><updated>2007-01-29T22:59:02.115-08:00</updated><title type='text'>There is but one infinity</title><content type='html'>I've always been hung up on the notion of countable vs uncountable infinity.  It seemed a rather silly thing to say, that you could have more than infinity.  I understand the argument for it, but from an intuitive level, it felt wrong.  Now, I feel that it is completely wrong.  There are only two kinds of numbers, those whose digits can be represented and those whose digits can't.  7, 13, 10000000 all belong to the first category as well as .015, .139, and .00000000000000000000000000000000001.  PI, 1/3, and e all belong to the second.  The second category of numbers are not really numbers but &lt;span style="font-style:italic;"&gt;ideas&lt;/span&gt;.  They are, in essence, equations.  Given a precision, they can produce a number of the first category, but they are not numbers in and of themselves.  Another example would be the summation of the reciprocals of all integers, given a precision, we can produce the number, but the summation itself is just an abstract notion.  With that we can understand that what we consider to be countable infinity doesn't really exist.  It is in the second category and is therefore part of the larger infinity.  If you give the countable numbers a precision (limit), then you can discuss those numbers; however, without a limit, the countable numbers are just an idea, much like PI, or the zeta function.  In fact, you could think of the countable numbers as a function that, given a number, produces a new number one higher.  However, there is a difference between the "idea" of the function and the numbers that the function produces.  The idea of the function can go into the infinite, the actual numbers cannot.  The same holds true with PI.  The idea of PI can go into the infinite, the actual number can't.  The problem with the proof of uncountable infinity is that the natural numbers are limited to the finite whereas the irrational numbers are allowed to go to the infinite.  When one realizes that the irrational numbers cannot go to the infinite, then the proof becomes nonsense.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-1307976561479256536?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/1307976561479256536/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=1307976561479256536' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/1307976561479256536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/1307976561479256536'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2007/01/there-is-but-one-infinity.html' title='There is but one infinity'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-1464933140385455398</id><published>2007-01-24T21:39:00.000-08:00</published><updated>2007-01-24T21:43:59.436-08:00</updated><title type='text'>The Game</title><content type='html'>Last Sunday I went to the AFC Championship Game between the Indianapolis Colts and the New England Patriots.  It was a blast.  The game was amazing and the RCA Dome is an excellent environment.  The one thing I noticed is how loud it is there, well, at least when the other team is on the field.  You don't get a true idea of the volume through TV or radio.  The other thing I noticed were how great the fans were.  We were sitting beside a number of Colts fans and they were extremely classy and fun to be around.  I have to say that I was surprised at how much fun I had watching the game.  I had begun to think that football had become a television sport, but I can safely say that is not the case.  It was soooo much better watching it live and in-person.  It didn't feel productionalized.  It felt raw and real.  I had a truly amazing time and I can't wait for next year's game!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-1464933140385455398?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/1464933140385455398/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=1464933140385455398' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/1464933140385455398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/1464933140385455398'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2007/01/game.html' title='The Game'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-7074553720868586444</id><published>2007-01-17T17:54:00.000-08:00</published><updated>2007-01-17T17:58:40.801-08:00</updated><title type='text'>Google Books</title><content type='html'>I didn't know google had a public book storage and viewing mechanism, but apparently they do.  Since I've been searching for boolean equation stuffage, I ran across it.&lt;br /&gt;&lt;br /&gt;Here's a Dover book I found:&lt;br /&gt;&lt;a href="http://books.google.com/books?hl=en&amp;lr=&amp;amp;id=UhVebrxXGQMC&amp;oi=fnd&amp;amp;pg=PP7&amp;sig=xbFsruH0yQ9VWAtP-8sk2BycqQM&amp;amp;dq=boolean+equation#PPR10,M1"&gt;Boolean Reasoning: The Logic of Boolean Equations&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-7074553720868586444?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/7074553720868586444/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=7074553720868586444' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/7074553720868586444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/7074553720868586444'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2007/01/google-books.html' title='Google Books'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-4295667889069107678</id><published>2007-01-17T16:19:00.000-08:00</published><updated>2007-01-17T16:28:21.322-08:00</updated><title type='text'>BigTable</title><content type='html'>Google has been slowly developing tools and technologies to support its unique requirements.  I'd like to use this post to catalog information about them.&lt;br /&gt;&lt;br /&gt;BigTable is google's answer to the database.  Wikipedia has a good article on it &lt;a href="http://en.wikipedia.org/wiki/BigTable"&gt;here&lt;/a&gt;.&lt;br /&gt;MapReduce is google's answer to workflow.  The article is &lt;a href="http://en.wikipedia.org/wiki/MapReduce"&gt;here&lt;/a&gt;.&lt;br /&gt;Sawzall is google's high level distributed language.  The paper is &lt;a href="http://labs.google.com/papers/sawzall.html"&gt;here&lt;/a&gt;.&lt;br /&gt;GFS is google's file system.  The article is &lt;a href="http://en.wikipedia.org/wiki/Google_File_System"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-4295667889069107678?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/4295667889069107678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=4295667889069107678' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/4295667889069107678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/4295667889069107678'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2007/01/bigtable.html' title='BigTable'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-3992056293821794020</id><published>2007-01-17T13:26:00.000-08:00</published><updated>2007-01-17T13:27:55.607-08:00</updated><title type='text'>Great CDI Blog</title><content type='html'>&lt;a href="http://www.b-eye-network.com/blogs/dyche/"&gt;Here's a great blog from someone who understands CDI from the business perspective&lt;/a&gt;.  An excellent read.  Head's up, her name is pronounced "dishay".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-3992056293821794020?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/3992056293821794020/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=3992056293821794020' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/3992056293821794020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/3992056293821794020'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2007/01/great-cdi-blog.html' title='Great CDI Blog'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-5870340421537975108</id><published>2007-01-17T06:43:00.000-08:00</published><updated>2007-01-17T06:44:29.610-08:00</updated><title type='text'>Google's video picks</title><content type='html'>For those of you who want a little substance and are having a hard time finding it with YouTube, check out Google's top 20 video picks &lt;a href="http://googleresearch.blogspot.com/2006/12/google-research-picks-for-videos-of.html"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-5870340421537975108?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/5870340421537975108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=5870340421537975108' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/5870340421537975108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/5870340421537975108'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2007/01/googles-video-picks.html' title='Google&apos;s video picks'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-5641210080947876127</id><published>2007-01-17T06:24:00.000-08:00</published><updated>2007-01-17T06:31:00.839-08:00</updated><title type='text'>Big brother strikes again</title><content type='html'>Where do we draw the line?  &lt;a href="http://jeffjonas.typepad.com/jeff_jonas/2007/01/p300_brain_fing.html"&gt;Jeff Jonas details the using of a P300 brain response as allowable evidence in court cases.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I would like to have seen more information about what a P300 response is.  Is it possible that some people are "malformed" and have this response even when presented with an unfamiliar image?  What if it is your living room and, while the blood is unfamiliar, the rest of the information is.  There are too many variables for me to enjoy this.&lt;br /&gt;&lt;br /&gt;As for going to jail because you thought about committing a crime, that is ludicrous.  The difference between humanity and animals is that we can control our actions.  I'm not sure we can control our thoughts.  Regardless, as humans, we must be judged on what we can control.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-5641210080947876127?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/5641210080947876127/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=5641210080947876127' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/5641210080947876127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/5641210080947876127'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2007/01/big-brother-strikes-again.html' title='Big brother strikes again'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-721821533589475501</id><published>2007-01-16T13:12:00.000-08:00</published><updated>2007-01-16T13:27:10.292-08:00</updated><title type='text'>Boolean Equation Problem</title><content type='html'>I'm struggling with the following problem.&lt;br /&gt;&lt;br /&gt;I have a series of boolean equations.  Only one of these equations can be true at any one time.  I need to find an efficient way of determining which of these equations is true.  I would also like to know more about these equations, like is it true that only one of the equations can be true and what new equations are needed to make that true.&lt;br /&gt;&lt;br /&gt;Here's an example.  Let's say that half of the equations deal with the condition where variable A issw equal to the value 'M'.  25% of the equations deal with the condition where variable A is 'm', 25% of the equations deal with the condition where variable A is 'n', 15% where the variable A is '?' and 10% where the variable A is 'N'.  The variable B has a situation where 75% of the equations deal with the condition where it is 'M' and the other 25% of the equations are divided among the other choices.  There are also variables C, D, E, F, and G.  Which of these variables do I evaluate first?  What factors should I consider?  Are there algorithms that will help me in determining this?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-721821533589475501?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/721821533589475501/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=721821533589475501' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/721821533589475501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/721821533589475501'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2007/01/boolean-equation-problem.html' title='Boolean Equation Problem'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-116897381032574235</id><published>2007-01-16T10:08:00.000-08:00</published><updated>2007-01-16T10:56:50.380-08:00</updated><title type='text'>Ch-ch-ch changes</title><content type='html'>The previous year was a year of changes.  I worked for three different companies, in three different cities, one of which required me to move 800 miles away.  Now, I'm back where I began and I've learned an awful lot and met some truly amazing people.&lt;br /&gt;&lt;br /&gt;One of the first things I learned is that there is nothing more important than your family.  I missed being able to pick my kids up from school and taking care of them in the afternoons.  I also missed the good friends I had made here.  I didn't realize how much I had missed them until I moved back.&lt;br /&gt;&lt;br /&gt;Second, I learned that going to church is an important part of your spiritual development.  Seems obvious, right?  Well, I've recently been going to the &lt;a href="http://www.wynnefumc.com/templates/System/default.asp?id=30041"&gt;First United Methodist Church of Wynne&lt;/a&gt; and have really enjoyed both the service and the Sunday School.  I've been going there with friends, which really helps.&lt;br /&gt;&lt;br /&gt;Third, I have learned a lot, technically.  I've learned the value of having business people drive functionality and I've learned the value of architecture that is planned  over architecture that evolves.  I've learned about J2EE, CORBA, networking, TIBCO, and a whole host of other things.  I enjoy learning, so that was fantastic.&lt;br /&gt;&lt;br /&gt;Fourth, I learned that to be a good team leader, you've got to be able to stand up for those who are working for you.  I've had leaders that I really enjoyed at all the companies -- they were all really positive experiences.  Each one had a different style, but when it came time to go to bat, they were there to stand up for me.&lt;br /&gt;&lt;br /&gt;Fifth, I learned that if you want to stay challenged in a traditionally business IT shop, you need to challenge yourself.  It seems the expectations of those places are low and you can easily "just get by."  In fact, you can easily descend into madness.  But, to truly excel, you have to challenge yourself to come up with innovative ideas to make their software cost less and be more stable.  I think more and more the key to good programming is focusing on stability.&lt;br /&gt;&lt;br /&gt;Sixth, I learned that I have to make tradeoffs and I'm thankful for the past year because it helped me understand what those tradeoffs are.  Right now, I work from home.  It allows me to pick up the kids and help out my wife, who drives an hour to work three days a week.  However, it also isolates me from communication with others.  I really like the office setting where I can talk to an adult when I run into a roadblock, instead of being isolated from everyone.  Therefore, I have to realize the need exists and try to assuage it in a different manner.  Eventually, I'll go into the office more (at least 2 days per week) and hope that helps.  However, right now I'm not working with a team, so going into the office doesn't really help.  Nevertheless, spending the last year in two different office environments helped remind me that it can be a lot of fun and that I need to remember to go into the office more when I feel isolated.&lt;br /&gt;&lt;br /&gt;Finally, as I head back to my old job, I realize that the reasons I left it are still there.  However, after spending a year studying myself and other companies, I'm am in a much better position to adapt so that those things will no longer bother me.  Right now I just want to be appreciative of the great gifts that God has given me.  I'll worry about the other things later :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-116897381032574235?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/116897381032574235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=116897381032574235' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/116897381032574235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/116897381032574235'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2007/01/ch-ch-ch-changes.html' title='Ch-ch-ch changes'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-116732729293279535</id><published>2006-12-28T09:25:00.000-08:00</published><updated>2006-12-28T09:34:52.933-08:00</updated><title type='text'>Similar Characters</title><content type='html'>I try to keep track of people who are similar to me: past, present, and fiction.  I have three, currently, that I believe fit the bill.&lt;br /&gt;&lt;br /&gt;1) House - I've blogged on this before, but Greg House from the TV show House is very similar to what I am like.  I think he has let his pride control him more than I have and that accounts for a few differences.  But, on the whole, we are very similar.&lt;br /&gt;2) Isaac Newton - We have similar interests, religious beliefs, and personalities.  He, of course, was far more brilliant that I ever could be, but we are very similar in our pursuits.&lt;br /&gt;3) Brad Paisley - Yeah, the country singer.  It's uncanny how many ideas in common we've had.  In fact, before they released his "Two people fell in love song", I commented to my wife that everything that has ever been was because two people had sex.  Mine was more crass, but that's beside the point.  When my wife heard it on the radio, she immediately came to find me and show me my idea had become a song.  It was funny.  I still say he has spies that watch me...I need to go now...I have to elude them!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-116732729293279535?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/116732729293279535/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=116732729293279535' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/116732729293279535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/116732729293279535'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2006/12/similar-characters.html' title='Similar Characters'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-116413069808795543</id><published>2006-11-21T09:34:00.000-08:00</published><updated>2006-11-21T09:38:18.103-08:00</updated><title type='text'>Aliens</title><content type='html'>I watched a history channel special the other night on UFOs.  It had some interesting interviews on it.  One thing that was eye opening was the replay of a nasa astronaut saying over the radio that he was looking at the alien spaceship out of his window.  He said it very matter-of-factly and very clearly.  He was neither surprised nor concerned.  I have no problem believing in aliens.  However, the Roswell stuff is a bit far fetched.  How is it that the aliens can fly billions of miles across the universe and then crash in New Mexico?  Doesn't make a whole lot of sense to me.&lt;br /&gt;&lt;br /&gt;However, I propose the following.  I think the next candidate for president of the United States should run on a platform of revealing all government knowledge of UFOs.  I'd vote for that person, I think it'd be cool to know.  What about you?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-116413069808795543?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/116413069808795543/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=116413069808795543' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/116413069808795543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/116413069808795543'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2006/11/aliens.html' title='Aliens'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-116404663175690323</id><published>2006-11-20T09:56:00.000-08:00</published><updated>2006-11-20T10:17:31.896-08:00</updated><title type='text'>Unfair Infinities</title><content type='html'>We all know that the cardinality of the set of all integers is &lt;a href="http://mathworld.wolfram.com/CountablyInfinite.html"&gt;countably infinite&lt;/a&gt;.  To me, it seems unfair that the cardinality of the set of real numbers is &lt;a href="http://mathworld.wolfram.com/Aleph-1.html"&gt;uncoutably infinite&lt;/a&gt;.  It also seems odd that it  is unintuitive to most (including me).  However, I now understand why it was unintuitive to me.  The key point to remember is that mathematicians don't allow integers to have an infinite number of digits.  Instead, you can increase the integer by 1, but at any given time it has a fixed number of digits.  However, with real numbers, there can, and often does, exist an infinity of digits.  For instance, 1/3 is 0.333333....  So, not only do the real numbers extend countably to infinity, they also can have an infinite number of digits.  In essence, they are infinite in 2 dimensions, whereas integers are only infinite in 1 dimension.  I would imagine that complex numbers will one day be proven to be infinite in 3 dimensions, but who knows.&lt;br /&gt;&lt;br /&gt;To be honest, I think it is a bit silly.  We're not actually talking about different orders of infinities here, we're only talking about the existence of a function M that will map from one infinite set to another.  If we can find that function, then we say the sets have an equivalent cardinality.  Otherwise, the cardinality of one set is said to be greater than the cardinality of the other.  If we could extract M from mathematics, and instead use an algorithm, then M could simply be, pick a real number, get next biggest integer, rinse, repeat.  However, algorithms are not yet mathematical (unless you're &lt;a href="http://www.wolframscience.com/"&gt;Stephen Wolfram&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-116404663175690323?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/116404663175690323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=116404663175690323' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/116404663175690323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/116404663175690323'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2006/11/unfair-infinities.html' title='Unfair Infinities'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-116053173067238857</id><published>2006-10-10T18:20:00.000-07:00</published><updated>2006-10-10T18:55:30.730-07:00</updated><title type='text'>Readable Code</title><content type='html'>I think, to structure your code readably, you have to partition your code into different levels.  Perhaps the different levels are written in different languages, perhaps not.  The top level is the business level.  At this level, you should be speaking a mostly declarative language and should be side effect free.  Your code should be straightline.  The second level is the logical level.  At this level, you can have conditions and iterations and anything in the first level.  The third level allows anything in the second level plus side effects.  Finally, the fourth level allows comparative and arithmetic operations plus anything in the third level.  The interesting thing to note, I believe, is that side effects are more readable than comparative and arithmetic code.  Of course, it could be that comparative and arithmetic code is less useful than side effect code, so it is pushed to a lower level.&lt;br /&gt;&lt;br /&gt;Let's look at an example:&lt;br /&gt;&lt;br /&gt;extern int debug;&lt;br /&gt;&lt;br /&gt;void foo()&lt;br /&gt;{&lt;br /&gt;  int i;&lt;br /&gt;  for(i = 0; i &lt; 100; ++i)&lt;br /&gt;  {&lt;br /&gt;    if(debug)&lt;br /&gt;    {&lt;br /&gt;      printf("%d\n", i);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;This is a level 4 function.  It has side effects, comparisons, etc...  Let's try to turn it into a full 4-tiered function (yes, you wouldn't do that to something like this, but just for example.)&lt;br /&gt;&lt;br /&gt;// level 1 - straightline&lt;br /&gt;void foo()&lt;br /&gt;{&lt;br /&gt;  print_numbers_to(100);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//level 2 - conditions&lt;br /&gt;void print_numbers_to(int count)&lt;br /&gt;{&lt;br /&gt;  if (in_debug())&lt;br /&gt;    loop_to(count, print_integer);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// level 3 - side effects&lt;br /&gt;void print_integer(int i)&lt;br /&gt;{&lt;br /&gt;  printf("%d\n", i);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// level 4 - comparisons&lt;br /&gt;int in_debug()&lt;br /&gt;{&lt;br /&gt;  return debug == 1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// level 4 - side effects&lt;br /&gt;void loop_to(int count, void (*func)(int))&lt;br /&gt;{&lt;br /&gt;  int i;&lt;br /&gt;  for(i = 0; i &lt; count; ++i)&lt;br /&gt;  {&lt;br /&gt;    func(i);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;See how much better that is?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-116053173067238857?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/116053173067238857/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=116053173067238857' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/116053173067238857'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/116053173067238857'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2006/10/readable-code.html' title='Readable Code'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-115807045772559862</id><published>2006-09-12T07:11:00.000-07:00</published><updated>2006-09-12T07:14:17.726-07:00</updated><title type='text'>Responses</title><content type='html'>I put some responses in with comments.  However, I would like to say that I was imprecise in a previous statement...it's a habit of mine.  My statement should not have been that deficit spending causes war.  Cos is entirely correct that war causes deficit spending, not the other way around.  You can check the comments for the full scoop, but I was attempting to say that the ability to deficit spend leads to war.  If you can't fund the war, you won't have the war (or you won't be successful at it).  If you have easy access to funds, then you can easily create a war machine.  If not, it is much harder.  It is not deficit spending, but the ability to deficit spend.  Check the comments ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-115807045772559862?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/115807045772559862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=115807045772559862' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/115807045772559862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/115807045772559862'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2006/09/responses.html' title='Responses'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-115806639190547112</id><published>2006-09-12T05:58:00.000-07:00</published><updated>2006-09-12T06:06:31.906-07:00</updated><title type='text'>Response 3</title><content type='html'>Now, I'd like to respond to a few things I agree with from Cos's reply&lt;br /&gt;&lt;br /&gt;1. I really like the idea of the states paying the Senator's salaries.  This further reduces the federal stranglehold on our country.  That is just pure brilliance!&lt;br /&gt;&lt;br /&gt;2. My hope is that people who have a concern for our country would want to be electors.  However, now that you mention it, I wouldn't be surprised if party-liners didn't run for electors just to be paid back at a later date by the party nominating them for an office position.  I really don't want to enable a lot of restrictions, because that doesn't lead to a naturally balancing system.  For instance, we could say that electors can never be publicly elected, but that is just silly in the long run.  My hope is that the more educated, politically motivated people would become electors...however that is naive.&lt;br /&gt;&lt;br /&gt;Nevertheless, what I realistically expect to happen is that entitlement spending drops dramatically, and socialistic programs begin to decline.  When the voters don't elect you based on the entitlements you give them, you no longer give entitlements.  Obviously, an elector could run on a platform of entitlements, but it doesn't really help him.  He's not getting a huge salary and a plush office for life, so why does he care.  His sole purpose is to do what is right for the country, because it is right, not because he's getting compensated.  It could be a naive position, and I know it will eventually be corrupted, but I'm hoping that won't be for a number of years, when the system is stable enough to support a number of years of corruption before being reset again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-115806639190547112?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/115806639190547112/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=115806639190547112' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/115806639190547112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/115806639190547112'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2006/09/response-3.html' title='Response 3'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-115806572948070900</id><published>2006-09-12T05:33:00.000-07:00</published><updated>2006-09-12T05:55:29.553-07:00</updated><title type='text'>Response 2</title><content type='html'>I'd like to respond to a portion of a very well thought out comment from Cosbert Callis:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;3) Frankly neither suggestion of the barter system or the gold standard, nor the idea of eliminating the Fed represents an understanding of economics 101.&lt;br /&gt;(as a fiscal conservative, with a BA in Political Science and a Minor in Economics, you would have failed any econ class I was in with these ideas..)&lt;br /&gt;&lt;br /&gt;Foreign trade (including deficit spending, which is a form of foreign trade) represents one of the most important natural forces for peace in the world. People just do not make WAR with trading partners. I don't where your original thought inevitably leads to war and inflation. comes from, there is NO, ZERO, NADA in the way of empirical evidence to suggest there is a single iota of truth in that statement.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;First, deficit spending is not always a form of foreign trade.  Deficits can come in many forms.  First, you can sell bonds to your own country.  Second, you can have the Fed print more money, thus causing inflation, but giving you the money you requested.  Third, you can sell bonds to other countries.  I would only classify the last as deficit spending.&lt;br /&gt;&lt;br /&gt;Second, deficit spending MOST DEFINITELY causes war.  You would have failed any history class I took with your ideas.  War's have to be funded in some way.  Without funding, you can't fight.  There are many ways to get funding, but the easiest is through deficit spending.  Do you think the war in Iraq would have happened if we would have had to raise taxes to pay for it?  People understand taxes: they understand the effect that taxes have on their pocketbooks.  With deficit spending, they don't understand the correlations and are less likely to complain.  Therefore, deficit spending is VITAL in starting and maintaining a war machine.  Without easily obtainable money, there are far fewer wars.&lt;br /&gt;&lt;br /&gt;Third, we didn't always have a national bank.  The current Federal Reserve system was established in 1913.  Notice that it DIDN'T provide economic stability, as was its mandate.  We still went through booms and busts (including the great depression).  Before 1913, we had a myriad of different banking styles, including no central bank from 1837 to 1862.  Do I think we need banking regulations?  Sure.  Do we need a central bank?  No.&lt;br /&gt;&lt;br /&gt;Fourth, a return to the gold standard is independent of the federal reserve system.  The Gold standard was not revoked until 1971, almost 60 years after the establishment of the federal reserve.  The goal of the gold standard is to reduce inflation.  I would say that it did it's job pretty well considering the amount of inflation that has happened between 1971 and today.&lt;br /&gt;&lt;br /&gt;Finally, trading partners most definitely go to war.  The US traded with Iraq (oil and weaponry).  Iraq traded with Kuwait.  The US invested in Germany before WWII.  The examples go on and on.  In a global economy, there is more than one way to get at any resource, so it becomes much easier to bite the hand that feeds you.  But, it becomes much harder to bite if you have no teeth.  By eliminating easy access to money (via deficit spending through the Fed), we can take out a few rows of teeth.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-115806572948070900?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/115806572948070900/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=115806572948070900' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/115806572948070900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/115806572948070900'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2006/09/response-2.html' title='Response 2'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-115774486508786913</id><published>2006-09-08T12:46:00.000-07:00</published><updated>2006-09-08T12:47:45.130-07:00</updated><title type='text'>Fanatics</title><content type='html'>I love this quote from Ron Jeffries.  I found it on &lt;a href="http://forum.agilesoftwaredevelopment.org/viewthread.php?tid=40"&gt;a thread in his Agile Forum&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;strong&gt;A fanatic is anyone who believes differently from us, and just as strongly.&lt;/strong&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-115774486508786913?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/115774486508786913/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=115774486508786913' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/115774486508786913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/115774486508786913'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2006/09/fanatics.html' title='Fanatics'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-115768515289237905</id><published>2006-09-07T20:00:00.000-07:00</published><updated>2006-09-07T20:12:32.906-07:00</updated><title type='text'>Response</title><content type='html'>Mark made a very intelligent comment on my previous post and I'd like to respond to a few of his points.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;1. Repeal the 17th amendment:&lt;br /&gt;This sounds good on paper, but what guarantees that the state congress isn't going to simply choose their Senator soley on party lines for just the possibility of future political favors? Even the lowest of state politicians harbors hopes of being president.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I &lt;i&gt;want&lt;/i&gt; the state congress to choose their Senator for future political favors.  The point is that the people do what is in their best interest, but the state politicians will do what is in their best interest.  What is in their best interest is greater state powers.  The people's interest is different.  If a Senator lessens the state powers, then the state will not vote him back in.  Therefore, the Senator &lt;i&gt;must&lt;/i&gt; pander to the state in order to be re-elected.  Why is that important?  Because state's don't care about gay rights, flag burning, and national health care.  State's care about schools and roads and infrastructure.  All of the stupidity that is pure popular pandering goes away.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;2. I like the idea of taking away the presidential election from the idiot masses who decide solely on superficial traits of candidates ("He's a normal guy who I think I could have a beer with." Who the hell wants to have an average person in the most powerful position in the world??). Anyway, I digress. The problem with this is that you're assuming that the electoral college will be composed of people who are more intelligent than the masses as well as unaffiliated with any political party. That's a tough thing to find I suspect.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I do believe that the electorial college will be slightly more educated than the typical voter, but that's not the main benefit.  The main benefit is that the electorial college has no constituents.  They don't get paid, they shouldn't get bribes (having fewer people will allow more scrutiny on their financial affairs), and they have no real reason to want to get re-elected.  Therefore, they won't pick a president because he promises more welfare or free healthcare.  People pick a president because he promises entitlements or "No new taxes" or whatever.  They vote in what they think is their best interest (unfortunately, they don't understand the consequences).  The electorial college could safely ignore those issues and pick a president based on what is best for the country.  Since they don't care about re-election, they are free to make more intelligent choices.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;3. Let's go back to the barter system. Most politicians really have nothing to offer other than words, so that should sufficiently weaken the ever-growing hegemony those in power represent. :-) &lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I believe a return to the gold standard is very similar to going back to a barter system.  By preventing the devaluation of the dollar because of deficit spending, we can force politicians to tax us explicitly instead of through inflation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-115768515289237905?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/115768515289237905/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=115768515289237905' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/115768515289237905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/115768515289237905'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2006/09/response.html' title='Response'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-115763949180032228</id><published>2006-09-07T07:13:00.000-07:00</published><updated>2006-09-07T07:31:31.913-07:00</updated><title type='text'>Waiting on the World to Change</title><content type='html'>I really like John Mayer.  Especially his new song.  However, I have to disagree with his approach.  First, the song:&lt;br /&gt;&lt;br /&gt;me and all my friends&lt;br /&gt;we're all misunderstood&lt;br /&gt;they say we stand for nothing and&lt;br /&gt;there's no way we ever could&lt;br /&gt;now we see everything that's going wrong&lt;br /&gt;with the world and those who lead it&lt;br /&gt;we just feel like we don't have the means&lt;br /&gt;to rise above and beat it&lt;br /&gt;&lt;br /&gt;so we keep waiting&lt;br /&gt;waiting on the world to change&lt;br /&gt;we keep on waiting&lt;br /&gt;waiting on the world to change&lt;br /&gt;&lt;br /&gt;it's hard to beat the system&lt;br /&gt;when we're standing at a distance&lt;br /&gt;so we keep waiting&lt;br /&gt;waiting on the world to change&lt;br /&gt;now if we had the power&lt;br /&gt;to bring our neighbors home from war&lt;br /&gt;they would have never missed a Christmas&lt;br /&gt;no more ribbons on their door&lt;br /&gt;and when you trust your television&lt;br /&gt;what you get is what you got&lt;br /&gt;cause when they own the information, oh&lt;br /&gt;they can bend it all they want&lt;br /&gt;&lt;br /&gt;that's why we're waiting&lt;br /&gt;waiting on the world to change&lt;br /&gt;we keep on waiting&lt;br /&gt;waiting on the world to change&lt;br /&gt;&lt;br /&gt;it's not that we don't care,&lt;br /&gt;we just know that the fight ain't fair&lt;br /&gt;so we keep on waiting&lt;br /&gt;waiting on the world to change&lt;br /&gt;&lt;br /&gt;and we're still waiting&lt;br /&gt;waiting on the world to change&lt;br /&gt;we keep on waiting waiting on the world to change&lt;br /&gt;one day our generation&lt;br /&gt;is gonna rule the population&lt;br /&gt;so we keep on waiting&lt;br /&gt;waiting on the world to change&lt;br /&gt;&lt;br /&gt;we keep on waiting&lt;br /&gt;waiting on the world to change&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now, the analysis&lt;br /&gt;The sentiments are good, but he misunderstands a fundamental part of human nature.  The elite that are corrupting our society now will hand their corruption to their chosen successors.  Just because those successors are from our generation doesn't mean they will be any less corrupt.  They will continue to attempt to plunge us into a feudalistic society with them at the helm.  The fact that we're "waiting" just makes them smile broader.  They know we're powerless to stop them so they're taking full advantage of it.  Our freedoms have been tromped upon.  Our civil liberties abolished.  We have our own version of the SS (we call it Homeland Security - anyone notice how these guys go after child porn?  No one complains because we all know child porn is bad, but how is that homeland security?  It's not.  It's the start of our own version of the secret police.)  Why will our generation act any differently?  The fringe, artistic types such as John Mayer have never supported war or abdication of civil liberties; however, their generations didn't set things right.  Why does John think his will?  He's completely wrong.  Instead, he's promoting the attitude that suits the would-be dictator's perfectly.  He's sitting back and watching it all happen.  Eventually, it will be too late to stop it.&lt;br /&gt;&lt;br /&gt;What can we do to stop it?  We have to take away their power base.  Of course, we can't rely on them to do it, because they like their power base.  Instead, we have to use the one constitutional outlet that they haven't taken away.  We need a 2/3 majority of the states to support certain constitutional amendments.&lt;br /&gt;&lt;br /&gt;I propose three amendments that should erode the power base of those in charge.&lt;br /&gt;1. Repeal the 17th amendment.  This amendment took away states rights and consolidated power to the federal government by moving the election of the senators to the people.  Previously, the states chose the senators that represented them.  This made it far less likely that a media campaign could buy an election.  It also ensured that the person would actually support the state instead of what made them electable.  Now, it is all too easy to support a law because it is "popular".  Since you only answer to the people, that is all that matters.  The Senate is no more than a balanced House of Representatives.  Instead, it is supposed to represent the states.  Senators would have a much harder time revoking states rights if they had to answer to the state congress.&lt;br /&gt;2. Make the party nomination of presidential candidates AFTER the election of the electorial college.  Furthermore, electors should not be allowed to express allegiance to a political party.  Currently, the population, not the electorial college, elects the president.  This is NOT how it was designed to work.  The writers of the consititution knew that the general population is too stupid to choose the correct presidential candidate.  Therefore, the general population should choose a bunch of smart people, who choose the president.  This has been lost on today's generation.  We have to bring back that purpose.  The popular vote for a president should never be taken.&lt;br /&gt;3. We must erode their monetary control of our society.  The last amendment should abolish the federal reserve and return us to a gold standard.  For the reasoning behind this, I would recommend Griffin's &lt;a href="http://www.realityzone.com/creature.html"&gt;The Creature from Jekyll Island&lt;/a&gt;.  It is a very informative (and very large) book about the history of the federal reserve, fiat money, and fractional reserve banking.  It shows how control of the money system directly leads to a controlling, manipulative, feudalistic government.&lt;br /&gt;&lt;br /&gt;We have to stop waiting on the world to change and use what power we have as a people to ensure our future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-115763949180032228?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/115763949180032228/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=115763949180032228' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/115763949180032228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/115763949180032228'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2006/09/waiting-on-world-to-change.html' title='Waiting on the World to Change'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-115724490320551707</id><published>2006-09-02T17:49:00.000-07:00</published><updated>2006-09-02T17:55:03.220-07:00</updated><title type='text'>Cultural Progression</title><content type='html'>How do we, as a culture, define our differences with previous cultures.  Do we define it by our use of technology?  I don't think we can.  There are cultures that have advanced technology, yet have similar cultures to their ancestors who didn't have such technology.  I think we have to find something that shows &lt;i&gt;motion&lt;/i&gt;, not advancement.  To that end, I propose we use music.  It appears to me, that music is the definition of culture.  In other words, by sharing music, you share your culture.  By blending music, you blend your culture.  Furthermore, music is always changing and adapting.  It blends the past into something completely new and unexpected.  Music seems to define our progression.  Music defines our culture.  Explore that concept and let me know what you think.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-115724490320551707?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/115724490320551707/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=115724490320551707' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/115724490320551707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/115724490320551707'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2006/09/cultural-progression.html' title='Cultural Progression'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-115543419640212446</id><published>2006-08-12T18:31:00.000-07:00</published><updated>2006-08-12T18:56:36.593-07:00</updated><title type='text'>Generics</title><content type='html'>Boo doesn't have generics.  This makes me sad.  Since I want a strongly typed matching solution, I _really_ want generics.  I also want macros.  ARRRRRGGGGG!  Why won't people give me EVERYTHING.  One option is to use arrays instead of lists.  Another option is to add generics to the language.  I think I'll start with the first and then migrate to the second.  That should be sufficient for my needs.&lt;br /&gt;&lt;br /&gt;Ok, now on to the O/R mapping.&lt;br /&gt;&lt;br /&gt;First, since this is all about types, we're going to add the type information for (most) things in the database.  Why, you ask?  Shouldn't we know if it is a FirstName or a LastName because we have knowledge of the table?  Yes, that is correct, but you're thinking too simplistically.  In true OO fashion, FirstName and LastName will be nothing more than base classes.  We will end up with an AsianFirstName, AngloFirstName, HispanicFirstName, etc...  The same is true for last names.  Then, when we consult our statistics, we'll be able to use statistics based on the frequency of the name within its ethnic culture (and also within the geographic location).  Therefore, we want to be able to generate and store this extra type information.  In addition, we'll want to use the type information when comparing names with the matching engine.  We might use a completely different function when comparing a HispanicFirstName to an AngloFirstName as we would a HispanicFirstName to an AsianFirstName (auto-reject, anyone?).  By emploring multi-method dispatch on the type information, we can quickly choose the right matching logic.&lt;br /&gt;&lt;br /&gt;But enough skipping ahead, back to the O/R mapping.&lt;br /&gt;&lt;br /&gt;Obviously, each Element will be stored in its own field.  It will have an associated type information field.  It may also have a pointer into a metadata table.  I'm not sure on that one yet, we'll have to see what sort of metadata we will keep that is outside of the type system.&lt;br /&gt;&lt;br /&gt;An entity becomes a little more complicated.  Remember that an Entity is a collection of other entities, groups, and elements.&lt;br /&gt;&lt;br /&gt;Let's look at two different Entities:&lt;br /&gt;&lt;br /&gt;class Name(Entity):&lt;br /&gt;  first_name as FirstName&lt;br /&gt;  last_name as LastName&lt;br /&gt;  middle_initial as Nullable(MiddleInitial)&lt;br /&gt;  name_suffix as Nullable(NameSuffix)&lt;br /&gt;&lt;br /&gt;Wow, what's that Nullable thing?  Well, the type system should include whether or not the field can be blank, and Nullable is just as good a choice as any.  I'm really starting to want to do this project in O'Caml.  I'm getting very close to breaking open the docs on &lt;a href="http://research.microsoft.com/fsharp/fsharp.aspx"&gt;F#&lt;/a&gt;.  Of course, now that I think about it, C# might be a good choice.  I wouldn't need to modify the parser if I had introspection, which C# gives you.  Plus it is strongly typed and has generics...hmmm...I had forgotten introspection...drat!&lt;br /&gt;&lt;br /&gt;Ok, back to the task at hand.&lt;br /&gt;&lt;br /&gt;In most cases, the Name entity will have a Name table.  Each element within the entity will correspond to a field in the table.  There will also be the associated type field (and perhaps metadata fields).  Each record in the table will also have a unique, primary key.&lt;br /&gt;&lt;br /&gt;That was easy...&lt;br /&gt;&lt;br /&gt;Now, for a more complicated example:&lt;br /&gt;&lt;br /&gt;class Person(Entity):&lt;br /&gt;  name as Name&lt;br /&gt;  address as Address&lt;br /&gt;  ssn as Nullable(SSN)&lt;br /&gt;  birthday as Nullable(Date)&lt;br /&gt;&lt;br /&gt;For a person we will have a unique primary key, but we will also store the primary key of both the name and address information.  The ssn and birthday elements will be stored "in-line" like the name elements were in the previous example.&lt;br /&gt;&lt;br /&gt;Of course, we might want to force denormalization of the table...we could try something like&lt;br /&gt;&lt;br /&gt;class Person(Entity):&lt;br /&gt;  [inline]&lt;br /&gt;  name as Name&lt;br /&gt;  address as Address&lt;br /&gt;  ...&lt;br /&gt;&lt;br /&gt;Now, name has an inline attribute and will not go in a separate table.  Instead, the name fields will be placed in the Person table.  However, when we extract the Person object from the table, we'll extract a Name object as well, so you can't tell the difference from the user side.&lt;br /&gt;&lt;br /&gt;I'm hesitant to allow an [inline] attribute, because you get to the same point as with C++ and its inline modifier.  The compiler can't inline without you telling it, so you're forced to make decisions that the compiler should be able to make.  Therefore, if we have an [inline] modifier it will be more like "auto" in C++, a hint but the compiler can do what it wishes with regards to inlining.  Hopefully, it's usage will vanish just like auto's.&lt;br /&gt;&lt;br /&gt;Ok, next time we'll look at the O/R mapping of groups.  I'm still not using the mailing list from SF because I sent things to it that I never got back, so I'm waiting until I have a successful test run before I move there for good.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-115543419640212446?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/115543419640212446/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=115543419640212446' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/115543419640212446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/115543419640212446'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2006/08/generics.html' title='Generics'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-115539535414992016</id><published>2006-08-12T08:06:00.000-07:00</published><updated>2006-08-12T08:09:14.166-07:00</updated><title type='text'>Sourceforge Site Available</title><content type='html'>You can now go to &lt;a href="http://www.sourceforge.net/projects/see-stars"&gt;The STARS Sourceforge Site&lt;/a&gt; and sign up on the &lt;a href="http://sourceforge.net/mail/?group_id=174758"&gt;see-stars-devl mailing list&lt;/a&gt;.  I hope to make most of the technical discussions through that list so that they will be archived and open for discussion.  I will also post previous blog entries to the mailing list for historical purposes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-115539535414992016?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/115539535414992016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=115539535414992016' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/115539535414992016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/115539535414992016'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2006/08/sourceforge-site-available.html' title='Sourceforge Site Available'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-115530554279093839</id><published>2006-08-11T07:02:00.000-07:00</published><updated>2006-08-11T07:12:22.833-07:00</updated><title type='text'>SourceForge site</title><content type='html'>http://see-stars.sourceforge.net will be the sourceforge site.  It has been created and I am in the process of getting someone to set it up ;-)&lt;br /&gt;&lt;br /&gt;Secondly, I'd like to discuss how the type system will interact with the database.  First, I said that we're going to be strongly typed.  This is not just fancy terminology, this will affect how the database is structured.  For instance, we might want to subdivide names for etnicities.  John Doe might get the standard US ethnicity, but Wing Fe might get an asian ethnicity.  This can be represented by using subtypes.  Therefore, this type information must be stored in the database for fast access.  In addition, we might have types for strongly cohesive groups, loosely cohesive groups, etc... (perhaps even a composite group that composes multiple strongly cohesive groups so you can see the heirarchy).&lt;br /&gt;&lt;br /&gt;But wait!  You say.  If we're only doing updates then it won't take too long to create all this information, but our initial database population will take FOREVER!  People will get tired of waiting!  To that, I say, you're absolutely right.  That is another beauty of callbacks.  We're not going to do it for the initial population.  Instead, we're going to use reasonable defaults, but we're going to allow for processes to &lt;span style="font-style:italic;"&gt;continually improve&lt;/span&gt; the data.  I think consumers expect this.  They want their data fast, but they also want it right.  They hope that over time their data gets better.  To ensure that, we'll have reasonable defaults (so, they won't get the Asian/American matching function, they'll get the statistically based one), but when we correct that decision later, we'll let them know through the callbacks.  So, they can make their business decisions quickly and then revise them when the situation merits it.&lt;br /&gt;&lt;br /&gt;Of course, if they want to wait around, they definitely can, but we need to be &lt;span style="font-style:italic;"&gt;adaptive and fast and continuously improving!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-115530554279093839?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/115530554279093839/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=115530554279093839' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/115530554279093839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/115530554279093839'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2006/08/sourceforge-site.html' title='SourceForge site'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-115527051113536740</id><published>2006-08-10T21:22:00.000-07:00</published><updated>2006-08-10T21:28:31.160-07:00</updated><title type='text'>Two quick things</title><content type='html'>1. All operations must be &lt;a href="http://dictionary.reference.com/search?db=dictionary&amp;q=idempotent"&gt;idempotent&lt;/a&gt;.  I'm not sure (yet) how to enforce that...it may just be a &lt;em&gt;really&lt;/em&gt; strong suggestion.&lt;br /&gt;&lt;br /&gt;2. Versioning will be a big part of the system.  We need to be able to add fields to an entity and remove fields from and entity, inline an entity (more on that later) and extract an entity.  I'm sure there are a number of "refactoring" tools that come from this, but I want them FIRST, not "when there is time."  For instance, if I want to add a Title to a Name, then that needs to be as easy as adding title as Title to the Name class and running an upgrade program with an optional map function to create the title given the name (the map could set them all to a default (blank) title or it could try to guess a title of Mr or Mrs based on a derived gender).&lt;br /&gt;&lt;br /&gt;Right now, I know I want automated upgrades when I&lt;br /&gt;a) add a field&lt;br /&gt;b) remove a field&lt;br /&gt;c) inline an entity&lt;br /&gt;d) extract an entity&lt;br /&gt;e) add/change the validation method&lt;br /&gt;f) add/change the normalization method&lt;br /&gt;g) add an implied attribute&lt;br /&gt;&lt;br /&gt;Also, we better darn well be able to downgrade!!!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-115527051113536740?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/115527051113536740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=115527051113536740' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/115527051113536740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/115527051113536740'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2006/08/two-quick-things.html' title='Two quick things'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-115526118808479011</id><published>2006-08-10T18:37:00.000-07:00</published><updated>2006-08-10T18:53:31.533-07:00</updated><title type='text'>Creation</title><content type='html'>Now that we can define the objects (though not rigourously, that's coming later), we need to know how to create them.  Obviously, object creation could possibly mean invoking the database for lookups and the like, so it needs to be well abstracted.  In this case, we'll use the abstract factory pattern to create factory objects which will create our entities.  For example, if you define the following entity:&lt;br /&gt;&lt;br /&gt;class PersonAtAddress(Entity):&lt;br /&gt;  name as Name&lt;br /&gt;  ssn as SSN&lt;br /&gt;  birthday as Date&lt;br /&gt;  address as Address&lt;br /&gt;&lt;br /&gt;Then you will end up with the following abstract factory&lt;br /&gt;&lt;br /&gt;class AbstractFactory:&lt;br /&gt;  def getNameFactory:&lt;br /&gt;    ...&lt;br /&gt;  def getAddressFactory:&lt;br /&gt;    ...&lt;br /&gt;  def getPersonAtAddressFactory:&lt;br /&gt;    ...&lt;br /&gt;&lt;br /&gt;class PersonAtAddressFactory:&lt;br /&gt;  def Create(name_key as Name.ID, ssn as SSN, birthday as Date, addr_key as Address.ID):&lt;br /&gt;    ...&lt;br /&gt;&lt;br /&gt;Now, we have a consistent, programmatic way to create entities.  We can wrap these calls in CORBA or SOAP or whatever, but the foundation is solid.&lt;br /&gt;&lt;br /&gt;Next time, we'll start looking at how the objects map to a relational database.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-115526118808479011?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/115526118808479011/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=115526118808479011' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/115526118808479011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/115526118808479011'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2006/08/creation.html' title='Creation'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-115518581554762678</id><published>2006-08-09T21:50:00.000-07:00</published><updated>2006-08-09T21:56:55.573-07:00</updated><title type='text'>Two Things</title><content type='html'>I'm pretty sure of two things at this point. First, the name of the system will be the Staticly Typed Advanced Recognition System (STARS). I hope to get a sourceforge site for it up soon.&lt;br /&gt;&lt;br /&gt;Second, the system will be written primarily in &lt;a href="http://boo.codehaus.org"&gt;Boo&lt;/a&gt; and run on mono.  Boo has all the right things for this project.&lt;br /&gt;&lt;br /&gt;1. Strongly Typed&lt;br /&gt;2. Type Inference&lt;br /&gt;3. Macros&lt;br /&gt;4. User defined compile steps (this will be very useful when creating the database schema from the source files).&lt;br /&gt;5. .NET/Mono compatible - at some point people will want to run their own code, there is a likelihood that the code will be .NET.&lt;br /&gt;6. Clean syntax - based around python (I prefer Ruby, but...)&lt;br /&gt;7. Duck typing&lt;br /&gt;8. Multi-thread capable&lt;br /&gt;9. Functional + Object Oriented&lt;br /&gt;&lt;br /&gt;As soon as I get the SF project up, I'll post a link to it here.  I'd like to write the specifications in the project's mailing list.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-115518581554762678?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/115518581554762678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=115518581554762678' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/115518581554762678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/115518581554762678'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2006/08/two-things.html' title='Two Things'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-115518000900645215</id><published>2006-08-09T20:05:00.000-07:00</published><updated>2006-08-09T20:20:09.026-07:00</updated><title type='text'>Callbacks</title><content type='html'>Callbacks are the key to a good recognition system.  A typical batch recognition system forgets about the importance of letting consumers know as soon as information is available.  However, this is the lynchpin to a good recognition system.&lt;br /&gt;&lt;br /&gt;Let's assume that a typical use case is the following:&lt;br /&gt;&lt;br /&gt;1. Run a large file through the system to create a repository&lt;br /&gt;2. Run the files through the repository to ensure correct linkage&lt;br /&gt;3. Rinse and repeate monthly&lt;br /&gt;&lt;br /&gt;You have to run the file through twice because you don't know what might happen later in the system to change one of your records.  This is because the system is not set up to tell you about events.&lt;br /&gt;&lt;br /&gt;If, instead, we allowed the sytem to tell you about important things that are happening, you would be able to complete your run in one pass.  So, what needs events.  Well, first let's say that we'll use a publish/subscribe mechanism so that only those events that we're interested in will be delivered to us.  Second, let's say make the rule that anything that could have an impact on the end result should have an event fired.  That means that any time an Entity or Group is created or deleted as well as any time an Entity is moved from one Group to another.  I would say that Element updates should be allowed to have events, but not forced to.  It could be that updating the salary field doesn't affect anything and you don't need that information to be disseminated.&lt;br /&gt;&lt;br /&gt;There are lots of optimizations you can do to make this fast and I don't want to get into those right now, but suffice it to say that the event/callback mechanism can make for an extremely flexible (and efficient!) system.&lt;br /&gt;&lt;br /&gt;Obviously, the code for the callback won't be in the same file as the code defining the entities.  However, we may want to augment the event with some information at event generation time; therefore, we allow the override of the OnX methods (where X is something like Consolidation).&lt;br /&gt;&lt;br /&gt;For example:&lt;br /&gt;&lt;br /&gt;class Consumer &lt; Group&lt;br /&gt;  def Consolidation(Group other):&lt;br /&gt;    if ...:&lt;br /&gt;      consolidation_reason = ...&lt;br /&gt;    elseif ...:&lt;br /&gt;      consolidation_reason = ...&lt;br /&gt;&lt;br /&gt;  def OnConslidation(ConsolidationEvent event):&lt;br /&gt;    event.reason = conslidation_reason&lt;br /&gt;&lt;br /&gt;I'm not sure, but you might even be able to suppress events...I don't necessarily like that, but it could come in handy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-115518000900645215?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/115518000900645215/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=115518000900645215' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/115518000900645215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/115518000900645215'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2006/08/callbacks.html' title='Callbacks'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-115517911317333883</id><published>2006-08-09T19:13:00.000-07:00</published><updated>2006-08-09T20:05:13.256-07:00</updated><title type='text'>Adding operations</title><content type='html'>First, for the sake of this post, let's change the syntax a bit.  Instead of saying&lt;br /&gt;&lt;br /&gt;Entity X&lt;br /&gt;&lt;br /&gt;We're going to say&lt;br /&gt;&lt;br /&gt;class X &lt; Entity&lt;br /&gt;&lt;br /&gt;Basic types, like FirstName, will become less basic and will inherit from Element (or in this case, a derivitive: StringElement)&lt;br /&gt;&lt;br /&gt;class FirstName &lt; StringElement&lt;br /&gt;&lt;br /&gt;Groups will go from the generic Group(PersonAtAddress) to&lt;br /&gt;&lt;br /&gt;class PersonAtAddress &lt; Group&lt;br /&gt;&lt;br /&gt;Now, this is not going to be the final syntax, but I want you to think of it as inheritance, because we're going to overload functions.&lt;br /&gt;&lt;br /&gt;For instance, an Element should know how to validate itself.  A simple example might be&lt;br /&gt;&lt;br /&gt;class FirstName &lt; Element&lt;br /&gt;  def validate:&lt;br /&gt;    return representation =~ /[a-zA-Z-]+/&lt;br /&gt;&lt;br /&gt;A more complicated example might make a SOAP call to the validation server defined for that type (we'll see how to do that in a later post).&lt;br /&gt;&lt;br /&gt;Elements also need to know how to normalize themselves.  For instance, a name might wish to be represented in all upper case:&lt;br /&gt;&lt;br /&gt;class FirstName &lt; StringElement&lt;br /&gt;  def normalize:&lt;br /&gt;    representation.upper!&lt;br /&gt;&lt;br /&gt;Another operation you're probably screaming for by now is creation.  In this case, the StringElement does the right thing for you, it sets the internal representation to a passed in value.  However, you might want to do more.  For instance, you might want to keep a map of how often you see each first name to handle statistical based maching.  Therefore, you want&lt;br /&gt;&lt;br /&gt;class FirstName &lt; StringElement&lt;br /&gt;  static Hash seen  # would be @@seen in ruby&lt;br /&gt;  def initialize(String value):&lt;br /&gt;    super(value)&lt;br /&gt;    seen ||= new Hash(0)&lt;br /&gt;    seen[value]++&lt;br /&gt;&lt;br /&gt;Other methods might include update and clear.&lt;br /&gt;&lt;br /&gt;For Entities, we need the following operations:&lt;br /&gt;&lt;br /&gt;initialize - pass in a value for each of the "member variables" and assign them if they are consistent.  Otherwise, throw an exception.&lt;br /&gt;validate - validate the state of an entity&lt;br /&gt;update - update one of the fields of an entity&lt;br /&gt;&lt;br /&gt;Update is the most interesting because we could update one or many of the fields.  I think it might be interesting to use nil for fields we don't want to update, but I'd rather not.  Perhaps a hash?  But I don't want to miss a field on accident, and I'd like it to be "compile-time" checked.  So, we're back to nils.&lt;br /&gt;&lt;br /&gt;class Name &lt; Entity&lt;br /&gt;  FirstName first_name&lt;br /&gt;  MiddleName middle_name&lt;br /&gt;  LastName last_name&lt;br /&gt;  NameSuffix name_suffix&lt;br /&gt;&lt;br /&gt;  def update(FirstName fn,&lt;br /&gt;             MiddleName mn,&lt;br /&gt;             LastName ln,&lt;br /&gt;             NameSuffix ns):&lt;br /&gt;    begin_transaction:&lt;br /&gt;      first_name.update(fn) unless fn.nil?&lt;br /&gt;      middle_name.update(mn) unless mn.nil?&lt;br /&gt;      last_name.update(ln) unless ln.nil?&lt;br /&gt;      name_suffix.update(ns) unless ns.nil?&lt;br /&gt;    rescue =&gt; { rollback } #undo all operations in the transaction (maybe a validate fails?)&lt;br /&gt;&lt;br /&gt;I'm fairly convinced that a transaction is the right way to handle this situation, but I'm not convinced of the syntax, there are definitely other ways to handle it.  For instance, you could have an updater that makes the determination based on the exit strategy of the function.&lt;br /&gt;  FirstName::Updater updater(first_name, fn)&lt;br /&gt;It could also handle the nil? case.  If the function exits normally, the updater commits - otherwise it rollsback.  Regardless, a transaction is needed for exception safety.&lt;br /&gt;&lt;br /&gt;You may also delete an entity.  I imagine that this should return a boolean on whether or not the delete should succeed, but delete's probably shouldn't fail.&lt;br /&gt;&lt;br /&gt;A Group has some additional operations.  Since a group is just a collection of entities, it may have an entity added to it or removed from it.  It addition, it may also have a list merged into it or part of another list sliced into it.&lt;br /&gt;&lt;br /&gt;Let's look at each operation in the abstract:&lt;br /&gt;&lt;br /&gt;Add:&lt;br /&gt;original list -&gt; [A,B,C]   value -&gt; D    new list -&gt; [A,B,C,D]&lt;br /&gt;&lt;br /&gt;Remove:&lt;br /&gt;original list -&gt; [A,B,C]   value -&gt; B    new list -&gt; [A,C]&lt;br /&gt;&lt;br /&gt;Merge:&lt;br /&gt;original list -&gt; [A,B,C]   value -&gt; [D,E,F]  new list -&gt; [A,B,C,D,E,F] new value -&gt; []&lt;br /&gt;&lt;br /&gt;The merge adds all of the elements of the value into the list and deletes them from the value.&lt;br /&gt;&lt;br /&gt;Splice:&lt;br /&gt;original list -&gt; [A,B,C]   value -&gt; [D,E,F], 1, 1  new list -&gt; [A,B,C,E]  new value -&gt; [D,F]&lt;br /&gt;&lt;br /&gt;The splice takes an array and a begin and end offset and adds those elements to the new list while removing them from the old.&lt;br /&gt;&lt;br /&gt;The merge we will call a consolidation and the splice we will refer to as a split.&lt;br /&gt;&lt;br /&gt;An important property of a Group involves it's &lt;em&gt;MetaGroup&lt;/em&gt;.  The MetaGroup is the Set that consists of all the instances of the Group.&lt;br /&gt;&lt;br /&gt;So, let's say we have a Consumer Group.  We want to say that a consumer can not appear in more than one group.  That means that the order of the union of all groups is equivalent to the sum of the order of all groups.  To do this, we say that for every group, it's MetaGroup must be a true Set, and cannot include duplicate entities.&lt;br /&gt;&lt;br /&gt;Now, back to the operations.  Each one of these operations must take place in a transactional environment.  For example, an update can fail because of an implied field mismatch.&lt;br /&gt;&lt;br /&gt;What's an implied field?  A field in a group may be declared strongly or weakly implied.  I'm not sure how this declaration will take place (I hate the .NET attribute syntax).  However, once it is so declared, it will enforce conformance for all the elements in a group.  A weakly implied field will ensure a no conflict match for a field across all the entities in a group.  So, if we say that NameSuffix is weakly implied for the Consumer Group, that means all Consumers in the same Consumer Group must have the same Name Suffix (or a blank one).  A strongly implied field removes the ability for blanks to match.&lt;br /&gt;&lt;br /&gt;Ok, this post has gone on long enough.  In future posts, we'll return to the formal specification of these operations.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-115517911317333883?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/115517911317333883/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=115517911317333883' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/115517911317333883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/115517911317333883'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2006/08/adding-operations.html' title='Adding operations'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-115516055327740809</id><published>2006-08-09T12:40:00.000-07:00</published><updated>2006-08-09T14:55:53.343-07:00</updated><title type='text'>Type safe recognition</title><content type='html'>I believe that recognition (part of Customer Data Integration) can (and should!) be made strongly type safe.  Basic types (in the US) might include FirstName, LastName, SSN, Street, CompositeStreet.  More advanced types would include an Entity (a collection of basic types) and a Group (a collection of entities).&lt;br /&gt;&lt;br /&gt;Notice how this mirrors a programming language.  A basic type would be something like an int or float.  An entity is like an object, and a Group would be a collection of objects (think an array).&lt;br /&gt;&lt;br /&gt;This leads to a few interesting questions.  Let's consider the following:&lt;br /&gt;&lt;br /&gt;Entity Name:&lt;br /&gt;  FirstName first_name&lt;br /&gt;  MiddleName middle_name&lt;br /&gt;  LastName last_name&lt;br /&gt;  NameSuffix name_suffix&lt;br /&gt;&lt;br /&gt;Entity Address:&lt;br /&gt;  CompositeStreet street_line_1&lt;br /&gt;  CompositeStreet street_line_2&lt;br /&gt;  City city&lt;br /&gt;  State state&lt;br /&gt;  Zip zip&lt;br /&gt;&lt;br /&gt;Entity Person:&lt;br /&gt;  Name name&lt;br /&gt;  SSN ssn&lt;br /&gt;  Date birthday&lt;br /&gt;&lt;br /&gt;Entity PersonAtAddress:&lt;br /&gt;  Person person&lt;br /&gt;  Address address&lt;br /&gt;&lt;br /&gt;Entity Consumer: &lt;br /&gt;  Group(PersonAtAddress) occupancies&lt;br /&gt;  SSN preferred_ssn&lt;br /&gt;  Address preferred_address&lt;br /&gt;&lt;br /&gt;At this point, we have types for our recognition system that can be manipulated and understood by both humans and computers.  We can further augment them.  I'll work on describing the augmentation/annotation of the types in the next blog.&lt;br /&gt;&lt;br /&gt;Questions:&lt;br /&gt;&lt;br /&gt;Should an entity be allowed to contain more than one group?&lt;br /&gt;Should an entity be allowed to contain another entity that contains a group?&lt;br /&gt;  For example:&lt;br /&gt;&lt;br /&gt;Entity Household:&lt;br /&gt;  Group(Consumer) members&lt;br /&gt;  Address preferred_address&lt;br /&gt;&lt;br /&gt;More to come!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-115516055327740809?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/115516055327740809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=115516055327740809' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/115516055327740809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/115516055327740809'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2006/08/type-safe-recognition.html' title='Type safe recognition'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-114997069286658833</id><published>2006-06-10T13:14:00.000-07:00</published><updated>2006-06-10T13:18:12.880-07:00</updated><title type='text'>What to do</title><content type='html'>My old job gave me many ideas on how a company should be run.  The second job I took, at the beginning of this year, changed some of those.  Basically, this blog was a running commentary on things I wanted changed at work.  With my current job, I have no complaints.  It makes it hard to write about.  We do code reviews, unit testing and integration testing.  We do some pair programming, when it makes sense.  We have continuous integration and we hire smart people.  We try to do more with less quantity and more quality.  It is, in many respects, an enviable situation.  So, I'm going to start posting more at &lt;a href="http://thoughtsofhe.blogspot.com"&gt;Thoughts of He&lt;/a&gt; and less here, because I don't have a lot to gripe about, anymore.  What a great feeling that is!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-114997069286658833?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/114997069286658833/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=114997069286658833' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/114997069286658833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/114997069286658833'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2006/06/what-to-do.html' title='What to do'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13706479.post-114964733229027859</id><published>2006-06-06T19:14:00.000-07:00</published><updated>2006-06-06T19:28:52.310-07:00</updated><title type='text'>I'm Back!</title><content type='html'>I'm back with all new material!  How cool is that!&lt;br /&gt;&lt;br /&gt;My last employer blocked Blogger, so I stopped posting, since it was a pain to get around the firewall.  However, my new employer is much more lenient in what they allow.&lt;br /&gt;&lt;br /&gt;What have I learned?  What haven't I learned is a better question.  My previous job, which lasted all of 5 months, taught me TIBCO and Java/J2EE.  However, what I really feel like I took from there is the value of logging and some new techniques on how to retain information.  I also learned what management should really be like (and what it shouldn't!).  I learned how to do more with less, and how to prioritize based on ROI instead of a manager's whim.  All in all, it was a very positive experience and I hope we cross paths again someday.&lt;br /&gt;&lt;br /&gt;In my current role, I'm learning how productive one can be when all distractions are taken away.  I'm also learning how to test properly and ensure the software works correctly.  This is also more "mission critical" software, so I'm getting my first exposure to that side of things.&lt;br /&gt;&lt;br /&gt;This employer is also away from my home state, Arkansas, so my family is going through a transition period.  I'm not expecting it to be easy, but I'm sure we'll pull through.&lt;br /&gt;&lt;br /&gt;Until next time!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13706479-114964733229027859?l=blogginman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogginman.blogspot.com/feeds/114964733229027859/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13706479&amp;postID=114964733229027859' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/114964733229027859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13706479/posts/default/114964733229027859'/><link rel='alternate' type='text/html' href='http://blogginman.blogspot.com/2006/06/im-back.html' title='I&apos;m Back!'/><author><name>Tanton</name><uri>http://www.blogger.com/profile/08601404650352658381</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
