# HG changeset patch # User Steve Losh # Date 1291162002 18000 # Node ID 7d7b1c625d524f5b7083fa0125c1d2546cecfef5 # Parent a54e97c153ae172cde97b928c3acfb7bc1a81f30 Moar. diff -r a54e97c153ae -r 7d7b1c625d52 DESIGN.markdown --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DESIGN.markdown Tue Nov 30 19:06:42 2010 -0500 @@ -0,0 +1,13 @@ +Some notes on the design, mostly for myself. + +Images +====== + +Full images for posts should be 580 pixels wide (or less) and a multiple of 25 +pixels tall. + +Headers +======= + +Blog and project content block should use h2 and lower. h1 elements are +reserved for the layout. diff -r a54e97c153ae -r 7d7b1c625d52 DESIGN.mdown --- a/DESIGN.mdown Tue Nov 30 18:17:40 2010 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -Some notes on the design, mostly for myself. - -Images -====== - -Full images for posts should be 580 pixels wide (or less) and a multiple of 25 -pixels tall. - -Headers -======= - -Blog and project content block should use h2 and lower. h1 elements are -reserved for the layout. diff -r a54e97c153ae -r 7d7b1c625d52 content/404.html --- a/content/404.html Tue Nov 30 18:17:40 2010 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -{% extends "_flatpage.html" %} - -{% hyde - title: "Not Found" - exclude: True -%} - - -{% block article %} - -OH GOD HOW DID THIS GET HERE SOMEONE IS NOT GOOD WITH LINK -========================================================== - -{% endblock %} diff -r a54e97c153ae -r 7d7b1c625d52 content/404.markdown --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/content/404.markdown Tue Nov 30 19:06:42 2010 -0500 @@ -0,0 +1,4 @@ +title: "Not Found" + +OH GOD HOW DID THIS GET HERE SOMEONE IS NOT GOOD WITH LINK +========================================================== diff -r a54e97c153ae -r 7d7b1c625d52 content/about.html --- a/content/about.html Tue Nov 30 18:17:40 2010 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,100 +0,0 @@ -{% extends "skeleton/_base.html" %} -{% hyde - title: "About" -%} - -{% block content %} - - -

{{ page.title|safe|typogrify }}

