2009-11-01

Eclipse button clicks in Ubuntu 9.10 (Karmic)

Since upgrading to Ubuntu 9.10, I found that some buttons in Eclipse can't be mouse clicked any more. It's usually possible to click them using the space bar, but...

Many thanks to moma for posting a solution on Launchpad!

Start eclipse with
$ cd eclipse
$ export GDK_NATIVE_WINDOWS=true
$ ./eclipse

Or use this one liner:
$ GDK_NATIVE_WINDOWS=true $HOME/eclipse/eclipse

2009-09-26

How to display a directory listing in Google App Engine

Google App Engine is really not meant to serve up a lot of static content; but sometimes you just want to!

If you put a directory full of stuff into your web archive and point your browser at it, AppEngine will tell you there's nothing there. It's possible to change that, though.

The following instructions are for the Java incarnation of AppEngine; I would imagine you can do something equivalent in the Python engine, but I don't know any details.
  • Make sure your directory and its children are marked as "static" in appengine-web.xml :
  • style-span" style="font-family: 'Times New Roman'; font-weight: normal;">Map your directory to Jetty's default servlet within web.xml :
    <static-files>
          <include path="/*.css"/>
          <include path="/favicon.ico"/>
          <include path="/code/**"/>
       </static-files>
    
  • Next, tell Jetty in web.xml to accept directory requests:
    <context-param>
          <param-name>org.mortbay.jetty.servlet.Default.dirAllowed</param-name>
          <param-value>true</param-value>
    </context-param>
    
  • Finally, define Jetty's "default" servlet in web.xml to accept directory requests:
    <servlet>
          <servlet-name>default</servlet-name>
          <servlet-class>org.mortbay.jetty.servlet.DefaultServlet</servlet-class>
          <init-param>
             <param-name>acceptRanges</param-name><param-value>true</param-value>
          </init-param>
          <init-param>
             <param-name>dirAllowed</param-name><param-value>true</param-value>
          </init-param>
          <load-on-startup>0
       </servlet>
    
       <servlet-mapping>
          <servlet-name>default</servlet-name>
          <url-pattern>/code/*</url-pattern>
       </servlet-mapping>
    

  


... and that's more or less it!

2009-09-23

My Eclipse settings

Eclipse is a great Java IDE. There are just a few things I don't like about its default configuration. Fortunately, it's highly configurable.
  • Preferences
    • General
      • Ant
        • Editor
          • Formatter
            • Tab size: 3
            • Use tab character instead of spaces: uncheck.

      • Editors
        • Displaced tab width: 3
        • Insert spaces for tabs: Check.
        • Show line numbers: Check.
        • Text Editors
          • Spelling
            • Enable spell checking: Uncheck.


    • Java
      • Code Style
        • Qualify all generated field accesses with 'this.': Check.
        • Formatter: new profile "carl"
          • Indentation
            • General settings
              • Tab policy: Spaces only
              • Indentation size: 3
              • Tab size: 3


      • Compiler
        • Errors/Warnings
          • Potential programming problems
            • Serializable class without serialVersionUID: Ignore

      • Editor
        • Folding
          • Initially fold
            • Imports: uncheck.


2009-09-03

Substring labels in Blogger

Have you ever tried giving your blog post multiple labels, one of which is a substring of the other?

Example: spring security, spring.

Once Google Blogs has latched on to the longer string, it will move heaven and earth to auto-complete the shorter one for you.

One solution is to add a comma immediately after the short string. Auto-completion won't try to overrule you then.

2009-07-30

Table height = Browser window height WITHOUT quirks mode!

In spite of all the CSS hype, I still occasionally like to use tables to lay out a page. I think there are some layout situations where a table lets you do things CSS layouts don't.

For a long time, I've been despairing about the apparent impossibility of getting a page to fill the browser screen, or a known proportion of it, independently of the user's browser window size and without using JavaScript.

It used to be that a table at 100% height would fill the screen vertically. However, this was a "feature" of the so-called "quirks mode." If you build a Web page with a "proper" DOCTYPE, you hint to the browser that you know how to build standards compliant Web pages, and in return it renders your page more or less rigidly according to the standard.

This is very thoroughly explained by Gary White on the AppTools site .

The good news is, there's a standard compliant workaround. You can use CSS to set the height of the <html> and <body> elements of the page to 100%; their parent is the screen, so they will. Then you can use CSS to set the height of your table to 100%, and it will fill your screen.

2009-07-22

import static in a JSP

I have yet to try this, but according to this post on the GlassFish forum, the way to do an "import static" in a JSP is like this:

<%@ page import="static foo.*" %>

Implementing an interface in a JSP

I've scoured the net, but apparently it's not possible to make a Java Server Page implement an interface. Not directly, anyway.

What is possible is to extend a class. The directive is:

<%@ page extends="package.class"%>


One reference for JSP page directives is: http://java.sun.com/products/jsp/tags/11/syntaxref11.fm7.html .

The class generated from a JSP usually extends HttpServlet. If you really want to have your JSP implement an interface, you could do something like

public abstract class
my.package.MyJSP extends HttpServlet implements MyInterface {

}

... and then use "my.package.MyJSP" in a "page extends" directive as shown above.

The caveat to this is that some Web containers will generate their own subclasses of HttpServlet, presumably for some kine of optimization, and using the "page extends" directive will sabotage this scheme. It should still work, it just won't include the fancy footwork your Web container intended to do.

2009-05-01

Getting the 'wicket:id' attribute to validate

Wicket is great. The "wicket:id" attribute is all that needs to be added to a tag to place it under program control.

If you have a finicky validator (or any validator), it may object to the attribute, which isn't part of (X)HTML.

The solution is to add a namespace declaration, like this:

<html xmlns:wicket="http://wicket.apache.org">

Mixing Java and Scala in an Eclipse Project

If you start a project off as a Scala project, then it's OK to mix in some Java source. Everything will be compiled as appropriate, and library references will work out too.

But for some projects, such as the "Dynamic Web Project," that's not an option. You must convert it to a Scala project after it's created as a Java project.

Fiddling with the contents of .project manually didn't get me anywhere.

The correct procedure, as found on Nabble, is:

As a general rule you should convert Java projects to Scala projects
by using the "Add Scala Nature" package explorer context menu action
unless you know what you're doing.

2009-04-18

Simulating a manual window close

w.getToolkit().getSystemEventQueue().postEvent(new WindowEvent(w, WindowEvent.WINDOW_CLOSING));

obtained (with thanks) from: http://forums.java.net/jive/thread.jspa?threadID=35565

This will fire the WindowClosing event, so you can execute any action you may have bound to that event.

2009-02-18

German Keyboard, VMWare, Ubuntu host

There are lots of things that can go wrong with this.

The most helpful hints I could find were here and here.

Following this advice, I edited my ~/.vmware/config file to look like this:

xkeymap.nokeycodeMap = true
xkeymap.keysym.ISO_Level3_Shift = 0x138
xkeymap.keysym.braceleft = 0x1a
xkeymap.keysym.braceright = 0x1b


I think the second line is the most important for my German keyboard, as it maps the AltGr key.

2009-01-02

TightVNC Port Number Gotcha

TightVNC is great if you want to remote-control someone else's PC without resorting to MS' Remote Desktop solution.

Something that cost me about an hour's worth of frustration, though, is their way of specifying an alternative to the standard port (5900):

You either

  1. specify an alternate screen number (a small integer, e.g. 5 means screen 5 means port 5905); or

  2. explicitly specify an alternate port, e.g. 5905 .


Alternative 1 is selected with a colon between the host address and the screen number, e.g.

66.66.66.66:5

To specify an alternate port, you need to insert two colons:

66.66.66.66::5905

Because colons are just tiny freckles on the screen, especially in proportional fonts, this is easy to overlook in the documentation. Many other utilities (and URLs) use single colons before a port number, so habit has us do the wrong thing by default.