Vim – tips and tricks

Record a macro that will delete everything after matching character and repeat it N-times.
In this example we’re going to use ‘=’ as the matching character.


‘qa’ – to start recording and save it under ‘a’ buffer
‘f=’ – find ‘=’ character
‘D’ – Delete everything to the EOL
‘āŽ’ – press ‘enter’ to go to the beginning of next line
‘q’ – to stop recording the macro

then to repeat the macro N-times, i.e. repeat it 5 times:


‘5’ – the number of times you’d like to repeat the macro
‘@a’ – play macro recorded under ‘a’ buffer

VIM macro delete everything after matching character and repeat N-times

VIM macro delete everything after matching character and repeat N-times

GEE [Jmeter-ec2] – video tutorials part 1

I finally started recording videos explaining how to use Gee.
Gee is a tool based on a JMeter-EC2 project by Oliver Lloyd.
It allows you to run JMeter tests on:

  • Amazon EC2
  • Vagrant boxes
  • Linux hosts

Running your tests using this tool is better than using the standard distributed mode in Jmeter, because it doesn’t require constant communication between the master node and slave nodes.

Here are first few videos explaining how to clone the project, spawn new vagrant box and finally how to run an example project on that virtual box.
Hope you all will find in useful šŸ™‚

GEE [Jmeter-ec2] – 01 – cloning the project

GEE [Jmeter-ec2] – 02 – initialize vagrant box

GEE [Jmeter-ec2] – 03 – running an example test on a vagrant box

How to compile and install latest version of Vim with support for: X11 clipboard, ruby, python 2 or python 3

This was tested with vim 7.4.(1-398)
(Update: 2013-12-03 apparently you can’t build vim with support for both python 2 and python 3, so I had to update this tutorial a bit šŸ™‚ )
(Update: 2014-08-09 Added three commands: “hg pull”, “hg update” and “hg status” to pull the latest version of the repo)

First of all install all the dependencies required when compiling Vim with additional options:

@:~> sudo apt-get install mercurial python python-dev python3 python3-dev ruby ruby-dev libx11-dev libxt-dev libgtk2.0-dev  libncurses5  ncurses-dev

Then clone official vim repo, configure it with support for: X11 clipboard, ruby, python 2 or 3 and few other cool options šŸ™‚

@:~> hg clone vim
## if you already had this repo cloned, then update it:
@:~> hg pull
@:~> hg update
## and then check if you definitely have the latest version:
@:~> hg summary
parent: 6121:913d16b4904c
 Added tag v7-4-398 for changeset f62b2e76dd80
branch: default
commit: (clean)
update: 52 new changesets (update)
@:~> cd vim/src
## this will configure it with python 2
@:~> ./configure \
    --enable-perlinterp \
    --enable-pythoninterp \
    --enable-rubyinterp \
    --enable-cscope \
    --enable-gui=auto \
    --enable-gtk2-check \
    --enable-gnome-check \
    --with-features=huge \
    --enable-multibyte \
    --with-x \
    --with-compiledby="Senor QA <senor@qa>" \
## and with python 3
@:~> ./configure \
    --enable-perlinterp \
    --enable-python3interp \
    --enable-rubyinterp \
    --enable-cscope \
    --enable-gui=auto \
    --enable-gtk2-check \
    --enable-gnome-check \
    --with-features=huge \
    --enable-multibyte \
    --with-x \
    --with-compiledby="Senor QA <senor@qa>" \

Next step is to compile our setup:

@:~> make

Then if you want you can check if all the features were compiled properly:

VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Aug  9 2014 15:37:52)
Included patches: 1-398
Compiled by Me <senor@qa>
Huge version with GTK2 GUI.  Features included (+) or not (-):
+acl             +farsi           +mouse_netterm   +syntax
+arabic          +file_in_path    +mouse_sgr       +tag_binary
+autocmd         +find_in_path    -mouse_sysmouse  +tag_old_static
+balloon_eval    +float           +mouse_urxvt     -tag_any_white
+browse          +folding         +mouse_xterm     -tcl
++builtin_terms  -footer          +multi_byte      +terminfo
+byte_offset     +fork()          +multi_lang      +termresponse
+cindent         +gettext         -mzscheme        +textobjects
+clientserver    -hangul_input    +netbeans_intg   +title
+clipboard       +iconv           +path_extra      +toolbar
+cmdline_compl   +insert_expand   -perl            +user_commands
+cmdline_hist    +jumplist        +persistent_undo +vertsplit
+cmdline_info    +keymap          +postscript      +virtualedit
+comments        +langmap         +printer         +visual
+conceal         +libcall         +profile         +visualextra
+cryptv          +linebreak       +python          +viminfo
+cscope          +lispindent      -python3         +vreplace
+cursorbind      +listcmds        +quickfix        +wildignore
+cursorshape     +localmap        +reltime         +wildmenu
+dialog_con_gui  -lua             +rightleft       +windows
+diff            +menu            +ruby            +writebackup
+digraphs        +mksession       +scrollbind      +X11
+dnd             +modify_fname    +signs           -xfontset
-ebcdic          +mouse           +smartindent     +xim
+emacs_tags      +mouseshape      -sniff           +xsmp_interact
+eval            +mouse_dec       +startuptime     +xterm_clipboard
+ex_extra        -mouse_gpm       +statusline      -xterm_save
+extra_search    -mouse_jsbterm   -sun_workshop    -xpm
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
 2nd user vimrc file: "~/.vim/vimrc"
      user exrc file: "$HOME/.exrc"
  system gvimrc file: "$VIM/gvimrc"
    user gvimrc file: "$HOME/.gvimrc"
2nd user gvimrc file: "~/.vim/gvimrc"
    system menu file: "$VIMRUNTIME/menu.vim"
  fall-back for $VIM: "/usr/local/share/vim"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_GTK  -pthread -I/usr/include/gtk-2.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/freetype2 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/libpng12 -I/usr/include/harfbuzz     -g -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1      
Linking: gcc   -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -L/build/buildd/ruby1.9.1- -rdynamic -Wl,-export-dynamic  -L/usr/local/lib -Wl,--as-needed -o vim   -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfontconfig -lgobject-2.0 -lglib-2.0 -lfreetype   -lSM -lICE -lXt -lX11 -lXdmcp -lSM -lICE  -lm -ltinfo -lnsl   -ldl    -L/usr/lib/python2.7/config-x86_64-linux-gnu -lpython2.7 -lpthread -ldl -lutil -lm -Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions   -lruby-1.9.1 -lpthread -lrt -ldl -lcrypt -lm  -L/usr/lib

Just to make sure it works as it should, launch newly compiled ./vim, and type:

:echo has("python")

It should return 1 if it was compiled properly šŸ™‚

If you’re happy then install it šŸ™‚

@:~> sudo make install

Then locate the vim command

@:~> which vim
vim is /usr/local/bin/vim
vim is /usr/bin/vim

As you can see, there are two installed on my system.
To make newly installed version “/usr/local/bin/vim” the default one, we’ll use “update-alternatives”.

@:~> sudo update-alternatives --install "/usr/bin/vim" "vim" "/usr/local/bin/vim" 1
@:~> sudo update-alternatives --install "/usr/bin/vi" "vi" "/usr/local/bin/vim" 1

Then use “update-alternatives” to switch between installed versions šŸ™‚

@:~> sudo update-alternatives --config vim
There are 2 choices for the alternative vim (providing /usr/bin/vim).

  Selection    Path                Priority   Status
* 0            /usr/bin/vim.basic   30        auto mode
  1            /usr/bin/vim.basic   30        manual mode
  2            /usr/local/bin/vim   1         manual mode

Press enter to keep the current choice[*], or type selection number: 2
@:~> # now let's change symbolic link for vi
@:~> sudo update-alternatives --config vi
There are 3 choices for the alternative vi (providing /usr/bin/vi).

  Selection    Path                Priority   Status
* 0            /usr/bin/vim.basic   30        auto mode
  1            /usr/bin/vim.basic   30        manual mode
  2            /usr/bin/vim.tiny    10        manual mode
  3            /usr/local/bin/vim   1         manual mode

Press enter to keep the current choice[*], or type selection number: 3
update-alternatives: using /usr/local/bin/vim to provide /usr/bin/vi (vi) in manual mode

Last thing to do is to check where the /usr/bin/vim points at:

@:~> ll /usr/bin/vim
lrwxrwxrwx 1 root root 21 Jun  7 11:29 /usr/bin/vim -> /etc/alternatives/vim*

Then check where the /etc/alternatives/vim points at.
If everything went fine, it should be pointing at: /usr/local/bin/vim

@:~> ll /etc/alternatives/vim
lrwxrwxrwx 1 root root 18 Nov 19 12:17 /etc/alternatives/vim -> /usr/local/bin/vim*

