Видео ролики бесплатно онлайн

Смотреть зрелые видео

Официальный сайт 70rus 24/7/365

Смотреть видео бесплатно

Тексты masai
masai 05.11.2009 22:28

How-to`s — Как сделать deb-пакет со своими скриптами

Рано или поздно у продвинутого пользователя линукса накапливается набор собственных скриптов, хранящихся где-то в «~/bin». Но каталог с программами не так красиво смотрится в домашнем каталоге, да и потом если делиться с друзьями, то приходится отправлять в архиве, говорить куда что копировать, убеждать их, что загромождение домашнего каталога — неизбежное зло. Можно, конечно и куда-то в «/usr/local/bin» их поместить, но можно потратить десять минут и собрать пакет, который потом легко устанавливается (и удаляется) штатными средствами. Причём туда, куда надо.

Посмотрим, как это делается.

В качестве примера скриптов возьмем, например следующие два.

Первый загружает цитаты с lorquotes.ru.
1
2
3
4
#!/bin/sh
< -x ~/.lor > || mkdir ~/.lor
wget http://lorquotes.ru/fortraw.php -O -| iconv -f koi8-r -o ~/.lor/lor
strfile ~/.lor/lor ~/.lor/lor.dat


А второй — выводит и при помощи утилиты fortune.
1
2
#!/bin/sh
fortune ~/.lor

Назовем их соответственно «lor-update» и «lor».

Сохраним их в отдельный каталог, который при сборке пакета должен иметь имя вида «пакет-версия». В нашем случае это будет «lorquotes-0.1».

Теперь создадим заготовку пакета при помощи команды dh_make (есть в репозитории под именем — сюрприз! — «dh-make»). Для этого в нашем каталоге выполним следующую команду:
dh_make --createorig -c gpl3 -e [email protected] -i -p lorquotes_0.1
Довольно длинно, не так ли? Разберём по порядку:
--createorig — создать отдельную папку с исходниками, это будет нужно при создании пакета;
-c gpl3 — указать в качестве лицензии GPL3 (какие ещё есть лицензии ,можно посмотреть в man-страничке утилиты dh_make);
-e [email protected] — электронная почта собравшего пакет (то есть ваш);
-i — говорим, что пакет не зависит от платформы (bash-скрипты везде одинаковы ведь);
-p lorquotes_0.1 — указываем имя пакета (вообще, необязательно).

Утилита спросит, всё ли она правильно поняла, на что мы честно соглашаемся и заходим в папку.

Как видим, старое содержимое скопировалось в каталог «lorquotes-0.1.orig» (спасибо опции --createorig), а в «lorquotes-0.1» появился каталог «debian» с кучей файликов непонятного назначения. Собственно, содержимое этого каталога и определяет как будет вести себя пакет при установке и что он будет содержать.

Но сперва нужно создать мейкфайл. Это специальный файл, имеющий имя Makefile и говорящий сборщику пакета, как скомпилировать исходнуе тексты и куда устанавливать его содержимое. Структура нашего мейкфайла очень проста:
DESTDIR =
BIN = $(DESTDIR)/usr/bin

build:
true

install:
install -d $(BIN)
install -m755 lor $(BIN)
install -m755 lor-update $(BIN)
Заметьте, что некоторые строки набраны с отступом при помощи табуляции. Именно так и нужно набирать. Это важно!

Мейкфайл — это просто предписание команде «make» выполнить определенный набор действий.

В строке 1 определены специальные переменные: DESTDIR — каталог, в который будет устанавливаться наш пакет. Эта переменная обязательно должна быть в мейкфайле, так как черех неё потом сборщик пакета указывает каталог назначения.

В строке 2 указан каталог, куда будут установлены наши скрипты. Без этой переменной уже можно было обойтись, так как она пользовательская и введена для удобства.

Строка с «build» — это одна из целей, которых должен достичь make. После двоеточия можно было указать список целей, от которых цель «build» зависит, но у нас и компилировать-то нечего, потому ничего и не указано. После цели идут команды (внимание, с отступом!), которые необходимо выполнить для достижения этой цели. Так как ничего выполнять не надо, то там стоит команда true, которая ничего не делает (такая у неё работа).

Аналогично описана цель «install». Но тут уже нужны действия: а именно создание каталога назначения и копирование в него с соответствующими правами наших скриптов. Вместо обычных команд создания и копирования используется утилита install, которая более интеллектуальна и специально для этих целей предназначена.

Итак, создаем в папке со скриптами (не в debian) мейкфайл под именем Makefile. Теперь мы можем при помощи команд «make» (ничего не делает, т.к выполнится первая цель в файле, т.е. «build») и «sudo make install» (копирует скрипты куда надо) собрать и установить вручную наши скрипты. Но вручную нам не нужно, мы ведь пакет хотим собрать. Поэтому переходим к следующему этапу.

Настроим свойства нашего пакета. Перейдём в каталог «debian» и откроем файл «control». Он содержит информацию о пакете, его зависимостях и так далее. Заполним его как анкету.

Source — название того, что мы сейчас собираем,
Section — в какую секцию дерева репозитория поместить наш пакет,
Priority — важность пакета,
Maintainer — сборщик,
Build-Depends — какие программы нужны для сборки пакета,
Standards-Version — версия стандарта, описывающего сборку пакетов,
Homepage — домашняя страничка (если есть),
Package — имя собственно deb-пакета,
Architecture — архитектура, под которую он собирается (i386, amd64 и иже с ними),
Depends — от каких пакетом наш зависит,
Description — описание, короткое в той же строке и длинное ниже (обратите внимание на пробел в начале строки с длинным описанием).

Я для примера сделал такой файл:
Source: lorquotes
Section: misc
Priority: optional
Maintainer: Vasiliy Pupkin
Build-Depends: debhelper (>= 7)
Standards-Version: 3.8.3
Homepage: http://pupkin.example.com/lorquotes/

Package: lorquotes
Architecture: all
Depends: wget, fortune-mod
Description: Small LOR quotes utility
Shows you random quote from lorquotes.ru.
Думаю, указывать в зависимостях шелл и libc6 смысла нет. Они точно есть в любой системе (или нет?).

Теперь подправим файл «changelog». Он содержит историю версия нашего пакета. Во время правки не забывайте, что он тоже имеет строгий формат и не добавляйте лишние отступы и строки.

Вот мой вариант:
lorquotes (0.1-1) unstable; urgency=low

* Initial release

-- Vasiliy Pupkin Thu, 05 Nov 2009 19:53:58 +0200
unstable — это имя ветки дистрибутива, для которой готовится пакет, а urgency — это приоритет.

В том же каталоге есть файл «rules». Это обычный мекфайл, который и отвечает за конфигурирование и сборку пакета. Но так как мы ничего экстраординарного не делали, оставим всё как есть.

В файле «copyright» находится лицензия. Мы лицензию сразу указали, так что и этот файл трогать не будем.

Итак, остались ещё следующие важные для нас файлы.

«cron.d.ex». Переименовываем его в «cron.d». Он содержит информацию о регулярных действиях, которые будет выполнять установленная программа. В нашем случае — ежедневное обновление базы цитат в полдень:
#
# Regular cron jobs for the lorquotes package
#
0 12 * * * root < -x /usr/bin/lor-update > && /usr/bin/lor-update


«postrm.ez». Переименовываем в «postrm». Это скрипт, запускаемый после удаления пакета. Заставим его очищать нашу базу цитат, хранящуюся в «~/.lor». Хотя хранить базу в домашнем каталоге не совсем верно идеологически. Но, думаю, после этого поста читатель и сам исправит эту неточность. Итак, мой «postrm»:
#!/bin/sh
# postrm script for lorquotes
#
# see: dh_installdeb(1)

set -e

case "$1" in
purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
rm -rf ~/.lor
;;

*)
echo "postrm called with unknown argument \`$1'" >&2
exit 1
;;
esac

# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.

#DEBHELPER#

exit 0
Остальные файлы нам не нужны и смело их удаляем. Это разные заготовки. Например, для man-страниц.

Переходим теперь в каталог со скриптами (т.е. на уровень выше) и даём команду на сбору пакета:
debuild
Она собирает пакет, проверяет на ошибки, а потом пробует его подписать вашим GPG-ключом. Но даже если ей подписать не удастся, пакет будет собран. Найти его можно будет в каталоге уровнем выше. Там же будет архив с исходниками и вспомогательные файлы, нужные, если вы хотите создать свой репозиторий или загрузить пакет в уже существующий.

Конечно, при сборке пакета будут предупреждения. Но мы ведь не закачивать его в дебиановский репозиторий будем, а для себя собираем. Так что устранение причин предупреждений остаётся в качестве домашнего задания читателю. (Кстати, это несложно.)

Вот и всё! Осталось только установить пакет. :)

Как видите, ничего сложного. Еслиинтересуют подробности или захотелось собрать пакет позаковыристее, милости просим на соответствующую страничку дебиановской документации.

А вот архив с исходниками и пакетом: lorquotes_0.1.zip
Полностью.
+ 16 -
11
masai 01.11.2009 17:11

Tips & tricksОтправка jabber-сообщений из командной строки

О том, как отправить jabber-сообщение из консоли при помощи клиента Gajim, я уже писал ранее. Тем не менее, использование gajim-remote имеет ряд недостатков: нужно установить сам Gajim и запустить его. Это может вызвать некоторые затруднения, например, на сервере, где вовсе может не быть графического интерфейса. Однако, проблема имеет и более простое решение.

Сделаем скрипт, которому бы в качестве параметров передавались данные учётной записи jabber, JID отправителя и текст сообщения. В качестве основы возьмём питоновскую библиотеку xmpppy. В частности, рассмотрим повнимательнее один из примеров, входящих в её комплект, который (сюрприз!) как раз и предназначен для отправки сообщений из консоли. Остаётся только его чуть-чуть «допилить» по вкусу.

Итак, нам потребуется библиотека. Они есть в репозиториях Debian (да и других популярных дистрибутивов), поэтому устанавливаем как обычно:
1
sudo aptitude install python-xmpp python-dnspython


Без python-dnspython работать тоже будет, кстати. Но лучше поставить, так как в этом случае придётся вводить точное имя узла, на котором располагается сервер.

А вот и сам скрипт:
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/usr/bin/python
import sys,os,xmpp,time,ConfigParser

name = os.path.basename(sys.argv<0>)

if len(sys.argv) &lt; 2:
print "Send a message via Jabber (XMPP)"
print "Syntax:", name, "JID text"
print "JID\trecipient's Jabber ID"
print "text\tmessage, use '-' for stdin"
sys.exit(0)

toJID = sys.argv<1>
if sys.argv<2> == '-':
text = ' '.join(sys.stdin.readlines())
else:
text = ' '.join(sys.argv<2:>)

configFile = os.path.join(os.environ<'HOME'>, '.' + name)
config = ConfigParser.RawConfigParser()

try:
config.read(configFile)
fromJID = config.get('Connection', 'JID')
password = config.get('Connection', 'Password')
except:
print "Default configuration was written to", configFile
config.add_section('Connection')
config.set('Connection', 'JID', '[email protected]/home')
config.set('Connection', 'Password', '********')
f = file(configFile, 'w')
config.write(f)
f.close()
sys.exit(0)

fromJID = xmpp.protocol.JID(fromJID)
client = xmpp.Client(fromJID.getDomain(),debug=
)

conn = client.connect()
if not conn:
print 'Could not connect!'
sys.exit(1)
print 'Connected with', conn

auth = client.auth(fromJID.getNode(), password, resource=fromJID.getResource())
if not auth:
print 'Could not authenticate!'
sys.exit(1)
print 'Authenticated using', auth

messageID = client.send(xmpp.protocol.Message(toJID, text))
print 'Message was sent'

time.sleep(1)
client.disconnect()


Скрипт довольно простой, так что разбирать его работу не буду.

Всё это сохраняем в каталог «~/bin» под именем, например, «jsend». Имя и каталог значения не имеют, просто «~/bin» удобен для хранения пользовательских скриптов, так как он входит в переменную PATH и для запуска скритов из него достаточно указать их имена. В любом случае нужно разрешить выполнение нашей программки:
1
chmod +x jsend


Рассмотрим её работу. После первого запуска утилита создаёт в домашнем каталоге файл с JID и паролем отправителя. Это удобнее, чем вводить пароль в качестве параметра командной строки, так как в этом случае никто не сможет его подсмотреть. Да и доступ к файлу можно будет закрыть. Файл поличит имя, совпадающее с именем скрипта, но с точкой впереди, чтобы не отображаться лишний раз в списке файлов. В моём случае имя будет «~/.jsend». Естественно, файл после первого запуска нужно будет открыть и впесать свои JID и пароль.

Формат запуска скрипта:
1
jsend JID text


JID — это идентификатор получателя сообщения, а text — это собственно текст, который нужно отправить.

Если текста много или нужно отправить вывод какой-либо команды, то вместо text можно поставить «-». Например, команда
1
df | jsend [email protected] -


отправит информацию о заполненности разделов на дисках пользователю [email protected].

Также можно настроить отправку сообщений в определённое время при помощи команды at, что тоже иногда оказывается удобным.

Кросспост
Полностью.
+ 6 -
10
masai 27.10.2009 23:44

Tips & tricks — Разрезаем lossless-аудио (ape, flac, wv, wav) по файлу cue

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

Итак, задача такова: дана пара файлов, предположим, sample.cue и sample.flac, с каким-либо альбомом. Требуется получить треки альбома в отдельных flac-файлах.Если у вас linux, то делается это в два счёта. Ниже следует перевод одной довольно неплохой статьи с решением проблемы.

Файлы с lossless-аудио могут быть разрезаны по cue-файлу при помощи утилиты «shnsplit» (входит в пакет «shntool»). Также потребуется утилита «cuebreakpoints» (из пакета «cuetools»). Чтобы установить их, откройте терминал и введите следующее (эти пакеты есть в Ubuntu и Debian):

1
sudo apt-get install cuetools shntool


Кроме этого потребуются приложения для работы с выбранным форматом. Для Monkey’s Audio нужна будет утилита «mac» (в Debian есть пакет «monkeys-audio»). Для FLAC и WavePack потребуется установить соответственно «flac» и «wavpack»:

1
sudo apt-get install flac wavpack


Утилите shnsplit требуется для работы список точек, в которых нужно делить звуковой файл. Очень кстати тут оказывается утилита cuebreakpoints, которая печатает список таких точек по cue- или toc-файлу в формате, используемом в shnsplit. Можно создать конвейер между cuebreakpoints и shnsplit следующим образом:

1
cuebreakpoints sample.cue | shnsplit -o flac sample.flac


В этом примере flac-файл с именем «sample.flac» разрезается по точкам, содержащимся в «sample.cue» и результат выводится в формате FLAC.

Выходной формат задаётся параметром «-o». Если не указать формат, то файлы будут сохрняться в формате по умолчанию, то есть в виде wav-файлов.

Чтобы разрезать файл в формате Monkey’s Audio и сохраниеть результаты в формате FLAC, нужно выполнить следующую команду:

1
cuebreakpoints sample.cue | shnsplit -o flac sample.ape


По умолчанию для выходных файлов используется префикс «split-track» (то есть по умолчанию файлы будут иметь имена: split-track01, split-track02, split-track03,…). Можно задать собственный префикс при помощи опции «-a».

Чтобы посмотреть список всех параметров наберите «shntool split -h» или «shnsplit -h».

В звуковые файлах, полученных с помощью shnsplit не будут записаны данные об исполнителе, альбоме и так далее. Однако, можно воспользоваться скриптом cuetag (также входящим в пакет cuetools) для того, чтобы перенести данные из cue-файла в отдельные дорожки. Можно указать отдельные файлы, соответствующие дорожкам, содержащимся в cue-файле:

1
cuetag sample.cue split-track01.flac split-track02.flac split-track03.flac split-track04.flac


Эта команда перенесёт теги, содержащиеся в файле «sample.cue» в файлы с дорожками: «split-track01.flac», «split-track02.flac», «split-track03.flac» and «split-track04.flac».
Можно записать теги сразу во все полученные файлы:

1
cuetag sample.cue split-track*.flac


Утилита cuetag работает с форматами FLAC, Ogg и mp3.

P.S. На welinux уже были обсуждения этой темы (тут и тут) и ссылки на оригинальную статью в комментариях, но полного описания рассмотренных утилит я не помню, потому и закросспостил сюда этот перевод.
Полностью.
+ 12 -
14
masai 27.07.2009 22:15

Жизнь в консолиУправляем Gajim из командной строки

Gajim — это популярный и активно развивающийся Jabber-клиент, написанный на Python. К слову, он обладает очень неплохой поддержкой всевозможных вкусностей и полезностей Jabber по сравнению со многими другими клиентами. Одной из таких полезностей является возможность управления им из командной строки при помощи D-Bus — системы межпроцессного взаимодействия.



Управление из командной строки не означает, что Gajim имеет консольный интерфейс. Он по-прежнему будет располагаться на рабочем столе в виде окошка. Просто из консоли можно будет отправлять ему какие-либо команды. Собственно, команд поддерживается немного, но для каких-то простейших действий должно хватить.



В состав пакета с Gajim входит консольная утилитка gajim-remote, которая как раз и предназначена для отправки команд основной программе. Если вызвать её без параметров, она покажет список поддерживаемых действий. Вот наиболее интересные:


check_gajim_running — проверить, запущен ли Gajim (результат — True или False),list_accounts — список учётных записей,list_contacts <�учётные записи> — список контактов в учётных записях,contact_info — информация о пользователе с указанным JID,account_info <учётная запись> — показать информацию об одной из учётных записей Gajim,add_contact <�учётные записи> — добавить контакт в ростер,remove_contact <�учётные записи> — удалить учётную запись из ростера,change_status <статус> <�сообщение> <�учётные записи> — изменить статус с возможностью указания сообщения и учётной записи (если не указать — будет изменен статус всех учётных записей),get_status <�учётные записи> — получить статус указанных учётных записей,get_status_message <�учётные записи> — получить сообщение статуса указанных учётных записей,get_unread_msgs_number — количество непрочитанных сообщений,handle_uri <�учётные записи> — обработать ссылку вида «xmpp://»,join_room <комната> <�ник> <�пароль:> <�учётные записи> — присоединиться к конференции,send_chat_message <сообщение> <�учётные записи> — отправить сообщение в чат,send_file <файл> <�учётные записи> — отправить файл,send_groupchat_message <сообщение> <�учётные записи> — отправить сообщение в конференцию,send_single_message <тема> <сообщение> <�учётные записи> — отправить одиночное сообщение,open_chat <�учётные записи> — открыть чат с указанным контактом,start_chat <учётные записи> — открыть чат для заданной учётной записи (появится окно ввода JID),toggle_roster_appearance — показать/скрыть окошко ростера.



Попробуем теперь применить это на практике. Напишем скрипт, меняющий сообщение статуса на случайную цитату из fortunes. (Для тех, кто ещё не знает, fortunes — это консольная программа, выдающая случайную цитату из довольно объемной базы.)



Для этого в бесконечном цикле будем вызывать gajim-remote, передавая ему при помощи обратных кавычек результат выполнения команды fortunes. Между вызовами поставим паузу 5 минут (5?60=300 с).



1
while true; do gajim-remote change_status "online" "`fortune`"; sleep 300; done



У этой команды есть небольшой недостаток — нужно всё время держать терминал открытым. Для того, чтобы решить эту проблему, можно просто записать команду в текстовый файл, а потом запустить следующим образом:



1
bash changestatus.sh &



Амперсанд в конце запустит выполнение скрипта в фоне. Можно также создать правило для cron — тогда вообще не придется что-либо запускать.



Другое возможное применение — отправка кому-то сообщения по расписанию. Например, при помощи такой команды:



1
echo "gajim-remote send_chat_message [email protected] 'Hello'" | at 10:00



Ровно в 10:00 пользователю будет отправлено сообщение «Hello» (если, конечно, Gajim будет в этот момент запущен).



Итак, даже этот небольшой набор команд в сочетании с инструментами командной строки позволяет сделать что-то полезное.



Если работа gajim-remote покажется слишком медленной, можно воспользоваться, например, командой dbus-send или qdbus для отправки сообщения напрямую через D-Bus.



Список предоставляемых функций можно посмотреть при помощи команды



1
qdbus org.gajim.dbus /org/gajim/dbus/RemoteObject



Вызвать же функцию можно так:



1
qdbus org.gajim.dbus /org/gajim/dbus/RemoteObject toggle_roster_appearance



Работает намного быстрее gajim-remote, но приходится явно указывать, кому мы шлём команды.

Кросспост
Полностью.
+ 5 -
5
masai 21.07.2009 00:16

How-to`sПостроение графиков с помощью PyXPlot

