<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xml" href="atom.xslt.xml"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en" xml:base="http://skratchdot.com">
	<title>skratchdot</title>
	<link href="http://skratchdot.com/atom.xml" rel="self"/>
	<link href="http://skratchdot.com/"/>
	<updated>2013-05-19T20:38:24-04:00</updated>
	<id>http://skratchdot.com/</id>
	<author>
		<name>skratchdot.com</name>
		<email>jeff@skratchdot.com</email>
	</author>
	
	<entry>
		<title>Userscripts and Content Security Policy</title>
		<link href="http://skratchdot.com/2013/05/userscripts-and-content-security-policy" />
		<updated>2013-05-19T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2013/05/userscripts-and-content-security-policy</id>
		<content type="html">&lt;p&gt;Last month, Github started to include some &lt;a href='https://en.wikipedia.org/wiki/Content_Security_Policy'&gt;Content Security Policy Headers&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;They wrote a &lt;a href='https://github.com/blog/1477-content-security-policy'&gt;blog post&lt;/a&gt; describing the problems CSP headers try to solve, how to prepare your app for including the headers, and listed some of the current limitations you may encounter when using the headers.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve ran into some of these limitations with the Github userscripts I&amp;#8217;ve authored.&lt;/p&gt;

&lt;p&gt;First off, to make a cross browser userscript, there are a few problems that I&amp;#8217;ve ran into. If your userscript needs to access variables on a page, you can use a few techniques:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://wiki.greasespot.net/UnsafeWindow'&gt;Unsafe Window&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://wiki.greasespot.net/Location_hack'&gt;Location Hack&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://wiki.greasespot.net/Content_Script_Injection'&gt;Content Script Injection&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Of these three, &lt;strong&gt;Content Script Injection&lt;/strong&gt; is the preferred method. It works for both Firefox and Chrome. I&amp;#8217;ve been using a variation of that method for most of the scripts I&amp;#8217;ve written in the past.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s how I would typically write my scripts:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='javascript'&gt;&lt;span class='c1'&gt;// Create some js that you want to inject into the page&lt;/span&gt;
&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;main&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{};&lt;/span&gt;

&lt;span class='c1'&gt;// Inject our main script into the page&lt;/span&gt;
&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;script&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nb'&gt;document&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;createElement&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;script&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='nx'&gt;script&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;textContent&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;(&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='nx'&gt;main&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;toString&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;)();&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='nb'&gt;document&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;body&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;appendChild&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;script&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;After Github started sending CSP headers, my userscripts broke by throwing errors like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;CSP ERROR:  Couldn&amp;#39;t parse invalid source &amp;#39;unsafe-inline&amp;#39;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To fix Firefox, I temporarily removed the &lt;strong&gt;Content Script Injection&lt;/strong&gt; hacks I was using. Here&amp;#8217;s an example commit I made back in April:&lt;/p&gt;

&lt;p&gt;&lt;a href='https://github.com/skratchdot/github-repo-counts.user.js/commit/80f77bc3d588ef5fcd411a3dc77062166b091713'&gt;https://github.com/skratchdot/github-repo-counts.user.js/commit/80f77bc3d588ef5fcd411a3dc77062166b091713&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What I forgot when making those commits, is that Chrome userscripts do not work the same way as Firefox userscripts.&lt;/p&gt;

&lt;p&gt;To make Chrome userscripts work, I &lt;em&gt;needed&lt;/em&gt; to use &lt;strong&gt;Content Script Injection&lt;/strong&gt;. The issue is that Github is sending the following CSP headers:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;x-content-security-policy: default-src *; script-src https://github.com https://a248.e.akamai.net https://jobs.github.com https://ssl.google-analytics.com https://secure.gaug.es https://collector.githubapp.com https://gist.github.com; style-src https://github.com https://a248.e.akamai.net &amp;#39;unsafe-inline&amp;#39;; object-src https://github.com https://a248.e.akamai.net&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you notice, I can only use the &lt;strong&gt;Content Script Injection&lt;/strong&gt; method from the following domains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='https://github.com'&gt;https://github.com&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://a248.e.akamai.net'&gt;https://a248.e.akamai.net&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://jobs.github.com'&gt;https://jobs.github.com&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://ssl.google-analytics.com'&gt;https://ssl.google-analytics.com&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://secure.gaug.es'&gt;https://secure.gaug.es&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://collector.githubapp.com'&gt;https://collector.githubapp.com&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://gist.github.com'&gt;https://gist.github.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I had been hotlinking my scripts from the raw.github.com domain.&lt;/p&gt;

&lt;p&gt;To fix, I started hosting my scripts in a &lt;a href='https://gist.github.com/skratchdot/5604120'&gt;Gist&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Since Firefox supports the @require userscript annotation, I rely on that. For Chrome, I am using &lt;strong&gt;Content Script Injection&lt;/strong&gt;. The reason I didn&amp;#8217;t use &lt;strong&gt;Content Script Injection&lt;/strong&gt; for Firefox, is because @require does some caching, and I was also experiencing some weird behavior in Firefox in which certain requests to &lt;a href='https://gist.github.com/'&gt;gist.github.com&lt;/a&gt; were returning no content (0 byte requests)- and my scripts weren&amp;#8217;t working.&lt;/p&gt;

&lt;p&gt;I haven&amp;#8217;t experienced that behavior with Chrome requests.&lt;/p&gt;

&lt;p&gt;Another method I was toying with, is by injecting the scripts via an iframe. Go to any &lt;a href='https://github.com/'&gt;github.com&lt;/a&gt; page, and run the following code in Chrome&amp;#8217;s console:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='javascript'&gt;&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;injectViaScript&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;fn&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
	&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;script&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nb'&gt;document&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;createElement&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;script&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
	&lt;span class='nx'&gt;script&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;textContent&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;(&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='nx'&gt;fn&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;toString&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;());&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
	&lt;span class='nb'&gt;document&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;body&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;appendChild&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;script&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
	&lt;span class='nb'&gt;document&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;body&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;removeChild&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;script&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='p'&gt;};&lt;/span&gt;

&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;injectViaIframe&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;fn&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
	&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;fnName&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;dynamic_fn_&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nb'&gt;Date&lt;/span&gt;&lt;span class='p'&gt;()).&lt;/span&gt;&lt;span class='nx'&gt;getTime&lt;/span&gt;&lt;span class='p'&gt;(),&lt;/span&gt;
		&lt;span class='nx'&gt;iframe&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nb'&gt;document&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;createElement&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;iframe&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
	&lt;span class='nx'&gt;iframe&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;onload&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
		&lt;span class='nx'&gt;parent&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nb'&gt;window&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nx'&gt;fnName&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nb'&gt;Function&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;(&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='nx'&gt;fn&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;toString&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;());&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
		&lt;span class='nx'&gt;parent&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nb'&gt;window&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nx'&gt;fnName&lt;/span&gt;&lt;span class='p'&gt;]();&lt;/span&gt;
		&lt;span class='nx'&gt;parent&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nb'&gt;document&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;body&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;removeChild&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;iframe&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
	&lt;span class='p'&gt;};&lt;/span&gt;
	&lt;span class='nb'&gt;document&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;body&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;appendChild&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;iframe&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='p'&gt;};&lt;/span&gt;

&lt;span class='c1'&gt;// This will throw an error&lt;/span&gt;
&lt;span class='nx'&gt;injectViaScript&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='nx'&gt;alert&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;Hello from script!&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='p'&gt;});&lt;/span&gt;

&lt;span class='c1'&gt;// This will work&lt;/span&gt;
&lt;span class='nx'&gt;injectViaIframe&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='nx'&gt;alert&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;Hello from iframe!&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='p'&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;That seemed like an approach I could take, but was running into scoping issues, so gave up trying. I ended up settling on the @require method for Firefox, and the &lt;strong&gt;Content Script Injection&lt;/strong&gt; from &lt;a href='https://gist.github.com/'&gt;gist.github.com&lt;/a&gt; for Chrome.&lt;/p&gt;</content>
	</entry>
	
	<entry>
		<title>Github Enhancement Suite</title>
		<link href="http://skratchdot.com/2013/05/github-enhancement-suite" />
		<updated>2013-05-19T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2013/05/github-enhancement-suite</id>
		<content type="html">&lt;p&gt;I&amp;#8217;ve created quite a few &lt;a href='https://github.com'&gt;Github&lt;/a&gt; userscripts to help enhance my experience when checking out code online. The scripts either add functionality I wish existed, functionality I&amp;#8217;ve seen other people request, or functionality that once existed but was removed.&lt;/p&gt;

&lt;p&gt;With the recent &lt;a href='/2013/05/userscripts-and-content-security-policy/'&gt;CSP Headers&lt;/a&gt; that were added to the site, I had to make changes to all my scripts. Since it is starting to be a pain to manage so many scripts, and it&amp;#8217;s even a bigger pain for people if they want to install all of them, I&amp;#8217;ve consolidated them all into one script:&lt;/p&gt;

&lt;p&gt;&lt;a href='https://github.com/skratchdot/github-enhancement-suite'&gt;The Github Enhancement Suite&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Eventually, I might make this a legitimate browser extension, and add functionality for turning features on and off. I&amp;#8217;ll also probably clean up the code, and decommission the &amp;#8220;one off&amp;#8221; scripts.&lt;/p&gt;

&lt;p&gt;At the time of this writing, here are the scripts that are included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='https://github.com/skratchdot/github-code-search.user.js'&gt;Github: Code Search&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://github.com/skratchdot/github-editor-theme.user.js'&gt;Github: Editor Theme&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://github.com/skratchdot/github-fork-count.user.js'&gt;Github: Fork Count&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://github.com/skratchdot/github-get-missing-descriptions.user.js'&gt;Github: Get Missing Descriptions&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://github.com/skratchdot/github-gh-pages-link.user.js'&gt;Github: gh-pages Link&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://github.com/skratchdot/github-pull-request-links.user.js'&gt;Github: Pull Request Links&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://github.com/skratchdot/github-repo-counts.user.js'&gt;Github: Repo Counts&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://github.com/skratchdot/github-repo-filter-info.user.js'&gt;Github: Repo Filter Info&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://github.com/skratchdot/github-twitter-link.user.js'&gt;Github: Twitter Link&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
	</entry>
	
	<entry>
		<title>Open Electribe Editor - v1.2.0 Released</title>
		<link href="http://skratchdot.com/2013/04/open-electribe-editor-v1-2-0-released" />
		<updated>2013-04-13T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2013/04/open-electribe-editor-v1-2-0-released</id>
		<content type="html">&lt;h3 id='v120__released_april_13_2013'&gt;v1.2.0 - Released April 13, 2013&lt;/h3&gt;

&lt;p&gt;Download here: &lt;a href='http://code.google.com/p/open-electribe-editor/downloads/list'&gt;http://code.google.com/p/open-electribe-editor/downloads/list&lt;/a&gt;&lt;/p&gt;

&lt;h4 id='release_notes'&gt;Release Notes:&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;[&lt;a href='https://github.com/skratchdot/open-electribe-editor/issues/27'&gt;BUG: #27&lt;/a&gt;] Pattern Import not working when source pattern contains empty samples&lt;/li&gt;
&lt;/ul&gt;</content>
	</entry>
	
	<entry>
		<title>npm-dview - (a command line tool)</title>
		<link href="http://skratchdot.com/2013/04/npm-dview-a-command-line-tool" />
		<updated>2013-04-13T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2013/04/npm-dview-a-command-line-tool</id>
		<content type="html">&lt;p&gt;I&amp;#8217;ve been working on a few node apps lately, and have sometimes been specifying specific version numbers in my &lt;a href='https://npmjs.org/doc/json.html#dependencies'&gt;package.json&lt;/a&gt; files rather than using &lt;a href='https://npmjs.org/doc/json.html#Tilde-Version-Ranges'&gt;Tilde-Version-Ranges&lt;/a&gt; or &lt;a href='https://npmjs.org/doc/json.html#X-Version-Ranges'&gt;X-Version-Ranges&lt;/a&gt;. When specifying specific version numbers, running &lt;code&gt;npm update&lt;/code&gt; will not update those packages.&lt;/p&gt;

&lt;p&gt;There&amp;#8217;s not an easy way to compare the versions you specified in your package.json file with the latest remotely published version.&lt;/p&gt;

&lt;p&gt;In comes &lt;a href='/projects/npm-dview'&gt;npm-dview&lt;/a&gt; to the rescue. Check out the &lt;a href='/projects/npm-dview'&gt;project page&lt;/a&gt; for screenshots and other usage instructions.&lt;/p&gt;

&lt;p&gt;Or install now by running:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;npm install -g npm-dview
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</content>
	</entry>
	
	<entry>
		<title>Open Electribe Editor - v1.1.0 Released</title>
		<link href="http://skratchdot.com/2013/01/open-electribe-editor-v1-1-0-released" />
		<updated>2013-01-06T00:00:00-05:00</updated>
		<id>http://skratchdot.com/2013/01/open-electribe-editor-v1-1-0-released</id>
		<content type="html">&lt;h3 id='v110__released_january_6_2013'&gt;v1.1.0 - Released January 6, 2013&lt;/h3&gt;

&lt;p&gt;Download here: &lt;a href='http://code.google.com/p/open-electribe-editor/downloads/list'&gt;http://code.google.com/p/open-electribe-editor/downloads/list&lt;/a&gt;&lt;/p&gt;

&lt;h4 id='release_notes'&gt;Release Notes:&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;[&lt;a href='https://github.com/skratchdot/open-electribe-editor/issues/11'&gt;BUG: #11&lt;/a&gt;] Imports/Exports showing up twice in context menu&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;[&lt;a href='https://github.com/skratchdot/open-electribe-editor/issues/12'&gt;BUG: #12&lt;/a&gt;] Auto scroll when using context menu.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;[&lt;a href='https://github.com/skratchdot/open-electribe-editor/issues/21'&gt;BUG: #21&lt;/a&gt;] Can&amp;#8217;t Save and problems to import Patterns&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;[&lt;a href='https://github.com/skratchdot/open-electribe-editor/issues/22'&gt;BUG: #22&lt;/a&gt;] Stereo samples not saving correctly. Mono samples not playing correctly.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;[&lt;a href='https://github.com/skratchdot/open-electribe-editor/issues/18'&gt;FEATURE REQUEST: #18&lt;/a&gt;] Add functions for selecting unused items.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;[&lt;a href='https://github.com/skratchdot/open-electribe-editor/issues/23'&gt;FEATURE REQUEST: #23&lt;/a&gt;] Make IsLoop? more clear for stereo samples.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;removing unused command: &amp;#8220;Export Selected Audio Files&amp;#8221;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;AudioPlayer no longer hangs, or becomes unresponsive.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
	</entry>
	
	<entry>
		<title>mesh: MongoDB insertArray() addition</title>
		<link href="http://skratchdot.com/2012/12/mesh-mongodb-insert-array-addition" />
		<updated>2012-12-12T00:00:00-05:00</updated>
		<id>http://skratchdot.com/2012/12/mesh-mongodb-insert-array-addition</id>
		<content type="html">&lt;p&gt;I just updated &lt;a href='http://skratchdot.com/projects/mesh/'&gt;mesh - MongoDB Extended Shell&lt;/a&gt; again by adding a function that you can call on &lt;a href='http://www.mongodb.org/'&gt;MongoDB&lt;/a&gt; collections.&lt;/p&gt;

&lt;p&gt;The new function is called &lt;strong&gt;insertArray()&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It allows you to insert an array of objects into a collection using a shell version of &lt;a href='http://en.wikipedia.org/wiki/Syntactic_sugar'&gt;Syntactic Sugar&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;All it does is loop through the array that was passed in, calling &lt;strong&gt;DBCollection.insert()&lt;/strong&gt; on each object in the array.&lt;/p&gt;

&lt;p&gt;If an item in the array is not an object, it will skip the insert, print a warning, and continue processing the next item in the array.&lt;/p&gt;

&lt;p&gt;If you don&amp;#8217;t pass in a valid array, it will throw an error.&lt;/p&gt;

&lt;p&gt;Example uses are:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='c1'&gt;// insert 2 items into myCollection&lt;/span&gt;
&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;myArray&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='p'&gt;[{&lt;/span&gt;&lt;span class='nx'&gt;_id&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='nx'&gt;test&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;},&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='nx'&gt;_id&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='nx'&gt;test&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;}];&lt;/span&gt;
&lt;span class='nx'&gt;db&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;myCollection&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;insertArray&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;myArray&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

&lt;span class='c1'&gt;// transfer 10 items from collection1 into collection2&lt;/span&gt;
&lt;span class='nx'&gt;db&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;collection2&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;insertArray&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;db&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;collection1&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;find&lt;/span&gt;&lt;span class='p'&gt;().&lt;/span&gt;&lt;span class='nx'&gt;limit&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;10&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='nx'&gt;toArray&lt;/span&gt;&lt;span class='p'&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Below is the function definition. Rather than using &lt;a href='http://en.wikipedia.org/wiki/Polyfill'&gt;polyfills&lt;/a&gt;, it relies &lt;a href='http://underscorejs.org/'&gt;underscore.js&lt;/a&gt; (which is included in &lt;a href='http://skratchdot.com/projects/mesh/'&gt;mesh.js&lt;/a&gt;).&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='cm'&gt;/*jslint nomen: true, plusplus: true */&lt;/span&gt;
&lt;span class='cm'&gt;/*global _, DBCollection, print */&lt;/span&gt;
&lt;span class='cm'&gt;/**&lt;/span&gt;
&lt;span class='cm'&gt; * @function&lt;/span&gt;
&lt;span class='cm'&gt; * @name insertArray&lt;/span&gt;
&lt;span class='cm'&gt; * @memberOf DBCollection&lt;/span&gt;
&lt;span class='cm'&gt; * @param {array} arr - The array of objects to insert.&lt;/span&gt;
&lt;span class='cm'&gt; * @param {object} options - pass through to DBCollection.prototype.insert()&lt;/span&gt;
&lt;span class='cm'&gt; * @param {boolean} _allow_dot - pass through to DBCollection.prototype.insert()&lt;/span&gt;
&lt;span class='cm'&gt; * @throws {Exception} - when arr is not an Array.&lt;/span&gt;
&lt;span class='cm'&gt; */&lt;/span&gt;
&lt;span class='nx'&gt;DBCollection&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;prototype&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;insertArray&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;arr&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;options&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;_allow_dot&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
	&lt;span class='s1'&gt;&amp;#39;use strict&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
	&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;obj&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
	&lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;_&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;isArray&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;arr&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
		&lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='nx'&gt;arr&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;length&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
			&lt;span class='nx'&gt;obj&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;arr&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='p'&gt;];&lt;/span&gt;
			&lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;_&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;isObject&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;obj&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class='o'&gt;!&lt;/span&gt;&lt;span class='nx'&gt;_&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;isFunction&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;obj&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
				&lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;insert&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;obj&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;options&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;_allow_dot&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
			&lt;span class='p'&gt;}&lt;/span&gt; &lt;span class='k'&gt;else&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
				&lt;span class='nx'&gt;print&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;Cannot insert a non-object, so skipping: &amp;#39;&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='nx'&gt;obj&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
			&lt;span class='p'&gt;}&lt;/span&gt;
		&lt;span class='p'&gt;}&lt;/span&gt;
	&lt;span class='p'&gt;}&lt;/span&gt; &lt;span class='k'&gt;else&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
		&lt;span class='k'&gt;throw&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;first argument is not an array!&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
	&lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='p'&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</content>
	</entry>
	
	<entry>
		<title>New Tabs and the Back Button - Bookmarklet</title>
		<link href="http://skratchdot.com/2012/12/new-tabs-and-the-back-button-bookmarklet" />
		<updated>2012-12-10T00:00:00-05:00</updated>
		<id>http://skratchdot.com/2012/12/new-tabs-and-the-back-button-bookmarklet</id>
		<content type="html">&lt;p&gt;If you&amp;#8217;re anything like me, then you open new links in tabs. Sometimes, if the link has been open for a while, you forget what page you were on when you clicked the link. The back button is disabled since you are in a new tab.&lt;/p&gt;

&lt;p&gt;To get around this issue, I use a simple bookmarklet that takes me back to the document referrer. I place the bookmarklet underneath my back button, so I have easy access to it.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s a screenshot of a disabled back button (in a new tab):&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/posts/2012/12/10/without.png' alt='without referrer bookmarklet' /&gt;&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s a screenshot of my browser with the &amp;#8220;referrer&amp;#8221; bookmarklet:&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/posts/2012/12/10/with.png' alt='with referrer bookmarklet' /&gt;&lt;/p&gt;

&lt;p&gt;To install the bookmarklet, drag this link to your bookmark toolbar:&lt;/p&gt;
&lt;a href='javascript:(function(){document.location=document.referrer;}());'&gt;&amp;lt;&amp;lt; referrer&lt;/a&gt;
&lt;p&gt;All the bookmarklet does is:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='nb'&gt;document&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;location&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='nb'&gt;document&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;referrer&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</content>
	</entry>
	
	<entry>
		<title>Userscript - Github: Editor Theme</title>
		<link href="http://skratchdot.com/2012/12/userscript-github-editor-theme" />
		<updated>2012-12-08T00:00:00-05:00</updated>
		<id>http://skratchdot.com/2012/12/userscript-github-editor-theme</id>
		<content type="html">&lt;p&gt;Yesterday I saw the following post on &lt;a href='http://news.ycombinator.com/'&gt;HackerNews&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href='http://news.ycombinator.com/item?id=4886560'&gt;Let&amp;#8217;s make GitHub better, together&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I saw the section on &lt;a href='http://letsmake.github.com/bettertogether/#ace'&gt;Revamping Inline Editing&lt;/a&gt;, and noticed one of the comments was about the way &lt;a href='https://github.com/'&gt;Github&lt;/a&gt; uses the &lt;a href='https://github.com/ajaxorg/ace'&gt;Ace Editor&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Since I&amp;#8217;ve been working with &lt;a href='https://github.com/ajaxorg/ace'&gt;Ace&lt;/a&gt; some recently, I decided to work on a userscript that let&amp;#8217;s you switch themes on Github.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can check it out here:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href='http://skratchdot.com/projects/github-editor-theme.user.js/'&gt;Project Page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;a href='https://github.com/skratchdot/github-editor-theme.user.js/'&gt;Github Page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;a href='https://github.com/skratchdot/github-editor-theme.user.js/raw/master/github-editor-theme.user.js'&gt;Install&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is the current description from &lt;a href='https://raw.github.com/skratchdot/github-editor-theme.user.js/master/README.md'&gt;README.md&lt;/a&gt;:&lt;/p&gt;

&lt;h3 id='description'&gt;Description&lt;/h3&gt;

&lt;p&gt;Add a &amp;#8220;theme&amp;#8221; dropdown when editing files in the Github UI.&lt;/p&gt;

&lt;h3 id='screenshots'&gt;Screenshots&lt;/h3&gt;

&lt;h4 id='before_installing_the_user_script'&gt;Before installing the user script:&lt;/h4&gt;

&lt;p&gt;&lt;img src='https://github.com/skratchdot/github-editor-theme.user.js/raw/master/images/before.png' alt='Before Installation' /&gt;&lt;/p&gt;

&lt;h4 id='after_installing_the_user_script'&gt;After installing the user script:&lt;/h4&gt;

