8.12.06

The h-index and m-index

Michael Schwartzbach has written a web application to compute the h-index and m-index of an author, using data from Google Scholar. The terms come from Hirsch 2005, which defines h-index as follows:

A scientist has index h if h of his/her N papers have
at least h citations each, and the other (N − h) papers
have no more than h citations each.

The m-index is given by h/n, where n is the number of years the scientist has been publishing papers. Jens Palsberg maintains a list of computer scientists with h-index of at least 40.

Elsevier and the Arms Trade

The BBC writes: "Medical journal The Lancet has launched a scathing attack on its owner, Reed Elsevier, for helping to organise Europe's largest arms fair."

Nick Gil maintains a page on the subject.

5.12.06

Dabble DB

Avi Bryant demoed this at the Dynamic Languages Symposium in Portland in October (attached to OOPSLA). I tried it out on some data I needed to manipulate (computing who has submitted lots of papers to various conferences but sat on few pcs). It worked well and was fun to use.

37 signals

A fun manual explaining how to design an app and run a web company. My favorite chapters so far are 'Make opinionated software' and 'Meetings are toxic'.

2.11.06

Java Generics and Collections

By myself and my colleague and friend Maurice Nafalin. It's finally out, after considerable effort over the last year. It's just published, and I was pleased to see the O'Reilly stand at OOPSLA sold out.

"A brilliant exposition of generics. By far the best book on the topic, it provides a crystal clear tutorial that starts with the basics and ends leaving the reader with a deep understanding of both the use and design of generics." -- Gilad Bracha, Java Generics Lead, Sun Microsystems

Thanks for the kind words, Gilad!

Faith, Evolution, and Programming Languages

My keynote at OOPSLA. Had a mixed reception, as shown by the blog entries of Eugene Wallingford, Andrew Cooke, and Andres Valloud.

Fast graphics rendering in JavaScript

Spotted by Jeremy.

23.10.06

John Baez on Lambda Calculus and Games

John Baez has an intriguing introduction to lambda calculus and games. He converts a game tree into an expression built from products, exponents, and a single term X (hence there is a close connection to CCCs). The corresponding game is unwinnable if setting X=0 and evaluating yields 0 (so X is an unwinnable game: there are no values of type All X.X) and winnable if evaluating yeilds 1 (so X^X is a winnable game: there is a value of type All X. X -> X). The note is a couple of pages long, and ends with a fine survey of introductory material on lambda calculus.

2.9.06

Server-Sent Events for Opera 9

Jeremy Yallop writes: The Opera 9 browser has support for opening a persistent server-client connection which is used to send DOM events. It'll be interesting to see if this is adopted by other browsers.

28.8.06

Foozles

Todd Veldhuizen's anatomy of a programming language fad. It's all too true. I was surprised to see myself mentioned! Thanks to Sam Lindley for bringing this to my attention.

16.8.06

Sudoku in XQuery

Might be a useful exercise in Links for comparison. Apparently has also been done in XSLT.

19.7.06

Revealing the X/O impedance mismatch

Ralf Lämmel and Erik Meijer explain why its hard to mix angle brackets with curly brackets.

Abstract
When engaging in X/O mapping, i.e., when viewing XML data as objects or vice versa, one faces various conceptual and technical challenges~---~they may be collectively referred to as the `X/O impedance mismatch'. There are these groups of challenges. (i) The XML data model and the object data model differ considerably. (ii) The native XML programming model differs from the normal OO programming model. (iii) The typical type systems for XML and objects differ considerably, too. (iv) Some of the differences between data models and between type systems are more like idiosyncrasies on the XML site that put additional burden on any X/O mapping effort. (v) In some cases, one could ask for slightly more, not necessarily XML-biased language expressiveness that would improve X/O mapping results or simplify efforts.
The present article systematically investigates the mismatch in depth. It identifies and categorizes the various challenges. Known mitigation techniques are documented and assessed; several original techniques are proposed. The article is somewhat biased in that it focuses on XML Schema as the XML type system of choice and on C\# as the OO programming language of choice. In fact, XSD and C\# are covered quite deeply. Hence, the present article qualifies as a language tutorial of `the other kind'.

10.7.06

The Semicolon Wars

