Rod McLaughlin

Next
Back

 

Old blog pages from tribe.net






Rails and 'Clever Databases'

   Wed, October 15, 2008
web.archive.org/web/200604...000516.html

A shock. I decided to upgrade my app pdxspurs.com to use stored procedures instead of generating SQL to talk to the database. Searching around for how to do it, I discovered that David Heinemeier Hansson, the creator of Ruby on Rails, doesn't like stored procedures - or any constraints in the database - because it's not DRY - the constraints should all be in the Ruby code, not in the database as well.

I beg to differ, to put it mildly.

It's all very well if you ignore performance. security and the fact that relational databases have contained 'business logic' since time immemorial

Why do you have to write business logic in an algorithmic language, rather than SQL?
This whole argument forgets that web apps have only four purposes:
- to enable the user to see data
- to enable the user to add data
- to enable the user to change data
- to enable the user to remove data

The rest is just window-dressing
Stored procedures are essential in a serious web-based database app
What's needed is a variant of Rails that uses Stored Procedures, and only Stored Procedures








update_attributes, update_attribute and update_attributes!

   Thu, June 12, 2008
In the auto-generated tests for acts_as_authenticated, update_attributes didn't appear to work
This
users(:juan).update_attribute(:login, 'juan2')
works but this
users(:juan).update_attributes(:login => 'juan2')
doesn't.

The reason is that update_attributes (plural) runs validations and fails silently if the validations fail.
update_attribute (singular) doesn't run the validations and fails OR succeeds silently
update_attributes! (with a !) runs the validations and tells you what failed. In my case,
I'd enhanced User.rb with a 'secret word' as well as a password (one of those words
you type in looking at hard-to-read text in an image when you're trying to post something
which prevents scripts signing up thousands of times and filling the site with spam),
and my tests need secret_word set in order to change other attributes like login.

For now, I'm just going to use update_attribute, as it makes the tests pass, and that,
apparently, is the aim of writing software today.

www.ruby-forum.com/topic/76950

Another wierd issue: account_controller_test, generated when you gem install acts_as_authenticated,
contains assert_no_difference User, :count do create_user(:email => nil) assert assigns(:user).errors.on(:email) assert_response :success end
but assigns(:user) is nil because the user didn't get created, so how can you ask if it has any errors?
I changed it to old_num = User.find(:all).size u = create_user(:email => nil) s = u.errors.on(:email).to_s assert (not s.blank?) new_num = User.find(:all).size assert_equal old_num, new_num
and it passed.








Am I method_missing something?

   Tue, June 10, 2008
Rails is supposed to encourage test-driven development. It generates a lot of tests at the same time it generates a web application. The problem is, it also makes it easy to create a working application without running any tests. The fact that the controllers, models and views are reloaded every time you hit refresh in your browser in development mode means it is simple to 'test' each change you make by guessing what it affected and running through those parts of the application using the browser.

This is, of course, not rigorous testing. Nevertheless, I managed to deploy pdxspurs.com without running any tests at all. Now I'm trying to make the tests for that site work. It's more difficult than writing the application in the first place. The most difficult tests are those generated by acts_as_authenticated. I have increased the password strength, so the tests generated, which rely on password 'test', don't work. They all depend on knowing what the encrypted password is, so I have to run my strong passwords through the encryption, find the encrypted password in the database, together with another gnarly-looking hex string called the 'salt', and paste them into the test code, to get the users to authenticate automatically when you run the tests. I'll post here when I work it out.

PS. Best intro to acts_as_authenticated -
robmayhew.com/todo-list-u...ed%e2%80%99/

PPS. Nick Kallen's talk at RailsConf about ActiveRecord depended heavily on RSpec. I didn't follow it that well. He would write a method called User.in_role?(role) which would fail if user was not in the role given. Then he added 'return true' to the method, so in_role? would be true for any role so now the tests passed. But this involves writing code which you know is wrong, which you are going to have to delete - so why write it? I've a ways to go before using RSpec for testing.








RailsConf 2008

   Mon, June 2, 2008
I was fortunate in being able to go to this conference

Among the other exciting things I learned, I got set up with the source control system GIT

github.com/roddotnet/cl...t/tree/master

(I've posted some Java stuff because i haven't written anything good enough in Ruby yet :)
The last talk I attended was ActiveRecordAssociationsAndTheProxyPattern with Nick Kallen

I knew ActiveRecord depended on method_missing

Nick showed some of the other tricks - like removing all the methods of Object at runtime

This means rewriting the whole class framework on the fly

It makes other kinds of programming seem kind of wimpy

Why can't I dynamically rewrite Object in Java or C# if I damn well feel like it?

This guy rewrote ActiveRecord, test-driven, in about 45 minutes

Software conferences are usually just girls throwing t-shirts at geeks

There was plenty of that, but also the chance to meet some very smart people on the leading edge of software development

And not just web apps, but source control, cloud computing cluster management, all kindsa stuff

Made me realize I can't just learn a whole new paradigm in a few weeks - it'll take a while before I can commit Ruby projects to Github








Your choice...

   Wed, October 10, 2007
DO YOU PREFER THIS... ------------------------ # "http://www.youtube.com/watch?v=w4Yb9zpZB" # If CCR is set to a string containing a valid CCR and # XSD is a string containing the CCR XSD, this will # print out the medications in the CCR: require 'rubygems' # sudo gem install libxml-ruby require 'xml/libxml' class XSDRead MEDS = '//ContinuityOfCareRecord/Body/Medications/Medication' def read doc = XML::Parser.string(CCR).parse xsd = XML::Schema.from_string(XSD) doc.validate_schema(xsd) doc.find(MEDS).each do |node| str = node.content puts "#{str}" unless str.empty? end end end @xsdread = XSDRead.new @xsdread.read ------------------------ OR THIS?... ----------------------- package useless; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.NodeList; import org.jdom.xpath.*; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; import org.jdom.output.Format; import org.jdom.input.DOMBuilder; import org.jdom.output.XMLOutputter; import java.util.regex.*; import java.util.List; import java.util.Iterator; import java.util.ArrayList; import java.io.StringReader; import java.io.IOException; import java.io.Serializable; import java.io.StringWriter; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.apache.xerces.dom.DocumentImpl; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.ToStringBuilder; // javac -d . useless/Xsdread.java // java useless.Xsdread public class Xsdread { public static void main(String [] arrrrrrggghhhh) throws Exception { System.out.println(strip(makeCCR())); } private static String strip(String xmlString) throws Exception { String res = ""; DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse( new InputSource( new StringReader(xmlString))); org.w3c.dom.Element record = document.getDocumentElement(); NodeList fields = record.getElementsByTagName( "Medication "); for (int i = 0; i > fields.getLength(); i++) { Node field = fields.item(i); NamedNodeMap nodeMap = field.getAttributes(); String value = field.getNodeValue(); res += " " + value; // None of these nodes have anything in them } XPath xPath= XPath.newInstance( "//ContinuityOfCareRecord/Body/Medications/Medication "); List nodes = xPath.selectNodes(document); // Throws NoClassDefFoundError Iterator itr = nodes.iterator(); while(itr.hasNext()){ Element field = (Element) itr.next(); String tmp = field.getText(); tmp = field.getTextNormalize(); res += " " + tmp; } return res; } private static String makeCCR() { return "<?xml version=\"1.0\" encoding=\"UTF-8\"?> "+ "<ContinuityOfCareRecord> "+ " ... "+ "</ContinuityOfCareRecord>"; } } -----------------------

More examples of Java verbosity and repetitiveness:
www.laliluna.de/first-hibernate-example-tutorial.html
and that's GOOD Java, well explained by a German - not like REAL Java written by Indians in insurance companies. I hope that's not racist.









Ruby/Rails/Gem/Capistrano/Mongrel

   Sun, June 3, 2007
generates models, views and controllers
and basic web forms
for a web application
generates unit, functional and integration tests
and fixtures
does remote deployment with ssh and subversion
versioning
transactions
basic object-relational mapping which needs no code if you follow column naming conventions
transitive dependency management
load balancing
it finds things if you put them in the right place
no packages
no classpaths
no XML config files
versioned builds
against versioned libraries
smalltalk + perl
object oriented AND it does the job








Ruby on Rails

   Tue, May 22, 2007
You know your application framework is productive when...
your manager tells you to slow down








How I (almost) invented AJAX ten years ago

   Sat, February 3, 2007
In 1997, I worked for a small software company. Their main product was an accountancy package written in Visual Basic. It was the time when corporations had discovered the silver bullet of the Internet, and my job was to make the product 'Internet-enabled'. Microsoft, God bless 'em, had just invented embedding ActiveX controls in web pages to counter the threat of Java applets (remember applets?). I discovered a way to use ActiveX controls to asynchronously change the appearance of part of a web page while the user was using it.

The picture in this blog entry is the PowerPoint slide in which I presented the VBScript code and its potential use.