&lt;p&gt;&lt;img src='https://github.com/skratchdot/github-editor-theme.user.js/raw/master/images/after.png' alt='After Installation' /&gt;&lt;/p&gt;</content>
	</entry>
	
	<entry>
		<title>List Tool: a simple way to compare lists</title>
		<link href="http://skratchdot.com/2012/12/list-tool-a-simple-way-to-compare-lists" />
		<updated>2012-12-07T00:00:00-05:00</updated>
		<id>http://skratchdot.com/2012/12/list-tool-a-simple-way-to-compare-lists</id>
		<content type="html">&lt;p&gt;This week at work I was comparing 2 lists from 2 different sources. I frequently perform tasks like this, and always end up writing the same comparison code over and over.&lt;/p&gt;

&lt;p&gt;One night after work, I decided to write a simple web app to do the list comparisons for me.&lt;/p&gt;

&lt;p&gt;As of now, the app has the following features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href='https://en.wikipedia.org/wiki/Set_%28mathematics%29'&gt;set operations&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;other operations: sort, reverse, unique, trim&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;uses the &lt;a href='https://github.com/ajaxorg/ace/'&gt;Ace Editor&lt;/a&gt; (instead of default textarea elements)&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;uses &lt;a href='http://github.com/twitter/bootstrap/'&gt;Twitter Bootstrap&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;a href='http://bradfrost.github.com/this-is-responsive/'&gt;responsive design&lt;/a&gt;: 4 different display sizes will change the layout&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;live editing: the results/counts will be updated as you add new items to lists&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;a logo visualization of the currently selected comparison operation&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;using &lt;a href='http://www.w3.org/TR/workers/'&gt;Web Workers&lt;/a&gt; (when available) to support larger datasets&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can check out the project page here:&lt;/p&gt;

&lt;p&gt;&lt;a href='http://skratchdot.com/projects/list-tool/'&gt;Project Page&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can bookmark, and use the application here:&lt;/p&gt;

&lt;p&gt;&lt;a href='http://skratchdot.github.io/list-tool/'&gt;List Tool&lt;/a&gt;&lt;/p&gt;</content>
	</entry>
	
	<entry>
		<title>tojs - (a shell script)</title>
		<link href="http://skratchdot.com/2012/11/tojs-a-shell-script" />
		<updated>2012-11-04T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2012/11/tojs-a-shell-script</id>
		<content type="html">&lt;p&gt;Earlier today I was updating one of my &lt;a href='http://skratchdot.github.com/domFormat/bookmarklet/index.html'&gt;bookmarklets&lt;/a&gt; when I ran into the need to convert a html string to a javascript variable.&lt;/p&gt;

&lt;p&gt;I was going to create a quick webpage to do it for me, but that would have still required me to do a lot of manual copy-n-pasting (copying the html into a form, clicking a button, and pasting the result into a new file).&lt;/p&gt;

&lt;p&gt;What I really wanted was a one liner that I could use in my terminal.&lt;/p&gt;

&lt;p&gt;I ended up using a combination of &lt;strong&gt;cat&lt;/strong&gt; and &lt;strong&gt;sed&lt;/strong&gt; to get my desired output. The combined result is a shell script called: &lt;a href='https://github.com/skratchdot/tojs/'&gt;tojs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can install it by running the following commands:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE:&lt;br /&gt;THE FOLLOWING INSTALLATION INSTRUCTIONS ARE OUTDATED. SEE THE UPDATED SECTION BELOW.&lt;/strong&gt;&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;sudo curl https://raw.github.com/skratchdot/tojs/1.1.0/tojs.sh -o /usr/local/bin/tojs
sudo chmod +x /usr/local/bin/tojs
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;UPDATED (12/27/2012):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href='https://github.com/skratchdot/tojs/'&gt;tojs&lt;/a&gt; was converted to a &lt;a href='http://nodejs.org/'&gt;node.js&lt;/a&gt; project on December 27th, 2012. Due to this fact, the installation instructions have changed. This project now requires &lt;a href='https://npmjs.org/'&gt;npm&lt;/a&gt; and can be installed by running:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;npm install -g tojs
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</content>
	</entry>
	
	<entry>
		<title>Userscript - Github: Get Missing Descriptions</title>
		<link href="http://skratchdot.com/2012/08/userscript-github-get-missing-descriptions" />
		<updated>2012-08-12T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2012/08/userscript-github-get-missing-descriptions</id>
		<content type="html">&lt;p&gt;On &lt;a href='https://github.com'&gt;Github&lt;/a&gt; profiles, not all the repositories have description info listed underneath them. Only the repositories with recent updates contain detailed information.&lt;/p&gt;

&lt;p&gt;This is necessary for users with a large number of repos so that page load times are acceptable (also, there&amp;#8217;s no need to show all repo info for someone with 1000+ repos).&lt;/p&gt;

&lt;p&gt;To find out more about older repositories, you have to visit each repo page.&lt;/p&gt;

&lt;p&gt;To help out with this manual process, I&amp;#8217;ve created: &lt;a href='https://github.com/skratchdot/github-get-missing-descriptions.user.js/'&gt;Github: Get Missing Descriptions&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This script adds a button that will update &amp;#8220;simple&amp;#8221; repo listings with the project&amp;#8217;s description, as well as the last time it was updated. Each button click will make a max of 50 ajax requests. If there are more than 50 repos without descriptions, you will have to click the button multiple times.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can check it out here:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href='http://skratchdot.com/projects/github-get-missing-descriptions.user.js/'&gt;Project Page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;a href='https://github.com/skratchdot/github-get-missing-descriptions.user.js/'&gt;Github Page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;a href='https://github.com/skratchdot/github-get-missing-descriptions.user.js/raw/master/github-get-missing-descriptions.user.js'&gt;Install&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is the current description from &lt;a href='https://raw.github.com/skratchdot/github-get-missing-descriptions.user.js/master/README.md'&gt;README.md&lt;/a&gt;:&lt;/p&gt;

&lt;h3 id='description'&gt;Description&lt;/h3&gt;

&lt;p&gt;If there are missing descriptions on a Github profile page, a button will be added. When clicked, ajax requests will be made to grab the descriptions.&lt;/p&gt;

&lt;h3 id='screenshots'&gt;Screenshots&lt;/h3&gt;

&lt;h4 id='before_installing_the_user_script'&gt;Before installing the user script:&lt;/h4&gt;

&lt;p&gt;&lt;img src='https://github.com/skratchdot/github-get-missing-descriptions.user.js/raw/master/images/before.png' alt='Before Installation' /&gt;&lt;/p&gt;

&lt;h4 id='after_installing_the_user_script'&gt;After installing the user script:&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Before clicking the button:&lt;/strong&gt;&lt;br /&gt;&lt;img src='https://github.com/skratchdot/github-get-missing-descriptions.user.js/raw/master/images/after1.png' alt='After Installation (before clicking the button)' /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After clicking the button:&lt;/strong&gt;&lt;br /&gt;&lt;img src='https://github.com/skratchdot/github-get-missing-descriptions.user.js/raw/master/images/after2.png' alt='After Installation (after clicking the button)' /&gt;&lt;/p&gt;</content>
	</entry>
	
	<entry>
		<title>Can't Install Userscripts in Chrome 21+</title>
		<link href="http://skratchdot.com/2012/08/can%27t-install-userscripts-in-chrome-21%2B" />
		<updated>2012-08-04T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2012/08/can't-install-userscripts-in-chrome-21+</id>
		<content type="html">&lt;p&gt;Today I was updating one of my &lt;a href='https://github.com/skratchdot/github-repo-filter-info.user.js/'&gt;userscripts&lt;/a&gt;, but when I went to test my changes in Chrome, I saw the following warning:&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/posts/2012/08/04/userscripts.png' alt='Chrome Userscript / Extension Warning Message' /&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href='http://www.chromium.org/administrators/policy-list-3#ExtensionInstallSources'&gt;learn more&lt;/a&gt; link took me to this page:&lt;/p&gt;

&lt;p&gt;&lt;a href='http://www.chromium.org/administrators/policy-list-3#ExtensionInstallSources'&gt;http://www.chromium.org/administrators/policy-list-3#ExtensionInstallSources&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Following the directions for OSX, I tried adding the &lt;strong&gt;ExtensionInstallSources&lt;/strong&gt; preference via the command line:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Chrome:&lt;/em&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;defaults write com.google.Chrome ExtensionInstallSources -array &amp;quot;https://github.com/skratchdot/*&amp;quot;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;Chrome Canary:&lt;/em&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;defaults write com.google.Chrome.canary ExtensionInstallSources -array &amp;quot;https://github.com/skratchdot/*&amp;quot;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I restarted Chrome, and still could not install my userscript.&lt;/p&gt;

&lt;p&gt;After reading through this bug:&lt;/p&gt;

&lt;p&gt;&lt;a href='http://code.google.com/p/chromium/issues/detail?id=138054'&gt;http://code.google.com/p/chromium/issues/detail?id=138054&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I found the &lt;strong&gt;&amp;#8211;enable-easy-off-store-extension-install&lt;/strong&gt; switch. By using that, I was able to start Chrome from the command line to install my userscript.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Chrome:&lt;/em&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --enable-easy-off-store-extension-install&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;Chrome Canary:&lt;/em&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary --enable-easy-off-store-extension-install&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It would be nice if the &lt;strong&gt;&amp;#8220;Tools&amp;#8221;-&amp;gt;&amp;#8221;Extensions&amp;#8221;&lt;/strong&gt; page (aka &lt;strong&gt;chrome://chrome/extensions/&lt;/strong&gt;) had a list of whitelist/blacklist URLs that you could edit. That page allows you to enter &amp;#8220;Developer Mode&amp;#8221;, so it makes sense to have a few more options there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;EDIT:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This workaround exists as well:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download the user script.&lt;/li&gt;

&lt;li&gt;Open &lt;strong&gt;chrome://chrome/extensions/&lt;/strong&gt;.&lt;/li&gt;

&lt;li&gt;Drag and drop the user script file on the page you opened in step 2.&lt;/li&gt;
&lt;/ol&gt;</content>
	</entry>
	
	<entry>
		<title>mesh: the MongoDB Extended Shell</title>
		<link href="http://skratchdot.com/2012/07/mesh-the-mongodb-extended-shell" />
		<updated>2012-07-17T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2012/07/mesh-the-mongodb-extended-shell</id>
		<content type="html">&lt;p&gt;I saw a blog post today called: &lt;a href='http://blog.mongodb.org/post/27406586932/mongo-the-mongodb-shell'&gt;mongo, the MongoDB Shell&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Since I work in the shell some, and have written a few shell extensions, I decided to create &lt;a href='/projects/mesh/'&gt;mesh: MongoDB Extended Shell&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The hope is that it will grow into a collection of community created scripts that add functionality to the default mongo shell (while not interfering with it).&lt;/p&gt;

&lt;p&gt;So far, I&amp;#8217;ve included a few utility libraries: &lt;a href='http://underscorejs.org'&gt;underscore.js&lt;/a&gt;, &lt;a href='http://epeli.github.com/underscore.string/'&gt;underscore.string.js&lt;/a&gt;, and &lt;a href='http://momentjs.com/'&gt;moment.js&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve also included some of the extensions that I&amp;#8217;ve created in the past. Additionally, there&amp;#8217;s some code so that &lt;strong&gt;&amp;#8220;console&amp;#8221;&lt;/strong&gt; calls end up wrapping the built in &lt;strong&gt;print()&lt;/strong&gt; function. The idea is that eventually I&amp;#8217;ll add some logic to the console calls so they behave in a more &amp;#8220;standard&amp;#8221; way.&lt;/p&gt;

&lt;p&gt;Another feature is the &lt;strong&gt;mesh.setPrompt()&lt;/strong&gt; function. You can pass in a function, or a number 0-4. There are a few different types of prompts you can use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;0: &amp;#8217;&amp;gt;&amp;#8217; reset to default prompt&lt;/li&gt;

&lt;li&gt;1: &amp;#8216;dbname&amp;gt;&amp;#8217;&lt;/li&gt;

&lt;li&gt;2: &amp;#8216;dbname&amp;gt;&amp;#8217; for PRIMARY, &amp;#8216;(dbname)&amp;gt;&amp;#8217; for SECONDARY&lt;/li&gt;

&lt;li&gt;3: &amp;#8216;host:dbname&amp;gt;&amp;#8217;&lt;/li&gt;

&lt;li&gt;4: &amp;#8216;[YYYY-MM-DD hh:mm:ss] host:dbname&amp;gt;&amp;#8217;&lt;/li&gt;

&lt;li&gt;passing in a function() is the same thing as setting: prompt = myFunction()&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;mesh.setPrompt()&lt;/strong&gt; was inspired by the blog post: &lt;a href='http://www.kchodorow.com/blog/2011/06/27/ps1/'&gt;http://www.kchodorow.com/blog/2011/06/27/ps1/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check it out here (and download) here: &lt;a href='https://github.com/skratchdot/mesh/'&gt;https://github.com/skratchdot/mesh/&lt;/a&gt;&lt;/p&gt;</content>
	</entry>
	
	<entry>
		<title>Coldfusion: Convert String To Struct</title>
		<link href="http://skratchdot.com/2012/07/coldfusion-convert-string-to-struct" />
		<updated>2012-07-15T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2012/07/coldfusion-convert-string-to-struct</id>
		<content type="html">&lt;p&gt;The other day I had the need to create a nested structure based off of a key using dot notation.&lt;/p&gt;

&lt;p&gt;Below is the function I came up with:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cfm'&gt;&lt;span class='nb'&gt;&amp;lt;cfscript&amp;gt;&lt;/span&gt;

&lt;span class='nv'&gt;private&lt;/span&gt; &lt;span class='nv'&gt;struct&lt;/span&gt; &lt;span class='nv'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;convertStringToStruct&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;required&lt;/span&gt; &lt;span class='nv'&gt;string&lt;/span&gt; &lt;span class='nv'&gt;key&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;required&lt;/span&gt; &lt;span class='nv'&gt;any&lt;/span&gt; &lt;span class='nv'&gt;value&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;string&lt;/span&gt; &lt;span class='nv'&gt;delimiter&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='k'&gt;var&lt;/span&gt; &lt;span class='nv'&gt;obj&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nf'&gt;StructNew&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
    &lt;span class='k'&gt;var&lt;/span&gt; &lt;span class='nv'&gt;first&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nf'&gt;ListFirst&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;arguments.key&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;arguments.delimiter&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='k'&gt;var&lt;/span&gt; &lt;span class='nv'&gt;rest&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nf'&gt;ListRest&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;arguments.key&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;arguments.delimiter&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

    &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;Len&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;rest&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='nv'&gt;obj&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;first&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nf'&gt;convertStringToStruct&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;rest&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;arguments.value&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;arguments.delimiter&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt; &lt;span class='k'&gt;else&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='nv'&gt;obj&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;first&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;arguments.value&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='nv'&gt;return&lt;/span&gt; &lt;span class='nv'&gt;obj&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;

&lt;span class='nb'&gt;&amp;lt;/cfscript&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Here&amp;#8217;s a quick example usage:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cfm'&gt;&lt;span class='nb'&gt;&amp;lt;cfscript&amp;gt;&lt;/span&gt;

	&lt;span class='c'&gt;// Declare a struct. We will later append to this&lt;/span&gt;
	&lt;span class='nv'&gt;obj&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nf'&gt;StructNew&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
	
	&lt;span class='c'&gt;// Create a few top level keys&lt;/span&gt;
	&lt;span class='nv'&gt;obj&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;ab&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
	&lt;span class='nv'&gt;obj&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;b&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;bar&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
	
	&lt;span class='c'&gt;// Append a dynamically created structure&lt;/span&gt;
	&lt;span class='nf'&gt;StructAppend&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;obj&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nf'&gt;convertStringToStruct&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;a.b.c&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;baz&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; &lt;span class='nv'&gt;false&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
	
	&lt;span class='c'&gt;// Show our output&lt;/span&gt;
	&lt;span class='nf'&gt;WriteDump&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;obj&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

&lt;span class='nb'&gt;&amp;lt;/cfscript&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The output from the above example:&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/posts/2012/07/15/cfdump.png' alt='cfdump output of convertStringToStruct() example' /&gt;&lt;/p&gt;

&lt;p&gt;Here is a gist containing the code:&lt;/p&gt;

&lt;p&gt;&lt;a href='https://gist.github.com/3118727'&gt;https://gist.github.com/3118727&lt;/a&gt;&lt;/p&gt;</content>
	</entry>
	
	<entry>
		<title>OSX Screenshot With Border From Command Line</title>
		<link href="http://skratchdot.com/2012/07/osx-screenshot-with-border-from-command-line" />
		<updated>2012-07-14T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2012/07/osx-screenshot-with-border-from-command-line</id>
		<content type="html">&lt;p&gt;There are a few ways you can take &lt;a href='http://guides.macrumors.com/Taking_Screenshots_in_Mac_OS_X'&gt;screenshots in OSX&lt;/a&gt;, and a few ways you can add borders to images.&lt;/p&gt;

&lt;p&gt;Recently I&amp;#8217;ve found the need to take screenshots of portions of my screen, and add a border to the resultant images. Most of the methods I was using were very time consuming.&lt;/p&gt;

&lt;p&gt;I decided to script something out so I could easily use the commandline to accomplish this task.&lt;/p&gt;

&lt;p&gt;After some evaluation, I decided to use &lt;a href='http://guides.macrumors.com/screencapture'&gt;screencapture&lt;/a&gt; and &lt;a href='http://www.imagemagick.org/'&gt;ImageMagick&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href='http://www.imagemagick.org/'&gt;ImageMagick&lt;/a&gt; comes with of few utilities, one of which is &lt;a href='http://www.imagemagick.org/script/import.php'&gt;import&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I could have used that tool exclusively (and not used screencapture) if it weren&amp;#8217;t for the fact that import relies on the &lt;a href='http://en.wikipedia.org/wiki/X_Window_System'&gt;X Window System&lt;/a&gt; (in OSX it&amp;#8217;s called X11). I wanted something that could take a screenshot without being in an X11 window.&lt;/p&gt;

&lt;p&gt;In the end, I created a shell script called &lt;a href='/projects/framecapture/'&gt;framecapture&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s a very basic script:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='c'&gt;#!/bin/bash&lt;/span&gt;

screencapture -is &lt;span class='s2'&gt;&amp;quot;$1&amp;quot;&lt;/span&gt;
convert &lt;span class='s2'&gt;&amp;quot;$1&amp;quot;&lt;/span&gt; -mattecolor blue -frame 6x6+2+2 &lt;span class='s2'&gt;&amp;quot;$1&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;But I decided to add some error handling, and optional parameters to it.&lt;/p&gt;

&lt;p&gt;You can view it on &lt;a href='https://github.com/skratchdot/framecapture/'&gt;Github&lt;/a&gt;, or install it by running:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;sudo curl https://raw.github.com/skratchdot/framecapture/master/framecapture.sh -o /usr/local/bin/framecapture
sudo chmod +x /usr/local/bin/framecapture
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</content>
	</entry>
	
	<entry>
		<title>Userscript - Github: Twitter Link</title>
		<link href="http://skratchdot.com/2012/07/userscript-github-twitter-link" />
		<updated>2012-07-05T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2012/07/userscript-github-twitter-link</id>
		<content type="html">&lt;p&gt;While browsing &lt;a href='https://github.com'&gt;Github&lt;/a&gt; profiles, I notice I&amp;#8217;ll frequently change the url from &lt;a href='https://github.com'&gt;github.com&lt;/a&gt; to &lt;a href='https://twitter.com'&gt;twitter.com&lt;/a&gt; to see if that particular user has a &lt;a href='https://twitter.com'&gt;Twitter&lt;/a&gt; account.&lt;/p&gt;

&lt;p&gt;To save on some of that manual activity, I created a new userscript today: &lt;a href='https://github.com/skratchdot/github-twitter-link.user.js/'&gt;Github: Twitter Link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can check it out here:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href='http://skratchdot.com/projects/github-twitter-link.user.js/'&gt;Project Page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;a href='https://github.com/skratchdot/github-twitter-link.user.js/'&gt;Github Page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;a href='https://github.com/skratchdot/github-twitter-link.user.js/raw/master/github-twitter-link.user.js'&gt;Install&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is the current description from &lt;a href='https://raw.github.com/skratchdot/github-twitter-link.user.js/master/README.md'&gt;README.md&lt;/a&gt;:&lt;/p&gt;

&lt;h3 id='description'&gt;Description&lt;/h3&gt;

&lt;p&gt;This is a user script that adds a twitter link on Github profile pages if a corresponding user name exists at Twitter. It utilizes local storage to minimize multiple Twitter API requests. If a corresponding user name is not found, then we will not check for it again. At some point I may add a &amp;#8220;time limit&amp;#8221; on when to check again.&lt;/p&gt;

&lt;h3 id='screenshots'&gt;Screenshots&lt;/h3&gt;

&lt;h4 id='before_installing_the_user_script'&gt;Before installing the user script:&lt;/h4&gt;

&lt;p&gt;&lt;img src='https://github.com/skratchdot/github-twitter-link.user.js/raw/master/images/before.png' alt='Before Installation' /&gt;&lt;/p&gt;

&lt;h4 id='after_installing_the_user_script'&gt;After installing the user script:&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Twitter account exists:&lt;/strong&gt;&lt;br /&gt;&lt;img src='https://github.com/skratchdot/github-twitter-link.user.js/raw/master/images/after1.png' alt='After Installation - Account exists' /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Twitter account doesn&amp;#8217;t exist:&lt;/strong&gt;&lt;br /&gt;&lt;img src='https://github.com/skratchdot/github-twitter-link.user.js/raw/master/images/after2.png' alt='After Installation - Account doesnt exist' /&gt;&lt;/p&gt;</content>
	</entry>
	
	<entry>
		<title>Open Electribe Editor - v1.0.4 Released</title>
		<link href="http://skratchdot.com/2012/06/open-electribe-editor-v1-0-4-released" />
		<updated>2012-06-03T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2012/06/open-electribe-editor-v1-0-4-released</id>
		<content type="html">&lt;h3 id='v104__released_june_03_2012'&gt;v1.0.4 - Released June 03, 2012&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[&lt;a href='https://github.com/skratchdot/open-electribe-editor/issues/15'&gt;BUG: #15&lt;/a&gt;] Fixed a bug that prevented valid 16-bit PCM wave files from loading&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Download here: &lt;a href='http://code.google.com/p/open-electribe-editor/downloads/list'&gt;http://code.google.com/p/open-electribe-editor/downloads/list&lt;/a&gt;&lt;/p&gt;</content>
	</entry>
	
	<entry>
		<title>Prevent console calls from throwing errors</title>
		<link href="http://skratchdot.com/2012/05/prevent-console-calls-from-throwing-errors" />
		<updated>2012-05-30T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2012/05/prevent-console-calls-from-throwing-errors</id>
		<content type="html">&lt;p&gt;If you try to use &lt;strong&gt;window.console&lt;/strong&gt; calls in older browsers, an error will be thrown.&lt;/p&gt;

&lt;p&gt;There are a few ways to get around this. One way is to use a &lt;a href='http://www.calormen.com/polyfill/#console'&gt;console polyfill&lt;/a&gt;. Another way is to use a &lt;a href='http://benalman.com/projects/javascript-debug-console-log/'&gt;console wrapper&lt;/a&gt;. Yet one additional way is by creating empty functions for all the available &lt;strong&gt;window.console&lt;/strong&gt; calls.&lt;/p&gt;

&lt;p&gt;This blog post provides some code to achieve the third method listed above. The code first ensures that &lt;strong&gt;window.console&lt;/strong&gt; exists. It then ensures that all functions in the &lt;a href='http://getfirebug.com/wiki/index.php/Console_API'&gt;Firebug Console API&lt;/a&gt; exist in the &lt;strong&gt;window.console&lt;/strong&gt; object. We default to an empty function so older browsers don&amp;#8217;t throw errors. If a given &lt;strong&gt;window.console&lt;/strong&gt; function already exists, we will use the default browser behavior.&lt;/p&gt;

&lt;h3 id='unminified_version'&gt;Un-Minified Version:&lt;/h3&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='cm'&gt;/*jslint browser: true, plusplus: true */&lt;/span&gt;
&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;window&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
	&lt;span class='s1'&gt;&amp;#39;use strict&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

	&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
		&lt;span class='nx'&gt;emptyFunction&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{},&lt;/span&gt;
		&lt;span class='nx'&gt;functionNames&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;
			&lt;span class='s1'&gt;&amp;#39;assert&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;clear&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;count&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;debug&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;dir&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
			&lt;span class='s1'&gt;&amp;#39;dirxml&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;error&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;exception&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;group&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;groupCollapsed&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
			&lt;span class='s1'&gt;&amp;#39;groupEnd&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;info&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;log&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;profile&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;profileEnd&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;table&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
			&lt;span class='s1'&gt;&amp;#39;time&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;timeEnd&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;timeStamp&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;trace&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;warn&amp;#39;&lt;/span&gt;
		&lt;span class='p'&gt;];&lt;/span&gt;

	&lt;span class='c1'&gt;// Make sure window.console exists&lt;/span&gt;
	&lt;span class='nb'&gt;window&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;console&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nb'&gt;window&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;console&lt;/span&gt; &lt;span class='o'&gt;||&lt;/span&gt; &lt;span class='p'&gt;{};&lt;/span&gt;

	&lt;span class='c1'&gt;// Make sure all functions exist&lt;/span&gt;
	&lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='nx'&gt;functionNames&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;length&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
		&lt;span class='nb'&gt;window&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;console&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nx'&gt;functionNames&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='p'&gt;]]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nb'&gt;window&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;console&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nx'&gt;functionNames&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='p'&gt;]]&lt;/span&gt; &lt;span class='o'&gt;||&lt;/span&gt; &lt;span class='nx'&gt;emptyFunction&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
	&lt;span class='p'&gt;}&lt;/span&gt;

