How to mount qcow2 images

Have you ever needed to access a virtual machine without starting it? Perhaps you just needed few important files. In case it is in a qcow2 (qemu/kvm) format this can be easily done by:

qemu-nbd -c /dev/nbd0 vm.qcow2.img
mount /dev/nbd0p1 /mnt/VirtualM

Naturally, you would first need to load the nbd module.

If the image is not in the qcow2 format but in VMware format (vmdk) it can be converted to qcow2 like this:

kvm-img convert -O qcow2 disk1.vmdk disk1.qcow2

Later you can disconnect the image with (again as the root):

qemu-nbd -d /dev/nbd0

Just, don’t forget first to unmount it:

umount /mnt/virtualM

break to blame the breakup (BBB)

Let’s try to reconstruct the error that happens only sometimes... Let’s try:

w,h = 512,512
data = scipy.zeros( (w,h,3), dtype=np.uint8)
data[256,256] = [255,0,0]
img = Image.fromarray(data, 'RGB')

But this does not throw an error!!! How to reconstruct this error then? However, I do not believe in the ghost in the machine, and I was quite positive that I’m not crazy (yet) since I was able to find others reporting this strange behavior, so I dig deeper.

After a while I figure out it was the b from pdb module to blame, not the PIL.

Fun with P(h)IL

Have you ever tried to convert BGR image to RGB image.

Of course, this can be done by giong back and forth between scipy and PIL, and shuffling the channals in between.

scipyimg = scipy.misc.pilutil.fromimage(pilimg)
scipyimg = scipy.asarray(pilimg)
pilimg = Image.fromarray(scipyimg, 'RGB')

But there is also a more direct way to do it. Let’s try:

B,G,R = pilimg.split()
pilimg = Image.merge("RGB",(R,G,B))

Funny,

b,g,r = pilimg.split()

sometimes (but, just sometimes) throws an error like this:

*** The specified object ',g,r = pilimg.split()' is not a function

To sugar or not to sugar

Sometimes it is a question on whether to use syntactic sugar or not. Let’s look at the following example:

from scipy import r_, place
a = r_[[1,2,3,4]]
plyce(a,a>2,0)
place(a,a>2,0)
b = r_[[1,2,3,4]]
b[b>2] = 0
a==b

It is just a matter of taste if someone prefer logical indexing.

Python debug notes

At specific location insert:

import pdb; pdb.set_trace()

then continue

Post-mortem debugging:

import pdb; pdb.pm()

Vim commands

Basics

:e filename     Open filename for edition
:w      Save file
:q      Exit Vim
:q!     Quit without saving
:x      Write file (if changes has been made) and exit
:sav filename   Saves file as filename
.       Repeats the last change made in normal mode
5.      Repeats 5 times the last change made in normal mode

Moving in the file