Утилит, позволяющих построить на компьютере график какой-то функции, превеликое множество. Но не каждая способна создать график в достойном качестве, и с соответствующим оформлением. Многие из них интерактивны, но часто это мешает, когда нужно менять много параметров графика. Поэтому при активной работе с графиками часто применяются командные «графопостроители» — фактически маленькие языки программирования.



Среди программ таких можно отметить, например, asymptote, популярный gnuplot, metapost и другие. Достойное место в этом ряду занимает PyXPlot (её команды, кстати, во многом совпадают с командами gnuplot, так что изучив одну из этих программ, легко разобраться в другой). Отличительными особенностями программы являются простота и высокое качество результата. Ей и посвящен этот обзор.



Запуск программы



Сразу нужно отметить, что PyXPlot — программа чисто консольная. Работать с ней можно как интерактивно, вводя команду за командой, так и в скриптовом режиме. В последнем случае команды записываются в отдельный файл, который затем «скармливается» PyXPlot.



Запускается PyXPlot как обычно:



1
pyxplot СКРИПТЫ



Если вместо списка файлов поставить дефис, то программа будет читать команды со стандартного ввода, что очень удобно при автоматизации. Например, так можно нарисовать синусоиду:



1
echo 'plot sin(x)' | pyxplot -







Простейшие операции