&lt;span class='p'&gt;}(&lt;/span&gt;&lt;span class='nb'&gt;window&lt;/span&gt;&lt;span class='p'&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 id='minified_version'&gt;Minified Version:&lt;/h3&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='cm'&gt;/* http://skratchdot.com/2012/05/prevent-console-calls-from-throwing-errors/ */&lt;/span&gt;
&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;b&lt;/span&gt;&lt;span class='p'&gt;){&lt;/span&gt;&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;a&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='nx'&gt;c&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;(){},&lt;/span&gt;&lt;span class='nx'&gt;d&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;assert&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;clear&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;count&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;debug&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;dir&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;dirxml&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;error&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;exception&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;group&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;groupCollapsed&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;groupEnd&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;info&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;log&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;profile&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;profileEnd&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;table&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;time&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;timeEnd&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;timeStamp&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;trace&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;warn&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;];&lt;/span&gt;&lt;span class='nx'&gt;b&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;console&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='nx'&gt;b&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;console&lt;/span&gt;&lt;span class='o'&gt;||&lt;/span&gt;&lt;span class='p'&gt;{};&lt;/span&gt;&lt;span class='k'&gt;for&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;a&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;&lt;span class='nx'&gt;a&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='nx'&gt;d&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;length&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;&lt;span class='nx'&gt;a&lt;/span&gt;&lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='p'&gt;){&lt;/span&gt;&lt;span class='nx'&gt;b&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;console&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nx'&gt;d&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nx'&gt;a&lt;/span&gt;&lt;span class='p'&gt;]]&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='nx'&gt;b&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;console&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nx'&gt;d&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nx'&gt;a&lt;/span&gt;&lt;span class='p'&gt;]]&lt;/span&gt;&lt;span class='o'&gt;||&lt;/span&gt;&lt;span class='nx'&gt;c&lt;/span&gt;&lt;span class='p'&gt;}}(&lt;/span&gt;&lt;span class='nb'&gt;window&lt;/span&gt;&lt;span class='p'&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</content>
	</entry>
	
	<entry>
		<title>Ubuntu Dual Boot - Change Default OS</title>
		<link href="http://skratchdot.com/2012/05/ubuntu-dual-boot-change-default-os" />
		<updated>2012-05-29T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2012/05/ubuntu-dual-boot-change-default-os</id>
		<content type="html">&lt;p&gt;On one of my laptops, I&amp;#8217;m dual booting Windows 7 and Ubuntu 12.04 with Grub2 as the bootloader.&lt;/p&gt;

&lt;p&gt;I always forget what steps to take to &amp;#8220;remember my last OS&amp;#8221; when booting.&lt;/p&gt;

&lt;p&gt;First, you need to modify &lt;strong&gt;/etc/default/grub&lt;/strong&gt;:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;sudo vi /etc/default/grub
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;By adding the following 2 lines:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='text'&gt;  GRUB_DEFAULT=saved
  GRUB_SAVEDEFAULT=true
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;After modifying this file, you need to update GRUB&amp;#8217;s configuration by executing the following 2 commands:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;sudo grub-mkconfig
sudo update-grub
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 id='links'&gt;Links&lt;/h3&gt;

&lt;p&gt;See the &lt;a href='https://help.ubuntu.com/community/Grub2#Saved'&gt;Ubuntu Grub2 Help Page&lt;/a&gt; or this &lt;a href='http://superuser.com/questions/95828/making-default-saved-work-with-grub2/205360#205360'&gt;Stack Overflow Answer&lt;/a&gt;&lt;/p&gt;</content>
	</entry>
	
	<entry>
		<title>CSS3 Zoopraxiscope</title>
		<link href="http://skratchdot.com/2012/05/css3-zoopraxiscope" />
		<updated>2012-05-28T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2012/05/css3-zoopraxiscope</id>
		<content type="html">&lt;p&gt;I was going through some old files on my laptop, and found this snippet of code I created back in April. On April 9th, there was a google doodle for &lt;a href='http://www.google.com/doodles/eadweard-j-muybridges-182nd-birthday'&gt;Eadweard J. Muybridge&amp;#8217;s 182nd Birthday&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I saw a post on &lt;a href='http://news.ycombinator.com/item?id=3816692'&gt;HackerNews&lt;/a&gt; in which someone created a pure CSS version of the google doodle.&lt;/p&gt;

&lt;p&gt;I created a &lt;a href='http://jsfiddle.net/F5Uf5/'&gt;JSFiddle&lt;/a&gt; snippet that day, but never posted it anywhere.&lt;/p&gt;

&lt;p&gt;Anyways, I&amp;#8217;ve cleaned the example up a bit, and posted it below. It now contains pure CSS3 controls to turn the demo on/off or change the speed of the animation.&lt;/p&gt;

&lt;h2 id='demo'&gt;Demo&lt;/h2&gt;
&lt;style type='text/css'&gt;
	img#zoopraxiscope {
		width:230px;
		height:230px;		
	}
	@-webkit-keyframes spin {
		from { -webkit-transform: rotate(0deg); }
		to { -webkit-transform: rotate(-360deg); }
	}
	@-moz-keyframes spin {
		from { -moz-transform: rotate(0deg); }
		to { -moz-transform: rotate(-360deg); }
	}
	@-ms-keyframes spin {
		from { -ms-transform: rotate(0deg); }
		to { -ms-transform: rotate(-360deg); }
	}
	a#animation-on:target~input[value=fast]:checked~img#zoopraxiscope {
		-webkit-animation: spin 230ms infinite linear; 
		-moz-animation: spin 230ms infinite linear; 
		-ms-animation: spin 230ms infinite linear; 
	}
	a#animation-on:target~input[value=medium]:checked~img#zoopraxiscope {
		-webkit-animation: spin 920ms infinite linear; 
		-moz-animation: spin 920ms infinite linear; 
		-ms-animation: spin 920ms infinite linear; 
	}
	a#animation-on:target~input[value=slow]:checked~img#zoopraxiscope {
		-webkit-animation: spin 2000ms infinite linear; 
		-moz-animation: spin 2000ms infinite linear; 
		-ms-animation: spin 2000ms infinite linear; 
	}
&lt;/style&gt;&lt;form style='text-align:center'&gt;
	&lt;h3&gt;Turn Animation&lt;/h3&gt;
	&lt;a id='animation-off' href='#animation-off'&gt;Off&lt;/a&gt;
	&lt;a id='animation-on' href='#animation-on'&gt;On&lt;/a&gt;
	&lt;br /&gt;
	&lt;h3&gt;Speed:&lt;/h3&gt;
	&lt;label for='fast'&gt;Fast:&lt;/label&gt;
	&lt;input type='radio' id='fast' value='fast' name='speed' checked='checked' /&gt;
	&lt;br /&gt;
	&lt;label for='medium'&gt;Medium:&lt;/label&gt;
	&lt;input type='radio' id='medium' value='medium' name='speed' /&gt;
	&lt;br /&gt;
	&lt;label for='slow'&gt;Slow:&lt;/label&gt;
	&lt;input type='radio' id='slow' value='slow' name='speed' /&gt;
	&lt;div style='height:50px'&gt;&amp;nbsp;&lt;/div&gt;
	&lt;img src='/images/posts/2012/05/28/zoopraxiscope.jpg' id='zoopraxiscope' /&gt;
&lt;/form&gt;
&lt;h2 id='css'&gt;CSS:&lt;/h2&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='css'&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='nt'&gt;style&lt;/span&gt; &lt;span class='nt'&gt;type&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;text/css&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt;
	&lt;span class='nt'&gt;img&lt;/span&gt;&lt;span class='nf'&gt;#zoopraxiscope&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
		&lt;span class='k'&gt;width&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;230px&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
		&lt;span class='k'&gt;height&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;230px&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;		
	&lt;span class='p'&gt;}&lt;/span&gt;
	&lt;span class='k'&gt;@-webkit-keyframes&lt;/span&gt; &lt;span class='nt'&gt;spin&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
		&lt;span class='nt'&gt;from&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;webkit&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;transform&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='n'&gt;rotate&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;0&lt;/span&gt;&lt;span class='n'&gt;deg&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
		&lt;span class='nt'&gt;to&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;webkit&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;transform&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='n'&gt;rotate&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;-360&lt;/span&gt;&lt;span class='n'&gt;deg&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
	&lt;span class='p'&gt;}&lt;/span&gt;
	&lt;span class='k'&gt;@-moz-keyframes&lt;/span&gt; &lt;span class='nt'&gt;spin&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
		&lt;span class='nt'&gt;from&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;moz&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;transform&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='n'&gt;rotate&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;0&lt;/span&gt;&lt;span class='n'&gt;deg&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
		&lt;span class='nt'&gt;to&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;moz&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;transform&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='n'&gt;rotate&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;-360&lt;/span&gt;&lt;span class='n'&gt;deg&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
	&lt;span class='p'&gt;}&lt;/span&gt;
	&lt;span class='k'&gt;@-ms-keyframes&lt;/span&gt; &lt;span class='nt'&gt;spin&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
		&lt;span class='nt'&gt;from&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;ms&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;transform&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='n'&gt;rotate&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;0&lt;/span&gt;&lt;span class='n'&gt;deg&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
		&lt;span class='nt'&gt;to&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;ms&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;transform&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='n'&gt;rotate&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;-360&lt;/span&gt;&lt;span class='n'&gt;deg&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
	&lt;span class='p'&gt;}&lt;/span&gt;
	&lt;span class='nt'&gt;a&lt;/span&gt;&lt;span class='nf'&gt;#animation-on&lt;/span&gt;&lt;span class='nd'&gt;:target&lt;/span&gt;&lt;span class='o'&gt;~&lt;/span&gt;&lt;span class='nt'&gt;input&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='nt'&gt;value&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='nt'&gt;fast&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;&lt;span class='nd'&gt;:checked&lt;/span&gt;&lt;span class='o'&gt;~&lt;/span&gt;&lt;span class='nt'&gt;img&lt;/span&gt;&lt;span class='nf'&gt;#zoopraxiscope&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
		&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;webkit&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;animation&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='n'&gt;spin&lt;/span&gt; &lt;span class='m'&gt;230&lt;/span&gt;&lt;span class='n'&gt;ms&lt;/span&gt; &lt;span class='n'&gt;infinite&lt;/span&gt; &lt;span class='n'&gt;linear&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; 
		&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;moz&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;animation&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='n'&gt;spin&lt;/span&gt; &lt;span class='m'&gt;230&lt;/span&gt;&lt;span class='n'&gt;ms&lt;/span&gt; &lt;span class='n'&gt;infinite&lt;/span&gt; &lt;span class='n'&gt;linear&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; 
		&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;ms&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;animation&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='n'&gt;spin&lt;/span&gt; &lt;span class='m'&gt;230&lt;/span&gt;&lt;span class='n'&gt;ms&lt;/span&gt; &lt;span class='n'&gt;infinite&lt;/span&gt; &lt;span class='n'&gt;linear&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; 
	&lt;span class='p'&gt;}&lt;/span&gt;
	&lt;span class='nt'&gt;a&lt;/span&gt;&lt;span class='nf'&gt;#animation-on&lt;/span&gt;&lt;span class='nd'&gt;:target&lt;/span&gt;&lt;span class='o'&gt;~&lt;/span&gt;&lt;span class='nt'&gt;input&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='nt'&gt;value&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='nt'&gt;medium&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;&lt;span class='nd'&gt;:checked&lt;/span&gt;&lt;span class='o'&gt;~&lt;/span&gt;&lt;span class='nt'&gt;img&lt;/span&gt;&lt;span class='nf'&gt;#zoopraxiscope&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
		&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;webkit&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;animation&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='n'&gt;spin&lt;/span&gt; &lt;span class='m'&gt;920&lt;/span&gt;&lt;span class='n'&gt;ms&lt;/span&gt; &lt;span class='n'&gt;infinite&lt;/span&gt; &lt;span class='n'&gt;linear&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; 
		&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;moz&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;animation&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='n'&gt;spin&lt;/span&gt; &lt;span class='m'&gt;920&lt;/span&gt;&lt;span class='n'&gt;ms&lt;/span&gt; &lt;span class='n'&gt;infinite&lt;/span&gt; &lt;span class='n'&gt;linear&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; 
		&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;ms&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;animation&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='n'&gt;spin&lt;/span&gt; &lt;span class='m'&gt;920&lt;/span&gt;&lt;span class='n'&gt;ms&lt;/span&gt; &lt;span class='n'&gt;infinite&lt;/span&gt; &lt;span class='n'&gt;linear&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; 
	&lt;span class='p'&gt;}&lt;/span&gt;
	&lt;span class='nt'&gt;a&lt;/span&gt;&lt;span class='nf'&gt;#animation-on&lt;/span&gt;&lt;span class='nd'&gt;:target&lt;/span&gt;&lt;span class='o'&gt;~&lt;/span&gt;&lt;span class='nt'&gt;input&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='nt'&gt;value&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='nt'&gt;slow&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;&lt;span class='nd'&gt;:checked&lt;/span&gt;&lt;span class='o'&gt;~&lt;/span&gt;&lt;span class='nt'&gt;img&lt;/span&gt;&lt;span class='nf'&gt;#zoopraxiscope&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
		&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;webkit&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;animation&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='n'&gt;spin&lt;/span&gt; &lt;span class='m'&gt;2000&lt;/span&gt;&lt;span class='n'&gt;ms&lt;/span&gt; &lt;span class='n'&gt;infinite&lt;/span&gt; &lt;span class='n'&gt;linear&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; 
		&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;moz&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;animation&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='n'&gt;spin&lt;/span&gt; &lt;span class='m'&gt;2000&lt;/span&gt;&lt;span class='n'&gt;ms&lt;/span&gt; &lt;span class='n'&gt;infinite&lt;/span&gt; &lt;span class='n'&gt;linear&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; 
		&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;ms&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;animation&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='n'&gt;spin&lt;/span&gt; &lt;span class='m'&gt;2000&lt;/span&gt;&lt;span class='n'&gt;ms&lt;/span&gt; &lt;span class='n'&gt;infinite&lt;/span&gt; &lt;span class='n'&gt;linear&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; 
	&lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='o'&gt;&amp;lt;/&lt;/span&gt;&lt;span class='nt'&gt;style&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id='html'&gt;HTML:&lt;/h2&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='html'&gt;&lt;span class='nt'&gt;&amp;lt;form&lt;/span&gt; &lt;span class='na'&gt;style=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;text-align:center&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;
	&lt;span class='nt'&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;Turn Animation&lt;span class='nt'&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
	&lt;span class='nt'&gt;&amp;lt;a&lt;/span&gt; &lt;span class='na'&gt;id=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;animation-off&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;href=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;#animation-off&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;Off&lt;span class='nt'&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
	&lt;span class='nt'&gt;&amp;lt;a&lt;/span&gt; &lt;span class='na'&gt;id=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;animation-on&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;href=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;#animation-on&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;On&lt;span class='nt'&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
	&lt;span class='nt'&gt;&amp;lt;br&lt;/span&gt; &lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
	&lt;span class='nt'&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;Speed:&lt;span class='nt'&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
	&lt;span class='nt'&gt;&amp;lt;label&lt;/span&gt; &lt;span class='na'&gt;for=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;fast&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;Fast:&lt;span class='nt'&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
	&lt;span class='nt'&gt;&amp;lt;input&lt;/span&gt; &lt;span class='na'&gt;type=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;radio&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;name=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;speed&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;id=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;fast&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;value=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;fast&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;checked=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;checked&amp;quot;&lt;/span&gt; &lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
	&lt;span class='nt'&gt;&amp;lt;br&lt;/span&gt; &lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
	&lt;span class='nt'&gt;&amp;lt;label&lt;/span&gt; &lt;span class='na'&gt;for=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;medium&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;Medium:&lt;span class='nt'&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
	&lt;span class='nt'&gt;&amp;lt;input&lt;/span&gt; &lt;span class='na'&gt;type=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;radio&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;name=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;speed&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;id=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;medium&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;value=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;medium&amp;quot;&lt;/span&gt; &lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
	&lt;span class='nt'&gt;&amp;lt;br&lt;/span&gt; &lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
	&lt;span class='nt'&gt;&amp;lt;label&lt;/span&gt; &lt;span class='na'&gt;for=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;slow&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;Slow:&lt;span class='nt'&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
	&lt;span class='nt'&gt;&amp;lt;input&lt;/span&gt; &lt;span class='na'&gt;type=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;radio&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;name=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;speed&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;id=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;slow&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;value=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;slow&amp;quot;&lt;/span&gt; &lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
	&lt;span class='nt'&gt;&amp;lt;div&lt;/span&gt; &lt;span class='na'&gt;style=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;height:50px&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;&lt;span class='ni'&gt;&amp;amp;nbsp;&lt;/span&gt;&lt;span class='nt'&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
	&lt;span class='nt'&gt;&amp;lt;img&lt;/span&gt; &lt;span class='na'&gt;id=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;zoopraxiscope&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;src=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;/images/posts/2012/05/28/zoopraxiscope.jpg&amp;quot;&lt;/span&gt; &lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
&lt;span class='nt'&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id='links'&gt;Links&lt;/h2&gt;

&lt;p&gt;Inspired by the &lt;a href='http://www.google.com/doodles/eadweard-j-muybridges-182nd-birthday'&gt;Google Doodle&lt;/a&gt; on April 9th, 2012 celebrating Eadweard J. Muybridge&lt;/p&gt;

&lt;p&gt;&lt;em&gt;See:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href='http://news.ycombinator.com/item?id=3816692'&gt;http://news.ycombinator.com/item?id=3816692&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;a href='http://en.wikipedia.org/wiki/Zoopraxiscope'&gt;http://en.wikipedia.org/wiki/Zoopraxiscope&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;a href='http://davidwalsh.name/css-spin-revisited'&gt;http://davidwalsh.name/css-spin-revisited&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;a href='http://www.tangledindesign.com/blog/how-to-trigger-css3-transitions-on-click-using-target/'&gt;http://www.tangledindesign.com/blog/how-to-trigger-css3-transitions-on-click-using-target/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;See also:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://jsfiddle.net/F5Uf5/'&gt;http://jsfiddle.net/F5Uf5/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
	</entry>
	
	<entry>
		<title>Windows is slow after adding more memory</title>
		<link href="http://skratchdot.com/2012/05/windows-is-slow-after-adding-more-memory" />
		<updated>2012-05-15T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2012/05/windows-is-slow-after-adding-more-memory</id>
		<content type="html">&lt;p&gt;I dual boot my &lt;a href='http://www.dell.com/us/business/p/precision-m6500/pd'&gt;Dell Precision m6500&lt;/a&gt; with Windows 7 and Ubuntu 12.04. I recently upgraded the memory from 8gb (4x2gb) to 32gb (4x8gb). Ridiculous I know. This is my work laptop and the extra RAM is useful.&lt;/p&gt;

&lt;p&gt;Anyways, after replacing the RAM, Windows slowed down dramatically. The startup screen was taking over 10 minutes to load. I tried disabling the &lt;a href='http://windows.microsoft.com/en-us/windows7/Change-the-size-of-virtual-memory'&gt;page file (and virtual memory)&lt;/a&gt;, then rebooted. Windows was still taking forever to start.&lt;/p&gt;

&lt;p&gt;Once it finally loaded, everything was super slow. The CPU wasn&amp;#8217;t really spiking, and the disk usage didn&amp;#8217;t look crazy, but any action took forever. Even the mouse cursor was slow and jumpy.&lt;/p&gt;

&lt;p&gt;When I would boot into Ubuntu, things were fine. I couldn&amp;#8217;t figure out what was wrong with Windows.&lt;/p&gt;

&lt;p&gt;I tried running &lt;a href='http://www.memtest.org/'&gt;Memtest&lt;/a&gt;, and the tests were passing.&lt;/p&gt;

&lt;p&gt;Finally, someone suggested trying to update the BIOS. That turned out to be the smoking gun. I upgraded the BIOS from A04 to A08, and rebooted Windows. Everything started working at full speed again. I&amp;#8217;m not sure if it was the upgrade, or the simply resetting/flashing the BIOS, but things started working.&lt;/p&gt;</content>
	</entry>
	
	<entry>
		<title>Markdown not working in Jekyll</title>
		<link href="http://skratchdot.com/2012/05/markdown-not-working-in-jekyll" />
		<updated>2012-05-12T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2012/05/markdown-not-working-in-jekyll</id>
		<content type="html">&lt;p&gt;I just converted my blog from &lt;a href='http://wordpress.org/'&gt;Wordpress&lt;/a&gt; to &lt;a href='https://github.com/mojombo/jekyll/'&gt;Jekyll&lt;/a&gt;. The process was fairly straightforward, although it took a lot of reading, and viewing other people&amp;#8217;s example &lt;a href='https://github.com/mojombo/jekyll/wiki/sites'&gt;sites&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;One issue that took a while for me to figure out, was a small typo.&lt;/p&gt;

