<?xml version="1.0" encoding="iso-8859-1"?><!-- generator="b2evolution/4.0.3" -->
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>/dev/random</title>
		<link>http://blogs.sakienvirotech.com/index.php/random/</link>
		<atom:link rel="self" type="application/rss+xml" href="http://blogs.sakienvirotech.com/index.php/random/?tempskin=_rss2" />
		<description>/dev/random - musings from the developer's corner</description>
		<language>en-AU</language>
		<docs>http://blogs.law.harvard.edu/tech/rss</docs>
		<admin:generatorAgent rdf:resource="http://b2evolution.net/?v=4.0.3"/>
		<ttl>60</ttl>
				<item>
			<title>Anatomy of a Failure: CFA Website</title>
			<link>http://blogs.sakienvirotech.com/index.php/random/2013/01/06/anatomy-of-a-failure-cfa</link>
			<pubDate>Sun, 06 Jan 2013 07:27:00 +0000</pubDate>			<dc:creator>ajdonnison</dc:creator>
			<category domain="alt">The chattering classes</category>
<category domain="main">Open Source, Open World</category>			<guid isPermaLink="false">810@http://blogs.sakienvirotech.com/</guid>
						<description>&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p style=&quot;padding: 0px 0px 15px; margin: 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal;&quot;&gt;As a result of disasterous fires in our state in 2009 known as&amp;#160;&lt;a style=&quot;padding: 0px; margin: 0px; color: #0072bc;&quot; title=&quot;Black Saturday&quot; href=&quot;http://en.wikipedia.org/wiki/Black_Saturday_bushfires&quot;&gt;Black Saturday&lt;/a&gt; there was a&amp;#160;&lt;a style=&quot;padding: 0px; margin: 0px; color: #0072bc;&quot; href=&quot;http://en.wikipedia.org/wiki/2009_Victorian_Bushfires_Royal_Commission&quot;&gt;Royal Commission&lt;/a&gt; into the fires, the management of them and the deaths that occurred as a result. &amp;#160;Coming out of this was a set of recommendations and changes were instigated by a number of parties. &amp;#160;One of the main parties of interest in the handling of fire services in the state is the&lt;a style=&quot;padding: 0px; margin: 0px; color: #0072bc;&quot; href=&quot;http://www.cfa.vic.gov.au/&quot;&gt;CFA (Country Fire Authority)&lt;/a&gt;.&lt;/p&gt;
