Env

· · learn more

 On rainbows

(Halfway through writing this I double-checked that the techniques it shows were actually new – and, trying different search terms, found that Jim Bumgardner, a Processing expert, had already explained them perfectly well. With his encouragement I’m publishing this anyway.)


Here are two techniques for picking useful colors for data visualization: a rainbow function and a generator of distinct colors.

A rainbow function

Let’s say we want to turn a one-dimensional value into a color: something like rainbow(n mod 1) → 8 bits × RGB. This is useful to show information on a circular scale, for example time of day, longitude, or angle, and can be lightly abused for many other purposes. (Keep in mind, of course, that about 1 in 25 people is colorblind.) The usual solution is to use n as the hue of an HSV color with S and V both at the maximum. In python 3, that might look like this, cribbing from Wikipedia:

def HSV_vivid(h):
  h %= 1
  h *= 6
  c = 1
  x = 1 - abs((h % 2) - 1)
  rgb = ()
  if   h < 1: rgb = (c, x, 0)
  elif h < 2: rgb = (x, c, 0)
  elif h < 3: rgb = (0, c, x)
  elif h < 4: rgb = (0, x, c)
  elif h < 5: rgb = (x, 0, c)
  else:       rgb = (c, 0, x)
  return (int(chan*255) for chan in rgb)

Which we can visualize thus:

The white line in the graph is the sum of R, G, and B, at the same scale. Assuming that you perceive each channel as equally and linearly bright,✼ you’ll see different points on this color wheel as having brightness varying by a factor of 2 between (a) the troughs at the three angles where one channel is at max and two are off and (b) the peaks at the angles bisecting those. This is why most digital color wheels have spokes.

✼ Which you don’t: greens and yellows are easier to distinguish than blues, which compounds the problem. On a typical monitor, the point at 60° is often hard to distinguish against white, while the deepest blue at 240° seems almost as dark as charcoal gray. So we can’t use HSV like this when we want the colored elements to have equal visual weight against any solid background.

To make something better, notice that the HSV function is based on a single sharp, mesa-shaped curve. It’s repeated, evenly offset and wrapped around the color wheel (in other words, modulo’d by one rotation), for each channel. We could use a replacement for the mesa curve such that evenly offset-and-wrapped copies sum to a constant. When I wondered aloud about this, Sam immediately pointed to sin2. It looks like this:

def sinebow(h):
  h += 1/2
  h *= -1
  r = sin(pi * h)
  g = sin(pi * (h + 1/3))
  b = sin(pi * (h + 2/3))
  return (int(255*chan**2) for chan in (r, g, b))

The first two lines are just setup to start the 0..1 cycle on red and run in ROYGBIV order clockwise, and π appears because the sine function works on radians. (If you’re into micro-optimization, you can see ways to refactor for constant folding and FMA here, but let’s keep it readable.) Here’s classic HSV again, plus a sin2 version:

Depending on your eyes and monitor, the difference could be large or small, but it should be clear that the sine-based one is smoother. Its colors are relatively muted, but only relatively, and they look consistent. Compare 0° with 180° in each wheel, for example. To me, the HSV’s looks like rich, candy apple red v. pale, robin’s egg blue, while the sinebow’s is a much more balanced contrast of medium red v. medium turquoise. We lose the sharp, daffodil yellow at 60° and the deep, inky blue at 240° – but that’s exactly what we set out to do: they may be fine colors, but they aren’t team players. The sinebow gives us a set of colors that really do seem to vary only in hue and not in saturation or value.

Case closed, as far as I’m concerned. I’d replace HSV with the sinebow pretty indiscriminately.

Incidentally, the sinebow in its most natural form has no branches. This makes it suitable for GPGPU, while a textbook implementation of the classic HSV function has to run each of the 6 cases serially.

Color sequences