- -
- {% filter typogrify %} - {% markdown %} -I'm **Steve**. I'm from **[Rochester, NY][rochester]**. -I do a lot of different things. - -If you want to get in touch with me you can [email -me](mailto:steve@stevelosh.com) or find me on [BitBucket][], [GitHub][], -[Twitter][], [Forrst][], or [Flickr][]. - -[rochester]: http://rocwiki.org/ -[Twitter]: http://twitter.com/stevelosh/ -[Flickr]: http://www.flickr.com/photos/sjl7678/ -[BitBucket]: http://bitbucket.org/sjl/ -[GitHub]: http://github.com/sjl/ -[Forrst]: http://forrst.com/people/stevelosh/ - - -Programming ------------ - -I went to [Rochester Institute of Technology](http://rit.edu/) for a degree in -Computer Science. - -I've done a lot of different things in the field so far. Right now the things -that are captivating me are artificial intelligence and clean, simple, -*useful* web applications. - -I find programming beautiful. That might sound strange, but there are aspects -of programming and math that I can't describe any other way. - -You can take a look at my [projects][] to see some of the major stuff I've -worked on, or cut to the chase and look at [my BitBucket account][BitBucket]. - -[projects]: /projects/ - -Photography ----------- - -I like photographing people. Other things as well, but especially people. -I tend to gravitate toward the "art" aspects of photography more than the -"journalism" aspects, but I can appreciate both. - -I shoot digital and film (35mm and medium format) depending on my time limits -and mood. I develop film in my bathroom and print it in a rented darkroom. -When I print digital I use a lab nearby; I don't have the money for a -professional printer just yet. - -I post most of what I take on [my Flickr account][Flickr]. - -Dancing -------- - -I teach blues dancing here in Rochester as part of [Lady Luck Blues][]. -I starting blues dancing a few years ago and haven't stopped since. My favorite -aspect of dancing is connection and blues seems to bring that out more than any -other dance. - -I've also been swing dancing for about seven years. My first love is Lindy Hop; I -go to classes, workshops and exchanges as often as my schedule and budget will -allow. - -Lately I've begun getting my feet wet in tango. Whether it'll ever become as -important to me as blues or Lindy remains to be seen. - -[Lady Luck Blues]: http://ladyluckblues.com/ - -Music ------ - -I play electric and upright bass. I've played in a metal band in the past, but -right now my focus is on jazz and blues. - -I DJ at swing and blues dances fairly often. My taste is pretty broad, and -I'll cater to whatever the floor wants, but I tend to personally enjoy -slightly down-tempo, small-group music. Let me know if you need a DJ for a -dance. - -About the Site ------------ - -If you want to know more about my site you should check out the [project -page](/projects/stevelosh-com/) about the original version and my [blog -post][hyderewrite] about how I rewrote it. - -[hyderewrite]: /blog/2010/01/moving-from-django-to-hyde/ - {% endmarkdown %} - {% endfilter %} -
-{% endblock %} diff -r a54e97c153ae -r 7d7b1c625d52 content/about.markdown --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/content/about.markdown Tue Nov 30 19:06:42 2010 -0500 @@ -0,0 +1,86 @@ +title: About +template: about + +I'm **Steve**. I'm from **[Rochester, NY][rochester]**. +I do a lot of different things. + +If you want to get in touch with me you can [email +me](mailto:steve@stevelosh.com) or find me on [BitBucket][], [GitHub][], +[Twitter][], [Forrst][], or [Flickr][]. + +[rochester]: http://rocwiki.org/ +[Twitter]: http://twitter.com/stevelosh/ +[Flickr]: http://www.flickr.com/photos/sjl7678/ +[BitBucket]: http://bitbucket.org/sjl/ +[GitHub]: http://github.com/sjl/ +[Forrst]: http://forrst.com/people/stevelosh/ + + +Programming +----------- + +I went to [Rochester Institute of Technology](http://rit.edu/) for a degree in +Computer Science. + +I've done a lot of different things in the field so far. Right now the things +that are captivating me are artificial intelligence and clean, simple, +*useful* web applications. + +I find programming beautiful. That might sound strange, but there are aspects +of programming and math that I can't describe any other way. + +You can take a look at my [projects][] to see some of the major stuff I've +worked on, or cut to the chase and look at [my BitBucket account][BitBucket]. + +[projects]: /projects/ + +Photography +---------- + +I like photographing people. Other things as well, but especially people. +I tend to gravitate toward the "art" aspects of photography more than the +"journalism" aspects, but I can appreciate both. + +I shoot digital and film (35mm and medium format) depending on my time limits +and mood. I develop film in my bathroom and print it in a rented darkroom. +When I print digital I use a lab nearby; I don't have the money for a +professional printer just yet. + +I post most of what I take on [my Flickr account][Flickr]. + +Dancing +------- + +I teach blues dancing here in Rochester as part of [Lady Luck Blues][]. +I starting blues dancing a few years ago and haven't stopped since. My favorite +aspect of dancing is connection and blues seems to bring that out more than any +other dance. + +I've also been swing dancing for about seven years. My first love is Lindy Hop; I +go to classes, workshops and exchanges as often as my schedule and budget will +allow. + +Lately I've begun getting my feet wet in tango. Whether it'll ever become as +important to me as blues or Lindy remains to be seen. + +[Lady Luck Blues]: http://ladyluckblues.com/ + +Music +----- + +I play electric and upright bass. I've played in a metal band in the past, but +right now my focus is on jazz and blues. + +I DJ at swing and blues dances fairly often. My taste is pretty broad, and +I'll cater to whatever the floor wants, but I tend to personally enjoy +slightly down-tempo, small-group music. Let me know if you need a DJ for a +dance. + +About the Site +----------- + +If you want to know more about my site you should check out the [project +page](/projects/stevelosh-com/) about the original version and my [blog +post][hyderewrite] about how I rewrote it. + +[hyderewrite]: /blog/2010/01/moving-from-django-to-hyde/ diff -r a54e97c153ae -r 7d7b1c625d52 content/blog/index.markdown --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/content/blog/index.markdown Tue Nov 30 19:06:42 2010 -0500 @@ -0,0 +1,3 @@ +title: Blog +template: entry-list + diff -r a54e97c153ae -r 7d7b1c625d52 content/blog/moving-from-django-to-hyde.markdown --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/content/blog/moving-from-django-to-hyde.markdown Tue Nov 30 19:06:42 2010 -0500 @@ -0,0 +1,454 @@ +title: "Moving from Django to Hyde" +snip: "Another year, another rewrite." +date: 2010-01-15 20:14:00 +flattr: true + +Almost exactly one year ago I posted a blog entry about how I [rewrote this +site][rewrite] using [Django][]. It's a new year, and once again I've +rewritten the site. + +If you've visited my site before you may have noticed some small style tweaks. +I've cleaned up a few things and I think the site looks better overall. The +biggest change, however, is that I completely rewrote the core -- this time +with [Hyde][]. + +Hyde is a "static site generator" written in [Python][], similar to +[Jekyll][], [Blatter][] and [Pilcrow][]. I chose it over the others because +it's written in Python (unlike Jekyll), more flexible than Blatter and more +mature than Pilcrow. + +Rewriting an existing site that gets a decent amount of visitors is different +than creating a new site from scratch, so I decided to write this entry to +describe some of the issues I ran into and how I tackled them. + +[Django]: {{links.django}} +[rewrite]: /blog/2009/01/site-redesign/ +[Hyde]: {{links.hyde}} +[Python]: {{links.python}} +[Jekyll]: http://jekyllrb.com/ +[Blatter]: {{links.blatter}} +[Pilcrow]: http://inky.github.com/pilcrow/ + +[TOC] + +Why Static? +----------- + +There are a couple of reasons I decided to switch to a static site. + +### Less Memory Needed + +I use [WebFaction][] for my web hosting, and with my current plan I have a +limit on how much memory I can use at any given time. Each Django site takes +up around 20mb of memory on the server. + +By switching to a static set of HTML pages for my site I save those 20mb so I +can use them for something else (like a staging site for another project). My +site doesn't particularly *need* all of the functionality Django can provide, +so I figured I'd switch to a static site and save the memory. + +[WebFaction]: {{links.webfaction}} + +### Static Pages are Faster + +My site doesn't get an enormous amount of traffic, so the Django instances +weren't really working very hard. Still, serving a static page through Apache +or nginx is always going to be faster than running it through Django. +Faster-loading pages is always a good thing, even if the speed increase isn't +very large. + +### Easier to Maintain + +This is the main reason I switched. Previously, to edit a blog entry I would +log in through Django's admin interface and edit the entry. With Hyde, I +simply edit a file (or create a new one) on my machine and then run a single +command to publish it. + +Another problem with the old site is that I needed to be connected to the +internet to get to the admin interface, so I couldn't update entries (or +publish new ones) offline. I usually have an internet connection, but +occasionally I don't. Now I can edit as much as I like on my own machine and +only need a connection to publish the finished product. + +### Easier to Backup + +One more advantage of Hyde is that the site structure *and* content are all +held in the same place. I keep everything in a [Mercurial][] repository, and +so every time I push that repository somewhere it creates a full backup of the +site's code *and* content. If WebFaction's server catches on fire I still have +everything on my local machine (and on BitBucket). + +I've toyed around with backing up Django's database tables when I had my old +site, but this new method is far less work. + +[Mercurial]: {{links.mercurial}} + +Getting Started +--------------- + +I wanted a fresh start when I was rewriting the site, so I went ahead and +created a brand new folder and Mercurial repository for it. + +I used `hyde --init` to lay out a skeleton in the new folder. Then I stripped +out a lot of the default items that get added with `--init` and created the +directory structure I wanted to use, with stubs for each of the main content +files I knew I'd need. + +Finally, I went ahead and filled some of the basic values in the `settings.py` +file. + +Layout and Styling +------------------ + +Once I had a skeleton in place I started working on layout of the site. + +### Cleanup + +The templates created by `hyde --init` are functional, but when you look at +the code they're a mess. The indentation is strange and inconsistent and +there's trailing whitespace all over the place. I like clean code so I sat +down and cleaned everything up before I started making any real changes. + +### Rewriting the Layout and Styles + +After I finished cleaning up the templates I duplicated the HTML structure and +styles of the old site from scratch. The old site had gone through a bunch of +iterations and I was a bit sloppy in my editing, so there was a lot of cruft +that had snuck in. I wanted a truly *fresh* start for the site, so I buckled +down and did it all again. + +### A New CSS Framework + +Previously I used the [Blueprint CSS framework][blueprint] to make laying out +the site easier. Blueprint is a great framework, but it's more powerful than I +need for a site as simple as this one. The site now uses [Aardvark Legs][aal], +which is a much simpler framework that simply sets up a great vertical rhythm +and leaves you free to lay out the horizontal structure yourself. + +### Pagination + +Before the rewrite the list of blog entries used to be paginated. Hyde +supports pagination but I decided against using it because I simply don't +write enough to make it necessary. All the blog entries are now listed on a +single page, which means that you can use Cmd+F to find an article if you're +looking for something specific. + +[blueprint]: http://www.blueprintcss.org/ +[aal]: {{links.aardvarklegs}} + +Using Fabric to Type Less +------------------------- + +I realized very quickly that typing `hyde -g -s . && hyde -w -s .` would get +old pretty quickly, so I installed [Fabric][] and wrote a fabfile. + +Fabric is a tool written in Python that lets you define tasks and execute them +by running `fab taskname`. Fabfiles are pure Python, so you can build larger +tasks out of smaller ones very easily and do just about anything you want. +It's similar to [ant][], but without the excessive over-engineering. + +You can view the [current fabfile][fabfile] on BitBucket. At the time of this +entry it looks like this: + + :::python + from fabric.api import * + import os + import fabric.contrib.project as project + + PROD = 'sjl.webfactional.com' + DEST_PATH = '/home/sjl/webapps/slc/' + ROOT_PATH = os.path.abspath(os.path.dirname(__file__)) + DEPLOY_PATH = os.path.join(ROOT_PATH, 'deploy') + + def clean(): + local('rm -rf ./deploy') + + def regen(): + clean() + local('hyde -g -s .') + + def serve(): + local('hyde -w -s .') + + def reserve(): + regen() + serve() + + def smush(): + local('smusher ./media/images') + + @hosts(PROD) + def publish(): + regen() + project.rsync_project( + remote_dir=DEST_PATH, + local_dir=DEPLOY_PATH.rstrip('/') + '/', + delete=True + ) + +The task I use most often while developing is `fab reserve`, which regenerates +the site and then starts serving it so I can view the result in a browser. + +I use `fab smush` whenever I add new images. This runs [smusher][] on all of +the images to optimize them without reducing quality. + +When I'm ready to publish changes to the live site I run `fab publish`, which +will regenerate my local version and copy it up to the WebFaction server. + +[Fabric]: {{links.fabric}} +[ant]: http://ant.apache.org/ +[fabfile]: http://bitbucket.org/sjl/stevelosh/src/tip/fabfile.py +[smusher]: http://github.com/grosser/smusher + +Moving the Content +------------------ + +The content of the old site (blog entries, projects, and static pages like the +[about page][]) was fairly easy to migrate over to the new one, because both +versions use [Markdown][] to format the text. + +First I created an empty file for each page with a filename that matched the +"slug" (last part of the URL) of the old page. Then I manually copied over the +title, creation time and content for every page. I could have written a script +to do this, but I don't have enough pages on the site to make it worth the +time. + +[about page]: /about/ +[Markdown]: {{links.markdown}} + +Converting the Comments +----------------------- + +At this point the new site was looking very much like the old one. The styles +were (roughly) matching and the blog posts, entries, and static pages were all +rendered nicely. + +The next big task was migrating all of the comments. Since the new site is +static it can't handle dynamic content like comments on its own, so I decided +to use [Disqus][]. I use Disqus for the comments on the [hg tip][] site and +it's very nice. For that site I used it from the beginning, but for this +rewrite I needed to somehow import all the old comments. + +To migrate the comments over I used [django-disqus][], but there was a small +snag that I needed to deal with first. + +When I first wrote the old site I was just getting back into Django after not +using it for a long time. I didn't know about Django's built-in comment +models, so I created my own. They weren't as good as Django's, but they did +the job and I didn't care enough to change them. + +This became a problem when it was time to import the old comments into Disqus. +django-disqus only supports importing comments from Django's built-in comment +models. To work around this I first had to convert the old comments into +Django's built-in ones. I wrote a [small, hacky Python +script][convert-comments] to do it: + + :::python + #!/usr/bin/env python + + from django.core.management import setup_environ + import settings + setup_environ(settings) + + from markdown import Markdown + from django.contrib.comments.models import Comment + from django.contrib.sites.models import Site + from stevelosh.blog.models import Comment as BlogComment + from stevelosh.projects.models import Comment as ProjectComment + + + mdown = Markdown() + + site = Site.objects.all()[0] + blog_comments = BlogComment.objects.filter(spam=False) + project_comments = ProjectComment.objects.filter(spam=False) + + for bc in blog_comments: + c = Comment() + c.content_object = bc.entry + c.user_name = bc.name + c.comment = mdown.convert(bc.body) + c.submit_date = bc.submitted + c.site = site + c.is_public = True + c.is_removed = False + c.save() + # print 'http://%s%s' % (site.domain, c.content_object.get_absolute_url()) + + for pc in project_comments: + c = Comment() + c.content_object = pc.project + c.user_name = pc.name + c.comment = mdown.convert(pc.body) + c.submit_date = pc.submitted + c.site = site + c.is_public = True + c.is_removed = False + c.save() + # print 'http://%s%s' % (site.domain, c.content_object.get_absolute_url()) + +Yes, it's ugly. No, I don't care. It was run once or twice locally and once on +the live server. It worked and I'll never need to run it again. + +Once I had the comments converted I could use django-disqus to migrate them. +The import went very smoothly -- I ran one command and after a couple of +minutes everything was in Disqus. Once that finished it was just a matter of +adding the Disqus JavaScript to one of the templates. + +[Disqus]: http://disqus.com/ +[hg tip]: {{links.hgtip}} +[django-disqus]: http://github.com/arthurk/django-disqus +[convert-comments]: http://bitbucket.org/sjl/stevelosh/src/da98105753a1/convert-comments.py + +Rewriting the Old URLs +---------------------- + +Since I was pretty much starting from scratch with this rewrite I decided to +clean up the URL structure of my blog. Previously a blog entry's URL looked +like this: + + :::text + http://stevelosh.com/blog/entry/2009/08/30/a-guide-to-branching-in-mercurial/ + +The `/entry/` part of the URL was useless -- it just took up space, so I got +rid of it. The year and month are useful to get an idea of how old an entry is +just by looking at the link, so I left them in. The day, however, probably +doesn't matter that much, so I took it out. + +The new URLs look like this: + + :::text + http://stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial/ + +The problem with rewriting the URL structure is that there are already links +around the web pointing at my entries. I didn't want those old links to break, +so I crafted an [`.htaccess` file][htaccess] that would rewrite the old URLs +into the new ones: + + {% templatetag openblock %} if GENERATE_CLEAN_URLS {% templatetag closeblock %} + RewriteEngine on + RewriteBase {% templatetag openvariable %} node.site.settings.SITE_ROOT {% templatetag closevariable %} + + # Old URLs + RewriteRule ^blog/entry/(\d+)/(\d\d)/\d+/([^/]*)/?$ /blog/$1/$2/$3/ [R=301,L] + RewriteRule ^blog/entry/(\d+)/(\d)/\d+/([^/]*)/?$ /blog/$1/0$2/$3/ [R=301,L] + + {% templatetag openblock %} hyde_listing_page_rewrite_rules {% templatetag closeblock %} + + # listing pages whose names are the same as their enclosing folder's + RewriteCond %{REQUEST_FILENAME}/$1.html -f + RewriteRule ^([^/]*)/$ %{REQUEST_FILENAME}/$1.html + + # regular pages + RewriteCond %{REQUEST_FILENAME}.html -f + RewriteRule ^.*$ %{REQUEST_FILENAME}.html + + {% templatetag openblock %} endif {% templatetag closeblock %} + +Most of that file is the stock Hyde `.htaccess` file -- the two lines under `# +Old URLs` are the ones that I added. It took me a while to get it right +because I don't work with Apache's `mod_rewrite` very often, but it was worth +it to avoid breaking all of the old links. + +[htaccess]: http://bitbucket.org/sjl/stevelosh/src/tip/content/.htaccess + +Creating an RSS Feed +-------------------- + +I had an RSS feed for the old site which Django made very easy to set up. I +definitely needed a feed for the new site, and fortunately Hyde provides a +simple sample template that can be used to make an ATOM feed. + +I cleaned up the whitespace and formatting of that template a bit, adjusted a +few variables for my needs, put it on [FeedBurner][] and everything was ready. + +[FeedBurner]: http://www.feedburner.com/ + +Merging the Repositories +------------------------ + +The last step before I was finished was to merge the old and new repositories +together so I wouldn't lose any of the history. It's probably not *too* +important to keep the old site's history around, but I put a lot of work into +it over the past year and it has some sentimental value. + +Fortunately it's very easy to [combine Mercurial repositories][combinerepos]. +I just pulled the old repository into the new one, merged the old head into +the new one while discarding all the changes, and pushed it up to BitBucket. + +[combinerepos]: http://hgtip.com/tips/advanced/2009-11-17-combining-repositories/ + +Still to Come +------------- + +At this point I felt the site was ready to be released, so I set up a new site +on WebFaction and used Fabric to deploy it. + +I'm very happy with the result, but there are still a few things I'm going to +fix/change in the future. + +### "Ago" Dates + +**UPDATE:** This is done. I've started using [timeago.js][] to render the +"ago" dates. + +If you look at the top of each blog entry and project there's a line beneath +the title that looks something like: + + :::text + Posted on Monday, November 16, 2009 (1 month, 3 weeks ago). + +The `(1 month, 3 weeks ago)` part of that line is something that I really +appreciate on blogs. When they just list the date I always have to do the math +in my head to figure out roughly how old something is. + +With a static site, however, those times will quickly become inaccurate if I +don't regenerate and publish the site regularly. I'm still thinking about the +best way to work this out. + +One option is to use a cron job on the WebFaction server to regenerate the +site every day, which would keep the times *fairly* accurate. + +Another option would be to use a bit of JavaScript to calculate and render the +time when the page is loaded. This would make it *completely* accurate but +wouldn't work if someone is browsing with JavaScript turned off. + +[timeago.js]: http://timeago.yarp.com/ + +### Categories + +**UPDATE:** I've added categories. Check out [this changeset][categorycset] to see what I had to do. + +Right now all the blog entries (and projects) are listed in a single +chronological list. It would be great to break them up into categories so +people can easily find the articles they're interested in. + +Hyde supports categories but I haven't spent the time to learn how to use them +yet. I also need to figure out a way to work a list of categories into the +design without cluttering things up too much. + +[categorycset]: http://bitbucket.org/sjl/stevelosh/changeset/08d7552b6237/ + +### Use LessCSS + +**UPDATE:** This is done. The main style file now uses LessCSS. + +[LessCSS][] is a language that extends CSS with some useful features like +variables, mixins, operations and nested rules. It can make the styles of a +site much, much cleaner. + +Hyde includes a LessCSS "processor" that will automatically render your +LessCSS files into normal CSS. I'm planning on rewriting the site's styles in +LessCSS and using the processor once I get some free time. + +[lesscss]: {{links.lesscss}} + +View the Code +------------- + +The code is on [BitBucket][bb-repo] and [GitHub][gh-repo]. Feel free to poke +around and see how I've set things up. If you have questions or suggestions +I'd love to hear them! + +[bb-repo]: http://bitbucket.org/sjl/stevelosh/ +[gh-repo]: http://github.com/sjl/stevelosh/ diff -r a54e97c153ae -r 7d7b1c625d52 content/feed.html --- a/content/feed.html Tue Nov 30 18:17:40 2010 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -{% extends "skeleton/_atom.xml" %} \ No newline at end of file diff -r a54e97c153ae -r 7d7b1c625d52 content/index.html --- a/content/index.html Tue Nov 30 18:17:40 2010 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -{% extends "_splash.html" %} - -{% hyde - title: "" -%} diff -r a54e97c153ae -r 7d7b1c625d52 content/index.markdown --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/content/index.markdown Tue Nov 30 19:06:42 2010 -0500 @@ -0,0 +1,3 @@ +title: ' ' +template: home + diff -r a54e97c153ae -r 7d7b1c625d52 content/resume.html --- a/content/resume.html Tue Nov 30 18:17:40 2010 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,220 +0,0 @@ -{% extends "_flatpage.html" %} - -{% hyde - title: "Résumé" - exclude: True -%} - -{% block article %} - -I'm Steve. I'm a programmer from Rochester, NY. I graduated from [Rochester -Institute of Technology][rit] in 2008 with a Bachelor's degree in [Computer -Science][ritcs]. - -I'm currently most interested in rapid web development, version control, and -artificial intelligence. I'm not looking for full time work at the moment but -I'm available for interesting freelance projects. - -If you'd *really* like to get to know me you should look at the [projects][] -and [blog posts][] I've written, or cut to the chase and look at my [code][]. - -[rit]: http://rit.edu/ -[ritcs]: http://www.cs.rit.edu/ -[projects]: /projects/ -[blog posts]: /blog/ -[code]: http://bitbucket.org/sjl/ - -## Skills & Interests - -I'm passionate about programming. It may sound odd, but there are aspects of -programming that I find beautiful (in every sense of the word). - -### Languages - -My favorite programming language at the moment is [Python][]. It's elegant, -readable, powerful, and makes it easy to *get things done*. - -I've also had experience with [Java][], [C][], [C++][], [Lisp][], [SQL][] and -[PL/SQL][], [JavaScript][], [Groovy][], and [bash scripting][]. I've used a -number of markup and templating languages, including [XHTML][], [XML][], -[CSS][], [JSON][], [Markdown][], [Django][]'s template system, and [Jinja2][]. - -In my free time I'm working on learning [R][]. - -[Python]: http://www.python.org/ -[Java]: http://java.sun.com/ -[C]: http://en.wikipedia.org/wiki/C_(programming_language) -[C++]: http://en.wikipedia.org/wiki/C%2B%2B -[Lisp]: http://en.wikipedia.org/wiki/Lisp_(programming_language) -[SQL]: http://en.wikipedia.org/wiki/SQL -[PL/SQL]: http://en.wikipedia.org/wiki/PL/SQL -[JavaScript]: http://en.wikipedia.org/wiki/JavaScript -[Groovy]: http://groovy.codehaus.org/ -[bash scripting]: http://www.gnu.org/software/bash/ -[XHTML]: http://www.w3.org/TR/xhtml1/ -[XML]: http://www.w3.org/XML/ -[CSS]: http://www.w3.org/TR/CSS/ -[JSON]: http://www.json.org/ -[Markdown]: {{links.markdown}} -[Jinja2]: http://jinja.pocoo.org/2/ -[R]: http://www.r-project.org/ - -### Web Development - -For web development I gravitate toward the [Django][] framework. Django bills -itself as "The Web framework for professionals with deadlines" and this -strikes a chord with me. - -I've used the [CherryPy][] framework for smaller (but still dynamic) projects -that don't need the additional functionality of Django. - -I hate writing repetitive, difficult-to-maintain code. Even when writing -completely static websites I prefer to take advantage of templating languages. -To do that I use [Hyde][] and [Blatter][], both of which generate static HTML -from templates. - -I've used several CSS frameworks including [Blueprint][], [Tripoli][] and -[aardvark legs][]. Of these I now prefer aardvark legs because it makes -setting up a beautiful vertical rhythm simple and doesn't impose itself on the -horizontal layout. - -When writing [JavaScript][] I use [jQuery][] to eliminate a lot of the -tediousness and create elegant code. - -[Django]: {{links.django}} -[CherryPy]: {{links.cherrypy}} -[Blueprint]: http://www.blueprintcss.org/ -[Tripoli]: http://devkick.com/lab/tripoli/ -[aardvark legs]: {{links.aardvarklegs}} -[Hyde]: http://github.com/lakshmivyas/hyde -[Blatter]: {{links.blatter}} -[jQuery]: http://jquery.com/ - -### Version Control - -I think version control is essential for a project of almost any size, and -lately the concepts behind it have captured my interest. - -In my personal work I use [Mercurial][] (usually with [BitBucket][]). I've -[contributed][] several minor patches to the Mercurial core and written two -extensions: [hg-prompt][] and [hg-paste][]. - -I know my way around [Subversion][], [CVS][], and [git][] as well. - -[Mercurial]: {{links.mercurial}} -[BitBucket]: http://bitbucket.org/ -[Subversion]: http://subversion.tigris.org/ -[CVS]: http://www.nongnu.org/cvs/ -[git]: http://git-scm.com/ -[contributed]: http://selenic.com/repo/hg/log?rev=Steve+Losh -[hg-prompt]: /projects/hg-prompt/ -[hg-paste]: /projects/hg-paste/ - -### How I Work - -For my personal work I use [Mac OS X][]. I'm comfortable in [Linux][] and can -deal with [Windows][] (though I don't enjoy it). - -I use [TextMate][] and [vim][] for coding, [CSSEdit][] when designing, -[Mercurial][] for version control, [t][] to manage my personal tasks, and -deploy through [SSH][] with [fabric][]. - -[Mac OS X]: http://www.apple.com/macosx/ -[TextMate]: http://macromates.com/ -[SSH]: http://en.wikipedia.org/wiki/Secure_Shell -[fabric]: {{links.fabric}} -[Linux]: http://www.linux.org/ -[Windows]: http://www.microsoft.com/WINDOWS/ -[vim]: http://www.vim.org/ -[CSSEdit]: http://macrabbit.com/cssedit/ -[t]: /projects/t/ - -## Personal Projects - -You can find some of my pet projects on the [projects][] page. - -Lately I've been working on a few new things that aren't quite ready for -general use, but are getting close: - -* [hg-review][]: a code-review extension for Mercurial. -* [LindyHub][]: a site like BitBucket or GitHub for dancers. -* [gorilla][]: a packaging system for Python. -* [tinpan][]: a language-agnostic, vcs-agnostic continuous integration system. - -[hg-review]: http://bitbucket.org/sjl/hg-review/ -[LindyHub]: http://test.lindyhub.com/ -[gorilla]: http://bitbucket.org/sjl/gorilla/ -[tinpan]: http://bitbucket.org/sjl/tinpan/ - -## Full-Time Work Experience - -I completed two six-month [co-ops][] while at [RIT][]. Since I graduated I've -worked full time for about a year and a half. - -[co-ops]: https://www.rit.edu/about/coop_careers.html -[RIT]: http://rit.edu/ - -### Senior Software Engineer at [Dumbwaiter Design][DWD] - -*Henrietta, NY since January 2010.* - -At [Dumbwaiter][DWD] I work with our amazing designers to create beautiful websites backed by [Django][] and [Python][]. - -[DWD]: http://dwaiter.com/ - -### Software Engineer at [PAETEC][] - -*Fairport, NY from June 2008 to January 2010.* - -At [PAETEC][] I maintained and implemented new features for web applications -in [Java][] using the [Oracle E-Business Suite][oebs] and worked on underlying -[SQL][] and [PL/SQL][] code for our databases. - -[PAETEC]: http://paetec.com/ -[oebs]: http://www.oracle.com/applications/e-business-suite.html - -### Data Architecture Co-op at [Excellus BlueCross BlueShield][] - -*Rochester, NY from June 2007 to November 2007.* - -At [Excellus][] I developed software in [Java][] to interact with and manage -databases of customer and provider information stored on a mainframe. I also -created and updated [JUnit][] and [Jemmy][] tests for this software. - -[Excellus BlueCross BlueShield]: https://www.excellusbcbs.com/ -[Excellus]: https://www.excellusbcbs.com/ -[JUnit]: http://www.junit.org/ -[Jemmy]: http://jemmy.dev.java.net/ - -### Managed Services Programmer at [RightNow Technologies][] - -*Pittsford, NY from June 2006 to November 2006.* - -At [RightNow][] I developed a set of tools to test the effectiveness of -voice-automated telephone systems. These tools were written in a combination -of [bash scripting][] and [Python][]. I assisted in generating statistics -about the effectiveness of these systems for customers. - -[RightNow Technologies]: http://www.rightnow.com/ -[RightNow]: http://www.rightnow.com/ - -## Contact Me - -If you'd like to get in touch with me, you can use any method you like. - -My **email address** is: -My **phone number** is: (570) 417-1392 -My **skype username** is: steve.losh -My **mailing address** is: 150 Park Avenue, Apartment 7, Rochester, NY 14607 - -You can also find me on [Twitter][], [Flickr][], [BitBucket][], [GitHub][], -[BrightKite][], or [DjangoPeople][]. - -[Twitter]: http://twitter.com/stevelosh/ -[Flickr]: http://www.flickr.com/photos/sjl7678/ -[BitBucket]: http://bitbucket.org/sjl/ -[GitHub]: http://github.com/sjl/ -[BrightKite]: http://brightkite.com/people/stevelosh/ -[DjangoPeople]: http://djangopeople.net/stevelosh/ - -{% endblock %} diff -r a54e97c153ae -r 7d7b1c625d52 layout/_flatpage.html --- a/layout/_flatpage.html Tue Nov 30 18:17:40 2010 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -{% extends "skeleton/_base.html" %} - -{% block content %} -

