<?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>hawidu &#187; Web Design</title>
	<atom:link href="http://hawidu.com/category/web-design/feed/" rel="self" type="application/rss+xml" />
	<link>http://hawidu.com</link>
	<description>Brad Czerniak&#039;s personal site</description>
	<lastBuildDate>Fri, 16 Mar 2012 20:03:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Your Fast Catalog</title>
		<link>http://hawidu.com/2012/03/16/your-fast-catalog/</link>
		<comments>http://hawidu.com/2012/03/16/your-fast-catalog/#comments</comments>
		<pubDate>Fri, 16 Mar 2012 20:03:43 +0000</pubDate>
		<dc:creator>Brad Czerniak</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[Libraries]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[speed]]></category>

		<guid isPermaLink="false">http://hawidu.com/?p=340</guid>
		<description><![CDATA[Canton Public Library's Catalog uses a large library application called Millennium ILS from Innovative Interfaces, Inc. Recently, I undertook to spruce up the images, styles, and JavaScript for our catalog, and in doing so realized substantial speed increases catalog-wide. Note: The speed enhancements below are mostly about optimizing files and client-side stuff. You can also [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://catalog.cantonpl.org/">Canton Public Library's Catalog</a> uses a large library application called <a href="http://www.iii.com/products/millennium_ils.shtml">Millennium ILS from Innovative Interfaces, Inc</a>. Recently, I undertook to spruce up the images, styles, and JavaScript for our catalog, and in doing so realized substantial speed increases catalog-wide.</p>
<p><strong>Note</strong>: The speed enhancements below are mostly about optimizing files and client-side stuff. You can also speed up your catalog on the server side with hardware and database optimization, though doing so is likely to require assistance from Innovative.</p>
<h3>Why</h3>
<p>Faster-loading pages make users happier. Some speed-enhancing techniques also increase server performance and decrease the amount of bandwidth used. Page speed also factors into search engine rankings, though that is less of a concern for our catalog than our website.</p>
<h3>How</h3>
<p>Most of the improvements came from <a href="http://code.google.com/speed/page-speed/index.html">Google Page Speed</a> recommendations.</p>
<h4>Sprites</h4>
<p><strong>Fact I found interesting</strong>: Before I applied the catalog changes, the directory contained 682 files. It now has 49. Having fewer files doesn't inherently speed up the app, but it does speak to the nature of the changes.</p>
<p>There are two types of images in a Millennium "example set": icons (or whole buttons as images) and media type indicators. A typical setup, until recently, had 145 or so button images. The most recent example set available from Innovative has 45 icons and a couple support images for making buttons. These images are coupled with some crufty markup to make the buttons work. The latest set also ships with 39 media indicators (in fairness, we'd use maybe 13 of those for our library).</p>
<p>CPL now has <a href="http://catalog.cantonpl.org/screens/ico-sp.png">one image for all the icons</a> and <a href="http://catalog.cantonpl.org/screens/media-sp.png">one image for all the media indicators</a>. In total, the catalog screens have 8 images: one is required but never used, <a href="http://www.perlmonks.org/?node_id=7974">another never seen</a>, and two others used infrequently. Yes, we grab book jackets from an external service, but that's the extent of the catalog graphics.</p>
<p>An individual example icon weighs in between 600 bytes and 1.3K. Our icon sprite is 5.44K. It can be loaded once and <a href="http://code.google.com/speed/page-speed/docs/caching.html#LeverageBrowserCaching">cached on the user's machine</a>. For pages with many buttons, this results in far fewer HTTP requests and a smaller total payload. The same goes for media indicators.</p>
<p>How do we pull this off? We use two spriting techniques: <a href="http://css-tricks.com/css-sprites/">'traditional' sprites</a> and <a href="http://css-tricks.com/pseudo-spriting/">pseudo sprites</a>. The styles to makes these work can be found in the <a href="http://catalog.cantonpl.org/screens/styles.css">catalog stylesheet</a>. What's novel, and how you can pull this off in Millennium, is in carefully crafting what're called 'wwwoptions':</p>
<pre>
# pseudo sprite example
ICON_BUT_REQUEST=&lt;span class="but icon request"&gt;Request&lt;/span&gt;

# traditional sprite example
IMAGE_MATTYPE3=/screens/spacer.gif" class="media-icon bookmp3
</pre>
<p>As you can see, in both cases activating sprites involves appending classes to a particular HTML element. In the case of the pseudo sprites, there's a class that makes anything look like a button, one that pads the left-hand side and loads the icon sprite image into the space, and one ['request' above] that stipulates where in the sprite image the request icon appears. In the traditional sprite, the "IMAGE_MATTYPE3" option <em>must</em> be an image. Since there's no getting around that, I used a spacer gif. It's 43 bytes — the smallest practical image for the web. I then <a href="http://google-gruyere.appspot.com/part2#2__stored_xss_via_html_attribute">circumvented the wwwoption to add the classes to the image</a>. Those classes set the background size and position the sprite image.</p>
<p>Be advised that pseudo sprites only work in standards-compliant browsers and IE8+. If a substantial number of your users are on IE7-, you may want to wait. Users with non-supporting browsers can still see the button style we use, but the icons won't appear. Sites that work for everyone but look better for modern browsers are considered <a href="http://www.alistapart.com/articles/understandingprogressiveenhancement">progressively-enhanced</a>; that's what you can consider these buttons.</p>
<h4>Distrusting Bowker</h4>
<p>We use <a href="http://www.bowker.com/en-US/products/syndetics/plus/index.html">Syndetics Plus</a>, <a href="http://www.librarything.com/forlibraries">Librarything for Libraries</a>, and <a href="http://code.google.com/apis/books/docs/viewer/developers_guide.html">Google Books previews</a> on our bibliographic record pages. That's a lot of stuff to load. As part of an overall improvement in JavaScript performance, we changed the way we <a href="http://api.jquery.com/jQuery.getScript/">pull in those resources</a>.</p>
<p>Syndetics Plus, by default, loads onto a page something like this</p>
<ul>
<li>Page calls widget.js directly, via a script tag</li>
<li>widget.js loads jQuery from Google's CDN</li>
<li>After jQuery is loaded, widget.js loads widget_connector.js</li>
<li>widget_connector.js gets ready, finds ISBNs on the page, and requests an ISBN-specific widget_response.js</li>
<li>widget_response.js writes to the page and asks widget_connector.js to do stuff</li>
</ul>
<p>This is a mess. It's a long chain of <a href="http://code.google.com/speed/page-speed/docs/rtt.html#ParallelizeDownloads">serialized resources</a> that aren't well-cached by the browser, aren't served <a href="http://marijnhaverbeke.nl/uglifyjs">minified</a> and/or <a href="http://httpd.apache.org/docs/2.0/mod/mod_deflate.html">gzipped</a>, can't be <a href="http://en.wikipedia.org/wiki/Transport_Layer_Security">served over SSL</a>, and that <a href="http://code.google.com/speed/page-speed/docs/payload.html#DeferLoadingJS">block full page rendering</a> until they're complete (whether or not there's a result). Total payload for this process is 49K.</p>
<p>Librarything for Libraries is even worse (<a href="http://hawidu.com/2010/12/11/librarything-issues/">here I go again</a>). It goes:</p>
<ul>
<li>Page calls widget.php (served as javascript) directly, via a script tag</li>
<li>widget.php loads connector.php</li>
<li>connector.php pulls in connector_LB.css</li>
<li>connector.php gets ready, finds ISBNs on the page, and requests an ISBN-specific widget_response.php</li>
<li>widget_response.php writes to the page and asks connector.php to do stuff</li>
</ul>
<p>What makes this process so awful is connector.php. It's over 150K all by itself, and it includes the <a href="http://sizzlejs.com/">sizzle selector library</a> and a bunch of <a href="http://robertnyman.com/2005/11/07/the-ultimate-getelementsbyclassname/">other</a> <a href="http://blog.stchur.com/2007/04/06/serializing-objects-in-javascript/">utilities</a>. Which makes one wonder — why not just use jQuery? Moreover, why does a file that loads a comprehensive selector engine need to define getElementsByClassName()? connector.php's JavaScript is a Frankenstein's monster of code that pollutes the global namespace. I'm afraid that <a href="https://twitter.com/librarythingtim/statuses/167130139891728384">some people might be having nightmares over it</a>. This file also includes all functionality for all different ILSes (not just Millennium, the one we're using) and all LTfL features (a small fraction of which we're using). This massive file is unminified and uncompressed and is part of a call chain that doesn't support HTTP keep-alive. Minifying the file wouldn't solve all the problems, but it would be less than half the size (mostly because their variable names are massive). Ditto on gzip compression, which could make it less than a quarter of its heft over the wire (without minification!).</p>
<p>We <a href="http://code.google.com/apis/libraries/">pull in jQuery from Google</a> (the old-fashioned way, so it client-side caches for just about ever) and use it for almost all the <a href="http://catalog.cantonpl.org/screens/canton.js">(CPL-made) JavaScript</a> on the page. The code for us to replace Syndetics Plus's payload (25K without jQuery) is 150 bytes before compression. The nearly 200K for LTfL? Less than 1K, and I could probably optimize further.</p>
<p>CPL-specific code pulls the primary ISBN from bib record pages, validates it, then makes sure the page is served as regular HTTP. All of this occurs after the page has already loaded. If the conditions are met, we then feed the ISBN to the widget_response files from the two services, getting back just the results specific to the bib record. The widget_response files handle writing to the page all by themselves, so the service-specific code just adds things those scripts expect to find and handles certain on-page actions. Since we do this all asynchronously, the page loads (and <em>feels</em> like it loads) as quickly as Millennium allows.</p>
<p>Being careful with the three widget services provided the biggest overall improvement to payload size and page rendering speed. Google Page Speed eliminated the warnings about redirects, uncompressed resources, request serialization, unminified javascript, and undeferred scripts.</p>
<p>What's funny about the terribleness coming from Bowker's servers is that a big part of improving the situation is both easy <em>and</em> a big sack of win. Users would get faster pages and Bowker'd save on bandwidth and hardware specs. Some quick apache config of mod_expires and mod_deflate is all that's required to pay dividends. A deployment scheme involving minification and/or a refactor of the connector scripts would be more time-consuming, but could make the widgets substantially faster. Serving out static scripts without query strings would be a huge help, for instance.</p>
<h4>More JavaScript Optimization</h4>
<p>I was more diligent about jQuery best practices like using <a href="http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-think-right-to-left-with-jquery/">fast selectors</a>, <a href="http://www.artzstudio.com/2009/04/jquery-performance-rules/#cache-jquery-objects">caching selected objects</a>, and <a href="http://thinkvitamin.com/code/john-resig-on-advanced-javascript-to-improve-your-web-app/">delegating events to their appropriate containers</a>.</p>
<p>Millennium has its own JavaScript library. It's ordinarily served out as 3 files, but we weren't having any of that. Our Millennium setup <a title="This is an old presentation" href="https://docs.google.com/viewer?url=http://www.rodmanlibrary.com/iug/egl2008/hackthepac.pdf">prevents the default files from loading</a>, and instead serves <a href="http://catalog.cantonpl.org/screens/iii.js">a single file with all three components minified</a>. iii.js is just under 20K before compression, and 5.2 over the wire. That's 2 fewer HTTP requests and 4.4K less payload on every page.</p>
<h4>Image Optimization</h4>
<p>I ran all the catalog images through <a href="http://pnggauntlet.com/">PNGGauntlet</a>, which uses <a href="http://advsys.net/ken/utils.htm">PNGOUT</a> to reduce file size — sometimes by 25% or more. For high-use files, I also weighed the quality reduction of making them 8-bit PNGs; the sprites, for instance, get served out as 8-bit files, making them substantially smaller.</p>
<h4>Web Server</h4>
<p>I also rolled out <a href="http://www.cantonpl.org/sites/all/themes/zen/cpl/sprites/site-sp-v011712r1.png">a sprite for the site</a>'s layout and theme, optimized the chat widget, and <a href="http://lowfatcats.com/blog/1-tutorial/18-how-to-optimize-javascript-css-linux-using-yui-compressor.html">combined and minified CSS files</a> for use by the catalog. Our web server, in contrast to the catalog, is pretty aggressive about caching. Files are served with far-future expires headers. APC for PHP caches the opcode to minimize file reads; this results in faster execution speed across the board, but not necessarily faster serving to the end user. We have <a href="http://drupal.org/">drupal</a> caching set up, which benefits from MySQL query caching. Apache gets some love from the OS's buffer cache. Altogether, the website is a layer of caches.</p>
<h3>What's Next</h3>
<p>I'd like to reduce the payload of every page on our site by rolling out a new theme. There's a lot of extraneous markup and styling that can get cut out pretty easily. Other possibilities:</p>
<ul>
<li>Optimize images as they're uploaded</li>
<li>Minify CSS and JavaScript on <a href="http://liquidninja.com/deploying-with-git/">theme deployment</a></li>
<li>Defer jQuery and other <a href="https://developer.mozilla.org/En/HTML/Element/Script#Attributes">scripts</a> on page loads</li>
<li>Put stuff into a <a href="http://www.html5rocks.com/en/tutorials/appcache/beginner/">cache manifest</a></li>
<li>Investigate <a href="http://code.google.com/speed/page-speed/docs/module.html">mod_pagespeed</a> to do some of this stuff automatically</li>
</ul>
<p>For the catalog, a few squeaks of extra speed could come from moving static files to our web server (which has longer cache lifetimes), combining the [minified] catalog CSS into the site CSS, and working with Syndetics to get book jackets from URLs without query parameters.</p>
<h3>tl;dr</h3>
<p><a href="http://code.google.com/speed/page-speed/index.html">Google Page Speed</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://hawidu.com/2012/03/16/your-fast-catalog/feed/</wfw:commentRss>
		<slash:comments>993</slash:comments>
		</item>
		<item>
		<title>Drupal and Git</title>
		<link>http://hawidu.com/2011/12/09/drupal-and-git/</link>
		<comments>http://hawidu.com/2011/12/09/drupal-and-git/#comments</comments>
		<pubDate>Sat, 10 Dec 2011 01:24:12 +0000</pubDate>
		<dc:creator>Brad Czerniak</dc:creator>
				<category><![CDATA[Web Design]]></category>

		<guid isPermaLink="false">http://hawidu.com/?p=331</guid>
		<description><![CDATA[I'm honored to have been selected to present at the first-ever DrupalCamp Michigan. The local Drupal community is super strong: they opened registration for 50 people and it sold out so quickly they expanded to 100. Not being a good public speaker at all, you'd think this might be daunting. However, a combination of under-preparedness [...]]]></description>
			<content:encoded><![CDATA[<p>I'm honored to have been selected to present at the first-ever <a href="http://drupalcampmi.org/">DrupalCamp Michigan</a>. The local Drupal community is super strong: they opened registration for 50 people and it sold out so quickly they expanded to 100. Not being a good public speaker at all, you'd think this might be daunting. However, a combination of under-preparedness and lack of sleep really put me in the right mindset. So, without further ado, here are the <a href="http://bit.ly/gitdrupal">slides</a> and a <a href="http://blip.tv/drupalcampmi/how-git-fits-into-your-workflow-5802593">video of the presentation</a>:</p>
<p><iframe src="https://docs.google.com/presentation/embed?id=13uh9jabl4MQ_W1LVbVc8H_O2wJlQ5ptL6MEKKihzjDI&amp;start=false&amp;loop=false&amp;delayms=30000" frameborder="0" width="480" height="389"></iframe></p>
<p><iframe src="http://blip.tv/play/h9h3guKVRQI.html" width="550" height="389" frameborder="0" allowfullscreen></iframe><embed type="application/x-shockwave-flash" src="http://a.blip.tv/api.swf#h9h3guKVRQI" style="display:none"></embed></p>
<h2>Notes</h2>
<h3>You've got the wrong guy</h3>
<p>I originally proposed this session not because I have a ton of experience on the topic and all the answers, but because I wanted to use presenting as an excuse to learn about <a href="http://git-scm.com/">git</a>.<br />
If you've been using git for a long time and/or have memorized large portions of the Drupal APIs, chances are you won't be able to learn much from me.</p>
<h3>WTF is a git!?</h3>
<p>The word git <a href="http://en.wikipedia.org/wiki/Git_%28software%29">was first a British slang word for an annoying or stupid perso</a>n. The software was named self-deprecatingly from that word. I like to think git stands for something else though: good shit.<br />
Git is a fast, distributed version control system.<br />
It was originally developed by Linus Torvalds in 2005 to be used for developing the Linux kernel</p>
<p>If you've used another version control system, you might wonder what sets git apart.<br />
From what I've gathered, the most important <a href="http://whygitisbetterthanx.com/">differences between git and other systems</a> are:</p>
<ul>
<li>Git is distributed — this is important, because having a local copy of a repo lets you access the version history easily, commit whenever it makes sense, and push it to one or more repositories, or remotes, based on the structure of your project</li>
<li>Git reduces the pain of merging, which means that you can make lots of branches without worry</li>
</ul>
<p>Other systems, like CVS, subversion, and others, are also considered slow for accomplishing certain tasks. While I don't have a great means of comparison, git seems pretty quick to do most everything.</p>
<h3>Drupal and Git</h3>
<p>The <a href="http://drupal.org/community-initiatives/git">Drupal project switched from CVS to git in February 2011</a>. The changeover is a 3-phase process, of which they're on phase 2.</p>
<ol>
<li>Phase 1 was a git mirror, so that people could test and develop in git without affecting the project</li>
<li>Phase 2 is a centralized model based entirely in git</li>
<li>Phase 3 will be a decentralized, GitHub-like model that will change the Drupal.org contribution workflow. Details are still being hashed out on that front</li>
</ol>
<h3>Local Tools</h3>
<p>Locally, there are a few tools that can make routine tasks fast and can integrate with the tools you already use.<br />
I'm a visual, GUI guy, especially for menial tasks. So I like <a href="http://code.google.com/p/tortoisegit/">TortoiseGit</a> on Windows, along with a <a href="http://forum.lowyat.net/topic/1358320/all">Git plugin for Notepad++</a>. TortoiseGit makes pushing changes a job of a few clicks. The Notepad++ plugin lets me press Ctrl+Alt+C, type a commit message, and click a button to commit changes to one or more files. If you think vi is a pain in the butt, tools like these are for you.</p>
<h3>Remote Tools</h3>
<p>It's probably not just you doing development. Even if it is, there's a compelling reason to have at least one central place for your repositories, which I'll explain later.</p>
<p>But a side reason to have bare remote repositories is that you can use tools intended for remotes, like <a href="http://www.redmine.org/">redmine</a>. Tools like this add another layer for project management. You can do project planning, bug tracking, wiki documentation, and other such tasks from a web interface, letting either you or your team keep track of things. And if your project is out in the open, you can leverage a much larger community using sites like <a href="https://github.com/ao5357">GitHub</a>, <a href="http://code.google.com/u/ao5357/">Google Code</a>, or SourceForge.</p>
<h3>Your First Repo</h3>
<p>Let's say you have a directory of files that you want to put under version control at that path. You'd go there in your terminal, then initiate a new repository. Next you'd add all the files. Those files are queued up and ready for the first commit, which you then perform.</p>
<p>If you don't use the 'm' option to add a commit message, the commit command will show the log entry for the commit in vi, and you put the commit message at the top. It's at this point that I'd like to reiterate that vi is a pain in the butt.</p>
<p>So that's how you create a new repo from bash</p>
<h3>Commands</h3>
<p>These are the git commands you might use in day-to-day work<br />
*Point at commands and explain what they do*<br />
^ Learn what the commands do</p>
<p>These commands are used less frequently (in general), but it's good to know about them<br />
bisect lets you determine where a bug began in the revision history, using a binary search to split the possibilities in half each time.</p>
<p>These are also git commands, though you might not use them very often or ever.<br />
stash is commit for wusses</p>
<h3>Workflow</h3>
<p>So let's talk workflow.</p>
<p>At my job I've got two Drupal sites: "Beta," which isn't really the right name for it, since at times it's a dev box and at others it's a beta-slash-QA machine.<br />
And the live site.<br />
The design and development parts of my job revolve around creating modules and themes to add functionality and enhance the design of just those two properties.</p>
<p>I'm guessing that's NOT what your jobs are like. I'm guessing you make lots of sites. And those sites in various states exist in multiple places, like your local dev machine, an internal server for testing, and external hosting that you don't necessarily control. I don't envy you.</p>
<h3>Wherein I Tell You Not To Hack the Core</h3>
<p>A site is Drupal core, plus contrib, plus the data in your database.</p>
<p>Since Drupal is modular and nearly everything can be changed via hooks, it's really pretty rare that you have to change anything in core. And if you do, I've found from experience that it's usually for temporary debugging rather than for permanent changes.</p>
<p>Do not hack core.</p>
<h3>Avoiding Temptation</h3>
<p>So from Do Not Hack Core we can take away that all the things on the left are things you shouldn't mess with, and the thing on the right is the only place that customizations go (unless you have a weird multisite setup, which is cool, but your workflow's going to be different).</p>
<p>A repo at the whole site level is redundant, and reinforces the opposite of the number 1 best practice of the Drupal site-building community.</p>
<h3>Drilling Down</h3>
<p>What about at the 'sites' level?<br />
This is workable, but you might notice something immediately.</p>
<p>Look at the sites/all/modules directory.<br />
You're probably not going to be hacking contrib either! All of those modules are version tracked in git on the drupal.org site. The vast majority of those modules require zero coding to work exactly as expected. Putting them under version control doesn't accomplish much.</p>
<p>Then there's sites/default<br />
sites/default/files contains uploaded and attached files. Those files are site-specific and are subject to database dependencies. The files also tend to be images and other files that are unlikely to change. There are a number of reasons why version controlling those files is impractical.</p>
<p>On the other hand, sites/default/settings.php is a good candidate for revision control individually, as it's something that you have to work on in the development process, and some of the settings will likely have to change depending on where the site lives. The branching model of git could be really useful for this purpose.</p>
<h3>.gitignore Files</h3>
<p>One way to wrangle sites/default/files and streamline the process is with .gitignore files. With a well-made, well-placed .gitignore file or two, you can continue using git add . and git commit -a without adding stuff you don't want to your project.</p>
<p>.gitignore files let you choose files to omit from the versioning index, based on wildcard notation. So instead of omitting /sites/default/files wholesale, for instance, you could just selectively ignore boring images and junk while preserving the directory structure wherever the repo might end up.</p>
<h3>What You're Controlling</h3>
<p>Conceptually, the two components that you're likely to work on that can most benefit from version control are:</p>
<ol>
<li>Customizing the theme to the client's needs</li>
<li>Developing custom modules or modifying one or more contrib modules</li>
</ol>
<p>If you start with a working theme, like Zen, you can clone down a repo from Drupal.org and use the history of that particular part of the project if you need it. You can create your own branch for your theme and develop from there.</p>
<p>If you code up a custom module, it might only be useful for a single site a single time. But maybe the functionality you add is something that other clients might want, or that can be contributed back to the Drupal community. Modules are reusable pieces, so structuring your repository environment to make them accessible for all sorts of projects is a plus.</p>
<h3>Hypothetical Model</h3>
<p>Here's an example of what repositories on a central server might look like.</p>
<p>I made the directory structure here very flat, putting core, modules, themes, and the site_projects repositories all within a single folder. This would work well if you always use the same base theme along with a limited number of custom modules. This particular setup plays nice with management software like redmine, which is one reason a flat structure is attractive.</p>
<p>If you're going to have lots of distinct themes and modules, it might be helpful to create big repos called modules and themes, then use git's submodules functionality to manage the individual drupal modules contained within. Thanks Ben for the submodules tip!</p>
<p>Now that we have a central place for all the things we're working on related to building our sites, we can optimize our workflow to play nice with version control.</p>
<h3>Leveraging Synergy</h3>
<p>One way to do that is to set up pushing and pulling.</p>
<p>If you don't already have ssh keys set up between your development box and your repository server, setting that up will make it a lot quicker to push and pull from git. If you want to deploy via git from the repo server to other machines like your site testing server or even live web server, you'll also want to set up ssh keys between the those boxes.<br />
On your local dev box, use the clone command to make a local version of the repo on your server. When you do that, the source repo becomes a 'remote' called origin.</p>
<p>Make some changes to the local copy (you can branch if you want to, you can leave master behind). When you're done making changes and they're ready for other people in your shop to see/use them, use the push command to send them back to the origin.</p>
<h3>Drush Make and Install Profiles</h3>
<p>Once the changes are on the server, you can pull them to your deployment boxes, or...<br />
You can get fancy.</p>
<p>It's a common use case: you end up using the same base theme, modules, configurations, and other tweaks on most of your projects. You might already have an "install profile" informally; Drupal with all the stuff you use all in one place.</p>
<p>The "drush make" command lets you generate makefiles that turn your informal install profiles into the real deal. In Drupal 7 it's easier to make profiles that configure things on install, but technically it should be possible in D6 too. Some combination of the features, strongarm, context, and other helper modules could let you automate some impressive stuff — like pre-built views.</p>
<p>Hint: it might be manual coding work, but if you install a whole bunch of similar sites, writing a [profile name].install file could be a time-saver in the long run. Especially if you swipe one from an existing public profile and suit it to your needs.</p>
<p>You can use the drush make command to import all the dependencies for your profile wherever you need them. Then just run the installer (which if you're super fancy you could get working with drush site-install) to have a functional site in the time it takes to make a pot of coffee because your junior dev doesn't know proper coffee machine etiquette.</p>
<p>The makefiles are really flexible, so you can choose particular version numbers of modules for compatibility, apply patch files to change modules or core code, or grab external libraries from tarballs.<br />
Nailing down a "holy grail" workflow for this sort of development takes time and effort, and I certainly don't have all the answers.</p>
<p>Over the next few weeks, Alex Fisher and I will be working on drush make and workflows, and will report useful findings to our respective blogs.</p>
<p>You may also ask about how to go from local dev to testing to quality assurance to live, all while easily managing your databases. You may ask that, but I don't have an answer. Sorry.</p>
<h3>Pay it Forward</h3>
<p>If you'd like to become a core developer or get involved in a contrib project, a working knowledge of git will help.</p>
<p>I'm fighting the urge to give nitty-gritty details here, as the instructions are both technical and well-documented. If you're not a project maintainer, contributing code involves creating patch files based on numbers from the issue queue. If you are a project maintainer, you can interact directly with the remote repo (albeit while following the guidelines).</p>
<p>One reason I'm avoiding an in-depth explanation is that the Phase 3 git migration could very well change how things get developed on Drupal.org.<br />
But here's how to create a patch file, just in case.</p>
<p>Just one commit is the easiest for contributing back patches.</p>
<p>The Version Control tab on project pages gives really good instructions for grabbing source repos and other contibution tasks, including the specific clone command you need to grab a local copy of the repository.</p>
<p>So now that you're a git expert, go out there and contribute back to the Drupal community!<br />
Thanks for putting up with me!</p>
]]></content:encoded>
			<wfw:commentRss>http://hawidu.com/2011/12/09/drupal-and-git/feed/</wfw:commentRss>
		<slash:comments>1085</slash:comments>
		</item>
		<item>
		<title>Another Responsive Data Tables Approach</title>
		<link>http://hawidu.com/2011/04/27/another-responsive-data-tables-approach/</link>
		<comments>http://hawidu.com/2011/04/27/another-responsive-data-tables-approach/#comments</comments>
		<pubDate>Wed, 27 Apr 2011 22:16:55 +0000</pubDate>
		<dc:creator>Brad Czerniak</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Web Design]]></category>

		<guid isPermaLink="false">http://hawidu.com/?p=283</guid>
		<description><![CDATA[Chris Coyier posted a nice, working solution to a real problem over at CSS-Tricks. Basically, CSS lets you style your website to look and work well on mobile devices by over-writing the styles of your full-size website. There are performance drawbacks to this approach, but for the most part it's the best-of-all-possible-worlds solution. One thorny [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://chriscoyier.net/">Chris Coyier</a> posted a nice, working <a href="http://css-tricks.com/responsive-data-tables/">solution to a real problem over at CSS-Tricks</a>. Basically, CSS lets you style your website to look and work well on mobile devices <a href="http://www.alistapart.com/articles/responsive-web-design/">by over-writing the styles of your full-size website</a>. There are performance drawbacks to this approach, but for the most part it's the best-of-all-possible-worlds solution.</p>
<p>One thorny problem, though, is over-riding the style of certain elements that use the width of the screen liberally by default. One such element is the venerable <a href="http://www.w3schools.com/tags/tag_table.asp">data table</a>.</p>
<p>Coyier's solution is great in that each table cell is labeled. However, doing this requires either writing CSS manually for every data table on the site (which is near-impossible for large sites) or having the same thing done with scripting on either the server or client side:</p>
<p><a href="http://hawidu.com/wp-content/uploads/2011/04/Screen-shot-2011-04-27-at-6.03.36-PM.png"><img class="alignnone size-medium wp-image-284" title="Screen shot of manual labels in CSS" src="http://hawidu.com/wp-content/uploads/2011/04/Screen-shot-2011-04-27-at-6.03.36-PM-300x191.png" alt="" width="300" height="191" /></a></p>
<p>I propose a generalized solution that requires no scripting whatsoever. The drawback of this method, though, is that the cells are not individually labeled. The example is also more compact, but this aspect can be tweaked by marrying the two methods:<br />
<code><br />
@media screen and (max-width:720px){<br />
	table{display:block;}<br />
		td,thead th{border-color:#444;border-style:solid;border-width:0 2px 0 0;display:inline;float:left;}<br />
			td:last-child,th:last-child{border-right:0 none;}<br />
		thead th{background:transparent;font-size:1.1em;}<br />
		tr{display:block;float:left;clear:left;padding:6px 0;width:100%;}<br />
			thead tr{border-bottom:4px solid #444;margin:0 0 .3em 0;padding:0 0 .2em 0;}<br />
		tbody tr:nth-child(even){background:#ddd;}<br />
		td:nth-child(5n+1),th:nth-child(5n+1){background:#FFD8D8;}<br />
		td:nth-child(5n+2),th:nth-child(5n+2){background:#FFE8D8;}<br />
		td:nth-child(5n+3),th:nth-child(5n+3){background:#FFF8D8;}<br />
		td:nth-child(5n+4),th:nth-child(5n+4){background:#D8FFD8;}<br />
		td:nth-child(5n+5),th:nth-child(5n+5){background:#D8D8FF;}<br />
}<br />
</code><br />
<a href="http://hawidu.com/responsivetables/">Open the working demo</a> and resize your window to under 720 pixels wide to see the effect. I call this approach the "<a href="http://en.wikipedia.org/wiki/Rainbow_table">Rainbow Table</a>s" method <img src='http://hawidu.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Thanks to <a href="https://twitter.com/chriscoyier">Chris Coyier</a> for posting a thoughtful working solution, and thereby motivating me to post about my approach after <a href="http://twitpic.com/21a4do">sitting on it (in production no less!) for almost a year</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://hawidu.com/2011/04/27/another-responsive-data-tables-approach/feed/</wfw:commentRss>
		<slash:comments>794</slash:comments>
		</item>
		<item>
		<title>Resist That Advice</title>
		<link>http://hawidu.com/2011/03/03/resist-that-advice/</link>
		<comments>http://hawidu.com/2011/03/03/resist-that-advice/#comments</comments>
		<pubDate>Fri, 04 Mar 2011 03:18:18 +0000</pubDate>
		<dc:creator>Brad Czerniak</dc:creator>
				<category><![CDATA[Libraries]]></category>
		<category><![CDATA[Web Design]]></category>

		<guid isPermaLink="false">http://hawidu.com/?p=271</guid>
		<description><![CDATA[I'd like to touch briefly on a widely-circulated LJ post by Aaron Schmidt entitled Resist That Redesign. It is generally good advice – using iterative website design rather than relying on complete redesigns. However, I think the advice needs better context. For one thing, most library websites are really outdated and bad. Comparing the design/development [...]]]></description>
			<content:encoded><![CDATA[<p>I'd like to touch briefly on a widely-circulated LJ post by <a href="http://twitter.com/walkingpaper">Aaron Schmidt</a> entitled <a href="http://www.libraryjournal.com/lj/communityopinion/889081-274/resist_that_redesign__the.html.csp">Resist That Redesign</a>. It is generally good advice – using iterative website design rather than relying on complete redesigns. However, I think the advice needs better context.</p>
<p>For one thing, most library websites are really outdated and bad. Comparing the design/development workflows of Apple and Google (nice!) or Amazon and Netflix (not exactly gems of design) to how libraries maintain their sites is apples-to-oranges. If a library has a flat-file website (Not a straw man: this is common in libraries!), performing a complete redesign/redevelopment is probably advisable. <strong>A "slowly evolved" CMS developed in-house at a library is likely to be slapdash</strong>, and there are tons of <a href="http://drupal.org/">available CMSes</a> that are well-designed, secure, free, and supported.</p>
<p>What's not mentioned in the original post is that redesigns don't have to be long, painstaking processes. <em>Bad</em> redesign processes are that way, but a sufficiently-experienced and talented designer can ease those woes. <strong>The solution for doing a good redesign is to have a good designer</strong>.</p>
<p>Likewise, iterative design isn't always a breezy process, and it often isn't design. Design needs control; website creative control is often lacking in library environments. What often ends up happening under the guise of "iterative design" is actually a patchwork; sometimes from having too many cooks in the kitchen, sometimes from having one crummy cook. We've all seen these websites; they start out clean and freshly-designed. Then someone pastes in a widget and it clashes with the design. Then comes more widgets ad nauseum until the site looks and works awful. As such, <strong>the solution for doing good iterative design is to have a good designer</strong>.</p>
<p>Library folks: don't resist redesigns. <strong>If a well-designed website is important to you, hire a good web designer</strong>. Trust their judgment to decide whether the best course of action is to iteratively improve your site or to do a full redesign.</p>
]]></content:encoded>
			<wfw:commentRss>http://hawidu.com/2011/03/03/resist-that-advice/feed/</wfw:commentRss>
		<slash:comments>842</slash:comments>
		</item>
		<item>
		<title>Drupal is the Answer</title>
		<link>http://hawidu.com/2010/06/23/drupal-is-the-answer/</link>
		<comments>http://hawidu.com/2010/06/23/drupal-is-the-answer/#comments</comments>
		<pubDate>Thu, 24 Jun 2010 02:44:36 +0000</pubDate>
		<dc:creator>Brad Czerniak</dc:creator>
				<category><![CDATA[Web Design]]></category>

		<guid isPermaLink="false">http://hawidu.com/?p=201</guid>
		<description><![CDATA[Here are the slides and notes from my June 16th presentation for Refresh Detroit. I was fortunate enough to be joined by Alex Fisher and Stephen Colson, who really brought everything together and luckily had all the answers. Thanks again, guys. The following notes do not reflect the actual presentation. If video evidence comes along [...]]]></description>
			<content:encoded><![CDATA[<p>Here are the slides and notes from my <a href="http://refresh-detroit.org/2010/06/22/recap-drupal/">June 16th presentation for Refresh Detroit</a>. I was fortunate enough to be joined by <a href="http://www.commercialprogression.com/">Alex Fisher</a> and <a href="http://switchbackcms.com/">Stephen Colson</a>, who really brought everything together and luckily had all the answers. Thanks again, guys.</p>
<p><iframe src="http://docs.google.com/present/embed?id=dhsbt2xj_455hj4c9vgb&#038;size=m" frameborder="0" width="555" height="451"></iframe></p>
<p>The following notes do not reflect the actual presentation. If video evidence comes along to prove this, I will add it to the bottom of the post.</p>
<h2>Slide 1 - Welcome</h2>
<p>Hey, I'm Brad  Czerniak. I'm the web guy at <a href="http://www.cantonpl.org/">Canton Public Library</a>.</p>
<p>Thank you very much for coming to see this  presentation today. And especially thank you to <a href="http://lireo.com/">Deborah</a>, for inviting us  to speak. I hope that what we're talking about will be useful.</p>
<p>My presentation is decidedly impractical - I'm  gonna try to explain what Drupal is and some of how it works.</p>
<p>I'll be followed by two really energetic and  talented guys: <a href="http://www.commercialprogression.com/">Alex Fisher from Commercial Progression</a>, and  <a href="http://switchbackcms.com/">Stephen Colson from Switchback CMS</a>. They will put  the rest of the puzzle together with real world sites and practical demos.</p>
<p>Before  moving on, I'd like to thank all the people who contributed to this crowdsourced presentation, and all the <a href="http://www.facebook.com/group.php?gid=108075972555061&amp;ref=ts">local</a> <a href="http://www.meetup.com/midrupal/">Drupal</a> user <a href="http://groups.drupal.org/ann-arbor">groups</a> for  their support and advice.</p>
<h2>Slide 2 - Drupal is <span style="text-decoration: line-through;">a free &amp; open source content management system</span> the answer</h2>
<p><strong>So, right off the bat</strong>:</p>
<p><a href="http://www.drupal.org/">Drupal</a> is free and open source. It's released under the <a href="http://www.gnu.org/licenses/licenses.html#GPL">GNU Public License</a>, which is the same license used for the Linux kernel and around 60% of open source software.</p>
<p>You may have  heard of LAMP. I love lamp. It stands for</p>
<ul>
<li><a href="http://en.wikipedia.org/wiki/Linux">Linux</a></li>
<li><a href="http://en.wikipedia.org/wiki/Apache_HTTP_Server">Apache</a></li>
<li><a href="http://en.wikipedia.org/wiki/Mysql">MySQL</a></li>
<li><a href="http://en.wikipedia.org/wiki/Php">PHP</a></li>
</ul>
<p>While Drupal could be considered a typical LAMP application, you should note that only the P is strictly necessary. It can run on Windows or Mac, with various web servers, and with a few different database systems. It is written in the PHP programming language, so you're kinda stuck with  that requirement.</p>
<p>It's been  around for nearly 10 years and a <a href="http://drupal.org/project/drupal">whole new version</a> is set to be released soon.</p>
<p><strong>Drupal is the answer, but what's the question?</strong>:</p>
<ul>
<li>Do you want a powerful website?</li>
<li>Do  you want to add more features later?</li>
<li>Do you need support?</li>
<li>Do  you want different users to do different stuff?</li>
<li>Do you want  options? There's an easy way and a hard way for everything in Drupal*</li>
</ul>
<p>I  have to admit something now.</p>
<h2>Slide 3 - Drupal kinda sucks (right out of the box)</h2>
<p>If I have learned anything in the last two years, it's that Drupal is  not a <a href="http://en.wikipedia.org/wiki/Ron_Popeil#Inventions">Ronco Showtime Rotisserie</a></p>
<p>It's not  "Set it and forget it"</p>
<p>This out-of-the-box  unimpressiveness is by design, though. The use case for Drupal is for a site more sophisticated than a small personal blog. It's assumed that  you'll customize the site to some degree before unleashing it on the  public. It's not strictly necessary, but a site based on a basic Drupal  install won't turn any heads.</p>
<p>Drupal  also has a notorious learning curve, partly due to an administrative interface that tends to scare away beginners. Luckily, one of the big features for the upcoming version is a <a href="http://groups.drupal.org/usability">big improvement in usability</a>.</p>
<p>Let's take a look at what you get out of the  box.</p>
<h2>Slide 4 - Your New Site</h2>
<p>It's like this.</p>
<p>A blue-and-gray theme called "Garland" is set by default, and you have two  content types - page and story.</p>
<p>If you install  Drupal for the first time, this can be an incredibly scary sight.</p>
<p>Content types are  important: They range from "blog post" to page to a form to external  content from RSS feeds to whatever you can dream up. Each content type  has a bunch of options:</p>
<ul>
<li>Whether  or not you want them to take user comments</li>
<li>Which users you want  to be able to create, edit, or delete content of that type</li>
<li>Whether  you want new posts of that type to show up on the homepage</li>
</ul>
<p>Stuff  like that. You can set all of that on your website if you're an  administrator. No coding necessary. Once you get the hang of it, It's  really easy and flexible.</p>
<h2>Slide 5 - The Happy Middle</h2>
<p>And it's that flexibility and ability to do complex things without  code that sets Drupal apart from other solutions.</p>
<p>Here on the left we have <a href="http://en.wikipedia.org/wiki/Ruby_on_Rails">Rails</a>, <a href="http://en.wikipedia.org/wiki/Django_%28web_framework%29">Django</a>, and <a href="http://en.wikipedia.org/wiki/CodeIgniter#CodeIgniter"> CodeIgniter</a>. The basic idea behind all three of them is that they're  frameworks - tools for building web applications that help you do it  quicker than starting from scratch and using some basic guidelines to  make sure they don't suck.</p>
<p>But,  when you install them, you have to write code before you even have a  basic webpage.</p>
<p>On the right we  have <a href="http://en.wikipedia.org/wiki/Wordpress">WordPress</a> and <a href="http://en.wikipedia.org/wiki/Mediawiki">MediaWiki</a>. WordPress powers almost every personal  blog on the web. It has like 200 million installs.</p>
<p>MediaWiki is the software that powers Wikipedia  and a ton of other sites.</p>
<p>When you  install them you're up and running. You don't need to worry about the  particulars - just add content. These applications are great if you want  a blog or a wiki, but they take a lot of work and aren't really  intended to do much custom stuff with them.</p>
<p>Drupal  sits in the middle. It gives you the flexibility of coding a site  yourself and the beginnings of common website use cases right when you  install it.</p>
<h2>Slide 6 - Sweet, Sweet Nodes</h2>
<p>So that's sweet, right?</p>
<p>One  of the scary words that's really important to understanding Drupal and  talking shop with other Drupalistas is 'node.'</p>
<p>A node is an individual page or blog post or  whatever you've dreamed up.</p>
<p>All  the real content of your site is made up of nodes. Everything is a node.</p>
<p>Node node node.</p>
<p>It  might help to think of a node as a note. Or it might not. But a note or  a memo has a subject line or title and some content. All Drupal nodes  have those things too.</p>
<p>If you want  to organize your notes you might put them in folders or attach Post-Its  to them. This is kind of how Taxonomy works.</p>
<p>Taxonomy  is another one of the scary words.</p>
<p>Here's  the skinny. A taxonomy is a list of descriptive terms. Each term is  like one tag in a tag cloud. You can stick these tags to any node and  use them to organize your content.</p>
<p>Down  here we have the tape dispenser, labeled CCK. That stands for <a href="http://drupal.org/project/cck">Content  Construction Kit</a>. I'll talk about Modules in the next slide and Steve  will demonstrate CCK specifically, but the general idea is that CCK lets  you attach all kinds of funky things to your notes - like photos and  even whole other notes.</p>
<h2>Slide 7 - Modulez, Drupal Enhancement</h2>
<p>There are 5703 total modules. That's a lot.</p>
<p>A <a href="http://drupal.org/project/modules">module</a> extends (extenze, get it?) what Drupal  does. In fact, Drupal is made up almost entirely of modules. Each one  performs some small role.</p>
<p>So  there's a module called node that does stuff for the nodes from the last  slide.</p>
<p>There's a module called  menu. Confusingly, it mostly has to do with URLs, but kinda not really.  It's one of the things you only have to learn at 1:00AM on a weekend  while wired on Mountain Dew. So we'll skip over that for now.</p>
<p>Those  are modules that come pre-packed when you download Drupal core.</p>
<p>Then there  (contributed) modules nicknamed contrib  modules. These are written by the community to make Drupal awesomer.</p>
<p>CCK  from the last slide is a contrib module lets you add more stuff to your  nodes.</p>
<p><a href="http://drupal.org/project/pathauto">Pathauto</a> lets you make friendly URLs with  tons of options</p>
<p><a href="http://drupal.org/project/rules">Rules</a> lets make things happen on  your site. It's a good example of the "easy way" of working in Drupal.</p>
<p>There are modules to give you fancy  calendars, Word-like rich text editors, and 5700 other cool things.</p>
<h2>Slide 8 - Umbday Exampleway</h2>
<p>So here's a rich text editor. You can pick which one <a href="http://drupal.org/project/ckeditor">you want to  use</a> from a bunch of different cool options, then install the module and  set it up.</p>
<p>Boom! Now you have  WYSIWYG capability. And you have options, just like the Drupal gods  intended.</p>
<p>Here in the text box we  have some pig latin. If you aren't fluent, it says "This is a really  dumb example."</p>
<p>It's a dumb example  because --</p>
<p>Well... let's say you  want to make a node and you want that <a href="http://drupal.org/project/dialectic">node to appear in pig latin</a> to  your users.</p>
<p>You can type it out in  plain English and let Drupal do the translation for you.</p>
<p>There  are many modules that let you type in wiki syntax or markdown or plain  URLs or ISBN numbers and the module turns it into something cool for  your users when they view the page. At the library, for instance, we use  double square brackets and links to books in our catalog to import book  cover images and the title and author and stuff. This is a real time  saver and it's all automatic.</p>
<p>And you can mix and  match these filters. If you want to <a href="http://drupal.org/project/htmlpurifier">strip out certain html tags</a> from  the text AND <a href="http://drupal.org/project/pirate">put the text in Pirate-speak</a>, no problem!</p>
<p>This particular example is dumb because when  you're creating or editing that node, you'd just see English. So silly.</p>
<p>Drupal also has non-ridiculous translation  built right in. You can put your menus and other site text in other  languages and switch it for different users and all kinds of stuff. If  that's an important part of your project then you'll be stumbling into a  funky corner of Drupal's learning curve.</p>
<h2>Slide 9 - Users</h2>
<p>One of the most powerful features of Drupal lies with User  management.</p>
<p>Out of the box it  handles sessions and cookies and usernames and passwords and all the  stuff that's a big pain in the butt to get right yourself.</p>
<p>On top of that, you can assign permissions to  users in a really common sense way.</p>
<p>You  can create roles. Roles are containers for much more specific  permissions. An example of a permission is "User can edit their own blog  posts."</p>
<p>So an admin is free to do  anything on the site. A signed-in user can do some things, but is  restricted depending on what roles on the site they've been assigned.</p>
<p>A visitor CAN have permissions, but generally  can just view stuff through their binoculars.</p>
<p>When  you install modules, they often give you new permissions that you can  assign, so it's really easy to make sure that the right people can see  and do the right things.</p>
<h2>Slide 10 - API</h2>
<p>This ability for modules to tie into what Drupal does is because of  the <a href="http://api.drupal.org/">API</a>.</p>
<p>API stands for  Application Programming Interface. It's the way that programmers can  interact with the code and data in an application.</p>
<p>Drupal's API is full of these things called  hooks. These hooks let you add stuff to Drupal in a standard way.</p>
<p>For  instance, when writing a module you might want to use <a href="http://api.drupal.org/api/function/hook_user/6">hook_user</a>. Your  code might say - when a user signs in, redirect them to a different  page.</p>
<p>When one things happens, do other stuff.</p>
<p>Once  you get the hang of it, writing code for Drupal makes a lot of sense.</p>
<h2>Slide 11 - Page Theming</h2>
<p>Along with coding modules, you can also code themes.</p>
<p>You can hard-code HTML into your theme, or put  little bits of PHP in there to display the content from the database  exactly how you want it.</p>
<p>If you  use the default template language, called PHPTemplate, you can specify  regions on your page to hold blocks of dynamic content stored in your  database.</p>
<p>You can move these  blocks around from your browser. Once your theme is coded it's really  easy to put stuff where you want it.</p>
<p>Your  theme consists of a bunch of template files. This one is for an entire  page.</p>
<h2>Slide 12 - Node Theming</h2>
<p>This one is for a single node. A page can have more than one node  displayed at a time, and those nodes can be of many different content  types.</p>
<p>Does that make any sense?</p>
<p>Think of a bag of jelly beans. The page itself  is like the bag. It wraps around all the good stuff.</p>
<p>Each node is like a jelly bean. All the buttered  popcorn flavored beans are from the product content type.</p>
<p>But the bag also has black licorice beans.  These could be wiki entries.</p>
<p>The one page could  show products and wiki entries in one listing.</p>
<p>And  the cool part is that you can make them display however you'd like  using template files.</p>
<p>This doesn't speak to how  gross a bag of popcorn and licorice jelly beans would be, but this is  America so you're free to fill that bag however you'd like.</p>
<h2>Slide 13 - jQuery is Money</h2>
<p>Nothing's better than esoteric programming double entendres.</p>
<p>If you know <a href="http://jquery.com/">jQuery</a>, you know that the shorthand  for the base function is the dollar sign.</p>
<p>But  I also mean that jQuery is money. <a href="http://www.imdb.com/title/tt0117802/quotes">jQuery is so money and it doesn't  even know it!</a></p>
<p>jQuery is baked in  to Drupal's core. You can even code up your JavaScript is a very  Drupal-ish way using Drupal's concepts of behaviors, settings, and  locales.</p>
<p>But that's not all!</p>
<p>You can use all the same web standards that  everyone else uses, or go your own way.</p>
<p>If  you want to use a particular CSS Framework, there's probably a  pre-existing theme to do it, or you can roll your own.</p>
<p>If you want to do everything in HTML5, Drupal  won't complain.</p>
<p>If you want some  visitors of your site to view your pages in full size and others to get a  mobile page, that's very doable.</p>
<p>Drupal  lets you do what you already know and gets out of your way.</p>
<h2>Slide 14 - All the cool kids are doing it</h2>
<p>What else can I say to convince you that Drupal will work for your  site at the scale you need?</p>
<p><a href="http://en.wikipedia.org/wiki/Argumentum_ad_populum">Argumentum  ad Populum</a>. Translated from the Latin it means "All the cool kids are  doing it."</p>
<p>There are a lot more  prominent sites and organizations using Drupal, but these sites are  notable because you're in Drupal when you get to the home page and most  if not all of the content is in Drupal.</p>
<p>That's  a powerful indication of the trust organizations place in Drupal and  the ability of it to suit complex needs.</p>
<h2>Slide 15 - Support</h2>
<p>Another great selling point is the available support.</p>
<p>You  can get help directly from the Community via <a href="http://drupal.org/irc">IRC</a>, <a href="http://drupal.org/forum-posting">Forums</a>,and other  avenues.</p>
<p>You can get materials ranging from books  to videos and more from <a href="http://www.lullabot.com/">Lullabot</a>, <a href="http://apress.com/">Apress</a>, and other publishers</p>
<p>The  creator of Drupal has a company called <a href="http://acquia.com/">Acquia</a> that also lends support.</p>
<p>The  documentation for every aspect of Drupal is amazing. If you want a  quick <a href="http://drupal.org/getting-started/before">how-to for a beginner</a> it's on the Drupal site. If you need  in-depth documentation of the API, it's there too.</p>
<p>Each  module has an issue queue. These are really handy for seeing if the  issue you run into is a known bug or a <a href="http://en.wikipedia.org/wiki/User_error">picnic error</a>.</p>
<p>Most any problem you run in to likely has a  forum post or page on the Drupal site. The site search is arguably the  best tool for getting the support you need.</p>
<p>There  are also plentiful user and developer groups. There are at least  three in Metro Detroit.</p>
<p>You can  also hire a firm to develop, design, consult, or for individual bounties  to develop a particular feature.</p>
<p>Options.  Drupal gives you options.</p>
<p>One  more thing...</p>
<h2>Slide 16 - One More Thing... (Views)</h2>
<p><a href="http://drupal.org/project/views">Views</a> makes a Developer's life so much easier.</p>
<p>I'm not ashamed to admit that I frequently take  the lazy route. Views is the lazy route in a very real and very cool  way.</p>
<p>Remember the jelly beans?  Let's say all the content on your site is a big tub of jelly beans.</p>
<p>Views lets you put whichever beans from the tub  you want in whichever bag you want.</p>
<p>If  you want an RSS feed with just the images from your products in order  by the date they were last edited, you can do that by playing around in  Views for a couple minutes.</p>
<p>If you  want a block in the sidebar with the latest posts from one user's blog,  that's a cinch.</p>
<p>If you want a  page of all the posts tagged chicken in reverse-title order, you can do  that.</p>
<p>With Views. Views is a  miracle wrapped in a magic trick.</p>
<p>Views  makes learning Drupal SO worth it.</p>
]]></content:encoded>
			<wfw:commentRss>http://hawidu.com/2010/06/23/drupal-is-the-answer/feed/</wfw:commentRss>
		<slash:comments>1069</slash:comments>
		</item>
		<item>
		<title>iPhone alarm clock improvements</title>
		<link>http://hawidu.com/2009/01/17/iphone-alarm-clock-improvements/</link>
		<comments>http://hawidu.com/2009/01/17/iphone-alarm-clock-improvements/#comments</comments>
		<pubDate>Sun, 18 Jan 2009 03:12:34 +0000</pubDate>
		<dc:creator>Brad Czerniak</dc:creator>
				<category><![CDATA[Web Design]]></category>
		<category><![CDATA[alarm clock]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://hawidu.com/?p=137</guid>
		<description><![CDATA[You're like me: you use your iPhone as an alarm clock. You even cued up Sonny &#38; Cher's "I Got You Babe" to play just like in Groundhog Day (to remind yourself every morning that the only way to beat the futility of day-to-day life is to strive for what you really want). Yeah, you're [...]]]></description>
			<content:encoded><![CDATA[<p>You're like me: you use your iPhone as an alarm clock. You even cued up <a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewAlbum?i=855403&amp;id=855409&amp;s=143441">Sonny &amp; Cher's "I Got You Babe"</a> to play just like in <a href="http://www.youtube.com/watch?v=eZbtAFq7dP8">Groundhog Day</a> (to remind yourself every morning that the only way to beat the futility of day-to-day life is to strive for what you really want).</p>
<p>Yeah, you're like me. So I'm going to assume these things are true too:</p>
<ul>
<li>When you wake up, the lights are off and your eyes have been closed for 4-12 hours</li>
<li>You've kind of enjoyed being asleep, and are kinda cranky at whatever's making that racket</li>
<li>When I say cranky, I mean your judgment may be a little impaired too</li>
</ul>
<p>What am I getting at here? The iPhone alarm clock is really usable -- it's easy to set, fairly customizable, can schedule alarms really well, and is reliable as it gets. The only time that the usability sucks is when you're just waking up. Here's what it looks like when the alarm goes off:<br />
<img class="aligncenter size-full wp-image-138" title="img_0003" src="http://hawidu.com/wp-content/uploads/2009/01/img_0003.png" alt="img_0003" width="320" height="480" />Here are the problems with this in my opinion:</p>
<ol>
<li>It uses your default wallpaper, which could be blindingly bright with undilated pupils and other changes to the eye that occur in low-light conditions</li>
<li>The text is small, condensed, and white, making it hard to read because optical resolution is lower at low-light conditions, and the brightness of the letters makes halos around each one</li>
<li>The snooze button is small, and fumbling around for it can be very frustrating</li>
<li>On an older-fashioned alarm clock, you don't actually read the word "Snooze" when you hit the button -- it's just the big button on top. Reading the word makes you mentally connect-the-dots. Call me weird, but sometimes when I wake up and read the word Snooze on the phone I think I'm in some Dr. Seuss-esque dream</li>
</ol>
<p>So I propose an interface more like this:</p>
<p><img class="aligncenter size-full wp-image-141" title="alarming" src="http://hawidu.com/wp-content/uploads/2009/01/alarming.png" alt="alarming" width="320" height="480" />An Apple designer could make it prettier, but the basic ideas are there. The background is black, all elements are - at brightest - 74% gray, the Snooze button is about twice as large, and it says Sleep instead of Snooze. Also, it doesn't really break from the core iPhone UI; the same slider bar, clock, top bar, and dialog colors are all present (though I used black text in the button for contrast's sake).</p>
<p>If you'd like to know more about human vision in low-light conditions, check out these Wikipedia articles for starters: <a href="http://en.wikipedia.org/wiki/Rod_cell">Rod cell</a>, <a href="http://en.wikipedia.org/wiki/Scotopic_vision">Scotopic vision</a>, <a href="http://en.wikipedia.org/wiki/Adaptation_(eye)">Adaptation (eye)</a>. Also, for some User Interface advice, knowing about <a href="http://en.wikipedia.org/wiki/Fitts%27s_law">Fitts' law</a> could be really handy.</p>
<p>It would also be great if there were an easy indicator to know when it's in Snooze mode. I often set a second alarm because I'm not sure, so then there are two alarms going concurrently. Then, as I finish checking my email and Facebook, a little dialog shows up and I hear that damned song again. How about putting the number of Snooze minutes left inside of the alarm indicator in the top bar? Thanks.</p>
]]></content:encoded>
			<wfw:commentRss>http://hawidu.com/2009/01/17/iphone-alarm-clock-improvements/feed/</wfw:commentRss>
		<slash:comments>916</slash:comments>
		</item>
		<item>
		<title>Help me with my resume</title>
		<link>http://hawidu.com/2008/03/09/help-me-with-my-resume/</link>
		<comments>http://hawidu.com/2008/03/09/help-me-with-my-resume/#comments</comments>
		<pubDate>Sun, 09 Mar 2008 04:10:23 +0000</pubDate>
		<dc:creator>Brad Czerniak</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Web Design]]></category>

		<guid isPermaLink="false">http://hawidu.com/2008/03/09/help-me-with-my-resume/</guid>
		<description><![CDATA[My resume is finally ready for the web. However, I'm interested in your opinion and criticism, so please contact me with your thoughts. Also, for your time-wasting pleasure, I give you: Faker Baker BS3 . Anyone's who's ever used B&#38;T knows this screen all too well. Now, all you have to do is point your [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://brad.hawidu.com/">My resume</a> is finally ready for the web. However, I'm interested in your opinion and criticism, so please contact me with your thoughts.</p>
<p>Also, for your time-wasting pleasure, I give you: <a href="http://brad.hawidu.com/bt/">Faker Baker BS3</a> . Anyone's who's ever used B&amp;T knows this screen all too well. Now, all you have to do is point your browser to <a href="http://brad.hawidu.com/bt/">brad.hawidu.com/bt</a> and you'll instantly look busy!  For you pros out there, the color is #47768e.</p>
]]></content:encoded>
			<wfw:commentRss>http://hawidu.com/2008/03/09/help-me-with-my-resume/feed/</wfw:commentRss>
		<slash:comments>753</slash:comments>
		</item>
		<item>
		<title>Is it Opposite Day?</title>
		<link>http://hawidu.com/2008/02/15/is-it-opposite-day/</link>
		<comments>http://hawidu.com/2008/02/15/is-it-opposite-day/#comments</comments>
		<pubDate>Sat, 16 Feb 2008 00:24:04 +0000</pubDate>
		<dc:creator>Brad Czerniak</dc:creator>
				<category><![CDATA[Web Design]]></category>
		<category><![CDATA[opposite day christmas awesome]]></category>

		<guid isPermaLink="false">http://hawidu.com/2008/02/15/is-it-opposite-day/</guid>
		<description><![CDATA[www.isitoppositeday.com My parody of the famous http://www.isitchristmas.com/ website. IS it Opposite Day? Think about it.]]></description>
			<content:encoded><![CDATA[<p><a title="Is it Opposite Day?" href="http://www.isitoppositeday.com/">www.isitoppositeday.com</a></p>
<p>My parody of the famous <a href="http://www.isitchristmas.com/">http://www.isitchristmas.com/</a> website.</p>
<p>IS it Opposite Day? Think about it.</p>
]]></content:encoded>
			<wfw:commentRss>http://hawidu.com/2008/02/15/is-it-opposite-day/feed/</wfw:commentRss>
		<slash:comments>544</slash:comments>
		</item>
		<item>
		<title>Post To Blog Gadget</title>
		<link>http://hawidu.com/2007/12/24/post-to-blog-gadget/</link>
		<comments>http://hawidu.com/2007/12/24/post-to-blog-gadget/#comments</comments>
		<pubDate>Mon, 24 Dec 2007 04:33:57 +0000</pubDate>
		<dc:creator>Brad Czerniak</dc:creator>
				<category><![CDATA[Web Design]]></category>

		<guid isPermaLink="false">http://hawidu.com/2007/12/24/post-to-blog-gadget/</guid>
		<description><![CDATA[Hey everybody. I hope that my relentless testing this afternoon didn't bog down your aggregator. Anyways, I made a little gadget that communicates to independently-hosted blogs via xml-rpc. You can read all about it here, and also add it. Hope SOMEBODY besides me finds it useful. Oh, and all the source is available at that [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://fusion.google.com/add?moduleurl=http%3A//www.hawidu.com/postblog/blog.xml"><img border="0" width="104" src="http://buttons.googlesyndication.com/fusion/add.gif" alt="Add to Google" height="17" /></a><br />
Hey everybody. I hope that my relentless testing this afternoon didn't bog down your aggregator. Anyways, I made a little gadget that communicates to independently-hosted blogs via xml-rpc. <a target="_blank" href="http://hawidu.com/projects/post-to-blog-gadget/">You can read all about it here</a>, and also add it. Hope SOMEBODY besides me finds it useful. Oh, and all the source is available at that link too. Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://hawidu.com/2007/12/24/post-to-blog-gadget/feed/</wfw:commentRss>
		<slash:comments>1157</slash:comments>
		</item>
		<item>
		<title>The Best Thing since a Better Mousetrap</title>
		<link>http://hawidu.com/2007/07/05/the-best-thing-since-a-better-mousetrap/</link>
		<comments>http://hawidu.com/2007/07/05/the-best-thing-since-a-better-mousetrap/#comments</comments>
		<pubDate>Thu, 05 Jul 2007 18:27:25 +0000</pubDate>
		<dc:creator>Brad Czerniak</dc:creator>
				<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Web Design]]></category>

		<guid isPermaLink="false">http://hawidu.com/2007/07/05/the-best-thing-since-a-better-mousetrap/</guid>
		<description><![CDATA[Okay, so it's been about four days since the application launched (btw, I swear there will be non-application blog posts someday!), and things are going overwhelmingly well. I've gotten a lot of feedback, mostly positive. My upgrade schedule is pretty-well set, but I'm looking to see if people would do things in a different order: [...]]]></description>
			<content:encoded><![CDATA[<p>Okay, so it's been about four days since the application launched (btw, I swear there will be non-application blog posts someday!), and things are going overwhelmingly well. I've gotten a lot of feedback, mostly positive. My upgrade schedule is pretty-well set, but I'm looking to see if people would do things in a different order:</p>
<ol>
<li>Get the digg-like interface for resources up and running. This will allow anyone to contribute to the resources, vote on them, and add comments. The top five will be displayed on the "canvas page," with a link to the full listing. The universal resources will still be at the top (probably), but any catalog, database, etc. can be added.</li>
<li>The profile badge will have the newest and/or recently popular resources instead of the (hilarious) video from Weird Al's movie, UHF.</li>
<li>An additional section will be added that will link to an Information Literacy wiki (If a good one aimed at non-librarians already exists, please link to it in the comments) in colloquial language to help patrons help themselves.</li>
<li>Some sort of usage of the invite notification system provided by Facebook. This will be aimed at getting users. As expected, the initial users of the application have (mostly) been librarians. This is positive for a few reasons, and useful because the infrastructure is there for patrons with Facebook-based questions.</li>
<li>Tweak my database of librarians with additional email addresses, homepage URLs, and other useful data – currently-registered librarians can easily update, while new librarians will automatically have the option.</li>
<li>More stuff is on the way, especially since the feedback and suggestions have been wonderful!</li>
</ol>
<p>Note: I get off work today at 9:00PM, and will be burning some hardcore midnight oil to get these launched as quickly as possible. Please be patient as things come into operation over the weekend. Thanks!</p>
<p>You can see what I'm up to by adding the alpha app – <a href="http://apps.facebook.com/fblibrariantest/">http://apps.facebook.com/fblibrariantest/</a></p>
<p>Also, look out for the open Application Data, and eventually the open source.</p>
<p>(Lastly, on a personal note – My packrat mentality makes it insanely difficult to weed "my" collection. Just wanted to get that off my chest.)</p>
]]></content:encoded>
			<wfw:commentRss>http://hawidu.com/2007/07/05/the-best-thing-since-a-better-mousetrap/feed/</wfw:commentRss>
		<slash:comments>1048</slash:comments>
		</item>
		<item>
		<title>Widget/Gadget rant #2</title>
		<link>http://hawidu.com/2007/06/21/widgetgadget-rant-2/</link>
		<comments>http://hawidu.com/2007/06/21/widgetgadget-rant-2/#comments</comments>
		<pubDate>Thu, 21 Jun 2007 23:01:32 +0000</pubDate>
		<dc:creator>Brad Czerniak</dc:creator>
				<category><![CDATA[Web Design]]></category>

		<guid isPermaLink="false">http://hawidu.com/2007/06/21/widgetgadget-rant-2/</guid>
		<description><![CDATA[Let me start with the bottom line: You should make a widget for your site. It should: be very lightweight in terms of images and text content. have the most useful and original aspects of your site included. create incentive to click over to the full site follow one of the most-common (netvibes, iGoogle) form [...]]]></description>
			<content:encoded><![CDATA[<p>Let me start with the bottom line: You should make a widget for your site. It should:</p>
<ul>
<li>be very lightweight in terms of images and text content.</li>
<li>have the most useful and original aspects of your site included.</li>
<li>create incentive to click over to the full site</li>
<li>follow one of the most-common (netvibes, iGoogle) form factors</li>
<li>be standards-compliant XHTML</li>
</ul>
<p>What!? XHTML? The common view of widgets and gadgets are the XML + AJAX + web 2.0 whatevers that you find all over the place. I know Google supports URL-specific gadgets -- not to mention that the code you copy and paste into the XML is HTML for the formatting anyways.</p>
<p>It should be XHTML because the gadget can then easily double as a site for mobile users -- a growing segment of the online population. Pish-posh to iPhone Safari and Opera 4 Mobile – The screens are still small – so the content should be as well.</p>
<p>Outside users can embed it in an iframe, and the basic structure can be ported into almost any site that uses gadgets natively. This opens up the possibilities to a much wider range of web publishers – including novice users.</p>
<p>The thing that appeals to me the most about widgets is that they consolidate content even more than websites have in the past. A well-made widget puts the best dynamic content from a given site in a format that can be splattered all over the internet like leaflets.</p>
<p>Oh, and geniuses -- why hasn't anyone put AdSense in the minimessages library of GooGads yet?</p>
]]></content:encoded>
			<wfw:commentRss>http://hawidu.com/2007/06/21/widgetgadget-rant-2/feed/</wfw:commentRss>
		<slash:comments>579</slash:comments>
		</item>
		<item>
		<title>Widget/Gadget rant #1</title>
		<link>http://hawidu.com/2007/06/21/widgetgadget-rant-1/</link>
		<comments>http://hawidu.com/2007/06/21/widgetgadget-rant-1/#comments</comments>
		<pubDate>Thu, 21 Jun 2007 22:36:21 +0000</pubDate>
		<dc:creator>Brad Czerniak</dc:creator>
				<category><![CDATA[Web Design]]></category>

		<guid isPermaLink="false">http://hawidu.com/2007/06/21/widgetgadget-rant-1/</guid>
		<description><![CDATA[Widgets and Gadgets are a pervasive phenomenon. As such, it's strange that they're so under-developed. That's my complaint. The solution: widgetize based on use. This is how I lay out my iGoogle, and it makes sense: "Main Tab" - Has my gmail, facebook notifications, some bookmarks (esp. for sites I go to daily), a last.fm [...]]]></description>
			<content:encoded><![CDATA[<p>Widgets and Gadgets are a pervasive phenomenon. As such, it's strange that they're so under-developed. That's my complaint.</p>
<p>The solution: widgetize based on use. This is how I lay out my iGoogle, and it makes sense:</p>
<ol>
<li>"Main Tab" - Has my gmail, facebook notifications, some bookmarks (esp. for sites I go to daily), a last.fm recommendation radio for my account, and most prominently my Google Reader. Previously I had separate Gadgets for feeds, but refused to make a single tab big enough to warrant scrolling. So, I consolidated the feeds into Reader. While I was at it, I also threw digg, engadget, etc. into another folder and made a Reader gadget for that in another tab. That's just not "prime time" enough on my productivity to be in the main tab. The main tab is the home page of your home page.
<ol>
<li>I would have Google Calendar on the main tab, but the Gadget doesn't fit my criteria yet. It shows a monthly calendar, and not a daily agenda! I go to the freaking page daily! -- what use is THAT!? That gadget would just be a link.</li>
<li>Google Bookmarks could also use some work -- mostly the ability to import, but also some more del.icio.us-ish features.</li>
</ol>
</li>
<li>Other tabs: The other tabs are for noteworthy gadgets that do not require daily checking.</li>
</ol>
<p>The gist of what I'm trying to say: widgets and gadgets should be developed with daily or even up-to-the-minute use in mind. A Google Calendar should be that day's agenda.</p>
]]></content:encoded>
			<wfw:commentRss>http://hawidu.com/2007/06/21/widgetgadget-rant-1/feed/</wfw:commentRss>
		<slash:comments>1161</slash:comments>
		</item>
	</channel>
</rss>

