Thursday, September 28, 2023

Apple's Foundation Inspires Hamlet 2.0

 I'm unequivocally ambivalent about Apple's "Foundation" series.

On the one hand I am enjoying the show's good production values, weird (albeit overly politically correct) characters, and bizarre, unpredictable story lines.

On the other hand, as a fan of Isaac Asimov, I'm constantly stunned and horrified by what they've done to his work. This series bears as much resemblance to its namesake as 'X-Men' does to 'Waiting For Godot'. Apparently, it wasn't enough for the creators to steal the names, places, and fundamental idea of Foundation but they then proceeded to subvert or pervert every one of its foundational concepts. In doing so, they have turned Asimov's classic, cerebral, sweeping future history into a comic book, superhero, action-adventure, Star Wars clone.

So, given that streaming services are currently spending big money to redo classic tales, and inspired by Apple's fantastical rewrite of Foundation, I think the time is ripe to proffer my updated treatment of Shakespeare's Hamlet which, let's face it, is too slow and plodding to ever be realized by today's Hollywood.

In my updated, more exciting, revised version...

Hamlet is an Egyptian princess and daughter of the pharaoh Casper. Her mother, Gertrude, is an ex-slave from Denmark who became a concubine and, ultimately, the pharaoh's queen. Hamlet is also the cousin of Tutankhamun, whose father is Hamlet's uncle Claudius. [production note: we should find an Egyptian actress to play Hamlet. If none are available in Hollywood, a Maori actress will do, as the audience won't know the difference anyway].

In the first episode we illustrate that Hamlet is a strong woman of action: we see her being trained in sword fighting and chariot racing by the Greek general Yorick. Yorick has been assigned to train her by Alexander the Great, who is an ally of her father Casper.

Despite being tougher than most of the pharaoh's men, Hamlet has many potential suitors. Chief among them is Laertes, the son of the pharaoh's chief pyramid builder; Polonius. [production note: need a scene of virile, scantily clad slaves being whipped while hauling giant blocks of stone, to attract the S & M crowd]. Laertes is also friends with the young Tutankhamun, a sneaky brat who is jealous of his sister's popularity with their father and the public and who is secretly plotting with two courtiers (Rosencrantz and Guildenstern) to kill Hamlet.

Hamlet soon learns of a major chariot race being held in Rome by Julius Ceasar and which features a large prize of gold. Unfortunately, pharaoh Casper dislikes his rival Ceasar and forbids his daughter from going to Rome. With the aide of her best friend Horatio, Hamlet sneaks out of the palace and steals a sailboat. [production note: this should probably be a Dhow or Felucca, for historical accuracy]. During the voyage, Hamlet's relationship with Horatio is revealed to be platonic as he confesses to being gay and in (unrequited) love with Laertes.

Soon, a great storm arises and the boat's captain is washed overboard. Hamlet springs into action, grabs the tiller, and almost saves the boat. Unfortunately, the captain's drowned body has jammed the rudder and, unable to steer, the ship is dashed to pieces on the rocks. [plot note: this section could be expanded into an entire episode in which the voyagers are washed ashore at different places on the Italian coast and the various parties do not know the fates of the others. To avoid being mistaken for invaders, the males must dress as women and Horiatio discovers that he likes cross dressing].

After wandering the countryside in confusion, the shipwrecked parties are joyfully reunited and make their way to Rome. In Rome, Hamlet is welcomed at the palace by Julius Ceasar, who immediately becomes infatuated with her. Ceasar provides Hamlet with lodging and a beautiful Nubian slave girl named Ophelia. Hamlet is immediately smitten with Ophelia and they spend the night together. [production notes: (1) Hamlet must, of course, ask for Ophelia's consent before making love to her, (2) create a passionate but tasteful lesbian sex scene, to attract L-Word fans].

The next day, in the royal stables, Hamlet is introduced to her chariot team: four white horses led by a magnificent black stallion. The stallion is at first skittish but is soon tamed by Hamlet's horse whispering skills. [production note: tender taming scene with closeups and stroking of horse's face, to please the horsey crowd]. Later that day, in a practice race, Hamlet meets and competes with her greatest rival, the renown Roman charioteer Fortinbras. [production note: Can we get Russell Crowe to play this part?[plot note: Fortinbras' back-story can easily be expanded into an entire episode: a Christian who was once condemmed by Ceasar to fight as a gladiator but, with God's help, earned his freedom and became Ceasar's favorite charioteer. Attracts both the christian and Gladiator movie crowds].

The morning of the chariot competition arrives and Hamlet reveals her spiritual side; with Ophelia still asleep in her bed, Hamlet leaves to go and pray to the female deity Gaia. In a contrasting parallel scene, Fortinbras is shown secretly praying to the partiarchal god Zeus.

In the chariot race, Hamlet faces off against strong, handsome male charioteers from all over the world, including China, India, Iran, Russia, and North Korea [production note: use CGI to create epic settings reminiscent of the Olympics, to attract the both the sporting and Ben Hur crowds]. After a hard-fought race, in which Fortinbras nearly wins, Hamlet and her black-stallion-led team triumph. At the award ceremony, Ceasar offers to make Hamlet his empress but, as an autonomous woman who does not need a man, she politely declines. Disappointed, he tries to award her the prize gold but she asks instead to be given only Ophelia and the black stallion. Ceasar agrees and provides passage back to Egypt for all of them.

Back in Egypt, Hamlet frees Ophelia from slavery and takes her to the royal court to introduce her to Casper. Her father is outraged and reveals that he had planned to marry Hamlet off to his friend Alexander the Great. Showing once again that she is willing to stand up to the patriarchy, Hamlet begins a ferocious argument with her father, accusing him of assisting Alexander with predatory dating, since she is only 22 and Alexander is a full eight years older. She also accuses her father of racism, since Ophelia has darker skin than they do.

Their fierce argument is interrupted, however by urgent news that several ships full of Vikings are invading the country near the Nile delta. [plot note: I had originally intended to use Assyrian invaders but decided that Vikings might be more consistent with the original play]. [production note: also, it attacts fans from the Vikings show]. As Casper is too old and indecisive and Tutankhamun is too young, fearful, and treacherous, Hamlet mounts her black stallion and leads two regiments of the Egyptian army northwards.

Hamlet's forces encounter the Vikings encamped on the floodplains of the Nile delta and Hamlet agrees to meet with the Viking leader, Barnardo. [production note: a reviewer suggested that it would be impossible for these groups to communicate but I think we should just avoid that controversy by assuming that everyone involved speaks English]. Hamlet rides the black stallion to meet Barnardo, who initially is disdainful of her and refuses to believe that she leads the army. Angrily accusing Barnardo of chauvinism, she challenges him to a personal duel. After many minutes of intense sword play, she manages to nick Barnardo's sword arm. He is so impressed that he halts the fight and they sit down to talk and drink mead. Bernardo offers to withdraw from Egypt in exchange for treasure, an offer which Hamlet refuses. Bernardo, now much more drunk than Hamlet, offers to make Hamlet his queen. As an autonomous woman who does not need a man, Hamlet politely declines. Barnardo suggests that perhaps she will change her mind after he defeats her in battle the next day. She replies firmly that she will not change her mind and rides back to her encampment.

Early the next morning, as the two armies are preparing for battle, Yorick comes galloping up. Breathlessly, he describes how Hamlet's mother, queen Gertrude, has gone berserk from her lifelong mistreatment by the patriarchy and has murdered both pharaoh Casper and his brother Claudius. [plot note: Gertrude's back-story can easily be expanded into an entire episode: captured in Denmark she was sex-trafficked all over the Roman empire and finally sold to Claudius as a concubine, but "cheated" on him with Casper and, thus, became Casper's queen]. Gertrude has declared herself a deity, and with Tutankhamun and the remainder of the Egyptian army, has sealed herself into the impregnable royal palace. Not one to sit around brooding, Hamlet realizes that she needs help to avenge her father and uncles's deaths. She meets once again with Bernardo and offers to hire the Vikings as mercenaries to depose the queen. Bernardo agrees, but only if Hamlet will marry him when the job is done. Reluctantly, but thinking of her country and her people, Hamlet agrees to the sacrifice and the Viking/Egyptian army sets off for the palace.

In the next episode, a month has passed during which the Viking/Egyptian army has tried, in vain, to storm the impregnable royal palace. While the thick walls are impenetrable, the entrance doors would be vulnerable to repeated battering, except that they are too well protected for such repetitive attacks.

As they sit in siege, the Vikings grow restless and Barnardo begins to regret his drunken mercenary agreement. Eventually, a big fight breaks out between the Viking faction loyal to Barnardo and those who want to go plunder somewhere else. [production note: this could be a dramatic nighttime battle, in camp, lit by the torches of the tents (although it might be difficult to see the blood in the dark)]. After the Viking dispute, Barnardo declares that he will be the next pharaoh and demands that Hamlet become his queen immediately. Hamlet, of course, refuses and they fight each other mano a mano. Hamlet is wounded but manages to kill Barnardo. After Barnardo's death, the Vikings all pack up and leave.

After the Vikings leave, Hamlet reconnects with Horatio, who now deems themself a woman, wishes to be called "Hora", and insists that Hamlet use the correct pronouns when referring to them. Hora tells Hamlet about a recent shopping experience in which they bought dress silks from an Italian merchant by the name of Marco Polo, who also sells a novel black powder which might be able to end the siege.

Hamlet quickly boards a boat and sails to Venice to find Marco Polo. Upon meeting the handsome, young Marco Polo, Hamlet is aroused by his unisex look, his puppy-dog eyes, and his demure demeanor [production note: be sure to mention that MP is 18]. Overcoming his initial reluctance, she forcefully seduces him and enjoys it immensely. This act affirms her growing dislike of labels; she is not just a lesbian but a more open-minded bisexual. In gratitude for losing his virginity, Marco Polo gives her his formula for making gunpowder.

Returning home, Hamlet succeeds in manufacturing gunpowder but soon ascertains that, because of the architecture of the entrance doors, they can only be blown off from the inside. [production note: find some technical gobbledygook to explain why this is true]. Remembering that Laertes frequently used to raid the palace's wine cellar, Hamlet invites him to her tent to ask him about possible underground entrances into the palace. Hora is present when Laertes arrives and Laertes is smitten with their new look. Wishing to impress Hora, Laertes is very helpful and provides information about a small sewer tunnel, which Hamlet and Ophelia decide to use.

Later that night, Hamlet and Ophelia traverse the sewer tunnel carrying a barrel of gunpowder and some torches. Once inside the palace they separate, with Ophelia taking the gunpowder to the entrance doors and Hamlet going to look for the queen. Meanwhile, Polonius has been ordered by the mad queen to destroy his beloved creation; the Great Pyramid, which is the pharaoh's resting place. Instead, he has decided to kill her and is bringing a jug of water laced with poison to Gertrude's bed chamber. He puts the jug quietly down beside the sleeping queen but, before he can escape, he hears Hamlet approaching. He slips behind a nearby curtain. As Hamlet enters the room, she is incensed to see how many lit candles Gertrude is burning at once. Does Gertrude have no regard for fire safety? In a fit of pique, Hamlet grabs one of the candles and pours hot wax into the queen's ear. The queen awakens screaming and Polonius lets out a startled cry. Fearing discovery and without thinking, Hamlet pulls out her sword and stabs Polonius repeatedly through the curtain. Simultaneously, the queen grabs the nearby water jug and pours its contents over her ear but the poisoned water runs down her face, entering her eyes, nose, and mouth. [production note: depending on what sponsors we find, this death scene could be made more gross and graphic]. Polonius and the queen are both soon dead.

While Hamlet is getting her revenge for her father's death, Ophelia positions the gunpowder barrel at the entrance doors and lights the fuse. She rushes back toward the sewer tunnel. [production note: Ophelia should count down the remaining time, out loud, in order to build the tension]. Meeting Hamlet at the sewer tunnel they enter it and begin to crawl back through it as Ophelia counts down the remaining seconds. Just as they near the outside entrance, the gunpowder explodes and a wall of flame travels down the sewer tunnel, knocking them both outside the palace walls. Singed, but unhurt, they celebrate as Hamlet's army storms into the palace.

A little while later, the servant Reynaldo is sent to tell Laertes that his father has been murdered in the queen's bed chamber. Reynaldo finds Laertes in bed with Hora, who tries their best to comfort Laertes after he learns the news. Laertes and Hora both know, however, that Hamlet's revenge plan took her to the queen's bed chamber and Hora is not surprised when Laertes vows revenge against Hamlet.

The season finale opens with peace and quiet having, seemingly, returned to the kingdom. As the pharaoh Casper, his brother Claudius, the mad queen Gertrude, the Viking leader Barnardo, and the chief architect Polonius are all dead, and as Tutankhamun is still too young for the throne, Hamlet appoints herself the pharaonic regent. This angers Tutankhamun, who was expecting to be made pharaoh, and he continues to plot with two courtiers (Rosencrantz and Guildenstern) to kill Hamlet. [production note: much silly, incompetent planning as a source of comic relief]

With the death of his father Polonius, Laertes has become the chief architect of the kingdom and is tasked with completing the Great Pyramid. While it is assumed that Polonius and mad queen Gertrude killed each other, Laertes and his transgendered lover Hora know the truth: that Polonius died at Hamlet's hands. Seeking revenge, Laertes explores Tutankhamun as a possible ally. The pair quickly discover their mutual hatred for Hamlet and plot how best to kill her. Hora finds out about their plotting and is greatly troubled, as they were once Hamlet's best friend.

One morning Francisco, a security guard at the pyramid construction site, comes to Laertes and reports that the angry mummy of Casper has been seen wandering the unfinished pyramid at night and has killed several of the slaves. [plot notes: (1) The mummy story could easily be expanded into an entire episode in which jewish slaves are being targeted by the anti-semitic mummy and a great shaman, Moses, weaves a protection spell for the slaves during an ayahuasca ceremony. (2) A Moses episode in Hamlet could be the perfect prequel for a secular spin-off which revamps the book of Exodus (unlike that preachy Charlton Heston movie)].

Laertes, seeing the opportunity to eliminate Hamlet, tells Hamlet that her father's mummy has appeared and requests that Hamlet and Ophelia visit him that night in the king's burial chamber, within the pyramid. Laertes then instructs Rosencrantz and Guildenstern to hide within the pyramid and kill Hamlet when she visits.

Later that night, honoring her father's wishes, Hamlet and Ophelia enter the pyramid. Hora, hoping to somehow protect Hamlet, is lurking in the shadows outside the pyramid when they observe Laertes approach. Inside, Hamlet and Ophelia enter the burial chamber and are confronted with both her father's and her uncle's mummies, each wearing a large, golden amulet. [production note: mummies should look clean and likeable at this point]. Castor mummy praises Hamlet for revenging his death, for restoring the kingdom, and for being such a strong woman. He apologizes for trying to control her life and for not letting her make her own decisions. Claudius mummy warns Hamlet that Tutankhamun cannot be trusted.

Meanwhile, Laertes, still pacing outside, grows impatient and enters the pyramid. Hora then approaches the entrance but does not enter.

Having reconciled with her father and settled her daddy issues, Hamlet is feeling good. But, as she and Ophelia start to leave the pyramid, they are attacked from a side corridor by Rosencrantz and Guildenstern. Hamlet draws her sword and fights both attackers at once. Suddenly, both mummies appear [production note: looking decayed and hideous at this point]. R & G drop their swords in fright and run towards the exit, chased by the mummies. Laertes suddenly sees R & G running towards him, chased by two mummies, so he also turns and runs for the exit. Hora, looking down a long corridor into the pyramid, sees their beloved Laertes, followed by R & G, being chased by the murderous mummies. Hora triggers the pyramid's security seal and a giant block of stone crashes down, narrowly missing Laertes, crushing R & G, and sealing the mummies, Ophelia, and Hamlet inside.

Hamlet and Ophelia, realizing that they are sealed inside the pyramid, are aghast. Her father and uncle mummies reappear [production note: now looking clean and likeable again]. In an emotional scene, the four of them sit around in the burial chamber. Casper mummy apologizes to Hamlet for the restrictions and the oppression that his patriarchal regime has forced upon her life. He tells Hamlet that he can save her and Ophelia but it will cost him and Claudius mummy their afterlife. Caspar mummy reveals that their golden amulets will put the living into a state of hibernation. Hamlet objects to his proposed sacrifice but Caspar mummy says he will do it to atone for his sins. Caspar mummy lies Hamlet and Ophelia down, side by side, on a large stone block. The mummies remove their amulets and place them on Hamlet and Ophelia. As the torches sputter out, Hamlet and Ophelia fall asleep and the Caspar and Claudius mummies slowly turn to dust.

In the penultimate scenes, Tutankhamun is anointed pharaoh before a huge crowd outside the Great Pyramid. [production notes: (1) A wide drone shot over a huge, mixed racial crowd, (2) Several, closer, crowd shots of Egyptian commoners sprinkled with a few Roman, Greek, and Viking spectators, (3) a closeup of Marco Polo observing the coronation from the edge of the crowd, foreshadowing a possible return in the second season].

In the final scene, Hamlet and Ophelia, wearing the golden amulets, lie quietly asleep atop the giant stone block as the camera pans slowly out. And fade to black.

[author's note: Assuming we don't get funded by Netflix, and so are able to get a second season, I have a lot of great potential ideas. To start, Hamlet and Ophelia can awake 42 years into the future to find that an alien ship has returned to its parking place atop the Great Pyramid [to attract Stargate fans]. They must then escape the pyramid through the ship, which is led by a matriarchal society of benevolent aliens whose existance on Earth is being threatened by a virus created by a neighboring hostile, male-dominated Arabic kingdom. Lots more ideas where that came from. Call me...we'll do lunch].

Monday, May 8, 2023

The Risks of LLMs Are More Immediate Than AGI

Recently, a friend shared a CNN interview concerning the dangers that out-of-control Artificial Intelligence could pose:

https://www.facebook.com/camanpour/videos/573499221277846

The interview is easily accessible without a technical background, and well worth watching, but you may find it a bit scary.

After watching it, I had too many responses for a Facebook comment so I thought I'd jot a few of them down here.

Foremost, I think it's crucial to distinguish between Artificial Intelligence (AI) and Artificial General Intelligence (AGI). AGI researchers aspire to develop a subset of AI techniques that will allow computers to learn and perform any cognitive task that humans can do as well as, or even better, than a human. (This is the "god-like intelligence" referred to in the interview).

The quest for AGI is considered a subfield of AI research, although the two terms have been thoroughly mixed and muddled in the media frenzy of the last six months. Sadly, some of this confusion also comes directly from the executives of big-tech companies who seem to be using the terms interchangeably while also making grandiose claims about the level of intelligence their systems really possess.

In the first major wave of AI, in the 70s, it was a common joke that "AI" referred to all the smart stuff that humans could do that we didn't yet know how to make computers do. Once you could program something smart, it became just another algorithmic technique. While this process-oriented approach to intelligence was the prevalent viewpoint among early AI researchers many of them took their ideas and inspiration from studies of human cognition (e.g., linguistics, psychology, philosophy, and even economics and political science).

In the current wave of AI, it seems most researchers are focused on mathematical and statistical techniques and few have any background in human cognition. Large Language Models (LLMs), such as ChatGPT, are built via a data-driven approach: massive statistical computation over massive amounts of human-created text (which includes human errors, biases, mistakes, lies, propaganda, and prejudices). As Dr. Leahy points out in the CNN interview, the results which LLMs derive are rather opaque to us humans. The current AI "joke" might be "look at all the smart stuff we can get computers to mimic but we don't know what they're doing or why they can do it".

The CNN interview is scary because it expounds on the dangers of AGI; as posed by the development of an intelligent agent whose capabilities exceed those of humans but which is not limited by human morals, ethics, or physical existence. From my background in computer and cognitive science, I believe these dangers are still years away and are not likely to be realized via the current massive statistical processing approach alone, anyway. 

Nevertheless, I believe and fear that current LLMs do pose very real dangers to society, politics, and human well-being. I agree strongly with Gary Marcus who has penned a great article on the dangers of AGI risk vs current AI risk:

"...although a lot of the literature equates artificial intelligence risk with the risk of superintelligence or artificial general intelligence, you don’t have to be superintelligent to create serious problems."

I think AI apologists do a great disservice to us all when they conflate fears of AGI with concerns about the consequences of malicious use of LLMs and then dismiss all concerns as silly. Many concerns are real and immediate and something must be done or our society is in for a lot of pain.

I apologize to my friend who sent me the video as I probably haven't relieved her fears but I hope that I was able to clarify what I feel are the more imminent and important issues.

Is Writing Computationally Easy?

Recently, a colleague asked if we agreed or disagreed with this quote from an article by Stephen Wolfram entitled What Is ChatGPT Doing...and Why Does It Work:

"And instead what we should conclude is that tasks—like writing essays—that we humans could do, but we didn’t think computers could do, are actually in some sense computationally easier than we thought."

 I would have to disagree because this pronouncement is vague and the terms and premises are ill-defined.

For one example, what is "computationally easier"?:

"Lambda labs estimated a hypothetical cost of around $4.6 million US dollars and 355 years to train GPT-3 on a single GPU in 2020, with lower actual training time by using more GPUs in parallel."

This extensive training was done by reading almost 500 BILLION words. Doesn't sound easy to me.

Also, the statement seems to imply the premise that if humans can do it, then it must be "easy". I doubt anyone who studies human cognition (e.g., psychologist, linguists, cognitive scientists) would agree with this. It took me at least 14 years of varied cognitive training to learn to write an essay, and my mother was an English teacher.

Also, are LLMs really "writing essays"? Perhaps...if you define "writing an essay", narrowly, as regurgitating words and phrases that humans have written and stringing them together using correct syntax and grammar. But when humans write an essay they are engaging in an act of linguistic communication with other humans. A good writer first thinks critically about a topic and then writes with a communicative goal; such as providing a unique perspective or convincing a reader of some particular point. LLMs are decidedly NOT doing that and therein lies the danger.

Because what LLMs generate looks like what humans produce, it is extremely easy for people to be misled into believing that they must be engaged in intelligent activities such as thinking, imagining, judging, arguing, and believing. Cognitive psychologists call this "over-attribution" and it has been a problem for psychology for a very long time.
See this blog by Gary Marcus about the (growing) over-attribution problem in AI.

Saturday, February 18, 2017

Using a Java Agent with Scala/SBT

Just some notes to myself:

Adding unmanaged dependencies to a build:

Unmanaged dependencies work like this: add jars to lib and they will be placed on the project classpath. lib is a sister directory to src
Dependencies in lib go on all the classpaths (for compile, test, run, and console).

from: http://www.scala-sbt.org/0.13/docs/Library-Dependencies.html

Start SBT with Java Agent JAR file:

An example. SizeOf is a program which uses java.lang.instrument and must be launched as a Java Agent:

java -jar -javaagent:/lib/SizeOf.jar /opt/local/share/sbt/sbt-launch.jar 'run-main org.clulab.reach.ShowSizes'

Ended up using JAMM (https://github.com/jbellis/jamm):

java -jar -javaagent:/Users/hickst/workspaceCLU/clulab/reach/main/lib/jamm-0.3.1.jar /opt/local/share/sbt/sbt-launch.jar 'run-main org.clulab.reach.ShowMemReachable'

Wednesday, March 26, 2014

Leiningen upgrade problem

After working flawlessly for a long time, my local Leiningen script suddenly failed to upgrade Leiningen to the latest version. Instead, it spit out the following error message:

The script at /usr/local/bin/lein will be upgraded to the latest stable version.
Do you want to continue [Y/n]? y

Upgrading...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   137  100   137    0     0    121      0  0:00:01  0:00:01 --:--:--   182
curl: (35) error:14077458:SSL routines:SSL23_GET_SERVER_HELLO:reason(1112)
Failed to download https://github.com/technomancy/leiningen/raw/stable/bin/lein
It's possible your HTTP client's certificate store does not have the
correct certificate authority needed. This is often caused by an
out-of-date version of libssl. Either upgrade it or set HTTP_CLIENT
to turn off certificate checks:
  export HTTP_CLIENT="wget --no-check-certificate -O" # or
  export HTTP_CLIENT="curl --insecure -f -L -o"
It's also possible that you're behind a firewall haven't yet
set HTTP_PROXY and HTTPS_PROXY.

The Leiningen script seems to be (incorrectly) guessing at the problem, which had me spinning my wheels for a short time. The solution I found online was to add a '-3' or '--sslv3' flag to the 'curl' command within the lein script. The final modified line (as of the date of this post) is:

        HTTP_CLIENT="curl $CURL_PROXY --sslv3 -f -L -o"

Tuesday, November 13, 2012

Just in Time for the End of the World: a Mayan Calendar Generation Program

OK, just kidding...my wife and I don't really believe that the world
is coming to an end at the end of the current Mayan Great Cycle.
And to demonstrate our optimism that we'll still be here after
December 21st of this year, we are finally releasing the first
version of our Mayan calendar generation program (written in
Clojure, of course).  Version 1.0.0 is available on GitHub at
https://github.com/hickst/mayancal.

The Mayancal program generates a PDF file containing an illustrated
Mayan calendar for the specified year (the default is 2012...just in
case). The earliest year available is 1900, but this should allow
most users to generate a calendar for their birth year.

The Maya developed a sophisticated calendar based on the
intersection of various cycles, especially the 260 day Tzolkin
(ritual calendar) and the 365 day Haab (a rough solar calendar). The
Tzolkin named each day; like our days of the week. There were 20 day
names, each represented by a unique symbol. The days were also
numbered from 1 to 13 (Trecena cycle). Since there were 20 day
names, after the count of thirteen was reached the next day was
numbered 1 again. Since 13 and 20 have no common divisors, this
system uniquely represents all 260 (13*20) days of the sacred year
with a unique number and day-name combination.

The Haab was a rough solar year of 365 days. The Haab year contained
named months called Uinals. These were 18 regular months of 20 days
each and one special five-day month called Uayeb. Days of the Haab
months were numbered 0 to 19. Each day had a number and day name
from the 260-day Tzolkin as well as a number for each day of the
Haab month (Veintena cycle). Using the intersections of these
cycles, each day can be identified by a four-tuple:
[Tzolkin number, Tzolkin day, Haab number, Haab month].

Using Clojure's infinite lazy sequences these interacting cycles can
easily be generated and combined together with an infinite Gregorian
date sequence (see the mcal.clj file in the source code). To
simplify the program, all sequences are synchronized to start at the
Gregorian date of 1/1/1900. Any given point is then found by
dropping the appropriate number of elements from the heads of the
synchronized sequences.

Some miscellaneous notes: Because of the many great public domain
images and icons used to illustrate the calendar, the output PDF
file tends to be rather large so you probably don't want to email
calendars to all your relatives for Christmas. Also, we've tried
viewing the calendar in Preview 5.5.3, Adobe Reader 10.0.1, Skim
1.3.22, and GoodReader for iPad 3.18.6 and we've seen a few
differences between these viewers. Only Adobe and GoodReader, for
example, were able to follow the embedded links and GoodReader had
trouble displaying the links on the last page.

As I said, this is version 1, so if you encounter any issues please
let us know. We hope that this toy provides you with some fun and
diversion from the more serious, real-world uses of Clojure.

Thursday, September 6, 2012

EIPs in ROC

Randy Kahle has recently written a blog entry which artfully expresses the thinking behind the yearnings for a new ROC (Resource Oriented Computing) language. I suspect that most ROC users would be happy just to see a better syntax for module creation but, as Randy points out, a ROC language should provide a better way to conceptualize the information flow through the system.

I've thought for some time now that what's missing in NetKernel is an abstraction of the higher level patterns of information flow through spaces; an implementation of EIPs (Enterprise Integration Patterns) for ROC. EIPs in ROC could be made manifest in a couple of ways, the simplest being to express the pattern as a particular composition of existing space elements. This approach, however, strikes me as analogous to expressing a pattern in an assembly language without macros: too detailed and hard to repeat correctly. A more powerful solution would be to express some of the simpler EIPs in ROC by encoding them directly as new types of overlays. The most recent overlays, such as the Pluggable overlay and the Branch-Merge overlay, seem to be attempts to encapsulate such patterns of usage. Sadly, these fall far short of the simplicity and beauty that they could have if they were not mired in the grammar-less verbosity of XML. (1)

Please note that, by saying "patterns" (inherent in EIP above) I mean something more abstract and more encompassing than the existing recipes for the connection and interaction of spaces, which are labeled as "Module / Space Patterns" in the NetKernel documentation. While these recipes are a step in the right direction, their level of granularity seems too small to express anything but the simplest EIP. In addition, their descriptions focus on the mechanics of space interconnection and it's very hard to elicit how they can be composed into EIPs.

A new ROC language built around Enterprise Integration Patterns would allow ROC programmers to concentrate on solving their application problems by focusing on the high-level, logical flow of information through the system. Such a language would include, at a minimum, the ability to compose, connect, and visualize some base set of EIPs.  An additional ability to implement arbitrary EIPs would be extremely powerful but might require that the existing facilities to build modules and factories be enhanced, simplified, and canonized into a clean API (re: this forum discussion fragment). If the new ROC language were to eschew XML and to rely on a simple syntax, I feel this would be a huge win. Finally, I believe that a new language built around EIPs would greatly contribute to the usability and adoption of NetKernel and ROC.


1. It's interesting to speculate on the reasons why there are not more higher-level patterns and why they are not easy to spot in NetKernel's standard module. I think the principle of Linguistic Relativity is at work here; the idea that the structure of a language affects the ways in which its users conceptualize their world.


Friday, March 9, 2012

Why natural languages have grammars

This occurred to me after reading several NetKernel forum entries crying out for help with NK's "declarative syntax". I think there are some great ideas in NetKernel but the idea of burying your programming language within XML is not one of them.
<sentence>
<np>
<verb type="gerund" subject="true">Programming</verb>
<pp>
<preposition>in</preposition>
<noun type="proper" acronym="true">XML</noun>
</pp>
</np>
<vp>
<verb tense="present">is</verb>
</vp>
<np>
<determiner singular="true" indefinite="true">a</determiner>
<noun>pain</noun>
<pp>
<preposition>in</preposition>
<determiner definite="true">the</determiner>
<noun>ass</noun>
</pp>
</np>
</sentence>

Friday, May 27, 2011

Keep an SSH connection alive

I'm reposting this post from Cosmin Stejerean (offbytwo.com) as a reminder to myself about how to solve this problem that's plagued me for years when connecting to the U via SSH.

'If you are having problems with your SSH connection getting dropped after a certain amount of time (usually caused by NAT firewalls and home routers), you can use the following setting to keep your connection alive


Host *
ServerAliveInterval 180

You can place this either in ~/.ssh/config for user level settings or in /etc/ssh/ssh_config for machine level settings. You may also replace * with a specific hostname or something like *.example.com to use on all machines within a domain. This is the cleanest way of making sure your connections stay up and doesn’t require changes to the destination servers (over which you may not have control)."

Monday, May 16, 2011

Out of the blue

I got this (probably unintentionally) hilarious spam from O'Reilly, which I first took for a very late April Fool's joke:



Given this photo, I'd say that "small pharmaceutical company" must be one of those medical marijuana boutiques in California.

Wednesday, June 16, 2010

Manning makes good on cancelled book

An update to my previous post about Manning: they've now officially cancelled the CouchDB in Action book. To their credit, they are taking good care of customers (like me) who had already ordered the MEAP edition. We have been offered the choice of (1) getting our money back or (2) a replacement book or eBook (depending on our original order) AND another eBook free. I am very happy with this arrangement and have already taken the replacement offer for other eBooks. I did, however, check the eBooks' starting and (projected) publication dates. I picked books which had at least 4 or 5 chapters already available and I made sure that the book was being actively worked upon. Manning seems to have several books that have drifted off into the figurative weeds (for example see Taming Text, started in June 2008!)

Saturday, May 22, 2010

Obama and the Oil Spill

Great op-ed piece in the NY Times about how Obama is blowing the opportunity to use the Gulf oil disaster to lead the country to real, long-range solutions (which would help prevent disasters like this in the future):

Obama and the Oil Spill

Thursday, April 22, 2010

Manning going downhill fast

I'm becoming more and more disappointed with Manning Publications. They used to be a great source of eBooks on cutting edge technologies by leaders in the field. They are the publisher for some of the leading tech reference. Books such as Spring In Action, Groovy In Action and Ant In Action are tech "classics".

Lately, however, I've noticed that their book times are greatly increasing, author quality is decreasing, authors are unknown in the community, books are being threatened with cancellation, there is more and more advertising of "vaporware" (books with only 1 or 2 small chapters), and eBook releases are poorly screened for even minimal formatting quality.

For examples:

Just days ago I received an email from Manning describing how the authors of Couch DB in Action have fallen so far behind in their progress that the content is already out-of-date. Manning is debating whether to proceed with the existing content, entirely rewrite it or cancel it. There is no mention of what happens to customers who purchased the early access (MEAP) version (as I did) if the book is cancelled.

Then this morning, I received an update to Spring Integration in Action, usually a good and welcome thing. Unfortunately, the formatting of this version has some serious problems that were not present in the previous version. The text size varies wildly from chapter to chapter and, in those chapters were it is greatly increased, many of the figures are obscuring adjacent text and several of the figures are just not visible at all.

Now, of course, it must be acknowledged that this is an Early Access version of the eBook and various formatting, font, and figure problems must be expected for these drafts. However, to be useful at all, there must be some minimal standard of readability; which there was in the first MEAP version of the eBook that I received. The loss of this basic readability in the update gives the impression that no one is even reviewing the product before releasing it.

And, finally, to add insult to injury, Manning sent me a link to an online survey asking frequent customers for feedback. I patiently and completely filled out the form but when I tried to submit it, it claimed that I had not answered a couple of questions and refused to take my submission. Rechecking the form showed that all questions had been completely answered! Manning remains completely oblivious to my disappointments with them.

Manning used to be great but, in my opinion, they are going downhill fast!

Sunday, February 7, 2010

99 Problems In Clojure - part 1: problems 1-17+

Recently, I ran across an interesting blog by someone with the username 'wmacgyver' (real name Mac Liaw?) who was translating and adapting a set of 99 Prolog exercises into Clojure.

Like wmacgyver, I played with the first 17 (or so) exercises and have posted a gist of my answers here. I intend (hope) to continue working on the rest whenever I can get some time.

wmacgyer's blog with the exercise post can be found here.

Sunday, January 24, 2010

Recent Clojure talk at the Tucson JUG

A couple weeks ago I gave the monthly presentation at the Tucson JUG on the programming language Clojure. Only six JUG members showed up but they were very interested in the language and kept me talking for over an hour beyond my initially allotted hour.

There are many reasons why Clojure has really caught on in the last year or so. For me, it's a well-designed and pragmatic amalgam of Lisp, concurrent techniques, and functional programming built on the JVM. It also helps that there's a great book, a friendly and helpful community, and dozens of enthusiastic side projects.

My slides (as a PDF file) are available in the Tucson JUG's Google group area:
http://tinyurl.com/yjrnh55

Note that my presentation relied on material from the Clojure community, including the website, forums, and the terrific book "Programming Clojure" by Stuart Halloway.

Wednesday, December 31, 2008

Matte Matters: I couldn't have said it better.

A recent MacWorld editorial by Rob Griffiths on Apple's glassy displays captures my feelings on this giant step backwards in display technology:

Matte Matters

Just look around you when you're at your office, favorite coffee shop, in an airplane seat, a classroom, or even a library. There are almost always glaring light sources above and behind you. What were Apple's designers thinking? Don't they use their own products?

Monday, October 20, 2008

Final article in series finally published

I forgot to mention that the final article in the 4-part series written by Randy Kahle and me was published a few weeks ago on TheServerSide.com:

A RESTful Core for Web-like Application Flexibility - Part 4

The final article contains links back to the previous articles in the series. Just scroll down the the References section at the very bottom of the article.

Abbreviations and Code Readability

James Leigh, in a recent blog post, makes a couple of good comments on the importance of code readability and the presence of redundancy.

The accompanying poll question, however, (which asks if easily readable code is important) begs the deeper question...of course easily readable code is extremely important but the real question is how to achieve it.

For example, using abbreviations in identifier names is a poor way to make the names shorter and more concise.

Abbreviated names suffer several problems including:

1) ambiguity: is 'getReq' short for getRequest, getRequirement, or getRequisition?

2) cognitive burden: abbreviations requires much more mental effort to remember which fragment of a word is being employed. This "ideolexical" design makes the API seem much more complex and daunting than it should.

As an example, is the abbreviation for 'declareDescription' going to be:

declareDescript,
declareDescrip,
declareDescr,
declareDesc,
declDescrip,
declDescr,
OR
declDesc?

3) lack of consistency: even with only one programmer creating the abbreviated identifier names, it seems highly probably that inconsistencies will creep into the naming scheme, making it harder to use.

4) loss of readability and documentation: longer names are often clearer and document the code better than abbreviations (or shorter names).

In these days of IDEs there is little reason not to use longer, clearer, self-documenting names: it is trivial to start a name and then hit the appropriate completion key. Even if you program in a non-IDE (as I do....I use Emacs a lot of the time) the importance of good names as documentation cannot be over-emphasized and is well worth a tiny bit of extra typing.

Thursday, October 9, 2008

Lisp turns 50 this month

"In October 1958, John McCarthy published one in a series of reports about his then ongoing effort for designing a new programming language that would be especially suited for achieving artificial intelligence. That report was the first one to use the name LISP for this new programming language. 50 years later, Lisp is still in use. This year we are celebrating Lisp's 50th birthday."
-from the Lisp50@OOPSLA web page

Thursday, September 11, 2008

How the Terrorists Won on 9/11 and Since Then

On this 7th anniversary of 9/11 it is time to finally admit
what most Americans already know in their hearts: that the
terrorists fully achieved their objectives, even beyond
their own wildest dreams. And, since then, unscrupulous men,
corporations, and our own government have helped the
terrorists to continue their success.

Seven years after 9/11, our country has turned against its
own ideals and principles in the name of security, while
ironically justifying its actions as preserving "freedom".

Seven years after 9/11, We are saddled with a costly and
pointless war against a country which had nothing to do with
the attacks. We have a massive new homeland security
bureaucracy which is hard at work trying to impose a
mandatory national ID system. The privacy of millions of
American phone conversations and emails have been secretly
and illegally violated by the government and submissive
corporations. Citizens of other countries have been
arbitrarily labeled as terrorists and jailed for years
without formal charges or a trial. Freedom of travel has
been restricted by secret and erroneous government "watch
lists", to which there is no judicial appeal. And through it
all, government agencies, such as the INS and DHS, have
simply declared themselves to have sweeping new powers.

Joseph Stalin is reputed to have said "When we hang the
capitalists they will sell us the rope" but the terrorists
of 9/11 have turned us against ourselves in a much more
insidious manner; they played upon our fear of death. And
the possibility of death by terrorism is being exaggerated
by those within our country who seek to maintain or expand
their power. The truth is that you are thousands of times
more likely to be killed by a traffic accident than by a
swarthy foreigner with a bomb. Over a quarter of a million
people have died in traffic accidents in the U.S. since 9/11
and yet there is no massive new Department of Automotive
Security.

The terrorists of 9/11 won by instilling fear in the
populace, causing us to give up some of our fundamental
freedoms and rights. It is time to awake from our long
national nightmare and to put our fears into perspective.
It is time to stop being overly afraid and to reject the
erosion of our hard-won liberties. It is time to stop
letting the terrorists win.

Saturday, August 16, 2008

Data Duck Typing

Some friends of mine at 1060 Research recently sent me a new version of some software they are working on. After reading one of the XML configuration files, I asked if they had an XML Schema for it (which would define the grammar for legal configurations). The answer was that they did not, as they were moving away from formal grammars and more towards a rule-based approach like Schematron: which uses a set of pattern assertions (rules) for XML validation.

When I thought about this approach, I realized that it is duck typing for data. In object-oriented programming, the use of duck typing means that an object's behavior, rather than its class or inheritance structure, determines its interpretation and usage. The application of rule-based systems to categorize a data file or message is a data-oriented form of duck typing. Using "data duck typing", data is categorized (in this case validated) by having the right elements in the right locations.

Data duck typing means that a data file does not have to fully conform to a specific, rigid grammar as long as some of its parts meet the requirements of the particular rule set used for categorization. Thus, data messages for an application can come in all shapes and sizes as long as they contain the essential required elements with the right structural relationships. Applications which use this approach embody the design principle which says "be lenient in the messages that you accept" and will be much more flexible than applications based on rigid adherence to formal grammars.

crosslink: 5 reasons you don’t really want a jack-of-all-trades developer

Rebecca Murphey has posted an excellent blog entry in which she looks critically at the current employer trend of "asking for the moon":

"5 reasons you don’t really want a jack-of-all-trades developer".

Saturday, July 26, 2008

First article in a series posted at TheServerSide.com

Randy Kahle and I are writing a series of articles on Resource Oriented Computing (ROC), which you can think of as REST principles applied to application software development. The first article of the series posted a couple of days ago on TheServerSide.com under the title

"A RESTful Core for Web-like Application Flexibility - Part 1"

Perhaps this title was somehow misleading since the article immediately engendered a passionate (and not always civil nor complementary) debate on various aspects of REST. Most of these were off-topic from the article. As a long time reader of TSS, I expected that something like this could happen. My attitude toward this is to encourage rational discussion, clarify misunderstood points, and ignore misbehavior. This is, BTW, an approach used successfully to deal with patients at mental hospitals.

Friday, July 18, 2008

Google's Protocol Buffers announcement

Nick L., at Google, recently sent the Tucson JUG a link to a blog posting about Google's newly open-sourced Protocol Buffers:

http://google-opensource.blogspot.com/2008/07/protocol-buffers-googles-data.html

"Interesting", I thought, "but why didn't you guys just use CORBA and get it over with?"

A snippet in the blog post seems to have anticipated that question:
"OK, I know what you're thinking: "Yet another IDL?" Yes, you could call it that. But, IDLs in general have earned a reputation for being hopelessly complicated."
Complexity sounds like a strawman here.....the major problem with IDLs is that they are built upon a shared definition, which requires all parties to update and recompile when the definition changes. And once you recompile, you've lost the ability of the system to handle the old message format (so versioning is a serious problem unless you plan for it from the beginning).

Of course, these problems are ameliorated when:
1) the IDL is for internal use only and,
2) you control both ends of the conversation,
as Google does...er...did up until now.

I also wonder why Google didn't just use an existing protocol like Hessian:

http://caucho.com/products/hessian.xtp

Perhaps a case of NIH syndrome? (http://en.wikipedia.org/wiki/NIH_syndrome)

Update - 7/20/2008:

Nick responded with these comments:
Google does tend to favor technology we invent ourselves ...[snip]... OTOH, some of the systems we've built ourselves have been blockbuster hits that enable much of what you know as "Google" today.

In response to your comment about backward compatibility, Protocol Buffers are actually explicitly designed so that you can add fields and whatnot and still be able to read in records stored in the old format.

I have to admit, the "WOW" factor on some of Google's software has inspired competition and innovation. So, the next time I'm looking for a binary wire protocol, I'll take a harder look at Protocol Buffers.