PC Plus HelpDesk - issue 236
This month, Paul Grosse gives you more insight into some of the topics dealt with in HelpDesk From the pages of HelpDesk, we look at:
- Correcting Perspective;
- DVD Video on Linux;
- Command line calculator; and,
- Random EMail Signatures.
HelpDesk
DVD Video on Linux
The problem with DVD playback on Linux is that the good people that create the DVDs don't realise that they have been locked into a system that will not let people on Linux (or other UNIX) boxes, play them back. As a result of this, the good people who code for Linux have between them provided all of us end-users (as the larger companies like to refer to their customers) with some code that will allow us to play back the DVDs that we have bought with our hard-earned cash, on our own PCs so that we can watch them ourselves.
Go to http://www.google.com/ and look for 'Linux DVD player' - just click on the preceding link to open up a new browser with the search results (if you are on line) - and you will see a number of sites.
Download and install the packages (the RPMs will install with YaST if you are using SuSE Linux - just click on the RPM file and it will be parsed and a window will open up with the option of using YaST to install it). Once you have your packages installed, you need to perform one extra task.
Linux essentially gives you the power of a mainframe operating system on a PC without it being dumbed down like Mac OS X or even worse, like Windows. As a result, the In/Out (I/O) is very good and it checks all packets. As the PC hardware is not as good at I/O as a mainframe, more time is taken to have the same level of care about the I/O as the operating system requires (ever thought that this might be a contributing factor as to why Linux and the other Unices crash less?).
So, to speed things up, you need to activate direct memory access for your DVD player. Do this with the following line...
hdparm -d1 /dev/dvdwhere /dev/dvd is your player - substitute with your player if this is not the case on your machine. It could be /dev/cdrom, /dev/hdc and so on. If you are running KDE, try putting a CD into your player and pressing [Ctrl][Alt][F10] which will take you to the messages screen. You might see the system tell you what the device is called as it probes this new data storage you have just 'installed'. When you have found out, press [Ctrl][Alt][F7] to get you back to your KDE interfaces (or one of the other function keys, depending upon which flavour of Linux you use - I know that OpenBSD is different to [F7].
Finally, type 'xine' (or whatever the command for your chosen DVD player is) and watch your own movie.
Command line calculator
This is one I made earlier. The GUI calculator on Linux is quite pretty and it can do a number of things. One problem is that the interface is quite big and you need to have it all on the screen to be able to use it. Also, you don't always need a scientific calculator - I often use the slide rule that I keep next to the computer. So, I needed something that I could use with just one line of the display so that I could use the GIMP (aspect ratios and sizes) or whatever it was (the word processor for total word counts) and still see the results of the calculator on the screen at the same time.
So, I though that a command line calculator would often quite useful - especially if you have a proper number pad on your keyboard. I could move the console down so that it was almost off the screen and yet I could use it fully without having to use the mouse (press [Alt][Tab] to select the interface for typing in a new calculation). I also decided that I should use the same method of calculation as a calculator - do it in the order that it is typed in so no BODMAS.
If you've followed my Learning to Program by using Perl Masterclass in PC Plus should be able to write one yourself but I have saved you the effort. It runs quite easily and I will show you a few examples of the command line before going through the code.
calc 23*1.8+9^2is a plain, one-liner that just gives you an answer. However
calc 9.2178+3.6 a*9.00316 a-4.12 b^c-6is an example that uses the program's built-in memories. This allows you to do a number of calculations in one line and use the results of previous calculation as the input of others If you input just a number and then refer to that as a result, it means that you only need to type it in once so, if you were calculating the results of a complex calculation, you can just press [Up] and you get your previous calculation back - which you can then edit and the press [Enter] again to re-calculate.
The listing is fairly simple and you can see from it below (I've missed off the help part as it takes up a lot of room and isn't necessary here) that it first of all looks to see if there are any arguments passed to it and if there are, breaks them down and processes them one by one.
It looks first of all for a number, then, it looks for an operator (+-*/^) and if it finds one, it then looks for the next number. Once it gets to the end of each section of the arguments that were passed to it, it saves that as one of the variables, starting with 'a'. This can be used afterwards in the following calculations and as it is stored in its own memory (to thing of the way that calculators store things) you can use the value in memory 'a' when you are calculating what will eventually and up in 'f' - it doesn't just have to be the last one and you have a lot to go at.
26 memories are available but it is a command line calculator so we are not going to be working out too many really long calculations are we?
($progress, $step, $steps) = (0, "", "abcdefghijklmnopqrstuvwxyz"); if ($#ARGV >= 0 ) { if ($#ARGV == 0) { if ($ARGV[0] =~ /^-h|--help/) { &printhelp; exit (0); }; }; foreach $x (@ARGV){ $str = $x = lc($x); # break it up, bit by bit and # calculate it # get a value from the string $error = 0; $n = &getval; if ($error != 0) { # jump out of loop and finish print "Error in $x...\n $str\n\n"; exit($error); }; while (length($str) > 0) { # get a symbol if ($str =~ s"^(\+|-|\*|/|\^)"" ) { $fn = $1; } else { # jump out of loop and finish print "Error in $x...\n $str\n\n"; exit(2); }; # get a value $m = &getval; if ($error != 0) { # jump out of loop and finish print "Error in $x...\n $str\n\n"; exit($error); }; if ($fn eq "+") { $n = $n + $m; } elsif ($fn eq "-") { $n = $n - $m; } elsif ($fn eq "*") { $n = $n * $m; } elsif ($fn eq "/") { $n = $n / $m; } elsif ($fn eq "^") { $n = $n ** $m; }; }; if ($error == 0) { # increment logging system { if (length ($steps) >0 ) { # still some left so let's # take the first $keyed = 1; $steps =~ s/(\w)//; $keyi = $1; $step .= $keyi; $progress++; $args{$keyi} = $n; }else { $keyed = 0; }; } # print out result print "$x = $n"; if ($#ARGV > 0 ) { if ($keyed == 1) { print " ($keyi)"; }; }; print "\n"; } else { # jump out of loop and finish print "Error in $x...\n $str\n\n"; exit(1); }; }; } else { &printhelp; }; exit (0); ################################### ## subs ################################### sub getval { # strip a value from the beginning # of $str and return it # look for letters if there are any # in $step if (length($step) > 0) { # previous steps exist so look for # a letter at the beginning if ($str =~ s/^([$step])//) { # got one my $key = $1; my $r = $args{$key}; return $r; } }; # must start with a digit. grab it { if ($str =~ s/^(\d+)//) { $v = $1; # look for a decimal point if ($str =~ s/^(\.)//) { # if found, get the rest # of the number if ($str =~ s/^(\d+)//) { # concatenate the string $v .= ".".$1; return $v; }; } else { # nothing after the # decimal point return $v; }; } else { $error = 1; }; }; }One thing you will notice in the code above (about a dozen lines from the end) is how it detects numbers that have decimal points. First of all, it looks for a number and then, it looks for a decimal point. If it finds one, it looks for another slice of number and then, concatenates the two strings, along with a decimal point to make the full number.
All you need to do is copy it from the SuperDisc (click here to open up a new window), extract it, make it executable and copy it to your /usr/bin or similar directory on the path. Once it is in the path, you can access it just by typing 'calc' and you don't need to type './calc' to use it.
You can see from the screen shot how unobtrusive it is.
Random EMail Signatures
Some email programs will allow you to add a standard signature to your emails. If you have ever received an email from a company, you will, most likely, have seen a large section at the end that states something along the lines that no matter how libellous the contents, it is no business of yours to go and sue them - or something along those lines.
If your email client is one of these, you will find that they do at least one of the following:
- allow you to have a piece of text, as defined in the email client itself, as the signature - this is usually static and can only be edited by reconfiguring the email client;
- allow you to use the contents of a text file as the signature - this allows there to be a central file that all of the email clients point to and makes administering the system a lot easier. For example, if the company finds that they need to change the wording of the signature, only one file needs to be edited. Once that is done, they all have the new wording.
- allow you to have the output of a program as the email signature - this means that you can have some flexibility. You can still use the contents of files as part of the signature but you can also have other things in there as well. I've seen some signatures boasting about uptime, workload, the current number of Firefox browsers that have been downloaded and so on - the choice is yours.
So, if a static signature is not for you, you can either have one that is different each time you write an email, or have one that is different each day. These are simple enough to do...
- For a different signature for each email, just use the output of a program;
- For a different one each day (you might like to say something about the day of the week in it or maybe a countdown to pay day if you have one a month), just use a file as the signature but have a program that runs on a crontab (or in the Windows scheduler - see the 27 step walk-through on page 131 of PC Plus issue 234 or the section on it on the SuperDisc) every day, before you start - possibly just after midnight.
If you look at the SuperDisc (click here to open the directory in a new browser window), you can see two directories - on for Windows and one for UNIX/Linux. If you go into the appropriate directory, you will see the files you need to copy onto your system.
One of them is a text file that contains the signatures and the other one is the program that creates the signature. Using Perl's ability to take input from the file and direct the program output to STDOUT, the email client looks at STDOUT and uses it as its input.
Signature file
The signature file is just a list of signatures separated by delimiter lines. These can be anything that is not likely to turn up in a signature but they all have to be the same as each other.
You will see that the files starts with one of these delimiting lines and has one between each quote. There is no line at the end. This makes it easy to edit the file if you have a sudden attack of creativity - just open the file in a text editor and add the line - preceded by the delimiter.
Program file
The program file just opens the signature file, finds out how many there are and selects one. It adds a bit at the beginning (to save you typing it) and draws a line of '='s above and below it. You can add another bit at the end if you want.
If you want to use this as a 'signature of the day' program, just put the code in for selecting the signature you want and then, instead of outputting the signature to STDOUT (default), open up a file and save it to that. Then, configure your email client to use that file as its signature.
Here's an example of the type of output you can have - presented generically ...
Regards, Your name here http://www.your.homepage.here.com/ ======================================== Noli arrogantium iniurias pati (I'm going to clean out the guinea pigs) ======================================== any more bits here such as a disclaimerHave fun.