&lt;p style=&quot;padding: 0px 0px 15px; margin: 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal;&quot;&gt;The CFA has to be congratulated for at least the intent of some of their initiatives post Black Saturday. &amp;#160;One of these is their Fire Ready app for mobile phones, and another was a revamp of their website. &amp;#160;A lot of time, and presumably public funds, went into the developments that resulted in a&amp;#160;&lt;a style=&quot;padding: 0px; margin: 0px; color: #0072bc;&quot; href=&quot;http://www.theage.com.au/technology/technology-news/cfa-website-cant-handle-the-heat-20130105-2ca9f.html&quot;&gt;catastrophic failure of the website and app&lt;/a&gt;. So what went wrong?&lt;/p&gt;
&lt;p style=&quot;padding: 0px 0px 15px; margin: 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal;&quot;&gt;Initial reports suggest that capacity planning was at issue, with the statement made that they had planned for up to 350 hits per second, but the site received 700 hits per second. Much of the blame was placed on the fact that the app was connecting to the same server as the main site, and that part of the solution was that they put the app on its own server. Note the singular &#039;server&#039; there. &amp;#160;I&#039;m not sure if this was just a reporting problem, trying to make it easier for journalists to understand, or we are really talking about an under-resourced system that is supposedly meant to assist people in the times of greatest need and stress. &amp;#160;So, aside from the fact that both were on the same infrastructure (let us assume there is actually more than one server there), what can we determine about the possible problems that these 700 hits per second were causing.&lt;/p&gt;
&lt;p style=&quot;padding: 0px 0px 15px; margin: 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal;&quot;&gt;Firstly, looking at the site details, the app now uses osom.cfa.vic.gov.au, which appears to be fronted by a Squid proxy cache, often used to act as a web site accelerator, so there could be more than one server behind that. &amp;#160;The main website,&amp;#160;&lt;a style=&quot;padding: 0px; margin: 0px; color: #0072bc;&quot; href=&quot;http://www.cfa.vic.gov.au/&quot;&gt;www.cfa.vic.gov.au&lt;/a&gt; is behind a F5 BIG IP appliance, which in its base form is a load balancer, meaning that unless they are spending money for the sake of it, there is at least more than one server providing the service. &amp;#160;The BIG IP appliance is quite a useful beasty, and can provide web site acceleration, using compression and other techniques to make life easier. &amp;#160;So why was there a problem? &amp;#160;And apologies for me starting to get a bit technical from here on in.&lt;/p&gt;
&lt;p style=&quot;padding: 0px 0px 15px; margin: 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal;&quot;&gt;Let&#039;s first define what a &quot;hit&quot; might be. &amp;#160;When you load a web page, like&amp;#160;&lt;a style=&quot;padding: 0px; margin: 0px; color: #0072bc;&quot; href=&quot;http://www.vic.gov.au/&quot;&gt;www.vic.gov.au&lt;/a&gt;, you might think that by the time it finishes loading that is one &quot;hit&quot;. &amp;#160;And you&#039;d be wrong. &amp;#160;A web page is made up of a number of files. Each image on the site is likely to be a file, as is each stylesheet and javascript file. Each of these files is requested separately and each of these requests results in a &quot;hit&quot;. &amp;#160;Taking a look at the structure of the CFA site shows that there are a number of unnecessary files on there. &amp;#160;For instance there are 6 javascript files that could be combined into one. &amp;#160;There are images called from CSS that could be combined into &quot;sprites&quot;. &amp;#160;Just performing that alone would change the number of hits the site was getting to load a single page, and in doing so increase its capacity - without resorting to extra hardware or tweaking networking stacks. &amp;#160;Indeed it looks like you could increase the number of page views supported by a factor of at least three, simply by resolving these extraneous hits.&lt;/p&gt;
&lt;p style=&quot;padding: 0px 0px 15px; margin: 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal;&quot;&gt;There is more intersting stuff under the covers. &amp;#160;There is no compression used on any of the assets (page data, images, scripts, stylesheets) so that the amout of data having to be sent down the wire is far greater than it needs to be. &amp;#160;A conservative estimate suggests that the site could handle twice the current load simply by turning on compression. &amp;#160;This is usually just a configuration change in the base web server software. &amp;#160;All modern browsers support compression, and it is a rookie mistake not to be using it.&lt;/p&gt;
&lt;p style=&quot;padding: 0px 0px 15px; margin: 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal;&quot;&gt;On the same front, most browsers also try and help by actively caching items that don&#039;t change often, meaning the next time you go to the site it is far quicker to load as the browser already knows about it. &amp;#160;For this to work you need to make sure your web server is set up to help out. &amp;#160;The CFA site is not. &amp;#160;There are two factors here, ETags and Expire headers. &amp;#160;ETags are supposedly unique ids for assets that allow the browser to check that it has a copy of this and therefore doesn&#039;t need to re-download (providing it hasn&#039;t expired). &amp;#160;The trouble with these is that if you have more than one server supplying the same data - as you would behind say a BIG IP appliance, &amp;#160;these ETags are likely to be different for the same resource, meaning that the browser thinks it needs to download the item again as it has changed. &amp;#160;The CFA site has ETags turned on.&lt;/p&gt;
&lt;p style=&quot;padding: 0px 0px 15px; margin: 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal;&quot;&gt;Expiry headers tell the browser how long it should hold an item in its cache before checking for a new version. &amp;#160;For items that don&#039;t change much (like images and stylesheets and scripts) it is common to set a &quot;far future&quot; expiry header, say a year or even a month into the future. &amp;#160;This means the browser doesn&#039;t need to worry about these items after the first load. &amp;#160;The CFA site doesn&#039;t use Expiry headers. &amp;#160;Fixing these two problems could see at least a 50% if not doubling of the capacity of the servers.&lt;/p&gt;
&lt;p style=&quot;padding: 0px 0px 15px; margin: 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal;&quot;&gt;Now, without looking at hardware, operating system or web server software, it looks like the site could have handled between 9 and 12 times the traffic it received on Friday. &amp;#160;All it would have taken was someone with experience in developing high capacity websites, or even a sysadmin with capacity planning skills to have foreseen this and averted what was an obviously avoidable calamity. &amp;#160;What a pity. &amp;#160;I hope someone in CFA is reading this, as despite the assurances made about things being done - I don&#039;t see any evidence of even the basics being covered.&lt;/p&gt;
&lt;p style=&quot;padding: 0px 0px 15px; margin: 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal;&quot;&gt;Update 2013-01-15:&lt;/p&gt;
&lt;p style=&quot;padding: 0px 0px 15px; margin: 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal;&quot;&gt;The minister has announced today that the site, and the app, have been improved such that there will be no repeat of the problems previously seen. &amp;#160;The details of what they&#039;ve changed were unclear, however a quick check shows that the only thing addressed on the site itself was the compression. &amp;#160;As mentioned above, this was an easy fix and should have been applied before the site went live. &amp;#160;However, the other points were not addressed.&lt;/p&gt;
&lt;p style=&quot;padding: 0px 0px 15px; margin: 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal;&quot;&gt;The wording of the minister&#039;s announcement suggests that more hardware has been added. &amp;#160;Perhaps the compression module on the Big IP box? &amp;#160; I haven&#039;t run any tests to identify if there have been extra servers added, but I suspect that has happened as well. &amp;#160;Yet compression and the other suggestions I&#039;ve made would take a few minutes of a competent sysadmin&#039;s time, so why is it that it took more than a week for compression to be turned on? &amp;#160;Why aren&#039;t the other problems being addressed? &amp;#160;Why are we getting vague assurances that the problems are resolved with absolutely no detail as to what was addressed? &amp;#160;My suspicion is that there is a salesperson somewhere driving around in a very expensive car funded by the commission they have received on upselling the CFA.&lt;/p&gt;&lt;div class=&quot;socialbutttons&quot;&gt;&lt;div class=&quot;fbiframediv sharebuttton&quot;&gt;&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?app_id=194259500619894&amp;amp;href=http://blogs.sakienvirotech.com/index.php?p=810&amp;amp;send=false&amp;amp;width=450&amp;amp;show_faces=false&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;font=arial&amp;amp;height=85&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:450px; height:85px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div class=&quot;twbutton sharebuttton&quot;&gt;&lt;a href=&quot;http://twitter.com/share&quot; class=&quot;twitter-share-button&quot; data-url=&quot;http://blogs.sakienvirotech.com/index.php?p=810&quot; data-count=&quot;horizontal&quot;&gt;Tweet&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;gplusdiv sharebuttton&quot;&gt;&lt;g:plusone href=&quot;http://blogs.sakienvirotech.com/index.php?p=810&quot;&gt;&lt;/g:plusone&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blogs.sakienvirotech.com/index.php/random/2013/01/06/anatomy-of-a-failure-cfa&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://blogs.sakienvirotech.com/random&quot;&gt;Saki Envirotech Blogs&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>&#160;</p>
<p style="padding: 0px 0px 15px; margin: 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal;">As a result of disasterous fires in our state in 2009 known as&#160;<a style="padding: 0px; margin: 0px; color: #0072bc;" title="Black Saturday" href="http://en.wikipedia.org/wiki/Black_Saturday_bushfires">Black Saturday</a> there was a&#160;<a style="padding: 0px; margin: 0px; color: #0072bc;" href="http://en.wikipedia.org/wiki/2009_Victorian_Bushfires_Royal_Commission">Royal Commission</a> into the fires, the management of them and the deaths that occurred as a result. &#160;Coming out of this was a set of recommendations and changes were instigated by a number of parties. &#160;One of the main parties of interest in the handling of fire services in the state is the<a style="padding: 0px; margin: 0px; color: #0072bc;" href="http://www.cfa.vic.gov.au/">CFA (Country Fire Authority)</a>.</p>
<p style="padding: 0px 0px 15px; margin: 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal;">The CFA has to be congratulated for at least the intent of some of their initiatives post Black Saturday. &#160;One of these is their Fire Ready app for mobile phones, and another was a revamp of their website. &#160;A lot of time, and presumably public funds, went into the developments that resulted in a&#160;<a style="padding: 0px; margin: 0px; color: #0072bc;" href="http://www.theage.com.au/technology/technology-news/cfa-website-cant-handle-the-heat-20130105-2ca9f.html">catastrophic failure of the website and app</a>. So what went wrong?</p>
<p style="padding: 0px 0px 15px; margin: 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal;">Initial reports suggest that capacity planning was at issue, with the statement made that they had planned for up to 350 hits per second, but the site received 700 hits per second. Much of the blame was placed on the fact that the app was connecting to the same server as the main site, and that part of the solution was that they put the app on its own server. Note the singular 'server' there. &#160;I'm not sure if this was just a reporting problem, trying to make it easier for journalists to understand, or we are really talking about an under-resourced system that is supposedly meant to assist people in the times of greatest need and stress. &#160;So, aside from the fact that both were on the same infrastructure (let us assume there is actually more than one server there), what can we determine about the possible problems that these 700 hits per second were causing.</p>
<p style="padding: 0px 0px 15px; margin: 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal;">Firstly, looking at the site details, the app now uses osom.cfa.vic.gov.au, which appears to be fronted by a Squid proxy cache, often used to act as a web site accelerator, so there could be more than one server behind that. &#160;The main website,&#160;<a style="padding: 0px; margin: 0px; color: #0072bc;" href="http://www.cfa.vic.gov.au/">www.cfa.vic.gov.au</a> is behind a F5 BIG IP appliance, which in its base form is a load balancer, meaning that unless they are spending money for the sake of it, there is at least more than one server providing the service. &#160;The BIG IP appliance is quite a useful beasty, and can provide web site acceleration, using compression and other techniques to make life easier. &#160;So why was there a problem? &#160;And apologies for me starting to get a bit technical from here on in.</p>
<p style="padding: 0px 0px 15px; margin: 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal;">Let's first define what a "hit" might be. &#160;When you load a web page, like&#160;<a style="padding: 0px; margin: 0px; color: #0072bc;" href="http://www.vic.gov.au/">www.vic.gov.au</a>, you might think that by the time it finishes loading that is one "hit". &#160;And you'd be wrong. &#160;A web page is made up of a number of files. Each image on the site is likely to be a file, as is each stylesheet and javascript file. Each of these files is requested separately and each of these requests results in a "hit". &#160;Taking a look at the structure of the CFA site shows that there are a number of unnecessary files on there. &#160;For instance there are 6 javascript files that could be combined into one. &#160;There are images called from CSS that could be combined into "sprites". &#160;Just performing that alone would change the number of hits the site was getting to load a single page, and in doing so increase its capacity - without resorting to extra hardware or tweaking networking stacks. &#160;Indeed it looks like you could increase the number of page views supported by a factor of at least three, simply by resolving these extraneous hits.</p>
<p style="padding: 0px 0px 15px; margin: 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal;">There is more intersting stuff under the covers. &#160;There is no compression used on any of the assets (page data, images, scripts, stylesheets) so that the amout of data having to be sent down the wire is far greater than it needs to be. &#160;A conservative estimate suggests that the site could handle twice the current load simply by turning on compression. &#160;This is usually just a configuration change in the base web server software. &#160;All modern browsers support compression, and it is a rookie mistake not to be using it.</p>
<p style="padding: 0px 0px 15px; margin: 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal;">On the same front, most browsers also try and help by actively caching items that don't change often, meaning the next time you go to the site it is far quicker to load as the browser already knows about it. &#160;For this to work you need to make sure your web server is set up to help out. &#160;The CFA site is not. &#160;There are two factors here, ETags and Expire headers. &#160;ETags are supposedly unique ids for assets that allow the browser to check that it has a copy of this and therefore doesn't need to re-download (providing it hasn't expired). &#160;The trouble with these is that if you have more than one server supplying the same data - as you would behind say a BIG IP appliance, &#160;these ETags are likely to be different for the same resource, meaning that the browser thinks it needs to download the item again as it has changed. &#160;The CFA site has ETags turned on.</p>
<p style="padding: 0px 0px 15px; margin: 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal;">Expiry headers tell the browser how long it should hold an item in its cache before checking for a new version. &#160;For items that don't change much (like images and stylesheets and scripts) it is common to set a "far future" expiry header, say a year or even a month into the future. &#160;This means the browser doesn't need to worry about these items after the first load. &#160;The CFA site doesn't use Expiry headers. &#160;Fixing these two problems could see at least a 50% if not doubling of the capacity of the servers.</p>
<p style="padding: 0px 0px 15px; margin: 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal;">Now, without looking at hardware, operating system or web server software, it looks like the site could have handled between 9 and 12 times the traffic it received on Friday. &#160;All it would have taken was someone with experience in developing high capacity websites, or even a sysadmin with capacity planning skills to have foreseen this and averted what was an obviously avoidable calamity. &#160;What a pity. &#160;I hope someone in CFA is reading this, as despite the assurances made about things being done - I don't see any evidence of even the basics being covered.</p>
<p style="padding: 0px 0px 15px; margin: 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal;">Update 2013-01-15:</p>
<p style="padding: 0px 0px 15px; margin: 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal;">The minister has announced today that the site, and the app, have been improved such that there will be no repeat of the problems previously seen. &#160;The details of what they've changed were unclear, however a quick check shows that the only thing addressed on the site itself was the compression. &#160;As mentioned above, this was an easy fix and should have been applied before the site went live. &#160;However, the other points were not addressed.</p>
<p style="padding: 0px 0px 15px; margin: 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal;">The wording of the minister's announcement suggests that more hardware has been added. &#160;Perhaps the compression module on the Big IP box? &#160; I haven't run any tests to identify if there have been extra servers added, but I suspect that has happened as well. &#160;Yet compression and the other suggestions I've made would take a few minutes of a competent sysadmin's time, so why is it that it took more than a week for compression to be turned on? &#160;Why aren't the other problems being addressed? &#160;Why are we getting vague assurances that the problems are resolved with absolutely no detail as to what was addressed? &#160;My suspicion is that there is a salesperson somewhere driving around in a very expensive car funded by the commission they have received on upselling the CFA.</p><div class="socialbutttons"><div class="fbiframediv sharebuttton"><iframe src="http://www.facebook.com/plugins/like.php?app_id=194259500619894&amp;href=http://blogs.sakienvirotech.com/index.php?p=810&amp;send=false&amp;width=450&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=85" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:85px;" allowTransparency="true"></iframe></div><div class="twbutton sharebuttton"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blogs.sakienvirotech.com/index.php?p=810" data-count="horizontal">Tweet</a></div><div class="gplusdiv sharebuttton"><g:plusone href="http://blogs.sakienvirotech.com/index.php?p=810"></g:plusone></div></div><div class="item_footer"><p><small><a href="http://blogs.sakienvirotech.com/index.php/random/2013/01/06/anatomy-of-a-failure-cfa">Original post</a> blogged on <a href="http://blogs.sakienvirotech.com/random">Saki Envirotech Blogs</a>.</small></p></div>]]></content:encoded>
								<comments>http://blogs.sakienvirotech.com/index.php/random/2013/01/06/anatomy-of-a-failure-cfa#comments</comments>
			<wfw:commentRss>http://blogs.sakienvirotech.com/index.php/random/?tempskin=_rss2&#38;disp=comments&#38;p=810</wfw:commentRss>
		</item>
				<item>
			<title>License confusion and the stripping of rights.</title>
			<link>http://blogs.sakienvirotech.com/index.php/random/2013/01/04/license-confusion-and-the-stripping</link>
			<pubDate>Fri, 04 Jan 2013 07:16:00 +0000</pubDate>			<dc:creator>ajdonnison</dc:creator>
			<category domain="alt">dotProject</category>
<category domain="main">Open Source, Open World</category>			<guid isPermaLink="false">809@http://blogs.sakienvirotech.com/</guid>
						<description>&lt;p&gt;I really thought that the time of license confusion was well past, and we had all settled down and understood the basis, and ramifications of each of the open source licenses. &amp;#160;It seems I was wrong.&lt;/p&gt;
&lt;p&gt;Having a look at a piece of code recently I noticed some very familiar code - it was my code, originally released under GPL with the copyright notice clearly stating that it was &quot;part of the collected works of Adam Donnison&quot;. &amp;#160;I had done this deliberately and done so with a number of pieces of code that I had built over the years, knowing that they were useful and could be used in other projects. &amp;#160;Imagine my surprise to see that same code, only slightly modified, in another project with the copyright notice removed and the explanation:&lt;/p&gt;
&lt;pre&gt;&amp;#160;* Note: Previously, this class was mis-licensed as GPL in an otherwise BSD
&amp;#160;* &amp;#160; application. The GPL attempt was in 2003 while the project itself was not
&amp;#160;* &amp;#160; relicensed from BSD to GPL in 2005. In 2007, all further development was
&amp;#160;* &amp;#160; done under the Clear BSD license and all GPL modifications were removed.
&lt;/pre&gt;
&lt;p&gt;Really? &amp;#160;Since when did the BSD license become viral? &amp;#160;Wasn&#039;t that the entire reason people complained about GPL and wanted to move to BSD? &amp;#160;There is nothing in the BSD license, or the Clear BSD license that demands that all code in a project be covered by the same license. &amp;#160;Indeed even prior to 2001 dotProject had code that was under the Voxel Public License (ticketsmith) which was more restrictive than BSD, so there had been precedents for differently licensed parts of the code. &amp;#160;Indeed none of the BSD licenses even has the concept of a &quot;project&quot; or &quot;greater work&quot;. Dropping the copyright is also a violation of the BSD license, as it is of the GPL, so no matter how you cut the dice, this action was against both the spirit and the letter of the licenses it supposes to uphold.&lt;/p&gt;
&lt;p&gt;As to &quot;all GPL modifications were removed&quot;, an interesting and, on the face of it, erroneous statement.&lt;/p&gt;
&lt;p&gt;I believe I am within my rights to demand that the copyright notice be reinstated, or the code removed. &amp;#160;Now I don&#039;t want to get heavy with anyone, but these licenses only work based on strong copyright protection. &amp;#160;My copyright has been violated, and I am now considering what action to take.&lt;/p&gt;
&lt;p&gt;This is not the first run-in I&#039;ve had with this project&#039;s developers on their cavalier attitude to copyright notices, but this is by far the most egregious. &amp;#160;I believe their actions were to allow them to make money on the project - in which case I also believe that damages could be sought. &amp;#160;I have no problem with them making money - only not by stripping me of my rights.&lt;/p&gt;
&lt;p&gt;Update: I&#039;ve since spoken with the project lead on the project in question and we&#039;ve come to an understanding on the issue.&lt;/p&gt;&lt;div class=&quot;socialbutttons&quot;&gt;&lt;div class=&quot;fbiframediv sharebuttton&quot;&gt;&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?app_id=194259500619894&amp;amp;href=http://blogs.sakienvirotech.com/index.php?p=809&amp;amp;send=false&amp;amp;width=450&amp;amp;show_faces=false&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;font=arial&amp;amp;height=85&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:450px; height:85px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div class=&quot;twbutton sharebuttton&quot;&gt;&lt;a href=&quot;http://twitter.com/share&quot; class=&quot;twitter-share-button&quot; data-url=&quot;http://blogs.sakienvirotech.com/index.php?p=809&quot; data-count=&quot;horizontal&quot;&gt;Tweet&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;gplusdiv sharebuttton&quot;&gt;&lt;g:plusone href=&quot;http://blogs.sakienvirotech.com/index.php?p=809&quot;&gt;&lt;/g:plusone&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blogs.sakienvirotech.com/index.php/random/2013/01/04/license-confusion-and-the-stripping&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://blogs.sakienvirotech.com/random&quot;&gt;Saki Envirotech Blogs&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>I really thought that the time of license confusion was well past, and we had all settled down and understood the basis, and ramifications of each of the open source licenses. ?It seems I was wrong.</p>
<p>Having a look at a piece of code recently I noticed some very familiar code - it was my code, originally released under GPL with the copyright notice clearly stating that it was "part of the collected works of Adam Donnison". ?I had done this deliberately and done so with a number of pieces of code that I had built over the years, knowing that they were useful and could be used in other projects. ?Imagine my surprise to see that same code, only slightly modified, in another project with the copyright notice removed and the explanation:</p>
<pre>?* Note: Previously, this class was mis-licensed as GPL in an otherwise BSD
?* ? application. The GPL attempt was in 2003 while the project itself was not
?* ? relicensed from BSD to GPL in 2005. In 2007, all further development was
?* ? done under the Clear BSD license and all GPL modifications were removed.
</pre>
<p>Really? ?Since when did the BSD license become viral? ?Wasn't that the entire reason people complained about GPL and wanted to move to BSD? ?There is nothing in the BSD license, or the Clear BSD license that demands that all code in a project be covered by the same license. ?Indeed even prior to 2001 dotProject had code that was under the Voxel Public License (ticketsmith) which was more restrictive than BSD, so there had been precedents for differently licensed parts of the code. ?Indeed none of the BSD licenses even has the concept of a "project" or "greater work". Dropping the copyright is also a violation of the BSD license, as it is of the GPL, so no matter how you cut the dice, this action was against both the spirit and the letter of the licenses it supposes to uphold.</p>
<p>As to "all GPL modifications were removed", an interesting and, on the face of it, erroneous statement.</p>
<p>I believe I am within my rights to demand that the copyright notice be reinstated, or the code removed. ?Now I don't want to get heavy with anyone, but these licenses only work based on strong copyright protection. ?My copyright has been violated, and I am now considering what action to take.</p>
<p>This is not the first run-in I've had with this project's developers on their cavalier attitude to copyright notices, but this is by far the most egregious. ?I believe their actions were to allow them to make money on the project - in which case I also believe that damages could be sought. ?I have no problem with them making money - only not by stripping me of my rights.</p>
<p>Update: I've since spoken with the project lead on the project in question and we've come to an understanding on the issue.</p><div class="socialbutttons"><div class="fbiframediv sharebuttton"><iframe src="http://www.facebook.com/plugins/like.php?app_id=194259500619894&amp;href=http://blogs.sakienvirotech.com/index.php?p=809&amp;send=false&amp;width=450&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=85" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:85px;" allowTransparency="true"></iframe></div><div class="twbutton sharebuttton"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blogs.sakienvirotech.com/index.php?p=809" data-count="horizontal">Tweet</a></div><div class="gplusdiv sharebuttton"><g:plusone href="http://blogs.sakienvirotech.com/index.php?p=809"></g:plusone></div></div><div class="item_footer"><p><small><a href="http://blogs.sakienvirotech.com/index.php/random/2013/01/04/license-confusion-and-the-stripping">Original post</a> blogged on <a href="http://blogs.sakienvirotech.com/random">Saki Envirotech Blogs</a>.</small></p></div>]]></content:encoded>
								<comments>http://blogs.sakienvirotech.com/index.php/random/2013/01/04/license-confusion-and-the-stripping#comments</comments>
			<wfw:commentRss>http://blogs.sakienvirotech.com/index.php/random/?tempskin=_rss2&#38;disp=comments&#38;p=809</wfw:commentRss>
		</item>
				<item>
			<title>Telstra BigPond Accounting Failure?</title>
			<link>http://blogs.sakienvirotech.com/index.php/random/2012/10/24/telstra-bigpond-accounting-failure</link>
			<pubDate>Wed, 24 Oct 2012 06:01:00 +0000</pubDate>			<dc:creator>ajdonnison</dc:creator>
			<category domain="alt">The chattering classes</category>
