<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Blog: Raised Eyebrow Web Studio, Inc.</title>
	
	<link>http://blog.raisedeyebrow.com</link>
	<description>What's turning heads at Raised Eyebrow</description>
	<lastBuildDate>Thu, 15 Jul 2010 15:19:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/raisedeyebrow" /><feedburner:info uri="raisedeyebrow" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Calling all social change geeks: It’s NetSquared Camp Vancouver</title>
		<link>http://feedproxy.google.com/~r/raisedeyebrow/~3/O0E-2c93CHo/</link>
		<comments>http://blog.raisedeyebrow.com/2010/07/calling-all-social-change-geeks-its-netsquared-camp-vancouver/#comments</comments>
		<pubDate>Thu, 15 Jul 2010 15:19:02 +0000</pubDate>
		<dc:creator>Lauren Bacon</dc:creator>
				<category><![CDATA[Nonprofit Tech]]></category>
		<category><![CDATA[Raised Eyebrow]]></category>
		<category><![CDATA[Workshops & Events]]></category>

		<guid isPermaLink="false">http://blog.raisedeyebrow.com/?p=984</guid>
		<description><![CDATA[A month from now, on Saturday, August 14, I&#8217;ll be attending Vancouver&#8217;s first NetSquared Camp, a day-long event for people who work at the intersection of social change and technology. The goal of the event is to build skills and capacity through peer learning, and invites the participation of &#8220;nonprofits, activists and social entrepreneurs [along] [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.raisedeyebrow.com/wp-content/uploads/2010/07/netsquaredcamp.gif"><img class="alignleft size-medium wp-image-987" title="NetSquared Camp logo" src="http://blog.raisedeyebrow.com/wp-content/uploads/2010/07/netsquaredcamp-300x79.gif" alt="" width="300" height="79" /></a>A month from now, on Saturday, August 14, I&#8217;ll be attending <a href="http://www.netsquared.org/blog/elijah/register-netsquared-camp-vancouver">Vancouver&#8217;s first NetSquared Camp</a>, a day-long event for people who work at the intersection of social change and technology. The goal of the event is to build skills and capacity through peer learning, and invites the participation of &#8220;nonprofits, activists and social entrepreneurs [along] with  their friends and allies in the world of technology and communications.&#8221;</p>
<p>NetSquared Camp is an <a href="http://en.wikipedia.org/wiki/Unconference">unconference</a>, and for those who aren&#8217;t familiar with that term, it&#8217;s an event where the agenda is entirely driven by the participants. So if you show up and speak up, there&#8217;s a very good chance that you&#8217;ll learn something that&#8217;s relevant to you. (You may also end up teaching others, since the participants also lead &amp; facilitate the sessions.)</p>
<p>The <a href="http://www.netsquared.org/blog/elijah/register-netsquared-camp-vancouver">list of suggested session topics</a> is both wide-ranging and highly practical, and the organizers have set up <a href="http://netsquaredcampvancouver.wikispaces.com/Session+proposals">a wiki where you can propose your own session ideas</a>.</p>
<p>Perhaps best of all, the ticket price is by donation, with the suggested donation a very affordable $20. By the look of <a href="http://netsquaredvancouver.eventbrite.com/">the RSVP list</a>, interest is high, and as with all unconferences, the event&#8217;s success will depend entirely on who shows up &#8212; so please <a href="http://netsquaredvancouver.eventbrite.com/">mark the date in your calendar</a> and spread the word.</p>
<p>Here at Raised Eyebrow we&#8217;re very passionate about sharing what we know and building capacity within the nonprofit sector, so we&#8217;re very pleased to be a sponsor of NetSquared Camp Vancouver 2010. I&#8217;m looking forward to seeing how the agenda evolves.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.raisedeyebrow.com/2010/07/calling-all-social-change-geeks-its-netsquared-camp-vancouver/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.raisedeyebrow.com/2010/07/calling-all-social-change-geeks-its-netsquared-camp-vancouver/#utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=calling-all-social-change-geeks-its-netsquared-camp-vancouver</feedburner:origLink></item>
		<item>
		<title>Confessions of a Late-Blooming Gamer</title>
		<link>http://feedproxy.google.com/~r/raisedeyebrow/~3/b4CWpgN5Mlw/</link>
		<comments>http://blog.raisedeyebrow.com/2010/07/confessions-of-a-late-blooming-gamer/#comments</comments>
		<pubDate>Mon, 05 Jul 2010 15:29:33 +0000</pubDate>
		<dc:creator>Lauren Bacon</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Geekery]]></category>

		<guid isPermaLink="false">http://blog.raisedeyebrow.com/?p=978</guid>
		<description><![CDATA[What Video Games Are Teaching Me About Motivation and Behaviour
I have a terrifying confession to make: Until very recently, I didn&#8217;t play video games.
That may not be particularly appalling to many of you, but for someone in my industry, that&#8217;s pretty embarrassing. Game designers are an integral part of the interactive design community, and I&#8217;ve [...]]]></description>
			<content:encoded><![CDATA[<h3>What Video Games Are Teaching Me About Motivation and Behaviour</h3>
<p>I have a terrifying confession to make: Until very recently, I didn&#8217;t play video games.</p>
<p>That may not be particularly appalling to many of you, but for someone in my industry, that&#8217;s pretty embarrassing. Game designers are an integral part of the interactive design community, and I&#8217;ve always felt an affinity with them, despite not really knowing their territory. In fact, <a href="http://clicknothing.typepad.com/">one of my favourite blogs</a> is written by Clint Hocking, a former creative director at <a href="http://www.ubi.com">Ubisoft</a> (and high school friend of mine). But I have long been more than a little sheepish about publicly admitting to not having a clue about gaming, aside from what I&#8217;ve read on Clint&#8217;s blog.</p>
<p>That said, it&#8217;s always educational to be late on the uptake with a particular technology; as a web designer I feel like it can help me empathize with the people using my designs who might not spend even a fraction of the time I spend online. I&#8217;ve learned a few things from my experience that feel particularly relevant to the work we do with our clients.</p>
<p>First, I had valid reasons for not playing video games until now. I didn&#8217;t have access to a console; I didn&#8217;t feel like spending money on one until its value had been shown to me; I had seen a lot of games that didn&#8217;t appeal to my interests and sensibilities; and perhaps most fundamentally, I was so green that even working the controller was daunting to me &#8212; that is, the basics of navigation and control felt uncomfortable and clunky. All of these practical resistance points are also true for many website users; even now when those of us in the industry refer to ourselves as &#8220;veterans&#8221; and to the up-and-coming generation as &#8220;digital natives,&#8221; there are still huge swaths of people on the planet who simply don&#8217;t <em>need </em>to use the internet to get through their days &#8212; as my uncle Ken, a farmer &amp; logger in Northern Ontario, reminds me regularly. For those people, the only thing that&#8217;s going to make them interested in the technology is for it to become relevant to their lives.</p>
<p>It wasn&#8217;t until I discovered a game that I truly fell in love with (more on that in a moment) that I became invested enough to want to work through my painful awkwardness with the controller and my hesitations about the financial investment. (I haven&#8217;t touched on the time investment required, which is significant &#8212; this was another fear I had about games, and one that proved well-founded as I have found myself losing all track of time while immersed in the gaming experience.) But once I found a game I connected with, the obstacles fell away and my desire to interact with the game overcame all resistance. Us web designers are fond of parroting the maxim that &#8220;Content is king,&#8221; but we haven&#8217;t always been good at practicing what we preach &#8212; this has been a good reminder to me that what&#8217;s inside really is what counts. And just as all websites aren&#8217;t created with equal amounts of attention to content, neither are all video games.</p>
<p><img class="alignleft size-medium wp-image-979" title="Assassin's Creed II capture" src="http://blog.raisedeyebrow.com/wp-content/uploads/2010/07/assassins-creed2-431-300x208.jpg" alt="" width="300" height="208" />The game that stole my heart is <a href="http://en.wikipedia.org/wiki/Assassin%27s_Creed_II">Assassin&#8217;s Creed II</a>, an action-adventure game set in Renaissance Italy. Your character is a young assassin from a noble family who is avenging a betrayal of his family &#8212; but it&#8217;s actually far more complicated than that. You&#8217;re <em>actually</em> a modern-day guy who&#8217;s been projected back into the body of this 15th-century assassin, and you&#8217;re trying to solve a mystery involving the <a href="http://en.wikipedia.org/wiki/Knights_Templar">Knights Templar</a> that traverses centuries. In the process, you travel through the gorgeously-rendered streets of Florence, Venice, and points in between, running over rooftops, climbing church towers, dodging guards, exploring secret tombs, hiding in crowds, stealing treasure, and oh yes &#8212; hanging out with Leonardo da Vinci. There are puzzles to solve, swordfights, thieving missions, and even some economic development to manage in a small town where your uncle&#8217;s villa is located.</p>
<p>The premise itself appeals to me more than some other games, but the real genius of Assassin&#8217;s Creed II lies in its execution. Game designers clearly put an enormous amount of thought into human motivation, and there&#8217;s something in this game for just about anyone. The rewards that you earn over the course of the game are a mix of financial (good old-fashioned cash), status (your armour and weapons get progressively better &#8212; and pricier &#8212; as you progress), relational (you meet new characters &amp; gain access to allies) and intellectual (solving puzzles). It&#8217;s been interesting to observe my responses to the various types of rewards and see how they correspond with my real-life predilections. I think the real hook for me has been the mystery-solving part, because it lends an over-arching mission and urgency to the game that I have only ever felt when reading a complex and layered page-turner of a novel.</p>
<p>I honestly never imagined that a video game could make me feel so immersed, and provide such a strong emotional connection. Now that I&#8217;ve had this experience I&#8217;m far more likely to explore the rest of the gaming world and see what else is out there. But it&#8217;s also got me thinking about the factors that shift behaviour and that motivate us &#8212; which makes me further resolved to focus my summer reading on those topics. I&#8217;ve picked up <a href="http://heathbrothers.com/switch/"><em>Switch</em></a> and <a href="http://heathbrothers.com/madetostick"><em>Made to Stick</em></a> (both by Chip &amp; Dan Heath) but I welcome other suggestions.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.raisedeyebrow.com/2010/07/confessions-of-a-late-blooming-gamer/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.raisedeyebrow.com/2010/07/confessions-of-a-late-blooming-gamer/#utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=confessions-of-a-late-blooming-gamer</feedburner:origLink></item>
		<item>
		<title>What Your Nonprofit Can Learn From Covenant House Vancouver’s Award-Winning Blog</title>
		<link>http://feedproxy.google.com/~r/raisedeyebrow/~3/_1j1_v13Lnw/</link>
		<comments>http://blog.raisedeyebrow.com/2010/06/what-your-nonprofit-can-learn-from-covenant-house-vancouvers-award-winning-blog/#comments</comments>
		<pubDate>Fri, 25 Jun 2010 22:27:39 +0000</pubDate>
		<dc:creator>Anna</dc:creator>
				<category><![CDATA[Online Strategy]]></category>
		<category><![CDATA[The Social Web]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[Covenant House Vancouver]]></category>
		<category><![CDATA[The Canadian Public Relations Society]]></category>

		<guid isPermaLink="false">http://blog.raisedeyebrow.com/?p=965</guid>
		<description><![CDATA[This month, our clients at Covenant House Vancouver were recognized for their exceptional blog, On the House, receiving an award from The Canadian Public Relations Society (CPRS). Covenant House shelters and counsels street youth, and over the past 10 years they&#8217;ve helped 10,000 young people with shelter, food, clothing, counseling and other support. Their blog [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.covenanthousebc.org/blog"><img class="alignright size-full wp-image-975" title="on-the-house" src="http://blog.raisedeyebrow.com/wp-content/uploads/2010/06/on-the-house.png" alt="" width="240" height="51" /></a>This month, our clients at <a title="Covenant House Vancouver" href="http://www.covenanthousebc.org/" target="_blank">Covenant House Vancouver</a> were recognized for their exceptional blog, <em><a title="On the House" href="http://www.covenanthousebc.org/blog" target="_blank">On the House</a></em>, receiving an award from <a title="The Canadian Public Relations Society" href="http://www.cprs.ca/news/" target="_blank">The Canadian Public Relations Society (CPRS)</a>. Covenant House shelters and counsels street youth, and over the past 10 years they&#8217;ve helped 10,000 young people with shelter, food, clothing, counseling and other support. Their blog launched on August 24th, 2009, and since then they&#8217;ve contributed over 150 posts. The blog is innovative as content is often contributed by the kids that come through Covenant House, telling of their journeys, their achievements, and even showcasing their art.</p>
<p>The CPRS award is a well-deserved honour. Covenant House&#8217;s blog is a great model for nonprofits who are looking to create more compelling blog content. Here are a few of the secrets of their success, as we see them:</p>
<ol>
<li><strong>Stories, stories, stories: </strong><em>On the House</em> personalizes youth homelessness and the challenges that contribute to it.  By telling youth stories, <a title="13 Year Old John" href="http://www.covenanthousebc.org/blog/2010/04/29/chocolate-bar-can-go-long-way" target="_blank">for example the story of 13-year John</a>, <em>On the House</em> helps helps educate prospective donors and volunteers as well as building stronger community among existing constituents.</li>
<li><strong>Gratitude is infections:</strong> Covenant House posts letters they receive from donors (with permission) to their <a title="Donor Stories" href="http://www.covenanthousebc.org/blog/topics/donor-stories" target="_blank">Donor Stories</a>.  In the story <a title="Thank You" href="http://www.covenanthousebc.org/blog/2010/04/23/thank-you" target="_blank">Thank You</a>, a donor wrote to give thanks for the call they received during Covenant House&#8217;s &#8220;thank-a-thon.&#8221;  In <a title="Feel Good Friday" href="http://www.covenanthousebc.org/blog/topics/donor-stories" target="_blank">Feel Good Friday</a>, Joanne wrote to explain how much it meant to her to be able to teach her children about giving to Covenant House Vancouver.</li>
<li><strong>Self-promotion is more palatable when it&#8217;s surrounded with great content: </strong><em>On the House</em> has a few asks and some promotion mixed in, such as <a title="Christmas is Coming" href="http://www.covenanthousebc.org/blog/2009/10/15/christmas-coming" target="_blank">Christmas is Coming</a>.  Coupled with youth stories, it seems only natural that Covenant House should be asking for support to help these kids.</li>
<li><strong>Show, don&#8217;t tell:</strong> Some of the most powerful posts are contributed by the youth Covenant House Vancouver serves: <a title="Freedom" href="http://www.covenanthousebc.org/blog/2010/05/21/freedom" target="_blank">poetry</a>, <a title="Comic Strip" href="http://www.covenanthousebc.org/blog/2010/02/26/youth-comic-part-six" target="_blank">artwork,</a> and prose tell the reader more than a third-person story ever could.  For example <a title="Gratitude" href="http://www.covenanthousebc.org/blog/2010/03/01/gratitude-donated-hockey-tickets" target="_blank">Gratitude for Donated Hockey Sticks</a>, in which two youth thank you letters are reprinted.</li>
<li><strong>Share your challenges:</strong> The blog content stays interesting because there&#8217;s lots of variety. Posts, like <a title="Youth Privacy Versus Good Communication" href="http://www.covenanthousebc.org/blog/2010/04/23/youth-privacy-versus-good-communications" target="_blank">Youth Privacy Versus Good Communication</a>, explore internal challenges Covenant House staff face every day, lending a human face to the organization and breaking down barriers between the staffer who&#8217;s writing and the reader.</li>
</ol>
<p>Congratulations to Michelle Clausius and Kristy Hayter who have done an amazing job of bringing <em>On the House</em> to life. If you have minute, check out <a title="On the House" href="http://www.covenanthousebc.org/blog" target="_blank"><em>On the House</em></a>.  The posts are often funny, informative, inspiring, and/or heartbreaking.  They&#8217;re compelling and worth the read.  Kudos to Covenant House for helping to give these talented young writers a voice.  Also, thanks for the important insights on the issues of youth and homelessness.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.raisedeyebrow.com/2010/06/what-your-nonprofit-can-learn-from-covenant-house-vancouvers-award-winning-blog/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.raisedeyebrow.com/2010/06/what-your-nonprofit-can-learn-from-covenant-house-vancouvers-award-winning-blog/#utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=what-your-nonprofit-can-learn-from-covenant-house-vancouvers-award-winning-blog</feedburner:origLink></item>
		<item>
		<title>Datadotgc.ca – A Drupal case study: Part 2</title>
		<link>http://feedproxy.google.com/~r/raisedeyebrow/~3/gBSCOX5Jdso/</link>
		<comments>http://blog.raisedeyebrow.com/2010/06/datadotgc-ca-a-drupal-case-study-part-2/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 19:23:41 +0000</pubDate>
		<dc:creator>Colin Calnan</dc:creator>
				<category><![CDATA[Code and Coding]]></category>
		<category><![CDATA[Content Management Systems]]></category>
		<category><![CDATA[Drupal]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[CKAN]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.raisedeyebrow.com/?p=880</guid>
		<description><![CDATA[This is the second part of Drupal Case Study on integrating the CKAN data repository with Drupal 6. Part 1 covered the following:

What is CKAN?
CKAN’s API
The Foundation
The Build
Theming
Homepage Chart

Caching
API calls are expensive. There&#8217;s no doubt about that. Particularly when you&#8217;re returning large amounts of data. To avoid any issues of the CKAN API being exhausted [...]]]></description>
			<content:encoded><![CDATA[<p>This is the second part of Drupal Case Study on integrating the CKAN data repository with Drupal 6. <a href="/2010/04/datadotgc-ca-a-drupal-case-study/">Part 1 covered the following</a>:</p>
<ul>
<li>What is CKAN?</li>
<li>CKAN’s API</li>
<li>The Foundation</li>
<li>The Build</li>
<li>Theming</li>
<li>Homepage Chart</li>
</ul>
<h3>Caching</h3>
<p>API calls are expensive. There&#8217;s no doubt about that. Particularly when you&#8217;re returning large amounts of data. To avoid any issues of the CKAN API being exhausted from requests and to ensure that the site remained responsive, I decided to leverage Drupals caching mechanisms and pretty much cached everything I could, within reason. <a href="http://www.datadotgc.ca">The Chart</a>, Tag Cloud, <a href="http://www.datadotgc.ca/data/tag">Tag lists</a>, <a href="http://www.datadotgc.ca/data/ministry">Ministry lists</a>, <a href="http://www.datadotgc.ca/data/all">All Packages</a> list and all individual packages are cached. The issue with caching on this site is that if a package gets updated on the CKAN instance, we need to know about that on our Drupal site immediately and then clear the appropriate caches so that the most recent data can be retrieved. </p>
<p>For caching I created a table called &#8216;cache_ckan&#8217;, that stores everything I need. To create this table I used the schema of the existing cache table and put that in my .install file in my module directory.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p880code8'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p8808"><td class="code" id="p880code8"><pre class="php" style="font-family:monospace;"><span style="color: #009933; font-style: italic;">/**
 * Implementation of hook_install().
 */</span>
<span style="color: #000000; font-weight: bold;">function</span> ckan_install<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  drupal_install_schema<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ckan'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * Implementation of hook_uninstall().
 */</span>
<span style="color: #000000; font-weight: bold;">function</span> ckan_uninstall<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  drupal_uninstall_schema<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ckan'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * Implementation of hook_schema().
 */</span>
<span style="color: #000000; font-weight: bold;">function</span> ckan_schema<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$schema</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$schema</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'cache_ckan'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> drupal_get_schema_unprocessed<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'system'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'cache'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #000088;">$schema</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Whenever this module is enabled this schema will be run and the table will be created.</p>
<h4>What is stored in the ckan_cache table?</h4>
<p>There are various items stored in the cache table.</p>
<ol>
<li>The Homepage chart data</li>
<li>Tag lists</li>
<li>Ministry lists</li>
<li>List of all datasets</li>
</ol>
<p>Let&#8217;s take the <a href="http://www.datadotgc.ca/data/all">list of all packages</a> as an example. I covered how I implemented the paging in <a href="/2010/04/datadotgc-ca-a-drupal-case-study/">my previous post</a>. As this list is paginated it&#8217;s important that every page be cached to improve the speed of the site. As the paging mechanism is already implemented it&#8217;s just a case of creating a cache table entry (<strong>ckan:all{page-number}</strong>) for each page, and then checking for it&#8217;s existence when loading the page.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p880code9'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p8809"><td class="code" id="p880code9"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$cache</span> <span style="color: #339933;">=</span> cache_get<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ckan:all'</span><span style="color: #339933;">.</span><span style="color: #000088;">$page</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'cache_ckan'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span><a href="http://www.php.net/empty"><span style="color: #990000;">empty</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$cache</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">data</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">// If cached data exists for this page...</span>
	<span style="color: #000088;">$results</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$cache</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">data</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$ckan</span> <span style="color: #339933;">=</span> ckan_ckan<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000088;">$start</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$items_per_page</span> <span style="color: #339933;">=</span> variable_get<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ckan_items_per_page'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$page</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// If we're in a page, we need to set where to start the list</span>
		<span style="color: #000088;">$start</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$page</span> <span style="color: #339933;">*</span> <span style="color: #000088;">$items_per_page</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Set the offset to the number of records in</span>
	<span style="color: #000088;">$offset</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$start</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">// Limit to the number of items per page </span>
	<span style="color: #000088;">$limit</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$items_per_page</span><span style="color: #339933;">;</span>
&nbsp;
	try <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$results</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$ckan</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">advancedSearch</span><span style="color: #009900;">&#40;</span><a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'groups'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'canadagov'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'all_fields'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'1'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'offset'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$offset</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'limit'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$limit</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span> catch <span style="color: #009900;">&#40;</span>Exception <span style="color: #000088;">$e</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$e</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getMessage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// If the API call worked</span>
	watchdog<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ckan'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Called CKAN API for list of all packages'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    	cache_set<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ckan:all'</span><span style="color: #339933;">.</span><span style="color: #000088;">$page</span><span style="color: #339933;">,</span> <span style="color: #000088;">$results</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'cache_ckan'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>This method is very simple and very effective. It means the pages load lightning fast and only one page of data at a time is retrieved.</p>
<h4>How does the cache get cleared/updated</h4>
<p>Datasets/Packages change all the time on the CKAN instance, so how do you make sure that the Drupal site has the most current data. This module has two ways of managing that.</p>
<h4>1. Using <a href="http://api.drupal.org/api/function/hook_form/6">hook_form</a> to redirect to CKAN</h4>
<p>As the CKAN nodes on Drupal are created on the fly and hold very little information, there is really no need to access the EDIT form for these nodes. Whenever an admin user clicks the edit tab on the node, they are automatically redirected to the appropriate CKAN package editing screen. hook_form is called to retrieve the form that is displayed when one attempts to &#8220;create/edit&#8221; an item. For CKAN content types, the user is redirect to the CKAN instance.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p880code10'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p88010"><td class="code" id="p880code10"><pre class="php" style="font-family:monospace;"><span style="color: #009933; font-style: italic;">/**
 * Implementation of hook_form
 *
 * Redirect the user to ca.ckan.net package edit screen on edit
 */</span>
<span style="color: #000000; font-weight: bold;">function</span> ckan_form<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span><span style="color: #000088;">$node</span><span style="color: #339933;">,</span> <span style="color: #000088;">$form_state</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$node</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">type</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'ckan'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  	drupal_goto<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'http://ca.ckan.net/package/edit/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$node</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">body</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>When the CKAN form is submitted, CKAN then redirects back to the Drupal site and calls a specific URL that tells Drupal to call CKAN again to get the package information and populate the node. To clarify, the process is</p>
<ol>
<li>Redirect http://www.datadotgc.ca/node/X/edit to http://ca.ckan.net/package/edit/{name of X}</li>
<li>On save of CKAN Package, redirect to http://www.datadotgc.ca/{special_url}/{name_of_X}</li>
<li>Load the node with {name_of_X}</li>
<li>Call CKAN to get the (updated) data for Package {name_of_X}</li>
<li>Save the node with updated data</li>
</ol>
<h4>Using Cron and an Atom Feed</h4>
<p>CKAN provides an Atom feed of recent updates to the Packages. Cron checks this feed every time it runs. If the feed has changed since the last cron run, then we know there have been updates and we clear all of the caches.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p880code11'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p88011"><td class="code" id="p880code11"><pre class="php" style="font-family:monospace;"><span style="color: #009933; font-style: italic;">/**
 * Implementation of hook_cron()
 *
 **/</span>
<span style="color: #000000; font-weight: bold;">function</span> ckan_cron<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">// Get the md5sum of the current atom feed</span>
	<span style="color: #000088;">$current_feed</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/trim"><span style="color: #990000;">trim</span></a><span style="color: #009900;">&#40;</span><a href="http://www.php.net/md5_file"><span style="color: #990000;">md5_file</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'http://ca.ckan.net/revision/list?format=atom'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	watchdog<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ckan'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Current feed md5: '</span><span style="color: #339933;">.</span> <span style="color: #000088;">$current_feed</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">// Retrieve the previously stored md5sum</span>
	<span style="color: #000088;">$previous_feed</span> <span style="color: #339933;">=</span> variable_get<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ckan_atom_feed_md5'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$current_feed</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	watchdog<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ckan'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Previous feed md5: '</span><span style="color: #339933;">.</span><span style="color: #000088;">$previous_feed</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// If there have been changes</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$current_feed</span> <span style="color: #339933;">!=</span> <span style="color: #000088;">$previous_feed</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		watchdog<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ckan'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'ATOM feed has updated, clearing caches and deleting nodes'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">// Flush all the caches</span>
		cache_clear_all<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'*'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'cache_ckan'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">TRUE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  	        <span style="color: #666666; font-style: italic;">// Set the previous feed md5</span>
		variable_set<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ckan_atom_feed_md5'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$current_feed</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h3>Tag cloud creation</h3>
<p>I borrowed some code from the <a href="http://drupal.org/project/tagadelic">Tagadelic</a> module to achieve the tag cloud</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p880code12'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p88012"><td class="code" id="p880code12"><pre class="php" style="font-family:monospace;"><span style="color: #009933; font-style: italic;">/**
 * Build a tag cloud based on the settings provided
 *
 * @return	String	A themed list of weighted tags
 */</span>
<span style="color: #000000; font-weight: bold;">function</span> ckan_tag_cloud<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">// If there is cached data</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$cache</span> <span style="color: #339933;">=</span> cache_get<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ckan:tags'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'cache_ckan'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span><a href="http://www.php.net/empty"><span style="color: #990000;">empty</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$cache</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">data</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$results</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/unserialize"><span style="color: #990000;">unserialize</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$cache</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	
	<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$ckan</span> <span style="color: #339933;">=</span> ckan_ckan<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$results</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$ckan</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getTagCount</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		watchdog<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ckan'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Called CKAN API for tag cloud'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		cache_set<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ckan:tags'</span><span style="color: #339933;">,</span> <a href="http://www.php.net/serialize"><span style="color: #990000;">serialize</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$results</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'cache_ckan'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Let's sort them by weight first off</span>
	<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$results</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$row</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$tag</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span>  <span style="color: #339933;">=</span> <span style="color: #000088;">$row</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$weight</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$row</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<a href="http://www.php.net/array_multisort"><span style="color: #990000;">array_multisort</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$weight</span><span style="color: #339933;">,</span> SORT_DESC<span style="color: #339933;">,</span> <span style="color: #000088;">$results</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Now let's get the top X number of tags</span>
	<span style="color: #000088;">$results</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/array_slice"><span style="color: #990000;">array_slice</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$results</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> variable_get<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ckan_tagcloud_total'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">40</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Now build the tags</span>
	<span style="color: #000088;">$tags</span> <span style="color: #339933;">=</span> ckan_tag_build_weighted<span style="color: #009900;">&#40;</span><span style="color: #000088;">$results</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">// Sort them</span>
	<span style="color: #000088;">$tags</span> <span style="color: #339933;">=</span> ckan_tag_sort<span style="color: #009900;">&#40;</span><span style="color: #000088;">$tags</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">// Theme them</span>
	<span style="color: #000088;">$output</span> <span style="color: #339933;">=</span> theme<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ckan_weighted_tags'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$tags</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$output</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * Theme function that renders the HTML for the tags
 * @ingroup themable
 */</span>
<span style="color: #000000; font-weight: bold;">function</span> theme_ckan_weighted_tags<span style="color: #009900;">&#40;</span><span style="color: #000088;">$tags</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$output</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$tags</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$tag</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$output</span> <span style="color: #339933;">.=</span> l<span style="color: #009900;">&#40;</span><span style="color: #000088;">$tag</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'data/tag/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$tag</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'attributes'</span> <span style="color: #339933;">=&gt;</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'class'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;tagcloud level&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$tag</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'weight'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'rel'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'tag'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">&quot; <span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #000088;">$output</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h3>Using the CKAN Search API for all lists</h3>
<p>Ok, so what&#8217;s this all about? CKAN has some <a href="http://knowledgeforge.net/ckan/doc/ckan/api.html">nice API calls</a> like <em>/api/rest/package/PACKAGE-REF</em> that return a list of Packages. However these return the name/id of the Package ONLY. In our case, for our listings, we wanted other data, such as the tags attached to the Package as well as a brief description.</p>
<p>The only way to get this data was to do a search API call <em>/api/search/package</em> and pass some extra parameters, in this case <em><strong>all_fields=1</strong></em> and <em><strong>department={name of Ministry}</strong></em>. </p>
<p><em><strong>all_fields=1</strong></em> tells the search to return all Package fields, not just the name/id; just as is if you called  <em>/api/rest/package/PACKAGE-REF</em>.</p>
<p><em><strong>department={name of Ministry}</strong></em> tells the search to return all packages that have a department of {name of Ministry}. <strong>The lovely folks at CKAN added this functionality for us on request</strong>.</p>
<p>What does this look like, well it&#8217;s pretty simple really. Call the <em>advancedSearch()</em> function. Pass it a few parameters and it returns you all the data you need. Here&#8217;s the function itself:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p880code13'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p88013"><td class="code" id="p880code13"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> advancedSearch<span style="color: #009900;">&#40;</span><span style="color: #000088;">$parameters</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$parameters</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$querystring</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">'='</span><span style="color: #339933;">.</span> <a href="http://www.php.net/urlencode"><span style="color: #990000;">urlencode</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">'&amp;'</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000088;">$results</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">transfer</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'api/search/package?'</span><span style="color: #339933;">.</span> <span style="color: #000088;">$querystring</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$results</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">count</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> CkanException<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Search Error&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$results</span><span style="color: #339933;">;</span>	
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>And here is that function being called for the list of Ministry Packages. The offset and limit are for the paging mechanism:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p880code14'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p88014"><td class="code" id="p880code14"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Call the function</span>
<span style="color: #000088;">$results</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$ckan</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">advancedSearch</span><span style="color: #009900;">&#40;</span><a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'department'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$ministry</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'all_fields'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'1'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'offset'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$offset</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'limit'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$limit</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>There&#8217;s a lot more functionality in this module, more than I can go through in a blog post, even 5 posts. If you&#8217;re trying to integrate Drupal with a CKAN instance and are not sure where to start then please leave a comment and I&#8217;ll get back in touch.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.raisedeyebrow.com/2010/06/datadotgc-ca-a-drupal-case-study-part-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.raisedeyebrow.com/2010/06/datadotgc-ca-a-drupal-case-study-part-2/#utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=datadotgc-ca-a-drupal-case-study-part-2</feedburner:origLink></item>
		<item>
		<title>Provincial Government Funding for New Technology Training Could Help Offset the Cost of a New Website?</title>
		<link>http://feedproxy.google.com/~r/raisedeyebrow/~3/9LWDCNtVlak/</link>
		<comments>http://blog.raisedeyebrow.com/2010/06/provincial-government-funding-for-new-technology-training-could-help-offset-the-cost-of-a-new-website/#comments</comments>
		<pubDate>Mon, 21 Jun 2010 16:30:07 +0000</pubDate>
		<dc:creator>Emira Mears</dc:creator>
				<category><![CDATA[Nonprofit Tech]]></category>
		<category><![CDATA[Raised Eyebrow]]></category>

		<guid isPermaLink="false">http://blog.raisedeyebrow.com/?p=946</guid>
		<description><![CDATA[Depending on the size of your organization and whether or not you have previously applied for this program, there is a BC Government initiative which your organization may be able to use to offset some of the cost of your website (re)design and development project.
Information about the program and the one page application form are [...]]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } 		A:link { so-language: zxx } -->Depending on the size of your organization and whether or not you have previously applied for this program, there is a BC Government initiative which your organization may be able to use to offset some of the cost of your website (re)design and development project.</p>
<p>Information about the program and the one page application form are available on the Ministry website: <a href="http://www.aved.gov.bc.ca/workplace_training_program/welcome.htm">http://www.aved.gov.bc.ca/workplace_training_program/welcome.htm</a></p>
<p>In brief the eligibility requirements are:</p>
<ul>
<li>Business or organization 	(non-profit organizations are eligible) with less than 50 employees 	(this number would not include volunteers).</li>
<li>Been operating for more than a 	year.</li>
<li>Apply the funding to training 	which will “help improve productivity” and/or “support the 	introduction of new equipment, technology or work process”. Your 	new CMS should be eligible as a new technology which will also help 	improve productivity.</li>
<li>You must have not already applied 	for the grant.</li>
</ul>
<p>The grant offers:</p>
<ul>
<li>Up to $1,500 per employee for 	training costs</li>
<li>An organizational maximum of 	$5,000</li>
</ul>
<p>Please note that training for Owners is not eligible for the grant, however, we have been unable to ascertain whether or not Executive Directors are excluded (there is no language that says so, and the Ministry has been slow to respond).</p>
<p>The program is in place until January 31, 2011.</p>
<p>Please note, this is a one time grant so if you feel there is other training  to which you could better apply this grant, then we would advise you to not apply for the grant for your website training.</p>
<p>Of course Raised Eyebrow can not guarantee that your funding will be approved, but the training we provide to our clients as a part of a website redesign or a new development project does fit into the criteria of the program. We are in no way affiliated with this program, we simply want to make our clients aware of it as we are conscious of the limited resources that many of our clients operate under.</p>
<p><strong>More information:</strong></p>
<ul>
<li><a href="http://www.aved.gov.bc.ca/workplace_training_program/docs/application.pdf">Download 	the One Page Application Form</a> (PDF)</li>
<li><a href="http://www.aved.gov.bc.ca/workplace_training_program/docs/qa.pdf">Questions 	and Answers on the Ministry website</a> (PDF)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.raisedeyebrow.com/2010/06/provincial-government-funding-for-new-technology-training-could-help-offset-the-cost-of-a-new-website/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.raisedeyebrow.com/2010/06/provincial-government-funding-for-new-technology-training-could-help-offset-the-cost-of-a-new-website/#utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=provincial-government-funding-for-new-technology-training-could-help-offset-the-cost-of-a-new-website</feedburner:origLink></item>
		<item>
		<title>Vertical Response Release New Editor</title>
		<link>http://feedproxy.google.com/~r/raisedeyebrow/~3/KHv2jlyc8Ic/</link>
		<comments>http://blog.raisedeyebrow.com/2010/06/vertical-response-release-new-editor/#comments</comments>
		<pubDate>Mon, 14 Jun 2010 16:09:24 +0000</pubDate>
		<dc:creator>Anna</dc:creator>
				<category><![CDATA[Email Marketing]]></category>
		<category><![CDATA[Online Strategy]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.raisedeyebrow.com/?p=931</guid>
		<description><![CDATA[Vertical Response, an online newsletter software, recently released an update to their editor.  WOW!  What an improvement.
The old editor, used for editing custom HTML templates was pretty picky.  It reminded me of Microsoft Word, in that you might press return once and get a huge gaping hole in your layout. Or press backspace once and [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Vertical Response" href="http://www.verticalresponse.com" target="_blank">Vertical Response</a>, an online newsletter software, recently released an update to their editor.  WOW!  What an improvement.</p>
<p>The old editor, used for editing custom HTML templates was pretty picky.  It reminded me of Microsoft Word, in that you might press return once and get a huge gaping hole in your layout. Or press backspace once and the entire design would disappear. <em>Undo</em> was a most used <em>feature</em>.  And often the remedy was to extract the source and fix things up in Dreamweaver, combing through line by line.</p>
<p>That said, I&#8217;ve always liked Vertical Response because I like the management interface, including the list manager, and after gaining enormous popularity, they are still offering their service <a title="Vertical Response" href="http://www.verticalresponse.com/non-profits/" target="_blank">FREE to nonprofits</a>, which is awesome for many of our clients.</p>
<p>So recently I logged into Vertical Response and made a copy of a campaign and got the prompt &#8220;NEW: Copy to New Canvas Editor.&#8221;  I ticked the box and this opened the newsletter in the new editor and it was a beautiful transformation.</p>
<p>My favourite improvement is the Format drop-down, which allows you to apply paragraph styles defined in the CSS by simply highlighting text and choosing a style from the drop-down.  Prior to this you would have to copy a few characters from a paragraph with the formatting you wanted, paste it in the desired location, and then edit it.  So this was a big improvement.</p>
<p>Another plus is the tick box that allows you to automatically generate a text-based version of the email.  This prevents the need to carry content changes in two versions of the email.</p>
<p>If you are still using the old editor, give the new one a try.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.raisedeyebrow.com/2010/06/vertical-response-release-new-editor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.raisedeyebrow.com/2010/06/vertical-response-release-new-editor/#utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=vertical-response-release-new-editor</feedburner:origLink></item>
		<item>
		<title>Being Curious for a Living: WordCamp Vancouver presentation</title>
		<link>http://feedproxy.google.com/~r/raisedeyebrow/~3/MtgMP1Skmg4/</link>
		<comments>http://blog.raisedeyebrow.com/2010/06/being-curious-for-a-living-wordcamp-vancouver-presentation/#comments</comments>
		<pubDate>Sat, 12 Jun 2010 23:57:58 +0000</pubDate>
		<dc:creator>Lauren Bacon</dc:creator>
				<category><![CDATA[Content Management Systems]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Online Strategy]]></category>
		<category><![CDATA[Raised Eyebrow]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Workshops & Events]]></category>

		<guid isPermaLink="false">http://blog.raisedeyebrow.com/?p=943</guid>
		<description><![CDATA[I spoke today at WordCamp Vancouver &#8211; a one-day conference for people who work with WordPress (including developers, designers and users). It was a great event, thanks to the hard work of the organizers. The presenters shared lots of very useful information on design and coding as well as about social media and web culture.
I [...]]]></description>
			<content:encoded><![CDATA[<p>I spoke today at <a href="http://www.wordcampvancouver.com">WordCamp Vancouver</a> &#8211; a one-day conference for people who work with WordPress (including developers, designers and users). It was a great event, thanks to the hard work of the organizers. The presenters shared lots of very useful information on design and coding as well as about social media and web culture.</p>
<p>I chose to focus my 25-minute talk on what I think lies below the surface of the work we do as web designers and developers, and that&#8217;s a more consultative and strategic role that we can play if we choose to (and if our clients let us).</p>
<p>The session was recorded on video, and <span style="text-decoration: line-through;">I&#8217;ll post that video when I get the link</span> that video is posted below, but for now I thought I would at least share my slide deck &#8211; particularly for those in attendance who requested it.</p>
<div id="__ss_4484826" style="width: 425px;"><strong style="display: block; margin: 12px 0 4px;"><a title="Being Curious for a Living: Questions you can ask to create loyal, repeat customers" href="http://www.slideshare.net/laurenebacon/being-curious-for-a-living-questions-you-can-ask-to-create-loyal-repeat-customers">Being Curious for a Living: Questions you can ask to create loyal, repeat customers</a></strong><object id="__sse4484826" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=wordcamp-100612171754-phpapp01&amp;stripped_title=being-curious-for-a-living-questions-you-can-ask-to-create-loyal-repeat-customers" /><param name="name" value="__sse4484826" /><param name="allowfullscreen" value="true" /><embed id="__sse4484826" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=wordcamp-100612171754-phpapp01&amp;stripped_title=being-curious-for-a-living-questions-you-can-ask-to-create-loyal-repeat-customers" name="__sse4484826" allowscriptaccess="always" allowfullscreen="true"></embed></object></div>
<h3>Video from the event:</h3>
<p><embed src="http://blip.tv/play/AYHomHwC" type="application/x-shockwave-flash" width="480" height="300" allowscriptaccess="always" allowfullscreen="true"></embed><em>(Many thanks to <a href="http://carlsonmedia.ca">Justin Carlson</a> for recording &amp; sharing the video.)</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.raisedeyebrow.com/2010/06/being-curious-for-a-living-wordcamp-vancouver-presentation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.raisedeyebrow.com/2010/06/being-curious-for-a-living-wordcamp-vancouver-presentation/#utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=being-curious-for-a-living-wordcamp-vancouver-presentation</feedburner:origLink></item>
		<item>
		<title>Password Overload and CRMs</title>
		<link>http://feedproxy.google.com/~r/raisedeyebrow/~3/9d7COVwtzpE/</link>
		<comments>http://blog.raisedeyebrow.com/2010/06/password-overload-and-crms/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 22:08:17 +0000</pubDate>
		<dc:creator>Anna</dc:creator>
				<category><![CDATA[Gadgets]]></category>
		<category><![CDATA[Geekery]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Raised Eyebrow]]></category>

		<guid isPermaLink="false">http://blog.raisedeyebrow.com/?p=926</guid>
		<description><![CDATA[When I used a PC, I found this utility that I used to keep track of my passwords.  Roboform is this happy will green dude who sits in your utility tray and keeps a list of all of your login accounts, their URLs, usernames, passwords and notes.  Launching an account is as easy as clicking [...]]]></description>
			<content:encoded><![CDATA[<p>When I used a PC, I found this utility that I used to keep track of my passwords.  <a title="Roboform" href="http://www.roboform.com/" target="_blank">Roboform</a><a title="Roboform" href="http://www.roboform.com/" target="_blank"><img class="alignright size-full wp-image-927" title="roboform" src="http://blog.raisedeyebrow.com/wp-content/uploads/2010/06/roboform.png" alt="" width="72" height="68" /></a> is this happy will green dude who sits in your utility tray and keeps a list of all of your login accounts, their URLs, usernames, passwords and notes.  Launching an account is as easy as clicking on Roboform and selecting the account you&#8217;d like to launch and voila the site launches and Roboform fills your username and password and automatically logs you in.  Roboform works with a master password, so when you login to your computer to launch Roboform you need to enter a master password.  You can set how often you want to be prompted for the password.</p>
<p>When I moved to Mac, I missed the little green guy.  Every time I had to copy a url, username and password from a spreadsheet and paste them manually into an internet browser, the heart ache increased.  Plus, there was all kinds of silliness with the spreadsheet: who had it open, who deleted that field, what is the most current version of the FTP info, etc.</p>
<p>When I migrated to Mac I had accumulated 249 passwords in my Roboform! The amount of information that people are beginning to need to be able to track in their personal and professional lives is outrageous.</p>
<p>At Raised Eyebrow we have thousands of passwords and they needed to be stored uber securely.  Moreover, the data is a more complex set of information, Client Names, Contact Info, FTP Info, Database Info, CMS Info, Host Info, Stats Info, etc.  We combed through the market of Mac-based password keepers. 1Password, KeePassX seemed to be the best options that emerged at the time.  <a title="1Password" href="http://agilewebsolutions.com/products/1Password" target="_blank">1Password</a>, which is proprietary, seemed more feature rich, while <a title="KeePassX" href="http://www.keepassx.org/" target="_blank">KeePass</a>, which is open source, seemed easier to install as a shared network installation.  Nonetheless, the amount of customization we required in terms of fields made neither solution appealing. So we kept on using a spreadsheet.</p>
<p>One day in utter frustration we had a brainstorming session.  We build websites, so maybe we could build an internal site that would keep our data?  From that session was born the idea for our super secure, one stop shop, password vault website.  That was 6 months ago.</p>
<p>Today, I just finished entering the last password from our main password list! What we developed in many respects is akin to a custom contact database.  We have different content types: Client, Website, Newsletter, Domain, etc.  Seeing the product, in its current state makes me wonder whether we should have invested the time we took to develop it into implementing and customizing a CRM (customer relationship manager)?  Could the data be accommodated in an off the shelf solution, like <a title="Salesforce" href="http://www.salesforce.com/" target="_blank">Salesforce</a> or <a title="Daylight" href="http://www.marketcircle.com/daylite/" target="_blank">Daylight</a> with customization?</p>
<p>Now, we are on the eve of embarking on a CRM implementation process. Starting such a process makes we wonder about all our systems: which ones work? Which ones should we keep? Which ones can be folded into the CRM? How can we streamline our workflow, while ensuring the integrity and security of our data?  How can specialized industries be best served by CRM software?</p>
<p>One major benefit from developing our password keeper is that we engaged in the exact process that would be required to clean up our data if we were going to import it into a CRM.  Instead of having a laundry list of every type of password in one long list, we have nice clean data parsed into types.  Also, it was like putting out a fire so that we wouldn&#8217;t be smoked out while we began to think about a CRM project. So, I&#8217;m happy with the path we&#8217;ve taken and looking forward to seeing what we do next.</p>
<p>If you have password overload, there are lots of solutions out there to make your life easier. And if you&#8217;ve recently done a CRM project in a all Mac environment, let me know how it went.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.raisedeyebrow.com/2010/06/password-overload-and-crms/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.raisedeyebrow.com/2010/06/password-overload-and-crms/#utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=password-overload-and-crms</feedburner:origLink></item>
		<item>
		<title>Our new digs</title>
		<link>http://feedproxy.google.com/~r/raisedeyebrow/~3/chQYm_MDkBI/</link>
		<comments>http://blog.raisedeyebrow.com/2010/06/our-new-digs/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 15:30:41 +0000</pubDate>
		<dc:creator>Lauren Bacon</dc:creator>
				<category><![CDATA[Raised Eyebrow]]></category>

		<guid isPermaLink="false">http://blog.raisedeyebrow.com/?p=920</guid>
		<description><![CDATA[A few weeks ago, we moved out of the Flack Block and relocated a mere two blocks away to another beautiful heritage office building on West Pender: The Duncan Building. Much as we&#8217;ll miss our neighbours in the Flack Block, we&#8217;re excited about the bright &#38; airy space (and the hardwood floors!) that our new [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/laurenbacon/sets/72157624054077279/"><img class="size-medium wp-image-921 alignleft" title="Anna &amp; Colin at their desks" src="http://blog.raisedeyebrow.com/wp-content/uploads/2010/05/IMG_0535-e1275364777368-200x300.jpg" alt="Anna &amp; Colin at their desks" width="200" height="300" /></a>A few weeks ago, we moved out of the Flack Block and relocated a mere two blocks away to another beautiful heritage office building on West Pender: The Duncan Building. Much as we&#8217;ll miss our neighbours in the Flack Block, we&#8217;re excited about the bright &amp; airy space (and the hardwood floors!) that our new office affords.</p>
<p>We&#8217;re still settling in, but I wanted to <a href="http://www.flickr.com/photos/laurenbacon/sets/72157624054077279/">share a few photos</a> to give you a flavour of our workplace. Please pardon the bare walls and the boxes in the corners…</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.raisedeyebrow.com/2010/06/our-new-digs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.raisedeyebrow.com/2010/06/our-new-digs/#utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=our-new-digs</feedburner:origLink></item>
		<item>
		<title>Hey, Web Geeks With Hearts of Gold: We’re Hiring.</title>
		<link>http://feedproxy.google.com/~r/raisedeyebrow/~3/dnnUw2Zl178/</link>
		<comments>http://blog.raisedeyebrow.com/2010/05/hey-web-geeks-with-hearts-of-gold-were-hiring/#comments</comments>
		<pubDate>Fri, 28 May 2010 16:31:08 +0000</pubDate>
		<dc:creator>Lauren Bacon</dc:creator>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[Geekery]]></category>
		<category><![CDATA[Nonprofit Tech]]></category>
		<category><![CDATA[Raised Eyebrow]]></category>

		<guid isPermaLink="false">http://blog.raisedeyebrow.com/?p=915</guid>
		<description><![CDATA[We&#8217;re excited to announce a new opportunity at Raised Eyebrow. Our little-web-studio-that-could is growing again, and we&#8217;ve got an opening for a Front-End Developer/Themer to help us build awesome websites for fabulous, mission-driven clients.
This is a position for someone with solid technical skills &#8212; someone who can rock HTML and CSS, who prides themselves on [...]]]></description>
			<content:encoded><![CDATA[<p>We&#8217;re excited to announce a new opportunity at Raised Eyebrow. Our little-web-studio-that-could is growing again, and we&#8217;ve got an opening for a <a href="http://raisedeyebrow.com/jobs/">Front-End Developer/Themer</a> to help us build awesome websites for fabulous, mission-driven clients.</p>
<p>This is a position for someone with solid technical skills &#8212; someone who can rock HTML and CSS, who prides themselves on attention to detail and clean, elegant code. You&#8217;ll be turning design comps into themes for Drupal and WordPress sites, so experience with one (or both) of those CMS&#8217;s is preferred, but if you&#8217;re confident in your coding skills and are new to Drupal &amp; WordPress, don&#8217;t let that stop you.</p>
<p>Because we&#8217;re a small shop, everyone here tends to wear a few hats, so we&#8217;re looking for someone with smarts, adaptability and a serious appetite for learning. We pride ourselves on the quality of our work, our efficiency, and our passion for our clients &#8212; and we&#8217;re looking for someone whose shares those values.</p>
<p>In our beautiful, heritage Gastown office, you&#8217;ll find a friendly team of experts, a ridiculously well-stocked tea cabinet, and abundant opportunities to work on projects that allow you to flex your technical muscles and bring your heart and ideals to work.</p>
<p>Sound like a fit for you (or someone you know)? <a href="http://raisedeyebrow.com/jobs/">The job description, with details on how to apply, is right here.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.raisedeyebrow.com/2010/05/hey-web-geeks-with-hearts-of-gold-were-hiring/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.raisedeyebrow.com/2010/05/hey-web-geeks-with-hearts-of-gold-were-hiring/#utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=hey-web-geeks-with-hearts-of-gold-were-hiring</feedburner:origLink></item>
	</channel>
</rss>
