Press "Enter" to skip to content

Posts published by “centaur”

My First APL Program

centaur 0
As a side project right now I'm investigating computer languages --- not just experimenting with Perl vs. Python but trying to expose myself to different families of languages, such as functional, logic, imperative, object oriented, and obfuscated.

Most recently, someone mentioned that array languages are the least
widely known family --- perhaps because the founding language in the group,
APL, was written with a nonstandard character set. Perhaps the most terse
of all programming languages, APL spawned a series of children, like J and K,
which, even though they can be written in a normal alphabet, retain APL's
essential terseness --- or, dare we say, obscurity?

I plan to learn J. However, before I did so, I committed myself to learning
at least a smidgen of the original APL, so I could see how the language was
originally intended to work and look.

Here's my first APL program, designed to produce a Vigenere tableau:



Note the code isn't in the standard ASCII character set, so I had
to represent it as an image file.

The heart of the code is the central box of the next image. This should read as:



disclose (( -1 rotate (indexList (shapeOf Y)))
(outerProduct rotate) (enclose Y))



and executes right to left:



To translate into pseudocode:


// Assign the alphabet to the variable Y
Y = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
 
// Now perform the following:
(unbox
((outerproduct rotate)
(rotate -1 (enumerate (length y)))
(box y)
)
)
 
// This is the moral equivalent of:
// (1). Treat array Y like a "scalar" variable
boxedY = box(y)
 
// (2) Find the length of Y - in this case,26
lengthOfY = length(y)
 
// (3) Get an array from 1 to the length of Y
// We will use this (1 2 ... 26) later to
// rotate the alphabet to the side
list1toY = enumerate(lengthOfY)
 
// (4) Rotate list by one so that the first
// row is a "no-op" rotation: (26 1 2 ... 25)
// (I should have just have subtracted one
// from each list to get (0 1 .. 25), but
// it's just my first APL program!)
rotateAmounts = rotate(-1, list1toY)
 
// (5) Create a "mapping rotate" function that takes
// a list of integers as its first argument and
// rotates each element of its second argument
// by the supplied integer.
// We had to "box" Y earlier because APL by
// default treat each of its elements as a one-element
// array.
mapRotate = outerproduct(rotate)
 
// Now create 26 copies of Y, each rotated by the amount
// specified in the rotateAmounts variable, and collect
// them all into a list. This is morally equivalent to:
// list(
// rotate(26, boxedY),
// rotate( 1, boxedY),
// ...
// rotate(25, boxedY)
// )
rotatedY = mapRotate(rotateAmounts, boxedY)
 
// Now "unbox" the rotated list, which takes the
// list of lists of rotated Ys and turns them into
// a matrix or grid rotation
return unbox(rotatedY)


The idea in my mind was to take an input array and print
a diagonalized rectangle with it. With the alphabet, this
becomes a Vigenere table --- once the "indecipherable cipher",
now a trivial matter for any modern computer.

With a different string, like "01" or "_[]" (reading the two
brackets as the APL Quad character), and a suitable change
in length of the output, it becomes instead a checkerboard:



Deciphering that is left as an exercise to you, dear fanu.

Cut me some SLAC!

centaur 0
I just had some pictures developed and found these gems from my November 2003 trip to the Stanford Linear Accelerator:



Some of the other pictures developed are so old that, well,
let's just say that half the couples in one Christmas shot are
either getting divorced or have been for some time now.

Oy, do I need a digital camera.

Resident Evil 2: Aqualitylapse

centaur 0
I and my old high school buddy William just came back from seeing "Resident Evil 2: Apocalypse".

And while there were many things I enjoyed about the movie, and even think it had the skeleton of an interesting plot, both William and I had the same reaction.

Simultaneously, we *tried* to excuse its suckitude by dissing it as a "B" movie, but immediately realized it was at best a "C" movie.

"Aliens vs. Predator", how we miss thee.

(title)

centaur 0
OK, now we've lit this candle. This isn't the permanent form of this weblog --- I've allocated the site and software for a full-blown wikiblog upcoming soon --- but at least now the blog and the hand-generated site are integrated, and I can post at the click of a button. Woo hoo!

And to tide you over, here's a pointer to where I get my physics news.

(title)

centaur 0
John Wiseman over at lemonodor noticed this amazing Periodic Table of Perl Operators put together by Mark Lentczner:



Pretty inspiring to a language designer, and a great example of information design for everyone else.

