Skip to content

Home

Split and merge PDFs – part 2

A while ago I wrote a post named Split and merge PDFs with pdftk. Unfortunately, pdftk seems no longer to be maintained for Fedora 21. So we have to use another alternative – poppler-utils:

Install the package with:

yum install poppler-utils

..and you can use them to both split and merge files. poppler-utils contains a list of tools that you can use to manipulate PDFs:

  • pdfdetach — lists or extracts embedded files (attachments)
  • pdffonts — font analyzer
  • pdfimages — image extractor
  • pdfinfo — document information
  • pdfseparate — page extraction tool
  • pdftocairo — pdf to png/jpeg/pdf/ps/eps/svg converter using cairo
  • pdftohtml — pdf to html converter
  • pdftoppm — pdf to ppm/png/jpeg image converter
  • pdftops — pdf to postscript (ps) converter
  • pdftotext — text extraction
  • pdfunite — document merging tool

So, we move on to merging and splitting:

Merge

pdfunite first_page.pdf second_page.pdf end_document.pdf

Split

pdfseparate -f 1 end_document.pdf %d.pdf

Check out man pdfseparate for more information about the tool.

Convert FAT32 to NTFS without losing data

I had a USB-stick formatted with FAT32, and when I tried transferring a file over 4GB to it, I suddenly got the error:

The file ‘example.iso’ is too large for the destination file system.

The file system FAT32 only supports file sizes of up to 4GB, thus this error. Luckily there’s an easy way to fix this – convert the file system from FAT32 to NTFS. This can be done easily with the command convert, and should not cause you to lose data on the device you’re converting, or have to format it. However, backup is always adviced.

So, the conversion itself:

1. Click on the Start-menu
2. Type cmd in the search bar
3. Check the disk for errors with the command:

chkdsk e: /f

Where e: is the letter of the drive of the USB-stick.

4. Execute the conversion with:

convert e: /FS:NTFS

The conversion-process will take a few minutes, and in the end the program will inform you when the conversion was successful.

That’s all there is to it. :)

Problems with wicd-curses on Fedora 20

If you’re on Fedora 20, are trying to run wicd-curses, and keep getting errors like the one below:

Traceback (most recent call last):
  File "/usr/share/wicd/curses/wicd-curses.py", line 1067, in 
    main()
  File "/usr/share/wicd/curses/wicd-curses.py", line 995, in main
    ui.run_wrapper(run)
  File "/usr/lib64/python2.7/site-packages/urwid/raw_display.py", line 241, in run_wrapper
    return fn()
  File "/usr/share/wicd/curses/wicd-curses.py", line 88, in wrapper
    return func(*args, **kargs)
  File "/usr/share/wicd/curses/wicd-curses.py", line 1003, in run
    app = appGUI()
  File "/usr/share/wicd/curses/wicd-curses.py", line 548, in __init__
    self.wiredCB = urwid.Filler(WiredComboBox(wiredL))
  File "/usr/share/wicd/curses/wicd-curses.py", line 378, in __init__
    self.__super.__init__(use_enter=False)
  File "/usr/share/wicd/curses/curses_misc.py", line 351, in __init__
    self.focus = focus
AttributeError: can't set attribute

..then the fix is simple. Open up the file /usr/share/wicd/curses/curses_misc.py, go to line 360, and paste the following below:

    @property
    def focus(self):
        return self._focus

    @focus.setter
    def focus(self, index):
        self._focus = index

    @focus.deleter
    def focus(self):
        del self._focus

    def set_list(self,list):
        self.list = list

