<?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>NerdStarGamer &#187; Programming</title>
	<atom:link href="http://blog.nerdstargamer.com/category/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.nerdstargamer.com</link>
	<description>Mental Notes. Random thoughts. Comments on technology, games and life.</description>
	<lastBuildDate>Wed, 09 Feb 2011 18:35:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Two CMS Solutions Worth Looking At</title>
		<link>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2010%2Ftwo-cms-solutions-worth-looking-at%2F&#038;seed_title=Two+CMS+Solutions+Worth+Looking+At</link>
		<comments>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2010%2Ftwo-cms-solutions-worth-looking-at%2F&#038;seed_title=Two+CMS+Solutions+Worth+Looking+At#comments</comments>
		<pubDate>Tue, 21 Dec 2010 17:20:15 +0000</pubDate>
		<dc:creator>Alissa Miller</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[Content Management Systems]]></category>
		<category><![CDATA[Halogy]]></category>
		<category><![CDATA[Perch]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://blog.nerdstargamer.com/2010/two-cms-solutions-worth-looking-at/</guid>
		<description><![CDATA[Below are two different content management systems that definitely seem worth checking out. Halogy is a free open source system. Although it&#8217;s free to start out with, it looks like they charge for different modules. Perch costs about $55 per website but sounds intriguing. Mostly just a small customizable solution. It sounds like it might [...]]]></description>
			<content:encoded><![CDATA[<p>Below are two different content management systems that definitely seem worth checking out. <a href="http://www.halogy.com/" title="Free, Open Source CMS for Designers built on CodeIgniter - Halogy">Halogy</a> is a free open source system. Although it&#8217;s free to start out with, it looks like they charge for different modules.</p>

<p><a href="http://grabaperch.com/buy" title="Buy - Perch">Perch</a> costs about $55 per website but sounds intriguing. Mostly just a small customizable solution. It sounds like it might be nice for some basic websites where other CMS solutions would be overkill.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2010%2Ftwo-cms-solutions-worth-looking-at%2F&#038;seed_title=Two+CMS+Solutions+Worth+Looking+At/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Backup and Convert iPhone SMS Conversations to an HTML File</title>
		<link>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2010%2Fbackup-and-convert-iphone-sms-conversations-to-an-html-file%2F&#038;seed_title=Backup+and+Convert+iPhone+SMS+Conversations+to+an+HTML+File</link>
		<comments>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2010%2Fbackup-and-convert-iphone-sms-conversations-to-an-html-file%2F&#038;seed_title=Backup+and+Convert+iPhone+SMS+Conversations+to+an+HTML+File#comments</comments>
		<pubDate>Fri, 17 Dec 2010 18:44:36 +0000</pubDate>
		<dc:creator>Alissa Miller</dc:creator>
				<category><![CDATA[General Computing]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Random Thoughts]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Backup]]></category>
		<category><![CDATA[border-radius]]></category>
		<category><![CDATA[CSS Gradients]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[CSS3 Rounded Corners]]></category>
		<category><![CDATA[Decipher Media]]></category>
		<category><![CDATA[Decipher Text Message]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Regular Expressions]]></category>
		<category><![CDATA[SMS]]></category>
		<category><![CDATA[Text]]></category>
		<category><![CDATA[TextWrangler]]></category>

		<guid isPermaLink="false">http://blog.nerdstargamer.com/2010/backup-and-convert-iphone-sms-conversations-to-an-html-file/</guid>
		<description><![CDATA[I love my iPhone 3G and can&#8217;t wait until the end of my contract when I can upgrade to the latest and greatest version. However, one of my biggest gripes with the iPhone is that there is no standard way to backup and save your text messages in an easy-to-read fashion. After much searching, I&#8217;ve [...]]]></description>
			<content:encoded><![CDATA[<p>I love my iPhone 3G and can&#8217;t wait until the end of my contract when I can upgrade to the latest and greatest version. However, one of my biggest gripes with the iPhone is that there is no standard way to backup and save your text messages in an easy-to-read fashion. After much searching, I&#8217;ve finally discovered a great application for backing up your messages. I&#8217;ve also combined that with a little web development trickery to convert the final product into a self contained and beautiful HTML file.</p>

<h3>Exporting Your Messages</h3>

<p>First off, you need a way to export your text messages from either your phone or your backup. All the messages are backed up on your computer with the normal iPhone sync process, but they aren&#8217;t in a format that is readable for humans. There are several different software applications that will do this for you. I&#8217;ve tried a few different ones with varying success. Most of them seemed downright kludgy. After trying out several apps, I finally discovered <a href="http://decipher-media.com/decipher-text-message" title="Decipher TextMessage - Decipher Media">Decipher TextMessage</a> from Decipher Media. It is very modestly priced at $6.99.</p>

<p><img src="http://images.nerdstargamer.net/iphone-text/decipher-text-message.png" alt="A Screenshot of the Decipher TextMessage software" /></p>

<p>Decipher TextMessage is an OS X only app (sorry Windows users) that simply pulls your text messages out of your iPhone data backup file. I like the idea of this because it&#8217;s only messing with the backup file, not your actual phone. The great part about Decipher Text Message is that it uses your address book to match up phone numbers with contact names. All texts are sorted into conversations with each contact. You can then easily select a conversation and save it as either a text file or a CSV file. For this method, I just exported the conversation I wanted as a text file.</p>

<h3>Make Your Texts Into a Self Contained HTML File</h3>

<p>The text file is great, but if it&#8217;s a long conversation, it&#8217;s going to be hard to read and not terribly useful. This is where a little regular expression kung fu and some HTML and CSS love come in handy.</p>

<p>Once you export your text conversation, you&#8217;ll get a text document that looks something like this:</p>

<pre><code>Conversation with: Johnny Appleseed (5555558555)


Wednesday Mar 31 14:56

Me: Do you still have that spare ticket?

Johnny Appleseed: I dont BUT if you want to go I can probably grab another.

Me: What time is it at?

Johnny Appleseed: Doors @ 8 but we'll most likely grab food down there first and get there shortly after 8

Me: Hmm. I think I'll pass. I got into work late today so should prolly stay until at least 8. Have a good time though!

Johnny Appleseed: Mmmkay. <img src='http://blog.nerdstargamer.com/core/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  Perhaps next time.


Sunday Apr 04 15:49

Me: I just got home.

Johnny Appleseed: Hey, im @ the field. You should come here

Me: Oh yeah? Who you out with?

Johnny Appleseed: Work peeps. Theyre cool. Come out <img src='http://blog.nerdstargamer.com/core/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> 
</code></pre>

<p>As you can tell, although there is a lot of text, it&#8217;s all in a very predictable pattern. One part at the top, dates, texts from your contact, and texts from you.</p>

<h4>Make the document into an HTML file</h4>

<p>The first thing we need to do to our text file is convert it to HTML. Setting our text into an HTML template is easy. Just surround the whole conversation with a very basic HTML head tag and a body tag. For the purpose of this document, I&#8217;m not even worried about getting all the right tags in there, just enough to make it work. Here&#8217;s what it looks like now:</p>

<pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;title&gt;Me and Johnny Appleseed Converstaion&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
    Wednesday Mar 31 14:56

    Me: Do you still have that spare ticket?

    Johnny Appleseed: I dont BUT if you want to go I can probably grab another.

    Me: What time is it at?

    Johnny Appleseed: Doors @ 8 but we'll most likely grab food down there first and get there shortly after 8

    Me: Hmm. I think I'll pass. I got into work late today so should prolly stay until at least 8. Have a good time though!

    Johnny Appleseed: Mmmkay. <img src='http://blog.nerdstargamer.com/core/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  Perhaps next time.


    Sunday Apr 04 15:49

    Me: I just got home.

    Johnny Appleseed: Hey, im @ the field. You should come here

    Me: Oh yeah? Who you out with?

    Johnny Appleseed: Work peeps. Theyre cool. Come out <img src='http://blog.nerdstargamer.com/core/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> 
&lt;/body&gt;
&lt;/html&gt;
</code></pre>

<p>As you can see, I deleted the first line from the text file that said &#8220;Conversation with: Johnny Appleseed (5555558555)&#8221;. I don&#8217;t need that for this case. If I had wanted, I could have used that as the title of the document. I&#8217;ve also changed the extension of my document from <code>.txt</code> to <code>.html</code>.</p>

<h4>TextWrangler is a beast</h4>

<p>Next up is putting all of our text into HTML tags. Now, for any conversation that is more than a few texts, doing this by hand is just out of the question. That&#8217;s where some regular expression kung fu and my favorite find and replace tool come in handy.</p>

<p>For this job, I use <a href="http://www.barebones.com/products/textwrangler/" title="Bare Bones Software | TextWrangler">TextWrangler</a> from Bare Bones Software. It&#8217;s a great free text editor that includes the best search and find and replace tools I&#8217;ve found. In my opinion, it&#8217;s much better than the search tool for TextMate, which is the editor I use for pretty much everything else.</p>

<h4>Get rid of the pesky extra line breaks</h4>

<p>The first thing we&#8217;ll do is reduce the length of the file by getting rid of the extra line breaks. The line break pattern will match our line breaks. We just use <code>\r</code> for this. We want to end up with just one line break after each line with text and no empty lines. We do this by searching for two line breaks in a row and replacing them with one.
<img src="http://images.nerdstargamer.net/iphone-text/tw-grep-line-break.png" alt="A Screenshot of the TextWrangler find and replace box searching for multiple line breaks in a row" /></p>

<p>Doing &#8220;Replace All&#8221; once on this search will give us a much more manageable file length.</p>

<h4>Mark up the dates</h4>

<p>Next we want to put all of the date lines in a paragraph tag with a class of &#8220;date&#8221;. We can use the TextWrangler find and replace and, making sure that the Grep option is checked, search for a regular expression that matches all of the date lines. The following regex does just the trick:</p>

<pre><code>^[a-zA-Z]* [a-zA-Z]{3} \d{2} \d{2}:\d{2}$
</code></pre>

<p>The above regex will match the entire line and then we use the ampersand (which just represents the entire match) in our replace string. We just surround the ampersand with our HTML:</p>

<pre><code>&lt;p class="date"&gt;&amp;&lt;/p&gt;
</code></pre>

<p>Here&#8217;s what it looks like in TextWrangler:<img src="http://images.nerdstargamer.net/iphone-text/tw-grep-date.png" alt="A Screenshot of the TextWrangler find and replace box searching for the date line" /></p>

<h4>Mark up each of the conversation bits</h4>

<p>Next I&#8217;ll search for all of my parts of the conversation. These each start with the label &#8220;Me:&#8221;. I want to code the classes so that the CSS will be easily to reuse later for different conversations. So in this case, I&#8217;ll just use generic &#8216;me&#8217; and &#8216;you&#8217; classes. For my parts of the conversation, I want to do the following things:</p>

<ul>
<li>Mark up each of my texts in a paragraph</li>
<li>Give each of the paragraphs two clases: &#8216;message&#8217; and &#8216;me&#8217;.</li>
<li>Change the starting label from &#8220;Me:&#8221; to be my full name instead.</li>
<li>Enclose my name in a strong tag.</li>
</ul>

<p>In order to accomplish each of these things in one fell swoop, we can basically just match the text &#8220;Me:&#8221; at the start of a line and save the match that is everything after it in that line. There parenthesis save the pattern that is matched inside them. Since we&#8217;re getting rid of the &#8220;Me:&#8221; part, we don&#8217;t save it. Here&#8217;s what the regular expression looks like:</p>

<pre><code>^Me:( .*)$
</code></pre>

<p>In the replace string we just surround the entire match that we saved (indicated by <code>\1</code>) with our appropriate HTML and label. Here&#8217;s the replace string (Obviously you wouldn&#8217;t want to use my name):</p>

<pre><code>&lt;p class="message me"&gt;&lt;strong&gt;Alissa Miller:&lt;/strong&gt;\1&lt;/p&gt;
</code></pre>

<p>The step is to match the other person&#8217;s texts. Here we&#8217;re trying to accomplish a very similar thing:</p>

<ul>
<li>Mark up each of the other person&#8217;s texts in a paragraph</li>
<li>Give each of the paragraphs two clases: &#8216;message&#8217; and &#8216;you&#8217;.</li>
<li>Enclose the other person&#8217;s name in a strong tag.</li>
</ul>

<p>We&#8217;ll use almost exactly the same search pattern as the last time, except this time I&#8217;m using Johnny&#8217;s name instead of mine. Just substitute the Johnny part for whoever the conversation is with.</p>

<p>Here are screenshots of each of the last two searches in TextWrangler.</p>

<p><img src="http://images.nerdstargamer.net/iphone-text/tw-grep-me.png" alt="A Screenshot of the TextWrangler find and replace box searching for my part of conversation line" />
<img src="http://images.nerdstargamer.net/iphone-text/tw-grep-johnny.png" alt="A Screenshot of the TextWrangler find and replace box searching for the other part of the conversation line" /></p>

<p>And there we have it. Just a small bit of regex kung fu has given us a fully marked up HTML document. This is a great start, but in order to make it actually usable, we have to add some CSS styling to it. Here&#8217;s what are document looks like so far.</p>

<pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;title&gt;Me and Johnny Appleseed Converstaion&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;

    &lt;p class="date"&gt;Wednesday Mar 31 14:56&lt;/p&gt;
    &lt;p class="message me"&gt;&lt;strong&gt;Alissa Miller:&lt;/strong&gt; Do you still have that spare ticket?&lt;/p&gt;
    &lt;p class="message you"&gt;&lt;strong&gt;Johnny Appleseed:&lt;/strong&gt; . I dont BUT if you want to go I can probably grab another.&lt;/p&gt;
    &lt;p class="message me"&gt;&lt;strong&gt;Alissa Miller:&lt;/strong&gt; What time is it at?&lt;/p&gt;
    &lt;p class="message you"&gt;&lt;strong&gt;Johnny Appleseed:&lt;/strong&gt; Doors @ 8 but we'll most likely grab food down there first and get there shortly after 8&lt;/p&gt;
    &lt;p class="message me"&gt;&lt;strong&gt;Alissa Miller:&lt;/strong&gt; Hmm. I think I'll pass. I got into work late today so should prolly stay until at least 8. Have a good time though!&lt;/p&gt;
    &lt;p class="message you"&gt;&lt;strong&gt;Johnny Appleseed:&lt;/strong&gt; Mmmkay. <img src='http://blog.nerdstargamer.com/core/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  Perhaps next time.&lt;/p&gt;

    &lt;p class="date"&gt;Sunday Apr 04 15:49&lt;/p&gt;
    &lt;p class="message me"&gt;&lt;strong&gt;Alissa Miller:&lt;/strong&gt; I just got home.&lt;/p&gt;
    &lt;p class="message you"&gt;&lt;strong&gt;Johnny Appleseed:&lt;/strong&gt; Hey, im @ the field. You should come here&lt;/p&gt;
    &lt;p class="message me"&gt;&lt;strong&gt;Alissa Miller:&lt;/strong&gt; Oh yeah? Who you out with?&lt;/p&gt;
    &lt;p class="message you"&gt;&lt;strong&gt;Johnny Appleseed:&lt;/strong&gt; Work peeps. Theyre cool. Come out <img src='http://blog.nerdstargamer.com/core/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> &lt;/p&gt;

&lt;/body&gt;
&lt;/html&gt;
</code></pre>

<h3>Styling Our Conversation</h3>

<p>For the purpose of this conversation, my goal was to make the HTML page mimic the look of the iPhone text messages. I also want to make the HTML page self-contained, so I&#8217;m going to use internal CSS styles for everything.</p>

<h4>Basic body styles</h4>

<p>The first thing is to add some very basic styles to the body element. Here we are setting the background color and fonts. We also use the <code>margin: 40px auto;</code> to center the page and the <code>width</code> property to give us a nice narrow page width for our conversation.</p>

<pre><code>body {
    background-color: #dbe1ed;
    color: #000;
    font: 14px/1.4 helvetica, arial, verdana, sans-serif;
    margin: 40px auto;
    width: 450px;
}
</code></pre>

<h4>Styling the <code>strong</code> tags</h4>

<p>Next we should style the strong tags. In this case, I want the strong elements to have a normal font-weight, but to be a different color. I styled all the strong elements as a medium gray color and then used the <code>me</code> class to override the the gray color with a bright green for my texts.</p>

<pre><code>strong {
    color: #555;
    font-weight: normal;
}
.me strong {color: rgb(78,145,3);}
</code></pre>

<h4>Basic paragraph and date styles</h4>

<p>Now we style the paragraphs and the date class. We&#8217;re going to be floating elements in a bit, so we want to make sure to add a clear to all of the paragraphs on both sides. Also, the date class should have bold text that is centered and slightly larger than usual. Here are the styles:</p>

<pre><code>p {clear: both;}
p.date {
    color: #777;
    font: bold 14px/1.4 helvetica, arial, verdana, sans-serif;
    text-align: center;
}
</code></pre>

<h4>Creating rounded speech bubbles</h4>

<p>Now that we&#8217;ve done some basic styling, we can start mimicking the speech bubbles. First we&#8217;ll style the message class to give some padding and rounded corners. We&#8217;ll also set the max-width of the each message to 70% so that it will stretch only slightly less than three quarters across the page.</p>

<pre><code>p.message {
    position:relative;
    padding:5px 10px;
    border:2px solid rgb(74,77,82);
    border:2px solid rgba(74,77,82,.5);
    -moz-border-radius:10px;
    -webkit-border-radius:10px;
    border-radius:10px;
    max-width: 70%;
}
</code></pre>

<h4>Add the fancy CSS gradients</h4>

<p>After that, we&#8217;ll set the background colors and use CSS3 gradients to create the green and gray speech bubbles. The gradients are a bit complex, so I used the online <a href="http://www.colorzilla.com/gradient-editor/" title="Ultimate CSS Gradient Generator - ColorZilla.com">Ultimate CSS Gradient Generator</a> tool. This was a fabulous way to visually match the iPhone styles as closely as possible while getting the cross-browser compatible code automatically generated. After generating the two sets of gradients, this is the CSS I ended up with:</p>

<pre><code>/* Gradients and styles for each bubble */
p.you {
    background: #EBEBEB; /* old browsers */
    background: -moz-linear-gradient(top, #EBEBEB 5%, #D6D6D6 15%, #D2D2D2 71%, #E7E7E7 99%); /* firefox */
    background: -webkit-gradient(linear, left top, left bottom, color-stop(5%,#EBEBEB), color-stop(15%,#D6D6D6), color-stop(71%,#D2D2D2), color-stop(99%,#E7E7E7)); /* webkit */
    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#EBEBEB', endColorstr='#E7E7E7',GradientType=0 ); /* ie */
}
p.me {
    background: #D0ECCC; /* old browsers */
    background: -moz-linear-gradient(top, #D0ECCC 5%, #87CD65 15%, #92D664 70%, #ADE763 99%); /* firefox */
    background: -webkit-gradient(linear, left top, left bottom, color-stop(5%,#D0ECCC), color-stop(15%,#87CD65), color-stop(70%,#92D664), color-stop(99%,#ADE763)); /* webkit */
    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#D0ECCC', endColorstr='#ADE763',GradientType=0 ); /* ie */

    float: right;
}
</code></pre>

<p id="sms-demo1">Notice that I also tucked in a float:right to the &#8216;me&#8217; class. This will set my speech bubbles off to the right of the page.</p>

<p>Using just these few styles, we&#8217;ve created a nice looking self contained HTML page displaying our exported SMS conversation. <a href="http://images.nerdstargamer.net/iphone-text/iphone-text-demo-1.html">Take a look at the HTML page so far</a>.</p>

<h4>Make more better speech bubbles</h4>

<p>We could stop here and the page would be fine. However, we&#8217;ll use some really fancy CSS border trickery to make the text bubbles looks just a little bit better. Using images would make the text bubbles perfect, but remember, we want the file to be self contained.</p>

<p>In order to make the speech bubbles, I used a technique of arranging multiple CSS borders and using positioning to create a small triangle off to the side. The code is modified from Nicolas Gallagher&#8217;s excellent post on <a href="http://nicolasgallagher.com/pure-css-speech-bubbles/demo/" title="Demo: Pure CSS speech bubbles &#8211; Nicolas Gallagher">Pure CSS Speech Bubbles</a>. In this case, I chose to use a modified version of the &#8220;Triangle Border&#8221; shown in Gallagher&#8217;s demo page (the one&#8217; with the thick green border). The CSS had to be changed a bit because I didn&#8217;t actually want borders. Here is the final CSS I used:</p>

<pre><code>/* The basic speech triangle */
p.message:before {
    content:"";
    display:block; /* reduce the damage in FF3.0 */
    position:absolute;
    border-style:solid;
    border-color:transparent rgb(74,77,82);
    border-color:transparent rgba(74,77,82,.5);
}
p.message:after {/* creates the smaller  triangle */
    content:"";
    display:block; /* reduce the damage in FF3.0 */
    position:absolute;
    border-style:solid;
}
/* Me points to the right */
p.message.me:before {
    right:-14px;
    bottom:7px;
    border-width:8px 0 8px 14px;
}
p.message.me:after {/* creates the smaller  triangle */
    right:-10px;
    bottom:8px;
    border-width:7px 0 7px 14px;
    border-color:transparent #94d749; /* green */
}
/* Other person points to the left */
p.message.you:before {  /* creates the larger triangle */
    left:-16px;
    bottom:7px;
    border-width:8px 16px 8px 0;
}
p.message.you:after {   /* creates the smaller  triangle */
    left:-10px;
    bottom:8px;
    border-width:7px 14px 7px 0;
    border-color:transparent #d3d3d3; /* grey */
}
</code></pre>

<p id="sms-demo2">You can <a href="http://images.nerdstargamer.net/iphone-text/iphone-text-demo-2.html">see the finished effect on this page</a>.</p>

<p>So with just a little bit of work we&#8217;ve marked up our conversation into HTML and created some advanced CSS styles to put our entire text conversation into a nice self contained HTML page that should be easily viewed in browsers for years to come.</p>

<p>Even better, we&#8217;ve made the CSS generic enough that we can just copy and paste it into another conversation we&#8217;ve marked up using HTML.</p>

<p>Obviously, there are a few caveats here. The Decipher Text Message program only on works on Macs. I haven&#8217;t tested any Windows-based software for the same purpose, but I stumbled across quite a few of them when I was looking for the software, so there are definitely options out there. Also, we&#8217;ve used some pretty complex CSS and several CSS3 properties that aren&#8217;t fully supported by all browsers. I have tested this in Firefox, Chrome and Safari. Hopefully things shouldn&#8217;t look too terrible in other browsers. I confess though, I did not even check it in IE.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2010%2Fbackup-and-convert-iphone-sms-conversations-to-an-html-file%2F&#038;seed_title=Backup+and+Convert+iPhone+SMS+Conversations+to+an+HTML+File/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Gawker&#8217;s Astounding Arrogance and Security Breach</title>
		<link>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2010%2Fgawkers-astounding-arrogance-and-security-breach%2F&#038;seed_title=Gawker%26%238217%3Bs+Astounding+Arrogance+and+Security+Breach</link>
		<comments>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2010%2Fgawkers-astounding-arrogance-and-security-breach%2F&#038;seed_title=Gawker%26%238217%3Bs+Astounding+Arrogance+and+Security+Breach#comments</comments>
		<pubDate>Mon, 13 Dec 2010 20:40:13 +0000</pubDate>
		<dc:creator>Alissa Miller</dc:creator>
				<category><![CDATA[General Computing]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Gawker]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Pirate Bay]]></category>
		<category><![CDATA[Security]]></category>

		<guid isPermaLink="false">http://blog.nerdstargamer.com/2010/gawkers-astounding-arrogance-and-security-breach/</guid>
		<description><![CDATA[Forbes has an interesting writeup about the recent hacking of Gawker and other sites. What&#8217;s really astounding about this stuff is just the level of arrogance shown by top level people at Gawker regarding security and their user&#8217;s data. The user data breach alone is bad, but it sounds like the hackers got in to [...]]]></description>
			<content:encoded><![CDATA[<p>Forbes has an interesting writeup about the <a href="http://blogs.forbes.com/firewall/2010/12/13/the-lessons-of-gawkers-security-mess/" title="The Real Lessons Of Gawker&#8217;s Security Mess - The Firewall - the world of security - Forbes">recent hacking of Gawker</a> and other sites. What&#8217;s really astounding about this stuff is just the level of arrogance shown by top level people at Gawker regarding security and their user&#8217;s data. The user data breach alone is bad, but it sounds like the hackers got in to all sorts of internal Gawker stuff.</p>

<blockquote cite="http://blogs.forbes.com/firewall/2010/12/13/the-lessons-of-gawkers-security-mess/">
  <p>[&#8230;] analysis of the file released by the crackers themselves indicates that the breach extends to employees of Gawker, includes credentials for internal systems (Google applications, collaboration tools) used at the company, includes a leak of Gawker’s custom source code, includes credentials of Gawker employees for other web sites, includes FTP credentials for other web sites Gawker has worked with, includes access to Gawker’s statistics web site, and includes the e-mails of a number of the users who left comments at Gawker as well as users of lifehacker.com, kotaku.com, and gizmodo.com. <cite><a href="http://blogs.forbes.com/firewall/2010/12/13/the-lessons-of-gawkers-security-mess/" title="The Real Lessons Of Gawker&#8217;s Security Mess - The Firewall - the world of security - Forbes">Forbes.com</a></cite></p>
</blockquote>

<p>Bad news. Even worse, the evidence seems clear that this attack was going on for quite some time. Lots of fishy things were happening and nobody at Gawker was able to put two and two together. You&#8217;d hope that a business as big as Gawker would have their shit together.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2010%2Fgawkers-astounding-arrogance-and-security-breach%2F&#038;seed_title=Gawker%26%238217%3Bs+Astounding+Arrogance+and+Security+Breach/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Backslash</title>
		<link>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2010%2Fbackslash%2F&#038;seed_title=Backslash</link>
		<comments>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2010%2Fbackslash%2F&#038;seed_title=Backslash#comments</comments>
		<pubDate>Tue, 11 May 2010 17:47:57 +0000</pubDate>
		<dc:creator>Alissa Miller</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[Humor]]></category>
		<category><![CDATA[url]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[XKCD]]></category>

		<guid isPermaLink="false">http://blog.nerdstargamer.com/2010/backslash/</guid>
		<description><![CDATA[If I only had a dollar for every time I had to go over this in my web design course.]]></description>
			<content:encoded><![CDATA[<p>If I only had a dollar for every time I had to go over this in my web design course.</p>

<p><a href="http://xkcd.com/727/" title="xkcd: Trade Expert"><img src="http://imgs.xkcd.com/comics/trade_expert.png" alt="XKCD Comic titled Trade Expert" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2010%2Fbackslash%2F&#038;seed_title=Backslash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Practical Terminal Commands Reference</title>
		<link>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2010%2Fpractical-terminal-commands-reference%2F&#038;seed_title=Practical+Terminal+Commands+Reference</link>
		<comments>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2010%2Fpractical-terminal-commands-reference%2F&#038;seed_title=Practical+Terminal+Commands+Reference#comments</comments>
		<pubDate>Wed, 24 Feb 2010 21:31:06 +0000</pubDate>
		<dc:creator>Alissa Miller</dc:creator>
				<category><![CDATA[Mac OS X Administration]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Command Line]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Reference]]></category>
		<category><![CDATA[Terminal]]></category>

		<guid isPermaLink="false">http://blog.nerdstargamer.com/2010/practical-terminal-commands-reference/</guid>
		<description><![CDATA[I just found this amazing list of Terminal commands today: Linux Commands &#8211; A practical reference The list is not customized for OS X systems, so not all of the commands or options necessarily work as listed. I was however able to find similar commands using the man pages. This list is really an amazing [...]]]></description>
			<content:encoded><![CDATA[<p>I just found this amazing list of Terminal commands today:</p>

<ul class="articleLink">
    <li><a href="http://www.pixelbeat.org/cmdline.html" title="Linux Commands - A practical reference">Linux Commands &#8211; A practical reference</a></li>
</ul>

<p>The list is not customized for OS X systems, so not all of the commands or options necessarily work as listed. I was however able to find similar commands using the man pages. This list is really an amazing reference for commands to do practical things that you might not have known you could do.</p>

<p>I just discovered <code>wget</code> using this list. I think I might have used this a long time ago and then promptly forgot it existed. Basically it downloads files or websites for you. This was exactly what I happened to need to download all of the student websites for my Web Design class. I was able to download all of them in a matter of minutes. The only problem was that it didn&#8217;t seem to pick up CSS background images or fonts used from @font-face, so I had to manually check those. An indispensable nevertheless.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2010%2Fpractical-terminal-commands-reference%2F&#038;seed_title=Practical+Terminal+Commands+Reference/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pure CSS3 AT-AT Walker</title>
		<link>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2010%2Fpure-css3-at-at-walker%2F&#038;seed_title=Pure+CSS3+AT-AT+Walker</link>
		<comments>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2010%2Fpure-css3-at-at-walker%2F&#038;seed_title=Pure+CSS3+AT-AT+Walker#comments</comments>
		<pubDate>Wed, 03 Feb 2010 23:45:35 +0000</pubDate>
		<dc:creator>Alissa Miller</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[Animations]]></category>
		<category><![CDATA[CSS]]></category>

		<guid isPermaLink="false">http://blog.nerdstargamer.com/2010/pure-css3-at-at-walker/</guid>
		<description><![CDATA[All I can really say about this is &#8220;Wow.&#8221; And also, maybe someone has too much time on their hands. Pure CSS3 AT-AT Walker]]></description>
			<content:encoded><![CDATA[<p>All I can really say about this is &#8220;Wow.&#8221; And also, maybe someone has too much time on their hands.</p>

<ul>
<li><a href="http://anthonycalzadilla.com/css3-ATAT/index.html" title="Pure CSS3 AT-AT Walker by: Anthony Calzadilla">Pure CSS3 AT-AT Walker</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2010%2Fpure-css3-at-at-walker%2F&#038;seed_title=Pure+CSS3+AT-AT+Walker/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Little Bobby Tables</title>
		<link>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2009%2Flittle-bobby-tables%2F&#038;seed_title=Little+Bobby+Tables</link>
		<comments>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2009%2Flittle-bobby-tables%2F&#038;seed_title=Little+Bobby+Tables#comments</comments>
		<pubDate>Tue, 15 Sep 2009 20:23:35 +0000</pubDate>
		<dc:creator>Alissa Miller</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Random Thoughts]]></category>
		<category><![CDATA[Humor]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[SQL Injection]]></category>
		<category><![CDATA[XKCD]]></category>

		<guid isPermaLink="false">http://blog.nerdstargamer.com/2009/little-bobby-tables/</guid>
		<description><![CDATA[XKCD: Exploits of a Mom]]></description>
			<content:encoded><![CDATA[<p><a href="http://xkcd.com/327/"><img src="http://imgs.xkcd.com/comics/exploits_of_a_mom.png" alt="XKCD comic about security" title="Exploits of a Mom"><br />
<cite>XKCD: Exploits of a Mom</cite></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2009%2Flittle-bobby-tables%2F&#038;seed_title=Little+Bobby+Tables/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quicklook for markdown</title>
		<link>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2009%2Fquicklook-for-markdown%2F&#038;seed_title=Quicklook+for+markdown</link>
		<comments>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2009%2Fquicklook-for-markdown%2F&#038;seed_title=Quicklook+for+markdown#comments</comments>
		<pubDate>Mon, 16 Mar 2009 02:06:22 +0000</pubDate>
		<dc:creator>Alissa Miller</dc:creator>
				<category><![CDATA[General Computing]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Markdown]]></category>
		<category><![CDATA[OS X]]></category>
		<category><![CDATA[Quicklook]]></category>

		<guid isPermaLink="false">http://blog.nerdstargamer.com/2009/quicklook-for-markdown/</guid>
		<description><![CDATA[Awesome plugin for Quicklook which allows you to view markdown documents in a formatted style. This is really nice. I&#8217;ve taken to storing a lot of my documents in markdown, since I like using plain text files, but find the formatting in markdown a lot easier to use.]]></description>
			<content:encoded><![CDATA[<p>Awesome <a href="http://mdk.org.pl/2009/2/10/quicklook-for-markdown" title="MDK : Quicklook for markdown">plugin for Quicklook</a> which allows you to view markdown documents in a formatted style. This is really nice. I&#8217;ve taken to storing a lot of my documents in markdown, since I like using plain text files, but find the formatting in markdown a lot easier to use.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2009%2Fquicklook-for-markdown%2F&#038;seed_title=Quicklook+for+markdown/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Parallax</title>
		<link>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Fparallax%2F&#038;seed_title=Parallax</link>
		<comments>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Fparallax%2F&#038;seed_title=Parallax#comments</comments>
		<pubDate>Thu, 04 Sep 2008 22:13:45 +0000</pubDate>
		<dc:creator>Alissa Miller</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Parallax]]></category>

		<guid isPermaLink="false">http://blog.nerdstargamer.com/2008/parallax/</guid>
		<description><![CDATA[Parallax is a very interesting plugin for jQuery that allows you to create a Parallax effect: Parallax turns a selected element into a &#8216;window&#8217;, or viewport, and all its children into absolutely positioned layers that can be seen through the viewport. These layers move in response to the mouse, and, depending on their dimensions (and [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://webdev.stephband.info/parallax.html" title="webdev.stephband.info">Parallax</a> is a very interesting plugin for jQuery that allows you to create a Parallax effect:</p>

<blockquote>
  <p>Parallax turns a selected element into a &#8216;window&#8217;, or viewport, and all its children into absolutely positioned layers that can be seen through the viewport. These layers move in response to the mouse, and, depending on their dimensions (and options for layer initialisation), they move by different amounts, in a parallaxy kind of way.</p>
</blockquote>

<p>This is pretty neat stuff. I&#8217;m racking my brain trying to think of gratuitous ways to use this in my next design project. So far I&#8217;m only thinking of running dogs&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Fparallax%2F&#038;seed_title=Parallax/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Leopard Server Quickstart Guide</title>
		<link>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Fleopard-server-quickstart-guide%2F&#038;seed_title=Leopard+Server+Quickstart+Guide</link>
		<comments>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Fleopard-server-quickstart-guide%2F&#038;seed_title=Leopard+Server+Quickstart+Guide#comments</comments>
		<pubDate>Thu, 14 Aug 2008 16:14:05 +0000</pubDate>
		<dc:creator>Alissa Miller</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[Mac OS X Administration]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[AFP]]></category>
		<category><![CDATA[Leopard]]></category>
		<category><![CDATA[Open Directory]]></category>
		<category><![CDATA[OS X Server]]></category>
		<category><![CDATA[Quickstart Guide]]></category>
		<category><![CDATA[rsync]]></category>

		<guid isPermaLink="false">http://blog.nerdstargamer.com/2008/leopard-server-quickstart-guide/</guid>
		<description><![CDATA[Corey Carson was written a fantastic quickstart guide for Leopard Server. This updated quickstart guide is very similar to the Tiger Server Quickstart Guide posted in 2005. It&#8217;s primary purpose is to get you up and running quickly, overcoming common hurdles such as DNS and binding confusions. With the move to launchd over cron, those [...]]]></description>
			<content:encoded><![CDATA[<p>Corey Carson was written a fantastic quickstart guide for Leopard Server.</p>

<blockquote>
  <p>This updated quickstart guide is very similar to the Tiger Server Quickstart Guide posted in 2005. It&#8217;s primary purpose is to get you up and running quickly, overcoming common hurdles such as DNS and binding confusions. With the move to launchd over cron, those steps are now included as well.</p>
</blockquote>

<p>You can <a href="http://www.afp548.com/article.php?story=2008030421090192#comments" title="AFP548 - Leopard Server Quickstart Guide">grab the pdf at AFP548.com</a>.</p>

<p>The article includes some particularly good instructions on using and setting up rsync, launchd, and Network Home Redirector.</p>

<p class="via">Via <a href="http://infinitysend.net/2008/03/05/leopard-server-quickstart-guide/" title="Infinity's End">Infinity&#8217;s End</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Fleopard-server-quickstart-guide%2F&#038;seed_title=Leopard+Server+Quickstart+Guide/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Perishable Press 3G Blacklist and WP Super Cache</title>
		<link>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Fperishable-press-3g-blacklist-and-wp-super-cache%2F&#038;seed_title=Perishable+Press+3G+Blacklist+and+WP+Super+Cache</link>
		<comments>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Fperishable-press-3g-blacklist-and-wp-super-cache%2F&#038;seed_title=Perishable+Press+3G+Blacklist+and+WP+Super+Cache#comments</comments>
		<pubDate>Fri, 30 May 2008 17:48:22 +0000</pubDate>
		<dc:creator>Alissa Miller</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Spam]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://blog.nerdstargamer.com/2008/05/30/perishable-press-3g-blacklist-and-wp-super-cache/</guid>
		<description><![CDATA[I&#8217;ve been following the Building the 3G Blacklist series on Perishable Press for the last week or two and have been implementing each of the rules as they were released. For the most part, there have been no problems. I&#8217;ve seen a huge increase in 403 errors (Forbidden Access) in my logs, which has been [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been following <a href="http://perishablepress.com/press/2008/05/25/series-summary-building-the-3g-blacklist/" title="Series Summary: Building the 3G Blacklist &bull; Perishable Press">the Building the 3G Blacklist series</a> on Perishable Press for the last week or two and have been implementing each of the rules as they were released. For the most part, there have been no problems. I&#8217;ve seen a huge increase in  403 errors (Forbidden Access) in my logs, which has been good. Judging from my <code>access.log</code>, all of the requests have been bogus.</p>

<p>After the final list came out, I implemented any changes to the rules, tested it in my default browser (Safari) and called it good. Several days later however, I tried to pull up this site on my home PC using Firefox and was greeted with a big fat 403. Uh oh. I switched over to IE and got the same results. After some cursory checking, I switched over to using my laptop and Safari and noticed that there was no problem there. Weird. Even weirder because I&#8217;m using Version DSL with router, so as far as my server is concerned, both computers have the same IP.</p>

<p>Most weird: when I actually checked my <code>access.log</code>, I could see my own requests that had been served 403 errors. But instead of the normal 403, the requests actually showed a single request with a 200 status for each time I tried to load a page.</p>

<pre><code>IP - - [30/May/2008:10:20:02 -0700] "GET /about/ HTTP/1.1" 200 363 "-" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7" 
IP - - [30/May/2008:10:20:07 -0700] "GET / HTTP/1.1" 200 364 "-" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7" 
</code></pre>

<p>That&#8217;s a request for my about page, and then my main page. Both recieved a &#8220;Forbiden&#8221; in my browser, but both show a status of OK in my log. Additionally, if the request had actually been successful, a bunch of other files would have been requested as well.</p>

<p>I quickly decided that it was more important to get the site up and running again rather than spend a bunch of time trying to figure out what the problem was and how to fix it. After some selective commenting in my <code>.htaccess</code> file, I discovered that the culprit rule was the following one from the 3G Blacklist:</p>

<pre><code>RedirectMatch 403 \/\/
</code></pre>

<p>I commented out the rule for the time-being so that I could test further at a later point in time.</p>

<p>This particular rule redirects all requests that contain a double slash <em>after</em> the <code>http://</code> section. I thought that this was very odd that this rule should break my site because I can&#8217;t see any reason why a legitimate request would need to utilize a double slash. I also was concerned, because judging from my <code>access.log</code>, this is the rule that does the bulk of the work concerning 403 errors.</p>

<p>I did some more scanning of my <code>.htaccess</code> folder and arrived at the conclusion that the culprit must be within the rules for the <a href="http://ocaoimh.ie/wp-super-cache/" title="WP Super Cache">WP Super Cache</a> plugin I had recently installed. This plugin creates a static html page to serve instead of the normal WordPress PHP pages. Here&#8217;s an explanation from their site:</p>

<blockquote>
  <p>When a visitor who is not logged in, or who has not left a comment, visits they will be served a static HTML page out of the supercache subdirectory within the WordPress cache directory. If you navigate to that directory you can view an exact replica of your permalink structure as well as the HTML files within the directories. To determine if a page has been served out of the Super Cache, view the source and the last line on the page should read <!-- super cache --> or <!-- super cache gz -->.</p>
</blockquote>

<p>Hmm, I&#8217;d say we&#8217;re getting closer now. The section that WP Super Cache adds to my <code>.htaccess</code> file looks like this:</p>

<pre><code># WP SUPER CACHE
&lt;IfModule mod_rewrite.c&gt;
AddDefaultCharset UTF-8
RewriteCond %{REQUEST_METHOD} !=POST
RewriteCond %{QUERY_STRING} !.*s=.*
RewriteCond %{QUERY_STRING} !.*attachment_id=.*
RewriteCond %{HTTP_COOKIE} !^.*(comment_author_|wordpress|wp-postpass_).*$
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/supercache/%{HTTP_HOST}/$1index.html.gz -f
RewriteRule ^(.*) /wp-content/cache/supercache/%{HTTP_HOST}/$1/index.html.gz [L]

RewriteCond %{REQUEST_METHOD} !=POST
RewriteCond %{QUERY_STRING} !.*s=.*
RewriteCond %{QUERY_STRING} !.*attachment_id=.*
RewriteCond %{HTTP_COOKIE} !^.*(comment_author_|wordpress|wp-postpass_).*$
RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/supercache/%{HTTP_HOST}/$1index.html -f
RewriteRule ^(.*) /wp-content/cache/supercache/%{HTTP_HOST}/$1/index.html [L]
&lt;/IfModule&gt;
# END WPSuperCache
</code></pre>

<p>Now, perhaps a <code>mod_rewrite</code> ninja can see immediately what the problem is, but I was having trouble actually figuring out what was going on. Since I&#8217;m using a shared host, I don&#8217;t have access to an <code>httpd.conf</code> and therefor cannot use the RewriteLog directive to actually see what&#8217;s going on in the rewrites.</p>

<p>After some research I discovered that by adding an <code>R</code> flag to each of WP Super Caches RewriteRule directives, it would force a temporary redirect and therefore allow me to see in the browser what was actually being requested. I changed each RewriteRule to the following:</p>

<pre><code>RewriteRule ^(.*) /wp-content/cache/supercache/%{HTTP_HOST}/$1/index.html.gz [R,L]
RewriteRule ^(.*) /wp-content/cache/supercache/%{HTTP_HOST}/$1/index.html [R,L]
</code></pre>

<p>Now after running the same tests again, I could see in my browser how things were getting screwed up. I typed the address <code>http://blog.nerdstargamer.com</code> into Firefox and sure enough, got the 403 error. This time though, when I looked at the URL it showed the following redirect:</p>

<p>http://blog.nerdstargamer.com/wp-content/cache/supercache/blog.nerdstargamer.com//index.html</p>

<p>There&#8217;s the culprit right there. The double-slash right before <code>index.html</code>. So, basically, every time WP Super Cache serves a cached page, it&#8217;s serving a URL with a double slash before the file name. I did a quick check by deleting the cache folders of WP Super Cache and confirmed that pages not cached loaded fine while cached pages always got redirected to a 403 error. Bingo.</p>

<p>So, now to fix the problem. Why on earth the <code>.htaccess</code> code for WP Super Cache does this in the first place, I&#8217;m not sure. It seems wrong to me, but I&#8217;ll defer to the experts on this one. Basically what&#8217;s happing is that the variable <code>$1</code> is being replaced with the path name that was requested which includes a trailing slash. The next part of the rewrite starts with a slash, thus the double slash problem.</p>

<p>I was able to fix the conflict in the WP Super Cache code by removing one of the slashes like so:</p>

<pre><code># WP SUPER CACHE
&lt;IfModule mod_rewrite.c&gt;
AddDefaultCharset UTF-8
# not post
RewriteCond %{REQUEST_METHOD} !=POST
# not a search
RewriteCond %{QUERY_STRING} !.*s=.*
# not an attachment page
RewriteCond %{QUERY_STRING} !.*attachment_id=.*
RewriteCond %{HTTP_COOKIE} !^.*(comment_author_|wordpress|wp-postpass_).*$
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/supercache/%{HTTP_HOST}/$1index.html.gz -f
RewriteRule ^(.*) /wp-content/cache/supercache/%{HTTP_HOST}/$1index.html.gz [L]

RewriteCond %{REQUEST_METHOD} !=POST
RewriteCond %{QUERY_STRING} !.*s=.*
RewriteCond %{QUERY_STRING} !.*attachment_id=.*
RewriteCond %{HTTP_COOKIE} !^.*(comment_author_|wordpress|wp-postpass_).*$
RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/supercache/%{HTTP_HOST}/$1index.html -f
RewriteRule ^(.*) /wp-content/cache/supercache/%{HTTP_HOST}/$1index.html [L]
&lt;/IfModule&gt;
# END WPSuperCache
</code></pre>

<p>This certainly looks funny but at least it works. I&#8217;m sure there is a more elegant way to do this, like say, rewriting the original request to remove the trailing slash and then applying the cache rules. Perhaps this is really a problem with the way WordPress is doing its permalinks (I&#8217;m on 2.5.1 by the way). Who knows? Ninjas chime in.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Fperishable-press-3g-blacklist-and-wp-super-cache%2F&#038;seed_title=Perishable+Press+3G+Blacklist+and+WP+Super+Cache/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Getting Geeky With YSlow</title>
		<link>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Fgetting-geeky-with-yslow%2F&#038;seed_title=Getting+Geeky+With+YSlow</link>
		<comments>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Fgetting-geeky-with-yslow%2F&#038;seed_title=Getting+Geeky+With+YSlow#comments</comments>
		<pubDate>Thu, 29 May 2008 21:17:54 +0000</pubDate>
		<dc:creator>Alissa Miller</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Google API]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Mint]]></category>
		<category><![CDATA[mod_deflate]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[YSlow]]></category>

		<guid isPermaLink="false">http://blog.nerdstargamer.com/2008/05/29/getting-geeky-with-yslow/</guid>
		<description><![CDATA[I spent a good amount of time over the last couple of days attempting to make my site a little bit faster. I&#8217;ve been pretty negligent about it up until now, because I know that much of the slowness of my site can be directly attributed to my web hosting company. 1 Even so, I [...]]]></description>
			<content:encoded><![CDATA[<p>I spent a good amount of time over the last couple of days attempting to make my site a little bit faster. I&#8217;ve been pretty negligent about it up until now, because I know that much of the slowness of my site can be directly attributed to my web hosting company. <sup id="fnr-yslow1"><a href="#fn-yslow1">1</a></sup> Even so, I decided to spend some time doing what I could to speed things up.</p>

<p>The first thing that I did was run a test in <a href="http://developer.yahoo.com/yslow/" title="YSlow for Firebug">YSlow</a> to see how my site was doing. Yikes! I got an F right off the bat. After some further review and research, I realized that this wasn&#8217;t necessarily something that should have me freaking out. If you&#8217;re not entirely familiar with YSlow and what it does, Jeff Atwood&#8217;s article, &#8220;<a href="http://www.codinghorror.com/blog/archives/000932.html" title="Coding Horror: YSlow: Yahoo's Problems Are Not Your Problems">YSlow: Yahoo&#8217;s Problems Are Not Your Problems</a>&#8221; on <a href="http://www.codinghorror.com/" title="Coding Horror">Coding Horror</a> is a must-read. Basically, YSlow offers a lot of good advice that should be taken, but with a grain of salt.</p>

<p>With that said, here are the steps that I&#8217;ve taken to speed up my site.</p>

<h3 id="make_fewer_http_requests">Make Fewer HTTP Requests</h3>

<p>The first time I ran YSlow, I discovered that all of my pages were making a ridiculous number of HTTP Requests for JavaScript and CSS files. I was requesting four CSS files: screen, print, IE hacks, and one for <a href="http://www.huddletogether.com/projects/lightbox2/" title="Lightbox 2">Lightbox 2</a>. Unfortunately, the IE hacks stylesheet is still necessary. Obviously the screen an print ones are as well. After taking a look at the Lightbox 2 CSS file, I decided that it was small enough to simply tack on to the bottom on my existing screen stylesheet. That&#8217;s one down.</p>

<p>There were also quite a few JavaScript files being requested, including all of the files for <a href="http://www.google.com/analytics/" title="Google Analytics">Google Analytics</a>, <a href="http://www.haveamint.com/" title="Mint: A Fresh Look at your Site">Mint</a>, <a href="http://wordpress.org/extend/plugins/stats/" title="WordPress &#8250; WordPress.com Stats &laquo; WordPress Plugins">WP Stats</a> and Lightbox. What can I say? I like my tracking software.</p>

<p>The first thing that I decided to do was to reduce the number of tracking utilities I was using to two. I love Mint and Google Analytics seems to be necessary, so I had to get rid of WP Stats. That wasn&#8217;t such a big deal for me. That&#8217;s another one down.</p>

<p>The next step was to take a long hard look at Lightbox 2. I originally installed this for my <a href="http://blog.nerdstargamer.com/gallery" title="Gallery | NerdStarGamer">Gallery</a> page, and then decided to include it on all my pages on the off chance that I might want to use it in a few posts. While it works and looks great, I&#8217;ve been decidedly unhappy about how much baggage Lightbox comes with. There are five JavaScript files that need to be included, just to have that neat little image trick. Even worse, the included Prototype JavaScript library weighs in at a staggering 124KB. What a waste.</p>

<p>I made a mental note to do some research to find a more lightweight solution for my image gallery. <a href="http://www.smashingmagazine.com/" title="Smashing Magazine">Smashing Magazine</a> has a <a href="http://www.smashingmagazine.com/2007/05/18/30-best-solutions-for-image-galleries-slideshows-lightboxes/" title="30 Scripts For Galleries, Slideshows and Lightboxes | Developer's Toolbox | Smashing Magazine">good list of them</a>, which I will inspect at a later point in time. For the time-being, I compressed the Javascript files and was able to bring the total size of the Javascript files down to about 125KB from 196KB. I also decided to only include the scripts on my actual Gallery page. It seems like too much of a waste to require all those files when I rarely use them.</p>

<h3 id="put_css_at_the_top_and_js_at_the_bottom">Put CSS At the Top and JS at the Bottom</h3>

<p>When I first set up Lightbox, I wanted to avoid using a WordPress plugin for it, so I cooked up <a href="http://blog.nerdstargamer.com/2008/04/04/gallery-of-doodles-in-lightbox-2/" title="Gallery of Doodles in Lightbox 2 | NerdStarGamer">my own method of including it</a>. Most of the work was simply trying to find a way around hard-coding my template directory in it and also using a function to keep my <code>header.php</code> file clean and easy to read.</p>

<p>The first problem with my original method was that all of those JavaScript files were at the top of the page, meaning that almost 200KB of JavaScript had to be loaded before any of the content on my page started to load. That&#8217;s no good! The simplest thing to do was to move my function down to the bottom of the page, right before the scripts for Google Analytics and Mint. The only other problem was that the function included the CSS file as well. Since I had already decided to merge the Lightbox CSS with my main CSS, all I actually had to do was remove the call to load the CSS.</p>

<h3 id="use_google's_apis">Use Google&#8217;s APIs</h3>

<p>Unless you&#8217;ve been living under a rock (or just don&#8217;t care), you&#8217;ve probably heard that Google just released their <a href="http://code.google.com/apis/ajaxlibs/" title="AJAX Libraries API - Google Code">AJAX Libraries API</a>. This was pretty much perfect timing for me since I was already looking at how Lightbox used the <a href="http://www.prototypejs.org/" title="Prototype JavaScript framework: Easy Ajax and DOM manipulation for dynamic web applications">Prototype</a> Framework and <a href="http://script.aculo.us/" title="script.aculo.us - web 2.0 javascript">Scriptaculous</a> Effects Library. It makes a whole lot more sense to use a version hosted by Google than it does to require clients to download the same exact version of a standard library from my slow web host. Ajaxian has a good rundown of the <a href="http://ajaxian.com/archives/announcing-ajax-libraries-api-speed-up-your-ajax-apps-with-googles-infrastructure" title="Ajaxian &raquo; Announcing AJAX Libraries API: Speed up your Ajax apps with Google&#8217;s infrastructure">features of this new API and why you would want to use it</a>.</p>

<p>After doing a relatively quick setup, I was able to call the Prototype framework from the Google API. It came in from Google at only 29KB; that&#8217;s the same file that I was just complaining was 124KB. That&#8217;s a no-brainer. Scriptaculous was a bit more of a problem though, since it takes a modular approach. Lightbox 2 actually only uses two of the eight possible modules. As far as I can tell, there is no way to use the standard type of of script tag to only include the libraries you want like this:</p>

<pre><code>&lt;script type="text/javascript" src="http://blog.nerdstargamer.com/wp-content/themes/positiveGrey-v2.0/js/scriptaculous.js?load=effects,builder"&gt;&lt;/script&gt;
</code></pre>

<p><a href="http://ajaxian.com/archives/announcing-ajax-libraries-api-speed-up-your-ajax-apps-with-googles-infrastructure#comment-264086" title="Ajaxian &raquo; Announcing AJAX Libraries API: Speed up your Ajax apps with Google&#8217;s infrastructure">One of the comments on Ajaxian by jdalton</a>, addresses this:</p>

<blockquote>
  <p>Another issue google will need to work out is that MooTools, Scriptaculous, and Dojo are modular (meaning you donâ€™t have to load the kitchen sink and can just load the parts you want). This can effect the file size footprint as well. This may be beyond the scope of a CDN though.</p>
</blockquote>

<p>Because I couldn&#8217;t find a way to only include the modules I needed, I decided to continue serving them locally instead. So, my function to include Lightbox now looks like this:</p>

<pre><code>function AKM_include_lightbox() {
    $templateDir = get_bloginfo('template_directory');

    $output = &lt;&lt;&lt;EOT
&lt;script src='http://www.google.com/jsapi'&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
    var tplDir = "${templateDir}/images/lightbox/";
    google.load('prototype', '1.6.0.2');
&lt;/script&gt;
&lt;script type="text/javascript" src="${templateDir}/js/scriptaculous.js?load=effects,builder"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="${templateDir}/js/lightbox.js"&gt;&lt;/script&gt;
EOT;

echo $output;
}
</code></pre>

<h3 id="reorganize_template_directory">Reorganize Template Directory</h3>

<p>Although this doesn&#8217;t actually have anything to do with the speed of my website, it seemed appropriate to take this opportunity to reorganize my template directory a little bit. I was striving to create a more traditional web setup within my WordPress template that included all CSS in a CSS folder, JavaScript in a JS folder, and images in an image folder.</p>

<p>This first issue to address was the WordPress default <code>style.css</code> file. This file is necessary for WordPress template to function properly, as explained in the <a href="http://codex.wordpress.org/Theme_Development#Theme_Style_Sheet" title="Theme Development &laquo; WordPress Codex">WordPress Theme Development Codex page</a>. What I decided to do was to remove all of the actual styles from this file and simply leave the WordPress information:</p>

<pre><code>/*
Theme Name:Positive Grey
Theme URI:http://nerdstargamer.com
Description:A simple theme using a fluid 2 column layout with green and grey
Version:2.0
Author:Alissa Miller
Author URI:http://nerdstargamer.com
*/

/* See css/screen-x.x.css for styles */
</code></pre>

<p>I then moved all of the styles to a new file called <code>screen-x.x.css</code> in the CSS folder. This allows me to have all stylesheets (with the exception of <code>style.css</code>) in the CSS folder. It also allows me to use versioning in the filename, which as we will see, will be important after I&#8217;ve implemented better caching and expires headers.</p>

<p>I previously put all of the Lightbox files in their own folder, to keep things neat. I&#8217;ve now decided to roll those files into the normal directory structure instead of keeping them separate. The CSS file got merged with <code>screen.css</code> and all of the Lightbox JavaScript files got moved into the js folder. Lightbox also includes several images, which I decided to put in <code>images/lightbox/</code> so as not to confuse them with my own template images.</p>

<h3 id="gzip_components">Gzip Components, Improve Caching</h3>

<p>One of the <a href="http://developer.yahoo.com/performance/rules.html#gzip" title="Best Practices for Speeding Up Your Web Site">rules for YSlow includes Gziping components</a>. Some of my scripts are for Mint and JavaScript, which I can&#8217;t really control. The others however, along with my CSS are fair game. I had a little bit of trouble figuring out how to do this since I did not want to use any of the more common php methods to compress my pages on the fly and was looking at just using either mod_gzip or mod_deflate. The YSlow page gives the following information:</p>

<blockquote>
  <p>Gzipping generally reduces the response size by about 70%. Approximately 90% of today&#8217;s Internet traffic travels through browsers that claim to support gzip. If you use Apache, the module configuring gzip depends on your version: Apache 1.3 uses mod_gzip while Apache 2.x uses mod_deflate.</p>
</blockquote>

<p>After some research, I figured out that my website is hosted on Apache 2 (not earlier). I included this block in my root <code>.htaccess</code> file:</p>

<pre><code># GZIP CSS AND JS
&lt;IfModule mod_deflate.c&gt;
 &lt;FilesMatch "\.(js|css)$"&gt;
  SetOutputFilter DEFLATE
 &lt;/FilesMatch&gt;
&lt;/IfModule&gt;
</code></pre>

<p>I also decided to make the move to using <a href="http://ocaoimh.ie/wp-super-cache/" title="WP Super Cache">WP Super Cache</a> instead of <a href="http://mnm.uib.es/gallir/wp-cache-2/" title="Antiguo y abandonado blog de Ricardo Galli :-( &raquo; WP-Cache 2.0">WP Cache</a>. WP Super Cache is much like WP Cache but does offer some performance benefits. Once I got WP Super Cache configured and running, it seemed to have an immediate effect on the speed of my blog. Of course, that could have just been wishful thinking on my part.</p>

<h3 id="add_an_expires_header">Add an Expires Header</h3>

<p>One of the last things I did was add an expires header in my root <code>.htaccess</code> file. This tells the client browsers not to look for a new version at all if the one in their cache hasn&#8217;t expired yet.</p>

<p>Now, I obviously don&#8217;t want to do this to the dynamic WordPress files (comments and posts would never update!), but that&#8217;s okay because WP Super Cache is taking care of those files already. What I do want to do is add the expires header to all of my images, JavaScript and CSS files. None of these will really change except for the CSS files. Fortunately, when I reorganized my template files, I gained the ability to append version numbers to my CSS files. So now I can go ahead and add that expires header to my CSS files, and then simply change the file name when I need to make changes in my CSS. The new file will download like normal, and it&#8217;s good practice to get some sort of versioning underway.</p>

<p>Here is the code that I put in my <code>.htaccess</code> file:</p>

<pre><code>### ADD FAR OUT EXPIRES HEADDER TO STATIC CONTENT ###
&lt;ifmodule mod_expires.c&gt;
  &lt;filesmatch "\.(jpg|gif|png|css|js)$"&gt;
       ExpiresActive on
       ExpiresDefault "access plus 1 month"
   &lt;/filesmatch&gt;
&lt;/ifmodule&gt;
</code></pre>

<p>After some thought I decided that one month was an appropriate length for my purposes. This depends entirely on what type of content it is, and how often you are going to change it.</p>

<h3 id="rework_the_gallery_page_for_better_performance">Rework the Gallery Page for Better Performance</h3>

<p>After doing all of the previously mentioned fixes, I had improved the page load time quite a bit for most of my site. The only remaining bottleneck seemed to be my <a href="http://blog.nerdstargamer.com/gallery" title="Gallery | NerdStarGamer">Gallery</a> page. That wasn&#8217;t particularly surprising considering that the page includes 25 thumbnail images. The total size of all of the images, at full size, weighs in at a hefty 2MB. This page was also still using the Lightbox scripts.</p>

<p>One of the things I noticed while using YSlow was that some of my thumbnail images seemed to be unnecessarily large. Some of them were as big as 40KB for a 150&#215;150 pixel image! Upon further inspection I decided that <em>all</em> of the thumbnails were too large. I had used WordPress&#8217; feature to automatically create thumbnails of images to set this up. I&#8217;m not sure exactly how WordPress does this, but after taking a look at the file sizes I&#8217;m sure that it sucks. I recreated all of the thumbnails in Photoshop and the biggest one is now only 17.6KB.</p>

<p>I had also originally set up the gallery page in WordPress&#8217; admin screen (using the file browser and things like that). Once I was no longer using the dynamically generated thumbnails, it didn&#8217;t make sense to lay out the page in WordPress&#8217; page section. Instead I created a page template called gallery.php, which includes all of the images and code for the page.</p>

<p>I also copied all of the full size and thumbnail images into my template image folder. This way the links to the images are no longer being stored in my database.</p>

<h3 id="conclusion">Conclusion</h3>

<p>After all of these changes my website does seem to be a little bit faster. These types of exercises are good practice for any web designer/developer. Having a slow web host is no excuse for not doing what you can on your end to make the site faster.</p>

<p>As always, any tips or improvements from more experienced developers in this area are greatly appreciated.</p>

<ol class="footnote">
 <li id="fn-yslow1">You get what you pay for, right?<a href="#fnr-yslow1" title="back to article">&#x21A9;</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Fgetting-geeky-with-yslow%2F&#038;seed_title=Getting+Geeky+With+YSlow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Error: This Should Never Happen</title>
		<link>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Ferror-this-should-never-happen%2F&#038;seed_title=Error%3A+This+Should+Never+Happen</link>
		<comments>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Ferror-this-should-never-happen%2F&#038;seed_title=Error%3A+This+Should+Never+Happen#comments</comments>
		<pubDate>Tue, 25 Mar 2008 20:49:53 +0000</pubDate>
		<dc:creator>Alissa Miller</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Random Thoughts]]></category>
		<category><![CDATA[Console]]></category>
		<category><![CDATA[Mail]]></category>
		<category><![CDATA[OS X]]></category>

		<guid isPermaLink="false">http://blog.nerdstargamer.com/2008/03/25/error-this-should-never-happen/</guid>
		<description><![CDATA[Imagine my surprise when I opened up Console yesterday and found this error message from Mail in the console.log: I wonder what caused the error why the developer thought &#8220;this should never happen.&#8221;]]></description>
			<content:encoded><![CDATA[<p>Imagine my surprise when I opened up <a href="http://en.wikipedia.org/wiki/Console_(application)" title="Console (application) - Wikipedia, the free encyclopedia">Console</a> yesterday and found this error message from <a href="http://www.apple.com/macosx/features/mail.html" title="Apple - Mac OS X Leopard - Features - Mail">Mail</a> in the <code>console.log</code>:</p>

<p><img src="http://blog.nerdstargamer.com/wp-content/uploads/2008/03/mail-error-message.png" alt="Mail Error Message" /></p>

<p>I wonder what caused the error why the developer thought &#8220;this should never happen.&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Ferror-this-should-never-happen%2F&#038;seed_title=Error%3A+This+Should+Never+Happen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Automatically Post Safari Tabs to Del.icio.us With &#8220;topost&#8221; Tag</title>
		<link>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Fautomatically-post-safari-tabs-to-delicious-with-topost-tag%2F&#038;seed_title=Automatically+Post+Safari+Tabs+to+Del.icio.us+With+%26%238220%3Btopost%26%238221%3B+Tag</link>
		<comments>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Fautomatically-post-safari-tabs-to-delicious-with-topost-tag%2F&#038;seed_title=Automatically+Post+Safari+Tabs+to+Del.icio.us+With+%26%238220%3Btopost%26%238221%3B+Tag#comments</comments>
		<pubDate>Tue, 25 Mar 2008 09:54:24 +0000</pubDate>
		<dc:creator>Alissa Miller</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[AppleScript]]></category>
		<category><![CDATA[Blogging]]></category>
		<category><![CDATA[Del.icio.us]]></category>
		<category><![CDATA[Quicksilver]]></category>
		<category><![CDATA[Safari]]></category>

		<guid isPermaLink="false">http://blog.nerdstargamer.com/2008/03/25/automatically-post-safari-tabs-to-delicious-with-topost-tag/</guid>
		<description><![CDATA[I wrote a short AppleScript yesterday to allow you to automatically add the current tab in Safari to your bookmarks in Del.icio.us with a specified tag or tags. The default tag is &#8220;toPost.&#8221; Add the script into Quicksilver as a trigger and you&#8217;ve got an &#252;ber convenient post later (or never) script. Here is the [...]]]></description>
			<content:encoded><![CDATA[<p>I wrote a short AppleScript yesterday to allow you to automatically add the current tab in Safari to your bookmarks in Del.icio.us with a specified tag or tags. The default tag is &#8220;toPost.&#8221; Add the script into Quicksilver as a trigger and you&#8217;ve got an &uuml;ber convenient post later (or never) script.</p>

<p>Here is the script (or <a href='http://blog.nerdstargamer.com/wp-content/uploads/2008/03/topostsafariscpt.zip'>download it here</a>):</p>

<pre><code>-- To change the tags, edit text inside quotes below
-- Use spaces to seperate multiple tags (ex: "tagOne tagTwo")
set tags to "toPost"

-- build delicious URL for current tab in frontmost window of Safari
tell application "Safari"
    set u to (name of current tab of front window) &amp; Â¬
        "&amp;url=" &amp; (URL of current tab of front window) &amp; Â¬
        "&amp;tags=" &amp; tags
end tell

-- Add URL to Delicious
tell application "Safari"
    do JavaScript "javascript:void(open('https://api.del.icio.us/v1/posts/add?description=" &amp; u &amp; "','delicious','toolbar=no,width=150,height=100'));" in document 1
    delay 0.5
    close current tab of front window

end tell
</code></pre>

<p>This is basically a simple modification of the <a href="http://futuremacblog.blogspot.com/2008/03/netnewswire-to-delicious-toread.html" title="FutureMac: NetNewsWire to del.icio.us with &quot;toread&quot; tag using Applescript">script written by Andrew Faden</a> which does pretty much the same except from NetNewsWire instead of Safari. Be sure to check out his original script and also the <a href="http://futuremacblog.blogspot.com/2008/03/improved-netnewswire-to-delicious.html" title="FutureMac: Improved NetNewsWire to del.icio.us AppleScript">much improved version</a> submitted by Larry from <a href="http://scriptingforlawyers.com/" title="Scripting for Lawyers">http://scriptingforlawyers.com/</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Fautomatically-post-safari-tabs-to-delicious-with-topost-tag%2F&#038;seed_title=Automatically+Post+Safari+Tabs+to+Del.icio.us+With+%26%238220%3Btopost%26%238221%3B+Tag/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Do Not Reply (.com)</title>
		<link>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Fdo-not-reply-com%2F&#038;seed_title=Do+Not+Reply+%28.com%29</link>
		<comments>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Fdo-not-reply-com%2F&#038;seed_title=Do+Not+Reply+%28.com%29#comments</comments>
		<pubDate>Wed, 19 Mar 2008 23:24:07 +0000</pubDate>
		<dc:creator>Alissa Miller</dc:creator>
				<category><![CDATA[General Computing]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Email]]></category>
		<category><![CDATA[Security]]></category>

		<guid isPermaLink="false">http://blog.nerdstargamer.com/2008/03/19/do-not-reply-com/</guid>
		<description><![CDATA[You know all of those emails that you get from companies that say &#8220;DO NOT REPLY&#8221;? As it turns out, some genius programmers really like to go the extra mile to make sure that their users do not reply&#8230;to them. These geniuses program the emails they send to have a reply-to address in the form [...]]]></description>
			<content:encoded><![CDATA[<p>You know all of those emails that you get from companies that say &#8220;DO NOT REPLY&#8221;? As it turns out, some genius programmers really like to go the extra mile to make sure that their users do not reply&#8230;to them. These geniuses program the emails they send to have a reply-to address in the form of <code>something@donotreply.com</code>. You know, so they don&#8217;t get the replies (or bounce-backs).</p>

<p>Trouble is, donotreply.com is actually a real domain. And, any email sent to that domain, will be received by someone. In fact, Chet Faliszek will probably get the email, because he owns the domain <a href="http://www.donotreply.com/" title="Do Not Reply">donotreply.com</a>. He also likes to <a href="http://www.donotreply.com/index.php/about/" title="Do Not Reply &raquo; About">post the best of the embarrassing mistakes</a>.</p>

<p class="via">Via <a href="http://www.codinghorror.com/blog/" title="Coding Horror">Coding Horror</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Fdo-not-reply-com%2F&#038;seed_title=Do+Not+Reply+%28.com%29/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Multi Columns in websites</title>
		<link>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Fmulti-columns-in-websites%2F&#038;seed_title=Multi+Columns+in+websites</link>
		<comments>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Fmulti-columns-in-websites%2F&#038;seed_title=Multi+Columns+in+websites#comments</comments>
		<pubDate>Wed, 19 Mar 2008 08:13:19 +0000</pubDate>
		<dc:creator>Alissa Miller</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[MultiColumn]]></category>

		<guid isPermaLink="false">http://blog.nerdstargamer.com/2008/03/19/multi-columns-in-websites/</guid>
		<description><![CDATA[For the past couple of months I&#8217;ve been working on creating a new website that uses WordPress as a CMS for the organization Girls Get Connected (That&#8217;s the old site, because the new one isn&#8217;t quite done yet). The project has been a great one to work on because I&#8217;ve gotten to do everything including [...]]]></description>
			<content:encoded><![CDATA[<p>For the past couple of months I&#8217;ve been working on creating a new website that uses <a href="http://wordpress.org/" title="WordPress &#8250; Blog Tool and Weblog Platform">WordPress</a> as a <a href="http://en.wikipedia.org/wiki/Content_management_system" title="Content management system - Wikipedia, the free encyclopedia">CMS</a> for the organization <a href="http://www.girlsgetconnected.org/" title="Welcome to the Girls Get Connected web site!">Girls Get Connected</a> (That&#8217;s the old site, because the new one isn&#8217;t quite done yet). The project has been a great one to work on because I&#8217;ve gotten to do everything including the design of the site and development of the WordPress back-end and templates.</p>

<p>Early on in the project, after the design mockup had been approved, I knew there were going to be some difficulties implementing it. One of the things that I knew would be a problem was the fact that I had designed a rather prominent section on the home page of the site which called for an article to be split into multiple columns. This being a content managed site, I also knew it wasn&#8217;t really going to be an option to ask the end users to break up their articles into two even sections so that it would make nice and pretty columns. Also, CSS3 really wasn&#8217;t an option, since this site would have to work on all current browsers. Something else would have to be done.</p>

<p>The solution I ended up using was a very elegant JavaScript program written by <a href="http://randysimons.com/pagina_1_NL.xhtml" title="Home">Randy Simons</a>. The script is called <a href="http://randysimons.com/pagina_129_NL.xhtml" title="Automatic Multi Column text in HTML">Multi-Column Text</a> and is pretty easy to implement. It automatically splits the text into multiple columns (you chose how many), and includes support for liquid layouts. This means that the content and columns aren&#8217;t static; they will automatically adjust as the page is resized. Check out the <a href="http://randysimons.com/overige/multicolumn/" title="Multi Columns in HTML">demonstration page</a> to see what I mean. This script is also works on enough old browsers to actually be usable.</p>

<p>What impressed me most about the script was that it requires very little extra markup. Assuming all of your markup is in some sort of standards compliant state, all that is required is one (or possibly two) extra <code>div</code> tags. Say you wanted to make the following code segment use the multicolumn script:</p>

<pre><code>&lt;h2&gt;Maecenas&lt;/h2&gt;
&lt;p&gt;Pellentesque mi. In lacinia iaculis ante.&lt;/p&gt;
&lt;h1&gt;Ut dapibus&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Nunc non dui.&lt;/em&gt; Maecenas quis lacus sed dui commodo elementum.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pellentesque rhoncus sollicitudin libero. Phasellus nunc risus, tincidunt vel, bibendum eu, molestie ac, tortor. Etiam in felis.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Pellentesque id erat. Mauris condimentum pharetra nibh. Fusce sollicitudin auctor tortor. Aliquam placerat,&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
</code></pre>

<p>All that needs to be added are two <code>div</code> tags to wrap the content. The first <code>div</code> must also include an id or class name for the JavaScript to hook to. You can use whatever class or id name you want when you implement it. I chose to use <code>id=multicolumn</code>. The finished markup would look like this:</p>

<pre><code>&lt;div class="multicolumn"&gt;
  &lt;div&gt;
    &lt;h2&gt;Maecenas&lt;/h2&gt;
    &lt;p&gt;Pellentesque mi. In lacinia iaculis ante.&lt;/p&gt;
    &lt;h1&gt;Ut dapibus&lt;/h1&gt;
    &lt;p&gt;&lt;em&gt;Nunc non dui.&lt;/em&gt; Maecenas quis lacus sed dui commodo elementum.&lt;/p&gt;
    &lt;p&gt;&lt;strong&gt;Pellentesque rhoncus sollicitudin libero. Phasellus nunc risus, tincidunt vel, bibendum eu, molestie ac, tortor. Etiam in felis.&lt;/strong&gt;&lt;/p&gt;
    &lt;p&gt;&lt;strong&gt;&lt;em&gt;Pellentesque id erat. Mauris condimentum pharetra nibh. Fusce sollicitudin auctor tortor. Aliquam placerat,&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
</code></pre>

<p>I like the way that looks: clean and simple. You can even use this in in a WordPress template with PHP tags included and everything still works. This is what is actually coded into one of my WordPress template files:</p>

<pre><code>&lt;div class="multicolumn"&gt;
  &lt;div&gt;
    &lt;?php ggc_the_long_excerpt(); ?&gt;
    &lt;p class="readmore"&gt;&lt;a href="&lt;?php the_permalink() ?&gt;" rel="bookmark" title="Continue Reading &lt;?php the_title_attribute(); ?&gt;"&gt;Read More &amp;raquo;&lt;/a&gt;&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
</code></pre>

<p>My favorite part is what happens when Javascript is not available. In my case, the page still works fine and no content is lost. Sure, there are some rather long line lengths, but everything still works.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Fmulti-columns-in-websites%2F&#038;seed_title=Multi+Columns+in+websites/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript getElementsByClassName</title>
		<link>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Fjavascript-getelementsbyclassname%2F&#038;seed_title=JavaScript+getElementsByClassName</link>
		<comments>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Fjavascript-getelementsbyclassname%2F&#038;seed_title=JavaScript+getElementsByClassName#comments</comments>
		<pubDate>Thu, 06 Mar 2008 02:37:55 +0000</pubDate>
		<dc:creator>Alissa Miller</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[DOM Scripting]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://blog.nerdstargamer.com/2008/03/05/javascript-getelementsbyclassname/</guid>
		<description><![CDATA[Today I found myself writing a little bit of JavaScript to isolate an element on a page. The element in question looked something like this: &#60;div class="mulitcolumn"&#62; &#60;p&#62;Some text...&#60;/p&#62; &#60;p&#62;Some more text&#60;/p&#62; &#60;div&#62; I wanted to get the div element by searching for the class name multicolulmn. Without thinking, I began writing the code to [...]]]></description>
			<content:encoded><![CDATA[<p>Today I found myself writing a little bit of JavaScript to isolate an element on a page. The element in question looked something like this:</p>

<pre><code>&lt;div class="mulitcolumn"&gt;
    &lt;p&gt;Some text...&lt;/p&gt;
    &lt;p&gt;Some more text&lt;/p&gt;
&lt;div&gt;
</code></pre>

<p>I wanted to get the <code>div</code> element by searching for the class name <code>multicolulmn</code>. Without thinking, I began writing the code to grab the <code>div</code> using the <code>getElementByClassName</code> function. Then I remembered that <code>getElementByClassName</code> isn&#8217;t actually a built-in function. Oh well, <a href="http://www.google.com/" title="Google">Google</a> to the rescue.</p>

<p>I was able to quickly find Robert Nyman&#8217;s elegant <code>getElementsByClassName</code> function in The <a href="http://www.robertnyman.com/2005/11/07/the-ultimate-getelementsbyclassname/" title="The Ultimate getElementsByClassName - Robert&#8217;s talk - Web development and Internet trends">Ultimate GetElementsByClassName</a>.</p>

<p>Using this function, you can get elements like so (examples pulled from Nyman&#8217;s site):</p>

<pre><code>// To get all a elements in the document with a â€œinfo-linksâ€ class.
getElementsByClassName(document, "a", "info-links");

// To get all div elements within the element named â€œcontainerâ€, with a â€œcolâ€ and a â€œleftâ€ class.
getElementsByClassName(document.getElementById("container"), "div", ["col", "left"]);
</code></pre>

<p>I love it when I don&#8217;t have to write my own JavaScript.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Fjavascript-getelementsbyclassname%2F&#038;seed_title=JavaScript+getElementsByClassName/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Take Screenshots From the Command Line</title>
		<link>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Ftake-screenshots-from-the-command-line%2F&#038;seed_title=Take+Screenshots+From+the+Command+Line</link>
		<comments>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Ftake-screenshots-from-the-command-line%2F&#038;seed_title=Take+Screenshots+From+the+Command+Line#comments</comments>
		<pubDate>Tue, 19 Feb 2008 20:18:22 +0000</pubDate>
		<dc:creator>Alissa Miller</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[Mac OS X Administration]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[OS X]]></category>
		<category><![CDATA[Terminal]]></category>
		<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://blog.nerdstargamer.com/2008/02/19/take-screenshots-from-the-command-line/</guid>
		<description><![CDATA[There is a command for Terminal in OS X which allows you to take screenshots from the command line. Creepy creepy. Here is the format: screencapture -x FileToSaveAs The -x option tells it not to make the shutter click sound. There is also an -i option which triggers an interactive mode, although I&#8217;m not sure [...]]]></description>
			<content:encoded><![CDATA[<p>There is a command for Terminal in OS X which allows you to take screenshots from the command line. Creepy creepy. Here is the format:</p>

<pre><code>screencapture -x FileToSaveAs
</code></pre>

<p>The <code>-x</code> option tells it not to make the shutter click sound. There is also an <code>-i</code> option which triggers an interactive mode, although I&#8217;m not sure why you would use the Terminal to do that.</p>

<p>There is also a cute little tidbit in the man page for <code>screencapture</code>:</p>

<p><img src="http://blog.nerdstargamer.com/wp-content/uploads/2008/02/screencapture-bug-in-man-page.png" alt="Screencapture bug in man page" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Ftake-screenshots-from-the-command-line%2F&#038;seed_title=Take+Screenshots+From+the+Command+Line/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Finding a Good CMS Solution</title>
		<link>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Ffinding-a-good-cms-solution%2F&#038;seed_title=Finding+a+Good+CMS+Solution</link>
		<comments>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Ffinding-a-good-cms-solution%2F&#038;seed_title=Finding+a+Good+CMS+Solution#comments</comments>
		<pubDate>Fri, 08 Feb 2008 20:49:00 +0000</pubDate>
		<dc:creator>Alissa Miller</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[Drupal]]></category>
		<category><![CDATA[Joomla]]></category>
		<category><![CDATA[MODx]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://blog.nerdstargamer.com/2008/02/08/finding-a-good-cms-solution/</guid>
		<description><![CDATA[There is a pretty good discussion going on over at 456 Berea Street about &#8220;Looking for open source CMS and portal software options&#8220;. I&#8217;ve been thinking a lot about this for the last couple of months. I&#8217;ve worked extensively with WordPress (for this blog and a few others) and I really feel comfortable with it. [...]]]></description>
			<content:encoded><![CDATA[<p>There is a pretty good discussion going on over at <a href="http://www.456bereastreet.com/lab/" title="The CSS and XHTML Lab | 456 Berea Street">456 Berea Street</a> about &#8220;<a href="http://www.456bereastreet.com/archive/200802/looking_for_open_source_cms_and_portal_software_options/" title="Looking for open source CMS and portal software options | 456 Berea Street">Looking for open source CMS and portal software options</a>&#8220;.</p>

<p>I&#8217;ve been thinking a lot about this for the last couple of months. I&#8217;ve worked extensively with <a href="http://wordpress.org/" title="WordPress &#8250; Blog Tool and Weblog Platform">WordPress</a> (for this blog and a few others) and I really feel comfortable with it. I am confident that I can work with it and bend it to do most things I want with a little effort.</p>

<p>Currently I&#8217;m using WordPress for a contract job to create a smallish website managed by a CMS. The client wanted to use WordPress, and I am reasonably confident that it will achieve their goals. That said, I think they&#8217;re getting uncomfortably close to WordPress&#8217;s limits. There&#8217;s always a point when you are extending software that you have to stop and consider, &#8220;Am I really using the right tool for this job?&#8221;</p>

<p>I&#8217;d really like to branch out and learn some other content management systems that are more powerful than WordPress and also more geared towards CMS rather than blogging out of the box. I tried using <a href="http://drupal.org/" title="drupal.org | Community plumbing">Drupal</a> a few months ago, and like many of the peopling commenting on 456 Berea Street, I found the admin interface to be absolutly overwhelming. It&#8217;s definitely designed with the mentality that more is better. I had a very clear vision in mind for what I wanted to accomplish with my Drupal site, but I ended up stumbling on some key things that felt like they should be very easy. Primarily dealing with attachment links.</p>

<p>That said, I was very impressed in general with Drupal. It seemed liked the sky was the limit as far what could be accomplished with it. The user roles were also a welcome departure from more restrictive systems like WordPress.</p>

<p>In the end, I was left with the impression that given a lot of time and energy (to learn Drupal) I could make some very cool sites. I wonder, are there other solutions that are better?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2008%2Ffinding-a-good-cms-solution%2F&#038;seed_title=Finding+a+Good+CMS+Solution/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XKCD: 1337</title>
		<link>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Fxkcd-1337%2F&#038;seed_title=XKCD%3A+1337</link>
		<comments>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Fxkcd-1337%2F&#038;seed_title=XKCD%3A+1337#comments</comments>
		<pubDate>Fri, 16 Nov 2007 16:36:25 +0000</pubDate>
		<dc:creator>Alissa Miller</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Random Thoughts]]></category>
		<category><![CDATA[Nerdery]]></category>
		<category><![CDATA[XKCD]]></category>

		<guid isPermaLink="false">http://blog.nerdstargamer.com/2007/11/16/xkcd-1337/</guid>
		<description><![CDATA[XKCD wins my eternal affection for referencing The Princess Bride in Part 5 of 1337.]]></description>
			<content:encoded><![CDATA[<p><a href="http://xkcd.com/" title="xkcd - A webcomic of romance, sarcasm, math, and language - By Randall Munroe">XKCD</a> wins my eternal affection for referencing <a href="http://en.wikipedia.org/wiki/The_Princess_Bride_%28film%29" title="The Princess Bride (film) - Wikipedia, the free encyclopedia">The Princess Bride</a> in <a href="http://xkcd.com/345/" title="xkcd - A webcomic of romance, sarcasm, math, and language - By Randall Munroe">Part 5 of 1337</a>.</p>

<p><img src="http://blog.nerdstargamer.com/wp-content/uploads/2007/11/xkcd-1337-part-5.png" alt="Xkcd 1337 Part 5" title="One panel from the XKCD comic: 1337 Part 5" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Fxkcd-1337%2F&#038;seed_title=XKCD%3A+1337/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress Theme Hacks</title>
		<link>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Fwordpress-theme-hacks%2F&#038;seed_title=WordPress+Theme+Hacks</link>
		<comments>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Fwordpress-theme-hacks%2F&#038;seed_title=WordPress+Theme+Hacks#comments</comments>
		<pubDate>Wed, 14 Nov 2007 17:50:31 +0000</pubDate>
		<dc:creator>Alissa Miller</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Hacks]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Theme Development]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://blog.nerdstargamer.com/2007/11/14/wordpress-theme-hacks/</guid>
		<description><![CDATA[WeDesignerWall currently has a pretty good list of WordPress Theme Hacks. This is a good resource if you either trying to create your own theme or customize someone else&#8217;s. These is also a section on one way to get customized titles. They use this example: &#60;title&#62; &#60;?php if (is_home()) { echo bloginfo('name'); } elseif (is_404()) [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.webdesignerwall.com/" title="Web Designer Wall - Design Trends and Tutorials">WeDesignerWall</a> currently has a pretty good list of <a href="http://www.webdesignerwall.com/tutorials/wordpress-theme-hacks/" title="WordPress Theme Hacks">WordPress Theme Hacks</a>. This is a good resource if you either trying to create your own  theme or customize someone else&#8217;s.</p>

<p>These is also a section on one way to get customized titles. They use this example:</p>

<pre><code>&lt;title&gt;
    &lt;?php
    if (is_home()) {
        echo bloginfo('name');
    } elseif (is_404()) {
        echo '404 Not Found';
    } elseif (is_category()) {
echo 'Category:'; wp_title('');
} elseif (is_search()) {
    echo 'Search Results';
} elseif ( is_day() || is_month() || is_year() ) {
    echo 'Archives:'; wp_title('');
} else {
    echo wp_title('');
}
?&gt;
&lt;/title&gt;
</code></pre>

<p>I personally use something similar for this page:</p>

<pre><code>&lt;title&gt;
&lt;?php /* Title for homepage is "blogtitle | blogdescription", all other pages get "pagetitle | blogtitle" */
    if (is_single() || is_page() || is_archive()) { wp_title('',true); echo ' | '; bloginfo('name'); } 
    else { bloginfo('name'); echo ': '; bloginfo('description'); } ?&gt;
&lt;/title&gt;
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Fwordpress-theme-hacks%2F&#038;seed_title=WordPress+Theme+Hacks/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>With Apologies to Robert Frost</title>
		<link>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Fwith-apologies-to-robert-frost%2F&#038;seed_title=With+Apologies+to+Robert+Frost</link>
		<comments>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Fwith-apologies-to-robert-frost%2F&#038;seed_title=With+Apologies+to+Robert+Frost#comments</comments>
		<pubDate>Wed, 05 Sep 2007 22:22:42 +0000</pubDate>
		<dc:creator>Alissa Miller</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Comics]]></category>
		<category><![CDATA[XKCD]]></category>

		<guid isPermaLink="false">http://blog.nerdstargamer.com/2007/09/05/with-apologies-to-robert-frost/</guid>
		<description><![CDATA[Every time I think that XKCD couldn&#8217;t possibly get any dorkier, well, it does. I sure do love it. With Apologies to Robert Frost]]></description>
			<content:encoded><![CDATA[<p>Every time I think that <a href="http://xkcd.com/" title="xkcd - A webcomic of romance, sarcasm, math, and language - By Randall Munroe">XKCD</a> couldn&#8217;t possibly get any dorkier, well, it does. I sure do love it.</p>

<p><a href="http://xkcd.com/312/" title="xkcd - A webcomic of romance, sarcasm, math, and language - By Randall Munroe"><img src="http://blog.nerdstargamer.com/wp-content/uploads/2007/09/xkcdcom-with-apologies-to-robert-frost.png" alt="Xkcd.com With Apologies to Robert Frost" /></a></p>

<ul class="articleLink">
    <li><a href="http://xkcd.com/312/" title="XKCD: With Apologies to Robert Frost">With Apologies to Robert Frost</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Fwith-apologies-to-robert-frost%2F&#038;seed_title=With+Apologies+to+Robert+Frost/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tripoli CSS Rendering Foundation</title>
		<link>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Ftripoli-css-rendering-foundation%2F&#038;seed_title=Tripoli+CSS+Rendering+Foundation</link>
		<comments>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Ftripoli-css-rendering-foundation%2F&#038;seed_title=Tripoli+CSS+Rendering+Foundation#comments</comments>
		<pubDate>Fri, 24 Aug 2007 22:11:34 +0000</pubDate>
		<dc:creator>Alissa Miller</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Tripoli]]></category>
		<category><![CDATA[Typography]]></category>

		<guid isPermaLink="false">http://blog.nerdstargamer.com/2007/08/24/tripoli-css-rendering-foundation/</guid>
		<description><![CDATA[David Hellsing has created a new CSS Rendering Foundation (if that confuses you, think framework) with cross-browser compatibility. Tripoli The CSS files basically include a global reset, generic styles, and a print stylesheet. There is also an IE stylesheet for specific IE bugs. The CSS files looks pretty good. All of the typography is based [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://monc.se/kitchen/" title="David&#8217;s kitchen">David Hellsing</a> has created a new CSS Rendering Foundation (if that confuses you, think framework) with cross-browser compatibility.</p>

<ul class="articleLink">
    <li><a href="http://monc.se/tripoli/" title="Tripoli">Tripoli</a></li>
</ul>

<p>The CSS files basically include a global reset, generic styles, and a print stylesheet. There is also an IE stylesheet for specific IE bugs. The CSS files looks pretty good.</p>

<p>All of the typography is based on <em><a href="http://www.amazon.com/Elements-Typographic-Style-Robert-Bringhurst/dp/0881791326" title="Amazon.com: The Elements of Typographic Style: Books: Robert Bringhurst">The Elements of Typographic Style</a></em>:</p>

<blockquote>
  <p>Vertical rhythm, line-heights, margins and font sizes have been carefully selected to follow classic typographic guidelines from books like &#8220;<em>The Elements of Typographic Style</em>&#8220;. All measurements are set in em&#8217;s, so it&#8217;s very easy to do elastic and dynamic layouts while still keeping typographical proportions. Rules like <code>font-size</code> and <code>font-family</code> are set globally so you can easily override them with new values that suits your project without ruining the natural flow.</p>
</blockquote>

<p>Even cooler, Tripoli also introduces the idea of using &#8220;plugs&#8221; to extend the generic base code:</p>

<blockquote>
  <p>One of the ideas behind Tripoli is to allow external plugs to extend the generic base. To demonstrate this, I have created a <a href="http://monc.se/tripoli/neg.html" title="Sample HTML Negative">negative plug</a> that changes all colors to prepare for a negative layout. Other plugs could be sidebars, menus, rounded boxes, code formatting and other helpful widgets.</p>
</blockquote>

<p>The Tripoli site includes several examples of how it works. My particular favorite is the example where he takes a page from a W3C spec and completely restyles it (<em>links to the changed styles at the top of the document</em>):</p>

<ul class="articleLink">
    <li><a href="http://monc.se/tripoli/examples/w3_w.html" title="Tripoli: W3C Example">Tripoli: W3C Example</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Ftripoli-css-rendering-foundation%2F&#038;seed_title=Tripoli+CSS+Rendering+Foundation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Revolutionary Image Resizing Technique</title>
		<link>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Frevolutionary-image-resizing-technique%2F&#038;seed_title=Revolutionary+Image+Resizing+Technique</link>
		<comments>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Frevolutionary-image-resizing-technique%2F&#038;seed_title=Revolutionary+Image+Resizing+Technique#comments</comments>
		<pubDate>Thu, 23 Aug 2007 20:56:30 +0000</pubDate>
		<dc:creator>Alissa Miller</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[YouTube]]></category>

		<guid isPermaLink="false">http://blog.nerdstargamer.com/2007/08/23/revolutionary-image-resizing-technique/</guid>
		<description><![CDATA[Check out this video about a new technique for image resizing. In short, it allows images to be resized (bigger and smaller) without losing the integrity of the original image. There is some more information about the project on this site, including a pdf file about the project: Dr. Ariel Shamir Home Page. Via Thoughts [...]]]></description>
			<content:encoded><![CDATA[<p>Check out this video about a new technique for image resizing. In short, it allows images to be resized (bigger and smaller) without losing the integrity of the original image.</p>

<p><object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/6NcIJXTlugc"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/6NcIJXTlugc" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"></embed></object></p>

<p>There is some more information about the project on this site, including a pdf file about the project:</p>

<ul class="articleLink">
    <li><a href="http://www.faculty.idc.ac.il/arik/" title="Dr. Ariel Shamir Home Page"> Dr. Ariel Shamir Home Page.</a></li>
</ul>

<p class="via">Via <a href="http://meyerweb.com/eric/thoughts/recent-links/" title="Thoughts From Eric &raquo; Recent Links">Thoughts From Eric &raquo; Recent Links</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Frevolutionary-image-resizing-technique%2F&#038;seed_title=Revolutionary+Image+Resizing+Technique/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Open in Firefox</title>
		<link>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Fopen-in-firefox%2F&#038;seed_title=Open+in+Firefox</link>
		<comments>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Fopen-in-firefox%2F&#038;seed_title=Open+in+Firefox#comments</comments>
		<pubDate>Thu, 21 Jun 2007 00:22:56 +0000</pubDate>
		<dc:creator>Alissa Miller</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[OS X]]></category>
		<category><![CDATA[Safari]]></category>
		<category><![CDATA[Scripting]]></category>
		<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://blog.nerdstargamer.com/2007/06/20/open-in-firefox/</guid>
		<description><![CDATA[I currently use Safari as my primary browser on OS X systems. Oftentimes I find that I either want to dissect a web page in Firebug or even just see what it looks like in Firefox. This is kind of a pain because it takes several steps: Open Firefox (one step with Quicksilver) Activate Safari [...]]]></description>
			<content:encoded><![CDATA[<p>I currently use Safari as my primary browser on OS X systems. Oftentimes I find that I either want to dissect a web page in <a href="http://www.getfirebug.com/" title="Firebug - Web Development Evolved">Firebug</a> or even just see what it looks like in Firefox. This is kind of a pain because it takes several steps:</p>

<ol>
<li>Open Firefox (one step with <a href="http://quicksilver.blacktree.com/" title="quicksilver:
launcher philosophorum">Quicksilver</a>)</li>
<li>Activate Safari</li>
<li>Copy URL from desired website</li>
<li>Activate Firefox</li>
<li>Paste URL into Firefox.</li>
</ol>

<p>I could probably consolidate these steps a little bit (by dragging and dropping the URL perhaps), but the point remains, this is an annoying process to go through every time I want to quickly check something out in Firefox.</p>

<p>Last week I put together a nifty little script in <a href="http://www.apple.com/macosx/features/automator/" title="Apple - Mac OS X - Automator">Automator</a> to streamline this process. Basically, the script copies the URL from the active tab in Safari, opens Firefox and loads the page. I saved the script as an application and with Quicksilver it&#8217;s now just one step to activate the script.</p>

<ul class="articleLink">
 <li><a href='http://blog.nerdstargamer.com/wp-content/uploads/2007/06/open-in-firefoxapp.zip' title='Open in Firefox Script'>Open in Firefox Script (ZIP)</a></li>
</ul>

<p>For the most part, the script was pretty easy to set up. There is a built-in action to <code>Get Current Webpage from Safari</code>. There aren&#8217;t any scriptable actions for Firefox from Automator, but opening it is simple enough using a terminal command:</p>

<pre class="prettyprint"><code>open -a Firefox.app</code></pre>

<p>The only slightly tricky part about the script was getting the copied URL to automatically load when Firefox opens. After a little research I found that this could be simply passed as a parameter to the <code>open</code> command:</p>

<pre class="prettyprint"><code>open -a Firefox.app $@</code></pre>

<p>Perhaps some other Safari-lovers will find this useful. Enjoy.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Fopen-in-firefox%2F&#038;seed_title=Open+in+Firefox/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Easy WordPress Slugs With Textmate</title>
		<link>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Feasy-wordpress-slugs-with-textmate%2F&#038;seed_title=Easy+WordPress+Slugs+With+Textmate</link>
		<comments>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Feasy-wordpress-slugs-with-textmate%2F&#038;seed_title=Easy+WordPress+Slugs+With+Textmate#comments</comments>
		<pubDate>Fri, 15 Jun 2007 21:21:10 +0000</pubDate>
		<dc:creator>Alissa Miller</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[Slugs]]></category>
		<category><![CDATA[TextMate]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://blog.nerdstargamer.com/2007/06/15/easy-wordpress-slugs-with-textmate/</guid>
		<description><![CDATA[There is a nice little tip over on the Circle Six blog on how to set up the TextMate blogging bundle to use the WordPress 2.2 XMLRPC slug capabilities: Easy WP2.2 Slugs with TextMate The only oddity I found was that Circle Six lists the blogging.rb file in this location: ~/Library/Application Support/TextMate/bundles/Blogging.tmbundle/lib/blogging.rb On my computer [...]]]></description>
			<content:encoded><![CDATA[<p>There is a nice little tip over on the Circle Six blog on how to set up the <a href="http://macromates.com/" title="TextMate â€” The Missing Editor for Mac OS X">TextMate</a> blogging bundle to use the <a href="http://wordpress.org/" title="WordPress &#8250; Blog Tool and Weblog Platform">WordPress</a> 2.2 XMLRPC slug capabilities:</p>

<ul class="articleLink">
 <li><a href="http://blog.circlesixdesign.com/2007/06/14/easy-wp22-slugs-with-textmate/" title="Circle Six: Easy WP2.2 Slugs with TextMate">Easy WP2.2 Slugs with TextMate</a></li>
</ul>

<p>The only oddity I found was that Circle Six lists the <code>blogging.rb</code> file in this location:</p>

<pre class="prettyprint"><code>~/Library/Application Support/TextMate/bundles/Blogging.tmbundle/lib/blogging.rb</code></pre>

<p>On my computer the file was actually located here:</p>

<pre class="prettyprint"><code>/Applications/TextMate.app/Contents/SharedSupport/Bundles/Blogging.tmbundle/Support/lib/blogging.rb</code></pre>

<p>I&#8217;m not exactly sure why the two locations are different. Either way, mine works splendidly after following the tip.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Feasy-wordpress-slugs-with-textmate%2F&#038;seed_title=Easy+WordPress+Slugs+With+Textmate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mac Users and Cross Platform Apps</title>
		<link>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Fmac-users-and-cross-platform-apps%2F&#038;seed_title=Mac+Users+and+Cross+Platform+Apps</link>
		<comments>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Fmac-users-and-cross-platform-apps%2F&#038;seed_title=Mac+Users+and+Cross+Platform+Apps#comments</comments>
		<pubDate>Thu, 22 Mar 2007 19:57:58 +0000</pubDate>
		<dc:creator>Alissa Miller</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Browsers]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Safari]]></category>

		<guid isPermaLink="false">http://blog.nerdstargamer.com/2007/03/22/mac-users-and-cross-platform-apps/</guid>
		<description><![CDATA[About a month ago I blogged about my feelings on Mac browsers in Mac Browsers and Non-Native UI. My basic feeling was that the best browser that&#8217;s made for a Mac always wins. Firefox is a great browser, but it&#8217;s not made for a Mac. A recent article on Theocacao has basically reinforced what I [...]]]></description>
			<content:encoded><![CDATA[<p>About a month ago I blogged about my feelings on Mac browsers in <em><a href="http://blog.nerdstargamer.com/2007/02/10/mac-browsers-and-non-native-ui/" title="Read Post">Mac Browsers and Non-Native UI</a></em>. My basic feeling was that the best browser that&#8217;s <em>made</em> for a Mac always wins. Firefox is a great browser, but it&#8217;s not <em>made</em> for a Mac.</p>

<p>A recent article on <a href="http://theocacao.com/" title="Visit Theocacao">Theocacao</a> has basically reinforced what I said in my previous post. It&#8217;s well worth the read.</p>

<ul class="articleLink">
 <li><a href="http://theocacao.com/document.page/440" title="Theocacao: Simple Truths About Cross-Platform Apps">Simple Truths About Cross-Platform Apps</a></li>
</ul>

<p>Stevenson&#8217;s main rule of thumb for Mac development:</p>

<blockquote cite="http://theocacao.com/document.page/440">Mac users will generally favor an app with a better experience over the one with more features.</blockquote>

<p>Make sure to read that twice. He&#8217;s absolutely right.</p>

<p>Getting back to the browsers, Stevenson uses Firefox as an example for the above point:</p>

<blockquote cite="http://theocacao.com/document.page/440">A textbook example of this is Firefox. A great browser, but Safari is far more popular on the Mac because it&#8217;s designed for a Mac user. In fact, this runs so deeply that Camino â€” a Mac-only app which uses the same Gecko engine that Firefox does â€” enjoys a fairly strong following.</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Fmac-users-and-cross-platform-apps%2F&#038;seed_title=Mac+Users+and+Cross+Platform+Apps/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Bad C++ Joke</title>
		<link>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Fbad-c-joke%2F&#038;seed_title=Bad+C%2B%2B+Joke</link>
		<comments>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Fbad-c-joke%2F&#038;seed_title=Bad+C%2B%2B+Joke#comments</comments>
		<pubDate>Wed, 21 Mar 2007 16:29:22 +0000</pubDate>
		<dc:creator>Alissa Miller</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Humor]]></category>

		<guid isPermaLink="false">http://blog.nerdstargamer.com/2007/03/21/bad-c-joke/</guid>
		<description><![CDATA[One of my friends told us this joke in class today. The saddest part of it was that we all laughed really hard. How many C++ programmers does it take to change a light bulb? &#8220;You&#8217;re still thinking procedurally! A properly designed light bulb object would inherit a change method from a generic light bulb [...]]]></description>
			<content:encoded><![CDATA[<p>One of my friends told us this joke in class today. The saddest part of it was that we all laughed really hard.</p>

<blockquote>
<strong>How many C++ programmers does it take to change a light bulb?</strong>

<em>&#8220;You&#8217;re still thinking procedurally! A properly designed light bulb object would inherit a change method from a generic light bulb class!&#8221;</em>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Fbad-c-joke%2F&#038;seed_title=Bad+C%2B%2B+Joke/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Useful Shell Tricks</title>
		<link>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Fuseful-shell-tricks%2F&#038;seed_title=Useful+Shell+Tricks</link>
		<comments>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Fuseful-shell-tricks%2F&#038;seed_title=Useful+Shell+Tricks#comments</comments>
		<pubDate>Mon, 19 Mar 2007 20:35:26 +0000</pubDate>
		<dc:creator>Alissa Miller</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Bash]]></category>
		<category><![CDATA[Scripting]]></category>
		<category><![CDATA[Unix]]></category>

		<guid isPermaLink="false">http://blog.nerdstargamer.com/2007/03/19/useful-shell-tricks/</guid>
		<description><![CDATA[I just found this nice list of shell tricks over at UnixJunkie Blog. Most of them have to do with clever uses of SSH. This really would have come in handy back when I was trying to write a script that processed user tracking logs on our lab computers. Old (but useful) Shell Tricks]]></description>
			<content:encoded><![CDATA[<p>I just found this nice list of shell tricks over at <a href="http://unixjunkie.blogspot.com/index.html" title="Visit UnixJunkie Blog">UnixJunkie Blog</a>. Most of them have to do with clever uses of SSH. This really would have come in handy back when I was <a href="http://blog.nerdstargamer.com/2006/10/17/using-ssh-in-script/" title="Using ssh in Script">trying to write a script that processed user tracking logs</a> on our lab computers.</p>

<ul class="articleLink">
 <li><a href="http://unixjunkie.blogspot.com/2006/08/old-but-useful-shell-tricks.html" title="UnixJunkie Blog: Old (but useful) Shell Tricks">Old (but useful) Shell Tricks</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Fuseful-shell-tricks%2F&#038;seed_title=Useful+Shell+Tricks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Clippy&#8217;s Revenge</title>
		<link>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Fclippys-revenge%2F&#038;seed_title=Clippy%26%238217%3Bs+Revenge</link>
		<comments>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Fclippys-revenge%2F&#038;seed_title=Clippy%26%238217%3Bs+Revenge#comments</comments>
		<pubDate>Wed, 14 Mar 2007 22:21:57 +0000</pubDate>
		<dc:creator>Alissa Miller</dc:creator>
				<category><![CDATA[General Computing]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Humor]]></category>
		<category><![CDATA[Microsoft]]></category>

		<guid isPermaLink="false">http://blog.nerdstargamer.com/2007/03/14/clippys-revenge/</guid>
		<description><![CDATA[Just plain funny: How the vi editor would seem if it has been made by Microsoft]]></description>
			<content:encoded><![CDATA[<p>Just plain funny:</p>

<ul class="articleLink">
 <li><a href="http://blogs.sun.com/marigan/entry/how_the_vi_editor_would" title="Marigan's Weblog: How the vi editor would seem if it has been made by Microsoft">How the vi editor would seem if it has been made by Microsoft</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.nerdstargamer.com/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fblog.nerdstargamer.com%2F2007%2Fclippys-revenge%2F&#038;seed_title=Clippy%26%238217%3Bs+Revenge/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using disk: enhanced
Database Caching 5/15 queries in 1.756 seconds using disk: basic

Served from: blog.nerdstargamer.com @ 2012-02-09 19:21:12 -->
