Disappointing Vinge. But it was his first novel, so maybe that's why. Some exciting scenes, but none of the "wow" factor of "A Fire Upon the Deep" or "A Deepness in the Sky". And his attempts to avoid "as you know, Bob" setups are kind of clumsy (but I guess at least he tried). And neologistic abbreviations are so annoying ("art'ry" for "artillery" -- yeesh!). Stephenson does this too, with "phant'sy". Stop banging me on the head with etymology, you smug jerk!
So that's fifty books! And before December!
Tuesday, November 28, 2006
Book 49: H.M.S. Surprise (O'Brian)
Another great Aubrey/Maturin. Very exciting battles and espionage. And Dil was an affecting character, despite her short stay in the story.
Book 48: Darwinia (Wilson)
Reasonably OK. Wilson's books seem to get better in the order he wrote them. Unfortunately, I'm reading them in reverse order! The one standout for me in this book was his establishing Lovecraftian monsters in a hard SF environment.
Tuesday, November 14, 2006
Book 47: Post Captain (O'Brian)
Second Aubrey/Maturin. Crammed with plot and excitement. Maturin's wool suit and bees were hilarious.
Book 46: Going Postal (Pratchett)
Very good. Usual Discworld wackiness, but with a motivating good-versus-evil plot and some character development more believable than Moist von Lipwick's name.
Monday, October 30, 2006
Book 45: Chronoliths (Wilson)
Very good. Similar to "Spin" in that it describes what happens to realistic characters after a science-fictiony incident in the near future. Not quite as good as Spin.
Wednesday, October 25, 2006
Book 42: The Tiger in the Well (Pullman)
Very engaging, engrossing novel. Sally's plight is real and gripping. The climax is not as spectacular as it could have been, but I think that's the point and the meaning of the title: Sally can't solve all her problems herself.
Thursday, October 12, 2006
Book 41: The Shadow in the North (Pullman)
Another Sally Lockhart story. Not gripping, but fairly interesting.
Thursday, October 05, 2006
Book 40: The Catalans (O'Brian)
A more serious (for some meaning of "serious") novel than the Aubrey/Maturin books. Excellent sense of people in a place. And of particular characters -- especially Xavier and his crisis.
Thursday, September 28, 2006
Book 39: The Far Side of the World (O'Brian)
Another Aubrey/Maturin novel. There's more inter-personal intrigue in this one. And more humour. But there's very little overlap with the plot of the movie with the same name: they're chasing another ship in the Pacific and the cook makes a dessert in the shape of the Galapagos islands, but that's it!
Thursday, September 14, 2006
Book 38: The Ruby in the Smoke (Pullman)
Decent Victorian England thriller. Not as good as Pullman's "Golden Compass" series.
Book 37: The Secret Mitzvah of Lucio Burke (Hayward)
I read this book because I went to school with the author. It's good: occasionally funny, quite a bit of Toronto history and one RHHS reference (Mr. Booth the biology teacher). There are some loose ends, so maybe I need to read it again.
Tuesday, September 05, 2006
Book 36: The Violent Bear It Away (O'Connor)
Is the idiot love Rayber resists the same thing as Old Tarwater's faith and prophecy? I don't think so: Old Tarwater's full of fear and hate. This book's conflict isn't good against evil: it's a battle between two confusions. Picking a side in that fight is pointless.
Good writing, though, and very intense.
Good writing, though, and very intense.
Book 35: Desolation Island (O'Brian)
More Aubrey/Maturin. O'Brian's books don't have denouments. As soon as the last plot point's wrapped up, the book ends. Interesting, but disorienting. Anyway, this one's good too. The sea battles are very exciting.
Tuesday, August 29, 2006
Book 34: The Mauritus Command (O'Brian)
Fourth Aubrey/Maturin novel. They're kind of blurring into each other! Very entertaining, though. I feel like I'm learning about sailing.
Book 33: Spin (Wilson)
Just won the Hugo, I see. Very good science fiction. In Vinge's league for cool ideas, but with recognizably early-21C-on-earth characters.
Friday, August 11, 2006
Book 32: The Assault on Tony's (O'Brien)
Seven (or eight) people trapped (or hiding) in a bar during a riot. Bleak, occasionally funny. By the same guy who wrote Leaving Las Vegas and shot himself at the age of 25 (jerk).
Book 31: Master & Commander (O'Brian)
Excellent Napoleonic wars novel. There are a lot in the series! Action is very fast and described tersely. Characters seem realistic (ie. flawed). Fairly funny, too.
Book 30: Learning the World (MacLeod)
Decent space story, with MacLeod's usual interest in economics. Kind of reminiscent of his Engines of Light world and Vinge's Deepness in the Sky (future humans discover relatively undeveloped aliens). Seemed kind of unfinished, like there could be a few more books.
Monday, July 24, 2006
Exposing .Net Components to ASP
Assuming you're using Visual Studio, first make sure the project that holds the classes you want to expose is COM-visible (Project>Properties>Application>Assembly Information>Make assembly COM-visible in VS2005).
Then install your application on the target machine. Now you should be able to create an instance of your class from VBScript with a command like this:
(Put that command in a file called MyTest.vbs and invoke it from the command line.) If your class has a method that accepts and returns simple parameters, you can show a message box by doing something like this:
Now CreateObject should work similarly from your ASP page:
But maybe you get "CreateObject failed" errors that indicate that the ASP page can't find your class. In that case, you can try unregistering your library, removing it from the GAC, adding it back to the GAC and re-registering it, like this:
1. regasm /unregister YourProject.dll
2. gacutil /u YourProject
3. gacutil /i YourProject.dll
4. regasm YourProject.dll
5. Restart the World Wide Web Publishing Service
(That's not a typo in number two: when you remove your assembly from the GAC, you refer to it by its name, not its filename.)
Regasm.exe is part of the .Net Framework (you should probably use the .Net 2.0 version in /Windows/Microsoft.NET/Framework/v2.0.50727). GACUtil.exe is also part of the .Net Framework, but it doesn't seem to ship with .Net 2.0. But you'll run into trouble if you use the .Net 1.1 version! I only got good results by using the GACUtil.exe that comes with VS2005! (/Program Files/Microsoft Visual Studio 8/SDK/v2.0/Bin/gacutil.exe).
The above procedure works pretty reliably for me. Once it didn't and I got around the problem by removing references to YourProject.dll from the registry. But that's really risky and dangerous and I shouldn't have done it and neither should you.
Then install your application on the target machine. Now you should be able to create an instance of your class from VBScript with a command like this:
CreateObject("Namespace.ClassName").(Put that command in a file called MyTest.vbs and invoke it from the command line.) If your class has a method that accepts and returns simple parameters, you can show a message box by doing something like this:
MsgBox CreateObject("Namespace.ClassName").DoIt("p1","p2")Now CreateObject should work similarly from your ASP page:
Dim myobj
Set myobj=Server.CreateObject("Namespace.ClassName")But maybe you get "CreateObject failed" errors that indicate that the ASP page can't find your class. In that case, you can try unregistering your library, removing it from the GAC, adding it back to the GAC and re-registering it, like this:
1. regasm /unregister YourProject.dll
2. gacutil /u YourProject
3. gacutil /i YourProject.dll
4. regasm YourProject.dll
5. Restart the World Wide Web Publishing Service
(That's not a typo in number two: when you remove your assembly from the GAC, you refer to it by its name, not its filename.)
Regasm.exe is part of the .Net Framework (you should probably use the .Net 2.0 version in /Windows/Microsoft.NET/Framework/v2.0.50727). GACUtil.exe is also part of the .Net Framework, but it doesn't seem to ship with .Net 2.0. But you'll run into trouble if you use the .Net 1.1 version! I only got good results by using the GACUtil.exe that comes with VS2005! (/Program Files/Microsoft Visual Studio 8/SDK/v2.0/Bin/gacutil.exe).
The above procedure works pretty reliably for me. Once it didn't and I got around the problem by removing references to YourProject.dll from the registry. But that's really risky and dangerous and I shouldn't have done it and neither should you.
Book 29: Touch (Leonard)
No criminals, just a guy with healing powers. Good writing, not compelling.
Friday, July 21, 2006
Book 28: Sushi Daze (Payne)
A thoroughly unlikable man leaves a boring life in Toronto to teach English in Japan.
I sometimes forget what "badly written" means, but this book reminds me. Poorly-chosen metaphors abound. For example, "his chest was a barrel of oil" instead of "barrel-chested". These things sound petty taken individually, but several per chapter makes reading unpleasant. I forced myself to finish it. A terrible, terrible book.
I sometimes forget what "badly written" means, but this book reminds me. Poorly-chosen metaphors abound. For example, "his chest was a barrel of oil" instead of "barrel-chested". These things sound petty taken individually, but several per chapter makes reading unpleasant. I forced myself to finish it. A terrible, terrible book.
Monday, July 17, 2006
Book 27: The Food of Love (Capella)
Light novel about food and love. The food parts are stimulating and convincing, the love parts not so much.
Book 26: The Moonshine War (Leonard)
Good minimal gangster and moonshiner story. My cousin says she doesn't like Leonard because of the casual violence. While I agree that your average Leonard novel has violence (I was going to say "more than your average Toni Morrison novel", but I'm not sure that's true!), I think it's not so much casual as realistic. Of course this depends on my idea of realistic violence (which can't be based on much experience), but I think Leonard's fast, undramatic presentation is closer to reality than a long-build, high-drama depiction. Anyway, good book.
Sunday, July 09, 2006
Book 25: Pattern Recognition (Gibson)
Very good. I guess the future has caught up to Gibson: he can write "cyberpunk" and set it in the present day. The answer to the big mystery in the book (who's producing the footage) is satisfying and believable.
Nit-picking: his idea of a render farm is wrong.
Nit-picking: his idea of a render farm is wrong.
Wednesday, July 05, 2006
Ronaldinho Statue Burned After Brasil Loss
For some reason this just strikes me as very funny. But somehow just: if you let us down, we'll destroy your statue.
Book 23: Greenwitch (Cooper)
Better than the first two in the series. A little less kiddy, but still pretty light.
Book 22: The Trial of God (Weisel)
When Elie Weisel was in a German concentration camp, some of his fellow prisoners were rabbis. One day they held a trial to determine whether their god had treated them justly. They decided he had not. Then they all got up and went to their prayers as usual.
This is story is much better and more horrible than the play "The Trial of God", which seemed to pull its punches.
This is story is much better and more horrible than the play "The Trial of God", which seemed to pull its punches.
Monday, June 19, 2006
Thursday, June 15, 2006
Book 21: Against Method (Feyerabend)
Philosophy of science. Feyerabend argues against an idealized, reason-bound model of science. Scientists do not, he says, produce theories that match a given body of facts: every scientific theory is plagued with facts that don't match it. Why? Because facts all come with their own ideological assumptions. Much of the book is devoted to discussing Galileo's arguments for the motion of the earth.
Feyerabend thinks little of Popperian falsification, because it's far too strong: if we stuck to it, we'd have to throw out all theories.
Feyerabend thinks little of Popperian falsification, because it's far too strong: if we stuck to it, we'd have to throw out all theories.
Book 20: The Little Schemer (Friedman and Felleisen)
Excellent introduction to Scheme (a Lisp). Whimsical and low-key, but a good way to learn. I should read chapter nine (Y combinator) a couple more times, I think.
Book 19: Stockhausen Bio
Very interesting. A guy who basically followed his muse. Was it easier to do in 50s Germany with its greater appreciation of artistic innovation that it would be now?
Stockhausen's music is very hard for me to understand, but when I'm listening to it I feel as though there's some pattern just beyond my grasp. I suppose my musical life has consisted of learning to appreciate and play weirder and weirder music (where weirder means more complicated, abrasive or hard to understand), so it's good to know there are still (and, I'm sure, always will be) more worlds to conquer.
Stockhausen's music is very hard for me to understand, but when I'm listening to it I feel as though there's some pattern just beyond my grasp. I suppose my musical life has consisted of learning to appreciate and play weirder and weirder music (where weirder means more complicated, abrasive or hard to understand), so it's good to know there are still (and, I'm sure, always will be) more worlds to conquer.
Wednesday, June 14, 2006
Book 18: A Deepness in the Sky
Kind-of-prequel to A Fire Upon the Deep, in that it concerns Pham Nuwen's backstory. Not as chock-full of amazing ideas as "Fire", but more gripping and emotionally intense. The villains are horribly villainous.
Friday, June 02, 2006
Book 17: Cat's Cradle (Vonnegut)
Sarcastic, depressing, and compassionate. Its self-consciously-fake religion is appealing, as opposed to Martel's Pi's opinions.
Book 16: Beloved (Morrison)
Wow, really good. Obliqueness reminded me of Gene Wolfe, which says more about me than it does about Morrison.
Thursday, May 18, 2006
Book 15: Protect and Defend (North)
Political novel concerning abortion and court nomination in the United States. Not my usual thing, but I enjoyed it.
Book 14: Life of Pi (Martel)
Very engaging, gripping and entertaining story. But the ending's pure cynical nihilism. Maybe I'm missing something.
Tuesday, April 25, 2006
Book 13: The Algebraist (Banks)
More Banks! This is one is, again, the best Banks I've yet read. Am I just getting lucky order-wise, or is he getting better? This one seems not to be a Culture novel, but it includes humans in space. The Dwellers were very funny.
Book 12: Bel Canto (Patchett)
South American revolutionaries crash a Japanese industrialist's birthday party and hold everyone, including the entertainment, hostage. Things develop.
Very very good.
Very very good.
No Such Interface (E_NOINTERFACE)
Last week, my COM server (C#, VS2005) stopped working. The client call to "CoCreateInstanceEx" started throwing a "No Such Interface" exception (E_NOINTERFACE) on a class that had always worked before. An old DLL (thanks Dan) still worked. Probably not coincidentally, the COM server also stopped working on Dan's machine.
I tried backing out some recent OS upgrades, without success. (It's possible that the backouts didn't work.) I did lots of web searches, without success.
I tried rebuilding the server one piece at a time, and found that the problem came from an XSD-generated class. My COM server sends WebService requests defined by an XSD file and I had used the VS2005 'xsd.exe' utility to generate C# classes represeting the WebService message structure. Simply including this file in my VS2005 project resulted in a DLL that caused the "No Such Interface" exception. So I commented the whole generated class and used the compiler to tell me which parts to uncomment (a tedious process). Luckily, it turned out that this fixed the problem. So there's something in the commented-out schema-generated class that's causing the exception. Or, conceivably, maybe the sheer size of the generated class is a problem, although it's "only" 14K lines or so.
Chalk this one up to "I don't know why it broke, but I found a workaround."
I tried backing out some recent OS upgrades, without success. (It's possible that the backouts didn't work.) I did lots of web searches, without success.
I tried rebuilding the server one piece at a time, and found that the problem came from an XSD-generated class. My COM server sends WebService requests defined by an XSD file and I had used the VS2005 'xsd.exe' utility to generate C# classes represeting the WebService message structure. Simply including this file in my VS2005 project resulted in a DLL that caused the "No Such Interface" exception. So I commented the whole generated class and used the compiler to tell me which parts to uncomment (a tedious process). Luckily, it turned out that this fixed the problem. So there's something in the commented-out schema-generated class that's causing the exception. Or, conceivably, maybe the sheer size of the generated class is a problem, although it's "only" 14K lines or so.
Chalk this one up to "I don't know why it broke, but I found a workaround."
Wednesday, April 12, 2006
Test Coverage
Writing unit tests to hit a particular code coverage percentage is a sucker's game. It's very easy to write "tests" that exercise the code but don't determine whether it does the right thing. So you can get a nice high coverage number without having any good tests. This is especially tempting when you're writing the tests after the code.
Sometimes you can't exercise all the code. Or you decide that it's not important or too difficult to test. But writing tests to cover code always gives you a better coverage percentage than officially ignoring code. For example, if your test currently covers four of ten lines (40%), then ignoring two lines gives you 50% coverage (4/8), but writing tests to cover those two lines gives you 60% coverage (6/10). Not a profound insight, but there it is.
Sometimes you can't exercise all the code. Or you decide that it's not important or too difficult to test. But writing tests to cover code always gives you a better coverage percentage than officially ignoring code. For example, if your test currently covers four of ten lines (40%), then ignoring two lines gives you 50% coverage (4/8), but writing tests to cover those two lines gives you 60% coverage (6/10). Not a profound insight, but there it is.
Monday, April 10, 2006
Java Generics Note
Suppose "Circle extends Shape".
Circle is Shape: TRUE
is : FALSE
is : TRUE
A String is an Object, but an Object is not necessarily a String
A list of Strings is a list of Objects, but a list of Objects is not necessarily a list of Strings
Circle is Shape: TRUE
A String is an Object, but an Object is not necessarily a String
A list of Strings is a list of Objects, but a list of Objects is not necessarily a list of Strings
Thursday, April 06, 2006
My Singleton Stupidity
Reading Steve Yegge's article Singleton Considered Stupid made me think about a place I used a Singleton in a recent project: the Logger class. Briefly, our code uses the Logger class like this:
Logger is a pretty classic Singleton. In another recent project, I even made the "mistake" Steve talks about by making the Warning method public static, so I'd invoke the Warning method like this:
So maybe I take Steve's article to heart and decide that Logger should not be a Singleton. Perhaps because we want different versions of it. The only reason I can think of for wanting different versions is that maybe we want different implementations, like FileLogger and DBLogger. If that's the case, I guess we need an interface, a factory and an implementation, something like this:
LoggerFactory.GetFileLogger().Warning("Some warning",this);
or, more complicatedly (unless that's not a word):
Log4J is the one logging framework I know a little about. It doesn't exactly use a Singleton. I think each class that wants to do logging creates a class variable (static) of type Logger on which it calls methods like "info", "warning", etc. Nevertheless, all the logging configuration happens centrally, outside of Log4J's clients.
The other place I've used Singletons is to implement DB caches. If there's a table that changes rarely and is small (for some value of "rarely" and "small"), I'll create a Singleton to hold the contents of the table.
Logger.GetInstance().Warning("Some warning",this);The GetInstance method is public static and returns the (unique-within-the-VM) instance of Logger. The Warning method is public and non-static, but the constructor's private, so the only way to get to it (the Warning method) is through the GetInstance method.
Logger is a pretty classic Singleton. In another recent project, I even made the "mistake" Steve talks about by making the Warning method public static, so I'd invoke the Warning method like this:
Logger.Warning("Some warning",this);
So maybe I take Steve's article to heart and decide that Logger should not be a Singleton. Perhaps because we want different versions of it. The only reason I can think of for wanting different versions is that maybe we want different implementations, like FileLogger and DBLogger. If that's the case, I guess we need an interface, a factory and an implementation, something like this:
ILogger (interface)With all that code roughly defined, I think we'd now use Logger like this:
public void Info(String msg,Object requester);
public void Warning(String msg,Object requester);
...
LoggerFactory (factory)
public static ILogger GetFileLogger();
public static ILogger GetFileLogger(String logfilename);
public static ILogger GetDBLogger();
public static ILogger GetDBLogger(String connectionstring);
FileLogger implements ILogger (implementation)
public FileLogger(){
super(DEFAULT_LOGFILE_NAME);
}
public FileLogger(String logfilename){
this.theLogFileName=logfilename;
}
LoggerFactory.GetFileLogger().Warning("Some warning",this);
or, more complicatedly (unless that's not a word):
String connString=ConfigHelper.GetString("logdbconnstring");Does this seem better? It's definitely more flexible in the client code, at the cost of putting more information into the client code. The client code now knows which kind of Logger it's using (FileLogger or DBLogger), which seems wrong. We could keep the client code happily ignorant of the various types of Logger by adding a "GetDefaultLogger" method to the LoggerFactory. So, if the client didn't want to override the default logger, the client would execute something like this:
LoggerFactory.GetDBLogger(connString).Warning(
"Some warning",this
);
LoggerFactory.GetDefaultLogger().Warning("Some warning",this);This seems like the best I can do, though it looks a lot like where I started from!
Log4J is the one logging framework I know a little about. It doesn't exactly use a Singleton. I think each class that wants to do logging creates a class variable (static) of type Logger on which it calls methods like "info", "warning", etc. Nevertheless, all the logging configuration happens centrally, outside of Log4J's clients.
The other place I've used Singletons is to implement DB caches. If there's a table that changes rarely and is small (for some value of "rarely" and "small"), I'll create a Singleton to hold the contents of the table.
Wednesday, April 05, 2006
Continuations in Java
I was interested in finding out what continuations are all about and I stumbled across an article called Continuations Made Simple and Illustrated by a guy named Denys Duchier. It uses examples in Python.
Briefly, and probably mostly inaccurately, Continuation Passing Style (CPS) programming uses functions that pass their results to another function instead of more familiar (to me) functions that return values. That other function then "continues" the computation. CPS programming has been (derogatorily?) called "gotos with arguments". The Wikipedia article on continuations describes them as saving the executation state of a program for later resumption.
I wondered what continuations would look like in Java. To prepare, here's a brief summary of the example from Duchier's article.
Suppose we want to implement a function that computes 2*x+y using continuations. Further suppose that we have continuation-style multiplication and addition methods, with signatures
and
We'd define our new function (baz) as
There's some non-Java code in our invocation of the multiply method:
The purpose of this code is to create a new anonymous function (a closure, but that's a whole other topic that I need to learn about) that accepts the result of the multiply, y and the "top-level" continuation and invokes the CPS-style add method. Another way to think about it is that we're creating a new continuation, initializing it with y a c and then invoking it with z (2*x).
So how can I implement the continuation in Java? I start with a Continuation interface:
Then I create a helper Continuation class that dumps its results to stdout:
Now I'm ready to create a poorly-name Functions class that contains the CPS add, multiply and baz functions.
Note that
I think AdderContinuation is the most interesting class. It's a Continuation that you initialize with a long (
Briefly, and probably mostly inaccurately, Continuation Passing Style (CPS) programming uses functions that pass their results to another function instead of more familiar (to me) functions that return values. That other function then "continues" the computation. CPS programming has been (derogatorily?) called "gotos with arguments". The Wikipedia article on continuations describes them as saving the executation state of a program for later resumption.
I wondered what continuations would look like in Java. To prepare, here's a brief summary of the example from Duchier's article.
Suppose we want to implement a function that computes 2*x+y using continuations. Further suppose that we have continuation-style multiplication and addition methods, with signatures
long add(long x,long y,Continuation c)and
long multiply(long x,long y,Continuation c)We'd define our new function (baz) as
long baz(long x,long y,Continuation c){
multiply(2,x,lambda z,y=y,c=c: add(z,y,c);
}There's some non-Java code in our invocation of the multiply method:
lambda z,y=y,c=c: add(z,y,c)The purpose of this code is to create a new anonymous function (a closure, but that's a whole other topic that I need to learn about) that accepts the result of the multiply, y and the "top-level" continuation and invokes the CPS-style add method. Another way to think about it is that we're creating a new continuation, initializing it with y a c and then invoking it with z (2*x).
So how can I implement the continuation in Java? I start with a Continuation interface:
public interface Continuation{
public void call(long l);
}
Then I create a helper Continuation class that dumps its results to stdout:
public class PrintContinuation implements Continuation{
public PrintContinuation(String name){
this.setName(name);
}
public void call(long x){
System.out.println(this.getName()+"="+x);
}
private String theName;
public void setName(String name){
this.theName=name;
}
public String getName(){
return this.theName;
}
}
Now I'm ready to create a poorly-name Functions class that contains the CPS add, multiply and baz functions.
public class Functions{
public void add(long x,long y,Continuation c){
c.call(x+y);
}
public void multiply(long x,long y,Continuation c){
c.call(x*y);
}
public void baz(long x,long y,Continuation c){
this.multiply(2,x,new AdderContinuation(y,c));
}
public static void main(String[] args){
Functions f=new Functions();
f.add(3,4,new PrintContinuation("3+4"));
f.multiply(5,6,new PrintContinuation("5*6"));
f.baz(7,8,new PrintContinuation("baz(7,8)"));
}
}
Note that
baz's implementation computes 2*x and passes the result to a Continuation that adds it (2*x) to y and passes the result (2*x+y) to the Continuation parameter. baz's implementation uses an up-until-now-undefined class called AdderContinuation:
public class AdderContinuation implements Continuation{
public AdderContinuation(long y,Continuation c){
this.setY(y);
this.setContinuation(c);
}
public void call(long x){
Functions f=new Functions();
f.add(x,this.getY(),this.getContinuation());
}
private long theY;
public void setY(long y){
this.theY=y;
}
public long getY(){
return this.theY;
}
private Continuation theContinuation;
public void setContinuation(Continuation
this.theContinuation=continuation;
}
public Continuation getContinuation(){
return this.theContinuation;
}
}
I think AdderContinuation is the most interesting class. It's a Continuation that you initialize with a long (
y) and a Continuation and that accepts a single parameter (x in call). When called, it invokes the CPS add method, passing in x, y and the Continuation. AdderContinuation is basically a Java implementation of the Python closure lambda z,y=y,c=c:add(z,y,c), in twenty-four lines! Using this architecture, I'd have to create [function]Continuation classes for every function I want to wrap in a Continuation. So, while I can implement continuations and closures in Java, there's a lot of boilerplate code. (Steve Yegge has some interesting and funny comments on this.)
Tuesday, April 04, 2006
Book 11: Use of Weapons (Banks)
Stay away from internet discussions of this book until you've read it. It's very spoiler-vulnerable. That said, this is the best Banks I've read. Better than Consider Phlebas, maybe not quite as good as Player of Games. There's a lot more humour in this one, too. Skaffen-Amtiskaw's gift to Zakalwe is truly hilarious. I recommend it.
Windows NT Command Completion
I can't believe I've lived without command completion in NT for so long! You can turn it on by setting HKEY_CURRENT_USER/Software/Microsoft/Command Processor/CompletionChar to x00000009
Monday, March 13, 2006
OCaml is Really Cool
Book 10: Good Omens (Pratchett & Gaiman)
Fairly amusing. I see way more Pratchett than Gaiman in it.
Book 9: The Dark is Rising (Cooper)
Another children's book. Nothing but plot. Too many kings for my taste.
Monday, February 27, 2006
Book 7: Consider Phlebas (Banks)
Pretty disappointing. About the first third was (intentionally?) funny; the mostly-incompetent gang of raiders. The food cult was creepy. The warp animal was pretty cool. But after that it was mostly-boring running around in tunnels and fighting.
"Player of Games" was much better.
"Player of Games" was much better.
Tuesday, February 21, 2006
Book 6: The Player of Games (Banks)
Really good Culture novel. Gurgeh's realization of the true nature of the empire is fantastic.
Wednesday, February 15, 2006
Being and Doing
A philosophical question: which is first, being or doing? If you say "being", then you have a problem, because nothing can exist without doing (affecting something else). Byt if you saying "doing", then you have a problem, because how can something act (affect other entities) without existing?
The way we experience the world around us however, is characterized by doing preceding being. We experience actions and then conclude that other things exist. So we infer existence from actions.
The way we experience the world around us however, is characterized by doing preceding being. We experience actions and then conclude that other things exist. So we infer existence from actions.
Wednesday, February 01, 2006
Monday, January 30, 2006
Sunday, January 22, 2006
AJAX and PHP Trial
Article from IBM, Apache/MySQL/PHP/etc. install from XAMPP, PHP help from the PHP people. Works like a charm. I wonder whether I can substitute Ruby for PHP.
Book1: War & Peace
Finished War & Peace eventually. Spiritual ecstasy through fear of death. War as outcome of desires of a people.
Subscribe to:
Posts (Atom)