<?xml version="1.0"?>
<rss version="2.0.">
  <channel>
    <title>Advogato blog for jtauber</title>
    <link>http://www.advogato.org/person/jtauber/</link>
    <description>Advogato blog for jtauber</description>
    <language>en-us</language>
    <generator>mod_virgule</generator>
    <pubDate>Wed, 14 May 2008 01:50:15 GMT</pubDate>
    <item>
      <pubDate>Mon, 12 May 2008 02:09:29 GMT</pubDate>
      <title>Metrics Provide An Inner Product</title>
      <link>http://www.advogato.org/person/jtauber/diary.html?start=153</link>
      <guid>/blog/2008/05/11/metrics_provide_an_inner_product/</guid>
      <description>&lt;p&gt;Another post for the &lt;a href="http://www.advogato.org/poincare_project" &gt;Poincar&#xE9; Project&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
We've already seen that a &lt;b&gt;one-form&lt;/b&gt; is a linear function from a vector to a (for our purposes) real number. On a manifold, one-forms correspond to stack-type vectors being applied to arrow-type vectors by counting how many &amp;quot;stacks&amp;quot; the arrow passes through.
&lt;/p&gt;
&lt;p&gt;
In the previous post &lt;a href="http://www.advogato.org/blog/2008/05/04/metrics_as_mappings_between_arrows_and_stacks/" &gt;Metrics As Mappings Between Arrows and Stacks&lt;/a&gt;, we saw that a &lt;b&gt;metric&lt;/b&gt; is an &lt;i&gt;extra&lt;/i&gt; bit of structure that describes how to map between arrow-type vectors and stack-type vectors.
&lt;/p&gt;
&lt;p&gt;
So, in summary:
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;a metric tells you how to go from an arrow-type vector to a stack-type vector
&lt;/li&gt;
&lt;li&gt;a stack-type vector can be applied to another arrow-type vector to  get a real number
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;
These two facts can be combined to let you take two &lt;i&gt;arrow-type&lt;/i&gt; vectors and get a real number out of them.
&lt;/p&gt;
&lt;p&gt;
This has parallels with &lt;b&gt;currying&lt;/b&gt; in functional programming.
&lt;/p&gt;
&lt;p&gt;
Recall that if a function &amp;quot;add&amp;quot; takes two integers and returns an integer, it can be viewed as a function that takes one integer and returns a function that takes one integer and returns an integer.
&lt;/p&gt;
&lt;p&gt;
&lt;pre&gt;add :: Int -&amp;gt; Int -&amp;gt; Int
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
Now, a one-form is a function that takes a vector and returns a real. In other words:
&lt;/p&gt;
&lt;p&gt;
&lt;pre&gt;Vector -&amp;gt; Real
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
So it is easy to see that if you curry a real-valued function that takes two vectors you get:
&lt;/p&gt;
&lt;p&gt;
&lt;pre&gt;Vector -&amp;gt; Vector -&amp;gt; Real
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
In other words, a function taking two vectors to a real is equivalent to a function from a vector to a one-form.
&lt;/p&gt;
&lt;p&gt;
So if you have a metric that can convert between vectors and one-forms (or, in the context of a manifold, between arrows and stacks) then you also have a function from two vectors to a real.
&lt;/p&gt;
&lt;p&gt;
Such a function is called an &lt;b&gt;inner product&lt;/b&gt; or &lt;b&gt;dot product&lt;/b&gt;. Often the notion of an inner product is defined first, before one-forms are introduced (if at all). In fact, some texts will define a metric to be an inner product. It is best for our purposes, though, to think of the metric's fundamental purpose as being converting between arrows and stacks (and back again) and the inner product as being an extra concept we get for free.
&lt;/p&gt;
</description>
    </item>
    <item>
      <pubDate>Sun, 11 May 2008 02:14:18 GMT</pubDate>
      <title>Introducing Pinax</title>
      <link>http://www.advogato.org/person/jtauber/diary.html?start=152</link>
      <guid>/blog/2008/05/10/introducing_pinax/</guid>
      <description>&lt;p&gt;In the post &lt;a href="http://www.advogato.org/blog/2008/05/06/reusable_django_apps_and_introducing_tabula_rasa/" &gt;Reusable Django Apps and Introducing Tabula Rasa&lt;/a&gt; I mentioned my project to create an out-of-the-box Django-based website with everything but the domain-specific functionality.
