NB: no part of the content on this domain may be used for ML training without the explicit consent of the author.

w e l c o m e !

scroll down for articles.

all design, code, and content, save fonts, crafted by BMPallek.


The scrcpy project offers a wonderfully simple method for viewing and controlling an Android device when it's attached to your PC. Because I loathe touchscreen-typing, I try, as much as possible, to use my phone without actually holding my phone. The thing is that it's a bit irritating to plug in my phone, only to have to still have to do something to get its interface to appear on my desktop.

The solution, of course, is to use the USB "device attach" event to launch scrcpy. On my target machine, the OS is using udev to manage USB events, and systemd for services. The two can be chained together, along with a third layer — a bash script — to automagically launch scrcpy when the phone is attached.

First, I added a new udev rule which I placed in its own file...

/etc/udev/rules.d/99-scrcpy.rules

ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="0e8d", ATTR{idProduct}=="201c", TAG+="systemd", ENV{SYSTEMD_WANTS}="scrcpy.service"

Next, I added a new systemd service unit, which was to be used by the new udev rule...

/etc/systemd/system/scrcpy.service

[Unit]
Description=Run scrcpy while phone is attached
ConditionPathExists=/dev/bus/usb

[Service]
Type=simple
User=b
ExecStart=/home/b/.local/bin/scripts_by_b/run_scrcpy.sh

[Install]
WantedBy=multi-user.target

Finally, I added a new bash script to my user's hidden local storage. The actual script I use is more verbose, has logging, and so on; the script presented here is just to give the basic idea...

/home/b/.local/bin/scripts_by_b/run_scrcpy.sh

if pgrep -x "scrcpy" > /dev/null; then
    exit 0
fi
timeout 3s adb wait-for-device
if [ $? -eq 124 ]; then
    exit 1
fi
export DISPLAY=:0
export XDG_RUNTIME_DIR=/run/user/$(id -u b)
scrcpy --window-x 1468 --window-y 62 --max-size 1024 --disable-screensaver > /dev/null 2>&1 &
SCRCPY_PID=$!
wait $SCRCPY_PID

Oh, and I used wmctrl to help figure out the window coordinates to use when positioning the window. I like to tuck it into the lower-right corner of my desktop. Some of the numbers had to be tweaked to account for window border decorations or other stuff that's probably fixable, but this setup works well enough that I'm not going to bother with those fine points.

Feel free to use or adapt this stuff, but take note that it makes several explicit "personal" references ( my login name, file paths, etc ), which you'll need to adjust.

PS. I wrote about scrcpy in more detail here.


While developing an embedded solution, I found myself having to reboot a fair bit, both during development and testing; it became so uncomfy that I decided to put development on hold until I'd made a more comfy development environment. To this end, the solution centered around tmux. Shout-out to svragv for convincing me a while back that tmux was worth looking into, because it's a great little tool, with a strong *nix-way vibe.

Because it's an embedded system, I'm just using root as the primary user. The machine only accepts key-based ssh logins, so it's reasonable to leave root available and use it ( with care! ) for development and eventual deployment, to keep things simple. In most cases, physical access means total access, but this device is intended for deployment in a controlled environment.

First, I wanted a nicer "attention" keybinding for tmux itself, instead of the default C-b, which requires maximum finger-reach regardless of which hand is going for it; I've replaced that with C-a, which fixes the reach problem. And while C-a is completely biased toward the left hand, my Macbooks only have one CTRL anyway, on the left, so C-a is a good choice when using both PC and Mac, as I do. I also like to use my mouse to select and copy text from the terminal, so I don't want tmux itself handling the mouse. Finally, the "kill-session" binding ( C-a, C-q ) is something useful during development of the development environment itself; it's probably best to remove that once everything is in order, to avoid inadvertently killing the session by accident.

~/.tmux.conf

unbind C-b
set -g prefix C-a
set -g mouse off

bind C-q kill-session

Here's the startup script that creates a comfy tmux session for development. Since systemd will be used to help manage device attachment and removal, it's very helpful to keep an eye on the journal while making changes in the main pane. This script gets launched on boot by systemd, so after a reboot, I can simply attach to the session from another machine. The commented-out "attach" directive was used while developing the script locally, so I could confirm it was doing what I wanted before turning it into a start-on-boot service ( service unit omitted for brevity, it's nothing special ).

~/development-init.sh

#!/bin/sh

SESSION_NAME="dev"

tmux new-session -d -s $SESSION_NAME '/usr/bin/bash -i'
tmux splitw -v -p 25 -t $SESSION_NAME 'journalctl -f'
tmux selectp -t $SESSION_NAME:0.0

#tmux attach -t $SESSION_NAME

Finally, for a bit of completeness, here's how to attach to the dev session from an authorized machine...

ssh -t root@dev-host tmux attach -t dev

...and of course, it's referring to the session named "dev" per the script above, on an imaginary machine named "dev-host"; adjust as needed for your use case.


I live in a high-rise condominium, which is a pretty complicated little domiciliary ecosystem. Let's set aside all the considerations that keep the building from falling down spontaneously, those which bring clean water into the building and sewage out, and those which supply the nearly indispensable utility known as electricity, and focus instead on what can be called "technological infrastructure": electrical lines that carry signals — yes, even analog ones, though digital signalling is far more pervasive these days — to the various parts of the building in order to provide access control and monitoring. We'll ignore in-home stuff like Internet and the archaic-but-still-not-quite-dead POTS, and focus on things relating to a shared building's common elements.

Because we have a lot of floors, we have a few elevators, and because we like to keep up with the times, there is a fob-based access control system building-wide, including in the elevators, used to control access to the "club" level, where we have a bunch of nice amenities. The system even extends to the parking garage, but that makes it a bit complicated, because, due to the era in which our building was constructed, there's no hardline between the two structures. Thus it was that an RF-based bridge was installed some years ago, to extend the LAN so residents could access the parkade with fobs as well.

Unfortunately, it turns out the installer took ( unsurprisingly ) as little time and effort as possible to set up the system in the garage, which explained why the system had been flaky in terms of stability. When I inspected it earlier today, I noticed that an electrical box had been simply stuffed full of surplus cabling, in a way that could be best described as rabid spaghetti, as devoid of labels as it was rife with chaos. Worst of all, the ethernet cabling had been kinked in a severe way at various points, to the degree I'm surprised the system had ever worked. I untangled the mess, sang a song of comfort to the abused cables, and then neatly bundled them up and back into the box, in a much more sane manner. I then used my laptop to check the connection, which had started working properly. Satisfied with the improvement, I reconnected the garage zone controller to the network, and then I securely remoted into the office ( via phone hotspot, and while phoning our office manager ) to inspect the management software, which indicated ( once again, unsurprisingly ) that the garage zone was now online.

It's possible there are bigger problems that will need to be addressed in future, but at the very least, treating cabling like it has actual physical limits ( rather than a clothesline or a ball of trash ) is a good start to ensuring that a network-dependent system remains functional. It doesn't take a significant amount of extra time to do things well, so I'm always baffled when they're — all too often — rushed, with the consequent problems. Maybe I'm just a fool who doesn't understand the concept of "job security". 🙄

With the garage zone sorted, it was time to focus on "elevator zone", which was also showing "offline" in the management software. We recently completed our extensive elevator renovation program, having added the fobs as a new feature, with the zone controllers having been installed in the elevator control room at the top of the building. Arriving there, it was ( yet again ) absolutely no surprise to note another utility box jammed full with a rat's nest of devices and cabling. I pulled out the uplink cable, and connected with my laptop. The DHCP protocol dutifully walked through its steps, but got stuck after assigning itself a link-local address, indicating that the uplink was faulty, or at least wasn't serving DHCP. It's an older CAT 5E cable that runs all the way to the basement, so it wasn't surprising that it might have a fault. I ran out of time at that point, however, so I'll have to do further diagnostics another time. Frankly, I kinda hope the cable is trashed, because it gives us a reason to replace it with something a bit more recent, in case we need more bandwidth in future — there's a rentable party room at the top of the building, and we hold board meetings there, so it'd be nice to have a solid WiFi link available.

What's the moral of this story? Well, you can pay good money, and still not get good service. Most companies nowadays don't give a rip about you or your needs, and their employees often won't either, unless you get to know them a little. Even then, it helps to get a second opinion from someone who really knows their stuff, and / or have the work supervised or checked, to make sure it wasn't half-assed. It shouldn't be this way, but it do. ¯\_(ツ)_/¯


In an ideal world, logging wouldn't be necessary. Logs are helpful when things go awry ( and sometimes they're fun just to look at, or useful for learning more about how a system works ), but when things are running well, logging mostly just eats up CPU cycles and storage space. The former isn't a big deal, but the latter can actually become a problem in two important ways.

The first problem, which affects pretty much every logging system, is log files growing too large. Fortunately, every decent logging system has a rotation mechanism designed to archive and / or truncate the oldest logs, taking advantage of the fact that a log's value tends to be inversely proportional to its age. The oldest logs are usually deleted to make space for fresher data, ensuring that disk space is never exhausted, especially important if the logs are stored on the main system volume, where in the worst case, running out of disk space can take the whole system down.

The second problem, which is usually less serious, is wearing out the storage medium where the logs live. While storing logs on the main system volume is common and usually harmless, should the volume reach its wear limit, the whole the system could become unstable. That said, in many situations, even on single-volume systems, the storage volume is so large ( allowing wear to be widely distributed ), or the medium so durable, that the problem becomes negligible. In certain cases, however, it behooves the system maintainer to tweak the logging setup to reduce load or wear on a disk.

The Raspberry Pi, commonly running from an SD card, is one such special case. Historically, there were some issues with SD cards failing a lot sooner than expected, or getting corrupted, and although it seems much less common these days, reducing frequent writes to the card is probably a good idea. To that end, logging can be made ephemeral, for in all but the worst circumstances, the logs don't need to persist between boots.

I decided to use the tmpfs file system, as it is basically ramfs with some additional sophistication. Since the default init system on RasPiOS is systemd, and since I'm also running a few "external" services on the target host, this meant creating several new systemd units, one for logging in general, and an additional one for each service. Note that some of the filenames and locations seem to be a bit "non-arbitrary" when using systemd; each new unit goes into "/etc/systemd/system".

var-log.mount

[Unit]
Description=Mount tmpfs on /var/log
DefaultDependencies=no
Before=local-fs.target

[Mount]
What=tmpfs
Where=/var/log
Type=tmpfs
Options=mode=0755,noatime,nosuid,nodev,size=512M

[Install]
WantedBy=local-fs.target

create_var--log--apache2.service

[Unit]
Description=Create /var/log/apache2 at system start
Requires=var-log.mount
After=var-log.mount
Before=apache2.service

[Service]
Type=oneshot
ExecStart=/usr/bin/mkdir -p /var/log/apache2
RemainAfterExit=true

[Install]
WantedBy=local-fs.target

create_var--log--rustdesk-server.service

[Unit]
Description=Create /var/log/rustdesk-server at system start
Requires=var-log.mount
After=var-log.mount
Before=rustdesk-hbbs.service rustdesk-hbbr.service

[Service]
Type=oneshot
ExecStart=/usr/bin/mkdir -p /var/log/rustdesk-server
RemainAfterExit=true

[Install]
WantedBy=local-fs.target

Take note of the After= values that establish a dependency on the general logging unit, and the Before= values that ensure the service-specific logging directories are ready before their respective services start up. Note also that the general logging definition includes a size limit; for my rasPi4 equipped with 4 GB RAM, I was willing to give up a generous 512 MB to runtime logging, as the host's memory usage was averaging roughly 400 MB.

Don't forget to systemctl daemon-reload as well as enabling the new units. A reboot is also advised to confirm everything starts up correctly.

The downside to this approach is that it requires additional maintenance when adding new services that also need their logging directories pre-created by the system. On the other hand, some programs are capable of creating such missing directories on the fly, and won't need any special care.


Life can be difficult. Epictetus shared some good insights into managing difficulties. He divided situations into two broad classes: (1) things over which you have control, and (2) things that are out of your hands. For (1), he advised that you exert every effort in becoming a better person, improving your skills, self-discipline, patience, and in general, your virtuousness. For (2), he advised that you let shit slide. It's not about apathy, but moreso accepting things with grace. And for this response, I've yet to find a better typographic encapsulation of the idea than the "shrug-dude": ¯\_(ツ)_/¯. Granted, the little dude requires Unicode support, but by now, most text-based programs, such as the humble yet dependable Lynx browser, have said support.

My favorite way to stay in touch with friends from around the world is IRC, and I wanted to bring the "graceful acceptance" vibe to the chat by making it possible to emit the "shrug-dude" without having to remember Unicode code points, weird key bindings, etc. To that end, I created this script for my preferred IRC client, WeeChat. Once the script is active, you simply place :shrug: anywhere in your input text, and each instance will be replaced automagically by my favorite little reminder that we needn't get stressed out by things beyond our control.

The GPLv3 license permits you to literally lift a copy of this script, and place it in a file in a special location, such that it will be automatically loaded when WeeChat starts ( see documentation for details on those magic directories ). The GPLv3 license also permits you to literally sell copies of this thing, without making any effort of your own to contribute to bettering the world. If you do that, you're not a cool person, but by this point, you should probably have guessed how I'd respond to such an action: ¯\_(ツ)_/¯

Anyway, here's the script, enjoy!

# Name: shrug_addict.py
# Author: Psy'd Bernz
# License: GPLv3

FIND_SUBSTR = ':shrug:'
REPL_SUBSTR = u'\u00af\_(\u30c4)_/\u00af' # shrug-dude

SCRIPT_NAME = 'shrug_addict'
SCRIPT_AUTHOR = 'Psy''d Bernz <good_luck_spammers@psydbernz.com>'
SCRIPT_VERSION = '1.0'
SCRIPT_LICENSE = 'GPLv3'
SCRIPT_DESC = 'Replaces instances of "' + FIND_SUBSTR + '" with "' + REPL_SUBSTR + '".'

import re

def sar( string ):
    string = re.sub( FIND_SUBSTR, REPL_SUBSTR, string, flags = re.IGNORECASE )
    return string

import_okay = True
try:
    import weechat
except ImportError:
    print( sar( 'This script must be run from within WeeChat. :shrug:' ) )
    import_okay = False

def process_message( data, modifier, modifier_data, string ):
    ACTION_PREFIX = "\x01ACTION" # "/me" command
    if string.startswith( ACTION_PREFIX ):
        action = string[ 8: ]
        return ACTION_PREFIX + sar( action )
    else:
        return sar( string )

if __name__ == '__main__' and import_okay:
    if weechat.register( SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION, SCRIPT_LICENSE, SCRIPT_DESC, '', '' ):
        weechat.hook_modifier( "input_text_for_buffer", "process_message", "" )

If you have trouble getting it to work, you could try contacting me for help, but as always, I promise nothing. ¯\_(ツ)_/¯

I also want to give a shout-out to Zach Reed / shrugdude.com for a useful little related tool.


Web buttons have been around almost as long as graphical browsers, which themselves appeared very shortly after the World Wide Web reared its initially ( and still fairly ) ugly yet culturally transformational head. And despite the human propensity to change things "just because" — or even sometimes when it makes sense — the venerable web button "spec" — which essentially boils to down "88 x 31 px rectangle in some reasonably well-supported image encoding format" — is unchanged to this very day ( despite the fact that modern display resolutions make it almost necessary to use a magnifying glass to see the darn things ).

Amidst the apparent resurgence of the classic approach to the Web -- making personal websites, and linking to other personal websites -- which may actually be more of a reactionary response to how disgusting the modern commercially-overwrought-yet-astonishingly-bland Web has become, I present my first crack at a web button. Due to the complex nature of its construction, and my commitment to easing up on my nit-pickery, the dimensions are actually 88 x 30 px; aspects ratios are tricky in integer space, and I figure it's better to err on the side of "slightly too small" than potentially overflowing some container.

So, without further ado — because that was in fact quite a lot of ado — here is version 1: web button

That's right, it's an ever-so-cute, tiny, scrolling sample of this very website. How cool is that? I'll tell you: pretty... it's pretty, pretty cool. This web button also marks my jump into serving images of any substantial size from this site. Those of you who wish to link to my site, feel free to simply snarf a copy of the, ahem, "reasonably-sized" [for the broadband-era] file, and get to linkin'. I'm thinking about setting up a links section myself; as with a lot of my projects, it's scheduled for Real Soon Now.


