Oct 20 2007

Possible regression in Java 6 DisplayMode functionality on Ubuntu Gutsy

Tag: C/C++, Java, Linux, UbuntuDan @ 2:06 am

I upgraded my desktop machine to Gutsy today to have a play with it before upgrading my laptop. I’m really glad I did it in this order as it appears there may be a regression in the version of Java 6 shipping on Gutsy.

I happened to test out a Java game which uses Full Screen Exclusive Mode with a DisplayMode of 800×600. So far this app has been working ok on Feisty but when I tested it today on Gutsy it couldn’t change display mode. I discovered that Java was only able to see the current screen mode of 1280×1024 and no others.

I’ve opened a bug on Launchpad here: #154613: Java cannot change display modes / screen resolution in Gutsy, and I’ve been digging in trying to work out what’s going wrong.

I managed to locate the JNI function call in Java’s native C source code where it gets the list of modes. It’s called Java_sun_awt_X11GraphicsDevice_enumDisplayModes(...) and is in the file j2se/src/solaris/native/sun/awt/awt_GraphicsEnv.c. As expected the Ubuntu packages are built from the Sun Linux binaries - no source code. I couldn’t find the Java 6 source on Sun’s site, the link appears to be wrong. Instead I found the file in the Icedtea/OpenJDK source tree. Icedtea on Gutsy has the same problem so I’m fairly happy this is the the same or roughly the same code as in Java 6.

The function makes use of the XRandr Xorg extension to query the available display modes. I coded up a small test to see if XRandr was behaving correctly. It is, on both Gutsy and Feisty. So it looks like it could be something in Java 6 u3.

Will keep digging, as I really need this to work.


Jul 27 2007

Useful Talk on Packaging Java Applications for Ubuntu/Debian

Tag: Java, Linux, Software Engineering, UbuntuDan @ 6:56 pm

Came across an excellent JavaOne conference session on software packaging for Ubuntu/Debian. It has a specific focus on packaging Java software but I found it gave an excellent general insight into the process of getting a piece of software, commercial or free, into the Ubuntu repositories. The main example used was the experience of the Sun engineer Harpreet Singh who was responsible for packaging the Glassfish application server which is now available in the Ubuntu multiverse repository.

Here’s the link, you will need a Sun Online account to access the talk:

JavaOne Technical Sessions - Packaging Java Platform Applications into Ubuntu


Dec 15 2006

HOWTO: Installing Netbeans 5.5 on Ubuntu

Tag: HOWTO, Java, Linux, Software Engineering, UbuntuDan @ 11:19 pm

Netbeans is not currently available in the Ubuntu/Debian repositories. I believe this is because it uses the Sun CDDL licence which is considered incompatible with the GPL.

However, as an end-user you may wish to use Netbeans despite that. Although it comes with a neat installer wizard I personally prefer to try to get native .deb packages where possible in order to get native package management and menu/launcher icons. I found a debian packaged version by Daniel Baumann. It appears he put it on the Debian new queue but is wasn’t accepted. He’s made the prepacked binaries available here:

http://archive.daniel-baumann.ch/debian/packages/netbeans/5.5-1/

However, I wanted to learn something so I decided to try building a package using the current 5.5 source dist from Netbeans archive and Daniel Baumann’s debian package source. Here are the steps I took.

Building and Packaging Netbeans 5.5 for Ubuntu

1) Grab daniel-baumann’s patch here

netbeans_5.5-1.diff.gz

2) Get the Netbeans 5.5 source from:

http://www.netbeans.info/downloads/all.php?b_id=2180&src=1

I picked up the ’source’ tgz file from the table of links at the bottom of the page.

3) Untar the sources

  1.  
  2. mkdir netbeans
  3. cd netbeans
  4. tar -zxf netbeans-5_5-ide_sources.tar.gz
  5.  

4) Now apply the patch to the sources

  1.  
  2. # first decompress the patch
  3. gunzip netbeans_5.5-1.diff.gz
  4. cd netbeans-src
  5. patch -p1 < ../netbeans_5.5-1.diff
  6.  

