April 26, 2015

Cintiq Companion 2 (, , )

by fluffy at 4:53 PM

Maybe my standards are just too damn high, but I'm not happy with the Cintiq Companion 2 either, and I'm probably going to return it (although I'll give it a couple more weeks to decide, since there's a 30-day Satisfaction Guaranteed window on it, and return shipping is not free on that).

Reasons I'm unhappy with it:

  • The stylus tracking is still pretty bad (the stability is fine but the accuracy leaves a lot to be desired)
  • The battery life is abysmal - like, 1.5 hours or so
  • It's heavy and loud and cumbersome
  • Every time Windows Update happens I end up needing to basically reinstall everything, because Windows is still a pile of crap (and Windows itself is also really aggravating for lots of reasons)
  • And, a big one for me, is that being stuck with Windows also means needing to be stuck with Lightroom if I intend to do multiple-device photo management

I really, really don't like Lightroom. I also don't like what Apple did with Photos but at least there's the potential for Apple to fix the couple of glaring problems (namely the inability to migrate portions of a library between systems, which was the one reason I bought Aperture in the first place). Adobe has shown time and time again that they never ever want to fix glaring, fundamental problems with their software, they just like adding more features and complexity in ways that make it less and less useful. I haven't figured out a reasonable workflow for working with Lightroom, and even just using its basic functionality is painful and obnoxious. So, Photos is the lesser of two evils, and I'm probably going to switch back. But this means that I can't have a single device for both drawing and photography on the go... or does it?

Because there's an app called Astropad that basically turns an iPad into a Cintiq, and Peggy swears by it, and I've played with the demo and it's quite nice. So if I could just do what Peggy does and connect the iPad to my MacBook via USB, I have everything I want, right?

Well, probably not everything. But still, less aggravation than what I'm dealing with right now.

Anyway, I don't completely regret actually paying for Lightroom, because it's $120/year and comes with Photoshop, which I'd been, er, "borrowing" before. So $120 for a year of legal Photoshop is still worthwhile, even if I never touch the festering pile of garbage that is Lightroom again.

Meanwhile, I've ordered one of Astropad's recommended styluses and will try that out for a while, and I guess I should see if it's possible to migrate my Lightroom library back into Aperture so that I can convert it to Photos... or more likely, restore my Aperture library from backup. Because, ugh ugh ugh, I can't imagine trying to use Lightroom to actually do anything useful.

April 10, 2015

In which I purchase, and almost immediately return, a Surface Pro 3 (, , )

by fluffy at 5:07 PM