k or Up Arrow   move the cursor up one line
j or Down Arrow         move the cursor down one line
e       move the cursor to the end of the word
b       move the cursor to the begining of the word
0       move the cursor to the begining of the line
G       move the cursor to the end of the file
gg      move the cursor to the begining of the file
L       move the cursor to the bottom of the screen
:59     move cursor to line 59. Replace 59 by the desired line number.
20|     move cursor to column 20.
%       Move cursor to matching parenthesis
[[      Jump to function start
[{      Jump to block start

Cut, copy & paste

y       Copy the selected text to clipboard
p       Paste clipboard contents
dd      Cut current line
yy      Copy current line
y$      Copy to end of line
D       Cut to end of line

Replace

:%s/old/new/g   Replace all occurences of old by new in file
:%s/onward/forward/gi   Replace onward by forward, case unsensitive
:%s/old/new/gc  Replace all occurences with confirmation
:2,35s/old/new/g        Replace all occurences between lines 2 and 35
:5,$s/old/new/g         Replace all occurences from line 5 to EOF
:%s/^/hello/g   Replace the begining of each line by hello
:%s/$/Harry/g   Replace the end of each line by Harry
:%s/onward/forward/gi   Replace onward by forward, case unsensitive
:%s/ *$//g      Delete all white spaces
:g/string/d     Delete all lines containing string
:v/string/d     Delete all lines containing which didn’t contain string
:s/Bill/Steve/  Replace the first occurence of Bill by Steve in current line
:s/Bill/Steve/g         Replace Bill by Steve in current line
:%s/Bill/Steve/g        Replace Bill by Steve in all the file
:%s/^M//g       Delete DOS carriage returns (^M)
:%s/\r/\r/g     Transform DOS carriage returns in returns
:%s#<[^>]\+>##g         Delete HTML tags but keeps text
:%s/^\(.*\)\n\1$/\1/    Delete lines which appears twice
Ctrl+a  Increment number under the cursor
Ctrl+x  Decrement number under cursor
ggVGg?  Change text to Rot13

Case

Vu      Lowercase line
VU      Uppercase line
g~~     Invert case
vEU     Switch word to uppercase
vE~     Modify word case
ggguG   Set all text to lowercase
gggUG   Set all text to uppercase
:set ignorecase         Ignore case in searches
:set smartcase  Ignore case in searches excepted if an uppercase letter is used
:%s/\<./\u&/g   Sets first letter of each word to uppercase
:%s/\<./\l&/g   Sets first letter of each word to lowercase
:%s/.*/\u&      Sets first letter of each line to uppercase
:%s/.*/\l&      Sets first letter of each line to lowercase

Read/Write files

:1,10 w outfile         Saves lines 1 to 10 in outfile
:1,10 w >> outfile      Appends lines 1 to 10 to outfile
:r infile       Insert the content of infile
:23r infile     Insert the content of infile under line 23
File explorer
:e .    Open integrated file explorer
:Sex    Split window and open integrated file explorer
:Sex!   Same as :Sex but split window vertically
:browse e       Graphical file explorer
:ls     List buffers
:cd ..  Move to parent directory
:args   List files
:args *.php     Open file list
:grep expression *.php  Returns a list of .php files contening expression
gf      Open file name under cursor
Interact with Unix
:!pwd   Execute the pwd unix command, then returns to Vi
!!pwd   Execute the pwd unix command and insert output in file
:sh     Temporary returns to Unix
$exit   Retourns to Vi
Alignment
:%!fmt  Align all lines
!}fmt   Align all lines at the current position
5!!fmt  Align the next 5 lines

Tabs/Windows

:tabnew         Creates a new tab
gt      Show next tab
:tabfirst       Show first tab
:tablast        Show last tab
:tabm n(position)       Rearrange tabs
:tabdo %s/foo/bar/g     Execute a command in all tabs
:tab ball       Puts all open files in tabs
:new abc.txt    Edit abc.txt in new window

Window spliting

:e filename     Edit filename in current window
:split filename         Split the window and open filename
ctrl-w up arrow         Puts cursor in top window
ctrl-w ctrl-w   Puts cursor in next window
ctrl-w_         Maximize current window vertically
ctrl-w|         Maximize current window horizontally
ctrl-w=         Gives the same size to all windows
10 ctrl-w+      Add 10 lines to current window
:vsplit file    Split window vertically
:sview file     Same as :split in readonly mode
:hide   Close current window
:­nly   Close all windows, excepted current
:b 2    Open #2 in this window

Auto-completion

Ctrl+n Ctrl+p (in insert mode)  Complete word
Ctrl+x Ctrl+l   Complete line
:set dictionary=dict    Define dict as a dictionnary
Ctrl+x Ctrl+k   Complete with dictionnary

Marks

m {a-z}         Marks current position as {a-z}
' {a-z}         Move to position {a-z}
''      Move to previous position

Abbreviations

:ab mail mail@provider.org      Define mail as abbreviation of mail@provider.org

Text indent

:set autoindent         Turn on auto-indent
:set smartindent        Turn on intelligent auto-indent
:set shiftwidth=4       Defines 4 spaces as indent size
ctrl-t, ctrl-d  Indent/un-indent in insert mode
>>      Indent
<<      Un-indent
=%      Indent the code between parenthesis
1GVG=   Indent the whole file

Syntax highlighting

:syntax on      Turn on syntax highlighting
:syntax off     Turn off syntax highlighting
:set syntax=perl        Force syntax highlighting

A Note on Grep

Match pattern1 AND pattern2, but NOT pattern3

ordered:

$ grep -E ‘pattern1.*pattern2’ filename | grep -Ev ‘pattern3’

unordered:

$ grep -E ‘pattern1’ filename | grep -E ‘pattern2’ | grep -Ev ‘pattern3’

Match pattern1 OR pattern2, but NOT pattern3 in the same line:

$ grep -E ‘pattern1|pattern2’ filename | grep -Ev ‘pattern3’

grep -E = egrep = match everwhere

Python cv2.findContour from OpenCV

Try:

img = uint8([[0,255,255,0],[0,255,255,0],[0,255,255,0],[0,255,255,0]])
contours, hierarchy = cv2.findContours( img,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE )
img

And you will probbably get:

array([[  0,   0,   0,   0],
        [  0,   2, 130,   0],
        [  0,   2, 130,   0],
        [  0,   0,   0,   0]], dtype=uint8)

This does not seem to be the expected behavior, as the input image has changed. However it is documented_ that img is InputOutputArray (at least for C++), and since python uses cv2.so library this is probbably inherited behavior. However, there is a simple workaround this, by simply using: img.copy()

Linux fc command

Netko je dao usporedbu da je ZSH poput BASH-a na steroidima. Mnoge naredbei iz BASH-a su nabildani s dodatnim mogučnostima, pa to vrijedi i za naredbu fc. No, kako otktiri sve te mogučnosti. Prva prepreka s kojom se možemo susresti je da pokušamo s naredbom help -m fc, kao što bismo to učinili u BASH-u. Na naše veliko razočaranje otkrili da bismo da ZSH nema naredbu help. Možda bismo bili pred iskušenjem da pokušamo definirati funkciju poput

bash_help(){ #Function that simualtes "bash help" behavior.
bash -c "help $@"}

...ili biste jednostavno korisitili man 1 zshbuiltins, te tražili željeni pojam... A zapravo ste željeli nešto poput run-help fc. Naredba run-help ima kraticu MOD-h koja je dovoljno pametna da se može korisiti i nakon što je naredba napisan! Pušajte ovaj naputak: fc MOD-h.

Ipak, svaka naredba od koje tražimo pomoć dat će različitu informaciju:

% man bash
% help fc
% man zshbuiltins
% run-help fc

Quick ref

fc - fix command (history)
fc [ -e ename ] [ -m match ] [ old=new ... ] [ first [ last ] ]
fc -l [ -nrdfEiD ] [ -t timefmt ] [ -m match ]
     [ old=new ... ] [ first [ last ] ]
fc -p [ -a ] [ filename [ histsize [ savehistsize ] ] ]
fc -P
fc -ARWI [ filename ]

...ili...

Options:
bash:
    -e ENAME select which editor to use.  Default is FCEDIT, then EDITOR, then vi
    -l       list lines instead of editing
    -n       omit line numbers when listing
    -r       reverse the order of the lines (newest listed first)
zsh:
   -d       prints timestamps for each command
   -f       prints full time-date stamps in the US 'MM/DD/YY  hh:mm' format
   -E       prints full time-date stamps in the European 'dd.mm.yyyy hh:mm' format
   -i       prints full time-date stamps in ISO8601 'yyyy-mm-dd hh:mm' format
   -t fmt   prints  time  and date stamps in the given format; fmt is formatted with
            the strftime function with the zsh  extensions  described  for the
            %D{string} prompt format in the section EXPANSION OF PROMPT SEQUENCES in
            zshmisc(1).  The resulting formatted string must be no more than 256
            characters or will not be printed.
   -D       prints elapsed times; may be combined  with  one  of  the options above.
   -A       append the history
   -W       write ""
   -R       redundant ""
   -I       incremental ""

history = fc -l
r = fc -e -