Sunday, April 20, 2014

fedora 20: How to install wxPython 3.0.0

The latest version of the wxPython package from official fedora repo is 2.8. That is why we need to install it from source.

Extract compressed file and switch to that folder:
wxPython-src-3.0.0.0/wxPython

Install required dependencies:
sudo yum install gcc-c++ wxGTK-devel gstreamer-devel webkitgtk-devel GConf2-devel gstreamer-plugins-base-devel

Let's start installiation process:
sudo python build-wxpython.py --build_dir=../bld --install --unicode

I received an error about unsuccessful creation of the path file. As I understood the problem is that all files were installed to folder /usr/lib64/.., but path file to folder /usr/lib/..

Let's create links to path files (not sure if it really required):

cd /usr/lib/python2.7/site-packages
sudo ln -s wx.pth /usr/lib64/python2.7/site-packages/wx-3.0-gtk2.pth
sudo ln -s wx.pth /usr/lib64/python2.7/site-packages/wx.pth
sudo ln -s wxPython_common-3.0.0.0-py2.7.egg-info /usr/lib64/python2.7/site-packages/wxPython_common-3.0.0.0-py2.7.egg-info


At the end of installation process I received a message:
To run the wxPython demo you may need to:
- set your PYTHONPATH variable to /home/jsn/app/wxPython-src-3.0.0.0/wxPython

And then:
- Run python demo/demo.py

/home/jsn/app/wxPython-src-3.0.0.0/wxPython - folder from which we installed package.

Add it to PYTHONPATH:
export PYTHONPATH=$PYTHONPATH:"/home/jsn/app/wxPython-src-3.0.0.0/wxPython"


Check the demo:
python demo/demo.py



To add wxPython to PYTHONPATH permanently, edit file:
cd ~
vim .bash_profile

fedora 20: Установка wxPython 3.0.0

В репозитории fedora последняя доступная версия wxPython 2.8. Поэтому wxPython 3 придется ставить из исходников.

Разархивируем скачанный архив и перейдем в папку:
wxPython-src-3.0.0.0/wxPython

Установим необходимые зависимости:
sudo yum install gcc-c++ wxGTK-devel gstreamer-devel webkitgtk-devel GConf2-devel gstreamer-plugins-base-devel

Запустим установку:
sudo python build-wxpython.py --build_dir=../bld --install --unicode

После этой команды у меня была ошибка, что не получилось у него создать path-файл. Как я понял проблема в том, что основные файлы были установленны в /usr/lib64/.., а path файл в /usr/lib/..

Создадим линки (не уверен, нужны ли они):

cd /usr/lib/python2.7/site-packages
sudo ln -s wx.pth /usr/lib64/python2.7/site-packages/wx-3.0-gtk2.pth
sudo ln -s wx.pth /usr/lib64/python2.7/site-packages/wx.pth
sudo ln -s wxPython_common-3.0.0.0-py2.7.egg-info /usr/lib64/python2.7/site-packages/wxPython_common-3.0.0.0-py2.7.egg-info


В конце установки я получил такое сообщение:
To run the wxPython demo you may need to:
- set your PYTHONPATH variable to /home/jsn/app/wxPython-src-3.0.0.0/wxPython

And then:
- Run python demo/demo.py

/home/jsn/app/wxPython-src-3.0.0.0/wxPython - папка из которой происходила установка.

Добавляем ее в PYTHONPATH:
export PYTHONPATH=$PYTHONPATH:"/home/jsn/app/wxPython-src-3.0.0.0/wxPython"


Проверяем, работает ли демо:
python demo/demo.py



Ну и можно еще добавить на постоянной основе в PYTHONPATH, открыв для редактирования файл:
cd ~
vim .bash_profile

Tuesday, April 8, 2014

django: Show form validation error with AJAX and jQuery

I once had a situation when I submited form with AJAX and if there were validation errors I had to put them at the same place as form was normally submited.

Assume that we have edit_user_data method in the views.py. If edit_form is valid we do some really useful things. If it's not, we should show user form validation errors (btw, I use uni_forms in that example).

Here is our code:

def edit_user_data(request):
# ...
if edit_form.is_valid():
# ...
else:
error_message = dict([(key, [unicode(error) for error in value]) for key, value in edit_form.errors.items()])
return HttpResponse(simplejson.dumps({"result": error_message, }), mimetype='application/json')


error_message is a dictionary which contains all form errors. We use JSON so we could have access to the data like server_response.result[key]. Key is the name of the field.

Here is our javascript code:

$("#edit_form").ajaxSubmit({
url: save_url,
type: 'post',
success: function (server_response) {
// Inform about successfull save
if (server_response.result_success) {
// ...
}
// Remove form errors
$("#edit_form").find(".errorField").remove();
for (var key in server_response.result) {
// Check for proper key in dictionary
if (key in {first_name: 1, last_name: 1, gender: 1, sex: 1, phone: 1, }) {
// Get error message
error = server_response.result[key][0];
// Find related field
field = $("#edit_form").find("#div_id_" + key)
// Attach error message before it
field.before('<p class="errorField"><em></em>' + error + '</p>');
}
}
},
});