Brian Hayes writes an introduction to programming languages for The American Scientist. Hits both the shallow (syntax) and deep (semantics) differences, notes that everyone is deeply invested, and implies that we have a long way to go before we can scientifically evaluate which approach is best. Links is even mentioned, to my astonishment.

3.7.06

Hilda

A programming language for building data-intensive web applications from the database group at Cornell. More ambitious than Links in that it attempts to automatically partition data between client and server, and may partition differently for different servers (a pc vs a phone, say). Less ambitious than Links in that it is not concerned with highly dynamic, AJAX-like applications. Thanks to James Cheney for the pointer.

29.6.06

Ocsigen

Another web framework for dynamic content: OCaml web SIte GENerator.
From Vincent Balat and others at PPS, Paris VII. Here is their summary. Usual stuff with type systems and continuations. No generation of Javascript to run on the client.

26.6.06

The Evil Grid

I used to think of grid computing as a coming technology for e-Science. But this article from The New Yorker (10 Oct 2005) shows that grids are here and now, used for spam, identity theft, and cyberextortion. Here is a quote:

The process is called “herding,” and a herd of zombies is called a botnet. The herder then issues orders to the zombies, telling them to send unsolicited e-mail, steal personal information, or launch attacks. Herders also trade, rent, and sell their zombies. “The botnet is the little engine that makes the evil of the Internet work,” Chris Morrow, a senior network-security engineer at M.C.I., said. “It makes spam work. It makes identity fraud work. It makes extortion, in this case, work.”

22.6.06

Yahoo! User Interface Library

Yet another Javascript AJAX library. This one is well supported, backed by a major player, and open source. Is this the right library for Links to integrate with? Recommended by Mark Engelberg. Mark notes this library supports animation well, which he thinks will be essential in the future of the web.

19.6.06

Will Continuations Continue?

Gilad Bracha argues that continuations (as used by Paul Graham, PLT Scheme, Seaside, Ruby on Rails, and Links, among others) are not so important that it is worthwhile to add continuations to Java. He begins with a nice recap of the classic Orbitz example, which first came to my attention (and his) through the efforts of Shriram Krishnamurthi and the PLT Scheme folk. Thanks to Rodney Topor for pointing me at this.

I don't buy parts of his argument, although I suspect his conclusion may be right. It's *really* expensive to add a fundamental feature like continuations to Java, so it had better be incredibly valuable. Java doesn't even support plain old tail recursion, which is even more fundamental than continuations.

There are follow ups from Gilad Bracha, Tim Bray, and David Megginson.

The Swine Before Perl

Shiram Krishnamurthi on the advantage of Scheme, with an emphasis on macros and embedding domain-specific languages.

12.6.06

lgrind

A package for typesetting programs in Latex. Spotted by Jeremy.

OpenLaszlo

Yet another AJAX framework. Unlike Links, it doesn't tackle integration of client with server and database. It compiles to Flash and they are working on compiling to DHTML. (I suppose DHTML means Javascript, but its not entirely clear; the demo appears to be broken!) I like the 'Learn Laszlo in Ten Minutes' demo, as it lets you modify and rerun all examples on the fly.

5.6.06

Seaside summary

Seaside: A radically productive framework, by Bruce Tate. Spotted on Chris Double's blog.

jsScheme

Spotted by George Michaelson (brother of Greg Michaelson), and forwarded by Sam. Scheme in JavaScript by Alex Yakovlev. Originally noted in Chris Double's blog, which cites Links.

Oberon Script

Spotted by George Michaelson (brother of Greg Michaelson), and forwarded by Sam. A scripting system with an Oberon-to-Javascript compiler, by Ralph Sommerer at Microsoft Research Cambridge. "Oberon Script is a scripting language and runtime system for building interactive Web Client applications."

2.6.06

Hop

Spotted by Jeremy. The authors write:

"Hop is a new higher-order language designed for programming
interactive web applications such as web agendas, web galleries,
music players, etc. ...

"As far as we know, the closest work to Hop is due to Philip Wadler and his colleagues. The Links programming language shares the goal of Hop. As Hop, Links is a functional language that manages transparent function calls across the web. In contrast to Hop, it relies on a single syntax approach. That is, the GUI stratum of Links programs is compiled to JavaScript before being executed on the client. Links seems less advanced than Hop because, as far as we can tell, it does not support construction similar to service calls and it does not support event loops."

31.5.06

Narrative JavaScript

