search

Tuesday, December 9, 2014

bash: Colourful side-by-side command line diff

I have never liked default linux diff command. The more changes you make, the less informative it becomes. When you work with git it would be nice to have side-by-side comparison of original file and a new file with changes. Graphical tools like smartgit and meld do it really impressive.

But sometimes it is more comfortable to use command line tools. For colourful side-by-side git diff you can use cdiff. The simpliest way to install it is with pip package manager:
pip install cdiff

Then in your repository run:
cdiff -s

And the result is gorgeous!

The next tool is called icdiff. It does basicly the same, but with files. Install it with that command:
curl -s https://raw.githubusercontent.com/jeffkaufman/icdiff/release-1.2.0/icdiff \
| sudo tee /usr/local/bin/icdiff > /dev/null \
&& sudo chmod ugo+rx /usr/local/bin/icdiff


Use it like this:
icdiff file1 file2

Tuesday, November 18, 2014

fedora 20: How to install latest geary from copr

Fedora corp is a storage for unofficial repositories for fedora enthusiasts. For example the latest geary version in the official fedora 20 repository is 0.6.1, which is quite old. The easiest way to update it to the latest available is to install it from copr. I found at least 3 repositories which provide update to 0.8.1.

First of all we need to install yum-plugin-copr plugin:
sudo yum install yum-plugin-copr

There is a missing dependency for that package. If you run yum and see:
Plugin "copr" can't be imported

Try to install python-requests package:
sudo yum install package-requests

Then we need to add a repository with newwest geary version. It is as simple as that:
sudo yum copr enable thm/geary

Run next command to update your geary from newly installed copr repository:
sudo yum update

Friday, November 7, 2014

python: Precompile nunjucks files on change

Preface

I have been writing an Firefox extension for some time. It generates HTML content which depends on the context. When I started, I decided to do it with JavaScript:
var container = document.createElement("div");
document.getElementById("items-list").appendChild(container);

However, JavaScript quickly became messy. Another problem was that I didn't have HTML in front of me to create stylesheet.

I have used JavaScript template engine in one of my projects recently. It would be nice to do it in the Firefox extension. There will be at least two benefits: my JavaScript will be shorter and cleaner to read and I will be able to see HTML to easy write css.

I choose nunjucks template engine by Mozilla. It is fast, feature rich and copies Jinja2 syntax. To be honest, the last reason was the most important for me. I have developed several web applications in Django and Flask and really like django templates and jinja2 syntax.



Nunjucks easy integrates in the webpage. It is as simple as that:
1. Load script in you HTML:
<script src="nunjucks.js"></script>

2. Render template with context and append it to the page:
var rendered_html = nunjucks.render('templates/index.html', { foo: 'bar' });
document.getElementById("container").innerHTML = rendered_html;

I tried the same approach in the Firefox extension. I needed to append HTML in the toggle button popup container. So I loaded nunjucks.js inside popup (it is called panel in the Firefox) by passing it to contentScriptFile option.

Problem

Unfortunately, nunjucks wasn't able to find template I wanted it to render. As far as I know It makes Ajax request to your server (what server in case of Firefox extension, ha?) to retrieve HTML file and then renders it. Nunjucks also supports precompiled templates (which indeed it renders much faster). Precompiled templates are preferable in the production and are represented as JavaScript files. So my idea was to precompile templates and pass these JavaScript files with contentScriptFile option. In the nunjucks.render function it looks for the array instance with the same name as path to the Ajax request('templates/index.html' in the example above) and if it exists it starts to render it without downloading an html template. Exactly what we need!

Templates are compiled into JavaScript files by precompile bash script. It is inside bin folder of the nunjucks git repository. Lets clone the repository:
cd /home/jsn/app/git_projects/
git clone https://github.com/mozilla/nunjucks.git

We also need to install some dependencies. Firstly, we install nodejs package and nodejs package manager:
sudo yum install nodejs npm

Then two nodejs packages:
npm install chokidar optimist

No we are able to compile template into JavaScript file with command:
/home/jsn/app/git_projects/nunjucks/bin/precompile path_to_html >> path_to_js