Happy Vimming šŸ™‚

How to add official Chromium-browser PPA repository to Linux Mint 15 and install the latest stable build

Here’s the official Chromium-browser PPA repo:

To install latest stable build follow 3 simple steps:

Step 1:
add “deb raring main” to /etc/apt/sources.list

Step 2:
add repo’s pub key so that we can avoid problems like the one below:

W: GPG error: raring Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 5A9BF3BB4E5E17B5
sudo gpg --keyserver hkp:// --recv 5A9BF3BB4E5E17B5
sudo gpg --export FBEF0D696DE1C72BA5A835FE5A9BF3BB4E5E17B5 | sudo apt-key add -

btw. using hkp:// will work even if you’re behind a firewall or proxy šŸ™‚

Step 3:
Update package list and install Chromium

sudo apt-get update
sudo apt-get install chromium-browser

Step 4:
Happy browsing šŸ™‚

How to build pidgin-sipe plugin with audio and video support on ubuntu/linux mint

Tested with pidgin-sipe-1.17.0

First of all install all the dependencies:

sudo apt-get install libxml2-dev libnspr4-dev libnss3-dev libgstreamer0.10-dev libnice-dev libpurple-dev libnss3-dev libglib2.0-dev 

then check where libnspr4 was installed

sudo dpkg -L libnspr4

Then finally configure nspr paths accordingly, compile and install it:

./configure --prefix=/usr  --with-vv --with-nss-includes=/usr/include/nss --with-nss-libs=/usr/lib/x86_64-linux-gnu --with-nspr-includes=/usr/include/nspr --with-nspr-libs=/usr/lib/x86_64-linux-gnu
sudo make install

Hope it helps šŸ™‚
If everything works fine then your Lync contact list should look like this:

pidgin with sipe-1.17.0

pidgin with sipe-1.17.0

how to change the default keyserver used by the command: “sudo add-apt-repository …”

Tested on linux mint 15.

If you encountered problems with connecting to when adding a new ppa to your list of repositories using add-apt-repository, i.e.: “sudo add-apt-repository ppa:jon-severinsson/ffmpeg”
Here’s an example failure:

Executing: gpg --ignore-time-conflict --no-options --no-default-keyring --secret-keyring /tmp/tmp.UsuIhHAgLO --trustdb-name /etc/apt//trustdb.gpg --keyring /etc/apt/trusted.gpg --primary-keyring /etc/apt/trusted.gpg --keyserver --recv-keys CFCA9579
gpg: requesting key CFCA9579 from hkp server
gpg: keyserver timed out
gpg: keyserver receive failed: keyserver error

Then what you have to do is to change the default port used for obtaining pgp keys from 11371 to 80.
To do this edit:

sudo vi /usr/lib/linuxmint/mintSources/

and replace all the occurrences of “” with


after that,……
simply enjoy the rest of your life!

Monitoring JVM metrics via JMX managemnet interface in JMeter

What do we need:

Once you have plugins installed them in the jmeter’s/lib/ext folder, then:
1 – On the box you want to monitor, copy templates: jmxremote.password & jmxremote.access from $JAVA_HOME/lib/management to for example: /srv/play/
2 – edit them according to your liking
3 – launch your JAVA application with additional parameters:

java -jar your_application.jar

4 – start a server-agent ( on the host which JVM metrics you want to monitor using command like:

cd ${jmeter_folder}/lib/ext/
java -jar ./CMDRunner.jar --tool PerfMonAgent --udp-port 0 --tcp-port 7777

You can also run it as background process and detach from your session, so it will continue to work even if you disconnect from the server.

cd ${jmeter_folder}/lib/ext/
nohup java -jar ./CMDRunner.jar --tool PerfMonAgent --udp-port 0 --tcp-port 7777 &

5 – add “PerfMon Metrics Collector” to your test plan
6 – provide the hostname/IP address of the box running server-agent in the “Host/IP” field (don’t forget about the port šŸ™‚ )
7 – select JMX as the “Metric to collect”
8 – double click on “Metric parameter” field and then click on the “…” button to the right
9 – enter all the credentials that the server-agent will use to connect to the local JVM via JMX port. Here’s an example config:


where role & password are of course defined in the jmxremote.password & jmxremote.access files

btw. Here’s an example test plan with preconfigured PerfMon listener.

If everything was configured properly the you should see something like that on the PerfMon graph:

example PerfMon graph with JVM Metrics

example PerfMon graph with JVM Metrics