<category domain="main">Open Source, Open World</category>			<guid isPermaLink="false">800@http://blogs.sakienvirotech.com/</guid>
						<description>&lt;p&gt;This morning I was considering downloading a site image to work on locally, something I do every now and then. &amp;#160;As usual I checked my download quota on BigPond as we are on a limited bandwidth, being out in the sticks and not having access to real internet. &amp;#160;I was astonished to see that the monthly bandwidth was exceeded, by a large margin, and that I was being shaped down to 64kbps. &amp;#160;In fact, the system had started shaping on Sunday. &amp;#160;This was around 2/3rds of the way through the current billing period, and I knew that neither my wife nor I had been doing anything that would account for the whopping 4GB supposedly downloaded since the shaping started. &amp;#160;Indeed, at 64kbps, 4GB in 3 days is theoretically impossible.&lt;/p&gt;
&lt;p&gt;Speaking to Telstra accounts was, as usual, tricky. &amp;#160;All they could tell me was exactly what I could see in the usage graph, that I was being shaped and had exceeded my usage. &amp;#160;I explained how it was not theoretically possible to have downloaded the data claimed and explained why - so they decided I would be better talking to tech support. &amp;#160;The person on tech support was really helpful, which is not something I&#039;m used to. &amp;#160;Normally they run through a set script and then give me grief because I don&#039;t use Windows, cannot run Internet Explorer, and generally don&#039;t like having to explain a technical issue to someone who is obviously non-technical. &amp;#160;Anyway, after exploring the issues, they suggested resetting the wifi password and SSID. &amp;#160;I pointed out that since I live on 20 acres, and unless someone parked their car in my front yard they would have no chance of even seeing the router, it was unlikely to be an issue - although I agreed to do so. &amp;#160;Just before talking to Telstra I checked the usage meter (which updates hourly). &amp;#160;There was 906MB downloaded today. &amp;#160;After the call, and at least an hour after I last checked, I checked again. 1474MB.&lt;/p&gt;
&lt;p&gt;Whoa, 568MB in one hour?&lt;/p&gt;
&lt;p&gt;I grabbed my calculator. &amp;#160;64kbps is 8KB per second, which is 28MB per hour. &amp;#160;568MB is 20 times that. &amp;#160;Sorry guys, not remotely possible, unless you are telling me that I can be both shaped and download at speeds that I find almost impossible to achieve even when the wind is in the right quarter and the schoolkids are still at school.&lt;/p&gt;
&lt;p&gt;I managed to convince them that there was a real issue, and that we needed to monitor this. &amp;#160;I also changed my password to my account - which I suspect is more likely to be the issue. &amp;#160;They promised to lift the limit on my account although so far that hasn&#039;t yet happened. &amp;#160;I suspect, once again, I&#039;ll have to spend hours on the phone trying to find someone who understands the issue and can do something about it. &amp;#160;Stay tuned for updates.&lt;/p&gt;&lt;div class=&quot;socialbutttons&quot;&gt;&lt;div class=&quot;fbiframediv sharebuttton&quot;&gt;&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?app_id=194259500619894&amp;amp;href=http://blogs.sakienvirotech.com/index.php?p=800&amp;amp;send=false&amp;amp;width=450&amp;amp;show_faces=false&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;font=arial&amp;amp;height=85&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:450px; height:85px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div class=&quot;twbutton sharebuttton&quot;&gt;&lt;a href=&quot;http://twitter.com/share&quot; class=&quot;twitter-share-button&quot; data-url=&quot;http://blogs.sakienvirotech.com/index.php?p=800&quot; data-count=&quot;horizontal&quot;&gt;Tweet&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;gplusdiv sharebuttton&quot;&gt;&lt;g:plusone href=&quot;http://blogs.sakienvirotech.com/index.php?p=800&quot;&gt;&lt;/g:plusone&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blogs.sakienvirotech.com/index.php/random/2012/10/24/telstra-bigpond-accounting-failure&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://blogs.sakienvirotech.com/random&quot;&gt;Saki Envirotech Blogs&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>This morning I was considering downloading a site image to work on locally, something I do every now and then. &#160;As usual I checked my download quota on BigPond as we are on a limited bandwidth, being out in the sticks and not having access to real internet. &#160;I was astonished to see that the monthly bandwidth was exceeded, by a large margin, and that I was being shaped down to 64kbps. &#160;In fact, the system had started shaping on Sunday. &#160;This was around 2/3rds of the way through the current billing period, and I knew that neither my wife nor I had been doing anything that would account for the whopping 4GB supposedly downloaded since the shaping started. &#160;Indeed, at 64kbps, 4GB in 3 days is theoretically impossible.</p>
<p>Speaking to Telstra accounts was, as usual, tricky. &#160;All they could tell me was exactly what I could see in the usage graph, that I was being shaped and had exceeded my usage. &#160;I explained how it was not theoretically possible to have downloaded the data claimed and explained why - so they decided I would be better talking to tech support. &#160;The person on tech support was really helpful, which is not something I'm used to. &#160;Normally they run through a set script and then give me grief because I don't use Windows, cannot run Internet Explorer, and generally don't like having to explain a technical issue to someone who is obviously non-technical. &#160;Anyway, after exploring the issues, they suggested resetting the wifi password and SSID. &#160;I pointed out that since I live on 20 acres, and unless someone parked their car in my front yard they would have no chance of even seeing the router, it was unlikely to be an issue - although I agreed to do so. &#160;Just before talking to Telstra I checked the usage meter (which updates hourly). &#160;There was 906MB downloaded today. &#160;After the call, and at least an hour after I last checked, I checked again. 1474MB.</p>
<p>Whoa, 568MB in one hour?</p>
<p>I grabbed my calculator. &#160;64kbps is 8KB per second, which is 28MB per hour. &#160;568MB is 20 times that. &#160;Sorry guys, not remotely possible, unless you are telling me that I can be both shaped and download at speeds that I find almost impossible to achieve even when the wind is in the right quarter and the schoolkids are still at school.</p>
<p>I managed to convince them that there was a real issue, and that we needed to monitor this. &#160;I also changed my password to my account - which I suspect is more likely to be the issue. &#160;They promised to lift the limit on my account although so far that hasn't yet happened. &#160;I suspect, once again, I'll have to spend hours on the phone trying to find someone who understands the issue and can do something about it. &#160;Stay tuned for updates.</p><div class="socialbutttons"><div class="fbiframediv sharebuttton"><iframe src="http://www.facebook.com/plugins/like.php?app_id=194259500619894&amp;href=http://blogs.sakienvirotech.com/index.php?p=800&amp;send=false&amp;width=450&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=85" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:85px;" allowTransparency="true"></iframe></div><div class="twbutton sharebuttton"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blogs.sakienvirotech.com/index.php?p=800" data-count="horizontal">Tweet</a></div><div class="gplusdiv sharebuttton"><g:plusone href="http://blogs.sakienvirotech.com/index.php?p=800"></g:plusone></div></div><div class="item_footer"><p><small><a href="http://blogs.sakienvirotech.com/index.php/random/2012/10/24/telstra-bigpond-accounting-failure">Original post</a> blogged on <a href="http://blogs.sakienvirotech.com/random">Saki Envirotech Blogs</a>.</small></p></div>]]></content:encoded>
								<comments>http://blogs.sakienvirotech.com/index.php/random/2012/10/24/telstra-bigpond-accounting-failure#comments</comments>
			<wfw:commentRss>http://blogs.sakienvirotech.com/index.php/random/?tempskin=_rss2&#38;disp=comments&#38;p=800</wfw:commentRss>
		</item>
				<item>
			<title>Open letter to Yahoo! account holders</title>
			<link>http://blogs.sakienvirotech.com/index.php/random/2012/02/13/open-letter-to-yahoo-account</link>
			<pubDate>Mon, 13 Feb 2012 00:07:00 +0000</pubDate>			<dc:creator>ajdonnison</dc:creator>
			<category domain="alt">The chattering classes</category>