Suppose we want a sequence of m distinct colors, for example to distinguish the layers of a map, the handles of people in a chat room, or objects in a game. To give them equal perceptual weight, we can take them from the sinebow’s color wheel. We start at 0 and move 1/m of the way around to generate the next color. This is simple, fast, and effective. But there are two things we might want that it can’t give us: (1) even where m is large, each color in the sequence should be easily distinguished from its dozen or so sequence neighbors, and (2) we should have a way to deal with situations where we don’t know m when we set up the generator, for example in a chat room that an arbitrary number of people can join.

Here’s a scarecrow: use random numbers. This actually works fairly well in practice, and it’s certainly simple. But it’s irritating to know that nothing but the odds are protecting us from, like, five successive indistinguishable colors.

We could use some kind of interleaving scheme involving bit-shifting, angle bisection, or prime numbers, but if you pursue this even briefly (as I did), you’ll find yourself dealing with an awful lot of computational complexity or saved state just to pick colors. It would be nice to have an algorithm that’s firmly O(1) in time and space.

We could get fancier with randomness and place a point uniformly somewhere in the half of the wheel across from the last point. This is better, but it doesn’t protect us from runs of alternate identical colors. And if we go further on the path of narrowing the window(s) in which we place points randomly, we’re only working toward placing them deterministically, which we can’t do without repetition.

Actually, no. What we can’t do without repetition is use a rational ratio as an angle. But there is certain ratio✼ which, when used as a stride around a circle, minimizes total point nearness as the point count increases. It’s the same constant that many plants approximate for the analogous problem of phyllotaxis, or placing leaves around a stalk so they don’t block lower leaves’ sun and dew: φ, the golden ratio. As an angle, it’s about 137.507°. There are a lot of boring, pareidolic claims about φ having special esthetic properties and such, but all you need to believe here is that it’s the most irrational number. Therefore a sequence of colors that are φ apart is as far from repeating as possible in the long run.

(✼ You might know the punk/funk band A Certain Ratio from various songs like Life’s a Scream and Anthem. Their name is taken from Brian Eno’s The True Wheel, possibly the least accessible track of Taking Tiger Mountain (By Strategy), an album named after «智取威虎山», one of the eight model plays approved for performance during the Cultural Revolution. Here’s the most famous film version. In America, the best known of the eight is probably the ballet The Red Detachment of Women, because it was performed for Nixon on his famous visit. This is fictionalized in Nixon in China: in a scene where a woman is whipped, Pat Nixon (represented as a kind of friendly moron), apparently forgetting that it’s fiction, objects and steps onstage. Jiāng Qīng (a kind of needy monster) is provoked by this and sings the famously disturbing aria I Am the Wife of Mao Tse-tung, using the actors as props to praise Máo and prefigure her betrayal, in the Gang of Four, of Zhōu Ēnlái in the second half of the Cultural Revolution – in some versions coldly, in others shrilly – and it all gets very hammy and subtle. For me, it’s the creepiest part of a creepy opera, and it carries a lot of the larger interpretation. In any case, I think Eno claimed the lyrics of The True Wheel came to him in a dream or something, but out and about on the internet one certainly sees people assuming the phrase a certain ratio has numerological significance.)

Here’s an animation that helped me visualize this:

And a good answer to someone’s questions on seeing this.

You can write the code as a very small class or generator. All you have to do is keep adding φ ≈ 1.61803 revolutions (≈ 2.39996 radians ≈ 137.50776°) to your last number. Or, of course:

def nthcolor(n):
  phi = (1+5**0.5)/2
  return sinebow(n * phi)

Let’s see what this looks like compared to some other strides:

that 1/5

that π

that random

that φ


QED.

 Carl Sagan as the hero on the beach

In the last century, the concept of the oral tradition came into mainstream Western academia. Philologists – halfway between modern scholars of linguistics and literature – had wondered in their Victorian way whether Homer was real, and when they looked at living myths of comparable complexity they found that they had no single authors but were reinvented a little in every telling. This helped explain a strange feature of the Homeric poems: the poetically void repetition of epithets, the adjectives interchangeably attached to often-mentioned things, say godlike Achilles and lion-hearted Achilles. These suddenly made sense when seen as ways for a poet, thinking while speaking, to push and pull within the hexameter and make room for more spontaneous phrasings in the rest of the line.

