var tumblr_api_read = {"tumblelog":{"title":"Kevin Witaker","description":"A Random Collection of Internet Stuff","name":"kevin-whitaker","timezone":"US\/Central","cname":"blog.kevin-whitaker.net","feeds":[]},"posts-start":0,"posts-total":"3","posts-type":false,"posts":[{"id":"777003681","url":"http:\/\/blog.kevin-whitaker.net\/post\/777003681","url-with-slug":"http:\/\/blog.kevin-whitaker.net\/post\/777003681\/adding-facebook-authentication-to-your-django","type":"regular","date-gmt":"2010-07-06 14:44:00 GMT","date":"Tue, 06 Jul 2010 09:44:00","bookmarklet":0,"mobile":0,"feed-item":"","from-feed-id":0,"unix-timestamp":1278427440,"format":"html","reblog-key":"GkRvTIk7","slug":"adding-facebook-authentication-to-your-django","regular-title":"Adding Facebook authentication to your Django Application","regular-body":"<p>\nAs the internet becomes more interconnected, data of all kinds is more readily passing between different domains and applications. As a result, several centralized data \u201chubs\u201d are cropping up that allow web users to enter data in once, and then allow applications to access it from there. This is in contrast to the age-old practice of requiring users to create unique accounts, and enter the same information for every single web site or application they wanted to use.\n<\/p>\n\n<h3>Unique user authentication systems are dead, at least for most of us.<\/h3>\n<p>\nAs the Oatmeal so eloquently <a href=\"http:\/\/theoatmeal.com\/comics\/websites_stop\" target=\"_blank\">put it<\/a><strong> (hint: scroll down to #4)<\/strong>, there\u2019s really no reason for the vast majority of web applications to have their own \u201cvaults\u201d of user data, forcing the user to jump through hoops every time they go to a new site. Rather, it\u2019s better now to use the growing number of public APIs to let users log into our applications with the accounts they already have. As far as a mostly public repository of user data goes, it\u2019s hard to get better than Facebook.<\/p>\n\n<h3>The plan.<\/h3>\n<p>I\u2019ve been toying around with a new web app as of late, and I decided from the outset that I would allow users to log into my system with their Facebook accounts. Eventually, I\u2019ll add <a href=\"http:\/\/openid.net\/\" target=\"_blank\">OpenID<\/a> as well.  The goal for me is to ask users to jump through a unique registration system only if they can\u2019t log in with a pre-existing account from somewhere else.\n<\/p>\n<p>With that in mind, let&#8217;s get started.<\/p>\n\n<h3>My setup.<\/h3>\n<p>Here is some information about my setup:<\/p>\n<ul><li>Ubuntu 10.4<\/li>\n<li>PostgreSQL 8.4<\/li>\n<li>Python 2.6<\/li>\n<li>Django 1.2<\/li>\n<li>Nginx<\/li>\n<li>FastCGI for serving up my Django app.<\/li>\n<\/ul><p>If you are running things differently, you might have to make some minor modifications to get things working.<\/p>\n\n<h3>The plan.<\/h3>\n<p>The goal of this tutorial is to inject your Django app with some Facebook love. We will be setting up and installing the following:<\/p>\n<ul><li><a href=\"http:\/\/memcached.org\/\" target=\"_blank\">Memcached<\/a><\/li>\n<li><a href=\"http:\/\/github.com\/sciyoshi\/pyfacebook\" target=\"_blank\">PyFacebook<\/a><\/li>\n<li><a href=\"http:\/\/code.google.com\/p\/django-facebookconnect\" target=\"_blank\">django-facebookconnect<\/a><\/li>\n<\/ul><h3>Assumptions and prerequisites.<\/h3>\n<p>I\u2019m assuming you\u2019ve already gone through the trouble of setting up your stack and have a Django project started. If not, my friend Brandon Konkle has an <a href=\"http:\/\/brandonkonkle.com\/blog\/2010\/jun\/25\/provisioning-new-ubuntu-server-django\/\" target=\"_blank\">excellent tutorial<\/a> that will get you up and running.<\/p>\n\n<h3>Install memcached.<\/h3>\n<p>django-facebookconnect requires caching, so the first thing we will do is set up and install memcached. If you\u2019d rather use database caching, or something else, you should read up on <a href=\"http:\/\/docs.djangoproject.com\/en\/dev\/topics\/cache\/\" target=\"_blank\">other options<\/a> for caching in Django.<\/p>\n<blockquote><pre>\nsudo apt-get install memcached<\/pre><\/blockquote>\n<p>Then, open your project&#8217;s settings.py file and add the following line:<\/p>\n<pre class=\"syntax python\">\nCACHE_BACKEND = 'memcached:\/\/127.0.0.1:11211\/'\n<\/pre>\n<p>This tells Django to access a memcached server at port 11211 of the local host.<\/p>\n\n<h3>Install PyFacebook.<\/h3>\n<p>The django-facebookconnect app requires PyFacebook to be installed, and that makes sense, given that you\u2019ll need the goodies in the package to make your app talk to Facebook.<\/p>\n<p>I find it easiest to create a \u201ccode\u201d directory in my home directory, and then pull things into it. I\u2019m using git here to pull the files down, but you can use whatever you need to.<\/p>\n<blockquote><pre>\nmkdir code\ncd code\ngit clone <a href=\"http:\/\/github.com\/sciyoshi\/pyfacebook.git\">http:\/\/github.com\/sciyoshi\/pyfacebook.git<\/a>\ncd pyfacebook\nsudo python setup.py install\n<\/pre><\/blockquote>\n<p><strong>Note:<\/strong> It\u2019s important to note that Ubuntu, for some reason, places all of your python packages in \/usr\/local\/lib\/python2.6\/dist-packages, as opposed to the conventional site-packages directory. You\u2019ll need to remember this if you want to remove PyFacebook or django-facebookconnect at a later date.<\/p>\n\n<h3>Install django-facebookconnect.<\/h3>\n<p>Head back to your code directory, and go grab the django-facebookconnect package. You\u2019ll have to unzip it with your decompressor of choice.<\/p>\n<blockquote><pre>\ncd ~\/username\/code\nwget <a href=\"http:\/\/django-facebookconnect.googlecode.com\/files\/django-facebookconnect-0.1.zip\">http:\/\/django-facebookconnect.googlecode.com\/files\/django-facebookconnect-0.1.zip<\/a>\nunzip django-facebookconnect-0.1.zip\ncd django-facebookconnect-0.1\n<\/pre><\/blockquote>\n<p>Once it\u2019s unzipped, you\u2019ll want to copy the \u201cfacebook\u201d directory into your dist-packages directory.<\/p>\n<blockquote><pre>\nsudo cp facebook \/usr\/local\/lib\/python2.6\/dist-packages\/\n<\/pre><\/blockquote>\n\n<h3>Configuring your application.<\/h3>\n<p>Let\u2019s start by adding the facebook app to your installed apps. You\u2019ll also need to add django-auth, if you don\u2019t already have it. Move into your project directory and edit your settings.py file.<\/p>\n<pre class=\"syntax python\">\nINSTALLED_APPS = (\n    #---\n    'django.contrib.auth',\n    'django.contrib.sessions',\n    'facebookconnect',\n)\n<\/pre>\n<p>Next we need to add the middleware definitions in. Middleware can be very picky, so the order here is very important.<\/p>\n<pre class=\"syntax python\">\nMIDDLEWARE_CLASSES = (\n    'django.contrib.sessions.middleware.SessionMiddleware',\n    'facebook.djangofb.FacebookMiddleware',\n    'django.middleware.common.CommonMiddleware',\n    'django.contrib.auth.middleware.AuthenticationMiddleware',\n    'facebookconnect.middleware.FacebookConnectMiddleware',\n)\n<\/pre>\n<p><strong>Note:<\/strong> You may have some other middleware that isn\u2019t included in the previous list. Just try to set the order as best you can; you might need to play with it to get everything working.<\/p>\n<p>Now it&#8217;s time to define the authenticate backends.  If you don&#8217;t have an AUTHENTICATION_BACKENDS group in your settings file, just add one.<\/p>\n<pre class=\"syntax python\">\nAUTHENTICATION_BACKENDS = (\n    'facebookconnect.models.FacebookBackend',\n    'django.contrib.auth.backends.ModelBackend',\n)\n<\/pre>\n<p>The last step to configuring your app is getting the Facebook-specific information in.  This will require you to get a Facebook API key.  Head over to their <a href=\"http:\/\/www.facebook.com\/developers\" target=\"_blank\">developer site<\/a> and create an application.  You&#8217;ll need to fill in the &#8220;Connect&#8221; information for your app once you get it set up as well.<\/p>\n<p>With Facebook info in-hand, we can finish the settings.py file.<\/p>\n<pre class=\"syntax python\">\nDUMMY_FACEBOOK_INFO = {\n    'uid':0,\n    'name':'(Private)',\n    'first_name':'(Private)',\n    'pic_square_with_logo':'http:\/\/www.facebook.com\/pics\/t_silhouette.gif',\n    'affiliations':None,\n    'status':None,\n    'proxied_email':None,\n}\n\nFACEBOOK_API_KEY = '00000000000000000000000000000000'\nFACEBOOK_SECRET_KEY = '00000000000000000000000000000000'\nFACEBOOK_INTERNAL = True\n#Cache facebook info for x seconds. Default is 30 minutes\nFACEBOOK_CACHE_TIMEOUT = 1800\n<\/pre>\n<p>What we&#8217;ve done here is set up some dummy information for Facebook to display, in case something goes wrong with the connection.  This happens from time to time, so Facebook attempts to break gracefully, rather than taking your site down with an ugly error message.<\/p>\n<p>Underneath that is where you&#8217;ll put your API keys, and set the cache timeout limit.  I don&#8217;t know what the FACEBOOK_INTERNAL call does, except that PyFacebook requires it.  I&#8217;ve messaged the author of PyFacebook for some more information, and will update this post when I get it.<\/p>\n\n<h3>Configure URLs, and add the Facebook Connect button to your template.<\/h3>\n<p>Ok, we are almost ready to rock and roll.  All that&#8217;s left is adding the new URLs, and putting the relevant tags into your templates.  Open up your project&#8217;s urls.py file and make the following changes.<\/p>\n<pre class=\"syntax python\">\nurlpatterns = patterns('',\n    ...,\n    (r'^facebook\/', include('facebookconnect.urls')),\n)\n<\/pre>\n<p>Now, open up your registration\/login.html template, and add these tags.<\/p>\n<pre class=\"syntax python\">\n#Top of the page\n{% load facebook_tags %}\n\n#In the head tag\n{% facebook_js %}\n{% initialize_facebook_connect %}\n\n#Wherever you want the button to appear\n{% show_connect_button %}\n<\/pre>\n<p>Start your server up, and <em>voila<\/em>, you should have a Connect with Facebook button on your login page. Clicking on it should take you to a Facebook Login page, and when you successfully log in, you will be redirected to the accounts\/profile page. Pretty cool, eh?<\/p>\n\n<h3>But wait, there&#8217;s more!<\/h3>\n<p>\nThere are some very interesting options available to the django-facebookconnect app, and I suggest you take a look at the <a href=\"http:\/\/code.google.com\/p\/django-facebookconnect\/wiki\/Installation\" target=\"_blank\">installation instructions<\/a> to learn more.  Changing the page that Facebook redirects to after login might be particularly useful.<\/p>\n<p>Letting your users utilize a pre-existing account, especially one that is most likely central to their internet lives, will encourage casual browsers to become actual users. Adding additional options, such as OpenID, is also advisable so you can capitalize on the wealth of data that\u2019s already out there. Not having to worry about account management also frees up time to for you to streamline your application.\n<\/p>","tags":["django","development"]},{"id":"725558757","url":"http:\/\/blog.kevin-whitaker.net\/post\/725558757","url-with-slug":"http:\/\/blog.kevin-whitaker.net\/post\/725558757\/running-django-with-postgres-nginx-and-fastcgi-on","type":"regular","date-gmt":"2010-06-22 15:00:00 GMT","date":"Tue, 22 Jun 2010 10:00:00","bookmarklet":0,"mobile":0,"feed-item":"","from-feed-id":0,"unix-timestamp":1277218800,"format":"html","reblog-key":"etSidvBS","slug":"running-django-with-postgres-nginx-and-fastcgi-on","regular-title":"Running Django with Postgres, Nginx, and FastCGI on Ubuntu 10.4","regular-body":"<p>\nLast week, I decided that I needed to virtualize my Django test environment, and get it off my MacBook. I plan on upgrading at some point in the future, so not having to go through all the steps to set up the environment again would be nice. Plus, getting Django running on the MacBook was a bit complicated, and I\u2019d like to avoid that. So, with the goal of \u201ceasy installation\u201d in mind, I started working on a new VM.\n<\/p>\n<h3>*Update*:<\/h3>\n<p>A friend and co-worker, <a href=\"http:\/\/brandonkonkle.com\/blog\/2010\/jun\/25\/provisioning-new-ubuntu-server-django\/\">Brandon Konkle<\/a>, just posted a great article using the basics I listed below, but adding Green Unicorn instead of FastCGI, and with virtualenv to manage dependencies.  Great read.\n<\/p>\n<h3>The Stack<\/h3>\n<p>\nStarting off, I decided on a few main goals for my VM:\n<\/p>\n<ol><li>It would run on Ubuntu, because that\u2019s the Linux distro I\u2019m most familiar with.<\/li>\n<li>The web server would need to have a low memory footprint.<\/li>\n<li>It shouldn\u2019t run MySQL, as some of the <a href=\"http:\/\/twitter.com\/jacobian\/status\/16244029521\" target=\"_blank\">Django muckity-mucks<\/a> recommend against it.<\/li>\n<\/ol>\nSo, the stack ended up being:\n<ul><li>Ubuntu Server 10.4 x64<\/li>\n<li>Nginx<\/li>\n<li>PostgreSQL 8<\/li>\n<li>Django 1.2<\/li>\n<\/ul><p>\nNow, some of this stuff (Ubuntu and Django) are versions that have very recently been released. If you aren\u2019t comfortable running the latest revisions (or if your app has specific needs for older versions), pick those instead.\n<\/p>\n<h3>The Problem<\/h3>\n<p>\nUnfortunately, I couldn\u2019t find a set of instructions detailing exactly what I want. Plenty of good posts on running Django on Apache, or using MySQL, but nothing for the stack I had decided on. So, I culled what I could from various posts, and decided to aggregate the steps here.\n<\/p>\n<h3>Assumptions<\/h3>\n<p>\nThis post assumes that you have some knowledge of how to get Ubuntu up and running. If you need additional information for that, I recommend checking out the <a href=\"http:\/\/articles.slicehost.com\">Slice Host Articles<\/a>.  They\u2019re a top-notch resource for all kinds of info.<\/p>\n<p><strong>Note:<\/strong> If you\u2019re on a MacBook, you\u2019ll need to select the \u201cApple Laptop\u201d keyboard during Ubuntu setup. If you don\u2019t do this, your keys may act funky. To reconfigure, you can run:\n<\/p>\n<blockquote><pre>sudo dpkg-reconfigure console-setup<\/pre><\/blockquote>\n<h3>Install Nginx<\/h3>\n<p>\nOnce you\u2019ve got Ubuntu up and running, it\u2019s time to get Nginx going. I\u2019m just going to link to the slicehost articles for this, because, frankly, they\u2019ve already gone through the trouble on this part.\n<\/p>\n<ol><li><a href=\"http:\/\/articles.slicehost.com\/2008\/5\/13\/ubuntu-hardy-installing-nginx-via-aptitude\">Installing Nginx with Aptitude<\/a><\/li>\n<li><a href=\"http:\/\/articles.slicehost.com\/2008\/5\/15\/ubuntu-hardy-nginx-configuration\">Basic Nginx configuration<\/a><\/li>\n<li><a href=\"http:\/\/articles.slicehost.com\/2008\/5\/16\/ubuntu-hardy-nginx-virtual-hosts\">Nginx virtual host setup<\/a><\/li>\n<\/ol><p>I don\u2019t do the last step, because I\u2019m building this on a VM, so instead I just use Nginx\u2019s default site configuration file. You should use whichever option is better for your environment.<\/p>\n<h3>Install PostgreSQL<\/h3>\n<p>Luckily, Ubuntu makes it pretty easy to get PostgreSQL installed.<\/p>\n<blockquote><pre>sudo apt-get install postgresql pgadmin3 python-psycopg2<\/pre><\/blockquote>\n<p>This will install PosgresSQL, PG Admin III, and PsycoPG (which you need for Python to talk to the database).<\/p>\n<p>You\u2019ll also want to setup a database user account.<\/p>\n<blockquote><pre>\nsudo su -\npasswd postgres\nsu postgres\npsql template1\n<\/pre><\/blockquote>\n<p>The last command will open a PosgreSQL command line, where you can type the following, making the necessary substitutions:<\/p>\n<blockquote><pre>ALTER USER postgres WITH ENCRYPTED PASSWORD 'mypassword';<\/pre><\/blockquote>\n<p>Then exit PSQL.<\/p>\n<h3>Install Django<\/h3>\n<p>To install Django, it\u2019s easiest to install subversion first, and then clone the repository.<\/p>\n<blockquote><pre>\nsudo apt-get install subversion\nsvn co <a href=\"http:\/\/code.djangoproject.com\/svn\/django\/trunk\">http:\/\/code.djangoproject.com\/svn\/django\/trunk<\/a> django_trunk\nsudo python django_trunk\/setup.py install\n<\/pre><\/blockquote>\n<p>Once Django is installed, you can verify it by opening up your Python console:<\/p>\n<blockquote><pre>\npython\nimport django\nprint django.VERSION\nimport psycopg2\npsycopg2.apilevel\nexit()\n<\/pre><\/blockquote>\n<h3>Install flup<\/h3>\n<p>We also need to install flup, so that FastCGI can pass the Django requests from Nginx to the Django server.<\/p>\n<blockquote><pre>\nsudo wget <a href=\"http:\/\/www.saddi.com\/software\/flup\/dist\/flup-1.0.2-py2.5.egg\">http:\/\/www.saddi.com\/software\/flup\/dist\/flup-1.0.2-py2.5.egg<\/a>\nsudo easy_install flup-1.0.2-py2.5.egg\n<\/pre><\/blockquote>\n<h3>Build Your Test Project<\/h3>\n<p>Now that everything is installed, it\u2019s time to make sure it worked. Build out an empty test project.<\/p>\n<blockquote><pre>\ncd ~\/public_html\/testproject\/private\ndjango-admin.py startproject testproject\ncd testproject\npython manage.py startapp myapp\nnano settings.py\n<\/pre><\/blockquote>\n<p>You\u2019ll then need to enter some database information.<\/p>\n<blockquote><pre>\nDATABASE_ENGINE = 'django.db.backends.postgresql_psycopg2'\nDATABASE_NAME = 'testproject'\nDATABASE_USER = 'postgres'\nDATABASE_PASSWORD = 'mypasswd'\nDATABASE_HOST = ''\nDATABASE_PORT = ''            \n<\/pre><\/blockquote>\n<p>Don\u2019t worry about setting up the media directories and such, as we just want the default \u201cWelcome to Django\u201d page for the time being.<\/p>\n<h3>Nginx Configuration<\/h3>\n<p>Now that the backend stuff is good to go, it\u2019s time to get your Nginx configuration taken care of. If you installed Nginx via aptitude, you\u2019ll want to stop the server.<\/p>\n<blockquote><pre>sudo \/etc\/init.d\/nginx stop<\/pre><\/blockquote>\n<p>Since I\u2019m just using this as a test bed, accessed locally, I made my changes in Nginx\u2019s default site configuration. Feel free to add another virtual host if you need to.<\/p>\n<blockquote><pre>\nsudo nano \/etc\/nginx\/sites-available\/default\n<\/pre><\/blockquote>\n<p>Once you\u2019re in the configuration file, change it to this:<\/p>\n<blockquote><pre>\nserver\n{\n    listen   80;\n\n    server_name localhost;\n    access_log \/home\/username\/public_html\/testproject\/log\/localhost.access.log;\n    error_log \/home\/username\/public_html\/testproject\/log\/localhost.error.log;\n    root \/home\/username\/public_html\/testproject\/public;\n\n    location \/site_media\n    {\n        root \/home\/username\/public_html\/testproject\/public;\n    }\n\n    location \/\n    {\n        # host and port to fastcgi server\n        fastcgi_pass 127.0.0.1:8081;\n        fastcgi_param PATH_INFO $fastcgi_script_name;\n        fastcgi_param REQUEST_METHOD $request_method;\n        fastcgi_param QUERY_STRING $query_string;\n        fastcgi_param CONTENT_TYPE $content_type;\n        fastcgi_param CONTENT_LENGTH $content_length;\n        fastcgi_pass_header Authorization;\n        fastcgi_intercept_errors off;\n    }\n}\n<\/pre>\n<\/blockquote>\n<p>This will ensure that all requests for dynamic content (read: Django) get passed to Django, and all static content (images, stylesheets, scripts, etc.) just go through Nginx as normal. You don\u2019t have to use port 8081 here, but take note of whichever port you <em>do<\/em> decide on, as we\u2019ll need it next.<\/p>\n<h3>Run Django as a FastCGI process<\/h3>\n<p>The last thing we need to do is get Django set up to run as a FastCGI process.<\/p>\n<blockquote><pre>\ncd ~\/public_html\/testproject\/\npython manage.py runfcgi host=127.0.0.1 port=8081 --settings=settings\n<\/pre><\/blockquote>\n<p>Also, don\u2019t forget to restart Nginx.<\/p>\n<blockquote><pre>sudo \/etc\/init.d\/nginx start<\/pre><\/blockquote>\n<h3>The End<\/h3>\n<p>And that\u2019s it! You should now be able to head over to the VM\u2019s IP address, and get the \u201cWelcome to Django - Get Working!\u201d page. If not, you should review the steps I\u2019ve placed here, and see if you missed anything. There\u2019s also the possibility that <em>I<\/em> missed something, in which case, feel free to flog me in the comments below.<\/p>\n<h3>Gotta Give Respect<\/h3>\n<p>\nRespect needs to be paid to <a href=\"http:\/\/www.dmclaughlin.com\/2008\/11\/03\/complete-guide-to-deploying-django-on-ubuntu-with-nginx-fastcgi-and-mysql\/%22\" target=\"_blank\">David McLaughlin<\/a> and <a href=\"http:\/\/programmingzen.com\/2007\/12\/26\/installing-django-with-postgresql-on-ubuntu\/\" target=\"_blank\">Antonio Cangiano<\/a>, both of whom produced a lot of the information that I\u2019ve repurposed here. You should read their guides if you have any additional questions (David goes into FTP servers and getting your Admin media synced, for instance).<\/p>","tags":["django","postgres","nginx","ubuntu"]},{"id":"701154305","url":"http:\/\/blog.kevin-whitaker.net\/post\/701154305","url-with-slug":"http:\/\/blog.kevin-whitaker.net\/post\/701154305\/keeping-yourself-creative","type":"regular","date-gmt":"2010-06-15 15:01:30 GMT","date":"Tue, 15 Jun 2010 10:01:30","bookmarklet":0,"mobile":0,"feed-item":"","from-feed-id":0,"unix-timestamp":1276614090,"format":"html","reblog-key":"WQf3Bz7z","slug":"keeping-yourself-creative","regular-title":"Keeping yourself creative","regular-body":"<p>\n<span class=\"drop\">B<\/span>eing creative is hard.  Staying creative is even harder.  If you doubt that, just <a href=\"http:\/\/www.google.com\/search?q=how%20to%20stay%20creative\">take a look<\/a> at all the blog posts and sites dedicated to helping people stay inspired. So, in the face of looming deadlines, impossible requests, and a never-ending mass of projects, how can you keep your mind ready to deliver an awesome product?<\/p>\n<p>\nI\u2019m not asking this question rhetorically. Recently, I discovered that it was just, hard, for me to be creative anymore. Every idea I came up with sounded flat, or boring, or worse, like a rehash of someone else\u2019s superior product. I\u2019m not talking about just the visual stuff, either. My code felt stale, my writing (I occasionally write stuff for pleasure) seemed dull. Everything.\n<\/p>\n<p>\nSo, after doing some thinking, I found what I thought was the answer. Being creative had become my <em>job<\/em>, and because it was my job, I just didn\u2019t want to do it when a paycheck wasn\u2019t involved. I didn\u2019t just let my mind \u201cdo it\u2019s own thing\u201d anymore. Instead, I tried to force creativity out of it like blood from a stone.\n<\/p>\n<p>So, I started thinking about how I could break out of my rut, and let myself <em>enjoy<\/em> the creative process again. The answer turned out to be simple. <strong>Make small, creative goals or tasks that aren\u2019t tied to any specific objective, other than completing them for their own sake.<\/strong>\n<\/p>\n<h3>A little historical perspective.<\/h3>\n<p>\nWhen I was younger, I used to draw constantly. Blank pages, margins in my notes (or papers) for class, backs of binders, folders, sketchbooks, my desk, etc. If there was an empty surface, I would draw on it. Most of the time, all I did was doodle or sketch. Usually I would draw multiple, disparate sketches on the same piece of paper before moving onto something else.\n<\/p>\n<p>\nMy sketching habit go so \u201cbad\u201d at one point that my history teacher had to call my mother and speak with her about all the doodles she was finding on my papers. My grades weren\u2019t slipping, and my sketches weren\u2019t violent or awful, but my sketching was almost compulsive, and that worried my teacher.\n<\/p>\n<p>\nAfter some discussion, my mother and my teacher determined that sketching was how I kept focused, and, more importantly, <strong>how I kept creative.<\/strong>\n<\/p>\n<h3>I ain&#8217;t gonna paint(or sketch) no more.<\/h3>\n<p>\nWhen I got older, sketching stopped being part of the equation. I got a \u201creal\u201d j-o-b, and didn\u2019t have the time or inclination to \u201cwaste time\u201d sketching. Unfortunately, I now realize that I was denying my brain what it needed to detox. By only associating the creative process with \u201cwork,\u201d I was slowly associating it with something that I didn\u2019t do for enjoyment. Ultimately, this resulted in the \u201ccreativity crisis\u201d that I discussed above.\n<\/p>\n<h3>Micro-goals might be the answer.<\/h3>\n<p>To break out of the rut, I decided the that I needed to rewire my brain to re-associate the creative process with enjoyment instead of just work. So, I decided that every day, rain or shine, I would sketch <em>something<\/em>. I would never pre-determine what I would sketch, and neither would I decide how long to sketch for. If I drew for ten minutes, great. If it was an hour, even better.<\/p>\n<p>\nSo, I <a href=\"http:\/\/www.tenonedesign.com\/stylus.php\">ordered a stylus<\/a> for my iPad, and downloaded the <a href=\"http:\/\/usa.autodesk.com\/adsk\/servlet\/pc\/item?siteID=123112&amp;id=15119465\">Sketchbook Pro<\/a> app.  Now, I\u2019m not saying you should run out and drop $500 for an iPad. Pencil and paper will do just fine (they\u2019ve worked for thousands of years, after all). I just usually have my iPad with me, and it provides an easy way to share my sketches, if I choose to do so.<\/p>\n<p>So did it work? I\u2019d like to think so. After a week or so of getting back into it, I\u2019ve noticed that I slide more easily into the \u201ccreative mode\u201d at work. Also, sketching itself comes easier to me. I\u2019d say that I\u2019m on the track to recovery.<\/p>\n<h3>But I&#8217;m a developer\/writer\/someone who doesn&#8217;t draw!<\/h3>\n<p>\nUsually when people speak of \u201cfinding inspiration,\u201d they talk about it in artistic terms. But this shouldn\u2019t shut out developers, or tech writers, or executives, or anyone, for that matter.<\/p>\n<p>Developers can set minor daily or weekly coding projects.  Writers can pull a <em><a href=\"http:\/\/www.imdb.com\/title\/tt0181536\/\">Finding Forester<\/a><\/em> and try to write a set-amount a day.\n<\/p>\n<p>If you can\u2019t think of anything that is related to what yo do, try something that isn\u2019t. For instance, along with my daily \u201csketch challenge,\u201d I\u2019ve decided that every week I\u2019m going to cook something that I have never cooked before. Last week was Thai-Curry Beef with Crispy Noodle cake (not so good), and this week will be something totally different. You might try running or exercise (a great way to \u201czone\u201d and let your mind start to wander). The point is to let your mind \u201cdo its own thing,\u201d and take the rest of you along for the ride.<\/p>\n<h3>Some additional inspiration.<\/h3>\n<p>\nIf you&#8217;re having trouble keeping inspired, you might try some of these resources:\n<\/p>\n<ul><li><a href=\"http:\/\/twitter.com\">Twitter<\/a> - Try to follow people that have meaningful ideas to talk about. I can recommend\n<a href=\"http:\/\/twitter.com\/happycog\">@happycog<\/a> and <a href=\"http:\/\/twitter.com\/beep\">@beep<\/a> for starters.<\/li>\n<li><a href=\"http:\/\/dribbble.com\/\">Dribbble<\/a> - Even if you aren&#8217;t a member (which I am not, *cough*), there are some amazing &#8220;shots&#8221; on this site that can spur your own ideas.<\/li>\n<li><a href=\"http:\/\/flickr.com\/\">Flickr<\/a> - Take a walk through some random tags and see what fires up your mind.<\/li>\n<li><a href=\"http:\/\/feedgrids.com\/\">FeedGrids<\/a> - An excellent design and development post aggregator, pulling info from most of the major sites, as well as posting their own original content.<\/li>\n<li><a href=\"http:\/\/www.fuelyourwriting.com\/\">Fuel Your Writing<\/a> - A great site dedicated to helping writers improve their craft.<\/li>\n<li><a href=\"http:\/\/code.google.com\/codejam\">Google Code Jam<\/a> - An awesome (and competitive) way to flex your coding muscles<\/li>\n<\/ul>","tags":["design","inspiration","writing","coding"]}]};