Roughly 10 years ago, I wrote about the idea of systems reaching the point where they are practically disposable, and their real value being reduced to the user data stored on them. I think we might have reached this point with the Raspberry Pi 5. With a minimum RAM footprint of 4 GB, a fairly zesty CPU, and an upgraded GPU, this little nipper might have what it takes to bring the era of x86 desktop dominance to a close.

That said, web browsers continue to be the killer app that will make or break the usefulness of the PC for the average person, never mind power users, and they keep growing in complexity and resource demands. So while I can't recommend sweeping replacement of all desktop PCs with the Pi 5 ( or comparable SBCs ), there are definitely a lot of home users, not to mention small businesses, that might find a shift to the small format worthwhile.

For one thing, SBCs dissipate substantially less power than full-on desktop PCs, and while I'm unconvinced that humanity has the significant effect on planet-wide weather patterns claimed by those who seem unfamiliar with the concept of hubris, it's nevertheless a good idea to reduce waste.

Secondly, if we can get operating systems dialed in properly, and store userdata in safer places without sacrificing too much performance, these machines become the "right kind" of disposable — that is, greatly reduced BOM / component-count and PCB surface area, curbing the environmental impact when recycling isn't viable, while simplifying replacement and reducing downtime and costs, when inevitable failures occur.

There's also the matter of aesthetics, but let's be honest, I'm a little out of my depth in that department; instead, let's focus on the convenience of being able to mount an SBC to the underside of a desk, making aesthetic concerns simpler — after all, sometimes the most beautiful thing is the [apparent] absence of a thing.

« Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away. »
— Antoine de Saint-Exupéry

Perhaps the Raspberry Pi Foundation had this in mind all along, and if they shift gears into profiting reasonably from their efforts, more power to them — as long as they keep things open and forthright. Turns out RISC-based systems are a pretty good design choice after all, and might become the dominant architecture in popular computing before long.


Getting a better experience with Android involves many things. Customizing your launcher ( "home screen" ) can be very helpful, but so is setting up an easy way to transfer files to and from another device, like your desktop PC or laptop. And let's not forget the benefit of scheduling notifications off while you sleep! Unfortunately, all of these activities involve using a tiny, annoying interface: the touchscreen. For me, customizing Android begins with making the user interface more comfy.

Fortunately, a very clever chap has created a very excellent tool for Android-based devices, allowing you to plug your device into the USB port of a more capable machine, like a desktop PC, and then see its screen, as well as remotely control it using more comfy tools, like a mouse and keyboard. You can even, with a little extra effort, link your phone or tablet wirelessly, and enjoy the mirroring without worrying about a cable getting snagged, but if you have a BT headset, then you'll be able to take calls regardless of the phone's physical location, so a USB link is good enough ( plus, it'll keep your phone good 'n' charged ).

Now, I'll assume that if you are interested in customizing an Android device, using a "real" computer, then you're already familiar with adb. And I also trust that you're able to make sense of the instructions at scrcpy project HQ for getting the program to "attach" to your phone. If you run into any issues, here are the key elements for a wired ( ie. USB ) setup:

  • your Android device must be configured for "USB debugging" to allow adb to work
    • typically, you'll find a "Developer" settings section that contains the necessary toggle
    • you'll also need to authorize the specific host you've connected to; this usually takes the form of a notification / pop-up on the device the first time you plug it into your host, once you've enabled USB debugging
  • adb needs to be running, with the right settings
    • sometimes, you might have started adb with "bad" options, so if you're having problems, try adb kill-server and then start it again with the right options
    • adb should be listing your [plugged-in] device if you run adb devices

While scrcpy is amazing, it has two small issues that affected me:

  1. I kept getting a segfault when launching it with no options; adding a --max-size option ( eg. scrcpy --max-size 1024 ) was an effective workaround for me.
  2. Sometimes I'll launch scrcpy when my phone is locked; after providing my PIN, the phone will indeed unlock, but the scrcpy window will also close. When that happens, I can simply launch it again, and it shows the unlocked phone screen immediately; it's just weird that the window closes in the first place, and that it only happens occasionally.
    • After a bit more investigation, it appears that scrcpy doesn't actually crap out after I submit my PIN; it just hides its main window during the unlock operation, and takes a long time to show it again once the phone is unlocked. It's possible that this issue involves a limitation or fault in Android itself, as I've also witnessed the occasional inexplicable delay after correctly submitting the PIN when using the phone standalone.
    • Fortunately, this quirk can be easily mitigated by setting the phone to stay unlocked while connected with USB ( see the "Developer" settings section ).
    • There's also a related scrcpy option "--disable-screensaver" that might be helpful.

Once you can see the remote screen, you can use your mouse to click and drag with the left button, and the right button is bound to the device's "back" button. The most enjoyable thing, of course, is that you can now type with a keyboard. Not only that, scrcpy also fuses the clipboard of your host system with your target Android device, so you can clipboard-copy on your host system, then clipboard-paste into an app on your phone, and so on. Solid gold!


RustDesk seems to work pretty well, and it's already supported on major operating systems. When you're getting started with it, you'll by default be using a third-party ID server to find and handshake with the remote host. While this is acceptable in some situations, you'll probably prefer to manage the handshaking yourself, and more importantly, use encrypted sessions, which can be achieved through self-hosting. From hereonin, I'll just use the term RDS as shorthand for RustDesk [self-hosted] services.

To make it easy for RustDesk client programs to find your RDS host, point a domain name at it. If that host is behind a gateway, simply set up port forwarding on a handful of ports, depending on the level of service you want to provide.

Here are the port forwards, per the documentation:

portprotocolssuggested rule namepurpose
typical access ( using the desktop client )
21115TCPrustdesk_hbbs_probeNAT probing
21116TCP, UDPrustdesk_hbbs_idID reg, heartbeat, TCP hole-punching
21117TCPrustdesk_hbbrrelaying ( optional )
Web-based access
21118TCPrustdesk_web_hbbsbasic service via Web
21119TCPrustdesk_web_hbbrrelaying via Web

The use case I wanted was "encrypted, relayed sessions using a desktop client", so I forwarded only the "typical access" ports; because the Web is a still a bit of a horrifying place when it comes to security, I decided to leave the two Web-related ports inaccessible for now. Enabling encryption is a matter of defining a keypair ( created if missing on first run of hbbs and found in /var/lib/rustdesk-server on my RDS host ), and reconfiguring the startup of the services to use said keypair.

First, for relaying support, the hbbr service needs some values for the keypair. Because I was setting this up on a distro that uses systemd by default, and I couldn't be bothered to change that out, I just edited the defaults in /etc/systemd/system/multi-user.target.wants/rustdesk-hbbr.service and added two environment variables ( the values of which can be found inside the two respective keyfiles ) to the [Service] section...

Environment="KEY_PRIV=..."
Environment="KEY_PUB=..."

...and then I added some arguments to the startup...

ExecStart=/usr/bin/hbbr -k _

Similarly, the [Service] section of /etc/systemd/system/multi-user.target.wants/rustdesk-hbbs.service needed some additional variables to specify the same keypair, along with some additional options...

Environment="KEY_PRIV=..."
Environment="KEY_PUB=..."
Environment="ALWAYS_USE_RELAY=Y"
Environment="RELAY_SERVERS=localhost"

...and finally, some additional arguments for startup...

ExecStart=/usr/bin/hbbs -r localhost -k _

Oh, one more thing you might want to do — and this is optional depending on how the rest of your security is set up — is enable a firewall and punch holes for the aforementioned ports. Although it's fun to brag about having iptables chops, I generally just use something like ufw, to keep things, well, uncomplicated. 😎

Anyway, once everything was configured, I rebooted the RDS host to confirm that everything would start up correctly, and also to try a few test sessions, from remote hosts both within my LAN and also from outside of it.

With a key in use, I had to set up the RustDesk client on each remote host to use that key. For each, I edited the network settings, in order to specify the ID server and relay server ( setting both to the domain pointing to my gateway ), and then I placed the public key ( as a text string ) into the Key field. Finally, I entered the remote desktop ID of one machine into the 'Control Remote Desktop' field of the other and clicked Connect. I had already set a permanent password, so when it connected, I entered the password, and a moment later, I saw the remote desktop. On the controlling host, there was a little green shield icon in the caption bar of the main window, confirming that the connection was secure.


The battle over free speech rages on at Twitter. First, the illuminating documentary "What Is a Woman?" was given the green light for re-release on the world's most controversial social media platform.

Then, a censor-happy employee, or maybe several, made it their business to sabotage the premier, suggesting that perhaps Twitter isn't destined to become the bastion of free expression on which Musk has already risked quite a lot ( at least financially ) to renovate.

And finally — all this within 48 hours, mind — he swooped in and vetoed the interference, resulting in at least one significant, ahem, "resignation" ( which it was, technically — and if Elon is actually playing 5D chess, getting employees to resign instead of firing them is a great way to save on severance and other related costs ).

I suppose Mr. Musk is about the closest we'll get to a real-life "Batman", and I'm not particularly into comic books, but if I was, I'd say Elon's antics since buying Twitter are actually more entertaining. And perhaps on a more serious note, he seems to be maintaining his commitment to fighting the censorship that has been creeping in steadily over the last 10 years. If he keeps it up, I might even be convinced to make my first post* on his platform.

* I grabbed an account some time ago, as an anti-squatting measure, but have thus far been resolute in my refusal to post due to the platform's major defects in policy, which may finally be getting some much-needed correction

It's tricky to figure out what Elon is really about. To his credit, he appeared recently in an interview saying he will speak his mind even if there are significant financial repercussions. On the other hand, he recently hired a CEO who appears gung-ho to drive Twitter's policy back toward secretive manipulation and the promotion of the unhinged authoritarianism popular with extreme leftists, as the platform began to show some sketchy* behavior within days of the hand-off.

Moreover, he still hasn't made good on his claim that he'll open-source the important algorithms — arguably the most effective way to ensure that users are treated fairly, no matter what their views. I get that he was in a bit of a tight spot, and that it's difficult to attract a CEO to a company that's highly contentious, and I get that the new CEO has a good history in terms of driving attracting advertising revenue, so I'm not going to assume she will honor the mission to turn Twitter into the free-speech platform is has the potential to become, but I feel like Elon is dragging his feet on the open-source stuff. Come on, buddy, let's go already.

* and by sketchy, I mean "missed" updoots, dinged follower counts, and shadowbans related to accounts that counter mainstream narratives


I'm developing a little browser-based program that might have value for DJs or musicians who wish not only to keep track of a BPM, but also the structure of a piece of music.

Granted, it's limited to "western" music standards, but I have to draw the line somewhere to keep it simple. In fact, it's focused on psychedelic trance, but there's no reason it can't be used for anything with powers-of-two timing, and with a little tweaking, some slightly more exotic time signatures as well. Anyway, the program wants to know where the mouse is immediately, but browsers are sorta focused on "events", and just after loading a page, and without touching the mouse, there is no event dedicated to locating the mouse's initial position.

Now, strictly speaking, I could just grab the mouse location from the first click event, but I'm more demanding than that, because during development, I have realtime debug info, and I want that to be up-to-date immediately, rather than waiting for an initial click. The solution is to "hijack" a "natural" event that relates to "links" ( the 'a' element ).

The slightly "clever" solution is based on creating an anchor element that covers the entire visible area, which will receive a 'mouseover' event, even if the user doesn't touch the mouse after the page has loaded. Once the information has been retrieved, we can stop following that event; moreover, we can dispose of the anchor element entirely, as it has done its job, and is no longer needed.

We begin with some CSS that covers the entire client area invisibly, so the user is none-the-wiser about this little trick...

#mouseFinder {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    text-decoration: none;
    /*background-color: rgba( 255, 0, 0, 0.5 );*/
}

...where the commented-out part provides assistance with debugging by showing the anchor until it has done its job and annihilated itself. Then we declare the element itself, and it's important to add it after the "real" content, so it covers everything, and can "see" the mouse...

<a id="mouseFinder" onmouseover="findInitialMousePos( event )"></a>

...and the final bit of magic is, of course, the JavaScript, which handles the event, extracts the info, and the discards the anchor element, but also sets up to track the mouse from there on in...

var mouse = { x: null, y: null };

function updateMousePos( e ) {
    mouse.x = e.clientX;
    mouse.y = e.clientY;
    debug.refresh(); // the 'debug' stuff is defined elsewhere; omit this line if you like.
}

function findInitialMousePos( e ) {
    updateMousePos( e );
    document.addEventListener( 'mousemove', updateMousePos, false );
    document.getElementById( 'mouseFinder' ).remove();
}

Naturally, the JS needs to be declared sooner than later, to ensure it's ready when needed, but anyway, there we go... for programs that absolutely, positively need to know the mouse position, even before the mouse has done anything, it should be possible.


In the early days of computing, most printers had a printhead ( or "carriage" ), which would travel across the page, printing each character, and upon reaching the end of the line, a carriage-return ( CR ) code would sent the printhead back to the start of the line, and then a line-feed ( LF ) code would advance the sheet of paper vertically. Because those two operations and codes were distinct, it was possible to do tricks such as printing a line and returning the carriage without advancing the page, then reprinting some characters on the same line to produce a reasonable facsimile of properly bolded text, before issuing both a CR and LF. In a video terminal ( VT ), a similar technique allowed software to overwrite an existing line, making it possible for lengthy operations to show their progress in realtime. There was nothing wrong with such ideas, if properly understood; moreover, because there was no practical purpose* for advancing a line without returning the carriage, an LF without a preceding CR could be unambiguously interpreted as both operations combined.

Proper nerds, understanding that text files were abstractions and not physical objects, chose to encode line endings with an LF alone. The lesser nerds, however, failing to appreciate that less is often more, chose to encode their text file line endings with a CR-LF pair. For a variety of unrelated reasons, systems using the obtuse "always CR-LF" paradigm eventually became quite popular, creating the LF-elegance / CR-LF-atavism rift that continues to plague us to this very day. To avoid apoplexy, we're going to ignore the truly deranged approach chosen by early Apple systems.

Recently, I've been hacking on a project that comes from, ahem, "CR-LF land", and I wanted to use git to track my changes, but I find it very annoying when a tool points out "meaningless differences" — by this I mean that when I grudgingly agree to edit source files that use the brain-damaged line-ending paradigm, it's on the condition that the file editor simply hides the inanity from me, and makes no attempt to correct it, so that my changes are as compatible as possible with the original fileset. I expect the same of my other tools. Git, originating from the elegant-if-not-baroque world of *nix-like systems, embraces the LF-only-when-it-makes-sense paradigm, and so it finds CR-LF line endings offensive — and isn't shy about pointing them out. Consequently, I give to git a pill of chill with the following two settings:

git config --global core.autocrlf false       # check and commit as-is
git config --global core.whitespace cr-at-eol # ignore line-ending differences for diffs

Maybe it's better to scope these settings per-project, etc, blah blah blah. The point is, I'm not going to solve the line-ending problem, but I'm also not going to let it waste my time.

* it could be argued that dropping down a line and then printing in reverse from the end of the line could improve printing efficiency, but that could be handled invisibly by the printer itself using a small buffer, while VTs had escape-codes for more sophisticated cursor control


Xubuntu has been my OS of choice for many years, for a number of reasons, the primary one being — well, to be honest, it's just isn't terrible. It isn't amazing, but it's decent, and very rarely does stupid things like clobbering your WiFi or taking out working printers.

Ubuntu-like systems perform system updates via pop-ups that are only mildly disruptive and easily dismissed. When approved, they normally run smoothly, providing nice status info, and offering the option to reboot later if a reboot is needed ( what is this, 2003? ). Occasionally, update tasks also need authorization, when touching sensitive parts of the system, but it's always very clear what's happening. It was therefore a bit surprising when the most recent update failed with a suspicious error message regarding a lack of authorization to perform the operation — without actually requesting said authorization.

