<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0" xml:base="http://developerkarma.com">
<channel>
 <title>Developer Karma</title>
 <link>http://developerkarma.com</link>
 <description />
 <language>en</language>
<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/developerkarma" /><feedburner:info uri="developerkarma" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>developerkarma</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
 <title>URL2QR: A bookmarklet to turn any URL into a QR Code</title>
 <link>http://feedproxy.google.com/~r/developerkarma/~3/yoM-uXUzV_8/url2qr-a-bookmarklet-turn-any-url-a-qr-code</link>
 <description>&lt;p&gt;How many times have you been developing a mobile website only to find out that you actually have to type in your horrible development URL into your mobile phone? Well moan no longer with the handy-dandy URL2QR. All you have to do is add this &lt;a href="http://en.wikipedia.org/wiki/Bookmarklet"&gt;bookmarklet&lt;/a&gt; to your browser and what ever page you visit will be turned into a &lt;a href="http://en.wikipedia.org/wiki/QR_Code"&gt;QR code&lt;/a&gt; for you to scan with your phone!&lt;/p&gt;
&lt;p&gt;Bookmarklet &amp;nbsp;&amp;nbsp;—-&amp;gt;&amp;nbsp;&amp;nbsp; &lt;a href="javascript:void(window.open('http://chart.apis.google.com/chart?cht=qr&amp;amp;chs=300x300&amp;amp;chl='+escape(document.location)));" title="URL2QR"&gt;URL2QR&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In short, this bookmarklet will take the URL of what you are browsing and bounce it off a &lt;a href="http://code.google.com/apis/chart/"&gt;Google API&lt;/a&gt; and produce a QR code for any mobile device to take a picture of and present you the link so you just have to click on it.&lt;/p&gt;
&lt;p&gt;Note: This is a repost from an old blog that I worked on but I don't think the old blog will remain in service much longer.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=yoM-uXUzV_8:ElXwuHqnkM4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=yoM-uXUzV_8:ElXwuHqnkM4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?i=yoM-uXUzV_8:ElXwuHqnkM4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=yoM-uXUzV_8:ElXwuHqnkM4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=yoM-uXUzV_8:ElXwuHqnkM4:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=yoM-uXUzV_8:ElXwuHqnkM4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?i=yoM-uXUzV_8:ElXwuHqnkM4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=yoM-uXUzV_8:ElXwuHqnkM4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?i=yoM-uXUzV_8:ElXwuHqnkM4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/developerkarma/~4/yoM-uXUzV_8" height="1" width="1"/&gt;</description>
 <category domain="http://developerkarma.com/tag/mobile">mobile</category>
 <category domain="http://developerkarma.com/tag/qr">qr</category>
 <pubDate>Tue, 01 Nov 2011 12:41:16 +0000</pubDate>
 <dc:creator>Andrew M Riley</dc:creator>
 <guid isPermaLink="false">1204 at http://developerkarma.com</guid>