#edit_form - id of the submited form, url - where we submit the data to. If AJAX request successfuly was proceed by server (it doesn't matter if user submited valid data or not. It means he does submited something) we now could show user if his form is valid or not. If it is not valid, we remove old errors from form (or we will have multiple errors under the fields, probably duplicates). Let also assume that our form contains 5 fields: first_name, last_name, gender, sex, phone. Here you can see nice trick how to check if a key is related to one of our fields:
if (key in {first_name: 1, second_name: 1, gender: 1, sex: 1, phone: 1, }) {}

We also want to show user only one error per field (If there are more, he will be able to see them next time):
error = server_response.result[key][0];

To show error message above the field itself we need to find that field:
field = $("#edit_form").find("#div_id_" + key)

Luckly our key names are the same as field names :) And then attach a message before it:
field.before('

' + error + '

');

Where error is description of error, for example, "This field is required". Done. Errors looks nice and native ")

Wednesday, April 2, 2014

Как пользоваться vim (очень краткое руководство)

Наверняка многие слышали о редакторе vim. Говорят, что настоящие программисты пользуются именно им. Или Emacs. Не могу удержаться и не поменстить эту картинку:

Честно признаюсь: первый раз когда я запустил vim, я с него даже выйти не смог! :/

Vim(или vi) есть на практически каждом компьютере работающем под linux. Именно поэтому надо уметь выполнять хотя бы базовые действия с ним. В этом посте будет рассказано как открывать, редактировать и сохранять файлы.

Итак, приступим. К примеру у нас есть файл simpleblogger.py. Открыть его с vim проще простого. Запускаем из консоли:
vim simpleblogger.py


Как видно в комплекте сразу подсветка синтаксиса для Python. Главное особенность vim в том, что у него есть два режима: режим просмотра и режим редактирования. По умолчанию файл открывается в режиме просмотра. Ничего набрать в этом режиме не получится (только удалить). Чтобы перейти в режим редактирования, надо нажать кнопку "i". Выйти из него - Esc. Vim сообщает вам, что вы находитесь в режиме редактирования показывая слово INSERT в конце файла.

Файл просматривать надо в обычном режиме (не редактирования). Навигация с помощью стрелочек и Page Up, Page Down. На самом деле, в vim для навигации лучше использовать h, j, k, l. Но к ним еще надо привыкнуть... При просмотре логов (длинных логов) удобно перейти сразу в конец файла. Сделать это можно нажав Shift + G. Поиск по файлу осуществляется так: нажимаете "/", вводите искомые символы и нажимаете Enter. Vim подсветит все места где встречается искомый набор символов. К следующему месту можно перейти нажав "n".

Итак, предположим вы отредактировали файл. Его надо сохранить. Для этого нажимаем Esc (выход из режима редактирования), потом ":" (означает что мы собираемся ввести команду) и затем "!qw". ! знак означает, что вы вкурсе изменений, q - выйти, w - сохранить изменения. В итоге:
Esc : ! w q

Команды можно комбинировать. Например, Esc : ! q - выйти без сохранения изменений.

Thursday, March 27, 2014

fedora 20: Восстановление базы данных PostgreSQL из файла

В предыдущем посте было написано как установить postgresql. В этом - восстановим базу данных. Для начала создадим пользователя:
sudo su postgres

psql

\password postgres;

Теперь выставим права пользователей. Для этого отредактируем файл:
su -

cd /var/lib/pgsql/data/

vim pg_hba.conf

Находим незакомменченные строчки:

local all all md5
host all all 127.0.0.1/32 md5
host all all ::1/128 md5

И меняем md5 на trust. Сохраняем изменения и рестартуем сервис:
sudo service postgresql restart

Создаем пользователя владельца базы данных - bongo
createuser -U postgres --superuser -E -P bongo

Создаем базу данных от пользователя bongo, владельца bongo с кодировкой UTF-8 под названием bongo30:
createdb -U bongo -O bongo -E UTF8 bongo30

Заполняем ее из файла bongo30.sql:
psql -U bongo bongo30 < bongo30.sql &> dumpresults

Лог операции в файле dumpresults.

fedora 20: Как установить PostgreSQL

Находил в интернете руководства по установке PostgreSQL, в которых рекомендовали отключить стандартный репозиторий fedora. Но я решил попробовать установить из него. Для этого выполняем команду:
sudo yum install postgresql-server

Готово. Теперь надо выполнить конфигурацию, которую из-за лицензионных соглашений надо выполнять вручную:
service postgresql initdb

Если хотите, чтобы postgresql стартовал автоматически, выполните команду (не проверено):
chkconfig postgresql on

или
systemctl enable postgresql.service

Postgresql запускается командой:
sudo service postgresql start

Одно из преимуществ установки postgresql из официального репозитория - это то, что не надо будет в командах таскать его версию.

Friday, March 21, 2014

python: Как отобразить прогресс задачи

В python есть очень хорошая встроенная библиотека для отображения прогресса задачи. Называется она progressbar. Установим ее с помощью pip:
sudo pip install progressbar

Для симуляции задачи будем использовать модуль time.
import progressbar
import time

pbar = progressbar.ProgressBar(widgets=[progressbar.Bar(), progressbar.Percentage(), ' ', progressbar.ETA()])
for i in pbar(range(50)):
time.sleep(0.2)

Вот так все просто. Наслаждаемся результатом:

После выполнения задачи будет показано время, затраченное на нее.