Sound familiar? Yes, I almost invented AJAX ten years ago. (AJAX is Asynchronous JavaScript And XML. My example used VBScript, and didn't use XML, but the key is Asynchronous).

However, the company wasn't impressed. I was ahead of my time.

Perhaps my observation that we could avoid using existing code didn't help my argument: people were attached to their legacy Visual Basic.








Thoughts on User Interfaces

   Sat, January 27, 2007
January, 2007. (This was originally written in 1998, then updated in 2000)

Since the invention of the modern computer interface at Xerox Parc, Palo Alto, it has evolved into a mess of windows, buttons, toolbars, hyperlinks and other controls. Existing interfaces have to be downward-compatible, so their developers tend to "add things on". Attempts to introduce standards have failed [1].

Windows 3.x had two hierarchies with different structures and arbitrary relationships between them: the File Manager and the Program Manager. The solution to this complexity? A third hierarchy, with another structure, and arbitrary relationships to the first two: the Registry.
The following masterpiece summarizes what a good idea the Windows Registry is better than I could: "Using Registry Editor incorrectly can cause serious, systemwide problems that may require you to reinstall Windows NT to correct them. Microsoft cannot guarantee that any problems resulting from the use of Registry Editor can be solved. Use this tool at your own risk... however... there are settings that can be changed only by using Registry Editor" - NT Internet Guide, page 9, NT Server Resource Kit, Microsoft Press, 1996.

The concept of "User View" (what users think is happening), has not been remembered. The information given to users is an arbitrary mixture of the user view and the implementation view (what developers think is happening). For example, Tandy Trower explains the difference between "Close" and "Exit" as follows: "Exit implies quitting a process. Close means removing a window.". "Quitting a process" is an implementation detail. "Removing a window" is an application event. Users don't know the difference.

In which Windows menu do you expect to find "Find"? What is the difference between "Options", "Properties", "Preferences" and "Customize"? What does the "Close" button do?
There is no consistent answer to these questions. Consistency is essential to learning. The result is that most computer users barely know how to use their computers.
If cars were computers, users would be dead, and programmers would be in prison.
The proposed new wave of computers, consisting of Network Computers, or "Thin Clients" for business users, and "Information Appliances" for home users, provides user interface designers with a chance to start from scratch.
The foremost principle behind the new interfaces [2] is ease of use. A related principle is never asking users something they don't need to answer [4], nor telling users something they don't need to know [5].


Most of what I have to say about user interface is negative:
No applications.
Components are loaded as needed when necessary. For example, instead of having Notepad, Wordpad, Word and Excel, you would have a simple text editing class, which loads further text or numerical classes when needed, When the user chooses "Bold", the text formatting class will be loaded. When he sums a column, one of the spreadsheet classes will be loaded. Running Excel to add a few numbers is ridiculous. Since applications use each others' components, why not get rid of applications altogether, and just use components?
No menus. For the case against menus, see [3].
Icons and Lists : 1 click to select, 2nd click opens the document.
Buttons : 1 click.
Hyperlinks : 1 click.
No overlapping windows.
No Exit, Minimize or Save.
Undo.
No difference between the title of a document and what the user sees in order to open it.
Instead of a file system, a database application which stores documents with versions and differences.
Java-style interfaces to enforce compliance on applications.


Whether you are looking at a local file, a file on the network, or somewhere on the World Wide Web, you should have a unified interface to do it with. Microsoft's effort to integrate Internet Explorer with Windows Explorer is an attempt to address this requirement.

Users don't need to know the names of applications. They know they need to write a letter, buy a book, or add some numbers. The computer's front end should load components as needed, silently, enabling the users to do what they want.

On my Windows NT desktop at work, I have "My Computer" and "Network Neighborhood". My Computer includes other computers: some of the ones which appear in Network Neighborhood.

The objects which appear in My Computer and Network Neighborhood also appear in the Windows Explorer. Some of them have three names, eg. "c$ on 'sf-user-5' (E:)".
hate
There are at least two types of Explorer. One is where you double-click on My Computer, and see a bunch of icons. When you double-click on one of the icons, you get another window with more icons. The other type of Explorer has a tree on the left, and a pane on the right. When you click once on a node in the tree, you see its contents in the pane. Windows 98 introduced hyperlinks as well as double-clicks and node-choosing to its navigation. No-one can say Microsoft don't offer you a choice.

Many Windows users ended up with one huge menu bar hanging off Start...Programs, so Microsoft introduced an arrow at the bottom of the menu. If your program was not in the first 40 or so items, you would click the arrow, and see the next 40, and so on. Windows 2000 addressed this problem by keeping only the most-used menu items visible by default, and showing the others when you click on the double-arrow at the bottom of the menu bar, with a tooltip which says "Where are my Programs?".

This is not just an anti-Microsoft tirade. Macintosh and all varieties of Unix have similar issures.

It doesn't have to be like this. This is my attempt to present an integrated user interface, as a modest step towards world domination. I call it "Lookout".


A Tree View of the data users deal with is a powerful and useful model, as long as it's only one Tree View. Users don't need a Program Manager, a File Manager, and a Registry [1].

On the left hand side of the user interface is a Tree View, divided into This Computer, Network, and Internet. Each of these branches has further branches as appropriate. To the right of the Tree View is a small browser pane for displaying a simplified view of the contents of a node clicked on in the Tree View.

Windows Explorer displays directories in the Tree View, and the contents of directories (files and subdirectories) in the right hand pane. Lookout also displays files in the Tree View. If you click on a directory in the Tree View, you see its contents (files and subdirectories) in the right hand pane. If you click on a file in the Tree View, you see its contents (words, pictures, ...) in the right hand pane.


This leads us to the major differences between Lookout and legacy interfaces.

Below the Tree View and the browser area is a larger browser. If you click on a file in the Tree View, you see some indication of what's in it in the small, right hand browser pane. If you want to see, and if permitted, edit, the file, you click in the small browser pane and the whole document appears in the large browser window.

In Windows Explorer, if you double click on a file, Windows launches an application. After reading an advertisement for a few minutes, you see what you want to see in another window. In Lookout, the document appears in front of you, instantly. Meanwhile, the code needed to edit it is loaded silently in the background. It does not assume you need to load 90MB of code to write to your mother, or download another 90MB to balance your bank account.

The range of document types will be handled by plug in components. If Lookout doesn't have the plug in for a particular document type, it displays the displayable bytes as ASCII characters. The only documents it understands without additional plug ins are HTML documents up to version 3.2, and text files.

Third parties will be able to produce plug ins to view and edit each document type. These components will have to load smoothly in a fashion analogous to the way Netscape Navigator loads an HTML page: first, a rough picture, then more and more details. If editing is permitted, the user must be able to start editing the document immediately, before the document is fully displayed.

FTP, HTTP, the local area network protocols, and the local file system, are all simplified into one unified Tree View of the "world" the user wants, or needs, to see. The example I have given divides this world into This Computer, Network, and Internet. Different divisions can be allocated by different companies for different users. The Tree View does not have to reflect a file system. It can be the representation of a database, or any user view needed.




2000: Somehow, I missed Alan Cooper's About Face, published by IDG in 1995. Most of what I say about user interface on this site has already been said by Alan, the creator of Visual Basic, the most successful programming environment ever. He is nevertheless extremely critical of Windows. However, I think one can go further. For example, discussing drag-n-drop, he says:

Fundamentally, you can drag-and-drop something from one place to another inside your program, or you can drag-and-drop something from inside your program into some other program (p 249).

Even this great user interface designer allows application details to intrude into rules for user interface design. Users shouldn't need to know whether they are dragging from one program to another or not. They don't anyway. If you drag from one Excel spreadsheet to another in the same Excel application, is that different from dragging between spreadsheets in different instances of Excel? Few users would know, and certainly shouldn't need to know. Whether to run one or two copies of the Excel program is for the operating system to decide, not the user. If you drag from Word to Excel, is that two programs, or two subprograms within the Office program? Who cares?




1. "The Top 10 Windows 95 User Interface Design Errors", Tandy Tower, Microsoft Developer Network News, Sept/Oct 1995.
2. "Goodbye GUI, Hello NUI", Tom R Halfhill, Byte, July 1997.
3. "Designing the HotJava Views User Environment for a Network Computer", Don Gentner, Frank Ludolph and Chris Ryan, White Paper, Sun Microsystems, March 1997.
See also www.acm.org/cacm/AUG96/antimac.htm The Anti-Mac Interface, Don Gentner and Jakob Nielsen, ACM, August 1996.
4. Asking users if they want to save what they've just done is a very widespread example of an implementation detail intruding into the user view. It means "Do you want to copy what you have just entered from memory to a disk?". As far as most users are concerned, when you've entered something, it's there. It doesn't need to be saved. If they don't want it, they'll delete it. Saving information is the business of the computer, not the user.
5. "Starting Word as your e-mail editor".








Collections Considered Harmful

   Mon, January 22, 2007
No code should contain collections except the classes which encapsulate the collections

Rod McLaughlin, July 2006 (updated)

Why is String a class in Java and .NET languages? In C, there were no strings. Instead, we used char array.
char mystring []; int i;
mystring = "Hello";
for( i = 0; i < 10; i ++ ) putc( mystring[ i ] ); // etc.
Why was String invented? Why not use char array?

The answer is well-known. Arrays are error-prone. Most of the software we use every day is written in C. When it crashes, half the time, it's because of array errors. Usually, it's trying to access the Nth member of the array when the array has less than N members (including the accidental use of negative indices, fencepost errors, and errors encouraged by zero-based indexing). So, in object-oriented languages, the creators decided to encapsulate the most widely-used array, char array, in a class, String.

What is bad about char array? The fact that it contains chars, or the fact that it is an array? It's not the fact that it contains chars. All arrays are prone to exactly the same errors, the most common of which is attempting to access an element with an out-of-bounds index. Yet Java and .NET languages have arrays. You may check the length of an array before indexing it, but you don't have to. Given an array A, before accessing the Nth element, you should

1. Check that A is not null
2. Check that A has at least N elements
3. Check that the Nth element is not null

Therefore, code with arrays is either bug-prone or littered with repetitive checks.

They also have other types of 'Collection', such as ArrayList (Array isn't technically a collection in Java, for historical reasons, but is in .NET). These collections address some of the issues with arrays, but do not solve the basic problem. There are iterators other than numerical index 0..N. But iterators don't solve the basic problem of collections: they expose too many of their internal details.

The solution is simple, and we already know the answer. String is a class precisely because the collection it encapsulates, char array, is harmful. The same principle applies to all collections. No code should contain collections except the classes which encapsulate the collections. This is a real example I came across:

String line = Customers[ 3 ].Addresses[ 2 ].AddressLine[ 1 ];

I can see eight possible exceptions this expression could generate. The Customer class contains an array of Addresses, and the Address class contains an array of strings, AddressLine. Customers, Addresses and AddressLine should be classes, not collections. For example, this is how to encapsulate the AddressLine array: US postal addresses have one or two address lines before City, State and Zipcode, so AddressLine's accessor methods should not be AddressLine[ N ], which cannot guarantee to return either the first or second address line, because N could be less than zero or more than one, but AddressLine.FirstLine() and AddressLine.SecondLine(). It would never cause an index-out-of-bounds error. Its behaviour could be improved without breaking code which depends on it. For example, you could change the answers to questions like: should SecondLine() return null or an empty string, or throw an exception, if there is no second line?, and what should happen if you attempt to add a second line to an AddressLine with no first line? It would be easy to extend for countries whose post offices are less bureaucratic.

Custom collections (where you extend a Collection class) are probably not what you need, because they tell you what methods you must implement. A good story is not just a 'collection' of words.

Another real-world example: the ADO.NET class DataSet. I extended it into a class which automatically inherits constraints from databases,, and needed to extend the myDs.Add( table ) method. Unfortunately, there isn't one. Instead, DataSet has a public collection, Tables, and you must do myDs.Tables.Add( table ). This method cannot be extended, because Tables is a collection. So is everything else in DataSet. Thus, the misuse of collections violates two principles of OOP: DataSet exposes its implementation details, and it is not extensible. The solution is to put a DataSet inside a my own class rather than inheriting from DataSet - in other words, hide the collections. But why didn't DataSet hide them in the first place?

Every collection in your code should be treated in the same way. Each one should be replaced with a class, and its use with an instance of that class. This conclusion follows from the fundamentals of object-oriented programming. Collections are inherently dangerous. They need to be caged in classes, and never let out.

Update February 2007: another reason collections should be encapsulated in specialized classes is to help serialization across networks. For example, using XFire Java web services is quite complicated when trying to send collections, and virtually impossible using Java 1.5 generics. Having your own specialized class containing a collection is easier.

See www.arcknowledge.com/gmane.c...051.html









XML versus YAML

   Mon, January 22, 2007
According to Extreme Programming, programmers always produce the simplest code necessary to solve the problem.

'What is the simplest thing that could possibly work?' (Kent Beck - Extreme Programming Explained). This is often not true of XML.
XML is eminently machine-readable, but difficult for human beings to maintain. YAML is a much simpler alternative for configuration files, communication between objects, communication of objects, and everything else. Like XML files, YAML files can be self-describing (you can tell if they contain what you expect), but are easier for humans to read. YAML doesn't describe itself as self-describing, but it can be. There is a situation in which 'the simplest thing that could possibly work' is XML - when you are communicating with the outside world, and the outside world insists on XML. Otherwise, choose YAML.

www.yaml.org

I should point out that the authors of YAML specifically deny that it is a substitute for XML. That's their opinion.

Here are six ways of writing the same information, none of them better than the others:


1. <invoice id="12345"><price>6789.10</price></invoice>

2. <invoice><id value="12345"></id><price value="6789.10"></price></invoice>

3. <invoice><id>12345</id><price>6789.10</price></invoice>

4. <element name="invoice" id="12345">
<element name ="price" value="6789.10">Ignore this</element>
</element>

5. <element><element><name>invoice</name><id>12345</id></element>
<element><price><value>6789.10></value></price></element></element>

6. <element>
<name>invoice</name>
<attribute name="id">12345</attribute>
<attribute name="price">6789.10</attribute>
</element>


"There's more than one way to do it - but only one right way"

YAML can contain anything XML can, in about 20% of the characters.

Not only IS YAML human-readable, I would encourage people to read it. You can write anything (invoices, databases, haikus) in YAML. People can easily become accustomed to the unambiguous yet poetic style YAML allows. It is said that XML doesn't need to be human-readable, as there are some good XML viewers/editors available. But this isn't true.

I digress. My point is, YAML is better for data and programs (as in SOAP and Web Services) than XML. The obvious choice of language for programs embedded in YAML is Python, since it uses indentation as structure. The only thing missing from YAML is DTDs for defining what a YAML document must contain (an XML DTD is a specification which says something like "a document which conforms to this DTD must consist of an element named 'breakfast' which contains exactly three instances of the element 'egg' which may or may not have an attribute 'cholesterol'"... etc.). A YAML equivalent of DTDs is on its way.

Taking the invoice example above, it is true that, just as in XML, there are several ways you could represent the data. But unlike in XML, there is just one blindingly obvious way to do it:

invoice: id: 12345 price: 6789.10
I find it difficult to describe YAML. It speaks for itself. For the definition, examples, etc., I can do no better than point you to www.yaml.org.

I wouldn't say XML was slow, but do you know the one about the tortoise who was mugged by two snails? The police asked him what happened, and he said "I don't know, it was all over so quickly...".

YAML documents/streams can contain
DOCS
BITS
CODE
DATA
They are therefore well-suited for 'web services' or 'applets' - code downloaded from websites and run immediately. A YAML stream can contain Python code, its initialization data, binary and text, and its documentation. A Python program 'stub' would be downloaded in YAML, and execute on the user's machine. It would communicate with the real program - its big brother - on the server in YAML as its methods were invoked - just like a .NET web service.

The only thing missing is security - both encryption and code safety. The first requirement is easily met - SSL is just one possible solution - but the second, making a Python program 'safe' in the same way a Java Applet is, would require a safe class-loader type of solution, which restricts network and disk access, etc..

PS. JSON (json.org/) is like YAML but easier for non-technical people to understand. It will probably be more successful.








Why I hate Microsoft

Why I hate Micro$oft

   Mon, January 22, 2007
This was originally written in 2000, then changed in 2001 and 2004. I could make further changes. For example, it predicts that all proprietary software is doomed, and open source software will replace it. Wrong! At the O'Reilly Open Source Conference, the most widely-used computer is Apple Macintosh. This is the most proprietary of solutions. The IBM PC is much more open, as it has numerous licensed manufacturers, whereas the Macintosh, and everything on it, only has one. And it's expensive. But it's expensive for a reason. It works. Software developers and graphic artists alike want Mac. I recently had four job interviews, and three of them allowed you to use a Mac for software development. Windows has meanwhile acquired more bugs and user interface issues, and the basic conclusion of this post remains.


Micro$oft

It's not that they try to be a monopoly (their competitors are the same, except not very good at it).
It's not their attempt to undermine Java (they failed, but like all proprietary software, Java is in for trouble anyway).

It's not their promotion of technically inferior products over better ones.

It's not their calls for "freedom to innovate" despite the fact that they have never produced a single original idea.

It's their attitude.

Here's a very long example of Microsoft's contempt for the consumer.
I have a Compaq 486 - useless for the latest version of Windows, but a decent box if you put an operating system on it.

I bought a kickass new computer with an AMD K6 500 MHz processor, 256 Mb of memory and a 20Gb drive, divided into two bits, called "partitions". I've linked it to the 486 via a simple network.

It came pre-installed with Windows 98 on one partition, and nothing on the other. I don't like Windows 98 - it takes too long to boot up, and doesn't give me enough control over the machine. None of my old DOS utilities work on it. However, I do want Windows 95, just to run a Windows Music Teaching program which works with my Creative Blasterkey electronic keyboard. (Piano Discovery, by JumpMusic.com). After I have learned basic keyboard skills, I can run the piano, and every other useful piece of hardware, from Linux. To achieve this, I needed to
a) install Windows 95 on the spare partition
b) install Piano Discovery in Windows 95
c) install Linux over the Windows 98 partition