Intrigued ( okay, to be honest, I wasn't intrigued so much as annoyed ), I jumped into a CLI, because the GUI is only for when things are working fine, and took a look at the results of a manual software-sources update...

b@mediabox:~$ sudo apt update
Hit:1 https://cli.github.com/packages stable InRelease
Hit:2 https://linux.teamviewer.com/deb stable InRelease
Hit:3 https://download.mono-project.com/repo/ubuntu vs-bionic InRelease
Hit:4 https://dl.winehq.org/wine-builds/ubuntu focal InRelease
Hit:5 https://updates.signal.org/desktop/apt xenial InRelease
Err:6 https://dl.cloudsmith.io/public/balena/etcher/deb/ubuntu focal InRelease
  402  Payment Required [IP: 13.33.165.71 443]
Hit:7 http://packages.microsoft.com/repos/code stable InRelease
Hit:8 http://dl.google.com/linux/chrome/deb stable InRelease
Hit:9 http://ca.archive.ubuntu.com/ubuntu focal InRelease
Hit:10 http://security.ubuntu.com/ubuntu focal-security InRelease
Hit:11 http://ppa.launchpad.net/cappelikan/ppa/ubuntu focal InRelease
Hit:12 http://ca.archive.ubuntu.com/ubuntu focal-updates InRelease
Hit:13 https://packages.microsoft.com/ubuntu/20.04/prod focal InRelease
Hit:14 http://ca.archive.ubuntu.com/ubuntu focal-backports InRelease
Hit:15 https://packages.element.io/debian default InRelease
Hit:16 http://ppa.launchpad.net/freecad-maintainers/freecad-stable/ubuntu focal InRelease
Hit:17 http://ppa.launchpad.net/gezakovacs/ppa/ubuntu focal InRelease
Hit:18 http://ppa.launchpad.net/linuxuprising/libpng12/ubuntu focal InRelease
Hit:19 http://ppa.launchpad.net/nilarimogard/webupd8/ubuntu focal InRelease
Hit:20 http://ppa.launchpad.net/ondrej/php/ubuntu focal InRelease
Hit:21 http://ppa.launchpad.net/ubuntuhandbook1/avidemux/ubuntu focal InRelease
Reading package lists... Done
E: Failed to fetch https://dl.cloudsmith.io/public/balena/etcher/deb/ubuntu/dists/focal/InRelease  402  Payment Required [IP: 13.33.165.71 443]
E: The repository 'https://dl.cloudsmith.io/public/balena/etcher/deb/ubuntu focal InRelease' is no longer signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.

...and much to my chagrin — well, a little to my chagrin — the problem had been misrepresented by the GUI. Apparently, the providers of balenaEtcher are now charging money for it? Or they have misconfigured their system? No, seems it's about the money, as following their installation instructions also yields a 402 ( although good luck to users who don't understand that '-s' causes curl to hide the error ).

I'm not really bothered about the pay thing, as I only grabbed Etcher some time ago to try it out and see if the hype was warranted ( surprise! it wasn't; others, such as unetbootin, work just as well, even if they aren't "pretty" ). I am, however, at least a little bothered by how poorly the error was handled at the GUI level, with a misleading message about authorization, and not the actual reason ( "gib munny" ). At this point, it might as well be the Year of the Linux Desktop, because it finally behaves as daftly as Windows. 🤣

Anyway, I removed the offending items from /etc/apt/sources.list.d/ and then the GUI was happy to perform updates again, so all's well that ends with diagnosing the problem well.


My home LAN centers around a Turris Omnia. I've been using it long enough to consider it a solid piece of kit, well-designed both in terms of hardware and software ( firmware, if you like ). Although many of its features are available on cheaper "consumer grade" devices, it doesn't require any silly unlocking or shenanigans for complete customization.

There's this trend among mainstream device makers to offer a single "easy solution" to various problems, but when that solution fails ( and IME, it isn't uncommon ) or even worse, it depends on shady behavior by the manufacturer, the way forward can become so burdensome that replacing the device is often the most practical choice. Not so with the Omnia — while the device offers excellent out-of-the-box security, the entire GNU/Linux-based OS is right there for the owner's hacking pleasure.

It should go without saying, but just in case: it isn't fair to expect Turris to blindly support devices that have been customized, so proceed with caution, should you decide to perform some "rocket surgery". On the plus side, the device does have some nice recovery features.

Now then, I want to be able to access my home LAN from "anywhere", so I'm using DDNS ( via afraid.org — shoutout to Josh! ) with a subdomain that's easy to remember. In order to keep the IP address up-to-date on the subdomain, I created a script in my home directory ( not root ), which looks something like this...

#!/bin/sh

if [ "$USER" == "root" ]; then
    # drop privileges and go again
    sudo -u b -s /bin/sh $0
    exit 1
fi

wget https://freedns.afraid.org/dynamic/update.php?### -O - > /dev/null

...where the "###" is replaced by the update token ( generated by afraid.org ). This approach is reasonably safe, since HTTPS sets up a secure channel with the domain before submitting anything else ( ie. the key ). Instead of directing the output to "/dev/null", you can send it to a log file, if you want to be able to track updates, errors, etc... but beware of log file sizes, wearing out your NVRAM, etc. I only enable logging temporarily, when I'm trying to diagnose an issue.

Then I configured crond to run the script periodically, like so...

0 */8 * * * /home/b/update_afraid-org_DNS.sh

There are other ways to deal with DDNS, but I like this method because it's easy to understand, so it should be easy to fix if something goes awry.


My "internal jury" is still out on Elon's motivations, but he does appear to be putting effort into Twitter. Overall, the buzz seems to suggest a decrease in non-living robots; cleaning up the other kind of "robot" will certainly be more difficult. The explosion of LLMs will also complicate things. In any case, since changes seem to be "so hot right now", I'd like to throw my hat into the ring.

It's undeniable that some people use Twitter for self-validation, and as their follower counts grow, they may be more willing to make specious claims, believing that a growing following is evidence of their enlightenment. On the other side of the coin, it's common enough to see one user disparaging another's assertions by pointing out a low follower count, as if obscurity implies fatuity. And so I present an absolutely crazy idea... ( because it almost certainly won't boost profits for the company, even if it improves discourse )

Why not discard, or at least hide, follower counts? If a user has something of value to post, that value isn't increased because the user has a larger following. Quite the reverse; it's the value of a user's posts ( neglecting secret manipulation ) that will increase that user's following. By showing a follower count, the user is likely to fall prey to a false sense of urgency to post more, not necessarily more of value, just more — and as the user shifts focus from quality to "increasing the numbers", the SNR will inevitably drop.

By hiding the follower count, the user will need to put more effort into each post, focusing on saying something meaningful, and not just "boosting engagement" with cheap submissions. It will also discourage the tactic of buying fake followers, since a passive follower will add little value, necessitating additional costs for "fake interaction".

Speaking of interaction, the "like" button suffers from a similar "drive the counts" problem, but its real failing is its ambiguity; fixing that seems worthwhile. The reader of a tweet is typically going to react in one of four ways:

  • 😐 apathy: the post isn't relevant to the user's experience ( the default "reaction" )
  • 🙂 positive affirmation: the reader accepts the post, and is pleased about it ( a-k-a thumbs-up in some cultures )
    • example: "I love pizza!" — most hungry people seem to be pleased when pizza is on offer
  • 🙁 negative affirmation: the reader accepts the post, and finds it displeasing ( a-k-a thumbs-down )
    • example: "Pineapple on pizza FTW!" — some people are strongly against pineapple as a pizza topping; I'm not sure what's wrong with those people, but I still love them 🤣
  • ❌ disagreement: the user rejects the post for a technical reason, such as disagreement with a claim of fact; ideally, this reaction will be accompanied by an expository reply, such as a counter-claim of fact

Of course, if such changes were made, it's possible that some third party would then swoop in and abuse the Twitter API, or even resort to scraping, in order to bring back the "all-important" follower count... but that's another problem for another time. 😅


YouTube is a bizarre mix of getting many things right, and then doing some bafflingly dumb things. "Ambient Mode" is one of the latter. As in nature, sometimes a little pruning is what's needed. And fortunately, once again, a sane person whipped up a fix in short order.

I was able to mostly ignore the nonsense initially, but some [YT] bugs have made the mode a proper irritant, so it's time to deploy the hack that will cripple YouTube Ambient Mode. You'll need one of the browser-script-wedge engines ( Tampermonkey, etc ) first, of course.


Despite Musk's claims about free speech regarding Twitter, he's already setting the stage for either maintaining the status quo or clamping down even further, as seen in his recent appeal to advertisers.

The problem is that Twitter exists in cyberspace, so "warm and welcoming for all" just isn't realistic, because "all" includes swathes of people who aren't tech-literate enough to effectuate a "desired experience" according to their "preferences".

God forbid ( /s ) people taking personal responsibility for their online experiences, so it's likely that we'll see a prioritization of facades like "safety" and "positivity" used as rationales to encumber free speech to the point where Twitter is ( some would say remains ) just a megaphone for plutocratic talking points, while wrongthink is punished, if not filtered away entirely. Interesting also to note that Musk seems to emphasize entertainment ( "see movies or play video games" ) as a form of personal choice, instead of something meaningful, like informing oneself about reality.

George Carlin pointed out something relevant nearly 20 years ago...

"The real owners, the big, wealthy business interests that control things and make all the important decisions... they own all the big media companies so they control just about all the news and information you get to hear... They don't want a population of citizens capable of critical thinking... They want obedient workers... people who are just smart enough to run the machines and do the paperwork... They own this fucking place. It's a big club, and you ain't in it. By the way, it's the same big club they use to beat you over the head with all day long when they tell you what to believe, all day long, beating you over the head in their media, telling you what to believe, what to think, and what to buy... That's what the owners count on -- the fact that [people] will probably remain willfully ignorant..."

With that in mind, recall that Elon Musk is currently the world's richest person. And that's why I post here, and not on Twitter. Free speech doesn't mean it doesn't cost anything*, it means you have the ability to speak your mind, without some rich doofus telling you what's "acceptable".

* this site costs about $25 / year, plus a small amount of time and effort for maintenance


The Twitter poop-storm continues with Elon cracking down on parody accounts by forcing them to disclose their parodic nature, or face the ban-hammer. Oh noes! Surely satire and parody can only be funny when not recognized as such! /s

So, a bunch of Twits ( Twitterers? ) are complaining about the forced disclosure, saying it conflicts with Musk's earlier "comedy is now legal" post... I guess they're conflating 'freedom of expression' with 'identity'? Nothing stops anyone from continuing with parody, although certain accounts ( Titania McGrath, I'm looking at you ) might be disappointed by the "forced spoiler warning".

In any case, it's simply about knowing how to get those guffaws. Take this guy, for example, threatening to leave for a better place... and that place is FB! Now that's comedy! 🤣


The clown prince of technology*, Elon Musk, recently completed his purchase of Twitter, to the delight of some, and the horror of others. We've had some very polarizing events in the last several years, and Twitter changing hands is no exception.

There was — actually there continues to be — much hand-wringing over the decision to charge a small fee ( $8 / month, USA reference cost ) to maintain or receive a "blue check", ostensibly a marker indicating that the user is genuine, but practically ( until this point ) an indicator of the user's "clout". Many of the blue-check "nobility" seem to protest too loudly about the cost; I'd bet a month's cost of blue-check that they're really upset because now even the grimiest guttersnipe with "unacceptable views" can be verified and parade their precious badge about the "town square", spouting off "problematic" micro-polemics that question popular narratives. x-D

Elon claims the scheme is two-pronged: (1) to help defray Twitter's running costs, and (2) to deter junk accounts ( spammers, scammers, trolls, etc ). The first rationale makes sense, and I can't see much wrong with it — well, besides alienating people who are ultra broke... although it was mentioned that the cost will be adjusted against purchasing power on a per-country basis, which seems decent. The second rationale is a bit more complicated.

The thing is, there are accounts backed by actual humans who are posting in earnest, but whose posts have almost no value. Take, for example, the ton of cryptoken "true believers" whose posts consist almost entirely of shilling their cryptoken(s) of choice — they must be allowed to post, if we are to respect the notion of "freedom of expression", even though they add little more to global consciousness than actual scammers. And they must be allowed to buy the blue check, because that's what free enterprise is all about: as long as you have the scratch, we'll sell you the goods, and we don't care what you stand for. The sword cuts both ways.

There are probably also dedicated trolls out there who have the budget to be "pro-am shit-disturbers", who will also opt to get the blue badge of "honor". On top of that, when it comes to trans-national political interference, governments will have no problem covering the costs for their "50-cent armies"; they'll just train them better, as 50 cents won't go quite as far now. :-D So who knows how effective this approach will be... but I guess we'll soon see. :-) At the very least, because it employs the economic version of the classic "death by a thousand cuts", it should obviate the most irritating junk accounts ( those that aren't individually tied to real humans with actual thoughts of their own ).

It's important to note that you don't need to get a blue check at all. You can keep using Twitter for free; you just won't get some extra features, and of course, nobody will think you're special ( oh no! /s ).

All that said, nothing limits you to Twitter. It costs so little to pay for your own website and domain, where you don't have to agree to an insane TOS that makes you the product ( at worst, some minimally-restrictive TOS that prevents criminal activity, which we can all agree is a reasonable restriction ), and then you can post whatever you like. Sure, you won't have stats showing how many sycophants are slurping up your precious nuggets of "wisdom", but is that really what you're about? Or is it good enough that you can have your say in cyberspace, and people can take it or leave it?

Of course, getting your own website will take a bit of time and effort ( oh no, learning! /s ), and too many people just want to pop a pill to fix their problems; let them eat Twitter! I'm happy to maintain my own site at a rough cost of just $25 / year — yes, per YEAR — and post whatever I want, without moderation, and without caring how many "followers" I have, because I believe what's important is not who says something, but what is being said.

It isn't even that hard to get your own platform on the web. If you're interested, ask me about it.

* I mean that in a gentle, playful way; my opinion on Musk is rather nuanced, but suffice to say, I do appreciate his antics :-D


Having all but given up on mainstream entertainment, I find myself using YouTube pretty extensively these days. It's also useful for education; I'm really getting into cooking / recipe videos lately.

Although YT has its share of political contamination [on the company side], it does seem to largely respect the idea of [creative] liberty, which is always a double-edged sword. By allowing controversial-but-good* content, it also allows, and — if you are paying any attention at all to reality — even encourages, what I consider to be straight-up trash. I have a particular dislike for creators that exploit viewers with psychological tactics to boost their stats ( with the hopes of cashing in ), especially those who use misleading descriptions or gratuitous thumbnails.

Fortunately, I'm rarely alone in identifying irritants in the world of tech, and even more fortunately, someone often comes through with a decent solution, in this case, a great browser extension to help filter YT's detritus: BlockTube ( available for Firefox or gChrome ).

Although I envisioned such a utility many years ago, it has been sitting on my long list of projects [that will almost certainly never see the light of day], and this excellent implementation is simple yet reasonably powerful, for local use. You can block individual videos, but more importantly, entire channels.

Since I tend to dream big, I'm also hoping eventually there will be a next-gen blocker that allows collaborative blocking ( ie. multiple people blocking a specific channel can be shared with a new user who can set a threshold for automatically blocking things that have been mass-blocked by others ). Such blocking could then also be partitioned by a topic, so subject-specific blocklists could appear and be used. For example, if someone is completely disinterested in cooking videos, they would "subscribe" to the "cooking-related" blocklist, and automatically have all cooking-related channels blocked, without necessarily having to do any blocking themselves.

In any case, blocking channel after channel is one of the most satisfying things I've done in weeks. :-D

* it should go without saying that what I call "good" is largely subjective


The more or less finished version is mk3, which uses very cheap COTS parts to provide the dual-purpose functionality of simulating both mains power and USB hardware replugging with near-zero-effort driver implementation for all modern operating systems at multiple scales.

Plan:

  1. Initial requirements
  2. Research into COTS parts
  3. Prototyping of initial design with first feature
  4. More COTS research, design revision, second prototype
  5. Testing of first feature with new design
  6. Implementation of second feature
  7. Testing of second feature
  8. Full deployment testing

The cost is quite low. Most components can be had for a few dollars per unit. One of the most expensive choices is enclosure. I opted for a "food storage container" with a snap-locking lid. This approach allows cabling to be pinched between the container and lid for support, and also provides quick accessibility for repairs or testing, something you always want in a prototype.

This version uses electromechanical relays, powered by the USB host, for convenience and affordability. Research indicates that an SSR-based relay setup would be far better suited to the task; the low switching voltages will increase the probability of contact fouling in the switching contacts of EMRs, but this prototype is not intended for long-term use; it's simply to confirm that the concept is viable. SSR-based modules are available, and require minimal retrofitting, so a better version can be easily built by simply increasing the budget.