In 1960, D. K. Crowne published The Hero on the Beach: An Example of Composition by Theme in Anglo-Saxon Poetry, saying that there was a larger and more abstract kind of formula, a kind of thematic epithet, and used as the type specimen a situation in Beowulf and elsewhere: the warrior-hero (or equivalent) standing on a beach (or equivalent) in the presence of his companions (or equivalent) and a notable light or brightness (often flashing or sparkling).

There was a wave of enthusiasm for this idea, and many scholars identified it and other repeated situational themes in the Anglo-Saxon and other oral traditions. Then there was a trough, and in 1987, John Richardson published The Critic on the Beach, which argued that the spotting criteria of the hero on the beach had so much wiggle room that it was basically unfalsifiable, and all it really said was that main characters go through transitions near other characters and vividly described things. This is hardly news – in almost any interesting story, oral and Anglo-Saxon or not, there’s something that can be taken this way.

I don’t know. The theme of the hero on the beach could be real or imaginary. But I do know that Carl Sagan at the beginning of Cosmos stands on a beach surrounded by nature and life and hope while the sunlight sparkles on the water.


 The time we met a train-track builder

Yesterday the niece and I took the tram eastbound. We admired the view of the water city, as she calls it (look, it have biiig river ’n’ lots of bridges for cars, see?) and the construction work on the various South Waterfront projects. On the way back to downtown, we found ourselves walking next to someone in PPE.

Niece (suspiciously): Heeey, that’s a builder!

Stranger: That’s right, sweetie!

Niece: You build-a-ing you the all the things? ’N’ dig the hools [holes]?

Stranger (pointing at the streetcar rails): Well, I mainly laid this track.

Niece (looking like she’s not sure whether she just met Santa Claus): What?

Me: She made the train tracks. She put the tracks together in the ground.

Niece (delighted): Wow!

Stranger (delighted): Yep!

Me: Should we say thanks to her for making the train tracks so the train can go?

Niece: Thank you! Wow! You did it! Good job!

 The time the BBC cited me to myself

I have a lot of respect for the BBC. They dig deeper, even in routine stories, than most of their competitors. For example, my last post here was a transcript of an interview with an important man whom I did not find interviewed elsewhere. The closest was two days earlier in an AP story:

Back during the country’s civil war, the FN rebels also received help from a Liberian faction — this one allied with Taylor. One ex-Liberian combatant from Taylor’s disbanded army told The Associated Press he was now serving as a “field commander” in Ivory Coast for Ouattara’s forces.

“What we are doing here is no secret,” said the man, who spoke on condition of anonymity for fear of reprisals. “They all want to see Gbagbo give out power to the man elected.”

I suspect this is Blagbe(?), and it speaks well of the BBC by comparison that they got him to chat and presented more than a few words of it to their listeners.

Anyway, as I said in the post, I was very unsure of my transcription. I couldn’t pin down the name of the man being interviewed nor many of the towns he mentioned. That was embarrassing. So I went to the BBC’s podcast contact subsite and waded through about a dozen warnings that they don’t generally provide transcripts. While I understand that they aren’t in the transcript business, a lot of their programs are reading-based, and for many people (e.g., people with difficulty hearing) a script clearly marked as non-authoritative would go a long way. In any case, I hoped either that someone would have the time to fill me in on the names or that Blagbe(?)’s speech would have a surviving transcript because it was voice-overed, so I used their slightly poorly designed contact form to ask.

Today I got this e-mail from bbc_podcast_website@bbc.co.uk, in which I have redacted a few identifying details:

Dear Mr Loyd

Reference [reference number]

Thank you for contacting the BBC iPlayer support team.

I understand you want a transcript for the podcast of ‘Africa Today’ broadcast on 09 March featuring interview with J.Pelele as you would like the spellings of proper nouns which were mentioned on the show.