The Alternate Phantom Menace

centaur 1
Somewhere in an alternative universe, there is a version of Star Wars: Episode I: The Phantom Menace starring Haley Joel Osment as Anakin and Robin Williams as Jar Jar.

And it rocks.

In that universe, George Lucas broke his hip just before filming began and handed the directorial task to his good friend Steven Spielberg. Busy with his own projects, Spielberg hired M. Night Shalayman to smooth out some problems in the script, and Shalayman in turn introduced Spielberg to Osment, starting a collaboration that would later continue in Spielberg's critically acclaimed movies Artificial Intelligence in 2001 and Harry Potter in 2003.

The real turning point in the production was the hiring of Robin Williams to replace Ahmed Best as Jar Jar Binks. Spielberg was reluctant to replace another of Lucas' chosen cast but after repeated attempts to tone down the character, Best's creative differences with Spielberg reached the breaking point and he quit the production. Almost simultaneously, Lucas suggested Williams to Spielberg for some role after seeing him perform at a charity fundraiser at Skywalker Ranch, and Williams heartily agreed.

The completed film was two and a half hours long and made over seven hundred million dollars in its domestic release. Lucas, Spielberg and Williams threw their marketing weight and star power behind the film, but it was Olsment's Oscar-winning portrayal of Anakin Skywalker that generated real audience buzz. Fleshing out a role already greatly expanded by Shalayman, Olsment brought quiet dignity and heartrending pain to the boy who would be Vader, and became the youngest winner of the Oscar for Best Actor.

While Star Wars: Episode I: The Phantom Menace would go on to win nine academy awards, the biggest upset of Oscar night was Robin Williams' shutout for his portrayal of Jar Jar Binks. Acting largely from an improvised script, Williams brought both gravity and humor to the role of the exiled Gungan warrior --- providing a much-needed element of comedy in Spielberg's often grave treatment of the fall of Naboo --- and later proved the perfect foil for Olsment's tortured Anakin in his moving death scene at the hands of Darth Maul. However, since the physical appearance of Williams' character was computer generated, he was technically shut out of the category of Best Supporting Actor, despite the extensive write-in campaign on the part of the Academy voters.

After recuperating, Lucas returned to the executive producer role on the Star Wars saga. Despite his injury, he had remained intimately involved with the production of the movie and was pleased with the final outcome, despite his initial resistance to changes made by Spielberg and Shalayman. Shalayman and Spielberg both attempted to bow out of the saga, reluctant to continue without the magic of Williams nor Olsment, who could not realistically return in later sequels. However, after intense personal lobbying Lucas convinced both Shalayman and Spielberg to return to the project, and work on the sequels began in earnest.

Episodes II and III are being filmed back to back in Tunisia and England as we speak. However, despite the critical buzz already being generated about the project and the remarkable collaboration of the three directors, there is little doubt that the Star Wars creative team will be hard pressed to top Jar Jar's poignant death scene in Anakin's arms. As Obi-Wan Kenobi and Qui-Gon Jinn watched helplessly on, young Skywalker is first touched by death as Jar Jar utters words that echo later in the series:


"Remember, Ani. Inna Force, I be with you always."


-The Centaur
Renaissance Engineer

(title)

centaur 0
Interestingly, Van Allen (of the Van Allen Belt fame) now questions human spaceflight:

Space Science Pioneer Van Allen Questions Human Spaceflight

The quick no-bullshit translation of this kind of crap is ALWAYS the same:

"Please spend more money on my kind of programs!"

I just sat in on a NASA talk about robotic exploration. Now, it's true that
a robotic probe can do a great flyby of a moon. But when it comes to
actual planetary science, the quote went:

"A robotic probe can do in an afternoon what a human geologist
can do in 45 seconds."

What really irritates me about the kind of evil we're encountering
in the anti-space-exploration movement is its upending of basic
human values. Your tax dollars, my tax dollars are going to fund
both space exploration and space science. But space science
is fundamentally USELESS unless it serves some human goal.

In other words, if we're not going to GO there, don't waste my
money futzing around taking PICTURES of there, because,
"at the end of the day", all you're trying to do is kill human
spaceflight so you can keep taking money from me to pay
for your comfortable academic chair.

Get a life.
-the Centaur

Now this is somewhat sick…

