<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5714073</id><updated>2026-07-24T01:04:56.630-05:00</updated><category term="technology"/><category term="food"/><category term="BBQ"/><category term="code"/><category term="linux"/><category term="node.js"/><category term="adoption"/><category term="recipe"/><category term="startups"/><category term="Google"/><category term="Internet"/><category term="apple"/><category term="bread"/><category term="brewing"/><category term="ddns"/><category term="dns"/><category term="dynamic"/><category term="edgemarc"/><category term="pizza"/><category term="process control"/><category term="recipe bread"/><category term="rpi"/><category term="virtualization"/><category term="windows"/><category term="wireless"/><title type='text'>Nik Martin</title><subtitle type='html'>Technology, food, DJing, BBQ, beer, and some other things, all good.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.nikmartin.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://blog.nikmartin.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Nik Martin</name><uri>http://www.blogger.com/profile/09851457018594198742</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>53</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5714073.post-5302001323815837389</id><published>2014-08-31T21:09:00.002-05:00</published><updated>2014-08-31T21:09:41.153-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="BBQ"/><category scheme="http://www.blogger.com/atom/ns#" term="food"/><category scheme="http://www.blogger.com/atom/ns#" term="recipe"/><title type='text'>Bourbon BBQ Sauce</title><content type='html'>Here&#39;s a nice easy BBQ sauce with Bourbon which gives a nice, rich bold flavor, with a hint of vanilla from the Kentucky Bourbon:&lt;br /&gt;
&lt;br /&gt;
Ingredients:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;1 small bottle (16 oz) ketchup&lt;/li&gt;
&lt;li&gt;1/4 cup plain yellow mustard&lt;/li&gt;
&lt;li&gt;1/4 cup Apple cider vinegar&lt;/li&gt;
&lt;li&gt;3/4 cup Kentucky Bourbon (I used Evan Williams: not too expensive, but real sour mash bourbon)&lt;/li&gt;
&lt;li&gt;1 small white onion, chopped&lt;/li&gt;
&lt;li&gt;2 cloves garlic, minced&lt;/li&gt;
&lt;li&gt;3 TBSP molasses&lt;/li&gt;
&lt;li&gt;3 TBSP Worcestershire sauce&lt;/li&gt;
&lt;li&gt;1 TBSP hot sauce ( I used Sriracha)&lt;/li&gt;
&lt;li&gt;1 TBSP bacon grease&lt;/li&gt;
&lt;li&gt;Ground black pepper to taste (1/2 - 1 tsp)&lt;/li&gt;
&lt;li&gt;Kosher salt to taste (1-2 tsp)&lt;/li&gt;
&lt;/ul&gt;
Directions:&lt;br /&gt;&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Add onion, garlic, and bacon grease to sauce pan, and saute until onion is clear.&lt;/li&gt;
&lt;li&gt;Add bourbon, and simmer until reduced by half.&lt;/li&gt;
&lt;li&gt;Add ALL the other ingredients and bring to low boil, then reduce to a very low simmer for 20 mins.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Stir frequently so the sugars don&#39;t scorch&lt;/li&gt;
&lt;li&gt;Blend until smooth (optional)&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://blog.nikmartin.com/feeds/5302001323815837389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nikmartin.com/2014/08/bourbon-bbq-sauce.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/5302001323815837389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/5302001323815837389'/><link rel='alternate' type='text/html' href='http://blog.nikmartin.com/2014/08/bourbon-bbq-sauce.html' title='Bourbon BBQ Sauce'/><author><name>Nik Martin</name><uri>http://www.blogger.com/profile/09851457018594198742</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5714073.post-3299868769036823634</id><published>2014-08-31T20:08:00.002-05:00</published><updated>2025-09-23T17:37:22.083-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="BBQ"/><category scheme="http://www.blogger.com/atom/ns#" term="food"/><title type='text'>BBQ Rub</title><content type='html'>&lt;div dir=&quot;ltr&quot;&gt;
OK, I have been kicking around a new, simple rub, and this one is pretty good. As always, its published under the&amp;nbsp;&lt;a href=&quot;http://blog.nikmartin.com/2014/04/the-bbq-osl.html&quot; target=&quot;_blank&quot;&gt;BBQOSL&lt;/a&gt;. This is for a small batch, say 1-2 slabs of ribs:&lt;/div&gt;
&lt;div dir=&quot;ltr&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;1 TBSP fresh ground black pepper&lt;/li&gt;
&lt;li&gt;1 TBSP kosher salt (or to taste)&lt;/li&gt;
&lt;li&gt;1-1/2 TSP garlic powder&lt;/li&gt;
&lt;li&gt;1-1/2 TSP onion powder&lt;/li&gt;
&lt;li&gt;1-1/2 TSP turbinado sugar (or brown if that&#39;s what you have)&lt;/li&gt;
&lt;li&gt;1 TSP paprika&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot;&gt;
Mix with fingers and rub away! Its a great all-purpose rub.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://blog.nikmartin.com/feeds/3299868769036823634/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nikmartin.com/2014/08/bbq-rub.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/3299868769036823634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/3299868769036823634'/><link rel='alternate' type='text/html' href='http://blog.nikmartin.com/2014/08/bbq-rub.html' title='BBQ Rub'/><author><name>Nik Martin</name><uri>http://www.blogger.com/profile/09851457018594198742</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5714073.post-1027930649067432654</id><published>2014-04-25T00:50:00.001-05:00</published><updated>2014-08-31T20:47:58.643-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="BBQ"/><category scheme="http://www.blogger.com/atom/ns#" term="food"/><title type='text'>The BBQ Open Sauce License (BBQOSL)</title><content type='html'>&lt;pre style=&quot;margin: 10px; padding: 0px;&quot;&gt;&lt;code&gt;The BBQ Open Sauce License (BBQOSL)
Copyright © 20xx
Permission is hereby granted, free of charge, to any person obtaining a copy 
of this recipe and associated information (the &quot;Sauce&quot;), to deal in the 
Sauce without restriction, including without limitation the rights to use, copy, 
modify, merge, publish, distribute, sublicense, and/or sell copies of the Sauce, 
and to permit persons to whom the Sauce is furnished to do so, subject to the 
following conditions:

The above copyright notice and this permission notice shall be included in all 
copies or substantial portions of the Sauce.

THE SAUCE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, 
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
FROM, OUT OF OR IN CONNECTION WITH THE SAUCE OR THE USE OR 
OTHER DEALINGS IN THE SAUCE.&lt;/code&gt;&lt;/pre&gt;
</content><link rel='replies' type='application/atom+xml' href='http://blog.nikmartin.com/feeds/1027930649067432654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nikmartin.com/2014/04/the-bbq-osl.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/1027930649067432654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/1027930649067432654'/><link rel='alternate' type='text/html' href='http://blog.nikmartin.com/2014/04/the-bbq-osl.html' title='The BBQ Open Sauce License (BBQOSL)'/><author><name>Nik Martin</name><uri>http://www.blogger.com/profile/09851457018594198742</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5714073.post-3961878665810815278</id><published>2013-08-18T13:39:00.001-05:00</published><updated>2014-08-31T19:56:46.511-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="brewing"/><title type='text'>Homebrew Finds: Putting Together a &amp;quot;Brew Day Box&amp;quot;</title><content type='html'>&lt;a href=&quot;http://www.homebrewfinds.com/2013/06/putting-together-brew-day-box.html?spref=bl&quot;&gt;Homebrew Finds: Putting Together a &quot;Brew Day Box&quot;&lt;/a&gt;: Why a Brew Day Box?  Over the years I&#39;ve homebrewed, I&#39;ve utilized a number of storage/organization strategies. &amp;nbsp;Some could be de...</content><link rel='replies' type='application/atom+xml' href='http://blog.nikmartin.com/feeds/3961878665810815278/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nikmartin.com/2013/08/homebrew-finds-putting-together-brew.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/3961878665810815278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/3961878665810815278'/><link rel='alternate' type='text/html' href='http://blog.nikmartin.com/2013/08/homebrew-finds-putting-together-brew.html' title='Homebrew Finds: Putting Together a &amp;quot;Brew Day Box&amp;quot;'/><author><name>Nik Martin</name><uri>http://www.blogger.com/profile/09851457018594198742</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5714073.post-4893271539041936776</id><published>2013-07-09T21:02:00.004-05:00</published><updated>2014-08-31T19:58:29.081-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="node.js"/><category scheme="http://www.blogger.com/atom/ns#" term="technology"/><title type='text'>Simple static web server using Node.js and send</title><content type='html'>So, you need to test your static web site. With ONE simple dependency, you can serve files from the directory the app is running from:

&lt;div class=&quot;gistLoad&quot; data-id=&quot;5962900&quot; id=&quot;gist-5962900&quot;&gt;Loading ....&lt;/div&gt;
&lt;script id=&#39;gistPrinter&#39; src=&#39;http://nikmartin.github.io/js/gistLoader.js&#39; type=&#39;text/javascript&#39;&gt; &lt;/script&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.nikmartin.com/feeds/4893271539041936776/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nikmartin.com/2013/07/simple-static-web-server-in-nodejs-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/4893271539041936776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/4893271539041936776'/><link rel='alternate' type='text/html' href='http://blog.nikmartin.com/2013/07/simple-static-web-server-in-nodejs-and.html' title='Simple static web server using Node.js and send'/><author><name>Nik Martin</name><uri>http://www.blogger.com/profile/09851457018594198742</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5714073.post-2176050234585336554</id><published>2013-07-01T11:16:00.000-05:00</published><updated>2014-08-31T19:57:19.776-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="node.js"/><category scheme="http://www.blogger.com/atom/ns#" term="technology"/><title type='text'>Secure Sessions in Node.js with NginX SSL Proxy</title><content type='html'>&lt;div class=&quot;gistLoad&quot; data-id=&quot;5902176&quot; id=&quot;gist-5902176&quot;&gt;Loading ....&lt;/div&gt;
&lt;script id=&#39;gistPrinter&#39; src=&#39;http://nikmartin.github.io/js/gistLoader.js&#39; type=&#39;text/javascript&#39;&gt; &lt;/script&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.nikmartin.com/feeds/2176050234585336554/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nikmartin.com/2013/07/secure-sessions-in-nodejs-with-nginx.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/2176050234585336554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/2176050234585336554'/><link rel='alternate' type='text/html' href='http://blog.nikmartin.com/2013/07/secure-sessions-in-nodejs-with-nginx.html' title='Secure Sessions in Node.js with NginX SSL Proxy'/><author><name>Nik Martin</name><uri>http://www.blogger.com/profile/09851457018594198742</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5714073.post-6629596077699336273</id><published>2013-03-10T22:32:00.002-05:00</published><updated>2013-03-10T22:53:04.295-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="technology"/><title type='text'>My new Mockbook Air</title><content type='html'>&lt;a href=&quot;http://www.newegg.com/Product/Product.aspx?Item=N82E16834686004&quot; target=&quot;_blank&quot;&gt;I got a new Ultrabook from Newegg&lt;/a&gt;&amp;nbsp;the other day, and I am impressed. &amp;nbsp;Avatar is a total unknown Chinese laptop and tablet maker, and they sell exclusively on Newegg. &amp;nbsp;This thing is NICE! &amp;nbsp;Very good quality, all metal body, nice sharp edges, just like a Macbook Air, hence my nickname of &quot;Mockbook&quot;. &amp;nbsp;It has very good specs, including:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Intel Core i5 3317U(1.70GHz)&lt;/li&gt;
&lt;li&gt;8GB Memory 500GB HDD + 32GB SSD HDD (Sweet!)&lt;/li&gt;
&lt;li&gt;Intel HD Graphics 4000&lt;/li&gt;
&lt;li&gt;1366 x 768 display&lt;/li&gt;
&lt;li&gt;Windows 8 64-bit (Ok, that one&#39;s not so great)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://images17.newegg.com/is/image/newegg/34-686-004-TS?$S300W$&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://images17.newegg.com/is/image/newegg/34-686-004-TS?$S300W$&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
So, I immediately did a smoke test, then burned a Mint DVD and installed it. &amp;nbsp;Everything works fine, except the touchpad. &amp;nbsp;It&#39;s a never-seen-in-the-wild Elan touchpad with all kinds of swipey gestures and multi-touch features for Windows 8. &amp;nbsp;Don&#39;t worry, I&#39;ve already&lt;a href=&quot;https://bugzilla.kernel.org/show_bug.cgi?id=54951&quot; target=&quot;_blank&quot;&gt; filed a bug report against the Linux kernel&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Also, Mint just felt too &quot;heavy&quot;, and if there&#39;s anything I hate, it&#39;s a computer that feels bloated or mis-configured. &amp;nbsp;So, I downloaded &lt;a href=&quot;http://www.debian.org/devel/debian-installer/News/2013/20130217&quot; target=&quot;_blank&quot;&gt;Debian Wheezy&lt;/a&gt; on my trusty 10 year old 1 GB USB Key and loaded up. &amp;nbsp;Much better! &amp;nbsp; Wheezy+Gnome is so clean and easy to use, it&#39;s the desktop OS I&#39;ve looked for for years.&lt;br /&gt;
&lt;br /&gt;
I still needed to tweak the kernel for the hardware and for laptop/battery use, so I fetched the latest stable kernel, which as of this post,&amp;nbsp;&lt;a href=&quot;https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.8.2.tar.bz2&quot; target=&quot;_blank&quot;&gt;is 3.8.2&lt;/a&gt;. I hacked on the config for two days, and can safely say I have a very nicely optimized kernel for this laptop now. &amp;nbsp;I&#39;ve l&lt;a href=&quot;https://s3.amazonaws.com/nik.martin/.config&quot; target=&quot;_blank&quot;&gt;inked it to this post&lt;/a&gt; if you decide to build a kernel for this Ultrabook.&lt;br /&gt;
&lt;br /&gt;
Newegg&#39;s Real Time pricing can be a bit annoying. &amp;nbsp;I had it in my cart at $659, woke up the next morning to order it, and it had jumped to $729! I ordered anyway, and when I shipped, I logged in to track it and it had dropped back to $659! &amp;nbsp;That kind of ticked me off, so I went to Newegg Customer Service, and CSR Heidy had empathy for my plight and gave me a $25 credit to soften the blow a bit Newegg&#39;s still on top!&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.nikmartin.com/feeds/6629596077699336273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nikmartin.com/2013/03/my-new-mockbook-air.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/6629596077699336273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/6629596077699336273'/><link rel='alternate' type='text/html' href='http://blog.nikmartin.com/2013/03/my-new-mockbook-air.html' title='My new Mockbook Air'/><author><name>Nik Martin</name><uri>http://www.blogger.com/profile/09851457018594198742</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5714073.post-720450966114296993</id><published>2013-02-28T20:31:00.001-06:00</published><updated>2013-02-28T20:32:45.545-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="technology"/><title type='text'>AT&amp;amp;T is a real champ, I tell you what!</title><content type='html'>Taking advantage of a fairly large loophole where the FCC has determined they don&#39;t have jurisdiction on IP based networks, AT&amp;T has announced they will convert their switched networks to all IP based networks, essentially de-regulating themselves. California de-regulated some telco stuff a few years ago, and AT&amp;T tripled prices.&lt;br /&gt;
&lt;br /&gt;
http://www.wired.com/opinion/2013/02/the-latest-sneaky-plan-to-rob-americans-of-a-public-telco-network</content><link rel='replies' type='application/atom+xml' href='http://blog.nikmartin.com/feeds/720450966114296993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nikmartin.com/2013/02/at-is-real-champ-i-tell-you-what.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/720450966114296993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/720450966114296993'/><link rel='alternate' type='text/html' href='http://blog.nikmartin.com/2013/02/at-is-real-champ-i-tell-you-what.html' title='AT&amp;amp;T is a real champ, I tell you what!'/><author><name>Nik Martin</name><uri>http://www.blogger.com/profile/09851457018594198742</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5714073.post-7640735308402713734</id><published>2012-12-31T13:13:00.004-06:00</published><updated>2014-08-31T19:59:45.718-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="rpi"/><category scheme="http://www.blogger.com/atom/ns#" term="technology"/><title type='text'>Pi for Christmas</title><content type='html'>I got a new toy for Christmas: &lt;a href=&quot;http://www.raspberrypi.org/faqs&quot; target=&quot;_blank&quot;&gt;A Raspberry Pi&lt;/a&gt;. &amp;nbsp;My plans are to get back into my old car audio hobby, by replacing my factory head unit with an Rπ with a &lt;a href=&quot;http://www.amazon.com/gp/product/B005CLMJLU/ref=as_li_tf_tl?ie=UTF8&amp;amp;tag=nikmar-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B005CLMJLU&quot;&gt; Wireless Nano USB Dongle&lt;/a&gt;, a &lt;a href=&quot;http://www.amazon.com/gp/product/B00AC84J3Y/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;amp;tag=nikmar-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B00AC84J3Y&quot;&gt;Lilliput 669GL HiBrightness Touch Screen Monitor&lt;/a&gt;
mounted in the dash, and replacing the little back right jump seat in my tundra with a 10&quot; or 12&quot; subwoofer + amp, and new 6.5&quot;s in the doors and tweeters in the stock tweeter locations.&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;BUMP BUMP BUMP&lt;/span&gt;&lt;/b&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.nikmartin.com/feeds/7640735308402713734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nikmartin.com/2012/12/pi-for-christmas.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/7640735308402713734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/7640735308402713734'/><link rel='alternate' type='text/html' href='http://blog.nikmartin.com/2012/12/pi-for-christmas.html' title='Pi for Christmas'/><author><name>Nik Martin</name><uri>http://www.blogger.com/profile/09851457018594198742</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5714073.post-4513448802543833902</id><published>2012-11-24T14:04:00.001-06:00</published><updated>2018-12-27T14:00:37.686-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="process control"/><category scheme="http://www.blogger.com/atom/ns#" term="technology"/><title type='text'>Process Control for dummies like me</title><content type='html'>I&#39;m not a controls engineer, or even an engineer. I&#39;m just a guy.&amp;nbsp; Anyway, process controls are like Tonka Trucks to me.&amp;nbsp; I like to build them to do useless stuff that could probably be done with $40 worth of hardware, but what is fun about that?&amp;nbsp; Here&#39;s a primer on the workhorse of the control world, the PID control algorithm.&amp;nbsp; You can learn all you ever want to know about PIDs from&lt;a href=&quot;http://www.readability.com/articles/tk6cf0en&quot; target=&quot;_blank&quot;&gt; this now famous article&lt;/a&gt;, but even it assumes a LOT of engineer-y smarts, which I don&#39;t have.&amp;nbsp; So, here&#39;s an even more boiled down version of even that seminal article for the &lt;i&gt;rest&lt;/i&gt; of us.
&lt;br /&gt;
&lt;a href=&quot;https://www.blogger.com/u/1/null&quot; name=&quot;more&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;
PID Basics&lt;/h3&gt;
PID controls are used to control something.&amp;nbsp; Vague, right?&amp;nbsp; Let&#39;s define some things first, by using a super simple example (that actually has some very complex boundary issues, but for 90% of our scenarios is pretty straight forward).&lt;br /&gt;
&lt;br /&gt;
The problem? We want to heat up something.&amp;nbsp; Maybe a BBQ pit, or a kettle of water, or maybe a coop full of baby chickens or rabbits.&amp;nbsp; Normal &quot;bang-bang&quot; thermostats are pretty horrible at temperature control, especially heating when the thing to be heated has mass, like water. They slam the temperature all over the place, like this:&lt;br /&gt;
Set an oven temp to 350F. The thermostat turns on the heater element until temp reaches 350, and turns off. This actually means the temp will shoot up to around 360, since the element is very hot, and the process of cooling down means the oven gets hotter. When the temperature hits 349, turn on, which takes a few minutes, so the oven temp hits 340 quickly, until the element gets hot again. That&#39;s a 20 degree swing in temp!&lt;br /&gt;
&lt;br /&gt;
Now, lets see how a relatively simple PID does this.&amp;nbsp; Lets define a few terms and look at a real world example first:&lt;br /&gt;
&lt;h4&gt;
Definitions:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;SP&lt;/b&gt;: Set Point - What we define as homeostasis (temp = 350F, speed = 20 RPM, etc)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PV&lt;/b&gt;: Process Value - What the actual value of what we are measuring is (330F, 18 RPM, etc)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PE&lt;/b&gt;: Process Error - How far away from SP is PV? So PE=SP-PV. Easy Peasy.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Pt, It, Dt&lt;/b&gt; - the Term, or each part of the PID controls contribution to the output.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ADC&lt;/b&gt;: Analog to Digital Converter - Converts analog measurements like temp and rpm to a digital number. A 10 bit ADC has 10 bits of resolution, or 1024 discrete &quot;steps&quot;. For an ADC that reads 0-5 volts, 0v = 0, and 5v = 1023, and 2.5v = 512.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
OK, lets look at the PID algorithm now:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;P: Proportional&lt;/b&gt; - In many control systems, the process control isn&#39;t on or off, it has a range of states, like a valve that can be on a tiny bit, on half way, or on full blast.&amp;nbsp; That&#39;s proportional control. In the PID world you need the machine to determine how much to open a valve (or for on/off things like heaters, how long to turn it on for). &amp;nbsp;&lt;i&gt;Boiled down even further, the farther away from &lt;b&gt;SP&lt;/b&gt; that &lt;b&gt;PV&lt;/b&gt; is, the higher &lt;b&gt;P&lt;/b&gt; needs to be to get &lt;b&gt;PV=SP&lt;/b&gt;. &lt;/i&gt;The calculation is very simple:&amp;nbsp;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Pt&lt;/b&gt; = &lt;b&gt;PE&lt;/b&gt; * &lt;b&gt;pGain&lt;/b&gt;. pGain is described below. Back to the example of trying to get an oven to 350F:&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SP&lt;/b&gt; = 350F&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PV&lt;/b&gt; =&amp;nbsp; 100F&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PE&lt;/b&gt; = &lt;b&gt;SP&lt;/b&gt; - &lt;b&gt;PV&lt;/b&gt; : 350 - 100 = 250, so &lt;b&gt;PE&lt;/b&gt; = 250&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;b&gt;pGain&lt;/b&gt;, what? &lt;b&gt;pGain&lt;/b&gt; is a constant that is chosen so as to scale the control output to a range usable by the ADCs and output controls by multiplying it with the &lt;b&gt;PE&lt;/b&gt;. &amp;nbsp;Two examples, both using a &lt;b&gt;pGain&lt;/b&gt; of 2:&amp;nbsp;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;SP&lt;/b&gt; = 350&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PV&lt;/b&gt; = 100&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PE&lt;/b&gt; = 250&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Pt &lt;/b&gt;= (350 - 100) * 2 = 500&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Pt&lt;/b&gt; = 500 so we need a Proportional term of 500 of some type of control output to get our oven up to temp. Compare that to:&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SP&lt;/b&gt; =350F&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PV&lt;/b&gt;=340F&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PE&lt;/b&gt; = 10,&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Pt&lt;/b&gt; = (350 - 340) * 2 = 20, so we need a lot less output from our oven element to get &lt;b&gt;PV=SP&lt;/b&gt;. The bigger the &lt;b&gt;PE&lt;/b&gt;, the higher &lt;b&gt;Pt &lt;/b&gt;needs to be to get &lt;b&gt;SP = PV&lt;/b&gt;. The secret sauce is the &lt;b&gt;pGain&lt;/b&gt;: too high, you overshoot the temp, too low, your heater takes too long and cakes don&#39;t rise, chickens freeze to death, and beer tastes skunky. &lt;b&gt;pGain&lt;/b&gt; is adjusted by you to get the right amount of &lt;b&gt;Pt&lt;/b&gt; for your application. Start with &lt;b&gt;pGain&lt;/b&gt; of 1.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;br /&gt;
Another real world example is cruise control on your car - the cruise makes very slight adjustments when you are near &lt;b&gt;SP&lt;/b&gt;, say 65 MPH, but when you are traveling at 35 MPH, the cruise control &#39;floors&#39; the gas to get to &lt;b&gt;SP&lt;/b&gt; as quickly as possible. &lt;b&gt;Pt&lt;/b&gt; is the amount of artificial &quot;foot&quot; the controller adds to the gas pedal to get to speed.&lt;br /&gt;
&lt;br /&gt;
Proportional control (&lt;b&gt;PE&lt;/b&gt; * &lt;b&gt;pGain&lt;/b&gt;) isn&#39;t enough to maintain stasis on systems like temperature control. Since &lt;b&gt;Pt&lt;/b&gt; decreases the closer we get to &lt;b&gt;SP&lt;/b&gt;, It will never actually get there on its own. To solve that, we need to add&lt;b&gt; It, Integral&lt;/b&gt;, (and later maybe &lt;b&gt;D, Derivative&lt;/b&gt; to stabilize).&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;I: Integral - &lt;/b&gt;It&#39;s a fancy term for cumulative error.&amp;nbsp; It lets the PID loop &quot;remember&quot; previous errors, by summing the errors as the algorithm runs. That means the &lt;b&gt;I&lt;/b&gt; will change less and less as &lt;b&gt;PE&lt;/b&gt; approaches &lt;b&gt;SP&lt;/b&gt;, which means the integrator&#39;s value increase will slow over time, meaning the control loop is getting stable.&amp;nbsp; In the previous example of the oven, &lt;b&gt;I&lt;/b&gt; is 250 on the first pass of the loop, then as the temp rises, the &lt;b&gt;PE&lt;/b&gt; is added to &lt;b&gt;I&lt;/b&gt;, so the next pass &lt;b&gt;I&lt;/b&gt; =&lt;b&gt; I&lt;/b&gt; + &lt;b&gt;PE&lt;/b&gt; (10), or 260, and as the &lt;b&gt;PV&lt;/b&gt; approaches &lt;b&gt;SP&lt;/b&gt;, &lt;b&gt;I&lt;/b&gt; stops growing as fast, so less and less &lt;b&gt;It&lt;/b&gt; is added to the system, causing the system to &quot;settle&quot;. &amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;iGain&lt;/b&gt;:&amp;nbsp; is another constant that is multiplied with &lt;b&gt;I&lt;/b&gt; to get a control output (&lt;b&gt;It&lt;/b&gt;), which is then added to &lt;b&gt;P&lt;/b&gt; and sent to the control.&lt;/li&gt;
&lt;/ul&gt;
Now, just as quickly as &lt;b&gt;Integral&lt;/b&gt; can stabilize a system, it can also cause Windup, which is when your error is very high at the beginning of the process loop, like when the kettle is cold, or the motors are off, etc.&amp;nbsp; You can saturate your Integral such that it&#39;s outside the bounds of what you can push out as control (heat, speed, etc), so you have to have a safe upper and lower limit for &lt;b&gt;I&lt;/b&gt;. The problem with &lt;b&gt;I&lt;/b&gt; is it usually decreases no faster than it rose, because the growth and reduction of &lt;b&gt;I&lt;/b&gt; is fixed at the sample rate of your PID loop. If it took 500 loops to get over saturated and overshoot &lt;b&gt;SP&lt;/b&gt; by a wide margin, it&#39;s gonna take just as long to get it back down.&amp;nbsp; &lt;b&gt;I&lt;/b&gt; lowers because when you overshoot, your &lt;b&gt;PE&lt;/b&gt; goes negative, so when added to each loop, &lt;b&gt;I&lt;/b&gt; starts to decrease. i.e. if &lt;b&gt;PE&lt;/b&gt; looks like: 10,9,8,7,6,5,2,-1,-2,-3, etc, you see how &lt;b&gt;I&lt;/b&gt; grows and shrinks based on accumulated &lt;b&gt;PE&lt;/b&gt;).&amp;nbsp; The good part about controlling windup in your control algorithm is to just limit the output to the maximum output of the process that is driving SP.&amp;nbsp; If it&#39;s a motor, it may be speed or current, just limit it to the max speed and current the motor is capable of. It&#39;s as easy as:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
If &lt;b&gt;It&lt;/b&gt; &amp;gt; cMAX, then &lt;b&gt;It&amp;nbsp;&lt;/b&gt;= cMAX&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
If &lt;b&gt;It&lt;/b&gt; &amp;lt; cMIN, then &lt;b&gt;It&lt;/b&gt; = cMIN.&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
If your system under control is inherently stable, you can raise/reduce cMin and cMax even inside the&amp;nbsp; lower and upper control limits. &lt;b&gt;iGain&lt;/b&gt; is usually a very small number, like .002&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b style=&quot;font-weight: bold;&quot;&gt;D:&amp;nbsp;Derivative&amp;nbsp;&lt;/b&gt;&lt;b&gt;- &lt;/b&gt;if P deals with the current state of the system under control, and I deals with the past performance of the system, guess what D does? Yep, it tries to predict the future state of the system to prevent overshoot. Again, Derivative&amp;nbsp; is a fancy term for a pretty simple calculation:&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;b&gt;Dt&lt;/b&gt;=(Current&amp;nbsp; &lt;b&gt;PV&lt;/b&gt; - Previous&amp;nbsp;&lt;b&gt;PV&lt;/b&gt;) * &lt;b&gt;dGain&lt;/b&gt;.&lt;/blockquote&gt;
NOTE: There are two versions of D in controls. &amp;nbsp;The one I&#39;m using is better for systems like heaters, in that it subtracts&lt;i&gt;&amp;nbsp;&lt;/i&gt;control away from the system as the rate of &lt;b&gt;&lt;i&gt;PV&lt;/i&gt;&lt;/b&gt; change slows via &lt;b&gt;Pt&lt;/b&gt; and &lt;b&gt;It. &lt;/b&gt;The other method of deriving &lt;b&gt;Dt&lt;/b&gt; involves the rate of change of &lt;b&gt;&lt;i&gt;PE&lt;/i&gt;&lt;/b&gt;, which can cause &quot;derivative kick&quot; since the &lt;b&gt;PE&lt;/b&gt; is very high at the beginning of the control loop (when the PID loop is first started). Error is high, but &lt;b&gt;PV&lt;/b&gt; change is relatively stable and slow. Subtle yet significant in the beginning of the process.&lt;br /&gt;
The amount of change of &lt;b&gt;PV&lt;/b&gt; each loop gives you a bit of insight on what the next value of PV is going to be, or its slope/rate of change. For example, if our oven PV was 340 F last loop, and 341 F this loop, what do you think PV will be next loop? Again, easy peasy. The steeper the slope, the higher the delta, the higher probability of an overshoot, which &lt;b&gt;Dt&lt;/b&gt; helps correct.&lt;br /&gt;
&lt;br /&gt;
&lt;li&gt;&lt;b&gt;dGain&lt;/b&gt;: this is the value multiplied with &lt;b&gt;D&lt;/b&gt; to do predictive control.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;NOTE: &lt;b&gt;I&lt;/b&gt;, &lt;b&gt;P&lt;/b&gt; are summed, and then&lt;b&gt; D&lt;/b&gt; is subtracted, which eliminates overshooting when &lt;b&gt;PE&lt;/b&gt;&amp;nbsp;and &lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://www.blogger.com/#&quot; rel=&quot;nofollow&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ3lqdIr1gbc-ucY4EBU0wp-LoPnCM67P0yrpWtu37wDnFCK8l9PkqvIoiGLXdTI3jx5FyE8xRH7DildPuVmABkjWu4Q7qDIW0QzvAoRNFSnZQK2d4TkLXLdq-k21blcCxFBf4/s1600/pDelta.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
is very high and&amp;nbsp;as&amp;nbsp; the rate of change slows, &lt;b&gt;Dt&lt;/b&gt; subtracted from &lt;b&gt;Pt+It&lt;/b&gt; will make the approach to &lt;b&gt;SP&lt;/b&gt; even more stable.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;And there you have your PID control output! That&#39;s it.&lt;/li&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.nikmartin.com/feeds/4513448802543833902/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nikmartin.com/2012/11/process-control-for-dummies-like-me.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/4513448802543833902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/4513448802543833902'/><link rel='alternate' type='text/html' href='http://blog.nikmartin.com/2012/11/process-control-for-dummies-like-me.html' title='Process Control for dummies like me'/><author><name>Nik Martin</name><uri>http://www.blogger.com/profile/09851457018594198742</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ3lqdIr1gbc-ucY4EBU0wp-LoPnCM67P0yrpWtu37wDnFCK8l9PkqvIoiGLXdTI3jx5FyE8xRH7DildPuVmABkjWu4Q7qDIW0QzvAoRNFSnZQK2d4TkLXLdq-k21blcCxFBf4/s72-c/pDelta.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5714073.post-3865726475247474446</id><published>2012-11-24T10:16:00.002-06:00</published><updated>2012-11-24T10:16:36.302-06:00</updated><title type='text'>MSP430</title><content type='html'>For $4.30, this MCPU is the bee&#39;s knees:&lt;br /&gt;
&lt;br /&gt;
http://www.ti.com/product/msp430f4794&lt;br /&gt;
&lt;br /&gt;
4 x 16 Bit Delta Sigma ADCs for &amp;lt; $5? Come on.</content><link rel='replies' type='application/atom+xml' href='http://blog.nikmartin.com/feeds/3865726475247474446/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nikmartin.com/2012/11/for-4.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/3865726475247474446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/3865726475247474446'/><link rel='alternate' type='text/html' href='http://blog.nikmartin.com/2012/11/for-4.html' title='MSP430'/><author><name>Nik Martin</name><uri>http://www.blogger.com/profile/09851457018594198742</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5714073.post-1188168828609632659</id><published>2012-10-28T20:47:00.000-05:00</published><updated>2012-10-28T21:31:22.495-05:00</updated><title type='text'>Stella Bulbs</title><content type='html'>This is not just a blog, I also use it as a brain dump, so in that regard, I always forget the type of light bulbs my 2009 Genuine Stella scooter has. To do a proper LED conversion, you need LEDs that are the color of the lenses you are installing the bulbs in:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Tail Lights&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Running: BA15s Base 5W Clear (OEM:Osram 5007 R5W)&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;32.5mm H x 18mm W&lt;/li&gt;
&lt;li&gt;4 Lumens, .32 CP&lt;/li&gt;
&lt;li&gt;LED Replacement:&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Stop: BA15s 10w Clear (OEM: Osram &amp;nbsp;5008 R10W)&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;32.5mm H x 18mm W&lt;/li&gt;
&lt;li&gt;10 Lumens, .8 CP&lt;/li&gt;
&lt;li&gt;LED Replacement: SMT Tower:&amp;nbsp;&lt;a href=&quot;http://www.autolumination.com/1156_1157.htm&quot;&gt;http://www.autolumination.com/1156_1157.htm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;li&gt;Turn Lights: 7507L BAU15s Base, Amber Bulb 21W (OEM: Osram 7507L)&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Dimensions: 47mm H x 25mm W&lt;/li&gt;
&lt;li&gt;PY21W-21W-12V-BAU15S ECE&lt;/li&gt;
&lt;li&gt;22 Lumens, 1.8 CP&lt;/li&gt;
&lt;li&gt;LED Replacement:&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
</content><link rel='replies' type='application/atom+xml' href='http://blog.nikmartin.com/feeds/1188168828609632659/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nikmartin.com/2012/10/stella-bulbs.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/1188168828609632659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/1188168828609632659'/><link rel='alternate' type='text/html' href='http://blog.nikmartin.com/2012/10/stella-bulbs.html' title='Stella Bulbs'/><author><name>Nik Martin</name><uri>http://www.blogger.com/profile/09851457018594198742</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5714073.post-1802732044315153203</id><published>2012-10-21T02:11:00.004-05:00</published><updated>2014-08-31T19:59:17.014-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="node.js"/><category scheme="http://www.blogger.com/atom/ns#" term="technology"/><title type='text'>jlinq for Node.js</title><content type='html'>I ported Hugo Bonacci&#39;s &amp;nbsp;&lt;a href=&quot;http://hugoware.net/projects/jlinq&quot;&gt;jLINQ&lt;/a&gt;&amp;nbsp;to work with Node.js:&amp;nbsp;&lt;a href=&quot;http://npmjs.org/package/jlinq&quot;&gt;http://npmjs.org/package/jlinq&lt;/a&gt;&amp;nbsp;. &amp;nbsp;Source is on &lt;a href=&quot;https://github.com/nikmartin/jlinq-beta/tree/jlinq-node&quot; target=&quot;_blank&quot;&gt;Github&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.nikmartin.com/feeds/1802732044315153203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nikmartin.com/2012/10/jlinq-for-nodejs.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/1802732044315153203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/1802732044315153203'/><link rel='alternate' type='text/html' href='http://blog.nikmartin.com/2012/10/jlinq-for-nodejs.html' title='jlinq for Node.js'/><author><name>Nik Martin</name><uri>http://www.blogger.com/profile/09851457018594198742</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5714073.post-8954398417897190982</id><published>2012-10-04T16:25:00.000-05:00</published><updated>2014-08-31T20:48:42.404-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="technology"/><category scheme="http://www.blogger.com/atom/ns#" term="virtualization"/><title type='text'>I have a Cloudstack VHD template I want to modify - now what?</title><content type='html'>vdfuse -f virtdisk.vhd /somedir&lt;br /&gt;
losetup /dev/loop0 /somedir/Partition2&lt;br /&gt;
&lt;br /&gt;
file Partition2&lt;br /&gt;
Partition2: LVM2 PV (Linux Logical Volume Manager), UUID: 20dMth-jvua-lFfN-j1a9-4iar-acFF-xoI3Pa, size: 20949499904&lt;br /&gt;
&lt;div&gt;
pvscan&lt;/div&gt;
&lt;br /&gt;
lvm vgchange -ay&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2 logical volume(s) in volume group &quot;VolGroup&quot; now active&lt;br /&gt;
&lt;div&gt;
&lt;div&gt;
lvs&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; LV &amp;nbsp; &amp;nbsp; &amp;nbsp;VG &amp;nbsp; &amp;nbsp; &amp;nbsp; Attr &amp;nbsp; LSize &amp;nbsp;Origin Snap% &amp;nbsp;Move Log Copy% &amp;nbsp;Convert&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; lv_root VolGroup -wi-a- 11.80g &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; lv_swap VolGroup -wi-a- &amp;nbsp;7.70g &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
mount /dev/mapper/VolGroup-lv_root /mount/lv_root&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
when done:&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
vgchange -an&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
losetup -d /dev/loop0&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
DONE!&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://blog.nikmartin.com/feeds/8954398417897190982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nikmartin.com/2012/10/i-have-cloudstack-vhd-template-i-want.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/8954398417897190982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/8954398417897190982'/><link rel='alternate' type='text/html' href='http://blog.nikmartin.com/2012/10/i-have-cloudstack-vhd-template-i-want.html' title='I have a Cloudstack VHD template I want to modify - now what?'/><author><name>Nik Martin</name><uri>http://www.blogger.com/profile/09851457018594198742</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5714073.post-6981465361268788226</id><published>2012-10-01T18:02:00.002-05:00</published><updated>2012-10-01T18:02:33.244-05:00</updated><title type='text'>MySQL Pager Trick</title><content type='html'>I got tired of always having to set the pager (\P) in mysql cli, so I set up an alias in my bash profile:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;alias mysql=&quot;mysql --pager=&#39;less -niS&#39;&quot;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Now, I get nice tabular formatted output in my queries.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://blog.nikmartin.com/feeds/6981465361268788226/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nikmartin.com/2012/10/mysql-pager-trick.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/6981465361268788226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/6981465361268788226'/><link rel='alternate' type='text/html' href='http://blog.nikmartin.com/2012/10/mysql-pager-trick.html' title='MySQL Pager Trick'/><author><name>Nik Martin</name><uri>http://www.blogger.com/profile/09851457018594198742</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5714073.post-4251958000843197513</id><published>2012-10-01T16:16:00.001-05:00</published><updated>2012-10-01T16:27:40.041-05:00</updated><title type='text'>Centos 6.x VMs on CloudStack</title><content type='html'>If you want to create a template for deploying Centos 6 VMs, you need to do a few things to the VM before snapshotting the root volume and converting it into a template:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;yum -y update (of course)&lt;/li&gt;
&lt;li&gt;set the root password to a well known one (&quot;password&quot; comes to mind)&lt;/li&gt;
&lt;li&gt;delete the SSH keys in /etc/ssh/ so on first boot sshd will generate new keys&lt;/li&gt;
&lt;li&gt;rm&amp;nbsp;/etc/udev/rules.d/70-persistent-net.rules&lt;/li&gt;
&lt;li&gt;yum -y install vim :)&lt;/li&gt;
&lt;li&gt;edit /etc/sysconfig/network-scripts/ifcfg-eth0 to look like:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;DEVICE=eth0&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;BOOTPROTO=dhcp&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ONBOOT=yes&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;TYPE=Ethernet&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div&gt;
That should get you going.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://blog.nikmartin.com/feeds/4251958000843197513/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nikmartin.com/2012/10/centos-6x-vms-on-cloudstack.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/4251958000843197513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/4251958000843197513'/><link rel='alternate' type='text/html' href='http://blog.nikmartin.com/2012/10/centos-6x-vms-on-cloudstack.html' title='Centos 6.x VMs on CloudStack'/><author><name>Nik Martin</name><uri>http://www.blogger.com/profile/09851457018594198742</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5714073.post-4824843005222869588</id><published>2012-09-15T14:02:00.001-05:00</published><updated>2012-09-15T14:10:19.381-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ddns"/><category scheme="http://www.blogger.com/atom/ns#" term="dns"/><category scheme="http://www.blogger.com/atom/ns#" term="dynamic"/><category scheme="http://www.blogger.com/atom/ns#" term="edgemarc"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><title type='text'>Dynamic Dns on an Edgewater Edgemarc device</title><content type='html'>&lt;a href=&quot;http://www.edgewaternetworks.com/&quot; target=&quot;_blank&quot;&gt;Edgewater Networks&lt;/a&gt;&amp;nbsp;makes some decent VOIP routers. &amp;nbsp;I&#39;ve used then for some time now in various situations, and always when configuring a network that uses hosted VOIP. One thing that all router manufacturers seem to do (rather poorly) is supply a &lt;a href=&quot;http://en.wikipedia.org/wiki/Ddns&quot; target=&quot;_blank&quot;&gt;Dynamic DNS&lt;/a&gt; feature. &amp;nbsp;Edgewater is no exception, since they hard code a few providers, and almost none of them work or are now paid. &amp;nbsp;I needed to use&lt;a href=&quot;http://www.namecheap.com/products/freedns.aspx&quot; target=&quot;_blank&quot;&gt; Name Cheap&#39;s excellent Dynamic DNS&lt;/a&gt; service. Well it&#39;s no secret that Edgewater&#39;s VOS is Linux with &lt;a href=&quot;http://www.busybox.net/about.html&quot; target=&quot;_blank&quot;&gt;Busybox&lt;/a&gt; providing all the standard shell apps and utilities. &amp;nbsp;It also has a crontab and wget, so problem 99.9% solved!&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
First, know that you have to have &lt;a href=&quot;http://the_root_password_is_shift+2345678109/&quot; id=&quot;the default root password is SHIFT+2345678109&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;SSH console access to the Edgemarc&lt;/a&gt;. &amp;nbsp;Once you get logged in, you are in a very minimal BusyBox shell, so vi will be stripped of almost all&amp;nbsp;usefulness, so we&#39;ll just cat what we need. &amp;nbsp;First, copy this block into your favorite editor, and edit to format it to the values you need, or another DDNS provider&#39;s format altogether. &amp;nbsp;Then let&#39;s create a shell script that we&#39;ll call via a cron job once an hour to update our IP address. &amp;nbsp;Note that the filesytem is read only except for a few directories. &amp;nbsp;/etc/config is one of them.&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt;1:  # cd /etc/config   
2:  cat &amp;gt; /etc/config/dyndns.sh &amp;lt;&amp;lt; EOF  
3:  #! /bin/sh  
4:  #namecheap dynamic dns:  
5:  wget --no-check-certificate -O /tmp/dyndns \  
6:  &quot;https://dynamicdns.park-your-domain.com/update?host=[YOUR-HOST]&amp;amp;domain=[YOUR-DOMAIN]&amp;amp;password=[YOUR-DDNS-PASSWORD]&quot;  
7:  EOF  
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Now, let&#39;s test it:&lt;br /&gt;
&lt;pre style=&quot;background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt;chmod a+x /etc/config/dyndsn.sh
/etc/config/dyndns.sh
cat /tmp/dyndns
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Does it work? &amp;nbsp;If so, let&#39;s schedule it via cron. &amp;nbsp;Let&#39;s do some more cat magic:&lt;br /&gt;
&lt;pre style=&quot;background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt;cp /etc/config/crontab /etc/config/crontab.sav
cat &amp;gt;&amp;gt; /etc/config/crontab &amp;lt;&amp;lt; EOF
* */1 * * * root /etc/config/dyndns.sh
EOF&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Now you should have a crontab that runs this script once an hour, and grabs the output of the POST and writes it to /tmp/dyndns. &amp;nbsp;You can check that file every once in a while to see that everything is working.&lt;br /&gt;
&lt;br /&gt;
Have fun hacking your Edgemarc!&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.nikmartin.com/feeds/4824843005222869588/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nikmartin.com/2012/09/dynamic-dns-on-edgewater-edgemarc-device.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/4824843005222869588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/4824843005222869588'/><link rel='alternate' type='text/html' href='http://blog.nikmartin.com/2012/09/dynamic-dns-on-edgewater-edgemarc-device.html' title='Dynamic Dns on an Edgewater Edgemarc device'/><author><name>Nik Martin</name><uri>http://www.blogger.com/profile/09851457018594198742</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5714073.post-6322026715901132164</id><published>2012-02-05T22:46:00.002-06:00</published><updated>2012-08-09T18:38:44.987-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="startups"/><category scheme="http://www.blogger.com/atom/ns#" term="technology"/><title type='text'></title><content type='html'>UPDATE&amp;nbsp;8/01/2012: &amp;nbsp;Zen Cart is total and utter garbage! &amp;nbsp;The internationalization is terrible, and the configurability is pitiful.&lt;br /&gt;
&lt;br /&gt;
I&#39;ve been playing around with a mail order business idea, and went looking for a free shopping cart site package.&amp;nbsp; I settled on &lt;a href=&quot;http://www.zen-cart.com/&quot; target=&quot;_blank&quot;&gt;Zen Cart&lt;/a&gt; after reading several reviews.&amp;nbsp; I&#39;ll have to say it&#39;s quite impressive once you grok the template override system. I started working on it this morning, and by 3pm had a working site.&amp;nbsp; I&#39;ll post a link to the store if I decide to actually launch it. Also props to &lt;a href=&quot;https://www.nearlyfreespeech.net/&quot; target=&quot;_blank&quot;&gt;Nearly Free Speech&lt;/a&gt; for building such a simple and functional hosting business.&amp;nbsp; It&#39;s really nice to be able to actually build a website at a web host that cares about web hosting.</content><link rel='replies' type='application/atom+xml' href='http://blog.nikmartin.com/feeds/6322026715901132164/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nikmartin.com/2012/02/ive-been-playing-around-with-mail-order.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/6322026715901132164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/6322026715901132164'/><link rel='alternate' type='text/html' href='http://blog.nikmartin.com/2012/02/ive-been-playing-around-with-mail-order.html' title=''/><author><name>Nik Martin</name><uri>http://www.blogger.com/profile/09851457018594198742</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5714073.post-4254988134636949377</id><published>2012-01-15T12:51:00.000-06:00</published><updated>2013-01-11T11:09:10.700-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="technology"/><title type='text'>MySQL Backup+email bash script</title><content type='html'>&lt;i style=&quot;background-color: #eeeeee;&quot;&gt;EDIT: January 11 2013 - I tried this on a newer Centos server and it appears the syntax to mutt has changed - you need to add &quot;--&quot; between the attachment and the destination email to have the command processed properly.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;


There are TONS of MySQL backup scripts around, but none on the first two pages of a Google search that did just what I wanted: backup each MySQL database on a server separately, then email them to me, one at a time. I found a few that were close, and modified them to do what I needed. &amp;nbsp;Credit is given to the original author when known.&lt;br /&gt;
&lt;br /&gt;
Credit to jamesmcdonald.id.au for the bulk of the main script&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre;&quot;&gt;#!/bin/bash&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;
# Add to cron to make it a scheduled backup
&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;#MySQL Backup User Info 
DBHOST=localhost
DBUSER=backup
DBPASS=mybakupuserpass

#a backup user needs select, lock tables, and reload privileges in MySQL:
#GRANT SHOW DATABASES, SELECT, LOCK TABLES, RELOAD ON *.* to backup@localhost IDENTIFIED BY &#39;readonly&#39;;
#FLUSH PRIVILEGES;

#where to send backed up file 
TO=you@yourdomain.com
#mutt has to read body of email from file, not stdin
MUTTXT=/tmp/myback.txt 

# format is YYYYMMDD
DATE=`date +%Y%m%d`

# This command runs the `show databases&#39; query against the mysql server
# it then pipes that result to awk which prints out the dbnames
# finally use grep -v to strip out any db&#39;s that shouldn&#39;t be backed up
# to skip multiple databases use grep -E -v &quot;dbname1|dbname2|dname3&quot;

#get list of databases on server 
DBS=`mysql --host=$DBHOST -p$DBPASS -u $DBUSER --skip-column-names &amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;\-e &quot;show databases;&quot; | awk  &#39;{ print $1 }&#39; | grep -v &quot;information_schema&quot;`
&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;#now loop through, dumping each database to a gzip
for i in $DBS
do
 
        # format is dbname-YYYYMMDD.gz&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;        DBOUT=$i-$DATE.sql.gz 
        echo Backing up $i to $DBOUT&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;        #set umask to protect file
        umask 006       

        mysqldump -u $DBUSER -h $DBHOST -p$DBPASS --add-drop-table $i | gzip -9 - &amp;gt; $DBOUT

        echo &quot;Backup successfully done. Please see attached file.&quot; &amp;gt; $MUTTXT&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;
        echo &quot;&quot; &amp;gt;&amp;gt; $MUTTXT&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;
        echo &quot;Backup file: $DBOUT&quot; &amp;gt;&amp;gt; $MUTTXT&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;
        echo &quot;&quot; &amp;gt;&amp;gt; $MUTTXT &lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;
 
        echo Sending $DBOUT to $TO
 
        which mutt &amp;gt; /dev/null
        if [ $? -eq 0 ]; then
                # now mail backup file with this attachment
                mutt -s &quot;$DBOUT Backup&quot; -a &quot;$DBOUT&quot; $TO &amp;lt; $MUTTXT&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;
        else
                echo &quot;Command mutt not found, cannot send an email with attachment&quot;
        fi
        
        if [ $? -eq 0 ]; then
                echo Removing $DBOUT
                rm $DBOUT
        else
                echo Error sending $DBOUT
        fi
 
done
&lt;/span&gt;&lt;/pre&gt;
</content><link rel='replies' type='application/atom+xml' href='http://blog.nikmartin.com/feeds/4254988134636949377/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nikmartin.com/2012/01/mysql-backupemail-bash-script.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/4254988134636949377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/4254988134636949377'/><link rel='alternate' type='text/html' href='http://blog.nikmartin.com/2012/01/mysql-backupemail-bash-script.html' title='MySQL Backup+email bash script'/><author><name>Nik Martin</name><uri>http://www.blogger.com/profile/09851457018594198742</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5714073.post-2912145839056788108</id><published>2012-01-07T18:20:00.000-06:00</published><updated>2012-01-15T17:30:22.899-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="food"/><category scheme="http://www.blogger.com/atom/ns#" term="pizza"/><title type='text'>Pizza</title><content type='html'>Made a few pizzas last weekend. &amp;nbsp;Worked with a slightly drier dough, and a very simple sauce of San Marzano tomatoes and 2 tbsp butter. &amp;nbsp;Also tried a new cheese from Sam&#39;s Club that is claimed to be nearly as good as Grande, which sets the standard for block pizza mozzarella. &amp;nbsp;Fresh mozzarella is always welcomed, but not always available or affordable.&amp;nbsp;
&lt;embed flashvars=&quot;host=picasaweb.google.com&amp;amp;noautoplay=1&amp;amp;hl=en_US&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=https%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2Fnik.martin%2Falbumid%2F5697992018974352961%3Falt%3Drss%26kind%3Dphoto%26authkey%3DGv1sRgCL3_qduJvdaJIw%26hl%3Den_US&quot; height=&quot;400&quot; pluginspage=&quot;http://www.macromedia.com/go/getflashplayer&quot; src=&quot;https://picasaweb.google.com/s/c/bin/slideshow.swf&quot; type=&quot;application/x-shockwave-flash&quot; width=&quot;600&quot;&gt;&lt;/embed&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.nikmartin.com/feeds/2912145839056788108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nikmartin.com/2012/01/made-few-pizzas-last-weekend.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/2912145839056788108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/2912145839056788108'/><link rel='alternate' type='text/html' href='http://blog.nikmartin.com/2012/01/made-few-pizzas-last-weekend.html' title='Pizza'/><author><name>Nik Martin</name><uri>http://www.blogger.com/profile/09851457018594198742</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5714073.post-6034608385954066795</id><published>2008-10-04T19:41:00.000-05:00</published><updated>2012-01-15T15:22:50.982-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="bread"/><category scheme="http://www.blogger.com/atom/ns#" term="food"/><title type='text'>New Sourdough</title><content type='html'>&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3I-MFcVtY6JmMRQK1v5LRMlIwzfFKshTHuOPnl9RQfqPR6g-tNgqdpRCUVpwkQ-MSLkA_xPScnZpBiyZjRrPCPE18_paDy-lpwIA-pAnhCcWfww4mziooBXQfgwfVJSpH9HgE/s1600-h/Sourdough.jpg&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5253464853364313666&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3I-MFcVtY6JmMRQK1v5LRMlIwzfFKshTHuOPnl9RQfqPR6g-tNgqdpRCUVpwkQ-MSLkA_xPScnZpBiyZjRrPCPE18_paDy-lpwIA-pAnhCcWfww4mziooBXQfgwfVJSpH9HgE/s320/Sourdough.jpg&quot; style=&quot;cursor: pointer; float: left; margin: 0pt 10px 10px 0pt;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
I&#39;ve been getting into baking bread from scratch, including growing my own yeast.  Fresh, all natural sourdough bread is one of the simplest, yet most wonderful things that can come out of a kitchen.  All bread that is made from wild yeast is considered sourdough, but he flavor is not necessarily sour.  The sourness comes from extended proofing the dough in the refrigerator, also called retarding.</content><link rel='replies' type='application/atom+xml' href='http://blog.nikmartin.com/feeds/6034608385954066795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nikmartin.com/2008/10/new-sourdough.asp#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/6034608385954066795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/6034608385954066795'/><link rel='alternate' type='text/html' href='http://blog.nikmartin.com/2008/10/new-sourdough.asp' title='New Sourdough'/><author><name>Nik Martin</name><uri>http://www.blogger.com/profile/09851457018594198742</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3I-MFcVtY6JmMRQK1v5LRMlIwzfFKshTHuOPnl9RQfqPR6g-tNgqdpRCUVpwkQ-MSLkA_xPScnZpBiyZjRrPCPE18_paDy-lpwIA-pAnhCcWfww4mziooBXQfgwfVJSpH9HgE/s72-c/Sourdough.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5714073.post-506728189627798377</id><published>2008-09-22T08:28:00.001-05:00</published><updated>2011-12-18T22:06:02.937-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="recipe bread"/><title type='text'>Nik&#39;s Modified King Arthur Whole Wheat Bread</title><content type='html'>&lt;ul&gt;&lt;li&gt;2 cups whole wheat King Arthur flour&lt;/li&gt;&lt;li&gt;1 cup King Arthur bread flour&lt;/li&gt;&lt;li&gt;1/4 cup nonfat dry milk&lt;/li&gt;&lt;li&gt;4 tbs butter&lt;/li&gt;&lt;li&gt;1/4 cup honey&lt;/li&gt;&lt;li&gt;1 tbs vital wheat gluten&lt;/li&gt;&lt;li&gt;1 1/2 tsp salt&lt;/li&gt;&lt;li&gt;1 1/2 tsp instant yeast&lt;/li&gt;&lt;li&gt;1 1/4 cups water&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;add all liquid to bread machine, then dry ingredients, then yeast.  set machine to&lt;br /&gt;1.5 lb whole wheat, and let &#39;er rip.</content><link rel='replies' type='application/atom+xml' href='http://blog.nikmartin.com/feeds/506728189627798377/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nikmartin.com/2008/09/niks-modified-king-arthur-whole-wheat.asp#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/506728189627798377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/506728189627798377'/><link rel='alternate' type='text/html' href='http://blog.nikmartin.com/2008/09/niks-modified-king-arthur-whole-wheat.asp' title='Nik&#39;s Modified King Arthur Whole Wheat Bread'/><author><name>Nik Martin</name><uri>http://www.blogger.com/profile/09851457018594198742</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5714073.post-1456064582333939529</id><published>2008-09-06T16:55:00.002-05:00</published><updated>2012-01-15T15:23:13.826-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="food"/><title type='text'>Chicken and Rice for a Big Group</title><content type='html'>On Tuesday nights, &lt;a href=&quot;http://www.15place.org/&quot;&gt;I feed the homeless and less fortunate &lt;/a&gt; in our city at a place called 15 Place.  I created a recipe that&#39;s simple, uses ONLY fresh ingredients, is healthy, can be made by volunteers, and most of all, is delicious. I buy all the ingredients at the local SuperMega Shopper&#39;s club on Sunday afternoon, and cook on Tuesday afternoon, after work.  It only takes 1 &amp;amp; 1/2 hours start to finish to make enough to feed about 60-70 people, with seconds for as many that want them.  The recipe:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;4 Chickens, whole fryers&lt;/li&gt;
&lt;li&gt;5 lbs onions&lt;/li&gt;
&lt;li&gt;5 lbs carrots&lt;/li&gt;
&lt;li&gt;3 bunches of celery&lt;/li&gt;
&lt;li&gt;12 cups of rice (parboiled works best)&lt;/li&gt;
&lt;li&gt;1 tub chicken base (for extra chickeny goodness)&lt;/li&gt;
&lt;li&gt;salt, pepper, and garlic powder to taste&lt;/li&gt;
&lt;/ul&gt;
The key to the recipe is there&#39;s never any waiting around if you do it in the order I list it in.  This means you are very productive and can do this after work for a local soup kitchen in your area!&lt;br /&gt;
&lt;br /&gt;
In a BIIIG pot with a basket liner (60 qts) , on an outdoor gas burner,  start 5 gallons of water boiling &lt;span style=&quot;font-style: italic;&quot;&gt;very vigorously&lt;/span&gt;.  Unwrap the chickens, rinse, and cut slits into the breasts, all the way to the bone.  This ensures they get cooked thoroughly.  Add the chickens to the pot.  Set a timer for 30 minutes, and start it as soon as the water starts to boil.  Clean carrots and celery by using a kitchen veggie brush;  don&#39;t bother peeling!  Slice/chop all veggies and set aside.  This can be done by a team of about 3-4 people, 1 scrubbing, and 3 cutting.  By this time, the chickens should be nearing done.  Once the timer goes off, pull the basket up from the water allow to drain, then remove the chickens and lay them out to cool. Set the basket aside, you dont need it anymore. Add all the veggies to the pot, along with the chicken base, and return to a vigorous boil for 15 minutes.  Start pulling the chicken.  Get the bones as clean as you can get it, try not to waste anything.  Chop all the big pieces, and as soon as the timer goes off again, add all the chicken to the pot, along with the rice.  Return to a boil. Boil until the liquid starts to thicken with rice starch, then cut the fire WAAAY back, or else you will burn the bottom of the pot.  Cook until the rice starts to get tender, then cut the fire.  Add salt, pepper, and garlic powder to taste, and then use small sauce pots or other big dippers to move the chicken and rice into an ice chest to keep hot.  The rice will continue to cook, and absorb water for another 15 minutes.  This gives you time to transport it to the soup kitchen, or public park, or wherever you serve it.  I serve it in a foam bowl with a yeast roll from the SuperMega Club.  The price ends up being &amp;lt; $.75 per person, which is a super deal on such a fresh, delicious meal.  It&#39;s a real comfort food for those whe are in need of comfort.&lt;br /&gt;
&lt;br /&gt;
Feel free to share this recipe with anyone interested in helping out a brother or sister in need.</content><link rel='replies' type='application/atom+xml' href='http://blog.nikmartin.com/feeds/1456064582333939529/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nikmartin.com/2008/09/chicken-and-rice-for-big-group.asp#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/1456064582333939529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/1456064582333939529'/><link rel='alternate' type='text/html' href='http://blog.nikmartin.com/2008/09/chicken-and-rice-for-big-group.asp' title='Chicken and Rice for a Big Group'/><author><name>Nik Martin</name><uri>http://www.blogger.com/profile/09851457018594198742</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5714073.post-7649191398644775006</id><published>2008-09-05T11:05:00.001-05:00</published><updated>2012-01-15T15:24:29.797-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apple"/><category scheme="http://www.blogger.com/atom/ns#" term="Google"/><category scheme="http://www.blogger.com/atom/ns#" term="startups"/><category scheme="http://www.blogger.com/atom/ns#" term="technology"/><title type='text'>Apple - MacBook Pro</title><content type='html'>Working at a startup is a blast.  One thing I made everyone promise is to be open minded about the technology I adopt.  Once I got buy-in from everyone on this, I bought Apple MacBook Pros.  Now this may not seem like a big deal, but the startup I&#39;m at is a DOD (Department of Defense) contractor.  These guys have only ever seen a Windows machine.  There was resistance, but everyone went along.  After unboxing and walking through the setup, everyone is in love with their MacBooks. The next thing I did was create a &lt;a href=&quot;http://google.com/a&quot;&gt;Google Apps For Your Domain&lt;/a&gt; account for our company.  Our entire business runs on Google Apps.  We DID cave and buy Office for Mac for a few guys, cause they just couldn&#39;t live without a few things that they missed in Office, but by and large we are running things off of Google Apps, and I &lt;span style=&quot;font-style: italic;&quot;&gt;HIGHLY&lt;/span&gt; recommend it for people starting up a company with little or no overhead budget.</content><link rel='replies' type='application/atom+xml' href='http://blog.nikmartin.com/feeds/7649191398644775006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nikmartin.com/2008/09/apple-macbook-pro.asp#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/7649191398644775006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/7649191398644775006'/><link rel='alternate' type='text/html' href='http://blog.nikmartin.com/2008/09/apple-macbook-pro.asp' title='Apple - MacBook Pro'/><author><name>Nik Martin</name><uri>http://www.blogger.com/profile/09851457018594198742</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5714073.post-2681250165949786445</id><published>2007-10-21T17:59:00.000-05:00</published><updated>2012-01-15T15:24:42.392-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="food"/><title type='text'>Mustard Pulled Pork Sauce</title><content type='html'>&lt;span class=&quot;postbody&quot;&gt;Courtesy of Roxy in Ontario, BC Canada&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Mustard Vinegar Sauce&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1 cup apple cider vinegar&lt;br /&gt;1/2 cup Yellow mustard&lt;br /&gt;1/4 cup onion finely minced&lt;br /&gt;2 cloves garlic pureed&lt;br /&gt;1/2 teaspoon black pepper&lt;br /&gt;1 tablespoon Worcestershire sauce&lt;br /&gt;1/2 cup brown sugar&lt;br /&gt;1/4 teaspoon cayenne pepper&lt;br /&gt;1/2 teaspoon salt&lt;br /&gt;1/2 teaspoon Tabasco sauce&lt;br /&gt;&lt;br /&gt;Combine ingredients and simmer for 15 minutes, stirring occasionally. &lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.nikmartin.com/feeds/2681250165949786445/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nikmartin.com/2007/10/mustard-pulled-pork-sauce.asp#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/2681250165949786445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5714073/posts/default/2681250165949786445'/><link rel='alternate' type='text/html' href='http://blog.nikmartin.com/2007/10/mustard-pulled-pork-sauce.asp' title='Mustard Pulled Pork Sauce'/><author><name>Nik Martin</name><uri>http://www.blogger.com/profile/09851457018594198742</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>