Главная команда для рисования графиков — plot. Она позволяет не только рисовать графики функции, но и строить «по точкам» графики данных, записанных в файл.



Чтобы построить данные из файла, нужно просто указать его имя в апострофах или двойных кавычках после команды plot. Данные в файле должны быть обычным текстом с одним или несколькими столбцами чисел, разделенных пробелами или запятыми. Если имя заканчивается на «.gz», он будет автоматически распакован перед построением.



plot 'data.gz'



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



По умолчанию результаты сохраняются в файл «pyxplot.eps».



Построения графика функции полностью аналогична. Нужно просто записать её после команды plot. В качестве аргумента нужно использовать x.



plot sin(x)/x



Можно построить сразу несколько графиков в одной системе координат, просто перечислив функции (или имена файлов) через запятую.



plot sin(x)/x, sin(x)



Переменные и функции



В теле файла с командами можно объявить переменные и пользовательские функции при помощи операции «=». Всё достаточно интуитивно:



a = 2

b = 3

plot sqrt(a*pow(x,2) + b)



В PyXPlot встроены самые распространенные математические функции, такие как: sin, cos, tan, exp, min, log, acos, asin, atan, sqrt, pow и т. д.



f(x) = sqrt(x)*sin(x)

plot f(x)



Настройки графика