<category domain="main">Open Source, Open World</category>			<guid isPermaLink="false">784@http://blogs.sakienvirotech.com/</guid>
						<description>&lt;p&gt;&lt;strong&gt;Yahoo! account holders are being witheld information that they signed up to receive. &lt;/strong&gt;This is not the fault of the services they signed up with, but rather the arcane and obscure mechanisms by which Yahoo! supposedly identifies spam sources. If you are a Yahoo! account holder, and you suspect that you are not getting email you should, chances are you are correct. Notify Yahoo! that their mechanisms for problem resolution simply do not work and you are going to vote with your fingers and move to another email provider.&lt;/p&gt;
&lt;p&gt;The detail behind this is that I have two virtual servers that are with a VPS provider, on two completely different subnets and from the time they were commissioned, no email has been accepted by Yahoo! for its account holders with an error message that appears to be for persistent spamming.&amp;#160; This is clearly an error, one that I have tried for weeks now to resolve with Yahoo! without success.&amp;#160; They will not admit that their detection of spamming cannot be for mail they have yet to receive, but instead most likely for a previous owner of the IP addresses in question. They will not provide any clear information even as to the reason that we are - in their quaint and completely incorrect terminology - &quot;deprioritized&quot;.&lt;/p&gt;
&lt;p&gt;I don&#039;t really want prioiritised mail services, any level of mail service would be fine with me, and I suspect with those users who in good faith have signed up with one of the services we host.&amp;#160; &quot;Deprioritized&quot; suggests that there is a chance the mail will get through, just not in a timely fashion. What we have is in fact a complete embargo on mail from our servers.&lt;/p&gt;
&lt;p&gt;It doesn&#039;t matter how you wrap it up or what policies you quote ad-infinitum, Yahoo!&amp;#160; If your system starts blocking mail &lt;strong&gt;on the first attempt&lt;/strong&gt; then there is something wrong with your system, not mine.&amp;#160; If it is for prior usage of the IP address, then provide me with the methods of showing that the IP address changed hands so you can reset your system. Don&#039;t lie to me and tell me that it is temporary and will resolve itself once I get my systems in line with your policies.&amp;#160; It is not temporary, it is a complete block.&amp;#160; My systems are in line with your policies and have been for quite some time.&amp;#160; You will not answer any of my questions with anything other than a pointer or extract from your policy documents - so I have no idea (and I suspect neither do you) of why I am listed at all, let alone how to resolve it.&lt;/p&gt;
&lt;p&gt;So if you are a Yahoo! account holder, stop this nonsense by switching provider. I can&#039;t be the only service provider that is affected this way, so even if you are not on one of the services we host, I can assure you there is a good probability you are affected.&lt;/p&gt;
&lt;p&gt;If you are Yahoo!, stop this nonsense by acknowledging your system is flawed and fixing it.&lt;/p&gt;&lt;div class=&quot;socialbutttons&quot;&gt;&lt;div class=&quot;fbiframediv sharebuttton&quot;&gt;&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?app_id=194259500619894&amp;amp;href=http://blogs.sakienvirotech.com/index.php?p=784&amp;amp;send=false&amp;amp;width=450&amp;amp;show_faces=false&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;font=arial&amp;amp;height=85&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:450px; height:85px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div class=&quot;twbutton sharebuttton&quot;&gt;&lt;a href=&quot;http://twitter.com/share&quot; class=&quot;twitter-share-button&quot; data-url=&quot;http://blogs.sakienvirotech.com/index.php?p=784&quot; data-count=&quot;horizontal&quot;&gt;Tweet&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;gplusdiv sharebuttton&quot;&gt;&lt;g:plusone href=&quot;http://blogs.sakienvirotech.com/index.php?p=784&quot;&gt;&lt;/g:plusone&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blogs.sakienvirotech.com/index.php/random/2012/02/13/open-letter-to-yahoo-account&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://blogs.sakienvirotech.com/random&quot;&gt;Saki Envirotech Blogs&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p><strong>Yahoo! account holders are being witheld information that they signed up to receive. </strong>This is not the fault of the services they signed up with, but rather the arcane and obscure mechanisms by which Yahoo! supposedly identifies spam sources. If you are a Yahoo! account holder, and you suspect that you are not getting email you should, chances are you are correct. Notify Yahoo! that their mechanisms for problem resolution simply do not work and you are going to vote with your fingers and move to another email provider.</p>
<p>The detail behind this is that I have two virtual servers that are with a VPS provider, on two completely different subnets and from the time they were commissioned, no email has been accepted by Yahoo! for its account holders with an error message that appears to be for persistent spamming.&#160; This is clearly an error, one that I have tried for weeks now to resolve with Yahoo! without success.&#160; They will not admit that their detection of spamming cannot be for mail they have yet to receive, but instead most likely for a previous owner of the IP addresses in question. They will not provide any clear information even as to the reason that we are - in their quaint and completely incorrect terminology - "deprioritized".</p>
<p>I don't really want prioiritised mail services, any level of mail service would be fine with me, and I suspect with those users who in good faith have signed up with one of the services we host.&#160; "Deprioritized" suggests that there is a chance the mail will get through, just not in a timely fashion. What we have is in fact a complete embargo on mail from our servers.</p>
<p>It doesn't matter how you wrap it up or what policies you quote ad-infinitum, Yahoo!&#160; If your system starts blocking mail <strong>on the first attempt</strong> then there is something wrong with your system, not mine.&#160; If it is for prior usage of the IP address, then provide me with the methods of showing that the IP address changed hands so you can reset your system. Don't lie to me and tell me that it is temporary and will resolve itself once I get my systems in line with your policies.&#160; It is not temporary, it is a complete block.&#160; My systems are in line with your policies and have been for quite some time.&#160; You will not answer any of my questions with anything other than a pointer or extract from your policy documents - so I have no idea (and I suspect neither do you) of why I am listed at all, let alone how to resolve it.</p>
<p>So if you are a Yahoo! account holder, stop this nonsense by switching provider. I can't be the only service provider that is affected this way, so even if you are not on one of the services we host, I can assure you there is a good probability you are affected.</p>
<p>If you are Yahoo!, stop this nonsense by acknowledging your system is flawed and fixing it.</p><div class="socialbutttons"><div class="fbiframediv sharebuttton"><iframe src="http://www.facebook.com/plugins/like.php?app_id=194259500619894&amp;href=http://blogs.sakienvirotech.com/index.php?p=784&amp;send=false&amp;width=450&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=85" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:85px;" allowTransparency="true"></iframe></div><div class="twbutton sharebuttton"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blogs.sakienvirotech.com/index.php?p=784" data-count="horizontal">Tweet</a></div><div class="gplusdiv sharebuttton"><g:plusone href="http://blogs.sakienvirotech.com/index.php?p=784"></g:plusone></div></div><div class="item_footer"><p><small><a href="http://blogs.sakienvirotech.com/index.php/random/2012/02/13/open-letter-to-yahoo-account">Original post</a> blogged on <a href="http://blogs.sakienvirotech.com/random">Saki Envirotech Blogs</a>.</small></p></div>]]></content:encoded>
								<comments>http://blogs.sakienvirotech.com/index.php/random/2012/02/13/open-letter-to-yahoo-account#comments</comments>
			<wfw:commentRss>http://blogs.sakienvirotech.com/index.php/random/?tempskin=_rss2&#38;disp=comments&#38;p=784</wfw:commentRss>
		</item>
				<item>
			<title>Adding dynamic fields to Signups on Drupal</title>
			<link>http://blogs.sakienvirotech.com/index.php/random/2012/02/08/adding-dynamic-fields-to-signups</link>
			<pubDate>Wed, 08 Feb 2012 04:05:00 +0000</pubDate>			<dc:creator>ajdonnison</dc:creator>
			<category domain="alt">Open Source, Open World</category>
<category domain="main">Drupal</category>			<guid isPermaLink="false">783@http://blogs.sakienvirotech.com/</guid>
						<description>&lt;p&gt;In my day job at &lt;a href=&quot;http://www.skysql.com/&quot;&gt;SkySQL&lt;/a&gt; I work with &lt;a href=&quot;http://drupal.org/&quot;&gt;Drupal&lt;/a&gt; as our content management system.&amp;#160; One thing we often need to do is provide a way for people to sign up for events and the like.&amp;#160; One such event is the upcoming &lt;a href=&quot;http://www.skysql.com/events/mysql-solutions-day&quot;&gt;SkySQL and MariaDB: Solutions Day for the MySQL&amp;#174; Database&lt;/a&gt; and unlike other events we needed to take into account the dietary requirements of those wishing to attend.&lt;/p&gt;
