Oct 092018

Again with the casual breakage! For whatever reason(s) my openmediavault installation decided that it did not want to accept the addition of new shared folders. Yep, the disks are good (well a couple of SMART errors on the spinning rust, but nothing unexpected), everything is updated and yet…


Troubleshooting was non-obvious, so the simple thing to do was to destroy and start again, to “nuke and repave”.

Get OMV Arrakis and install


Use Etcher to burn ISO to USB, and install ISOfollowing onscreen instructions. Make note of IP4 addr from installation.


From webgui… 0

usr: admin
pswd: openmediavault

  • change passwords, ssh port, httpd port
  • add “network” user

Install OMV extras plugin

$ ssh networkdude@
# sudo apt update && sudo apt upgrade
# wget -O – http://omv-extras.org/install | bash
# apt-get install python-pip
# pip install python-magic

From webgui… 1

  • mount filesystems under
    File Systems


  • add shares under
    Shared Folders


  • add Shared Folders under

    for network discovery. Everything allos “guest” except root directory.

  • under

    set up scheduled copy of WDR4TB-UK to WDR4TB-USthe two Western Digital Red drives in the system (system drive is a ca, 160GB Hitachi SSD). No fancy RAIDing or shit. Just one media drive backed up to another.

  • install Docker CE
  • from Docker install
    • Emby (plex replacement)
    • LazyLibrarian
    • Headphones
    • ¿¿ Nextcloud ?? (already have this on a VPS, but…)
    • ¿¿ Pihole ?? (already have this on a rasp-pi, but for backup?)
    • ¿¿ Podcast server ?? — do I really want ot open up the network?
    • jupityer notebooks?
    • ¿¿ other docker awesomeness

Installing Docker apps/services all follows the same model. Confusing at first (esp if you do not read the docs), but pretty straightforward.  If you get one down the rest will slot nicely into place.

SO… the settings for lazylib:



With PGID and PUID coming from

S id<span class="">networkdude</span>

,  group and user id respectively.

And the ress of the settigngs coming from info from the docker container…

<br /><br /><pre><code>docker create \
  --name=lazylibrarian \
  -v <path to data>:/config \
  -v <path to data>:/downloads \
  -v <path to data>:/books \
  -e PGID=<gid> -e PUID=<uid>  \
  -e TZ=<timezone> \
  -p 5299:5299 \

Oct 062018

Machine crashed– well, hung– after [insert reason]. Age?
PS showed nothing, neither did “Activity Monitor”, and my googlefu must have been for /ʃaɪt/, since I found nothing there either.

After some digging around the usual directories… a lock file. Kill that, and we’re back in business.




May 052015

First L-sit on rings, May 5 2015.

TBH I am quite proud of this. Writing this as of Jul. 11, but sticking with the May date because, frankly, I have not improved by much in the interim… a couple more seconds maybe.

Sep 242014

So, I came across this site last night when scouting around for tools/sites that Eldest child might like to use as he gets to grips with programming, that is to do so without my necessarily having to hold his hand. The decisions I might make may or may not be reasonable or even appropriate. Better that he get a variety of experienced feedback from others (I will always be there), and in whatever language he chooses.

exercism.io is, essentially a community. Programming exercise sets, in numerous languages, are submitted and vetted by the community. One downloads these exercises, writes code, and submits waiting for feedback. It is not a learning environment per se, well not in the “instruct me” sense at least.

I find it fascinating because it is NOT based on a spiffy AJAXed-up website with its own editing environment and submit process. One installs a simple CLI tool, and uses that to download and submit to git. Submitted ruby code for calculating hamming distances in genetic sequences this AM to see how it all worked together, and it did. Flawlessly. I guess the downside is that one needs an environment set up on a machine, and a workflow, and #1 Son doesn’t have that yet. That, and I don’t think the problem sets would exactly tickle his curiosity.

There are several options for the CLI program install, one of which uses homebrew. I chose that, and in the process cleaned-up a three-plus-year-old-install of that.

Sep 072014

A man left to his three sons seventeen camels. 

To the first son, he left half the camels. To the second son, he left a third of the camels, and to the youngest son, he left a ninth of the camels. 

The three sons began to argue for seventeen doesn’t divide by two. It doesn’t divide by three. It doesn’t divide by nine. In desperation, they went and they consulted a wise woman. she thought about their problem for a long time, and finally said, “Here, you can have my camel.” 

So then they had eighteen camels. The first son took his half — half of eighteen is nine. The second son took his third — a third of eighteen is six. The youngest son took his ninth — a ninth of eighteen is two. 

That’s seventeen camels. The one camel they had left over they gave back to the wise old woman.

Sep 052014

As of posting there is no result from google search for “borschtard”; I sort of lay claim, therefore, to this portmanteau. This blend of borscht and bastard has no meaning. One could take it as a Russian racial slur, I suppose. Or, it could be indicative of very bad, borsctardized, eastern European cooking. Either way, “I like it” and, like General Sir Cecil Hogmany Melchett, shall “want to use it more often in conversation.”

Sep 012014

Happy enough with the output of koiné word of the day for the time being. Maybe I’ll make it into a wordpress plugin or something at some point in the future, but probably not. For now it makes sense to have the local script interface with WordPress’ APIs. ONe of the more commonly used and updated rubygem is rubypress, so let’s start there.

$gem install rubypress

==> write permission error

$sudo chown -R `whoami` /Library/Ruby/Gems/2.0.0
$gem install rubypress
$sudo gem update
$sudo gem install rubygems-update
$sudo update_rubygems
$sudo gem update --system
$gem -v

==> 2.4.1

Try connecting:

require 'rubygems'
require 'rubypress'
wp = Rubypress::Client.new(:host => "stephen.yearl.us",
:username =>; "foo",
:password =>; "bar")

p wp.getOptions

==> 403!

Hmm. Tried connecting with a third-party blogging tool (Pixelpumper) and the same 403! This post is interesting, and the highest ranked answer (http://stackoverflow.com/questions/9141497/wordpress-403-forbidden-error) suggests trying the plugins. What fun.

I only uninstalled a few of the the most recently installed plugins back until I remember this not being an issue and still no dice, so it was back to Google, and it shortly became apparent that xmlrpc.php had been the target of a number of pingback DDOS attacks recently. I contacted my hosting provider, and sure enough they had disabled access to xmlrpc.php, but did offer the tantalising possible solution of obfuscating the name and location of xmlrpc, and installing a plugin, “Rename XMLRPC”: https://apps.wordpress.org/support/#faq-ios-12 Well, no dice here either!

It’s something of a pain not to be able to use a third-party blog editor, but I am not at this often enough for that to be a real hassle. I guess the next thing to do is to dig into the structure of Ruby gems, and see if I cannot override the call to xmlrpc.php to some obfuscated version of it.

$gem list

==> rubypress (1.0.8)

$gem contents rubypress
$cd /Library/Ruby/Gems/2.0.0/gems/rubypress-1.0.8/lib/

And looky what’s inside client.rb!

module Rubypress

  class Client

    attr_reader :connection
    attr_accessor :port, :host, :path, :username, :password, :use_ssl, :default_post_fields,
                  :debug, :http_user, :http_password, :retry_timeouts

    def initialize(options = {})
        :port => 80,
        :use_ssl => false,
        :host => nil,
        :path => '/xmlrpc.php',
        :username => nil,
        :password => nil,
        :default_post_fields => %w(post terms custom_fields),
        :debug => false,
        :http_user => nil,
        :http_password => nil,
        :retry_timeouts => false
      }.merge(options).each{ |opt| self.send("#{opt[0]}=", opt[1]) }

Problem solved!