&lt;p&gt;In &lt;strong&gt;_layouts/post.html&lt;/strong&gt;, I was using the following syntax to include my post content:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{{ page.content }}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As I was converting my posts to use markdown syntax, the posts weren&amp;#8217;t &amp;#8220;markifying&amp;#8221;. It turns out, all I needed to do was use this syntax:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{{ content }}&lt;/code&gt;&lt;/pre&gt;</content>
	</entry>
	
	<entry>
		<title>MongoDB - Shell Extensions</title>
		<link href="http://skratchdot.com/2012/04/mongodb-shell-extensions" />
		<updated>2012-04-30T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2012/04/mongodb-shell-extensions</id>
		<content type="html">&lt;p&gt;Last Friday I read the blog post &lt;a href='http://blog.mongodb.org/post/21923016898/meet-variety-a-schema-analyzer-for-mongodb'&gt;Meet Variety, a Schema Analyzer for MongoDB&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I tried &lt;a href='https://github.com/JamesCropcho/variety/'&gt;Variety&lt;/a&gt; out, but it didn&amp;#8217;t quite do what I wanted, and it also created a few DBs/Collections on my server that I didn&amp;#8217;t expect.&lt;/p&gt;

&lt;p&gt;Over the weekend, I decided to write my own implementation called: &lt;a href='/projects/mongodb-schema'&gt;mongodb-schema&lt;/a&gt;. After finishing that script, I created a few more shell extensions.&lt;/p&gt;