There is a problem with that command: it looks ugly because it demands absolute paths to the HTML and JavaScript files. If you run it and open compiled file you will see that precompile script used absolute path_to_template to identify template. That is not what we need as we are going to use just filename as identifier ("index.html"). To fix last problem we can pass --name to the precompile command:
/home/jsn/app/git_projects/nunjucks/bin/precompile --name index.html path_to_the_index.html >> path_to_the_index.js

Now we have the command which we are supposed to execute on every HTML file change. It would be nice to automate that step. So we need a script which will check every template in our templates folder and if a file was changed it would compile the file.

Solution

We are going to write that script in Python. First of all we need list of all files inside template folder. We will use listdir method of os package:
file_list = os.listdir(templates_dir)

File modification time we can check with os.getmtime() method. We will create global dictionary FILES. The keys of that dictionary will be file names and values will be last modification time. All we need to do is to fill that dictionary on the script start up and run precompile command if last modification time was changed.
FILES = {}
TIMER = 1

COLOUR_END = '\033[0m'
COLOUR_GREEN = '\033[92m'
COLOUR_BLUE = '\033[94m'


def check_templates(templates_dir=TEMPLATES_DIR):
    file_list = os.listdir(templates_dir)
    for item in file_list:
        if item.split(".")[-1] == "html":
            modified = os.path.getmtime(templates_dir + "/" + item)
            if item in FILES:
                if FILES[item] != modified:
                    FILES[item] = modified
                    precompile(templates_dir, item)
            else:
                print (COLOUR_BLUE + item + " is being watched" + COLOUR_END)
                FILES[item] = modified
                precompile(templates_dir, item)

We also filter files in our template directory by extension (as we are interested only in the html files). I use print function to inform myself when script finds new file in directory. Note, that these lines will be blue. It will make that event more noticeable.

We will check files for changes every second (TIMER variable):
if __name__ == '__main__':
    while True:
        check_templates()
        sleep(TIMER)

We can ask Python to execute for us any command we would normally execute in bash. Call method of the subprocess package helps to do it.
def precompile(tempates_dir, filename):
    compiled_filename = filename.replace("html", "js")
    path_to_js = tempates_dir + "/" + compiled_filename
    path_to_html = tempates_dir + "/" + filename
    if os.path.exists(path_to_js):
        call("rm -f " + path_to_js, shell=True)
    command = NUNJUCKS_REPO + "/bin/precompile --name " + filename + " " + path_to_html
    command = command + " >> " + path_to_js
    call(command, shell=True)
    print(COLOUR_GREEN + datetime.now().strftime("%X" + " " + filename + " ...OK") + COLOUR_END)

By default if compiled JavaScript exists, precompile command will add newly compiled data to it, so we have to check if compiled file exists with os.path.exists() method and remove it with bash rm -f command. NUNJUCKS_REPO is the path to the cloned nunjucks repository.

There is still a thing we can improve in the script. I will store that script in the project repository and I would like to use it on different machines. So hard coded template and nunjucks directory paths is not the option. I would like to set them as commands arguments to our script or maybe I will set these paths as environment variables. Anyway, full version of the script is below:
#!/usr/bin/python

# This script will monitor templates folder and automatically compile nunjucks html templates on change

import os
import sys
from datetime import datetime
from subprocess import call
from time import sleep

try:
    NUNJUCKS_REPO = sys.argv[1]
except IndexError:
    NUNJUCKS_REPO = os.getenv("NUNJUCKS_REPO")
try:
    TEMPLATES_DIR = sys.argv[2]
except IndexError:
    TEMPLATES_DIR = os.getenv("TEMPLATES_DIR")

FILES = {}
TIMER = 1

COLOUR_END = '\033[0m'
COLOUR_GREEN = '\033[92m'
COLOUR_BLUE = '\033[94m'


def check_templates(templates_dir=TEMPLATES_DIR):
    file_list = os.listdir(templates_dir)
    for item in file_list:
        if item.split(".")[-1] == "html":
            modified = os.path.getmtime(templates_dir + "/" + item)
            if item in FILES:
                if FILES[item] != modified:
                    FILES[item] = modified
                    precompile(templates_dir, item)
            else:
                print (COLOUR_BLUE + item + " is being watched" + COLOUR_END)
                FILES[item] = modified
                precompile(templates_dir, item)