Please note that transcripts are expensive to produce and are not automatically made as part of the programme making process. However, I can assure that your suggestion has been forwarded to those responsible for maintain the service.

You can find text of the interview at the below link and hope it provides the information you are looking for:

http://basecase.org/env/battle-commander

This link will take you to a website outside bbc.co.uk. The BBC is not responsible for content or software downloaded from external sites.

Once again thank you for contacting BBC iPlayer.

Kind Regards

[name]

There you have it. My guess-filled transcript is apparently the BBC’s own best source for what they broadcast three months ago.

(On later re-reading, this comes across a trifle braggy. But I have nothing to brag about here; I got nothing right. The respectfully frustrated point is that the BBC acted like it couldn’t do any better. Thank you for listening, and keep those letters coming.)

 A BBC interview with a Liberian “battle commander” in Côte d’Ivoire

I’ve been advised not to write about the incipient civil war in Côte d’Ivoire (on account of it’s depressing and such) and I’m short on time, but here is a transcript of part of today (9 March)’s Africa Today podcast (2:11–5:35). You might want to follow along on Google Earth and Wikipedia.

(Proper names marked “(?)” are ones I could not verify quickly on the web and have left as best guesses. I would be grateful for corrections, especially of the name of the man interviewed here; I searched the web and Google Books for every spelling I could imagine and found nothing. Young is a reasonably popular first name; gbàgbé is a common Yoruba word for forget, but the news reader distinctly uses the L sound, so I’ve gone with Blagbe even though Google very much doubts it. In any case I assume from context that it’s a disposable nom du guerre.)

(If you work at a news organization and already have a transcript of something you broadcast in audio, for example because you needed to read over bad sound, please put it on your web site. Thank you.)

News reader: […] a former Liberian fighter and commander, Young Blagbe(?), phoned our Monrovia correspondent, Jonathan Pelele, to say he was actually commanding troops, including Liberians, to fight in support of Mr Ouattara. Jonathan put it to him that Alassane Ouattara may not be happy to see him fighting in Ivory Coast despite his claim to the presidency.

Blagbe (voiceovered; his audio in the background seems to be at least mostly English, but over a very noisy line): I don’t think he will not be happy, because he is the leader that won, and if someone wants to go against him directly, we should help put the situation under control.

Pelele: How many towns are your people occupying now?

Blagbe: The major towns in the highway we fought in heavily include Begwe(?), Tiaple(?), Zoguine (or possibly Zouan-Hounien, or Zagne), and from there we fought in Kouepleu(?) and then captured Toulépleu. Toulépleu is now under Ouattara’s men – men of the renowned government that is standing. Some of the people we defeated crossed into Liberia. I captured fifty heavy weapons and seventy-five light weapons, with one hundred and fifty boxes of AK-47 rounds from them.

Pelele: What do you intend to do with the ammunition that you captured?

Blagbe: I will report them to my commander. I even have two captured trucks with seven jeeps that I will turn over.

Pelele: You and the New Forces – rebels – are working together? Are you all working together?

Blagbe: Exactly. But I don’t call ourselves rebels, because Ouattara we’re fighting for is the president of this state, Ivory Coast, for now.

Pelele: Right … but do you people hear from Mr Ouattara himself?

Blagbe: I am taking direct orders from my commander, a captain.

Pelele: How many Liberian fighters can you account for on your side?

Blagbe: Roughly – I can’t tell, because I am the field commander here. I am controlling too [sounds more like so in the original] many people. But I have some people from there who volunteer to come here to fight. My bodyguards alone are seventy-five. I’m not talking about the fighters.

Pelele: Do your people know the terrain, really, the terrain in which you are fighting – do you know the area?

Blagbe: Sometimes the Ivoirians lead us into other places that we don’t know.

Pelele: Have you lost any of your troops in combat?

Blagbe: Since I started fighting I have lost only one man in a fight, from Tiaple to Toulépleu. [Zoguine audible in original, probably not in place of Toulépleu.]