centaur 0
Now, this is somewhat sick ... as soon as you
provide a nice feature for your users, like a
wiki, you run into asinine people who will
abuse it for their own purposes (follow the

Nigritude Ultramarine and the Wiki Sandbox Effect

This is why shopping centers have "no skateboarding"
signs and the BP on North Avenue closed off part
of its parking lot where the motorcycle clubs used
to pull in for their pit stops ... not because any one
person doing it is bad, but when enough people
take advantage, things get screwed up.

At least this guy realized what he was doing was wrong:
Wiki Sandbox Morals

Why isn’t there a naming convention for APIs?

centaur 0
I was working on an API and had trouble picking a name for
a particular operation (which we'll call, say, "getCurrentText"
for sake of argument). TheFullyExplicitName was a little long
and unwieldy and I hve vry strng f3l'ns agst Un*x stle abbrs,
so I wanted to derive a simple text name that fits with the
rest of the API (read, readLine, isMoreNeeded).

So I ferret around on the web and find a few interesting
resources:

Java Collections API Design FAQ

API Design with Java

but no good resource for overall API names.

It seems to me there should be a standard lexicon of API
names. Just as there are standards for names in given languages
(e.g., getX/setX in Java, get/set properties in C#, -p predicates
in Lisp, isX for predicates in Java-like languages, etc.) there should
be standard names we can use for APIs with standard definitions

read/write or read/print

open/close

clear

iterator/hasNext/next

and so on. I guess there need to be two parts to this library:
the semantic list of terms that are common to many APIs, and
standard names that have maximum usage across the API's
semantic contents.

Anyway, just rambling.

Blogger gets a Second Chance

centaur 0
Ok, I don't have a lot of time to post --- we're in the middle of a software release and things are pretty tight. But I just fiddled around with alternate blogging software only to find that my expensive hosting provider (sounds something like "Worthfink") is on a version of Perl so old that the OddMuse software (used to run the excellent Georgia Tech Taido wiki) will not run.

So blogger gets a second chance.

12:23pm hit return.

A Strike Against Taurlink

centaur 0
As part of "renewing the Library", I'm digging up all the old "Articles" from the "classic" version of this site, which I maintained by hand before I trusted blogging software.

So now I bring you a blast from the past: "A Strike Against Taurlink", from April 23, 2004. Boy, this was a heck of a rant, at least by my "can't we be a little more diplomatic" standards:



Ah, the lovely state of tech support these days. Admittedly, I've had great experiences with tech support for *large* products produced by *small* companies --- toys sold to the tune of $100K a pop, feeding 100 or less mouths. But as soon as you get to products and services produced by 100K employees at a company charging less than 100 a pop ... welll... things can get difficult.

Here's an example, taken from a tech support chat session about a problem with a large Internet Service Provider we'll call ... "Taurlink". Since this is fairly recent, and I remember what I was more or less thinking while the conversation was ongoing, I've filled my thoughts in in italics.

Enjoy.


Welcome to TaurLink TechChat!

Some guy from tech support will be with you shortly. Your chat session may be monitored out of habit, but don't be worried about your privacy: no-one ever reads logs anyway.

'HelpGuy' has joined the channel.
HelpGuy: Thank you for contacting TaurLink TechChat, how may I help you today?
TheCentaur: Hi, Guy. I have a problem with running CGI scripts on my web hosting account that I've been unable to debug. The short story is that I can run very, very simple scripts (hello world) but when I try to run TaurLink's provided code samples, they fail with a 500 error.
HelpGuy: Can I know which script you are unable to run?
TheCentaur: Ok ... one moment...
HelpGuy: Sure.
TheCentaur: Ok, here's an example.
HelpGuy: TaurLink does not support custom scripts.

WHAT did he just say?

HelpGuy: Please check if you can use the Mailto script or not.
TheCentaur: Go back to the previous note. "TaurLink does not support custom scripts."
TheCentaur: Is this correct?
HelpGuy: Yes, I am sorry it is correct.
HelpGuy : Please check with the script from the link:
HelpGuy: http://help.TaurLink.net/websupport/startersite/mailto.html
HelpGuy: Once it works all the scripts should work.

Ok, that's nice that they have a testing script. But right now I'm not trying to run "custom scripts" ... I'm running code examples THEY provided ME!

TheCentaur: Are you aware of the CGI hosting help at this URL: http://help.Brainboing.com/docs/002/mime-n-cgi/BEHHBCEF.php3

That's a code example they provide, that doesn't work, that this guy's telling me he won't help me debug? Get real!

TheCentaur: Is this still valid?
HelpGuy: Yes, you can use that.
HelpGuy: It has the information on the scripts.
TheCentaur: Let me be sure I understand you correctly: TaurLink permits, but does not support, custom scripts.... and mailto is a good example of a script that *should* work.
HelpGuy: Yes, TaurLink allows you to use custom scripts.
HelpGuy: However, it does not support it.
TheCentaur: Ok.
HelpGuy: I apologize for the inconvenience caused to you.

Do you? Do you have ANY IDEA how close I am to typing
[Ctrl-Alt-G(oogle)] "internet service provider perl cgi" [RETURN]?

TheCentaur: I will try out the mailto script ... just a moment...
HelpGuy: Sure.

Ok, Guy, you may not be aware that I've got the site open in my FTP window ... and there is no frigging mailto script, so unless I don't understand CGI, this ain't gonna work.

TheCentaur: The mailto script does not appear to be in the scripts provided in dresan.com... where is the source for that?
HelpGuy: You need to create the two html pages and include the code that is there in the link.
HelpGuy: I am sure it will work.

[Gritting teeth] OK-now-working-through-whole-example, step by step, just because you say so. Create a web page, containing a form, pointing to the mailto script, which doesn't exist, uploading, uploading, opening in window, trying ... ok failure, just as expected, because there is no frigging mailto script for the CGI server to run.

TheCentaur: I assume you mean the link "http://www.domain.com/cgi-bin/mailto"
TheCentaur: where domain.com is my domain name?
HelpGuy: Yes, it is your domain name.
TheCentaur: Ok, just to confirm ... I have an FTP window open to the cgi-bin directory of dresan.com and there's no mailto script (and I get a 404 error when trying mailto in the URL of a browser). Should it be working anyway?
HelpGuy: Once you create the html pages it will work.
TheCentaur: One moment...
HelpGuy: Sure.
TheCentaur: Uploading now...
TheCentaur: ... uploaded.
HelpGuy: Okay.
TheCentaur: Testing...

And of course, it doesn't work, because there is no frigging mailto script for the CGI server to run, a fact which does not change just because I rewrote my script.

TheCentaur: Ok, when I ran it I get: http://www.dresan.com/cgi-bin/mailto
HelpGuy: Okay.
TheCentaur: HTTP 404 - File not found Internet Explorer

There's a long pause. Guy appears to be processing this.

Hm. I have an idea.

Perhaps my website, which is pre-TaurLink, is missing files he expects me to have! Perhaps that's the confusion. Maybe if I ask the nice web guy he'll recognize the problem and load my site up with the right stuff.

TheCentaur: Dresan.com is a fairly old web site ... I originally got it via Brainboing before you became Taurlink. Could it have an outdated collection of scripts?
HelpGuy: No, the address is not what you are entering.
HelpGuy: The html page should be one of the pages of the website.
TheCentaur: Ok.
HelpGuy: When the visitor submit the form then it will work.

[grit-grit-grit] Aaalright. Stay with me, Guy. Let's go through this step by step, just so you understand.

TheCentaur: Ok. Here is what I did:
TheCentaur: (1) I visited and read the URL: The page HTTP 404 - File not found Internet Explorer
TheCentaur: Shoot
TheCentaur: try again :-)