<feedburner:origLink>http://developerkarma.com/blog/andrew-m-riley/url2qr-a-bookmarklet-turn-any-url-a-qr-code</feedburner:origLink></item>
<item>
 <title>Love &amp; Marriage, Quality Assurance &amp; Development</title>
 <link>http://feedproxy.google.com/~r/developerkarma/~3/m4JZQSkcdfo/love-marriage-quality-assurance-development</link>
 <description>&lt;p&gt;I've had the benefit of both doing Quality Assurance and Software Development for many years (usually not at the same time.) Interestingly enough, doing QA has made me a better developer and being a developer has made me better at writing comprehensive testplans. What astounds me about these two roles that work together on a nearly daily basis is they have a communication level that is lower than the US and Russia in the mid 80s.&lt;br /&gt;&lt;br /&gt;I find it hard to believe but nobody really talks about how QA should work with developers and how developers should work with QA. I've worked on great teams where communication has been great and "the talk" really isn't needed and I've worked on great teams where "the talk" needs to happen and QA/dev are ready to have a shoot out at high noon (Note: The talk is not the differentiator of a good or bad team)&lt;br /&gt;&lt;br /&gt;The QA Dev relationship is just that, a relationship, a marriage, the good, the bad, the ugly. It will have its ups and downs but the one thing that remains key to any type of good relationship is having a good basic understanding of your role in the relationship and communication. If you picked up on the fact that I said it would be one thing but listed two then you are probably on the QA side of the relationship.&lt;br /&gt;&lt;br /&gt;The following rules are not tied to any specific methodology and I don't get technical for things like coverage etc. This post is bring to light the interaction (or lack of) between the two parties.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;Basic Rules You Should Follow to Make Life Suck Less (BRYSFMLS)&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Your basic job:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;QA:&lt;/strong&gt; It is your job to break what the developer has created so the customer doesn't have to do that. Do not trust developers. Your job is not to trust, it is to evaluate documentation, run tests that either pass or fail and properly report your findings.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dev:&lt;/strong&gt; It is your job to turn over code that is as error free as possible (that means you actually testing the code before you hand it over). Your job is not to convince the tester that your way is the right way it is to evaluate the documentation and write code that satisfies the documentation/requirements in an efficient manner (both of your time and CPU/memory/database/etc).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Before you hand over your work:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;QA:&lt;/strong&gt; It is your job to come up with a test plan/test cases that adequately cover the codebase. If you have questions, ask them early in the project.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dev:&lt;/strong&gt; It is your job to make sure the docs are up to date (either you do it or have somebody else do it) before the tester gets it. QA cannot go off of what you tell them and they rarely have the understanding that you have of the project at that point. It is also your job to review test plan that QA creates, there will be hidden gotchas that QAs will never pick up from the docs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;When testing:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;QA:&lt;/strong&gt; You should come up with test cases that are more than a literal translation of your documentation. Learn to read between the lines, find the realistic test cases that will happen in the wild but aren't the exact requirement. Example: Calculate the age of a user using whole years. Your test cases should probably try someone who is born on a leap year and then calculate their birthday on their exact birthday of a non-leap year.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dev:&lt;/strong&gt; Before you hand over your code make sure your code works properly and that it follows what is outlined in your technical documentation. If there is something that you think may cause issues for QA or that QA might miss, test it yourself (and also let QA know about it and why you think it might be an issue.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;When you find a problem:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;QA:&lt;/strong&gt; It is your job to fully explain the problem as well as the steps you took to create it. If calculation is involved, show your work. By the time the sprint/project/whatever has ended up in your lap the developer has moved on to other sprints/projects/teams. Pretend the developer who will work on your ticket knows nothing about the program and might have been hired that morning from a third grade class.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dev:&lt;/strong&gt; If a QA sends you an incorrect ticket, don't just reply with "you're wrong" or "DUH". Educate your tester of why it is wrong (using facts, do not try to sway them). If you are unsure of which party is right, do not assume you are right because you are awesome. Raise the question to the lead/manager/client and get a real decision.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;When working with tickets:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;QA:&lt;/strong&gt; A developer can never have too much information. Include a writeup of the issue, what you were expecting, why you were expecting it (cite your sources) and if you can, images and videos help the developer too.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dev:&lt;/strong&gt; Never reply with "fixed" or "wrong" or other useless one word phrases. A tester can never have too much information in the reply. Include a writeup of why the tester was right/wrong (cite your sources), what has changed and what you think could be affected by your changes. If what you are seeing doesn't match up with the tester feel free to take screenshots and/or videos to help convey what you are experiencing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;When to automate testing:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;QA:&lt;/strong&gt; If you can automate/record your testing for re-running later, do it. Make this available for the developers to re-run when they are developing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dev:&lt;/strong&gt; If you can automate/record your testing for re-running later, do it. Make this available for QA to re-run when they are testing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;When to be embarrassed:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;QA:&lt;/strong&gt; When you fail to execute the test plan properly (it should be following steps by that point) or you let the developer convince you that a requirement is incorrect and you don't verify it with a third party.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dev:&lt;/strong&gt; When you turn over code that is completely broken. Your pre-QA testing should have caught these things. You are wasting QAs time. Also, when you convince QA that your code is correct and the docs are wrong without 1) going to a third party 2) updating the documentation (your job is to code, not to be God of All Logic in the World).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;When not to be embarrassed:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;QA:&lt;/strong&gt; When a bug is found after you have tested the code. QA is a third party that tests the software to catch bugs that developers might have missed. QA is not a fail proof method to remove all bugs from software.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dev:&lt;/strong&gt; When QA finds a bug in your software. That is their job, don't get huffy, evaluate the bug, fix it and properly document the changes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;When to talk to your significant other:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Both:&lt;/strong&gt; When you keep passing back and forth tickets but nothing is getting done.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;When to get pissed off/annoyed/angry:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Both:&lt;/strong&gt; Never, see the rules above to identify which rule(s) you are not following. Remember, you both have the same goal, put out a good product within a timely manor.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=m4JZQSkcdfo:BfIBWmiaW8M:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=m4JZQSkcdfo:BfIBWmiaW8M:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?i=m4JZQSkcdfo:BfIBWmiaW8M:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=m4JZQSkcdfo:BfIBWmiaW8M:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=m4JZQSkcdfo:BfIBWmiaW8M:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=m4JZQSkcdfo:BfIBWmiaW8M:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?i=m4JZQSkcdfo:BfIBWmiaW8M:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=m4JZQSkcdfo:BfIBWmiaW8M:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?i=m4JZQSkcdfo:BfIBWmiaW8M:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/developerkarma/~4/m4JZQSkcdfo" height="1" width="1"/&gt;</description>
 <category domain="http://developerkarma.com/general/developer">developer</category>
 <category domain="http://developerkarma.com/tag/qa">qa</category>
 <pubDate>Fri, 26 Aug 2011 13:19:12 +0000</pubDate>
 <dc:creator>Andrew M Riley</dc:creator>
 <guid isPermaLink="false">1203 at http://developerkarma.com</guid>
<feedburner:origLink>http://developerkarma.com/blog/andrew-m-riley/love-marriage-quality-assurance-development</feedburner:origLink></item>
<item>
 <title>#082: Google Analytics</title>
 <link>http://feedproxy.google.com/~r/developerkarma/~3/Gid0NDOysVs/082-google-analytics</link>
 <description>&lt;iframe width="560" height="349" src="https://www.youtube.com/embed/lDsd60hgnSc?rel=0" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;I'm trying out changing the podcast over to a screencast to save time typing up notes and give more to the user (by actually seeing what I'm talking about.) Please note, this is far more "from the hip" than the podcast used to be so who knows what I'm going to say.&lt;/p&gt;
&lt;p&gt;P.S. I'm still creating the audio podcast, it just comes from the screencast.&lt;/p&gt;&lt;div class="field field-type-filefield field-field-mp3"&gt;
    &lt;div class="field-items"&gt;
            &lt;div class="field-item odd"&gt;
                    &lt;div class="filefield-file"&gt;&lt;img class="filefield-icon field-icon-audio-mpeg"  alt="audio/mpeg icon" src="https://d10c90dzqtbrfd.cloudfront.net/modules/acquia/filefield/icons/audio-x-generic.png" /&gt;&lt;a href="http://developerkarma.com/sites/developerkarma.com/files/podcast/2010/082-google_analytics.mp3" type="audio/mpeg; length=4125148"&gt;082-google_analytics.mp3&lt;/a&gt;&lt;/div&gt;        &lt;/div&gt;
        &lt;/div&gt;
