<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-36312929</id><updated>2009-10-11T09:22:14.852-04:00</updated><title type='text'>Evan Reiser's Blog</title><subtitle type='html'>Technology, Database Systems, Computer Systems Engineering, &amp; Web Design</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.evanreiser.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default'/><link rel='alternate' type='text/html' href='http://www.evanreiser.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default?start-index=26&amp;max-results=25'/><author><name>Evan Reiser</name><uri>http://www.blogger.com/profile/01139605078652057619</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>87</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-36312929.post-576927962806599797</id><published>2009-04-28T14:39:00.002-04:00</published><updated>2009-04-28T14:40:50.963-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Django'/><title type='text'>Halve your site's page sizes in 5 minutes</title><content type='html'>&lt;div&gt;This reduces our page sizes by up to 50%+&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;from django.utils.html import strip_spaces_between_tags&lt;br /&gt;from django.conf import settings&lt;br /&gt;&lt;br /&gt;class SpacelessMiddleware(object):&lt;br /&gt;   def process_response(self, request, response):&lt;br /&gt;       if not settings.DEBUG:&lt;br /&gt;           if 'text/html' in response['Content-Type']:&lt;br /&gt;               response.content = strip_spaces_between_tags(response.content)&lt;br /&gt;       return response&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36312929-576927962806599797?l=www.evanreiser.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.evanreiser.com/feeds/576927962806599797/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36312929&amp;postID=576927962806599797' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/576927962806599797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/576927962806599797'/><link rel='alternate' type='text/html' href='http://www.evanreiser.com/2009/04/halve-your-sites-page-sizes-in-5.html' title='Halve your site&apos;s page sizes in 5 minutes'/><author><name>Evan Reiser</name><uri>http://www.blogger.com/profile/01139605078652057619</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13845188015153247593'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36312929.post-7400983513340294994</id><published>2009-03-03T22:31:00.002-05:00</published><updated>2009-03-03T23:20:10.902-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Injection'/><category scheme='http://www.blogger.com/atom/ns#' term='Django'/><category scheme='http://www.blogger.com/atom/ns#' term='Database Systems'/><title type='text'>I havent had to worry about SQL recently</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://imgs.xkcd.com/comics/exploits_of_a_mom.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 666px; height: 205px;" src="http://imgs.xkcd.com/comics/exploits_of_a_mom.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;I'm happy django does all the database work for me so i can spend my time building features and writing the same snippets of code all over the application.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.evanreiser.com/2007/09/why-you-should-use-stored-procedures.html"&gt;More on SQL Injection&lt;/a&gt;&lt;br /&gt;&lt;span class="Apple-style-span"   style="  font-style: italic; font-variant: small-caps; font-weight: bold;font-family:Lucida;font-size:12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36312929-7400983513340294994?l=www.evanreiser.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.evanreiser.com/feeds/7400983513340294994/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36312929&amp;postID=7400983513340294994' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/7400983513340294994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/7400983513340294994'/><link rel='alternate' type='text/html' href='http://www.evanreiser.com/2009/03/i-havent-had-to-worry-about-sql.html' title='I havent had to worry about SQL recently'/><author><name>Evan Reiser</name><uri>http://www.blogger.com/profile/01139605078652057619</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13845188015153247593'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36312929.post-7953078258487618060</id><published>2009-01-05T00:23:00.003-05:00</published><updated>2009-01-05T00:28:27.000-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Django'/><title type='text'>howto: group by in django</title><content type='html'>&lt;div&gt;&lt;div&gt;Django doesnt officially yet support group by, however the code to acomplish this is actually hidden inside.  If you had a model that tracked registrations, which contained a FK to the user that refered the new user such as:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;class Registration(models.Model):&lt;/div&gt;&lt;div&gt;        ...&lt;/div&gt;&lt;div&gt;        referer = models.ForeignKey(User,null=True,blank=True)&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&gt;&gt;&gt; from registration.models import Registration&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&gt;&gt;&gt; query_set = Registration.objects.extra(select={'count': 'count(1)'}, order_by=['-count'],where=['referer_id is not null']).values('count', 'referer')  &lt;/div&gt;&lt;div&gt;&gt;&gt;&gt; query_set.query.group_by = ['referer_id']&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&gt;&gt;&gt; for row in query_set:&lt;/div&gt;&lt;div&gt;...  print row                                                                                                                                  &lt;/div&gt;&lt;div&gt;... &lt;/div&gt;&lt;div&gt;{'count': 26L, 'referer': 6384}&lt;/div&gt;&lt;div&gt;{'count': 4L, 'referer': 6871}&lt;/div&gt;&lt;div&gt;{'count': 3L, 'referer': 9993}&lt;/div&gt;&lt;div&gt;{'count': 2L, 'referer': 7804}&lt;/div&gt;&lt;div&gt;{'count': 2L, 'referer': 7892}&lt;/div&gt;&lt;div&gt;{'count': 2L, 'referer': 9699}&lt;/div&gt;&lt;div&gt;{'count': 1L, 'referer': 6111}&lt;/div&gt;&lt;div&gt;{'count': 1L, 'referer': 7821}&lt;/div&gt;&lt;div&gt;{'count': 1L, 'referer': 5025}&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;this is as of &lt;/div&gt;&lt;div&gt;&lt;div&gt;Last Changed Rev: 9037&lt;/div&gt;&lt;div&gt;Last Changed Date: 2008-09-15 14:06:02 -0400 (Mon, 15 Sep 2008)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36312929-7953078258487618060?l=www.evanreiser.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.evanreiser.com/feeds/7953078258487618060/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36312929&amp;postID=7953078258487618060' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/7953078258487618060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/7953078258487618060'/><link rel='alternate' type='text/html' href='http://www.evanreiser.com/2009/01/howto-group-by-in-django.html' title='howto: group by in django'/><author><name>Evan Reiser</name><uri>http://www.blogger.com/profile/01139605078652057619</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13845188015153247593'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36312929.post-2848984732692632025</id><published>2008-12-04T11:52:00.002-05:00</published><updated>2008-12-04T11:54:23.567-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='geodjango'/><category scheme='http://www.blogger.com/atom/ns#' term='Django'/><category scheme='http://www.blogger.com/atom/ns#' term='django.contrib.gis'/><title type='text'>GeoDjango Error when using python2.4</title><content type='html'>Anyone getting this error?&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;  File "/usr/lib/python2.4/site-packages/django/contrib/gis/db/models/__init__.py", line 5, in ?&lt;/div&gt;&lt;div&gt;    from django.contrib.gis.db.models.manager import GeoManager&lt;/div&gt;&lt;div&gt;  File "/usr/lib/python2.4/site-packages/django/contrib/gis/db/models/manager.py", line 2, in ?&lt;/div&gt;&lt;div&gt;    from django.contrib.gis.db.models.query import GeoQuerySet&lt;/div&gt;&lt;div&gt;  File "/usr/lib/python2.4/site-packages/django/contrib/gis/db/models/query.py", line 5, in ?&lt;/div&gt;&lt;div&gt;    from django.contrib.gis.db.backend import SpatialBackend&lt;/div&gt;&lt;div&gt;  File "/usr/lib/python2.4/site-packages/django/contrib/gis/db/backend/__init__.py", line 12, in ?&lt;/div&gt;&lt;div&gt;    from django.contrib.gis.db.backend.postgis import create_spatial_db, get_geo_where_clause, SpatialBackend&lt;/div&gt;&lt;div&gt;  File "/usr/lib/python2.4/site-packages/django/contrib/gis/db/backend/postgis/__init__.py", line 3, in ?&lt;/div&gt;&lt;div&gt;    from django.contrib.gis.db.backend.base import BaseSpatialBackend&lt;/div&gt;&lt;div&gt;  File "/usr/lib/python2.4/site-packages/django/contrib/gis/db/backend/base.py", line 7, in ?&lt;/div&gt;&lt;div&gt;    from django.contrib.gis.geos import GEOSGeometry, GEOSException&lt;/div&gt;&lt;div&gt;  File "/usr/lib/python2.4/site-packages/django/contrib/gis/geos/__init__.py", line 31, in ?&lt;/div&gt;&lt;div&gt;    from django.contrib.gis.geos.base import GEOSGeometry, wkt_regex, hex_regex&lt;/div&gt;&lt;div&gt;  File "/usr/lib/python2.4/site-packages/django/contrib/gis/geos/base.py", line 11, in ?&lt;/div&gt;&lt;div&gt;    from django.contrib.gis.geos.coordseq import GEOSCoordSeq&lt;/div&gt;&lt;div&gt;  File "/usr/lib/python2.4/site-packages/django/contrib/gis/geos/coordseq.py", line 10, in ?&lt;/div&gt;&lt;div&gt;    from django.contrib.gis.geos.prototypes import cs_clone, cs_getdims, cs_getordinate, cs_getsize, cs_setordinate&lt;/div&gt;&lt;div&gt;  File "/usr/lib/python2.4/site-packages/django/contrib/gis/geos/prototypes/__init__.py", line 8, in ?&lt;/div&gt;&lt;div&gt;    from django.contrib.gis.geos.prototypes.coordseq import create_cs, get_cs, \&lt;/div&gt;&lt;div&gt;  File "/usr/lib/python2.4/site-packages/django/contrib/gis/geos/prototypes/coordseq.py", line 67, in ?&lt;/div&gt;&lt;div&gt;    cs_getordinate = cs_operation(lgeos.GEOSCoordSeq_getOrdinate, ordinate=True, get=True)&lt;/div&gt;&lt;div&gt;  File "/usr/lib/python2.4/site-packages/ctypes/__init__.py", line 328, in __getattr__&lt;/div&gt;&lt;div&gt;    func = self.__getitem__(name)&lt;/div&gt;&lt;div&gt;  File "/usr/lib/python2.4/site-packages/ctypes/__init__.py", line 333, in __getitem__&lt;/div&gt;&lt;div&gt;    func = self._FuncPtr((name_or_ordinal, self))&lt;/div&gt;&lt;div&gt;AttributeError: /usr/lib/libgeos_c.so.1: undefined symbol: GEOSCoordSeq_getOrdinate&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;I found this on our server which was running &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;python 2.4, I've heard from some other people that upgrading to python 2.5 fixed this problem. &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36312929-2848984732692632025?l=www.evanreiser.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.evanreiser.com/feeds/2848984732692632025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36312929&amp;postID=2848984732692632025' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/2848984732692632025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/2848984732692632025'/><link rel='alternate' type='text/html' href='http://www.evanreiser.com/2008/12/geodjango-error-when-using-python24.html' title='GeoDjango Error when using python2.4'/><author><name>Evan Reiser</name><uri>http://www.blogger.com/profile/01139605078652057619</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13845188015153247593'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36312929.post-69701250152865484</id><published>2008-11-30T09:15:00.001-05:00</published><updated>2008-11-30T09:17:50.576-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GamerNook'/><category scheme='http://www.blogger.com/atom/ns#' term='Social Networking Platform'/><title type='text'>New Friend Requests</title><content type='html'>&lt;div&gt;The New Friend Requests Page now shows additional information about your potential friend, including your mutual friends&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_7NyTnt202Ww/STKgVGPZwVI/AAAAAAAAALw/4qzO8CcOM9Y/s1600-h/friend_requests.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 161px;" src="http://2.bp.blogspot.com/_7NyTnt202Ww/STKgVGPZwVI/AAAAAAAAALw/4qzO8CcOM9Y/s400/friend_requests.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5274454397917184338" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36312929-69701250152865484?l=www.evanreiser.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.evanreiser.com/feeds/69701250152865484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36312929&amp;postID=69701250152865484' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/69701250152865484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/69701250152865484'/><link rel='alternate' type='text/html' href='http://www.evanreiser.com/2008/11/new-friend-requests.html' title='New Friend Requests'/><author><name>Evan Reiser</name><uri>http://www.blogger.com/profile/01139605078652057619</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13845188015153247593'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_7NyTnt202Ww/STKgVGPZwVI/AAAAAAAAALw/4qzO8CcOM9Y/s72-c/friend_requests.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36312929.post-4676091971059322255</id><published>2008-08-16T18:01:00.003-04:00</published><updated>2008-08-16T18:02:47.891-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Django'/><title type='text'>ImportError: cannot import name ImageField</title><content type='html'>I came across this error when updating django to the lastest SVN version for &lt;a href="http://www.gamernook.com"&gt;gamernook.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The fix was to replace&lt;br /&gt;&lt;p&gt;&lt;code&gt;from django.db.models.fields import ImageField&lt;/code&gt;&lt;/p&gt;with &lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;p&gt;&lt;code&gt;from django.db.models.fields.files import ImageField &lt;/code&gt;&lt;/p&gt;Easy enough, but took a while to figure out&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36312929-4676091971059322255?l=www.evanreiser.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.evanreiser.com/feeds/4676091971059322255/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36312929&amp;postID=4676091971059322255' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/4676091971059322255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/4676091971059322255'/><link rel='alternate' type='text/html' href='http://www.evanreiser.com/2008/08/importerror-cannot-import-name.html' title='ImportError: cannot import name ImageField'/><author><name>Evan Reiser</name><uri>http://www.blogger.com/profile/01139605078652057619</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13845188015153247593'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36312929.post-5619205037429477857</id><published>2008-02-07T19:57:00.000-05:00</published><updated>2008-02-07T21:33:51.431-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Django'/><category scheme='http://www.blogger.com/atom/ns#' term='youtube'/><title type='text'>Building a YouTube Clone (Day7)</title><content type='html'>Today i changed the way videos are stored in the database and abstracted the storage of the actual media.  Now videos can either be uploaded by users or can be submitted from other video sites such as YouTube.  This allows users to discuss and share content even if the video isn't physically on their computer.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_7NyTnt202Ww/R6upSg4dQCI/AAAAAAAAAHk/CUBO-uD5fCY/s1600-h/Day7-1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_7NyTnt202Ww/R6upSg4dQCI/AAAAAAAAAHk/CUBO-uD5fCY/s400/Day7-1.jpg" alt="" id="BLOGGER_PHOTO_ID_5164407533239877666" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_7NyTnt202Ww/R6u_Gw4dQDI/AAAAAAAAAHs/5UMBco4NCnM/s1600-h/Day7-2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_7NyTnt202Ww/R6u_Gw4dQDI/AAAAAAAAAHs/5UMBco4NCnM/s400/Day7-2.jpg" alt="" id="BLOGGER_PHOTO_ID_5164431520632225842" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36312929-5619205037429477857?l=www.evanreiser.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.evanreiser.com/feeds/5619205037429477857/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36312929&amp;postID=5619205037429477857' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/5619205037429477857'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/5619205037429477857'/><link rel='alternate' type='text/html' href='http://www.evanreiser.com/2008/02/building-youtube-clone-day7.html' title='Building a YouTube Clone (Day7)'/><author><name>Evan Reiser</name><uri>http://www.blogger.com/profile/01139605078652057619</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13845188015153247593'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_7NyTnt202Ww/R6upSg4dQCI/AAAAAAAAAHk/CUBO-uD5fCY/s72-c/Day7-1.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36312929.post-2318486536344751466</id><published>2008-02-05T19:25:00.000-05:00</published><updated>2008-02-05T19:33:36.447-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Django'/><title type='text'>Building a YouTube Clone (Day 6)</title><content type='html'>Today I finished the user profile pages.  User profile pages show basic info about the user. User's can set a featured video to show off on their profile page.   User's can now subscribe to various channels/users. The profile page also shows all of the user's videos, as well as their channel subscribers and subscriptions.  In the future this page will also showcase the user's playlists, their interests, and their videolog/blog.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_7NyTnt202Ww/R6kARg4dQBI/AAAAAAAAAHc/trg6jcJsKwE/s1600-h/Day6.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_7NyTnt202Ww/R6kARg4dQBI/AAAAAAAAAHc/trg6jcJsKwE/s400/Day6.jpg" alt="" id="BLOGGER_PHOTO_ID_5163658748641493010" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;User's can also now edit their profiles, and upload a user picture/avatar.  Right now the user profile has the same fields as YouTube but this can and will change in the future.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_7NyTnt202Ww/R6j_vw4dQAI/AAAAAAAAAHU/T3yB0vd62VI/s1600-h/Day6-2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_7NyTnt202Ww/R6j_vw4dQAI/AAAAAAAAAHU/T3yB0vd62VI/s400/Day6-2.jpg" alt="" id="BLOGGER_PHOTO_ID_5163658168820908034" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36312929-2318486536344751466?l=www.evanreiser.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.evanreiser.com/feeds/2318486536344751466/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36312929&amp;postID=2318486536344751466' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/2318486536344751466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/2318486536344751466'/><link rel='alternate' type='text/html' href='http://www.evanreiser.com/2008/02/building-youtube-clone-day-6.html' title='Building a YouTube Clone (Day 6)'/><author><name>Evan Reiser</name><uri>http://www.blogger.com/profile/01139605078652057619</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13845188015153247593'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_7NyTnt202Ww/R6kARg4dQBI/AAAAAAAAAHc/trg6jcJsKwE/s72-c/Day6.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36312929.post-1113754312490912664</id><published>2008-02-04T18:05:00.001-05:00</published><updated>2008-02-04T19:15:38.262-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Django'/><title type='text'>Building a YouTube Clone (Day 5)</title><content type='html'>Today I rewrote the video browsing section to allow the user to change the sorting of results, and to change the time period of the search; additionally the user will be able to narrow down their search by category as well.  This will affect all result type pages where multiple videos are displayed, such as browsing for videos or viewing which video's you have favorited.&lt;br /&gt;&lt;br /&gt;Videos also now keep track of how many times they were commented on and how many times they were marked as favorites.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_7NyTnt202Ww/R6ea9w4dP9I/AAAAAAAAAG8/clfwTuqkmzM/s1600-h/Day5.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_7NyTnt202Ww/R6ea9w4dP9I/AAAAAAAAAG8/clfwTuqkmzM/s400/Day5.jpg" alt="" id="BLOGGER_PHOTO_ID_5163265883687960530" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_7NyTnt202Ww/R6ea9w4dP9I/AAAAAAAAAG8/clfwTuqkmzM/s1600-h/Day5.jpg"&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can also now search and browse by video tags:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_7NyTnt202Ww/R6elvQ4dP-I/AAAAAAAAAHE/K8FqzNCUnM8/s1600-h/Day5-2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_7NyTnt202Ww/R6elvQ4dP-I/AAAAAAAAAHE/K8FqzNCUnM8/s400/Day5-2.jpg" alt="" id="BLOGGER_PHOTO_ID_5163277729207762914" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Also whats not shown here is that you can filter down the current videos to a certain video category type as well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36312929-1113754312490912664?l=www.evanreiser.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.evanreiser.com/feeds/1113754312490912664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36312929&amp;postID=1113754312490912664' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/1113754312490912664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/1113754312490912664'/><link rel='alternate' type='text/html' href='http://www.evanreiser.com/2008/02/building-youtube-clone-day-5.html' title='Building a YouTube Clone (Day 5)'/><author><name>Evan Reiser</name><uri>http://www.blogger.com/profile/01139605078652057619</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13845188015153247593'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_7NyTnt202Ww/R6ea9w4dP9I/AAAAAAAAAG8/clfwTuqkmzM/s72-c/Day5.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36312929.post-570133565269276178</id><published>2008-01-31T19:16:00.000-05:00</published><updated>2008-01-31T19:34:07.006-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Django'/><title type='text'>Building a YouTube Clone (Day 4)</title><content type='html'>Today I expanding the functionality surrounding videos on the site.  Videos can now be rated, favorited, flagged, and commented on.  User's can view their videos and their favorite videos.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Video Ratings&lt;/li&gt;&lt;li&gt;Video Time Formatting&lt;/li&gt;&lt;li&gt;Video Favorites&lt;/li&gt;&lt;li&gt;Video Flagging&lt;/li&gt;&lt;li&gt;Video Commenting&lt;/li&gt;&lt;li&gt;Video Comment Rating&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Also what few people will appreciate is that the rating for a video are not discrete/quantum values but rather can be a floating point anywhere between 0.0 and 5.0, and the stars will display correctly to represent that rather than Youtube's 1.0, 1.5, 2.0, 2.5 etc&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_7NyTnt202Ww/R6Jocg4dP7I/AAAAAAAAAGs/ygV5WAKjG4c/s1600-h/Day4-2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_7NyTnt202Ww/R6Jocg4dP7I/AAAAAAAAAGs/ygV5WAKjG4c/s400/Day4-2.jpg" alt="" id="BLOGGER_PHOTO_ID_5161802961992368050" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_7NyTnt202Ww/R6JojQ4dP8I/AAAAAAAAAG0/gquJzMaiGx8/s1600-h/Day4.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_7NyTnt202Ww/R6JojQ4dP8I/AAAAAAAAAG0/gquJzMaiGx8/s400/Day4.jpg" alt="" id="BLOGGER_PHOTO_ID_5161803077956485058" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36312929-570133565269276178?l=www.evanreiser.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.evanreiser.com/feeds/570133565269276178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36312929&amp;postID=570133565269276178' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/570133565269276178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/570133565269276178'/><link rel='alternate' type='text/html' href='http://www.evanreiser.com/2008/01/building-youtube-clone-day-4.html' title='Building a YouTube Clone (Day 4)'/><author><name>Evan Reiser</name><uri>http://www.blogger.com/profile/01139605078652057619</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13845188015153247593'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_7NyTnt202Ww/R6Jocg4dP7I/AAAAAAAAAGs/ygV5WAKjG4c/s72-c/Day4-2.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36312929.post-8947901469639592298</id><published>2008-01-30T22:44:00.000-05:00</published><updated>2008-01-31T12:55:45.567-05:00</updated><title type='text'>Building a YouTube Clone (Day 3)</title><content type='html'>Today I finished integrating the video uploads, browsing and playing, all of this was made easy thanks to &lt;a href="http://www.twistage.com"&gt;Twistage&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_7NyTnt202Ww/R6H_Nw4dP4I/AAAAAAAAAGU/jhnq-L9jttk/s1600-h/Day3-2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_7NyTnt202Ww/R6H_Nw4dP4I/AAAAAAAAAGU/jhnq-L9jttk/s400/Day3-2.jpg" alt="" id="BLOGGER_PHOTO_ID_5161687259868381058" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_7NyTnt202Ww/R6H_JQ4dP3I/AAAAAAAAAGM/KuQaxbhDGXM/s1600-h/Day3-1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_7NyTnt202Ww/R6H_JQ4dP3I/AAAAAAAAAGM/KuQaxbhDGXM/s400/Day3-1.jpg" alt="" id="BLOGGER_PHOTO_ID_5161687182558969714" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_7NyTnt202Ww/R6H_EQ4dP2I/AAAAAAAAAGE/S0M0suhSzAE/s1600-h/Day3-3.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_7NyTnt202Ww/R6H_EQ4dP2I/AAAAAAAAAGE/S0M0suhSzAE/s400/Day3-3.jpg" alt="" id="BLOGGER_PHOTO_ID_5161687096659623778" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_7NyTnt202Ww/R6H-6A4dP1I/AAAAAAAAAF8/Evy0143a-38/s1600-h/Day3-4.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_7NyTnt202Ww/R6H-6A4dP1I/AAAAAAAAAF8/Evy0143a-38/s400/Day3-4.jpg" alt="" id="BLOGGER_PHOTO_ID_5161686920565964626" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36312929-8947901469639592298?l=www.evanreiser.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.evanreiser.com/feeds/8947901469639592298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36312929&amp;postID=8947901469639592298' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/8947901469639592298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/8947901469639592298'/><link rel='alternate' type='text/html' href='http://www.evanreiser.com/2008/01/building-youtube-clone-day-3.html' title='Building a YouTube Clone (Day 3)'/><author><name>Evan Reiser</name><uri>http://www.blogger.com/profile/01139605078652057619</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13845188015153247593'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_7NyTnt202Ww/R6H_Nw4dP4I/AAAAAAAAAGU/jhnq-L9jttk/s72-c/Day3-2.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36312929.post-5453951427436277601</id><published>2008-01-29T21:13:00.001-05:00</published><updated>2008-01-31T13:28:55.498-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Django'/><title type='text'>Building a YouTube Clone (Day 2)</title><content type='html'>Today i redid the site authentication to allow for OpenID, i got most of the code from a great package i found on code.google.com, i'll post the link here later.&lt;br /&gt;&lt;br /&gt;I started building out the profile models and views, but i'll have to finish this later.&lt;br /&gt;&lt;br /&gt;I've also added a forum and discussion board, pretty much boiler plate stuff here, but its the makings of a Social Network.&lt;br /&gt;&lt;br /&gt;Finally i've added in support for "&lt;a href="http://code.google.com/p/django-psn/"&gt;Portable Social Networks&lt;/a&gt;" a project by one of pownce's developers that allows users to add info + links to their profiels on other social networks, i can use this so users can show off what other networks they belong to. What's' cool is we can use the data collected here to link profiles across many different networks.  This might also be useful in the future for importing contacts from other services.&lt;br /&gt;&lt;br /&gt;More tommorow&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_7NyTnt202Ww/R6ITPg4dP6I/AAAAAAAAAGk/GWW59lX6br4/s1600-h/Day2-2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_7NyTnt202Ww/R6ITPg4dP6I/AAAAAAAAAGk/GWW59lX6br4/s400/Day2-2.jpg" alt="" id="BLOGGER_PHOTO_ID_5161709280165707682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_7NyTnt202Ww/R6IS9Q4dP5I/AAAAAAAAAGc/5pUiYt1Zrhk/s1600-h/Day-2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_7NyTnt202Ww/R6IS9Q4dP5I/AAAAAAAAAGc/5pUiYt1Zrhk/s400/Day-2.jpg" alt="" id="BLOGGER_PHOTO_ID_5161708966633095058" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36312929-5453951427436277601?l=www.evanreiser.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.evanreiser.com/feeds/5453951427436277601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36312929&amp;postID=5453951427436277601' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/5453951427436277601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/5453951427436277601'/><link rel='alternate' type='text/html' href='http://www.evanreiser.com/2008/01/building-youtube-clone-day-2.html' title='Building a YouTube Clone (Day 2)'/><author><name>Evan Reiser</name><uri>http://www.blogger.com/profile/01139605078652057619</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13845188015153247593'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_7NyTnt202Ww/R6ITPg4dP6I/AAAAAAAAAGk/GWW59lX6br4/s72-c/Day2-2.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36312929.post-1649832134376271177</id><published>2008-01-28T21:10:00.000-05:00</published><updated>2008-01-31T10:55:51.781-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Django'/><title type='text'>Building a YouTube Clone (Day 1)</title><content type='html'>I'll try to write more here later.  I started the project by creating the django project, and setting up the core authentication.  I created the base template for the site and did some basic web design with css.&lt;br /&gt;&lt;br /&gt;I set up the project in SVN.  So i should be ready to go tomorrow&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_7NyTnt202Ww/R6Hvfg4dP0I/AAAAAAAAAF0/qRuSNPSSwj8/s1600-h/webdesign1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_7NyTnt202Ww/R6Hvfg4dP0I/AAAAAAAAAF0/qRuSNPSSwj8/s400/webdesign1.jpg" alt="" id="BLOGGER_PHOTO_ID_5161669972625014594" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_7NyTnt202Ww/R6HvOw4dPzI/AAAAAAAAAFs/wSpGPe6zb4Q/s1600-h/webdesign4.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_7NyTnt202Ww/R6HvOw4dPzI/AAAAAAAAAFs/wSpGPe6zb4Q/s400/webdesign4.jpg" alt="" id="BLOGGER_PHOTO_ID_5161669684862205746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_7NyTnt202Ww/R6HvFg4dPyI/AAAAAAAAAFk/9mJFkhBEmLs/s1600-h/webdesign2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_7NyTnt202Ww/R6HvFg4dPyI/AAAAAAAAAFk/9mJFkhBEmLs/s400/webdesign2.jpg" alt="" id="BLOGGER_PHOTO_ID_5161669525948415778" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36312929-1649832134376271177?l=www.evanreiser.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.evanreiser.com/feeds/1649832134376271177/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36312929&amp;postID=1649832134376271177' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/1649832134376271177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/1649832134376271177'/><link rel='alternate' type='text/html' href='http://www.evanreiser.com/2008/01/building-youtube-clone-day-1.html' title='Building a YouTube Clone (Day 1)'/><author><name>Evan Reiser</name><uri>http://www.blogger.com/profile/01139605078652057619</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13845188015153247593'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_7NyTnt202Ww/R6Hvfg4dP0I/AAAAAAAAAF0/qRuSNPSSwj8/s72-c/webdesign1.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36312929.post-5527052488375082584</id><published>2008-01-28T17:52:00.000-05:00</published><updated>2008-01-28T18:01:12.176-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='twistage'/><category scheme='http://www.blogger.com/atom/ns#' term='Django'/><title type='text'>Building a YouTube clone</title><content type='html'>Over the next few weeks I'm going to be creating a youtube clone (if you're an investor read: online video community), as part of a new venture I'm working on.  Using &lt;a href="http://twistage.com/"&gt;Twistage &lt;/a&gt;for video delivery, I'm going to try to build a video community site by myself in record time.&lt;br /&gt;&lt;br /&gt;I'm planning on using django + python to build the site and i'll track my progress here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36312929-5527052488375082584?l=www.evanreiser.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.evanreiser.com/feeds/5527052488375082584/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36312929&amp;postID=5527052488375082584' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/5527052488375082584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/5527052488375082584'/><link rel='alternate' type='text/html' href='http://www.evanreiser.com/2008/01/building-youtube-clone.html' title='Building a YouTube clone'/><author><name>Evan Reiser</name><uri>http://www.blogger.com/profile/01139605078652057619</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13845188015153247593'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36312929.post-8367506181482250575</id><published>2008-01-16T12:59:00.000-05:00</published><updated>2008-01-16T13:13:20.716-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='citybombing'/><category scheme='http://www.blogger.com/atom/ns#' term='Django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='social networks'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Maps'/><title type='text'>CityBombing.com launches</title><content type='html'>As some of my friends know, I've spent the last 5 weeks building a photo hosting and community site for graffiti artists.  The original idea came from my brother who wanted a mash-up to show graffiti pictures on google maps.  I started working on the site in December to learn django (a python web framework).&lt;br /&gt;&lt;br /&gt;Thanks to the awesome language and framework, and I was able to build a full fledged social networking site from scratch in less than 2 months.  I'll be spending the next week or two adding internationalization support, and re-deploying the application with new graphics as some other photo sharing/tracking community sites.&lt;br /&gt;&lt;br /&gt;Special thanks to the django, python, mootools, google maps API, nesh's thumbnail module, as well as my girlfriend and my little brother for their advice, help and support.  Also thanks to &lt;a href="http://mcfunley.com/cs/blogs/dan/default.aspx"&gt;Dan &lt;/a&gt;+ &lt;a href="http://breasy.com/blog/"&gt;Udi &lt;/a&gt;for my pesky django + python questions.&lt;br /&gt;&lt;br /&gt;Check it out here: &lt;a href="http://www.citybombing.com"&gt;www.citybombing.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36312929-8367506181482250575?l=www.evanreiser.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.evanreiser.com/feeds/8367506181482250575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36312929&amp;postID=8367506181482250575' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/8367506181482250575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/8367506181482250575'/><link rel='alternate' type='text/html' href='http://www.evanreiser.com/2008/01/citybombingcom-launches.html' title='CityBombing.com launches'/><author><name>Evan Reiser</name><uri>http://www.blogger.com/profile/01139605078652057619</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13845188015153247593'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36312929.post-423898571718754847</id><published>2008-01-08T11:04:00.000-05:00</published><updated>2008-01-08T11:15:34.257-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PIL'/><category scheme='http://www.blogger.com/atom/ns#' term='geotagging'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Python + PIL: Make Geotagged photos from EXIF Headers</title><content type='html'>For my django app, i wanted to take geotagged images and display them on google maps.  Geotagged images store GPS data in the EXIF headers of the image, so we'll want to grab this data and extract the lattitude and longitude so we can display where the image was taken in our mapping software.&lt;br /&gt;&lt;br /&gt;Using the PIL library we can grab the GPS data out of the image and format it in a way to easily display on a google map. PIL really does all the work for us, all we have to do is convert the Lat/Lng from DDD&lt;b&gt;&lt;span style="font-size:130%;"&gt;°&lt;/span&gt;&lt;/b&gt;, MM&lt;b&gt;&lt;span style="font-size:130%;"&gt;'&lt;/span&gt;&lt;/b&gt;, SS.S&lt;b&gt;&lt;span style="font-size:130%;"&gt;"&lt;/span&gt;&lt;/b&gt; format stored in image to DD.DDDDD&lt;b&gt;&lt;span style="font-size:130%;"&gt;°&lt;/span&gt;&lt;/b&gt; format that google uses&lt;br /&gt;&lt;br /&gt;Hidden in the Exif data we see this:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;34853: {0: (2, 0, 0, 0), 1: 'N', 2: ((40, 1), (37, 1), (279, 10)), 3: 'W', 4: ((74, 1), (8, 1), (373, 10)), 5: 0, 6: (0, 1), 7: ((18, 1), (58, 1), (19, 1)), 9: 'A', 18: 'WGS-84'}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;We can then use the following python to extract the data, convert and save it to our photo object&lt;br /&gt;&lt;blockquote&gt;from PIL import Image&lt;br /&gt;from PIL.ExifTags import TAGS&lt;br /&gt;&lt;br /&gt;i = Image.open('/pics/DSC07018.JPG')&lt;br /&gt;info = i._getexif()&lt;br /&gt;&lt;br /&gt;ret = {}&lt;br /&gt;for tag,value in info.items():                                           &lt;br /&gt;    decoded = TAGS.get(tag, tag)&lt;br /&gt;    ret[decoded] = value&lt;br /&gt;&lt;br /&gt;Nsec = ret['GPSInfo'][2][2][0] / float(ret['GPSInfo'][2][2][1])&lt;br /&gt;Nmin = ret['GPSInfo'][2][1][0]  / float(ret['GPSInfo'][2][1][1])&lt;br /&gt;Ndeg = ret['GPSInfo'][2][0][0]  / float(ret['GPSInfo'][2][0][1])&lt;br /&gt;Wsec = ret['GPSInfo'][4][2][0]  / float(ret['GPSInfo'][4][2][1])&lt;br /&gt;Wmin = ret['GPSInfo'][4][1][0]  / float(ret['GPSInfo'][4][1][1])&lt;br /&gt;Wdeg = ret['GPSInfo'][4][0][0]  / float(ret['GPSInfo'][4][0][1])&lt;br /&gt;&lt;br /&gt;if ret['GPSInfo'][1] == 'N':&lt;br /&gt;    Nmult = 1&lt;br /&gt;else:&lt;br /&gt;    Nmult = -1&lt;br /&gt;&lt;br /&gt;if ret['GPSInfo'][1] == 'E':&lt;br /&gt;    Wmult = 1&lt;br /&gt;else:&lt;br /&gt;    Wmult = -1&lt;br /&gt;&lt;br /&gt;Lat = Nmult * (Ndeg + (Nmin + Nsec/60.0)/60.0)&lt;br /&gt;Lng = Wmult * (Wdeg + (Wmin + Wsec/60.0)/60.0)&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Now that you have the Lat and Lng you can save to your model or class to easily display in your web app.&lt;br /&gt;&lt;br /&gt;photo= GMapPhoto()&lt;br /&gt;photo.image = i&lt;br /&gt;photo.lattitude = Lat&lt;br /&gt;photo.longitude = Lng&lt;br /&gt;photo.save()&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36312929-423898571718754847?l=www.evanreiser.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.evanreiser.com/feeds/423898571718754847/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36312929&amp;postID=423898571718754847' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/423898571718754847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/423898571718754847'/><link rel='alternate' type='text/html' href='http://www.evanreiser.com/2008/01/python-pil-make-geotagged-photos-from.html' title='Python + PIL: Make Geotagged photos from EXIF Headers'/><author><name>Evan Reiser</name><uri>http://www.blogger.com/profile/01139605078652057619</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13845188015153247593'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36312929.post-3811388156578986365</id><published>2007-12-18T11:20:00.000-05:00</published><updated>2007-12-18T11:27:51.586-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='caching'/><category scheme='http://www.blogger.com/atom/ns#' term='Django'/><title type='text'>Django Caching</title><content type='html'>I was trying to learn more about caching in django, so i had my site output a list of all sql queries that were run at the bottom of the page. &lt;br /&gt;&lt;br /&gt;I set the cache time for a certain page to be 5 minutes.  However, for some reason, MOST of the time I viewed a page without POSTing back, there were a ton of SQL queries appearing, it seemed like my cache wasn't working at all.&lt;br /&gt;&lt;br /&gt;Little did i realize that i had installed django.middleware.cache.CacheMiddleware, which was causing all pages without GET or POST variables to be cached automatically.  However, (I think) the cache saves the output of a rendered page, which included the HTML of all the SQL queries being run for the page request. This led me to think all the SQL was actually running until i checked the database.&lt;br /&gt;&lt;br /&gt;I guess power is useless unless you know how to use it correctly&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36312929-3811388156578986365?l=www.evanreiser.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.evanreiser.com/feeds/3811388156578986365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36312929&amp;postID=3811388156578986365' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/3811388156578986365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/3811388156578986365'/><link rel='alternate' type='text/html' href='http://www.evanreiser.com/2007/12/django-caching.html' title='Django Caching'/><author><name>Evan Reiser</name><uri>http://www.blogger.com/profile/01139605078652057619</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13845188015153247593'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36312929.post-3705153324867151313</id><published>2007-12-17T15:00:00.000-05:00</published><updated>2007-12-17T15:35:26.434-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='front end performance'/><category scheme='http://www.blogger.com/atom/ns#' term='mod_deflate'/><category scheme='http://www.blogger.com/atom/ns#' term='mod_expires'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><title type='text'>Make your website faster in 5 minutes</title><content type='html'>The "speed" or "performance" of your website is only based on one thing: how long it takes from when your user clicks until the data gets from your servers to the eyeballs of your user.  Some companies can spend hundreds of hours and millions of dollars tuning queries, to shave off 20% of a 5ms query, but at the end of the day all that matters is your application's response time as perceived by the end user.&lt;br /&gt;&lt;br /&gt;For most websites I'd say 2% of the time is spent in the database, 20% in the app code, 10-20% in transfer or latency, while the rest is spent or wasted on the front end.  If i was going to spend the least amount of time/money to increase the most performance, I would focus on the front end of the application. Specifically, on how the browser requests, caches and renders data.&lt;br /&gt;&lt;br /&gt;You're end user shouldn't have to wait around for stuff he doesn't need.  Theres no point in hitting the webserver again and again requesting the same exact media files (css/javascript/images).  These dont change so its a waste of processing power and bandwidth to server them.  In order to prevent the user's browser you have to explain that their local cache shouldn't expire instantly.  Set far future expires headers on your static content and you wont have to server it again and again.  Doing this is trivial in either Apache of IIS&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;ExpiresActive On&lt;br /&gt;ExpiresDefault "access plus 1 month"&lt;br /&gt;&lt;/blockquote&gt;This is what i have set on my static content server, if you're using the same webserver to serve up dynamic content, you probably want to specify expires header by type instead&lt;br /&gt;&lt;blockquote&gt;ExpiresByType image/gif A2592000&lt;br /&gt;ExpiresByType image/png A2592000&lt;br /&gt;ExpiresByType image/jpg A2592000&lt;br /&gt;ExpiresByType image/jpeg A2592000&lt;br /&gt;ExpiresByType application/x-javascript A2592000&lt;br /&gt;ExpiresByType text/css A2592000&lt;br /&gt;&lt;/blockquote&gt;You might have just reduced your bandwidth and response time by 20%. Additionally, read up on ETags and why they should be configured correctly. Probably just do this&lt;br /&gt;&lt;blockquote&gt;FileETag none&lt;/blockquote&gt;Obviously, you want to send as little data as possible out of your webserver.  Reducing file sizes and using common css/js files are pretty obvious performance techniques.  What you might also want to do is compress text files as they are sent form your webserver; modern browsers can decode GZip'ed data at the small expense of processing power.  To enable apache webserver to send gzip content use mod_deflate&lt;br /&gt;&lt;blockquote&gt;AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/x-javascript&lt;/blockquote&gt;In my experience this seems to reduce the size of html/js/css files by 60% or more.  Obviously this will reduce the transfer time of your content.&lt;br /&gt;&lt;br /&gt;Finally, understand how browsers render web pages. Any time JavaScript is run, the browser will block page rendering.  This is because JavaScript is able to write out data to the page.  If you load all your JavaScript in the , your page won't start rendering on the client until it has all been transfered and loaded on the browser.  Additionally you probably want to load all of your CSS as soon as possible; that way you can get required images as soon as possible if needed.  A good rule of thumb:&lt;br /&gt;&lt;br /&gt;Put your CSS at the top of the page&lt;br /&gt;Put your JavaScript at the bottom of the page&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_7NyTnt202Ww/R2bcChaejaI/AAAAAAAAAE0/5u3ntEpeDoQ/s1600-h/Untitled.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_7NyTnt202Ww/R2bcChaejaI/AAAAAAAAAE0/5u3ntEpeDoQ/s400/Untitled.jpg" alt="" id="BLOGGER_PHOTO_ID_5145041560204643746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;On a side note, Django rocks and mootools rocks&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36312929-3705153324867151313?l=www.evanreiser.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.evanreiser.com/feeds/3705153324867151313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36312929&amp;postID=3705153324867151313' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/3705153324867151313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/3705153324867151313'/><link rel='alternate' type='text/html' href='http://www.evanreiser.com/2007/12/make-your-website-faster-in-5-minutes.html' title='Make your website faster in 5 minutes'/><author><name>Evan Reiser</name><uri>http://www.blogger.com/profile/01139605078652057619</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13845188015153247593'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_7NyTnt202Ww/R2bcChaejaI/AAAAAAAAAE0/5u3ntEpeDoQ/s72-c/Untitled.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36312929.post-3000279004834488767</id><published>2007-11-27T03:25:00.000-05:00</published><updated>2007-11-27T13:34:48.200-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Social Suggester'/><category scheme='http://www.blogger.com/atom/ns#' term='Photoshop'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Design'/><category scheme='http://www.blogger.com/atom/ns#' term='Social Sample'/><title type='text'>New Site Designs</title><content type='html'>Many of my friends seem to think that &lt;a href="http://www.socialsuggester.com/"&gt;Social Suggester&lt;/a&gt; is my start-up project. Actually its just a demonstration of some of the technology developed by my company &lt;a href="http://www.socialsample.com/"&gt;Social Sample.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nonetheless,  I've been wanted to re-design the website; despite its deceivingly decent looks, it was really thrown together haphazardly in a weekend with my friend.  I've received a wide range of advice about how to improve the site from a wide range of sources including friends, investors and complete strangers.&lt;br /&gt;&lt;br /&gt;One common criticism is that the site lacks no personality, and that its hard for users to understand exactly who the target audience is.  I'm not exactly sure who the site should be targeted at, but i thought it would be fun to create a much more "gritty", "dirty", "urban" feel for the site, that might scare away adults but might at least add some personality of flavor.&lt;br /&gt;&lt;br /&gt;I'm really only an amateur graphic artist, but I do love playing in photoshop.  Below are some samples with what i ended up with at the end of tonight. I think it would be pretty cool to post a sideshow from beginning to end of development, since theres been a lot of cool designs that ended up in the trash.&lt;br /&gt;&lt;br /&gt;Click for the full screenshot, graffiti courtesy of my little brother&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.socialsample.com/images/ss2.jpg"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_7NyTnt202Ww/R0vW7HJYHSI/AAAAAAAAAEI/fQU48jkcXXM/s320/ss2+copy2mini.jpg" alt="" id="BLOGGER_PHOTO_ID_5137436110965185826" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.socialsample.com/images/ss2.jpg"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_7NyTnt202Ww/R0vXuXJYHTI/AAAAAAAAAEQ/_UaLcfaw1kw/s320/ss2+copy2mini2.jpg" alt="" id="BLOGGER_PHOTO_ID_5137436991433481522" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36312929-3000279004834488767?l=www.evanreiser.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.evanreiser.com/feeds/3000279004834488767/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36312929&amp;postID=3000279004834488767' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/3000279004834488767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/3000279004834488767'/><link rel='alternate' type='text/html' href='http://www.evanreiser.com/2007/11/new-site-designs.html' title='New Site Designs'/><author><name>Evan Reiser</name><uri>http://www.blogger.com/profile/01139605078652057619</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13845188015153247593'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_7NyTnt202Ww/R0vW7HJYHSI/AAAAAAAAAEI/fQU48jkcXXM/s72-c/ss2+copy2mini.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36312929.post-2955238074877193972</id><published>2007-11-14T16:54:00.000-05:00</published><updated>2007-11-14T16:58:59.191-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Django'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>PHP feels like ASP</title><content type='html'>My next project I'd like to use a real web application framework so I don't find end up with more of this crap:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_7NyTnt202Ww/RztvGF6mCaI/AAAAAAAAAEA/K9va2AROQPo/s1600-h/Untitled.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://4.bp.blogspot.com/_7NyTnt202Ww/RztvGF6mCaI/AAAAAAAAAEA/K9va2AROQPo/s400/Untitled.png" alt="" id="BLOGGER_PHOTO_ID_5132818350776650146" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Although ASP.NET arguable uses the MVC pattern, my eyes are on Django (if people would stop telling me to use rails)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36312929-2955238074877193972?l=www.evanreiser.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.evanreiser.com/feeds/2955238074877193972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36312929&amp;postID=2955238074877193972' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/2955238074877193972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/2955238074877193972'/><link rel='alternate' type='text/html' href='http://www.evanreiser.com/2007/11/php-feels-like-asp.html' title='PHP feels like ASP'/><author><name>Evan Reiser</name><uri>http://www.blogger.com/profile/01139605078652057619</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13845188015153247593'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_7NyTnt202Ww/RztvGF6mCaI/AAAAAAAAAEA/K9va2AROQPo/s72-c/Untitled.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36312929.post-5743310287075140270</id><published>2007-11-09T19:49:00.000-05:00</published><updated>2007-11-12T12:47:42.792-05:00</updated><title type='text'>Facts about Newark Airport</title><content type='html'>Airport security does not believe me that ice cream is in fact a solid   and therefore does not fall under TSA liquid rules.&lt;p&gt;Airport security does believe that my vitamin water does not qualify   as a travel size container.&lt;/p&gt;&lt;p&gt;They don't notice if you don't take your shoes off.&lt;/p&gt;The stewardess noticed my iphone was still turned on after her warning, i tried to explain to her that i couldn't turn off my phone.  She said that if i was unable to turn off the phone that i should remove the battery.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36312929-5743310287075140270?l=www.evanreiser.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.evanreiser.com/feeds/5743310287075140270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36312929&amp;postID=5743310287075140270' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/5743310287075140270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/5743310287075140270'/><link rel='alternate' type='text/html' href='http://www.evanreiser.com/2007/11/facts-about-newark-airport.html' title='Facts about Newark Airport'/><author><name>Evan Reiser</name><uri>http://www.blogger.com/profile/01139605078652057619</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13845188015153247593'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36312929.post-2680882857385220752</id><published>2007-11-06T13:13:00.000-05:00</published><updated>2007-11-06T14:06:21.505-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><title type='text'>The Fine Art of Software Estimation</title><content type='html'>Overheard at Social Sample:&lt;br /&gt;&lt;blockquote&gt;"by the way 25-30 hours really means 60 hours"&lt;br /&gt;&lt;br /&gt;"I'm just taking all estimates and doubling them now...even if people have already doubled them, i'm doing it again; blanket policy"&lt;br /&gt;&lt;/blockquote&gt;Maybe we need some &lt;a href="http://joelonsoftware.com/items/2007/10/26.html"&gt;Evidence Based Estimation&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36312929-2680882857385220752?l=www.evanreiser.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.evanreiser.com/feeds/2680882857385220752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36312929&amp;postID=2680882857385220752' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/2680882857385220752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/2680882857385220752'/><link rel='alternate' type='text/html' href='http://www.evanreiser.com/2007/11/fine-art-of-software-estimation.html' title='The Fine Art of Software Estimation'/><author><name>Evan Reiser</name><uri>http://www.blogger.com/profile/01139605078652057619</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13845188015153247593'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36312929.post-8851512708669302115</id><published>2007-11-02T14:59:00.000-04:00</published><updated>2007-11-04T11:36:54.153-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Social Suggester'/><category scheme='http://www.blogger.com/atom/ns#' term='data mining'/><category scheme='http://www.blogger.com/atom/ns#' term='Social Sample'/><title type='text'>Metallica Fans Don't Support Hilary Clinton</title><content type='html'>What happens when you take a giant database full of social data and do some light data-mining and statistics: lots of random facts! (arguable worthless or priceless depending on what you use them for).&lt;br /&gt;&lt;br /&gt;I am spending my Friday at Social Sample analyzing social data from supporters of 2008 presidential candidates; data found on online social networks.  After coming up with some basic demographics, I searched the user base for music interests with high correlations to the normal population.  A similar algorithm to what powers &lt;a href="http://www.socialsuggester.com/"&gt;Social Suggester.&lt;/a&gt; I found that the artists / bands with the highest correlation to Hillary Clinton supporters were:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;"MADONNA"&lt;br /&gt;"TORI AMOS"&lt;br /&gt;"FIONA APPLE"&lt;br /&gt;"BJORK"&lt;br /&gt;"PRINCE"&lt;br /&gt;"DEPECHE MODE"&lt;br /&gt;"GWEN STEFANI"&lt;br /&gt;"PORTISHEAD"&lt;br /&gt;"THE SMITHS"&lt;br /&gt;"ELTON JOHN"&lt;br /&gt;"NO DOUBT"&lt;br /&gt;"KELLY CLARKSON"&lt;br /&gt;"MILES DAVIS"&lt;br /&gt;"THE CURE"&lt;br /&gt;"JUSTIN TIMBERLAKE"&lt;/blockquote&gt;Hmm Interesting.  Now what happens if you change the Social Suggester ranking algorithm to find the bands/artists with the lowest correlation between these two data sets?&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;"ATREYU"&lt;br /&gt;"THE USED"&lt;br /&gt;"MUDVAYNE"&lt;br /&gt;"SLIPKNOT"&lt;br /&gt;"TAKING BACK SUNDAY"&lt;br /&gt;"BREAKING BENJAMIN"&lt;br /&gt;"YELLOWCARD"&lt;br /&gt;"DISTURBED"&lt;br /&gt;"HINDER"&lt;br /&gt;"BLINK 182"&lt;br /&gt;"PANTERA"&lt;br /&gt;"50 CENT"&lt;br /&gt;"STAIND"&lt;br /&gt;"METALLICA"&lt;br /&gt;"SYSTEM OF A DOWN"&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Also Interesting.  These correlations weren't extremely high, but Hillary Clinton supporters that use online social networks were 4x less likely to be a fan of 50 Cent, and 5x less likely to be a fan of Breaking Benjamin.  I'm not going to make any assumptions about what kind of people support Hillary Clinton, all we can say is that there a high correlation between the types of people who enjoy the first set of artists/bands, and a low correlation between the second.  If anyone reads this please feel free to share any insight; please let me know if there are any other subcultures you'd like to see info on.  I'll leave with some random data about Hillary Clinton supporters, (these are not facts [read: please dont sue me], just the data that our engine spat out based on analysis of the target group). Enjoy.&lt;br /&gt;&lt;br /&gt;Interesting differences (all compared to the normal population, sample size =10.5 Million, all statistically significant)&lt;br /&gt;&lt;br /&gt;Supporters were &lt;span style="font-weight: bold;"&gt;no &lt;/span&gt;more likely to be Female&lt;br /&gt;Supporters were &lt;span style="font-weight: bold;"&gt;10.9x&lt;/span&gt; more likely to be gay&lt;br /&gt;Supporters were 1.25x more likely to be married&lt;br /&gt;Supporters were 1.25x more likely to be a parent&lt;br /&gt;Supporters were 1.50x more likely to be in grad school&lt;br /&gt;&lt;br /&gt;Supporters were 2.01x more likely to be Agnostic&lt;br /&gt;Supporters were 1.9x more likely to be Jewish&lt;br /&gt;Supporters were 2.50x less likely to be Muslim&lt;br /&gt;Supporters were 1.12x less likely to be Catholic&lt;br /&gt;&lt;br /&gt;The same proportion of supporters Smoke cigarettes, but they are 1.1x less likely to drink alcohol&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Find other high correlations at &lt;a href="http://www.socialsuggester.com/"&gt;Social Suggester&lt;/a&gt;, or contact me for something specific. evan &lt;span style="color: rgb(102, 0, 0);"&gt;at&lt;/span&gt; socialsample . com&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36312929-8851512708669302115?l=www.evanreiser.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.evanreiser.com/feeds/8851512708669302115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36312929&amp;postID=8851512708669302115' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/8851512708669302115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/8851512708669302115'/><link rel='alternate' type='text/html' href='http://www.evanreiser.com/2007/11/analyzing-social-data.html' title='Metallica Fans Don&apos;t Support Hilary Clinton'/><author><name>Evan Reiser</name><uri>http://www.blogger.com/profile/01139605078652057619</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13845188015153247593'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36312929.post-5822844802899102657</id><published>2007-10-18T16:27:00.001-04:00</published><updated>2007-10-18T16:54:03.197-04:00</updated><title type='text'>Ikea</title><content type='html'>Ikea and I have a much different idea about what a &lt;a href="http://www.ikea.com/us/en/catalog/categories/rooms/workspace/10710/"&gt;computer workstation&lt;/a&gt; is:&lt;br /&gt;&lt;br /&gt;IKEA:&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.ikea.com/PIAimages/16265_PE100578_S3.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 260px; height: 260px;" src="http://www.ikea.com/PIAimages/16265_PE100578_S3.JPG" alt="" border="0" /&gt;&lt;/a&gt;Evan:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.digitaltigers.com/images/zv-arena-ultrahd_600x403.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://www.digitaltigers.com/images/zv-arena-ultrahd_600x403.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;img src="file:///C:/Users/ereiser/AppData/Local/Temp/moz-screenshot-3.jpg" alt="" /&gt;&lt;img src="file:///C:/Users/ereiser/AppData/Local/Temp/moz-screenshot-4.jpg" alt="" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36312929-5822844802899102657?l=www.evanreiser.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.evanreiser.com/feeds/5822844802899102657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36312929&amp;postID=5822844802899102657' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/5822844802899102657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/5822844802899102657'/><link rel='alternate' type='text/html' href='http://www.evanreiser.com/2007/10/ikea.html' title='Ikea'/><author><name>Evan Reiser</name><uri>http://www.blogger.com/profile/01139605078652057619</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13845188015153247593'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36312929.post-1824140365697949478</id><published>2007-10-05T07:01:00.000-04:00</published><updated>2007-10-05T12:05:09.464-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>Drag &amp; Drop in JS</title><content type='html'>I realize every new JavaScript toolkit does now but i thought this was pretty cool.  Works for FF and IE7.  I like being able to assign delegates to onDragOver + onDragOut&lt;br /&gt;&lt;br /&gt;&lt;blockquote  style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;&lt;p&gt;&amp;lt;script language=&amp;quot;JavaScript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;!-- window.onload = &lt;br /&gt;function() { var list = document.getElementById(&amp;quot;phonetic&amp;quot;); &lt;br /&gt;DragDrop.makeListContainer( list ); list.onDragOver = function() { this.style[&amp;quot;background&amp;quot;] &lt;br /&gt;= &amp;quot;#EEF&amp;quot;; }; list.onDragOut = function() {this.style[&amp;quot;background&amp;quot;] = &amp;quot;none&amp;quot;; }; &lt;br /&gt;list = document.getElementById(&amp;quot;numeric&amp;quot;); DragDrop.makeListContainer( list ); &lt;br /&gt;list.onDragOver = function() { this.style[&amp;quot;border&amp;quot;] = &amp;quot;1px dashed #AAA&amp;quot;; }; &lt;br /&gt;list.onDragOut = function() {this.style[&amp;quot;border&amp;quot;] = &amp;quot;1px solid white&amp;quot;; }; }; &lt;br /&gt;//--&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;/script&amp;gt;&lt;/p&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://neb.net/playground/dragdrop/"&gt;http://neb.net/playground/dragdrop/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36312929-1824140365697949478?l=www.evanreiser.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.evanreiser.com/feeds/1824140365697949478/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36312929&amp;postID=1824140365697949478' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/1824140365697949478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36312929/posts/default/1824140365697949478'/><link rel='alternate' type='text/html' href='http://www.evanreiser.com/2007/10/drag-drop-in-js.html' title='Drag &amp; Drop in JS'/><author><name>Evan Reiser</name><uri>http://www.blogger.com/profile/01139605078652057619</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13845188015153247593'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry></feed>