<?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>Information School Web Team</title>
	<atom:link href="http://blogs.uw.edu/iweb/feed/" rel="self" type="application/rss+xml" />
	<link>http://blogs.uw.edu/iweb</link>
	<description>Web is what we do</description>
	<lastBuildDate>Thu, 28 Mar 2013 19:51:20 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<item>
		<title>Responsive Web Design Challenges</title>
		<link>http://blogs.uw.edu/iweb/2012/05/04/responsive-web-design-challenges/</link>
		<comments>http://blogs.uw.edu/iweb/2012/05/04/responsive-web-design-challenges/#comments</comments>
		<pubDate>Fri, 04 May 2012 20:05:14 +0000</pubDate>
		<dc:creator>Lisa Gettings</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[User Experience]]></category>
		<category><![CDATA[Web Redesign]]></category>

		<guid isPermaLink="false">http://blogs.uw.edu/iweb/?p=187</guid>
		<description><![CDATA[The redesign process is in full swing and up until last week, it was all smooth sailing. Then we ran aground as we embarked upon the DESIGN portion of our trip. Early in the process, I threw a cursory glance at responsive web &#8230; <a href="http://blogs.uw.edu/iweb/2012/05/04/responsive-web-design-challenges/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>The redesign process is in full swing and up until last week, it was all smooth sailing. Then we ran aground as we embarked upon the DESIGN portion of our trip. Early in the process, I threw a cursory glance at <a title="Responsive Web Design" href="http://designmodo.com/responsive-design-examples/" target="_blank">responsive web design</a>,  assuming that it was some morsel of coding magic that I needn’t worry about because our developer would be the captain of that ship. I was wrong. Not Titanic wrong, but wrong nonetheless.</p>
<p>While it is true that Nick is responsible for building and coding the site to spec, responsive web design required me to think very differently about the content on the pages. So differently, in fact, that after 14 years of doing web work, I stopped and had a Dorothy moment. I’m not in Kansas anymore.Things can move around on the screen: text, navigation, images, everything. It all needs to shift and compress and breathe to fit varying widths. Content can and should be fluid. Where’s my compass?</p>
<p>So Daisy, our designer, and I took a major, unplanned side trip and delved deeply into RWD theory and process. Essentially, there are two major camps forming on this<br />
topic:</p>
<ol>
<li>The RWD folks who advocate building full-meal sites with all the content and features for desktop and then modify the way the content is displayed for various screen widths and devices via the use of media queries and CSS.</li>
<li>The other camp claims this is a faulty approach; among them <a title="Jakob Nielsen" href="http://www.useit.com/alertbox/mobile-vs-full-sites.html" target="_blank">the ever-controversial Jakob Nielsen</a> who recommends separate mobile-optimized sites that cut features and cut content.</li>
</ol>
<p>The realities of implementation aside, I would opt for something closer to Nielsen’s approach due to the fact that I am a content person. But without the proper research on what our users are looking for on mobile platforms, we are choosing the simpler RWD route and will modify over time or apply a hybrid version. We are a university with limited resources and we have to make compromises for the sake of making progress.  Our website needs a bail out now.</p>
<p>We deconstructed our process and had a healthy discourse. We met with David Conrad, founding partner at <a href="http://www.designcommission.com/" target="_blank">Design Commission</a>, who gave us some great guidance on how to approach this project.  We read many articles and shared several examples. We involved BJ Miller, an Informatics student who works in IT, and he brought some good ideas to the wireframing process. We were finally all on the same page.</p>
<p><strong>Some great resources:</strong><br />
<a title="How to Design a Mobile Responsive Website" href="http://www.uxbooth.com/blog/how-to-design-a-mobile-responsive-website/" target="_blank">How to Design a Mobile Responsive Website</a></p>
<p><a title="TOp Responsive Web Design Tools" href="http://www.netmagazine.com/features/21-top-tools-responsive-web-design" target="_blank">Top Responsive Web Design Tools</a></p>
<p><a title="Ethan Marcotte on Responsive Design" href="http://www.alistapart.com/articles/responsive-web-design/" target="_blank">Responsive Web Design by Ethan Marcotte</a></p>
<p><a title="Responsive Tools Grid Generator" href="http://coding.smashingmagazine.com/2012/03/19/gridpak-the-responsive-grid-generator/" target="_blank">Gridpak: The Responsive Grid Generator</a></p>
<p><a title="Podcast on Responsive Design" href="http://www.uie.com/brainsparks/2011/03/11/ethan-marcotte-the-how-and-why-of-responsive-web-design/" target="_blank">Podcast from The How and Why of Responsive Design</a></p>
<p><a title="Responsive Websites in Higher Education" href="http://collegewebeditor.com/blog/index.php/archives/2011/11/16/top-first-responsive-websites-in-highered/" target="_blank"> Top Responsive Websites in Higher Education</a></p>
<p><a title="Examples of Good Responsive Design" href="http://designmodo.com/responsive-design-examples/" target="_blank">Examples of Good Responsive Design</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.uw.edu/iweb/2012/05/04/responsive-web-design-challenges/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL + SSL + Drupal 6</title>
		<link>http://blogs.uw.edu/iweb/2012/04/10/mysql-ssl-drupal-6/</link>
		<comments>http://blogs.uw.edu/iweb/2012/04/10/mysql-ssl-drupal-6/#comments</comments>
		<pubDate>Tue, 10 Apr 2012 18:34:36 +0000</pubDate>
		<dc:creator>Nick West</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Drupal]]></category>
		<category><![CDATA[Server Administration]]></category>

		<guid isPermaLink="false">http://blogs.uw.edu/iweb/?p=175</guid>
		<description><![CDATA[I’m in the process of migrating the iSchool website to the “cloud”. Our main reason for this move is due to the fact that our current server location doesn’t have redundant power. When the power goes out in Mary Gates &#8230; <a href="http://blogs.uw.edu/iweb/2012/04/10/mysql-ssl-drupal-6/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I’m in the process of migrating the iSchool website to the “cloud”. Our main reason for this move is due to the fact that our current server location doesn’t have redundant power. When the power goes out in Mary Gates Hall, our website goes down. This has happened twice in the past year. That’s two times too often. It’s embarrassing to have your website down because the power is out.</p>
<p>In the move to the “cloud” I’m also beefing up our security. Now that we aren’t sure where the traffic between the DB and Web Server is routed, we decided we needed to encrypt traffic between the two.</p>
<p>Here are the steps I took to make this happen:</p>
<p>First generate the certificates for the SSL connection. I used openssl to do this. These files should be saved in a properly permissioned folder. A common location is /etc/mysql/certs/ or /etc/ssl/mysql/, but anywhere will do.</p>
<h3>Create the certificates:</h3>
<p>Here are the commands to generate the certs (run these on your DB server):</p>
<pre># Create CA certificate
openssl genrsa 2048 &gt; ca-key.pem
openssl req -new -x509 -nodes -days 1000 -key ca-key.pem -out ca-cert.pem

# Create server certificate, remove passphrase, and sign it
openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem -out server-req.pem
openssl rsa -in server-key.pem -out server-key.pem
openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem

# Create client certificate, remove passphrase, and sign it
openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem -out client-req.pem
openssl rsa -in client-key.pem -out client-key.pem
openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem</pre>
<p>When generating these, be sure to use unique common names for each cert.</p>
<h3>Edit my.cnf</h3>
<p>Now edit the my.cnf file on the DB server. This might be located in /etc/mysql/. Add these three lines under [mysqld] but replace /etc/mysql/certs/ with the path to your certificate files.</p>
<pre>
ssl-ca=/etc/mysql/certs/ca-cert.pem
ssl-cert=/etc/mysql/certs/server-cert.pem
ssl-key=/etc/mysql/certs/server-key.pem
</pre>
<p>Restart mysql on the DB server. (tail the mysql error log to see if everything starts up alright)</p>
<h3>Create the SSL restricted user:</h3>
<p>Hop in to MySQL as root (or another user with grant):</p>
<pre>mysql -u root -p</pre>
<p>Create the new user and give them access to your database from the IP of the web server. I added –ssl to the username to easily remind us that the user requires ssl.</p>
<pre>grant all privileges on YOUR_DATABASE.* to 'YOUR_USER-ssl'@'192.168.0.1' identified by 'PASSWORD' require ssl;</pre>
<h3>Copy certs to web server</h3>
<p>Next securely copy the following files over to your webserver.</p>
<pre>ca-cert.pem
client-cert.pem
client-key.pem</pre>
<h3>Edit my.cnf on the web server</h3>
<p>Then edit the my.cnf file on the Web Server and add these three lines under [client]</p>
<pre>
ssl-ca=/etc/mysql/certs/ca-cert.pem
ssl-cert=/etc/mysql/certs/client-cert.pem
ssl-key=/etc/mysql/certs/client-key.pem
</pre>
<h3>Test the connection</h3>
<p>Try connecting to your DB server as your ssl user</p>
<pre>mysql -u YOUR_USER-ssl -h yourdb.domain.com -p YOUR_DATABASE</pre>
<p>If this doesn’t work, check your error log on the DB server to make sure MySQL started properly with SSL.</p>
<h3>Modify Drupal Core so it can support MySQL over SSL</h3>
<p>We’re using the MySQLi extension for Drupal 6. To get it to support SSL I had to edit my settings.php file for the site, as well as /includes/database.mysqli.inc and /includes/database.inc</p>
<p>This is a bit hacky, and when updating Drupal these changes will need to be re-applied.</p>
<p>Add the following 3 lines to your settings.php file:</p>
<pre>
$db_url['certs']['key'] = '/etc/mysql/certs/client-key.pem';
$db_url['certs']['cert'] = '/etc/mysql/certs/client-cert.pem';
$db_url['certs']['ca'] = '/etc/mysql/certs/ca-cert.pem';
</pre>
<p>These are the paths to your certificate files. (note: if you have a database named certs that you are using with drupal, you’ll need to think of a different approach for this part)</p>
<p>Also within settings.php be sure to set the proper DB username and password in the $db_url[’default’] variable. Here’s what that variable should look like:</p>
<pre>$db_url['default'] = 'mysqli://YOUR_USER:PASSWORD_HERE@database.domain.com/YOUR_DATABASE';</pre>
<p>Remember, we set YOUR_USER to be someuser-ssl</p>
<p>Now edit /includes/database.inc :: within function db_set_active() there is a line calling db_connect(). I added 1 variable to the db_connect argument list:</p>
<pre>$db_conns[$name] = db_connect($connect_url, $db_url['certs']);</pre>
<p>Then edit /includes/database.mysqli.inc</p>
<p>Change the function db_connect() argument list to the include following:</p>
<pre>function db_connect($url, $db_ssl=null) {</pre>
<p>Now right above the mysqli_real_connect() call, add this:</p>
<pre>
  if(is_array($db_ssl) &amp;&amp; sizeof($db_ssl) &gt; 0)
  	mysqli_ssl_set($connection, $db_ssl['key'], $db_ssl['cert'], $db_ssl['ca'], NULL, NULL);
</pre>
<p>This line sets mysqli to use SSL and it sets the paths to the given certificate files.</p>
<p>With these in place, you should now be able to connect to the DB.</p>
<p>There are many steps to getting this setup properly. Just remember to watch your error logs to figure out what is going wrong and where. Testing out your SSL connection with a very basic PHP Connection test script might also help eliminate some of the variables that Drupal introduces. Here’s a sample test script:</p>
<pre>
$connection = mysqli_init();
mysqli_ssl_set($connection, '/etc/mysql/certs/client-key.pem', '/etc/mysql/certs/client-cert.pem', '/etc/mysql/certs/ca-cert.pem', NULL, NULL);
mysqli_real_connect($connection, 'database.domain.com', 'YOUR_USER', 'YOUR_PASSWORD', 'YOUR_DATABASE', 3306, NULL, MYSQLI_CLIENT_FOUND_ROWS);
</pre>
<p>3306 is the default MySQL port, this could be different for you.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.uw.edu/iweb/2012/04/10/mysql-ssl-drupal-6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Survey of First-year Informatics Students</title>
		<link>http://blogs.uw.edu/iweb/2012/03/21/survey-of-first-year-informatics-students/</link>
		<comments>http://blogs.uw.edu/iweb/2012/03/21/survey-of-first-year-informatics-students/#comments</comments>
		<pubDate>Wed, 21 Mar 2012 20:36:09 +0000</pubDate>
		<dc:creator>Nick West</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Informatics]]></category>

		<guid isPermaLink="false">http://blogs.uw.edu/iweb/?p=164</guid>
		<description><![CDATA[In February 2012 the iSchool sent out a survey to our first-year Informatics students. 61% of the first-year students took the survey, and all of the respondents said they would recommend Informatics to another student interested in the information field. &#8230; <a href="http://blogs.uw.edu/iweb/2012/03/21/survey-of-first-year-informatics-students/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>In February 2012 the iSchool sent out a survey to our first-year Informatics students. 61% of the first-year students took the survey, and all of the respondents said they would recommend Informatics to another student interested in the information field. The survey also showed that the unique iSchool community plays a key role in the learning experience and student satisfaction in the program.</p>
<p>To help display and communicate what we learned from the survey, our Graphic Designer, Dasiy Fry, took these results and turned them into the following infographic. Click the preview below to see the full infographic.</p>
<p style="text-align: center"><a href="http://ischool.uw.edu/infographics/informatics"><img class="aligncenter size-full wp-image-166" src="http://blogs.uw.edu/iweb/files/2012/03/informatics-infographic.png" alt="Informatics Infographic" width="550" height="235" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.uw.edu/iweb/2012/03/21/survey-of-first-year-informatics-students/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hello, my name is…</title>
		<link>http://blogs.uw.edu/iweb/2012/02/16/hello-my-name-is/</link>
		<comments>http://blogs.uw.edu/iweb/2012/02/16/hello-my-name-is/#comments</comments>
		<pubDate>Thu, 16 Feb 2012 18:58:21 +0000</pubDate>
		<dc:creator>Lisa Gettings</dc:creator>
				<category><![CDATA[Project Management]]></category>
		<category><![CDATA[The Team]]></category>
		<category><![CDATA[Web Redesign]]></category>

		<guid isPermaLink="false">http://blogs.uw.edu/iweb/?p=133</guid>
		<description><![CDATA[I’m Lisa Gettings, the newish Web Producer for the iSchool. I’m the first to occupy this much needed position. The web team is intact and the project has begun. I joined the iSchool a little over a month ago and &#8230; <a href="http://blogs.uw.edu/iweb/2012/02/16/hello-my-name-is/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I’m Lisa Gettings, the newish Web Producer for the iSchool. I’m the first to occupy this much needed position.</p>
<p>The web team is intact and the project has begun. I joined the iSchool a little over a month ago and plunged headllong into planning out the web redesign of <a title="UW iSchool" href="http://ischool.uw.edu/" target="_blank">our main, public-facing website</a>.  It’s an ambitious task on a tight timeframe and it’s a challenge I relish.</p>
<p>I spent the first month on discovery, research and planning. Upon first view of the site, my thought was, “This is a rat’s nest of a navigation.” It was born out of the complete lack of centralized content oversight and IA strategy. Too many cooks without any recipes. Also lacking is a coherent voice and sound editorial judgement.</p>
<p>There is nothing I like better than bringing order to chaos, organizing ideas, categorizing content and making information flow. I’m in the right place.</p>
<p>We set up the project in Basecamp and I created several planning and process documents. I’m posting them here for anyone to check out and use. I’ve benefited so many times from various university bloggers who have posted their web redesign documentation that its time I return the favor.</p>
<p> </p>
<p> </p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.uw.edu/iweb/2012/02/16/hello-my-name-is/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FAQs With Style</title>
		<link>http://blogs.uw.edu/iweb/2012/02/16/faqs-with-style/</link>
		<comments>http://blogs.uw.edu/iweb/2012/02/16/faqs-with-style/#comments</comments>
		<pubDate>Thu, 16 Feb 2012 18:52:47 +0000</pubDate>
		<dc:creator>B.J. Miller</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[User Experience]]></category>

		<guid isPermaLink="false">http://blogs.uw.edu/iweb/?p=131</guid>
		<description><![CDATA[I was recently tasked with making some improvements to several messy pages on the iSchool site to improve the readability and overall appearance. One of these pages was an FAQ page, one of many on the site, which was constructed &#8230; <a href="http://blogs.uw.edu/iweb/2012/02/16/faqs-with-style/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I was recently tasked with making some improvements to several messy pages on the iSchool site to improve the readability and overall appearance. One of these pages was an FAQ page, one of many on the site, which was constructed from just a bunch of text and certain lines in a bold font to suggest that they were the questions. My first thought was that this page was just a wall of text that a lot of people would just simply skip over rather than try to read.</p>
<div id="attachment_132" class="wp-caption aligncenter" style="width: 743px"><a href="http://blogs.uw.edu/iweb/files/2012/02/faq-old.png"><img class="size-full wp-image-132" src="http://blogs.uw.edu/iweb/files/2012/02/faq-old.png" alt="Old FAQ Page " width="733" height="411" /></a><p class="wp-caption-text">An old FAQ page</p></div>
<p>My goal with this page was to re-design it in a way that made it seem more like a real FAQ page and become more readable and scanable to both a passer by and someone looking for a specific answer to a specific question. To do this, I started off by adding some more contrast between the questions and the answers as well as adding some more space and division between the different question/answer pairs. The first step here was to increase the size of each question to 18px and making the text a deep purple color to contrast the 12px black default text style of the answers. Then I added some spacing between each question/answer pair and throwing in a subtle light gray border to clearly distinguish between different questions. Then, after looking at many examples of FAQ pages on different websites, I noticed that many sites label their questions and answers with a big “Q” and “A” respectively. I felt that this made the site feel like even more of an FAQ page as well as adding a bit to the ease of scanning through the content so I added these labels to the left of each question and answer, again in an 18px font.</p>
<p>This specific FAQ page I was working on had the questions divided up into several sections, each with their own header. The 18px font of the questions, however, broke the hierarchy of scale with the section headers because they were a smaller font. A simple fix for this would have been to increase the size of the section headers to something like 24px, but after trying that out, It just seemed too big. I was really happy with how the questions and answers were looking so I didn’t want to tweak the question font size at all. Instead, I came up with a different approach to making the headers become more defined without going crazy with the font size. The first thing I tried was to give the headers a light gray background to make them stand out and really divide each section. This looked alright, but with the padding of the content container keeping the gray background of the header from spanning across the entirety of the content box, I felt like it still needed something to help divide the sections and stand out as more prominent than the questions. To fix this, I just took the gray box I had formed by giving the header a background and stretching it horizontally so that it extended 4px past the white background of the content box.</p>
<div id="attachment_135" class="wp-caption aligncenter" style="width: 747px"><a href="http://blogs.uw.edu/iweb/files/2012/02/faq-new.png"><img class="size-full wp-image-135" src="http://blogs.uw.edu/iweb/files/2012/02/faq-new.png" alt="New FAQ Page" width="737" height="529" /></a><p class="wp-caption-text">The final look after all of the changes</p></div>
<p>After all of the tweaks, I was quite happy with the readability and overall appearance and so was Nick so I went ahead and applied the new styles to all of the FAQs on the site.</p>
<p>The one drawback to the new style is that it involves adding a fair amount of custom mark-up to the page content which makes it a little tricky to do things like adding or removing questions and sections with the WYSIWYG editor. The easiest way to address this issue for the time being was to just let the page owners know that they will have to contact the web team in order to do these types of changes.</p>
<p>With the new iSchool site currently in the works, we are able to address this problem in a much more elegant and usable way. Instead of just adding the extra markup to Page content, we are working on a FAQ content type that uses a custom field to create new questions and answers and add them to an FAQ page.</p>
<div id="attachment_142" class="wp-caption aligncenter" style="width: 783px"><a href="http://blogs.uw.edu/iweb/files/2012/02/faq-submit.png"><img class="size-full wp-image-142" src="http://blogs.uw.edu/iweb/files/2012/02/faq-submit.png" alt="FAQ Submit tool in D7" width="773" height="646" /></a><p class="wp-caption-text">What the FAQ content type might look like in the new Drupal 7 site.</p></div>
]]></content:encoded>
			<wfw:commentRss>http://blogs.uw.edu/iweb/2012/02/16/faqs-with-style/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Servers</title>
		<link>http://blogs.uw.edu/iweb/2011/12/29/servers/</link>
		<comments>http://blogs.uw.edu/iweb/2011/12/29/servers/#comments</comments>
		<pubDate>Thu, 29 Dec 2011 19:01:47 +0000</pubDate>
		<dc:creator>Nick West</dc:creator>
				<category><![CDATA[Server Administration]]></category>

		<guid isPermaLink="false">http://blogs.uw.edu/iweb/?p=120</guid>
		<description><![CDATA[Part of my job here at the Information School is planning our web server structure, what goes where, who should have access to what, and so-on. Luckily I also have a great server admin who has given me free reign &#8230; <a href="http://blogs.uw.edu/iweb/2011/12/29/servers/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Part of my job here at the Information School is planning our web server structure, what goes where, who should have access to what, and so-on. Luckily I also have a great server admin who has given me free reign over all things web.</p>
<p>Zach and I spent the better part of the past two weeks getting two new servers (both VMs in a clustered environment) set up and decommissioning an old one. Before recently we had a development server that was multi-purposed to also host <a href="https://bitbucket.org/iweb/lts" target="_blank">LTS</a>, our in-house open source daemon that handles secure connections between web services and our apps that want to use them. Basically it’s a middle-man standardized API that interacts with various services available on campus. So to start, one of our new servers is an applications server specifically for LTS and any other random app that we create that needs to be up and secure more than a development server could guarantee. The application server is also setup to host multiple sites so future non-production server worthy tools could live here.</p>
<p>Our second new server is purely for testing and development. We set it up to host multiple domains and have moved the development version of our current site over. In this move we also adjusted our strategy for versioning. In the past the entire drupal site lived in a GIT repo hosted internally. We shifted from that strategy to only housing custom code (modules, themes, and misc stuff) in individual repos on <a href="http://bitbucket.org/iweb" target="_blank">bitbucket</a>. LTS and some of our Drupal modules are open source, but we also have private repos for our theme and various other modules that aren’t yet, or won’t be open source.</p>
<p>Our new strategy partially eliminated GIT as a backup strategy, so we also set up a snapshot script that syncs a weeks worth of nightly snapshots of our sites directory into a snapshots directory (on the same server). Since this is our development server, and we have our hand coded stuff in repos, we currently don’t have an offsite backup strategy in place for it, like we do with our production server.</p>
<p>I also spent a good bit of time tweaking settings on the new dev server so external traffic wouldn’t be able to view the site or get to things that should be internal only. Since all iSchool computers are on the 172.28 subnet it was really easy to only allow internal traffic. For external folks needing to get to the site, VPN allows them to. To quell any confusion, we redirected all external traffic over to a landing page on the live site explaining why they couldn’t access our development site, and how to VPN to gain access.</p>
<p>With everything off the old development server, it was able to be decommissioned. Our next step is to figure out what we want to do with our production server. Our goal is to move production out of our server closet and either into the cloud or over to a reliable dedicated host. While we have some redundancy in our server closet as far as hardware goes, we currently have no redundancy for power failure. With a site re-launch in the works, we’ll likely figure out our server solution for the new site and leave the current site where it is until we launch.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.uw.edu/iweb/2011/12/29/servers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Committees</title>
		<link>http://blogs.uw.edu/iweb/2011/12/13/committees/</link>
		<comments>http://blogs.uw.edu/iweb/2011/12/13/committees/#comments</comments>
		<pubDate>Tue, 13 Dec 2011 21:31:22 +0000</pubDate>
		<dc:creator>Nick West</dc:creator>
				<category><![CDATA[Bureaucracy]]></category>

		<guid isPermaLink="false">http://blogs.uw.edu/iweb/?p=117</guid>
		<description><![CDATA[Today I was a guest for an iSchool “Intranet Committee” meeting. I was brought in to discuss the possibility of some Intranet data (specifically Policies &#38; Procedures) being moved or published to the public facing iSchool website. The result of &#8230; <a href="http://blogs.uw.edu/iweb/2011/12/13/committees/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Today I was a guest for an iSchool “Intranet Committee” meeting. I was brought in to discuss the possibility of some Intranet data (specifically Policies &amp; Procedures) being moved or published to the public facing iSchool website. The result of the committee meeting more or less ended with the decision that we’d keep everything the way it is. The thing is, some of the policies and procedures are already on the public site (the vast majority of the student policies), then some of the intranet info in P&amp;P is actually more like knowledge base articles, which are sort of procedures (how to get toner for copiers, how to use voicemail). The idea behind this section was to have a single source for faculty, staff and PhD students to go to, but we also have the public site, an IT knowledge base and individual department pages within the Intranet that have some of that info too.</p>
<p>But enough about how some of our information is scattered everywhere, this post is about committees. The result of the committee meeting pretty much reinforced my belief that committees as working groups is a bad idea. The model that was used in this case, where the committee comes together to brainstorm and try to figure out how something should be done is broken. The result is that 45 minutes of a 1 hour meeting were spent discussing the same single issue without ever coming to any conclusions or plans for the future. So essentially time was wasted.</p>
<p>A better model (this is all of course just my opinion based on previous experiences) would be to form a small (&lt;= 5) person working group full of experts that would be tasked to come up with a solution to a given problem (in this case creating a single point of contact for all staff, faculty and PhDs to get information). This working group could meet and work on this problem as much or little as they need to. After they come up with a solution, they present it to the committee (usually 10+ people). The committee can then provide feedback on the proposed solution and also ask for changes where they see additional needs or where needs weren’t met. Then the Working Group would make those changes and present their refined proposal, eventually resulting in the proposal being accepted by the committee (ideally).</p>
<p>In my model, instead of 10+ people “working” on the solution, you have 1–5 doing the bulk of the work and the committee is there to guide the solution to the desired outcome and ultimately endorse it as a committee backed solution. The trick here is to keep the committee on track and keep them from fixating on tiny details that won’t make a significant (if any) difference to the outcome of the project.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.uw.edu/iweb/2011/12/13/committees/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Setting up Shibboleth: Ubuntu + Apache + Drupal</title>
		<link>http://blogs.uw.edu/iweb/2011/11/30/setting-up-shibboleth-ubuntu-apache-drupal/</link>
		<comments>http://blogs.uw.edu/iweb/2011/11/30/setting-up-shibboleth-ubuntu-apache-drupal/#comments</comments>
		<pubDate>Wed, 30 Nov 2011 18:20:40 +0000</pubDate>
		<dc:creator>Nick West</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Server Administration]]></category>

		<guid isPermaLink="false">http://blogs.uw.edu/iweb/?p=63</guid>
		<description><![CDATA[Here at the UW we use Shibboleth as a single federated login solution. There are fall backs and legacy options available, so before recently the Information School was using LDAP for login. The major advantage (and main reason central UW &#8230; <a href="http://blogs.uw.edu/iweb/2011/11/30/setting-up-shibboleth-ubuntu-apache-drupal/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Here at the UW we use <a href="http://shibboleth.internet2.edu/" target="_blank">Shibboleth</a> as a single federated login solution. There are fall backs and legacy options available, so before recently the Information School was using LDAP for login. The major advantage (and main reason central UW wants everyone to use Shibboleth) is that the login credentials are supplied only to the central UW IdP (Identity Provider). This makes login safer and more secure for the user.</p>
<h2>So what is Shibboleth?</h2>
<p>I asked the same question when I first heard about it. It’s a weird name and I’ve never heard of it before. Shibboleth is a product of the <a href="http://www.internet2.edu/" target="_blank">Internet2</a> consortium. In theory, Shibboleth should catch on all across higher ed and maybe the whole internet. Now that we’re using Shibboleth, the iSchool could allow folks with other <a href="http://www.incommon.org/" target="_blank">InCommon</a> federation member accounts to login with their native credentials on our site. We don’t currently have a need to do that, but in the future, who knows?</p>
<h2>So how did I get it to work?</h2>
<p>It’s really not as straight forward as I was hoping. The <a href="https://wiki.cac.washington.edu/display/infra/Shibboleth+Service+Provider+Support" target="_blank">documentation</a> in the <a href="https://wiki.cac.washington.edu/" target="_blank">IT wiki</a> seems to be a bit out dated, or maybe just different than an Ubuntu package setup, so it wasn’t easy. First, and foremost, what we are doing is setting up a Shibboleth SP (Service Provider); we are not setting up an IdP (Identity Provider). The IdP is hosted centrally by UW and already running. What we need is a Shibboleth SP, with which we will connect to the IdP (and the InCommon federation, if you choose to).</p>
<p>The <a href="https://wiki.shibboleth.net/confluence/display/SHIB2/Installation" target="_blank">documentation on the Shibboleth</a> site supports RedHat, SUSE, and OpenSUSE installations well. These are the officially supported Linux Distros. Of course, we’re using Ubuntu, so it seemed I would have to compile from source. This didn’t make me happy and I didn’t want to have to do that. So I went Googling and found out that Ubuntu has some packages available through apt-get that will work.</p>
<p>From a conglomeration of sites I figured it all out, but there are a lot of steps to get this to work. To get started we first have to install the Shibboleth SP which will run as a daemon (service) on the same web-server that will need to authenticate. At the iSchool we’re running Apache so we’ll also need a shibboleth module. The apt-get package will also require some dependency packages, but that’s all handled for us by apt-get.</p>
<p>To perform this setup you will need sudo or root access to the server that you’re installing Shibboleth on, and you’ll need to know your way around Linux a bit.</p>
<h2>The install</h2>
<p>I’m assuming you have Apache installed and working, as well as SSL working on Apache.</p>
<p>First off, we need to grab some new packages, many of these have dependencies which apt-get will also be installing. Go ahead and update apt-get:</p>
<pre style="font-family:monospace">sudo apt-get update</pre>
<p>Now start off by grabbing the shibboleth packages:</p>
<pre style="font-family:monospace">sudo apt-get install libapacahe2-mod-shib2 shibboleth-sp2-schemas</pre>
<p>If you didn’t get any errors, you should have a /etc/shibboleth directory now. You should also have mod_shib_22.so in /usr/lib/apache2/modules, and you should have an Apache module load file in /etc/apache2/mods-available called shib2.load.</p>
<p>Now you’ll need to enable the Apache module:</p>
<pre style="font-family:monospace">sudo a2enmod shib2</pre>
<p>Then restart Apache (this may be a different command for you):</p>
<pre style="font-family:monospace">sudo service apache2 restart</pre>
<p>At this point, you can go ahead and start the Shibboleth daemon and see if things are somewhat working.</p>
<pre style="font-family:monospace">sudo service shibd start</pre>
<p>You should see a message saying “Starting Shibboleth 2 daemon: shibd”. To test it out point your browser at <strong>your.domain.uw.edu/Shibboleth.sso/DS</strong>. This should redirect you to the placeholder URL https://ds.example.org… If it did, congrats, you have a working Shibboleth daemon. Now you have to configure it to work properly.</p>
<h2>Configuring Shibboleth at the UW</h2>
<p>This is where I had a heck of a time figuring out what to do. The install documentation in the UW wiki didn’t have much info about the config file, but after digging deeper I realized that there are separate articles beneath the <a href="https://wiki.cac.washington.edu/display/infra/Shibboleth+Service+Provider+Support" target="_blank">Shibboleth Service Provider Support</a> article (use the left nav to get to them).</p>
<p>The file you need to edit is /etc/shibboleth/shibboleth2.xml. This file will be full of example configuration SAML. You can either download this file from your server and open it on your desktop, or you can edit it in place with your favorite editor. <em>Do note that the file is owned by root, so sudo when you open this file before you make all these changes if you’re using a command line editor (it sucks to forget to do that).</em></p>
<p>There are a few changes you’ll have to make in this giant file.</p>
<ol start="1">
<li>In the InProcess block change the name attribute of the Site element to be whatever the domain name for your shibboleth install will be. For us it was ischool.uw.edu. In the same element, I added scheme=“https” and port=“443” attributes, to specify SSL.</li>
</ol>
<div>Here is what your InProcess block should look like now:</div>
<div>
<pre style="font-family:monospace">&lt;InProcess logger="native.logger"&gt;
    &lt;ISAPI normalizeRequest="true" safeHeaderNames="true"&gt;
        &lt;Site id="1" name="your.domain.uw.edu" scheme="https" port="443" /&gt;
    &lt;/ISAPI&gt;
&lt;/InProcess&gt;</pre>
</div>
<ol start="2">
<li>In the RequestMapper block, change the name attribute on Host to your.domain.uw.edu too.</li>
</ol>
<ol start="3">
<li>Now in the ApplicationDefaults block, change EntityID to https://your.domain.uw.edu.</li>
</ol>
<div>This is what it should look like:</div>
<pre style="font-family:monospace">    &lt;ApplicationDefaults id="default" policyId="default"
        entityID="https://your.domain.uw.edu/shibboleth"
        REMOTE_USER="eppn persistent-id targeted-id"
        signing="false" encryption="false"&gt;</pre>
<ol start="4">
<li>Further on, there’s a EntityID attribute on Session Initiator which needs to be changed to urn:mace:incommon:washington.edu and an ID attribute which needs to be changed to UW.</li>
</ol>
<div>This is what that block should look like:</div>
<pre style="font-family:monospace">&lt;SessionInitiator type="Chaining" Location="/DS" isDefault="true" id="UW"
        relayState="cookie" entityID="urn:mace:incommon:washington.edu" forceAuthn="true"&gt;
    &lt;SessionInitiator type="SAML2" acsIndex="1" template="bindingTemplate.html"/&gt;
    &lt;SessionInitiator type="Shib1" acsIndex="5"/&gt;
&lt;/SessionInitiator&gt;</pre>
<p>In the above block, the forceAuthn=“true” toggle forces the user to re-enter their password on login even if they have a valid webauth session. We opted for this option since many of our users have web editing privileges on our site and the added security just made sense to us. If you don’t have a need for the extra security, you can go ahead nad change forceAuthn=“true” to forceAuthn=“false”.</p>
<ol start="5">
<li>Now you need to <strong>remove or comment out</strong> the following two SessionInitiator blocks. The only active SessionInitiator block should be the one above.</li>
</ol>
<ol start="6">
<li>Further down, you’ll find a MetadataProvider block. Uncomment this block and make the changes as seen below:</li>
</ol>
<pre style="font-family:monospace">&lt;MetadataProvider type="XML"
        uri="http://wayf.incommonfederation.org/InCommon/InCommon-metadata.xml"
	backingFilePath="InCommon-metadata.xml" reloadInterval="7200"&gt;
    &lt;MetadataFilter type="RequireValidUntil" maxValidityInterval="2419200"/&gt;
    &lt;MetadataFilter type="Signature" certificate="incommon.pem"/&gt;
&lt;/MetadataProvider&gt;</pre>
<ol start="7">
<li>Configuring logout requires a couple more changes. This time in /etc/shibboleth/localLogout.html add the following meta redirect below the content-type meta tag:</li>
</ol>
<pre style="font-family:monospace">&lt;meta http-equiv="Refresh" content="0;URL=https://idp.u.washington.edu/idp/logout"/&gt;</pre>
<p>And that was the last required change. There are also error configurations that can be set, but for more info on that you can check out the <a href="https://wiki.shibboleth.net/confluence/display/SHIB2/Configuration" target="_blank">Shibboleth Wiki</a>.</p>
<p>Save and upload your shibboleth2.xml file.</p>
<p>Next you’ll need to edit the /etc/shibboleth/attribute-map.xml. <a href="https://wiki.cac.washington.edu/display/infra/Configure+a+Service+Provider+to+Use+Attributes" target="_blank">For info on what to edit here, see the UW documentation on this page.</a></p>
<p>You’re almost done! Now, if you want to you can revisit the test url I gave above: <strong>your.domain.uw.edu/Shibboleth.sso/DS</strong> and you should be seeing a new error. Something along the lines of opensaml::saml2md::MetadataException, Unable to locate metadata for identity provider (urn:mace:incommon:washington.edu). If you see that, it means your configuration file is (at least mostly) working as it should. Now you just need to complete a few more steps.</p>
<h2>Security keys</h2>
<p>The reason it’s unable to find the Identity Provider metadata is due to a lack of the InCommon federation cert. The cert is linked to in the UW documentation and can be found at <a href="https://wayf.incommonfederation.org/bridge/certs/incommon.pem" target="_blank">https://wayf.incommonfederation.org/bridge/certs/incommon.pem</a>.To get it on your server, you can just run this command:</p>
<pre style="font-family:monospace">sudo wget -O /etc/shibboleth/incommon.pem https://wayf.incommonfederation.org/bridge/certs/incommon.pem</pre>
<p>Alternatively you could just open the /etc/shibboleth/incommon.pem file for writing and paste the cert in, or FTP it up.</p>
<p><strong>You also need to create a self signed cert for Shibboleth to use</strong>. The result will be a key file and a cert file. If you need help follow steps 1–4 in <a href="http://www.akadia.com/services/ssh_test_certificate.html" target="_blank">this tutorial</a>. You’ll want to name these files sp-key.pem and sp-cert.pem, and copy or move them into /etc/shibboleth/.</p>
<p>Now you need to restart the Shibboleth daemon:</p>
<pre style="font-family:monospace">sudo service shibd restart</pre>
<p>Hit the test url again and it should be forwarding you to idp.u.washington.edu/idp/profile/SAML2/Redirect/SSO. Your new error should be “Error Message: SAML 2 SSO profile is not configured for relying party ‘https://your.domain.uw.edu/shibboleth”. That means Shibboleth is configured to send your users over to the UW IdP. We’re almost done.</p>
<h2>Registering with the IdP</h2>
<p>Now you need to <a href="https://wiki.cac.washington.edu/display/infra/Register+a+Service+Provider+with+the+UW" target="_blank">register your SP with UW</a> and optionally <a href="https://wiki.cac.washington.edu/display/infra/Request+Service+Provider+Registration+with+InCommon" target="_blank">register your SP with InCommon</a>. The UW documentation is great here. We chose to only register with UW for now, so I’m not sure what the process is like with InCommon, but with UW it was pretty painless. <em>One thing to note; You’ll need official domain access rights to register with UW.</em></p>
<p>After registering it takes a little while and after that the test URL should resolve to a working UW webauth login form. The next steps in this post are just about getting Shibboleth Auth set up in Drupal.</p>
<h2>The Drupal Module</h2>
<p>Now that we have Shibboleth up and working, we need to install the <a href="http://drupal.org/project/shib_auth" target="_blank">Shibboleth module for Drupal</a>. This module works in both Drupal 6 and 7. We are currently using Drupal 6 for our production site, but we have a test server up with Drupal 7 on it. Both are using Shibboleth for auth.</p>
<p>This step is important and easy to miss. Add a few lines to your .htaccess file:</p>
<pre style="font-family:monospace">AuthType Shibboleth
ShibRequireSession Off
ShibUseHeaders On
require shibboleth</pre>
<p>Now to configuring your new module. Navigate over to the shib_auth module configuration screen at /admin/user/shib_auth. You’ll need to change these Attribute settings (you can verify the accuracy of these variables by printing out $_SERVER after you are logged in via Shibboleth):</p>
<p>Server variable for username: HTTP_UWNETID<br />
Server variable for e-mail address: HTTP_EPPN</p>
<p>Over on the advanced tab I also added in a URL to redirect to after logout. After that, all that’s left is adding the Shibboleth login block to your site. This will vary by site, so I’m not going to go over that beyond mentioning that the shibboleth module includes a login block that you can place on your site. How you want to get that there is up to you and your theme.</p>
<p>The goal of this post is to raise awareness of Shibboleth, and to assure everyone that it is possible to get it working with Drupal on Apache in Ubuntu. It’s also for our own step by step record of how to reproduce this in the future.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.uw.edu/iweb/2011/11/30/setting-up-shibboleth-ubuntu-apache-drupal/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>IE 6 really is dead.</title>
		<link>http://blogs.uw.edu/iweb/2011/11/17/ie-6-really-is-dead/</link>
		<comments>http://blogs.uw.edu/iweb/2011/11/17/ie-6-really-is-dead/#comments</comments>
		<pubDate>Thu, 17 Nov 2011 22:01:49 +0000</pubDate>
		<dc:creator>Nick West</dc:creator>
				<category><![CDATA[Accessibility]]></category>
		<category><![CDATA[Statistics]]></category>

		<guid isPermaLink="false">http://blogs.uw.edu/iweb/?p=91</guid>
		<description><![CDATA[It has been my habit to make sure my sites work in all relevant browsers. IE 6 has been on my list for quite some time and it really sucked that it is. Recently B.J. Miller and I were checking &#8230; <a href="http://blogs.uw.edu/iweb/2011/11/17/ie-6-really-is-dead/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>It has been my habit to make sure my sites work in all relevant browsers. IE 6 has been on my list for quite some time and it really sucked that it is. Recently B.J. Miller and I were checking out the browser usage statistics on ischool.uw.edu and wow was I surprised by what we saw.</p>
<p><a href="http://blogs.uw.edu/iweb/files/2011/11/all-traffic.png"><img class="alignnone size-full wp-image-93" src="http://blogs.uw.edu/iweb/files/2011/11/all-traffic.png" alt="" width="506" height="288" /></a></p>
<p>It turns out Internet Explorer isn’t king when it comes to iSchool fans, not by a long shot. On top of that when I drilled down into the IE versions I found even greater news.</p>
<p><a href="http://blogs.uw.edu/iweb/files/2011/11/all-traffic-ie.png"><img class="alignnone size-full wp-image-92" src="http://blogs.uw.edu/iweb/files/2011/11/all-traffic-ie.png" alt="" width="508" height="178" /></a></p>
<p>Less than 2% of our IE users are using IE6. That means 1.9% of 27.2% of our users, 0.5% of our total user base, is on IE6. That number is finally low enough to really consider ceasing support for IE6. This seemed to good to be true, so my first thought was that all of our lab computers running IE9 must be offsetting these numbers. But I looked into it, filtered by external traffic only, and it turns out that number isn’t much different. Only 0.7% of our external users are using IE6.</p>
<p>A really neat fact is that more of our users browse from Android than from IE6. We definitely need to get our mobile style in check.</p>
<h2>Does that mean I won’t check sites in IE6 anymore?</h2>
<p>I will likely still be verifying that sites are usable in IE6. I am also considering adding a dismissible notice to our site that would show for IE6 users, letting them know that their browser isn’t fully supported and their experience on our site will be degraded while using IE6.</p>
<p>But as for having an IE6 only style sheet that swaps all those PNGs out for GIFs, I won’t be doing that extra work anymore.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.uw.edu/iweb/2011/11/17/ie-6-really-is-dead/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Doing things wrong, just to get them done</title>
		<link>http://blogs.uw.edu/iweb/2011/11/07/doing-things-wrong-just-to-get-them-done/</link>
		<comments>http://blogs.uw.edu/iweb/2011/11/07/doing-things-wrong-just-to-get-them-done/#comments</comments>
		<pubDate>Mon, 07 Nov 2011 17:50:13 +0000</pubDate>
		<dc:creator>Nick West</dc:creator>
				<category><![CDATA[Accessibility]]></category>
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blogs.uw.edu/iweb/?p=12</guid>
		<description><![CDATA[It was wrong, and I know it. It goes against every thing I stand for and everything I push for. It is the Information School Centennial mini-site. A year or so ago, someone was tasked to setup and build out &#8230; <a href="http://blogs.uw.edu/iweb/2011/11/07/doing-things-wrong-just-to-get-them-done/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>It was wrong, and I know it. It goes against every thing I stand for and everything I push for. It is the Information School <a href="http://ischool.uw.edu/100" target="_blank">Centennial mini-site</a>. A year or so ago, someone was tasked to setup and build out a centennial website for the iSchool; this was before my time here. Unfortunately not much came of the project. I’m not sure why, or what happened, but the project fell to the wayside. I wasn’t made aware of the project or the need for a centennial site until well into the centennial year. Needless to say there was a sense of urgency to get something, anything, up on the web.</p>
<p>In the first day, we came up with some ideas. We weighed out the pros and cons of keeping it simple and being a bit extravagant. Obviously people wanted it to be “cool” and “awesome”. The <a href="http://www.washington.edu/150/" target="_blank">UW 150th site </a>sure was, why shouldn’t our 100th be? The time crunch was here, we had somewhere around a week or two to get it up. Oh boy! So we did. The result was actually fairly decent, the site looks okay, even though the design wasn’t polished and massaged for weeks. The functionality is all there and it works within Drupal and within the current site’s template.</p>
<h2>So what did I do wrong?</h2>
<p>The <a href="http://ischool.uw.edu/100/timeline" target="_blank">timeline</a> requires Javascript and doesn’t elegantly degrade. This is something that gets under my skin. This is something that I complain about when I look at other people’s work. And here I am, guilty as charged, a hypocrite. Why did I do it? The limitations of the current site template coupled with the limitations of Drupal and the time it would take to build out a custom module to make this work the right way created a wall that would prevent the timeline from being enhanced by the “two months ago would have been ideal” deadline.</p>
<h2>What’s so bad about requiring Javscript?</h2>
<p>Everyone has Javascript support these days, right? Well, no, not really. There are plenty of people out there with old browsers and old devices. Then there are others who turn Javascript off for security reasons, or maybe to prevent popups, or maybe JS slows their machine down. There are countless reasons a user might turn Javascript off. What we create should be accessible to those users no matter what their settings might be.</p>
<h2>What should I have done?</h2>
<p>I should have made the timeline work just fine without Javascript. Then, once that was working, I should have added the Javascript layer to make it cooler for people who have Javascript capabilities. In this particular case, the cost would have been a fair deal of time, perhaps twice as much or more, and we simply didn’t have it. What’s stopping me from fixing it now? Still time. We’ve moved on to the next project, and the next project is big.</p>
<p>So far, no one has complained that the timeline doesn’t work for them. I’m not even convinced we’ll hear a single complaint. But the fact is, I did it wrong, and I’m certainly not proud of that.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.uw.edu/iweb/2011/11/07/doing-things-wrong-just-to-get-them-done/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 3.620 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2013-05-20 14:25:36 -->

<!-- Compression = gzip -->