The kernel driver takes the form of a virtual serial port, supported natively by many operating systems ( or at least widely available via the operating system's automatic driver installation technologies ) and often with a conspicuous name. My prototype has a serial translator chip that was already supported with no additional driver fussing on the GNU/Linux development system.

The classic problem of querying serial devices on a system with a grab bag of them notwithstanding — just make a config file and be done with it — it's trivial to implement a driver to support The Unpluginator in whatever application you like, in order to simulate common replug scenarios — something you want to properly test when working on industrial systems.

I'm happy to say that, given a full physical test with a bit of Python, it worked as well as expected. Since it has fulfilled its purpose as a demo unit, I'm considering this project complete. :-)


"What is my purpose?"

"You unplug and replug USB devices."

"...Oh my God."

"Yeah, welcome to the club, pal."

Presenting... The Unpluginator mk2.

Somehow despite caulking things up ( ha ha ) for two days in a row this weekend, I still had enough time to finish this little pipey, whose purpose is to emulate USB hardware hotplugging events via software, in order to automate some aspects of testing and automation control systems.

One of the key ingredients is the TS3USB221, which does a lot of the heavy lifting for a clean USB signal path. Another was a USB relay board that has a fairly simple API. These "building blocks" saved crazy amounts of time and effort.

The tricky part was, well, I'm not trained as an EE, so I had to learn along the way — par for the course, though, really. Luckily, the 'net came through with a few useful guides, and the device works as expected initially, so that's a good start.

The trickier part is making sure it's reliable. Is it really necessary to debounce the contacts of a mechanical relay that is switching a logic input? If so, is there a simple solution that mitigates the majority of problems? Do I have spare parts lying around to prototype it? :-D Lots to consider.

I decided to add an RC snubber that is "designed" ( ha ha ) to provide a roughly 10 ms "transition buffer" because I expect relay contact behavior to be a lot "cleaner" than human-activated mechanical switch behavior. This expectation is probably very naive. x-D A few preliminary tests performed without the snubber seemed fine as well, so perhaps the mux chip does its own buffering of the 'output-enable' input. In any case, the snubber is compact and modular, so I can remove it if it proves unnecessary.

The project is physically encapsulated in a transparent, easily-accesible compartment, with three external cables that have moderate support, so it can be transported without too much fuss. Neglecting my time and skills, the cost on this pipey is some $25 in new parts, a few "household bits and bobs", and a touch of Python or your preferred method for talking with a virtual serial port in order to control the device. It's a fun weekend project, once you have all the parts together. Let's see how it holds up to real-world testing, though. :-b

If this design passes muster, mk3 will include a secondary unplugin control for DC-power-in for self-powered devices, to extend automation to true cold-boot scenarios.

Astute readers will have observed that an SSR-based relay board would be a better choice, especially for reducing parasitic power loads, never mind the reduction in noise... maybe mk4? For now, I kind of like the clickety-clack; it lets me know the device is still alive without drawing too much attention to itself. :-)


My webhost has added secure-HTTP support at no cost to me. Sure, it took forever, but they were on it faster than I was. :-D So from now on, use https:// to browse my site to be sure nothing was sketchified in transit. :-)


Some people offer a "money-back satisfaction guarantee" for products or services, but there are some situations where money can't solve the problem, such as clobbering your OS while trying to install an update. That's where virtual machines come in.

On account of them being pretty good stewards of the project, I gotta give Oracle the nod for VirtualBox, for two main reasons: it's open source ( pickier criteria from various evangelists notwithstanding ), and it supports the majority of the "market" for host operating systems.

On GUI-oriented systems, it's easy enough to find ready-to-use builds via the Web, and for many Linux systems — those supporting apt, like Xubuntu — it's as easy as...

sudo apt install virtualbox
sudo apt install virtualbox-guest-additions-iso

The Web hosts a bunch of canned machine images you can use to get started quickly on a project. Try some of these:

  • https://virtualboxes.org/images/
  • https://virtualboximages.com/Free.VirtualBox.VDI.Downloads


My mediabox was due for an upgrade, but having been subjected to a bunch of experiments over the years, it was beginning to get a bit sluggish, so I decided to re-image it instead, and finally give /home its own massive volume ( something way, way overdue ).

Xubuntu has been good to me for quite some time, so I settled on 16.04 LTS and began the preparations. In short, make backups, then sanity-check your backups, then consolidate everything on the new /home volume, and finally install the OS on your root volume. I used to bother with customized bootloaders and separate boot partitions, but it's now so easy and reliable to boot from USB flash these days that a rescue disk is good enough, and it's rare that I run into serious problems anyway.

Now, in theory, in most popular installer shells, you should be able to pre-mount /home on the target volume, without losing any data it already contains ( of course, avoid naming conflicts, etc ) but in practice, I found the installer a bit clunky at partitioning and pre-mounts, so I opted to do things in a more staged ( read: safer ) fashion. I suspect there's a good chance everything would have been fine letting the shell do everything, but I have been burned in the past, so I usually proceed with caution if something smells off. :-D

After the new OS was up and running, I cloned my skeletal /home stuff onto the new dedicated volume, then modified my /fstab, having previously blkid:ed the future home of, ahem... /home. Then I rebooted, and threw a housewarming party for my new /home ( *sigh* okay, I'll stop x-D ). I could have just unremounted, but I wanted to check if there would be any issues on the next boot while I wasn't in a hurry. A quick tour around the place, and... no significant problems, huzzah! Now, I'm consolidating my user data, bringing back all of my original /home content, sifting through it as I go ( another thing that's been way, way overdue ).

As always, various things are breaky in the latest edition of an OS, and this time, the media vol-up and vol-down keys were not super stable. I researched it somewhat, and there are workarounds, but it's nice for such a helpful feature to work without a fuss. I remember when NetworkManager was pretty unstable, and it became quite nice over the last few years; I'm hoping keyboard media control keys become similarly stable. Even though many keyboards still don't have them, when available, they're terribly convenient. I mean, come on, even Bluetooth isn't totally effed anymore; support is now mediocre-or-better on many devices! x-D

Finally, we get to the point: one thing I forgot to take note of during the switch was VPN details. After getting my work-VPN going on the previous OS, I had long forgotten what special options were needed, and it took a few minutes to get things sorted, but the key was enabling MPPE ( Microsoft point-to-point encryption ), as the work-LAN is Windows-networking-based. Packets are getting through, so it's time to install Remmina and see if I can hit my desktop at work from over here.


Chips and Dairy makes the best lemon chicken in Ottawa.


I have been pushing myself harder than ever in meatspace and mindspace, and it has had nearly-indescribable results. I could relate "stories", but there's just no way to put into words the sensation of "getting one over on the universe" by striving.

Because survival modalities for H. sapiens have changed so radically in such a short time, I spend a good deal of time and energy on what is commonly called employment, for three reasons: to pay the bills ( in deference to the aforementioned survival modalities ); to feel as if I'm part of Something Bigger; and to Work My Craft.

I was drawn to logic and reason from a young age, so it's no wonder I have expertise with deterministic systems. I'll be frank, though: when quantum computing takes over, I'll be out of my element. I recognize the awesomeness of statistics, but always found it a dry subject; perhaps I haven't yet found a good Teacher.

In terms of physiology, I have sought advice from someone who is Living It, and although my approach is going to be unusual, the advice concurred with everything I've learned about biochemistry, which makes me confident in following it where it overlaps with my approach.

Essentially, I'm trying to mimic the continuity of reality, rather than take a discrete model approach. I perceive the body as incredibly dynamic and plastic, such that even a minute doing something this way or that way will have a meaningful, and often timely, effect.

My approach is not "right" or "wrong"; I'm simply experimenting with my existing understanding, and improving it with experience. And it has been a blast!


Touch-this, touch-that... it's okay, but when it comes to precision input, nothing beats a keyboard. Mistakes can still happen, but they are rare and quickly corrected on the spot. Touch-screen typing, while helpful in a pinch, is still a horrible experience, at least for me. One quarter of the time, the key I want isn't showing on the tiny screen, one quarter of the time, auto-correct fights me ( it's one of the first features I disable on systems I use frequently ), one quarter of the time, I miss the key I'm aiming for, and the rest of the time, it works "great".

So I like me a nice keyboard. A good feel almost goes without saying; it has to have standard layout, and I really insist on wireless at this point. A decent battery life helps, and if it has illumination, that's gravy. Logitech comes through again with their K800 ( possibly only available paired with an M310 basic mouse, mind ), which has all the aforementioned features, including the gravy. I usually set up a virtual mouse on the number pad, because most times I don't want to switch devices to reach fancy GUI widgets that the devs forgot to bind to the keyboard. :-b

Since I'm not a gamer, I can't comment on the latency of the K800 and M310, but I can say the radio connection is quite reliable, the single dongle is convenient, and after using a K800 nearly daily for at least a year, I can recommend it as a high-quality wireless keyboard for mediaboxes, home theatre setups, terminal windows, software hacking, virtual desktop clients... in fact, pretty much everything.


Sure, animals are alive, but us — the humans — we really live.

Or do we...? :-o

Whether or not free will is just an illusion is a concept that is explored perpetually by authors and multimedia producers, but it's even cooler when there is a connection to meatspace.

This study involving the red circles is interesting because it samples actual human behavior — notwithstanding that labs are "unnatural" environments — and compares it directly with deterministic models like probability theory. Cool shit. :-)

There's a Rammstein song that I'm reminded of, called Ich Will. Maybe on the heavy side for some listeners, but I think if you can handle most classical music, you'll manage. :-D The lyrics are beautifully simple; it's a sort of... "vivisection of the ego"? Those harmonizing synth pads are amazing. Again... keeping it simple is key here. Rammstein are among the most skillful modern rockers out there.

P.S. What is with this still-cold weather?! Maybe it's time to visit a warmer climate. :-D


I am divesting myself of material clutter. The weather is alternating between rain and shine. I found some great music to match it, as I get things done around the homestead.


I used public transit to get to work today. On the bus, I coughed into my hands, a habit of the "cultural knowledge" of my youth, a pattern of some of my earliest social programming. When I was a young, impressionable human, I was told "cough into your hands" by older — and presumably wiser — members of society, those whose patterns I imitated to learn how to be "polite". It was so ubiquitous that I never gave it much thought, even for many years; I figuring it qualified as one of those "good enough" things in life. :-D

Alright, fist-cough equals good, but it turns out there's something even better: elbow-cough! That's right, coughing into the crook of one's elbow. Indeed, that target is less likely to come into contact with the "public surfaces" we often share with each other using our hands, never mind the rest, ha ha! It was also a practical way to way to reduce the spread of airborne ailments. Someone told me about the idea a number of years ago, but as an adult, it can take a while to reprogram really long-held habits. >_<

So as I'm getting ready to transfer to the train, this older dude approaches me a bit hesitantly, and asks for a minute of my time to talk. Pragmatically, no, I'm on the way to grab a train to get to work on time; realistically, though, who am I to reject probably-honest* communication from a fellow human in a non-emergent situation? I moved out of the flow of human traffic, offering an inquisitive expression. His deal was that he wanted to tell me about this cool new idea — from his perspective, I probably appeared entirely unfamiliar with it — called "coughing into your elbow", and I thought "oh, riiight!", as the memory of the fist-cough I'd performed near-unconsciously now pervaded my consciousness. So I listened in earnest to his brief exposition and thanked him for taking the time to say something. I still caught my train, but even if the delay had forced me to take the next one, I would have thought he was doing the "right thing".

Sometimes I forget. Don't be afraid to remind me. :-]

* really important; I think lawyers call this "good faith" behavior


The nice thing about getting to work too early is that the music can be cranked way up. And it's Friday to boot!

Hmm... also just recently checked my site in IE ( by accident ) and version 11 has an anchor rendering bug. Bahahaha! No wonder that codebase was abandoned for Edge. :-b


My career has mostly been about making bits dance. Until recently, I did a lot of sitting down on the job, but shortly before the holiday break, my employer got me a standing desk. Add some psytrance, and now I can do some dancing of my own. *mumbling something about it also being healthier* :-]

As with most new things, the first few days were difficult, but we get used to everything, don't we? One of the sweetest improvements the standing desk brings to the table ( ha ha ) is the elimination of the chair-jostling and neck-craning that used to accompany most code reviews.

Now I work on my feet most of the day, every day. Once in a while, though, the ol' legs are just dyin', and this desk offers some respite, as it has [motorized] adjustable height. It's very stable, and pretty sturdy — almost too good to be an IKEA product. Oh snap. Anyway, if you're looking for a standing desk, you could do worse than this model. It's called Bekant, and it's starting to feel familiar already. ;-)


Recently, I started looking into the ODROID hardware line. The XU4 is a pretty decent setup, and although I am not a fan ( hah, wait for it ) of tiny hardware footprints that need active cooling ( oh snap! ), the standard case makes it a reasonable option for "rough and ready" setups of all kinds. A mediabox should really be passively cooled, or at least use an extremely low-noise active cooling solution. Note that many users of water cooling report being able to the hear the noise of the pump, not a substantial improvement over the fan noise of most active air cooling solutions.

Unfortunately, even during "GUI idling" on the default Ubuntu variant ( Lubuntu ), the XU4 engages its not-exactly-quiet fan every few minutes, for only a few minutes, in a rapid on-off cycle that is unsuitable for "ultimate mediabox" scenarios; it could be placed in a muffling device, but that would likely reduce its cooling capabilities to the degree that processor choking or outright safety shut-off could occur, depending on the processor's capabilities. In my initial tests, I observed that core seven ran much hotter than the other A15s, despite a balanced load, perhaps because of its location on the chip die being least favorable for heat dissipation.

The XU4 manages the "300 pages of nonsense" test fairly well in the default AbiWord word processor, allowing reasonably-fast insertion and deletion of text "on the spot", as well as reasonable copy and paste times, and near-realtime scrolling, even at full 1080p resolution via the onboard HDMI output.

Speaking of HDMI, the Lubuntu distro for this platform has sound issues. Sure, a USB analog audio interface can be attached, but if an HDMI monitor with speakers is available, it would be nice to have that working out of the box. It's just a matter of time: either I figure out a fix, or a fix becomes available on the 'net. Still, that's not incredibly user-friendly for a number of applications. Frankly, I'm not sure if this thing is beastly enough to serve as a full-on 1920p mediabox, never mind 4K ( arrr, standarrrds, they always be a-changin'! ). Further testing pending on that front, I guess.

Secondly, while sound is important, video is arguably even more important, and unfortunately, the current video drivers are not sufficient to play typical YouTube videos, at least via Firefox — although they are somewhat instructive for video encoding concepts. :-D

If the sound and video issues can be fixed easily, so everyone can start with a standard known-good basic system, then the hardware and the default distros are suitable for many special-purpose hobbyist or artist installations, like a video game cabinet, where much of the software can be cobbled together with basic CLI skills, and where fan noise might not be so significant.

All told, I'm not convinced that fist-sized thin-client hardware like this is quite ready for mainstream deployment, but the era of the nearly disposable "pocket PC" is approaching. If a standardized OS encapsulation layer can be developed, the idea of the PC will fundamentally shift toward the value of the organized dataset itself. The "playback / recording" device will become fully commoditized hardware.


The Wendelstein 7-X was fired up for the first time yesterday, and we're all still here. Furthermore, it seems everything went well. Huzzah!


Do you like old-school Infected Mushroom?


I use a mouse and keyboard a lot at work, and although I much prefer the keyboard, the software I work on is very GUI-oriented, which means a good deal of mousing. Consequently, I'm interested in finding a mouse that is friendly to my skeleton, ligaments, tendons, and muscles. I have fairly large hands, and finding a good ergonomic mouse has proven to be a challenge.

Some years ago, I tried the Evoluent VerticalMouse, but the height interferes with my frequent jumping between mouse and keyboard, so I returned to a regular mouse, and kept a lookout for other interesting designs. After recently upgrading some of my HIDs at home, I resumed my search for an ergo mouse to use at work.

The first one I tried was the HandShoe mouse, designed by Hippus NV, but it didn't live up to the hype. The designers made the strange choice of placing the highest point of the housing directly under my thumb's proximal knuckle; after adjusting my grip for that, it was pretty comfortable while at rest, but what really matters is movement, and that wasn't so good; involving my entire arm — even my shoulder — in mousing is not any kind of improvement. Although it had no driver issues, and some good features, like low-force button switches, the overall design concept failed to pay off.

I'm now trying the [large, wireless] Newtral 2 mouse, and it's not bad, but neither is it great.

When I plugged in the wireless receiver, it wasn't recognized as a standard HID device, although it started to work after a reboot ( notably the first HID I've ever seen that required a reboot ). Not terrible, but I wouldn't classify it as a typical "highly compatible" HID that I would trust to carry with me for use on other systems.

