<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Wimpy's World</title><link>https://wimpysworld.com/</link><description>Recent content on Wimpy's World</description><generator>Hugo -- gohugo.io</generator><language>en-gb</language><managingEditor>martin@wimpress.com (Martin Wimpress)</managingEditor><webMaster>martin@wimpress.com (Martin Wimpress)</webMaster><lastBuildDate>Thu, 05 Jun 2025 13:37:42 +0100</lastBuildDate><atom:link href="https://wimpysworld.com/rss.xml" rel="self" type="application/rss+xml"/><item><title>faffing about with diffs</title><link>https://wimpysworld.com/posts/faff-ollama-conventional-commit-generator/</link><pubDate>Thu, 05 Jun 2025 13:37:42 +0100</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/faff-ollama-conventional-commit-generator/</guid><description>&lt;p>Picture this: you&amp;rsquo;ve just spent literal minutes crafting the perfect bit of code, you&amp;rsquo;re chuffed with yourself, and then you open your git client only to stare at that commit message box. 🤔&lt;/p>
&lt;p>That cursor blinking mockingly while you try to remember what you changed just moments ago. &lt;strong>And you wonder, why do I have to write this? &lt;code>git&lt;/code> already knows what happened!&lt;/strong>&lt;/p>
&lt;p>Now, I&amp;rsquo;m a proper &lt;a href="https://gitkraken.dev/">GitKraken&lt;/a> devotee – have been for years 🦑 Love the thing so much I&amp;rsquo;ve disabled all git integrations in VS Code to maintain a clean separation between coding and source control. It&amp;rsquo;s brilliant software and I&amp;rsquo;m happy to pay for it (&lt;a href="https://gitkraken.cello.so/AxtLstzXaif">you should too using my handy-dandy referral link&lt;/a>) 🤑&lt;/p>
&lt;h2 id="when-ai-promises-go-sideways">When AI promises go sideways&lt;/h2>
&lt;p>GitKraken recently added AI integration for generating commit messages, complete with customisable prompts. Naturally, I thought &lt;em>&amp;ldquo;Right, this&amp;rsquo;ll sort my commit message faff once and for all!&amp;rdquo;&lt;/em> Two problems emerged rather quickly:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>First, I blew through my AI credit bundle faster than a student with their first overdraft facility. Turns out I commit quite a lot, and those credits don&amp;rsquo;t stretch as far as you&amp;rsquo;d hope.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Second, and this really wound me up, I could not for the life of me get it to generate proper &lt;a href="https://www.conventionalcommits.org/">Conventional Commits&lt;/a>. I know how to craft AI system prompts – I&amp;rsquo;ve been mucking about with LLMs long enough – but GitKraken&amp;rsquo;s AI seemed determined to ignore my carefully crafted instructions about &lt;code>feat:&lt;/code>, &lt;code>fix:&lt;/code>, and &lt;code>chore:&lt;/code> prefixes.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="enter-faff-stage-left">Enter faff, stage left&lt;/h2>
&lt;p>So naturally, being the sort of person who builds entire projects out of mild irritation, I decided to solve this myself. Meet &lt;a href="https://github.com/wimpysworld/faff">&lt;code>faff&lt;/code>&lt;/a> – yet another bloody AI commit generator, because apparently the Internet wasn&amp;rsquo;t drowning in enough of them already ☔&lt;/p>
&lt;p>&lt;code>faff&lt;/code> does one thing: it looks at your staged git diff, sends it to a local &lt;a href="https://ollama.com/">Ollama&lt;/a> LLM, and spits out a conventional commit message. No cloud APIs, no credit bundles, no sending your &lt;code>TODO: delete this abomination&lt;/code> code comments to feed the vibe-coding dealers.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git add .
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>faff
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Perfect conventional commits, every time. Well, most of the time. It&amp;rsquo;s AI, not magic 🪄&lt;/p>
&lt;div align="center">&lt;img alt="faff demo" src="faff.gif" width="1024" />&lt;/div>
&lt;h2 id="the-plot-twist-that-made-me-question-everything">The plot twist that made me question everything&lt;/h2>
&lt;p>Here&amp;rsquo;s where this story takes a turn that&amp;rsquo;ll make you laugh at my expense. After building &lt;code>faff&lt;/code>, documenting it, and feeling rather pleased with myself, I discovered something that made me want to bang my head against my desk repeatedly.&lt;/p>
&lt;p>&lt;strong>You can hook GitKraken&amp;rsquo;s AI up to Ollama.&lt;/strong>&lt;/p>
&lt;p>And naturally, &lt;a href="https://github.com/wimpysworld/faff/blob/main/faff.sh#L8">my carefully crafted system prompt from &lt;code>faff&lt;/code>&lt;/a>, when used in GitKraken AI via Ollama with the same &lt;a href="https://ollama.com/library/qwen2.5-coder">qwen2.5-coder&lt;/a> models, works exactly like &lt;code>faff&lt;/code> does. 🤦‍♂️&lt;/p>
&lt;p>So technically, I could have solved my original problem without building an new tool. But where&amp;rsquo;s the fun in that?&lt;/p>
&lt;h2 id="why-faff-still-matters-and-its-not-just-stubbornness">Why faff still matters (and it&amp;rsquo;s not just stubbornness)&lt;/h2>
&lt;p>Despite this rather embarrassing revelation, &lt;code>faff&lt;/code> still has its place:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Privacy by default&lt;/strong>: Everything stays local, until you push it to GitHub&lt;/li>
&lt;li>&lt;strong>No vendor lock-in&lt;/strong>: Works with any Ollama-supported model. Want to try the latest coding model? Just change the environment variable.&lt;/li>
&lt;li>&lt;strong>Shell-first design&lt;/strong>: Perfect for those of us who live in terminals, or an excuse for me creating another shonky shell script&lt;/li>
&lt;li>&lt;strong>Learning project&lt;/strong>: Born from genuine frustration and a desire to poke around the &lt;a href="https://github.com/ollama/ollama/blob/main/docs/api.md">Ollama API&lt;/a>. Sometimes the best tools come from scratching your own itch.&lt;/li>
&lt;/ul>
&lt;p>Plus, let&amp;rsquo;s be honest – there&amp;rsquo;s something deeply satisfying about having a tool that does exactly what you want, how you want it, without any &lt;em>faff!&lt;/em> 🥁&lt;/p>
&lt;h2 id="give-it-a-whirl">Give it a whirl&lt;/h2>
&lt;p>If you&amp;rsquo;re tired of crafting commit messages that either say &amp;ldquo;Updated stuff&amp;rdquo; (&lt;em>again!&lt;/em>) or read like Victorian novels, &lt;a href="https://github.com/wimpysworld/faff">&lt;code>faff&lt;/code> might be worth a look&lt;/a>. It&amp;rsquo;s a shell script, it works with local AI, and it follows conventional commits standards without the existential crisis.&lt;/p>
&lt;p>And if you decide you&amp;rsquo;d rather stick with GitKraken&amp;rsquo;s AI (which, after my discoveries, is perfectly reasonable), at least &lt;a href="https://gitkraken.cello.so/AxtLstzXaif">grab it through my referral link&lt;/a> so I can pretend this whole adventure was planned from the start. ️🗺️&lt;/p>
&lt;p>Because sometimes the best projects are the ones born from pure spite, accidentally becoming useful along the way. That&amp;rsquo;s half the fun of building things, isn&amp;rsquo;t it?&lt;/p>
&lt;p>&lt;strong>Drop the faff, dodge the judgment, get back to coding. 🦙&lt;/strong>&lt;/p></description><summary>Another bloody AI commit generator, born from pure spite but stays local</summary></item><item><title>Nothing but Nix</title><link>https://wimpysworld.com/posts/nothing-but-nix-github-actions/</link><pubDate>Thu, 15 May 2025 13:37:42 +0100</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/nothing-but-nix-github-actions/</guid><description>&lt;p>Have you ever tried to build a complex &lt;a href="https://nixos.org/">NixOS&lt;/a> ️❄️ configuration in GitHub Actions only to be greeted by the dreaded &lt;em>&amp;ldquo;no space left on device&amp;rdquo;&lt;/em> error? I certainly have, and it&amp;rsquo;s been driving me bonkers for quite some time! 😖&lt;/p>
&lt;p>&lt;a href="https://docs.github.com/en/actions/using-github-hosted-runners/using-github-hosted-runners/about-github-hosted-runners#standard-github-hosted-runners-for-public-repositories">Standard GitHub Actions runners&lt;/a> come with a paltry ~20GB of free disk space, or so it would seem. Which sounds decent until you try to build sophisticated NixOS or &lt;a href="https://nix-community.github.io/home-manager/">Home Manager&lt;/a> configurations. A comprehensive workstation or home lab server setup can consume 10-15GB due to all the included packages and dependencies, leaving precious little headroom for anything else 🤏&lt;/p>
&lt;p>This space limitation effectively meant I couldn&amp;rsquo;t build my full workstation and server configurations in CI. So annoying! 😠 I wanted my CI to cache complete builds to &lt;a href="https://flakehub.com/">FlakeHub Cache&lt;/a>, but was forever stuck with only partial builds or individual packages that wouldn&amp;rsquo;t properly test the complete configurations. This meant that each configuration change on my workstations and servers required frustrating additional compilation time for things like 3rd party kernel modules, &lt;a href="https://ollama.com/">Ollama&lt;/a>, custom package overrides, and more - all because I couldn&amp;rsquo;t get full builds cached through CI ️🥺&lt;/p>
&lt;p>Well, I&amp;rsquo;d had enough of that nonsense and decided to solve the problem once and for all 🧠&lt;/p>
&lt;h2 id="introducing-nothing-but-nix-">Introducing &lt;em>Nothing but Nix&lt;/em> ️❄️&lt;/h2>
&lt;p>I&amp;rsquo;m chuffed to bits to announce &lt;a href="https://github.com/marketplace/actions/nothing-but-nix">&lt;em>Nothing but Nix&lt;/em>&lt;/a>, a GitHub Action that &lt;strong>brutally reclaims&lt;/strong> disk space 🪓 on runners and transforms them into Nix powerhouses!&lt;/p>
&lt;p>Here&amp;rsquo;s what it does in a nutshell:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>- uses: actions/checkout@v4
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>- uses: wimpysworld/nothing-but-nix@main
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>- uses: DeterminateSystems/determinate-nix-action@main
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>- run: |&lt;span style="color:#87ceeb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb"> &lt;/span> nix flake check
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The result? Instead of ~20GB for your &lt;a href="https://zero-to-nix.com/concepts/nix-store/">Nix store&lt;/a>, you get &lt;strong>65GB to 130GB&lt;/strong> of sweet, glorious Nix-dedicated space. That&amp;rsquo;s enough to build even the chonkiest of configurations! 🪨&lt;/p>
&lt;h2 id="space-the-final-frontier-">Space, the Final Frontier 🌌&lt;/h2>
&lt;p>Working at &lt;a href="https://determinate.systems">Determinate Systems&lt;/a>, I get to see firsthand how powerful Nix can be when properly cached. Our &lt;a href="https://flakehub.com">FlakeHub Cache&lt;/a> makes system updates lightning fast ⚡ but I couldn&amp;rsquo;t fully leverage it in CI because my builds kept running out of space.&lt;/p>
&lt;p>I wanted to be able to &lt;strong>build and test all my configurations&lt;/strong> in CI:&lt;/p>
&lt;ul>
&lt;li>💁 &lt;strong>Servers:&lt;/strong> media services, local LLMs, website, fediverse services, distributed storage, backup&lt;/li>
&lt;li>️🖥️ &lt;strong>Workstations:&lt;/strong> dual GPU, loaded with dev tools, content creation apps and local LLMs&lt;/li>
&lt;li>💻 &lt;strong>Laptops:&lt;/strong> optimized for travel, media on the go, presentations and development&lt;/li>
&lt;li>👻 &lt;strong>VMs:&lt;/strong> for &lt;a href="https://ubuntu-mate.org">Linux desktop development&lt;/a> and testing&lt;/li>
&lt;/ul>
&lt;p>But GitHub&amp;rsquo;s ~20GB limitation kept getting in the way 🙅 Sure, I could have paid GitHub for their larger runners with more disk space, but being both cheap and stubborn, I wasn&amp;rsquo;t having any of that! 💸❌ Instead, I started thinking, &lt;em>&amp;ldquo;Hang on a minute, those free runners must have more space somewhere - I just need to find it and claim it!&amp;rdquo;&lt;/em> 🤔💭&lt;/p>
&lt;p>After digging through the runner specs and file system layout, I discovered that &lt;strong>GitHub Actions runners have a large chunk of free space on the &lt;code>/mnt&lt;/code> filesystem that&amp;rsquo;s barely used&lt;/strong> 🤯 There was also the possibility to reclaim significant space by purging pre-installed software that Nix users don&amp;rsquo;t need anyway 😈&lt;/p>
&lt;h2 id="the-slightly-mad-science-bit-">The Slightly Mad Science Bit ‍🧑‍🔬&lt;/h2>
&lt;p>At its core, &lt;em>Nothing but Nix&lt;/em> uses a two-pronged attack:&lt;/p>
&lt;h3 id="1-the-initial-slash-instant-volume-creation">1. The Initial Slash: Instant Volume Creation&lt;/h3>
&lt;p>First, the action creates a large loop device from free space on &lt;code>/mnt&lt;/code> and sets up a properly tuned BTRFS filesystem:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Create a large disk image in the free space&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">free_space&lt;/span>=&lt;span style="color:#f00">$(&lt;/span>df -m --output=avail /mnt | tail -n &lt;span style="color:#f60">1&lt;/span> | tr -d &lt;span style="color:#87ceeb">&amp;#39; &amp;#39;&lt;/span>&lt;span style="color:#f00">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">loop_dev&lt;/span>=&lt;span style="color:#f00">$(&lt;/span>sudo losetup --find&lt;span style="color:#f00">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo fallocate -l &lt;span style="color:#f00">$((&lt;/span>free_space - &lt;span style="color:#f60">1024&lt;/span>&lt;span style="color:#f00">))&lt;/span>M &lt;span style="color:#87ceeb">&amp;#34;/mnt/disk0.img&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo losetup &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#87ceeb">${&lt;/span>&lt;span style="color:#eedd82">loop_dev&lt;/span>&lt;span style="color:#87ceeb">}&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span> &lt;span style="color:#87ceeb">&amp;#34;/mnt/disk0.img&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Set up an optimized BTRFS filesystem&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo mkfs.btrfs -L nix -d raid0 -m raid0 --nodiscard &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#87ceeb">${&lt;/span>&lt;span style="color:#eedd82">loop_dev&lt;/span>&lt;span style="color:#87ceeb">}&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo mount &lt;span style="color:#eedd82">LABEL&lt;/span>=nix /nix -o noatime,nobarrier,nodiscard,compress=zstd:1,space_cache=v2,commit=&lt;span style="color:#f60">120&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>This immediately provides around 65GB of Nix-ready space before your workflow even gets going!&lt;/strong> 💪
I could have stopped here, but did I mention beging stubborn yet? 🫏&lt;/p>
&lt;h3 id="2-the-background-purge-merciless-space-reclamation">2. The Background Purge: Merciless Space Reclamation&lt;/h3>
&lt;p>&lt;strong>While your workflow continues&lt;/strong>, &lt;em>Nothing but Nix&lt;/em> starts a background process to ruthlessly eliminate unnecessary software:&lt;/p>
&lt;ul>
&lt;li>Docker images? Gone! 🗑️&lt;/li>
&lt;li>Language runtimes? Obliterated! 💥&lt;/li>
&lt;li>Package managers? Annihilated! 💣&lt;/li>
&lt;li>Documentation? Vaporized! 🔥&lt;/li>
&lt;/ul>
&lt;p>As space is reclaimed, it creates a second disk image on the root file system and adds it to the BTRFS pool, &lt;strong>dynamically growing your Nix volume up to around 130GB.&lt;/strong> 🚀&lt;/p>
&lt;p>The file system purge is powered by &lt;code>rmz&lt;/code> (from the &lt;a href="https://github.com/SUPERCILEX/fuc">Fast Unix Commands (FUC)&lt;/a> project) - a high-performance alternative to &lt;code>rm&lt;/code> that makes deletion blazingly fast. &lt;strong>Using traditional &lt;code>rm&lt;/code> a full file system purge took ~11 minutes ⏳😞 &lt;code>rmz&lt;/code> cut that to under 60 seconds!&lt;/strong> ️⏱️😀&lt;/p>
&lt;h3 id="btrfs-with-nodiscard">BTRFS with &lt;code>nodiscard&lt;/code>?&lt;/h3>
&lt;p>I&amp;rsquo;m using &lt;a href="https://btrfs.readthedocs.io/en/latest/">BTRFS&lt;/a> for the volume because it:&lt;/p>
&lt;ol>
&lt;li>Supports dynamic device addition&lt;/li>
&lt;li>Has built-in compression to save even more space&lt;/li>
&lt;li>Allows optimal space utilization with RAID0 layout&lt;/li>
&lt;/ol>
&lt;p>The &lt;strong>&lt;code>nodiscard&lt;/code> mount option is absolutely essential&lt;/strong> because we&amp;rsquo;re using loop devices backed by &lt;a href="https://en.wikipedia.org/wiki/Sparse_file">sparse files&lt;/a>.&lt;/p>
&lt;p>Without it, BTRFS would try to issue &lt;a href="https://btrfs.readthedocs.io/en/latest/Trim.html">TRIM/discard&lt;/a> commands that cause allocation size to be misreported when using loop devices. This misreporting would result in inaccurate space accounting. The &lt;code>nodiscard&lt;/code> option ensures the filesystem maintains an accurate picture of its available storage.&lt;/p>
&lt;h2 id="choose-your-weapon-the-hatchet-protocol-">Choose Your Weapon: The Hatchet Protocol 🪓&lt;/h2>
&lt;p>Not everyone needs the same level of space reclamation, so I&amp;rsquo;ve added different &lt;em>&amp;ldquo;Hatchet Protocol&amp;rdquo;&lt;/em> levels to control how aggressive the action is:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>- uses: wimpysworld/nothing-but-nix@main
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> with:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> hatchet-protocol: &amp;#39;cleave&amp;#39; # Options: holster, carve, cleave (default), rampage
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Protocol&lt;/th>
&lt;th>&lt;code>/nix&lt;/code>&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Holster&lt;/td>
&lt;td>~65GB&lt;/td>
&lt;td>Keep the hatchet sheathed, use space from &lt;code>/mnt&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Carve&lt;/td>
&lt;td>~85GB&lt;/td>
&lt;td>Craft and combine free space from &lt;code>/&lt;/code> and &lt;code>/mnt&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Cleave&lt;/td>
&lt;td>~115GB&lt;/td>
&lt;td>Make decisive cuts to large packages&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Rampage&lt;/td>
&lt;td>~130GB&lt;/td>
&lt;td>Relentless elimination of all bloat&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>I recommend &lt;strong>Cleave&lt;/strong> for most users, which is the default setting. It strikes a good balance between reclaiming space and keeping some useful tools around. But if you&amp;rsquo;re a proper Nix enthusiast who believes that &lt;code>#nix-is-life&lt;/code>, the Rampage protocol will squeeze out every last byte of space for your Nix store ️️❄️&lt;/p>
&lt;h2 id="from-frustration-to-freedom-">From Frustration to Freedom ️🕊️&lt;/h2>
&lt;p>Since implementing &lt;em>Nothing but Nix&lt;/em>, I&amp;rsquo;ve been able to build &lt;strong>all&lt;/strong> my NixOS and Home Manager configurations in CI. This means:&lt;/p>
&lt;ol>
&lt;li>🔒 Every &lt;code>flake.lock&lt;/code> update is fully tested against my complete configuration set&lt;/li>
&lt;li>✅ All successful builds are cached to FlakeHub Cache&lt;/li>
&lt;li>⚡ System updates are lightning-fast&lt;/li>
&lt;/ol>
&lt;p>This has been an absolute game-changer for my workflow. Now when I apply updates to any of my devices, everything is delivered directly from &lt;code>cache.flakehub.com&lt;/code> with zero local compilation time! 🚀 All packages have been pre-built and verified in CI, meaning updates that would have taken ages to compile (&lt;em>looking at you &lt;code>ollama&lt;/code>&lt;/em> 👀) locally now complete in seconds. It&amp;rsquo;s the difference between waiting for a coffee break and a blink-and-you&amp;rsquo;ll-miss-it experience 🤩&lt;/p>
&lt;p>Here&amp;rsquo;s what the build times look like:&lt;/p>
&lt;ul>
&lt;li>💁 2x Servers: ~5-10 minutes&lt;/li>
&lt;li>️🖥️ 2x Workstations: ~6-13 minutes&lt;/li>
&lt;li>💻 4x Laptops: ~7-10 minutes&lt;/li>
&lt;li>👻 2x Virutal Manachines: ~4-10 minutes&lt;/li>
&lt;li>📦 59x Local packages: ~5-14 minutes&lt;/li>
&lt;/ul>
&lt;h2 id="getting-started-with-nothing-but-nix-">Getting Started with &lt;em>Nothing but Nix&lt;/em> ✨&lt;/h2>
&lt;p>Ready to give it a go? Here&amp;rsquo;s how to use it in your GitHub Actions workflow:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>name: &lt;span style="color:#87ceeb">&amp;#34;Test Nix Flake&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>on:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> pull_request:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> push:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> branches: [ main ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>jobs:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> tests:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> runs-on: ubuntu-latest
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> permissions:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> id-token: write
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> contents: read
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> steps:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - uses: actions/checkout@v4
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0f0"># 👇 Add this before installing Nix&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - uses: wimpysworld/nothing-but-nix@main
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - uses: DeterminateSystems/determinate-nix-action@main
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - run: |&lt;span style="color:#87ceeb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb"> # Now you have 100+ GB for your Nix builds!
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb"> nix build . -L
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb"> nix flake check&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>For FlakeHub users, make sure you add the &lt;code>permissions&lt;/code> block as shown above. This allows &lt;a href="https://determinate.systems/nix/">Determinate Nix&lt;/a> to authenticate with FlakeHub and FlakeHub Cache.&lt;/p>
&lt;h2 id="beyond-storage-to-virtual-machines-">Beyond Storage to Virtual Machines? 🔮&lt;/h2>
&lt;p>Now that I&amp;rsquo;ve proven large volumes can be dynamically constructed in GitHub runners, I&amp;rsquo;m starting to think about what else might be possible. A GitHub action that implements something like &lt;a href="https://github.com/quickemu-project/quickemu">Quickemu&lt;/a> (&lt;em>another project of mine&lt;/em>), to standup KVM-accelerated VMs inside a GitHub runner is my favourite idea 💡&lt;/p>
&lt;p>GitHub has &lt;a href="https://github.blog/changelog/2023-02-23-hardware-accelerated-android-virtualization-on-actions-windows-and-linux-larger-host">recently announced&lt;/a> hardware acceleration for Android virtualization on Linux runners, which means the KVM infrastructure is already there and avilable for open source projects and larger runners 😯 All we need to do is leverage it for our own VMs.&lt;/p>
&lt;p>Imagine being able to run a full VM of your validated build environment inside GitHub Actions! It would be like having a self-hosted runner, but without the self-hosting 😏 And it just so happens that the &lt;a href="https://github.com/DeterminateSystems/determinate-nix-action">Determinate Nix Action&lt;/a> enables KVM in GitHub runners. Coincidence? 😉&lt;/p>
&lt;h2 id="build-something-massive-">Build Something Massive ️🏗️&lt;/h2>
&lt;p>&lt;em>Nothing but Nix&lt;/em> removes one of the most frustrating limitations for Nix users in GitHub Actions. No more trimming your configurations to fit into tiny spaces - now you can build and test your full NixOS fleet with confidence 🤓&lt;/p>
&lt;p>Give it a try, and let me know what you think!&lt;/p>
&lt;p>The action is available at:&lt;/p>
&lt;ul>
&lt;li>GitHub: &lt;a href="https://github.com/wimpysworld/nothing-but-nix">wimpysworld/nothing-but-nix&lt;/a>&lt;/li>
&lt;li>Marketplace: &lt;a href="https://github.com/marketplace/actions/nothing-but-nix">&lt;em>Nothing but Nix&lt;/em>&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>If you run into any issues or have ideas for improvements, please open an issue on GitHub. And if this tool saves your CI builds, consider giving the repo a star! ⭐&lt;/p>
&lt;p>Happy Nixing! ❄️&lt;/p></description><summary>The Nix Space Heist: Reclaiming 130GB in GitHub Actions</summary></item><item><title>Fuzzel Colour Picker</title><link>https://wimpysworld.com/posts/fuzzel-hyprpicker/</link><pubDate>Tue, 15 Apr 2025 13:37:42 +0100</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/fuzzel-hyprpicker/</guid><description>&lt;p>We&amp;rsquo;ve all been there - you&amp;rsquo;re knee-deep in customizing your desktop, tweaking configs, perfecting that theme, and suddenly you need to grab a specific colour from somewhere on screen.
If you&amp;rsquo;re like me and recently made the jump to &lt;a href="https://hyprland.org/">Hyprland&lt;/a> (or other contemporary Wayland compositor), you might have found yourself missing some of those handy X11 utilities that &lt;em>&amp;ldquo;just worked&amp;rdquo;&lt;/em> ️™️&lt;/p>
&lt;h2 id="the-wayland-colour-picker-problem">The Wayland Colour Picker Problem&lt;/h2>
&lt;p>When I switched my daily driver to Hyprland back in August 2024, I was chuffed with the smooth animations, efficient tiling, and general polish.
But as with any big change, there were a few splinters in my workflow that needed sorting.&lt;/p>
&lt;p>One particular rough edge was the lack of a proper GUI colour picker.
On X11, I&amp;rsquo;d been spoiled by my mate &lt;a href="https://mastodon.social/@sil">Stuart Langridge&lt;/a>&amp;rsquo;s excellent tool &lt;strong>&lt;a href="https://www.kryogenix.org/code/pick/">Pick&lt;/a>&lt;/strong> - a proper colour picker that did exactly what it said on the tin.
But in Wayland? Well, I was left running &lt;a href="https://github.com/hyprwm/hyprpicker">&lt;code>hyprpicker&lt;/code>&lt;/a> from the terminal like some kind of savage! 😅&lt;/p>
&lt;p class="text-center">
&lt;img src="./hyprpicker.png" class="img-fluid" alt="hyprpicker in the terminal "/>
&lt;br />
&lt;em>hyprpicker in the terminal&lt;/em>
&lt;/p>
&lt;p>Don&amp;rsquo;t get me wrong - &lt;code>hyprpicker&lt;/code> works brilliantly for what it is.
But after seeing how well my recent integrations of &lt;a href="https://github.com/e-tho/bzmenu">&lt;strong>bzmenu&lt;/strong>&lt;/a> and &lt;a href="https://github.com/e-tho/iwmenu">&lt;strong>iwmenu&lt;/strong>&lt;/a> worked with &lt;a href="https://codeberg.org/dnkl/fuzzel">Fuzzel&lt;/a>, a lightbulb moment hit me: why not create a proper Fuzzel-based front-end for &lt;code>hyprpicker&lt;/code>? 💡&lt;/p>
&lt;h2 id="birth-of-fuzzel-hyprpicker">Birth of fuzzel-hyprpicker&lt;/h2>
&lt;p>After my second coffee one morning (the optimal programming fuel ☕💪), I decided to tackle this problem head-on.
If I was going to spend hours staring at my &lt;a href="https://catppuccin.com/">Catppuccin Mocha&lt;/a> themed desktop, I needed proper tools to maintain it! ‍🐈‍⬛🎨&lt;/p>
&lt;p>The goal was simple:&lt;/p>
&lt;ul>
&lt;li>Create a Fuzzel-based UI for &lt;code>hyprpicker&lt;/code>&lt;/li>
&lt;li>Maintain persistent colour history&lt;/li>
&lt;li>Make it keyboard-friendly&lt;/li>
&lt;li>Automatcially copy selected colours to clipboard&lt;/li>
&lt;/ul>
&lt;p>The result is &lt;a href="https://github.com/wimpysworld/nix-config/blob/main/home-manager/_mixins/desktop/hyprland/fuzzel/fuzzel-hyprpicker.sh">&lt;code>fuzzel-hyprpicker.sh&lt;/code>&lt;/a> - a little script that brings together the power of &lt;code>hyprpicker&lt;/code> with the elegant UI of Fuzzel.&lt;/p>
&lt;p class="text-center">
&lt;img src="./fuzzel-hyprpicker.png" class="img-fluid" alt="fuzzel-hyprpicker colour selection menu "/>
&lt;br />
&lt;em>fuzzel-hyprpicker showing the colour selection menu&lt;/em>
&lt;/p>
&lt;h2 id="how-it-works">How It Works&lt;/h2>
&lt;p>The magic behind &lt;code>fuzzel-hyprpicker.sh&lt;/code> is surprisingly straightforward.
Let me walk you through the key bits:&lt;/p>
&lt;h3 id="setting-up-the-basics">Setting Up the Basics&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e5e5e5">#!/usr/bin/env bash
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e5e5e5">&lt;/span>&lt;span style="color:#0f0"># A tool to pick colours from the screen using hyprpicker and fuzzel&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set +u &lt;span style="color:#0f0"># Disable nounset&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">APP_NAME&lt;/span>=&lt;span style="color:#87ceeb">&amp;#34;fuzzel-hyprpicker&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">NOTIFY&lt;/span>=&lt;span style="color:#87ceeb">&amp;#34;notify-desktop --app-name=&lt;/span>&lt;span style="color:#eedd82">$APP_NAME&lt;/span>&lt;span style="color:#87ceeb"> --icon=org.gnome.design.Palette&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Set up the storage directory and file&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">CONFIG_DIR&lt;/span>=&lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#87ceeb">${&lt;/span>&lt;span style="color:#eedd82">XDG_CONFIG_HOME&lt;/span>&lt;span style="color:#f00">:-&lt;/span>&lt;span style="color:#eedd82">$HOME&lt;/span>/.config&lt;span style="color:#87ceeb">}&lt;/span>&lt;span style="color:#87ceeb">/&lt;/span>&lt;span style="color:#eedd82">$APP_NAME&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">HISTORY_FILE&lt;/span>=&lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$CONFIG_DIR&lt;/span>&lt;span style="color:#87ceeb">/colours.txt&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">ICONS_DIR&lt;/span>=&lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$CONFIG_DIR&lt;/span>&lt;span style="color:#87ceeb">/icons&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Nothing fancy here - we&amp;rsquo;re just setting up our environment, defining where we&amp;rsquo;ll store our colour history, and setting up notifications.
Note that I properly follow the XDG spec here - it&amp;rsquo;s the little things! 😉&lt;/p>
&lt;h3 id="the-clever-bit-svg-icons">The Clever Bit: SVG Icons&lt;/h3>
&lt;p>Here&amp;rsquo;s where things get interesting.
Fuzzel supports icons in its menus, but I needed a way to show colour swatches.
The solution? Dynamically generated SVG files:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">function&lt;/span> generate_svg_icon() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> local &lt;span style="color:#eedd82">colour&lt;/span>=&lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$1&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> local &lt;span style="color:#eedd82">icon_path&lt;/span>=&lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$ICONS_DIR&lt;/span>&lt;span style="color:#87ceeb">/&lt;/span>&lt;span style="color:#eedd82">$colour&lt;/span>&lt;span style="color:#87ceeb">.svg&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0f0"># Create an SVG for the colour if it doesn&amp;#39;t exist&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">if&lt;/span> [ ! -f &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$icon_path&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span> ]; &lt;span style="color:#f00">then&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> cat &amp;gt; &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$icon_path&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span> &lt;span style="color:#87ceeb">&amp;lt;&amp;lt;EOF
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">&amp;lt;svg width=&amp;#34;128&amp;#34; height=&amp;#34;128&amp;#34; xmlns=&amp;#34;http://www.w3.org/2000/svg&amp;#34;&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb"> &amp;lt;rect width=&amp;#34;128&amp;#34; height=&amp;#34;128&amp;#34; fill=&amp;#34;#$colour&amp;#34; /&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">&amp;lt;/svg&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">EOF&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>I&amp;rsquo;m rather pleased with myself for this solution.
Each time you pick a colour, it generates a tiny SVG file that&amp;rsquo;s just a coloured square.
Fuzzel then displays this next to the hex code in the menu. Well done brain! 🧠&lt;/p>
&lt;h3 id="menu-building">Menu Building&lt;/h3>
&lt;p>The menu itself is built dynamically, showing an eyedropper icon for picking a new colour followed by your colour history:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">function&lt;/span> build_menu() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> echo -e &lt;span style="color:#87ceeb">&amp;#34;Pick a colour\0icon\x1f&lt;/span>&lt;span style="color:#eedd82">$ICONS_DIR&lt;/span>&lt;span style="color:#87ceeb">/eyedropper.svg&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0f0"># Add history items if they exist&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">if&lt;/span> [ -s &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$HISTORY_FILE&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span> ]; &lt;span style="color:#f00">then&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">while&lt;/span> read -r colour; &lt;span style="color:#f00">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0f0"># If the preview icon doesn&amp;#39;t exist, generate it&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">if&lt;/span> [ ! -e &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$ICONS_DIR&lt;/span>&lt;span style="color:#87ceeb">/&lt;/span>&lt;span style="color:#eedd82">$colour&lt;/span>&lt;span style="color:#87ceeb">.svg&amp;#34;&lt;/span> ]; &lt;span style="color:#f00">then&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> generate_svg_icon &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$colour&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0f0"># Display the colour with a preview&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> echo -e &lt;span style="color:#87ceeb">&amp;#34;#&lt;/span>&lt;span style="color:#eedd82">$colour&lt;/span>&lt;span style="color:#87ceeb">\0icon\x1f&lt;/span>&lt;span style="color:#eedd82">$ICONS_DIR&lt;/span>&lt;span style="color:#87ceeb">/&lt;/span>&lt;span style="color:#eedd82">$colour&lt;/span>&lt;span style="color:#87ceeb">.svg&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">done&lt;/span> &amp;lt; &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$HISTORY_FILE&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This uses the &lt;a href="https://github.com/davatorium/rofi">&lt;code>rofi&lt;/code>&lt;/a> &amp;ldquo;protocol&amp;rdquo; for menu items, something Fuzzel has built-in support for 💖
The &lt;code>\0icon\x1f&lt;/code> bit is how you tell Fuzzel &lt;em>&amp;ldquo;hey, use this icon for this menu item&amp;rdquo;&lt;/em>.&lt;/p>
&lt;h3 id="putting-it-all-together">Putting It All Together&lt;/h3>
&lt;p>The full workflow goes like this:&lt;/p>
&lt;ol>
&lt;li>Press &lt;kbd>Ctrl&lt;/kbd> + &lt;kbd>Alt&lt;/kbd> + &lt;kbd>K&lt;/kbd> to open the picker&lt;/li>
&lt;li>Select &lt;strong>&amp;ldquo;Pick a colour&amp;rdquo;&lt;/strong> or choose one from your history&lt;/li>
&lt;li>If picking a new colour, &lt;code>hyprpicker&lt;/code> does it&amp;rsquo;s thing and click anywhere on screen&lt;/li>
&lt;li>The colour gets automatically copied to your clipboard&lt;/li>
&lt;li>A notification appears showing the selected colour&lt;/li>
&lt;/ol>
&lt;p class="text-center">
&lt;img src="./hyprpicker-select.png" class="img-fluid" alt="hyprpicker colour selection "/>
&lt;br />
&lt;em>hyprpicker colour selection&lt;/em>
&lt;/p>
&lt;h2 id="integrating-it-with-your-setup">Integrating It With Your Setup&lt;/h2>
&lt;p>Want to give this a try yourself?
Here&amp;rsquo;s how to adapt it to your wlroots-compatible desktop:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>First, make sure you have the following installed:&lt;/p>
&lt;ul>
&lt;li>&lt;code>hyprpicker&lt;/code>&lt;/li>
&lt;li>&lt;code>fuzzel&lt;/code>&lt;/li>
&lt;li>&lt;a href="https://github.com/bugaevc/wl-clipboard">&lt;code>wl-clipboard&lt;/code>&lt;/a> (for clipboard management)&lt;/li>
&lt;li>&lt;a href="https://github.com/nowrep/notify-desktop">&lt;code>notify-desktop&lt;/code>&lt;/a> (for notifications)
&lt;ul>
&lt;li>Although I&amp;rsquo;m planning on switching to &lt;a href="https://codeberg.org/dnkl/fyi">&lt;code>fyi&lt;/code>&lt;/a> soon&amp;hellip;&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>Save the script somewhere in your path (I&amp;rsquo;ve got mine as part of &lt;a href="https://github.com/wimpysworld/nix-config">my Nix configuration&lt;/a>) ️❄️&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Make it executable:&lt;/p>
&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>chmod +x fuzzel-hyprpicker.sh
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="4">
&lt;li>Bind it to a keyboard shortcut in your Hyprland config:&lt;/li>
&lt;/ol>
&lt;pre tabindex="0">&lt;code>bind = CTRL ALT, K, exec, fuzzel-hyprpicker.sh
&lt;/code>&lt;/pre>&lt;ol start="5">
&lt;li>Give it a whirl!&lt;/li>
&lt;/ol>
&lt;p>It should work with any wlroots-compatible compositor, not just Hyprland.&lt;/p>
&lt;h2 id="possible-enhancements">Possible Enhancements&lt;/h2>
&lt;p>This is very much a v1 and there&amp;rsquo;s plenty of room for improvement:&lt;/p>
&lt;ul>
&lt;li>Add support for different colour formats (RGB, HSL, etc.)&lt;/li>
&lt;li>Implement colour name lookup&lt;/li>
&lt;li>Create a proper project rather than just a script wedged in my Nix configuration&lt;/li>
&lt;/ul>
&lt;p>But for a morning hack, it&amp;rsquo;s been surprisingly useful!
Reaching for &lt;kbd>Ctrl&lt;/kbd> + &lt;kbd>Alt&lt;/kbd> + &lt;kbd>K&lt;/kbd> brings a smile to my face 😀&lt;/p>
&lt;h2 id="the-joy-of-keyboard-driven-workflows">The Joy of Keyboard-Driven Workflows&lt;/h2>
&lt;p>What I love about tools like this is how they contribute to a cohesive, keyboard-driven workflow.
Between Hyprland&amp;rsquo;s tiling, Waybar&amp;rsquo;s status info, and Fuzzel-based menus for everything from launching apps to picking colours, my fingers rarely stray from the keyboard these days.&lt;/p>
&lt;p>There&amp;rsquo;s something deeply satisfying about crafting your own tools to scratch your own itches.
It&amp;rsquo;s a long held Linux desktop tradition, isn&amp;rsquo;t it?
Taking what works, improving what doesn&amp;rsquo;t, and sharing the results with others.&lt;/p>
&lt;p class="text-center">
&lt;a href="https://linuxmatters.sh" target="_blank">&lt;img src="./hyprland-desktop.png" class="img-fluid" alt="hyprland desktop with fuzzel-hyprpicker "/>&lt;/a>
&lt;br />
&lt;em>My hyprland desktop with fuzzel-hyprpicker in action&lt;/em>
&lt;/p>
&lt;h2 id="more-fuzzel-based-tools">More Fuzzel-Based Tools?&lt;/h2>
&lt;p>I&amp;rsquo;ve created several other Fuzzel menus that integrate with my Hyprland desktop.
I should probably post about those as well - emoji picker and screenshot and screen recording being among my most useful.
Let me know in the comments if you&amp;rsquo;d be interested in seeing those! 👇&lt;/p>
&lt;p>In the meantime, give &lt;code>fuzzel-hyprpicker.sh&lt;/code> a try and let me know what you think.
&lt;strong>And if you improve upon it, &lt;em>please do share your changes!&lt;/em>&lt;/strong>&lt;/p>
&lt;p>The full script is available in my Nix config repository: &lt;a href="https://github.com/wimpysworld/nix-config/blob/main/home-manager/_mixins/desktop/hyprland/fuzzel/fuzzel-hyprpicker.sh">fuzzel-hyprpicker.sh&lt;/a>&lt;/p>
&lt;p>Happy colour picking! 🎨🤏&lt;/p>
&lt;hr>
&lt;p>&lt;em>Have you created any custom tools for your Wayland desktop? Are there any X11 utilities you miss since switching? Let me know in the comments below!&lt;/em>&lt;/p></description><summary>Creating a Proper Colour Picker for Hyprland with Fuzzel</summary></item><item><title>Install ZeroTier on Steam Deck</title><link>https://wimpysworld.com/posts/install-zerotier-on-steamdeck/</link><pubDate>Thu, 17 Aug 2023 12:15:45 +0100</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/install-zerotier-on-steamdeck/</guid><description>&lt;p>It took 9 episodes of &lt;a href="https://linuxmatters.sh">Linux Matters&lt;/a> for my friends and co-hosts &lt;a href="https://linuxmatters.sh/host/apope/">Alan&lt;/a> and &lt;a href="https://linuxmatters.sh/host/mjohnson/">Mark&lt;/a> to wear down 😅 my resolve to buy a &lt;a href="https://www.steamdeck.com/en/">Steam Deck&lt;/a>, even &lt;a href="https://wimpysworld.com/posts/steambox-vs-steamdeck/">after I passed on my original Steam Deck pre-order&lt;/a>.
I&amp;rsquo;m glad they did, it&amp;rsquo;s a great little device and a dream come true for Linux 🐧 nerds; excellent hardware and completely hackable 🧑‍💻&lt;/p>
&lt;p>I ordered the 64GB model via the recently announced &lt;a href="https://store.steampowered.com/sale/steamdeckrefurbished">Steam Deck™ Certified Refurbished&lt;/a> program.
I&amp;rsquo;m going to resist retrofitting a larger NVMe SSD, and have instead added a 1TB microSDXC card 💾
The 64GB internal eMMC storage will be used for SteamOS and the microSDXC card will be used exclusively for games 🕹️&lt;/p>
&lt;p>While I&amp;rsquo;m avoiding hardware modifications, I do want to install some software enhancements on the Steam Deck; specifically &lt;a href="https://www.zerotier.com/">ZeroTier&lt;/a>.
&lt;strong>I spoke enthusiastically about ZeroTier in &lt;a href="https://linuxmatters.sh/episodes/8/">Linux Matters: Picking Apart the Steam Deck (Episode 8)&lt;/a>&lt;/strong>; it is as essential as WiFi for me.
So, give that episode a listen to hear why I love ZeroTier so much 💖&lt;/p>
&lt;p class="text-center">
&lt;a href="https://linuxmatters.sh" target="_blank">&lt;img src="https://linuxmatters.sh/img/episode/linuxmatters-banner-3000x750.webp" class="img-fluid" alt="Linux Matters Podcast"/>&lt;/a>
&lt;br />
&lt;em>Linux Matters Podcast&lt;/em>
&lt;/p>
&lt;p>What follows is a guide to installing ZeroTier on the Steam Deck, &lt;strong>but this technique can be used to install any software on Steam Deck that is available for Arch Linux&lt;/strong> 👍️&lt;/p>
&lt;h1 id="installing-zerotier-on-steam-deck">Installing ZeroTier on Steam Deck&lt;/h1>
&lt;p>The Steam Deck has a (&lt;em>mostly&lt;/em>) read-only filesystem.
We&amp;rsquo;ll use &lt;a href="https://github.com/ValShaped/rwfus">Rwfus: Read-Write OverlayFS for your Steam Deck&lt;/a> to install ZeroTier so that it persists across reboots &lt;em>and&lt;/em> SteamOS updates.&lt;/p>
&lt;p>The author describes &lt;code>rwfus&lt;/code> as:&lt;/p>
&lt;blockquote>
&lt;p>a vinyl couch cover for your filesystem, Rwfus covers your Deck&amp;rsquo;s &lt;code>/usr/&lt;/code> directory (and some others) allowing you to initialize and use &lt;code>pacman&lt;/code> (the Arch Linux package manager) on the Steam Deck without losing packages when the next update comes out.&lt;/p>
&lt;/blockquote>
&lt;p>Perfect 👌️&lt;/p>
&lt;h2 id="enter-the-desktop">Enter the Desktop&lt;/h2>
&lt;p>The process of installing and configuring ZeroTier requires the use of the Steam Deck desktop mode.
Connecting a mouse 🖱️ and keyboard ⌨️ to the Steam Deck will make this process much easier.
After the Steam Deck has booted you should Switch to Desktop.&lt;/p>
&lt;ul>
&lt;li>Press the &amp;ldquo;Steam&amp;rdquo; button on the Steam Deck and scroll down through the menu and select &amp;ldquo;Power&amp;rdquo;.&lt;/li>
&lt;li>Then, select the &amp;ldquo;Switch to Desktop&amp;rdquo; option.&lt;/li>
&lt;li>Once the desktop has loaded, click on the Steam Deck logo in the lower-left corner of the desktop to bring up the menu.&lt;/li>
&lt;li>Select &amp;ldquo;System&amp;rdquo; in the left column and then &amp;ldquo;Konsole&amp;rdquo; from the right column.
&lt;ul>
&lt;li>You can also press the Super key and type in &amp;ldquo;Konsole&amp;rdquo; in the search bar.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Suddenly, as if by magic, the terminal appeared 🪄&lt;/li>
&lt;/ul>
&lt;p class="text-center">
&lt;img src="./magic-terminal.webp" class="img-fluid" alt="Konsole"/>
&lt;br />
&lt;em>Konsole on Steam Deck&lt;/em>
&lt;/p>
&lt;h2 id="set-a-password">Set a Password&lt;/h2>
&lt;p>By default, no password 🔓️ is set for the &lt;code>deck&lt;/code> user.
With no password set, it is not possible to run commands in the root context using &lt;code>sudo&lt;/code>.
Type &lt;code>passwd&lt;/code> in the terminal to set a password.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>(deck@steamdeck ~) $ passwd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>New Password:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Retype New Password:
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="install-rwfus">Install Rwfus&lt;/h2>
&lt;p>With that done we can install &lt;code>rwfus&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>git clone https://github.com/ValShaped/rwfus.git
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cd rwfus
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>./rwfus -iI
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="install-zerotier">Install ZeroTier&lt;/h2>
&lt;p>Run &lt;code>sudo pacman -Sy&lt;/code> to update your repositories 🌿
Now install ZeroTier.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>sudo pacman -S zerotier-one
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="enable-and-start-zerotier-service">Enable and Start ZeroTier service&lt;/h3>
&lt;p>ZeroTier installs its systemd unit in &lt;code>/usr/lib/systemd/system/&lt;/code>, but as we&amp;rsquo;re installing while Rwfus is active that service file is installed into the Rwfus overlay.
This is a problem because running &lt;code>systemctl enable zerotier-one&lt;/code> now would create a systemd unit in &lt;code>/etc/systemd/system/multi-user.target.wants/&lt;/code> that references a file in &lt;code>/usr&lt;/code>, and that file will not exist until Rwfus is running.
The effect is that the ZeroTier service will not start on boot as systemd will not be able to find the service file.&lt;/p>
&lt;p>But there is a simple workaround, copy the ZeroTier service file to &lt;code>/etc/systemd/system&lt;/code>, which is fine as &lt;code>/etc&lt;/code> is already a writable overlay.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>cp /usr/lib/systemd/system/zerotier-one.service /etc/systemd/system/zerotier-one.service
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Now, enable and start the ZeroTier service.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>sudo systemctl enable zerotier-one --now
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="join-a-zerotier-network">Join a ZeroTier Network&lt;/h2>
&lt;p>Find your ZeroTier device ID (a 10-digit hexadecimal number) by running:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>sudo zerotier-cli info
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The output will look 👀 something like this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>200 info deadbeef00 1.10.1 OFFLINE
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Join a ZeroTier network using a network ID (a 16-digit hexadecimal number) which you can get from the &lt;a href="https://my.zerotier.com/">My ZeroTier page&lt;/a>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>sudo zerotier-cli join &amp;lt;network id&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Return to the &lt;a href="https://my.zerotier.com/">My ZeroTier page&lt;/a> select the network you joined, scroll down to the Members section and authorize the Steam Deck device ID.&lt;/p>
&lt;p>Verify that the Steam Deck is correctly allocated an IP address, this may take up to 30 seconds ⏳️&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>ip --brief addr | grep ^zt
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You should see 👁️ output similar to this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>zta1b2c3d4 UNKNOWN 192.168.192.59/24 baad::4a4a:faff:fefe:5aa5/64
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="use-your-zerotier-network">Use your ZeroTier network&lt;/h2>
&lt;p>You can now connect from your Steam Deck to other devices on the same ZeroTier network.
Or you could enable SSH on the Steam Deck and then log in to it from another device on the ZeroTier network 💪&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>sudo systemctl enable sshd --now
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="conclusion">Conclusion&lt;/h2>
&lt;p>With ZeroTier installed on the Steam Deck, it is part of my network where ever I may roam; and enables some interesting possibilities such as remote play from anywhere in the world or &lt;a href="https://steamcommunity.com/sharedfiles/filedetails/?id=2632149295">playing LAN multi-player games with remote friends&lt;/a>.
Share in the comments how you&amp;rsquo;re using ZeroTier on your Steam Deck 💬&lt;/p>
&lt;p class="text-center">
&lt;img src="./SteamDeck-ZeroTier.webp" class="img-fluid" alt="Steam Deck with ZeroTier"/>
&lt;br />
&lt;em>Steam Deck&lt;/em>
&lt;/p>
&lt;p>I&amp;rsquo;ll be keeping my Steam Deck software modifications to a minimum 🤏 but where I do make changes I&amp;rsquo;ll be careful not to disrupt the SteamOS root file systems or potentially break SteamOS updates.
I&amp;rsquo;m glad solutions like Rwfus exist to allow me to install the software I need. But&amp;hellip;. 🤔&lt;/p>
&lt;p>&lt;a href="https://nixos.org">Nix&lt;/a> is what I work on as my day job at &lt;a href="https://determinate.systems">Determinate Systems&lt;/a> ❄️
I&amp;rsquo;m creating a little project that any Steam Deck owner can use to bring the power of Nix to Steam Deck while maintaining isolation from the SteamOS root file system.
That project depends on the &lt;a href="https://github.com/DeterminateSystems/nix-installer">Determinate Nix Installer&lt;/a>, &lt;strong>which natively supports Steam Deck&lt;/strong>.
So, if you want to get a head start with Nix on the Steam Deck then you can do that today 🙂&lt;/p></description><summary>How to persist software installation across SteamOS updates on the Steam Deck.</summary></item><item><title>Steam Box vs Steam Deck</title><link>https://wimpysworld.com/posts/steambox-vs-steamdeck/</link><pubDate>Mon, 01 May 2023 18:38:19 +0100</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/steambox-vs-steamdeck/</guid><description>&lt;p>When I received my Steam Deck Purchase Information email I wasn&amp;rsquo;t playing games all that often; mostly online racing games with friends once a week. I didn&amp;rsquo;t think I&amp;rsquo;d get much use out of a handheld console. I also had an inventory of PC parts available that could be used to build a dedicated Steam Box. So on July 18th 2022, I declined spending £569 on a Steam Deck and set about building a Steam Box instead. Here&amp;rsquo;s how I got on and what I learned.&lt;/p>
&lt;h2 id="as-featured-on-linux-matters-">As featured on Linux Matters! 🎙️&lt;/h2>
&lt;p>I recently discussed why I cancelled my Steam Deck pre-order on the &lt;a href="https://linuxmatters.sh/">Linux Matters&lt;/a> podcast. &lt;strong>You can hear that discussion with my friends Alan and Mark in &lt;a href="https://linuxmatters.sh/2/">Linux Matters: Lawful evil monitor alignment (Episode 2)&lt;/a>&lt;/strong>.&lt;/p>
&lt;p class="text-center">
&lt;a href="https://linuxmatters.sh" target="_blank">&lt;img src="https://linuxmatters.sh/img/episode/linuxmatters-banner-3000x750.webp" class="img-fluid" alt="Linux Matters Podcast"/>&lt;/a>
&lt;br />
&lt;em>Linux Matters Podcast&lt;/em>
&lt;/p>
&lt;h2 id="hardware-">Hardware 🖥️&lt;/h2>
&lt;p>At the time I had an inventory of parts that weren&amp;rsquo;t being used and on the second desk in my office I had an ultra-wide monitor, keyboard, mouse and more controllers than I know what to do with. From the parts I had available I selected the following:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://www.gigabyte.com/Motherboard/B550I-AORUS-PRO-AX-rev-10#kf">Gigabyte B550i Mini-ITX AORUS Pro AX Motherboard&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.amd.com/en/products/apu/amd-ryzen-7-5700g">AMD Ryzen™ 7 5700G&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://noctua.at/en/nh-l9a-am4">Noctua NH-L9a-AM4 Low Profile Cooler&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.corsair.com/uk/en/Categories/Products/Memory/VENGEANCE-LPX/p/CMK32GX4M2D3600C18">VENGEANCE® LPX 32GB (2 x 16GB) DDR4 DRAM 3600MHz C18&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.corsair.com/uk/en/Categories/Products/Storage/M-2-SSDs/MP600-CORE/p/CSSD-F1000GBMP600COR">MP600 CORE 1TB M.2 NVMe PCIe Gen. 4 x4 SSD&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.gigabyte.com/uk/Graphics-Card/GV-R57XTGAMING-OC-8GD-rev-10#kf">Gigabyte Radeon™ RX 5700 XT GAMING OC 8G&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.xbox.com/en-GB/accessories/adapters/wireless-adapter-windows">Microsoft Xbox Wireless Adapter for Windows 10&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>I had all the parts I needed to build a Steam Box, except for the case and power supply, so I bought a &lt;a href="https://www.fractal-design.com/products/cases/node/node-202/black/">Fractal Design Node 202 (without PSU)&lt;/a> for £65 on eBay and a &lt;a href="https://www.corsair.com/uk/en/Categories/Products/Power-Supply-Units/Power-Supply-Units-Advanced/SF-Series/p/CP-9020186-UK">CORSAIR SF750 80 PLUS Platinum SFX Power Supply&lt;/a> for £145 on Amazon.&lt;/p>
&lt;iframe src="https://kit.co/embed?url=https%3A%2F%2Fkit.co%2Fwimpysworld%2Fsteam-box" style="display: block; border: 0px; margin: 0 auto; width: 100%; height: 100vw; max-width: 700px; max-height: 700px" scrolling="no">&lt;/iframe>
&lt;h3 id="node-202-considerations-">Node 202 Considerations 💼&lt;/h3>
&lt;p>The Node 202 is a compact chassis (10.2 litres) that can house a capable gaming build, but has several specific considerations to keep in mind.&lt;/p>
&lt;h4 id="gpu-considerations">GPU Considerations&lt;/h4>
&lt;p>The case is designed for 2-slot graphics cards, which means that larger triple-slot cards may not fit. The maximum supported dimensions are:&lt;/p>
&lt;ul>
&lt;li>Length: 310mm&lt;/li>
&lt;li>Width: 145mm&lt;/li>
&lt;li>Depth: 47mm&lt;/li>
&lt;/ul>
&lt;p>The Radeon™ RX 5700 XT GAMING OC 8G I have is too big to fit in the Node 202 case, but I was able to remove the shroud and fans, which allowed me to fit the GPU in the case with 2x 120mm Noctua case fans mounted on the bottom panel of the case to provide cooling.&lt;/p>
&lt;p class="text-center">
&lt;img src="./deshrouded-gigabyte-radeon-5700xt.webp" class="img-fluid" alt="Deshrouded Gigabyte RX 5700XT Gaming OC"/>
&lt;br />
&lt;em>Deshrouded Gigabyte RX 5700XT Gaming OC&lt;/em>
&lt;/p>
&lt;h4 id="cpu-considerations">CPU Considerations&lt;/h4>
&lt;p>The Node 202 riser card interface is PCI Express &lt;strong>3.0&lt;/strong> x16 and there is limited space for a CPU cooler. This is why I went with the 5700G APU I had on hand, instead of the 5900X that I also had in my supplies.&lt;/p>
&lt;ul>
&lt;li>The 5700G APU is a 65W TDP part, requiring less cooling than the 5900X
&lt;ul>
&lt;li>The Noctua NH-L9a-AM4 I had is a low-profile cooler that is rated for 65W TDP.&lt;/li>
&lt;li>I replaced the NH-L9a-AM4 fan with a Noctua NF-B9 redux-1600 PWM 4-Pin, 1600 RPM to provide additional cooling&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>The 5700G APU is a single CCX, further reducing the cooling requirements&lt;/li>
&lt;li>The 5700G APU only has PCI Express 3.0, the same as the Riser card interface that comes with the Node 202 case
&lt;ul>
&lt;li>A CPU with PCI Express 4.0 support or higher would work too, but would be limited to PCI Express 3.0 speeds&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>The Node 202 also has limited space for cable management. The modular design of the Corsair SF750 power supply along with its easy-to-route cables helped to keep the cables tidy and prevented them from blocking airflow.&lt;/p>
&lt;p class="text-center">
&lt;img src="./partially-built-steambox.webp" class="img-fluid" alt="Partially Built Steam Box"/>
&lt;br />
&lt;em>Partially Built Steam Box&lt;/em>
&lt;/p>
&lt;h2 id="operating-system-">Operating System 📀&lt;/h2>
&lt;p>Initially, I installed &lt;a href="https://github.com/HoloISO">HoloISO&lt;/a>, which gets lots of attention but switched to &lt;a href="https://chimeraos.org/">ChimeraOS&lt;/a> on a recommendation from my friend &lt;a href="https://www.ypsidanger.com/">Jorge Casto&lt;/a>. &lt;strong>ChimeraOS is excellent!&lt;/strong> 🧑‍🍳🤌&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;ChimeraOS is an operating system that provides an out of the box couch gaming experience. After installation, boot directly into Steam Big Picture and start playing your favorite games.&lt;/p>
&lt;p>If you want Steam in your living room, you want ChimeraOS&amp;rdquo; - ChimeraOS Team&lt;/p>
&lt;/blockquote>
&lt;p>&lt;strong>If you&amp;rsquo;re building a Steam Box, I highly recommend ChimeraOS&lt;/strong>. One of the key advantages of ChimeraOS is its use of atomic updates. Atomic updates ensure that updates are applied as a single, cohesive unit, which reduces the likelihood of update failures and ensures that the system is always in a consistent state. In contrast, HoloISO uses the regular Arch Linux update mechanism, which applies updates individually and can potentially lead to update failures. In pursuit of a true console-like experience, ChimeraOS gets it right and even supports rolling back updates should anything go wrong.&lt;/p>
&lt;p class="text-center">
&lt;a href="https://chimeraos.org/" target="_blank">&lt;img src="./chimeraos.svg" class="img-fluid" alt="ChimeraOS"/>&lt;/a>
&lt;br />
&lt;/p>
&lt;p>ChimeraOS is a very well-thought-out implementation of a console-like operating system when compared to HoloISO. Here&amp;rsquo;s a summary of how ChimeraOS, SteamOS and HoloISO compare:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;/th>
&lt;th>ChimeraOS&lt;/th>
&lt;th>SteamOS 3.x&lt;/th>
&lt;th>HoloISO&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Based on&lt;/td>
&lt;td>Arch Linux&lt;/td>
&lt;td>Arch Linux&lt;/td>
&lt;td>SteamOS 3.x/Arch Linux&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Desktop&lt;/td>
&lt;td>Gnome&lt;/td>
&lt;td>KDE Plasma&lt;/td>
&lt;td>KDE Plasma&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Atomic updates&lt;/td>
&lt;td>✔️&lt;/td>
&lt;td>✔️&lt;/td>
&lt;td>❌&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Read-write root filesystem&lt;/td>
&lt;td>❌&lt;/td>
&lt;td>❌&lt;/td>
&lt;td>✔️&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Custom partitioning&lt;/td>
&lt;td>❌&lt;/td>
&lt;td>❌&lt;/td>
&lt;td>✔️&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>General hardware support&lt;/td>
&lt;td>✔️&lt;/td>
&lt;td>❌&lt;/td>
&lt;td>✔️&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Up-to-date base packages&lt;/td>
&lt;td>✔️&lt;/td>
&lt;td>❌&lt;/td>
&lt;td>❌&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Remote app installation&lt;/td>
&lt;td>✔️&lt;/td>
&lt;td>❌&lt;/td>
&lt;td>❌&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Built-in EGS &amp;amp; GOG support&lt;/td>
&lt;td>✔️&lt;/td>
&lt;td>❌&lt;/td>
&lt;td>❌&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Built-in emulation support&lt;/td>
&lt;td>✔️&lt;/td>
&lt;td>❌&lt;/td>
&lt;td>❌&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Additional game tweaks&lt;/td>
&lt;td>✔️&lt;/td>
&lt;td>❌&lt;/td>
&lt;td>❌&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Additional artwork&lt;/td>
&lt;td>✔️&lt;/td>
&lt;td>❌&lt;/td>
&lt;td>❌&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Built-in GE Proton&lt;/td>
&lt;td>✔️&lt;/td>
&lt;td>❌&lt;/td>
&lt;td>❌&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Full source publicly hosted&lt;/td>
&lt;td>✔️&lt;/td>
&lt;td>❌&lt;/td>
&lt;td>❌&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Forkable infrastructure&lt;/td>
&lt;td>✔️&lt;/td>
&lt;td>❌&lt;/td>
&lt;td>❌&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p class="text-center">
&lt;em>Table taken from the &lt;a href="https://github.com/ChimeraOS/chimeraos/wiki" target="_blank">ChimeraOS Wiki&lt;/a>&lt;/em>
&lt;/p>
&lt;h3 id="chimeraos-experience-">ChimeraOS Experience 🦁&lt;/h3>
&lt;p>I&amp;rsquo;ve been using ChimeraOS for nearly a year and I&amp;rsquo;m extremely happy with it. I installed ChimeraOS 33 when I built the Steam Box and it has updated itself, without issue, to ChimeraOS 41 (at the time of writing). New releases are made every 4 to 6 weeks. Some of the ChimeraOS features that I love are:&lt;/p>
&lt;ul>
&lt;li>A true Steam Deck-like experience but for a wide range of hardware
&lt;ul>
&lt;li>More so if you have Steam Controllers available, I&amp;rsquo;ve got three connected wirelessly&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Wake up from sleep via the push of a controller button&lt;/li>
&lt;li>Built-in support for Epic Game Store and GOG&lt;/li>
&lt;li>Built-in support for emulation
&lt;ul>
&lt;li>I enjoy playing retro arcade and console games, and ChimeraOS makes it easy to install and play them&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Built-in support for Xbox Wireless Controllers
&lt;ul>
&lt;li>&lt;a href="https://wimpysworld.com/posts/flash-stadia-controller-bluetooth-firmware-on-linux/">My Stadia Controllers with Bluetooth Firmware also work great with ChimeraOS&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Bundles current builds of Proton-GE&lt;/li>
&lt;li>Web-based UI for managing the system/games&lt;/li>
&lt;/ul>
&lt;p>Having a dedicated &amp;ldquo;games console&amp;rdquo; has resulted in me playing more games, but more importantly, playing more games with my family. The three of us sit together to play through games, often with my daughter on controls and my wife and I problem-solving and making suggestions. As a family, we&amp;rsquo;ve revisited &lt;a href="https://store.steampowered.com/app/996580/Spyro_Reignited_Trilogy/">Spyro™ Reignited Trilogy&lt;/a> something my wife and I played through together on the original PlayStation last-century! 😱 My daughter and I are most of the way through the &lt;a href="https://store.steampowered.com/bundle/6588/Monkey_Island_Collection/">Monkey Island Collection&lt;/a> and we&amp;rsquo;ve discovered we love co-op games like &lt;a href="https://store.steampowered.com/app/1225570/Unravel_Two/">Unravel Two&lt;/a> and &lt;a href="https://store.steampowered.com/app/1426210/It_Takes_Two/">It Takes Two&lt;/a>. We&amp;rsquo;ve also purchased some &amp;ldquo;mobile&amp;rdquo; games we play on tablets and NVIDIA SHIELD such as &lt;a href="https://store.steampowered.com/app/257790/Riptide_GP2/">Riptide GP2&lt;/a>, &lt;a href="https://store.steampowered.com/app/443860/Riptide_GP_Renegade/">Riptide GP Renegade&lt;/a> and &lt;a href="https://store.steampowered.com/app/389140/Horizon_Chase_Turbo/">Horizon Chase Turbo&lt;/a>. Yes, we like racing games 🏁&lt;/p>
&lt;p>My daughter has access to (mostly) the same games her friends play on Xbox and PlayStation. She doesn&amp;rsquo;t feel like our Steam Box is &amp;ldquo;different&amp;rdquo; from her friend&amp;rsquo;s consoles. When they visit each other they broadly play the same selection of titles, except for platform exclusives of course. When &lt;a href="https://store.steampowered.com/app/1332010/Stray/">Stray&lt;/a> and &lt;a href="https://store.steampowered.com/app/319510/Five_Nights_at_Freddys/">Five Nights at Freddys&lt;/a> became the games to play among her circle of friends, they were a click away and worked perfectly. Thanks to the Steam Deck, ChimeraOS is just a games console and not a &amp;ldquo;PC&amp;rdquo; to her. She doesn&amp;rsquo;t have to worry about updates, drivers, or anything else. She just turns it on and plays games.&lt;/p>
&lt;p class="text-center">
&lt;img src="./completed-steambox.jpg" class="img-fluid" alt="ChimeraOS powered Steam Box in action"/>
&lt;br />
&lt;em>ChimeraOS powered Steam Box in action - before I figured out how to enable ultra-wide resolution&lt;/em>
&lt;/p>
&lt;p>I&amp;rsquo;ve found ChimeraOS offers much better game compatibility than I&amp;rsquo;ve been able to achieve by simply installing Steam on Ubuntu. For example, &lt;a href="https://store.steampowered.com/app/1293830/Forza_Horizon_4/">Forza Horizon 4&lt;/a> and &lt;a href="https://store.steampowered.com/app/1551360/Forza_Horizon_5/">Forza Horizon 5&lt;/a> both run beautifully on the ChimeraOS powered Steam Box; something that eluded me on Ubuntu. The Steam Box is connected to a 3440x1440 ultra-wide monitor and configuring each game to use &amp;ldquo;Native&amp;rdquo; resolution via the game properties unlocks a gorgeous ultra-wide gaming experience. There is no going back from this once you&amp;rsquo;ve experienced it, especially for split screen local multiplayer games.&lt;/p>
&lt;h2 id="steam-deck-">Steam Deck 🎮&lt;/h2>
&lt;p>Several of my friends have Steam Decks and love them. They use them as both a handheld console and docked under the TV for family gaming. So, I could be using a Steam Deck to facilitate our family gaming requirements, but I don&amp;rsquo;t think I would have arrived at the idea of using a Steam Deck in this way without first experiencing the benefits of the Steam Box. I am considering getting a Steam Deck or similar handheld gaming-orientated PC and it would certainly be nice to use something more power efficient than the 270W total system power consumption the Steam Box requires. &lt;strong>You can hear more about how &lt;a href="https://linuxmatters.sh/1/">my friend Mark has switched to Steam Deck as his primary gaming device&lt;/a> in &lt;a href="https://linuxmatters.sh/1/">Linux Matters: Mastodon on My Résumé (Episode 1)&lt;/a>&lt;/strong>.&lt;/p>
&lt;h2 id="upgrades-">Upgrades 📈&lt;/h2>
&lt;p>Since I first built the Steam Box I&amp;rsquo;ve upgraded the GPU to a &lt;a href="https://www.powercolor.com/product?id=1612512944">Fighter AMD Radeon™ RX 6700 XT 12GB GDDR6&lt;/a>. At the time of writing, this is the most powerful Radeon GPU that comfortably fits in the Node 202 case and still leaves room for the additional case fans I installed. This GPU is a great match for the ultra-wide monitor and all the games I&amp;rsquo;ve tried can run at 3440x1440 with high presets (or better) at upwards of 60fps. When I first built the Steam Box, ChimeraOS worked best with Radeon GPUs, if you wanted to enable the Steam Deck UI (gamepadui). Support for Intel and NVIDIA GPUs is improving, but I&amp;rsquo;ve stayed with AMD Radeon because that&amp;rsquo;s been proven to be the most compatible option.&lt;/p>
&lt;p>I&amp;rsquo;ve also added a second SSD; the &lt;a href="https://uk.crucial.com/ssd/p3/ct4000p3ssd8">Crucial P3 4TB M.2 PCIe Gen3&lt;/a>. I used the ChimerOS web UI to prepare the drive and it now automatically shows up in the Steam UI as a Steam Library location.&lt;/p>
&lt;h2 id="whats-next-">What&amp;rsquo;s next? 🔮&lt;/h2>
&lt;p>The Steam Box has a permanent home in my office, but originally I&amp;rsquo;d planned to put it in the lounge under the TV. I have an original Steam Link, so now I&amp;rsquo;m thinking that I&amp;rsquo;ll put the Steam Link under the TV to replace the NVIDIA SHIELD. I have some older &lt;a href="https://gpd.hk/">GPD&lt;/a> devices that are designed for gaming, so I think I&amp;rsquo;ll put ChimeraOS on those to see how they perform as dedicated handheld game consoles. Could they be used as Steam Link clients too?&lt;/p>
&lt;p>ChimeraOS also supports installing software via &lt;a href="https://flathub.org/">Flathub&lt;/a>. I&amp;rsquo;d like to get a browser installed that can be used for streaming services like Netflix and Disney+ so we can use the Steam Box for watching TV too.&lt;/p>
&lt;p>I&amp;rsquo;ll report back on all of this in a future post. &lt;a href="https://wimpysworld.com/posts/rss.xml">Like 👍️ and Subscribe ❤️&lt;/a>&lt;/p>
&lt;h2 id="conclusion-">Conclusion 🏁&lt;/h2>
&lt;p>The tinkerer, maker and developer in me wants to try &lt;a href="https://github.com/Jovian-Experiments/Jovian-NixOS">NixOS as games console solution&lt;/a> but I&amp;rsquo;m starting to think that other than the learning opportunity there is no real value in doing so, considering what an excellent job ChimeraOS does.&lt;/p>
&lt;p>And here we are at the conclusion with barely a mention of Linux 🐧 ChimeraOS and the Steam Deck are excellent examples of Linux devices done right; all the Linux-y stuff is just implementation detail. &lt;em>Even I don&amp;rsquo;t think of our Steam Box as being a Linux-y thing&lt;/em>; I just pick up a controller, wake up the console and start playing contemporary games or my favourite retro classics 🕹️ without any fuss.&lt;/p></description><summary>I declined my Steam Deck pre-order and I&amp;rsquo;m now playing more games on Linux</summary></item><item><title>Flash Stadia Controller Bluetooth Firmware on Linux</title><link>https://wimpysworld.com/posts/flash-stadia-controller-bluetooth-firmware-on-linux/</link><pubDate>Fri, 28 Apr 2023 16:00:00 +0100</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/flash-stadia-controller-bluetooth-firmware-on-linux/</guid><description>&lt;p>I was a &lt;a href="https://stadia.google.com/gg/">Google Stadia&lt;/a> &amp;ldquo;founder&amp;rdquo; and when it was shut down on January 18, 2023 I was left with 3 perfectly usable Stadia Controllers; provided I could connect them using a USB-C cable. I quite like the Stadia Controller, the form factor is similar to the PlayStation DualShock but with an Xbox style button layout.&lt;/p>
&lt;p class="text-center">
&lt;img src="./stadia-controller.webp" class="img-fluid" alt="Stadia Controller"/>
&lt;br />
&lt;em>Stadia Controller&lt;/em>
&lt;/p>
&lt;p>While using it via USB-C is great for PC, wireless connectivity would provide more options. Thankfully &lt;a href="https://stadia.google.com/controller">Google released Bluetooth firmware for the Stadia Controller&lt;/a> which disables Stadia&amp;rsquo;s proprietary Wi-Fi connectivity and enables Bluetooth® Low Energy (BLE). You can then use it like a standard wireless Bluetooth controller with other hardware and also still plug your Stadia Controller into a device with a USB-C cable.&lt;/p>
&lt;h2 id="compatibility-">Compatibility 🧩&lt;/h2>
&lt;p>The &lt;a href="https://support.google.com/stadia?p=controllerconnect#devicelist">Stadia Controller Device Compatibility List&lt;/a> says&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Testing of Bluetooth mode was focused on the devices and systems listed below, but may not work with all hardware configurations.&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;ul>
&lt;li>Windows 10 and 11 + Steam&lt;/li>
&lt;li>MacOS® 13 + Steam&lt;/li>
&lt;li>ChromeOS&lt;/li>
&lt;li>Android&lt;/li>
&lt;/ul>
&lt;p>Most importantly, it says &lt;em>&lt;strong>&amp;ldquo;computers must have a Bluetooth Low Energy adapter in order to communicate with the Stadia Controller in Bluetooth mode and that hardware compatibility will vary.&amp;rdquo;&lt;/strong>&lt;/em>&lt;/p>
&lt;h2 id="flash-stadia-controller-bluetooth-firmware-using-ubuntu-2204-">Flash Stadia Controller Bluetooth Firmware using Ubuntu 22.04 🐧&lt;/h2>
&lt;p>Here&amp;rsquo;s how I flashed that firmware on all 3 of my controllers using Linux; well Ubuntu 22.04 to be precise. The system requirements for the Bluetooth Firmware tool is stated to be Chrome 108 or newer. No problem! But, I was unable to get the controllers to show up in Chrome until some &lt;code>udev&lt;/code> rules were added. Open a terminal and run the following command from any directory:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>{ cat &lt;span style="color:#87ceeb">&amp;lt;&amp;lt;EOF
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb"># SDP protocol
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">KERNEL==&amp;#34;hidraw*&amp;#34;, ATTRS{idVendor}==&amp;#34;1fc9&amp;#34;, MODE=&amp;#34;0666&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">ACTION==&amp;#34;add&amp;#34;, SUBSYSTEM==&amp;#34;usb&amp;#34;, ATTR{idVendor}==&amp;#34;1fc9&amp;#34;, MODE=&amp;#34;0666&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">ACTION==&amp;#34;add&amp;#34;, SUBSYSTEM==&amp;#34;usb&amp;#34;, ATTR{idVendor}==&amp;#34;0d28&amp;#34;, MODE=&amp;#34;0666&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb"># Flashloader
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">KERNEL==&amp;#34;hidraw*&amp;#34;, ATTRS{idVendor}==&amp;#34;15a2&amp;#34;, MODE=&amp;#34;0666&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb"># Controller
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">KERNEL==&amp;#34;hidraw*&amp;#34;, SUBSYSTEM==&amp;#34;hidraw&amp;#34;, ATTRS{idVendor}==&amp;#34;18d1&amp;#34;, MODE=&amp;#34;0666&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">SUBSYSTEMS==&amp;#34;usb&amp;#34;, ATTRS{idVendor}==&amp;#34;18d1&amp;#34;, ATTRS{idProduct}==&amp;#34;9400&amp;#34;, MODE=&amp;#34;0660&amp;#34;, TAG+=&amp;#34;uaccess&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">EOF&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>} | sudo tee /etc/udev/rules.d/70-stadiacontroller-flash.rules
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Now run the following to reload the &lt;code>udev&lt;/code> rules.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>sudo udevadm control --reload-rules
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo udevadm trigger
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>With that done, I restarted Google Chrome and followed the instructions on the &lt;a href="https://stadia.google.com/controller/index_en_GB.html">Stadia Controller Firmware Flashing Tool&lt;/a> page. I was able to flash the firmware on all 3 of my controllers. The process is pretty straightforward but I&amp;rsquo;ve included the instructions below for reference.&lt;/p>
&lt;h3 id="charge-your-controller">Charge your controller&lt;/h3>
&lt;p>Make sure that your controller has been charged for 30 minutes and that you&amp;rsquo;re using a USB data cable.&lt;/p>
&lt;p class="text-center">
&lt;img src="./Verify_Plug_in_controller.svg" class="img-fluid" alt="Charge your controller"/>
&lt;br>
&lt;b>Charge your controller&lt;/b>
&lt;/p>
&lt;h3 id="unplug-your-controller-to-power-it-off">Unplug your controller to power it off&lt;/h3>
&lt;p>If it turns on again, hold the Stadia button for 4 seconds to power it off&lt;/p>
&lt;p class="text-center">
&lt;img src="./Unlock_Unplug.svg" class="img-fluid" alt="Unplug your controller to power it off"/>
&lt;br>
&lt;b>Unplug your controller to power it off&lt;/b>
&lt;/p>
&lt;h3 id="hold-the-option-button-three-dots-while-plugging-in-your-controller">Hold the option button (three dots) while plugging in your controller&lt;/h3>
&lt;p>The status light should remain off. If it turns on, unplug the controller and try again&lt;/p>
&lt;p class="text-center">
&lt;img src="./Unlock_Option_Plug.svg" class="img-fluid" alt="Hold the option button (three dots) while plugging in your controller"/>
&lt;br>
&lt;b>Hold the option button (three dots) while plugging in your controller&lt;/b>
&lt;/p>
&lt;h3 id="press-the-option-assistant-a-and-y-buttons-at-the-same-time">Press the Option, Assistant, A, and Y buttons at the same time&lt;/h3>
&lt;p>There won&amp;rsquo;t be any controller feedback, proceed to the next step to confirm the controller is unlocked&lt;/p>
&lt;p class="text-center">
&lt;img src="./Unlock_Four_buttons.svg" class="img-fluid" alt="Press the Option, Assistant, A, and Y buttons at the same time"/>
&lt;br>
&lt;b>Press the Option, Assistant, A, and Y buttons at the same time&lt;/b>
&lt;/p>
&lt;h3 id="select-your-controller-in-the-chrome-device-list-and-click-connect">Select your controller in the Chrome device list and click &amp;ldquo;Connect&amp;rdquo;.&lt;/h3>
&lt;p>The text in the flashing utility says the Stadia Controller should be named &lt;strong>&amp;ldquo;SP Blank RT Family&amp;rdquo;&lt;/strong> or &amp;ldquo;Stadia Controller&amp;rdquo; or &amp;ldquo;USB COMPOSITE DEVICE&amp;rdquo;.&lt;/p>
&lt;p class="text-center">
&lt;img src="./Chrome_dialog_Download_en-GB.svg" class="img-fluid" alt="Select your controller in the Chrome device list again and click Connect"/>
&lt;br>
&lt;b>Select your controller in the Chrome device list again and click "Connect".&lt;/b>
&lt;/p>
&lt;h3 id="download-complete">Download complete&lt;/h3>
&lt;p>You&amp;rsquo;ve almost finished. Go to the final step to install the latest version of Bluetooth mode on your controller.&lt;/p>
&lt;p class="text-center">
&lt;img src="./Download_Download_complete.svg" class="img-fluid" alt="Download complete"/>
&lt;br>
&lt;b>Download complete&lt;/b>
&lt;/p>
&lt;h3 id="install-bluetooth-mode">Install Bluetooth mode&lt;/h3>
&lt;p>One more time - select your controller in the Chrome device list, then click &amp;ldquo;Connect&amp;rdquo;. Installation will start automatically and should only take a minute.&lt;/p>
&lt;p>The text in the flashing utility says the Stadia Controller should be named &lt;strong>&amp;ldquo;USB COMPOSITE DEVICE&amp;rdquo;&lt;/strong> or &amp;ldquo;Stadia Controller&amp;rdquo; or &amp;ldquo;SP Blank RT Family&amp;rdquo;.&lt;/p>
&lt;p class="text-center">
&lt;img src="./Chrome_dialog_Install_en-GB.svg" class="img-fluid" alt="Install Bluetooth mode"/>
&lt;br>
&lt;b>Install Bluetooth mode&lt;/b>
&lt;/p>
&lt;h3 id="installation-complete">Installation complete&lt;/h3>
&lt;p>Wait a minute or so for the firmware installation to complete.&lt;/p>
&lt;p class="text-center">
&lt;img src="./Finish_Bluetooth_enabled.svg" class="img-fluid" alt="Installation complete"/>
&lt;br>
&lt;b>Installation complete&lt;/b>
&lt;/p>
&lt;h2 id="pairing-stadia-controller-with-bluetooth">Pairing Stadia Controller with Bluetooth&lt;/h2>
&lt;p>Hold the Y and Stadia buttons for 2 seconds until the status light flashes orange. It is now in pairing mode and visible to other devices.&lt;/p>
&lt;p class="text-center">
&lt;img src="./Pairing_mode.svg" class="img-fluid" alt="Pairing Stadia Controller with Bluetooth"/>
&lt;br>
&lt;b>Pairing Stadia Controller with Bluetooth&lt;/b>
&lt;/p>
&lt;h2 id="hurray-up-">Hurray up! ⏳️&lt;/h2>
&lt;p>&lt;strong>After the shutdown in January 2023, you have until December 31, 2023, to update the controller so it can use Bluetooth mode.&lt;/strong>&lt;/p>
&lt;p>Fortunately, the &lt;a href="https://github.com/Scyne/stadiaRawBtFw">Stadia Controller firmware has been archived&lt;/a> and an &lt;a href="https://luigimannoni.github.io/stadia-controller-flasher/">Unofficial Stadia Controller Flashing utility&lt;/a> created which might prove useful after December 31, 2023.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://luigimannoni.github.io/stadia-controller-flasher/">&lt;strong>Unofficial Stadia Controller Flashing utility&lt;/strong>&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Your mileage may vary using the re-implementation of the &lt;a href="https://github.com/luigimannoni/stadia-controller-flasher">Utility for flashing Stadia Controllers&lt;/a>, so if you&amp;rsquo;re doing this before December 31, 2023, use the &lt;a href="https://stadia.google.com/controller/">official tool&lt;/a>.&lt;/p>
&lt;h2 id="conclusion">Conclusion&lt;/h2>
&lt;p>After updating my Stadia Controllers with Bluetooth firmware, I&amp;rsquo;ve successfully paired them with my Android tablet, iPhone 13 and &lt;a href="https://chimeraos.org/">ChimeraOS&lt;/a>; an operating system that provides an out-of-the-box couch gaming experience 🎮️ While Stadia might be dead and gone, I&amp;rsquo;m very happy to continue to get utility out of the controllers; which turned out to be free after the reimbursement Google offered when Stadia was shut down.&lt;/p></description><summary>How to flash Stadia Controller Bluetooth mode on Linux</summary></item><item><title>Why I chose the ThinkPad Z13 Gen1 as my Linux laptop</title><link>https://wimpysworld.com/posts/why-i-chose-the-thinkpad-z13-as-my-linux-laptop/</link><pubDate>Tue, 18 Apr 2023 14:30:26 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/why-i-chose-the-thinkpad-z13-as-my-linux-laptop/</guid><description>&lt;p>During the second half of 2022, I dusted off my laptop and travelled to three events for the first time in over two years. During these trips, it became apparent that my laptop is not the right tool for the job.&lt;/p>
&lt;p>At &lt;a href="https://events.linuxfoundation.org/archive/2022/kubecon-cloudnativecon-europe/">KubeCon EU 2022&lt;/a> my colleague Lindsay brought her &lt;a href="https://www.apple.com/uk/macbook-pro-13/">Apple Macbook Pro M1&lt;/a>. It was lightweight, compact, looked fabulous and had epic battery life. Meanwhile, my ThinkPad P1 Gen 1 looked fabulous but it is a bit of a chonker and a massive power pig 🔌🐖 Battery anxiety was constant that week and also on my subsequent trips to &lt;a href="https://www.sreday.com/">SREday 2022&lt;/a> and the &lt;a href="https://events.canonical.com/event/2/">Ubuntu Summit 2022&lt;/a>. Sensing that 2022 wasn&amp;rsquo;t an outlier and more travel would be on the cards in 2023 I decided that I wanted some of that thin and light laptop action. In early December 2022, I went hunting for a Linux laptop and this is my journey.&lt;/p>
&lt;h2 id="as-featured-on-linux-matters-">As featured on Linux Matters! 🎙️&lt;/h2>
&lt;p>I recently discussed my hunt for a new Linux Loving Laptop on the &lt;a href="https://linuxmatters.sh/">Linux Matters&lt;/a> podcast. &lt;strong>You can hear that discussion with my friends Alan and Mark in &lt;a href="https://linuxmatters.sh/1/">Linux Matters: Mastodon on My Résumé (Episode 1)&lt;/a>&lt;/strong>.&lt;/p>
&lt;p class="text-center">
&lt;a href="https://linuxmatters.sh" target="_blank">&lt;img src="https://linuxmatters.sh/img/episode/linuxmatters-banner-3000x750.webp" class="img-fluid" alt="Linux Matters Podcast"/>&lt;/a>
&lt;br />
&lt;em>Linux Matters Podcast&lt;/em>
&lt;/p>
&lt;h2 id="past-laptop-purchasing-mistakes-">Past laptop purchasing mistakes 😱&lt;/h2>
&lt;blockquote>
&lt;p>&amp;ldquo;Those that fail to learn from history are doomed to repeat it&amp;rdquo; - Winston Churchill.&lt;/p>
&lt;/blockquote>
&lt;p>The requirements for my last two laptop purchases were very different from what I need today; a &lt;a href="https://www.dell.com/en-uk/shop/laptop-computers-2-in-1-pcs/precision-5550-mobile-workstation/spd/precision-15-5550-laptop">Dell XPS 15 5550&lt;/a> and &lt;a href="https://www.lenovo.com/gb/en/p/laptops/thinkpad/thinkpadp/thinkpad-p1/22ws2wpp101">ThinkPad P1 Gen1&lt;/a> Both have significant power requirements with 15.6&amp;quot; UHD displays and discrete NVIDIA GPUs. The ThinkPad P1 Gen also sports a Xeon CPU ⚡️ These made sense when I bought them, I was travelling one week every month and regularly compiling large applications, building container images, VMs and operating system images. These days I have a &lt;a href="https://www.amd.com/en/products/cpu/amd-ryzen-threadripper-3970x">Threadripper 3970X&lt;/a> workstation at home that I can connect to via &lt;a href="https://tailscale.com/">Tailscale&lt;/a> to run compute-intensive tasks. I simply don&amp;rsquo;t need a workhorse 🐴 laptop anymore.&lt;/p>
&lt;h3 id="laptop-criteria-">Laptop criteria 📑&lt;/h3>
&lt;p>I&amp;rsquo;m deeply impressed with the outstanding work the &lt;a href="https://asahilinux.org/">Asahi Linux&lt;/a> team are doing to enable Linux on Apple Silicon Macs, but running Linux on an M1 Mac isn&amp;rsquo;t viable for me as some hardware support (HDMI for example) is still a work in progress at the time of writing. Not ideal when you&amp;rsquo;re a conference speaker and running booth demos.&lt;/p>
&lt;p>These are my criteria for the new laptop. Some must-haves, some nice-to-haves and some hard exclusions.&lt;/p>
&lt;ul>
&lt;li>Fully Linux compatible.
&lt;ul>
&lt;li>Linux pre-installed to demonstrate Linux is fully supported&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Full working day battery life; ~8 hours in my opinion.&lt;/li>
&lt;li>Low-power CPU, 35W or under
&lt;ul>
&lt;li>Ideally AMD 6000 series but a 12th Gen Intel as a compromise&lt;/li>
&lt;li>No 11th Gen Intel or AMD 5000 series CPUs will be considered&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>64GB RAM, will compromise on 32GB RAM&lt;/li>
&lt;li>13&amp;quot; or 14&amp;quot; 1920x1200 matte display
&lt;ul>
&lt;li>No UHD resolutions display will be considered (for power-saving reasons)&lt;/li>
&lt;li>Touch support is a nice-to-have, but not essential&lt;/li>
&lt;li>1920x1080 as a compromise, but nothing lower&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>No discrete GPU. Again for power-saving reasons.&lt;/li>
&lt;li>USB-C charging&lt;/li>
&lt;li>Dual NVME SSD, or at least a single 2TB (or more) SSD&lt;/li>
&lt;li>Decent keyboard and touchpad&lt;/li>
&lt;li>The Laptop should weigh close to 1kg&lt;/li>
&lt;li>Premium build quality and design (somewhat subjective I know)&lt;/li>
&lt;/ul>
&lt;p>With this list of requirements established, I &lt;a href="https://docs.google.com/spreadsheets/d/1kaB1pxbbYa1ebxeDRTguQ9EZol1EhM-0FE45Da8AOn8/edit#gid=0">started collating Linux laptop comparison notes in this somewhat idiosyncratic spreadsheet&lt;/a>&lt;/p>
&lt;p class="text-center">
&lt;a href="https://docs.google.com/spreadsheets/d/1kaB1pxbbYa1ebxeDRTguQ9EZol1EhM-0FE45Da8AOn8/edit#gid=0" target="_blank">&lt;img src="./spreadsheet.webp" class="img-fluid" alt="Linux Laptop Comparison Spreadsheet"/>&lt;/a>
&lt;br />
&lt;em>A spreadsheet that probably only makes sense to me&lt;/em>
&lt;/p>
&lt;p>Looking at the list of laptops in the sheet above, you might be wondering why I didn&amp;rsquo;t consider any laptops from the established dedicated Linux laptop vendors such as &lt;a href="https://www.entroware.com/store/">Entroware&lt;/a>, &lt;a href="https://slimbook.es/">Slimbook&lt;/a> and &lt;a href="https://starlabs.systems/">StarLabs&lt;/a>. Well, I did look at everything they offered at the time and none of them had a model available that met the requirements I&amp;rsquo;ve outlined above or the estimated dispatch time was nearly half a year.&lt;/p>
&lt;p>I&amp;rsquo;m not going to elaborate on the rationale behind ruling certain laptop models in or out, but I will say this; I was very impressed to see &lt;a href="http://lenovo.com/linux">&lt;strong>every laptop in the Lenovo ThinkPad lineup had a Linux pre-install option&lt;/strong>&lt;/a> of either &lt;a href="https://ubuntu.com">Ubuntu&lt;/a> or &lt;a href="https://getfedora.org/">Fedora&lt;/a> in &amp;ldquo;Build YourPC&amp;rdquo; system configurator. While comparing the power requirements of Intel&amp;rsquo;s i7-12xx series and AMD&amp;rsquo;s 68x0 series CPU at the time, I was sold on the impressive battery endurance of AMD&amp;rsquo;s offerings and the superior integrated graphics, so I excluded any laptop with Intel CPUs quite early on.&lt;/p>
&lt;h2 id="lenovo-thinkpad-z13-gen-1-with-ubuntu-pre-installed">Lenovo ThinkPad Z13 Gen 1 with Ubuntu pre-installed&lt;/h2>
&lt;p>I went with the &lt;a href="https://www.lenovo.com/gb/en/p/laptops/thinkpad/thinkpadz/thinkpad-z13-(13-inch-amd)/21d2cto1wwgb1">ThinkPad Z13 Gen 1&lt;/a> with Ubuntu pre-installed, and the &lt;a href="https://www.lenovo.com/gb/en/p/laptops/thinkpad/thinkpadt/thinkpad-t14s-gen-3-(14-inch-amd)/len101t0015">ThinkPad T14s Gen 3&lt;/a> was runner-up in my selection process.&lt;/p>
&lt;h3 id="specifications-">Specifications 📝&lt;/h3>
&lt;p>The key specifications for the laptop I ordered are AMD Ryzen 7 PRO 6850U CPU, 32 GB LPDDR5-6400MHz (Soldered), 1 TB SSD M.2 2242 PCIe Gen4, 13.3&amp;quot; WUXGA (1920 x 1200), IPS, Anti-Glare, Non-Touch display weighing in at 1.19kg. I think this configuration hits the sweet spot for battery endurance, more on that later.&lt;/p>
&lt;p>I&amp;rsquo;m not a fan of the increasing trend of soldering RAM on motherboards, but that was common across all the models of laptops I was considering. If &lt;a href="https://frame.work/gb/en">Framework&lt;/a> had offered an AMD 6000 series CPU option at the time, I would&amp;rsquo;ve had a Framework laptop on my short list as the modular design of the Framework laptops is very appealing.&lt;/p>
&lt;p>And yes, I did make a compromise with the laptop specifications; that 1TB M.2 SSD is below my minimum requirement of 2TB. I did do my homework though and will present my creative upgrade solution in a future blog post. &lt;a href="https://wimpysworld.com/posts/rss.xml">Like and Subscribe&lt;/a> 😉&lt;/p>
&lt;h3 id="build-quality--design-">Build Quality &amp;amp; Design 💻️&lt;/h3>
&lt;p>Without a doubt, the ThinkPad Z13 Gen 1 is a gorgeous laptop. I do not have enough superlatives to express just how much I love it. It is, in my option, an almost flawless design. Exactly the compact form factor laptop I was seeking; it&amp;rsquo;s beautiful to look at from any angle and a delight to use. Here are some highlights.&lt;/p>
&lt;p class="text-center">
&lt;img src="./ThinkPad_Z13_Gen_1_CT1_02.webp" class="img-fluid" alt="ThinkPad Z13 Gen 1"/>
&lt;br />
&lt;em>ThinkPad Z13 Gen 1&lt;/em>
&lt;/p>
&lt;p>The laptop is engineered from 75% recycled aluminium and 95% recycled plastics, then boxed in 100% renewable, compostable packaging. The touchpad is sublime and amazingly 120mm wide on the compact laptop. The haptic touch is simply excellent. The touchpad is the most Macbook-like touchpad I&amp;rsquo;ve used on any PC and it is so good it has caused me to change what desktop environment I now use. More on this in a future blog post. However, there is currently no Linux software to &lt;a href="https://psref.lenovo.com/syspool/Sys/PDF/datasheet/ThinkPad_Z_Series_Haptic_TouchPad_Settings.pdf">configure the haptic touchpad settings&lt;/a> such as click force and touchpad feedback intensity but I&amp;rsquo;ve been perfectly happy with the defaults. If you do dual boot Windows the haptic settings configured via Windows are stored on the device and carry over to Linux.&lt;/p>
&lt;p>The Keyboard is an excellent low-profile design, each key has ~1.2mm of travel which is the same as the actuation point on my Razer Huntsman V2 TKL keyboards with opto-mechanical switches. Most importantly the Fn&lt;/kbd> key is in the correct place on the Z13 and not where ThinkPads have been incorrectly plonking it for years. Fight me! 🥊 If you are a long-time ThinkPad owner, it is likely you&amp;rsquo;ll hate the idea of the keyboard and touchpad on the Z13 since it is quite a departure from the traditional design. But I went into this with my eyes 👀 open and have watched and read many reviews.&lt;/p>
&lt;p class="text-center">
&lt;img src="./ThinkPad_Z13_Gen_1_CT4_01.webp" class="img-fluid" alt="Correct Fn key placement on ThinkPad Z13 Gen 1"/>
&lt;br />
&lt;em>"This is the way"&lt;/em>
&lt;/p>
&lt;p>The Display is bright (400nits), anti-reflective and anti-smudge, covers 100% of the sRGB colour gamut and the laptop is perfectly balanced so it can be opened one-handed. I&amp;rsquo;m embracing the compact, thin and light lifestyle; so the two USB-C ports are fine with me as I&amp;rsquo;ve chosen a laptop configuration with excellent battery endurance (more on that in a bit) and plan to use it completely untethered most of the time with cables and adapters only plugged in for very specific tasks and overnight recharging.&lt;/p>
&lt;p>I do have one niggle though; there is an unusable 2242 M.2 slot on the motherboard. It is only intended for use with select models of WWAN cards, none of which are a configuration option for the UK models of the Z13. It doesn&amp;rsquo;t look like the antenna is wired in either, so even if you do get a supported WWAN card aftermarket it is unlikely to work well; if at all. I can share my iPhone&amp;rsquo;s mobile service via Wifi, so not a deal breaker in that regard but it is rather annoying to have an M.2 slot on the motherboard and nothing I can do with it.&lt;/p>
&lt;h3 id="ubuntu-pre-install-experience-">Ubuntu pre-install experience 👌&lt;/h3>
&lt;p>It is worth noting that at the time of purchase, selecting Ubuntu or Fedora in the system configuration on the Lenovo website applied a £155 discount! 🤑 Choosing Ubuntu or Fedora across the ThinkPad line applies a discount, although the amount varies based on the model.&lt;/p>
&lt;p>All OEMs that partner with Ubuntu get an OEM designation for each device officially endorsed and supported by Canonical. The ThinkPad Z13 Gen 1 is known as &lt;em>Sutton Newell Abe&lt;/em> and the &lt;code>oem-sutton.newell-abe-meta&lt;/code> package (along with the associated OEM PPA) provides the device-specific hardware enablement and power management tuning.&lt;/p>
&lt;p class="text-center">
&lt;img src="./oem-name.webp" class="img-fluid" alt="ThinkPad Z13 Gen 1 (Sutton Newell Abe)"/>
&lt;br />
&lt;em>ThinkPad Z13 Gen 1 is known as Sutton Newell Abe for OEM enablement&lt;/em>
&lt;/p>
&lt;p>The OEM image of Ubuntu differs from the standard Ubuntu image in a few ways. The most obvious is that OEM image comes with recovery media creation pre-installed. This is a great feature and I highly recommend you use it to create a recovery USB stick, either during the initial setup or post-setup. The OEM image also comes with Chromium and Firefox installed, as opposed to just Firefox in the downloadable release of Ubuntu. IIRC, this is because Chromium has traditionally worked better with touchscreen laptops. The fingerprint reader works. I was able to enrol fingerprints quickly and authenticate GDM logins. But the biometric support does not extend throughout the system; Ubuntu Software doesn&amp;rsquo;t integrate with the fingerprint reader, nor does &lt;code>snapd&lt;/code> or any other privilege escalation.&lt;/p>
&lt;p>I also experienced the touchpad becoming unresponsive, requiring a click to &amp;ldquo;unfreeze&amp;rdquo; it. This happens quite frequently and detracts from what is otherwise an excellent, class-leading, touchpad. I suspect it is overly aggressive power management settings in the OEM image, but I didn&amp;rsquo;t investigate beyond that hunch. Both these issues with the fingerprint reader and touchpad are Ubuntu-specific and nothing related to the actual hardware. Both issues are absent when running NixOS.&lt;/p>
&lt;p>Having a tier-1 vendor such as Lenovo ship a laptop with Ubuntu pre-installed has the benefit of great firmware support. I&amp;rsquo;ve received several firmware updates since I got the laptop, and they have all applied without issue.&lt;/p>
&lt;p class="text-center">
&lt;img src="./firmware-update.webp" class="img-fluid" alt="ThinkPad Z13 Gen 1 firmware updates on Ubuntu"/>
&lt;br />
&lt;em>Firmware updates for the ThinkPad Z13 Gen 1 on Ubuntu 20.04&lt;/em>
&lt;/p>
&lt;h4 id="why-not-ubuntu-2204-">Why not Ubuntu 22.04? 🤔&lt;/h4>
&lt;p>My Z13 was shipped with Ubuntu 20.04.4 with OEM optimised Linux kernel 5.14.0-1054-oem. Some might be perplexed (or annoyed) that it didn&amp;rsquo;t come with Ubuntu 22.04, given it was ordered in late 2022. I used to work for Canonical, and during that time worked with Lenovo to enable Ubuntu on ~60 of their laptops and workstations between 2019 and 2021, so I do have some insight into how this process works. It simply boils down to how the factory image certification process works, and once an image is qualified that is what ships on the device for the duration of its availability. Re-certification adds cost and takes time, so it&amp;rsquo;s extremely rare for a device to have a revised factory image qualified once it has gone on sale.&lt;/p>
&lt;p>Upgrading to Ubuntu 22.04 LTS worked flawlessly, full audio support was restored and no other hardware supported regressed. Brilliant.&lt;/p>
&lt;h4 id="linux-kernel-61-">Linux Kernel 6.1 🌰&lt;/h4>
&lt;p>The pre-installed Ubuntu and Fedora images for the Z13 come with kernels that have backported patches applied to fully support the device. If you buy a ThinkPad Z13 and plan to run another Linux distro on it, make sure you can install Linux kernel version 6.1 or newer. This is to ensure the Qualcomm Wi-Fi 6E NFA725A 2x2 AX chipset is fully supported and that the required patches to properly suspend and resume are available.&lt;/p>
&lt;h3 id="battery-endurance-">Battery endurance 🔋&lt;/h3>
&lt;p>This is, after all, my most important selection criteria. The conclusion here is simple: &lt;strong>11 hours&lt;/strong> ⏱️&lt;/p>
&lt;p>This is 11 hours of mixed-use. Coding in Visual Studio Code. Chatting in Slack and Discord. Video calls in Google Meet and Zoom. Compiling software. Some screen capture with OBS Studio and basic video editing with &lt;a href="https://shotcut.org/">Shotcut&lt;/a>. Closing the lid of the laptop and leaving it suspended for 24 hours depletes the battery by ~4% which is about 2 Wh. Very respectable. I haven&amp;rsquo;t felt the need to profile power consumption or tweak anything as I&amp;rsquo;m get plenty of untethered compute time. I&amp;rsquo;m very happy with the battery life, typically charging the laptop overnight while I sleep and running it all day battery only.&lt;/p>
&lt;h2 id="whats-next-">What&amp;rsquo;s next? 🔮&lt;/h2>
&lt;p>As noted, I did compromise on the 1TB M.2 SSD. I&amp;rsquo;ve come up with an aftermarket solution to upgrade to 2TB which I will post about soon. I chose a laptop pre-installed with Linux for two reasons:&lt;/p>
&lt;ul>
&lt;li>Support companies shipping a Linux operating system pre-installed on their laptops and workstations&lt;/li>
&lt;li>Hard proof Linux works on their hardware&lt;/li>
&lt;/ul>
&lt;p>After using Ubuntu for a few weeks I switched to NixOS. I will be posting about my experience with NixOS on the Z13 in a future blog post and &lt;a href="https://twitch.tv/WimpysWorld">will likely livestream about it on Twitch&lt;/a> as well. TL;DR NixOS 22.11 has fewer issues than Ubuntu 22.04 on the ThinkPad Z13 Gen 1.&lt;/p>
&lt;p>The ThinkPad Z13 Gen 1 is an excellent laptop for my requirements, and I have no regrets. If I were to buy I laptop pre-installed with a Linux distro in the future, I might go for Fedora, just so I can see what the OEM experience is like with Fedora.&lt;/p>
&lt;p>Since I purchased the Z13, &lt;a href="https://frame.work/gb/en/blog/framework-laptop-13-with-13th-gen-intel-core-and-amd-ryzen-7040-series">Framework has announced AMD 7040-series powered laptops&lt;/a> are coming later in 2023; and I&amp;rsquo;m not sure I can resist&amp;hellip;&lt;/p></description><summary>Picking a thin and light Linux laptop with plenty of battery endurance</summary></item><item><title>Linux Matters</title><link>https://wimpysworld.com/projects/linux-matters/</link><pubDate>Tue, 18 Apr 2023 00:00:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/projects/linux-matters/</guid><description>&lt;p>Join 3 experienced Open Source professionals (&lt;em>&lt;a href="https://linuxmatters.sh/host/apope">Alan Pope&lt;/a>, &lt;a href="https://linuxmatters.sh/host/mjohnson">Mark Johnson&lt;/a>, &lt;a href="https://linuxmatters.sh/host/mwimpress">Martin Wimpress&lt;/a>&lt;/em>) as they discuss the impact Linux has in their daily lives. Upbeat family-friendly banter, conversation and discussion for Linux enthusiasts and casual observers of all ages. A new episode every two weeks covering terminal productivity, desktop experience, development, gaming, hosting, hardware, community, cloud-native and all the Linux Matters that matter.&lt;/p>
&lt;ul>
&lt;li>Organisation: &lt;a href="https://linuxmatters.sh">Linux Matters&lt;/a>&lt;/li>
&lt;li>Date: April 2023 - date&lt;/li>
&lt;li>Role: Writer &amp;amp; Presenter&lt;/li>
&lt;/ul></description><summary>Three experienced Open Source professionals discuss the impact Linux has in their daily lives</summary></item><item><title>machinespawn</title><link>https://wimpysworld.com/projects/machinespawn/</link><pubDate>Wed, 19 Oct 2022 00:00:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/projects/machinespawn/</guid><description>&lt;p>&lt;a href="https://github.com/wimpysworld/machinespawn">machinespawn&lt;/a> is a wrapper for
&lt;code>machinectl&lt;/code> and &lt;code>systemd-nspawn&lt;/code> to creating and managing containers; primarily
focused at local development environment and CI/CD with a heavy emphasis on
caching.&lt;/p>
&lt;ul>
&lt;li>Organisation: &lt;a href="https://github.com/wimpysworld/machinespawn">machinespawn&lt;/a>&lt;/li>
&lt;li>Date: October 2022 - date&lt;/li>
&lt;li>Role: Project Lead&lt;/li>
&lt;/ul></description><summary>Quickly stand up systemd-nspawn containers for development or CI/CD</summary></item><item><title>Linux Downtime</title><link>https://wimpysworld.com/projects/linux-downtime/</link><pubDate>Sun, 24 Apr 2022 00:00:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/projects/linux-downtime/</guid><description>&lt;p>Open source professionals &lt;a href="https://wimpress.com">Martin Wimpress&lt;/a>,
&lt;a href="https://linktr.ee/haydenbarnes">Hayden Barnes&lt;/a>, &lt;a href="https://reaperworld.com/">Gary Kramlich&lt;/a>,
and &lt;a href="https://popey.com/">Alan Pope&lt;/a> join &lt;a href="https://joeress.com/">Joe Ressington&lt;/a>
for relaxed discussions in their downtime. From working in the industry and
progressing your career, to managing a project&amp;rsquo;s community, and beyond.&lt;/p>
&lt;ul>
&lt;li>Organisation: &lt;a href="https://linuxdowntime.com">Linux Downtime&lt;/a>&lt;/li>
&lt;li>Date: April 2022 - April 2023&lt;/li>
&lt;li>Role: Co-presenter &amp;amp; Producer&lt;/li>
&lt;/ul></description><summary>Open source professionals having relaxed discussions in their downtime</summary></item><item><title>deb-get</title><link>https://wimpysworld.com/projects/deb-get/</link><pubDate>Mon, 18 Apr 2022 00:00:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/projects/deb-get/</guid><description>&lt;p>&lt;a href="https://github.com/wimpysworld/deb-get">deb-get&lt;/a> makes it easy to install and
update .debs published in 3rd party apt repositories or made available via
direct download on websites or GitHub release pages.&lt;/p>
&lt;ul>
&lt;li>Organisation: &lt;a href="https://github.com/wimpysworld/deb-get">deb-get&lt;/a>&lt;/li>
&lt;li>Date: April 2022 - date&lt;/li>
&lt;li>Role: Project Lead&lt;/li>
&lt;/ul></description><summary>apt-get functionality for .debs published in GitHub release or 3rd party repositories</summary></item><item><title>Creating Production-Ready Containers - Advanced Techniques</title><link>https://wimpysworld.com/posts/creating-production-ready-containers-advanced-techniques/</link><pubDate>Fri, 18 Jun 2021 12:18:15 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/creating-production-ready-containers-advanced-techniques/</guid><description>&lt;p>Creating production-ready containers for use in commercial-grade apps can be a far cry from the &amp;ldquo;get started with Node.js and Docker&amp;rdquo;-type of tutorials that are common around the Internet. Those guides are great for introducing all the advantages of Docker containers in modern cloud-native development, but creating a container that passes muster in a large-scale application in production is a different story.&lt;/p>
&lt;p>For production-ready containers, there are three key things you want to optimise for when creating a container:&lt;/p>
&lt;ol>
&lt;li>Image Size 📦&lt;/li>
&lt;li>Build Speed 🐢&lt;/li>
&lt;li>Security 🔐&lt;/li>
&lt;/ol>
&lt;p>Image size and build speed ensure that your containers can move through CI/CD and test pipelines easily and efficiently. Security is critical in today&amp;rsquo;s software supply chain, and containers have their own set of security issues. Thankfully, reducing container image size actually can alleviate some security issues in containers.&lt;/p>
&lt;p>&lt;a href="https://wimpysworld.com/posts/creating-production-ready-containers-the-basics">In my Basics article&lt;/a>, I showed you some easy techniques to improve your &lt;code>Dockerfile&lt;/code> using a sample &amp;ldquo;Hello World&amp;rdquo; Node.js application.&lt;/p>
&lt;p>These basics address all three optimisations, though they only scratch the surface.&lt;/p>
&lt;p>Let&amp;rsquo;s look at some more advanced techniques for Container Optimisation.&lt;/p>
&lt;h2 id="alpine-images">Alpine Images&lt;/h2>
&lt;p>The very first thing you&amp;rsquo;ll encounter when looking for techniques to create smaller containers is &lt;a href="https://alpinelinux.org/">Alpine Linux&lt;/a>. Alpine Linux is an open-source project whose goal is to create a bare-bones 🦴 version of Linux that lets developers &amp;ldquo;build from the ground up.&amp;rdquo;&lt;/p>
&lt;h3 id="pros-transitioning-to-alpine-can-be-an-easy-way-to-get-a-smaller-container">Pros: Transitioning to Alpine can be an easy way to get a smaller container&lt;/h3>
&lt;p>Reducing image size with Alpine can be incredibly simple - under the right circumstances. For some apps, it&amp;rsquo;s as easy as changing the base image in your &lt;code>Dockerfile&lt;/code>:&lt;/p>
&lt;h4 id="from">FROM&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-dockerfile" data-lang="dockerfile">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">FROM&lt;/span>&lt;span style="color:#87ceeb"> node:16.2.0&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="to">TO&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-dockerfile" data-lang="dockerfile">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">FROM&lt;/span>&lt;span style="color:#87ceeb"> node:16.2.0-alpine&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>When we build the new image, we see that the old image was 856MB and the new one is 114MB 🎉&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>REPOSITORY TAG IMAGE ID CREATED SIZE
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cotw-node-alpine latest 2cc7b4a7b09c 2 minutes ago 114MB
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cotw-node latest 873fb9fca53a 3 days ago 856MB
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Easy, right? Not so fast.&lt;/p>
&lt;h3 id="cons-using-alpine-images-can-lead-to-build-problems-now-and-in-the-future">Cons: Using Alpine images can lead to build problems, now and in the future&lt;/h3>
&lt;p>There are some not-so-obvious gotchas with using Alpine images that don&amp;rsquo;t crop up in our super simple example application, such as:&lt;/p>
&lt;h4 id="you-have-to-install-everything">You have to install everything&lt;/h4>
&lt;p>Those tiny base images have to sacrifice something, right? Alpine users will be installing everything they need, right down to time-zone data or development tools. You won&amp;rsquo;t need your development tools for your production image, most likely, but for most developers, the thought of a server without &lt;code>curl&lt;/code> or &lt;code>vim&lt;/code> is a bridge too far.&lt;/p>
&lt;h4 id="different-compilers-and-package-managers">Different compilers and package managers&lt;/h4>
&lt;p>You&amp;rsquo;ll also be installing any dependencies with the Alpine Package Keeper tool (&lt;code>apk&lt;/code>) instead of the more familiar &lt;code>apt&lt;/code> or &lt;code>rpm&lt;/code>. The differences are small but can trip up unsuspecting developers.&lt;/p>
&lt;h4 id="fewer-examples-less-documentation">Fewer examples; less documentation&lt;/h4>
&lt;p>Finally, while Alpine has been around for nine-plus years, it is and likely always will be a smaller and more specialised user base than established Linux distributions such as Ubuntu and Debian. To wit, at the time of this writing the &lt;code>alpine&lt;/code> tag on StackOverflow has just &lt;a href="https://stackoverflow.com/questions/tagged/alpine">1,280 questions&lt;/a>, compared with &lt;a href="https://stackoverflow.com/questions/tagged/ubuntu">over 54,000 for Ubuntu&lt;/a>.&lt;/p>
&lt;h2 id="multi-stage-builds">Multi-stage builds&lt;/h2>
&lt;p>The next tactic you are likely to encounter when searching for ways to reduce Docker image sizes is multi-stage 🏗 builds. This tactic, &lt;a href="https://docs.docker.com/develop/develop-images/multistage-build/">recommended by Docker and many in the Docker community&lt;/a>, is essentially building the image twice. The first set of commands builds your base application image, all things included. The second set of commands builds an image off of that base image, taking only what&amp;rsquo;s needed and leaving out anything that&amp;rsquo;s not.&lt;/p>
&lt;p>With a multi-stage build, our &lt;code>Dockerfile&lt;/code> would look like this. Notice the two &lt;code>FROM&lt;/code> statements. The first builds the application image; the second copies the necessary files from that image into the second, more production-ready version.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-dockerfile" data-lang="dockerfile">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">FROM&lt;/span>&lt;span style="color:#87ceeb"> node:16.2.0-alpine as builder&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">WORKDIR&lt;/span>&lt;span style="color:#87ceeb"> /usr/src/app&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">COPY&lt;/span> package*.json ./
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">RUN&lt;/span> npm ci
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">COPY&lt;/span> app.js ./
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">FROM&lt;/span>&lt;span style="color:#87ceeb"> node:16.2.0-alpine&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">WORKDIR&lt;/span>&lt;span style="color:#87ceeb"> /usr/src/app&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">COPY&lt;/span> --from=builder /usr/src/app .
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">EXPOSE&lt;/span>&lt;span style="color:#87ceeb"> 3000&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">USER&lt;/span>&lt;span style="color:#87ceeb"> node&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">CMD&lt;/span> [&lt;span style="color:#87ceeb">&amp;#34;node&amp;#34;&lt;/span>,&lt;span style="color:#87ceeb">&amp;#34;app.js&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="pros-dev-and-prod-images-can-be-built-separately">Pros: Dev and Prod images can be built separately&lt;/h3>
&lt;p>When combined with &lt;a href="https://docs.docker.com/compose/">Docker Compose&lt;/a>, this approach gives developers a flexible development environment while reducing bloat in the production images. You can simply use your initial image for dev/test and the final version for production. Multi-stage builds work especially well for Go containers, significantly reducing image size, but also work well for static Node.js and React-type applications.&lt;/p>
&lt;h3 id="cons-added-complexity-use-case-specific">Cons: Added complexity; use-case specific&lt;/h3>
&lt;p>Multi-stage builds are still relatively new 🌱 on the scene. For most developers still new to containers, knowing what to copy over to the final production image and what to leave behind is a major barrier to entry. Further, this pattern can run into challenges.&lt;/p>
&lt;p>Since we&amp;rsquo;re already using an Alpine image, the size savings are relatively minor for our &amp;ldquo;Hello World&amp;rdquo; example. You&amp;rsquo;d expect to see greater gains in a full-blown React or Vue application.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>REPOSITORY TAG IMAGE ID CREATED SIZE
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cotw-node-multistage latest 52bc33d14a87 3 minutes ago 114MB
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cotw-node-alpine latest 2cc7b4a7b09c 4 days ago 114MB
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cotw-node latest 873fb9fca53a 7 days ago 856MB
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="development-tools-and-distroless">Development tools and Distroless&lt;/h2>
&lt;p>There are several tools - and new ones emerging every day - that look to bypass or automate &lt;code>Dockerfile&lt;/code> authoring to make image creation easier. &lt;a href="https://buildpacks.io/">&lt;em>Buildpacks&lt;/em>&lt;/a> are the most mature of these technologies and can be used through tools like &lt;a href="https://buildpacks.io/docs/tools/pack/">Pack&lt;/a> or &lt;a href="https://www.waypointproject.io/plugins/pack">Waypoint&lt;/a>.&lt;/p>
&lt;p>There are builder options from multiple sources - Heroku, Google, and Paketo are common favourites - and each gives you a slightly different developer experience and final image when used.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ pack build cotw-node-bp-google --builder gcr.io/buildpacks/builder:v1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ pack build cotw-node-bp-heroku --builder heroku/buildpacks:18
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ pack build cotw-node-bp-pb-base --builder paketobuildpacks/builder:base
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ pack build cotw-node-bp-pb-full --builder paketobuildpacks/builder:full
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="pros-when-they-work-they-work">Pros: When they work, they work&lt;/h3>
&lt;p>In certain instances, Buildpacks can take the pain out of &lt;code>Dockerfile&lt;/code> authoring and just create container images of your application with no fuss. The pack tool is looking for &amp;ldquo;app-like&amp;rdquo; files in your source directory, and automatically figuring out what kind of application is there and how to containerize it. In the case of our Node sample, it sees &lt;code>package.json&lt;/code> and correctly assumes we have a Node.js application.&lt;/p>
&lt;h3 id="cons-when-they-dont">Cons: When they don&amp;rsquo;t…&lt;/h3>
&lt;p>Given the relative newness of this approach for Docker containers, there are a lot of gotchas with Buildpacks. Non-standard applications or operating systems can struggle, and we&amp;rsquo;ve had issues running them successfully on the new Silicon Macbook Pros. The resulting images vary a lot - we saw a range of 200MB to 800MB in our examples - and the results tend to be lower than what you&amp;rsquo;d get with other techniques.&lt;/p>
&lt;h2 id="automate-it-with-slimtoolkit">Automate it with SlimToolKit&lt;/h2>
&lt;p>The &lt;a href="https://slimtoolkit.org/">SlimToolKit&lt;/a> (&lt;em>formerly DockerSlim&lt;/em>) open-source project was created by &lt;a href="https://slim.ai">Slim.AI&lt;/a> CTO &lt;a href="https://twitter.com/kcqon">Kyle Quest&lt;/a> in 2015 as a way to automate container optimisation. Simply download and run &lt;code>slim build &amp;lt;myimage&amp;gt;&lt;/code> and SlimToolKit will examine the image, rebuild it with only the required dependencies, and give you a new image that can be run just like the original.&lt;/p>
&lt;h3 id="pros-its-automatic">Pros: It&amp;rsquo;s automatic&lt;/h3>
&lt;p>SlimToolKit means you can work with whatever base image you&amp;rsquo;d like (say, Ubuntu or Debian) and let SlimToolKit worry about removing unnecessary tools and files en route to production. The best part is that SlimToolKit can be used alongside any of these other techniques. Once tested, it can be integrated into your CI/CD pipeline for automatic container minification, and the reduction in size leads to faster build times and better security.&lt;/p>
&lt;h3 id="cons-steep-learning-curve">Cons: Steep learning curve&lt;/h3>
&lt;p>As with any open-source software, SlimToolKit can take some time to get working, especially for non-trivial applications. It works best for web-style applications, micro-services and APIs that have defined HTTP/HTTPS ports which the sensor can find and use to observe the container internals.&lt;/p>
&lt;p>For best results, spend some time getting to know the various command flags available to tune your image, and &lt;a href="https://github.com/slimtoolkit/examples">take a look at the examples for whatever framework you&amp;rsquo;re using&lt;/a>.&lt;/p>
&lt;h2 id="connecting-with-slimtoolkit">Connecting with SlimToolKit&lt;/h2>
&lt;p>There&amp;rsquo;s an &lt;a href="https://discord.gg/uBttmfyYNB">active Slim.AI Discord channel&lt;/a> full of experts who can help you triage issues as they arise.&lt;/p></description><summary>Advanced techniques for production-ready container best practice</summary></item><item><title>Creating Production-Ready Containers - The Basics</title><link>https://wimpysworld.com/posts/creating-production-ready-containers-the-basics/</link><pubDate>Thu, 03 Jun 2021 12:18:15 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/creating-production-ready-containers-the-basics/</guid><description>&lt;p>So you&amp;rsquo;ve coded an awesome app and you are ready to deploy it to the cloud. You&amp;rsquo;ve heard a lot about &lt;a href="https://www.docker.com/">Docker&lt;/a> and completed a few online tutorials to containerise your app. All set, right? But what do you need to know if you&amp;rsquo;re going to move that app to a production environment on the public Internet? What if you&amp;rsquo;re using it for your job and need to pass security scans and DevOps checks?&lt;/p>
&lt;p>In this series, I introduce some basic concepts for making production-ready containers. I also introduce the concept of &amp;ldquo;slimming&amp;rdquo; a container. &lt;strong>Slimming&lt;/strong> refers to both optimising and minifying your Docker containers, reducing them in size by up to 80-percent while also making them more secure by decreasing the attack surface. Slimming your container is also a great way to implement &lt;a href="https://www.slim.ai/blog/why-dont-we-practice-container-best-practices">container best practices&lt;/a> without re-engineering your entire workflow.&lt;/p>
&lt;p>There are many ways to slim a container, from basic security to fully automated open-source tools like &lt;a href="https://slimtoolkit.org/">SlimToolKit&lt;/a> (formerly &lt;a href="https://dockersl.im/">DockerSlim&lt;/a>). &lt;em>Full disclosure&lt;/em>: I used work for &lt;a href="https://slim.ai">Slim.AI&lt;/a>, a company founded on the SlimToolKit open source project. Let&amp;rsquo;s look at some of the common ways developers create production-ready container images today.&lt;/p>
&lt;p>I&amp;rsquo;ll explore each of these in a separate article using a simple &amp;ldquo;Hello World&amp;rdquo; Node.js example that can be found in many online tutorials.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">const&lt;/span> express = require(&lt;span style="color:#87ceeb">&amp;#39;express&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">const&lt;/span> app = express()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">const&lt;/span> port = &lt;span style="color:#f60">3000&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>app.get(&lt;span style="color:#87ceeb">&amp;#39;/&amp;#39;&lt;/span>, (req, res) =&amp;gt; {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> res.send(&lt;span style="color:#87ceeb">&amp;#39;Hello World!&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>})
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>app.listen(port, () =&amp;gt; {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> console.log(&lt;span style="color:#87ceeb">`Example app listening at http://localhost:&lt;/span>&lt;span style="color:#87ceeb">${&lt;/span>port&lt;span style="color:#87ceeb">}&lt;/span>&lt;span style="color:#87ceeb">`&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>})
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Let&amp;rsquo;s get started by simply improving your &lt;code>Dockerfile&lt;/code> to build a better Docker image.&lt;/p>
&lt;h2 id="creating-a-better-dockerfile">Creating a Better Dockerfile&lt;/h2>
&lt;p>Most &lt;code>Dockerfile&lt;/code> examples you&amp;rsquo;ll find are not &amp;ldquo;production ready&amp;rdquo; and they aren&amp;rsquo;t meant to be. They are for instructional purposes to help developers successfully build an image. But when one gets into production scenarios, there are several &amp;ldquo;good-to-know&amp;rdquo; and a few &amp;ldquo;have-to-know&amp;rdquo; techniques that will improve build times, security, and reliability.&lt;/p>
&lt;p>Let&amp;rsquo;s look at a typical example that you might run into if you&amp;rsquo;re a Node.js developer looking to get &amp;ldquo;Hello World&amp;rdquo; running with Docker. I won&amp;rsquo;t go through building an actual app - there are a lot of great examples out there to show you how to do this - but rather focus on what to do if you were going to ship this to production.&lt;/p>
&lt;p>The typical &lt;code>Dockerfile&lt;/code> in a &amp;ldquo;Hello World&amp;rdquo; example might look something like this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-docker" data-lang="docker">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">FROM&lt;/span>&lt;span style="color:#87ceeb"> node:latest&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">WORKDIR&lt;/span>&lt;span style="color:#87ceeb"> /usr/src/app&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">COPY&lt;/span> package*.json app.js ./
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">RUN&lt;/span> npm install
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">EXPOSE&lt;/span>&lt;span style="color:#87ceeb"> 3000&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">CMD&lt;/span> [&lt;span style="color:#87ceeb">&amp;#34;node&amp;#34;&lt;/span>, &lt;span style="color:#87ceeb">&amp;#34;app.js&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>It uses the latest version of the official Node.js image, sets a directory and copies your app into the container image, installs dependencies, exposes port 3000, and runs the app via &lt;code>CMD&lt;/code>.&lt;/p>
&lt;p>While this will run no problem on your local machine, and is great for learning the ropes, this approach is almost certainly going to run into issues when you ship it to production. Let&amp;rsquo;s take a look at some of these in order of severity.&lt;/p>
&lt;h3 id="major-issues">Major issues&lt;/h3>
&lt;h4 id="running-as-root">Running as Root&lt;/h4>
&lt;p>Since this example doesn&amp;rsquo;t set a &lt;code>USER&lt;/code> explicitly in the &lt;code>Dockerfile&lt;/code>, Docker runs the build and all commands as the &lt;code>root&lt;/code> user. While not an issue for local development, your friendly neighbourhood SysAdmin will tell you the myriad of issues that come with running applications as root on a server in production. And with Docker, a &lt;a href="https://medium.com/jobteaser-dev-team/docker-user-best-practices-a8d2ca5205f4">new set of attack methods&lt;/a> can arise.&lt;/p>
&lt;p>Thankfully, most major languages and frameworks have a predefined user for running applications. In Node.js, the user is just &lt;code>node&lt;/code> and can be invoked in the &lt;code>Dockerfile&lt;/code> explicitly.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-docker" data-lang="docker">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">FROM&lt;/span>&lt;span style="color:#87ceeb"> node:latest&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">WORKDIR&lt;/span>&lt;span style="color:#87ceeb"> /usr/src/app&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">COPY&lt;/span> package*.json app.js ./
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">RUN&lt;/span> npm install
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">USER&lt;/span>&lt;span style="color:#87ceeb"> node&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">EXPOSE&lt;/span>&lt;span style="color:#87ceeb"> 3000&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">CMD&lt;/span> [&lt;span style="color:#87ceeb">&amp;#34;node&amp;#34;&lt;/span>, &lt;span style="color:#87ceeb">&amp;#34;app.js&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="using-latest-version">Using &lt;code>latest&lt;/code> version&lt;/h4>
&lt;p>Choosing a version number for your container is often called &lt;em>pinning&lt;/em>. While many tutorials - and even some experts - will counsel newcomers to pin their images to the &lt;code>latest&lt;/code> tag, which means you get whatever the most recently updated version is, using the &lt;code>latest&lt;/code> tag can cause issues in production.&lt;/p>
&lt;p>Containers are meant to be ephemeral, meaning they can be created, destroyed, started, stopped, and reproduced with ease and &lt;em>reliability&lt;/em>. Using the &lt;code>latest&lt;/code> tag means there isn&amp;rsquo;t a single source of truth for your container&amp;rsquo;s &amp;ldquo;bill of materials&amp;rdquo;. A new version or update of a dependency could introduce a breaking change, which may cause the build to fail somewhere in your CI/CD pipeline.&lt;/p>
&lt;p>&lt;strong>Example &lt;code>Dockerfile&lt;/code>&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-docker" data-lang="docker">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">FROM&lt;/span>&lt;span style="color:#87ceeb"> node:latest&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Production &lt;code>Dockerfile&lt;/code>&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-docker" data-lang="docker">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">FROM&lt;/span>&lt;span style="color:#87ceeb"> node:16.2.0&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Other tutorials I&amp;rsquo;ve seen pin only the major version. For example, using &lt;code>node:14&lt;/code>. This carries the same risks as using &lt;code>latest&lt;/code>, as minor versions can change dependencies as well.&lt;/p>
&lt;p>Now, pinning a specific major and minor version in your &lt;code>Dockerfile&lt;/code> is a trade-off decision - you&amp;rsquo;re choosing to not automatically receive security, fixes or performance improvements that come via new updates - but most DevSecOps teams prefer to employ security scanning and container management software as a way to control updates rather than dealing with the unpredictability that comes with container build failures in production CI/CD pipelines.&lt;/p>
&lt;h3 id="performance-improvements">Performance improvements&lt;/h3>
&lt;h4 id="better-layer-caching">Better layer caching&lt;/h4>
&lt;p>Docker works on the concept of &lt;em>layer caching&lt;/em>. It builds images sequentially. Layering dependencies on top of each other and only rebuilding them when something in the layer has changed.&lt;/p>
&lt;p>Layer 0 in a Docker image is often the base operating system, which rarely changes significantly; although commercial Linux vendors often publish new base images to incorporate security fixes.&lt;/p>
&lt;p>Application code, however, is highly likely to change during the software development cycle, as you iterate on features, refactor, and fix bugs. Dependencies in our core system, installed here by &lt;code>npm install&lt;/code>, change more often than the base OS, but less often than the application code.&lt;/p>
&lt;p>In our example &lt;code>Dockerfile&lt;/code>, we simply need to break the installation of the dependencies into separate instructions on their own lines.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-docker" data-lang="docker">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">FROM&lt;/span>&lt;span style="color:#87ceeb"> node:16.0.2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">WORKDIR&lt;/span>&lt;span style="color:#87ceeb"> /usr/src/app&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">COPY&lt;/span> package*.json ./
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">RUN&lt;/span> npm ci
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">USER&lt;/span>&lt;span style="color:#87ceeb"> node&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">COPY&lt;/span> app.js ./
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">EXPOSE&lt;/span>&lt;span style="color:#87ceeb"> 3000&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">CMD&lt;/span> [&lt;span style="color:#87ceeb">&amp;#34;node&amp;#34;&lt;/span>, &lt;span style="color:#87ceeb">&amp;#34;app.js&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>We actually end up creating another layer by now having two &lt;code>COPY&lt;/code> commands. While adding layers is typically a no-no for build times and image sizes, the tax we pay on this optimisation is going to save us in the long run as we cycle through the QA process, since we aren&amp;rsquo;t reinstalling dependencies if we don’t have to.&lt;/p>
&lt;p>We also opt for the &lt;code>npm ci&lt;/code> command instead of &lt;code>npm install&lt;/code>, which is preferred for automated environments, such as CI/CD, and will help prevent breaking changes from dependencies. Read &lt;a href="https://docs.npmjs.com/cli/v7/commands/npm-ci">more about &lt;code>npm ci&lt;/code> here&lt;/a>.&lt;/p>
&lt;h4 id="use-entrypoint-instead-of-cmd">Use &lt;code>ENTRYPOINT&lt;/code> instead of &lt;code>CMD&lt;/code>&lt;/h4>
&lt;p>At a surface level, there isn&amp;rsquo;t a big difference between using &lt;code>ENTRYPOINT&lt;/code> with your app file versus running &lt;code>CMD&lt;/code> using the shell plus your app file. However, web- and API-type containers like Node.js applications are often running as executables in production, and there, proper signal handling - such as graceful shutdowns - are important.&lt;/p>
&lt;p>&lt;code>CMD&lt;/code> provides some flexibility for calling executables with flags or overwriting them, which is common in development. But that generally won&amp;rsquo;t be relevant to production instances and &lt;code>ENTRYPOINT&lt;/code> will likely provide better signal processing.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-docker" data-lang="docker">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">FROM&lt;/span>&lt;span style="color:#87ceeb"> node:16.0.2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">WORKDIR&lt;/span>&lt;span style="color:#87ceeb"> /usr/src/app&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">COPY&lt;/span> package*.json ./
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">RUN&lt;/span> npm ci
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">USER&lt;/span>&lt;span style="color:#87ceeb"> node&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">COPY&lt;/span> app.js ./
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">EXPOSE&lt;/span>&lt;span style="color:#87ceeb"> 3000&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">ENTRYPOINT&lt;/span> [&lt;span style="color:#87ceeb">&amp;#34;node&amp;#34;&lt;/span>, &lt;span style="color:#87ceeb">&amp;#34;app.js&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="cleaning-up-cached-files">Cleaning up cached files&lt;/h3>
&lt;p>Most package managers have the ability to clean up their own cache. If you don’t do this, you&amp;rsquo;ll just be moving a bunch of unused files into your container for no reason. It might not save a lot of space depending on your application, but think of it as dropping your unused items at the charity shop &lt;em>before&lt;/em> you move rather than loading them in the moving van. It&amp;rsquo;s not a lot of effort and it&amp;rsquo;s the right thing to do. We do this by adding &lt;code>&amp;amp;&amp;amp; npm cache clean --force&lt;/code> to our &lt;code>RUN&lt;/code> instruction.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-docker" data-lang="docker">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">FROM&lt;/span>&lt;span style="color:#87ceeb"> node:16.0.2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">WORKDIR&lt;/span>&lt;span style="color:#87ceeb"> /usr/src/app&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">COPY&lt;/span> package*.json ./
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">RUN&lt;/span> npm ci &amp;amp;&amp;amp; npm cache clean --force
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">USER&lt;/span>&lt;span style="color:#87ceeb"> node&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">COPY&lt;/span> app.js ./
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">EXPOSE&lt;/span>&lt;span style="color:#87ceeb"> 3000&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">ENTRYPOINT&lt;/span> [&lt;span style="color:#87ceeb">&amp;#34;node&amp;#34;&lt;/span>, &lt;span style="color:#87ceeb">&amp;#34;app.js&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="conclusions">Conclusions&lt;/h3>
&lt;p>Improving your &lt;code>Dockerfile&lt;/code> is the first step towards creating a slimmed and optimised container. It closes some major security loopholes that are likely to raise flags with downstream checks and adds baseline optimisations for build time and docker image size.&lt;/p>
&lt;p>If this is all you do to improve your containers prior to shipping to production, you won&amp;rsquo;t be in a bad spot, but there&amp;rsquo;s more - &lt;em>way more&lt;/em> - that you can do to optimise images. We&amp;rsquo;ll &lt;a href="https://wimpysworld.com/posts/creating-production-ready-containers-advanced-techniques/">explore those techniques in the next article&lt;/a>.&lt;/p></description><summary>Beginners guide to container best practices</summary></item><item><title>Retro Home</title><link>https://wimpysworld.com/projects/retro-home/</link><pubDate>Tue, 21 Jul 2020 00:00:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/projects/retro-home/</guid><description>&lt;p>&lt;a href="https://github.com/wimpysworld/retro-home">Retro Home&lt;/a> is custom Raspberry Pi
operating system purpose built for retro gaming. Built with
&lt;a href="https://ubuntu.com/">Ubuntu&lt;/a> and using the minimalist emulator frontend
&lt;a href="https://ludo.libretro.com/">Ludo&lt;/a> it supports most classic consoles from Atari,
Nintendo, Sega and SNK along with arcade emulation support. A number of retro
styled Raspberry Pi cases from &lt;a href="https://retroflag.com/">Retroflag&lt;/a> and
&lt;a href="https://www.waveshare.com/product/raspberry-pi/portable-gaming.htm">Waveshare&lt;/a>
are supported (with more in the works) using bespoke GPIO drivers.&lt;/p>
&lt;ul>
&lt;li>Organisation: &lt;a href="https://github.com/wimpysworld/retro-home">Retro Home&lt;/a>&lt;/li>
&lt;li>Date: July 2020 - date&lt;/li>
&lt;li>Role: Project Lead&lt;/li>
&lt;/ul></description><summary>A retro-gaming operating system for Raspberry Pi built with Ubuntu and Ludo</summary></item><item><title>Rolling Rhino</title><link>https://wimpysworld.com/projects/rolling-rhino/</link><pubDate>Sat, 27 Jun 2020 00:00:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/projects/rolling-rhino/</guid><description>&lt;p>Simple shell script to convert Ubuntu into a &lt;em>&amp;ldquo;rolling release&amp;rdquo;&lt;/em> that tracks the
&lt;code>devel&lt;/code> series; &lt;strong>for the toughest of Ubuntu users&lt;/strong>.&lt;/p>
&lt;p>This project has served its purpose. It inspired another group of developers to
create a &lt;a href="https://rollingrhino.org/">fully fledged Ubuntu Rolling Rhino distro&lt;/a>.&lt;/p>
&lt;ul>
&lt;li>Organisation: &lt;a href="https://github.com/wimpysworld/rolling-rhino">Rolling Rhino&lt;/a>&lt;/li>
&lt;li>Date: March 2020 - November 2022&lt;/li>
&lt;li>Role: Project Lead&lt;/li>
&lt;/ul></description><summary>Convert Ubuntu into a rolling release</summary></item><item><title>Quickemu</title><link>https://wimpysworld.com/projects/quickemu/</link><pubDate>Sun, 15 Mar 2020 00:00:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/projects/quickemu/</guid><description>&lt;p>Quickly create and run highly optimised desktop virtual machines for Linux,
macOS and Windows; with just two commands. You decide what operating system you
want to run and &lt;a href="https://github.com/quickemu-project/quickemu">Quickemu&lt;/a> will figure out the best way to do it for you&lt;/p>
&lt;ul>
&lt;li>Organisation: &lt;a href="https://github.com/quickemu-project">Quickemu Project&lt;/a>&lt;/li>
&lt;li>Date: March 2020 - date&lt;/li>
&lt;li>Role: Project Lead&lt;/li>
&lt;/ul></description><summary>Quickly create and run optimised Windows, macOS and Linux virtual machines</summary></item><item><title>DIY SNES Classic</title><link>https://wimpysworld.com/posts/diy-snes-classic/</link><pubDate>Tue, 24 Jan 2017 12:00:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/diy-snes-classic/</guid><description>&lt;p>Inspired by the recent &lt;a href="http://www.nintendo.com/nes-classic/">NES Classic&lt;/a> I
made a &lt;strong>DIY SNES Classic&lt;/strong> just in time for the Christmas holidays and it&amp;rsquo;s
very portable!&lt;/p>
&lt;p class="text-center">
&lt;img src="diy-homemade-snes-classic-raspberrypi.webp" class="img-fluid" alt="Raspberry Pi 3 in a 3D printed SNES case with 8Bitdo SNES30 controllers"/>
&lt;br />
&lt;em>Raspberry Pi 3 in a 3D printed SNES case with 8Bitdo SNES30 controllers&lt;/em>
&lt;/p>
&lt;p>To make one yourself you&amp;rsquo;ll need:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://www.raspberrypi.org/products/raspberry-pi-3-model-b/">Raspberry Pi 3 Model B&lt;/a>.&lt;/li>
&lt;li>&lt;a href="https://retropie.org.uk/">Retropie 4.1&lt;/a> or newer.&lt;/li>
&lt;li>Two &lt;a href="http://www.8bitdo.com/snes30/">8Bitdo SNES30 wireless controllers&lt;/a>.&lt;/li>
&lt;li>A &lt;a href="https://www.etsy.com/uk/listing/485061145/snes-3d-printed-case-raspberry-pi">SNES 3D Printed case&lt;/a>.&lt;/li>
&lt;li>&lt;a href="https://github.com/biscuits99/rp-video-manager">CRT scanline shaders&lt;/a> to complete the retro look on the big screen.&lt;/li>
&lt;/ul>
&lt;p>Both controllers use Bluetooth, so two player wire-free gaming is possible. The
USB cables are just for charging, but if you&amp;rsquo;ve got no charge they can be used
as wired controllers too. Retropie can be controlled via the controllers, no
keyboard/mouse required.&lt;/p></description><summary>I made my own &amp;ldquo;SNES Classic&amp;rdquo; with a Raspberry Pi</summary></item><item><title>Raspberry Pi 3 Nextcloud Box running on Ubuntu Core</title><link>https://wimpysworld.com/posts/raspberry-pi-3-nextcloud-box-running-on-ubuntu-core/</link><pubDate>Tue, 13 Dec 2016 17:17:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/raspberry-pi-3-nextcloud-box-running-on-ubuntu-core/</guid><description>&lt;p>I recently bought the &lt;a href="https://nextcloud.com/box/">Nextcloud Box&lt;/a>. When
it came to setting it up I ran into a problem, I only had Raspberry Pi 3
computers available and at the time of writing the microSDHC card
provided with the Nextcloud Box only supports the Raspberry Pi 2. &lt;em>Bummer!&lt;/em>&lt;/p>
&lt;h1 id="overview">Overview&lt;/h1>
&lt;p>This guide outlines how to use &lt;a href="https://www.ubuntu.com/core">Ubuntu Core&lt;/a>
on the &lt;a href="https://www.raspberrypi.org/">Raspberry Pi 3&lt;/a> to run &lt;a href="https://nextcloud.com/">Nextcloud&lt;/a>
provided as a &lt;a href="http://snapcraft.io">snap&lt;/a> from the Ubuntu store.&lt;/p>
&lt;p>If you&amp;rsquo;re not familiar with Ubuntu Core, here&amp;rsquo;s a quote:&lt;/p>
&lt;blockquote>
&lt;p>Ubuntu Core is a tiny, transactional version of Ubuntu for IoT devices and large container deployments. It runs a new breed of super-secure, remotely upgradeable Linux app packages known as snaps&lt;/p>
&lt;/blockquote>
&lt;p>After following this guide Ubuntu Core and any installed snaps (and
their data) will reside on the SD card and the 1TB hard disk in the
Nextcloud box will be available for file storage. This
guide explains how to:&lt;/p>
&lt;ul>
&lt;li>Install and configure Ubuntu Core 16 for the Raspberry Pi 3&lt;/li>
&lt;li>Format the 1TB hard disk in the Nextcloud Box and auto-mount it&lt;/li>
&lt;li>Install the Nextcloud snap and connect the &lt;code>removable-media&lt;/code> interface to allow access to the hard disk&lt;/li>
&lt;li>Activate and configure the Nextcloud &lt;em>External Storage&lt;/em> app so the hard disk can be used to store files&lt;/li>
&lt;li>Optional configuration of Email and HTTPS for Nextcloud&lt;/li>
&lt;/ul>
&lt;h2 id="prepare-a-microsdhc-card">Prepare a microSDHC card&lt;/h2>
&lt;p>I explained the main steps in this post but you &lt;em>really should&lt;/em> read and
follow the &lt;a href="https://developer.ubuntu.com/en/snappy/start/raspberry-pi-2/">Get started with a Raspberry Pi 2 or 3&lt;/a>
page as it fully explains how to use a desktop computer to download an
Ubuntu Core image for your Raspberry Pi 2 or 3 and copy it to an SD card
ready to boot.&lt;/p>
&lt;p>Here&amp;rsquo;s how to create an Ubuntu Core microSDHC card for the Raspberry Pi
3 using an Ubuntu desktop:&lt;/p>
&lt;ul>
&lt;li>Download &lt;a href="http://releases.ubuntu.com/ubuntu-core/16/ubuntu-core-16-pi3.img.xz">Ubuntu Core 16 image for Raspberry Pi 3&lt;/a>&lt;/li>
&lt;li>Insert the microSDHC card into your PC
&lt;ul>
&lt;li>Use &lt;a href="apt://gnome-disk-utility">GNOME Disks&lt;/a> and its &lt;em>Restore Disk Image&amp;hellip;&lt;/em> option, which &lt;strong>natively supports XZ compressed images.&lt;/strong>&lt;/li>
&lt;li>Select your SD card from the panel on the left&lt;/li>
&lt;li>Click the &amp;ldquo;burger menu&amp;rdquo; on the right and Select &lt;em>Restore Disk Image&amp;hellip;&lt;/em>&lt;/li>
&lt;li>Making sure the SD card is still selected, click the Power icon on the right.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Eject the SD card physically from your PC.&lt;/li>
&lt;/ul>
&lt;div class="text-center">&lt;img src="GNOME-Disks-Restore-Disk-Image.png" class="img-fluid" alt="GNOME Disks - Restore Disk Image" />&lt;/div>
&lt;h2 id="ubuntu-core-first-boot">Ubuntu Core first boot&lt;/h2>
&lt;p>An Ubuntu SSO account is required to setup the first user on Ubuntu Core:&lt;/p>
&lt;ul>
&lt;li>Start by creating an &lt;a href="https://login.ubuntu.com/">Ubuntu SSO account&lt;/a>&lt;/li>
&lt;li>Import an &lt;a href="https://login.ubuntu.com/ssh-keys">SSH Key into your Ubuntu SSO account&lt;/a>
&lt;ul>
&lt;li>Here are &lt;a href="https://help.ubuntu.com/community/SSH/OpenSSH/Keys">instructions to generate an SSH Key&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>You&amp;rsquo;ll need a keyboard and monitor connected to the Raspberry Pi 3 to go complete the first boot process and device configuration.&lt;/li>
&lt;/ul>
&lt;p>Insert the Ubuntu Core microSHDC into the Raspberry Pi, which should be
in the &lt;a href="https://nextcloud.com/wp-content/themes/next/assets/files/Box-Assembly-Guide.pdf?x16328">assembled Nextcloud Box&lt;/a>
with a keyboard and monitor connected. Plug in the power.&lt;/p>
&lt;ul>
&lt;li>The system will boot then become ready to configure&lt;/li>
&lt;li>The device will display the prompt &lt;em>&amp;ldquo;Press enter to configure&amp;rdquo;&lt;/em>&lt;/li>
&lt;li>Press enter then select &lt;em>&amp;ldquo;Start&amp;rdquo;&lt;/em> to begin configuring your network and an administrator account. Follow the instructions on the screen, you will be asked to configure your network and enter your Ubuntu SSO credentials&lt;/li>
&lt;li>At the end of the process, you will see your credentials to access your Ubuntu Core machine:&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>This device is registered to &amp;lt;Ubuntu SSO email address&amp;gt;.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Remote access was enabled via authentication with the SSO user &amp;lt;Ubuntu SSO user name&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Public SSH keys were added to the device for remote access.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="login">Login&lt;/h3>
&lt;p>Once setup is done, you can login to Ubuntu Core using ssh, from a
computer on the same network, using the following command:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>ssh &amp;lt;Ubuntu SSO user name&amp;gt;@&amp;lt;device IP address&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The user name is your Ubuntu SSO user name.&lt;/p>
&lt;h3 id="reconfiguring-network">Reconfiguring network&lt;/h3>
&lt;p>Should you need to reconfigure the network at a later stage you can do
so with:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo console-conf
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="prepare-1tb-hard-disk">Prepare 1TB hard disk&lt;/h2>
&lt;p>Log in to your Raspberry Pi 3 running Ubuntu Core via ssh.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>ssh &amp;lt;Ubuntu SSO user name&amp;gt;@&amp;lt;device IP address&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="partition-and-format-the-nextcloud-box-hard-disk">Partition and format the Nextcloud Box hard disk&lt;/h3>
&lt;p>This will create a single partition formatted with the ext4 filesystem.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo fdisk /dev/sda
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Do the following to create the partition:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>Command (m for help): o
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Created a new DOS disklabel with disk identifier 0x253fea38.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Command (m for help): n
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Partition type
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> p primary (0 primary, 0 extended, 4 free)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> e extended (container for logical partitions)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Select (default p): p
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Partition number (1-4, default 1): 1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>First sector (2048-1953458175, default 2048):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Last sector, +sectors or +size{K,M,G,T,P} (2048-1953458175, default 1953458175):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Created a new partition 1 of type &amp;#39;Linux&amp;#39; and of size 931.5 GiB.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Command (m for help): w
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Now format the partition and give it the label &lt;strong>data&lt;/strong>. This label will
be used to reference it for mounting later:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo mkfs.ext4 -L data /dev/sda1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="automatically-mount-the-partition">Automatically mount the partition&lt;/h3>
&lt;p>Most of the Ubuntu Core root file system is read-only, so it is not
possible to edit &lt;code>/etc/fstab&lt;/code>. Therefore we&amp;rsquo;ll use &lt;a href="https://www.freedesktop.org/wiki/Software/systemd/">systemd&lt;/a>
to achieve that.&lt;/p>
&lt;p>Be aware of one of the &lt;code>systemd.mount&lt;/code> pitfalls:&lt;/p>
&lt;blockquote>
&lt;p>Mount units must be named after the mount point directories they control. Example: the mount point /home/lennart must be configured in a unit file home-lennart.mount.&lt;/p>
&lt;/blockquote>
&lt;p>Yes that&amp;rsquo;s right! &lt;strong>The unit filename must match the mount point path&lt;/strong>.&lt;/p>
&lt;p>Create the &lt;code>media-data.mount&lt;/code> unit:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo vi /writable/system-data/etc/systemd/system/media-data.mount
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Add the following content:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-systemd" data-lang="systemd">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">[Unit]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Description=&lt;span style="color:#87ceeb">Mount unit for data&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">[Mount]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>What=&lt;span style="color:#87ceeb">/dev/disk/by-label/data&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Where=&lt;span style="color:#87ceeb">/media/data&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Type=&lt;span style="color:#87ceeb">ext4&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">[Install]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>WantedBy=&lt;span style="color:#87ceeb">multi-user.target&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Reload systemd, scanning for new or changed units:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo systemctl daemon-reload
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Start the &lt;code>media-data.mount&lt;/code> unit, which will mount the volume, and also
enable it so it will be automatically mounted on boot.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo systemctl start media-data.mount
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo systemctl enable media-data.mount
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>And just like any other unit, you can view its status using
&lt;code>systemctl status&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo systemctl status media-data.mount
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="update-ubuntu-core">Update Ubuntu Core&lt;/h2>
&lt;p>Make sure Ubuntu Core is up-to-date and reboot.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo snap refresh
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo reboot
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>After the reboot, make sure &lt;code>/media/data&lt;/code> is mounted. If not double
check the steps above.&lt;/p>
&lt;h2 id="install-nextcloud">Install Nextcloud&lt;/h2>
&lt;p>The Nextcloud snap uses the &lt;code>removable-media&lt;/code> interface, which grants
access to &lt;code>/media/*&lt;/code>, and requires manual connection:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo snap install nextcloud
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo snap connect nextcloud:removable-media core:removable-media
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Browse to the Nextcloud IP address and create the admin user account,
for example:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://nextcloud.local/">http://nextcloud.local/&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="nextcloud-configuration">Nextcloud configuration&lt;/h2>
&lt;p>In the examples below replace &lt;code>nextcloud.local&lt;/code> with the IP address or
hostname of your Nextcloud Box and replace &lt;code>example.org&lt;/code> with your domain.&lt;/p>
&lt;h3 id="external-storage">External Storage&lt;/h3>
&lt;p>Enable the External Storge app via:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://nextcloud.local/index.php/settings/apps?category=disabled#">http://nextcloud.local/index.php/settings/apps?category=disabled#&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Configure External Storage app via:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://nextcloud.local/index.php/settings/admin/externalstorages">http://nextcloud.local/index.php/settings/admin/externalstorages&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Use these settings:&lt;/p>
&lt;ul>
&lt;li>Folder name: &lt;em>data&lt;/em>&lt;/li>
&lt;li>External storage: &lt;em>Local&lt;/em>&lt;/li>
&lt;li>Authentication: &lt;em>None&lt;/em>&lt;/li>
&lt;li>Configuration: &lt;code>/media/data&lt;/code>&lt;/li>
&lt;li>Available for: &lt;em>All&lt;/em>&lt;/li>
&lt;/ul>
&lt;h3 id="email">Email&lt;/h3>
&lt;p>Configure your outgoing email settings via:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://nextcloud.local/index.php/settings/admin/additional">http://nextcloud.local/index.php/settings/admin/additional&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>I use &lt;a href="https://sendgrid.com/">Sendgrid&lt;/a> for sending email alerts from my
servers and devices. These are the settings that work for me:&lt;/p>
&lt;ul>
&lt;li>Send mode: &lt;em>SMTP&lt;/em>&lt;/li>
&lt;li>Encryption: &lt;em>STARTTLS&lt;/em>&lt;/li>
&lt;li>From address: &lt;em>&lt;a href="mailto:nextcloud@example.org">nextcloud@example.org&lt;/a>&lt;/em>&lt;/li>
&lt;li>Authentication method: &lt;em>Plain&lt;/em>&lt;/li>
&lt;li>Authentication required: &lt;em>Yes&lt;/em>&lt;/li>
&lt;li>Server address: &lt;em>smtp.sendgrid.net:587&lt;/em>&lt;/li>
&lt;li>Username: &lt;code>apikey&lt;/code>&lt;/li>
&lt;li>Password: &lt;code>theactualapikey&lt;/code>&lt;/li>
&lt;/ul>
&lt;h3 id="enabling-https">Enabling HTTPS&lt;/h3>
&lt;p>It is strongly recommend that you use HTTPS if you intend to expose your
Nextcloud to the Internet.&lt;/p>
&lt;p>First do a test to see if you can install a Let&amp;rsquo;s Encrypt certificate:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo nextcloud.enable-https -d
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Answer the questions:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>Have you met these requirements? (y/n) y
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Please enter an email address (for urgent notices or key recovery): name@example.org
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Please enter your domain name(s) (space-separated): nextcloud.example.org
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Attempting to obtain certificates... done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Looks like you&amp;#39;re ready for HTTPS!
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If everything went well, then install the certificate&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo nextcloud.enable-https
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Answer the questions again:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>Have you met these requirements? (y/n) y
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Please enter an email address (for urgent notices or key recovery): name@example.org
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Please enter your domain name(s) (space-separated): nextcloud.example.org
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Attempting to obtain certificates... done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Restarting apache... done
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If Let&amp;rsquo;s Encrypt didn&amp;rsquo;t work for you, you can always use Nextcloud with
a self-signed certificate.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo nextcloud.enable-https -s
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="manual-configuration-changes">Manual configuration changes&lt;/h3>
&lt;p>If you need to make any tweaks to the Nextcloud configuration file you
can edit it like so:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo vi /var/snap/nextcloud/current/nextcloud/config/config.php
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If you have manually edited the Nextcloud configuration you may need to
restart nextcloud:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo snap disable nextcloud
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo snap enable nextcloud
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="conclusion">Conclusion&lt;/h2>
&lt;p>So there it is, Nextcloud running on Ubuntu Core powered by a Raspberry
Pi 3. The performance is reasonable, obviously not stellar, but certainly
good enough to move some cloud services for a small family away from the
likes of Google and Dropbox. Now go and install some
&lt;a href="https://nextcloud.com/install/#install-clients">Nextcloud clients for your desktops and devices&lt;/a> :-)&lt;/p></description><summary>Creating a Pi 3 powered Nextcloud Box with Ubuntu Core</summary></item><item><title>HP Microserver N54L power saving and performance tuning using Debian</title><link>https://wimpysworld.com/posts/hp-microserver-n54l-power-saving-and-performance-tuning-using-debian/</link><pubDate>Wed, 16 Dec 2015 12:00:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/hp-microserver-n54l-power-saving-and-performance-tuning-using-debian/</guid><description>&lt;p>I&amp;rsquo;ve installed &lt;a href="http://www.openmediavault.org/">Open Media Vault&lt;/a>
on a &lt;a href="http://www8.hp.com/uk/en/products/proliant-servers/product-detail.html?oid=5336624">HP ProLiant MicroServer G7 N54L&lt;/a>
and use it as media server for the house. OpenMediaVault (OMV) is a
network attached storage (NAS) solution based on &lt;a href="http://www.debian.org">Debian&lt;/a>.&lt;/p>
&lt;p>I want to minimise power consumption but maximise performance. Here are
some tweaks reduce power consumption and improve network performance.&lt;/p>
&lt;h1 id="power-saving">Power Saving&lt;/h1>
&lt;p>Install the following.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>apt-get install amd64-microcode firmware-linux firmware-linux-free &lt;span style="color:#87ceeb">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">&lt;/span>firmware-linux-nonfree pciutils powertop radeontool
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>And for ACPI.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>apt-get install acpi acpid acpi-support acpi-support-base
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="aspm-and-acpi">ASPM and ACPI&lt;/h2>
&lt;p>First I enabled PCIE ASPM in the BIOS and forced the kernel to use it and
ACPI via &lt;code>grub&lt;/code> by changing &lt;code>GRUB_CMDLINE_LINUX_DEFAULT&lt;/code> in &lt;code>/etc/default/grub&lt;/code>,
so it looks like this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">GRUB_CMDLINE_LINUX_DEFAULT&lt;/span>=&lt;span style="color:#87ceeb">&amp;#34;quiet acpi=force pcie_aspm=force nmi_watchdog=0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Then update &lt;code>grub&lt;/code> and reboot.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>update-grub
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>reboot
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="enable-power-saving-via-udev">Enable Power Saving via udev&lt;/h2>
&lt;p>The following rules file &lt;code>/etc/udev/rules.d/90-local-n54l.rules&lt;/code> enables
power saving modes for all PCI, SCSI and USB devices and ASPM. Futher
the internal Radeon card power profile is set to low as there is rarely
a monitor connected. The file contains the following:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">SUBSYSTEM&lt;/span>==&lt;span style="color:#87ceeb">&amp;#34;module&amp;#34;&lt;/span>, &lt;span style="color:#eedd82">KERNEL&lt;/span>==&lt;span style="color:#87ceeb">&amp;#34;pcie_aspm&amp;#34;&lt;/span>, &lt;span style="color:#eedd82">ACTION&lt;/span>==&lt;span style="color:#87ceeb">&amp;#34;add&amp;#34;&lt;/span>, &lt;span style="color:#eedd82">TEST&lt;/span>==&lt;span style="color:#87ceeb">&amp;#34;parameters/policy&amp;#34;&lt;/span>, ATTR{parameters/policy}=&lt;span style="color:#87ceeb">&amp;#34;powersave&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">SUBSYSTEM&lt;/span>==&lt;span style="color:#87ceeb">&amp;#34;i2c&amp;#34;&lt;/span>, &lt;span style="color:#eedd82">ACTION&lt;/span>==&lt;span style="color:#87ceeb">&amp;#34;add&amp;#34;&lt;/span>, &lt;span style="color:#eedd82">TEST&lt;/span>==&lt;span style="color:#87ceeb">&amp;#34;power/control&amp;#34;&lt;/span>, ATTR{power/control}=&lt;span style="color:#87ceeb">&amp;#34;auto&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">SUBSYSTEM&lt;/span>==&lt;span style="color:#87ceeb">&amp;#34;pci&amp;#34;&lt;/span>, &lt;span style="color:#eedd82">ACTION&lt;/span>==&lt;span style="color:#87ceeb">&amp;#34;add&amp;#34;&lt;/span>, &lt;span style="color:#eedd82">TEST&lt;/span>==&lt;span style="color:#87ceeb">&amp;#34;power/control&amp;#34;&lt;/span>, ATTR{power/control}=&lt;span style="color:#87ceeb">&amp;#34;auto&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">SUBSYSTEM&lt;/span>==&lt;span style="color:#87ceeb">&amp;#34;usb&amp;#34;&lt;/span>, &lt;span style="color:#eedd82">ACTION&lt;/span>==&lt;span style="color:#87ceeb">&amp;#34;add&amp;#34;&lt;/span>, &lt;span style="color:#eedd82">TEST&lt;/span>==&lt;span style="color:#87ceeb">&amp;#34;power/control&amp;#34;&lt;/span>, ATTR{power/control}=&lt;span style="color:#87ceeb">&amp;#34;auto&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">SUBSYSTEM&lt;/span>==&lt;span style="color:#87ceeb">&amp;#34;usb&amp;#34;&lt;/span>, &lt;span style="color:#eedd82">ACTION&lt;/span>==&lt;span style="color:#87ceeb">&amp;#34;add&amp;#34;&lt;/span>, &lt;span style="color:#eedd82">TEST&lt;/span>==&lt;span style="color:#87ceeb">&amp;#34;power/autosuspend&amp;#34;&lt;/span>, ATTR{power/autosuspend}=&lt;span style="color:#87ceeb">&amp;#34;2&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">SUBSYSTEM&lt;/span>==&lt;span style="color:#87ceeb">&amp;#34;scsi&amp;#34;&lt;/span>, &lt;span style="color:#eedd82">ACTION&lt;/span>==&lt;span style="color:#87ceeb">&amp;#34;add&amp;#34;&lt;/span>, &lt;span style="color:#eedd82">TEST&lt;/span>==&lt;span style="color:#87ceeb">&amp;#34;power/control&amp;#34;&lt;/span>, ATTR{power/control}=&lt;span style="color:#87ceeb">&amp;#34;auto&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">SUBSYSTEM&lt;/span>==&lt;span style="color:#87ceeb">&amp;#34;spi&amp;#34;&lt;/span>, &lt;span style="color:#eedd82">ACTION&lt;/span>==&lt;span style="color:#87ceeb">&amp;#34;add&amp;#34;&lt;/span>, &lt;span style="color:#eedd82">TEST&lt;/span>==&lt;span style="color:#87ceeb">&amp;#34;power/control&amp;#34;&lt;/span>, ATTR{power/control}=&lt;span style="color:#87ceeb">&amp;#34;auto&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">SUBSYSTEM&lt;/span>==&lt;span style="color:#87ceeb">&amp;#34;drm&amp;#34;&lt;/span>, &lt;span style="color:#eedd82">KERNEL&lt;/span>==&lt;span style="color:#87ceeb">&amp;#34;card*&amp;#34;&lt;/span>, &lt;span style="color:#eedd82">ACTION&lt;/span>==&lt;span style="color:#87ceeb">&amp;#34;add&amp;#34;&lt;/span>, &lt;span style="color:#eedd82">DRIVERS&lt;/span>==&lt;span style="color:#87ceeb">&amp;#34;radeon&amp;#34;&lt;/span>, &lt;span style="color:#eedd82">TEST&lt;/span>==&lt;span style="color:#87ceeb">&amp;#34;power/control&amp;#34;&lt;/span>, &lt;span style="color:#eedd82">TEST&lt;/span>==&lt;span style="color:#87ceeb">&amp;#34;device/power_method&amp;#34;&lt;/span>, ATTR{device/power_method}=&lt;span style="color:#87ceeb">&amp;#34;profile&amp;#34;&lt;/span>, ATTR{device/power_profile}=&lt;span style="color:#87ceeb">&amp;#34;low&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">SUBSYSTEM&lt;/span>==&lt;span style="color:#87ceeb">&amp;#34;scsi_host&amp;#34;&lt;/span>, &lt;span style="color:#eedd82">KERNEL&lt;/span>==&lt;span style="color:#87ceeb">&amp;#34;host*&amp;#34;&lt;/span>, &lt;span style="color:#eedd82">ACTION&lt;/span>==&lt;span style="color:#87ceeb">&amp;#34;add&amp;#34;&lt;/span>, &lt;span style="color:#eedd82">TEST&lt;/span>==&lt;span style="color:#87ceeb">&amp;#34;link_power_management_policy&amp;#34;&lt;/span>, ATTR{link_power_management_policy}=&lt;span style="color:#87ceeb">&amp;#34;min_power&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Add this to &lt;code>/erc/rc.local&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>echo &lt;span style="color:#87ceeb">&amp;#39;1500&amp;#39;&lt;/span> &amp;gt; &lt;span style="color:#87ceeb">&amp;#39;/proc/sys/vm/dirty_writeback_centisecs&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="hard-disk-spindown">Hard disk spindown&lt;/h2>
&lt;p>Using the Open Media Vault web interface got to &lt;code>Storage -&amp;gt; Physical Disks&lt;/code>,
select each disk in turn and click &lt;code>Edit&lt;/code> then set:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Advanced Power Management:&lt;/strong> Intermediate power usage with standby&lt;/li>
&lt;li>&lt;strong>Automatic Acoustic Management:&lt;/strong> Minimum performance, Minimum acoustic output&lt;/li>
&lt;li>&lt;strong>Spindown time:&lt;/strong> 20 minutes&lt;/li>
&lt;/ul>
&lt;h1 id="performance-tuning">Performance Tuning&lt;/h1>
&lt;h2 id="network">Network&lt;/h2>
&lt;p>The following tweaks improve network performance ,but &lt;strong>I have a
&lt;a href="http://www.hiwifi.co.uk/">HP NC360T PCI Express Dual Port Gigabit Server Adapter&lt;/a>&lt;/strong>
in my N54L so these settings may not be applicable to the onboard NIC.&lt;/p>
&lt;p>Add this to &lt;code>/erc/rc.local&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>ethtool -G eth0 rx &lt;span style="color:#f60">4096&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ethtool -G eth1 rx &lt;span style="color:#f60">4096&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ethtool -G eth0 tx &lt;span style="color:#f60">4096&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ethtool -G eth1 tx &lt;span style="color:#f60">4096&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ifconfig eth0 txqueuelen &lt;span style="color:#f60">1000&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ifconfig eth1 txqueuelen &lt;span style="color:#f60">1000&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Add the following to &lt;code>/etc/sysctl.d/local.conf&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>fs.file-max = &lt;span style="color:#f60">100000&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>net.core.netdev_max_backlog = &lt;span style="color:#f60">50000&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>net.core.optmem_max = &lt;span style="color:#f60">40960&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>net.core.rmem_default = &lt;span style="color:#f60">16777216&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>net.core.rmem_max = &lt;span style="color:#f60">16777216&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>net.core.wmem_default = &lt;span style="color:#f60">16777216&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>net.core.wmem_max = &lt;span style="color:#f60">16777216&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>net.ipv4.conf.all.accept_redirects = &lt;span style="color:#f60">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>net.ipv4.conf.all.accept_source_route = &lt;span style="color:#f60">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>net.ipv4.conf.all.log_martians = &lt;span style="color:#f60">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>net.ipv4.conf.all.send_redirects = &lt;span style="color:#f60">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>net.ipv4.ip_local_port_range = &lt;span style="color:#f60">10000&lt;/span> &lt;span style="color:#f60">65000&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>net.ipv4.tcp_fin_timeout = &lt;span style="color:#f60">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>net.ipv4.tcp_max_syn_backlog = &lt;span style="color:#f60">30000&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>net.ipv4.tcp_max_tw_buckets = &lt;span style="color:#f60">2000000&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>net.ipv4.tcp_rfc1337 = &lt;span style="color:#f60">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>net.ipv4.tcp_rmem = &lt;span style="color:#f60">4096&lt;/span> &lt;span style="color:#f60">87380&lt;/span> &lt;span style="color:#f60">16777216&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>net.ipv4.tcp_sack=&lt;span style="color:#f60">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>net.ipv4.tcp_slow_start_after_idle = &lt;span style="color:#f60">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>net.ipv4.tcp_timestamps=&lt;span style="color:#f60">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>net.ipv4.tcp_tw_reuse = &lt;span style="color:#f60">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>net.ipv4.tcp_wmem = &lt;span style="color:#f60">4096&lt;/span> &lt;span style="color:#f60">65536&lt;/span> &lt;span style="color:#f60">16777216&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>net.ipv4.udp_rmem_min = &lt;span style="color:#f60">8192&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>net.ipv4.udp_wmem_min = &lt;span style="color:#f60">8192&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>vm.swappiness = &lt;span style="color:#f60">10&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="conclusion">Conclusion&lt;/h2>
&lt;p>With these settings applied &lt;code>powertop&lt;/code> reports everything that can be in
a power saving mode is and the room temperature is measurably cooler.
More importantly, with four 4TB drives in a RAID-5 configuration
formatted with XFS and dual bonded gigabit ethernet, I am able to backup
data to the server at a sustained rate of 105MB/s, which is 0.85 Gbit.&lt;/p>
&lt;p>Not too shabby for an AMD Turion II Neo N54L (2.2GHz) 🙂&lt;/p>
&lt;h4 id="references">References&lt;/h4>
&lt;ul>
&lt;li>&lt;a href="http://www.wgdd.de/2013/08/hp-n54l-microserver-energy-efficiency.html?m=1">http://www.wgdd.de/2013/08/hp-n54l-microserver-energy-efficiency.html?m=1&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://gareth.halfacree.co.uk/2014/02/tuning-an-hp-proliant-microserver">http://gareth.halfacree.co.uk/2014/02/tuning-an-hp-proliant-microserver&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.scottalanmiller.com/linux/2011/06/20/working-with-nic-ring-buffers/">http://www.scottalanmiller.com/linux/2011/06/20/working-with-nic-ring-buffers/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://gist.github.com/dstroot/2785263">https://gist.github.com/dstroot/2785263&lt;/a>&lt;/li>
&lt;/ul></description><summary>Configure HP Microserver N54L Power Saving on Debian</summary></item><item><title>Intel NUC5i7RYH with Ubuntu</title><link>https://wimpysworld.com/posts/intel-nuc5i7ryh-with-ubuntu/</link><pubDate>Sun, 13 Dec 2015 13:18:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/intel-nuc5i7ryh-with-ubuntu/</guid><description>&lt;p>I&amp;rsquo;ve just bought my first &lt;em>brand new&lt;/em> computer since 2008. Thanks to
the &lt;a href="https://en.wikipedia.org/wiki/Black_Friday_(shopping)">Black Friday&lt;/a>
and &lt;a href="https://en.wikipedia.org/wiki/Cyber_Monday">Cyber Monday&lt;/a> sales on
&lt;a href="http://www.amazon.co.uk">Amazon.co.uk&lt;/a> and &lt;a href="http://www.scan.co.uk">Scan.co.uk&lt;/a>
this year I was able to put together a pretty sweet Intel NUC which is
now running &lt;a href="https://ubuntu-mate.org">Ubuntu MATE 15.10&lt;/a>.&lt;/p>
&lt;p>I spoke about this new system on &lt;a href="http://www.jupiterbroadcasting.com/91276/thunderclouds-around-thunderbird-lup-122/">LINUX Unplugged Episode 122&lt;/a> and have been contacted by people
wanting more details. Hopefully this blog post will answer any outstanding
questions. Press play below to hear to what I said on the podcast.&lt;/p>
&lt;!--
Add start when it becomes a feature
https://github.com/gohugoio/hugo/pull/10521
start="5996"
-->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/qBoxqO1zFgI" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;h2 id="the-nuc">The NUC&lt;/h2>
&lt;p>I purchased an Intel Next Unit of Computing (NUC) Kit
&lt;a href="http://www.intel.com/content/www/us/en/nuc/nuc-kit-nuc5i7ryh.html">NUC5I7RYH&lt;/a>.&lt;/p>
&lt;ul>
&lt;li>Barebones mini PC&lt;/li>
&lt;li>1 x &lt;a href="http://ark.intel.com/products/84993/Intel-Core-i7-5557U-Processor-4M-Cache-up-to-3_40-GHz">Core i7 5557U&lt;/a> / 3.1 GHz&lt;/li>
&lt;li>&lt;a href="http://www.intel.com/content/www/us/en/support/graphics-drivers/intel-iris-graphics-6100-for-5th-generation-intel-core-processors.html">Iris Graphics 6100&lt;/a>&lt;/li>
&lt;li>Gigabit Ethernet&lt;/li>
&lt;li>Bluetooth 4.0 LE&lt;/li>
&lt;li>802.11a/b/g/n/ac WiFi&lt;/li>
&lt;/ul>
&lt;p>Everything works out of the box with Ubuntu MATE 15.10 including sending
audio to the monitor over HDMI and DisplayPort.&lt;/p>
&lt;h2 id="the-ram">The RAM&lt;/h2>
&lt;p>The &lt;a href="http://ark.intel.com/products/84993/Intel-Core-i7-5557U-Processor-4M-Cache-up-to-3_40-GHz">Core i7 5557U&lt;/a>
specs state that DDR3L 1866 Mhz RAM is supported. The arstechnica
&lt;a href="http://arstechnica.com/gadgets/2015/03/mini-review-intels-powered-up-core-i7-broadwell-mini-pc/">Mini-review: Intel’s powered-up Core i7 Broadwell mini PC&lt;/a>
has some benchmarks that show a performance improvement when using 1866
Mhz clocked RAM, so I purchased:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.hyperxgaming.com/us/memory/impact">HyperX Impact SODIMM - 16GB Kit*(2x8GB) - DDR3L 1866MHz CL11 SODIMM&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="the-ssds">The SSDs&lt;/h2>
&lt;p>I have two SSDs in the NUC.&lt;/p>
&lt;ul>
&lt;li>Samsung MZVPV256HDGL-00000 - SM951 256GB M.2 PCI-e 3.0 x 4 &lt;a href="https://en.wikipedia.org/wiki/NVM_Express">NVMe&lt;/a> Solid State Drive&lt;/li>
&lt;li>&lt;a href="https://www.sandisk.co.uk/home/ssd/ultra-ii-ssd">SanDisk Ultra II SSD 960 GB Sata III 2.5-inch Internal SSD&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>This is where you might need to do some more research.&lt;/strong> At the
time of writing, it is not possible to boot directly from the Samsung
SM951 NVMe SSD. Although other quad channel NVMe SSDs do appear to be
supported as the boot device. It is possible that the &lt;a href="http://www.samsung.com/global/business/semiconductor/minisite/SSD/global/html/ssd950pro/overview.html">Samsung SSD 950 Pro&lt;/a>,
which is also NVMe, can be used as the boot device in Linux, but &lt;em>don&amp;rsquo;t
take my word for it&lt;/em>. Do your research.&lt;/p>
&lt;p>My work around was make the SanDisk Ultra II the boot device by putting
&lt;code>/boot&lt;/code> and the MBR on it. I have put &lt;code>/&lt;/code> and &lt;code>swap&lt;/code> (swap because I
want to experiment with suspend and hibernate) are on the Samsung SM951
and &lt;code>/home&lt;/code> is on the SanDisk Ultra II.&lt;/p>
&lt;p>There are faster SSDs than the SanDisk Ultra II but this was 50% off
during Black Friday and just too good a deal to pass by. I did
sacrifice a little performance on this component, so if absolute
performance is your goal look at alternative SSDs, the &lt;a href="http://www.samsung.com/global/business/semiconductor/minisite/SSD/global/html/ssd850evo/overview.html">Samsung 850 EVO&lt;/a>
seems to benchmark favourably.&lt;/p>
&lt;h2 id="the-monitor">The Monitor&lt;/h2>
&lt;p>A week after I purchased the NUC I noticed &lt;a href="http://www.ebuyer.com/">ebuyer.com&lt;/a>
were selling the monitor I wanted with a £100 discount. So I snapped one up.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.samsung.com/uk/business/business-products/business-monitor/professional/LS27D85KTSN/XU">Samsung S27D850T&lt;/a> 27&amp;quot; WQHD LED DVI HDMI Monitor&lt;/li>
&lt;/ul>
&lt;p>The NUC is connected via mini Display Port and my Dell Precision T7400
is connected via HDMI. The Samsung S27D850T has an audio out and a 2.1
speaker set is connected to it.&lt;/p>
&lt;h2 id="conclusion">Conclusion&lt;/h2>
&lt;p>I&amp;rsquo;m extremely happy with the &lt;a href="http://www.intel.com/content/www/us/en/nuc/nuc-kit-nuc5i7ryh.html">NUC5I7RYH&lt;/a>.
Linux compatibility is first class, it&amp;rsquo;s fast and has relatively low
power consumption. You can even charge a mobile phone using one of the
front USB ports (the yellow one) when the NUC is powered off. It is my
principle workstation and is able to handle everything I demand from it,
with ease:&lt;/p>
&lt;ul>
&lt;li>mp3 and ogg audio encoding&lt;/li>
&lt;li>h.264 video encoding (~1 min of video @480p encodes in 1 second)&lt;/li>
&lt;li>running multiple virtual machines&lt;/li>
&lt;li>compiling large applications&lt;/li>
&lt;li>creating xz compressed images of Ubuntu flavours for the Raspberry Pi 2&lt;/li>
&lt;/ul>
&lt;p>I&amp;rsquo;ve not tried gaming on it yet, but the holidays are approaching and
&lt;a href="http://www.gridgame.com/">GRID Autosport&lt;/a> was released for
&lt;a href="http://store.steampowered.com/steamos/">SteamOS&lt;/a> this week. So I know
what I&amp;rsquo;ll be doing in a couple of weeks time &lt;code>:-D&lt;/code>&lt;/p></description><summary>My Intel NUC5i7RYH part list and build</summary></item><item><title>Installing Nikola on Ubuntu</title><link>https://wimpysworld.com/posts/installing-nikola-on-ubuntu/</link><pubDate>Thu, 05 Nov 2015 11:00:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/installing-nikola-on-ubuntu/</guid><description>&lt;p>Nikola is a static site and blog generator written in &lt;a href="http://www.python.org">Python&lt;/a>
that I&amp;rsquo;ve been using for a good while now. This blog post describes how to install
&lt;a href="http://getnikola.com/">Nikola&lt;/a> on Ubuntu 14.04 or newer. Now, this may look
like a long winded way to install Nikola, given that .deb package exists, but in
my opinion it is the correct way to install Nikola on Ubuntu.&lt;/p>
&lt;h2 id="installing-python">Installing Python&lt;/h2>
&lt;p>First you&amp;rsquo;ll need Python.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get install cython3 libpython3.4 python3.4 python3.4-dev python3.4-minimal
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Now install the Python &amp;ldquo;package&amp;rdquo; management utilities.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get install python-setuptools python-virtualenv python-pip virtualenvwrapper
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="the-snakepit">The Snakepit&lt;/h2>
&lt;p>Create a &amp;ldquo;Snakepit&amp;rdquo; directory for storing all the virtualenvs.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>mkdir ~/Snakepit
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="create-a-virtualenv-for-nikola">Create a virtualenv for Nikola&lt;/h2>
&lt;p>The following will create a new virtualenv called &lt;code>nikola&lt;/code> based on Python 3.4.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>virtualenv -p /usr/bin/python3.4 ~/Snakepit/nikola-773
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="working-on-a-virtualenv">Working on a virtualenv&lt;/h3>
&lt;p>To activate the virtualenv do the following.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>source ~/Snakepit/nikola-773/bin/activate
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Your shell prompt will change while a virtualenv is being worked on to indicate
which virtualenv is currently active.&lt;/p>
&lt;p>While working on a virtualenv you can &lt;code>pip&lt;/code> install what you need or manually
install any Python libraries safe in the knowledge you will not adversely
damage any other virtualenvs or the global packages in the process. Very useful
for developing a new branch which may have different library requirements than
the master/head.&lt;/p>
&lt;p>When you are finished working in a virtualenv you can deactivate it by simply
executing &lt;code>deactivate&lt;/code>.&lt;/p>
&lt;h2 id="install-nikola-requirements">Install Nikola requirements&lt;/h2>
&lt;p>Nikola requires some additional packages.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get install liblcms2-dev libfreetype6-dev libjpeg8-dev &lt;span style="color:#87ceeb">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">&lt;/span>libopenjp2-7-dev libtiff5-dev libwebp-dev libxslt1-dev libxml2-dev &lt;span style="color:#87ceeb">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">&lt;/span>libyaml-dev libzmq-dev zlib1g-dev
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Some of the content optimisation filters require additional packages.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get install closure-compiler jpegoptim optipng yui-compressor
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Install Tidy 5. (optional)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get -y remove libtidy-0.99-0 tidy
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>wget http://binaries.html-tidy.org/binaries/tidy-5.1.14/tidy-5.1.14-64bit.deb -O /tmp/tidy5.deb
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo dpkg -i /tmp/tidy5.deb
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo ln -s /usr/bin/tidy /usr/local/bin/tidy5
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rm /tmp/tidy5.deb
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="what-are-these-requirements-for">What are these requirements for?&lt;/h3>
&lt;p>The following are required to build &lt;code>pillow&lt;/code>, the Python imaging library.&lt;/p>
&lt;ul>
&lt;li>&lt;code>liblcms2-dev&lt;/code>&lt;/li>
&lt;li>&lt;code>libfreetype6-dev&lt;/code>&lt;/li>
&lt;li>&lt;code>libjpeg8-dev&lt;/code>&lt;/li>
&lt;li>&lt;code>libopenjp2-7-dev&lt;/code>&lt;/li>
&lt;li>&lt;code>libtiff5-dev&lt;/code>&lt;/li>
&lt;li>&lt;code>libwebp-dev&lt;/code>&lt;/li>
&lt;li>&lt;code>zlib1g-dev&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>The following are required to build &lt;code>lxml&lt;/code>, a Python XML library.&lt;/p>
&lt;ul>
&lt;li>&lt;code>libxml2-dev&lt;/code>&lt;/li>
&lt;li>&lt;code>libxslt1-dev&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>The following are required to build &lt;code>python-coveralls&lt;/code>.&lt;/p>
&lt;ul>
&lt;li>&lt;code>libyaml-dev&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>The following are required to build &lt;code>pyzmq&lt;/code>.&lt;/p>
&lt;ul>
&lt;li>&lt;code>libzmq-dev&lt;/code>&lt;/li>
&lt;/ul>
&lt;h2 id="install-nikola">Install Nikola&lt;/h2>
&lt;p>First install Cython, which will ensure some of the packages required by Nikola use
all the available optimisations.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>pip install --upgrade Cython
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Install all of Nikola.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>pip install --upgrade &lt;span style="color:#87ceeb">&amp;#34;Nikola[extras,tests]&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="create-a-site">Create a site&lt;/h2>
&lt;p>After installing Nikola, you should create a site. A site is a collection of
all assets needed to render your website, including configuration, posts,
pages, images, and all other files and customizations.&lt;/p>
&lt;p>To create a site, you need to run:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>nikola init &amp;lt;directory_name&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>A wizard will guide your initial setup The &lt;code>--demo&lt;/code> option can be used to populate
your site with some example content. If you do not want the wizard, use the &lt;code>--quiet&lt;/code>
argument.&lt;/p>
&lt;p>Nikola is now installed and and initial site is setup. &lt;code>nikola help&lt;/code> and the
&lt;a href="http://getnikola.com/handbook.html">Nikola Handbook&lt;/a> will assist you from here.&lt;/p></description><summary>How to install Nikola on Ubuntu 14.04 or newer</summary></item><item><title>Ubuntu Podcast</title><link>https://wimpysworld.com/projects/ubuntu-podcast/</link><pubDate>Sun, 01 Feb 2015 00:00:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/projects/ubuntu-podcast/</guid><description>&lt;p>&lt;a href="https://ubuntupodcast.org">Ubuntu Podcast&lt;/a> was a weekly podcast that discussd
news from the Ubuntu and Open Source community. The podcast ran from 2008 to
2021 and I joined the line up of presenters in 2015. In addition to the weekly
podcasts we also participated in live shows at &lt;a href="https://oggcamp.org/">OggCamp&lt;/a>
and &lt;a href="https://fosstalk.com/">FOSS Talk Live&lt;/a>.&lt;/p>
&lt;ul>
&lt;li>Organisation: &lt;a href="https://ubuntupodcast.org">Ubuntu Podcast&lt;/a>&lt;/li>
&lt;li>Date: February 2015 - September 2021&lt;/li>
&lt;li>Role: Co-presenter &amp;amp; Producer&lt;/li>
&lt;/ul></description><summary>A weekly family-friendly audio magazine for the Ubuntu community</summary></item><item><title>Debian</title><link>https://wimpysworld.com/projects/debian/</link><pubDate>Wed, 01 Oct 2014 00:00:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/projects/debian/</guid><description>&lt;p>Debian is a Unix-like computer operating system and a Linux distribution that is
composed entirely of free and open-source software, most of which is under the
GNU General Public License, and packaged by a group of individuals known as the
Debian Project.&lt;/p>
&lt;ul>
&lt;li>Organisation: &lt;a href="https://debian.org">Debian Project&lt;/a>&lt;/li>
&lt;li>Date: October 2014 - date&lt;/li>
&lt;li>Role: Package maintainer&lt;/li>
&lt;/ul></description><summary>Package maintainer for (mostly) MATE Desktop in Debian and Ubuntu</summary></item><item><title>Installing Willie IRC Bot on Debian</title><link>https://wimpysworld.com/posts/installing-willie-irc-bot-on-debian/</link><pubDate>Sat, 09 Aug 2014 11:11:11 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/installing-willie-irc-bot-on-debian/</guid><description>&lt;p>&lt;a href="http://willie.dftba.net/">Willie&lt;/a> is an IRC bot written in &lt;a href="http://www.python.org">Python&lt;/a>
that I&amp;rsquo;ve recently started using. This blog post describes how to install Willie
on Debian and as usual I will be using &lt;code>virtualenv&lt;/code> to isolate this Python
application from the rest of the system.&lt;/p>
&lt;h2 id="installing-python">Installing Python&lt;/h2>
&lt;p>First you&amp;rsquo;ll need Python.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get install libpython2.7 python2.7 python2.7-dev python2.7-minimal
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The following will also be required to enable all the features Willie supports.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get install enchant python2.7-dev libxslt1-dev libxml2-dev
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Remove any &lt;code>apt&lt;/code> installed Python packages that we are about to replace.
The versions of these packages in the Debian repositories soon get stale.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get purge python-setuptools python-virtualenv python-pip python-profiler
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Install &lt;code>pip&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>wget https://bootstrap.pypa.io/get-pip.py
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo python2.7 get-pip.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Use &lt;code>pip&lt;/code> to install &lt;code>virtualenv&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo pip install virtualenv --upgrade
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="the-snakepit">The Snakepit&lt;/h2>
&lt;p>Create a &amp;ldquo;Snakepit&amp;rdquo; directory for storing all the Python virtual
environments.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>mkdir ~/Snakepit
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="create-a-virtualenv-for-willie">Create a virtualenv for Willie&lt;/h2>
&lt;p>The following will create a new virtualenv called &lt;code>willie&lt;/code> using Python
2.7 as the interpreter.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>virtualenv -p /usr/bin/python2.7 ~/Snakepit/willie
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="working-on-a-virtualenv">Working on a virtualenv&lt;/h3>
&lt;p>Activate the virtualenv for Willie.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>source ~/Snakepit/willie/bin/activate
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Your shell prompt will change, something like &lt;code>(willie)user@host:~$&lt;/code>,
while a virtualenv is being worked on to indicate which virtualenv is
currently active.&lt;/p>
&lt;p>While working on a virtualenv you can &lt;code>pip&lt;/code> install what you need or
manually install any Python libraries safe in the knowledge you will
not upset any other virtualenvs or the global packages in the process.
Very useful for developing a new branch which may have different
library requirements than the current stable release.&lt;/p>
&lt;p>When you are finished working in a virtualenv you can deactivate it by
simply executing &lt;code>deactivate&lt;/code>.&lt;/p>
&lt;h2 id="install-willie">Install Willie&lt;/h2>
&lt;p>I&amp;rsquo;ve decided to use Python 2.7 to run Willie and therefore have to
install &lt;code>backports.ssl_match_hostname&lt;/code> which is not required if you use
Python 3.3.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>pip install willie backports.ssl_match_hostname
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="additional-functionality">Additional functionality&lt;/h3>
&lt;p>Willie has no external dependencies, besides Python. However, some of
the modules do have external dependencies. So install the following
Python modules so that I can make use of everything Willie can do.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>pip install feedparser pytz lxml praw pyenchant pygeoip ipython --upgrade
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="configure-willie">Configure Willie&lt;/h2>
&lt;p>I am not going to explain to how to configure Willie because all that
good stuff is very well documented by the project.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/embolalia/willie/wiki">https://github.com/embolalia/willie/wiki&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>But for reference, my &lt;code>default.cfg&lt;/code> looks something like this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ini" data-lang="ini">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">[core]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nick = &lt;span style="color:#87ceeb">nicofyourbot&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>user = &lt;span style="color:#87ceeb">nicofyourbot&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>name = &lt;span style="color:#87ceeb">Give You Bot A Name&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>host = &lt;span style="color:#87ceeb">chat.freenode.net&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>use_ssl = &lt;span style="color:#87ceeb">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>verify_ssl = &lt;span style="color:#87ceeb">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>port = &lt;span style="color:#87ceeb">6697&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>owner = &lt;span style="color:#87ceeb">nicofthebotowner&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>channels = &lt;span style="color:#87ceeb">#example&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nickserv_password = &lt;span style="color:#87ceeb">************&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>prefix = &lt;span style="color:#87ceeb">\.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>timeout = &lt;span style="color:#87ceeb">120&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">[db]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>userdb_type = &lt;span style="color:#87ceeb">sqlite&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>userdb_file = &lt;span style="color:#87ceeb">/home/username/.willie/willie.db&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="willie-as-a-daemon">Willie as a daemon&lt;/h2>
&lt;p>From this point on I assume you&amp;rsquo;ve completed the first run
configuration of Willie and have &lt;code>.willie/default.cfg&lt;/code> in your home
directory.&lt;/p>
&lt;p>Add the following to &lt;code>/etc/init.d/willie&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e5e5e5">#!/bin/sh
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e5e5e5">&lt;/span>&lt;span style="color:#0f0">### BEGIN INIT INFO&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Provides: willie&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Required-Start: $local_fs $remote_fs&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Required-Stop: $local_fs $remote_fs&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Should-Start: $network&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Should-Stop: $network&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Default-Start: 2 3 4 5&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Default-Stop: 0 1 6&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Short-Description: Willie IRC Bot.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Description: Start and stops the Willie IRC bot for a given user.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0">### END INIT INFO&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># NOTE! Replace with the user you want to run Willie.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">willie_USER&lt;/span>=&lt;span style="color:#87ceeb">&amp;#34;yourusername&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">HOMEDIR&lt;/span>=&lt;span style="color:#f00">$(&lt;/span>getent passwd &lt;span style="color:#eedd82">$willie_USER&lt;/span> | awk -F: &lt;span style="color:#87ceeb">&amp;#39;{print $6}&amp;#39;&lt;/span>&lt;span style="color:#f00">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">DAEMON&lt;/span>=&lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$HOMEDIR&lt;/span>&lt;span style="color:#87ceeb">/Snakepit/willie/bin/willie&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">CONFIG&lt;/span>=&lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$HOMEDIR&lt;/span>&lt;span style="color:#87ceeb">/.willie/default.cfg&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>startd() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">if&lt;/span> [ -f &lt;span style="color:#87ceeb">${&lt;/span>&lt;span style="color:#eedd82">CONFIG&lt;/span>&lt;span style="color:#87ceeb">}&lt;/span> ]; &lt;span style="color:#f00">then&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> echo &lt;span style="color:#87ceeb">&amp;#34;Starting Willie for &lt;/span>&lt;span style="color:#eedd82">$willie_USER&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> start-stop-daemon -c &lt;span style="color:#eedd82">$willie_USER&lt;/span> -u &lt;span style="color:#eedd82">$willie_USER&lt;/span> -x &lt;span style="color:#eedd82">$DAEMON&lt;/span> -S -- --config &lt;span style="color:#87ceeb">${&lt;/span>&lt;span style="color:#eedd82">CONFIG&lt;/span>&lt;span style="color:#87ceeb">}&lt;/span> --fork --quiet
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">else&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> echo &lt;span style="color:#87ceeb">&amp;#34;Couldn&amp;#39;t start Willie for &lt;/span>&lt;span style="color:#eedd82">$willie_USER&lt;/span>&lt;span style="color:#87ceeb"> (no &lt;/span>&lt;span style="color:#eedd82">$CONFIG&lt;/span>&lt;span style="color:#87ceeb"> found)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>stopd() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> echo &lt;span style="color:#87ceeb">&amp;#34;Stopping Willie for &lt;/span>&lt;span style="color:#eedd82">$willie_USER&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eedd82">willie_PID&lt;/span>=&lt;span style="color:#f00">$(&lt;/span>pgrep -fu &lt;span style="color:#eedd82">$willie_USER&lt;/span> &lt;span style="color:#eedd82">$DAEMON&lt;/span>&lt;span style="color:#f00">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">if&lt;/span> [ -z &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$willie_PID&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span> ]; &lt;span style="color:#f00">then&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> echo &lt;span style="color:#87ceeb">&amp;#34;Willie for USER &lt;/span>&lt;span style="color:#eedd82">$willie_USER&lt;/span>&lt;span style="color:#87ceeb">: not running.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">else&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> kill -15 &lt;span style="color:#eedd82">$willie_PID&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>status() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eedd82">willie_PID&lt;/span>=&lt;span style="color:#f00">$(&lt;/span>pgrep -fu &lt;span style="color:#eedd82">$willie_USER&lt;/span> &lt;span style="color:#eedd82">$DAEMON&lt;/span>&lt;span style="color:#f00">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">if&lt;/span> [ -z &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$willie_PID&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span> ]; &lt;span style="color:#f00">then&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> echo &lt;span style="color:#87ceeb">&amp;#34;Willie for USER &lt;/span>&lt;span style="color:#eedd82">$willie_USER&lt;/span>&lt;span style="color:#87ceeb">: not running.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">else&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> echo &lt;span style="color:#87ceeb">&amp;#34;Willie for USER &lt;/span>&lt;span style="color:#eedd82">$willie_USER&lt;/span>&lt;span style="color:#87ceeb">: running (pid &lt;/span>&lt;span style="color:#eedd82">$willie_PID&lt;/span>&lt;span style="color:#87ceeb">)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">case&lt;/span> &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$1&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span> in
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> start) startd ;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> stop) stopd ;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> restart|reload|force-reload) stopd &amp;amp;&amp;amp; startd ;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> status) status ;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> *) echo &lt;span style="color:#87ceeb">&amp;#34;Usage: /etc/init.d/willie {start|stop|reload|force-reload|restart|status}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> exit &lt;span style="color:#f60">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">esac&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>exit &lt;span style="color:#f60">0&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Set the permissions.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo chmod +x /etc/init.d/willie
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Check that you can start/stop Willie.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo /etc/init.d/willie start
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo /etc/init.d/willie status
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo /etc/init.d/willie stop
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Add &lt;code>willie&lt;/code> to the startup/shutdown sequence.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo update-rc.d willie defaults
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>And that&amp;rsquo;s it. Willie is now running as a daemon inside a virtualenv.&lt;/p></description><summary>How I Installed Willie IRC Bot on Debian Wheezy</summary></item><item><title>ZNC IRC proxy</title><link>https://wimpysworld.com/posts/znc-irc-proxy/</link><pubDate>Sat, 02 Aug 2014 10:10:10 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/znc-irc-proxy/</guid><description>&lt;p>I have been using the &lt;a href="https://wimpysworld.com/posts/bip-irc-proxy/">BIP&lt;/a> IRC proxy that maintains a
persistent connection to a list of IRC channels. However, I&amp;rsquo;ve heard good things
about &lt;a href="http://znc.in">ZNC&lt;/a> and decided to give it a try.&lt;/p>
&lt;p>The purpose of an IRC proxy, or bouncer, is that you can then point your IRC
clients to them to maintain a transparent connection from multiple clients
and playback the conversations that took place while you were away.&lt;/p>
&lt;h2 id="installing-znc">Installing ZNC&lt;/h2>
&lt;p>The ZNC package for Debian Wheezy are very old, so I decide to install
from source.&lt;/p>
&lt;h3 id="install-required-packages">Install required packages&lt;/h3>
&lt;p>We first need to make sure we have all the packages required to build ZNC.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get install build-essential libssl-dev libperl-dev pkg-config
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="compile-znc">Compile ZNC&lt;/h3>
&lt;p>Now download and compile ZNC.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>wget http://znc.in/releases/znc-1.4.tar.gz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>tar zxvf znc-1.4.tar.gz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cd znc-1.4
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>./configure --with-openssl
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>make
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo make install
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="create-a-user">Create a user&lt;/h3>
&lt;p>Create a separate ZNC user so that ZNC does not need to run as root:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo groupadd znc
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo adduser --system --home /var/lib/znc --group znc
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="configuring-znc">Configuring ZNC&lt;/h3>
&lt;p>You can use the interactive wizard to configure ZNC which really
help create the initial configuration.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo -u znc /usr/local/bin/znc --datadir=/var/lib/znc --makeconf
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Here is a transcript of how I answered the initial configuration questions.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>[ .. ] Checking for list of available modules...
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ &amp;gt;&amp;gt; ] ok
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ] Building new config
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ] First let&amp;#39;s start with some global settings...
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ?? ] What port would you like ZNC to listen on? (1025 to 65535): 7778
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ?? ] Would you like ZNC to listen using SSL? (yes/no) [no]: yes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ?? ] Would you like ZNC to listen using both IPv4 and IPv6? (yes/no) [yes]:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ .. ] Verifying the listener...
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ &amp;gt;&amp;gt; ] ok
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ] Unable to locate pem file: [/var/lib/znc/znc.pem], creating it
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ .. ] Writing Pem file [/var/lib/znc/znc.pem]...
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ &amp;gt;&amp;gt; ] ok
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ] -- Global Modules --
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ] +-----------+----------------------------------------------------------+
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ] | Name | Description |
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ] +-----------+----------------------------------------------------------+
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ] | partyline | Internal channels and queries for users connected to znc |
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ] | webadmin | Web based administration module |
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ] +-----------+----------------------------------------------------------+
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ] And 10 other (uncommon) modules. You can enable those later.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ?? ] Load global module &amp;lt;partyline&amp;gt;? (yes/no) [no]: yes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ?? ] Load global module &amp;lt;webadmin&amp;gt;? (yes/no) [no]: yes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ] Now we need to set up a user...
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ?? ] Username (AlphaNumeric): yournick
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ?? ] Enter Password:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ?? ] Confirm Password:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ?? ] Would you like this user to be an admin? (yes/no) [yes]:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ?? ] Nick [yournick]:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ?? ] Alt Nick [yournick_]:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ?? ] Ident [yournick]:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ?? ] Real Name [Got ZNC?]: Your Name
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ?? ] Bind Host (optional):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ?? ] Number of lines to buffer per channel [50]: 1024
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ?? ] Would you like to clear channel buffers after replay? (yes/no) [yes]:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ?? ] Default channel modes [+stn]:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ] -- User Modules --
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ] +--------------+------------------------------------------------------------------------------------------+
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ] | Name | Description |
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ] +--------------+------------------------------------------------------------------------------------------+
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ] | chansaver | Keep config up-to-date when user joins/parts |
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ] | controlpanel | Dynamic configuration through IRC. Allows editing only yourself if you&amp;#39;re not ZNC admin. |
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ] | perform | Keeps a list of commands to be executed when ZNC connects to IRC. |
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ] | webadmin | Web based administration module |
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ] +--------------+------------------------------------------------------------------------------------------+
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ] And 21 other (uncommon) modules. You can enable those later.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ?? ] Load module &amp;lt;chansaver&amp;gt;? (yes/no) [no]: yes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ?? ] Load module &amp;lt;controlpanel&amp;gt;? (yes/no) [no]: tes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ?? ] Load module &amp;lt;controlpanel&amp;gt;? (yes/no) [no]: yes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ?? ] Load module &amp;lt;perform&amp;gt;? (yes/no) [no]: yes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ?? ] Load module &amp;lt;webadmin&amp;gt;? (yes/no) [no]: yes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ?? ] Would you like to set up a network? (yes/no) [no]:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ?? ] Would you like to set up another user? (yes/no) [no]:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ .. ] Writing config [/var/lib/znc/configs/znc.conf]...
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ &amp;gt;&amp;gt; ] ok
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ]To connect to this ZNC you need to connect to it as your IRC server
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ]using the port that you supplied. You have to supply your login info
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ]as the IRC server password like this: user/network:pass.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ]Try something like this in your IRC client...
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ]/server &amp;lt;znc_server_ip&amp;gt; +7778 flexiondotorg:&amp;lt;pass&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ]And this in your browser...
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ]https://&amp;lt;znc_server_ip&amp;gt;:7778/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ** ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ?? ] Launch ZNC now? (yes/no) [yes]: no
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="running-znv-as-a-daemon">Running ZNV as a daemon&lt;/h3>
&lt;p>Here is a &lt;code>/etc/init.d/znc&lt;/code> for Debian based on this installation method:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e5e5e5">#! /bin/sh
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e5e5e5">&lt;/span>&lt;span style="color:#0f0">### BEGIN INIT INFO&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Provides: znc&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Required-Start: $remote_fs $syslog&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Required-Stop: $remote_fs $syslog&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Default-Start: 2 3 4 5&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Default-Stop: 0 1 6&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Short-Description: ZNC IRC bouncer&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Description: ZNC is an IRC bouncer&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0">### END INIT INFO&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">PATH&lt;/span>=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">DESC&lt;/span>=&lt;span style="color:#87ceeb">&amp;#34;ZNC daemon&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">NAME&lt;/span>=znc
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">DAEMON&lt;/span>=/usr/local/bin/&lt;span style="color:#eedd82">$NAME&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">DATADIR&lt;/span>=/var/lib/znc
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">DAEMON_ARGS&lt;/span>=&lt;span style="color:#87ceeb">&amp;#34;--datadir=&lt;/span>&lt;span style="color:#eedd82">$DATADIR&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">PIDDIR&lt;/span>=&lt;span style="color:#eedd82">$DATADIR&lt;/span>/run
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">PIDFILE&lt;/span>=&lt;span style="color:#eedd82">$PIDDIR&lt;/span>/&lt;span style="color:#eedd82">$NAME&lt;/span>.pid
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">SCRIPTNAME&lt;/span>=/etc/init.d/&lt;span style="color:#eedd82">$NAME&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">USER&lt;/span>=znc
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">GROUP&lt;/span>=znc
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Exit if the package is not installed&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ -x &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$DAEMON&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span> ] || exit &lt;span style="color:#f60">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Read configuration variable file if it is present&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ -r /etc/default/&lt;span style="color:#eedd82">$NAME&lt;/span> ] &amp;amp;&amp;amp; . /etc/default/&lt;span style="color:#eedd82">$NAME&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Load the VERBOSE setting and other rcS variables&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>. /lib/init/vars.sh
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Define LSB log_* functions.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Depend on lsb-base (&amp;gt;= 3.2-14) to ensure that this file is present&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># and status_of_proc is working.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>. /lib/lsb/init-functions
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0">#&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Function that starts the daemon/service&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0">#&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>do_start()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0f0"># Return&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0f0"># 0 if daemon has been started&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0f0"># 1 if daemon was already running&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0f0"># 2 if daemon could not be started&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">if&lt;/span> [ ! -d &lt;span style="color:#eedd82">$PIDDIR&lt;/span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">then&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> mkdir &lt;span style="color:#eedd82">$PIDDIR&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> chown &lt;span style="color:#eedd82">$USER&lt;/span>:&lt;span style="color:#eedd82">$GROUP&lt;/span> &lt;span style="color:#eedd82">$PIDDIR&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> start-stop-daemon --start --quiet --pidfile &lt;span style="color:#eedd82">$PIDFILE&lt;/span> --exec &lt;span style="color:#eedd82">$DAEMON&lt;/span> --test --chuid &lt;span style="color:#eedd82">$USER&lt;/span> &amp;gt; /dev/null || &lt;span style="color:#f00">return&lt;/span> &lt;span style="color:#f60">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> start-stop-daemon --start --quiet --pidfile &lt;span style="color:#eedd82">$PIDFILE&lt;/span> --exec &lt;span style="color:#eedd82">$DAEMON&lt;/span> --chuid &lt;span style="color:#eedd82">$USER&lt;/span> -- &lt;span style="color:#eedd82">$DAEMON_ARGS&lt;/span> &amp;gt; /dev/null || &lt;span style="color:#f00">return&lt;/span> &lt;span style="color:#f60">2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0">#&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Function that stops the daemon/service&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0">#&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>do_stop()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0f0"># Return&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0f0"># 0 if daemon has been stopped&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0f0"># 1 if daemon was already stopped&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0f0"># 2 if daemon could not be stopped&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0f0"># other if a failure occurred&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile &lt;span style="color:#eedd82">$PIDFILE&lt;/span> --name &lt;span style="color:#eedd82">$NAME&lt;/span> --chuid &lt;span style="color:#eedd82">$USER&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eedd82">RETVAL&lt;/span>=&lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$?&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [ &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$RETVAL&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span> = &lt;span style="color:#f60">2&lt;/span> ] &amp;amp;&amp;amp; &lt;span style="color:#f00">return&lt;/span> &lt;span style="color:#f60">2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0f0"># Wait for children to finish too if this is a daemon that forks&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0f0"># and if the daemon is only ever run from this initscript.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0f0"># If the above conditions are not satisfied then add some other code&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0f0"># that waits for the process to drop all resources that could be&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0f0"># needed by services started subsequently. A last resort is to&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0f0"># sleep for some time.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec &lt;span style="color:#eedd82">$DAEMON&lt;/span> --chuid &lt;span style="color:#eedd82">$USER&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [ &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$?&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span> = &lt;span style="color:#f60">2&lt;/span> ] &amp;amp;&amp;amp; &lt;span style="color:#f00">return&lt;/span> &lt;span style="color:#f60">2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0f0"># Many daemons don&amp;#39;t delete their pidfiles when they exit.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> rm -f &lt;span style="color:#eedd82">$PIDFILE&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">return&lt;/span> &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$RETVAL&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0">#&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Function that sends a SIGHUP to the daemon/service&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0">#&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>do_reload() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> start-stop-daemon --stop --signal &lt;span style="color:#f60">1&lt;/span> --quiet --pidfile &lt;span style="color:#eedd82">$PIDFILE&lt;/span> --name &lt;span style="color:#eedd82">$NAME&lt;/span> --chuid &lt;span style="color:#eedd82">$USER&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">return&lt;/span> &lt;span style="color:#f60">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">case&lt;/span> &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$1&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span> in
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> start)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [ &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$VERBOSE&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span> != no ] &amp;amp;&amp;amp; log_daemon_msg &lt;span style="color:#87ceeb">&amp;#34;Starting &lt;/span>&lt;span style="color:#eedd82">$DESC&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span> &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$NAME&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> do_start
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">case&lt;/span> &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$?&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span> in
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 0|1) [ &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$VERBOSE&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span> != no ] &amp;amp;&amp;amp; log_end_msg &lt;span style="color:#f60">0&lt;/span> ;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 2) [ &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$VERBOSE&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span> != no ] &amp;amp;&amp;amp; log_end_msg &lt;span style="color:#f60">1&lt;/span> ;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">esac&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> stop)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [ &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$VERBOSE&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span> != no ] &amp;amp;&amp;amp; log_daemon_msg &lt;span style="color:#87ceeb">&amp;#34;Stopping &lt;/span>&lt;span style="color:#eedd82">$DESC&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span> &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$NAME&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> do_stop
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">case&lt;/span> &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$?&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span> in
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 0|1) [ &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$VERBOSE&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span> != no ] &amp;amp;&amp;amp; log_end_msg &lt;span style="color:#f60">0&lt;/span> ;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 2) [ &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$VERBOSE&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span> != no ] &amp;amp;&amp;amp; log_end_msg &lt;span style="color:#f60">1&lt;/span> ;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">esac&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> status)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> status_of_proc -p &lt;span style="color:#eedd82">$PIDFILE&lt;/span> &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$DAEMON&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span> &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$NAME&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span> &amp;amp;&amp;amp; exit &lt;span style="color:#f60">0&lt;/span> || exit &lt;span style="color:#eedd82">$?&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> reload)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> log_daemon_msg &lt;span style="color:#87ceeb">&amp;#34;Reloading &lt;/span>&lt;span style="color:#eedd82">$DESC&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span> &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$NAME&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> do_reload
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> log_end_msg &lt;span style="color:#eedd82">$?&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> restart)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> log_daemon_msg &lt;span style="color:#87ceeb">&amp;#34;Restarting &lt;/span>&lt;span style="color:#eedd82">$DESC&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span> &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$NAME&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> do_stop
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">case&lt;/span> &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$?&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span> in
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 0|1)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> do_start
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">case&lt;/span> &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$?&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span> in
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 0) log_end_msg &lt;span style="color:#f60">0&lt;/span> ;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1) log_end_msg &lt;span style="color:#f60">1&lt;/span> ;; &lt;span style="color:#0f0"># Old process is still running&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> *) log_end_msg &lt;span style="color:#f60">1&lt;/span> ;; &lt;span style="color:#0f0"># Failed to start&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">esac&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> *)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0f0"># Failed to stop&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> log_end_msg &lt;span style="color:#f60">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">esac&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> *)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> echo &lt;span style="color:#87ceeb">&amp;#34;Usage: &lt;/span>&lt;span style="color:#eedd82">$SCRIPTNAME&lt;/span>&lt;span style="color:#87ceeb"> {status|start|stop|reload|restart}&amp;#34;&lt;/span> &amp;gt;&amp;amp;&lt;span style="color:#f60">2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> exit &lt;span style="color:#f60">3&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">esac&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>After you&amp;rsquo;ve created the script, you must give it the proper permissions to run
and add the script to the startup/shutdown sequence.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo chmod &lt;span style="color:#f60">755&lt;/span> /etc/init.d/znc
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo update-rc.d znc defaults
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Start the service:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo service znc start
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Stop the service:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo service znc stop
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="web-configuration">Web configuration&lt;/h3>
&lt;p>I love that ZNC comes bundled with a web based configuration tool. Just
login to &lt;a href="https://znc.example.org:7778">https://znc.example.org:7778&lt;/a> to add users, add networks to
users and to add channels to networks. Really simple stuff.&lt;/p>
&lt;h3 id="irc-client-configuration">IRC client configuration&lt;/h3>
&lt;p>I use &lt;a href="http://hexchat.github.io/">HexChat&lt;/a>, but other IRC clients are available.
Just add a new Network to HexChat for your ZNC server, use the username,
suffixed with the network name you configured in ZNC, and your ZNC password.&lt;/p>
&lt;h2 id="conclusion">Conclusion&lt;/h2>
&lt;p>I much prefer ZNC to BIP.&lt;/p>
&lt;ul>
&lt;li>I really like the web and IRC configuration but I still have the option to
configure the config files directly.&lt;/li>
&lt;li>ZNC is far less cryptic with regard to setting up IRC client connections and
user management is much better implemented.&lt;/li>
&lt;li>When I add a new channel to an existing network in ZNC it automatically appears
in my connected clients without the need to restart anything.&lt;/li>
&lt;li>ZNC&amp;rsquo;s IRC backlogs don&amp;rsquo;t have the confusing double time stamps present in BIP
and ZNC is much faster re-establishing connections to my multiple IRC network and
channels.&lt;/li>
&lt;li>Most importantly, ZNC has been far more stable than BIP.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>References&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://wiki.znc.in/Installation">http://wiki.znc.in/Installation&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://wiki.znc.in/Running_ZNC_as_a_system_daemon">http://wiki.znc.in/Running_ZNC_as_a_system_daemon&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.digitalocean.com/community/tutorials/how-to-install-znc-an-irc-bouncer-on-an-ubuntu-vps">https://www.digitalocean.com/community/tutorials/how-to-install-znc-an-irc-bouncer-on-an-ubuntu-vps&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://raymii.org/s/tutorials/Install_the_Lastest_ZNC_from_Source_in_Ubuntu.html">https://raymii.org/s/tutorials/Install_the_Lastest_ZNC_from_Source_in_Ubuntu.html&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://shellfish.io/tutorial/1/how-to-install-znc-on-debian-7/">https://shellfish.io/tutorial/1/how-to-install-znc-on-debian-7/&lt;/a>&lt;/li>
&lt;/ul></description><summary>How I install the ZNC IRC bouncer on Debian Wheezy</summary></item><item><title>Monitorix on Debian</title><link>https://wimpysworld.com/posts/monitorix-on-debian/</link><pubDate>Sat, 19 Jul 2014 12:00:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/monitorix-on-debian/</guid><description>&lt;p>I have a few Debian servers that run at home and on VPSs. I wanted to add some
basic systems monitoring to them, but didn&amp;rsquo;t want anything too complicated to
look after. I found &lt;a href="http://www.monitorix.org/">Monitorix&lt;/a>.&lt;/p>
&lt;blockquote>
&lt;p>Monitorix is a free, open source, lightweight system monitoring tool
designed to monitor as many services and system resources as possible.
It has been created to be used under production Linux/UNIX servers,
but due to its simplicity and small size can be used on embedded devices
as well.&lt;/p>
&lt;/blockquote>
&lt;h1 id="install-monitorix">Install Monitorix&lt;/h1>
&lt;p>This install has been tested on Debian Squeeze and Wheezy. First install
the dependencies.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get install rrdtool perl libwww-perl libmailtools-perl &lt;span style="color:#87ceeb">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">&lt;/span>libmime-lite-perl librrds-perl libdbi-perl libxml-simple-perl &lt;span style="color:#87ceeb">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">&lt;/span>libhttp-server-simple-perl libconfig-general-perl libio-socket-ssl-perl
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Now Monitorix itself.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>wget -c &lt;span style="color:#87ceeb">&amp;#34;http://apt.izzysoft.de/ubuntu/dists/generic/index.php?file=monitorix_3.5.1-izzy1_all.deb&amp;#34;&lt;/span> -O monitorix_3.5.1-izzy1_all.deb
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo dpkg -i monitorix_3.5.1-izzy1_all.deb
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>At this point Monitorix is installed and running. Point your browser to
&lt;code>http://example.org:8080/monitorix/&lt;/code> and enjoy!&lt;/p>
&lt;h1 id="configuring-monitorix">Configuring Monitorix&lt;/h1>
&lt;p>Everything in &lt;code>/etc/monitorix/monitorix.conf&lt;/code> is comprehensively documented,
just get tweaking.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.monitorix.org/documentation.html">http://www.monitorix.org/documentation.html&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Each time you update the configuration Monitorix will require a restart.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo service monitorix restart
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="nginx-status">nginx status&lt;/h2>
&lt;p>If you run &lt;a href="http://wiki.nginx.org/Main">nginx&lt;/a> then you&amp;rsquo;ll want to drop the
following into &lt;code>/etc/nginx/conf.d/status.conf&lt;/code> so that Monitorix can monitor
nginx.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-nginx" data-lang="nginx">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">server&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">listen&lt;/span> localhost:&lt;span style="color:#f60">80&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">location&lt;/span> &lt;span style="color:#87ceeb">/nginx_status&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">stub_status&lt;/span> &lt;span style="color:#7fffd4">on&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">access_log&lt;/span> &lt;span style="color:#7fffd4">off&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">allow&lt;/span> &lt;span style="color:#f60">127&lt;/span>&lt;span style="color:#87ceeb">.0.0.1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">deny&lt;/span> &lt;span style="color:#87ceeb">all&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="references">References&lt;/h4>
&lt;ul>
&lt;li>&lt;a href="http://www.monitorix.org/doc-debian.html">http://www.monitorix.org/doc-debian.html&lt;/a>&lt;/li>
&lt;/ul></description><summary>Setting up Monitorix on Debian Squeeze &amp;amp; Wheezy</summary></item><item><title>subSonic on Debian</title><link>https://wimpysworld.com/posts/subsonic-on-debian/</link><pubDate>Sat, 12 Jul 2014 12:00:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/subsonic-on-debian/</guid><description>&lt;p>Last year I removed all my music from Google Play Music and created my own
&lt;a href="http://www.subsonic.org/">subSonic&lt;/a> server. I really like subSonic but don&amp;rsquo;t
use it a huge amount, mostly for syncing some music to my phone prior to going
on holiday or business. Therefore, I&amp;rsquo;ve made a single one time donation to the
project rather than the ongoing monthly usage fee.&lt;/p>
&lt;h1 id="installing-subsonic-on-debian">Installing subSonic on Debian&lt;/h1>
&lt;p>This is how I install subSonic on Debian Wheezy.&lt;/p>
&lt;h2 id="install-tomcat">Install Tomcat.&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get install tomcat7
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="install-subsonic">Install subSonic.&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>apt-get install ffmpeg
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo mkdir /var/subsonic
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo chown tomcat7: /var/subsonic
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo wget -c https://github.com/KHresearch/subsonic/releases/download/v4.9-kang/subsonic.war
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo cp subsonic.war /var/lib/tomcat7/webapps
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Restart Tomcat.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo service tomcat7 restart
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Login to subSonic by visiting &lt;a href="http://server.example.org:8080/subsonic">http://server.example.org:8080/subsonic&lt;/a> and
login with the credentials &lt;code>admin&lt;/code> and &lt;code>admin&lt;/code>. Make sure you change the
password straight away.&lt;/p>
&lt;p>Right, that is it. You can stop here and start filling subSonic with your
music.&lt;/p>
&lt;h1 id="subsonic-clients">subSonic clients&lt;/h1>
&lt;p>On the rare occasions that I listen to music via subSonic I use
&lt;a href="https://play.google.com/store/apps/details?id=com.thejoshwa.ultrasonic.androidapp">UltraSonic&lt;/a>
for Android and &lt;a href="https://www.clementine-player.org/">Clementine&lt;/a> on my Arch Linux
workstations.&lt;/p>
&lt;h4 id="references">References&lt;/h4>
&lt;ul>
&lt;li>&lt;a href="http://www.subsonic.org/pages/installation.jsp">http://www.subsonic.org/pages/installation.jsp&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/KHresearch/subsonic/">https://github.com/KHresearch/subsonic/&lt;/a>&lt;/li>
&lt;/ul></description><summary>Setting up subSonic music streaming on Debian</summary></item><item><title>Headless cloudprint server on Debian for MFC-7360N</title><link>https://wimpysworld.com/posts/headless-cloudprint-server-on-debian-for-mfc-7360n/</link><pubDate>Sat, 05 Jul 2014 12:00:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/headless-cloudprint-server-on-debian-for-mfc-7360n/</guid><description>&lt;p>I have a Brother MFC-7360N printer at home and there is also one at work.
I wanted to to get &lt;a href="http://www.google.co.uk/cloudprint/learn/">Cloudprint&lt;/a>
working with Android devices rather than use the Android app Brother
provide, which is great when it works but deeply frustrating (for my wife)
when it doesn&amp;rsquo;t.&lt;/p>
&lt;p>What I describe below is how to Cloudprint enable &amp;ldquo;Classic printers&amp;rdquo; using
Debian Wheezy.&lt;/p>
&lt;h1 id="install-cups">Install CUPS&lt;/h1>
&lt;p>Install CUPS and the Cloudprint requirements.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get install cups python-cups python-daemon python-pkg-resources
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="install-the-mfc-7360n-drivers">Install the MFC-7360N Drivers&lt;/h1>
&lt;p>I used the URL below to access the &lt;code>.deb&lt;/code> files required.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://support.brother.com/g/b/downloadlist.aspx?c=gb&amp;amp;lang=en&amp;amp;prod=mfc7360n_all&amp;amp;os=128">http://support.brother.com/g/b/downloadlist.aspx?c=gb&amp;amp;lang=en&amp;amp;prod=mfc7360n_all&amp;amp;os=128&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>If you&amp;rsquo;re running a 64-bit Debian, then install &lt;code>ia32-libs&lt;/code> first.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get install ia32-libs
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Download and install the MFC-7360N drivers.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>wget -c http://download.brother.com/welcome/dlf006237/mfc7360nlpr-2.1.0-1.i386.deb
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>wget -c http://download.brother.com/welcome/dlf006239/cupswrapperMFC7360N-2.0.4-2.i386.deb
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo dpkg -i --force-all mfc7360nlpr-2.1.0-1.i386.deb
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo dpkg -i --force-all cupswrapperMFC7360N-2.0.4-2.i386.deb
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="configure-cups">Configure CUPS&lt;/h2>
&lt;p>Edit the CUPS configuration file commonly located in &lt;code>/etc/cups/cupsd.conf&lt;/code>
and make the section that looks like this&amp;hellip;&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span># Only listen for connections from the local machine.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Listen localhost:631
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Listen /var/run/cups/cups.sock
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&amp;hellip;is changed to look like this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span># Listen on all interfaces
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Port 631
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Listen /var/run/cups/cups.sock
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Modify the Apache specific directives to allow connections from everywhere as
well. Find the follow section in &lt;code>/etc/cups/cupsd.conf&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-apacheconf" data-lang="apacheconf">&lt;span style="display:flex;">&lt;span>&amp;lt;Location &lt;span style="color:#87ceeb">/&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Restrict access to the server...&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Order allow,deny
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/Location&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Restrict access to the admin pages...&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;Location &lt;span style="color:#87ceeb">/admin&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Order allow,deny
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/Location&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Restrict access to the configuration files...&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;Location &lt;span style="color:#87ceeb">/admin/conf&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> AuthType Default
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Require &lt;span style="color:#f00">user&lt;/span> @SYSTEM
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Order allow,deny
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/Location&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Add &lt;code>Allow All&lt;/code> after each &lt;code>Order allow,deny&lt;/code> so it looks like this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-apacheconf" data-lang="apacheconf">&lt;span style="display:flex;">&lt;span>&amp;lt;Location &lt;span style="color:#87ceeb">/&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Restrict access to the server...&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Order allow,deny
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Allow &lt;span style="color:#f00">All&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/Location&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Restrict access to the admin pages...&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;Location &lt;span style="color:#87ceeb">/admin&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Order allow,deny
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Allow &lt;span style="color:#f00">All&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/Location&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Restrict access to the configuration files...&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;Location &lt;span style="color:#87ceeb">/admin/conf&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> AuthType Default
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Require &lt;span style="color:#f00">user&lt;/span> @SYSTEM
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Order allow,deny
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Allow &lt;span style="color:#f00">All&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/Location&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="add-the-mfc-7360n-to-cups">Add the MFC-7360N to CUPS&lt;/h2>
&lt;p>If your MFC-7360N is connected to your server via USB then you should be
all set. Login to the CUPS administration interface on &lt;a href="http://yourserver:631">http://yourserver:631&lt;/a>
and modify the MFC7360N printer (if one was created when the drivers where installed)
then &lt;strong>make sure you can print a test page via CUPS before proceeding.&lt;/strong>&lt;/p>
&lt;h1 id="install-cloudprint-and-cloudprint-service">Install Cloudprint and Cloudprint service&lt;/h1>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>wget -c http://davesteele.github.io/cloudprint-service/deb/cloudprint_0.11-5.1_all.deb
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>wget -c http://davesteele.github.io/cloudprint-service/deb/cloudprint-service_0.11-5.1_all.deb
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo dpkg -i cloudprint_0.11-5.1_all.deb
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo dpkg -i cloudprint-service_0.11-5.1_all.deb
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="authenticate">Authenticate&lt;/h2>
&lt;p>Google accounts with 2 step verification enabled need to use an
application-specific password.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.google.com/support/accounts/bin/static.py?page=guide.cs&amp;amp;guide=1056283&amp;amp;topic=1056286">http://www.google.com/support/accounts/bin/static.py?page=guide.cs&amp;amp;guide=1056283&amp;amp;topic=1056286&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Authenticate &lt;code>cloudprintd&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo service cloudprintd login
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You should see something like this.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>Accounts with 2 factor authentication require an application-specific password
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Google username: you@example.org
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Password:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Added Printer MFC7360N
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Start the Cloudprint daemon.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo service cloudprintd start
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If everything is working correctly you should see your printer the
following page:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://www.google.com/cloudprint#printers">https://www.google.com/cloudprint#printers&lt;/a>&lt;/li>
&lt;/ul>
&lt;h1 id="printing-from-mobile-devices">Printing from mobile devices&lt;/h1>
&lt;h2 id="android">Android&lt;/h2>
&lt;p>Add the &lt;a href="https://play.google.com/store/apps/details?id=com.google.android.apps.cloudprint">Google Cloud Print&lt;/a>
app to Android devices and you&amp;rsquo;ll be able to configure your printer
preferences and print from Android..&lt;/p>
&lt;h2 id="chrome-and-chromium">Chrome and Chromium&lt;/h2>
&lt;p>When printing from within Google Chrome and Chromium you can now select
Cloudprint as the destination and choose your printer.&lt;/p>
&lt;h4 id="references">References&lt;/h4>
&lt;ul>
&lt;li>&lt;a href="https://github.com/armooo/cloudprint">https://github.com/armooo/cloudprint&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://davesteele.github.io/cloudprint-service/">http://davesteele.github.io/cloudprint-service/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/davesteele/cloudprint-service">https://github.com/davesteele/cloudprint-service&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://injustfiveminutes.com/2013/11/07/remote-access-to-cups-admin-inter/">http://injustfiveminutes.com/2013/11/07/remote-access-to-cups-admin-inter/&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://ubuntuforums.org/showthread.php?t=1794179">http://ubuntuforums.org/showthread.php?t=1794179&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://support.google.com/a/answer/2906017?hl=en">https://support.google.com/a/answer/2906017?hl=en&lt;/a>&lt;/li>
&lt;/ul></description><summary>Create a headless Cloudprint server on Debian for MFC-7360N</summary></item><item><title>Humax Foxsat HDR Custom Firmware</title><link>https://wimpysworld.com/posts/humax-foxsat-hdr-custom-firmware/</link><pubDate>Sun, 29 Jun 2014 12:00:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/humax-foxsat-hdr-custom-firmware/</guid><description>&lt;p>I&amp;rsquo;ve had these notes kicking around for absolutely ages. I haven&amp;rsquo;t checked to
see if this stuff is still accurate because during the last 12 months or so our
viewing habits have changed and we almost exclusively watch streamed content now.&lt;/p>
&lt;p>That said, my father-in-law gave us a &lt;a href="http://www.amazon.co.uk/Humax-FOXSAT-HDR-Freesat-Digital-Recorder/dp/B001L5YU36">Humax Foxsat HDR&lt;/a>
Freesat digital recorder as a thank you for some work I did for him. It turns
out the Humax Foxsat HDR is quite hackable.&lt;/p>
&lt;h1 id="hard-disk-upgrade">Hard Disk Upgrade&lt;/h1>
&lt;p>I contributed to the topic below. The Humax firmware only supports disks up to
1TB but the hackers method works for 2TB drives, possibly bigger but I haven&amp;rsquo;t
tried. I&amp;rsquo;ve upgraded mine and my father-in-laws to 2TB without any problems.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.avforums.com/forums/pvrs-vcrs/1336395-humax-foxsat-hdr-upgrade-hdd-2tb.html">http://www.avforums.com/forums/pvrs-vcrs/1336395-humax-foxsat-hdr-upgrade-hdd-2tb.html&lt;/a>&lt;/li>
&lt;/ul>
&lt;h1 id="custom-firmware">Custom Firmware&lt;/h1>
&lt;p>These are the topics that discuss the custom firmware itself and includes the
downloads. Once the custom firmware is installed and it&amp;rsquo;s advanced interface has
been enabled you can enable several add-ons such as Samba, Mediatomb, ssh, ftp, etc.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.avforums.com/threads/media-file-server-bundle-for-the-foxsat-hdr-release-4-part-5.1829374/">http://www.avforums.com/threads/media-file-server-bundle-for-the-foxsat-hdr-release-4-part-5.1829374/&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.avforums.com/forums/freesat/1747997-media-file-server-bundle-foxsat-hdr-release-4-0-part-4-a.html">http://www.avforums.com/forums/freesat/1747997-media-file-server-bundle-foxsat-hdr-release-4-0-part-4-a.html&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.avforums.com/forums/freesat/1661195-media-file-server-bundle-foxsat-hdr-release-4-0-part-3-a.html">http://www.avforums.com/forums/freesat/1661195-media-file-server-bundle-foxsat-hdr-release-4-0-part-3-a.html&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.avforums.com/forums/freesat/1599048-media-file-server-bundle-foxsat-hdr-release-4-0-part-2-a.html">http://www.avforums.com/forums/freesat/1599048-media-file-server-bundle-foxsat-hdr-release-4-0-part-2-a.html&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.avforums.com/forums/freesat/1517610-media-file-server-bundle-foxsat-hdr-release-4-0-part-1-a.html">http://www.avforums.com/forums/freesat/1517610-media-file-server-bundle-foxsat-hdr-release-4-0-part-1-a.html&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="web-interface">Web Interface&lt;/h2>
&lt;p>This is the topic about the web interface. No download required it is
bundled in the custom firmware above.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.avforums.com/forums/freesat/1601205-web-interface-channel-editor-plug-foxsat-hdr.html">http://www.avforums.com/forums/freesat/1601205-web-interface-channel-editor-plug-foxsat-hdr.html&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="channel-editor">Channel Editor&lt;/h2>
&lt;p>The channel editor is installed and configured via the web interface and
is one of my favourite add-ons. It also allows you to enable non-freesat
channels in the normal guide.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.avforums.com/forums/freesat/1601205-web-interface-channel-editor-plug-foxsat-hdr.html">http://www.avforums.com/forums/freesat/1601205-web-interface-channel-editor-plug-foxsat-hdr.html&lt;/a>&lt;/li>
&lt;/ul>
&lt;h1 id="non-freesat-channels">Non Freesat channels&lt;/h1>
&lt;p>We get our broadcasts from Astra 2A / Astra 2B / Astra 2D / Eurobird 1 (28.2°E).
Other free to air channels are available and KingOfSat lists them all.
These channels can only be added via the Humax setup menus, but can then
be presented in the normal EPG using the Channel Editor above.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://en.kingofsat.net/pos-28.2E.php">http://en.kingofsat.net/pos-28.2E.php&lt;/a>&lt;/li>
&lt;/ul>
&lt;h1 id="decrypt-hd-recordings">Decrypt HD recordings&lt;/h1>
&lt;p>I never actually tried this, but what follows might be useful.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.avforums.com/forums/pvrs-vcrs/1721573-can-i-install-auto-unprotect-foxsat-hdr-if-so-how.html">http://www.avforums.com/forums/pvrs-vcrs/1721573-can-i-install-auto-unprotect-foxsat-hdr-if-so-how.html&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.avforums.com/forums/18051843-post715.html">http://www.avforums.com/forums/18051843-post715.html&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.avforums.com/forums/18057417-post732.html">http://www.avforums.com/forums/18057417-post732.html&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.avforums.com/forums/18061024-post740.html">http://www.avforums.com/forums/18061024-post740.html&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.avforums.com/forums/18085731-post768.html">http://www.avforums.com/forums/18085731-post768.html&lt;/a>&lt;/li>
&lt;/ul>
&lt;h1 id="ota-updates">OTA updates&lt;/h1>
&lt;p>&lt;strong>This is not so relevant now, since Humax haven&amp;rsquo;t released an OTA update for some time.&lt;/strong>&lt;/p>
&lt;p>I have not yet found a way to prevent automatic over the air updates from being
automatically applied. When an over the air update is applied the Humax still
works, but the web interface and all the add-ons stop working. The can be solved
by waiting for the custom firmware to be updated (which happen remarkably quickly)
and then re-flashing the custom firmware. All the add-ons should start working again.&lt;/p></description><summary>Hard disk upgrades and custom firmware on the Humx Foxsat HDR</summary></item><item><title>Integrating Dropbox photo syncing with Open Media Vault and Plex</title><link>https://wimpysworld.com/posts/integrating-dropbox-photo-syncing-with-open-media-vault-and-plex/</link><pubDate>Sat, 28 Jun 2014 12:00:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/integrating-dropbox-photo-syncing-with-open-media-vault-and-plex/</guid><description>&lt;p>&lt;strong>This how-to was updated for Open Media Vault 2.x and 3.x on 22nd August 2016.&lt;/strong>&lt;/p>
&lt;p>I&amp;rsquo;ve installed &lt;a href="http://www.openmediavault.org/">Open Media Vault&lt;/a>
on a &lt;a href="http://www8.hp.com/uk/en/products/proliant-servers/product-detail.html?oid=5336624">HP ProLiant MicroServer G7 N54L&lt;/a>
and use it as media server for the house. OpenMediaVault (OMV) is a network
attached storage (NAS) solution based on &lt;a href="http://www.debian.org">Debian&lt;/a> Linux.&lt;/p>
&lt;p>I use a free Dropbox account to sync photos from mine and my wife&amp;rsquo;s Android
phones and wanted to automate to import of these photo upload into Plex, which
is also running on Open Media Vault.&lt;/p>
&lt;h1 id="installing-dropbox-on-open-media-vault">Installing Dropbox on Open Media Vault&lt;/h1>
&lt;p>I looked for a Dropbox Plugin for Open Media Vault and found this:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/lordldx/openmediavault-dropbox">https://github.com/lordldx/openmediavault-dropbox&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Sadly, at the time of writing, it is unfinished and I didn&amp;rsquo;t have the time to
go and learn the Open Media Vault plugin API.&lt;/p>
&lt;p>The Open Media Vault forum does include a &lt;a href="http://forums.openmediavault.org/viewtopic.php?f=13&amp;amp;t=70">Dropbox HOW-TO&lt;/a>
which is very similar to how &lt;a href="https://wimpysworld.com/posts/dropbox-is-my-nikola-publish-button/">I&amp;rsquo;ve run Dropbox on headless Linux servers&lt;/a>
in the past. So, I decided to adapt my existing notes to Open Media Vault.&lt;/p>
&lt;h2 id="create-a-dropbox-share">Create a Dropbox Share&lt;/h2>
&lt;p>Create a Dropbox share via the OMV WebUI.&lt;/p>
&lt;ul>
&lt;li>&lt;code>Access Right Management -&amp;gt; Shared Folders&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>I gave my the name &amp;ldquo;Dropbox&amp;rdquo;. I know, very original.&lt;/p>
&lt;h2 id="installing-dropbox-on-a-headless-server">Installing Dropbox on a headless server&lt;/h2>
&lt;p>Download and extract the latest Dropbox stable release.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cd ~ &amp;amp;&amp;amp; wget -O - &lt;span style="color:#87ceeb">&amp;#34;https://www.dropbox.com/download?plat=lnx.x86_64&amp;#34;&lt;/span> | tar xzf -
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>chown -Rv &lt;span style="color:#87ceeb">${&lt;/span>&lt;span style="color:#eedd82">USER&lt;/span>&lt;span style="color:#87ceeb">}&lt;/span>: ~/.dropbox-dist
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo ln -s ~/.dropbox-dist/dropboxd /usr/local/bin/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Run &lt;code>dropboxd&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>~/.dropbox-dist/dropboxd
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You should see output like this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>This client is not linked to any account... Please visit https://www.dropbox.com/cli_link?host_id=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx to link this machine.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Visit the URL, login with your Dropbox account and link the account. You
should see the following.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>Client successfully linked, Welcome Web!
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>dropboxd&lt;/code> will now create a &lt;code>~/Dropbox&lt;/code> folder and start synchronizing. Stop
&lt;code>dropboxd&lt;/code> with CTRL+C.&lt;/p>
&lt;h2 id="symlink-the-dropbox-share">Symlink the Dropbox share&lt;/h2>
&lt;p>Login to the OMV server as &lt;code>root&lt;/code> and sym-link the Dropbox share you created
earlier to the Dropbox directory in the root home directory.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>mv ~/Dropbox ~/Dropbox-old
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ln -s /media/&amp;lt;UUID&amp;gt;/Dropbox ~/Dropbox
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rsync -a -W --progress ~/Dropbox-old/ ~/Dropbox/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="initd---open-media-vault-2x">init.d - Open Media Vault 2.x&lt;/h3>
&lt;p>If you are using Open Media Vault 2.x (based on Debian wheezy) the
you&amp;rsquo;ll need to create an init script.&lt;/p>
&lt;p>To run Dropbox as daemon with init.d. Create &lt;code>/etc/init.d/dropbox&lt;/code> with the
following content.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e5e5e5">#!/bin/sh
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e5e5e5">&lt;/span>&lt;span style="color:#0f0">### BEGIN INIT INFO&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Provides: dropbox&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Required-Start: $local_fs $remote_fs $network $syslog $named&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Required-Stop: $local_fs $remote_fs $network $syslog $named&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Default-Start: 2 3 4 5&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Default-Stop: 0 1 6&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># X-Interactive: false&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Short-Description: dropbox service&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0">### END INIT INFO&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">DROPBOX_USERS&lt;/span>=&lt;span style="color:#87ceeb">&amp;#34;user_a&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">DAEMON&lt;/span>=.dropbox-dist/dropboxd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>start() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> echo &lt;span style="color:#87ceeb">&amp;#34;Starting dropbox...&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">for&lt;/span> dbuser in &lt;span style="color:#eedd82">$DROPBOX_USERS&lt;/span>; &lt;span style="color:#f00">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eedd82">HOMEDIR&lt;/span>=&lt;span style="color:#87ceeb">`&lt;/span>getent passwd &lt;span style="color:#eedd82">$dbuser&lt;/span> | cut -d: -f6&lt;span style="color:#87ceeb">`&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">if&lt;/span> [ -x &lt;span style="color:#eedd82">$DAEMON&lt;/span> ]; &lt;span style="color:#f00">then&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eedd82">HOME&lt;/span>=&lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$HOMEDIR&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span> start-stop-daemon -b -o -c &lt;span style="color:#eedd82">$dbuser&lt;/span> -S -u &lt;span style="color:#eedd82">$dbuser&lt;/span> -x &lt;span style="color:#eedd82">$HOMEDIR&lt;/span>/&lt;span style="color:#eedd82">$DAEMON&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>stop() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> echo &lt;span style="color:#87ceeb">&amp;#34;Stopping dropbox...&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">for&lt;/span> dbuser in &lt;span style="color:#eedd82">$DROPBOX_USERS&lt;/span>; &lt;span style="color:#f00">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eedd82">HOMEDIR&lt;/span>=&lt;span style="color:#87ceeb">`&lt;/span>getent passwd &lt;span style="color:#eedd82">$dbuser&lt;/span> | cut -d: -f6&lt;span style="color:#87ceeb">`&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">if&lt;/span> [ -x &lt;span style="color:#eedd82">$HOMEDIR&lt;/span>/&lt;span style="color:#eedd82">$DAEMON&lt;/span> ]; &lt;span style="color:#f00">then&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> start-stop-daemon -o -c &lt;span style="color:#eedd82">$dbuser&lt;/span> -K -u &lt;span style="color:#eedd82">$dbuser&lt;/span> -x &lt;span style="color:#eedd82">$HOMEDIR&lt;/span>/&lt;span style="color:#eedd82">$DAEMON&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>status() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">for&lt;/span> dbuser in &lt;span style="color:#eedd82">$DROPBOX_USERS&lt;/span>; &lt;span style="color:#f00">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eedd82">dbpid&lt;/span>=&lt;span style="color:#87ceeb">`&lt;/span>pgrep -u &lt;span style="color:#eedd82">$dbuser&lt;/span> dropbox&lt;span style="color:#87ceeb">`&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">if&lt;/span> [ -z &lt;span style="color:#eedd82">$dbpid&lt;/span> ] ; &lt;span style="color:#f00">then&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> echo &lt;span style="color:#87ceeb">&amp;#34;dropboxd for USER &lt;/span>&lt;span style="color:#eedd82">$dbuser&lt;/span>&lt;span style="color:#87ceeb">: not running.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">else&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> echo &lt;span style="color:#87ceeb">&amp;#34;dropboxd for USER &lt;/span>&lt;span style="color:#eedd82">$dbuser&lt;/span>&lt;span style="color:#87ceeb">: running (pid &lt;/span>&lt;span style="color:#eedd82">$dbpid&lt;/span>&lt;span style="color:#87ceeb">)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">case&lt;/span> &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$1&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span> in
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> start)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> start
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> stop)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> stop
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> restart|reload|force-reload)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> stop
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> start
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> status)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> status
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> *)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> echo &lt;span style="color:#87ceeb">&amp;#34;Usage: /etc/init.d/dropbox {start|stop|reload|force-reload|restart|status}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> exit &lt;span style="color:#f60">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">esac&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>exit &lt;span style="color:#f60">0&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Enable the init.d script.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo chmod +x /etc/init.d/dropbox
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo update-rc.d dropbox defaults
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="starting-and-stopping-the-dropbox-daemon">Starting and Stopping the Dropbox daemon&lt;/h2>
&lt;p>Use &lt;code>/etc/init.d/dropbox start&lt;/code> to start and &lt;code>/etc/init.d/dropbox stop&lt;/code> to stop.&lt;/p>
&lt;h3 id="systemd---openmediavault-3x">systemd - OpenMediaVault 3.x&lt;/h3>
&lt;p>If you are using Open Media Vault 3.x (based on Debian jessie) then
you&amp;rsquo;ll need to create a systemd unit. Create the systemd service file.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo nano /lib/systemd/system/dropbox.service
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Add this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-systemd" data-lang="systemd">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">[Unit]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Description=&lt;span style="color:#87ceeb">Dropbox&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>After=&lt;span style="color:#87ceeb">local-fs.target network.target&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">[Service]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Type=&lt;span style="color:#87ceeb">simple&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>WorkingDirectory=&lt;span style="color:#87ceeb">%h/.dropbox-dist&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ExecStart=&lt;span style="color:#87ceeb">/usr/local/bin/dropboxd&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ExecReload=&lt;span style="color:#87ceeb">/bin/kill -HUP $MAINPID&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>KillMode=&lt;span style="color:#87ceeb">process&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Restart=&lt;span style="color:#87ceeb">on-failure&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>User=&lt;span style="color:#87ceeb">%I&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">[Install]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>WantedBy=&lt;span style="color:#87ceeb">multi-user.target&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Enable the dropbox service for a given user.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo systemctl enable dropbox@user_a
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Start the service.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo systemctl start dropbox@user_a
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="dropbox-client">Dropbox client&lt;/h2>
&lt;p>It is recommended to download the official Dropbox client to configure
Dropbox and get its status.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>wget &lt;span style="color:#87ceeb">&amp;#34;http://www.dropbox.com/download?dl=packages/dropbox.py&amp;#34;&lt;/span> -O dropbox
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo chmod &lt;span style="color:#f60">755&lt;/span> dropbox
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo mv dropbox /usr/local/bin/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You can check on Dropbox status by running the following.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>dropbox status
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>For usage instructions run &lt;code>dropbox help&lt;/code>.&lt;/p>
&lt;h1 id="photo-importing">Photo importing&lt;/h1>
&lt;p>So, the reason for doing all this is that I now have a Dropbox instance
running on my home file server and everyday it runs a script, that I wrote,
to automatically import new photos into a directory that Plex monitors.
I&amp;rsquo;ll post details about my photo sorting script, &lt;a href="https://github.com/flexiondotorg/Phort">Phort&lt;/a>,
at a later date.&lt;/p>
&lt;h4 id="references">References&lt;/h4>
&lt;ul>
&lt;li>&lt;a href="http://www.dropboxwiki.com/Text_Based_Linux_Install">http://www.dropboxwiki.com/Text_Based_Linux_Install&lt;/a>&lt;/li>
&lt;/ul></description><summary>Integrating Dropbox on a headless Open Media Vault server.</summary></item><item><title>OpenMediaVault on Debian</title><link>https://wimpysworld.com/posts/openmediavault-on-debian/</link><pubDate>Sun, 22 Jun 2014 12:00:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/openmediavault-on-debian/</guid><description>&lt;p>At the time of writing &lt;a href="http://www.openmediavault.org/">OpenMediaVault&lt;/a> 0.6 is
pre-release. But it is possible to install OpenMediaVault on Debian Wheezy in
order to get some testing done.&lt;/p>
&lt;p>Install Debian Wheezy on your target VM or test server. Go with the defaults
until the &amp;lsquo;Software selection&amp;rsquo; dialogue. Make sure everything is unselected, like this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>[ ] Debian desktop environment
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ] Web server
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ] Print server
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ] SQL database
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ] DNS Server
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ] File server
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ] Mail server
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ] SSH server
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ] Laptop
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ] Standard system utilities
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>After the install is complete, reboot and login to the new Debian system
as &lt;code>root&lt;/code>.&lt;/p>
&lt;p>Update the repository sources and add the &lt;code>contrib&lt;/code> and &lt;code>non-free&lt;/code>
repositories.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>nano /etc/apt/sources.list
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>It should look something like this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>deb http://ftp.uk.debian.org/debian/ wheezy main contrib non-free
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb-src http://ftp.uk.debian.org/debian/ wheezy main contrib non-free
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb http://security.debian.org/ wheezy/updates main contrib non-free
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb-src http://security.debian.org/ wheezy/updates main contrib non-free
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># wheezy-updates, previously known as &amp;#39;volatile&amp;#39;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb http://ftp.uk.debian.org/debian/ wheezy-updates main contrib non-free
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb-src http://ftp.uk.debian.org/debian/ wheezy-updates main contrib non-free
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Now add the OpenMediaVault repository.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>echo &lt;span style="color:#87ceeb">&amp;#34;deb http://packages.openmediavault.org/public kralizec main&amp;#34;&lt;/span> &amp;gt; /etc/apt/sources.list.d/openmediavault.list
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Update.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>apt-get update
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Install the OpenMediaVault repository key and Postfix.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>apt-get install openmediavault-keyring postfix
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>When the &amp;lsquo;Postfix Configuration&amp;rsquo; dialogue is displayed choose &lt;code>No configuration&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>Update again and install OpenMediaVault.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>apt-get update
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>apt-get install openmediavault
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>When the &amp;lsquo;Configuring mdadm&amp;rsquo; dialogue is displayed enter &lt;code>none&lt;/code>.&lt;/li>
&lt;li>Do you want to start MD arrays automatically? &lt;code>YES&lt;/code>&lt;/li>
&lt;li>When the &amp;lsquo;ProFTPD configuration&amp;rsquo; dialogue is displayed choose
&lt;code>standalone&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>Initialise OpenMediaVault and reboot.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>omv-initsystem
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>reboot
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>After the reboot you should be able to connect to the OpenMediaVault WebUI and
login as &lt;code>admin&lt;/code> with the password of &lt;code>openmediavault&lt;/code>. That&amp;rsquo;s it. Get testing.&lt;/p></description><summary>Manually installing OpenMediaVault on Debian Wheezy</summary></item><item><title>Setting up BitSync on Debian</title><link>https://wimpysworld.com/posts/setting-up-bitsync-on-debian/</link><pubDate>Sat, 21 Jun 2014 12:00:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/setting-up-bitsync-on-debian/</guid><description>&lt;p>I&amp;rsquo;ve replaced Dropbox with &lt;a href="http://www.bittorrent.com/sync">BitTorrent Sync&lt;/a>.
In order to do this I&amp;rsquo;ve have &lt;code>btsync&lt;/code> running on a VPS (2CPU, 2GB, 400GB), my
home server and assorted Arch Linux workstations.&lt;/p>
&lt;p>I had a couple of reasons for migrating away from Dropbox.&lt;/p>
&lt;ul>
&lt;li>Dropbox was costing $100 per year.&lt;/li>
&lt;li>Dropbox encryption model is weak and I have data security/privacy.&lt;/li>
&lt;/ul>
&lt;p>The VPS I am running BitTorrent Sync on costs $50 per year and provides four
times the storage. I run &lt;code>btsync&lt;/code> on a VPS so that there is always a server
&lt;em>&amp;ldquo;in the cloud&amp;rdquo;&lt;/em> that is available to sync with so that my setup emulates what
Dropbox used to do.&lt;/p>
&lt;p>All my servers are running Debian and this is how I install &lt;code>btsync&lt;/code> on
Debian.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sh -c &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#f00">$(&lt;/span>curl -fsSL http://debian.yeasoft.net/add-btsync-repository.sh&lt;span style="color:#f00">)&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get install btsync
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This is how I respond to the prompts:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>* Do you want to define a default BitTorrent Sync instance? : YES
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>* BitTorrent Sync Daemon Credentials: yourusername
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>* BitTorrent Sync Daemon Group: yourusername
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>* Niceness of the BitTorrent Sync Daemon: 0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>* On which portnumber should BitTorrent Sync listen? 0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>* BitTorrent Sync Listen Port: 12345
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>* Do you want BitTorrent Sync to request port mapping via UPNP? NO
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>* Download Bandwith Limit: 0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>* Upload Bandwith Limit: 0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>* Web Interface Bind IP Address: 0.0.0.0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>* Web Interface Listen Port: 8888
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>* The username for accessing the web interface: yourusername
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>* The password for accessing the web interface: yourpassword
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>As you&amp;rsquo;ll see, I don&amp;rsquo;t use UPNP on my VPS. I elect a specific port (not
actually 12345 by the way) and open that port up with &lt;code>ufw&lt;/code>. I also only
allow access to the WebUI port from another server I own which reverse
proxies via &lt;code>nginx&lt;/code>.&lt;/p>
&lt;p>&lt;code>btsync&lt;/code> works really well, I have it syncing hundreds of thousands of
files that amount to several hundred gigabytes of data. On my Arch Linux
workstations I use the brilliant &lt;a href="http://www.yeasoft.com/site/projects:btsync-deb:btsync-gui">btsync-gui&lt;/a>
and &lt;a href="https://play.google.com/store/apps/details?id=com.bittorrent.sync">BitTorrent Sync is also available for Android&lt;/a>.&lt;/p>
&lt;p>That said, I still use a free Dropbox account to sync photos from mine and my
wife&amp;rsquo;s Android phones. I have a Dropbox instance running on my home file server
and everyday it runs a script to automatically import these photos into Plex.&lt;/p>
&lt;p>Such a shame, that at the time of writing, &lt;code>btsync&lt;/code> is closed source :-(
Maybe that will change but if it doesn&amp;rsquo;t &lt;a href="http://syncthing.net/">syncthing&lt;/a>
may well be the answer when it has matured a little.&lt;/p>
&lt;h4 id="references">References&lt;/h4>
&lt;ul>
&lt;li>&lt;a href="http://www.yeasoft.com/site/projects:btsync-deb:btsync-server">http://www.yeasoft.com/site/projects:btsync-deb:btsync-server&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://forum.bittorrent.com/topic/18974-debian-and-ubuntu-server-packages-for-bittorrent-sync/">http://forum.bittorrent.com/topic/18974-debian-and-ubuntu-server-packages-for-bittorrent-sync/&lt;/a>&lt;/li>
&lt;/ul></description><summary>Setting up BitTorrent Sync on Debian</summary></item><item><title>MATE Desktop on Debian Wheezy</title><link>https://wimpysworld.com/posts/mate-desktop-on-debian-wheezy/</link><pubDate>Thu, 19 Jun 2014 22:00:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/mate-desktop-on-debian-wheezy/</guid><description>&lt;p>I&amp;rsquo;m a member of the &lt;a href="http://mate-desktop.org">MATE Desktop&lt;/a> team and until
recently the majority of my involvement has been focused around &lt;a href="http://www.archlinux.org">Arch Linux&lt;/a>.&lt;/p>
&lt;p>However, I&amp;rsquo;m working on a MATE project that is based on a &lt;a href="http://www.debian.org">Debian&lt;/a>
derivative. MATE has recently been accepted into the &lt;a href="backports.debian.org/">Debian Backports&lt;/a>
repository for Wheezy, so I decided to do a &lt;em>&amp;ldquo;MATE from scratch&amp;rdquo;&lt;/em> on Debian using
an old netbook to get familiar with the MATE package naming differences between
Arch Linux and Debian.&lt;/p>
&lt;h1 id="install-debian">Install Debian&lt;/h1>
&lt;p>I installed Debian Wheezy from the &lt;a href="https://www.debian.org/CD/netinst/">netinst&lt;/a>
ISO to ensure the target install was as minimal as possible. I went with
the defaults until the &amp;lsquo;Software selection&amp;rsquo; dialogue, at this point
unselect everything except &amp;ldquo;SSH server&amp;rdquo;. Like this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>[ ] Debian desktop environment
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ] Web server
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ] Print server
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ] SQL database
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ] DNS Server
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ] File server
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ] Mail server
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[X] SSH server
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ] Laptop
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ] Standard system utilities
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="debian-iso-with-firmware">Debian ISO with Firmware&lt;/h2>
&lt;p>If you&amp;rsquo;re installing on hardware that requires additional firmware in
order for it to work with Linux then use the netinst ISO that includes
firmware.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://cdimage.debian.org/cdimage/unofficial/non-free/cd-including-firmware/current/">http://cdimage.debian.org/cdimage/unofficial/non-free/cd-including-firmware/current/&lt;/a>&lt;/li>
&lt;/ul>
&lt;h1 id="configure-debian">Configure Debian&lt;/h1>
&lt;p>When the install is finished, reboot and configure Debian a little.&lt;/p>
&lt;h2 id="repositories">Repositories&lt;/h2>
&lt;p>You&amp;rsquo;ll need to install &lt;code>lsb-release&lt;/code> for the following to work.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>apt-get install lsb-release
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This is what I put in &lt;code>/etc/apt/sources.list&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cat &amp;gt;/etc/apt/sources.list&lt;span style="color:#87ceeb">&amp;lt;&amp;lt;EOF
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">deb http://ftp.uk.debian.org/debian/ $(lsb_release -cs) main contrib non-free
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">deb-src http://ftp.uk.debian.org/debian/ $(lsb_release -cs) main contrib non-free
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">deb http://security.debian.org/ $(lsb_release -cs)/updates main contrib non-free
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">deb-src http://security.debian.org/ $(lsb_release -cs)/updates main contrib non-free
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb"># $(lsb_release -cs)-updates, previously known as &amp;#39;volatile&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">deb http://ftp.uk.debian.org/debian/ $(lsb_release -cs)-updates main contrib non-free
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">deb-src http://ftp.uk.debian.org/debian/ $(lsb_release -cs)-updates main contrib non-free
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">EOF&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="backports">Backports&lt;/h2>
&lt;p>MATE is only available in the wheezy-backports repository.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cat &amp;gt;/etc/apt/sources.list.d/backports.list &lt;span style="color:#87ceeb">&amp;lt;&amp;lt;EOF
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">deb http://ftp.uk.debian.org/debian $(lsb_release -cs)-backports main contrib non-free
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">deb-src http://ftp.uk.debian.org/debian $(lsb_release -cs)-backports main contrib non-free
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">EOF&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Update.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get update
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>All backports are deactivated by default (i.e. the packages are pinned to 100
by using ButAutomaticUpgrades: yes in the Release files. If you want to install
something from backports run:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>apt-get -t wheezy-backports install &lt;span style="color:#87ceeb">&amp;#34;package&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="install-mate-desktop">Install MATE Desktop&lt;/h1>
&lt;p>First install the LightDM display manager.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>apt-get install accountsservice lightdm lightdm-gtk-greeter
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Now for the MATE Desktop itself.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>apt-get -t wheezy-backports install mate-desktop-environment-extras
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="networkmanager">NetworkManager&lt;/h2>
&lt;p>I typically use NetworkManager, so lets install that too.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>apt-get install network-manager-gnome
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="supplementary">Supplementary&lt;/h2>
&lt;p>Depending on your hardware you may require CPU frequency utilities or
additional firmware.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>apt-get install cpufreqd cpufrequtil firmware-linux firmware-linux-nonfree
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>And, that&amp;rsquo;s it! Reboot and you&amp;rsquo;ll see the LightDM greeter waiting for your
login credentials.&lt;/p>
&lt;h4 id="references">References&lt;/h4>
&lt;ul>
&lt;li>&lt;a href="http://wiki.mate-desktop.org/download?s%5B%5D=debian">http://wiki.mate-desktop.org/download?s[]=debian&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://wiki.debian.org/InstallingDebianOn/HP/HP2133">https://wiki.debian.org/InstallingDebianOn/HP/HP2133&lt;/a>&lt;/li>
&lt;/ul></description><summary>Setting up MATE Desktop on Debian Wheezy</summary></item><item><title>Ubuntu MATE</title><link>https://wimpysworld.com/projects/ubuntu-mate/</link><pubDate>Sun, 01 Jun 2014 00:00:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/projects/ubuntu-mate/</guid><description>&lt;p>A community developed Ubuntu based operating system that beautifully integrates
the &lt;a href="https://mate-desktop.org">MATE desktop&lt;/a>. Ubuntu MATE is a stable,
easy-to-use operating system with a configurable desktop environment and is
suitable for modern workstations, laptops, single board computers and older
hardware alike.&lt;/p>
&lt;ul>
&lt;li>Organisation: &lt;a href="https://ubuntu-mate.org">Ubuntu MATE Project&lt;/a>&lt;/li>
&lt;li>Date: June 2014 - date&lt;/li>
&lt;li>Role: Project Lead&lt;/li>
&lt;/ul></description><summary>Ubuntu MATE is a Linux distribution I made for my friends and family</summary></item><item><title>BIP IRC proxy</title><link>https://wimpysworld.com/posts/bip-irc-proxy/</link><pubDate>Wed, 16 Apr 2014 07:07:09 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/bip-irc-proxy/</guid><description>&lt;p>&lt;strong>I switched from BIP to &lt;a href="http://wiki.znc.in/ZNC">ZNC&lt;/a>, and &lt;a href="https://wimpysworld.com/posts/znc-irc-proxy/">recommend you use ZNC instead&lt;/a>!&lt;/strong>&lt;/p>
&lt;p>&lt;a href="http://bip.milkypond.org/">BIP&lt;/a> is an IRC proxy that maintains a persistent
connection(s) to a list of IRC channels. You can then point your IRC client to
BIP each time you log in and playback the conversations that took place while
you were away.&lt;/p>
&lt;p>I&amp;rsquo;ve found bBIP to be so useful that I now &lt;a href="https://www.archlinux.org/packages/community/x86_64/bip/">maintain BIP for Arch Linux&lt;/a>,
although I now run my BIP proxy on Debian because my new VPS provider doesn&amp;rsquo;t
offer Arch Linux as an option.&lt;/p>
&lt;h2 id="installing-bip">Installing BIP&lt;/h2>
&lt;p>Installing BIP is simple for both Arch Linux and Debian.&lt;/p>
&lt;h3 id="debian">Debian&lt;/h3>
&lt;p>I run BIP on Debian Wheezy with the backport repository enabled.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get -t wheezy-backports install bip
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo sed -i &lt;span style="color:#87ceeb">&amp;#39;s/ENABLED=0/ENABLED=1/&amp;#39;&lt;/span> /etc/default/bip
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="arch-linux">Arch Linux&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>pacman -S bip
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>systemctl enable bip
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="create-a-user">Create a user&lt;/h2>
&lt;p>The next thing to do is create a username and password and BIP provides it&amp;rsquo;s
own utility for doing this called &lt;code>bipmkpw&lt;/code>. Replace &amp;lsquo;username&amp;rsquo; with whatever
you want your BIP &amp;lsquo;username&amp;rsquo; to be. This name has no relation to any IRC
usernames so it can be anything.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>bipmkpw username
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Enter a password when prompted. The password will then be output as a hash.
Make a note of both the hashed and un-hashed values somewhere, you will need
them later.&lt;/p>
&lt;h2 id="create-a-certificate">Create a certificate&lt;/h2>
&lt;p>We don&amp;rsquo;t want the username and password being sent as clear-text, so we will
create an SSL certificate for BIP to use.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>openssl req -new -newkey rsa:4096 -nodes -x509 -keyout bip.pem -out bip.pem
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Move the certificate to &lt;code>/var/lib/bip&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo mv bip.pem /var/lib/bip
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Change ownership and permissions of the certificate to the user &lt;code>bip&lt;/code> which was
created automatically when the package was installed.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo chown bip:bip /var/lib/bip/bip.pem
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo chmod &lt;span style="color:#f60">600&lt;/span> /var/lib/bip/bip.pem
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="configure-bip">Configure BIP&lt;/h2>
&lt;p>Here is example configuration for BIP. Copy it to &lt;code>/etc/bip.conf&lt;/code>, modify it
accordingly and then change the ownership and permissions.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo chown bip:bip /etc/bip.conf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo chmod &lt;span style="color:#f60">640&lt;/span> /etc/bip.conf
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="example-configuration">Example configuration&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span># bip default config file.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># Thou shoult change thy password
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ip = &amp;#34;0.0.0.0&amp;#34;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># To connect a client to bip, try the port below, and
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># be sure to set the password to the value
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># specified in the network you want to connect to.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>port = 7778;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># If you set this to true, you&amp;#39;ll only be able to connect to bip
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># with a SSL capable IRC client. Be sure to generate a certificate
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># for bip with &amp;#39;make cert&amp;#39;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>client_side_ssl = true;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>log_level = 3;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>pid_file=&amp;#34;/var/run/bip/bip.pid&amp;#34;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># This is where logs go. Channel and private messages will use that
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># configuration value as a prefix, and then log_format to determine
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># full log filename.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>log_root = &amp;#34;/var/log/bip/&amp;#34;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># Log format allows you to make log filenames depend on the log line&amp;#39;s
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># attributes. Here&amp;#39;s a list :
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># %u -&amp;gt; user name
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># %n -&amp;gt; network name
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># %Y -&amp;gt; 4 digit year
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># %m -&amp;gt; 2 digit month
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># %d -&amp;gt; 2 digit day
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># %c -&amp;gt; destination (#chan, privates, ...)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>#log_format = &amp;#34;%n/%Y-%m/%c.%d.log&amp;#34;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># Sets the frequency (in seconds) of log syncing (real write to kernel)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>#log_sync_interval = 5;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># Makes bip send the log of each channel and privates while
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># you were not connected to the proxy upon connection.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>backlog = true; # enable backlog
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>backlog_lines = 0; # number of lines in backlog, 0 means no limit
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>backlog_always = false; # backlog even lines already backlogged
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># If blreset_on_talk talking on an irc network has the same effect of issuing
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># /bip blreset, meaning that stuffed logged before the command won&amp;#39;t be read
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># back on backlog
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>blreset_on_talk = true;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># Network definition, a name and server info
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>network {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> name = &amp;#34;freenode&amp;#34;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> server { host = &amp;#34;chat.freenode.net&amp;#34;; port = 6667; };
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>network {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> name = &amp;#34;blitzed&amp;#34;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> server { host = &amp;#34;irc.blitzed.org&amp;#34;; port = 6667; };
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># Configuration example with one user who connects to two irc networks
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># To use the multi-server feature:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># - define the connections
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># - chose and setup a different login for each connection
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># on your irc client:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># - Use the multi server feature of your client, the server being each time
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># the server where bip is running. In your client setup server password to:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># username:password:connectionname
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># - do not store the password in clear here, use the bipmkpw util to generate
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># a hash
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># User structure is grouping information for a given user
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>user {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> # The name in bip of the user
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> # This is used by bip only
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> name = &amp;#34;USERNAME; #BIP User account created with bipmkpw
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> password = &amp;#34;00000000000000000000000000000000000000&amp;#34;; # the hash bipmkpw created
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ssl_check_mode = &amp;#34;none&amp;#34;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> # These will be the default for each connections
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> default_nick = &amp;#34;NICKNAME&amp;#34;; #IRC Nick
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> default_user = &amp;#34;IRCUSERNAME&amp;#34;; #IRC User
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> default_realname = &amp;#34;REALNAME&amp;#34;; #IRC Real Name
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> admin = true;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> backlog_msg_only = true; # When true,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> # A user can have mutiple connections to irc networks.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> # define a connection:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> connection {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> name = &amp;#34;freenode&amp;#34;; # used by bip only
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> network = &amp;#34;freenode&amp;#34;; # which ircnet to connect to
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> # these will be sent to the real IRC server
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> user = &amp;#34;IRCUSERNAME&amp;#34;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> realname = &amp;#34;IRCREALNAME&amp;#34;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> password = &amp;#34;serverpassword&amp;#34;; #can be commented out if not needed
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> # Some options:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> follow_nick = true;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ignore_first_nick = false;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> #on_connect_send = &amp;#34;PRIVMSG NickServ :IDENTIFY nspassword&amp;#34;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> # Autojoined channels:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> channel { name = &amp;#34;#cat&amp;#34;; }; # Join #cat
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> channel { name = &amp;#34;#dog&amp;#34;; backlog = false; }; # Join #dog but don&amp;#39;t backlog it.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> channel { name = &amp;#34;#pig&amp;#34;; key = &amp;#34;01nk01nk&amp;#34;; }; # Join #pig that has a password.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> };
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> connection {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> name = &amp;#34;blitzed&amp;#34;; # used by bip only
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> network = &amp;#34;blitzed&amp;#34;; # which ircnet to connect to
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> # these will be sent to the real IRC server
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> user = &amp;#34;IRCUSERNAME&amp;#34;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> realname = &amp;#34;IRCREALNAME&amp;#34;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> password = &amp;#34;serverpassword&amp;#34;; #can be commented out if not needed
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> # Some options:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> follow_nick = true;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ignore_first_nick = false;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> #on_connect_send = &amp;#34;PRIVMSG NickServ :IDENTIFY nspassword&amp;#34;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> # Autojoined channels:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> channel { name = &amp;#34;#bar&amp;#34;; };
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> channel { name = &amp;#34;#foo&amp;#34;; };
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> };
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If you require any clarification about what the configuration options do then
&lt;code>man bip.conf&lt;/code> is your friend.&lt;/p>
&lt;h2 id="start-bip">Start BIP&lt;/h2>
&lt;p>Now that BIP is configured, it can be started.&lt;/p>
&lt;h3 id="debian-1">Debian&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo /etc/init.d/bip start
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="arch-linux-1">Arch Linux&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo systemctl start bip
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="client-configuration">Client configuration&lt;/h2>
&lt;p>I use &lt;a href="http://hexchat.github.io/">HexChat&lt;/a>, but other IRC clients are available.
I add a new Network to HexChat for each of the IRC networks I defined in
&lt;code>/etc/bip.conf&lt;/code>. The screen shot below shows how I configure a BIP network in
HexChat.&lt;/p>
&lt;p>&lt;img src="BIP-freenode.png" alt="HexChat BIP Configuration" title="Example HexChat Network Configuration to a BIP proxy">&lt;/p>
&lt;h3 id="password-format">Password format&lt;/h3>
&lt;p>The Password is the most important and confusing item. &lt;strong>This is for BIP,
not for any IRC network&lt;/strong>. Remember the unhashed password? That goes here but
with a twist. The format for the password is:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>bipusername:unhashedbippassword:bipnetwork
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Bipnetwork? What is that? It is from the following section of &lt;code>/etc/bip.conf&lt;/code>
on the server?&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>network {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> name = &amp;#34;freenode&amp;#34;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> server { host = &amp;#34;chat.freenode.net&amp;#34;; port = 6667; };
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>A more practical example:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>myuser:S3cr3tP@$$w0rd:freenode
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="conclusion">Conclusion&lt;/h2>
&lt;p>And that&amp;rsquo;s it! We are now perpetually connected to IRC, can connect to BIP
proxy from multiple devices in a completely transparent and seamless manner.
Moreover, the logs for all channels are saved and automatically rotated on the
server.&lt;/p>
&lt;p>If you looking for an alternative to BIP, then try &lt;a href="http://wiki.znc.in/ZNC">ZNC&lt;/a>.&lt;/p>
&lt;p>&lt;strong>References&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://wiki.linaro.org/Resources/HowTo/BIP">https://wiki.linaro.org/Resources/HowTo/BIP&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://nerderati.com/2010/11/perpetual-irc-the-proxy-edition/">http://nerderati.com/2010/11/perpetual-irc-the-proxy-edition/&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://stevengorrell.com/bip-irc-proxy/">http://stevengorrell.com/bip-irc-proxy/&lt;/a>&lt;/li>
&lt;/ul></description><summary>Installing BIP IRC Proxy on Debian Wheezy &amp;amp; Arch Linux</summary></item><item><title>LXC on Arch Linux</title><link>https://wimpysworld.com/posts/lxc-on-arch-linux/</link><pubDate>Tue, 15 Apr 2014 02:44:11 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/lxc-on-arch-linux/</guid><description>&lt;p>At some point last year I was experimenting with Linux Containers (LXC) on
Arch Linux. &lt;strong>I never finished the blog post but somehow it was briefly published
and then unplublished&lt;/strong>. I have no idea how accurate this blog post is but someone
did see it and bookmarked it. &lt;strong>They recently emailed me to ask where the blog has
disappeared to, so here it is in all its unfinished glory&lt;/strong>.&lt;/p>
&lt;h1 id="install-lxc">Install LXC&lt;/h1>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo pacman -Syy --needed --noconfirm arch-install-scripts bridge-utils lxc netctl
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="netctl-bridge">netctl Bridge&lt;/h1>
&lt;p>The guest containers will connect to the LAN via a bridged network deviced.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo nano /etc/netctl/bridge
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Add the following.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">Description&lt;/span>=&lt;span style="color:#87ceeb">&amp;#34;Bridge&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">Interface&lt;/span>=br0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">Connection&lt;/span>=bridge
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">BindsToInterfaces&lt;/span>=(eth0)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">IP&lt;/span>=dhcp
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0">## sets forward delay time&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">FwdDelay&lt;/span>=&lt;span style="color:#f60">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0">## sets max age of hello message&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0">#MaxAge=10&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Enable and start the bridge.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo netctl enable bridge
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo netctl start bridge
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="creating-containers">Creating Containers&lt;/h1>
&lt;p>I&amp;rsquo;m only interested in running Arch Linux or Debian containers.&lt;/p>
&lt;h2 id="container-configurations">Container Configurations&lt;/h2>
&lt;p>Each container should have a matching configuration file, they look something like this.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>lxc.arch = i686
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>lxc.utsname = myhostname
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>lxc.network.type = veth
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>lxc.network.flags = up
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>lxc.network.link = br0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>lxc.network.ipv4 = 0.0.0.0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>lxc.network.name = eth0
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>lxc.arch&lt;/code> Architecture for the container, valid options are &lt;code>x86&lt;/code>, &lt;code>i686&lt;/code>, &lt;code>x86_64&lt;/code>, &lt;code>amd64&lt;/code>.&lt;/li>
&lt;li>&lt;code>lxc.utsman&lt;/code> Container name, should also be used when naming the configuration file&lt;/li>
&lt;li>&lt;code>lxc_network.type&lt;/code> Type of network virtualization to be used for the
container. The option &lt;code>veth&lt;/code> defines a peer network device. It is created
with one side assigned to the container and the other side is attached to a
bridge by the &lt;code>lxc.network.link&lt;/code> option.&lt;/li>
&lt;li>&lt;code>lxc_network.flags&lt;/code> Network actions. The value &lt;code>up&lt;/code> in this case activates the network.&lt;/li>
&lt;li>&lt;code>lxc.network.link&lt;/code> Host network interface to be used for the container.&lt;/li>
&lt;li>&lt;code>lxc.network.ipv4&lt;/code> IPv4 address assigned to the virtualized interface. Use
the address 0.0.0.0 to make use of DHCP. Use &lt;code>lxc.network.ipv6&lt;/code> if you need
IPv6 support.&lt;/li>
&lt;li>&lt;code>lxc.network.name&lt;/code> Dynamically allocated interface name. This option will
rename the interface in the container.&lt;/li>
&lt;/ul>
&lt;p>More example files can be found in &lt;code>/usr/share/doc/lxc/examples/&lt;/code>.
Find details about all options via &lt;code>man lxc.conf&lt;/code>.&lt;/p>
&lt;h2 id="arch-linux">Arch Linux&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo lxc-create -t archlinux -n arch-01 -f ~/arch-01.conf -- --packages netctl
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>I am unable to get DHCP to work for a Arch Linux LXC container, therefore
my dirty hack is to alway use a statis IP address in the &lt;code>netctl&lt;/code> profile. There
is also a bug (&lt;a href="https://bugs.archlinux.org/task/35715">#35715&lt;/a>) was helpful in
narrowing down the problem, but wasn&amp;rsquo;t the solution in my case. Use
&lt;code>/var/lib/lxc/CONTAIN_NAME/rootfs/etc/netctl/example/ethernet-static&lt;/code> as a template.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo cp /var/lib/lxc/CONTAIN_NAME/rootfs/etc/netctl/example/ethernet-static /var/lib/lxc/CONTAIN_NAME/rootfs/etc/netctl/static
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Modify &lt;code>/var/lib/lxc/CONTAIN_NAME/rootfs/etc/netctl/static&lt;/code> accordingly. Now
create a hook, with the same name as the &lt;code>netctl&lt;/code> profile.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo nano /var/lib/lxc/CONTAIN_NAME/rootfs/etc/netctl/hooks/static
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Add the following.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e5e5e5">#!/usr/bin/env bash
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e5e5e5">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">if&lt;/span> [[ &lt;span style="color:#f00">$(&lt;/span>systemd-detect-virt&lt;span style="color:#f00">)&lt;/span> != none ]]; &lt;span style="color:#f00">then&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eedd82">BindsToInterfaces&lt;/span>=()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eedd82">ForceConnect&lt;/span>=yes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">fi&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Start the container and enable the &lt;code>netctl&lt;/code> profile.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>netctl enable static
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>netctl start static
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="debian-containers">Debian Containers.&lt;/h2>
&lt;p>Install &lt;code>debobootstrap&lt;/code> and &lt;code>dpkg&lt;/code> so that Debian containers can be created.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>packer -S --noedit dpkg debootstrap
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="squeeze">Squeeze&lt;/h3>
&lt;p>Create a Debian container, &lt;code>squeeze&lt;/code> is the default.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo lxc-create -t debian -n squeeze-01 -f ~/squeeze-01.conf
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Change the &lt;code>root&lt;/code> password.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>chroot /var/lib/lxc/squeeze/rootfs/ passwd
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="wheezy">Wheezy&lt;/h3>
&lt;p>Much the same as the Squeeze exaple above but use the following template.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/simonvanderveldt/lxc-debian-wheezy-template">https://github.com/simonvanderveldt/lxc-debian-wheezy-template&lt;/a>&lt;/li>
&lt;/ul>
&lt;h1 id="using-containers">Using containers&lt;/h1>
&lt;p>Start a container&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo lxc-start -d -n CONTAINER_NAME
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Connect to the container and log in:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo lxc-console -n CONTAINER_NAME
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>To halt a container cleanly by the containers initv-system:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo lxc-halt -n CONTAINER_NAME
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Stop and remove your container always with the two steps:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo lxc-stop -n CONTAINER_NAME
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo lxc-destroy -n CONTAINER_NAME
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="references">References&lt;/h4>
&lt;ul>
&lt;li>&lt;a href="http://nurupoga.org/articles/archlinux-on-lxc-with-netctl/">http://nurupoga.org/articles/archlinux-on-lxc-with-netctl/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://bbs.archlinux.org/viewtopic.php?id=164753">https://bbs.archlinux.org/viewtopic.php?id=164753&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://andyortlieb.wordpress.com/2013/03/15/practical-use-of-lxc-in-arch-linux-in-march-of-2013/">http://andyortlieb.wordpress.com/2013/03/15/practical-use-of-lxc-in-arch-linux-in-march-of-2013/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://wiki.archlinux.org/index.php/Linux_Containers">https://wiki.archlinux.org/index.php/Linux_Containers&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://wiki.archlinux.org/index.php/Lxc-systemd">https://wiki.archlinux.org/index.php/Lxc-systemd&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://wiki.archlinux.org/index.php/Netctl">https://wiki.archlinux.org/index.php/Netctl&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.suse.com/documentation/sles11/singlehtml/lxc_quickstart/lxc_quickstart.html">https://www.suse.com/documentation/sles11/singlehtml/lxc_quickstart/lxc_quickstart.html&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://wiki.gentoo.org/wiki/LXC">http://wiki.gentoo.org/wiki/LXC&lt;/a>&lt;/li>
&lt;/ul></description><summary>A rough guide to running Debian containers on Arch Linux with LXC</summary></item><item><title>Installing Nikola on Debian</title><link>https://wimpysworld.com/posts/installing-nikola-on-debian/</link><pubDate>Mon, 31 Mar 2014 16:19:43 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/installing-nikola-on-debian/</guid><description>&lt;p>Nikola is a static site and blog generator written in &lt;a href="http://www.python.org">Python&lt;/a>
that I&amp;rsquo;ve been using for a good while now. This blog post describes how to install
&lt;a href="http://getnikola.com/">Nikola&lt;/a> on Debian. Now, this may look like a long winded way
to install Nikola, given that Debian .deb package exist, but in my opinion it is
the correct way to install Nikola on Debian.&lt;/p>
&lt;h2 id="installing-python">Installing Python&lt;/h2>
&lt;p>First you&amp;rsquo;ll need Python and &lt;a href="http://www.doughellmann.com/projects/virtualenvwrapper/">virtualenvwrapper&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get install libpython2.7 python2.7 python2.7-dev python2.7-minimal
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Remove any &lt;code>apt&lt;/code> installed Python packages that we are about to replace. The
versions of these packages in the Debian repositories soon get stale.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get purge python-setuptools python-virtualenv python-pip python-profiler
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Install &lt;code>pip&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>wget https://bootstrap.pypa.io/get-pip.py
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo python2.7 get-pip.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Use &lt;code>pip&lt;/code> to install &lt;code>virtualenv&lt;/code> and &lt;code>virtualenvwrapper&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo pip install virtualenv --upgrade
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo pip install virtualenvwrapper
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="the-snakepit">The Snakepit&lt;/h2>
&lt;p>Create a &amp;ldquo;Snakepit&amp;rdquo; directory for storing all the virtualenvs.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>mkdir ~/Snakepit
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Add the following your &lt;code>~/.bashrc&lt;/code> to enable &lt;code>virtualenvwrapper&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>export &lt;span style="color:#eedd82">WORKON_HOME&lt;/span>=&lt;span style="color:#87ceeb">${&lt;/span>&lt;span style="color:#eedd82">HOME&lt;/span>&lt;span style="color:#87ceeb">}&lt;/span>/Snakepit
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">if&lt;/span> [ -f /usr/local/bin/virtualenvwrapper.sh ]; &lt;span style="color:#f00">then&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> source /usr/local/bin/virtualenvwrapper.sh
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">elif&lt;/span> [ -f /usr/bin/virtualenvwrapper.sh ]; &lt;span style="color:#f00">then&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> source /usr/bin/virtualenvwrapper.sh
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">fi&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="create-a-virtualenv-for-nikola">Create a virtualenv for Nikola&lt;/h2>
&lt;p>Open a new shell to ensure that the &lt;code>virtualenvwrapper&lt;/code> configuration is active.
The following will create a new virtualenv called &lt;code>nikola&lt;/code> based on Python 2.7.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>mkvirtualenv -p /usr/bin/python2.7 ~/Snakepit/nikola-640
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="working-on-a-virtualenv">Working on a virtualenv&lt;/h3>
&lt;p>To activate an existing virtualenv do the following.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>workon nikola-640
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You can switch to another virtualenv at any time, just use &lt;code>workon envname&lt;/code>.
Your shell prompt will change while a virtualenv is being worked on to
indicate which virtualenv is currently active.&lt;/p>
&lt;p>While working on a virtualenv you can &lt;code>pip&lt;/code> install what you need or manually
install any Python libraries safe in the knowledge you will not adversely
damage any other virtualenvs or the global packages in the process. Very
useful for developing a new branch which may have different library requirements
than the master/head.&lt;/p>
&lt;p>When you are finished working in a virtualenv you can deactivate it by
simply executing &lt;code>deactivate&lt;/code>.&lt;/p>
&lt;h2 id="install-nikola-requirements">Install Nikola requirements&lt;/h2>
&lt;p>Nikola is will be powered by Python 2.7 and some additional packages will
be required.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get install python2.7-dev libfreetype6-dev libjpeg8-dev libxslt1-dev libxml2-dev libyaml-dev
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="what-are-these-requirements-for">What are these requirements for?&lt;/h3>
&lt;ul>
&lt;li>&lt;code>python2.7-dev&lt;/code> provides the header files for Python 2.7 so that Python
modules with C extensions can be built.&lt;/li>
&lt;/ul>
&lt;p>The following are required to build &lt;code>pillow&lt;/code>, the Python imaging library.&lt;/p>
&lt;ul>
&lt;li>&lt;code>libjpeg8-dev&lt;/code>&lt;/li>
&lt;li>&lt;code>libfreetype6-dev&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>The following are required to build &lt;code>lxml&lt;/code>, a Python XML library.&lt;/p>
&lt;ul>
&lt;li>&lt;code>libxml2-dev&lt;/code>&lt;/li>
&lt;li>&lt;code>libxslt1-dev&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>The following are required to build &lt;code>python-coveralls&lt;/code>.&lt;/p>
&lt;ul>
&lt;li>&lt;code>libyaml-dev&lt;/code>&lt;/li>
&lt;/ul>
&lt;h2 id="install-nikola">Install Nikola&lt;/h2>
&lt;p>Download Nikola.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>mkdir -p &lt;span style="color:#87ceeb">${&lt;/span>&lt;span style="color:#eedd82">VIRTUAL_ENV&lt;/span>&lt;span style="color:#87ceeb">}&lt;/span>/src
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cd &lt;span style="color:#87ceeb">${&lt;/span>&lt;span style="color:#eedd82">VIRTUAL_ENV&lt;/span>&lt;span style="color:#87ceeb">}&lt;/span>/src
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>wget https://github.com/getnikola/nikola/archive/v6.4.0.tar.gz -O nikola-640.tar.gz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>tar zxvf nikola-640.tar.gz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cd nikola-6.4.0
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Install the Nikola requirements.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>pip install -r requirements-full.txt
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If you intend to use the Nikola planetoid (Planet generator) plugin you&amp;rsquo;ll also
need to following.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>pip install peewee feedparser
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Actually install nikola.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>python setup.py install
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Nikola is now installed. &lt;code>nikola help&lt;/code> and the &lt;a href="http://getnikola.com/handbook.html">Nikola Handbook&lt;/a>
will assist you from here on.&lt;/p></description><summary>How to install Nikola static site generator on Debian</summary></item><item><title>Memory consumption of Linux desktop environments</title><link>https://wimpysworld.com/posts/memory-consumption-of-linux-desktop-environments/</link><pubDate>Sun, 23 Mar 2014 13:30:27 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/memory-consumption-of-linux-desktop-environments/</guid><description>&lt;div class="alert alert-info">
&lt;strong>Note&lt;/strong> Updated on June 3rd 2014 and now includes LXQt and Unity.
&lt;/div>
&lt;p>For the last 9 months or so I&amp;rsquo;ve spent my spare time working with the
&lt;a href="http://mate-desktop.org">MATE Desktop Team&lt;/a>. Every so often, via the various
on-line MATE communities, the topic of how &lt;em>&amp;ldquo;light weight&amp;rdquo;&lt;/em> MATE is when
compared to other desktop environments crops up and quite often
&lt;a href="http://www.xfce.org/">Xfce&lt;/a> is suggested as a lighter alternative. After all
MATE and Xfce both provide a traditional desktop environment based on GTK+ so
this suggestion is sensible. But is Xfce actually &lt;em>&amp;ldquo;lighter&amp;rdquo;&lt;/em> than MATE?&lt;/p>
&lt;p>I&amp;rsquo;ve found MATE to be (subjectively) more responsive that Xfce and there have
been two recent blog posts that indicate MATE has lower memory requirements than
Xfce.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://l3net.wordpress.com/2013/12/17/four-lightweight-desktops-for-opensuse-13-1/">Four Lightweight Desktops for openSUSE 13.1&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://l3net.wordpress.com/2014/02/15/a-memory-comparison-of-light-linux-desktops-part-3/">A Memory Comparison of Light Linux Desktops – Part 3&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Given that I&amp;rsquo;m comfortably running MATE on the Raspberry Pi Model B (which has
just 512MB RAM) I&amp;rsquo;ve been stating that MATE is well suited for use on resource
constrained hardware and professional workstations alike. This is still true,
but I&amp;rsquo;ve also said that MATE is lighter than Xfce and I might have to eat humble
pie on that one.&lt;/p>
&lt;p>The topic of measursing desktop environment resource use came up on the
&lt;code>#archlinux-tu&lt;/code> IRC channel recently and someone suggested using
&lt;a href="https://github.com/pixelb/ps_mem/">ps_mem.py&lt;/a> to gather the memory usage data.
&lt;code>ps_mem.py&lt;/code> provides a far more robust mechanism for gathering memory usage data
than I&amp;rsquo;ve seen in previous comparisons.&lt;/p>
&lt;p>So the seed was planted, I created a bunch of VirtualBox guest machines and set
to work comparing the memory requirements of all the Linux desktop environments
I could.&lt;/p>
&lt;h2 id="damn-it-just-tell-me-what-the-lightest-desktop-environment-is">Damn it, just tell me what the &amp;ldquo;&lt;em>lightest&lt;/em>&amp;rdquo; desktop environment is!&lt;/h2>
&lt;p>OK, for those of you who just want the final answer, with none of the
explanation, here it is:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Desktop Environment&lt;/th>
&lt;th>Memory Used&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Enlightenment 0.18.8&lt;/td>
&lt;td>83.8 MiB&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>LXDE 0.5.5&lt;/td>
&lt;td>87.0 MiB&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Xfce 4.10.2&lt;/td>
&lt;td>110.0 MiB&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>LXQt 0.7.0&lt;/td>
&lt;td>113.0 MiB&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>MATE 1.8.1&lt;/td>
&lt;td>123.0 MiB&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Cinnamon 2.2.13&lt;/td>
&lt;td>176.3 MiB&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>GNOME3 3.12.2&lt;/td>
&lt;td>245.3 MiB&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>KDE 4.13.1&lt;/td>
&lt;td>302.6 MiB&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Unity 7.2.0.14&lt;/td>
&lt;td>312.5 MiB&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="bullshit-how-did-you-come-up-with-these-numbers">Bullshit! How did you come up with these numbers?&lt;/h2>
&lt;p>All the VirtualBox VMs are 32-bit with 768MB RAM and based on the same core
&lt;a href="http://www.archlinux.org">Arch Linux&lt;/a> installation. I achieved this using my
&lt;a href="https://github.com/flexiondotorg/archinstaller">ArchInstaller&lt;/a> script which is
designed for quickly installing reproducible Arch Linux setups.&lt;/p>
&lt;p>Each VM differs only by the packages that are required for the given desktop
environment. The desktop environments native display manager is also installed
but if it doesn&amp;rsquo;t have one then &lt;code>lightdm&lt;/code> was chosen. LXDE, Xfce, MATE, Cinnamon
and GNOME all have &lt;code>gvfs-smb&lt;/code> installed as this enables accessing Windows and
Samba shares (a common requirement for home and office) in their respective file
managers and the KDE install includes packages to provide equivalent functionality.
You can see the specific desktop environment packages or package groups that were
installed here:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/flexiondotorg/ArchInstaller/tree/master/packages/desktop">https://github.com/flexiondotorg/ArchInstaller/tree/master/packages/desktop&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Each VM was booted, logged in and any initial desktop environment configuration
was completed choosing the default options if prompted. Then &lt;code>ps_mem&lt;/code> was
installed, the VM shut down and a snapshot made.&lt;/p>
&lt;p>Each VM was then started, logged in via the display manager, the desktop
environment was fully loaded and waited for disk activity to settle. Then
&lt;code>ps -efH&lt;/code> and &lt;code>ps_mem&lt;/code> were executed via SSH and the results sent back to my
workstation. When the process and memory collections were conducted there had
been no desktop interaction and no applications had been launched.&lt;/p>
&lt;h2 id="your-numbers-are-wrong-i-can-get-xxx-desktop-to-run-in-yyy-less-memory">Your numbers are wrong I can get &lt;em>xxx&lt;/em> desktop to run in &lt;em>yyy&lt;/em> less memory!&lt;/h2>
&lt;p>Well done, you probably can.&lt;/p>
&lt;p>Each virtual machine has VirtualBox guest additions, OpenSSH, Network Manager,
&lt;code>avahi-daemon&lt;/code>, &lt;code>ntpd&lt;/code>, &lt;code>rpc.statd&lt;/code>, &lt;code>syslog-ng&lt;/code> and various other bits and bobs
installed and running. Some of these are not required or have lighter alternatives
available.&lt;/p>
&lt;p>So, while I freely accept that each desktop environment can be run in less memory,
the results here are relative to a consistent base setup.&lt;/p>
&lt;p>However, what is important to note is that &lt;strong>I think the Cinnamon results are
too low&lt;/strong>. Cinnamon is forked from GNOME3 and the Arch Linux package groups for
Cinnamon only install the core Cinnamon packages but none of the GNOME3
applications or components that would be required to create a full desktop
environment.&lt;/p>
&lt;p>So comparing Cinnamon with the other desktops in this test is not a fair
comparison. For example, GNOME3 and KDE default installs on Arch Linux include
all the accessibility extensions and applications for sight or mobility impaired
individuals where as Cinnamon does not. This is just one example of where I
think the Cinnamon results are skewed.&lt;/p>
&lt;h2 id="the-ram-is-there-to-be-used-is-lighter-actually-better">The RAM is there to be used. Is lighter actually better?&lt;/h2>
&lt;p>No, and Yes.&lt;/p>
&lt;p>I subscribe to the school of thought that RAM is there to be used. But;&lt;/p>
&lt;ul>
&lt;li>I want to preserve as much free RAM for the applications I run, not for feature bloat in the desktop environment. I&amp;rsquo;m looking at you KDE.&lt;/li>
&lt;li>I want a fully integrated desktop experience, but not one that is merely lighter because it lacks features. I&amp;rsquo;m looking at you LXDE.&lt;/li>
&lt;li>I want a consistent user interface that any of my family could use, not one that favours style over substance. I&amp;rsquo;m looking at you Enlightenment.&lt;/li>
&lt;/ul>
&lt;p>Another take on lightness is that the more RAM used, the more code that needs
executing. Therefore, higher CPU utilisation and degraded desktop performance
on modest hardware. This could also translate into degraded battery performance.&lt;/p>
&lt;p>This is why I choose MATE Desktop. It is a fully integrated desktop environment,
that is responsive, feature full, has reasonable memory requirements and scales
from single core armv6h CPU with 512MB RAM to multi core x86_64 CPU with 32GB
RAM (for me at least).&lt;/p>
&lt;h2 id="without-the-full-stats-it-never-happened-prove-it">Without the full stats it never happened. Prove it!&lt;/h2>
&lt;p>He is the full data capture from &lt;code>ps_mem.py&lt;/code> for each desktop environment.&lt;/p>
&lt;h3 id="enlightenment">Enlightenment&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>Private + Shared = RAM used Program
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>172.0 KiB + 46.5 KiB = 218.5 KiB dbus-launch
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>316.0 KiB + 40.0 KiB = 356.0 KiB dhcpcd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>336.0 KiB + 87.5 KiB = 423.5 KiB rpcbind
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>560.0 KiB + 37.0 KiB = 597.0 KiB crond
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>580.0 KiB + 54.0 KiB = 634.0 KiB systemd-logind
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>688.0 KiB + 67.5 KiB = 755.5 KiB systemd-udevd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>480.0 KiB + 276.0 KiB = 756.0 KiB avahi-daemon (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>700.0 KiB + 133.5 KiB = 833.5 KiB ntpd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>768.0 KiB + 78.5 KiB = 846.5 KiB VBoxService
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>580.0 KiB + 267.0 KiB = 847.0 KiB tempget
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>544.0 KiB + 312.0 KiB = 856.0 KiB enlightenment_start
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>764.0 KiB + 94.0 KiB = 858.0 KiB rpc.statd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>600.0 KiB + 280.5 KiB = 880.5 KiB at-spi-bus-launcher
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>624.0 KiB + 298.0 KiB = 922.0 KiB at-spi2-registryd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>724.0 KiB + 309.5 KiB = 1.0 MiB accounts-daemon
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>784.0 KiB + 386.5 KiB = 1.1 MiB enlightenment_fm
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>952.0 KiB + 395.0 KiB = 1.3 MiB efreetd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.0 MiB + 517.0 KiB = 1.5 MiB dbus-daemon (3)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 5.3 MiB + -3781.0 KiB = 1.7 MiB udisksd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.2 MiB + 483.0 KiB = 1.7 MiB (sd-pam) (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.6 MiB + 234.0 KiB = 1.9 MiB syslog-ng
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.1 MiB + 1.0 MiB = 2.1 MiB systemd (3)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.4 MiB + 814.5 KiB = 2.2 MiB lightdm (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.3 MiB + 1.1 MiB = 2.4 MiB sshd (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 2.6 MiB + 575.5 KiB = 3.2 MiB VBoxClient (4)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 2.4 MiB + 781.0 KiB = 3.2 MiB NetworkManager
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 10.9 MiB + -7741.5 KiB = 3.3 MiB polkitd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 6.2 MiB + 68.5 KiB = 6.3 MiB systemd-journald
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 11.3 MiB + -2300.0 KiB = 9.1 MiB nm-applet
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 16.3 MiB + 426.0 KiB = 16.7 MiB Xorg
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 19.9 MiB + 1.5 MiB = 21.4 MiB enlightenment
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>---------------------------------
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 89.6 MiB
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>=================================
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="lxde">LXDE&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span> Private + Shared = RAM used Program
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>184.0 KiB + 45.0 KiB = 229.0 KiB dbus-launch
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>320.0 KiB + 36.0 KiB = 356.0 KiB dhcpcd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>340.0 KiB + 83.0 KiB = 423.0 KiB rpcbind
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>360.0 KiB + 78.0 KiB = 438.0 KiB lxdm-binary
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>384.0 KiB + 93.5 KiB = 477.5 KiB lxsession
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>580.0 KiB + 50.0 KiB = 630.0 KiB systemd-logind
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>700.0 KiB + 55.0 KiB = 755.0 KiB systemd-udevd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>464.0 KiB + 297.0 KiB = 761.0 KiB avahi-daemon (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 4.6 MiB + -3890.5 KiB = 821.5 KiB menu-cached
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>612.0 KiB + 213.0 KiB = 825.0 KiB at-spi-bus-launcher
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>500.0 KiB + 328.0 KiB = 828.0 KiB lxdm-session
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>768.0 KiB + 97.5 KiB = 865.5 KiB rpc.statd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>632.0 KiB + 251.5 KiB = 883.5 KiB gvfsd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>644.0 KiB + 244.5 KiB = 888.5 KiB at-spi2-registryd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>776.0 KiB + 189.0 KiB = 965.0 KiB accounts-daemon
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 4.8 MiB + -3888.5 KiB = 1.0 MiB gvfsd-fuse
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>884.0 KiB + 305.0 KiB = 1.2 MiB gvfsd-trash
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.1 MiB + 322.0 KiB = 1.4 MiB udisksd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.1 MiB + 381.0 KiB = 1.5 MiB upowerd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.1 MiB + 410.0 KiB = 1.5 MiB gvfs-udisks2-volume-monitor
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.0 MiB + 485.5 KiB = 1.5 MiB dbus-daemon (3)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.2 MiB + 507.0 KiB = 1.7 MiB (sd-pam) (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.6 MiB + 259.0 KiB = 1.9 MiB syslog-ng
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.2 MiB + 991.5 KiB = 2.1 MiB systemd (3)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.3 MiB + 1.1 MiB = 2.4 MiB sshd (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.5 MiB + 983.0 KiB = 2.4 MiB lxpolkit
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 6.3 MiB + -3414.0 KiB = 3.0 MiB NetworkManager
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 3.3 MiB + 706.5 KiB = 4.0 MiB openbox
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 4.4 MiB + 59.5 KiB = 4.4 MiB systemd-journald
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 6.9 MiB + -1941.0 KiB = 5.0 MiB lxpanel
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 12.9 MiB + -7745.0 KiB = 5.3 MiB polkitd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 3.6 MiB + 1.8 MiB = 5.4 MiB pcmanfm
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 11.5 MiB + -3637.5 KiB = 8.0 MiB ntpd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 7.1 MiB + 1.8 MiB = 9.0 MiB nm-applet
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 13.9 MiB + 604.5 KiB = 14.5 MiB Xorg
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>---------------------------------
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 87.0 MiB
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>=================================
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="xfce">Xfce&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span> Private + Shared = RAM used Program
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>176.0 KiB + 32.0 KiB = 208.0 KiB dbus-launch
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>292.0 KiB + 26.5 KiB = 318.5 KiB gpg-agent
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>316.0 KiB + 32.0 KiB = 348.0 KiB dhcpcd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>324.0 KiB + 81.0 KiB = 405.0 KiB rpcbind
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>488.0 KiB + 96.0 KiB = 584.0 KiB xfconfd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>588.0 KiB + 47.0 KiB = 635.0 KiB systemd-logind
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>464.0 KiB + 260.0 KiB = 724.0 KiB avahi-daemon (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>712.0 KiB + 49.0 KiB = 761.0 KiB systemd-udevd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>608.0 KiB + 173.0 KiB = 781.0 KiB at-spi-bus-launcher
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>644.0 KiB + 169.5 KiB = 813.5 KiB at-spi2-registryd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>768.0 KiB + 57.5 KiB = 825.5 KiB VBoxService
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>784.0 KiB + 55.5 KiB = 839.5 KiB sh
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>640.0 KiB + 218.5 KiB = 858.5 KiB gvfsd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>764.0 KiB + 94.5 KiB = 858.5 KiB rpc.statd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>760.0 KiB + 160.0 KiB = 920.0 KiB accounts-daemon
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>872.0 KiB + 174.0 KiB = 1.0 MiB gvfsd-fuse
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 4.8 MiB + -3831.0 KiB = 1.1 MiB gvfsd-trash
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.1 MiB + 311.0 KiB = 1.4 MiB upowerd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.1 MiB + 282.0 KiB = 1.4 MiB tumblerd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.1 MiB + 289.0 KiB = 1.4 MiB udisksd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.1 MiB + 369.0 KiB = 1.4 MiB gvfs-udisks2-volume-monitor
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.1 MiB + 353.0 KiB = 1.5 MiB xfce4-notifyd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.2 MiB + 515.0 KiB = 1.7 MiB (sd-pam) (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.3 MiB + 483.5 KiB = 1.8 MiB dbus-daemon (3)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.6 MiB + 248.5 KiB = 1.9 MiB syslog-ng
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.5 MiB + 465.0 KiB = 1.9 MiB Thunar
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 5.4 MiB + -3457.5 KiB = 2.0 MiB lightdm (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.1 MiB + 992.5 KiB = 2.1 MiB systemd (3)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.4 MiB + 695.5 KiB = 2.1 MiB panel-6-systray
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.6 MiB + 651.0 KiB = 2.3 MiB xfce4-session
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.3 MiB + 1.1 MiB = 2.3 MiB sshd (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.9 MiB + 525.0 KiB = 2.4 MiB xfsettingsd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.6 MiB + 903.0 KiB = 2.5 MiB panel-2-actions
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 6.3 MiB + -3505.0 KiB = 2.9 MiB NetworkManager
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 2.6 MiB + 442.5 KiB = 3.0 MiB VBoxClient (4)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 2.6 MiB + 624.5 KiB = 3.2 MiB xfce4-power-manager (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 2.1 MiB + 1.1 MiB = 3.2 MiB xfwm4
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 3.1 MiB + 1.3 MiB = 4.4 MiB xfce4-panel
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 5.0 MiB + 61.5 KiB = 5.0 MiB systemd-journald
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 12.9 MiB + -7827.0 KiB = 5.3 MiB polkitd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 3.8 MiB + 1.6 MiB = 5.4 MiB xfdesktop
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 6.6 MiB + 1.3 MiB = 7.8 MiB nm-applet
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 11.5 MiB + -3643.5 KiB = 7.9 MiB ntpd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 23.0 MiB + -3258.0 KiB = 19.8 MiB Xorg
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>---------------------------------
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 110.0 MiB
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>=================================
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="lxqt">LXQt&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span> Private + Shared = RAM used Program
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>176.0 KiB + 35.0 KiB = 211.0 KiB dbus-launch
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>320.0 KiB + 35.0 KiB = 355.0 KiB dhcpcd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>324.0 KiB + 83.0 KiB = 407.0 KiB rpcbind
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>612.0 KiB + 51.0 KiB = 663.0 KiB systemd-logind
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>460.0 KiB + 267.0 KiB = 727.0 KiB avahi-daemon (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>676.0 KiB + 53.0 KiB = 729.0 KiB systemd-udevd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>580.0 KiB + 179.0 KiB = 759.0 KiB menu-cached (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>768.0 KiB + 63.5 KiB = 831.5 KiB VBoxService
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>604.0 KiB + 247.0 KiB = 851.0 KiB at-spi-bus-launcher
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>768.0 KiB + 96.5 KiB = 864.5 KiB rpc.statd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>648.0 KiB + 231.5 KiB = 879.5 KiB at-spi2-registryd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>4.7 MiB + -3856.0 KiB = 976.0 KiB accounts-daemon
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>908.0 KiB + 396.0 KiB = 1.3 MiB lxqt-globalkeysd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>1.1 MiB + 425.0 KiB = 1.5 MiB upowerd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>1.1 MiB + 484.5 KiB = 1.6 MiB dbus-daemon (3)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>1.2 MiB + 551.0 KiB = 1.7 MiB (sd-pam) (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>1.6 MiB + 248.0 KiB = 1.9 MiB syslog-ng
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>1.1 MiB + 998.5 KiB = 2.1 MiB systemd (3)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>1.3 MiB + 1.0 MiB = 2.3 MiB sshd (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>1.5 MiB + 933.5 KiB = 2.4 MiB lxqt-policykit-agent
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>1.6 MiB + 901.0 KiB = 2.4 MiB lxqt-session
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>1.7 MiB + 837.0 KiB = 2.5 MiB sddm
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2.6 MiB + 456.5 KiB = 3.0 MiB VBoxClient (4)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>6.3 MiB + -3350.0 KiB = 3.1 MiB NetworkManager
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2.4 MiB + 1.5 MiB = 3.8 MiB lxqt-powermanagement
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2.6 MiB + 1.5 MiB = 4.1 MiB lxqt-runner
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>3.4 MiB + 881.0 KiB = 4.3 MiB openbox
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2.7 MiB + 1.8 MiB = 4.5 MiB lxqt-notificationd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>4.7 MiB + 59.5 KiB = 4.7 MiB systemd-journald
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>12.5 MiB + -7812.0 KiB = 4.9 MiB polkitd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>3.8 MiB + 2.2 MiB = 6.0 MiB lxqt-panel
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>11.5 MiB + -3644.5 KiB = 7.9 MiB ntpd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>11.2 MiB + -2581.0 KiB = 8.7 MiB nm-applet
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>12.2 MiB + 366.0 KiB = 12.6 MiB pcmanfm-qt
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>18.2 MiB + -644.0 KiB = 17.6 MiB Xorg
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>---------------------------------
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 113.0 MiB
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>=================================
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="mate">MATE&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span> Private + Shared = RAM used Program
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>248.0 KiB + 57.0 KiB = 305.0 KiB rtkit-daemon
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>316.0 KiB + 31.0 KiB = 347.0 KiB dhcpcd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>344.0 KiB + 81.0 KiB = 425.0 KiB rpcbind
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>388.0 KiB + 80.5 KiB = 468.5 KiB dbus-launch (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 4.4 MiB + -4003.0 KiB = 525.0 KiB dconf-service
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>588.0 KiB + 45.0 KiB = 633.0 KiB systemd-logind
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>552.0 KiB + 117.0 KiB = 669.0 KiB gconfd-2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>456.0 KiB + 259.0 KiB = 715.0 KiB avahi-daemon (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>548.0 KiB + 189.0 KiB = 737.0 KiB gconf-helper
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>692.0 KiB + 47.0 KiB = 739.0 KiB systemd-udevd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>592.0 KiB + 150.5 KiB = 742.5 KiB at-spi-bus-launcher
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>660.0 KiB + 179.5 KiB = 839.5 KiB at-spi2-registryd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>644.0 KiB + 199.5 KiB = 843.5 KiB gvfsd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>768.0 KiB + 92.5 KiB = 860.5 KiB rpc.statd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 4.7 MiB + -3955.0 KiB = 893.0 KiB accounts-daemon
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 4.8 MiB + -3943.5 KiB = 1.0 MiB gvfsd-fuse
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 4.8 MiB + -3854.0 KiB = 1.1 MiB gvfsd-trash
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 5.0 MiB + -3789.0 KiB = 1.3 MiB upowerd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 5.1 MiB + -3817.0 KiB = 1.4 MiB udisksd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.1 MiB + 337.0 KiB = 1.4 MiB gvfs-udisks2-volume-monitor
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.6 MiB + 249.5 KiB = 1.9 MiB syslog-ng
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.6 MiB + 429.0 KiB = 2.0 MiB polkit-mate-authentication-agent-1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 5.4 MiB + -3485.5 KiB = 2.0 MiB lightdm (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.7 MiB + 510.5 KiB = 2.2 MiB dbus-daemon (4)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.3 MiB + 1.0 MiB = 2.3 MiB sshd (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.4 MiB + 1.0 MiB = 2.4 MiB systemd (4)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.8 MiB + 679.5 KiB = 2.4 MiB (sd-pam) (3)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.9 MiB + 570.5 KiB = 2.5 MiB mate-screensaver
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 2.0 MiB + 536.0 KiB = 2.5 MiB mate-session
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.9 MiB + 679.5 KiB = 2.6 MiB notification-area-applet
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 2.1 MiB + 703.0 KiB = 2.8 MiB mate-power-manager
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 2.2 MiB + 596.0 KiB = 2.8 MiB NetworkManager
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 2.7 MiB + 686.5 KiB = 3.4 MiB marco
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 2.6 MiB + 937.5 KiB = 3.5 MiB wnck-applet
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 3.6 MiB + 309.5 KiB = 3.9 MiB pulseaudio
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 2.7 MiB + 1.2 MiB = 3.9 MiB mate-volume-control-applet
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 3.0 MiB + 1.0 MiB = 4.0 MiB clock-applet
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 7.6 MiB + -2931.0 KiB = 4.7 MiB mate-settings-daemon
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 7.7 MiB + -2790.0 KiB = 4.9 MiB mate-panel
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 5.0 MiB + 60.5 KiB = 5.1 MiB systemd-journald
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 13.0 MiB + -7854.0 KiB = 5.3 MiB polkitd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 10.2 MiB + -2592.0 KiB = 7.7 MiB caja
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 11.5 MiB + -3653.5 KiB = 7.9 MiB ntpd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 7.5 MiB + 1.1 MiB = 8.6 MiB nm-applet
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 14.9 MiB + 1.2 MiB = 16.1 MiB Xorg
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>---------------------------------
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 123.0 MiB
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>=================================
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="cinnamon">Cinnamon&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span> Private + Shared = RAM used Program
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>248.0 KiB + 56.0 KiB = 304.0 KiB rtkit-daemon
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>316.0 KiB + 31.0 KiB = 347.0 KiB dhcpcd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>340.0 KiB + 82.0 KiB = 422.0 KiB rpcbind
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 4.4 MiB + -3995.0 KiB = 469.0 KiB dconf-service
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>384.0 KiB + 88.5 KiB = 472.5 KiB dbus-launch (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>576.0 KiB + 44.0 KiB = 620.0 KiB systemd-logind
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>556.0 KiB + 115.0 KiB = 671.0 KiB gconfd-2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>452.0 KiB + 258.0 KiB = 710.0 KiB avahi-daemon (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>544.0 KiB + 185.0 KiB = 729.0 KiB gconf-helper
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>596.0 KiB + 174.5 KiB = 770.5 KiB at-spi-bus-launcher
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>656.0 KiB + 170.5 KiB = 826.5 KiB at-spi2-registryd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>800.0 KiB + 47.0 KiB = 847.0 KiB systemd-udevd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>640.0 KiB + 208.5 KiB = 848.5 KiB gvfsd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>768.0 KiB + 88.5 KiB = 856.5 KiB rpc.statd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 4.7 MiB + -3946.0 KiB = 910.0 KiB accounts-daemon
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 4.8 MiB + -3938.5 KiB = 1.0 MiB gvfsd-fuse
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 4.8 MiB + -3847.0 KiB = 1.1 MiB gvfsd-trash
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 5.0 MiB + -3818.0 KiB = 1.3 MiB upowerd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 5.1 MiB + -3819.0 KiB = 1.4 MiB udisksd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.1 MiB + 340.0 KiB = 1.4 MiB gvfs-udisks2-volume-monitor
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.1 MiB + 303.0 KiB = 1.4 MiB cupsd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.3 MiB + 394.0 KiB = 1.7 MiB csd-printer
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.6 MiB + 198.5 KiB = 1.8 MiB syslog-ng
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.4 MiB + 599.5 KiB = 2.0 MiB lightdm (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.6 MiB + 513.5 KiB = 2.1 MiB dbus-daemon (4)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.3 MiB + 979.0 KiB = 2.2 MiB sshd (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.4 MiB + 1.0 MiB = 2.4 MiB systemd (4)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.9 MiB + 784.5 KiB = 2.6 MiB (sd-pam) (3)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 6.2 MiB + -3555.0 KiB = 2.7 MiB NetworkManager
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 6.6 MiB + -3794.5 KiB = 2.9 MiB colord
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 2.7 MiB + 713.5 KiB = 3.4 MiB polkit-gnome-authentication-agent-1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 2.8 MiB + 805.0 KiB = 3.6 MiB cinnamon-screensaver
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 3.6 MiB + 341.5 KiB = 3.9 MiB pulseaudio
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 3.2 MiB + 826.5 KiB = 4.0 MiB cinnamon-session
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 4.9 MiB + 56.5 KiB = 5.0 MiB systemd-journald
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 13.2 MiB + -7890.0 KiB = 5.4 MiB polkitd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 3.9 MiB + 2.1 MiB = 6.0 MiB nm-applet
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 5.5 MiB + 2.0 MiB = 7.5 MiB cinnamon-settings-daemon
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 11.4 MiB + -3668.5 KiB = 7.9 MiB ntpd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 8.2 MiB + 1.1 MiB = 9.3 MiB cinnamon-launch
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 7.7 MiB + 2.0 MiB = 9.8 MiB nemo
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 21.2 MiB + -527.5 KiB = 20.7 MiB Xorg
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 85.9 MiB + -34668.5 KiB = 52.1 MiB cinnamon
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>---------------------------------
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 176.3 MiB
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>=================================
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="gnome3">GNOME3&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span> Private + Shared = RAM used Program
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>180.0 KiB + 34.0 KiB = 214.0 KiB dbus-launch
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>276.0 KiB + 14.0 KiB = 290.0 KiB ssh-agent
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>248.0 KiB + 51.0 KiB = 299.0 KiB rtkit-daemon
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>312.0 KiB + 28.0 KiB = 340.0 KiB dhcpcd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>324.0 KiB + 21.5 KiB = 345.5 KiB systemd-hostnamed
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>328.0 KiB + 20.0 KiB = 348.0 KiB systemd-localed
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>324.0 KiB + 80.0 KiB = 404.0 KiB rpcbind
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>580.0 KiB + 52.5 KiB = 632.5 KiB bluetoothd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>604.0 KiB + 40.0 KiB = 644.0 KiB systemd-logind
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>556.0 KiB + 109.0 KiB = 665.0 KiB gconfd-2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>452.0 KiB + 252.0 KiB = 704.0 KiB avahi-daemon (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>680.0 KiB + 44.0 KiB = 724.0 KiB systemd-udevd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>548.0 KiB + 182.0 KiB = 730.0 KiB gconf-helper
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 4.6 MiB + -3950.5 KiB = 765.5 KiB at-spi2-registryd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>596.0 KiB + 185.0 KiB = 781.0 KiB at-spi-bus-launcher
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>768.0 KiB + 50.5 KiB = 818.5 KiB VBoxService
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>696.0 KiB + 146.5 KiB = 842.5 KiB gvfsd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>768.0 KiB + 86.5 KiB = 854.5 KiB rpc.statd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 4.8 MiB + -3960.0 KiB = 960.0 KiB accounts-daemon
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>852.0 KiB + 137.5 KiB = 989.5 KiB gvfsd-fuse
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>792.0 KiB + 267.0 KiB = 1.0 MiB zeitgeist-daemon
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 5.1 MiB + -3910.5 KiB = 1.3 MiB gdm
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 5.0 MiB + -3853.0 KiB = 1.3 MiB upowerd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.0 MiB + 291.0 KiB = 1.3 MiB gvfs-udisks2-volume-monitor
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 5.1 MiB + -3877.0 KiB = 1.3 MiB udisksd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.1 MiB + 286.0 KiB = 1.4 MiB cupsd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.4 MiB + 133.0 KiB = 1.5 MiB gnome-keyring-daemon
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.1 MiB + 448.0 KiB = 1.5 MiB gdm-session-worker
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.3 MiB + 359.0 KiB = 1.7 MiB gsd-printer
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.2 MiB + 509.0 KiB = 1.7 MiB (sd-pam) (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.6 MiB + 192.5 KiB = 1.8 MiB syslog-ng
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.3 MiB + 648.0 KiB = 1.9 MiB mission-control-5
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 5.6 MiB + -3676.5 KiB = 2.0 MiB gnome-session
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.1 MiB + 984.5 KiB = 2.1 MiB systemd (3)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.5 MiB + 573.5 KiB = 2.1 MiB zeitgeist-datahub
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.3 MiB + 953.0 KiB = 2.2 MiB sshd (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 6.1 MiB + -3700.5 KiB = 2.5 MiB colord
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 6.1 MiB + -3656.0 KiB = 2.5 MiB NetworkManager
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 2.2 MiB + 466.0 KiB = 2.6 MiB dbus-daemon (3)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 2.0 MiB + 728.5 KiB = 2.7 MiB gnome-shell-calendar-server
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 2.6 MiB + 491.5 KiB = 3.1 MiB VBoxClient (4)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 2.5 MiB + 1.0 MiB = 3.5 MiB evolution-source-registry
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 6.5 MiB + -2914.5 KiB = 3.6 MiB tracker-extract
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 3.5 MiB + 338.5 KiB = 3.9 MiB pulseaudio
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 6.7 MiB + -2828.5 KiB = 3.9 MiB tracker-miner-fs
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 3.4 MiB + 2.1 MiB = 5.5 MiB goa-daemon
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 13.3 MiB + -7973.0 KiB = 5.5 MiB polkitd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 4.9 MiB + 728.0 KiB = 5.7 MiB tracker-store
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 6.1 MiB + 51.5 KiB = 6.2 MiB systemd-journald
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 4.2 MiB + 2.1 MiB = 6.3 MiB nm-applet
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 11.4 MiB + -3668.5 KiB = 7.9 MiB ntpd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 10.1 MiB + -1729.0 KiB = 8.4 MiB gnome-settings-daemon
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 8.1 MiB + 1.7 MiB = 9.8 MiB Xorg
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 10.7 MiB + -816.5 KiB = 9.9 MiB evolution-alarm-notify
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 24.6 MiB + 1.1 MiB = 25.7 MiB evolution-calendar-factory
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>143.2 MiB + -56658.5 KiB = 87.9 MiB gnome-shell
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>---------------------------------
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 245.3 MiB
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>=================================
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="kde">KDE&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span> Private + Shared = RAM used Program
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 72.0 KiB + 8.0 KiB = 80.0 KiB start_kdeinit
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 80.0 KiB + 13.5 KiB = 93.5 KiB kwrapper4
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>128.0 KiB + 23.0 KiB = 151.0 KiB agetty
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>176.0 KiB + 28.0 KiB = 204.0 KiB dbus-launch
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>292.0 KiB + 28.5 KiB = 320.5 KiB gpg-agent
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>320.0 KiB + 28.0 KiB = 348.0 KiB dhcpcd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>272.0 KiB + 84.0 KiB = 356.0 KiB cat (4)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>340.0 KiB + 79.0 KiB = 419.0 KiB rpcbind
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>604.0 KiB + 39.0 KiB = 643.0 KiB systemd-logind
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>464.0 KiB + 247.0 KiB = 711.0 KiB avahi-daemon (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>768.0 KiB + 87.5 KiB = 855.5 KiB rpc.statd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>852.0 KiB + 51.5 KiB = 903.5 KiB startkde
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>352.0 KiB + 669.0 KiB = 1.0 MiB systemd-udevd (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>656.0 KiB + 524.5 KiB = 1.2 MiB kdm (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.1 MiB + 420.0 KiB = 1.5 MiB upowerd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>852.0 KiB + 780.0 KiB = 1.6 MiB klauncher
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.3 MiB + 346.0 KiB = 1.7 MiB udisksd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.5 MiB + 256.5 KiB = 1.8 MiB akonadi_control
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.3 MiB + 529.0 KiB = 1.8 MiB (sd-pam) (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.6 MiB + 201.5 KiB = 1.8 MiB syslog-ng
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.5 MiB + 409.5 KiB = 1.9 MiB dbus-daemon (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.2 MiB + 971.5 KiB = 2.1 MiB systemd (3)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>656.0 KiB + 1.5 MiB = 2.2 MiB kdeinit4
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.3 MiB + 997.0 KiB = 2.3 MiB sshd (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.3 MiB + 1.6 MiB = 2.9 MiB kio_trash (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 2.1 MiB + 1.1 MiB = 3.2 MiB klipper
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 6.9 MiB + -3587.0 KiB = 3.4 MiB NetworkManager
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 2.4 MiB + 1.0 MiB = 3.5 MiB ksmserver
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 3.2 MiB + 594.5 KiB = 3.8 MiB kuiserver
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 3.2 MiB + 952.5 KiB = 4.1 MiB kglobalaccel
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 3.4 MiB + 829.5 KiB = 4.2 MiB akonadi_migration_agent
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 3.4 MiB + 837.5 KiB = 4.3 MiB polkit-kde-authentication-agent-1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 3.8 MiB + 716.5 KiB = 4.5 MiB knotify4
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 4.4 MiB + 49.5 KiB = 4.5 MiB systemd-journald
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 3.8 MiB + 891.0 KiB = 4.7 MiB baloo_file
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 3.8 MiB + 975.0 KiB = 4.7 MiB akonadi_maildispatcher_agent
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 3.8 MiB + 983.0 KiB = 4.7 MiB akonadi_baloo_indexer
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 4.1 MiB + 1.3 MiB = 5.4 MiB akonadi_newmailnotifier_agent
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 4.3 MiB + 1.1 MiB = 5.4 MiB korgac
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 13.2 MiB + -7804.0 KiB = 5.6 MiB polkitd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 5.5 MiB + 1.7 MiB = 7.1 MiB akonadi_notes_agent
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 11.1 MiB + -3575.0 KiB = 7.6 MiB kactivitymanagerd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 5.6 MiB + 2.1 MiB = 7.7 MiB akonadi_sendlater_agent
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 11.4 MiB + -3697.5 KiB = 7.8 MiB ntpd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 7.2 MiB + 777.5 KiB = 8.0 MiB akonadiserver
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 6.0 MiB + 2.9 MiB = 8.9 MiB akonadi_archivemail_agent
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 6.3 MiB + 2.6 MiB = 8.9 MiB kmix
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 6.1 MiB + 2.9 MiB = 9.0 MiB akonadi_mailfilter_agent
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 6.9 MiB + 2.4 MiB = 9.3 MiB kded4
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 9.1 MiB + 2.7 MiB = 11.7 MiB akonadi_agent_launcher (3)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 13.8 MiB + -1069.5 KiB = 12.8 MiB kwin
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 13.2 MiB + 3.2 MiB = 16.5 MiB krunner
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 68.8 MiB + -49024.0 KiB = 21.0 MiB mysqld
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 30.3 MiB + -2270.0 KiB = 28.1 MiB Xorg
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 36.9 MiB + 6.8 MiB = 43.7 MiB plasma-desktop
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>---------------------------------
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 302.6 MiB
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>=================================
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="unity">Unity&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span> Private + Shared = RAM used Program
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 92.0 KiB + 14.0 KiB = 106.0 KiB cat
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>128.0 KiB + 21.0 KiB = 149.0 KiB agetty
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>180.0 KiB + 28.0 KiB = 208.0 KiB dbus-launch
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>252.0 KiB + 47.0 KiB = 299.0 KiB rtkit-daemon
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>312.0 KiB + 27.0 KiB = 339.0 KiB dhcpcd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>324.0 KiB + 18.0 KiB = 342.0 KiB systemd-localed
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>336.0 KiB + 21.0 KiB = 357.0 KiB systemd-timedated
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>344.0 KiB + 79.0 KiB = 423.0 KiB rpcbind
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>412.0 KiB + 69.0 KiB = 481.0 KiB dconf-service
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>592.0 KiB + 39.0 KiB = 631.0 KiB systemd-logind
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>588.0 KiB + 92.5 KiB = 680.5 KiB indicator-messages-service
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>448.0 KiB + 245.0 KiB = 693.0 KiB avahi-daemon (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>604.0 KiB + 89.5 KiB = 693.5 KiB indicator-bluetooth-service
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>548.0 KiB + 168.0 KiB = 716.0 KiB gconf-helper
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 4.6 MiB + -3955.0 KiB = 725.0 KiB at-spi-bus-launcher
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>684.0 KiB + 42.0 KiB = 726.0 KiB systemd-udevd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>640.0 KiB + 100.0 KiB = 740.0 KiB gconfd-2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>636.0 KiB + 115.5 KiB = 751.5 KiB at-spi2-registryd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>652.0 KiB + 144.5 KiB = 796.5 KiB indicator-power-service
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>648.0 KiB + 158.5 KiB = 806.5 KiB gvfsd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>772.0 KiB + 45.5 KiB = 817.5 KiB VBoxService
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>768.0 KiB + 85.5 KiB = 853.5 KiB rpc.statd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>796.0 KiB + 122.0 KiB = 918.0 KiB accounts-daemon
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>568.0 KiB + 391.5 KiB = 959.5 KiB (sd-pam)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 4.8 MiB + -3982.5 KiB = 969.5 KiB gvfsd-fuse
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>824.0 KiB + 253.0 KiB = 1.1 MiB dbus (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>828.0 KiB + 271.0 KiB = 1.1 MiB zeitgeist-daemon
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 4.9 MiB + -3904.0 KiB = 1.1 MiB gvfsd-trash
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.0 MiB + 131.5 KiB = 1.2 MiB indicator-session-service
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 5.0 MiB + -3883.0 KiB = 1.2 MiB upowerd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.1 MiB + 237.0 KiB = 1.3 MiB cupsd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.1 MiB + 279.0 KiB = 1.4 MiB gvfs-udisks2-volume-monitor
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 5.1 MiB + -3857.0 KiB = 1.4 MiB udisksd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.1 MiB + 324.5 KiB = 1.4 MiB zeitgeist-fts
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 5.1 MiB + -3833.0 KiB = 1.4 MiB indicator-application-service
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.2 MiB + 382.0 KiB = 1.6 MiB indicator-sound-service
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.6 MiB + 174.5 KiB = 1.8 MiB syslog-ng
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 5.6 MiB + -3769.0 KiB = 1.9 MiB gnome-session
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>932.0 KiB + 1.0 MiB = 1.9 MiB systemd (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.4 MiB + 537.0 KiB = 2.0 MiB lightdm (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.4 MiB + 753.0 KiB = 2.1 MiB mission-control-5
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.3 MiB + 936.0 KiB = 2.2 MiB sshd (2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 1.8 MiB + 531.0 KiB = 2.3 MiB zeitgeist-datahub
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 6.2 MiB + -3779.0 KiB = 2.5 MiB colord
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 2.2 MiB + 458.5 KiB = 2.6 MiB dbus-daemon (3)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 6.2 MiB + -3682.0 KiB = 2.6 MiB NetworkManager
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 2.3 MiB + 515.0 KiB = 2.8 MiB gnome-fallback-mount-helper
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 2.3 MiB + 485.0 KiB = 2.8 MiB polkit-gnome-authentication-agent-1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 2.4 MiB + 514.0 KiB = 2.9 MiB notify-osd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 2.5 MiB + 417.5 KiB = 3.0 MiB VBoxClient (4)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 2.6 MiB + 547.5 KiB = 3.1 MiB indicator-keyboard-service
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 2.7 MiB + 657.0 KiB = 3.3 MiB indicator-printers-service
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 2.7 MiB + 854.0 KiB = 3.5 MiB telepathy-indicator
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 2.5 MiB + 1.1 MiB = 3.6 MiB evolution-source-registry
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 3.1 MiB + 577.0 KiB = 3.7 MiB bamfdaemon
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 3.6 MiB + 306.5 KiB = 3.9 MiB pulseaudio
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 3.0 MiB + 933.0 KiB = 3.9 MiB indicator-datetime-service
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 3.9 MiB + 1.3 MiB = 5.3 MiB unity-panel-service
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 13.2 MiB + -7982.0 KiB = 5.4 MiB polkitd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 4.4 MiB + 1.8 MiB = 6.1 MiB nm-applet
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 6.1 MiB + 747.0 KiB = 6.9 MiB goa-daemon
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 7.3 MiB + 50.5 KiB = 7.3 MiB systemd-journald
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 11.4 MiB + -3690.5 KiB = 7.8 MiB ntpd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 5.3 MiB + 4.5 MiB = 9.8 MiB gnome-settings-daemon
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 11.6 MiB + 1.0 MiB = 12.6 MiB nautilus
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 24.7 MiB + 1.2 MiB = 25.8 MiB evolution-calendar-factory
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 40.2 MiB + -351.0 KiB = 39.9 MiB Xorg
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>103.2 MiB + -4818.0 KiB = 98.5 MiB compiz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>---------------------------------
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 312.5 MiB
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>=================================
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="final-thoughts">Final thoughts&lt;/h2>
&lt;p>On Arch Linux at least, Xfce has lower resource requirements than MATE.
When I said different in the past I was wrong, unless you use openSUSE
in which case I was probably right, maybe.&lt;/p></description><summary>Comparing desktop environment memory usage with ps_mem</summary></item><item><title>openSUSE</title><link>https://wimpysworld.com/projects/opensuse/</link><pubDate>Sat, 01 Feb 2014 00:00:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/projects/opensuse/</guid><description>&lt;p>Mentored three students for the &lt;a href="https://www.google-melange.com/gsoc/org2/google/gsoc2014/opensuse">openSUSE 2014 Google Summer of Code&lt;/a>.
All three students successfully completed their projects for the
&lt;a href="https://mate-desktop.org">MATE Desktop&lt;/a>.&lt;/p>
&lt;ul>
&lt;li>Organisation: &lt;a href="http://www.opensuse.org">openSUSE&lt;/a>&lt;/li>
&lt;li>Date: February 2014 - August 2014&lt;/li>
&lt;li>Role: Student mentor&lt;/li>
&lt;/ul></description><summary>Student mentor for Google Summer of Code 2014</summary></item><item><title>LINUX Unplugged</title><link>https://wimpysworld.com/projects/linux-unplugged/</link><pubDate>Wed, 01 Jan 2014 00:00:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/projects/linux-unplugged/</guid><description>&lt;p>&lt;a href="https://linuxunplugged.com/">LINUX Unplugged&lt;/a> is
a weekly show, by &lt;a href="https://www.jupiterbroadcasting.com/">Jupiter Broadcasting&lt;/a>,
that debates and discusses developments and goings on in the Linux community. I
joined as a regular contributor in January 2014.&lt;/p>
&lt;ul>
&lt;li>Organisation: &lt;a href="https://www.jupiterbroadcasting.com/">Jupiter Broadcasting&lt;/a>&lt;/li>
&lt;li>Date: January 2014 - February 2021&lt;/li>
&lt;li>Role: Talking Head&lt;/li>
&lt;/ul></description><summary>Weekly Linux talk show with no script, no limits and tons of opinion</summary></item><item><title>Arch Linux</title><link>https://wimpysworld.com/projects/arch-linux/</link><pubDate>Sun, 01 Dec 2013 00:00:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/projects/arch-linux/</guid><description>&lt;p>&lt;a href="https://archlinux.org">Arch Linux &lt;/a> is a Linux distribution that uses a rolling
release model, such that a regular system update is all that is needed to obtain
all the latest software. The design approach follows the KISS principle
(&lt;i>&amp;ldquo;keep it simple, stupid&amp;rdquo;&lt;/i>) and focuses on elegance, code correctness,
minimalism and simplicity.&lt;/p>
&lt;ul>
&lt;li>Organisation: &lt;a href="https://archlinux.org">Arch Linux &lt;/a>&lt;/li>
&lt;li>Date: December 2013 - December 2016&lt;/li>
&lt;li>Role: Trusted user &amp;amp; Package maintainer&lt;/li>
&lt;/ul></description><summary>Arch Linux Trusted User &amp;amp; Package maintainer</summary></item><item><title>Linux Mint LMDE on Hybrid Disk Laptop</title><link>https://wimpysworld.com/posts/linux-mint-lmde-on-hybrid-disk-laptop/</link><pubDate>Wed, 28 Aug 2013 20:10:09 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/linux-mint-lmde-on-hybrid-disk-laptop/</guid><description>&lt;p>I have an old Thinkpad T43p that I am trying to extend the life of. So I recently
fitted a cheap 60GB IDE Solid State Drive (SSD) and put a 320GB SATA Hard Disk
Drive (HDD) in the Ultrabay. This is not a true hybrid disk, but the principles
are similar. The root partition will go on the SDD (for performance) and the
home partition will be located on the HDD (for capacity).&lt;/p>
&lt;p>I&amp;rsquo;ve been running &lt;a href="http://www.archlinux.org">Arch Linux&lt;/a> on the T43p and the SDD
improves system responsiveness and boot time considerably, especially when using
&lt;a href="http://en.wikipedia.org/wiki/F2FS">F2FS&lt;/a> or
&lt;a href="https://btrfs.wiki.kernel.org/index.php/Main_Page">btrfs&lt;/a> (with LZO
compression and SSD mount options) on the root filesystem.&lt;/p>
&lt;p>I am also testing &lt;a href="http://www.linuxmint.com/download_lmde.php">Linux Mint Debian Edition&lt;/a> (LMDE)
with the &lt;a href="http://mate-desktop.org/">MATE Desktop&lt;/a> desktop to determine if this
is a suitable operating system for my family to use. It appears they find
&lt;a href="http://www.gnome.org/gnome-3/">GNOME 3&lt;/a> confusing and would prefer a familiar
desktop experience.&lt;/p>
&lt;p>While testing LMDE 201203 I ran into a few issues, so I&amp;rsquo;ve decided to capture
my notes here for future reference.&lt;/p>
&lt;h1 id="fix-the-installer">Fix the installer&lt;/h1>
&lt;p>In order to install LMDE using partitions on multiple drives you must
use the ADVANCED USER install mode. However, the ADVANCED USER install mode
has a bug that prevents the installer from completing, so that needs to be
fixed first.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo nano /usr/lib/live-installer/frontend/gtk_interface.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Find the following on line 1765.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>self.wTree.get_widget(&lt;span style="color:#87ceeb">&amp;#34;button_next&amp;#34;&lt;/span>).show()
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>After it add the following line, making sure the indentation is correct.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>self.wTree.get_widget(&lt;span style="color:#87ceeb">&amp;#34;button_next&amp;#34;&lt;/span>).set_sensitive(&lt;span style="color:#f00">True&lt;/span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="installing-lmde">Installing LMDE&lt;/h1>
&lt;ul>
&lt;li>Double click the &lt;code>Install Linux Mint&lt;/code> icon on the desktop.&lt;/li>
&lt;li>Select your &lt;em>Language&lt;/em> and click &lt;code>Forward&lt;/code>.&lt;/li>
&lt;li>Select your &lt;em>Timezone&lt;/em> and click &lt;code>Forward&lt;/code>.&lt;/li>
&lt;li>Select your &lt;em>Keyboard layout&lt;/em> and click &lt;code>Forward&lt;/code>.&lt;/li>
&lt;li>Enter your &lt;em>User info&lt;/em> and click &lt;code>Forward&lt;/code>.&lt;/li>
&lt;li>From the &lt;em>Hard drive&lt;/em> window Select &lt;code>Manually mount partitions (ADVANCED USERS ONLY)&lt;/code> and click &lt;code>Forward&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>The &lt;em>Please make sure you wish to manually manage partitions&lt;/em> window will
appear. On my system the SSD is detected on &lt;code>/dev/sda&lt;/code> and the HDD is detected
on &lt;code>/dev/sdb&lt;/code>. Start &lt;code>GParted&lt;/code> and partition and format the drives as follows.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span> /dev/sda1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Size: 256MiB
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Create as: Primary Partition
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> File system: ext4
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Label: boot
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> /dev/sda2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Size: 2048MiB (or the size you prefer)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Create as: Primary Partition
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> File system: linux-swap
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Label: swap
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> /dev/sda3
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Size: Remainder
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Create as: Primary Partition
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> File system: btrfs
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Label: root
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> /dev/sdb1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Size: All
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Create as: Primary Partition
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> File system: ext4
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Label: home
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Apply the changes and close GParted.&lt;/p>
&lt;p>I use ext4 for the &lt;code>/boot&lt;/code> partition because GRUB can&amp;rsquo;t currently boot from btrfs
in LMDE. I use ext4 for &lt;code>/home&lt;/code> because it offers the best performance on rotational
drives on my Thinkpad T43p. I use btrfs on the &lt;code>/root&lt;/code> partition because performs
best (by some margin) on solid state drives in my Thinkpad T43p.&lt;/p>
&lt;p>The filesystems need mounting under &lt;code>/target&lt;/code> so the installer can install the
OS. Open a Terminal and do the following.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo mkdir /target
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo mount -t btrfs -o &lt;span style="color:#eedd82">compress&lt;/span>=lzo,ssd /dev/disk/by-label/root /target
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo mkdir /target/{boot,home}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo mount -t ext4 /dev/disk/by-label/boot /target/boot
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo mount -t ext4 /dev/disk/by-label/home /target/home
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Return to the Linux Mint Debian Installer.&lt;/p>
&lt;ul>
&lt;li>Click &lt;code>Forward&lt;/code>.&lt;/li>
&lt;li>From the &lt;em>Advanced options&lt;/em> check &lt;code>Install GRUB&lt;/code> and select &lt;code>/dev/sda&lt;/code>. Click &lt;code>Forward&lt;/code>.&lt;/li>
&lt;li>Confirm the &lt;em>Summary&lt;/em> is correct and click &lt;code>Install&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>Time for a cup of tea while the install runs. A pop-up, titled &lt;em>Installation
Paused&lt;/em>, will appear. Click &lt;code>OK&lt;/code>.&lt;/p>
&lt;h2 id="create-targetetcfstab">Create &lt;code>/target/etc/fstab&lt;/code>&lt;/h2>
&lt;p>Do as the installer says and create &lt;code>/target/etc/fstab&lt;/code>. Open a Terminal.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo nano /target/etc/fstab
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The following &lt;code>fstab&lt;/code> works for my T43p.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span># /etc/fstab: static file system information.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>#
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># &amp;lt;file system&amp;gt; &amp;lt;mount point&amp;gt; &amp;lt;type&amp;gt; &amp;lt;options&amp;gt; &amp;lt;dump&amp;gt; &amp;lt;pass&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>proc /proc proc defaults 0 0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>LABEL=root / btrfs defaults,noatime,compress=lzo,ssd 0 1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>LABEL=boot /boot ext4 defaults,noatime 0 2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>LABEL=home /home ext4 defaults,relatime 0 2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>LABEL=swap none swap sw 0 0
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="upgrade-mate-16-and-remove-legacy-mate-14-packages">Upgrade MATE 1.6 and remove legacy MATE 1.4 packages&lt;/h2>
&lt;p>MATE 1.6 has been released for LMDE 201203 so it is a good idea to upgrade
and remove legacy packages before the first boot to ensure a clean
configuration. Open a Terminal.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo chroot /target
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>apt-get update
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>apt-get install apt-show-versions
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>apt-get dist-upgrade
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Some MATE 1.4 packages will be left behind that are no longer required. The
following can help identify them.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>apt-show-versions | grep 1&lt;span style="color:#87ceeb">\.&lt;/span>4&lt;span style="color:#87ceeb">\.&lt;/span>[0-9]&lt;span style="color:#87ceeb">\-&lt;/span>[0-9]&lt;span style="color:#87ceeb">\+&lt;/span>wheezy | cut -f1 -d&lt;span style="color:#87ceeb">&amp;#39; &amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Purge the old MATE 1.4 packages.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">PKGS&lt;/span>=&lt;span style="color:#87ceeb">`&lt;/span>apt-show-versions | grep 1&lt;span style="color:#87ceeb">\.&lt;/span>4&lt;span style="color:#87ceeb">\.&lt;/span>[0-9]&lt;span style="color:#87ceeb">\-&lt;/span>[0-9]&lt;span style="color:#87ceeb">\+&lt;/span>wheezy | cut -f1 -d&lt;span style="color:#87ceeb">&amp;#39; &amp;#39;&lt;/span>&lt;span style="color:#87ceeb">`&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>apt-get purge &lt;span style="color:#87ceeb">${&lt;/span>&lt;span style="color:#eedd82">PKGS&lt;/span>&lt;span style="color:#87ceeb">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Exit the &lt;code>chroot&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>exit
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="finish-the-install">Finish the install&lt;/h2>
&lt;p>Return to the Linux Mint Debian Installer.&lt;/p>
&lt;ul>
&lt;li>Click &lt;code>Forward&lt;/code>.&lt;/li>
&lt;li>Some final installation steps will now complete.&lt;/li>
&lt;li>A pop-up, titled &lt;em>Installation finished&lt;/em>, will appear. Click &lt;code>Yes&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>Your computer will reboot and start LMDE.&lt;/p>
&lt;h4 id="references">References&lt;/h4>
&lt;ul>
&lt;li>&lt;a href="http://forums.linuxmint.com/viewtopic.php?f=189&amp;amp;t=129381">http://forums.linuxmint.com/viewtopic.php?f=189&amp;amp;t=129381&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://forums.linuxmint.com/viewtopic.php?f=185&amp;amp;t=143547">http://forums.linuxmint.com/viewtopic.php?f=185&amp;amp;t=143547&lt;/a>&lt;/li>
&lt;/ul></description><summary>Installing Linux Mint Debian Edition (LMDE) on a Laptop with Hybrid Disk</summary></item><item><title>Plex Media Server on Open Media Vault</title><link>https://wimpysworld.com/posts/plex-media-server-on-open-media-vault/</link><pubDate>Tue, 27 Aug 2013 21:11:43 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/plex-media-server-on-open-media-vault/</guid><description>&lt;p>I&amp;rsquo;ve recently started using &lt;a href="http://www.plexapp.com">Plex Media Server&lt;/a> to
handle most media streaming duties around the house. I run in on
&lt;a href="http://www.openmediavault.org">Open Media Vault&lt;/a> 0.5.x. At the time of writing
Open Media Vault is based on &lt;a href="http://www.debian.org">Debian&lt;/a> (Squeeze) 6.0.&lt;/p>
&lt;h1 id="plex-media-server">Plex Media Server&lt;/h1>
&lt;p>Anyway, it turns out that installing Plex Media Server on Open Media Vault is
super simple thanks to the &lt;a href="http://forums.plexapp.com/index.php/topic/51427-plex-media-server-for-debian/">hard work of Christian Svedin&lt;/a>
who has packaged everything and made it available via an &lt;code>apt&lt;/code> repository.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get install curl
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>echo &lt;span style="color:#87ceeb">&amp;#34;deb http://shell.ninthgate.se/packages/debian squeeze main&amp;#34;&lt;/span> | sudo tee -a /etc/apt/sources.list.d/plexmediaserver.list
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl http://shell.ninthgate.se/packages/shell-ninthgate-se-keyring.key | sudo apt-key add -
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get update
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get install plexmediaserver
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The instructions above also work for Debian Wheezy, just change &lt;code>squeeze&lt;/code> to
&lt;code>wheezy&lt;/code> in &lt;code>/etc/apt/sources.list.d/plexmediaserver.list&lt;/code>.&lt;/p>
&lt;p>When the install is complete point your browser at Plex/Web, for example:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://plex.example.org:32400/web">http://plex.example.org:32400/web&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Replace &lt;code>plex.example.org&lt;/code> with your Plex Media Server hostname/ip address.&lt;/p>
&lt;p>If you have PlexPass then head over to the &lt;a href="http://forums.plexapp.com/index.php/topic/48865-debian-package/">Preview Releases for Debian&lt;/a>
and download and install the latest &lt;code>.deb&lt;/code>.&lt;/p>
&lt;h1 id="plex-clients">Plex Clients&lt;/h1>
&lt;p>I use the Plex Client for Android on phone and tablet, a Roku 2 XS in the lounge
and Roku 2 LT in the bedroom.&lt;/p>
&lt;p>I&amp;rsquo;ve successfully tested Plex Home Theatre on Ubuntu 12.04 and Raspbmc with
the PleXBMC plug-in on Raspberry Pi.&lt;/p>
&lt;h3 id="references">References&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="http://forums.plexapp.com/index.php/topic/51427-plex-media-server-for-debian/">http://forums.plexapp.com/index.php/topic/51427-plex-media-server-for-debian/&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://forums.plexapp.com/index.php/topic/48865-debian-package/">http://forums.plexapp.com/index.php/topic/48865-debian-package/&lt;/a>&lt;/li>
&lt;/ul></description><summary>Installing Plex Media Server on Open Media Vault (Squeeze) 6.0</summary></item><item><title>Setting up MiniDLNA on Open Media Vault</title><link>https://wimpysworld.com/posts/setting-up-minidlna-on-open-media-vault/</link><pubDate>Mon, 26 Aug 2013 21:49:09 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/setting-up-minidlna-on-open-media-vault/</guid><description>&lt;p>I have &lt;a href="http://www.openmediavault.org/">Open Media Vault&lt;/a> running on a
&lt;a href="http://www8.hp.com/uk/en/products/proliant-servers/product-detail.html?oid=5336624">HP ProLiant MicroServer G7 N54L&lt;/a>.&lt;/p>
&lt;p>OpenMediaVault (OMV) is a network attached storage (NAS) solution based on
&lt;a href="http://www.debian.org">Debian&lt;/a> Linux. At the time of writing OMV 0.5.x is
based on Debian 6.0 (Squeeze).&lt;/p>
&lt;p>In recent months &lt;a href="http://www.plexapp.com">Plex&lt;/a> has taken over just about all
media streaming duties in our house, with the expectation of streaming music
because Plex music playback and streaming is seriously lacking (no playlists!).
So, &lt;a href="http://sourceforge.net/projects/minidlna/">MiniDLNA&lt;/a> is still required for
serving up music around the house.&lt;/p>
&lt;h1 id="install-minidlna-on-omv">Install MiniDLNA on OMV&lt;/h1>
&lt;p>There is a 3rd party plugin repository for Open Media Vault which includes
packages to install MiniDLNA and a WebUI plugin for managing MiniDLNA via OMV.
I upgraded to OMV 0.5.x this morning. and with the 0.5.x the Plugin API changed
and as of the time of writing none of the 3rd party plugins had not been migrated
to OMV 0.5.x. That said, MiniDLNA is super simple to configure so a WebUI is
not a requirement for me.&lt;/p>
&lt;p>MiniDLNA is not currently packaged for Debian Squeeze in the official repositories but
&lt;a href="http://blog.steve.org.uk/minidlna_is_now_packaged.html">Steve Kemp&lt;/a> has packaged
a fairly up-to-date version of MiniDLNA for Squeeze. Brilliant! Do the following as
&lt;code>root&lt;/code> to install MiniDLNA.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>wget http://packages.steve.org.uk/minidlna/apt-key.pub
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>apt-key add apt-key.pub
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>echo deb http://packages.steve.org.uk/minidlna/squeeze/ ./&lt;span style="color:#87ceeb">&amp;#34; &amp;gt; /etc/apt/sources.list.d/minidlna.list
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">echo &amp;#34;&lt;/span>deb-src http://packages.steve.org.uk/minidlna/squeeze/ ./&lt;span style="color:#87ceeb">&amp;#34; &amp;gt;&amp;gt; /etc/apt/sources.list.d/minidlna.list
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Once you&amp;rsquo;ve done that run the following.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>apt-get update
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>apt-get install minidlna
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The MiniDLNA defaults in Steve&amp;rsquo;s package assume you have your music in
&lt;code>/srv/music&lt;/code>. So you&amp;rsquo;ll probably need to modify &lt;code>/etc/minidlna/minidlna.conf&lt;/code>
accordingly. From this point &lt;code>man minidlna&lt;/code> and &lt;code>man minidlna.conf&lt;/code> will
guide you.&lt;/p>
&lt;h4 id="references">References&lt;/h4>
&lt;ul>
&lt;li>&lt;a href="http://blog.steve.org.uk/minidlna_is_now_packaged.html">http://blog.steve.org.uk/minidlna_is_now_packaged.html&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://packages.steve.org.uk/minidlna/">http://packages.steve.org.uk/minidlna/&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://sourceforge.net/projects/minidlna/">http://sourceforge.net/projects/minidlna/&lt;/a>&lt;/li>
&lt;/ul></description><summary>Music streaming with MiniDLNA on Open Media Vault</summary></item><item><title>SketchUp Make on Arch Linux</title><link>https://wimpysworld.com/posts/sketchup-make-on-arch-linux/</link><pubDate>Thu, 15 Aug 2013 15:42:47 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/sketchup-make-on-arch-linux/</guid><description>&lt;p>I use &lt;a href="http://www.sketchup.com">SketchUp&lt;/a> at work to manipulate models for use
in &lt;a href="http://earth.google.com">Google Earth&lt;/a>. Here is how I got SketchUp Make
2013 installed and working on &lt;a href="http://www.archlinux.org">Arch Linux&lt;/a> under
&lt;a href="http://www.winehq.com">Wine&lt;/a> 1.7.&lt;/p>
&lt;h1 id="wine-for-arch-linux">Wine for Arch Linux&lt;/h1>
&lt;p>Install Wine on Arch Linux as follows.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo pacman -S --needed icoutils libwbclient libxslt lib32-mpg123 p11-kit lib32-p11-kit samba wine winetricks wine-mono wine_gecko
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo packer -S --noedit --noconfirm ttf-ms-fonts
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>For 64-bit also install the following.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo packer -S --noedit --noconfirm lib32-libwbclient lib32-libxslt
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="installing-sketchup-make">Installing SketchUp Make&lt;/h1>
&lt;p>Once Wine is installed download SketchUp Make 2013.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.sketchup.com/download">http://www.sketchup.com/download&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Create a clean wine prefix.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>export &lt;span style="color:#eedd82">WINEPREFIX&lt;/span>=&lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#87ceeb">${&lt;/span>&lt;span style="color:#eedd82">HOME&lt;/span>&lt;span style="color:#87ceeb">}&lt;/span>&lt;span style="color:#87ceeb">/.sketchup&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>export &lt;span style="color:#eedd82">WINEARCH&lt;/span>=&lt;span style="color:#87ceeb">&amp;#34;win32&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>wineboot
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Install &lt;code>corefonts&lt;/code> using &lt;code>winetricks&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>winetricks corefonts
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Start the SketchUp Make setup.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>wine SketchUpWEN.exe
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Follow the installation wizard, I just went with the defaults.&lt;/p>
&lt;p>That&amp;rsquo;s it. SketchUp is installed and should be associated with the appropriate
file types.&lt;/p>
&lt;h2 id="video-corruption">Video Corruption&lt;/h2>
&lt;p>My workstation has a Radeon 5000 series graphics card and I use the Open Source
&lt;code>radeon&lt;/code> driver. I don&amp;rsquo;t know if this problem is specific to my hardware/drivers
but SketchUp will eventually (sometimes immediately) encounter video corruption.
Once that happens I can&amp;rsquo;t see or manipluate the models.&lt;/p>
&lt;p>The solution that works for me is:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>env &lt;span style="color:#eedd82">WINEPREFIX&lt;/span>=&lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#87ceeb">${&lt;/span>&lt;span style="color:#eedd82">HOME&lt;/span>&lt;span style="color:#87ceeb">}&lt;/span>&lt;span style="color:#87ceeb">/.sketchup&amp;#34;&lt;/span> &lt;span style="color:#eedd82">LIBGL_ALWAYS_SOFTWARE&lt;/span>=&lt;span style="color:#f60">1&lt;/span> &lt;span style="color:#eedd82">vblank_mode&lt;/span>=&lt;span style="color:#f60">0&lt;/span> wine &lt;span style="color:#87ceeb">&amp;#34;C:\Program Files\SketchUp\SketchUp 2013\SketchUp.exe&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If this also works for you then &lt;code>SketchUp.desktop&lt;/code> can be modified to persist
these settings.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>nano ~/.local/share/applications/wine/Programs/SketchUp&lt;span style="color:#87ceeb">\ &lt;/span>2013/SketchUp.desktop
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Replace the contents with what follows but change &lt;code>USER&lt;/code> with your username.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ini" data-lang="ini">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">[Desktop Entry]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Name=&lt;span style="color:#87ceeb">SketchUp&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Exec=&lt;span style="color:#87ceeb">env WINEPREFIX=&amp;#34;/home/USER/.sketchup&amp;#34; LIBGL_ALWAYS_SOFTWARE=1 vblank_mode=0 wine C:\\\\windows\\\\command\\\\start.exe /Unix /home/USER/.sketchup/dosdevices/c:/users/USER/Start\\ Menu/Programs/SketchUp\\ 2013/SketchUp.lnk&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Type=&lt;span style="color:#87ceeb">Application&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>StartupNotify=&lt;span style="color:#87ceeb">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Icon=&lt;span style="color:#87ceeb">1871_SketchUpIcon.0&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="uninstalling-sketchup-make">Uninstalling SketchUp Make&lt;/h2>
&lt;p>Should you ever need to, you can uninstall SketchUp Make as follows.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>rm -rfv &lt;span style="color:#87ceeb">${&lt;/span>&lt;span style="color:#eedd82">HOME&lt;/span>&lt;span style="color:#87ceeb">}&lt;/span>/.sketchup/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rm -rfv ~/.local/share/applications/wine/Programs/SketchUp&lt;span style="color:#87ceeb">\ &lt;/span>2013/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="references">References&lt;/h4>
&lt;ul>
&lt;li>&lt;a href="http://appdb.winehq.org/objectManager.php?sClass=version&amp;amp;iId=28620">http://appdb.winehq.org/objectManager.php?sClass=version&amp;amp;iId=28620&lt;/a>&lt;/li>
&lt;/ul></description><summary>Install SketchUp Make 2013 on Arch Linux with Wine 1.7</summary></item><item><title>Setting up Open Media Vault on the HP MicroServer N54L</title><link>https://wimpysworld.com/posts/setting-up-open-media-vault-on-the-hp-microserver-n54l/</link><pubDate>Wed, 07 Aug 2013 21:21:09 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/setting-up-open-media-vault-on-the-hp-microserver-n54l/</guid><description>&lt;p>I&amp;rsquo;ve installed &lt;a href="http://www.openmediavault.org/">Open Media Vault&lt;/a> (OMV)
on my new &lt;a href="http://www8.hp.com/uk/en/products/proliant-servers/product-detail.html?oid=5336624">HP ProLiant MicroServer G7 N54L&lt;/a>
to replace my aging, and lackluster, &lt;a href="http://www.readynas.com">ReadyNAS&lt;/a> NV.&lt;/p>
&lt;p>OpenMediaVault (OMV) is a network attached storage (NAS) solution based on
&lt;a href="http://www.debian.org">Debian&lt;/a> Linux. At the time of writing OMV 0.5.x is
based on Debian 6.0 (Squeeze).&lt;/p>
&lt;p>This blog post is not going to cover the extremely simple OMV installation
procedure, it assumes OMV 0.5.x is already installed. This post explains
how to upgrade the kernel, install some addtional plugins and some hackery
to update &lt;a href="http://www.transmissionbt.com/">Transmission&lt;/a>.&lt;/p>
&lt;p>This blog post is basically the essential notes I need to recreate my server setup.&lt;/p>
&lt;h1 id="n54l-custom-bios">N54L Custom BIOS&lt;/h1>
&lt;p>I&amp;rsquo;ve installed one of the custom BIOS mods for the N54L.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.avforums.com/forums/networking-nas/1521657-hp-n36l-n40l-n54l-microserver-updated-ahci-bios-support.html">HP N36L/N40L/N54L Microserver Updated AHCI BIOS Support&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>I selected the BIOS mod above because the guy who created was an HP engineer and
this BIOS mod only enables additional features that the N54L can actually support.
Using this BIOS mod I&amp;rsquo;ve been able to:&lt;/p>
&lt;ul>
&lt;li>Enable AHCI for the Optical Disk Drive (ODD) port.&lt;/li>
&lt;li>Enable AHCI and port multiplier for the the e-SATA port.&lt;/li>
&lt;li>Make all drives hot-pluggable.&lt;/li>
&lt;/ul>
&lt;p>The 250GB hard drive that came with N54L is now relocated in the optical drive day
and being used as the OS drive, leaving all 4 bays for data.&lt;/p>
&lt;p>As some point in the future I may want to hook up a 4 bay e-SATA enclosure and this
BIOS mod makes that possible.&lt;/p>
&lt;h1 id="open-media-vault">Open Media Vault&lt;/h1>
&lt;p>Once Open Media Vault is installed, I do the following.&lt;/p>
&lt;h2 id="enable-ssh">Enable SSH&lt;/h2>
&lt;p>OMV actually has a really good WebUI that can be used to accomplish most
update/upgrade tasks but I can&amp;rsquo;t help myself. I must have shell access. From
the OMV WebUI:&lt;/p>
&lt;ul>
&lt;li>&lt;code>Services -&amp;gt; SSH&lt;/code>
&lt;ul>
&lt;li>Put a tick in &lt;code>Enable&lt;/code> and click the &lt;code>OK&lt;/code> button.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="shell-tools">Shell Tools&lt;/h2>
&lt;p>Things crave when at the a shell.&lt;/p>
&lt;p>Login to your OMV server as &lt;code>root&lt;/code> using SSH and then do the following.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>apt-get install less lsb-release rsync screen tree
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="omv-plugins">OMV Plugins&lt;/h1>
&lt;p>OMV has a number of built-in plugins and a &lt;a href="http://omv-plugins.org">third party repository of plugins&lt;/a>.&lt;/p>
&lt;h2 id="built-in-plugins">Built-in Plugins&lt;/h2>
&lt;p>Update the built-in plugins.&lt;/p>
&lt;ul>
&lt;li>&lt;code>System -&amp;gt; Plugins&lt;/code>
&lt;ul>
&lt;li>Click the &lt;code>Check&lt;/code> icon.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="logical-volume-manager">Logical Volume Manager&lt;/h3>
&lt;p>I use LVM. There, I said it. Enable the LVM2 plugin as follows from the OMV WebUI.&lt;/p>
&lt;ul>
&lt;li>&lt;code>System -&amp;gt; Plugins&lt;/code>
&lt;ul>
&lt;li>Highlight the &lt;code>openmediavault-lvm2&lt;/code> plugin.&lt;/li>
&lt;li>Click the &lt;code>Install&lt;/code> icon and then &lt;code>Yes&lt;/code>.&lt;/li>
&lt;li>When the install is &lt;code>Done ...&lt;/code>, click &lt;code>Close&lt;/code>.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="3rd-party-omv-plugins">3rd Party OMV-Plugins&lt;/h2>
&lt;p>Follow the instructions on the following page to enable the OMV-Extras plugin repository.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://omv-extras.org/simple/index.php?id=how-to-install-omv-extras-plugin">http://omv-extras.org/simple/index.php?id=how-to-install-omv-extras-plugin&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="backports-32-kernel">Backports 3.2 Kernel&lt;/h3>
&lt;p>I updated the Kernel to 3.2 because it better supports the N54L hardware, in
particular the embedded graphics controller. The Linux 3.2 kernel can be
installed via OMV-Extras.&lt;/p>
&lt;ul>
&lt;li>&lt;code>System -&amp;gt; OMV-Extras.org -&amp;gt; Install Backports 3.2 kernel&lt;/code>&lt;/li>
&lt;/ul>
&lt;h3 id="plex-media-server">Plex Media Server&lt;/h3>
&lt;p>Plex Media Server is available as a plugin once the OMV-Extras plugin
repository is enabled. Plex is managed via the OMV WebUI.&lt;/p>
&lt;ul>
&lt;li>&lt;code>Services -&amp;gt; Plex&lt;/code>&lt;/li>
&lt;/ul>
&lt;h3 id="transmission">Transmission&lt;/h3>
&lt;p>Transmission is available as a plugin once the OMV-Extras plugin repository is
enabled. Transmission is managed via the OMV WebUI.&lt;/p>
&lt;ul>
&lt;li>&lt;code>Services -&amp;gt; BitTorrent -&amp;gt; Server&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>It&amp;rsquo;s all very straight forward. I use the following block list.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://list.iblocklist.com/?list=bt_level1&amp;amp;fileformat=p2p&amp;amp;archiveformat=gz">http://list.iblocklist.com/?list=bt_level1&amp;amp;fileformat=p2p&amp;amp;archiveformat=gz&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>That pretty much covers the stuff I won&amp;rsquo;t remember in the future. I&amp;rsquo;m considering
adding LXC and Dropbox in the coming that will require some manual steps.&lt;/p>
&lt;h4 id="references">References&lt;/h4>
&lt;ul>
&lt;li>&lt;a href="http://thekentishman.wordpress.com/guides-2/open-media-vault-set-up/">http://thekentishman.wordpress.com/guides-2/open-media-vault-set-up/&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://myhpmicroserver.com/wiki/Main_Page">http://myhpmicroserver.com/wiki/Main_Page&lt;/a>&lt;/li>
&lt;/ul></description><summary>Open Media Vault on the HP ProLiant MicroServer G7 N54L</summary></item><item><title>Basic Debian Setup for Squeeze and Wheezy</title><link>https://wimpysworld.com/posts/basic-debian-setup-for-squeeze-and-wheezy/</link><pubDate>Tue, 06 Aug 2013 20:07:09 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/basic-debian-setup-for-squeeze-and-wheezy/</guid><description>&lt;p>Recently I&amp;rsquo;ve been deploying &lt;a href="http://www.debian.org">Debian&lt;/a> 6.0 (Squeeze) and
7.0 (Wheezy) servers for some personal projects. These servers are provisioned
in different ways:&lt;/p>
&lt;ul>
&lt;li>Open Media Vault using a Squeeze pre-seed&lt;/li>
&lt;li>VPS powered by &lt;a href="http://http://lxc.sourceforge.net/">LXC&lt;/a> deployed via &lt;code>debootstrap&lt;/code>&lt;/li>
&lt;li>VPS powered by &lt;a href="http://www.linux-kvm.org">KVM&lt;/a> using the hosting providers Wheezy pre-seed&lt;/li>
&lt;/ul>
&lt;p>Consequently the basic install differs on each instance and requires a little
bit of post install tweaking to get them all consistent. This blog post is a
quick reference for the post install steps I complete on Debian servers.&lt;/p>
&lt;h1 id="timezone--locale">Timezone &amp;amp; Locale&lt;/h1>
&lt;p>Select your timezone.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>dpkg-reconfigure tzdata
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Select your locale(s).&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>dpkg-reconfigure locales
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Make sure the locales are correctly generated. Replace &lt;code>en_GB.UTF-8&lt;/code> with your
default locale.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>update-locale &lt;span style="color:#eedd82">LANG&lt;/span>=en_GB.UTF-8 &lt;span style="color:#eedd82">LANGUAGE&lt;/span>=en_GB.UTF-8 &lt;span style="color:#eedd82">LC_ALL&lt;/span>=en_GB.UTF-8 &lt;span style="color:#eedd82">LC_TIME&lt;/span>=en_GB.UTF-8 &lt;span style="color:#eedd82">LC_CTYPE&lt;/span>=en_GB.UTF-8
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>locale -a
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>locale-gen
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="hostname">Hostname&lt;/h1>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>echo box.example.org &amp;gt; /etc/hostname
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>/bin/hostname -F /etc/hostname
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Update &lt;code>/etc/hosts&lt;/code> accordingly.&lt;/p>
&lt;h1 id="time">Time&lt;/h1>
&lt;p>Keeping time is essential.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>apt-get install ntp ntpdate
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Force a clock sync.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>service ntp stop
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ntpdate -s pool.ntp.org
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>service ntp start
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If your VPS is a Xen DomU then checkout the following.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://jinntech.blogspot.co.uk/2009/03/xen-and-keeping-time.html">http://jinntech.blogspot.co.uk/2009/03/xen-and-keeping-time.html&lt;/a>&lt;/li>
&lt;/ul>
&lt;h1 id="essentials">Essentials&lt;/h1>
&lt;p>These are the essential tools I require.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>apt-get install build-essential curl git htop less lsb-release nano &lt;span style="color:#87ceeb">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">&lt;/span>rsync screen sudo tree whois
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="users">Users&lt;/h1>
&lt;p>The following will create a user with &lt;code>sudo&lt;/code> capabilities.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>useradd user_a --create-home --shell /bin/bash --user-group &lt;span style="color:#87ceeb">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">&lt;/span>--groups adm,dialout,cdrom,plugdev,sudo
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This will create a regular user.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>useradd user_b --create-home --shell /bin/bash --user-group --groups adm,dialout,cdrom,plugdev
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Assign a password.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>echo user_a:mypassword | chpasswd
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>An existing user can be made a sudoer by simply adding them to the &lt;code>sudo&lt;/code> group.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>adduser user_b sudo
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="firewall">Firewall&lt;/h1>
&lt;p>I use firewall my VPS server with &lt;code>ufw&lt;/code>. This is my initial configuration that
allow access via SSH only.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get install ufw
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Configuring &lt;code>ufw&lt;/code> is simple but make sure you have console access to the host
you are configuring just in case you lock yourself out.&lt;/p>
&lt;p>&lt;strong>NOTE!&lt;/strong> When enabling &lt;code>ufw&lt;/code> the chains are flushed and connections may be
dropped. You can add rules to the firewall before enabling it however, so if you
are testing &lt;code>ufw&lt;/code> on a remote machine it is recommended you perform&amp;hellip;&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>ufw allow ssh/tcp
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&amp;hellip;before running &lt;code>sudo ufw enable&lt;/code>. Once the firewall is enabled, adding and
removing rules will not flush the firewall, although modifying an existing rule
will.&lt;/p>
&lt;p>Set the default behaviour to deny all incoming connections.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo ufw default deny
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Open up TCP port 22 but with rate limiting enabled which will deny connections
from an IP address that has attempted to initiate 6 or more connections in the
last 30 seconds. Ideal for protecting &lt;code>sshd&lt;/code> but you should conisder other
&lt;a href="https://wimpysworld.com/posts/ssh-brute-force-defense/">SSH brute force defense&lt;/a>
techniques as well.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo ufw limit ssh
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>To enable the firewall you also have to do the following.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo ufw enable
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>On low-end servers it might be beneficial to disable logging.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo ufw logging off
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You can see the status of the firewall using &lt;code>sudo ufw status&lt;/code>.&lt;/p>
&lt;h1 id="intrusion-prevention">Intrusion prevention&lt;/h1>
&lt;p>I use either &lt;code>denyhosts&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get install denyhosts
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Purge entries older than 5 days, denied hosts will only be purged twice and
disable email alerts.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo sed -i &lt;span style="color:#87ceeb">&amp;#39;s/#PURGE_DENY = 5d/PURGE_DENY = 5d/&amp;#39;&lt;/span> /etc/denyhosts.conf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo sed -i &lt;span style="color:#87ceeb">&amp;#39;s/#PURGE_THRESHOLD = 2/PURGE_THRESHOLD = 2/&amp;#39;&lt;/span> /etc/denyhosts.conf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo sed -i &lt;span style="color:#87ceeb">&amp;#39;s/root@localhost//&amp;#39;&lt;/span> /etc/denyhosts.conf
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Restart &lt;code>denyhosts&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo service denyhosts restart
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Also see &lt;a href="http://flexion.org/posts/2012-11-ssh-brute-force-defence.html">SSH brute force defence&lt;/a>.&lt;/p>
&lt;h1 id="boot-options">Boot options&lt;/h1>
&lt;p>These servers are headless and often remote, therefore I enable &lt;code>fsck&lt;/code> auto repair.&lt;/p>
&lt;h2 id="squeeze">Squeeze&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sed -i &lt;span style="color:#87ceeb">&amp;#39;s/FSCKFIX=no/FSCKFIX=yes/&amp;#39;&lt;/span> /etc/default/rcS
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="wheezy">Wheezy&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sed -i &lt;span style="color:#87ceeb">&amp;#39;s/#FSCKFIX=no/FSCKFIX=yes/&amp;#39;&lt;/span> /etc/default/rcS
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="repositories">Repositories&lt;/h1>
&lt;p>&lt;code>lsb-release&lt;/code> was installed earlier. This is what I put in &lt;code>/etc/apt/sources.list&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cat &amp;gt;/etc/apt/sources.list&lt;span style="color:#87ceeb">&amp;lt;&amp;lt;EOF
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">deb http://ftp.uk.debian.org/debian/ $(lsb_release -cs) main contrib non-free
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">deb-src http://ftp.uk.debian.org/debian/ $(lsb_release -cs) main contrib non-free
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">deb http://security.debian.org/ $(lsb_release -cs)/updates main contrib non-free
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">deb-src http://security.debian.org/ $(lsb_release -cs)/updates main contrib non-free
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb"># $(lsb_release -cs)-updates, previously known as &amp;#39;volatile&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">deb http://ftp.uk.debian.org/debian/ $(lsb_release -cs)-updates main contrib non-free
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">deb-src http://ftp.uk.debian.org/debian/ $(lsb_release -cs)-updates main contrib non-free
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">EOF&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>I replace &lt;code>ftp.uk&lt;/code> with &lt;code>ftp.us&lt;/code> for servers located in the United States.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sed -i &lt;span style="color:#87ceeb">&amp;#39;s/ftp\.uk/ftp\.us/g&amp;#39;&lt;/span> /etc/apt/sources.list
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="backports">Backports&lt;/h2>
&lt;p>I add the Backports repository in order to access some updated packages.&lt;/p>
&lt;h3 id="squeeze-1">Squeeze&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cat &amp;gt;/etc/apt/sources.list.d/backports.list &lt;span style="color:#87ceeb">&amp;lt;&amp;lt;EOF
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">deb http://ftp.uk.debian.org/debian-backports $(lsb_release -cs)-backports main contrib non-free
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">deb-src http://ftp.uk.debian.org/debian-backports $(lsb_release -cs)-backports main contrib non-free
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">EOF&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="wheezy-1">Wheezy&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cat &amp;gt;/etc/apt/sources.list.d/backports.list &lt;span style="color:#87ceeb">&amp;lt;&amp;lt;EOF
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">deb http://ftp.uk.debian.org/debian $(lsb_release -cs)-backports main contrib non-free
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">deb-src http://ftp.uk.debian.org/debian $(lsb_release -cs)-backports main contrib non-free
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">EOF&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Update.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get update
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>All backports are deactivated by default (i.e. the packages are pinned to
100 by using ButAutomaticUpgrades: yes in the Release files. If you want to
install something from backports run:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>apt-get -t wheezy-backports install &lt;span style="color:#87ceeb">&amp;#34;package&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="mta">MTA&lt;/h1>
&lt;p>sSMTP is a simple MTA to deliver mail from a computer to a mail hub. sSMTP is
simple and lightweight.&lt;/p>
&lt;h2 id="remove-exim4">Remove exim4&lt;/h2>
&lt;p>Some VPS Debian templates from VPS providers have exim4 installed and running
by default. Remove it.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo service exim4 stop
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get purge exim4 exim4-base exim4-config
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="install-ssmtp">Install sSMTP&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>apt-get install ssmtp bsd-mailx
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="ssmtp-gmail-configuration">sSMTP Gmail Configuration&lt;/h2>
&lt;p>I use Gmail as my smart host, here is an example configuration for
&lt;code>/etc/ssmtp/ssmtp.conf&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0">#&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Config file for sSMTP sendmail&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0">#&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># The person who gets all mail for userids &amp;lt; 1000&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Make this empty to disable rewriting.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">root&lt;/span>=root@example.org
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># The place where the mail goes. The actual machine name is required no&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># MX records are consulted. Commonly mailhosts are named mail.domain.com&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">mailhub&lt;/span>=smtp.gmail.com:587
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Where will the mail seem to come from?&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">rewriteDomain&lt;/span>=
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># The full hostname&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">hostname&lt;/span>=box.example.org
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Are users allowed to set their own From: address?&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># YES - Allow the user to specify their own From: address&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># NO - Use the system generated From: address&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">FromLineOverride&lt;/span>=YES
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Gmail requires TLS&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">UseTLS&lt;/span>=YES
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">UseSTARTTLS&lt;/span>=YES
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Username and password for Gmail servers&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">AuthUser&lt;/span>=yourgmailname@gmail.com
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">AuthPass&lt;/span>=youpassword
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">AuthMethod&lt;/span>=LOGIN
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Then add each account that you want to be able to send mail from by editing
&lt;code>/etc/ssmtp/revaliases&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>root:username@gmail.com:smtp.gmail.com:587
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>user_a:username@gmail.com:smtp.gmail.com:587
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>user_b:username@gmail.com:smtp.gmail.com:587
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;a href="https://wiki.debian.org/sSMTP">https://wiki.debian.org/sSMTP&lt;/a>&lt;/li>
&lt;/ul>
&lt;h1 id="log-and-package-monitoring">Log and package monitoring&lt;/h1>
&lt;p>My personal VPS server are dotted about the place but I like to keep an eye on
them and I find &lt;code>apticron&lt;/code> and &lt;code>logwatch&lt;/code> are very useful for that.&lt;/p>
&lt;h2 id="apticron">apticron&lt;/h2>
&lt;p>apticron is a simple tool to mail about pending package updates.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get install apticron
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="logwatch">logwatch&lt;/h2>
&lt;p>Logwatch is a modular log analyser that runs every night and mails you the results.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get install logwatch
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="lighter">Lighter&lt;/h1>
&lt;p>Some of my servers have fairly low resources, these are some simple changes that
can save a bit of RAM or disk space.&lt;/p>
&lt;h2 id="aptitude">aptitude&lt;/h2>
&lt;p>I don&amp;rsquo;t use it.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get purge aptitude
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="d-bus">D-Bus&lt;/h2>
&lt;p>D-Bus is a message bus, used for sending messages between applications.
Some VPS provider Debian templates have D-Bus and avahi installed. I don&amp;rsquo;t
require these on Internet facing servers so I remove them. If an application
pull in D-Bus as a requirement that is fine, but for this initial server
state I remove it.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get purge dbus
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="at">at&lt;/h2>
&lt;p>&lt;code>at&lt;/code> provides delayed job execution and batch processing. I don&amp;rsquo;t use it.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo service atd stop
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get purge at
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="ngetty">ngetty&lt;/h2>
&lt;p>Ngetty is a single-process &lt;code>getty&lt;/code> replacement, so instead of running 6 &lt;code>getty&lt;/code>
processes consuming up to 3MB of RAM each, you can use a single &lt;code>ngetty&lt;/code> process
using less than 1MB of RAM total.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get install ngetty
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Edit &lt;code>/etc/inittab&lt;/code>, comment out &lt;code>getty&lt;/code> and add &lt;code>ngetty&lt;/code> like so.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>#1:2345:respawn:/sbin/getty 38400 tty1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>#2:23:respawn:/sbin/getty 38400 tty2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>#3:23:respawn:/sbin/getty 38400 tty3
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>#4:23:respawn:/sbin/getty 38400 tty4
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>#5:23:respawn:/sbin/getty 38400 tty5
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>#6:23:respawn:/sbin/getty 38400 tty6
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ng:2345:respawn:/sbin/ngetty 1 2 3 4 5 6
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Restart inittab&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>telinit q
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;a href="http://haydenjames.io/replacing-getty-ngetty-debian/">http://haydenjames.io/replacing-getty-ngetty-debian/&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>That about covers the general post installation step I complete on my Debian
servers.&lt;/p>
&lt;h2 id="clean-up">Clean up.&lt;/h2>
&lt;p>Remove any packages that are no longer required and clean up
the package cache.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get autoremove
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get autoclean
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get clean
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description><summary>Consistent server configuration for Debian Squeeze &amp;amp; Wheezy</summary></item><item><title>NFS and CIFS mounts with systemd</title><link>https://wimpysworld.com/posts/nfs-and-cifs-mounts-with-systemd/</link><pubDate>Fri, 26 Jul 2013 12:00:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/nfs-and-cifs-mounts-with-systemd/</guid><description>&lt;p>I have an NFS server at home and at work we have Windows (not Samba) servers.
When I first switched to &lt;code>systemd&lt;/code> I noticed that boot and shutdown were
seriously delayed while NFS and CIFS were mounted/unmounted. &lt;code>systemd&lt;/code> was
designed to eliminate those kinds of delays, so I did some research to find
out how to correctly mount NFS and CIFS using &lt;code>systemd&lt;/code>.&lt;/p>
&lt;h1 id="systemd-friendly-fstab">systemd friendly fstab&lt;/h1>
&lt;p>Below are some example &lt;code>/etc/fstab&lt;/code> entries for NFS and CIFS mounts that are
&lt;code>systemd&lt;/code> friendly, the pertinent mount options are:&lt;/p>
&lt;ul>
&lt;li>&lt;code>noauto,x-systemd.automount,_netdev&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>I found that &lt;code>noauto,x-systemd.automount&lt;/code> improved the boot performance and
&lt;code>_netdev&lt;/code> improved the shutdown performance.&lt;/p>
&lt;h2 id="nfs">NFS&lt;/h2>
&lt;p>This is typically what I have use for mounting my home NAS.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>nfs-server:/SomeData /media/SomeData nfs defaults,noauto,x-systemd.automount,_netdev,noatime 0 0
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="cifs">CIFS&lt;/h2>
&lt;p>This is what I use at work to work correctly with Windows Server.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>//cifs-server/MoreData /media/MoreData cifs defaults,noauto,x-systemd.automount,_netdev,rw,noperm,credentials=/home/username/.smb-credentials 0 0
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The contents of the credentials file looks something like this.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ini" data-lang="ini">&lt;span style="display:flex;">&lt;span>username=&lt;span style="color:#87ceeb">yourusername&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>password=&lt;span style="color:#87ceeb">yourpassword&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>domain=&lt;span style="color:#87ceeb">COMPANYDOMAIN&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="references">References&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://wiki.archlinux.org/index.php/Systemd#Filesystem_mounts">https://wiki.archlinux.org/index.php/Systemd#Filesystem_mounts&lt;/a>&lt;/li>
&lt;/ul></description><summary>Wait for network when mounting NFS and CIFS volumes</summary></item><item><title>Python Distributions</title><link>https://wimpysworld.com/posts/python-distributions/</link><pubDate>Mon, 24 Jun 2013 13:11:43 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/python-distributions/</guid><description>&lt;p>At &lt;a href="http://www.flightdataservices.com">work&lt;/a> I maintain the
&lt;a href="http://http://jenkins-ci.org/">Jenkins&lt;/a> test and build servers. I&amp;rsquo;m just about
to update our Windows build servers and thought I&amp;rsquo;d better check the available
&amp;ldquo;Python Distributions&amp;rdquo; to see if our current choice (the brilliant
&lt;a href="https://code.google.com/p/pythonxy/">Python(x,y)&lt;/a> is still the most suitable for
our needs.&lt;/p>
&lt;p>Our &lt;a href="http://github.com/FlightDataServices">Flight Data Analyzer&lt;/a> makes extensive
use of &lt;a href="http://www.numpy.org/">Numpy&lt;/a>, &lt;a href="http://www.scipy.org/">Scipy&lt;/a>,
&lt;a href="http://code.google.com/p/h5py/">h5py&lt;/a> and other analysis tools. So, pre-built
Python distributions on Windows save me a lot of &lt;del>pain&lt;/del> time. On Linux we roll
our own of course.&lt;/p>
&lt;p>What follows is a list of Python Distributions that include Python and the essential
modules we require.&lt;/p>
&lt;h2 id="anaconda">Anaconda&lt;/h2>
&lt;blockquote>
&lt;p>Completely free enterprise-ready Python distribution for large-scale data
processing, predictive analytics, and scientific computing.&lt;/p>
&lt;/blockquote>
&lt;ul>
&lt;li>&lt;a href="https://store.continuum.io/cshop/anaconda/">https://store.continuum.io/cshop/anaconda/&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Heard about this for the first time a couple of days ago. It looks very promising
with 32-bit and 64-bit flavours and MKL optimised modules are available from the
reasonably priced Anaconda Accelerate. While I roll my own Python Distribution for
our Linux build servers, I am rather taken with the idea of using Anaconda on Linux
and Windows to provide a consistent platform everywhere. I&amp;rsquo;m looking forward to
testing Anaconda this week.&lt;/p>
&lt;p>&lt;a href="http://www.continuum.io">Continuum&lt;/a> appear to be taking on Enthought at their
own game, and good luck to them as they have some really interesting projects
on the go.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.continuum.io/developer-resources">http://www.continuum.io/developer-resources&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="enthought-canopy">Enthought Canopy&lt;/h2>
&lt;blockquote>
&lt;p>Enthought Canopy is a comprehensive Python analysis environment with easy
installation &amp;amp; updates of the proven Enthought Python distribution - all part
of a robust platform you can explore, develop and visualize on.&lt;/p>
&lt;/blockquote>
&lt;ul>
&lt;li>&lt;a href="https://www.enthought.com/products/canopy/">https://www.enthought.com/products/canopy/&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>We used to use Entought EPD and Canopy builds on EPD. However, we decided to
switch from EPD and consolidate analyst workstation and build server deployments
around Python(x,y).&lt;/p>
&lt;p>There were several factors to this decision, but the main issue was that updates
to the EPD package repositories were slow for some essential modules we use. Canopy
seems to have inherited package latency from EPD as Numpy is still at 1.6.1 while
we now require Numpy 1.7.&lt;/p>
&lt;p>Paid versions of Canopy have MKL optimizations and 64-bit platform support.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://www.enthought.com/products/canopy/compare-subscriptions/">https://www.enthought.com/products/canopy/compare-subscriptions/&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="pythonxy">Python(x,y)&lt;/h2>
&lt;blockquote>
&lt;p>Scientific-oriented Python Distribution based on Qt and Spyder.&lt;/p>
&lt;/blockquote>
&lt;ul>
&lt;li>&lt;a href="https://code.google.com/p/pythonxy/">https://code.google.com/p/pythonxy/&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>This is what we currently use for Windows build servers and analyst workstations.
The only reason I&amp;rsquo;m conisdering switching is that is it 32-bit only. Other than
that, I love it and highly recommend it. Python(x,y) doesn&amp;rsquo;t offer MKL optimisations.&lt;/p>
&lt;h2 id="winpython">WinPython&lt;/h2>
&lt;blockquote>
&lt;p>WinPython is a portable scientific Python 2/3 32/64bit distribution for Windows&lt;/p>
&lt;/blockquote>
&lt;ul>
&lt;li>&lt;a href="http://code.google.com/p/winpython/">http://code.google.com/p/winpython/&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>From the same stable as Python(x,y) but has 32-bit and 64-bit flavours, yummy.
WinPython includes everything I need so will definately get fully tested this week.&lt;/p>
&lt;h2 id="portable-python">Portable Python&lt;/h2>
&lt;blockquote>
&lt;p>Portable Python is a Python programming language pre-configured to run directly
from any USB storage device, enabling you to have, at any time, a portable
programming environment.&lt;/p>
&lt;/blockquote>
&lt;ul>
&lt;li>&lt;a href="http://portablepython.com/">http://portablepython.com/&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Not looked at this in any real detail. Appears to be 32-bit only but does include
a number of essential packages.&lt;/p>
&lt;h2 id="unofficial-windows-binaries-for-python-extension-packages">Unofficial Windows Binaries for Python Extension Packages&lt;/h2>
&lt;blockquote>
&lt;p>Provides 32- and 64-bit Windows binaries of many scientific open-source extension
packages for the official CPython distribution of the Python programming language.&lt;/p>
&lt;/blockquote>
&lt;ul>
&lt;li>&lt;a href="http://www.lfd.uci.edu/~gohlke/pythonlibs/">http://www.lfd.uci.edu/~gohlke/pythonlibs/&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>OK, so this is not a Python distribution but it is compelling. 32-bit and 64-bit
platforms are catered for and MKL optimizations are available at no cost. Each
package needs to be installed individually, which can be seen as both good and bad.
Good because you only install what you actually require and bad because the initial
installation is protracted. That said, it is on my evaluation list for this week.&lt;/p>
&lt;h2 id="anymore">Anymore?&lt;/h2>
&lt;p>Those are the Python Distributions I&amp;rsquo;m aware of. Are there any others I should
consider?&lt;/p></description><summary>A selection of Python distributions for data analysis</summary></item><item><title>Spring cleaning Arch Linux</title><link>https://wimpysworld.com/posts/spring-cleaning-arch-linux/</link><pubDate>Tue, 07 May 2013 18:09:21 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/spring-cleaning-arch-linux/</guid><description>&lt;p>About a year ago I migrated all my workstations, laptops and netbooks to
&lt;a href="http://www.archlinux.org">Arch Linux&lt;/a>. Since then, I&amp;rsquo;ve setup Arch Linux
on a &lt;a href="http://www.raspberrypi.org">Raspberry Pi&lt;/a> and this server was also
recently migrated to Arch Linux.&lt;/p>
&lt;p>I&amp;rsquo;ve had no major issues issues during the last year and have upgraded through
five major Linux kernels, transitioned to &lt;code>systemd&lt;/code> and upgraded from GNOME 3.2
to 3.8.&lt;/p>
&lt;p>Although I have been disciplined about &lt;a href="https://wiki.archlinux.org/index.php/Pacnew_and_Pacsave_Files">merging &lt;code>.pacnew&lt;/code> files&lt;/a>
frequently, during the upgrades and experimentation&amp;rsquo;s I have packages installed
that I no longer require and obsolete files kicking about.&lt;/p>
&lt;p>After the upgrade to GNOME 3.8 I decided to clean up a little. I rarely dip
into the AUR, but when I do I always use &lt;a href="https://aur.archlinux.org/packages/packer/">&lt;code>packer&lt;/code>&lt;/a>
to clearly separate what is official from what is not.&lt;/p>
&lt;h2 id="finding-what-is-installed">Finding what is installed&lt;/h2>
&lt;p>The following commands are useful for identifying installed packages based on
where they were installed from. The package lists generated from the commands below
can be quite big but often highlight packages that I know I&amp;rsquo;m no longer using nor
require.&lt;/p>
&lt;h3 id="listing-installed-packages">Listing installed packages&lt;/h3>
&lt;p>List packages installed from the official repositories.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>pacman -Qq | grep -Fv -f &amp;lt;(pacman -Qqm)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>List packages installed from the AUR.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>pacman -Qqm
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="listing-installed-packages-by-size">Listing installed packages by size&lt;/h3>
&lt;p>Use &lt;code>pacsysclean&lt;/code> to list installed packages sorted by size, it helps identify
large packages that are no longer required which can the be manually uninstalled.&lt;/p>
&lt;h3 id="listing-orphaned-packages">Listing orphaned packages&lt;/h3>
&lt;p>List orphaned packages install from the official repositories.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>pacman -Qqtd | grep -Fv -f &amp;lt;(pacman -Qqtdm)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>List ophaned packages from the AUR.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>pacman -Qqmtd
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="getting-package-information">Getting package information&lt;/h3>
&lt;p>Get package information for a package in the official repositories.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>pacman -Si &amp;lt;package&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Get package information for a package in the AUR.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>packer -Si &amp;lt;package&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="removing-orphaned-packages">Removing orphaned packages&lt;/h2>
&lt;p>Removing orphaned packages manually can be very time consuming, but is by far the
safer option. However, I decided to take a brave pill a uninstall all orphaned
packages automatically.&lt;/p>
&lt;p>Remove all orphaned packages installed from the official repositories.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo pacman -Rs &lt;span style="color:#87ceeb">`&lt;/span>pacman -Qqtd | grep -Fv -f &amp;lt;(pacman -Qqtdm)&lt;span style="color:#87ceeb">`&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Remove all ophanced packages install from the AUR.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo pacman -Rs &lt;span style="color:#f00">$(&lt;/span>pacman -Qqtdm&lt;span style="color:#f00">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="re-installing-what-you-do-need">Re-installing what you do need&lt;/h2>
&lt;p>When you do something scary like removing all the obsolete packages automatically,
then you should really make sure you do have everything install that you require.&lt;/p>
&lt;h3 id="re-install-64-bit-base">Re-install 64-bit base&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo pacman -S --needed &lt;span style="color:#87ceeb">`&lt;/span>pacman -Sqg base multilib-devel | grep -v gcc-libs | tr &lt;span style="color:#87ceeb">&amp;#39;\n&amp;#39;&lt;/span> &lt;span style="color:#87ceeb">&amp;#39; &amp;#39;&lt;/span>&lt;span style="color:#87ceeb">`&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="re-install-32-bit-base">Re-install 32-bit base&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo pacman -S --needed &lt;span style="color:#87ceeb">`&lt;/span>pacman -Sqg base base-devel | tr &lt;span style="color:#87ceeb">&amp;#39;\n&amp;#39;&lt;/span> &lt;span style="color:#87ceeb">&amp;#39; &amp;#39;&lt;/span>&lt;span style="color:#87ceeb">`&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Reinstall the groups required for a GNOME 3 desktop.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo pacman -S --needed &lt;span style="color:#87ceeb">`&lt;/span>pacman -Sqg gnome gnome-extra telepathy | tr &lt;span style="color:#87ceeb">&amp;#39;\n&amp;#39;&lt;/span> &lt;span style="color:#87ceeb">&amp;#39; &amp;#39;&lt;/span>&lt;span style="color:#87ceeb">`&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Install all missing dependencies for packages in the official repositories.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo pacman -S --needed &lt;span style="color:#87ceeb">`&lt;/span>pacman -Si &lt;span style="color:#eedd82">$@&lt;/span> 2&amp;gt;/dev/null | awk -F &lt;span style="color:#87ceeb">&amp;#34;: &amp;#34;&lt;/span> -v &lt;span style="color:#eedd82">filter&lt;/span>=&lt;span style="color:#87ceeb">&amp;#34;^Depends&amp;#34;&lt;/span> &lt;span style="color:#87ceeb">\ &lt;/span>&lt;span style="color:#87ceeb">&amp;#39;$0 ~ filter {gsub(/[&amp;gt;=&amp;lt;][^ ]*/,&amp;#34;&amp;#34;,$2) ; gsub(/ +/,&amp;#34;\n&amp;#34;,$2) ; print $2}&amp;#39;&lt;/span> | grep -v smtp- | sort -u&lt;span style="color:#87ceeb">`&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Install all missing dependencies for packages in the AUR. This will re-install even if the
package is already installed. I can&amp;rsquo;t be arsed to filter it out for a one liner.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo packer -S --noedit --noconfirm &lt;span style="color:#87ceeb">`&lt;/span>packer -Si &lt;span style="color:#f00">$(&lt;/span>pacman -Qqm&lt;span style="color:#f00">)&lt;/span> 2&amp;gt;/dev/null | awk -F &lt;span style="color:#87ceeb">&amp;#34;: &amp;#34;&lt;/span> -v &lt;span style="color:#eedd82">filter&lt;/span>=&lt;span style="color:#87ceeb">&amp;#34;^Depends&amp;#34;&lt;/span> &lt;span style="color:#87ceeb">\ &lt;/span>&lt;span style="color:#87ceeb">&amp;#39;$0 ~ filter {gsub(/[&amp;gt;=&amp;lt;][^ ]*/,&amp;#34;&amp;#34;,$2) ; gsub(/ +/,&amp;#34;\n&amp;#34;,$2) ; print $2}&amp;#39;&lt;/span> | grep -v java- | sort -u&lt;span style="color:#87ceeb">`&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="find-files-not-associated-with-a-package">Find files not associated with a package&lt;/h2>
&lt;p>When packages are removed they may leave some files behind. The following will find all files
not associated with a package. These files can &lt;em>not&lt;/em> be automatically deleted, each entry
requires assessment.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>pacman -Qlq | sort -u &amp;gt; /tmp/db
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo find /bin /etc /sbin /usr ! -name lost+found &lt;span style="color:#87ceeb">\(&lt;/span> -type d -printf &lt;span style="color:#87ceeb">&amp;#39;%p/\n&amp;#39;&lt;/span> -o -print &lt;span style="color:#87ceeb">\)&lt;/span> | sort &amp;gt; /tmp/fs
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>comm -23 /tmp/fs /tmp/db
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>As with all spring cleaning chores, I got bored by this stage as my workstation
was looking pretty tidy. Much of what is presented in this blog post is a rehash
of what others have already contributed to the &lt;a href="https://wiki.archlinux.org/">Arch Linux Wiki&lt;/a>.
I&amp;rsquo;ve just organised what &amp;ldquo;&lt;em>Works For Me&lt;/em> ™&amp;rdquo; so I know what to do next year.&lt;/p>
&lt;h4 id="references">References&lt;/h4>
&lt;ul>
&lt;li>&lt;a href="https://wiki.archlinux.org/index.php/Pacman_Tips">https://wiki.archlinux.org/index.php/Pacman_Tips&lt;/a>&lt;/li>
&lt;/ul></description><summary>How to clean up installed packages on Arch Linux.</summary></item><item><title>get-iplayer on Debian 6.0</title><link>https://wimpysworld.com/posts/get-iplayer-on-debian-6.0/</link><pubDate>Mon, 25 Mar 2013 18:09:21 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/get-iplayer-on-debian-6.0/</guid><description>&lt;p>I use &lt;a href="http://www.infradead.org/get_iplayer/html/get_iplayer.html">get-iplayer&lt;/a>
to download TV programs so I can watch them on the devices that suit me, when it
suits me. What follows is how I install &lt;code>get-iplayer&lt;/code> on a headless Debian 6.0
server I have a home. The server in question is really low powered so building
from source was not an option.&lt;/p>
&lt;p>In order to install the latest version of &lt;code>get-iplayer&lt;/code> (currently 2.82) on
&lt;a href="http://www.debian.org">Debian&lt;/a> Squeeze a couple of additional package
repositories need enabling.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.deb-multimedia.org/">Debain Multimedia&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://backports-master.debian.org/">Debian Backports&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Enable the Debain Backports repository by adding the following line to
&lt;code>/etc/apt/sources.list.d/backports.list&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>deb http://backports.debian.org/debian-backports squeeze-backports main
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Enable the Debain Multimedia repository by adding the following lines to
&lt;code>/etc/apt/sources.list.d/multimedia.list&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>deb http://www.deb-multimedia.org squeeze main non-free
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb http://www.deb-multimedia.org squeeze-backports main
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Update the repositories.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get update
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Install the &lt;code>deb-multimedia-keyring&lt;/code> package.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get --allow-unauthenticated install deb-multimedia-keyring
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Install &lt;code>get-iplayer&lt;/code> (currently v2.78) from the official Debian repositories,
this will also install the dependencies.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get install get-iplayer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Install the &lt;code>get-iplayer&lt;/code> suggested packages.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get install ffmpeg rtmpdump libdata-dump-perl libid3-tools libcrypt-ssleay-perl libio-socket-ssl-perl
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>I have seen it suggested that &lt;code>mplayer&lt;/code> should also be installed. I&amp;rsquo;ve not
determined if that is an absolute requirement. But this is how to install it
on a headless Debian computer.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get --no-install-recommends install mplayer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Finally, upgrade &lt;code>get-iplayer&lt;/code> to v2.82.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get install libmp3-tag-perl libxml-simple-perl
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>wget http://ftp.uk.debian.org/debian/pool/main/g/get-iplayer/get-iplayer_2.82-2_all.deb
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo dpkg -i get-iplayer_2.82-2_all.deb
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>At this point &lt;code>get-iplayer&lt;/code> should be good to go and the &lt;a href="http://www.infradead.org/get_iplayer/html/get_iplayer.html">get-iplayer&lt;/a>
website and &lt;code>man get-iplayer&lt;/code> will assist you.&lt;/p>
&lt;h4 id="references">References&lt;/h4>
&lt;ul>
&lt;li>&lt;a href="http://www.infradead.org/get_iplayer/html/get_iplayer.html">http://www.infradead.org/get_iplayer/html/get_iplayer.html&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.deb-multimedia.org/">http://www.deb-multimedia.org/&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://backports-master.debian.org/">http://backports-master.debian.org/&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://lists.infradead.org/pipermail/get_iplayer/2012-June/003065.html">http://lists.infradead.org/pipermail/get_iplayer/2012-June/003065.html&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://tech.leeporte.co.uk/get_iplayer-under-debian-squeeze/">http://tech.leeporte.co.uk/get_iplayer-under-debian-squeeze/&lt;/a>&lt;/li>
&lt;/ul></description><summary>Installing get-iplayer on a Debian (Squeeze) 6.0</summary></item><item><title>Ployer Momo8 IPS Custom Firmware</title><link>https://wimpysworld.com/posts/ployer-momo8-ips-custom-firmware/</link><pubDate>Fri, 22 Mar 2013 13:35:34 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/ployer-momo8-ips-custom-firmware/</guid><description>&lt;p>I bought a &lt;a href="https://wimpysworld.com/posts/2012-09-quality-android-tablet-on-a-budget-ployer-momo8-ips/">budget Android tablet a little while back&lt;/a>
that turned out to be really rather good. However, there were issues with the
initial firmware.&lt;/p>
&lt;ul>
&lt;li>Connecting to, or maintaining connection with, some wireless networks was unreliable.&lt;/li>
&lt;li>When the internal NAND was under moderate load the tablet would become unresponsive.&lt;/li>
&lt;/ul>
&lt;p>Ployer released a firmware update in November 2012 and again in April 2013 which
addressed these issues. Here&amp;rsquo;s the translated change log.&lt;/p>
&lt;blockquote>
&lt;ol>
&lt;li>Increase the volume buttons on the vertical screen.&lt;/li>
&lt;li>System, audio and video decoding, browser, Flash player, 3G module, boot
animation module BUG repair.&lt;/li>
&lt;li>Update NandFlash, Mali, Wifi module drivers, while addressing some CTS
tests BUG and the stability of the system as a whole has been further
enhanced.&lt;/li>
&lt;li>Optimize Flash stability, improve the efficiency of the implementation of
the DDR.&lt;/li>
&lt;li>Default input method Sogou input method.&lt;/li>
&lt;li>Update Google Pinyin input method.&lt;/li>
&lt;/ol>
&lt;/blockquote>
&lt;p>However, the official Ployer firmware comes pre-loaded with a selection of
Chinese applications and defaults to a Chinese language.&lt;/p>
&lt;h1 id="objectives">Objectives&lt;/h1>
&lt;p>I decided to have a go a making my own custom firmware for the Ployer Momo8 IPS
with the following goals.&lt;/p>
&lt;ul>
&lt;li>Pre-rooted.&lt;/li>
&lt;li>Removal of pre-installed Chinese apps.&lt;/li>
&lt;li>Removal of bloatware.&lt;/li>
&lt;li>Extend &lt;code>/data&lt;/code> partition.&lt;/li>
&lt;li>Make it a &lt;i>&amp;ldquo;Google Experience&amp;rdquo;&lt;/i> device.&lt;/li>
&lt;li>ClockWorkMod Recovery (available to donors)&lt;/li>
&lt;/ul>
&lt;p>I think I&amp;rsquo;ve been fairly successful. My firmware includes Android 4.1.2
features and even some Android 4.2 features. Until someone successfully ports
&lt;a href="http://www.cyanogenmod.org/">cyanogenmod&lt;/a> to the Ployer Momo8 IPS or Ployer
release a 4.2.x update then my firmware is the most complete &lt;i>&amp;ldquo;Google Experience&amp;rdquo;&lt;/i>
you&amp;rsquo;ll find for the device.&lt;/p>
&lt;h1 id="changes">Changes&lt;/h1>
&lt;p>Below are the changes I made to the official Ployer Momo8 IPS firmware.&lt;/p>
&lt;h2 id="13164">13.164&lt;/h2>
&lt;p>This release is mainly a fix for Google+. The builds are running now and will
be available for download later today.&lt;/p>
&lt;ul>
&lt;li>Integrated SuperSU 1.32
&lt;ul>
&lt;li>&lt;a href="http://forum.xda-developers.com/showthread.php?t=1538053">http://forum.xda-developers.com/showthread.php?t=1538053&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Tweaked WiFi 2.4Ghz Transmit Power. &lt;code>maxp2ga0&lt;/code> is now 76 in:
&lt;ul>
&lt;li>This appears to be the default for other devices with the same chipset, feedback welcomed.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Reverted &lt;code>PlusOne.apk&lt;/code> to the version in 13.137
&lt;ul>
&lt;li>This should fix the force closes.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="13149">13.149&lt;/h2>
&lt;p>The purpose of this release is to refresh some system apps, address some
compatibility issues and to offer versions of my custom firmware based on both
20130325 and 20121120.&lt;/p>
&lt;ul>
&lt;li>Based on the Official Ployer MOMO8(IPS)-4.1.1-Firmware-20130325 and the Official Ployer MOMO8(IPS)-4.1.1-Firmware-20121120.
&lt;ul>
&lt;li>Feedback suggests that WiFi works better for some when using firmware based on the 20121120 version.&lt;/li>
&lt;li>&lt;u>Only donors will have access to the 20121120 versions.&lt;/u>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Integrated SuperSU 1.30
&lt;ul>
&lt;li>&lt;a href="http://forum.xda-developers.com/showthread.php?t=1538053">http://forum.xda-developers.com/showthread.php?t=1538053&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Removed the &lt;code>framework.jar&lt;/code> patch as it introduces incompatibilities of its own.&lt;/li>
&lt;li>Removed the PicoTTS voice data files from the &lt;code>/system&lt;/code> partition.
&lt;ul>
&lt;li>PicoTTS voices can be selectively installed via &lt;code>Settings -&amp;gt; Language and Input&lt;/code>.&lt;/li>
&lt;li>This is a space saving measure and essential for the 20121120 version.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Updated the following, as of May 25th 2013:
&lt;ul>
&lt;li>&lt;code>Magazines.apk&lt;/code> (Google Play Magazines)&lt;/li>
&lt;li>&lt;code>Music2.apk&lt;/code> (Google Play Music)&lt;/li>
&lt;li>&lt;code>PlusOne.apk&lt;/code> (Google+)&lt;/li>
&lt;li>&lt;code>Talk.apk&lt;/code> (Hangouts)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="13137">13.137&lt;/h2>
&lt;p>This release is focused on stability, adding the new Google Play features
announced at &lt;a href="https://developers.google.com/events/io/">Google I/O 2013&lt;/a> and
also includes everything from the previous releases.&lt;/p>
&lt;ul>
&lt;li>Integrated Android 4.2 sounds, fonts and boot animation
&lt;ul>
&lt;li>Boot animation is now the correct size, higher quality and doesn&amp;rsquo;t flicker at the end of a boot.&lt;/li>
&lt;li>All Android 4.2 sounds and fonts are now included.
&lt;ul>
&lt;li>Fixed default notification sound.&lt;/li>
&lt;li>Lock screen font looks much nicer.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="http://forum.xda-developers.com/showthread.php?t=1991734">http://forum.xda-developers.com/showthread.php?t=1991734&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Integrated Android 4.2.2 keyboard
&lt;ul>
&lt;li>&lt;a href="http://forum.xda-developers.com/showthread.php?p=38124560">http://forum.xda-developers.com/showthread.php?p=38124560&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Integrated Nova Launcher 2.1
&lt;ul>
&lt;li>&lt;a href="http://novalauncher.com">http://novalauncher.com&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Integrated Feedly 15.0.1
&lt;ul>
&lt;li>&lt;a href="http://www.feedly.com">http://www.feedly.com&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Integrated Power Toggles 4.6.6
&lt;ul>
&lt;li>&lt;a href="http://www.powertoggles.com">http://www.powertoggles.com&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Tweaked WiFi 2.4Ghz Transmit Power. &lt;code>maxp2ga0&lt;/code> is now 100 in:
&lt;ul>
&lt;li>&lt;code>/etc/firmware/nvram_RK901.txt&lt;/code> was previously 74.&lt;/li>
&lt;li>&lt;code>/etc/firmware/nvram_RK903.cal&lt;/code> was previously 76.&lt;/li>
&lt;li>&lt;code>/etc/firmware/nvram_RK903.txt&lt;/code> was previosuly 72.&lt;/li>
&lt;li>&lt;code>/etc/firmware/nvram_RK903_26M.cal&lt;/code> was previously 60.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Tweaked WiFi 5.0Ghz Transmit Power. &lt;code>maxp5ga0&lt;/code>, &lt;code>maxp5gla0&lt;/code> and &lt;code>maxp5gha0&lt;/code> are now 100 in:
&lt;ul>
&lt;li>&lt;code>/etc/firmware/nvram_RK903.cal&lt;/code> were all previously 80.&lt;/li>
&lt;li>&lt;code>/etc/firmware/nvram_RK903_26M.cal&lt;/code> were all previously 80.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Added camera icon to the application drawer.&lt;/li>
&lt;li>Fixed boot up time
&lt;ul>
&lt;li>Boot up time is significantly faster, with the exception of the first boot after a firmware flash.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Fixed apps disappearing from the Settings and the Play Store.&lt;/li>
&lt;li>Replaced Google Talk with Hangouts&lt;/li>
&lt;li>Removed Google Drive and Google Earth
&lt;ul>
&lt;li>When pre-installed they would Force Close.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Updated the following, as of May 16th 2013:
&lt;ul>
&lt;li>&lt;code>Books.apk&lt;/code> (Google Play Books)&lt;/li>
&lt;li>&lt;code>GestureSearch.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>Currents.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>GoogleEars.apk&lt;/code> (Sound Search)&lt;/li>
&lt;li>&lt;code>GmsCore.apk&lt;/code> (Google Play Services)&lt;/li>
&lt;li>&lt;code>Magazines.apk&lt;/code> (Google Play Magazines)&lt;/li>
&lt;li>&lt;code>Maps.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>Music2.apk&lt;/code> (Google Play Music)&lt;/li>
&lt;li>&lt;code>Phonesky.apk&lt;/code> (Play Store)&lt;/li>
&lt;li>&lt;code>Talk.apk&lt;/code> (Hangouts)&lt;/li>
&lt;li>&lt;code>TalkBack.apk&lt;/code> (Accessibility)&lt;/li>
&lt;li>&lt;code>Videos.apk&lt;/code> (Google Play Movies)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="13129">13.129&lt;/h2>
&lt;p>This version includes everything from the previous release plus the changes below.&lt;/p>
&lt;ul>
&lt;li>Based on the Official Ployer MOMO8(IPS)-4.1.1-Firmware-20130325
&lt;ul>
&lt;li>&lt;a href="http://download.ployer.cn/downdetail.asp?id=763">http://download.ployer.cn/downdetail.asp?id=763&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Boot loader upgraded to 1.22
&lt;ul>
&lt;li>Switching to Upgrade mode in Rockchip Batch Tool is much quicker.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Extended &lt;code>/system&lt;/code> partition from 375M to 428M&lt;/li>
&lt;li>Removed more Chinese applications and bloatware
&lt;ul>
&lt;li>Removed UCBrowser shared objects from &lt;code>/system/lib&lt;/code>&lt;/li>
&lt;li>Removed QQMiniHD shared objects from &lt;code>/system/lib&lt;/code>&lt;/li>
&lt;li>Removed more Adobe Reader shared objects from &lt;code>/system/lib&lt;/code> and fonts from &lt;code>/system/fonts/adobefonts&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Integrated Clockworkmod Recovery to 6.0.31 (donors only)
&lt;ul>
&lt;li>&lt;a href="http://androtab.info/clockworkmod/rockchip/changelog/">http://androtab.info/clockworkmod/rockchip/changelog/&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Integrated Adobe Flash 11.1.115.54
&lt;ul>
&lt;li>&lt;a href="http://helpx.adobe.com/flash-player/kb/archived-flash-player-versions.html">http://helpx.adobe.com/flash-player/kb/archived-flash-player-versions.html&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Integrated File Wrangler 1.5
&lt;ul>
&lt;li>&lt;a href="https://play.google.com/store/apps/details?id=com.amon.filewrangler">https://play.google.com/store/apps/details?id=com.amon.filewrangler&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Integrated AdAway 2.3 (Google now blocks all advert blockers from the Play Store)
&lt;ul>
&lt;li>&lt;a href="http://code.google.com/p/ad-away/">http://code.google.com/p/ad-away/&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Replaced Launcher2 4.1.5 with Nova Launcher 2.0.2
&lt;ul>
&lt;li>&lt;a href="http://novalauncher.com">http://novalauncher.com&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Replaced the default wallpaper with the default wallpaper from the Nexus 10.&lt;/li>
&lt;li>Removed User Management - it was not reliable.&lt;/li>
&lt;li>Removed &lt;code>Chrome.apk&lt;/code> but updated &lt;code>/system/lib/libchromeview.so&lt;/code> from Chrome 26.0.1410.58
&lt;ul>
&lt;li>This is a space saving measure but ensures the ROM is Chrome compatible.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Updated the following, as of May 10th 2013:
&lt;ul>
&lt;li>&lt;code>Authenticator.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>CalendarGoogle.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>Currents.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>Drive.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>Earth.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>Gmail.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>GooglePlayBooks.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>GooglePlayMagazines.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>GooglePlayMovies.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>GooglePlayMusic.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>GooglePlayServices.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>Keep.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>Maps.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>Phonesky.apk&lt;/code> (Play Store)&lt;/li>
&lt;li>&lt;code>PlusOne.apk&lt;/code> (Google+)&lt;/li>
&lt;li>&lt;code>Street.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>YouTube.apk&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="13080">13.080&lt;/h2>
&lt;ul>
&lt;li>Based on the Official Ployer MOMO8(IPS)-4.1.1-Firmware-20121120
&lt;ul>
&lt;li>&lt;a href="http://download.ployer.cn/downdetail.asp?id=763">http://download.ployer.cn/downdetail.asp?id=763&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Extended &lt;code>/data&lt;/code> partition to 2GB.
&lt;ul>
&lt;li>&lt;a href="http://www.freaktab.com/showthread.php?287-RockChip-ROM-Building-Tips-and-Tricks-by-Finless&amp;amp;p=4054&amp;amp;viewfull=1#post4054">http://www.freaktab.com/showthread.php?287-RockChip-ROM-Building-Tips-and-Tricks-by-Finless&amp;amp;p=4054&amp;amp;viewfull=1#post4054&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Removed Chinese applications.
&lt;ul>
&lt;li>&lt;code>UCBrowser_V2.1.1.219_Android3_pf147_(Build12110718).apk&lt;/code>&lt;/li>
&lt;li>&lt;code>dopoolplayer&lt;/code>&lt;/li>
&lt;li>&lt;code>iReader_android_v2000_108044_guanwang.apk&lt;/code> including shared objects from &lt;code>/system/lib&lt;/code>.&lt;/li>
&lt;li>&lt;code>market_hd.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>qiyiyingshi_V3.0_mumayi_e3d3e.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>qq_mini_hd_1.9.1.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>sougoushurufa.apk&lt;/code> including shared objects from &lt;code>/system/lib&lt;/code>.&lt;/li>
&lt;li>&lt;code>zhonghuawannianli_ECalendar_V3.2.3_mumayi_3ee39.apk&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Cleaned up &lt;code>build.prop&lt;/code>
&lt;ul>
&lt;li>Changed Chinese strings to ASCII&lt;/li>
&lt;li>Configured English (UK) as default language/locale.&lt;/li>
&lt;li>Configured Europe/London as default time zone.&lt;/li>
&lt;li>Default display brightness set at 50%&lt;/li>
&lt;li>Deleted settings for Chinese applications that have been removed.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Removed Rockchip Utilities.
&lt;ul>
&lt;li>&lt;code>ApkInstaller.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>RkExplorer.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>RKUpdateService.apk&lt;/code> including shared objects from &lt;code>/system/lib&lt;/code>.&lt;/li>
&lt;li>&lt;code>RkVideoPlayer.apk&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Removed bloatware.
&lt;ul>
&lt;li>Adobe Reader including shared objects from &lt;code>/system/lib&lt;/code>.&lt;/li>
&lt;li>DocsToGo.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Integrated SuperSU 1.25
&lt;ul>
&lt;li>&lt;a href="http://forum.xda-developers.com/showthread.php?t=1538053">http://forum.xda-developers.com/showthread.php?t=1538053&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Integrated Clockworkmod Recovery 6.0.28
&lt;ul>
&lt;li>&lt;a href="http://androtab.info/clockworkmod/rockchip/">http://androtab.info/clockworkmod/rockchip/&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://forum.xda-developers.com/showthread.php?t=2102679">http://forum.xda-developers.com/showthread.php?t=2102679&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Integrated Google Apps (JZO54K) 4.1.2
&lt;ul>
&lt;li>Adds the first boot Setup Wizard.&lt;/li>
&lt;li>Adds Picasa photo syncing.&lt;/li>
&lt;li>Face Unlock 4.1.2&lt;/li>
&lt;li>Google Talk 4.1.2&lt;/li>
&lt;li>&lt;a href="http://rootzwiki.com/topic/31532-gapps-412-485486-jzo54k-gapps-package-1012/">http://rootzwiki.com/topic/31532-gapps-412-485486-jzo54k-gapps-package-1012/&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Integrated Launcher2 4.2, includes 50% transparency on app drawer.
&lt;ul>
&lt;li>&lt;a href="http://forum.xda-developers.com/showthread.php?t=1995812">http://forum.xda-developers.com/showthread.php?t=1995812&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Integrated some Jelly Bean 4.2 features:
&lt;ul>
&lt;li>Jelly Bean 4.2 clock.&lt;/li>
&lt;li>Jelly Bean 4.2 keyboard with gesture.&lt;/li>
&lt;li>Movie Studio video editor.&lt;/li>
&lt;li>&lt;a href="http://forum.xda-developers.com/showthread.php?t=2010535">http://forum.xda-developers.com/showthread.php?t=2010535&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Integrated Cyanogenmod 10.0 APKs
&lt;ul>
&lt;li>&lt;code>Calculator.apk&lt;/code> : Adds different calculator panels.&lt;/li>
&lt;li>&lt;code>Galaxy4.apk&lt;/code> : Smaller APK&lt;/li>
&lt;li>&lt;code>HoloSpiralWallpaper.apk&lt;/code> : Smaller APK&lt;/li>
&lt;li>&lt;code>LiveWallpapers.apk&lt;/code> : Smaller APK&lt;/li>
&lt;li>&lt;code>LiveWallpapersPicker.apk&lt;/code> : Smaller APK&lt;/li>
&lt;li>&lt;code>MagicSmokeWallpapers.apk&lt;/code> : Smaller APK&lt;/li>
&lt;li>&lt;code>NoiseField.apk&lt;/code> : Smaller APK&lt;/li>
&lt;li>&lt;code>PhaseBeam.apk&lt;/code> : Smaller APK&lt;/li>
&lt;li>&lt;code>SoundRecorder.apk&lt;/code> : Smaller APK&lt;/li>
&lt;li>&lt;code>VisualizationWallpapers.apk&lt;/code> : Smaller APK&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Integrated Adobe Flash 11.1.115.47
&lt;ul>
&lt;li>&lt;a href="http://helpx.adobe.com/flash-player/kb/archived-flash-player-versions.html">http://helpx.adobe.com/flash-player/kb/archived-flash-player-versions.html&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Integrated Quick Boot 4.2
&lt;ul>
&lt;li>&lt;a href="https://play.google.com/store/apps/details?id=com.siriusapplications.quickboot">https://play.google.com/store/apps/details?id=com.siriusapplications.quickboot&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Integrated File Wrangler 1.4
&lt;ul>
&lt;li>&lt;a href="https://play.google.com/store/apps/details?id=com.amon.filewrangler">https://play.google.com/store/apps/details?id=com.amon.filewrangler&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Integrated User Management
&lt;ul>
&lt;li>&lt;a href="http://forum.xda-developers.com/showthread.php?t=1824066">http://forum.xda-developers.com/showthread.php?t=1824066&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://play.google.com/store/apps/details?id=com.appaholics.um">https://play.google.com/store/apps/details?id=com.appaholics.um&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Integrated busybox 1.20.2&lt;/li>
&lt;li>Added additional permissions files for increased compatibility.
&lt;ul>
&lt;li>&lt;code>android.hardware.camera.autofocus.xml&lt;/code>&lt;/li>
&lt;li>&lt;code>android.hardware.camera.front.xml&lt;/code>&lt;/li>
&lt;li>&lt;code>android.hardware.ethernet.xml&lt;/code>&lt;/li>
&lt;li>&lt;code>android.hardware.sensor.accelerometer.xml&lt;/code>&lt;/li>
&lt;li>&lt;code>android.hardware.sensor.light.xml&lt;/code>&lt;/li>
&lt;li>&lt;code>android.hardware.touchscreen.multitouch.xml&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Replaced ring tones, alerts and notifications with the audio from Nexus 4.&lt;/li>
&lt;li>Replaced boot animation with the Nexus animation.&lt;/li>
&lt;li>Replaced the default wallpaper with one from the Jelly Bean SDK.&lt;/li>
&lt;li>Updated the following, as of March 18th 2012:
&lt;ul>
&lt;li>&lt;code>CalendarGoogle.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>Gmail.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>GooglePlayMovies.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>GooglePlayMusic.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>GooglePlayServices.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>PlusOne.apk&lt;/code> (Google+)&lt;/li>
&lt;li>&lt;code>Maps.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>Phonesky.apk&lt;/code> (Google Play Store)&lt;/li>
&lt;li>&lt;code>Street.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>YouTube.apk&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Removed &lt;code>Chrome.apk&lt;/code> but updated &lt;code>/system/lib/libchromeview.so&lt;/code>.
&lt;ul>
&lt;li>This is a space saving measure but ensures the ROM is Chrome compatible.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Patched &lt;code>framework.jar&lt;/code> so that Gameloft titles work.
&lt;ul>
&lt;li>&lt;a href="http://www.slatedroid.com/topic/50354-gameloft-game-fix-for-license-check-or-loop/">http://www.slatedroid.com/topic/50354-gameloft-game-fix-for-license-check-or-loop/&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://dragondevs.com/index.php?/topic/1265-gameloft-game-fix-for-license-check-or-loop/">http://dragondevs.com/index.php?/topic/1265-gameloft-game-fix-for-license-check-or-loop/&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://forum.xda-developers.com/showthread.php?t=955847">http://forum.xda-developers.com/showthread.php?t=955847&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>All APKs are ZipAligned.&lt;/li>
&lt;/ul>
&lt;h2 id="what-didnt-change">What didn&amp;rsquo;t change&lt;/h2>
&lt;ul>
&lt;li>I haven&amp;rsquo;t modified &lt;code>build.prop&lt;/code> to make the Ployer Momo8 IPS masquerade as
another brand or model of Android device. I will not be making this change, please
don&amp;rsquo;t request it.&lt;/li>
&lt;li>Although my firmware includes many features from Android 4.1.2 and some from
Android 4.2 I haven&amp;rsquo;t bumped the Android version or Build number. That would be
dishonest and misleading.&lt;/li>
&lt;/ul>
&lt;h2 id="known-issues">Known Issues&lt;/h2>
&lt;ul>
&lt;li>Adobe Flash is enabled the first time the Browser app (not Chrome) is executed.&lt;/li>
&lt;li>Hangouts app does not work on the first boot following a firmware flash. It
does works correctly on subsequent boots.&lt;/li>
&lt;li>Although &lt;code>busybox&lt;/code> is included in the ROM, no sym-links are created.&lt;/li>
&lt;li>Some Gameloft titles may not work, Asphalt 7 for example. Do other Gameloft
titles work properly? This problem is present in the official Ployer firmware too,
there are framework patches to fix this problem but they seem to introduce other
incompatibilities.&lt;/li>
&lt;/ul>
&lt;h1 id="donate">Donate&lt;/h1>
&lt;p>&lt;del>Please consider donating to this project. It is nice to have the effort I&amp;rsquo;ve
put into this custom firmware recognized. I don&amp;rsquo;t ask for much, it is at your
discretion, but just think how happy I&amp;rsquo;ll look when I am sipping the beer you
bought me 😄&lt;/del>&lt;/p>
&lt;h1 id="downloads">Downloads&lt;/h1>
&lt;p>You&amp;rsquo;ll need Rockchip Batch Tool which include the RockChip USB drivers and
the firmware flashing utility. I&amp;rsquo;ve modified Rockchip Batch Tool to default to
English language and removed old logs and transient data to reduce the size of
the download. You&amp;rsquo;ll also need the firmware itself.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://ge.tt/9NH0edD1?c" target="_blank">Ployer MOMO8 IPS Firmware&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Download Rockchip Batch Tool and the STOCK RECOVERY version of the ROM. Unzip both
archives once they are downloaded.&lt;/p>
&lt;h1 id="how-to-flash">How to Flash&lt;/h1>
&lt;div class="alert alert-warning">&lt;strong>Warning&lt;/strong> Always (&lt;u>I can't
stress this enough&lt;/u>) flash the STOCK RECOVERY version of my custom ROM.
&lt;strong>Never&lt;/strong> flash the CWM RECOVERY version without first having
flashed the STOCK RECOVERY version. If you are upgrading from another ROM
(even one of mine) always flash the STOCK RECOVERY version first.&lt;/div>
&lt;p>Flashing this ROM will will effectively factory reset your tablet, wipe your
installed apps, app data and preferences. If you have rooted your tablet you
might want to consider making a backup with
&lt;a href="https://play.google.com/store/apps/details?id=com.keramidas.TitaniumBackup">Titanium Backup * root&lt;/a>.
If you have not rooted your tablet then you could use &lt;a href="https://play.google.com/store/apps/details?id=com.koushikdutta.backup">Helium - App Sync and Backup&lt;/a>.&lt;/p>
&lt;ul>
&lt;li>Install the Rockchip USB drivers included with Rockchip Batch Tool.
&lt;ul>
&lt;li>This was simple of Windows XP but I couldn&amp;rsquo;t get Windows 7 to accept the Rockchip drivers. However, installing &lt;a href="http://www.moborobo.com/">MoboRobo&lt;/a> on Windows 7 provided the correct driver.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Turn the Ployer Momo8 IPS on.&lt;/li>
&lt;li>On the tablet go to &lt;code>Settings&lt;/code> -&amp;gt; &lt;code>Developer options&lt;/code> and &lt;strong>untick&lt;/strong> &lt;code>USB debugging&lt;/code>.&lt;/li>
&lt;li>Start &lt;code>RKBatchTool.exe&lt;/code>.&lt;/li>
&lt;li>In &lt;code>RKBatchTool&lt;/code> choose firmware file, click the &lt;code>Switch&lt;/code> button. The
device icon should change to green to indicate a successful connection.&lt;/li>
&lt;/ul>
&lt;div class="alert alert-info">&lt;strong>Note&lt;/strong> The very first time your
`Switch` to upgrade mode, Windows may prompt you to install additional
Rockchip USB drivers.&lt;/div>
&lt;ul>
&lt;li>&lt;strong>Only if the device icon changed to Green&lt;/strong>, click &lt;code>Upgrade&lt;/code>.&lt;/li>
&lt;li>The firmware will be flashed and the tablet will automatically reboot into Recovery.&lt;/li>
&lt;li>You will see a green Android and then the paritions (&lt;code>/data&lt;/code>, &lt;code>/cache&lt;/code> and &lt;code>/mnt/sdcard&lt;/code>) will be formatted.
&lt;ul>
&lt;li>&lt;code>/mnt/sdcard&lt;/code> is the internal memory, not the microSDHC card inserted in the card reader.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>When the formatting is complete the tablet will reboot.&lt;/li>
&lt;/ul>
&lt;p>The first boot may take a little longer than usual. You will be presented with
the Welcome wizard where you can configure language and locale, etc. You can
optionally enter your Google Apps or Gmail account credentials and doing so will
prompt for which Wifi network to associate with.&lt;/p>
&lt;h2 id="rockchip-batch-tool-video">Rockchip Batch Tool Video&lt;/h2>
&lt;p>I&amp;rsquo;ve also made a video showing how to flash the firmware. Frankly, the
hardest part is getting the Rockchip drivers installed.&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/Itcy13bYJfU" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;h1 id="how-to-flash-the-cwm-version">How to Flash the CWM version&lt;/h1>
&lt;div class="alert alert-block">&lt;strong>Warning&lt;/strong> Like I said,
&lt;strong>never&lt;/strong> flash the CWM RECOVERY version of my ROM without first
having flashed the STOCK RECOVERY version. The CWM version is made available
to donors.&lt;/div>
&lt;ul>
&lt;li>Flash the STOCK RECOVERY version of the ROM as detailed above.&lt;/li>
&lt;li>Follow the same procedure, but this time flash the CWM RECOVERY version.&lt;/li>
&lt;li>When the CWM RECOVERY flash is complete the tablet will boot into CWM recovery. Do the following:
&lt;ul>
&lt;li>&lt;code>wipe cache partition&lt;/code>&lt;/li>
&lt;li>&lt;code>advanced&lt;/code> -&amp;gt; &lt;code>wipe dalvik cache&lt;/code>&lt;/li>
&lt;li>&lt;code>++++++Go Back++++++&lt;/code>&lt;/li>
&lt;li>&lt;code>reboot system now&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>The tablet will reboot, it will be a slower boot than usual but subsequent boots will be quicker.&lt;/li>
&lt;/ul>
&lt;h2 id="clockworkmod-recovery">ClockWorkMod Recovery&lt;/h2>
&lt;p>Booting to recovery can be achieved using the pre-install Quick Boot app.&lt;/p>
&lt;p>The Ployer Momo8 IPS only has one hardware button (power) so CWM is controlled
with gestures.&lt;/p>
&lt;ul>
&lt;li>Swipe up/down: up/down&lt;/li>
&lt;li>Swipe left: select&lt;/li>
&lt;li>Swipe right: back&lt;/li>
&lt;/ul>
&lt;p>The Power button also acts as select, which I find to be the most reliable way
to select an action.&lt;/p>
&lt;h1 id="faq">FAQ&lt;/h1>
&lt;h2 id="does-this-custom-firmware-fix-wifi-connectivity">Does this custom firmware fix WiFi connectivity?&lt;/h2>
&lt;p>Short answer, possibly.&lt;/p>
&lt;p>Of all the WiFi networks I have access to, only one causes the Ployer Momo8
IPS to encounter weak signal and intermittent connections. When using the
Official Ployer firmware on that WiFi network, connecting more than 5 meters
from the access point is unreliable and maintaining a connection is almost
impossible.&lt;/p>
&lt;p>Using my firmware I can connect and maintain a connection up to about 10
meters from the access point. My testing, and the feedback from others
suggests the my firmware improves the WiFi signal by 8 to 10dBm.&lt;/p>
&lt;p>From my testing the Momo8 IPS appears to have issues with some wireless access
points, possibly related to the chipset in the access point or the Momo8 IPS,
but I&amp;rsquo;ve not been able to pin it down. That said, I&amp;rsquo;ve got access to 2 Draytek
Vigor routers and the Momo8 IPS does not work well with either of them. Every
other wireless network I&amp;rsquo;ve connected to works well.&lt;/p>
&lt;p>For example, at home I stream 720p movies via DLNA over WiFi and watch them on
the Momo8 IPS using &lt;a href="https://play.google.com/store/apps/details?id=com.mxtech.videoplayer.ad">MX Player&lt;/a>.
It works perfectly and never buffers or lags. However, your mileage may vary.&lt;/p>
&lt;h2 id="why-should-i-always-flash-the-stock-recovery-version-first">Why should I always flash the STOCK RECOVERY version first?&lt;/h2>
&lt;p>Short answer, it&amp;rsquo;s the safest option.&lt;/p>
&lt;p>There are 6 different ROMs (official or otherwise) that I am aware of for the
Ployer Momo8 IPS. They &lt;strong>all&lt;/strong> have slightly different partition layouts. If
you flash one of my CWM RECOVERY ROMs over a ROM using a slightly different
partition layout, it will almost certainly soft brick the tablet. The STOCK
RECOVERY will always correctly format the partitions directly after a flash,
thereby mitigating the risk of soft bricking the tablet.&lt;/p>
&lt;h2 id="ooops-ive-soft-bricked-my-tablet-what-do-i-do">Ooops, I&amp;rsquo;ve soft bricked my tablet. What do I do?&lt;/h2>
&lt;p>Read the comments here, there are several useful tips. You can also use the
comments here to see if anyone can offer assistance. Alternatively, go the
Ployer Momo8 forum on Slatedroid, read what others have done and ask for
help.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.slatedroid.com/forum/445-momo8/">http://www.slatedroid.com/forum/445-momo8/&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="how-do-the-20130325-and-20121120-versions-differ">How do the 20130325 and 20121120 versions differ.&lt;/h2>
&lt;p>The differences Ployer made between 20130325 and 20121120 is not well
documented. I did some additional analysis of what changed between the
November 2012 and April 2013 releases from Ployer, you can find my
notes here:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.slatedroid.com/topic/68650-new-official-firmware-momo8-ips-411-firmware-20130325/page__view__findpost__p__819153">New Official Firmware: MOMO8 (IPS) -4.1.1 firmware 20130325&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>In addition to whatever Ployer changed, this is how my 20121120 differs from
20130325.&lt;/p>
&lt;ul>
&lt;li>The &lt;code>/system&lt;/code> partition on the 20121120 version is 375MB, therefore the
following system apps are not included:
&lt;ul>
&lt;li>&lt;code>AdAway.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>Authenticator.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>Books.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>Currents.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>Feedly.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>GestureSearch.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>Keep.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>Magazines.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>Videos.apk&lt;/code>&lt;/li>
&lt;li>&lt;code>YouTube.apk&lt;/code>&lt;/li>
&lt;li>All of the above can be installed from the Play Store, which the exception
of &lt;a href="http://code.google.com/p/ad-away/">AdAway&lt;/a> which can be side-loaded.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Boot loader is version 1.20 rather than the newer 1.22.&lt;/li>
&lt;li>All other tweaks and modifications are the same.&lt;/li>
&lt;/ul>
&lt;p>Some people have reported that WiFi is more reliable when using a firmware
based on 20121120. Due to the size of the custom firmwares and the bandwidth they
consume, &lt;u>custom versions of my firmware based on 20121120 are only available
to donors&lt;/u>.&lt;/p>
&lt;h1 id="feedback">Feedback&lt;/h1>
&lt;p>Your feedback is welcome, please use the comments are below.&lt;/p></description><summary>Ployer Momo8 IPS Custom Firmware with ClockWorkMod</summary></item><item><title>Headless Debian 6.0 Torrent Server</title><link>https://wimpysworld.com/posts/headless-debian-6.0-torrent-server/</link><pubDate>Thu, 21 Mar 2013 17:35:22 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/headless-debian-6.0-torrent-server/</guid><description>&lt;p>I recently switched ISPs at home and now have unlimited high speed broadband.&lt;/p>
&lt;p>Finally I can participate in torrenting Linux .ISO images. I always download
the latest distros using &lt;a href="http://en.wikipedia.org/wiki/BitTorrent">BitTorrent&lt;/a>
and can now contribute to the community by seeding the distros I&amp;rsquo;ve downloaded.&lt;/p>
&lt;p>I have a small (in size and resources) &lt;a href="http://www.debian.org">Debian&lt;/a> 6.0
headless server at home that I wanted to turn into a torrent box. I&amp;rsquo;m a big fan
of &lt;a href="http://www.transmissionbt.com/">Transmission&lt;/a> since it can be managed from
the shell, web and Android phone/tablet. Sadly, the Transmission packages in the
official Debain squeeze repositories are quite old, 2.03 at the time of writing,
and there are no Transmission packages in &lt;a href="http://backports-master.debian.org/">Debian Backports&lt;/a>.&lt;/p>
&lt;p>However after flexing my &lt;em>google-fu&lt;/em> I found a &lt;a href="http://apt.balocco.name/changelog.txt">3rd party Debian Squeeze
repository&lt;/a> that includes fairly current
(2.73 at the time of writing) Transmission packages specifically for headless use.
Yah!&lt;/p>
&lt;h2 id="install-transmission-daemon">Install Transmission Daemon&lt;/h2>
&lt;p>First become root.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo -s -H
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Add the repository key.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>apt-key adv --keyserver keyserver.ubuntu.com --recv-key 92B84A1E
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Add the repository.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>echo &lt;span style="color:#87ceeb">&amp;#34;deb http://apt.balocco.name squeeze main&amp;#34;&lt;/span> &amp;gt; /etc/apt/sources.list.d/balocco.list
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Update the package list.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>apt-get update
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Install Transmission.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>apt-get install transmission-cli transmission-daemon transmission-webinterface
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="basic-configuration">Basic Configuration&lt;/h2>
&lt;p>The Transmission settings can be found in &lt;code>/etc/transmission-daemon/settings.json&lt;/code>.&lt;/p>
&lt;p>&lt;strong>If &lt;code>transmission-daemon&lt;/code> is running when you make changes to &lt;code>settings.json&lt;/code>
the changes you make will be discarded the next time &lt;code>transmission-daemon&lt;/code> is started.&lt;/strong>&lt;/p>
&lt;p>Therefore either stop &lt;code>transmission-daemon&lt;/code> before you make any changes or you can make
the daemon reload &lt;code>settings.json&lt;/code> by sending it the SIGHUP signal.&lt;/p>
&lt;h3 id="connect-from-anywhere">Connect from anywhere&lt;/h3>
&lt;p>If you want to be able to connect to Transmission from anywhere on the Internet
stop &lt;code>transmission-daemon&lt;/code>, make the following changes to &lt;code>settings.json&lt;/code> and
then start &lt;code>transmission-daemon&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">&amp;#34;rpc-password&amp;#34;&lt;/span>: &lt;span style="color:#87ceeb">&amp;#34;YourPlainTextPassword&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">&amp;#34;rpc-username&amp;#34;&lt;/span>: &lt;span style="color:#87ceeb">&amp;#34;YourUsername&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">&amp;#34;rpc-whitelist-enabled&amp;#34;&lt;/span>: &lt;span style="color:#f00">false&lt;/span>,
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>rpc-username&lt;/code> field will need adding but you can edit the existing entry
for &lt;code>rpc-password&lt;/code>. Enter the &lt;code>rpc-password&lt;/code> as a plain text string, Transmission
will automatically convert the password to a hash the next time it is started.&lt;/p>
&lt;h2 id="connect-via-a-browser">Connect via a browser&lt;/h2>
&lt;p>You should now be able to access the Transmission web interface via
&lt;code>http://yourhost.example.org:9091&lt;/code>. If you didn&amp;rsquo;t change the username and password
(you really should) the defaults are:&lt;/p>
&lt;ul>
&lt;li>Username : &lt;code>transmission&lt;/code>&lt;/li>
&lt;li>Password : &lt;code>transmission&lt;/code>&lt;/li>
&lt;/ul>
&lt;h2 id="connect-via-android">Connect via Android&lt;/h2>
&lt;p>I have an Android phone and an Android tablet. I use
&lt;a href="https://play.google.com/store/apps/details?id=com.neogb.rtac">Remote Transmission&lt;/a>
on my Android devices to manage my torrent box.&lt;/p>
&lt;h2 id="connect-via-the-shell">Connect via the shell&lt;/h2>
&lt;p>If, like me, you spend the majority of you time at the shell. Then
&lt;a href="https://github.com/fagga/transmission-remote-cli">transmission-remote-cli&lt;/a> is
probably for you. All my workstation run &lt;a href="http://www.archlinux.org">Arch Linux&lt;/a> so
I install &lt;code>transmission-remote-cli&lt;/code> as follows.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo pacman -S transmission-remote-cli
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>See the GitHub project page for &lt;code>tramission-remote-cli&lt;/code> for instructions on how
to connect to a remote Transmission daemon.&lt;/p>
&lt;h2 id="block-list">Block List&lt;/h2>
&lt;p>Regardless of how you intend to use Transmission you should enable a block list,
this can be done via &lt;code>settings.json&lt;/code> and the web interface. The following block
lists are a good start.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://list.iblocklist.com/?list=bt_level1&amp;amp;fileformat=p2p&amp;amp;archiveformat=gz">http://list.iblocklist.com/?list=bt_level1&amp;amp;fileformat=p2p&amp;amp;archiveformat=gz&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.bluetack.co.uk/config/level1.gz">http://www.bluetack.co.uk/config/level1.gz&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>That covers the basics for getting Transmission running on headless Debian 6.0 and
how to connect to it from just about anywhere and on any device. I recommend reading
the &lt;a href="https://trac.transmissionbt.com/wiki">Trasmission Wiki&lt;/a> as Transmission is
capable of so much more than I have covered in this blog post.&lt;/p>
&lt;p>Happy torrenting.&lt;/p>
&lt;h4 id="references">References&lt;/h4>
&lt;ul>
&lt;li>&lt;a href="http://apt.balocco.name/changelog.txt">http://apt.balocco.name/changelog.txt&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.lowendtalk.com/discussion/1001/squeeze-repository">http://www.lowendtalk.com/discussion/1001/squeeze-repository&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://trac.transmissionbt.com/wiki/EditConfigFiles">https://trac.transmissionbt.com/wiki/EditConfigFiles&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/fagga/transmission-remote-cli">https://github.com/fagga/transmission-remote-cli&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.iblocklist.com/">http://www.iblocklist.com/&lt;/a>&lt;/li>
&lt;/ul></description><summary>Installing Transmission daemon on headless Debian (Squeeze) 6.0</summary></item><item><title>Install nginx on Debian</title><link>https://wimpysworld.com/posts/install-nginx-on-debian/</link><pubDate>Thu, 14 Mar 2013 18:09:21 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/install-nginx-on-debian/</guid><description>&lt;p>My webserver of choice is &lt;a href="http://nginx.org/">nginx&lt;/a>, it&amp;rsquo;s resource friendly,
fast, reliable and versatile.&lt;/p>
&lt;p>I have a resource constrained Debian 6.0 &amp;ldquo;server&amp;rdquo; and wanted to deploy nginx on
it for testing. Sadly, the nginx package in the Squeeze repositories is very old.
Fortunately, the nginx team maintain a Debian package repository.&lt;/p>
&lt;p>Add the nginx repository.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo nano /etc/apt/sources.list.d/nginx.list
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="squeeze">Squeeze&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>deb http://nginx.org/packages/debian/ squeeze nginx
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb-src http://nginx.org/packages/debian/ squeeze nginx
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="wheezy">Wheezy&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>deb http://nginx.org/packages/debian/ wheezy nginx
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb-src http://nginx.org/packages/debian/ wheezy nginx
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Download the nginx package signing key.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>wget http://nginx.org/keys/nginx_signing.key
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Add the nginx package signing key to the keyring.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-key add nginx_signing.key
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Update the repositories.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get update
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Install nginx.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get install nginx
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>I run &lt;code>ufw&lt;/code> on my VPS so use the following to allow external access to my
website.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo ufw allow 80/tcp
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>nginx is installed and can be configured in the usual way.&lt;/p>
&lt;h4 id="references">References&lt;/h4>
&lt;ul>
&lt;li>&lt;a href="http://wiki.nginx.org/Install">http://wiki.nginx.org/Install&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://wiki.nginx.org/Pgp">http://wiki.nginx.org/Pgp&lt;/a>&lt;/li>
&lt;/ul></description><summary>Installing nginx on a Debian (Squeeze) 6.0 and (wheezy) 7.0</summary></item><item><title>nullmailer on Arch Linux</title><link>https://wimpysworld.com/posts/nullmailer-on-arch-linux/</link><pubDate>Sat, 09 Mar 2013 23:27:43 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/nullmailer-on-arch-linux/</guid><description>&lt;p>I&amp;rsquo;ve been a fan of &lt;a href="http://untroubled.org/nullmailer/">nullmailer&lt;/a> for some years
now, so much so that I took ownership of the &lt;a href="https://aur.archlinux.org/packages/nullmailer/">nullmailer package for Arch Linux&lt;/a>.&lt;/p>
&lt;blockquote>
&lt;p>nullmailer is a sendmail/qmail/etc replacement MTA for hosts which
relay to a fixed set of smart relays. It is designed to be simple to
configure, secure, and easily extendable.&lt;/p>
&lt;/blockquote>
&lt;p>The other advantage &lt;code>nullmailer&lt;/code> has compared to similar tools is that is queues
email until it is able to deliver it upstream.&lt;/p>
&lt;p>Install &lt;code>nullmailer&lt;/code> as follows.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>packer -S --noedit --noconfirm nullmailer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Configuring &lt;code>nullmailer&lt;/code> to relay via Gmail can be achieved using
&lt;a href="http://en.wikipedia.org/wiki/SMTPS">SMTPS&lt;/a> or
&lt;a href="http://en.wikipedia.org/wiki/Mail_submission_agent">MSA&lt;/a>. &lt;code>nullmailer&lt;/code> has
had these capabilities since 1.10. The following provides some useful clues
&lt;code>/usr/lib/nullmailer/smtp --help&lt;/code>.&lt;/p>
&lt;p>While these examples are specific to relaying via Gmail, you can see it is
trivial to adapt them to any other mail host.&lt;/p>
&lt;h2 id="relay-via-gmail-using-msa">Relay via Gmail using MSA&lt;/h2>
&lt;p>Add to following to &lt;code>/etc/nullmailer/remotes&lt;/code>. I prefer this technique.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>smtp.gmail.com smtp --port=&lt;span style="color:#f60">587&lt;/span> --auth-login --user=you@gmail.com --pass=Yourpassword --starttls
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="relay-via-gmail-using-smtps">Relay via Gmail using SMTPS&lt;/h2>
&lt;p>Add to following to &lt;code>/etc/nullmailer/remotes&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>smtp.gmail.com smtp --port=&lt;span style="color:#f60">465&lt;/span> --auth-login --user=you@gmail.com --pass=Yourpassword --ssl
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Once you&amp;rsquo;ve got &lt;code>/etc/nullmailer/remotes&lt;/code> configured start the nullmailer service.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo systemctl start nullmailer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>To test &lt;code>nullmailer&lt;/code> can relay email correctly do the following.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>echo &lt;span style="color:#87ceeb">&amp;#34;Test 1&amp;#34;&lt;/span> | mailx -s &lt;span style="color:#87ceeb">&amp;#34;Test One&amp;#34;&lt;/span> me@example.org
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You can see what &lt;code>nullmailer&lt;/code> is up to by checking the systemd journal or syslog
(if you&amp;rsquo;ve syslog enabled systemd). This is how to get the logs from the systemd
journal.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>journalctl &lt;span style="color:#eedd82">_SYSTEMD_UNIT&lt;/span>=nullmailer.service
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Or via syslog.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo grep nullmailer /var/log/daemon.log
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>When you&amp;rsquo;re happy &lt;code>nullmailer&lt;/code> is working enable the systemd unit.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo systemctl enable nullmailer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Email will now flow as required.&lt;/p></description><summary>Configuring nullmailer on Arch Linux to relay email via Gmail</summary></item><item><title>Uncomplicated Firewall (UFW) on Arch Linux</title><link>https://wimpysworld.com/posts/uncomplicated-firewall-ufw-on-arch-linux/</link><pubDate>Sat, 09 Mar 2013 08:37:43 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/uncomplicated-firewall-ufw-on-arch-linux/</guid><description>&lt;p>While migrating one of my VPS servers to &lt;a href="http://www.archlinux.org">Arch Linux&lt;/a>
I deployed &lt;a href="https://wiki.ubuntu.com/UncomplicatedFirewall">Uncomplicated Firewall (UFW)&lt;/a>
to handle basic firewall duties. I like &lt;code>ufw&lt;/code> as it provides simple host-based
firewall management and, in my opinion, one of the better projects to come out
of the Ubuntu camp.&lt;/p>
&lt;p>Install &lt;code>ufw&lt;/code> as follows.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo pacman -Syy -noconfirm --needed ufw
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Configuring &lt;code>ufw&lt;/code> is simple but make sure you have console access to the host
you are configuring just in case you lock yourself out.&lt;/p>
&lt;p>&lt;strong>NOTE!&lt;/strong> When enabling &lt;code>ufw&lt;/code> the chains are flushed and connections may be
dropped. You can add rules to the firewall before enabling it however, so if you
are testing &lt;code>ufw&lt;/code> on a remote machine it is recommended you perform&amp;hellip;&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>ufw allow ssh/tcp
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&amp;hellip;before running &lt;code>sudo ufw enable&lt;/code>. Once the firewall is enabled, adding and
removing rules will not flush the firewall, although modifying an existing rule
will.&lt;/p>
&lt;p>Set the default behaviour to deny all incoming connections.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo ufw default deny
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Open up TCP port 22 but with rate limiting enabled which will deny connections
from an IP address that has attempted to initiate 6 or more connections in the
last 30 seconds. Ideal for protecting &lt;code>sshd&lt;/code> but you should conisder other
&lt;a href="https://wimpysworld.com/posts/ssh-brute-force-defense/">SSH brute force defense&lt;/a>
techniques as well.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo ufw limit tcp/22
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>I&amp;rsquo;m hosting a few websites on my VPS so I open http and https.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo ufw allow 80/tcp
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo ufw allow 443/tcp
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Enable the &lt;code>ufw&lt;/code> systemd unit.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo systemctl enable ufw
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo systemctl start ufw
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>However, &lt;code>ufw&lt;/code> is not enabled at this point. To enable the firewall you also
have to do the following.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo ufw enable
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You can see the status of the firewall using &lt;code>sudo ufw status&lt;/code>.&lt;/p>
&lt;p>On low-end servers it might be beneficial to disable logging.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo ufw logging off
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>At this point you should have a basic firewall configured and &lt;code>ufw help&lt;/code> or the
references below will assist you.&lt;/p>
&lt;h4 id="references">References&lt;/h4>
&lt;ul>
&lt;li>&lt;a href="https://wiki.archlinux.org/index.php/Uncomplicated_Firewall">https://wiki.archlinux.org/index.php/Uncomplicated_Firewall&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://wiki.ubuntu.com/UncomplicatedFirewall">https://wiki.ubuntu.com/UncomplicatedFirewall&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://launchpad.net/ufw">https://launchpad.net/ufw&lt;/a>&lt;/li>
&lt;/ul></description><summary>Configuring Uncomplicated Firewall (UFW) on Arch Linux.</summary></item><item><title>Installing Nikola on Arch Linux</title><link>https://wimpysworld.com/posts/installing-nikola-on-arch-linux/</link><pubDate>Fri, 08 Mar 2013 17:13:43 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/installing-nikola-on-arch-linux/</guid><description>&lt;p>I&amp;rsquo;ve decided to migrate one of my servers to &lt;a href="https://www.archlinux.org/">Arch Linux&lt;/a>.
I&amp;rsquo;m not sure that a rolling release distro really suits servers but I&amp;rsquo;ve enjoyed
using Arch Linux over the last year on my workstations and the only way to
assess it&amp;rsquo;s suitability on a server is to try it. So, I&amp;rsquo;ve decided to migrate my
blog to an Arch Linux server.&lt;/p>
&lt;p>This blog post describes how to install &lt;a href="http://getnikola.com/">Nikola&lt;/a>
on Arch Linux. Nikola is a static site and blog generator written in
&lt;a href="http://www.python.org">Python&lt;/a> that I&amp;rsquo;ve been using for a few months.&lt;/p>
&lt;p>First you&amp;rsquo;ll need Python and &lt;a href="http://www.doughellmann.com/projects/virtualenvwrapper/">virtualenvwrapper&lt;/a>
so read my &lt;a href="https://wimpysworld.com/posts/python-and-virtualenv-on-arch-linux-and-ubuntu/">Python and virtualenv on Arch Linux and Ubuntu&lt;/a>
blog post and get yourself equipped.&lt;/p>
&lt;p>Install the Nikola dependencies.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo pacman -S --noconfirm --needed freetype2 libxslt libxml2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo packer -S --noconfirm --noedit libjpeg6
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Create a &lt;code>virtualenv&lt;/code> for Nikola.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>mkvirtualenv -p /usr/bin/python2.7 nikola-640
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You will notice your shell prompt has changed to indicate that the &lt;code>nikola-640&lt;/code>
virtualenv is now active. Install Nikola and the optional libraries I use.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>pip install https://github.com/getnikola/nikola/archive/v6.4.0.zip
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If you intend to use the Nikola planetoid (Planet generator) plugin you&amp;rsquo;ll also
need to following.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>pip install peewee feedparser
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Nikola is now installed. &lt;code>nikola help&lt;/code> and the &lt;a href="http://getnikola.com/handbook.html">Nikola Handbook&lt;/a>
will assist you from here on.&lt;/p></description><summary>Install Nikola static site generator in a virtualenv on Arch Linux</summary></item><item><title>Dropbox is my Nikola publish button</title><link>https://wimpysworld.com/posts/dropbox-is-my-nikola-publish-button/</link><pubDate>Wed, 06 Mar 2013 19:01:21 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/dropbox-is-my-nikola-publish-button/</guid><description>&lt;p>When I &lt;a href="https://wimpysworld.com/posts/migrating-wordpress-to-nikola/">migrated my site to Nikola&lt;/a>
I wanted to ensure I could manage my blog from the shell, the web, Android
smartphone or Android tablet. I took some inspiration from &lt;a href="http://joehewitt.com">Joe Hewitt&amp;rsquo;s&lt;/a>
article &lt;a href="http://joehewitt.com/2011/10/03/dropbox-is-my-publish-button">Dropbox is my publish button&lt;/a>
and created a free Dropbox account which links to a shared folder on my Dropbox
Pro account. I created a simple shell script (invoked via &lt;code>cron&lt;/code> every minute)
that looks for a trigger file, if the trigger file exists Nikola publishes and
deploys the site.&lt;/p>
&lt;p>I am able to edit content from anywhere, on any device, and trigger publishing.
Very happy.&lt;/p>
&lt;p>What follows is how I install Dropbox on headless servers running Arch Linux
and Debian/Ubuntu.&lt;/p>
&lt;h2 id="installing-dropbox-daemon---all-distros">Installing Dropbox daemon - all distros&lt;/h2>
&lt;p>Download the latest Dropbox stable release for 32-bit or 64-bit.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>wget -O dropbox.tar.gz &lt;span style="color:#87ceeb">&amp;#34;http://www.dropbox.com/download/?plat=lnx.x86&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>wget -O dropbox.tar.gz &lt;span style="color:#87ceeb">&amp;#34;http://www.dropbox.com/download/?plat=lnx.x86_64&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Extract the archive and install Dropbox in &lt;code>/opt&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>tar -xvzf dropbox.tar.gz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo mv ~/.dropbox-dist /opt/dropbox
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo find /opt/dropbox/ -type f -exec chmod &lt;span style="color:#f60">644&lt;/span> {} &lt;span style="color:#87ceeb">\;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo chmod &lt;span style="color:#f60">755&lt;/span> /opt/dropbox/dropboxd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo chmod &lt;span style="color:#f60">755&lt;/span> /opt/dropbox/dropbox
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo ln -s /opt/dropbox/dropboxd /usr/local/bin/dropboxd
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Run &lt;code>dropboxd&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>/usr/local/bin/dropboxd
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You should see output like this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>This client is not linked to any account... Please visit https://www.dropbox.com/cli_link?host_id=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx to link this machine.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Visit the URL, login with your Dropbox account and link the account. You should see the following.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>Client successfully linked, Welcome Web!
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>dropboxd&lt;/code> will now create a &lt;code>~/Dropbox&lt;/code> folder and start synchronizing. Stop &lt;code>dropboxd&lt;/code> with CTRL+C.&lt;/p>
&lt;h3 id="arch-linux---systemd">Arch Linux - systemd&lt;/h3>
&lt;p>Run Dropbox as daemon with systemd. Create &lt;code>/usr/lib/systemd/system/dropbox@.service&lt;/code>
with the following content.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-systemd" data-lang="systemd">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">[Unit]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Description=&lt;span style="color:#87ceeb">Dropbox&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>After=&lt;span style="color:#87ceeb">local-fs.target network.target&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">[Service]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Type=&lt;span style="color:#87ceeb">simple&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ExecStart=&lt;span style="color:#87ceeb">/usr/local/bin/dropboxd&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ExecReload=&lt;span style="color:#87ceeb">/bin/kill -HUP $MAINPID&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>KillMode=&lt;span style="color:#87ceeb">process&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Restart=&lt;span style="color:#87ceeb">always&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>User=&lt;span style="color:#87ceeb">%I&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">[Install]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>WantedBy=&lt;span style="color:#87ceeb">multi-user.target&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Enable the daemon for your user, run the following replace&lt;code>&amp;lt;user&amp;gt;&lt;/code> with your
username. This will ensure Dropbox is started when the system boots.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo systemctl enable dropbox@&amp;lt;user&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo systemctl start dropbox@&amp;lt;user&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="debianubuntu---initd">Debian/Ubuntu - init.d&lt;/h3>
&lt;p>Run Dropbox as daemon with init.d. Create &lt;code>/etc/init.d/dropbox&lt;/code> with the
following content, replacing &lt;code>&amp;lt;user&amp;gt;&lt;/code> with your username.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e5e5e5">#!/bin/sh
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e5e5e5">&lt;/span>&lt;span style="color:#0f0">### BEGIN INIT INFO&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Provides: dropbox&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Required-Start: $local_fs $remote_fs $network $syslog $named&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Required-Stop: $local_fs $remote_fs $network $syslog $named&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Default-Start: 2 3 4 5&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Default-Stop: 0 1 6&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># X-Interactive: false&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># Short-Description: dropbox service&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0">### END INIT INFO&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">DROPBOX_USERS&lt;/span>=&lt;span style="color:#87ceeb">&amp;#34;&amp;lt;user&amp;gt;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eedd82">DAEMON&lt;/span>=/opt/dropbox/dropbox
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>start() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> echo &lt;span style="color:#87ceeb">&amp;#34;Starting dropbox...&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">for&lt;/span> dbuser in &lt;span style="color:#eedd82">$DROPBOX_USERS&lt;/span>; &lt;span style="color:#f00">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eedd82">HOMEDIR&lt;/span>=&lt;span style="color:#87ceeb">`&lt;/span>getent passwd &lt;span style="color:#eedd82">$dbuser&lt;/span> | cut -d: -f6&lt;span style="color:#87ceeb">`&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">if&lt;/span> [ -x &lt;span style="color:#eedd82">$HOMEDIR&lt;/span>/&lt;span style="color:#eedd82">$DAEMON&lt;/span> ]; &lt;span style="color:#f00">then&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eedd82">HOME&lt;/span>=&lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$HOMEDIR&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span> start-stop-daemon -b -o -c &lt;span style="color:#eedd82">$dbuser&lt;/span> -S -u &lt;span style="color:#eedd82">$dbuser&lt;/span> -x &lt;span style="color:#eedd82">$HOMEDIR&lt;/span>/&lt;span style="color:#eedd82">$DAEMON&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>stop() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> echo &lt;span style="color:#87ceeb">&amp;#34;Stopping dropbox...&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">for&lt;/span> dbuser in &lt;span style="color:#eedd82">$DROPBOX_USERS&lt;/span>; &lt;span style="color:#f00">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eedd82">HOMEDIR&lt;/span>=&lt;span style="color:#87ceeb">`&lt;/span>getent passwd &lt;span style="color:#eedd82">$dbuser&lt;/span> | cut -d: -f6&lt;span style="color:#87ceeb">`&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">if&lt;/span> [ -x &lt;span style="color:#eedd82">$HOMEDIR&lt;/span>/&lt;span style="color:#eedd82">$DAEMON&lt;/span> ]; &lt;span style="color:#f00">then&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> start-stop-daemon -o -c &lt;span style="color:#eedd82">$dbuser&lt;/span> -K -u &lt;span style="color:#eedd82">$dbuser&lt;/span> -x &lt;span style="color:#eedd82">$HOMEDIR&lt;/span>/&lt;span style="color:#eedd82">$DAEMON&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>status() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">for&lt;/span> dbuser in &lt;span style="color:#eedd82">$DROPBOX_USERS&lt;/span>; &lt;span style="color:#f00">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eedd82">dbpid&lt;/span>=&lt;span style="color:#87ceeb">`&lt;/span>pgrep -u &lt;span style="color:#eedd82">$dbuser&lt;/span> dropbox&lt;span style="color:#87ceeb">`&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">if&lt;/span> [ -z &lt;span style="color:#eedd82">$dbpid&lt;/span> ] ; &lt;span style="color:#f00">then&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> echo &lt;span style="color:#87ceeb">&amp;#34;dropboxd for USER &lt;/span>&lt;span style="color:#eedd82">$dbuser&lt;/span>&lt;span style="color:#87ceeb">: not running.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">else&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> echo &lt;span style="color:#87ceeb">&amp;#34;dropboxd for USER &lt;/span>&lt;span style="color:#eedd82">$dbuser&lt;/span>&lt;span style="color:#87ceeb">: running (pid &lt;/span>&lt;span style="color:#eedd82">$dbpid&lt;/span>&lt;span style="color:#87ceeb">)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f00">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">case&lt;/span> &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#eedd82">$1&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span> in
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> start)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> start
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> stop)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> stop
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> restart|reload|force-reload)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> stop
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> start
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> status)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> status
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> *)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> echo &lt;span style="color:#87ceeb">&amp;#34;Usage: /etc/init.d/dropbox {start|stop|reload|force-reload|restart|status}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> exit &lt;span style="color:#f60">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">esac&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>exit &lt;span style="color:#f60">0&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Enable the init.d script.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo chmod +x /etc/init.d/dropbox
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo update-rc.d dropbox defaults
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="install-dropbox-client---all-distros">Install Dropbox client - all distros&lt;/h2>
&lt;p>It is recommended to download the official Dropbox client to configure Dropbox
and get its status.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>wget &lt;span style="color:#87ceeb">&amp;#34;http://www.dropbox.com/download?dl=packages/dropbox.py&amp;#34;&lt;/span> -O dropbox-cli
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>chmod &lt;span style="color:#f60">755&lt;/span> dropbox-cli
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sed -i s&lt;span style="color:#87ceeb">&amp;#39;/#!\/usr\/bin\/python/#!\/usr\/bin\/env python2/&amp;#39;&lt;/span> dropbox-cli
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo mv dropbox-cli /usr/local/bin/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>For usage instructions run &lt;code>dropbox-cli help&lt;/code>.&lt;/p>
&lt;h2 id="disable-lan-sync">Disable LAN Sync&lt;/h2>
&lt;p>Stop Dropbox from sending LAN Sync broadcasts every 30 seconds over port 17500.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>dropbox-cli lansync n
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>I&amp;rsquo;m planning to make more use of Dropbox for content management and content
delivery, blog posts to follow.&lt;/p>
&lt;h4 id="references">References&lt;/h4>
&lt;ul>
&lt;li>&lt;a href="http://www.dropboxwiki.com/Text_Based_Linux_Install">http://www.dropboxwiki.com/Text_Based_Linux_Install&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://aur.archlinux.org/packages/dropbox/">https://aur.archlinux.org/packages/dropbox/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://wiki.archlinux.org/index.php/Dropbox">https://wiki.archlinux.org/index.php/Dropbox&lt;/a>&lt;/li>
&lt;/ul></description><summary>Publishing a Nikola blog via Dropbox on a headless Linux server</summary></item><item><title>Microsoft Office 2010 on Arch Linux and Ubuntu</title><link>https://wimpysworld.com/posts/microsoft-office-2010-on-arch-linux-and-ubuntu/</link><pubDate>Tue, 29 Jan 2013 16:16:47 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/microsoft-office-2010-on-arch-linux-and-ubuntu/</guid><description>&lt;p>We have a mix of Linux and Windows users at work. My department use Linux
and the rest of the business use Windows. We been running a mixture of
&lt;a href="http://www.libreoffice.org/">LibreOffice&lt;/a> and &lt;a href="http://office.microsoft.com/en-GB">Microsoft Office&lt;/a>,
which works pretty well until you start trying to collaborate, then it gets
messy pretty quickly.&lt;/p>
&lt;p>So, it was decided at the end of 2012 to migrate everyone, including the
Linux users, to Microsoft Office 2010.&lt;/p>
&lt;p>What follows is an installation guide for &lt;a href="http://www.winehq.org/">Wine&lt;/a> and
the &lt;a href="http://office.microsoft.com/en-gb/try/">60 day trial version of Office Home and Business 2010&lt;/a>
on Arch Linux and Ubuntu. Most of this information was sourced from the Wine AppDB&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://appdb.winehq.org/objectManager.php?sClass=version&amp;amp;iId=17336">http://appdb.winehq.org/objectManager.php?sClass=version&amp;amp;iId=17336&lt;/a>&lt;/li>
&lt;/ul>
&lt;h1 id="wine-for-ubuntu-1204-lts-or-better">Wine for Ubuntu 12.04 LTS (or better)&lt;/h1>
&lt;p>Install Wine on Ubuntu as follows.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-add-repository ppa:ubuntu-wine/ppa
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get update
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get install ttf-mscorefonts-installer samba wine1.5 wine-gecko1.8 wine-mono
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>For 64-bit also install the following.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get install ia32-libs
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="wine-for-arch-linux">Wine for Arch Linux&lt;/h1>
&lt;div class="alert alert-info">&lt;strong>Update&lt;/strong> I updated this section on August 8th 2013 to reflect recent changes in Arch Linux&lt;/div>
&lt;p>Install Wine on Arch Linux as follows.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo pacman -S --needed icoutils libwbclient libxslt lib32-mpg123 p11-kit lib32-p11-kit samba wine winetricks wine-mono wine_gecko
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo packer -S --noedit --noconfirm ttf-ms-fonts
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>For 64-bit also install the following.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo packer -S --noedit --noconfirm lib32-libwbclient lib32-libxslt
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="installing-office-2010">Installing Office 2010&lt;/h1>
&lt;p>Once Wine is installed, installing Office 2010 is the same for Arch Linux and Ubuntu.&lt;/p>
&lt;p>Create a clean wine prefix.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>export &lt;span style="color:#eedd82">WINEPREFIX&lt;/span>=&lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#87ceeb">${&lt;/span>&lt;span style="color:#eedd82">HOME&lt;/span>&lt;span style="color:#87ceeb">}&lt;/span>&lt;span style="color:#87ceeb">/.msoffice2010&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>export &lt;span style="color:#eedd82">WINEARCH&lt;/span>=&lt;span style="color:#87ceeb">&amp;#34;win32&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>winecfg
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Click the &lt;code>Libraries&lt;/code> tab, select &lt;code>riched20&lt;/code> and click &lt;code>Add&lt;/code>. The default entry
should read &lt;code>riched20 (native, builtin)&lt;/code>. Click &lt;code>Apply&lt;/code>, then click &lt;code>OK&lt;/code>. This will
ensure that PowerPoint starts and selection boxes display correctly.&lt;/p>
&lt;p>Install &lt;code>libxml6&lt;/code> and &lt;code>corefonts&lt;/code> with &lt;code>winetricks&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>winetricks msxml6 corefonts
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Start the Office 2010 setup. In the example below &lt;code>X17-75058.exe&lt;/code> is the name of the
60 day trial version of Office Home and Business 2010 that I downloaded.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>wine X17-75058.exe
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Follow the installation wizard, we are only interested in running the essentials,
Word, Excel and PowerPoint. This is what I selected during the install.&lt;/p>
&lt;ul>
&lt;li>Enter your serial number.&lt;/li>
&lt;li>Leave ticked &lt;code>Attempt to automatically activate my product online.&lt;/code>&lt;/li>
&lt;li>Click &lt;code>Continue&lt;/code>&lt;/li>
&lt;li>Tick &lt;code>I accept the terms of this agreement&lt;/code>&lt;/li>
&lt;li>Click &lt;code>Continue&lt;/code>&lt;/li>
&lt;li>Click &lt;code>Customise&lt;/code>
&lt;ul>
&lt;li>Microsoft Access (Trial) [Not Available]&lt;/li>
&lt;li>Microsoft Excel [Run all from My Computer]&lt;/li>
&lt;li>Microsoft OneNote [Not Available]&lt;/li>
&lt;li>Microsoft Outlook [Not Available]&lt;/li>
&lt;li>Microsoft PowerPoint [Run all from My Computer]&lt;/li>
&lt;li>Microsoft Publisher (Trial) [Not Available]&lt;/li>
&lt;li>Microsoft Visio Viewer [Run from My Computer]&lt;/li>
&lt;li>Microsoft Word [Run all from My Computer]&lt;/li>
&lt;li>Office Shared Features [Defaults]&lt;/li>
&lt;li>Office Tools [Defaults]&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Click &lt;code>Instal Now&lt;/code>.&lt;/li>
&lt;li>Click &lt;code>Close&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>That&amp;rsquo;s it. Office 2010 is installed and should be associated with the appropriate
file types.&lt;/p>
&lt;h2 id="some-issues">Some Issues&lt;/h2>
&lt;p>Here are some of the issues we noticed running Office 2010 under Wine.&lt;/p>
&lt;ul>
&lt;li>Always install Office 2010 into it&amp;rsquo;s own &lt;code>WINEPREFIX&lt;/code>. You are less likely to run into problem that way.&lt;/li>
&lt;li>Online updates do not work. Fortunately, the trial installer has SP1 integrated.&lt;/li>
&lt;li>If you purchase Office 2010 licenses you can still use the trial installer with your purchased license key(s).&lt;/li>
&lt;li>We did test a trial of &lt;a href="http://www.codeweavers.com/">CrossOver&lt;/a>. However, it wouldn&amp;rsquo;t activate Office 2010 on Arch Linux but did activate on Ubuntu.&lt;/li>
&lt;li>Files saved to &lt;code>cifs&lt;/code> mounts are set read-only. This might be a Wine issue or due to the unusual way we have our file server configured, we are still investigating.&lt;/li>
&lt;/ul>
&lt;h2 id="uninstalling-office-2010">Uninstalling Office 2010&lt;/h2>
&lt;p>Should you ever need to, you can uninstall Office 2010 as follows.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>rm -rfv &lt;span style="color:#87ceeb">${&lt;/span>&lt;span style="color:#eedd82">HOME&lt;/span>&lt;span style="color:#87ceeb">}&lt;/span>/.msoffice2010/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rm -rfv ~/.local/share/applications/wine-extension-*
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rm -rfv ~/.local/share/applications/wine/Programs/Microsoft&lt;span style="color:#87ceeb">\ &lt;/span>Office/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description><summary>Install Microsoft Office 2010 on Arch Linux and Ubuntu</summary></item><item><title>The nano text editor</title><link>https://wimpysworld.com/posts/the-nano-text-editor/</link><pubDate>Tue, 22 Jan 2013 15:25:47 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/the-nano-text-editor/</guid><description>&lt;p>I use the &lt;a href="http://www.nano-editor.org/">nano&lt;/a> text editor in preference to
&lt;a href="http://www.vim.org/">vim&lt;/a> and have done for years. This is because we used
&lt;a href="https://en.wikipedia.org/wiki/Pine_(email_client)">Pine&lt;/a> for email at
university and my first job, the Pico text editor was used to compose mail
messages. Due to the binary only distribution of &lt;code>pico&lt;/code>, &lt;code>nano&lt;/code> was created as
an free software alternative. And that is why I use &lt;code>nano&lt;/code>.&lt;/p>
&lt;p>Since I &lt;a href="https://wimpysworld.com/posts/migrating-wordpress-to-nikola/">migrated my blog to Nikola&lt;/a>
I&amp;rsquo;m using &lt;code>nano&lt;/code> more frequently as I typically write my blog posts on a remote
shell, so I thought I&amp;rsquo;d spend some time to tweak &lt;code>nano&lt;/code> a little.&lt;/p>
&lt;h2 id="keybindings">Keybindings&lt;/h2>
&lt;p>I refreshed my memory of some of the keyboard shortcuts available in &lt;code>nano&lt;/code> to
be a little more efficient.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://mintaka.sdsu.edu/reu/nano.html">http://mintaka.sdsu.edu/reu/nano.html&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.tuxradar.com/content/text-editing-nano-made-easy">http://www.tuxradar.com/content/text-editing-nano-made-easy&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.cheatography.com/davechild/content/nano-shortcuts/">http://www.cheatography.com/davechild/content/nano-shortcuts/&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="syntax-highlighting">Syntax Highlighting&lt;/h2>
&lt;p>Syntax Highlighting is the killer feature for &lt;code>nano&lt;/code> that I&amp;rsquo;ve never bothered to
configured in the past. I based my configuration one those provided by
&lt;a href="https://github.com/craigbarnes">Craig Barnes&lt;/a>. He uses mixins to ensure a
consistent colour theme for all the language highlighters. I don&amp;rsquo;t use his
custom key bindings however, it gets confusing when connecting to different
hosts that have a default &lt;code>nano&lt;/code> configuration.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/craigbarnes/nanorc">https://github.com/craigbarnes/nanorc&lt;/a>&lt;/li>
&lt;/ul></description><summary>Some quality of life improvements for nano text editor</summary></item><item><title>Python and virtualenv on Arch Linux and Ubuntu</title><link>https://wimpysworld.com/posts/python-and-virtualenv-on-arch-linux-and-ubuntu/</link><pubDate>Tue, 11 Dec 2012 20:38:50 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/python-and-virtualenv-on-arch-linux-and-ubuntu/</guid><description>&lt;p>We use &lt;a href="http://www.python.org">Python&lt;/a> for pretty much all our software
development at &lt;a href="http://www.flightdataservices.com/">work&lt;/a>. We also use
&lt;a href="http://www.virtualenv.org">virtualenv&lt;/a> and
&lt;a href="http://www.doughellmann.com/projects/virtualenvwrapper/">virtualenvwrapper&lt;/a>
extensively, both for development &lt;em>and&lt;/em> deployment.&lt;/p>
&lt;h2 id="why-is-virtualenv-so-great">Why is virtualenv so great?&lt;/h2>
&lt;p>It just is. Read the &lt;a href="http://www.virtualenv.org/en/latest/">virtualenv documentation&lt;/a>.
If you&amp;rsquo;re a Python developer you need &lt;code>virtualenv&lt;/code> in your life. You also need
&lt;code>virtualenvwrapper&lt;/code> too.&lt;/p>
&lt;blockquote>
&lt;p>virtualenvwrapper is a set of extensions to Ian Bicking’s virtualenv tool
for creating isolated Python development environments.&lt;/p>
&lt;/blockquote>
&lt;h2 id="installing-python-and-virtualenvwrapper">Installing Python and virtualenvwrapper&lt;/h2>
&lt;p>Outlined below is how I install Python and &lt;code>virtualenvwrapper&lt;/code>. We have not
yet made the jump to Python 3 at work, hence the references to Python 2.6 and
2.7. Some of us develop on Arch Linux, but all deployments are on Ubuntu.&lt;/p>
&lt;h3 id="arch-linux">Arch Linux&lt;/h3>
&lt;p>As Arch Linux is a rolling release we can simply install everything via
&lt;code>pacman&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo pacman -Syy
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo pacman -S --needed --noconfirm python-pip python-setuptools python-virtualenv
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo pacman -S --needed --noconfirm python2-pip python2-setuptools python2-virtualenv python-virtualenvwrapper&lt;span style="color:#87ceeb">&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Simple.&lt;/p>
&lt;h3 id="ubuntu">Ubuntu&lt;/h3>
&lt;p>The following was done on Ubuntu Lucid 10.04 LTS.&lt;/p>
&lt;p>Add some essential PPAs.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-add-repository ppa:bzr/ppa
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-add-repository ppa:git-core/ppa
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-add-repository ppa:fkrull/deadsnakes
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Update the system and install Python 2.6 and 2.7.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get update
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get install libpython2.6 python2.6 python2.6-dev python2.6-minimal
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get install libpython2.7 python2.7 python2.7-dev python2.7-minimal
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Remove any &lt;code>apt&lt;/code> installed Python packages that we are about to repalce. The
versions of these packages in the Ubuntu repos and PPAs are too old.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get purge python-setuptools python-virtualenv python-pip python-profiler
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Install &lt;code>distribute&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>curl -O http://python-distribute.org/distribute_setup.py
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo python2.6 distribute_setup.py
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo python2.7 distribute_setup.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Install &lt;code>pip&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>curl -O https://raw.github.com/pypa/pip/master/contrib/get-pip.py
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo python2.6 get-pip.py
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo python2.7 get-pip.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Use &lt;code>pip&lt;/code> to install &lt;code>virtualenv&lt;/code> and &lt;code>virtualenv&lt;/code> wrapper.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo pip-2.6 install virtualenv --upgrade
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo pip-2.7 install virtualenv --upgrade
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo pip install virtualenvwrapper
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Fairly simple.&lt;/p>
&lt;h3 id="the-snakepit">The Snakepit&lt;/h3>
&lt;p>This step is common to Arch Linux and Ubuntu. Create a &lt;em>&amp;ldquo;Snakepit&amp;rdquo;&lt;/em> directory for
storing all the virtualenvs.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>mkdir ~/Snakepit
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Add the following your &lt;code>~/.bashrc&lt;/code> to enable &lt;code>virtualenvwrapper&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>export &lt;span style="color:#eedd82">WORKON_HOME&lt;/span>=&lt;span style="color:#87ceeb">${&lt;/span>&lt;span style="color:#eedd82">HOME&lt;/span>&lt;span style="color:#87ceeb">}&lt;/span>/Snakepit
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">if&lt;/span> [ -f /usr/local/bin/virtualenvwrapper.sh ]; &lt;span style="color:#f00">then&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> source /usr/local/bin/virtualenvwrapper.sh
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">elif&lt;/span> [ -f /usr/bin/virtualenvwrapper.sh ]; &lt;span style="color:#f00">then&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> source /usr/bin/virtualenvwrapper.sh
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">fi&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="creating-a-virtualenv">Creating a virtualenv&lt;/h2>
&lt;p>Open a new shell to ensure that the &lt;code>virtualenvwrapper&lt;/code> configuration is
active.&lt;/p>
&lt;p>The following will create a new virtualenv called &lt;code>Nikola5&lt;/code> based on Python
2.7 and will not give access to the global &lt;code>site-packages&lt;/code> directory.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>mkvirtualenv -p python2.7 --no-site-packages ~/Snakepit/Nikola5
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>mkvirtualenv_help&lt;/code> shows a full list of arguments, the &lt;code>-r&lt;/code> switch can install
all the packages listed in a &lt;code>pip&lt;/code> requirements file into the newly created
virtualenv. Very useful.&lt;/p>
&lt;h2 id="working-on-a-virtualenv">Working on a virtualenv&lt;/h2>
&lt;p>To workon, or activate, an existing virtualenv do the following.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>workon Nikola5
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You can switch to another virtualenv at any time, just use &lt;code>workon envname&lt;/code>.
Your shell prompt will change while a virtualenv is being worked on to indicate
which virtualenv is currently active.&lt;/p>
&lt;p>While working on a virtualenv you can &lt;code>pip&lt;/code> install what you need or manually
install any Python libraries safe in the knowledge you will not adversely
damage any other virtualenvs or the global packages in the process. Very useful
for developing a new branch which may have different library requirements than
the master/head.&lt;/p>
&lt;p>When you are finished working in a virtualenv you can deactivate it by simply
executing:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>deactivate
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>That just about sums up my notes.&lt;/p></description><summary>Installing Python and virtualenv on Arch Linux and Ubuntu</summary></item><item><title>SSH brute force defense</title><link>https://wimpysworld.com/posts/ssh-brute-force-defense/</link><pubDate>Mon, 26 Nov 2012 13:14:09 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/ssh-brute-force-defense/</guid><description>&lt;p>I have several VPS hosts with different providers using different
virtualisation platforms. Naturally I have &lt;a href="http://www.openssh.org/">OpenSSH&lt;/a>
running on these VPS hosts and deploy either &lt;a href="http://denyhosts.sourceforge.net/">DenyHosts&lt;/a>
or &lt;a href="http://www.fail2ban.org/">Fail2Ban&lt;/a> to add an extra security layer to
thwart SSH brute force attacks and other abuse.&lt;/p>
&lt;p>DenyHosts blocks brute force attacks by adding offending IP addresses to
&lt;code>/etc/hosts.deny&lt;/code>. It therefore requires the SSH server is configured with
&lt;code>tcp_wrappers&lt;/code>. Arch Linux &lt;a href="https://www.archlinux.org/news/dropping-tcp_wrappers-support/">dropped support for tcp_wrappers&lt;/a>
so DenyHosts is not suitable for Arch. Fail2Ban supports blocking via &lt;code>iptables&lt;/code> and/or
&lt;code>tcp_wrappers&lt;/code> and can also block offending hosts that are abusing services other than just &lt;code>sshd&lt;/code>.&lt;/p>
&lt;h2 id="denyhosts-on-ubuntu">DenyHosts on Ubuntu&lt;/h2>
&lt;p>Here is a simple example for DenyHosts on Ubuntu Lucid 10.04 LTS Server.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get install denyhosts
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>That&amp;rsquo;s it. The default configuration will provide suitable prevention, but do
take a look at &lt;code>/etc/denyhosts.conf&lt;/code> for a full run down of all available options.
I use the defaults with the following exceptions:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ini" data-lang="ini">&lt;span style="display:flex;">&lt;span>PURGE_DENY = &lt;span style="color:#87ceeb">5d&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>PURGE_THRESHOLD = &lt;span style="color:#87ceeb">2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ADMIN_EMAIL =
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>SYSLOG_REPORT=&lt;span style="color:#87ceeb">NO&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You might want to consider whitelisting some of your own IP address. Create a
file called &lt;code>allowed-hosts&lt;/code> in &lt;code>/var/lib/denyhosts&lt;/code> and list each of your
&amp;ldquo;trusted&amp;rdquo; IP addresses.&lt;/p>
&lt;p>DenyHosts can be restarted by executing:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo /etc/init.d/denyhosts restart
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="fail2ban-on-arch-linux">Fail2Ban on Arch Linux&lt;/h2>
&lt;p>Fail2Ban now supports systemd.&lt;/p>
&lt;p>Configuration files are stored in &lt;code>/etc/fail2ban&lt;/code>. General configuration is
&lt;code>/etc/fail2ban/jail.conf&lt;/code>, but this file might be overwritten in the future. To
preserve customisations, create &lt;code>/etc/fail2ban/jail.local&lt;/code> and add your local
configuration settings to it. In the example below some IP addresses are whitelisted
and the default backend is set to systemd:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ini" data-lang="ini">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">[DEFAULT]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ignoreip = &lt;span style="color:#87ceeb">172.16.0.2/32&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>backend = &lt;span style="color:#87ceeb">systemd&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Next create a custom sshd configuration in &lt;code>/etc/fail2ban/jail.d/sshd.conf&lt;/code>
which will temporarily ban offending IP addresses.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ini" data-lang="ini">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># fail2ban SSH&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0f0"># block ssh after 3 unsuccessful login attempts for 10 minutes&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">[sshd]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>enabled = &lt;span style="color:#87ceeb">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>action = &lt;span style="color:#87ceeb">iptables[chain=INPUT, protocol=tcp, port=22, name=sshd]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>maxRetry = &lt;span style="color:#87ceeb">3&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>findtime = &lt;span style="color:#87ceeb">600&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>bantime = &lt;span style="color:#87ceeb">600&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>port = &lt;span style="color:#87ceeb">22&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &amp;lsquo;action&amp;rsquo; creates DROP rule in iptables after 3 unsuccessful login
attempts, valid for 10 minutes (bantime). Findtime defines time frame in which
fail2ban will count failed login attempts from logs, so if one IP has 3
incorrect login attempts in last 10 minutes, it will be banned.&lt;/p>
&lt;p>Enable and start the Fail2Ban daemon.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo systemctl enable fail2ban
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo systemctl start fail2ban
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Basic commands for fail2ban-client:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>fail2ban-client start sshd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>fail2ban-client stop sshd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>fail2ban-client reload sshd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>fail2ban-client status sshd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>fail2ban-client set sshd unbanip 172.16.0.4
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>See the &lt;a href="https://wiki.archlinux.org/index.php/Fail2ban">Arch Linux Fail2Ban Wiki page&lt;/a>
for more details.&lt;/p>
&lt;p>&lt;strong>References&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://krisko210.blogspot.co.uk/2014/03/setting-up-fail2ban.html">http://krisko210.blogspot.co.uk/2014/03/setting-up-fail2ban.html&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="ssh-best-practice">SSH best practice&lt;/h2>
&lt;p>DenyHosts and Fail2Ban do not provide complete protection against SSH brute
force attacks. I employ other SSH best practice to better secure the SSH
services I expose to the Internet, and so should you. The following is a
good reference.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.ibm.com/developerworks/aix/library/au-sshsecurity/index.html">Getting started with SSH security and configuration&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="other-ssh-brute-force-prevention-tools">Other SSH brute force prevention tools&lt;/h2>
&lt;p>In the interests of fairness, other SSH brute force preventation tools are
available.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.sshguard.net/">Sshgaurd&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://cgi.csc.liv.ac.uk/~greg/sshdfilter/">sshdfilter&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://help.ubuntu.com/community/UFW">Uncomplicated Firewall&lt;/a>
&lt;ul>
&lt;li>&lt;a href="https://wiki.archlinux.org/index.php/Uncomplicated_Firewall#Rate_Limiting_with_ufw">Rate Limiting&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>Do you know any other tools that help prevent SSH brute force attacks?&lt;/p></description><summary>Deploy DenyHosts or Fail2Ban to better prevent SSH brute force attacks.</summary></item><item><title>Netflix for ArchLinux</title><link>https://wimpysworld.com/posts/netflix-for-archlinux/</link><pubDate>Thu, 22 Nov 2012 22:14:47 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/netflix-for-archlinux/</guid><description>&lt;p>Something wonderful has happened! &lt;a href="http://demizerone.com/">Jesus Alvarez&lt;/a> has
created pre-compiled packages for &lt;code>netflix-desktop&lt;/code> for Arch Linux.&lt;/p>
&lt;p>There is no need for me to repeat the installation instructions as they are
clearly documented on the page below.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://demizerone.com/archnetflix/">Arch Netflix - Netflix on the desktop through WINE&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>The source code for both of the packages can be found at &lt;a href="https://github.com/demizer/archnetflix">archnetflix-github&lt;/a>.&lt;/p>
&lt;p>For reporting problems, please see the AUR page at &lt;a href="https://aur.archlinux.org/packages/netflix-desktop">netflix-desktop-aur&lt;/a> or the &lt;a href="https://bbs.archlinux.org/viewtopic.php?pid=1196370">announcement forum posting&lt;/a>.&lt;/p></description><summary>Netflix is available for ArchLinux</summary></item><item><title>Service Monitoring with StatusCake</title><link>https://wimpysworld.com/posts/service-monitoring-with-statuscake/</link><pubDate>Tue, 20 Nov 2012 17:14:47 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/service-monitoring-with-statuscake/</guid><description>&lt;p>We use two server monitoring services at work, one that does external
availability checks of critical services and another agent based monitor that
reports various system metrics. Neither of these monitoring tools offer
sensible free plans.&lt;/p>
&lt;p>I recently setup &lt;a href="http://monitor.us">monitor.us&lt;/a> to do external monitoring of
my VPS hosts. It&amp;rsquo;s very good and offers many tests (internal and external),
smartphone apps and reports. All are available on the free plan. However, the
user interface is cumbersome, the reports are ugly and it feels too formal for
my personal use. Therefore I no longer use it, but it does a job, so give it a
try.&lt;/p>
&lt;p>I don&amp;rsquo;t require agent based systems monitoring. Simple external availability
monitoring is all I need for the few personal websites and services I run.
So I went off to find and alternative and after some &lt;em>google-fu&lt;/em> I found
&lt;a href="https://www.statuscake.com/?aff=1963">StatusCake&lt;/a>.&lt;/p>
&lt;p>&lt;a href="https://www.statuscake.com/?aff=1963">StatusCake&lt;/a> is easy to configure, offers
monitoring of http(s), TCP ports and ICMP Ping. Notifications can be delivered via
Boxcar, Pushover, NotiApp, Skype, Twitter, email and SMS. &lt;a href="https://www.statuscake.com/?aff=1963">StatusCake&lt;/a>
also looks beautiful and their &lt;a href="https://www.statuscake.com/at-statuscake-we-like-real-website-testing/">Real Browser Testing&lt;/a>
feature is very interesting.&lt;/p>
&lt;p>Several plans are available at attractive prices and the free plan supports
unlimited sites. Brilliant! Perfect for personal use. &lt;a href="https://www.statuscake.com/?aff=1963">StatusCake&lt;/a>
has only been around since August 2012 (as far as I can tell) but is already
shaping up to be real contender to &lt;a href="https://www.pingdom.com/">Pingdom&lt;/a>.&lt;/p>
&lt;p>What monitoring services are you using?&lt;/p></description><summary>Service availability monitoring using StatusCake</summary></item><item><title>GitHub Analytics</title><link>https://wimpysworld.com/posts/github-analytics/</link><pubDate>Fri, 26 Oct 2012 16:39:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/github-analytics/</guid><description>&lt;p>As I mentioned in a previous post we are prepairing to &lt;a href="2012-10-migrating-bzr-to-git.html">migrate our Bazaar
repositories to Git&lt;/a>, or more
precisely to &lt;a href="https://github.com">GitHub&lt;/a>. This migration also heralds the
Open Source releases of many of the core technologies we&amp;rsquo;ve been developing at
&lt;a href="http://www.flightdataservices.com">Flight Data Services&lt;/a> for the last few years.&lt;/p>
&lt;p>I want to track visits for our GitHub projects. A bit of Googling turned up
&lt;a href="http://githalytics.com/">githalytics&lt;/a> which enables you to track visits and
page views for your GitHub projects using
[http://www.google.com/analytics/](Google Analytics).&lt;/p>
&lt;p>To use it, create a new Google Analytics property ID for your GitHub project,
head over to &lt;a href="http://githalytics.com/">http://githalytics.com/&lt;/a> and complete the web form. You&amp;rsquo;ll be
provided a &lt;a href="http://daringfireball.net/projects/markdown/">Markdown&lt;/a> snippet to
insert in your projects &lt;code>README.md&lt;/code>. It will look something like this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-markdown" data-lang="markdown">&lt;span style="display:flex;">&lt;span>[![githalytics.com alpha](https://cruel-carlota.pagodabox.com/0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f &amp;#34;githalytics.com&amp;#34;)](http://githalytics.com/YourGitHubName/YourGitHubProject)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Add the snippet to &lt;code>README.md&lt;/code> and push the changes. When someone visits your
GitHub project page, the visit will be tracked. Great!&lt;/p>
&lt;p>However, we write all our documentation using
&lt;a href="http://docutils.sourceforge.net/rst.html">reStructuredText&lt;/a>. But after a
quick Twitter and email exchange with Dimitrios from githalytics and I had
a reStructuredText snippet. It looks something like this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-rest" data-lang="rest">&lt;span style="display:flex;">&lt;span>image:: https://cruel-carlota.pagodabox.com/0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> :alt: githalytics.com
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> :target: http://githalytics.com/YourGitHubName/YourGitHubProject
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Same drill, except add this snippet to &lt;code>README.rst&lt;/code> and push the changes.&lt;/p>
&lt;p>So there you have it, Google Analytics tracking of your GitHub project landing
page. If you have more than one project, create a Google Analytics property ID
and githalytics tracking snippet for each project.&lt;/p>
&lt;h4 id="references">References&lt;/h4>
&lt;ul>
&lt;li>&lt;a href="http://githalytics.com/">http://githalytics.com/&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://githalytics.tumblr.com/">http://githalytics.tumblr.com/&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://coderwall.com/team/githalytics">http://coderwall.com/team/githalytics&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://stackoverflow.com/questions/4376560/add-google-analytics-to-github-wiki-pages">http://stackoverflow.com/questions/4376560/add-google-analytics-to-github-wiki-pages&lt;/a>&lt;/li>
&lt;/ul></description><summary>How to add Google Analytics to GitHub projects.</summary></item><item><title>Migrating Bazaar to Git</title><link>https://wimpysworld.com/posts/migrating-bazaar-to-git/</link><pubDate>Tue, 23 Oct 2012 11:50:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/migrating-bazaar-to-git/</guid><description>&lt;p>We have been using &lt;a href="http://bazaar.canonical.com">Bazaar&lt;/a> for source
control at &lt;a href="http://www.flightdataservices.com">work&lt;/a> for nearly five
years. We are about to &lt;a href="http://opensource.org">Open Source&lt;/a> most of our
core technologies and decided that &lt;a href="https://github.com">GitHub&lt;/a> is the
best way to encourage community participation. We have signed up for a
Silver plan at GitHub and will migrate all our Bazaar repositories to Git.&lt;/p>
&lt;p>I have a few personal projects in Bazaar repositories hosted on
&lt;a href="http://www.launchpad.net">Launchpad&lt;/a>. I decided to migrate my projects
to GitHub in order to learn the migration process. What follows is an
overview of how I did it using a fresh virtual machine running Ubuntu 10.04
LTS Server. I used a little project of mine called &lt;code>nullserv&lt;/code> in the
examples below.&lt;/p>
&lt;p>Add the Bazaar and Git PPAs.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get install python-software-properties
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-add-repository ppa:bzr/ppa
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-add-repository ppa:git-core/ppa
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get update
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Install &lt;code>bzr&lt;/code> (and its requirements), &lt;code>curl&lt;/code> and &lt;code>git&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get install bzr bzr-fastimport curl git python-paramiko
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Add the SSH keys and identify yourself.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>bzr whoami &lt;span style="color:#87ceeb">&amp;#34;Your Name &amp;lt;name@example.org&amp;gt;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git config --global user.name &lt;span style="color:#87ceeb">&amp;#34;Your Name&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git config --global user.email you@example.org
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If your Bazaar repository is hosted on Launchpad assert your
identity.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>bzr launchpad-login flexiondotorg
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Branch the Bazaar repository.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>bzr branch lp:~flexiondotorg/+junk/nullserv
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cd nullserv
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git init
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>bzr fast-export --plain &lt;span style="color:#87ceeb">`&lt;/span>pwd&lt;span style="color:#87ceeb">`&lt;/span> | git fast-import
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>This step is optional. It will delete and commit the deletions to the Bazaar repository.&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f00">for&lt;/span> FILE in *; &lt;span style="color:#f00">do&lt;/span> rm -rfv &lt;span style="color:#87ceeb">&amp;#34;&lt;/span>&lt;span style="color:#87ceeb">${&lt;/span>&lt;span style="color:#eedd82">FILE&lt;/span>&lt;span style="color:#87ceeb">}&lt;/span>&lt;span style="color:#87ceeb">&amp;#34;&lt;/span>; &lt;span style="color:#f00">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>echo &lt;span style="color:#87ceeb">&amp;#34;This repository has been migrated to Git. https://github.com/flexiondotorg/nullserv&amp;#34;&lt;/span> &amp;gt; README
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>bzr add README
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>bzr commit -m &lt;span style="color:#87ceeb">&amp;#34;This repository has been migrated to Git. https://github.com/flexiondotorg/nullserv&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>bzr push :parent
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Remove the Bazaar repository and reset the Git repository.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>rm -rf .bzr README
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git reset HEAD
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Create &lt;code>.gitattributes&lt;/code> to normalise line endings.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cat &amp;gt;.gitattributes&lt;span style="color:#87ceeb">&amp;lt;&amp;lt;ENDGITATTRIBS
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb"># Normalise line endings:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">* text=auto
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb"># Prevent certain files from being exported:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">.gitattributes export-ignore
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">.gitignore export-ignore
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">ENDGITATTRIBS&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git add .gitattributes
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Migrate &lt;code>.bzrignore&lt;/code> to &lt;code>.gitignore&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git mv .bzrignore .gitignore
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>echo &amp;gt;&amp;gt; .gitignore
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>echo &lt;span style="color:#87ceeb">&amp;#34;# Keep empty directories:&amp;#34;&lt;/span> &amp;gt;&amp;gt; .gitignore
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>echo &lt;span style="color:#87ceeb">&amp;#34;!*/.git*&amp;#34;&lt;/span> &amp;gt;&amp;gt; .gitignore
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Ensure empty directories are retained by git.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>find -empty -type d -not -iwholename &lt;span style="color:#87ceeb">&amp;#39;*.git*&amp;#39;&lt;/span> -exec touch &lt;span style="color:#87ceeb">&amp;#39;{}/.gitkeep&amp;#39;&lt;/span> &lt;span style="color:#87ceeb">&amp;#34;;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git add **/.gitkeep
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Commit the migrated repository&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git commit -a -m &lt;span style="color:#87ceeb">&amp;#34;Migrated from Bazaar to Git.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Thanks to Chris for pointing out &lt;code>git filter-branch&lt;/code> in the comments. If you
need to modify the author info in your repository history, you can do so with
this, just replace the names and email addresses accordingly.&lt;/p>
&lt;p>&lt;strong>BEWARE! This should not be performed on a repo that has been shared with others.
Use at your own risk.&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git filter-branch --commit-filter &lt;span style="color:#87ceeb">&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb"> if [ &amp;#34;$GIT_COMMITTER_NAME&amp;#34; = &amp;#34;Fred&amp;#34; ]; then
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb"> GIT_COMMITTER_NAME=&amp;#34;Fred Flintstone&amp;#34;;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb"> GIT_AUTHOR_NAME=&amp;#34;Fred Flintstone&amp;#34;;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb"> GIT_COMMITTER_EMAIL=&amp;#34;fred@example.org&amp;#34;;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb"> GIT_AUTHOR_EMAIL=&amp;#34;fred@example.org&amp;#34;;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb"> git commit-tree &amp;#34;$@&amp;#34;;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb"> elif [ &amp;#34;$GIT_COMMITTER_NAME&amp;#34; = &amp;#34;Barney&amp;#34; ]; then
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb"> GIT_COMMITTER_NAME=&amp;#34;Barney Rubble&amp;#34;;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb"> GIT_AUTHOR_NAME=&amp;#34;Barney Rubble&amp;#34;;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb"> GIT_COMMITTER_EMAIL=&amp;#34;barney@example.org&amp;#34;;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb"> GIT_AUTHOR_EMAIL=&amp;#34;barney@example.org&amp;#34;;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb"> git commit-tree &amp;#34;$@&amp;#34;;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb"> else
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb"> git commit-tree &amp;#34;$@&amp;#34;;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb"> fi&amp;#39;&lt;/span> HEAD
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If you want to delete any files from the commit history, you can optionally do that now.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git filter-branch -f --index-filter &lt;span style="color:#87ceeb">&amp;#34;git rm --cached --ignore-unmatch *.THIS *.THAT&amp;#34;&lt;/span> &lt;span style="color:#87ceeb">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">&lt;/span>--prune-empty --tag-name-filter cat -- --all
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rm -rf .git/refs/original/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git reflog expire --expire=now --all
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git gc --prune=now
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Resume here, regardless of whether you deleted any files from the commit history or not.
Remove everything from the index.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git rm --cached -r .
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Write both the index and working directory from git&amp;rsquo;s database.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git reset --hard
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Prepare to make a commit by staging all the files that will get normalized.
This is your chance to inspect which files were never normalized. You may
get lots of messages like: &lt;code>warning: CRLF will be replaced by LF in file.&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git add .
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git commit -m &lt;span style="color:#87ceeb">&amp;#34;Forced line endings to eol=lf&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Aggressively pack the repository.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git gc --aggressive --prune=now
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>At this point you have a migrated git repository. You can poke about a check that
everything is present and correct.&lt;/p>
&lt;p>Optionally you can create a new GitHub repository using their API. Replace &lt;code>USER&lt;/code>
and &lt;code>PASS&lt;/code> with your GitHub login crednetials.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>curl -u &lt;span style="color:#87ceeb">&amp;#39;USER:PASS&amp;#39;&lt;/span> https://api.github.com/user/repos -d &lt;span style="color:#87ceeb">&amp;#39;{&amp;#34;name&amp;#34;:&amp;#34;nullserv&amp;#34;}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If you want to create repositories for an Organisation the following will
work. Replace &lt;code>YourOrganisation&lt;/code> with the organisation name your are a
member of.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>curl -u &lt;span style="color:#87ceeb">&amp;#39;USER:PASS&amp;#39;&lt;/span> https://api.github.com/orgs/YourOrganisation/repos -d &lt;span style="color:#87ceeb">&amp;#39;{&amp;#34;name&amp;#34;:&amp;#34;nullserv&amp;#34;}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Private repositories can be created, providing you have a paid GitHub account,
by changing the &lt;code>POST&lt;/code> data as follows.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&amp;#39;{&amp;#34;name&amp;#34;:&lt;span style="color:#87ceeb">&amp;#34;nullserv&amp;#34;&lt;/span>,&amp;#34;private&amp;#34;:&lt;span style="color:#87ceeb">&amp;#34;true&amp;#34;&lt;/span>}&amp;#39;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Lastly, push to the newly created GitHub repo.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git remote add origin git@github.com:flexiondotorg/nullserv.git
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git push -u origin master
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>All done, the Bazaar repository has been crippled and the Git repository is
ready for use on GitHub.&lt;/p>
&lt;h4 id="references">References&lt;/h4>
&lt;ul>
&lt;li>&lt;a href="https://gist.github.com/624941">https://gist.github.com/624941&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://stackoverflow.com/questions/2423777/is-it-possible-to-create-a-remote-repo-on-github-from-the-cli-without-ssh">http://stackoverflow.com/questions/2423777/is-it-possible-to-create-a-remote-repo-on-github-from-the-cli-without-ssh&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://stackoverflow.com/questions/750172/how-do-i-change-the-author-of-a-commit-in-git">http://stackoverflow.com/questions/750172/how-do-i-change-the-author-of-a-commit-in-git&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://help.github.com/articles/changing-author-info">https://help.github.com/articles/changing-author-info&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://developer.github.com/v3/repos/">http://developer.github.com/v3/repos/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://help.github.com/articles/dealing-with-line-endings#platform-all">https://help.github.com/articles/dealing-with-line-endings#platform-all&lt;/a>&lt;/li>
&lt;/ul></description><summary>A rough guide to migrating Bazaar repositories to GitHub</summary></item><item><title>Migrating Wordpress to Nikola</title><link>https://wimpysworld.com/posts/migrating-wordpress-to-nikola/</link><pubDate>Mon, 22 Oct 2012 17:13:43 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/migrating-wordpress-to-nikola/</guid><description>&lt;p>I recently migrated three sites from a self hosted &lt;a href="http://www.wordpress.org">Wordpress&lt;/a>
installation to &lt;a href="http://getnikola.com/">Nikola&lt;/a>. Nikola is a static
site and blog generator written in &lt;a href="http://www.python.org">Python&lt;/a>.&lt;/p>
&lt;p>Although I use both &lt;a href="http://docutils.sourceforge.net/rst.html">reStructuredText&lt;/a>
and &lt;a href="http://daringfireball.net/projects/markdown/">Markdown&lt;/a>, I decided
to migrate my Wordpress content to Markdown.&lt;/p>
&lt;p>This is by no means an exhaustive Wordpress to Nikola migration guide but it
should provide enough clues for anyone else wanting to do the same. The
following was done on Ubuntu 10.04 LTS.&lt;/p>
&lt;p>Export the Wordpress content. &lt;code>Tools -&amp;gt; Export -&amp;gt; All Content&lt;/code>&lt;/p>
&lt;p>Use &lt;code>xmllint&lt;/code> to find any errors in the Wordpress XML export and fix them.&lt;/p>
&lt;h2 id="nikola-5">Nikola 5&lt;/h2>
&lt;p>&lt;strong>UPDATE!&lt;/strong> I&amp;rsquo;ve added the instructions for install Nikola 5 since fist
publishing this post.&lt;/p>
&lt;p>Install Nikola 5 in a &lt;code>virtualenv&lt;/code> using
&lt;a href="http://www.doughellmann.com/projects/virtualenvwrapper/">virtualenvwrapper&lt;/a>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cd ~
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get install libxslt1-dev libxml2-dev libjpeg62-dev python2.6-dev
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>wget http://nikola-generator.googlecode.com/files/nikola-5.zip
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>unzip ~/nikola-5.zip
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>mkvirtualenv -i markdown -r ~/nikola-5/requirements.txt --use-distribute nikola-5
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cd ~/nikola-5
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>python setup.py install
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="nikola-4">Nikola 4&lt;/h2>
&lt;p>Install Nikola 4.0.3, in a &lt;code>virtualenv&lt;/code> using
&lt;a href="http://www.doughellmann.com/projects/virtualenvwrapper/">virtualenvwrapper&lt;/a>.
Nikola 4.0.3 spits deprecation warnings with &lt;code>doit&amp;gt;=0.16.1&lt;/code> hence the use of
&lt;code>sed&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cd ~
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get install libxslt1-dev libxml2-dev libjpeg62-dev python2.6-dev
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>wget http://nikola-generator.googlecode.com/files/nikola-4.0.3.zip
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>unzip ~/nikola-4.0.3.zip
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sed -i &lt;span style="color:#87ceeb">&amp;#39;s/&amp;gt;=0\.16/==0\.16/&amp;#39;&lt;/span> ~/nikola-4.0.3/requirements.txt
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>mkvirtualenv -i markdown -r ~/nikola-4.0.3/requirements.txt --use-distribute nikola
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cd nikola-4.0.3
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>python setup.py install
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Import the Wordpress content.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nikola import_wordpress wordpress.linted.xml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Use &lt;a href="https://github.com/aaronsw/html2text">html2text&lt;/a> to convert the HTML
markup in &lt;code>new_site/posts/*.wp&lt;/code> to &lt;em>real&lt;/em> Markdown.&lt;/p>
&lt;p>Use the &lt;a href="http://wordpress.org/extend/plugins/disqus-comment-system/">Disqus Wordpress Plug-in&lt;/a>
to migrate Wordpress comments to &lt;a href="http://www.disqus.com">Disqus&lt;/a>.&lt;/p>
&lt;p>If required, generate a list of the Wordpress URLs for Nikola redirections.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>grep &lt;span style="color:#87ceeb">&amp;#34;&amp;lt;link&amp;gt;&amp;#34;&lt;/span> wordpress.linted.xml | sed -e &lt;span style="color:#87ceeb">&amp;#39;s/&amp;lt;link&amp;gt;//g&amp;#39;&lt;/span> -e &lt;span style="color:#87ceeb">&amp;#39;s/&amp;lt;\/link&amp;gt;//g&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>I migrated from several sub-domains to one top-level and the Wordpress URLs
I was using can&amp;rsquo;t be persevered with Nikola. I use a combination of Nikola
redirects and nginx configuration to handle the re-directions.&lt;/p>
&lt;p>At this point the bulk of the migration is done. I tweaked the Nikola &lt;code>conf.py&lt;/code>
to use &lt;code>.md&lt;/code> files instead of &lt;code>.wp&lt;/code>, added some assets to the Nikola &lt;code>files&lt;/code>
directory, configured deployments and updated the theme. I also decided to axe
some obsolete blog posts.&lt;/p>
&lt;p>Migrating to Disqus has been very frustrating and although my comments have
now been migrated the Migrate Threads has yet reflect the new URLs of my posts.
There is no visibility of what, if anything, is happening when you execute the
Disqus URL Mapper. This is not a Nikola issue.&lt;/p>
&lt;p>I am extremely happy with Nikola itself and it has proved itself flexible and
I can now capture my notes in a familiar format and in a familiar environment,
Python. Next steps are to integrate Nikola with Dropbox so I can publish from
any device with ease and add a search facility.&lt;/p></description><summary>From a dynamic Wordpress site to static Nikola site</summary></item><item><title>draw.io - Draw diagrams online, free</title><link>https://wimpysworld.com/posts/drawio-draw-diagrams-online-free/</link><pubDate>Wed, 17 Oct 2012 13:11:56 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/drawio-draw-diagrams-online-free/</guid><description>&lt;p>Yesterday I needed to create a data flow diagram for one of our
technology partners at work. They are presenting to the &lt;a href="http://www.faa.gov/">FAA&lt;/a>
and need to explain how we (&lt;a href="http://www.flightdataservices.com">Flight Data Services&lt;/a>)
can replay the data from tens of thousands of flights in extremely short order.&lt;/p>
&lt;p>Anyway, I went looking for a good tool to draw the diagram. I&amp;rsquo;ve
tried several in the past and never really been satisfied. I found
&lt;a href="http://www.draw.io/about.html">draw.io&lt;/a> and it is really good.
This is how they describe it.&lt;/p>
&lt;blockquote>
&lt;p>&lt;a href="http://www.draw.io/">draw.io&lt;/a> is an online diagramming application
and github project. It features the full range of visual configuration
you expect, as well as web application features such as a full range of
export options, a large collection of icons, real-time collaboration
and embedded widget sharing.&lt;/p>
&lt;/blockquote>
&lt;p>The shape library is extensive and pretty consistent. I was able
to export the diagram in the formats I wanted. Overall, it&amp;rsquo;s not
half bad and completely free.&lt;/p></description><summary>A web based data flow diagram application</summary></item><item><title>Quality Android tablet on a budget - Ployer Momo8 IPS</title><link>https://wimpysworld.com/posts/quality-android-tablet-on-a-budget-ployer-momo8-ips/</link><pubDate>Thu, 27 Sep 2012 20:14:43 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/quality-android-tablet-on-a-budget-ployer-momo8-ips/</guid><description>&lt;p>I&amp;rsquo;ve recently taken delivery of my first Android tablet, the Ployer Momo8 IPS.&lt;/p>
&lt;p>I purchased mine from &lt;a href="http://www.gtrelectronics.co.uk/">GTR Electronics&lt;/a> as
they have a track record for excellent customer service, provide 12 month warranty
and their devices are free from Chinese apps and bloatware. I wrote up a review on
Amazon.co.uk, see below.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.amazon.co.uk/review/R1SWPZCIRMQ65L/ref=cm_cr_pr_perm?ie=UTF8&amp;amp;ASIN=B0096DKGJW&amp;amp;linkCode=&amp;amp;nodeID=&amp;amp;tag=">A quality Android tablet with a budget price&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>As I mention in the review above, I&amp;rsquo;ve rooted the Momo8 IPS. The following were
useful references for the rooting.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://forum.xda-developers.com/showthread.php?t=1893504">http://forum.xda-developers.com/showthread.php?t=1893504&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://flashmyandroid.com/forum/showthread.php?1183-How-to-root-the-Cube-U30GT&amp;amp;p=11116">http://flashmyandroid.com/forum/showthread.php?1183-How-to-root-the-Cube-U30GT&amp;amp;p=11116&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.pandawillforum.com/showthread.php?13111-How-to-Root-UG802-Rockchip-RK3066-mini-PC">http://www.pandawillforum.com/showthread.php?13111-How-to-Root-UG802-Rockchip-RK3066-mini-PC&lt;/a>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;div class="alert alert-info">
&lt;strong>Update&lt;/strong> Since writing this blog
post I&amp;#8217;ve made a pre-rooted custom firmware for the Ployer Momo 8 IPS.
Installing it may be easier than following the instructions below.&lt;/div>
&lt;ul>
&lt;li>&lt;a href="https://wimpysworld.com/posts/2013-03-ployer-momo8-ips-custom-firmware/">Ployer Momo8 IPS Custom Firmware&lt;/a>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>Here are the basic steps to getting root on the Momo8 IPS.&lt;/p>
&lt;ul>
&lt;li>Enable USB Debugging on the Momo8 IPS - &lt;code>Settings –&amp;gt; Developer Options&lt;/code>&lt;/li>
&lt;li>Find a Windows computer.&lt;/li>
&lt;li>Download and install &lt;a href="http://download.moborobo.com/download/Client/MoboroboSetup_V2.0.2.290(Moborobo_En_official).exe">Momorobo 2.0.2.290&lt;/a>.&lt;/li>
&lt;li>Start Moborobo and connect the Momo8 IPS to the Windows computer.
Wait for Moborobo to establish a connection to the tablet.&lt;/li>
&lt;li>Download and install &lt;a href="http://static.opda.com/zhuodashi/ZhuoDaShi-2.2.9-setup.exe">ZhuoDaShi 2.2.9&lt;/a>.&lt;/li>
&lt;li>Start ZhuoDaShi. It is a Chinese language application only, so this is somewhat tricky.
&lt;ul>
&lt;li>Wait for ZhuoDaShi connect to your Momo8 IPS.&lt;/li>
&lt;li>Click the highlighted text that includes the word ROOT among some Chinese text then click on the big ROOT button.&lt;/li>
&lt;li>After a short while you should see some Chinese text in green. Click the large button.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>You should now have root and the SuperSU app will be listed in your apps.&lt;/li>
&lt;li>Install &lt;a href="https://play.google.com/store/apps/details?id=com.joeykrim.rootcheck">Root Checker&lt;/a>
on the Momo8 IPS to ensure you have root.&lt;/li>
&lt;li>Once satisfied you have root (I ran Titanium Backup to be absolutely sure)
you can uninstall the Momorobo daemon and ZhuoDaShi app the from your Momo8 IPS.&lt;/li>
&lt;li>The version of SuperSU installed by ZhuoDaShi is quite old and can&amp;rsquo;t be
updated via the Google Play Store. To remedy this do the following.
&lt;ul>
&lt;li>Under &lt;code>SuperSU -&amp;gt; Settings&lt;/code> select &lt;code>Switch superuser app&lt;/code>&lt;/li>
&lt;li>Now open Google Play Store and install &lt;a href="https://play.google.com/store/apps/details?id=eu.chainfire.supersu">SuperSU&lt;/a>.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>Hope this is helpful to someone else, but proceed with caution.&lt;/p></description><summary>My experiences with a budget Android tablet</summary></item><item><title>Android Gmail Conversation View</title><link>https://wimpysworld.com/posts/android-gmail-conversation-view/</link><pubDate>Tue, 25 Sep 2012 19:38:34 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/android-gmail-conversation-view/</guid><description>&lt;p>I recently migrated several domains I manage for family and friends
to the &lt;em>&amp;ldquo;free&amp;rdquo;&lt;/em> version of &lt;a href="http://http://www.google.com/enterprise/apps/business/">Google Apps&lt;/a>.&lt;/p>
&lt;p>I setup the Gmail app on their Android phones for them and email
arrives promptly and spam is pretty much eradicated. Happy days.&lt;/p>
&lt;p>However, the Gmail app for Android only supports a conversation view of
emails. My wife and I hate that and have actually missed emails because
new emails get burried in an earlier email conversation way down your
inbox. Frustratingly changing the preferences on the Gmail website to
disable the conversation view does not propagate to the Gmail app.&lt;/p>
&lt;p>The best solution to this that I have found is to to not use the Gmail
app and install &lt;a href="https://play.google.com/store/apps/details?id=com.fsck.k9">K-9 Mail&lt;/a>
instead connected to Google App accounts via IMAP and SMTP. K-9 Mail
(only?) supports a traditional list view of your emails and unlike the
built in Email app for Android K9-Mail supports push notifications so
you get near instantaneous notification of new email.&lt;/p>
&lt;p>If you want to support the K-9 Mail developer then consider purchasing
&lt;a href="https://play.google.com/store/apps/details?id=com.kaitenmail">Kaiten Mail&lt;/a>
which is an enhanced version of K-9 Mail and is particularly good on Android
tablets.&lt;/p></description><summary>List view email clients for Android that support Gmail</summary></item><item><title>MATE Desktop</title><link>https://wimpysworld.com/projects/mate-desktop/</link><pubDate>Fri, 01 Jun 2012 00:00:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/projects/mate-desktop/</guid><description>&lt;p>The &lt;a href="https://mate-desktop.org">MATE Desktop Environment&lt;/a> is the continuation of
&lt;a href="https://en.wikipedia.org/wiki/GNOME_2">GNOME 2&lt;/a>. MATE Desktop provides an
intuitive and attractive desktop environment using traditional metaphors for
Linux and other Unix-like operating systems.&lt;/p>
&lt;ul>
&lt;li>Organisation: &lt;a href="https://mate-desktop.org">MATE Desktop&lt;/a>&lt;/li>
&lt;li>Date: June 2012 - date&lt;/li>
&lt;li>Role: Developer &amp;amp; Community Manager&lt;/li>
&lt;/ul></description><summary>Preserving a traditional desktop metaphor</summary></item><item><title>Arch Linux Angel</title><link>https://wimpysworld.com/posts/arch-linux-angel/</link><pubDate>Tue, 15 May 2012 11:12:13 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/arch-linux-angel/</guid><description>&lt;p>I&amp;rsquo;ve been working a shell script for Arch Linux that automatically configures
my preferred GNOME 3 setup on my netbook, laptops and workstations. The main
features are:&lt;/p>
&lt;ul>
&lt;li>Quickly deploys Arch Linux to my specifications&lt;/li>
&lt;li>Supports i686 and x64_64.&lt;/li>
&lt;li>Detects ATI/AMD, Intel and Nvidia chipsets and configures the Open Source video drivers and enables early KMS.&lt;/li>
&lt;li>Hardware and location aware. Installation and configuration can be different for Home vs Work or Desktop vs Netbook.&lt;/li>
&lt;li>Detects and correctly configures some device specific hardware, such as touch screens and wireless drivers.&lt;/li>
&lt;li>Automatically configures DAEMONS array.&lt;/li>
&lt;li>Includes custom power management hooks for pm-utils.&lt;/li>
&lt;li>Designed to safely run multiple times so that it can be used as a tool for keeping all systems consistent.&lt;/li>
&lt;/ul>
&lt;p>I&amp;rsquo;ve dubbed this script Arch Angel. I&amp;rsquo;m undecided if I&amp;rsquo;ll release it publicly
since it is very much my personal preferences and to some extent my colleagues
at work. I suppose the real reason for this post is that I&amp;rsquo;ve been wanting to
take &lt;a href="http://shelr.tv/">Shelr&lt;/a> for a test drive, so click the Play button
below to see an example run of Arch Angel.&lt;/p>
&lt;!--
&lt;iframe border='0' height='684'
id='shelr_record_4fb2223c96608047be00010e' scrolling='no'
src='http://shelr.tv/records/4fb2223c96608047be00010e/embed' style='border: 0'
width='634' />
--></description><summary>Automated scripted installs of Arch Linux</summary></item><item><title>Take Mark Shuttleworth's advice, try Arch Linux</title><link>https://wimpysworld.com/posts/take-mark-shuttleworths-advice-try-arch-linux/</link><pubDate>Wed, 02 May 2012 19:00:19 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/take-mark-shuttleworths-advice-try-arch-linux/</guid><description>&lt;p>In a recent &lt;a href="http://irclogs.ubuntu.com/2012/05/01/%23ubuntu-classroom.html">Ubuntu community feedback session run on IRC&lt;/a>
Mark Shuttleworth said:&lt;/p>
&lt;blockquote>
&lt;p>if you are a super-technologist then there is value in learning all about
linux from every angle try arch. try gentoo. try fedora. try debian. try suse.
they are all good&lt;/p>
&lt;/blockquote>
&lt;p>So, I did. I tried &lt;a href="http://www.archlinux.org/">Arch Linux&lt;/a> and it is is not
just good, it&amp;rsquo;s truly brilliant! The truth is, I didn&amp;rsquo;t take Mark
Shuttleworth&amp;rsquo;s advice. I took the advice of a quietly spoken work colleague.
Whenever he saw me getting frustrated with Ubuntu he reminded me (quietly)
that he was running Arch Linux and that it was really rather good.
It turns out I should have listened to my colleague years ago, because he
was right all along. He often is.&lt;/p>
&lt;p>I started learning Arch Linux a few weeks ago and as of the time of writing
all our home computers are running Arch Linux and so is my office workstation.
I moved away from Ubuntu (which I&amp;rsquo;ve been using daily since 2004) because:&lt;/p>
&lt;ul>
&lt;li>I often find myself needing/wanting updated packages on my workstations.
Ubuntu + PPAs just wasn&amp;rsquo;t doing it for me anymore. I concluded I needed a rolling
release distribution.&lt;/li>
&lt;li>In my humble opinion, Unity is a software engineering solution developed
(by programmers) not designed using UI-patterns (by user interface designers)
consequently it sucks the big one.&lt;/li>
&lt;li>It was less hassle for me to switch to Arch Linux than bend Ubuntu to my will.&lt;/li>
&lt;/ul>
&lt;p>That said, I do wish Canonical every success with Unity, they&amp;rsquo;ll need it, as
it needs some polish and refinement as it stands today. For anyone interested
in giving Arch Linux a try here are some observations.&lt;/p>
&lt;ul>
&lt;li>Arch Linux does not hold you hand, you should be competent with a Linux
based distribution. I&amp;rsquo;ve been using Linux since 0.99patch2 so I think I qualify.&lt;/li>
&lt;li>Read the &lt;a href="https://wiki.archlinux.org/index.php/Beginners'_Guide">Unofficial Beginners&amp;rsquo; Guide&lt;/a>
and &lt;a href="https://wiki.archlinux.org/index.php/Official_Arch_Linux_Install_Guide">Official Installation Guide&lt;/a>
before you install anything.&lt;/li>
&lt;li>Install Arch Linux in a virtual machine to get acquainted.&lt;/li>
&lt;li>Be prepared to fix &lt;em>your&lt;/em> own problems. Fortunately the
&lt;a href="https://wiki.archlinux.org/">Arch Linux Wiki&lt;/a> and &lt;a href="https://bbs.archlinux.org/">Arch Linux Forums&lt;/a>
are a great source of good information.&lt;/li>
&lt;/ul>
&lt;p>Here is a list of what I most like about Arch Linux:&lt;/p>
&lt;ul>
&lt;li>It&amp;rsquo;s a rolling release. I&amp;rsquo;ve already progressed through several kernels
and been upgraded from GNOME 3.2 to 3.4. No fuss, no mess.&lt;/li>
&lt;li>It keeps out of my way, I get to build the OS they way I want it.
&lt;em>Yes, I&amp;rsquo;m looking at you Unity, Overlay Scrollbars, Unity App Indicators, Ubuntu One and upstart!&lt;/em>&lt;/li>
&lt;li>The &lt;a href="https://aur.archlinux.org/index.php">AUR&lt;/a>. It&amp;rsquo;s like a great big PPA.&lt;/li>
&lt;li>Creating my own packages is super simple.&lt;/li>
&lt;li>Adding my own packages to the AUR is super simple. I&amp;rsquo;ve already contributed 8 packages.&lt;/li>
&lt;li>I&amp;rsquo;m learning more about Linux than I have done in years.&lt;/li>
&lt;/ul>
&lt;p>Here&amp;rsquo;s what I&amp;rsquo;m not so keen about, but can live with.&lt;/p>
&lt;ul>
&lt;li>Some of the comments in the Forums and AUR are from real arse hats with a
superiority complex. New comers may be put off by their tone and look elsewhere.&lt;/li>
&lt;li>The &lt;a href="https://aur.archlinux.org/index.php">AUR&lt;/a>. Package quality in the AUR
is variable, some are pretty poor. So long as the maintainer is not one of the
aforementioned arse hats then contributing fixes and improvements is easy.&lt;/li>
&lt;li>It&amp;rsquo;s a rolling release, so may not be suitable for serious server deployments.
That said, I will migrate my own servers to Arch Linux in due course and see if
I can prove myself wrong.&lt;/li>
&lt;/ul>
&lt;p>So there you have it, I like Arch Linux very much and recommend it to other
technically competent individuals looking to regain control of their computer(s).&lt;/p></description><summary>My experiences switching from Ubuntu to Arch Linux</summary></item><item><title>Install Sun Java 6 JRE and JDK from .deb packages</title><link>https://wimpysworld.com/posts/install-sun-java-6-jre-and-jdk-from-deb-packages/</link><pubDate>Mon, 16 Jan 2012 13:20:05 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/install-sun-java-6-jre-and-jdk-from-deb-packages/</guid><description>&lt;p>&lt;a href="https://canonical.com">Canonical&lt;/a> disabled my Java PPA at the end of last week.
So I&amp;rsquo;ve developed another solution for installing Java on Ubuntu which doesn&amp;rsquo;t
infringe any copyrights, licenses, terms of use or CoC&amp;rsquo;s. However, by running
this script to download Java you acknowledge that you have read and accepted the
terms of the Oracle end user license agreement.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.oracle.com/technetwork/java/javase/terms/license/">http://www.oracle.com/technetwork/java/javase/terms/license/&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>My script is an automated wrapper for &lt;a href="https://github.com/rraptorr/sun-java6">Janusz Dziemidowicz Debian packaging
scripts for Java 6&lt;/a>. My new script
simply downloads the Java binary installers from Oracle, builds the .deb
packages locally on your computer and creates a local &amp;lsquo;apt&amp;rsquo; repository for
them. Once my script has been executed you can then &amp;lsquo;apt-get&amp;rsquo; install/upgrade
Java 6 from your local repository. Packages are compatible with &amp;ldquo;official&amp;rdquo;
Ubuntu ones and pre-existing Java 6 packages will upgrade cleanly. You can
find the script and full usage instructions on github.&lt;/p>
&lt;div class="text-center">
&lt;iframe src="http://ghbtns.com/github-btn.html?user=flexiondotorg&amp;repo=oab-java6&amp;type=watch&amp;count=true&amp;size=large"
allowtransparency="true" frameborder="0" scrolling="0" width="260px" height="30px">&lt;/iframe>
&lt;iframe src="http://ghbtns.com/github-btn.html?user=flexiondotorg&amp;repo=oab-java6&amp;type=fork&amp;count=true&amp;size=large"
allowtransparency="true" frameborder="0" scrolling="0" width="260px" height="30px">&lt;/iframe>
&lt;/div>
&lt;p>Please read the &lt;a href="https://github.com/flexiondotorg/oab-java6/blob/master/README.rst">README&lt;/a>
file for a more detailed explanation of how the script works and how to use it.
If anyone has any problems, then please submit a ticket on my
&lt;a href="https://github.com/flexiondotorg/oab-java6/issues">Issue Tracker&lt;/a>.&lt;/p></description><summary>An alternative approach to install Sun Java 6 on Ubuntu</summary></item><item><title>Sun Java 1.6.0.30 packages for Ubuntu</title><link>https://wimpysworld.com/posts/sun-java-1.6.0.30-packages-for-ubuntu/</link><pubDate>Tue, 10 Jan 2012 10:53:50 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/sun-java-1.6.0.30-packages-for-ubuntu/</guid><description>&lt;h2 id="update-friday-13th-january-2012">Update Friday 13th January 2012&lt;/h2>
&lt;p>&lt;strong>My Java PPA has been disabled by Canonical, possibly because they violate the Ubuntu CoC and PPA terms of use, as Jef Spaleta noted in the comments below, although I&amp;rsquo;ve had no communication from Canonical at this time. I&amp;rsquo;m preparing an alternative solution, for those of you who need Sun Java 6, that doesn&amp;rsquo;t violate and copyrights, CoCs or terms of use. A new blog post will be made when that alternate solution is available.&lt;/strong>&lt;/p>
&lt;h2 id="update-monday-16th-january-2012">Update Monday 16th January 2012&lt;/h2>
&lt;p>&lt;strong>I&amp;rsquo;ve developed another solution for installing Java 6u30 on Ubuntu which
doesn&amp;rsquo;t infringe any copyrights, licenses, terms of use or CoC&amp;rsquo;s.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;a href="2012-01-install-sun-java-6-jre-jdk-from-deb-packages.html">Install Sun Java 6 JRE and JDK from .deb packages&lt;/a>&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>&lt;del>Sun Java 6 packages are being removed from Ubuntu in the near future for the
following reasons:&lt;/del>&lt;/p>
&lt;ul>
&lt;li>&lt;del>As of August 24th 2011, Canonical no longer have permission to redistribute
new Java packages as Oracle has retired the &amp;ldquo;Operating System Distributor
License for Java&amp;rdquo;.&lt;/del>&lt;/li>
&lt;li>&lt;del>Oracle has published an advisory about security issues in the version of
Java currently in the partner archive. Some of these issues are currently
being exploited in the wild.&lt;/del>&lt;/li>
&lt;li>&lt;del>Due to the severity of the security risk, &lt;strong>Canonical released a security
update for the Sun JDK browser plugin which disables the plugin on all machines&lt;/strong>.&lt;/del>&lt;/li>
&lt;li>&lt;del>In the near future, &lt;strong>Canonical will remove all Sun JDK packages from the
Partner archive&lt;/strong>. This will be accomplished by pushing empty packages to
the archive, so that the Sun JDK will be removed from all users machines
when they do a software update. &lt;strong>Users of these packages who have not
migrated to an alternative solution will experience failures after the
package updates have removed Oracle Java from the system&lt;/strong>.&lt;/del>&lt;/li>
&lt;/ul>
&lt;p>&lt;del>See the full Canonical notice below.&lt;/del>&lt;/p>
&lt;ul>
&lt;li>&lt;del>&lt;a href="https://lists.ubuntu.com/archives/ubuntu-security-announce/2011-December/001528.html">https://lists.ubuntu.com/archives/ubuntu-security-announce/2011-December/001528.html&lt;/a>&lt;/del>&lt;/li>
&lt;/ul>
&lt;p>&lt;del>My personal motivations for creating this PPA are as follows:&lt;/del>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;del>I require Sun Java 6 for two enterprise applications we use at work. OpenJDK is not fully compatible.&lt;/del>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;del>I require Sun Java 6 for two desktop applications at home (so does my father-in-law). OpenJDK not compatible in one instance and not fully compatible in the other.&lt;/del>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;del>I require Sun Java 6 browser plugin for a web applications I use at home. OpenJDK is not compatible.&lt;/del>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;del>A friend of mine requires Sun Java 6 for building AOSP from source. OpenJDK is not compatible.&lt;/del>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;del>Some friends of mine play Minecraft, apparently this will help ;-)&lt;/del>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;del>Janusz Dziemidowicz made it easy for me - &lt;a href="https://github.com/rraptorr/sun-java6">https://github.com/rraptorr/sun-java6&lt;/a>&lt;/del>
&lt;del>The PPA currently publishes Sun Java 6 1.6.0.30 for:&lt;/del>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;del>Lucid i386/amd64&lt;/del>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;del>Maverick i386/amd64&lt;/del>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;del>Natty i386/amd64&lt;/del>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;del>Oneiric i386/amd64&lt;/del>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;del>Precise i386. However, amd64 is failing to build on Precise. I will try and fix this in due course.&lt;/del>&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>&lt;del>To Sun Java 6 , previously installed via packages, do the following.&lt;/del>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-add-repository ppa:flexiondotorg/java
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get update
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get dist-upgrade
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;del>To install Sun Java 6 JRE do the following:&lt;/del>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-add-repository ppa:flexiondotorg/java
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get update
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get install sun-java6-jre
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;del>To install Sun Java 6 browser plugin do the following:&lt;/del>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-add-repository ppa:flexiondotorg/java
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get update
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get install sun-java6-plugin
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;del>To install Sun Java 6 JDK do the following:&lt;/del>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-add-repository ppa:flexiondotorg/java
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get update
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get install sun-java6-jdk
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;del>You can take a look a round my PPA from the URL below:&lt;/del>&lt;/p>
&lt;ul>
&lt;li>&lt;del>&lt;a href="https://launchpad.net/~flexiondotorg/+archive/java">https://launchpad.net/~flexiondotorg/+archive/java&lt;/a>&lt;/del>&lt;/li>
&lt;/ul></description><summary>Get Sun Java 1.6.0 packages from a PPA</summary></item><item><title>Installing GNOME 3 on Ubuntu 11.10</title><link>https://wimpysworld.com/posts/installing-gnome-3-on-ubuntu-11.10/</link><pubDate>Fri, 09 Dec 2011 16:21:03 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/installing-gnome-3-on-ubuntu-11.10/</guid><description>&lt;p>I tried &lt;a href="http://unity.ubuntu.com/">Unity&lt;/a> in Ubuntu Natty 11.04 and Ubuntu
Oneiric 11.10. We&amp;rsquo;ve agreed to hate each other. A few weeks ago I started using
&lt;a href="http://www.gnome.org/">GNOME 3&lt;/a> and it only took me a couple of hours to
adapt to it&amp;rsquo;s workflow. GNOME 3 is now my desktop environment at home and and
work. I love it! If you&amp;rsquo;d like to give GNOME 3 a whirl then you could try
installing Jan Hoffman&amp;rsquo;s Ubuntu GNOME Shell Remix from either the 32-bit or
64-bit ISOs he has prepared. This will give a &amp;ldquo;pure&amp;rdquo; GNOME 3 experience.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://ubuntu-gs-remix.sourceforge.net/p/home/">http://ubuntu-gs-remix.sourceforge.net/p/home/&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>If you already have Ubuntu 11.10 installed then you can install GNOME 3 alongside
Unity. Here are the incantations you&amp;rsquo;ll need to utter in a shell.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-add-repository ppa:jan-hoffmann/gnome-shell
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-add-repository ppa:aegirxx-googlemail/gnome-shell-extensions
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-add-repository ppa:gnome3-team/gnome3
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-add-repository ppa:webupd8team/gnome3
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get update
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get install libglib2.0-bin gnome-core gnome-documents gnome-shell gnome-sushi gnome-tweak-tool gnomeshell-default-settings gtk3-engines-unico
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The repositories added above will give you access to Jan&amp;rsquo;s GNOME 3 meta
packages, updated GNOME 3 packages and some extra GNOME 3 extensions. GNOME 3
extensions add all manner of additional tweaks and functionality. Some
extensions can even provide a user experience more akin to that of GNOME 2.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://intgat.tigress.co.uk/rmy/extensions/index.html">http://intgat.tigress.co.uk/rmy/extensions/index.html&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>In order to get acquainted with GNOME 3 I suggest you read the
&lt;a href="http://www.gnome.org/gnome-3/">Discover GNOME 3&lt;/a> (watch the videos too) and
&lt;a href="http://live.gnome.org/GnomeShell/CheatSheet">GNOME 3 Cheat Sheet&lt;/a> pages. Having
read those you&amp;rsquo;ll soon master GNOME 3. After you&amp;rsquo;ve used GNOME 3 for a while you
may conclude it is a more usable desktop environment than Unity, which isn&amp;rsquo;t a
surprising conclusion to arrive at given Unity sucks the big one right now. If
you want a &lt;em>&amp;ldquo;pure&amp;rdquo;&lt;/em> GNOME 3 experience then the following commands will purge
Unity and other bits and bobs that GNOME 3 simply doesn&amp;rsquo;t require.&lt;/p>
&lt;h2 id="remove-unity">Remove Unity&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-purge unity unity-2d unity-2d-launcher unity-asset-pool unity-common &lt;span style="color:#87ceeb">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">&lt;/span>unity-greeter unity-lens-applications unity-lens-music libunity-misc4
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="remove-overlay-scrollbars">Remove Overlay Scrollbars&lt;/h2>
&lt;p>These just don&amp;rsquo;t work on my netbook since they regularly obscure portions of
the window I actually want to click on. The can safely be removed even if you
intend to continue using Unity.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get purge overlay-scrollbar liboverlay-scrollbar-0.2-0 liboverlay-scrollbar3-0.2-0
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="remove-indicators">Remove Indicators&lt;/h2>
&lt;p>If you never going back to Unity, Indicators can be safely removed.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get purge xchat-gnome-indicator indicator-appmenu indicator-power &lt;span style="color:#87ceeb">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">&lt;/span>indicator-session indicator-sound indicator-status-provider-mc5 &lt;span style="color:#87ceeb">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">&lt;/span>libindicator-messages-status-provider1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="remove-global-menu">Remove Global Menu&lt;/h2>
&lt;p>Again, Global Menu is not used by GNOME 3. So if you not going back to Unity
these can be safely removed.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get purge appmenu-gtk3 appmenu-gtk appmenu-qt firefox-globalmenu &lt;span style="color:#87ceeb">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#87ceeb">&lt;/span>thunderbird-globalmenu
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Finally, a word or warning: &lt;strong>Distribution upgrades are not possible!&lt;/strong> You
can&amp;rsquo;t upgrade to a newer version of Ubuntu when using Jan Hoffman&amp;rsquo;s Ubuntu
GNOME Shell Remix or if you modify an existing Ubuntu 11.10 using my method
above. You will have to do a full install once the next Ubuntu release is
available. This can&amp;rsquo;t be fixed as long as Jan&amp;rsquo;s meta packages are unofficial,
because the distribution upgrade process requires having installed one of the
desktop meta packages from the official Ubuntu repositories.&lt;/p></description><summary>Creating a pure GNOME 3 experience on Ubuntu 11.10</summary></item><item><title>Shotwell 0.11 PPA available for Ubuntu Lucid and Maverick</title><link>https://wimpysworld.com/posts/shotwell-0.11-ppa-available-for-ubuntu-lucid-and-maverick/</link><pubDate>Tue, 30 Aug 2011 11:05:50 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/shotwell-0.11-ppa-available-for-ubuntu-lucid-and-maverick/</guid><description>&lt;p>Like many others I wanted &lt;a href="http://yorba.org/shotwell/">Shotwell&lt;/a> 0.11
for Lucid and Maverick so I&amp;rsquo;ve created a PPA for it.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://launchpad.net/~flexiondotorg/+archive/shotwell">https://launchpad.net/~flexiondotorg/+archive/shotwell&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>My PPA contains Shotwell 0.11 built for Ubuntu Lucid 10.04 LTS and Ubuntu
Maverick 10.10. I created this PPA because I run Lucid at home and wanted the
new version of Shotwell. Sadly, Yorba aren&amp;rsquo;t going to provide new Shotwell
packages for Lucid due to the reasons discussed in the following ticket: -&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://trac.yorba.org/ticket/3015">http://trac.yorba.org/ticket/3015&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>As mentioned in the ticket above, there are newer versions of Shotwell available
for Lucid in other PPAs. However, those PPAs contain hundreds of packages. If
you&amp;rsquo;re not that brave, like me, then hopefully my PPA provides what you
need. I have built Shotwell with minimal changes from the original Yorba
source packages and not polluted my PPA with any unnecessary packages. Since
Shotwell 0.11 you &lt;strong>must&lt;/strong> enable the GStreamer PPA, see the ticket
below for the reasons for this requirement:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://redmine.yorba.org/issues/3716">http://redmine.yorba.org/issues/3716&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>To install Shotwell on Lucid and Maverick do the following:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-add-repository ppa:flexiondotorg/shotwell
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-add-repository ppa:gstreamer-developers/ppa
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get update
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get dist-upgrade
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get install shotwell
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Enjoy!&lt;/p></description><summary>Showell 0.11 is available in a PPA for Ubuntu 10.04 &amp;amp; 10.10</summary></item><item><title>Shotwell 0.8.1 PPA available for Ubuntu Lucid</title><link>https://wimpysworld.com/posts/shotwell-0.8.1-ppa-available-for-ubuntu-lucid/</link><pubDate>Thu, 17 Mar 2011 17:04:42 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/shotwell-0.8.1-ppa-available-for-ubuntu-lucid/</guid><description>&lt;p>Like many others I wanted &lt;a href="http://yorba.org/shotwell/">Shotwell&lt;/a> for Lucid
so I&amp;rsquo;ve created a PPA for it.&lt;/p>
&lt;ul>
&lt;li>&amp;lt;https://launchpad.net/~flexiondotorg/+archive/shotwell.&lt;/li>
&lt;/ul>
&lt;p>My PPA contains Shotwell 0.8.1 built for Ubuntu Lucid 10.04 LTS. I created the
PPA because I run Lucid at home and wanted the new version of Shotwell. Sadly,
Yorba aren&amp;rsquo;t going to provide a Lucid build of Shotwell 0.8.1 due to the
reasons discussed in the following ticket:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://trac.yorba.org/ticket/3015">http://trac.yorba.org/ticket/3015&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>As mentioned in the ticket above, there are versions of Shotwell 0.8.1
available for Lucid in other PPAs. However, those PPAs contain hundreds of
packages. If you&amp;rsquo;re not that brave, like me, then hopefully my PPA provides
what you need. I have built Shotwell 0.8.1 with minimal changes from the
original Yorba source packages and not polluted my PPA with any unnecessary
packages &lt;strong>NOTE!&lt;/strong> My PPA has dependencies that are satisfied by the Yorba
PPA, so you must also enable the Yorba PPA too.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://launchpad.net/~yorba/+archive/ppa">https://launchpad.net/~yorba/+archive/ppa&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>To install Shotwell 0.8.1 on Lucid do the following:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-add-repository ppa:yorba/ppa
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-add-repository ppa:flexiondotorg/shotwell
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get update
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get install shotwell
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description><summary>Get the latest Shotwell 0.8.1 via a PP for Ubuntu 10.04</summary></item><item><title>Bash script to retrieve Ubuntu codenames and versions</title><link>https://wimpysworld.com/posts/bash-script-to-retrieve-ubuntu-codenames-and-versions/</link><pubDate>Wed, 16 Mar 2011 13:44:54 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/bash-script-to-retrieve-ubuntu-codenames-and-versions/</guid><description>&lt;p>I&amp;rsquo;m working a script to automatically backport &lt;a href="http://www.debian.org">Debian&lt;/a>
packages to Ubuntu. I needed a way to get a list of currently supported/active
Ubuntu releases by codename or version. Here is how I do it.&lt;/p>
&lt;h2 id="get-a-list-of-ubuntu-codenames">Get a list of Ubuntu codenames&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>wget -q http://cdimage.ubuntu.com/releases/ -O - | sed -e :a -e &lt;span style="color:#87ceeb">&amp;#39;s/&amp;lt;[^&amp;gt;]*&amp;gt;//g;/&amp;lt;/N;//ba&amp;#39;&lt;/span> | grep &lt;span style="color:#87ceeb">&amp;#39;^[[:space:]][a-z]&amp;#39;&lt;/span> | sed &lt;span style="color:#87ceeb">&amp;#39;s/\///g&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="get-a-list-of-ubuntu-versions">Get a list of Ubuntu versions&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>wget -q http://cdimage.ubuntu.com/releases/ -O - | sed -e :a -e &lt;span style="color:#87ceeb">&amp;#39;s/&amp;lt;[^&amp;gt;]*&amp;gt;//g;/&amp;lt;/N;//ba&amp;#39;&lt;/span> | grep &lt;span style="color:#87ceeb">&amp;#39;^[[:space:]][1-9]&amp;#39;&lt;/span> | sed &lt;span style="color:#87ceeb">&amp;#39;s/\///g&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description><summary>Get a list of Ubuntu codename and version with wget</summary></item><item><title>Goodbye F-Spot. Hello Shotwell</title><link>https://wimpysworld.com/posts/goodbye-f-spot-hello-shotwell/</link><pubDate>Sat, 20 Mar 2010 15:39:17 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/goodbye-f-spot-hello-shotwell/</guid><description>&lt;p>I&amp;rsquo;ve finally found a photo organiser for Linux I can live with,
&lt;a href="http://yorba.org/shotwell/">Shotwell&lt;/a>. Shotwell is a photo organiser
for &lt;a href="http://www.gnome.org">GNOME&lt;/a> that I&amp;rsquo;ve been testing for a few
months now but the recent 0.5 release which added tagging and printing,
it means Shotwell is finally ready replace &lt;a href="http://f-spot.org">F-Spot&lt;/a> on
my workstation.&lt;/p>
&lt;p>Shotwell is intuitive, well documented, extremely easy to use and reliable.
It&amp;rsquo;s easy to dismiss Shotwell as an over simplified photo manager. But once
you start using it, you&amp;rsquo;ll quickly appreciate its clean interface and
easy-to-use tools. Don&amp;rsquo;t just take my word for it either, Shotwell is now the
default photo manager in &lt;a href="http://fedoraproject.org">Fedora&lt;/a> 13 alpha. Here is
a quick run down of the features.&lt;/p>
&lt;ul>
&lt;li>Import photos from folders or from any digital camera supported by gPhoto.&lt;/li>
&lt;li>Shotwell automatically groups photos taken at the same time. You can also
use tags to organize your photo collection.&lt;/li>
&lt;li>You can rotate, crop, reduce red-eye, and adjust the exposure, saturation,
tint, and temperature of each photo.&lt;/li>
&lt;li>Publish photos to Facebook, Flickr and Picasa Web Albums.&lt;/li>
&lt;/ul>
&lt;p>Shotwell provides a non-destructive way to tweak your photos. Instead of
modifying the original photos, Shotwell stores all edits in a database and
applies them on-the-fly as necessary. This means that you can easily undo all
edits. Shotwell comes equipped with all the usual photo enhancing tools and
slideshow. You can download a source tarball from the Shotwell home page at
&lt;a href="http://www.yorba.org/shotwell/">http://www.yorba.org/shotwell/&lt;/a> or grab a binary for Ubuntu Karmic or Lucid
via Yorba&amp;rsquo;s Launchpad PPA.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://launchpad.net/~yorba/+archive/ppa">https://launchpad.net/~yorba/+archive/ppa&lt;/a>&lt;/li>
&lt;/ul></description><summary>F-Spot you serve me well, but here comes Shotwell</summary></item><item><title>Give XFS a chance. Don't believe the FUD.</title><link>https://wimpysworld.com/posts/give-xfs-a-chance-dont-believe-the-fud/</link><pubDate>Fri, 12 Feb 2010 13:14:44 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/give-xfs-a-chance-dont-believe-the-fud/</guid><description>&lt;p>After tinkering with Ext4 I did some research and tested other file systems on
my new disk arrays. I&amp;rsquo;ve concluded that &lt;a href="http://oss.sgi.com/projects/xfs/">XFS&lt;/a>,
once tuned, is the best file system for my needs and it could well be the best
file system for your needs too.&lt;/p>
&lt;p>The remainder of this page explains how I arrived at that decision and how I tune
XFS to get optimal, yet safe, performance that can rival Ext4 and JFS.&lt;/p>
&lt;h2 id="benchmarks">Benchmarks&lt;/h2>
&lt;p>Here are some benchmarks.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://izanbardprince.wordpress.com/2009/03/28/comparing-boot-performance-of-ext3-ext4-and-xfs-on-ubuntu-jaunty/">http://izanbardprince.wordpress.com/2009/03/28/comparing-boot-performance-of-ext3-ext4-and-xfs-on-ubuntu-jaunty/&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://linuxgazette.net/122/piszcz.html">http://linuxgazette.net/122/piszcz.html&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.phoronix.com/scan.php?page=article&amp;amp;item=reiser4_linux35&amp;amp;num=1">Reiser4 Benchmarked On Linux 3.5 Against EXT4, Btrfs, XFS, ReiserFS&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="why-i-chose-xfs">Why I chose XFS&lt;/h2>
&lt;p>I have not chosen XFS for performance alone, indeed some benchmarks show that
XFS it outperformed for some file operations.&lt;/p>
&lt;p>My workstation at home has two 6TB disk arrays and a 1TB root file system.
The disk arrays contain photo, music and video libraries which are streamed
via UPnP/DLNA and DAAP. The video files can be 2GB to 30GB in size. I also
do a good deal of HD video encoding, processing and editing. My root partition
contains many virtual machine images of which several are running at any given
time.&lt;/p>
&lt;p>My work laptop has a 250GB root file system and also contains many virtual
machine images of which one is usually running.&lt;/p>
&lt;p>XFS is designed with large file systems and large file handling in mind.
It seems a sensible choice for those reasons alone, but I also liked the
following features:&lt;/p>
&lt;ul>
&lt;li>XFS has on-line defragmentation tools, while (at the original time of writing in early 2010) Ext3/4 and JFS do not.&lt;/li>
&lt;li>XFS dramatically reduces start-up time by avoiding &lt;code>fsck&lt;/code> delay. Ext3/4 can be very slow to &lt;code>fsck&lt;/code> large volumes.&lt;/li>
&lt;li>XFS has very fast (a few seconds or less) file system creation. JFS is faster than XFS but Ext4 takes many, many minutes.&lt;/li>
&lt;li>XFS formatted disk capacity is greater than Ext3/4 even after removing the reserved blocks from the Ext3/4 file system. JFS formatted capacity is similar to XFS.&lt;/li>
&lt;/ul>
&lt;p>On that last point, XFS gains 400GB over Ext4 on a 6TB array but when the
Ext4 reserved blocks are removed XFS gains 100GB over Ext4.&lt;/p>
&lt;h2 id="tuning-xfs">Tuning XFS&lt;/h2>
&lt;p>Most of the performance tuning information I found (at the original time
of writing in early 2010) is out of date and doesn&amp;rsquo;t reflect the XFS
defaults in modern Linux kernels.&lt;/p>
&lt;p>&lt;em>That said, the information on this page is quite old and I no longer
feel the need to tweak XFS like I once did.&lt;/em>&lt;/p>
&lt;h3 id="creating-xfs">Creating XFS&lt;/h3>
&lt;h4 id="xfs-310-and-kernel-2632-or-newer">XFS 3.1.0 and Kernel 2.6.32 or newer&lt;/h4>
&lt;p>Ubuntu Lucid 10.04 comes with XFS 3.1.0. The defaults used when creating a XFS file
system using Ubuntu 10.04 are optimal and do not require any tweaking.&lt;/p>
&lt;h4 id="xfs-302-and-kernel-2631-or-older">XFS 3.0.2 and Kernel 2.6.31 or older&lt;/h4>
&lt;p>Ubuntu Karmic 9.10 comes with XFS 3.0.2. If you are running an earlier Ubuntu
release and want to use a tuned XFS root file system you can&amp;rsquo;t simply use the
graphical partitioning tool from the Ubuntu LiveCD installer. However, it is
very easy manually create the tuned XFS file systems. Simply boot the Ubuntu
Live CD, then start a new shell &lt;code>Application -&amp;gt; Accessories -&amp;gt; Terminal&lt;/code>.&lt;/p>
&lt;p>Now run the following as &lt;code>root&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>mkfs.xfs -l lazy-count=&lt;span style="color:#f60">1&lt;/span> -L VolumeName &amp;lt;dev&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>lasy-count=1&lt;/code> is a default since XFS 3.1.0 but was recommended by the XFS
developers before that. &lt;code>lazy-count&lt;/code> is a &lt;code>mkfs&lt;/code> option because it changes the
on-disk format slightly, and older kernels do not understand this new format.
Hence &lt;code>mkfs&lt;/code> sets a superblock feature bit to prevent the file system from being
mounted on kernels that don&amp;rsquo;t understand the slightly different disk format.
So you must specify &lt;code>lazy-count=0&lt;/code> if you want to disable this feature for older
kernels which don&amp;rsquo;t support it.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://oss.sgi.com/archives/xfs/2007-12/msg00536.html">http://oss.sgi.com/archives/xfs/2007-12/msg00536.html&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="forcing-a-tuned-xfs-creation">Forcing a tuned XFS creation&lt;/h3>
&lt;p>If you are not sure what XFS version you are running, and therefore what the
defaults might be on your system, you can fully tune XFS using the following.&lt;/p>
&lt;h4 id="for--1tb-xfs-file-system">For &amp;lt; 1TB XFS file system&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>mkfs.xfs -l lazy-count=1,version=2,size=128m -i &lt;span style="color:#eedd82">attr&lt;/span>=&lt;span style="color:#f60">2&lt;/span> -d &lt;span style="color:#eedd82">agcount&lt;/span>=&lt;span style="color:#f60">4&lt;/span> -L VolumeName &amp;lt;dev&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="for--1tb-xfs-filesystem">For &amp;gt; 1TB XFS filesystem&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>mkfs.xfs -l lazy-count=1,version=2,size=128m -i &lt;span style="color:#eedd82">attr&lt;/span>=&lt;span style="color:#f60">2&lt;/span> -d &lt;span style="color:#eedd82">agcount&lt;/span>=&lt;span style="color:#f60">16&lt;/span> -L VolumeName &amp;lt;dev&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Once you have created all your tuned XFS file systems start the Ubuntu installer from the
Live CD. When the disk partitioning section comes round choose: &lt;code>Specify Partitions Manually&lt;/code>&lt;/p>
&lt;p>Now &lt;code>Change&lt;/code> each XFS file system telling the partitioner where to mount each XFS file system.
But ensure that you &lt;strong>do not&lt;/strong> tick &lt;code>Format the Partition:&lt;/code>, thereby preserving your tuned XFS
file systems.&lt;/p>
&lt;p>When you see this message, just click Continue.&lt;/p>
&lt;blockquote>
&lt;p>The file system on /dev/sda1 assigned to /boot has not been marked for
formatting. Directories containing system files (/etc, /lib, /usr,
/var, &amp;hellip;) that already exist under any defined mountpoint will be deleted
during the install.&lt;/p>
&lt;p>Please ensure that you have backed up any critical data before installing.&lt;/p>
&lt;/blockquote>
&lt;h3 id="mounting-xfs">Mounting XFS&lt;/h3>
&lt;p>Further performance optimisations can be gained but specifying some additional mount
options for your XFS file systems.&lt;/p>
&lt;p>To manually mount a XFS file system with, optimal mount options, use the following:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>mount -t xfs -o noatime,osyncisosync,logbsize=256k,logbufs=&lt;span style="color:#f60">8&lt;/span> &amp;lt;dev&amp;gt; &amp;lt;mtpt&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>/etc/fstab&lt;/code> entries I use look something like this.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>UUID=xxxxxxxxxxx...x &amp;lt;mtpt&amp;gt; xfs noatime,osyncisosync,logbsize=256k,logbufs=8 0 2
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>logsbsize' and &lt;/code>logbufs&lt;code>options address the often sited limitation of XFS when handling lots of small files and large number of file deletions. The above assumes you don't require&lt;/code>atime&lt;code>. Not using &lt;/code>atime` provides a significant performance benefit.&lt;/p>
&lt;h4 id="atime-relatime-and-noatime">atime, relatime and noatime&lt;/h4>
&lt;p>Every time a file is accessed (read or write) the default for most file systems
is to append the metadata associated with that file with an updated access time.
Thus, even read operations incur an overhead associated with a write to the file
system. This can lead to a significant degradation in performance in some usage
scenarios. Appending &lt;code>noatime&lt;/code> to the fstab line for &lt;em>any&lt;/em> file system stops
this action from happening.&lt;/p>
&lt;p>One may also specify a &lt;code>relatime&lt;/code> option which updates the atime if the previous
atime is older than the mtime or ctime. In terms of performance, this will not be
as fast as the &lt;code>noatime&lt;/code> mount option, but is useful if using applications that
need to know when files were last read (like &lt;code>mutt&lt;/code>).&lt;/p>
&lt;p>As access time is of little importance in most scenarios, this alteration has
been widely touted as a fast and easy way to get a performance boost. Even
Linus Torvalds seems to be a proponent of this optimization&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://kerneltrap.org/node/14148">http://kerneltrap.org/node/14148&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Access time is &lt;em>not&lt;/em> the same as the last-modified time. Disabling access
time will still enable you to see when files were last modified by a write
operation.&lt;/p>
&lt;h4 id="async-and-nobarrier">async and nobarrier&lt;/h4>
&lt;p>If you really want to go for all out performance you can also provide &lt;code>async&lt;/code> and
&lt;code>nobarrier&lt;/code> mount options. But you really need to understand and accept the potential
issues with using these options.&lt;/p>
&lt;p>Read the following to understand what write barriers are and if you are prepared
to disable them to gain performance.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://lwn.net/Articles/283161/">http://lwn.net/Articles/283161/&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="xfs-userspace-tools">XFS userspace tools&lt;/h2>
&lt;p>XFS is available as a kernel module in Ubuntu and also available from the Live
CDs. Once Ubuntu is installed you can install the XFS userspace tools as follows.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get install xfsdump xfsprogs
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="de-fragmenting-xfs">De-fragmenting XFS&lt;/h3>
&lt;p>There are two utilities that XFS has to manage this fragmentation.&lt;/p>
&lt;ul>
&lt;li>&lt;code>xfs_db&lt;/code> XFS Debug Information. Used to examine an XFS file system for problems or gather information about the XFS file system.&lt;/li>
&lt;li>&lt;code>xfs_fsr&lt;/code> File System Organiser. Improves the organisation of mounted file systems. The reorganisation algorithm operates on one file at a time, compacting or otherwise improving the layout of the file extents (contiguous blocks of file data).&lt;/li>
&lt;/ul>
&lt;h4 id="defragment-a-file-system">Defragment a file system&lt;/h4>
&lt;p>To find the health of a XFS file system use the &lt;code>xfs_db&lt;/code> command to
gather some information. In the example below &lt;code>/dev/sda1&lt;/code> is mounted as
&lt;code>/boot&lt;/code> and &lt;code>/dev/sda3&lt;/code> is mounted as &lt;code>/root&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo xfs_db -c frag -r /dev/sda1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>actual 162, ideal 162, fragmentation factor 0.00%
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo xfs_db -c frag -r /dev/sda3
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>actual 2288833, ideal 254504, fragmentation factor 88.88%
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The closer the fragmentation factor is to 0% the better. Unsurprisingly
&lt;code>/boot&lt;/code> is not fragmented. However &lt;code>/root&lt;/code> is very fragmented.&lt;/p>
&lt;p>Defragmenting XFS file systems can be done on a live running system,
but it is a good idea to schedule this for a time where the partition
will be used less.&lt;/p>
&lt;p>The file system reorganizer for XFS is &lt;code>xfs_fsr&lt;/code>. Typically, I instruct
&lt;code>xfs_fsr&lt;/code> to reorganise &lt;code>/dev/sda3&lt;/code> with a timeout (-t) of 6hrs (60 * 60 * 6 = 21600)
which is specified in seconds. But for the purposes of this example I used a timeout of 15 mins.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo xfs_fsr -t &lt;span style="color:#f60">300&lt;/span> /dev/sda3 -v
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The output will look something like this.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>/ start inode=0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ino=145565
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>extents before:2 after:1 DONE ino=145565
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ino=145662
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>extents before:2 after:1 DONE ino=145662
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ino=600148
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>extents before:2 after:1 DONE ino=600148
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ino=1127295
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>extents before:82794 after:1 DONE ino=1127295
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ino=1127243
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>extents before:2 after:1 DONE ino=1127243
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ino=1382852
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>extents before:50869 after:1 DONE ino=1382852
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ino=1422636
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>When the defrag is finished check how well the file system reorganising was.&lt;/p>
&lt;pre tabindex="0">&lt;code>sudo xfs_db -c frag -r /dev/sda3
actual 2155648, ideal 254512, fragmentation factor 88.19%
&lt;/code>&lt;/pre>&lt;p>As you can see defragmenting for 15 mins doesn&amp;rsquo;t improve things greatly, which
is why &lt;code>xfs_fsr&lt;/code> needs to be run for several hours or more.&lt;/p>
&lt;p>Manually defragmenting the file system is simple enough, but a better solution
would be to schedule a cron job to run periodically.&lt;/p>
&lt;h4 id="defragment-a-file">Defragment a file&lt;/h4>
&lt;p>It is also possible to de-fragment a single file. To determine if a file is
in need of defragmenting run the following&amp;hellip;&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>xfs_bmap -v /srv/A320/PGQAR.DAT | wc -l
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This will output a number which showing the number of extents the file is using.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>95280
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This number should be close to 1. So in the example above, I have a very fragmented file.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo xfs_fsr -v /srv/A320/PGQAR.DAT
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This will output something like the following.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>/srv/A320/PGQAR.DAT
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>extents before:95278 after:1 DONE /srv/A320/PGQAR.DAT
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The file is now defragmented. I use the method above to target defragmentation where I
know files reside that are most likely to be fragmented, rather than defragmenting the
whole file system.&lt;/p>
&lt;h2 id="references">References&lt;/h2>
&lt;h3 id="xfs-references">XFS References&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="http://www.xfs.org/index.php/Main_Page">http://www.xfs.org/index.php/Main_Page&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://en.wikipedia.org/wiki/XFS">http://en.wikipedia.org/wiki/XFS&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://oss.sgi.com/projects/xfs/papers/hellwig.pdf">http://oss.sgi.com/projects/xfs/papers/hellwig.pdf&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.ibm.com/developerworks/linux/library/l-fs9.html">http://www.ibm.com/developerworks/linux/library/l-fs9.html&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.ibm.com/developerworks/linux/library/l-fs10.html">http://www.ibm.com/developerworks/linux/library/l-fs10.html&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.mythtv.org/wiki/XFS_Filesystem">http://www.mythtv.org/wiki/XFS_Filesystem&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.thushanfernando.com/index.php/2009/01/25/maintaining-your-xfs-with-xfs-fsr/">http://www.thushanfernando.com/index.php/2009/01/25/maintaining-your-xfs-with-xfs-fsr/&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.linux.com/archive/feature/141404">http://www.linux.com/archive/feature/141404&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="performance-tuning-xfs-references">Performance Tuning XFS References&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="http://everything2.com/index.pl?node_id=1479435">http://everything2.com/index.pl?node_id=1479435&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.opensubscriber.com/message/xfs@oss.sgi.com/8198329.html">http://www.opensubscriber.com/message/xfs@oss.sgi.com/8198329.html&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://ondrejcertik.blogspot.com/2008/02/xfs-is-20x-slower-than-ext3-with.html">http://ondrejcertik.blogspot.com/2008/02/xfs-is-20x-slower-than-ext3-with.html&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://archives.free.net.ph/message/20090825.155236.abd842ef.en.html">http://archives.free.net.ph/message/20090825.155236.abd842ef.en.html&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.mythtv.org/wiki/Optimizing_Performance#XFS-Specific_Tips">http://www.mythtv.org/wiki/Optimizing_Performance#XFS-Specific_Tips&lt;/a>&lt;/li>
&lt;/ul></description><summary>In which I dispel some myths about XFS and fanboi a little</summary></item><item><title>Recovering reserved space from ext4</title><link>https://wimpysworld.com/posts/recovering-reserved-space-from-ext4/</link><pubDate>Thu, 07 Jan 2010 20:42:04 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/recovering-reserved-space-from-ext4/</guid><description>&lt;p>The Ext4 file system, like Ext3, reserves 5% of the blocks on the file system
for the root user. The reserved blocks are there for root&amp;rsquo;s use as a safe
guard if the filesystem gets full, it provides some wiggle room to enable the
really important programs to still function. But in some cases there&amp;rsquo;s not
much point in having space reserved for root. I&amp;rsquo;ve recently upgrade my
workstation with a 6TB internal RAID 0 array for data storage (music, videos,
photos, etc) and an external 6TB RAID 0 array as a backup. My OS boot from a
1TB drive. For my 6TB arrays I want the maximum available storage and was
interested to see what effect removing the reserved space would have. So, this
is what I did. First I made the Ext4 file system, mounted it and queried how
much space was available.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo mkfs.ext4 /dev/sdh1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo mount /dev/sdh1 /mnt
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>df -h
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Looks like I have 5.1TB of available space.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>/dev/sdh1             5.4T  186M  5.1T   1% /mnt
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Then I unmounted the file system, removed the reserved blocks, checked the
consistency of the file system, mounted it and queried how much space was
available.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo umount /mnt
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo tune2fs -m &lt;span style="color:#f60">0&lt;/span> /dev/sdh1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo e2fsck /dev/sdh1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>df -h
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Looks like I have 5.4TB available now, a saving of 300GB.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>/dev/sdh1             5.4T  186M  5.4T   1% /mnt
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Now, I could have simply created the files system without the reserved blocks
in the first place, but I was interested to see the comparison.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo mkfs.ext4 -m &lt;span style="color:#f60">0&lt;/span> /dev/sdh1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Before you start removing the reserved blocks from your ext3/ext4 file systems
do a bit a research first.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://ubuntuforums.org/showthread.php?t=215177">Disk capacity, free space, and Ext3 reserved blocks&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://wiki.archlinux.org/index.php/Ext3_Filesystem_Tips">Ext3 Filesystem Tips&lt;/a>&lt;/li>
&lt;/ul></description><summary>Reclaim the 5% of disk space Ext4 reserves by default</summary></item><item><title>StarTech S354UER Review</title><link>https://wimpysworld.com/posts/startech-s354uer-review/</link><pubDate>Sat, 02 Jan 2010 16:00:25 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/startech-s354uer-review/</guid><description>&lt;p>*** UPDATE: The StarTech S354UER completely died after less than one year. Not recommended! ***&lt;/p>
&lt;p>I&amp;rsquo;ve ripped my entire CD collection to MP3 and I&amp;rsquo;m in the process of ripping
my entire DVD, Blu-Ray and HD-DVD collection to MPEG-2 TS files so that I can
stream everything to my PS3 using &lt;a href="http://sourceforge.net/projects/minidlna/">MiniDLNA&lt;/a>.
I currently have this data stored on an internal 2TB volume and backed up to
an external 2TB volume. I currently have just 360GB remaining capacity and
I&amp;rsquo;ve only imported half my DVD collection and one Blu-Ray. I need more storage.&lt;/p>
&lt;p>I wanted to keep the same backup method, large internal volume backed up to a
large external volume of the same size. I opted for Samsung Spinpoint F2
EcoGreen (HD154UI) drives because they are relatively inexpensive, low power
(therefore lower heat) and quiet.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.samsung.com/global/business/hdd/productmodel.do?type=61&amp;amp;subtype=78&amp;amp;model_cd=441">Samsung Spinpoint F2 EcoGreen (HD154UI)&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.tomshardware.com/reviews/1.5tb-hdd-caviar,2331-3.html">Samsung Spinpoint F2 EcoGreen (HD154UI) Review&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>I decided to get 4x 1.5TB drives for the internal volume and stripe them to
give 6TB of storage and I went looking for an external box in which I could
install 4x 1.5TB drives and also stripe or span them. That meant a multi
disk external enclosure, with some kind of RAID, supported by Linux and that
isn&amp;rsquo;t too expensive. A tall order as it turns out.&lt;/p>
&lt;p>After lots of research I finally found the
&lt;a href="http://www.startech.com/item/S354UFER-35in-4-Drive-eSATA-USB-FireWire-External-SATA-RAID-Enclosure.aspx">StarTech S354UER&lt;/a>
which on paper appears to do what I required and a good deal more.&lt;/p>
&lt;ul>
&lt;li>Compatible with Windows, Mac, and Linux operating systems&lt;/li>
&lt;li>Fan control button to enable manual control of the fan and
switch between the three fan speeds&lt;/li>
&lt;li>Internal three speed 80mm fan with automatic or manual controls&lt;/li>
&lt;li>Multiple LED indicators to provide RAID information, hard drive
activity, HDD Status, RAID rebuild status, fan settings, and interface
in use&lt;/li>
&lt;li>No software required&lt;/li>
&lt;li>Package includes 1x USB, 1x eSATA, 1x FireWire 400, 1x FireWrie 800 cable,
Power adapter and cord, and the manual&lt;/li>
&lt;li>Plug-and-Play and Hot swap supported with USB 2.0, eSATA, and FireWire&lt;/li>
&lt;li>Push button raid configuration eliminated the need to disassemble the
enclosure to upgrade your raid configurations&lt;/li>
&lt;li>Removable front cover for easy access to hard drive&lt;/li>
&lt;li>Rugged aluminum chassis&lt;/li>
&lt;li>Supported File Systems:NTFS, FAT, FAT32, and ext3&lt;/li>
&lt;li>Supports four 3.5in hard drives up-to 2.0 TB each in size&lt;/li>
&lt;li>Supports RAID 0, RAID 1, RAID 3, RAID 5, RAID 10 (RAID 1+0), and
Spanning&lt;/li>
&lt;/ul>
&lt;p>Normally, I will read reviews of different products and select something with
a proven track record particularly when Linux support is required. I couldn&amp;rsquo;t
find much in the way of reviews for the StarTech S354UER so I took a gamble
and decided to buy one. Eeek!&lt;/p>
&lt;p>In short it works and it is quiet. It is currently sitting no more than 50cm
from me initialising a stripped array of 4x1.5Tb disks as Ext4. I can&amp;rsquo;t hear
it but I have manually set the fan speed to low using the fan control buttons
on the front on the chassis.&lt;/p>
&lt;p>The build quality is not great, but not awful either, but once the drives are
installed and clamped in place they are very secure. It is impossible to tell
if you&amp;rsquo;ve pushed the power button you have to wait and see if the device powers
up/down to be sure. The fan speed controls work, but are inverted from what is
documented in manual. Fan1 is documented as LOW in the manual but is actually HIGH.&lt;/p>
&lt;p>Setting up the device was not quiet plug and play either but the issues
I ran into may not be entirely the fault of the StarTech S354UER. My plan was
to connect the enclosure via Firewire and as yet I&amp;rsquo;ve not been able to get the
enclosure to be recognised via Firewire using Ubuntu Jaunty 9.04. However, I
am a Firewire newbie so maybe more research required. I don&amp;rsquo;t have eSATA (yet)
so I have the device connected via USB 2.0. Which does work.&lt;/p>
&lt;p>One of my new hard disks turned out to be DOA. It took me a while to figure out
what was wrong here. The StarTech drive failure light on the front of the chassis
was illuminated, but I didn&amp;rsquo;t know how to tell which drive had actually failed.
After some trial and error I found that there are four internal LEDs, one for
each disk. Starting the StarTech with the chassis door open you can see the
internal LEDs blinking as each disk is spun up and tested. If the drive
failure LED on the front of chassis is illuminated look at the internal LEDs,
the drive LED which is off denotes the failed drive. This information is not
in the user manual!&lt;/p>
&lt;p>I replaced the drive and was able to select my RAID level. Selecting the RAID
level is done though a combination of DIP switches under a panel at the back
of the unit and buttons on the front. It is a slightly fiddly process, but it
does have the advantage that you can&amp;rsquo;t accidentally change your RAID levels and
re-initialise the array.&lt;/p>
&lt;p>In order to create a partition greater than 2TB you have to use GPT. I&amp;rsquo;d not
encountered GPT before, but I found everything I needed to know on the page
below.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.ibm.com/developerworks/linux/library/l-gpt/">Make the most of large drives with GPT and Linux&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>I used &lt;code>gparted&lt;/code> to create my partition and format with Ext4 with the
enclosure connected via USB 2.0. The whole process took ~1 hour. As you will
see from the link the quoted price makes this enclosure pretty expensive.
Search around though, because I got mine of 50% less than the price quoted on
the StarTech.com website. You do get a healthy selection of RAID levels, all
the cables, screws, screwdriver and drive handles you require.&lt;/p>
&lt;p>Would I recommend the StarTech S354UER? Time will tell, but it does work with
Linux via USB 2.0 and I will continue investigate FireWire and I may add eSATA
in the future to see what the performance benefits are. But for what I bought
it for, secondary storage for backups, it is a pretty cheap way to add a multi
terrabyte array to your system.&lt;/p></description><summary>Creating a 4x 1.5TB storage array with the StarTech S354UER</summary></item><item><title>Mediatomb vs. MiniDLNA</title><link>https://wimpysworld.com/posts/mediatomb-vs-minidlna/</link><pubDate>Fri, 18 Dec 2009 15:34:12 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/mediatomb-vs-minidlna/</guid><description>&lt;p>I&amp;rsquo;ve been using &lt;a href="http://mediatomb.cc/">Mediatomb&lt;/a> for nearly two years now but
decided to give &lt;a href="http://sourceforge.net/projects/minidlna/">MiniDLNA&lt;/a> a whirl
since it is a fully fledged DLNA server whereas Mediatomb is UPnP only. I&amp;rsquo;m
currently running both Mediatomb SVN and MiniDLNA CVS. So, how does MiniDLNA
compare to Mediatomb?&lt;/p>
&lt;ul>
&lt;li>MiniDLNA is easier to compile, configure, uses less RAM and has less software
dependencies than Mediatomb.&lt;/li>
&lt;li>MiniDLNA doesn&amp;rsquo;t currently support music play lists or Last.fm scrobbling.
Mediatomb supports &lt;code>.m3u&lt;/code> and &lt;code>.pls&lt;/code> playlists but requires a 3rd party patch
to add Last.fm scrobbling.&lt;/li>
&lt;li>MiniDLNA doesn&amp;rsquo;t support dynamic video thumbnail creation, which would be
nice to have but is not essential, cover images are supported. Mediatomb
supports video thumbnails via &lt;code>ffmpegthumbnailer&lt;/code>.&lt;/li>
&lt;li>MiniDLNA doesn&amp;rsquo;t currently have any transcoding support. This is of little
consequence for me since I import video content into my library in a format
natively supported by the PS3, either MP3, MPEG-2 TS or MPEG-4. Mediatomb
does support transcoding but it is somewhat fiddly to setup and you can&amp;rsquo;t
pause transcoded content.&lt;/li>
&lt;li>MiniDLNA works &lt;em>&amp;ldquo;out of the box&amp;rdquo;&lt;/em> with the PS3 (and other DLNA clients)
while Mediatomb requires some tweaking.&lt;/li>
&lt;li>Mediatomb&amp;rsquo;s default video import script doesn&amp;rsquo;t suit how I organise my
video library, but MiniDLNA suits my video library perfectly.&lt;/li>
&lt;/ul>
&lt;p>So, as of today I am running both Mediatomb and MiniDLNA. Mediatomb is
exclusively handling audio since playlist and Last.fm support are essential
for me. MiniDLNA is now handling video exclusively. I&amp;rsquo;m very happy with the
results but should MiniDLNA add .m3u/.pls play lists and Last.fm support I
will switch everything to MiniDLNA.&lt;/p>
&lt;h2 id="2-years-later">2 years later&amp;hellip;&lt;/h2>
&lt;p>Since writing this post MiniDLNA added support for playlists. It still doesn&amp;rsquo;t
support Last.fm scrobbling though. Despite that I switched to MiniDLNA and it
has been streaming audio and video around the house for that last couple of
years.&lt;/p></description><summary>Comparing Mediatomb and MiniDLNA streaming servers</summary></item><item><title>Amazon Loves Linux Music Lovers</title><link>https://wimpysworld.com/posts/amazon-loves-linux-music-lovers/</link><pubDate>Wed, 16 Dec 2009 22:30:48 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/amazon-loves-linux-music-lovers/</guid><description>&lt;p>I&amp;rsquo;ve no idea when Amazon.co.uk launched their MP3 store and I&amp;rsquo;ve no idea when
they released their Linux client for downloading the MP3s you purchased. I
don&amp;rsquo;t care, I just want to say I&amp;rsquo;m really impressed Amazon have considered us
Linux users. Well done Amazon!&lt;/p>
&lt;p>Not only that but the MP3s are DRM free, encoded using variable bit rates aiming
at an average of 256 kilobits per second (kbps), album cover art is included with
each song and the tracks are typically cheaper than iTunes. Well done again.&lt;/p>
&lt;p>Doubtless some would want an Open Source client and unencumbered formats such as
Ogg and FLAC, but I&amp;rsquo;m pretty happy with what Amazon have on offer so long as it
works. Which it does.&lt;/p>
&lt;p>However, the Linux MP3 downloader client is 32-bit only. Not so good, but
it can be successfully installed in 64-bit Ubuntu. Here&amp;rsquo;s how I did in on
Ubuntu Jaunty 9.04 64-bit.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>wget -c http://frozenfox.freehostia.com/cappy/getlibs-all.deb
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>dpkg -i getlibs-all.deb    
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>wget &lt;span style="color:#87ceeb">&amp;#34;http://www.amazon.co.uk/gp/dmusic/help/amd-installer-redirect.html/ref=dm_amd_linux_ubuntu?ie=UTF8&amp;amp;forceos=LINUX&amp;amp;callingPage=%2Fgp%2Fdmusic%2Fhelp%2Famd.html&amp;amp;linux_Ubuntu.x=1&amp;#34;&lt;/span> -O amazonmp3.deb
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>dpkg -i --force-architecture amazonmp3.deb
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>getlibs /usr/bin/amazonmp3
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description><summary>Amazon treats Linux users like 1st class citizens</summary></item><item><title>DVD to MPEG2-TS Ripper for Linux</title><link>https://wimpysworld.com/posts/dvd-to-mpeg2-ts-ripper-for-linux/</link><pubDate>Fri, 04 Dec 2009 07:53:58 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/dvd-to-mpeg2-ts-ripper-for-linux/</guid><description>&lt;p>A while back I released a script that rips a DVD to MPEG-2 PS allowing the
user to select one audio stream and one subtitle stream. Optionally the video
can be requantised, using M2VRequantiser and an ISO image created. If creating
an ISO image the chapters are also preserved from the original DVD. You can
see the original post below.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="2009-04-dvd-mpeg2ps-ripper-linux.html">DVD to MPEG-2 PS Ripper for Linux&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>I&amp;rsquo;ve just released an update to that original script which fixes subtitles in
the original MPEG-2 PS mode but now adds the capability to rip MPEG-2 TS. The
video stream can still be shrunk and in MPEG-2 PS mode the video is still
requantised but in MPEG-2 TS mode the video is re-encoded as H.264.&lt;/p>
&lt;p>Requantising is faster but can introduce artifacting. H.264 encoding is
slower, but produces very good quality. I am currently re-importing my entire
DVD collection, using this script, to my DLNA server using MPEG-2 TS and
re-encoding the video to H.264. This gives me high quality rips at relatively
small size (~3Gb) whilst preserving Dolby Digital 5.1 audio. Perfect for
playback via DLNA on the PS3. Some things to be aware of:&lt;/p>
&lt;ul>
&lt;li>Subtitles are only supported in MPEG-2 PS mode.&lt;/li>
&lt;li>MPEG-2 PS files created by this script are DVD compliant.&lt;/li>
&lt;li>ISO files created by this script will preserve the chapters from the original DVD.&lt;/li>
&lt;li>The PS3 can only play DTS audio in MPEG-2 PS streams when they have been authored to DVD.&lt;/li>
&lt;li>The PS3 can only play subtitles in MPEG-2 PS streams when they have been authored to DVD.&lt;/li>
&lt;li>The PS3 can&amp;rsquo;t play DTS audio in MPEG-2 TS streams therefore this script will transcode DTS to AC3 when in MPEG-2 TS mode.&lt;/li>
&lt;/ul>
&lt;p>To download the script and find out how to make full use of it visit the
release page below.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/flexiondotorg/DVD-to-MPG">DVD-to-MPG&lt;/a>&lt;/li>
&lt;/ul></description><summary>Ripping DVDs to MPEG-2 Transport Streams for DLNA streaming</summary></item><item><title>Linux Hex Editors</title><link>https://wimpysworld.com/posts/linux-hex-editors/</link><pubDate>Thu, 03 Dec 2009 11:59:30 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/linux-hex-editors/</guid><description>&lt;p>We use hex editors daily at work, we are regularly cutting up data from flight
data recorders for analysis or recovery. So when I find a new hex editor for
Linux I usually give it a try. I happened across a blog listing five GUI hex
editors for Ubuntu today. Find out more below.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://unixlab.blogspot.com/2009/08/five-gui-hex-editors-for-ubuntu.html">Five gui hex editors for ubuntu&lt;/a>&lt;/li>
&lt;/ul></description><summary>Five GUI hex editors for Linux to take a look at</summary></item><item><title>Creating a JetDirect Server with Linux</title><link>https://wimpysworld.com/posts/creating-a-jetdirect-server-with-linux/</link><pubDate>Sat, 17 Oct 2009 11:41:21 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/creating-a-jetdirect-server-with-linux/</guid><description>&lt;p>I created JetDirect compatible server on my NSLU2 running Ubuntu Jaunty 9.04
using &lt;a href="http://p910nd.sourceforge.net/">p910nd&lt;/a>, which is a small printer daemon
that does not spool to disk but passes the job directly to the printer. It is
particularly useful for disk less Linux workstations and embedded devices that
have a printer hanging off them.&lt;/p></description><summary>Using the NSLU2 as a JetDirect print server</summary></item><item><title>PS3, Mediatomb, Multi Zone Music streaming</title><link>https://wimpysworld.com/posts/ps3-mediatomb-multi-zone-music-streaming/</link><pubDate>Sat, 26 Sep 2009 11:02:52 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/ps3-mediatomb-multi-zone-music-streaming/</guid><description>&lt;p>PlayStation 3 firmware 3.00 added a new feature I was very excited about,
multi-av output. Today I finally got round to re-wiring the home cinema system
to make use of this new feature. I now have the PS3 streaming music from
&lt;a href="http://mediatomb.cc/">MediaTomb&lt;/a> with my A/V receiver sending audio to Zone
1 via digital inter connects and also sending audio to Zone 2 via analog stereo
interconnects.&lt;/p>
&lt;p>Zone 1 is a 5.1 speaker setup and Zone 2 is a 2.0 all weather wireless speaker
system which are often in the kitchen but also moved outside for parties. If
Sony could just add Skype to the PS3 and allow the PSP Remote Play to output
audio to both the PS3 and PSP (rather than just one of them) I would be very
happy indeed.&lt;/p></description><summary>Multi Zone music streaming with the PlayStation 3</summary></item><item><title>IMDB Film Summary as a MPEG-2 video, Part 2</title><link>https://wimpysworld.com/posts/imdb-film-summary-as-a-mpeg-2-video-part-2/</link><pubDate>Sun, 20 Sep 2009 08:48:36 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/imdb-film-summary-as-a-mpeg-2-video-part-2/</guid><description>&lt;p>&lt;strong>UPDATE! I no longer use or maintain the script below. I suggest the vastly
superior &lt;a href="http://www.bunyipawonga.org/sheetmaker/index.php">Sheet Maker for Linux&lt;/a>&lt;/strong>.&lt;/p>
&lt;p>Back in April I released a script to create a MPEG video summarising a movie
using data from IMDB, you can find the original post in the URL below to learn
why I created such a script in the first place.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="2009-04-imdb-film-summary-mpeg2-video.html">IMDB Film Summary as a MPEG-2 video&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Today I&amp;rsquo;ve released v2.0 of that script, which is almost a complete re-write
mostly thanks to Eric at &lt;a href="http://yPass.net/">yPass.net&lt;/a> who contributed
significantly. Thanks to Eric the script is much improved since version 1.0,
here is a run down of what&amp;rsquo;s new.&lt;/p>
&lt;h2 id="v20-2009-19th-september">v2.0 2009, 19th September.&lt;/h2>
&lt;ul>
&lt;li>Merged yet more contributions from Eric, &lt;a href="http://www.ypass.net">http://www.ypass.net&lt;/a>. Thanks Eric!&lt;/li>
&lt;li>Added usage instructions.&lt;/li>
&lt;li>Added categorisation by Certificate.&lt;/li>
&lt;li>Added dynamic computation of video bitrate.&lt;/li>
&lt;li>Added silent audio generation.&lt;/li>
&lt;li>Added a shell script to reprocess an entire film store.&lt;/li>
&lt;li>Re-added MPEG-2 video encoding.&lt;/li>
&lt;li>Improved video encoding speed by removing pre-processing with &lt;code>jpeg2yuv&lt;/code>.&lt;/li>
&lt;li>Fixed spiffy animations when cover art is not available.&lt;/li>
&lt;li>Fixed spiffy animations on platforms that may have incomplete GD.&lt;/li>
&lt;li>Modified filename input so that an input filename is optional rather than mandatory.&lt;/li>
&lt;/ul>
&lt;h2 id="v12-2009-17th-july">v1.2 2009, 17th July.&lt;/h2>
&lt;ul>
&lt;li>Merged extensive contributions from Eric, &lt;a href="http://www.ypass.net">http://www.ypass.net&lt;/a>. Thanks Eric!&lt;/li>
&lt;li>Updated the README to reflect Eric&amp;rsquo;s changes.&lt;/li>
&lt;li>MPEG-4 video encoding replaced MPEG-2 video encoding.&lt;/li>
&lt;li>Never released to the public.&lt;/li>
&lt;/ul>
&lt;p>To download the script and find out how to make full use of it visit the
release page below.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/flexiondotorg/IMDB-to-MPEG">IMDB-to-MPEG&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>As it stands the IMDB-to-MPEG script does what I require, so I will maintain it
in it&amp;rsquo;s current form. However, Eric has been working on a new direction by
adding support for NetFlix, creating a GUI with php-gtk and some other cool
stuff. While Eric has shared the details with me, I simply don&amp;rsquo;t have the time
to add all that good stuff to IMDB-to-MPEG, so if you like the sound of what
Eric has been up to hop over to his site to find out more.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.ypass.net/blog/2009/07/netflix-has-a-developer-api/">Netflix Has a Developer API&lt;/a>&lt;/li>
&lt;/ul></description><summary>Improvements to film summaries embedded in videos</summary></item><item><title>MKV to MPEG-4 conversion script</title><link>https://wimpysworld.com/posts/mkv-to-mpeg-4-conversion-script/</link><pubDate>Thu, 27 Aug 2009 20:48:58 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/mkv-to-mpeg-4-conversion-script/</guid><description>&lt;p>The PlayStation 3 can&amp;rsquo;t play MKV files. Therefore I&amp;rsquo;ve written a script that
creates a PlayStation 3 or Xbox 360 compatible MPEG-4 from Matroska providing
the video is H.264 and audio is AC3 or DTS.&lt;/p>
&lt;p>Xbox 360 compatibility requires that audio is forcibly downmixed to stereo
with &lt;code>--stereo&lt;/code>. AAC 5.1 audio will have the correct channel assignments when
transcoding from AC3 5.1 and DTS 5.1. If &lt;code>neroAacEnc&lt;/code> is installed then it is
used in preference to &lt;code>faac&lt;/code> for encoding the AAC audio, as it produces better
quality output. &lt;code>neroAacEnc&lt;/code> is optional.&lt;/p>
&lt;p>The script does as little re-encoding as possible, only the audio and
subtitles are re-encoded or converted. The script can detect profile 5.1 H.264
and patch it to 4.1 in under a second. Any subtitles in the Matroska are
preserved. If &lt;code>mp4creator&lt;/code> is used the subtitles are extracted stored in a
seperate file. If &lt;code>MP4Box&lt;/code> is used (default) the subtitles are converted to
GPAC Timed Text and muxed into the resulting MPEG-4. The PlayStation 3 can&amp;rsquo;t
display these subtitles but some software players can.&lt;/p>
&lt;p>The script can optionally split the Matroska if it is greater than 4GB to ensure
PlayStation 3, Xbox 360 and FAT32 compatibility. This script works on Ubuntu and
should work on any other Linux/Unix flavour and possibly Mac OS X providing you
have the required tools installed.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/flexiondotorg/MKV-to-MP4">MKV-to-MP4&lt;/a>&lt;/li>
&lt;/ul></description><summary>Creating PlayStation 3 and Xbox 360 compatible MPEG-4 videos</summary></item><item><title>MP3Gainer - Apply ReplayGain to your entire music library</title><link>https://wimpysworld.com/posts/mp3gainer-apply-replaygain-to-your-entire-music-library/</link><pubDate>Fri, 14 Aug 2009 15:25:45 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/mp3gainer-apply-replaygain-to-your-entire-music-library/</guid><description>&lt;p>Work has been crazy. We&amp;rsquo;re moving house. Hence, not much time for geeky stuff
recently. I&amp;rsquo;ve been putting this off for ages, I need to &amp;ldquo;normalise&amp;rdquo; the
volume of my MP3 music music library. Not all CDs sound equally loud. Whilst
different musical moods require that some tracks should sound louder than
others, the loudness of a given CD has more to do with the year of issue or
the whim of the producer than the intended emotional effect. This difference
carries over when you rip the CD to MP3 and random play through my music
collection requires constant manual volume adjustment. This has been bugging
me for a while now, but when it started to bug my wife I knew it was time to
find a solution. My main concerns with applying some sort of audio
normalisation were&amp;hellip;.&lt;/p>
&lt;ul>
&lt;li>My MP3s should not be irretrievably changed into something I end up hating.&lt;/li>
&lt;li>The method used should be free of the application used for music playback,
given that I play my music on iPod Nano, iPod Shuffle, PSP, PS3, Linux desktops,
TomTom 720T FM streaming and in car MP3 player.&lt;/li>
&lt;/ul>
&lt;p>After some research &lt;a href="http://mp3gain.sourceforge.net">mp3gain&lt;/a> seems to be the
tool for the job which provides an implementation of
&lt;a href="http://www.replaygain.org/">ReplayGain&lt;/a>. However, as of today my entire CD
collection is ripped, which is very large, so I needed a way to process my
whole music collection in an automated fashion. I found some examples of how
to script this, but there are caveats with the solutions I found. Therefore I
have created my own script, MP3Gainer, to apply ReplayGain using &lt;code>mp3gain&lt;/code>
which overcomes these common limitations. MP3Gainer recursively applies
ReplayGain to a MP3 music collection of any size and directory depth.
ReplayGain can be applied in &amp;rsquo;track&amp;rsquo; or &amp;lsquo;album&amp;rsquo; mode and if ReplayGain has
previously been applied it can also be undone. It is important to understand
that MP3Gainer &amp;lsquo;album&amp;rsquo; mode really is per album, which is what you want. Trust
me! This script works on Ubuntu, should work on any other Linux/Unix
flavour and possibly Mac OS X providing you have the required tools installed.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/flexiondotorg/MP3Gainer">MP3Gainer&lt;/a>&lt;/li>
&lt;/ul></description><summary>Volume normalise an entire MP3 library the right way</summary></item><item><title>PlayStation 3 compatible MPEG-4 container repacker</title><link>https://wimpysworld.com/posts/playstation-3-compatible-mpeg-4-container-repacker/</link><pubDate>Thu, 23 Apr 2009 17:09:11 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/playstation-3-compatible-mpeg-4-container-repacker/</guid><description>&lt;p>Some of my mobile phones have been able to record video clips in MPEG-4
format. Sadly some of these clips don&amp;rsquo;t play on the PlayStation 3 and those
that do stutter terribly. I use &lt;a href="http://po-ru.com/projects/iplayer-downloader/">iplayer-dl&lt;/a>
to download content from BBC iPlayer. Sadly the files are in a Quicktime
container and are not playable on the PlayStation 3.&lt;/p>
&lt;p>In order to address both these issues I created a script which extracts the
audio and video from an existing MPEG-4 or ISO Media Apple QuickTime container
and repacks them in a new MPEG-4 container with optional splitting of the
resulting MPEG-4 to maintain FAT32 compatibility. The new MPEG-4 files play
just fine on my PlayStation 3. This script works on Ubuntu, should work on any
other Linux/Unix flavour and possibly Mac OS X providing you have the required
tools installed.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/flexiondotorg/MP4-Packer">MP4-Repacker&lt;/a>&lt;/li>
&lt;/ul></description><summary>Automatically repack MPEG-4 video files for PlayStation 3 compatibility</summary></item><item><title>MKV to M2TS conversion script</title><link>https://wimpysworld.com/posts/mkv-to-m2ts-conversion-script/</link><pubDate>Thu, 23 Apr 2009 17:00:58 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/mkv-to-m2ts-conversion-script/</guid><description>&lt;p>The PlayStation 3 can&amp;rsquo;t play MKV files. Therefore I&amp;rsquo;ve written a
script that creates a PlayStation 3 compatible M2TS from a MKV,
assuming video is H.264 and audio is AC3 or DTS with as little
re-encoding as possible. Any subtitles in the MKV are preserved
in the M2TS although the PlayStation 3 can&amp;rsquo;t display subtitles in M2TS
containers. Optionally splits the M2TS, if it is greater than 4GB,
to maintain FAT32 compatibility. Unlike other MKV to M2TS solutions,
this script doesn&amp;rsquo;t create any intermediate files during the conversion.&lt;/p>
&lt;p>The PlayStation 3 can&amp;rsquo;t play DTS audio streams in M2TS containers, therefore
DTS audio is transcoded to AC3.&lt;/p>
&lt;p>This script works on Ubuntu, should work on any other Linux/Unix flavour and
possibly Mac OS X providing you have the required tools installed.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/flexiondotorg/MKV-to-M2TS">MKV-to-M2TS&lt;/a>&lt;/li>
&lt;/ul></description><summary>Convert Matroska file to MPEG2-TS for PlayStation 3 compatibility</summary></item><item><title>DVD to MPEG2-PS Ripper for Linux</title><link>https://wimpysworld.com/posts/dvd-to-mpeg2-ps-ripper-for-linux/</link><pubDate>Thu, 23 Apr 2009 16:50:31 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/dvd-to-mpeg2-ps-ripper-for-linux/</guid><description>&lt;p>Every so often I find myself in looking through the ex-rental DVD &lt;em>&amp;ldquo;bargain
bin&amp;rdquo;&lt;/em>. Quite often I find something I consider a bargain. However, the
experience of watching an ex-rental DVD is typically ruined by the various
trailers and marketing guff at the start which you can&amp;rsquo;t skip. My wife hates
that stuff, and I love my wife, so I routinely rip the main feature of newly
acquired ex-rental DVD movies so we can avoid that crap.&lt;/p>
&lt;p>I run a Mediatomb DLNA server and I want to load it with all my DVDs. Ripping
them helps reduce the amount of storage I require. MPEG2-PS files are
compatible with my PlayStation 3 which is the client to my Mediatomb DLNA server.
As a solution to the above I created a script, which can extract the main feature
from a DVD video, allowing the user to select one audio stream and one subtitle
stream. Optionally the video can be requantised, using M2VRequantiser, and an ISO
image created. If creating an ISO image the chapters are also preserved from
the original DVD. I&amp;rsquo;ve lobbed my code into GitHub.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/flexiondotorg/DVD-to-MPG">DVD-to-MPG&lt;/a>&lt;/li>
&lt;/ul></description><summary>Ripping DVDs to MPEG2-PS for streaming via UPnP</summary></item><item><title>M2VRequantiser for 32-bit and 64-bit Linux</title><link>https://wimpysworld.com/posts/m2vrequantiser-for-32-bit-and-64-bit-linux/</link><pubDate>Thu, 23 Apr 2009 16:47:20 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/m2vrequantiser-for-32-bit-and-64-bit-linux/</guid><description>&lt;p>I recently discovered that &lt;code>tcrequant&lt;/code> (part of the
&lt;a href="http://http://www.transcoding.org/">transcode&lt;/a> suite of tools) has been
deprecated. Worst still I found that when I ran &lt;code>tcrequant&lt;/code> on my 64-bit Linux
workstation is was corrupting the video. See the links below for details.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://tcforge.berlios.de/archives/2009/01/18/transcode_1_1_0_final_release/index.html">transcode 1.1.0 Final Release&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.mail-archive.com/transcode-users@exit1.org/msg01773.html">[transcode-users] tcrequant status&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Therefore I decided to get the &lt;a href="http://www.metakine.com/products/dvdremaster/developers.html">M2VRequantiser&lt;/a>
code from &lt;a href="http://www.metakine.com/">Metakine&lt;/a> working on both 32-bit and 64-bit
Linux as a replacement for &lt;code>tcrequant&lt;/code>. M2VRequantiser accepts the raw MPEG2 video
data (not VOB) from the standard input and writes the recompressed frames to
the standard output. M2VRequantiser takes two arguments. The first one is a
floating point value specifying the ratio of compression. The second is the
size of the M2V, since the data is streamed to M2VRequantiser it cannot know
the M2V size. The following command would recompress &amp;lsquo;original.m2v&amp;rsquo;, whose
size is 1024000 bytes, by a factor of 1.25.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>M2VRequantiser 1.25 &lt;span style="color:#f60">1024000&lt;/span> &amp;lt; original.m2v &amp;gt; requantised.m2v
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>I&amp;rsquo;ve only tested on 32-bit and 64-bit Linux, specifically Ubuntu 8.10. It works
for me but I&amp;rsquo;d be interested to get your feedback.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://code.launchpad.net/~flexiondotorg/m2vrequantiser/trunk">M2VRequantiser&lt;/a>&lt;/li>
&lt;/ul></description><summary>Finding a MPEG-2 video requantising solution for Linux</summary></item><item><title>IMDB Film Summary as a MPEG-2 video</title><link>https://wimpysworld.com/posts/imdb-film-summary-as-a-mpeg-2-video/</link><pubDate>Wed, 22 Apr 2009 18:00:07 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/imdb-film-summary-as-a-mpeg-2-video/</guid><description>&lt;p>&lt;strong>UPDATE! I no longer use or maintain the script below. I suggest the vastly
superior &lt;a href="http://www.bunyipawonga.org/sheetmaker/index.php">Sheet Maker for Linux&lt;/a>&lt;/strong>.&lt;/p>
&lt;p>If you&amp;rsquo;ve read my blog before you&amp;rsquo;ll know I run Mediatomb DLNA server with my
PlayStation 3 as the client, You&amp;rsquo;ll also know I am working towards importing my
entire DVD collection into my Mediatomb server. However, my wife wants to know
something about each film in the library without having to dig out the DVD
case from storage. My solution is to include a MPEG-2 video displaying the
film summary in the Mediatomb library for each DVD I have imported so it can
be easily viewed from the PS3.&lt;/p>
&lt;p>My script is called IMDB-to-MPEG and I&amp;rsquo;ve finally got round to uploading it.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/flexiondotorg/IMDB-to-MPEG">IMDB-to-MPEG&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>The scripts takes one parameter as input, a film title. The plotline, year of
release, genres, cast list and running time for that film are gathered from IMDB
and formatted as text. Here is an example.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span> The Usual Suspects (1995)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> A boat has been destroyed, criminals are dead, and
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> the key to this mystery lies with the only
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> survivor and his twisted, convoluted story
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> beginning with five career crooks in a seemingly
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> random police lineup. (106 mins)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Starring Stephen Baldwin as Michael McManus,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Gabriel Byrne as Dean Keaton, Benicio Del Toro as
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Fred Fenster, Kevin Pollak as Todd Hockney, and
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Kevin Spacey as Roger &amp;#39;Verbal&amp;#39; Kint.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Genres: Crime, Mystery, Thriller.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Rated 8.7 out of 10 from 227,964 votes.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The text is converted into an image and then encoded into a MPEG-2 video using
the lowest possible bitrate/resolution that is acceptable to read when viewing
on a 42&amp;quot; plasma from my sofa.&lt;/p>
&lt;p>Directories for each matching genre are created and also one for the IMDB
rating (rounded down). The MPEG-2 is stored in the &amp;lsquo;All&amp;rsquo; folder and then
symlinked to the genres and rating for that film. I then copy my video into
the appropriate directory in &amp;lsquo;All&amp;rsquo;. For example.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span> .
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-- All
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |   `-- The_Usual_Suspects
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |       `-- About_The_Usual_Suspects.mpg
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-- Genres
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |   |-- Crime
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |   |   `-- The_Usual_Suspects -&amp;gt; ../../All/The_Usual_Suspects
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |   |-- Mystery
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |   |   `-- The_Usual_Suspects -&amp;gt; ../../All/The_Usual_Suspects
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |   `-- Thriller
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |       `-- The_Usual_Suspects -&amp;gt; ../../All/The_Usual_Suspects
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-- Ratings
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> `-- 8
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> `-- The_Usual_Suspects -&amp;gt; ../../All/The_Usual_Suspects
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This code was lashed up in a few hours, it ain&amp;rsquo;t pretty but it works for me on
my Ubuntu systems, maybe it&amp;rsquo;ll work for you too.&lt;/p></description><summary>Create film preview information for your UPnP server</summary></item><item><title>Converting Matroska to M2TS for PS3 and Mediatomb</title><link>https://wimpysworld.com/posts/converting-matroska-to-m2ts-for-ps3-and-mediatomb/</link><pubDate>Wed, 15 Apr 2009 16:19:24 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/converting-matroska-to-m2ts-for-ps3-and-mediatomb/</guid><description>&lt;p>It has been a while since I last posted, mainly due to not having Internet
access at home for a month. Anyway, I&amp;rsquo;m online again and I have been tinkering
with various projects the most recent of which is Matroska conversion (again).&lt;/p>
&lt;h2 id="matroska-to-mp4">Matroska to MP4&lt;/h2>
&lt;p>For sometime I have been converting Martoska files to MPEG-4 with AAC 5.1 audio
so I can stream them via Mediatomb to my PlayStation 3. The conversion process
works well although there is some overhead in transcoding the audio and the
AAC 5.1 audio is not as good quality as the original AC3 or DTS.&lt;/p>
&lt;p>If you are interested I&amp;rsquo;ve put my code in GitHub, the script automates the
whole process.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/flexiondotorg/MKV-to-MP4">MPV-to-MP4&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="matroska-to-m2ts">Matroska to M2TS&lt;/h2>
&lt;p>A little while back I read it was possible to convert those same Matroska file
to M2TS files which, so long as the audio is AC3, so takes much less time to
convert. As the PlayStation 3 can&amp;rsquo;t play DTS audio streams inside a M2TS container
there is still a requirement to transcode DTS to AC3. That said the conversion to
M2TS requires less file I/O than converting to MPEG-4 and is therefore it is
generally a quicker conversion method, typically just 2 or 3 minutes on my
workstation at home.&lt;/p>
&lt;p>Plus the audio quality of the AC3 or transcoded DTS is better than that of
transcoded AAC 5.1. I&amp;rsquo;ve created my own script to fully automate the conversion
process. The script has been tested on Ubuntu 8.10 64-bit but there is an
outside chance it will work on Mac OS X if you can get the required tools
installed. Again, you can find my script on GitHub.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/flexiondotorg/MKV-to-M2TS">MPV-to-M2TS&lt;/a>&lt;/li>
&lt;/ul></description><summary>Fast conversion of Matroska video to MPEG2-TS</summary></item><item><title>Mediatomb 0.12 - Streaming audio and video around the house</title><link>https://wimpysworld.com/posts/mediatomb-0.12-streaming-audio-and-video-around-the-house/</link><pubDate>Sat, 07 Feb 2009 16:23:39 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/mediatomb-0.12-streaming-audio-and-video-around-the-house/</guid><description>&lt;p>&lt;a href="http://mediatomb.cc/">Mediatomb&lt;/a> is an open source (GPL) UPnP MediaServer
with a nice web user interface, it allows you to stream your digital media
through your home network and listen to/watch it on a variety of UPnP
compatible devices, such as the PlayStation in my case.&lt;/p>
&lt;p>Mediatomb 0.12 is not yet released as final yet but it is certainly stable
enough for general use, so I spent the last week migrating from Mediatomb 0.11
to Mediatomb 0.12.&lt;/p>
&lt;p>I&amp;rsquo;ve recently finished ripping my entire CD collection (344 CDs) to MP3 and I
am currently ripping my DVD collection (85 done so far) to MP4 with AAC 5.1
audio. The &amp;lsquo;Music&amp;rsquo; and &amp;lsquo;Video&amp;rsquo; folders in our home directories are mounted via
NFS. The Mediatomb server uses the same data sources so any playlists or new
music/videos we might import are immediately reflected in Mediatomb.&lt;/p>
&lt;p>Our entire CD library is now available at the click of a button, automatically
organised by genre, artist and date. We have also created some playlists
in &lt;code>.m3u&lt;/code> or &lt;code>.pls&lt;/code> format.&lt;/p>
&lt;p>New to Mediatomb 0.12 is the ability to scrobble your music to
&lt;a href="http://www.last.fm">Last.fm&lt;/a>, this a killer feature for me and why I chose to
migrate to 0.12 before it goes final.&lt;/p>
&lt;p>I ripped the CDs using &lt;a href="http://www.burtonini.com/blog/computers/sound-juicer">SoundJuicer&lt;/a>,
since I can configure it to use &lt;a href="http://lame.cvs.sourceforge.net/viewvc/lame/lame/doc/html/presets.html">LAME presets&lt;/a>.
I then used the &lt;a href="http://musicbrainz.org/doc/PicardTagger">Music Brainz Picard Tagger&lt;/a> to
add additional tagging and embed cover art and then applied ReplayGain.&lt;/p>
&lt;p>Finally my wife and I use &lt;a href="http://banshee-project.org/">Banshee&lt;/a> to manage the
music library on our computers, including the creation of playlists and syncing
to our iPods.&lt;/p>
&lt;p>I am using &lt;a href="http://handbrake.fr/">Handbrake&lt;/a> to rip the DVDs to MP4. I&amp;rsquo;ve created a
new PS3 compatible profile which is focused on quality, I&amp;rsquo;ll post details
about that in the future. Mediatomb 0.12 has some experimental features to
stream video content from .ISO images of DVDs. I&amp;rsquo;ve yet to play with that but
it sounds very cool. I&amp;rsquo;ve also created a script which queries IMDB to
categorise our film library by genre and create summary information about
each film in the library. I&amp;rsquo;ll be posting more about that soon. I haven&amp;rsquo;t
finalised how we will integrate Photo management with Mediatomb yet, but that
is that final piece in the puzzle.&lt;/p></description><summary>In home streaming via UPnP with Mediatomb</summary></item><item><title>Distributing closed source Python applications</title><link>https://wimpysworld.com/posts/distributing-closed-source-python-applications/</link><pubDate>Thu, 29 Jan 2009 13:04:03 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/distributing-closed-source-python-applications/</guid><description>&lt;p>Last November we switched to &lt;a href="http://www.python.org/">Python&lt;/a> as the principal
language for all new software development projects at work, ditching Microsoft
Visual C++ and PHP in the process. Last Friday we released our first Python
application to our customers for both Windows and Linux users.&lt;/p>
&lt;p>Although we make good use of Open Source software development tools and
methodologies the application we have just written is propritary and the
source can not be released publicly. We needed to compile, or &lt;em>freeze&lt;/em>, the
Python script in order to create a standalone executable. Tools that do this
have been around for sometime, however our application makes use of Win32
Extensions for Python and WMI on Windows, DBUS/HAL on Linux, wxPython
on both, and a number of other modules. This is quite a big ask for the Python
script compilers and initially the only tool which could build this lot
successfully was &lt;a href="http://www.py2exe.org/">py2exe&lt;/a>. Sadly that only solves part
of the problem since it is a Windows only tool.&lt;/p>
&lt;p>Then we found &lt;a href="http://pypi.python.org/pypi/bbfreeze/">bbfreeze&lt;/a>, which
supports both Windows and Linux with Mac OS X support being actively
developed. &lt;code>bbfreeze&lt;/code> has a simple build API and we were soon using it to build
stand alone executables for both Windows and Linux. Everything is peachy, all
we needed was as means to install our application.&lt;/p>
&lt;p>We only need a tarball for Linux since we manage all kiosk installations, but
our customer can install the Windows version. Enter &lt;a href="http://www.jrsoftware.org/isinfo.php">InnoSetup&lt;/a>.
InnoSetup is a free installer for Windows programs and installer can even be
created from the command line, perfect for integration with our Jenkins build
servers.&lt;/p></description><summary>Freezing proprietary Python applications for distribution to clients</summary></item><item><title>Wordpress Search Engine Optimisation</title><link>https://wimpysworld.com/posts/wordpress-search-engine-optimisation/</link><pubDate>Mon, 26 Jan 2009 15:37:55 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/wordpress-search-engine-optimisation/</guid><description>&lt;p>I manage several websites at work and have therefore learned something about
search engine optimisation (SEO). Our main site at work uses
&lt;a href="http:/www.wordpress.org">Wordpress&lt;/a> as the content manager, which has good
SEO features by default. Last week we launched a new website and I also
refreshed the other sites, in so doing I found a great article discussing how
to fully SEO your Wordpress site. It is a good read even if you don&amp;rsquo;t use
Wordpress, but for those of you that do, it recommends a suite of plugins that
do all the hard work for you.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://yoast.com/articles/wordpress-seo/">Wordpress SEO - The definitive guide to high rankings for your Blog&lt;/a>&lt;/li>
&lt;/ul></description><summary>Wordpress plugins that help automate SEO</summary></item><item><title>Hacking WordTwit into WordDent</title><link>https://wimpysworld.com/posts/hacking-wordtwit-into-worddent/</link><pubDate>Fri, 23 Jan 2009 18:24:20 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/hacking-wordtwit-into-worddent/</guid><description>&lt;p>I have quickly forked &lt;a href="https://wordpress.org/plugins/wordtwit/">WordTwit&lt;/a> into
WordDent. WordDent is a Wordpress plugin that utilizes the Twitter API to
automatically push a published post to your &lt;a href="http://identi.ca">Identi.ca&lt;/a>
account as a dent. It allows all your Identi.ca contacts to keep up to date
with your blog postings. I&amp;rsquo;m still just testing that WordDent works
correctly. I&amp;rsquo;ll find out if the nice people over at
&lt;a href="http://www.bravenewcode.com">Brave New Code&lt;/a> will agree to me releasing
WordDent since I can&amp;rsquo;t fine any license details for WordTwit.&lt;/p></description><summary>Automatically post Wordpress blog notification to Identi.ca</summary></item><item><title>Converting DVB-T to DVD Compliant MPEG-2</title><link>https://wimpysworld.com/posts/converting-dvb-t-to-dvd-compliant-mpeg-2/</link><pubDate>Thu, 22 Jan 2009 23:46:26 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/converting-dvb-t-to-dvd-compliant-mpeg-2/</guid><description>&lt;p>I am just about to clean up and convert another batch of programmes I have
recorded from Freeview (DVB-T in the UK) so that I can add them to my
DLNA Server. I thought I&amp;rsquo;d share the method I use on Ubuntu.&lt;/p>
&lt;p>By clean up, I mean edit out any adverts and trim crap from the start and the
end of the recordings. It just so happens that the result of this process is
a DVD compliant MPEG-2 which is suitable for DVD authoring, or in my case,
streaming around the house. This method of conversion should work for any DVB
PVR which allows you to export recordings via USB and, of course,
&lt;a href="http://www.mythtv.org/">MythTV&lt;/a> or similar.&lt;/p>
&lt;h2 id="dvb-ripping">DVB Ripping&lt;/h2>
&lt;p>I have a PlayTV add-on for the PlayStation 3 which enables me to record Freeview
(DVB-T) broadcasts to the PS3 internal hard disk. I mostly use PlayTV to record
films. To prevent the PlayStation 3 hard disk filling up with films I wanted to
export, edit out any adverts and then serve the edited file from my DLNA server
or author it to DVD.&lt;/p>
&lt;p>This process does not re-encode the audio or video therefore it is fairly quick
and the output is the same quality as the input.&lt;/p>
&lt;p>Although I am using a PlayStation 3 as PVR and MPEG-2 TS (Transport Stream) file
can be converted to a MPEG-2 PS (Program Stream) file using this process.&lt;/p>
&lt;h2 id="export-from-playstation-3">Export from PlayStation 3&lt;/h2>
&lt;h3 id="playtv-to-home-menu">PlayTV to Home Menu&lt;/h3>
&lt;p>First we need to move the recording from the PlayTV Library to the PS3 Home Menu.
Start PlayTV, open the Library, select the recording and choose the Move to Home
Menu option.&lt;/p>
&lt;h3 id="copy-from-home-menu-to-external-usb">Copy from Home Menu to External USB&lt;/h3>
&lt;ul>
&lt;li>Quit PlayTV&lt;/li>
&lt;li>Plug in an external (FAT32 formatted) USB drive to the PS3.&lt;/li>
&lt;li>Go to Video on the PS3 Home Menu and select the recording you moved there earlier.&lt;/li>
&lt;li>Select Copy from the Options screen and choose the external USB drive as the target.&lt;/li>
&lt;/ul>
&lt;h2 id="clean-mpeg-2-ts-and-convert-to-mpeg-2-ps">Clean MPEG-2 TS and convert to MPEG-2 PS&lt;/h2>
&lt;p>Plug the USB drive into your Ubuntu workstation and copy the &lt;code>.m2ts&lt;/code> file to your
hard disk.&lt;/p>
&lt;p>You will need to &lt;a href="http://project-x.sourceforge.net/">Project X&lt;/a> to clean the
MPEG-2 TS and convert it to MPEG-2 PS.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>apt-get install project-x
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="edit-out-the-adverts">Edit out the adverts&lt;/h2>
&lt;p>Start the Project X GUI and load your &lt;code>.m2ts&lt;/code> file.&lt;/p>
&lt;ul>
&lt;li>&lt;code>File -&amp;gt; Add&lt;/code> and select your .m2ts file.&lt;/li>
&lt;/ul>
&lt;p>Now use Project X to add cut points to edit out any adverts.&lt;/p>
&lt;h2 id="de-multiplex-the-audio-and-video">De-multiplex the audio and video&lt;/h2>
&lt;p>When you have completed your edits you need to &amp;lsquo;demux&amp;rsquo; the &lt;code>.m2ts&lt;/code> file into two
streams, one holding the audio (.mp2) and one holding the video (.m2v).&lt;/p>
&lt;ul>
&lt;li>Click the &lt;code>Prepare &amp;gt;&amp;gt;&lt;/code> button.&lt;/li>
&lt;li>From the &lt;code>Process Window&lt;/code> select the &lt;code>Action&lt;/code> type &lt;code>to M2P&lt;/code>&lt;/li>
&lt;li>Click the start button and wait for the processing to finish.&lt;/li>
&lt;li>Clock the &amp;lsquo;&amp;lsquo;Process Windows&amp;rsquo;&amp;rsquo; and quit Project X.&lt;/li>
&lt;/ul>
&lt;h2 id="re-multiplex-the-audio-and-video">Re-multiplex the audio and video&lt;/h2>
&lt;p>The reason for the de-mux and then re-musing it to ensure the timecodes are
correct, other the video will not playback correctly.&lt;/p>
&lt;p>Install MJPEG tools.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>apt-get install mjpegtools
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Now we need to re-multiplex the audio and video to create a DVD compliant MPEG-2 PS file.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>mplex -f &lt;span style="color:#f60">8&lt;/span> -o muxed-%d.mpg audio.mp2 video.m2v
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>-f 8&lt;/code> option specifies a dvd-compliant stream that is compatible with dvdauthor.
The &lt;code>-o&lt;/code> option specifies the outfile, you can substitute &lt;code>muxed-%d.mpg&lt;/code> with a
more descriptive name if you like. &lt;code>%d&lt;/code> is expanded to a number if &lt;code>mplex&lt;/code> decides
to split the output to several files, this usually happens when the recording
contains commercials and is nothing to worry about.&lt;/p>
&lt;h2 id="author-dvd">Author DVD&lt;/h2>
&lt;p>The MPEG-2 PS file that has been created should be suitable for DVD authoring
using DeVeDe. When adding MPEG-2 PS files created using the method above open
the DeVeDe &lt;code>Advanced options&lt;/code> and select &lt;em>This file is already a DVD/xCD-suitable
MPEG-PS file&lt;/em> in the &lt;code>Misc&lt;/code> menu.&lt;/p>
&lt;h4 id="references">References&lt;/h4>
&lt;ul>
&lt;li>&lt;a href="http://project-x.sourceforge.net/">http://project-x.sourceforge.net/&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://ttcut.tritime.de/index.2.html">http://ttcut.tritime.de/index.2.html&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://gopchop.org/index.php">http://gopchop.org/index.php&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://gopchop.sourceforge.net/">http://gopchop.sourceforge.net/&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.rastersoft.com/programas/devede.html">http://www.rastersoft.com/programas/devede.html&lt;/a>&lt;/li>
&lt;/ul></description><summary>Export PlayTV recorded video from PlayStation 3</summary></item><item><title>Sync Zimbra Contacts, Calendar and Tasks to your iPod</title><link>https://wimpysworld.com/posts/sync-zimbra-contacts-calendar-and-tasks-to-your-ipod/</link><pubDate>Wed, 21 Jan 2009 13:41:51 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/sync-zimbra-contacts-calendar-and-tasks-to-your-ipod/</guid><description>&lt;p>We use &lt;a href="http://www.zimbra.com/">Zimbra&lt;/a> at work for email, contacts,
calendaring, etc. I have Zimbra syncing with Thunderbird and my phone, I love it.&lt;/p>
&lt;p>At the weekend I was updating the music library on my iPod Nano (2nd Gen) and
noticed I had hidden the Contact and Calendar menu entries. I decided to see if
I could get my iPod Contacts and Calendar synced with Zimbra, it turned out to
be very simple. In the examples below replace &lt;code>username&lt;/code> and &lt;code>password&lt;/code> with
your Zimbra user credentials. Obviously use the URL to your Zimbra server and
replace &lt;code>/media/IPOD&lt;/code> with where your Linux distribution has mounted your iPod.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>wget https://username:password@your.zimbraserver.tld/zimbra/home/username/contacts.vcf -O /media/IPOD/Contacts/contacts.vcf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>wget https://username:password@your.zimbraserver.tld/home/username/Calendar -O /media/IPOD/Calendars/calendar.ics
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>wget https://username:password@your.zimbraserver.tld/home/username/Tasks -O /media/IPOD/Calendars/tasks.ics
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description><summary>Push Zimbra contacts, calendars &amp;amp; tasks to your iPod using Linux</summary></item><item><title>VMWare to VirtualBox Migration</title><link>https://wimpysworld.com/posts/vmware-to-virtualbox-migration/</link><pubDate>Mon, 19 Jan 2009 17:52:49 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/vmware-to-virtualbox-migration/</guid><description>&lt;p>Last week I switched from &lt;a href="http://www.vmware.com/">VMware&lt;/a> to
&lt;a href="http://www.virtualbox.com/">VirtualBox&lt;/a> at home. Why? Well, hack value
mostly and I also wanted to learn more about VirtualBox having never used it
before.&lt;/p>
&lt;p>Bottom line, for home use it suits me very nicely and is far easier to
get installed and running when compared to VMware Server which almost always
required patching. The VirtualBox and Guest Additions (think VMWare Tools)
installers both worked without a hitch. I even migrated my existing VMware
Linux guests to VirtualBox, again everything went smoothly and my existing
&lt;code>.vmdk&lt;/code> disks worked just fine.&lt;/p></description><summary>I switched from VMWare to VirtualBox</summary></item><item><title>Search engine verification and sitemaps</title><link>https://wimpysworld.com/posts/search-engine-verification-and-sitemaps/</link><pubDate>Sun, 18 Jan 2009 23:19:12 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/search-engine-verification-and-sitemaps/</guid><description>&lt;p>I finally got around to verifying my websites with the Google, Yahoo! and MSN
Live search engines. I&amp;rsquo;ve also setup sitemaps for my websites too. I&amp;rsquo;ve done
this for the websites at work but couldn&amp;rsquo;t be arsed to do it for my own sites
until today.&lt;/p>
&lt;p>To find out why you want sitemap enable your sites read the
&lt;a href="http://en.wikipedia.org/wiki/Site_map">Sitemap&lt;/a> page at Wikipedia. In order to
register your sitemaps with the major search engines you&amp;rsquo;ll need to setup
accounts for &lt;a href="https://www.google.com/webmasters/tools/">Google Webmaster Tools&lt;/a>,
&lt;a href="http://webmaster.live.com/webmaster/">MSN Live Webmaster Tools&lt;/a> and
&lt;a href="https://siteexplorer.search.yahoo.com/">Yahoo! Site Explorer&lt;/a>.&lt;/p>
&lt;p>You&amp;rsquo;ll then need to &lt;em>verify&lt;/em> your site(s) with each of the search engines, they
provide details about how to do this but it typically requires that you put a
meta tag in your page header. Once you&amp;rsquo;ve verified your site(s) it&amp;rsquo;s time to
create a &lt;code>sitemap.xml&lt;/code>.&lt;/p>
&lt;p>If you have a Wordpress blog adding sitemap support is easy, just use the
&lt;a href="http://wordpress.org/extend/plugins/google-sitemap-generator/">Google XML Sitemaps&lt;/a>
plugin. This re-builds &lt;code>sitemap.xml&lt;/code> when you update posts, pages, comments etc.
It also notifies all the relevant search engines that content has changed on
your site. Very useful indeed. If you need to create your sitemap by hand, or
better yet script its creation, then read &lt;a href="http://www.sitemaps.org/">sitemaps.org&lt;/a>
for the protocol spec.&lt;/p></description><summary>Verify websites with search engines and submit sitemaps for indexing</summary></item><item><title>Blog post notifications to Twitter</title><link>https://wimpysworld.com/posts/blog-post-notifications-to-twitter/</link><pubDate>Sat, 17 Jan 2009 10:45:12 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/blog-post-notifications-to-twitter/</guid><description>&lt;p>I&amp;rsquo;ve just installed &lt;a href="http://www.bravenewcode.com/wordtwit/">WordTwit&lt;/a> on my
blog. WordTwit keeps track of when you publish new posts, and automatically
informs all of your followers by pushing out a Twitter tweet. All links are
automatically converted to tiny URLs.&lt;/p></description><summary>Send new Wordpress blog notifications to Twitter</summary></item><item><title>SSHMenu - SSH Connection Management</title><link>https://wimpysworld.com/posts/sshmenu-ssh-connection-management/</link><pubDate>Tue, 26 Feb 2008 13:21:28 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/sshmenu-ssh-connection-management/</guid><description>&lt;p>We have a reasonable number of Debian servers at work and as a result I &lt;code>ssh&lt;/code>
into servers about as many times as I visit Google. I have been using
Profiles in gnome-terminal to manage my ssh connections, which is fine but
requires I already have a terminal open to initiate a new server connection.
Enter &lt;a href="http://sshmenu.sourceforge.net/">SSHMenu&lt;/a>, a GNOME panel applet that
keeps all your regular SSH connections within a single mouse click.&lt;/p>
&lt;p>I couldn&amp;rsquo;t be arsed adding up a new repo for one application, so here are my
quick and dirty install steps.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>wget http://sshmenu.sourceforge.net/debian/dists/stable/contrib/binary-all/sshmenu_3.15-1_all.deb
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>wget http://sshmenu.sourceforge.net/debian/dists/stable/contrib/binary-all/sshmenu-gnome_3.15-1_all.deb
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo gdebi -n sshmenu_3.15-1_all.deb
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo gdebi -n sshmenu-gnome_3.15-1_all.deb
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>I have taken to using &lt;code>gdebi&lt;/code> to install local deb packages as it resolves and
installs dependencies. Now add SSHMenu to a GNOME panel and configure
your ssh connections. If SSHMenu isn&amp;rsquo;t listed in the GNOME panel applets yet,
then you can force a refresh with the rather heavy handed&amp;hellip;&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>killall gnome-panel
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description><summary>Managing SSH connections from a GNOME panel applet</summary></item><item><title>Get some AIR</title><link>https://wimpysworld.com/posts/get-some-air/</link><pubDate>Tue, 12 Feb 2008 12:53:03 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/get-some-air/</guid><description>&lt;p>&lt;a href="http://air-imager.sourceforge.net/">AIR (Automated Image and Restore)&lt;/a> is a
GUI front-end to &lt;code>dd&lt;/code> and &lt;code>dcfldd&lt;/code> designed for easily creating forensic bit
images. Or, a nice way to let the guys at work who like GUIs make Debian boot
install floppies (don&amp;rsquo;t ask) easily. Ubuntu 7.10 doesn&amp;rsquo;t have a package for AIR,
but AIR does have an installer.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo aptitude install perl-tk sharutils dcfldd netcat cryptcat
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>wget http://prdownloads.sourceforge.net/air-imager/air-1.2.8.tar.gz?download
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>tar zxvf air-1.2.8.tar.gz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cd air-1.2.8/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo ./install-air-1.2.8
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>At this point the installer thingy will kick off, follow the prompts. I have
found that &lt;code>air&lt;/code> needs to run as root, but won&amp;rsquo;t run if the executable is
setuid. So run it via &lt;code>sudo&lt;/code> like so:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo air
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description><summary>A graphical frontend for dd</summary></item><item><title>gLabels 2.2.1</title><link>https://wimpysworld.com/posts/glabels-2.2.1/</link><pubDate>Wed, 30 Jan 2008 11:45:57 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/glabels-2.2.1/</guid><description>&lt;p>&lt;a href="http://glabels.sourceforge.net/">gLabels&lt;/a>, as packaged in the Ubuntu
repositories, has not worked properly for some time. The accuracy of printing
was way out making gLabels a non-starter unless you went to the hassle
of manually re-aligning every label on a page to account for the inaccuracies.&lt;/p>
&lt;p>However, I have been patiently waiting for a new version of gLables to be
released. The new development branch completely replaces &lt;code>libgnomeprint&lt;/code> with
the new &lt;code>GtkPrintOperation&lt;/code> and Cairo. The upshot of that is that the printing
accuracy issues are resolved.&lt;/p>
&lt;p>&lt;a href="http://www.getdeb.net">GetDeb&lt;/a> have released &lt;a href="http://www.getdeb.net/app/gLabels">.debs for gLabels 2.2.1&lt;/a>
that work with Ubuntu Gutsy 7.10. You can either download the .debs from the
gLabels page at GetDeb and let &lt;code>gdebi&lt;/code> do its thing or do the following from the
shell&amp;hellip;&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>wget -c ftp://cesium.di.uminho.pt/pub/getdeb/gl/glabels_2.2.1-1~getdeb1_i386.deb
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>wget -c ftp://cesium.di.uminho.pt/pub/getdeb/gl/glabels-data_2.2.1-1~getdeb1_all.deb
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo dpkg -i glabels*.deb
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>We print a lot of labels at work to identify media for flight recorders, that
job just got a whole lot easier. More importantly, I now have a viable address
label printing solution for my wife.&lt;/p></description><summary>Accurate label printing for Linux is restored</summary></item><item><title>BloGTK, a weblog client for Linux</title><link>https://wimpysworld.com/posts/blogtk-a-weblog-client-for-linux/</link><pubDate>Fri, 11 Jan 2008 13:44:07 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/blogtk-a-weblog-client-for-linux/</guid><description>&lt;p>I have been meaning to setup a weblog client for a while now. I have tested a
couple of blog clients and have settled on &lt;a href="http://blogtk.sourceforge.net/">BloGTK&lt;/a>.&lt;/p>
&lt;p>It has a simple user interface but comprehensive features, although I did need
to define a few Custom Tags before the editor supported all the formatting
options I wanted. Setting up BloGTK is very simple for Ubuntu and Debain users
requiring an &lt;code>aptitude install blogtk&lt;/code> to get it installed and the following
settings will connect to a Wordpress blog.&lt;/p>
&lt;ul>
&lt;li>Server URL: &lt;code>http://blog.example.org/xmlrpc.php&lt;/code>&lt;/li>
&lt;li>Account: &lt;em>Your Username&lt;/em>&lt;/li>
&lt;li>Password: &lt;em>Your Password&lt;/em>&lt;/li>
&lt;li>Blogging System: &lt;em>Moveable Type&lt;/em>&lt;/li>
&lt;/ul>
&lt;p>Now I can blog directly from my desktop, I am hoping it will encourage me to
post more often.&lt;/p></description><summary>Graphical blogging client for GNOME</summary></item><item><title>Zindus contact sync for Thunderbird and Zimbra</title><link>https://wimpysworld.com/posts/zindus-contact-sync-for-thunderbird-and-zimbra/</link><pubDate>Thu, 10 Jan 2008 15:41:24 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/zindus-contact-sync-for-thunderbird-and-zimbra/</guid><description>&lt;p>When I setup the mail server at work I picked &lt;a href="http://www.zimbra.com/">Zimbra&lt;/a>.
It&amp;rsquo;s great.&lt;/p>
&lt;p>Today Zimbra just got a bit better when I found &lt;a href="http://www.zindus.com">Zindus&lt;/a>.
Zindus is open source software and runs on all Thunderbird platforms including
Windows, Mac OSX and Linux. Zindus can sync your contacts between Zimbra and
Thunderbird. It syncs everything from Address Books to your GAL (Global Address List).&lt;/p>
&lt;p>It currently supports ZCS 3.x to 5.x. Adding the &lt;a href="http://www.mozilla.org/projects/calendar/">Lightning&lt;/a>
and Zindus add-ons to Thunderbird create a very complete desktop client to
Zimbra for any platform. Can&amp;rsquo;t wait to share to good news with my Outlook users.&lt;/p></description><summary>Zimbra contact syncing for Thunderbird on Linux</summary></item><item><title>Simple iCal Server</title><link>https://wimpysworld.com/posts/simple-ical-server/</link><pubDate>Wed, 09 Jan 2008 23:20:28 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/simple-ical-server/</guid><description>&lt;p>For the longest time I have been meaning to setup a shared calendar for my
wife I and to use. You see, like most men I have no idea when and where I am
supposed to be. This is because my wife keeps all this information in her
filofax and that lives in her handbag, somewhere I never venture. So I have
spent this evening setting up &lt;a href="http://phpicalendar.net/">PHP iCalendar&lt;/a> on
&lt;a href="http://www.lighttpd.net/">Lighttpd&lt;/a>, and I am very happy with the results.&lt;/p>
&lt;p>I have opted to use the &lt;code>publish.php&lt;/code> add-on provided with PHP iCalendar, rather
than add the WebDAV module to Lighty. For our modest requirements it works
very well. We now have full read/write access to our calendar by using the
&lt;a href="http://www.mozilla.org/projects/calendar/">Lightning&lt;/a> extension for
Thunderbird and read only access via the PHP iCalendar web interface. Viewing
the calendar via the web interface requires a login first and the calendar
publishing is protected by Lighty authentication using htdigest.&lt;/p>
&lt;p>Lastly, because our calendar is a nice open standard I have options as to how I
might sync it with my mobile phone. More on that when I figure it out.&lt;/p></description><summary>Creating a self-hosted shared calendar</summary></item><item><title>Flexion.Org is re-activated!</title><link>https://wimpysworld.com/posts/flexion.org-is-re-activated/</link><pubDate>Sat, 22 Sep 2007 11:22:43 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/flexion.org-is-re-activated/</guid><description>&lt;p>I have finally got around to re-activating this website after many months of
neglect. The first thing to do was move away from &lt;a href="http://jaws-project.com/">Jaws&lt;/a>.
Sadly, my Jaws installation is broken in a way that newer Jaws releases refuse
to upgrade it.&lt;/p>
&lt;p>I did some research and decided to migrate to &lt;a href="http://www.wordpress.org">Wordpress&lt;/a>
since it caters for all the essentials I require either in the core
functionality or via plugins. Plus I can integrate with some other stuff I want
to use.&lt;/p>
&lt;p>The migration to Wordpress was made all the easier thanks to the excellent &lt;a href="http://trac.wordpress.org/ticket/4184">Jaws import plugin&lt;/a>
I found on the Wordpress trac. However, I decided not to use the Textile plugin
to preserve the Jaws formatted text. Instead I chose to manually clean up some
of the old entries so I could stick with the TinyMCE editor long term.&lt;/p>
&lt;p>I am happy with Wordpress thus far and look forward to getting some plugins
going and picking up a new theme over the coming days and weeks.&lt;/p></description><summary>Jaws dropped in a move to Wordpress</summary></item><item><title>POLARIS</title><link>https://wimpysworld.com/projects/polaris/</link><pubDate>Tue, 01 May 2007 00:00:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/projects/polaris/</guid><description>&lt;p>Led the design, development and operation of the POLARIS project at
&lt;a href="https://flightdataservices.com">Flight Data Services&lt;/a>. An Open Source analysis
engine developed using Python that can scale to analyse and report on millions
of commercial aviation flights to comply with global aviation safety regulations.
Now known as Flight Data Connect and owned by L3HARRIS and apparently no longer
available as Open Source.&lt;/p>
&lt;ul>
&lt;li>Organisation: &lt;a href="https://flightdataservices.com">Flight Data Services&lt;/a>&lt;/li>
&lt;li>Date: May 2007 - September 2015&lt;/li>
&lt;li>Role: Manager of IT Operations &amp;amp; Software Engineering&lt;/li>
&lt;/ul></description><summary>Disrupting incumbent flight data analysis solutions with Open Source</summary></item><item><title>R3-born 0.1.1 is released!</title><link>https://wimpysworld.com/posts/r3-born-0.1.1-is-released/</link><pubDate>Fri, 09 Mar 2007 21:59:45 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/r3-born-0.1.1-is-released/</guid><description>&lt;p>&lt;a href="http://www.sourceforge.net/projects/r3-born/">R3-born&lt;/a> 0.1.1 is released :-)&lt;/p>
&lt;h2 id="r3-born-core-change-log">R3-born Core Change Log&lt;/h2>
&lt;p>Here are the main changes for this release. &lt;em>v0.1.1 : 9th March 2007&lt;/em>&lt;/p>
&lt;ul>
&lt;li>Added Akismet anti-spam API&lt;/li>
&lt;li>Added a version checker for the Core and also for Blocks and Modules.&lt;/li>
&lt;li>Added search bot (Google, MSN, Yahoo!, etc) detection.&lt;/li>
&lt;li>Added logging (in Combined Log Format) to the R3-born Intrusion Prevention System.&lt;/li>
&lt;li>Enhanced the Module API so it now supports safe updating and custom CSS for blocks and modules.&lt;/li>
&lt;li>Enhanced the Layout Manager&lt;/li>
&lt;li>Enhanced the Registration and Profile pages by separating them.&lt;/li>
&lt;li>Enhanced the Template engine by back porting some features from phpBB 3.0.x&lt;/li>
&lt;li>Optimised and fixed the Search API&lt;/li>
&lt;li>Optimised and simplified Coloured Groups.&lt;/li>
&lt;li>Improved the Groups Management ACP&lt;/li>
&lt;li>Improved the Styles Management ACP&lt;/li>
&lt;li>Fixed various bugs in the core.&lt;/li>
&lt;li>Significant feature enhancements, bug fixes and optimisations added to the Menu and Who Is Online blocks.&lt;/li>
&lt;li>Significant feature enhancements, bug fixes and optimisations added to the Comments, Downloads, Forum, Pages,&lt;/li>
&lt;li>Private Messages, Weblogs and View Online modules.&lt;/li>
&lt;li>New modules : bot_list, cookie, error, google, referrers and sql_backup&lt;/li>
&lt;li>New blocks : recent_blogs, recent_comments, recent_pages, recent_topics, search, socmarks and visit_counter.&lt;/li>
&lt;/ul>
&lt;p>R3-born 0.1.1 has fulfilled its first major objective, which is to be functional
enough to run a website.&lt;/p></description><summary>R3-born is good enough to run a website</summary></item><item><title>R3-born 0.1.0 is released!</title><link>https://wimpysworld.com/posts/r3-born-0.1.0-is-released/</link><pubDate>Tue, 30 Jan 2007 11:52:55 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/r3-born-0.1.0-is-released/</guid><description>&lt;p>Finally, R3-born 0.1.0 is released. &lt;a href="http://www.sourceforge.net/projects/r3-born/">R3-born&lt;/a>
is a content management system for modest websites which I hope will be ideal for
individuals running their own sites or small community websites.&lt;/p>
&lt;p>Due to my accident I have not been able to address all of the bugs which have
been reported recently and the downloads are only available as bzip2 tarballs
right now. Please report any bugs you might encounter as 0.1.0 has really only
been tested on Debian Sarge (stable) running PHP4 and MSQL 4. Feedback from
other configurations will be useful and all reported bugs will be investigated.&lt;/p></description><summary>After 10 months work R3-born 0.1.0 is ready</summary></item><item><title>Announcing R3-born</title><link>https://wimpysworld.com/posts/announcing-r3-born/</link><pubDate>Fri, 08 Sep 2006 17:48:47 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/announcing-r3-born/</guid><description>&lt;p>I suppose it is a bit silly to announce this just before I go on holiday but
what the heck. &lt;a href="http://www.sourceforge.net/projects/r3-born/">R3-born&lt;/a> is
intended to be a simple and modular content management system for modest websites.
My hope is that it will be ideal for individuals running their own sites or for
small community websites. R3-born is coded in PHP (4.2.0 or better required)
and requires an SQL database, currently MySQL 3.x, 4.x and 5.x, Postgres 7.x
or better and MS-SQL 7.x or better are supported.&lt;/p>
&lt;h2 id="current-status">Current Status&lt;/h2>
&lt;p>Right now, R3-born is considered pre-alpha and not suitable for a production
website but is ready for testers to start feeding back on bugs, feature requests
and in the near future code changes. Development has been fairly rapid so far. I
started the project in April 2006 and I hope to release a beta version of
R3-born later in 2006.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.sourceforge.net/projects/r3-born/">http://www.sourceforge.net/projects/r3-born/&lt;/a>&lt;/li>
&lt;/ul></description><summary>Minerva is r3-born</summary></item><item><title>Conslidated RavenCore HOW-TOs</title><link>https://wimpysworld.com/posts/conslidated-ravencore-how-tos/</link><pubDate>Fri, 18 Aug 2006 12:37:07 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/conslidated-ravencore-how-tos/</guid><description>&lt;p>I have reorganized and consolidated my Debian and Ubuntu HOW-TOs for &lt;a href="http://sourceforge.net/projects/ravencore/">RavenCore&lt;/a> 0.2.3.&lt;/p></description><summary>RavenCore documentation for Debian &amp;amp; Ubuntu</summary></item><item><title>RavenCore 0.2.3 on Debian and Ubuntu</title><link>https://wimpysworld.com/posts/ravencore-0.2.3-on-debian-and-ubuntu/</link><pubDate>Thu, 17 Aug 2006 10:53:53 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/ravencore-0.2.3-on-debian-and-ubuntu/</guid><description>&lt;p>I have updated my HOW-TO for installing &lt;a href="http://sourceforge.net/projects/ravencore/">RavenCore&lt;/a>
on Debian (at the request of the RavenCore developer) and added a HOW-TO for
installing RavenCore on Ubuntu. The are still some minor compatibility issues
with Debian and Ubuntu and these HOW-TOs have been sent to the RavenCore
developer to help document the outstanding incompatibilities.&lt;/p></description><summary>Updated Debian &amp;amp; Ubuntu documentation for RavenCore</summary></item><item><title>Comments off, Overdue update and R3-born</title><link>https://wimpysworld.com/posts/comments-off-overdue-update-and-r3-born/</link><pubDate>Tue, 04 Jul 2006 13:14:55 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/comments-off-overdue-update-and-r3-born/</guid><description>&lt;p>First of all, I have disabled comments on my blog. &lt;a href="http://jaws-project.com/">Jaws&lt;/a>
has spam protection and captachs but both implementations suck. This site doesn&amp;rsquo;t
generate much feedback so disabling comments altogether is not really a problem.
I haven&amp;rsquo;t updated the site recently and here is why. The 0.6.x release of Jaws
is buggy and I still haven&amp;rsquo;t found anything else which fully meets my needs for
managing my own web content.&lt;/p>
&lt;p>Therefore for the last couple of months I have been working on an open source
CMS of my own called R3-born. More details to follow about that soon, but you
can find the project over at Sourceforge, don&amp;rsquo;t expect anything to work
(although it does for the most part) it is pre-alpha and unreleased. SVN is the
only way to snag the source.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.sourceforge.net/projects/r3-born/">R3-born&lt;/a>&lt;/li>
&lt;/ul></description><summary>Jaws spam counter measures suck</summary></item><item><title>RavenCore 0.1.5 on Debian</title><link>https://wimpysworld.com/posts/ravencore-0.1.5-on-debian/</link><pubDate>Sat, 29 Apr 2006 19:18:15 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/ravencore-0.1.5-on-debian/</guid><description>&lt;p>I have updated my HOW-TO for installing &lt;a href="http://sourceforge.net/projects/ravencore/">RavenCore&lt;/a>
0.1.5 on Debian. I&amp;rsquo;m pleased to report that the RavenCore developer has been
very responsive to my feedback and has significantly improved &amp;ldquo;out of the box&amp;rdquo;
Debian compatibility in this release. The are still some minor compatibility
issues and I&amp;rsquo;ve&amp;rsquo; sent feedback to the developer in the hope that things will
continue to improve with RavenCore 0.1.6.&lt;/p></description><summary>New RavenCore. New documentation for Debian users</summary></item><item><title>Project Minerva is coming home</title><link>https://wimpysworld.com/posts/project-minerva-is-coming-home/</link><pubDate>Wed, 26 Apr 2006 17:42:11 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/project-minerva-is-coming-home/</guid><description>&lt;p>Despite a generous offer from a Minerva enthusiast a year or so ago to freely
host the Project Minerva sites, all the Project Minerva hosting is coming back
to where it started and rightly belongs. Yes, right here with me. It just
goes to show you really don&amp;rsquo;t get anything for free. The developers have had
several outages with the server which was provided by SpiderTech Hosting, so
we are bringing it back here where we can look after our interests directly.&lt;/p>
&lt;p>Minerva users might be wondering if the fact I am fully hosting Project
Minerva again means I am going to be developing for the project again. Well,
we will just have to see but I did inform Chris of a little project I kicked
off last week which may (or may not) lead to something.&lt;/p></description><summary>It&amp;rsquo;s coming home. Minerva is coming home.</summary></item><item><title>Today I have been mostly lovin' Munin</title><link>https://wimpysworld.com/posts/today-i-have-been-mostly-lovin-munin/</link><pubDate>Fri, 07 Apr 2006 17:00:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/today-i-have-been-mostly-lovin-munin/</guid><description>&lt;p>Here&amp;rsquo;s the blurb from the authors&amp;hellip; &lt;a href="http://munin.projects.linpro.no/">Munin&lt;/a>
surveys all your computers and remembers what it saw. It presents all the
information in in graphs through a web interface. Its emphasis is on plug and
play capabilities. After completing a installation a high number of monitoring
plugins will be playing with no more effort. Using Munin you can easily
monitor the performance of your computers, networks, SANs, and quite possibly
applications as well. It makes it easy to determine &amp;ldquo;what&amp;rsquo;s different today&amp;rdquo;
when a performance problem crops up. It makes it easy to see how you&amp;rsquo;re doing
capacity wise on all limited resources.&lt;/p></description><summary>Munin offers simple system monitoring graphs</summary></item><item><title>I am a winner!</title><link>https://wimpysworld.com/posts/i-am-a-winner/</link><pubDate>Tue, 04 Apr 2006 16:00:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/i-am-a-winner/</guid><description>&lt;p>Yah for me! I have won the &lt;a href="http://sourceforge.net/projects/ravencore/">RavenCore&lt;/a>
documentation contest.&lt;/p></description><summary>Winner winner chicken dinner!</summary></item><item><title>Flexion.Org Server Migrated</title><link>https://wimpysworld.com/posts/flexion.org-server-migrated/</link><pubDate>Tue, 04 Apr 2006 15:20:29 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/flexion.org-server-migrated/</guid><description>&lt;p>Today Flexion.Org was successfully migrated to a new server. I&amp;rsquo;ve been using
the same shared host for over 7 years but these days I really need much better
control over my server, mostly for spam/virus protection of e-mail but also to
ensure that periodic upgrades don&amp;rsquo;t screw up my website.&lt;/p>
&lt;p>So this time I opted for a virtual dedicated server and I had a choice of all
the popular Linux distros, which I can re-install via a web interface at will
in a few seconds. I choose. If you are looking for a low cost virtual dedicated
server then take a look at &lt;a href="http://www.quantact.com">Quantact&lt;/a>.&lt;/p></description><summary>After 7 shared on a shared host it&amp;rsquo;s time for a VPS</summary></item><item><title>RavenCore 0.1.4 on Debian</title><link>https://wimpysworld.com/posts/ravencore-0.1.4-on-debian/</link><pubDate>Wed, 22 Mar 2006 18:02:05 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/ravencore-0.1.4-on-debian/</guid><description>&lt;p>I set up my new server to use &lt;a href="http://sourceforge.net/projects/ravencore/">RavenCore&lt;/a>
so that managing my domains and e-mail accounts for friends and family will be
as easy as possible. RavenCore is designed for use on CentOS primarily and
therefore RavenCore 0.1.4 requires some tweaking in order to get it fully
working and compatible with Debian.&lt;/p>
&lt;p>I have been sharing my feedback with the RavenCore author and when RavenCore
0.1.5 is released &amp;ldquo;out of the box&amp;rdquo; Debian compatibility should be a reality.&lt;/p></description><summary>Managing virtual hosting on Debian with RavenCore</summary></item><item><title>Portable app</title><link>https://wimpysworld.com/posts/portable-app/</link><pubDate>Thu, 09 Mar 2006 05:40:07 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/portable-app/</guid><description>&lt;p>I started a new job last week, I am contracting for the first time. I needed
some applications installed on my desktop at work, but to do so would not be
permitted as part of my clients standard build policies.&lt;/p>
&lt;p>So I started making a USB disk with the tools I needed and in doing do I found
the &lt;a href="http://portableapps.com/">Portableapp&lt;/a> and &lt;a href="http://www.portablefreeware.com/">The Portable Freeware Collection&lt;/a>
websites which ease the process no end.&lt;/p>
&lt;p>A portable app is a computer program that you can carry around with you on a
portable device and use on any Windows computer. When your USB thumb drive,
portable hard drive, iPod or other portable device is plugged in, you have
access to your software and personal data just as you would on your own PC. And
when you unplug, none of your personal data is left behind.&lt;/p></description><summary>Working around corporate Windows policies with Portable Apps</summary></item><item><title>Slimlining Windows XP with nLite and XPLite</title><link>https://wimpysworld.com/posts/slimlining-windows-xp-with-nlite-and-xplite/</link><pubDate>Sun, 05 Mar 2006 06:41:38 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/slimlining-windows-xp-with-nlite-and-xplite/</guid><description>&lt;p>A shocking truth is that despite my preference for Linux I do still have to
use Microsoft Windows/ I have recently started a new job where I am now
required to use Windows XP on my desktop at work and I also need a Windows
computer at home in order to update firmware/software and configure most
devices in my home cinema.&lt;/p>
&lt;p>So I have decided to install Windows XP on my most aging of laptops so it is
always available for my home cinema tweaking, this also means I can remove dual
boot Windows partitions on my main computer. However, because my old laptop is a
bit short on memory I need to tweak Windows XP a good deal. I have been a long
time user of 98Lite and XPLite from &lt;a href="http://www.litepc.com">LitePC.om&lt;/a> and have
been slim lining Windows for many years. I have recently found &lt;a href="http://www.nliteos.com">nLite&lt;/a>
which does much the same as XPLite except it rebuilds the Windows XP (or Windows 2000 and
Windows 2003) installation CD so that the configuration changes you make, and
Windows components you remove, are ingrained in a new ISO image.&lt;/p>
&lt;p>The biggest benefit is that using nLite I can integrate Service Pack 2 and all
the current hotfixes and patches into the new ISO meaning that after an install
the new Windows system is better secured. I have also been able to integrate Firefox
into my custom Windows XP install CD and completely remove Internet Explorer,
and by using the &lt;a href="http://windowsupdate.62nds.com/">WindizUpdate&lt;/a> it is possible
to do online Windows Updates using Firefox, Opera and K-Meleon.&lt;/p>
&lt;p>There are also many other benefits to using nLite other than simply removing or
adding software components, you can also pre-configure just about every aspect
of the Windows environment and nLite will wrap all this into an unattended
installation ISO image. My custom Windows XP install CD I made with nLite is
just 145mb!&lt;/p></description><summary>Trimming the Windows fat with nLite</summary></item><item><title>NetworkManager and Ubuntu Dapper Drake 6.04</title><link>https://wimpysworld.com/posts/networkmanager-and-ubuntu-dapper-drake-6.04/</link><pubDate>Thu, 02 Mar 2006 11:26:39 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/networkmanager-and-ubuntu-dapper-drake-6.04/</guid><description>&lt;p>A week or so ago the
&lt;a href="http://www.gnome.org/projects/NetworkManager/">NetworkManager&lt;/a> package was
changed so that &lt;code>nm-applet&lt;/code> (the system tray application) was separated into
it&amp;rsquo;s own package. After I updated and installed &lt;code>nm-applet&lt;/code>, I noticed that it
didn&amp;rsquo;t startup anymore. I didn&amp;rsquo;t have time to investigate until this morning and
found the answer in the following forum posting&amp;hellip;&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.ubuntuforums.org/showthread.php?t=134251">NetworkManager broken after last update&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Here is the pearl of wisdom, from that forum discussion, that helped me make
my system to be NetworkManager compatible again.&lt;/p>
&lt;p>&lt;em>&amp;ldquo;Network Manager has been installed on your system, however it will not
immediately be able to manage your network interfaces. To avoid problems with
important configuration being ignored, or strange behaviours, the Ubuntu version
will not manage any network interface configured in the /etc/network/interfaces file.&lt;/em>&lt;/p>
&lt;p>&lt;em>To allow interfaces to be managed with Network Manager either edit the
/etc/network/interfaces file and remove (or comment out) the &amp;ldquo;auto&amp;rdquo; and &amp;ldquo;iface&amp;rdquo;
lines for those interfaces you wish it to manage, or use the &amp;ldquo;Networking&amp;rdquo;
administration tool (found under the &amp;ldquo;System&amp;rdquo; menu) to disable the interfaces.&amp;rdquo;&lt;/em>&lt;/p></description><summary>Fixing NetworkManager applet on Ubuntu 6.04</summary></item><item><title>Long weekend in Dublin</title><link>https://wimpysworld.com/posts/long-weekend-in-dublin/</link><pubDate>Mon, 27 Feb 2006 09:57:32 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/long-weekend-in-dublin/</guid><description>&lt;p>We just got back from an enjoyable trip to Dublin, highlights for me were
visits to the&amp;hellip;&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.guinnessstorehouse.com/home/home.asp">Guinness Storehouse&lt;/a> for a history lesson and a drop of the black stuff.&lt;/li>
&lt;li>&lt;a href="http://www.whiskeytours.ie/dublin/dubhistoryn.html">The Old Jameson Distillery&lt;/a> for another history lesson and a drop of the hard stuff, I also certified as an Irish Whiskey taster during the visit. I have a certificate and everything :-)&lt;/li>
&lt;li>&lt;a href="http://www.boxtyhouse.ie/default.htm">Gallagher&amp;rsquo;s Boxty House&lt;/a> for some traditional Irish grub.&lt;/li>
&lt;li>&lt;a href="http://www.ryanair.com/site/EN/">Ryanair&amp;rsquo;s&lt;/a> ticket prices, just 10p return each!&lt;/li>
&lt;/ul>
&lt;p>This was our first visit to Ireland and I am looking forward to going back again
soon and maybe incorporate some diving.&lt;/p></description><summary>Flying to Dublin for 10p to drink Guinness &amp;amp; Jameson Whiskey</summary></item><item><title>DVD Box Sets - Extended Film Watching Session is Coming</title><link>https://wimpysworld.com/posts/dvd-box-sets-extended-film-watching-session-is-coming/</link><pubDate>Wed, 15 Feb 2006 12:25:47 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/dvd-box-sets-extended-film-watching-session-is-coming/</guid><description>&lt;p>Today I finally got around to ordering some stuff from Amazon.co.uk using the
vouchers I was given as present at Christmas. I have ordered The Matrix
Trilogy and The Lord of the Rings Trilogy (Extended Edition Box Set) which I
hope arrive before the weekend as my wife is away for a few days which should be
enough time to get through both box sets 😄&lt;/p></description><summary>Planning some DVD binge viewing</summary></item><item><title>New Mountain Bike</title><link>https://wimpysworld.com/posts/new-mountain-bike/</link><pubDate>Tue, 14 Feb 2006 12:49:30 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/new-mountain-bike/</guid><description>&lt;p>I finally convinced my wife that I need (really wanted) a new mountain
bike and today I took delivery of the &lt;a href="http://www.trekbikes.com/uk/en/bikes/2006/archive/4300disc">Trek 4300 Disc 2006 model&lt;/a>&lt;/p>
&lt;p>I managed to fall off it on the maiden voyage but I thought it best to get that
out that way before I tackle to Bracknell Woods this coming Sunday.&lt;/p></description><summary>A new bike to tackle those mountains</summary></item><item><title>Cheap and Cheerful MP3 Player</title><link>https://wimpysworld.com/posts/cheap-and-cheerful-mp3-player/</link><pubDate>Fri, 10 Feb 2006 13:00:10 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/cheap-and-cheerful-mp3-player/</guid><description>&lt;p>My six year old MP3 player just isn&amp;rsquo;t up to the job anymore and I have been
looking for an alternative, on and off, over that last few weeks. Ideally I
would have liked a portable music player that supported Ogg Vorbis but as my
home cinema isn&amp;rsquo;t Ogg Vorbis compatible I decided to standardize on MP3. No
flames please!&lt;/p>
&lt;p>I have lots of MMC and SD memory cards that I have collected over the years so
decided get a player which could make use of them. I only need a player for use
in the gym and while cycling so it doesn&amp;rsquo;t need to be too fancy, with that in
mind I decided to get the &lt;a href="http://www.amazon.co.uk/Sumvision-Snowfox-XT105-Portable-Playback/dp/B000F9TD1S">Sumvision XT105 MP3 Player&lt;/a>
which is super cheap and surprisingly good considering the price &lt;code>:-)&lt;/code>&lt;/p>
&lt;p>Initial impressions are that the manual was obviously translated from Chinese to
English using Google, the included headphones are not much cop. That said,
once you plug-in a decent set of head phones the sound reproduction is very good
and more than good enough for what I want it for and although playlists aren&amp;rsquo;t
supported playback by folder is. That player is very light and very small, so
ideal for use in the gym and battery life is around 10-12 hours from a single
AAA battery. It is also Linux compatible, although I have been using a USB
card reader to populate my memory cards with MP3s as the XT105 is only USB 1.1
and therefore a bit slow. I am off to the gym now with some banging tunes.&lt;/p></description><summary>Cheap as chips MP3 player upgrade</summary></item><item><title>Panasonic Plasma Black Level Fluctuation Fix</title><link>https://wimpysworld.com/posts/panasonic-plasma-black-level-fluctuation-fix/</link><pubDate>Fri, 10 Feb 2006 02:48:54 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/panasonic-plasma-black-level-fluctuation-fix/</guid><description>&lt;p>I&amp;rsquo;ve noticed that the contrast levels on my Panasonic TH42-PHD8 plasma will
suddenly increase during dark scenes and then drop back down to normal a
fraction of a second later. This can be most distracting but as it only
happens once or twice a week it hasn&amp;rsquo;t really bothered me. But, I found a
discussion at AVForums which describes how to enter the plasma service menu
and fix this behaviour. I&amp;rsquo;m pleased to say it works perfectly. Here&amp;rsquo;s the
solution:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.avforums.com/forums/showthread.php?t=286137">Panasonic Black Shift Problem/Solution&lt;/a>&lt;/li>
&lt;/ul></description><summary>Using service menus to fix the Panasonic TH42-PHD8</summary></item><item><title>The honeymoon is over</title><link>https://wimpysworld.com/posts/the-honeymoon-is-over/</link><pubDate>Fri, 03 Feb 2006 11:43:06 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/the-honeymoon-is-over/</guid><description>&lt;p>Despite my glowing comments about &lt;a href="http://fedoraproject.org/">Fedora&lt;/a> a couple
of weeks back, the honeymoon period is well and truly over. My biggest gripe
with Fedora is even with numerous compatible repositories enabled there isn&amp;rsquo;t a
suitable selection of packages available and dependency breakage is all too
frequent.&lt;/p>
&lt;p>Although I can build my own packages from source I just don&amp;rsquo;t have the time
(or inclination) for that anymore. I do really like the Early Logon feature and
the working NetworkManager in Fedora, but sadly these features are not enough to
keep me away from Ubuntu. As a result I have just finished migrating all my
computers to Ubuntu Dapper Drake 6.04 - Flight 3, which is shaping up to be
another excellent release. Matt Galvin has been doing a great job of tracking
the new features in each of the Dapper Flight pre-releases, see the Wiki entries
below&amp;hellip;&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://wiki.ubuntu.com/DapperFlight2">https://wiki.ubuntu.com/DapperFlight2&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://wiki.ubuntu.com/DapperFlight3">https://wiki.ubuntu.com/DapperFlight3&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://wiki.ubuntu.com/DapperFlight4">https://wiki.ubuntu.com/DapperFlight4&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Having spent 6 weeks using Fedora I have decided that I have learnt enough
about it to conclude it just isn&amp;rsquo;t for me and I will be seeing out the rest of
2006 using Ubuntu as my desktop OS. However, I will dabble with other distros
periodically.&lt;/p></description><summary>Ditching Fedora and sticking with Ubuntu</summary></item><item><title>Leading edge Fedora Core 4</title><link>https://wimpysworld.com/posts/leading-edge-fedora-core-4/</link><pubDate>Sat, 14 Jan 2006 11:32:31 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/leading-edge-fedora-core-4/</guid><description>&lt;p>Having spent all of 2005 using &lt;a href="http://www.ubuntu.com">Ubuntu&lt;/a> I have learnt a
lot about &lt;a href="http://www.debian.org">Debian&lt;/a> and even started using Debian for my
servers.&lt;/p>
&lt;p>Despite using Linux for over 10 years I had never previously used Debian and had
even avoided using it. I was surprised by how much I liked using Ubuntu and
Debian and decided that I give &lt;a href="http://fedoraproject.org/">Fedora&lt;/a> another try
as I have never warmed to &lt;a href="http://www.redhat.com/">redhat&lt;/a> in the same way I had
never previously warmed to Debian. For the longest time I used &lt;a href="http://www.slackware.com/">Slackware&lt;/a>
and then switched to &lt;a href="http://crux.nu/">Crux&lt;/a>.&lt;/p>
&lt;p>This week I have installed Fedora Core 4 on my home computer and been hugely
impressed, but this is mostly down to finding the nrpms.net repository. I was
already using the RPMforge.net group of repositories and nrpms.net is striving
for RPMforge compatibility, so far I haven&amp;rsquo;t experienced any package or
dependency breakage so they must be doing something right. Thanks to nrpms.net
I have effortlessly upgraded FC4 to GNOME 2.12.1, Firefox 1.5, mono 1.1.12 plus
numerous other GNOME applications I regularly use which aren&amp;rsquo;t available
elsewhere. The real bonus was to get NetworkManager 0.5.1 from nrpms.net which
actually works, and works reliably!&lt;/p>
&lt;p>As a result, this is a Linux distribution I can install on my wifes laptop
without fear of reprisals. I have found that installing proprietary
hardware drivers and software has been much simpler for Fedora than Ubuntu,
most notable are VMWare Player, Linuxant HSF modem drivers, ATI drivers, Opera
and Skype.&lt;/p>
&lt;p>I have been able to get my Smartphone and PocketPC working under Ubuntu
the amount of tweaking and constant manual intervention is cumbersome. So I
was staggered when after installing the SynCE packages on Fedora both devices
just worked when connected via USB, the whole process was completely seamless.&lt;/p>
&lt;p>So, after a few days tinkering I have everything I need installed, configured
and working reliably. Fedora is not perfect thought, &lt;code>yum&lt;/code> is still lagging
behind &lt;code>apt&lt;/code> and even that even after enabling a number of the excellent 3rd
party repositories the number and variety of packages available
to FC4 isn&amp;rsquo;t that great. Installing software is just so slow, what the bloody
hell is &lt;code>yum&lt;/code> doing? Using &lt;code>yumex&lt;/code> is coma inducing and &lt;code>up2date&lt;/code> just doesn&amp;rsquo;t
work.&lt;/p>
&lt;p>That said, there is some work being done in these areas for FC5 so maybe
the gap will be closed on &lt;code>apt&lt;/code> a little in the coming months. I do like the
fact that the official Fedora repositories update packages past the
final release date, something which Ubuntu doesn&amp;rsquo;t do. This means that on my
first &lt;code>yum update&lt;/code> OpenOffice was upgrade from 1.9.140 Beta to 2.0.1 final and
many other essential applications were also upgraded. Just when I thought it
couldn&amp;rsquo;t get any better I discovered the &amp;ldquo;Early Login&amp;rdquo; feature which is new to
Fedora Core 4. It is simply brilliant and I can not get from power button to
GNOME desktop in 20 seconds. I so wanted to not like Fedora but I have to say
I think I might be converted. I will have to see how long this enthusiasm for
Fedora will last, but I am already looking forward to FC5.&lt;/p></description><summary>Taking a look at Fedora Core 4</summary></item><item><title>Powerbook G3 (Old World) Ubuntu Install</title><link>https://wimpysworld.com/posts/powerbook-g3-old-world-ubuntu-install/</link><pubDate>Mon, 09 Jan 2006 11:28:54 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/powerbook-g3-old-world-ubuntu-install/</guid><description>&lt;p>James bought a PowerBook G3 to the January 2006 &lt;a href="http://www.hants.lug.org.uk/">HantsLUG&lt;/a>
meeting and wanted to have Ubuntu installed on it. I used to be familiar with
Apple Mac computers in the mid to late 90&amp;rsquo;s because the company I worked for used
Macs exclusively on the desktop, so I decided to give it a whirl.&lt;/p>
&lt;p>The bottom line is that this old PowerBook G3 is now running Ubuntu Hoary 5.04
quite happily and I will soon be phone James to arrange for him to pick up his
computer.&lt;/p>
&lt;p>The article is largely based on the &lt;a href="https://wiki.ubuntu.com/Installation/OldWorldMacs">OldWorldsMac Ubuntu Wiki&lt;/a>,
I have included the specifics of James setup here so he has a record of how his
computer was configured.&lt;/p>
&lt;p>I quickly realised that simply inserting the Ubuntu Hoary 5.04 PowerPC install
CD and rebooting while holding down the &amp;lsquo;C&amp;rsquo; key wasn&amp;rsquo;t going to work. It seems
that James computer is old enough to be a right pain in the arse to get working
with Linux, but that just makes me want to get it working all the more &lt;code>:-)&lt;/code>&lt;/p>
&lt;p>By the end of the HantsLUG meeting Ubuntu Hoary 5.04 was just completing the
final setup steps and would have been ready to use, but someone pulled the power
block out of the mains and James battery is dead, so the computer shutdown &lt;code>:-(&lt;/code>
I took the PowerBook G3 home with me to fix/complete the installation but when
I got home I decided to download Ubuntu Breezy and install that instead. Sadly,
James PowerBook only has a 2GB hard disk (1.9GB available for Linux) and this
wasn&amp;rsquo;t sufficient for the Breezy installation to complete so I reverted to Hoary.&lt;/p>
&lt;h2 id="identifying-the-powerbook-g3">Identifying the PowerBook G3&lt;/h2>
&lt;p>After some Googling I soon discovered that there are two classes of PowerBook G3,
OldWorld and NewWorld, and that each of the classes have a number of slightly
different models in the range. I took a guess that James was an OldWorld
PowerBook based on the fact it had no USB ports. It turns out this was a good
guess.&lt;/p>
&lt;p>Making the assumption that James PowerBook was OldWorld meant that I should use
&lt;a href="http://penguinppc.org/bootloaders/bootx/">BootX&lt;/a> to boot into Linux from MacOS
as opposed to using yaboot which is for NewWorld PowerPCs.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://docs.info.apple.com/article.html?artnum=24604">PowerBook G3 Computers: How to Identify Different Models&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="doing-the-macos-installation">Doing the MacOS Installation&lt;/h2>
&lt;p>The first job was to erase the hard disk and install MacOS in a small parition
and leave the rest of the drive unallocated for installing Ubuntu later on.&lt;/p>
&lt;ul>
&lt;li>Insert MacOS 8.1 CD&lt;/li>
&lt;li>Reboot&lt;/li>
&lt;li>Hold down &amp;lsquo;C&amp;rsquo; as the computer boots to get it to boot from CD&lt;/li>
&lt;li>Erase the Hard Disk&lt;/li>
&lt;li>Use Drive Setup to make a 150MB HFS partition.&lt;/li>
&lt;li>Install MacOS, leaving off all the optional components. The only thing you need is Stuffit and a browser which are both part of the minimal MacOS8.1 install.&lt;/li>
&lt;/ul>
&lt;p>After the install I delete some odds and ends I didn&amp;rsquo;t need and also used
Extensions Manager to deselect a lot of components that were not required.
Finally, I configured TCP/IP to use DHCP.&lt;/p>
&lt;h3 id="tools-update">Tools Update&lt;/h3>
&lt;p>James wanted to be able to use MacOS for basic web surfing, so that meant
finding an more modern alternative to Netscape 3.0.3 which was installed be
default. Sadly The only (relatively) upto date browser I could find which would
install on MacOS 8.1 was Internet Explorer 5.1.7. I also needed an updated
version of Stuffit Expander to extract BootX 1.2.2. I used Netscape 3.0.3 to
download IE and Stuffit from the URL&amp;rsquo;s below&amp;hellip;&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.microsoft.com/mac/downloads.aspx?pid=download&amp;amp;location=/mac/DOWNLOAD/IE/ie5_classic.xml&amp;amp;secid=30&amp;amp;ssid=11&amp;amp;flgnosysreq=True">Internet Explorer 5.1.7 for Mac OS 8.1 to 9.x&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.sfsu.edu/ftp/mac/utils/aladdin_exp55.hqx">Stuffit Expander 5.5 for MacOS Classic&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>&amp;hellip;and installed them. Once they were working a deleted Netscpae 3.0.3 and the
old version of Stuffit.&lt;/p>
&lt;h2 id="bootx">BootX&lt;/h2>
&lt;p>Older versions of Stuffit will only extract BootX 1.1.3 which I why I updated
Stuffit Expander as explained earlier. Download BootX 1.2.2.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://penguinppc.org/bootloaders/bootx/">BootX&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Open it with Stuffit and extract it the the Desktop then open the resulting
BootX 1.2.2 folder on the desktop. Drag each of the following&amp;hellip;&lt;/p>
&lt;ul>
&lt;li>BootX&lt;/li>
&lt;li>BootX Extension&lt;/li>
&lt;li>Linux Kernels&lt;/li>
&lt;/ul>
&lt;p>&amp;hellip;onto the &amp;ldquo;System Folder&amp;rdquo; one at a time to install BootX correctly. Insert the
Ubuntu PPC install CD and navigate to the &lt;code>/install/powerpc&lt;/code> folder.&lt;/p>
&lt;ul>
&lt;li>Copy &lt;code>vmlinux&lt;/code> to (the Linux kernel) &lt;code>System Folder/Linux Kernels&lt;/code>&lt;/li>
&lt;li>Copy &lt;code>initrd.gz&lt;/code> (the init ramdisk image) to &lt;code>System Folder/&lt;/code> and rename it to &lt;code>ramdisk.image.gz&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>BootX should appear on the apple menu and also run on every reboot during the
boot process, meaning that you can choose to boot Linux without having to wait
for the entire MacOS to load &lt;code>:-)&lt;/code> When you run BootX it should show &amp;lsquo;vmlinux&amp;rsquo;
as an available kernel, now add the following to &amp;ldquo;More kernel arguments&amp;rdquo; to make
sure the correct video mode is used for Linux.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>video=atyfb:vmode:14,cmode:32,mclk:71
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Now click the &amp;ldquo;Options&amp;rdquo; button, check &amp;ldquo;Use Specified RAM disk&amp;rdquo; and select
&lt;code>System Folder/ramdisk.image.gz&lt;/code>. Click on the &amp;ldquo;Save to prefs&amp;rdquo; button and then
click on the &amp;ldquo;Linux&amp;rdquo; button and in a short while you should be looking at the
regular Ubuntu install dialogs.&lt;/p>
&lt;h3 id="other-video-mode-suggestions">Other Video Mode Suggestions&lt;/h3>
&lt;p>I didn&amp;rsquo;t test these, but my understanding is the &amp;lsquo;cmode&amp;rsquo; choose the bit depth 8
for 8bit, 16, for 16bit and so one. &amp;lsquo;mclk&amp;rsquo; controls the graphics/monitor refresh
rate I think, I was lucky that I the video mode suggested in the BootX README
worked first go.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>video=atyfb:vmode:14,cmode:32,mclk:65
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>video=atyfb:vmode:14,cmode:8,mclk:63
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="doing-the-ubuntu-installation">Doing the Ubuntu Installation&lt;/h2>
&lt;p>The installer will display an error message that &amp;ldquo;Configure a multiseat system&amp;rdquo;
failed. You can ignore this&amp;hellip;&lt;/p>
&lt;ul>
&lt;li>Select &amp;lsquo;Continue&amp;rsquo;&lt;/li>
&lt;li>Select &amp;lsquo;Detect Hardware&amp;rsquo; and press Enter&lt;/li>
&lt;/ul>
&lt;p>&amp;hellip;and the install will continue normally.&lt;/p>
&lt;h3 id="partitioning">Partitioning&lt;/h3>
&lt;p>When it gets to partitioning the drive Ubuntu will suggest using the entire disk
for Linux. Don&amp;rsquo;t do that because you still need MacOS to run BootX to bootstrap
Linux. Select the &amp;ldquo;Use Free Space&amp;rdquo; option or partition manually.&lt;/p>
&lt;h3 id="copying-boot-to-the-hfs-system-folder">Copying /boot to the HFS System Folder&lt;/h3>
&lt;p>The rest of the install is fairly straight forward until you get to the part
where Ubuntu tries to install a bootloader. GRUB and Lilo don&amp;rsquo;t work on OldWorld
Macs, so Ubuntu will warn you that no bootloader can be installed. Switch to a
second console at this point (Option-F2) and use &lt;code>df&lt;/code> to see where things are
currently mounted. In my case the newly installed ubuntu was on &lt;code>/dev/hda8&lt;/code>
mounted as &lt;code>/target&lt;/code> and the HFS filesystem was &lt;code>/dev/hda7&lt;/code>. Make a mountpoint
and mount the HFS filesystem.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cd /target
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>mkdir hfs
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>mount /dev/hda7 hfs -t hfs
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You might also want to add an entry to &lt;code>/etc/fstab&lt;/code> so it will be mounted when
you reboot. This makes updating kernels easier in the future.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>echo &lt;span style="color:#87ceeb">&amp;#39;/dev/hda7 /hfs hfs defaults&amp;#39;&lt;/span> &amp;gt;&amp;gt; etc/fstab
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Now copy the kernel and boot image over;&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cp boot/vmlinux hfs/System&lt;span style="color:#87ceeb">\ &lt;/span>Folder/Linux&lt;span style="color:#87ceeb">\ &lt;/span>Kernels/vmlinux
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cp boot/initrd.img hfs/System&lt;span style="color:#87ceeb">\ &lt;/span>Folder/ramdisk.image.gz
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Option-F1 to get back to the installer, and tell it to go ahead and reboot.&lt;/p>
&lt;p>When the machine reboots the BootX dialog should come up straight away, just
click &amp;ldquo;Linux&amp;rdquo; and Ubuntu should proceed through the rest of the install as usual.&lt;/p>
&lt;h4 id="references">References&lt;/h4>
&lt;ul>
&lt;li>&lt;a href="http://ubuntuforums.org/showthread.php?t=73689">http://ubuntuforums.org/showthread.php?t=73689&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://ubuntuforums.org/showthread.php?t=36431">http://ubuntuforums.org/showthread.php?t=36431&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://wiki.ubuntu.com/Installation/OldWorldMacs">https://wiki.ubuntu.com/Installation/OldWorldMacs&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://penguinppc.org/">http://penguinppc.org/&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://gonz.wordpress.com/2006/03/22/installing-ubuntu-510-breezy-badger-on-an-old-world-powerbook-g3-wallstreet/">http://gonz.wordpress.com/2006/03/22/installing-ubuntu-510-breezy-badger-on-an-old-world-powerbook-g3-wallstreet/&lt;/a>&lt;/li>
&lt;/ul></description><summary>Installing Ubuntu on a PowerBook G3 for hack value</summary></item><item><title>RavenCore 0.0.6 on Debian</title><link>https://wimpysworld.com/posts/ravencore-0.0.6-on-debian/</link><pubDate>Thu, 05 Jan 2006 11:24:41 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/ravencore-0.0.6-on-debian/</guid><description>&lt;p>I have been testing a few virtual hosting control panels the last couple of
days and I am deeply impressed with &lt;a href="http://sourceforge.net/projects/ravencore/">RavenCore&lt;/a>,
so much so I will most likely use it for a project I am planning. However,
Debian is my server distro of choice and RavenCore needs a little tweaking in
order to work seamlessly with Debian. I have been keeping some notes that
explain how to get RavenCore to play nicely with Debian.&lt;/p>
&lt;p>I have submitted my notes in the RavenCore Forums and agreed to assist the
author with any future testing to work toward better &amp;ldquo;out of the box&amp;rdquo; Debian
integration.&lt;/p></description><summary>Virtual hosting on Debian with RavenCore</summary></item><item><title>Ubuntu</title><link>https://wimpysworld.com/projects/ubuntu/</link><pubDate>Sun, 01 Jan 2006 00:00:00 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/projects/ubuntu/</guid><description>&lt;p>Ubuntu comes with everything you need to run your organisation, school, home or
enterprise. All the essential applications, like an office suite, browsers,
email and media apps come pre-installed.&lt;/p>
&lt;p>Community contributor since 2006, worked for Canonical from 2016 to 2021
progressing from software engineer to director of engineering. I remain active
in the Ubuntu community.&lt;/p>
&lt;ul>
&lt;li>Organisation: &lt;a href="https://ubuntu-mate.org">Ubuntu Project&lt;/a> &amp;amp; &lt;a href="https://canonical.com">Canonical&lt;/a>&lt;/li>
&lt;li>Date: January 2006 - date&lt;/li>
&lt;li>Role: Community contributor&lt;/li>
&lt;/ul></description><summary>From community contributor to director of engineering and back again</summary></item><item><title>Ubuntu Dapper Flight-2</title><link>https://wimpysworld.com/posts/ubuntu-dapper-flight-2/</link><pubDate>Thu, 22 Dec 2005 11:23:01 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/ubuntu-dapper-flight-2/</guid><description>&lt;p>I decided to install Ubuntu Dapper Flight-2 on a spare computer I had available.
There are not any obvious differences between Dapper and Breezy at this early
stage but one thing which does stand out is the performance improvements. My
test Dapper and stable Breezy computers are exactly the same specification and
the boot times for Dapper are vastly improved, currently 37 seconds (average)
faster from power on to GNOME desktop than with Breezy. The graphical boot menu
when booting from the install CD in a nice touch, I look forward to seeing how
Dapper improves over the coming months. But right now there isn&amp;rsquo;t anything
especially new, different or unusual to test.&lt;/p></description><summary>Ubuntu Dapper Drake is showing some performance improvements</summary></item><item><title>Ubuntu Backports and PLF Repositories</title><link>https://wimpysworld.com/posts/ubuntu-backports-and-plf-repositories/</link><pubDate>Wed, 21 Dec 2005 11:19:04 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/ubuntu-backports-and-plf-repositories/</guid><description>&lt;p>I haven&amp;rsquo;t been focusing on Linux during that last couple of months, I was a
bit distracted completing my home cinema installation and ever since I have
been watching a lot of films.&lt;/p>
&lt;p>However, I needed to get one of my laptops up to date for the Christmas holidays
and in doing so needed some packages from the Ubuntu Backports repository, which
led me to find the &lt;a href="http://plf.zarb.org/">Ubuntu Penguin Liberation Front&lt;/a>.&lt;/p>
&lt;p>The Ubuntu PLF is a team that builds packages that are patent encumbered or
proprietary. The PLF has been providing litigious packages for Mandriva for many
years and now they are doing the same thing for Ubuntu. Having added the Breezy
Backports and PLF repositories (just about) everything I consider essential for
my desktop needs is now apt-getable, yah!&lt;/p></description><summary>The Penguin Libration Front provide patent encumbered packages for Ubuntu</summary></item><item><title>PaceTwin USB Interface Modification</title><link>https://wimpysworld.com/posts/pacetwin-usb-interface-modification/</link><pubDate>Sat, 17 Dec 2005 11:17:14 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/pacetwin-usb-interface-modification/</guid><description>&lt;p>I had previously read on Yahoo Groups that a project was under way to retro
fit a USB interface to the PaceTwin PVR allowing for easy archiving of recorded
programs to a computer. Well, the guy who is planning the DIY upgrade has
setup a website which is documenting progress and also other useful PaceTwin
information. See the URL below for more information&amp;hellip;&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.pace-twin.org.uk">http://www.pace-twin.org.uk&lt;/a>&lt;/li>
&lt;/ul></description><summary>USB interface modification for the PaceTwin PVR</summary></item><item><title>Lumagen Video Processor Bug Fixed</title><link>https://wimpysworld.com/posts/lumagen-video-processor-bug-fixed/</link><pubDate>Mon, 12 Dec 2005 12:10:33 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/lumagen-video-processor-bug-fixed/</guid><description>&lt;p>I have been exchanging e-mails with the &lt;a href="http://www.convergent-av.co.uk">UK distributor&lt;/a>
for &lt;a href="http://www.lumagen.com">Lumagen&lt;/a> and the Lumagen engineering department.
Today is a happy day because I have just tested a pre-release firmware which
fully fixes the issues I&amp;rsquo;ve reported.&lt;/p>
&lt;p>Thanks very much to the engineers at Lumagen amd for their patience and hard work.
Truly excellent customer service! See my post in the Lumagen forums.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.convergent-av.co.uk/forum/index.php?t=msg&amp;amp;th=393&amp;amp;start=0&amp;amp;rid=0">UK DVB-T PAL De-interlacing Issues&lt;/a>&lt;/li>
&lt;/ul></description><summary>FPGA video processor bugs have been squashed</summary></item><item><title>Lumagen Video Processor Bug Hunting</title><link>https://wimpysworld.com/posts/lumagen-video-processor-bug-hunting/</link><pubDate>Tue, 22 Nov 2005 12:02:37 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/lumagen-video-processor-bug-hunting/</guid><description>&lt;p>I have spent the last few weeks tweaking and improving my home cinema setup,
most of my time has been spent learning how to fully exploit my
&lt;a href="http://www.lumagen.com">Lumagen&lt;/a> video processor. I am extremely impressed
with the huge improvements in image quality the &lt;a href="http://www.lumagen.com/testindex.php?module=dvi_details">Lumagen VisionDVI&lt;/a>
provides as opposed to sending video sources direct to the plasma screen, but something
isn&amp;rsquo;t right with the de-interlacing of DVB-T (or Freeview as we call it in the
UK). I have isolated the exact issue and posted a problem report in the
&lt;a href="http://www.convergent-av.co.uk/forum/index.php">Lumagen forums&lt;/a>.&lt;/p></description><summary>Hunting for bugs in an FPGA video processor</summary></item><item><title>Home Cinema is complete!</title><link>https://wimpysworld.com/posts/home-cinema-is-complete/</link><pubDate>Sat, 05 Nov 2005 11:52:46 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/home-cinema-is-complete/</guid><description>&lt;p>Tonight was a landmark occasion. After nearly two years of planning I finally
completed our home cinema. The last job was mounting the plasma screen. Apart
from hiding away some power cables it is complete and I can&amp;rsquo;t wait to get into
some serious film viewing. Mounting the plasma screen was not a job I was
looking forward as DIY is not my strong suit. But, I managed it and posted my
experiences in the topic below at AVForums.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.avforums.com/forums/showthread.php?t=259416">Mounting on dry-lined walls&lt;/a>&lt;/li>
&lt;/ul></description><summary>After 2 years of planning a home cinema appears</summary></item><item><title>First Prototype of my Linux PVR</title><link>https://wimpysworld.com/posts/first-prototype-of-my-linux-pvr/</link><pubDate>Tue, 11 Oct 2005 11:05:06 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/first-prototype-of-my-linux-pvr/</guid><description>&lt;p>I have built an initial prototype of a Linux based PVR using some (very) old
hardware I had available. I simply plugged in a new &lt;a href="http://www.hauppauge.co.uk/pages/products/data_novatpci.html">Hauppauge Nova-T
PCI&lt;/a> card and
hoped for the best. I got everything working but had to fudge things so that
over the air electronic program guide (EPG) can be imported into the MythTV
program guide database.&lt;/p>
&lt;p>This initial prototype uses &lt;a href="http://mysettopbox.tv/">KnoppMyth&lt;/a> Release 5A16 so
that I could get up to speed as quickly as possible but I plan on using Debian
or Ubuntu in the future.&lt;/p></description><summary>Building a prototype Linux PVR with KnoppMyth</summary></item><item><title>When Linux meets Home Cinema</title><link>https://wimpysworld.com/posts/when-linux-meets-home-cinema/</link><pubDate>Wed, 05 Oct 2005 11:02:43 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/when-linux-meets-home-cinema/</guid><description>&lt;p>I have started working on a new project at home, it is one I know I am going
to enjoy because it satisfies two of my hobbies. I am going to build a
prototype PVR based on &lt;a href="http://www.mythtv.org/">MythTV&lt;/a>.&lt;/p></description><summary>Combining my interests in Home Cinema &amp;amp; Linux</summary></item><item><title>Isles of Scilly</title><link>https://wimpysworld.com/posts/isles-of-scilly/</link><pubDate>Wed, 21 Sep 2005 10:31:09 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/isles-of-scilly/</guid><description>&lt;p>I arranged a surprise holiday to the &lt;a href="http://www.scillyonline.co.uk/index.php">Isles of Scilly&lt;/a>
for my wifes birthday and we got back a couple of days ago. What a fantastic place!&lt;/p>
&lt;p>We very much enjoyed our short time on the islands and will definately be going
back in the future, I think our enjoyment was also heightened by the fantastic
weather we had during our stay. One of the highlights of the trip was the &lt;a href="http://www.islesofscillyhelicopter.com/">helicopter
flights&lt;/a> to and from the islands,
which gives you some great views of the Cornish coast line and &lt;a href="http://www.landsend-landmark.co.uk/">Lands
End&lt;/a>. The Scilly Isles have a rich history
and this is slowly revealed as you visit each island and the attractions they
offer.&lt;/p>
&lt;p>The scenery is beautiful everywhere, but the &lt;a href="http://www.tresco.co.uk/the_abbey_garden/default.asp">Abbey Garden&lt;/a>
on &lt;a href="http://www.tresco.co.uk/">Tresco&lt;/a> is very impressive. A side from island
hoping and wandering around the island coastal pathways we also went out to see
some grey seals out on the rocks to the west of the islands. Other highlights
are the plentiful supply of &lt;em>real&lt;/em> &lt;a href="http://www.cornishlight.co.uk/cornish-pasty.htm">Cornish pasties&lt;/a>,
cream teas and ice cream. The food on the islands was very good and if you like
fish you are in for a treat. The views of the sunsets are lovely and best
accompanied with a pint of ale &lt;code>:-)&lt;/code>&lt;/p></description><summary>A surprise holiday in the Isles of Scilly</summary></item><item><title>Handheld Linux</title><link>https://wimpysworld.com/posts/handheld-linux/</link><pubDate>Mon, 12 Sep 2005 10:27:05 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/handheld-linux/</guid><description>&lt;p>I have replaced the disk in my Libretto CT100 with a 20GB disk I had going
spare and re-installed Debian Sarge 3.1, this time I didn&amp;rsquo;t bother with the
2.6 kernel or Xfce because I&amp;rsquo;ve had my fun with those now. But playing
around with Linux on my Libretto has re-kindled my interested in running Linux
on small portable devices.&lt;/p>
&lt;p>Earlier this year I experimented with &lt;a href="http://familiar.handhelds.org/">Familiar Linux&lt;/a>
0.8.2 on my iPAQ 3970 and installed via a serial cable, which was very slow
going. So I&amp;rsquo;ve invested in a 512MB Compact Flash card to speed up my next
round of tinkering with Familiar but this time I intend to leave Familiar
installed and not re-flash the 3970 with PocketPC 2002. The
&lt;a href="http://familiar.handhelds.org/releases/v0.8.2/install/index.html">Familiar v0.8.2 Installation&lt;/a>
guide covers pretty much everything you need to know about the installation
process.&lt;/p></description><summary>Craving a handheld Linux device</summary></item><item><title>Debian 3.1 on Libretto CT100</title><link>https://wimpysworld.com/posts/debian-3.1-on-libretto-ct100/</link><pubDate>Fri, 09 Sep 2005 10:26:14 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/debian-3.1-on-libretto-ct100/</guid><description>&lt;p>I decided to stick with the 2.1GB hard disk in the end, but in order to
complete the initial install I fitted it in an old IBM Thinkpad 600X. This
allowed me to boot off the Debian 3.1 Net Install CD and get a basic system
installed. Once that was done I fitted the hard disk back in the Libretto and
installed the essential bits and pieces I needed. I am feeling a lot of love
for &lt;code>apt-get&lt;/code> today.&lt;/p>
&lt;p>Then I got carried away. I upgraded to the 2.6 kernel, installed X and
Xfce 4.2.2. Then I migrated to the testing repositories, the upgrade for which
has finished a few minutes ago. I found Quentin Stafford-Fraser&amp;rsquo;s
&lt;a href="http://www.qandr.org/quentin/libretto/">Linux on the Libretto 100CT&lt;/a> page very
helpful in finding the right Modeline settings to get X going. I don&amp;rsquo;t really
need Xfce on the Libretto but I couldn&amp;rsquo;t resist getting it running. Despite the
low spec processor and just 64MB of RAM it runs very well, even Firefox is
usable. I might have to bring this box along to the next HantsLUG meeting.&lt;/p></description><summary>Running Xfce &amp;amp; Firefox on the Toshiba Libretto CT100</summary></item><item><title>Server crash! But I have the perfect replacement</title><link>https://wimpysworld.com/posts/server-crash-but-i-have-the-perfect-replacement/</link><pubDate>Fri, 09 Sep 2005 10:18:22 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/server-crash-but-i-have-the-perfect-replacement/</guid><description>&lt;p>The CPU fan on my home server stopped spinning, which has rendered the computer
unusable until I find the time to replace it. I have my workstation, so I can
keep working for the most part, but the services I was running on the server
are critical so I need a server replacement ASAP. I have decided to setup a
dedicated server for those services.&lt;/p>
&lt;p>I always knew my Libretto CT100 would come in handy someday. With 64MB RAM
and a Pentium 166mhz MMX CPU I think it will make an excellent server. Although
I may upgrade the hard disk from 2.1GB to 20GB. I am undecided which distro I&amp;rsquo;ll
install, probably Ubuntu 5.10 or Debian 3.1, but because the Libretto CT100
has weird hardware this install is not straight forward. The following web pages
seem to be the most useful to me right now:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.geocities.com/davissharonforest/">Installing Debian Linux 3.1 Sarge on Toshiba Libretto 50&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.redgrittybrick.org/linux/libretto.html">Installing RedHat Linux on a Toshiba Libretto 100CT&lt;/a>
&lt;ul>
&lt;li>Has good background information on the hardware and hibernation partition&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>There are several other installs documented on the &lt;a href="http://www.linux-on-laptops.com/toshiba.html">Linux on Toshiba Laptop and Notebook Computers&lt;/a> page.&lt;/p></description><summary>Running a Linux server on a Libretto CT100</summary></item><item><title>QEMU How-To Wiki Thingy</title><link>https://wimpysworld.com/posts/qemu-how-to-wiki-thingy/</link><pubDate>Mon, 05 Sep 2005 10:07:34 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/qemu-how-to-wiki-thingy/</guid><description>&lt;p>&lt;a href="http://use.perl.org/~ajt/journal/">Adam Tricket&lt;/a> got a few people interested
in &lt;a href="http://fabrice.bellard.free.fr/qemu/index.html">QEMU&lt;/a> at the HantsLUG
meeting on Saturday 3rd September 2005. Having recently discovered the wonders
of QEMU myself I couldn&amp;rsquo;t help but get involved in the conversation. Me and my
big mouth! I somehow managed to lumber myself with the job of writing a Wiki
page about QEMU for the HantsLUG website. The page is more or less useful
now and you can read it here&amp;hellip;&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.hants.lug.org.uk/cgi-bin/wiki.pl?LinuxHints/QemuEmulation">LinuxHints/QemuEmulation&lt;/a>&lt;/li>
&lt;/ul></description><summary>Sharing knowledge about QEMU via a Wiki</summary></item><item><title>Herb Garden</title><link>https://wimpysworld.com/posts/herb-garden/</link><pubDate>Sun, 04 Sep 2005 10:04:52 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/herb-garden/</guid><description>&lt;p>I finally got around to planting a small herb garden today, something I have
wanted to do ever since my wife and I designed the garden layout. The border
looks much better for being planted out but, once they are established, I
can&amp;rsquo;t wait to start harvesting my new crop 😄&lt;/p>
&lt;p>So far I have planted Chive, Mint, Basil, Red Basil, Thyme, Lavender, Oregano,
Sage, Rosemary and Parsley. I just need to add some Coriander.&lt;/p></description><summary>Planting out a herb garden</summary></item><item><title>Leaving Minerva</title><link>https://wimpysworld.com/posts/leaving-minerva/</link><pubDate>Thu, 01 Sep 2005 09:47:16 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/leaving-minerva/</guid><description>&lt;p>Yesterday was a sad day. I finally notified the core &lt;a href="http://sourceforge.net/projects/minerva/">Minerva&lt;/a>
developers that I am leaving the project. Given that I started the project a few
years back it was not a decision I made lightly.&lt;/p>
&lt;p>I have a couple of reasons for leaving the project, the main one being that I
just do not have the time available to effectively lead or contribute to the
project. All open source projects require good leadership and I haven&amp;rsquo;t been able
to provide that for most of 2005. It is with the best interests of Minerva in
mind that I decided to leave.&lt;/p>
&lt;p>However, Minerva is in very good hands and is under active development,
with Dave and Chris leading the effort. I wish all the Minerva developers and
users every success with the upcoming release of R4, it is a marvelous
achievement and I am sure will prove to be very successful. I will be
keeping an eye on R4 development, and if time permits, I may contribute some
blocks and modules in the future. Until then, good luck and make me proud!&lt;/p></description><summary>Standing down from the Minerva project</summary></item><item><title>'ere ear!</title><link>https://wimpysworld.com/posts/ere-ear/</link><pubDate>Wed, 24 Aug 2005 09:46:37 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/ere-ear/</guid><description>&lt;p>I picked up a pair of new earbuds yesterday. I decided on the
&lt;a href="https://www.cnet.com/reviews/sony-fontopia-mdr-ex71sl-review/">Sony MDR-EX71SL&lt;/a>
earbuds as all the reviews I have read have been very positive, and after
listening to a few of my favourite albums with them, I am also very impressed
with their performance. Due to their earbud design nearly all background noise
is eliminated meaning you can hear your music very clearly at lower volumes,
this good for preserving your hearing and also prevents you from annoying
people nearby with noise bleed from the headphones. Bass performance is
especially good and you get three different sizes silicon ear bud so everyone
should be able to get a comfortable fit, the smallest size is best for me. I
chose to get a black pair but the are also available in white for iPod owners.&lt;/p></description><summary>Sony MDR-EX71SL earbuds bring music to my ears</summary></item><item><title>Pocket Entertainment</title><link>https://wimpysworld.com/posts/pocket-entertainment/</link><pubDate>Mon, 22 Aug 2005 09:36:08 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/pocket-entertainment/</guid><description>&lt;p>I recently discovered &lt;a href="http://www.scummvm.org/">ScummVM&lt;/a> and have started playing
&lt;em>Zak McKracken and the Alien Mindbenders&lt;/em> for the first time in years! ScummVM
allows you to run certain classic graphical point-and-click adventure games,
provided you already have their data files, allowing you to play them on
systems for which they were never designed!&lt;/p>
&lt;p>So, I decided to organise my old adventure games for use with ScummVM so that I
can enjoy them all again, but this has led to a couple of eBay bids to buy some
games I am missing. I have used the ScummVM tools to compress as the game data
files so I can fit the games on my iPAQ 4150. Life is good. I have been thinking
of getting a new solid state Ogg Vorbis compatible portable music player but
haven&amp;rsquo;t found one which completely suits my needs. So, my iPAQ 4150 is now
standing in as my portable music player too. This is thanks too the excellent
GSPlayer. I have configured my iPAQ 4150 to be a full time entertainment device.&lt;/p>
&lt;p>I am off to get myself a decent set of head phones today, more on that later&amp;hellip;&lt;/p></description><summary>Using an iPAQ 4150 PocketPC for games &amp;amp; music</summary></item><item><title>Introducing Stanley, a new theme for Jaws</title><link>https://wimpysworld.com/posts/introducing-stanley-a-new-theme-for-jaws/</link><pubDate>Fri, 12 Aug 2005 09:29:53 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/introducing-stanley-a-new-theme-for-jaws/</guid><description>&lt;p>I&amp;rsquo;ve finished hacking together a new theme for &lt;a href="http://jaws-project.com/">Jaws&lt;/a>
0.5.x, which I have named Stanley, and is now the default theme on this site.
I&amp;rsquo;ve still got to fix a couple of bugs and make sure that it is compatible with
browsers other than Firefox. I wanted a theme which was crisp and clean, but
also fully compatible with Jaws, so I decided to blend some of my favourite
themes together. Stanley is inspired by the Kubrick theme which is popular among
bloggers and although the Kubrick graphics have been borrowed the style sheet
and layout are derived from the &lt;code>jaws&lt;/code>, &lt;code>orange-grey&lt;/code> and &lt;code>simple-green&lt;/code>
themes which are bundled with Jaws. As a result Stanley is properly Jaws
compatible, in that left and right layouts work, all the CSS elements are
supported and CSS tweaks are used throughout to improve the visual appeal.&lt;/p></description><summary>A new theme for Jaws called Stanley</summary></item><item><title>Basic site layout complete</title><link>https://wimpysworld.com/posts/basic-site-layout-complete/</link><pubDate>Mon, 08 Aug 2005 09:27:44 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/basic-site-layout-complete/</guid><description>&lt;p>After fiddling around with the &lt;a href="http://jaws-project.com/">Jaws&lt;/a> setup for a while
I have finally settled on something which I&amp;rsquo;m happy with. Once I found the
&lt;code>default_page&lt;/code> setting in the registry I was very happy. I&amp;rsquo;ll enable more
gadgets (plugins) as I find a use for them, but my next task will probably be
creating my own theme or at least combining ideas from several existing themes.&lt;/p></description><summary>Website look and feel with Jaws</summary></item><item><title>Grrr, a site with teeth</title><link>https://wimpysworld.com/posts/grrr-a-site-with-teeth/</link><pubDate>Fri, 05 Aug 2005 09:10:10 +0000</pubDate><author>martin@wimpress.com (Martin Wimpress)</author><guid>https://wimpysworld.com/posts/grrr-a-site-with-teeth/</guid><description>&lt;p>Well, I have decided to get Flexion.Org on-line again and picked &lt;a href="http://jaws-project.com/">Jaws&lt;/a>
as the tool for the job. This might seem an odd choice considering I have been
working on Minerva for the last 3 years, but there you are, life is strange.&lt;/p></description><summary>Rebooting Flexion.Org using Jaws</summary></item></channel></rss>