При помощи команды set можно задать дополнительные параметры графика, такие как подписи осей (x label и ylabel) и заголовок графика (title). В подписях можно использовать формат формулы в формате TeX (их нужно обязательно заключить в знаки «$»). Использование TeX делает график намного симпатичнее и презентабельнее.



Пример:

set xlabel '$x$'

set ylabel '$y$'

set title 'Plot of $\sin(x)\over x$'

plot sin(x)/x



Можно также задать имя выходного файла (set output) и формат выходных данных (set terminal). Поддерживаются распространённые форматы: postscript, pdf, png, jpeg.



Пример:



set terminal png

set output 'plot.png'

plot cos(x)*exp(x)



Работа с файлами данных



Данные в файле можно использовать как независимые координаты при построении. Для этого нужно добавить парметр using к команде plot.



Например, команда



plot 'data.gz' using 1:2

строит график, используя первый столбец как координату x точек, а второй — как координату y.



Стили графика



Стиль построения графика настраивается при помощи параметра with.



Команда



plot 'data.gz' with points

строит точечный график, а команда



plot 'data.gz' with lines

соединяет точки отрезками.



Можно также откладывать ошибку на графике (with yerrorbars), но для этого потребуется третий столбец.



Тип маркеров и линий также настраивается при помощи модификаторов pointtype и linetype. Подробности — в документации.



