<?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>Chomper Stomping &#187; tutorial</title>
	<atom:link href="http://blog.chomperstomp.com/category/tutorial/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.chomperstomp.com</link>
	<description>jQuery/JavaScript/CSS 3/HTML 5, Java/PHP/Python/ActionScript, Git, Chrome/Firefox Extensions, Wordpress/Game/iPhone App Development and other random techie tidbits I&#039;ve collected</description>
	<lastBuildDate>Wed, 04 Jan 2012 16:25:52 +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>WordPress Settings API &#8211; Adding Options to Existing Page</title>
		<link>http://blog.chomperstomp.com/wordpress-settings-api-adding-options-to-existing-page/</link>
		<comments>http://blog.chomperstomp.com/wordpress-settings-api-adding-options-to-existing-page/#comments</comments>
		<pubDate>Wed, 23 Nov 2011 05:48:32 +0000</pubDate>
		<dc:creator>Christopher McCulloh</dc:creator>
				<category><![CDATA[programming concepts]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[How to]]></category>
		<category><![CDATA[options]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[settings]]></category>
		<category><![CDATA[spotlight]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.chomperstomp.com/?p=956</guid>
		<description><![CDATA[Adding new options to an existing page in the dashboard in wordpress can be maddening. I&#8217;ve literally spent 15+ hours dealing with this horrible API at this point. To the point where I wrote two different wrappers for it. Here are some notes chiseled along the way for any poor soul following me down this [...]]]></description>
			<content:encoded><![CDATA[<p>Adding new options to an existing page in the dashboard in wordpress can be maddening. I&#8217;ve literally spent 15+ hours dealing with this horrible API at this point. To the point where I wrote two different wrappers for it.</p>
<p>Here are some notes chiseled along the way for any poor soul following me down this obtuse path.</p>
<p>Today I&#8217;ll focus on adding options to an existing page. Hopefully soon I&#8217;ll do one on making a new page.</p>
<p>Checklist/Overview:<br />
1. Hook into the admin init action (<a href="http://codex.wordpress.org/Function_Reference/add_action">add_action(&#8216;admin_init&#8217;)</a>)<br />
2. Create your section (<a href="http://codex.wordpress.org/Function_Reference/add_settings_section">add_settings_section</a>)<br />
3. Output hidden fields so settings will save (<a href="http://codex.wordpress.org/Function_Reference/settings_fields">settings_fields</a>)<br />
4. Create your fields (<a href="http://codex.wordpress.org/Function_Reference/add_settings_field">add_settings_field</a> and <a href="http://codex.wordpress.org/Function_Reference/register_setting">register_setting</a>)</p>
<p>Your options will be available through the usual &#8220;<a href="http://codex.wordpress.org/Function_Reference/get_option">get_option</a>&#8221; means&#8230;</p>
<p>Step 1) Hook into the admin init action:</p>
<p><script src="https://gist.github.com/1387972.js?file=gistfile1.aw"></script></p>
<p>Step 2) Create your init function (that you just hooked into the admin_init action):</p>
<p><script src="https://gist.github.com/1387974.js?file=gistfile1.aw"></script></p>
<p>Step 3) Create your own section register API</p>
<p><script src="https://gist.github.com/1387976.js?file=gistfile1.aw"></script></p>
<p>Step 4) Create your section callback functions</p>
<p>It is really annoying that the API doesn&#8217;t allow you to pass params to this callback function, which means you have to define each one individually&#8230;</p>
<p><script src="https://gist.github.com/1387980.js?file=gistfile1.aw"></script></p>
<p>Step 5) Create your own field register API</p>
<p><script src="https://gist.github.com/1387981.js?file=gistfile1.aw"></script></p>
<p>Step 6) Create your global callback function</p>
<p><script src="https://gist.github.com/1387983.js?file=gistfile1.aw"></script></p>
<p>Step 7) Register your section(s)</p>
<p>This goes in that init function  you made in step 2</p>
<p><script src="https://gist.github.com/1387988.js?file=gistfile1.aw"></script></p>
<p>Step <img src='http://blog.chomperstomp.com/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> Register your field(s)</p>
<p>This goes in that init function  you made in step 2</p>
<p><script src="https://gist.github.com/1387990.js?file=gistfile1.aw"></script></p>
<p>Here&#8217;s an example of a completed version of all this. This one adds a crap ton of custom thumbnail size options to the media panel. It is a really bad example as it is overly complex:</p>
<p><script src="https://gist.github.com/1387968.js?file=full_example.php"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chomperstomp.com/wordpress-settings-api-adding-options-to-existing-page/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using two different identity files with ssh for rsa remote authentication keys</title>
		<link>http://blog.chomperstomp.com/using-two-different-identity-files-with-ssh-for-rsa-remote-authentication-keys/</link>
		<comments>http://blog.chomperstomp.com/using-two-different-identity-files-with-ssh-for-rsa-remote-authentication-keys/#comments</comments>
		<pubDate>Wed, 25 May 2011 20:06:24 +0000</pubDate>
		<dc:creator>Christopher McCulloh</dc:creator>
				<category><![CDATA[programming concepts]]></category>
		<category><![CDATA[project management]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[Computer]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[How to]]></category>
		<category><![CDATA[remote key authentication]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[spotlight]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.chomperstomp.com/?p=735</guid>
		<description><![CDATA[I have two different servers I need to connect to, each requiring two different types of remote authentication keys. One requires rsa, the other dss. So I had to make and use two different remote authentication keys, but was unsure as to how to tell my machine to serve them both up. It was, by [...]]]></description>
			<content:encoded><![CDATA[<p>I have two different servers I need to connect to, each requiring two different types of remote authentication keys. One requires rsa, the other dss. So I had to make and use two different remote authentication keys, but was unsure as to how to tell my machine to serve them both up. It was, by default, just serving up the rsa key.</p>
<p>What I had to do was create a file called &#8220;config&#8221; (NO file extension) in the ~/.ssh directory on my machine. I then put two lines in this file:</p>
<p><code>IdentityFile ~/.ssh/id_rsa<br />
IdentityFile ~/.ssh/id_dss</code></p>
<p>It works like a charm.</p>
<p>For the curious, I&#8217;m on windows using the git bash that comes built in with git (NOT cygwin). My ~/.ssh directory looks like this:<br />
<img alt="" src="http://content.screencast.com/users/cmccullo/folders/Jing/media/42435e78-1696-4fc7-b11c-627189311a52/2011-05-25_1559.png" title="~/.ssh" class="alignnone" width="145" height="158" /></p>
<p>I generated these RSA keys with a command similar to this:</p>
<p><code>ssh-keygen -t dss -f ~/.ssh/id_dss</code></p>
<p>And copied and pasted the contents of the id_rsa.pub (and id_dss.pub) files into the appropriate place (something like ~/.ssh/authorized_keys) on the remote servers.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chomperstomp.com/using-two-different-identity-files-with-ssh-for-rsa-remote-authentication-keys/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Making Git show post-receive e-mails as an HTML color formatted diff</title>
		<link>http://blog.chomperstomp.com/making-git-show-post-receive-e-mails-as-an-html-color-formatted-diff/</link>
		<comments>http://blog.chomperstomp.com/making-git-show-post-receive-e-mails-as-an-html-color-formatted-diff/#comments</comments>
		<pubDate>Thu, 18 Nov 2010 19:52:43 +0000</pubDate>
		<dc:creator>Christopher McCulloh</dc:creator>
				<category><![CDATA[project management]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[breaking]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[e-mails]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[hooks]]></category>
		<category><![CDATA[How to]]></category>
		<category><![CDATA[post-receive]]></category>
		<category><![CDATA[post-receive-email]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[spotlight]]></category>

		<guid isPermaLink="false">http://blog.chomperstomp.com/?p=630</guid>
		<description><![CDATA[I wanted git to send me an e-mail with a color formatted HTML diff view of pushes/commits whenever the remote server received a push. After some digging I found that I could accomplish this using the post-receive email hooks in combination with Pygment&#8217;s command line tools (using Python). Prerequisites: Git Python 2.4+ Pygments I will [...]]]></description>
			<content:encoded><![CDATA[<p><iframe src="http://rcm.amazon.com/e/cm?lt1=_blank&#038;bc1=000000&#038;IS2=1&#038;bg1=FFFFFF&#038;fc1=000000&#038;lc1=0000FF&#038;t=chompstomp-20&#038;o=1&#038;p=8&#038;l=as1&#038;m=amazon&#038;f=ifr&#038;md=10FE9736YVPPT7A0FBG2&#038;asins=0596520123" style="width:120px;height:240px;padding:5px;margin:10px;float:right;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe><br />
I wanted git to send me an e-mail with a color formatted HTML diff view of pushes/commits whenever the remote server received a push. After some digging I found that I could accomplish this using the post-receive email hooks in combination with Pygment&#8217;s command line tools (using Python).</p>
<h2>Prerequisites:</h2>
<ul>
<li><a href="http://git-scm.com/download">Git</a></li>
<li><a href="http://wiki.python.org/moin/BeginnersGuide">Python 2.4+</a></li>
<li><a href="http://pygments.org/docs/installation/">Pygments</a></li>
</ul>
<p>I will assume for this post that you have Git, Python and Pygments installed. It&#8217;s been months since I installed Pygments, and I honestly can&#8217;t remember *anything* about installing it, which means it was probably pretty straightforward and easy. You probably can just do this from your shell:</p>
<p><code>sudo easy_install Pygments</code> </p>
<h2>Making your Git repo send colored diff e-mails:</h2>
<h3>1. Setting up the post-receive hook</h3>
<h4>a. post-receive</h4>
<p>The first thing you will need to do is configure your post-receive hook:</p>
<p><code>/git/your-repo.git/hooks/post-receive</code></p>
<p>In the hooks directory (cd /git/your-repo.git/hooks/) there will probably already be a &#8220;post-receive.example&#8221; file. Just copy it and rename it post-receive.</p>
<p>This file is basically a shell script. It is run after your repo gets a push and is updated. It is passed in 3 arguments: old revision hash, new revision hash, refname</p>
<p>All you really need to put in this file is the following line:</p>
<p><code>. ~/git-core/contrib/hooks/post-receive-email</code></p>
<p>What this does is calls another shell script &#8220;post-receive-email&#8221; and passes along the arguments (I think).</p>
<p>I&#8217;m pretty sure you could specify other shell scripts in the same way at this point if you wanted to.</p>
<h4>b. post-receive-email</h4>
<p>Now make the file you referenced from the post-receive file:</p>
<p>Move to your global hooks directory (the other one you were just in was specific to just that one repository, this one is the global hooks dir):</p>
<p><code>cd ~/git-core/contrib/hooks/</code></p>
<p>Create a file called post-receive-email. This is a shell script, but DON&#8217;T put &#8220;.sh&#8221; on the end.</p>
<p>Now, place the following code in that file (or, better yet, <a href="http://blog.chomperstomp.com/gitStuff/post-receive-email">here&#8217;s the file</a>):</p>
<p><script src="https://gist.github.com/705493.js"> </script></p>
<p>I&#8217;ll try and point out some of the relevant portions of this script:</p>
<p><strong>generate_email_header() (line 198):<br />
</strong></p>
<p>This is the header of the e-mail, including the subject as well as the first few lines of the e-mail.</p>
<p>You may notice some variables here. ${emailprefix}, $projectdesc, etc. I&#8217;ll talk a little about these later on.</p>
<p>Basically, what you need to know here is that if you want to change the e-mail subject or the beginning content of the e-mail, you do that here. You *could* hard code the recipients here, but don&#8217;t. We&#8217;ll talk more about recipients later.</p>
<p><strong>generate_email_footer() (line 219):</strong></p>
<p>This is the footer of the e-mail.</p>
<p>Notice that I placed a line here that tells you which files are causing these e-mails to be sent. I highly recommend keeping this line so that whenever you want to change anything about the e-mail, the e-mail itself tells you everything you need to know about doing so.</p>
<p><strong>show_new_revisions() (line 605):</strong></p>
<p>This is triggered if someone pushes up new revisions that have not ever been pushed up before. This way each code change will only be shown in one e-mail ever. This is the part that generates the actual diff itself and this is probably the single more important part oft his blog post. Lines 635 through 638:</p>
<p><code>git show -C --pretty=format:"committer: %cn%ncomments: %N%n%s%n%b" $onerev > gitlog.txt<br />
export PYTHONPATH='/usr/local/lib/python2.4/site-packages'<br />
pygmentize -O noclasses=True -f html -l diff gitlog.txt<br />
pygmentize -O noclasses=True -f html -l diff -o gitlogemail.html gitlog.txt</code></p>
<p>Let&#8217;s break it down line by line:</p>
<p>1. This is the actual git diff. If you just plop this down in your command line right now (minus the > gitlog.txt part) and replace $onerev with a sha1 hash from your log, you&#8217;ll see a &#8220;preview&#8221; of how your e-mail will theoretically look. Here&#8217;s some code for you to try to see what I&#8217;m talking about, do the following in your shell:</p>
<p><code>git log</code></p>
<p>Copy one of the sha1 hashes shown the log, then&#8230;</p>
<p><code>git show -C --pretty=format:"committer: %cn%ncomments: %N%n%s%n%b"
<put your sha1 here></code></p>
<p>(so, for example, and don&#8217;t try using this exact line because you won&#8217;t have my sha1 hash in your repo so it won&#8217;t work):</p>
<p><code>git show -C --pretty=format:"committer: %cn%ncomments: %N%n%s%n%b" 583038808efbde6fef4eb2e92dd2a920ba714eed</code></p>
<p>(hit &#8220;q&#8221; to get out of the diff view this throws you into)</p>
<p>If you don&#8217;t like anything about this diff view, you can change it by editing the format:&#8221;&#8230;.&#8221; part. See <a href="http://www.kernel.org/pub/software/scm/git/docs/git-show.html">the git-show page in the git manual</a> for details.</p>
<p><strong>LOGBEGIN (line 656):</strong></p>
<p>This is a constant (it&#8217;s counterpart is LOGEND on the next line). The contents here will be used in the script in various places. It&#8217;s content is placed before the diff to help separate the diff from the rest of the e-mail.</p>
<p><strong>recipients (line 676):</strong></p>
<p>You *could* hard-code e-mail recipients here, but DON&#8217;T, we&#8217;ll once again talk about this in just a few moments&#8230;</p>
<p><strong>emailprefix (line679):</strong></p>
<p><code>emailprefix=$(git config hooks.emailprefix || echo '[SCM] ')</code></p>
<p>This specifies the text you want showing up right before the subject of the e-mail. It pulls in a setting from your gitconfig (again, we&#8217;ll talk about this in a moment) but it also specifies a default in case you don&#8217;t have one set. I make all my e-mails subject lines prepend with [GIT] so I know it&#8217;s an automated git e-mail at a glance.</p>
<p><strong>custom_showrev (line 680):</strong></p>
<p>This line currently doesn&#8217;t do what it looks like it does. At first line it appears that you can set your diff settings here, but this is actually unused at the moment. I was trying to make it so you could set your git-show settings in the git config, but I was having trouble getting it to work and gave up because I had bigger better fish to fry&#8230; So, don&#8217;t be fooled into thinking you can change this line and have your e-mails be effected.</p>
<h3>2. Setting your git config options</h3>
<p>In the post-receive-email file, there were several variables that I kept saying I would talk about later. Now&#8217;s the time!</p>
<p>We are going to set the variables in your <a href="http://www.kernel.org/pub/software/scm/git/docs/git-config.html">git-config</a>. I&#8217;m not 100% sure, but I suspect that this will allow you to have different settings per repository.</p>
<p>The way you do this is:</p>
<p>Move to your repository&#8217;s home directory:</p>
<p><code>cd /git/your-repo.git/hooks/</code></p>
<p>At this point, you can dive right in and make new config settings, or you can list current settings. List current settings like this:</p>
<p><code>git config --list</code></p>
<p>To add new config settings:</p>
<p><code>git config --add blah.blah true</code></p>
<p>or</p>
<p><code>git config --add blah.blah "that is soo true dude"</code></p>
<p>or, better yet, just pop open the .git/config file in a text editor (<code>git config -e</code>) and add lines like this:</p>
<p><code><br />
[blah]<br />
	blah = that is soo true dude<br />
</code></p>
<h4>hooks.mailinglist</h4>
<p>Whatever you put here will go in the &#8220;To:&#8221; field. (This is who the e-mail will be sent to).</p>
<p><code>git config --add hooks.mailinglist "ralphie@gmail.com, frank@gmail.com, steve@gmail.com"</code></p>
<p><em>Don&#8217;t be fooled by the similarly named &#8220;hooks.announcelist&#8221; which, as far as I can tell, does nothing (theres a few lines of code that may use this if it isn&#8217;t empty, but I haven&#8217;t looked into this very far. Don&#8217;t set it and it won&#8217;t negatively effect anything. If you do set it, you may get unexpected results).</em></p>
<h4>hooks.emailprefix</h4>
<p>This is the text that will be inserted before the subject line. I like to set mine to [GIT] so I know it&#8217;s an auto generated git e-mail by just glancing at the subject. If you don&#8217;t set it, it defaults to [SCM].</p>
<p><code>git config --add hooks.emailprefix=[GIT]</code></p>
<h3>Testing</h3>
<p>Ok, at this point, you should be all good to go. Make a code changes, commit, push to your remote and sit back and wait on the e-mail.</p>
<p>Problems? I probably won&#8217;t be able to help, but I&#8217;ll try. Better to try asking on <a href="http://stackoverflow.com/questions/3232270/git-post-receive-email-hook-to-show-an-html-formatted-color-diff/3261903#3261903">StackOverflow.com</a>.</p>
<p>Good luck!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chomperstomp.com/making-git-show-post-receive-e-mails-as-an-html-color-formatted-diff/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Git it now?</title>
		<link>http://blog.chomperstomp.com/git-it-now/</link>
		<comments>http://blog.chomperstomp.com/git-it-now/#comments</comments>
		<pubDate>Tue, 19 Oct 2010 15:06:17 +0000</pubDate>
		<dc:creator>Christopher McCulloh</dc:creator>
				<category><![CDATA[programming concepts]]></category>
		<category><![CDATA[project management]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[breaking]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[spotlight]]></category>

		<guid isPermaLink="false">http://blog.chomperstomp.com/?p=613</guid>
		<description><![CDATA[Git is amazing. The problem is, it&#8217;s hard for a lot of people to get git. Specifically the remotes part. If you are used to CVS or SVN (Subversion) you&#8217;re probably used to the idea that when you &#8220;commit&#8221; something it just flies out to the server and sits there available to anyone else with [...]]]></description>
			<content:encoded><![CDATA[<p><iframe src="http://rcm.amazon.com/e/cm?lt1=_blank&#038;bc1=000000&#038;IS2=1&#038;bg1=FFFFFF&#038;fc1=000000&#038;lc1=0000FF&#038;t=chompstomp-20&#038;o=1&#038;p=8&#038;l=as1&#038;m=amazon&#038;f=ifr&#038;md=10FE9736YVPPT7A0FBG2&#038;asins=0596520123" style="width:120px;height:240px;padding:5px;margin:10px;float:right;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe><br />
Git is amazing. The problem is, it&#8217;s hard for a lot of people to get git. Specifically the remotes part. If you are used to CVS or SVN (Subversion) you&#8217;re probably used to the idea that when you &#8220;commit&#8221; something it just flies out to the server and sits there available to anyone else with access to that server. Git doesn&#8217;t do this.</p>
<p>Git is a distributed version control system, which means you have the entire project and the entire history of the entire project (or at least the branch you are on) sitting on your machine when you checkout the project(branch) from the server. So, when you &#8220;commit&#8221; something, you&#8217;re really just creating a new version (kind of like timestamping a state of code and saving it) on YOUR machine. The remote server knows nothing about it. A lot of people new to git mistakenly think that &#8220;add&#8221; sort of saves a version of something on your machine and then commit sends it out to the server. Not so.</p>
<p>To help, I&#8217;ve created this image:<br />
<a href="http://blog.chomperstomp.com/wp-content/uploads/2010/10/gitCommitManagement1.png"><img src="http://blog.chomperstomp.com/wp-content/uploads/2010/10/gitCommitManagement1.png" alt="" title="gitCommitManagement" width="800" height="332" class="alignnone size-full wp-image-616" /></a></p>
<p>add: This takes the &#8220;work&#8221; off of your &#8220;work bench&#8221; and puts it on the &#8220;loading dock&#8221; (index).<br />
commit: This takes everything on the &#8220;loading dock&#8221; (index) and puts it in a &#8220;crate&#8221; (commit) and places it on the &#8220;truck&#8221; (history).<br />
push: This tells the &#8220;truck&#8221; (history) to drive itself to the &#8220;warehouse/hub&#8221; (remote) [and drop off copies of everything and come back] .</p>
<p>stash: This takes everything on your &#8220;work bench&#8221; and places it in a &#8220;box&#8221; (stash) on the side.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chomperstomp.com/git-it-now/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ssh-askpass in Aptana with git project on OS X</title>
		<link>http://blog.chomperstomp.com/ssh-askpass-in-aptana-with-git-project-on-os-x/</link>
		<comments>http://blog.chomperstomp.com/ssh-askpass-in-aptana-with-git-project-on-os-x/#comments</comments>
		<pubDate>Sun, 17 Oct 2010 18:00:24 +0000</pubDate>
		<dc:creator>Christopher McCulloh</dc:creator>
				<category><![CDATA[project management]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://blog.chomperstomp.com/?p=609</guid>
		<description><![CDATA[I recently downloaded Aptana on OS X Snow Leopard because I know of no other free good IDE. I had a project set up under Git that I was trying to work with and I discovered that if I went to &#8220;import&#8221; I could select &#8220;Git&#8221; and pull in a remote repo right into Aptana. [...]]]></description>
			<content:encoded><![CDATA[<p>I recently downloaded Aptana on OS X Snow Leopard because I know of no other free good IDE. I had a project set up under Git that I was trying to work with and I discovered that if I went to &#8220;import&#8221; I could select &#8220;Git&#8221; and pull in a remote repo right into Aptana. Amazing!</p>
<p>Only problem was I hadn&#8217;t set up my RSA keys so Git was still asking for my password. Aptana requires a little program called ssh-askpass. After a little Googling I found a <a href="http://blog.retep.org/2009/04/09/ssh-askpass-on-osx-10-5/">scary looking script that was specific to mercurial, but works for pretty much anything aparently</a>.</p>
<p>It turned out to be really easy and worked like a charm. Here&#8217;s what I had to do:</p>
<p>1. Open up a Terminal<br />
2. Enter the following command:</p>
<p><code>sudo vi /usr/libexec/ssh-askpass</code></p>
<p>3. Copy and Paste in the following code:</p>
<p><code>#! /bin/sh  </p>
<p>#<br />
# An SSH_ASKPASS command for MacOS X<br />
#<br />
# Author: Joseph Mocker, Sun Microsystems  </p>
<p>#<br />
# To use this script:<br />
#     setenv SSH_ASKPASS "macos-askpass"<br />
#     setenv DISPLAY ":0"<br />
#  </p>
<p>TITLE=${MACOS_ASKPASS_TITLE:-"SSH"}  </p>
<p>DIALOG="display dialog \"$@\" default answer \"\" with title \"$TITLE\""<br />
DIALOG="$DIALOG with icon caution with hidden answer"  </p>
<p>result=`osascript -e 'tell application "Finder"' -e "activate"  -e "$DIALOG" -e 'end tell'`  </p>
<p>if [ "$result" = "" ]; then<br />
    exit 1<br />
else<br />
    echo "$result" | sed -e 's/^text returned://' -e 's/, button returned:.*$//'<br />
    exit 0<br />
fi </code> </p>
<p>4. Hit &#8220;esc&#8221;<br />
5. Type &#8220;:wq&#8221; and hit enter<br />
6. Issue the following command:</p>
<p><code>sudo chmod +x /usr/libexec/ssh-askpass</code></p>
<p>Now you should be able to start over on the import and have it work perfectly. A little dialog box will pop up and ask for your password. It&#8217;s asking for the password that goes to your remote repository (that you normally have to type in the shell/terminal when you interact with your git repository).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chomperstomp.com/ssh-askpass-in-aptana-with-git-project-on-os-x/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Flurl &#8211; Part 5: The Unicorn/Panda Rainbow Connection</title>
		<link>http://blog.chomperstomp.com/flurl-part-5-the-unicornpanda-rainbow-connection/</link>
		<comments>http://blog.chomperstomp.com/flurl-part-5-the-unicornpanda-rainbow-connection/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 20:53:32 +0000</pubDate>
		<dc:creator>Christopher McCulloh</dc:creator>
				<category><![CDATA[programming concepts]]></category>
		<category><![CDATA[prototyping]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[TOTW]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[web sites]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[How to]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.chomperstomp.com/?p=564</guid>
		<description><![CDATA[Wait, where&#8217;s parts 2 through 4? Not done yet, but I&#8217;m done with the project and I may never get around to posting those other parts and wanted to post the finished product. Again, Flurl is a little practice exercise I did. A mashup of Flickr and Qurl and no external JS libraries used (so [...]]]></description>
			<content:encoded><![CDATA[<p>Wait, where&#8217;s parts 2 through 4? Not done yet, but I&#8217;m done with the project and I may never get around to posting those other parts and wanted to post the finished product.</p>
<p>Again, Flurl is a little practice exercise I did. A mashup of Flickr and Qurl and no external JS libraries used (so I wrote my own).</p>
<p>I&#8217;m taking <a href="http://www.flickr.com/explore/panda">this photo stream</a> and sending the URLs to Qurl for shortening (using their API). This is the end result (best experienced in Chrome): <a href="http://chomperstomp.com/flurl/">The Unicorn/Panda Rainbow Connection</a> (Be careful, since the photos are completely random &#8220;popular&#8221; flickr photos, even though they purport to be &#8220;safe&#8221; there are definitely some NSFW photos now and then).</p>
<p>Some thoughts: Qurl sucks as far as response time. I had to limit my photos to five because Qurl was so darn slow responding to my requests and there is no way to do a batch request. BAD. What would I do to fix this? How about dump Qurl entirely. Flickr has their own shortening algorithm that doesn&#8217;t even require an API call. If I had to keep using Qurl? I&#8217;d go ahead and load the photos to the page for the user with the long links, then I&#8217;d make a button on the photo (or link or something) that allowed them to request a shortened URL from Qurl. They click the button/link and an AJAX request fires off grabbing the URL and giving it to them.</p>
<p>I couldn&#8217;t get the Flickr API to return only a certain number of Photos. I did everything I could find that it said I should do to get it to only return five or ten photos, but alas, it didn&#8217;t work. So I had to make a loop that just used the first five/ten photos and ignore the rest. If it weren&#8217;t for Qurl, which takes over 30 seconds most times to shorten 5 urls, I wouldn&#8217;t care how many Flickr sent back. Still weird and wasteful and if I had more time I&#8217;d look into it until I got it working.</p>
<p>When I removed Qurl from the loop, the photos returned in less than five seconds flat (awesome!). However, with Qurl the response time ranges from 30s to 90s. So AS SOON AS I get the response back I fire off another request. If the response only took 5s total, I&#8217;d put a timeout or interval or something that queried only once a minute or so. Or, better yet, I&#8217;d make it fire off the request 10 seconds before my photo scroll ended and just put the new photos above my current scroll and make the scroll seem endless (like the pandas).</p>
<p>I spent far too much time on the library. I had big plans and it turned out I wrote way more code than I ended up needing because I was doing VERY LITTLE DOM manipulation. Of course if I worked on this for another forty hours or so the library really would have paid off because it would have saved me time as my interactions got more and more complex. If I had come up with the full design before I started writing the code I would have known I wasn&#8217;t going to need much DOM interaction, but as it stands I didn&#8217;t have any idea what the page was going to look like until I was almost completely finished with the cQuery JS library.</p>
<p>Queue. Something interesting I came up with was a way of handling mutliple simultaneous AJAX requests and multiple simultaneous animations. A queue. </p>
<p>For the AJAX requests I had an AJAX queue that just held all of my requests (didn&#8217;t end up needing this, but it is there if I decide to do the Qurl thing separate from the photo retrieval). I hope to go into the AJAX queue in more detail in another post, but the reason I needed it was the callback function. I needed somewhere to put it until the request completed. </p>
<p>For the animation queue, I didn&#8217;t want to set up a whole bunch of different &#8220;set intervals&#8221; or &#8220;set timeouts&#8221; so instead I made an &#8220;animations&#8221; array and then made ONE setInterval that called a function that looped through the animation array. Each spot in the array held an &#8220;animation&#8221; Object, which had an &#8220;animate()&#8221; function. The animate function would get called on the object and be allowed to run in the proper context (with &#8220;this&#8221; functioning as expected). This ended up saving me a lot of code and headaches and made my JS run way faster than it otherwise would have. Of course I ended up only having one animation run at a time and I have no standard way of removing from the queue, but I could add that to the library and there is definitely room for more animations.</p>
<p><script src="http://gist.github.com/450528.js?file=animation%20queue"></script></p>
<p>One last thing, the song is from <a href="http://www.thewikies.com/">Jonathan Neal</a> (<a href="http://www.youtube.com/watch?v=2NE9O8hTvfI">who is hilarious</a>). I converted it to .ogg format because Firefox didn&#8217;t allow anything else, however it appears that Safari doesn&#8217;t accept .ogg format, so if I had more time I&#8217;d make something to detect with browser I&#8217;m in and respond with the .mp3 format instead&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chomperstomp.com/flurl-part-5-the-unicornpanda-rainbow-connection/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TOTW: Modernizr</title>
		<link>http://blog.chomperstomp.com/totw-modernizr/</link>
		<comments>http://blog.chomperstomp.com/totw-modernizr/#comments</comments>
		<pubDate>Mon, 21 Jun 2010 21:11:45 +0000</pubDate>
		<dc:creator>Christopher McCulloh</dc:creator>
				<category><![CDATA[TOTW]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[How to]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Tool of the Week]]></category>

		<guid isPermaLink="false">http://blog.chomperstomp.com/?p=557</guid>
		<description><![CDATA[Modernizr is a JavaScript library that you include on your page that executes itself and adds a series of classes to your HTML tag. This allows to implement modern CSS functionality without worrying about writing conditionals in JavaScript or anything complicated like that. You simply write one (or at most two) style definitions around the [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.modernizr.com/">Modernizr</a> is a JavaScript library that you include on your page that executes itself and adds a series of classes to your HTML tag. This allows to implement modern CSS functionality without worrying about writing conditionals in JavaScript or anything complicated like that. You simply write one (or at most two) style definitions around the functionality you want, like this:</p>
<p>.functionalityYouWant #myElement{<br />
    css3thing: blah;<br />
}</p>
<p>.no-functionalityYouWant #myElement{<br />
    oldSchoolWay: blah;<br />
}</p>
<p>So, real world example:</p>
<p>.cssgradients .sideNavTitleBox{<br />
	background: -moz-linear-gradient(center bottom, #000 13%, #353535 84%);<br />
	background: -webkit-gradient(linear, center bottom, center top, color-stop(0.13, #000), color-stop(0.84, #353535));<br />
}</p>
<p>.no-cssgradients .sideNavTitleBox{<br />
	background-color: #000;<br />
	background-image: url(/media/images/backgrounds/left_nav_box_header.gif);<br />
	background-repeat: repeat-x;<br />
	background-position: left top;<br />
}</p>
<p>Again, you don&#8217;t have to write any javascript at all, you just include <a href="http://www.modernizr.com/">the library</a> on the page and it runs all on it&#8217;s own and enables this awesomeness!</p>
<p>EDIT: Oh look, ALA just posted a great article on <a href="http://www.alistapart.com/articles/taking-advantage-of-html5-and-css3-with-modernizr/">modernizr</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chomperstomp.com/totw-modernizr/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flurl &#8211; Part 1.a: Rolling your own JavaScript library, setting up the core</title>
		<link>http://blog.chomperstomp.com/flurl-part-1-a-rolling-your-own-javascript-library-setting-up-the-core/</link>
		<comments>http://blog.chomperstomp.com/flurl-part-1-a-rolling-your-own-javascript-library-setting-up-the-core/#comments</comments>
		<pubDate>Mon, 21 Jun 2010 05:30:09 +0000</pubDate>
		<dc:creator>Christopher McCulloh</dc:creator>
				<category><![CDATA[programming concepts]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[cQuery]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[How to]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[toolkit]]></category>

		<guid isPermaLink="false">http://blog.chomperstomp.com/?p=549</guid>
		<description><![CDATA[Flurl is a mashup I did recently as a practice exercise. It takes a flickr panda photo-stream, displays a photo, and uses qurl to make a shortened URL link to the photo. These are the notes I took while I was doing it. The project can be found on GitHub at http://github.com/cmcculloh/Flurl For this exercise [...]]]></description>
			<content:encoded><![CDATA[<p>Flurl is a mashup I did recently as a practice exercise.</p>
<p>It takes a flickr panda photo-stream, displays a photo, and uses qurl to make a shortened URL link to the photo.</p>
<p>These are the notes I took while I was doing it.</p>
<p>The project can be found on GitHub at <a href="http://github.com/cmcculloh/Flurl">http://github.com/cmcculloh/Flurl</a></p>
<p>For this exercise I didn&#8217;t want to use any JavaScript library. Normally I&#8217;d use jQuery (naturally) but I wanted to feel the pain of plain jane JavaScript again since it had been well over a year since I had done any AJAX without a library.</p>
<p>I decided I&#8217;d roll my own library that I could use to encapsulate the AJAX and DOM selection framework to keep it seperate from the actual app and to simplify my life in actually writing the app.</p>
<p>Since I wanted my library to feel a little jQuerish I decided as an homage I&#8217;d name it cQuery and use the _ instead of the $.</p>
<p>Step 1, the ubiquitous self executing anonymous function:</p>
<p><code>(function(window, document, undefined){})(this, document);</code></p>
<p>I&#8217;ll break it down. The starting paren &#8220;(&#8221; and it&#8217;s mate are just a &#8220;cool guy&#8221; coding convention to let people know, &#8220;this is weird! This is a library! This ain&#8217;t yo mama&#8217;s JavaScript!&#8221;. It&#8217;s the same as this:</p>
<p><code>function(window, document, undefined){}(this, document);</code></p>
<p>Which is simply just a function that immediately calls itself. The main reason to do this is to prepare our code for minification. When we minify, it will end up something like this:</p>
<p><code>(function(A,B,C){})(this, document);</code></p>
<p>So anywhere in our library where we had &#8220;window&#8221; or &#8220;document&#8221; or &#8220;undefined&#8221; it will not be the much shorter &#8220;A&#8221;, &#8220;B&#8221; or &#8220;C&#8221;, much smaller!</p>
<p>Paul Irish explains this in a *little* more detail in his <a href="http://paulirish.com/2010/10-things-i-learned-from-the-jquery-source/">10 Things I Learned From the jQuery Source</a> video.</p>
<p>Next we build the core function of our library, add it to the namespace and give it it&#8217;s &#8220;_&#8221; shortcut:</p>
<p><code>var cQuery = function(elm){<br />
};</p>
<p>window.cQuery = window._ = cQuery;</code></p>
<p>Note that if we didn&#8217;t do that last line &#8216;cQuery&#8217; would not be available in the rest of our JavaScript since it is hidden away inside of the closure we talked about above.</p>
<p>I really like the way jQuery works, and I want my library to mimic this. So calling:</p>
<p><code>cQuery("#domElementById").someMethod().anotherMethod();</code></p>
<p>ought to work.</p>
<p>Functions in JavaScript are just Objects that you can invoke. Functions can have their own methods, properties, etc. So basically cQuery is just an object that can DO something on it&#8217;s own so we can say cQuery() instead of cQuery.doThing(). Much more convenient. So basically our var cQuery = function(elm){} code is just setting up my cQuery library object in a way that it can be called and passed the dom element we are working with.</p>
<p>Since I want to be able to &#8220;chain&#8221; things in my library, I&#8217;ll need to add the methods in there that enable my chaining. I do this by ending my cQuery function with a return statement that returns an object containing the methods I wish to be available for chaining, each of these methods in turn returning an instance of the cQuery object (unless the method is specifically supposed to return something else, which makes it a destructive method because it ends my chaining), <a href="http://pastebin.me/ad4b222f4ddf23d70fb4b9446bca1a07">like in this example</a>:</p>
<p><code>(function(){<br />
var c = function(){<br />
  return{<br />
    blah:function(){<br />
      alert("blah");<br />
      return c();<br />
    },<br />
    blah2:function(){<br />
      alert("blah2");<br />
      return c();<br />
    }<br />
  };<br />
};</p>
<p>window.c = c;<br />
})();</p>
<p>c().blah().blah2();</code></p>
<p>That&#8217;s it! Now I&#8217;ve got the core of my JavaScript library all set up, chaining enabled, library closed in but available on the namespace, all ready to be made useful! Here&#8217;s the code we&#8217;ve got so far:</p>
<p>(function(window, document, undefined) {</p>
<p>var cQuery = function(elm){<br />
//DOM selection and storage will go here</p>
<p>	return {<br />
//chain-able library methods go here<br />
	};<br />
};</p>
<p>//make sure our library is exposed to the global namespace and make a shortcut &#8220;_&#8221; so we don&#8217;t have to type cQuery every time.<br />
window.cQuery = window._ = cQuery;</p>
<p>})(this, document);</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chomperstomp.com/flurl-part-1-a-rolling-your-own-javascript-library-setting-up-the-core/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Using jQuery to bind a function to a select box change and retrieve the selected value</title>
		<link>http://blog.chomperstomp.com/using-jquery-to-bind-a-function-to-a-select-box-change-and-retrieve-the-selected-value/</link>
		<comments>http://blog.chomperstomp.com/using-jquery-to-bind-a-function-to-a-select-box-change-and-retrieve-the-selected-value/#comments</comments>
		<pubDate>Tue, 20 Apr 2010 14:51:02 +0000</pubDate>
		<dc:creator>Christopher McCulloh</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[programming concepts]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[console]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[How to]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[spotlight]]></category>

		<guid isPermaLink="false">http://blog.chomperstomp.com/?p=536</guid>
		<description><![CDATA[If you need to bind a function to be called when a user selects an option from a select box using jQuery, you&#8217;ve come to the right place. There are several different ways to skin this cat, but basically here is what we are going to do: 1. Bind a change event listener to the [...]]]></description>
			<content:encoded><![CDATA[<p><iframe src="http://rcm.amazon.com/e/cm?lt1=_blank&#038;bc1=000000&#038;IS2=1&#038;bg1=FFFFFF&#038;fc1=000000&#038;lc1=0000FF&#038;t=chompstomp-20&#038;o=1&#038;p=8&#038;l=as1&#038;m=amazon&#038;f=ifr&#038;md=10FE9736YVPPT7A0FBG2&#038;asins=0596159773" style="width:120px;height:240px;padding:5px;margin:10px;float:right;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe></p>
<p>If you need to bind a function to be called when a user selects an option from a select box using jQuery, you&#8217;ve come to the right place.</p>
<p>There are several different ways to skin this cat, but basically here is what we are going to do:</p>
<p>1. Bind a change event listener to the select box itself<br />
2. When the box is changed, call a function that detects and retrieves the selected value</p>
<p>Here&#8217;s the code:</p>
<p><code>            $("#selectBoxId").change(function(){<br />
                var selectedValue = $(this).find(":selected").val();<br />
                console.log("the value you selected: " + selectedValue);<br />
            });</code></p>
<p>Let&#8217;s break it down line by line.</p>
<p>Line 1:<br />
<code>            $("#selectBoxId").change(function(){</code></p>
<p><code>$("#selectBoxId")</code> grabs the DOM element out of the html and makes a jQuery object.<br />
<code>.change(function(){});</code> binds a function to the change event of the select box. Any time anyone changes the selection in the select box this function will fire off</p>
<p>Line 2:<br />
<code>                var selectedValue = $(this).find(":selected").val();</code>                </p>
<p><code>var selectedValue</code> creates a new variable that the selected value will be stored in.<br />
<code>$(this)</code> creates a jQuery object based on the select box that triggered the function.<br />
<code>.find(":selected")</code> looks a the select box that triggered the function and finds the option that got selected.<br />
<code>.val()</code> gets the &#8220;value&#8221; of the selected option.</p>
<p>Line 3:<br />
<code>                console.log("the value you selected: " + selectedValue);</code></p>
<p>this just calls the firebug console in firefox and tells it you want to print something out to it. You don&#8217;t need this line, but this line shows you that the above code did indeed grab the selected value out of the select box.</p>
<p>Line 4:<br />
<code>            });</code><br />
This just closes the open change function started on line 1.</p>
<p>This code assumes that you have an HTML select box with an id of &#8220;selectBoxId&#8221;. If you have a series of select boxes that all need the same function bound to them for some reason you can give them all the same class name (say &#8220;selectBoxesClass&#8221;) and select them like so: $(&#8220;.selectBoxesClass&#8221;).</p>
<p><code>&lt;!DOCTYPE html><br />
&lt;html><br />
  &lt;head><br />
    &lt;meta charset="utf-8" /><br />
    &lt;title>Conforming XHTML 1.0 Strict Template&lt;/title><br />
    &lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js">&lt;/script><br />
    &lt;script type="text/javascript"><br />
        $(function(){<br />
            $("#selectBoxId").change(function(){<br />
                var selectedValue = $(this).find(":selected").val();<br />
                console.log("the value you selected: " + selectedValue);<br />
            });<br />
        });<br />
    &lt;/script><br />
&lt;/head></p>
<p>&lt;body><br />
  &lt;select id="selectBoxId"><br />
    &lt;option>Foo&lt;/option><br />
    &lt;option>Bar&lt;/option><br />
    &lt;option selected="selected">Beh&lt;/option><br />
  &lt;/select><br />
&lt;/body><br />
&lt;/html></code></p>
<p><a href="http://pastebin.me/5b9b49d7e96cc26bcf6567ff88b11ced">Here is the example</a></p>
<p>Here are some resources for further reading:<br />
<a href="http://jquery.com/">jQuery</a><br />
<a href="http://api.jquery.com/change/">jQuery change</a><br />
<a href="http://api.jquery.com/find/">jQuery find</a><br />
<a href="http://api.jquery.com/val/">jQuery val</a><br />
<a href="http://api.jquery.com/selected-selector/">jQuery :selected selector</a><br />
<a href="http://api.jquery.com/element-selector/">jQuery Element selector</a><br />
<a href="http://api.jquery.com/id-selector/">jQuery id selector</a><br />
<a href="http://api.jquery.com/class-selector/">jQuery class selector</a><br />
<a href="http://www.mozilla.com/en-US/firefox/firefox.html">Firefox</a><br />
<a href="http://getfirebug.com/">Firebug</a><br />
<a href="http://getfirebug.com/wiki/index.php/Console_API#console.log.28object.5B.2C_object.2C_....5D.29">Firebug Console</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chomperstomp.com/using-jquery-to-bind-a-function-to-a-select-box-change-and-retrieve-the-selected-value/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>TOTW: Freenode IRC Webchat Client</title>
		<link>http://blog.chomperstomp.com/518/</link>
		<comments>http://blog.chomperstomp.com/518/#comments</comments>
		<pubDate>Mon, 15 Feb 2010 12:00:39 +0000</pubDate>
		<dc:creator>Christopher McCulloh</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[TOTW]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[web sites]]></category>
		<category><![CDATA[browser tools]]></category>
		<category><![CDATA[communication]]></category>
		<category><![CDATA[irc]]></category>
		<category><![CDATA[Tool of the Week]]></category>
		<category><![CDATA[web apps]]></category>

		<guid isPermaLink="false">http://blog.chomperstomp.com/?p=518</guid>
		<description><![CDATA[This week&#8217;s Tool of the Week is The Freenode IRC Webchat Client. What it does: Allows you to chat on Freenode IRC through your browser, even if your corporate proxy blocks IRC (IRC is the third biggest security hole for corporate networks). When you need it: When you don&#8217;t have an IRC Client installed When [...]]]></description>
			<content:encoded><![CDATA[<p>This week&#8217;s Tool of the Week is <a href="http://webchat.freenode.net/">The Freenode IRC Webchat Client</a>.</p>
<p><strong>What it does:</strong></p>
<p>Allows you to chat on Freenode IRC through your browser, even if your corporate proxy blocks IRC (IRC is the third biggest security hole for corporate networks).</p>
<p><strong>When you need it:</strong></p>
<ul>
<li>When you don&#8217;t have an IRC Client installed</li>
<li>When IRC is blocked</li>
</ul>
<p><strong>How to use it:</strong><br />
<object id="scPlayer" width="546" height="668"><param name="movie" value="http://content.screencast.com/users/cmccullo/folders/Jing/media/1983a54a-a3b1-4f47-96dd-d31709dea369/jingswfplayer.swf"></param><param name="quality" value="high"></param><param name="bgcolor" value="#FFFFFF"></param><param name="flashVars" value="thumb=http://content.screencast.com/users/cmccullo/folders/Jing/media/1983a54a-a3b1-4f47-96dd-d31709dea369/FirstFrame.jpg&#038;containerwidth=546&#038;containerheight=668&#038;content=http://content.screencast.com/users/cmccullo/folders/Jing/media/1983a54a-a3b1-4f47-96dd-d31709dea369/freenode.swf"></param><param name="allowFullScreen" value="true"></param><param name="scale" value="showall"></param><param name="allowScriptAccess" value="always"></param><param name="base" value="http://content.screencast.com/users/cmccullo/folders/Jing/media/1983a54a-a3b1-4f47-96dd-d31709dea369/"></param>  <embed src="http://content.screencast.com/users/cmccullo/folders/Jing/media/1983a54a-a3b1-4f47-96dd-d31709dea369/jingswfplayer.swf" quality="high" bgcolor="#FFFFFF" width="546" height="668" type="application/x-shockwave-flash" allowScriptAccess="always" flashVars="thumb=http://content.screencast.com/users/cmccullo/folders/Jing/media/1983a54a-a3b1-4f47-96dd-d31709dea369/FirstFrame.jpg&#038;containerwidth=546&#038;containerheight=668&#038;content=http://content.screencast.com/users/cmccullo/folders/Jing/media/1983a54a-a3b1-4f47-96dd-d31709dea369/freenode.swf" allowFullScreen="true" base="http://content.screencast.com/users/cmccullo/folders/Jing/media/1983a54a-a3b1-4f47-96dd-d31709dea369/" scale="showall"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chomperstomp.com/518/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

