<?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>From Accessibility to Zope</title>
	<atom:link href="http://blog.mauveweb.co.uk/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.mauveweb.co.uk</link>
	<description>experiments in contemporary web development</description>
	<lastBuildDate>Thu, 18 Aug 2011 23:26:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>MVC Controllers</title>
		<link>http://blog.mauveweb.co.uk/2011/05/03/mvc-controllers/</link>
		<comments>http://blog.mauveweb.co.uk/2011/05/03/mvc-controllers/#comments</comments>
		<pubDate>Tue, 03 May 2011 19:25:38 +0000</pubDate>
		<dc:creator>mauve</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.mauveweb.co.uk/?p=382</guid>
		<description><![CDATA[MVC as a pattern has many interpretations, but an interpretation I think is common goes as follows:

Model - database abstraction/persistence
View &#8211; templates
Controller - all the code that interprets the request, interacts with models, and sets up and renders a template

There is a distinct problem with this, and it's that the controller is bloated with all [...]]]></description>
			<content:encoded><![CDATA[<p>MVC as a pattern has many interpretations, but an interpretation I think is common goes as follows:</p>
<ul>
<li><strong>Model </strong>- database abstraction/persistence</li>
<li><strong>View &#8211; </strong>templates</li>
<li><strong>Controller </strong>- all the code that interprets the request, interacts with models, and sets up and renders a template</li>
</ul>
<p>There is a distinct problem with this, and it's that the controller is bloated with all manner of code  - things which don't seem bottom-up enough to be part of the model, or code to pre-chew model data for the benefit of dumb templates. This leads to controllers dozens of lines long that are difficult to read as a whole.</p>
<p>In my code (Django code, where controllers are called views) I have been try to avoid this, for a long while now. Since controllers constitute the glue between request, model interaction and setting up of the view, I read these frequently to determine how the application is glued together. Therefore I've found them to benefit from being as short and transparent as possible.</p>
<p>These facts should be immediately visible on reading the code of a controller:</p>
<ol>
<li>What are the input parameters from the request (GET/POST/Cookies/Headers/Session Vars)</li>
<li>How those parameters are interpreted/validated (their domain)</li>
<li>What operation the request performs</li>
<li>What variables are passed to the template system</li>
</ol>
<p>I think it's worth formularising this. My take would be something like this:</p>
<p><strong>A controller should contain no code other than these distinct phases:</strong></p>
<ol>
<li><strong>Unpacking the request parameters/validating the request.</strong></li>
<li><strong>Invoking an operation, defined elsewhere.</strong></li>
<li><strong>Setting up the context for template rendering.</strong></li>
</ol>
<p>These can even be labelled as such.</p>
<p>I've conflated unpacking/validating because these can generally be stated succinctly together, using trivial code. For example, in Django, you'd see code like this:</p>
<pre><code><span style="color: #ff7700;font-weight:bold;">def</span> category<span style="color: black;">&#40;</span>request, category_id<span style="color: black;">&#41;</span>:
&nbsp; category = get_object_or_404<span style="color: black;">&#40;</span>Category, <span style="color: #008000;">id</span>=category_id<span style="color: black;">&#41;</span></code></pre>
<p>which I think succinctly comprises these facts:</p>
<ul>
<li>The controller named <code>category</code> receives a parameter <code>category_id</code></li>
<li>The valid domain of <code>category_id</code> is the set of all <code>Category ids</code></li>
<li>If <code>category_id</code> is outside that domain, <code>Http404</code> is raised</li>
</ul>
<p>When identifying the business logic of a view, I've found that when the code enacting this grows to more than a couple of lines it's best either to be put into a form's <code>.save()</code> method (thus a form basically defines one operation on a mixed bag of unvalidated input), or into model methods (usually for simple model manipulation), or into a separate class that defines more complicated business logic.</p>
<p>When reading the template context setup,  I want to know, when writing templates, what variables I have. Thus this should be explicit in the code of the controller I'm looking at.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.mauveweb.co.uk/2011/05/03/mvc-controllers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dev versus DevOps</title>
		<link>http://blog.mauveweb.co.uk/2011/01/20/dev-versus-devops/</link>
		<comments>http://blog.mauveweb.co.uk/2011/01/20/dev-versus-devops/#comments</comments>
		<pubDate>Thu, 20 Jan 2011 19:17:36 +0000</pubDate>
		<dc:creator>mauve</dc:creator>
				<category><![CDATA[Components]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.mauveweb.co.uk/?p=373</guid>
		<description><![CDATA[Having spent the past few months working in ops I have learned a wide range of new skills in server and network infrastructure. I found that my skills as a developed augmented what my then competent ops skills. Coming back to full-time development now I was expecting to find that my infrastructure skills would improve [...]]]></description>
			<content:encoded><![CDATA[<p>Having spent the past few months working in ops I have learned a wide range of new skills in server and network infrastructure. I found that my skills as a developed augmented what my then competent ops skills. Coming back to full-time development now I was expecting to find that my infrastructure skills would improve my development. What I wasn't expecting was such an early and staggering example.</p>
<p>A year ago, I solved a problem that I was then experiencing &#8211; querying ActiveDirectory with python-ldap under Debian. There was an incompatibility between GnuTLS and AD that made this impossible, due to AD missing TLS 1.1 support and no fallback from TLS 1.1 to TLS 1.0. This would happen:</p>
<pre>
$ gnutls-cli -p 636 ad.example.com
Resolving 'ad.example.com'...
Connecting to 'ad.example.com:636'...
*** Fatal error: A TLS packet with unexpected length was received.
*** Handshake has failed
GNUTLS ERROR: A TLS packet with unexpected length was received.
</pre>
<p>This worked when disabling TLS 1.1 in GnuTLS, but libldap does not expose a way to set GnuTLS options, and so nor does python-ldap.</p>
<h3>My developer solution</h3>
<p>My 2010 workaround was to recompile libldap against OpenSSL (which tested to work with AD). This is how it is done:</p>
<p><strong>Build instructions for libldap</strong></p>
<ol>
<li>check that source repos are available in /etc/apt/sources.list</li>
<li>$ apt-get source openldap</li>
<li># apt-get build-dep openldap</li>
<li># apt-get install libssl-dev</li>
<li>cd to the openldap-* directory</li>
<li>$ CPPFLAGS=-D_GNU_SOURCE ./configure &#8211;prefix=&lt;where> &#8211;with-tls=openssl<br />
    See http://www.openldap.org/its/index.cgi/Build?id=5464 for reasons behind the _GNU_SOURCE flag.</li>
<li>$ make -j &lt;number_of_cpus> depend</li>
<li>$ cd libraries</li>
<li>$ make -j &lt;number_of_cpus></li>
<li>$ make install</li>
<li>$ cd ../include</li>
<li>$ make install</li>
</ol>
<p><strong>Build instructions for python-ldap</strong></p>
<p>libldap may provide the same binary interface (ABI) whether it's compiled with GnuTLS or OpenSSL, but there is a chance that it may differ, so recompiling python-ldap against the new libldap is recommended.</p>
<ol>
<li># apt-get install python-dev</li>
<li>Obtain source for stable python-ldap from http://pypi.python.org/pypi/python-ldap/</li>
<li>Extract archive and enter extracted directory</li>
<li>Edit setup.cfg:
<p>add &lt;where>/lib after library_dirs =<br />
add &lt;where>/include after include_dirs =<br />
add extra_link_args = -L&lt;where>/lib -rpath &lt;where>/lib somewhere in the [_ldap] section.</li>
<li>$ mkdir -p &lt;where>/lib/python&lt;version>/site-packages (where &lt;version> is eg. 2.5, 2.6)</li>
<li>$ PYTHONPATH=&lt;where>/lib/python&lt;version>/site-packages/ python setup.py install &#8211;prefix=&lt;where></li>
</ol>
<p><strong>Running Python</strong></p>
<p>To use the recompiled version of the libraries</p>
<pre>
$ PYTHONPATH=<where>/lib/python<version>/site-packages/ python example.py
</pre>
<h3>My DevOps Solution</h3>
<p>Using <a href="http://www.stunnel.org/">stunnel</a> it is possible to "unwrap" the <acronym title="Secure Sockets Layer">SSL</acronym> layer and provide unencrypted access to python-ldap. stunnel is compiled against OpenSSL and thus doesn't suffer from the GnuTLS bug.</p>
<pre>
$ sudo stunnel -c -d 127.0.0.1:389 -r ad.example.com:636
</pre>
<p>As a developer there's a certain hesitance to introduce another independent service into the system. It feels like weakening the chain, going from one point of failure to many points of failure &#8211; potentially bugs or misconfigurations in the adapting component itself or misconfigurations of the server that is supposed to be hosting that component.</p>
<p>As a DevOp, given the tools and experience to maintain infrastructure systems that involve vastly more components than this, it seems robust &#8211; no non-standard components, just an easy-to-configure off-the-shelf tool doing what it is intended for.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.mauveweb.co.uk/2011/01/20/dev-versus-devops/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Optimism</title>
		<link>http://blog.mauveweb.co.uk/2010/07/30/optimism/</link>
		<comments>http://blog.mauveweb.co.uk/2010/07/30/optimism/#comments</comments>
		<pubDate>Fri, 30 Jul 2010 13:09:58 +0000</pubDate>
		<dc:creator>mauve</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.mauveweb.co.uk/2010/07/30/optimism/</guid>
		<description><![CDATA[I find this somewhat overly optimistic.
]]></description>
			<content:encoded><![CDATA[<p>I find this somewhat overly optimistic.</p>
<p><img src="http://blog.mauveweb.co.uk/wp-content/uploads/2010/07/optimism.png" alt="optimism" title="optimism" width="358" height="163" class="aligncenter size-full wp-image-371" /></p>]]></content:encoded>
			<wfw:commentRss>http://blog.mauveweb.co.uk/2010/07/30/optimism/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Puppet</title>
		<link>http://blog.mauveweb.co.uk/2010/07/04/puppet/</link>
		<comments>http://blog.mauveweb.co.uk/2010/07/04/puppet/#comments</comments>
		<pubDate>Sun, 04 Jul 2010 16:37:53 +0000</pubDate>
		<dc:creator>mauve</dc:creator>
				<category><![CDATA[Network Admin]]></category>

		<guid isPermaLink="false">http://blog.mauveweb.co.uk/?p=369</guid>
		<description><![CDATA[Over the last couple of months I have been getting to grips with Puppet, a client-server system for applying configurations to remote machines. It is a powerful tool for network administration, allowing the configuration for your entire network to be stored in one versioned repository and applied with little effort. There are other, similar tools [...]]]></description>
			<content:encoded><![CDATA[<p>Over the last couple of months I have been getting to grips with Puppet, a client-server system for applying configurations to remote machines. It is a powerful tool for network administration, allowing the configuration for your entire network to be stored in one versioned repository and applied with little effort. There are other, <a href="http://en.wikipedia.org/wiki/Comparison_of_open_source_configuration_management_software">similar tools in this space</a>, but Puppet seems to be particularly popular at the moment.</p>
<p>Puppet includes a master server that serves configuration and files, and a client daemon that connects back to the master using client-certified <acronym title="Secure Sockets Layer">SSL</acronym>, and applies configuration on the machine on which it runs. Configurations are defined in Puppet's own declarative language.</p>
<p>While Puppet is described as a tool that will apply configurations to remote machines, the fact that Puppet manifests comprise definitive knowledge about the network configuration should not be overlooked. As you configure services, the Puppet rules that you write serve as documentation of the process that you followed.</p>
<p>This is not to say Puppet is without problems. The client is very heavy, and can consume lots of memory to apply a configuration &#8211; this can be a showstopper on an otherwise very light <acronym title="Virtual Machine">VM</acronym>. The Puppet language is clean for simple cases, but restrictions in its syntax that stem either from incompleteness, or deliberate restrictions intended to enforce configuration sanity can defeat attempts to write complicated and re-usable recipes.</p>
<p>It is also difficult to test Puppet recipes. You can run them on a <acronym title="Virtual Machine">VM</acronym>, but it's time-consuming to ensure that they apply correctly, first time, given an out-of-the-box install. It's somewhat likely that you would need to run Puppet once, then run apt-get update, and then run Puppet again.</p>
<p>From my point of view as a developer who generally works with normalised databases, what I find ugly is that the Puppet repository is not one fact, one place. Puppet recipes most frequently just copy configuration files onto the client, and the particulars of a configuration file may implicitly depend on facts buried in many other configuration files or Puppet manifests. For example, the IPs listed in <acronym title="Domain Name Server">DNS</acronym> zone files must match the IPs assigned in each host's network configuration. </p>
<p>To avoid some of these problems, a future Puppet-like tool could perhaps take the form of a comprehensive and extensible network information system (eg. <acronym title="Resource Description Framework">RDF</acronym>), and a suite of tools and recipes for compiling that information into something as lightweight as a bash script to run on each remote machine.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.mauveweb.co.uk/2010/07/04/puppet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fonts and font-family</title>
		<link>http://blog.mauveweb.co.uk/2010/02/03/fonts-and-font-family/</link>
		<comments>http://blog.mauveweb.co.uk/2010/02/03/fonts-and-font-family/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 19:10:54 +0000</pubDate>
		<dc:creator>mauve</dc:creator>
				<category><![CDATA[Blogging]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[Web Standards]]></category>

		<guid isPermaLink="false">http://blog.mauveweb.co.uk/?p=362</guid>
		<description><![CDATA[Yesterday, on Twitter, I watched a discussion emerge as one person I follow pointed out that another person's hosted wordpress.com blog was illegible on her computer, with all of the content appearing in ugly bold italics.
While we never got to the bottom of that issue (I couldn't reproduce it), it's worth backing up and examining [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday, on Twitter, I watched a discussion emerge as one person I follow pointed out that another person's hosted wordpress.com blog was illegible on her computer, with all of the content appearing in ugly bold italics.</p>
<p>While we never got to the bottom of that issue (I couldn't reproduce it), it's worth backing up and examining font use on the web.</p>
<p><strong>Fonts, unlike any other aspect of web browser rendering, depend on the platform, not the browser version.</strong></p>
<p>The reason is simple: fonts are not bundled with the browser, but with the operating system, or installed with some creative applications.</p>
<p>If you select fonts based on how they look on your computer, they will look different on another computer with a different set of fonts installed. Also, fonts are matched by name in <acronym title="Cascading Style Sheets">CSS</acronym>, so when you write</p>
<p><code language="css">font-family: "Helvetica", "Arial", sans-serif;</code></p>
<p>you are requesting a font named "Helvetica", then one named "Arial", then the default sans-serif fonts. This is a very common thing for people to write, because Helvetica is a popular choice on Mac, Arial is a popular choice on Windows, and sans-serif is a catch-all. The intention is to select a nice sans-serif font on each platform.</p>
<p>Unfortunately, "Helvetica" can exist on Windows and Linux as well as Mac. Helvetica has been around as a typeface since 1957, and there are different versions of it around &#8211; by what route, or with what degree of intellectual property infringement, I do not know. There are also <a href="http://en.wikipedia.org/wiki/Helvetica#Helvetica">a fair number of variants</a> that your computer might also consider, if they are installed.</p>
<p>On Linux, Helvetica was historically an X bitmap font (ugly, impractical things that are now effectively dead). These days it is generally an fontconfig alias for a free sans-serif font, but renders with iffy hinting and kerning, perhaps to conform to the original font's metrics (ie. it has been shoehorned into exactly the same space, so that printed publications don't come out wrong). I actually find this font quite uncomfortable to read.</p>
<p>On Windows, you may occasionally find Helvetica exists, perhaps even as the same font, installed on its own, or with some software suite, but if you do you'll find several browsers on Windows render fonts with Microsoft's ClearType renderer optimised for legibility, not the Mac's quality-optimised renderer, also used in Safari 3 on Windows. Microsoft own fonts have been tweaked to work well with ClearType &#8211; others may not. Linux is (as ever) more flexible: it's possible to configure the amount of hinting to use through fontconfig, although most users will keep their distribution's defaults.</p>
<p>Ultimately it's an impenetrable picture &#8211; you cannot be sure that the fonts you list will give anything like the browsing experience you were expecting. The same overall picture applies with serif fonts and monospace fonts.</p>
<p>The best solution (unless you want to try downloadable fonts, which I wouldn't recommend for body fonts) is to side-step the specifics of fonts entirely and delegate to the user/browser/operating system. There are three suitable aliases for font families: <code>sans-serif</code>, <code>serif</code>, and <code>monospace</code>. These will reliably give you a good font of that category. There are two other aliases, <code>cursive</code> and <code>fantasy</code> which are too poorly defined &#8211; you could get practically anything.</p>
<p>Is this really the only option? If you're prepared to go to the enormous lengths required, can you not pick a list of named fonts, test broadly and claim it works? Well, yes, if you test broadly enough you can get say 99.9% coverage. Unfortunately, that's not always good enough.</p>
<p>The topic of a site turns out to significantly affect the statistics of users that visit it. For example, a site about Linux will get more Linux hits. A site about using Photoshop will get most hits from people with Adobe Creative Suites installed, and that <a href="http://blogs.adobe.com/typblography/CS3fonts.html">comes with fonts</a>. So as a theme designer, what was 99%+ for you could be 90% for some of the people who use your theme.</p>
<p>So, in summary, stick to the safe fonts: sans-serif, serif and monospace. Fonts that are ubiquitious and designed for the screen are also quite safe &#8211; Arial and Verdana. You might be able to find some other safe places <a href="http://www.codestyle.org/css/font-family/index.shtml">by consulting statistics</a> if you are feeling creatively hemmed in. But please, don't make font assumptions.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.mauveweb.co.uk/2010/02/03/fonts-and-font-family/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Virtual Revolution</title>
		<link>http://blog.mauveweb.co.uk/2010/01/31/virtual-revolution/</link>
		<comments>http://blog.mauveweb.co.uk/2010/01/31/virtual-revolution/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 16:10:45 +0000</pubDate>
		<dc:creator>mauve</dc:creator>
				<category><![CDATA[Media Coverage]]></category>
		<category><![CDATA[The Internet]]></category>

		<guid isPermaLink="false">http://blog.mauveweb.co.uk/?p=357</guid>
		<description><![CDATA[Last night's BBC documentary The Virtual Revolution, available on iPlayer now, is exactly typical of all internet documentaries I have seen, from the generic title (pick one of "The Digital", "The Cyber", "The Virtual" and one of "Revolution", "Renaissance", "Tomorrow" etc.) to using "web" and "internet" interchangeably, to cutting to shots of computer screens showing [...]]]></description>
			<content:encoded><![CDATA[<p>Last night's BBC documentary <em>The Virtual Revolution</em>, <a href="http://www.bbc.co.uk/iplayer/episode/b00qn37q/The_Virtual_Revolution_The_Great_Levelling/">available on iPlayer now</a>, is exactly typical of all internet documentaries I have seen, from the generic title (pick one of "The Digital", "The Cyber", "The Virtual" and one of "Revolution", "Renaissance", "Tomorrow" etc.) to using "web" and "internet" interchangeably, to cutting to shots of computer screens showing something internetty, like repeatedly typing www.com into a browser's address bar (it is a valid domain, but it is enormously more likely to be typed through incompetence), to the intentionality ascribed to the entire edifice, which, they alleged, was deliberately designed to democratise everything ever.</p>
<p>In fact the only unusual thing was the omission of make-up to blend <a href="http://twitter.com/aleksk">Aleks Krotoski's</a> blush red nose into the rest of her face. I don't mean to be personally insulting to Krotoski &#8211; if my nose was coming out bright red on camera I'd want the production team to address it.</p>
<p>The story was woven into a history of the internet as told by "key players and pioneers" including Sir Tim, Youtube, Wikipedia and Arianna Huffington of frequently alt-med promoting rag HuffPo, thus neatly side-stepping the role of the millions of faceless bloggers and web users who pump content into the web and Web 2.0 sites and who are in truth responsible for what the web is today.</p>
<p>Actually, I say sidestepping &#8211; blogs were mentioned.</p>
<blockquote><p>The world of blogging is going through a crisis. Of the more than 130 million blogs active since 2002, it's estimated that over 90% are now dormant.</p></blockquote>
<p>Ok, a lot of people set up blogs and stop posting to them. But ignore that: what they've reversed here is the fact that there are 13 million active blogs on the web. That is a HUGE number. That means there is one <em>active</em> blog for every 130 Internet users.</p>
<p>Youtube in particular is noteworthy only for being the most popular video distribution site. As a site neither pioneering or unique, you wonder how their CEO's opinion could possibly be more valuable than that of it's more popular video bloggers. Incidentally, unlike many sites, such as Facebook, there's almost no drawback to switching to a competitor, such as Vimeo.</p>
<p>Jimmy Wales, founder of Wikipedia, on the other hand, is truly visionary. Nobody would have thought a wiki could scale to the size of an encyclopaedia and beyond without its quality suffering a lot more than Wikipedia's actually does. The result is the most useful site on the Internet outside of Google. Wales did not, of course, invent the wiki or prove the wiki concept itself.</p>
<p>But the main thing this programme gets wrong is simple definitions. The whole episode laments the fact that the internet was supposed to be democratic, but they claim it isn't because everyone uses Facebook, or Youtube, and sites like HuffPo get more traffic than your average blog. The word oligarchy was used.</p>
<p><em>Wrong.</em> People can choose which websites to use or not use. Remember Myspace? Owned by News Corp, one of the world's biggest media companies? What happened to that? I suppose, as oligarchs, they must have decided for us that we weren't going to use it any more, right?</p>
<p>I won't bother with the rest of the series.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.mauveweb.co.uk/2010/01/31/virtual-revolution/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Facebook Account Hacked</title>
		<link>http://blog.mauveweb.co.uk/2010/01/22/facebook-account-hacked/</link>
		<comments>http://blog.mauveweb.co.uk/2010/01/22/facebook-account-hacked/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 23:44:47 +0000</pubDate>
		<dc:creator>mauve</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.mauveweb.co.uk/?p=353</guid>
		<description><![CDATA[Today my Facebook account was hacked. Messages were sent to 42 of my friends, with a random subject and contents of the form:
hi! &#60;recipient's first name&#62;! &#60;link&#62;
All of the messages were shown as sent via Facebook Mobile, which, to my knowledge, I have never used.
I did several things:

I posted on my Facebook wall advising people [...]]]></description>
			<content:encoded><![CDATA[<p>Today my Facebook account was hacked. Messages were sent to 42 of my friends, with a random subject and contents of the form:</p>
<p>hi! &lt;recipient's first name&gt;! &lt;link&gt;</p>
<p>All of the messages were shown as sent via Facebook Mobile, which, to my knowledge, I have never used.</p>
<p>I did several things:</p>
<ol>
<li>I posted on my Facebook wall advising people not to open these messages.</li>
<li>I reported the intrusion to Facebook.</li>
<li>I changed my Facebook password.</li>
<li>Replied manually to every message sent warning people not to click on the links.</li>
</ol>
<p>Below is the reply from Facebook. I've not replied yet, but it's frustrating that Facebook have not listened to a word I've said.</p>
<blockquote><p><strong>Subject:</strong> Re: Messages or Posts Were Sent From My Account, and I Didn't Send Them</p>
<p>Hi,</p>
<p>We have detected suspicious activity on your Facebook account and have reset your password as a security precaution.</p></blockquote>
<p>Er&#8230; I told you about it. You're replying to an e-mail which I sent you about it. Detected my arse.</p>
<blockquote><p>It is possible that malicious software was downloaded to your computer or that your password was stolen by a phishing website designed to look like Facebook. Please carefully follow the steps provided:</p>
<p>1. Run Anti-Virus Software: If your computer has been infected with a virus or with malware, you will need to run anti-virus software to remove these harmful programs and keep your information secure.</p>
<p>For Microsoft<br />
http://www.microsoft.com/protect/viruses/xp/av.mspx<br />
http://www.microsoft.com/protect/computer/viruses/default.mspx</p>
<p>For Apple<br />
http://support.apple.com/kb/HT1222</p></blockquote>
<p>As I told you in my e-mail, I run Linux and it is up-to-date.</p>
<blockquote><p>2. Reset Password: From the Account Settings page, you will need to create a new password. Be sure that you use a complex string of numbers, letters, and punctuation marks that is at least six characters in length. It should also be different from other passwords you use elsewhere on the internet. Here is your new login information:</p>
<p>&lt;redacted&gt;</p></blockquote>
<p>As I told you in my e-mail, I have already changed my password. Changing it again and sending it to me in cleartext e-mail is actually making the security of my account <em>worse</em>.</p>
<blockquote><p>3. Secure Email: Make sure that any email addresses associated with your account are secure, since anyone who can read your email can probably also access your Facebook account. If you believe someone has accessed one of your email accounts, you should change its password.</p></blockquote>
<p>As I told you in my e-mail, I don't believe anyone has access to my e-mail.</p>
<blockquote><p>4. Never Click Suspicious Links: It is possible that your friends could unknowingly send spam, viruses, or malware through Facebook if their accounts are infected. Do not click this material and do not run any .exe files on your computer without knowing what they are. Also, be sure to use the most current version of your browser as they contain important security warnings and protection features.</p></blockquote>
<p>As I said in my e-mail, my operating system is Linux and it is up-to-date. I cannot run any .exe files without serious difficult. In practical terms, it is very unlikely to have been compromised.</p>
<blockquote><p>5. Log in at Facebook.com: Make sure that when you access the site, you always log in from a legitimate Facebook page with the facebook.com domain. If something looks or feels suspicious, go directly to www.facebook.com to log in.</p></blockquote>
<p>Please. If I want to visit Facebook I select it from the AwesomeBar. I don't even receive e-mails from Facebook any more because I've disabled them, so I'd spot a phishing attack a mile off.</p>
<blockquote><p>6. Learn More: Please visit the following page for further information about Facebook security and information on reporting material http://www.facebook.com/security</p></blockquote>
<p>Wow, practical.</p>
<blockquote><p>Finally, if this did not resolve your issue, please revisit the Help Center to select the appropriate contact form and submit a new inquiry:</p>
<p>http://www.facebook.com/help/?ref=pf</p></blockquote>
<p>So that you can ignore what I say all over again?</p>
<blockquote><p>Thanks,</p>
<p>The Facebook Team</p></blockquote>
<p>Thanks for nothing.</p>
<p>These e-mails include random links, and it's probably that the nature of the attack could be uncovered by finding out more about what these links contain. It seems very probable that the page you would see will try in some way to continue the attack. That is the definition of a worm: an attack that propagates itself over the network. I tried downloading the contents of a link with wget. It timed out.</p>
<p>Worms are <a href="http://mashable.com/2009/11/23/avg-facebook-worm/">not unknown</a> on Facebook. As always, think very carefully before clicking on untrusted links, installing untrusted apps, and check carefully that the site you are entering your credentials into is the one you expect.</p>
<p>My thanks to Sammy and Marit for alerting me to the attack.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.mauveweb.co.uk/2010/01/22/facebook-account-hacked/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>What is Twitter?</title>
		<link>http://blog.mauveweb.co.uk/2009/12/27/what-is-twitter/</link>
		<comments>http://blog.mauveweb.co.uk/2009/12/27/what-is-twitter/#comments</comments>
		<pubDate>Sun, 27 Dec 2009 12:24:32 +0000</pubDate>
		<dc:creator>mauve</dc:creator>
				<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://blog.mauveweb.co.uk/?p=344</guid>
		<description><![CDATA[Over the past few months, I have found myself in conversations about Twitter. Judging from the way people have voiced their preconceptions, Twitter is one of the more misunderstood websites on the intertubes, with common misconceptions including "Why would I want to read about every little thing someone is doing?", "It's just the latest fad" [...]]]></description>
			<content:encoded><![CDATA[<p>Over the past few months, I have found myself in conversations about Twitter. Judging from the way people have voiced their preconceptions, Twitter is one of the more misunderstood websites on the intertubes, with common misconceptions including "Why would I want to read about every little thing someone is doing?", "It's just the latest fad" and "I don't know anybody on Twitter". Trying to avoid sounding like a shill, I would like to address these misconceptions.</p>
<p>Twitter is usually described as a <strong>microblogging</strong> service, a term which is not really descriptive but slightly disingenuous. Users write 140-character <strong>tweets</strong>. They can select other users to <strong>follow</strong>, thus building a stream of tweets that, hopefully, matches your interests. They can reply to or mention other users. It's also possible to <strong>retweet</strong> or "RT" a tweet, distributing it to your own followers.</p>
<p>This misses the point. Twitter provides three main things: identity, a voice, and the ability to build channels from other users' voices.</p>
<p>Supporting this, it also provides numerous ways to find different voices to add into the mix, with searches, and links from other tweets, and trending topics. Unlike other social networks you are generally free to follow whomever seems interesting: your voice is public, your followers are not your friends but those interested in your tweets.</p>
<p>Your identity, tweets and channels can be used on third-party sites as well as Twitter, which means that Twitter can be used as a platform for other applications. Whereas Facebook provides a photo albums tool &#8211; like it or lump it &#8211; use whatever photo-sharing website you like with Twitter. There are several in widespread use. It's quite a democratic system. You can often log into third party websites with your Twitter identity, tying your actions there to your Twitter voice.</p>
<p>Twitter is more like <acronym title="Internet Relay Chat">IRC</acronym> than blogs; the short tweet length demands snippets, ideas, jokes, links and &#8211; though it's not quite a 'real-time' as <acronym title="Internet Relay Chat">IRC</acronym> &#8211; it's quite possible to conduct a conversation.</p>
<p>People do not tweet about every little thing they are doing. Such a Twitterer would not be interesting to follow. It's not just the latest fad; it's a platform for sharing news and interesting tidbits that has already broken major news stories, made and buried film releases, and on which is built a rich and growing collection of social tools that, unlike Facebook, compete with and improve upon one another. And you don't need to know people, because there are already thousands of people tweeting about exactly those things you are interested in. Follow them, reply to them&#8230; maybe you'll even make some new friends. When's the last time you did that purely on Facebook?</p>
<p>The best advice I can give to anyone who has heard the buzz about, but didn't "get" Twitter, is just to try it. Twitter is new, and people are constantly discovering new ways to use it. Tweet about what interests you. Follow people who interest you. If you do, you'll probably find Twitter interesting and engaging.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.mauveweb.co.uk/2009/12/27/what-is-twitter/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>The dangers of double resizing</title>
		<link>http://blog.mauveweb.co.uk/2009/10/25/dangers-of-double-resizing/</link>
		<comments>http://blog.mauveweb.co.uk/2009/10/25/dangers-of-double-resizing/#comments</comments>
		<pubDate>Sun, 25 Oct 2009 14:39:34 +0000</pubDate>
		<dc:creator>mauve</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.mauveweb.co.uk/?p=330</guid>
		<description><![CDATA[Amazon have made a bit of an mess of building their thumbnails. On their homepage I was greeted with these:

The moiré pattern of blurriness is an artifact &#8211; evidence of the fact that these "Look inside" thumbnails are caused by resizing already thumbnailed images &#8211; probably the thumbnail of the book cover without the "Look [...]]]></description>
			<content:encoded><![CDATA[<p>Amazon have made a bit of an mess of building their thumbnails. On their homepage I was greeted with these:</p>
<p style="text-align: center"><img class="alignnone size-full wp-image-331" title="51PVI7LcjDL._SL123_PIsitb-sticker-arrow-sm,TopRight,8,-14_OU02_" src="http://blog.mauveweb.co.uk/wp-content/uploads/2009/10/51PVI7LcjDL._SL123_PIsitb-sticker-arrow-smTopRight8-14_OU02_.jpg" alt="51PVI7LcjDL._SL123_PIsitb-sticker-arrow-sm,TopRight,8,-14_OU02_" width="89" height="135" /><img src="http://blog.mauveweb.co.uk/wp-content/uploads/2009/10/51VA3NskorL._SL123_PIsitb-sticker-arrow-smTopRight8-14_OU02_.jpg" alt="51VA3NskorL._SL123_PIsitb-sticker-arrow-sm,TopRight,8,-14_OU02_" title="51VA3NskorL._SL123_PIsitb-sticker-arrow-sm,TopRight,8,-14_OU02_" width="84" height="135" class="alignnone size-full wp-image-332" /></p>
<p>The moiré pattern of blurriness is an artifact &#8211; evidence of the fact that these "Look inside" thumbnails are caused by resizing already thumbnailed images &#8211; probably the thumbnail of the book cover without the "Look inside" banner. To avoid this on your sites, you need to build thumbnails from a sufficiently high-resolution image &#8211; ideally a high-resolution original. In practice, it can be faster and less memory-hungry to thumbnail from a medium-sized image, and this will generally not show visible artifacts. Of course, if you've already got a high-resolution image loaded into memory, you can side-step all of the quality issues by building all of the thumbnails you might need from it at once. Note also that you need to resize down enough to hide any <acronym title="Joint Photographics Experts Group"><acronym title="Joint Photographic Experts Group Image">JPEG</acronym></acronym> compression artifacts.</p>
<p>To understand how the tell-tale moiré pattern comes about, let's imagine the source and destination pixel grids:</p>
<p><img src="http://blog.mauveweb.co.uk/wp-content/uploads/2009/10/amazon-grids.png" alt="amazon-grids" title="amazon-grids" width="385" height="252" class="aligncenter size-full wp-image-333" /></p>
<p>When we overlay them you can see the moiré pattern appearing.</p>
<p><img src="http://blog.mauveweb.co.uk/wp-content/uploads/2009/10/amazon-moire.png" alt="amazon-moire" title="amazon-moire" width="151" height="252" class="aligncenter size-full wp-image-334" /></p>
<p>Where the grid intersections are aligned, one source pixel maps fairly closely to a destination pixel, which makes that spot in the thumbnail crisp. But as you move away from those spots and the error builds up, the grid intersections disalign, and one source pixel is smeared over four destination pixels. That makes for a blurry spot.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.mauveweb.co.uk/2009/10/25/dangers-of-double-resizing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Answers.com double-click</title>
		<link>http://blog.mauveweb.co.uk/2009/10/16/answers-com-double-click/</link>
		<comments>http://blog.mauveweb.co.uk/2009/10/16/answers-com-double-click/#comments</comments>
		<pubDate>Fri, 16 Oct 2009 09:28:28 +0000</pubDate>
		<dc:creator>mauve</dc:creator>
				<category><![CDATA[Usability]]></category>

		<guid isPermaLink="false">http://blog.mauveweb.co.uk/2009/10/16/answers-com-double-click/</guid>
		<description><![CDATA[A few weeks ago I mentioned word-selection by double-click.
I have discovered that Answers.com improves on this with a rather nifty hidden feature: if you double click on any word on the page it will immediately look that word up in Answers.com using AJAX!
This looks very innovative to me. Using the rich Javascript API to augment [...]]]></description>
			<content:encoded><![CDATA[<p>A few weeks ago I mentioned word-selection by double-click.</p>
<p>I have discovered that <a href="http://www.answers.com/">Answers.com</a> improves on this with a rather nifty hidden feature: if you double click on any word on the page it will immediately look that word up in Answers.com using <acronym title="Asynchronous JavaScript and XML">AJAX</acronym>!</p>
<p>This looks very innovative to me. Using the rich Javascript <acronym title="	Application Programming Interface">API</acronym> to augment the browser's existing functionality is very pleasant, but here the product is a dictionary/reference site that is totally cross-linked! Poor old Wikipedia seems rather limited by comparison (though, to be fair, there are massive advantages to conventional links. This technique is not a replacement for that).</p>]]></content:encoded>
			<wfw:commentRss>http://blog.mauveweb.co.uk/2009/10/16/answers-com-double-click/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