[laughs] Egg on face --- make sure the URL actually copies this time, centaur, or how can he follow you? Better start over, from step one.

TheCentaur: Here is what I did:
TheCentaur: (1) visited url: http://help.TaurLink.net/websupport/startersite/mailto.html
TheCentaur: (2) copied first code sample to test1.html
TheCentaur: (3) updated "domain.com" references in test1.html to point to "dresan.com"
TheCentaur: (4) copied second code sample to test2.html
HelpGuy: Okay.
TheCentaur: (5) uploaded to dresan.com via LeechFTP
TheCentaur: (6) visited http://www.dresan.com/test1.html
TheCentaur: (7) entered stuff into form and hit send
TheCentaur: (8) got a 404 error on http://www.dresan.com/cgi-bin/mailto
HelpGuy: One moment please while I check it.

Suuuuper long pause.

TheCentaur: Maybe I made a typo :-(
TheCentaur: Inspecting the source of test1.html, it seems like I've got the right URL. Did I read it wrong?

The long pause... continues.

TheCentaur: My hypothesis is that the mailto program is simply not present in the cgi-bin directory of dresan.com.
HelpGuy: Kindly hold on.
TheCentaur: Perhaps this is because dresan.com was created back in the days of Brainboing? I see a whole bunch of cgi* programs in that cgi-bin directory.
TheCentaur: Ok, sorry...
HelpGuy: One moment please.
TheCentaur: Ok.

Typing over each other here ... best wait for Guy to catch up. Is there something that I can debug here? What about these other old scripts. Ferret, ferret, ferret ... hm, there's at least one script that works, the site counter (which I don't use, but hey, it works).