Spotted by Jeremy. Similar in functionality to one part of Links, where we use CPS to support concurrency in the client. It appears only to support asynchrony, not spawning multiple threads. Unlike Links, source and target are both Javascript, and it is aimed solely at the client.

24.5.06

Echo2

Another competitor to Links, also noted by Jeremy. Provides a library of GUI Widgets in Java, with "user-experience enhancements made possible by its new Ajax-based rendering engine". I like their online demo.

Google Web Toolkit

A competitor to Links, noted by Jeremy.

"GWT lets you avoid many of these headaches while offering your users the same dynamic, standards-compliant experience. You write your front end in the Java programming language, and the GWT compiler converts your Java classes to browser-compliant JavaScript and HTML."

19.5.06

Formalizing the top 100 theorems

Eerke Boiten pointed me at this list, which shows progress at producing formal proofs of a list of the 'Top 100 Theorems', using Hol, ProofPower, Isabelle, Coq, Mizar, Nqthm, and ACL2. Currently, 76% have been formalized!

12.5.06

Network Neutrality

Network Neutrality is the principal that the web makes equal attempts to deliver all content. AT&T and Bell South, among others, want to violate this principal---to offer better service to companies that pay more. This would make it enormously harder for, say, the next Google or Yahoo to get started, if it couldn't pay to compete with the current Google or Yahoo. (But both Google and Yahoo, unlike AT&T and Bell South, support Network Neutrality.)

The US Congress may determine the future fate of Network Neutrality, not just for the US but for the world, when it passes the next Telecommunications Bill, now under consideration. If you are a US citizen, you may want to urge your Congressman or Senator to supoort Representative Markey's or Senator Snowe's amendments.

Here's an introduction to Network Neutrality from The Washington Post, and here's SaveTheInternet.com.

7.5.06

HQ9+

A very specific domain-specific language. Pointed out to me by Guy Steele.

4.5.06

Ian Somerville on Eating Out in Edinburgh

A handy guide. Thanks to The Festival, Edinburgh is well supplied with restaurants, many of them excellent.

Ultraman

I brought an Ultraman mask and Ultra monsters back from Japan for Adam and Leora. Ultraman appears to be a bit like a Japanese Dr Who, in that he is reincarnated in a new form (and by a new actor) every few years.

Animusic

Computer animated music videos unlike anything you've seen before. Features bizarre instruments that are physically sound but could never exist in reality, such as balls shot from a barrel just so to land on pipes and play tunes. The creator, Wayne Lytle, has automated this to the extent that you enter a midi file and the automated instrument plays the music. David Harel used a clip from Pipe Dreams on Animusic I in his Distinguished Lecture last month.

OmniGraffle

Graphics tool for Mac OS X, recommended by Benjamin Pierce.

3.5.06

Links on Lambda the Ultimate again

Spotted by Jeremy.

Computational Creationism