Although it has basic three-button support, its six buttons can be customized, but that requires additional software, which can be found on the manufacturer's website. I installed the utility without a problem, but it appears to want administrative rights, which seems a bit ham-fisted to me; getting it to launch automagically on boot will take extra effort. More importantly, when I run it, I get a system tray balloon that simply says "Warning", and when I dismiss that, I can click on the systray icon, and I get another balloon that says:

Warning
The system did not detect the gaming mouse!

Uh, gaming mouse? Alright, whatever. A right-click on the systray icon brings up a context menu with a single option: Exit. So it appears that I can't take advantage of the programmable buttons. Dag. For reference, my workstation is running Windows 7 x64 Ultimate SP1 ( with SharpEnviro alternative shell, though that shouldn't have any effect on peripheral support ).

One last logic-side niggle: there's a power-saving feature that sleeps the mouse when it is idle for a while, and that's cool, but other mice I've used with such a feature "come back" simply by wiggling the mouse. This one requires a button click, which isn't totally unreasonable, but it's a level away my natural inclination to just "shake it awake", and comes with that uneasy "will that click bubble into an app and do something undesirable?" feeling.

As for the physical aspects, it's definitely more "wieldy" than the HandShoe was, and feels like a typical mouse but with the benefit of the more relaxed wrist angle, one of the main things I'm looking for. The weight is good, light yet substantial, and if necessary, I can easily pick it up with a gentle pinch of my thumb and pinky. I tried the interchangeable flanges, and I find the "non-flange" the most comfortable.

The button action is rather stiff compared to what I'm used to ( mostly Logitech products, the Performance MX model being a favorite ) and also a bit on the loud side, but it's something I can get used to. Unfortunately, a seemingly common theme among mouse designers is rearward placement of the scrollwheel, and the Newtral 2 is no exception; with a "full resting" grip, the wheel is behind the distal knuckle of my middle finger, requiring my middle finger to arch significantly to use the wheel. In addition, the thumb well contains a set of protruding vertical ridges; I don't know what their intended purpose is, but they are irritating to the pad of my thumb. In order to avoid these two nuisances, I find myself sliding my hand back, off the mouse, returning to the "claw" style I'm trying to avoid in the first place.

Perhaps the most disappointing physical feature of the Newtral 2, because it's so easily avoided by choosing a high-quality, marginally-more-expensive part, is the mechanical power switch on the underside of the mouse. I like to switch peripherals off when I leave the office, but this switch is so dad-gum difficult that I almost need a tool, like a small flat screwdriver, to work it, which disinclines me from using it, even though it'll require me to change the battery more frequently.

The other mouse I was looking at was the Goldtouch KOV-GTM-B. Frankly, it looks so similar to the Newtral 2 that I wouldn't be surprised if they are designed by the same firm, and manufactured by the same Chinese factory ( the Newtral 2 claims Canadian design and Chinese manufacturing ). Still, it appears to have some design choices that may suit me better: the scrollwheel looks to be further forward than on the Newtral 2, and the thumb well lacks those stupid ridges. If the buttons are nicer, it might be worth another switch.

Perhaps I should be looking into a different type of tracking technology altogether. :-D

Addendum, 2015-December-6:

Communication with the manufacturer revealed that the Newtral 2 configurator only works on wired mice. Not the worst thing, but still disappointing.


Strong AI won't be a gradual thing, like electrocomputing technology. The instant it Is, it will radically transform society, and humans will be the Rate Determining Step in nearly everything. Are we ready for this? I think in order to be ready, we all need a better understanding of technology. Not a specific technology, but what technology itself presents and represents.

In any case, I don't believe in a "Skynet" future; in fact, rather the opposite. Think about the "best" human you know, and picture them dealing with something difficult, like delivering a baby in a taxicab, or witnessing a rabbit hit by a car, or being held hostage. Most would say that person would do their "best" — and most would probably even agree, at least loosely, on an expected outcome, that is to say, something "good".

If strong AI lacks the physical compulsions that often drive us to do Stupid Things, it could become the best best "lifeform", seeing us non-judgementally as inferior, and thus Worthy of Care, just as most of us do the "lesser creatures" around us. Would it not seek to give us the healthiest diets, the most inviting exercise and play spaces, creative zones, achievement zones, and all manners of Good Human Stimulation, just as the majority of humans give their pets a "good life"? If given a physical manifestation, a strong AI would certainly not feel threatened by us, and it would understand Machiavelli's lesson. As for us, feeling our best, it would be easy to understand the symbiosis and its harmony, and we'd probably feel reluctant to revolt, because the machine's "heart's desire" would be to bring us as much joy as we could handle. We could probably even convince it to take us to the stars.

I normally have a realistic — if not pessimistic — outlook regarding human technology, but strong AI will be able to combine perfect willpower with an understanding that humans have value simply through making existence more interesting for other lifeforms — including itself. Having no need to "accomplish" anything, it should be perfectly "happy" to serve its creators in the most complete demonstration of unconditional love humanity will ever witness. I recently found a beautiful song that embodies this feeling musically, for me.


My first exposure to microwave ovens was typical: my family got one of these time-saving contraptions when I was still a child. Having no idea how it worked at first, but seeing what it could do, I wondered if I would ever live to see a machine that did the opposite — rapid chilling or even freezing of food and liquids. I dubbed this theoretical device the unmicrowave.

A number of years later, as the fragments of my understanding of physics began to coalesce into a more useful whole, and the operating principle of the microwave oven became clear, it dawned on me that it would probably never be possible to build a device that worked the opposite way.

Some years after that, however, when I began to learn more about the interaction of photons and electrons, and the partial-charge behaviour of shared electron orbitals, it occurred to me that not all hope was lost, although I knew I had to give up the idea of some sort of realtime processing. Success would depend on a physical effect that had yet to be formalized.

Now researchers have shown some promising evidence that confirms that it is possible to directly use energy to remove energy from a system, even if just on a rather small scale for now. It still seems unlikely that we'll ever create an affordable, energy-efficient device that "calms down dem mawl-uh-kyools" to provide "instant ice" and sich, but I'm actually slightly less skeptical about it now. :-D


The past week has been weirder than usual, but today, I discovered the Inner Laugh. :-)


I am seriously getting back into reading. I think we're all told how great "social everything" is so much that it can be easy to forget to set aside quiet time for oneself, for activities that really only work in solitude.


Today's civic holiday is a good opportunity to continue learning about Arch Linux, a distro that has been around a while now, but which I only looked at very briefly at first. I'm using the Raspberry Pi platform to investigate Arch more deeply. It's a pretty good distro, and its package manager, appropriately and amusingly named pacman, is quite helpful, with a mercifully short learning curve for the basics, but a wealth of potential options for advanced use. As for startup, I'm really on the fence about systemd. It's probably overall a good thing, though, in that it's practical right now; one of those instances of "don't let perfect be the enemy of good."

On my mediabox, I'm still running Xubuntu. It's probably due for a system upgrade, but before I bother, I'll probably look into switching to Arch after I've perused it on the Pi; I only need basic stuff anyway: sound, video, codecs, utilities, secure networking, and possibly some SSD tuning. And of course I'll want VNC support, but that's usually pretty straightforward. The X/desktop environment will need to be built first. The cool thing about having to choose a window manager is that you have to choose a window manager. :-]

Oh yeah, and after setting up my various favorite machines with keypairs for ssh, I no longer have to fuss with passwords, which has me occasionally kicking myself for not doing it sooner. >_<


It's been about three months since I stopped feeding FB. I checked my messages every few days at first, then once weekly, and then... whenever. I wasn't a heavy user of messages to begin with, and people were willing to be patient for responses. Meanwhile, my SMS usage increased, and although some people still prefer to use FB for messaging, my replies could be expedited with a "poke"-SMS. Miraculously, SMS is the only medium that, for me, remains largely and mercifully unafflicted by spam.

Due to the time freed up by not surfing FB, I've returned to working on music more seriously, and also working on various software-based experiments. I played around with HTML5-canvas and programmatic SVG; both are pretty cool and seem to be fairly well supported on mobile devices. A little while back, I started working to make this site mobile-friendly. Google says it is.

In other news, I recently dropped Bell Mobility because their network kept dropping my calls. Even though I made a reasonable attempt to get them to investigate and tried to be as helpful as possible with my reporting of the situation, they weren't interested in solving the problem. I guess they figured I would just eventually accept it. Overall, my experience with Bell was fair-to-poor. They may have a large network, but in practice, it's not any more reliable than competing networks. Their pricing is exorbitant, and although individual agents vary, the overall customer service is attrocious.

I tried Skype for Mac today... too bad it still sucks. Constant drops and reconnects, audio only plays out of the right speaker, massive echoing, weird ghostly silences — where's my white noise? — and even basic text chat problems. A shambles, I tells ya.

Well, it's mid-2015, and still no proper flying cars, but self-driving cars are developing nicely, and they're an essential step. :-)


A few months ago, I picked up my neglected guitar for the first time in... probably years, and practiced for about... five minutes. Then, just yesterday I got it out again, for another five minutes of practice. You think I'm joking, but it was literally no more than five minutes.

Today, I was struck again by the urge to play ( based on yesterday having produced the seed of an idea for a song ). So I sat down, somehow remembering what I did yesterday ( I've opted for the fly-by-the-seat-of-your-pants method for now ), and lo, I entered that zen-like state where I'm no longer thinking about playing, I'm just... playing. I'll admit, it was quite a thrill.

So now the only question is... do I really have time for *another* hobby? :-D

Maybe I'll just try to do five minutes practice here and there. ;-)


In this universe, redundancy is usually a fairly simple and effective strategy for dealing with non-determinism. For example, a physical hard drive might fail at any time, so one of the simplest solutions, RAID, is still one of the most widely used for high-availability systems. What about Internet connections?

I have DSL at home. Most of the time, it's solid, yet it depends on a physical network of copper cabling, which is vulnerable to extreme weather, or doofuses that dig before calling. That's beside the fact that the modem itself, although solid state, is still made of physical components that can fail. If for any reason, my DSL goes offline, it would be nice to simply swap in some other device to provide a WAN uplink.

Recently, my DSL failed. Finally, it was my smartphone's time to shine! It can create a WiFi hotspot to share its data uplink — but not all the PCs in my LAN use wireless, plus I ddidn't want to go about reconfiguring things either. Ah, but what about the USB tethering feature? As luck* would have it, my router has two USB ports, and can run third-party firmware. I've been using Tomato for a number of years now, and it has performed extremely well, so I was primed for a solution that would let me keep Tomato.

Luckily, someone had been developing a fork of the TomatoUSB project — itself a fork of the original Tomato — called Tomato by Shibby, which provides a fairly easy-to-understand architecture for handling USB devices, and which I'll refer to as TbShibby from here on out. It even includes extras, in particular, the kernel modules needed to get the phone to work as a WAN modem, using its packet radio service.

In order to get the router to notice the phone-as-modem, some additions were required. Here's the list of drivers needed:

insmod mii.ko
insmod usbnet.ko
insmod cdc_ether.ko
insmod rndis_host.ko

Just add the above lines to the Init script at /admin-scripts.asp in TbShibby's HTTP configurator GUI to have the router automagically load these modules on startup.

Now, after I had determined the required additions, there was a problem: in the builds available to me, it appeared the rndis_host.ko kernel module was not included, the main file system was read-only, and I didn't want to go to the trouble of building my own environment and toolchain in order to rebuild the .trx firmware image. I might have figured out a way to place the missing file(s) on a USB stick that would permanently occupy one of the ports, but that's just... ugh.

It seemed likely that there was a typical file system in the image, so there must be a way to extract the image contents, modify something in the extracted copy, and rebuild everything back into an image, for easy uploading to the router.

Sho'nuff, my quest led to firmware-mod-kit, a rather vaguely named but ultimately helpful project that fortunately kept old versions of itself in the main package; these old versions were less finnicky than the current stuff, and it was them that I built and used on the spot. Dependency problems reached no higher than the level of "easily solved annoyance". :-)

Testing with my phone indicated that a new device usb0 was available after USB tethering was activated. There remained one thing to do: automation based on plug state change. Basically, when the phone is plugged in, it takes over the job of WAN provider; when it's unplugged, the previous provider, such as a DSL modem, resumes operation.

Initially, I contemplated writing my own script, but I also expected that I wasn't the first to tackle this mission, and once again, fortunately discovered this script** that monitors for USB tethering, which was the basis for what I am running right now. My DSL is still offline, but now my LAN is none the wiser — well, until I hit my data cap! :-D

* heh, luck, right... like I don't overthink my gadget purchases! :-b

** original link, now broken: http://tomatousb.org/forum/t-259025/usb-android-tethering-modules#post-1973086


I'm on preventive antibiotics following a dental surgery. Last night, I ate some mango and the darndest thing happened: a large thumbprint-sized patch of skin below my right eye and toward my nose swelled up and turned warm and pink (think hives).

I've eaten mango before without any incident, but I decided to research mango further anyway, and it turns out the tree parts and skin of the mango fruit contain various irritants that some people are allergic to. I suspect my immune system normally handles these things without incident, but because it's being modulated by the antibiotics, those irritants were able to trigger a kind of false-positive inflammatory response. I checked on it after some research and it looked about the same.

I continued my research, and came to the conclusion it would resolve itself fairly quickly, and at that point, it already appeared to be lessening. About thirty minutes later, it was impossible to tell there had ever been anything unusual happening on my face recently (although I managed to take a photo earlier).

So, now I know that some people can have sudden immediate first-time allergic reactions to [poorly processed] mango. Oh, and I had to chuckle when I learned that one of the symptoms was anaphylaxis; if that had been my lot, I wouldn't have had time to read that far!

Also, in my research, I happened upon an excellent protein called Langerin which may help protect our bodies from some viruses. Cool stuff!


Amazing luck! Tickets (Josef-Ashton Summs) was able to pay me a visit tonight, and I was introduced to the magic of Cubase. Now I'm thinking more about my options in terms of virtual gear. I have used Reason almost exclusively for many years, because it had everything in one place, but it's always good to investigate other tools, techniques, etc. :-)

Tomorrow, he plays RN, and it sounds like a great evening planned. Team Quato will be there too, mixing it up. The schedule was been slightly weirdened, but it actually sounds like a good idea. See all y'all there tomorry who's goin'!


I had a lucid dream.

I'm not sure what to make of it, but I'll share my experience. I'm a fairly skeptical person when it comes to metaphysics, so I believe this was just my brain being loopy.

It was early afternoon on a day off from work, and I was reading about other people's lucid dreaming experiences, and methods they used to induce "consciousness inside the dream". After a while, feeling unusually tired, I looked at the clock, and seeing that I had plenty of time before the evening's plans, I decided to take a nap, something I rarely do.

I was only planning to sleep for about an hour, but I hadn't set the alarm, figuring my body would wake me when appropriate. After what felt like an hour's worth of sleep, I came to, and the first thing I noticed was that my body felt weak; every muscle felt as if it hadn't been used in years. Maybe I'd overslept? I strained to look at the clock. Superficially, everything was in focus, but the numbers on the clock were blurry, jumbled, swimming — nonsense! It was then that my brain, which had initially written off the muscle weakness as "grogginess", told me, "you were just reading about this... you're still asleep!"

Until that point, everything had been cool, but the moment recognized my conscious state in the dream-world, I became aware of "something else", what felt like two "minds" outside my own, seemingly "alerted" to my discovery. Without understanding how, I felt that they intended to find and take hold of me, and eject me from the dream-world. An instant later, I felt something grasp my dream-body, as if by the shoulder or scruff of the neck somehow ( not painful, but a firm grip ). "NO!" I cried out in my mind, "I want to explore this place! I won't harm anything!" hoping the others would give me an opportunity to plead my case — but vocalizing anything felt impossibly difficult. The others never spoke, simply radiating a mental impression of emotionless duty; they were simply "doing their jobs" like some kind of "dream-world security guards". I felt myself being slowly but inexorably pulled backward and upward, as if out of the realm of dreams, which appeared to stretch below me, as if connected to reality by some rubbery nexus. My dream-body still felt too lethargic to resist.

