Early december 2009, Google launched the beta version of the Chrome browser for Linux. They provide RPM and Deb packages, allowing for easy installation.
Sometimes however, you're working on a Linux PC where you do not have root access. The following procedure allows you to install and run Chrome as a normal user:
$ dpkg -x google-chrome-beta_current_i386.deb Chrome
Who is logging into my Linux workstation?
At my most regular workplace (I have several), I have a Debian Linux workstation. The username/password information is managed over NIS, and is configured such, that every user can log into every workstation.
I have no problem with this, but do like to know who is logging in when I'm using the desktop. Thus at startup, I run the following script in the background:
#!/bin/sh
[ ! -e /usr/bin/whoami ] && exit 1 [ ! -e /usr/bin/gmessage ] && exit 1
while [ 1 ] do LOGINNAME=`w -h | cut -f1 -d' ' | grep -v whoami` if [ $LOGINNAME ]; then gmessage "User $LOGINNAME logged in" -button OK else sleep 1 fi done
Save this script somewhere in your home directory. I've called it 'loginwatch'. Then make it executable and run it in the background as follows:
$ chmod +x loginwatch $ ./loginwatch &
This script assumes that you use the Gnome desktop, because it uses the gmessage utility.
Suppose you inadvertently made changes in some files some time back. You can examine revisions of files with
$ svn log ccsds.h
You see that the previous revision was 205 and that it was correct. With an SVN merge, you can make that old revision the current revision:
$ svn merge -r HEAD:205 ccsds.h
Check in your file and you're done!
Today I was thinking about a PHP script that uses Thrift to retrieve a couple of results. We have the following Thrift definition:
/* This contains the three things identifying a logging program */ struct Logger { 1: string userName, 2: string hostName, 3: string appName }
/* This is a debug message */ struct Message { 1: Logger origin, 2: string content }
/* This defines the remote logging services */ service RemoteLog {
// send a log message to the logserver oneway void newMessage (1:Message aMessage) // get list of loggers available list<Logger> getLoggers () // get messages from a specific logger list<Message> getMessages (1:Logger aLogger, 2:i32 aFromID, 3:i32 aMax) }
However, I'd then have to implement the reverse of the above description. In other words, I am asking the remote logging service for whatever he has received over time. To get this up and running, the following steps have to be taken:
Today, I needed to archive and clean up old machines that were used for a project that has reached its end-of-life. These PCs were used in a laboratory setup, controlling custom electronics.
We run our custom lab software on those PCs and the installation is done by checking out a copy of the source, and doing a local compile. Problem is that these machines have been off the network for a while and some local modifications were necessary. While cleaning up, I found that these modifications were not committed to the SVN repository.
In the meantime however, we worked hard on the software and now I cannot just do an update and commit these old modifications. The solution is to create a branch and commit the changes to that branch.
First, find out what the local version is:
$ svnversion . 1143:1150M
We'll make a branch of revision 1150 first. Then we'll check out that branch in another directory:
$ mkdir ~/tmp $ cd ~/tmp $ svn copy -r 1150 http://repository.example.com/svn/our_software/trunk \ http://repository.example.com/svn/our_software/branch-project-pc0054 Committed revision 2011. $ svn co http://repository.example.com/svn/our_software/branch-project-pc0054 Checked out revision 2011.
Then we'll go to the local copy that was running all the time on this PC, and create a patch of the local version:
$ cd ~/sw $ svn diff > ~/hackwork.patch
Go back to the directory with the newly created branch. Apply that patch to the branch, then commit.
$ cd ~/tmp/our_software/branch-project-pc0054 $ patch -p 0 < ~/hackwork.patch $ svn ci -m "Archiving local modifications" Committed revision 2012.
Recently I gave a presentation on D-Bus and what its usage would be for the software we create within SRON.
Here is a link: D-Bus introduction SRON
We've got a Qt-based application (daemon style) which writes log files. In order to nicely integrate the app into our Linux environment, the daemon should be able to receive a signal that it needs to close off its log files and start writing a new one.
Rotating logs is done by placing a small instructive text file in /etc/logrotate.d and by adding the possibility to the daemon to receive a signal of some sort.
The old school way is using plain old Signals but these interrupt system calls. We do not want that to happen; the daemons run in a lab environment and such an interruption could disturb a measurement.
The new style is using D-Bus for this stuff.
Recently, the alpha builds of Chrome for Linux became available. Unfortunately, only Debian and Ubuntu packages were released.
To get Chrome running under Fedora 10, take the following steps:
Download the chrome .deb file
Create a temporary directory in your home dir:
$ mkdir ~/blah
Unpack the .deb file there:
$ cd ~/blah $ ar x ~/Download/chrome*deb
Unpack the binary code:
$ tar xfz data.tar.gz
Move the binaries to your /opt
$ mv opt/* /opt
Now create a couple of symlinks in /lib so Chrome can find all the necessary libraries (apparently these are named differently under Debian and Ubuntu):
$ cd /usr $ sudo ln -s libnss3.so libnss3.so.1d $ sudo ln -s libnssutil3.so.1d libnssutil3.so $ sudo ln -s libnssutil3.so libnssutil3.so.1d $ sudo ln -s libsmime3.so libsmime3.so.1d $ sudo ln -s libssl3.so libssl3.so.1d $ sudo ln -s libplds4.so libplds4.so.0d $ sudo ln -s libplc4.so libplc4.so.0d $ sudo ln -s libnspr4.so libnspr4.so.0d
Now chrome can be started:
$ /opt/google/chrome/google-chrome
Create an application launcher on any panel for easy access.
At work, we're currently experimenting with the LEON3 processor. It's an open chip design that contains a general CPU and has buses for several applications. It's possible to design your own logic for controlling custom electronics, and then use the bus to connect your logic to the CPU.
On that CPU, you can just run Linux and with a driver you can read out your custom logic. The LEON3 CPU core has a SPARC instruction set, making it perfect for running Linux. The SPARC instruction set is a bit of a loner when it comes to embedded OSes though -- the ARM architecture is much better supported. But there you go.
The LEON3 is an alternative for an FPGA that's connected with a serial port or somesuch to a full-blown PC. It also makes it possible to move a lot of logic from the FPGA to C or C++ code. Although arguably you lose on simplicity (there's now a full OS running on the LEON core), you gain on flexibility because of the fluidity of software as opposed to an FPGA.
Today I prepared a presentation that looks at Thrift, a cross-language network library, or in other words, a library for remote procedure calls.
PDF: Apache Thrift.pdf