Tim MacFarlane posts on continuations in C# (be sure to continue). Java 7 cannot come quickly enough.
Wednesday, February 17, 2010
Monday, February 15, 2010
I require a ... subtle Scala
C++ is complex in part because it is multi-paradigm. That is, C++ supports many styles of programming. It is a rabbit hole, but a necessary one—no one likes to hear "sorry, you can't do that".
Scala is so exciting a follow-on to Java in part because it too is multi-paradigm. Witness Jesse Eichar on self-annotation:
- class Base {
- def magic = "bibbity bobbity boo!!"
- }
- trait Extender extends Base {
- def myMethod = "I can "+magic
- }
- trait SelfTyper {
- self : Base =>
- def myMethod = "I can "+magic
- }
But the two are completely different. Extender can be mixed in with any class and adds both the "magic" and "myMethod" to the class it is mixed with. SelfType can only be mixed in with a class that extends Base and SelfTyper only adds the method "myMethod" NOT "magic".
Why is the "self annotations" useful? Because it allows several provides a way of declaring dependencies. One can think of the self annotation declaration as the phrase "I am useable with" or "I require a".
Java is my daily bread and butter (and puts food on the table). There is no easy way in Java to express this subtle point of inheritance—delegation is the closest you come.
In C++ the template system lets you parameterize your base class which you cannot of course do in Java:
template<class T>
class template_base_class : public T
{
};
Saturday, February 13, 2010
Billions and billions
Lambda the Ultimate brings me A Few Billion Lines of Code Later: Using Static Analysis to Find Bugs in the Real World. These fellows have a wicked dry sense of humor. Typically:
We thought this approach was bulletproof. Unfortunately, as the astute reader has noted, it requires a command prompt. Soon after implementing it we went to a large company, so large it had a hyperspecialized build engineer, who engaged in the following dialogue:
"How do I run your tool?"
"Oh, it's easy. Just type '
cov-build' before your build command.""Build command? I just push this [GUI] button..."
Hilarity ensues. Unfortunately the article generated only one comment:
I hugely enjoyed this article. I can't think when I last read an article that made so many important points. Thanks for not sugar-coating the description of real-world problems and real solutions. And thanks for not drowning those points in jargon.
— Bjarne Stroustrup, January 29, 2010
Happy President's Day.
Tuesday, February 09, 2010
Scala is Java, or how to grow to love the bomb
Twitter's Nick Kallen posts Why I love everything you hate about Java, a satisfying read about Scala, scaling and design patterns in the real world. More authors (including myself) should post like this.
That he dispenses with explanation why a Java article is really about Scala evidences this fact: Scala is Java, or what Java could have become in a better universe.
UPDATE: Why I love the blogosphere, also entitled Why I hate everything you love about Java courtesy of Roman Roelofsen.
Wednesday, February 03, 2010
Snakes on the backplane
This presentation is so delightful, I weep that I was not present. And when I thought it could not get better, I learned the term duck-punching. Where have I been?
Tuesday, February 02, 2010
Scala on Cygwin: Help from Andrew Beacock
Andrew Beacock posts exactly the advice I needed: how to get the scala prompt working on Cygwin. Thanks!
Google has the best Java engineers
Are you reading Jeremy Manson? Why not? (Hint: yet another reason finalizers are wrong even if Gosling won't say it. Alternatives here.)
Monday, February 01, 2010
Against magic
A wonderful post against magic by Stephan Schmidt.
Remember: If you don't understand it, don't use it.
Monday, January 25, 2010
The Rosetta stone, what a paper
I am really enjoying this paper by John Baez (yes, that John Baez) and Mike Stay. My background is in physics (and music) and the crossing of physics, topology, logic and computation is too much to keep to myself. I hope you enjoy it, too.
Friday, January 15, 2010
Update on Google Phone saga
An update from Google on my continuing Google phone quest:
XXX YYY has posted an answer to the question "Ineligible to purchase phone: T-mobile contract changed too recently": Howdy binkley, We've listened very carefully to everyone's feedback and concerns regarding the upgrade issue and are working with our partners to improve the situation for existing customers. In all instances, Google's web store only passes your information along. The carrier then determines eligibility for a full or partial upgrade, as your service contract is with the carrier. You must be fully upgrade eligible in order to get this device at a discount. Stay tuned for more updates about upgrading! In the meantime, you can use the sticky post at the top of this forum to get the latest information and share any more thoughts you may have: http://www.google.com/support/forum/p/Google+Mobile/thread?tid=3c0fd3870ec370a8all Cheers, -XXX
UPDATE: I've received a variant of this text in a second message from another Google employee. It's good they are trying to deal with this mess. I should not be surprised at the form letter template employees work from.
Wednesday, January 13, 2010
Rusty Java: in-place updating a collection while iterating
Some areas of my Java grow rusty with time, as with all things. This code looks nice, but completely fails:
public static void main(final String... args) {
final Set<Foo> foos = new HashSet<Foo>(asList(FOO));
for (final Foo foo : foos)
foos.addAll(foo.more);
System.out.println("foos = " + new HashSet<Foo>(foos));
}
enum Foo {
QUUX,
BAZ(QUUX),
BAR(BAZ),
FOO(BAR, BAZ);
private final Set<Foo> more;
Foo(final Foo... more) {
this.more = new HashSet<Foo>(asList(more));
}
} The goal is to collect all transitive dependencies. What is wrong?
The iterator is not a "current picture" of the collection; it is a snapshot. This code prints only foos = [FOO], updates vanish. Changing to ArrayList only worsens things with the dreaded ConcurrentModificationException.
Correct is to use a list iterator and be careful with cursor position:
public static void main(final String... args) {
final List<Foo> foos = new ArrayList<Foo>(asList(FOO));
final ListIterator<Foo> lit = foos.listIterator();
while (lit.hasNext())
for (final Foo foo : lit.next().more) {
lit.add(foo);
lit.previous();
}
System.out.println("foos = " + new HashSet<Foo>(foos));
} This prints foos = [QUUX, BAZ, BAR, FOO] with the happy side effect of depth-first ordering.
Tuesday, January 12, 2010
Class token nuisance
Fabrizio Giudici posts a nice description of type-safe map keys, a clever way to simplify life for an API user.
It exposes one of the nuisances of class tokens:
@Nonnull
public <T> T get (final @Nonnull Key<T> key)
throws NotFoundException
{
return NotFoundException.throwWhenNull(
(T)itemMap.get(key), "Not found: " + key);
} (Kudos to him for using JSR-305 annotations.)
See the cast (T)? That generates a compile-time warning (link just one of many complaints around this). The correct way to get ride of this warning is to use a class token:
@Nonnull
public <T> T get (final @Nonnull Key<T> key)
throws NotFoundException
{
return NotFoundException.throwWhenNull(
key.cast(itemMap.get(key)), "Not found: " + key);
} Where the Key<T> type is redefined:
@Immutable
public final static class Key<T>
implements Comparable<Key<T>>
{
@Nonnull
private final String name;
@Nonnull
private final Class<T> type;
protected Key (final @Nonnull String name, final @Nonnull Class<T> type)
{
this.name = name;
this.type = type;
}
public T cast(final Object that)
{
return type.cast(that);
}
@Override
public int compareTo (final @Nonnull Key<T> other) { ... }
@Override
public boolean equals (final @CheckForNull Object object) { ... }
@Override
public int hashCode() { ... }
} What a nuisance.
Saturday, January 09, 2010
ANI, not your usual language
This is interesting: anic, a compiler for the language ANI. It is really the language which is the interesting part, of course.
ANI is automatically parallelizing, and very non-inperative. In its own buzzwords: experimental, high-performance, statically-safe, fully implicitly parallel, object-oriented, general-purpose dataflow programming language.
Take a breath now.
Thursday, January 07, 2010
Bad fanboi - no gphone
Continuing my Nexus One story...
So far I cannot get a Google phone. At first the site did not like my T-mobile family plan. So I went from $60/mo. to $130/mo. to break up our plan into a his/hers data/voice plan.
Now Google still does not like my T-mobile plan:
You are not eligible for an upgrade at this time.
You are not eligible because your current contract was initiated too recently.
No love from Google.
IntelliJ and Scala
Thomas Jung writes about using IntelliJ and Scala and is very enthusiastic, as he should be: IntelliJ IDEA remains the best IDE.
I've long been pessimistic of IDEA retaining this position in the face of thousands of Eclipse code monkeys eventually typing the works of Knuth, but JetBrains has admirably kept up.
The struggle between the cathedral and the bazaar continues.
UPDATE: When it rains, it pours.
Wednesday, January 06, 2010
Those lucky web developers
Those lucky web developers have it so good. Automated functional testing for enterprise integration middleware is a complete pain. You try simulating a dozen distinct systems. Helps keep me warm at night just thinking about it.
Actor thinking from Kresten Krab Thorup
Kresten Krab Thorup posts a long think on objects and processes, full of great references, which I enjoy. Maybe you will, too.
Tuesday, January 05, 2010
isolate: a new tool for my toolbox
Nexus One URL almost there
What is the typical error page for a bad link into Google, say, http://www.google.com/bobsyerunkel? But for http://www.google.com/phone I get a prosaic default 404 page, perhaps in preparation for something more interesting later today.
UPDATE: Not happy! http://www.google.com/phone works now, but T-mobile is disabled as a choice. Only the unlocked phone is offered:
This was my Christmas present from my wife!
UPDATE #2: I was premature. The T-mobile option now works, very nicely, too. However, it checked my existing T-mobile phone number and said family plans were not eligible. Time to confer with the wife.
UPDATE #3: Spent 20 minutes on line with T-mobile. She was courteous and did her best, but management left them unprepared for Nexus One release beyond a cursory memo. Several checks with different supervisors, still no answer on how to split family plan, add Nexus One plan for myself. There's always tomorrow.
Monday, January 04, 2010
Revisiting an old post: mixing OSGi, Scala, et al with pax
I overlooked the coolness of Brian Murphy's post the first time I ran across it: OSGi With Scala, Java, Groovy, Maven and PAX. As I am playing with OSGi, guice and peaberry, I ran across his instructions and was struck by how straight-forward pax makes everything.
My contribution to the conversation, bootstrapping a peaberry project:
$ pax-add-repository -i google-maven-repository \
-u http://google-maven-repository.googlecode.com/svn/repository
$ pax-add-repository -i ops4j.releases \
-u http://repository.ops4j.org/maven2
$ pax-import-bundle -g com.google.inject -a guice -v 2.0
$ pax-import-bundle -g org.ops4j -a peaberry -v 1.1.1
$ pax-create-module -a wrappers
$ cd wrappers
$ pax-wrap-jar -g aopalliance -a aopalliance -v 1.0
$ cd ..
$ pax-create-bundle -p $your_groupId -n $your_artifactId This presumes a simple project with only one module ("$your_artifactId").
Top notch post on JDK 1.6 update 14 optimizations
A really good post on JDK 1.6 update 14 optimizations: lock coarsening, biased locking and escape analysis. Found via the Java Specialist newletter.
Sunday, January 03, 2010
Wednesday, December 30, 2009
Nexus One: Buy from Google, not T-mobile
I just spoke with my friendly T-Mobile customer care specialist. She was direct and helpful. Point blank I asked to pre-order a Nexus One and sign up for the matching phone plan. As expected, she could not help me with that. But she did tell me some interesting tidbits:
- T-mobile considers it an HTC phone, not a Google one
- T-mobile has not yet given customer service details on the phone, but my specialist did know about it
- T-mobile will not be selling the phone directly; she said I needed to order it from Google, not T-mobile
Anticipation is a great selling device.
Android load webby
My first Android project, AndroidLoad, is very simple. It reads /proc/loadavg every second and and updates a table with the data.
Achieving this much in a single day of browsing and code noodling, I hope to make something more interesting with it soon. So far, Android+IDEA has been a real pleasure to develop with, and I expect the IDE integration to continue improving.