<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/atom10full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"><title>Sag Rising</title><subtitle>Notes to Myself</subtitle><updated>2008-11-22T02:05:07-05:00</updated><link rel="alternate" href="http://sagrising.cockrumpublishing.com/" /><link rel="first" href="http://sagrising.cockrumpublishing.com/atom/1/page/1" type="application/atom+xml" title="First Page" /><link rel="next" href="http://sagrising.cockrumpublishing.com/atom/1/page/2" type="application/atom+xml" title="Next Page" /><link rel="last" href="http://sagrising.cockrumpublishing.com/atom/1/page/6" type="application/atom+xml" title="Last Page" /><generator uri="http://www.habariproject.org/" version="0.6-alpha">Habari</generator><id>tag:sagrising.cockrumpublishing.com,2008-11-22:atom/15d2a9598ef268015dcf8f24e3ae63000c75e890</id><xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" /><meta xmlns="http://pipes.yahoo.com" name="pipes" content="noprocess" /><link rel="self" href="http://feeds.feedburner.com/SagRising" type="application/atom+xml" /><entry><title>WordPress Free</title><link rel="alternate" href="http://feeds.feedburner.com/~r/SagRising/~3/444424390/wordpress-free" /><link rel="edit" href="http://sagrising.cockrumpublishing.com/wordpress-free/atom" /><author><name>Richard Cockrum</name></author><id>tag:sagrising.cockrumpublishing.com,2008:wordpress-free/1225980195</id><updated>2008-11-06T09:03:15-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-06T09:03:15-05:00</app:edited><category term="Blogging" /><category term="Habari" /><category term="Plugins" /><content type="html">&lt;p&gt;&lt;blockquote&gt;Free at last.&lt;br /&gt;Free at last.&lt;/blockquote cite="Martin Luthor King, Jr."&gt;&lt;/p&gt;&lt;p&gt;For quite a while most of the sites I manage have been using Habari. All but one, my main blog, &lt;a href="http://www.shardsofconsciousness.com"&gt;Shards of Consciousness&lt;/a&gt;, which has remained on WordPress. Shards, like this site, has been sadly neglected, in no small part due to having to use both WordPress and &lt;a href="http://www.habariproject.org"&gt;Habari&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;As of last night, that has changed and Shards has been migrated to use Habari, living on the same installation as most of my other sites. The one difference is that I've used MySQL for Shards' backend rather than SQLite, partly because Shards gets a lot more readers than my other sites, and partly to gain experience using it.&lt;/p&gt;&lt;p&gt;The issue that was holding me back from using Habari for Shards was the lack of podcasting support. As with most things, and thankfully so, podcasting isn't built into the core of Habari and creating a suitable plugin wasn't a high priority for most of us since most people &lt;strong&gt;don't&lt;/strong&gt; podcast. Habari being an open source project, in large part individuals work on what interests them, which is as it should be. &lt;a href="http://aymptomatic.net"&gt;Owen Winkler&lt;/a&gt;, with input from the community, had created the basic outline needed for podcasting, but an outline doesn't mean fully functional.&lt;/p&gt;&lt;p&gt;Finally, though, the Habari podcast plugin has reached a usable state. It has rough edges, particularly the player which lacks something visually and in terms of configurability, and stats, which are non-existent. On the other hand, creating a podcast is, as they say, &lt;em&gt;drop dead easy&lt;/em&gt;, with full support for iTunes. In particular, the plugin automatically calculates the podcast's size and time length, and is integrated in Habari's media silo, though you can also use audio files stored on other servers, such as &lt;a href="http://www.libsyn.com/index.php?&amp;mode=logout&amp;message="&gt;LibSyn&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Joy of joys, free at last!&lt;/em&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SagRising?a=qx4AN"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=qx4AN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=BAMtn"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=BAMtn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=XEPVn"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=XEPVn" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SagRising/~4/444424390" height="1" width="1"/&gt;</content><feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=SagRising&amp;itemurl=http%3A%2F%2Fsagrising.cockrumpublishing.com%2Fwordpress-free</feedburner:awareness><feedburner:origLink>http://sagrising.cockrumpublishing.com/wordpress-free</feedburner:origLink></entry><entry><title>Quick Quips I</title><link rel="alternate" href="http://feeds.feedburner.com/~r/SagRising/~3/435473439/quick-quips-i" /><link rel="edit" href="http://sagrising.cockrumpublishing.com/quick-quips-i/atom" /><author><name>Richard Cockrum</name></author><id>tag:sagrising.cockrumpublishing.com,2008:quick-quips-i/1225254302</id><updated>2008-10-29T00:25:02-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-29T00:25:02-04:00</app:edited><category term="Freedom" /><content type="html">&lt;blockquote&gt;If you're not having fun, you're doing it wrong.&lt;/blockquote&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SagRising?a=vLixM"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=vLixM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=5qgCm"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=5qgCm" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=4rXZm"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=4rXZm" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SagRising/~4/435473439" height="1" width="1"/&gt;</content><feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=SagRising&amp;itemurl=http%3A%2F%2Fsagrising.cockrumpublishing.com%2Fquick-quips-i</feedburner:awareness><feedburner:origLink>http://sagrising.cockrumpublishing.com/quick-quips-i</feedburner:origLink></entry><entry><title>A Necessary Evil</title><link rel="alternate" href="http://feeds.feedburner.com/~r/SagRising/~3/392887284/a-necessary-evil" /><link rel="edit" href="http://sagrising.cockrumpublishing.com/a-necessary-evil/atom" /><author><name>Richard Cockrum</name></author><id>tag:sagrising.cockrumpublishing.com,2008:a-necessary-evil/1221451796</id><updated>2008-09-15T00:09:57-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-15T00:09:57-04:00</app:edited><category term="Freedom" /><category term="politics" /><content type="html">&lt;p&gt;Government is a necessary evil. Mark that last word. While it may be necessary, it is never to be trusted or encouraged. No matter how a government begins, its goals end up being it's own survival and control over your behavior.&lt;/p&gt;&lt;p&gt;Remember that the next time someone says they want to hold political office.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SagRising?a=xaURL"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=xaURL" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=6h2Ql"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=6h2Ql" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=is41l"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=is41l" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SagRising/~4/392887284" height="1" width="1"/&gt;</content><feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=SagRising&amp;itemurl=http%3A%2F%2Fsagrising.cockrumpublishing.com%2Fa-necessary-evil</feedburner:awareness><feedburner:origLink>http://sagrising.cockrumpublishing.com/a-necessary-evil</feedburner:origLink></entry><entry><title>How to Have a Fresh, Hot Cup of Coffee</title><link rel="alternate" href="http://feeds.feedburner.com/~r/SagRising/~3/375338794/how-to-have-a-fresh-hot-cup-of-coffee-1" /><link rel="edit" href="http://sagrising.cockrumpublishing.com/how-to-have-a-fresh-hot-cup-of-coffee-1/atom" /><author><name>Richard Cockrum</name></author><id>tag:sagrising.cockrumpublishing.com,2008:how-to-have-a-fresh-hot-cup-of-coffee/1219765739</id><updated>2008-08-26T07:50:08-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-26T07:50:08-04:00</app:edited><category term="environment" /><content type="html">&lt;p&gt;I love my coffee. Plain, black coffee. No cream. No sugar. No cappuccino. Just fresh, plain, black coffee.&lt;/p&gt;&lt;p&gt;At home I use a &lt;a href="http://melitta.com/"&gt;Melitta&lt;/a&gt; brewer. I heat water in a tea kettle. Pour it into the Melitta, then pour the coffee into an insulated carafe so it tastes fresh and hot, but not burnt, every cup.&lt;/p&gt;&lt;p&gt;That doesn't help when I'm at work. I work in a different location every day, most of which don't have a coffee brewer, but all of which have a microwave oven, so I used to keep a coffee cup at each location, and carry instant coffee with me. If you drink coffee, you know that no matter how famous the brand is, it doesn't taste like fresh coffee. As my wife would say, &lt;em&gt;How do you drink that stuff&lt;/em&gt;?&lt;/p&gt;&lt;p&gt;Fortunately, my wife loves me. She got me a 16oz french press coffee brewer. If you've never seen a french press, it consists of a decanter of some kind that has a lid with a plunger. Attached to the end of the plunger is a fine meshed screen.&lt;/p&gt;&lt;p&gt;Making coffee in a french press is easy. Put enough coffee in the decanter for the amount of water you'll be adding. Add water that is near boiling, then put the lid on. Let the grounds steep for a few minutes, then slowly lower the plunger. The screen traps the grounds at the bottom of the decanter. After letting the coffee sit for a minute more to let things settle, pour yourself a hot, fresh brewed cup of coffee.&lt;/p&gt;&lt;p&gt;When I first started using the french press I tried the normal, pre-ground coffee we use at home. That was a mistake. It is too fine for the mesh screen, so I ended up with somewhat 'chewy' coffee. Since I'd rather drink my coffee than eat it, I bought some whole beans and ground them in a hand-cranked, burr type grinder that we have at home. The first cup I made with the hand-ground coffee was heavenly. I haven't looked back.&lt;/p&gt;&lt;p&gt;So now I get fresh, hot, black coffee wherever I am. No more instant. No more &lt;em&gt;How do you drink that&lt;/em&gt;? Just caffeine pleasure.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SagRising?a=qjz2zK"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=qjz2zK" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=i21Adk"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=i21Adk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=mZYTGk"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=mZYTGk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SagRising/~4/375338794" height="1" width="1"/&gt;</content><feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=SagRising&amp;itemurl=http%3A%2F%2Fsagrising.cockrumpublishing.com%2Fhow-to-have-a-fresh-hot-cup-of-coffee-1</feedburner:awareness><feedburner:origLink>http://sagrising.cockrumpublishing.com/how-to-have-a-fresh-hot-cup-of-coffee-1</feedburner:origLink></entry><entry><title>John Edwards' Infidelity</title><link rel="alternate" href="http://feeds.feedburner.com/~r/SagRising/~3/362379640/john-edwards-infidelity" /><link rel="edit" href="http://sagrising.cockrumpublishing.com/john-edwards-infidelity/atom" /><author><name>Richard Cockrum</name></author><id>tag:sagrising.cockrumpublishing.com,2008:john-edwards-infidelity/1218492311</id><updated>2008-08-26T05:19:07-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-26T05:19:07-04:00</app:edited><category term="politics" /><content type="html">&lt;p&gt;As I was driving home from work today I listened to the news on &lt;a href="http://www.npr.org"&gt;National Public Radio&lt;/a&gt; (NPR) as I usually do. They were reading comments they had received from listeners about a story regarding the public announcement that yes, Senator John Edwards had an extra-marital affair.&lt;/p&gt;&lt;p&gt;As &lt;a href="http://www.npr.org/templates/story/story.php?storyId=93510023"&gt;one listener wrote&lt;/a&gt;&lt;/p&gt;&lt;blockquote&gt;I am disappointed that you are making John Edwards' infidelity a major story.I would have thought that we were past the time when sexual conduct was still news.&lt;/blockquote&gt;&lt;p&gt;Sexual conduct in and of itself isn't news. Infidelity in a public figure is. These people are elected on the basis of promises they make to the voter. Infidelity to one's life partner is pretty much a guarantee that one will not keep troth with strangers.&lt;/p&gt;&lt;p&gt;So yes, unfaithfulness in a politician is news, especially when the unfaithfulness is denied when it is made a matter of public record. That shows the politician to be untruthful as well as unfaithful. All of us have made poor decisions at some point in our lives. That's part of learning and growing up. The decision isn't improved by lying about it. Compounding an error is a part of remaining a child.&lt;/p&gt;&lt;p&gt;Do you, as a voter, believed that you will be treated any better than a person's partner?&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SagRising?a=WfkuXK"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=WfkuXK" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=sqSc2k"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=sqSc2k" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=6ssMRk"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=6ssMRk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SagRising/~4/362379640" height="1" width="1"/&gt;</content><feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=SagRising&amp;itemurl=http%3A%2F%2Fsagrising.cockrumpublishing.com%2Fjohn-edwards-infidelity</feedburner:awareness><feedburner:origLink>http://sagrising.cockrumpublishing.com/john-edwards-infidelity</feedburner:origLink></entry><entry><title>Arctic Ice 0.3.2 Released</title><link rel="alternate" href="http://feeds.feedburner.com/~r/SagRising/~3/255538811/arctic-ice-updated" /><link rel="edit" href="http://sagrising.cockrumpublishing.com/arctic-ice-updated/atom" /><author><name>Richard Cockrum</name></author><id>tag:sagrising.cockrumpublishing.com,2008:arctic-ice-updated/1204113404</id><updated>2008-08-16T22:38:31-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-16T22:38:31-04:00</app:edited><category term="Themes" /><content type="html">&lt;p&gt;I just uploaded a new version of Arctic Ice, a simple theme for Habari.&lt;/p&gt;&lt;p&gt;&lt;img src="http://sagrising.cockrumpublishing.com/user/sites/sagrising.cockrumpublishing.com/files/images/arctic_ice_0.3.2.png" alt="Arctic Ice Screenshot" style="height: 300px; width: 400px; padding: 15px 0;" /&gt;&lt;/p&gt;&lt;p&gt;Arctic Ice is a minimalist white and blue two-column theme that features:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Recent posts in the sidebar&lt;/li&gt;&lt;li&gt;Recent comments in the sidebar&lt;/li&gt;&lt;li&gt;Tags in the sidebar.&lt;/li&gt;&lt;li&gt;Titles based on the title of the current page&lt;/li&gt;&lt;li&gt;Search engines are told whether to index the page or not in the header. Only the home page, individual pages, and single post pages are allowed to be indexed.&lt;/li&gt;&lt;li&gt;A built in site map that is automatically generated. Just create an empty page with the title "Sitemap", and you find it added to the menubar.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Current changes to Arctic Ice include:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Different markers on sublists in entries&lt;/li&gt;&lt;li&gt;Simplified comment form&lt;/li&gt;&lt;li&gt;Improved comment color scheme&lt;/li&gt;&lt;li&gt;Fixed: Submit buttons were changing colors in Firefox when they received focus&lt;/li&gt;&lt;li&gt;Fixed: Validation error on comment list&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="http://www.cockrumpublishing.com/files/arctic_ice-0.3.2.zip" title="Download Arctic Ice" onClick="javascript:urchinTracker ('/downloads/arctic_ice'); " &gt;Download Arctic Ice&lt;/a&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SagRising?a=MN09XtF"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=MN09XtF" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=rbyKjDf"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=rbyKjDf" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=6pUUAMf"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=6pUUAMf" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SagRising/~4/255538811" height="1" width="1"/&gt;</content><feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=SagRising&amp;itemurl=http%3A%2F%2Fsagrising.cockrumpublishing.com%2Farctic-ice-updated</feedburner:awareness><feedburner:origLink>http://sagrising.cockrumpublishing.com/arctic-ice-updated</feedburner:origLink></entry><entry><title>Using jQuery To Style Labels</title><link rel="alternate" href="http://feeds.feedburner.com/~r/SagRising/~3/359723634/using-jquery-to-style-labels" /><link rel="edit" href="http://sagrising.cockrumpublishing.com/using-jquery-to-style-labels/atom" /><author><name>Richard Cockrum</name></author><id>tag:sagrising.cockrumpublishing.com,2008:using-jquery-to-style-labels/1218222885</id><updated>2008-08-08T11:33:30-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-08T11:33:30-04:00</app:edited><category term="Javascript" /><category term="Plugins" /><content type="html">&lt;p&gt;One of the plugins for &lt;a href="http://www.habariproject.org/en/"&gt;Habari&lt;/a&gt; that I use on a regular basis is the markup plugin, which allows you to add Html tags to your content as your write through the use of a toolbar rather than having to add the markup by hand.&lt;/p&gt;&lt;p&gt;The markup plugin has always had one minor irritant, though. Habari's publish page is well labeled. The title area has a label. The content area has a label. The tags area has a label. For each of these, when the field doesn't have the focus the label is in the field. Move the focus to the field, or write something in the field, and the label moves above the field. It's a nice indicator of where the focus is, and where the content is.&lt;/p&gt;&lt;p&gt;Unfortunately, the markup plugin doesn't take this label into account. When you go to your blank publish page to write a post, the content label appears &lt;strong&gt;under&lt;/strong&gt; the toolbar - not an especially helpful place for it to be.&lt;/p&gt;&lt;p&gt;I'm not a javascript programmer. I barely know PHP. :)  But I wanted to fix this minor irritant, so I got to start learning. Habari uses &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; as it's javascript workhorse. One of the tasks for which it is used is moving the labels around on the publish page.&lt;/p&gt;&lt;p&gt;A unique thing about jQuery is that almost everything begins in it's $(document).ready() function. &lt;br /&gt; I dug through Habari's javascript code and found this snippet that controlled the movement of the labels:&lt;/p&gt;&lt;pre&gt;// Move labels into elements. Use with usability-driven care.&lt;br /&gt;$('label.incontent').each(function(){&lt;br /&gt;&lt;br /&gt;	var ctl = '#' + $(this).attr('for');&lt;br /&gt;	if($(ctl).val() == '') {&lt;br /&gt;		$(ctl).addClass('islabeled');&lt;br /&gt;		$(this).addClass('overcontent');&lt;br /&gt;	} else {&lt;br /&gt;		$(ctl).addClass('islabeled'); &lt;br /&gt;		$(this).addClass('abovecontent'); &lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	$(this).click(function() {&lt;br /&gt;		$(ctl).focus();&lt;br /&gt;	})&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;$('.islabeled').focus(function(){&lt;br /&gt;	$('label[for='+$(this).attr('id')+']')&lt;br /&gt;	 	 .removeClass('overcontent')&lt;br /&gt;	 	 .addClass('abovecontent').show(); &lt;br /&gt;}).blur(function(){&lt;br /&gt;	if ($(this).val() == '') {&lt;br /&gt;		$('label[for='+$(this).attr('id')+']')&lt;br /&gt;	 	 .addClass('overcontent')&lt;br /&gt;	 	 .removeClass('abovecontent'); &lt;br /&gt;	} else {&lt;br /&gt;		$('label[for='+$(this).attr('id')+']')&lt;br /&gt;	 	 .removeClass('overcontent')&lt;br /&gt;	 	 .addClass('abovecontent');&lt;br /&gt;	}&lt;br /&gt;});&lt;/pre&gt;&lt;p&gt;This code totally bewildered me, so I went off to jQuery's docs page, where I found two things that clarified it.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;$() creates a jQuery object. Almost &lt;em&gt;anything&lt;/em&gt; can become a jQuery object. A css class. An html item with an id. An html item with an attribute.A set of html items. These are called &lt;strong&gt;selectors&lt;/strong&gt; and jQuery has a series of functions to manipulate and choose between them.&lt;/li&gt;&lt;li&gt;A large number of jQuery's functions return a jQuery object, so you can chain together several functions.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;So what this code is doing is&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Looping through all the labels with a class of &lt;em&gt;incontent&lt;/em&gt;. For each one, find the text field it labels. Add the &lt;em&gt;islabeled&lt;/em&gt; class to the control. If the control contains text, add the &lt;em&gt;abovecontent&lt;/em&gt; class to the label. if not, add the &lt;em&gt;overcontent&lt;/em&gt; class to the label. Looking in the css file shows that the &lt;em&gt;overcontent&lt;/em&gt; class moves the label into the text field, while the &lt;em&gt;abovecontent&lt;/em&gt; class moves the label above. the text field.&lt;/li&gt;&lt;li&gt;When the focus changes on the page, toggle the label classes between &lt;em&gt;overcontent&lt;/em&gt; and &lt;em&gt;abovecontent&lt;/em&gt; as necessary, depending on whether the text field is receiving or losing the focus and whether it contains text.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Since it uses jQuery, the markup plugin already has a $(document).ready() function. My first thought was to use the jQuery css() function to change the margins in the content fields label, so it was actually in the content field and not under the toolbar.&lt;/p&gt;&lt;pre&gt;$('label[for=content].overcontent').css('margin-top', '30);&lt;br /&gt;$('label[for=content].overcontent').css( 'margin-left', '5px;');&lt;/pre&gt;&lt;p&gt;This failed miserably. The label appeared where it was supposed to when the text box was empty, but the css change also affected the label when it had the &lt;em&gt;abovecontent&lt;/em&gt; class and when text was in the content field, so the label rarely appeared where it belonged.&lt;/p&gt;&lt;p&gt;So I asked myself what my actual goal was. Answer: to move the label. Now, it is accepted practice  to use css to position elements on a web page. Normally, this css is in a separate style sheet. However, html elements can have a &lt;strong&gt;style&lt;/strong&gt; attribute, which will override whatever is in the page's style sheets. Using the style attribute tends to be frowned upon, but it is possible, syntactically correct, and jQuery has a function perfect for this purpose - the attr() function, which you can use to add any attribute to an element. What I ended up with was this:&lt;/p&gt;&lt;pre&gt;$('label[for=content].overcontent')&lt;br /&gt; 	 .attr('style', 'margin-top:30px;margin-left:5px;');&lt;br /&gt;$('#content').focus(function(){&lt;br /&gt;	$('label[for=content]').removeAttr('style'); &lt;br /&gt;}).blur(function(){&lt;br /&gt;	if ($('#content').val() == '') {&lt;br /&gt;		$('label[for=content]')&lt;br /&gt; 	 	 	 .attr('style', &lt;br /&gt;	 	 	     'margin-top:30px;margin-left:5px;'); &lt;br /&gt;	} else {&lt;br /&gt;		$('label[for=content]')&lt;br /&gt; 	 	 	 .removeAttr('style');&lt;br /&gt;	}&lt;br /&gt;});&lt;/pre&gt;&lt;p&gt;When the page loads, the content field's label has a style attribute added to it that moves the label into the proper area of the content field. Whenever the content field gets the focus, the style attribute is removed from the label, so it can move where it is supposed to go. When the content field loses the focus, if it doesn't contain text, the style attribute is added back to the label so it can move back down into the field. If it doesn't contain text, the style is removed from the label, in case it was on it.&lt;/p&gt;&lt;p&gt;This isn't a perfect piece of code. It still doesn't feel right using the style attribute. But it serves the purpose of removing a minor irritant from the use of the plugin. More important, it shows that even a tyro can learn to use jQuery for practical purposes.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SagRising?a=LUW8hK"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=LUW8hK" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=f7GZak"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=f7GZak" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=ora7ik"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=ora7ik" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SagRising/~4/359723634" height="1" width="1"/&gt;</content><feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=SagRising&amp;itemurl=http%3A%2F%2Fsagrising.cockrumpublishing.com%2Fusing-jquery-to-style-labels</feedburner:awareness><feedburner:origLink>http://sagrising.cockrumpublishing.com/using-jquery-to-style-labels</feedburner:origLink></entry><entry><title>The Humble var_dump</title><link rel="alternate" href="http://feeds.feedburner.com/~r/SagRising/~3/340712691/the-humble-var_dump-1" /><link rel="edit" href="http://sagrising.cockrumpublishing.com/the-humble-var_dump-1/atom" /><author><name>Richard Cockrum</name></author><id>tag:sagrising.cockrumpublishing.com,2008:the-humble-var_dump/1212488269</id><updated>2008-07-20T07:05:14-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-20T07:05:14-04:00</app:edited><category term="debugging" /><category term="Habari" /><category term="PHP" /><category term="Plugins" /><content type="html">&lt;p&gt;There are a several of plugins available for Habari to deal with spam. Most people seem to prefer the ones that use outside services such as Aksimet and Defensio. I don't like relying on outside services so I rely on the simple spamchecker plugin that comes with Habari and the simple blacklist checker. The concept behind the simple blacklist plugin is simple. Give it a list of terms or ip addresses to search for in a comment. If the comment contains any of these, discard it. Sad to say, it wasn't working, though. I looked through the code and could find nothing wrong, so submitted a bug report for it and let it go. The problem kept irking me, though, because every day I would have to manually moderate comments that contained text that I had in the blacklist, so I went back to debugging the plugin myself. I began by using var_dump(), the PHP function that will print any variable you give it. In particular, I used var_dump to see the contents of the blacklist. It was empty. Obviously, not good. You can't compare against something that doesn't exist. I looked at the code and found this: &lt;code&gt;$blacklist= explode( "\n", Options::get('SimpleBlacklist:blacklist') );&lt;/code&gt; I looked in the database options and found this: &lt;code&gt;simpleblacklist:blacklist&lt;/code&gt; Note the capitalization differences. Changing the Options::get() statement to use 'simpleblacklist' solved the problem. The simpleblacklist plugin began quietly discarding comments that contained blacklisted terms. My life has become much easier without having to rely on an outside service. All thanks to the humble var_dump().&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SagRising?a=JfJKGJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=JfJKGJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=pK2H9j"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=pK2H9j" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=DwJkOj"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=DwJkOj" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SagRising/~4/340712691" height="1" width="1"/&gt;</content><feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=SagRising&amp;itemurl=http%3A%2F%2Fsagrising.cockrumpublishing.com%2Fthe-humble-var_dump-1</feedburner:awareness><feedburner:origLink>http://sagrising.cockrumpublishing.com/the-humble-var_dump-1</feedburner:origLink></entry><entry><title>Users Prefer Vista</title><link rel="alternate" href="http://feeds.feedburner.com/~r/SagRising/~3/277149320/users-prefer-vista" /><link rel="edit" href="http://sagrising.cockrumpublishing.com/users-prefer-vista/atom" /><author><name>Richard Cockrum</name></author><id>tag:sagrising.cockrumpublishing.com,2008:users-prefer-vista/1209068127</id><updated>2008-07-13T07:41:25-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-13T07:41:25-04:00</app:edited><content type="html">&lt;p&gt;I use a lot of Microsoft tools. I've used Windows for years. I use Visual C++. I like the programs that you can get for Windows. &lt;/p&gt;&lt;p&gt;That doesn't mean I'm a fan of the company. For instance, I have a laptop with Windows XP. My wife has a desktop that came with Vista. &lt;/p&gt;&lt;p&gt;Vista sucks. It is slow to load. It's resource intensive. The new menu is non-intuitive. The new explorere interface is poor. The overzealous attempts at out of the box security make running programs irritating due to the little 'you have to run this as administrator' dialog that pops up whenever you want to do any system changes, even when you &lt;strong&gt;are&lt;/strong&gt; the administrator. (And yes, I know you can turn it off, but it is a pain.)&lt;/p&gt;&lt;p&gt;Today &lt;a href="http://hosted.ap.org/dynamic/stories/M/MICROSOFT_XP?SITE=WIRE&amp;amp;SECTION=HOME&amp;amp;TEMPLATE=DEFAULT"&gt;Wired&lt;/a&gt; is reporting that Microsoft may keep XP available after June 30, 2008, but Steve Ballmer insists that most people buy Vista, with the implication they prefer it.&lt;/p&gt;&lt;p&gt;Sorry, Steve. Most people buy Vista because you've driven it to the manufacturers and we don't have a choice. Put 10 computers on the shelf, half with XP and half with Vista, then see which one people prefer.&lt;/p&gt;&lt;p&gt;Vista with the Aero interface enabled &lt;strong&gt;is&lt;/strong&gt; prettier than XP, but I'd rather have a responsive, non-irritating system than a prettier face.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SagRising?a=r0VeQiG"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=r0VeQiG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=fO2ksig"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=fO2ksig" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=A2NY85g"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=A2NY85g" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SagRising/~4/277149320" height="1" width="1"/&gt;</content><feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=SagRising&amp;itemurl=http%3A%2F%2Fsagrising.cockrumpublishing.com%2Fusers-prefer-vista</feedburner:awareness><feedburner:origLink>http://sagrising.cockrumpublishing.com/users-prefer-vista</feedburner:origLink></entry><entry><title>Use PHP to Inject Code into Javascript</title><link rel="alternate" href="http://feeds.feedburner.com/~r/SagRising/~3/286069962/using-php-to-inject-code-into-javascript" /><link rel="edit" href="http://sagrising.cockrumpublishing.com/using-php-to-inject-code-into-javascript/atom" /><author><name>Richard Cockrum</name></author><id>tag:sagrising.cockrumpublishing.com,2008:using-php-to-inject-code-into-javascript/1210248160</id><updated>2008-07-13T07:33:27-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-13T07:33:27-04:00</app:edited><category term="debugging" /><category term="Habari" /><category term="Javascript" /><category term="PHP" /><content type="html">&lt;p&gt;Recently Habari updated it's administrative code to use a new interface. The new interface relies much more heavily on javascript than the old one did, which allows it to pull off some pretty snifty tricks. One of these is on the entries page, where a list of all the posts you have written is displayed. &lt;/p&gt;&lt;p&gt;At the top of the entries page is a timeline with a slider. You can move the slider back and forth to display the posts from the period of time covered by that section of the slider. You can also resize the slider to show more or fewer posts on the page.&lt;/p&gt;&lt;p style="text-align:center;"&gt;&lt;img src="/files/sagrising/admin_timeline.jpg" alt="Entries Timeline" title="Entries Timeline"&gt;&lt;/p&gt;&lt;p&gt;The code to manipulate the number of posts shown on the page as a result of manipulating the time line uses javascript ajax. Unfortunately, in the process of retrieving the posts, this javascript threw away other parameters that determined what type of posts were retrieved, parameters such as whether the posts were published or drafts, regular posts or static pages, the author, and so on.&lt;/p&gt;&lt;p&gt;I know nothing about javascript, but from the behavior of the page I knew the javascript was the problem and what it was doing. You see,when the page first loaded it showed the correct posts, but as soon as it was done loading it would revert to just published posts by all authors, the default behavior for the post retrieval function. The problem was how to get the proper parameters into the javascript.&lt;/p&gt;&lt;p&gt;After much scouring of the internet, my Aha! moment came when I saw this &lt;a href="http://www.webradiance.com/Web-Design-Forum/18/JavaScript/21/Passing-PHP-variables-into-Javascript/1938.html#entry15958"&gt;code at WebRadiance&lt;/a&gt;. That's when something I already knew hit home.&lt;/p&gt;&lt;p&gt;PHP is processed on the web server. The server takes your PHP code, processes it, then injects the result into your web page. Javascript, on the other hand, is processed by the browser. It takes the page sent to it by the server, then processes any javascript in the page. What this means is that if you use PHP to echo text to the page, all javascript sees is the result of the echo. It never sees any PHP. You can place a bit a PHP code in your javascript, echo the results to the page, then when javascript processes the page, all it sees is another piece of javascript code.&lt;/p&gt;&lt;p&gt;Here's what the original ajax looked like to get the posts called for by the entries page timeline:&lt;br&gt;&lt;code&gt;	$.ajax({&lt;br&gt;		type: "POST",&lt;br&gt;		url: "&amp;lt;?php echo URL::get('admin_ajax', array('context' =&gt; 'entries')); ?&amp;gt;",&lt;br&gt;		data: "offset=" + (parseInt(c) - parseInt(b)) + "&amp;amp;limit=" + (parseInt(b) - parseInt(a)),&lt;br&gt;		dataType: 'json',&lt;br&gt;		success: function(json){&lt;br&gt;			$('.entries').html(json.items);&lt;br&gt;			spinner.stop();&lt;br&gt;			itemManage.initItems();&lt;br&gt;			$('.modulecore .item:first-child, ul li:first-child').addClass('first-child').show();&lt;br&gt;			$('.modulecore .item:last-child, ul li:last-child').addClass('last-child');&lt;br&gt;		}&lt;br&gt;	});&lt;br&gt;};&lt;br&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;As you can see only two parameters are being sent to the function to get the posts - &lt;em&gt;offset&lt;/em&gt; and &lt;em&gt;limit&lt;/em&gt;. These tell Habari how many posts to return, and where to start in the list of posts.&lt;/p&gt;&lt;p&gt;Here's what it looked like after adding PHP to the code:&lt;br&gt;&lt;code&gt;	$.ajax({&lt;br&gt;		type: "POST",&lt;br&gt;		url: "&amp;lt;?php echo URL::get('admin_ajax', array('context' =&gt; 'entries')); ?&amp;gt;",&lt;br&gt;		data: "offset=" + (parseInt(c) - parseInt(b)) + "&amp;amp;limit=" + (parseInt(b) - parseInt(a)) + &lt;br&gt;			&amp;lt;?php &lt;br&gt;				$vars= Controller::get_handler_vars(); &lt;br&gt;				$out= ''; &lt;br&gt;				$keys= array_keys($vars); &lt;br&gt;				foreach($keys as $key) { &lt;br&gt;					$out .= "&amp;amp;$key=$vars[$key]"; &lt;br&gt;				} &lt;br&gt;				echo '"' . $out . '"'; &lt;br&gt;			?&amp;gt;,&lt;br&gt;		dataType: 'json',&lt;br&gt;		success: function(json){&lt;br&gt;			$('.entries').html(json.items);&lt;br&gt;			spinner.stop();&lt;br&gt;			itemManage.initItems();&lt;br&gt;			$('.modulecore .item:first-child, ul li:first-child').addClass('first-child').show();&lt;br&gt;			$('.modulecore .item:last-child, ul li:last-child').addClass('last-child');&lt;br&gt;		}&lt;br&gt;	});&lt;br&gt;};&lt;br&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;What the PHP is doing is gathering all the parameters that have been sent to the server, converting them into a string in the format &lt;code&gt;&amp;amp;var=value&lt;/code&gt; and concatenating the results in the loop. After the loop it echoes the result into the page so what javascript sees is&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;data = "offset=" + (parseInt(c) - parseInt(b)) + "&amp;amp;limit=" + (parseInt(b) - parseInt(a)) + "&amp;amp;var1=val1&amp;amp;var2=val2",&lt;/code&gt;&lt;/p&gt;&lt;p&gt;PHP understand what's going on with its code. Javascript understands what's going on with its code. All the correct parameters are being passed, and the correct posts are returned. I'm happy. :)&lt;/p&gt;&lt;p&gt;I hope this helps you out as much as it did me.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SagRising?a=niOSAH"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=niOSAH" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=zCswDh"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=zCswDh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=noqarh"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=noqarh" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SagRising/~4/286069962" height="1" width="1"/&gt;</content><feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=SagRising&amp;itemurl=http%3A%2F%2Fsagrising.cockrumpublishing.com%2Fusing-php-to-inject-code-into-javascript</feedburner:awareness><feedburner:origLink>http://sagrising.cockrumpublishing.com/using-php-to-inject-code-into-javascript</feedburner:origLink></entry><entry><title>Keep Your Database Purring</title><link rel="alternate" href="http://feeds.feedburner.com/~r/SagRising/~3/292652309/keep-your-database-purring" /><link rel="edit" href="http://sagrising.cockrumpublishing.com/keep-your-database-purring/atom" /><author><name>Richard Cockrum</name></author><id>tag:sagrising.cockrumpublishing.com,2008:keep-your-database-purring/1211085851</id><updated>2008-07-13T07:02:12-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-13T07:02:12-04:00</app:edited><category term="Habari" /><category term="Plugins" /><content type="html">&lt;p&gt;When we're blogging, one of the things we don't tend to think about is the state of our database. As with the oil in our car, as long as it works, we tend to ignore it.&lt;/p&gt;&lt;p&gt;But, as with the oil in our car, ignore it too long and we can run into trouble. Databases, like anything permanent on a computer, are basically files on a storage medium. Files, as they are used, become fragmented. As we add to them, take away from them, change them, they get shifted around. They grow. They shrink. Parts are stored here. Other parts are stored there. Some part move. &lt;/p&gt;&lt;p&gt;Day by day, things begin to slow down. In the worst case, fragments get lost. &lt;/p&gt;&lt;p&gt;Not a good thing.&lt;/p&gt;&lt;p&gt;Enter the Database Optimizer plugin for Habari, available in the &lt;a href="http://habariproject.org/dist/plugins" &gt;Habari plugins directory&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The database optimizer sets up your site so that once a week it is optimized. The database is rewritten so all file fragments are once again contiguous, free space is reclaimed, and depending on the database being used, indexes rewritten. Your site will be faster. Your database will take less room on your storage media. &lt;/p&gt;&lt;p&gt;So go ahead now. &lt;a href="http://habariproject.org/dist/plugins/database_optimizer.zip"&gt;Download the Database Optimizer plugin&lt;/a&gt;. Activate it. Rest easy knowing your blog is being properly maintained.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SagRising?a=LMwuWH"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=LMwuWH" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=sNWcth"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=sNWcth" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=y7XcSh"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=y7XcSh" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SagRising/~4/292652309" height="1" width="1"/&gt;</content><feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=SagRising&amp;itemurl=http%3A%2F%2Fsagrising.cockrumpublishing.com%2Fkeep-your-database-purring</feedburner:awareness><feedburner:origLink>http://sagrising.cockrumpublishing.com/keep-your-database-purring</feedburner:origLink></entry><entry><title>The GPL and the Ethics of Control</title><link rel="alternate" href="http://feeds.feedburner.com/~r/SagRising/~3/301472765/choosing-a-software-license" /><link rel="edit" href="http://sagrising.cockrumpublishing.com/choosing-a-software-license/atom" /><author><name>Richard Cockrum</name></author><id>tag:sagrising.cockrumpublishing.com,2008:choosing-a-software-license/1211322883</id><updated>2008-05-30T12:17:32-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-30T12:17:32-04:00</app:edited><category term="Freedom" /><category term="programming" /><content type="html">&lt;p&gt;Licensing of software is an important, fascinating, and very difficult to understand subject. Developers, some of the people who are affected the most by licensing issues, have the most difficult time understanding the different types of license that are available. I know I do.&lt;/p&gt;&lt;p&gt;The main issue isn't complicated. Do we want to control what other people do with our code or not? If not, put the code in the public domain and be done with it. People can do anything they want with the code because it belongs to everyone and no one. People can create any kind of software they want with it, both open source and  proprietary.&lt;/p&gt;&lt;p&gt;If we do want to control what people do with our code, we enter the morass that is called licensing. Be clear, though, that having reached this point we have decided we want to control the behaviour of other people, to enforce our wishes, desires, and beliefs on them. Intellectual property may be non-physical, but in our culture it is still considered to be personal property, and we have the right to do with our personal property as we will.&lt;/p&gt;&lt;p&gt;Possibly the most common open source license is the Free Software Foundation's Gnu Public License, or GPL. Proponents of the GPL emphasize the freedoms that it grants to users, most specifically&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The freedom to run the program, for any purpose (freedom 0).&lt;/li&gt;&lt;li&gt;The freedom to study how the program works, and adapt it to your needs (freedom 1). &lt;/li&gt;&lt;li&gt;The freedom to redistribute copies so you can help your neighbor (freedom 2).&lt;/li&gt;&lt;li&gt;The freedom to improve the program, and release your improvements to the public, so that the whole community benefits (freedom 3).&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The GPL is as controlling a license as a closed source for two main reasons:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;It &lt;strong&gt;requires&lt;/strong&gt; you to redistribute changes you make to the source code if you distribute binary versions of the software.&lt;/li&gt;&lt;li&gt;Your source code contribution to code licensed under the GPL, if you distribute it, must also be licensed under the GPL.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The reason for these two requirements, and mark that these are not permissions, not freedoms, but requirements, is to prevent the use of GPL licensed source code in proprietary programs.&lt;/p&gt;&lt;p&gt;In essence, the FSF foundation considers the use and distribution of proprietary software to be morally bad while the use and distribution of GPL licensed software to be morally good. &lt;/p&gt;&lt;p&gt;The FSF has also created for Lesser GNU Public License, or LGPL, that allows an open source library to be linked with proprietary software. The FSF, however, considers the LGPL to be a second rate license to be used only when the duties of the library are already adequately performed by libraries with other licenses, whether proprietary or open source. The FSF would much rather a library performing a truly original job be licensed under the GPL, so it's use would put software using it under the GPL, also.&lt;/p&gt;&lt;p&gt;I don't know about you, but I find this sort of license even worse than a proprietary license. Code is made proprietary for purely economic reasons. Not out of any sense that it is good or bad for the code to be proprietary, but just so the creator can make money.&lt;/p&gt;&lt;p&gt;The FSF, however, has tried to characterize itself as taking a moral stand, while at the same time exerting as much, if not more, control over what you can do with a piece of software code as those who write proprietary software. It has traded its moralistic high ground for a moralistic low ground by engaging in Orwellian doublespeak in which freedom means control and license means restriction.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SagRising?a=GrRK4H"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=GrRK4H" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=M3sqXh"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=M3sqXh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=4oxKMh"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=4oxKMh" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SagRising/~4/301472765" height="1" width="1"/&gt;</content><feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=SagRising&amp;itemurl=http%3A%2F%2Fsagrising.cockrumpublishing.com%2Fchoosing-a-software-license</feedburner:awareness><feedburner:origLink>http://sagrising.cockrumpublishing.com/choosing-a-software-license</feedburner:origLink></entry><entry><title>Coding, Community, and the Habari Cabal</title><link rel="alternate" href="http://feeds.feedburner.com/~r/SagRising/~3/298669728/coding-community-and-the-habari-cabal" /><link rel="edit" href="http://sagrising.cockrumpublishing.com/coding-community-and-the-habari-cabal/atom" /><author><name>Richard Cockrum</name></author><id>tag:sagrising.cockrumpublishing.com,2008:post/1211606862</id><updated>2008-05-26T14:18:29-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-26T14:18:29-04:00</app:edited><category term="Blogging" /><category term="Community" /><category term="Habari" /><content type="html">&lt;p&gt;I've been blogging for over two years now. Like most people, I started on a service, Blogger in my case. It didn't take me long to want more control than Blogger would give me, so I began looking around and found &lt;a href="http://wordpress.org"&gt;WordPress&lt;/a&gt;. For most of the time since then, WordPress has served me well. I built &lt;a href="http://www.shardsofconsciousness.com"&gt;Shards of Consciousness&lt;/a&gt; on it, ran my software site, &lt;a href="http://www.cockrumpublishing.com"&gt;Cockrum Publishing&lt;/a&gt; with it, and created a web presence for my wife's and my movie house, the &lt;a href="http://www.ambridgefamilytheatre.com"&gt;Ambridge Family Theatre&lt;/a&gt;, on the platform.&lt;/p&gt;&lt;p&gt;Then, the work of maintaining multiple installations of WordPress began to wear on me and I began wandering the web in search of alternatives that would be easier to maintain.&lt;/p&gt;&lt;p&gt;I found &lt;a href="http://www.habariproject.org"&gt;Habari&lt;/a&gt;. Four things about Habari caught my eye at first.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;It had multisite capability. I would be able to run all my websites off one installation. When the platform changed, I only had to upgrade it once. If I installed a new theme or plugin, it could be available to all my sites. If this doesn't sound like a big deal to you, you've never had to maintain more than one site.&lt;/li&gt;&lt;li&gt;It supported multiple database backends, including &lt;a href="http://www.sqlite.org"&gt;SQLite&lt;/a&gt;. I've used SQLite in desktop applications. It's a serverless, single file database. It supports most standard SQL, is easy to backup and maintain, and easily has all the capabilities needed by most websites. I like it a lot.&lt;/li&gt;&lt;li&gt;I could grasp at least part of the code. I like to program. I've written desktop applications in C++. I know C and the basics of COBOL. I've been wanting to learn PHP and web programming for some time, but didn't have the knowledge to start from scratch, and would get lost in the code for something like WordPress. Habari seemed like the perfect vehicle to begin learning to program for the web.&lt;/li&gt;&lt;li&gt;It actually had a help file distributed with the software and linked from within it's admin pages, so if I had a question, I could refer to it for answers. If you've used much web software, especially open source software, you know what a refreshing change from having to scour the web for answers that is.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;So I jumped in. I installed a web server and Habari on my computer and began playing with it. Being alpha software, it of course had bugs. In reading the code I found that I could actually see where some of the bugs were. To learn more about the software, I began reading the mailing lists. I learned how to use irc so I could read, and eventually participate in, #habari. To submit the bugfixes I came up with I learned to use &lt;a href="http://www.tortoisesvn.net"&gt;TortoiseSVN&lt;/a&gt;, a Windows interface for subversion, and &lt;a href="http://trac.edgewall.org/"&gt;trac&lt;/a&gt;, the bug tracking software the Habari team uses. I started learning how to use &lt;a href="http://xdebug.org"&gt;XDebug&lt;/a&gt;, a debugger for PHP.&lt;/p&gt;&lt;p&gt;In short, I've been getting a good education in web programming and using the tools needed by a team of developers working on an open source software project. Oh, and I've been able to switch three of my sites over to Habari. &lt;/p&gt;&lt;p&gt;The one thing about software, or any technology for that matter, is that it serves a larger purpose. It isn't important in and of itself. It is a tool to enable other goals. The goal of blogging software is communication. It allows us to connect with other people - sometimes in our own town, more often in another state or  country. We get to meet people we would never have been able to meet otherwise. Communities grow and develop.&lt;/p&gt;&lt;p&gt;Even more than the software, I've been impressed by the community aspect of Habari. With most software projects, the software is the focal point. The people matter insofar as they contribute to the software or use it, but as people, not so much. From it's beginning, the individuals behind Habari have put a strong emphasis on it's community. They help one another. They help strangers who come in. I've had some excellent mentors, even when they didn't know they were mentoring me, and met many new friends. There  is a constant emphasis on ensuring there is no line between coders and users, documentation writers and theme designers. Community is as important, if not more so, than the software.&lt;/p&gt;&lt;p&gt;Today I was honored to be invited to join Habari's Project Management Committee, affectionately known as the cabal, along with Chris Meller and Blake Johnson, with all the privileges (including the, to me, frightening privilege of commit access to Habari's code trunk) and responsibilities (including being a formal part of Habari's community), that entails. After the shock wore off, I gratefully accepted (even though I had just seen MellerTime metaphorically thrown down a flight of steps in irc :) ).&lt;/p&gt;&lt;p&gt;Members of the PMC, thank you. I hope I can contribute as much to the Habari community as I've received from it.&lt;/p&gt;&lt;p&gt;MellerTime, blakej, congratulations!&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SagRising?a=cU9mSH"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=cU9mSH" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=QaQJgh"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=QaQJgh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=ahm9Oh"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=ahm9Oh" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SagRising/~4/298669728" height="1" width="1"/&gt;</content><feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=SagRising&amp;itemurl=http%3A%2F%2Fsagrising.cockrumpublishing.com%2Fcoding-community-and-the-habari-cabal</feedburner:awareness><feedburner:origLink>http://sagrising.cockrumpublishing.com/coding-community-and-the-habari-cabal</feedburner:origLink></entry><entry><title>markUp - A New Habari Plugin</title><link rel="alternate" href="http://feeds.feedburner.com/~r/SagRising/~3/294684516/markup---a-new-habari-plugin" /><link rel="edit" href="http://sagrising.cockrumpublishing.com/markup---a-new-habari-plugin/atom" /><author><name>Richard Cockrum</name></author><id>tag:sagrising.cockrumpublishing.com,2008:markup---a-new-habari-plugin/1211329608</id><updated>2008-05-20T17:32:38-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-20T17:32:38-04:00</app:edited><category term="Blogging" /><category term="Habari" /><category term="Javascript" /><category term="Plugins" /><content type="html">&lt;p&gt;&lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; is a popular Javascript library that sees a lot of use in web programming. It simplifies many scripting tasks and is easily extensible with plugins. &lt;/p&gt;&lt;p&gt;One of the plugins I ran across recently is &lt;a href="http://markitup.jaysalvat.com/home/"&gt;markItUp!&lt;/a&gt;. markItUp! was created by &lt;a href="http://www.jaysalvat.com/"&gt;Jay Salvat&lt;/a&gt; as a "universal markup editor". Depending on the settings you open it with, markItUp! can be used to edit with Html, Textile, Wiki Syntax, Markdown, BBcode, or even your own text markup language.&lt;/p&gt;&lt;p&gt;This site uses &lt;a href="http://habariproject.org/en/"&gt;Habari&lt;/a&gt; as it's engine. Now Habari has several nice wysiwyg editor plugins, including &lt;a href="http://tinymce.moxiecode.com/"&gt;TinyMCE&lt;/a&gt;, &lt;a href="http://projects.bundleweb.com.ar/jWYSIWYG/"&gt;jWysiwyg&lt;/a&gt;, and &lt;a href="http://nicedit.com/"&gt;NicEdit&lt;/a&gt;. However, I'd rather be able to see what markup is being put in the source when I write, so I've been using Habari's built-in editor, which is just a text area you type in. Any tags, you have to enter yourself.&lt;/p&gt;&lt;p&gt;But I'm lazy. Or, if you want to put it politely, I will optimize my productivity when possible. While I don't want  want wysiwyg, I'm more than willing to let software do the work of putting in tags for me. When I found markItUp! it seemed the perfect candidate to become a markup plugin for Habari. Using the example of the jWysiwyg plugin, I was able to do so in fairly quick order.  After contacting the author and Elijah at &lt;a href="http://numberbox.net/"&gt;NumberBox&lt;/a&gt;, who had also worked on a markItUp! plugin for Habari, markUp is now in &lt;a href="http://trac.habariproject.org/habari-extras"&gt;Habari's -extras repository&lt;/a&gt; for the community of Habari users. &lt;/p&gt;&lt;p&gt;&lt;img alt="markUp Editor" src="http://sagrising.cockrumpublishing.com/user/sites/sagrising.cockrumpublishing.com/files/images/markUp.png"&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://habariproject.org/dist/plugins/markup.zip"&gt;Download markUp&lt;/a&gt;. Test drive it. Suggest improvements, or better yet, add them. :)&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SagRising?a=c2OaCH"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=c2OaCH" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=tgBh5h"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=tgBh5h" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=vSN4bh"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=vSN4bh" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SagRising/~4/294684516" height="1" width="1"/&gt;</content><feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=SagRising&amp;itemurl=http%3A%2F%2Fsagrising.cockrumpublishing.com%2Fmarkup---a-new-habari-plugin</feedburner:awareness><feedburner:origLink>http://sagrising.cockrumpublishing.com/markup---a-new-habari-plugin</feedburner:origLink></entry><entry><title>A Stretch Too Far</title><link rel="alternate" href="http://feeds.feedburner.com/~r/SagRising/~3/291873333/a-stretch-too-far" /><link rel="edit" href="http://sagrising.cockrumpublishing.com/a-stretch-too-far/atom" /><author><name>Richard Cockrum</name></author><id>tag:sagrising.cockrumpublishing.com,2008:a-stretch-too-far/1210969730</id><updated>2008-05-16T12:28:50-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-16T12:28:50-04:00</app:edited><category term="environment" /><category term="health" /><category term="research" /><content type="html">&lt;p&gt;A team from the London School of Hygiene and Tropical Medicine is reporting that &lt;a href="http://news.bbc.co.uk/2/hi/health/7404268.stm"&gt;people who are obese are one of the driving forces behind global warming&lt;/a&gt;.&lt;/p&gt;&lt;blockquote&gt;The team found that obese people require 1,680 daily calories to sustain normal energy and another 1,280 to maintain daily activities - a fifth more than normal.&lt;br /&gt;&lt;br /&gt;The higher consumption of food has a two-fold effect, researchers said.&lt;br /&gt;&lt;br /&gt;First of all the increasing demand for food, drives up production.&lt;br /&gt;&lt;br /&gt;This means that agricultural processes are using more oil to meet demand, which contributes to the rising cost of fuel.&lt;br /&gt;&lt;br /&gt;The cost of fuel is then passed on in the cost of food, making it more difficult for poorer areas to afford it.&lt;strong&gt;Prices&lt;/strong&gt;What is more, the researchers said obese people are likely to rely on transport more and put more strain on that transport because of their mass, which again drives up prices and usage. &lt;/blockquote&gt;&lt;p&gt;Ah! Such a welcome relief to know that obese people are a driving force behind the ills of the world. &lt;/p&gt;&lt;p&gt;I wonder if they forgot that obesity is more common among lower socio-economic groups, which means, following the same reasoning, that poor people are the cause of rising prices, food shortages, increasing transportation costs, and global warming.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SagRising?a=ZMFtaH"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=ZMFtaH" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=aqACHh"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=aqACHh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=uFSoWh"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=uFSoWh" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SagRising/~4/291873333" height="1" width="1"/&gt;</content><feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=SagRising&amp;itemurl=http%3A%2F%2Fsagrising.cockrumpublishing.com%2Fa-stretch-too-far</feedburner:awareness><feedburner:origLink>http://sagrising.cockrumpublishing.com/a-stretch-too-far</feedburner:origLink></entry><entry><title>Blissfully Ignorant Of Email Problems</title><link rel="alternate" href="http://feeds.feedburner.com/~r/SagRising/~3/289856858/blissfully-ignorant-of-email-problems" /><link rel="edit" href="http://sagrising.cockrumpublishing.com/blissfully-ignorant-of-email-problems/atom" /><author><name>Richard Cockrum</name></author><id>tag:sagrising.cockrumpublishing.com,2008:blissfully-ignorant-of-email-problems/1210731854</id><updated>2008-05-13T18:24:14-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-13T18:24:14-04:00</app:edited><category term="Communication" /><category term="Email" /><content type="html">&lt;p&gt;Has your email ever become eerily silent? As in empty. You're not getting any. That happened to me recently. I was getting messages in some accounts, so I just thought I wasn't getting any mail --- until my wife sent me a message and I didn't get it. I use Thunderbird for a client, so usually I just click the button to get all messages, assuming I was getting all messages. After I didn't get her's, I told Thunderbird to get the messages for just that account. Thunderbird asked me for my password.&lt;/p&gt;&lt;p&gt;What?! Yep. Somehow the passwords for half my accounts were lost. I re-entered all of them, downloaded the mail, and found myself inundated.&lt;/p&gt;&lt;p&gt;Maybe I was better off being blissfully ignorant.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SagRising?a=me2zDH"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=me2zDH" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=oCAcMh"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=oCAcMh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=c4bvkh"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=c4bvkh" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SagRising/~4/289856858" height="1" width="1"/&gt;</content><feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=SagRising&amp;itemurl=http%3A%2F%2Fsagrising.cockrumpublishing.com%2Fblissfully-ignorant-of-email-problems</feedburner:awareness><feedburner:origLink>http://sagrising.cockrumpublishing.com/blissfully-ignorant-of-email-problems</feedburner:origLink></entry><entry><title>The Positronic Brain Is On It's Way</title><link rel="alternate" href="http://feeds.feedburner.com/~r/SagRising/~3/283151906/the-positronic-brain-is-on-it-s-way" /><link rel="edit" href="http://sagrising.cockrumpublishing.com/the-positronic-brain-is-on-it-s-way/atom" /><author><name>Richard Cockrum</name></author><id>tag:sagrising.cockrumpublishing.com,2008:the-positronic-brain-is-on-it-s-way/1209649173</id><updated>2008-05-01T06:00:11-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-01T06:00:11-04:00</app:edited><category term="hardware" /><category term="memristor" /><category term="programming" /><content type="html">&lt;p&gt;If you've read any Isaac Asimov or seen the movie &lt;a href="http://www.imdb.com/title/tt0182789/"&gt;Bicentennial Man&lt;/a&gt;, you've heard the term positronic brain. The positronic brain was the factor that gave Asimov's robots their consciousness and decision-making abilities.&lt;/p&gt;&lt;p&gt;Recent developments in solid state circuitry may make the fictional concept a reality. &lt;a href="http://blog.wired.com/gadgets/2008/04/scientists-prov.html"&gt;Researchers at HP Labs&lt;/a&gt; have released the news that they have created a &lt;em&gt;memristor&lt;/em&gt;, a component whose charge is determined by the total amount of charge, both positive and negative, that has crossed over it. &lt;/p&gt;&lt;p&gt;One obvious application of the memristor is as memory for today's computers. A benefit is that computers would come on instantly in the same configuration in which you turned it off. You wouldn't need to set up your desktop the way you like it every time you turn it on. It's all just the way it was when you turned it off.&lt;/p&gt;&lt;p&gt;A more exciting application is in the realm of analog computers. For the past 50 years computers have been digital devices using switches that are either on or off. Boolean and Aristotelian logic has ruled the day. Memristors operate in shades of gray, though, just like the brain of a living organism. Logic is naturally fuzzy. Decision making based on total input. Programming more a matter of hardware construction and training than of writing decision making software. We will be able to &lt;strong&gt;grow&lt;/strong&gt; computers rather than programming them.&lt;/p&gt;&lt;p&gt;Androids, anyone?&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SagRising?a=fZz77H"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=fZz77H" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=Bp4nah"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=Bp4nah" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=cypLTh"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=cypLTh" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SagRising/~4/283151906" height="1" width="1"/&gt;</content><feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=SagRising&amp;itemurl=http%3A%2F%2Fsagrising.cockrumpublishing.com%2Fthe-positronic-brain-is-on-it-s-way</feedburner:awareness><feedburner:origLink>http://sagrising.cockrumpublishing.com/the-positronic-brain-is-on-it-s-way</feedburner:origLink></entry><entry><title>Meta SEO</title><link rel="alternate" href="http://feeds.feedburner.com/~r/SagRising/~3/280715800/meta-seo" /><link rel="edit" href="http://sagrising.cockrumpublishing.com/meta-seo/atom" /><author><name>Richard Cockrum</name></author><id>tag:sagrising.cockrumpublishing.com,2008:meta-seo/1209551533</id><updated>2008-04-30T03:01:39-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-30T03:01:39-04:00</app:edited><category term="Habari" /><category term="Plugins" /><category term="SEO" /><content type="html">&lt;p&gt;The three plugins I had written - MetaDescription, MetaTitle, and MetaKeywords - are no longer available from this site, nor are they supported.&lt;/p&gt;&lt;p&gt;I combined their functions into one plugin, Meta SEO, and contributed it to the Habari Community. You can download it from the &lt;a href="http://habariproject.org/dist/plugins/"&gt;Habari Plugins&lt;/a&gt; repository.&lt;/p&gt;&lt;p&gt;Before I contributed it I added the fourth leg of functionality that I see as a necessity for any SEO plugin that affects the html meta tags. This is the ability to add a robot tag to tell the search engines whether or not to index a page, and whether or not to follow the links on a page. By default, Meta SEO tells search engines to follow all links, but to index only the home page, and individual posts and static pages. This eliminates the possibility of duplicate content being an issue due to the indexing of the various types of archive pages that Habari makes available.&lt;/p&gt;&lt;p&gt;There are further features planned for the Meta SEO plugin. I would like to&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Add a configuration option to manually input the keywords for the home page.&lt;/li&gt;&lt;li&gt;Add a configuration option to allow the user to decide which page types to index and on which page types to follow the links.&lt;/li&gt;&lt;li&gt;Add a field to the publish page to manually enter a description for the entry.&lt;/li&gt;&lt;li&gt;Add a field to the publish page to manually enter the keywords for the entry.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I hope you find the plugin useful. Any bug reports and feature requests can be made on the &lt;a href="http://trac.habariproject.org/habari-extras"&gt;Habari Extras Trac page&lt;/a&gt;where either I or other interested members of the community will attend to them.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SagRising?a=lyh5ZG"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=lyh5ZG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=563W5g"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=563W5g" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=fS9sUg"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=fS9sUg" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SagRising/~4/280715800" height="1" width="1"/&gt;</content><feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=SagRising&amp;itemurl=http%3A%2F%2Fsagrising.cockrumpublishing.com%2Fmeta-seo</feedburner:awareness><feedburner:origLink>http://sagrising.cockrumpublishing.com/meta-seo</feedburner:origLink></entry><entry><title>An Amateur Programmer's PHP IDE</title><link rel="alternate" href="http://feeds.feedburner.com/~r/SagRising/~3/279573181/a-debugger-for-php" /><link rel="edit" href="http://sagrising.cockrumpublishing.com/a-debugger-for-php/atom" /><author><name>Richard Cockrum</name></author><id>tag:sagrising.cockrumpublishing.com,2008:a-debugger-for-php/1209221017</id><updated>2008-04-28T11:02:53-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-28T11:02:53-04:00</app:edited><category term="debugging" /><category term="PHP" /><category term="programming" /><content type="html">&lt;p&gt;One of the things I've missed most in learning PHP is a debugger. A debugger is a necessity for productive work in any programming language. You need a debugger to step through code to understand how it works and is being called. You need a debugger to examine variables. &lt;/p&gt;&lt;p&gt;But I'm basically a hobbyist, and at this point don't want to spend the money for a professional ide like &lt;a href="http://www.zend.com/en/"&gt;Zend Studio&lt;/a&gt; or &lt;a href="http://www.waterproof.fr/"&gt;PHPEdit&lt;/a&gt; which come with built-in debuggers. &lt;a href="http://www.eclipse.org/pdt/"&gt;PDT&lt;/a&gt;, Eclipse specialized for PHP programming, is a free option, but it is also a large piece of software that is overkill for my needs, especially since I work off a memory stick quite frequently and don't need another application that will take several hundred megabytes of space.&lt;/p&gt;&lt;p&gt;Fortunately, I've finally found a portable IDE that fits my needs, &lt;a href="http://notepad-plus.sourceforge.net/uk/site.htm"&gt;Notepad++&lt;/a&gt; and &lt;a href="http://xdebug.org/"&gt;XDebug&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;I've been using Notepad++ as my PHP editor. It has just about everything I want  - syntax highlighting, a good search function, basic brace checking, the ability to show white space marks, conversion between Unix style and Windows style line feeds, the ability to use different character encodings, macros, function folding, and the ability to specialize to a specific language. Still and all, it is an editor. As I worked I would wistfully remember my C++ IDE.&lt;/p&gt;&lt;p&gt;But, Notepad++ has a plugin interface. It can be extended to do all sorts of things. So I started wondering if there was a debugging extension for it.&lt;/p&gt;&lt;p&gt;After much scouring of the internet I found there is one, DBPg, a client interface for XDebug. XDebug is the opensource PHP debugger that, along with the Zend debugger, is one of the most popular debuggers for PHP. XDebug lets you set breakpoints and step through your code, set up watches on the variables you want to view, perform stack traces, and view PHP's handler vars like &lt;code&gt;$_POST, $_GET, $_COOKIE, $_SESSION&lt;/code&gt;. When I found it, and then when I found the plugin for Notepad++ that acts as an interface for it, I knew my debugging problems were over.&lt;/p&gt;&lt;p&gt;Setting up Notepad++ to work with XDebug is fairly easy.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;First&lt;/strong&gt;, install XDebug on your server. I placed it in my php extensions directory. Then I added the following lines to my php.ini file to get XDebug working:&lt;/p&gt;&lt;pre&gt;[debug]&lt;br /&gt;zend_extension_ts="/wos/php5/ext/php_xdebug-2.0.2.dll"&lt;br /&gt;xdebug.remote_enable=1 &lt;br /&gt;xdebug.remote_host=127.0.0.1&lt;br /&gt;xdebug.remote_port=9000&lt;br /&gt;xdebug.remote_handler=dbgp&lt;br /&gt;xdebug.remote_mode=req&lt;br /&gt;xdebug.idekey=default&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Note 1&lt;/strong&gt;: I use zend_extension_ts because I'm running a multithreaded version of PHP. If I were runnng a single threaded version of PHP, I would use zend_extension (without the &lt;em&gt;_ts&lt;/em&gt;).&lt;br&gt;&lt;strong&gt;Note 2&lt;/strong&gt;: &lt;em&gt;/wos/php5/ext/php_xdebug-2.0.2.dll&lt;/em&gt; is the path to where XDebug is on my filesystem.&lt;/p&gt;&lt;p&gt;Restart your server if need be to activate the debugger.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Second&lt;/strong&gt;, prepare Notepad++ for debugging. Place the DBGp plugin in Notepad++'s plugin directory, then open Notepad++. DBGp will be a new item in the Plugins menu. I configured DBGp by telling it refresh both the local and global contexts on every step, then mapped my local files to the server files. Since I'm running a local server for development, I ignored the remote server ip and the IDE KEY, then set both the remote path and the local path the same, in my case &lt;code&gt;f:\wos\www&lt;/code&gt;, since that is where I have Habari, the script I'm currently working with, located. &lt;/p&gt;&lt;p&gt;That's it. Notepad++ is set up. Notepad++ has several other plugins that make life easier. Visit it's homepage to browse through them.&lt;/p&gt;&lt;p&gt;To start debugging, open the file you want to work on in Notepad++, then click on &lt;code&gt;Debugger&lt;/code&gt; in the DBGp menu. The debugger will open at the bottom of your Notepad++ window. Open up your browser and navigate to the page you want to debug. In the address bar type &lt;code&gt;?XDEBUG_SESSION_START=test&lt;/code&gt; at the end of the url, then refresh the page. The Notepad++ icon will flash to let you know it is connected, and you can get to work.&lt;/p&gt;&lt;p&gt;If you're using Firefox as your browser, there is an extension you can get to make the task even easier - XDebug Helper. After it is installed, instead of typing the start message, simple click on the icon at the bottom of your browser window and your debug session will start.&lt;/p&gt;&lt;p&gt;The only issue I've had with this setup is that when XDebug is running and a page first loads, Apache will throw an exception. Windows (I'm running XP Service Pack 2) will ask if I want to submit an error report to Microsoft. On checking what is in the error report I see that the problem is with XDebug. I tell it not to send an error report, then get on with my work. Everything seems to work fine. I can debug PHP rather than wondering where my code is wrong. Productivity is up. My understanding improves. I can work purposefully rather than randomly.&lt;/p&gt;&lt;p&gt;Life is good.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SagRising?a=pY9b5G"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=pY9b5G" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=eiN3Lg"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=eiN3Lg" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=Judfkg"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=Judfkg" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SagRising/~4/279573181" height="1" width="1"/&gt;</content><feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=SagRising&amp;itemurl=http%3A%2F%2Fsagrising.cockrumpublishing.com%2Fa-debugger-for-php</feedburner:awareness><feedburner:origLink>http://sagrising.cockrumpublishing.com/a-debugger-for-php</feedburner:origLink></entry><entry><title>MetaTitle Plugin Updated</title><link rel="alternate" href="http://feeds.feedburner.com/~r/SagRising/~3/271812923/metatitle-plugin-updated" /><link rel="edit" href="http://sagrising.cockrumpublishing.com/metatitle-plugin-updated/atom" /><author><name>Richard Cockrum</name></author><id>tag:sagrising.cockrumpublishing.com,2008:metatitle-plugin-updated/1208389795</id><updated>2008-04-22T17:28:55-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-22T17:28:55-04:00</app:edited><category term="Blogging" /><category term="Habari" /><category term="Plugins" /><category term="SEO" /><content type="html">&lt;p&gt;I've already updated the MetaTitle plugin. Andy at &lt;a href="http://www.nbrightside.com/blog" title="Digging in a Habari sandpit" &gt;Digging in a Habari sandpit&lt;/a&gt; asked that it have the option of working even if the theme's template doesn't have an html title tag. I added this option to MetaTitle. The theme does still need to have an html head tag, though. To be honest, if it doesn't you really need to add it or use a different theme because the theme you're using is screwed up.&lt;/p&gt;&lt;p&gt;While I was at it, I added the ability to give posts and static pages a different html title than the post's or page's actual title. This was implemented by adding controls to the publish page for entries and pages. It can come in handy to create an html title that is better optimized for SEO purposes, or to give a more descriptive title to static pages that have a short title to allow them to fit in menus properly.&lt;/p&gt;&lt;p&gt;You can download the updated plugin from the &lt;a href="http://sagrising.cockrumpublishing.com/plugins" title="Plugins at Sag Rising" &gt;Plugins&lt;/a&gt; page.&lt;/p&gt;&lt;p&gt;As always, enjoy! If you have any questions, problems, or feature requests, let me know.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SagRising?a=Vy66vyG"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=Vy66vyG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=JCcSuDg"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=JCcSuDg" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SagRising?a=BVFPZ4g"&gt;&lt;img src="http://feeds.feedburner.com/~f/SagRising?i=BVFPZ4g" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SagRising/~4/271812923" height="1" width="1"/&gt;</content><feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=SagRising&amp;itemurl=http%3A%2F%2Fsagrising.cockrumpublishing.com%2Fmetatitle-plugin-updated</feedburner:awareness><feedburner:origLink>http://sagrising.cockrumpublishing.com/metatitle-plugin-updated</feedburner:origLink></entry><feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetFeedData?uri=SagRising</feedburner:awareness></feed>
