<?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>Gorges Blog</title>
	<atom:link href="http://blog.GORGES.us/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.GORGES.us</link>
	<description>Web Sites that Grow Your Business - our blog</description>
	<lastBuildDate>Fri, 17 May 2013 16:34:55 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Drupal Page Caching and Case Sensitivity</title>
		<link>http://blog.GORGES.us/2013/05/drupal-page-caching-and-case-sensitivity/</link>
		<comments>http://blog.GORGES.us/2013/05/drupal-page-caching-and-case-sensitivity/#comments</comments>
		<pubDate>Fri, 17 May 2013 16:34:55 +0000</pubDate>
		<dc:creator>David Furber</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[caching]]></category>
		<category><![CDATA[drupal]]></category>

		<guid isPermaLink="false">http://blog.GORGES.us/?p=943</guid>
		<description><![CDATA[On a large, high traffic client site, we rely on Drupal page caching for anonymous users to keep the user experience responsive. The site is deployed in the typical way on a Linux server with MySQL database. The cache is using the built-in Drupal database cache. The client has a major page devoted to a [...]]]></description>
				<content:encoded><![CDATA[<p>On a large, high traffic client site, we rely on Drupal page caching for anonymous users to keep the user experience responsive. The site is deployed in the typical way on a Linux server with MySQL database. The cache is using the built-in Drupal database cache.</p>
<p>The client has a major page devoted to a line of products whose name is an acronym. Let&#8217;s say the path to that page is &#8220;http://www.site.com/usa&#8221; whereas the product&#8217;s acronym is &#8220;USA&#8221;.</p>
<p>Since the product is known as &#8220;USA&#8221; it&#8217;s quite plausible for a visitor to type in &#8220;http://www.site.com/USA&#8221; in the browser address bar. Unless you&#8217;ve done something through URL redirects or htaccess rewrites, that URL yields a 404 page.</p>
<p>It would be much nicer if instead of the 404 you redirect to &#8216;/usa&#8217;. You can do that with URL redirects either through Drupal or in .htaccess. I leave that as an exercise to the reader. That&#8217;s not what this post is about.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.GORGES.us/2013/05/drupal-page-caching-and-case-sensitivity/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Team GORGES takes a field trip</title>
		<link>http://blog.GORGES.us/2013/05/team-gorges-takes-a-field-trip/</link>
		<comments>http://blog.GORGES.us/2013/05/team-gorges-takes-a-field-trip/#comments</comments>
		<pubDate>Wed, 01 May 2013 21:31:46 +0000</pubDate>
		<dc:creator>Vicki John</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[mira]]></category>
		<category><![CDATA[ports of new york]]></category>

		<guid isPermaLink="false">http://blog.GORGES.us/?p=899</guid>
		<description><![CDATA[Having found December a fairly difficult month to gather for a Holiday get-together, the gang here at GORGES decided to wait until January to share some laughs together outside of the office; laughs we had. Being the adventurous group that we are, the gentlemen allowed me to lead them out of the office with blindfolds [...]]]></description>
				<content:encoded><![CDATA[<div id="attachment_901" class="wp-caption alignright" style="width: 160px"><a href="http://blog.GORGES.us/wp-content/uploads/2013/02/ports1.jpg"><img class="size-thumbnail wp-image-901" alt="GORGES visits Ports of New York" src="http://blog.GORGES.us/wp-content/uploads/2013/02/ports1-150x150.jpg" width="150" height="150" /></a><p class="wp-caption-text">GORGES visits Ports of New York</p></div>
<div id="attachment_902" class="wp-caption alignright" style="width: 160px"><a href="http://blog.GORGES.us/wp-content/uploads/2013/02/ports2.jpg"><img class="size-thumbnail wp-image-902 " alt="Frederic Bouche of Ports of New York" src="http://blog.GORGES.us/wp-content/uploads/2013/02/ports2-150x150.jpg" width="150" height="150" /></a><p class="wp-caption-text">Frederic Bouche of Ports of New York</p></div>
<p>Having found December a fairly difficult month to gather for a Holiday get-together, the gang here at GORGES decided to wait until January to share some laughs together outside of the office; laughs we had.</p>
<p>Being the adventurous group that we are, the gentlemen allowed me to lead them out of the office with blindfolds and pile them into chauffeur driven limousines to be whisked away to an unknown destination.  Much to their delight we arrived at <a href="http://www.portsofnewyork.com/">Ports of New York</a>, for a tasting and a fascinating history lesson of the making of Meleau specialty wines. Our charming host, Frederic Bouche, the owner is a fourth generation wine maker from France whose ancestors made wine in Bordeaux and Normandy. In 2011 he opened his own local winery here in Ithaca. We spent the next hour or so learning about how these uniquely mellow, (Meleau) but spirited wines are made here in Ithaca using grapes grown in the Finger Lakes.</p>
<p>Ah yes, and the proof is in the tasting.</p>
<p>As we moved on to the second part of our evening, only to step outside and discover it was more like December than December was, we were all in the holiday spirit as we</p>
<p>attempted to snowshoe over to <a href="http://mirabistro.com/">Mira’s Mediterranean Bistro</a> to join our better halves.</p>
<p>Ah yes, and again, the proof is in the tasting.</p>
<p><!--[if gte mso 9]&gt;--></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.GORGES.us/2013/05/team-gorges-takes-a-field-trip/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Belle Sherman Robotics Club</title>
		<link>http://blog.GORGES.us/2013/03/belle-sherman-robotics-club/</link>
		<comments>http://blog.GORGES.us/2013/03/belle-sherman-robotics-club/#comments</comments>
		<pubDate>Tue, 26 Mar 2013 14:10:39 +0000</pubDate>
		<dc:creator>Matt Clark</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[LEGO]]></category>
		<category><![CDATA[robotics]]></category>
		<category><![CDATA[volunteering]]></category>

		<guid isPermaLink="false">http://blog.GORGES.us/?p=907</guid>
		<description><![CDATA[This academic year I agreed to teach a robotics class at a local elementary school.  This was part of an after-school enrichment series sponsored by the local PTA, and I was able to set the curriculum and target age group (grades 2-4).  Two of my three sons are in this age group, so my decision [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://blog.GORGES.us/wp-content/uploads/2013/03/robotics-club-1.jpg"><img class="alignright size-medium wp-image-909" style="margin-left: 6px; margin-right: 6px;" alt="2012-2013 Belle Sherman Robotics Club" src="http://blog.GORGES.us/wp-content/uploads/2013/03/robotics-club-1-300x199.jpg" width="300" height="199" /></a>This academic year I agreed to teach a robotics class at a local elementary school.  This was part of an after-school enrichment series sponsored by the local PTA, and I was able to set the curriculum and target age group (grades 2-4).  Two of my three sons are in this age group, so my decision was unabashedly self-serving.</p>
<p>The class quickly became oversubscribed, and we opened up more student slots thanks to parents who agreed to help with the classes and supervision.  I organized the classes so we would build robotics projects in preparation for the <a href="http://www.cnf.cornell.edu">Cornell Nanotech</a> sponsored <a href="http://www.cnf.cornell.edu/cnf_jrfll.html">FIRST LEGO League Expo</a>, which was held January 26th, 2013 at Cornell&#8217;s Duffield Hall.</p>
<p><a href="http://blog.GORGES.us/wp-content/uploads/2013/03/robotics-club-2.jpg"><img class="alignleft size-thumbnail wp-image-910" style="margin-left: 4px; margin-right: 4px;" alt="Belle Sherman Robotics Club - Red Team" src="http://blog.GORGES.us/wp-content/uploads/2013/03/robotics-club-2-150x150.jpg" width="150" height="150" /></a>We spent the our first five classes learning the basics of gears, pulleys, motors, and sensors.  We introduced the <a href="http://www.legoeducation.us/eng/product/lego_education_wedo_software_v1_2_and_activity_pack/2239">LEGO WeDo Software</a> program for controlling motors and integrating sensors to the students.  The remainder of the classes were spent applying what we learned to building three different projects for presentation at the Expo event.  There were 22 teams at the Expo, and each of our three teams did terrific!</p>
<p>I loved working with the students and seeing the creative structures that the students built.  I hope to teach this course again next year &#8211; and thank you to <a href="http://GORGES.us">GORGES</a> for accommodating my volunteering endeavor.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.GORGES.us/2013/03/belle-sherman-robotics-club/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Customizing the TRAC ticket workflow</title>
		<link>http://blog.GORGES.us/2013/03/customizing-the-trac-ticket-workflow/</link>
		<comments>http://blog.GORGES.us/2013/03/customizing-the-trac-ticket-workflow/#comments</comments>
		<pubDate>Tue, 26 Mar 2013 12:55:40 +0000</pubDate>
		<dc:creator>Rasmus Schultz</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[ticket workflow]]></category>
		<category><![CDATA[TRAC]]></category>
		<category><![CDATA[version control]]></category>

		<guid isPermaLink="false">http://blog.GORGES.us/?p=800</guid>
		<description><![CDATA[At GORGES (among other tools) we use TRAC to manage bugs and feature requests (aka &#8220;tickets&#8221;) and tracking those against various version control systems. I did a quick investigation into TRAC configuration yesterday, and discovered how to customize the ticket workflow to better fit our process. Out of the box, the normal workflow for tickets [...]]]></description>
				<content:encoded><![CDATA[<p>At GORGES (among other tools) we use <a title="TRAC" href="http://trac.edgewall.org/" target="_blank">TRAC</a> to manage bugs and feature requests (aka &#8220;tickets&#8221;) and tracking those against various <a title="version control systems" href="http://en.wikipedia.org/wiki/Revision_control" target="_blank">version control systems</a>.</p>
<p>I did a quick investigation into TRAC configuration yesterday, and discovered how to customize the <a title="ticket workflow" href="http://trac.edgewall.org/wiki/TracWorkflow" target="_blank">ticket workflow</a> to better fit our process.</p>
<p>Out of the box, the normal workflow for tickets is pretty simple: a ticket start out as &#8220;new&#8221; &#8211; it is then assigned for someone to work on, eventually accepted as done, and then finally closed. There are couple of ways to deviate from this process, such as when the work gets rejected and needs more work, or when the ticket needs to be reassigned for somebody else to work on for some reason, but that&#8217;s generally how it goes.</p>
<p>Our process on larger projects is quite a bit more detailed than that &#8211; in fact, most places I&#8217;ve worked, the process is usually a bit more granular than that. Our process is something along the lines of this:</p>
<p>1. A new tickets is created<br />
2. The ticket is assigned for someone to work on.<br />
3. A solution in implemented<br />
4. The solution is deployed to a test (aka &#8220;staging&#8221;) site, for review<br />
5. The work is reviewed and accepted</p>
<p>Again, there are a couple of ways to deviate from that workflow, includes the ones mentioned before, and also in some cases closing a ticket (for example because it&#8217;s invalid) or reopening a ticket that had already previously been closed.</p>
<h3>The Wrong Approach</h3>
<p>Some people resort to simply adding a new property to tickets, which is very easy to do &#8211; here&#8217;s a snippet from a custom option added to the &#8220;trac.ini&#8221; file:</p>
<p><code style="font-size: 90%;">[ticket-custom]<br />
progress = select<br />
progress.label = Progress<br />
progress.options = new|assigned|implemented|reviewing|accepted|rejected|closed<br />
progress.value = new<br />
</code></p>
<p>This adds a new drop-down to tickets, labeled &#8220;Progress&#8221;, with the choices you can see defined by the &#8220;progress.options&#8221; setting above. You will need to make some adjustments to the <a title="reports" href="http://trac.edgewall.org/wiki/TracReports" target="_blank">reports</a>, because custom values don&#8217;t show up by default, but that&#8217;s doable.</p>
<p>Why is this wrong?</p>
<p>Ponder for a moment why we had words like &#8220;new&#8221; and &#8220;assigned&#8221; in our Progress field &#8211; words which also appear in the ticket status.</p>
<p>The problem is that Progress is basically synonymous with Status, and what we end up with is basically two different Status settings. This causes a number of problems, including the fact that our new Progress field doesn&#8217;t actually mean anything in TRAC as such &#8211; it&#8217;s just a label. And for another, the fact that you can create conflicting Status and Progress combinations &#8211; for example, your ticket could be &#8220;accepted&#8221; and &#8220;rejected&#8221;, at the same time!</p>
<p>So without a fair amount of discipline, and agreement and understanding of how to manage these values &#8220;correctly&#8221; amongst the team-members, this is not really going to work well.</p>
<h3>The Right Approach</h3>
<p>Fortunately, when you look into it, and experiment with it for a bit, you will discover that the ticket workflow in TRAC is in fact incredibly flexible!</p>
<p>It&#8217;s a bit hard to understand and configure than a simple custom field, but so much more valuable, as you can fully customize this to fit your team&#8217;s workflow.</p>
<p>Here is the workflow-configuration I came up with, implementing the workflow I described in the beginning of this article:</p>
<p><code>[ticket-workflow]<br />
leave = * -&gt; *<br />
leave.name = No status change - leave<br />
leave.operations = leave_status<br />
leave.default = 0</code></p>
<p>assign = new -&gt; assigned<br />
assign.permissions = TICKET_MODIFY<br />
assign.operations = set_owner<br />
assign.name = Assign<br />
assign.default = -1</p>
<p>implement = assigned,rejected -&gt; implemented<br />
implement.permissions = TICKET_MODIFY<br />
implement.name = Implemented<br />
implement.default = -2</p>
<p>deploy = assigned,implemented,rejected -&gt; reviewing<br />
deploy.permissions = TICKET_MODIFY<br />
deploy.name = Deployed for review<br />
deploy.default = -3</p>
<p>accept = reviewing -&gt; closed<br />
accept.permissions = TICKET_MODIFY<br />
accept.operations = set_resolution<br />
accept.set_resolution = fixed<br />
accept.name = Accept<br />
accept.default = -4</p>
<p>reject = reviewing -&gt; rejected<br />
reject.permissions = TICKET_MODIFY<br />
reject.name = Rejected (needs more work)<br />
reject.default = -5</p>
<p>close = new,assigned,implemented,reviewing,rejected -&gt; closed<br />
close.permissions = TICKET_MODIFY<br />
close.operations = set_resolution<br />
close.name = Close<br />
close.default = -6</p>
<p>reassign = assigned,implemented,reviewing,rejected -&gt; assigned<br />
reassign.permissions = TICKET_MODIFY<br />
reassign.operations = set_owner<br />
reassign.name = Re-assign<br />
reassign.default = -7</p>
<p>reopen = closed -&gt; assigned<br />
reopen.permissions = TICKET_CREATE<br />
reopen.operations = set_owner<br />
reopen.name = Re-open and Assign<br />
reopen.default = -8</p>
<p>Each section of this configuration defines a single possible action in the workflow &#8211; the activities you can perform: assign, implement, deploy, accept or reject, close, and reassign or reopen when needed.</p>
<p>The first setting for each defined action (with the &#8220;<code>-&gt;</code>&#8221; symbol in it) defines allowed status(es) and the new status after performing that action &#8211; for example, the &#8220;deploy&#8221; action is defined as &#8220;assigned,implemented,rejected -&gt; reviewing&#8221;, meaning you can change the ticket-status to &#8220;reviewing&#8221; only when the status is &#8220;assigned&#8221;, &#8220;implemented&#8221; or &#8220;rejected&#8221;. Note that the statuses themselves are not formally defined in the configuration file &#8211; the possible statuses are implicitly defined by configuring actions.</p>
<p>The &#8220;permissions&#8221; setting is optional, and defines what level of permission is required to perform the action. For the most part, the right to modify a ticket (TICKET_MODIFY) is enough &#8211; but in our case, we think that reopening a ticket should only be allowed if you&#8217;re allowed to create new tickets (TICKET_CREATE).</p>
<p>The &#8220;operations&#8221; setting defines one or more <a title="operations" href="http://trac.edgewall.org/wiki/TracWorkflow#BasicTicketWorkflowCustomization" target="_blank">operations</a> you want TRAC to do when this action is performed. This affects the user-interface &#8211; for example, the &#8220;set_resolution&#8221; operation (which we used for the &#8220;close&#8221; action above) displays with a drop-down to select the resolution. Note that the &#8220;set_resolution&#8221; <strong>operation</strong> has an optional &#8220;set_resolution&#8221; <strong>setting</strong>, which allows you to specify one or more resolution-types allowed for this action &#8211; for example, the &#8220;accept&#8221; action we defined, only allows one resolution: &#8220;fixed&#8221;.</p>
<p>The are two more simple, but very important (and underused) settings for actions. The &#8220;name&#8221; setting defines how the action is displayed &#8211; for example, &#8220;Re-open and Assign&#8221; is more descriptive than simply &#8220;reopen&#8221; &#8211; use this setting to clarify the meaning of the action and how or when to use it. And finally, the perhaps somewhat misleadingly named &#8220;default&#8221; setting, which actually defines the priority (sort order) of available actions in the user-interface. This is important, because it enables you to communicate which action is most likely next, by displaying it first. Oddly, the options are sorted backwards by this value, which is why I used a negative number in our configuration.</p>
<h4>Conclusion</h4>
<p>TRAC is a very powerful tool that comes with a lot of humble (sometimes underwhelming) configuration out of the box &#8211; but when you look under the surface, it really is an incredibly powerful tool with lots of optional features and an incredible degree of flexibility, allowing you to adapt it to pretty much any work-environment.</p>
<p>I hope you enjoyed this little tutorial and a glimpse of our process.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.GORGES.us/2013/03/customizing-the-trac-ticket-workflow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Code of Life</title>
		<link>http://blog.GORGES.us/2012/12/the-code-of-life/</link>
		<comments>http://blog.GORGES.us/2012/12/the-code-of-life/#comments</comments>
		<pubDate>Mon, 17 Dec 2012 16:26:11 +0000</pubDate>
		<dc:creator>Ted Caldwell</dc:creator>
				<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://blog.GORGES.us/?p=866</guid>
		<description><![CDATA[Last weekend an enthusiastic group of coders from the Ithaca area gathered at GORGES for a special event, as part of the Global Day of Coderetreat. Getting up early on a Saturday to work on code is not every developer&#8217;s idea of a good time, but in this case the sacrifice of REM sleep was amply rewarded [...]]]></description>
				<content:encoded><![CDATA[<p>Last weekend an enthusiastic group of coders from the Ithaca area gathered at GORGES for a special event, as part of the <a href="http://globalday.coderetreat.org/">Global Day of Coderetreat</a>. Getting up early on a Saturday to work on code is not every developer&#8217;s idea of a good time, but in this case the sacrifice of REM sleep was amply rewarded by a fun, sociable and thought-provoking daylong session.</p>
<div id="attachment_872" class="wp-caption alignright" style="width: 310px"><a href="http://blog.GORGES.us/wp-content/uploads/2012/12/coderetreat.jpg"><img class="size-medium wp-image-872 " src="http://blog.GORGES.us/wp-content/uploads/2012/12/coderetreat-300x212.jpg" alt="Coderetreat at GORGES" width="300" height="212" /></a><p class="wp-caption-text">Developers discuss their solutions after a coding session</p></div>
<p>The coderetreat phenomenon has only been going for a few years, but it has exploded into a worldwide phenomenon. This year an estimated 160 sessions were held simultaneously on December 8, in cities on every continent (except Antarctica, but who&#8217;s counting?).</p>
<p>The idea of coderetreat is to get developers together to practice their craft &#8211; &#8220;practice&#8221; as in &#8220;practice the violin.&#8221; Musicians and other creative professionals spend a lot of time practicing to improve their skills, but professional software development usually takes place in an environment full of deadlines and deliverables, which can make it difficult to experiment, explore, and learn effectively.</p>
<p>The coderetreat format removes these day-to-day pressures so that developers can take chances, try new ideas, and see how far they get. Pairs of coders work together in 45-minute sessions to try to solve a problem, but to stress the &#8220;no pressure&#8221; aspect, they are required to delete their code at the end of the session. This feels weird at first, but it becomes liberating.</p>
<p>Another way the format gets coders away from the day-to-day is by giving them a problem that they could probably not solve completely even if they tried. Teams are asked to create simulations of <a href="http://en.wikipedia.org/wiki/Conway's_Game_of_Life">Conway&#8217;s Game of Life</a> &#8211; a generative process defined on a grid in which very simple rules can give rise to fascinating self-reproducing patterns. In each session the pairs are asked to try the problem using different approaches or constraints, and the whole group shares their findings afterwards.</p>
<p>Coderetreat is also about promoting the use of <a title="test-driven development" href="http://en.wikipedia.org/wiki/Test-driven_development">test-driven development</a>, a process that makes it easier to build quality code by revealing when things break in the process of refactoring. Good code is code that can be changed and improved over time, and TDD helps to make this change painless. Participants were encouraged to use TDD techniques as part of the exercise, in hopes that it will become a part of their everyday toolkit.</p>
<p>Thanks to David Furber for organizing the event, Travis Vachon for facilitating, and to <a href="http://singlebrook.com/">Singlebrook Technology</a>, <a href="http://thinktopography.com/">Think Topography</a> and <a href="http://www.incandescentsoftware.com/">Incandescent Software</a> for being local sponsors along with GORGES. I also enjoyed meeting a bunch of developers from these and other firms, and hope that this will become a regular event!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.GORGES.us/2012/12/the-code-of-life/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The True North Strong and &#8230; PHP?</title>
		<link>http://blog.GORGES.us/2012/11/the-true-north-strong-and-php/</link>
		<comments>http://blog.GORGES.us/2012/11/the-true-north-strong-and-php/#comments</comments>
		<pubDate>Mon, 12 Nov 2012 16:41:20 +0000</pubDate>
		<dc:creator>Ted Caldwell</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://blog.GORGES.us/?p=851</guid>
		<description><![CDATA[Just got back from the True North PHP Conference in Toronto, and boy, is my brain tired! It&#8217;s probably the increased intracranial pressure from all the nifty ideas bouncing around in there. Herewith, a few random observations and emanations from the talks I attended (with fellow code slinger Rasmus Schultz)&#8230; Reginald Braithwaite set the tone with his keynote, &#8221;Why PHP [...]]]></description>
				<content:encoded><![CDATA[<p>Just got back from the True North PHP Conference in Toronto, and boy, is my brain tired! It&#8217;s probably the increased intracranial pressure from all the nifty ideas bouncing around in there. Herewith, a few random observations and emanations from the talks I attended (with fellow code slinger <a href="http://gorges.us/team_rschultz">Rasmus Schultz</a>)&#8230;</p>
<p><a href="http://weblog.raganwald.com/">Reginald Braithwaite</a> set the tone with his keynote, &#8221;Why PHP could be the most important programming language in the world.&#8221; Though the title sounds like flamebait, his main point was that PHP makes it easy to get started, which will tempt more people to try things, which will lead to more innovation.</p>
<p><a href="http://erichogue.ca">Eric Hogue</a> gave an intro to <a href="http://jenkins-ci.org">Jenkins</a> and Continuous Integration - Jenkins is not so much a tool in itself but a tying-together of lots of existing tools for things like unit test automation, to make it easier to publish code frequently without fear.</p>
<p><a href="http://adam.lundrigan.ca/">Adam Lundrigan</a> and <a href="https://twitter.com/hhamon">Hugo Hamon</a> gave talks about what&#8217;s new in the <a href="http://framework.zend.com/">Zend</a> and <a href="http://symfony.com/">Symfony</a> frameworks, respectively, and these and several other talks echoed a common theme: rather than being wedded to a single framework or language, developers should choose what works best for a given task, from the rich buffet of options available in the PHP world and elsewhere.</p>
<p><a href="http://www.rafaeldohms.com.br/">Rafael Dohms</a> gave a great talk about how to fix common code mistakes, and a second one about Annotations in PHP, featuring a plug for our own <a href="http://gorges.us/team_rschultz">Rasmus Schultz&#8217;s</a> nifty <a href="https://github.com/mindplay-dk/php-annotations">annotation tool,</a> and he and Rasmus had some interesting discussions afterward about different approaches.</p>
<p>We sat in the front row, like a couple of nerdy fifth-graders, for <a href="http://www.larryullman.com/">Larry Ullman&#8217;s</a> talk about <a href="http://yiiframework.com">Yii,</a> our go-to PHP framework at GORGES. We were mainly interested in getting the scoop on Yii 2.0, which is supposed to be hitting alpha around the beginning of the new year, maybe. One tidbit was that the whole thing is being rewritten to more modern coding standards (even more awesomeness?), and the API will not be backward compatible from 2.0 to 1.x. It will also require PHP 5.3.</p>
<p><a href="http://joelclermont.com/">Joel Clermont</a> gave a nice talk about Hypermedia APIs, a.k.a. (to some, at least) REST. Like many other speakers, Joel strenuously avoided dogma, which I found quite refreshing.</p>
<p>Finally, just when we thought we were running low on acronyms, <a href="http://ircmaxwell.com">Anthony Ferrara</a> explained how to stop being STUPID and be SOLID instead. I&#8217;m still practicing expanding those abbreviations, but again some very practical tips on building better software, regardless of your language, platform, or even paradigm (did you know that there are at least six ways to complete the phrase &#8220;_____ Oriented Programming&#8221;?).</p>
<p>So all in all, an enjoyable and education trip to my homeland!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.GORGES.us/2012/11/the-true-north-strong-and-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&lt;b&gt; and &lt;i&gt; are still good</title>
		<link>http://blog.GORGES.us/2012/06/b-and-i-are-still-good/</link>
		<comments>http://blog.GORGES.us/2012/06/b-and-i-are-still-good/#comments</comments>
		<pubDate>Wed, 27 Jun 2012 11:41:31 +0000</pubDate>
		<dc:creator>Rasmus Schultz</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.GORGES.us/?p=815</guid>
		<description><![CDATA[I just had a small &#8220;a-hah&#8221;. The &#60;b&#62; and &#60;i&#62; tags have been generally dismissed, in favor of &#60;strong&#62; and &#60;em&#62; which have semantic meaning. But as they pointed out in the twitter bootstrap documentation, &#60;b&#62; and &#60;i&#62; are still valid! Most people seem to think they were deprecated because they have no semantic meaning [...]]]></description>
				<content:encoded><![CDATA[<p>I just had a small &#8220;a-hah&#8221;.</p>
<p>The <a href="http://dev.w3.org/html5/markup/b.html" target="_blank"><tt>&lt;b&gt;</tt></a> and <a href="http://dev.w3.org/html5/markup/i.html" target="_blank"><tt>&lt;i&gt;</tt></a> tags have been generally dismissed, in favor of <tt>&lt;strong&gt;</tt> and <tt>&lt;em&gt;</tt> which have semantic meaning.</p>
<p>But as they pointed out in the twitter bootstrap documentation, <tt>&lt;b&gt;</tt> and <tt>&lt;i&gt;</tt> are still valid!</p>
<p>Most people seem to think they were deprecated because they have no semantic meaning &#8211; that was certainly my impression.</p>
<p>But they were not deprecated &#8211; in fact they were kept around for the very same reason &#8211; because they have no semantic meaning.</p>
<p>In other words, if you need to highlight words of phrases without conveying additional importance, you should be using <tt>&lt;b&gt;</tt>, while <tt>&lt;i&gt;</tt> can be used for example to stress technical terms or voice, again, without communicating anything semantic, just for visual distinction.</p>
<p>This may seem like a tiny, irrelevant thing, but I find these details can be helpful when thinking about HTML as a &#8220;rich text&#8221; medium.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.GORGES.us/2012/06/b-and-i-are-still-good/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Brad Treat at the PopShop</title>
		<link>http://blog.GORGES.us/2012/04/brad-treat-at-the-popshop/</link>
		<comments>http://blog.GORGES.us/2012/04/brad-treat-at-the-popshop/#comments</comments>
		<pubDate>Fri, 27 Apr 2012 15:59:30 +0000</pubDate>
		<dc:creator>Matt Clark</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[entrepreneurs]]></category>

		<guid isPermaLink="false">http://blog.GORGES.us/?p=791</guid>
		<description><![CDATA[I visited the PopShop in CollegeTown last night for an event.  The PopShop opened last month and is trying to become the center for student-led entrepreneurial ideas.  The popular Ezra Meetups and other meetings are being held at the PopShop, and the place appears to be a flurry of excitement and startup networking. Brad Treat [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://blog.GORGES.us/wp-content/uploads/2012/04/popshop-brad.jpg"><img class="alignright size-medium wp-image-790" title="Brad Treat at the PopShop" src="http://blog.GORGES.us/wp-content/uploads/2012/04/popshop-brad-300x171.jpg" alt="" width="300" height="171" /></a>I visited the PopShop in CollegeTown last night for an event.  The <a href="http://popright.in/">PopShop</a> opened last month and is trying to become the center for student-led entrepreneurial ideas.  The popular Ezra Meetups and other meetings are being held at the PopShop, and the place appears to be a flurry of excitement and startup networking.</p>
<p><a href="http://bradtreat.blogspot.com">Brad Treat</a> gave a talk last night about his entrepreneurial philosophy, and also anecdotal stories from the multiple startup companies he&#8217;s been involved with.</p>
<p>Thank for sharing, Brad, and good luck to all the PopShop entrepreneurs.  There are several more events scheduled this week, including some success stories from the <a href="http://blog.gorges.us/2011/11/cornell-3-day-startup/">Cornell 3-Day Startup</a> event in February.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.GORGES.us/2012/04/brad-treat-at-the-popshop/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Overcome challenges to meeting accessibility standards and your website will be usable to a much larger audience</title>
		<link>http://blog.GORGES.us/2012/03/overcome-challenges-to-meeting-accessibility-standards-and-your-website-will-be-usable-to-a-much-larger-audience/</link>
		<comments>http://blog.GORGES.us/2012/03/overcome-challenges-to-meeting-accessibility-standards-and-your-website-will-be-usable-to-a-much-larger-audience/#comments</comments>
		<pubDate>Fri, 16 Mar 2012 18:12:14 +0000</pubDate>
		<dc:creator>Brian Post</dc:creator>
				<category><![CDATA[Content Management]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Website Design]]></category>
		<category><![CDATA[accessibility]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[usability]]></category>

		<guid isPermaLink="false">http://blog.GORGES.us/?p=763</guid>
		<description><![CDATA[Building a website to comply with Section 508 or WCAG accessibility standards can mean meeting a number of specific technical requirements.  To assist in building websites that meet these standards, GORGES has found a number of tools that ease the development process.]]></description>
				<content:encoded><![CDATA[<h1 dir="ltr"></h1>
<p>Building a website to comply with <a href="http://webaim.org/standards/508/checklist" target="_blank">Section 508</a> or <a href="http://www.w3.org/WAI/intro/wcag" target="_blank">WCAG</a> accessibility standards can mean meeting a number of specific technical requirements.  To assist in building websites that meet these standards, GORGES has found a number of tools that ease the development process.</p>
<p><a href="http://www.totalvalidator.com/tools/index.html" target="_blank">Total Validator Tool</a> will validate the markup of a web page against Section 508 and WCAG standards.  Getting the markup to validate to these standards helps prepare the website for visitors using screen reader software. Total Validator Tool generates easy-to-follow reports which detail where the markup of a page does not meet the accessibility standards.  From this report, developers can easily see what changes are necessary.</p>
<p>However, once the website markup meets the appropriate standards, there are other aspects of the standards that are beyond what the Total Validator Tool is designed to detect.  These include considerations for visitors with color blindness and preparing any video used on the website for visitors who may be blind or deaf.</p>
<p><a href="http://www.vischeck.com/vischeck/" target="_blank">Vischeck</a> is a service that will simulate colorblind vision.  Images or screenshots of a website can be uploaded and processed for free at the Vischeck website.  This can give a general sense of how a website may look to those with a form of color blindness.</p>
<p>To ensure a website is usable by those who are colorblind, checking the contrast between foreground and background colors is essential.  The accessibility standards indicate what contrast ratios are necessary.  The <a href="http://webaim.org/resources/contrastchecker/" target="_blank">WebAIM Color Contrast Checker</a> will provide a ratio based on provided colors while the service <a href="http://www.checkmycolours.com/" target="_blank">Check My Colours</a> will analyze the colors used on an entire site.</p>
<p><a href="http://www.universalsubtitles.org/" target="_blank">Universal Subtitles</a> is a service for adding captions (and translations) to embedded video.  This service is compatible with many popular video hosting services and video players.</p>
<p><a href="http://www.longtailvideo.com/players/" target="_blank">JW Player</a> is good option for embedded video that is self-hosted.  It can meet some of the stricter versions of the accessibility standards using the optional <a href="http://www.longtailvideo.com/addons/plugins/84/Captions" target="_blank">Captions plugin</a> and <a href="http://www.longtailvideo.com/addons/plugins/85/Audio-Description" target="_blank">Audio Description plugin</a>.  This includes not only closed captions but closed audio descriptions.  A closed audio description is an additional audio track that may sometimes be needed to describe the video scene to visitors who are blind.</p>
<p>For an overview of making video accessible, a good document can be found at the JW Player website titled &#8220;<a href="http://www.longtailvideo.com/support/jw-player/22/making-video-accessible" target="_blank">Making Video Accessible</a>.&#8221;</p>
<p>Commonly used screen readers include <a href="http://www.freedomscientific.com/products/fs/jaws-product-page.asp" target="_blank">JAWS</a> and <a href="http://www.gwmicro.com/window-eyes/" target="_blank">Window-Eyes</a>.  For testing with a screen reader, an article on the Yahoo Developer Network suggests using a free and open source screen reader called <a href="http://www.nvda-project.org/" target="_blank">NVDA</a>.  The article &#8220;<a href="http://developer.yahoo.com/blogs/ydn/posts/2009/12/easy_accessibility_testing_with_the_nvda_screen_reader/" target="_blank">Easy Accessibility Testing with the NVDA Screen Reader</a>&#8221; states:</p>
<p>&#8220;NVDA for Windows is one of several screen reader programs available on the market today. NVDA is free and open source. It is very strict in how it treats web pages and thus can serve as a perfect testing tool.&#8221;</p>
<p>By utilizing these tools, many of the challenges of meeting accessibility standards can be more easily overcome, and your website will become usable by a larger audience.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.GORGES.us/2012/03/overcome-challenges-to-meeting-accessibility-standards-and-your-website-will-be-usable-to-a-much-larger-audience/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Website and App Maintenance Agreements</title>
		<link>http://blog.GORGES.us/2012/02/website-and-app-maintenance-agreements/</link>
		<comments>http://blog.GORGES.us/2012/02/website-and-app-maintenance-agreements/#comments</comments>
		<pubDate>Thu, 16 Feb 2012 15:41:06 +0000</pubDate>
		<dc:creator>Don Ellis</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Mobile Development]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://blog.GORGES.us/?p=756</guid>
		<description><![CDATA[Maintenance Agreements – They are &#8212; They are not Websites and apps are not commodities and the purchasing of them is not a one-night-stand. Websites and apps are born into dynamic environments. Their full value is realized when they are maintained current with those environments. The developer relationship established during the initial development is part [...]]]></description>
				<content:encoded><![CDATA[<p>Maintenance Agreements – They are &#8212; They are not</p>
<p>Websites and apps are not commodities and the purchasing of them is not a one-night-stand. Websites and apps are born into dynamic environments. Their full value is realized when they are maintained current with those environments. The developer relationship established during the initial development is part of the purchased value. Economies accrue when a structured relationship is maintained.</p>
<p>A Maintenance Agreement provides the budget to prevent obsolescence. The sad news is that a new website or app is becoming obsolete even as it is built. All three sectors of the technology advance rapidly.</p>
<ul>
<li>New display and interaction devices replace the old at increasing rates.</li>
<li>There is daily industry news about greater power in databases and middleware.</li>
<li>Methods-of-use, ways of thinking about these technologies, sprint into our lives.</li>
</ul>
<p>The users of any valuable website or app will chafe immediately when it does not take advantage of this or that new device, or some new way of searching, or some social opportunity. Staying atop these concerns is the noble use of a maintenance agreement.</p>
<p>A Maintenance Agreement budget also should be provided for installing important updates to the underlying software. The price should be small, maybe $250 per event, maybe two or three events per year. Security updates in particular must be done.</p>
<p>A Maintenance Agreement provides a management structure for all the above. There is a prioritized wish list, a clear line of communication, and a non-intrusive billing arrangement.</p>
<p>The Maintenance Agreement budget is not for hosting the app and ensuring its connectivity. These services are budgeted under Hosting Agreements.</p>
<p>GORGES would be embarrassed if Maintenance Agreement budgets were spent mostly on fixing the app. In some cases this is appropriate use, but there should be very little of this. Websites and apps are warranted for thirty days after going live and after major upgrades. Clients should test the app thoroughly before and during that period to take advantage of the warranty.</p>
<p>The best websites and apps pay their own way. Allocating a portion of the return for maintenance extends their lives and empowers their constituencies.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.GORGES.us/2012/02/website-and-app-maintenance-agreements/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
