<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Posts on blog.dataforce.org.uk</title>
    <link>https://blog.dataforce.org.uk/index/</link>
    <description>Recent content in Posts on blog.dataforce.org.uk</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-gb</language>
    <lastBuildDate>Sun, 25 Jun 2023 15:45:24 +0000</lastBuildDate>
    
        <atom:link href="https://blog.dataforce.org.uk/index/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>Remote LVM-on-LUKS (via ISCSI) with automatic decrypt on boot</title>
      <link>https://blog.dataforce.org.uk/2023/06/remote-crypttab-on-boot/</link>
      <pubDate>Sun, 25 Jun 2023 15:45:24 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2023/06/remote-crypttab-on-boot/</guid>
      <description>&lt;p&gt;I have recently added some iscsi-backed storage to my &lt;a href=&#34;https://www.proxmox.com/en/&#34;&gt;proxmox&lt;/a&gt;-based server environment, primarily as an off-server location to store backup data.&lt;/p&gt;
&lt;p&gt;For a multitude of reasons, such as the sensitive nature of the data, the fact that the physical storage lies outside of my control, and just good security hygiene - I wanted to ensure that the data is all encrypted at rest.&lt;/p&gt;
&lt;p&gt;I wanted to be able to use this iscsi as a storage target for proxmox allowing me to just add the volumes to VMs allowing HA, and I didn&amp;rsquo;t want to have to do encryption inside every VM incase I accidentally forgot to enable it for one of the VMs (remember, the storage is hosted external to me so I have no control over the physical access to it) so to do this I have made use of LUKS encryption on the iscsi block device that I am presented with and then I run LVM over the top of this. (&lt;a href=&#34;https://wiki.archlinux.org/title/dm-crypt/Encrypting_an_entire_system#LVM_on_LUKS&#34;&gt;LVM-on-LUKS&lt;/a&gt; as-opposed to &lt;a href=&#34;https://wiki.archlinux.org/title/dm-crypt/Encrypting_an_entire_system#LUKS_on_LVM&#34;&gt;LUKS-on-LVM&lt;/a&gt;)&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Updated Theme</title>
      <link>https://blog.dataforce.org.uk/2022/02/updated-theme/</link>
      <pubDate>Tue, 08 Feb 2022 05:06:54 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2022/02/updated-theme/</guid>
      <description>&lt;p&gt;Once again, I have &lt;a href=&#34;https://blog.dataforce.org.uk/2016/05/its-been-a-while/&#34;&gt;replaced the theme&lt;/a&gt; of this blog.&lt;/p&gt;
&lt;p&gt;Unlike the previous theme, this one is actually one I mostly ended up designing myself rather than just finding one that I mostly liked and running with it, and given that, I figured I&amp;rsquo;d talk a little bit about the thoughts behind it and how it came to be and what else I&amp;rsquo;ve done behind the scenes.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Docker Swarm Cluster Improvements</title>
      <link>https://blog.dataforce.org.uk/2021/08/docker-swarm-cluster-improvements/</link>
      <pubDate>Sat, 21 Aug 2021 22:23:00 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2021/08/docker-swarm-cluster-improvements/</guid>
      <description>&lt;p&gt;Since my &lt;a href=&#34;https://blog.dataforce.org.uk/2019/02/docker-swarm-with-ceph/&#34;&gt;previous&lt;/a&gt; &lt;a href=&#34;https://blog.dataforce.org.uk/2019/07/upgrading-ceph-in-docker-swarm/&#34;&gt;posts&lt;/a&gt; about running docker-swarm with ceph, I&amp;rsquo;ve been using this fairly extensively in production and made some changes to the setup that follows on from the previous posts.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Fun with Dell S4048 and ONIE</title>
      <link>https://blog.dataforce.org.uk/2020/11/dell-s4048-onie-fun/</link>
      <pubDate>Tue, 03 Nov 2020 03:01:26 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2020/11/dell-s4048-onie-fun/</guid>
      <description>&lt;p&gt;In &lt;code&gt;$DayJob&lt;/code&gt; we make use of Dell S4048-ON Switches for 10G Top-of-Rack (ToR) switching and also sometimes 10G Aggregation/Core for smaller deployments. They&amp;rsquo;re fairly flexible devices with a high number of 10G ports, some 40Gs and they can do L3 ports and L2 ports. You can also run them either Stacked or in VLT mode for redundancy purposes.&lt;/p&gt;
&lt;p&gt;In addition these things use ONIE (Open Network Install Environment) and can run different firmware images - though we almost exclusively run these with DNOS 9 which is the Force10 FTOS code that Dell acquired some time ago rather than DNOS 10.&lt;/p&gt;
&lt;p&gt;One evening, I was tasked with an &amp;ldquo;emergency&amp;rdquo; build request. We had some kit being shipped to a remote PoP the following day and the intended routers were delayed, so we needed to get something quickly and temporarily in place to take a BGP Transit Feed and deliver VRRP to the rest of the kit. A spare S4048 we had lying around would do the job sufficiently for the time period needed. I figured it wouldn&amp;rsquo;t take too long to get the base config needed and get it ready to be shipped with the rest of the kit.&lt;/p&gt;
&lt;p&gt;So I got the Datacenter to rack/cable/console it so that I could begin configuration then set aside some time in the evening to do the work.&lt;/p&gt;
&lt;p&gt;As I was watching the switch boot up I noticed something odd. Turns out the last engineer who had used this device had chosen to install the OpenSwitch OPX ONIE firmware on it instead of the usual DNOS9 firmware. So much for my quick and easy config.&lt;/p&gt;
&lt;p&gt;At this point, I could have just reloaded the device into the ONIE installer environment and installed DNOS9 and been done with it all. But, I had a fairly open evening, and I&amp;rsquo;d not yet really played about much with any of the alternative ONIE OSes, so armed with my Yak Sheers, I thought I&amp;rsquo;d have a look around.&lt;/p&gt;
&lt;p&gt;(After all this, I then re-imaged the device onto our standard deployment image of DNOS9 and completed the required config work that I was supposed to be doing.)&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Cisco XConnect L2Protocol Handling</title>
      <link>https://blog.dataforce.org.uk/2020/04/cisco-l2protocol-handling/</link>
      <pubDate>Mon, 27 Apr 2020 03:06:10 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2020/04/cisco-l2protocol-handling/</guid>
      <description>&lt;p&gt;In &lt;code&gt;$DayJob&lt;/code&gt; we make fairly extensive use of MPLS ATOM Pseudowires (XConnects) between our various datacenter locations to enable services in different sites to talk to each other at layer2.&lt;/p&gt;
&lt;p&gt;The way I describe this to customers is that in essence these act as a &amp;ldquo;long cable&amp;rdquo; from Point-A to Point-B. The customer gets a cable at each side to connect to their kit, but in the middle of it there is magic that routes the packets over our network rather than an actual long-cable. Packets that enter 1 side will be pushed out the other side, and vice-versa. We don&amp;rsquo;t need to know or care what these packets are, we are just transparently transporting them.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Upgrading Ceph in Docker Swarm</title>
      <link>https://blog.dataforce.org.uk/2019/07/upgrading-ceph-in-docker-swarm/</link>
      <pubDate>Mon, 29 Jul 2019 02:02:22 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2019/07/upgrading-ceph-in-docker-swarm/</guid>
      <description>&lt;p&gt;This post is a followup to an &lt;a href=&#34;https://blog.dataforce.org.uk/2019/02/docker-swarm-with-ceph/&#34;&gt;earlier blog bost&lt;/a&gt; regarding setting up a docker-swarm cluster with ceph.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been running this cluster for a while now quite happily however since setting it up, a new version of ceph has been released - nautilus - so now it&amp;rsquo;s time for some upgrades.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This post is out of date now.&lt;/p&gt;
&lt;p&gt;I would suggest looking at &lt;a href=&#34;https://blog.dataforce.org.uk/2021/08/docker-swarm-cluster-improvements/&#34;&gt;this post&lt;/a&gt; and using the docker-compose based upgrade workflow instead, up to the housekeeping part.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;ve mostly followed &lt;a href=&#34;https://docs.ceph.com/docs/master/releases/nautilus/#upgrading-from-mimic-or-luminous&#34;&gt;https://docs.ceph.com/docs/master/releases/nautilus/#upgrading-from-mimic-or-luminous&lt;/a&gt; but adapted it for the fact we&amp;rsquo;re running everything in docker. I recommend that you have a read though this yourself first to have an idea of what we are doing and why.&lt;/p&gt;
&lt;p&gt;(It&amp;rsquo;s worth noting at this point that this guide was mostly written after the fact based on command history so I may have missed something. It&amp;rsquo;s always a good idea to do this on a test cluster first, or in a maintenance window!)&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Fun with TOTP Codes</title>
      <link>https://blog.dataforce.org.uk/2019/03/fun-with-totp-codes/</link>
      <pubDate>Fri, 29 Mar 2019 04:20:00 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2019/03/fun-with-totp-codes/</guid>
      <description>&lt;p&gt;This all started with a comment I overheard at work from a colleague talking about a 2FA implementation on a service they were using.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;It works fine on everything except Google Authenticator on iPhone.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;hellip; What? This comment alone immediately piqued my interest, I stopped what I was doing, turned round, and asked him to explain.&lt;/p&gt;
&lt;p&gt;He explained that a service he was using provided 2FA support using TOTP codes. As is normal, they provided a QR Code, you scanned it with your TOTP application (Google Authenticator or Authy or so), then you typed in the verification code - and it worked for both Google Authenticator and Authy on his Android phone, but only with Authy and not Google Authenticator on another colleagues iPhone.&lt;/p&gt;
&lt;p&gt;This totally &lt;a href=&#34;https://xkcd.com/356/&#34;&gt;nerd sniped&lt;/a&gt; me, and I just had to take a look.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Docker Swarm with Ceph for cross-server files</title>
      <link>https://blog.dataforce.org.uk/2019/02/docker-swarm-with-ceph/</link>
      <pubDate>Sun, 10 Feb 2019 21:36:54 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2019/02/docker-swarm-with-ceph/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been wanting to play with Docker Swarm for a while now for hosting containers, and finally sat down this weekend to do it.&lt;/p&gt;
&lt;p&gt;Something that has always stopped me before now was that I wanted to have some kind of cross-site storage but I don&amp;rsquo;t have any kind of SAN storage available to me just standalone hosts. I&amp;rsquo;ve been able to work around this using ceph on the nodes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; I&amp;rsquo;ve never used ceph before, I don&amp;rsquo;t really know what I&amp;rsquo;m doing with ceph, so this is all a bit of guesswork. I used &lt;a href=&#34;https://geek-cookbook.funkypenguin.co.nz/ha-docker-swarm/shared-storage-ceph/&#34;&gt;Funky Penguin&amp;rsquo;s Geek Cookbook&lt;/a&gt; as a basis for some of this, though some things have changed since then, and I&amp;rsquo;m using base-centOS not AtomicHost (I tried AtomicHost, but wanted a newer-version of docker so switched away).&lt;/p&gt;
&lt;p&gt;All my physical servers run &lt;a href=&#34;https://www.proxmox.com/en/&#34;&gt;Proxmox&lt;/a&gt;, and this is no exception. On 3 of these host nodes I created a new VM (1 per node) to be part of the cluster. These all have 3 disks, 1 for the base OS, 1 for Ceph, 1 for cloud-init (The non-cloud-init disks are all SCSI with individual iothreads).&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Advent of Code Benchmarking</title>
      <link>https://blog.dataforce.org.uk/2018/08/advent-of-code-benchmarking/</link>
      <pubDate>Sat, 08 Dec 2018 18:19:10 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2018/08/advent-of-code-benchmarking/</guid>
      <description>&lt;p&gt;For &lt;a href=&#34;https://github.com/shanemcc/aoc-2015&#34;&gt;a&lt;/a&gt; &lt;a href=&#34;https://github.com/shanemcc/aoc-2016&#34;&gt;few&lt;/a&gt; &lt;a href=&#34;https://github.com/shanemcc/aoc-2017&#34;&gt;years&lt;/a&gt; &lt;a href=&#34;https://github.com/shanemcc/aoc-2018&#34;&gt;now&lt;/a&gt; I&amp;rsquo;ve been enjoying &lt;a href=&#34;https://twitter.com/ericwastl&#34;&gt;Eric Wastl&lt;/a&gt;&amp;rsquo;s &lt;a href=&#34;https://adventofcode.com/&#34;&gt;Advent of Code&lt;/a&gt;. For those unaware, &lt;a href=&#34;https://adventofcode.com/2018/&#34;&gt;each&lt;/a&gt; &lt;a href=&#34;https://adventofcode.com/2017/&#34;&gt;year&lt;/a&gt; &lt;a href=&#34;https://adventofcode.com/2016/&#34;&gt;since&lt;/a&gt; &lt;a href=&#34;https://adventofcode.com/2015/&#34;&gt;2015&lt;/a&gt; Advent of Code provides a 2-part coding challenge every day from December 1st to December 25th.&lt;/p&gt;
&lt;p&gt;In previous years, Myself and &lt;a href=&#34;https://chameth.com/&#34;&gt;Chris&lt;/a&gt; have been fairly informally trying to see who was able to produce the fastest code (Me in PHP, Chris in Python). In the final week of last year to assist with this, &lt;a href=&#34;https://github.com/ShaneMcC/aoc-2017/tree/a1b14dc0ca63a64ae7dae2614b18f70fd6afc1a3&#34;&gt;we&lt;/a&gt; &lt;a href=&#34;https://github.com/csmith/aoc-2017/commit/dbc1ecda90f6189c202993a6b84848b9f833008b&#34;&gt;both&lt;/a&gt; made our repos run in &lt;code&gt;Docker&lt;/code&gt; and produce &lt;code&gt;time&lt;/code&gt; output for each day.&lt;/p&gt;
&lt;p&gt;This allowed us to run each other&amp;rsquo;s code locally to compare fairly without needing to install the other&amp;rsquo;s dev environment, and made the testing a bit fairer as it was no longer dependant on who had the faster CPU when running their own solution. For the rest of the year this was fine and we carried on as normal. As we got to the end I remarked it would be fun to have a web interface that automatically dealt with it and showed us the scores, but there was obviously no point in doing that once the year was over. Maybe in a future year&amp;hellip;&lt;/p&gt;
&lt;p&gt;Fast forward to this year. Myself and Chris (and &lt;a href=&#34;https://cjn.me.uk/&#34;&gt;ChrisN&lt;/a&gt;) coded up our Day 1 solutions as normal and then some &lt;a href=&#34;https://greboid.com/&#34;&gt;other&lt;/a&gt; &lt;a href=&#34;https://www.simonmott.co.uk/&#34;&gt;friends&lt;/a&gt; started doing it for the first time. I remembered my plans from the previous year and suggested everyone should also docker-ify their repos&amp;hellip; and &lt;a href=&#34;https://github.com/cnorthwood/adventofcode/commit/785e08e8246b86ce88dc7766a628ec59ea94c19c&#34;&gt;so&lt;/a&gt; &lt;a href=&#34;https://github.com/greboid/aoc-2018/commit/e4bfb6295085e27c7b8c63dcbb6af44f0851bfc7&#34;&gt;they&lt;/a&gt; &lt;a href=&#34;https://github.com/tsumaru720/AOC/commit/7e53b2029bc3b4d891c685977994dea019485c1c&#34;&gt;agreed&lt;/a&gt;&amp;hellip;&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>mdadm RAID with Proxmox</title>
      <link>https://blog.dataforce.org.uk/2018/06/proxmox-mdadm-raid/</link>
      <pubDate>Mon, 18 Jun 2018 01:47:07 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2018/06/proxmox-mdadm-raid/</guid>
      <description>&lt;p&gt;I recently acquired a new server with 2 drives that I intended to use as RAID1 for a virtualisation host for various things.&lt;/p&gt;
&lt;p&gt;My hypervisor of choice is &lt;a href=&#34;https://www.proxmox.com/en/&#34;&gt;Proxmox&lt;/a&gt; (For a few reasons, Support for KVM and LXC primarily, but the fact it&amp;rsquo;s debian based is a nice bonus, and I really dislike the occasionally-braindead networking implementation from vmware which rules out ESXi)&lt;/p&gt;
&lt;p&gt;This particular server does not have a RAID card, so I needed to use a software raid implementation. Out of the box for RAID1 on Proxmox you need to use ZFS, however To keep this box similar to others I have I wanted to use ext4 and mdadm. So we&amp;rsquo;re going have to do a bit of manual poking to get this how we need it.&lt;/p&gt;
&lt;p&gt;This post is mostly an aide-memoire for myself for the future.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>DNS Hosting - Part 3: Putting it all together</title>
      <link>https://blog.dataforce.org.uk/2018/06/dns-hosting-part-3/</link>
      <pubDate>Sun, 10 Jun 2018 18:31:21 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2018/06/dns-hosting-part-3/</guid>
      <description>&lt;p&gt;In my &lt;a href=&#34;https://blog.dataforce.org.uk/2018/01/dns-hosting-part-1/&#34;&gt;previous&lt;/a&gt; &lt;a href=&#34;https://blog.dataforce.org.uk/2018/01/dns-hosting-part-2/&#34;&gt;posts&lt;/a&gt; I discussed the history leading up to, and the eventual rewrite of my DNS hosting solution. So this post will (finally) talk briefly about how it all runs in production on &lt;a href=&#34;https://mydnshost.co.uk/&#34;&gt;MyDNSHost&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Shortly before the whole rewrite I&amp;rsquo;d found myself playing around a bit with &lt;code&gt;Docker&lt;/code&gt; for another project, so I decided early on that I was going to make use of Docker for the main bulk of the setup to allow me to not need to worry about incompatibilities between different parts of the stack that needed different versions of things, and to update different bits at different times.&lt;/p&gt;
&lt;p&gt;The system is split up into a number of containers (and could probably be split up into more).&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>DNS Hosting - Part 2: The rewrite</title>
      <link>https://blog.dataforce.org.uk/2018/01/dns-hosting-part-2/</link>
      <pubDate>Sat, 20 Jan 2018 17:25:32 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2018/01/dns-hosting-part-2/</guid>
      <description>&lt;p&gt;In my &lt;a href=&#34;https://blog.dataforce.org.uk/2018/01/dns-hosting-part-1/&#34;&gt;previous post about DNS Hosting&lt;/a&gt; I discussed the history leading up to when I decided I needed a better personal DNS hosting solution. I decided to code one myself to replace what I had been using previously.&lt;/p&gt;
&lt;p&gt;I decided there was a few things that were needed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fully-Featured API
&lt;ul&gt;
&lt;li&gt;I wanted full control over the zone data programmatically, everything should be possible via the API.&lt;/li&gt;
&lt;li&gt;The API should be fully documented.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Fully-Featured default web interface.
&lt;ul&gt;
&lt;li&gt;There should be a web interface that fully implements the API. Just because there is an API shouldn&amp;rsquo;t mean it &lt;em&gt;has&lt;/em&gt; to be used to get full functionality.&lt;/li&gt;
&lt;li&gt;There should exist nothing that only the default web ui can do that can&amp;rsquo;t be done via the API as well.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Multi-User support
&lt;ul&gt;
&lt;li&gt;I also host some DNS for people who aren&amp;rsquo;t me, they should be able to manage their own DNS.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Domains should be shareable between from users
&lt;ul&gt;
&lt;li&gt;Every user should be able to have their own account&lt;/li&gt;
&lt;li&gt;User accounts should be able to be granted access to domains that they need to be able to access
&lt;ul&gt;
&lt;li&gt;Different users should have different access levels:
&lt;ul&gt;
&lt;li&gt;Some just need to see the zone data&lt;/li&gt;
&lt;li&gt;Some need to be able to edit it&lt;/li&gt;
&lt;li&gt;Some need to be able to grant other users access&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Backend Agnostic
&lt;ul&gt;
&lt;li&gt;The authoritative data for the zones should be stored independently from the software used to serve it to allow changing it easily in future&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These were the basic criteria and what I started off with when I designed &lt;a href=&#34;https://mydnshost.co.uk&#34;&gt;MyDNSHost&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>HUGO PPA</title>
      <link>https://blog.dataforce.org.uk/2018/01/hugo-ppa/</link>
      <pubDate>Mon, 08 Jan 2018 09:39:47 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2018/01/hugo-ppa/</guid>
      <description>&lt;p&gt;I run ubuntu on my servers, and since moving to Hugo, I wanted to make sure I was using the latest version available.&lt;/p&gt;
&lt;p&gt;The ubuntu repos currently contain hugo version 0.15 in Xenial, and 0.25.1 in artful (And the next version, bionic only contains 0.26). The latest version of hugo (as of today) is currently 0.32.2 - so the main repos are quite a bit out of date.&lt;/p&gt;
&lt;p&gt;So to work around this, I&amp;rsquo;ve setup an apt repo that tracks the latest release for hugo, which can be installed and used like so:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo wget http://packages.dataforce.org.uk/packages.dataforce.org.uk_hugo.list -O /etc/apt/sources.list.d/packages.dataforce.org.uk_hugo.list
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wget -qO- http://packages.dataforce.org.uk/pubkey.gpg &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sudo apt-key add -
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt-get install hugo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This repo tracks the latest hugo debs in all 4 of the architectures supported: &lt;code&gt;amd64&lt;/code&gt;, &lt;code&gt;i386&lt;/code&gt;, &lt;code&gt;armhf&lt;/code&gt; and &lt;code&gt;arm64&lt;/code&gt; and should stay automatically up to date with the latest version.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>DNS Hosting - Part 1: History</title>
      <link>https://blog.dataforce.org.uk/2018/01/dns-hosting-part-1/</link>
      <pubDate>Wed, 03 Jan 2018 01:15:06 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2018/01/dns-hosting-part-1/</guid>
      <description>&lt;p&gt;For as long as I can remember I&amp;rsquo;ve hosted my own DNS. Originally this was via cpanel on a single server that I owned and then after a while I moved to a new server away from cpanel and moved to doing everything myself (web, email, dns) - hand-editing zone files and serving them via BIND.&lt;/p&gt;
&lt;p&gt;This was great for learning, and this worked well for a while but eventually I ended up with more servers, and a lot more domains. Manually editing DNS Zone files and reloading BIND was somewhat of a chore any time I was developing things or spinning up new services or moving things between servers - I wanted something web-based.&lt;/p&gt;
&lt;p&gt;There wasn&amp;rsquo;t many free/cheap providers that did what I wanted (This was long before &lt;a href=&#34;https://cloudflare.com/&#34;&gt;Cloudflare&lt;/a&gt; or &lt;a href=&#34;https://aws.amazon.com/route53/&#34;&gt;Route 53&lt;/a&gt;), so around 2007 I did what any (&lt;em&gt;in&lt;/em&gt;)sane person would do - I wrote a custom control panel for managing domains. and email. and it was multi-user. and it had billing support. and a half-baked ticket-system&amp;hellip; ok, so I went a bit overboard with the plans for it. But mainly it controlled DNS and throughout it&amp;rsquo;s lifetime that was the only bit that was &amp;ldquo;completed&amp;rdquo; and fully functional.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Moving to Hugo</title>
      <link>https://blog.dataforce.org.uk/2017/12/moving-to-hugo/</link>
      <pubDate>Sat, 30 Dec 2017 04:56:26 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2017/12/moving-to-hugo/</guid>
      <description>&lt;p&gt;For a while now I&amp;rsquo;ve been thinking of moving this blog to a statically generated site rather than using wordpress.&lt;/p&gt;
&lt;p&gt;There are a number of reasons for this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I can version-control the content rather than relying on wordpress database backups.&lt;/li&gt;
&lt;li&gt;It renders quicker&lt;/li&gt;
&lt;li&gt;I don&amp;rsquo;t actually use any of the wordpress features, so it&amp;rsquo;s just bloat, and a potential security hole.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I&amp;rsquo;ve seen &lt;a href=&#34;https://chameth.com/&#34;&gt;Chris&lt;/a&gt; successfully use &lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt; for his site and it seems to do exactly what I want, So I took the opportunity during the Christmas break to spend some time converting my blog from Wordpress to Hugo.&lt;/p&gt;
&lt;p&gt;Actually doing this was a multi-stage process.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>…</title>
      <link>https://blog.dataforce.org.uk/2017/05/104979/</link>
      <pubDate>Sun, 28 May 2017 01:34:18 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2017/05/104979/</guid>
      <description>&lt;p&gt;It did not help.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>It’s been a while…</title>
      <link>https://blog.dataforce.org.uk/2016/05/its-been-a-while/</link>
      <pubDate>Sat, 28 May 2016 19:59:22 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2016/05/its-been-a-while/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s been a while since I updated this. Not through a lack of wanting to, more a combination of things - lack of time, lack of anything worth writing, hating the old blog theme&amp;hellip;&lt;/p&gt;
&lt;p&gt;So I&amp;rsquo;ve replaced the theme!&lt;/p&gt;
&lt;p&gt;Maybe that&amp;rsquo;ll help.&lt;/p&gt;
&lt;p&gt;It probably won&amp;rsquo;t.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Limiting the effectiveness of DNS Amplification</title>
      <link>https://blog.dataforce.org.uk/2013/08/limiting-the-effectiveness-of-dns-amplification/</link>
      <pubDate>Sat, 03 Aug 2013 02:25:19 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2013/08/limiting-the-effectiveness-of-dns-amplification/</guid>
      <description>&lt;p&gt;I recently had the misfortune of having a server I am responsible for used as a target for DNS Amplification, and thought I&amp;rsquo;d share how I countered this. (Whilst this was effective for me, your mileage may vary, but if this actually helps someone then it&amp;rsquo;s worth posting about.)&lt;/p&gt;
&lt;p&gt;This particular server was the main recursor for the site that it was located at (And this was correctly limited not to allow open recursion), but was also authoritative for a small selection of domains. (Yes I know mixing recursors and resolvers is bad.)&lt;/p&gt;
&lt;p&gt;The problem only came about when I needed to relocate the server to another site. In order to ensure continuity of service whilst the nameserver IP change propagated, I added some port-forwards at the old site that redirected DNS traffic to the new site. This however meant that all DNS traffic going towards the server came from an IP that was trusted for recursion. Oops.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Website Reshuffle</title>
      <link>https://blog.dataforce.org.uk/2012/09/website-reshuffle/</link>
      <pubDate>Sun, 23 Sep 2012 17:37:44 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2012/09/website-reshuffle/</guid>
      <description>&lt;p&gt;Over the past few weekends I&amp;rsquo;ve been (slowly) working on moving my websites around a bit so that things are all in once place, and in the case of this blog, no longer hosted on my home ADSL connection.&lt;/p&gt;
&lt;p&gt;At the moment all non-existent pages on &lt;a href=&#34;http://home.dataforce.org.uk/&#34;&gt;http://home.dataforce.org.uk/&lt;/a&gt;, &lt;a href=&#34;http://dataforce.org.uk/&#34;&gt;http://dataforce.org.uk/&lt;/a&gt; and &lt;a href=&#34;http://shanemcc.co.uk/&#34;&gt;http://shanemcc.co.uk/&lt;/a&gt; will now redirect to the equivalent link on &lt;a href=&#34;http://blog.dataforce.org.uk/&#34;&gt;http://blog.dataforce.org.uk/&lt;/a&gt;, over time I will work on moving all public content from these sites over to here (There isn&amp;rsquo;t much, they&amp;rsquo;ve mostly been used as dumping grounds!)&lt;/p&gt;
&lt;p&gt;After this &lt;a href=&#34;http://home.dataforce.org.uk/&#34;&gt;http://home.dataforce.org.uk/&lt;/a&gt; will be primarily for private things and &lt;a href=&#34;http://dataforce.org.uk/&#34;&gt;http://dataforce.org.uk/&lt;/a&gt; and &lt;a href=&#34;http://shanemcc.co.uk/&#34;&gt;http://shanemcc.co.uk/&lt;/a&gt; will simply redirect here. Eventually I may look to transition this blog over to one of the raw domains (probably dataforce.org.uk). Ultimately I&amp;rsquo;m trying to do this without breaking any links that may exist to files/etc on these domains.&lt;/p&gt;
&lt;p&gt;So if stuff breaks over the next few weeks, that&amp;rsquo;s why. Feel free to leave a comment if you notice anything or something goes missing.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>GMail – apply labels to email from group members – Redux</title>
      <link>https://blog.dataforce.org.uk/2012/09/gmail-apply-labels-to-email-from-group-members-redux/</link>
      <pubDate>Wed, 12 Sep 2012 01:30:18 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2012/09/gmail-apply-labels-to-email-from-group-members-redux/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://blog.dataforce.org.uk/2008/08/GMail-apply-labels-to-email-from-group-members/&#34;&gt;A while ago&lt;/a&gt; I posted a python script that allowed automatically adding labels to GMail messages based on contact groups.&lt;/p&gt;
&lt;p&gt;Unfortunately, a side effect of this script was that Google occasionally would lock an account out for &amp;ldquo;suspicious activity&amp;rdquo;, and for this reason I stopped using the script.&lt;/p&gt;
&lt;p&gt;However recently I looked at &lt;a href=&#34;http://script.google.com/&#34;&gt;Google Apps Scripts&lt;/a&gt; to see if this would allow me to recreate this using Google-Approved APIs, and the good news is, yes it does.&lt;/p&gt;
&lt;p&gt;The following script implements the same behaviour as the old python script. It checks every thread from the past 2 dates (so today, and yesterday) and then for each message in the thread gets the list of groups the sender is in (if the sender is a contact, and in any groups) and then checks to see if there are labels that match the same name, if so it applies them to the message.&lt;/p&gt;
&lt;p&gt;To get this running, create a new project on the Google Apps script page, then paste the code in.&lt;/p&gt;
&lt;p&gt;Modify &lt;code&gt;scheduledProcessInbox&lt;/code&gt; and &lt;code&gt;processInboxAll&lt;/code&gt; to include a label prefix if desired (eg &lt;code&gt;contacts/&lt;/code&gt;) and then enable the desired schedule (click on the clock icon in the toolbar). Once this has been scheduled you can run an initial pass over the inbox using &lt;code&gt;processInboxAll()&lt;/code&gt; - however this is limited to the last 500 threads.&lt;/p&gt;
&lt;p&gt;The code can now be found &lt;a href=&#34;http://github.com/ShaneMcC/GMailGroupLabeller&#34;&gt;here on github&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Any questions/comments/bugs please leave them here or on github.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Microsoft Lync on Linux</title>
      <link>https://blog.dataforce.org.uk/2012/04/microsoft-lync-on-linux/</link>
      <pubDate>Fri, 20 Apr 2012 11:55:26 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2012/04/microsoft-lync-on-linux/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; This post still gets a lot of search traffic hits, but is now over a year old, and I no longer have a need to use Lync, so haven&amp;rsquo;t needed to keep this working.&lt;/p&gt;
&lt;p&gt;I believe that the Ubuntu repos now contain new enough versions of SIPE that the deb mentioned here shouldn&amp;rsquo;t be needed any more, but that the rest of the instructions should still be valid.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Update 2:&lt;/strong&gt; I need to use LYNC again. Pidgin from the default Ubuntu repos does indeed now appear to work just fine with a custom user agent. In addition, I&amp;rsquo;ve also had some success with &amp;ldquo;&lt;a href=&#34;http://fisil.com/linuxlync.html&#34;&gt;WYNC&lt;/a&gt;&amp;rdquo; which works pretty well but has a few minor issues of it&amp;rsquo;s own.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Recently at work we have started using Lync internally. Whilst this is great for the Windows and Mac users among us, not so much for those of us running on Linux.&lt;/p&gt;
&lt;p&gt;However, it turns out that it is possible to get basic Lync support working quite easily. I can see people, talk to people, people can talk to me – I can send files to people, but people can&amp;rsquo;t send file to me. I&amp;rsquo;ve not tried any video/voice stuff but I suspect it doesn&amp;rsquo;t work.&lt;/p&gt;
&lt;p&gt;It’s done using &amp;ldquo;&lt;a href=&#34;http://sipe.sourceforge.net/&#34;&gt;sipe&lt;/a&gt;&amp;rdquo; – basically an open source implementation of the Extended SIP/SIMPLE protocol Lync uses for chat.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Update iptables on Endian  Community Firewall (EFW) 2.4.0</title>
      <link>https://blog.dataforce.org.uk/2012/02/update-iptables-on-endian-community-firewall-efw-2-4-0/</link>
      <pubDate>Sun, 12 Feb 2012 09:37:18 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2012/02/update-iptables-on-endian-community-firewall-efw-2-4-0/</guid>
      <description>&lt;p&gt;Compiling ip6tables on Endian Community Firewall (EFW) 2.4.0&lt;/p&gt;
&lt;p&gt;Unfortunately the version of ip6tables available at the time of fedora core 3 doesn&amp;rsquo;t support the &amp;lsquo;state&amp;rsquo; or &amp;lsquo;comment&amp;rsquo; modules for use with firewall rules. So in order to get these, I decided to compile iptables 1.4.12.2 for Endian.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>IPv6 with Endian Community Firewall (EFW) 2.4.0</title>
      <link>https://blog.dataforce.org.uk/2012/02/ipv6-with-endian-community-firewall-efw-2-4-0/</link>
      <pubDate>Sun, 12 Feb 2012 09:15:56 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2012/02/ipv6-with-endian-community-firewall-efw-2-4-0/</guid>
      <description>&lt;p&gt;First post in over a year! Oops.&lt;/p&gt;
&lt;p&gt;For a while now, my home ADSL provider (EntaNET) has provided me with an IPv6 allocation, but I&amp;rsquo;ve never really used it (Its been on my to-do list for some time) primarily due to the fact that it is unsupported by Endian which I use for my home router/firewall.&lt;/p&gt;
&lt;p&gt;However the other day after being asked about IPv6 at my day job, I decided I wanted to get this working, and decided to document it here in case it can assist anyone else in future. (I also finally got round to completing the &lt;a href=&#34;http://ipv6.he.net/certification&#34;&gt;Hurricane Electric IPv6 Certification&lt;/a&gt; up to sage level)&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a few things worth noting before we continue here.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I use a &lt;a href=&#34;http://www.draytek.co.uk/products/vigor120.html&#34;&gt;Draytek Vigor 120&lt;/a&gt; for my adsl modem - this is a PPPoA to PPPoE bridge. This means that my Endian box uses PPPoE to get its Internet connection, and directly receives an IPv4 address via the PPP session. There is no &amp;ldquo;PPP Half-Bridge&amp;rdquo; tricks here (such as where Modem does authentication, then DHCPs the address to Endian).&lt;/li&gt;
&lt;li&gt;Due to Endian lacking support for IPv6 you will need to use SSH to configure this, and any Endian upgrades will probably reverse a fair chunk of it. (Also, some reconfigurations may also undo things) - so with this in mind the rest of this guide assumes you are familiar with SSH and have successfully logged in as root to the Endian box (SSH can be enabled under the &amp;ldquo;System&amp;rdquo; section and &amp;ldquo;SSH Access&amp;rdquo;).&lt;/li&gt;
&lt;li&gt;Due to previous requirements, my Endian server is not &amp;ldquo;pure&amp;rdquo; in that I have additional packages installed that made this easier. Notably, a complete build environment. This won&amp;rsquo;t be needed here.&lt;/li&gt;
&lt;li&gt;This was all done without writing it down, so this documentation is based on my recollection and attempts at replicating various parts on a VirtualBox VM (which can&amp;rsquo;t do PPPoE&amp;hellip;). If I&amp;rsquo;ve missed anything, please let me know in the comments.&lt;/li&gt;
&lt;li&gt;This was done with EFW 2.4.0 and may not work in the latest 2.5.1 version.&lt;/li&gt;
&lt;li&gt;I have only had this running for a few days, so there may be some unforeseen issues with this.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;With this in mind, we continue to the actual important stuff!&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Happy New Year</title>
      <link>https://blog.dataforce.org.uk/2011/01/happy-new-year/</link>
      <pubDate>Sat, 01 Jan 2011 00:50:03 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2011/01/happy-new-year/</guid>
      <description>&lt;p&gt;&amp;lt;Obligatory happy new year post goes here&amp;gt;&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>A tale of two monitors</title>
      <link>https://blog.dataforce.org.uk/2010/11/a-tale-of-two-monitors/</link>
      <pubDate>Sun, 21 Nov 2010 19:20:56 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2010/11/a-tale-of-two-monitors/</guid>
      <description>&lt;p&gt;So, a while back (just under 3 years ago) I obtained 2 of Hyundai&amp;rsquo;s W240D monitors. These monitors had (I believe) PVA panels and worked fine for most of their life so far.&lt;/p&gt;
&lt;p&gt;A while back they both developed a problem, as evident in the video below:&lt;/p&gt;

&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/bk-UE5VSD50&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;YouTube Video&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;So, as they were still under warranty I contacted Hyundai/RepairTech and arranged for these to be repaired. Hyundai sent the parts to RepairTech, who collected the units, repaired them and sent them back.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Greasemonkey script for hp.com forums</title>
      <link>https://blog.dataforce.org.uk/2010/09/greasemonkey-script-for-hp-com-forums/</link>
      <pubDate>Fri, 24 Sep 2010 12:23:51 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2010/09/greasemonkey-script-for-hp-com-forums/</guid>
      <description>&lt;p&gt;If you&amp;rsquo;ve ever visited the hp.com forums you&amp;rsquo;ll know that any links in the post get enclosed by a call to &amp;ldquo;javascript:openExternal(&amp;rsquo;&amp;rsquo;)&amp;rdquo; in the href rather than doing it properly in onClick. Amongst other things, this breaks the ability to middle click to open links in new tabs.&lt;/p&gt;
&lt;p&gt;This finally annoyed me enough today and as a result, I now use the following greasemonkey script:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// ==UserScript==
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// @name           Stupid HP.COM Links
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// @namespace      http://shanemcc.co.uk/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// @include        *hp.com*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// ==/UserScript==
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;document&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;getElementsByTagName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;A&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;lt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;href&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;].&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;href&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nx&#34;&gt;href&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;href&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;replace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;/javascript:openExternal\(&amp;#39;([^&amp;#39;]+)&amp;#39;\)/i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;$1&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;].&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;href&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;href&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will make the links no longer have the call to openExternal around them, and thus make them middle-click friendly.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Ubuntu on HP Compaq Mini 311c-1030SA</title>
      <link>https://blog.dataforce.org.uk/2010/08/ubuntu-on-hp-compaq-mini-311c-1030sa/</link>
      <pubDate>Tue, 10 Aug 2010 01:41:53 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2010/08/ubuntu-on-hp-compaq-mini-311c-1030sa/</guid>
      <description>&lt;p&gt;I recently purchased a HP Compaq Mini 311c-1030SA with Nvidia ION and built in 3G, unfortunately the 3G card is a &amp;ldquo;UN2400&amp;rdquo; which isn&amp;rsquo;t supported right out of the box as it requires proprietary firmware.&lt;/p&gt;
&lt;p&gt;This post is mostly notes for myself on getting the UN2400 3G card inside it working enough to use.&lt;/p&gt;
&lt;p&gt;This post assumes that the netbook is running Ubuntu maverick &lt;del datetime=&#34;2010-12-13T13:18:39+00:00&#34;&gt;(which is currently in alpha but seems to work just fine)&lt;/del&gt; as it has gobi_loader as a package and a kernel which supports it.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Sending SMS with a Huawei E220</title>
      <link>https://blog.dataforce.org.uk/2010/08/sending-sms-with-a-huawei-e220/</link>
      <pubDate>Fri, 06 Aug 2010 09:15:09 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2010/08/sending-sms-with-a-huawei-e220/</guid>
      <description>&lt;p&gt;Today I decided to play with an old Huawei E220 I have lying around.&lt;/p&gt;
&lt;p&gt;After getting it setup and recognised in Linux by following the first 5 steps from &lt;a href=&#34;http://ubuntuforums.org/showthread.php?p=3656717&#34;&gt;http://ubuntuforums.org/showthread.php?p=3656717&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;After this, restarting udev (&lt;code&gt;restart udev&lt;/code&gt;) and replugging the device makes it ready to use.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>WordPress</title>
      <link>https://blog.dataforce.org.uk/2010/06/Wordpress/</link>
      <pubDate>Sun, 27 Jun 2010 19:13:10 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2010/06/Wordpress/</guid>
      <description>&lt;p&gt;I have recently decided to switch this site to use wordpress rather than the custom code that was here before.&lt;/p&gt;
&lt;p&gt;This will allow me to edit/post to the site using my phone, which will probably allow me to update it more often.&lt;/p&gt;
&lt;p&gt;I am working on migrating everything from the old site to the new site and trying to find a theme I like. Hopefully I will have everything working soon. Should anything be missing that you would like brought back leave a comment and let me know and I&amp;rsquo;ll see what I can do.&lt;/p&gt;
&lt;p&gt;Unfortunately for anyone reading this using RSS, I&amp;rsquo;m afraid the recent posts will duplicate themselves as the IDs in the RSS feed will have changed.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Ident Server</title>
      <link>https://blog.dataforce.org.uk/2010/03/ident-server/</link>
      <pubDate>Wed, 03 Mar 2010 22:53:00 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2010/03/ident-server/</guid>
      <description>&lt;p&gt;I recently encountered a problem on a server that I manage where by the oidentd server didn&amp;rsquo;t seem to be working.&lt;/p&gt;
&lt;p&gt;Manual tests worked, but connecting to IRC Servers didn&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;I tried switching oidentd with ident2 and the same problem.&lt;/p&gt;
&lt;p&gt;After switching back, and a bit of debugging later it appeared that the problem was that the IRC Servers were expecting spaces in the ident reply, whereas oidentd wasn&amp;rsquo;t giving them.&lt;/p&gt;
&lt;p&gt;I then quickly threw together an xinet.d-powered ident server with support for spoofing.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>GitWeb Hacking.</title>
      <link>https://blog.dataforce.org.uk/2009/03/GitWeb-Hacking/</link>
      <pubDate>Fri, 27 Mar 2009 02:52:27 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2009/03/GitWeb-Hacking/</guid>
      <description>&lt;p&gt;Recently I setup gitweb on one of my servers to allow a web-based frontend to any git projects which the users of the server place in their ~/git/ directory.&lt;/p&gt;
&lt;p&gt;After playing about with it, I noticed that it allowed for placing a README.html file in the git config directory to allow extra info to be shown on the summary view, managed to get it to pull the README.html file from the actual repository itself, and not the config directory, thus allowing the README.html to be versioned along with everything else, and not require the user to edit it on the server, but rather just edit it locally and push it.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>New Phone – T-Mobile G1.</title>
      <link>https://blog.dataforce.org.uk/2008/12/New-Phone-TMobile-G1/</link>
      <pubDate>Thu, 11 Dec 2008 01:56:12 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2008/12/New-Phone-TMobile-G1/</guid>
      <description>&lt;p&gt;Recently I acquired a T-Mobile G1 to replace my old T-Mobile MDA Vario 2 (HTC Hermes).&lt;/p&gt;
&lt;p&gt;All I can say about this phone is that it is quite awesome. I no longer need to run an exchange server to keep my contacts/calendar synced somewhere as the G1 syncs everything to Google Mail/Calendar.&lt;/p&gt;
&lt;p&gt;Its a really good phone and I recommend it to anyone who is thinking of getting a new phone, the integration with Google is especially useful, and the full-html (including CSS and javascript) is very nice.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>JDesktopPane Replacement</title>
      <link>https://blog.dataforce.org.uk/2008/08/JDesktopPane-Replacement/</link>
      <pubDate>Sat, 09 Aug 2008 03:46:49 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2008/08/JDesktopPane-Replacement/</guid>
      <description>&lt;p&gt;As as I &lt;a href=&#34;https://blog.dataforce.org.uk/2008/07/MD5/&#34;&gt;mentioned before&lt;/a&gt; I&amp;rsquo;ve been recently converting an old project to Java.&lt;/p&gt;
&lt;p&gt;This old project was an MDI application, and when creating the UI for the conversion, I found the default JDesktopPane to be rather crappy. Google revealed others thought the same, one of the results that turned up was: &lt;a href=&#34;http://www.javaworld.com/javaworld/jw-05-2001/jw-0525-mdi.html&#34;&gt;http://www.javaworld.com/javaworld/jw-05-2001/jw-0525-mdi.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So, I created DFDesktopPane based on this code, with some extra changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Frames can&amp;rsquo;t end up with a negative x/y&lt;/li&gt;
&lt;li&gt;Respond to resize events of the JViewport parent&lt;/li&gt;
&lt;li&gt;Iconified icons move themselves to remain inside the desktop at all times.&lt;/li&gt;
&lt;li&gt;Handles maximised frames correctly (desktop doesn&amp;rsquo;t scroll, option to hide/remove titlebar)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My modified JDesktopPane can be found as &lt;a href=&#34;http://code.google.com/p/dflibs/source/browse/trunk/java/uk/org/dataforce/swing/DFDesktopPane.java&#34;&gt;here&lt;/a&gt; part of my &lt;a href=&#34;http://code.google.com/p/dflibs/&#34;&gt;dflibs&lt;/a&gt; Google code project.&lt;/p&gt;
&lt;p&gt;Other useful things can be found &lt;a href=&#34;http://code.google.com/p/dflibs/source/browse/trunk/java/uk/org/dataforce/&#34;&gt;here&lt;/a&gt;, take a look and leave any feedback either here or on the project issue tracker&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>GMail – apply labels to email from group members</title>
      <link>https://blog.dataforce.org.uk/2008/08/gmail-apply-labels-to-email-from-group-members/</link>
      <pubDate>Tue, 05 Aug 2008 06:03:27 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2008/08/gmail-apply-labels-to-email-from-group-members/</guid>
      <description>&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; The information in this article has been superceeded by &lt;a href=&#34;https://blog.dataforce.org.uk/2012/09/gmail-apply-labels-to-email-from-group-members-redux/&#34;&gt;this one&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;As Noted by &lt;a href=&#34;http://chris.smith.name/&#34;&gt;Chris&lt;/a&gt; recently on IRC, &lt;a href=&#34;http://gmail.com&#34;&gt;Google Mail&lt;/a&gt; lacks a feature in its ability to automatically label/filter messages - you can&amp;rsquo;t do it based on emails from people in a contact group, short of adding a filter with all their email address on it.&lt;/p&gt;
&lt;p&gt;At the time it was mentioned this didn&amp;rsquo;t affect me, however later when I got round to adding loads of labels/filters in gmail (yay for, nicely coloured inbox!) to nicely separate things for me I also ran into this problem, so came up with the following python script that does it for me.&lt;/p&gt;
&lt;p&gt;It checks messages, sees if the sender is in the contacts, then checks each group to see if there is a label with that group name that is not already set, then checks to see if the contact is in the group, and finally sets the label if everything matches up.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>MD5</title>
      <link>https://blog.dataforce.org.uk/2008/07/MD5/</link>
      <pubDate>Mon, 28 Jul 2008 02:55:09 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2008/07/MD5/</guid>
      <description>&lt;p&gt;I was recently looking at converting an old application from VB6 to Java that used MD5 in its output files as hashes for validation.&lt;/p&gt;
&lt;p&gt;The first thing I did was to make a java class that read in the file and checked the hashes, I tried it on a few files and it worked fine, then I found a file that it failed on.&lt;/p&gt;
&lt;p&gt;Now, this app wrote all the files using the exact same function, so it seemed odd that 1 of them wouldn&amp;rsquo;t parse and the rest would.&lt;/p&gt;
&lt;p&gt;When I looked at the file closer, I found that this one contained some symbols in the output that the others didn&amp;rsquo;t - I eventually figured out that the symbol that was causing the problem was the pound sign (£).&lt;/p&gt;
&lt;p&gt;Without going into too much detail, this presented a major problem, the string in question was used as part of the password validation for the app (the output files are encrypted using the password as a key), and the java code was getting different results than the old VB6 code, and was unable to decode the file as a result.&lt;/p&gt;
&lt;p&gt;So, this sparked my curiosity a bit, the VB6 code I was using wasn&amp;rsquo;t a built in, it was code I&amp;rsquo;d gotten elsewhere and used, so I assumed it was faulty code (not that this helped me much, as I needed to get the exact same output, but ignoring that).&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>“Dr. Horrible’s Sing-Along Blog – Act 3” a Dissapointment</title>
      <link>https://blog.dataforce.org.uk/2008/07/Dr-Horribles-SingAlong-Blog-Act-3-a-Dissapointment/</link>
      <pubDate>Sun, 20 Jul 2008 14:26:23 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2008/07/Dr-Horribles-SingAlong-Blog-Act-3-a-Dissapointment/</guid>
      <description>&lt;p&gt;Despite all the &amp;ldquo;This was amazing&amp;rdquo; &amp;ldquo;fantastic&amp;rdquo; reviews I seem to find for this everywhere, I found myself disappointed after watching it.&lt;/p&gt;
&lt;p&gt;The first 2 acts were funny and very rewatchable, there was gold bars that became gold liquid, the &amp;ldquo;Bad Horse&amp;rdquo; letters and phone calls, Captain Hammer and his &amp;ldquo;Hammer&amp;rdquo;, they made me laugh and alongside the humour was a kick ass sound track (my personal favourite being &amp;ldquo;Its a brand new day&amp;rdquo;).&lt;/p&gt;
&lt;p&gt;Act 3 on the other hand was a complete change in direction, the songs weren&amp;rsquo;t as good, it wasn&amp;rsquo;t really all that funny (Infact I think the only bit I laughed at was him stopping his song to correct the spelling of his name), it suddenly became all serious. All in all I found it a rather disappointing, and somewhat obvious, end and a let down to an otherwise awesome show.&lt;/p&gt;
&lt;p&gt;Despite this I&amp;rsquo;m still going to buy the DVD (and hopefully the OST if one comes out), as I approve of the idea of a web-streamed show (I think there was a push to get a firefly season 2 done in this way at one point) and would like to see more of them.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Yakuake on OS X – Almost</title>
      <link>https://blog.dataforce.org.uk/2008/07/Yakuake-on-OS-X-Almost/</link>
      <pubDate>Thu, 17 Jul 2008 07:18:03 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2008/07/Yakuake-on-OS-X-Almost/</guid>
      <description>&lt;p&gt;For a while now (pretty much since I&amp;rsquo;ve been using Linux) I&amp;rsquo;ve been using &lt;a href=&#34;http://en.wikipedia.org/wiki/Yakuake&#34;&gt;yakuake&lt;/a&gt;, and I&amp;rsquo;ve been looking for something similar for OS X (at the moment I tend to ssh from my desktop to my OS X machine to do anything console like).&lt;/p&gt;
&lt;p&gt;I found &lt;a href=&#34;http://docs.blacktree.com/visor/visor&#34;&gt;visor&lt;/a&gt; which wraps terminal.app, but overall this is a poor replacement primarily for the lack of tab support (I use tabs a lot in yakuake, at the moment on my desktop I have ~15 open)&lt;/p&gt;
&lt;p&gt;I tried to get yakuake working on OS X a while ago and failed (it wouldn&amp;rsquo;t compile) so gave up, recently however I decided to try again and have made better progress.&lt;/p&gt;
&lt;p&gt;This is what I did, its probably not the best way of doing it (for example, the initial 3GB download could probably be reduced).&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Virtualbox Bridging</title>
      <link>https://blog.dataforce.org.uk/2008/06/Virtualbox-Bridging/</link>
      <pubDate>Wed, 11 Jun 2008 10:56:17 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2008/06/Virtualbox-Bridging/</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;Edit:&lt;/strong&gt; This is now pretty much unneeded, the new version of VirtualBox seems to handle this all nicely on its own.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;As I mentioned in my last post, One of the useful advantages of the network boot setup is that I can use it to quickly install virtual machines.&lt;/p&gt;
&lt;p&gt;Now a few things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;My Desktop is a lot more powerful than my server, so I run the virtual machines on it.&lt;/li&gt;
&lt;li&gt;I use virtualbox rather than vmware.&lt;/li&gt;
&lt;li&gt;All the network boot stuff is on my server not my desktop (obviously) &lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So in order to allow this, virtualbox needed to be setup to bridge to my existing adapter, this was quite straight forward, pretty much exactly as the manual said.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>PXE Goodness</title>
      <link>https://blog.dataforce.org.uk/2008/06/PXE-Goodness/</link>
      <pubDate>Tue, 10 Jun 2008 01:52:22 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2008/06/PXE-Goodness/</guid>
      <description>&lt;p&gt;So as you may or may not know from time to time I have the joy of fixing computers for various people. A lot of these fixes result in a reinstall of windows and away.&lt;/p&gt;
&lt;p&gt;This is a rather easy enough job, I have a KVM switch that I attach to the machine, pop a windows CD in (I used to have an unattended CD but don&amp;rsquo;t any more), answer a few questions and then occasionally switch the KVM over to see if the install died or so.&lt;/p&gt;
&lt;p&gt;Now this is all well and good except for 2 problems:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It means I need to keep (or remember to bring) windows CDs at home (where I do most of my jobs)&lt;/li&gt;
&lt;li&gt;I recently had a machine to fix that had a non-working CD Drive&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now, the first one isn&amp;rsquo;t so much of a problem, but the second one was.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>OpenID</title>
      <link>https://blog.dataforce.org.uk/2008/03/OpenID/</link>
      <pubDate>Sun, 02 Mar 2008 21:13:31 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2008/03/OpenID/</guid>
      <description>&lt;p&gt;Recently I finally finished adding support for &lt;a href=&#34;http://www.authgate.co.uk&#34;&gt;AuthGate&lt;/a&gt; to be an &lt;a href=&#34;http://openid.net&#34;&gt;OpenID&lt;/a&gt; Provider.&lt;/p&gt;
&lt;p&gt;This prompted &lt;a href=&#34;http://chris.smith.name&#34;&gt;Chris&lt;/a&gt; to develop &lt;a href=&#34;http://apps.md87.co.uk/openid/&#34;&gt;Poidsy&lt;/a&gt;, which I have also implemented into AuthGate. This allows people to login to AuthGate (and thus also here, and other AuthGate powered sites) using OpenID instead of having to register with AuthGate itself.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Email Woes</title>
      <link>https://blog.dataforce.org.uk/2007/08/Email-Woes/</link>
      <pubDate>Sat, 18 Aug 2007 01:10:19 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2007/08/Email-Woes/</guid>
      <description>&lt;p&gt;On a daily basis, I get around 800 emails to my email accounts, of which most of it is spam.&lt;/p&gt;
&lt;p&gt;Now as good as thunderbird is at detecting spam, even it fails at a lot of the spam I receive, leaving me with around 100-200 spam per day that gets into my inbox.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve dealt with and accepted this for over a year now, before a discussion on IRC made me decide to do something about it. (When I say discussion, I mean &lt;a href=&#34;http://www.md87.co.uk&#34;&gt;Chris&lt;/a&gt; pasted one line showing how good the &lt;a href=&#34;http://utd-hosting.com&#34;&gt;UTD-Hosting&lt;/a&gt; mail server was at preventing junk getting to him)&lt;/p&gt;
&lt;p&gt;So, I recently (Today and yesterday) started prodding my postfix config to help with the problem.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>More DMDirc</title>
      <link>https://blog.dataforce.org.uk/2007/06/More-DMDirc/</link>
      <pubDate>Mon, 11 Jun 2007 03:32:24 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2007/06/More-DMDirc/</guid>
      <description>&lt;p&gt;DMDirc 0.4 has now &lt;a href=&#34;http://blog.dmdirc.com/2007/06/11/04-is-a-go/trackback/&#34;&gt;been released&lt;/a&gt; :)&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>DMDirc</title>
      <link>https://blog.dataforce.org.uk/2007/03/DMDirc/</link>
      <pubDate>Sat, 03 Mar 2007 06:40:42 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2007/03/DMDirc/</guid>
      <description>&lt;p&gt;I (Along with &lt;a href=&#34;http://www.md87.co.uk&#34;&gt;Chris &amp;lsquo;MD87&amp;rsquo; Smith&lt;/a&gt; and &lt;a href=&#34;http://www.greboid.com&#34;&gt;Greg &amp;lsquo;Greboid&amp;rsquo; Holmes&lt;/a&gt; have recently started working on DMDirc (again, only this time its in Java to help towards the original aim of the project to be a decent, truly cross platform IRC Client)&lt;/p&gt;
&lt;p&gt;Its coming along quite well :)&lt;/p&gt;
&lt;p&gt;You can track the progress, (and download the current release which is 0.1) at the &lt;a href=&#34;http://code.google.com/p/dmdirc&#34;&gt;Google Code Project&lt;/a&gt; or the &lt;a href=&#34;http://www.dmdirc.com/&#34;&gt;Project Website&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Lemme know what you think.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Linux Desktop</title>
      <link>https://blog.dataforce.org.uk/2007/01/linux-desktop/</link>
      <pubDate>Wed, 31 Jan 2007 00:48:55 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2007/01/linux-desktop/</guid>
      <description>&lt;p&gt;With the release of windows vista, comes the start-of-the-end for Windows XP. with its EOL (End-Of-Life) date now set at January 30th 2008 (that&amp;rsquo;s less than a year away), people (by people I mean windows users) who are unable to upgrade to vista (due to Lack of computing power or so) or don&amp;rsquo;t want it (its crap, proprietary, riddled with DRM and probably bugs - Microsoft are already producing SP1!) need to start looking for alternatives, unless they want to stay using an unsupported (this means no more bug/security fixes) Operating System.&lt;/p&gt;
&lt;p&gt;Imo, The best alternative is some derivative of Linux. (Although there is others such as MacOS x86 although its not supported on non-mac hardware, FreeBSD but I don&amp;rsquo;t think its desktop oriented, and others such as beOS or so)&lt;/p&gt;
&lt;p&gt;As of Saturday 27/1/07 I have started using KUbuntu Linux as the main OS on my desktop, as a trial to see how well I can get by without my &amp;ldquo;trusty&amp;rdquo; windows installation.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Delphi/FreePascal MySQL.pas</title>
      <link>https://blog.dataforce.org.uk/2006/12/DelphiFreePascal-MySQLpas/</link>
      <pubDate>Sat, 30 Dec 2006 14:00:23 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2006/12/DelphiFreePascal-MySQLpas/</guid>
      <description>&lt;p&gt;Due to a recent need in a project of mine for mySQL access from delphi/freepascal I have adapted the version of mysql.pas from &lt;a href=&#34;http://www.fichtner.net/delphi/mysql.delphi.phtml&#34;&gt;http://www.fichtner.net/delphi/mysql.delphi.phtml&lt;/a&gt; to load both libmysql.dll (on svn) and libmysqlclient.so (Usually located in /usr/lib/mysql/).&lt;/p&gt;
&lt;p&gt;I also created a wrapper class for it (TSQL in SQL.pas)&lt;/p&gt;
&lt;p&gt;Downloads can be found here: [http://blog.dataforce.org.uk/viewcvs/misc/MySQL/]&lt;/p&gt;
&lt;p&gt;Any queries/questions should be left in the comments.&lt;/p&gt;
&lt;p&gt;(This has been tested, and compiled on Freepascal on Linux (1.9.8) and windows (2.0.0) and in Delphi (6/7/Turbo) on windows.)&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Captcha Woes</title>
      <link>https://blog.dataforce.org.uk/2006/12/Captcha-Woes/</link>
      <pubDate>Fri, 22 Dec 2006 03:22:22 +0000</pubDate>
      
      <guid>https://blog.dataforce.org.uk/2006/12/Captcha-Woes/</guid>
      <description>&lt;p&gt;Even the most complex captchas can be bypassed, if not tested thoroughly enough.&lt;/p&gt;
&lt;p&gt;Some time ago, I implemented a captcha on my comments form for news posts, to stop spam bots. My captcha is quite complicated, and sometimes generates images that even humans strugle on, yet for some reason I managed to get 10788 spam comments!&lt;/p&gt;
&lt;p&gt;I immediately tested my captcha - tried with no value, a wrong value, a right value, only the right one worked.&lt;/p&gt;
&lt;p&gt;Then I tried in a different window, open 2 tabs to the same comment, submit the 2nd one with no data and get told the correct captcha, then try using that on the first window, this also didn&amp;rsquo;t work - however, it told me the correct captcha was &amp;ldquo;&amp;rdquo;, upon hitting back and trying with no captcha, it worked.&lt;/p&gt;
&lt;p&gt;Turns out I had forgot to make &amp;quot;&amp;quot; an invalid captcha when testing if the values were correct, seeing as when you submit the captcha, it clears the captcha session, a blank value WAS indeed the same value that was stored in the session! The spam bots were just not accepting the session, and thus had a blank captcha - and by them not filling in the captcha, and not accepting the session, they were able to submit comments. This has now been fixed, and a blank captcha will now give an error of &amp;ldquo;Captcha Timeout&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Fortunately, 3 Simple SQL Queries pruned the lot :) 1 of which pruned 7900+. Silly bots being so similar!&lt;/p&gt;</description>
    </item>
    
  </channel>
</rss>