&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=Gid0NDOysVs:8yWplwOJrz8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=Gid0NDOysVs:8yWplwOJrz8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?i=Gid0NDOysVs:8yWplwOJrz8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=Gid0NDOysVs:8yWplwOJrz8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=Gid0NDOysVs:8yWplwOJrz8:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=Gid0NDOysVs:8yWplwOJrz8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?i=Gid0NDOysVs:8yWplwOJrz8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=Gid0NDOysVs:8yWplwOJrz8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?i=Gid0NDOysVs:8yWplwOJrz8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/developerkarma/~4/Gid0NDOysVs" height="1" width="1"/&gt;</description>
 <category domain="http://developerkarma.com/general/drupal">drupal</category>
 <category domain="http://developerkarma.com/podcast/module-a-day">Module a Day</category>
 <pubDate>Tue, 28 Jun 2011 12:39:48 +0000</pubDate>
 <dc:creator>Andrew M Riley</dc:creator>
 <guid isPermaLink="false">1202 at http://developerkarma.com</guid>
<feedburner:origLink>http://developerkarma.com/podcasts/drupal/2011/06/082-google-analytics</feedburner:origLink></item>
<item>
 <title>Geolocation of your users based on IP address (how to)</title>
 <link>http://feedproxy.google.com/~r/developerkarma/~3/Mj5ZB8VRBqA/geolocation-your-users-based-ip-address-how</link>
 <description>&lt;p&gt;Have you ever needed to find out where a site visitor physically was for something beyond analytics?  I'm talking about things like finding your user on a map or locations of Store X within 50 miles of the user’s current location.  Well, I have, and I've found there's not really one solution that fits all users.  Sometimes I find myself having to mix methods to provide the best overall user experience and/or changing up my execution depending on my needs.&lt;/p&gt;
