<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Chicken Scratches</title>
	<atom:link href="http://www.chickenwingsw.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.chickenwingsw.com</link>
	<description>Developing ideas on developing.</description>
	<lastBuildDate>Tue, 12 Feb 2013 15:19:08 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Introducing the Chorderator Android App</title>
		<link>http://www.chickenwingsw.com/scratches/programming/introducing-the-chorderator-android-app</link>
		<comments>http://www.chickenwingsw.com/scratches/programming/introducing-the-chorderator-android-app#comments</comments>
		<pubDate>Tue, 12 Feb 2013 15:08:12 +0000</pubDate>
		<dc:creator>Eddie Sullivan</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.chickenwingsw.com/?p=263</guid>
		<description><![CDATA[In response to many requests, I have created an Android App version of my popular Chorderator guitar chord lookup tool. This is a quick app that lets you look up any guitar chord you can think up, in any tuning. Many tunings come preprogrammed, including guitar standard, dropped D, mandolin,bass guitar, and banjo. Or you [...]]]></description>
				<content:encoded><![CDATA[<p><a href="https://play.google.com/store/apps/details?id=com.chickenwingsw.chorderator"><img src="http://www.chorderator.com/images/android-ad.png" style="float:left" /></a></p>
<p>In response to many requests, I have created an <a href="https://play.google.com/store/apps/details?id=com.chickenwingsw.chorderator">Android App version</a> of my popular <a href="http://www.chorderator.com/">Chorderator guitar chord lookup tool</a>. This is a quick app that lets you look up any guitar chord you can think up, in any tuning. Many tunings come preprogrammed, including guitar standard, dropped D, mandolin,bass guitar, and banjo. Or you can add your own custom tunings. You can listen to each chord shape.</p>
<p><a href="https://play.google.com/store/apps/details?id=com.chickenwingsw.chorderator"><img src="http://www.chorderator.com/images/screenshot-device.png" style="float:right" /></a></p>
<p>And NEW to the Android App, you can batch up a collection of chords into “Chord Sheets.” So, for example, if you’re learning a song you can save all the chords for that song into a sheet, which you can share by email or text message.</p>
<p>The App is completely free while it is in its Beta stage. Eventually there will be a free version and a pay version. For now, why not <a href="https://play.google.com/store/apps/details?id=com.chickenwingsw.chorderator">head on over to the Google Play Store</a> and give it a download!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chickenwingsw.com/scratches/programming/introducing-the-chorderator-android-app/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eddie&#8217;s Django Tip #4: Stay Up to Date</title>
		<link>http://www.chickenwingsw.com/scratches/programming/python/django-tip-4</link>
		<comments>http://www.chickenwingsw.com/scratches/programming/python/django-tip-4#comments</comments>
		<pubDate>Fri, 22 Jul 2011 15:19:00 +0000</pubDate>
		<dc:creator>Eddie Sullivan</dc:creator>
				<category><![CDATA[django]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.chickenwingsw.com/scratches/programming/python/eddies-django-tip-4-stay-up-to-date</guid>
		<description><![CDATA[By some measures, Django is still shiny and new. Originally created in 2003, it&#8217;s newer than my car. A house built that year would be considered pretty much fresh from the oven. A baby born in &#8217;03 would be just entering sixth grade now. But by Internet time, it&#8217;s been around practically forever. Especially because [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.chickenwingsw.com/scratches/programming/python/django-tip-4"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 0px 5px 5px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px" title="The Persistence of Memory" border="0" alt="The Persistence of Memory" align="right" src="http://www.chickenwingsw.com/wp-content/uploads/2011/07/The_Persistence_of_Memory.jpg" width="244" height="178"></a>
<p>By some measures, Django is still shiny and new. Originally created in 2003, it&#8217;s newer than my car. A house built that year would be considered pretty much fresh from the oven. A baby born in &#8217;03 would be just entering sixth grade now. But by Internet time, it&#8217;s been around practically forever. Especially because Django has been under constant development for that whole time.</p>
<p>The fundamental concepts and philosophy of Django have not changed much, but there have been significant features added and modifications made to the way many components work. This is especially noticeable to those of us who have been using it since its early beta days. While I didn&#8217;t agree with every change as it was made (auto-escaping in templates, for example), in general Django has clearly been getting steadily better.</p>
<p><span id="more-254"></span><br />
<h4>New ways of doing old things</h4>
<p>Often I find that the fine developers of Django have added an &#8220;official&#8221; way of doing something that I was doing on my own. Although, of course, since they&#8217;re not me and they don&#8217;t consult me before implementing their feature, it usually works in a slightly different way. And example of this is the <a href="https://docs.djangoproject.com/en/dev/howto/static-files/">static files module</a>. I had set up a very similar system on my own. For existing projects, I decided to stick with my original setup, but for new ones, it makes sense to use the officially supported version. That way I get the benefit of community based support, and when future developers come along it will look more familiar to them.<br />
<h4>But be aware of breaking changes</h4>
<p>Newer is often better, but not always. Things can change from release to release in such a way that your existing code will break. For example, in release 1.2, support for Python 2.3 was dropped. Always be sure to check the release notes for the new version and any intermediate versions before performing a Django upgrade. (Obviously, this is good practice for any library you depend on, but when talking about the central framework of your entire site, it takes on additional importance.) Perform the upgrade on your development server first to work out any kinks. And always try to run the same versions on your development machine as on your production machine.<br />
<h4>Don&#8217;t be a bandwagon jumper</h4>
<p>Just because something is new and trendy doesn&#8217;t necessarily mean it&#8217;s right for you and your project. If your existing approaches are working and don&#8217;t pose a security risk, there is often no point in switching to a newer approach. See my above reference to the static files module. Switching my existing projects over to it would just introduce the risk of new bugs, for little gain. Likewise, if your site is running fine in an &#8220;older&#8221; version of Django and you don&#8217;t need new features, think twice about upgrading. This is a judgment call that you will have to make on a project-by-project basis.
<p>It is often worthwhile to upgrade a project that doesn&#8217;t necessarily need it in order to keep that project on the same level as your new projects. It makes development and deployment easy if everything is running the same version. So the needs of one application can lead to a decision to upgrade several others. This can be good practice, just be sure to perform a full suite of regression tests after the upgrades.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chickenwingsw.com/scratches/programming/python/django-tip-4/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eddie&#8217;s Django Tip #3: Don&#8217;t Mix Your Media</title>
		<link>http://www.chickenwingsw.com/scratches/programming/python/django-tip-3</link>
		<comments>http://www.chickenwingsw.com/scratches/programming/python/django-tip-3#comments</comments>
		<pubDate>Tue, 17 May 2011 12:17:16 +0000</pubDate>
		<dc:creator>Eddie Sullivan</dc:creator>
				<category><![CDATA[django]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.chickenwingsw.com/?p=251</guid>
		<description><![CDATA[Don&#8217;t mix user-uploaded content with site-specific content with Django admin content. This is a simple one, but I have seen projects where this was not followed, and the result was a real mess. so please, please, please do not mix your media! There are (at least) three types of content that we can think of [...]]]></description>
				<content:encoded><![CDATA[<p>Don&#8217;t mix user-uploaded content with site-specific content with Django admin content.</p>
<p>This is a simple one, but I have seen projects where this was not followed, and the result was a real mess. so please, please, <strong>please</strong> do not mix your media!</p>
<p>There are (at least) three types of content that we can think of as &#8220;media&#8221; in a Django project: There is the Django admin media &#8211; the CSS files, images, and JavaScript that come with Django itself for use in the admin interface. Then there is your own static media that you use to style your site. And finally, there is user-uploaded content &#8211; things like profile pictures and so on. I recently took over a project where all three were in the same directory. I nearly wept.</p>
<p><span id="more-251"></span>
<p>In case it&#8217;s not obvious:</p>
<ul>
<li>
<p>Django media stays with Django. Wherever you have Django installed, be it as a Python Egg, checked out from Subversion, or as part of your OS’s packaging system, keep it there. Use your web server&#8217;s configuration to map a URL to that path (taking appropriate security measures, of course). And set the <code>ADMIN_MEDIA_PREFIX</code> setting.</p>
<li>
<p>Your static media belongs in version control, probably with the rest of your source code. Depending on your work flow, you may want a separate system for the raw Photoshop or Gimp image files and the final web-ready images. I have an /img-src/ directory and a /static/images/ directory in every project, for example. The important thing is that they are separate from other media types, version controlled, and updated when the rest of the code is updated. <strong>Important note</strong>: Do <em>not</em> use Django&#8217;s <code>MEDIA_ROOT</code> and <code>MEDIA_URL</code> settings for this. These settings are for user-uploaded content. Django&#8217;s documentation is a little unclear on this point.</p>
<li>
<p>User-uploaded content stays separate. As always, use caution in what you let your users upload to your server. Validate the files if possible. Create your own file names; that is, don&#8217;t let the uploading user choose the server-side name of the file. Limit the upload size. And of course I don&#8217;t need to tell you not to run your FastCGI process as root, right? Right? (Believe it or not, the project I recently took over was set up like that, so I guess I do need to say it.)</p>
</li>
</ul>
<p>Just as in real life, it&#8217;s important to pay attention to where you put stuff. A place for every file, and every file in its place.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chickenwingsw.com/scratches/programming/python/django-tip-3/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Eddie&#8217;s Django Tip #2: Don&#8217;t Get Trapped</title>
		<link>http://www.chickenwingsw.com/scratches/programming/python/django-tip-2</link>
		<comments>http://www.chickenwingsw.com/scratches/programming/python/django-tip-2#comments</comments>
		<pubDate>Tue, 10 May 2011 13:21:43 +0000</pubDate>
		<dc:creator>Eddie Sullivan</dc:creator>
				<category><![CDATA[cheetah]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.chickenwingsw.com/scratches/programming/eddies-django-tip-2-dont-get-trapped</guid>
		<description><![CDATA[This is the second in my series that I am calling &#8220;Eddie&#8217;s Practices&#8221; for Django, in which I present tips and tricks that I have gleaned over the years of working with the Django web application framework. If you haven’t seen Eddie’s Django Tip #1: Choose Names Carefully, why not take a look at it [...]]]></description>
				<content:encoded><![CDATA[<p>This is the second in my series that I am calling <strong>&#8220;Eddie&#8217;s Practices&#8221;</strong> for <a href="http://www.djangoproject.com">Django</a>, in which I present tips and tricks that I have gleaned over the years of working with the Django web application framework. If you haven’t seen <a href="http://www.chickenwingsw.com/scratches/programming/python/django-tips-1">Eddie’s Django Tip #1: Choose Names Carefully</a>, why not take a look at it now?</p>
<p>Today&#8217;s tip is:</p>
<h2>Don&#8217;t Get Trapped in the Django Universe</h2>
<p><a href="http://www.nasa.gov/mission_pages/hubble/science/hubble-rose-gallery.html"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px" title="Hubble Rose" border="0" alt="Hubble Rose" align="right" src="http://www.chickenwingsw.com/wp-content/uploads/2011/05/Hubble-Rose.jpg" width="287" height="216"></a>One of Django&#8217;s strengths is its &#8220;batteries included&#8221; approach. It provides for free many of the features you would normally have to write from scratch or cobble together from disparate sources. Some examples are the authentication system, the administrative interface, and the templating system. These are wonderfully useful, and they often work together in ways that separately developed libraries can not. However, not every part of Django will fit your needs all the time. Choices were made in the design of Django, and those aren’t always the same choices you would have made.</p>
<p>Fortunately, another strength of Django is its modularity. It is very easy to unplug one of its built-in features and plug in your own or someone else&#8217;s. I&#8217;ll go through some of the Django features that you may want to consider replacing or eliminating.</p>
<p>The important point I want to emphasize is that there is nothing <em>unclean</em> or dangerous about doing this. It&#8217;s your site, you&#8217;re the boss of Django, and you should only use the parts of it that you need. I think the creators of Django would agree with me.</p>
<p><span id="more-248"></span><br />
<h3>The Templating System</h3>
<p>There is nothing sacred about the Django templating system, and no reason you <em>have</em> to use it in your application. In fact, the more I use Django templates, the more I appreciate the power and flexibility of <a href="http://cheetahtemplate.org/">Cheetah</a>, and so in most of my recent projects I have used Cheetah for my templates. You do lose out on some of the generic templates and template tags that Django provides, but these are easily replaced, especially because Cheetah allows calling arbitrary Python functions from within a template. As a solo developer, I find this power very convenient.</p>
<p>If there is interest, I will be happy to share some of the functions and code I have developed to make it easier to use Cheetah within Django.</p>
<h3>The Authentication System</h3>
<p>Django makes it very easy to replace or change the built-in authentication/authorization system. You might want to do this if you already have a system in place: for example, if you use HTTP authentication via Apache. Likewise if you want to do something wacky like authentication by IP address within an intranet. Or maybe you have a completely public site with no need for authentication at all.</p>
<p>The simplest way to customize your authentication is to provide a <a href="http://docs.djangoproject.com/en/dev/topics/auth/#writing-an-authentication-backend">custom Authentication Backend</a>. But you could go so far as to completely replace or eliminate the <code>django.contrib.auth</code> app. Just be aware that the Django admin site relies on <code>django.contrib.auth</code>.</p>
<h3>The Object-Relational Mapping (ORM)</h3>
<p>Django&#8217;s high-level <code>Model</code> and <code>QuerySet</code> interface is great for abstracting away the details of database operations, so it is rare that you need to write raw SQL. So much so, in fact, that you can write a complicated application without even <em>knowing</em> SQL. This is a bad idea, however.</p>
<p>Learn SQL, learn what Django is doing behind the scenes with your queries, and don&#8217;t be afraid to use <a href="http://docs.djangoproject.com/en/1.3/topics/db/sql/">raw SQL</a> when it is appropriate. There are some things you just can&#8217;t do with Django&#8217;s ORM: for example, any operation that involves reading and updating a field atomically. Other operations are just much faster if you can do them raw. A good rule of thumb is that if you are performing queries or updates inside a Python loop, investigate switching it to SQL. One big query is generally much faster than a bunch of smaller queries.</p>
<h3>The Database Itself</h3>
<p>Yes! Despite what you may have heard, it is possible to create a web application without a database! In fact, for a recent site I developed I did just that. I use Django in a very bare-bones way: Django provides URL parsing and dispatching, a logical source code layout, the handling of HTTP requests and responses, and some utility functions, but that&#8217;s it. Apache takes care of authentication, Cheetah handles my templates, and I store user data in a JSON formatted text file. With no database, there is no need for an admin site &#8211; I can edit the text files directly in the file system. There are valid reasons for all these decisions, and for this project they fit my needs perfectly. It&#8217;s still a &#8220;Django-powered&#8221; site, but only in a very limited sense.</p>
<h3>Django Itself</h3>
<p>This should go without saying, but for many new developers it needs to be said. A web application does not need a web framework. Blasphemy, I know. But CGI has been around since 1993. Django was created in 2003, and didn&#8217;t go public for a while after that. So we had ten good years of dynamic web pages before Django even was a glimmer. If you&#8217;ve never done it before, I recommend making at least one pure CGI (or FastCGI) app, so you can better know and understand what Django is doing behind the scenes. It&#8217;s not magic or mystical or even that difficult. Just as driving a stick-shift makes you a better driver even on an automatic, knowing the details of web protocols will make you a better web developer.</p>
<p>Then when you go back to Django you will appreciate all that it is doing for you, as well as realizing that the Django way is not the only way.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chickenwingsw.com/scratches/programming/python/django-tip-2/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Django: Eddie&#8217;s Practices #1: Choose Names Carefully</title>
		<link>http://www.chickenwingsw.com/scratches/programming/python/django-tips-1</link>
		<comments>http://www.chickenwingsw.com/scratches/programming/python/django-tips-1#comments</comments>
		<pubDate>Tue, 03 May 2011 14:52:23 +0000</pubDate>
		<dc:creator>Eddie Sullivan</dc:creator>
				<category><![CDATA[django]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.chickenwingsw.com/scratches/uncategorized/django-eddies-practices-1-choose-names-carefully</guid>
		<description><![CDATA[Why &#8220;Eddie&#8217;s Practices?&#8221; Django has become one of the more popular web frameworks out there. I have been lucky enough to have worked with it for many years, starting in its early beta stages. I&#8217;ve used it to create many web applications on my own, and I&#8217;ve worked on many apps that were originally created [...]]]></description>
				<content:encoded><![CDATA[<style type="text/css">
  code { font-size:13px; }
</style>
<h3>Why &#8220;Eddie&#8217;s Practices?&#8221;</h3>
<p>Django has become one of the more popular web frameworks out there. I have been lucky enough to have worked with it for many years, starting in its early beta stages. I&#8217;ve used it to create many web applications on my own, and I&#8217;ve worked on many apps that were originally created by others.
<p><a href="http://www.djangoproject.com"><img style="background-image: none; border-right-width: 0px; margin: 10px 0px 10px 12px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="django-logo-positive" border="0" alt="django-logo-positive" align="right" src="http://www.chickenwingsw.com/wp-content/uploads/2011/05/django-logo-positive.png" width="232" height="81"></a>As in most development environments, there are certain common issues that pop up again and again. Over the years, through trial and error, talking to other developers, and a lot of hard thinking, I&#8217;ve come up with some general approaches to many of these issues.
<p>I have gotten a great response to my previous posts about Django, so I decided to create a new series of posts, dealing with these tips and techniques. I wouldn&#8217;t have the hubris to call these &#8220;best practices,&#8221; because that would imply that my way is best for all developers. So I&#8217;ll just go with &#8220;Eddie&#8217;s Practices.&#8221; These are things that work for me, things I wish people had told me when I was starting out. I hope they work for you, too. Mileage may vary, as they say.<br />
<h3>Tip #1: Think hard about what to name your project and your app.</h3>
<p>We&#8217;ll start with a basic one, but one that seems to come up over and over. When you get started with Django, you create a &#8220;project,&#8221; and then within that project you create an &#8220;app.&#8221; You need to come up with names for both of them. This may seem a trivial point &#8211; surely an app by any other name would be just as enterprisy. But it can affect your future development in unexpected ways.<br />
<span id="more-235"></span>
<p>For example, say you want to create a website for playing poker. Not a very far-fetched idea &#8211; there are a couple sites like that out there. So you check the Django getting started guide, and run the command to create the project:
<p><code>~/src&gt;django-admin.py startproject poker</code>
<p>Fair enough. It makes sense to call your poker project <code>poker</code>. But now, you need to create an app as well. What do you call that? Well, we can&#8217;t use poker, as the following shows:
<p><code>~/src/poker&gt;python manage.py startapp poker<br />Error: You cannot create an app with the same name ('poker') as your project. </code>
<p><em>Hmm</em>, you think. <em>Maybe I can be clever!</em> So you decide to name the app &#8220;game.&#8221; That way, you can refer to it as <code>poker.game</code>. Brilliant! It&#8217;s a poker game!
<p>Not so fast.
<p>Oh sure, it seems fine for a while. You come up with a clever marketing strategy, you launch it at zoombidingle.net, you advertise it, you even start to get some users. After a while, you decide business is going well enough that you want to expand. Poker&#8217;s great and all, but what people are <em>really</em> clamoring for these days is dominoes. The wave of domino-mania that is sweeping the nation is unprecedented. You don&#8217;t want to miss out on your piece of the domino-pie, so you decide to create a Dominoes app.
<p>As a smart business person, you see it makes sense to leverage your existing user base and just add on to Zoombidingle. You can even let your users use their existing virtual poker chips to buy into the domino tournament. Fine: cd into your project directory and start typing:
<p><code>~/src/poker&gt;python manage.py startapp <em>...</em> </code>
<p>Now you&#8217;re stuck.
<p>It obviously makes sense to call the new app something like &#8220;dominoes,&#8221; but you have a nightmarish vision of having to type <code>poker.dominoes</code> all over your code. Besides sounding vaguely obscene (&#8220;I don&#8217;t even know &#8216;er!&#8221;), it doesn&#8217;t accurately describe the code&#8217;s hierarchy. Add to that, you still have <code>poker.game</code>, but isn&#8217;t dominoes a game, too?
<p>So you rename things. You change your project name from <code>poker</code> to <code>games</code>. (You don&#8217;t go with <code>zoombidingle</code> because you don&#8217;t want to link the marketing decision of the site name with the codebase.) You change your old app name from <code>game</code> to <code>poker</code>. You do a bunch of grepping through the code base, hoping you catch every reference to those names, and hoping you don&#8217;t forget which <code>poker</code> is which and don&#8217;t confuse <code>game</code> with <code>games</code>. You update your web server configuration to point to the new directories. You deal with the errors Subversion always seems to give when you rename a directory, and <em>voila!</em> You have a new project hierarchy, and you can happily create your <code>dominoes</code> app and go on your merry way.
<p><a href="http://www.fox.com/glee/"><img style="background-image: none; border-right-width: 0px; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="025_352" border="0" alt="025_352" align="right" src="http://www.chickenwingsw.com/wp-content/uploads/2011/05/025_352.jpg" width="280" height="188"></a>Ok, so is it a huge deal to have to rename things? Maybe not, but it&#8217;s two or three hours of your time you could be using to write fresh code or catch up on <em>Glee</em>. It just makes sense to pick the right name in the first place.
<p>And I know I&#8217;m not the only one who has run into this issue. I have taken over a development project where the &#8220;project&#8221; was called (let&#8217;s say) fooblygoop, which was the name of the website. They apparently were not feeling very creative, so the &#8220;app&#8221; got named <code>fooblygoop.fooblygoopapp</code>. <em>Bleah!</em>
<p>So now we come to a general rule of thumb. Eddie&#8217;s Practice #1:
<p><strong>Think <em>specific</em> for the app name, think <em>general</em> for the project name.</strong>
<p>The important thing to remember is that you may end up using the app in another project, and you may end up adding more apps to the current project. In fact, in my experience, this almost <em>always</em> happens. Even when you don&#8217;t anticipate reuse, you&#8217;ll often be surprised later to find yourself recycling an old app.
<p>For the poker example, <code>poker</code> would have worked as the app name, or maybe something even more specific, like <code>holdem</code> if your site is a Texas Hold&#8217;em site. Then you could even market the app as a standalone plugin for third-party web sites.
<p>For the project name, think about how you might possible expand the project in the future. <code>games</code> is nice and general. Or even <code>funstuff</code> if you&#8217;re feeling whimsical.
<p>Yes, this is a simple tip, but one that is well worth keeping in mind. It could save you a few hours and a few aspirins.
<p>Stay tuned for more of these tips. They&#8217;ll get more in depth and technical as they go along. And please let me know in the comment section if you find this helpful or you have anything you want to add.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chickenwingsw.com/scratches/programming/python/django-tips-1/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>The Dangers of Knowing Too Much</title>
		<link>http://www.chickenwingsw.com/scratches/programming/the-dangers-of-knowing-too-much</link>
		<comments>http://www.chickenwingsw.com/scratches/programming/the-dangers-of-knowing-too-much#comments</comments>
		<pubDate>Fri, 22 Apr 2011 17:46:29 +0000</pubDate>
		<dc:creator>Eddie Sullivan</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.chickenwingsw.com/?p=225</guid>
		<description><![CDATA[Apple recently announced that they will be offering a “Music in the Cloud” service, whereby users can upload their music library to a server and access it from anywhere with an internet connection. My first thought was, “So what?” but then I read that Google is also working on a similar service, and in fact [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.ladygaga.com/Default.aspx"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 0px 10px 12px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px" title="Lady Gaga fans don't know Perl" border="0" alt="Lady Gaga" align="right" src="http://www.chickenwingsw.com/wp-content/uploads/2011/04/gaga.jpg" width="204" height="304"></a>Apple <a href="http://www.reuters.com/article/2011/04/21/us-apple-google-idUSTRE73K7A720110421">recently announced</a> that they will be offering a “Music in the Cloud” service, whereby users can upload their music library to a server and access it from anywhere with an internet connection.</p>
<p>My first thought was, “So what?” but then I read that Google is also working on a similar service, and in fact the two companies were in a race to see who could launch it first. So apparently two of the smartest companies out there think this is a good idea. Given Apple’s recent track record, I’m going to guess it’s a good bet.</p>
<p>While I believe them that it’s a good idea, I will never use it, and I would never have thought of it. Why not? Because I don’t need it. I have my ten-dollar-a-month Dreamhost account on which I host this website and a bunch of others. My account was granted unlimited storage for life to make up for some billing mix-up a couple years back, so all I need is <a href="http://linux.die.net/man/1/rsync">rsync</a>, ssh, and a couple Perl scripts and I can have the same functionality without the privacy concerns of using Apple or Google’s service. If I want a slick streaming web interface, well that’s easy with some <a href="http://www.djangoproject.com/">Django</a>-based magic and an <a href="http://www.chickenwingsw.com/scratches/programming/eddies-flv-player">open-source Flash media player</a> &#8211; I can even customize its source code! So why would anyone need a third-party music streaming service?</p>
<p>What’s that? You mean not everybody knows Perl? Not everybody manages web apps for a living? Not everybody cares about privacy?</p>
<p> <span id="more-225"></span><br />
<h3>Don’t Be Too Smart</h3>
<p>Well, clearly I’m not the target audience for this idea. But that’s a problem, and if you’re reading this blog it’s probably a problem for you, too. I’m not saying we all need to compete with Google or Apple, or that we have the resources. I’m saying we – and by we I mean the developer community, those who would rather read <a href="http://slashdot.org/">Slashdot</a> than <a href="http://www.people.com/people/">People</a> – are missing out on opportunities. We casually dismiss the People-readers because they type LOL after every sentence, because they use the word “password” as their password, because they don’t know how to right-click their mouse, because they shell out $2.50 for a 30-second ring-tone when they could easily jailbreak their phone and customize their rings to their hearts’ content. In other words, we dismiss them because they are not like us. They are not stupid: many of them are successful CEOs, professors, architects, and so on, but their areas of expertise are not in information technology. But guess what? There are a lot of them and they spend a <em>lot</em> of money!</p>
<p>To be honest, I still don’t get the one-button mouse thing. I figure since I have five fingers, why can’t my mouse have five buttons? In fact, give me a mouse for each hand for a total of ten buttons. Or better yet, give me 101 buttons and a CLI, and remove that silly pointer thing. Still, I guess there’s a <a href="http://www.apple.com/iphone/">pretty successful product</a> out there with only one button.</p>
<h3>But Don’t Be Dumb</h3>
<p>So when it comes to thinking up product ideas, we have to “dumb-down” our thinking a little bit. But how far? There’s clearly a danger of going too far. My 92-year-old grandmother, as sharp as she is, doesn’t know Perl, but neither is she about to go buy cloud-based music. Instead, let’s fall back on every consumer-based marketer’s go-to group: <strong>Lady Gaga fans</strong>, by which I mean 14-year-old girls. (Yes, I’m sure there are plenty of 14-year-old girls who are amazing programmers, but how many of them also listen to Lady Gaga?) I’m talking about the people who don’t know Perl and don’t ever want to learn Perl, but can text-message at the speed of light. They want their music, they want it now, and they only want to have to press one button to get it.</p>
<p>So what’s the take-away? Listen to <a href="http://www.youtube.com/watch?v=qrO4YZeyl0I">Bad Romance</a> more? Hang out with teenagers? No, we don’t need to torture ourselves. But let’s try to step away from our little world of command line prompts and Hypersnoot Transport Protocols and see what the paying consumer really wants – simplicity, pretty colors, and a good beat that you can dance to.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chickenwingsw.com/scratches/programming/the-dangers-of-knowing-too-much/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How NOT to Hire an Engineer</title>
		<link>http://www.chickenwingsw.com/scratches/programming/how-not-to-hire-an-engineer</link>
		<comments>http://www.chickenwingsw.com/scratches/programming/how-not-to-hire-an-engineer#comments</comments>
		<pubDate>Sat, 16 Apr 2011 01:04:05 +0000</pubDate>
		<dc:creator>Eddie Sullivan</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.chickenwingsw.com/?p=216</guid>
		<description><![CDATA[The Wall Street Journal recently published an online article headlined Mobile App Talent Pool Is Shallow. In this article, Joe Light discusses the problem that a lot of Smartphone app companies think they have: they believe there are not enough engineers with experience developing software for mobile applications. A software developer reading that article may [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.chickenwingsw.com/scratches/programming/how-not-to-hire-an-engineer"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px" title="iPhones" border="0" alt="iPhones" align="right" src="http://www.chickenwingsw.com/wp-content/uploads/2011/04/800px-Iphone2g3g3gson.jpg" width="244" height="184"></a>The Wall Street Journal recently published an online article headlined <a href="http://online.wsj.com/article/SB10001424052748704547604576263200170918660.html?mod=WSJ_Tech_LEFTTopNews">Mobile App Talent Pool Is Shallow</a>. In this article, Joe Light discusses the problem that a lot of Smartphone app companies think they have: they believe there are not enough engineers with experience developing software for mobile applications.</p>
<p>A software developer reading that article may jump at the perceived opportunity: <em>Hey, I better learn iOS, or Android, or Windows Phone 7, or something!</em> A recruiter reading that article may experience a feeling of dismay: <em>Crap, there’s nobody who can do what we need doing!</em> They would both be wrong.</p>
<p><span id="more-216"></span></p>
<p>Rather than a real paucity of qualified engineers, what the article really highlights is a fundamental flaw in the way many companies hire engineers. Instead of focusing on &#8220;Engineers Who Can Write Software for Smartphones,&#8221; they should be seeking engineers who can write good software, period.</p>
<p>If you know how to program and do it well, the platform is irrelevant. Likewise, a poor programmer who claims eight years experience on the iPhone is still a poor programmer. I would rather hire the good programmer who has never programmed for a mobile device than a &#8220;mobile app expert&#8221; who can&#8217;t program his way out of a paper bag.</p>
<p>If you don’t believe this is a real problem, take a few moments to peruse Dice.com or Craig’s List, and notice all the job listings looking for “8 years exp in ObscuroSoft version 2.5, knwlge of Arcaniastro X desirable.” These types of ultra-specific requirements can in fact backfire. A developer who has spent eight years memorizing the exact names and parameters to every function in some esoteric API has wasted eight good years that could have been spent learning new programming paradigms or analysis techniques.</p>
<p>The one <em>possible</em> exception I can think of is for a contract of less than three months, when you have one specific bug or change that needs addressing, and your normal developer is temporarily unavailable. Even then, three month contracts rarely stay as three month contracts. New issues crop up and customer demands change. So this is an even rarer instance than it may seem.</p>
<p>Remember, you’re hiring a person, not a technology. I believe that’s a good general rule in all hiring: you want really smart dedicated fun people on your team, and should never just hire the person with the most direct experience in a narrow discipline that you need for that moment. Priorities always shift, and a specialist is useless in weeks.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chickenwingsw.com/scratches/programming/how-not-to-hire-an-engineer/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Introducing Play Scopa: a new Scopa card game site</title>
		<link>http://www.chickenwingsw.com/scratches/programming/python/playscopa-co</link>
		<comments>http://www.chickenwingsw.com/scratches/programming/python/playscopa-co#comments</comments>
		<pubDate>Tue, 28 Sep 2010 18:06:51 +0000</pubDate>
		<dc:creator>Eddie Sullivan</dc:creator>
				<category><![CDATA[django]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.chickenwingsw.com/scratches/uncategorized/introducing-playscopa-com-a-new-scopa-card-game-site</guid>
		<description><![CDATA[I have previously written about the Scopa game I developed for Facebook. Well, I became frustrated with the technical limitations of the Facebook canvas platform, and decided to move it off of Facebook onto its own site. So now you can practice your Italian and learn a new card game at www.playscopa.com. You can still [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.playscopa.com/"><img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="card-logo" border="0" alt="card-logo" align="right" src="http://www.chickenwingsw.com/wp-content/uploads/2010/09/cardlogo.png" width="300" height="212" /></a> I have previously written about the <a href="http://www.playscopa.com">Scopa</a> game I developed for <a href="http://www.facebook.com/">Facebook</a>. Well, I became frustrated with the technical limitations of the Facebook canvas platform, and decided to move it off of Facebook onto its own site. So now you can practice your Italian and learn a new card game at <a href="http://www.playscopa.com">www.playscopa.com</a>. You can still log in with your Facebook account, though.</p>
<p>If you’ve never heard of Scopa, it’s a fun Italian card game for two or more people. You can play with one of two gorgeous Italian decks of cards or a standard American deck with the face cards removed. There is a section on the site where you can <a href="http://www.playscopa.com/rules/">learn how to play Scopa</a> as well. You can practice by playing against the computer, and the game also has a “beginner” level where the computer will give you hints about what moves you can make next.</p>
<p>For my technical audience, the site is implemented in <a href="http://python.org/">Python</a> and <a href="http://www.djangoproject.com">Django</a> on the back end. The game play is completely handled in HTML and JavaScript, using the <a href="http://en.wikipedia.org/wiki/Comet_%28programming%29">Comet</a> technology for real-time player-to-player communication. The back end server is my custom-built Sully Server (soon to be released as open-source).</p>
<p>Enjoy, and go <a href="http://www.playscopa.com/">play Scopa</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chickenwingsw.com/scratches/programming/python/playscopa-co/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Dev Ideas Episode 1: Haxe: What Makes It Cool</title>
		<link>http://www.chickenwingsw.com/scratches/programming/devideas-1-haxe</link>
		<comments>http://www.chickenwingsw.com/scratches/programming/devideas-1-haxe#comments</comments>
		<pubDate>Thu, 01 Apr 2010 17:22:19 +0000</pubDate>
		<dc:creator>Eddie Sullivan</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.chickenwingsw.com/scratches/uncategorized/dev-ideas-episode-1-haxe-what-makes-it-cool</guid>
		<description><![CDATA[I’m very excited to tell you about Dev Ideas, a new video and slide presentation series where I will be drawing on my decade-plus of industry experience to discuss cutting edge concepts in the field of software development. For the first few episodes, I’ll be addressing some of the lesser known programming languages and techniques. [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.devideas.com/shows/haxe"><img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="Dev Ideas Episode 1: Haxe: What Makes It Cool" border="0" alt="Dev Ideas Episode 1: Haxe: What Makes It Cool" align="right" src="http://www.chickenwingsw.com/wp-content/uploads/2010/04/haxepresthumbsimple1.jpg" width="224" height="178" /></a> I’m very excited to tell you about <a href="http://www.devideas.com/">Dev Ideas</a>, a new video and slide presentation series where I will be drawing on my decade-plus of industry experience to discuss cutting edge concepts in the field of software development. For the first few episodes, I’ll be addressing some of the lesser known programming languages and techniques. This is a very exciting time to be in software, as new languages and paradigms are emerging and ideas that were previously limited to academics and research projects are now becoming mainstream.</p>
<p>In today’s first episode of Dev Ideas, I delve into the <a href="http://www.haxe.org">Haxe programming language</a>. Haxe’s main claim to fame is as a free open-source alternative to the Flash development environment, but it is really a multiplatform language and toolkit. In addition to Flash .<strong>swf</strong> files, Haxe can target JavaScript, <a href="http://nekovm.org">NekoVM</a>, PHP, or C++ source code, making it possible to use the same language for all phases of a project. Haxe also gives you access to advanced language features like closures, type inference, and algebraic types. Come join me as I give a quick (23 minute) overview of what makes Haxe interesting and worth learning.</p>
<p><a href="http://www.devideas.com/shows/haxe">Watch the presentation now</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.chickenwingsw.com/scratches/programming/devideas-1-haxe/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>New version of PayPal on Python</title>
		<link>http://www.chickenwingsw.com/scratches/uncategorized/new-version-of-paypal-on-python</link>
		<comments>http://www.chickenwingsw.com/scratches/uncategorized/new-version-of-paypal-on-python#comments</comments>
		<pubDate>Sat, 06 Feb 2010 13:53:21 +0000</pubDate>
		<dc:creator>Eddie Sullivan</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.chickenwingsw.com/?p=175</guid>
		<description><![CDATA[I&#8217;ve published version 0.6 of my Python implementation of the PayPal NVP interface. You can download PayPal on Python here. The recent changes include: Fixed handling of dates. You can now use a Python datetime.date object anywhere the API calls for a date. Implemented recurring payments. Implemented Fraud Management Filters. Implement reference transactions. Changed the [...]]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve published version 0.6 of my Python implementation of the PayPal NVP interface. You can <a title="PayPal on Python – a Python interface to PayPal’s NVP API " href="http://www.chickenwingsw.com/paypal-on-python">download PayPal on Python here</a>.</p>
<p>The recent changes include:</p>
<ul>
<li>Fixed handling of dates. You can now use a Python <em>datetime.date</em> object anywhere the API calls for a date.</li>
<li>Implemented recurring payments.</li>
<li>Implemented Fraud Management Filters.</li>
<li>Implement reference transactions.</li>
<li>Changed the license from the Affero Public License to the GPL.</li>
</ul>
<p>Enjoy! And, as usual, please feel free to <a title="Contact Eddie Sullivan" href="http://www.chickenwingsw.com/contact">contact me </a>with any questions or issues.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chickenwingsw.com/scratches/uncategorized/new-version-of-paypal-on-python/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
