<?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>green galoshes &#187; projects</title>
	<atom:link href="http://greengaloshes.cc/category/projects/feed/" rel="self" type="application/rss+xml" />
	<link>http://greengaloshes.cc</link>
	<description>by Justin D. Henry</description>
	<lastBuildDate>Fri, 16 Jul 2010 22:14:36 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Fixing Numara Footprint&#8217;s addressbook search with a Greasemonkey Userscript</title>
		<link>http://greengaloshes.cc/2008/10/fixing-numara-footprints-addressbook-search-with-a-greasemonkey-userscript/</link>
		<comments>http://greengaloshes.cc/2008/10/fixing-numara-footprints-addressbook-search-with-a-greasemonkey-userscript/#comments</comments>
		<pubDate>Wed, 22 Oct 2008 04:49:32 +0000</pubDate>
		<dc:creator>Justin D. Henry</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[uvm]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[footprints]]></category>
		<category><![CDATA[greasemonkey]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[ldap]]></category>
		<category><![CDATA[numara]]></category>
		<category><![CDATA[userscript]]></category>

		<guid isPermaLink="false">http://greengaloshes.cc/?p=123</guid>
		<description><![CDATA[UVM uses Numara Footprints to track client support tickets. When creating tickets from client submitted email, the application automatically fills out the contact information for the client, using their email to search against LDAP. This search fails if the address from the incoming ticket is in the format uid@uvm.edu (as opposed to first.last@uvm.edu). This results [...]]]></description>
			<content:encoded><![CDATA[<p>UVM uses <a href="http://www.numarasoftware.com/FootPrints.asp" title="Service Desk Software: Numara FootPrints 8">Numara Footprints</a> to track client support tickets.  When creating tickets from client submitted email, the application automatically fills out the contact information for the client, using their email to search against LDAP.   </p>
<p>This search <a href="http://list.uvm.edu/cgi-bin/wa?A2=FOOTPRINTS;HjfBYw;20080705133136-0400" title="LISTSERV 15.5 - FOOTPRINTS Archives">fails</a> if the address from the incoming ticket is in the format uid@uvm.edu (as opposed to first.last@uvm.edu). This results in a significant number of tickets coming into the system with only an email address in the contact field.  </p>
<p>It seems the only way to fix this is by copying the uid, clearing out the rest of the fields, and searching by uid again.  This needs to be done for every affected ticket.</p>
<h3 id="firebugs_greasemonkies_and_mr_dom">Firebugs, Greasemonkies, and Mr. DOM</h3>
<p>Lately I&#8217;ve found myself spending too much time copying and pasting fields in footprints.  So the other day I took a quick spin through the ticket editing interface with my trusty <a href="http://getfirebug.com/" title="Firebug - Web Development Evolved">Firebug</a>. Minutes later I was able to replicate the functionality needed to fix the problem, using Javascript and the supplied DOM elements.</p>
<p>The next logical step was to encapsulate this into something that can be used outside of the development interface, and triggered automatically. </p>
<p>Enter the Greasemonkey. <a href="http://en.wikipedia.org/wiki/Greasemonkey" title="Greasemonkey - Wikipedia, the free encyclopedia">Greasemonkey</a> is an extension for Mozilla Firefox that allows you to run custom scripts on pages that you are visiting. Think of Greasemonkey as a little mechanic that lives in your browser. It has a bunch of tools that it uses to alter or fix pages that you visit.  These tools are known as <a href="http://userscripts.org/" title="The Greasemonkey Repository &ndash; Userscripts.org">Userscripts</a>.</p>
<p>Turns out it&#8217;s pretty easy to write these Userscripts.  Based on my spelunking in the DOM cave with Firebug, I <a href="http://github.com/jhenry/footprints-fill-contact/" title="jhenry's footprints-fill-contact at master &mdash; GitHub">slapped together a Userscript</a> to fix my address book problem upon opening the ticket.  Now when I load up the ticket editing interface, the contact information is automatically filled out &#8212; even if the ticket was created with an inconveniently formatted email address.</p>
<h3 id="lazyweb_to_the_rescue">Lazyweb to the rescue</h3>
<p>I was in a hurry, and didn&#8217;t feel like digging through my old code or writing new stuff to handle some of the grunt work that this tool needed.  I borrowed a handy <a href="http://www.bennadel.com/index.cfm?dax=blog:207.view" title="Ask Ben: Extracting Parts Of An Email Address In Javascript : Kinky Solutions : A Student's Perspective by Ben Nadel">email address parser</a> from Ben Nadel at Kinky Solutions, and a <a href="http://www.netlobo.com/url_query_string_javascript.html" title="Netlobo.com | Get URL Parameters Using Javascript">url parameter grabbing function</a> from Netlobo.</p>
<h3 id="installation_and_use">Installation and use</h3>
<ol>
<li>You&#8217;ll first need the <a href="https://addons.mozilla.org/en-US/firefox/addon/748">Greasemonkey extension for Firefox</a>.  If you need this (or Userscripts in general) in Safari, I&#8217;d recommend taking a look at <a href="http://culater.net/software/SIMBL/SIMBL.php" title="SIMBL">SIMBL</a> and <a href="http://code.google.com/p/greasekit/" title="greasekit - Google Code">Greasekit</a>.</li>
<li><a href="http://github.com/jhenry/footprints-fill-contact/tree/master/footprints-fill-contact.user.js" title="footprints-fill-contact.user.js at master from jhenry's footprints-fill-contact &mdash; GitHub">Install the Userscript</a>.  </li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://greengaloshes.cc/2008/10/fixing-numara-footprints-addressbook-search-with-a-greasemonkey-userscript/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>NetNewsWire to FriendFeed</title>
		<link>http://greengaloshes.cc/2008/05/netnewswire-to-friendfeed/</link>
		<comments>http://greengaloshes.cc/2008/05/netnewswire-to-friendfeed/#comments</comments>
		<pubDate>Sun, 18 May 2008 16:25:05 +0000</pubDate>
		<dc:creator>Justin D. Henry</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[applescript]]></category>
		<category><![CDATA[bookmarklet]]></category>
		<category><![CDATA[clippings]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[friendfeed]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[netnewswire]]></category>

		<guid isPermaLink="false">http://greengaloshes.cc/?p=117</guid>
		<description><![CDATA[After building an applescript to post items from NetNewsWire to FriendFeed, I settled on using FriendFeed&#8217;s own bookmarklet from within NetNewsWire. Here&#8217;s the how and why. I&#8217;ve been using NetNewsWire&#8217;s Clippings feature as a sort of light-weight alternative to posting links to my del.icio.us account. It makes for a one-click bookmarking experience, without having to [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://greengaloshes.cc/wp-content/uploads/2008/05/nnw-to-ff.png" alt="nnw-to-ff.png" border="0" width="272" height="131" class="right" />After building an applescript to post items from <a href="http://www.newsgator.com/NetNewsWire.aspx" title="NewsGator - NetNewsWire">NetNewsWire</a> to <a href="http://friendfeed.com/puddlestomping" title="FriendFeed">FriendFeed</a>, I settled on using FriendFeed&#8217;s own bookmarklet from within NetNewsWire.  Here&#8217;s the how and why.</p>
<p>I&#8217;ve been using NetNewsWire&#8217;s Clippings feature as a sort of light-weight alternative to posting links to <a href="http://del.icio.us/kapowee" title="kapowee's bookmarks on del.icio.us">my del.icio.us</a> account. It makes for a one-click bookmarking experience, without having to wait for the del.icio.us tagger to load. I still use del.icio.us to save links that I&#8217;ll want to reference later, or that I want to send to someone (i.e. tagging it with for:username) since I don&#8217;t generally send links via email.</p>
<p>This tagless approach to bookmarking by way of the Clippings tool works pretty well most of the time.  It generates an RSS feed, which these days is fairly easily re-mixable, and thus integrates into things like <a href="http://apps.facebook.com/feedheads/" title="Incompatible Browser | Facebook">Feedheads</a> in Facebook, and other places.  Yet it is missing features, like being able to add a brief blurb, or allow others to comment.  </p>
<p>Enter <a href="http://friendfeed.com/" title="FriendFeed">FriendFeed</a>, which does have these features. However it doesn&#8217;t quite allow for the auto import of NetNewsWire&#8217;s clippings feed. It does import Google Reader&#8217;s shared items, but it sounds like a <a href="http://forum.newsgator.com/Topic27420-51-1.aspx" title="Sync from Google Reader">NNW to Google Reader sync is a long way off</a>, at the least (though there does appear to be some <a href="http://mcdevzone.com/2008/01/09/sharing-between-netnewswire-and-google-reader/" title="/dev/random &rsaquo; Sharing between NetNewsWire and Google Reader">workarounds</a>).  Hopefully the folks at FriendFeed will add NewsGator as a service soon, but for now NetNewsWire is pretty easy to script, and FriendFeed&#8217;s API can be used with a <a href="http://code.google.com/p/friendfeed-api/wiki/ApiDocumentation#Create_New_Entries" title="ApiDocumentation - friendfeed-api - Google Code">one line curl command</a>.  With that in mind, I started by adapting the existing &#8220;blogselection&#8221; script to post the current headline to FriendFeed.  </p>

<div class="wp_syntax"><div class="code"><pre class="applescript" style="font-family:monospace;"><span style="color: #ff0033; font-weight: bold;">set</span> theFriendFeedUser <span style="color: #ff0033; font-weight: bold;">to</span> <span style="color: #009900;">&quot;YOURUSERNAME&quot;</span>
<span style="color: #ff0033; font-weight: bold;">set</span> theFriendFeedSecretKey <span style="color: #ff0033; font-weight: bold;">to</span> <span style="color: #009900;">&quot;YOURSECRETKEY&quot;</span> <span style="color: #808080; font-style: italic;">-- get it at https://friendfeed.com/account/api</span>
<span style="color: #ff0033; font-weight: bold;">tell</span> <span style="color: #0066ff;">application</span> <span style="color: #009900;">&quot;NetNewsWire&quot;</span>
  <span style="color: #ff0033; font-weight: bold;">set</span> theArticle <span style="color: #ff0033; font-weight: bold;">to</span> <span style="color: #ff0033;">the</span> selectedHeadline
  <span style="color: #ff0033; font-weight: bold;">if</span> theArticle <span style="color: #ff0033; font-weight: bold;">is</span> <span style="color: #ff0033;">not</span> <span style="color: #0066ff;">false</span> <span style="color: #ff0033; font-weight: bold;">then</span>
    <span style="color: #ff0033; font-weight: bold;">set</span> theText <span style="color: #ff0033; font-weight: bold;">to</span> <span style="color: #ff0033;">the</span> description <span style="color: #ff0033; font-weight: bold;">of</span> <span style="color: #ff0033;">the</span> theArticle
    <span style="color: #ff0033; font-weight: bold;">set</span> theLink <span style="color: #ff0033; font-weight: bold;">to</span> <span style="color: #ff0033;">the</span> URL <span style="color: #ff0033; font-weight: bold;">of</span> theArticle
    <span style="color: #ff0033; font-weight: bold;">set</span> theTitle <span style="color: #ff0033; font-weight: bold;">to</span> <span style="color: #ff0033;">the</span> title <span style="color: #ff0033; font-weight: bold;">of</span> theArticle
    <span style="color: #ff0033; font-weight: bold;">set</span> theBlog <span style="color: #ff0033; font-weight: bold;">to</span> <span style="color: #ff0033;">the</span> givenName <span style="color: #ff0033; font-weight: bold;">of</span> <span style="color: #ff0033;">the</span> subscription <span style="color: #ff0033; font-weight: bold;">of</span> theArticle
    <span style="color: #ff0033; font-weight: bold;">set</span> theBlogLink <span style="color: #ff0033; font-weight: bold;">to</span> <span style="color: #ff0033;">the</span> home URL <span style="color: #ff0033; font-weight: bold;">of</span> <span style="color: #ff0033;">the</span> subscription <span style="color: #ff0033; font-weight: bold;">of</span> theArticle
    <span style="color: #0066ff;">do shell script</span> <span style="color: #009900;">&quot;curl -u <span style="color: #000000; font-weight: bold;">\&quot;</span>&quot;</span> <span style="color: #000000;">&amp;</span> theFriendFeedUser <span style="color: #000000;">&amp;</span> <span style="color: #009900;">&quot;:&quot;</span> <span style="color: #000000;">&amp;</span> theFriendFeedSecretKey <span style="color: #000000;">&amp;</span> <span style="color: #009900;">&quot;<span style="color: #000000; font-weight: bold;">\&quot;</span> -d <span style="color: #000000; font-weight: bold;">\&quot;</span>title=&quot;</span> <span style="color: #000000;">&amp;</span> theTitle <span style="color: #000000;">&amp;</span> <span style="color: #009900;">&quot;&amp;link=&quot;</span> <span style="color: #000000;">&amp;</span> theLink <span style="color: #000000;">&amp;</span> <span style="color: #009900;">&quot;<span style="color: #000000; font-weight: bold;">\&quot;</span> http://friendfeed.com/api/share&quot;</span>
  <span style="color: #ff0033; font-weight: bold;">end</span> <span style="color: #ff0033; font-weight: bold;">if</span>
<span style="color: #ff0033; font-weight: bold;">end</span> <span style="color: #ff0033; font-weight: bold;">tell</span></pre></div></div>

<p>Since I didn&#8217;t want to store the keys in the script, I adapted <a href="http://futuremacblog.blogspot.com/2008/03/improved-netnewswire-to-delicious.html" title="FutureMac: Improved NetNewsWire to del.icio.us AppleScript">Andrew Faden and Larry Staton&#8217;s del.icio.us applescript</a> to allow local storage of the user and api key.</p>
<p>Applescript is still kind of awkward, and to be able to allow the entry of a block of text was looking like more trouble than it would have been worth.  I also couldn&#8217;t seem to find a solid set of documentation on NetNewsWire&#8217;s applescript hooks (perhaps my Google Fu failed me here &#8211; am I <a href="http://www.google.com/search?q=netnewswire+applescript+hooks" title="netnewswire applescript hooks - Google Search">missing something</a>, or is this just not well documented?).  </p>
<p>After using the script for a bit, and feeling lukewarm about it, I realized that you can <a href="http://www.nordaaker.com/blog/2008/04/netnewswire-adds-bookmarklet-s.html" title="NetNewsWire adds bookmarklet support - Nordaaker">call a bookmarklet as a script in NetNewsWire</a>.  Could it be that easy?  Turns out it is.  All you need to do is copy the bookmarklet&#8217;s javascript (which can be done via a right click and a copy link location) into a .js file and paste it into a file to be saved in NetNewsWire&#8217;s scripts directory.  </p>
<p>Now you have access to the Friendfeed bookmarklet and all it&#8217;s bells and whistles, which include being able to include images by clicking on them.  Who needs a <a href="http://ffffound.com/" title="FFFFOUND!">FFFFOUND!</a> invite, when you have FriendFeed?  </p>
<p>If you&#8217;re interested in the applescript, you can <a href="http://github.com/jhenry/netnewswire-friendfeed/" title="jhenry's netnewswire-friendfeed at master &mdash; GitHub">download or clone it</a> from github. </p>
]]></content:encoded>
			<wfw:commentRss>http://greengaloshes.cc/2008/05/netnewswire-to-friendfeed/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Recruiting web professionals</title>
		<link>http://greengaloshes.cc/2007/09/recruiting-web-professionals/</link>
		<comments>http://greengaloshes.cc/2007/09/recruiting-web-professionals/#comments</comments>
		<pubDate>Sat, 15 Sep 2007 21:55:25 +0000</pubDate>
		<dc:creator>Justin D. Henry</dc:creator>
				<category><![CDATA[projects]]></category>
		<category><![CDATA[uvm]]></category>
		<category><![CDATA[careers]]></category>
		<category><![CDATA[headhunting]]></category>
		<category><![CDATA[hiring]]></category>
		<category><![CDATA[interviewing]]></category>
		<category><![CDATA[jobs]]></category>
		<category><![CDATA[jobsearch]]></category>
		<category><![CDATA[multimedia]]></category>
		<category><![CDATA[networking]]></category>
		<category><![CDATA[recruitment]]></category>

		<guid isPermaLink="false">http://greengaloshes.cc/2007/09/recruiting-web-professionals/</guid>
		<description><![CDATA[A new position went up last week on the UVM Jobs recruitment site: Multimedia Development Specialist To assist faculty and staff to produce and manage digital multimedia content for instructional applications. Provide coordination of a Mac/PC multimedia computer lab and develop and facilitate workshops for faculty on digital multimedia. Provide general faculty and student support [...]]]></description>
			<content:encoded><![CDATA[<p>A new position went up last week on the UVM Jobs recruitment site:</p>
<blockquote><p>
	<strong>Multimedia Development Specialist</strong><br />
<br/>To assist faculty and staff to produce and manage digital multimedia content for instructional applications. Provide coordination of a Mac/PC multimedia computer lab and develop and facilitate workshops for faculty on digital multimedia. Provide general faculty and student support in the Center for Multimedia Development facility.
</p></blockquote>
<p>You can find more information on this position at the <a href="https://www.uvmjobs.com/">UVM Jobs</a> site (search for requisition #032064).</p>
<p>Since I&#8217;m on the search committee, here are some thoughts and resources related to recruiting web professionals.</p>
<p><span id="more-69"></span></p>
<p>I&#8217;m taking some liberties here, including the assumption that a &#8220;Multimedia Development Specialist&#8221; position shares enough of the characteristics of a web professional (i.e. <a href="http://www.zeldman.com/2007/07/02/let-there-be-web-divisions/" title="Jeffrey Zeldman Presents  : Let there be web divisions">demographics</a>) that we can use the terms interchangeably. </p>
<h3>Diversifying the pool</h3>
<p>Kicking off a search at UVM requires approval from the Office of Affirmative Action and Equal Opportunity (AAEO).  As part of that approval process, the search committee meets with AAEO to go over search strategies.  A lot of this focuses on finding ways to get the word out to a &#8220;diverse population of viable candidates&#8221;, with the larger goal of building a more diverse workforce.  </p>
<p>Building a diverse workforce is a hard thing to do. Heck, it&#8217;s even hard to talk about.  Recruiting in a field that is not known for it&#8217;s diversity doesn&#8217;t make the job any easier.  Let&#8217;s put aside for a moment geographical location.  I mentioned we&#8217;re in <a href="http://quickfacts.census.gov/qfd/states/50000.html" title="Vermont QuickFacts from the US Census Bureau">Vermont</a>, right? Our AAEO contact sure did.  Yet there has <a href="http://www.kottke.org/07/02/gender-diversity-at-web-conferences" title="Gender diversity at web conferences (kottke.org)">recently</a> been more talk, and even <a href="http://www.zeldman.com/2007/04/19/women-in-web-design/" title="Jeffrey Zeldman Presents  : Women in web design: just the stats">some action</a> taken to understand the lack of diversity in the ever growing world of web professionals.  The results of <a href="http://www.alistapart.com/articles/webdesignsurvey" title="A List Apart: Articles: The Web Design Survey, 2007">The Web Design Survey</a> are forthcoming, and will hopefully help shed some more light on the situation.  </p>
<p>It&#8217;s also important to keep in mind that the idea of diversity also includes career and professional background. A team with diverse professional backgrounds, experience, and skills will be stronger and more versatile.  Members backgrounds should complement each other.  Ask yourself what the applicant with ten years programming experience brings to the table, versus the applicant who has only five years programming, and five in marketing or design.       </p>
<h3>Networking goes both ways</h3>
<p>Networking is just as powerful from the recruitment side as it is for the job hunter. It&#8217;s not just who you know, but who that person knows.  One of the things our AAEO contact suggested was that former colleagues can be excellent sources of &#8220;word of mouth&#8221; advertising for your position.</p>
<p>When asked who we knew in terms of professional contacts, I kind of drew a blank &#8211; only a few came to mind.  It wasn&#8217;t until I got back to my desk that all the names started rolling in. Colleagues I had worked with (even peripheraly) at my current employer, colleagues from past positions and organizations, contacts from users groups, all floated to the surface.  Pretty soon it got kind of overwhelming &#8211; especially when you consider that we have to keep a record of all the people and places we&#8217;re sending postings to.  </p>
<p>So how does one keep track of all this stuff? <a href="http://www.highrisehq.com" title="Simple CRM, contact manager, address book, and tasks">Highrise</a> looks like a perfect recruitment management tool.  It would seem to provide the ability to keep track of applicants and interviewees, as well as contacts the description has been sent to, and where it&#8217;s been posted.  I haven&#8217;t seen any specific examples of the tool being used for this purpose, but perhaps I&#8217;m not looking hard enough?</p>
<p>Speaking of networking, don&#8217;t forget your <a href="http://ctl.blog.uvm.edu/2007/09/were_hiring.html" title="Center for Teaching &amp; Learning">blog</a> (personal or organizational).  Someone in your readership base may know a possible candidate, or be one themselves.  Better yet, if they are reading it, chances are they already have some knowledge of your organization or be in a similar industry.    </p>
<h3>Targeted classifieds</h3>
<p>One of the best ways to recruit a diverse workforce is to look in a diverse number of places.  Luckily, the job board market has seen some wonderful growth in the past few years.  No longer are we restricted to a few sites like <a href="http://monster.com" title="Monster Jobs - Get work. Network. Build a better career. Today's the day.">monster.com</a> and the <a href="http://www.7dspot.com/" title="7dSpot">classifieds section</a> of the local paper.  What&#8217;s more, many of these are targeted at the type of professionals you&#8217;re looking for.  </p>
<p>* <a href="http://authenticjobs.com/" title="Authentic Jobs ~ Full-time and freelance job opportunities for designers and developers">Authentic Jobs</a> &#8211;  Our AAEO contact kept telling us to talk up UVM&#8217;s benefits.  This site <a href="http://cameronmoll.com/archives/2007/09/recent_job_listings_job_perks_feature/" title="Recent job listings + Job Perks feature ~ Authentic Boredom">just unveiled</a> a &#8220;perks&#8221; section of the job posting.  Nice touch!<br />
* The <a href="http://jobs.37signals.com/" title="Tech Jobs: Design, Programming, Rails, Executive, and more.">37signals Job Board</a> &#8211; You may know them from such <del>feature films</del> applications as <a href="http://www.basecamphq.com/" title="Project collaboration, management, and task software: Basecamp">Basecamp</a> and <a href="http://www.highrisehq.com/" title="Simple CRM, contact manager, address book, and tasks">Highrise</a> (I mentioned the latter above).<br />
* <a href="http://www.aigadesignjobs.org/public/default.asp" title="AIGA Design Jobs">AIGA Design Jobs</a><br />
* <a href="http://jobs.joelonsoftware.com/" title="jobs.joelonsoftware.com">jobs.joelonsoftware.com</a><br />
* <a href="http://www.krop.com/" title="Krop - Creative &amp; Tech Jobs">Krop</a> &#8211; &#8220;Creative &#038; tech jobs&#8221;<br />
* <a href="http://www.mediabistro.com/joblistings/" title="mediabistro.com: Jobs">mediabistro.com Job Listings</a><br />
* <a href="http://dice.com/" title="Dice.com - Job search for Technology Professionals">Dice</a> &#8211; &#8220;The Career Hub for Tech Insiders&#8221;<br />
* I.D. Magazine&#8217;s <a href="http://idmag.coroflot.com/public/jobs_browse.asp" title="IDOnline.com - The International Design Magazine - Graphic Design, Product Design, Architecture">Job board</a><br />
* <a href="http://www.creativeheads.net/" title="Video Game Jobs, Animation Jobs, VFX Jobs, TV &#038; Film Jobs, Software Jobs - CreativeHeads.net">Creativeheads.net</a> &#8211; &#8220;Jobs for the Right Brains&#8221;<br />
* &#8230; and there are even <a href="http://www.creativecircle.com/" title="Creative Circle - Creativity Starts Here">staffing agencies</a> out there, if you&#8217;re into that sort of thing. </p>
<p>A lot of these I found just by going through my feed list, visiting some of the sites that I read every day, and actually clicking on the ads.</p>
<h3>Getting it right</h3>
<p>Of course it&#8217;s not just where you look.  There has been some <a href="http://www.37signals.com/svn/posts/586-writing-better-help-wanted-ads" title="Writing better help wanted ads - (37signals)">great discussion</a> lately regarding <a href="http://blog.guykawasaki.com/2007/08/how-to-not-hire.html" title="How to Change the World: How to Not Hire Someone Via Craigslist">successful recruitment</a>.  </p>
<p>It is, in any case, a demanding process, and not one to be taken lightly.  Textmate creator <a href="http://macromates.com/wiki/Profiles/AllanOdgaard" title="Profiles / AllanOdgaard  — TextMate Wiki">Allan Odgaard</a>, when talking about the prospects of hiring a development team, <a href="http://www.randsinrepose.com/archives/2007/01/26/interview_allan_odgaard.html" title="Rands In Repose: Interview: Allan Odgaard">once said</a>:   </p>
<blockquote><p>&#8220;Hiring good programmers can be difficult, and hiring a bad programmer can turn out to be worse than not hire anyone at all, but you will rarely know in advance.&#8221;</p></blockquote>
<p>That stuck with me at the time, and is a sobering reminder of how much work this is going to be.  Good luck with your recruiting (or your searching, if that&#8217;s the case).</p>
]]></content:encoded>
			<wfw:commentRss>http://greengaloshes.cc/2007/09/recruiting-web-professionals/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Directory Digger</title>
		<link>http://greengaloshes.cc/2007/06/directory-digger/</link>
		<comments>http://greengaloshes.cc/2007/06/directory-digger/#comments</comments>
		<pubDate>Thu, 14 Jun 2007 06:14:36 +0000</pubDate>
		<dc:creator>Justin D. Henry</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[reference]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[application]]></category>
		<category><![CDATA[dashboard]]></category>
		<category><![CDATA[digger]]></category>
		<category><![CDATA[directory]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[ldap]]></category>
		<category><![CDATA[osx]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[widget]]></category>

		<guid isPermaLink="false">http://greengaloshes.cc/2007/06/directory-digger/</guid>
		<description><![CDATA[Update (2007-06-27): Directory Digger is a featured download on Apple.com&#8216;s main dashboard widget site. Cool! (thanks Rob, for the tip) In my spare time (heh), I&#8217;ve built an Apple dashboard widget that lets one search an LDAP directory. For me, the tool is filling a number of needs. The project page summarizes some of them: [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Update (2007-06-27)</strong>: Directory Digger is a featured download on <a href="http://www.apple.com/downloads/dashboard/">Apple.com</a>&#8216;s main dashboard widget site.  Cool! (thanks <a href="http://robmaurizi.com">Rob</a>, for the tip)</p>
<p><a href="http://greengaloshes.cc/projects/directorydigger/"><img src='http://greengaloshes.cc/wp-content/uploads/2007/06/icon.png' alt='Directory Digger Icon' align='right' /></a>In my spare time (heh), I&#8217;ve built an Apple dashboard widget that lets one search an LDAP directory.  For me, the tool is filling a number of needs.  The <a href="http://greengaloshes.cc/projects/directorydigger/">project page</a> summarizes some of them:</p>
<blockquote><p>This application is intended to simplify the search interface that is found at the directory pages of many organizations. It also aims to provide access to that information in a handy place. It leverages OS X’s local ldapsearch tools to search remote LDAP directories, as opposed to relying on an external server to provide the lookup functionality and return results.</p></blockquote>
<p>You can read more, and download it on the <a href="http://greengaloshes.cc/projects/directorydigger/">DirectoryDigger project page</a>.</p>
<p>Release early, release often, right?  Well, this is one I&#8217;ve been sitting on for some time. Years, I think.  It feels good to get it up and out. </p>
]]></content:encoded>
			<wfw:commentRss>http://greengaloshes.cc/2007/06/directory-digger/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Caching and zooming your Flickr images</title>
		<link>http://greengaloshes.cc/2007/06/caching-and-zooming-your-flickr-images/</link>
		<comments>http://greengaloshes.cc/2007/06/caching-and-zooming-your-flickr-images/#comments</comments>
		<pubDate>Wed, 06 Jun 2007 18:18:58 +0000</pubDate>
		<dc:creator>Justin D. Henry</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[reference]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[flickr]]></category>
		<category><![CDATA[flickrRSS]]></category>
		<category><![CDATA[gallery]]></category>
		<category><![CDATA[images]]></category>
		<category><![CDATA[magnify]]></category>
		<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[phpFlickr]]></category>
		<category><![CDATA[zoom]]></category>
		<category><![CDATA[zoomify]]></category>

		<guid isPermaLink="false">http://greengaloshes.cc/2007/06/caching-and-zooming-your-flickr-images/</guid>
		<description><![CDATA[I&#8217;ve made a few changes and additions to Dan Coulter&#8216;s phpFlickr API class. These modifications address the retrieval of image URL&#8217;s, and allow the caching of images locally. In the process, I also created a little helper class to complement existing phpFlickr interface methods. Caching images from Flickr We wanted to be sure of speedy [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve made a few changes and additions to <a href="http://dancoulter.com/">Dan Coulter</a>&#8216;s <a href="http://phpflickr.sourceforge.net">phpFlickr API</a> class.  These modifications address the retrieval of image URL&#8217;s, and allow the caching of images locally.  In the process, I also created a little helper class to complement existing phpFlickr interface methods.</p>
<p><span id="more-48"></span></p>
<h3>Caching images from Flickr</h3>
<p>We wanted to be sure of speedy load times.  More importantly, to create Zoomified versions of the images, we would need a local version of the original image.  We needed to cache our search results and images, and not leave them on Flickr.</p>
<h3>Repurposing flickrRSS</h3>
<p>The first tool I tried was a slightly modified version of the <a href="http://eightface.com/wordpress/flickrrss/">flickrRSS WordPress plugin</a>.  This had the benefit of having caching built in, however there were drawbacks to this approach.  It was returning a page of results at a time, so there was only a limited number of images that could be displayed at once.  Furthermore, when it came time to Zoomify the images, this method was likely to prove less than reliable for retrieving the original size image.  Overall, this was a quick and easy way to get started, but it quickly became unwieldy for more complex tasks.</p>
<h3>Adjusting phpFlickr</h3>
<p>The other option was phpFlickr.  The only thing phpFlickr seemed to be lacking was the ability to download and store images locally.  Luckily, I had just been playing with a tool that did.  All I had to do was copy and tweak the appropriate code from flickrRSS into a new function, which I called <code>cacheImage()</code>.</p>
<p>A nice feature of the phpFlickr class was that it already had a few functions that provided &#8220;front ends&#8221; to help you integrate the class into whatever application you were building.  One of these was <code>buildPhotoURL()</code>.  With the above cacheImage() function in place, I could now do something like this to display almost any sized gallery:</p>
<p><code>
<pre>
	// loop through search results
	foreach ($search_results['photo'] as $photo) : 

		$photo_id = $photo['id'];
		$url = $this->f->buildPhotoURL($photo, "Small");
		$cached_image = "cache/" . $this->f->cacheImage($url, $refresh_image_cache);

		// display image markup in addition to zoom and Flickr links
		... 
</pre>
<p></code></p>
<p>I started to run into issues, however, when I wanted to access the large or original sized images.  When trying to get the large image where no large image existed, such as for smaller images, there appeared to be no result returned.  The solution to this was to write a function, <code>checkIfSizeExists()</code>, that used <code>photos_getSizes</code> to check if a requested size exists. Now, in <code>buildPhotoURL()</code> I can do this to make it downgrade to medium where no large exists:</p>
<p><code>
<pre>
	if($size == "large") {
		if ($this->checkIfSizeExists($photo['id'], "Large") == false) {
			$size = "medium";
		}
	}
</pre>
<p></code></p>
<p>I needed to write a similar function to get the original image.  I replaced the URL hacking that was trying to get the original url with a call to this function:</p>
<p><code>
<pre>
if ($size == "original") {
    $url = $this->getOriginalUrl($photo['id']);
	...
</pre>
<p></code></p>
<p>And that was about all it took to get phpFlickr where I needed it.  Now I just needed to set up the front end tools to put it to good use.</p>
<h3>Putting it all together</h3>
<p>You&#8217;ve seen a brief glimpse above of how my helper class, which I&#8217;ve dubbed flickrGallery, works.  In short, the display pages interact with flickrGallery, and it interacts with phpFlickr. For more on how it works, check it out in the downloads section below.  Here&#8217;s how I implemented it on various display pages.</p>
<p>On a gallery display page, you can do something like this:</p>
<p><code>
<pre>
	$tags = "kitten,lol"; // comma separated list of tags
	$result_size = 50; // number of results to display

	// go go gadget gallery!
	require_once("flickrGallery.php");
	$gallery = new flickrGallery();
	$gallery->display_gallery($tags, $result_size);
</pre>
<p></code></p>
<p>On a zoom, or single image page, it&#8217;s a little more complicated, but not too much different.</p>
<p><code>
<pre>
	$photo_id = $_GET['photo_id'];

	require_once("flickrGallery.php");
	$gallery = new flickrGallery();
	$photo = $gallery->f->photos_getInfo($photo_id);
	$url = $gallery->f->buildPhotoURL($photo, "Original");
	$filename = explode(".", basename($url));
	$base = $filename[0] . "_zdata";

	//check to make sure there is a zoomify obect
	if(is_dir($gallery->zoomify_path . $base)) :

	//now display flash embed code using vars from above
	...
</pre>
<p></code></p>
<p>Finally, as noted above, if you are using Zoomify you&#8217;ll probably want to build a simple admin interface that will allow you to download and convert the originals as a batch.  Most of this is already done for you, so you can just set up something like this on a protected page:</p>
<p><code>
<pre>
	$tags = "kittens"; // comma separated list of tags
	$result_size = 50; // number of records to process

	if($_POST["action"] == "process") {
		$gallery = new flickrGallery();
		$gallery->zoomify_collection($tags, $result_size);
	}
</pre>
<p></code></p>
<p>On that page, you can just have a simple form that submits to itself to trigger the above. </p>
<h3>Download</h3>
<p>All files referenced above are available separately for download.  The core files that I used are:</p>
<ul>
<li>My <a href="http://www.uvm.edu/~jhenry/download/flickr-gallery/phpFlickr.phps">modified version</a> of Dan Coulter&#8217;s phpFlickr class</li>
<li><a href="http://www.uvm.edu/~jhenry/download/flickr-gallery/flickrGallery.phps">flickrGallery</a>, the helper class I used to interface with phpFlickr</li>
<li>If you are Zoomifying, you&#8217;ll also need the <a href="http://greengaloshes.cc/2007/05/zoomifyimage-ported-to-php/">files referenced in my previous article</a></li>
</ul>
<p>Here are some example display files:</p>
<ul>
<li>An example <a href="http://www.uvm.edu/~jhenry/download/flickr-gallery/gallery_example.phps">gallery page</a></li>
<li>A <a href="http://www.uvm.edu/~jhenry/download/flickr-gallery/zoom_example.phps">sample zoom page</a></li>
<li>Admin<a href="http://www.uvm.edu/~jhenry/download/flickr-gallery/admin_example.phps">form for making zoom-able files</a></li>
</ul>
<h3>Notes</h3>
<p>Use a database cache where possible.  I saw some weird occurrences of pages loading only half way until I switched from using a file system based data cache.  I&#8217;m not sure if this has to do with the PEAR libraries, my system, or my implementation.  Your mileage may vary.</p>
<p>As noted in a <a href="http://greengaloshes.cc/2007/05/zoomifyimage-ported-to-php/">previous article</a> regarding Zoomify, you may have to take special steps if you are running under safe mode.  Furthermore, as discussed above, due to the processing time needed to convert the images to the Zoomify format you may want to set up a mechanism to download and process the images in batches.  This mechanism should probably be protected.</p>
]]></content:encoded>
			<wfw:commentRss>http://greengaloshes.cc/2007/06/caching-and-zooming-your-flickr-images/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ZoomifyImage ported to PHP</title>
		<link>http://greengaloshes.cc/2007/05/zoomifyimage-ported-to-php/</link>
		<comments>http://greengaloshes.cc/2007/05/zoomifyimage-ported-to-php/#comments</comments>
		<pubDate>Fri, 25 May 2007 21:39:41 +0000</pubDate>
		<dc:creator>Justin D. Henry</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[reference]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[gd]]></category>
		<category><![CDATA[image]]></category>
		<category><![CDATA[images]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[safemode]]></category>
		<category><![CDATA[zoom]]></category>
		<category><![CDATA[zoomify]]></category>
		<category><![CDATA[zoomifyimage]]></category>

		<guid isPermaLink="false">http://greengaloshes.cc/2007/05/zoomifyimage-ported-to-php/</guid>
		<description><![CDATA[Wes Wright has ported Adam Smith&#8216;s ZoomifyImage processor from Python to PHP. This is a tool that lets you convert images to a format that can be viewed using the flash based Zoomify viewer. Wes gave me the go-ahead to write a bit about his work on this and put it up for download. Additionally, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://waw.blog.uvm.edu/">Wes Wright</a> has ported <a href="http://www.stonemind.net/blog/">Adam Smith</a>&#8216;s <a href="http://sourceforge.net/projects/zoomifyimage/">ZoomifyImage</a> processor from Python to PHP.  This is a tool that lets you convert images to a format that can be viewed using the flash based <a href="http://www.zoomify.com/">Zoomify</a> viewer. </p>
<p>Wes gave me the go-ahead to write a bit about his work on this and put it up for download.  Additionally, I&#8217;ve modified the scripts I had originally written that used the python tools so they work with Wes&#8217;s ZoomifyFileProcessor class.</p>
<p><span id="more-44"></span></p>
<h3>Batch converting images to the zoomify format</h3>
<p>Besides consolidating a few files, the code and functionality of my old &#8220;wrapper&#8221; scripts<br />
hasn&#8217;t changed from when they employed the python tools to do the heavy lifting.  The big difference is that we no longer have to rely on system calls and command line execution.  So, provided you are running a relatively up to date version of PHP (compiled with GD), no more libraries to install, or packages to upgrade.  </p>
<p>What this means for us is that we can finally do web based image processing.  Using Wes&#8217;s port and a few additional utility functions, we can set up an interface that will let us convert a directory of images into a format that can be loaded into the flash based Zoomify image viewer.</p>
<h3>Safe mode, and GD image size limits</h3>
<p>If you are running under safe mode, note that you&#8217;ll have to be authenticated (i.e. with HTTP Auth) as the owner of the directory that ZoomifyFileProcessor is writing to.  If you are using groups, you may also need to jump through some more hoops.</p>
<p>I <strong>think</strong> I&#8217;ve run into a few issues on <em>some</em> systems processing images using the GD Library.  It appears that GD sometimes has problems with images over a certain dimensional size (as opposed to file size).  I haven&#8217;t been able to confirm this, or test it extensively, so it&#8217;s just a hunch.  Your mileage may vary.</p>
<h3>Download</h3>
<p>The relevant files are listed below:</p>
<ul>
<li>Wes Wright&#8217;s <a href="http://www.uvm.edu/~jhenry/download/zoomify-image-php/ZoomifyFileProcessor.phps">ZoomifyFileProcessor</a></li>
<li>A <a href="http://www.uvm.edu/~jhenry/download/zoomify-image-php/zoomifyhelper.phps">batch conversion</a> utility class, and some <a href="http://www.uvm.edu/~jhenry/download/zoomify-image-php/example.phps">example interface</a> components</li>
<li>The <a href="http://www.uvm.edu/~jhenry/download/zoomify-image-php/zoomify-image-php.tar.gz">ZoomifyFileProcessor</a> and batch scripts bundled together</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://greengaloshes.cc/2007/05/zoomifyimage-ported-to-php/feed/</wfw:commentRss>
		<slash:comments>32</slash:comments>
		</item>
		<item>
		<title>Upcoming.org API wrapper for PHP4</title>
		<link>http://greengaloshes.cc/2007/04/upcomingorg-api-wrapper-for-php4/</link>
		<comments>http://greengaloshes.cc/2007/04/upcomingorg-api-wrapper-for-php4/#comments</comments>
		<pubDate>Thu, 19 Apr 2007 03:33:10 +0000</pubDate>
		<dc:creator>Justin D. Henry</dc:creator>
				<category><![CDATA[projects]]></category>
		<category><![CDATA[reference]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[calendar]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[download]]></category>
		<category><![CDATA[events]]></category>
		<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php4]]></category>
		<category><![CDATA[php5]]></category>
		<category><![CDATA[upcoming]]></category>
		<category><![CDATA[wrapper]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://greengaloshes.cc/2007/04/upcomingorg-api-wrapper-for-php4/</guid>
		<description><![CDATA[Sounds like Upcoming.org is set for some upgrades (does version 2.0 of a Web 2.0 application == 4.0? :) ) next week. Aside from a yahoo account merge, they are keeping things pretty close to the vest. Maybe the documentation wiki will be reincarnated. The suggestion board is nice, but doesn&#8217;t have the same information. [...]]]></description>
			<content:encoded><![CDATA[<p>Sounds like <a href="http://www.upcoming.org/">Upcoming.org</a> is <a href="http://www.upcoming.org/news/archives/2007/04/13/six_days/">set for some upgrades</a> (does version 2.0 of a Web 2.0 application == 4.0? :) ) next week.  Aside from a yahoo account merge, they are keeping things pretty close to the vest.  Maybe the <a href="http://www.upcoming.org/help/w/Language-specific_Libraries">documentation wiki</a> will be reincarnated.  The <a href="http://suggestions.yahoo.com/?prop=upcoming">suggestion board</a> is nice, but doesn&#8217;t have the same information.</p>
<p>A little while ago, I made a few changes to their <a href="http://www.upcoming.org/news/archives/2006/09/28/nerdy_ap/">original PHP 5 API wrapper</a>, so that it works with PHP 4.  By the way, I can&#8217;t seem to find the original wrapper mentioned in that post &#8211; maybe it got lost when the wiki went away?  I&#8217;ve kept what I believe is the original example file that was bundled with the wrapper.  You can download it all here:</p>
<ul>
<li><a href="http://www.uvm.edu/~jhenry/download/Upcoming_php4_API.zip">Upcoming.org API Wrapper for PHP 4</a></li>
</ul>
<p>All I did was replace the use of the <a href="http://www.php.net/simplexml">SimpleXML</a> extension in PHP5 with the <a href="http://pear.php.net/package/XML_Serializer">PEAR XML_Serializer</a> package.  In other words, switching out calls to the simple_xml functions with <code>$unserializer->unserialize()</code>.</p>
<p>A number of the PEAR packages on our system were either missing or not the right version.  Here are the PEAR dependencies I ended up having to &#8220;install&#8221; locally. Installation in this case meant download and unpack vs. <code>$ pear install</code>, since the latter wasn&#8217;t behaving th way I needed it to.</p>
<pre>Cache_Lite/
HTTP_Request/
Net_URL/
XML_Serializer/
HTTP_Client/
Net_Socket/
XML_Parser/</pre>
<p>Oh.  Since we wanted to be sure we were doing things right, we went ahead and asked if we would need an official/corporate API key (more on this project later).  What a nice surprise it was when the <a href="http://www.upcoming.org/user/1/">founder</a> replied directly.  For me, this really gives Upcoming that small business, customer oriented feel.  For some reason I didn&#8217;t see this coming from something that is part of such a big organization like Yahoo!</p>
]]></content:encoded>
			<wfw:commentRss>http://greengaloshes.cc/2007/04/upcomingorg-api-wrapper-for-php4/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

