The Slash-Dot Problem
[I wrote the below in May 2003 in a 4 part series. I ran across it today and thought I would repost it. Dynamic languages are the future...
]
The Slash-Dot Problem: Once I put the kids to bed, I am going to tell you about this problem and how to solve it in Smalltalk…
The Slash-Dot problem: So what is the hell am I talking about? Is someone from Microsoft about to make another statement opposing open source? Nope. This problem is all about the programming models that people use to access data — specifically data stored in an XML document or an instance of a class.
There are variety of different ways to access XML data programmatically. It depends on the platform, but typically you can get SAX, DOM, XPATH, and, if you are lucky, streaming APIs to manipulate XML data. The .Net Framework offers most of these APIs — and one more — XML Serialization. Although it may not seem like it, Serialization is just another way of accessing XML data — albeit indirectly. Once you deserialize an XML document into an instance of a class, you can use the pre-defined properties and fields on the class to get at the data. In short, instead of writing XmlReader.ReadElementString you can write Person.Name. This is what I call the Dot problem (I like to go in reverse order) — sometimes you just want to get . (dot — a member access) over Xml.
When I wrote my RSS consumer in Smalltalk, I had limited options as to how to access the individual RSS feeds. The Smalltalk variant that I am using has a limited number of XML APIs (SAX and DOM). While there is a serialization engine, it is similar to the Runtime.Serialization support in .Net Framework, which didn’t help for this task. I considered writing an XML Serialization engine — but that was off goal — so I decided against. In the end, I simply decided to have the RssFeed class expose a ctor that took an XmlElement. This enabled me to access the RSS feed data by calling methods on the RssFeed instance — which in turn retrieved the data from the XmlElement. I wasn’t happy with this solution, but it prevented a bunch of DOM API calls all over my code.
This Friday I thought up a way to get dots over Xml — without writing a serialization engine. Before I get it to how it is implemented, check out the below code (it will help when I explain this):
| dboxRss item |
dboxRss:= XMLDOMParser parseDocumentFrom: (HTTPClient httpGet: 'http://www.gotdotnet.com/team/dbox/rssex.aspx').
item:=dboxRss rss channel item at: 1.
Transcript show: item title.
Transcript cr.
Transcript show: item description.
If you are not familiar with Smalltalk — this is a great time to learn. First, everything in Smalltalk is an Object. Everything — including classes. Second, objects communicate with each other using messages. One object (the sender) sends a message to another object (the receiver). When the receiver gets the message it looks for a method that can process the message — if such a method exists the message is processed and a return result is send to the sender. I am really simplifing this process alot but that is generally what happens. In someways this is similar to the way that Web services work — client sends SOAP message (Smalltalk even has something like soap:action) to server, server looks at action (or message content) and decides how to process, server may process message and send back result.
Let’s walk the code. The first line is just how you declare local variables. Note that there is no type given. The second line of code is where we go out to Don Box’s blog and get his RSS feed and then load it into an XmlDocument (part of the Smalltalk DOM API). Note the wonderful syntax — I love how clean Smalltalk is. When this line of code completes, the local variable dboxRss points to an instance of XmlDocument. So far, no big deal — any platform with a DOM API can do this. The magic starts happening on line three. Look at it again. Notice anything? There are absolutely no DOM API calls to get at the XML data, rather we are accessing the XML via the element names found in the instance document. In short, we have our dots over XML — without a serialization engine.
This post is getting long, so I will explain how this works in another and then talk about the Slash problem. In the meantime, I’ll give you a hint about the implementation. Suppose that you were writing a Web service that performed some action when it was sent a SOAP message it recognized. Suppose that the service received a SOAP message it didn’t recognize, what should it do?
The Slash-Dot problem II: So how do you get “dots over XML” in Smalltalk? Recall that I stated in the previous post that Smalltalk is message-based. Objects communicate to each other using messages (BTW, this should make it clear that being message-based does not mean that you can’t be OO too — this is a common misconception that I see in the Web services world). When an object receives a message it looks for a method that can process it (it looks at the message’s “action” — called a selector in Smalltalk). So what happens if an object receives a message it doesn’t understand? Let’s code at the code again:
item := dboxRss rss channel item at:1.
dboxRss points to an instance of an XMLDocument. There is no method on XMLDocument that can process the rss message. So the runtime walks the inheritance hierarchy of XMLDocument looking for a method that can handle it. Once it gets to the top of the chain (Object), if it still cannot find a method, the doesNotUnderstand: message is sent to receiver with the original message as an argument. This behavior is exactly what allows “dots over XML”. It provides a hook at I can use to do some exploring in the XMLDocument instance.
All I had to do was override the doesNotUnderstand: method and in this implementation fish around the XMLDocument to find the requested element (not too hard since there is only one document element). In addition, I overrode the doesNotUnderstand: method on XMLElement to give me the same behavior — although it is more complex since it needs to return the value if their are no child elements and also search attributes. Below is the code for XMLDocument (bear in mind that it has been 6 years since I used Smalltalk professionally):
XMLDocument doesNotUnderstand: aMessage
"looks for a document element with the message selector name"
| documentElement |
documentElement : = self elements at: 1.
documentElement
ifNotNil: [ documentElement tag = aMessage selector
ifFalse: [super doesNotUnderstand: aMessage]]
ifTrue: [^ documentElement]
This is all you need for the XMLDocument. The code for the XmlElement is below:
XMLElement doesNotUnderstand: aMessage
"inspects the instance to determine if there is an child element or attribute containing the message selector"
| itemElements |
itemElements := OrderedCollection new.
"get all the elements with this name"
self
tagsNamed: aMessage selector
do: [:each | itemElements add: each].
"if there are no such elements, look for an attribute, otherwise bail"
itemElements size = 0
ifTrue: [^ self attributeAt: aMessage selector asString
ifAbsent: [super doesNotUnderstand: aMessage]].
"if this is a repeating element, return the collection"
itemElements size > 1
ifTrue: [^ itemElements].
"if there is only one such element, decide if it has children, if so return it, otherwise return the element string"
(itemElements at: 1) elements size > 0
ifTrue: [^ itemElements at: 1].
^ (itemElements at: 1) contentString
That concludes the Dot portion of the program. I'll post the fileouts for anyone who is using Squeak sometime today -- although you can just copy, paste, and accept the above. Stay tuned for our next installment -- the Slash problem
The Slash-Dot Problem III: Now that we have talked about the "dots over XML", what this heck is the slash thing? Think back to my first post on this topic when I talked about the different types of programming models over XML. Which one of these involves slashes? XPATH, of course. Now programming against XML using XPATH is nothing new -- but suppose that you were interested in using the XPATH model over more than just XML data? What if you wanted XPATH to be the primary way that you accessed data regardless of the source? What if you wanted to "slash over Objects"? That's right -- XPATH over objects. Let's take a look at the below code to see what I am talking about.
|person|
person := Person new.
person name: 'Don Box'.
person age: 'timeless'.
person address: Address new initialize.
Transcript show: (person select: 'name/').
Transcript cr.
Transcript show: (person select: 'address/state').
Transcript cr.
Transcript show: (person select: 'age/').
In the .Net Fx, you can already use the ObjectXPathNavigator sample to get this behavior, but my Rss Consumer is written in Smalltalk. How can I get this to work? Furthermore, since the Smalltalk variant that I am using does not have an XPATH implementation, how the heck can I get above to work over objects and over XML (since I want a XPATH to be the universal data access mechanism)? Stay tuned...
On (Ancient) Religions
I had planned on reading the entire The Baroque Cycle this week.
Judging from my notes in the book, I got through about 80% of Quicksilver (The Baroque Cycle, Vol. 1) the first time I attempted to read it.
I don’t recall why I didn’t finish, but I have a good idea — I have book attention deficit.
While I am still making progress on Quicksilver, I read three different books on Greek and Jewish religion this past week:
- Dionysos
: Good survey of Dionysos over the centuries, inclusive of Nietzsche, but it was a little preachy at the end around the potential of the Dionysiac to help with modern consumerism.
- Ancient Greek Religion
: Really enjoyed this overview of the Greek religion (largely from the point of a view of an Athenian). Hit the main mystery-cults I was aware of in reasonable detail.
- The Gnostic Gospels of Jesus
: I have read this before if memory serves (during the development of “Indigo“). The Gospel of Thomas is still my favorite (reminds me of a proto-Jefferson Bible).
Was there anything that bound these books together for me (beyond the obvious category of religion)?
Yes.
It is ignorance that is the cause of our downfall and suffering.
Religions can be (but often are not) a tool to address this ignorance; to remind us of our interconnectedness and reliance on nature/each other.
Nevertheless, religion is often used to separate.
Science fairs no better in this respect, should you think it is the “one true path”.
Science (actually Scientism) often dismisses the utility of ritual, myth, and religion in mediating the relationship of the individual to the greater whole.
That all said, one of these days, I am going to complete the The Baroque Cycle.
On Nietzsche
I am often asked what work of Nietzsche’s is the best place to “start”.
I have tried various recommendations, all of which have failed to ignite the level of understanding and interest that I believe this author is due.
I am going to try a new approach moving forward and I thought I would share it here as well.
In short, buy On Nietzsche (Wadsworth Philosophers Series).
It is 88 pages long. It costs ~$16.00.
It contains the best summary I have read of Nietzsche’s views on key philosophical concepts.
It is simple, it is fast and you will come away understanding Nietzsche’s philosopy in enough detail to 1) decide if you want to read further 2) have a somewhat educated opinion on his views.
Live, Love, Learn, Create
When you are a parent, defining the set of values to which your children will adhere is your greatest responsibility beyond keeping them safe.
It is something that I take very seriously and not something I have chosen to “outsource” to some existing religious or ethical system.
I have studied and/or practiced most of the major religions and ethical systems.
I find them mostly wanting for my children (and myself).
Above all things, I want my child to understand that they are the “value creator”.
If anyone has the power or authority to create what is “good” and “evil” it is them.
If you hear Nietzsche, you are more than correct.
I have yet to meet someone or a system with a monopoly on the truth, much less systems formed before the advent of the science (not that science is without flaws).
Most of my personal struggles have been brought about by me trying to break out of chains (of truth, no less) imposed by other men and society.
As Blake says: “I must Create a System, or be enslav’d by another Man’s”.
I still continue this struggle daily and my greatest desire is that my children do not repeat my struggles and failures (I will fail).
The challenge is how to create a meta-system that forms a mutable foundation in which they can develop their own “value creation” muscles.
I have given them a set of “starter” axioms that form a motto that we repeat from time to time: Live, Love, Learn, Create.
You may think that this is close to the philosophia perennis (”perennial philosophy”) and therefore influenced by most of the systems that I disparage.
I can offer no other, for we are all creatures of our context.
That said, the key value is creation, particularly the creation of the unexpected, born of both Apollo and Dionysus, transforming what is old into the new.
TechEd 2010 & Facebook Insights OData Service
At the NOLA airport preparing to move on to the next leg of the OData Roadshow after TechEd North Amercia 2010.