def precompile(tempates_dir, filename):
    compiled_filename = filename.replace("html", "js")
    path_to_js = tempates_dir + "/" + compiled_filename
    path_to_html = tempates_dir + "/" + filename
    if os.path.exists(path_to_js):
        call("rm -f " + path_to_js, shell=True)
    command = NUNJUCKS_REPO + "/bin/precompile --name " + filename + " " + path_to_html
    command = command + " >> " + path_to_js
    call(command, shell=True)
    print(COLOUR_GREEN + datetime.now().strftime("%X" + " " + filename + " ...OK") + COLOUR_END)


if __name__ == '__main__':
    while True:
        check_templates()
        sleep(TIMER)




As we use only precompiled JavaScript templates we can switch to nunjucks-slim.js. Slim version is smaller and works only with precompiled templates.

If you have any suggestions or questions, please let me know in the comments.

Monday, October 20, 2014

fedora 20: Установка mysql

С версии 19 в fedora MySQL база данных заменена на MariaDB, которая обеспечивает полную совместимость.

Установим базу данных:
sudo yum install mariadb mariadb-server

Стартуем сервис:
sudo service mysqld start

И запускаем настройку:
mysql_secure_installation

При первом запуске программа запросит ввести root пароль, просто нажмите Enter, а вот на 2ом шаге введите реальный пароль. Ответьте на остальные вопросы.

Запускаем sql консоль для создания базы данных:
mysql -u root -p

Новая база данных создается командой:
CREATE DATABASE techtips
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;

Выйти из консоли можно командой:
\q

Пример настроек для Flask + SQLAlchemy:
SQLALCHEMY_DATABASE_URI = 'mysql+mysqldb://root:12345@localhost/techtips?charset=utf8&use_unicode=0'

Как сделать GET запрос с помощью gjs

const Soup = imports.gi.Soup;

var _httpSession = new Soup.Session();

var message = Soup.form_request_new_from_hash('GET', "http://google.com", {});
_httpSession.queue_message(message, function(_httpSession, message) {
log(message.status_code);
log(message.response_body.data);
});

PythonAnywhere: Настройка MySQL

В данный момент PythonAnywhere поддерживает только MySQL как бесплатную базу данных (обещают скоро добавить поддержку Postgresql ). Начнем с создания базы данных. Для этого необходимо перейти на вкладку Databases и в поле Create database ввести имя базы данных:

Также надо установить пароль для доступа к базе данных. Путь базы данных для sqlalchemy будет выглядеть так:
SQLALCHEMY_DATABASE_URI = 'mysql+mysqldb://pa_username:db_password@mysql.server/db_name'

где pa_username - имя пользователя на PythonAnywhere, db_password - пароль к базе данных, db_name - имя базы данных (например, jsnjack$main-mysql).

Для того, чтобы sqlalchemy работала с mysql надо установить пакет:
pip install MySQL-python

PythonAnywhere: Настройка wsgi для приложения Flask

Предположим, что используется virtualenv. *wsgi.py выглядит следующим образом:
activate_this = '/home/jsnjack/jsn-techtips/env/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))

import sys

path = '/home/jsnjack/jsn-techtips'
if path not in sys.path:
sys.path.append(path)

from app import create_app
application = create_app('pythonanywhere')


Первые 2 строки - эквиваленты source ./env/bin/activate на локальной копии. Path - путь к приложению. create_app() - функция, которая возвращает flask-приложение (и это едиственное условие для правильной конфигурации - присвоить переменной application приложение Flask), "pythonanywhere" - профиль конфигурации.

Код для create_app и профилей создан на основе flasky

Saturday, October 18, 2014

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

Atom - это бесплатный текстовый редактор, который разрабатывает та же компания что и github. На официальном сайте доступен только пакет для Ubuntu. В интернете есть инструкция по установке atom для fedora 20 из исходников.

Инструкция достаточно подробная и я по ней уже когда-то устанавливал atom. Но! Есть более простой способ - воспользоваться *.deb пакетом. Последнюю версию можно скачать тут.

Итак, копируем скачанный пакет в папку куда хотим установить atom и выполняем команду:
ar p atom-amd64.deb data.tar.gz | tar zx

Запускаем atom командой:
./usr/bin/atom

Friday, October 17, 2014

bash: Как изменить командную строку в bash