Pelele: What is happening to civilians in the area where you are fighting?

Blagbe: Some fled, and as we get them we bring them back home. The only place they are waiting to be captured for them to return to is Toulépleu, and the town has been captured. And I give you two days from now I will be in Goleken(?). From there I will be heading for Abidjan. I want to see the living body of Gbagbo.

Pelele: The concern that people have back home in Liberia is that the war in Ivory Coast should be left to Ivoirians to fight. Why are you people there?

Blagbe: Myself, I have a background in Ivory Coast, from a town called Bampleu on the border. And during Charles Taylor’s days, we were paid to join Charles Taylor and go and fight in Liberia. I was a chief of staff and a lieutenant colonel during the regieme of Charles Taylor. But later I was downsized – belittled – and I had no job. So with this thing happening here, I have to fight for my country, just the same way I fought for Liberia.

This worries me ten to twenty times more than Libya does.

Update on 30 May: I’m tremendously relieved that this didn’t turn into a full civil war. However, as an example of what was happening, here’s a Human Rights Watch report dated the same day as this interview called Côte d’Ivoire: Ouattara Forces Kill, Rape Civilians During Offensive. To my embarrassment, I haven’t got much further on the proper names.

 The Kimbrel rainbow function

When I was doing Julia sets in CUDA I had trouble finding a rainbow color map that looked right. The normal HSV→RGB function gives you outputs of inconsistent luminance: for example, blue has the B channel maxed out but the others at nil, while cyan has the B and G channels maxed out but R at nil, so it’s twice as bright. (Actually no. This depends on all sorts of things to do with monitor response and color perception, but it’s a fair approximation.)

Sam and I realized that you can create a function that has a constant luminance over H by making the R, G, B responses offset sine waves, instead of the gapped trapezoids of the canonical HSV→RGB. I find this makes noticeably more pleasing, natural-looking rainbow color maps. Here it is in moderately optimized CUDA C:

__device__ uchar3 colorize(uchar v) {
  float val = (float)v/255.0f * pi;
  float r = __sinf(val);
  float g = __sinf(fmaf(pi, 2.0/3.0, val));
  float b = __sinf(fmaf(pi, 4.0/3.0, val));
  return make_uchar3(r*r*255, g*g*255, b*b*255);
}

 Modis USA1 averages

I was going to post about CUDA here, but I got on a bit of a yak shaving expedition and ended up solving a problem I run into every few months.

Sometimes I like to average big sets of similar images. Off the top of my head, I’ve averaged Dinosaur Comics and Tower Defense maps. Another common dataset is satellite images. (I even posted one a while ago.)

Here’s an excellent day (20 September 2010) from Modis Rapid Response’s USA1 subset:

yep

Here’s a more typical day (15 October 2010) with more clouds and a more obvious seam between satellite passes with different color balances:

yep

This isn’t science-quality data for most purposes, but it’s enough to play with. I downloaded an entire year of it (if playing along at home, check for recent leap days!):

$ curl -O "http://rapidfire.sci.gsfc.nasa.gov/subsets/?subset=USA1.2009[289-365].terra.2km.jpg" &
$ curl -O "http://rapidfire.sci.gsfc.nasa.gov/subsets/?subset=USA1.2010[001-288].terra.2km.jpg"

and tried to average them with ImageMagick, timing it because I know this usually takes a while and I’m still getting a feel for the speed of my relatively new computer:

$ time convert -average *.jpg average.png
^C
convert -average *.jpg average.png 13.58s user 20.90s system 4% cpu 12:07.91 total

and, as you see, killed it after it had spent more than ten minutes RAM-bound and swapping heavily. This is a little odd when you think about it. There are 365 images × 650 × 750 pixels × 3 channels per pixel × 1 byte per channel = a little over half a gigabyte if stored uncompressed but efficiently. I had enough RAM available that even if it was storing each channel in 32 bits it should have been fine. Evidently it wasn’t.