The patch simply installs the debian packaging kit into the Netbeans 5.5 src directory. After applying you will find the new files under the newly created debian directory. For more info on what these files do see The Ubuntu Packaging Guide or the Debian New Maintainers Guide.

6) Next build the packages and install

  1.  
  2. debuild -uc -us
  3. sudo debi
  4.  

When debuild completes there will be 2 .deb files left in the directory above:

netbeans-ide_5.5-1_all.deb
netbeans-platform_5.5-1_all.deb

debi installs both files by reading the netbeans_5.5-1_i386.changes file which will have been generated in the directory above.


Dec 15 2006

HOWTO: Packaging Java 6 for Ubuntu

Tag: HOWTO, Java, Linux, Software Engineering, UbuntuDan @ 10:18 pm

Update: As of Fri 19th Jan 07 Java 6 has now been officially included into the Dapper Backports repository. See it’s package page.

Today I found out how to package Java for Ubuntu/Debian. I wanted to see if a .deb package file of Java 6 was available for Ubuntu I found details on creating one in the following forum post: Re: JDK 6 Available…now when is a deb coming?. The instructions there are great except they don’t work perfectly for Dapper so here are the modified steps for Dapper:

1) Patch ‘java-package’

The Debian Java Maintainers have created a tool make-jpkg which is a neat script to take the Sun Java native linux .bin installer and turn it into a .deb package. This script comes in the ‘java-package’ package which is in the multiverse repo in Ubuntu.

Dapper stocks the 0.27 version which does not support conversion of Java 6 yet. However, mlind attached a patch to his forum post (link above) to add support for Java 6 to java-package version 0.28. Luckily it’s not difficult to tweak the patch for 0.27. Here’s the modified version of the patch:

java-package_sun-java6.dapper.patch

Here’s the instructions on how apply the patch and build the updated package:

  1.  
  2. mkdir java-package
  3. cd java-package
  4. sudo apt-get build-dep java-package
  5. apt-get source java-package
  6. cd java-package-0.27
  7. patch -p1 < ../java-package_sun-java6.dapper.patch
  8. debuild -b -us -uc
  9. cd ..
  10. sudo dpkg -i java-package_0.27local0_all.deb

2) Package sun-jdk6

Now that you’ve updated java-package it’s time to package Java 6. First download Java 6 from Sun. You need to download the Linux self extracting file (jdk-6-linux-i586.bin). Here are the instructions on building it (taken from the forum post listed above).

  1.  
  2. mkdir sun-jdk6
  3. cd sun-jdk6
  4. # put jdk-6-linux-i586.bin into this directory
  5. make-jpkg jdk-6-linux-i586.bin
  6. dpkg -i sun-j2sdk1.6_1.6.0_i386.deb
  7. sudo update-alternatives –config java
  8. # select the new Java 6 installation as the provider of java
  9. java -version
  10. # Output of the above command should be
  11. # java version "1.6.0"
  12. # Java(TM) SE Runtime Environment (build 1.6.0-b105)
  13. # Java HotSpot(TM) Client VM (build 1.6.0-b105, mixed mode, sharing)

Nov 14 2006

Java now Open Source under the GPL2

Tag: Java, Linux, Open Source, Software EngineeringDan @ 10:23 am

Yesterday announcements were made that Java has been released under the GPL2 Open Source licence. Here’s some of the relevant links:

Apparently it’s an early version of Java 7 that is immediately available under the new licence, this includes the Hotspot VM and the ‘javac’ compiler. However, the Java API class libraries and certain 3rd party components are still not yet open.

Personally I think this is great news. Adoption of Java has clearly been hampered on open source operating systems because it remained under a closed source licence for so long. It has allowed technologies such as Mono/.Net and Python to get ahead for development of cross platform desktop apps where Java may have a been a viable choice if only it’s licence had allowed it to be shipped along with standard packages.


