Getting the Brightness Control to work on Lenovo ThinkPad with Linux Mint 17 (x64) installed and with Nvidia Quadro K1000M on board

I haven’t had much problems with getting the Brightness Control to work in Mint 16, but after installing v17 I had to struggle much more.

I honestly admit that I don’t know which of the following steps actually did the trick, nevertheless it works now πŸ™‚

OK, I’m currently running Mint 17 x64 on Lenovo W530 with Nvidia Quadro K1000M and with Nvidia 331.38 installed.

Display mode in BIOS is set to “Discrete Mode”.

Here’s a list of things I did:

– I’ve updated the bios to latest available version (G5ET99WW (2.59))

Here’s my tutorial how to upgrade it from a USB pendrive

– Generated a new xorg.conf using “NVIDIA X Server Settings” -> “X Server Display Configuration” -> “Save to X Configuration file”

– Then added “EnableBrightnessControl=1” to the device section in /etc/X11/xorg.conf:

     Section "Device"
         Identifier     "Device0"
         Driver         "nvidia"
         VendorName     "NVIDIA Corporation"
         BoardName      "Quadro K1000M"
         Option         "RegistryDwords" "EnableBrightnessControl=1"
     EndSection

– After rebooting, the only thing I could find in /sys/class/backlight was:

thinkpad_screen

– Then I tried to set the “GRUB_CMDLINE_LINUX_DEFAULT” in /etc/default/grub to:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash acpi_osi=Linux acpi_backlight=vendor"

or

> GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nox2apic acpi_osi=Linux acpi_backlight=vendor"

but that didn’t work

– Finally I set it to only:

> GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nox2apic"

– and after rebooting Brightness Control buttons (Fn+F8 & F9) started to work
and in the /sys/class/backlight I found acpi_video0 instead of thinkpad_screen

     $ ll /sys/class/backlight
     total 0
     lrwxrwxrwx 1 root root 0 Aug 10 10:14 acpi_video0 -> ../../devices/pci0000:00/0000:00:01.0/0000:01:00.0/backlight/acpi_video0/

I hope this will help someone.
Pls drop some comments if it helped you!

Cheers,
SeΓ±or QA

How to unit test Django’s Function Based Views

Let’s assume than the URL pattern to your Function Based View is defined like that:
urls.py

urlpatterns = patterns(
    ...,
    url(r'^$', views.index, name='index'),
    ...
)

and your function based view looks like this:
views.py

@api_view(['GET'])
@permission_classes((AllowAny,))
def index(request):
    data = {
        'field': 'value'
    }
    return Response(data)

Then you can unit test such view by creating a minimal instance
of the HttpRequest and pass it to that view.
I tried to mock to test such view with the Mock library, by with no luck!!!
If case you know how to do it with Mock, then let me know!

def test_index_function_based_view():
    _request = HttpRequest()
    _request.method = 'GET'
    request = Request(_request)
    response = index(request)
    assert response.data['field'] ==  'value'

Run your Selenium driven tests in parallel using TestNG.

Sometime ago I came across this post:
http://rationaleemotions.wordpress.com/2013/07/31/parallel-webdriver-executions-using-testng/
And I thought it’d be good to have it in a repo to save you time setting up your own project.

Basically this example project runs JUnit tests in parallel using TestNG.
Tests are grouped by the browser in which they’re going to be executed (have a look at the TestNG XML Suite files in src/test/resources).
As you might have guessed to drive the browsers we use Selenium WebDriver πŸ™‚
And of course you can run your tests locally or remotely using Selenium GRID.

You can find the repo here: https://github.com/kowalcj0/parallel-selenium-with-testng

And here’s a video showing this project in action πŸ™‚

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 https://vim.googlecode.com/hg/ 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>" \
    --with-python-config-dir=/usr/lib/python2.7/config-x86_64-linux-gnu
##
## 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>" \
    --with-python3-config-dir=/usr/lib/python3.3/config-3.3m-x86_64-linux-gnu

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-1.9.3.484/debian/lib -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 πŸ™‚
J

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 keyserver.ubuntu.com 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 keyserver.ubuntu.com --recv-keys CFCA9579
gpg: requesting key CFCA9579 from hkp server keyserver.ubuntu.com
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/mintSources.py

and replace all the occurrences of “keyserver.ubuntu.com” with

hkp://keyserver.ubuntu.com:80

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

Introducing Soapy – a helper lib for SoapUI

Hi All,

This project is really an immature one, with a mixture of Java and Groovy, lacking loads of the documentation, so use it at your own risk πŸ™‚
After those few words of encouragement I must say that actually without this lib my friendship with SoapUI would end months ago.
I don’t have much time to describe what kind of stuff you can find in there, so please explore the src code. There’s one example at the end of this post that I find pretty useful.
The best thing is that you can use it with the free version of SoapUI.

As mentioned before, many classes are still missing a decent documentation, but I’m still hoping that one day everything will better and sun will shine for all of us!
Before asking any questions, please read the README.md file and/or read the code itself πŸ™‚

To compile the project you’ll need:

  • Git
  • Java
  • & Maven

Once the build process is done, simply put the soapy-1.0.jar from ./target directory to your SoapUI/bin/ext folder, then restart the SoapUI.
If everything went fine, then you should see a similar entry in soapUI log:

Fri Oct 05 16:41:03 BST 2012:INFO:Adding [/home/jk7/git/soapui-runner/soapui-4.5.1/bin/ext/soapy-1.0.jar] to extensions classpath

To make any use of it, import any Soapy class into your script step or script assertion:

import com.yelllabs.soapy.”name.of.the.class”

Ahh… I almost forgot, here’s the link to my Soapy project on GitHub πŸ™‚

Cheers,
J

How to parse and handle a JSON response:

import com.yelllabs.soapy.helpers.Response;
import com.yelllabs.soapy.json.JSONHandler;

Response r = new Response( context, testRunner, log, "nameOfTheStepWithJSONResponse" );
JSONHandler jh = new JSONHandler( log );
Object json = jh.parse( r.getRawResponse() );
// validate the JSON 
jh.isValid(json); 
jh.isObject(json);

// then to access any element, simply:
json.elementName.arrayName[positionInArray].etc