When this has come up before, I’ve usually averaged in a tree: averaging the images in groups of 10 (or groups whose sequence numbers end in the same numeral, etc.), into a smaller batch of partial averages which can then be averaged themselves. There are two problems with this: first, for numbers of images not divisible by the group size, the average will end up a little weighted. Second, ImageMagick being so slow to average is a methodological bug which no one should have to put up with in the first place. There’s no reason to load every image into RAM before averaging – if you simply keep a running average with a reasonably capacious numeric type, then of course for n images of dimensions d, the RAM use is on the order of 2d instead of nd. This soon matters for non-small n and d! (You could keep a running sum with ordinary bignums and divide it at the end, but this is generally slower and only a little more accurate for plausible sequence lengths.) Because I’m going to want it again, and for anyone doing a web search for ImageMagick average slow, here’s some quick and dirty Python:

#!/usr/bin/env python2.7 ''' Average image files using PIL and NumPy. Reads input images of identical size and bit depth. Writes a PNG. Todo: + check whether output file exists (a likely mistake) and refuse to clobber + check that input image types (e.g. 8-bit RGB) are all the same + output optionally in same format as input + quantify the drift when using smaller floats ''' from sys import argv, exit import Image from numpy import * # float128 for more accuracy and less speed, float32 for vice-versa avgtype = float64 # We can’t init the running average until we know how big the input images are. avg = array([]) n = float(len(argv)-2) # -1 for our filename, -1 for the ouput file if len(argv) < 3: exit('Usage: <input image>* <output image>. Output is a PNG.') for imgfile in argv[1:-1]: try: img = Image.open(imgfile) except: exit('Could not read "%s"!' % (imgfile)) if avg.shape == (0,): # We’re on the first image; let’s set up the average: avg = asarray(img).copy() # copy() to get its dimensions avg = avg.astype(avgtype) avg.fill(0.0) else: if img.size != (avg.shape[1], avg.shape[0]): # PIL does y,x, NumPy does x,y exit('"%s" is not the same shape as the earlier images!' % (imgfile)) avg = avg + asarray(img).astype(avgtype)/n avgimg = Image.fromarray(avg.astype(uint8)) avgimg.save(argv[-1])

In simple tests on the USA1 images, the execution time is indeed sublinear to the length of the image sequence. It averages them all in 13 seconds wall time (10 s with float32, 17 s with float128), which is about one second per minute it took me to get bored of waiting for ImageMagick, so I’m satisfied.

Enough of that. Here’s the full year’s average:

yep

I’m interested in the way clouds and fog seem to stick to the north sides, and avoid the south sides, of points on the California and Oregon coasts.

Here are the averages for each approximate quarter of the last year (Jan–March, etc.) in reading order:

yep

Notice for example that the Columbia River around the Gorge and back along the Oregon–Washginton border was very clear last spring, which I assume is the effect of its famous winds.

My next step, when I have a few more hours to sink into pretty pictures, is to try to pull out a simulated cloudless view by doing something like ignoring pixels above a certain luminance and interpolating through cloudy periods. That project may actually involve CUDA.

 Notes on photography

I started my photoblog a year ago with nothing in mind except a certain style, and it’s refined that style and taught me useful things. You should do one. I’m trying to get back into it after compounded interruptions, and I want to make some notes.

Sappho

I was re-reading If Not, Winter, Anne Carson’s translation of the Sappho fragments. It’s a strange translation and a very good one. It shows Sappho’s power as a witness: her way of folding all the vital textures and motions of a scene lightly into one or two lines. This is lovely but not surprising. What gets me is the drama. Sappho is engaging. In a way I don’t feel again in canonical poetry until maybe Bashō or John Donne (and not that often after), Sappho’s narrator is a knowable person, whose intelligence and vulnerability are not hidden. This is worked in the subtlest ways, by shadings and ambiguities between perspectives. She can’t come at her internal subjects directly. If they were not wrapped in her euphoric precision about the external world, the things she says about herself would be too much. The voice, the genius, needs a foundation of what for a lyric poet is mere technical brilliance.