&lt;p&gt;For events registration we use the &lt;a href=&quot;http://drupal.org/project/signup&quot;&gt;Signup module&lt;/a&gt; and use a theme template function to provide a set of standard fields.&amp;#160; The code looks something like this:&lt;/p&gt;
&lt;pre&gt;function ourtheme_signup_user_form($node) {&lt;br /&gt;  $form = array();&lt;br /&gt;  // If this function is providing any extra fields at all, the following&lt;br /&gt;  // line is required for form form to work -- DO NOT EDIT OR REMOVE.&lt;br /&gt;  $form[&#039;signup_form_data&#039;][&#039;#tree&#039;] = TRUE;&lt;br /&gt;&lt;br /&gt;  $form[&#039;signup_form_data&#039;][&#039;FirstName&#039;] = array(&lt;br /&gt;    &#039;#type&#039; =&amp;gt; &#039;textfield&#039;,&lt;br /&gt;    &#039;#title&#039; =&amp;gt; t(&#039;First Name&#039;),&lt;br /&gt;    &#039;#size&#039; =&amp;gt; 40, &#039;#maxlength&#039; =&amp;gt; 64,&lt;br /&gt;    &#039;#required&#039; =&amp;gt; TRUE,&lt;br /&gt;  );&lt;br /&gt;  $form[&#039;signup_form_data&#039;][&#039;LastName&#039;] = array(&lt;br /&gt;    &#039;#type&#039; =&amp;gt; &#039;textfield&#039;,&lt;br /&gt;    &#039;#title&#039; =&amp;gt; t(&#039;Last Name&#039;),&lt;br /&gt;    &#039;#size&#039; =&amp;gt; 40, &#039;#maxlength&#039; =&amp;gt; 64,&lt;br /&gt;    &#039;#required&#039; =&amp;gt; TRUE,&lt;br /&gt;  );&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;And so on, building up the elements and then returning the form.&amp;#160; This is great because it allows us to have a standard set of fields for all signup pages, making life a lot simpler when creating content that requires registration.&amp;#160; But the Solutions Day event required an extra field.&amp;#160; I could have done this a number of ways, including putting logic in the template file to check for that particular node and only display the field then, or perhaps some other hack specific to this node.&amp;#160; I, however, don&#039;t like specifics and tend to look for a generic solution, as the exception invariably becomes the rule.&lt;/p&gt;
&lt;p&gt;For this exercise I wanted to be able to have a way of specifying for a particular node any extra fields that are available for this form.&amp;#160; So I now have in the template.php file the following code:&lt;/p&gt;
&lt;pre&gt;// If there is a special field required for this, check and display&lt;br /&gt;  if (!empty($node-&amp;gt;field_signup_extra) &amp;amp;&amp;amp; !empty($node-&amp;gt;field_signup_extra[0][&#039;value&#039;])) {&lt;br /&gt;    $extras = explode(&quot;\n&quot;, $node-&amp;gt;field_signup_extra[0][&#039;value&#039;]);&lt;br /&gt;    foreach ($extras as $field_def) {&lt;br /&gt;        $field_def = trim($field_def);&lt;br /&gt;        if (empty($field_def)) {&lt;br /&gt;            continue;&lt;br /&gt;        }&lt;br /&gt;        $elems = explode(&#039;|&#039;, $field_def);&lt;br /&gt;        $field_name = array_unshift($elems);&lt;br /&gt;&lt;br /&gt;        $form[&#039;signup_form_data&#039;][$field_name] = array();&lt;br /&gt;        foreach ($elems as $field_element) {&lt;br /&gt;          list($key, $val) = explode(&#039;=&#039;,$field_element);&lt;br /&gt;          if ($key == &#039;options&#039;) {&lt;br /&gt;              $val = explode(&#039;,&#039;, $val);&lt;br /&gt;          }&lt;br /&gt;          $form[&#039;signup_form_data&#039;][$field_name][&#039;#&#039; . $key] = $val;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Now all I need to do is create a field that is non-displayable but contains information to build extra fields.&amp;#160; For example the content that describes the Dietary Requirements field is:&lt;/p&gt;
&lt;pre&gt;dietary_requirements|title=Dietary Requirements|size=40|type=textfield&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;The production version does a little more analysis of the input to ensure there are no possible attack vectors, but I&#039;ve left that out for clarity sake.&lt;/p&gt;
&lt;p&gt;Now, if I have an event (or other content type) that needs extra signup fields, I ensure that the content type has the new Signup Extras field and fill it on the new content with a simple field definition that Signup can use.&lt;/p&gt;&lt;div class=&quot;socialbutttons&quot;&gt;&lt;div class=&quot;fbiframediv sharebuttton&quot;&gt;&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?app_id=194259500619894&amp;amp;href=http://blogs.sakienvirotech.com/index.php?p=783&amp;amp;send=false&amp;amp;width=450&amp;amp;show_faces=false&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;font=arial&amp;amp;height=85&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:450px; height:85px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div class=&quot;twbutton sharebuttton&quot;&gt;&lt;a href=&quot;http://twitter.com/share&quot; class=&quot;twitter-share-button&quot; data-url=&quot;http://blogs.sakienvirotech.com/index.php?p=783&quot; data-count=&quot;horizontal&quot;&gt;Tweet&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;gplusdiv sharebuttton&quot;&gt;&lt;g:plusone href=&quot;http://blogs.sakienvirotech.com/index.php?p=783&quot;&gt;&lt;/g:plusone&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blogs.sakienvirotech.com/index.php/random/2012/02/08/adding-dynamic-fields-to-signups&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://blogs.sakienvirotech.com/random&quot;&gt;Saki Envirotech Blogs&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>In my day job at <a href="http://www.skysql.com/">SkySQL</a> I work with <a href="http://drupal.org/">Drupal</a> as our content management system.&#160; One thing we often need to do is provide a way for people to sign up for events and the like.&#160; One such event is the upcoming <a href="http://www.skysql.com/events/mysql-solutions-day">SkySQL and MariaDB: Solutions Day for the MySQL&#174; Database</a> and unlike other events we needed to take into account the dietary requirements of those wishing to attend.</p>
<p>For events registration we use the <a href="http://drupal.org/project/signup">Signup module</a> and use a theme template function to provide a set of standard fields.&#160; The code looks something like this:</p>
<pre>function ourtheme_signup_user_form($node) {<br />  $form = array();<br />  // If this function is providing any extra fields at all, the following<br />  // line is required for form form to work -- DO NOT EDIT OR REMOVE.<br />  $form['signup_form_data']['#tree'] = TRUE;<br /><br />  $form['signup_form_data']['FirstName'] = array(<br />    '#type' =&gt; 'textfield',<br />    '#title' =&gt; t('First Name'),<br />    '#size' =&gt; 40, '#maxlength' =&gt; 64,<br />    '#required' =&gt; TRUE,<br />  );<br />  $form['signup_form_data']['LastName'] = array(<br />    '#type' =&gt; 'textfield',<br />    '#title' =&gt; t('Last Name'),<br />    '#size' =&gt; 40, '#maxlength' =&gt; 64,<br />    '#required' =&gt; TRUE,<br />  );<br /></pre>
<p>And so on, building up the elements and then returning the form.&#160; This is great because it allows us to have a standard set of fields for all signup pages, making life a lot simpler when creating content that requires registration.&#160; But the Solutions Day event required an extra field.&#160; I could have done this a number of ways, including putting logic in the template file to check for that particular node and only display the field then, or perhaps some other hack specific to this node.&#160; I, however, don't like specifics and tend to look for a generic solution, as the exception invariably becomes the rule.</p>
<p>For this exercise I wanted to be able to have a way of specifying for a particular node any extra fields that are available for this form.&#160; So I now have in the template.php file the following code:</p>
<pre>// If there is a special field required for this, check and display<br />  if (!empty($node-&gt;field_signup_extra) &amp;&amp; !empty($node-&gt;field_signup_extra[0]['value'])) {<br />    $extras = explode("\n", $node-&gt;field_signup_extra[0]['value']);<br />    foreach ($extras as $field_def) {<br />        $field_def = trim($field_def);<br />        if (empty($field_def)) {<br />            continue;<br />        }<br />        $elems = explode('|', $field_def);<br />        $field_name = array_unshift($elems);<br /><br />        $form['signup_form_data'][$field_name] = array();<br />        foreach ($elems as $field_element) {<br />          list($key, $val) = explode('=',$field_element);<br />          if ($key == 'options') {<br />              $val = explode(',', $val);<br />          }<br />          $form['signup_form_data'][$field_name]['#' . $key] = $val;<br />        }<br />    }<br />  }<br /></pre>
<p>Now all I need to do is create a field that is non-displayable but contains information to build extra fields.&#160; For example the content that describes the Dietary Requirements field is:</p>
<pre>dietary_requirements|title=Dietary Requirements|size=40|type=textfield<br /></pre>
<p>The production version does a little more analysis of the input to ensure there are no possible attack vectors, but I've left that out for clarity sake.</p>
<p>Now, if I have an event (or other content type) that needs extra signup fields, I ensure that the content type has the new Signup Extras field and fill it on the new content with a simple field definition that Signup can use.</p><div class="socialbutttons"><div class="fbiframediv sharebuttton"><iframe src="http://www.facebook.com/plugins/like.php?app_id=194259500619894&amp;href=http://blogs.sakienvirotech.com/index.php?p=783&amp;send=false&amp;width=450&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=85" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:85px;" allowTransparency="true"></iframe></div><div class="twbutton sharebuttton"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blogs.sakienvirotech.com/index.php?p=783" data-count="horizontal">Tweet</a></div><div class="gplusdiv sharebuttton"><g:plusone href="http://blogs.sakienvirotech.com/index.php?p=783"></g:plusone></div></div><div class="item_footer"><p><small><a href="http://blogs.sakienvirotech.com/index.php/random/2012/02/08/adding-dynamic-fields-to-signups">Original post</a> blogged on <a href="http://blogs.sakienvirotech.com/random">Saki Envirotech Blogs</a>.</small></p></div>]]></content:encoded>
								<comments>http://blogs.sakienvirotech.com/index.php/random/2012/02/08/adding-dynamic-fields-to-signups#comments</comments>
			<wfw:commentRss>http://blogs.sakienvirotech.com/index.php/random/?tempskin=_rss2&#38;disp=comments&#38;p=783</wfw:commentRss>
		</item>
				<item>
			<title>Yahoo and the great SPAM ripoff</title>
			<link>http://blogs.sakienvirotech.com/index.php/random/2012/01/27/yahoo-and-the-great-spam</link>
			<pubDate>Fri, 27 Jan 2012 02:05:00 +0000</pubDate>			<dc:creator>ajdonnison</dc:creator>
			<category domain="main">Open Source, Open World</category>			<guid isPermaLink="false">781@http://blogs.sakienvirotech.com/</guid>
						<description>&lt;p&gt;In my private life I run a mail server, have done so for almost 20 years.&amp;#160; Recently (as in the last 12 months) we moved to a VPS because I no longer had (or wanted) the infrastructure to run a server in-house.&amp;#160; Since then I&#039;ve been fighting a losing battle to get legitimate email to users on Yahoo particularly and some other ISPs.&amp;#160; Why? Well Yahoo won&#039;t tell me. Apparently they don&#039;t really want to fix the SPAM issue, they just want me to go away.&amp;#160; I have yet to get one piece of information that I could actually use to figure out why I&#039;m being blocked.&amp;#160; Yet the biggest spammers I see hitting my SPAM mailbox are from Yahoo.&amp;#160; So while they don&#039;t mind their own users sending SPAM (and OK, some of it is just masquerading as coming from Yahoo, but still...) they will block legitimate mail to their users with apparently no real recourse apart from telling you to check everything you&#039;ve already checked and fix the problems.&lt;/p&gt;
