Positive Future for Linux Netbooks?

Caitlyn Martin argued that Linux netbooks have a bright future in a recent article entitled Linux To Regain 50% Netbook Market Share. It was noted that netbooks powered by ARM processors are a good fit with linux and that these devices have advantages over larger, more powerful machines.

Those who assure us that Linux has no future on netbooks and that Windows 7 will dominate… assume that Intel processors will continue to dominate the netbook market. The problem with making that assumption is that there are real advantages to ARM processors, specifically very low power consumption, which allows for much longer battery life than similar Intel Atom or Via C7-M processors.

I found some of the most interesting material was in her reply to comments, e.g.

That “so small” number Linux users is, at current estimates, somewhere around 6-8% of the desktops/nettops/notebooks/netbooks so that makes roughly 60-80 million worldwide. 25% of netbooks sold last year had Linux, so that was over 2 million right there. That doesn’t count 2007 or 2009 sales. Linux, according to HP, Acer, Asus, and Dell does NOT have a higher return rate than Windows so most users must not have the unspecified “hassles” you mention but don’t explain.

As for the future of linux on netbooks, we shall see. I have very much enjoyed the performance and functionality of linux (Ubuntu Jaunty) on my notebook and look forwards to more choices in the future.

SOFA Statistics packages available

SOFA Statistics has now been released in the form of a deb package for Ubuntu and an NSIS installer executable for Windows. SOFA stands for Statistics Open For All which is not a bad summary of its goals. The program is still under heavy development but nested tables (including summary tables, nested tables, and straight display tables) are all working well. See http://www.sofastatistics.com/features.php for more details and you can subscribe to the rss feed at http://www.sofastatistics.com/blog/?feed=rss2.

Scroll Wheel Randomly Pasting In Eclipse Under Ubuntu

There is a frustrating small annoyance in Ubuntu when using gedit and eclipse (and probably other programs). If you accidentally push the scroll wheel too hard while scrolling it pastes whatever is in the clipboard. Random text inserted into code is not a good idea ;-). Fortunately there is an answer that works thanks to Rob Wilkerson (just remember to reboot afterwards).

Linux: Make Your Scroll Wheel Double Click

Client-device Linux use reaches 2-5%, world better off

Preston Gralla, in a provocative article entitled “Client-device Linux use reaches 1%, world yawns”, makes a series of negative claims about desktop linux;

  1. Linux will never be a big player in the desktop market
  2. Linux should not be
  3. Linux flounders on the desktop because there are too many variants
  4. Linux flounders because it is too hard to install or update

Addressing these points one at a time:

Could Desktop Linux reach 10% ?

Time will tell, but Desktop Linux has well and truly exceeded 1%, especially when we compensate for the methodological flaws of the Net Applications study on which the 1% figure is based. A more realistic global figure is 2-5% (“Linux Desktop Market Share: Greater Than One Percent?”). With ARM-powered netbooks and MIDs on the way, that may well rise. It could be argued that Desktop Linux has only been a viable alternative for about 2 years so it is early days yet.

Does Desktop Linux make us better off?

Definitely. Desktop Linux provides competition for the dominant desktop systems (XP on netbooks, Vista and OS X on the rest of the “desktop”) and that creates pressure to innovate and helps keep prices in check. For example, Linux has set the price Microsoft can charge netbook manufacturers for an OS very low (see “Netbooks bleed Microsoft profits. It’s about to get worse”).

And Linux has a much better security record than Microsoft OSs, enables society to reuse lower powered machines, and saves consumers a lot of money. If you’re not from Redmond, what’s not to like?!

Too many variants of Desktop Linux?

Not really a credible complaint any more. If you want to follow the mainstream, just install Ubuntu. If not, try Fedora, Mandriva, or possibly Suse. And there are many more for specialised needs. But there is an obvious choice now, Ubuntu, making the total number of Linux distros irrelevant.

It is good there is a choice because it keeps the pressure to innovate high (boot speed wars etc) but there is no longer any cause for confusion amongst ordinary users. Which is possibly why we are seeing adoption rates for Desktop Linux rising.