wicd-curses should be working again. This is currently a bug on Bugzilla (https://bugzilla.redhat.com/show_bug.cgi?id=894646).

Problems with XBMC-audio on Apple TV 2

I have an Apple TV 2 that I’ve installed XBMC on. For a while it was working great, but out of the blue suddenly the sound got choppy. I guess there was an update that changed something. The best description I have for it is that the audio sounded like a machine gun – very annoying! And made movies unwatchable. Luckily, there’s a way to fix this. You simply need to change some of the XBMC-settings.

Go to:

  • System
  • System
  • Audio output
  • Check/uncheck Dolby Digital AC3 and DTS as capable receivers

This should do the trick! It certainly worked for me, so sure hope it works for you.

Continue enjoying your movies and series!

Introduction to strace

There will come a time when you will find yourself asking “What the heck is that process doing?”. To uncover the mysteries behind the behaviour of a process, we have a tool called strace.

The program strace is very handy when you want to debug the execution of a program. It catches and states all the system calls performed called by a process. It will also catch and state any inter-process signals received by this process.

Let’s dive into some examples.

Trace the execution

strace ls

..is the simple straight-forward way to use it. The output might look something like:

execve("/bin/ls", ["ls"], [/* 32 vars */]) = 0
brk(0)                                  = 0x1117000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe7c5bc2000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=69243, ...}) = 0
mmap(NULL, 69243, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fe7c5bb1000
close(3)                                = 0
open("/lib64/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\240d\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=142136, ...}) = 0
mmap(NULL, 2242712, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fe7c5780000
mprotect(0x7fe7c57a1000, 2093056, PROT_NONE) = 0
...

The output looks a bit messy, but it can provide very useful information like which files does this program use, what is this program doing right now or why does this program not read the config file – does it even look for it?

Attach to an existing process

You can run strace on a process that’s already running. Use -p, and provide the Process ID (PID):

pidof urxvtd
772
strace -p 772

The output presented to you is similar to the example above. Notice that you can only trace a process you have access rights to. Multiple -p options will also trace these processes with a limit of 32 processes that strace can attach to.

Trace child processes

Use -f to trace child processes as they are created by currently traced processes. This is useful for debugging a program that spawns children. strace will prepend the pid of the traced process output:

strace -f ls

Trace specific system calls

strace -e open ls

The e-flag, along with the call open, displays only open system calls of the ls command, which outputs something along these lines:

...
open("/lib64/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libattr.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
open("/proc/filesystems", O_RDONLY)     = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
ghost  ghost.zip
+++ exited with 0 +++

With the above example, close to the end, you can see two things – ghost and ghost.zip, a folder and file, which is the actual output of the command ls.

A few of the options available after -e trace= are:

  • open
  • close
  • read
  • write

Trace multiple system calls

What if you want to trace multiple system calls in one command though? The option -e trace= can take a comma separated set of systemcalls as argument:

strace -e trace=open,read ls

Which outputs:

...
open("/lib64/libattr.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\23\0\0\0\0\0\0"..., 832) = 832
open("/lib64/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340m\0\0\0\0\0\0"..., 832) = 832
open("/proc/filesystems", O_RDONLY)     = 3
read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tr"..., 1024) = 356
read(3, "", 1024)                       = 0
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
ghost  ghost.zip
+++ exited with 0 +++

Write output to file

If you’d like to write the output of strace to a file, add a -o:

strace -o ls.txt ls
ghost  ghost.zip

When you print the contents of ls.txt, you’ll see that it contains only the output from strace, and not from the command ls:

cat.ls.txt
...
write(1, "18.png\t\t   Apps  Declarations  d"..., 164) = 164
close(1)                                = 0
munmap(0x7f993acb6000, 4096)            = 0
close(2)                                = 0
exit_group(0)                           = ?
write(1, "18.png\t\t   Apps  Declarations  d"..., 164) = 164
close(1)                                = 0
munmap(0x7f993acb6000, 4096)            = 0
close(2)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++

Add a timestamp

If you add a -t to the command, you’ll be able to add a timestamp to each printed line. You can add up to 3 -t‘s. The more you add, the more verbose and detailed the timestamp will be.

One -t shows you seconds:

strace -t ls
...
11:52:20 close(2)                       = 0
11:52:20 exit_group(0)                  = ?
11:52:20 +++ exited with 0 +++

Adding a second -t will display microseconds:

strace -tt ls
...
11:53:07.593382 close(2)                = 0
11:53:07.593500 exit_group(0)           = ?
11:53:07.593651 +++ exited with 0 +++

A third -t will include the microseconds and the leading portion will be printed as the number of seconds since the epoch.

strace -ttt ls
...

If you’d like to find out the execution time of each call, -r will certainly do the trick:

strace -r ls
...
     0.000105 close(2)                  = 0
     0.000115 exit_group(0)             = ?
     0.000146 +++ exited with 0 +++

A summary of system calls

Would you like to have a summary of calls, time, and errors for each system call? -c does this:

strace -c ls
ghost  ghost.zip
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00    0.000054          11         5           mprotect
  0.00    0.000000           0         4           read
  0.00    0.000000           0         1           write
  0.00    0.000000           0         6           open
  0.00    0.000000           0         9           close
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         1         1 access
  0.00    0.000000           0         3           brk
  0.00    0.000000           0         2           ioctl
  0.00    0.000000           0         2           munmap
  0.00    0.000000           0        15           mmap2
  0.00    0.000000           0         7           fstat64
  0.00    0.000000           0         2           getdents64
  0.00    0.000000           0         1           set_thread_area
  0.00    0.000000           0         1           openat
------ ----------- ----------- --------- --------- ----------------
100.00    0.000054                    60         1 total

This option is very useful when trying to find out why a program is running slow.

Introduction to lsof

Today I’m going to introduce you to the exciting world of lsof.

As you will see, it’s a nifty little tool that has various uses, and it has so many switches that you need both a and a + to use all the options available! As the description of the command says in its man-page:

lsof – list open files

So, let’s get started.

Network

List network connections

$ lsof -i
COMMAND    PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ssh        868 jorge    3u  IPv4  12710      0t0  TCP j-laptop.fbarr.lan:55908->login.redpill-linpro.com:ssh (ESTABLISHED)
chrome     967 jorge  114u  IPv4 372589      0t0  TCP j-laptop.fbarr.lan:44756->edge-star-ecmp-04-ams2.facebook.com:https (ESTABLISHED)
...

List TCP/UDP connections

$ lsof -i TCP
COMMAND    PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
chrome     967 jorge  203u  IPv4 403952      0t0  TCP j-laptop.fbarr.lan:35942->173.192.82.194-static.reverse.softlayer.com:http (ESTABLISHED)
ssh        868 jorge    3u  IPv4  12710      0t0  TCP j-laptop.fbarr.lan:55908->login.acme.com:ssh (ESTABLISHED)

Simply replace TCP with UDP to see UDP connections.

$ lsof -i :22
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ssh     1742 jorge    3u  IPv4 448777      0t0  TCP j-laptop.fbarr.lan:36484->j-desktop.fbarr.lan:22 (ESTABLISHED)
ssh     5409 jorge    3u  IPv4  73369      0t0  TCP j-laptop.fbarr.lan:45986->j-server.fbarr.lan:22 (ESTABLISHED)
$ lsof -i @192.168.1.1
COMMAND PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
chrome  967 jorge  143u  IPv4 526978      0t0  TCP j-laptop.fbarr.lan:38571->calcifer.fbarr.lan:https (ESTABLISHED)

..and port:

$ lsof -i @192.168.1.1:443
chrome  967 jorge  143u  IPv4 526978      0t0  TCP j-laptop.fbarr.lan:38571->calcifer.fbarr.lan:https (ESTABLISHED)

It’s also possible to provide a port-range:

$ lsof -i :443-1000
COMMAND   PID  USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
chrome   4598 jorge   64u  IPv4   68058      0t0  TCP j-laptop.fbarr.lan:35515->do-20.lastpass.com:https (ESTABLISHED)
chrome   4598 jorge   98u  IPv6 5251212      0t0  TCP j-laptop.fbarr.lan:43729->lb-in-x5e.1e100.net:https (ESTABLISHED)

List connections with status LISTEN

$ sudo lsof -i | grep LISTEN
sshd      11903  root    3u  IPv4 549183      0t0  TCP *:ssh (LISTEN)
sshd      11903  root    4u  IPv6 549185      0t0  TCP *:ssh (LISTEN)

Replace LISTEN with ESTABLISHED, and various other options, to grab what you’re looking for.

List IPv4/IPv6 connections

$ lsof -i 4
COMMAND   PID  USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
chrome   4598 jorge   64u  IPv4   68058      0t0  TCP j-desktop.fbarr.lan:35515->do-20.lastpass.com:https (ESTABLISHED)
mutt    14654 jorge    3u  IPv4   41678      0t0  TCP j-desktop.fbarr.lan:57323->87.144.18.114:imaps (ESTABLISHED)

$ lsof -i 6
COMMAND   PID  USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
chrome   4598 jorge  127u  IPv6 5278504      0t0  TCP j-desktop.fbarr.lan:42348->lb-in-x5d.1e100.net:https (ESTABLISHED)
chrome   4598 jorge  182u  IPv6  132082      0t0  TCP j-desktop.fbarr.lan:59281->arn02s06-in-x0e.1e100.net:https (ESTABLISHED)

Users, processes and files

lsof not only is useful for network-related tasks, but works excellent for users, processes and files.

List open files of user

$ lsof -u jorge
...
COMMAND     PID  USER   FD      TYPE     DEVICE SIZE/OFF    NODE NAME
lsof      26305 jorge  txt       REG        8,3   146236  294089 /usr/bin/lsof
lsof      26305 jorge  mem       REG        8,3    46816  276251 /usr/lib/libnss_files-2.18.so
lsof      26305 jorge  mem       REG        8,3  1607632  294020 /usr/lib/locale/locale-archive
...

List processes by PID

$ lsof -n -p 25 -p 45

List processes by name

$ lsof -n -c urxvt
COMMAND  PID  USER   FD      TYPE             DEVICE SIZE/OFF    NODE NAME
urxvtd  1749 jorge  txt       REG                8,1  1299408 3431669 /usr/bin/urxvtd
urxvtd  1749 jorge  mem       REG                8,1    51808 3411196 /usr/lib/libnss_files-2.18.so

List connections to a file

$ sudo lsof /var/log/Xorg.0.log
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
X       400 root    0w   REG    8,1    30052 7602187 /var/log/Xorg.0.log

HUP a process

$ kill -HUP `lsof -t -c chrome`

Kill all of a user’s processes

$ kill -9 `lsof -t -u jorge`
$ lsof +L1

These files have been deleted, but one or several processes are keeping the files open. Though it might appear that the files are deleted from the filesystem, both the files and the blocks are being preserved.

These are just a few of the things you can do with lsof. I hope this tutorial has made you a little bit smarter!

urxvt and urlLauncher not working

I recently found myself having problems with urxvt. In my configuration-file, .Xdefaults, I had the following lines set up:

URxvt.perl-ext-common : default,matcher
URxvt.urlLauncher : /usr/bin/google-chrome

This would enable urxvt to highlight a link in white, and when clicking it would launch the URL in to a tab of my browser of choice. But one day it suddenly stopped working, for no apparent reason. After a little digging, I found the following in urxvt’s changelog, http://cvs.schmorp.de/rxvt-unicode/Changes:

– INCOMPATIBLE CHANGE: renamed urlLauncher resource to url-launcher.

Changing URxvt.urlLauncher to URxvt.url-launcher in .Xdefaults seemed to fix the problem!

Reducing PDF file-size in Linux

The other day I downloaded a PDF that ended up being a whole lot bigger than I thought. A “whopping” 230MB, which is another deal compared to the 30MB PDF’s that I’m accustomed to. So how to reduce the file-size? Ghostscript to the rescue!

If you have Ghostscript installed, run the following command to reduce the file-size of your PDF:

gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -sOutputFile=new_file.pdf original_file.pdf

Now you have a few options here under -dPDFSettings:

  • /screen selects low-resolution output, and the lowest file-size.
  • /ebook selects medium-resolution output, with a medium file-size.
  • /printer and /prepress are both the high-resolution options, which is mainly used for printing PDFs. As you might have guessed, this option gives you the biggest file-size (yes, even bigger than your mother).

The results?

[jorge@(ashitaka):~/Downloads/PDF] du -h *
29M new_file.pdf
230M original_file.pdf

What can I say. I’m a cheap bastard when it comes to storage space, no matter how low the price might be. ;)

Vim re-edit file as root

Have you ever found yourself in a situation where you’ve edited a file for quite some time, only to find out that you get a “Permission Error” when trying to save the changes? If vim is your editor, and you have sudo-privileges, try doing this:

:w !sudo tee %

Does the trick. :)

iPad and Comicbooks

So what can I say. I finally succumbed and bought an iPad. Mainly because my friend Kevin kept nagging me about how wonderful it was. Bastard. Gríma Wormtongue is his new nickname. I’ve had my iPad for a couple of weeks now.

But seriously though, the iPad is doing great stuff for me. I’m using it for all sorts of purposes, and the one I’m going to bring up in this case is reading comicbooks. I use an application called Comic Zeal. Now, I’ve never been a particularly avid reader of comicbooks, but I remember back during my younger years when I sat at the library, reading every edition of Elfquest that I could get my hands on. So years (yeaaaaars) later, I finally wanted to give it a try again. That’s where Comic Zeal comes into play.

comiczeal

Comic Zeal is an application able to (taken from their site):

  • Organize your comics using Series and Dividers, don’t look through hundreds to find the one you want.
  • Search and find your comics by title. On the iPad you can tag your comics for even easier searching.
  • Use Comic Zeal‘s copy function to organize your collection in amazing ways.
  • When you finish reading one comic, Comic Zeal automatically opens the next one.
  • Avoid seeing the same borders page after page with Comic Zeal’s zoom lock.
  • Load your comics through USB or wi-fi using iTunes file sharing, or other apps like Drop Box!

It really works great, I can truly recommend it.

Now, I’ve only come across a few good comicbooks so far, but the ones I can recommend are:

American Vampire

americanvampire

The series imagines vampires as a population made up of many different secret species, and charts moments of vampire evolution and inter-species conflict throughout history. The focus of the series is a new American bloodline of vampires, born in the American West in the late 1800s. The first of this new species is a notorious outlaw named Skinner Sweet, who wakes from death, after being infected, to find he has become a new kind of vampire, something stronger and faster than what came before, impervious to sunlight, with a new set of strengths and weaknesses.

The Walking Dead

thewalkingdead

The Walking Dead is a monthly black-and-white comic book series chronicling the travels of Rick Grimes, his family, and other survivors of a zombie apocalypse. Shot in the line of duty, Kentucky police officer Rick Grimes wakes from a coma in the hospital to find his town filled with walking corpses.

Witch Doctor

witchdoctor

Witch Doctor combines elements of the horror and medical drama genres. The protagonist, Dr. Vincent Morrow, is a maverick doctor who specializes in “supernatural medicine,” supplementing common medical practices with magic. Dr. Morrow’s “cases” predominantly involve infectious supernatural creatures like vampires, demonic possession, as well as elements based on the cosmic horror of H.P. Lovecraft. In the first Witch Doctor mini-series, Dr. Morrow treats (and battles) a vampire, demons possessing a child, faerie changelings, and Deep Ones (crossed with the Creature From the Black Lagoon), among others.

So there you have it! If you have any other suggestions (I’ve been recommended Sandman, Fable and Y: The Last Man so far), let me know!