Experience Prof.Phreak here! (ajax)
Experience Java Applet Prof.Phreak here! (java applet)
Experience CGI Prof.Phreak here! (cgi; for very old browsers)
Note: this current Prof.Phreak is only a Proof Of Concept (POC) for use of this type of technology & database.
Prof.Phreak the AJAX/Web Service
Prof.Phreak the Java Applet/Web Service
Prof.Phreak has been made into an XML based Web Service! It is now possible for any system/language/software to communicate with Prof.Phreak. The system is loosely based on the web-service specs from both Sun ONE and Microsoft .NET. The service accepts an XML SOAP envelope packaging the input phrase. Prof.Phreak Web Service then responds with a SOAP envelope containing result. This enables front end Applets that communicate with the service.
You can find more info about the service and the format of the SOAP XML (I didn't crate a DTD for this simple thing) in file: webservice.cgi (this is the file that implements the Web Service). Sample applet is: ProfPhreakApplet.java (it connects to the service). The sample html for Applet is: source_database.html (note that you'll probably want to modify it to refer to a correct Service URL). There is also a command line, stand alone client WebServiceClient.java (again, you'll probably need to modify it to refer to a correct service URL).
What's new in POC2
The major addition to Prof.Phreak since POC1 is the computation engine. This enables Prof.Phreak to answer some basic math expression questions. For example:
You: Hey, Professor, do you know what seven thousand five hundred
forty seven plus ninety six is?
You can also combine digit numbers into it... ie: "what's 7 minus two?", would get you a response like "I'm kind of bad with math, but is it five?".
You can also do more complicated things. For example, you can use "open parenthesis" and "close parenthesis" to group expressions. i.e.: "open parenthesis eight plus seven close parenthesis times three" would give the result "forty five" instead of "twenty nine" without the parenthesis. Note: the ( and ) work just as well, ie: ( eight + seven ) * three
You can have a lot of fun with this, try making ridiculously complicated expressions, and let Prof.Phreak figure it out. For example: "Hey, Professor, solve this: open parenthesis negative eighteen hundred forty seven plus three thousand eighteen close parenthesis times seven hundred ninety six plus negative thirteen times thirty six divide by twelve minus open parenthesis eight hundred sixty four plus four hundred seventy three close parenthesis times negative fourteen" and the Professor instantly spits out "You mean nine hundred fifty thousand seven hundred ninety five... right?"
Also, notice that spacing doesn't really matter in most cases. Prof.Phreak knows that sixhundredsixtysix is 666 ;-) It looks for the biggest match, so, the 'sixty' will be matched instead of the 'six'...
In the end, if professor phreak has determined that you're trying to ask him a math question, he may simply choose to ignore it, choose not to answer it, answer it incorrectly, etc. (Hey, Prof.Phreak has FREE WILL!) Also, if you made some error in the expression (like your parenthesis don't match, etc.) Prof.Phreak will try to hint at the problem, or may simply say he hates math, etc. Prof.Phreak also doesn't like numbers above 232, and he'll let you know that if your computation involves such large numbers.
More POC2 Stuff:
Prof.Phreak command API
Another major addition is support for little scriptlets (little Perl code fragments) inside the database. Once a match has been found (along with the variables, etc.) If defined, the code for that rule gets evaluated. The code can use the variables found in the regular expression, and also output variables.
This Command structure is the next step in making Prof.Phreak useful. You can put code to query some SQL database for some results, extract something from some file, do some XML stuff, query environment variables (you can make Prof.Phreak suck up to the user by saying "Hello. Oh, I love Windows users", or "Hello. Oh, I love Machintosh users", or "Hello. Oh, I love Linux users" just by quering the CGI environment).
There isn't much room for code though, so if you're doing something very serious for some particular feedback, then you might want to put a scriptlet to execute some outside perl code found in another file...
For the time being, There are examples of how to get the time and date. When you say "what time is it?" Prof.Phreak will reply with the current time embeded in diff formats in diff replies. Similar goes for the date.
The entire program is a relatively small (but complex) Perl script. The database has keywords, phrases, pattern matching, etc., in order to make this whole thing work. The database makes use of Perl regular expressions to facilitate easier (and more precise) string matching. A sample rule looks like this:
// simple regular expression match test
Any Rule can have multiple regular expression matches (the rule above only has one), and multiple replies (rule above has five). Replies are chosen in sequence relative to the server (but not necessarily the client).
The rules can also have parameters. In the case above, ([a-z]+) matches any word. So, the rule above can be more or less translated into:
SUBJECT hits OBJECT
Where both SUBJECT and OBJECT are words. We can then place them into replies... like:
Why would SUBJECT hit OBJECT?
These matching rules combined with some hard coded rules make for some powerful database capabilities. There is also an additional 'type' of rule, which is not like the one shown (it's similar though):
// you are (complement)
These new type of rules are more flexible, since you can apply them to specific areas. For example, there is a general rule "you are (.*)", in which case Prof.Phreak would reply "how did you know I am $1" or something like that... but that's not very nice, especially when people make fun, and say things like "you are a dork" and Prof.Phreak replies with "How did you know I am a dork," but now with these more targeted matches (which are searched first) you might get a more precise match, and things like "you are a dork" will be met with "You're the dork'est dork I've ever met!" Giving the impression that Prof.Phreak does not allow himself to be insulted (and understands what "dork" means).
There is another feature to this:
After all the matches have been completed, the program determines which rule matched the most. For example, we wouldn't want to call rule "you are good" when we see a pattern "you are good bastard" in the input. The maximum match almost guarantees we will only get the largest (and usually correct) match. (i.e.: in this case, Prof.Phreak would catch the insult, even though it's disguised by a complementary "you are good" phrase.
That's not the end either! The program also pre-processes all input, and converts things like: "I'm" into "I am" and "don't" into "do not", etc., which makes the database a bit smaller. Also, the number of spaces between words makes no difference. For example: "How are you?" is interpreted the same as "Howareyou?" and the same as "How ARE YOU?"
In the end, the program also post-processes all output to make sure things like "me" in the input refer to "you" in the output, and similar things like that.
I would like to give some credit to the thousands of people who wrote such a program and let other people play with it. Before writing Prof.Phreak I roamed the web through a lot of these types of programs, and obviously got many ideas from them.
The Prof.Phreak database is riddled with database chunks from many other such programs. I've modified it enough to give it a distinct personality, but if you really look for things, I'm sure you can find replies which you've already seen elsewhere. The databases used a lot are:
Bob (Bob Over Bob) by Luka
The others, are just my paranoia...
To download Prof.Phreak POC2, visit the products page.