Is Desktop Linux hard to install or update?

This is a valid point – although it must be noted that Ubuntu is much easier to install than Windows + applications + anti-virus + antispyware etc. The success of Desktop Linux depends on mainstream hardware manufacturers. If they continue to increase their support for pre-installed Linux, we can expect adoption rates to increase. And if software publishers start having to produce Linux versions, there could be a tipping point of sorts. Linux adoption could suddenly rise from, say, 5% to 20% if a number of prominent hardware and software providers got on board and the rest stampeded to avoid being left out. We will see.

The web provides an analogy. Once Firefox + Safari + Chrome + Opera exceeded 10% it became difficult for the mainstream of the web to produce content for the Microsoft ecosystem only. And once web developers made the shift it made it easier for people to adopt non-Microsoft browsers. The pattern has been self-reinforcing.

Conclusion

Whether you use Windows, OS X or Desktop Linux, we will all benefit from growing uptake of Desktop Linux. And I believe Ubuntu could be the Firefox of OSs within 10 years, enjoying 20-30% of the “market”. And not before time.

Jaunty Surround Sound Requires Simple Adjustment

I just completed a dist-upgrade from Intrepid to Jaunty. Everything worked except I needed to reinstall OpenOffice and rerun

sudo apt-get install ubuntu-restricted-extras

VirtualBox was OK but I needed to select More>Backup to cope with a changed format.

My surround sound was gone though. Fortunately the answer was dead easy. See http://www.automaticable.com/2008-05-28/how-to-enable-surround-sound-on-ubuntu-hardy/.

Basically you uncomment one line in a file and change a 2 to a 6. No need to muck around with Preferences and sliders etc.

Ethernet problem on Intrepid

My father-in-law’s Intrepid machine had no ethernet and there was a message: “Wired Network: Device is unmanaged.”. This was strange as it had been working for over 6 months. I still don’t know what happened but I found some ideas here: https://bugs.launchpad.net/ubuntu/+source/network-manager/+bug/337685. Open interfaces thus:

sudo gedit /etc/network/interfaces

Edit and save. I just compared my settings with his and suggested he change his to match. NB comment out lines you want to remove, don’t delete them. You might want to look at them later or even restore them.

wxWebkit on Intrepid

wxWebKit is a very important cross-platform control for the wxPython GUI toolkit. It enables you to display complex HTML pages (including live from the web) e.g. tabular output or help files.

Fortunately, wxWebkit can be made to work on Ubuntu Intrepid. Indeed, I am editing this blog item right now from within a wxPython wxWebKit control :-). But it is not a straight forward process at this time and it is not properly installed as such. But you can start testing it after following the steps suggested below.

[Update – there is now a deb file you can use thanks to Christoph Willing. Use the following commands:
# NB the next line is one long command line
sudo wget http://www.vislab.uq.edu.au/debuntu/sources.list.d/intrepid.list -O /etc/apt/sources.list.d/uqvislab.list

sudo apt-get update

sudo apt-get install python-webkitwx
]

I was never able to get wxWebKit to compile and work following the instructions here http://wxwebkit.wxcommunity.com/index.php?n=Main.Requirements. I expect this will change in the future.

Here are some instructions that have worked for me on more than one machine. My deepest thanks go to Christoph Willing and Kevin Ollivier.

Get the correct wx swig deb from http://www.vislab.uq.edu.au/debuntu/intrepid/swigwx1.3_1.3.29_i386.deb and install it.

Get a patched bakefile deb from http://www.vislab.uq.edu.au/debuntu/intrepid/bakefile_0.2.5-1_i386.deb and install it.

Get intrepid_prereqs and i_files.tar.gz from http://www.vislab.uq.edu.au/research/accessgrid/software/debuntu/wxwebkit/.

Run the prereqs file from the folder you have stored it in e.g. Desktop:

cd ~/Desktop
sudo bash intrepid_prereqs

Then extract the i_files folder from i_files.tar.gz and put it (the folder with its contents, not just the contents) under: /usr/include/wx-2.8/wx/wxPython

