<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Pembi's Random Ramblings &#187; Software</title>
	<atom:link href="http://blog.pembi.net/category/reviews/software/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.pembi.net</link>
	<description>WARNING: May contain nuts.</description>
	<lastBuildDate>Mon, 16 Jan 2012 14:55:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>PswGen Progress Report</title>
		<link>http://blog.pembi.net/pswgen-progress-report</link>
		<comments>http://blog.pembi.net/pswgen-progress-report#comments</comments>
		<pubDate>Tue, 30 Aug 2011 18:37:10 +0000</pubDate>
		<dc:creator>Ken</dc:creator>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://blog.pembi.net/?p=1006</guid>
		<description><![CDATA[Actually, it&#8217;s more of a lack-of-progress report, I&#8217;m afraid. But more coming soon, so watch this space! I now have a Mac, and a few days off work. Once I get my head around the very odd way Apple wants you to write software, I&#8217;ll have an iPhone/iPad/iPod Touch version released in short order.]]></description>
			<content:encoded><![CDATA[<p>Actually, it&#8217;s more of a lack-of-progress report, I&#8217;m afraid.<br />
<span id="more-1006"></span><br />
But more coming soon, so watch this space! I now have a Mac, and a few days off work. Once I get my head around the very odd way Apple wants you to write software, I&#8217;ll have an iPhone/iPad/iPod Touch version released in short order.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pembi.net/pswgen-progress-report/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>First Rails, now Cake!</title>
		<link>http://blog.pembi.net/first-rails-now-cake</link>
		<comments>http://blog.pembi.net/first-rails-now-cake#comments</comments>
		<pubDate>Sun, 19 Dec 2010 12:15:27 +0000</pubDate>
		<dc:creator>Ken</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[Web Sites]]></category>

		<guid isPermaLink="false">http://blog.pembi.net/?p=977</guid>
		<description><![CDATA[After my brief flirt with Ruby on Rails (see previous post), I decided to have a play with CakePHP too. A similar concept, implemented slightly differently, with (obviously) PHP doing the heavy lifting rather than Ruby. So what&#8217;s the skinny? According to book.cakephp.org, CakePHP is a free, open-source, rapid development framework for PHP. It’s a [...]]]></description>
			<content:encoded><![CDATA[<p><img alt="" src="http://cakephp.org/img/cake-logo.png" title="CakePHP" class="alignright" width="180" height="180" />After my brief flirt with Ruby on Rails (<a href="http://blog.pembi.net/riding-the-rails">see previous post</a>), I decided to have a play with CakePHP too. A similar concept, implemented slightly differently, with (obviously) PHP doing the heavy lifting rather than Ruby.</p>
<p><strong>So what&#8217;s the skinny?</strong><br />
According to <a href="http://book.cakephp.org/view/880/What-is-CakePHP-Why-Use-it">book.cakephp.org</a>, CakePHP is </p>
<blockquote><p>a free, open-source, rapid development framework for PHP. It’s a foundational structure for programmers to create web applications.</p>
<p>CakePHP takes the monotony out of web development. We provide you with all the tools you need to get started coding what you really need to get done: the logic specific to your application.</p>
<p>MVC architecture.</p>
<p>Fast and flexible templating.</p></blockquote>
<p>(I just picked a couple of the highlights from that page)<span id="more-977"></span><br />
<strong>Cake vs Rails?</strong><br />
RoR nearly fell at the first hurdle. Getting the damn thing to work at all was the biggest problem, and I nearly gave up a couple of times. Cake was *much* simper.</p>
<p>More to follow shortly, I&#8217;m still playing! Will update this post as I go.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pembi.net/first-rails-now-cake/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Riding the Rails</title>
		<link>http://blog.pembi.net/riding-the-rails</link>
		<comments>http://blog.pembi.net/riding-the-rails#comments</comments>
		<pubDate>Tue, 14 Dec 2010 15:13:20 +0000</pubDate>
		<dc:creator>Ken</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[Web Sites]]></category>

		<guid isPermaLink="false">http://blog.pembi.net/?p=974</guid>
		<description><![CDATA[I had a little work project to do recently, a simple online database-updater. Nothing fancy, two small related tables, fairly standard master/detail stuff. So just for a giggle (and &#8216;coz I&#8217;m a geek) I thought I&#8217;d take RoR for a test-drive. Woohoo what a ride! Within about 15 minutes, following an online tutorial, I&#8217;d installed [...]]]></description>
			<content:encoded><![CDATA[<p><img alt="Roar with RoR!" src="http://rubyonrails.org/images/rails.png" title="Roar with RoR!" class="alignleft" width="87" height="111" />I had a little work project to do recently, a simple online database-updater. Nothing fancy, two small related tables, fairly standard master/detail stuff. So just for a giggle (and &#8216;coz I&#8217;m a geek) I thought I&#8217;d take RoR for a test-drive. Woohoo what a ride! Within about 15 minutes, following an online tutorial, I&#8217;d installed everything I needed, and had a fully-functional web application to insert, update and delete data on one of the tables.<span id="more-974"></span><br />
Obviously, a single simple little app like this is nothing to roar about (pun intended), but the fact is that RoR had built a comprehensive application framework for me. I haven&#8217;t written a line of Ruby code yet, and I&#8217;m able to maintain a table. I wonder how far into this I can get without coding? Watch this space&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pembi.net/riding-the-rails/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PswGen Toolbar Updated</title>
		<link>http://blog.pembi.net/pswgen-toolbar-updated</link>
		<comments>http://blog.pembi.net/pswgen-toolbar-updated#comments</comments>
		<pubDate>Sat, 01 Aug 2009 05:49:17 +0000</pubDate>
		<dc:creator>Ken</dc:creator>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://blog.pembi.net/?p=741</guid>
		<description><![CDATA[v0.9.3 is now available on the Mozilla Addons site at https://addons.mozilla.org/en-US/firefox/addon/13261 This version includes functional Options at last &#8211; you can now switch the &#8220;Follow Me&#8221; feature off if you want to, and I&#8217;ve added a &#8220;Hide Password&#8221; toggle so that not only do you never need to type your passwords in, they&#8217;re not even [...]]]></description>
			<content:encoded><![CDATA[<p>v0.9.3 is now available on the Mozilla Addons site at <a href="https://addons.mozilla.org/en-US/firefox/addon/13261">https://addons.mozilla.org/en-US/firefox/addon/13261</a></p>
<p>This version includes functional Options at last &#8211; you can now switch the &#8220;Follow Me&#8221; feature off if you want to, and I&#8217;ve added a &#8220;Hide Password&#8221; toggle so that not only do you never need to type your passwords in, they&#8217;re not even shown on the screen any more.</p>
<p>Be aware that there is a bug with the way new &#8220;experimental&#8221; add-ons are handled on the add-ons site, and they show a &#8220;invalid file hash&#8221; error when installing <em>unless</em> you first log in to the add-ons site. This is NOT a fault with the add-on itself, regardless of what the message says.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pembi.net/pswgen-toolbar-updated/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>PswGen FireFox Toolbar now available!</title>
		<link>http://blog.pembi.net/pswgen-firefox-toolbar-now-available</link>
		<comments>http://blog.pembi.net/pswgen-firefox-toolbar-now-available#comments</comments>
		<pubDate>Sun, 26 Jul 2009 16:05:34 +0000</pubDate>
		<dc:creator>Ken</dc:creator>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://blog.pembi.net/?p=738</guid>
		<description><![CDATA[Wheeee! You can get it from the Mozilla addons site.]]></description>
			<content:encoded><![CDATA[<p>Wheeee! You can get it <a href="https://addons.mozilla.org/en-US/firefox/addon/13261">from the Mozilla addons site</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pembi.net/pswgen-firefox-toolbar-now-available/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Google launches Chrome OS project</title>
		<link>http://blog.pembi.net/google-launches-chrome-os-project</link>
		<comments>http://blog.pembi.net/google-launches-chrome-os-project#comments</comments>
		<pubDate>Tue, 21 Jul 2009 10:48:38 +0000</pubDate>
		<dc:creator>Ken</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://blog.pembi.net/?p=734</guid>
		<description><![CDATA[While I&#8217;m not a great fan of Google&#8217;s Chrome web browser (I&#8217;m a FireFox junkie), I&#8217;m very pleased to hear about Google&#8217;s Chrome OS initiative. They have the resources to get this off to a good start &#8211; and then they&#8217;ll open-source it. Could this be the push that Linux needed to finally go mainstream [...]]]></description>
			<content:encoded><![CDATA[<p>While I&#8217;m not a great fan of Google&#8217;s Chrome web browser (I&#8217;m a FireFox junkie), I&#8217;m very pleased to hear about Google&#8217;s Chrome OS initiative. They have the resources to get this off to a good start &#8211; <em>and then they&#8217;ll open-source it</em>. Could this be the push that Linux needed to finally go mainstream and become a real choice for consumers? <a href="http://googleblog.blogspot.com/2009/07/introducing-google-chrome-os.html">Read more about it here.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pembi.net/google-launches-chrome-os-project/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PswGen for Windows now available!</title>
		<link>http://blog.pembi.net/pswgen-for-windows-now-available</link>
		<comments>http://blog.pembi.net/pswgen-for-windows-now-available#comments</comments>
		<pubDate>Mon, 29 Jun 2009 20:21:11 +0000</pubDate>
		<dc:creator>Ken</dc:creator>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://blog.pembi.net/?p=702</guid>
		<description><![CDATA[If you can&#8217;t be bothered with Python, don&#8217;t trust the web service, and can&#8217;t wait for Ken to finish the FireFox add-on&#8230; Now available on the PswGen page.]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.pembi.net/wp-content/uploads/2009/05/PswGen-Screen.PNG" alt="PswGen-Screen" title="PswGen-Screen" width="413" height="111" class="alignnone size-full wp-image-697" /><br />
If you can&#8217;t be bothered with Python, don&#8217;t trust the web service, and can&#8217;t wait for Ken to finish the FireFox add-on&#8230; Now available <a href="http://blog.pembi.net/essentials/essential-security/pembis-perfect-passwords">on the PswGen page</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pembi.net/pswgen-for-windows-now-available/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Project Natal : Jaw-droppingly-awesome</title>
		<link>http://blog.pembi.net/project-natal-jaw-droppingly-awesome</link>
		<comments>http://blog.pembi.net/project-natal-jaw-droppingly-awesome#comments</comments>
		<pubDate>Thu, 11 Jun 2009 07:53:24 +0000</pubDate>
		<dc:creator>Ken</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://blog.pembi.net/project-natal-jaw-droppingly-awesome</guid>
		<description><![CDATA[OMG Microsoft is gonna rule the world!]]></description>
			<content:encoded><![CDATA[<p>OMG Microsoft is gonna rule the world!</p>
<p><object width="540" height="328"><param name="movie" value="http://www.youtube.com/v/M9nuwsQ5nF4&#038;hl=en&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/M9nuwsQ5nF4&#038;hl=en&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="540" height="328"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pembi.net/project-natal-jaw-droppingly-awesome/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python: simple elegance</title>
		<link>http://blog.pembi.net/python-simple-elegance</link>
		<comments>http://blog.pembi.net/python-simple-elegance#comments</comments>
		<pubDate>Mon, 04 May 2009 18:34:16 +0000</pubDate>
		<dc:creator>Ken</dc:creator>
				<category><![CDATA[Reviews]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[Web Sites]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.pembi.net/python-simple-elegance</guid>
		<description><![CDATA[A little hobby-job took me down the Python route this weekend, and I have to say I&#8217;m impressed. So far, at least. It has a simple elegance, and seems to approach coding from the same angle I do. Feels very natural to me. Pascal is my native tongue, and I&#8217;ve coded there for so long [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.pembi.net/python-simple-elegance"><img src="http://blog.pembi.net/wp-content/uploads/2009/05/python.gif" alt="python" title="python" width="211" height="71" class="alignright size-full wp-image-594" /></a>A little hobby-job took me down the Python route this weekend, and I have to say I&#8217;m impressed. So far, at least. It has a simple elegance, and seems to approach coding from the same angle I do. Feels very natural to me. Pascal is my native tongue, and I&#8217;ve coded there for so long I that the language itself doesn&#8217;t even seem to be there any more, the code almost flows out of my fingers. Every other environment I&#8217;ve dabbled in has felt foreign in some way, and that hasn&#8217;t happened here.<br />
<span id="more-573"></span><br />
OK for sure I spend some time rifling through the various online references to look up a function or syntax I haven&#8217;t used yet (to be expected in any new language), but it seems more exciting than tedious. Perhaps because this is a hobby-job and not something I <em>have </em>to do? Maybe that&#8217;s a factor.</p>
<p>Want to see a sample? OK here goes. Some time ago I wrote a password-generator program, which would take five inputs:</p>
<ul>
<li>Site/Service Name</li>
<li>User Name</li>
<li>Secret Word</li>
<li>Secret Number</li>
<li>Password Length</li>
</ul>
<p>and mash the first four together to create a random-looking, but predictably-reproducable (is that a word?) password of the requested length. I have a Windows desktop application (written in Delphi) and a Windows Mobile implementation (in VB) of this, and it has served me well. At least, until I upgraded my phone to a Symbian-based Nokia, at which point I lost the mobile version. And I miss that mobile one, so I decided to right this wrong. Python is available for just about every platform going, Java is so cliché, and although I can code in C/C++, I generally prefer not to (now <em>there&#8217;s</em> a foreign-feeling environment). Here&#8217;s the (very early pre-release-test-only-please-don&#8217;t-criticise-it) Python program:</p>
<pre lang="python">
"""Main executive for Ken's password generator.
Just a test shell at the moment, but will incorporate cross-platform
checking, ensuring the correct I/O bits are used.
"""

import PswGenCalc

a="myname"
b="anysite"
c="keyword"
d="1234"

print PswGenCalc.getPswGen(a,b,c,d,10)
</pre>
<p>Of course that&#8217;s useless unless we&#8217;ve actually got the PswGenCalc module:</p>
<pre lang="python">
"""The guts of Ken's password generator.

   Takes the four input strings:
     SiteName
     UserName
     KeyWord
     KeyNumber
   And generates a repeatably-derived but high-strength and random-looking password.

   Input strings are all upper-cased before hashing. Returned string is built from the
   collision-resistant constant named ANTICOL below. Note the omission of look-alike
   characters such as I, l and 1.
"""

ANTICOL = "234679ACDEFGHJKLMNPQRTUVWXYabcdefghijkmnpqrstuvwxyz!$^*()-+=@#.,~"
HEXDIGITS = "0123456789ABCDEF"

import hashlib

def getPswGen(SiteName, UserName, KeyWord, Number, Length=8):
    # first concatenate all inputs &#038; bump to upper-case
    AllInOne = (SiteName + UserName + KeyWord + Number).upper()
    # and generate a hash on that lot.
    Hash = hashlib.sha512(AllInOne).hexdigest().upper()
    # The Hash just generated consists of a number of hex-pair values.
    # Now strip them out one at a time and use them as indexes to look up
    # password characters from the ANTICOL table.
    Passw = ""
    while (len(Hash) > 0):
        HexVal = Hash[:2]   # first two characters
        # Now convert that to a decimal.
        DecVal = (HEXDIGITS.find(HexVal[:1]) * 16) + HEXDIGITS.find(HexVal[1:])
        # Next use each value as an offset into the ANTICOL string, and look
        # up the next password character.
        Passw = Passw + ANTICOL[DecVal % len(ANTICOL)]
        # Drop the bit of the hash code we just used and loop around for the next.
        Hash = Hash[2:] # everything EXCEPT the first two characters
    # Return the requested length of password, but from the TAIL of the string.
    # Using the tail effectively includes the length in the "randomisation".
    return Passw[-Length:]
</pre>
<p>Yes, I know that I could have combined some of the statements above and made it perform a little faster, but I generally avoid doing that unless the performance gain is absoltely necessary &#8211; I&#8217;ll take readability over technical snobbery every time, thank you. And yes, I&#8217;m sure that there&#8217;s a library function somewhere to do the hex-to-decimal conversion for me too. When I come across it, I&#8217;ll update. For now it&#8217;s no hardship for me to write a one-line conversion calculation.</p>
<p>Back to the program in question: for the sample data supplied in the main program code above, the output password is &#8220;E^gTHm-&#038;Tr&#8221;. As passwords go, this is pretty good. Ten characters is long enough for most personal uses, and the mixture of upper-case and lower-case letters along with digits and symbols makes it very strong. To demonstrate how good the SHA hashing process is, I changed the KeyNumber parameter from 1234 to 1235, and the resulting password was &#8220;^?< ]>i2KEh&#8221; &#8211; <em>completely</em> unrelated. This is a sign of a good hash &#8211; change one bit of input data and on average, half the bits of the output data will change. The neat thing is, the password looks like total garbage but isn&#8217;t actually random. Give the same set of inputs to this code &#8211; on ANY operating system &#8211; and you&#8217;ll get the same output every time. That makes it ideal for password generation &#8211; you don&#8217;t have to remember the passwords, just the input components. And the beauty of it, like any decent hashing or encryption process, is that the entire design can be made public (like I&#8217;ve just done) without weakening the value. It doesn&#8217;t <em>matter</em> if the bad guys know how this works, as long as I keep the inputs secret, the passwords are safe. In fact, I really only need to keep ONE of the inputs secret, but there&#8217;s no harm in taking it further.</p>
<p>Is that strong enough? Frankly, yes &#8211; for low-to-medium-risk applications. Since you don&#8217;t have to remember the passwords, make them longer if you&#8217;re worried. If you need more security strength than this, then you&#8217;re really outside the bounds of what a password can do for you, and should be looking into multi-factor authentication anyway.</p>
<p>So why do I like Python so very much?</p>
<ol>
<li>It is extremely portable, Python code can run just about anywhere. Any flavour of desktop you can think of (and possibly a couple you can&#8217;t), non-graphical UI environments (text-only consoles), mobile devices (including Windows Mobile and Symbian-based phones), web servers, you name it.</li>
<li>The language seems to be implemented with the mind-set of programmers in mind. Rather than theoretical eggheads. I can&#8217;t explain what makes me think this, other than my immediate comfort-zone feeling.</li>
<li>It runs both as a prepared-script program and interactively, making unit-testing and debugging extremely convenient.</li>
<li>Silly issues like indenting conventions disappear &#8211; they are an integral part of how the language operates. If you get your indenting wrong, you&#8217;ll know all about it soon enough. Nudges the programmer into good design and coding habits.</li>
<li>To a much larger extent than any other environment I&#8217;ve worked in, Python encourages code self-documentation. You noticed the triple-quoted headers on each file above? That&#8217;s a Python convention, and that text is picked up by the doc-generator utilities.</li>
<li>Code is readable! You might have picked up from the above that Python is heavily object-oriented. Fortunately, this is object orientation done right. Simple dot notation, thank you very much. Again, this just encourages good habits.</li>
</ol>
<p>And now if you&#8217;ll excuse me, I&#8217;m off to turn this into a functional application. A desktop one quickly for myself, then a Symbian one for the Nokia, followed by a web-based version for the rest of the world. Any other requests?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pembi.net/python-simple-elegance/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

