Friday, November 11, 2011

Enable menu icons in Ubuntu 11.10 Oneiric Ocelot

Back in the day menu icons were essential part of system interface, then it was possible to enable/disable those icons in Ubuntu-tweak etc.
With 11.10 release we are in position when only dconf-tools tool may help us.
So first of all we need to install dconf-tools (it is not installed by default).

sudo apt-get install dconf-tools

And then open dconf-editor (start typing "dconf" in Unity dash)
In dconf editor go to org->gnome->desktop->interface and enable menus-have-icons.


Wednesday, November 9, 2011

Enable ifplugd with DHCP

To get ifplugd properly working with network interface that should obtain its configuration from DHCP server one basically needs to properly modify /etc/network/interfaces file:

# Configure Loop
auto lo
iface lo inet loopback

iface eth0 inet dhcp

Note, there's no "auto eth0"  line, so eth0 will be managed by ifplugd

Syntax highlighter in blogger

Just to save my setup of "Syntax highlighter"

Here are pretty good instructions of how-to integrate "Syntax highlighter" in blogger http://www.shirmanov.com/2010/09/adding-syntaxhighlighter-30-to-blogger.html

And below are my settings.
They differ in

  1. "Eclipse" theme instead of "Midnight"
  2. Added 3 new brushes I'm interested in: "Plain", "Diff" and "Bash"

Note, as it is said here http://alexgorbatchev.com/SyntaxHighlighter/manual/installation.html
in case of "<pre /> method" Major issue with this method is that all right angle brackets must be HTML escaped, eg all < must be replaced with &lt; This will ensure correct rendering.

<!-- First we add CSS styles -->
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/> 
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shCoreDefault.css' rel='stylesheet' type='text/css'/> 
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeEclipse.css' rel='stylesheet' type='text/css'/> 
 
<!-- Second we add JS scripts -->
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shAutoloader.js' type='text/javascript'></script> 
 
<!-- Then we add Brushes -->
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPlain.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushDiff.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCSharp.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCpp.js' type='text/javascript'></script> 
 
<!-- At last we call SyntaxHighlighter -->
<script language='javascript' type='text/javascript'> 
    SyntaxHighlighter.config.bloggerMode = true;
    SyntaxHighlighter.all();
</script>

Mount jffs2 image in your development system

Devices with embedded linux quite often have root file-system stored in flash-memory. And quite often it is whether jffs2 or yaffs2. For partitions of small size (say < 100-200 Mb) one may easily use jffs2, while for larger partitions it is recommended to use yaffs2 because of its better scalability (smaller RAM requirements and better performance).
Another big advantage of jffs2 over yaffs2 is its native support in mainline linux kernel. For sure yaffs2 patch could be easily applied to your kernel tree it is always very nice to have a feature in mainline.

So basically you prepare proper file-system image and put it on MTD-device of your embedded board.
And sometimes you need to get some data from prepared file-system image or even modify it on your host development machine.

I found a nice bash script on Maemo Wiki http://wiki.maemo.org/Modifying_the_root_image#Shell_script_to_mount.2Funmount_JFFS2_using_block_device_emulating_MTD
But since I have kernel of version 3.0 on my machine I decided to remove parts for 2.4 kernel (corresponding branches were used for 3.0 kernel as well because of improper tests that were not written for 3.0 obviously). And also I added automatic pick-up of an empty loop device.
So here's a very helpful script for mounting jffs2 image:

#!/bin/sh
JFFSIMG=$1 # jffs image
LOOP=$(losetup --find) # loop device
MP="/media/jffs2" # mount point
MTDBLOCK="/tmp/mtdblock0" # MTD device file
BLKMTD="block2mtd"
UMNT=""
 