Lately I've been getting a lot more serious about my art, and while I upgraded my dying Intuos 2 to an Intuos 5 just over a year ago (holy cow, has it been that long already?), I'd recently been bitten by the Gotta Have A Cintiq bug yet again (mostly because I was chatting about tablets with Jake, since he'd upgraded from a Yiynova to a Cintiq a while ago).

January 16, 2015

Two simple things to make OSX Yosemite work a lot better ()

by fluffy at 11:48 PM
  1. Turn off wake-on-LAN:
  2. Disable automatic application termination; open Terminal and run:
    defaults write -g NSDisableAutomaticTermination -bool TRUE

November 29, 2014

Things in store (, )

by fluffy at 5:58 PM

If you want to buy any of my crap for holiday gifts, now is a good time. It isn't on sale or anything, it's just the time of year for that. (This store page is just to aggregate all the stuff I have for sale at other places into one spot. I'm too lazy to build my own cart and digital fulfillment stuff.)

Also I like my stupid HTML and CSS tricks so I'm more just showing that off. This site looks great in lynx.

It probably doesn't work in IE though. Sorry, IE users.

(Also I've already gotten a couple of requests for things to make into prints on Redbubble. If you have anything you want to be able to buy, please let me know!)

October 23, 2014

Eclipse 2014 (, )

by fluffy at 10:32 PM

There was an eclipse today! If you didn't know about it, that's okay, apparently nobody else I knew did either. I guess most people just don't take an interest in their neighborhood.

Anyway, just like last time I took pictures, with a slightly better setup this time around (since last time I realized that the crappy mylar balloon I was using wouldn't cut it so I bought some emergency blankets specifically for solar photography).

September 9, 2014

Today's Apple stuff ()

by fluffy at 3:38 PM

So, this is the first time in a long time that I was looking forward to an Apple product announcement and paying attention to all the streamed sources I could.

September 7, 2014

Let's build a social network! (, , )

by fluffy at 4:43 PM

Lately I've been on a huge RSS-evangelism kick. I don't want to see it die out. It's an open standard that was built to enable the free sharing of ideas on the web in a transparent, simple, free manner, without any advertisers dictating what you could or should see.

Unfortunately, advertisers are what fund the systems that make it easy to get and share online, and as a result, the various getting-online services have a vested interest in keeping people captive within those networks; the last thing they want is to make it easy for people to import or export feeds that can be used on other systems.

The thing is, there is a totally-open distributed social network out there already, hiding in the aether; you just need to find it. Here's my guide to connecting to it without too much work. I'll try to keep things simple, but feel free to make suggestions for making it even simpler!

More thoughts on Bagel Voice (, )

by fluffy at 1:22 AM

I actually might not give up on Bagel Voice so soon after all. My original intention for it was to offer an XMPP console (to get push notifications for "free"), and it really wouldn't be that much work to port it to Twisted, which has XMPP support. (It does make deployment a bit more involved, but things like wsgi and Passenger ease the pain too.) At one point I thought I might port it to node.js but you know what, the more I use Python, the more I like Python.

Incoming call integration is still problematic due to a couple of aspects of iOS's security design (this is one of the few places where Android is better), but iOS 8 interactive notifications fix (or at least mitigate) the major issue, and I can always just keep having the SIP proxy dial my real cellphone number instead.

So, I'm still thinking about continuing to develop it.

RSS is my social network (, )

by fluffy at 12:46 AM

RSS is my social network, and these are my reblogs.

(Also I really wish FOAF had caught on, but it sadly never really got past the "here's an amazing schema that does a lot of great stuff if only people would write tools to support it!" phase.)

September 1, 2014

SSL and this site (, )

by fluffy at 12:52 AM

So, Dreamhost is pushing everyone to move to https, and I'm actually in favor of that for a number of reasons. You may have noticed, to that end, that most of the links on this site now point to https:// instead of http://. Hopefully you noticed this because you saw the lock indicator (and maybe occasional mixed-content warnings in the address bar) and not because the whole site broke for you. (In theory the way SSL is set up won't work with old versions of IE on Windows XP but I don't really care about that anyway.)

Anyway, this has exposed to me some pretty major annoyances with how both Movable Type and phpBB 2 work.

August 17, 2014

Bagel Voice (, , )

by fluffy at 8:32 AM

The thing that put me down the Bagel Voice rabbit hole in the first place was being unable to get cellphone reception at my desk at work or at home and using Google Voice + VoIP for my incoming calls, and then realizing that I was paying a lot of money for voice and data service that I hardly ever used, and then I started thinking about how I could get voice calls and text messages during the 90% of the time that I have WiFi coverage without spending more than necessary for the mobile part, all the while still having something like Google Voice but without the Google. I figured that a piecemeal data-coverage-based web app would be sufficient for my needs, and that I could fill in the gaps with a mobile access point.

Turns out, affordable mobile access points have crappy coverage too, and dealing with a web app for texting is really obnoxious. I could make it less obnoxious, but the work necessary to get a better level of integration is just not worth it.

Anyway, iOS 8 finally supports WiFi calling (and presumably texting), and T-Mobile has a $30/month plan that's amenable to my needs and not outrageously expensive (and provides unlimited minutes when doing WiFi calling, negating the other reason I went down the VoIP service rabbit hole it still charges for airtime, unfortunately, but I still have my VoIP service for outgoing calls anyway), so I'll probably just switch back to a regular iPhone on T-Mobile when iOS 8 comes out. (Or maybe sooner, if the iPhone 6 comes out first — I have no desire for an iPhone 6 due to it being allegedly just as big as the Galaxy Nexus, but that will drive the price of used iPhone 5s down substantially.)

Twilio is pretty fun to play with, though, and I have some other app ideas that make sense for it. And of course anyone else can feel free to fork Bagel Voice if they want to pick up where I left off.

July 25, 2014

A simple SIP multiple-ring proxy (, )

by fluffy at 11:55 PM

I've been using Twilio as my dial-in device (DID) for my VoIP service, but it has a pretty major downside in that it only supports either a single SIP endpoint or multiple-ring of multiple trunked phones. A single SIP endpoint is much nicer because it reduces the latency somewhat, and also reduces costs considerably.

So, in order to support multiple-ring functionality on Twilio using SIP, you need to set up a very simple SIP proxy. Here is the basic configuration I'm using for that.

July 24, 2014

Whither blogging? (, , )

by fluffy at 12:31 AM

It seems like I never have anything to say in public anymore; most of my entries are friends-only these days, and I don't even post much of those either. All of my older entries embarrass me. I should unpublish a bunch.

The friends-only functionality is the only reason I even keep phpBB around, and it's such a terrible comment engine that's far outlived its usefulness. I often think about dumping MovableType for some templates written in Jekyll but I don't know how feasible it would be to add in friends-only stuff.

July 21, 2014

Site upgrades (, )

by fluffy at 12:29 AM

I got tired of fighting with Dreamhost support over my site availability due to them blaming it "using too many shared resources" (even though everything I could tell indicated a problem with their Apache process reaping, but that's a rant for another time) so I moved over to their VPS service.

It's kind of nice in that it's got the ease-of-configuration of their shared hosting, but the isolation, root access, and install-whatever-daemons-you-want of a VPS, and at some point I can also move over to nginx (although that will first require me removing a couple of legacy things I don't use but don't want to lose either).

So far I've had a couple of road bumps in that for some reason my cron jobs weren't firing off correctly, and at one point when I rebooted the server my entire Apache configuration disappeared, so I ended up having to issue a full configuration rebuild. Hopefully that won't happen again though. I've opened a support ticket with them anyway, although I'm not expecting much good to come of it.

Anyway, the really nice thing is that now I can finally run memcached (I'd made suggestions to them about how they could reasonably support a memcached fleet in a shared-hosting scenario but their answer was just "use a VPS, sorry") so now that I have a way of reasonably caching comment metadata over on the comics section, I've re-enabled it. I've also added caching for the comment metadata and friends functionality on this very blog, so hopefully the site will be a lot faster even when my (still shared) database is being poopy.

As always, let me know if you see anything weird happen.

April 7, 2014

HiDPI image replacement (, , )

by fluffy at 7:41 PM

As often happens, now that I have a couple of devices with so-called "Retina" screens, I got sick of the pixelated 100dpi look and decided to implement HiDPI image support on my comics site. Here's how I did it:

PHP end (server-side)

Normally the blog entry texts are emitted directly. Now they're passed through this function:

function renderComic($entryText, $rss = false) {
    if ($_GET["hidpi"] == "disable") {
        return $entryText;


    $doc = new DOMDocument();

    foreach ($doc->getElementsByTagName('img') as $img) {
        $ldpi = $img->getAttribute('src');
        if (file_exists($ldpi)) {
            $size = getimagesize($ldpi);
            $img->setAttribute('width', $size[0]);
            if (!$img->getAttribute('alt')) {
                $img->setAttribute('alt', '[comic]');
            $hdpi = preg_replace('/\.([^.]*)$/', '.HIDPI.jpg', $ldpi);
            if (!file_exists($hdpi)) {
                $hdpi = preg_replace('/\.([^.]*)$/', '.HIDPI.\1', $ldpi);
            if (file_exists($hdpi)) {
                if ($_GET["hidpi"] == "force") {
                    $img->setAttribute('src', $hdpi);
                } else {
                    if (!$rss) {
                        $img->setAttribute('data-hidpi', $hdpi);

                    $img->setAttribute('srcset', $ldpi . ' 1x, ' . $hdpi . ' 2x');

    $ret = '';
    foreach ($doc->getElementsByTagName('body') as $body) {
        foreach ($body->childNodes as $node) {
            $ret .= $doc->saveHTML($node);
    return $ret;

(For much of the weirdness, blame PHP's HTML stuff for, as always, crapifying everything for no good reason, in this case DOMDocument.)

What this function does is the following:

  1. Adds a width and alt attribute to all images (which I should have been doing anyway, but I'm lazy); it only adds width because I depend on proportional flexible sizing for my responsive layout
  2. For images with a high-resolution version available (as determined by replacing its extension with .HIDPI.jpg or, if that doesn't exist, inserting .HIDPI before its existing extension), adds a data attribute to point to this high-resolution rendition (or, if the query parameter hidpi=force exists, replaces the src attribute)
  3. Adds the experimental/draft-spec srcset attribute, so that future browsers (hopefully) won't need the deferred replacement logic
  4. Unwraps the inner HTML from the document boilerplate that DOMDocument::saveHTML adds (because heaven forbid you might want to just manipulate some HTML data on its own!)


I've recently learned to actually quite like jQuery for this stuff (I'm using it a lot in Bagel Voice). So, here's a quick JS function that drives the client side of things:

// HiDPI image replacement
$(document).ready(function() {
    if (window.devicePixelRatio > 1) {
	$("img[data-hidpi]").attr('src', function() {
	    return this.getAttribute('data-hidpi');

What this does is, after the document loads, if the screen has a pixel ratio greater than 1, for all images with a data-hidpi attribute, it replaces the src attribute with it. Simple!

Other things I tried

  • Just using srcset isn't enough just yet, as no browsers support it (some people are claiming that the Chrome developer channel does but that's hardly enough to go by)
  • CSS @media rules; in particular, all <img>s that had a HiDPI rendition would get replaced with two images, one with class="ldpi" and one with class="hdpi", and some CSS rules to hide ldpi on HiDPI screens and vice-versa. This actually worked really well, but it had the end result that every device was downloading both images, regardless of what was visible, so that's dumb.

I also considered rewriting <img> tags to <div>s with generated <style> blocks that would set up the background-image for media queries, but from what I've read, that still has the double-download issue, and also it would have been ridiculously complicated and I couldn't guarantee that it would still work on older user-agents (which I still care about for some reason). It probably would have also prevented Google Images et al from indexing it, which I care about both because I actually get readers that way and also it makes reverse image search easier (for all the comics of mine that get hotlinked and spread without attribution and so on). It also makes auto-excerpting functionality on Twitter, Tumblr, Google Plus, etc. fail, and not to mention how much weirdness there'd be for the occasional multi-image comic and problems with formatting rules and so on. Basically, it's a mess. I'll probably do that for the site graphics, though, if I ever get around to remaking them for HiDPI.

March 28, 2014

Tablet upgrade choices (, )

by fluffy at 1:17 AM

So, that Monoprice tablet I got a while back didn't work out (because of the wavy line issue) so I was just sticking with my old Intuos2. Unfortunately, the stylus is still dying, and I'm also rearranging my workspace at home and I'd like something that takes up a bit less space while still giving me the same active area. Here's my notes on my choices.

February 10, 2014

Telephony cost breakdown ()

by fluffy at 11:14 PM

Note: Saving money is only a secondary goal. The primary purpose behind all this is to have fun building something myself and not having to worry as much about stuff disappearing or breaking on me (except for when it's my fault). Plus, I find it very offensive how cellphone companies basically get you for $30/month minimum (and usually more like $60+) regardless of how little you use the service, unless you're stuck with crappy Sprint MVNOs with terrible reception.

February 9, 2014

If you want something done right... ()

by fluffy at 11:31 PM

So, as a followup to my previous entry, there isn't anything out there that quite fits my needs. However, there is a call and SMS termination service with a very clean API and it shouldn't be too hard to build something myself. I already have a thing that will accept a call, forward it to a (currently hard-coded) set of SIP endpoints, and record a voicemail (with custom greeting) if no answer occurs in 30 seconds.

For now the quick hack is in PHP but to go forward I'm going to want a decent database thing and I don't want to screw with PDO or hand-rolled SQL, and I've been needing an excuse to properly learn Python anyway, so I'm probably going to build it with Python and Storm.

February 7, 2014

Refactored communications ()

by fluffy at 11:11 PM

For various reasons not worth getting into I decided to reevaluate my phone-based communication stuff again.

Here's where I am right now:

  • iPod Touch for pretty much everything but voice calls, supplemented with a FreedomPop hotspot when I'm not within WiFi coverage
  • A cheap-ass pay-as-you-go Verizon phone for voice calls
  • Home phone via my existing VoIP setup (CallWithUs outgoing, CallCentric incoming)
  • Google Voice (ugh) as the SMS and call-routing frontend

So far it's working pretty nicely. I have also messed with some of the Google Talk apps for the iPod but they're all pretty horrible. I might try out some of the SIP apps for it next, to see if any of them support push notifications for incoming calls.

I'd really like to drop Google Voice for my call termination, though, partially because it's Google but mostly because it's incredibly laggy and has been getting unreliable. Does anyone know of a telephony provider which provides the following?

  • SMS termination, with iOS and web app access
  • SIP, ideally with multiple simultaneous client connections (ring multiple SIP devices from a single number)
  • Multiple-ring call forwarding (i.e. while ringing on SIP also ring on a cellphone and/or desk phone)
  • Utility pricing (I'm fine with spending a few bucks a month to enable incoming calls but I don't want to have to pay up front for a buttload of minutes I won't be using; I'm totally fine with paying per-minute for everything) or at least having a reasonably-priced monthly plan
  • The ability to port a phone number to it

Because that would be pretty much perfect. I can live with varying combinations of those, but the only non-optional one is SMS termination, and that seems to be the only one that all the providers are lacking (except for a couple that charge way too much for the amount of service I need).

October 4, 2013

Things that should exist: smart water heaters (, , )

by fluffy at 9:48 AM

Why keep heating a water heater to its peak need temperature all day when most of the time you only need a smaller amount of hot water? Why can't a water heater learn that you tend to use more hot water at 8:30 AM and raise the set point an hour or two in advance to anticipate the need, and then turn the set point back down to a more energy-efficient level later on?

Tankless water heaters try to solve this same problem in a different way (only heating the water as it's needed) but they have significant issues with TCO and maintenance, and they have a lot of lag between water being pulled and water being heated, meaning that it ends up wasting a lot of water as it heats up. They're also pretty limited in how much of a temperature delta they can produce, especially in electric models, and this can be a big problem in colder climates.

A hybrid approach (moderate-sized tank with a moderate set point, on-demand heating to get to the target temperature) might work better but it seems like it would bring in the worst of both worlds (even more maintenance, more space usage, more peak power, and still wastes a lot of energy all the time).

Obviously, a conventional water heater with perfect insulation would be great. If someone can figure out how to insulate it perfectly, that would be a start. (Remember, a lot of heat loss comes from the pipes that are connected to the heater in the first place!)

Older »