plot sin(x) with lines linetype 3



Диапазоны по осям



При построении можно указать размеры осей. Для этого нужно указать минимально и максимальное значения по каждой из осей в квадратных скобках через двоеточие. Если нужно указать параметры только для одной оси, то для другой просто записсывается «<:>» без чисел. Пример:



plot <-1:1><-1:1> sin(x)



Заключение



Разумеется, возможности программы не исчерпываются только перечисленными командами. Утилита имеет ещё очень много разных возможностей: от аппроксимации данных из файла до построения графиков векторных полей.





Кросспост
Полностью.
+ 11 -
4
masai 20.07.2009 14:11

How-to`sКак переименовать тысячу файлов

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



В этих случаях на помощь приходят регулярные выражения и специальные утилиты для массового переименования.



Для меня наиболее удобна консольная утилита prename (или rename), входящая в состав пакета perl. Но кому-то больше по душе, наверное, придутся программы с графическим интерфейсом. Могу посоветовать программы krename или gprename. Однако, в большинстве случаев вполне хватит и prename.



Введение



Синтаксис команды выглядит очень просто:



1
prename ШАБЛОН ФАЙЛЫ



Но за этой простотой скрывается огромная мощь. Дело в том, что в качестве шаблона используются регулярные выражения.



Параметр ФАЙЛЫ может быть как списком файлов, так и шаблоном в стиле bash, использующим * для любой последовательности символов и ? для одиночного символа. Например, «*.txt» — это все файлы с раширением «txt».



Регулярные выражения



Остановимся поподробнее на регулярных выражениях. Это настолько обширная тема, что о них пишутся целые книги. И настолько сложная, что большую популярность получила известная шутка: «Некоторые люди, когда сталкиваются с какой-то проблемой, думают:

“Думаю, я применю регулярные выражения.” Теперь у них две проблемы.» (Jamie Zawinski) Однако, в простых случаях регулярные выражения просты и удобны. Разве что выглядят непривычно. (Честно говоря, иногда они выглядят так, будто по клавиатуре пробежала кошка.)



В утилите prename регулярные выражения обычно имеют следующий вид:



1
s/ИСХОДНЫЙ/КОНЕЧНЫЙ/



ИСХОДНЫЙ и КОНЕЧНЫЙ — это шаблоны. Первый задает подстроку, которую нужно найти в имени, а второй — на что эту подстроку заменить.



В простейшем случае это могут быть обычные слова. Команда

1
prename 's/Алиса/Боб/' *.txt



заменит во всех файлах с расширением «txt» слово «Алиса» на слово «Боб».



Нужно заметить, что шаблон применяется к каждому имени файла только один раз. То есть файл с именем «Эх, Алиса, Алиса.txt» будет заменен на «Эх, Боб, Алиса.txt». Чтобы шаблон примянялся столько, сколько нужно, необходимо добавить пареметр g к регулярному выражению:

1
prename 's/Алиса/Боб/g' *.txt





Подстановки



Кроме собственно слов можно использовать специальные подстановочные символы:

«.» — любой одиночный символ,

«\d» — цифра,

«\D» — любой символ кроме цифры,

«\w» — буква, цифра или знак подчёркивания,

«\W» — всё, кроме букв, цифр и знака подчёркивания,

«\s» — любой пробельный символ,

«\S» — любой непробельный символ.



Например, команда

1
prename 's/\s/_/g' *.txt



заменит пробелы на знаки подчёркивания. Несколько идущих подряд пробелов будут заменены на несколько подчёркиваний.



Начало и конец



Есть также специальные псевдосиволы:

«^» — обозначает начало слова,

«$» — обозначает конец слова.



Например, команда

1
prename 's/a$/b/' *.txt



заменит «a» на «b» только если «a» — последний символ имени файла.



Экранирование



Если же какой-то из специальных символов нужно использовать в шаблоне как символ обычный, его нужно экранировать обратным слэшем. Например, «.» — одиночный символ, «\.» — просто точка.



Повторы



После любой части регулярного выражения можно поставить количество его повторов:

«?» — ноль или один,

«*» — ноль и более,

«+» — один и более,

«{n}» — ровно n

«{m,n}» — от m до n,

«{m,}» — от m и более,

«{,n}» — от нуля до n.



Символы «?», «+» и «*» по умолчанию являются «жадными», то есть пытаются отхватить как можно большую часть выражения, попадающую под шаблон.



Команда

1
prename 's/\s+/_/g' *.txt



заменит пробелы на знаки подчёркивания. Несколько идущих подряд пробелов будут заменены на одно подчёркивание.



Группировка и ссылки



Части выражения можно группировать при помощи круглых скобок. Также можно ссылаться на скобки при помощи выражения вида «$номер». Здесь — номер — это номер пары скобок в порядке их вхождения в выражение.



Например, команда

1
prename 's/(\d)+/$1/g' *.txt



заменит несколько подряд идущих одинаковых цифр в имени на одну (эту же!) цифру. То есть файл с именем «11122233333.txt» будет переименован в «123.txt».



А команда

1
prename 's/(.*) - (.*)\.mp3/$2 - $1\.mp3/' *.mp3



переименует файл «Ария Филиппа - Шаляпин.mp3» в «Шаляпин - Ария Филиппа.mp3».



Что там, за горизонтом?



Есть также полезная возможность заглянуть вперед или назад, но не включая определенную часть шаблона в найденное:

«(?=ШАБЛОН)» — просмотр вперёд,

«(?!ШАБЛОН)» — просмотр вперёд (с отрицанием),

«(?<=ШАБЛОН)» — просмотр назад,

«(?<!ШАБЛОН)» — просмотр назад (с отрицанием).



Например, команда

1
prename 's/(?<!x)a/b/g' *.txt



заменит «a» на «b» в файлах с раширением «txt» только если «a» не идёт после x.



А команда

1
prename 's/a(?!x)/b/g' *.txt



заменит «a» на «b» в файлах с раширением «txt» только если «a» не идёт перед x.



Заключение



Регулярные выражения имеют огромную область применения. Естественно, в этом посте перечислены далеко не все их возможности. Например, не сказано про транслитерацию или диапазоны символов.



В качестве неплохого руководства по ним могу порекомендовать книгу Дж. Фридла «Регулярные выражения».



У утилиты, конечно, есть и недостатки. Главный очевиден — нужно знать регулярные выражения. Есть и другие. Например, с помощью prename нельзя пронумеровать файлы.



P.S. На welinux уже был пост схожей тематики: «Массовое переименование файлов». Советую заглянуть и туда.

Кросспост
Полностью.
+ 18 -
4
17.07.2009 15:53

masai — Обзор идей для GNOME Shell

Как известно, сейчас полным ходом идет работа над GNOME 3, в котором привычный интерфейс будет заменен на GNOME Shell. И хотя последний будет включен в GNOME 2.8, работа сейчас находится на достаточно ранней стадии. В связи с этим разработчики предлагают каждому предложить свою идею, каким должен быть интерфейс нового GNOME. Сбор идей производится на сайте проекта.



По ссылке — небольшой обзор с картинками.
Полностью.
+ 5 -
9
masai 16.07.2009 22:48

Есть вопрос!Память и wxWidgets

Решил я изучить wxWidgets. Довольно удобная штука и легко программируется. По следам недавнего поста тренироваться начал с написания будильника (автор того поста не я :)). Но так и не дописал, столкнувшись с проблемой.



Меня смущает огромное потребление памяти. Программка просто рисующая значок в панельке рядом с часами и выводящая меню по клику занимает в памяти больше 5 мегабайт!



Откомпилировал один из стандартных примеров — тоже потребление памяти высокое. Это нормально?





Система — Ubuntu 9.04.

Версия wxWidgets — 2.8.

Компилировал командой «g++ alarm.cpp `wx-config --cxxflags --libs std` -o alarm»



Вот эту программку я компилировал:

  1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <wx/wx.h>

#include <wx/taskbar.h>

#include <wx/aboutdlg.h>



wxString iconAlarmOff = wxT(&#34;/usr/share/icons/gnome/24x24/stock/generic/stock_timer_stopped.png&#34;);

wxString iconAlarmOn = wxT(&#34;/usr/share/icons/gnome/24x24/stock/generic/stock_timer.png&#34;);

wxString iconAlarm = wxT(&#34;/usr/share/icons/gnome/24x24/stock/form/stock_form-time-field.png&#34;);

wxString iconAlarm48 = wxT(&#34;/usr/share/icons/gnome/48x48/stock/generic/stock_alarm.png&#34;);



class Alarm : public wxApp {

private:

DECLARE_EVENT_TABLE()

public:

virtual bool OnInit();



void OnAbout(wxCommandEvent&);

void OnQuit(wxCommandEvent&);



wxTaskBarIcon* tbIcon;

};



DECLARE_APP(Alarm)

IMPLEMENT_APP(Alarm)



BEGIN_EVENT_TABLE(Alarm, wxApp)

EVT_MENU(wxID_ABOUT, Alarm::OnAbout)

EVT_MENU(wxID_EXIT, Alarm::OnQuit)

END_EVENT_TABLE()





class Icon : public wxTaskBarIcon {

private:

virtual wxMenu* CreatePopupMenu();

};



bool Alarm::OnInit() {

this-&gt;tbIcon = new Icon;

this-&gt;tbIcon-&gt;SetIcon(wxIcon(iconAlarm), wxT(&#34;Будильник&#34;));



return true;

}



wxMenu* Icon::CreatePopupMenu() {

wxMenu* menu = new wxMenu(0);

menu-&gt;Append(wxID_ABOUT, wxT(&#34;&О программе&#34;));

menu-&gt;AppendSeparator();

menu-&gt;Append(wxID_EXIT, wxT(&#34;В&ыход&#34;));

return menu;

}



void Alarm::OnQuit(wxCommandEvent&) {

delete this-&gt;tbIcon;

}



void Alarm::OnAbout(wxCommandEvent&) {

wxAboutDialogInfo about;



about.AddDeveloper(wxT(&#34;masai&#34;));

about.SetName(wxT(&#34;Будильник&#34;));

about.SetDescription(wxT(&#34;Небольшой будильник для панели уведомлений&#34;));

about.SetIcon(wxIcon(iconAlarm48));



wxAboutBox(about);

}





P.S. Ещё не понравился баг с масштабирование иконки. :(
Полностью.
+ -1 -
4
masai 16.07.2009 03:08

Tips & tricksИнформация о медиафайлах

В недавнем посте об отображении тегов mp3-файлов рассказывалось об утилите mp3info. К сожалению, она обладает существенными недостатками: не понимает ID3v2 и работает, как следует из названия, только с mp3-файлам.



Однако, сама по себе утилитка довольно удобна. Поэтому я решил написать небольшой скрипт, предоставляющий похожий интерфейс, но понимающий большее количество медиаформатов.



Естественно, писал я его не на пустом месте. Для работы скрипта потребуется библиотека Kaa.Metadata:



1
sudo aptitude install python-kaa-metadata



Параметров у скрипта всего два (для простоты): форматная строка и файл (или несколько файлов через пробел):



1
mediainfo.py ФОРМАТ файл(ы)



При указании файла можно использовать стандартные шаблоны. Так что вполне допустимо имя вида «*.mp3». Можно использовать и более сложные шаблоны: «~/Музыка/*/*.mp3».



Скрипт не умеет рекурсивно обходить каталоги, но это ему и не нужно. Обход можно реализовать, например, средствами bash.



Подробнее о форматной строке. В ней можно использовать следующие шаблоны:

%t — название,

%a — исполнитель,

%r — частота дискретизации,

%l — продолжительность,

%m — продолжительность (только минуты),

%s — продолжительность (только секунды)

%c — кодек,

%b — битрейт,

%n — номер трека,

%A — альбом,

%g — жанр,

%% — символ %.



В ней также можно использовать обычные питоновские экранированные последовательности: \n, \t и т. д.



Вставлять \n в конце форматной строки не нужно, это делается автоматически. Кроме того, вывод скрипта автоматически переконвертируется в кодировку текущей локали.



Если теги файла записаны в однобайтовой кодировке и формат тегов не предусматривает указания кодировки, то скорее всего вместо ожидаемой cp1251 будет latin-1. Впрочем, ответственность за это лежит на библиотеке. Может, это можно настроить, я глубоко не вникал. Во всяком случае, это еще один повод перевести все теги в utf-8.



Утилиту можно использовать как саму по себе, так и в конвейере:



1
mediainfo.py '%l' ~/Музыка/*/* | awk '{s += $1} END {print "?",int(s/3600),"hour(s)"}'



А вот, собственно, исходный текст скрипта:



  1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#!/usr/bin/env python

#-*- coding:utf-8 -*-



# Disable all warnings

import warnings

warnings.filterwarnings(&#39;ignore')



# Disable log messages

#import logging

#logger = logging.getLogger('metadata')

#logger.setLevel(logging.CRITICAL)



# Get locale encoding

import locale

encoding = locale.getdefaultlocale()<1>



import os

import sys

import glob

import string

import kaa.metadata



class MyTemplate(string.Template): delimiter = &#39;%'



def addItem(infolist, info):

item = {}

item<&#39;t'> = info.title # Title

item<&#39;a'> = info.artist # Artist

item<&#39;r'> = info.samplerate # Samplerate

item<&#39;l'> = int(info.length) # Length (seconds)

item<&#39;m'> = int(item<'l'> / 60) % 60 # Length (minutes only)

item<&#39;s'> = format(item<'l'> % 60, '02d') # Length (seconds only)

item<&#39;c'> = info.codec # Codec

item<&#39;b'> = info.bitrate # Bitrate

item<&#39;n'> = info.trackno # Track number

item<&#39;A'> = info.album # Album title

item<&#39;g'> = info.genre # Genre

infolist.append(item)



def process(path):

infolist =


path = os.path.normpath(path)

for f in glob.glob(os.path.expanduser(path)):

if os.path.isdir(f):

continue

try:

info = kaa.metadata.parse(f)

except:

info = None

if info != None:

addItem(infolist, info)

return infolist



if len(sys.argv) &lt; 3:

print &#39;Usage:'

print os.path.split(sys.argv<0>)<1>, &#39;FORMAT file(s)'

exit(0)

for f in sys.argv<2:>:

infolist = process(f)

for item in infolist:

sys.stdout.write(MyTemplate(sys.argv<1>).safe_substitute(item).encode(encoding) + &#39;\n')





Не забываем разрешить его выполнение:



1
chmod +x mediainfo.py



Кросспост
Полностью.
+ 7 -
10
masai 15.07.2009 17:17

Tips & tricksИнформация об mp3-файлах

Иногда, когда залезаешь в свою коллекцию музыки, возникает необходимость составить список песен с продолжительностью. Например, для того, чтобы распечатать и приложить к диску.



Для того, чтобы получить названия песен можно использовать ls, но не всегда название файла соответствует содержимому. И ещё реже в названии указана продолжительность.



В этом случае на помощь приходит пакет mp3info.



В Ubuntu устанавливается как обычно:



1
sudo aptitude install mp3info



У него довольно много возможностей по редактированию и отображению тегов. Подробности можно узнать в man. Для того, чтобы получить список песен в альбоме можно воспользоваться следующей командой:



1
mp3info -p 'ФОРМАТ' *.mp3



Она выведет данные об mp3-файлах в текущем каталоге в соответствии со строкой ФОРМАТ.



В форматной строке можно использовать как обычные символы (они выведутся как есть), так и специальные шаблоны. Вот список некоторых из них:

%f — имя файла без пути,

%F — имя файла с путём,

%k — размер файла в килобайтах,

%a — исполнитель,

%g — жанр,

%l — альбом,

%n — номер трека,

%t — название трека,

%y — год,

%q — частота сэмплирования (в кГц),

%r — битрейт,

%m — продолжительность (только минуты),

%s — продолжительность (только секунды),

%% — знак процента,

\n — перевод строки,

\t — горизонтальная табуляция,

\\ — обратный слэш.



Например, команда



1
mp3info -p '%n. %a - %t (%m:%s)\n' *.mp3



выведет на экран что-то вроде:



 1
2
3
4
5
6
7
8
9
10
11
01. Allison Crowe - It Came Upon the Midnight Clea (0:42) 

02. Allison Crowe - Silent Night (4:2)

03. Allison Crowe - In the Bleak Midwinter (4:3)

04. Allison Crowe - What Child Is This (4:4)

05. Allison Crowe - The First Noel (5:34)

06. Allison Crowe - O Holy Night (4:16)



Следует помнить, что mp3info работает только с тегами ID3v1.1.



Кросспост
Полностью.
+ 8 -
11
1 2

Смотреть видео онлайн

Онлайн видео бесплатно


Смотреть русское с разговорами видео

Online video HD

Видео скачать на телефон

Русские фильмы бесплатно

Full HD video online

Смотреть видео онлайн

Смотреть HD видео бесплатно

School смотреть онлайн