OK – the preparation is done. Now to get the source by checking out the subversion repository:

cd ~
svn checkout http://svn.webkit.org/repository/webkit/trunk WebKit

Then cd into ~/WebKit/WebKitTools/Scripts and run:
./build-webkit --wx --wx-args="wxgc wxpython" 2>&1 | tee op

NB if your build fails for some reason and you want to run it again, run clean first:
./build-webkit --wx --wx-args="wxgc wxpython" --clean

The file op will be made in ~/WebKit/WebKitTools/Scripts so you can check what happened. If your build is successful there will be a clear message to that effect at the end. Regrettably, an absence of error messages is not the presence of success ;-).

To test wxWebKit you will need to save the following file in the ~/WebKit/WebKitBuild/Release folder (this is a minor variation of the standard test file to sidestep some bugs).

#!/usr/bin/python

# Copyright (C) 2007 Kevin Ollivier All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

import wx
import webview

class TestPanel(wx.Panel):
def __init__(self, parent, log, frame=None):
wx.Panel.__init__(self, parent, -1,
style=wx.TAB_TRAVERSAL|wx.CLIP_CHILDREN|wx.NO_FULL_REPAINT_ON_RESIZE)
self.log = log
self.current = "http://wxPython.org/"
self.frame = frame

if frame:
self.titleBase = frame.GetTitle()

sizer = wx.BoxSizer(wx.VERTICAL)
btnSizer = wx.BoxSizer(wx.HORIZONTAL)

self.webview = webview.WebView(self, -1)

btn = wx.Button(self, -1, "Open", style=wx.BU_EXACTFIT)
self.Bind(wx.EVT_BUTTON, self.OnOpenButton, btn)
btnSizer.Add(btn, 0, wx.EXPAND|wx.ALL, 2)

btn = wx.Button(self, -1, "<--", style=wx.BU_EXACTFIT) self.Bind(wx.EVT_BUTTON, self.OnPrevPageButton, btn) btnSizer.Add(btn, 0, wx.EXPAND|wx.ALL, 2) btn = wx.Button(self, -1, "-->", style=wx.BU_EXACTFIT)
self.Bind(wx.EVT_BUTTON, self.OnNextPageButton, btn)
btnSizer.Add(btn, 0, wx.EXPAND|wx.ALL, 2)

btn = wx.Button(self, -1, "Stop", style=wx.BU_EXACTFIT)
self.Bind(wx.EVT_BUTTON, self.OnStopButton, btn)
btnSizer.Add(btn, 0, wx.EXPAND|wx.ALL, 2)

btn = wx.Button(self, -1, "Refresh", style=wx.BU_EXACTFIT)
self.Bind(wx.EVT_BUTTON, self.OnRefreshPageButton, btn)
btnSizer.Add(btn, 0, wx.EXPAND|wx.ALL, 2)

txt = wx.StaticText(self, -1, "Location:")
btnSizer.Add(txt, 0, wx.CENTER|wx.ALL, 2)

self.location = wx.ComboBox(self, -1, "",
style=wx.CB_DROPDOWN|wx.PROCESS_ENTER)

self.Bind(wx.EVT_COMBOBOX, self.OnLocationSelect, self.location)
self.location.Bind(wx.EVT_KEY_UP, self.OnLocationKey)
self.location.Bind(wx.EVT_CHAR, self.IgnoreReturn)
btnSizer.Add(self.location, 1, wx.EXPAND|wx.ALL, 2)

sizer.Add(btnSizer, 0, wx.EXPAND)
sizer.Add(self.webview, 1, wx.EXPAND)

self.webview.LoadURL(self.current)
self.location.Append(self.current)

# self.webview.Bind(webview.EVT_WEBVIEW_STATE_CHANGED, self.OnStateChanged)

self.SetSizer(sizer)