В bash командную строку можно изменить присвоив значение PS1 в терминале. Вот эта команда добавит время, полный путь в запрос, а также выведет его на следующую строку:
$ PS1="\[\033[01;32m\]\t \[\033[01;34m\]\w\[\033[00m\]\[\033[1;32m\]\n\$ \[\033[m\]"


Чтобы изменения сохранились после перезагрузки, добавьте эту строку в файл ~/.bashrc:
# Configure prompt
export PS1="\[\033[01;32m\]\t \[\033[01;34m\]\w\[\033[00m\]\[\033[1;32m\]\n\$ \[\033[m\]"

Список специальных символов:

\d The date, in "Weekday Month Date" format (e.g., "Tue May 26").


\h The hostname, up to the first . (e.g. deckard)


\H The hostname. (e.g. deckard.SS64.com)


\j The number of jobs currently managed by the shell.


\l The basename of the shell's terminal device name.


\s The name of the shell, the basename of $0 (the portion following the final slash).


\t The time, in 24-hour HH:MM:SS format.


\T The time, in 12-hour HH:MM:SS format.


\@ The time, in 12-hour am/pm format.


\u The username of the current user.


\v The version of Bash (e.g., 2.00)


\V The release of Bash, version + patchlevel (e.g., 2.00.0)


\w The current working directory.


\W The basename of $PWD.


\! The history number of this command.


\# The command number of this command.


\$ If you are not root, inserts a "$"; if you are root, you get a "#" (root uid = 0)


\nnn The character whose ASCII code is the octal value nnn.


\n A newline.


\r A carriage return.


\e An escape character.


\a A bell character.


\\ A backslash.


\[ Begin a sequence of non-printing characters. (like color escape sequences). This allows bash to calculate word wrapping correctly.


\] End a sequence of non-printing characters.


Wednesday, September 17, 2014

bash: Как следить за процессами

Для того, чтобы вывести в консоль информацию о каком либо процессе (фильтруется по имени) можно воспользоваться командой:
watch -n 1 'ps ax -o rss,user,command | sort -nr | grep celery |head -n 5'

Эта команда выведет все процессы связанные с celery и ограничит вывод 5 штуками

bash: Как выводить в консоль изменения в файле

Эта команда позволяет выводить в консоль последние строчки в файле. Если в файл будут добавлены новые строки, они автоматически отобразятся в консоли. Очень удобно следить за логами:
tail -f filename

где filename - имя файла

Tuesday, September 16, 2014

django: Утечка памяти

Честно говоря, это не утечка памяти, а ожидаемое поведение django (о котором, я думаю, не все знают). Дело в том, что django очищает кэш при работе с базой данных после того, как view-функция возвращает response. Мне приходилось писать функции, которые не возвращают такой объект (например таска для celery). В этом случае, кэш необходимо очищать вручную:
from django.db import reset_queries
reset_queries()

fedora 20: Как установить Viber (updated)

Разработчики Viber стали теперь собирать rpm пакет, а это значит, что программу можно установить скачав и запустив файл http://download.cdn.viber.com/cdn/desktop/Linux/viber.rpm
Также у них на странице появился логотип fedora, что очень радует.

Sunday, August 3, 2014

fedora 20: Как установить последнюю версию gitg

Последняя версия gitg в fedora 20 0.27, в то время как на официальном сайте 0.32. gitg в ветке 0.3 заметно преобразился. Установить его в fedora 20 можно с помощью jhbuild, т.к. gitg требует для работы новые версии библиотек, которые появятся только в следующей версс fedora. Вообще, jhbuild удобно использовать для превью новых приложений.

Для начала установим необходимые зависимости:
sudo yum install @development-tools @gnome-software-development

sudo yum install libtasn1-tools systemd-devel cups-devel cmake opencc-devel tracker-devel gperf libicu-devel yelp-tools gettext-devel intltool gcc-c++ asciidoc lcov python-rdflib

Теперь установим сам jhbuild:
git clone git://git.gnome.org/jhbuild
cd jhbuild/
./autogen.sh
make
make install

Также запустим команду, которая установит остальные необходимые пакеты:
jhbuild sysdeps --install

Установить gitg можно через графический интерфейс jhbuild либо через командную строку:
jhbuild build gitg