{{ page.title|safe|typogrify }}

- -
- {% filter typogrify %} - {% markdown toc def_list %} - {% block article %}{% endblock %} - {% endmarkdown %} - {% endfilter %} -
-{% endblock %} \ No newline at end of file diff -r a54e97c153ae -r 7d7b1c625d52 layout/_post.html --- a/layout/_post.html Tue Nov 30 18:17:40 2010 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,42 +0,0 @@ -{% extends "skeleton/_base.html" %} - -{% block extra_css %} - -{% endblock %} - -{% block content %} - - - -
- {% if page.flattr %} -
- -
- {% endif %} -

- Posted - - - on {{ page.created|date:"F j, Y" }}. -

-
- -
- {% filter typogrify %} - {% article %} - {% filter typogrify %} - {% markdown toc def_list codehilite %} - {% block article %}{% endblock %} - {% endmarkdown %} - {% endfilter %} - {% endarticle %} - {% endfilter %} -
-{% endblock %} diff -r a54e97c153ae -r 7d7b1c625d52 layout/_splash.html --- a/layout/_splash.html Tue Nov 30 18:17:40 2010 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ -{% extends "skeleton/_base.html" %} - -{% block content %} -
- {% filter typogrify %} -

Hello, I'm Steve.

- -

- I'm a programmer, photographer, dancer & - bassist from Rochester, New York. -