def OnStateChanged(self, event):
statusbar = self.GetParent().GetStatusBar()
if statusbar:
if event.GetState() == webview.WEBVIEW_STATE_NEGOTIATING:
statusbar.SetStatusText("Contacting " + event.GetURL())
elif event.GetState() == webview.WEBVIEW_STATE_TRANSFERRING:
statusbar.SetStatusText("Loading " + event.GetURL())
elif event.GetState() == webview.WEBVIEW_STATE_STOP:
statusbar.SetStatusText("")
self.location.SetValue(event.GetURL())
self.GetParent().SetTitle("wxWebView - " + self.webview.GetPageTitle())

def OnLocationKey(self, evt):
if evt.GetKeyCode() == wx.WXK_RETURN:
URL = self.location.GetValue()
self.location.Append(URL)
self.webview.LoadURL(URL)
else:
evt.Skip()

def IgnoreReturn(self, evt):
if evt.GetKeyCode() != wx.WXK_RETURN:
evt.Skip()

def OnLocationSelect(self, evt):
url = self.location.GetStringSelection()
self.webview.LoadURL(url)

def OnOpenButton(self, event):
dlg = wx.TextEntryDialog(self, "Open Location",
"Enter a full URL or local path",
self.current, wx.OK|wx.CANCEL)
dlg.CentreOnParent()

if dlg.ShowModal() == wx.ID_OK:
self.current = dlg.GetValue()
self.webview.LoadURL(self.current)

dlg.Destroy()

def OnPrevPageButton(self, event):
self.webview.GoBack()

def OnNextPageButton(self, event):
self.webview.GoForward()

def OnStopButton(self, evt):
self.webview.Stop()

def OnRefreshPageButton(self, evt):
self.webview.Reload()

class wkFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, "WebKit in wxPython!")

self.panel = TestPanel(self, -1)
# self.panel.webview.LoadURL("http://www.wxwidgets.org/")
self.CreateStatusBar()

class wkApp(wx.App):
def OnInit(self):
self.webFrame = wkFrame()
self.SetTopWindow(self.webFrame)
self.webFrame.Show()

return True

app = wkApp(redirect=False)
app.MainLoop()

Assuming you named that file my_wxwebkit_test.py, cd into ~/WebKit/WebKitBuild/Release and run

export LD_LIBRARY_PATH=`pwd`

so that the library files can be found in spite of their unexpected location (because we haven’t properly installed our files into the standard locations). Then run

python my_wxwebkit_test.py

and enjoy :-).

VuegoScan Brisa 620u Scanner with Ubuntu

I was unable to get my VuegoScan Brisa 620u scanner working in Ubuntu Jaunty. There was an error similar to the following:

