Scala on .NET via IKVM

This post will show you how to get started with writing Scala code and running it on the Mono and .NET runtimes, using a JDK re-implementation called IKVM.

So the Scala language has been gaining a lot of traction lately, mostly due to Twitter adopting it for their Kestrel messaging back-end as well as other open source projects. Another major reason why Scala is becoming increasingly relevant is the lack of velocity with which the Java community process has been incorporating various trendy language features, such as delegates, closures, and many more. There are many advantages you get when migrating from Java to Scala. So how about getting all of those and sticking close to your platform of choice, .NET?

Apparently an attempt was made to allow Scala to run over .NET, called Scala.NET. It is basically far from being production ready and only supports Scala 1.4, whereas what I'm going to show is verified to run on Scala 2.8 RC7.

1) Download the latest IKVM from SourceForge (I used 0.42.0.6)
2) Download the latest Scala from scala-lang (I used 2.8 Release Candidate 7)
3) Download a recent Java JDK and JRE (I used v1.6).
4) Write a Scala application in your favorite IDE, e.g. Netbeans
(Note: Use plugin manager in Netbeans to download Scala IDE support)
A typical app looks like this:

package myscalaapp

object Main{
def main(args: Array[String]): Unit = {
println("Hello Scala on .NET!!!")
}}


5) Build your project to create myscalaapp.jar
6) Copy myscalaapp.jar and scala-library.jar to your IKVM folder
7) Execute

ikvmc -target:exe -recurse:scala-library.jar myscalaapp.jar

8) Run myscalaapp.exe

Hello Scala on .NET!!!

Good times.

NHibernate with csharp-sqlite embedded C# database

Following my [NH-2120] post on JIRA, I decided to make another post here, just in case I need it in the future. Maybe for instance my driver does not get accepted for whatever reason.

So what I have done is created a driver for the managed embedded SQLite C#/.NET re-implementation database called C#SQLite (see csharp-sqlite project) and have tested this with the latest versions of csharpsqlite and NHibernate (2.1.2.GA using the SQLiteDialect).

This database re-implementation is really bringing together a number of very attractive things, such as fully managed code, .NET 2.0 requirement only, multi-platform support via Mono, OK performance, embeddable, etc, etc. So download a copy of the latest database and ADO.NET provider first.

Then you need the NHibernate sources. Open them up and create a new driver file in NHibernate.Driver called CsharpSqlite.cs

Once the driver file (link 1, link 2) is included/pasted in the project, I had to recompile NHibernate and NHibernate.Bytecode.LinFu (you may want to recompile the bytecode provider of your own choice e.g. Castle). I'm using it with 2.1.2.GA currently and C#-SQLite version 3.6.22 (latest at the moment) without problems. EDIT: The very latest version (3.6.23) is broken, I'm investigating this and will submit a patch. In the mean time, use my 3.6.22 binary.

For your own project, the usual NHibernate libraries need to be referenced, consult NHibernate documentation for this. But make sure you include the assemblies "Community.CsharpSqlite" (SQLite managed implementation) and "Community.CsharpSqlite.SQLiteClient" (the ADO.NET provider), both available from noah.hart's csharp-sqlite webpage (EDIT: use my binary above!).

Some of these libraries (e.g. CSharp SQLite itself as well as the Client) appear to target .NET 3.5, but setting them all to .NET 2.0 caused no compilation errors and they worked just fine for me.

Enjoy!

NHibernate embedded managed C# database

I was looking for an embedded cross-platform managed database to use for a C# .NET 2.0 project of mine and I was surprised to find out how difficult it was to find one. After you read this post, I hope that you will have discovered a new and exciting choice.

In my search I encountered the following posts:

(sources: Embedded database for .NET SO question, C#/.NET single user database SO question, Good "mobile" database .NET database SO question, Observations on embedded databases by Ayende, as well as many others)

The major options available seemed not good enough for various reasons:

SQLite: It's basically a native library with a x86-only requirement.
SQL Server CE: It's not thread safe and hangs periodically.
VistaDB: Commercial database.
SharpHSQL: No NHibernate support as of yet.
Firebird: Windows only.

The list goes on. Basically all available options either lacked a NHibernate support, or were not cross platform, or required installation, etc.

So when I stumbled upon this little gem called C#Sqlite (csharp-sqlite) which is a C# re-implementation of the latest SQLite database, I thought that my search was over. Alas, this embedded, managed, cross-platform (.NET/Mono) database (which also has an OK performance) was not possible to use with NHibernate, due to the lack of a driver.

I have posted an NHibernate driver for CsharpSqlite [NH-2120], so there, now you can use NHibernate with this wonderfully compact database which fits the bill for all of the above requirements.

I hope you enjoy it!

SyncMaster 2232bw on Windows 7 1680 x 1050 ATI 3850 AGP

On Windows 7, to get the 1680 x 1050 resolution running on a Samsung SyncMaster 2232BW attached to an ATI 3850 AGP graphics card, you will need two pieces of software:

- The Samsung SM 2232BW driver, from here
- The ATI Catalyst driver (9.1 or over) from here

This is the installation process:
- First, install the ATI driver and reboot
- Then install the Samsung driver
- Select the Analog (and not Digital) version
- Force the mode in the ATI Catalyst Control Center

Sound in Ubuntu using the VIA VT1708/A on-board sound card

The Ubuntu 9.10 (Karmic Koala) distribution is an almost flawless and amazing distro for desktop use, despite what some say.

Unfortunately, owners of the Asrock 4CoreDual SATA2 motherboard will face sound problems though due to the lack of support for Linux by the manufacturer. Shame on them, they should not be ignoring Linux as a valid OS.

Despite this, there is a workaround for getting the VIA VT1708/A [Azalia HDAC] High Definition Audio Controller to work.

1) Install the "alsa-oss" package using the Synaptic package manager. (v1.0.17-1 at the time of writing)
2) Right-click on the audio icon (top left of desktop) and click "Preferences"
3) At the bottom, change the Profile to "Analog Output" or "Analog Output Duplex". You may choose any surround profiles supported if you have the right speakers. That's it!

Enjoy your Karmic Koala audio.

Ubuntu xorg.conf: 1680x1050 with Ati 3850 AGP on 22" Samsung Syncmaster 2232BW

Following my previous post on getting Kubuntu 9.04 (Jaunty Jackalope) working on a 22" screen using 1680x1050 (and NVidia drivers) I'm going to post how I got a Ubuntu 9.10 (Karmic Koala) 1680x1050 resolution on a 22" screen (for ATI 3850 AGP).

I found out that using xrandr is by far the easiest and most sure-fire way of configuring obscure resolutions for Ubuntu. So this post is applicable even if your resolution is not the aforementioned, but it is obscure enough not to be available on the default display resolutions list provided by either Ubuntu or your graphics card manufacturer.

So this is how this works. Running xrandr gives us a bunch of info about the currently supported resolutions. Note that 1680x1050 is not there:

$ xrandr

Screen 0: minimum 320 x 200, current 1600 x 1200, maximum 1600 x 1600
DFP1 disconnected (normal left inverted right x axis y axis)
DFP2 disconnected (normal left inverted right x axis y axis)
CRT1 connected 1600x1200+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
1600x1200 60.0*+
1400x1050 60.0
1280x1024 60.0 47.0 43.0
....

To add a new mode, first you must establish the modeline, so do this:

$ cvt 1680 1050 60.0Hz
# 1680x1050 59.95 Hz (CVT 1.76MA) hsync: 65.29 kHz; pclk: 146.25 MHz
Modeline "1680x1050_60.00" 146.25 1680 1784 1960 2240 1050 1053 1059 1089 -hsync +vsync

Now we can use the modeline to create and then add a new mode:

$ xrandr --newmode "1680x1050_60.00" 146.25 1680 1784 1960 2240 1050 1053 1059 1089 -hsync +vsync
$ xrandr --addmode CRT1 1680x1050_60.00


That's it! Now simply backup your /etc/X11/xorg.conf and run your graphics card manufacturer's utility (e.g. ATI Catalyst Center) and the new mode should be there. Do not use the built-in Ubuntu display manager (System->Preferences->Display) as it will overwrite your xorg.conf and mess up your resolution in the process!

The resulting xorg.conf for my setup was the following:

$ more /etc/X11/xorg.conf
Section "ServerLayout"
Identifier "amdcccle Layout"
Screen 0 "amdcccle-Screen[1]-0" 0 0
EndSection

Section "Files"
EndSection

Section "Module"
Load "glx"
EndSection