An article summarizing the view that the Universe is really a computer program. (Found by following Gilad Bracha's suggestion to google for serious uses of the phrase 'Computational Theology'; an almost self-defeating suggestion, since that page and references to it now occupy the top google slots for that phrase.)

One reference omitted is Ian Banks 'The Algebraist'. In that book, the principle religion of human culture is 'The Truth', a claim that there are arguments that the Universe must be a computer simulation, and that it will stop only when enough sentient beings accept that this is the case.

Avalon/XAML

Microsoft is pushing this as a web client environment, so we need to track it as a competitor to Links.

Objects as Software Services

Gilad Bracha pointed me to these slides of an invited talk he gave at the Dynamic Languages Symposium (associated with OOPSLA) in 2005. There are interesting ideas here, and some overlap with Links. I'm not at all convinced by his main thesis, that dynamic updating of software works better with dynamic types. But I like some of the other ideas (build code to work with dynamic updating, build dynamic updating to work around synchronization). I'm not sure what he means by 'No Static' toward the end, but it looks like he's pushing what Odersky, in his work on Scala, refers to as 'The Principal of Demeter', which is to enhance reusability by replacing global variables with a pointer to a suitable object; I'm not sure what is 'No Static' about that.

21.4.06

Python 3000

I received the following letter from Greg Wilson.

To: Simon Peyton Jones, Phil Wadler, Guy Steele

Hi,

Hope you don't mind mail out of the blue, but Guido van Rossum and others have started serious design work on Python 3000, a next-generation successor to Python:

http://mail.python.org/pipermail/python-3000/
http://mail.python.org/pipermail/python-dev/2006-March/062644.html
http://www.python.org/dev/peps/pep-3000/

Lots of interesting things are in the mix right now, from implementation
details to the semantics of generic functions/multi-methods. If you'd
like to chip in, your ideas and critiques would be very welcome.

Thanks,
Greg

19.4.06

Talk: Safraless Compositional Synthesis

Moshe Y. Vardi. 4pm Tuesday 18th April 2006.

[Phil's comment: Great talk! Vardi went through the formalism step by step, which made it possible for someone like me to follow along and get some understanding of the landscape and the results.]

Abstract
In automated synthesis, we transform a specification into a system that is guaranteed to satisfy the specification. In spite of the rich theory developed for system synthesis, little of this theory has been reduced to practice. This is in contrast with of model-checking theory, which has led to industrial development and use of formal verification tools. We see two main reasons for the lack of practical impact of synthesis. The first is algorithmic: synthesis involves Safra's determinization of automata on infinite words, and a solution of parity games with highly complex state spaces; both problems have been notoriously resistant to efficient implementation. The second is methodological: current theory of synthesis assumes a single comprehensive specification. In practice, however, the specification is composed of a set of properties, which is typically evolving -- properties may be added, deleted, or modified.

In this work we address both issues. We extend a Safraless synthesis algorithm, which avoids both Safra's determinization and parity-game solving. Technically, our algorithm reduces the synthesis problem to the emptiness problem of a nondeterministic Buechi tree automaton A. The generation of A avoids determinization, avoids the parity acceptance condition, and is based on an analysis of runs of universal co-Buechi tree automata. The clean and simple structure of A enables optimizations and a symbolic implementation. In addition, it makes it possible to use information gathered during the synthesis process of properties in the process of synthesizing their conjunction, enabling compositional synthesis.

Joint work with Orna Kupferman and Nir Piterman.

Talk: The Weird World of Bi-Directional Programming

Benjamin Pierce. 4pm Monday, 17th April 2006.

[Phil's comment: I had to miss the talk, but I discussed the content with Benjamin. Interesting to see how this is coming on, and that different groups have independently developed similar ideas. One of the competing ideas has a weaker well-formedness condition that looks more like an adjoint or Galois connection than like a bijection, that could be interesting. Benjamin says the next step is a type system for their data model. Their data model seems the same as that used by Buneman, Davidson, Fernandez, and Suciu for UnQL, which allows a nice form of fixpoint definition that doesn't work for XML. The fixpoints always converge if labeled children form a set, but not if they form a list or bag.]

Abstract. Programs generally work in just one direction, from input to answer. But sometimes we need a program to work in two directions: after calculating an answer, we want to UPDATE the answer and then somehow calculate backwards to find a correspondingly updated input. Of course, in general, a given update to the answer may not correspond to a unique update on the input, or to any at all; we need an "update translation policy" that tells us which updates can be translated and how to choose among translations when there are many possibilities. The question of how to determine such a policy has been called the VIEW UPDATE PROBLEM in the database literature.

Many approaches to this problem have been devised over the years; most have taken existing database query languages (such as SQL) as their starting points and then proposed ways of describing or inferring update policies. More recently, several groups have begun working to design entirely new languages in which programs are inherently bi-directional -- i.e., in which every program can be read from left to right as a map from inputs to answers and from right to left as (roughly) a map from updated answers to updated inputs. Moreover, bi-directionality in these languages is treated compositionally: each primitive works in both directions, and the two directions of compound programs can be derived from the two directions of their subcomponents.

This talk charts some interesting regions of the world of bidirectional programming and bi-directional language design, using as a touchstone our experiences at the University of Pennsylvania in the context of the Harmony project, where bi-directional languages -- one for transforming trees and another for relational data -- play a crucial role in the architecture of a universal data synchronizer.

Paper: Descriptive and Relative Completeness of Logics for Higher-Order Functions

By Kohei Honda, Martin Berger, and Nobuko Yoshida.

[Phil's comment: The program logic itself looks remarkably straightforward.]

Abstract. This paper establishes a strong completeness property of compositional program logics for pure and imperative higher-order functions introduced in earlier work by the authors. This property, called descriptive completeness, says that for each program there is an assertion fully describing the former’s behaviour up to the standard observational semantics. This formula is inductively calculable from the program text alone. As a consequence we obtain the first relative completeness result for compositional logics of pure and imperative call-by-value higher-order functions in the full type hierarchy.

4.4.06

Planet Haskell

Thanks to Antti-Juhani Kaijanaho for adding this blog to Planet Haskell, an accumulator for blogs of Haskell-related folk.

Labeling images with a computer game

L von Ahn, L Dabbish - Proceedings of the ACM CHI, 2004.
An innovative idea: a game that you play for fun, that as a side effect produces accurate labels for images on the web. If this game was played on the same scale as other moderately popular games, it would provide accurate labels for every image in Google images within six months. The game is not that widely played, but has produced 15 million labels within a couple of years.

You can play the game here: www.espgame.org.

27.3.06

COMET - the next stage of AJAX

From Jeremy Yallop: "COMET" is Alex Russell's name for AJAX with server-push over persistent connections -- quite similar to what we've been doing recently with Links.

23.3.06

Eclipse support for Haskell and OCaml

I've heard it said that 'Eclipse is the new Emacs'. A frightening thought, but if true work come in helpful.

Haskell Tutorial for C Programmers

By Eric Etheridge. Spotted by Mark Evans at Lambda the Ultimate.

Many people are accustomed to imperative languagues, which include C, C++, Java, Python, and Pascal. For computer science students, Haskell is weird and obtuse. This tutorial assumes that the reader is familiar with C/C++, Python, Java, or Pascal. I am writing for you because it seems that no other tutorial was written to help students overcome the difficulty of moving from C/C++, Java, and the like to Haskell.

I write this assuming that you have checked out the Gentle Introduction to Haskell, but still don't understand what's going on.

Haskell is not 'a little different,' and will not 'take a little time.' It is very different and you cannot simply pick it up, although I hope that this tutorial will help.

They Rule

An anarchist application, that let's you visually explore a database of directors of companies and institutions in the US, encouraging you to visualize the links between them. If the database was freely available, it might provide some intriguing exercise for our first year course, while 'They Rule' itself would give the students a chance to see an innovative application to contrast with, say, SQL queries.

21.3.06

Languagemachine

I had a phone call from Peri Hankey, urging me to look at his programming language, called languagemachine. It looks rather idiosyncratic to me, and doesn't seem to have much bearing on Links.

10.3.06

ECMAScript for XML

Extensions to ECMAscript for manipulating XML. Seems similar in style to Comega. Dan Suciu is listed as one of the authors!

ActionScript

An EMCAcript implementation for Flash. Recommended by Vasilis Danias.

9.3.06

OscarsX: An XML database for the Academy Awards

An XQuery demo from Howard Katz. Might provide useful data for a Links demo, once we support XML queries.

The Rule of Least Power

A pronouncement from the W3C, with Berners Lee's name on it. I was surprised to see that it mentioned Haskell! (Jonathan Robie was annoyed that it did not mention XQuery.)

9.2.06

haXe

haXe is a language designed by Nicolas Cannasse that compiles into Javascript or Flash. It provides different APIs on client and server, but otherwise provides one of the same advantages as Links, namely, a uniform language for coding on the client and server. It is implemented in O'Caml, and also seems to have a type system similar to that of O'Caml.

Links and haXe have similar goals with regard to client side programming, so there maybe some opportunity to join forces. Links differs from haXe in that it also attempts to address databases, managing session state, and concurrency. Most importantly, Links is trying to be 'as functional as possible', which means that we cannot always easily make use of existing APIs, which tend to be imperative, while haXe imports these essentially unchanged.

1.2.06

Champagne Prototyping

By Alan Blackwell, Margaret Burnett, and Simon Peyton Jones. 12 pages, March 2004. Another innovative techniquer for evaluating usability. Used to evaluate a proposed feature for Excel.

Convergent Usability Evaluation: A Case Study from the EIRS Project

By Jeff Jones, Catherine Marshall, and Erik Nilsson. An innovative user study. Maybe useful for Links, where we need to build web applications but will not have many resources for usability. EIRS is the Election Incident Reporting System (EIRS), which was used to monitor recent US elections.

25.1.06

PiDuce

Merging ideas from Pi Calculus, Join Calculus, Xduce, and Cduce. An interesting blend of theory with practice, as they try to build on using XML for communication and WSDL to link to web services. An early paper on the system was coauthored by Greg Meredith, one of the driving forces behind BizTalk.

19.1.06

MapReduce

As David B. Wildgoose put it on Lambda the Ultimate

Tired of talking about Erlang and Telephone Switches? Next time someone asks for an example of functional programming techniques in the "real" world, suggest Google Labs to them.

(Thanks to Will Partain for suggesting this entry!)

18.1.06

Penn, PADL, POPL, and Plan-X

I spent 5-15 January visiting U Penn and attending PADL, POPL, and Plan-X in Charleston, SC.

At U Penn I served on the thesis committee for Vladimir Gapayev, a student of Benjamin Pierce, on the design and implementation of Xtatic, an extension of C# to support XML processing in the style of Xduce. This is one of the few doctoral examinations I have been involved with where the committee agreed to tick off the very first box on the form: absolutely no substantial revisions required. Well done, Vladimir! I also had many interesting discussions, notably with Benjami, Geoffrey Washburn, and Steve Zdancewic, and a great dinner at Django.

At PADL I delivered an invited talk on Links. The audience had scores of useful suggestions afterward; notably Zoltan Somogyi and Manuel Hermengildo suggested I look at updatable predicates in the logic programming community as an approach to integrating database update with a declarative language. My favorite presentations included Steve Kollmansberger on Modeling Genome Evolution with a DSEL for Probabilistic Programming, Kris De Volder on A Generic Code Browser with a Declarative Configuration Language, Zoltan Somogyi on several new twists in the implementation of Mercury, and Erik Meijer's invited talk on LINQ.

Then it was on to POPL. Tim Sweeney, founder of Epic Games, gave a fascinating talk on "The next mainstream programming language: a game developer's perspective". Matthias Felleisen categorized it as "an advertisement for Haskell". This talk reiterated a point I head John Hennessy make when he picked up an honorary degree at Edinburgh: the advent of multicore hardware has made concurrency (and hence functional programming) immensely more important. Sweeney noted that most of the processing in a game is rendering, which can be viewed as purely functional. But there are also about 10,000 objects interacting, which are best treated imperatively. What I found most surprising is that communicating processes (as in, say, Erlang) would not work well for objects in a game: one needs transactions to ensure that when one character transfers hit points or momentum to another that nothing is lost (just as one needs transactions to ensure that when one bank account transfers money to another that nothing is lost).

My other favorite talks were Yitzhak Mandelbaum (with Kathleen Fisher and David Walker) on The Next 700 Data Description Languages; Nils Anders Danielsson (with Jeremy Gibbons, John Hughes, and Patrik Jansson) on why Fast and Loose Reasoning is Morally Correct; and Cormac Flanagan on Hybrid Typechecking.

Erik Meijer posed me the problem of how to integrate groupBy neatly into a list comprehension. I think I found a neat answer based on "Theorems for Free". Watch this space!

Charleston is a lovely city, and I did not see enough of it. It has some fine restaurants: Fig is very good, and Cordavi is superb.

Finally, there was Plan-X. My favorite talk was Alain Frisch on "Ocaml+Xduce", a clever way to integrate Xduce typing into the Ocaml compiler with minimal changes. Other favorites were Mary Fernandez (with Kathleen Fisher, Robert Gruber and Yitzhak Mandelbaum) on PADX (a follow up to the "Next 700" paper) amd Vladimir Gapeyev, François Garillot and Benjamin Pierce on "An Xtatic Experience", a practical example based on Michael Kay's XMLSpec example program for XSLT. This paper covers some of the most interesting results in Vladimir's thesis, taking this entry full circle!

Bikeshed coloring

My experience on the Haskell committee caused me to formulate 'Wadler's Law': time spent in debating a feature doubles as one moves down the following list:

  • Semantics
  • Syntax
  • Lexical syntax
  • Lexical syntax of comments

Ezra Cooper spotted a blog entry that explains the same point, more generally and more eloquently.

8.1.06

Javascript WYSIWYG editor

One application for Links might be a WYSIWYG editor that runs on the client, as a step toward building an IDE for Links in Links, that runs in your browser. Turns out there is already a free WYSIWYG editor available in Javascript aimed at AJAX.