Failed to open device `snapscan:libusb:006:003': Invalid argument.

Interestingly, if I dual booted into Windows with the scanner on and then booted into Ubuntu the scanner worked. Apparently, a firmware blob is loaded into the scanner.

Fortunately I still had a 1999 CD for the scanner with all the drivers on it. So it was a matter of changing a line in snapscan.conf and putting a binary file into a particular path.

Here are the details:

1) Open nautilus with root powers (NB very dangerous – think before you act!). Apologies to my CLI-loving friends ;-).

gksu nautilus

2) navigate to /etc/sane.d/snapscan.conf

3) Double click snapscan.conf and edit 5th line:

firmware /usr/share/sane/snapscan/U96V120.BIN

4) navigate to /usr/share/sane/ and make sure there is a folder called snapscan

5) Copy U96V120.BIN from the /media/cdrom/DRIVERS folder into /usr/share/sane/snapscan

6) Close nautilus (remember, it is opened with root powers and could be dangerous to your system’s well being).

7) Open Xsane (Applications > Graphics > Xsane Image scanning program) and start scanning

NB I was lucky that I guessed the correct BIN file on my first attempt.

Ubuntu Intrepid Modem Solution with wvdial & Gnome PPP

To get a modem working on my Grandparent’s Ubuntu Intrepid machine I needed to use wvdial. I can’t remember the exact sequence but perhaps start by editing “/etc/wvdial.conf” while logged in as root.

sudo gedit "/etc/wvdial.conf"

Supply the phone number to the ISP, the user name, and the password.

I also found my Grandparent’s modem was on /dev/tty0 not /dev/tty1. You could hear it on one and not the other which was a pretty simple test.

OK – now you can make a connection using the simple command:

sudo wvdial

NB if you have trouble connecting, disconnect all phones except for the modem and try again. The explanation is complex and may vary by country but it is worth a shot if the login works and the connection mysteriously disconnects (e.g. Exit code 16).

Now get a GUI for connecting and disconnecting.

sudo apt-get install gnome-ppp

Then, manually set the correct permissions:

sudo chown root:dip /usr/sbin/pppd
sudo chmod 4754 /usr/sbin/pppd
sudo chmod 777 /etc/ppp/pap-secrets
sudo chmod 777 /etc/ppp/peers

(http://ubuntuforums.org/showpost.php?p=6296683&postcount=4)

I found I needed to make /usr/bin/pppd executable for everything to work. Some people have suggested you need to re-log in to make it work or even reboot but I am not sure if that is necessary.

Anyway, add the Gnome ppp dialer to the panel and everything is simple enough for anyone to use.

Installing eeeBuntu Intrepid Remix onto eeePC Netbook

Overall, installing eeeBuntu Remix (Intrepid) onto an eeePC netbook went well enough but there were a few rough patches. The download went smoothly, I installed the create usb startup disk program from the standard repositories, and selected the iso file just downloaded. But … I had to install lilo and use it to repair the usb MBR before it would work.

sudo apt-get install lilo
(NB do not configure to use unless you actually want to replace GRUB)

lilo -M /dev/sdx
(replacing x with the letter of your flash device) sdb in my case
(See http://www.pendrivelinux.com/usb-ubuntu-710-gutsy-gibbon-install/.

Plus the USB drive was detected sometimes and not others by the eeePC. [Later note – this may be relevant: “[On] my EEE PC 1000 the only bootable USB port is the one on the left side, the two on the right would not boot the USB at all.” (Full Circle 23 – http://fullcirclemagazine.org/issue-23/)]

Anyway, press Esc repeatedly at bootup to get access to the USB drive and boot into it.

Partitioning was interesting as there seemed to be half the harddrive set aside (for recovery, I think). I formatted that as linux swap. I’ll resize it later. The default seems to be shrinking XP (good) and using the second (of 3) partitions for eeeBuntu. I formatted that as ext3.

[Note from later ;)] install ntfsprogs to enable resizing ntfs partition etc.
sudo apt-get install ntfsprogs. I resized the windows partition drastically down from within eeebuntu and later used a live usb of gparted to resize and move the eeebuntu partition. The most recent versions of gparted live did not work but I succeeded with 0.3.7-7. NB this only worked in video safe mode (VGA).

To run all the upgrades you need to get the repositories working (now that GPG keys are required, which seems to be a recent development – http://forum.eeebuntu.org/viewtopic.php?f=17&t=1701&p=6559).

If it is not you might get an error like:

W: A error occurred during the signature verification. The repository is not updated and the previous index files will be used.GPG error: http://ppa.launchpad.net intrepid Release: The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY 3F2A5EE4B796B6FE

W: Failed to fetch http://ppa.launchpad.net/netbook-remix-team/ubuntu/dists/intrepid/Release

Fortunately, the following worked for me:

sudo apt-key adv –recv-keys –keyserver keyserver.ubuntu.com 3F2A5EE4B796B6FE
(http://lxer.com/module/forums/t/28587/).

The following may be useful as well: http://www.archive.org/download/LaunchpadAddingAPpasKeyToYourUbuntuSystem/launchpad-adding-key-for-signed-ppa.ogv

Before that I had to uninstall the flash nonfree package and reinstall it. But youtube is working perfectly now.

I also changed the icons under appearance to Gnome so that Thunderbird would have the correct icon.

The final thing was to get Skype installed. This required Medibuntu as per http://forum.eeebuntu.org/viewtopic.php?f=28&p=6542 and then a change to the Skype sound setup as per http://www.eeebuntu.org/release.html

BTW this entry was written and posted from the eeePC. The only real bad news is that it isn’t mine and I have to return it soon :-(.