&lt;p&gt;Please note, these are just quick examples I whipped up, and are not really meant to be run on large collections (unless you use &amp;#8220;limit&amp;#8221;, or are willing to wait a really long time). They are definitely not &amp;#8220;production ready&amp;#8221;.&lt;/p&gt;

&lt;p&gt;Here are the scripts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href='/projects/mongodb-distinct-types'&gt;mongodb-distinct-types&lt;/a&gt; - Similar to the db.myCollection.distinct() function, distinctTypes() will return &amp;#8220;types&amp;#8221; rather than &amp;#8220;values&amp;#8221;.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;a href='/projects/mongodb-flatten'&gt;mongodb-flatten&lt;/a&gt; - The flatten() function is a mapReduce that flattens documents into key/value pairs.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;a href='/projects/mongodb-schema'&gt;mongodb-schema&lt;/a&gt; - A schema analysis tool for MongoDB.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;a href='/projects/mongodb-wild'&gt;mongodb-wild&lt;/a&gt; - Adds a wildcard search to the mongodb shell.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
	</entry>
	
	<entry>
		<title>Open Electribe Editor - v1.0.3 Released</title>
		<link href="http://skratchdot.com/2011/09/open-electribe-editor-v1-0-3-released" />
		<updated>2011-09-10T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2011/09/open-electribe-editor-v1-0-3-released</id>
		<content type="html">&lt;h3 id='v103__released_september_10_2011'&gt;v1.0.3 - Released September 10, 2011&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;[&lt;a href='https://github.com/skratchdot/open-electribe-editor/issues/3'&gt;FEATURE REQUEST: #3&lt;/a&gt;] Added the ability to import patterns from other .esx files&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;[&lt;a href='https://github.com/skratchdot/open-electribe-editor/issues/13'&gt;TODO: #13&lt;/a&gt;] Added &amp;#8220;reset perspective&amp;#8221; functionality&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;[&lt;a href='https://github.com/skratchdot/open-electribe-editor/issues/14'&gt;TODO: #14&lt;/a&gt;] Fixed unclear message when dragging audio files&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;[&lt;a href='https://github.com/skratchdot/open-electribe-editor/issues/10'&gt;BUG: #10&lt;/a&gt;] Fixed rounding issue when setting SampleTune&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Download here: &lt;a href='http://code.google.com/p/open-electribe-editor/downloads/list'&gt;http://code.google.com/p/open-electribe-editor/downloads/list&lt;/a&gt;&lt;/p&gt;</content>
	</entry>
	
	<entry>
		<title>domFormat - v1.0 (Released July 25, 2011)</title>
		<link href="http://skratchdot.com/2011/07/domformat-v1-0-released-july-25-2011" />
		<updated>2011-07-25T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2011/07/domformat-v1-0-released-july-25-2011</id>
		<content type="html">&lt;p&gt;domFormat is a simple javascript library to get DOM nodes as formatted/pretty strings.&lt;/p&gt;

&lt;p&gt;You can find the source code here:&lt;/p&gt;

&lt;p&gt;&lt;a href='https://github.com/skratchdot/domFormat'&gt;https://github.com/skratchdot/domFormat&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And some examples here:&lt;/p&gt;

&lt;p&gt;&lt;a href='http://skratchdot.github.com/domFormat/examples/index-html5.html'&gt;http://skratchdot.github.com/domFormat/examples/index-html5.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here are 2 bookmarklets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href='javascript:%28function%28%29{var%20doc%3Ddocument.cloneNode%28true%29%7C%7Cdocument%3Bvar%20script%3Ddocument.createElement%28&amp;apos;script&amp;apos;%29%3Bscript.setAttribute%28&amp;apos;src&amp;apos;%2C&amp;apos;http%3A%2F%2Fskratchdot.github.com%2FdomFormat%2FdomFormat.min.js&amp;apos;%29%3Bscript.addEventListener%28&amp;apos;load&amp;apos;%2Cfunction%28%29%7Bvar%20domString%3DdomFormat.getString%28doc%29%3Bdocument.write%28&amp;apos;%3Ctextarea%20wrap%3D%22off%22%20id%3D%22showSource%22%20style%3D%22width%3A100%25%3Bheight%3A100%25%3Bborder%3A0%3Bmargin%3A0%3Bpadding%3A0%3Bwhitespace%3Anowrap%3B%22%3E%3C%2Ftextarea%3E&amp;apos;%29%3Bdocument.getElementById%28&amp;apos;showSource&amp;apos;%29.value%3DdomString%3Bdocument.close%28%29%3B%7D%2Cfalse%29%3Bdocument.body.appendChild%28script%29%3B}%28%29%29;'&gt;&amp;#8211; Show Source &amp;#8211;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;a href='javascript:%28function%28%29{var%20doc%3Ddocument.cloneNode%28true%29%7C%7Cdocument%3Bvar%20script%3Ddocument.createElement%28&amp;apos;script&amp;apos;%29%3Bscript.setAttribute%28&amp;apos;src&amp;apos;%2C&amp;apos;http%3A%2F%2Fskratchdot.github.com%2FdomFormat%2FdomFormat.min.js&amp;apos;%29%3Bscript.addEventListener%28&amp;apos;load&amp;apos;%2Cfunction%28%29%7Bvar%20domString%3DdomFormat.getString%28doc%29%3Bdocument.write%28domString%29%3Bdocument.close%28%29%3B%7D%2Cfalse%29%3Bdocument.body.appendChild%28script%29%3B}%28%29%29;'&gt;&amp;#8211; Reload Page With Formatted Source &amp;#8211;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
	</entry>
	
	<entry>
		<title>Git Diff Build Script (AKA read your Git docs)</title>
		<link href="http://skratchdot.com/2011/06/git-diff-build-script-aka-read-your-git-docs" />
		<updated>2011-06-05T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2011/06/git-diff-build-script-aka-read-your-git-docs</id>
		<content type="html">&lt;p&gt;When working in SVN, I have a batch script I&amp;#8217;ve used in the past to create &amp;#8220;DEPLOY&amp;#8221; and &amp;#8220;RESTORE&amp;#8221; folders off of diffs between branches. The script will create a &amp;#8220;DEPLOY&amp;#8221; folder containing all &lt;b&gt;added&lt;/b&gt; and &lt;b&gt;modified&lt;/b&gt; files, and a &amp;#8220;RESTORE&amp;#8221; folder containing all &lt;b&gt;modified&lt;/b&gt; files.&lt;/p&gt;

&lt;p&gt;The purpose of this, is to deploy a set of files to a different environment. I can just copy the &amp;#8220;DEPLOY&amp;#8221; folder to any number of servers. If there is a bug that made it through QA, and we need to immediately rollback changes, we can just copy the &amp;#8220;RESTORE&amp;#8221; folder to all the same servers.&lt;/p&gt;

&lt;p&gt;I just wrote a similar script for Git: &lt;a href='https://github.com/skratchdot/Git-Diff-Build-Script'&gt;Git-Diff-Build-Script&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While writing that script, I didn&amp;#8217;t read the Git docs closely enough, and missed the &amp;#8220;git diff&amp;#8221; &lt;b&gt;--diff-filter&lt;/b&gt; parameter. Because of this, I thought I would have to use AWK to sanitize my list of files, but then I read about the &lt;b&gt;--diff-filter&lt;/b&gt; parameter, and changed 2 lines of code to 1:&lt;/p&gt;
&lt;u&gt;USING AWK:&lt;/u&gt;
&lt;pre&gt;&lt;code&gt;info=&amp;quot;$(git diff origin/prod origin/dev --name-status)&amp;quot;
files=&amp;quot;$(echo &amp;quot;$info&amp;quot; | awk &amp;#39;$1 ~/M|A/ {print $2}&amp;#39;)&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;u&gt;USING diff-filter:&lt;/u&gt;
&lt;pre&gt;&lt;code&gt;files=&amp;quot;$(git diff origin/prod origin/dev --name-only --diff-filter=MA)&amp;quot;&lt;/code&gt;&lt;/pre&gt;</content>
	</entry>
	
	<entry>
		<title>SerializeJSON() in ColdFusion with Unicode Characters</title>
		<link href="http://skratchdot.com/2011/05/serializejson-in-coldfusion-with-unicode-characters" />
		<updated>2011-05-17T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2011/05/serializejson-in-coldfusion-with-unicode-characters</id>
		<content type="html">&lt;p&gt;This weekend I read an interesting blog post called &lt;a href='http://timelessrepo.com/json-isnt-a-javascript-subset'&gt;JSON: The JavaScript subset that isn&amp;#8217;t&lt;/a&gt; and decided to test ColdFusion&amp;#8217;s SerializeJSON() function to see if the &amp;#8220;bug&amp;#8221; existed there. It does. To reproduce, you can create a .cfm page that contains the following HTML/CF code:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cfm'&gt;&lt;span class='nt'&gt;&amp;lt;script &lt;/span&gt;&lt;span class='na'&gt;type=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;
    &lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;test&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='err'&gt;#&lt;/span&gt;&lt;span class='nx'&gt;SerializeJSON&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;test&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;&amp;amp;&lt;/span&gt; &lt;span class='nx'&gt;chr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;8232&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;&lt;span class='err'&gt;#&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='nt'&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;To &amp;#8220;fix&amp;#8221; the bug, you can replace SerializeJSON() with SafeSerializeJSON() like this:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cfm'&gt;&lt;span class='nt'&gt;&amp;lt;script &lt;/span&gt;&lt;span class='na'&gt;type=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;
    &lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;test&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='err'&gt;#&lt;/span&gt;&lt;span class='nx'&gt;SafeSerializeJSON&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;test&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;&amp;amp;&lt;/span&gt; &lt;span class='nx'&gt;chr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;8232&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;&lt;span class='err'&gt;#&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='nt'&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The SafeSerializeJSON() function looks like this:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cfm'&gt;&lt;span class='nb'&gt;&amp;lt;cffunction&lt;/span&gt; &lt;span class='nv'&gt;name&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;SafeSerializeJSON&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;output&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;access&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;private&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;returntype&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
    &lt;span class='nb'&gt;&amp;lt;cfargument&lt;/span&gt; &lt;span class='nv'&gt;name&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;obj&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;type&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;any&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;required&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
    &lt;span class='nb'&gt;&amp;lt;cfargument&lt;/span&gt; &lt;span class='nv'&gt;name&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;serializeQueryByColumns&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;type&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;boolean&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;required&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span class='k'&gt;default&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
    &lt;span class='nb'&gt;&amp;lt;cfset&lt;/span&gt; &lt;span class='k'&gt;var&lt;/span&gt; &lt;span class='nv'&gt;jsonOutput&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nf'&gt;SerializeJSON&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;arguments.obj&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;arguments.serializeQueryByColumns&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
    &lt;span class='nb'&gt;&amp;lt;cfset&lt;/span&gt; &lt;span class='nv'&gt;jsonOutput&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nf'&gt;Replace&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;jsonOutput&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nf'&gt;chr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;8232&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;\u2028&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;all&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
    &lt;span class='nb'&gt;&amp;lt;cfset&lt;/span&gt; &lt;span class='nv'&gt;jsonOutput&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nf'&gt;Replace&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;jsonOutput&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nf'&gt;chr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;8233&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;\u2029&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;all&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
    &lt;span class='nb'&gt;&amp;lt;cfreturn&lt;/span&gt; &lt;span class='nv'&gt;jsonOutput&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='nb'&gt;&amp;lt;/cffunction&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;I&amp;#8217;ve created a &lt;a href='https://gist.github.com/975802'&gt;gist&lt;/a&gt; that explores the issue in slightly more detail:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='https://gist.github.com/975802#file_json.cfm'&gt;json.cfm&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://gist.github.com/975802#file_json2.cfm'&gt;json2.cfm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
	</entry>
	
	<entry>
		<title>Open Electribe Editor - v1.0.2 Released</title>
		<link href="http://skratchdot.com/2011/03/open-electribe-editor-v1-0-2-released" />
		<updated>2011-03-21T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2011/03/open-electribe-editor-v1-0-2-released</id>
		<content type="html">&lt;h3 id='v102__released_march_21_2011'&gt;v1.0.2 - Released March 21, 2011&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pattern Tab improvements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Can drag-and-drop patterns&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Adding &amp;#8220;Pattern Editor&amp;#8221; tab&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Adding &amp;#8220;FX&amp;#8221; tab&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Adding &amp;#8220;Parts&amp;#8221; tab&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Adding &amp;#8220;Motion Sequences&amp;#8221; tab&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Can move patterns around without changing what songs they are used in.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Sample Tab improvements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Adding &amp;#8220;Pattern/Part Usage&amp;#8221; tab&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Can move samples around without changing what patterns they are used in.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Song Tab improvements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Improving Song Event display (more human readable now)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Fixing Typos&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Adding Sample/Pattern labels that show number &amp;#38; name&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Adding Tempo validation&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Download here: &lt;a href='http://code.google.com/p/open-electribe-editor/downloads/list'&gt;http://code.google.com/p/open-electribe-editor/downloads/list&lt;/a&gt;&lt;/p&gt;</content>
	</entry>
	
	<entry>
		<title>Links: Javascript</title>
		<link href="http://skratchdot.com/2010/10/links-javascript" />
		<updated>2010-10-10T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2010/10/links-javascript</id>
		<content type="html">&lt;h2 id='books'&gt;Books:&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://oreilly.com/catalog/9780596517748/'&gt;Javascript: The Good Parts&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://oreilly.com/catalog/9780596101992/'&gt;Javascript: The Definitive Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id='toolsblogs'&gt;TOOLS/BLOGS:&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://jquery.com/'&gt;jQuery: The Write Less, Do More, Javascript Library&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.jslint.com/'&gt;JSLint: The JavaScript Code Quality Tool&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://developer.mozilla.org/en/JavaScript/Guide'&gt;Mozilla: Javascript Guide&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://developer.mozilla.org/en/A_re-introduction_to_JavaScript'&gt;Mozilla: A Re-Introduction To Javascript&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://ajaxian.com/'&gt;Ajaxian&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.quirksmode.org/'&gt;QuirksMode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id='videos'&gt;VIDEOS:&lt;/h2&gt;

&lt;h3 id='the_javascript_programming_language'&gt;The JavaScript Programming Language&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://video.yahoo.com/watch/111593/1710507'&gt;Douglas Crockford: &amp;#8220;The JavaScript Programming Language&amp;#8221;/1 of 4&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://video.yahoo.com/watch/111594/1710553'&gt;Douglas Crockford: &amp;#8220;The JavaScript Programming Language&amp;#8221;/2 of 4&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://video.yahoo.com/watch/111595/1710607'&gt;Douglas Crockford: &amp;#8220;The JavaScript Programming Language&amp;#8221;/3 of 4&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://video.yahoo.com/watch/111596/1710658'&gt;Douglas Crockford: &amp;#8220;The JavaScript Programming Language&amp;#8221;/4 of 4&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id='an_inconvenient_api_the_theory_of_the_dom'&gt;An Inconvenient API: The Theory of the DOM&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://video.yahoo.com/watch/111582/992708'&gt;Douglas Crockford: &amp;#8220;Theory of the DOM&amp;#8221; (1 of 3)&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://video.yahoo.com/watch/111583/996002'&gt;Douglas Crockford: &amp;#8220;Theory of the DOM&amp;#8221; (2 of 3)&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://video.yahoo.com/watch/111584/996008'&gt;Douglas Crockford: &amp;#8220;Theory of the DOM&amp;#8221; (3 of 3)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id='advanced_javascript'&gt;Advanced JavaScript&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://video.yahoo.com/watch/111585/1027823'&gt;Douglas Crockford: &amp;#8220;Advanced JavaScript&amp;#8221; (1 of 3)&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://video.yahoo.com/watch/111586/1027832'&gt;Douglas Crockford: &amp;#8220;Advanced JavaScript&amp;#8221; (2 of 3)&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://video.yahoo.com/watch/111587/1027854'&gt;Douglas Crockford: &amp;#8220;Advanced JavaScript&amp;#8221; (3 of 3)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id='crockford_on_javascript_link'&gt;Crockford on JavaScript &lt;a href='http://www.yuiblog.com/crockford/'&gt;(link)&lt;/a&gt;&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://developer.yahoo.com/yui/theater/video.php?v=crockonjs-1'&gt;Volume One: The Early Years&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://developer.yahoo.com/yui/theater/video.php?v=crockonjs-2'&gt;Chapter 2: And Then There Was JavaScript&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://developer.yahoo.com/yui/theater/video.php?v=crockonjs-3'&gt;Act III: Function the Ultimate&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://developer.yahoo.com/yui/theater/video.php?v=crockonjs-4'&gt;Episode IV: The Metamorphosis of Ajax&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://developer.yahoo.com/yui/theater/video.php?v=crockonjs-5'&gt;Part V: The End of All Things&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://developer.yahoo.com/yui/theater/video.php?v=crockford-loopage'&gt;Scene 6: Loopage&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id='john_resig_advancing_javascript_with_libraries'&gt;John Resig: &amp;#8220;Advancing JavaScript with Libraries&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://video.yahoo.com/watch/410472/2391234'&gt;John Resig: &amp;#8220;Advancing JavaScript with Libraries&amp;#8221;/1 of 2&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://video.yahoo.com/watch/412541/2395771'&gt;John Resig: &amp;#8220;Advancing JavaScript with Libraries&amp;#8221;/2 of 2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id='jsconfeu_link'&gt;JSConf.eu &lt;a href='http://jsconfeu.blip.tv/'&gt;(link)&lt;/a&gt;&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://jsconfeu.blip.tv/file/3060565/'&gt;Steve Souders: Fast by Default&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://jsconfeu.blip.tv/file/2899135/'&gt;Ryan Dahl: Node.js&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://jsconfeu.blip.tv/file/2997761/'&gt;Douglas Crockford: The State and Future of JavaScript&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://jsconfeu.blip.tv/file/3047969/'&gt;Francisco Tolmasky: Building Desktop-Caliber Web Apps With Cappuccino and Atlas&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://jsconfeu.blip.tv/file/2929265/'&gt;Dion Almaer: Future of the Web&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://jsconfeu.blip.tv/file/3004532/'&gt;Robert Nyman: JavaScript - From Birth to Closure&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://jsconfeu.blip.tv/file/3161656/'&gt;Peter Svensson&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://jsconfeu.blip.tv/file/3158592/'&gt;Fabian Jakobs&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://jsconfeu.blip.tv/file/3157409/'&gt;Alexandre Morgaut&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://jsconfeu.blip.tv/file/3156628/'&gt;Viereck | Almaer&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://jsconfeu.blip.tv/file/3054882/'&gt;Faruk Ates: JavaScript in the age of HTML5 and CSS 3&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://jsconfeu.blip.tv/file/3054322/'&gt;Christophe Porteneuve: Aggregation with Sprockets&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://jsconfeu.blip.tv/file/2961254/'&gt;Alois Reitbauer: Tracing JS Performance&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://jsconfeu.blip.tv/file/2999333/'&gt;Thomas Fuchs: Extreme JavaScript Performance&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://jsconfeu.blip.tv/file/2996025/'&gt;Remy Sharp: HTML5 JavaScript APIs&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://jsconfeu.blip.tv/file/2992604/'&gt;Malte Ubl: A Meta Object System for JavaScript&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://jsconfeu.blip.tv/file/2961086/'&gt;Alexander Lang: Writing apps on the edge with CouchDB&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
	</entry>
	
	<entry>
		<title>Open Electribe Editor - v1.0.1 Beta Released</title>
		<link href="http://skratchdot.com/2010/04/open-electribe-editor-v1-0-1-beta-released" />
		<updated>2010-04-25T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2010/04/open-electribe-editor-v1-0-1-beta-released</id>
		<content type="html">&lt;h3 id='v101_beta__released_april_25_2010'&gt;v1.0.1 Beta - Released April 25, 2010&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Splash screen works&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Changing the required Java version to J2SE-1.5 (so Older Macs are supported)&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Marking a few property labels/values as READ_ONLY&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Download here: &lt;a href='http://code.google.com/p/open-electribe-editor/downloads/list'&gt;http://code.google.com/p/open-electribe-editor/downloads/list&lt;/a&gt;&lt;/p&gt;</content>
	</entry>
	
	<entry>
		<title>Open Electribe Editor - v1.0.0.Beta Released</title>
		<link href="http://skratchdot.com/2010/03/open-electribe-editor-v1-0-0-beta-released" />
		<updated>2010-03-09T00:00:00-05:00</updated>
		<id>http://skratchdot.com/2010/03/open-electribe-editor-v1-0-0-beta-released</id>
		<content type="html">&lt;h3 id='v100beta__released_march_9_2010'&gt;v1.0.0.Beta - Released March 9, 2010&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Initial Release&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Patterns Tab is incomplete&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Song Events tab is incomplete&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Download here: &lt;a href='http://code.google.com/p/open-electribe-editor/downloads/list'&gt;http://code.google.com/p/open-electribe-editor/downloads/list&lt;/a&gt;&lt;/p&gt;</content>
	</entry>
	
	<entry>
		<title>Verify All ColdFusion DataSources</title>
		<link href="http://skratchdot.com/2009/12/verify-all-coldfusion-datasources" />
		<updated>2009-12-12T00:00:00-05:00</updated>
		<id>http://skratchdot.com/2009/12/verify-all-coldfusion-datasources</id>
		<content type="html">&lt;p&gt;Recently I was asked how to programmatically verify ColdFusion DataSources. I came up with a few methods of doing so. Each have their pros and cons.&lt;/p&gt;

&lt;h3 id='method_1__trycatch_using_cfquery'&gt;Method #1 : Try/Catch using cfquery&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;PROS:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can test for &amp;#8220;datasource&amp;#8221; specific behavior by using a custom cfquery (ie. &lt;strong&gt;&amp;#8220;SELECT 1&amp;#8221;&lt;/strong&gt; vs. &lt;strong&gt;&amp;#8220;SELECT name FROM Customers&amp;#8221;&lt;/strong&gt;). If you do this, the query may not work for other datasources, thereby not actually testing the validity of the datasource (a CON).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;CONS:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uses try/catch.&lt;/li&gt;

&lt;li&gt;Does not work with all datasources. I don&amp;#8217;t know of a cfquery that will work for all datasources / DBs / etc&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;NOTES:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is my least favorite, because I couldn&amp;#8217;t come up with a cfquery to test &lt;em&gt;all&lt;/em&gt; datasources. It will work for some datasources, but not all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SOURCE:&lt;/strong&gt;&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cfm'&gt;&lt;span class='lineno'&gt; 1&lt;/span&gt; &lt;span class='nb'&gt;&amp;lt;cffunction&lt;/span&gt; &lt;span class='nv'&gt;name&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;verifyDsnList1&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;output&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;returntype&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;void&amp;quot;&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt; 2&lt;/span&gt; 	&lt;span class='nb'&gt;&amp;lt;cfargument&lt;/span&gt; &lt;span class='nv'&gt;name&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;list&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;type&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;string&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;required&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt; 3&lt;/span&gt; 	&lt;span class='nb'&gt;&amp;lt;cfargument&lt;/span&gt; &lt;span class='nv'&gt;name&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;delimiter&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;type&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;string&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;required&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span class='k'&gt;default&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;,&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt; 4&lt;/span&gt; 	&lt;span class='nb'&gt;&amp;lt;cfset&lt;/span&gt; &lt;span class='k'&gt;var&lt;/span&gt; &lt;span class='nv'&gt;local&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nf'&gt;StructNew&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt; 5&lt;/span&gt; 	&lt;span class='nb'&gt;&amp;lt;cfoutput&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt; 6&lt;/span&gt; 		&lt;span class='nt'&gt;&amp;lt;hr&lt;/span&gt; &lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt; 7&lt;/span&gt; 		&lt;span class='nt'&gt;&amp;lt;b&amp;gt;&amp;lt;u&amp;gt;&lt;/span&gt;veriftyDsnList1&lt;span class='nt'&gt;&amp;lt;/u&amp;gt;&amp;lt;/b&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt; 8&lt;/span&gt; 		&lt;span class='nb'&gt;&amp;lt;cfloop&lt;/span&gt; &lt;span class='nv'&gt;list&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;&lt;span class='s-Interp'&gt;#arguments.list#&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;index&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;local.currentName&amp;quot;&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt; 9&lt;/span&gt; 			&lt;span class='nb'&gt;&amp;lt;cftry&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;10&lt;/span&gt; 				&lt;span class='nt'&gt;&amp;lt;hr&lt;/span&gt; &lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;11&lt;/span&gt; 				&lt;span class='nt'&gt;&amp;lt;cfquery&lt;/span&gt; &lt;span class='na'&gt;name=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;local.qVerifyDatasource&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;datasource=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;#local.currentName#&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;12&lt;/span&gt; 					SELECT 1
&lt;span class='lineno'&gt;13&lt;/span&gt; 				&lt;span class='nt'&gt;&amp;lt;/cfquery&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;14&lt;/span&gt; 				&lt;span class='nb'&gt;&amp;lt;cfif&lt;/span&gt; &lt;span class='nv'&gt;local.qVerifyDatasource.RecordCount&lt;/span&gt; &lt;span class='o'&gt;gt&lt;/span&gt; &lt;span class='m'&gt;0&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;15&lt;/span&gt; 					DATASOURCE: &lt;span class='p'&gt;#&lt;/span&gt;&lt;span class='nv'&gt;local.currentName&lt;/span&gt;&lt;span class='p'&gt;#&lt;/span&gt; [VERIFIED=true]
&lt;span class='lineno'&gt;16&lt;/span&gt; 				&lt;span class='nb'&gt;&amp;lt;cfelse&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;17&lt;/span&gt; 					DATASOURCE: &lt;span class='p'&gt;#&lt;/span&gt;&lt;span class='nv'&gt;local.currentName&lt;/span&gt;&lt;span class='p'&gt;#&lt;/span&gt; [VERIFIED=false]
&lt;span class='lineno'&gt;18&lt;/span&gt; 				&lt;span class='nb'&gt;&amp;lt;/cfif&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;19&lt;/span&gt; 				&lt;span class='nb'&gt;&amp;lt;cfcatch&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;20&lt;/span&gt; 					DATASOURCE: &lt;span class='p'&gt;#&lt;/span&gt;&lt;span class='nv'&gt;local.currentName&lt;/span&gt;&lt;span class='p'&gt;#&lt;/span&gt; [VERIFIED=false] [ERROR: &lt;span class='p'&gt;#&lt;/span&gt;&lt;span class='nv'&gt;cfcatch.message&lt;/span&gt;&lt;span class='p'&gt;#&lt;/span&gt;]
&lt;span class='lineno'&gt;21&lt;/span&gt; 				&lt;span class='nb'&gt;&amp;lt;/cfcatch&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;22&lt;/span&gt; 			&lt;span class='nb'&gt;&amp;lt;/cftry&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;23&lt;/span&gt; 		&lt;span class='nb'&gt;&amp;lt;/cfloop&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;24&lt;/span&gt; 		&lt;span class='nt'&gt;&amp;lt;hr&lt;/span&gt; &lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;25&lt;/span&gt; 	&lt;span class='nb'&gt;&amp;lt;/cfoutput&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;26&lt;/span&gt; &lt;span class='nb'&gt;&amp;lt;/cffunction&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 id='method_2_trycatch_using_the_datasourceservice_verifydatasource_method'&gt;Method #2: Try/Catch using the DataSourceService verifyDatasource() method.&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;PROS:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Will work for all datasources.&lt;/li&gt;

&lt;li&gt;Shows &amp;#8220;error&amp;#8221; specific messaging that might help debug why a datasource isn&amp;#8217;t working.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;CONS:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uses try/catch.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;SOURCE:&lt;/strong&gt;&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cfm'&gt;&lt;span class='lineno'&gt; 1&lt;/span&gt; &lt;span class='nb'&gt;&amp;lt;cffunction&lt;/span&gt; &lt;span class='nv'&gt;name&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;verifyDsnList2&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;output&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;returntype&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;void&amp;quot;&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt; 2&lt;/span&gt; 	&lt;span class='nb'&gt;&amp;lt;cfargument&lt;/span&gt; &lt;span class='nv'&gt;name&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;list&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;type&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;string&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;required&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt; 3&lt;/span&gt; 	&lt;span class='nb'&gt;&amp;lt;cfargument&lt;/span&gt; &lt;span class='nv'&gt;name&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;delimiter&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;type&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;string&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;required&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span class='k'&gt;default&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;,&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt; 4&lt;/span&gt; 	&lt;span class='nb'&gt;&amp;lt;cfset&lt;/span&gt; &lt;span class='k'&gt;var&lt;/span&gt; &lt;span class='nv'&gt;local&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nf'&gt;StructNew&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt; 5&lt;/span&gt; 	&lt;span class='nb'&gt;&amp;lt;cfset&lt;/span&gt; &lt;span class='nv'&gt;local.dsService&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nf'&gt;CreateObject&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;java&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;coldfusion.server.ServiceFactory&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='nv'&gt;DataSourceService&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt; 6&lt;/span&gt; 	&lt;span class='nb'&gt;&amp;lt;cfoutput&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt; 7&lt;/span&gt; 		&lt;span class='nt'&gt;&amp;lt;hr&lt;/span&gt; &lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt; 8&lt;/span&gt; 		&lt;span class='nt'&gt;&amp;lt;b&amp;gt;&amp;lt;u&amp;gt;&lt;/span&gt;veriftyDsnList2&lt;span class='nt'&gt;&amp;lt;/u&amp;gt;&amp;lt;/b&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt; 9&lt;/span&gt; 		&lt;span class='nb'&gt;&amp;lt;cfloop&lt;/span&gt; &lt;span class='nv'&gt;list&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;&lt;span class='s-Interp'&gt;#arguments.list#&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;index&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;local.currentName&amp;quot;&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;10&lt;/span&gt; 			&lt;span class='nb'&gt;&amp;lt;cftry&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;11&lt;/span&gt; 				&lt;span class='nt'&gt;&amp;lt;hr&lt;/span&gt; &lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;12&lt;/span&gt; 				&lt;span class='nb'&gt;&amp;lt;cfif&lt;/span&gt; &lt;span class='nf'&gt;local.dsService.verifyDatasource&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;local.currentName&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;13&lt;/span&gt; 					DATASOURCE: &lt;span class='p'&gt;#&lt;/span&gt;&lt;span class='nv'&gt;local.currentName&lt;/span&gt;&lt;span class='p'&gt;#&lt;/span&gt; [VERIFIED=true]
&lt;span class='lineno'&gt;14&lt;/span&gt; 				&lt;span class='nb'&gt;&amp;lt;cfelse&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;15&lt;/span&gt; 					DATASOURCE: &lt;span class='p'&gt;#&lt;/span&gt;&lt;span class='nv'&gt;local.currentName&lt;/span&gt;&lt;span class='p'&gt;#&lt;/span&gt; [VERIFIED=false]
&lt;span class='lineno'&gt;16&lt;/span&gt; 				&lt;span class='nb'&gt;&amp;lt;/cfif&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;17&lt;/span&gt; 				&lt;span class='nb'&gt;&amp;lt;cfcatch&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;18&lt;/span&gt; 					DATASOURCE: &lt;span class='p'&gt;#&lt;/span&gt;&lt;span class='nv'&gt;local.currentName&lt;/span&gt;&lt;span class='p'&gt;#&lt;/span&gt; [VERIFIED=false] [ERROR: &lt;span class='p'&gt;#&lt;/span&gt;&lt;span class='nv'&gt;cfcatch.message&lt;/span&gt;&lt;span class='p'&gt;#&lt;/span&gt;]
&lt;span class='lineno'&gt;19&lt;/span&gt; 				&lt;span class='nb'&gt;&amp;lt;/cfcatch&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;20&lt;/span&gt; 			&lt;span class='nb'&gt;&amp;lt;/cftry&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;21&lt;/span&gt; 		&lt;span class='nb'&gt;&amp;lt;/cfloop&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;22&lt;/span&gt; 		&lt;span class='nt'&gt;&amp;lt;hr&lt;/span&gt; &lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;23&lt;/span&gt; 	&lt;span class='nb'&gt;&amp;lt;/cfoutput&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;24&lt;/span&gt; &lt;span class='nb'&gt;&amp;lt;/cffunction&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 id='method_3_admin_api_verifydsn_call'&gt;Method #3: Admin API verifyDSN() call&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;PROS:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Will work for all datasources.&lt;/li&gt;

&lt;li&gt;Doesn&amp;#8217;t use try/catch.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;CONS:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Need to pass in cfide password. This should never be hardcoded, or kept in plain text.&lt;/li&gt;

&lt;li&gt;Will never output &amp;#8220;error&amp;#8221; specific text (only ever displays true or false).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;SOURCE:&lt;/strong&gt;&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cfm'&gt;&lt;span class='lineno'&gt; 1&lt;/span&gt; &lt;span class='nb'&gt;&amp;lt;cffunction&lt;/span&gt; &lt;span class='nv'&gt;name&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;verifyDsnList3&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;output&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;returntype&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;void&amp;quot;&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt; 2&lt;/span&gt; 	&lt;span class='nb'&gt;&amp;lt;cfargument&lt;/span&gt; &lt;span class='nv'&gt;name&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;cfide_password&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;type&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;string&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;required&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt; 3&lt;/span&gt; 	&lt;span class='nb'&gt;&amp;lt;cfargument&lt;/span&gt; &lt;span class='nv'&gt;name&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;list&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;type&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;string&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;required&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt; 4&lt;/span&gt; 	&lt;span class='nb'&gt;&amp;lt;cfargument&lt;/span&gt; &lt;span class='nv'&gt;name&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;delimiter&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;type&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;string&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;required&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span class='k'&gt;default&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;,&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt; 5&lt;/span&gt; 	&lt;span class='nb'&gt;&amp;lt;cfset&lt;/span&gt; &lt;span class='k'&gt;var&lt;/span&gt; &lt;span class='nv'&gt;local&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nf'&gt;StructNew&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt; 6&lt;/span&gt; 	&lt;span class='nb'&gt;&amp;lt;cfset&lt;/span&gt; &lt;span class='nv'&gt;local.admin&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nf'&gt;createObject&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;component&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;cfide.adminapi.administrator&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='nf'&gt;login&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;arguments.cfide_password&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt; 7&lt;/span&gt; 	&lt;span class='nb'&gt;&amp;lt;cfset&lt;/span&gt; &lt;span class='nv'&gt;local.dsObj&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nf'&gt;createObject&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;component&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;cfide.adminapi.datasource&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt; 8&lt;/span&gt; 	&lt;span class='nb'&gt;&amp;lt;cfoutput&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt; 9&lt;/span&gt; 		&lt;span class='nt'&gt;&amp;lt;hr&lt;/span&gt; &lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;10&lt;/span&gt; 		&lt;span class='nt'&gt;&amp;lt;b&amp;gt;&amp;lt;u&amp;gt;&lt;/span&gt;veriftyDsnList3&lt;span class='nt'&gt;&amp;lt;/u&amp;gt;&amp;lt;/b&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;11&lt;/span&gt; 		&lt;span class='nb'&gt;&amp;lt;cfloop&lt;/span&gt; &lt;span class='nv'&gt;list&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;&lt;span class='s-Interp'&gt;#arguments.list#&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;index&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;local.currentName&amp;quot;&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;12&lt;/span&gt; 			&lt;span class='nt'&gt;&amp;lt;hr&lt;/span&gt; &lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;13&lt;/span&gt; 			DATASOURCE: &lt;span class='p'&gt;#&lt;/span&gt;&lt;span class='nv'&gt;local.currentName&lt;/span&gt;&lt;span class='p'&gt;#&lt;/span&gt; [VERIFIED=&lt;span class='p'&gt;#&lt;/span&gt;&lt;span class='nf'&gt;local.dsObj.verifyDSN&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;local.currentName&lt;/span&gt;&lt;span class='p'&gt;)#&lt;/span&gt;]
&lt;span class='lineno'&gt;14&lt;/span&gt; 		&lt;span class='nb'&gt;&amp;lt;/cfloop&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;15&lt;/span&gt; 		&lt;span class='nt'&gt;&amp;lt;hr&lt;/span&gt; &lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;16&lt;/span&gt; 	&lt;span class='nb'&gt;&amp;lt;/cfoutput&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;17&lt;/span&gt; &lt;span class='nb'&gt;&amp;lt;/cffunction&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 id='helper_function'&gt;Helper Function:&lt;/h3&gt;

&lt;p&gt;Here&amp;#8217;s a helper function that will return a sorted list of all configured datasource names:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cfm'&gt;&lt;span class='lineno'&gt;1&lt;/span&gt; &lt;span class='nb'&gt;&amp;lt;cffunction&lt;/span&gt; &lt;span class='nv'&gt;name&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;getDatasourceList&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;output&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;returntype&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;2&lt;/span&gt; 	&lt;span class='nb'&gt;&amp;lt;cfargument&lt;/span&gt; &lt;span class='nv'&gt;name&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;sort_type&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;type&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;string&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;required&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span class='k'&gt;default&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;textnocase&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;hint&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;Optional. See livedocs for ListSort().&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;3&lt;/span&gt; 	&lt;span class='nb'&gt;&amp;lt;cfargument&lt;/span&gt; &lt;span class='nv'&gt;name&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;sort_order&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;type&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;string&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;required&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span class='k'&gt;default&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;asc&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;hint&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;Optional. See livedocs for ListSort().&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;4&lt;/span&gt; 	&lt;span class='nb'&gt;&amp;lt;cfargument&lt;/span&gt; &lt;span class='nv'&gt;name&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;delimiter&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;type&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;string&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;required&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span class='k'&gt;default&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;,&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;hint&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;Optional. See livedocs for ListSort().&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;5&lt;/span&gt; 	&lt;span class='nb'&gt;&amp;lt;cfset&lt;/span&gt; &lt;span class='k'&gt;var&lt;/span&gt; &lt;span class='nv'&gt;dsService&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nf'&gt;CreateObject&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;java&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;coldfusion.server.ServiceFactory&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='nv'&gt;DataSourceService&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;6&lt;/span&gt; 	&lt;span class='nb'&gt;&amp;lt;cfset&lt;/span&gt; &lt;span class='k'&gt;var&lt;/span&gt; &lt;span class='nv'&gt;sDatasources&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nf'&gt;dsService.getDatasources&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;7&lt;/span&gt; 	&lt;span class='nb'&gt;&amp;lt;cfset&lt;/span&gt; &lt;span class='k'&gt;var&lt;/span&gt; &lt;span class='nv'&gt;dsList&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nf'&gt;StructKeyList&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;sDatasources&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;arguments.delimiter&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;8&lt;/span&gt; 	&lt;span class='nb'&gt;&amp;lt;cfreturn&lt;/span&gt; &lt;span class='nf'&gt;ListSort&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;dsList&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;arguments.sort_type&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;arguments.sort_order&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;arguments.delimiter&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;9&lt;/span&gt; &lt;span class='nb'&gt;&amp;lt;/cffunction&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 id='testing_all_3_methods'&gt;Testing all 3 methods:&lt;/h3&gt;

&lt;p&gt;Here&amp;#8217;s a small script to test all the functions from this post. For this to work correctly, you&amp;#8217;ll need to set the correct CFIDE password.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cfm'&gt;&lt;span class='lineno'&gt; 1&lt;/span&gt; &lt;span class='nb'&gt;&amp;lt;cfset&lt;/span&gt; &lt;span class='nv'&gt;my_cfide_password&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;admin&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt; 2&lt;/span&gt; &lt;span class='nb'&gt;&amp;lt;cfset&lt;/span&gt; &lt;span class='nv'&gt;my_datasource_list&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nf'&gt;getDatasourceList&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='nb'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt; 3&lt;/span&gt; 
&lt;span class='lineno'&gt; 4&lt;/span&gt; &lt;span class='nb'&gt;&amp;lt;cfoutput&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt; 5&lt;/span&gt; 	&lt;span class='p'&gt;#&lt;/span&gt;&lt;span class='nf'&gt;verifyDsnList1&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;my_datasource_list&lt;/span&gt;&lt;span class='p'&gt;)#&lt;/span&gt;
&lt;span class='lineno'&gt; 6&lt;/span&gt; 	&lt;span class='nt'&gt;&amp;lt;br&lt;/span&gt; &lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt; 7&lt;/span&gt; 	&lt;span class='p'&gt;#&lt;/span&gt;&lt;span class='nf'&gt;verifyDsnList2&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;my_datasource_list&lt;/span&gt;&lt;span class='p'&gt;)#&lt;/span&gt;
&lt;span class='lineno'&gt; 8&lt;/span&gt; 	&lt;span class='nt'&gt;&amp;lt;br&lt;/span&gt; &lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt; 9&lt;/span&gt; 	&lt;span class='p'&gt;#&lt;/span&gt;&lt;span class='nf'&gt;verifyDsnList3&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;my_cfide_password&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;my_datasource_list&lt;/span&gt;&lt;span class='p'&gt;)#&lt;/span&gt;
&lt;span class='lineno'&gt;10&lt;/span&gt; 	&lt;span class='nt'&gt;&amp;lt;br&lt;/span&gt; &lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;11&lt;/span&gt; &lt;span class='nb'&gt;&amp;lt;/cfoutput&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</content>
	</entry>
	
	<entry>
		<title>ESX Wave Organizer FAQ</title>
		<link href="http://skratchdot.com/2009/12/esx-wave-organizer-faq" />
		<updated>2009-12-08T00:00:00-05:00</updated>
		<id>http://skratchdot.com/2009/12/esx-wave-organizer-faq</id>
		<content type="html">&lt;p&gt;After receiving a few emails, I&amp;#8217;ve decided to create the following FAQ:&lt;/p&gt;

&lt;p&gt;&lt;a href='/projects/esx-wave-organizer/faq/'&gt;http://skratchdot.com/projects/esx-wave-organizer/faq/&lt;/a&gt;&lt;/p&gt;</content>
	</entry>
	
	<entry>
		<title>Cannot insert duplicate key row in object 'xxx' with unique index 'yyy'</title>
		<link href="http://skratchdot.com/2009/09/cannot-insert-duplicate-key-row-in-object-xxx-with-unique-index-yyy" />
		<updated>2009-09-23T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2009/09/cannot-insert-duplicate-key-row-in-object-xxx-with-unique-index-yyy</id>
		<content type="html">&lt;p&gt;The other month I ran into an issue when trying to run a simple update statement on a table in SQL Server 2005. The error I was receiving was:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cannot insert duplicate key row in object &amp;#8216;MyProductView&amp;#8217; with unique index &amp;#8216;IXCL_MyProductView&amp;#8217;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;NOTE: I&amp;#8217;ve changed the names of the views/tables/columns that were actually used, but you should get the idea.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The update statement that threw the error looked like this:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='sql'&gt;&lt;span class='k'&gt;UPDATE&lt;/span&gt; &lt;span class='n'&gt;Products&lt;/span&gt; &lt;span class='k'&gt;SET&lt;/span&gt; &lt;span class='n'&gt;active&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt; &lt;span class='k'&gt;WHERE&lt;/span&gt; &lt;span class='n'&gt;id&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;200&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;MyProductView&lt;/strong&gt; was basically just a way to join a few of the product related tables (ie: &lt;strong&gt;Sizes&lt;/strong&gt;, &lt;strong&gt;Colors&lt;/strong&gt;, &lt;strong&gt;Inventory&lt;/strong&gt;, etc).&lt;/p&gt;

&lt;p&gt;The index on &lt;strong&gt;MyProductView&lt;/strong&gt; that was causing the constraint violation looked something like this:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='sql'&gt;&lt;span class='k'&gt;CREATE&lt;/span&gt; &lt;span class='k'&gt;UNIQUE&lt;/span&gt; &lt;span class='n'&gt;CLUSTERED&lt;/span&gt; &lt;span class='k'&gt;INDEX&lt;/span&gt; &lt;span class='n'&gt;IXCL_MyProductView&lt;/span&gt; &lt;span class='k'&gt;ON&lt;/span&gt; &lt;span class='n'&gt;MyProductView&lt;/span&gt;
&lt;span class='p'&gt;(&lt;/span&gt;
	&lt;span class='n'&gt;product_id&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
	&lt;span class='n'&gt;color_id&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
	&lt;span class='n'&gt;size_id&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
	&lt;span class='n'&gt;inventory_id&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
	&lt;span class='n'&gt;currency_id&lt;/span&gt;
&lt;span class='err'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Notice the &lt;strong&gt;active&lt;/strong&gt; flag/column is not in the clustered index (so updating that column on the &lt;strong&gt;Products&lt;/strong&gt; table should not change a row in my view that would violate the unique constraint above). Also, the &lt;strong&gt;active&lt;/strong&gt; column was not in any of the join clauses for the &lt;strong&gt;MyProductView&lt;/strong&gt;, so no rows should&amp;#8217;ve been added or deleted from the view after running the update statement.&lt;/p&gt;

&lt;p&gt;To confirm the validity of the &lt;strong&gt;IXCL_MyProductView&lt;/strong&gt; constraint, I could run:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='sql'&gt;&lt;span class='k'&gt;SELECT&lt;/span&gt;
	&lt;span class='n'&gt;product_id&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;color_id&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;size_id&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;inventory_id&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;currency_id&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='k'&gt;COUNT&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='k'&gt;AS&lt;/span&gt; &lt;span class='n'&gt;confirmConstraint&lt;/span&gt;
&lt;span class='k'&gt;FROM&lt;/span&gt;
	&lt;span class='n'&gt;MyProductView&lt;/span&gt;
&lt;span class='k'&gt;GROUP&lt;/span&gt; &lt;span class='k'&gt;BY&lt;/span&gt;
	&lt;span class='n'&gt;product_id&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;color_id&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;size_id&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;inventory_id&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;currency_id&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;As long as the &lt;strong&gt;IXCL_MyProductView&lt;/strong&gt; constraint was in place, the &lt;strong&gt;confirmConstraint&lt;/strong&gt; column could only have a value of 1.&lt;/p&gt;

&lt;p&gt;I could not figure out why running:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='sql'&gt;&lt;span class='k'&gt;UPDATE&lt;/span&gt; &lt;span class='n'&gt;Products&lt;/span&gt; &lt;span class='k'&gt;SET&lt;/span&gt; &lt;span class='n'&gt;active&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt; &lt;span class='k'&gt;WHERE&lt;/span&gt; &lt;span class='n'&gt;id&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;200&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;would cause a problem. If the query would complete successfully, the constraint would still be valid. In fact, I could run the same query in production just fine. Also, the other developers could run the query just fine on their local DBs. I was the only one who was running into this constraint violation (and I had the same data in my database as the other databases had). After bringing this up with our DBA, he had no idea why the constraint violation would be occur.&lt;br /&gt;I wondered if I needed to wrap the UPDATE statement in a TRANSACTION COMMIT block, but our DBA said I shouldn&amp;#8217;t have to.&lt;/p&gt;

&lt;p&gt;After thinking about it for a minute, he asked what version of SQL Server 2005 I was using. It turned out I was not running the same service pack level as the other developers (and what was in production).&lt;/p&gt;

&lt;p&gt;I was running &lt;strong&gt;&amp;#8220;SQL Server 2005 - Developer&amp;#8217;s Edition (9.0 RTM)&amp;#8221;&lt;/strong&gt;. I then upgraded to Service Pack 2: &lt;strong&gt;&amp;#8220;SQL Server 2005 - Developer&amp;#8217;s Edition (9.0 SP2)&amp;#8221;&lt;/strong&gt;, and the issue disappeared. I was able to run my UPDATE statement without error.&lt;/p&gt;</content>
	</entry>
	
	<entry>
		<title>Getting Wordpress Post Counts to show up inside anchor tag</title>
		<link href="http://skratchdot.com/2009/09/getting-wordpress-post-counts-to-show-up-inside-anchor-tag" />
		<updated>2009-09-22T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2009/09/getting-wordpress-post-counts-to-show-up-inside-anchor-tag</id>
		<content type="html">&lt;p&gt;When creating this blog&amp;#8217;s theme, I decided I wanted the links in the side navigation to take up the full width of the navigation. Also, when hovering, I wanted to highlight the whole link/line. This seems like a very simple thing to do with CSS, but by default, a few of the Wordpress widgets do not allow for easy customization of the placement of the post count. This makes it hard to create sidebar entries in which the whole line is a link.&lt;/p&gt;

&lt;p&gt;For example, by default, I could only get the Archive Widget to print out links in the following format:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='html'&gt;&lt;span class='nt'&gt;&amp;lt;li&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class='na'&gt;href=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;/2009/09/&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;September 2009&lt;span class='nt'&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;&lt;span class='ni'&gt;&amp;amp;nbsp;&lt;/span&gt;(1)&lt;span class='nt'&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;I wanted the links to be in this format (note the (1) is inside the anchor tag):&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='html'&gt;&lt;span class='nt'&gt;&amp;lt;li&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class='na'&gt;href=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;/2009/09/&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;September 2009&lt;span class='ni'&gt;&amp;amp;nbsp;&lt;/span&gt;(1)&lt;span class='nt'&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Below are the steps I took to override the default behavior of the Archive Widget. For this tutorial, I&amp;#8217;m going to modify the &amp;#8220;classic&amp;#8221; theme that is provided with Wordpress 2.8. You can download both the original &amp;#8220;classic&amp;#8221; theme as well as my modified version &amp;#8220;classic-modified&amp;#8221; &lt;a href='/downloads/theme-tutorial-classic-modified.zip'&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;div class='info-section-note'&gt;
NOTE: For detailed instructions on creating a Wordpress theme, there are many tutorials online.  Also, the &lt;a href='http://codex.wordpress.org/Theme_Development'&gt;Wordpress.org&lt;/a&gt; site has fairly detailed documentation.  The first tutorial I found via a google search was for entry level Wordpress developers, yet it was very helpful: &lt;a href='http://www.wpdesigner.com/2007/02/19/so-you-want-to-create-wordpress-themes-huh/'&gt;www.wpdesigner.com&lt;/a&gt;.
&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p&gt;For this tutorial, the first step to take is to copy the &amp;#8220;classic&amp;#8221; theme. Rename the copy &amp;#8220;classic-modified&amp;#8221; and place it in your themes folder.&lt;/p&gt;

&lt;p&gt;Now we&amp;#8217;re going to modify the &lt;b&gt;functions.php&lt;/b&gt; file by adding lines 17-18 below:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='lineno'&gt; 1&lt;/span&gt; &lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class='lineno'&gt; 2&lt;/span&gt; &lt;span class='sd'&gt;/**&lt;/span&gt;
&lt;span class='lineno'&gt; 3&lt;/span&gt; &lt;span class='sd'&gt; * @package WordPress&lt;/span&gt;
&lt;span class='lineno'&gt; 4&lt;/span&gt; &lt;span class='sd'&gt; * @subpackage Classic_Theme&lt;/span&gt;
&lt;span class='lineno'&gt; 5&lt;/span&gt; &lt;span class='sd'&gt; */&lt;/span&gt;
&lt;span class='lineno'&gt; 6&lt;/span&gt; 
&lt;span class='lineno'&gt; 7&lt;/span&gt; &lt;span class='nx'&gt;automatic_feed_links&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
&lt;span class='lineno'&gt; 8&lt;/span&gt; 
&lt;span class='lineno'&gt; 9&lt;/span&gt; &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nb'&gt;function_exists&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;register_sidebar&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='lineno'&gt;10&lt;/span&gt; 	&lt;span class='nx'&gt;register_sidebar&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;
&lt;span class='lineno'&gt;11&lt;/span&gt; 		&lt;span class='s1'&gt;&amp;#39;before_widget&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;&amp;lt;li id=&amp;quot;%1$s&amp;quot; class=&amp;quot;widget %2$s&amp;quot;&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
&lt;span class='lineno'&gt;12&lt;/span&gt; 		&lt;span class='s1'&gt;&amp;#39;after_widget&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;&amp;lt;/li&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
&lt;span class='lineno'&gt;13&lt;/span&gt; 		&lt;span class='s1'&gt;&amp;#39;before_title&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
&lt;span class='lineno'&gt;14&lt;/span&gt; 		&lt;span class='s1'&gt;&amp;#39;after_title&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
&lt;span class='lineno'&gt;15&lt;/span&gt; 	&lt;span class='p'&gt;));&lt;/span&gt;
&lt;span class='lineno'&gt;16&lt;/span&gt; 
&lt;span class='lineno'&gt;17&lt;/span&gt; &lt;span class='c1'&gt;// Include the script that replaces the default archive widget&lt;/span&gt;
&lt;span class='lineno'&gt;18&lt;/span&gt; &lt;span class='k'&gt;require_once&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;functions-widgets.php&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='lineno'&gt;19&lt;/span&gt; 
&lt;span class='lineno'&gt;20&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x' /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Now create a blank file called &lt;b&gt;functions-widgets.php&lt;/b&gt; and place it in your themes folder. Next, open the file &lt;b&gt;&quot;/wp-includes/default-widgets.php&quot;&lt;/b&gt; and copy lines 210-271. Paste these lines in &lt;b&gt;functions-widgets.php&lt;/b&gt; so it looks like the code below (Note I&amp;#8217;ve added the opening and closing php tags):&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='lineno'&gt; 1&lt;/span&gt; &lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class='lineno'&gt; 2&lt;/span&gt; 
&lt;span class='lineno'&gt; 3&lt;/span&gt; &lt;span class='sd'&gt;/**&lt;/span&gt;
&lt;span class='lineno'&gt; 4&lt;/span&gt; &lt;span class='sd'&gt; * Archives widget class&lt;/span&gt;
&lt;span class='lineno'&gt; 5&lt;/span&gt; &lt;span class='sd'&gt; *&lt;/span&gt;
&lt;span class='lineno'&gt; 6&lt;/span&gt; &lt;span class='sd'&gt; * @since 2.8.0&lt;/span&gt;
&lt;span class='lineno'&gt; 7&lt;/span&gt; &lt;span class='sd'&gt; */&lt;/span&gt;
&lt;span class='lineno'&gt; 8&lt;/span&gt; &lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;WP_Widget_Archives&lt;/span&gt; &lt;span class='k'&gt;extends&lt;/span&gt; &lt;span class='nx'&gt;WP_Widget&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
&lt;span class='lineno'&gt; 9&lt;/span&gt; 
&lt;span class='lineno'&gt;10&lt;/span&gt; 	&lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;WP_Widget_Archives&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
&lt;span class='lineno'&gt;11&lt;/span&gt; 		&lt;span class='nv'&gt;$widget_ops&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;classname&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;widget_archive&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;description&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='nx'&gt;__&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;A monthly archive of your blog&amp;amp;#8217;s posts&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='lineno'&gt;12&lt;/span&gt; 		&lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;WP_Widget&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;archives&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;__&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;Archives&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; &lt;span class='nv'&gt;$widget_ops&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='lineno'&gt;13&lt;/span&gt; 	&lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='lineno'&gt;14&lt;/span&gt; 
&lt;span class='lineno'&gt;15&lt;/span&gt; 	&lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;widget&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nv'&gt;$args&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;$instance&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
&lt;span class='lineno'&gt;16&lt;/span&gt; 		&lt;span class='nb'&gt;extract&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$args&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='lineno'&gt;17&lt;/span&gt; 		&lt;span class='nv'&gt;$c&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;$instance&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;count&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;?&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;1&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;0&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='lineno'&gt;18&lt;/span&gt; 		&lt;span class='nv'&gt;$d&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;$instance&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;dropdown&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;?&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;1&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;0&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='lineno'&gt;19&lt;/span&gt; 		&lt;span class='nv'&gt;$title&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;apply_filters&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;widget_title&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='k'&gt;empty&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$instance&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;title&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;])&lt;/span&gt; &lt;span class='o'&gt;?&lt;/span&gt; &lt;span class='nx'&gt;__&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;Archives&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='nv'&gt;$instance&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;title&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]);&lt;/span&gt;
&lt;span class='lineno'&gt;20&lt;/span&gt; 
&lt;span class='lineno'&gt;21&lt;/span&gt; 		&lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$before_widget&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='lineno'&gt;22&lt;/span&gt; 		&lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nv'&gt;$title&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='lineno'&gt;23&lt;/span&gt; 			&lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$before_title&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='nv'&gt;$title&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='nv'&gt;$after_title&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='lineno'&gt;24&lt;/span&gt; 
&lt;span class='lineno'&gt;25&lt;/span&gt; 		&lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nv'&gt;$d&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
&lt;span class='lineno'&gt;26&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x' /&gt;
&lt;span class='lineno'&gt;27&lt;/span&gt; &lt;span class='x'&gt;		&amp;lt;select name=&amp;quot;archive-dropdown&amp;quot; onchange=&amp;#39;document.location.href=this.options[this.selectedIndex].value;&amp;#39;&amp;gt; &amp;lt;option value=&amp;quot;&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nx'&gt;esc_attr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;__&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;Select Month&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;));&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;lt;/option&amp;gt; &lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='nx'&gt;wp_get_archives&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;apply_filters&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;widget_archives_dropdown_args&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;type&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;monthly&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;format&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;option&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;show_post_count&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='nv'&gt;$c&lt;/span&gt;&lt;span class='p'&gt;)));&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt; &amp;lt;/select&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;28&lt;/span&gt; &lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class='lineno'&gt;29&lt;/span&gt; 		&lt;span class='p'&gt;}&lt;/span&gt; &lt;span class='k'&gt;else&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
&lt;span class='lineno'&gt;30&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x' /&gt;
&lt;span class='lineno'&gt;31&lt;/span&gt; &lt;span class='x'&gt;		&amp;lt;ul&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;32&lt;/span&gt; &lt;span class='x'&gt;		&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='nx'&gt;wp_get_archives&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;apply_filters&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;widget_archives_args&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;type&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;monthly&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;show_post_count&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='nv'&gt;$c&lt;/span&gt;&lt;span class='p'&gt;)));&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x' /&gt;
&lt;span class='lineno'&gt;33&lt;/span&gt; &lt;span class='x'&gt;		&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;34&lt;/span&gt; &lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class='lineno'&gt;35&lt;/span&gt; 		&lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='lineno'&gt;36&lt;/span&gt; 
&lt;span class='lineno'&gt;37&lt;/span&gt; 		&lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$after_widget&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='lineno'&gt;38&lt;/span&gt; 	&lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='lineno'&gt;39&lt;/span&gt; 
&lt;span class='lineno'&gt;40&lt;/span&gt; 	&lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;update&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nv'&gt;$new_instance&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;$old_instance&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
&lt;span class='lineno'&gt;41&lt;/span&gt; 		&lt;span class='nv'&gt;$instance&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;$old_instance&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='lineno'&gt;42&lt;/span&gt; 		&lt;span class='nv'&gt;$new_instance&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;wp_parse_args&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nv'&gt;$new_instance&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;title&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;count&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;dropdown&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='lineno'&gt;43&lt;/span&gt; 		&lt;span class='nv'&gt;$instance&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;title&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nb'&gt;strip_tags&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$new_instance&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;title&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]);&lt;/span&gt;
&lt;span class='lineno'&gt;44&lt;/span&gt; 		&lt;span class='nv'&gt;$instance&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;count&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;$new_instance&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;count&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;?&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt; &lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='lineno'&gt;45&lt;/span&gt; 		&lt;span class='nv'&gt;$instance&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;dropdown&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;$new_instance&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;dropdown&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;?&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt; &lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='lineno'&gt;46&lt;/span&gt; 
&lt;span class='lineno'&gt;47&lt;/span&gt; 		&lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='nv'&gt;$instance&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='lineno'&gt;48&lt;/span&gt; 	&lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='lineno'&gt;49&lt;/span&gt; 
&lt;span class='lineno'&gt;50&lt;/span&gt; 	&lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;form&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nv'&gt;$instance&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
&lt;span class='lineno'&gt;51&lt;/span&gt; 		&lt;span class='nv'&gt;$instance&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;wp_parse_args&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nv'&gt;$instance&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;title&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;count&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;dropdown&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='lineno'&gt;52&lt;/span&gt; 		&lt;span class='nv'&gt;$title&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nb'&gt;strip_tags&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$instance&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;title&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]);&lt;/span&gt;
&lt;span class='lineno'&gt;53&lt;/span&gt; 		&lt;span class='nv'&gt;$count&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;$instance&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;count&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;?&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;checked=&amp;quot;checked&amp;quot;&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='lineno'&gt;54&lt;/span&gt; 		&lt;span class='nv'&gt;$dropdown&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;$instance&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;dropdown&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;?&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;checked=&amp;quot;checked&amp;quot;&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='lineno'&gt;55&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x' /&gt;
&lt;span class='lineno'&gt;56&lt;/span&gt; &lt;span class='x'&gt;		&amp;lt;p&amp;gt;&amp;lt;label for=&amp;quot;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;get_field_id&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;title&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='nx'&gt;_e&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;Title:&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;lt;/label&amp;gt; &amp;lt;input class=&amp;quot;widefat&amp;quot; id=&amp;quot;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;get_field_id&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;title&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;quot; name=&amp;quot;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;get_field_name&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;title&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;quot; type=&amp;quot;text&amp;quot; value=&amp;quot;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nx'&gt;esc_attr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$title&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;quot; /&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;57&lt;/span&gt; &lt;span class='x'&gt;		&amp;lt;p&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;58&lt;/span&gt; &lt;span class='x'&gt;			&amp;lt;input class=&amp;quot;checkbox&amp;quot; type=&amp;quot;checkbox&amp;quot; &lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$count&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt; id=&amp;quot;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;get_field_id&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;count&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;quot; name=&amp;quot;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;get_field_name&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;count&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;quot; /&amp;gt; &amp;lt;label for=&amp;quot;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;get_field_id&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;count&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='nx'&gt;_e&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;Show post counts&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;59&lt;/span&gt; &lt;span class='x'&gt;			&amp;lt;br /&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;60&lt;/span&gt; &lt;span class='x'&gt;			&amp;lt;input class=&amp;quot;checkbox&amp;quot; type=&amp;quot;checkbox&amp;quot; &lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$dropdown&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt; id=&amp;quot;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;get_field_id&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;dropdown&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;quot; name=&amp;quot;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;get_field_name&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;dropdown&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;quot; /&amp;gt; &amp;lt;label for=&amp;quot;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;get_field_id&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;dropdown&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='nx'&gt;_e&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;Display as a drop down&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;61&lt;/span&gt; &lt;span class='x'&gt;		&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;62&lt;/span&gt; &lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class='lineno'&gt;63&lt;/span&gt; 	&lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='lineno'&gt;64&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='lineno'&gt;65&lt;/span&gt; 
&lt;span class='lineno'&gt;66&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x' /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Now rename:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='lineno'&gt;9&lt;/span&gt; &lt;span class='x'&gt;class WP_Widget_Archives extends WP_Widget {&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;to:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='lineno'&gt;9&lt;/span&gt; &lt;span class='x'&gt;class MyTheme_Widget_Archives extends WP_Widget {&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;We did this because we are effectively creating a new widget, so if we want to use the old &amp;#8220;Archives&amp;#8221; widget, we can.&lt;/p&gt;