Waiting... waiting... ok tired of waiting now..

TheCentaur: Note that the "counter" script seems to work.
HelpGuy: Yes, both the scripts should work.
HelpGuy: The mailto will also work.,

KA_GOTD_AMN_FUKKIN_BOLL_SHAT! ARE YOU LISTENING TO ME? ARE YOU EVEN PAYING ATTENTION? NO, the mailto script will not MAGICALLY start working just because I found a DIFFERENT script that DOES work ... because the mailto script DOES NOT EXIST!

Whooo... deep breaths, deep breaths.
Let's explain this as to a novice.
TheCentaur: Guy, the contents of the cgi-bin directory are: cgicso, cgiecho, cgiemail, cgifile, counter, justcgi.pl, simple.pl, and test.pl
TheCentaur: There is no mailto script.
HelpGuy: It is not required there.
Alright, the novice doesn't want to even listen. But let's give him the benefit of the doubt. What if I'm wrong?
[Ctrl-Alt-G(oogle)] "cgi scripting standard" [RETURN]
Browsa... browsa... browsa... Google sez: no fuckin way.

HelpGuy: I suggest that you recreate the two html pages once again.

Smiles patronizingly. Ok. I can play this game. How would I do it? What can I check? What could I have done wrong? Perhaps Guy, uberwebguy who can make scripts that don't even exist run, can perhaps work this out for me? Here, Guy, check this out?

TheCentaur: Ok. Perhaps there is a typo in my form: "http://www.dresan.com/cgi-bin/mailto"
xenotaur@Brainboing.com: Can you see what's wrong with that?
HelpGuy: It appears to be correct.

Shocked, shocked am I that ten years of web experience could enable me to enter a form.

HelpGuy: Please recreate the 2 html pages once again.
TheCentaur Alright.
HelpGuy: Okay.

Suure. Why the fuck not? Hey, I've done this what, three or four times now? I've gotten good at it. It should only take ... timing...

TheCentaur: Created form.html.
TheCentaur: Edited to point to right domain.
TheCentaur: Created thankyou.html
HelpGuy: Okay.
TheCentaur: Uploading...
HelpGuy: Okay.
TheCentaur: ...done.

...aaabout a minute.

HelpGuy: Let me check it.

Oh, there's no need, Guy. I'd ALREADY checked it. And this is what I found:

TheCentaur: Verified form presence: http://www.dresan.com/form.html
TheCentaur: Entered values, hit send...
TheCentaur: And 404 error.

Again: shocked, shocked am I.

HelpGuy: Kindly hold on.

Suuuuper long pause.

HelpGuy: Thank You for waiting.
HelpGuy: I apologize for the inconvenience caused to you.
HelpGuy: I am escalating the issue and it will be resolved soon. Please allow 2-72 hours for the issue to be resolved.
HelpGuy: Please do not delete the two test1.html and test2.html files.
TheCentaur: Ok.

He finally gets it. THANK YOU.

TheCentaur: Before you go, I want to bounce an hypothesis off you.
HelpGuy: I sincerely apologize for the inconvenience caused to you in this regard.
TheCentaur: No problem.
TheCentaur: Thank you for helping.

At this point I start to type my hypothesis about the presence of the script files he was expecting. Halfway through that sentence... and I mean, just a few seconds....

HelpGuy: You're welcome and thank you for using TaurLink TechChat. Should you need further assistance, please feel free to contact us again.
HelpGuy: Thank You for your patience and understanding.
HelpGuy: Have a good night.

Uh, Guy? Didn't you just read me say "I want to bounce something off of you? Quick, type:
"Hey, wait!" [RETURN]

Chat session has been terminated by the site operator. When you close the chat window a survey window will open. Please take a minute to fill in the survey and let us know how your chat session was.

AAAAAAAAAAAAAAAAAAAAAAARGH!


Thirty minutes later....
To the web hosting team,

