It's Not Natty, It Is Nutty

On my “standard” work day I interact with Unix a lot so it seemed like a logical solution to have Linux on my machine. I used Ubuntu 10.10 and world was beautiful. Yes, some things did bother me but it worked. And after work I could always enjoy Windows 7.

Two days ago I upgraded to newest Ubuntu (11.04, nicknamed Natty). After upgrade boot seemed a little slow so I decided to do what I should have done first time - clean install. I spent one full day on fresh installation of Nutty and here are some problems I had in span of eight hours:

  • If your secondary monitor is on left, it is almost impossible to pinpoint single dot at which Unity launcher will appear.
  • Turning off auto-hide for Unity launcher causes it to be over all maximized windows and to hide their left side.
  • Applications closed without warning and without any form of crash dialog. Since this includes even calculator, I would dare to suggest that new Unity interface is to blame.
  • Once system started swapping it took Ctrl+Alt+F1 and top command to find that compiz took whooping 4.5 GB of RAM (out of 6 GB).
  • LibreCalc died every five minutes while editing relatively simple document. Recovery worked in almost 50% of cases.
  • Laptop could not wake from sleep.
  • Network connection was breaking every half an hour or so.
  • Booting took ages - easily double the time that 10.10 needed.
  • … do notice that there was a lot of smaller problems still …

I started using Linux it in nineteens with Slackware and went through my share of different distributions. I was never completely satisfied and people working with me know that I curse Linux a lot because of small bugs. But this is first time ever that I was actually unable to do my work. At the end I just rebooted into Windows XP (company issued) and did my work there.

My next step will be to take out this Natty piece of shit from laptop and to go back to Ubuntu 10.10.

P.S. I actually liked search interface in Unity. Unfortunately everything else sucks.

Custom Defined Identities

I love identity columns in database. They make great primary key for almost any table. Only situation where I hate them is when I need to import data with foreign keys. You see, you cannot manually define identity column. Or can you?

Let’s imagine SQL Server table (named SomeTable) with two columns. First one will be Id (int, identity and primary key) and second one will be SomeText (nvarchar). Then let’s try to insert some data:

INSERT INTO SomeTable(Id, SomeText) VALUES(1, 'Some text');
Msg 544, Level 16, State 1, Line 1
Cannot insert explicit value for identity column in table 'LookupDiagnosis' when IDENTITY_INSERT is set to OFF.

Like all good error messages, this one already offers solution. We need to manipulate IDENTITY_INSERT option. Let’s try again:

SET IDENTITY_INSERT SomeTable ON
INSERT INTO SomeTable(Id, SomeText) VALUES(1, 'Some text');
SET IDENTITY_INSERT SomeTable OFF

With this little trick importing data with identity columns becomes much easier.

P.S. Just remember that you cannot have IDENTITY_INSERT set on more than one table at a time.

P.P.S. This option is also great for filling gaps left in identity column by deleted rows or canceled transactions.

Moonlight 4

Illustration

Lately big part of my day is working on Linux. Usually there are no issues. As long as I stick to web applications I am mostly ok.

Here comes the problem. For their PDC conference Microsoft decided to use Silverlight. Since I wanted to check a video or two and Microsoft is proud of Silverlight being supported on every possible platform I thought that everything would work.

Well it doesn’t.

P.S. Should I say that Flash videos work without issues on both Windows and Linux?

Seobiseu 1.10

Illustration

New version is here. Those missing restart option can now rejoice. Restart is available in both context menu on main screen and in notification area.

Download is available here.

P.S. Restart option is not on main menu itself since it makes it a little crowded.

Multi-mercurial

I believe that ideal setup for Mercurial is one project per repository. Most of time this is really good setup but occasionally it will cause problems. Whenever I need to do same thing on multiple repositories (e.g. push) there is an issue. Better said, there was an issue before I created HgAll script.

Script is written in PowerShell and does two things. First it traverses all directories bellow current (or defined) one and finds all mercurial repositories. Then it forwards whatever is on command line as parameter to hg command line utility. In effect it executes same command to each repository it finds.

HgAll [StartingFolder] [commands]

HgAll C:\Source summary
HgAll push all

First example will start search from C:\Source and execute “hg summary” command for any Mercurial folder found. Second example will start in current directory and execute “hg push all”.

You can download script here (or take a peek at source bellow):

$StartupLocation = (Get-Location -PSProvider FileSystem).ProviderPath

$Folder = $Null;
$Command = ""
foreach ($arg in $args) {
    if ($Folder -eq $Null) {
        if ((Test-Path -Path $arg -PathType Container) -eq $True) {
            $Folder = (Resolve-Path -Path $arg).Path
            $Command = ""
        } else {
            $Folder = $StartupLocation
            $Command = $arg
        }
    } else {
        if ($Command.length -ne 0) { $Command += " " }
        $Command += $arg
    }
}

if ($Command.length -eq 0) {
    $Command = "summary"
}

function Traverse([string]$path) {
    Write-Debug $path
    $dirs = Get-ChildItem $path | Where {$_.psIsContainer -eq $true}

    if ($dirs -ne $Null) {
        foreach ($dir in $dirs) {
            $hgsubdir = Join-Path -Path $dir.FullName -ChildPath .hg
            if ((Test-Path -Path $hgsubdir -PathType Container) -eq $True) {
                $hgdir = $dir.FullName
                if ($Command.length -ne 0) {
                    Set-Location $hgdir
                    Write-Host
                    $result = Invoke-Expression "hg $Command 2>&1"
                    if (($LASTEXITCODE -ne 0) -or (!$?)) {
                        Write-Host $dir.Name
                        foreach ($line in $result) {
                            Write-Warning $line
                        }
                    } else {
                        Write-Output $dir.Name
                        foreach ($line in $result) {
                            Write-Host $line
                        }
                    }
                }
            } else {
                Traverse($dir.FullName)
            }
        }
    }
}


try {
    Traverse($Folder)
} finally {
    Set-Location $StartupLocation
}