- -

- If you want to get in touch with me, - email is best. -

- {% endfilter %} -
-{% endblock %} diff -r a54e97c153ae -r 7d7b1c625d52 layout/skeleton/_atom.xml --- a/layout/skeleton/_atom.xml Tue Nov 30 18:17:40 2010 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ - - -{% spaceless %} - - - {% block title %}{{ site.name }}{% endblock %} - - {% block self_url %} - - {% endblock %} - - {% block site_url %} - - {% endblock %} - - {% block feed_extra %}{% endblock %} - - {{ now|xmldatetime }} - - {{ site.full_url }}/ - - {% recent_posts recents 4 page.blog_node %} - - {% for post in recents %} - {% if not post.listing and not post.exclude %} - - {{ post.title }} - {{ site.author }} - - {{ post.created|xmldatetime }} - {{ post.created|xmldatetime }} - {{ post.full_url }} - {% block entry_extra %}{% endblock %} - - {% filter force_escape %} - {% render_article post %} - {% endfilter %} - - - {% endif %} - {% endfor %} - - -{% endspaceless %} diff -r a54e97c153ae -r 7d7b1c625d52 layout/skeleton/_base.html --- a/layout/skeleton/_base.html Tue Nov 30 18:17:40 2010 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,122 +0,0 @@ -{% extends "skeleton/_root.html" %} - -{% block all %} - - - - - - - - - {% block title %}{% block extra_title %}{% endblock %}{{ page.title|safe }} / {{ site.name }}{% endblock %} - - {% block feeds %} - - {% endblock %} - - {% block css %} - - - - - {% block extra_css %}{% endblock %} - {% endblock %} - - {% block js %} - - - - - - - - - - - {% block extra_js %}{% endblock %} - {% endblock %} - - - - - - - - - -
-
-
- steve losh -
- - -
- -
 