Now, I knew there was no one else at home when I'd drifted off to sleep, but this was the dream world — maybe there was someone or some...thing that could grab me and pull the other way, maybe even overpowering the others, to allow me to stay for a few minutes of free exploration, to learn how to walk, talk, etc. Breathing in as deeply as possible ( at least with my dream-body ), I let loose with all my force — or so it felt — and produced... a tiny croak, maybe a fraction of a second in duration. The resulting actual physical sound, despite being so very faint, snapped me out of the dream-world instantly, so fast that I woke up mid-sound to hear the end of it. I immediately thought of checking the clock, lifted myself up with ease, and read the time clearly. Yup, reality again. I'd been asleep for about an hour.

I recalled the various things I'd read earlier in the afternoon, and then reviewed the experience, reflecting on how it had felt like I was in some other higher-dimensional reality, where the laws of physics might have been less strictly-defined or limiting.

( This entry is dated the day I wrote it, but the event happened last Autumn ).


Good idea: YouTube recently disabled public display of tags; a simple change, which causes the least disturbance, yet is still effective for solving the problem (abuse of the tagging system).

People can be slow to adapt to technology, at least compared to the speed at which some technology is developed. The most successful technologies requires not just a material solution, but ways to avoid harm to the user and abuse to others. Many times, the material part of things (device, software, etc) will be completed before the human-interface/-integration part is sorted out. Firearms are an example; they already exist materially, but some people still aren't entirely settled on how they fit into our lives. Even nature makes "technology" that some societies find difficult to integrate. And now, a case in point: tagging.

Tagging (on the Web, keyword or keyphrase metadata about the content of media) is a very simple concept which has existed for years on much of the Web, yet most people, when given the opportunity, don't bother to use tags effectively (versus simply using tags at all). Tagging technology has, however, been warmly embraced by the sketchballs of YouTube who want to exploit the popularity of videos that have risen to fame by having [presumably] legitimate value (that is, as demonstrated by view counts, ratings, etc). This sort of abuse renders the tagging system largely ineffective. The simple countermeasure of hiding the assigned tags curbs that sort of abuse without significantly affecting functionality of any systems that interface with it. Just as importantly, honest users can still tag things as effectively as before. :-)


I finally joined FB a few months ago, which is why the blog has been so quiet. I gave it a good shot, but ultimately, I found too many things (interface, constant changes being pushed on users, etc) I didn't enjoy, so I'm resurrecting the blog. Another important distinction is that it allows anyone to see my "status updates" without needing to sign up for anything. I'll still check messages on FB, etc, but my "serious" writing will continue to be posted here.

Astute individuals will notice the design/layout has been changed (for change's sake, of course!). ;-)


Electronic Brain was a superb kick-off to the 2012 festival season.

The music was fantastic, as was the deco. The campground was beautiful, complete with a semi-natural pond in a rock depression. The layout was very, ahem, "organic"; the best way to navigate was by landmarks. Luckily, the skies were relatively clear all weekend, and the moonlight was sufficient to make out most of the terrain at night. The two stages were opposite each other, across the main roadway, making it easy to travel from one to the other for a change of vibe.

A goodly number of Ottawa people ended up camping on a hilltop/plateau with a sweet breeze, beside a chalet with the most gracious neighbors (thank you again!). It got pretty cold on Friday night, but Saturday, the sun blazed in all its glory, and the "villagers" congregated under the sun shelter I'd brought, which a certain festival elf improved by lending her blanket as a temporary side wall.

I was hoping for a sunny, rain-free weekend, because my tent was set up on a slight incline, and I wasn't sure how well it would respond to a downpour. :-) Luck was with me, because the weather stayed beautiful all weekend. Well, actually, Pirate Pete called for rain at 4am Monday (he has seafarer's intuition), and lo and behold, there was a sprinkle of about 40 drops of rain at the appointed time! Not sure if that's enough to qualify as actual rain, but it was amusing nonetheless. :-)

One of the big draws for me at this festival was a live act from Quato (local dudes Manu and Pete). Unfortunately, because I had dawdled in setting up camp, I missed some of the set. Doh! Still, when I reached the main stage, their music got me right into the swing of things. After their set, they were totally giddy with excitement (and possibly a touch of alcohol, hahahahaha), milling about on the dance floor. Pete did some "stampa" (proof somewhere on YouTube), while Manu and I talked about music production.

The main attraction (for me) was the live PA from Broken Toy (James Copeland), all the way from South Africa. Long story short: James broke the funk-o-meter, I danced like a loon, and nabbed him afterward to give him props and a tee-shirt. Awesome sauce.

I was also excited to see Super Evil (James C and Adriano Rodrigues), but they were delayed by a technical problem (not their fault, as I understand, but these things happen), resulting in an impromptu hangout with the two and a small group of assorted festival-goers at the other stage, where James told us something scandalous (ha hah!) about his musical career. After some banter, we all agreed it would probably be a while before things got sorted, and the group dispersed, with hopes that a workaround could be found. And lo, someone came up with a solution (never found out whom, but thanks, whoever you are), and thus it was that I got to hear (and see) 'Brutal Train Blues' right in front of my eyes. Big ups to James and Arno for making the trip!

Sunday night was magical forest psy night. I was hanging out with Jan (this was her first festival) and we met Oleg (from TO) on the way to check how the second stage was doing. He shared his pineapple juice with us (everyone knows pineapple juice is the best) and joined us in our mission. We arrived to discover that someone had sorted the generator (which had been malfunctioning earlier in the day) and there were dark and foresty sounds cranking. Result! DJ Psygourmet was the stand-out act of the night, mixing up a sweet selection of swirling psychedelic sounds as we danced, awash with moonlight, among the looming conifers.

This year, I had resolved to regulate my sleep and water intake more carefully. In doing so, I had consistently high energy levels while roving about, and slept fairly well during down times. I also gave "instant meal in a pouch" camping food a try (it's... okay).

The blackflies were in full effect. I'm pretty sure this was my first serious exposure to them. While the bites do hurt (and itch somethin' fierce!), the flies were some of the slowest and dumbest "offensive" insects I've ever encountered. They tended to crawl around a lot before biting, giving one ample opportunity to thwart their plans, even if just by brushing them off. :-)

All told, despite some glitches, a most enjoyable fest!


Apparently, bright yellow was a difficult color for artists to get ahold of until the 19th century. Nowadays, you can get any hue you want, and it's cheap to boot. This made me wonder about similar "sets-with-missing-elements" in the present that may be completed after my macro-soma has macro-apoptosed itself. I lived before and after the time of [proper] blue LEDs, and their results (e.g. tons of gaudy electronics merchandise, and eventually, my current handset's color display). I wonder if van Gogh was one of the first to find a cheap hook-up for yellow. I can't help but notice we still don't have any flying cars (sorry, Moller, you're still R&D:ing).

In the present, it's almost impossible for someone to tell us "no" if we want something badly enough. Hell, you can experience zero-gravity. You can accomplish what you want. Sit down. Stew about it for a bit. Really think about what you want. Then go out there and get it! You totally can. It's difficult, and it'll take time, but you can live the life you want to. Remember, however, that your actions have consequences, and you're not the only one on this planet. Let's all remember to consider others, shall we? :-)


One nice thing about the Internet is that now, when you are just about to hack something because it doesn't do quite what you need yet, you can do a quick search and see if someone else has already taken a crack at it. The downside is that most hacks are intended to solve the local (hacker's) problem, and thus the hack may not work on other machine configurations (even if they're not particularly weird). The upshot is that some hacks need to be hacked, but the good part is: [computer program] code is eminently hackable! :-]

In this case, I'm looking to automate a tedious graphic design process in version 2.6 of the GIMP, and I found a potentially useful script-fu "plug-in" which should have worked as is, but I had to make a small change to get it to show up in the GIMP's menu listing.

Here's a sort of patch to illustrate a solution:

--- random_density_map.scm.original
+++ random_density_map.scm
@@ -130,7 +130,7 @@
 )

 (script-fu-register "script-fu-random-density-map"
-                    "/Filters/Map/Random Density Map..."
+                    "Random Density Map..."
                     "Draw a specified number of random points with the currently selected brush, using a density mask."
                     "Rob Antonishen"
                     "Rob Antonishen"
@@ -145,3 +145,6 @@
                     SF-ADJUSTMENT  "Border Margin (pixels)"       '(0 0 100 1 6 0 0)
                     SF-ADJUSTMENT  "Bailout Threshold"            '(200 100 2000 10 100 0 0)
                     )
+
+(script-fu-menu-register "script-fu-random-density-map"
+                         "<Image>/Filters/Map")

The modified script can be placed in your user-scripts directory (e.g. ~/.gimp-2.6/scripts). I discovered the solution the lazy way — by looking at the structure of an existing working plug-in. ;-) After I got it working (the new item shows up under sub-menu Maps), I tried it out, and it turned out to not be quite what I'm looking for. :-b Still, this little hint might help someone else. :-) "And still, the search goes on..."


Okay, last night was surreal and fun-tastic as hell. It all started with an afternoon nap...

I've been pushing really hard at work on some urgent projects lately, so my sleep patterns have been, let's say, mildly abused. Normally, I don't need a whole lot of sleep, and I almost never take naps, but after work on Friday, I came home pretty beat and set an alarm (just in case, ha ha!) just before laying down on the sofa to see if I was truly tired. My mind was still quite active, especially with my eyes closed. Now, my couch may not be flashy, but it is very comfy...

It was dark when I awoke, and I saw I had only half an hour of dawdling time left. Wow, guess I needed that! Either way, that nap was like a natural dose of amphetamine, because I was wired for the rest of the night, until getting home around 0900 (I'm often pretty stomped out by the end of RN).

I listened to my latest track on the way downtown. When I make electronic music, I listen to it again and again (especially on as many sound systems as possible), noting areas that need improvement, or hearing new ideas forming on top of what's playing. If I'm particularly inspired, I whip out this little app called Caustic and I make some "musical notes". Anyway, I'm really stoked on this track, and want to finish it up soon, so I made some mental notes of changes (all these different kinds of notes, eh?), and then I listened to some psytrance favorites. My phone and Bluetooth headphones both play well with others, so together, they're pretty stable.

I reached downtown in good time, and wanted to hit a bank machine before meeting up with friends for the first part of the night. I'm still getting used to the quirks and outright design flaws of my phone, so I still don't trust it that much, but I try to give it a chance when it seems appropriate. There, amongst the skyscrapers, I whipped it out (ha ha!) and turned on the GPS so I could let the mapping application find me, and then I could ask it for the nearest bank machine affiliated with my bank, or at the very least, a functional IOO cash machine. The search "worked", but the three "nearest" locations were at least 10 blocks away in any direction, and I didn't feel like walking that far, so I ventured into a nearby corner store, and found, much to my pleasant surprise, a bank machine affiliated with my bank. 'Tonight is going swimmingly,' I thought. I also thought, 'Brain: one, phone: zero.' Locally wealthier, I headed off to meet up with friends at the pub for phase one of a most excellent Friday night...

...I wasn't able to make it to RN (phase two) until a little after 0100, but I had a great conversation with the cabbie on the way, which kept building my energy. Arriving at Eri, I felt like a puppy that runs around and "says hi" to everyone by licking them in the face. Note, I didn't actually get that rowdy, I just felt that way. ;-b

The place was pretty full, but there was still room to move about the dancefloor with ease — pretty much my favorite density level for an indoor psytrance event.

Now, I gotta put in a word about a buddy of mine, who does the visuals now and then at RN. I like what he adds to the vibe, and last night, in particular, was a great example. He (probably with cooperation from the DJs) had taken the effort to synchronize the visuals with the music unmistakably (you know, sometimes it "sorta works" but not really) for at least one track, and I just loved it! Thanks for helping create a fun atmosphere, bud! (If you recognize yourself in this story, and you want your name emblazoned on the Web for all time*, let me know).

* or until I can't afford $12/year Web hosting

Phase three: the after-party. On the way there, I made a new friend (I keep meeting women who share her name, and who turn out to be cool — plus, I like the name, ha ha!). Our caravan stopped at her place to pick up her dog and bring him along to the party. He's smart, friendly, and looks very much like his mum. Before we arrived, we were forewarned that the dog's half-brother was already at our destination, and the two had issues (aw, so cute!). I get along great with dogs (though I've never tussled with attack dogs under command, but I guess that's kinda different), so I just thought it would be mildly entertaining, and, indeed it was. The two dogs are still unsure of who's the "boss", so they front like crazy and act all hard, but are hesitant to actually scrap. It was whimsical. Gradually, they calmed down and realized they'd just have to agree to disagree, and share the space. I think it helped that they both received a more-or-less equal measure of petting and attention from the humans. I wrastled with one, and he trapped my forearm in his jaws, but was gentle, only holding it, not even pinching. Such experiences always remind me how smart dogs must be to stay their instincts and abilities to tear us up, as a response to us trusting them to live in close proximity and share our lives quite profoundly.

It was light out by the time I started for home, and the buses were running again. Waiting at a stop, a friendly gent (who was apparently a panhandler, but absolutely not aggressive about it) made some small talk and, still feeling energetic, I engaged him and he gave me a synopsis of his life situation. We chatted for a while. When I was younger and more idealistic, I would long to solve everyone's problems, but eventually I realized that most of the time you can only give people a nudge, one way or another, through direct interaction. The nudge doesn't even have to solve a problem, necessarily; sometimes, it's useful simply in encouraging the recipient to keep fighting for happiness and goodness in life, so as the bus pulled up to the stop, I gave him an unusual and most unexpected parting gift. He thanked me kindly, and told me his name. I told him mine as we shook hands, and then I boarded the bus, looking forward to a nice long sleep. Who knows if we'll ever see each other again? Either way, we both walked away enriched by the experience. And it started with talking.


Wowzers, last night's RN was a smash! The last few days have been intense, and Friday night was the highlight of the week. Work was busy but satisfying, and some of us went to the new IKEA for lunch (I had the koettbullar, of course — BTW, the cafeteria now offers beer and wine, whaaat!). The rest of the workday flew by, and then it was time to get ready for RN.

The weather was heavy, and I got there a bit later than usual, but I still caught half of Koda's set, and it was pretty energizing. Then two of my favorite DJs (Virtual Light and the unstoppable Data Decay) played back-to-back, unleashing a relentless barrage of beats and grooves that could make even the most uptight person get to dancin'.

That's the thing about psytrance... there's no "official psytrance dance" — except for everything in this hilarious video, that is absolute truth, hahaha, no, but seriously — you just let the music carry you and dance however you want to. Maybe you're full-on liquid:ing, or maybe you just nod your head with the downbeat; it doesn't matter. All that matters is that you're becoming one with the music, and letting it carry you, your body expressing what you're feeling. As in yoga and other similar physical activities, it's about becoming more familiar, more comfortable, with your own body and mind. To know oneself is to be one's best, at whatever you do (hopefully nothing too awful).

Thanks to those who gave me gifts, and thanks to those who accepted my gifts. It was a pleasure, in all cases. There was someone there I was really happy to see. Was it you? Probably. ;-) Those who couldn't make it, you were missed. Those I haven't met yet, I look forward to it. And if I already know you and I didn't say hi, a thousand pardons. Sometimes, I lose myself in the music, but if you want to say hi, don't be afraid to interrupt my dancing; your interaction is always welcome! RN friends, it's amazing to know all of you. :-) 'Til next time!


I first went snowboarding years ago at Camp Fortune. It had snowed a lot the previous week, and then it got warm for a day, then froze again. Not to worry, I was told, as Fortune had snow machines. Unfortunately, the fake powder did little more than disguise the brutal layer of ice that had formed on the otherwise deep, soft snow. As it was my first time, I fell. A lot. I had a good attitude about it on the whole, but by day's end, the most significant thing I had to take away from the experience was a sore ass.

Fast forward about 15 years, to yesterday, when I finally went for round two. This time, however, I went to a smaller hill (quite literally, just one hill), which was a lot better for learning, because it had minimal traffic. The conditions weren't much better than my first experience (icy; minimal powder), but I've since learned better balance and falling skills, so I felt ready for the challenge. On each run, I improved measurably, and by the third run, I was already feeling much more positive about the whole thing, considering my previous experience. I can't say I've taken to it like I have with some other things in life, but it was definitely a lot of fun, and I will almost certainly go again before another 15 years goes by. :-D