&lt;p&gt;Here&#039;s a hint Yahoo.&amp;#160; If you don&#039;t tell me what the problems are, I can&#039;t fix them.&amp;#160; A basic tenet of support. If you keep me in the dark then I will have to start banning users with yahoo.com* addresses as it is just too hard to deal with you.&amp;#160; I&#039;ll have to tell them all to get a real mail account, like Gmail, so they don&#039;t have to bitch about not getting important emails. Perhaps this is why you are losing users?&lt;/p&gt;
&lt;p&gt;While I was researching the possible reasons for by blocking I found that there are some really dodgy practices going on out there.&amp;#160; I checked my Reputation Score with a number of sources, and found that it was pretty good, except for one, Cisco&#039;s SenderBase.&amp;#160; And I can&#039;t send email to them about the problem from the problematic domain. Mind you one had information on email that went back 4 years and showed no recent activity - and I didn&#039;t own that IP address 4 years ago.&amp;#160;&amp;#160; There is one, Barracuda, that suggests you sign up at EmailReg.org for $20 per year to bypass their reputation filter - um, that is uncomfortably close to blackmail for my liking.&amp;#160; Then there is the abuse.net system.&amp;#160; It appears that many reputation scores will reduce your reputation if you haven&#039;t taken the trouble to register a contact address for your domains at abuse.net.&amp;#160; WTF? The internet standard is that there is always a postmaster@ address that must go to a real person.&amp;#160; In recent times it has also become common practice to have an abuse@ address.&amp;#160; Since when does it become mandatory to register this somewhere?&amp;#160; How does that in any way contribute to the removal of SPAM?&lt;/p&gt;
&lt;p&gt;Abuse.net also has some quirks.&amp;#160; With the rise of SPAM many people who set up a new domain take the precaution of using a hidden registration option offered by many domain registrars, to avoid having your contact details harvestable by spammers.&amp;#160; And guess what, you can&#039;t register these at abuse.net because they believe that you are likely to be a spammer if you want anonymity. Catch 22.&lt;/p&gt;
&lt;p&gt;So the upshot appears to be don&#039;t send email - use a &lt;a href=&quot;http://tools.ietf.org/html/rfc1149&quot;&gt;carrier pigeon&lt;/a&gt; instead.&lt;/p&gt;&lt;div class=&quot;socialbutttons&quot;&gt;&lt;div class=&quot;fbiframediv sharebuttton&quot;&gt;&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?app_id=194259500619894&amp;amp;href=http://blogs.sakienvirotech.com/index.php?p=781&amp;amp;send=false&amp;amp;width=450&amp;amp;show_faces=false&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;font=arial&amp;amp;height=85&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:450px; height:85px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div class=&quot;twbutton sharebuttton&quot;&gt;&lt;a href=&quot;http://twitter.com/share&quot; class=&quot;twitter-share-button&quot; data-url=&quot;http://blogs.sakienvirotech.com/index.php?p=781&quot; data-count=&quot;horizontal&quot;&gt;Tweet&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;gplusdiv sharebuttton&quot;&gt;&lt;g:plusone href=&quot;http://blogs.sakienvirotech.com/index.php?p=781&quot;&gt;&lt;/g:plusone&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blogs.sakienvirotech.com/index.php/random/2012/01/27/yahoo-and-the-great-spam&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://blogs.sakienvirotech.com/random&quot;&gt;Saki Envirotech Blogs&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>In my private life I run a mail server, have done so for almost 20 years.&#160; Recently (as in the last 12 months) we moved to a VPS because I no longer had (or wanted) the infrastructure to run a server in-house.&#160; Since then I've been fighting a losing battle to get legitimate email to users on Yahoo particularly and some other ISPs.&#160; Why? Well Yahoo won't tell me. Apparently they don't really want to fix the SPAM issue, they just want me to go away.&#160; I have yet to get one piece of information that I could actually use to figure out why I'm being blocked.&#160; Yet the biggest spammers I see hitting my SPAM mailbox are from Yahoo.&#160; So while they don't mind their own users sending SPAM (and OK, some of it is just masquerading as coming from Yahoo, but still...) they will block legitimate mail to their users with apparently no real recourse apart from telling you to check everything you've already checked and fix the problems.</p>
<p>Here's a hint Yahoo.&#160; If you don't tell me what the problems are, I can't fix them.&#160; A basic tenet of support. If you keep me in the dark then I will have to start banning users with yahoo.com* addresses as it is just too hard to deal with you.&#160; I'll have to tell them all to get a real mail account, like Gmail, so they don't have to bitch about not getting important emails. Perhaps this is why you are losing users?</p>
<p>While I was researching the possible reasons for by blocking I found that there are some really dodgy practices going on out there.&#160; I checked my Reputation Score with a number of sources, and found that it was pretty good, except for one, Cisco's SenderBase.&#160; And I can't send email to them about the problem from the problematic domain. Mind you one had information on email that went back 4 years and showed no recent activity - and I didn't own that IP address 4 years ago.&#160;&#160; There is one, Barracuda, that suggests you sign up at EmailReg.org for $20 per year to bypass their reputation filter - um, that is uncomfortably close to blackmail for my liking.&#160; Then there is the abuse.net system.&#160; It appears that many reputation scores will reduce your reputation if you haven't taken the trouble to register a contact address for your domains at abuse.net.&#160; WTF? The internet standard is that there is always a postmaster@ address that must go to a real person.&#160; In recent times it has also become common practice to have an abuse@ address.&#160; Since when does it become mandatory to register this somewhere?&#160; How does that in any way contribute to the removal of SPAM?</p>
<p>Abuse.net also has some quirks.&#160; With the rise of SPAM many people who set up a new domain take the precaution of using a hidden registration option offered by many domain registrars, to avoid having your contact details harvestable by spammers.&#160; And guess what, you can't register these at abuse.net because they believe that you are likely to be a spammer if you want anonymity. Catch 22.</p>
<p>So the upshot appears to be don't send email - use a <a href="http://tools.ietf.org/html/rfc1149">carrier pigeon</a> instead.</p><div class="socialbutttons"><div class="fbiframediv sharebuttton"><iframe src="http://www.facebook.com/plugins/like.php?app_id=194259500619894&amp;href=http://blogs.sakienvirotech.com/index.php?p=781&amp;send=false&amp;width=450&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=85" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:85px;" allowTransparency="true"></iframe></div><div class="twbutton sharebuttton"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blogs.sakienvirotech.com/index.php?p=781" data-count="horizontal">Tweet</a></div><div class="gplusdiv sharebuttton"><g:plusone href="http://blogs.sakienvirotech.com/index.php?p=781"></g:plusone></div></div><div class="item_footer"><p><small><a href="http://blogs.sakienvirotech.com/index.php/random/2012/01/27/yahoo-and-the-great-spam">Original post</a> blogged on <a href="http://blogs.sakienvirotech.com/random">Saki Envirotech Blogs</a>.</small></p></div>]]></content:encoded>
								<comments>http://blogs.sakienvirotech.com/index.php/random/2012/01/27/yahoo-and-the-great-spam#comments</comments>
			<wfw:commentRss>http://blogs.sakienvirotech.com/index.php/random/?tempskin=_rss2&#38;disp=comments&#38;p=781</wfw:commentRss>
		</item>
				<item>
			<title>See you at LCA2012</title>
			<link>http://blogs.sakienvirotech.com/index.php/random/2012/01/12/see-you-at-lca2012</link>
			<pubDate>Thu, 12 Jan 2012 06:21:00 +0000</pubDate>			<dc:creator>ajdonnison</dc:creator>
			<category domain="main">Open Source, Open World</category>
<category domain="alt">MySQL</category>			<guid isPermaLink="false">779@http://blogs.sakienvirotech.com/</guid>
						<description>&lt;p&gt;&lt;a href=&quot;http://lcaunderthestars.org.au/&quot;&gt;Linux.conf.au &lt;/a&gt;this year kicks off next week in &lt;a href=&quot;http://en.wikipedia.org/wiki/Ballarat&quot;&gt;Ballarat&lt;/a&gt;, just down the road from me.&amp;#160; I&#039;ll be there and even have a &lt;a href=&quot;http://linux.conf.au/wiki/index.php/Miniconfs/HighAvailabilityAndDistributedStorage#MySQL_for_the_Developer_in_a_Post-Oracle_World&quot;&gt;speaking gig&lt;/a&gt;, not in the main conference but in the HA and Distributed Storage mini-conf before the main event.&lt;/p&gt;
&lt;p&gt;I&#039;ll be talking about MySQL&amp;#174;, the companies that now exist to support it, and the third party products that are starting to proliferate in what appears to be a community effort to address perceived shortcomings in the Oracle offerings.&amp;#160; Many of these offerings are in the HA space, and there have been some pretty amazing developments recently.&lt;/p&gt;
&lt;p&gt;So if you want to find some history of Oracle&#039;s effect on MySQL&#039;s development (and a hint, it started well before the Sun acquisition), or you want to find out what is out there to assist you in developing HA and Distributed database systems, come along.&amp;#160; I&#039;ll be wearing my &lt;a href=&quot;http://www.skysql.com/&quot;&gt;SkySQL&lt;/a&gt; shirt so I should be easy to pick.&lt;/p&gt;&lt;div class=&quot;socialbutttons&quot;&gt;&lt;div class=&quot;fbiframediv sharebuttton&quot;&gt;&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?app_id=194259500619894&amp;amp;href=http://blogs.sakienvirotech.com/index.php?p=779&amp;amp;send=false&amp;amp;width=450&amp;amp;show_faces=false&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;font=arial&amp;amp;height=85&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:450px; height:85px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div class=&quot;twbutton sharebuttton&quot;&gt;&lt;a href=&quot;http://twitter.com/share&quot; class=&quot;twitter-share-button&quot; data-url=&quot;http://blogs.sakienvirotech.com/index.php?p=779&quot; data-count=&quot;horizontal&quot;&gt;Tweet&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;gplusdiv sharebuttton&quot;&gt;&lt;g:plusone href=&quot;http://blogs.sakienvirotech.com/index.php?p=779&quot;&gt;&lt;/g:plusone&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blogs.sakienvirotech.com/index.php/random/2012/01/12/see-you-at-lca2012&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://blogs.sakienvirotech.com/random&quot;&gt;Saki Envirotech Blogs&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p><a href="http://lcaunderthestars.org.au/">Linux.conf.au </a>this year kicks off next week in <a href="http://en.wikipedia.org/wiki/Ballarat">Ballarat</a>, just down the road from me.&#160; I'll be there and even have a <a href="http://linux.conf.au/wiki/index.php/Miniconfs/HighAvailabilityAndDistributedStorage#MySQL_for_the_Developer_in_a_Post-Oracle_World">speaking gig</a>, not in the main conference but in the HA and Distributed Storage mini-conf before the main event.</p>
<p>I'll be talking about MySQL&#174;, the companies that now exist to support it, and the third party products that are starting to proliferate in what appears to be a community effort to address perceived shortcomings in the Oracle offerings.&#160; Many of these offerings are in the HA space, and there have been some pretty amazing developments recently.</p>
<p>So if you want to find some history of Oracle's effect on MySQL's development (and a hint, it started well before the Sun acquisition), or you want to find out what is out there to assist you in developing HA and Distributed database systems, come along.&#160; I'll be wearing my <a href="http://www.skysql.com/">SkySQL</a> shirt so I should be easy to pick.</p><div class="socialbutttons"><div class="fbiframediv sharebuttton"><iframe src="http://www.facebook.com/plugins/like.php?app_id=194259500619894&amp;href=http://blogs.sakienvirotech.com/index.php?p=779&amp;send=false&amp;width=450&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=85" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:85px;" allowTransparency="true"></iframe></div><div class="twbutton sharebuttton"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blogs.sakienvirotech.com/index.php?p=779" data-count="horizontal">Tweet</a></div><div class="gplusdiv sharebuttton"><g:plusone href="http://blogs.sakienvirotech.com/index.php?p=779"></g:plusone></div></div><div class="item_footer"><p><small><a href="http://blogs.sakienvirotech.com/index.php/random/2012/01/12/see-you-at-lca2012">Original post</a> blogged on <a href="http://blogs.sakienvirotech.com/random">Saki Envirotech Blogs</a>.</small></p></div>]]></content:encoded>
								<comments>http://blogs.sakienvirotech.com/index.php/random/2012/01/12/see-you-at-lca2012#comments</comments>
			<wfw:commentRss>http://blogs.sakienvirotech.com/index.php/random/?tempskin=_rss2&#38;disp=comments&#38;p=779</wfw:commentRss>
		</item>
				<item>
			<title>MySQL 101 - Replication</title>
			<link>http://blogs.sakienvirotech.com/index.php/random/2011/11/01/mysql-101-replication</link>
			<pubDate>Tue, 01 Nov 2011 03:37:00 +0000</pubDate>			<dc:creator>ajdonnison</dc:creator>
			<category domain="alt">Open Source, Open World</category>