&lt;/p&gt;
&lt;p&gt;
At the time I was calling it &lt;i&gt;Tabula Rasa&lt;/i&gt; but now I've settled on the Greek word &lt;i&gt;Pinax&lt;/i&gt;, proposed by Orestis Markou.
&lt;/p&gt;
&lt;p&gt;
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.
&lt;/p&gt;
&lt;p&gt;
Even if one doesn't use Pinax as the starting point of a website, I'm hoping it will prove very useful for another goal, namely a &amp;quot;host&amp;quot; project to develop and tryout reusable apps.
&lt;/p&gt;
&lt;p&gt;
The initial code is available at &lt;a class="external" href="http://code.google.com/p/django-hotclub/" &gt;http://code.google.com/p/django-hotclub/&lt;/a&gt; under /trunk/projects/pinax and there is a running instance for you to try out at:
&lt;/p&gt;
&lt;p&gt;
&lt;pre&gt;&lt;a class="external" href="http://pinax.hotcluboffrance.com" &gt;http://pinax.hotcluboffrance.com&lt;/a&gt;
&lt;/pre&gt;
&lt;/p&gt;
</description>
    </item>
    <item>
      <pubDate>Sat, 10 May 2008 08:09:39 GMT</pubDate>
      <title>Elite Oolite</title>
      <link>http://www.advogato.org/person/jtauber/diary.html?start=151</link>
      <guid>/blog/2008/05/09/elite_oolite/</guid>
      <description>&lt;p&gt;When I lived in Brunei in the mid-80s, a neighbour had a &lt;a class="external" href="http://en.wikipedia.org/wiki/BBC_Micro" &gt;BBC Micro&lt;/a&gt; and I would go over there to play the space trading game &lt;a class="external" href="http://en.wikipedia.org/wiki/Elite_(computer_game)" &gt;Elite&lt;/a&gt;. The hidden-line wireframe graphics and massive procedurally-generated universe seemed amazing to me at the time and it was definitely the kind of software I aspired to one day write myself. At the time, I taught myself trigonometry to do 3D graphics but never got to hidden line removal :-)
&lt;/p&gt;
&lt;p&gt;
I was aware of various Elite clones over the years, but the other day I stumbled across &lt;a class="external" href="http://oolite.aegidian.org/" &gt;Oolite&lt;/a&gt;, an open-source Mac OS X version with modern OpenGL graphics. Simply amazing and just as addictive as I remember the original being. It also seems to be highly pluggable, with numerous extensions available to add both to the UI and gameplay.&lt;/p&gt;</description>
    </item>
    <item>
      <pubDate>Tue, 6 May 2008 13:12:26 GMT</pubDate>
      <title>LOTRO on VMware Fusion</title>
      <link>http://www.advogato.org/person/jtauber/diary.html?start=150</link>
      <guid>/blog/2008/05/06/lotro_on_vmware_fusion/</guid>
      <description>&lt;p&gt;I've hardly played Lord of the Rings Online at all the last six months and not at all the last three.