I recently had a chance to chat online with one of your
technical support representatives. Upon the termination
of the call, your site attempted to pop up a chat survey
window but was blocked by a pop-up blocker.
However, I saved that chat session, appended below.
And I have the following comments:

1) Thank you for making technical chat sessions available.
Talking with TechGuy. helped me realize what was wrong
- namely, that I was trying to use code samples from

http://help.Brainboing.com/docs/002/mime-n-cgi/BEHHBCEF.php3

when I needed to look at the more modern help at

http://help.TaurLink.net/websupport/startersite/mailto.html

This dialogue enabled me to get more debugging
information about my problem, construct several
useful working hypotheses, and has given me new
potential actions to try to resolve the problem.

2) Update your web hosting help for former Brainboing customers.
This is the biggest thing that led me astray.
The code samples I found there

http://help.Brainboing.com/docs/002/mime-n-cgi/CHDDCFCH.php3

do not appear to work. At one point I carefully tested
this particular code sample and could never get it to run
in any permutation. After talking with Guy, however,
I was able to find some useful code to use as a starter.

3) Make sure that your technical support representatives listen carefully to their customers.
I understand that many users often make bad assumptions
which lead them to make mistakes which lead them to
assume that you guys have done something wrong
when you haven't. I know I fall in this category
from time to time.

However, with all due respect to Guy, I empathize with
techncial support representatives and myself have some
experience with server-side software, and so had carefully
read the available online documentation and attempted to
run code examples before I ever contacted you guys.

Now, that doesn'trule out a short between my screen and
my keyboard or some other id10t error on my part, but, I
must admit that it was somewhat trying for me to be asked
repeatedly to run the mailto script when I was looking at the
cgi-bin directory in my FTP client and could see that the mailto
script was not there. Now, Guy suggested that it didn't
need to be there, and perhaps I don't understand how
your common gateway interface is configured, and if so,
I apologize, BUT then you should reword the following

What standard CGI scripts are provided by TaurLink?

TaurLink provides the following ready to use scripts:

  • mailto
  • appendto
  • counter
so as to unambiguiously state that TaurLink is not actually
providing the scripts.

However, I think the simpler answer is that if the script
isn't in the cgi-bin directory, it won't run. And I think that
might be traceable back to the fact that this is an older account,
originally set up on Brainboing, that may not have had mailto
installed in it. Or maybe there's some other explanation.

4) Make sure that your technical support representatives listen carefully to their customers.
I quote the following section from the chatlog.
TheCentaur: Ok.
TheCentaur: Before you go, I want to bounce an hypothesis off you.
TechGuy: I sincerely apologize for the inconvenience caused to you in this regard.
TheCentaur: No problem.
TheCentaur: Thank you for helping.
TechGuy: You're welcome and thank you for using TaurLink TechChat. Should you need further assistance, please feel free to contact us again.
TechGuy: Thank You for your patience and understanding.
TechGuy: Have a good night.
Chat session has been terminated by the site operator. When you close the chat window a survey window will open. Please take a minute to fill in the survey and let us know how your chat session was.
Now, I'm sorry, but "Have a good night" is not an appropriate
response to "Before you go, I want to bounce an hypothesis off you."
In all fairness, I don't think Dan even saw that, as he responded quite
well to my "Thank you for helping." However, I must be honest and
say that it left me somewhat vexed.

5) My experience with the CGI features of Brainboing/TaurLink web hosting has been underwhelming
From limited documentation, non-working code samples, lack of
response to my earlier emails, and finally to the difficulties I had
in communicating the problems I was having with my scripts,
I am seriously questioning why I spend money on this service.

To be more blunt; when I heard:

TechGuy: TaurLink does not support custom scripts.

You came within thirty seconds of losing a customer. I feel
like shouting "But I was calling you with regards to YOUR
PROVIDED CODE SAMPLES!" followed by a long stream
of cusswords, but that's not fair to you or TechGuy.

Now, on one level I understand where you're
coming from; and this policy is not TechGuy's fault.

Nonetheless it is completely unacceptable.

I have a choice in selecting a web hosting provider, and
based on my previous good business relationships with
Brainboing I have chosen to stay with TaurLink. However,
what I am paying my web hosting for is to get scripting
access, and if you cannot provide it, there are other
choices available.

I look forward to your response.
-Anthony
--
Dr. Anthony G. Francis, Jr. ~ Software Engineer
xenotaur@Brainboing.com ~ http://www.dresan.com/
5 King's Tavern Place, Atlanta, GA 30318 ~ (404) 483-8215

