2010-04-23

Тюнинг Empathy

По умолчанию этот IM-клиент выглядит, прямо скажем, не очень. Простецкое окно чата, топорные иконки. В Ubuntu 10.04 его уже подрихтовали, добавили нормальные темы значков в список контактов и тему оформления окна чата. Но, чтобы достичь такой красоты, не обязательно устанавливать новый дистрибутив.

Установка значков в списке контактов

Качаем значки, например, эти, и распаковываем папку hicolor в каталог ~/.icons

Установка темы окна чата

Качаем тему отсюда, и распаковываем папку с именем типа ИмяТемы.AdiumMessageStyle в каталог ~/.local/share/adium/message-styles/

Вообще-то эти темы от Mac-овского IM-клиента Adium. В Ubuntu 10.04 Empathy укомплектован темой Renkoo.

2010-04-20

Функции в bash. Архивируй это!

Несмотря на два с половиной года использования Linux (вплотную с Ubuntu 7.10), как-то не вникал в тонкости shell-программирования. Ну цикл организовать, условия, выборки - пригождалось, но не белее того. Написал себе пару десятков alias-ов, для удобства, но чтобы обрабатывать опции командной строки писал отдельные скрипты на bash или python и складывал их в ~/bin, добавив путь к этой папке к переменной PATH.
Сравнительно недавно попалась на глаза информация о функциях в bash, и оказалось - это то, что мне нужно, чтобы не плодить скрипты. Они, оказывается, способны обрабатывать опции. В связи с этим, чтобы удобнее было создавать zip-архивы из чего угодно и поменьше тыкать по клавишам, накидал вот такую функцию, и поместил ее в ~/.bashrc

function zipp(){
    if [ -d "$1" ]; then out=`basename "$1"`".zip"; fi
    if [ -f "$1" ]; then out=`echo $1 | sed 's/\(.*\)\..*$/\1/g'`".zip"; fi
    zip -r -9 "$PWD/$out" "$1"
}

В ней проверяется, что сжимаем, каталог или файл, если файл - то отсекается расширение, если каталог - берется его имя без полного пути. После этого к имени добавляется ".zip", и передается архиватору как имя файла создаваемого архива.
Опции -r и -9 означают архивирование со всеми вложенными файлами с максимальной степенью сжатия.
Теперь, вместо того, чтобы писать в консоли
$ zip -9 -r myfolder.zip myfolder/

я пишу
$ zipp myfolder

Неправда ли, намного удобнее?

2010-04-19

Создаем DEB-пакет

Сегодня мы будем учиться готовить стандартные Debian-ские пакеты.
Оказывается, это не так сложно, и к тому же интересно.

Немного информации о пакете

Если вкратце, то deb-пакет - это ar-архив, распаковать который можно так:
$ ar x mydebpackage.deb

В результате мы увидим извлеченные файлы:
data.tar.gz (tar-архив с файловой структурой, копируемой в систему при установке)
debian-bynary (файл с номером версии формата пакетов)
control.tar.gz (tar-архив управляющей информации о пакете)

В файле control.tar.gz содержатся интересные вещи:
- postinst (скрипт, выполняемый после установки)
- postrm (скрипт, выполняемый после удаления)
- md5sums (контрольные суммы файлов)
- control (остальная метаинформация)

Например, в control может быть примерно такое содержимое:

Package: mypackage (название пакета)
Version: 0.1 (версия)
Depends: liba, libb1, libc2 (зависимости)
Recommends: libpamparam, lalala (рекомендовано)
Suggests: libbestdeb (могут улучшить работу пакета)
Section: utils
Priority: optional
Description: My best package! But for what?...



Создаем свой DEB

Чтобы создать deb-пакет, у нас есть все, что нужно. К примеру, я хочу собрать пакет видео-утилит, назовем его videotools.
В него войдут bash-скрипты для извлечения из видеофайлов отдельно аудио-дорожки, видео-дорожки, конвертирования avi в flv и обратно.

Для начала, создаем структуру каталогов.

videotools (каталог, в котором все остальное)
- DEBIAN/control (каталог DEBIAN с файлом control)
- usr/local/bin/getaudio (этот и остальные - мои скрипты)
- usr/local/bin/getvideo
- usr/local/bin/flv2avi
- usr/local/bin/avi2flv

Содержимое файла control будет примерно таким:

Package: videotools
Version: 0.1
Maintainer: Kawaikunee <secret@mail>
Description: Contaned scripts getaudio, getvideo, flv2avi, avi2flv
Section: utils
Priority: optional
Architecture: all
Depends: bash, mplayer, mencoder

Архитектуру указываю любую, это же просто bash-скрипты.

Теперь собираем пакет:
$ dpkg-deb --build videotools
И получаем файл videotools.deb

