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
Search
/word Search word from top to bottom
?word Search word from bottom to top
* Search the word under cursor
/\cstring Search STRING or string, case insensitive
/jo[ha]n Search john or joan
/\< the Search the, theatre or then
/the\> Search the or breathe
/\< the\> Search the
/\< ¦.\> Search all words of 4 letters
/\/ Search fred but not alfred or frederick
/fred\|joe Search fred or joe
/\<\d\d\d\d\> Search exactly 4 digits
/^\n\{3} Find 3 empty lines
:bufdo /searchstr/ Search in all open files
bufdo %s/something/somethingelse/g Search something in all the open buffers and replace it with somethingelse
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 -