&lt;/p&gt;
&lt;p&gt;
My only copy of Windows is a &lt;a class="external" href="http://vmware.com/products/fusion/" &gt;VMware Fusion&lt;/a&gt; instance and LOTRO doesn't work on VMware Fusion. That is...until now.
&lt;/p&gt;
&lt;p&gt;
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.
&lt;/p&gt;
&lt;p&gt;
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 &lt;a class="external" href="http://forums.lotro.com/showthread.php?t=128648" &gt;this post&lt;/a&gt; and so I tried making the config change they suggested there.
&lt;/p&gt;
&lt;p&gt;
And BINGO! I can now run Lord of the Rings Online on VMware Fusion!
&lt;/p&gt;
&lt;p&gt;
I haven't tweaked the settings yet to see if it's playable but I'm hopeful.
&lt;/p&gt;
&lt;p&gt;
VMware, you are amazing!&lt;/p&gt;</description>
    </item>
    <item>
      <pubDate>Tue, 6 May 2008 10:15:23 GMT</pubDate>
      <title>Reusable Django Apps And Introducing Tabula Rasa</title>
      <link>http://www.advogato.org/person/jtauber/diary.html?start=149</link>
      <guid>/blog/2008/05/06/reusable_django_apps_and_introducing_tabula_rasa/</guid>
      <description>&lt;p&gt;The excellent 42 Topics blog has a post entitled &lt;a class="external" href="http://42topics.com/blog/2008/05/popularizing-django-or-reusable-apps-considered-harmful/" &gt;Popularizing Django &#x2014;  Or Reusable apps considered harmful&lt;/a&gt; which makes (or attempts to make) the case for packaged apps over reusable apps.
&lt;/p&gt;
&lt;p&gt;
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 &lt;b&gt;as well&lt;/b&gt;.
&lt;/p&gt;
&lt;p&gt;
I mentioned the &lt;a class="external" href="http://groups.google.com/group/django-hotclub" &gt;django-hotclub group&lt;/a&gt; in a comment on that post as I'd really like the discussion to take place there.
&lt;/p&gt;
&lt;p&gt;
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 &lt;i&gt;tabula&lt;/i&gt; rather than &lt;i&gt;grammateion&lt;/i&gt;)
&lt;/p&gt;
&lt;p&gt;
Basically, the goal of Tabula Rasa is an out-of-the-box Django-based website with everything &lt;b&gt;but&lt;/b&gt; the domain-specific functionality.
&lt;/p&gt;
&lt;p&gt;
So far it's just my new &lt;a href="http://www.advogato.org/django-email-confirmation" &gt;django-email-confirmation&lt;/a&gt; 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 &lt;a href="http://www.advogato.org/django-friends" &gt;django-friends&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
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 &amp;quot;host&amp;quot; project to develop and tryout reusable apps.
&lt;/p&gt;
&lt;p&gt;
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.
&lt;/p&gt;
&lt;p&gt;
So Tabula Rasa will hopefully serve that dual purpose.
&lt;/p&gt;
&lt;p&gt;
The initial code is available at &lt;a class="external" href="http://code.google.com/p/django-hotclub/" &gt;http://code.google.com/p/django-hotclub/&lt;/a&gt; under /trunk/projects/tabularasa
&lt;/p&gt;
&lt;p&gt;
I hope to have a running instance online soon.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;UPDATE&lt;/b&gt;: I've decided to switch to the Greek word &lt;i&gt;pinax&lt;/i&gt; suggested below by Orestis Markou.&lt;/p&gt;</description>
    </item>
    <item>
      <pubDate>Mon, 5 May 2008 04:10:06 GMT</pubDate>
      <title>Metrics As Mappings Between Arrows and Stacks</title>
      <link>http://www.advogato.org/person/jtauber/diary.html?start=148</link>
      <guid>/blog/2008/05/04/metrics_as_mappings_between_arrows_and_stacks/</guid>
      <description>&lt;p&gt;Another post for the &lt;a href="http://www.advogato.org/poincare_project" &gt;Poincar&#xE9; Project&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Back in &lt;a href="http://www.advogato.org/blog/2006/11/19/coordinate_systems_and_metrics/" &gt;Coordinate Systems and Metrics&lt;/a&gt; we saw that a &lt;b&gt;metric&lt;/b&gt; for a coordinate system tells us the &amp;quot;distance travelled as proportion of coordinate change&amp;quot;. Then in the following post, &lt;a href="http://www.advogato.org/blog/2007/01/15/metrics_in_two_or_more_dimensions/" &gt;Metrics in Two or More Dimensions&lt;/a&gt;:
&lt;/p&gt;
&lt;p&gt;
&lt;blockquote&gt;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.
&lt;/blockquote&gt;
&lt;/p&gt;
&lt;p&gt;
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.
&lt;/p&gt;
&lt;p&gt;
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.
&lt;/p&gt;
&lt;p&gt;
In fact, one can view a &lt;b&gt;metric&lt;/b&gt; 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 &lt;a href="http://www.advogato.org/blog/2006/11/19/coordinate_systems_and_metrics/" &gt;Coordinate Systems and Metrics&lt;/a&gt;). 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).
&lt;/p&gt;
&lt;p&gt;
A metric ties those length and angle notions to the coordinate system and, in so doing, actually defines the coordinate system. 
&lt;/p&gt;
&lt;p&gt;
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&#xE9; Conjecture.
&lt;/p&gt;
&lt;p&gt;
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.&lt;/p&gt;</description>
    </item>
    <item>
      <pubDate>Sat, 3 May 2008 04:08:12 GMT</pubDate>
      <title>Factoring Out Common Args To Zipped Generators</title>
      <link>http://www.advogato.org/person/jtauber/diary.html?start=147</link>
      <guid>/blog/2008/05/02/factoring_out_common_args_to_zipped_generators/</guid>
      <description>&lt;p&gt;I'm playing around with some &lt;a class="external" href="http://en.wikipedia.org/wiki/Additive_synthesis" &gt;additive synthesis&lt;/a&gt; in Python.
&lt;/p&gt;
&lt;p&gt;
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.
&lt;/p&gt;
&lt;p&gt;
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.
&lt;/p&gt;
&lt;p&gt;
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.
&lt;/p&gt;
&lt;p&gt;
Here is a simplified progression of what I came up with.
&lt;/p&gt;
&lt;h3&gt;Phase 1&lt;/h3&gt;
&lt;p&gt;
Rather than use oscillators, let's just imagine with have a generator that works a lot like xrange:
&lt;/p&gt;
&lt;p&gt;
&lt;pre&gt;def gen1(start, stop, step):
    n = start
    while n &amp;lt;= stop:
        yield n
        n += step
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
then we can combine multiple generators and, say, sum the corresponding elements like this:
&lt;/p&gt;
&lt;p&gt;
&lt;pre&gt;for x in zip(gen1(10, 20, 2), gen1(10, 25, 3)): print sum(x),
&lt;/pre&gt;
&lt;/p&gt;
&lt;h3&gt;Phase 2&lt;/h3&gt;
&lt;p&gt;
Let's abstract this into a function that takes generators as arguments (and uses itertools.izip)
&lt;/p&gt;
&lt;p&gt;
&lt;pre&gt;def mixer1(*generators):
    return (sum(x) for x in izip(*generators))
&lt;/p&gt;
&lt;p&gt;
for x in mixer1(gen1(10, 20, 2), gen1(10, 25, 3)): print x,
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
mixer1 is similar to my mixer (although without weighting)
&lt;/p&gt;
&lt;h3&gt;Phase 3&lt;/h3&gt;
&lt;p&gt;
But now say we wanted to factor out the common start parameter. First we need a partial version of function gen1:
&lt;/p&gt;
&lt;p&gt;
&lt;pre&gt;gen2 = lambda **kwargs: partial(gen1, **kwargs)
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
This allows one to say
&lt;/p&gt;
&lt;p&gt;
&lt;pre&gt;partial_gen = gen2(stop=20, step=2)
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
and then later call
&lt;/p&gt;
&lt;p&gt;
&lt;pre&gt;partial_gen(start=10)
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
to get the generator.
&lt;/p&gt;
&lt;p&gt;
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:
&lt;/p&gt;
&lt;p&gt;
&lt;pre&gt;def mixer2(*generators, **kwargs):
    return mixer1(*[gen(**kwargs) for gen in generators])
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
and now we can say:
&lt;/p&gt;
&lt;p&gt;
&lt;pre&gt;for x in mixer2(gen2(stop=20, step=2), gen2(stop=25, step=3), start=10): print x,
&lt;/pre&gt;
&lt;/p&gt;
&lt;h3&gt;Phase 4&lt;/h3&gt;
&lt;p&gt;
Here's the final version:
&lt;/p&gt;
&lt;p&gt;
&lt;pre&gt;gen2 = lambda **kwargs: partial(gen1, **kwargs)
&lt;/p&gt;
&lt;p&gt;
def mixer3(*generators, **kwargs):
    return (sum(x) for x in izip(*[gen(**kwargs) for gen in generators]))
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
The real thing is a little more involved because of the weighted summing, etc but the hard parts are shown.
&lt;/p&gt;
</description>
    </item>
    <item>
      <pubDate>Thu, 1 May 2008 14:09:32 GMT</pubDate>
      <title>Moir&#xE9; Waves</title>
      <link>http://www.advogato.org/person/jtauber/diary.html?start=146</link>
      <guid>/blog/2008/05/01/moire_waves/</guid>
      <description>&lt;p&gt;I was playing around with some additive synthesis in Python, generating various basic waveforms and checking them visually, in Soundtrack Pro.