Epilogue

Taurlink did not adequately respond to my complaint.

Actually, it's worse. My first response was entered into a comment form, which promptly ate it without sending it. I re-wrote the response (above) and DID get a response from TaurLink Tech Support ... asking me to return for another chat session to "work through" these issues interactively.

Which of course I HAD JUST DONE. There was no indication they had actually READ the response ... just went with their standard reply:

"In order to help you these issues as efficiently as possible for both yourself and TaurLink... we suggest TaurLink TechChat!"

I'm sorry, I'm not going to play that game. I have a choice for my hosting providers. f@nu fiku will be hosted on another provider, and if that provider works well I'm pulling the plug on Taurlink as my web hosting service provider.

-The Centaur
Renaissance Engineer


A Strike Against Blogger

centaur 0
Continuing the translation of "articles" to modern blog entries... Article 34 from March 16, 2004.


Strike one against blogger.

I haven't been using it for a week and already I have problems. I can no longer publish blog entries to my web site.

I'm not sure of the cause yet, so I'm going to do some research and give them a few days to work out the kinks.

But, regardless, this is pretty stale for week one.

More on Languages…

centaur 0
Most of my concerns last time were about syntax, which might strike you
as superficial. So before I get any further into syntax, let me recognize
the importance of a clean underlying language model.

There's a lot of value to a pure language model. A clear low-level imperative
model enables languages like C and FORTRAN to be translated into efficient
machine code, making them good system and scientific computation languages,
respectively. A clear object model enables packaging vast quantities of code
into rich libraries for reuse, making Smalltalk and Java good languages for
experimentation and rapid development, respectively. Pure functional
orientation makes correctness proofs and parallel transforms easy,making
Haskell and Objective Caml darlings of the language design movement.
And pure logical design makes it easy to specify what you want to do,
rather than how, and that makes languages like Prolog and Mercury
popular in certain artificial intelligence circles.

But, in my mind, pragmatics ultimately trumps all. There's a reason
C++ was built on top of C, a reason Java has bare-metal types,
a reason Lisp has (progn) and (loop), a reason Prolog has cut.
Programmers have to be able to use the language to solve useful
problems, or the language is a toy.

Now, this isn't intended to denigrate language designers who have
taken one element of the paradigm to the max while at the same
time focusing on pragmatic concerns like execution efficiency,
expressiveness, and ease of use. But, to be frank, most language
designers who do leap onto the fundamentalist imperative / functional
/ logic / object-oriented bandwagon don't even bother to address
such concerns --- because they are fundamentally incompatible
with the programmatic consequences of the delusions and lies that
their religious views force them to adopt.

Which brings us back to syntax. Time and time again, I've heard
language designers say "I don't like such-and-so features, so I'm not
going to put them into my language." Balderdash. That's not a valid
reason to do something in a programming language that
other programmers are supposed to use
; it's just childish
foolishness. Oh, you don't wan't multi-line comments, nested comments,
or function types in your language? Too bad. Grow the fuck up.

What's a good reason to do something in a language? It's about the
consequences. Multiple inheritance was omitted from Java because
it caused problems in the semantics and construction of C++ which
made it difficult for programmers to construct correct programs. Similarly,
at the syntactic level Java uses a separate assignment and equality
symbol and removes the equivalence of integers and booleans
to prevent a class of common programmer errors.

On the flip side, having expressive syntactic notations like the slice syntax,
list comprehensions and hash table constructors makes it possible for
programmers to write programs that accomplish a great deal concisely.
Lisp, my favorite language, makes it hard to write concise programs
because of its over-reliance on parentheses as its single list / grouping
/ code block / function definition / macro / what have you construct.
I understand completely why ultimately a real Lisp dialect has to be
reducible to something like an s-expression comprising functions and
data. But programmers should not have to write
all of those s-expressions if there's a more concise way to represent
it, nor should they have to rely on squinting at flashing parens and
reformatting indentation in their syntax-aware graphical editor just
to know whether or not they've written the right number of enclosing
parens on whatever godawful cond-lambda-reduce-map construct
they had to construct to get their job done.

So my plan moving forward: collect examples of syntax I like, and
show how they might reduce to s-expressions in a variant of Lisp.
Ultimately I want to push this back to collecting examples of semantic
features I like, and derive a clean model that would be both expressive,
interpretable, compilable and efficient.