Name: James Tauber
Member since: 2001-02-13 06:58:32
Last Login: 2007-09-20 05:21:28
Homepage: http://jtauber.com/
Notes:
I'm Chief Scientist at mValent and an original participant in the XML activity at the W3C. I wrote the first open source implementation of XSL-FOs, FOP (which I donated to Apache); started the first open source implementation of UDDI, jUDDI; a Python implementation of the XML schema language TREX, PyTREX; and am co-developer of Redfoot, an RDF application framework.
Recently, I started PyGo, a Python application for studying and playing Go.
Email: jtauber@jtauber.com
LOTRO on VMware Fusion
I've hardly played Lord of the Rings Online at all the last six months and not at all the last three.
My only copy of Windows is a VMware Fusion instance and LOTRO doesn't work on VMware Fusion. That is...until now.
I was excited to hear that the new VMware Fusion 2.0 beta 1 supported pixel shaders in DirectX 9 and I wondered if that meant LOTRO would work. I downloaded the beta, which JUST WORKED with my existing VM (which wasn't even shut down). I spent an hour or so updating LOTRO but my first attempt to start the game failed.
The error message was different, though. Instead of being about the graphics adapter it was a complaint about a Game Error 127. A Google search revealed this post and so I tried making the config change they suggested there.
And BINGO! I can now run Lord of the Rings Online on VMware Fusion!
I haven't tweaked the settings yet to see if it's playable but I'm hopeful.
VMware, you are amazing!
Syndicated 2008-05-06 08:19:36 (Updated 2008-05-06 08:21:22) from James Tauber
Reusable Django Apps And Introducing Tabula Rasa
The excellent 42 Topics blog has a post entitled Popularizing Django — Or Reusable apps considered harmful which makes (or attempts to make) the case for packaged apps over reusable apps.
He raises some good points, although of course the packaged apps he's talking about still use reusable apps so he's not actually talking about there being a problem with reusable apps per se, just that there should be packaged apps as well.
I mentioned the django-hotclub group in a comment on that post as I'd really like the discussion to take place there.
I also, in that comment, mention something I'm working on tentatively called Tabula Rasa. (I'm toying with a Greek name rather than Latin but something tells me people are more comfortable with tabula rather than grammateion)
Basically, the goal of Tabula Rasa is an out-of-the-box Django-based website with everything but the domain-specific functionality.
So far it's just my new django-email-confirmation app tied together with password change and reset, login/logout, with the beginnings of a tab-style UI. There's a ton more I want to refactor out of my existing websites to put into it as well as adding support for OpenID and the stuff I'm starting to do for django-friends.
Even if one doesn't use Tabula Rasa as the starting point of a website, I'm hoping it will prove very useful for another goal, namely a "host" project to develop and tryout reusable apps.
One of the challenges I know I've always had with writing or trying out reusable apps is the need for a project to provide the scaffolding.
So Tabula Rasa will hopefully serve that dual purpose.
The initial code is available at http://code.google.com/p/django-hotclub/ under /trunk/projects/tabularasa
I hope to have a running instance online soon.
Syndicated 2008-05-06 05:49:35 (Updated 2008-05-06 05:52:43) from James Tauber
Metrics As Mappings Between Arrows and Stacks
Another post for the Poincaré Project.
Back in Coordinate Systems and Metrics we saw that a metric for a coordinate system tells us the "distance travelled as proportion of coordinate change". Then in the following post, Metrics in Two or More Dimensions:
Imagine that you're at a particular point on a two-dimensional manifold. If you head off in a particular direction from that point at a particular rate, your coordinates will change. The metric tells you, from a given point, the rate of change of each of your coordinates given travel in a particular direction at a particular rate.
Those two posts express two sides of the same coin: in one I said the metric tells us the rate of change of position given the rate of change of coordinates and in the other I said the metric tells us the rate of change of coordinates given a rate of change of position.
A rate of change of position is, as we've seen, an arrow-vector. A rate of change of a particular coordinate is, as we've also seen, a stack-vector in the dual space.
In fact, one can view a metric as being a mapping between arrow-vectors and stack-vectors. You can use it, along with some calculus if the metric is different at different points, to calculate distances (as described in Coordinate Systems and Metrics). It can also be used to calculate the length of a vector or the angle between two vectors (concepts which don't exist without a metric).
A metric ties those length and angle notions to the coordinate system and, in so doing, actually defines the coordinate system.
Finally, a metric has within it, all the information necessary to describe the curvature of a manifold. It is ultimately this function that makes it relevant to both the General Theory of Relativity and the Poincaré Conjecture.
We will explore each of these in due course. The main takeaway at this point is that a metric is a mapping between arrow-vectors and stack-vectors.
Syndicated 2008-05-04 23:17:29 (Updated 2008-05-04 23:49:20) from James Tauber
Factoring Out Common Args To Zipped Generators
I'm playing around with some additive synthesis in Python.
I've implemented an oscillator as a generator that takes a number of parameters. It is then possible to mix multiple oscillators using zip (or better, itertools.izip) over them and doing a (weighted) sum.
However, I wanted to be able to factor out common arguments to the oscillators so I didn't have to specify the frequency of each one individually.
I knew functools.partial would be part of the solution but it took me a while to work out how to combine its use with generators and itertools.izip.
Here is a simplified progression of what I came up with. <h3>Phase 1</h3>
Rather than use oscillators, let's just imagine with have a generator that works a lot like xrange:
def gen1(start, stop, step):
n = start
while n <= stop:
yield n
n += step
then we can combine multiple generators and, say, sum the corresponding elements like this:
for x in zip(gen1(10, 20, 2), gen1(10, 25, 3)): print sum(x),<h3>Phase 2</h3>
Let's abstract this into a function that takes generators as arguments (and uses itertools.izip)
def mixer1(*generators):
return (sum(x) for x in izip(*generators))
for x in mixer1(gen1(10, 20, 2), gen1(10, 25, 3)): print x,
mixer1 is similar to my mixer (although without weighting) <h3>Phase 3</h3>
But now say we wanted to factor out the common start parameter. First we need a partial version of function gen1:
gen2 = lambda **kwargs: partial(gen1, **kwargs)
This allows one to say
partial_gen = gen2(stop=20, step=2)
and then later call
partial_gen(start=10)
to get the generator.
But what we now need is a new version of the mixer that takes the extra keyword args and passes them in to each partial function to turn them back into generators:
def mixer2(*generators, **kwargs):
return mixer1(*[gen(**kwargs) for gen in generators])
and now we can say:
for x in mixer2(gen2(stop=20, step=2), gen2(stop=25, step=3), start=10): print x,<h3>Phase 4</h3>
Here's the final version:
gen2 = lambda **kwargs: partial(gen1, **kwargs)def mixer3(*generators, **kwargs): return (sum(x) for x in izip(*[gen(**kwargs) for gen in generators]))
The real thing is a little more involved because of the weighted summing, etc but the hard parts are shown.
Syndicated 2008-05-02 23:28:24 (Updated 2008-05-03 00:03:41) from James Tauber
Moiré Waves
I was playing around with some additive synthesis in Python, generating various basic waveforms and checking them visually, in Soundtrack Pro.
The moiré pattern of the waveforms in one test file was interesting:
That's actually 220 cycles of a sine wave, followed by the same for a sawtooth, square and triangle waveform.
jtauber certified others as follows:
Others have certified jtauber as follows:
[ Certification disabled because you're not logged in. ]
FOAF updates: Trust rankings are now exported, making the data available to other users and websites. An external FOAF URI has been added, allowing users to link to an additional FOAF file.
Keep up with the latest Advogato features by reading the Advogato status blog.
If you're a C programmer with some spare time, take a look at the mod_virgule project page and help us with one of the tasks on the ToDo list!