echo "$0" | grep unmount_ >/dev/null 2>&1
[ $? -eq 0 ] && UMNT=1
if [ $# -gt 1 -a x"$2"x = x"unmount"x ]; then
  UMNT=1
fi
  
if [ x"${UMNT}"x = x""x ]; then
  if [ ! -b ${MTDBLOCK} ] ; then
    mknod ${MTDBLOCK} b 31 0 || exit 1
  fi
  lsmod | grep loop >/dev/null 2>&1
  if [ $? -ne 0 ]; then
    modprobe loop
    [ $? -ne 0 ] && echo "loopback loading failed" && exit 1
    sleep 1
  fi
  losetup ${LOOP} ${JFFSIMG} || exit 1
  sleep 1
  modprobe mtdblock
  modprobe ${BLKMTD} || exit 1
  echo "${LOOP}" > /sys/module/block2mtd/parameters/block2mtd
  sleep 1
  modprobe jffs2
  [ ! -d ${MP} ] && mkdir -p ${MP}
  mount -t jffs2 ${MTDBLOCK} ${MP} || exit 1
else
  umount ${MP}
  if [ $? -ne 0 ]; then
    echo "Cannot unmount JFFS2 at $MP" && exit 1
  fi
  modprobe -r jffs2
  modprobe -r ${BLKMTD}
  modprobe -r mtdblock
  sleep 1
  losetup -d ${LOOP}
fi

Wednesday, November 2, 2011

Transform one multi-channel sound card into 2 virtual stereo ones

I love music!
I may say that the only period of time I don't listen to music is when I'm asleep.
And essentially while sitting at my desktop at work I cannot escape temptation to tune to Last.fm.

Another thing to mention is I cannot wear headphones for too long. Even my Sennheiser HD-555 which are "open-desing" ones and extremely comfortable. So I prefer to enjoy some sort of loudspeakers. And I do have them.

But sometimes I have to talk with colleagues through Skype. And well... it's not so nice to bother colleague/s sitting right next to me (in the same room) with these conversations... at the same time they're OK with my music.

So basically I needed to split audio output of Skype and all other applications.
The first idea was to get an extra PC (some old one from garbage) and use as a remote player. It's possible to install there MPD or some other stuff that has an ability to be controlled remotely through local network for example.

But it was not so elegant and basically I didn't manage to find "extra PC".

At this point I though what if I try to play with PulseAudio setting which is default audio server in Ubuntu for years now.

And so I did.

This wiki article covers everything I needed: https://wiki.archlinux.org/index.php/PulseAudio#Splitting_front.2Frear

Below is an extract from it.

Splitting front/rear

You may want connect speakers to front analog output and headphones to rear output. It would be usefull to split front/rear to separate sinks. Add to default.pa:
load-module module-remap-sink sink_name=speakers remix=no master=alsa_output.pci-0000_05_00.0.analog-surround-40 channels=2 master_channel_map=front-left,front-right channel_map=front-left,front-right

load-module module-remap-sink sink_name=headphones remix=no master=alsa_output.pci-0000_05_00.0.analog-surround-40 channels=2 master_channel_map=rear-left,rear-right   channel_map=front-left,front-right
(replace alsa_output.pci-0000_05_00.0.analog-surround-40 to your sound card name that you got from 'pacmd list-sinks')
After that you can switch player between speakers and headphones.

To restart PulseAudio execute: pulseaudio -k

This will kill PulseAudio server and then it will be restarted automatically with new settings applied.

The only thing that surprised me then - I couldn't find a way or tool to select desired virtual output for particular application.

And it turned out this tool is "PulseAudio Volume Control" (pavucontrol).

Here's a screenshot:

Unfortunately pavucontrol isn't installed by default in Ubuntu 11.10 so one needs to install it:
sudo apt-get install pavucontrol

Another issue is that application which uses direct access to ALSA won't appear in pavucontrol and so it's impossible to control which output they use.

But this is also could be solved quite simple:
In order for ALSA to use PulseAudio it needs a special /etc/asound.conf (system wide settings) (recommended) or ~/.asoundrc (settings on a per user basis):
File: /etc/asound.conf
pcm.pulse {
    type pulse
}
ctl.pulse {
    type pulse
}
pcm.!default {
    type pulse
}
ctl.!default {
    type pulse
}
If you omit the last two groups, Pulseaudio will not be used by default. You will then need to change the ALSA device to "pulse" in the applications that you use to make it work.
That's it. I finally got what I was looking for and it cost me an hour to google and experiment a bit.