PurpleAir Sensor Investigation and Teardown, Pt1

With the ongoing poor air quality all over Central California due to the Camp Fire, the interest of providing fine grained and reliable air pollution measurements peaked. One of the interesting providers of data is the website PurpleAir.com. The data for PurpleAir is sourced from a series of sensors sold through the website

Parts Roundup: FemtoFET

FemtoFET vs SOT-23

Ever felt like your board level MOSFETs were too large?

Texas Instruments now has an answer!

Simple CO2 Solenoid Carbon Doser Project

Controlling pressurized carbon dioxide (CO2) delivery into a Calcium reactor or into a planted tank with precision can be fraught with problems. The conventional mechanism is to use a needle valve after a pressure regulator - this design is very finicky to adjust for low flow rates and has a tendency to drift over time, meaning your carefully controlled delivery is now out of whack. In addition, if you use a pH controller driving an AC solenoid valve, the valve actuation can be quite audible.

EVE-Central.com in the age of EVE Ascension

After a week delay while the United States elected an authoritarian misogynist xenophobe (more on that in another post), CCP games will be releasing one of the most fundamental player-focused changes in EVE Online; free-to-play in the form of Alpha Clones. This is a critical inflection point in the history of the game I first picked up in 2003, as an alternative to Earth and Beyond MMO which was on its downward spiral.

Spectrometer Pt 2 - Driving

First things first, we need to figure out how to drive and read the spectrometer. There are two key diagrams to consult - the suggested application and the timing diagram. The application diagram shows several key signals, some of which the meaning isn’t clear at first. After reading through the rest of datasheet, you can generally make out the following pins: Video - the spectrometer is like a 2d camera - it is an image sensor in a line after all.

Spectrometer for LED lighting analysis