Oct 02 2006

My Must-Have Applications For Ubuntu

Here’s a list of some of my favourite or most relied-upon applications on Ubuntu. It’s not exhaustive but it’s a start. It doesn’t include extras like multi-media codecs or any of the sort of things you can get easily with something like EasyUbuntu. The lists arranged by purpose and are ordered alphabetically not by preference. Some things are not available in the Ubuntu repositories and are marked as such.

Desktop

  • deskbar-applet
  • gnome-keyring-manager
  • kde-style-polymer (from external source - makes QT apps look ok on gnome, see my post here)
  • MSTCoreFonts
  • nautilus-open-terminal
  • nautilus-scripts:
    • nautilus-script-collection-svn (subversion shortcuts)
    • nautilus-script-manager
  • skype (only beta 1.3 works, needs kde-style-polymer or looks ugly, get it from www.skype.com)
  • Tomboy (desktop notes tool)
  • xnest (for nested X logins)

Development

  • apache2
  • emacs-snapshot-gtk (emacs for the gnome desktop)
  • JEdit (from external jedit repo http://dl.sourceforge.net/sourceforge/jedit)
  • java:
    • ant
    • sun-java5-*
  • meld (visual/graphical diff tool)
  • mysql:
    • mysql-server
    • mysql-client
    • mysql-admin (note a wrapper script is needed as a bug workaround on this, can’t remember the bug link just now)
    • mysql-query
  • .Net (just listing the basic dev packages here)
    • mono-devel
    • monodoc-manual
  • php5:
    • php5 (basic setup for use with apache)
    • php5-* (choose whatever extra modules you need)
    • php5-cli (command line version)
  • python
  • ruby
    • ruby
    • irb
    • lib*-ruby (pickup any of the extra packages you need)
    • ri
    • rdoc
    • rails
  • subversion
  • vim-gnome (gvim)
  • vmware-server

Networking

  • Avahi (zeroconf/bonjour)
    • avahi-daemon
    • avahi-utils
    • libapache2-mod-dnssd (to auto-advertise apache2 sites available on your machine)
    • service-discovery-applet
    • libnss-mdns
  • ethereal
  • firestarter (basic firewall manager)
  • gftp (sftp and ftp client)
  • NetworkManager
  • rdesktop (Remote Desktop and Terminal Services Client)

Sound & Multimedia

  • banshee music player
  • f-spot photomanager
  • gnomebaker (cd-burner)
  • gxine (media player)

May 24 2006

HOWTO: Getting started with Java

Tag: HOWTO, JavaDan @ 7:22 pm

This is a rough quick start guide. It was written to help a relative of mine who was starting to learn Java.

  1. Get the Java Development kit here: Java Platform, Standard Edition (Java SE). The current version at the time of writing is Java 5
  2. Once installed set the following environment variable in order to ease use of the development tools on the command line. This environment variable is used by various tools including Ant and Tomcat also.

    JAVA_HOME=[set this to the path you installed Java in]

    The default install location for Java 5 on Windows is C:\Program Files\Java\jdk1.5.0_06.

    To set permanent environment variables on Windows XP/2000:

    1. Right-click on My Computer icon
    2. Select Properties from the context menu
    3. In the dialog that appears click on the ‘Advanced’ tab
    4. At the bottom of this tab there is a button labelled ‘Environment Variables’ click it
    5. In the dialog that appears create the new environment variable in the bottom box labelled ‘System variables’ - that will set the variable for all users of the system.

    This process is completely different on Unix/Linux systems, I can describe the setup process for Redhat and Ubuntu systems in a comment if someone needs it.

  3. Next make sure the Java executable binaries are on your system path, this is so that you can use the Java tools to compile your code. On Windows modify the definition of the Path environment variable to include this at the very end (semi-colon at the beginning is required):

    ;%JAVA_HOME%\bin

    When the system loads %JAVA_HOME% will expand to the value you defined in point 2.

  4. Test the setup from above by opening a command console (Start > Programs > Accessories > Command Prompt) and type:

    java -version

    You should see the following output:


    java version "1.5.0_06"
    Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05)
    Java HotSpot(TM) Client VM (build 1.5.0_06-b05, mixed mode)

    If you don’t get that type set to list the environment variables and check that the two variables you set in steps 2 and 3 are ok.

  5. Now you are all set to start learning. I recommend starting with the Java Tutorial.
  6. For alternate/advanced coverage see Bruce Eckel’s free book “Thinking In Java”.