There is no moral here, except maybe "snowboarding is fun, and you should try it". And don't be discouraged if the first time is tricky; try it twice. ;-)


So, you can access your music from almost anywhere with a PC and an Internet connection. But what if you get the itch to hear a particular song right where you are, say while travelling? Okay, let's talk about streaming music from your home PC to your phone. Yes, one of my fantasies as a kid was to have some sort of gadget that lets me listen to my own personal radio station more or less anywhere on the planet. That technology has arrived, in moderately-useful form, while flying cars still totally suck. :-D

Here's a way to live the dream. Note that it's not the way, it's just a way; in particular, I'm targeting an Android device as the client (for listening) and a Linux box as the server. And now I present a recipe entitled...

"How to burn through your data plan"

Ingredients:

  • a host equipped with Logitech Media Server, formerly Squeeze Server from which to serve your stream
    • If you haven't at least secured your server with a password, do it now!
  • an Android device with mobile data capabilities
    • I used a phone with ICS 4, but this may work for stuff like 2.x.
  • a mobile data plan
    • If you love music like I do, go for the "hungry, hungry hippo" plan. :-D
  • Squeeze Player for playback and Squeeze Commander for control
    • Don't forget to reward the dedicated codesmiths who've created some useful pieces of the chain.
  • working knowledge of LAN and WAN
    • IP addressing, ports, firewalling, dynamic DNS

Procedure:

  • Install the two apps on your Android device. You can go through Android Market.
  • In the LAN where your server lives, open ports 3483 and 9000 on any related firewalls, and configure any routing to forward external traffic on these two ports to your server (forward all protocols if you're unsure). If you've set up for external clients (e.g. SoftSqueeze) already, you can skip this step.
  • If you don't have a static external IP address, configure your network for visibility from the greater Internet using something like a dynamic DNS service (for example, a dynamic DNS service. Ha ha).
  • Configure Squeeze Player (only the important settings are listed) on your Android device.
    • Set Manual Server Address to your static external IP, or your dynamic DNS name.
    • Set Authentication to the username and password with which your server is protected.
  • In Squeeze Player's main panel, turn Playback on, and it should connect to your server; there's nothing playing yet, because we're about to configure it using Squeeze Commander.
  • Start Squeeze Commander; SP has a shortcut that detects SC, so you can launch it right from SP.
  • In SC's device list (leftmost pane), you should see your Squeeze Player listed by name. Other players (hardware and software) connected to the server will be shown as well. Select it to focus your next actions on it.
  • Hit the top-right icon (folder with music note) to get the master index of your music collection. I then usually choose Music Folder because I know my directory structure pretty well.
  • Drill down until you can pick a file, then choose Play. Yeah, and uh... don't forget to set a global data limit or take some other finance-related precautions. You've been warned. ;-)

Both apps are happy with whatever network they have access to (wifi or mobile data), although the hand-off from one connection type to the other isn't seamless — Squeeze Player stops and doesn't try to auto-resume, but maybe this will change. All in all, a pretty reasonable interpretation of the "global personal radio station". :-)


"Forbid a man to think for himself or to act for himself and you may add the joy of piracy and the zest of smuggling to his life." — Elbert Hubbard

This guy sure was a straight shooter. In fact, he was quite a fascinating chap, and I'm really enjoying his writings. He's someone I can identify with, in terms of having faith in my fellow humans. Here's a great bit of insight into his philosophy.


Okay, it's true. Face Unlock is really more of a novelty than anything else. I have at least one friend who passes as "me", and I've seen video of a photo fooling the software as well, although it's likely to improve with development, and those who are more security minded have other options.

Aside from the fun factor, there's a subtle, hidden benefit to using it: when I first set it up, I was smiling; not a big dopey grin, but something that looked positive, instead of neutral. I was a bit saddened when I wasn't allowed to smile for a recent passport photo, because I find people more approachable when they're smiling. Anyway, occasionally, my phone will fail to recognize me (it seems to have trouble with long hair and toques), but I recently realized it was much more likely (and faster) to see "me" when I smiled. So, now I'm reminded to smile more whenever I want to unlock the phone. The next lesson is "enough with the phone already". :-]

Last night's RN was a grand ol' time. I exhibited my latest print, and still got in some time to shake my ass with some beautiful people. Thanks to the DJs, some new to me! It was quite a mix of stuff, and I really enjoyed some of the tracks. I met the maker of some deco which had tripped me out like crazy at Orion two weeks ago (but that's a story for another day), and there it was again, right in the midst of the RN magic. Big ups to everyone who showed up to participate despite the nasty weather!

One more thing: if you haven't heard this already, it's been a favorite of mine for weeks now: Frost RAVEN — Cosmic Radiation. Discovered on SoundCloud, a very cool site indeed!


Over the last few weeks, I've observed various approaches to cooking, and tonight I was inspired to make chili-cheese wraps for dinner. I guess they could also be considered something like burritos. Either way, they're simple and delicious. Start with some of my home-made chili. What? You don't have it? Oh man, you've gotta have it. In a pinch, use some of your own home-made chili.

Okay, you have your chili. If you have a microwave, you can start with "cold" ingredients (perfect for leftovers). Grab a tortilla, chuck some chili on it, mostly across a diameter. Grate some cheddar or other delicious cheese amply onto the chili, then microwave it a bit to warm the chili and tortilla, and melt the cheese. Lastly, roll it up, and let it cool slightly to let the heat disperse. If you have a toaster oven, adapt by starting with hot chili, add the cheese and then roll up just before placing in toaster oven briefly. Yes, of course you can add other ingredients! :-) Don't forget to have some veg. I had broccoli. Good old broccoli. :-)

I was also inspired by a new friend to simplify this site's code. CSS is pretty well supported by now, and it looks like a more effective and refined way to manage the look and layout of a Website.


Intense NYE weekend; crazy times. A visit to the Atwater "beer cave". Walks. Wifi. Downtown. Underground. Mix-ups. Mix-downs. Mekkanikka. Rikam. Bamboo Forest. Great psytrance, great dancing. Massive crowd. Chill people, friends, cherished ones, those admired, and those desired. Together. Writhing. Many. One. As real as anything else happening NYE as the days begin to get longer again, yet somehow, this time, a little more than real (get the details in person). Home. Wind-down. Sleep. 2012... After 35 years, I've barely scratched the surface. :-]


While visiting family in the Niagara area, I discovered a recent addition to the glut of attractions — an indoor water park. Since it was winter, I had to give it a go. My sister and brother-in-law were up for it. First, we hit up the (famous?) UFO-shaped restaurant (not because of the food, *ahem*, but because my sister had never been). It isn't really that spectacular, yet it's one of those places you always want to check out to satisfy your curiosity. If you do decide to eat there, the fries are great, but otherwise, stick to the burgers.

Now, I like to swim, but I'd only been to two other water parks before. This one would have been more fun (read: scary) to visit as a kid, but it was still worth going to just for the novelty of splashing around in a warm, brightly-lit, giant glass cube in the middle of a chilly city at night.

The layout is decent, and there are a good number of water slides (including body, tube, and mat types), a wave pool (well... wave pool junior, really... seriously, unless you are less than three feet tall, don't get excited), and a bunch of contraptions to play with or climb around on. There's also a giant bucket that fills and tips every 10 or so minutes, creating a temporary "Niagara Falls". Oh yeah, and hot tubs, for the adults.

The price is unsurprisingly touristy (i.e. steep), but if you're a local, let them know; otherwise, hunt a bit for a coupon. Absolutely do shop around for parking. Look near Michael's Inn. Watch out for the yellow post in the lot.

You can rent large and small lockers at the water park. We brought our own towels and rented lockers; you should be able to rent towels, but always call to confirm stuff like that. I felt kind of bad for the employees who must endure long shifts breathing in copious amounts of chlorine gas, but I guess no one's forcing them to take the job. Go capitalism?

Well, I had fun and it tired me out (yay, exercise!), so I got my money's worth. Unless you're a raging hypochondriac — or actually infected with something contagious — you should check it out, if you're in the Clifton Hill area. Oh, and if you don't like water parks... what's wrong with you? :-D


So, I decided to take the train to visit my family over the holidays, and one of their selling points is free wifi (yes, I realize the bizarreness of something "free" being a selling point). I'll admit, at the very least, it works. I'm sitting here on the train, listening to music streaming from my mediabox at home, while editing my website over ssh. It's pretty slick. The only downside is the bandwidth is lurchy and a bit on the slow side, but... you get what you pay for. :-)

Still, props to VIA for giving customers more options. Now, what would be really great is a supertrain (high speed, like the TGV) doing this run (Montreal-Windsor).


RN is always a good time, but this one was just outstanding.

Koda played some very laidback stuff at the outset, but kept building the energy as a crowd gathered. Before his set was done, the place was hoppin'. Then Clone took over the decks. Man, did he pick some good stuff! His set had an excellent flow to it, perfect for dancing your ass off. To top the night off, Data Decay blasted us with a mix of classics versus new stuff, and the sound of the set's opener can only be described as "ruddy mysterious!". Thanks again to the Eri staff who help make this event possible.

It really was a treat to see some close friends, and I missed some of you, but maybe we'll see each other next time. It needn't even wait until then, although I keep pretty busy. You can always try me by phone (still my favorite "social appliance"). What? You don't have my number? Well, if you're not a bot, you can look it up. ;-) Maybe I'll add a contact form one of these days.


I wax philosophical too often, so I'm going to talk about waking up in a strictly literal sense. The human mind seems to have an extraordinary ability to keep track of time, and yet it's difficult to establish conscious awareness of it. I've had days on which I woke up one minute before my alarm, as if my internal clock was trying to show off, and although I've done this a number of times, it was always a fluke, rather than a product of intention. Consequently, I need an alarm clock to ensure I'm not (too) late for work.

The alarm clock I was using until recently has become unavailable, so I was in the market for a new one. Now, being somewhat geeky, I wanted something that could play audio of my choice as an alarm sound. I got a decent deal on a Logitech Squeezebox Radio, figuring I could get it working with my Ubuntu mediabox without too much fuss.

There's a reason Logitech is still in the game after many years of having to keep up with the fast pace of technological evolution. Once again, they've created a thoughtfully designed product that works as well as can be expected, with no obvious glitches or design shortcuts. There was a small hitch in getting the server software installed, but — as is often the case with Linux — there was a simple workaround that got me up and running in just a few minutes. Essentially, the repository server was having problems (at the time this was originally written), but you can simply download an installation package and install it manually (e.g. sudo dpkg -i package_name) and then surf to the default address (localhost:9000) to set up everything else.

This device is packed with features, yet manages to keep things simple. The wifi setup was so painless that I haven't even bothered to try the ethernet interface. In addition to that option, there is also aux-in (TRS connector) for maximum user flexibility. You can set different alarms for each day of the week (awesome), install third-party apps for new capabilities (e.g. Flickr slideshow), and it's even possible to get the server software onto my Asus WL500g router, although I haven't investigated that option yet. Really, the only thing I can complain about is the glossy piano-black finish of the housing, which makes fingerprints and other grime instantly visible. Then again, when choosing a gadget, looks aren't that high on my list of criteria; functionality is far more relevant to my happiness.

Well, I can't wait for tomorrow morning. :-)


NB, 2024-02-06:

The original article was about the "Pebble" watch, a cool project initially, but it went south fast, and even the updated URL is defunct, so I'm going to trash this article soon.


Just... wow. Can't believe I hadn't heard of this sooner. Wish I had more time to mess about with it.

Addendum, 2015-October-26:

At the time of the original post, this device was looking simple, functional, and elegantly understated. Now it has morphed into a gaudy, nasty-looking monstrosity, although it appears the Frame model is similar to the original design, but it's actually more costly than the ugly one. Looks like it was a good call to pass on it. :-D


For me, Natura 2011 was a mix of high and low points, and time is of the essence, so I'll summarize the key points, and follow up with some details, and then we're done.



Timeline:

  • Friday — Best day/night of the weekend. I arrived knowing I'd be hearing some great stuff during the wee hours — Quato's first live PA, followed by two great Ottawa DJs, Psycronik and Data Decay. I was not disappointed. The weather started off beautiful, with a warmth that made the soon-to-come rain feel that much more chilly. Really, Friday was perfect, so much fun.
  • Saturday afternoon — Cool forest hike, over a dozen species of fungi sighted, including poisonous mushrooms with a dark green cap and yellow stalk; live salamander held, marveled at.
  • Saturday night — WTF happened? Rain overload, no nighttime psy, more rain, no Urantia, even more rain.
  • Sunday — Some better weather, lots of chillin'.

Miscellany:

  • Due to great location, our campsite became something of a social hub. Coolness.
  • Location (campground) is awesome.
  • Suspended bridge is awesome.
  • Personal festival firsts:
    • Donned a makeshift poncho (garbage bag). It was armless, for efficacy, and secondarily, amusement.
    • Saw a giant slinky successfully traverse more than three steps in a row.
    • Saw other people with UV-A flashlights.

I heard Urantia was held up at the border by red tape. I can't confirm it, but dammit, it's disappointing no matter why it happened or who's to blame. Maybe next time.

All in all, fun, but I've done better. The highlight was the great vibe created on Friday night by local Ottawa producers and DJs. It set me up to make the remainder of the weekend bearable in spite of some disappointments.

Okay, enough. Thanks to the organizers, although next time, it would be awesome to see the headliner. ;-) Thanks to the volunteers. High fives and all that to everyone who braved the weather (it wasn't actually that bad). That's it for this year. Productivity mode... if I get enough vitamin D, or Substance D, or whatever.


Straight up, Open Mind was an absolute riot. Yes, the tickets were pretty dear, especially if you were only attending for the weekend. That said, an event like this has significant expenses, and there was evidence of a lot of investment in the facilities. Money matters aside, it was clear that a lot of volunteer effort went into this event, so I want to give a shout-out to everyone who helped set up.

Okay, let's get down to it. Having looked at the line-up, I decided to change it up and enjoy this festival on a more social tip. Don't get me wrong, though; the music was decent all weekend, definitely a Montreal flavor to the psy, as well as some serious old-school Goa sounds on Sunday night. Just the same, I felt it was the right time and place to focus on chilling with my fellow festival-goers.

A bunch of the Ottawa contingent had talked about about doing another "tent city" this year, and we were really pleased to discover, upon our arrival, that someone had staked out a lovely spot (two, actually) for us to make camp. Even better, they had convinced some cool Torontonians to settle among us. The sun was shining, the weather was sweet (heh), so we got everything set up to our satisfaction in no time flat, even while taking breaks to chat with people passing by (we were off to the side of a sort of main thoroughfare). I even bothered to set up my psy lantern, which performed admirably using the new inverter and smaller battery. It made finding our campsite a breeze, even from a good distance away. A few interested people asked about the setup (it seems the solar panels I use to recharge the psy lantern's battery are fairly conspicuous on the forest floor). One of them works with electricity professionally, and we had a great little chat about all sorts of things. He was a humble, amiable person, boosting up the friendly vibe that was a highlight to me this year.

Let's talk about the special installations.

  • If you go to Open Mind, you won't be able to leave without at least hearing about the labyrinth. I'll admit, last year (my first at Open Mind), I never got around to trying it. This year, I scheduled (haha) some time to try it. My enthusiasm was built when a bunch of us were lounging around the fire at night; a friend enthralled us with the account of his visit to a mirrored grotto somewhere within the maze, in which his group was visited by a unicorn (no, not a real one, silly!) which totally tripped them out. He had the photos to prove it. Good times were clearly had. Well done, unicorn! Anyway, I resolved to take a crack at the crazy forest maze before the weekend was up. Unfortunately, when the time came 'round, perhaps due to technical difficulties, much of the lighting — a rather important part of the whole deal — was out. Although the moon was brilliant that night, it couldn't quite provide enough light to make the forest floor visible, never mind the "walls" of the maze. After some discussion with my companions, we admitted defeat. Better luck next year! :-) In any case, part of the enjoyment, for me at least, was wandering around in a forest without being in any sort of hurry — such a welcome change from the usual hustle and bustle of the daily grind back in "civilization".
  • There was also an art gallery tent, which, in addition to providing some respite from the bright, warm sun, gave one's eyes something to feast on. In particular, I enjoyed the works of JL and CD.

  • Another clever and well-executed attraction was the Cinebulle setup, which was a medium-sized white fabric bubble, kept inflated by a fan, which one could enter and then watch a 360-degree film projected against the bubble wall. It was near the chill stage, which itself was a larger version of the inflated bubble concept (sans projection). It was a really clever way to create an enclosed space, with a zippered portal that was both practical and provided a surreal feeling of passing between worlds. Hat tips to the ones who conceived of and implemented the bubble-domes.

  • There was a totem pole on the beach, with UV paint, which looked awesome at night. Whoever put that up, nice work!

  • The stage deco was sweet. I thought the large color-changing "quartz crystals" on either side of the main stage were pure brilliance. I can totally imagine the fun that was had creating them, and they provided a fantastic visual effect. The posts that made up the skeleton of the stage were carved with runes, and it was a great touch that someone provided a translation chart, although I only got around to interpreting a few of the runes before concluding they might have just been random, or I was unfamiliar with whatever language was expressed in the carvings. Either way, I saw it from a more abstract, eye-candy POV, and it really worked for me that way.

  • Okay, the enchanted forest was so great, I had to visit twice. The first time, I saw the meditating man, a near-life size golden statue of a man seated in a meditation pose (something like a lotus, IIRC). It freaked me out the first time I saw it, because of the near-realism and ghostly lighting. The second time, I couldn't find the meditating man (maybe he reached nirvana), but some friends wove parts of the "Na'vi tree" into my hair and took a photo. I am always up for silly stuff like that. :-) Thanks to everyone who decorated the forest.

  • One afternoon (Saturday?) I wandered past the dance floor, and there was an astounding group of women wearing gigantic, brightly-colored, and unique dresses with hidden stilts, weaving and bobbing gracefully near the back. Children crowded 'round, taking their hands and leading them about; it was both magnificent and adorable. The costumes were absolutely splendid, a true labor of love. They slowly made their way around the grounds, seeming to disappear back into the ether from whence they came.

And now for some miscellany. The weather was pretty standard for a late summer festival (hot and humid). On the second day (I believe), word came 'round about a storm warning, but in the end, there was only an hour of gentle rain, which was quite welcome as it cooled things off a bit. The site had shower facilities which were, in the context of the setting, quite the luxury, although it was cool/cold water only (brrr!). Still, nothing like scrubbing off the grime before setting off to collect some more. :-D Frankly, if daily living were similar to festival conditions, I wouldn't mind in the slightest, but at the same time, one of my favorite things to do when I get back to the "real world" is take a nice, hot shower. Ah, civilization, what have you done to me? :-)

