<?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>Keith Bentrup’s Portfolio</title>
	<atom:link href="http://portfolio.keithbentrup.com/feed" rel="self" type="application/rss+xml" />
	<link>http://portfolio.keithbentrup.com</link>
	<description>A brief sampling of my work</description>
	<lastBuildDate>Thu, 22 Sep 2011 21:41:33 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>A virtual distributed testing framework</title>
		<link>http://portfolio.keithbentrup.com/archives/386</link>
		<comments>http://portfolio.keithbentrup.com/archives/386#comments</comments>
		<pubDate>Thu, 22 Sep 2011 21:21:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[selenium grid virtualbox vms testing framework]]></category>

		<guid isPermaLink="false">http://portfolio.keithbentrup.com/archives/386</guid>
		<description><![CDATA[When developing a web application and quickly iterating, it&#8217;s imperative that you can quickly test changes on a multitude of browsers and platforms. If you want coverage on IE6-9, the latest Chrome, the latest Safari, the latest Firefox, and maybe the FF 3.6+ branch, you will need several machines. Fortunately, they can be virtual, and [...]]]></description>
			<content:encoded><![CDATA[<p>When developing a web application and quickly iterating, it&#8217;s imperative that you can quickly test changes on a multitude of browsers and platforms. If you want coverage on IE6-9, the latest Chrome, the latest Safari, the latest Firefox, and maybe the FF 3.6+ branch, you will need several machines. Fortunately, they can be virtual, and those machines can run more than one browser.</p>
<p>With all of this in mind, I set out to set up the following automated, distributed testing grid on one decent physical machine running off a external drive. </p>
<p>So what&#8217;s the set up and why?</p>
<p>Virtual Machine 1: Win7<br />
Browsers:<br />
IE9, latest Chrome, latest Firefox<br />
Grid:<br />
Running as both the hub with multiple web drivers</p>
<p>Virtual Machine 2: XP SP3<br />
Browsers:<br />
IE8, FF 3.6</p>
<p>Virtual Machine 3:<br />
Browsers:<br />
IE7</p>
<p>Virtual Machine 4:<br />
Browsers:<br />
IE6</p>
<p>Physical Host Machine: Mac OS X 10.6.8, Quad Core, 8 GB<br />
Mac Browsers (obviously):<br />
latest Safari, latest Chrome, latest Firefox, Firefox 3.6+</p>
<p>More notes to come &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://portfolio.keithbentrup.com/archives/386/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Useful notes for remote machines &#8230;</title>
		<link>http://portfolio.keithbentrup.com/archives/381</link>
		<comments>http://portfolio.keithbentrup.com/archives/381#comments</comments>
		<pubDate>Tue, 20 Sep 2011 19:29:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://portfolio.keithbentrup.com/?p=381</guid>
		<description><![CDATA[I was recently copying some very large files from one remote machine to another. However, I had forgotten to use the nohup command and would need to leave before the transfer finished. Simple solution:
1) Suspend the process Ctrl+z
2) Background it bg
3) jobs to find the number to &#8230;
4) disown
Another problem that I ran up against [...]]]></description>
			<content:encoded><![CDATA[<p>I was recently copying some very large files from one remote machine to another. However, I had forgotten to use the <code>nohup</code> command and would need to leave before the transfer finished. Simple solution:</p>
<p>1) Suspend the process <code>Ctrl+z</code><br />
2) Background it <code>bg</code><br />
3) <code>jobs</code> to find the number to &#8230;<br />
4) <code>disown</code></p>
<p>Another problem that I ran up against was transferring large files and being disconnected. Since <code>scp</code> does not support resume, you have to use it in conjunction with <code>rsync</code>. Furthermore, the problem seemed to be an overload of a home router, so I needed to rate limit it. The final cmd:</p>
<p><code>rsync --partial --progress --bwlimit=500 --rsh=ssh orig_file user@host:~/dest_file</code></p>
]]></content:encoded>
			<wfw:commentRss>http://portfolio.keithbentrup.com/archives/381/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ssh debugging &#8230;</title>
		<link>http://portfolio.keithbentrup.com/archives/375</link>
		<comments>http://portfolio.keithbentrup.com/archives/375#comments</comments>
		<pubDate>Mon, 14 Mar 2011 16:30:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://portfolio.keithbentrup.com/?p=375</guid>
		<description><![CDATA[I love the command line especially when working remotely. Yes, logmein, vnc, teamview, etc. are useful, but when you need quick access or powerful command-line tools, nothing beats the shell.
The problem is what to do when it fails. Diagnosing connection problems over hostile networks with firewalls, packet filtering, and more can be a pain. I [...]]]></description>
			<content:encoded><![CDATA[<p>I love the command line especially when working remotely. Yes, logmein, vnc, teamview, etc. are useful, but when you need quick access or powerful command-line tools, nothing beats the shell.</p>
<p>The problem is what to do when it fails. Diagnosing connection problems over hostile networks with firewalls, packet filtering, and more can be a pain. I recently discovered 2 useful tips when trying to diagnose the client and server interactions. First, run ssh with -vvv. Second, run sshd with -Dddde. This gives you all the debugging info you need. </p>
<p>In this particular case, sshd appeared to starting correctly, and I could ssh @localhost but not @127.0.0.1. The culprit turned out to be FreeSSHD had already bound port 22. Starting sshd with -Dddde revealed this problem. Then I simply found the guilty process by netstat -ab. When I had run netstat -an before and saw the system listening on port 22, I had incorrectly assumed it was sshd. =P</p>
]]></content:encoded>
			<wfw:commentRss>http://portfolio.keithbentrup.com/archives/375/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Characteristics of a Good API</title>
		<link>http://portfolio.keithbentrup.com/archives/304</link>
		<comments>http://portfolio.keithbentrup.com/archives/304#comments</comments>
		<pubDate>Mon, 11 Oct 2010 09:37:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://portfolio.keithbentrup.com/?p=304</guid>
		<description><![CDATA[I was recently watching a Goggle Tech Talk titled How To Design A Good API and Why it Matters. Joshua Block had this great summary that I wanted to share &#8230;
Characteristics of a Good API
- Easy to learn
- Easy to use even w/o docs
- Hard to misuse
- Easy to read and maintain code that uses it
- [...]]]></description>
			<content:encoded><![CDATA[<p>I was recently watching a <a href="http://www.youtube.com/user/GoogleTechTalks">Goggle Tech Talk</a> titled <a href="http://www.youtube.com/watch?v=aAb7hSCtvGw">How To Design A Good API and Why it Matters</a>. Joshua Block had this great summary that I wanted to share &#8230;</p>
<p><strong>Characteristics of a Good API</strong><br />
- Easy to learn<br />
- Easy to use even w/o docs<br />
- Hard to misuse<br />
- Easy to read and maintain code that uses it<br />
- Sufficiently powerful to satisfy reqs<br />
- Easy to evolve<br />
- Appropiate to audience</p>
<p>Recently, I&#8217;ve had innumerable decision points for a library that I&#8217;m working on. I&#8217;m hoping that turning these characteristics into questions will help me improve the code.</p>
]]></content:encoded>
			<wfw:commentRss>http://portfolio.keithbentrup.com/archives/304/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cron jobs with mail notification on a Windows box in 5 minutes</title>
		<link>http://portfolio.keithbentrup.com/archives/282</link>
		<comments>http://portfolio.keithbentrup.com/archives/282#comments</comments>
		<pubDate>Wed, 28 Jul 2010 14:48:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://portfolio.keithbentrup.com/?p=282</guid>
		<description><![CDATA[So cygwin allows you to port all the great *nix utilities to a Windows environment, and that&#8217;s useful because 1) there are some many handy tools and 2) you can write scripts or tasks once and use them everywhere (Unix, Linux, OS X, Windows).
Today, let&#8217;s discover how you can get two of the most useful [...]]]></description>
			<content:encoded><![CDATA[<p>So cygwin allows you to port all the great *nix utilities to a Windows environment, and that&#8217;s useful because 1) there are some many handy tools and 2) you can write scripts or tasks <strong>once</strong> and use them everywhere (Unix, Linux, OS X, Windows).</p>
<p>Today, let&#8217;s discover <strong>how you can get two of the most useful tools (automated tasks and mail notification) installed in less than 5 min.</strong></p>
<p>Since the typical Windows box was not designed as a server, scheduled services/tasks and mail transfer agents are not commonly implemented/installed, but we can quickly fix that.</p>
<p>First, install the <code>exim</code> and <code>cron</code> cygwin package and then run <code>exim-config</code>. You can accept most of the defaults. The only change that you might want to make is to set up a primary hostname. I use &#8220;mail.local&#8221;. Be sure to add that to your hosts file (%WINDIR%\system32\drivers\etc\hosts), too:</p>
<pre class="brush: plain;">127.0.0.1 mail.local</pre>
<p>Next since you want mail to be deliverable for users without accounts, we need to disable the <code>check_local_user</code> option under the <code>localuser</code> router in <code>/etc/exim.conf</code>.</p>
<p>Verify the setup with </p>
<pre class="brush: plain;">$ exim -bt test@mail.local</pre>
<p>You should see something like &#8230;</p>
<pre class="brush: plain;">test@mail.local
   router = localuser, transport = local_delivery</pre>
<p>Now any output from the cron jobs will appear in the mail logs located in <code>/var/spool/mail</code>.</p>
<p>Also note that you can quickly send mail from the command line now without any other tools. Try this:</p>
<pre class="brush: plain;">$ exim -v -odf test@mail.local
This is a test message.</pre>
<p>Just end the message with a newline and then type Ctrl+D. Now check <code>/var/spool/mail/test</code>.</p>
<p><strong>Now for cron.</strong> Run <code>cron-config</code> accepting the defaults as needed. You can quickly test the setup afterward by editing your crontab.</p>
<pre class="brush: plain;">echo '* * * * * echo hi' | crontab -</pre>
<p>In less than a minute (<em>and every minute thereafter until you change it</em>), you should see the output in your mail spool. </p>
<p>And we&#8217;re done. Now just set up <strong>whatever cron jobs you want</strong> <em>on whatever schedule you want</em>. That wasn&#8217;t so bad, was it?</p>
]]></content:encoded>
			<wfw:commentRss>http://portfolio.keithbentrup.com/archives/282/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