Трубим в фанфары и кушаем мороженое в честь успеха.

Дополнительная информация

Виртуальный пакет - это общее имя, употребляемое к любому из пакетов некой группы, все пакеты из которой обеспечивают подобную базовую функциональность (например, программы для работы с электронной почтой).
Чтобы добавить файл в виртуальный пакет какой-либо функциональности, нужно указать это в файле control, например так:
Provides: mail-transport-agent
Чтобы сделать файл зависимым от чего-то общего, так:
Depends: mail-transport-agent

Метапакет - пакет, в котором нет реальных файлов, он содержит только зависимости, чтобы гарантированно установить их. Например - ubuntu-standard

Создание DEB-пакета из исходников

Никакой магии. Устанавливаем пакет checkinstall (я уверен, не нужно вас учить, как это делается ^_^). Как обычно, в папке с распакованными исходниками делаем
$ ./configure && make
а вместо
$ sudo make install
набираем
$ sudo checkinstall
Такой финт ушами сначала создаст deb-пакет, а потом установит его через apt, что в дальнейшем обеспечит его корректное удаление, даже если разработчик не предусмотрел такой возможности. К тому-же, у нас останется пакет, который мы можем переслать друзьям, менее сведующим в этих консольных тонкостях, или которым это вовсе ни к чему.

Создание DEB-пакета для программ на Python

Для этого используем пакет py2deb(http://www.manatlan.com/page/py2deb). Приведены очень доступные примеры, а сам пакет скачивается там же, на сайте разработчика.
Например, вот скрипт, которым я упаковываю программу для изучения Библии. Оцените простоту!

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from glob import glob
from py2deb import Py2deb

p=Py2deb("bible")

p.author="Kawaikunee"
p.mail="secret@mail"
p.description="Программа в помощь изучающим Библию. Просмотр, поиск, параллельные места. Выделить текст и нажать клавишу F: поиск по выделенному. Клик на номере стиха: показать параллельные места. Клик на названии отрывка в найденном: открыть эту главу."
p.url = "http://kawaikunee.blogspot.com"
p.depends="python-gtk2, python, python-pysqlite2, msttcorefonts"
p.license="gpl"
p.section="utils"
p.arch="all"

p["/usr/bin"] = ["bible.py|bible","bible_iface.py","bible_shift.py"]
p["/usr/share/Bible/src"] = ["ot.png","nt.png","ap.png","ava.svg","bible_shift.xml"]
p["/usr/share/Bible/modules"] = ["modules/rst.sqlite|rst.sqlite","modules/kjv.sqlite|kjv.sqlite","modules/bible.db|bible.db"]
p["/usr/share/Bible"] = glob("modules/para/*")
p["/usr/share/applications"]=["Bible.desktop|Bible.desktop"]

p.generate("0.3.1")

Воодушевил? Дерзайте!

2010-04-08

Синхронизация TomBoy с UbuntuOne

Вторая попытка синхронизировать TomBoy с UbuntuOne потерпела фиаско. Сначала то, что на сервере, стало приплывать на локальный комп и добавлять повторные заметки с переименовыванием прежних (добавлялось слово "старая"). Удаление "старых" ни к чему не привело - при синхронизации создавал их заново. При этом регулярно выдавало ошибку "Синхронизация не удалась". Мыслю в направлении, что я удалил "Первую заметку", вероятно это критично для него, впрочем - это только догадки в попытке хоть как-то оправдать нелепые действия программы. Вторая, и катастрофическая бага: я удалил на сервере все заметки, надеясь, что теперь то с локального компьютера они туда зальются и будет мир во всем мире, но не тут то было: синхронизация удалила то, что было на компе. Хорошо, что оставались резервные копии.
Более-менее нормально отработала синхронизация в локальную папку. Буду пользоваться таким способом.

2010-04-05

Работа с MSSQL Server в консоли linux

По работе приходится использовать MSSQL Server, никуда не денешься. И это одна из причин, почему у меня на работе два компьютера - один под MS Windows XP (где и стоит SQL Server), второй - Linux Mint 8 Helena.
Что делать, когда раз-два в день (или в неделю) необходимо выполнить пару запросов к этому серверу баз данных? Ну, для начала нужно пересесть за компьютер с изделием MS (или воспользоваться удаленным доступом), запустить SQL Server Managment Studio Express, подождать, пока этот монстр загрузится, залогинится, открыть окошко для запроса, и только после этого можно начать работу.
Как много букв! Как хотелось бы чего-нибудь попроще и побыстрее! Что-то типа консоли mysql. Что-ж, достаточно приложить руки и голову, а python сделает остальное.
Вот, что у меня получилось. Мне нравится.