Tags

command-line search language

09:22, August 10, 2018

At work, I've built a command-line client program for a number of microservices, which mostly do CRUD operations. I am looking to add search capabilities, but this is not as easy a task as I'd thought.

Possibilites

Let's call this client program boxer, because that's what it's actually named.

So using boxer, one can query a service to return an item in a database. Let's call this a thingy (not what it's really called). Getting a thingy is simple:

boxer get thingy [thing name]

And if we want a list of thingies:

boxer list thingies

With me so far? This is easy stuff. But what if we want to filter that list of thingies? Maybe it looks like this:

boxer list thingies where name = 'monkey'
boxer list thingies where name = 'goat' and version = 1

That's a little SQL-like. Or maybe it looks like this:

boxer list thingies --name 'monkey'
boxer list thingies --name 'goat' --version 1

But then the client program would have to know the structure of the data at the time it builds the argument parser - this is either really difficult, or involves querying the API for information. Probably not worth doing.

Or if there isn't a whole lot of data, the list call could return everything as JSON, and we could filter it using jq:

boxer list thingies | jq '.|(select(.name=="monkey"))'

This of course gets messy, and when you have a LOT of data, it's expensive to fetch ALL of it each time you only want a subset. Better to do the filtering at the back-end.

Common searches

Some things I figure people will commonly search for:

  • string 'like' or pattern in a string
  • item with an integer field max, as in "the thingy with the highest version"
  • item with the most recent date

Prior Art

I've been searching for any sort of "standard" for doing this, but so far I've come up empty. Lots of programs do this kind of thing, but it seems that everyone just re-invents the wheel each time, and there's no consistency.

So I'd be interested in ideas here :)

i do not consent

00:20, July 28, 2018

So I saw this post from the EFF today, and it seems like a pretty clever idea.

But none of the images are quite the right size for my OnePlus 5T, so I pulled out GIMP and went to town. Here you go:

These images are all 368x736, the 5T is 1080x2160, so this should be decent enough.

Enjoy!

Taxi Maintenance Again

00:02, July 10, 2018

So I've been meaning to replace the old battery-backed RAM in my Taxi pinball machine for a while, and so when I had nothing better to do on Sunday, I started poking around to figure out what I needed.

Got that ordered, and since I was on a roll, I replaced a bunch of bulbs that were out.

And then I started testing the power supply power...

At this point I was making a day of it.

We've been here before

I the process of figuring out what I've got, I realized that Williams actually labeled all of the circuit boards with a serial number, and the model number of the game it was intended for (or at least, came from.

Taxi is #553.

However, my main board is labeled 567 - Jokerz!. So is the power supply board. But the "auxilliary power board" is labeled 568 - Earthshaker.

All of this means that my machine has been through an extensive refurb before.

I checked IPSND too - nobody else registered the serial numbers.

And here too

Today, I started investigating why the "spin-out" launcher ramp wasn't working as well as it used to. I think it's because the launcher makes contact too high on the ball, but I haven't really finished the investigation yet.

One suggestion was to make sure the switch that registers a rotation around the spin-out bowl is just barely resistant, so it doesn't slow the ball down... and while taking the assembly out, I found a major part of the issue is a crack in the plastic.

But then, when I took the entire assembly out, I found more evidence of a previous refurb - someone "fixed" this by applying metal duct tape to the underside of the spinner, to keep the cracked chunk in place.

Curiouser and curiouser.

To Do List

So here's the next few steps:

Replace RAM with NVRAM

Who wants their high scores to disappear when shutting the machine off? Who wants to have to setup all the system settings ever time you turn the machine on?

Or more importantly, who wants leaky AA batteries ruining your main board?

Full details #1

Replace TIP-42 transistors in lighting matrix

I've already had issues with circuitry overheating - I bought the machine with serious damage to the interconnect board (J6 of course), so this task seems pretty simple and good for longevity.

You replace all the TIP-42 transistors and their 27-ohm current limiting resistors with much cooler MOSFETs (I ordered the IRF9530).

Full details #2

Replace power supply ZR2 and ZR4 with 91V diodes

The display takes 100V normally, but if you replace the 1N4764A zener diodes in the power supply with 1N4763A, it then runs at 91V, and it'll last a lot longer.

Easy stuff.

Full details #3

Replace capacitors in power supply

Caps get old. I used to repair engine control units in DSM cars, because when caps get old, they leak. $23, no brainer.

Also I think my big 18,000 mfd filtering capacitor is going.

Replace single bulb to right of "CAB" lanes

Unfortunately, I'll have to remove the express lanes to get to this one.

Finish fixing "spin-out" issues

I'm not sure if this is a level issue, or the playfield has sagged a bit, or if the appears-misaligned launcher is the issue - it could just be I need a new spin-out assembly.

What I have already done

Since I'm typing this up, here's what I've already done over the past over 15 years (I bought it in about 2002), roughly in order:

  • Rewired incorrectly wired flipper
  • Replaced flipper coils, switches, EoS switches
  • Replaced burned out GI connector (J6), jumped blown-off solder traces
  • Cleaned corroded battery residue
  • Replaced balls
  • Replaced entire left flipper assembly
  • Replaced launcher sleeve and spring
  • Replaced not-original Lola ROM with proper Marylin ROM
  • Replaced many, many bulbs
  • Replaced all rubbers
  • Replaced broken plastics: * Marylin "lights carry passengers" * Both slingshot * Side "lights carry passengers"
  • Properly secure knocker assembly

static website generation with jekyll