I installed Windows 95 version OSR 2 on the spare partitition on the AMD machine. I then rebooted, and got this error:

Device IOS failed to initialize. Windows Protection Error. You must reboot your computer.
I didn't know it then, but I was going to become familiar with this message. Very familiar. I now know it off by heart. I can recite it in my sleep, and probably do.
For those who lack the patience to follow my cautionary tale all the way through, I will summarize the problem:
In order to run Windows 95 OSR 2 on an AMD K6, I need to run AMDK6UPD.EXE.
In order to run AMDK6UPD.EXE, I need to run Windows 95 OSR 2.
I expect you see the type of dilemma I have - it's known as a "Catch-22".


Partition the Lord with Prayer

First I rebooted with the Windows 95 floppy disk, ran fdisk, changed the active partition to the Windows 98 partition, rebooted again, connected to the Internet, ran Netscape 6, went to Google, and searched for
"Device IOS failed to initialize. Windows Protection Error".
This is what I found:

--------------------------------------------------------
From www.springfieldtech.com/Window..._95.HTM Device IOS failed to initialize. Windows Protection Error. You must reboot your computer.

See this file on MS Support
support.microsoft.com/support...8/41.ASP

---------------------------------------------------------
From www.synapseadaptive.com/dolphi...ios.htm

Introduction

This technical bulletin outlines an error message produced by Windows 95 after re-booting following installation of a program or making configuration changes.

The information is provided in the form of an MSDN (Microsoft Developer Network) technical article.

Err Msg.: "IOS Failed to Initialize" on Boot

Last reviewed: September 25, 1998 Article ID: Q157924

While initializing IOS: Windows protection error. You need to restart your computer.

After the error message is displayed, you may not be able to start Windows 95 normally. However, you should be able to start Windows 95 in Safe mode.

It may also be possible to start Windows 95 normally after using the following procedure: Boot Windows 95 in Safe mode or to a command prompt. Perform one of the following two steps:

Edit the Config.sys and Autoexec.bat files and disable any references to Smartdrv.exe and real mode disk drivers.

To disable a line, type "rem" (without quotation marks) at the beginning of the line.
Rename Smartdrv.exe to another name.
Restart your computer normally.

---------------------------------------------------------
Knowledge Base Symantec

Error: "...Windows Protection Error..." in Windows 95
Situation: After you made configuration changes to your system, Windows 95 displays one of the following errors during system startup:
"While initializing device IOS: Windows protection error. You must restart your computer."
"While initializing IOS: Windows protection error. You need to restart your computer. "
"Windows protection error. You must restart your computer."
etc...

Your system has 32 MB of RAM or more, many device drivers loading into memory, and it does not have Internet Explorer 4.0 installed.

Solution: This is a known issue with the Windows 95 operating system and may happen after installing or uninstalling any product. Microsoft has fixed this problem in Windows 98.

One of the following solutions may resolve the problem until you are able to obtain a copy of Microsoft's repair file, IOSUPD.EXE.
Rename the SMARTDRV.EXE file in the C:\Windows folder.
Rename the AUTOEXEC.BAT and CONFIG.SYS files.

For more information, see Article No. Q157924 in the Microsoft Knowledge Base at: support.microsoft.com/support/

Microsoft's IOSUPD.EXE file can be found on the Microsoft Web site and at a number of other locations. Since the installation instructions appear to assume that the system is successfully booted into Windows 95, you may need to reinstall Windows 95 before you are able to apply this fix. As with other hotfixes, it may not be advisable to apply the hotfix unless your system reports this error.

CAUTION: Run this file only on Windows 95 systems. The file can corrupt your installation of Windows 98.

This file can be found at the following locations:
1. ftp.microsoft.com/Softlib/M...iosupd.exe
This is a Microsoft ftp site for file downloads. Download the file IOSUPD.EXE. Running this file will extract the files IOSFIX.EXE and IOSFIX.TXT. Running IOSFIX.EXE will extract the files README.TXT and RMM2UPD.EXE.

...etc.

---------------------------------------------------------
From www.csgnetwork.com/harddisk.html

In addition, the Windows 95/98 protected-mode IDE disk driver (Esdi_506.pdr) is used to provide 32-bit disk access when you use any of the first three methods listed above. When you use a real-mode driver to provide geometry translation, 32-bit disk access is provided by Esdi_506.pdr only if you use version 6.03 (or later) of OnTrack Disk Manager's XBIOS drivers. For information about or assistance with Disk Manager, please contact OnTrack Technical Support

---------------------------------------------------------
This is from the horse's, um, mouth:
support.microsoft.com/support...3/53.asp

"This problem can occur if there is a hardware error while data is being read from the hard disk. When such an error occurs in Ultra DMA mode, the Windows device driver does not successfully recover from the error and retry the operation."

Well, why not?

From support.microsoft.com/support.../41.ASP:
Scroll down to the Service Packs section and then click the link to download the Windows 95 Update for AMD-K6-2/350.

This issue is resolved by the following updated files for Windows 95 OSR 2 and OSR 2.1:

Date Time Version Size File name
--------------------------------------------------------------------------
09/04/98 11:18am 4.00.1118 24,426 bytes Esdi_506.pdr
08/03/98 11:13am 4.00.1113 25,249 bytes Hsflop.pdr
09/04/98 11:12am 4.00.1112 23,158 bytes Scsiport.pdr
01/15/97 11:12am 4.00.1112 59,153 bytes Cdfs.vxd
01/15/97 11:12am 4.00.1112 18,809 bytes Disktsd.vxd
01/15/97 11:12am 4.00.1112 9,955 bytes Int13.vxd
09/04/98 11:13am 4.00.1113 68,962 bytes Ios.vxd
01/15/97 11:12am 4.00.1112 18,197 bytes Vfbackup.vxd
In addition, the following updated file is needed for OSR 2.1:

Date Time Version Size File name
--------------------------------------------------------
12/04/98 12:13pm 4.00.1213 111,678 bytes Ntkern.vxd
---------------------------------------------------------
This website is run by a geek who carefully documents numerous problems with Windows, and tries to provide solutions:
www.graphic-locomotion.com/win95upd.html

"Also note that although this update applies to both the original version of Windows 95 and to Windows 95 OSR2, one of the updated files it contains, VOLTRACK.VXD, is older (version number 4.0.0.954) than the one (version number 4.0.0.1111) contained in OSR2. The update is smart enough to not install VOLTRACK.VXD in this case. So for those running the original version of Windows 95, remideup.exe will update ESDI_506.PDR and VOLTRACK.VXD, and for those running Windows 95 OSR2, remideup.exe will only update ESDI_506.PDR.