Well, thanks to all you beautiful people who made it happen — organizers, volunteers, and revellers alike. I'm sorry if I know you but didn't say hi; I'll try to do better next time. That said, never hesitate to interrupt my dancing or whatever if you want to say hi yourself, or enjoy a proper hug. ;-) All in all, I had an amazing time, and I hope to see you all again next year!


Wow, where to begin? This adventure started with a battle; I was just getting over a cold, and kind of low on sleep. Fortunately, I'm employed by some way cool people, so I'd had the Thursday off to recuperate. Friday morning, things were still looking grim, but my positive attitude would not be squelched. As I hurried to pack things up, my anticipation for the upcoming adventure developed almost into a kind of euphoria that made me forget about not feeling one hundred percent. There were more obstacles to come, however.

We left late (not exactly unusual) and got bogged down in late-afternoon Montreal traffic. Disaster! We were really hoping to arrive before sundown to make camp setup much more enjoyable. A vibe of impatience began to seep into our group, and tempers got a little short, but we reminded ourselves that there was nothing that could be done now, and whether it was dark or not, we'd be very happy to get there.

Now, when I said "disaster" before, I was exaggerating, because the next obstacle was more serious. You see, we had foolishly [in retrospect] trusted the English directions to the site which had been posted on the Web, instead of just identifying the campground and planning our own route. We arrived at the "correct" address, and saw... a farmhouse. Fortunately, we were greeted by a friendly and helpful woman who lived there. She explained how to get to the site, and related how she'd already met all sorts of people from all over, who had also relied on the faulty directions. We thanked her, hopped back in the vehicle, and grumbled to ourselves about the crap directions, before laughing it off, and set off in hopes of arriving before the last useful minutes of sun receded into the growing dusk.

At last, we saw a cardboard sign that confirmed the end was in sight. As we pulled into the parking lot, the excitement was palpable. Unfortunately, we'd burned the last of the daylight on the unexpected detour, so we set up camp in the dark (argh!), managing to get a tarp above the tents for the rain that would likely fall in a few hours. Having spent my last remaining energy on setting up camp, I conked out, deciding that the festival would truly begin for me in the morning.

Saturday morning, I felt incredibly refreshed. I munched on various breakfast things, and headed out to explore the grounds. What a gorgeous site for a festival! I looked forward to a dip in the rapids, and the upcoming gigs by Electrypnose (Vince Lebarde) and others. I thanked my immune system for doing its part in what looked to be a fantastic weekend.

Saturday evening was the main event, in terms of the music. Electrypnose had a dark set scheduled for the wee hours, and I knew Mad Maxx would throw down like a champ a while after that, so I got revved up to dance my ass off. And lo, the music rocked. And rocked. And the sun came up. And still it rocked. There was a brief technical glitch while Max played, but he took it in stride, and got people hopping again as soon as the power was restored. That guy is committed to entertaining, and I appreciate it.

We just kept on going throughout the day, taking breaks to eat, explore, and chill, and before we knew it, five o'clock had arrived, and some familiar funky sounds began to emanate from the main stage. Yes! Electrypnose was back to play a funky live set! I gotta tell ya, this guy is a pro. The knob-twiddling was precise and determined. I heard several of my favorites, and just loved it. There's nothing like hearing Balabala on a sandy beach, with the sun blazing down, knowing you have nothing to do for the next little while but eat, sleep, and dance. I love vacations!

I had brought one of my hand-made psychedelic tee-shirts as a gift for Vince, as a tribute to his great contribution to electronic music, but I'd forgotten it back at camp, so after his set, by good fortune, I met up with him and he agreed to visit camp so I could present him with the shirt. We chatted a bit on the way there, and a bit more after I gave him the shirt, and then he politely excused himself to unwind.

Well, what can I say? I met Electrypnose, and he's a real class act. If you have an opportunity to see him play, you should take that opportunity. Really, there was a lot of great music 'round the clock, and I want to thank all the artists, vendors, campground owners, and especially the organizers who put this event together. I met some cool new people, and also hung out with some more familiar faces. It was a smashing good time.

I still have one unanswered question, which was nagging at me all weekend: after the festival, where will that octopus go? :-D


I finally upgraded my mediabox PC.

  • AMD Athlon 64 X2 → AMD Phenom II X4
  • 2 GB RAM → 4 GB RAM

It's not at all unusual to have compatibility issues when upgrading computer hardware, so a good rule of thumb is to only change one thing at a time, and confirm that everything still works before the next step. This upgrade was the exception.

I started with the RAM. I had a pair of 1 GB modules which I was to replace with a pair of 2s. I placed a single new module in the primary slot, and booted. Things looked okay, so I installed the second module and booted. Things looked good for a minute or two, but then the PC locked right up. In my experience, RAM is rarely actually defective; most of the time, the problem is compatibility or faulty installation. I removed one of the modules, and things worked again. I swapped them; no problems. It looked as if I could only use one 2 GB module at a time, but that wasn't an upgrade. I then installed each module in turn and performed a RAM test on them. They both appeared flawless.

It was time to check if any BIOS settings might be causing problems. I experimented with a few settings, to no avail.

At this point, I surmised that the processor, being a little old, might just be having difficulty dealing with the timing on the new modules. The next thing to try was breaking the rules, and upgrading the processor at the same time as the RAM. I booted, and was pleasantly surprised by the increase in performance (even just in terms of boot time). I was even happier after a few minutes of stable operation. After an hour went by with nary a hitch, I declared the operation a success.

What's the point? Although computers are deterministic systems, they are so complex that upgrades are not always routine. Your best tool is a good basic understanding of computer technology. If that doesn't interest you, call an expert for help. ;-)


I had a last-minute opportunity to visit Toronto with two friends for a Canada Day party; I decided to take that opportunity. The driving was great (and this time I got to be a passenger!), and we made good time. We had a few hours to hang out at the homestead of one of the organizers, and lo and behold, the legendary DJ Vibes (Shane) and his lovely sweetheart were already relaxing there. We made a mad dash for patio chairs 'round back, and Shane came up with a chair borrowed from inside, with a rather uncomfortable — erm, supportive — back on it. He was a good sport about it, though, and cracked wise with us all evening until it was time to head to the venue for final setup. Here's a guy who's been at it for over 20 years, has had umpteen releases, and is definitely world famous, but hasn't let it get to his head. He's just what you want in a DJ: refined skills framed by a friendly, approachable demeanor.

The venue was pretty good, although you could tell there hadn't been a whole lot of investment in the building itself recently. The deco was okay; it worked out well that the driver (who was playing that night) had brought a banner that happened to fit perfectly on the wall behind the stage. There was a good variety of music, including some breaks (w00t!) at the start of the night. Although I'm mostly into psytrance these days, I gotta say, I enjoyed Shane's happy hardcore set, as well as the earlier breaks (I'm not sure who played those, but he made some good picks either way). Thanks to the organizers and performers, and a happy Dominion Day to my fellow Canadians.


Some years ago, I had the good fortune of visiting central Europe. It was a coach tour made up of some lovely people from around the world. Two of these people were from Ottawa (of all places!). Mac and Helen were fantastic tour buddies. They were older, but still light on their feet, always smiling and laughing, making everyone feel at ease, and really demonstrating the easy-going attitude Canadians are known for.

During the trip, I got to know Mac a little bit in terms of his educational and work background. He'd served as an RCAF pilot, and then gone on to direct the NRC's Flight Research Laboratory. I was quite impressed with everything he'd accomplished in his life up to that point, and he was still working professionally in the aerospace field as a consultant; it was clear he had found his passion in life.

I saw Mac once more at a holiday gathering at his place a few years later. I got to meet many of his family and friends, and got to know him a little better in a different setting. He was loved so much, and it was easy to see why. Sadly, everyone must go at some point. Mac left this plane of existence on April 19th, 2011. I respected him deeply, and will always remember him as an exemplary human being. My condolences to all who knew him.


Ever since I became addicted to A Few Spoonfuls... (a TRON and Dickster co-op with some brilliant use of Futurama samples), I've been keeping my ears open for that distinctive TRON sound. Both TRON and Dickster have developed their own audio fingerprint, so either one live should be a treat, right? I put this theory to the test during the holidays.

Finding the place wasn't too bad. Every time I drive around in downtown TO, it seems to get a bit smaller. The venue was pretty nice, with two well-separated rooms. The psy room had solid blacklight coverage, which really brought all the banners to life, not to mention some of the great looks various people were rockin'. The projected visuals were a mixed bag, though pretty good on the whole. As for the sound, well... TBH, I found the top end a bit harsh during TRON, even when I moved to the back of the room. His stuff is pretty bass-heavy anyway, so the high end doesn't really need extra gain (insert standard disclaimer about me not being a sound engineer).

Thanks to the organizers, to Earthling and TRON, and all other artists and helper elves who made this one happen. I got to listen to some thumping music, dance out some winter blahs (fuck SAD!), meet some cool people, and have some great chats. Thanks, TO, for being good hosts.


It was just a matter of time before another master of full-on graced us with his presence. Sure, we had to drive to Montreal again, but this time it wasn't snowing on the way there, and we made excellent time.

The location was a bit chilly at first, but a few minutes of dancing soon took care of that. The deco was pretty good and matched the party theme. I've helped with setup once before at that place, and I know how much work it is to get stuff hanging from that ceiling, so props to the orgs/setup crew. As per my usual insanity, I created a new PTS (psy-tee-shirt) for the night, completing it just before we left. It turned out pretty well. Of course, it helped that the setup had two blacklight cannons flooding the main room.

Virtual Light and Kode Six each dropped a solid selection of very dance-able stuff. Go local talent! When Mekkanikka took over (4-ish? 4:30? I wasn't really watching the time), I was still full of pep, and I went koo-koo-bananas when I heard King Bate winding up ("...a bug's life."). I'd been listening to that one a lot lately, and was really hoping to hear it on the big system. I got my wish, and more besides: another favorite, Sublime, was dropped as well! I can't turn it up to eleven at home, so I was stoked to hear some favorites at full blast. Honestly, throw pretty much anything containing Boosh samples into your mix, and I'm a happy camper.

Thanks again to Nikka and all the artists and helpers who made this show a success!


Amazone 2010 proved to be quite a decent shindig. The location was pretty good, and the only downside to the night was the nasty weather during the drive (and for a few minutes as our group waited outside; luckily, out-of-towners were given "express check-in").

Once inside, the weather was quickly forgotten. Someone had turned the deco up to 11 (yeeeah!), and there was a fantastic assortment of costumes. I gotta give a shout-out to the dude dressed as HST, because, man... you killed it; well done!

Although not mind-busting, the music was very solid throughout the night (Quantize and Silicon Sound entertained us before Mad Maxx hit the decks), and that last track Mad Maxx played was pretty wicked (a friend was raving about it for days afterward).

We made it to the afterparty, but it was absolutely sardined. Before our group decided to bail, I ran into Max in the front hall, and got to talk with him briefly, and — classic Bernz — I didn't think of the really good questions until I got home, but that's okay; it was cool enough just to shake his hand. The one question I managed to think of, he answered in earnest, and the exchange has stuck with me ever since as both a source of inspiration *and* an important reality-check. :-)

Thanks to the artists for visiting, and to the organizers for all the hard work setting it up.

P.S. I've heard a rumor that Mekkanikka is coming to Montreal soon. You know what that means!


Sensient (Tim Larner) played Montreal last weekend, and it was something else. Not only is his music very distinctive to begin with, but under the right conditions, it's more than music; the vibrations become physical sensations inside the body.

I'd forgotten to bring earplugs, so I thanked my ears for being understanding and plunged into the full frequency range. Well, I don't know who set up the sound stage (speaker placement, levels, etc), but they definitely understood both audio in general, and the Sensient sound in particular. It was dialed in to optimal bass without the distortion that is so easy to hit when one is zealous about getting it just that little bit louder. Props to those who helped with setup before Sensient began. Then, what a show!

Hearing The Deepness live was simply amazing. I noticed that couches had been arranged in an arc relative to the sound stage. Maybe it was coincidence, but I took it as a hint, and took a seat for a few minutes every so often to feel the entire couch vibrating with bass, and wondered if some of it was subsonic. In any case, I left the event with no tinnitus, and yet my innards had received the most delicious acoustical massage.

Thanks to the organizers and everyone who helped set up the deco and infrastructure, and a salute to Tim for visiting Canada and sharing his music with us. Keep up the good work!


To better appreciate my gushing, it might be helpful to know that I consider Simon Shackleton (Mr. Elite Force) one of the most talented music producers of his time. Ever since I got into the Elite Force sound (can't pigeonhole it, really), I promised myself that if he ever came to Canada, and it was reasonably possible for me to attend a show of his, I would pull out all the stops to make it happen. Well, this Sunday, the universe pulled out a few stops of its own, and brought Simon to Montreal, pretty much as close as I could have asked for.

The weather looked a bit sketchy, but I wasn't going to be stopped by the possibility of rain. I managed to pull off a last-minute car rental, and made it down in time to settle in before Elite Force started. The stuff he played was definitely new to me (I'd been out of the loop on it for almost a year), and he gave the crowd a good working-over with some wicked dirty synths and beats, and some simply raw sounds. Well done, sir!

After his skillful and energetic performance, I mustered up the courage to march on up to the side of the stage, where he was magnanimously greeting the punters, and I not only shook his hand and thanked him for visiting, but gave him a freakin' hug too! What an amiable fellow! Thanks again for coming to Canada, my good man. May your travels be full of joy!

What a day! My only regret was not bringing my Mindfunkpsychedelic EP for him to sign; when I set off for Montreal, I was not humble enough to believe I'd get to meet him. That'll teach me! :-]

P.S. He just posted a remix of a Prodigy tune that's free to grab. Go check it out! Sorry, the link has expired.