&lt;/p&gt;
&lt;p&gt;
The moir&#xE9; pattern of the waveforms in one test file was interesting:
&lt;/p&gt;
&lt;p&gt;
&lt;img src="/2008/05/waves.png" title="four shapes"/&gt;
&lt;/p&gt;
&lt;p&gt;
That's actually 220 cycles of a sine wave, followed by the same for a sawtooth, square and triangle waveform.
&lt;/p&gt;
</description>
    </item>
    <item>
      <pubDate>Thu, 1 May 2008 13:09:43 GMT</pubDate>
      <title>Moir&#xE9; Waves</title>
      <link>http://www.advogato.org/person/jtauber/diary.html?start=145</link>
      <guid>/blog/2008/05/01/moire_waves/</guid>
      <description>&lt;p&gt;I was playing around with some additive synthesis in Python, generating various basic waveforms and checking them visually, in Soundtrack Pro.
&lt;/p&gt;
&lt;p&gt;
The moir&#xE9; pattern of the waveforms in one test file was interesting:
&lt;/p&gt;
&lt;p&gt;
&lt;img src="/2008/05/waves.png" title="four shapes"/&gt;
&lt;/p&gt;
&lt;p&gt;
That's actually 220 cycles of a sine wave, followed by the same for a sawtooth, square and triangle waveform.
&lt;/p&gt;
</description>
    </item>
    <item>
      <pubDate>Thu, 1 May 2008 11:21:09 GMT</pubDate>
      <title>Grammar Rules</title>
      <link>http://www.advogato.org/person/jtauber/diary.html?start=144</link>
      <guid>/blog/2008/04/30/grammar_rules/</guid>
      <description>&lt;p&gt;One downside to having a background in linguistics is that one is more sensitive to various so-called grammar rules that people regurgitate from their school years.
