<?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-27956652</id><updated>2012-02-16T10:48:22.238-08:00</updated><category term='facebook'/><category term='design'/><category term='marthas'/><category term='UI'/><category term='yelp'/><category term='myspace'/><category term='international'/><category term='data'/><category term='content'/><category term='menus'/><category term='restaurants'/><title type='text'>Jeff Kody's Developer Blog</title><subtitle type='html'>Some of the topics I plan to tackle are architecture and design, coding practices, hiring and interviewing, and emerging technologies. I'll also try to reflect on projects and jobs I've had in the past, and compare and contrast working on opposite coasts.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jephs-blog.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jephs-blog.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jeff</name><uri>http://www.blogger.com/profile/15837962345983733147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://3.bp.blogspot.com/_VUsL3-cGq8k/SPD6-Moc5EI/AAAAAAAAAAU/7D23L72Hohk/S220/me.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>22</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-27956652.post-964722413846592732</id><published>2010-09-03T14:40:00.000-07:00</published><updated>2010-09-03T14:40:16.957-07:00</updated><title type='text'>Crowdsourcing Your Graphic Design Needs</title><content type='html'>Recently, I've found myself leveraging crowdsourcing tools to meet some of my foundational graphic design needs.  Specifically, I have created several (OK, three recently, four overall) contests on &lt;a href="http://99designs.com" target="newwindow"&gt;99 Designs&lt;/a&gt;.  My first foray with the site came &lt;a href="http://jephs-blog.blogspot.com/2008/07/how-to-start-website-for-285380.html" target="newwindow"&gt;about two years ago&lt;/a&gt; when I commissioned the logo for FoodFinder.net.  Back in the spring, I took even more of a leap when I had some web development work done.&lt;br /&gt;&lt;br /&gt;Just today, I awarded winners for two logo contests for upcoming projects.  Since I've now done 4 contests, I figured I'd share some tips I've gleaned from working with the service.  Also, I should mention that I also investigated using &lt;a href="http://www.crowdspring.com/" target="newwindow"&gt;crowdSPRING&lt;/a&gt;, but I decided to stick with 99.  The only reason was that I have always had good luck with 99, and didn't have a compelling reason to change.&lt;br /&gt;&lt;h3&gt;Tips For Running A Design Contest&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Design Contests are a Lot of Work:&lt;/b&gt; Keep this in mind, the process can be draining.  Make sure you don't have too much going on, as you really need to invest in providing ratings and thoughtful feedback.  This last time, I had 2 going at one time, and based on the schedule of &lt;a href="http://www.illumina.com" target="newwindow"&gt;my day job&lt;/a&gt;, I struggled to keep up with feedback.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Be Aware of the Timezone Difference:&lt;/b&gt; 99 Designs boasts a global community of designers, which is great because there are some really talented folks who don't live near you.  Just be prepared for some time lags on revisions, and that not everybody's first language is English.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Provide Feedback Liberally &lt;/b&gt;: You may notice the health indicator for your contest.  This is driven by how much feedback you give.  My first contest did fall out of healthy status early on due to my lack of textual feedback.  Typically, I think a good ratio is about 35% - 40% of entries to feedback.  Often times, a designer will submit 3 of 4 designs at a time, and I'll roll all of my thoughts into one comment.  I've had good luck with that approach.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Don't Discount a Designer Based on One Design:&lt;/b&gt; I've had many first entries that I didn't like at all, but if you're honest (and respectful) and the designer has enough direction, they will often come back with something you'll love.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Be Specific, but Don't Micromanage:&lt;/b&gt; Designers crave direction and feedback, and it's great to see your ideas incorporated as an entry progresses.  That said, the reason I'm doing a contest is because I need their skill and expertise.  Many designers will do whatever you tell them to because they're trying to win a prize.  It's better to say "I'm looking for a typeface that's a bit more professional" is better than "Can you try using Comic Sans 8pt italic".&lt;/li&gt;&lt;li&gt;&lt;b&gt;Be Respectful of People's Time:&lt;/b&gt; I don't ask designers for more than 1 revision unless I feel like it's a legitimate winner, and just needs a few more tweaks.  Also, as soon as I know a design isn't what I'm looking for...I eliminate it&lt;/li&gt;&lt;li&gt;&lt;b&gt;When to Guarantee the Prize:&lt;/b&gt; There are several options you have when setting up a contest - one is to guarantee the prize.  I am very willing to do this, as it will attract more designers.  However, I typically wait until I see 1 or 2 entries that I'm sure I will be happy with.  For me, this usually takes about 3 to 4 days.  I also go with a blind contests...I think designers prefer not to have their ideas leveraged in other designs.&lt;/li&gt;&lt;/ul&gt;I guess that's it for now; I'll comment if I think of anything else.  I do have to say the I was so happy with the results of my website redesign contest (which I was very skeptical about), that I've since worked with designer, &lt;a href="http://www.jackherbert.com" target="newwindow"&gt;that Jack Herbert&lt;/a&gt; directly on upcoming projects.  He really immersed himself in the site and came up with ideas that I hadn't considered.  I wouldn't have expected that kind of engagement from the crowdsource format.  &lt;br /&gt;&lt;br /&gt;Anyway, I'm a fan of crowdsourcing, but it's a bit of a process adjustment.  Apart from being &lt;a href="http://www.wired.com/wired/archive/14.06/crowds.html" target="newwindow"&gt;unpopular by content and design experts for devaluing their services&lt;/a&gt;, you're putting other types of constraints (e.g. timeline) on the project.  That said, you'll never get the sheer volume of design hours for the money.  For a small business owner/hobbyist, like myself, it's a great option.  Have you tried it?  What do you think?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27956652-964722413846592732?l=jephs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://foodfinder.net' title='Crowdsourcing Your Graphic Design Needs'/><link rel='replies' type='application/atom+xml' href='http://jephs-blog.blogspot.com/feeds/964722413846592732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27956652&amp;postID=964722413846592732' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/964722413846592732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/964722413846592732'/><link rel='alternate' type='text/html' href='http://jephs-blog.blogspot.com/2010/09/crowdsourcing-your-graphic-design-needs.html' title='Crowdsourcing Your Graphic Design Needs'/><author><name>Jeff</name><uri>http://www.blogger.com/profile/15837962345983733147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://3.bp.blogspot.com/_VUsL3-cGq8k/SPD6-Moc5EI/AAAAAAAAAAU/7D23L72Hohk/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27956652.post-3700077796759546634</id><published>2010-08-25T00:24:00.000-07:00</published><updated>2010-08-25T00:59:27.851-07:00</updated><title type='text'>A Complete 180 Approach</title><content type='html'>For the past 2 years, I've put a lot of time and effort into developing my little restaurant site, FoodFinder.net.  This past weekend, I added another site to my portfolio.  Unlike FF, which is completely custom built using the Microsoft stack of technologies, the new site, which is &lt;a href="http://www.wineguidelines.com" target="newWindow"&gt;a wine guide&lt;/a&gt; called Wine Guidelines, goes against every motivation I've ever had when building sites.&lt;br /&gt;&lt;br /&gt;For one...I won't be doing any building.  I purchased the site in a &lt;a href="http://flippa.com/auctions/104082/MUST-SEE-Stunning-WINE-GUIDE-Website-Pro-Design-Fully-Automated-NO-RESERVE" target="newWindow"&gt;Flippa auction&lt;/a&gt; for a couple hundred bucks.  It really was an impulse buy.  See, I just finished reading &lt;a href="http://www.amazon.com/gp/product/B003YH9MMI?ie=UTF8&amp;tag=wineguidecom-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B003YH9MMI"&gt;Start Small, Stay Small: A Developer's Guide to Launching a Startup&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=wineguidecom-20&amp;l=as2&amp;o=1&amp;a=B003YH9MMI" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt; (Amazon affiliate link), and a host of other resources on the topic of building a small software company.  It has really altered my perspective from that of a developer (focusing on perfect architecture and pristine code) to that of a businessman (release the product as fast as you can, and refine as you go  BTW...this only works for web-based products).  I think this change in mindset has been slowly going on over the past five years or so.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;So Why This Listing&lt;/h3&gt;&lt;br /&gt;Anyway, a few things attracted me to this particular listing. &lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;It's based on &lt;a href="http://wordpress.com" target="newWindow"&gt;Wordpress&lt;/a&gt;&lt;/b&gt;:  I've been more and more intrigued with WP as a website backbone, and wanted to dig in a bit.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;The content is automated&lt;/b&gt;:  Using various Wordpress plugins, the site gathers content from various sources.  I'm very curious to see if a site can run on autopilot and have any success.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;The topic is a hobby of mine&lt;/b&gt;:  I'm actually a bit of a wine drinker (as are many of my friends).  Plus, it ties in to a wine/food pairing algorithm I've been mulling for FoodFinder.net&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;The cost to run and operate this site will be small&lt;/b&gt;:  I've already got a hosting environment built up and ready to host that is a fixed expense.  Other than the purchase cost, and a few hundred more bucks I'm going to throw into a new logo and custom theme.  There shouldn't be any more cost.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;The BIN came with a ton of perks&lt;/b&gt;:  Between the content and software that was included in the auction, it was pretty much a no-brainer&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h3&gt;So What Now?&lt;/h3&gt;&lt;br /&gt;Unlike FF, which I have intentionally avoided loading up with ads so users would have a better experience, the new site is loaded with ads and affiliate links.  My intention is to put in about a week or two of refining the content, tweaking the design, and doing some light marketing (link building, social media, word of mouth, etc), I intend to leave the site alone except for writing the occasional wine article.  I have a new project in my sights, and will be getting that underway tomorrow, with the intention of launching early next year.  Plus, I have a few FF enhancements I'll do on the side.&lt;br /&gt;&lt;br /&gt;Stay tuned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27956652-3700077796759546634?l=jephs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.wineguidelines.com' title='A Complete 180 Approach'/><link rel='replies' type='application/atom+xml' href='http://jephs-blog.blogspot.com/feeds/3700077796759546634/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27956652&amp;postID=3700077796759546634' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/3700077796759546634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/3700077796759546634'/><link rel='alternate' type='text/html' href='http://jephs-blog.blogspot.com/2010/08/complete-180-approach.html' title='A Complete 180 Approach'/><author><name>Jeff</name><uri>http://www.blogger.com/profile/15837962345983733147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://3.bp.blogspot.com/_VUsL3-cGq8k/SPD6-Moc5EI/AAAAAAAAAAU/7D23L72Hohk/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27956652.post-8213664759637362352</id><published>2010-08-14T05:00:00.000-07:00</published><updated>2010-08-14T05:00:04.664-07:00</updated><title type='text'>Follow Me</title><content type='html'>Friends and followers are the cornerstone of social media.  In fact, I just began following my own blog, just so I don't feel too lonely (does that wind up being some kind of circular reference...bah dum chhhh).  Anyway, the art of finding food to try is soliciting the advice of knowledgeable and trusted foodies, or at least people that you trust.  FoodFinder's follower functionality allows you to do that very passively.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Following Foodies&lt;/b&gt;&lt;br /&gt;When implementing relationships on FoodFinder, we went with following over friending.  Friending typically opens up channels of communication and involves initiation and acceptance by the two parties.  Following is simply a way to observe.  As foodies use the site, they will inevitably run across users they've never met, but whose culinary taste are in line.  Who better to observe than someone who has similar taste, but who also runs in different circles.  The more foodies of this type that you identify, the easier it will be to find great new places and dishes to try.&lt;br /&gt;&lt;br /&gt;Make sense?  If so, log on and &lt;a href="http://foodfinder.net/profile/jeph" target="newWindow"&gt;follow me&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27956652-8213664759637362352?l=jephs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jephs-blog.blogspot.com/feeds/8213664759637362352/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27956652&amp;postID=8213664759637362352' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/8213664759637362352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/8213664759637362352'/><link rel='alternate' type='text/html' href='http://jephs-blog.blogspot.com/2010/08/follow-me.html' title='Follow Me'/><author><name>Jeff</name><uri>http://www.blogger.com/profile/15837962345983733147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://3.bp.blogspot.com/_VUsL3-cGq8k/SPD6-Moc5EI/AAAAAAAAAAU/7D23L72Hohk/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27956652.post-5194658339836711432</id><published>2010-08-13T05:00:00.000-07:00</published><updated>2010-08-13T05:00:02.470-07:00</updated><title type='text'>Making a List, Checking it...</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_VUsL3-cGq8k/TGOLaNiEQMI/AAAAAAAAABk/0BUzi5f9lbg/s1600/list.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 222px;" src="http://2.bp.blogspot.com/_VUsL3-cGq8k/TGOLaNiEQMI/AAAAAAAAABk/0BUzi5f9lbg/s320/list.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5504396452002283714" /&gt;&lt;/a&gt;&lt;br /&gt;Now that we've qualified the foodies in our little community by calculating their reputation, we need to give them outlets so they can share their expertise with the world.  In FoodFinder 2.0, foodies can easily create lists for restaurants and menu items.  Not only that, but lists can be both positive and negative.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Making a List&lt;/b&gt;&lt;br /&gt;So why lists?  List are not a new concept.  In fact, they're fairly common across sites of this ilk.  That said, one of the things that we've always strove to do is give foodies a way to exert their influence with minimal investment.  I strongly believe that there is a large community of knowledgeable restaurant experts who simply don't like to write.  To tap into and channel this voice, we seek to provide ways for these users to participate, and add content without requiring an essay.  That's why we've always had the "point and click" ratings for restaurant and menu items. Lists are easy to create, and even easier to add to.  From just about anyplace you view a restaurant or menu item, you can build your lists.&lt;br /&gt;&lt;br /&gt;Haven't created any lists yet...&lt;a href="http://foodfinder.net/login"&gt;login, or create an account&lt;/a&gt; and give it a try.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27956652-5194658339836711432?l=jephs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jephs-blog.blogspot.com/feeds/5194658339836711432/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27956652&amp;postID=5194658339836711432' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/5194658339836711432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/5194658339836711432'/><link rel='alternate' type='text/html' href='http://jephs-blog.blogspot.com/2010/08/making-list-checking-it.html' title='Making a List, Checking it...'/><author><name>Jeff</name><uri>http://www.blogger.com/profile/15837962345983733147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://3.bp.blogspot.com/_VUsL3-cGq8k/SPD6-Moc5EI/AAAAAAAAAAU/7D23L72Hohk/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_VUsL3-cGq8k/TGOLaNiEQMI/AAAAAAAAABk/0BUzi5f9lbg/s72-c/list.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27956652.post-340719863317228161</id><published>2010-08-12T05:00:00.000-07:00</published><updated>2010-08-12T05:00:00.955-07:00</updated><title type='text'>A New Way to Rate</title><content type='html'>As I mentioned in the last post, when I created the second version of FoodFinder.net, one of the cornerstone pieces was the Reputation Engine.  It affords an information seeker the ability to discern between a meaningful review (written by a foodie who is well-traveled and whose opinion is greatly respected) and a less meaningful review (written by someone with limited dining experience, a restaurant's owner, or somebody who otherwise has a bias).  In the first version of FF, I saw this all the time...even more so because I allowed anonymous ratings.  This issue, one of &lt;a href="http://eater.com/archives/2010/05/27/citcrit-criticism-non-professionals-lexicon.php" target="newWindow"&gt;"Cit-Crit"&lt;/a&gt; vs. restaurant critics is &lt;a href="http://www.bonappetit.com/blogsandforums/blogs/bafoodist/2010/06/will-yelp-and-cit-crit-replace.html" target="newWindow"&gt;often debated&lt;/a&gt;, and is a problem that I wanted to take a stab at.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Rating by Reputation&lt;/b&gt;&lt;br /&gt;The overall ratings on FoodFinder are now calculated in a completely new way.  First,  anonymous ratings and reviews are gone.  They still appear at the element level (i.e. menu item, comment card, or restaurant aspect), but they no longer figure into the calculation of a restaurant overall review.  Instead, a rating for a restaurant is weighted by the reputation of the foodie.  This is obvious when seeing the effect on the &lt;a href="http://foodfinder.net/toprestaurants" target="newWindow"&gt;top restaurants page&lt;/a&gt;.  For those of you who don't live in San Diego, believe me...this is a much more accurate list (although there's still room for improvement IMHO).&lt;br /&gt;&lt;br /&gt;Based on the early success of this new approach to rating, I may expand it to include menu items, and the other restaurant aspects (food, service, and atmosphere).  What do you think...am I on the right track?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27956652-340719863317228161?l=jephs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jephs-blog.blogspot.com/feeds/340719863317228161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27956652&amp;postID=340719863317228161' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/340719863317228161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/340719863317228161'/><link rel='alternate' type='text/html' href='http://jephs-blog.blogspot.com/2010/08/new-way-to-rate_12.html' title='A New Way to Rate'/><author><name>Jeff</name><uri>http://www.blogger.com/profile/15837962345983733147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://3.bp.blogspot.com/_VUsL3-cGq8k/SPD6-Moc5EI/AAAAAAAAAAU/7D23L72Hohk/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27956652.post-8330352028873116351</id><published>2010-08-11T20:37:00.000-07:00</published><updated>2010-08-11T21:39:26.650-07:00</updated><title type='text'>Tales of a Restaurant Guide Upgrade</title><content type='html'>What's up foodies and technophiles...long time, no talk.  Well, I'm just 2 short weeks removed from the re-launch of FoodFinder.net, and I'm really happy with the product.  The new look and feel is great and there are some new features that work together to give a unique take on the ever-crowding restaurant guide space.  Over the next few days or so, I'll do a quick walk-though of the new feature set and some lessons learned. For now...let's start with the basics.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Foodie Reputation Engine&lt;/b&gt;&lt;br /&gt;This feature came in a bit late, but lays the foundation for (what I think) is a pretty innovative idea; more on that in a sec.  Plus, I got to satiate my algorithm-loving inner geek.  Taking a page from  &lt;a href="http://stackoverflow.com" target="newWindow"&gt;Stack Overflow&lt;/a&gt;, I created a reputation engine.  The goal was to mathematically qualify a the knowledge of a foodie based on level of participation, dining experience, and community recognition.  I won't go into the boring (and super secret) details, but from a high level, it borrows concepts from SO, and &lt;a href="http://en.wikipedia.org/wiki/PageRank" target="newWindow"&gt;Google's PageRank&lt;/a&gt; concept.&lt;br /&gt;&lt;br /&gt;"Why should I care?" you ask.  Now, when you read somebody's comment card, check out their ratings, or view &lt;a href="http://www.foodfinder.net/profile/list/restaurant/30/places-with-a-great-beer-selection" target="newWindow"&gt;one of their lists&lt;/a&gt;.  More specifically, this approach attempts to solve the problem of user-reviews being less valuable due to lack of experience or potential bias...a point that is well articulated in &lt;a href="http://www.theatlantic.com/food/archive/2010/07/the-changing-food-world-an-ex-critic-reflects/60414/" target="newWindow"&gt;the first question of this article&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Well, that's it for today.  Next up, I'll tackle "Ratings by Reputation".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27956652-8330352028873116351?l=jephs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jephs-blog.blogspot.com/feeds/8330352028873116351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27956652&amp;postID=8330352028873116351' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/8330352028873116351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/8330352028873116351'/><link rel='alternate' type='text/html' href='http://jephs-blog.blogspot.com/2010/08/new-way-to-rate.html' title='Tales of a Restaurant Guide Upgrade'/><author><name>Jeff</name><uri>http://www.blogger.com/profile/15837962345983733147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://3.bp.blogspot.com/_VUsL3-cGq8k/SPD6-Moc5EI/AAAAAAAAAAU/7D23L72Hohk/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27956652.post-7339111190694004998</id><published>2009-02-24T20:57:00.000-08:00</published><updated>2009-02-24T20:58:46.515-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='UI'/><category scheme='http://www.blogger.com/atom/ns#' term='content'/><category scheme='http://www.blogger.com/atom/ns#' term='myspace'/><title type='text'>Space...My Current Frontier</title><content type='html'>More and more, I've found myself thinking about what makes a website usable.  Now I'll come right out and say, I'm no UI expert and I'm a pretty below-average designer.  I have worked with some talented UI folks and picked up a few principles along the way.  Whether or not I use them correctly, I have no idea, but I do try to use them.  Bear with me as I opine about my current perspective.&lt;br /&gt;&lt;br /&gt;The more the interweb grows, the more important it is to give users meaningful content ASAP.  Let's be honest...there's a lot of crap out there, and the crap isn't going away.  As a web user with an extremely finite attention span, I want content now and I'm not going to give any more effort than I have to in order to get to it.  Here's a real world example.  &lt;br /&gt;&lt;br /&gt;I've pretty much abandoned &lt;a href="http://www.myspace.com" target="newWindow"&gt;Myspace&lt;/a&gt; in favor of &lt;a href="http://www.facebook.com" target="newWindow"&gt;Facebook&lt;/a&gt; for a couple of reasons.  On MySpace, I see:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;When I log in...I see ads, I see giant logos, I see a huge picture of me, I see how many people are in my network (a meaningless 9 digit number), and a whole bunch of other crap I'm not interested in.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;My profile is pretty locked down and I still get tons of spam.  I don't want to look at your web cam or buy your pharmaceuticals&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Clutter.  "Cool New Videos", "Profile of the Day", and tons of other garbage I have to wade through to get to what I care about.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Meanwhile, on Facebook I get:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;A tiny logo, unobtrusive but functional navigation, and most of the screen dedicated to the site content.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Speaking of the content, I care about it.  The micro-blogging of my friends is a great, low-impact touch-point.  Because the content they post comes from people I know, it's mostly pre-screened.  Sure, there's stuff I'm not interested in, but because I've got so much functional space, I can scan and dismiss in a matter of seconds.  It takes very little work to get what I'm looking for.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Anyway, I've done a few major functionality releases on foodfinder.net lately...&lt;a href="http://www.foodfinder.net/findfood.aspx" target="newWindow"&gt;search revamp&lt;/a&gt; and &lt;a href="http://www.foodfinder.net/addrestaurant.aspx" target="newWindow"&gt;add restaurant&lt;/a&gt; functionality to be exact, but I've also worked pretty hard to give my users more meaningful space.  Specifically, I cut the logo size by about half, removed most of the ads (all but one), and got rid of some other filler/dead spacing.  Particularly on the restaurant page, I've got much more substance above the fold.&lt;br /&gt;&lt;br /&gt;I don't know if this will pay off or not, but I definitely feel a lot better about the user experience.  Hopefully, it will translate to more users.  What have I missed?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27956652-7339111190694004998?l=jephs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.foodfinder.net' title='Space...My Current Frontier'/><link rel='replies' type='application/atom+xml' href='http://jephs-blog.blogspot.com/feeds/7339111190694004998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27956652&amp;postID=7339111190694004998' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/7339111190694004998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/7339111190694004998'/><link rel='alternate' type='text/html' href='http://jephs-blog.blogspot.com/2009/02/spacemy-current-frontier.html' title='Space...My Current Frontier'/><author><name>Jeff</name><uri>http://www.blogger.com/profile/15837962345983733147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://3.bp.blogspot.com/_VUsL3-cGq8k/SPD6-Moc5EI/AAAAAAAAAAU/7D23L72Hohk/S220/me.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27956652.post-8359026284711384417</id><published>2009-01-25T15:39:00.000-08:00</published><updated>2009-01-27T23:16:20.130-08:00</updated><title type='text'>What do You Suck At?</title><content type='html'>In my humble opinion, this is an important questions that you need to keep asking yourself.  My &lt;a href="http://www.petco.com" target="newWindow"&gt;current day job&lt;/a&gt; is very political.  I've actually been spoken to by my management for saying things like "we suck at this", or "we don't do X very well".  Their response is typically..."don't say we suck--say we have opportunities".  Don't get me wrong, I understand the need to stay positive (particularly in the management role that I'm in).  However, if something needs to be changed, you need to create a sense of urgency to make that change.  Otherwise, it will just fester waiting for somebody to take the "opportunity" to fix it.  So what do I suck at (and when I say "I", I'm referring to &lt;a href="http://www.foodfinder.net/" target="newWindow"&gt;foodfinder.net&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I SUCK as search.  It's a strange thing to have to admit, because I have tons of experience with many different types of product search ranging from the &lt;a href="http://cruises.hotwire.com/search.asp" target="newWindow"&gt;travel industry&lt;/a&gt; to &lt;a href="http://www.smartbargains.com" target="newWindow"&gt;retail&lt;/a&gt;.  Anyway, I really dropped the ball with FoodFinder, but luckily, I have a plan to rectify this.&lt;br /&gt;&lt;br /&gt;Lets take a look at how search works now:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;A user enters a location and optional keyword&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The address is resolved to a longitude/latitude and the user is shown restaurants within a 5 mile radius of that point&lt;/li&gt;&lt;br /&gt;&lt;li&gt;If the user enters a keyword, a LIKE operator search is applied against the appropriate fields&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The user is brought to a page with a list abbreviated results of restaurants and menu items (6 of each) that meet the search criteria.  At that point, they can click to choose which they want to see (there is no paging on this page)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Once they choose, they get expanded results and paging.  They also get a refine utility that allows them to filter results by price, rating, keyword, distance, and rating status.  They can also rate the inline and load menus inline.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;All search logic is done via AJAX calls from the browser.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;When I wrote this, I had many factors in mind that I was trying to address.  How do I let the users search both restaurant and menu items with the same input form?  How can I get users rating food and restaurants as soon in the experience as possible?  How can I make the results as fast as possible with current hardware limitations?  I address all of these concerns, but the final result was search tool that gave a piss-poor (almost unusable) search experience.&lt;br /&gt;&lt;br /&gt;Since the initial launch, I've had to go back and revisit several key areas of the site.  I've got a long way to go, but I finally have a vision for resurrecting FF's search functionality.  My plan is as follows:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Get rid of the AJAX&lt;/b&gt;.  This will help with users who navigate with the back button (like I often do), and give them bookmarkable query strings&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Integrate "Intuitive Location Filtering"&lt;/b&gt;.  If a user enters "1 main street, san diego ca", they're probably interested in seeing what's near them (in which case, the current model is probably fine).  If they enter "San Diego, CA", they probably want to see the entire city.  I will be crafting a routing that tries to determine what the user really wants by their location query and filter accordingly.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Enhance the keyword part of the search&lt;/b&gt;.  Right now, if you enter "Ruths" as your keyword term, you will not get see "Ruth's Chris" because of the apostrophe.  The new algorithm breaks down the keyword phrase and evaluates the individual terms with inappropriate punctuation removed to treated as word boundaries.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Add a search summary and advanced options &lt;i&gt;in an obvious place&lt;/i&gt; when a search is completed.&lt;/b&gt;  This will allow folks to see exactly what they're looking at (particularly important with the intuitive location algorithm) and how to modify those options.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Get rid of the multi-state&lt;/b&gt;.  It's confusing.  One state will exist for search and users will need to click through to a restaurant to get interact with the data.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Leverage the work &lt;a href="http://www.google.com" target="newWindow"&gt;Google&lt;/a&gt; has done&lt;/b&gt;.  Google is the undisputed kings of search.  They have already trained the community to deal with different types of data consolidated within one result set.  Why not take advantage of the "training" that they've already invested in?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Let the users sort&lt;/b&gt;.  Duh.  Users can only filter (if they can figure out how).  Let them sort the results to better aid them in what they're looking for.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Add support for tags&lt;/b&gt;.  Tags are a great, free-form organizational tool.  Sites like &lt;a href="http://delicious.com/" target="newWindow"&gt;http://delicious.com/&lt;/a&gt; have done some amazing things with tags (there are also sites that haven't figured it out yet).  For me, relying on the community for restaurant meta-data, I really need to make tags more powerful.  Don't worry, I'm on it.&lt;/li&gt; &lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Well, that's it.  It's a lot to bite off, but I really think it will be worth it.  Plus, the work I'm doing on search (and have done of the restaurant page with menus) will set me up for a mobile implementation.  &lt;br /&gt;&lt;br /&gt;So, what am I missing here?  I'm sure there are several things.  I'm also sure that these changes will be an exponential improvement over the current search experience.  Any thoughts?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27956652-8359026284711384417?l=jephs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.foodfinder.net' title='What do You Suck At?'/><link rel='replies' type='application/atom+xml' href='http://jephs-blog.blogspot.com/feeds/8359026284711384417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27956652&amp;postID=8359026284711384417' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/8359026284711384417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/8359026284711384417'/><link rel='alternate' type='text/html' href='http://jephs-blog.blogspot.com/2009/01/what-do-you-suck-at.html' title='What do You Suck At?'/><author><name>Jeff</name><uri>http://www.blogger.com/profile/15837962345983733147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://3.bp.blogspot.com/_VUsL3-cGq8k/SPD6-Moc5EI/AAAAAAAAAAU/7D23L72Hohk/S220/me.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27956652.post-958723904085744116</id><published>2008-11-25T18:36:00.000-08:00</published><updated>2008-11-25T18:39:31.348-08:00</updated><title type='text'>Web Advertising?</title><content type='html'>Lately, I’ve been spending a lot of time trying to get people to check out my little &lt;a href="http://www.foodfinder.net" target="newWindow"&gt;restaurant guide&lt;/a&gt;.    I’ve tried a few different channels that I’d like to talk about.&lt;br /&gt;&lt;br /&gt;First of all, I am currently willing to spend about $100 per month; this is because I fund this endeavor out-of-pocket.  Since I launched the site back in July, I’ve tried buying &lt;a href="http://www.google.com/adwords" target="newWindow"&gt;Google adwords&lt;/a&gt;, and also experimented with &lt;a href="http://www.facebook.com/advertising" target="newWindow"&gt;Facebook ads&lt;/a&gt;.  When I first configured my Google ads, I was getting about 8 clicks per day, but I was getting a lot of users that I simply couldn’t offer value to (foodfinder.net is still has very limited US restaurant coverage).  On the next round, I did a bit more targeting by geography both in terms of keyword selection and making my landing pages a bit smarter.  By click rate dropped to 2-3 per day, but my bounce rate also fell by about 10%.&lt;br /&gt;&lt;br /&gt;Facebook offers super targeted advertising, but I started with a small geographic search area (San Diego and surrounding cities).  This yielded about 1-2 clicks per day (although my total ad spend was under 10 dollars over a 14 day period).&lt;br /&gt;&lt;br /&gt;Clearly, I’ve got a steep learning curve here.  I think I’m going to try some less conventional forms of advertising.  A friend and co-worker who just release a &lt;a href="http://www.trackhappy.com" target="newWindow"&gt;cool viral object tracking game site&lt;/a&gt; turned me on to a cool new ad channel.  The site is called &lt;a href="http://www.girlinyourshirt.com" target="newWindow"&gt;Girl in Your Shirt&lt;/a&gt; and it takes an innovative approach to marketing via social networking.&lt;br /&gt;&lt;br /&gt;This will be my next endeavor--I’ve got shirt printing now, and will soon drop $75 bucks to see what kind of traffic this can drive.  I’ll keep you posted.  In the mean time, any thought on how to spend $100 a month to drive some web traffic?   I’d love to hear your thoughts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27956652-958723904085744116?l=jephs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.foodfinder.net' title='Web Advertising?'/><link rel='replies' type='application/atom+xml' href='http://jephs-blog.blogspot.com/feeds/958723904085744116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27956652&amp;postID=958723904085744116' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/958723904085744116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/958723904085744116'/><link rel='alternate' type='text/html' href='http://jephs-blog.blogspot.com/2008/11/web-advertising.html' title='Web Advertising?'/><author><name>Jeff</name><uri>http://www.blogger.com/profile/15837962345983733147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://3.bp.blogspot.com/_VUsL3-cGq8k/SPD6-Moc5EI/AAAAAAAAAAU/7D23L72Hohk/S220/me.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27956652.post-7974512808447713691</id><published>2008-11-11T16:20:00.000-08:00</published><updated>2008-11-11T16:22:31.148-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='yelp'/><category scheme='http://www.blogger.com/atom/ns#' term='data'/><category scheme='http://www.blogger.com/atom/ns#' term='international'/><category scheme='http://www.blogger.com/atom/ns#' term='marthas'/><category scheme='http://www.blogger.com/atom/ns#' term='menus'/><category scheme='http://www.blogger.com/atom/ns#' term='restaurants'/><title type='text'>My Biggest Challenge: Data Acquisition</title><content type='html'>I've gotten a couple of requests this past week that relate to the most difficult part of building the intrepid &lt;a href="http://www.foodfinder.net/"  target="newWindow"&gt;restaurant guide&lt;/a&gt; that is FoodFinder.net.  Both of these, while very different from each other, tie into the same theme--gathering restaurant data.&lt;br /&gt;&lt;br /&gt;The first one inquired about adding international restaurants.  Wow...this would be super cool.  I really look forward to expanding overseas.  Unfortunately, I'm years, not months away.  Reason one--I have limited database space (about half a gig).  Even my US coverage is a work in progress.  I've collected restaurants in about 20 major markets, and have filled out areas around the two places where I've lived (southern New England and Southern California).  These 2 regions also get the most attention in terms of &lt;a href="http://www.foodfinder.net/restaurants/ca/san-diego/high-dive-bar-and-grill/21415.aspx" target="newWindow"&gt;new restaurants&lt;/a&gt; and updates.&lt;br /&gt;&lt;br /&gt;The second request was for an update to the menu for &lt;a href="http://www.foodfinder.net/restaurants/nh/nashua/martha-s-exchange---brewery/3787.aspx" target="newWindow"&gt;Martha's Exchange &amp; Brewery&lt;/a&gt;.  Normally, this would be a simple matter, but their menu is not available electronically (normally, I would have told the manager to send me an electronic copy of the data, but since I used to frequent their on the weekends, I figured I'd knock it out and brush up on my typing skills at the same time).  In the future, I won't make a habit of doing this.&lt;br /&gt;&lt;br /&gt;Also, I'd like to expand the amount of data available for an individual restaurant.  I think &lt;a href="http://www.yelp.com/biz/the-local-san-diego" target="newWindow"&gt;Yelp&lt;/a&gt; does a great job providing detailed meta information about their listings.  I plan to add this by opening up control over some of the restaurant data to the community and the owners or managers.  So much to do, and so little time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27956652-7974512808447713691?l=jephs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.foodfinder.net' title='My Biggest Challenge: Data Acquisition'/><link rel='replies' type='application/atom+xml' href='http://jephs-blog.blogspot.com/feeds/7974512808447713691/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27956652&amp;postID=7974512808447713691' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/7974512808447713691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/7974512808447713691'/><link rel='alternate' type='text/html' href='http://jephs-blog.blogspot.com/2008/11/my-biggest-challenge-data-acquisition.html' title='My Biggest Challenge: Data Acquisition'/><author><name>Jeff</name><uri>http://www.blogger.com/profile/15837962345983733147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://3.bp.blogspot.com/_VUsL3-cGq8k/SPD6-Moc5EI/AAAAAAAAAAU/7D23L72Hohk/S220/me.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27956652.post-1209250863102162804</id><published>2008-11-04T15:31:00.000-08:00</published><updated>2008-11-04T15:51:12.319-08:00</updated><title type='text'>Food and Restaurant Resources</title><content type='html'>When promoting a website, one of the most important criteria in organic SEO is backlinks.  A few days back, my little &lt;a href="http://www.foodfinder.net" target="newWindow"&gt;restaurant rating website&lt;/a&gt; was included in a &lt;a href="http://www.culinaryschoolguide.org/blog/2008/100-useful-search-engines-for-chefs-cooks-and-food-lovers/" target="newWindow"&gt;blog post&lt;/a&gt;.  The site is called &lt;a href="http://www.culinaryschoolguide.org/" target="newWindow"&gt;www.culinaryschoolguide.org&lt;/a&gt; and the topic was 100 useful food resources.&lt;br /&gt;&lt;br /&gt;At first, I was just happy to get an unsolicited link to FoodFinder.net (the first of it's kind).  Of course, I took a few minutes to check out the entry and there are some really great resources on there, ranging from search engines for &lt;a href="http://www.pubcrawler.com" target="newWindow"&gt;micro breweries&lt;/a&gt; to &lt;a href="http://www.foodtube.net/" target="newWindow"&gt;cooking videos&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you're a foodie, check it out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27956652-1209250863102162804?l=jephs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.foodfinder.net' title='Food and Restaurant Resources'/><link rel='replies' type='application/atom+xml' href='http://jephs-blog.blogspot.com/feeds/1209250863102162804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27956652&amp;postID=1209250863102162804' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/1209250863102162804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/1209250863102162804'/><link rel='alternate' type='text/html' href='http://jephs-blog.blogspot.com/2008/11/food-and-restaurant-resources.html' title='Food and Restaurant Resources'/><author><name>Jeff</name><uri>http://www.blogger.com/profile/15837962345983733147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://3.bp.blogspot.com/_VUsL3-cGq8k/SPD6-Moc5EI/AAAAAAAAAAU/7D23L72Hohk/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27956652.post-2167484334807757506</id><published>2008-10-16T23:04:00.000-07:00</published><updated>2008-10-16T23:05:08.188-07:00</updated><title type='text'>How to Optimize SEO for a New Website</title><content type='html'>Actually, I'm not instructing--I'm asking.  SEO is something very new to me.  It’s funny, you spend years working on B2C web sites, and many of the changes requested by the marketing group revolved around SEO--somehow, very little sunk in.  Anyway, I've been fumbling through the process, trying to get my &lt;a href="http://www.foodfinder.net" target="newWindow"&gt;restaurant guide website&lt;/a&gt; up to snuff.  Fortunately, there are resources available.&lt;br /&gt;&lt;br /&gt;A co-worker and friend of mine has a great &lt;a href="http://www.whereweride.com" target="newWindow"&gt;mountain bike trail site&lt;/a&gt; and I've learned quite a bit from his efforts.  Primarily, using URL re-writing to allow search engines to process dynamic pages easily, as well as getting some important keywords into the URL.  Apparently search engine bots weight this heavily.&lt;br /&gt;&lt;br /&gt;Also, I've subscribed to a service to submit my website to several directories.  This creates a pool of back links, which search engines use to determine the value of a website.  I've slowly seen my &lt;a href="http://www.google.com/corporate/tech.html" target="newWindow"&gt;Google page rank&lt;/a&gt; jump from zero to a whopping one.&lt;br /&gt;&lt;br /&gt;A really cool website that I found on &lt;a href="http://www.chrisbrogan.com" target="newWindow"&gt;Chris Brogan's blog&lt;/a&gt; is the &lt;a href="http://www.websitegrader.com" target="newWindow"&gt;Website Grader from Hubspot&lt;/a&gt;  They have a tool that analyzes your site's content, features, back links, and a whole bunch of other factors, and then give it a grade.  I use this thing every couple of days and try work off their recommendations.  I've grown my grade from 55 to &lt;a href="http://www.websitegrader.com/wsgid/1678346/default.aspx" target="newWindow"&gt;88&lt;/a&gt;.  I've also created &lt;a href="http://www.facebook.com/pages/FoodFindernet/28942054588" target="newWindow"&gt;Facebook&lt;/a&gt; and &lt;a href="http://www.myspace.com/foodfinder" target="newWindow"&gt;Myspace&lt;/a&gt; pages.&lt;br /&gt;&lt;br /&gt;What should I do next?  My Google ranking is growing, but I can't seem to make much progress in Yahoo or MSN.  I'd love to hear any advice.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27956652-2167484334807757506?l=jephs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.foodfinder.net' title='How to Optimize SEO for a New Website'/><link rel='replies' type='application/atom+xml' href='http://jephs-blog.blogspot.com/feeds/2167484334807757506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27956652&amp;postID=2167484334807757506' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/2167484334807757506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/2167484334807757506'/><link rel='alternate' type='text/html' href='http://jephs-blog.blogspot.com/2008/10/how-to-optimize-seo-for-new-website.html' title='How to Optimize SEO for a New Website'/><author><name>Jeff</name><uri>http://www.blogger.com/profile/15837962345983733147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://3.bp.blogspot.com/_VUsL3-cGq8k/SPD6-Moc5EI/AAAAAAAAAAU/7D23L72Hohk/S220/me.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27956652.post-1918941509633457062</id><published>2008-10-11T12:18:00.000-07:00</published><updated>2008-10-11T12:42:45.996-07:00</updated><title type='text'>Watching Data Evolve</title><content type='html'>Is it possible to say "I told you so" to yourself.&lt;br /&gt;&lt;br /&gt;When I launched my new &lt;a href="http://www.foodfinder.net" target="newWindow"&gt;restaurant rating site&lt;/a&gt; about 2 and a half months ago, I made a decision.  I decided to allow users to participate in the site without creating an account or logging in.  This was calculated; The site will only come alive and be successful if users participate, so I wanted them to be able to interact without the hurdle of having to create an account.  To give them value while asking for little in return.  The same reason people can rate a restaurant or menu item without having to write about it.  &lt;br /&gt;&lt;br /&gt;Of course, this openness has an interesting side effect.  I'm finding that some folks are rating restaurants with 10s across the board (the restaurant owners perhaps?).  Now don't get me wrong, I don't mind.  I'm just glad people are beginning to participate.  Of course, this isn't exactly an unbiased view of an establishment's fare.&lt;br /&gt;&lt;br /&gt;Eventually, I will implement an &lt;a href="http://www.imdb.com/title/tt1225901/" target="newWindow"&gt;IMDB&lt;/a&gt; style mechanism so the ratings are only displayed when multiple ratings are collected.  For now, thought...it's a free-for-all.  It's actually a good play by the owners.  A top-ten rated dish for a city appears on the home page giving a little extra exposure.&lt;br /&gt;&lt;br /&gt;What do you think?  Will people pass the site by if the ratings are obviously skewed?  Should I do something to stop this at the risk of collecting less data?  What would you do?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27956652-1918941509633457062?l=jephs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jephs-blog.blogspot.com/feeds/1918941509633457062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27956652&amp;postID=1918941509633457062' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/1918941509633457062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/1918941509633457062'/><link rel='alternate' type='text/html' href='http://jephs-blog.blogspot.com/2008/10/watching-data-evolve.html' title='Watching Data Evolve'/><author><name>Jeff</name><uri>http://www.blogger.com/profile/15837962345983733147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://3.bp.blogspot.com/_VUsL3-cGq8k/SPD6-Moc5EI/AAAAAAAAAAU/7D23L72Hohk/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27956652.post-6364366259070817789</id><published>2008-07-29T23:17:00.000-07:00</published><updated>2009-01-09T19:53:15.972-08:00</updated><title type='text'>How to Start a Website For $2853.80</title><content type='html'>How much moola does it take to get a website off the ground?  Of course, that depends on a number of factors: the skills and experience of the person or people involved, the overall goal of the site, the estimated traffic, the marketing strategy/budget, etc.  To get &lt;a href="http://www.foodfinder.net" target="newWindow"&gt;FoodFinder.net&lt;/a&gt; off the ground, I've amassed a whopping $2853.80 in one time expenses and $480 annually in recurring expenses.  Here's the breakdown:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Domain Names: $1849.80: I probably went a bit overboard here due wholly as a result of alcohol.  There are actually 5 domain names pointed to the website right now.  www.foodfinder.net ($1,300 - 6 years), www.foodsearch.us.com ($149.95 - 5 years), www.foodfinder.us.com ($149.95 - 5 years), www.lunchfinder.us.com ($149.95 - 5 years), www.lunchfinder.net ($99.95 - 5 years)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Hosting/Database: I use &lt;a href="http://www.discountasp.net" target="newWindow"&gt;discountasp.net&lt;/a&gt; which I love.  I host my &lt;a href="http://www.jeph.tv" target="newWindow"&gt;jeph.tv&lt;/a&gt; site there as well.  They start at $10/month for ASP.Net hosting and you can add on from there (I think I'm paying about $40/month with add-ons, plus about $100 worth of various set up options).  They do get you for some services, but for an experienced user, I highly recommend them.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Images:  In the early stages of design, I thought I was going to need a vast library of images.  As such, I signed up for a subscription at &lt;a href="http://www.123rf.com" target="newWindow"&gt;www.123rf.com&lt;/a&gt;.  The quality is great and for $199, I get a 90 day subscription which allows me 5 downloads per day.  I've got a slew of images that I will probably never use, but that's OK.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Logo: I am no designer; this will become clear as you use the site.  The logo was purchased in a contest at &lt;a href="http://www.99designs.com" target="newWindow"&gt;www.99designs.com&lt;/a&gt;.  I loved this process. Basically, you post a description of what you're looking for and what you're willing to pay and designers from around the world submit designs.  I saw some really &lt;a href="http://99designs.com/contests/8667" target="newWindow"&gt;cool options&lt;/a&gt; before deciding; there are some very talented folks in that community.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;That's it; the remaining work is a lot of blood, sweat, and tears.  I force myself to work an hour per day and that usually turns into 4 or 5.  I started in April and would say I average 4 hours per day, 7 days per week.  That's roughly 476 hours...ugh.&lt;br /&gt;&lt;br /&gt;So that's all it takes.  Now the path I took isn't viable (or recommended) for most people.  In fact, for a non-experienced user, I would recommend creating a blog with links to static pages.  Take &lt;a href="http://www.jaynesgastropub.com" target="newWindow"&gt;this site&lt;/a&gt; for example (this actually came up recently).  For eCommerce, I would probably leverage a subscription package like &lt;a href="http://pages.ebay.com/storefronts/start.html" target="newWindow"&gt;Ebay stores&lt;/a&gt;.  There are a ton of free or low-cost options available that allow users with limited technical skill to develop an internet presence&lt;br /&gt;&lt;br /&gt;What's your idea?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27956652-6364366259070817789?l=jephs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jephs-blog.blogspot.com/feeds/6364366259070817789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27956652&amp;postID=6364366259070817789' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/6364366259070817789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/6364366259070817789'/><link rel='alternate' type='text/html' href='http://jephs-blog.blogspot.com/2008/07/how-to-start-website-for-285380.html' title='How to Start a Website For $2853.80'/><author><name>Jeff</name><uri>http://www.blogger.com/profile/15837962345983733147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://3.bp.blogspot.com/_VUsL3-cGq8k/SPD6-Moc5EI/AAAAAAAAAAU/7D23L72Hohk/S220/me.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27956652.post-2207884491423579260</id><published>2008-07-28T22:30:00.000-07:00</published><updated>2009-01-09T19:52:43.263-08:00</updated><title type='text'>The Birth of a Website</title><content type='html'>Wow, it's been a long time since I've posted on this blog.  I find myself working on a really interesting development project these days though, so I feel compelled to talk about it.  Recently, I was inspired by the story of &lt;a href="http://www.plentyoffish.com/" target="newWindow"&gt;Plenty of Fish&lt;/a&gt; and how &lt;a href="http://plentyoffish.wordpress.com/" target="newWindow"&gt;Markus&lt;/a&gt; has found a degree of financial success creating a site that offers great value and is completely supported by advertising.  "I could do that", I cried.  And so it begins...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.foodfinder.net/" target="newWindow"&gt;FoodFinder.net&lt;/a&gt; is a website that allows users to search and rate restaurants by the menu item.  The idea came from a conversation we have pretty much every day at work.&lt;br /&gt;&lt;br /&gt;"What should we have for lunch?"&lt;br /&gt;"I don't know...where can we find a decent burger around here?"&lt;br /&gt;"How about &lt;a href="http://www.chilis.com/" target="newWindow"&gt;Chilis&lt;/a&gt;"&lt;br /&gt;"I don't feel like that how about..."&lt;br /&gt;&lt;br /&gt;You get the idea.  Plus, as a big fan of the food shows, I'm always wanting to try stuff I see on TV.  What's the current protocol for finding a &lt;a href="http://www.foodfinder.net/restaurants/ca/san-diego/sogno-di-vino/691.aspx" target="newWindow"&gt;muffuletta sandwich&lt;/a&gt; or &lt;a href="http://www.foodfinder.net/restaurants/ca/san-diego/champagne-french-bakery/138.aspx" target="newWindow"&gt;croque monsieur&lt;/a&gt;.  So there you have it.&lt;br /&gt;&lt;br /&gt;I realize this is a technical blog, and will make sure to talk about the technical challenges and architecture involved in the site.  I also am amazed that despite being the same technology platform (ASP.Net with a MS SQL Server 2005 DB), the code is night and day different than what I do in my day job.&lt;br /&gt;&lt;br /&gt;That's it for now.  Next, I'll run down the steps and vendors I used to get this thing off the ground.  Remember, when checking it out that is a work in progress, but will one day be great ;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27956652-2207884491423579260?l=jephs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jephs-blog.blogspot.com/feeds/2207884491423579260/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27956652&amp;postID=2207884491423579260' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/2207884491423579260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/2207884491423579260'/><link rel='alternate' type='text/html' href='http://jephs-blog.blogspot.com/2008/07/birth-of-website.html' title='The Birth of a Website'/><author><name>Jeff</name><uri>http://www.blogger.com/profile/15837962345983733147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://3.bp.blogspot.com/_VUsL3-cGq8k/SPD6-Moc5EI/AAAAAAAAAAU/7D23L72Hohk/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27956652.post-115337774322408710</id><published>2006-07-19T22:45:00.000-07:00</published><updated>2007-02-21T17:23:15.403-08:00</updated><title type='text'>Waiting...</title><content type='html'>I spent 8 years in the restaurant industry.  Waiting tables, bartending, cooking, chef, and front of the house management…I did it all.  That said, I confidently make this statement--I learned more about efficient programming in the restaurant business then through any other education or experience I’ve had.  &lt;br /&gt;&lt;br /&gt;This may sound crazy, but hear me out.  There are two ways to be successful waiting tables: having a great personality, or having exceptional time-management skills.  Well, anybody who knows me will confirm that there’s no way I could support myself with personality, but I did learn how to get maximum results out of minimal effort.  Give me a minute to lay some groundwork.&lt;br /&gt;&lt;br /&gt;For those who have never worked in the restaurant industry, consider this.  You’ve got a station of tables where you serve your customers.  To service them effectively, you will need to go to several other areas.  You’ll pick up (or make) your drinks at the bar, get your food (and possibly add garnishes) at the kitchen, and pickup other supplies and enter check-items at the wait station.   Now, bear in mind, most of the work you do as a waiter, bartender, or cook takes place over the course of about 1.5 hours during lunch and 4 hours over dinner.  The key to success is being able to meet the needs of your customers efficiently.  So how does this translate to programming?&lt;br /&gt;&lt;br /&gt;I'll tackle this question via analogy; consider the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Station of tables equates to in-process memory&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Bar equates to the file-system&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Wait-station equates to the database&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Kitchen equates to web services/http-based resources&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Efficiency in food service comes through consolidation.  Let’s say I have five tables.  If I take a drink order from one table, get the drink from the bar and then deliver, and my next action is to take a drink order from another table, I’ve wasted a lot of time.  That trip to the bar is expensive.  Now, if I can anticipate that both tables need drinks, I can take both orders and deliver them with one trip to the bar.  I now have more time for servicing my other tables which translates to either more upselling, or faster turnaround.  Both things lead to higher overall tips.&lt;br /&gt;&lt;br /&gt;So let’s look at the programming parallels starting with the database (wait-station).  If you take a food order from one table, can you take another food or drink order from another table?  If so, this would save a trip, and considerable time.   What if a table ask for a straw--another trip to the wait-station, unless  you are carrying straws in your apron (caching).  One could go on-and-on with these types of comparisons, all supporting the same theme: consolidate as many steps as you can.  &lt;br /&gt;&lt;br /&gt;This is a very common-sense concept, but you'd be surpised how often it's overlooked.      From now on when you're typing (or better yet, planning) your code, see if there are opportunities to save a trip to the bar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27956652-115337774322408710?l=jephs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jephs-blog.blogspot.com/feeds/115337774322408710/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27956652&amp;postID=115337774322408710' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/115337774322408710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/115337774322408710'/><link rel='alternate' type='text/html' href='http://jephs-blog.blogspot.com/2006/07/waiting.html' title='Waiting...'/><author><name>Jeff</name><uri>http://www.blogger.com/profile/15837962345983733147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://3.bp.blogspot.com/_VUsL3-cGq8k/SPD6-Moc5EI/AAAAAAAAAAU/7D23L72Hohk/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27956652.post-115068453598908220</id><published>2006-06-18T19:34:00.000-07:00</published><updated>2006-06-18T19:35:36.003-07:00</updated><title type='text'>To Normalize or not to Normalize?</title><content type='html'>&lt;a href="http://en.wikipedia.org/wiki/Database_normalization" target="newwindow"&gt;Normalization&lt;/a&gt; is an important concept in database design, but is it always practical?  This is a question I’ve been hit with head-on while working on a recent project at work.  Now, there’s more at play here than simply normalization.  Our overall site design executes an excessive amount of business logic in the database tier, which makes me cringe.  Here’s why.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Databases are almost always the least fault-tolerant layers in an application&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Databases are almost always harder to debug and troubleshoot than other layers in an application.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Databases are written to read and write from disk efficiently, and apply set operations on groups of data.  Branching logic, string manipulation, and the like are convenience tools only.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Enterprise databases are really expensive and much harder to scale horizontally.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;These ideas have been beaten into my head over the past 4 years or so, and they make a lot of sense (or I'm just brainwashed).  &lt;br /&gt;&lt;br /&gt;The next point is a matter of maintainability.  Let's say you've got a stored procedure that's about 150 lines long that contains some conditional logic and is joining across 7 or 8 tables in multiple branches and in various sub-selects.  Now, you have to add a whole new set of functionality, but to do so, you have to integrate data filtering that exists across 9 or 10 new tables.  Now lets add another real-world variable to the equation...turnover.  What happens to the poor bastard that inherits this beast?  To me, this is far more costly than any performance loss that is incurred by introducing complex joins and decision logic.&lt;br /&gt;&lt;br /&gt;Now don't get me wrong--I'm not anti-normalization.  In fact, it should probably be the first thing considered in any data modeling.  But normalization-for-the-sake-of-normalization can be a slippery slope in terms of an application's agility and maintainability.  Embrace best practices, but question them as well.  There are people out there who make a lot of money selling enterprise database software so be careful about whose Kool-Aid you drink.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27956652-115068453598908220?l=jephs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jephs-blog.blogspot.com/feeds/115068453598908220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27956652&amp;postID=115068453598908220' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/115068453598908220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/115068453598908220'/><link rel='alternate' type='text/html' href='http://jephs-blog.blogspot.com/2006/06/to-normalize-or-not-to-normalize.html' title='To Normalize or not to Normalize?'/><author><name>Jeff</name><uri>http://www.blogger.com/profile/15837962345983733147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://3.bp.blogspot.com/_VUsL3-cGq8k/SPD6-Moc5EI/AAAAAAAAAAU/7D23L72Hohk/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27956652.post-114983322087201002</id><published>2006-06-08T23:06:00.000-07:00</published><updated>2006-06-09T09:58:08.336-07:00</updated><title type='text'>Rolling Your Own AJAX (Part 3)</title><content type='html'>I'm looking through the Ajax library &lt;a href="http://www.jeph.tv/js/ajax.js" target="newwindow"&gt;source code&lt;/a&gt; and noticed something that made me laugh. Three of the five objects were written using &lt;a href="http://www.json.org/" target="newwindow"&gt;JSON&lt;/a&gt; and the others were constructed the more traditional way (creating functions to represent the object and defining members using the "this" keyword). Normally, I'm not this inconsistant but hadn't used JSON before and wanted to develop some proficiency. The reason being that deserializing JSON into a native JavaScript object is considerably faster than creating and working with an XML document (although there are security implications). That said, I think any reusable framework needs to support should probably support both, as well as simple string responses.&lt;br /&gt;&lt;br /&gt;One of the challenges I ran into when coding this model was getting the message data to be accessible to the context object. The problem was this--the message contains a pointer to a callback function along with a reference to the request object. What I wanted to do was pass the entire parent message object to the callback. This would allow all of the request and response details, along with the properties of the message to be available when synchronized back to the main execution thread. But there's a problem.&lt;br /&gt;&lt;br /&gt;The issue came with the "this" keyword. The AjaxMessage object contains a method called "process" which obtains a reference to a request object. This is temporarily stored in a property and the message object calls the "send" method of the request. When the onreadystatechange fires, the context becomes the request object; the reference to the parent message object is lost.&lt;br /&gt;&lt;br /&gt;This was actually a simple fix for &lt;a href="http://www.firefox.com/" target="newwindow"&gt;Firefox&lt;/a&gt;. The open-endedness of JavaScript objects would allow a property to be added to the request object with a reference back to the parent AjaxMessage. IE however is a different animal. The HTTPRequest is not exposed as a native JS object, but rather as an ActiveX control which plays by its own rules. This is actually related to the inability to cover a select box with a div object without the use of programming trickery (I prefer the iFrame shim myself). This problem gave me fits for over a week. So what was the solution?&lt;br /&gt;&lt;br /&gt;It actually turned out to be pretty simple and logical. I was able to create a local variable that contained a reference to the AjaxMessage within said message.&lt;br /&gt;When the "this" keyword picked up the HTTPRequest reference, I was able to get back to the message by passing the local reference as an arguement to the callback. At this point you may be thinking the same thing I was...with all this circular referencing going on, have we created a memory leak? The short answer is not that I've seen yet, but I'll go into further detail in a future blog.&lt;br /&gt;&lt;br /&gt;Anyway, I've been using the Ajax library for a while now and have had great results. It's small (about 400 lines of code), reliable, handles a variety of page types and load, and very easy to plug in and use. If anybody is interested, you can download it &lt;a href="http://www.jeph.tv/js/ajax.js" target="newwindow"&gt;here&lt;/a&gt; and use it at will. I'd love to hear about any bugs, feature requests, or general feedback.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27956652-114983322087201002?l=jephs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jephs-blog.blogspot.com/feeds/114983322087201002/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27956652&amp;postID=114983322087201002' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/114983322087201002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/114983322087201002'/><link rel='alternate' type='text/html' href='http://jephs-blog.blogspot.com/2006/06/rolling-your-own-ajax-part-3.html' title='Rolling Your Own AJAX (Part 3)'/><author><name>Jeff</name><uri>http://www.blogger.com/profile/15837962345983733147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://3.bp.blogspot.com/_VUsL3-cGq8k/SPD6-Moc5EI/AAAAAAAAAAU/7D23L72Hohk/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27956652.post-114918391797148471</id><published>2006-06-01T10:44:00.000-07:00</published><updated>2006-06-01T21:20:49.166-07:00</updated><title type='text'>Rolling Your Own AJAX (Part 2)</title><content type='html'>I left off talking about some of the perceived UI benefits of using AJAX.  What I'd like to cover now is how I modeled the AJAX client library for this project.  I did some research into some of the existing solutions, and there is some good stuff out there. &lt;a href="http://dojotoolkit.org/" target="newwindow"&gt;Dojo&lt;/a&gt; is a very robust client-side library that goes way beyond simple AJAX functionality, and there a couple of .Net frameworks available, too (&lt;a href="" target="newwindow"&gt;Ajax.Net&lt;/a&gt; and &lt;a href="http://atlas.asp.net" target="newwindow"&gt;Atlas&lt;/a&gt; come to mind...I'm sure there are many more).  For the project at hand, I decided to construct a framework from scratch--a direction I almost always lean toward.&lt;br /&gt;&lt;br /&gt;Here is the object model I came up with, and the general rolls each would play:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;AjaxMessage&lt;/b&gt;:  This object encapsulates a single callback to the server, and contains the request details, response details, and handling details (a reference to the callback function).  It also contains the actual HTTP request (which I will most likely decouple when I refactor this puppy).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;MessageBuffer&lt;/b&gt;:  This object is essentially a traffic controller, and determines how messages will be handled in the context of the page.  When going through possible AJAX use-cases, I felt like we needed a lot of control here.  In the project at hand, the user had the ability to request information faster than it could be processed.  The MessageBuffer object can be set up to send messages immediately or in batches, and can filter duplicate messages.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;MessageCache&lt;/b&gt;:  This is a repository for "cachable" messages.  If a message is deterministic (will return the same results with the same inputs), it can be cached and the return data accessed later without going back to the server.  This object manages cache settings including capacity, threshold, and expiretype (messages can be set to expire after a given amount of time, or via a least-frequently-used algorithm.)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;CacheObject&lt;/b&gt;:  This is simply an AjaxMessage object with cache meta-data.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Request Pool&lt;/b&gt;:  OK, this was something I coded before had fully researched it.  The idea was to create a pool of HTTP Request objects when the AjaxFramework is initialized to avoid the overhead of object creation for each request.  Great idea in theory, right?  The problem is the &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616.html" target="newwindow"&gt;HTTP 1.1 specification&lt;/a&gt; says that only two request objects can be open by a browser simultaneously.  IE adhere to this by default (although it can be changed in the registry) while Firefox has a default of eight.  Oh well, if this changes in a future release, I'll be ready ;)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Here's what the model looks like for you UML folks out there:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4203/2953/1600/ajax_class_diagram_400.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4203/2953/400/ajax_class_diagram_400.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Next, I'll get into some of the implementation details and specific features of the framework.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27956652-114918391797148471?l=jephs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jephs-blog.blogspot.com/feeds/114918391797148471/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27956652&amp;postID=114918391797148471' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/114918391797148471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/114918391797148471'/><link rel='alternate' type='text/html' href='http://jephs-blog.blogspot.com/2006/06/rolling-your-own-ajax-part-2.html' title='Rolling Your Own AJAX (Part 2)'/><author><name>Jeff</name><uri>http://www.blogger.com/profile/15837962345983733147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://3.bp.blogspot.com/_VUsL3-cGq8k/SPD6-Moc5EI/AAAAAAAAAAU/7D23L72Hohk/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27956652.post-114875356174935552</id><published>2006-05-27T11:11:00.000-07:00</published><updated>2006-06-01T10:45:45.496-07:00</updated><title type='text'>Rolling Your Own AJAX (Part 1)</title><content type='html'>As &lt;a href="http://en.wikipedia.org/wiki/Ajax_%28programming%29" target="newwindow"&gt;AJAX&lt;/a&gt; has grown as a programming paradigm for the web, there has been an emergence of platforms to support development.  I was lucky enough to work for a company that got into the web 2.0-game fairly early and was tasked with designing and creating a client-side framework along with some new form controls (the code I’m going through here was written about a year ago).  Today, I’ll talk a little about some of the benefits and challenges of using AJAX in web user-interface design.&lt;br /&gt;&lt;br /&gt;This was one of those rare projects where we were given adequate time to do a good job, so I spent a lot of time thinking about what some of the challenges were going to be, both for this and future implementations. AJAX creates an illusion of immediacy to the user by bypassing many of the redundant processes of a typical postback.  Think about the lifecycle (we’ll do a simplified version) of an HTTP page request on the web.&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;The user makes a request by clicking a link or submitting a form&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The browser makes a request to the destination web server&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The browser receives the response as a text stream&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The response is de-serialized into a document object&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The page artifacts (images, video files, JavaScript and CSS files, etc) are identified, and latent HTTP calls are made for objects that are not available in the browser cache.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The browser paints the HTML page based on the document object and page artifacts&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;In an AJAX model, steps 4 - 6, are bypassed and the data from the request is simply inserted into the existing DOM.  Three fairly expensive and unnecessary processes (because they were handled with a prior request) have been replaced with a lightweight operation.  So how does an intrepid developer take advantage of this technological wizardry?  Basically, the same object that is used by the browser to make server request is exposed and can be accessed through JavaScript.&lt;br /&gt;&lt;br /&gt;It looks like this could get a bit long, so I think I’ll make it a trilogy.  In the next part, I’ll dig into the hows and whys of the framework I put together for the aforementioned project, and see where it goes from there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27956652-114875356174935552?l=jephs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jephs-blog.blogspot.com/feeds/114875356174935552/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27956652&amp;postID=114875356174935552' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/114875356174935552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/114875356174935552'/><link rel='alternate' type='text/html' href='http://jephs-blog.blogspot.com/2006/05/rolling-your-own-ajax-part-1.html' title='Rolling Your Own AJAX (Part 1)'/><author><name>Jeff</name><uri>http://www.blogger.com/profile/15837962345983733147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://3.bp.blogspot.com/_VUsL3-cGq8k/SPD6-Moc5EI/AAAAAAAAAAU/7D23L72Hohk/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27956652.post-114852789272587522</id><published>2006-05-24T20:30:00.000-07:00</published><updated>2006-05-27T14:07:55.256-07:00</updated><title type='text'>The Skills that Don't Pay the Bills</title><content type='html'>The other day I was asked a question by a friend/co-worker about what skills are important to have for a developer today. Reflecting on the question, I think he wanted to know what skills make somebody a more attractive candidate on the job market. Of course rather than answer the question, I went off on a tangent regarding a recent pet peeve of mine.&lt;br /&gt;&lt;br /&gt;More and more, I'm finding that .Net developers are losing touch with &lt;a href="http://www.howstuffworks.com" target="newwindow"&gt;how things work&lt;/a&gt;. Microsoft has abstracted many programming functions to such a high-level, many people in the industry have forgotten (or no longer bother to learn) what's going on under the hood.  I suppose this is a natural and necessary evolution; the growth of the talent pool doesn't come close to the expansion of software development and implementation needs.  By dumbing the work down with every release, Microsoft expands the pool of workers while fostering a need for the latest software and training.&lt;br /&gt;&lt;br /&gt;The result is an increasing gap between programmers/engineers and coders.  So my answer to the original question was--try to be the former rather than the latter.  In many ways the distinction is subjective, but if I wanted to gauge somebody's programming abilities, here are some of the things I might ask.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Write a function that sorts an array.  Describe it in big-O notation.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Write the pseudocode for a simple XOR encryption algorithm&lt;/li&gt;&lt;br /&gt;&lt;li&gt;You have a table in a database with 1,000,000 rows and need to extract a single-specific record.  What is the maximum number of records that will need to be evaluated to return the required row if the column you're looking at has a clustered index vs non-indexed with unique values.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Write your own string-builder&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Design a custom cache mechanism&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;From what I've seen of the job market of late, it's unlikely these things are going to help one command a higher salary, but I think this depth of understanding is becoming a lost art in business software development.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27956652-114852789272587522?l=jephs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jephs-blog.blogspot.com/feeds/114852789272587522/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27956652&amp;postID=114852789272587522' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/114852789272587522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/114852789272587522'/><link rel='alternate' type='text/html' href='http://jephs-blog.blogspot.com/2006/05/skills-that-dont-pay-bills.html' title='The Skills that Don&apos;t Pay the Bills'/><author><name>Jeff</name><uri>http://www.blogger.com/profile/15837962345983733147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://3.bp.blogspot.com/_VUsL3-cGq8k/SPD6-Moc5EI/AAAAAAAAAAU/7D23L72Hohk/S220/me.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27956652.post-114766252943981259</id><published>2006-05-14T19:34:00.000-07:00</published><updated>2006-05-27T14:07:03.016-07:00</updated><title type='text'>So This is a Blog...</title><content type='html'>So I've been reading a lot of these blogs lately and figure it's time to throw my hat in the ring.  My name is Jeff, and I'm a web software engineer currently living in San Diego, having recently moved from the Boston area.  I've been a web developer for the past 8 years or so and have mostly worked in Microsoft technologies on the server side.&lt;br /&gt;&lt;br /&gt;Some of the topics I plan to tackle are architecture and design, coding practices, hiring and interviewing, and emerging technologies.  I'll also try to reflect on projects and jobs I've had in the past, and compare and contrast working on opposite coasts.  With any luck, I'll stick with it for a while.  Who knows, maybe somebody will even read it from time to time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27956652-114766252943981259?l=jephs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jephs-blog.blogspot.com/feeds/114766252943981259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27956652&amp;postID=114766252943981259' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/114766252943981259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27956652/posts/default/114766252943981259'/><link rel='alternate' type='text/html' href='http://jephs-blog.blogspot.com/2006/05/so-this-is-blog.html' title='So This is a Blog...'/><author><name>Jeff</name><uri>http://www.blogger.com/profile/15837962345983733147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://3.bp.blogspot.com/_VUsL3-cGq8k/SPD6-Moc5EI/AAAAAAAAAAU/7D23L72Hohk/S220/me.jpg'/></author><thr:total>0</thr:total></entry></feed>
