One way that sometimes works is to run the computation on computers you own, and giving the clients a thin wrapper that sends data on the internet or something like that. Of course, there are many cases when you can't do this because of some requirements, like very large data, fast response time needed, or secret input data.
Another way you can try is to choose a suitable other programming language runtime implementation (interpreter or compiler) and fake that your program is written in that. Give a binary that has the J dll statically compiled in it, but all other dlls dynamically loaded: then take any given runtime environment, check what dynamic libraries programs compiled with it use, and load all those libraries (even if you don't use any code from them), but not many other libraries. When the program gives an error or warning message, make that message formatted like those that programs with that environment usually give. You can even choose an interpreter that uses a stop-the-world garbage collector and prints a message after every garbage collection: fake the messages and the pauses too if they're noticeable. For best results, you could even use that environment to actually write some of the program in, but in that case, still make sure to catch J errors and transform them to error messages of that environment, and link the J dll statically. Choose an environment with gui with a noticeable look and feel (but not java because J has a java gui) and write the gui in that instead of in J. Invent other ways to fake that other environment that look convincing but don't actually make the program quality worse: for example, if you choose perl and have a string input field that can be either empty or an alphabetic string, make it treat "0" as if the field was empty (I have seen such behaiviour on some webpage). Hope that helps, Ambrus ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