&lt;p&gt;Now change the following function from:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='lineno'&gt;11&lt;/span&gt; &lt;span class='x'&gt;	function WP_Widget_Archives() {&lt;/span&gt;
&lt;span class='lineno'&gt;12&lt;/span&gt; &lt;span class='x'&gt;		$widget_ops = array(&amp;#39;classname&amp;#39; =&amp;gt; &amp;#39;widget_archive&amp;#39;, &amp;#39;description&amp;#39; =&amp;gt; __( &amp;#39;A monthly archive of your blog&amp;amp;#8217;s posts&amp;#39;) );&lt;/span&gt;
&lt;span class='lineno'&gt;13&lt;/span&gt; &lt;span class='x'&gt;		$this-&amp;gt;WP_Widget(&amp;#39;archives&amp;#39;, __(&amp;#39;Archives&amp;#39;), $widget_ops);&lt;/span&gt;
&lt;span class='lineno'&gt;14&lt;/span&gt; &lt;span class='x'&gt;	}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;to:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='lineno'&gt;11&lt;/span&gt; &lt;span class='x'&gt;	function MyTheme_Widget_Archives() {&lt;/span&gt;
&lt;span class='lineno'&gt;12&lt;/span&gt; &lt;span class='x'&gt;		$widget_ops = array(&amp;#39;classname&amp;#39; =&amp;gt; &amp;#39;widget_archive&amp;#39;, &amp;#39;description&amp;#39; =&amp;gt; __( &amp;#39;A monthly archive of your blog&amp;amp;#8217;s posts&amp;#39;) );&lt;/span&gt;
&lt;span class='lineno'&gt;13&lt;/span&gt; &lt;span class='x'&gt;		$this-&amp;gt;WP_Widget(&amp;#39;mytheme_archives&amp;#39;, __(&amp;#39;MyTheme Archives&amp;#39;), $widget_ops);&lt;/span&gt;
&lt;span class='lineno'&gt;14&lt;/span&gt; &lt;span class='x'&gt;	}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Notice that we not only changed the function name, but we changed the parameters to the WP_Widget call. We did this for the same reason explained above (this is a &amp;#8220;new&amp;#8221; widget, and we want to be able to switch back to the old version).&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p&gt;For this next step, we are going to modify the &lt;i&gt;widget()&lt;/i&gt;, &lt;i&gt;form()&lt;/i&gt;, and &lt;i&gt;update()&lt;/i&gt; calls. These are the functions that display the actual widget in the sidebar, and also display the widget details in the WordPress admin console. For this new widget, I am always going to display the post count, and I&amp;#8217;m never going to display the archive results as a dropdown, so I can remove a few of the variables that are in the default archive widget ($c, $count, $d, $dropdown). To achieve this, you can modify &lt;b&gt;functions-widgets.php&lt;/b&gt; like so:&lt;/p&gt;

&lt;p&gt;Before changes:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='lineno'&gt;15&lt;/span&gt; &lt;span class='x'&gt;	function widget( $args, $instance ) {&lt;/span&gt;
&lt;span class='lineno'&gt;16&lt;/span&gt; &lt;span class='x'&gt;		extract($args);&lt;/span&gt;
&lt;span class='lineno'&gt;17&lt;/span&gt; &lt;span class='x'&gt;		$c = $instance[&amp;#39;count&amp;#39;] ? &amp;#39;1&amp;#39; : &amp;#39;0&amp;#39;;&lt;/span&gt;
&lt;span class='lineno'&gt;18&lt;/span&gt; &lt;span class='x'&gt;		$d = $instance[&amp;#39;dropdown&amp;#39;] ? &amp;#39;1&amp;#39; : &amp;#39;0&amp;#39;;&lt;/span&gt;
&lt;span class='lineno'&gt;19&lt;/span&gt; &lt;span class='x'&gt;		$title = apply_filters(&amp;#39;widget_title&amp;#39;, empty($instance[&amp;#39;title&amp;#39;]) ? __(&amp;#39;Archives&amp;#39;) : $instance[&amp;#39;title&amp;#39;]);&lt;/span&gt;
&lt;span class='lineno'&gt;20&lt;/span&gt; &lt;span class='x'&gt; &lt;/span&gt;
&lt;span class='lineno'&gt;21&lt;/span&gt; &lt;span class='x'&gt;		echo $before_widget;&lt;/span&gt;
&lt;span class='lineno'&gt;22&lt;/span&gt; &lt;span class='x'&gt;		if ( $title )&lt;/span&gt;
&lt;span class='lineno'&gt;23&lt;/span&gt; &lt;span class='x'&gt;			echo $before_title . $title . $after_title;&lt;/span&gt;
&lt;span class='lineno'&gt;24&lt;/span&gt; &lt;span class='x'&gt; &lt;/span&gt;
&lt;span class='lineno'&gt;25&lt;/span&gt; &lt;span class='x'&gt;		if ( $d ) {&lt;/span&gt;
&lt;span class='lineno'&gt;26&lt;/span&gt; &lt;span class='x'&gt;?&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;27&lt;/span&gt; &lt;span class='x'&gt;		&amp;lt;select name=&amp;quot;archive-dropdown&amp;quot; onchange=&amp;#39;document.location.href=this.options[this.selectedIndex].value;&amp;#39;&amp;gt; &amp;lt;option value=&amp;quot;&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nx'&gt;esc_attr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;__&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;Select Month&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;));&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;lt;/option&amp;gt; &lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='nx'&gt;wp_get_archives&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;apply_filters&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;widget_archives_dropdown_args&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;type&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;monthly&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;format&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;option&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;show_post_count&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='nv'&gt;$c&lt;/span&gt;&lt;span class='p'&gt;)));&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt; &amp;lt;/select&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;28&lt;/span&gt; &lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class='lineno'&gt;29&lt;/span&gt; 		&lt;span class='p'&gt;}&lt;/span&gt; &lt;span class='k'&gt;else&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
&lt;span class='lineno'&gt;30&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x' /&gt;
&lt;span class='lineno'&gt;31&lt;/span&gt; &lt;span class='x'&gt;		&amp;lt;ul&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;32&lt;/span&gt; &lt;span class='x'&gt;		&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='nx'&gt;wp_get_archives&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;apply_filters&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;widget_archives_args&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;type&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;monthly&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;show_post_count&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='nv'&gt;$c&lt;/span&gt;&lt;span class='p'&gt;)));&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x' /&gt;
&lt;span class='lineno'&gt;33&lt;/span&gt; &lt;span class='x'&gt;		&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;34&lt;/span&gt; &lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class='lineno'&gt;35&lt;/span&gt; 		&lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='lineno'&gt;36&lt;/span&gt;  
&lt;span class='lineno'&gt;37&lt;/span&gt; 		&lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$after_widget&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='lineno'&gt;38&lt;/span&gt; 	&lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='lineno'&gt;39&lt;/span&gt;  
&lt;span class='lineno'&gt;40&lt;/span&gt; 	&lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;update&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nv'&gt;$new_instance&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;$old_instance&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
&lt;span class='lineno'&gt;41&lt;/span&gt; 		&lt;span class='nv'&gt;$instance&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;$old_instance&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='lineno'&gt;42&lt;/span&gt; 		&lt;span class='nv'&gt;$new_instance&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;wp_parse_args&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nv'&gt;$new_instance&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;title&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;count&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;dropdown&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='lineno'&gt;43&lt;/span&gt; 		&lt;span class='nv'&gt;$instance&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;title&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nb'&gt;strip_tags&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$new_instance&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;title&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]);&lt;/span&gt;
&lt;span class='lineno'&gt;44&lt;/span&gt; 		&lt;span class='nv'&gt;$instance&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;count&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;$new_instance&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;count&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;?&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt; &lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='lineno'&gt;45&lt;/span&gt; 		&lt;span class='nv'&gt;$instance&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;dropdown&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;$new_instance&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;dropdown&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;?&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt; &lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='lineno'&gt;46&lt;/span&gt;  
&lt;span class='lineno'&gt;47&lt;/span&gt; 		&lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='nv'&gt;$instance&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='lineno'&gt;48&lt;/span&gt; 	&lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='lineno'&gt;49&lt;/span&gt;  
&lt;span class='lineno'&gt;50&lt;/span&gt; 	&lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;form&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nv'&gt;$instance&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
&lt;span class='lineno'&gt;51&lt;/span&gt; 		&lt;span class='nv'&gt;$instance&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;wp_parse_args&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nv'&gt;$instance&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;title&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;count&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;dropdown&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='lineno'&gt;52&lt;/span&gt; 		&lt;span class='nv'&gt;$title&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nb'&gt;strip_tags&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$instance&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;title&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]);&lt;/span&gt;
&lt;span class='lineno'&gt;53&lt;/span&gt; 		&lt;span class='nv'&gt;$count&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;$instance&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;count&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;?&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;checked=&amp;quot;checked&amp;quot;&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='lineno'&gt;54&lt;/span&gt; 		&lt;span class='nv'&gt;$dropdown&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;$instance&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;dropdown&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;?&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;checked=&amp;quot;checked&amp;quot;&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='lineno'&gt;55&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x' /&gt;
&lt;span class='lineno'&gt;56&lt;/span&gt; &lt;span class='x'&gt;		&amp;lt;p&amp;gt;&amp;lt;label for=&amp;quot;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;get_field_id&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;title&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='nx'&gt;_e&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;Title:&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;lt;/label&amp;gt; &amp;lt;input class=&amp;quot;widefat&amp;quot; id=&amp;quot;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;get_field_id&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;title&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;quot; name=&amp;quot;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;get_field_name&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;title&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;quot; type=&amp;quot;text&amp;quot; value=&amp;quot;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nx'&gt;esc_attr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$title&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;quot; /&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;57&lt;/span&gt; &lt;span class='x'&gt;		&amp;lt;p&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;58&lt;/span&gt; &lt;span class='x'&gt;			&amp;lt;input class=&amp;quot;checkbox&amp;quot; type=&amp;quot;checkbox&amp;quot; &lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$count&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt; id=&amp;quot;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;get_field_id&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;count&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;quot; name=&amp;quot;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;get_field_name&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;count&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;quot; /&amp;gt; &amp;lt;label for=&amp;quot;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;get_field_id&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;count&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='nx'&gt;_e&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;Show post counts&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;59&lt;/span&gt; &lt;span class='x'&gt;			&amp;lt;br /&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;60&lt;/span&gt; &lt;span class='x'&gt;			&amp;lt;input class=&amp;quot;checkbox&amp;quot; type=&amp;quot;checkbox&amp;quot; &lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$dropdown&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt; id=&amp;quot;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;get_field_id&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;dropdown&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;quot; name=&amp;quot;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;get_field_name&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;dropdown&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;quot; /&amp;gt; &amp;lt;label for=&amp;quot;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;get_field_id&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;dropdown&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='nx'&gt;_e&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;Display as a drop down&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;61&lt;/span&gt; &lt;span class='x'&gt;		&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;62&lt;/span&gt; &lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class='lineno'&gt;63&lt;/span&gt; 	&lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='lineno'&gt;64&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='lineno'&gt;65&lt;/span&gt;  
&lt;span class='lineno'&gt;66&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x' /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;After changes:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='lineno'&gt;15&lt;/span&gt; &lt;span class='x'&gt;	function widget( $args, $instance ) {&lt;/span&gt;
&lt;span class='lineno'&gt;16&lt;/span&gt; &lt;span class='x'&gt;		extract($args);&lt;/span&gt;
&lt;span class='lineno'&gt;17&lt;/span&gt; &lt;span class='x'&gt;		$title = apply_filters(&amp;#39;widget_title&amp;#39;, empty($instance[&amp;#39;title&amp;#39;]) ? __(&amp;#39;Archives&amp;#39;) : $instance[&amp;#39;title&amp;#39;]);&lt;/span&gt;
&lt;span class='lineno'&gt;18&lt;/span&gt; &lt;span class='x'&gt; &lt;/span&gt;
&lt;span class='lineno'&gt;19&lt;/span&gt; &lt;span class='x'&gt;		echo $before_widget;&lt;/span&gt;
&lt;span class='lineno'&gt;20&lt;/span&gt; &lt;span class='x'&gt;		if ( $title )&lt;/span&gt;
&lt;span class='lineno'&gt;21&lt;/span&gt; &lt;span class='x'&gt;			echo $before_title . $title . $after_title;&lt;/span&gt;
&lt;span class='lineno'&gt;22&lt;/span&gt; &lt;span class='x'&gt; ?&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;23&lt;/span&gt; &lt;span class='x'&gt;		&amp;lt;ul&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;24&lt;/span&gt; &lt;span class='x'&gt;			// We will complete this in the next step&lt;/span&gt;
&lt;span class='lineno'&gt;25&lt;/span&gt; &lt;span class='x'&gt;		&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;26&lt;/span&gt; &lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class='lineno'&gt;27&lt;/span&gt; 		&lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='lineno'&gt;28&lt;/span&gt;  
&lt;span class='lineno'&gt;29&lt;/span&gt; 		&lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$after_widget&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='lineno'&gt;30&lt;/span&gt; 	&lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='lineno'&gt;31&lt;/span&gt;  
&lt;span class='lineno'&gt;32&lt;/span&gt; 	&lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;update&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nv'&gt;$new_instance&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;$old_instance&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
&lt;span class='lineno'&gt;33&lt;/span&gt; 		&lt;span class='nv'&gt;$instance&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;$old_instance&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='lineno'&gt;34&lt;/span&gt; 		&lt;span class='nv'&gt;$instance&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;title&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nb'&gt;strip_tags&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$new_instance&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;title&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]);&lt;/span&gt;
&lt;span class='lineno'&gt;35&lt;/span&gt; 
&lt;span class='lineno'&gt;36&lt;/span&gt; 		&lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='nv'&gt;$instance&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='lineno'&gt;37&lt;/span&gt; 	&lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='lineno'&gt;38&lt;/span&gt;  
&lt;span class='lineno'&gt;39&lt;/span&gt; 	&lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;form&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nv'&gt;$instance&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
&lt;span class='lineno'&gt;40&lt;/span&gt; 		&lt;span class='c1'&gt;//Defaults&lt;/span&gt;
&lt;span class='lineno'&gt;41&lt;/span&gt; 		&lt;span class='nv'&gt;$instance&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;wp_parse_args&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nv'&gt;$instance&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;title&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='lineno'&gt;42&lt;/span&gt; 		&lt;span class='nv'&gt;$title&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;esc_attr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nv'&gt;$instance&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;title&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='lineno'&gt;43&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x' /&gt;
&lt;span class='lineno'&gt;44&lt;/span&gt; &lt;span class='x'&gt;		&amp;lt;p&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;45&lt;/span&gt; &lt;span class='x'&gt;			&amp;lt;label for=&amp;quot;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;get_field_id&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;title&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='nx'&gt;_e&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;Title:&amp;#39;&lt;/span&gt; &lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;46&lt;/span&gt; &lt;span class='x'&gt;			&amp;lt;input class=&amp;quot;widefat&amp;quot; id=&amp;quot;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;get_field_id&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;title&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;quot; name=&amp;quot;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;get_field_name&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;title&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;quot; type=&amp;quot;text&amp;quot; value=&amp;quot;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; &lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$title&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;quot; /&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;47&lt;/span&gt; &lt;span class='x'&gt;		&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;48&lt;/span&gt; &lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class='lineno'&gt;49&lt;/span&gt; 	&lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='lineno'&gt;50&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='lineno'&gt;51&lt;/span&gt;  
&lt;span class='lineno'&gt;52&lt;/span&gt; &lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x' /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Now there&amp;#8217;s one final step. We need to actually display the archives. To do that, we need to modify the &lt;i&gt;widget()&lt;/i&gt; function. In the last step, we were left with the following line:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='lineno'&gt;23&lt;/span&gt; &lt;span class='x'&gt;		&amp;lt;ul&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;24&lt;/span&gt; &lt;span class='x'&gt;			// We will complete this in the next step&lt;/span&gt;
&lt;span class='lineno'&gt;25&lt;/span&gt; &lt;span class='x'&gt;		&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;We are now going to complete this block of code. Open up &lt;b&gt;&quot;/wp-includes/general-template.php&quot;&lt;/b&gt; and copy lines 799-825. Paste them into line 24 of &lt;b&gt;functions-widgets.php&lt;/b&gt; which will give you:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='lineno'&gt;23&lt;/span&gt; &lt;span class='x'&gt;		&amp;lt;ul&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;24&lt;/span&gt; &lt;span class='x'&gt;		if ( &amp;#39;monthly&amp;#39; == $type ) {&lt;/span&gt;
&lt;span class='lineno'&gt;25&lt;/span&gt; &lt;span class='x'&gt;			$query = &amp;quot;SELECT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, count(ID) as posts FROM $wpdb-&amp;gt;posts $join $where GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date DESC $limit&amp;quot;;&lt;/span&gt;
&lt;span class='lineno'&gt;26&lt;/span&gt; &lt;span class='x'&gt;			$key = md5($query);&lt;/span&gt;
&lt;span class='lineno'&gt;27&lt;/span&gt; &lt;span class='x'&gt;			$cache = wp_cache_get( &amp;#39;wp_get_archives&amp;#39; , &amp;#39;general&amp;#39;);&lt;/span&gt;
&lt;span class='lineno'&gt;28&lt;/span&gt; &lt;span class='x'&gt;			if ( !isset( $cache[ $key ] ) ) {&lt;/span&gt;
&lt;span class='lineno'&gt;29&lt;/span&gt; &lt;span class='x'&gt;				$arcresults = $wpdb-&amp;gt;get_results($query);&lt;/span&gt;
&lt;span class='lineno'&gt;30&lt;/span&gt; &lt;span class='x'&gt;				$cache[ $key ] = $arcresults;&lt;/span&gt;
&lt;span class='lineno'&gt;31&lt;/span&gt; &lt;span class='x'&gt;				wp_cache_add( &amp;#39;wp_get_archives&amp;#39;, $cache, &amp;#39;general&amp;#39; );&lt;/span&gt;
&lt;span class='lineno'&gt;32&lt;/span&gt; &lt;span class='x'&gt;			} else {&lt;/span&gt;
&lt;span class='lineno'&gt;33&lt;/span&gt; &lt;span class='x'&gt;				$arcresults = $cache[ $key ];&lt;/span&gt;
&lt;span class='lineno'&gt;34&lt;/span&gt; &lt;span class='x'&gt;			}&lt;/span&gt;
&lt;span class='lineno'&gt;35&lt;/span&gt; &lt;span class='x'&gt;			if ( $arcresults ) {&lt;/span&gt;
&lt;span class='lineno'&gt;36&lt;/span&gt; &lt;span class='x'&gt;				$afterafter = $after;&lt;/span&gt;
&lt;span class='lineno'&gt;37&lt;/span&gt; &lt;span class='x'&gt;				foreach ( (array) $arcresults as $arcresult ) {&lt;/span&gt;
&lt;span class='lineno'&gt;38&lt;/span&gt; &lt;span class='x'&gt;					$url = get_month_link( $arcresult-&amp;gt;year, $arcresult-&amp;gt;month );&lt;/span&gt;
&lt;span class='lineno'&gt;39&lt;/span&gt; &lt;span class='x'&gt;					$text = sprintf(__(&amp;#39;%1$s %2$d&amp;#39;), $wp_locale-&amp;gt;get_month($arcresult-&amp;gt;month), $arcresult-&amp;gt;year);&lt;/span&gt;
&lt;span class='lineno'&gt;40&lt;/span&gt; &lt;span class='x'&gt;					if ( $show_post_count )&lt;/span&gt;
&lt;span class='lineno'&gt;41&lt;/span&gt; &lt;span class='x'&gt;						$after = &amp;#39;&amp;amp;nbsp;(&amp;#39;.$arcresult-&amp;gt;posts.&amp;#39;)&amp;#39; . $afterafter;&lt;/span&gt;
&lt;span class='lineno'&gt;42&lt;/span&gt; &lt;span class='x'&gt;					$output .= get_archives_link($url, $text, $format, $before, $after);&lt;/span&gt;
&lt;span class='lineno'&gt;43&lt;/span&gt; &lt;span class='x'&gt;				}&lt;/span&gt;
&lt;span class='lineno'&gt;44&lt;/span&gt; &lt;span class='x'&gt;			}&lt;/span&gt;
&lt;span class='lineno'&gt;45&lt;/span&gt; &lt;span class='x'&gt;		&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The first thing you&amp;#8217;ll notice is the &lt;b&gt;if ( 'monthly' == $type )&lt;/b&gt; statement. We can remove this clause, because the &amp;#8220;custom archive plugin&amp;#8221; will only show archives by month (I wanted to keep it simple- no need for other display types). Also, this code is using a few global variables ($wpdb, $wp_locale) that aren&amp;#8217;t yet being used properly in our version of the &lt;i&gt;widget()&lt;/i&gt; function. We need to modify &lt;b&gt;functions-widgets.php&lt;/b&gt; again to have the following line which will declare our global variables for use inside the function:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='x'&gt;	function widget( $args, $instance ) {&lt;/span&gt;
&lt;span class='x'&gt;		global $wpdb, $wp_locale;&lt;/span&gt;
&lt;span class='x'&gt;		extract($args);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Also, when we copied code the first time, we didn&amp;#8217;t copy a few of the variables being used ($where and $join). Modify &lt;b&gt;functions-widgets.php&lt;/b&gt; like so (adding lines 25-27):&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='lineno'&gt;24&lt;/span&gt; &lt;span class='x'&gt;		&amp;lt;ul&amp;gt;&lt;/span&gt;
&lt;span class='lineno'&gt;25&lt;/span&gt; &lt;span class='x'&gt;		//filters&lt;/span&gt;
&lt;span class='lineno'&gt;26&lt;/span&gt; &lt;span class='x'&gt;		$where = apply_filters(&amp;#39;getarchives_where&amp;#39;, &amp;quot;WHERE post_type = &amp;#39;post&amp;#39; AND post_status = &amp;#39;publish&amp;#39;&amp;quot;, $r );&lt;/span&gt;
&lt;span class='lineno'&gt;27&lt;/span&gt; &lt;span class='x'&gt;		$join = apply_filters(&amp;#39;getarchives_join&amp;#39;, &amp;quot;&amp;quot;, $r);&lt;/span&gt;
&lt;span class='lineno'&gt;28&lt;/span&gt; 
&lt;span class='lineno'&gt;29&lt;/span&gt; &lt;span class='x'&gt;		$query = &amp;quot;SELECT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, count(ID) as posts FROM $wpdb-&amp;gt;posts $join $where GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date DESC $limit&amp;quot;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Another thing about the code we copied: we can ignore the $post_count variable (since we are &lt;em&gt;always&lt;/em&gt; showing post counts). We also want to make sure the post count shows up inside our anchor tag. To accomplish that, we can change:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='x'&gt;$url = get_month_link( $arcresult-&amp;gt;year, $arcresult-&amp;gt;month );&lt;/span&gt;
&lt;span class='x'&gt;$text = sprintf(__(&amp;#39;%1$s %2$d&amp;#39;), $wp_locale-&amp;gt;get_month($arcresult-&amp;gt;month), $arcresult-&amp;gt;year);&lt;/span&gt;
&lt;span class='x'&gt;if ( $show_post_count )&lt;/span&gt;
&lt;span class='x'&gt;	$after = &amp;#39;&amp;amp;nbsp;(&amp;#39;.$arcresult-&amp;gt;posts.&amp;#39;)&amp;#39; . $afterafter;&lt;/span&gt;
&lt;span class='x'&gt;$output .= get_archives_link($url, $text, $format, $before, $after);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;to:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='x'&gt;$url = get_month_link( $arcresult-&amp;gt;year, $arcresult-&amp;gt;month );&lt;/span&gt;
&lt;span class='x'&gt;$text = sprintf(__(&amp;#39;%1$s %2$d&amp;#39;), $wp_locale-&amp;gt;get_month($arcresult-&amp;gt;month), $arcresult-&amp;gt;year);&lt;/span&gt;
&lt;span class='x'&gt;$text .= &amp;#39;&amp;amp;nbsp;(&amp;#39;.$arcresult-&amp;gt;posts.&amp;#39;)&amp;#39; . $afterafter;&lt;/span&gt;
&lt;span class='x'&gt;$output .= get_archives_link($url, $text, $format, &amp;#39;&amp;lt;li&amp;gt;&amp;#39;, &amp;#39;&amp;lt;/li&amp;gt;&amp;#39;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Also add the correct output line before the &lt;i&gt;widget()&lt;/i&gt; function ends:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='x'&gt;		echo &amp;#39;&amp;lt;ul&amp;gt;&amp;#39; . $output . &amp;#39;&amp;lt;/ul&amp;gt;&amp;#39;;&lt;/span&gt;
&lt;span class='x'&gt;		echo $after_widget;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Our hacked/modified version is almost complete. The last thing I&amp;#8217;m going to do is register the new archive widget (and unregister the default version). Do so by adding the following &lt;i&gt;mytheme_widget_init()&lt;/i&gt; function to &lt;b&gt;functions-widgets.php&lt;/b&gt;, then calling it:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='lineno'&gt;80&lt;/span&gt; &lt;span class='x'&gt;/**&lt;/span&gt;
&lt;span class='lineno'&gt;81&lt;/span&gt; &lt;span class='x'&gt; * Registering MyTheme Widgets&lt;/span&gt;
&lt;span class='lineno'&gt;82&lt;/span&gt; &lt;span class='x'&gt; * Removing a few default WordPress Widgets&lt;/span&gt;
&lt;span class='lineno'&gt;83&lt;/span&gt; &lt;span class='x'&gt; *&lt;/span&gt;
&lt;span class='lineno'&gt;84&lt;/span&gt; &lt;span class='x'&gt; * @since 1.0&lt;/span&gt;
&lt;span class='lineno'&gt;85&lt;/span&gt; &lt;span class='x'&gt; */&lt;/span&gt;
&lt;span class='lineno'&gt;86&lt;/span&gt; &lt;span class='x'&gt;function mytheme_widget_init() {&lt;/span&gt;
&lt;span class='lineno'&gt;87&lt;/span&gt; &lt;span class='x'&gt;	// unregister some default widgets&lt;/span&gt;
&lt;span class='lineno'&gt;88&lt;/span&gt; &lt;span class='x'&gt;	unregister_widget(&amp;#39;WP_Widget_Archives&amp;#39;);&lt;/span&gt;
&lt;span class='lineno'&gt;89&lt;/span&gt; 
&lt;span class='lineno'&gt;90&lt;/span&gt; &lt;span class='x'&gt;	// register my own widgets&lt;/span&gt;
&lt;span class='lineno'&gt;91&lt;/span&gt; &lt;span class='x'&gt;	register_widget(&amp;#39;MyTheme_Widget_Archives&amp;#39;);&lt;/span&gt;
&lt;span class='lineno'&gt;92&lt;/span&gt; &lt;span class='x'&gt;}&lt;/span&gt;
&lt;span class='lineno'&gt;93&lt;/span&gt; 
&lt;span class='lineno'&gt;94&lt;/span&gt; &lt;span class='x'&gt;add_action(&amp;#39;widgets_init&amp;#39;, &amp;#39;mytheme_widget_init&amp;#39;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;After completing the above steps, your post count will show up inside the anchor tag. One final (optional) step is modifying the &lt;b&gt;style.css&lt;/b&gt; file so archive links are highlighted when hovering. For the &amp;#8220;classic-modified&amp;#8221; theme, I&amp;#8217;m going to add:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='css'&gt;&lt;span class='lineno'&gt;371&lt;/span&gt; &lt;span class='c'&gt;/* Custom styles for archive widget */&lt;/span&gt;
&lt;span class='lineno'&gt;372&lt;/span&gt; &lt;span class='nc'&gt;.widget_archive&lt;/span&gt;&lt;span class='o'&gt;,&lt;/span&gt;
&lt;span class='lineno'&gt;373&lt;/span&gt; &lt;span class='nc'&gt;.widget_archive&lt;/span&gt; &lt;span class='nt'&gt;ul&lt;/span&gt;&lt;span class='o'&gt;,&lt;/span&gt;
&lt;span class='lineno'&gt;374&lt;/span&gt; &lt;span class='nc'&gt;.widget_archive&lt;/span&gt; &lt;span class='nt'&gt;ul&lt;/span&gt; &lt;span class='nt'&gt;li&lt;/span&gt;&lt;span class='o'&gt;,&lt;/span&gt;
&lt;span class='lineno'&gt;375&lt;/span&gt; &lt;span class='nc'&gt;.widget_archive&lt;/span&gt; &lt;span class='nt'&gt;ul&lt;/span&gt; &lt;span class='nt'&gt;li&lt;/span&gt; &lt;span class='nt'&gt;ul&lt;/span&gt;&lt;span class='o'&gt;,&lt;/span&gt;
&lt;span class='lineno'&gt;376&lt;/span&gt; &lt;span class='nc'&gt;.widget_archive&lt;/span&gt; &lt;span class='nt'&gt;ul&lt;/span&gt; &lt;span class='nt'&gt;li&lt;/span&gt; &lt;span class='nt'&gt;ul&lt;/span&gt; &lt;span class='nt'&gt;li&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='k'&gt;border&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;0px&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='k'&gt;margin&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;0px&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='k'&gt;padding&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;0px&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='k'&gt;list-style&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='k'&gt;none&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='k'&gt;display&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='k'&gt;block&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='lineno'&gt;377&lt;/span&gt; &lt;span class='nc'&gt;.widget_archive&lt;/span&gt; &lt;span class='nt'&gt;ul&lt;/span&gt; &lt;span class='nt'&gt;li&lt;/span&gt; &lt;span class='nt'&gt;a&lt;/span&gt;&lt;span class='o'&gt;,&lt;/span&gt;
&lt;span class='lineno'&gt;378&lt;/span&gt; &lt;span class='nc'&gt;.widget_archive&lt;/span&gt; &lt;span class='nt'&gt;ul&lt;/span&gt; &lt;span class='nt'&gt;li&lt;/span&gt; &lt;span class='nt'&gt;ul&lt;/span&gt; &lt;span class='nt'&gt;li&lt;/span&gt; &lt;span class='nt'&gt;a&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='k'&gt;display&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='k'&gt;block&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='k'&gt;border-bottom&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='m'&gt;1px&lt;/span&gt; &lt;span class='k'&gt;dotted&lt;/span&gt; &lt;span class='m'&gt;#666&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='k'&gt;margin&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;0px&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='k'&gt;padding&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;0px&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='lineno'&gt;379&lt;/span&gt; &lt;span class='nc'&gt;.widget_archive&lt;/span&gt; &lt;span class='nt'&gt;ul&lt;/span&gt; &lt;span class='nt'&gt;li&lt;/span&gt; &lt;span class='nt'&gt;a&lt;/span&gt;&lt;span class='o'&gt;,&lt;/span&gt;
&lt;span class='lineno'&gt;380&lt;/span&gt; &lt;span class='nc'&gt;.widget_archive&lt;/span&gt; &lt;span class='nt'&gt;ul&lt;/span&gt; &lt;span class='nt'&gt;li&lt;/span&gt; &lt;span class='nt'&gt;a&lt;/span&gt;&lt;span class='nd'&gt;:link&lt;/span&gt;&lt;span class='o'&gt;,&lt;/span&gt;
&lt;span class='lineno'&gt;381&lt;/span&gt; &lt;span class='nc'&gt;.widget_archive&lt;/span&gt; &lt;span class='nt'&gt;ul&lt;/span&gt; &lt;span class='nt'&gt;li&lt;/span&gt; &lt;span class='nt'&gt;a&lt;/span&gt;&lt;span class='nd'&gt;:visited&lt;/span&gt;&lt;span class='o'&gt;,&lt;/span&gt;
&lt;span class='lineno'&gt;382&lt;/span&gt; &lt;span class='nc'&gt;.widget_archive&lt;/span&gt; &lt;span class='nt'&gt;ul&lt;/span&gt; &lt;span class='nt'&gt;li&lt;/span&gt; &lt;span class='nt'&gt;a&lt;/span&gt;&lt;span class='nd'&gt;:hover&lt;/span&gt;&lt;span class='o'&gt;,&lt;/span&gt;
&lt;span class='lineno'&gt;383&lt;/span&gt; &lt;span class='nc'&gt;.widget_archive&lt;/span&gt; &lt;span class='nt'&gt;ul&lt;/span&gt; &lt;span class='nt'&gt;li&lt;/span&gt; &lt;span class='nt'&gt;a&lt;/span&gt;&lt;span class='nd'&gt;:active&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='k'&gt;text-decoration&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='k'&gt;none&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='lineno'&gt;384&lt;/span&gt; &lt;span class='nc'&gt;.widget_archive&lt;/span&gt; &lt;span class='nt'&gt;ul&lt;/span&gt; &lt;span class='nt'&gt;li&lt;/span&gt; &lt;span class='nt'&gt;a&lt;/span&gt;&lt;span class='nd'&gt;:hover&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='k'&gt;background&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;#eee&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;h4 style='text-decoration:underline'&gt;Comparison of default archive widget behavior vs. modified version&lt;/h4&gt;&lt;div class='clearfix' style='width:600px;margin:0 auto;'&gt;
	&lt;div class='left'&gt;
		&lt;p&gt;&lt;b&gt;BEFORE (default archive widget):&lt;/b&gt;&lt;/p&gt;
		&lt;img src='/images/posts/2009/09/22/classic-screen.gif' title='Classic Theme Screenshot' alt='BEFORE (default archive widget)' width='212' height='102' /&gt;
	&lt;/div&gt;
	&lt;div class='right'&gt;
		&lt;p&gt;&lt;b&gt;AFTER (modified archive widget):&lt;/b&gt;&lt;/p&gt;
		&lt;img src='/images/posts/2009/09/22/classic-modified-screen.gif' title='Classic-Modified Theme Screenshot' alt='AFTER (modified archive widget)' width='212' height='102' /&gt;
	&lt;/div&gt;
&lt;/div&gt;</content>
	</entry>
	
	<entry>
		<title>About</title>
		<link href="http://skratchdot.com/2009/09/about-this-blog" />
		<updated>2009-09-09T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2009/09/about-this-blog</id>
		<content type="html">&lt;p&gt;I&amp;#8217;m going to use this site to share some of my projects from the past and present. I probably won&amp;#8217;t be blogging much, but if I come across something interesting, there&amp;#8217;s always a chance it&amp;#8217;ll find it&amp;#8217;s way here.&lt;/p&gt;</content>
	</entry>
	
	<entry>
		<title>ESX Wave Organizer - Version 0.1.8 Released</title>
		<link href="http://skratchdot.com/2005/07/esx-wave-organizer-version-0-1-8-released" />
		<updated>2005-07-17T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2005/07/esx-wave-organizer-version-0-1-8-released</id>
		<content type="html">&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;BUGFIX: Fixed a bug that was ignoring certain .aif/.aiff files.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;BUGFIX: Fixed a CPU Memory Leak that occured when using the &amp;#8220;Remove All Samples&amp;#8221; Fuction. Previously, I was only freeing CPU memory when using the &amp;#8220;Remove Currently Selected Sample&amp;#8221; or &amp;#8220;Remove All Samples Not Used In A Pattern&amp;#8221; Fuctions. This could slow down your system (only while the program was running) if you repeatedly used the &amp;#8220;Remove All Samples&amp;#8221; Fuction in a session.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;BUGFIX: Fixed a bug that was not displaying the STEREO Sample Names in the Pattern Organizer.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;BUGFIX: Fixed another bug that was not always storing &amp;#8220;SLICE&amp;#8221; samples correctly. Search the forums for more info about this bug.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Changed the name of the &amp;#8220;Pattern Organizer&amp;#8221; to &amp;#8220;Pattern Editor&amp;#8221;.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Changed the name of the &amp;#8220;Song Organizer&amp;#8221; to &amp;#8220;Song Editor&amp;#8221;.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;The Song Editor works now.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Added Minimize/Maximize Buttons to the Pattern Editor and the Song Editor.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
	</entry>
	
	<entry>
		<title>ESX Wave Organizer - Version 0.1.7 Released</title>
		<link href="http://skratchdot.com/2005/07/esx-wave-organizer-version-0-1-7-released" />
		<updated>2005-07-10T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2005/07/esx-wave-organizer-version-0-1-7-released</id>
		<content type="html">&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Added a &amp;#8220;first loading slot&amp;#8221; feature. Previously, all samples would try to load into slot #000. If that was already in use, it would find the next available slot. Now, you can set the first slot number to try. It will then find the next available slot (looping around when it gets to the end).&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Changed the &amp;#8220;About Box&amp;#8221;. Now you can click on my email address to open your default email client to email me, or click on the program&amp;#8217;s webpage url to open your default webbrowser and visit the homepage.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Removed the &amp;#8220;Push Up&amp;#8221; and &amp;#8220;Push Down&amp;#8221; buttons (which weren&amp;#8217;t implemented), and replaced them with the &amp;#8220;NEVER LOOP&amp;#8221; and &amp;#8220;LOOP WHOLE&amp;#8221; buttons.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;The &amp;#8220;NEVER LOOP&amp;#8221; button sets the sample&amp;#8217;s &amp;#8220;Loop Start&amp;#8221; value equal to the sample&amp;#8217;s &amp;#8220;End&amp;#8221; value. This means that the sample will never loop when played as a keyboard part.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;The &amp;#8220;LOOP WHOLE&amp;#8221; button sets the sample&amp;#8217;s &amp;#8220;Loop Start&amp;#8221; value equal to the sample&amp;#8217;s &amp;#8220;Start&amp;#8221; value. This means that the sample will loop completely when played as a keyboard part.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;The &amp;#8220;LOOP&amp;#8221; button will only work for MONO samples that have a &amp;#8220;Loop Start&amp;#8221; value. If a sample doesn&amp;#8217;t have a &amp;#8220;Loop start&amp;#8221; value (and you want to hear it loop), you can press the &amp;#8220;LOOP WHOLE&amp;#8221; button. Now you can press the &amp;#8220;LOOP&amp;#8221; button.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Changed the &amp;#8220;Extract All Waves&amp;#8221; feature. Before it would rename files with the sample name last. Now it renames them with the sample name first. So:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;BEFORE: &amp;#8220;ESXextracted-MONO-140-M1PickBs.wav&amp;#8221;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;NOW: &amp;#8220;M1PickBs-MONO-140-ESXextracted.wav&amp;#8221;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Changed the button name &amp;#8220;Remove The Selected Wave&amp;#8221; to &amp;#8220;Remove The Selected Sample&amp;#8221;.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Changed the button name &amp;#8220;Edit The Selected Wave&amp;#8221; to &amp;#8220;Edit The Selected Sample&amp;#8221;.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Added a &amp;#8220;Convert Selected Sample (MONO/ST)&amp;#8221; button. This will convert a Mono Sample to a Stereo Sample, or a Stereo Sample to a Mono Sample (depending on what is selected, and how much free space there is).&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;BUGFIX: Before I was only accepting files with the extensions (.esx, .wav, and .aif). I was ignoring all other files (including .aiff). Now I am accepting .aiff as well as .aif, so: (.esx, .wav, .aif, and .aiff are all the acceptable formats). Thanks to Jayzilla for reporting this.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Added a &amp;#8220;Pattern List&amp;#8221; Column in the Sample Organizers, which let you see what Patterns a Sample is used in.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Added a &amp;#8220;Remove All Samples Not Used In A Pattern&amp;#8221; function. This lets you free up space by removing any samples that aren&amp;#8217;t being used.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Added a &amp;#8220;Mono Organizer&amp;#8221; function. This opens up a new dialog window, which will let you select multiple samples, and move them around (by dragging them). Hold down the shift button to select multiple samples. You can rename multiple samples, and change their stretch step values. If you check the &amp;#8220;Add Number&amp;#8221; box, then you can rename multiple samples, and a unique number will be added to the end of the sample name (for instance: if you type &amp;#8220;bass&amp;#8221;, your samples will be renamed &amp;#8220;bass0&amp;#8221;, &amp;#8220;bass1&amp;#8221;, &amp;#8220;bass2&amp;#8221;, etc.).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
	</entry>
	
	<entry>
		<title>ESX Wave Organizer - Version 0.1.6 Released</title>
		<link href="http://skratchdot.com/2005/06/esx-wave-organizer-version-0-1-6-released" />
		<updated>2005-06-17T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2005/06/esx-wave-organizer-version-0-1-6-released</id>
		<content type="html">&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Fixed major &amp;#8220;SLICE&amp;#8221; problem. Before, if you moved a sample that had been sliced on the ESX, it would not play back properly without being &amp;#8220;re-sliced&amp;#8221;. This has now been fixed.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Added &amp;#8220;Set All Play Levels To&amp;#8221; to the Functions menu. This will let you set them to either 0dB or +12dB.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Fixed typos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;changed &amp;#8220;Fuctions&amp;#8221; to &amp;#8220;Functions&amp;#8221;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;changed &amp;#8220;Exit Part Editor&amp;#8221; to &amp;#8220;Exit Pattern Editor&amp;#8221;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
	</entry>
	
	<entry>
		<title>ESX Wave Organizer - Version 0.1.5 BETA</title>
		<link href="http://skratchdot.com/2004/12/esx-wave-organizer-version-0-1-5-beta" />
		<updated>2004-12-01T00:00:00-05:00</updated>
		<id>http://skratchdot.com/2004/12/esx-wave-organizer-version-0-1-5-beta</id>
		<content type="html">&lt;ul&gt;
&lt;li&gt;Added the &amp;#8220;Pattern Editor&amp;#8221; with limited functionality&lt;/li&gt;
&lt;/ul&gt;</content>
	</entry>
	
	<entry>
		<title>ESX Wave Organizer - Version 0.1.4 Released</title>
		<link href="http://skratchdot.com/2004/11/esx-wave-organizer-version-0-1-4-released" />
		<updated>2004-11-17T00:00:00-05:00</updated>
		<id>http://skratchdot.com/2004/11/esx-wave-organizer-version-0-1-4-released</id>
		<content type="html">&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You can now view if a sample has been time sliced or not.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;You can now view and set the Play Level for each samples.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;BUG FIX == Before, if the focus was on Mono Sample 001, and you clicked on a &amp;#8220;greyed&amp;#8221; Stereo Sample 001, the focus would still be on Mono Sample 001. This has been fixed. No matter what sample you click on, it will always become the focus&amp;#8230;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;BUG FIX == Before I accept an .esx file into the workspace, I do a few checks on the file. It must contain the values &amp;#8220;KORG&amp;#8221; in 2 places; it must contain the value 0x71 in two places; and it must contain the value &amp;#8220;ESX&amp;#8221; in one place. Previously, I was also making sure that it had the value &amp;#8220;BPS&amp;#8221; in one place. This was not needed, and it was not true for all .esx files. I found this out because someone emailed me saying that the program was not accepting their .esx file. Where I thought that the value &amp;#8220;BPS&amp;#8221; was needed, it wasn&amp;#8217;t. The .esx file in question, had the value &amp;#8220;BPA&amp;#8221; where I thought the value had to be &amp;#8220;BPS&amp;#8221;. If anyone else has a problem loading an .esx file into the workspace, email me&amp;#8230; It is probably because one of the other checks I do is unnecessary.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
	</entry>
	
	<entry>
		<title>ESX Wave Organizer - Version 0.1.3 Released</title>
		<link href="http://skratchdot.com/2004/10/esx-wave-organizer-version-0-1-3-released" />
		<updated>2004-10-29T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2004/10/esx-wave-organizer-version-0-1-3-released</id>
		<content type="html">&lt;p&gt;It&amp;#8217;s been awhile, but I finally got around to updating the program. Here&amp;#8217;s a feature list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Added AIFF support. The program will recognize 8 or 16 bit, mono or stereo, .aif files.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Added Minimize and Maximize Buttons.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;The Play and Loop buttons work for every sample now. If you press the Loop button on a sample that is not a loop, it will play the whole sample repeatedly.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Rearranged the main dialog. Now the Mono and Stereo lists are side by side (displaying more samples at once).&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Got rid of the &amp;#8220;quick save&amp;#8221; buttons, and added regular &amp;#8220;Windows style&amp;#8221; open and save dialogs.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Added a &amp;#8220;Remove All Samples&amp;#8221; feature, which deletes all the samples from the workspace, but leaves the pattern and song data that is loaded.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Got rid of the file &amp;#8220;esxwaveorganizer.data&amp;#8221;. Now you only need the .exe file for the program to work.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Fixed the &amp;#8220;Clear Pattern &amp;#38; Song Data&amp;#8221;. Previously, when you cleared all pattern data, each part&amp;#8217;s sample would be set to Mono Sample #000. Now, when you clear all pattern data, and load an .esx file into your sampler, each parts&amp;#8217; sample will be set to NONE (not Mono Sample #000).&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Added a Menu with the options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;File:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Open/Add Files To Workspace&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Save As ESX File&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Extract All Waves&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Exit&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Functions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Clear All Pattern And Song Data&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Pattern Organizer&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Song Organizer&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Remove All Samples&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Help:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;About ESX Organizer&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Visit Website&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
	</entry>
	
	<entry>
		<title>ESX Wave Organizer - Version 0.1.2 Released</title>
		<link href="http://skratchdot.com/2004/05/esx-wave-organizer-version-0-1-2-released" />
		<updated>2004-05-13T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2004/05/esx-wave-organizer-version-0-1-2-released</id>
		<content type="html">&lt;p&gt;A bug was fixed that would let you add a stereo sample when you shouldn&amp;#8217;t be able to. This would cause the available memory to be negative, which should never happen. Since stereo samples take up twice the memory that mono samples do, I was letting you add a stereo sample, without checking if twice it&amp;#8217;s size would fit. For example, if your memory left was: 4000, and the stereo sample&amp;#8217;s memory size was 6000, it would still be added, because 3000 is less than 4000. Your memory left would be -2000 after adding it. All this has been fixed, and hopefully no one ran into the problem&amp;#8230;&lt;/p&gt;</content>
	</entry>
	
	<entry>
		<title>ESX Wave Organizer - Version 0.1.1 Released</title>
		<link href="http://skratchdot.com/2004/05/esx-wave-organizer-version-0-1-1-released" />
		<updated>2004-05-09T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2004/05/esx-wave-organizer-version-0-1-1-released</id>
		<content type="html">&lt;p&gt;You can now simulate pressing the &amp;#8220;Play&amp;#8221; button by double clicking on a sample in the list.&lt;br /&gt;Thanks to &amp;#8220;Roonan&amp;#8221; from Dave Randalls&amp;#8217; &amp;#8220;Korg-Electribe-SX&amp;#8221; Yahoo Forum for suggesting this.&lt;br /&gt;Also, I fixed a bug which made ESX Wave Organizer ignore .wav files that had a &amp;#8216;smpl&amp;#8217; chunk with the &amp;#8220;number of samples&amp;#8221; value equal to 0. Thanks to Dmitry for helping find this.&lt;/p&gt;</content>
	</entry>
	
	<entry>
		<title>ESX Wave Organizer - Version 0.1 Released</title>
		<link href="http://skratchdot.com/2004/05/esx-wave-organizer-version-0-1-released" />
		<updated>2004-05-06T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2004/05/esx-wave-organizer-version-0-1-released</id>
		<content type="html">&lt;p&gt;I decided to release it a little early to start getting some feedback. As of right now, the &amp;#8220;Push Down&amp;#8221; and &amp;#8220;Push Up&amp;#8221; Buttons have no effect. Also, the &amp;#8220;Play&amp;#8221;, &amp;#8220;Loop&amp;#8221;, and &amp;#8220;Stop&amp;#8221; buttons only work for .wav files that were dragged onto the workspace. You cannot preview files that came from a .esx file unless you &amp;#8220;extract&amp;#8221; it first, then drag the resulting .wav file onto the workspace.&lt;/p&gt;

&lt;p&gt;Also, you cannot set the start, end, or loop start times. You cannot set the &amp;#8220;time slice&amp;#8221;, &amp;#8220;auto sampling&amp;#8221;, or &amp;#8220;playback level&amp;#8221; parameters. In the future, I hope to implement these features. It depends on how much feedback I get, and how much spare time I have.&lt;/p&gt;

&lt;p&gt;There is also a minor bug in Version 0.1 that occurs when switching between the mono and stereo lists. If you click on a &amp;#8220;greyed&amp;#8221; selection, the &amp;#8220;focus&amp;#8221; of the main window will not change.&lt;br /&gt;To test this, open &amp;#8220;ESX Wave Organizer&amp;#8221;. Now click on Mono Sample 003. The &amp;#8220;focus&amp;#8221; of the main window is Mono Sample 003. Now click on Stereo Sample 005. The &amp;#8220;focus&amp;#8221; of the main window is Stereo Sample 005. Now click on the &amp;#8220;greyed&amp;#8221; Mono Sample 003 again. The &amp;#8220;focus&amp;#8221; of the main window is still Stereo Sample 005. This is not a very big deal, just make sure you check the &amp;#8220;focus&amp;#8221; of the window when changing from mono to stereo, or refrain from clicking on the &amp;#8220;greyed&amp;#8221; selections.&lt;/p&gt;</content>
	</entry>
	
	<entry>
		<title>ES-1(step) - Version 1.0.0 Released</title>
		<link href="http://skratchdot.com/2003/09/es-1step-version-1-0-0-released" />
		<updated>2003-09-03T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2003/09/es-1step-version-1-0-0-released</id>
		<content type="html">&lt;p&gt;&lt;strong&gt;New Features Include:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You can change Midi In and Midi Out devices at any time while running the program.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;You can select different Channels for the midi in and out devices.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;3 different pattern modes, you can select the starting and ending steps for a pattern&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;You can load and save presets. (all preset files are 578KB big)&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;You can select which of the 17 different parameters to send to the ES-1.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;You can select which Note Numbers control the different parts on the ES-1.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;New Random Generator Features &amp;#8211; You can give an upper and lower bound for 17 different parameters, and select which effects and parts are allowed to be assigned.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Key Settings Dialog &amp;#8211; You can now edit patterns and all their parameters on screen.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Set all function which allows you to set every step for every key to a specified value.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Panic button which automatically turns off all the keys when it is hit.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;New GUI&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
	</entry>
	
	<entry>
		<title>ES-1(step) - Version 0.2.1 Released</title>
		<link href="http://skratchdot.com/2003/08/es-1step-version-0-2-1-released" />
		<updated>2003-08-10T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2003/08/es-1step-version-0-2-1-released</id>
		<content type="html">&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;No install program in this version. Just unzip it and run it.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Fixed a minor bug - In old versions, if ES1step could not find a midi input or output device, it would still ask you to enter a device number and then quit when it couldn&amp;#8217;t find the device. Now it will tell you to download MidiYOKE and MidiOX. ES1step will definately recognize MidiYoke&amp;#8217;s virtual ports.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
	</entry>
	
	<entry>
		<title>ES-1(step) - Bug with install fixed</title>
		<link href="http://skratchdot.com/2003/08/es-1step-bug-with-install-fixed" />
		<updated>2003-08-09T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2003/08/es-1step-bug-with-install-fixed</id>
		<content type="html">&lt;ul&gt;
&lt;li&gt;The program I used to create the install package included some unneeded DLLs. The install wizard has been fixed.&lt;/li&gt;
&lt;/ul&gt;</content>
	</entry>
	
	<entry>
		<title>ES-1(step) - Version 0.2 Released</title>
		<link href="http://skratchdot.com/2003/08/es-1step-version-0-2-released" />
		<updated>2003-08-08T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2003/08/es-1step-version-0-2-released</id>
		<content type="html">&lt;p&gt;Thanks to some positive feedback and suggestions, I added these features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pattern Settings Feature&lt;/strong&gt; - Now you can set a starting and ending step, and also specify whether or not to loop through the pattern while you hold a key down, or just play the pattern once.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Random Generator Addition&lt;/strong&gt; - Now you can toggle which effects the random generator can use.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Send These Parameters Function&lt;/strong&gt; - Now you can select which parameters you want to send to the ES-1. If you want to manually tweak knobs on the ES-1, just use this function to deselect the right parameters.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
	</entry>
	
	<entry>
		<title>ES-1(step) - Version 0.1 Released</title>
		<link href="http://skratchdot.com/2003/08/es-1step-version-0-1-released" />
		<updated>2003-08-01T00:00:00-04:00</updated>
		<id>http://skratchdot.com/2003/08/es-1step-version-0-1-released</id>
		<content type="html">&lt;p&gt;The first version is released. You can download it: &lt;a href='/projects/es1-step'&gt;here&lt;/a&gt;.&lt;/p&gt;</content>
	</entry>
	
</feed>