# Linear RAW Conversions

## The first step when using photos in your computer graphics.

Real world photography is a fantastic and easy source of data in computer graphics and visual effects, be it for textures, backgrounds, or light maps. There is one complication that is very easy to overlook, and tricky to get right: linearity.

In real world light transport (and the simulated version of it in our various renderers) the math of light operates in a linear manner. That is, light source A with intensity 1 and light source B with intensity 1 will combine to intensity 2 (in whatever units those numbers are).

However, image capture and display devices do not work in a linear space. This is mostly historical, and maintained for backward compatibility for the content that has been produced in the past, but we must still deal with it to this day. In order to be immediately useful for 99% of cases, non-RAW image formats (as produced by your camera or the RAW converter) have the inverse curve already baked into the image so that they appear similar to the real world when viewed on a display.

It is this curve that must not be applied in order for our photography to be representative of the world (as far as the math is concerned).

I won't get into what "gamma" means, or scene-referred vs. display-referred imagery, so for an in-depth look at linear workflows see Sony Pictures Imageworks' 2012 SIGGRAPH course nodes (PDF) and this FXGuide article.

So how do we get linear output from our DSLR?

Posted . Categories: .

Recently, someone broke into Adobe's network, stealing source code and part of their password database. It later turned out to affect at least 38 million people.

I always try to investigate to see if I am personally impacted by these leaks. Usually, that means submitting a carefully hashed password to some online service built to inform you if you were part of the leak. This time, however, the entire file was readily, and easily availible (by which I mean my Twitter feed included a link to it, several times).

So... why not take a peek?

\$ grep mikeboers cred


While not surprising, I am still dissapointed to be included.

Digging just a little bit deeper, there are some very troubling things in this file.

Posted . Categories: .

After a day long refactor, everything is back to working the same. Time for those previously impossible features!

@mikeboers on . Visit on Twitter.

# Yet Another Reason I Hate Time

While the Y2K bug turned out to be a bust, the concept behind it is pretty solid.

I have always had a lingering concern for 3:14:07 am on January 19th, 2038 UTC, as that is the last second representable in signed Unix time, and time in systems that still use that representation will wrap around to January 1, 1970. (See the year 2038 problem.)

At the time, 70 years in the future seemed infinitely far away.

There is no chance this will still be running in 70 years.
— Likely said by someone on the POSIX committee.

Unfortunately, that type of thinking just cost a very expensive space probe. 8 years into the Deep Impact mission that was designed for a single event, its clock rolled over, the probe couldn't figure out where the sun was and so couldn't point its solar panels at it, and lost power.

"Basically, it was a Y2K problem, where some software didn't roll over the calendar date correctly," said A'Hearn. The spacecraft's fault-protection software (ironically enough) would have misread any date after August 11, 2013, he said, triggering an endless series of computer reboots aboard Deep Impact.
"NASA Declares End to Deep Impact Comet Mission", National Geographic

As always, anthropomorphized space probes pull at the heart strings:

Little space craft gets confused, lost, starves to death. #anthropomorphism MT“@mitsuhiko: http://t.co/79wnAY5ySh”

@TanyaLMS (Tanya) on . Visit on Twitter.
Posted . Categories: .

## Moving configuration and hooks into the tree.

When writing tools for git, or while working on more complex projects, I often need to work with the git configuration or hooks.

Unfortunately (or so I sometimes feel), the configuration and hooks are not stored in the tree (the version controlled part of repo), and must be installed out of band. This easily leads to a non-uniform configuration across clones.

Let's get that information in band!

Posted . Categories: .

## A quick filter for dealing with social network notifications from different channels.

While I appreciate the emails from Facebook, Twitter, and LinkedIn, etc., they have really started becoming more of a nuisance than anything as they are essentially duplicates of the push notifications sent to my phone.

I do want to keep the emails as they serve an archival purpose (and I do like to archive far too much information), however the push notifications on my phone are more immediate and actionable to me.

Ergo, I just quickly setup a Gmail filter that selects the following and stuffs it into a notifications label:

to:mikeboers.com AND from:(twitter.com OR facebook.com OR facebookmail.com OR linkedin.com)


Now I get to keep them all, but the lock screen on my phone doesn't fill up with duplicates of the same messages via different channels.

Posted .

# Render Heatmaps

## Are pictures worth 1000 statistics?

Debugging rendering issues can be particularly problematic. Many times, the efficiency of standard debugging procedures (e.g. printing intermediate values, or using a debugger) fall apart at the sheer volume of data they will produce when you are calling them millions of time per frame.

Often, intermediate values can be dumped out via an AOV (i.e. to another image), and inspected as an image. For example, if you were interested in how long various parts of the image are taking to render vs. the others, you could create a heatmap such as:

In this particular example, however, there are a few drawbacks:

1. RSL does not have any timing functions;
2. every shader would need to be modified in order to collect these stats; and
3. you generally only receive information from the front-most surface.

I set out to resolve those issues.

Posted . Categories: .

# The UX of Coupon Codes

## How to (try to) avoid confusion and apprehension.

Lately, I have been entering a number of coupon codes on the web, and have found them to be infuriatingly lacking in one respect: the character set used for the codes is not easy to type.

I'm sure we have all questioned at one point if a character in the code was supposed to be a 0 (zero) or O (upper-case letter O), or a 1 (one), I (upper-case letter I), or l (lower-case letter L). Usually you just pick one, and usually you get it wrong the first time.

I find it particularly strange, that Starbucks would go so far as to recognize this problem, but not actually fix it:

As a developer, there are a few increasingly dramatic ways to deal with this.

Posted . Categories: .

# Nginx May Cut You Off Early

## How the default configuration bit me.

I very recently launched shadowsinthegrass.com, a crowd-funding website for a short film I am working on. As a donator, you are able to upload an avatar to be presented with your credit. I had limited the file size to 2MB... or so I had thought.

Underneath, the site is built with Flask, served with Gunicorn, and behind an Nginx reverse proxy.

Unfortunately, I received reports that some uploads were failing and reported as "Error: undefined" to the user. Strangely, it didn't seem to be an error in the Python app, as I was not receiving any tracebacks when this error occurred.

It turns out that Nginx has some default configuration that I wasn't expecting.

Posted . Categories: .

# My Report Card

The second GitHub Data Challenge recently finished, and GitHub just announced the winners.

The first place went to The Open Source Report Card, which generates an English prose summary of your GitHub activity (from January to March 2013), and provides some charts to back it up.

My report card for that period is somewhat eerie (to me):

Mike is a serious Pythonista (one of the top 13% most active Python users) who loves pushing code. Mike is a nine-to-fiver who seems to work best in the mid-afternoon.

[...]

It seems—from their activity streams—that Mike and westernx are probably friends or at least virtual friends. With this in mind, it's worth noting that westernx is less foul mouthed

I would love to see a chart about my tendency to swear in commit messages.

Posted . Categories: .
View posts before June 27, 2013