<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;C08ARns4cSp7ImA9WhRRFU8.&quot;"><id>tag:blogger.com,1999:blog-938919081230706447</id><updated>2011-11-28T18:10:47.539-05:00</updated><category term="java" /><category term="software tester" /><category term="computer-vision" /><category term="peripherals" /><category term="sockets" /><category term="VT100" /><category term="programming" /><category term="development" /><category term="sorting" /><category term="NetHack" /><category term="updates" /><category term="memory" /><category term="Windows" /><category term="how-to" /><category term="algorithms" /><category term="xterm" /><category term="C#" /><category term="C++" /><category term="pointers" /><category term="firefox" /><category term="meta" /><category term="blogger" /><category term="terminal" /><category term="software" /><category term="delicious" /><category term="Eclipse" /><category term="telnet" /><category term="keyboard" /><category term="microsoft" /><category term="windows7" /><category term="productivity" /><category term="windows mobile" /><category term="testing" /><category term="tips and fixes" /><category term="software testing" /><category term="ide" /><category term="hardware" /><title>Randomness</title><subtitle type="html">Having no definite aim or purpose; not sent or guided in a particular direction; made, done, occurring, without method or conscious choice.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://srand2.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://srand2.blogspot.com/" /><author><name>srand</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_xT3i45NE5tw/SaiOMjUla8I/AAAAAAAAACc/7s3qOvpNPbY/S220/smrpg_boshi.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>25</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/RandomIi" /><feedburner:info uri="randomii" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;CE8HRXk5eSp7ImA9Wx9aFUo.&quot;"><id>tag:blogger.com,1999:blog-938919081230706447.post-8609078114773156578</id><published>2011-03-08T03:27:00.000-05:00</published><updated>2011-03-08T03:27:14.721-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-08T03:27:14.721-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tips and fixes" /><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="how-to" /><title>How to Keep Numerous Tabs Open in Google Chrome</title><content type="html">&lt;div style="text-align: justify;"&gt;I try not to open too many tabs in Google Chrome, however, it still happens. When many tabs are open it slows down the system and take up a lot memory. An easy work around to this is to end all tabs that are not currently in use. To do this simply press Shift+Escape to bring up Chrome's task manager. End all tabs that are not being used or are taking a large share of the memory. The tab remembers its URL but doesn't load anything into memory. Refresh the page to load the contents again. Now one can have as many tabs open without slowing the system.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/938919081230706447-8609078114773156578?l=srand2.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/DXSeC4YKUCJ38tVVbE_oCGi9Res/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DXSeC4YKUCJ38tVVbE_oCGi9Res/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/DXSeC4YKUCJ38tVVbE_oCGi9Res/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DXSeC4YKUCJ38tVVbE_oCGi9Res/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RandomIi/~4/7-a_k_Upbxg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://srand2.blogspot.com/feeds/8609078114773156578/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://srand2.blogspot.com/2011/03/how-to-keep-numerous-tabs-open-in.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/8609078114773156578?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/8609078114773156578?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RandomIi/~3/7-a_k_Upbxg/how-to-keep-numerous-tabs-open-in.html" title="How to Keep Numerous Tabs Open in Google Chrome" /><author><name>srand</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_xT3i45NE5tw/SaiOMjUla8I/AAAAAAAAACc/7s3qOvpNPbY/S220/smrpg_boshi.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://srand2.blogspot.com/2011/03/how-to-keep-numerous-tabs-open-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cGSXw5fyp7ImA9Wx9UFE0.&quot;"><id>tag:blogger.com,1999:blog-938919081230706447.post-2911794496157968889</id><published>2011-02-11T02:19:00.002-05:00</published><updated>2011-02-11T02:23:48.227-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-11T02:23:48.227-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C++" /><title>String Literals</title><content type="html">What is wrong with the following code?&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;#include &amp;lt;cstdio&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;#include &amp;lt;cstdlib&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;#include &amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;using namespace std;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;int main(int argc, char** argv)&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;char *str = "hello world";&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;str[0] = 'H';&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return 0;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Consider:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt; char str[256];&lt;br /&gt;
strcpy(str, "hello world");&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
instead of:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;char *str = "hello world";&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Why?&lt;br /&gt;
The compiler puts the string literal ("hello world") into the read only address space of the program and thus is immutable during runtime. Which explains why there is a segmentation fault/exception thrown when one tries to write to str.&lt;br /&gt;
&lt;br /&gt;
More Info:&amp;nbsp;&lt;a href="http://stackoverflow.com/questions/2589949/c-string-literals-where-do-they-go"&gt;String Literals - Where do they go?&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/938919081230706447-2911794496157968889?l=srand2.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/SBkfEPvXspcPdgXNOybO1Iy6pXM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SBkfEPvXspcPdgXNOybO1Iy6pXM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/SBkfEPvXspcPdgXNOybO1Iy6pXM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SBkfEPvXspcPdgXNOybO1Iy6pXM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RandomIi/~4/Hhgdzu44-S8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://srand2.blogspot.com/feeds/2911794496157968889/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://srand2.blogspot.com/2011/02/string-literals.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/2911794496157968889?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/2911794496157968889?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RandomIi/~3/Hhgdzu44-S8/string-literals.html" title="String Literals" /><author><name>srand</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_xT3i45NE5tw/SaiOMjUla8I/AAAAAAAAACc/7s3qOvpNPbY/S220/smrpg_boshi.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://srand2.blogspot.com/2011/02/string-literals.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMFQnk5cSp7ImA9Wx9VGU4.&quot;"><id>tag:blogger.com,1999:blog-938919081230706447.post-2670533162485564964</id><published>2011-02-05T15:06:00.000-05:00</published><updated>2011-02-05T15:06:53.729-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-05T15:06:53.729-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="algorithms" /><category scheme="http://www.blogger.com/atom/ns#" term="C++" /><title>XOR Swap Algorithm</title><content type="html">&lt;a href="http://en.wikipedia.org/wiki/XOR_swap_algorithm"&gt;XOR swap algorithm&lt;/a&gt;&amp;nbsp;is a nifty little trick to swap two variables with each other without a&amp;nbsp;temporary&amp;nbsp;variable.&lt;br /&gt;
&lt;br /&gt;
Here is a little snippet of code showing how it&amp;nbsp;works:&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
#include &amp;lt;cstdio&amp;gt;&lt;br /&gt;
#include &amp;lt;cstdlib&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;int x, y;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;x = 123;&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;y = 456;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;cout &amp;lt;&amp;lt; "x = " &amp;lt;&amp;lt; x &amp;lt;&amp;lt; endl; // x = 123&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;cout &amp;lt;&amp;lt; "y = " &amp;lt;&amp;lt; y &amp;lt;&amp;lt; endl; // y = 456&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;cout &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;// Swap values&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;x ^= y;&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;y ^= x;&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;x ^= y;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;cout &amp;lt;&amp;lt; "x = " &amp;lt;&amp;lt; x &amp;lt;&amp;lt; endl; // x = 456&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;cout &amp;lt;&amp;lt; "y = " &amp;lt;&amp;lt; y &amp;lt;&amp;lt; endl; // y = 123&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/938919081230706447-2670533162485564964?l=srand2.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/RZs7rLV6YQ_UY1OdpIZpAbqOwWo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RZs7rLV6YQ_UY1OdpIZpAbqOwWo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/RZs7rLV6YQ_UY1OdpIZpAbqOwWo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RZs7rLV6YQ_UY1OdpIZpAbqOwWo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RandomIi/~4/ZFmV8l6bHUU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://srand2.blogspot.com/feeds/2670533162485564964/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://srand2.blogspot.com/2011/02/xor-swap-algorithm.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/2670533162485564964?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/2670533162485564964?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RandomIi/~3/ZFmV8l6bHUU/xor-swap-algorithm.html" title="XOR Swap Algorithm" /><author><name>srand</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_xT3i45NE5tw/SaiOMjUla8I/AAAAAAAAACc/7s3qOvpNPbY/S220/smrpg_boshi.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://srand2.blogspot.com/2011/02/xor-swap-algorithm.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcDQXo5fip7ImA9Wx9UFE0.&quot;"><id>tag:blogger.com,1999:blog-938919081230706447.post-595000292015383364</id><published>2011-02-05T12:47:00.003-05:00</published><updated>2011-02-11T02:07:50.426-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-11T02:07:50.426-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>Reverse Words in a String</title><content type="html">Reverse the order of words in a string "jackdaws love my big sphinx of quartz" to "quartz of sphinx big my love jackdaws"&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;Solution 1: Using a Stack&lt;/span&gt;&lt;br /&gt;
Assumption: The string literal is given in a String&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
public String reverseString(String myStr)&lt;br /&gt;
{&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;String [] myStrSplit = myStr.split("-");&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;Stack&amp;lt;String&amp;gt; stack = new Stack&amp;lt;String&amp;gt;();&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;StringBuilder myStrReverse = new StringBuilder();&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;for ( String s : myStrSplit )&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;{&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;stack.push( s );&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;while ( !stack.empty() )&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;{&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;myStrReverse.append( stack.pop() );&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;return myStrReverse.toString();&lt;br /&gt;
}&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Time Complexity&lt;/i&gt;&lt;br /&gt;
String#split + pushing on stack + popping off stack&lt;br /&gt;
N + N + N time&lt;br /&gt;
= O( 3N )&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Space Complexity&lt;/i&gt;&lt;br /&gt;
myStr + myStrSplit + stack + myStrReverse&lt;br /&gt;
N + N + N + N&lt;br /&gt;
= O( 4N )&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;Solution 2: Using a Doubly LinkedList&lt;/span&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
public void reverseString(DLinkedList myStr)&lt;br /&gt;
{&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;Node next, prev;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;for ( Node n : myStr )&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;{&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;next = n.next;&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;prev = n.prev;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;n.next = prev;&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;n.prev = next;&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}&lt;br /&gt;
}&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Time Complexity&lt;/i&gt;&lt;br /&gt;
traverse myStr&lt;br /&gt;
= O( N )&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Space Complexity&lt;/i&gt;&lt;br /&gt;
Space for next and prev&lt;br /&gt;
= O( 1 ) (constant space)&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;Solution 3: Using XOR&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;#include &amp;lt;cstdio&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;#include &amp;lt;cstdlib&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;#include &amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;using namespace std;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;// Find next space position&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;inline int nextSpacePosition(char *str, int startPosition)&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;int nextSpacePosition = -1;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;for ( int i = startPosition; str[i] != '\0'; ++i )&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;{&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;if ( str[i] == ' ' )&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;{&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;nextSpacePosition = i;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;break;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;return nextSpacePosition;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;// XOR Swap&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;inline void swap(char *a, char *b)&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;*a ^= *b;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;*b ^= *a;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;*a ^= *b;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;int main(int argc, char **argv)&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;char *originalStr = "jackdaws love my big sphinx of quartz";&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;char reverseStr[256];&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;int strLength;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;int pos, spacePos;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;bool lastIteration = false;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;pos = 0;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;spacePos = 0;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;strcpy(reverseStr, originalStr);&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;strLength = strlen(reverseStr);&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;// Reverses string&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;for ( int i = 0; i &amp;lt; strLength/2; ++i )&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;{&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;swap(reverseStr[i], reverseStr[strLength-i-1]);&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;// Reverses words&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;while ( ! lastIteration )&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;{&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;// Find where word ends (space)&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;spacePos = nextSpacePosition( reverseStr, spacePos+1 );&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;if ( spacePos == -1 )&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;{&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;spacePos = strLength;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;lastIteration = true;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;// Reverse word&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;int end = pos + ((spacePos-pos) / 2);&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;for ( int i = pos; i &amp;lt; end; ++i )&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;{&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;swap( reverseStr[i], reverseStr[spacePos-1-(i-pos)] );&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;pos = spacePos + 1;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;cout &amp;lt;&amp;lt; "Original: " &amp;lt;&amp;lt; originalStr &amp;lt;&amp;lt; endl;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;cout &amp;lt;&amp;lt; "Reversed: " &amp;lt;&amp;lt; reverseStr &amp;lt;&amp;lt; endl;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;i&gt;Time Complexity&lt;/i&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;traverse half of reverseStr (reversing the string) + traverse reverseStr (reversing words) + string length&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;= O( 5/2 * N )&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;= O( N )&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;i&gt;Space Complexity&lt;/i&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Space for constant space variables&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;= O( 1 ) (constant space)&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;The appealing feature for this method is that it doesn't require any "new" data structures (i.e., linked list) and all the work is done in place.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/938919081230706447-595000292015383364?l=srand2.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YCad-YjHunTWEZ-5VwxNjrKwiEU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YCad-YjHunTWEZ-5VwxNjrKwiEU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YCad-YjHunTWEZ-5VwxNjrKwiEU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YCad-YjHunTWEZ-5VwxNjrKwiEU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RandomIi/~4/a8VVgW3mu3w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://srand2.blogspot.com/feeds/595000292015383364/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://srand2.blogspot.com/2011/02/reverse-words-in-string.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/595000292015383364?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/595000292015383364?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RandomIi/~3/a8VVgW3mu3w/reverse-words-in-string.html" title="Reverse Words in a String" /><author><name>srand</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_xT3i45NE5tw/SaiOMjUla8I/AAAAAAAAACc/7s3qOvpNPbY/S220/smrpg_boshi.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://srand2.blogspot.com/2011/02/reverse-words-in-string.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU8MR3o5eCp7ImA9Wx5UF0Q.&quot;"><id>tag:blogger.com,1999:blog-938919081230706447.post-6899402011019797564</id><published>2010-10-19T21:54:00.004-04:00</published><updated>2010-10-22T21:38:06.420-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-22T21:38:06.420-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="software testing" /><category scheme="http://www.blogger.com/atom/ns#" term="testing" /><title>Testing a Device</title><content type="html">&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;An interesting question is how do you test a device (e.g., vending machine, toaster, pencil, magical food creator appliance). There is no correct &lt;i&gt;answer&lt;/i&gt;&amp;nbsp;to this question but a correct &lt;i&gt;thought process&lt;/i&gt;.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 13px;"&gt;Like any problem that we face as an scientist/engineer is to start from the top. It is very important at this point to understand the big picture.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 13px;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;For a tester this means, what are the &lt;/span&gt;&lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Requirement" style="font-family: Arial; font-size: 13px;"&gt;requirements&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&amp;nbsp;of the device? A requirements document is what the product should be or perform. The requirements define the design of the product. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;There is also&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Specifications" style="font-family: Arial; font-size: 13px;"&gt;specifications&lt;/a&gt;&amp;nbsp;which are&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&amp;nbsp;derived from the requirements. The developer and tester shouldn't worry about writing the specifications, just that they are met, and that they have good requirements.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;a href="http://en.wikipedia.org/wiki/FURPS"&gt;FURPS&lt;/a&gt;&amp;nbsp;represent&amp;nbsp;a good model for classifying software quality attributes.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 13px;"&gt;Use FURPS as a high level mental checklist. From there, you can branch into each category and drill down with &lt;a href="http://srand2.blogspot.com/2009/11/software-testing-overview_22.html"&gt;specific tests&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 13px;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 13px;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Functional_requirements"&gt;Functionality&lt;/a&gt; - Feature set, Capabilities, Generality, Security&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Usability"&gt;Usability&lt;/a&gt; - Human factors, Aesthetics, Consistency, Documentation&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Reliability_engineering"&gt;Reliability&lt;/a&gt; - Frequency/severity of failure, Recoverability, Predictability, Accuracy, Mean time to failure&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Computer_performance"&gt;Performance&lt;/a&gt; - Speed, Efficiency, Resource consumption, Throughput, Response time&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Supportability"&gt;Supportability&lt;/a&gt; - Testability, Extensibility, Adaptability, Maintainability, Compatibility, Configurability, Serviceability, Installability, Localizability, Portability&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Other things to keep in mind: input/output, display, and data model.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Related articles:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://srand2.blogspot.com/2009/11/software-testing-overview.html"&gt;Software Testing Overview&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Apply your knowledge:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://srand2.blogspot.com/2009/11/windows-7-ms-paint-bug.html"&gt;Windows 7 MS Paint Bug&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://srand2.blogspot.com/2009/11/microsoft-notepad-bug.html"&gt;MS Notepad Bug&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/938919081230706447-6899402011019797564?l=srand2.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-RiUA93LVx3xbbquMP2CzNQw3qw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-RiUA93LVx3xbbquMP2CzNQw3qw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/-RiUA93LVx3xbbquMP2CzNQw3qw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-RiUA93LVx3xbbquMP2CzNQw3qw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RandomIi/~4/Ak7ZUsuMfd0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://srand2.blogspot.com/feeds/6899402011019797564/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://srand2.blogspot.com/2010/10/testing-device.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/6899402011019797564?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/6899402011019797564?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RandomIi/~3/Ak7ZUsuMfd0/testing-device.html" title="Testing a Device" /><author><name>srand</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_xT3i45NE5tw/SaiOMjUla8I/AAAAAAAAACc/7s3qOvpNPbY/S220/smrpg_boshi.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://srand2.blogspot.com/2010/10/testing-device.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkIARX06fSp7ImA9Wx5XF0o.&quot;"><id>tag:blogger.com,1999:blog-938919081230706447.post-8838401594997381302</id><published>2010-04-25T17:46:00.126-04:00</published><updated>2010-09-17T22:55:44.315-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-17T22:55:44.315-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="computer-vision" /><title>Model Reconstruction from Images</title><content type="html">&lt;div style="text-align: justify;"&gt;&lt;a href="http://2.bp.blogspot.com/_xT3i45NE5tw/S9S4JoN3w_I/AAAAAAAAAPU/tsBU3K2hcGY/s1600/eye.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="120" src="http://2.bp.blogspot.com/_xT3i45NE5tw/S9S4JoN3w_I/AAAAAAAAAPU/tsBU3K2hcGY/s320/eye.jpg" width="320" /&gt;&lt;/a&gt;In the coming days I will talk about model reconstruction from images. I have developed a very simple framework for doing reconstruction. The framework consists of feature detection, correspondences, removing of incorrect data, distortion removal, computing the projection matrices, triangulation, and mesh creation. The discussion will involve a simplified problem space. Proofs for methods are left out of the explanation as the project’s scope is to perform the operations rather than the theory that goes behind it.&lt;br /&gt;
&lt;br /&gt;
The rig consists of a free moving calibrated camera at a single focus. &lt;/div&gt;&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Image Capture&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_xT3i45NE5tw/S-Ix14N37fI/AAAAAAAAAPg/lkQjeeKv0is/s1600/images.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="119" src="http://1.bp.blogspot.com/_xT3i45NE5tw/S-Ix14N37fI/AAAAAAAAAPg/lkQjeeKv0is/s320/images.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Images taken with web cam&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;First step is to capture images. The camera must have the same focus for all images, including the images used for camera calibration. For simplicity, the &lt;a href="http://www.microsoft.com/hardware/digitalcommunication/ProductDetails.aspx?pid=005"&gt;Microsoft LifeCam NX-6000&lt;/a&gt; web cam was used as it has a &lt;a href="http://download.microsoft.com/download/3/1/4/3145E82D-00C6-4F23-A4CC-267CD6FBEA38/TDS_LifeCamNX-6000_0908A.pdf"&gt;single focal length&lt;/a&gt;. A regular &lt;a href="http://en.wikipedia.org/wiki/Compact_camera"&gt;compact camera&lt;/a&gt; would give the best results. Compact cameras have a &lt;a href="http://electronics.howstuffworks.com/cameras-photography/digital/question362.htm"&gt;better&lt;/a&gt; image sensor (&lt;a href="http://en.wikipedia.org/wiki/Charge-coupled_device"&gt;CCD&lt;/a&gt;) and lenses rather lower quality image sensor (&lt;a href="http://en.wikipedia.org/wiki/CMOS"&gt;CMOS&lt;/a&gt;) and lenses found in web cams.&lt;/div&gt;&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Feature Detection&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;A good feature detector is to create a consistent feature point amongst different images. Characteristics of a good detector are invariant to changes to scale, noise, illumination, and affine (scale and translation) transform. Feature point detection is primarily done with the algorithm called &lt;a href="http://en.wikipedia.org/wiki/Scale-invariant_feature_transform"&gt;Scale Invariant Feature Transform&lt;/a&gt;, or SIFT. Rather than re-implementing available solutions, the project used the &lt;a href="http://www.vlfeat.org/"&gt;VLFeat&lt;/a&gt; library. SIFT is invariant to scale, orientation, affine distortion, partially invariant to illumination changes [&lt;a href="http://portal.acm.org/citation.cfm?id=851523"&gt;ref&lt;/a&gt;].&lt;/div&gt;&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Correspondences&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_xT3i45NE5tw/S-oTOif2j5I/AAAAAAAAAQM/gDpuekOSSJQ/s1600/sift.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="119" src="http://3.bp.blogspot.com/_xT3i45NE5tw/S-oTOif2j5I/AAAAAAAAAQM/gDpuekOSSJQ/s320/sift.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Correspondences between two images, 220 points&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;The VLFeat library also does &lt;a href="http://www.vlfeat.org/mdoc/VL_UBCMATCH.html"&gt;image correspondences&lt;/a&gt;. An advantage of SIFT is that its feature points have an associated vector to them. To compare two features to each other one only has to look at the Euclidean distance between the two vectors. However, this is all taken care by the library.&lt;/div&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;Although SIFT is a fairly accurate algorithm, it isn’t perfect. Poor quality features can occur in parts of the image that the color data rapidly changes (i.e., a tree’s leaves), parts were color data doesn’t change (i.e., a flat solid area), highly saturated or under-saturated areas (i.e., lights, darkness), or highly specular or reflective surfaces (i.e. chrome, mirrors). Additionally, there can be bad correspondences from mismatching feature points.&lt;/div&gt;&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Removing Incorrect Correspondences&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_xT3i45NE5tw/S-oUE_91vuI/AAAAAAAAAQc/n6zPFTzt4ss/s1600/ransac.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="119" src="http://4.bp.blogspot.com/_xT3i45NE5tw/S-oUE_91vuI/AAAAAAAAAQc/n6zPFTzt4ss/s320/ransac.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Image correspondences after RANSAC, 84 points&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;a href="http://en.wikipedia.org/wiki/RANSAC"&gt;Random Sample Consensus&lt;/a&gt;, or RANSAC, was used to remove bad data. RANSAC is an iterative method to estimate parameters of the mathematical model (p. 54). The model in this case is the fundamental matrix (see Fundamental Matrix). The basic concept of the algorithm is that there is a set of data consistent with a mathematical model called the inliers and a set of data not consistent with the model called the outliers. RANSAC is non-deterministic in nature because it randomly chooses a set of points to create the model. RANSAC runs a set number iterations or until it finds a good set of inliers. The set of inliers that minimizes the error is the chosen set of data to represent the model. Thus the inliers in this case would be good feature points and outliers would be noisy and incorrect data.&lt;/div&gt;&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Dense point matching&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;Once an accurate model has been established, a guided matching can occur. Guided matching usually consists of rectifying the images and comparing them to each other. Image rectification and comparison creates a set of dense point correspondences thus a better end result. This process can be repeated to get the most out of the images. This has yet to be implemented however.&lt;/div&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Alternate Method&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_xT3i45NE5tw/S-oT-K6GGNI/AAAAAAAAAQU/0c5z5ZACC_o/s1600/hand-picked.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="119" src="http://2.bp.blogspot.com/_xT3i45NE5tw/S-oT-K6GGNI/AAAAAAAAAQU/0c5z5ZACC_o/s320/hand-picked.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Handpicked results, 37 correspondences&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;For simplicity, handpicked results will used. cpselect is the best way for getting manual sub-pixel accuracy point correspondences in MATLAB. Handpicked correspondences are used so possible errors that come from automatic feature detection are eliminated.&lt;/div&gt;&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Camera Calibration&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;Camera calibration was done with the &lt;a href="http://www.vision.caltech.edu/bouguetj/calib_doc/"&gt;Camera Calibration Toolbox for MATLAB&lt;/a&gt;. The camera calibration process consists of taking images of a known calibration object. For the toolbox the calibration object is a checkerboard pattern. The user holds the calibration object in different positions while taking pictures of the object. These images are fed through the toolbox and it outputs the calibration information or better known as intrinsic parameters.&lt;/div&gt;&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Intrinsic Parameters&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;The intrinsic parameters consist of focal length, principal point, and skew coefficient. Additionally, the toolbox can compute the distortions of the camera. With this information, the camera matrix K is built. The camera matrix allows a metric reconstruction of the scene up to a scale. Additionally, knowing the lens distortions of the camera will allow removal of distortion in the image correspondences. These &lt;a href="http://www.vision.caltech.edu/bouguetj/calib_doc/htmls/parameters.html"&gt;variables&lt;/a&gt; are:&lt;/div&gt;&lt;br /&gt;
&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td&gt;&lt;b&gt;Name&lt;/b&gt;&lt;/td&gt; &lt;td&gt;&lt;b&gt;Description&lt;/b&gt;&lt;/td&gt; &lt;td&gt;&lt;b&gt;Variable&lt;/b&gt;&lt;/td&gt; &lt;td&gt;&lt;b&gt;Dimensions&lt;/b&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;Focal length&lt;/td&gt; &lt;td&gt;Focal length in pixels&lt;/td&gt; &lt;td&gt;fc&lt;/td&gt; &lt;td&gt;2x1 vector&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;Principal point&lt;/td&gt; &lt;td&gt;Principal point coordinates&lt;/td&gt; &lt;td&gt;cc&lt;/td&gt; &lt;td&gt;2x1 vector&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;Skew coefficient&lt;/td&gt; &lt;td&gt;Skew coefficient defining the angle between the x and y pixel axes&lt;/td&gt; &lt;td&gt;alpha_c&lt;/td&gt; &lt;td&gt;1x1 scalar&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;Distortion coefficients&lt;/td&gt; &lt;td&gt;Image distortion coefficients (radial and tangential distortions)&lt;/td&gt; &lt;td&gt;kc&lt;/td&gt; &lt;td&gt;5x1 vector&lt;/td&gt; &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
The calibration matrix is computed (p157):&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;$K = \[\left(\begin{array}{ccc} a_x &amp;amp; s &amp;amp; x_0 \\ 0 &amp;amp; a_y &amp;amp; y_0 \\ 0 &amp;amp; 0 &amp;amp; 1 \end{array}\right)\]  =  \[\left(\begin{array}{ccc} fc(1) &amp;amp; alpha_c * fc(1) &amp;amp; cc(1) \\ 0 &amp;amp; fc(2) &amp;amp; cc(2) \\ 0 &amp;amp; 0 &amp;amp; 1 \end{array}\right)\]$&lt;/div&gt;&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Fundamental Matrix&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;The basic concept of the fundamental matrix is that it takes one space and projects onto another space. In this application the fundamental matrix takes the first image point set and projects it to the second image point set. The fundamental matrix has the essential matrix, which has the rotation and translation matrices that is needed to make the project matrices. It is computed by taking the Kronecker tensor product for every image correspondences and finding the SVD of the resulting matrix (p. 393)&lt;/div&gt;&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Essential Matrix&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;In this case, $K_2$ and $K_1$ are equal because the same camera with the same setting were used. Thus, to recover the essential matrix [4, p. 257]:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: center;"&gt;$E = K_2^TFK_1=K^TFK$&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The essential matrix must be projected into the essential space by:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: center;"&gt;$[U_E,E_E,V_E ] = SVD(E)$&lt;/div&gt;&lt;div style="text-align: center;"&gt;$E = U_E * \[ \left( \begin{array}{ccc} 0 &amp;amp; 1 &amp;amp; 0 \\ -1 &amp;amp; 0 &amp;amp; 0  \\ 0 &amp;amp; 0 &amp;amp; 0 \end{array}\right)\] * V_E^T$&lt;/div&gt;&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Extrinsic Parameters&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;The extrinsic parameters, rotation $R$ and translation $t$, can be recovered from the essential matrix $E$.&lt;/div&gt;&lt;br /&gt;
&lt;div style="text-align: center;"&gt;$W = \[ \left( \begin{array}{ccc} 0 &amp;amp; 1 &amp;amp; 0 \\ -1 &amp;amp; 0 &amp;amp; 0 \\ 0 &amp;amp; 0 &amp;amp; 0 \end{array}\right)\]$&lt;br /&gt;
&lt;br /&gt;
$Z = \[\left(\begin{array}{ccc} 0 &amp;amp; 1 &amp;amp; 0 \\ -1 &amp;amp; 0 &amp;amp; 0 \\ 0 &amp;amp; 0 &amp;amp; 0 \end{array}\right)\]$&lt;br /&gt;
&lt;br /&gt;
$[U_E,E_E,V_E ] = SVD(E)$&lt;br /&gt;
&lt;br /&gt;
$R = UWV^T  or  R = UW^T V^T$&lt;br /&gt;
&lt;br /&gt;
$t = U_E*[0 0 1]^T  or  t = -U_E*[0 0 1]^T$&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;Thus now there are four sets of possible rotation and translation pairs. (p. 258 - 259)&lt;br /&gt;
&lt;br /&gt;
The correct rotation and translation is the pair that creates (i.e. triangulates) points in front of both cameras. First, the project matrices have to be computed (see Projection Matrices), this will give $P_1$ and $P_2$. Next, one image pair has to be triangulated (see Triangulation), creating a 3D point $X$. The depth with a positive value for both project matrices and the 3D point will indicate the correct rotation and translation pair. This is done by (p162):&lt;/div&gt;&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;br /&gt;
$X=(X,Y,Z,T)^T$&lt;br /&gt;
&lt;br /&gt;
$P=[ M | p_4 ]$&lt;br /&gt;
&lt;br /&gt;
$depth(X,P) = \frac{ sign(det(M)) * w }{T * ||m^3||}$&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Projection Matrices&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;Computing the projection matrices is a simple task of putting all the information together. Note that the first projection matrix set to origin (0,0,0) with no rotation and translation.&lt;/div&gt;&lt;br /&gt;
&lt;div style="text-align: center;"&gt;$P_1 = \[\left(\begin{array}{ccc} 1 &amp;amp; 0 &amp;amp; 0 \\ 0 &amp;amp; 1 &amp;amp; 0 \\ 0 &amp;amp; 0 &amp;amp; 1 \end{array}\right)\]$&lt;br /&gt;
&lt;br /&gt;
$P_2 = K * [R,t]$&lt;/div&gt;&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Triangulation&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_xT3i45NE5tw/S-oVQZmjgnI/AAAAAAAAAQk/2NKQn8YamyI/s1600/triangulation.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="244" src="http://3.bp.blogspot.com/_xT3i45NE5tw/S-oVQZmjgnI/AAAAAAAAAQk/2NKQn8YamyI/s320/triangulation.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;In a perfect scenario, two rays extending from the points would intersect at a point in space. However, because of slight errors in the point correspondences the two points would never intersect or would intersect at the wrong point in space. The optimal triangulation algorithm brings the points closer to their respective epipolar lines (the plane that intersects the two cameras and the 3d point) so they intersect at a more accurate point in space [4, p318]. The final step of the algorithm is the actual triangulation. The algorithm is performed for every correspondence between the two images creating a point cloud.&lt;/div&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;The final step is the creation of the 3D model. This can be approached in various ways. For a simple mesh creation, MATLAB’s Delaunay function proved to yield good results. Texture for each triangle face can be taken from corresponding three points on either image. The issue with method is that it won’t work if any of the three points lay on a different plane. The better method is to create a dense point cloud that has the color information for every vertex. For output, a good model format is OBJ as it has an easy to follow textual representation for the model and is supported in many different model editors.&lt;/div&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: x-large;"&gt;Model Creation&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_xT3i45NE5tw/S-oU3lTqXnI/AAAAAAAAAQg/HC9tiGLX-HQ/s1600/101.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="209" src="http://1.bp.blogspot.com/_xT3i45NE5tw/S-oU3lTqXnI/AAAAAAAAAQg/HC9tiGLX-HQ/s320/101.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Textured OBJ model viewed in MeshLab&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;Additionally, external applications such as MeshLab and Blender have proven useful. MeshLab has many point cloud to mesh construction algorithms under &lt;i&gt;Filters &amp;gt; Remeshing, Simplification, and Reconstruction&lt;/i&gt;. Noteworthy reconstruction algorithms include &lt;i&gt;Ball Pivoting Surface Reconstruction&lt;/i&gt; algorithm and &lt;i&gt;Poisson Reconstruction&lt;/i&gt;. Texturing can be accomplished in Blender by UV mapping using the images.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/938919081230706447-8838401594997381302?l=srand2.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/dYNv25cUp2-NYFnPc4uIwgRJR1w/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dYNv25cUp2-NYFnPc4uIwgRJR1w/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/dYNv25cUp2-NYFnPc4uIwgRJR1w/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dYNv25cUp2-NYFnPc4uIwgRJR1w/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RandomIi/~4/9eh_g36ktpQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://srand2.blogspot.com/feeds/8838401594997381302/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://srand2.blogspot.com/2010/04/model-reconstruction-from-images.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/8838401594997381302?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/8838401594997381302?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RandomIi/~3/9eh_g36ktpQ/model-reconstruction-from-images.html" title="Model Reconstruction from Images" /><author><name>srand</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_xT3i45NE5tw/SaiOMjUla8I/AAAAAAAAACc/7s3qOvpNPbY/S220/smrpg_boshi.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_xT3i45NE5tw/S9S4JoN3w_I/AAAAAAAAAPU/tsBU3K2hcGY/s72-c/eye.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://srand2.blogspot.com/2010/04/model-reconstruction-from-images.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4BSXczeip7ImA9WxFRFUU.&quot;"><id>tag:blogger.com,1999:blog-938919081230706447.post-5077088697033566501</id><published>2010-02-21T19:24:00.006-05:00</published><updated>2010-04-29T20:55:58.982-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-29T20:55:58.982-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tips and fixes" /><category scheme="http://www.blogger.com/atom/ns#" term="hardware" /><title>HTC Touch Pro Keyboard Fix</title><content type="html">&lt;span style="font-size: large;"&gt;Update&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;Two months later my keyboard stopped working again. I followed my own fix but it didn't work. I bought a new keyboard from eBay for $26 and installed it. No problems yet. Side note, I had to buy a Phillips size #000 screw driver to remove the four screws holding the keyboard to the sliding bracket. Again, this &lt;a href="http://www.youtube.com/watch?v=8Xsq-FsSY88"&gt;video&lt;/a&gt; on replacing the keyboard was useful.&lt;/div&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;Recently the keyboard on my Sprint HTC Touch Pro stopped working. I also didn't have the phone insurance plan (d'oh!) so I couldn't send it in to get it fixed without costing to much. So I did some research and found that when pushing down hard on the space key on the keyboard it makes the keyboard work again. This actually worked, however, it did not last. After a week of on and off keyboard functionality I decided it was time to dig deeper for a solution by opening the phone. Below the space key on keyboard is the keyboard's connector to the cellphone. It seems that the connector gets loose or the solder doesn't correctly make the connection. The solution is to push down on the solder so it makes the connection firm again.&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;Warning:&lt;/b&gt; Disassembling the phone WILL void your warranty and MAY damage your phone. Only do this if you feel comfortable dealing with electronics.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Tools&lt;/b&gt;&lt;br /&gt;
&lt;a href="http://en.wikipedia.org/wiki/Torx"&gt;Torx&lt;/a&gt; screw driver with T-6 head&lt;br /&gt;
Flathead screw driver (Recommend 3.0mm)&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_xT3i45NE5tw/S4HGYrl5dVI/AAAAAAAAANA/rF-mmhq9UHs/s1600-h/tools.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="113" src="http://4.bp.blogspot.com/_xT3i45NE5tw/S4HGYrl5dVI/AAAAAAAAANA/rF-mmhq9UHs/s320/tools.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;(Top) Torx screw driver, with T-6 Head&lt;br /&gt;
(Bottom) 3.0mm flathead screw driver&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Before we begin,&amp;nbsp;this&amp;nbsp;video&amp;nbsp;on&amp;nbsp;&lt;a href="http://www.youtube.com/watch?v=8Xsq-FsSY88"&gt;keyboard replacement&lt;/a&gt;&amp;nbsp;might be helpful in see how the phone looks on the inside. However, we will not be replacing the keyboard.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Directions&lt;/b&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Turn off the cellphone, remove the back cover and remove the battery. &lt;/li&gt;
&lt;li&gt;Unscrew the 4 Torx&amp;nbsp;screws from the back. The screw in the top left has a sticker over it, removing this will most likely void the&amp;nbsp;warranty.&lt;/li&gt;
&lt;li&gt;Using the flathead screw driver, push down on the edges to pop out the keyboard. The keyboard should slowly push out on the other side. Work your way around the keyboard a few times. Alternatively, you can run the flathead screw driver or your finger nail around between the keyboard and the chrome frame until it pops out.&lt;/li&gt;
&lt;li&gt;Once the keyboard is free, lift the side up next to the volume keys. Note: the keyboard frame is connected on BOTH sides, therefore it will not become fully detach, careful not to yank out the connector on the other side. &lt;/li&gt;
&lt;li&gt;Lift up the orange cable directly below the space key.&lt;/li&gt;
&lt;li&gt;Take the flathead screw driver and gently push down on the connector area. This should make the keyboard connection more firm.&lt;/li&gt;
&lt;li&gt;Push the orange cable back down and put everything back.&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;Now the keyboard should be working again, enjoy. :-)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;b&gt;Images&lt;/b&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_xT3i45NE5tw/S4HJvKiPulI/AAAAAAAAANE/k_ZbIQwFADI/s1600-h/keyboard%20connector.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="147" src="http://4.bp.blogspot.com/_xT3i45NE5tw/S4HJvKiPulI/AAAAAAAAANE/k_ZbIQwFADI/s320/keyboard%20connector.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Keyboard cable (lift up)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_xT3i45NE5tw/S4HJvQRA1-I/AAAAAAAAANI/NukogqaZqyU/s1600-h/photo%282%29.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="188" src="http://1.bp.blogspot.com/_xT3i45NE5tw/S4HJvQRA1-I/AAAAAAAAANI/NukogqaZqyU/s320/photo%282%29.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Keyboard connector (push down)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;a href="http://forum.ppcgeeks.com/showthread.php?t=62876"&gt;Additional images&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/938919081230706447-5077088697033566501?l=srand2.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_0EwbCYWOw588Mdbms6r1oPXN2k/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_0EwbCYWOw588Mdbms6r1oPXN2k/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_0EwbCYWOw588Mdbms6r1oPXN2k/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_0EwbCYWOw588Mdbms6r1oPXN2k/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RandomIi/~4/iyo8-7Th8cY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://srand2.blogspot.com/feeds/5077088697033566501/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://srand2.blogspot.com/2010/02/fixing-htc-touch-pro-keyboard.html#comment-form" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/5077088697033566501?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/5077088697033566501?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RandomIi/~3/iyo8-7Th8cY/fixing-htc-touch-pro-keyboard.html" title="HTC Touch Pro Keyboard Fix" /><author><name>srand</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_xT3i45NE5tw/SaiOMjUla8I/AAAAAAAAACc/7s3qOvpNPbY/S220/smrpg_boshi.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_xT3i45NE5tw/S4HGYrl5dVI/AAAAAAAAANA/rF-mmhq9UHs/s72-c/tools.png" height="72" width="72" /><thr:total>5</thr:total><feedburner:origLink>http://srand2.blogspot.com/2010/02/fixing-htc-touch-pro-keyboard.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YBRnkycCp7ImA9WxNaEE8.&quot;"><id>tag:blogger.com,1999:blog-938919081230706447.post-644521759557082811</id><published>2009-11-23T21:08:00.001-05:00</published><updated>2009-11-23T21:19:17.798-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-23T21:19:17.798-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="software testing" /><category scheme="http://www.blogger.com/atom/ns#" term="Windows" /><title>Microsoft Notepad Bug</title><content type="html">In my probing of Notepad I've found a bug in the Find dialog:&lt;br /&gt;
&lt;br /&gt;
OS: Windows XP SP 3 (Version 5.1.2600)&lt;br /&gt;
In the Find dialog box it allows one to enter a number of characters (unlimited?). However it only looks at the first &lt;b&gt;128 &lt;/b&gt;characters entered in the Find box. This could be misleading when somebody pastes a long string into the find dialog box. Additionally, when you reach the end of the search, when it prints out the string it cannot find it mentions only the first 128 characters. Find only does search for the first 128 characters, but it doesn't explicitly make it clear.&lt;br /&gt;
&lt;br /&gt;
Below is an example when I tried entering 128 characters of 'a' then typing in 'ignored'. The image show how 'ignored' is not part of the search: finds the first 128 characters and when at the end of the find it displays that it cannot find the only the first 128 characters of the find string.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_xT3i45NE5tw/Sws-dsMcVKI/AAAAAAAAAMc/UT_6xCMKzvY/s1600/notepad_bug.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="166" src="http://2.bp.blogspot.com/_xT3i45NE5tw/Sws-dsMcVKI/AAAAAAAAAMc/UT_6xCMKzvY/s400/notepad_bug.PNG" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Thoughts &amp;amp; Fixes:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Allow only 128 characters to be entered into the Find text box.&lt;/li&gt;
&lt;li&gt;When more than 128 characters get pasted into the Find text box have a message bubble explaining that the text was truncated. &lt;/li&gt;
&lt;li&gt;Notepad++ seems to suffer from a similar issue in not explicitly making the user aware that its only searching for only first number of characters. However, Notepad++ actually cuts the string off after you execute the search, which implicitly tells the user that only the first number of characters were searched. Notepad only does this after you perform the search, close the Find dialog and reopen it, does it cut off the find string.&lt;br /&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/938919081230706447-644521759557082811?l=srand2.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/s5ZV4Wmla-G0Y8PES4kiM-gt96E/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/s5ZV4Wmla-G0Y8PES4kiM-gt96E/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/s5ZV4Wmla-G0Y8PES4kiM-gt96E/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/s5ZV4Wmla-G0Y8PES4kiM-gt96E/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RandomIi/~4/dkskVwobha4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://srand2.blogspot.com/feeds/644521759557082811/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://srand2.blogspot.com/2009/11/microsoft-notepad-bug.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/644521759557082811?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/644521759557082811?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RandomIi/~3/dkskVwobha4/microsoft-notepad-bug.html" title="Microsoft Notepad Bug" /><author><name>srand</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_xT3i45NE5tw/SaiOMjUla8I/AAAAAAAAACc/7s3qOvpNPbY/S220/smrpg_boshi.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_xT3i45NE5tw/Sws-dsMcVKI/AAAAAAAAAMc/UT_6xCMKzvY/s72-c/notepad_bug.PNG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://srand2.blogspot.com/2009/11/microsoft-notepad-bug.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE8CRXYyeSp7ImA9WxNbGU0.&quot;"><id>tag:blogger.com,1999:blog-938919081230706447.post-7421498262500233211</id><published>2009-11-22T00:11:00.002-05:00</published><updated>2009-11-22T11:21:04.891-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-22T11:21:04.891-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="testing" /><category scheme="http://www.blogger.com/atom/ns#" term="software tester" /><title>Software Testing: Overview</title><content type="html">Here's my condensing of Wikipedia's &lt;a href="http://en.wikipedia.org/wiki/Software_testing"&gt;Software Testing&lt;/a&gt; and a few sub pages.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Software testing can’t make your code 100% bug free, but give more confidence it has less bugs.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Software Testing Topics&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Functional vs. non-functional testing&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;Functional testing&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;verify a specific action or function of the code&lt;/li&gt;
&lt;li&gt;Can the user do this?&lt;/li&gt;
&lt;li&gt;Does this particular feature work?&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;Non-functional testing&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;May not be related to a specific function or user action (i.e., scalability or security)&lt;/li&gt;
&lt;li&gt;How many people can log in at once?&lt;/li&gt;
&lt;li&gt;How easy is it to hack this software?&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;ul&gt;&lt;/ul&gt;&lt;span style="font-size: large;"&gt;Defects and Failures&lt;/span&gt;&lt;br /&gt;
Software defected that is not caused by coding errors. A programmer makes an error (mistake) which results in a defect (fault, bug) in the software source code. If this defect is executed, in certain situations the system will produce wrong results, causing failure.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Requirement gaps (unrecognized requirements)&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;Non-functional requirements: testability, scalability, maintainability, usability, performance, and security&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Important to find faults early: Requirements -&amp;gt; Architecture -&amp;gt; Construction&lt;/li&gt;
&lt;li&gt;Test is the last step before release, important to find defects now or 10x more costly in post-release&lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-size: large;"&gt;Compatibility&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Frequent cause of software failure is compatibility with another application, new operating systems, or web browser version&lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-size: large;"&gt;Input combinations and preconditions&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Testing under all combinations of inputs and preconditions is not feasible &lt;/li&gt;

&lt;ul&gt;&lt;li&gt;Non-functional quality (how it is supposed to be versus what is supposed to do)&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;Scalability, performance, compatibility, reliability&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;/ul&gt;&lt;span style="font-size: large;"&gt;Static vs. dynamic testing&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;Static Testing&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Reviews, walkthroughs, or inspections&lt;/li&gt;
&lt;li&gt;Unfortunately often omitted&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;Dynamic testing&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Executing programmed code with a given set of test cases&lt;/li&gt;
&lt;li&gt;Can start before program is complete (testing modules or discrete functions)&lt;/li&gt;
&lt;li&gt;Drivers or debugger&lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-size: large;"&gt;Software verification and validation&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;Verification&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Have we built the software right? (I.e., does it match the specification)&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;Validation&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Have we built the right software? (i.e., is this what the customer wants)&lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-size: large;"&gt;Software Testing Team&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Manager, test lead, test designer, tester, automation developers, and test administrator &lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-size: large;"&gt;Software Quality Assurance (SQA)&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;* Examine the and change the software engineering process itself to reduce the amount of faults – defect rate&lt;/li&gt;
&lt;li&gt;* Mission critical vs. Non-mission critical &lt;/li&gt;

&lt;ul&gt;&lt;li&gt;Banking software vs. MS Calc&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;&lt;span style="font-size: x-large;"&gt;Testing Methods&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;The Box Approach&lt;/span&gt;&lt;br /&gt;
Black box testing vs. white box testing are different point of views that a test engineer takes when designing test cases.&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Black Box Testing&lt;/span&gt;&lt;br /&gt;
Black Box Testing is done without any knowledge of internal implementation.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;* Equivalence Partitioning &lt;/li&gt;

&lt;ul&gt;&lt;li&gt;o Divides the input data into partition of data&amp;nbsp; from the test cases can be derived&lt;/li&gt;
&lt;li&gt;o Test cases are designed to cover each partition at least once&lt;/li&gt;
&lt;li&gt;o Example (input: months expressed as integers, the input parameter 'month' might have the following partitions)&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ... -2 -1&amp;nbsp; 0 1 .............. 12 13&amp;nbsp; 14&amp;nbsp; 15 ..... &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --------------|-------------------|---------------------&lt;br /&gt;
&amp;nbsp;invalid partition 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; valid partition&amp;nbsp;&amp;nbsp;&amp;nbsp; invalid partition 2&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;* Boundary Value Analysis&lt;/li&gt;
&lt;/ul&gt;&lt;ul style="margin-left: 40px;"&gt;&lt;ul&gt;&lt;li&gt;o Tests are designed to include representatives of boundary values. Values on the edge of an equivalence partition or at the smallest value on either side of an edge. Common locations for errors that result in software faults. Frequently exercised in test cases.&lt;/li&gt;
&lt;li&gt;o Example (input: months expressed as integers, the input parameter 'month' might have the following partitions), pick values before, on, and after boundary:&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ... -2 -1&amp;nbsp; 0 1 .............. 12 13&amp;nbsp; 14&amp;nbsp; 15 ..... &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ---------------|-----------------|---------------------&lt;br /&gt;
invalid partition 1&amp;nbsp;&amp;nbsp; valid partition&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; invalid partition 2&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;All-Pairs Testing&lt;/b&gt;&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;For each pair of input parameters to a system, tests all possible discrete combinations of those parameters. Tests can be parallelized. &lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;b&gt;Fuzz Testing&lt;/b&gt;&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;Provides invalid, unexpected, or random data to the inputs of a program. Looks for when program fails (i.e., crashing).&lt;/li&gt;
&lt;li&gt;Areas of interest: file formats, networking protocols, environment variables, keyboard/mouse events, sequences of API calls, (even parts not considered “input): databases, shared memory, precise interleaving of threads.&lt;/li&gt;
&lt;li&gt;Inputting random stream of bits to applications&lt;/li&gt;
&lt;li&gt;Can find memory leaks (useful in languages like C/C++)&lt;/li&gt;
&lt;li&gt;Negative testing&lt;/li&gt;
&lt;li&gt;Security: Interesting areas cross trust boundaries&lt;/li&gt;
&lt;li&gt;Bug finding tool rather than quality assurance&lt;/li&gt;
&lt;li&gt;Pros&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;Increases security and safety&lt;/li&gt;
&lt;li&gt;Creates tests with odd data&lt;/li&gt;
&lt;li&gt;Can find exploitable bugs&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Cons&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;Needs mature specifications, as fuzzing is based on this&lt;/li&gt;
&lt;li&gt;Proprietary protocols make it difficult to generalize fuzzing methods&lt;/li&gt;
&lt;li&gt;Code coverage can be poor&lt;/li&gt;
&lt;li&gt;Simple faults&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;b&gt;Model-Based Testing&lt;/b&gt;&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;Test cases are derived from a model that describes (usually functional) aspects of the system&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;b&gt;Traceability Matrix&lt;/b&gt;&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;Table that correlates two relationships to determine completeness of the relationships&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;b&gt;Exploratory Testing&lt;/b&gt;&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;Learning, test design and test execution&lt;/li&gt;
&lt;li&gt;Pros&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;Less preparation&lt;/li&gt;
&lt;li&gt;Important bugs found quickly&lt;/li&gt;
&lt;li&gt;do not have to complete a series of scripted tests&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Cons&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;Dependent on testing&amp;nbsp; skills&lt;/li&gt;
&lt;li&gt;Tests can’t be reviewed (unlike scripted testing)&lt;/li&gt;
&lt;li&gt;Reproducing the test is difficult &lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Use when requirements and specifications are incomplete or if there is a lack of time.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Specification-Based Testing&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;Test the functionality of software according to requirements &lt;/li&gt;
&lt;li&gt;Pros&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;No ‘bonds’ with the code, has the “tester” mentality&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Cons&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;Walking in the dark (tester doesn’t understand how code works)&lt;/li&gt;
&lt;li&gt;Tester could over or miss areas of the code&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;/ul&gt;&lt;span style="font-size: large;"&gt;White Box Testing&lt;/span&gt;&lt;br /&gt;
Access to internal data structures and algorithms&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Types of white box testing&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;API Testing&lt;/b&gt; – Testing of the application using Public and Private API calls&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Code Coverage&lt;/b&gt; – creating tests to satisfy some criteria of code coverage (e.g., the test designer can create tests to cause all statements in the program to be executed at least once)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Fault Injection&lt;/b&gt; methods – improving the coverage of a test by introducing faults to test code paths&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Mutation Testing&lt;/b&gt; methods – modifying program’s source code in small ways, and any tests which pass after code has been mutate are defective. &lt;/li&gt;
&lt;li&gt;&lt;b&gt;Static Testing&lt;/b&gt; – white box testing includes all static testing&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;Test Coverage&lt;/b&gt;&lt;br /&gt;
White box testing methods can also be used to evaluate the completeness of a test suite created with black box testing methods.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Grey Box Testing&lt;/span&gt;&lt;br /&gt;
Access to internal data structures and algorithms for purposes of designing the test cases but testing at the black-box level&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;May include reverse engineering&lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-size: x-large;"&gt;Testing Levels&lt;/span&gt;&lt;br /&gt;
Grouped by where they are added in the software development process or by the level of specificity of the test&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Unit Testing&lt;/span&gt;&lt;br /&gt;
Tests that verify the functionality of a specific section of code, usually at the function level&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;May have multiple tests for one function&lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-size: large;"&gt;Integration Testing&lt;/span&gt;&lt;br /&gt;
Seeks to verify the interfaces between components against a software design&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Individual software modules are combined and tested as a group&lt;/li&gt;
&lt;li&gt;Purpose is to verify functional, performance, and reliability requirements placed on major design items&lt;/li&gt;
&lt;li&gt;Occurs after unit testing and before system testing&lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-size: large;"&gt;System Testing&lt;/span&gt;&lt;br /&gt;
Tests a completely integrated system to verify that it meets requirements&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;System Integration Testing&lt;/span&gt;&lt;br /&gt;
Verifies that a system is integrated to any external or third party systems defined in the system requirements&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Regression Testing&lt;/span&gt;&lt;br /&gt;
Focuses on finding defects after a major code change has occurred &lt;br /&gt;
Seeks to find old bugs that have come back&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Acceptance Testing&lt;/span&gt;&lt;br /&gt;
Black-box testing performed on a system prior to its delivery&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Alpha Testing&lt;/span&gt;&lt;br /&gt;
Simulated or actual operational testing by potential users/customers or an independent test team&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Beta Testing&lt;/span&gt;&lt;br /&gt;
Released to a limited audience outside of the programming team&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Non-Functional Software Testing&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Software performance testing, including Load Testing&lt;/span&gt;&lt;br /&gt;
Checks to see if software can handle large quantities of data or users&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Performance Testing&lt;/li&gt;
&lt;li&gt;Load Testing&lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-size: large;"&gt;Stability Testing&lt;/span&gt;&lt;br /&gt;
Checks to see if the software can continuously function well in or above an acceptable period&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Usability Testing&lt;/span&gt;&lt;br /&gt;
Check if the user interface is easy to use and understand&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Security Testing&lt;/span&gt;&lt;br /&gt;
Essential for software that processes confidential data to prevent system intrusion by hackers&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Internationalization and localization&lt;/span&gt;&lt;br /&gt;
Needed to test these aspects of software for which pseudo-localization is method can be used&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Destructive Testing&lt;/span&gt;&lt;br /&gt;
Attempts to cause the software or a sub-system to fail, in order to test its robustness&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;The Testing Process&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Traditional CMMI or waterfall development model&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Performed by an independent group of testers after the functionality is developed before it is shipped to the customer&lt;/li&gt;
&lt;li&gt;Could compromise the time devoted to testing&lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-size: large;"&gt;Agile or Extreme development model&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Test-driven software development&lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-size: large;"&gt;A Sample Testing Cycle&lt;/span&gt;&lt;br /&gt;
Waterfall development model&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Requirements analysis&lt;/li&gt;
&lt;li&gt;Test planning&lt;/li&gt;
&lt;li&gt;Test development&lt;/li&gt;
&lt;li&gt;Test execution&lt;/li&gt;
&lt;li&gt;Test reporting&lt;/li&gt;
&lt;li&gt;Test result analysis&lt;/li&gt;
&lt;li&gt;Defect retesting&lt;/li&gt;
&lt;li&gt;Regression testing&lt;/li&gt;
&lt;li&gt;Test closure&lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-size: x-large;"&gt;Automated Testing&lt;/span&gt;&lt;br /&gt;
Used in Test-driven development&lt;br /&gt;
Continuous Integration software will run tests automatically every time code is checked into a version control system&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Testing Tools&lt;/span&gt;&lt;br /&gt;
Testing/debug tools include features such as:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Program monitors, permitting full or partial monitoring of program code:&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;Instruction Set Simulator – complete instruction level monitoring and trace&lt;/li&gt;
&lt;li&gt;Program animation – step-by-step execution and conditional breakpoints&lt;/li&gt;
&lt;li&gt;Code coverage reports&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Formatted dump or Symbolic Debugging – inspection of program variables&lt;/li&gt;
&lt;li&gt;Automated functional GUI testing tools are used to repeat system-level tests through GUI&lt;/li&gt;
&lt;li&gt;Benchmarks – run-time performance&lt;/li&gt;
&lt;li&gt;Performance analysis (or profiling tools) – highlighting hot spots and resource usage&lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-size: large;"&gt;Measuring Software Testing&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;ISO 9126: reliability, efficiency, portability, maintainability, compatibility, usability&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Testing Artifacts&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Test plan – test specification&lt;/li&gt;
&lt;li&gt;Traceability matrix – correlates requirements or design documents to test documents. It is used to change tests when the source documents are changed, or to verify that the test results are correct&lt;/li&gt;
&lt;li&gt;Test case – id, requirement references from a design specification, preconditions, events, a series of steps to follow, input, output, expected result, and actual result.&lt;/li&gt;
&lt;li&gt;Test script – combination of a test case, test procedure, and test data&lt;/li&gt;
&lt;li&gt;Test suite – collection of test cases&lt;/li&gt;
&lt;li&gt;Test data – multiple sets of values or data are used to test the same functionality of a particular feature.&lt;/li&gt;
&lt;li&gt;Test harness – software, tools, samples of data input and output, and configurations&lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-size: x-large;"&gt;Types of Test Cases&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Positive Test&lt;/span&gt;&lt;br /&gt;
Does it work when it gets good data?&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Negative Test&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt; &lt;/span&gt;Does it work when it gets bad data?&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Probe Test&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt; &lt;/span&gt;How does it handle when somebody tries to break it (usually with bad data)?&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Sources&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Software_testing"&gt;Wikipedia - Software Testing&lt;/a&gt; and related pages. &lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Portal:Software_Testing"&gt;Wikipedia - Software Testing Portal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/938919081230706447-7421498262500233211?l=srand2.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/cjUPM0eAacfUE6R-iOKwYb-jMg8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cjUPM0eAacfUE6R-iOKwYb-jMg8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/cjUPM0eAacfUE6R-iOKwYb-jMg8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cjUPM0eAacfUE6R-iOKwYb-jMg8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RandomIi/~4/CLHR5ihHF8E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://srand2.blogspot.com/feeds/7421498262500233211/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://srand2.blogspot.com/2009/11/software-testing-overview_22.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/7421498262500233211?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/7421498262500233211?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RandomIi/~3/CLHR5ihHF8E/software-testing-overview_22.html" title="Software Testing: Overview" /><author><name>srand</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_xT3i45NE5tw/SaiOMjUla8I/AAAAAAAAACc/7s3qOvpNPbY/S220/smrpg_boshi.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://srand2.blogspot.com/2009/11/software-testing-overview_22.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEIER3kzeip7ImA9WxBWGEs.&quot;"><id>tag:blogger.com,1999:blog-938919081230706447.post-7284354793355533289</id><published>2009-11-21T23:24:00.002-05:00</published><updated>2010-02-11T00:35:06.782-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-11T00:35:06.782-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="windows7" /><category scheme="http://www.blogger.com/atom/ns#" term="testing" /><category scheme="http://www.blogger.com/atom/ns#" term="software tester" /><title>Windows 7 Paint Bug</title><content type="html">As I was testing the line feature in Microsoft Paint in Windows 7 (Version 6.1, Build 7600) I noticed a (small) bug in the line drawing behavior.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_xT3i45NE5tw/Swi7T8UAEmI/AAAAAAAAAMQ/VcgkbSD4KbQ/s1600/paintbug.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="197" src="http://2.bp.blogspot.com/_xT3i45NE5tw/Swi7T8UAEmI/AAAAAAAAAMQ/VcgkbSD4KbQ/s400/paintbug.png" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;When one draws a line (and before the line loses focus), I noticed that Rotate 180 degrees, Flip vertical, and Flip horizontal all don't work on the line. It seems as if a line gets treated differently as the other shapes (all other shapes have a dotted bounding box around them, whereas a line doesn't). However, its strange that Rotate left/right 90 degrees both work but Rotate 180 degrees doesn't -- maybe somebody just forgot?&lt;br /&gt;
&lt;br /&gt;
The issue can be resolved in one of two ways: gray out the three Rotate drop down options, or (better) implement the logic necessary to get the three malfunctioning rotates to work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/938919081230706447-7284354793355533289?l=srand2.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fnsSw-7iA9IhlSXi9-pBBtC442A/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fnsSw-7iA9IhlSXi9-pBBtC442A/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/fnsSw-7iA9IhlSXi9-pBBtC442A/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fnsSw-7iA9IhlSXi9-pBBtC442A/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RandomIi/~4/m9OZwvOK64E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://srand2.blogspot.com/feeds/7284354793355533289/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://srand2.blogspot.com/2009/11/windows-7-ms-paint-bug.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/7284354793355533289?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/7284354793355533289?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RandomIi/~3/m9OZwvOK64E/windows-7-ms-paint-bug.html" title="Windows 7 Paint Bug" /><author><name>srand</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_xT3i45NE5tw/SaiOMjUla8I/AAAAAAAAACc/7s3qOvpNPbY/S220/smrpg_boshi.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_xT3i45NE5tw/Swi7T8UAEmI/AAAAAAAAAMQ/VcgkbSD4KbQ/s72-c/paintbug.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://srand2.blogspot.com/2009/11/windows-7-ms-paint-bug.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MCRXwyfip7ImA9WxBWE0k.&quot;"><id>tag:blogger.com,1999:blog-938919081230706447.post-7101651476522299586</id><published>2009-11-17T18:35:00.005-05:00</published><updated>2010-02-04T22:44:24.296-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-04T22:44:24.296-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="windows mobile" /><category scheme="http://www.blogger.com/atom/ns#" term="tips and fixes" /><title>Tether Windows Mobile 6.5 to a Computer</title><content type="html">This method will show how to tether a Windows Mobile phone to your computer (namely a laptop) without the use of addition software.&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Service Provider:&lt;/b&gt; Sprint&lt;br /&gt;
&lt;b&gt;Phone:&lt;/b&gt; HTC Touch Pro (Windows Mobile 6.5)&lt;br /&gt;
&lt;b&gt;Computer:&lt;/b&gt; Windows XP (Active Sync installed but not running)&lt;br /&gt;
&lt;br /&gt;
1. Download and install &lt;a href="http://www.phm.lu/Products/PocketPC/RegEdit/"&gt;PHM Registry Editor&lt;/a&gt; on phone.&lt;br /&gt;
&lt;br /&gt;
2. Add/Edit the following values using the registry editor:&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
[HKEY_LOCAL_MACHINE\Comm\InternetSharing]&lt;br /&gt;
Extension=""&lt;br /&gt;
&lt;br /&gt;
[HKEY_LOCAL_MACHINE\Comm\InternetSharing\settings]&lt;br /&gt;
ForceCellConnection="Sprint"&lt;br /&gt;
&lt;br /&gt;
[HKEY_LOCAL_MACHINE\Comm\InternetSharing]&lt;br /&gt;
MaxCMCon=0&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
3. Connect phone to the computer's USB&lt;br /&gt;
&lt;br /&gt;
4. Open Internet Sharing, Click "Connect"&lt;br /&gt;
&lt;br /&gt;
Side note: Only port 80 (&lt;a href="http://en.wikipedia.org/wiki/Http"&gt;HTTP&lt;/a&gt;) connections are allowed to communicate, meaning only &lt;a href="http://en.wikipedia.org/wiki/Web_browser"&gt;browser&lt;/a&gt; related activity is allowed. Thus no external internet based applications will work, such as instant messaging. An easy work around is to use browser based applications such as &lt;a href="http://www.meebo.com/"&gt;Meebo&lt;/a&gt; for instant messaging.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/938919081230706447-7101651476522299586?l=srand2.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/XPPm7uUqjXwS5NLrHGnauQ1-zTY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XPPm7uUqjXwS5NLrHGnauQ1-zTY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/XPPm7uUqjXwS5NLrHGnauQ1-zTY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XPPm7uUqjXwS5NLrHGnauQ1-zTY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RandomIi/~4/EjNVOalNuVk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://srand2.blogspot.com/feeds/7101651476522299586/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://srand2.blogspot.com/2009/11/tethering-windows-mobile-65.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/7101651476522299586?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/7101651476522299586?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RandomIi/~3/EjNVOalNuVk/tethering-windows-mobile-65.html" title="Tether Windows Mobile 6.5 to a Computer" /><author><name>srand</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_xT3i45NE5tw/SaiOMjUla8I/AAAAAAAAACc/7s3qOvpNPbY/S220/smrpg_boshi.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://srand2.blogspot.com/2009/11/tethering-windows-mobile-65.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU8DSX45cSp7ImA9WxNbGU0.&quot;"><id>tag:blogger.com,1999:blog-938919081230706447.post-623599308978138045</id><published>2009-11-05T17:31:00.000-05:00</published><updated>2009-11-22T11:37:58.029-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-22T11:37:58.029-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="development" /><category scheme="http://www.blogger.com/atom/ns#" term="testing" /><category scheme="http://www.blogger.com/atom/ns#" term="software tester" /><title>Software Testing Overview</title><content type="html">&lt;span style="font-size: x-large;"&gt;Types of Test Cases&lt;/span&gt;&lt;br /&gt;
Ideally, you want to abstract your tests far back enough so you can apply it in different situations, but before you can do that you must have a clear picture of what could go wrong. Once you have a clear picture of the problem space, then you can create automated tests.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Happy/Positive Case&lt;/span&gt;&lt;br /&gt;
How the application or method behaves when given good input (errors or exceptions should not happen).&lt;br /&gt;
&lt;b&gt;Example&lt;/b&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
int divide( 10, 2 ) // 10 / 2, return 5&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Negative Case&lt;/span&gt;&lt;br /&gt;
How the application or method behaves when given bad input (errors or exceptions should happen).&lt;br /&gt;
&lt;b&gt;Example&lt;/b&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
int divide( 1, 0 ) // 1 / 0 should return error or throw exception&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Probe Case&lt;/span&gt;&lt;br /&gt;
How the application or method behaves when some one is tries to negatively manipulate the application. It is also important to note what the&amp;nbsp;application&amp;nbsp;is doing: is it a notepad program (relatively low damage) or is it the registry editor (relatively high damage). Accessing passwords (relatively high damage)? Character's money or level or stats in&amp;nbsp;multilayer&amp;nbsp;video game (relatively high damage) vs. offline single player game (relatively low damage). The list goes on.&lt;br /&gt;
&lt;b&gt;Example&lt;/b&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
void foo( garbageData, garbageData2 ) // Could one pass bad data and exploit the application?&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Usability Test&lt;/span&gt;&lt;br /&gt;
Not everyone thinks the same, especially when it comes to the programmer and the user. How does the application or method behave for other people? or Does the application behave like how the user would anticipate?&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Example: Testing a window&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Given&lt;/i&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_xT3i45NE5tw/SvskoqIJn1I/AAAAAAAAAMI/uiP6Nx2jAyA/s1600-h/find.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_xT3i45NE5tw/SvskoqIJn1I/AAAAAAAAAMI/uiP6Nx2jAyA/s400/find.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Test Notepad's Find window/dialog (yes this is purposely vague)&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;1. Read Documentation&lt;/span&gt;&lt;br /&gt;
Get the documentation for this window. This will will answer "How should the window behave?". This will create the initial questions.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;2. Make Test Table&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
To organize our test cases, we'll create a table of all possible tests. We'll start with labeling the headings of our tests:&lt;br /&gt;
&lt;table border="1"&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td&gt;Name / Area / Component&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;ID&lt;br /&gt;
&lt;/td&gt; &lt;td&gt;Description&lt;br /&gt;
&lt;/td&gt; &lt;td&gt;Requirements&lt;br /&gt;
&lt;/td&gt; &lt;td&gt;Test Category&lt;br /&gt;
&lt;/td&gt; &lt;td&gt;Author&lt;br /&gt;
&lt;/td&gt; &lt;td&gt;Automated&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Pass/Fail&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Remarks&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Make a list of things we see:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Window&lt;/li&gt;
&lt;li&gt;"Find" Window Title&lt;/li&gt;
&lt;li&gt;Window close button&lt;/li&gt;
&lt;li&gt;"Find what:" label&lt;/li&gt;
&lt;li&gt;Find text box&lt;/li&gt;
&lt;li&gt;"Find Next" button&lt;/li&gt;
&lt;li&gt;"Cancel" button&lt;/li&gt;
&lt;li&gt;"Match case" check box&lt;/li&gt;
&lt;li&gt;"Direction" group&lt;/li&gt;
&lt;li&gt;"Up" and "Down" radio buttons&lt;/li&gt;
&lt;li&gt;Accelerators on "Find what:", "Find Next", "Match case", "Up", "Down"&lt;/li&gt;
&lt;li&gt;Window theme&lt;/li&gt;
&lt;li&gt;Layout &amp;amp; Layout behavior&lt;/li&gt;
&lt;/ul&gt;Other items that we didn't see here but could have been tested: Drop Down List Boxes, Combo Boxes, List Boxes, menu bar, scroll bars, tabs.&lt;br /&gt;
&lt;br /&gt;
Now, compile into the table:&lt;br /&gt;
&lt;table border="1"&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td&gt;&lt;b&gt;Name&lt;/b&gt;&lt;br /&gt;
&lt;/td&gt; &lt;td&gt;&lt;b&gt;Description&lt;/b&gt;&lt;br /&gt;
&lt;/td&gt; &lt;td&gt;&lt;b&gt;Requirements&lt;/b&gt;&lt;br /&gt;
&lt;/td&gt; &lt;td&gt;&lt;b&gt;Category&lt;/b&gt;&lt;br /&gt;
&lt;/td&gt; &lt;td&gt;&lt;b&gt;Author&lt;/b&gt;&lt;br /&gt;
&lt;/td&gt; &lt;td&gt;&lt;b&gt;Automated&lt;/b&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;b&gt;Pass/Fail&lt;/b&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;b&gt;Remarks&lt;/b&gt;&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Window&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;"Find" Window Title&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Window Close Button&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;"Find what:" label&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Find text box&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;"Find Next" button&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;"Cancel" button&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;"Match case" check box&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;"Direction" group&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;"Up", "Down" radio buttons&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Accelerators on "Find what:", "Find Next", "Match case", "Up", "Down"&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Theme, Layout, Layout behavior&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;3. Write Tests&lt;/span&gt;&lt;br /&gt;
Perform tests: &lt;b&gt;Positive Test (PT)&lt;/b&gt;, &lt;b&gt;Negative Test (NT)&lt;/b&gt;, &lt;b&gt;Probe Test (PrT)&lt;/b&gt;, &lt;b&gt;Usability Test (UT)&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Fill out table with the tests&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;4. Beta Test&lt;/span&gt;&lt;br /&gt;
Once you are confident of your work while maintaining the invariants specified in the documentation, ask others for input. What does your developer think (if you didn't develop the item of test) or fellow developer? What does your lead think? What does the customer think?&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;5. Ship&lt;/span&gt;&lt;br /&gt;
Ship. Rinse. Repeat. As Jeff Atawood (play off &lt;a href="http://www.youtube.com/watch?v=TROhlThs9qY"&gt;Glengarry Glen Ross&lt;/a&gt;) says, &lt;a href="http://www.codinghorror.com/blog/archives/000809.html"&gt;Always Be Shipping&lt;/a&gt;. Assuming your application is now a solid product, some times the best testing is done by the community. Their criticism, tinkering, tearing apart of your application may be the only way to get the experience/evolution your application needs (or at least the drive to figure it out!).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/938919081230706447-623599308978138045?l=srand2.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VHs9HbiIbDlm8aBe51IoL--Da94/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VHs9HbiIbDlm8aBe51IoL--Da94/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VHs9HbiIbDlm8aBe51IoL--Da94/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VHs9HbiIbDlm8aBe51IoL--Da94/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RandomIi/~4/nkPL53SeuWA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://srand2.blogspot.com/feeds/623599308978138045/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://srand2.blogspot.com/2009/11/software-testing-overview.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/623599308978138045?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/623599308978138045?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RandomIi/~3/nkPL53SeuWA/software-testing-overview.html" title="Software Testing Overview" /><author><name>srand</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_xT3i45NE5tw/SaiOMjUla8I/AAAAAAAAACc/7s3qOvpNPbY/S220/smrpg_boshi.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_xT3i45NE5tw/SvskoqIJn1I/AAAAAAAAAMI/uiP6Nx2jAyA/s72-c/find.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://srand2.blogspot.com/2009/11/software-testing-overview.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcGSXo8fyp7ImA9WxNWGU0.&quot;"><id>tag:blogger.com,1999:blog-938919081230706447.post-5432032179617253060</id><published>2009-10-05T18:40:00.006-04:00</published><updated>2009-10-18T18:47:08.477-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-18T18:47:08.477-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="pointers" /><category scheme="http://www.blogger.com/atom/ns#" term="memory" /><category scheme="http://www.blogger.com/atom/ns#" term="C++" /><title>What's Wrong with this Code?</title><content type="html">&lt;pre&gt;&lt;code&gt;
doFoo()
{
  int x = 10;
  Foo *foo = new Foo();
  for ( int i = 0; i &amp;lt; 100; ++i )
  {
    x += i;
    foo-&amp;gt;add(x);
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Easy right? We forgot to free the memory associated with the pointer foo. This is what we call a &lt;a href="http://en.wikipedia.org/wiki/Memory_leak"&gt;memory leak&lt;/a&gt;!&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Fix:&lt;/b&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;
doFoo()
{
  int x = 10;
  Foo *foo = new Foo();

  for ( int i = 0; i &amp;lt; 100; ++i )
  {
    x += i;
    foo-&amp;gt;add(x);
  }
  
  &lt;b&gt;delete foo; // this frees up the memory associated with the pointer foo.&lt;/b&gt;
}
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
What if we had an array of Foo's ?&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;
 Foo *foos = new Foo[100];
 // ...
 delete [] foos;
&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/938919081230706447-5432032179617253060?l=srand2.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pkYb2gjRp3pvWHzbXfWJ70sFLrI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pkYb2gjRp3pvWHzbXfWJ70sFLrI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/pkYb2gjRp3pvWHzbXfWJ70sFLrI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pkYb2gjRp3pvWHzbXfWJ70sFLrI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RandomIi/~4/WVOmGR0oPYg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://srand2.blogspot.com/feeds/5432032179617253060/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://srand2.blogspot.com/2009/10/whats-wrong-with-this-code-i.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/5432032179617253060?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/5432032179617253060?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RandomIi/~3/WVOmGR0oPYg/whats-wrong-with-this-code-i.html" title="What's Wrong with this Code?" /><author><name>srand</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_xT3i45NE5tw/SaiOMjUla8I/AAAAAAAAACc/7s3qOvpNPbY/S220/smrpg_boshi.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://srand2.blogspot.com/2009/10/whats-wrong-with-this-code-i.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEIERn85cSp7ImA9WxNWGU0.&quot;"><id>tag:blogger.com,1999:blog-938919081230706447.post-3791635100651373555</id><published>2009-10-03T20:52:00.005-04:00</published><updated>2009-10-18T18:55:07.129-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-18T18:55:07.129-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="memory" /><title>Stack vs. Heap: Overview</title><content type="html">Both deal with how memory is managed&lt;br /&gt;
&lt;br /&gt;
&lt;table border="1" style="width: 100%;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: x-large;"&gt;Stack&lt;/span&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: x-large;"&gt;Heap&lt;/span&gt;&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Inside program (Program space)&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Outside program (Managed by OS)&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td valign="top"&gt;Fast&lt;br /&gt;
&lt;/td&gt;&lt;td valign="top"&gt;Slow (because of system calls to allocate memory)&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td valign="top"&gt;Run-time variables (function parameters, return address, return value, primitives)&lt;br /&gt;
&lt;/td&gt;&lt;td valign="top"&gt;Dynamically allocated variables (Objects)&lt;br /&gt;
Global and static variables &lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td valign="top"&gt;Stack variables are destroyed &lt;i&gt;automatically &lt;/i&gt;when out of scope &lt;br /&gt;
&lt;/td&gt;&lt;td valign="top"&gt;Heap variables are destroyed when &lt;i&gt;manually&lt;/i&gt; de-allocated&lt;br /&gt;
&lt;br /&gt;
Note: If memory is never de-allocated then a memory leak occurs&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td valign="top"&gt;needs initialization&lt;br /&gt;
&lt;/td&gt;&lt;td valign="top"&gt;needs allocation&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td valign="top"&gt;small memory space&lt;br /&gt;
&lt;br /&gt;
Note: If to much memory is allocated on the stack then we have a &lt;a href="http://en.wikipedia.org/wiki/Stack_overflow"&gt;stack overflow&lt;/a&gt;. This is dangerous because it can corrupt memory or cause exploitative code to be executed.&lt;br /&gt;
&lt;/td&gt;&lt;td valign="top"&gt;relatively large memory space&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Examples&lt;/span&gt;&lt;br /&gt;
&lt;code&gt;int i = 123;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // on stack&lt;br /&gt;
int stackArray[256];&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;          // also on stack&lt;br /&gt;
int *heapArray = new int[256]; // on heap&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Sources&lt;/span&gt;&lt;br /&gt;
&lt;a href="http://en.wikipedia.org/wiki/Stack-based_memory_allocation%20"&gt;Stack-based memory allocation &lt;/a&gt;&lt;br /&gt;
&lt;a href="http://en.wikipedia.org/wiki/Dynamic_memory_allocation"&gt;Dynamic memory allocation&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.computing.net/answers/programming/waht-is-stack-amp-heap/6345.html"&gt;What is stack &amp;amp; heap?&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.computing.net/answers/programming/heap-vs-stack/11004.html"&gt;Heap vs. Stack&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/938919081230706447-3791635100651373555?l=srand2.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xuO8RUsWmtbtF4Upza5YCd0xf6E/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xuO8RUsWmtbtF4Upza5YCd0xf6E/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xuO8RUsWmtbtF4Upza5YCd0xf6E/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xuO8RUsWmtbtF4Upza5YCd0xf6E/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RandomIi/~4/u_VzDDz57xg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://srand2.blogspot.com/feeds/3791635100651373555/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://srand2.blogspot.com/2009/10/stack-vs-heap-overview.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/3791635100651373555?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/3791635100651373555?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RandomIi/~3/u_VzDDz57xg/stack-vs-heap-overview.html" title="Stack vs. Heap: Overview" /><author><name>srand</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_xT3i45NE5tw/SaiOMjUla8I/AAAAAAAAACc/7s3qOvpNPbY/S220/smrpg_boshi.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://srand2.blogspot.com/2009/10/stack-vs-heap-overview.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8BQn8zfip7ImA9Wx9VGU8.&quot;"><id>tag:blogger.com,1999:blog-938919081230706447.post-7609387148949675640</id><published>2009-10-03T18:19:00.007-04:00</published><updated>2011-02-05T13:00:53.186-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-05T13:00:53.186-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="algorithms" /><category scheme="http://www.blogger.com/atom/ns#" term="sorting" /><title>Merge Sort vs. Quick Sort: Overview</title><content type="html">&lt;table border="1" height="217" style="margin-left: auto; margin-right: auto; text-align: left; width: 637px;"&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: x-large;"&gt;Merge Sort&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: x-large;"&gt;Quick Sort&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;Time complexity (Average): O(n log n)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;Time complexity (Average)&lt;/span&gt;: O(n log n)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td bgcolor="#008000"&gt;Time complexity (Worst): O(n log n)&lt;/td&gt;&lt;td&gt;Time complexity (Worst): O(n^2)&lt;br /&gt;
(Occurs when list is sorted)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td bgcolor="#008000"&gt;Stable sort&lt;br /&gt;
&lt;br /&gt;
Not dependent on any factors&lt;br /&gt;
Average case = Worst Case&lt;/td&gt;&lt;td&gt;Not a stable sort&lt;br /&gt;
&lt;br /&gt;
Dependent on randomness of list&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;Memory: O(n)&lt;br /&gt;
Additional memory space required&lt;/td&gt;&lt;td bgcolor="#008000"&gt;Memory: O(log n)&lt;br /&gt;
Memory Complexity (Best): O(1)&lt;br /&gt;
Little additional memory space required&lt;/td&gt;  &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;When to use Merge Sort? When additional memory usage is &lt;b&gt;not &lt;/b&gt;a problem and list could be partial sorted&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;When to use Quick Sort? When additonal memory usage is a problem and the list is randomized.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: small;"&gt;[Source: &lt;a href="http://en.wikipedia.org/wiki/Sorting_algorithm"&gt;Sorting Algorithm&lt;/a&gt;] &lt;br /&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/938919081230706447-7609387148949675640?l=srand2.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/WZGc5DlRYgAPyPXMRQbeoNZYKTM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WZGc5DlRYgAPyPXMRQbeoNZYKTM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/WZGc5DlRYgAPyPXMRQbeoNZYKTM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WZGc5DlRYgAPyPXMRQbeoNZYKTM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RandomIi/~4/yn97q8RdPhc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://srand2.blogspot.com/feeds/7609387148949675640/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://srand2.blogspot.com/2009/10/difference-between-merge-sort-and-quick.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/7609387148949675640?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/7609387148949675640?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RandomIi/~3/yn97q8RdPhc/difference-between-merge-sort-and-quick.html" title="Merge Sort vs. Quick Sort: Overview" /><author><name>srand</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_xT3i45NE5tw/SaiOMjUla8I/AAAAAAAAACc/7s3qOvpNPbY/S220/smrpg_boshi.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://srand2.blogspot.com/2009/10/difference-between-merge-sort-and-quick.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0EBRX47eSp7ImA9WxNQGUo.&quot;"><id>tag:blogger.com,1999:blog-938919081230706447.post-3653753802733828755</id><published>2009-09-26T11:34:00.001-04:00</published><updated>2009-09-26T11:40:54.001-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-26T11:40:54.001-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="blogger" /><category scheme="http://www.blogger.com/atom/ns#" term="tips and fixes" /><category scheme="http://www.blogger.com/atom/ns#" term="meta" /><title>Jump Breaks Broke the Blog -- and solution</title><content type="html">&lt;a href="http://1.bp.blogspot.com/_xT3i45NE5tw/Sr40Xb2zbII/AAAAAAAAAKw/04NBGnLkrV4/s1600-h/blogger-logo.JPG" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_xT3i45NE5tw/Sr40Xb2zbII/AAAAAAAAAKw/04NBGnLkrV4/s200/blogger-logo.JPG" /&gt;&lt;/a&gt;&lt;span style="font-size: x-large;"&gt;Problem&lt;/span&gt; &lt;br /&gt;
The people at Blogger added a &lt;a href="http://buzz.blogger.com/2009/09/you-might-as-well-jump.html"&gt;Jump Breaks&lt;/a&gt; for posts on the front page but for some reason it broke my front page layout. The right side menu is below all the posts. &lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Solution&lt;/span&gt;&lt;br /&gt;
The problem occurs when the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;!-- more --&amp;gt;&lt;/span&gt; tag is used between another (div) tag. So the simple fix is to make sure to close any tags before using a jump break, then reopen them after it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/938919081230706447-3653753802733828755?l=srand2.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ahhdpQvY-CqNxg3XI7AZniFd1oM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ahhdpQvY-CqNxg3XI7AZniFd1oM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ahhdpQvY-CqNxg3XI7AZniFd1oM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ahhdpQvY-CqNxg3XI7AZniFd1oM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RandomIi/~4/OmdMbJqVXWA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://srand2.blogspot.com/feeds/3653753802733828755/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://srand2.blogspot.com/2009/09/jump-breaks-broke-blog.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/3653753802733828755?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/3653753802733828755?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RandomIi/~3/OmdMbJqVXWA/jump-breaks-broke-blog.html" title="Jump Breaks Broke the Blog -- and solution" /><author><name>srand</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_xT3i45NE5tw/SaiOMjUla8I/AAAAAAAAACc/7s3qOvpNPbY/S220/smrpg_boshi.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_xT3i45NE5tw/Sr40Xb2zbII/AAAAAAAAAKw/04NBGnLkrV4/s72-c/blogger-logo.JPG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://srand2.blogspot.com/2009/09/jump-breaks-broke-blog.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8EQng-fCp7ImA9WxNRFko.&quot;"><id>tag:blogger.com,1999:blog-938919081230706447.post-8101129189281642043</id><published>2009-08-22T00:29:00.008-04:00</published><updated>2009-09-11T09:13:23.654-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-11T09:13:23.654-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="windows mobile" /><title>Windows Mobile Software Round-up</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_xT3i45NE5tw/SqE5reqMFtI/AAAAAAAAAJo/1z_sNBhSLEg/s1600-h/windows-mobile-logo.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_xT3i45NE5tw/SqE5reqMFtI/AAAAAAAAAJo/1z_sNBhSLEg/s200/windows-mobile-logo.png" /&gt;&lt;/a&gt;&lt;/div&gt;I recently got the HTC Touch Pro with the Windows Mobile 6.1 Pro operating system installed. Shortly after getting over the hype of my new device, I set out on finding quality software for the Windows Mobile. These are some of the top programs I found that work best on my Windows Mobile device:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;General/Interface&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://forum.xda-developers.com/showthread.php?t=381588"&gt;Slide2Unlock (S2U2)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ageye.de/index.php?s=galarm/about"&gt;G-Alarm&lt;/a&gt; (2nd place &lt;a href="http://www.koushikdutta.com/2008/07/klaxon-windows-mobile-g-sensor-enabled.html"&gt;Klaxon&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://forum.xda-developers.com/showthread.php?t=422367"&gt;TorchButton&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.microsoft.com/windowsmobile/en-us/downloads/facebook.mspx"&gt;Facebook&lt;/a&gt;: Dedicated Facebook application for Windows Mobile&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blogs.msdn.com/windowsmobile/archive/2009/01/19/microsoft-tag.aspx"&gt;TagReader&lt;/a&gt;: A special bar code reader that serves as basically Internet shortcuts.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.junefabrics.com/pdanet/index.php"&gt;PdaNet for Windows Mobile&lt;/a&gt;: Connect your PC/Laptop to the internet using the phone's cellular network (requires internet data plan). Useful when you can't find WIFI.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.google.com/mobile/products/youtube.html"&gt;YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.discoverbing.com/mobile/"&gt;Bing&lt;/a&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-size: large;"&gt;Tweaking&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.touchxperience.com/en/advanced-configuration-tool.html"&gt;Advanced Configuration Tool&lt;br /&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://wss.boman.biz/Lists/Posts/Post.aspx?ID=7"&gt;Mobile Monger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.phm.lu/Products/PocketPC/RegEdit/"&gt;PHM RegEdit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.touchxperience.com/en/advanced-task-manager.html"&gt;Advanced Task Manager&lt;/a&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-size: large;"&gt;Games&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.chessgenius.com/wm/index.html"&gt;ChessGenius&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.fredvonk.eu/downloads.htm"&gt;RushHour&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.freewarepocketpc.net/ppc-download-htc-light-saber-v1-0.html"&gt;Lightsaber&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-size: large;"&gt;Media&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/microfi-nitrogen/"&gt;Nitrogen&lt;/a&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.divx.com/mobile/requirements.php"&gt;DivX Player&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-size: large;"&gt;Instant Messaging&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://beta.aol.com/projects.php?project=aimwinmobile"&gt;AIM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.skype.com/intl/en/download/skype/windowsmobile/"&gt;Skype&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-size: large;"&gt;Web Browsers&lt;span style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.opera.com/mobile/"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;Opera Mobile&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mozilla.org/projects/fennec/1.0a1/releasenotes/"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://draft.blogger.com/post-edit.g?blogID=938919081230706447&amp;amp;postID=8101129189281642043"&gt;Fennec&lt;/a&gt; &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-size: large;"&gt;Misc. GPS/Internet Based&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.singerscreations.com/Software.asp"&gt;WeatherWatcher&lt;/a&gt; (2nd place &lt;a href="http://www.freewarepocketpc.net/ppc-download-iwindowsmobile-weather.html"&gt;Weather&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.google.com/mobile/default/maps.html"&gt;Google Maps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.navngo.com/pages/global/eng/igo_8_description"&gt;iGO &lt;/a&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;&lt;b&gt;Note: &lt;/b&gt;You'll need &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=E3821449-3C6B-42F1-9FD9-0041345B3385&amp;amp;displaylang=en"&gt;.NET Compact Framework 3.5 Redistributable&lt;/a&gt; for the programs to work. Look for the CAB file that matches your device in &lt;b&gt;C:\Program Files\Microsoft.NET\SDK\CompactFramework\v3.5\WindowsCE&lt;/b&gt;. For me it was &lt;b&gt;NETCFv35.wm.armv4i.cab&lt;/b&gt;.&lt;/div&gt;&lt;br /&gt;
&lt;hr /&gt;&lt;br /&gt;
&lt;b&gt;Update&lt;/b&gt;&lt;br /&gt;
Previously I mentioned &lt;a href="http://www.koushikdutta.com/search/label/Klaxon"&gt;Klaxon&lt;/a&gt; as my choice for the Windows Mobile alarm replacement, however (at its current state) it tends to run into problems with S2U2. Recently I found another WiMo alarm program called &lt;a href="http://www.ageye.de/index.php?s=galarm/skins"&gt;G-Alarm&lt;/a&gt; (which looks very similar to Klaxon) that has some cool features like having to do mazes or calculations before being able to disable/snooze the alarm, or having music play lists instead of alarms (recommend getting some soothing &lt;a href="http://www.partnersinrhyme.com/soundfx/Ambience.shtml"&gt;nature sounds&lt;/a&gt;). &lt;a href="http://www.ageye.de/index.php"&gt;AGEye&lt;/a&gt;, the creators of G-Alarm, also some other neat little applications on their site including a &lt;a href="http://www.ageye.de/index.php?s=gwatch/about"&gt;stop-watch&lt;/a&gt;, couple games, and some tweaking programs.&lt;br /&gt;
&lt;br /&gt;
Another program I highly recommend is the Windows Media Player replacement &lt;a href="http://code.google.com/p/microfi-nitrogen/"&gt;Nitrogen&lt;/a&gt;. Easy to use interface and responsiveness makes this a clear choice over the default software.&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;/ul&gt;If the software is free to use please remember to donate to (starving) the developers! :-)&lt;br /&gt;
and&lt;br /&gt;
If you've found some application that you would like to share please comment below!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/938919081230706447-8101129189281642043?l=srand2.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/qDMwzX6tjX6eUO1ePS33EwYWpDE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qDMwzX6tjX6eUO1ePS33EwYWpDE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/qDMwzX6tjX6eUO1ePS33EwYWpDE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qDMwzX6tjX6eUO1ePS33EwYWpDE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RandomIi/~4/j6T0eQPuLbQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://srand2.blogspot.com/feeds/8101129189281642043/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://srand2.blogspot.com/2009/02/windows-mobile-software-round-up.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/8101129189281642043?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/8101129189281642043?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RandomIi/~3/j6T0eQPuLbQ/windows-mobile-software-round-up.html" title="Windows Mobile Software Round-up" /><author><name>srand</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_xT3i45NE5tw/SaiOMjUla8I/AAAAAAAAACc/7s3qOvpNPbY/S220/smrpg_boshi.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_xT3i45NE5tw/SqE5reqMFtI/AAAAAAAAAJo/1z_sNBhSLEg/s72-c/windows-mobile-logo.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://srand2.blogspot.com/2009/02/windows-mobile-software-round-up.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4ESHg4eyp7ImA9WxNRFkk.&quot;"><id>tag:blogger.com,1999:blog-938919081230706447.post-557981879147226251</id><published>2009-08-19T16:26:00.002-04:00</published><updated>2009-09-11T00:21:49.633-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-11T00:21:49.633-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="meta" /><title>Blog Update</title><content type="html">&lt;div style="text-align: center;"&gt;&lt;/div&gt;Somebody at &lt;a href="http://www.reddit.com/"&gt;Reddit&lt;/a&gt; liked my article and mentioned in his comment in an Ask Proggit post: "&lt;a href="http://www.reddit.com/r/programming/comments/9abst/ask_proggit_are_you_using_dark_themes_on_your/"&gt;Are you using dark themes on your editors/IDEs? Is that any more eye friendly?&lt;/a&gt;". Below you can see a sharp spike in visitors.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_xT3i45NE5tw/SoxdVL_C7LI/AAAAAAAAAJI/YA24PWIFFj4/s1600-h/Vistors.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_xT3i45NE5tw/SoxdVL_C7LI/AAAAAAAAAJI/YA24PWIFFj4/s320/Vistors.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
But now we return to your regularly scheduled program of little visitor traffic. ;-P&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/938919081230706447-557981879147226251?l=srand2.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/wdpf_aMXKVL8iRCyZ6QPgysU_-U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wdpf_aMXKVL8iRCyZ6QPgysU_-U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/wdpf_aMXKVL8iRCyZ6QPgysU_-U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wdpf_aMXKVL8iRCyZ6QPgysU_-U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RandomIi/~4/OlgWUAvKx8w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://srand2.blogspot.com/feeds/557981879147226251/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://srand2.blogspot.com/2009/08/blog-update.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/557981879147226251?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/557981879147226251?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RandomIi/~3/OlgWUAvKx8w/blog-update.html" title="Blog Update" /><author><name>srand</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_xT3i45NE5tw/SaiOMjUla8I/AAAAAAAAACc/7s3qOvpNPbY/S220/smrpg_boshi.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_xT3i45NE5tw/SoxdVL_C7LI/AAAAAAAAAJI/YA24PWIFFj4/s72-c/Vistors.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://srand2.blogspot.com/2009/08/blog-update.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4CSXo9fip7ImA9Wx9UEEw.&quot;"><id>tag:blogger.com,1999:blog-938919081230706447.post-5966979117495076408</id><published>2009-08-08T02:52:00.015-04:00</published><updated>2011-02-06T12:56:08.466-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-06T12:56:08.466-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ide" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="Eclipse" /><title>Eclipse Java Color Themes</title><content type="html">&lt;div style="text-align: justify;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_xT3i45NE5tw/SuNF1r-SOjI/AAAAAAAAALo/Q-_0i8V1KMk/s1600-h/eclipse.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_xT3i45NE5tw/SuNF1r-SOjI/AAAAAAAAALo/Q-_0i8V1KMk/s200/eclipse.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;Eclipse isn't the best when it comes to customizations but with a few tricks we can alleviate some of the issues. One such issue is color themes. There is no easy way to export color settings (for creation of themes) but there are two files that hold the syntax and text editor coloring information.&lt;/div&gt;&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;Update&lt;/span&gt;&lt;br /&gt;
&lt;a href="http://www.eclipsecolorthemes.org/"&gt;Eclipse Color Themes&lt;/a&gt; (&lt;a href="http://www.eclipsecolorthemes.org/?view=how-to-use"&gt;how-to&lt;/a&gt;) by &lt;a href="http://www.rogerdudler.com/"&gt;Roger Dudler&lt;/a&gt; and &lt;a href="http://ubercode.de/blog"&gt;Felix Dahlke&lt;/a&gt; is a better method of importing themes into Eclipse. My method was just a&amp;nbsp;temporary&amp;nbsp;work around until a plug-in was written.&lt;br /&gt;
&lt;br /&gt;
&lt;hr /&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;Note: Files from and tested with Eclipse 3.5 (Galileo) using &lt;span style="font-weight: bold;"&gt;Java&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
The two main areas that control the IDE's coloring:&lt;/div&gt;&lt;br /&gt;
&lt;code&gt;Window | Preference | Java | Editor | Syntax Coloring&lt;br /&gt;
Window | Preference | General | Editors | Text Editors&lt;/code&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;These preferences are saved in:&lt;/div&gt;&lt;br /&gt;
&lt;code&gt;[workspace]\.metadata\.plugins\org.eclipse.core.runtime\.settings\org.eclipse.jdt.ui.prefs&lt;br /&gt;
[workspace]\.metadata\.plugins\org.eclipse.core.runtime\.settings\org.eclipse.ui.editors.prefs&lt;br /&gt;
&lt;b&gt;Linux/Mac&lt;/b&gt; [workspace]/.metadata/.plugins/org.eclipse.core.runtime/.settings/&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Where,&lt;br /&gt;
&lt;code&gt;org.eclipse.jdt.ui.prefs = Syntax Coloring&lt;br /&gt;
org.eclipse.ui.editors.prefs = Text Editors&lt;/code&gt;&lt;br /&gt;
So from that one can make, import, and export their preferences easily without editing the files manually.&lt;br /&gt;
&lt;br /&gt;
Here are some themes I've found (and created!)&lt;br /&gt;
&lt;br /&gt;
Default (Originally from &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt;)&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_xT3i45NE5tw/Sn0ST7Y-tPI/AAAAAAAAAHw/MofDANWJdB4/s1600-h/default.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_xT3i45NE5tw/Sn0ST7Y-tPI/AAAAAAAAAHw/MofDANWJdB4/s400/default.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Inkpot (Originally from &lt;a href="http://eclipsecolorthemes.jottit.com/"&gt;here&lt;/a&gt;)&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_xT3i45NE5tw/Sn0SmoEqhqI/AAAAAAAAAH4/YrozOnAjJXE/s1600-h/inkpot.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_xT3i45NE5tw/Sn0SmoEqhqI/AAAAAAAAAH4/YrozOnAjJXE/s400/inkpot.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;Vibrant Ink (Originally from &lt;a href="http://eclipsecolorthemes.jottit.com/"&gt;here&lt;/a&gt;)&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_xT3i45NE5tw/Sn0SrwyyeII/AAAAAAAAAII/1-IKY6zQhy0/s1600-h/vibrantink.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_xT3i45NE5tw/Sn0SrwyyeII/AAAAAAAAAII/1-IKY6zQhy0/s400/vibrantink.PNG" /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Wombat (Originally from &lt;a href="http://eclipsecolorthemes.jottit.com/"&gt;here&lt;/a&gt;)&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_xT3i45NE5tw/Sn0SwLqS2aI/AAAAAAAAAIQ/IwzaZbLrql8/s1600-h/wombat.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_xT3i45NE5tw/Sn0SwLqS2aI/AAAAAAAAAIQ/IwzaZbLrql8/s400/wombat.PNG" /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Sula (My theme)&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_xT3i45NE5tw/Sn3BOCMnHcI/AAAAAAAAAIg/wplDoCngIu0/s1600-h/sula.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_xT3i45NE5tw/Sn3BOCMnHcI/AAAAAAAAAIg/wplDoCngIu0/s400/sula.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Zenburn (&lt;a href="http://slinky.imukuppi.org/zenburnpage/"&gt;Jani Nurminen&lt;/a&gt;)&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_xT3i45NE5tw/Sn2_PxwerUI/AAAAAAAAAIY/j-xW2XK9ddQ/s1600-h/zenburn.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_xT3i45NE5tw/Sn2_PxwerUI/AAAAAAAAAIY/j-xW2XK9ddQ/s400/zenburn.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;a href="http://sites.google.com/site/srand2blogspot/eclipse-themes.zip"&gt;Download all files here&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Finally, there are more theme ideas that can be found at the StackOverflow post on &lt;a href="http://stackoverflow.com/questions/9951/what-color-scheme-do-you-use-for-programming"&gt;Color Schemes for Programming&lt;/a&gt;. If you've got a cool theme, post a link and I'll update the post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/938919081230706447-5966979117495076408?l=srand2.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/OHd5UGb7hCA1pzpYWFYys0T55Dk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OHd5UGb7hCA1pzpYWFYys0T55Dk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/OHd5UGb7hCA1pzpYWFYys0T55Dk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OHd5UGb7hCA1pzpYWFYys0T55Dk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RandomIi/~4/uWq5nrKCDe8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://srand2.blogspot.com/feeds/5966979117495076408/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://srand2.blogspot.com/2009/08/eclipse-color-themes.html#comment-form" title="27 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/5966979117495076408?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/5966979117495076408?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RandomIi/~3/uWq5nrKCDe8/eclipse-color-themes.html" title="Eclipse Java Color Themes" /><author><name>srand</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_xT3i45NE5tw/SaiOMjUla8I/AAAAAAAAACc/7s3qOvpNPbY/S220/smrpg_boshi.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_xT3i45NE5tw/SuNF1r-SOjI/AAAAAAAAALo/Q-_0i8V1KMk/s72-c/eclipse.jpg" height="72" width="72" /><thr:total>27</thr:total><feedburner:origLink>http://srand2.blogspot.com/2009/08/eclipse-color-themes.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEEMQXs7fyp7ImA9WxNWGU0.&quot;"><id>tag:blogger.com,1999:blog-938919081230706447.post-1235474302070876170</id><published>2009-02-27T18:44:00.010-05:00</published><updated>2009-10-18T18:58:00.507-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-18T18:58:00.507-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="productivity" /><category scheme="http://www.blogger.com/atom/ns#" term="keyboard" /><category scheme="http://www.blogger.com/atom/ns#" term="tips and fixes" /><category scheme="http://www.blogger.com/atom/ns#" term="peripherals" /><category scheme="http://www.blogger.com/atom/ns#" term="microsoft" /><title>Add Scroll and Media Keys to Microsoft Natural Ergonomic Keyboard 4000</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_xT3i45NE5tw/SaQBN6TyuJI/AAAAAAAAAA4/OeX5EJn11v4/s1600-h/ms_natural_ergonomic_keyboard_4000.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_xT3i45NE5tw/SaQBN6TyuJI/AAAAAAAAAA4/OeX5EJn11v4/s320/ms_natural_ergonomic_keyboard_4000.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;The Microsoft Natural Ergonomic Keyboard 4000 is a fantastic keyboard for programmers and typists. in general However, the keyboard has some &lt;span style="font-style: italic;"&gt;minor &lt;/span&gt;shortcomings:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Zoom slider in the middle of the keyboard is a bit useless&lt;/li&gt;
&lt;li&gt;There are no Previous Track and Next Track media keys&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Fix 1: Change the Zoom slider to a Scroll slider&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Open the file &lt;b&gt;C:\Program Files\Microsoft IntelliType Pro\commands.xml&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;Find the XML tag &lt;b&gt;ALL&lt;/b&gt; then sub-tag labeled &lt;b&gt;Application &lt;/b&gt;with the attribute &lt;b&gt;UniqueName&lt;/b&gt; set to &lt;b&gt;StandardSupport&lt;/b&gt; (in my case the correct Application tag was right below the All tag).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_xT3i45NE5tw/SaQFsymStQI/AAAAAAAAABA/sB4JrPKNAlc/s1600-h/commandsXMLbefore.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_xT3i45NE5tw/SaQFsymStQI/AAAAAAAAABA/sB4JrPKNAlc/s400/commandsXMLbefore.jpg" style="cursor: move;" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;br /&gt;
Change the &lt;b&gt;ZoomIn&lt;/b&gt; to &lt;b&gt;ScrollUp&lt;/b&gt; and the &lt;b&gt;ZoomOut&lt;/b&gt; to &lt;b&gt;ScrollDown&lt;/b&gt;. End result should look similar to below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_xT3i45NE5tw/SaQGiwwgjKI/AAAAAAAAABI/GfpY1iNYa3A/s1600-h/commandsXMLafter.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_xT3i45NE5tw/SaQGiwwgjKI/AAAAAAAAABI/GfpY1iNYa3A/s400/commandsXMLafter.jpg" style="cursor: move;" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Save the file and restart your computer.&lt;/li&gt;
&lt;/ol&gt;Now the Zoom slider now scrolls instead of zoom!&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Note: &lt;/b&gt;The behavior is still a little strange in Firefox, and Internet Explorer still zooms.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Fix 2: Adding Special/Media Keys to the My Favorite keys&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Note: &lt;/b&gt;The next fix will involve the registry, continiue only if you feel comfortable working with the registery and after you make a backup the registry.&lt;br /&gt;
&lt;br /&gt;
To change the "My Favorites" keys (labeled 1-5) we need to look at the registry.&lt;br /&gt;
For this example we want to assign the &lt;b&gt;Next Track&lt;/b&gt; (0x2BF) to &lt;b&gt;My Favorite key 1&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Note: &lt;/b&gt;The folder icons in the Registry Editor are called &lt;i&gt;keys.&lt;/i&gt; The icons that look like scraps of paper are called &lt;i&gt;values&lt;/i&gt;.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_xT3i45NE5tw/Sah3ZJSXTCI/AAAAAAAAABY/dm7Ph55KSQk/s1600-h/MyFavKey5.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;ol&gt;&lt;li&gt;Start | Run... | Command: &lt;b&gt;regedit&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Open the registry key: &lt;b&gt;HKEY_CURRENT_USER\Software\Microsoft\IntelliType Pro\EventMapping\&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;In here you should see a couple folders numerically numbered. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_xT3i45NE5tw/SahzfsDidgI/AAAAAAAAABQ/p-k0FFWms-M/s1600-h/MyFavKey1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_xT3i45NE5tw/SahzfsDidgI/AAAAAAAAABQ/p-k0FFWms-M/s400/MyFavKey1.PNG" style="cursor: move;" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;My Favorite Key 1 - Registry Key 78 - Notepad Shortcut&lt;/i&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;My Favorite keys 1-5&lt;/b&gt; correspond to the &lt;b&gt;registry keys 78-82&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;If registry key 82 (&lt;i&gt;keyboard key 5&lt;/i&gt;) doesn't exist, right click on EventMapping key New | Key and name it 82&lt;/li&gt;
&lt;li&gt;Open registry key 82, if there is anything besides the (Default) value delete them.&lt;/li&gt;
&lt;li&gt;Right click on registry key 82, &lt;b&gt;New | DWORD&lt;/b&gt; Value&lt;br /&gt;
&lt;b&gt;Name&lt;/b&gt;: Command&lt;br /&gt;
&lt;b&gt;Value&lt;/b&gt;: 2BF&lt;br /&gt;
&lt;b&gt;Base&lt;/b&gt;: Hexadecimal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_xT3i45NE5tw/Sa7SMA_40xI/AAAAAAAAAC8/dCc9L_VeVKY/s1600-h/MyFavKey5.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_xT3i45NE5tw/Sa7SMA_40xI/AAAAAAAAAC8/dCc9L_VeVKY/s400/MyFavKey5.PNG" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;i&gt;End Results&lt;br /&gt;
&lt;/i&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Close the Registry Editor and you're done! (No need to restart the computer).&lt;/li&gt;
&lt;/ol&gt;Below I provided additional special keys you can set to your Favorite keys (note I wasn't able to test all of them but most of them seem to work, comment below if you find any more!).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Browser&lt;/span&gt;&lt;br /&gt;
064(100) - Back&lt;br /&gt;
065(101) - Forward&lt;br /&gt;
066(102) - Refresh&lt;br /&gt;
067(103) - Stop&lt;br /&gt;
068(104) - Search&lt;br /&gt;
069(105) - Favorites&lt;br /&gt;
06A(106) - Web/Home&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Windows&lt;/span&gt;&lt;br /&gt;
0C8(200) - Cut (Ctrl+x)&lt;br /&gt;
0C9(201) - Copy (Ctrl+c)&lt;br /&gt;
0CA(202) - Paste (Ctrl+v)&lt;br /&gt;
0CB(203) - Undo (Ctrl+z)&lt;br /&gt;
0CC(204) - Redo&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Word&lt;/span&gt;&lt;br /&gt;
12D(301) - Exit&lt;br /&gt;
12E(302) - Help&lt;br /&gt;
12F(303) - Show/Hide Desktop&lt;br /&gt;
130(304) - Next window&lt;br /&gt;
131(305) - Previous Window&lt;br /&gt;
132(306) - Log off&lt;br /&gt;
133(307) - New&lt;br /&gt;
134(308) - Open&lt;br /&gt;
135(309) - Close&lt;br /&gt;
136(310) - Print&lt;br /&gt;
137(311) - Save&lt;br /&gt;
138(312) - ???&lt;br /&gt;
139(313) - ???&lt;br /&gt;
13A(314) - ???&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Windows (cont.)&lt;/span&gt;&lt;br /&gt;
13B(315) - Find&lt;br /&gt;
13C(316) - Lock Workstation&lt;br /&gt;
&lt;br /&gt;
13F(319) - Zoom in&lt;br /&gt;
140(320) - Zoom out&lt;br /&gt;
&lt;br /&gt;
191(401) - Spell Check&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Media&lt;/span&gt;&lt;br /&gt;
2BF(703) - Next track&lt;br /&gt;
2C0(704) - Previous Track&lt;br /&gt;
2C1(705) - Stop (media)&lt;br /&gt;
2C2(706) - Play/Pause&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Windows (cont.)&lt;/span&gt;&lt;br /&gt;
321(801) - Mail&lt;br /&gt;
322(802) - Media&lt;br /&gt;
323(803) - Calculator&lt;br /&gt;
324(804) - My Computer&lt;br /&gt;
325(805) - My Documents&lt;br /&gt;
326(806) - My Pictures&lt;br /&gt;
327(807) - My Music&lt;br /&gt;
328(808) - Messenger&lt;br /&gt;
329(809) - Calendar&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Outlook&lt;/span&gt;&lt;br /&gt;
384(900) - Reply&lt;br /&gt;
385(901) - Forward (email)&lt;br /&gt;
386(902) - Send&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Office Programs&lt;/span&gt;&lt;br /&gt;
3E8(1000) - Word&lt;br /&gt;
3E9(1001) - Excel&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/938919081230706447-1235474302070876170?l=srand2.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ltlA-mmodOKdOzKXwIy-m6f2Nb0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ltlA-mmodOKdOzKXwIy-m6f2Nb0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ltlA-mmodOKdOzKXwIy-m6f2Nb0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ltlA-mmodOKdOzKXwIy-m6f2Nb0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RandomIi/~4/JTH9L7IZPJI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://srand2.blogspot.com/feeds/1235474302070876170/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://srand2.blogspot.com/2009/02/add-scroll-and-media-keys-to-ms-natural.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/1235474302070876170?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/1235474302070876170?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RandomIi/~3/JTH9L7IZPJI/add-scroll-and-media-keys-to-ms-natural.html" title="Add Scroll and Media Keys to Microsoft Natural Ergonomic Keyboard 4000" /><author><name>srand</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_xT3i45NE5tw/SaiOMjUla8I/AAAAAAAAACc/7s3qOvpNPbY/S220/smrpg_boshi.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_xT3i45NE5tw/SaQBN6TyuJI/AAAAAAAAAA4/OeX5EJn11v4/s72-c/ms_natural_ergonomic_keyboard_4000.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://srand2.blogspot.com/2009/02/add-scroll-and-media-keys-to-ms-natural.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8CQnk5eyp7ImA9WxNRFko.&quot;"><id>tag:blogger.com,1999:blog-938919081230706447.post-395023736459498772</id><published>2009-02-22T21:08:00.011-05:00</published><updated>2009-09-11T09:14:23.723-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-11T09:14:23.723-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="firefox" /><category scheme="http://www.blogger.com/atom/ns#" term="delicious" /><category scheme="http://www.blogger.com/atom/ns#" term="tips and fixes" /><category scheme="http://www.blogger.com/atom/ns#" term="software" /><title>Automatically set "Do Not Share" option in Delicious</title><content type="html">&lt;div style="text-align: justify;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_xT3i45NE5tw/SqE4KvNFoKI/AAAAAAAAAJY/amJeYmD1gE4/s1600-h/delicious.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_xT3i45NE5tw/SqE4KvNFoKI/AAAAAAAAAJY/amJeYmD1gE4/s200/delicious.png" /&gt;&lt;/a&gt;&lt;/div&gt;Delicious is a great social bookmarking service. It also doubles as a cross-application/platform bookmark syncing. For those who want to use it as a personal bookmark syncing service having &lt;span style="font-style: italic;"&gt;all&lt;/span&gt; your bookmarks shared can be inconvenient. When adding new bookmarks there is the problem of the new bookmark being shared. Here is solution for having the "Do Not Share" check box ticked on default in the Firefox Delicious add-on:&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Normal Mode (Default) &lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Browse to &lt;b&gt;about:config&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Right click: &lt;b&gt;New | Integer&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Preference name: &lt;b&gt;extensions.ybookmarks@yahoo.sharemode&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Value: &lt;b&gt;1&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Restart the browser&lt;/li&gt;
&lt;/ol&gt;&lt;span style="font-size: large;"&gt;Classic Mode&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Download Greasemonkey&lt;/li&gt;
&lt;li&gt;Right click on the Greasemonkey icon in the status bar and create a new script&lt;/li&gt;
&lt;li&gt;Enter the following into the script&lt;br /&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;code&gt;// ==UserScript==&lt;br /&gt;
// @name           delicious default do not share&lt;br /&gt;
// @namespace      http://delicious.com&lt;br /&gt;
// @description    Set the 'Do Not Share' checkbox in the Save a Bookmark window in Classic Delicious mode (Tested with version Delicious 2.1 Firefox 3 Add-on)&lt;br /&gt;
// @include        http://delicious.com/save?*&lt;br /&gt;
// ==/UserScript==&lt;br /&gt;
&lt;br /&gt;
window.document.getElementById('share').checked = true;&lt;/code&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Bookmarklet&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;Finally, &lt;a href="http://delicious.com/help/bookmarklets"&gt;bookmarklets&lt;/a&gt;&lt;a href="http://delicious.com/help/bookmarklets"&gt;&lt;/a&gt; can be used for making Delicious bookmarks. The bookmarklet is best if you don't  want or can't install the Firefox add-on. Drag this &lt;a href="javascript:(function(){f='http://delicious.com/save?share=no&amp;amp;url='+encodeURIComponent(window.location.href)+'&amp;amp;title='+encodeURIComponent(document.title)+'&amp;amp;v=5&amp;amp;';a=function(){if(!window.open(f+'noui=1&amp;amp;jump=doclose','deliciousuiv5','location=yes,links=no,scrollbars=no,toolbar=no,width=550,height=550'))location.href=f+'jump=yes'};if(/Firefox/.test(navigator.userAgent)){setTimeout(a,0)}else{a()}})()"&gt;Delicious Bookmarklet&lt;/a&gt; to your bookmark toolbar. (Thanks Björn)&lt;/div&gt;&lt;br /&gt;
&lt;i&gt;&lt;b&gt;Note:&lt;/b&gt; This was tested with Firefox 3 with the Delicious add-on 2.1&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Keep in mind that Delicious is a social bookmarking service, so use this only when absolutely needed!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/938919081230706447-395023736459498772?l=srand2.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/kyxIgYoeMBYQ5kRxm3UoPTmtT9A/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kyxIgYoeMBYQ5kRxm3UoPTmtT9A/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/kyxIgYoeMBYQ5kRxm3UoPTmtT9A/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kyxIgYoeMBYQ5kRxm3UoPTmtT9A/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RandomIi/~4/CHiN67_VHzA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://srand2.blogspot.com/feeds/395023736459498772/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://srand2.blogspot.com/2009/02/auto-do-not-share-in-delicious.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/395023736459498772?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/395023736459498772?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RandomIi/~3/CHiN67_VHzA/auto-do-not-share-in-delicious.html" title="Automatically set &quot;Do Not Share&quot; option in Delicious" /><author><name>srand</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_xT3i45NE5tw/SaiOMjUla8I/AAAAAAAAACc/7s3qOvpNPbY/S220/smrpg_boshi.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_xT3i45NE5tw/SqE4KvNFoKI/AAAAAAAAAJY/amJeYmD1gE4/s72-c/delicious.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://srand2.blogspot.com/2009/02/auto-do-not-share-in-delicious.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEAFQXg9eip7ImA9WxNTGUw.&quot;"><id>tag:blogger.com,1999:blog-938919081230706447.post-4761160855466439306</id><published>2009-02-19T09:54:00.005-05:00</published><updated>2009-08-21T23:45:10.662-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-21T23:45:10.662-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="meta" /><category scheme="http://www.blogger.com/atom/ns#" term="updates" /><title>Moving to Blogger</title><content type="html">Hello World :)&lt;br /&gt;&lt;br /&gt;I'm moving my current blog from Wordpress to Blogger. I'm in the transition of moving the posts over so hang tight!&lt;br /&gt;&lt;br /&gt;Update: Finished moving entries over. Hello people from Wordpress :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/938919081230706447-4761160855466439306?l=srand2.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/eraI6YgFZhWl1ZvwR7XLTPKsiCI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eraI6YgFZhWl1ZvwR7XLTPKsiCI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/eraI6YgFZhWl1ZvwR7XLTPKsiCI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eraI6YgFZhWl1ZvwR7XLTPKsiCI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RandomIi/~4/x5LrK_OKnX0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://srand2.blogspot.com/feeds/4761160855466439306/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://srand2.blogspot.com/2009/02/moving-to-blogger.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/4761160855466439306?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/4761160855466439306?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RandomIi/~3/x5LrK_OKnX0/moving-to-blogger.html" title="Moving to Blogger" /><author><name>srand</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_xT3i45NE5tw/SaiOMjUla8I/AAAAAAAAACc/7s3qOvpNPbY/S220/smrpg_boshi.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://srand2.blogspot.com/2009/02/moving-to-blogger.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MFQH84cSp7ImA9WxNQGU8.&quot;"><id>tag:blogger.com,1999:blog-938919081230706447.post-397326617067440773</id><published>2009-02-09T09:40:00.004-05:00</published><updated>2009-09-25T21:43:31.139-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-25T21:43:31.139-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="telnet" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="NetHack" /><title>NetHack Online GUI</title><content type="html">&lt;div style="text-align: justify;"&gt;One of the projects I'm currently working on is a graphical interface for the game NetHack for &lt;a href="http://alt.org/nethack/"&gt;NetHack.Alt.Org&lt;/a&gt; (a.k.a NAO) telnet server. My aim was to create a telnet interpreter between the server and the client so player can play with graphical tiles over the classical ASCII mode :). Some of the diehard NetHack ASCII fans  say its blasphemy but I think its cool ;).&lt;br /&gt;
&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;In my venture I learned lots about telnet (which you can read more about &lt;a href="http://srand1.blogspot.com/2009/02/telnet-programming-with-c.html"&gt;here&lt;/a&gt;) and Windows C# programming, and flexed some threading knowledge.&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Issues&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;  Correctly interpreting terminal controls&lt;/li&gt;
&lt;li&gt;  Converting the ASCII codes to the NetHack tiles, and doing so efficiently.&lt;/li&gt;
&lt;li&gt;Correctly interpreting in game menus&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
Downloads&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://code.google.com/p/naogui/source/browse/#svn/trunk/Nethack%20Online%20GUI"&gt;Source code&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://code.google.com/p/naogui/wiki/Screenshots"&gt;Screen shots&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
If anyone knows how to solve some of the issues (mostly the 2nd issue) please leave a comment :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/938919081230706447-397326617067440773?l=srand2.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/O3H6JfmmwkzOTjVbsl_WpUJPCgg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/O3H6JfmmwkzOTjVbsl_WpUJPCgg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/O3H6JfmmwkzOTjVbsl_WpUJPCgg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/O3H6JfmmwkzOTjVbsl_WpUJPCgg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RandomIi/~4/1pGE_UQ1j2k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://srand2.blogspot.com/feeds/397326617067440773/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://srand2.blogspot.com/2009/02/nethack-online-gui.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/397326617067440773?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/397326617067440773?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RandomIi/~3/1pGE_UQ1j2k/nethack-online-gui.html" title="NetHack Online GUI" /><author><name>srand</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_xT3i45NE5tw/SaiOMjUla8I/AAAAAAAAACc/7s3qOvpNPbY/S220/smrpg_boshi.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://srand2.blogspot.com/2009/02/nethack-online-gui.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcGRnk9eyp7ImA9WxVWEEQ.&quot;"><id>tag:blogger.com,1999:blog-938919081230706447.post-3317595102008153243</id><published>2009-02-07T10:48:00.000-05:00</published><updated>2009-02-19T20:07:07.763-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-19T20:07:07.763-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Windows" /><category scheme="http://www.blogger.com/atom/ns#" term="NetHack" /><title>NetHack Command line Trick</title><content type="html">For those who still play the old hack-and-slash game called NetHack one can use command line to get your game up quickly. The user can pass it the class/race/role/etc straight to the game. This can be used to setup your favorite settings into a shortcut so you can get straight to the fun!&lt;br /&gt;Here's an example for Windows Shortcut (Target field):&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;"C:\NetHack\NetHackW.exe" -r human -p barbarian -g male -a neutral&lt;/div&gt;&lt;br /&gt;Now if I can only figure a way not to die so quickly :-P&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/938919081230706447-3317595102008153243?l=srand2.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/F_SQb6cmvv9qIVptksi5pqKSbEg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/F_SQb6cmvv9qIVptksi5pqKSbEg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/F_SQb6cmvv9qIVptksi5pqKSbEg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/F_SQb6cmvv9qIVptksi5pqKSbEg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RandomIi/~4/_Bd-g278QRs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://srand2.blogspot.com/feeds/3317595102008153243/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://srand2.blogspot.com/2009/02/nethack-command-line-trick.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/3317595102008153243?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/3317595102008153243?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RandomIi/~3/_Bd-g278QRs/nethack-command-line-trick.html" title="NetHack Command line Trick" /><author><name>srand</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_xT3i45NE5tw/SaiOMjUla8I/AAAAAAAAACc/7s3qOvpNPbY/S220/smrpg_boshi.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://srand2.blogspot.com/2009/02/nethack-command-line-trick.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4ESXYyfCp7ImA9WxNRFko.&quot;"><id>tag:blogger.com,1999:blog-938919081230706447.post-8943218964976304727</id><published>2009-01-26T09:34:00.004-05:00</published><updated>2009-09-11T09:15:08.894-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-11T09:15:08.894-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="telnet" /><category scheme="http://www.blogger.com/atom/ns#" term="sockets" /><category scheme="http://www.blogger.com/atom/ns#" term="VT100" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="terminal" /><category scheme="http://www.blogger.com/atom/ns#" term="xterm" /><title>Telnet Programming with C#</title><content type="html">I'll update the post with the code I used in my project, in the meantime read: &lt;a href="http://www.tcpipguide.com/free/t_TelnetOptionsandOptionNegotiation-2.htm"&gt;Telnet Options and Option Negotiation&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;History&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;In 1978, Digital Equipment Corporation (DEC) created the &lt;a href="http://en.wikipedia.org/wiki/Vt100"&gt;VT100&lt;/a&gt;. It was the first digital mass-market terminal to include many terminal graphic renditions. The terminal was on a choice of 80 or 132 column display. The VT100 family implemented the &lt;a href="http://en.wikipedia.org/wiki/ANSI_escape_code"&gt;ANSI escape codes&lt;/a&gt;, which will be discussed later. Today the VT100 terminal has become the standard for terminal emulators, &lt;a href="http://en.wikipedia.org/wiki/Xterm"&gt;xterm&lt;/a&gt; being one of the more popular ones.&lt;/div&gt;&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Connection&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;The server and client will send a series of DOs, DON'Ts, WILLs, and WON'Ts to each other. This is called negotiating and the start of each negotiation line is IAC (Interpret As Command, 0xFF). It is your job to correctly reply to its requests by telling what your client will do by sending your reply to negotiating commands along with your requests to the server.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Negotiation&lt;/span&gt;&lt;/div&gt;For example if machine 1 (either the client or the server) sends a DO it must be replied by machine 2 with a WILL or a WON'T, depending on what the machine 2 chooses the implement -- so in general:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;DO: Gets replied with a WILL or a WON'T&lt;/li&gt;
&lt;li&gt;WILL: Gets replied with a DO or DON'T&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;Syntax&lt;/b&gt;&lt;br /&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;IAC NEGOTIATION(DO/DON'T/WILL/WON'T) OPTION (Most common ones are 0x00 to 0x31)&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;Definitions&lt;/b&gt;&lt;br /&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;IAC = 0xFF&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;DO = 0xFD&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SUPPRESS_GO_AHEAD = 0x03&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;Example&lt;/b&gt;&lt;br /&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;IAC DO SUPPRESS_GO_AHEAD&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;0xFF 0xFD 0x03&lt;/div&gt;&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Sub-Negotiation&lt;/span&gt;&lt;br /&gt;
Most negotiation options are on or off  but some require more information.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Definitions&lt;/b&gt;&lt;br /&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;TERMINAL_TYPE = 0x18&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SUB_NEGOTIATE = 0xFA&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SUB_NEGOTIATE_END = 0xF0&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;IS = 0x00&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;Example&lt;/b&gt;&lt;br /&gt;
Conversation between the server asking the client's terminal type and the client responding with XTERM:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;b&gt;Server:&lt;/b&gt; IAC DO TERMINAL_TYPE&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;b&gt;Client:&lt;/b&gt; IAC WILL TERMINAL_TYPE&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;b&gt;Server:&lt;/b&gt; IAC SUB_NEGOTIATE TERMINAL_TYPE&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;b&gt;Client:&lt;/b&gt; IAC SUB_NEGOTIATE TERMINAL_TYPE IS "XTERM" SUB_NEGOTIATE_END&lt;/div&gt;&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;After Negotiation&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;Once the server is finished with its primary negotiations, it will start sending data. A chunk of data begins with a byte other than IAC (unless followed by two 0xFF's). Furthermore, terminal controls implementing the ANSI escape control start with ESC[ (known as Control Sequence Introducer or CSI) followed by the control information.&lt;/div&gt;&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Terminal Control&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;As mentioned above, within the data packet are terminal controls. They start with the ESC[ (0x1B 0x5B) bytes and (always?) end with the NULL byte (0x00). These terminal controls can range from status, setup, fonts, cursor, scrolling, tabs, erasing, printing, keyboard, and colors.  Probably the most prominent of these are cursor and color control.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;b&gt;Color Control Syntax&lt;/b&gt;&lt;br /&gt;
&lt;div style="font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;ESC[{attr1};...;{attrn}m&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;Color Control Example&lt;/b&gt;&lt;br /&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ESC[42mNULL ESC[34mGreen Background with Blue ForgroundNULL ESC[0mNULL&lt;/div&gt;&lt;br /&gt;
The first control sets the background to green, the next control sets the foreground to blue, outputs the text, then finally resets the terminal to default colors.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;C# Code&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;Here are two C# classes I wrote in light of helping with myself with telnet programming. The code is still being developed and was written for my purposes so some things may not be what you need. However, you can download it and modify/add what you need:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/naogui/source/browse/trunk/Nethack%20Online%20GUI/TelnetHelper.cs"&gt;TelnetHelper&lt;/a&gt; (Methods for constructing telnet messages)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/naogui/source/browse/trunk/Nethack%20Online%20GUI/TelnetController.cs"&gt;TelnetController&lt;/a&gt; (Methods for sending/receiving telnet messages)&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Readings and Resources&lt;/span&gt;&lt;br /&gt;
Telnet programming with C# isn't all that bad -- with the correct resources.&lt;br /&gt;
Here are some I used:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: 130%;"&gt;Telnet&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;    &lt;a href="http://www.tcpipguide.com/free/t_TelnetProtocol.htm"&gt;The TCP/IP Guide - Telnet Protocol&lt;/a&gt; (By far the best resource, explains how the protocol works in a comprehensive manner)&lt;/li&gt;
&lt;li&gt;    &lt;a href="http://www.iana.org/assignments/telnet-options"&gt;Telnet options&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;    &lt;a href="http://en.wikipedia.org/wiki/Telnet"&gt;Telnet&lt;/a&gt; (also the RFC links at the bottom of the page)&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;span style="font-size: 130%;"&gt;Terminal (xterm / VT100)&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://graphcomp.com/info/specs/ansi_col.html"&gt;    ANSI/VT100 Terminal Control&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.comptechdoc.org/os/linux/howlinuxworks/linux_hlvt100.html"&gt;    VT100 ESC sequences&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.frexx.de/xterm-256-notes/"&gt;The 256 color mode of xterm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/ANSI_escape_code"&gt;    ANSI Escape Codes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/938919081230706447-8943218964976304727?l=srand2.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Cmn0JLlWzW2nLhgD28k_l7g5uYQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Cmn0JLlWzW2nLhgD28k_l7g5uYQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Cmn0JLlWzW2nLhgD28k_l7g5uYQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Cmn0JLlWzW2nLhgD28k_l7g5uYQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RandomIi/~4/6pL__T_7g3s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://srand2.blogspot.com/feeds/8943218964976304727/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://srand2.blogspot.com/2009/02/telnet-programming-with-c.html#comment-form" title="8 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/8943218964976304727?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/938919081230706447/posts/default/8943218964976304727?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RandomIi/~3/6pL__T_7g3s/telnet-programming-with-c.html" title="Telnet Programming with C#" /><author><name>srand</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_xT3i45NE5tw/SaiOMjUla8I/AAAAAAAAACc/7s3qOvpNPbY/S220/smrpg_boshi.gif" /></author><thr:total>8</thr:total><feedburner:origLink>http://srand2.blogspot.com/2009/02/telnet-programming-with-c.html</feedburner:origLink></entry></feed>