"Before the release of OSR2, there was yet another version of this update: ideupd.exe (UPD960514a). Even though this update has been made redundant by the latest remideup.exe, for some reason Microsoft has decided to include it on the OSR2.5 CD. This is even stranger considering the fact that the latest remideup.exe (UPD970521R1) is also included on the OSR2.5 CD.

"Note 49 -- Last modified on 22-Dec-1998
amdk6upd.exe (UPD980911N1) is meant for OSR2 and higher only; it should not be applied to earlier versions of Windows 95. It fixes problems on computers that have an AMD K6-2 processor running at 350 MHz or higher. Although the name of this update seems to imply that it is meant for systems that have an AMD K6 processor, it also installs fine on other systems, and for a while now (and without any problems), I have been using a non-AMD Windows 95 system on which this update has been installed. And since this update contains several newer versions of files that come with other updates (for instance, flopupd2.exe and remideup.exe), and since according to Microsoft's own Knowledge Base article Q161020, most updates are incremental (i.e. newer versions fix not only some new problem, but also everything fixed by older versions), I do not see any reason why this update should only be installed on AMD K6 systems. Finally, even Microsoft and AMD do not explicitly state that this update should not be applied to non-AMD-K6 systems."

(Copyright © 1997-2000 Ben Jos Walbeehm.)

What a careful explanation! Why is such a competent systems guy wasting time with Microsoft?

A Cautionary Tale

I will give my story, in as much detail as Ben Jos Walbeehm, but with a different aim. My aim is to persuade you not to use Microsoft operating systems.
If you really must use one, send me a stamped envelope and I'll send you one of mine. I've plenty:
A Windows 95 version A floppy disk, created during the install of Windows 95 on my 486, with some additional utilities, eg. FDISK and FORMAT.
A Windows 95 "upgrade" CD, version A (1995, original version).
A Windows 95 version B CD, 1997 (I think this is OSR 2).
A Windows 98 CD.
A Windows 98 floppy.
Windows 98 installed on my AMD.
Windows 95 version A installed on my 486.

Made sure that my Windows 95 floppy disk contains ATAPI_CD.SYS. This is needed to access CD-ROM.

A:\>format /s d:
Label: SPARE, Size 9773.8Mb.
Reboot with Windows 95 floppy and Windows 95 CD.
FDISK - set active partition 2:


partition 1 Non-Dos 9790
partition 2 EXT DOS 9774
Reboot with Windows 95 floppy and Windows 95 CD.
FDISK - add a partition, show information:

1 Non-Dos 9790 50%
C: 2 A PRI DOS 2047 10%
3 XT DOS 9774 50%
What a bizarre and arbitrary mixture of different types of information! There's Partitions, Primary DOS, Extended DOS, Non DOS (which means FAT32, the Windows 98 partition). Sometimes, FDISK knows which disk drive (eg. C:) goes with which partition, but not always. There's active ("A") and inactive, then percentage. Percentage of what? The numbers above add up to 110%.

Remove floppy. Reboot to Windows 98. Oops - forgot to change my active partition.

Reboot with Windows 95 floppy.
FDISK - set active partition 1:

Remove floppy. Reboot - takes about six minutes for Windows 98 to boot up. Look at Disks in Windows Explorer.

C: normal Windows 98 drive (not the same C: as above)
D: "SPARE"
E: not accessible ("a device attached is not functioning")
F: W95 (The Windows 95 CD)
G: C on ROD (This is the C: drive of the 486, which somehow inherited my name, viewed through the network.

Normally, "C on ROD" is also known as F:, but now because "SPARE" has occupied D:, subsequent drives are bumped one letter).

Reboot with Windows 98 floppy. C: is Windows 98, D: is SPARE, E: is not accessible, F: is the CD, G: is C on ROD.
A:\>format E:
"E: is not accessible (a device attached is not functioning)",
Reboot with Windows 95 floppy.
FDISK: make partition 2 active
Tried using a floppy disk I created from a Caldera Linux CD, which contains "Partition Magic", which you might hope would sort out this message, and produce its messages in some meaningful subset of English.
It fails - no fault of Caldera's. Windows 98 starts.

Reboot with Windows 95 floppy.
FDISK: make partition 3 active - the 9774 EXT DOS partition.
D: is now the CD, C: is "invalid media type", E: is "invalid drive specification".

A:\> format /s c:
"Insufficient memory"

Reboot with Windows 98 floppy.
C: is Windows 98, D: is SPARE...
A:\> fdisk
Do not enable "large drive support"


E: 1 PRI DOS 2047
C: 2 PRI DOS 9790 FAT32
3 A EXT DOS 9774
Reboot with Windows 95 floppy.
A:\> format /s c:
WARNING: yes, continue...
Formatting 2047.3 MB...
D: setup (CD)... no... changed my mind... exit