<category domain="alt">MySQL</category>
<category domain="main">MySQL 101</category>			<guid isPermaLink="false">772@http://blogs.sakienvirotech.com/</guid>
						<description>&lt;p&gt;So far we&#039;ve looked at many aspects of MySQL, not in any great depth, but hopefully with enough information to get you started and whet your appetite for more.&amp;#160; Now we start to look into areas that aren&#039;t in the basic tutorials.&lt;/p&gt;
&lt;p&gt;Replication is the technology that allows data to be stored on multiple servers. Typically this is used in &quot;scale out&quot; applications.&amp;#160; &quot;Scale out&quot; is used in contrast to &quot;Scale up&quot; where to scale a solution you buy a bigger box to run it on, where &quot;scale out&quot; means you buy more boxes.&amp;#160; Each has its benefits and drawbacks, with the usual benefit of scale out being that you get more bang for your buck.&lt;/p&gt;
&lt;p&gt;The way replication works in MySQL is pretty simple.&amp;#160; One server is identified as the master, and writes every transaction to a file, the binary log.&amp;#160; Other servers (and there may be many) act as slaves and request information from the master. The slave keeps track of where it got up to and asks the master for the next transaction in the file.&amp;#160; In general the master doesn&#039;t know or care where the slave is up to, it just sends out the requested transaction to whoever has the right credentials to ask for it.&lt;/p&gt;
&lt;p&gt;On the slave there are two threads running, one that requests events from the master binlog (binary log) and writes them to the relay log (which in reality is just another binlog), and the second thread that reads the relay log and executes the queries. In order to avoid non-deterministic outcomes the SQL thread is just that, a single thread.&amp;#160; Long running events can result in the replication lagging well behind the state of the master.&lt;/p&gt;
&lt;p&gt;This is the traditional asynchronous replication.&amp;#160; Newer versions of MySQL now support semi-synchronous replication as well.&amp;#160; In this mode the master will not return control back to the querying process until at least one slave reports that it has received the transaction events and written them to its own relay log.&amp;#160; Note that this is written to the relay log but not necessarily written to the database.&lt;/p&gt;
&lt;p&gt;You may wonder under what circumstance replication would be of use.&amp;#160; If your application is mainly read-intensive (as many web applications are) then replication gives you the ability to spread reads across multiple slaves to reduce contention.&amp;#160; If your application is mainly write intensive, then replication to multiple slaves will not, of itself, give you any relief.&amp;#160; Indeed, because the replication is single-threaded and all writes on the master must be written to the slaves, you can in fact hurt performance with a replicated setup.&lt;/p&gt;
&lt;p&gt;What about more than one master?&amp;#160; This is possible but requires careful thought and planning.&amp;#160; MySQL replication keeps track of which server initiated the transaction, so &quot;circular replication&quot; where a slave acts also as a master should not cause problems, however there are some serious issues to consider.&amp;#160; Take for instance a customer table with the customer ID being auto incremented.&amp;#160; What happens if there are writes to both masters in a master&amp;lt;-&amp;gt;master replication setup?&amp;#160; Both will grab the next ID in sequence, then the other will pull that transaction and try and will end up with a duplicate index error, causing replication to fail.&amp;#160; You can get around this by setting the initial auto_increment value on each server and setting the auto_increment_increment value to the number of masters in use.&amp;#160; Remebering however that both masters now have to write all traffic that goes to the pair, there is not a great deal of benefit in such an arrangement.&amp;#160; Other technologies, such as sharding, turn out to offer better scale out opportunities for multi-master deployments.&lt;/p&gt;
&lt;p&gt;There are, however, some tools to make multi-master work more easily.&amp;#160; &lt;a href=&quot;http://mysql-mmm.org/&quot;&gt;MMM (Multi-Master Replication Manager for MySQL) &lt;/a&gt;is one.&amp;#160; &lt;a href=&quot;http://code.google.com/p/mysql-master-ha/&quot;&gt;MHA (Master High Availability for MySQL)&lt;/a&gt; is somewhat different, allowing easy management of master failover.&lt;/p&gt;
&lt;p&gt;That is probably enough theory, lets look at how to build a replication system.&lt;/p&gt;
&lt;p&gt;For the master, the only requirement is that it writes its transactions to a binary log, and that it has a server ID set.&amp;#160; To do this we need to add the following to the my.cnf file:&lt;/p&gt;
&lt;pre&gt;server-id = 1&lt;br /&gt;log_bin = /var/log/mysql/mysql-bin.log&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;The server-id is an integer that must be unique for all servers in the same replication set.&amp;#160; This is because of the tracking of transactions to avoid circular replication errors.&amp;#160; The log_bin is the path to the binary log file to use.&amp;#160; Each file will be appended with a sequence number to allow the server to rotate log files when they grow too large, or a flush request is received.&lt;/p&gt;
&lt;p&gt;One other value that is useful is to set an expiry on the binlogs so that they don&#039;t take over all of your disk.&amp;#160; You need to ensure that you have enough binlog capacity for normal replication lag and for handling backup/recovery, but beyond that you can get MySQL to automatically delete the older binlogs.&lt;/p&gt;
&lt;pre&gt;expire_log_days = 14&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Now the master will at least be writing transactions to the binary logs.&amp;#160; Now we have to set up to allow slaves to replicate.&amp;#160; First step is to create a user that the slaves will connect with.&amp;#160; This user must have REPLICATION SLAVE permissions to be able to read the binlog.&amp;#160; Note that this user is created on the master. As a privileged user, in the MySQL client:&lt;/p&gt;
&lt;pre&gt;CREATE USER &#039;replicator&#039;@&#039;192.168.%&#039; IDENTIFIED BY &#039;mypass&#039;;&lt;br /&gt;GRANT REPLICATION SLAVE ON *.* TO &#039;replicator&#039;@&#039;192.168.%&#039;;&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;The first command creates our user, the second grants the required permissions.&amp;#160; Note that I&#039;ve used a wildcarded network address, you can also use a hostname wildcard.&lt;/p&gt;
&lt;p&gt;For the slave we need a few things, first we need to set a server-id that is not the same as the master (or any other slave we are creating). Then we need a copy of the data on the master at the point at which the slave is to be started, and we need to then tell the slave about the master.&lt;/p&gt;
&lt;p&gt;We can create the server-id in the same manner as we did for the master - but we don&#039;t need to specify a binlog (unless we are acting as a relay master).&lt;/p&gt;
&lt;pre&gt;server-id = 2&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;To get our first copy of the master data, the best idea is to use mysqldump.&amp;#160; Before we do, we need to stop the master from writing to the binary log and record its current position.&amp;#160; From the mysql command line:&lt;/p&gt;
&lt;pre&gt;FLUSH TABLES WITH READ LOCK;&lt;br /&gt;SHOW MASTER STATUS;&lt;br /&gt;+------------------+----------+--------------+------------------+&lt;br /&gt;| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |&lt;br /&gt;+------------------+----------+--------------+------------------+&lt;br /&gt;| mysql-bin.000092 |      106 |              |                  |&lt;br /&gt;+------------------+----------+--------------+------------------+&lt;br /&gt;1 row in set (0.00 sec)&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;We need to keep this session open so that the lock remains in place, and from another terminal run a mysqldump.&lt;/p&gt;
&lt;pre&gt;mysqldump --all-databases &amp;gt; all_db.sql&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Once the backup is completed we can either drop the lock session or issue:&lt;/p&gt;
&lt;pre&gt;UNLOCK TABLES;&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Great, we now have a backup and we have the position in the binary log at the point at which the backup occurred.&amp;#160; These two together provide us with all we need to create our slave.&lt;/p&gt;
&lt;p&gt;First step is to load the above SQL file into the slave.&amp;#160;&amp;#160; On the slave you can use the mysql command line client with the SQL file copied from the master.&lt;/p&gt;
&lt;pre&gt;mysql &amp;lt; all_db.sql&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;On the slave server we now need to issue a CHANGE MASTER command to tell it where the master is, and where to start replicating from.&amp;#160; This information will be written to the master.info file that is read at startup and updated by the replication process so that the slave will be able to resync with the master on restart.&lt;/p&gt;
&lt;pre&gt;CHANGE MASTER TO MASTER_HOST = &#039;master&#039;&lt;br /&gt;  MASTER_USER = &#039;replicator&#039;&lt;br /&gt;  MASTER_PASSWORD = &#039;mypass&#039;&lt;br /&gt;  MASTER_LOG_FILE = &#039;mysql-bin.000092&#039;&lt;br /&gt;  MASTER_LOG_POS = 106;&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;The MASTER_HOST, MASTER_USER and MASTER_PASSWORD must match the master and the user created above with replication slave permission.&amp;#160; The MASTER_LOG_FILE and MASTER_LOG_POS come from the SHOW MASTER STATUS used when we did the backup of the master.&lt;/p&gt;
&lt;p&gt;Now all that is left to do is to start the slave processes:&lt;/p&gt;
&lt;pre&gt;START SLAVE;&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;We can use the same backup and the same processes above to create as many slaves as we need.&lt;/p&gt;
&lt;p&gt;If you have to set up a complex replication scenario that is not covered by the above, you may find the &lt;a href=&quot;http://config.skysql.com/&quot;&gt;SkySQL Reference Architecture&lt;/a&gt; provisioning system useful.&amp;#160; This service creates master/slave high availability configurations and packages software and configurations together so that you can easily install a system from scratch that meets all your replication needs.&lt;/p&gt;
&lt;h3&gt;Disclaimer&lt;/h3&gt;
&lt;p&gt;I am employed by &lt;a href=&quot;http://www.skysql.com/&quot;&gt;SkySQL Ab&lt;/a&gt;, which provides &lt;a href=&quot;http://www.skysql.com/services/support&quot;&gt;support&lt;/a&gt;, &lt;a href=&quot;http://www.skysql.com/services/training&quot;&gt;training&lt;/a&gt; and &lt;a href=&quot;http://www.skysql.com/services/overview&quot;&gt;services&lt;/a&gt; for  MySQL, MariaDB and Drizzle and is staffed by many ex-MySQL AB         employees.  While I try to be unbiased in all of my public opinions,    and      my  opinions are all my own and not those of my employer, I    work  for     SkySQL  because I believe in what they are doing and    therefore   cannot  be   truly  unbiased.&lt;/p&gt;
&lt;p&gt;MySQL is a registered trademark of Oracle Corporation,&amp;#160; MariaDB is a trademark of MontyProgram, and Drizzle is a trademark.&lt;/p&gt;&lt;div class=&quot;socialbutttons&quot;&gt;&lt;div class=&quot;fbiframediv sharebuttton&quot;&gt;&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?app_id=194259500619894&amp;amp;href=http://blogs.sakienvirotech.com/index.php?p=772&amp;amp;send=false&amp;amp;width=450&amp;amp;show_faces=false&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;font=arial&amp;amp;height=85&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:450px; height:85px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div class=&quot;twbutton sharebuttton&quot;&gt;&lt;a href=&quot;http://twitter.com/share&quot; class=&quot;twitter-share-button&quot; data-url=&quot;http://blogs.sakienvirotech.com/index.php?p=772&quot; data-count=&quot;horizontal&quot;&gt;Tweet&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;gplusdiv sharebuttton&quot;&gt;&lt;g:plusone href=&quot;http://blogs.sakienvirotech.com/index.php?p=772&quot;&gt;&lt;/g:plusone&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blogs.sakienvirotech.com/index.php/random/2011/11/01/mysql-101-replication&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://blogs.sakienvirotech.com/random&quot;&gt;Saki Envirotech Blogs&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>So far we've looked at many aspects of MySQL, not in any great depth, but hopefully with enough information to get you started and whet your appetite for more.&#160; Now we start to look into areas that aren't in the basic tutorials.</p>
<p>Replication is the technology that allows data to be stored on multiple servers. Typically this is used in "scale out" applications.&#160; "Scale out" is used in contrast to "Scale up" where to scale a solution you buy a bigger box to run it on, where "scale out" means you buy more boxes.&#160; Each has its benefits and drawbacks, with the usual benefit of scale out being that you get more bang for your buck.</p>
<p>The way replication works in MySQL is pretty simple.&#160; One server is identified as the master, and writes every transaction to a file, the binary log.&#160; Other servers (and there may be many) act as slaves and request information from the master. The slave keeps track of where it got up to and asks the master for the next transaction in the file.&#160; In general the master doesn't know or care where the slave is up to, it just sends out the requested transaction to whoever has the right credentials to ask for it.</p>
<p>On the slave there are two threads running, one that requests events from the master binlog (binary log) and writes them to the relay log (which in reality is just another binlog), and the second thread that reads the relay log and executes the queries. In order to avoid non-deterministic outcomes the SQL thread is just that, a single thread.&#160; Long running events can result in the replication lagging well behind the state of the master.</p>
<p>This is the traditional asynchronous replication.&#160; Newer versions of MySQL now support semi-synchronous replication as well.&#160; In this mode the master will not return control back to the querying process until at least one slave reports that it has received the transaction events and written them to its own relay log.&#160; Note that this is written to the relay log but not necessarily written to the database.</p>
<p>You may wonder under what circumstance replication would be of use.&#160; If your application is mainly read-intensive (as many web applications are) then replication gives you the ability to spread reads across multiple slaves to reduce contention.&#160; If your application is mainly write intensive, then replication to multiple slaves will not, of itself, give you any relief.&#160; Indeed, because the replication is single-threaded and all writes on the master must be written to the slaves, you can in fact hurt performance with a replicated setup.</p>
<p>What about more than one master?&#160; This is possible but requires careful thought and planning.&#160; MySQL replication keeps track of which server initiated the transaction, so "circular replication" where a slave acts also as a master should not cause problems, however there are some serious issues to consider.&#160; Take for instance a customer table with the customer ID being auto incremented.&#160; What happens if there are writes to both masters in a master&lt;-&gt;master replication setup?&#160; Both will grab the next ID in sequence, then the other will pull that transaction and try and will end up with a duplicate index error, causing replication to fail.&#160; You can get around this by setting the initial auto_increment value on each server and setting the auto_increment_increment value to the number of masters in use.&#160; Remebering however that both masters now have to write all traffic that goes to the pair, there is not a great deal of benefit in such an arrangement.&#160; Other technologies, such as sharding, turn out to offer better scale out opportunities for multi-master deployments.</p>
<p>There are, however, some tools to make multi-master work more easily.&#160; <a href="http://mysql-mmm.org/">MMM (Multi-Master Replication Manager for MySQL) </a>is one.&#160; <a href="http://code.google.com/p/mysql-master-ha/">MHA (Master High Availability for MySQL)</a> is somewhat different, allowing easy management of master failover.</p>
<p>That is probably enough theory, lets look at how to build a replication system.</p>
<p>For the master, the only requirement is that it writes its transactions to a binary log, and that it has a server ID set.&#160; To do this we need to add the following to the my.cnf file:</p>
<pre>server-id = 1<br />log_bin = /var/log/mysql/mysql-bin.log<br /></pre>
<p>The server-id is an integer that must be unique for all servers in the same replication set.&#160; This is because of the tracking of transactions to avoid circular replication errors.&#160; The log_bin is the path to the binary log file to use.&#160; Each file will be appended with a sequence number to allow the server to rotate log files when they grow too large, or a flush request is received.</p>
<p>One other value that is useful is to set an expiry on the binlogs so that they don't take over all of your disk.&#160; You need to ensure that you have enough binlog capacity for normal replication lag and for handling backup/recovery, but beyond that you can get MySQL to automatically delete the older binlogs.</p>
<pre>expire_log_days = 14<br /></pre>
<p>Now the master will at least be writing transactions to the binary logs.&#160; Now we have to set up to allow slaves to replicate.&#160; First step is to create a user that the slaves will connect with.&#160; This user must have REPLICATION SLAVE permissions to be able to read the binlog.&#160; Note that this user is created on the master. As a privileged user, in the MySQL client:</p>
<pre>CREATE USER 'replicator'@'192.168.%' IDENTIFIED BY 'mypass';<br />GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'192.168.%';<br /></pre>
<p>The first command creates our user, the second grants the required permissions.&#160; Note that I've used a wildcarded network address, you can also use a hostname wildcard.</p>
<p>For the slave we need a few things, first we need to set a server-id that is not the same as the master (or any other slave we are creating). Then we need a copy of the data on the master at the point at which the slave is to be started, and we need to then tell the slave about the master.</p>
<p>We can create the server-id in the same manner as we did for the master - but we don't need to specify a binlog (unless we are acting as a relay master).</p>
<pre>server-id = 2<br /></pre>
<p>To get our first copy of the master data, the best idea is to use mysqldump.&#160; Before we do, we need to stop the master from writing to the binary log and record its current position.&#160; From the mysql command line:</p>
<pre>FLUSH TABLES WITH READ LOCK;<br />SHOW MASTER STATUS;<br />+------------------+----------+--------------+------------------+<br />| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |<br />+------------------+----------+--------------+------------------+<br />| mysql-bin.000092 |      106 |              |                  |<br />+------------------+----------+--------------+------------------+<br />1 row in set (0.00 sec)<br /></pre>
<p>We need to keep this session open so that the lock remains in place, and from another terminal run a mysqldump.</p>
<pre>mysqldump --all-databases &gt; all_db.sql<br /></pre>
<p>Once the backup is completed we can either drop the lock session or issue:</p>
<pre>UNLOCK TABLES;<br /></pre>
<p>Great, we now have a backup and we have the position in the binary log at the point at which the backup occurred.&#160; These two together provide us with all we need to create our slave.</p>
<p>First step is to load the above SQL file into the slave.&#160;&#160; On the slave you can use the mysql command line client with the SQL file copied from the master.</p>
<pre>mysql &lt; all_db.sql<br /></pre>
<p>On the slave server we now need to issue a CHANGE MASTER command to tell it where the master is, and where to start replicating from.&#160; This information will be written to the master.info file that is read at startup and updated by the replication process so that the slave will be able to resync with the master on restart.</p>
<pre>CHANGE MASTER TO MASTER_HOST = 'master'<br />  MASTER_USER = 'replicator'<br />  MASTER_PASSWORD = 'mypass'<br />  MASTER_LOG_FILE = 'mysql-bin.000092'<br />  MASTER_LOG_POS = 106;<br /></pre>
<p>The MASTER_HOST, MASTER_USER and MASTER_PASSWORD must match the master and the user created above with replication slave permission.&#160; The MASTER_LOG_FILE and MASTER_LOG_POS come from the SHOW MASTER STATUS used when we did the backup of the master.</p>
<p>Now all that is left to do is to start the slave processes:</p>
<pre>START SLAVE;<br /></pre>
<p>We can use the same backup and the same processes above to create as many slaves as we need.</p>
<p>If you have to set up a complex replication scenario that is not covered by the above, you may find the <a href="http://config.skysql.com/">SkySQL Reference Architecture</a> provisioning system useful.&#160; This service creates master/slave high availability configurations and packages software and configurations together so that you can easily install a system from scratch that meets all your replication needs.</p>
<h3>Disclaimer</h3>
<p>I am employed by <a href="http://www.skysql.com/">SkySQL Ab</a>, which provides <a href="http://www.skysql.com/services/support">support</a>, <a href="http://www.skysql.com/services/training">training</a> and <a href="http://www.skysql.com/services/overview">services</a> for  MySQL, MariaDB and Drizzle and is staffed by many ex-MySQL AB         employees.  While I try to be unbiased in all of my public opinions,    and      my  opinions are all my own and not those of my employer, I    work  for     SkySQL  because I believe in what they are doing and    therefore   cannot  be   truly  unbiased.</p>
<p>MySQL is a registered trademark of Oracle Corporation,&#160; MariaDB is a trademark of MontyProgram, and Drizzle is a trademark.</p><div class="socialbutttons"><div class="fbiframediv sharebuttton"><iframe src="http://www.facebook.com/plugins/like.php?app_id=194259500619894&amp;href=http://blogs.sakienvirotech.com/index.php?p=772&amp;send=false&amp;width=450&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=85" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:85px;" allowTransparency="true"></iframe></div><div class="twbutton sharebuttton"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blogs.sakienvirotech.com/index.php?p=772" data-count="horizontal">Tweet</a></div><div class="gplusdiv sharebuttton"><g:plusone href="http://blogs.sakienvirotech.com/index.php?p=772"></g:plusone></div></div><div class="item_footer"><p><small><a href="http://blogs.sakienvirotech.com/index.php/random/2011/11/01/mysql-101-replication">Original post</a> blogged on <a href="http://blogs.sakienvirotech.com/random">Saki Envirotech Blogs</a>.</small></p></div>]]></content:encoded>
								<comments>http://blogs.sakienvirotech.com/index.php/random/2011/11/01/mysql-101-replication#comments</comments>
			<wfw:commentRss>http://blogs.sakienvirotech.com/index.php/random/?tempskin=_rss2&#38;disp=comments&#38;p=772</wfw:commentRss>
		</item>
			</channel>
</rss>