Процесс долгий и заканчивается такой ошибкой:
No package 'gtkspell3-3.0' found

Создадим файл со ~/.config/jhbuildrc с содержимым:
branches['glib'] = 'master'
branches['gtk+'] = 'master'
branches['pygobject'] = 'master'
branches['vala'] = 'master'
branches['Webkit'] = 'master'
branches['gtkspell-3'] = 'http://hg.code.sf.net/p/gtkspell/code'

Теперь установка gitg должна завершиться успешно. Запускаем gitg командой:
jhbuild run gitg

Если отсутствуют какие-то иконки, это значит, что надо через jhbuild установить тему adwaita.

fedora 20: Как установить GNOME shell 3.12

GNOME Shell 3.12 вышел уже достаточно давно. Был разговор о том, чтобы официально обновить в fedora 20 его с 3.10 до 3.12, но по-моему ни к чему он так и не привел. Есть экспериментальный репозиторий с обновленным gnome shell до 3.12. Я обновился с него пару дней назад, и все работает без проблем.

Итак, для того, чтобы обновиться создаем файл /etc/yum.repos.d/rhughes-f20-gnome-3-12.repo со следующим содержанием:
[rhughes-f20-gnome-3-12-i386]
name=Copr repo for f20-gnome-3-12 owned by rhughes (i386)
baseurl=http://copr-be.cloud.fedoraproject.org/results/rhughes/f20-gnome-3-12/fedora-$releasever-i386/
skip_if_unavailable=True
gpgcheck=0
cost=900
enabled=1

[rhughes-f20-gnome-3-12-x86_64]
name=Copr repo for f20-gnome-3-12 owned by rhughes (x86_64)
baseurl=http://copr-be.cloud.fedoraproject.org/results/rhughes/f20-gnome-3-12/fedora-$releasever-x86_64/
skip_if_unavailable=True
gpgcheck=0
cost=800
enabled=1

После этого обновляемся командой:
sudo yum update

Перегружаемся.

Friday, August 1, 2014

fedora 20: Просмотр логов

Для просмотра логов в fedora 20 существует специальная команда:
journalctl

Для того, чтобы показать все логи относящиеся к какому-то конкретному процессу надо выполнить:
journalctl /usr/bin/gnome-session

Есть режим, который постоянно выводит новые сообщения в консоль:
journalctl /usr/bin/gnome-session -f

Чтобы вывести полный текст сообщения можно использовать следующую команду:
journalctl /usr/bin/gnome-session -f -o cat

Sunday, June 22, 2014

git: Как сохранить в файл все ваши коммиты

Для того, чтобы сохранить все коммиты в файл, надо выполнить команду:
git --no-pager log --author=jsnjack > log.txt

Sunday, June 15, 2014

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

На официальной странице Viber для Linux есть только собранный deb пакет, который не подходит для fedora. Но выход есть! Скачиваем с официального сайта deb-пакет.
Затем распакуем его с помощью команды:
ar p viber.deb data.tar.gz | tar zx

Как результат, появится папка usr. Запустить Viber можно командой:
./usr/share/viber/Viber.sh

Tuesday, June 10, 2014

fedora 20: Размытые шрифты

Сразу после установки шрифты могут показаться размытыми. Некоторые рекомендуют изменить способ рендеринга шрифтов, но чтобы я не устанавливал, ничего не помогало. Как мне кажется, проблема в самом стандартном шрифте. Для себя я нашел 2 выхода:
1. установка шрифтов Ubuntu - на блоге где-то есть инструкция как это сделать. Шрифты Ubuntu, пожалуй, самые красивые и лучше всего рендерятся
2. перейти на шрифты семейства DejaVu Sans

Сейчас я использую шрифты DejaVu Sans (ну потому, что шрифты Ubuntu все-таки для Ubuntu - смотрятся они там привычнее) и очень счастлив с ними. На картинке моя текущая конфигурация.

Monday, June 9, 2014

Как получить текущую локаль в GNOME Shell расширении

Предположим, что вы уже храните настройки вашего расширения в gsettings. Это значит, что у вас есть файл convenience.js. Для получения текущей локали надо сделать:
const Me = ExtensionUtils.getCurrentExtension();
const Convenience = Me.imports.convenience;