10:18, July 2, 2018

So in an earlier post I mentioned I’d be rebuilding all of my dynamically generated website stuff with a static generator. Still doing that, but now I’m using Jekyll.

Mostly, I decided I just wouldn’t re-invent the wheel.

Some tricks

The posts tree

That tree on the left there - that’s generated with a method similar to in this blog post, and uses jquery.treeview at the moment (must get around to updating that).

The tags list

Also on the left, the tags list is auto-generated. Individual tag pages are automatically generated using jekyll-tagging.

Instagram collection

On the right, we’ve got posts pulled from my Instagram account, using their soon-to-be-deprecated Instagram API. I have a script which basically generates a Jekyll Collection from the available posts, and then I render that with a simple bit of Liquid.

Probably I’m going to have to do some really annoying data scraping if I want to keep having this work in the future.

Concerns

Plugins are done in Ruby. I don’t like Ruby.

Also, a lot of the URLs have changed, but I’m not sure just how much I care about that. I mean, who would be linking to this site?

A test post

21:26, July 1, 2018

Hi, this is a test post. I'm arguing with the tree on the side. Some useful links which discuss ways to do this:

bunch of links

00:15, January 31, 2018

Couple of links to stuff I’ve been working with recently.

arrow

A really nice Python date library.

packagetracker

A fork of another Python library I tried to contribute to, but that the author has basically abandoned.

IEX Developer Platform

Rather nice web API for obtaining real-time stock quotes.

Envoy

Full-featured and highly-performant distributed reverse proxy engine. Not sure how I missed this one before… nor why I’m still using Amazon’s ELBs now.

bottom

A decent, lightweight Python asyncio IRC client library. AsyncIO all the things!

rebuilding things

23:05, January 30, 2018

Recently I decided it’s about time to retire the ancient server that has been running my website (and mail and dns and a bunch of other things) - It’s a Northwood Pentium 4 Xeon from 2002, the kind with Hyperthreading. Running Linux 3.7.10. 32-bit.

Yes, that’s old.

Rather than upgrade, I’m probably moving all of this somewhere else, likely a cheap VPS somewhere… and since there’s a whole bunch of really old Perl running things here… I’ve been doing some rewriting.

Static webpage generation

The original website I put on this current server used a backend based on some unspeakable perl, but the most recent was using Pylons… and by “recent” I mean circa 2010. So yeah, that’s got to be redone. I pondered another web application, but decided that rather than doing on-the-fly content generation from templates, why not just pre-generate it?

So that’s what I’m doing. I’ve started building a bunch of Python scripts using, Jinja templates, and Markdown for blog content. Naturally, all run by Makefiles.

Let’s Encrypt

Since I’m doing it all new, I’m finally going to go full SSL, via Let’s Encrypt. Yeah, about time.

So yeah. Stay tuned.

bytiness

09:53, January 3, 2017

Coworker Greg said something about the "bytiness" of files, when he was talking about their sizes. He was talking about file sizes, but my mind wandered a little bit down the rabbit hole of defining "bytiness" clearly.

So here's my interpretation of what that means, implemented in Go. Because sometimes I like Go. No, really.

mirroring http traffic

11:59, March 9, 2016

Today I needed to figure out how to mirror 100% of inbound HTTP/HTTPS traffic to a second cluster of backend servers, whilst not disrupting the production traffic going to the primary cluster.

There's lots of tools to do things like this, for example duplicator and teeproxy and parallel-proxy. But those are all "code I found on the internet" and possibly questionable, and in some cases, written in node.js, which I don't know if I consider "mature" or "robust" enough for production traffic.

But there's a much better answer: nginx! It's simple:

server {
    listen 80;
    location @mirror {
        proxy_pass http://mirror.test.com;
    }
    location / {
        proxy_pass http://primary.test.com;
        post_action @mirror;
    }
}

hacker kangaroo

23:17, October 15, 2014

Building on what Stephen said in his post When is a Martini Not a Martini, I have decided to name a drink.

Some time ago (quite some time indeed), I worked at Federal Express as a box thrower. I mean, package handler. Make sure you pack well, trust me. Anyway, I saw a lot of boxes. At one point, I noticed a box containing Triple Eight Vodka. Being a fan of such things, I was curious, and at some point later I had the chance to try this. Great stuff.

Vodka is one of those things that everyone says when good, shouldn’t taste like anything. I think that’s wrong - it should have taste, but it shouldn’t have bad taste. What’s the point of liquor that is tasteless? I’m not an alcoholic, I don’t drink to get drunk.

So there was this bottle of Triple Eight in my freezer, and then it was gone. Having recently sampled Crystal Head Vodka, I decided to take advantage of the sale at the local Total Wine and buy a bottle of this as a replacement. And as a bonus, it’s even signed by Dan Akryod!

Recently I’ve been almost exclusively an Old Fashioned drinker. I’m not sure there’s a better cocktail (though I do love a good Negroni), and I’m not very picky which whiskey goes into them. But there’s this bottle of Vodka in my freezer that I must admit isn’t quite as good as the previous bottle, so why not finish it off so I can go back to the Triple Eight?

Today’s cocktail is a mashup of the Gibson Martini and the Kangaroo Cocktail - 2.5oz vodka, 0.5oz dry vermouth, and a cocktail onion.

I’m calling it a Hacker Kangaroo.

This is where you get my extremely subtle pop culture reference. Right?

…maybe?

exploited

11:44, July 9, 2014

Fun, I just got hit by this flaw in ElasticSearch.

[RSS]