&lt;/p&gt;
&lt;p&gt;
The majority of linguists probably view these rules the way a doctor would view the &lt;a class="external" href="http://en.wikipedia.org/wiki/Humorism" &gt;four humours&lt;/a&gt;. But a more fundamental issue is not that some of the theories have been superseded but that their perpetuation reveals a very unscientific approach to language. It is as if these people are viewing rules of grammar like they would road rules&amp;#8212;human inventions that one may disagree with, but which are still, in some sense, what is &amp;quot;correct&amp;quot;&amp;#8212;rather than, say, laws of physics that attempt to model observations.
&lt;/p&gt;
&lt;p&gt;
This means that when confronted with data that doesn't match the rules, such people will say the data is wrong (&amp;quot;that isn't correct English&amp;quot;) rather than ever consider that maybe it's their rules that need refinement.
&lt;/p&gt;
&lt;p&gt;
Now it is certainly the case that people make mistakes when they speak (and that can be a revealing study in itself) and there is such a thing as good English usage (see the last paragraph) but most linguists focus on modeling the tacit intuitions native speakers have about their language which are very often at odds with the &amp;quot;rules of grammar&amp;quot; learnt at school.
&lt;/p&gt;
&lt;p&gt;
Let me give an example. A common misconception is that English has cases that work in a similar way to Latin. I suspect the origins of this stem from attempts to model English after Latin as if Latin was somehow a better language.
&lt;/p&gt;
&lt;p&gt;
It is easy to see on the surface there might be evidence for a nominative/accusative case distinction in English pronouns. Native speakers will say &amp;quot;I gave the book to him. He gave the money to me.&amp;quot; with the intuition that switching &amp;quot;I&amp;quot; and &amp;quot;me&amp;quot; or &amp;quot;he&amp;quot; and &amp;quot;him&amp;quot; would be incorrect. This is a valid observation that a linguist would want to capture in some kind of descriptive rule.
&lt;/p&gt;
&lt;p&gt;
However, when asked &amp;quot;who is it?&amp;quot; native speakers will almost always answer &amp;quot;it's me&amp;quot; rather than &amp;quot;?it's I&amp;quot;.
&lt;/p&gt;
&lt;p&gt;
I've had people try to tell me that the latter is &amp;quot;more correct&amp;quot; although they don't say it themselves. If they don't say it, as competent speakers of English, what is their claim to it being correct? Because their high school English teacher told them? Because Latin would use the nominative here?
&lt;/p&gt;
&lt;p&gt;
If you ask a group of people &amp;quot;who wants to sit in the front?&amp;quot; they are far more likely to answer &amp;quot;me&amp;quot; than &amp;quot;?I&amp;quot;. And yet they would say &amp;quot;I do&amp;quot; rather than &amp;quot;*me do&amp;quot;. If you accuse someone you are probably more likely to say &amp;quot;it was him&amp;quot; not &amp;quot;?it was he&amp;quot;. So what's going on doesn't just involve using the nominative case for the subject and accusative case for the object.
&lt;/p&gt;
&lt;p&gt;
The massive 1,800+ page Cambridge Grammar of the English Language gives more great examples &amp;quot;nobody can do it but her/*she&amp;quot;, &amp;quot;the only one who objected was me/?I&amp;quot; and (showing photos) &amp;quot;this one here is me/*I at the age of 12&amp;quot;.
&lt;/p&gt;
&lt;p&gt;
Things become even more complex in the case of conjunctions. The Cambridge Grammar gives the example of &amp;quot;they invited my partner and I to lunch&amp;quot;. They point out that examples like this &amp;quot;are regularly used by a significant proportion of speakers of Standard English, and not generally thought by ordinary speakers to be non-standard&amp;quot;. They go on to argue against the prescriptivist use of analogy with &amp;quot;they invited me/*I to lunch&amp;quot; to justify why the use of &amp;quot;I&amp;quot; is incorrect.
&lt;/p&gt;
&lt;p&gt;
The worst kinds of rules are ones that sound almost like superstitions: don't use passives, don't use adverbs, don't split infinitives, don't end sentences with a preposition, don't start a sentence with &amp;quot;however&amp;quot; etc. They may help one adopt a particular style of writing, but they certainly aren't rules of grammar in any scientific sense and are, in most cases, completely arbitrary.
&lt;/p&gt;
&lt;p&gt;
Some of the usage guides these rules are found in are better than others. Strunk and White is full of these arbitrary superstitions. In fact, Professor Geoffrey Pullum, the co-editor of the previously mentioned Cambridge Grammar of the English Language &lt;a class="external" href="http://itre.cis.upenn.edu/~myl/languagelog/archives/001803.html" &gt;describes&lt;/a&gt; Strunk and White as a &amp;quot;horrid little notebook of nonsense&amp;quot; and instead recommends &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0877796335" &gt;Merriam-Webster's Concise Dictionary of English Usage&lt;/a&gt; which I own and agree is much more useful for evidence-based guidelines on subtle differences in usage between words.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
