<?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>Jeff Sebring</title>
	<atom:link href="http://jeffsebring.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://jeffsebring.com</link>
	<description>WordPress Consulting &#38; Development ✦ Spokane</description>
	<lastBuildDate>Sat, 20 Apr 2013 23:41:18 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.6-beta2-24163</generator>
		<item>
		<title>Gzip HTTP Requests with NGINX</title>
		<link>http://jeffsebring.com/2012/gzip-nginx/</link>
		<comments>http://jeffsebring.com/2012/gzip-nginx/#comments</comments>
		<pubDate>Sun, 11 Nov 2012 17:53:48 +0000</pubDate>
		<dc:creator>Jeff Sebring</dc:creator>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[NGINX]]></category>
		<category><![CDATA[Optimization]]></category>

		<guid isPermaLink="false">http://jeffsebring.com/?p=21050</guid>
		<description><![CDATA[<p>If you use NGINX, you probably care about performance, and one of the easiest website performance wins is to Gzip http requests. Gzip can not only increase the speed of your website, but also save bandwidth. I&#8217;ll show you how to Gzip http requests with your NGINX server in this post. Gzip is a compression [...]</p><p><a href="http://jeffsebring.com">Jeff Sebring - WordPress Consulting &amp; Development ✦ Spokane</a></p>]]></description>
				<content:encoded><![CDATA[<p>If you use NGINX, you probably care about performance, and one of the easiest website performance wins is to Gzip http requests. Gzip can not only increase the speed of your website, but also save bandwidth. I&#8217;ll show you how to Gzip http requests with your NGINX server in this post.<br />
<span id="more-21050"></span><br />
<a href="http://www.gzip.org/" title="Gzip Homepage" target="_blank">Gzip</a> is a compression tool with many uses, including compressing the output of your webserver. If you are running NGINX on Linux, Gzip is already installed.</p>
<p>You can add these directives in the http, server, or location blocks of your NGINX config file, depending on your needs.</p>
<pre>
gzip on;
gzip_proxied any;
gzip_types text/plain text/css text/javascript text/xml application/xml application/xhtml+xml application/xml+rss;
gzip_disable "MSIE [1-6].";
</pre>
<p>Code breakdown:</p>
<ol>
<li><code>gzip</code> &#8211; Enable Gzip</li>
<li><code>gzip_proxied</code> &#8211; Gzip all requests. See the list of parameters here &#8211; <a href="http://wiki.nginx.org/HttpGzipModule#gzip_proxied" target="_blank">gzip_proxied</a></li>
<li><code>gzip_types</code> &#8211; Types of content to gzip. Note that text/html is enabled by default, and will cause a warning if you add it here.</li>
<li><code>gzip_disable</code> &#8211; Prevent compression to old versions of Internet Explorer.</li>
</ol>
<h2>Other Gzip Settings</h2>
<p>There are a few other settings that can be used that I have not added here. Above is what I use, but you can customize it further. I don&#8217;t see any reason to change these from the default values, so I leave them alone.</p>
<h3>gzip_comp_level</h3>
<p>You can increase the level of compression, for the price of server work. The default level is 1, which is what most people use. It is generally agreed that raising <code>gzip_comp_level</code> is a performance anti-pattern, as it takes longer than the savings gained by the extra compression.</p>
<h3>gzip_min_length</h3>
<p>With this, you can set the minimum size file in bytes to gzip. The default is 20 bytes.</p>
<p>There are even more settings, but I don&#8217;t understand them very well, and based on the documentation they look likely to cause bugs, so I have left them out.</p>
<p>If you want to read more about Gzipping with your NGINX server, check out the <a href="http://wiki.nginx.org/HttpGzipModule" target="_blank">official documentation</a>.</p>
<p><a href="http://jeffsebring.com">Jeff Sebring - WordPress Consulting &amp; Development ✦ Spokane</a></p>]]></content:encoded>
			<wfw:commentRss>http://jeffsebring.com/2012/gzip-nginx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NGINX 301 Redirects</title>
		<link>http://jeffsebring.com/2012/nginx-301-redirects/</link>
		<comments>http://jeffsebring.com/2012/nginx-301-redirects/#comments</comments>
		<pubDate>Thu, 25 Oct 2012 04:03:58 +0000</pubDate>
		<dc:creator>Jeff Sebring</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[NGINX]]></category>

		<guid isPermaLink="false">http://jeffsebring.com/?p=21028</guid>
		<description><![CDATA[<p>NGINX is a great lightweight webserver, and the one this blog runs on. Having made many iterations including merging other blogs into it, and removing posts and entire sections, I&#8217;ve had to create a number of redirects for both user experience and search engine indexing. This post will show you how to create a variety [...]</p><p><a href="http://jeffsebring.com">Jeff Sebring - WordPress Consulting &amp; Development ✦ Spokane</a></p>]]></description>
				<content:encoded><![CDATA[<p>NGINX is a great lightweight webserver, and the one this blog runs on. Having made many iterations including merging other blogs into it, and removing posts and entire sections, I&#8217;ve had to create a number of redirects for both user experience and search engine indexing. This post will show you how to create a variety of 301 Permanent redirects in your NGINX config file.<br />
<span id="more-21028"></span><br />
Avoid redirecting pages, and keep the url the same when rebuilding a site when you can, but if you do need to redirect domains, directories, or pages on an NGINX server this will help.</p>
<h2 id="domain-redirects">NGINX Domain Redirects</h2>
<p>For new websites, having the www before your domain is really not needed. Here is how to redirect the www version of your website to the cleaner, non-www version.</p>
<h3>WWW to Non-WWW Redirect</h3>
<pre>
server   {
   server_name www.domain.com;
   rewrite  ^/(.*)$  http://domain.com/$1 permanent;
}
</pre>
<h3>Non-WWW to WWW Redirect</h3>
<p>Alternately, if your site has been around a long time, and used the www version, you can make sure users are redirected to the www version.</p>
<pre>
server   {
   server_name domain.com;
   rewrite  ^/(.*)$  http://www.domain.com/$1 permanent;
}
</pre>
<h2 id="directory-redirects">NGINX Directory Redirect</h2>
<p>You may need to redirect an entire directory of pages to another if you rename it. I tend to change the structure of this site quite often, so I&#8217;ve got a couple of them in my config file.</p>
<p>This directive goes within the main server block of your sites NGINX config.</p>
<pre>
   if ( $request_filename ~ old-directory/.+ ) {
       rewrite ^(.*) http://domain.com/new-directory/$1 permanent;
   }
</pre>
<p>If you are redirecting to top level pages on your site, use this:</p>
<pre>
   if ( $request_filename ~ old-directory/.+ ) {
       rewrite ^(.*) http://domain.com/$1 permanent;
   }
</pre>
<h2 id="page-redirect">NGINX Single Page Redirect</h2>
<p>When you rebuild a website, it&#8217;s common to remove pages, or rename them. If the page has links from other website, you don&#8217;t want users who click the link to land on a 404 Error page. The best thing to do in this case is to send the user to the next most useful page.</p>
<p>Use this directive in the server block to redirect single pages. </p>
<pre>
   if ( $request_filename ~ old-page/ ) {
      rewrite ^ http://jeffsebring.com/next-best-page/? permanent;
   }
</pre>
<p><a href="http://jeffsebring.com">Jeff Sebring - WordPress Consulting &amp; Development ✦ Spokane</a></p>]]></content:encoded>
			<wfw:commentRss>http://jeffsebring.com/2012/nginx-301-redirects/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Validation and Confirmation for Hidden Gravity Forms in WordPress</title>
		<link>http://jeffsebring.com/2012/validation-confirmation-hidden-gravity-forms-wordpress/</link>
		<comments>http://jeffsebring.com/2012/validation-confirmation-hidden-gravity-forms-wordpress/#comments</comments>
		<pubDate>Tue, 23 Oct 2012 23:07:41 +0000</pubDate>
		<dc:creator>Jeff Sebring</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://jeffsebring.com/?p=20983</guid>
		<description><![CDATA[<p>Today I was putting a Gravity Form in the footer of a site with long pages, hiding the form by default, and displaying it when a user clicks the contact link using a little jQuery. Since Gravity Forms shows validation and ( optionally ) confirmation messages on the form itself, this presented a problem when [...]</p><p><a href="http://jeffsebring.com">Jeff Sebring - WordPress Consulting &amp; Development ✦ Spokane</a></p>]]></description>
				<content:encoded><![CDATA[<p>Today I was putting a Gravity Form in the footer of a site with long pages, hiding the form by default, and displaying it when a user clicks the contact link using a little jQuery. Since Gravity Forms shows validation and ( optionally ) confirmation messages on the form itself, this presented a problem when the form is submitted, and the page reloads, hiding the form again.<br />
<span id="more-20983"></span></p>
<h2>Creating the Hidden Form using jQuery</h2>
<p>In my footer template file, there is a div to wrap all the elements, one for the form itself, and a link to click and display the form. Note the use of <a href="http://codex.wordpress.org/Function_Reference/do_shortcode" title="WordPress Codex page for do_shortcode" target="_blank"><code>do_shortcode</code></a> function to show the form.</p>
<p>First, we need to print the html. Mine is in the footer.php template of the theme.</p>
<div class="gisted"><section class="gist-files">
<pre class="gisted-file-contents">&lt;div class=&quot;contact&quot;&gt;
&lt;div class=&quot;contact_form&quot;&gt;
&lt;?php echo do_shortcode( &#039;[gravityform id=&quot;1&quot; title=&quot;true&quot; description=&quot;false&quot;]&#039; ); ?&gt;	
&lt;/div&gt;
&lt;a class=&quot;contact_link&quot; href=&quot;javascript:void(null);&quot; title=&quot;Contact Support&quot;&gt;Contact Support&lt;/a&gt;
&lt;/div&gt;</pre>
</section>
</div>

<p>The form starts hidden, using a little css in the theme stylesheet:</p>
<div class="gisted"><section class="gist-files">
<pre class="gisted-file-contents">.contact_form {
  display: none;
}</pre>
</section>
</div>

<p>We also need some javascript. In case you don&#8217;t already have a file loading for your theme, here&#8217;s how to do it, and make sure jquery is loaded for you.</p>
<div class="gisted"><section class="gist-files">
<pre class="gisted-file-contents"># Use the wp_enqueue_scripts hook to enqueue scripts and styles
add_action( &#039;wp_enqueue_scripts&#039;, &#039;mytheme_enqueue&#039;, 99999);

# Callback function
function mytheme_enqueue()
{

	wp_enqueue_script( &#039;mytheme&#039;, get_stylesheet_directory_uri() . &#039;/javascripts/theme.js&#039;, array( &#039;jquery&#039; ), &#039;&#039;, &#039;footer&#039; );

}</pre>
</section>
</div>

<p>In the theme&#8217;s javascript file we just included, we have a click event on the link, which both toggles the form div, and scrolls the page to the bottom, since it is in the footer.</p>
<div class="gisted"><section class="gist-files">
<pre class="gisted-file-contents">jQuery(document).ready(function() {

	$( &#039;.contact_link&#039; ).click( function() {

		$( &#039;.contact_form&#039; ).toggle( &#039;slow&#039; );

		$(&#039;html, body&#039;).animate({scrollTop:$(document).height()}, &#039;slow&#039;);

	});

});</pre>
</section>
</div>

<h2>Showing Validation Errors</h2>
<p>Now that we have our nifty hidden form that toggles open when the user clicks the contact link, lets make sure they see the confirmation and validation errors.</p>
<p>In our theme functions file, we will check to see if the form has been submitted using the superglobal <code>$_POST</code> array, which will contain the data from the form submission. The variable for your form, will be <code>is_submit_1</code>, the &#8217;1&#8242; being the id of the gravity form.</p>
<p>We simply check to see if that variable is set, and print some javascript in the footer if so. For just a couple of lines of scripting, that only shows when the form is submitted, I think embedding it is the best choice, but you can also put it in an external script to enqueue as well.</p>
<div class="gisted"><section class="gist-files">
<pre class="gisted-file-contents"># Was this form submitted?
if ( isset( $_POST[ &#039;is_submit_1&#039; ] ) ) :

# Print our javascript in the footer.
add_action( &#039;wp_footer&#039;, function()
{ ?&gt;
&lt;script&gt;
jQuery(document).ready(function() {
	$( &#039;.contact_form&#039; ).toggle( 0 );
	$(&#039;html, body&#039;).animate({scrollTop:$(document).height()}, 0);
});
&lt;/script&gt;
&lt;?php }, 99999);

endif;</pre>
</section>
</div>

<p>The script is identical to what we used to show the form on the click event, aside from the easing parameter. We don&#8217;t want to make people dizzy by scrolling all the way down the page. Change the easing parameter on both functions to 0.</p>
<p>This post is specific to Gravity Forms, but you can use the same techniques for any form.</p>
<hr />
<p>I have a developer&#8217;s license for Gravity Forms, and it&#8217;s the best money I&#8217;ve ever spent on a plugin. Use the big red link below to get a support license if you don&#8217;t have one already -</p>
<p><a style="color: red; font-weight: bold; font-size: 1.2em;" href="http://jeffsebring.com/gforms">Get Gravity Forms</a></p>
<p><a href="http://jeffsebring.com">Jeff Sebring - WordPress Consulting &amp; Development ✦ Spokane</a></p>]]></content:encoded>
			<wfw:commentRss>http://jeffsebring.com/2012/validation-confirmation-hidden-gravity-forms-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to Use Web Fonts with WordPress</title>
		<link>http://jeffsebring.com/2012/how-to-use-web-fonts-with-wordpress/</link>
		<comments>http://jeffsebring.com/2012/how-to-use-web-fonts-with-wordpress/#comments</comments>
		<pubDate>Wed, 11 Apr 2012 23:15:34 +0000</pubDate>
		<dc:creator>Jeff Sebring</dc:creator>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Fonts]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://jeffsebring.com/?p=17337</guid>
		<description><![CDATA[<p>There are a ton of choices if you want to use web fonts on your website. With those choices come different methods of adding them to WordPress. Let&#8217;s do it right, and avoid problems later. Don&#8217;t Edit These Files Unless you wrote a theme, plugin, or the WordPress core, don&#8217;t edit it. There may come [...]</p><p><a href="http://jeffsebring.com">Jeff Sebring - WordPress Consulting &amp; Development ✦ Spokane</a></p>]]></description>
				<content:encoded><![CDATA[<p>There are a ton of choices if you want to use web fonts on your website. With those choices come different methods of adding them to WordPress. Let&#8217;s do it right, and avoid problems later.<br />
<span id="more-17337"></span></p>
<h3>Don&#8217;t Edit These Files</h3>
<p>Unless you wrote a theme, plugin, or the WordPress core, don&#8217;t edit it. There may come a time when it is updated, or you need support, and your changes will be overwritten, or prevent support. The WordPress API gives you plenty of ways to get things done.</p>
<p>The two ways to interact with WordPress are plugins and themes. Themes handle the display of content, and plugins extend WordPress&#8217;s generation of content. In the case of themes, you will want to create a <a href="http://codex.wordpress.org/Child_Themes">Child Theme</a>. If you are already using a child theme skin designed for a framework that may be updated, you can <a href="http://codex.wordpress.org/Writing_a_Plugin#Creating_a_Plugin">create a plugin</a>.</p>
<p>Google Web Font fans can also use my <a href="http://jeffsebring.com/wordpress/plugins/google-web-fonts/">Google Web Fonts for WordPress Plugin</a> to take care of all of this for you. Do it yourself types, keep reading.</p>
<h2>Importing External Fonts, The Right Way</h2>
<p>Using most web font services, you will need to link a css file in the header. You might be tempted to just open up the header.php, and paste it in. There&#8217;s a better way.</p>
<p>WordPress has a bunch of &#8220;<a href="http://codex.wordpress.org/Plugin_API/Action_Reference">actions</a>&#8221; it runs in a particular order. These are designated for certain tasks, like adding stylesheets or Javascript files.</p>
<p>Every theme must contain the function <a href="http://codex.wordpress.org/Function_Reference/wp_head">wp_head</a>, which is what most links in the header are printed through. There are a number of other hooks that are run through <code>wp_head</code>. The <code>wp_enqueue_scripts</code> hook is specifically used for printing links to stylesheets and scripts.</p>
<p>A the time of writing this post, my blog uses <a href="http://fontdeck.com">FontDeck</a> for font licensing and delivery. When I selected my fonts, I was given a snippet like this to put in the document head:</p>
<pre><code>&lt;link rel="stylesheet" href="FONT_STYLESHEET" type="text/css" /&gt;
</code></pre>
<p>** I&#8217;ve replaced the actual link with FONT_STYLESHEET.</p>
<p>WordPress will create the link tag, so I just need <code>FONT_STYLESHEET</code>. Since this is a child theme I wrote, I&#8217;ll use it&#8217;s functions.php file to add the PHP code.</p>
<h3>Using wp_enqueue_scripts</h3>
<p>What we&#8217;ll do is use <a href="http://codex.wordpress.org/Function_Reference/add_action">add_action</a>, with the hook <code>wp_enqueue_scripts</code>, using a <a href="http://php.net/manual/en/functions.anonymous.php">PHP Closure</a> containing the <a href="http://codex.wordpress.org/Function_Reference/wp_enqueue_style">wp_enqueue_style</a> function. We will pass <code>wp_enqueue_style</code> arguments to tell it what stylesheet to link.</p>
<p>Here it is in action:</p>
<pre><code>add_action( 'wp_enqueue_scripts', function() { # Hook into wp_enqueue_scripts with a closure

    wp_enqueue_style(
        'FONT_STYLESHEET_HANDLE', # replace with a name for your font stylesheet
        'FONT_STYLESHEET' # replace with url to your font stylesheet
    );

});
</code></pre>
<h3>Importing Fonts in Stylesheets</h3>
<p>Another way you can import fonts, is using the <code>@import</code> rule to import from your stylesheet directly. You will see this option in Google Web Fonts, and some other services. It&#8217;s as easy using @import as is as pasting the snippet, but not as good for performance ( See -<a href="http://developer.yahoo.com/performance/rules.html#csslink">Yahoo Performance Rules &#8211; Choose <code>&lt;link&gt;</code> over @import</a> ).</p>
<h3>Import Fonts with @font-face</h3>
<p>What you will see if you look at one of these external stylesheets is &#8216;@font-face&#8217; rules, importing the fonts from the provider&#8217;s server, to the browser. You will do the same when using fonts hosted on your webserver.</p>
<p>Here&#8217;s an @font-face rule for one of my favorite serifs:</p>
<pre><code>@font-face  {
   font-family:'ProcionoRegular';
   src:url("../fonts/Prociono-Regular-webfont.eot");
   src: local('☺'),
      url("../fonts/Prociono-Regular-webfont.eot?#iefix") format("embedded-opentype"),
      url("../fonts/Prociono-Regular-webfont.woff") format("woff"),
      url("../fonts/Prociono-Regular-webfont.ttf") format("truetype"),
      url("../fonts/Prociono-Regular-webfont.svg#ProcionoRegular") format("svg");
   font-weight:normal;
   font-style:normal
}
</code></pre>
<h3>Javascript Font Loaders</h3>
<p>Some web font services like <a href="http://typekit.com">Typekit</a> use a javascript font loader to load fonts. These are a little different to implement. They will also give you a little snippet of HTML for the head of your document. Since it&#8217;s not just a single stylesheet link, we will use the <code>wp_head</code> hook itself to print it.</p>
<p>Like before, we will use <code>add_action</code>, but this time hook into <code>wp_head</code>, and use a closure for the callback to print the HTML.</p>
<p>Here is an example of how to implement a Typekit font kit:</p>
<pre><code>add_action( 'wp_head', function() { ?&gt;

   &lt;script type="text/javascript" src="http://use.typekit.com/CHANGE_THIS.js"&gt;&lt;/script&gt;
   &lt;script type="text/javascript"&gt;try{Typekit.load();}catch(e){}&lt;/script&gt;

&lt;?php });
</code></pre>
<p>By now, you presumably have your web fonts imported, and available for use in your stylesheets, regardless if the service or method you chose to deliver them.</p>
<p>If you want more options for what fonts you can use, check out my article on <a href="http://jeffsebring.com/make-your-own-font-face-web-font-kit/">How to make your own @font-face web font kit</a>.</p>
<p><a href="http://jeffsebring.com">Jeff Sebring - WordPress Consulting &amp; Development ✦ Spokane</a></p>]]></content:encoded>
			<wfw:commentRss>http://jeffsebring.com/2012/how-to-use-web-fonts-with-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mission Critical Hover States are Evil</title>
		<link>http://jeffsebring.com/2012/mission-critical-hover-states-are-evil/</link>
		<comments>http://jeffsebring.com/2012/mission-critical-hover-states-are-evil/#comments</comments>
		<pubDate>Fri, 10 Feb 2012 06:58:05 +0000</pubDate>
		<dc:creator>Jeff Sebring</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Design]]></category>

		<guid isPermaLink="false">http://jeffsebring.com/?p=12247</guid>
		<description><![CDATA[<p>You don&#8217;t have to build websites to know what a dropdown menu is, and how common they are. Almost every website in the last decade with complicated taxonomy has a dropdown, and clients expect them. It&#8217;s not too hard to create a Dropdown menu. I like to use Chris Coyier&#8217;s Simple jQuery Dropdowns. It&#8217;s slim [...]</p><p><a href="http://jeffsebring.com">Jeff Sebring - WordPress Consulting &amp; Development ✦ Spokane</a></p>]]></description>
				<content:encoded><![CDATA[<p>You don&#8217;t have to build websites to know what a dropdown menu is, and how common they are. Almost every website in the last decade with complicated taxonomy has a dropdown, and clients expect them.<br />
<span id="more-12247"></span><br />
It&#8217;s not too hard to create a Dropdown menu. I like to use Chris Coyier&#8217;s <a href="http://css-tricks.com/simple-jquery-dropdowns/">Simple jQuery Dropdowns</a>. It&#8217;s slim in code and works great, but should I be creating dropdown menus?</p>
<p>Just because a particular method of providing a user interface has been popular in the past doesn&#8217;t mean it&#8217;s even usable today. The hardware people are using to access the websites you are building will continue to change and evolve far faster than you can anticipate.</p>
<h2>Websites of the Future</h2>
<p>As responsible people who build websites ( I don&#8217;t think designer or developer are accurate anymore, got a new Pronoun? ), we have to start accepting the chaos. I don&#8217;t want to build websites that won&#8217;t work in 2 years when a new way to interact with them is standard.</p>
<p>We&#8217;ve gotten past the flash. Everyone hows why that is evil now. The next evil  doer, in my opinion is the <strong>mission critical hover state</strong>.</p>
<h2>Design Critical Menus</h2>
<p>Every website has a goal, or set of goals. The main menu of a website is generally going to be critical to these goals, and where the dropdown menu lives.</p>
<p>I treat the masthead of a website as the most valuable piece of real estate. The ONLY links or text to go in the header should be something you need to have available on every page of the site.</p>
<h2>What Menu?</h2>
<p>The elephant in the room here is that touch devices don&#8217;t have a hover state. Your dropdown menu will never be seen from a phone or touch computer.</p>
<p>When you consider that the hover state only works with a cursor, there are a lot of fairly common design techniques that fall apart.</p>
<h2>Links will always work</h2>
<p>One of the most important elements of the web is the hyperlink. This is what makes it a web.</p>
<p>Dropdown menus revolve around the CSS :hover state, and often jQuery, and are essentially a hack. For quite a while, they were a great way to tuck away a submenu. That was when the only device to really interact with a website was a  full sized PC or laptop. The little smart phones before the iPhone could browse, but nobody really expected to be able to use a website efficiently with one.</p>
<p>Obviously, there are many websites that need complicated menus and ways to divide choices without overwhelming users. The way to proceed is with good, old fashioned CLICK, and a little more creativity. Only display what you really need. The website doesn&#8217;t have 20 high priority goals.</p>
<p>Use things like the <a href="http://docs.jquery.com/UI/Accordion">jQuery UI Accordion</a> which requires a click to display the contents, and indicate that there are contents without a hover.</p>
<h2>Back to Reality</h2>
<p>There are going to be many clients who continue to require these horrible things. The best we can do is inform them of why they aren&#8217;t the best idea today, and find alternatives that provide better results. Given the rise in use of tablet computers like the iPad, this isn&#8217;t very difficult when compared to a design that didn&#8217;t take them into consideration.</p>
<p><a href="http://jeffsebring.com">Jeff Sebring - WordPress Consulting &amp; Development ✦ Spokane</a></p>]]></content:encoded>
			<wfw:commentRss>http://jeffsebring.com/2012/mission-critical-hover-states-are-evil/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nesting Modernizr.js Selectors with SASS and Compass</title>
		<link>http://jeffsebring.com/2012/nesting-modernizr-selectors-sass-compass/</link>
		<comments>http://jeffsebring.com/2012/nesting-modernizr-selectors-sass-compass/#comments</comments>
		<pubDate>Wed, 08 Feb 2012 05:58:34 +0000</pubDate>
		<dc:creator>Jeff Sebring</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Compass]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://jeffsebring.com/?p=11940</guid>
		<description><![CDATA[<p>If you&#8217;re going to use CSS3 properties in your designs, it&#8217;s a good idea to make sure you aren&#8217;t trying to apply them where they aren&#8217;t supported. Old browsers have a hard enough time trying to grok your newfangled HTML(5). Don&#8217;t confuse them with transforms and text shadow. You can use nested CSS selectors in [...]</p><p><a href="http://jeffsebring.com">Jeff Sebring - WordPress Consulting &amp; Development ✦ Spokane</a></p>]]></description>
				<content:encoded><![CDATA[<p>If you&#8217;re going to use CSS3 properties in your designs, it&#8217;s a good idea to make sure you aren&#8217;t trying to apply them where they aren&#8217;t supported. Old browsers have a hard enough time trying to grok your newfangled HTML(5). Don&#8217;t confuse them with transforms and text shadow.<br />
<span id="more-11940"></span><br />
You can use nested CSS selectors in <a href="http://compass-style.org/">Compass</a> or <a href="http://sass-lang.com/">SASS</a> syntax to make browser feature targeting with <a href="http://www.modernizr.com/">Modernizr.js</a> really easy.</p>
<p>Modernizr creates an html class if the feature is available in the browser rendering the page. Just wrap your styles with the selector for the feature you&#8217;re using like so:</p>
<div class="gisted"><section class="gist-files">
<span class="gisted-file" id="modernizr_nested.scss">
<h5>Nested Modernizr Classes with Compass</h5> &rArr;
<a target="_blank" href="https://gist.github.com/2271137#modernizr_nested.scss">
modernizr_nested.scss
</a>
</span>
<pre class="gisted-file-contents">.textshadow {
    .widget h3 {
        text-shadow: -1px -1px 0 #aaa, 2px 2px 5px #3a3a3a;
    }
}</pre>
</section>
</div>

<p>If you really want to go the extra mile for performance, use Modernizr&#8217;s built in <a href="http://yepnopejs.com/">YepNope.js</a>  conditional loader to load feature specific stylesheets or Javascript only when they can be used.</p>
<p><a href="http://jeffsebring.com">Jeff Sebring - WordPress Consulting &amp; Development ✦ Spokane</a></p>]]></content:encoded>
			<wfw:commentRss>http://jeffsebring.com/2012/nesting-modernizr-selectors-sass-compass/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>I&#8217;m Starting a Personal Journal</title>
		<link>http://jeffsebring.com/2012/starting-a-personal-journal/</link>
		<comments>http://jeffsebring.com/2012/starting-a-personal-journal/#comments</comments>
		<pubDate>Tue, 31 Jan 2012 22:24:40 +0000</pubDate>
		<dc:creator>Jeff Sebring</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://jeffsebring.com/?p=10307</guid>
		<description><![CDATA[<p>I always thought of my next door neighbor Ray as my grandfather. Ray was an old WWI vet, retired trucker, and junior golf instructor who had a stack of hardbound journals he had written in for decades. I remember one of the things he shared about his Parkinson&#8217;s, was the difficulty writing in his journal. [...]</p><p><a href="http://jeffsebring.com">Jeff Sebring - WordPress Consulting &amp; Development ✦ Spokane</a></p>]]></description>
				<content:encoded><![CDATA[<p>I always thought of my next door neighbor Ray as my grandfather. Ray was an old WWI vet, retired trucker, and junior golf instructor who had a stack of hardbound journals he had written in for decades. I remember one of the things he shared about his Parkinson&#8217;s, was the difficulty writing in his journal. It had become a very important part of his life. I wish I had started one then, when I was a kid. Ray told me as much.<br />
<span id="more-10307"></span><br />
I recently decided to start a personal journal to record my days activities and thoughts, and to be able to reflect on them later. I think keeping a daily journal will be useful in many ways, far more than just having my life on paper.</p>
<h2>Writing every day</h2>
<p>I&#8217;m one of these pathetic bloggers who really enjoys writing, but doesn&#8217;t do it much. I&#8217;ve got plenty of great excuses too:</p>
<ul>
<li>I&#8217;m busy working</li>
<li>I need to finish &#8220;insert one of my many side projects here&#8221;</li>
<li>Usually three paragraphs in, I realize how dumb of an idea the post I&#8217;m writing is.</li>
<li>I want to stay &#8220;on-topic&#8221; with what I&#8217;ve written about before</li>
<li>Someone else wrote about it better</li>
</ul>
<p>Ok, these are all really lame reasons to not write. The real reason is that I haven&#8217;t gotten into the habit of doing it. It&#8217;s always hard work to form new habits.</p>
<p>A journal will be a great way for me to get in the habit of writing every day. By putting my thoughts on paper, I will solidify, and give more respect to my ideas, and life in general. Hopefully this will lead me to share more ideas here on my blog.</p>
<h2>Look at your thoughts</h2>
<p>One of the biggest benefits of a journal, in my eyes, is that it gives you a chance to actually look at your thoughts. Both the act of writing them down, and reading them can give you a new perspective on them. Some things you think one day might seem ridiculous the next.</p>
<p>For this reason, I&#8217;ve decided to start each day by reading the previous day&#8217;s entries, and commenting on them. By forcing myself to look at what I was thinking, I can review the conclusions I may have come to. We all know hindsight is 20/20, but how much do we use it to our advantage? How can we give our ideas, activities and thoughts more measured attention? Start a personal journal.</p>
<p>In order to reference entries in comments, and make it easy to review, I&#8217;m using a simple numbering method, combined with symbols. Each day starts at 01 ( I doubt I&#8217;ll ever need 3 digits in a day ), and may prefix the number with a symbol to signify what the entry is relevant to.</p>
<h2>Writing on paper</h2>
<p>As a web developer, I spend A LOT of time typing. I write code and emails all day for a living and fun ( the emails aren&#8217;t as fun as the code ). The last thing I want to do is write a personal journal into text files. Aside from my affection for stationary and fine pens, the act of handwriting has a quality of it&#8217;s own that I really enjoy.</p>
<p>Creative people often forget how beneficial it can be to exercise different parts of their mind. Working with your hands, and the control needed for handwriting can be a sort of meditation. You are forced to pause and formulate your thoughts more. For a computer geek like me, typing doesn&#8217;t require any thought. Words spill from my fingers onto the mechanical switches of my klackity <a href="http://www.amazon.com/dp/B003N3HFI6/?tag=jeffsebr-20">Tactile Pro</a> sometimes faster than I can compose them well.</p>
<h2>Make a commitment, use an ink pen</h2>
<p>When I first picked up the journal to start writing in it, I started with a pencil. I thought it would be good to be able to rewrite, and make sure it&#8217;s neat and tidy. That was a big mistake. I spent about 20 minutes writing and erasing before stopping, and getting a pen.</p>
<p>There is something telling about the way you write. Some people make a career out of analyzing handwriting. Perhaps over time, I will be able to look at the way I write each day as a journal entry in itself, telling me things about myself at the time of writing them that I might not be aware of, or wouldn&#8217;t write. Was I having trouble staying in the lines, was my script nice, or sloppy? Did I write in it after a few beers?</p>
<p>I also decided I want it to be perfect in the way that it is just what I wrote at the time, no erasing or editing. Don&#8217;t pull a George Lucas on your journal. You deserve the original article when you look at it later.</p>
<h2>Whitelines Squared</h2>
<p>Of course, starting a journal, I need something to write in. Having a ridiculous fetish for paper products, my needs were pretty specific.</p>
<p>My journal needed to fit the following criteria:</p>
<ul>
<li>hardbound</li>
<li>clean black cover</li>
<li>book ribbon</li>
<li>heavy graph paper</li>
<li>environmentally friendly</li>
<li>size A5 ( 6 x 8.5 inches )</li>
</ul>
<p>With this in mind, the Amazon navigation lead me to the <a href="http://www.amazon.com/dp/B0052XQDUG/?tag=jeffsebr-20">Whitelines Hard Bound A5 Notebook</a>. It has everything I wanted, aside from the clean black cover, but the orange stripe doesn&#8217;t bother me, as it&#8217;s using <a href="http://en.wikipedia.org/wiki/Futura_(typeface)">Futura</a>, and the orange is a nice contrast to the black cover. It&#8217;s not surprising that they would be so beautiful, and enjoyable to write in. Whitelines was founded by a Swedish designer named <a href="https://twitter.com/OHansson">Olof Hansson</a>.</p>
<p>The killer feature of the Whitelines, is the  . . . white lines. Instead of a high contrast blue grid on white, the paper is shaded light gray, with white lines. I find that the white lines provide guidance, but are not too demanding, or distracting. The words are what stand out, not your guidlines.</p>
<p>Though I am not really a stickler about recycled paper or finding out &#8220;how the sausage is made&#8221;, I prefer to give my money to companies who take responsibility for themselves. Whitelines makes the following statement about their paper processing:</p>
<blockquote><p>
  And not only is Whitelines working harder to support you and your ideas, but it is working harder to support the environment; the paper is processed and printed in a mill in the South of Sweden with zero carbon emissions.
</p></blockquote>
<p>If you are considering starting a personal journal, I hope this pushes you over the edge. When you&#8217;re old, looking back at your life, you&#8217;re more likely to wish you had started a journal than to think it was a waste of time.</p>
<p><a href="http://jeffsebring.com">Jeff Sebring - WordPress Consulting &amp; Development ✦ Spokane</a></p>]]></content:encoded>
			<wfw:commentRss>http://jeffsebring.com/2012/starting-a-personal-journal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Keep your SSH session from timing out</title>
		<link>http://jeffsebring.com/2011/keep-your-ssh-session-from-timing-out/</link>
		<comments>http://jeffsebring.com/2011/keep-your-ssh-session-from-timing-out/#comments</comments>
		<pubDate>Mon, 14 Nov 2011 01:22:10 +0000</pubDate>
		<dc:creator>Jeff Sebring</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://new.jeffsebring.net/?p=2467</guid>
		<description><![CDATA[<p>So there you are, working away on your web server making something magical through ssh. You get a phone call, or check Twitter, read an article or something. It was only a few minutes! You go back to your terminal, and it just doesn&#8217;t respond, for the 50th time today. Now you get to start [...]</p><p><a href="http://jeffsebring.com">Jeff Sebring - WordPress Consulting &amp; Development ✦ Spokane</a></p>]]></description>
				<content:encoded><![CDATA[<p>So there you are, working away on your web server making something magical through ssh. You get a phone call, or check Twitter, read an article or something. It was only a few minutes!<br />
<span id="more-2467"></span><br />
You go back to your terminal, and it just doesn&#8217;t respond, for the 50th time today. Now you get to start all over again reconnecting any sessions you may need for what you are doing.</p>
<p>What is happening is that the server has not received any data, and your session timed out.</p>
<p>There is an easy command that takes care of this when you connect:</p>
<pre>ssh -o ServerAliveInterval=60 username@domain.com
</pre>
<p>This will send the server a bit every 60 seconds if you don&#8217;t, keeping your connection alive indefinitely.</p>
<p><a href="http://jeffsebring.com">Jeff Sebring - WordPress Consulting &amp; Development ✦ Spokane</a></p>]]></content:encoded>
			<wfw:commentRss>http://jeffsebring.com/2011/keep-your-ssh-session-from-timing-out/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Compass Nested Media Queries</title>
		<link>http://jeffsebring.com/2011/compass-nested-media-queries/</link>
		<comments>http://jeffsebring.com/2011/compass-nested-media-queries/#comments</comments>
		<pubDate>Mon, 31 Oct 2011 05:43:38 +0000</pubDate>
		<dc:creator>Jeff Sebring</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Compass]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Responsive]]></category>

		<guid isPermaLink="false">http://new.jeffsebring.net/?p=2465</guid>
		<description><![CDATA[<p>If you are using Compass, you are probably also at least playing with media queries and Responsive web design. Have you tried nesting media queries in compass? Just nest your conditional styles in a media query, and compass will output a normal media query for your responsive pleasure. This is a great alternative to moving [...]</p><p><a href="http://jeffsebring.com">Jeff Sebring - WordPress Consulting &amp; Development ✦ Spokane</a></p>]]></description>
				<content:encoded><![CDATA[<p>If you are using <a href="http://compass-style.org/">Compass</a>, you are probably also at least playing with <a href="http://www.w3.org/TR/css3-mediaqueries/">media queries</a> and <a href="http://www.alistapart.com/articles/responsive-web-design/">Responsive web design</a>.<br />
<span id="more-2465"></span><br />
Have you tried nesting media queries in compass? Just nest your conditional styles in a media query, and compass will output a normal media query for your responsive pleasure.</p>
<p>This is a great alternative to moving to a separate part of your file or switching files and finding the right place in your media query for your new rule.</p>
<div class="gisted"><header class="gist-header">
<div class="gist-info">
<h4>Compass Nested Media Queries</h4>
<span class="gist-link">by 
<a target="_blank" class="gist-author-link" href="http://github.com/jeffsebring">
jeffsebring</a>
</span>
<span class="gist-link">Fork it on 
<a target="_blank" href="https://gist.github.com/2565614">
Github
</a>
</span>
</div>
<img class="gist-author-avatar" src="https://secure.gravatar.com/avatar/fcdb41e87bb70a1b1b4c42925b857ffe?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png" />
</header>
<section class="gist-files">
<span class="gisted-file" id="nested_media_queries.scss">
<h5>Compass Nested Media Queries</h5> &rArr;
<a target="_blank" href="https://gist.github.com/2565614#nested_media_queries.scss">
nested_media_queries.scss
</a>
</span>
<pre class="gisted-file-contents">#sidebar    {
    width: 100%;

    @media only screen and ( min-width: 480px; )    {
        width: 33.33333%;
        float: right;
    }
}
</pre>
</section>
</div>

<p><a href="http://jeffsebring.com">Jeff Sebring - WordPress Consulting &amp; Development ✦ Spokane</a></p>]]></content:encoded>
			<wfw:commentRss>http://jeffsebring.com/2011/compass-nested-media-queries/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Responsive WordPress Images</title>
		<link>http://jeffsebring.com/2011/responsive-wordpress-images/</link>
		<comments>http://jeffsebring.com/2011/responsive-wordpress-images/#comments</comments>
		<pubDate>Tue, 25 Oct 2011 02:08:13 +0000</pubDate>
		<dc:creator>Jeff Sebring</dc:creator>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Responsive]]></category>

		<guid isPermaLink="false">http://new.jeffsebring.net/?p=2463</guid>
		<description><![CDATA[<p>WordPress has a few default classes used for things like image alignment, galleries and other html output by core features. This is a combination of the styles found in the default WordPress TwentyEleven theme, and some modifications of my own. Include this snippet with your css to save a bunch of time building your responsive [...]</p><p><a href="http://jeffsebring.com">Jeff Sebring - WordPress Consulting &amp; Development ✦ Spokane</a></p>]]></description>
				<content:encoded><![CDATA[<p>WordPress has a few default classes used for things like image alignment, galleries and other html output by core features. This is a combination of the styles found in the default WordPress TwentyEleven theme, and some modifications of my own. Include this snippet with your css to save a bunch of time building your responsive WordPress theme.<br />
<span id="more-2463"></span></p>
<p>I&#8217;ll continue to update this Gist as needed for my own use. Feel free to fork it.</p>
<div class="gisted"><header class="gist-header">
<div class="gist-info">
<h4>Responsive WordPress Core Theme Styles</h4>
<span class="gist-link">by 
<a target="_blank" class="gist-author-link" href="http://github.com/jeffsebring">
jeffsebring</a>
</span>
<span class="gist-link">Fork it on 
<a target="_blank" href="https://gist.github.com/2271757">
Github
</a>
</span>
</div>
<img class="gist-author-avatar" src="https://secure.gravatar.com/avatar/fcdb41e87bb70a1b1b4c42925b857ffe?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png" />
</header>
<section class="gist-files">
<span class="gisted-file" id="responsive_wordpress.css">
<h5>Responsive WordPress Core Theme Styles</h5> &rArr;
<a target="_blank" href="https://gist.github.com/2271757#responsive_wordpress.css">
responsive_wordpress.css
</a>
</span>
<pre class="gisted-file-contents">/**
 * Responsive WordPress Core Theme Styles
 * http://jeffsebring.com/responsive-wordpress-images/
--------------------------------------------------- */

.sticky,
.bypostauthor,
.gallery-caption {
   display: normal;
}

.alignnone {
   margin: 1em 1em 1em 0;
}

.aligncenter,
div.aligncenter {
   display:block;
   margin: .5em auto;
}

.alignright {
   float:right;
   margin: 0 0 1em 1em;
}

.alignleft {
   float:left;
   margin: 0 1em 1em 0;
}

.aligncenter {
   display: block;
   margin: 1em auto;
}

img,
img[class*=&quot;align&quot;],
img[class*=&quot;wp-image-&quot;] {
   max-width: 100%;
   height: auto;
}

img.wp-smiley {
   border: none;
   margin-bottom: 0;
   margin-top: 0;
   padding: 0;
}

img.alignright {
   margin-left: 1em 0 1em 1em;
}

img.alignleft {
   margin: 1em 1em 1em 0;
}

img.aligncenter{
   display: block;
   margin: 1em auto;
}

img#wpstats {
   display: block;
   margin: 0 auto;
}

img[class*=&quot;align&quot;],
img[class*=&quot;wp-image-&quot;],
   .gallery .gallery-icon img {
   border: none;
}

.wp-caption {
   margin-bottom: 1em;
   margin-left: 0;
   max-width: 96%;
   text-align: center;
}

.wp-caption img {
   display: block;
   margin: 0 auto;
}

.wp-caption-text {
   position: relative;
   font-size: .8em;
}

.gallery {
   margin: 0 auto;
}

.gallery .gallery-item  {
   margin: 0;
   float: left;
   text-align: center;
   width: 33%;
}

.gallery a img {
   border: none;
}

.gallery-columns-4 .gallery-item {
   width: 25%;
}

.gallery-columns-4 .gallery-item img {
   width: 100%;
   height: auto;
}

.comments ol    {
   padding-left: 0;
}

.comments ol li {
   margin: 0;
}

.comment-author {
   padding: 0;
   text-decoration: none;
}


@media only screen and (max-width: 800px) {

   embed,
   object {
      max-width: 100%;
   }

}

@media only screen and ( max-width: 650px ) {

   .gallery-columns-3 .gallery-item {
      width: 33.33%;
   }

   .gallery-columns-3 .gallery-item img {
      width: 100%;
      height: auto;
   }

}

@media only screen and (max-width: 480px) {

   .gallery-columns-2 .gallery-item {
      width: 50%;
   }

   .gallery-columns-2 .gallery-item img {
      width: 100%;
      height: auto;
   }

}
</pre>
</section>
</div>

<p><a href="http://jeffsebring.com">Jeff Sebring - WordPress Consulting &amp; Development ✦ Spokane</a></p>]]></content:encoded>
			<wfw:commentRss>http://jeffsebring.com/2011/responsive-wordpress-images/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>