// Get locale
locale = Convenience.getSettings('org.gnome.system.locale').get_string('region').split('.')[0]

Материалы для написания GNOME Shell расширения

Так как документации практически никакой нету, остается смотреть исходный код, который может быть найден тут:
~/.local/share/gnome-shell/extensions/
/usr/share/gjs-1.0/
/usr/share/gnome-shell/js/

Sunday, June 8, 2014

Как скомпиллировать файл настроек для GNOME Shell

Для того чтобы скомпилировать xml файл настроек для расширения GNOME Shell необходимо перейти в папку с расширением. Все расширения находятся тут:
~/.local/share/gnome-shell/extensions/

Затем переходим в папку schemas и выполняем команду:
glib-compile-schemas .

Точка в конце означает, что будут скомпиллированы все файлы в папке.

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)

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

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

Saturday, March 8, 2014

fedora 20: установка на ноутбук TOSHIBA Satellite L50-A. Версия 2. Более подробная и изощренная

Итак, мой ноутбук побывал в сервисе. После этого пришлось все переустанавливать заново :(

Итак, имеем в начале установленную Windows 8.1. Сразу выделим место, в которое установим fedora. Для этого нажимаем клавишу Win и попадаем в "усовершенствованный Пуск". Начинаем набирать disk partitions и запускаем программу:

Производим разбивку дисков в открывшейся программе в соответствие со своими потребностями.

Последний шаг, который надо осуществить в Windows - это отключить Fastboot, а то никогда grub не увидим.

Открываем Панелб управления (Control panel). Можно из Пуска. И переходим в Hardware and Sound >> Power Option

Выбираем пункт Choose what the Power button does:

Нажимаем Change Settings that are currently unavailable и убираем галочку с Turn on Fast startup.

Все подготовки с Windows завершены (предполагается, что fedora уже записан на флешку, например, этой программой )

К сожалению, fedora не является подписанной системой и чтобы получить возможность загрузиться с флешки, надо отключить в BIOS Secure boot. При включение ноутбука начинайте нажимать F2. В результате должно появится окно BIOS. Найдите пункт Secure Boot и отключите его. Также найдите параметр Fast boot и замените его на Normal Boot.

Готово. Наконец-то можно переходить к установке fedora! Здесь все как обычно, кроме пункта в котором указываются разделы куда что монтировать. Все разделы можно оставить такими, какими их предложит создать Anaconda, кроме раздела, который предлагается монтировать на /boot/efi. В нашем ноутбуке поумолчанию загрузочным разделом с efi является раздел sda2. Ваша задача - удалить предложенный fedora раздел под /boot/efi и указать разделу sda2 точку монтирования /boot/efi.

Если после завершения установки перегружаетесь и grub игнорируется, а грузится сразу Windows, то впереди еще есть над чем поработать.

Снова грузимся с загрузочной флешки с fedora. Открываем файловый менеджер и ищем диск sda2 (тот на который монтировали в /boot/efi). Не удается найти? Откройте программу Disk. Она поможет.

На этом диске ищем папку EFI, открываем ее и внутри должны быть папки fedora, Microsoft, Toshiba. Нам нужно переименовать папку Microsoft (а то похоже что оно как только находит папку Microsoft больше смотреть ни на что не хочет..), например, в Microsoft.orig.

Перегружаемся (не забываем извлечь флешку) и видим стремное сообщение:
>>Checking media presense....
No media present...

Ждем дальше - будет предупреждение о том, что Secure boot отключен и - о чудо - видим grub!

Загружаемся в fedora. Все работает отлично, кроме Windows. :(

Исправим и это :\ . В fedora открываем для редактирования файл:
sudo gedit /etc/grub.d/40_custom

И в конец файла добавляем строки:

menuentry 'Windows Boot Manager' {
chainloader /EFI/Microsoft.orig/Boot/bootmgfw.efi
boot
}

Сгенерируем grub.cfg:
sudo grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg


Все! Готово. Имеем работающий fedora 20 и windows 8.1 *happy*

P.S. После обновления Windows, grub может слететь. Тогда придется проделать операцию с переименованием папки Microsoft еще раз.

fedora 20: Как копировать файлы между компьютерами по ssh

Для того, чтобы скопировать файлы с одного компьютера на другой, надо будет на том, с которого копировать файлы, запустить ssh server. В fedora 20 для этих целей используется OpenSSH server. Он должен быть поумолчанию установлен в fedora, но на всякий случай устанавливать его так:
sudo yum install openssh-server

Запускаем сервер командой:
sudo service sshd start

Проверить его статус можно командой:
sudo service sshd status

Компьютер готов отдавать файлы. Подключимся к нему с машины-клиент:
ssh username@192.168.1.2

Этой командой получаем полный доступ к удаленному компьюеру. В качестве имени пользователя и пароля используйте уже существующий аккаунт на том компьютере.

А теперь приступим к копированию:
scp username@192.168.1.2:/home/1.txt /home/1.txt

Данная команда скопирует файл 1.txt с удаленного компьютера на ваш.

Надо копирнуть папку? Не проблема:
scp -r username@192.168.1.2:/home /home

Хотите скопировать файлы в текущую папку на клиенте? Тогда вместо полного пути достаточно поставить точку:
scp -r username@192.168.1.2:/home .

Saturday, January 25, 2014

fedora 20: Отсутствие вертикальной синхронизации в видео

Я использую встроенное видео Intel. Вертикальная синхронизация в нем включена поумолчанию, но в видео все равно наблюдаются полоски :(

Итак, для начала проверим включена ли вертикальная синхронизацияю Для этого в терминале надо выполнить:
glxgears

Появится окошко с шестеренками. Поместите курсор мыши на него. Если в терминале появятся цифры fps примерно равные частоте обновления монитора (у меня это 60), то значит вертикальная синхронизация включена. Если цифры будут большие очень - значит нет.

Фикс заключается в добавление в файл /etc/environment следующих строк:
CLUTTER_PAINT=disable-clipped-redraws:disable-culling
CLUTTER_VBLANK=True

Ну и перезагрузки. Это помогает убрать полосы в vlc, но не в Totem.

Friday, January 17, 2014

fedora 20: установка на ноутбук TOSHIBA Satellite L50-A

Более подробно тут. Установка линукс на ноутбуки забавная вещь. Можно остаться без Windows, да и вообще все может произойти.. Могу сказать, что на этом ноутбуке fedora 20 отлично работает с предустановленной Windows 8.1. Но есть несколько моментов в установке.

Итак, для начала необходимо выделить место под систему. Рекомендую делать это только средствами Windows. Как-то так, точно не помню Manage -> Storage -> Disk Management.

После того как место выделено, загрузачная флешка записана - первая проблема в том, что SecureBoot заблокирует fedora. Поэтому его отключаем через BIOS (при загрузке жмем F2). К счастью, на Windows это не повлияет, хотя читал, что у некотрых он перестает грузиться.

Продолжаем установку fedora. Следующий важный момент - при создании дисков для fedora, установщик вам предложит создать второй efi раздел. Делать этого не надо. Удаляем его, а на раздел Windows efi ставим точку монтирования такую же, как стояла на разделе efi Linux. Если этого не сделать, то windows будет грузиться, как будто linux не существует..

В bios еще надо отключить все упоминания о FastBoot, как и в Windows (в настройках энергосбережения вроде...)

fedora 20: точка на цифровой секции клавиатуры вместо запятой

Точка или запятая зависит на цифровом блоке зависит от локали LC_NUMERICS. В fedore 20 я столкнулся с тем, что не зависимо от локали у меня стоит запятая. Оказывается, все это контролируется с помощью gnome-tweak-tool!

Устанавливаем:
su -c"yum install gnome-tweak-tool"


Запускаем из Activities (будет симпатичная иконка). Переходим в раздел Typing и изменяем Numeric keypad delete behavior на Legacy key with dot.

Thursday, January 16, 2014

fedora 20: проблемы со звуком в Skype

В fedora 20 Skype иногда начинает засорять звуковой выход непонятным постоянным шумом. Разработчики обещают исправить это в следующей версии, а пока есть такой hotfix: надо открыть файл skype.desktop (наберите в terminal locate skype.desktop, чтобы узнать где он находится) и сделать параметр Exec равным:
env PULSE_LATENCY_MSEC=30 skype %U

Если 30 не поможет, то попробуйте 60.