&lt;p&gt;For the most part you can break it down to three questions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Am I using this on mobile? (Go HTML5)&lt;/li&gt;
&lt;li&gt;Do I want to spend money? (If No: Go Google.load() with backup)&lt;/li&gt;
&lt;li&gt;Do I need to process this data at a later time (batch processing) or don’t want to rely on outside services? (Go Local Database)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;One note about mobile: Most of the services below will look up the IP to the address of who's registered it (the ISP) instead of where it is being served from.  The best example is using a Local Database with my phone; it claims that I'm in Alabama when I'm really in Florida.  It turns out the IP address is registered to some place in Alabama.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Local Database&lt;/h3&gt;
&lt;p&gt;Local databases do have a lot to offer if you are willing to invest both time and money.  I tend to use this type of service when I need to do back end processing on the IP addresses. It's perfectly fine to use this for real time IP address geolocation lookups, but there are other options that are cheaper and easier if that is all you are using it for.  If you are using this method for mobile, I would recommend that the finest resolution you can trust is Country.&lt;/p&gt;
&lt;p&gt;This method requires you purchasing a database dump or CSV file and then importing it to your local database server.  The company you are purchasing from will usually provide an API of how to pull the data from your database and or do special conversions. Every few months or so the company will email you to notify you there is an update.  At this point you'll need to go through and repeat the process to update your database.  If this paragraph scares you, then please don't go with this method.&lt;/p&gt;
&lt;p&gt;Some providers will also provide you with binary files to avoid using a local database.  I usually skip this method since having hundreds of thousands users hitting my server in a day all read from a series of files on my file system scares me.&lt;/p&gt;
&lt;dt&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/dt&gt; &lt;dd&gt;maxmind (&lt;a href="http://www.maxmind.com/app/ip-location"&gt;link&lt;/a&gt;) / ip2location (&lt;a href="http://www.ip2location.com/"&gt;link&lt;/a&gt;)&lt;/dd&gt;&lt;dd&gt; &lt;/dd&gt;&lt;dt&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/dt&gt; &lt;dd&gt;Unlimited queries if you host in your own database, Returns Latitude, longitude and other information*. Can use this one off-line (aka, not real time while the visitor is on your site). Doesn’t rely on third party services.&lt;/dd&gt; &lt;dt&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/dt&gt; &lt;dd&gt;Costs money, Needs to be updated on a regular basis, Can have wrong location for mobile&lt;/dd&gt; &lt;dt&gt;&lt;strong&gt;When to use:&lt;/strong&gt;&lt;/dt&gt; &lt;dd&gt;When you have a lot of lookups to do and don't really care about mobile ,or you are going to be doing your lookups as part of a batch process behind the scenes.&lt;/dd&gt;&lt;dd&gt;&lt;br /&gt;&lt;/dd&gt;&lt;dd&gt;&lt;br /&gt;&lt;/dd&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;HTML5&lt;/h3&gt;
&lt;p&gt;HTML5 is now really a conglomerate of web based technologies that are supposed to make our lives easier.  The geolocation API is one of those technologies.&lt;/p&gt;
&lt;p&gt;GPS is the reason this method truly shines in mobile.  Most phones will allow the geolocation API pull directly from GPS and then fall back to tower triangulation.  Either way, you get a fairly accurate location.  Do keep in mind, though, that this technology only provides latitude and longitude.  You would have to use a separate service to find out what State/County/Country the user is located in.&lt;/p&gt;
&lt;p&gt;The only big downside I see is on most phones/browsers it pops down a dialog that asks the user if they want to divulge their location.  This sometimes runs into issues since users can just hit "no".  It's also not a great user experience since now they have to hit yet another button just to use your site.&lt;/p&gt;
&lt;dt&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/dt&gt; &lt;dd&gt;&lt;a href="http://html5demos.com/geo" target="_blank"&gt;http://html5demos.com/geo&lt;/a&gt;&lt;/dd&gt; &lt;dt&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/dt&gt; &lt;dd&gt;Free, Works well on mobile, Unlimited queries since it's client side&lt;/dd&gt; &lt;dt&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/dt&gt; &lt;dd&gt;Needs a modern browser, Asks the user to determine your location, Only returns latitude &amp;amp; longitude&lt;/dd&gt; &lt;dt&gt;&lt;strong&gt;When to use:&lt;/strong&gt;&lt;/dt&gt; &lt;dd&gt;Use this when you are using mobile without a doubt. There are libraries that will make it easy to use on most phones. You can use it in desktop browsers but remember that not all browsers support it.&lt;/dd&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Google.load()&lt;/h3&gt;
&lt;p&gt;Google.load() was not created to do geolocation lookups. In fact, it is created to load handy javascript libraries from a central CDN.  It just happens to pass back an object that contains latitude, longitude, city, state and country.&lt;/p&gt;
&lt;p&gt;I enjoy using this method on desktop based websites since I already have to use a library like jQuery.  I just tell it to load jQuery from google.load() and I happen to get the location data tacked on as part of an object.  This provides a good user experience since they don't have to click on anything and a good experience for my server since I don't have to do yet another request to my server (or anybody's server for that matter).&lt;/p&gt;
&lt;p&gt;This method does have one huge drawback, you can’t trust it to work reliably.  On cell phones if the object is empty (aka, it didn't work), I use the HTML5 method to I cover my bases and provide a good all around user experience.  On the desktop if the object is empty, I fall back to using a Local Database call.&lt;/p&gt;
&lt;p&gt;Note: I have tested this method on multiple phones with mixed results.  You can't trust that this will work on ALL phones with ALL versions.&lt;/p&gt;
&lt;dt&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/dt&gt; &lt;dd&gt;&lt;a href="http://files.developerkarma.com/geo.html" target="_blank"&gt;http://files.developerkarma.com/geo.html&lt;/a&gt;&lt;/dd&gt; &lt;dt&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/dt&gt; &lt;dd&gt;Free, Unlimited queries, Returns latitude, longitude and other information&lt;/dd&gt; &lt;dt&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/dt&gt; &lt;dd&gt;It works on some mobile phone browsers and not others.  International results may or may not work.&lt;/dd&gt; &lt;dt&gt;&lt;strong&gt;When to use:&lt;/strong&gt;&lt;/dt&gt; &lt;dd&gt;When you're doing desktop development and you want a fast result without having to do a second call (most of the time). It's a bonus that you can load your favorite javascript library as part of this.&lt;/dd&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;In Closing&lt;/h2&gt;
&lt;p&gt;Please remember that Geographical Information Systems are just large databases of rather poor data created by humans.  There will be errors, omissions and oddities no matter which method you use.  Even if you somehow manage to use all the methods listed above I couldn’t guarantee 100% accuracy or even 100% results.  Write your code to fail gracefully and give your users options to work around these issues when you can.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=Mj5ZB8VRBqA:ojRGgEozpOY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=Mj5ZB8VRBqA:ojRGgEozpOY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?i=Mj5ZB8VRBqA:ojRGgEozpOY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=Mj5ZB8VRBqA:ojRGgEozpOY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=Mj5ZB8VRBqA:ojRGgEozpOY:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=Mj5ZB8VRBqA:ojRGgEozpOY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?i=Mj5ZB8VRBqA:ojRGgEozpOY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=Mj5ZB8VRBqA:ojRGgEozpOY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?i=Mj5ZB8VRBqA:ojRGgEozpOY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/developerkarma/~4/Mj5ZB8VRBqA" height="1" width="1"/&gt;</description>
 <category domain="http://developerkarma.com/tag/api">api</category>
 <category domain="http://developerkarma.com/tag/database">database</category>
 <category domain="http://developerkarma.com/tag/geolocation">geolocation</category>
 <category domain="http://developerkarma.com/tag/gis">gis</category>
 <category domain="http://developerkarma.com/general/google">google</category>
 <category domain="http://developerkarma.com/tag/gps">gps</category>
 <category domain="http://developerkarma.com/tag/how">how to</category>
 <category domain="http://developerkarma.com/tag/ip">ip</category>
 <category domain="http://developerkarma.com/tag/latitude">latitude</category>
 <category domain="http://developerkarma.com/tag/longitude">longitude</category>
 <category domain="http://developerkarma.com/tag/mobile">mobile</category>
 <pubDate>Wed, 16 Feb 2011 02:15:38 +0000</pubDate>
 <dc:creator>Andrew M Riley</dc:creator>
 <guid isPermaLink="false">1200 at http://developerkarma.com</guid>
<feedburner:origLink>http://developerkarma.com/blog/andrew-m-riley/geolocation-your-users-based-ip-address-how</feedburner:origLink></item>
<item>
 <title>DrupalCamp Atlanta: All CMSs are NOT created equal</title>
 <link>http://feedproxy.google.com/~r/developerkarma/~3/HmwEmdA7Ais/drupalcamp-atlanta-all-cmss-are-not-created-equal</link>
 <description>&lt;p&gt;A few months ago I had the privilege of speaking at DrupalCamp Atlanta. &amp;nbsp;The talk I gave covered the CMS selection process across multiple languages with Open and Closed source Content Management Systems. &amp;nbsp;While at first glance it might appear an easy choice to go to your usual CMS, it might not always be the right choice. Please &lt;a href="http://drupalcampatlanta.com/sessions/not-all-cmss-are-created-equally" target="_blank"&gt;watch the video&lt;/a&gt; and &lt;a href="http://www.slideshare.net/andrewmriley/drupalcamp-atl-2010-not-all-cmss-are-created-equal" target="_blank"&gt;go through the slideshow&lt;/a&gt; to find out what points I measured against for multiple large clients.&lt;/p&gt;
&lt;p&gt;Thanks to my employer, &lt;a href="http://www.mindcomet.com/" target="_blank"&gt;MindComet for sponsoring multiple regional Open Source DrupalCamps&lt;/a&gt; throughout 2010.&lt;/p&gt;
&lt;div id="__ss_5341286" style="width: 425px;"&gt;&lt;strong style="display: block; margin: 12px 0 4px;"&gt;&lt;br /&gt;&lt;/strong&gt; 
&lt;object id="__sse5341286" width="425" height="355"&gt;
&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=workingupload-101002125737-phpapp01&amp;amp;stripped_title=drupalcamp-atl-2010-not-all-cmss-are-created-equal&amp;amp;userName=andrewmriley" /&gt;
&lt;param name="allowFullScreen" value="true" /&gt;
&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=workingupload-101002125737-phpapp01&amp;amp;stripped_title=drupalcamp-atl-2010-not-all-cmss-are-created-equal&amp;amp;userName=andrewmriley" name="__sse5341286" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;
&lt;/object&gt;
&lt;/div&gt;
&lt;script src="http://b.scorecardresearch.com/beacon.js?c1=7&amp;amp;c2=7400849&amp;amp;c3=1&amp;amp;c4=&amp;amp;c5=&amp;amp;c6="&gt;&lt;/script&gt;
&lt;script src="http://b.scorecardresearch.com/beacon.js?c1=7&amp;amp;c2=7400849&amp;amp;c3=1&amp;amp;c4=&amp;amp;c5=&amp;amp;c6="&gt;&lt;/script&gt;
&lt;script src="http://b.scorecardresearch.com/beacon.js?c1=7&amp;amp;c2=7400849&amp;amp;c3=1&amp;amp;c4=&amp;amp;c5=&amp;amp;c6="&gt;&lt;/script&gt;
&lt;script src="http://b.scorecardresearch.com/beacon.js?c1=7&amp;amp;c2=7400849&amp;amp;c3=1&amp;amp;c4=&amp;amp;c5=&amp;amp;c6="&gt;&lt;/script&gt;
&lt;script src="http://b.scorecardresearch.com/beacon.js?c1=7&amp;amp;c2=7400849&amp;amp;c3=1&amp;amp;c4=&amp;amp;c5=&amp;amp;c6="&gt;&lt;/script&gt;
&lt;script src="http://b.scorecardresearch.com/beacon.js?c1=7&amp;amp;c2=7400849&amp;amp;c3=1&amp;amp;c4=&amp;amp;c5=&amp;amp;c6="&gt;&lt;/script&gt;
&lt;script src="http://b.scorecardresearch.com/beacon.js?c1=7&amp;amp;c2=7400849&amp;amp;c3=1&amp;amp;c4=&amp;amp;c5=&amp;amp;c6="&gt;&lt;/script&gt;
&lt;script src="http://b.scorecardresearch.com/beacon.js?c1=7&amp;amp;c2=7400849&amp;amp;c3=1&amp;amp;c4=&amp;amp;c5=&amp;amp;c6="&gt;&lt;/script&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=HmwEmdA7Ais:PuTGe3rd24c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=HmwEmdA7Ais:PuTGe3rd24c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?i=HmwEmdA7Ais:PuTGe3rd24c:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=HmwEmdA7Ais:PuTGe3rd24c:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=HmwEmdA7Ais:PuTGe3rd24c:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=HmwEmdA7Ais:PuTGe3rd24c:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?i=HmwEmdA7Ais:PuTGe3rd24c:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=HmwEmdA7Ais:PuTGe3rd24c:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?i=HmwEmdA7Ais:PuTGe3rd24c:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/developerkarma/~4/HmwEmdA7Ais" height="1" width="1"/&gt;</description>
 <category domain="http://developerkarma.com/tag/atlanta">atlanta</category>
 <category domain="http://developerkarma.com/general/drupal">drupal</category>
 <category domain="http://developerkarma.com/tag/drupalcamp">drupalcamp</category>
 <category domain="http://developerkarma.com/tag/mindcomet">mindcomet</category>
 <pubDate>Tue, 28 Dec 2010 13:35:03 +0000</pubDate>
 <dc:creator>Andrew M Riley</dc:creator>
 <guid isPermaLink="false">1199 at http://developerkarma.com</guid>
<feedburner:origLink>http://developerkarma.com/blog/andrew-m-riley/drupalcamp-atlanta-all-cmss-are-not-created-equal</feedburner:origLink></item>
<item>
 <title>A Modest Drupal Proposal</title>
 <link>http://feedproxy.google.com/~r/developerkarma/~3/i5zv04ecn_g/modest-drupal-proposal</link>
 <description>&lt;p&gt;I am often presented with visions of poor and haggard open source enthusiasts walking the streets in disarray and varying degrees of sanity.&amp;nbsp; These programmers, artists and content managers could be working for upstanding corporations earning an honest dollar, instead they sit around working on projects with no monetary value.&amp;nbsp; It's bad enough that we have hordes of these people already but sadly they are training a new generation of open source zealots to tread in their meaningless empty footsteps.&lt;br /&gt;&lt;br /&gt;It is commonly agreed upon that the only software worth producing is "enterprise" that is controlled by a single corporation.&amp;nbsp; The unguided masses swear that a large distributed developer base is an alternative and possibly better solution to proprietary software.&amp;nbsp; Why have thousands of people from various backgrounds work towards one goal when you can't fire them?&amp;nbsp; How can you trust the aim of an unguided group that isn't driven by fear or money?&lt;br /&gt;&lt;br /&gt;It is with this proposal that I suggest a solution to these problems.&amp;nbsp; We need a comprehensive plan that will segment off the existing community along with those they wish to teach.&amp;nbsp; I propose we create a meeting intended to draw in the masses with promises of openness, education and networking.&amp;nbsp; Once these misguided souls are all corralled into one location we'll leave them there for a weekend.&amp;nbsp; A weekend together in their own chaos and squalor will surely show them the errors of their good natured ways as well as scare away potential followers.&lt;br /&gt;&lt;br /&gt;This solution is not immaterial, it has a name, a time and a place.&amp;nbsp; It is called Florida DrupalCamp and it will be hosted at &lt;a href="http://www.mindcomet.com" target="_blank"&gt;MindComet&lt;/a&gt; on Feb 20th and 21st.&amp;nbsp; If you know someone who needs to understand the dark and dangerous path they are heading down, please send them.&amp;nbsp; This is a problem we all need to help fix.&amp;nbsp; For more information: &lt;a href="http://2010.fldrupalcamp.org" target="_blank"&gt;http://2010.fldrupalcamp.org&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;------&lt;br /&gt;&lt;br /&gt;Just in case you took me seriously, this entire post is satire/sarcasm and based off of Jonathan Swift's "A Modest Proposal" in an effort to get people to pay attention to the FL Drupal Camp.&lt;/p&gt;
&lt;p&gt;This is the second Florida DrupalCamp and it is shaping up to be bigger and better than the prior years.&amp;nbsp; This year we'll feature three separate tracks of learning, have speakers from all over country and did I mention it's catered?&lt;br /&gt;&lt;br /&gt;In addition to us doing our standard *camp activities we'll be hosing a special second day that isn't in camp format.&amp;nbsp; Instead of covering topics we'll be building a website in one day for a Florida based nonprofit.&amp;nbsp; While we're building the site we'll be pairing up Drupal experts with people who are new to Drupal in an effort to help a charity as well as teach the next generation of Drupal Experts.&amp;nbsp; To find out more about Coding for a Cause please visit &lt;a href="http://2010.fldrupalcamp.org/coding-cause-application" target="_blank"&gt;http://2010.fldrupalcamp.org/coding-cause-application&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=i5zv04ecn_g:kRXizYrKzfE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=i5zv04ecn_g:kRXizYrKzfE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?i=i5zv04ecn_g:kRXizYrKzfE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=i5zv04ecn_g:kRXizYrKzfE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=i5zv04ecn_g:kRXizYrKzfE:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=i5zv04ecn_g:kRXizYrKzfE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?i=i5zv04ecn_g:kRXizYrKzfE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=i5zv04ecn_g:kRXizYrKzfE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?i=i5zv04ecn_g:kRXizYrKzfE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/developerkarma/~4/i5zv04ecn_g" height="1" width="1"/&gt;</description>
 <comments>http://developerkarma.com/blog/andrew-m-riley/modest-drupal-proposal#comments</comments>
 <category domain="http://developerkarma.com/general/drupal">drupal</category>
 <category domain="http://developerkarma.com/tag/drupal-planet">drupal planet</category>
 <category domain="http://developerkarma.com/tag/drupalcamp">drupalcamp</category>
 <category domain="http://developerkarma.com/tag/open-source">open source</category>
 <pubDate>Mon, 18 Jan 2010 16:39:34 +0000</pubDate>
 <dc:creator>Andrew M Riley</dc:creator>
 <guid isPermaLink="false">1106 at http://developerkarma.com</guid>
<feedburner:origLink>http://developerkarma.com/blog/andrew-m-riley/modest-drupal-proposal</feedburner:origLink></item>
<item>
 <title>Drupal API should not require hook_facepalm</title>
 <link>http://feedproxy.google.com/~r/developerkarma/~3/NOTdtBl-BFU/drupal-api-should-not-require-hook-facepalm</link>
 <description>&lt;p&gt;&lt;img src="/sites/developerkarma.com/files/u2/facepalm2.jpg" title="Facepalm - Because expressing how dumb that was in words just doesn't work." width="300" height="247" style="float:right;margin:0 0 10px 10px" /&gt;How many times have you been coding something and it doesn't work even though you've used an api/function call hundreds of times before?&amp;nbsp; I ran into this the other day with node_load().&amp;nbsp; For those of you use the node_load function, can you tell me how many arguments it has and what those arguments do (without looking at &lt;a href="http://api.drupal.org" target="_blank"&gt;api.drupal.org&lt;/a&gt;?&amp;nbsp; I know, some gurus can, but can the average module developer do it?)&lt;/p&gt;
&lt;!--break--&gt;
&lt;p&gt;In this instance, I created a module that was updating data from a MSSQL install on existing nodes.&amp;nbsp; After I did my node save I needed to do a &lt;a href="http://api.drupal.org/api/function/node_load/6" target="_blank"&gt;node_load&lt;/a&gt; of the node I created/modified (some steps happened in between with other modules), modify some of the data and then save it again.&amp;nbsp; The only problem is, when I did my second &lt;a href="http://api.drupal.org/api/function/node_save" target="_blank"&gt;node_save()&lt;/a&gt; my first save's data was wiped out.&amp;nbsp; After turning on debugging I found that my first (SQL) update worked properly but my second update was using data from before my first update.&amp;nbsp; How could that be, I did a second node_load (they were in different functions)?&amp;nbsp; It turns out that node_load was using a cached version of the node.&lt;/p&gt;
&lt;p&gt;I'm not dogging the internals of node_load, it's a fine function and if I was a sailor on leave at a bar, I would ask it to dance.&amp;nbsp; In fact, I've had to employ it's caching abilities quite often so don't take this as some type of Drupal sucks post, I hate the core developers or cheesy link bait.&lt;/p&gt;
&lt;p&gt;What I was doing isn't really the point of this post nor is how node_load works.&amp;nbsp; It's the argument order and the default argument that I'm against.&amp;nbsp; Yes, I'm writing a ~200 word post about three arguments in one function.&amp;nbsp; I don't like the fact that the third argument, "reset" is defaulted.&amp;nbsp; There, I've said it.&amp;nbsp; The entire problem I had (yes, it was my fault) would have been much easier to debug if the argument did not have a default value.&amp;nbsp; This way, when I called node_load(123) I would have received a PHP error stating that I was missing an argument for the function.&amp;nbsp; Think about it, if there is no default, you would have to put true or false there (in this case, it would have forced me to read the documents).&lt;/p&gt;
&lt;p&gt;I am aware that having an API use sane defaults is SOP and this issue affects a fraction of a fraction of developers but I believe it's a bad practice that encourages programmers to not pay attention (I know, I know, I rush, I'm the king of this.&amp;nbsp; On the other hand don't most developers have some type of impending deadline?)&lt;/p&gt;
&lt;p&gt;So what's the point of this rambling tirade?&amp;nbsp; In the small scope I want the order of node_load to be changed and one of the defaults to be removed (Drupal 8 perhaps).&amp;nbsp; For the big scope I would like to hear from the community about other functions that have defaults that might hide bugs.&amp;nbsp; I'm not just doing this because I'm too stupid to read the docs, I would like to move forward for D8 in reviewing the API for these types of gotchas that can seriously lower the frustration level of non-Drupal-guru developers.&amp;nbsp; Please let me know your thoughts.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=NOTdtBl-BFU:yfehgHyyISw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=NOTdtBl-BFU:yfehgHyyISw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?i=NOTdtBl-BFU:yfehgHyyISw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=NOTdtBl-BFU:yfehgHyyISw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=NOTdtBl-BFU:yfehgHyyISw:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=NOTdtBl-BFU:yfehgHyyISw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?i=NOTdtBl-BFU:yfehgHyyISw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=NOTdtBl-BFU:yfehgHyyISw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?i=NOTdtBl-BFU:yfehgHyyISw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/developerkarma/~4/NOTdtBl-BFU" height="1" width="1"/&gt;</description>
 <comments>http://developerkarma.com/blog/andrew-m-riley/drupal-api-should-not-require-hook-facepalm#comments</comments>
 <category domain="http://developerkarma.com/tag/api">api</category>
 <category domain="http://developerkarma.com/general/drupal">drupal</category>
 <category domain="http://developerkarma.com/tag/facepalm">facepalm</category>
 <pubDate>Sun, 22 Nov 2009 17:11:27 +0000</pubDate>
 <dc:creator>Andrew M Riley</dc:creator>
 <guid isPermaLink="false">1104 at http://developerkarma.com</guid>
<feedburner:origLink>http://developerkarma.com/blog/andrew-m-riley/drupal-api-should-not-require-hook-facepalm</feedburner:origLink></item>
<item>
 <title>I need your help</title>
 <link>http://feedproxy.google.com/~r/developerkarma/~3/ZJYjtLeGbcw/i-need-your-help</link>
 <description>&lt;p&gt;
Have you ever wanted to give money or services to a charity but you just didn't have the time or the cash to be able to do that?  Well, now you and I have no excuses since &lt;a href="http://www.communicause.com" target="_blank"&gt;CommuniCause&lt;/a&gt; has now launched and all you have to do is either enter the information on the website or &lt;a href="http://twitter.com" target="_blank"&gt;tweet&lt;/a&gt; a special &lt;a href="http://en.wikipedia.org/wiki/Hashtag#Hash_tags" target="_blank"&gt;hashtag&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.communicause.com" target="_blank"&gt;CommuniCause is &amp;quot;a campaign that gives America the opportunity to vote online for their
favorite 501c3 non profit to win a $25,000 social media makeover&amp;quot;&lt;/a&gt; which I think is a great idea since most charities I know are struggling just to keep things going and barely have any type of web presence.  By winning this type of contest it allows a charity to get into an arena they possibly never would have been able to enter and really get their name and message out there.
&lt;/p&gt;
&lt;p&gt;
I need your suggestions of charities since I don't know which charity I should nominate/vote for (I hardly know of any charities).  Could you, my readers suggest charities in the comments as well as vote on CommuniCause?  Once I choose the charity, I'll add the CommuniCause banner to this site so everybody can see it.
&lt;!--break--&gt;
&lt;/p&gt;
&lt;p&gt;
My loose criteria for a charity:
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;It should help children&lt;/li&gt;
	&lt;li&gt;I would prefer it to be non-religious&lt;/li&gt;
	&lt;li&gt;It shouldn't be superfluous&lt;/li&gt;
	&lt;li&gt;In the state of Florida would be nice but not required &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
&amp;quot;Isn't your blog post just a contest for a contest?&amp;quot;  No, I just need help in finding charities out there, I'll admit it, I only know a few charities and I need to expand my horizons.  I highly encourage you to go to the actual CommuniCause website and vote for your charity but I also want you to come back here and educate me about the charities.&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Disclaimer: I am a &lt;a href="http://www.mindcomet.com" target="_blank"&gt;MindComet&lt;/a&gt; employee (MindComet is the company that is donating the $25,000 of Social Media services) and I'll probably be posting more than one post about CommuniCause over the next few months.
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=ZJYjtLeGbcw:-qfLhPWRMTA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=ZJYjtLeGbcw:-qfLhPWRMTA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?i=ZJYjtLeGbcw:-qfLhPWRMTA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=ZJYjtLeGbcw:-qfLhPWRMTA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=ZJYjtLeGbcw:-qfLhPWRMTA:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=ZJYjtLeGbcw:-qfLhPWRMTA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?i=ZJYjtLeGbcw:-qfLhPWRMTA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=ZJYjtLeGbcw:-qfLhPWRMTA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?i=ZJYjtLeGbcw:-qfLhPWRMTA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/developerkarma/~4/ZJYjtLeGbcw" height="1" width="1"/&gt;</description>
 <category domain="http://developerkarma.com/tag/charity">charity</category>
 <category domain="http://developerkarma.com/tag/children">children</category>
 <category domain="http://developerkarma.com/tag/communicause">communicause</category>
 <category domain="http://developerkarma.com/tag/community">community</category>
 <category domain="http://developerkarma.com/tag/mindcomet">mindcomet</category>
 <category domain="http://developerkarma.com/tag/money">money</category>
 <pubDate>Tue, 28 Apr 2009 12:14:06 +0000</pubDate>
 <dc:creator>Andrew M Riley</dc:creator>
 <guid isPermaLink="false">1084 at http://developerkarma.com</guid>
<feedburner:origLink>http://developerkarma.com/blog/andrew-m-riley/i-need-your-help</feedburner:origLink></item>
<item>
 <title>New Drupal Easy Podcast</title>
 <link>http://feedproxy.google.com/~r/developerkarma/~3/XsWT74_PQeg/new-drupal-easy-podcast</link>
 <description>&lt;p&gt;
Just wanted to let you know that there's a new DrupalEasy podcast (#3) now out there.  If you haven't listened to  our podcast I'd highly recommend that you do if you do any work at all with Drupal (or if you're interested in working with Drupal).  We cover, Drupalcon, SXSW, Setting up a Drupal Theme with Artisteer, the 2009 Google Summer of Code and of course, our module picks of the week!
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://drupaleasy.com/podcast/2009/03/drupaleasy-podcast-03-andrew-hearts-fields-api" target="_blank"&gt;Check it out, it's free and no animals were hurt in the recording of this podcast. &lt;/a&gt;&lt;!--break--&gt;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=XsWT74_PQeg:b3IPdFPdaGg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=XsWT74_PQeg:b3IPdFPdaGg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?i=XsWT74_PQeg:b3IPdFPdaGg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=XsWT74_PQeg:b3IPdFPdaGg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=XsWT74_PQeg:b3IPdFPdaGg:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=XsWT74_PQeg:b3IPdFPdaGg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?i=XsWT74_PQeg:b3IPdFPdaGg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=XsWT74_PQeg:b3IPdFPdaGg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?i=XsWT74_PQeg:b3IPdFPdaGg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/developerkarma/~4/XsWT74_PQeg" height="1" width="1"/&gt;</description>
 <comments>http://developerkarma.com/blog/andrew-m-riley/new-drupal-easy-podcast#comments</comments>
 <category domain="http://developerkarma.com/general/drupal">drupal</category>
 <category domain="http://developerkarma.com/tag/drupaleasy">drupaleasy</category>
 <category domain="http://developerkarma.com/tag/podcast">podcast</category>
 <pubDate>Thu, 26 Mar 2009 11:03:33 +0000</pubDate>
 <dc:creator>Andrew M Riley</dc:creator>
 <guid isPermaLink="false">1077 at http://developerkarma.com</guid>
<feedburner:origLink>http://developerkarma.com/blog/andrew-m-riley/new-drupal-easy-podcast</feedburner:origLink></item>
<item>
 <title>On my way to Drupalcon DC (2009)</title>
 <link>http://feedproxy.google.com/~r/developerkarma/~3/In5NT4PPpx0/my-way-drupalcon-dc-2009</link>
 <description>&lt;p&gt;I'll be leaving for a few days to attend this years US Drupalcon with both the &lt;a href="http://www.mindcomet.com" target="_blank"&gt;Mindcomet crew&lt;/a&gt; and &lt;a href="http://www.drupaleasy.com" target="_blank"&gt;DrupalEasy crew&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;If you happen to see me and you follow my &lt;a href="http://developerkarma.com"&gt;blog&lt;/a&gt;, &lt;a href="http://www.twitter.com/andrewmriley" target="_blank"&gt;twitter&lt;/a&gt; or &lt;a href="http://www.drupaleasy.com/podcast" target="_blank"&gt;podcast&lt;/a&gt; say &amp;quot;hi&amp;quot; (I'll be the guy wearing some type of funny hat with glasses and a &lt;a href="http://en.wikipedia.org/wiki/Soul_patch" target="_blank"&gt;soul patch&lt;/a&gt;). &lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=In5NT4PPpx0:fobTAE-aN4c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=In5NT4PPpx0:fobTAE-aN4c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?i=In5NT4PPpx0:fobTAE-aN4c:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=In5NT4PPpx0:fobTAE-aN4c:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=In5NT4PPpx0:fobTAE-aN4c:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=In5NT4PPpx0:fobTAE-aN4c:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?i=In5NT4PPpx0:fobTAE-aN4c:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developerkarma?a=In5NT4PPpx0:fobTAE-aN4c:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developerkarma?i=In5NT4PPpx0:fobTAE-aN4c:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/developerkarma/~4/In5NT4PPpx0" height="1" width="1"/&gt;</description>
 <comments>http://developerkarma.com/blog/andrew-m-riley/my-way-drupalcon-dc-2009#comments</comments>
 <category domain="http://developerkarma.com/tag/dc">dc</category>
 <category domain="http://developerkarma.com/general/drupal">drupal</category>
 <category domain="http://developerkarma.com/tag/drupalcon">drupalcon</category>
 <category domain="http://developerkarma.com/tag/drupaleasy">drupaleasy</category>
 <category domain="http://developerkarma.com/tag/mindcomet">mindcomet</category>
 <pubDate>Tue, 03 Mar 2009 13:44:20 +0000</pubDate>
 <dc:creator>Andrew M Riley</dc:creator>
 <guid isPermaLink="false">1075 at http://developerkarma.com</guid>
<feedburner:origLink>http://developerkarma.com/blog/andrew-m-riley/my-way-drupalcon-dc-2009</feedburner:origLink></item>
</channel>
</rss>