- -
- {% with page.node.ancestors|last as parent_node %} - {% with parent_node.url as parent_url %} - {% block content %}{% endblock %} - {% endwith %} - {% endwith %} -
- -
 
- - -
- - -{% endblock %} diff -r a54e97c153ae -r 7d7b1c625d52 layout/skeleton/_body.html --- a/layout/skeleton/_body.html Tue Nov 30 18:17:40 2010 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ -{% extends "skeleton/_base.html" %} - -{% block title %}{{site.name}} / {{ page.title }}{% endblock %} - -{% block content %} - {% block content_body %}{% endblock %} -{% endblock %} \ No newline at end of file diff -r a54e97c153ae -r 7d7b1c625d52 layout/skeleton/_index.html --- a/layout/skeleton/_index.html Tue Nov 30 18:17:40 2010 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ -{% extends "skeleton/_base.html" %} - -{% block content %} - {% for node in page.node.walk %} - {% include "skeleton/_innerindex.html" %} - {% endfor %} -{% endblock %} \ No newline at end of file diff -r a54e97c153ae -r 7d7b1c625d52 layout/skeleton/_innerindex.html --- a/layout/skeleton/_innerindex.html Tue Nov 30 18:17:40 2010 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -{% extends "skeleton/_root.html" %} - -{% block all %} -{%spaceless%} -{% for list_page in node.pages %} - {% ifnotequal list_page node.listing_page %} - {% if not list_page.exclude %} -
-
- {% with list_page.name_without_extension|remove_date_prefix|unslugify as default_title %} -

