bash Syndicate content Syndicate content

» Shell helper: running KDE unit tests (ctests) the easy way

Thu, 03/26/2009 - 03:09

Unit tests are in my eyes a very important part of programming. KDE uses them, KDevelop does - the PHP plugin I help writing does as well. cmake comes with a ctest program which does quite well to give you a quick glance on which test suite you just broke with your new fance feature :)

But I am very dissatisfied with it. Right now I usually do the following

  1. # lets assume I'm in the source directory
  2. cb && ctest
  3. # look for failed test suites
  4. cd $failed_test_suite_path
  5. ./$failed_test_suite.shell | less
  6. # search for FAIL
  7. cs
  8. cd $to_whereever_I_was_before

That’s pretty much for just running a test. Especially all that cding and lessing became very tedious. Tedious is good, because I eventually fix it:

introducing kdetest

I wrote a bash function (with autocompletion!!!) called kdetest. Calling it without any parameter will run all test suites and gives a nice report of failed functions at the end. Here’s an example (run via cs php && kdetest).

  1. kdetest
  2. # ... lots of test output
  3.  
  4. --- ALL PASSED TESTS ---
  5. ...
  6. PASS : Php::TestCompletion::implementMethods()
  7. PASS : Php::TestCompletion::inArray()
  8. PASS : Php::TestCompletion::cleanupTestCase()
  9.  
  10. 143 passed tests in total
  11.  
  12. --- ALL FAILED TESTS ---
  13. FAIL! : Php::TestCompletion::newExtends() Compared values are not the same
  14. FAIL! : Php::TestCompletion::updateExtends() '! forbiddenIdentifiers.contains(item->declaration()->identifier().toString())' returned FALSE. ()
  15. FAIL! : Php::TestCompletion::updateExtends() '! forbiddenIdentifiers.contains(item->declaration()->identifier().toString())' returned FALSE. ()
  16. FAIL! : Php::TestCompletion::updateExtends() Compared values are not the same
  17. FAIL! : Php::TestCompletion::newImplements() Compared values are not the same
  18. FAIL! : Php::TestCompletion::updateImplements() Compared values are not the same
  19.  
  20. 6 failed tests in total
usage
  • kdetest, i.e. without any arguments runs all tests in this directory and below
  • kdetest path/to/test.shell ... runs that test suite only, ... can by any argument the test suite accepts.
autocompletion

kdetest comes with full support for autocompletion of tests and functions, for example:

  1. milian@odin:~/projects/kde4/php$ kdetest TABTAB
  2. completion/tests/completiontest.shell duchain/tests/expressionparsertest.shell parser/test/lexertest.shell
  3. duchain/tests/duchaintest.shell duchain/tests/usestest.shell
  4. milian@odin:~/projects/kde4/php$ kdetest duchain/tests/usestest.shell TABTAB
  5. classAndConstWithSameName classSelf interfaceExtendsMultiple staticMemberFunctionCall
  6. classAndFunctionWithSameName constAndVariableWithSameName memberFunctionCall staticMemberVariable
  7. classConstant constant memberFunctionInString variable
  8. classExtends constantInClassMember memberVariable variableTwoDeclarations
  9. classImplements functionAndClassWithSameName memberVarInString variableTwoDeclarationsInFunction
  10. classImplementsMultiple functionCall newObject varInString
  11. classParent interfaceExtends objectWithClassName
the code

You can find the code below, or you can obtain the most up-to-date version on github. Just head over to my shell-helpers repo and peek into the bash_setup_kde4_programming file.

» Attack of the shell helpers

Mon, 03/02/2009 - 02:46

Everyone who uses the command line regularly has a bunch of (at least for him) useful helper scripts. I now took the liberty to put mine on github for general consumption.

You can find them at: http://github.com/milianw/shell-helpers/tree/master

Some of these might be more useful than others, you decide :) Personally, I can’t live without the following:

apupgrade
a shortcut to update your Debian system with one command - no questions asked
openurl
opens a given URL in an already opened browser instance or starts a new browser session. Not only one browser is checked. I use it because firefox is slow to start and konqueror is blazingly fast to start. But when firefox is already open I want to use that.
xerr
shortcut for fast error checking in your Xorg log
clipboard
makes KDE4 Klipper contents available on the CLI (read and write access!)
debug

shortcut to start a GDB session: debug APP APP_ARGS is all you have to do. Its basically the same as doing:

  1. $ gdb APP
  2. > run APP_ARGS

» Download script for springerlink.com Ebooks

Sat, 11/08/2008 - 17:28

After a long period of silence I present you the following bash script for downloading books from http://springerlink.com. This is not a way to circumvent their login mechanisms, you will need proper rights to download books. But many students in Germany get free access to those ebooks via their universities. I for example study at the FU Berlin and put the script in my Zedat home folder and start the download process via SSH from home. Afterwards I download the tarball to my home system.

Read on for the script.

» Access klipper clipboard on CLI under KDE4

Wed, 08/13/2008 - 23:12

Here’s a little script you can save in your path and do things like

  1. # paste current clipboard into file
  2. clipboard > "some_file"
  3. # copy some file into clipboard
  4. cat "some_file" | clipboard

Actually I find it rather useful so I thought I will have to share it.