Because they are fragments, we do get internal phrases out of context. If they had no context at all, they would not be good: a fragment like 38, “you burn me”, is too easy. You could make millions like it by randomly combining striking words. But I can stand it because, from the other 191 pieces of Sappho I’ve read, I believe she made such an ambitious metaphor not only justified but necessary. Very few lyric poets could convince me of that. Rilke, for example, seems to want to tell me how he feels without mentioning why, and drifts in well-appointed solipsism, and he’s better than most. Yet I think lyric poetry is one of very few places where what Sappho does, taking the listener out of themselves, sneaking them into the theater of someone else’s consciousness, can work.

Someone else’s consciousness

There is still old-style observational comedy going around – where you pretend to be outraged because you haven’t bothered to figure something out – but a lot of popular humor now is very sophisticated. People like Maria Bamford, Louis CK, Stewart Lee, and Sarah Silverman, who ten years ago were the avant-garde, are popular for saying things that otherwise don’t get said. It’s hard for me to distinguish this from the proper function of a philosopher or public intellectual, or even the artist as exemplary sufferer (where, Susan Sontag says, “The anguish of prematurely disillusioned, highly civilized people alternating between irony and melancholic experiments with their emotions is indeed familiar”).

It would be tedious to pretend that the comedian Ross Noble, for example, is not doing something close to lyric poetry, and doing it exceedingly well. He has that euphoric precision, and with it he shows parts of human experience that usually can’t be shared. His work is much more moving and deeper than, say, Bob Dylan’s. Watching Noble is an adventure in empathy, intelligence, taste, and the integration of the self; it’s challenging; it gently upsets my worldview; it reminds me that inside the personas I see there are people like and unlike me in ways I can’t anticipate. It’s humanizing. Listening to Dylan, by contrast, is a visit to a man building a larger-than-life statue to something that’s never seen or felt but, believe him, very real. Extra real. Oh, so very real. It’s frivolous. Besides much funnier, Noble’s work is much more serious than Dylan’s.

Authenticity

Probably most survivors would rather leave the wreckage of authenticity sacrosanct as a memorial, but my remotely operated submarine and I want to disturb the debris field just enough to recover a single artifact: the ideal of transparency.

Rilke and Dylan are beloved of something I think of as the evidence of inspired personal vision theory, which is that we should judge an artwork by how well it certifies that the artist had an experience we can’t understand. We’re supposed to congratulate an artist not for making their subject relatable but for letting us relate to them as a romantic hero of such perception that they can relate to their subject, which we know is hard because they can’t let us do it. I don’t know how to put this more charitably. It leaves me hungry for art in which the author’s voice only appears inevitably. It might be that the most worthwhile things show up when you’re trying hardest to represent something other than yourself.

Representation

Is there anything as boring as a photo that pushes to make its subject look good or bad? It’s an orphan, disconnected from the subject, who is only raw material, from the photographer, who tries to pin it on the subject, and so from the viewer, who has been handed something that’s striking on the outside but has no inside and no context. I think we’ve all seen photos like this: portraits that show a person and beauty but not the beauty of that person; urban series that show a city and textures but not the texture of that city. Maybe I’m underestimating the number of people doing this deliberately, as a kind of unreliable narration, to make points about how what we represent is never quite what is. I think more likely it’s laziness.

I put these phrases in writing, “I think” and “it might be” and so on, to keep in mind that I’m not trying to show the whole truth. I’m uncomfortable with broad evaluations because in photography the best technique I know is to put away ambition and make things that are nothing but the truth: things which are so faithful to the complexity of the world that they have some chance of being interesting more than once. This means mainly in-focus photographs of things with visible connections to other things. It means giving up on looking with flat, flattering eyes, or with hooked, hypocrisy-seeky eyes. It means striding like a fool through the front door of obviousness but keeping going.