- - {{ list_page.title|default_if_none:default_title }} - -

- {% if list_page.created %} - {{ list_page.created }} - {% endif %} - {%endwith%} -
- {% render_article list_page %} -
- {%endif%} - {% endifnotequal %} -{% endfor %} -{%endspaceless%} -{% endblock %} \ No newline at end of file diff -r a54e97c153ae -r 7d7b1c625d52 layout/skeleton/_innerlisting.html --- a/layout/skeleton/_innerlisting.html Tue Nov 30 18:17:40 2010 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -{% extends "skeleton/_root.html" %} - -{% block all %} -{%spaceless%} - -{% for list_page in node.pages %} - {% ifnotequal list_page node.listing_page %} - {% if not list_page.exclude %} - {% include "skeleton/_listingitem.html" %} - {%endif%} - {% endifnotequal %} -{% endfor %} - -{%endspaceless%} -{% endblock %} \ No newline at end of file diff -r a54e97c153ae -r 7d7b1c625d52 layout/skeleton/_listing.html --- a/layout/skeleton/_listing.html Tue Nov 30 18:17:40 2010 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,11 +0,0 @@ -{% extends "skeleton/_base.html"%} - -{% block content %} -
-
    - {% for node in page.node.walk reversed %} - {% include "skeleton/_innerlisting.html" %} - {% endfor %} -