Since KDE4 D-BUS is used throughout KDE and thus in Klipper as well. IMO they should really rework the output of dbus-send or add some more flags (what about --quiet). Well that’s the reason why the script below is somewhat long. But nothing a little bit of bash+awk magic couldn’t cope with:

  1. #!/bin/bash
  2.  
  3. # check for stdin
  4. # since we don't want to wait endlessly we set a timeout
  5. # a pity `read` only supports seconds and no fractions...
  6. read -t 1 stdin
  7. if [[ "$stdin" != "" ]]; then
  8. # get the rest of stdin
  9. stdin=$stdin$(cat)
  10. # oh, nice - user input! we set that as current
  11. # clipboard content
  12. dbus-send --type=method_call --dest=org.kde.klipper \
  13. /klipper org.kde.klipper.klipper.setClipboardContents \
  14. string:"$stdin"
  15. exit
  16. fi
  17.  
  18. # if we reach this point no user input was given and we
  19. # print out the current contents of the clipboard
  20. # note: I hate the output of dbus, dcop was much easier in that regard!
  21. dbus-send --print-reply --dest=org.kde.klipper /klipper \
  22. org.kde.klipper.klipper.getClipboardContents | awk '
  23. BEGIN { output = ""; }
  24. {
  25. if ( NR > 1 ) {
  26. output = output $0 "\n";
  27. }
  28. }
  29. END {
  30. print substr(output, 12, length(output) - 13);
  31. }'

As usually, save the file (attached below) in your $PATH and make it executable.

PS: Thanks to Martin Vidner for his article on D-BUS btw. - it gave me the proper dbus commands.

» How to generate proper DIN A4 sized plots with Gnuplot

Fri, 05/16/2008 - 21:04

I’ve had a major annoyance today: The plot generated by gnuplot looked good inside the wxt terminal but I simply couldn’t get a proper fullsized DIN A4 postscript exported. This is how I’ve done it now:

  1. Inside gnuplot:
    1. set size ratio 0.71 # this is the ratio of a DIN A4 page (21/29.7)
    2. set terminal postscript enhanced landscape "Arial" 9 # you can change landscape to portrait and the fontname and -size
    3. set output 'yourfilename.ps' # this is your export file
    4. replot # or put your custom plot command here
  2. In a shell:
    1. ps2ps -sPAGESIZE=a4 yourfilename.ps new_dina4_file.ps
  3. Now you can simply print `new_dina4_file.ps` from within KGhostView for example. Have fun!

» mp3dump take two - better audio quality

Sat, 03/29/2008 - 16:29

So just yesterday I’ve published a bash script which rips the audio stream of Flash Videos (*.flv) to mp3 format. It’s nice, fast and imo all-purpose. But I didn’t like the audio quality. Thus below you can find a second version of the script which is using mplayer and lame instead of ffmpeg. Usage and behaviour should be pretty much the same. Only the audio quality should be better on cost of a bit more computing.

Since it relies on the fact that the input *.flv video already uses MP3 encoding for its audio stream this might not work for every flash file! Youtube works just fine though. You can find the script after the break, it’s also attached below. For usage / installation / more information read the old article.

If you wonder why I reencode the audiodump with lame: The dumped mp3 file is considered by most (all?) audio players to be ~10x the length. A five minute video gets a 45 minute audio dumpfile. It plays fine but seeking is a mess. Reencoding fixes this. If you know an alternative which does not require reencoding or is generally faster - please drop a comment!

» mp3dump: Rip the audio stream of a Flash video to MP3

Fri, 03/28/2008 - 00:03

UPDATE: Also check out mp3dump part 2

On some undefined occasion you might want to dump the audio stream of a flash file. This is how you do it:

  1. Get the *.flv, e.g. visit youtube with Konqueror and check /tmp for a file like FlashV5SQLt - this is your FLV.
  2. Install some dependencies: ffmpeg is required, mp3info and ecasound are optional but strongly recommended.
  3. Download the script below (it’s attached!) and save it inside your $PATH, remember how you’ve called it!
  4. I’ve saved the script inside ~/.bin which is inside my $PATH so all I have to do now is running it:

    mp3dump FlashV5SQLt "Foo Bar" "All Your Base Are Belong To Us"

    This would rip the audio stream of FlashV5SQLt to a file named Foo Bar - All Your Base Are Belong To Us.mp3 - with emulated stereo sound and basic MP3 tags (artist and title). Coolio!

» Reinstall Nvidia Driver

Sat, 02/09/2008 - 03:41

For those of you, who use the original NVIDIA display driver and have to reinstall it with every kernel update: Here is a little bashscript for your convenience.

  1. #!/bin/bash
  2. sudo /etc/init.d/kdm stop
  3. sudo chvt 1
  4. sudo sh ~/Downloads/NVIDIA-Linux-x86-*.run --ui='none' -aNq
  5. sudo /etc/init.d/kdm start
  6. sudo chvt 7

Save it e.g. as ~/.bin/nv_reinst.sh, make it executable (chmod +x ~/.bin/nv_reinst.sh). Then put your NVIDIA driver (only the newest version please) into ~/Downloads/ (or change the path above). Now run your script.

Attention: Save all your work, since kdm will be stopped! You’ll lose all unsaved work!

» open URL a in variable browser

Mon, 03/12/2007 - 20:44

I was recently annoyed by how URLs were started in KDE: I used an antiquated firefox command to run an URL in a new tab (firefox-remote "OpenURL(%u, new-window)") which does the job quite well. But: If you have no running firefox instance this command will simply do nothing. Right - nothing! You’ll have to start firefox manually and click once again on the link (in konversation, kopete or wherever).

But the newer firefox versions (I don’t know when this feature was added) support the firefox -newtab %u command. This is all you need if you only use firefox. Configure KDE via kcontrol to use this command as a standard webbrowser.

This was still not enough for me though, as I regularly switch to konqueror or opera, because firefox is sometimes to slow for a quick browse. This is what I came up with:

» Recursive Wordcount

Sat, 07/22/2006 - 03:39

Yes, I am a Linux user and I really appreciate the freedom I get by using either an awesome desktop environment or the command line - or both!

The function I’m going to present you gives you a good overview of how many words, lines and bytes files in a given folder have. I’m speaking about wc.