Sean Middleditch » 2006 » October
It seems that everytime some developer makes a decision that a user doesn’t like, he gets the “but Linux is all about choice!” argument thrown into his face.
This line is selfish and foolish.
Linux is not about choice. Linux is about creating an open source UNIX clone. Likewise, a distro like Ubuntu is not about choice. It’s about creating a kick ass open source operating system. Neither is a Free Software project like GNOME about choice. It’s about creating a quality desktop environment.
Open source does give the user a lot more choice than proprietary software. It gives the user the choice to take all of his data and move it to another product. It gives the user the choice to modify the source to customize the software to his tastes and needs.
Open source does not have some underlying goal of “providing choice to users” that requires that developers stuff every conceivable configuration option in the UI, to write the huge chunks of code necessary to support all of those options, or to work on projects that allow users to do things the developers don’t care about.
So GNOME won’t offer an option you want. Don’t even think about saying “but Linux is about choice!” If you believe that, then make the choice to use something else. That or modify the source and add the damn option yourself. Those are the *only* choices open source gives you.
So Ubuntu won’t add some huge, complex feature you “need” to get work done like multi-arch. Don’t bore us with “but Linux is about choice!” You have the choice to use a distro that supports multi-arch or to do the work to add it yourself. Those are your two options.
If you really think that “choice” is a core part of open source, then think about this: the developers are allowed to decide what they want to spend their time on, and they aren’t bound to serve your whims against their choice.
I originally posted this on LWN, but since the gist of the post is something I find myself oft-repeated, I decided to post it here, too.
The post is in reference to the Flash 9 beta for Linux. Someone was complaining about how the Linux version being developed separately from the Windows version is due to incompetent developers or bad development practices.
For one, they’re completely changing all of the underlying technology used for the Linux version. It’d be like creating a Qt version of Abiword. Sure, the code is cross platform, and sure, there’s already a Linux, but it would still require an absolutely massive amount of work to finish.
Second, a lot of the technology Flash wants to use simply isn’t cross platform. Multimedia layers for example are almost entirely non-crossplatform right now, with just a few exceptions. (Like Real/Helix, but the who the hell wants to use that?)
The GUI toolkits on each platform are totally separate. Sure, GTK+ runs on Windows, but it still isn’t quite up to par with using native Windows controls. So the GUI layer needs to be rewritten for both.
The rendering libraries are totally different. Windows has had GDI+ for years. UNIX is only now just finally getting its hands on something equivalent in the form of Cairo or Arthur. Obviously the Windows codebase, which has been around for some time, isn’t using Cairo, but GDI+ doesn’t exist for Linux, so that whole layer has to be rewritten.
Windows plugin systems get to use COM and ActiveX. Linux requires a whole new custom layer as there is nothing standard that replaces those technologies available yet, especially for GTK+ developers. D-BUS is not a replacement, btw; it’s an IPC mechanism, but COM and ActiveX do a lot more than just IPC.
Windows has a standard HTML component. Linux has a completely different standard HTML component (several of them, none of which are actually “standard”) so that needs rewriting.
Windows has standard libraries for high-level networking, like fetching files over HTTP. Linux has no standard library, and you have to be careful depending on something like libcurl because many distros just won’t have it by default.
It isn’t like you can just take an app like this and use a different set of compiler options and get a binary for a completely different platform. Almost every component of Flash is dependent on some third-party platform library, and those libraries are not available on all platforms.
Seriously, turn your whole (presumably anti-proprietary-software) argument around; the vast majority of Free Software apps do not run on Windows at all. Those that do either depend on craptastic emulation layers like Cygwin or just work poorly like GTK+ based apps.
Cross platform development, especially when you’re talking about a GUI, is very difficult. The only two major apps that pull it off relatively well are Mozilla and OOo, and that’s only because they use completely custom widget libraries which either mimic one platform and look like crap on all the others (*cough* OOo *cough*) or look like an alien on all platforms like Mozilla.
Cross platform these days isn’t the same as it was in the days of UNIX, when cross platform just meant that you knew to use poll() on one system and select() on another. Now, the differences between platforms are far, far larger, and reach into components that cannot be sanely separated by a simple #ifdef or a few small wrapper functions.
This is going to be my last semester of school, at least for a year or two.
I’m rather burnt out with school, and I’ve decided that it really isn’t doing anything useful for me. Potential employers don’t really seem to be all that interested in whether or not I have a degree. The few who even mention a degree in their job ads state that they’re also quite happy with “equivalent work experience,” which I dare say I have.
This means I get to work more hours, I get more free time for personal hobbies and friends, and if I make the Kanar presidency that I’ll actually have plenty of time to devote to it.
It hasn’t been much of a secret that I’ve had a dying interest in Kanar for the last year. This is largely due to the game itself slowly dying off, as I see it.
So, the absolutely logical thing for me to do would be to run for President of KGE. Yes, that was sarcastic. And yes, I actually did declare my candidacy for Kanar.
I need to work out the concrete details of my platform. I know how I feel on most issues, but I need to get it all organized and written out. This will be a sort of public draft of an outline of that platform.
First off are my goals as President. I’m not looking to revolutionize KGE or Kanar. I’m just looking to have things run. A large part of this is, quite simply, being an ass. That is, saying NO, and saying it as often as necessary. My largest goal is getting Kanar on its proper financial legs. That includes both properly managing the assets KGE already has, improving our current revenue sources, and creating new sources. I’d also like to clean up the marshal structure a bit, remove a lot of redundancy, remove a lot of room for butting heads, and try instead to just rely on competent people instead of relying on a group of incompetent people as a half-assed check-and-balance system. Also, to be clear, making friends is NOT one of my goals. I haven’t done a lot of friend making in the last three years at Kanar, and I certainly don’t intend for Presidency to make me popular.
Goals are nice, but they’re useless without plans to achieve them. For the financial end of things, I do intend on utilizing outside help. Namely, my mother is a CMA (Certified Managerial Accountant). Yeah, I want me mommy to help me. If that sounds lame to you, I guess that’s a valid viewpoint. I prefer to look at it as a wise utilization of available resources which will best execute my goals. For the marshal structure, I’d like to just put everything under the GM staff. If people are afraid of GMs taking too much control… well, that’s their fucking job. If they do poorly, they’ll get fired. I’m not out to make friends, I don’t care if the GM hates me afterwards, and I don’t care if his friends hate me.
The BOD and President do make choices when it comes to things like the rulebook and plots. If nothing else, we decide who is hired to handle those things. I have two different thoughts on these things. On the one hand, my ideal rulebook and ideal plots and game world are drastically different than Kanar today. Quite simply, those things could not be put into place in K1. However, I don’t plan on pushing those ideals. I’d like to simplify the game world and plots a small bit, mostly just solidify them. For the rulebook, I’m only interested in relatively minor edits. I’d like to get sub-classes and some kind of demi-magic replacement in effect. The forms of these we used to have are badly broken, but I’ve heard of numerous alternatives, many of which I feel could pan out rather well and would please the Kanar masses. (Which, to be frank, is our job; it isn’t my place as President to turn Kanar into my ideal game, it’s my job to improve it as much as possible for the majority of people who play it.)
There are a number of changes I’d like to make to the KGE SOPs to improve KGE as a business. Some of which I will push for right away, others not. For one, I do not intend to play any PCs during my initial term of President. At the very least, there is too much which needs to be done, and my time at events could be better spent interacting with the staff and players at large, which I can’t do if I’m dedicating my time to playing a PC. I do not want to ban BOD members from playing PCs. I see advantages to see, but I also see that our current BOD is comprised entirely of volunteers. Until KGE is at the point where it hires in BOD members from an outside pool of professionals, banning BOD members from play seems like a poor move. I do want to get to the point where the BOD members are hired in from outside professionals. I very strongly wish to remove the requirement that BOD members be players of K1. I also very strongly wish to remove the ability for players to vote on their BOD members. Customers at no other business get to directly vote on the business’s board; they vote by supporting the company with their dollars or taking their money elsewhere. Kanar should be no different.
That’s a start on my platform. There is a lot more I wish to say on the subject, but possibly writing this all at 4am isn’t the keenest of ideas. More will follow.
So Cloud9 is rather dependent on being able to keep a telnet connection running to a MUD server. As a fully (or mostly) JavaScript based MUD client, it has a rather complex challenge in actually pulling this off.
There are several options available for JavaScript to talk to a remove server, none of which are anywhere near usable.
The first method, which I first tried to use, was to use a Java applet for the networking and hook it up with LiveConnect to the JavaScript code. Unfortunately, LiveConnect seems to be unbarably slow on every browser except Mozilla Firefox.
The second method, which I’m using in Cloud9 currently, is to create an HTTP-telnet proxy. This utilizes the infamous XMLHttpRequest object in Javascript to talk to a custom C++ HTTP server. This solution is pretty nasty. It requires the proxy server, which means you need a new port since Apache probably already has ownership of port 80, and Apache’s proxy service completely kills my current proxy. The lack of real HTTP streaming support is also a big problem. The best solution is going to be to have the Javascript code simply make repeated requests to the server asking for the latest output. Gross. Even without keep-alive… gross. The requirement for the proxy server also means that MUDs wanting to use Cloud9 need two processes, and two ports, which is difficult on most MUD hosting sites.
The third method is to use Flash. The Flash approach removes a lot of the ugliness of tunneling telnet over HTTP, but it still requires a proxy as Flash’s network support is limited to an XML request object and not general-purpose sockets. While you don’t need to actually use XML, you can’t use raw telnet with its network request feature.
The fourth method is to use a browser-specific plugin. This would require me to write an ActiveX control and a Firefox extension, and even then I’d be leaving out Opera and Safari/Knoquerer. Shipping extensions generally requires signing code and such. The ActiveX control also requires me to actually have the tools to write Windows code. That leaves that out.
The fifth method is Firefox-only, and again requires code signing, which requires a very expensive developer certificate. Firefox has socket classes exposed to Javascript using XPConnect. However, unsigned code cannot use XPConnect.
That’s all the methods for using sockets in Javascript that I can find. Not one of them is really ideal. Of them, the most palletable is the Flash applet. It’ll work on all browsers, should theoretically even work on systems Adobe doesn’t support (assuming the Free Flash players support the XML socket class of official Flash), and requires only a rather simple proxy. It’s even feasible to put the new protocol support directly into the MUD, utilizing the same socket as normal telnet requests and a little protocol-detection feature.
However, what I would really like is a new ClientSocket class in Javascript. XMLHttpRequest took off because it was easy to add to browsers and really, really useful. I contend that a general socket class would be equally useful. It would allow development of all sorts of browser apps that require or at least strongly benefit from server-push architectures and fast bi-directional communication with the server.
The class doesn’t need a lot of features, and can be secured at least as well as XMLHttpRequest is. If Javascript can only connect to the same host as the script was downloaded from, that ensures that it can’t be used to make secret SMTP spam bots in web browsers or anything (at most, the script could submit mail to the script hoster’s own SMTP server, which is rather pointless from a spammer perspective). It needs only a few simple event handlers; onConnect, onHangup, onError, and onReceive would suffice. Add another method to send data and the method to actually start a connection, and it’s done.
I’m debating writing a Firefox extension that provides such a class, and then advertising it everywhere. If people find it useful (and I dare say they will) then I would expect Safari, Opera, and IE to all pick it up, just like they did for XMLHttpRequest.
Now to just get off my lazy ass and actually do that.
Update:
Reading over some WHAT-WG design docs, I found the description of the Server-sent DOM events system in design phases. This would be another option. Essentially it solves the messy problems of trying to use XMLHttpRequest to read data from the server. Unfortunately, it still requires a proxy (as it’s meant to receive specially-formatted “DOM events” data only) and is still uni-directional, meaning additional requets (and thus connections) using XMLHttpRequest would be required. Still, it would allow me to greatly simplify the current HTTP-telnet proxy code I have, plus it would simplify the Javascript client-side code a small bit as well. Having something like ClientSocket remains my preferred choice, but this new system would at least be better than any of the other alternatives, I think.
Update 2:
Lo and behold, WHAT-WG also has a Connection specification in design, which is a functional equivalent of ClientSocket. $DEITY praise the WHAT-WG. Now one just has to wait for the specification to be completed and browsers to start implementing it.
I’ve got a full plate of projects right now. Which is good, as it’s keeping my mind busy, which means it doesn’t have time to wonder down unpleasant alleys filled with memory thugs with big sticks with nails in. Yes, very good indeed.
My work projects are things I need to keep relatively secret. Boo.
My semi-work personal projects I also need to keep secret. Boo again.
My Kanar projects are… well, there aren’t any. Fuck Kanar. More important things to do, and the game is dying. Little sense to put effort sprucing up something headed very quickly for the grave.
I’m doing a job with Kyndig of MUD Magic working on his MUD client, adding some new ZMP features, including the new ZMP-driven markup system “ZML,” and eventually also an auto-mapper.
For AweMUD, I’ve got my usual assortment of “would like to do”s, with nowhere enough time to actually do most of them.
Also, I’m trying work a bit more on Cloud9 (my fully HTML/JavaScript MUD client). I have an auto-mapper prototype I might be able to integrate at some point. I’m also planning on axing the HTTP proxy server. It’s a pain in the ass and a source of some silly bugs. Better to just swallow my pride and use a Flash applet for the network connection. For Firefox users, I could also use the native socket bindings, assuming the security controls don’t bite me in the ass too hard.