-
-{% endblock %} diff -r a54e97c153ae -r 7d7b1c625d52 layout/skeleton/_listingitem.html --- a/layout/skeleton/_listingitem.html Tue Nov 30 18:17:40 2010 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -
  • - - {% with list_page.name_without_extension|remove_date_prefix|unslugify as default_title %} - {{ list_page.title|default_if_none:default_title|safe|typogrify }} - {%endwith%} - - {{ list_page.snip|safe|typogrify }} -
  • diff -r a54e97c153ae -r 7d7b1c625d52 layout/skeleton/_root.html --- a/layout/skeleton/_root.html Tue Nov 30 18:17:40 2010 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -{% block all %}{% endblock %} \ No newline at end of file diff -r a54e97c153ae -r 7d7b1c625d52 templates/about.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/templates/about.html Tue Nov 30 19:06:42 2010 -0500 @@ -0,0 +1,8 @@ +{% extends "base.html" %} + +{% block content %} + +

    {{ title }}

    + + {{ content }} +{% endblock %} diff -r a54e97c153ae -r 7d7b1c625d52 templates/archive_year.html diff -r a54e97c153ae -r 7d7b1c625d52 templates/base.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/templates/base.html Tue Nov 30 19:06:42 2010 -0500 @@ -0,0 +1,107 @@ + + + + + + + + + {{ head_title }} + + {% block css %} + + + + + {% block extra_css %}{% endblock %} + {% endblock %} + + {% block js %} + + + + + + + + + + + {% block extra_js %}{% endblock %} + {% endblock %} + + + + + + + + +
    +
    +
    + steve losh +
    + + +
    + +
     
    + +
    + {% block content %}{% endblock %} +
    + +
     
    + + +
    + + diff -r a54e97c153ae -r 7d7b1c625d52 templates/entry-list.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/templates/entry-list.html Tue Nov 30 19:06:42 2010 -0500 @@ -0,0 +1,14 @@ +{% extends "base.html" %} + +{% block content %} +
    +
      + {%- for page in pages %} +
    1. + {{ page.title }} + {{ page.snip }} +
    2. + {% endfor %} +
    +
    +{% endblock %} diff -r a54e97c153ae -r 7d7b1c625d52 templates/entry.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/templates/entry.html Tue Nov 30 19:06:42 2010 -0500 @@ -0,0 +1,34 @@ +{% extends "base.html" %} + +{% block extra_css %} + +{% endblock %} + +{% block content %} + + +
    + {% if flattr %} +
    + +
    + {% endif %} +

    + Posted + + FIXME + + on FIXME. +

    +
    + +
    + {{ content }} +
    +{% endblock %} diff -r a54e97c153ae -r 7d7b1c625d52 templates/home.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/templates/home.html Tue Nov 30 19:06:42 2010 -0500 @@ -0,0 +1,18 @@ +{% extends "base.html" %} + +{% block content %} +
    +

    Hello, I'm Steve.

    + +

    + I'm a programmer, photographer, dancer & + bassist from Rochester, New York. +

    + +

    + If you want to get in touch with me, + email is best. +

    +
    +{% endblock %} + diff -r a54e97c153ae -r 7d7b1c625d52 templates/page.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/templates/page.html Tue Nov 30 19:06:42 2010 -0500 @@ -0,0 +1,5 @@ +{% extends "base.html" %} + +{% block content %} + {{ content }} +{% endblock %}