“One’s neighbor is one’s equal.”


, , ,

… It is encouraging in your relationship to people of distinction that in them you shall love your neighbor. In relation to those inferior it is humbling that in them you are not to love the inferior but shall love your neighbor. If you do this there is salvation, for you shall do it. Your neighbor is every man, for on the basis of distinctions he is not your neighbor, nor on the basis of likeness to you as being different from other men. He is your neighbor on the basis of equality with you before God; but this equality absolutely every man has, and he has it absolutely.

How does this equality manifest in our day-to-day interactions with each other? How is this equality so easy to forget?

This absolute equality evades us—or me, I should say—sometimes because it persists despite the constant changes that I (and so also, in Kierkegaard’s terms, the other-I, the person that I recognize as other but in whom manifests only self-love) undergo constantly.

This absolute equality is, maybe, something like that constancy of change.

And it makes such weighty demands.


“… und alles, was man weiss, nicht bloss rauschen und brausen gehört hat, lässt sich in drei Worten sagen.” –Kürnberger


, , ,

“… and anything that a man knows, not just heard roaring and blustering about, can be said in three words.”

Wittgenstein appends the above, from Setting Monuments in Opposition by Ferdinand Kürnberger, as the Tractatus‘ motto. He prompts two questions:

  1. How do we distill (derive, get at) these three words?
  2. How do we parse them, once we have them?

I’ve started working with the Python NLTK. I’m a bit late to the game, really, but it’s better late than never. I’m not sure what I will do with the toolkit, but it strikes me that it offers an elegant solution to the first of the Tractatus‘ propositions:

1. The world is everything that is the case.

1.1. The world is the totality of facts, not of things.

1.11. The world is determined by the facts, and by these being all the facts.

1.12. For the totality of facts determines both what is the case, and also all that is not the case.

1.13. The facts in logical space are the world.

1.2. The world divides into facts.

1.21. Any one can either be the case or not be the case, and everything else remain the same.

The elegance of what Wittgenstein has accomplished—and his subsequent rejection of much of that “accomplishment” in the PI—seems to be at the heart of the NLTK’s distillation. The trouble lies in parsing the ambiguity—and there is ambiguity—between what is and what is not the case.

Rules and Node.js


, , , ,

I recently played the canary for moving a Rails stack over to Node.js with a Riak backend. The project remains fun, but trying to get Node.js to populate Riak buckets felt a bit like trying to flip a pancake with a hammer—at least at first.

This was our paradox: no course of action could be determined by a rule, because every course of action can be made out to accord with the rule. The answer was: if everything can be made to accord with the rule, then it can also be made out to conflict with it. And so there would be neither accord nor conflict here. (Philosophical Investigations 1, §201)

Node.js, being the inherently asynchronous beast that it is, seemed to play by two sets of rules at once: the familiar set that reads from left to right and from top to bottom, and the less familiar set that executes code pellmell just to keep going–until the task is done or the process runs out of memory. (And ~1.4 GB is not much memory to work with when we’re dealing with large flat files.)

It can be seen that there is a misunderstanding here from the mere fact that in the course of our argument we give one interpretation after another; as if each one contented us at least for a moment, until we thought of yet another standing behind it. What this shews is that there is a way of grasping a rule which is not an interpretation, but which is exhibited in what we call “obeying the rule” and “going against it” in actual cases. (Philosophical Investigations 1, §201)

After failing to patch a plethora of memory leaks, I switched to old standbys in Python and Ruby. Riak’s Python bindings (unlike the Node.js bindings) play really nicely with the new-ish ProtoBuffers struct, so speed issues were minimized by how blazingly fast data could be stored and unpacked. You can get a sense of my code here. We hit around 5000 records processed/minute—not bad considering Riak’s lack of batch uploading and the various slowdowns from creating and saving each record.

Hence there is an inclination to say: every action according to the rule is an interpretation. But we ought to restrict the term “interpretation” to the substitution of one expression of the rule for another. (Philosophical Investigations 1, §201)

But the goal was a Node.js stack, not a Python stack, so it was back to the drawing board. The strangest part of the work came from trying to read from one bucket and write to another to simulate how a person might actually use the app under development. Reading records with Riak and Node.js is easy: riak-js makes it absurdly easy to stream keys and execute a callback on the stream, but memory leaks abounded when trying to modify and save the records that were fetched.

And hence also ‘obeying a rule’ is a practice. And to think one is obeying a rule is not to obey a rule. Hence it is not possible to obey a rule ‘privately’: otherwise thinking one was obeying a rule would be the same thing as obeying it.  (Philosophical Investigations 1, §202)

The solution? Two streams: the first is the key stream that gets written to a flat file; the second is a stream that comes from polling that file for new data periodically and not forcing Node.js to handle more keys than it had room for at any given time. I set up an extremely minimalist pub/sub system (pubsub), and things went better than expected. The Growing-File module builds in a bit of a rest when polling the ./keys file at intervals, but adding a 10 ms setTimeout to the key processing in sub.js helped give Node.js time to breathe and avoid backlog associated with db.get() and db.save(). Node.js trucked along at nearly 7000 keys processed (fetched and saved to a new bucket) per minute and showed no signs of giving up when I called it on the tests. (All of these tests were run on a dual-core Centos 6 VM.)

Language is a labyrinth of paths. You approach from one side and know your way about; you approach the same place from another side and no longer know your way about. (Philosophical Investigations 1, §203)

My point, I guess, is twofold: first, Node.js is surprisingly pleasant to work with after a bit of massaging; and second, that paradigm shifts can be okay—async isn’t as scary as it seems—as long as you know what rules to follow.

Hello, World!

I recently started reading Wittgenstein’s Lectures on Aesthetics. The third proposition reads:

An intelligent way of dividing up a book on philosophy would be into parts of speech, kinds of words. Where in fact you would have to distinguish far more parts of speech than an ordinary grammar does. You would talk for hours and hours on the verbs ‘seeing’, ‘feeling’, etc., verbs describing personal experience. We get a peculiar kind of confusion or confusions which comes up with all these words. You would have another chapter on numerals — here there would be another kind of confusion: a chapter on ‘all’, ‘any’, ‘some’, etc. — another kind of confusion: a chapter on ‘you’, ‘I’, etc. — another kind: a chapter on ‘beautiful’, ‘good’ — another kind. We get into a new group of confusions; language plays us entirely new tricks.

It struck me that Wittgenstein’s notion of a philosophical grammar had broad implications for how we organize arbitrary bits of information; in a certain sense, Wittgenstein has proposed a means of encoding that systematizes language without giving short shrift to language’s fluidity.

It’s in that spirit that I wanted to start this blog. If things go well, this will be a place to think about philosophy (especially Wittgenstein) and computer science (especially Ruby). If they don’t go well, this blog will end up like every other blog I’ve meant to start.

So hello, world. Here we go.