Hi! You may remember me from other threads like LEDBrick DIY puck and high density stars, plus drivers (now available on blueAcro.com and the Apogee sensor PAR interface board. Many moons (months) ago, I dropped some money into a GroupGets buy for a pair of Hamamatsu Micro-spectrometers. They can resolve light intensity between 340-780nm in up to 15nm increments. They are not cheap ($180 on groupgets, qty1), but are a lot cheaper than other commercial pre-packaged light spectrum units that employ an actual spectrometer (and not a coarse approximation using an RGB light sensor).

Design Log: LEDBrick Acrylic Enclosure

I spent some time mocking up a case for the lights. I’m not totally happy with the side panels yet (more on that later), but a quick walk through the process:

Design Log: LEDBrick - part 2

Nearly 6 months later, and after back-burnering the project multiple times, I’ve made some significant progress on the LEDBrick aquarium light. In the space between blog posts, I’ve: Received a round of metal-core PCBs for the LEDs. Designed an 8 channel driver board based on the L3414, a different sketch from the original planning Machined a single heat sink, and did test mounting of the emitter board. Populated one emitter board.

Service Discovery: One, Some, or All

Service Discovery, to use the basic definition, is the mechanism in which services, residing at a non-static address, can be found on a computer network. There are, in a basic nutshell, three types of service discovery, modeled after how they offer their service endpoints to the clients. This set can be reduced to two types in most real world scenarios. Service discovery systems are designed to return endpoints, a list of one or more logical host and/or host:port or even URL lists.

Design Log: LEDBrick Aquarium LED Lighting

This design has been on my back-burner for quite awhile, but its time to write it up and continue pressing on.

I really like reef aquariums. I currently have a (modest) 90 gallon system, which has livestock dating back to when I started keeping salt-water systems in college (circa 2004). How I managed to actually afford keeping a salt-water system in college is beyond me, but things have progressed nicely.

Design Log: NixieView

As part of an effort to share more designs, I’ve decided to start writing a continuing series of blog articles on my hardware design efforts. This first article covers the NixieBoost of a NixieView.

Supermicro IPMI Remote KVM Annoyances

So, you have a Supermicro server somewhere remote. Thats cool, they have a nifty IPMI module (either bridged to the primary interface or on a separate port). One of the features is a remote IP-KVM over what is mostly VNC. Of course, you have a complete distrust of anything embedded, so your IPMI is on a separate LAN/VLAN. You also don’t have a VPN to this IPMI LAN, because thats a lot of work for something that you’ll never use, and everyone just uses ad-hoc SSH tunnels anyway, right?

EVE-Central API is now running on Spray, Akka, built with Scala

The EVE-Central API service was refactored on top of a new framework, both as an aid to scale (for performance reasons), and an exercise in using new tools for web development. Except for a few growing pains, the stack has been reliable and performant. The bits and pieces that made this possible: Scala - A static typed JVM-targeted language with a very good mix of functional programming. Often compared to OCaml and F#, where it shares a lot of similarity.

iOS - Set a pattern background image for a UIView

In iOS, there is no way to slug a background image into a UIView - making it slightly trickier to style your new iOS application background (and who doesn’t like the new iOS 5 linen?). However, you can apply a UIColor. Did you know UIColor can be a pattern? And the pattern can be defined by a UIImage? Well, it can, and here is a one-liner to do so: self.view.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"bgs/fileinbundle.

Semantic End-User Documentation: Docbook or Sphinx?

When you think of user documentation authoring systems, a couple of traditional tools often come to mind: FrameMaker, Microsoft Word, InDesign, RoboHelp, LyX, TeX files, MadCap Flare. Some are fully proprietary, while others embrace some standards. Some are semantic, while others are design driven. With the evolving output formats that are present today (and tomorrow, for the future predictors), there is honestly no excuse to have your primary authoring environment be non-semantic.

EVE-Central after EVE-Metrics

As you may have heard, EVE-Metrics is planning on moving to bigger and better things. This leaves (the older, more battle scared, and way less slick) EVE-Central as the only remaining EVE-Online market data aggregator. Despite not being an active EVE-Online player either, I am leaving EVE-Central up and running, but I need your help to keep the cobwebs from piling on too thick! First off, EVE-Central needs enhancements. Currently, even simple things like determining the buy and sell price in Jita are horribly flawed (due to gaming of the statistics).

About rle_unpack in libevecache

I have had several questions regarding the “rle_unpack” function in libevecache. In order to not repeat myself in e-mails, I decided to make a quick post describing the logic: The market rows are compressed with an odd variant of run-length-encoding. In this case, the extra “0” bytes are suppressed and encoded into one byte. The row starts with a opcode byte, which is split as follows (high bit to low bit).

Reverse Engineering the EVE-Online Cache Files

So, I’m doing it after all. Reverse engineering the cache files. The format is actually surprisingly simple once you determine the identifiers of all the data fields (and their lengths). No reverse compiling or digging into the EVE runtime was performed, simply educated guesses and a knowledge of CPython internals. Progress is good. Relevant data identified. More results to be posted, and then an open source code release. Update 1


Have you ever wanted to use the UNIX shell utility tee, but instead of simply dumping to a file, invoke a series of subcommands that would run inside the pipeline? If so, I give you ptee, now available in version 1.0. ptee extends the idea of tee by allowing not just filenames, but a whole shell expression (or command). For instance: ... | ptee "grep foo | zcat > outfile" | .

Big Monitors, Window Management Frustration, and finding StumpWM

You may be like me, and have a large (20”+, or especially 30” in this case) monitor attached to your computer. You’re also a avid computer user and have more than one program open at a time which you want to view simultaneously. You also use the keyboard much more than the mouse (except when lazily surfing the web). How often have you noticed spending large amounts of time moving your windows around, resizing, moving, rearranging, and all the normal window management jazz?

Using Facebook’s Thrift with Python and HBase

Today I’m going to show you how to interface Python to Apache HBase using Facebook’s Thrift package. Hbase is a documented oriented database which is very similar to Google’s BigTable (in fact its more or less a clone of BigTable as seen in the BigTable paper). HBase has two primary interfaces - a REST API which is relatively slow, and a Thrift interface, which is recommended for high speed communication.

About the EVE-Central.com Interface

I get the occasional question about someone’s browser being seemingly stuck in “IGB” mode. Usually, its not actually stuck, the user was simply expecting some more graphical pizzaz out of EVE-Central.com. So, why is the interface so bland? Maintainability is the primary reason. The EVE-Online in game browser is a rather buggy, slow, and temperamental beast. CSS support is worse than Netscape 4, and performance is akin to a Pentium 66 rendering a huge table - it just can’t do it without a week long crunch.

Tapestry 5: Rendering a Block in a page

This one took awhile to figure out. In Tapestry, if a component is passed to another component (such as your main page layout component), you need to pass it as a Block parameter. The problem with blocks, there is no quick way to render them. You can use the @AfterRenderBody rendering stage annotation, but this gives you very limited flexibility in where the object will end up (or you make kludgy hacks to put this together).