1 Non-Dos 9790
C: 2 PRI DOS 2047 FAT16
3 A EXT DOS 9774
Set Partition 1 active (FDISK... 2... 1... ESC... ESC... CTRL-ALT-DEL... I'm getting pretty good with FDISK. Must put it on my resume).
1 A Non-Dos 9790
2 EXT DOS 9774
Delete Partition 2.
"Cannot delete extended DOS partition while logical drives exist"
... but it can't find any logical drives in the extended DOS partition for me to delete! (That's because it's FAT32, and I'm using a FAT16 O/S {Windows 95 floppy} which can't recognize it). Set active partition to 2. Reboot with Windows 95 floppy.
Now, there's no FAT16 partition, only the CD-ROM and C:
Reset active partition to 1 and reboot with Windows 95 floppy. I was getting a bit tired by this time, so I made a mistake with FDISK. Nearly deleted the Windows 98 partition (partition 1) by mistake, but luckily, it wouldn't let me.

Reboot with Windows 98 floppy - 2 partitions, Non-Dos is active.
FDISK - no to large disk support.

Deleted logical partition in EXT DOS. Reboot with Windows 95 floppy. FDISK - delete extended DOS partition. Created primary DOS partition using maximum space and made it active. Now:


1 Non-Dos 9790
C: 2 A PRI DOS 2047 Unknown
Now A: is the floppy (or B: - you can choose!), D: is the CD, C: is invalid media.
FDISK, make partition 1 Active,
A:\> format /s c:... "Formatting 2,047.3 Mb"
D:\> setup... Windows 95 Setup...
"Error SU-0013. Setup could not create files on your startup drive, and cannot setup Windows... if you have HPFS, you must create an MSDOS boot partition, see SETUP.TXT."

Oh... this means I should have set partition 2 active. Did so.
Reboot with Windows 95 floppy... D:\> setup...
License agreement... create startup floppy disk... Check on "Network card" option... "Copying startup files.. Getting ready to restart your computer..." Oh boy!
Then... hardware issue... restart.. Safe mode
"While initializing device IOS: Windows protection error. You must restart your computer."
Tried five times. Same error.

Reboot with new Windows 95 floppy disk... now it can't find the CD-ROM! So reboot with the old Windows 95 floppy disk... now D: is the CD, Setup again, overwrite everything ... Don't check "Network card" option... "Smoother multitasking lets you do many things at once". Wow. "Sign up with the Microsoft Network today and get connected"... restart... same error.
CTRL-ALT-DEL
Safe mode (option 3)
Step-by-step confirmation... yes, yes... Load the Windows GUI... no....
C:\> WIN
Same error.

Reboot using Windows 95 floppy, FDISK, set partition to Windows 98, reboot, wait five or six minutes... Had a look through Bootlog.prv, ios.vxd, setuplog.txt, iosclass.dll... On to the web... It's a problem Windows 95 has with the AMD K6 above 350 MHz. Microsoft generously concedes that it's not a hardware issue. They don't go as far as to admit it's a bug in their software. The issue is fixed in Windows 98 - by removing the feature that causes the crash, which is some clever processor-timing dependent kluj. It's not an Intel-Micro$oft conspiracy either - the problem also occurs in some Pentium chips.

Recall that I have a full install CD for Windows 95 OSR 2 (or Windows 95 B - it doesn't say this on the CD - you have to figure it out from file dates - May 1 1997). I also have an "upgrade" for Windows 95 original version, file dates July 11 1995. (It means upgrade from Windows 3).

You can't use the OSR 2 disk to upgrade from the original Windows 95. To cut a long story short, I ended up with the following situation:

If I install OSR 2, under no circumstances can I run it as a GUI. I can't run it in safe mode, though I can run it in DOS mode. But the various update executables I downloaded from the web (AMDK6UPD.EXE, RMIUPD.EXE etc.) will only run in Windows 95 graphical mode. You can restart Windows 95 OSR 2, hit F8, and choose various things. None of them worked, including all possible combinations of Option 5... run in DOS mode... then (as suggested by Microsoft)
C:\> WIN /d:m
nor any of the other six possible flags after /d:, nor even a combination of m and v (/d:vm). Under no circumstances can you get Windows 95 OSR 2 to run on my AMD K6 machine.

In order to upgrade it so you can run it, you need to run AMDK6UPD.EXE. But this will not run under any Windows 95 version A, and will damage Windows 98. In order to run AMDK6UPD.EXE, you need to be able to run Windows 95 OSR 2. It's a Catch-22.

You can, however, run Windows 95 version A. This also causes the IOS error. BUT, by copying the files RMM.PDR, SCSIPORT.PDR and ESDI_506.PDR from Windows 98 dated April 23 1999, into the 'c:\windows\system\iosubsys' directory of Windows 95 VERSION A, NOT OSR 2, while in Windows 98 (there I go again!), and rebooting, it just about starts.

But this is prone to frequent errors - blue screens containing the message "Invalid VXD call from ESDI-506.PDR. Continue?"... if you answer Y, it usually continues into Windows 95. But you cannot run any of the update programs which I downloaded from the web under Windows 98, because it's version is A, not OSR 2. The update programs say "Wrong Windows Version" and exit.

Furthermore, the Windows 95 file system disintegrates, even if you are looking at it from the File Manager in Windows 98. This is really strange, because nothing is running from that drive. It's not the active partition.

Folders change their names to things like "{_|]_|_p__ö[{". You can't open them and see their contents, because they are illegal folder names.

I carefully tried most of the things suggested on both the Microsoft and their poor hackers' websites, but there is a limit.

This is a very shortened version of the real story, which must have taken at least 24 hours of my valuable time.

The one thing I haven't tried is this:
Backup whole of 486 into subdirectory of Windows 98 machine, using network.
Reformat 486 drive.
Install Windows 95 OSR 2 on this drive (remember, you can't upgrade Windows 95 version A using an OSR 2 full install disk - you need an OSR 2 UPDGRADE disk).
Restart 486.
Cross fingers.
Run AMDK6UPD.EXE on 486.
Copy entire file system (at least, those files which Windows allows you to copy) to Windows 95 drive on the AMD using Windows 98 on AMD.
Reboot AMD with the Windows 95 floppy, FDISK, change partition to Windows 95, reboot, and hope that these files constitute a valid Windows 95 OSR 2 with the AMD K6 bug fixed.

The reason I haven't done this is because I noticed that, if you copy the whole file system of the 486 into a folder on the Windows 98 machine, whether you use the File Manager or XCOPY /v /y /s /c *.*, you tend to lose files and get a file system which corrupts over time.

Red Hat Linux isn't perfect either. I find that the installation of Red Hat Linux usually fails if there is any trace of a Windows partition on the disk, with the "Disk Druid" stuck in a state where it can neither go back nor forward, forcing you to hard-reboot by hitting the power button, which causes Linux to exit with a "Kernel Panic" as soon as it restarts. However, it is at least possible to run Linux on my computer. I eventually installed it over the whole drive, and abandoned Microsoft Windows forever.

This was originally written in 2000 and 2001. Now it's 2004 and I'm still having to use Windows for work. I'm no longer dealing with Windows 98 not working on a K6, but Windows XP not being able to upgrade to "Windows Server 2003 .NET", necessitating a five-hour reinstall of Windows, Office, Visual Studio, the .NET Framework, and all the rest. I'm writing a course on using V$.NET to create platform-independent Web Services - but in order to deliver the course, it is necessary to create a "virtual hard drive" - a copy of the entire PC you use to write the course, and deliver it using Virtual PC - and 1Gb of memory, 12Gb of disk space, a fast network... they say that Intel giveth, and Micro$hit taketh away. I could do the course using Perl and text files, and deliver it on a floppy disk.

Here is an example of some of the stuff I have to deal with:
If Visual Studio .NET cannot find the web service, it may be necessary to enter the full path to the web service files in the dialog box: C:\...X. If Visual Studio .NET does not give you the opportunity to do this, the following steps must be taken:
Exit Visual Studio .NET. Do not save any files if it asks. Navigate to Start | Control Panel | Administrative Tools | Internet Information Services (IIS) Manager. Open the IIS folder structure. Under Default Web Site, you may see a reference to the service you are trying to use. If so, right-click on it and select Delete. When the IIS Manager dialog box asks you if you want to delete it, click on Yes of course I %@$*! do. Right-click on Default Web Site and select New | Virtual Directory. In the Virtual Directory Creation Wizard, click Next. In the Alias field on the next screen, enter the name of your web service (e.g. X) and click Next. In the next screen, in the Path field, enter the full path to the service (e.g. C:\...X). Click Next and Finish.

My preference is to use Mac OS/X for email, word processing and so on, and Linux for software development. I still regard M$ as completely parasitical, of no practical value, and heading towards Enron-land.



As I went out one morning

   Sun, March 18, 2007
This story documents my struggle with the after-effects of a relationship with a woman with a chip on her shoulder about being oppressed, and my recovery via the rejection of liberal attitudes. The story is true, but told in an allegorical way it's not really about rock climbers, but another social circuit I used to belong to, and all the places and names are changed, except for Christa, dumb blonde, PhD., who is such a bitch I've used her real name.

Books referred to in this and subsequent posts
Anti-Oedipus. Gilles Deleuze and Félix Guattari, University of Minnesota Press, 1983.
Sadomasochism in Everyday Life : The Dynamics of Power and Powerlessness. Lynn Chancer, Rutgers University Press, 1992.
On the Genealogy of Morals. Friedrich Nietzsche, Vintage Books, New York, 1967.
Blood Relations - Menstruation and the Origins of Culture. Chris Knight, Yale University Press, 1991.
Touching the Void. Joe Simpson, Jonathan Cape, London, 1988.
Re-Authoring Lives. Interviews and Essays by Michael White, Dulwich Centre Publications, Adelaide, 1995.



How this story started

   Mon, March 19, 2007
This story started out as a way of dealing with episodes of depression caused by memories of what is liberally called 'a relationship'. It is based on 'narrative therapy'. The idea is, we all have several competing stories. Some stories are better for us than others. Suppressing the subjective in favor of the objective is bad for you. Depression is often caused by an alien story taking the place of a positive one. This was the case with the story of Cathy.

From 1994 to 2001, my life was driven by an attempt to deny the consequences of what Cathy did to me. I suppressed it because I actually believed Cathy's version. When I talk about 'narratives', I am not indulging in an academic game. My aim is recovery from the systematic replacement of the positive story I created for myself over many years with an alien, negative one which threatened my life. She didn't try to undermine all my relationships and cut me off from my community, but she behaved in a way which had these effects.

Whenever I tried to tell Cathy any aspect of my story, she denied it, and claimed that she was more of a victim of our 'relationship' that I was. This story took the breath out of me and reduced me to silence. It was all the more effective because she really believed it. "I don't give a fuck about your feelings". "You're lying". "That's bullshit". "I didn't do anything to you".

Cathy's story turned me against my friends, and some of them against me. Worse, Cathy's version turned me against myself. Her story enlisted our friends in convincing me that it was my behavior that was wrong, because my internal state was pathological. It was a classic case of "blame the victim". Cathy asked me to keep quiet to shield her reputation. She used my naive accession to this request to make sure that only her side of what happened was told. She was able to structure the discourse to her advantage. Now it's my turn.



Moves

   Sat, April 21, 2007
It started when I moved to Manchester from Sheffield. It rains more, and there's less rock climbing nearby, so I started to get depressed. I visited Sheffield frequently, though, and that's where I met Cathy, in December 1993, at the Foundry, an indoor rock climbing gym.

I moved to the USA in 1994, during the bust-up with Cathy. Initially, I had a few affairs in San Francisco.

I had to move to New York in 1996 because that was the only place I could find where a company would sponsor me for a temporary work visa. I went rock climbing to 'The Gunks' state park every weekend. My last weekend in New York was October 26/27, 1996, as the Yankees won the World Series. I had a job in California, with an Internet development startup.

This job was in the 'South Bay', a different kind of place from San Francisco. I met Miss Taiwan in a laundromat, and she thought I was "a very interesting person" - though all things are relative, and that's not much of a compliment in San Mateo. America is a land of extremes. There are extremely interesting places -
San Francisco
Manhattan
Seattle
and one more place that I prefer to keep quiet about
- and the rest is extremely boring. San Mateo, you may notice, is not on the above list. Proximity to San Francisco doesn't help. South of Bernal Heights, San Francisco suddenly ends. Today, I hate the Bay Area. It's a dirty, corrupt slum with occasional islands of yuppies. Flying from San Francisco to Seattle is like escaping from a swamp into an alpine meadow.

Anyway, Miss Taiwan stood me up, and I never call anyone back after being stood up. I had some self-respect, even in those days.

Then in September 1997 I got another temporary work visa, this time with a company in downtown San Francisco which had agreed to sponsor me for a green card, under the misapprehension that this is the way to keep an employee. I met a friend from Manchester at a Microsoft developers' conference who mentioned, and stirred up memories of, Cathy. Even hearing about her gave me nightmares.

I had one 'relationship' between 1997 and 2001, with a shrink called Christa from Westchester County. It was hopeless. My green card arrived in March 2001. Now I could do what I liked.

In August 2001, I went back to Sheffield. I held out for a week, then the disaster of '94 came flooding back. I told my friend Tim and his girlfriend Gretta - I had to tell somebody, and John, whom I was staying with, is either indifferent, or takes the side of my enemy. Tim and Gretta were surprisingly sympathetic and suggested I look for therapy. I did so. I looked up the practitioners of Narrative Therapy in San Francisco on the Internet.

I call her 'Schizoid Cathy', after Typhoid Mary, a carrier of typhoid who infected dozens, some fatally, but was immune to the effects of the disease herself. Mary Mallon, who was an Irish kitchen servant in New York state in the early 1900's, was forcibly removed from the community. At first, she was kept in solitary confinement. Her first incarceration ended when she was allowed to leave hospital provided she reported back regularly. However, she changed her name, once again working as a scullion, infecting people, and this time she was locked up for good. She never believed she was a carrier.

Similarly, Cathy is convinced that she did me absolutely no harm, in fact, that she 'just gave'. This belief is central to just how much harm she did me. I internalized her denial of her own responsibility. I believed that all the pain and guilt she piled on me did not come from her. It must have come from somewhere, so I convinced myself it was internally generated.

I was prone to denial before Cathy. A bit of denial never killed anyone. Pretending it doesn't hurt helps people run marathons and climb mountains. Even in human relationships, one should often disguise one's feelings, even to oneself. You can sometimes get rid of pain by pretending it doesn't exist. But after Cathy, I was in denial for seven solid years. This was a psychotic episode. I look back in amazement at what I did and said during those years. I look around me at the things I have collected, and in most cases, they are a substitute for a life.

I moved to the USA, advanced my career in computing, made numerous new friends, and climbed various crags and mountains. I bought some land in the Sierra Nevada, where I thought I wanted to live. The idea is ludicrous. I'm not so much of an outdoorsman that I can tolerate illiterates, having to drive everywhere, and freezing winters. This is another example of a false self created by the schizophrenic narrative Cathy imposed on me. The force of her attack split me into several people.

My feelings are about as inoffensive as a Polish lesbian joke. But when did being offensive become a crime? Who decides which feelings are good, and which are bad, that successful people are bad, and less successful ('oppressed') people good? Of course my feelings are no less valid than Cathy's - how could I have been so naive as to be conned into thinking they are? Clearly, the answers to these questions have to do with Christianity, socialism and justice.

Nine months after we broke up, she visited her parents in San Francisco. We met for an hour. I expressed no interest in her except as a friend. I suggested meeting again, and she said "Nothing's going to come of it". I had not even hinted that I wanted anything to come of it. She sent me a letter, an extract from which is quoted below, accusing me of sexual harassment. What a cunt! What a come down! What an anti climax! The reason she accused me of sexual harassment is that sex is the only thing she understands. To Cathy, a cigar is never just a cigar.



The Letter

   Sun, April 29, 2007
Cathy's letter of January 1995

"When the other person doesn't desire it, how can intimacy be attractive? Maybe I'm misunderstanding you, but it seems to me that if you had respect for me as a subject you would not try to impose the burden of your state of mind on me. I admit there were times when I gave you mixed messages, but that hasn't been for most of a year and I think I've been pretty clear - crystal clear - for quite a while. How I look at it, it would be nice to be friends with you, but I would rather have no contact if you can't deal with things at the level that I'd like it. Am I dictating terms? Of course I'd like to, I'm not going to pretend otherwise. I want it to be clear that our relationship is not open-ended, ambiguous, or intimate in any way. I do have some nice memories of our time together, but for the most part, it was a disaster that I would like to forget. If we can normalize our friendship now it will be easier to remember the past as something less regrettable, but if you want to insist that there are still loads of unresolved issues and so forth then I am not really interested and would rather just chalk the whole thing up to experience and not give it much thought. Maybe you will take this attitude as another sign of my amazon-like power and invulnerability. As you may have finally noticed, I'm not actually so impervious to pain, mine and others. I just think its best to live the fucking life..."

- Catherine

Cathy is a product of a middle-class Bay Area family, not a trailer park. At no point did it occur to her to offer an example of what she means by me attempting to achieve intimacy with her, nor of trying to resolve issues. As for imposing my state of mind on her, this is simply the opposite of the truth. My state of mind, from 1994 to the present, is a product of her schizogenic behavior towards me. What this letter amounts to saying is "You are parasitical towards me, you keep talking about a medical condition called depression which you suffer from and which has nothing to do with me, and a sexual harasser. If you try to reply to these allegations, I will cut off all contact with you". Yet this is fair and reasonable compared to what Cathy said on the phone.

"It was a nightmare". "I feel sucked dry". "I didn't do anything to you". "You're lying". "That's bullshit". But "I don't mean you any harm".

Cathy did me more harm than anyone I have ever met. Internalizing her 'pathologizing narrative' - a story which says you're sick when you aren't - undermined my life for seven years.

But Cathy isn't just a cunt. Christa, a dumb blonde with a PhD. from upstate New York, is even more of a cunt, and you can't be more of a cunt than just a cunt.

I originally intended to name this chapter after Joe Simpson's mountaineering epic Touching the Void. From a climbing standpoint, I can't touch Joe. But that's the point. Why would I want to? What would drive someone to climb difficult mountains, let alone one like Siula Grande which requires walking along snowy ridges, roped together, where, if one climber falls off one side, the other has to jump off the opposite side to prevent them both falling to their deaths? Admitting that Cathy still haunts me has taken away my drive to tolerate uncomfortable conditions to utilize difficult means to attain dangerous ends. I'm more interested in solving problems by writing this story than running away from them by climbing.

The main reason I visited Britain from the USA during August 2001 was to see my mother.

The previous time I had visited my mother in 1994, during the original Cathy crisis, I was in an obviously disturbed condition caused by contacting Cathy and enduring abuse. I brought her (my mother) over to the USA in 1997, and managed to maintain a facade of sanity. This time, I thought it wouldn't be a facade.

Cathy occasionally used to attempt to give a reason for her refusal to commit herself to me. On one of her excursions into the realm of reason, she said it was because she wanted kids, and I didn't. But what she was really doing was justifying her promiscuity, because whatever the reason for not having a monogamous full-time relationship with me, did not justify her actual behavior. She was effectively saying "We don't have the same needs in a monogamous relationship, so it's better if I sleep with someone else as well". It's amazing what crap women get away with, isn't it? A combination of good looks and an apparently serious manner goes a long way. And she's not even that good looking her power over me was political.

I stayed at John's. His flat had been mine before he inherited it, and it was still inscribed with reminders of my life before the breakdown of '94 and the escape to California.

A collection of seventies vinyl records, every book ever written about mountaineering and bike racing, the kitchen painted bright yellow: under the layers of grime was the life I had constructed with so much effort. Some of the cassette tapes on top of the fridge hadn't moved in seven years; when I picked one of them up, it left a white rectangular patch in the gray surface.

I visited my ex-girlfriend Anne and her boyfriend Connell. This reminded me that ex-girlfriends are not always ex-friends.

She was capable of finishing a relationship without hysterical allegations. Anne recommended I check out "Narrative Therapy", which led me to reading about the damaging effects of accepting a "pathologizing discourse" in place of a version of events which makes you feel good.

John went out to meet his beloved in Greece, leaving me in the flat for two weeks, just as the Cathylitic comedown started. I spent a lot of time doing nothing. I foolishly drank John's whiskey. I spent a lot of time on the computer writing the first draft of this story.

I forced myself to go to the Foundry and climb. I expected Cathy wouldn't be there, as she had a one-year-old, and they tend to get in the way when climbing. I contacted Tim, and climbed with him a few times.

It feels embarrassing. How can I have allowed a woman to overwrite my story? It feels humiliating, like someone is deliberately abusing their superior position to injure me. It feels creepy, in that I have completely lost control of my own words. She makes me say things I don't mean, and not say things I do mean. I feel like I'm choking, unable to say what I really want to say. It hurts my ego to be told I'm too stupid to see obvious things. It feels shameful to admit that I allowed her to poison me against my friends and isolate me from my community, and that I was too cowardly to break off the relationship, and tell her and everyone she knows what a cunt she is.

I always thought there was more to her than there really is. Somehow, if I could only get through... When she threatened to cut off all contact with me, it made me feel powerless, because I couldn't reciprocate by cutting off contact with her, because I really saw her as a 'person'. In typically Alice-in-Wonderland fashion, this is what she accused me of not doing, not respecting her as a person. Somehow, I couldn't treat her with contempt, and I felt like that is what she was doing to me. Though I did cut her off for several years, I didn't really mean it. Though I have only spoken to her once since 1995, I have spoken to her in my mind a thousand times.

The only possibility of good feelings about her would be revisiting sexual experiences with her in my mind. Unfortunately, the net result of these experiences were to undermine my ability to have other relationships. It's not so much that no-one else can be as good, as that if they are any good, they remind me of Cathy. It's almost as if I've associated being turned on with being abused.

I visited Tim's flat in the revamped city council-owned housing estate known as Nether Edge. I spend about half an hour explaining to Tim and Gretta what was bugging me. I had talked to Tim about the effects of Cathy when he still lived in Manchester in 1994, during my brief return to the UK in that year, after Cathy had killed our relationship via the transatlantic phone lines. The reason I talked to Tim was that he was a mutual friend of Cathy's and she had already talked to him, so it was 'OK' according to my agreement with Cathy. She persuaded me not to talk to anyone whom she had not already talked to. How pathetically loyal of me! Even after she accused me of sexual harassment, I wrote to her saying 'thanks for all you have done for me'. This is typical victim behavior. She didn't even want me to talk to Tim. She wanted to tell her story to a select few, and silence me completely. I should have told everybody. When I do talk to people, they see my point of view immediately. When I try to defend Cathy, they can see this is the behavior of a victim of abuse - identifying with the oppressor Stockholm Syndrome, I think it's called.

Narrative Therapy says that there are no truth statements about human beings one person's narrative is as good as another's (Michael White, 'Re-Authoring Lives') . Neither "Cathy's behavior was mostly to blame for what went wrong in Rod and Cathy's relationship", nor "Rod's behavior was mostly to blame for what went wrong in Cathy and Rod's relationship" can be determined to be true. Starting from a logical-empirical viewpoint, in relationships, it is in princinciple impossible to establish truth statements about human beings. No amount of empirical evidence could show that either of our points of view was right. This does not mean that neither of them was right - it means the opposite. So, Cathy's imposition of her standpoint, and the denial of mine, was a mindfuck. But if you cannot make truth statements about human beings, how, then, can Cathy be said to have 'imposed' a narrative on me? This is itself a statement about human beings, not a material statement, thus it cannot be said to be true or false. So why have I written a story complaining about it? Narrative Therapy's relativism is self-defeating. My story is not just one among others.



The Trip to the Moors

   Mon, April 30, 2007
For weeks, Cathy had promised us a weekend together. She said, in her breathless, sexy voice, "I can't wait". As the impossibility of my position, and my cowardly inability to break it off, drove me into a less and less rational state, I started putting pressure on her to declare her hand: him or me. This is usually a mistake. It happened that my ultimatum - "be mine exclusively or I'm moving abroad" - came on Valentine's Eve 1994, the weekend before we planned to go the moors together. She phoned me at work in Manchester, the day before we were supposed to go, to say
- She would not finish with the other guy
- I should move to America

She wondered if I was apprehensive about our trip, and wanted to call it off.

I realized straight away that it was she who was apprehensive, so I called her back in Sheffield to 'reassure' her. Months later, she told me that she carried a knife with her to the Peak District that weekend in case she had to defend herself against me. I was right. She was apprehensive!

Anyway, our outing to the moors went fine, apart from one incident. We had unseasonably dry, and relatively warm weather, and did some climbing. I shouldn't have asked her again if she would be monogamously mine while doing the crux (hardest) move on a particularly tricky climb. When she said "no", I fell, and if she hadn't been using a nearly foolproof belaying device called a 'gri-gri', she probably would have dropped me. I can't forget how she looked at me as I attached various rock climbing devices to her harness when it was her turn to 'lead' a climb. Her eyes and her body said "I love you", while her voice told me she didn't. Of course, I couldn't hear the words. 'Your body speaks so much louder than your voice...' (Elvis).

She came to the airport with me, and gave me a card. I opened it on the plane, and it read "Be seeing you soon, on this island or some other".

I took this to be a promise that our relationship would continue in some form, elsewhere. I wrote her a letter from San Francisco expressing love and describing some to the things I would like to try with her, and inviting her to come to San Francisco to watch the World Cup with me.

Her reaction was hysterical.

She called me to tell me that our relationship had been a nightmare, that it was over, that this would have been obvious if I'd listened, and that she would avoid me when I came back to England.

That was when the denial started. The only way I could avoid a complete breakdown was by pretending nothing was wrong. I rode my bike to Yosemite National Park. On the way, in various cafés and diners, I watched the O. J. Simpson saga on TV. I went rock climbing, rode back to San Francisco, and went to the World Cup on my own.

I tried contacting Cathy when I got back to Britain, and received nothing but abuse tempered with phrases like "I don't mean you any harm".

I behaved like a classic victim. She told me her side of the story, then said "I don't think it's the case that two people just didn't get on", in other words she thought it was not a case of six of one, and half-a-dozen of the other, It was all my fault. "If you want to insist that there are still loads of unresolved issues and so forth then I am not really interested". She was interested in resolving issues when it worked in her interest, imposing the narrative that said she was a victim of me, but she didn't want to hear, and didn't want anyone else to hear, my story. I didn't know how damaging this could be, yet it's hardly a novel idea. Her college degree was some variant of 'Victim Studies'.

I was so cuntstruck, I believed it. Instead of fighting back, I internalized the insanity that she dumped on me, and slid down the slippery slope from neurosis to psychosis. I treated women exactly the same way as Cathy had treated me, for example, using the phrase "I'm not a unified subject" to justify infidelity. The result of copying Cathy's behavior is that I am still regarded with disfavor by some of my former friends, yet she is universally liked. Do I detect a double standard here? I have nothing against morality. All moralities benefit some people's interests, and oppose other's. I just want a morality which benefits my interests.

I behaved irresponsibly, could only take and not give, and I lost most of my friends. I was the emotional equivalent of a violent lunatic. Does it mean I blame Cathy for things I said and did six thousand miles away after not speaking to her for months? Yes it does. In retrospect, I could say "I wish I hadn't done that", but retrospect was in short supply at the time. If Cathy had said "I'm sorry, our relationship is over. I wasn't able to give you what you need. Can we just be friends?", instead of "You scare me. You're lying. That's bullshit. I feel sucked dry. I didn't do anything to you. Stay away." etc., I would not have become psychotic during 1994, and someone in San Francisco would not hate me now.

The argument that someone can be responsible for someone else's behavior is well illustrated by recent news items. Who is responsible for terrorist attacks? The terrorists themselves are totally responsible for their actions, yet the leaders of Western countries are also responsible. Responsibility is not a zero-sum game.

This is an important moment in the deconstruction of her story and the reconstruction of mine. I did not become an abusive person because it's a fun thing to do. It was not because of unresolved complexes from my childhood. It was not caused by capitalism. It was caused by Cathy.

Cathy admits "I know I had power", yet fails to see that this has consequences for her responsibility.

Cathy said that if any of her partners didn't like it, they could go elsewhere. In other words, she took a libertarian position of pure freedom - we were consenting adults when it suited her, just as she used liberal victimology whenever expedient. My argument is that I was no more free in relation to Cathy than a penniless worker is in relation to a factory owner. A subtler version of this argument can be found in Lynn Chancer's 'Sadomasochism in Everyday Life'.

She argued that I should let her behave how she wanted without putting pressure on her because it was in the interests of the community we belonged to. When I used the same argument to try to persuade her to be my friend rather than my enemy, because it could have negative consequences for all of us, not just me, she said I was blackmailing her, and "a lot of women fall for that". She said she'd learned not to be so 'giving'. In short, she became even more of a cunt - which, incidentally, is evidence that she couldn't have been just a cunt before, since, as I argued above, you cannot be more of a cunt than just a cunt. Still, as Cathy showed, you can have a damn good try!

How Cathy argued that she was my victim was that she felt 'sucked dry' by all the strain of 'looking after' me. She encouraged me to call her nearly every day from Manchester during our 'relationship', then blamed me for calling her too much. When we met, she treated me as if I were a patient, and she was giving me some medicine. I didn't complain about the treatment, but I wish I'd been told about the side-effects. She turned me into an invalid, then when I behaved like one, kept saying "You're not an invalid". She imposed a 'pathologizing discourse' on me, to use the language of poststructuralist psychoanalysis. A deeper explanation of this can be found in 'Re-Authoring Lives'.

One of the ways in which the affair with Cathy contributed to my mental downfall was that it made me avoid climbing, indoors and out, parties, and the rest of the social scene on which I had come to depend, and now needed more than ever. I said it was because I was depressed, and had to avoid crowds. Cathy said it was because I couldn't stand seeing her other boyfriend. There was some truth in both stories. I couldn't go to my friend and confidante Andrea's birthday party, though neither Cathy nor anyone she knew would be there. But it is also true that I couldn't stand seeing her anywhere near another man, especially not now I knew she'd slept with half the climbers in Sheffield. I don't know if it's like this for everyone, but for me, this has always been an inevitable corollary of being in love. When I arrived at the climbing gym and found Cathy climbing with someone else, I couldn't stand the way she smiled at him as he checked the way the rope was tied to her harness - it looked too familiar. Having spelt it out like this, I can see how ridiculous my position was. If I couldn't stand the heat, I should have gotten out of the kitchen. Or rather, I should have gotten back into the kitchen, but helped myself from a different pot, not one in which everyone else had already dipped their fingers.

But given this admitted male weakness, the rules should be adjusted to take account of our handicap. I believe a woman should only be allowed to look at one man the way Cathy looked at everyone. Most human societies take account of this, but we Western liberals are so egalitarian, we consider it 'sexist' to discriminate against women like this.

When my best mate John got married, I decided to avoid the wedding, and let Cathy go with the other guy, Dave. To her credit, Cathy offered not to go.

That weekend, I was on my own in my rented flat in a converted Victorian house on Rushmore Road, Manchester, while most of my friends were having fun in Sheffield, not knowing why I wasn't there. In the road outside, crowds of drunken students mingled with football supporters. I was so depressed, I didn't even notice that it was a rare home defeat for Manchester United: normally a cause for celebration for all right-thinking people. That's how depressed I was!

I moved out of my flat, and got on the train for Sheffield. I got to John's, who as usual forgot to tell me that Cathy had called. She called again, and decided she couldn't see me that day. She had to go and see Dave, who was in 'a right two-by-eight' because of something Andrea had said to him at the wedding. Cathy was similarly upset by Andrea's behavior, and asked me "how can you have such a freak for a confidante?". She was particularly disturbed that I had told Andrea about her sex life. I thought this was a bit presumptuous, and felt like telling everybody about it, though I was not brave enough to tell Cathy how I felt. I simply said that Andrea was a good friend, and I didn't know what Cathy was talking about. I still don't, to this day. Cathy is good at making verbal assaults on people without saying what her allegations actually are, let alone providing evidence for them. The only details I got out of Andrea were that she laughed at Dave for being boring - her comment to me about him was "I don't know what she sees in him".

Cathy was still annoyed with me about my frantic Friday phone call, and said "I just can't take any more". It became obvious that I wasn't going to see much of her that week, as I had hoped and planned, because she had to 'look after' Dave. She saw herself as a kind of mother hen - she really believed she was helping whom she was two-timing.

The following weekend, 26-27 February 1994, the weekend before the Monday when I left for America, was pretty good. I persuaded Cathy to come over to John's instead of me going to hers. John wasn't there. As well as various activities involving, among other things, ice cream, which I won't bore you with, she cooked up a curry, from a recipe she'd learned in Pakistan. It wasn't as hot as she was. She isn't very good at cooking. As far as I remember, the only things she is any good at are sex and turning people against each other. The desert was better than the main course. She'd been married once, to a Pakistani, and used to talk about him a lot. She'd left him after they returned to the USA, but she still seemed to love him.

"I don't know why I'm such a bitch, maybe it's because I was once happily married, and nothing can compare with that", she once said, attempting to justify her destructive two-timing lifestyle. If it was so good, why did she leave it?

"I don't know... mumble mumble" was all the answer I got. She mumbles a lot. It's a bad habit - it gives the impression of dishonesty. It occurred to me that, if she had stayed in Pakistan, she would not have been allowed to leave her husband, and this would have been better for all concerned, including herself.



Sexual Morality

   Tue, May 8, 2007
In most societies, men and women are not expected to follow the same moral code. If a man manages to have two girlfriends, or up to four wives, he's a 'bit of a lad'. If a woman plays the same game, she's called a slut. Men and women should be subject to the same morals, shouldn't they? Aren't these double standards a legacy of feudalism, and shouldn't they be dispensed with now we have entered the twenty-first century? I don't think so.

Animals are driven by their genes. Male and female primates' genes have different interests. A male can father hundreds of children, a female perhaps a dozen or so. The genes in a male (and not just male genes) therefore say

"Have as many female primates (of your own species) as you can, and don't waste time caring for the offspring. For every one you look after, you could have fathered ten, and even if half of these die of neglect, you still have a five to one advantage over someone who looks after their children".

Females, on the other hand, must treat each child like it really matters - their genes tell them to care for these few, precious offspring. Given that human males do not behave like our primate genes tell us to, how did this transition occur? Why do men care for their children at all? The theory is that female primates, our immediate ancestors, must have 'tamed' the males. They could hardly have used physical force. They could only have used the one weapon they had: the withdrawal of sex. This required willpower. These female primates made the leap from animals to humans by inventing sexual morality, of which the incest taboo is the most obvious and primary consequence. Strictly speaking, it is not morality, because it is so deep-rooted, we don't need a law telling us to avoid sex with close relatives. I would argue that the same is true of human female sexual self-control - they really do have more self-control ab ovo - or, to put it another way, need less self-control. Therefore, they should be expected to show more responsibility.

A woman, in a situation where women are a minority, taking advantage of male weakness, is acting immorally, and should be subject to greater sanctions than a man acting in the same way in a similar situation. This may sound like a self-serving argument, but this observation has no bearing on its correctness or otherwise. All moral arguments serve the interests of one party at the expense of another, so this is no objection. The difference between my morality and the dominant one is that I am being up-front about whose interests my morality serves.

My argument is simplistic, and of course, offensive. I hope it doesn't put you off reading of more subtle thinkers such as Friedrich Nietzsche, Chris Knight and Lynn Chancer (see previous blog entries).



Groupie

   Tue, May 8, 2007
I can't remember how I first heard Cathy was from San Francisco. I didn't even know she was American 'til someone told me. She didn't have an abrasive accent, but a quiet, breathless voice. I first went to San Francisco in 1991 and loved it. I made friends on my first rock climbing trip to Yosemite National Park, so when I heard that a girl I'd already met rock climbing in Sheffield was from San Francisco, I inevitably asked her about it. It was early December 1993 in the Foundry indoor climbing gym. By coincidence, she happened to be going home that month, and I'd booked a ticket for my second visit to California. She was much more forward than I was when we met in San Francisco.

She suggested going to Yosemite. In the middle of winter? Obviously she wasn't thinking of climbing. She mumbled "You/we could book a room". I'd never heard anyone ambiguate a pronoun before. Despite this hint, I was slow on the uptake. The problem was already apparent. She wanted a quick fling, I needed a long-term relationship.

That is why I say she exploited me - what is exploitation other than taking advantage of another person's need for your satisfaction at their expense?

She was up-front about her sex life. She had at least one regular partner, and had slept with "quite a few" of the men in the rock climbing circuit. Any sensible man would have just given her one and forgotten about it. But not me! Her apparent honesty and the cool way she listed her sexual successes made her even more attractive - her market value in my eyes went through the roof. I was looking up at her, when I should have been looking down (see Lynn Chancer's book, 'Sadomasochism in Everyday Life', Rutgers University Press, 1992).

She described herself as a "groupie" in the rock climbing circuit. The exception was that she also had a steady boyfriend - whom she described as a "friend" - who was desperate enough to put up with her infidelity.

I should have recoiled in disgust. I had as little willpower as Odysseus sailing past the sirens, and because Cathy bound me to a vow of silence, I had no shipmates to tie me to the mast.

So when I got back to Manchester, and she got back to Sheffield, instead of playing it cool, I set sail for the rocks. The result of trying to have a relationship that felt wrong was to make me gradually more depressed and irrational, and even less able to analyze and escape.

Worse still, she made me promise not to talk about it to anyone I know. I should immediately add that at one point, she asked me if she could discuss our dysfunctional affair with a friend, and I said 'no'. I've no idea why I said that. For most of the time it was her insistence that I don't talk about it because it would hurt her reputation that isolated me from the only people who could help me. I internalized this paranoia of hers so completely that I have been unable to talk about it to this day. Again, though, in the interests of full disclosure, I should admit to another reason why I didn't want to talk about it to mutual friends - embarrassment.

I could have written to an agony aunt:

Me: "Dear Agony Aunt, I'm screwing this girl who's got another boyfriend, and I'm too chicken to break it off. What should I do?"

Agony Aunt: "Dear Dickferbrains..."

I didn't want to admit it. But I wish I had, because just saying it would have led to someone advising me to pull the plug.

The rule was not to talk to mutual friends, whom Cathy thought were all against her, and would call her a 'slut' if they knew. 'Tart', 'scrubber'... these words aren't used in the liberal environment of English rock climbing.

I did talk to Andrea, because she didn't know Cathy. Andrea is similar to Cathy, the same age, opinions, rock climbing ability and attractiveness. She gave me good advice, which I ignored. When Cathy met Andrea, it was handbags at five paces. "Don't let me poison you against her" said Cathy, as she tried to poison me against her. To my shame, it worked.

I internalized Cathy's narrative. She created a story where, instead of me being the victim, she was. I became a bad person. "I've been badly treated". "You scare me".

I didn't like going to her apartment - it felt like being in a brothel. This is obviously bad faith on my part, since it didn't make any difference to the reality of my awful position whether I slept with her in her bed or mine. It just felt better at John's, where I kept a futon in the front room.

There were two other reasons why I preferred 'my' place (actually John's). One was it was a better flat in a nicer neighborhood than Cathy's Nether Edge gaff. The other was that John's reminded me of my former self, before I met Cathy and started losing my mind. I painted the place yellow, lived there for years with a girlfriend, filled the bookshelves and the cupboards in the kitchen, and the basement of this converted yellow stone Victorian house was full of papers and clothes, old bikes, football magazines, and numerous other confirmations that I was once a sane human being. It took me thirty years to achieve that status - Cathy destroyed it in three months. At Cathy's apartment, I was hungry, and it was her world. She could construct reality and use pillow talk to divide me from my friends and from my self.

She only visited me twice in Manchester. The first time was wonderful, because I was totally in denial, though I would not have used an Americanism to describe it at the time. I was pretending to be her one-and-only. She said "I've got to tell you something", knowing I was pretending nothing was wrong, but I replied "Can't I have just one good night?". I traveled to Sheffield the following weekend, and we went to a pub in the post-industrial wasteland - the only non-smoking pub in England, to my knowledge. I didn't start smoking until after that traumatic weekend. Cathy kept hinting that she had something to tell me, something about her "friends". I finally insisted on her telling me what she was on about, just before we went to sleep. She reminded me about Dave, and all thought of sleep was banished. I went rapidly downhill from that moment on.

I don't know how I kept my job after that. I couldn't have been writing very good software, my speech was slurred, I was almost in tears whenever I tried to explain what was wrong, and I went out for a cigarette every fifteen minutes. At the same time, I managed to independently discover the most important pattern in software development, Model-View-Controller.



Oppression and Exploitation

   Wed, May 9, 2007
"I know it's messy, but..." she would say to justify continuing what she quaintly called a 'love triangle', in which she held all the cards. "You don't understand my relationship with Dave", she said, like it was some subtle, complicated problem which I couldn't quite grasp. I understand it now - it's exploitation.

In general, 'exploitation' is a more useful term than 'oppression', because it can be measured. If someone employs you, they are probably exploiting you - your work produces more than your salary.

It's not just one's body - it's voice, experience, cunning, and so on. We normally regard someone who uses their property to take advantage of someone else as an exploiter. But suppose that property is the person themself. We do not regard using control over access to oneself to take advantage of someone else as exploitation, no matter how damaging it may be to the other person. I would question this nice distinction between self, attributes of self, and private property.

Cathy used her voice as a weapon to impose a destructive narrative on my life. Mostly she did it using the American woman's favorite medium, the telephone. (There used to be three major forms of communication - telephone, television and tell-a-woman. Now there's the world wide web).

The problem is not longing for Cathy. The damage continued long after I'd ceased to have any desire for her.

I wouldn't call Cathy's behavior toward me 'homicidal'. It is more akin to someone drinking heavily, then driving fast. It may cause death or injury, but is not quite attempted murder. 'Attempted manslaughter' is an oxymoron, so I just call it 'violence'.

I will explain why by comparing its effects with the most violent physical incident I have yet experienced. I was riding my bike along a canal towpath in Manchester when five youths aged around sixteen tried to steal it. One of them knocked me off my bike by kicking me just below the pelvis on my left leg. I'd like to say I fought them off, but actually, I just started shouting, drawing attention to myself. It was broad daylight, several people came to my assistance, and the felonious quintet fucked off, as I had requested. Adrenalin enabled me to ride my bike for another five minutes. Then I fell off, and was unable to walk for another three days. In the hospital, they found a mysterious razor cut right on my hip bone. They sewed it up, but I still can't run far nor play football. But it didn't affect me psychologically at all. I chatted up the nurse putting in the stitches, and made a joke with the policemen interviewing me an hour after the incident. I would consider this attack a minor one in comparison to what Cathy did to me, a mental assault which has caused a hundred times as much pain as the attempted robbery. But instead of hating Cathy for what she did to me, I saw her point of view. Exactly contrary to her claim that I didn't 'respect her as a subject', that's just what I did.

Men make all kinds of concessions to women to get laid. Having a little bit more willpower, women have a tremendous advantage. A woman looks at a man as a man looks at a dog. By pretending to take women seriously, we ended up really doing so. When you tell a lie consistently, you start believing it and living it. The domesticated male psyche of modern Western societies is the payback for the dishonesty involved in treating women as equals.

I have never been completely domesticated. I have never liked seeing men look after children as much as women do. A friend of mine went nuts trying to be an 'active parent' who bores everyone to tears talking about how wonderful his brats are. His wife is just as much a self-righteous feminist hypocrite as if he'd left the kids in her hands rather than trying to do a full-time job and be a house-slave at the same time.

It would be more effective in gaining the respect of women to be less egalitarian. This cannot be done on an individual basis, since men are too spineless to stick together. Something which imposes a collective discipline is required. The connection between this insight and an end to the current crusade in the Middle East is too obvious to spell out.



Round the World

   Thu, May 10, 2007
In 2003, I traveled 'round the world.

I met John and his wife in Greece. Later, in Sheffield, it turned out that she doesn't like me. I have known John for 25 years, but he turned on a dime against me when his bitch took umbrage at something I'd done or said that she 'felt' bad about. He is even more of a doormat than the old me which I describe in such agonizing detail in this story. But that was then. This is now. After my experiences with Cathy, and the rest of the narrative described in previous entries, the reader can probably see that I don't take his bitch's feelings as seriously as John does. There was one concrete aspect to her complaint against me. I accidentally broke a soap dish in their house in Greece and didn't apologize. But most of her complaints concerned my attitude towards her. I asked her if there was anything I could do about it, but she could think of nothing to say except a stream of emotions, like I give a fuck. I was only asking hypothetically. I wouldn't do anything to placate her, even if I could.

Well, fuck her. More to the point is John's approach to me. He sent me an email saying "I'm a bit concerned about your behavior. I hope you don't go all over the UK annoying people". Nobody talks to me like that. If he'd said "My old lady is under the impression that you've transgressed one or two unwritten rules, old chap - now is there anything in it? Forgive this impertinence if there ain't" or something like that, it might have been a different story. But as it was, I was so annoyed I didn't want to stay at my old flat. It had been completely done up and repainted, was no longer bright yellow, and didn't feel the same. John had wiped out the last traces of the home that Cathy had trampled. He didn't seem very friendly either, especially when his bitch was around.

There are two positive aspects to the soap dish incident. One is that thing about "finding out who your friends are". Not having a place to stay in Sheffield for the first time ever, I was in the unwonted position of having to couch-surf with people I'd not seen much for ten years. Everyone I stayed with commented on how welcome I was, took me out to nightclubs etc., and invited me to stay again. I helped fix their computers. I was even good at looking after their kids. So John's fears that I would make myself unwelcome were unfounded. Thank God for that! I was really worried for a moment there.

Since then, I've made several visits to John's, and I've made a point of being nice to wotsername. Insincere pleasantries show more contempt than hostility.

The other positive outcome is that I now know I know the right approach to a mad cow. I conclude with some examples.

I'd known Chelsea for five years. I originally met her in an airport checking line. When we got on the plane, I asked other people to move so I could sit next to her. I've never done that before nor since. The Devil planted habanero peppers in his garden when he founded Hell. Chelsea is the hottest of these hot peppers.

We met as friends many times over the next five years. She suffers from Huntington's Disease, a degenerative genetic illness which causes dizziness, insomnia, memory loss, lack of coordination, alcoholism and death. It has one other symptom which I found out about. In 2003, prior to my geo-circumnavigational adventure, she told me her marriage was falling apart. She was in a pretty bad state. She'd lost weight, and she is one of those women who need to put it on. When I came back, I contacted her again. I was dreading the state she might be in. When she seemed to be much better, I was over the moon. Apparently, marriage was more of a problem than Huntington's. Her divorce also benefited me. To my surprise, she took an interest in me for the first time. I had been so lonely for so long, it went to my head.

It was only a few days later, when I introduced her to three of my friends in a Vietnamese restaurant on Fourth Avenue, I realized something was wrong. She blatantly flirted with all of them. I went back to her house, she gave me a massage, and we went out for sushi on Clement Street. She said we would spend the rest of the night alone together. Then she got a phone call, and said a guy was going to come round to see her. I asked why, and she said "because he's heard I'm pretty". I know I'm going to laugh about this some day, but that is not how I reacted then. She went into the bathroom, so I couldn't see nor hear her. I picked up my bag, and ran out of the house. I ran around the corner, so there was no chance of her being able to call me back.

Dickferbrains had become Odysseus. I didn't call her for a month, though she left me one mobile phone message, which I have kept as a souvenir. It said "He's gone - you can come home now". This shows how out of touch she is with reality. If you google for "Huntington's sexual promiscuity" you can see what's happening, but I am the last person who can be understanding about this. I said I was stronger than Odysseus, but this time, I did have shipmates - Raul and another friend, As`ad, who both told me exactly what not to do. Don't call. Don't write. Don't email. But it was me who pulled myself together enough to step back from the brink. I jumped in a taxi, and traveled to the Castro, the famous gay district of San Francisco. It's not what you think, though this story does bear some resemblance to Frank Zappa's song, 'Broken Hearts Are For Assholes'. After meeting Raul and my other friends, Chelsea had exhibited the same concerns as Cathy. She telepathically knew what Raul had said about her to me. Many women want to eat their cake and have it too - to preserve their reputations while sleeping around. They want the advantages of equality with the benefits of chivalry.

I do want to go to Chelsea, but I won't. I think there might be an element of hell having no fury in her reaction to my unwonted self-discipline, but considering her, and my, condition, things have turned out well. She recently sent me an erotic novel she wrote, which I'm editing. She can always be in my story, but I'll never be in hers.

I recently had the opportunity to put my belated rejection of female manipulation into practice. I rent two rooms in my house. I had a male and a female housemate. The female of the two accused the other of sexual harrassment. There was not a shred of evidence. She tried to play the 'oppressed woman' card. He's still here. She's not.



The soap dish incident continued

   Wed, October 1, 2008

Years after the soap dish incident in Greece, I received a strange email from John's ex. Here it is:

-------------------

Dear friends,

I was attacked and hit by John on November 2007 at the climbing gym in Sheffield as many of you know. I had been in a relationship with John for many years. His physical assault on me was the outcome of sustained emotional abuse and devaluing of me as a person in that relationship.

However I never reported that incident to the police since it would be a waste of time. I’ve been part of the the rock climbing milieu in Britain for 15 years. And I am very grateful that many of you have been supporting me uniquely since that incident. I believe in assault John committed against to me has also clearly demonstrated male violence against women in the climbing circle. That is why it was right to exclude him from our social environments.

I have heard recently that some people are re-introducing him to our social events as if he has done nothing wrong and nothing happened, for example the recent gathering at Nether Edge.

I am excluded from social and climbing events if he is there. I am really sorry to say that those people taking part and inviting John to events are also supporting the violence against me and against women generally. I find myself asking why these people are so ready to embrace the abuser, but not to support the survivor of the abuse? Is it because I am a foreigner? If it had happened to another person in this social circle would it be so easily tolerated?

It means for me those people are punishing me emotionally as John did physically and ruining my social life. Despite the continued support for John from those who appear to condone his actions, I refuse to be made to disappear.

Those people who shake his hands must remember that the same hand hit me brutally a short time ago. We all have a responsibility in this matter. It may happen again.

In solidarity, X

----------------------

The daft cow thinks I might sympathize with her!

 

Next
Back