I enjoyed the conference, particularly doing the keynote with Bob Muglia and the “Open Data for the Open Web” session with Jonathan Carter.
One of the things that we announced in our session was some work that we have been doing with Facebook: the Insights OData Service.
Facebook Insights provides FB application developers and page authors access to a wealth of information about how FB users interact with their applications and pages.
We started working with Facebook just before F8 on an implementation that would bring this dataset into the OData ecosystem.
Our primary goal is to make this information accessible in a first class way within Microsoft’s BI tools, like Excel.
TechEd seemed like a good place to talk about our progress to date.
The service is still in “preview” mode, as we are still adding features and we are likely to change the URL, etc.
Nevertheless, if you have a Facebook application or page, I encourage you to check it out.
On Alan Kay
In 2000 (if memory serves), I had the privilege of watching Alan Kay present at Microsoft Research.
As a Smalltalker, I had a tremendous amount of respect for his work, but I was completely blown away by him and his presentation (all done in Squeak).
He chastised us (Microsoft and the industry) for all the unfulfilled promise that he had outlined years before. We deserved it.
Alan turned 70 on May 17.
His friends and co-workers (including Gordon Bell, Chuck Thacker, and Butler Lampson) have written him a book.
It is available online (donations welecome) at http://vpri.org/pov/
It is worth reading.
We still have a lot of work to do.
#fail at Google #io2010
Broadly, I don’t like to make negative statements about organizations or people. In my experience, most organizations and people are well-intentioned, but simply prone to mistakes and errors in judgement. Further, I may be the one making the mistake or error. That said, if I have a particular bad experience, it is often good for me to write about it to get the foul taste out of my mouth and _hopefully_ someone responsible can read about it and fix it.
Once upon a time a developer went to a conference called Google I/O.
The first day was great, lots for conversations with smart folks.
On the second day, the developer realized that they forgot their badge at home during the 40 minute drive to the conference.
Not to worry or turn around, the developer thought. Just like all the conferences the developer had attended before, with proper ID they will surely let him in.
Arriving at the event, the developer walked to the help desk.
Developer: “Please help. I left my badge at home and I need a new one.”
Google: “Sorry, we cannot help you, our systems do not support printing two badges.”
The developer asked for someone else, and then someone else and then someone else. Finally, the developer got to someone that seemed like they could make something happen.
Developer: “Who do you need to hear from in order to let me in the conference? If you got an email from [unnamed Google executive] would that do it?”
Google: “You can do whatever you like, we won’t help you.”
The developer was somewhat upset at this point. Not only did the “system limitation” make no technical sense, but Google seemed to forget that the developer spent money to attend the conference, that the developer likely talked to lots of other developers; they seemed to forget that customers, particularly developers matter.
The developer knew some Google folks at the I/O, so he sent some email and made a call.
The developer got a response quickly. This Google employee was helpful (you know who you are) and told the developer what might work to get him in the conference without driving for another 80 minutes.
The developer went back in the conference with this new information. The developer talked to one person and then another and then another — finally to reach someone that really worked for Google and had the authority to make something happen.
Developer: “I talked to [unnamed, but helpful Google employee]. They told me if I showed you my confirmation letter, you may be able to let me in the conference.”
Google: “Nope. He should know better. I am going to call him.”
Google goes off to call unnamed (but helpful) Google employee. Google can’t get in touch with unnamed (but helpful) employee, comes back and says “Left him a voice mail, but I can’t print you a badge.”
Developer: “Why not?”
Google: “Our systems cannot print out two badges.”
Developer: “Ok. Write my name on a piece of paper and put it in the holder.”
Google: “No.”
Developer: “So, I need to drive back to Silicon Valley? Really?”
Google: “I have sent people back to Holland for forgetting their badges.”
The above line was said with pride. Really. Now, the developer suspected that it was said with the sort of pride one feels when they are trying to show their power in a conversation, not with the pride of being malicious toward someone intentionally, but that is a nuance thing.
Developer: “What if [unnamed Google executive] forgot their badge?”
Google: “[unnamed Google executive] would not forget their badge.”
The developer loved this response. Google was basically calling him an idiot, which clearly he was for forgetting his badge, but more so because the developer believed that a company like Google that wanted to attract developers to their platform (or to work at their company) would never treat attendees this way.
Developer: “Ok, I see how it is going to be, but I don’t understand. What are you trying to prevent?”
Google: “It is against our policy.”
Developer: “But why?”
Google: “I can’t have our conference staff printing out badges all the time for people that forget.”
Developer (motioning to all the conference staff just sitting around): “There are lot of folks doing nothing, can’t one of them do it?”
Google: “No.”
Developer: “Is there anything we can do?”
Google: “You can call one of your friends at Google and use their badge. Or you can get someone else you know to give you their badge.”
Developer: “Really? Doesn’t that defeat the whole point of badges?”
Google: “No.”
The developer was very confused at this stage, but he was an idiot, so you would suspect that.
Developer: “Ok, I have a workaround, but it doesn’t make any sense, I really want to confirm that I can get anyone’s badge and just walk in.”
Google: “Yes, everyone is doing it.”
The developer keep wondering if this violated the policy too. That logical flaw didn’t seem to trouble Google. The developer wondered what would happen if every attendee gave their badge to a homeless person on the street during lunch time. Would Google think that was ok?
The developer shook the hand of Google. Thanked them. Walked away.
You can draw your own conclusions from this story. It is only one-side. I am sure Google would have a different take, but the developer will not be attending I/O again (save perhaps to organize that badge swap with the needy of San Francisco).
Update:
The above was a summary. For example, I saw Scoble during these events and actually used him as an example to ensure that I understood the badge swaping process. In addition, I accepted my defeat (although I had several offers to use others badges), went home and back (80 minutes exactly), so I could get my hands on the HTC phone. It is a fairly interesting device.
Thanks to the Google folks that have reached out to me as a result of this post. Reaffirms my respect for most Google employees (I have many friends that work at Google).
I fully understand why they have this policy; to ensure that I didn’t give my badge to someone else. There are lots of ways to check for that. Further and most importantly, you need to start from a position of trust, particularly with a paying customer, especially in the tightly nit developer community.
OData Roadshow Update/Slides
We just completed the US leg of the roadshow. Thanks to everyone who attended. We really hit our stride in Mountain View (it is home court for me), although the NYC and Chicago stops offered some really great customer interactions that we are still talking about.
We’ll be doing a keynote at the European VC Summit (Guy Kawasaki is the MC which I am excited about) and then it is off to Asia, TechEd US, and back to Europe.
We will be taping at least one of those events, which I will post here.
In the meantime, you can get the PDF (PPT is too big for WP to upload and I am too tired to SSH in to the server and fix it).
Magellan (a new unit of measurement)
I was thinking about how much I have flown this year while sleeping on the floor at the Newark airport (http://yfrog.com/eipunecj).
I often hear folks talk about 100k miles, but that is not all that tangible to me.
I was thinking that the circumference of the Earth (~40,000 kilometers/~25,000 miles) seems like a much better way to calibrate distance flown.
Two obvious names came to mind: Magellan or Eratosthenes.
Magellan it is.
It looks like I am going to end the year with around 4 magellans in the air.
How many magellans will you fly this year?
On Privacy
We all wear masks.
We wear a mask at work. A mask that tells people we are serious, intelligent and worth whatever we are being paid (or more).
We wear a different mask when having drinks with our friends. A mask where we want to be carefree, free from the weight of the mask worn at work.
We wear a different mask when we are all alone with our partner(s)/spouse(s). A mask where we can sometime share our deepest desires and fears (and often a mask where we cannot).
We even wear a mask when we talk to ourselves. The mask that says we are simultaneously both the greatest and worst person that has ever lived (the subject for a much longer post).

When I read about privacy on social networks, I can typically unwind the issue to really be about what projections of self (a mask) that the network supports.
Most only support a few masks (public and/or friends) and often poorly. This causes people to “under share”, use a different network for that mask, or just opt-out completely.
An interesting observation is that these masks are often (roughly) organized in a subset/superset relationship.

This observation could help make this problem more tractable, although I do believe that a network needs to enable the same level of control that I have today — essentially the ability to construct a mask for each individual in the network.
I could spend several years talking about why these masks exist in the first place (religious, cultural, biological, etc.), but social networks like Facebook or Robert Scoble are not going to make them go away.
What we need is a social network that understands these masks and supports them in a first class way.
The first one that does will become the essessial platform (a utility) for the next generation of applications.
OData: The Road Trip
We are taking the MIX10 Services Powering Experiences keynote on the road.
New York, NY – May 12, 2010
Chicago, IL – May 14, 2010
Mountain View, CA – May 18, 2010
Shanghai, China – June 1, 2010
Tokyo, Japan – June 3, 2010
Reading, United Kingdom – June 15, 2010
Paris, France – June 17, 2010
One full day of OData and Azure fun.
More details at http://www.odata.org/roadshow
See you there…
Iain M. Banks: Transition
Iain M. Banksis one of my favorite authors.
I just finished up his latest, Transition, on my new iPad 3G.
I hate saying this, but I want my money back.
I hate saying it, because I can imagine how hard to must be to write a book (I know quite a few authors), how hard it must be write a truly excellent book (which the author has done so many times), how hard it must be to get feedback like this after pouring so much energy into something (I hate when I get bad feedback about a talk or article).
Nevertheless, I must.
Banks clearly wants to condemn the Bush torture policy and the greed of Wall Street, but he does it in such a glaring way that it comes off as a talk-radio rant wrapped in a Sci-Fi novel.
I like my social commentary in subtle, nuance, artistic form within a novel (surprised?)
It was something that Banks did so well in many of Culture novels.
Further, I thought the torture induced powers of the main character to be too similar to Miles Teg in the last two Dune novels.
That was a further off putting.
I will say that Transitionhad a few interesting moments, the best example is an explanation of why aliens may choose to visit us.
Our moon is perfectly size for a total eclipse; perhaps the only place in the universe that you can see such a thing.
Yes, the aliens could come visit us for holiday.
iPad 3G
I hold in my hands the future of computing.
I have not felt this way about a computer since I saw the Apple Lisa in the early 80s.
I remember going to the local Apple dealer after school countless times and just staring (I have no idea why they let me keep coming back) at the first GUI computer I had seen in person.
This iPad 3G instills that same feeling once again, across more than a generation.
Are there ample opportunities for improvement? Yes.
Could Apple be more ‘open’ with users and developers? Yes.
None of this changes the feeling that I have as I type on this device.
The feeling that I had when my daughter turned the page in iBook for the first time (you should have seen her face).
I think that is Apple’s real gift; they understand that it is about emotion, not specs or features.
My rating: Changed my life.
Beyond Good and Evil
Nietzsche is, by far, my favorite philosophizer.
I tend to always be (re)reading something directly by him or something that is clearly influenced by him.
I found The Twilight of the Idols and The Anti-Christ: or How to Philosophize with a Hammer at a party at age 16 (I had an interesting mix of friends to say the least); I have been completely fascinated since.
Over the past few weeks, I have been rereading BGE (Beyond Good and Evil) with the help of a companion: Nietzsche’s Task: An Interpretation of Beyond Good and Evil.
It has been incredibly helpful and recommended if you really want to get beyond a fairly cursory understanding of BGE.
In particular, this has been a big help understanding how to cope with the death of “God” in modern Western society.
This is been a long personal struggle of mine; the depth of despair that you reach when you really comprehend the capriciousness and indifference of “nature”.
I am not talking about atheism and the lack of immortality or the triumph of science.
I am talking about understanding that our Western world view, values, culture, morality, etc. are based on some notion of “natural law” and in many cases some notion of progress/improvement.
I am talking about the death of something more powerful than the death of “God”, the death of teleology.
Nietzsche provides the best answer that I have yet found to this struggle and Nietzsche’s Task: An Interpretation of Beyond Good and Evil is a great help in understanding it better.
My rating: Changed my life.
OData Jobs
The OData team is hiring developers and testers.
https://careers.microsoft.com/JobDetails.aspx?ss=&pg=0&so=&rw=1&jid=15692&jlang=EN
https://careers.microsoft.com/JobDetails.aspx?ss=&pg=0&so=&rw=1&jid=11878&jlang=EN
Services Powering Experiences
Kent has a version of the MIX Day 2 Keynote with just the “Services Powering Experiences” section posted on the Data DevCenter.
A Man Without a Country
I could not sleep last night (not that I do much of that).
I thought a Kurt Vonnegut book would lure me into Hypnos‘ embrace.
Using my Kindle device (perhaps for the last time), I purchased A Man Without a Country: A Memoir Of Life In George W. Bush’s America.
I was wrong; I read the whole thing (~160 pages).
Not a change your life book, but certainly a fair trade.
That said, this is one story that has really captured my attention during spare moments today:
I did get to know one socialist of his generation, who was Powers Hapgood of Indianapolis. After graduating from Harvard he went to work as a coal miner, urging his working-class brothers to organize, in order to get better pay and safer working conditions. He also led protesters at the execution of the anarchists Nicola Sacco and Bartolomeo Vanzetti in Massachusetts in 1927.
We met in Indianapolis after the end of World War Two, and he had become an official in the CIO. There had been some sort of dust-up on a picket line, and he had just testified about it in court. The judge had interrupted the proceedings to ask Powers Hapgood why, with all his social and economic and educational advantages, he had chosen to lead such a life. And Powers Hapgood replied, ”Why, because of the Sermon on the Mount, sir.”
Jesus may have not been God, but he certainly seemed like a divine human; so does Powers and Vonnegut.
Futuretainment
I finished Futuretainment yesterday.
It was a loaner (thanks Hoop).
Since it was free, it gets a “fair trade“.
If I had spent money on it, I would have wanted a refund.
It is a fine book for BDM/TDMs (business/technical decision makers) that want to be clued into many of the macro trends powered by recent technology, but I didn’t glean any new insights on my first read and nothing compelled me to read through it again.
Open Source OData Server
Miguel has called for us to open source our .NET OData Server implementation.
It is something we have talked about doing in the run up to MIX and something we continue to discuss.
Broadly, I agree with much of Miguel’s argument. Expect to hear more on this topic from us.
As we explore open sourcing our .NET OData server code, the question that I am pondering is if that would be enough to kick-start an ecosystem of OData services on Unix.
Do we need to have an OData implementation for PHP &| Python as well?
What if we both open sourced our .NET implementation and also spooled up a PHP &| Python project?
If we did decide to do something like this and we could only pick one other language/runtime beyond .NET, which one should it be?
Interested in any and all thoughts on this topic.
The Children’s Crusade: A Duty-Dance with Death
This is a title of a book.
You may know it better as Slaughterhouse-Five.
For some reason, I have never gotten around to reading it until now.
I am making up for lost time; I have read it three times, back to back, already.
This is a “changed my life” book, a rare bred indeed.
I find Vonnegut’s prose, for lack of a better word, enthralling.
It is curt, but poignant.
It has an almost (and I hate to use this word) Zen-like quality.
His underlying philosophy, such as I can determine from this book, matches my own (at least as I am today and when he wrote the work).
If you have never read this book, I can’t recommend it highly enough.
