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

<channel>
	<title>Zach Hannes</title>
	<atom:link href="http://portfolio.zhannes.com/feed" rel="self" type="application/rss+xml" />
	<link>http://portfolio.zhannes.com</link>
	<description>portfolio</description>
	<lastBuildDate>Sun, 05 Dec 2010 17:05:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>DefeatPovertyDC.org</title>
		<link>http://portfolio.zhannes.com/defeatpovertydc/2010.10.13</link>
		<comments>http://portfolio.zhannes.com/defeatpovertydc/2010.10.13#comments</comments>
		<pubDate>Wed, 13 Oct 2010 18:59:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[client_work]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://portfolio.zhannes.com/?p=68</guid>
		<description><![CDATA[Recently finished development for http://defeatpovertydc.org. Notable features include: Constant Contact integration, contact form to promote dialogue with members of Washington, D.C. Government, Event Management, Social Media Integration.]]></description>
			<content:encoded><![CDATA[<p>Recently finished development for <a href="http://defeatpovertydc.org">http://defeatpovertydc.org</a>.</p>
<h3>Contact Local Officials Form</h3>
<ul>
<li>Visitors may choose from a drop down of local officials and send a message.</li>
</ul>
<h3>Constant Contact Integration</h3>
<ul>
<li>E-mail list sign-up.</li>
<li>Users can specify their Ward in Washington, D.C.</li>
<li>Info is stored in client&#8217;s Constant Contact account</li>
</ul>
<h3>Improved User Experience</h3>
<ul>
<li>Implementation of enhanced visual design with direct calls to action.</li>
</ul>
<h3>Event Management</h3>
<ul>
<li>RSVP</li>
<li>e-mail notification</li>
<li>calendar display</li>
<li>event promotion &amp; discussion via Twitter #hashtags.</li>
</ul>
<h3>Social Media Integration</h3>
<ul>
<li>Visitors can easily share content services such as Twitter &amp; Facebook.</li>
<li>New content is sent to Twitter &amp; Facebook.</li>
<li>Promote discussion of content via Twitter.</li>
</ul>
<h3>About Defeat Poverty DC</h3>
<p><span style="font-weight: normal; font-size: 13px;">Defeat Poverty DC is a coalition of organizations and residents in the District of Columbia working to bring greater focus during the 2010 election season and beyond to the damaging effects of poverty on the entire city.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://portfolio.zhannes.com/defeatpovertydc/2010.10.13/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lens &amp; Pens &#8211; Art in an Unexpected Place</title>
		<link>http://portfolio.zhannes.com/lens-pens-art-in-an-unexpected-place/2010.06.12</link>
		<comments>http://portfolio.zhannes.com/lens-pens-art-in-an-unexpected-place/2010.06.12#comments</comments>
		<pubDate>Sat, 12 Jun 2010 01:14:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[client_work]]></category>

		<guid isPermaLink="false">http://portfolio.zhannes.com/?p=55</guid>
		<description><![CDATA[Helping writer Deborah Schull get information online about her indie documentary, Lens &#38; Pens &#8212; http://lensandpens.net. This documentary tells the story of a poetry, painting, and photography workshop and its profound impact on “criminally insane” patients held under maximum security at Washington, DC’s, St. Elizabeths Hospital. The theme features a custom admin interface with options. [...]]]></description>
			<content:encoded><![CDATA[<p>Helping writer Deborah Schull get information online about her indie documentary, Lens &amp; Pens &#8212; <a href="http://lensandpens.net">http://lensandpens.net</a>. This documentary tells the story of a poetry, painting, and photography workshop and its profound impact on “criminally insane” patients held under maximum security at Washington, DC’s, St. Elizabeths Hospital.</p>
<p>The theme features a custom admin interface with options. Additionally, the theme:</p>
<ul>
<li>is optimized for Search Engines</li>
<li>utilizes WordPress&#8217; gallery functionality</li>
<li>uses the jQuery Colorbox, and</li>
<li>integrates with Social Media platforms such as Facebook and Twitter.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://portfolio.zhannes.com/lens-pens-art-in-an-unexpected-place/2010.06.12/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reporting with Rails and AM Charts and Maps</title>
		<link>http://portfolio.zhannes.com/reporting-with-rails-am-charts-maps/2010.06.01</link>
		<comments>http://portfolio.zhannes.com/reporting-with-rails-am-charts-maps/2010.06.01#comments</comments>
		<pubDate>Tue, 01 Jun 2010 00:22:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[client_work]]></category>

		<guid isPermaLink="false">http://portfolio.zhannes.com/?p=46</guid>
		<description><![CDATA[Just completed an internship with a DOJ contractor. It was a fun way to work on a Ruby on Rails application. They were using an internal tracking application to log calls and e-mails. The features I added to the tracking application were: search call and e-mail log ( just used ActiveRecord, since it was an [...]]]></description>
			<content:encoded><![CDATA[<p>Just completed an internship with a DOJ contractor. It was a fun way to work on a Ruby on Rails application. They were using an internal tracking application to log calls and e-mails. The features I added to the tracking application were:</p>
<ul>
<li>search call and e-mail log ( just used ActiveRecord, since it was an internal application)</li>
<li>sortable tabular data using jQuery</li>
<li>display statistics about calls/e-mails over time
<ul>
<li>line graphs</li>
<li>pie charts</li>
<li>maps</li>
</ul>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://portfolio.zhannes.com/reporting-with-rails-am-charts-maps/2010.06.01/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cross-browser Templates for Non-Profit</title>
		<link>http://portfolio.zhannes.com/cross-browser-templates-for-non-profit/2010.05.06</link>
		<comments>http://portfolio.zhannes.com/cross-browser-templates-for-non-profit/2010.05.06#comments</comments>
		<pubDate>Thu, 06 May 2010 21:03:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[client_work]]></category>
		<category><![CDATA[html]]></category>

		<guid isPermaLink="false">http://dev.portfolio.zhannes.com/?p=44</guid>
		<description><![CDATA[Recently I provided the service of converting several PSDs to HTML for a non-profit. Working with a designer, we identified four unique types of templates required by the organization&#8217;s content. Our final deliverables were four static HTML layouts with shared CSS and JavaScript. The layouts work across all browsers, even IE6. We ran into a [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I provided the service of converting several PSDs to HTML  for a non-profit. Working with a designer, we identified four unique  types of templates required by the organization&#8217;s content. Our final  deliverables were four static HTML layouts with shared CSS and  JavaScript. The layouts work across all browsers, even IE6. We ran into a  known  issue with IE6&#8242;s treatment of z-indexing on &#8220;windowed&#8221; elements  such as select boxes. To the rescue came jQuery&#8217;s <a href="http://plugins.jquery.com/project/bgiframe">BGI Frame plugin</a>,  which implements one of the known fixes for the IE6 treatment of select  boxes &#8212; adding another &#8220;windowed&#8221; element under the content that you  would like stack on top of the select box for example.</p>
]]></content:encoded>
			<wfw:commentRss>http://portfolio.zhannes.com/cross-browser-templates-for-non-profit/2010.05.06/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Data Analysis for Online Health Company</title>
		<link>http://portfolio.zhannes.com/data-analysis-for-online-health-websitecom/2010.05.05</link>
		<comments>http://portfolio.zhannes.com/data-analysis-for-online-health-websitecom/2010.05.05#comments</comments>
		<pubDate>Wed, 05 May 2010 15:32:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[client_work]]></category>

		<guid isPermaLink="false">http://localhost:8888/wp-portfolio/?p=43</guid>
		<description><![CDATA[Recently I did some programming to help a health website aggregate data about content on one of the sub-portals within its network. The goal of this work was to gather pieces of information spread across several spreadsheets. The requirements for the end result of the work was a valid CSV to serve as input for [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I did some programming to help a health website aggregate data about content on one of the sub-portals within its network. The goal of this work was to gather pieces of information spread across several spreadsheets.</p>
<p>The requirements for the end result of the work was  a valid CSV to serve as input for an automated script.</p>
<p>I did not have direct access to the content databases from my scripts. So to accurately aggregate complete data sets, I wrote a series of ruby scripts to consume  the incomplete content data which, spread across a number of a spreadsheets.</p>
<p>In addition, I used Ruby&#8217;s net/http library and hpricot to test the resulting data sets and ensure their accuracy.</p>
]]></content:encoded>
			<wfw:commentRss>http://portfolio.zhannes.com/data-analysis-for-online-health-websitecom/2010.05.05/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Custom WordPress Theme and Admin Options for Moresay.com</title>
		<link>http://portfolio.zhannes.com/custom-wordpress-theme-and-admin-options-for-moresay-com/2010.05.05</link>
		<comments>http://portfolio.zhannes.com/custom-wordpress-theme-and-admin-options-for-moresay-com/2010.05.05#comments</comments>
		<pubDate>Wed, 05 May 2010 15:04:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[client_work]]></category>

		<guid isPermaLink="false">http://localhost:8888/wp-portfolio/?p=39</guid>
		<description><![CDATA[Recently did custom WordPress Theme Development for http://moresay.com. I was tasked with: creating a flexible feature post area to showcase an adjustable number of images, and an adjustable image sizes showing posts by category with photos in the summary creating a configurable ticker that allows the end user to add/remove stock symbols pulls in live [...]]]></description>
			<content:encoded><![CDATA[<p>Recently did custom WordPress Theme Development for http://moresay.com. I was tasked with:</p>
<ul>
<li> creating a flexible feature post area to showcase
<ul>
<li>an adjustable number of images, and</li>
<li>an adjustable image sizes</li>
</ul>
</li>
<li>showing posts by category with photos in the summary</li>
<li>creating a configurable ticker that
<ul>
<li>allows the end user to add/remove stock symbols</li>
<li>pulls in live stock prices</li>
</ul>
</li>
<li>creating a configurable navigation for the header and footer navigation</li>
<li>configurable copyright language</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://portfolio.zhannes.com/custom-wordpress-theme-and-admin-options-for-moresay-com/2010.05.05/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GeoBlog &#8211; Recording blogger location</title>
		<link>http://portfolio.zhannes.com/geoblog-recording-blogger-location/2010.05.05</link>
		<comments>http://portfolio.zhannes.com/geoblog-recording-blogger-location/2010.05.05#comments</comments>
		<pubDate>Wed, 05 May 2010 14:31:06 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[jquery]]></category>
		<category><![CDATA[sinatra]]></category>

		<guid isPermaLink="false">http://localhost:8888/wp-portfolio/?p=36</guid>
		<description><![CDATA[Made a geoblog, the demo is here: http://dev.zhannes.com. Built a CRUD app that works as a blog and geotracker-ish. This idea started out because I get asked for directions a lot. I had the idea to create a mobile app that would let me record where I was and the directions I gave. Then I [...]]]></description>
			<content:encoded><![CDATA[<p>Made a geoblog, the demo  is here: <a href="http://dev.zhannes.com/">http://dev.zhannes.com</a>. Built a CRUD app that works as a blog and  geotracker-ish. This idea started out because I get asked for directions a lot. I had  the idea to create a mobile app that would let me record where I was and  the directions I gave. Then I realized that&#8217;d get pretty boring quick.  So I looked into general geo-javascript-stuff and had fun with it. The  server side code is written in the ruby &#8220;microframework&#8221;, Sinatra. Lots  more enhancements to make. I need to add a css layout, a map/blog icon,  and maybe hook this up to some yelp/twitter/4sq APIs. What else..?  probably need text formatting. Also planning to use the iUI JavaScript  framework so I can use this app from my iphone.</p>
<h3>Components</h3>
<ul>
<li><strong>Free template: </strong> by <a href="http://www.freecsstemplates.org/preview/terrafirma2">Terrafirma<sup>2</sup></a></li>
<li><strong>Language: </strong>Ruby</li>
<li><strong>Framework-ish: </strong>Sinatra</li>
<li><strong>Libraries: </strong>
<ul>
<li>ERB (embedded ruby) for the  views</li>
<li>Date</li>
</ul>
</li>
<li><strong>Database: </strong>Sqlite3</li>
<li><strong>ORM: </strong>ActiveRecord</li>
<li><strong>JavaScript: </strong>jQuery,Google Maps API (Map and  Geocoder for Addresses. Streetview)</li>
<li><strong>Banner Graphic: </strong>Created with free icons and GIMP</li>
</ul>
<h3>Options table</h3>
<p>Made an options table so i can enter pieces of  content that don&#8217;t need to be blog posts. E.g., tagline, sidebar, etc.  You can put HTML in there or whatever.</p>
<h3>Javascript &amp; Google Maps</h3>
<p>To detect the current location  (semi-accurate), the JavaScript uses a spec that is not fully supported  across browsers. The snippet looks like:</p>
<p><strong>navigator.geolocation.getCurrentPosition(yourFunctionName,  funcIfError);</strong></p>
<p>Going forward, I want to examine why the  map marker is off&#8230; even though the map is centered correctly.</p>
<h3>User Agent detection</h3>
<p>The ruby code detects the user agent  making the request and is able to serve a different layout accordingly.  This is useful on the iphone, which seems to choke on the Google Maps  geocoding functions, but not the map functions. I did not look into this  too much, probably an error in my code. The Google Street View requires  flash and would not work on the iphone anyway.</p>
<p>I want to change  the CSS and use the iUI library for iphone javascript so it feels like  an iphone web app.</p>
]]></content:encoded>
			<wfw:commentRss>http://portfolio.zhannes.com/geoblog-recording-blogger-location/2010.05.05/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP 7 Day event script for WordPress</title>
		<link>http://portfolio.zhannes.com/php-7-day-event-script-for-wordpress/2010.05.05</link>
		<comments>http://portfolio.zhannes.com/php-7-day-event-script-for-wordpress/2010.05.05#comments</comments>
		<pubDate>Wed, 05 May 2010 14:29:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://localhost:8888/wp-portfolio/?p=34</guid>
		<description><![CDATA[Extends &#8216;Simple event list&#8217; plugin for WordPress. The original plugin allows users to create an event by adding the date of the event in the custom field of a post. Then using a short-tag, the events could be listed in a post. My script adds several things. By adding the function to WordPress&#8217; functions.php file, [...]]]></description>
			<content:encoded><![CDATA[<p>Extends &#8216;Simple event list&#8217; plugin for WordPress. The original plugin  allows users to create an event by adding the date of the event in the  custom field of a post. Then using a short-tag, the events could be  listed in a post.</p>
<p>My script adds several things. By adding the  function to WordPress&#8217; functions.php file, we can display the events in  the sidebar for example, instead of inside a WordPress post.  The script  displays events for the next 7 days and groups the events by day of the  week. The script also allows for multiple events on a single day. For  each event on a given day, a link is output, which points to the event  (a post).</p>
]]></content:encoded>
			<wfw:commentRss>http://portfolio.zhannes.com/php-7-day-event-script-for-wordpress/2010.05.05/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>last.fm &#8211; Get User Info</title>
		<link>http://portfolio.zhannes.com/last-fm-get-user-info/2010.05.05</link>
		<comments>http://portfolio.zhannes.com/last-fm-get-user-info/2010.05.05#comments</comments>
		<pubDate>Wed, 05 May 2010 14:29:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[sinatra]]></category>

		<guid isPermaLink="false">http://localhost:8888/wp-portfolio/?p=32</guid>
		<description><![CDATA[By requiring the ruby modules 'rss', 'open-uri' we can fetch, format and display track info from Last.fm. Last.fm does not provide a user's Top Weekly Tracks in RSS format, so we need to also require 'hpricot' and parse the XML. Below are some classes, which are called from a helper method. The helper methods run when the Sinatra route matches. After the route runs the helper method and the data has been stored in an instance variable, the view is rendered.]]></description>
			<content:encoded><![CDATA[<p>By requiring the ruby modules &#8216;rss&#8217;, &#8216;open-uri&#8217; we can fetch, format and display track info from Last.fm.</p>
<p>Last.fm does not provide a user&#8217;s Top Weekly Tracks in RSS format, so we need to also require &#8216;hpricot&#8217; and parse the XML.</p>
<p>Here are some classes I coded which are later called in a Sinatra helper and eventually the returned data is exposed in a view. <a href="http://demos.zhannes.com/demo/last-fm">You can see this in action here</a>.</p>
<pre class="brush:ruby">require 'rubygems'
require 'hpricot'
require 'open-uri'
require 'rss'

class LastfmWeeklyTracksXML
  def initialize(username)
    @un = username
    @url = "http://ws.audioscrobbler.com/2.0/user/#{@un}/weeklytrackchart.xml"
    @data = []
  end

  # build an array of track info using xml data
  def get_the_data
    @doc = Hpricot.XML(open(@url))
    (@doc/:track).each do |track|
      t = { :artist =&gt; track.at("artist").innerHTML, :song =&gt; track.at("name").innerHTML, :url =&gt; "http://" + track.at("url").innerHTML,:plays =&gt; track.at("playcount").innerHTML}
      @data.push(t)
    end
    return @data
  end

end

class Feed

  def initialize(url)
    @url = url
    @data = []
  end

  def read_feed
    @document = open(@url).read
    rss = RSS::Parser.parse(@document)

    rss.items.each do |item|
      @data.push({ :title =&gt; item.title, :url =&gt; item.link})
    end
    return @data
  end

end</pre>
<h3>Helper code</h3>
<pre class="brush:ruby">  # call this from the route in app.rb
  # either helpers or routes has to inherit the
  # classes for getting Last.FM xml and rss data
  def last_fm_info(datatype,username)
    case datatype
    when "loved"
      url = "http://ws.audioscrobbler.com/2.0/user/#{username}/lovedtracks.rss"
      f = Feed.new(url)
      f.read_feed
    when "recent"
      url = "http://ws.audioscrobbler.com/1.0/user/#{username}/recenttracks.rss"
      f = Feed.new(url)
      f.read_feed
    when "top-weekly"
      url = "http://ws.audioscrobbler.com/2.0/user/#{username}/weeklytrackchart.xml"
      f = LastfmWeeklyTracksXML.new(username)
      f.get_the_data
    end
  end</pre>
<h3>Code for Sinatra route</h3>
<pre class="brush:ruby"># this code would be in your app.rb file
post '/demo/last-fm' do
  datatype = params[:type]
  username = params["lastfm-un"]
  if datatype == "top-weekly"
    @weekly = last_fm_info(datatype,username)
  else
    @tracks = last_fm_info(datatype,username)
  end
  @type = datatype.gsub("-"," ")
  erb :lastfm
end</pre>
]]></content:encoded>
			<wfw:commentRss>http://portfolio.zhannes.com/last-fm-get-user-info/2010.05.05/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery Blocks</title>
		<link>http://portfolio.zhannes.com/jquery-blocks/2010.05.05</link>
		<comments>http://portfolio.zhannes.com/jquery-blocks/2010.05.05#comments</comments>
		<pubDate>Wed, 05 May 2010 14:27:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://localhost:8888/wp-portfolio/?p=29</guid>
		<description><![CDATA[See the demo here: This demo simulates gravity, making the blocks fall as users click on them. This was accomplished using jquery&#8217;s animate function as well as built in position and offset functions.]]></description>
			<content:encoded><![CDATA[<p>See the demo here:<br />
This demo simulates gravity, making the blocks fall as users click on them. This was accomplished using jquery&#8217;s animate function as well as built in position and offset functions.</p>
]]></content:encoded>
			<wfw:commentRss>http://portfolio.zhannes.com/jquery-blocks/2010.05.05/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