Advice

  • Don’t use an IDE to start coding Java. It may get you started quickly but IDEs hide a lot of the real details of how a technology works. Eventually all good developers need to understand these details; it’s quicker and easier to do this from the start. Get yourself a decent text editor and learn to use the command line tools. Once you understand how Java works an IDE such as Eclipse can be very empowering.
  • Decent editors are (IMHO on Windows): JEdit, Notepad2, Vim, of course there are many others ;)
  • When you get fed-up typing javac to compile your code learn to use Ant
  • Learn as much as you can about Object Orientated Programming

Enjoy.

This was written quickly so if you notice any mistakes or things which could be improved please add a comment and I’ll fix it.


May 06 2006

Changing screen resolution in Linux

The company I work for has recently released a Java application which makes use of the Java Fullscreen Exclusive Mode API. It works great on Windows but because of a longstanding Java bug it is unable to change the display size and suspend windowed mode on Linux. Luckily the fix for this issue has been included in Java 6 Mustang so I’ll have to download a new snapshot and test it out with that.

Anyway, while reading through the bug listing I found some hints on changing the X server screen resolution, which were a great find for me as I was wondering how I could get MPlayer to play movies in proper fullscreen mode and hadn’t justified the time to research the solution.

To change the screen resolution on Linux you need to send an instruction to the X server to switch to another of its preconfigured modes. One way is to use the Ctrl+Alt+NumPad[+|-] key combination which iterates either up (numpad +) or down (numpad -) through the available modes. The only draw back to this on my platform (Ubuntu 5.10 Breezy Badger) is that when switching to smaller resolutions it didn’t resize the Gnome desktop and open windows it just acted more like a global magnifying glass to the desktop which made it rather difficult to work in any new mode.

The best way I found is to use the RandR extension which provides a command line tool called xrandr to manipulate the screen modes. I’m not sure how widely available this extension is on other distributions but it was certainly present on my Ubuntu installation without me having to install it.

To use it to change the resolution you first need to get a list of available modes to change to. To see a list open a console and type xrandr -q. This is what gets listed for my machine:

daniel@coltrane:~$ xrandr -q
 SZ:    Pixels          Physical       Refresh
*0   1440 x 900    ( 373mm x 231mm )  *60
 1   1024 x 768    ( 373mm x 231mm )   60
 2    800 x 600    ( 373mm x 231mm )   60
 3    640 x 480    ( 373mm x 231mm )   60
 4   1152 x 864    ( 373mm x 231mm )   60
 5    640 x 400    ( 373mm x 231mm )   60
 6    512 x 384    ( 373mm x 231mm )   60
 7    400 x 600    ( 373mm x 231mm )   60
 8    320 x 480    ( 373mm x 231mm )   60
 9    320 x 400    ( 373mm x 231mm )   60
Current rotation - normal
Current reflection - none
Rotations possible - normal
Reflections possible - none

You can see that the current mode is highlighted with ‘*’. The first column in the table is the index number of the screen mode. My default has an index of 0. To change to another mode simply look up the index of the mode you want and type xrandr -s [index]. I needed to swap to 800×600 so I just typed xrandr -s 2 and the screen switched mode and most importantly also updated the layout of my desktop to fit the new screen size. To get back to the default I just typed xrandr -s 0.

After swapping to 800×600 MPlayer correctly took the entire screen in its fullscreen mode for the video clip I was playing and ran just as well as on Windows - no need to reboot back into XP to play my clips anymore! :D