Section "Modes"
Identifier "16:10"
ModeLine "1680x1050 (GTF)" 147.1 1680 1784 1968 2256 1050 1051 1054
1087
EndSection

Section "Monitor"
Identifier "Generic Monitor"
UseModes "16:10"
HorizSync 30.0 - 83.0
VertRefresh 60.0 - 60.0
Option "DPMS"
EndSection

Section "Monitor"
Identifier "0-CRT1"
Option "VendorName" "ATI Proprietary Driver"
Option "ModelName" "Generic Autodetecting Monitor"
Option "DPMS" "true"
Option "PreferredMode" "1680x1050"
Option "TargetRefresh" "60"
Option "Position" "0 0"
Option "Rotate" "normal"
Option "Disable" "false"
EndSection

Section "Device"
Identifier "Default Device"
Driver "fglrx"
EndSection

Section "Device"
Identifier "amdcccle-Device[1]-0"
Driver "fglrx"
Option "Monitor-CRT1" "0-CRT1"
BusID "PCI:1:0:0"
EndSection

Section "Screen"
Identifier "Default Screen"
Device "Configured Video Device"
Monitor "Generic Monitor"
DefaultDepth 24
SubSection "Display"
Depth 24
Modes "1680x1050"
EndSubSection
SubSection "Display"
Depth 16
Modes "1680x1050"
EndSubSection
EndSection

Section "Screen"
Identifier "amdcccle-Screen[1]-0"
Device "amdcccle-Device[1]-0"
DefaultDepth 24
SubSection "Display"
Viewport 0 0
Depth 24
EndSubSection
EndSection

NHibernate cheat sheet using Attributes

A few common mapping examples when using the NHibernate ORM with Attributes.

Class

This is a required attribute for all Entity classes:
[Class(NameType=typeof(Being),Table="Being",Lazy=false)]
public class Being ...

Id
All classes should specify a unique table identifier:
[Id(0, Name="Id", Column="Id")]
[Generator(1, Class="native")]
public long Id
{
get;
set;
}


Sub-classing (joined table per sub-class)
When extending a class you can use 3 types of subclassing that NHibernate recognises. For subclassing by creating a table per sub-class use:
[JoinedSubclass(NameType=typeof(BusinessContact),
ExtendsType=typeof(Being),
Table="BusinessContact", Lazy=false)]

public class BusinessContact : Being ...

In this case sub-classes must override the Id property:
[Key(Column = "Id")]
public override Id {
get { return base.Id; }
set { base.Id = value; }
}


One to One
Use this when a one-to-one association is required between two classes (in this case PrintingSettings is within a BulkPrintingJob class):
[Key(0, Column = "BulkPrintingJobId")]
[OneToOne(1,
ClassType = typeof(PrintingSettings),
Cascade = "save-update")]

public virtual PrintingSettings Settings
{
get;
set;
}


One to One v2
Similar to above but for same class types ('Address') e.g. linked lists. Set to unique and contained within another Address.
[ManyToOne(0, ClassType = typeof(Address),
Cascade = "none",
Unique = true)]

public Address PreviousAddress
{
get;
set;
}


One to Many
Typically used for holding multiple objects relating to an object. Example where a business contact has multiple email addresses:
[Bag(0, Cascade = "all-delete-orphan", Lazy = false)]
[Key(1, Column = "BusinessContactId")]
[OneToMany(2, ClassType = typeof(Email))]
public IList Emails { get; set; }

Many to Many (IList example)
An example where categories have accessors who can access these:
[Bag(0, Cascade = "none", Lazy = false)]
[Key(1, Column = "CategoryId")]
[ManyToMany(2, ClassType = typeof(Accessor))]
public IList Accessors
{
get;
set;
}


Many to Many (Array example)
Example where a group has group members (uses Arrays instead of ILists):
[Array(0, Cascade = "none")]
[Key(1, Column = "BeingGroupId")]
[Index(2)]
[ManyToMany(3, ClassType = typeof(Being),
Column = "_beingId")]

public Being[] GroupMembers
{
get;
set;
}


Many to One (& parent/child)
An example where a BeingGroup contains other BeingGroups.
[ManyToOne(0, ClassType = typeof(BeingGroup),
Cascade = "none")]

public BeingGroup Parent
{
get;
set;
}