ОМСКАЯ ГРУППА ПОЛЬЗОВАТЕЛЕЙ LINUX http://omsklug.com Свобода - это ответственность. Вот почему все её так боятся. Бернард Шоу Wed, 09 Apr 2014 13:27:25 +0000 en hourly 1 http://wordpress.org/?v=3.2.1 XSLT в примерах: парсер списка каналов кабельного ТВ Дом.ru http://omsklug.com/2014/04/xslt-v-primerax-parser-spiska-kanalov-kabelnogo-tv-dom-ru/ http://omsklug.com/2014/04/xslt-v-primerax-parser-spiska-kanalov-kabelnogo-tv-dom-ru/#comments Wed, 09 Apr 2014 13:27:25 +0000 Alexey Osipov http://omsklug.com/?p=1624 Введение

Смотреть ТВ с использованием ТВ-тюнера в ОС на базе Linux можно по-разному. Например, можно использовать программу со звучным названием tvtime. Она обладает прекрасным встроенным деинтерлейсером, умеет работать с разными ТВ стандартами (PAL/SECAM/NTSC), пультом ДУ, а также может показывать выдержку из ТВ-программы для каждого канала на настоящий момент и ближайшее будущее.

tvtime

tvtime может использовать предзаданный список каналов, а может, как и любой приличный телевизор, просканировать весь частотный диапазон и запомнить найденные каналы. В случае с эфирным ТВ сносно работают обе опции. А вот у кабельного ТВ имеется пара нюансов: во-первых, частотный план кабельных провайдеров редко совпадает с эфирным, а во-вторых, этот план имеет свойство динамично меняться. Первое делает бессмысленным использование предзаданного списка каналов, а второе требует частого пересканирования всего частотного диапазона, что занимает некоторое время (около 10 минут) и приводит к перемешиванию порядка каналов.

“А что если..?” - подумал я и полез на сайт своего кабельного провайдера, и точно:

На сайте кабельного ТВ Дом.ru имеется список каналов в PDF, который представляет собой таблицу с названиями каналов, их описанием и несущей частотой:

Первая страница списка каналов

Самое полезное в этом списке – сопоставление названия канала с частотой его вещания. Дело за малым – научиться автоматически конвертить данный PDF в список каналов для tvtime. Приступим.

Шаг 1. Скачать файл с сайта – самое лёгкое:

wget -O channels.pdf http://omsk.domru.ru/sites/default/files/rtf_frequency/omsk_frequency_plan.pdf

Формат списка каналов tvtime

tvtime хранит список каналов в xml-файле ~/.tvtime/stationlist.xml. Формат его прост и лаконичен – в корневом элементе stationlist содержится один или несколько списков каналов list, в каждом из которых содержатся описания каналов station:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE stationlist PUBLIC "-//tvtime//DTD stationlist 1.0//EN" "http://tvtime.sourceforge.net/DTD/stationlist1.dtd">
<stationlist xmlns="http://tvtime.sourceforge.net/DTD/">
 <list norm="PAL" frequencies="Custom" audio="bg">
  <station position="1" name="Инфоканал" channel="85,25MHz" band="Custom" active="1" finetune="0" norm="PAL" audio="auto"/>
  <station position="2" name="Первый канал" channel="111,25MHz" band="Custom" norm="SECAM" xmltvid="244" active="1" finetune="0" audio="auto"/>
  <station position="3" name="НТВ" channel="119,25MHz" band="Custom" norm="SECAM" active="1" finetune="0" audio="auto"/>
  <station position="4" name="Россия 1 (дубль 4)" channel="127,25MHz" band="Custom" norm="SECAM" active="1" finetune="0" audio="auto"/>
  <station position="5" name="ТВЦ" channel="135,25MHz" band="Custom" active="1" finetune="0" norm="PAL" audio="auto"/>
 </list>
</stationlist>

Основные атрибуты элемента station говорят сами за себя: position – номер канала по порядку, name – отображаемое название канала, channel – частота вещания, norm – стандарт вещания. Другие атрибуты нам не важны, поэтому я опущу их описание.

Итак, задача: имея PDF со списком каналов, получить xml со списком каналов. Но как? В два этапа: сначала немножко PDF-магии.

PDF превращается… в элегантный XML

Воспользуемся программой pdftohtml, которая, как несложно догадаться, предназначена для преобразования PDF-документа в HTML-документ. А если запустить её с ключом -xml, то вместо HTML-документа на выходе будет чудесный XML. Ещё нам понадобятся переключатели -i для игнорирования картинок и -s для того, чтобы pdftohtml не создавал для каждой PDF-страницы отдельный xml-файл.

Шаг 2. Преобразуем PDF в XML:

pdftohtml -s -i -xml channels.pdf channels.xml

PDF в виде XML выглядит примерно так:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pdf2xml SYSTEM "pdf2xml.dtd">
<pdf2xml>
 <page number="1">
  ...
  <text top="447" left="79" width="10" height="17" font="0">2</text>
  <text top="447" left="123" width="112" height="17" font="0">Первый канал</text>
  <text top="466" left="136" width="84" height="17" font="0">(Орбита 4)</text>
  <text top="447" left="301" width="96" height="15" font="3">Общественно-</text>
  <text top="463" left="302" width="95" height="15" font="3">политический</text>
  <text top="447" left="485" width="182" height="15" font="3">Новости, информационно -</text>
  <text top="463" left="454" width="244" height="15" font="3">аналитические и публицистические</text>
  <text top="447" left="743" width="44" height="15" font="3">111,25</text>
  ...
 </page>
 <page number="2">...</page>
</pdf2xml>

Исходный документ представлен в виде последовательности страниц (xml-элементов page). Каждая страница в свою очередь состоит из набора элементов text, описывающих участки текста. Каждый участок текста характеризуется своим положением на странице (атрибуты top, left, width, height) и номером шрифта (атрибут font). Исходная табличная структура PDF, к сожалению, не отражена в XML.

Информация об одном канале в такой XML состоит из нескольких элементов text. Внимательно рассматривая channels.xml можно заметить, что:

  • номер канала всегда использует шрифт 0 и имеет координату left меньше 100;
  • название канала также всегда использует шрифт 0 и имеет координату left от 100 до 200;
  • название канала может состоять из нескольких строк;
  • частота вещания канала всегда использует шрифт 3 и имеет координату left больше 700.

Осталось только выразить эти чудесные особенности некоторым формальным образом – с помощью XSLT.

XSLT

XSLT расшифровывается как eXtensible Stylesheet Language Transformations (дословно: преобразования на основе расширяемого языка таблиц стилей). А по-русски просто язык преобразования XML-документов.

]]>
http://omsklug.com/2014/04/xslt-v-primerax-parser-spiska-kanalov-kabelnogo-tv-dom-ru/feed/ 0
Document Freedom Day 2014 в Омске http://omsklug.com/2014/03/document-freedom-day-2014/ http://omsklug.com/2014/03/document-freedom-day-2014/#comments Sun, 23 Mar 2014 18:37:15 +0000 linuxmasterz http://omsklug.com/?p=1668 Document Freedom Day from Free Software Foundation Europe e.V.

2014-03-29 в 10.00 OMST (с утра) Омская группа пользователей Linux (OmskLUG) проводит День свободы форматов данных в Омском IT Loft (г. Омск, ул. Учебная, д. 83).

С 2008 года ежегодно во всем мире в последнюю среду марта проводится День свободы форматов данных (http://documentfreedom.org/). В 2014 году – это 26 марта (мы же перенесли на субботу, будний день – неудачное время). Это мероприятие направлено на повышение информированности общества об открытых стандартах и форматах.

Несколько докладов о свободных форматах данных в кругу единомышленников:

“Свободные форматы данных – как спасение человечества”
“Свободное железо”
“Свободные медиаресурсы”

Планирование акций по внедрению свободных форматов данных. Приходите со своими историями успеха, когда и как вас спасли свободные форматы данных и вообще свободный медиаконтент.

В ходе мероприятия, во время кофебрейка, после мероприятия будет “криптовечеринка” (KSP, Key Signing Party): приносите свои отпечатки публичных ключей  (а лучше отправьте их координатору на post@omsklug.com) и какой-нибудь документ, который удостоверяет, что вы есть. Что такое KSP? Вот: https://db.tt/86bW7biW

Если желаете поучаствовать в качестве организаторов, то оставляйте комментарии на сайте http://www.omsklug.com , пишите на почту post@omsklug.com, забегайте в нашу jabber-конференцию: omsklug@conference.jabber.ru

Для успешного проникновения на территорию IT Loft необходима регистрация и тапочки (ну или можете храбро ходить без обуви, если посмеете):

http://bit.ly/dfd2014

Если же проникнуть вам не удастся, то есть вариант посмотреть трансляцию мероприятия тут: http://www.omsklug.com/tv

]]>
http://omsklug.com/2014/03/document-freedom-day-2014/feed/ 2
Вторая троллинуксовка в Омске http://omsklug.com/2014/02/trolleybus-linux-meeting-2/ http://omsklug.com/2014/02/trolleybus-linux-meeting-2/#comments Sun, 23 Feb 2014 18:30:43 +0000 linuxmasterz http://omsklug.com/?p=1658

Утро

В морозное утро 22 февраля 2014 года омские линуксоиды выдвинулись на начальную точку движения в небольшом путешествии по Омску на WiFiизированном троллейбусе маршрута №4, а именно на остановку общественного транспорта «Железнодорожный вокзал». Это уже не первый случай такого «хождения в народ». Что-то подобное мы уже делали в 2011 году.

Собралось чуть более трёх человек. Если бы собрались в 11.00, то сразу бы выехали, но…. Получилось так, что ждали следующего троллейбуса до 12.10 часов, мёрзли на остановке, грелись в тамбуре железнодорожного вокзала, почему-то не привлекая внимания охраны.

В троллейбусе

Только присели, раскрыли ноутбуки, как некий пожилой господин стал активно интересоваться, чем же мы тут занимаемся, за что он был одарен брошюрой про GNU/Linux. Потом были девушки, студенты, ну и кондуктору выдали брошюрку, чтобы знали в троллейбусном парке, что тут делали омские линуксоиды. Было холодно, чертовски холодно, особенно ближе к полу, так как троллейбус был не совсем новый. Но в целом было весело, что смягчало температурный дискомфорт. Удивительно, что не каждый кондуктор знает, есть ли WiFi в троллейбусе или нет. Вообще, в том троллейбусе, на котором следовали в Нефтянники, не было каких-либо опозновательных знаков про WiFi, может это и к лучшему.

Тесты

Интернеты в WiFi-роутере были обычные. 200-300 ms задержки и 500-1200 килобит в секунду по скоростям (меряли кошерной iperf). Адрес роутера 192.168.1.1. Блокировки сайтов обычные, от основного провайдера. Порты, кроме 80 и 443, прекрасно пропускает, что серьёзный плюс, так как SSH и VPN жизненно важен для более-менее продвинутого линуксоида.

Сюрприз

Во время использования интернетов в троллейбусе, подошёл некий неизвестный школьник и давай показывать, что 3G-роутер совершенно беззащитен: имя учётной записи admin и пароль админки внезапно совпадали. Представители сообщества в интернетах предлагали залить в 3G-роутер улучшенную и безопасную прошивку OpenWRT, но не стали так делать. Хотя… Ведь есть же cjdns, да? Или i2p? Не, ну правда. Почему бы и нет? Скриншотики сохранили. Интернет раздавал Huawei B681 HSPA+ 4G Wireless gateway router. Молодцы, хороший выбор, не совсем плохая железка.

Фотосессия

Вторая троллинуксовка в Омске
Вторая троллинуксовка в Омске
]]>
http://omsklug.com/2014/02/trolleybus-linux-meeting-2/feed/ 0
Настройка ejabberd сервер + mysql + pyticq транспорт http://omsklug.com/2014/02/ejabberd-server-mysql-pyticq-transport/ http://omsklug.com/2014/02/ejabberd-server-mysql-pyticq-transport/#comments Sun, 09 Feb 2014 13:34:08 +0000 Plus http://omsklug.com/?p=1521 Обычная история про то, как я устанавливал обычный корпоративный сервер для общения между сотрудниками, так и через внешние аккаунты некогда популярных сетей общения.

1. Базовые настройки

Настройки /etc/ejabberd/ejabberd.cfg почти все стандартны, за исключением указанных ниже:

override_local.

Укажем логин администратора (у jabber-сервера свой администратор, не путать с системным) и имя сервера:
%% Admin user {acl, admin, {user, "info", "omsklug.com"}}.
%% Hostname {hosts, ["omsklug.com"]}.

Раскомментируем настройки транспорта icq:
%% Jabber ICQ Transport
{5555, ejabberd_service,
[{ip, {127, 0, 0, 1}},
{access, all},
{shaper_rule, fast},
{hosts, ["icq.omsklug.com", "sms.omsklug.com"],
[{password, "secret"}]}
]},

Если используется внутренняя база тогда раскоментируем:
%%{auth_method, internal}.

Если же используется база mysql, тогда открываем вот это:
{auth_method, odbc}.

Далее настроим доступ к Базе данных, предварительно её создав и настроить пользователя к ней:
{odbc_server, {mysql, "localhost", "ejabberd", "ejabberd", "ejabberd"}}.

Включаем настройку локализации:
{language, "ru"}.

Разрешаем регистрацию пользователей:
{access, register, [{allow, all}]}.

далее нужно подключить модули к mysql:
Меняем значения:
mod_last на mod_last_odbc
mod_offline на mod_offline_odbc
mod_privacy на mod_privacy_odbc
mod_private на mod_private_odbc
mod_roster на mod_roster_odbc
mod_vcard на mod_vcard_odbc

Сохраняем и закрываем /etc/ejabberd/ejabberd.cfg

2. Настройка базы MySQL для ejabberd

Теперь настройка mysql базы: нужно грамотно загрузить дамп пустой базы, поэтому берем его тут:
https://github.com/processone/ejabberd/blob/2.1.x/src/odbc/mysql.sql
После всех операций перезапускаем правильно необходимые сервисы ejabberd и mysqld:

sudo /etc/rc.d/ejabberd stop sudo /etc/rc.d/mysqld restart sudo /etc/rc.d/ejabberd start

3. Создание общего списка контактов сервера

В общем на этом можно было бы и остановиться, если бы не одно но. По умолчанию список контактов (ростер на терминологии jabber) нового пользователя пуст. Это вполне нормально для личного использования или для работы с публичными серверами – пользователь сам выбирает с кем общаться, но абсолютно неприемлемо для корпоративной среды, где список контактов заранее определен. Было бы неплохо, чтобы новый пользователь автоматически попадал в этот список и автоматически получал его в свой клиент. К счастью сделать это совсем несложно. В /etc/ejabberd/ejabberd.cfg найдем и раскомментируем следующую строку:

{mod_shared_roster, []},

Сохраняем файл, перезапускаем сервис. Теперь в веб-админке в разделе Virtual Hosts – имя вашего сервера появился пункт Группа общих контактов. Создаем такую группу и настраиваем. Для того, чтобы в группу автоматически попадали все пользователи в поле Члены укажите @all@, а в поле Видимые группы укажите название вашей группы, которое вы ввели при ее создании.

ВНИМАНИЕ!!!
Для Debian GNU/Linux надо установить клиент к БД. Готовый годный пакет -  здесь
Подробное описание конфига /etc/ejabberd/ejabberd.cfg можно посмотреть тут: http://blog.scaytrase.ru/linux/330/
Ещё один неплохой мануал: http://forum.odmins-it.ru/index.php?topic=170.0

4. Настройка транспорта ICQ

Далее переходим к настройке необходимого нам pyticq:
Здесь всё проще некуда:

<pyicqt>
<!-- The JabberID of the transport. -->
<jid>icq.hostname.server</jid>
<!-- The component JID of the transport. Unless you're doing clustering, leave this alone -->
<!-- <compjid>icq1</compjid> -->
<!-- The IP address of the main Jabberd server -->
<mainServer>127.0.0.1</mainServer> - адрес сервера
<!-- The JID of the main Jabber server -->
<mainServerJID>icq.adress.ru</mainServerJID> - имя сервера с транспортом
<!-- The website of the Jabber service -->
<website>http://adress.ru/</website> - адрес странички
<!-- The website of the transport service -->
<!-- <transportWebsite></transportWebsite> -->
<!-- The support room on your server -->
<!-- <supportRoom></supportRoom> -->
<supportJid>jid@adress.ru</supportJid>
<!-- The TCP port to connect to the Jabber server on -->
<!-- (this is the default for Jabberd2) -->
<port>5555</port> - порт указанный в транспорте конфига ejabberd.cfg
<!-- The TCP port that the web admin interface will answer on -->
<!-- (uncomment to enable) -->
<!-- <webport>12345</webport> -->
<webport>8022</webport>
<!-- The authentication token to use when connecting to the Jabber server -->
<secret>secret</secret>
<!-- The default language to use (for error/status messages) -->
<lang>ru</lang>
<!-- Default one-byte message encoding to use -->
<encoding>cp1251</encoding>
<!-- The hostname of the ICQ server you wish to connect to -->
<icqServer>login.icq.com</icqServer>
<!-- The port of the ICQ server you wish to connect to -->
<icqPort>5190</icqPort>

можно еще отредактировать блок:

<admins>
<jid>admin@jid</jid>
<!--<jid>admin@host.com</jid>-->
</admins>

Остальное оставляем по умолчанию. У нас получился XMPP-сервер (Jabber), проникнутый духом корпоративности и порядка. В будущем подумаем о других транспортах XMPP. В комментариях – пишите, какие транспорты IM-сетей вас интересуют.

]]>
http://omsklug.com/2014/02/ejabberd-server-mysql-pyticq-transport/feed/ 0
Как освежить отношения с партнёром по e-mail http://omsklug.com/2013/09/face-email-header-creation-and-usage/ http://omsklug.com/2013/09/face-email-header-creation-and-usage/#comments Wed, 25 Sep 2013 08:22:31 +0000 Shroom http://omsklug.com/?p=1558 .local p {text-align: justify!important; text-justify: inter-word!important;} .local a {color: rgb(16, 8, 96)!important;} .local a:visited {color: Gray!important;} .local a:hover {text-decoration: underline; color: Blue!important;} .local code {font-family: Monospace,Courier!important;}

Всё, что вы хотели знать о заголовке (X-)Face, но боялись спросить

Статья рассказывает о заголовочных полях сообщений электронной почты X-Face и Face, о способах их генерации и внедрения в письмо. Также затронуты темы фильтрации изображений с помощью утилит из пакетов netpbm и ImageMagick.

Что такое e-mail message headers?

Заголовки (вернее, заголовочные поля) сообщений e-mail — это служебные поля данных, расположенные непосредственно перед телом сообщения и содержащие (как минимум) информацию об отправителе, дате отправки, получателе и пути следования письма. Физически они представляют собой строки, начинающиеся с зарезервированного служебного слова и заканчивающиеся переводом строки. От тела письма заголовок отделяется пустой строкой. В принципе, всё это давно было о писано в RFC 822 («Internet Message Format»), который к данному моменту окончательно устарел и был в своё время заменён на RFC 2822, который тоже уже устарел и был заменён на более новый RFC 5322.

Однако, если мы внимательно почитаем эти документы, то не найдём в них упоминаний ни о каких полях (X-)Face. В общем-то, это и правильно, поскольку RFC дают лишь то, что необходимо и достаточно для организации той или иной информационной инфраструктуры. А те поля, о которых пойдёт речь дальше, являются расширениями.

Для чего нужны поля (X-)Face?

Если очень коротко, то в этих полях может содержаться портрет отправителя письма или какой-нибудь логотип. Например, в Claws Mail это выглядит примерно так:


Пример отображения поля Face в почтовом клиенте Claws Mail

А теперь о том, как обстоят дела на самом деле…

А на самом деле о полноценном изображении речи в принципе не идёт. Во-первых, сам по себе размер картинки 48×48 точек не предполагает каких-либо эстетических изысков, поэтому портретное сходство будет веcьма общим. Во-вторых, ограничение на количество цветов делает задачу передачи этого самого сходства весьма нетривиальной. Например, формат X-Face определяет возможность передачи только чёрно-белой картинки. Поле Face может содержать уже цветную картинку, но количество цветов в ней, скорее всего, не будет превышать 30, поскольку есть очень жёсткие ограничения на объём информации.

Однако, нет поводов для беспокойства. Автор формата X-Face Джеймс Эштон на своей страничке буквально говорит о том, что «сделанные тщательно, с использованием дизеринга, [чёрно-белые] изображения лиц на удивление узнаваемы, даже с их небольшим размером». На самом деле никто не запрещает вместо портрета использовать скан личной подписи или какой-нибудь символ. А может быть и пару-тройку слов. Тем более, что изображение может быть цветным… Однако, описание подобных нетривиальных способов использования полей (X-)Face выходит за рамки данной статьи.

Способы создания картинок для поля Face

Поскольку поле X-Face давно можно считать морально устаревшим, сразу перейдём к генерации изображений для Face. Тем же, кто интересуется историческими артефактами, можно посоветовать поставить пакет compface, который, собственно, и предназначен для создания картинок в старом формате. Если же вы хотите моментально оценить, нужен ли вам X-Face, можно заглянуть на страницу онлайн-конвертора изображений в этот формат (благодарности за предоставленную ссылку — alexandrorodrigez).

Итак, для начала рассмотрим, какие ограничения накладываются на изображение для поля Face. Во-первых, это картинка в формате PNG. Во-вторых, размер изображения остаётся таким же, как и в X-Face и составляет 48×48 точек. В-третьих, размер файла жёстко ограничен сверху. Человек, предложивший использовать новый формат поля, Ларс Магне Ингебригтсен (по совместительству — автор программы Gnus) даёт довольно подробный расчёт размера этого самого png-файла, исходя из ограничений на размер поля по RFC, BASE64-кодирования и наличия дополнительной служебной информации. В сухом остатке получаем 725 байт максимум… Да, я тоже сначала подумал, что это невозможно. Однако, сейчас мы с вами узнаем, как же можно упихать в эти жалкие 700 байт какую-нибудь прикольную картинку.

Авторский способ

Собственно, Ларс предлагает конвертировать любую картинку в формат Face примерно вот так:

djpeg face.jpg | ppmnorm | pnmscale -width 48 -height 48 | ppmquant 7 | pnmtopng > face.png

Единственный параметр, который здесь можно менять, — это количество цветов, до которого ограничивается палитра выходного изображения (параметр для команды ppmquant). И то, в большинстве случаев менять его можно только в меньшую сторону, что отнюдь не способствует повышению эстетической ценности результата. Есть, правда, более гибкая команда — pnmquant, которой кроме количества уровней квантования можно также задавать алгоритмы, по которым будет производиться уменьшение цветов и предварительная фильтация. Тем не менее, результат оставляет желать лучшего:


Результат работы утилит из пакета netpbm

Если хотите побаловаться с этими утилитами самостоятельно, их можно найти в пакетах netpbm и libjpeg-progs.

Продвинутый способ

Для его использования нам понадобится откровенно тяжёлый (во всех смыслах) пакет ImageMagick. Однако, и качество результата будет значительно выше. Сразу же замечу, что чем меньше в исходном изображении мелких деталей и различимых цветов, чем больше крупных областей, залитых одним цветом, и чем ближе его размер к нужному нам 48×48 точек, тем меньше будет размер полученной картинки в байтах и тем больше у неё будет сходства с оригиналом.

Однако, ближе к делу! Вот пример командной строки, которая из картинки 225×269 (19Кб) делает картинку объёмом всего 722 байта (обратите внимание, что передпараметрами стоит одиночный знак «–», а не двойной «– –»):

convert face_big.jpg -filter gaussian -define filter:blur=0.75 -resize 48x48 -gravity center -extent 48x48 -unsharp 0x1 -normalize -quantize RGB +dither -colors 32 -posterize 6 -strip face.png

Если, как было указано выше, большого количества мелких деталей нет (или линейный размер исходного изображения не более, чем в 3-4 раза превышает целевой), то параметры -filter gaussian -define filter:blur=0.75 можно опустить. Они используются в качестве ВЧ-фильтра для исключения «шумовой» информации, которая будет практически неразличима в маленьком формате, но приведёт к увеличению объёма файла.

Параметр -resize 48x48 используется для изменения размера, а -gravity center -extent 48x48для центрирования изображения внутри квадрата 48×48. То есть, если картинка изначально квадратная, её можно не центрировать.

Команды -unsharp 0x1 -normalize позволяют несколько увеличить резкость после уменьшения размера и повысить контрастность и насыщенность за счёт нормализации цветов (это процесс растягивания гистограммы изображения с переводом 2% самых тёмных точек в чёрный цвет и 1% самых светлых — в белый).

Далее пойдёт некоторое количество магии, которая, собственно, и позволяет выкинуть бóльшую часть избыточности. Параметр -quantize RGB задаёт цветовое пространство для дальнейших преобразования палитры. Параметр +dither отключает (как это ни покажется странным со значком «+») дизеринг (процесс, который вносит искусственно сформированный шум, скрывая резкие переходы цветов и существенно увеличивая при этом размер файла). Параметр -colors 32 ограничивает палитру изображения 32 цветами (5 бит на пиксель). В данном случае 32 цвета — это отнюдь не догма, а отправная точка. Если объём результирующего файла оказался меньше 650 байт, можно попробовать повысить качество, ограничив палитру не 32, а 64 цветами (6 бит на пиксель). Если же по какой-то причине размер превысил жёсткое ограничение в 725 байт, количество цветов придётся уменьшить. Наконец, параметр -posterize 6 используется для дополнительного уменьшения количества цветов и увеличения площадей, залитых одним цветом, что способствует лучшему сжатию. Заметьте, что если поменять местами параметры -posterize и -colors, выигрыш в объёме будет не столь заметен. Это объясняется тем, что такая последовательность сначала пытается покрыть рисунок сеткой изолиний для выявления областей примерно одинакового цвета, а потом уменьшает количество цветов. Это приводит к тому, что найденные смежные области после сокращения палитры в общем случае не будут иметь один и тот же цвет, что приведёт к худшему сжатию. Но если сначала уменьшить количество цветов, а затем выявлять области с похожими цветами, эта стратегия даст значительный прирост количества связных областей, залитых одним и тем же цветом.

Из вышеизложенного следует логичный вопрос: если мы уменьшили количество цветов постеризацией, почему бы дополнительно не снизить количество бит на пиксель до 4 (использовать 16-цветную палитру)? Давайте проверим:

convert face_big.jpg -filter gaussian -define filter:blur=0.75 -resize 48x48 -gravity center -extent 48x48 -unsharp 0x1 -normalize -quantize RGB +dither -colors 32 -posterize 6 -colors 16 -strip face.png


Пример файла, полученного на выходе утилиты convert из пакета ImageMagick

Получили файл объёмом 683 байта (против 722 с 32 цветами). Весьма неплохо. Если хочется попытаться чуть-чуть улучшить качество, можно постеризовать изображение не до 6, а до 7 или 8 оттенков. Однако, это не всегда приводит к заметному улучшению, зато практически всегда увеличивает размер файла. Если же размер всё ещё больше 725 байт, можно попробовать использовать -posterize 5 (4 и ниже не рекомендую, поскольку это приведёт к серьёзным искажениям). Если и это не помогло, вероятно, следует выбрать другую картинку.

Да, кстати… Чуть не забыл! Параметр -strip не стóит недооценивать, даже несмотря на то, что он идёт последним. Он выполняет весьма важную в данном контексте функцию: убирает мета-информацию из файла. А это как минимум дата создания и модификации, которые занимают ещё пару-тройку десятков драгоценных байтов.

Использование

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

  • Claws Mail отображает эти заголовки самостоятельно, без помощи плагинов.
  • Gnus, естественно, показывает (X-)Face, поскольку автор программы решил «доработать» старый формат поля именно для этого софта.
  • Thunderbird может показывать их с помощью плагинов; к данному моменту, вероятно, в живых остались только Mnenhy и Display Contact Photo.
  • KMail тоже умеет (вероятно, достаточно давно).
  • Balsa не афиширует эту возможность, хотя Ларс Ингебригтсен считает, что там вроде бы всё в порядке.
  • The Bat! считает, что это поле не является стандартным и, кроме того, проще прикрепить фотографию к контакту в адресной книге; соответственно, изображение не показывает (хотя был плагин для X-Face).

Если отображение заголовков обычно не является проблемой, то вставить заголовок в письмо не всегда является тривиальной задачей. Хорошо, если почтовый клиент позволяет хотя бы просто добавлять свои строки в дополнительные поля. Тогда можно пропустить полученный png-файл через утилиту base64 и вставить получившийся мусор закодированный файл в поле ввода, предоставленное клиентом. Но есть и такие, которые позволяют сгенерировать (X-)Face для каждого аккаунта автоматически. В качестве примера рассмотрим процедуру добавления поля Face в двух почтовых клиентах.

Claws Mail

Здесь всё просто. Всего-то нужно

  1. в главном меню программы выбрать пункт «Настройки…»,
  2. далее выбрать «Редактировать учётные записи…»,
  3. в появившемся окне выбрать нужную учётку (если их несколько, естественно, при необходимости придётся повторить процедуру для каждой),
  4. \item нажать на кнопку «Изменить»,
  5. в появившемся окне в списке слева выбрать пункт «Отправить»,
  6. установить чекбокс «Добавить заданный заголовок» и нажать на кнопку «Изменить»,
  7. в открывшемся окне в поле «Заголовок» выбрать «Face»,
  8. для заполнения поля «Значение» нажать кнопку «Просмотр» и выбрать подготовленный по вышеописанной процедуре png-файл,
  9. если не было ругани, нажать кнопку «Добавить»,
  10. закрыть все открытые окна настроек кнопкой «OK» (или «Закрыть»).

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

Thunderbird

Сначала хотелось бы сказать большое спасибо alexandrorodrigez’у (OmskLUG) за то, что он нашёл время и энергию для определения работающего способа вставки и отображения заголовка (X-)Face для Thunderbird.

Итак, что нужно делать:

  1. зайти в Config Editor (Tools → Options → Advanced → General → Config Editor);
  2. добавить поля mail.identity.idN.headers (где N — номер почтового ящика) со значением «X-Face, Face» (без кавычек, естественно); безусловно, если это поле уже существует, то «X-Face, Face» нужно добавить через запятую к существующему списку значений};
  3. создать поле mail.identity.idN.header.X-Face и в качестве значения скопировать в него строку вашего 1-битного изображения, или
  4. создать поле mail.identity.idN.header.Face и в качестве значения скопировать в него base64-encoded строку вашего цветного изображения;
  5. закрыть Config Editor

Для проверки посылаем письмо с того аккаунта, который мы только что модифицировали. Если никаких специальных плагинов не подключено, в полученном письме увидим в числе прочих заполненное нами поле (X-)Face. Если же стоит, например, указанный выше плагин Display Contact Photo, рядом с обычными заголовками появится картинка. Примерно вот так:


Пример отбражения поля Face в почтовом клиенте Thunderbird

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


Спасибо за внимание!

Как обычно, полный текст этой статьи можно совершенно свободно скачать отсюда в формате PDF.

]]>
http://omsklug.com/2013/09/face-email-header-creation-and-usage/feed/ 0
Веб-регистрация пользователей ejabberd http://omsklug.com/2013/09/jabber-registration-interface/ http://omsklug.com/2013/09/jabber-registration-interface/#comments Thu, 12 Sep 2013 20:10:39 +0000 Plus http://omsklug.com/?p=1535

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

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

В качестве примера у нас это… Форма knopka.php:

<!DOCTYPE html>
<html>
<meta charset=”utf-8″/>
<head>
<script type=”text/javascript” src=”http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js”></script>
<script type=”text/javascript” src=”js/bootstrap.js”></script>
<link rel=”stylesheet” type=”text/css” href=”css/bootstrap.css”>
<link rel=”stylesheet” href=”css/reset.css”>
<link rel=”stylesheet” href=”css/animate.css”>
<link rel=”stylesheet” href=”css/styles.css”>
<title>Регистрация Jabber</title>

</head>
<body>
<button type=”button” onclick=”openModal();”>Регистрация Jabber</button>
<!– Modal –>
<div id=”myModal” tabindex=”-1″ role=”dialog” aria-labelledby=”myModalLabel” aria-hidden=”true”>
<div id=”container”>
<form action=”user.php” method=”post”>

<label for=”name”>Имя учетной записи:</label>
<p>
<input name=”login” type=”name” size=”15″ maxlength=”15″>
</p>
<label for=”username”>Пароль:</label>
<p><a href=”#”>Запишите пароль!</a>

<input name=”password” type=”password” size=”15″ maxlength=”15″>

<div id=”lower”>

<input type=”checkbox”><label for=”checkbox”>Я принимаю условия регистрации.</label>

<input type=”submit” name=”submit” value=”Регистрация”>
</div>
</form>
</div>
</div>

<!–div>
</div–>

<script type=”text/javascript”>
function openModal(){
$(‘#myModal’).modal(‘show’);
}
</script>
</body>
</html>

Думаю тут все понятно и не требует дополнительных пояснений.

след файл mysql.php с параметрами подключения к базе:

<?php
$db = mysql_connect (“localhost”,”root”,”1″);
if($db)
mysql_select_db (“test”,$db);
else
{
echo “ошибка подключения к БД”;
}
?>

И третий файл user.php, который отвечает за помещение данных в базу.

<?php
if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == ”) { unset($login);} } //заносим введенный пользователем логин в переменную $login, если он пустой, то уничтожаем переменную
if (isset($_POST['password'])) { $password=$_POST['password']; if ($password ==”) { unset($password);} }
//заносим введенный пользователем пароль в переменную $password, если он пустой, то уничтожаем переменную
if (empty($login) or empty($password)) //если пользователь не ввел логин или пароль, то выдаем ошибку и останавливаем скрипт
{
exit (“Вы ввели не всю информацию, вернитесь назад и заполните все поля!”);
}
//если логин и пароль введены, то обрабатываем их, чтобы теги и скрипты не работали, мало ли что люди могут ввести
$login = stripslashes($login);
$login = htmlspecialchars($login);
$password = stripslashes($password);
$password = htmlspecialchars($password);
//удаляем лишние пробелы
$login = trim($login);
$password = trim($password);
// подключаемся к базе
include (“mysql.php”);// файл mysql.php должен быть в той же папке, что и все остальные, если это не так, то просто измените путь 
// проверка на существование пользователя с таким же логином
$result = mysql_query(“SELECT id FROM users WHERE username=’$login’”,$db);
$myrow = mysql_fetch_array($result);
if (!empty($myrow['id'])) {
exit (“Извините, введённый вами логин уже зарегистрирован. Введите другой логин.”);
}
// если такого нет, то сохраняем данные
$result2 = mysql_query (“INSERT INTO users (login,password) VALUES(‘$login’,'$password’)”);
// Проверяем, есть ли ошибки
if ($result2==’TRUE’)
{
echo “Вы успешно зарегистрированы! Теперь вы можете зайти под своим JID. “;
header(“Location: http://localhost”);
}
else {
echo “Ошибка! Вы не зарегистрированы.”;
}
?>

Ну и конечно же нужно помнить что базу и таблицу выбираем именно как таблицу пользователей в базе mysql ejabberd, “user”.

В качестве оформления можете воспользоваться css framework или накидать дизайн самостоятельно.

css.tar - в архиве файлы с формой и оформлением.

]]>
http://omsklug.com/2013/09/jabber-registration-interface/feed/ 0
Software Freedom Day 2013 в Омске http://omsklug.com/2013/09/sfd2013announce/ http://omsklug.com/2013/09/sfd2013announce/#comments Thu, 12 Sep 2013 19:58:39 +0000 linuxmasterz http://omsklug.com/?p=1540 Software Freedom Day LogoВРЕМЯ, МЕСТО

2013-09-21 в 14.00 ч. в 101 аудитории первого корпуса Омского государственного университета им. Ф.М. Достоевского (г. Омск, пр. Мира, д. 55А) пройдёт международный День свободы программного обеспечения (Software Freedom Day). Если не сможете прийти, будет трансляция в Интернет всего действа вот тут http://www.omsklug.com/tv. Проходить всё будет где-то здесь:

карта подходов к первому корпусу ОмГУ © Участники OpenStreetMap

РЕГИСТРАЦИЯ

Просьба, в случае участия, зарегистрироваться вот здесь:

http://bit.ly/SFD2013Omsk

Мы просто хотим знать, сколько вас будет.

ДОКЛАДЫ

Планируются доклады на следующие темы:

  • Итоги свободного программного обеспечения в 2013 (Алексей Тараканов)
  • Безопасный Интернет
  • История успеха: от MySQL к MariaDB (Станислав Емец)
  • CMS Drupal от HTML до социальных сетей (Иван Абраменко)
  • Проект “Мандолина” (Максим Приходай)

ПЕРЕРЫВЫ И ПОСЛЕ…

А честно говоря, это ещё и обычный Linux Install Fest, когда можно установить и получить безвозмездно понравившийся дистрибутив свободного программного обеспечения с помощью активистов OmskLUG (омских линуксоидов), не только GNU/Linux, но и иное свободное ПО, проконсультироваться по тому или иному вопросу о свободном программном обеспечении. Планируется криптовечеринка, поэтому готовьте свои PGP-ключи.

ПОМОЩЬ

Помогите в распространении информации о мероприятии, отправьте ссылку на этот анонс своим знакомым через ваши любимые социальные сети, микроблоги и прочие вебдваноли. Распечатайте это объявление: http://bit.ly/sfd2013omskannounce и поместите на достаточно видное место у себя в грустном офисе, в модном подъезде, на лобовом стекле вашего автомобиля. Мы были бы рады вашему рвению к продвижению свободного программного обеспечения.

ССЫЛКИ

http://bit.ly/sfd2013omskannounce - ссылка на объявление о мероприятии

http://bit.ly/sfd2013omskannouncev – ссылка на объявление о мероприятии (вертикальное)

http://bit.ly/SFD2013Omsk – ссылка на форму регистрации на мероприятие

Хештег для twitter: #sfd2013omsk

До встречи на SFD 2013!

]]>
http://omsklug.com/2013/09/sfd2013announce/feed/ 1
Омские линуксоиды участвуют в Омском городском пикнике http://omsklug.com/2013/06/linux-at-omsk-local-picnic/ http://omsklug.com/2013/06/linux-at-omsk-local-picnic/#comments Mon, 24 Jun 2013 09:42:22 +0000 linuxmasterz http://omsklug.com/?p=1510 Ссылка на сайт Омского городского пикникаОмский городской пикник — это первый городской праздник организованный горожанами, без администраций, организаций и корпораций, который включает в себя: живой концерт лучших омских групп, десятки выставок и перфомансов, игры, лекции и кино под открытым небом.

И все это омичи делают сами для себя. Разумеется, мимо этого мероприятия мы, омские линуксоиды, просто так пройти не смогли. Поэтому приглашаем всех на нашу замечательную площадку на Омском городском пикнике!

Дата проведения: 2013-07-06

Место проведения: г. Омск, ул. Берёзовая, д. 4 (не в самом доме разумеется, рядом)

Мы, наверно, не единственные, кто принесёт компьютеры на природу, но у нас это основная тема.

Что же интересного у нас будет:

  1. Трансляция, раздача свободной музыки (jamendo.com и др.)
  2. Доступ к свободным компьютерным играм (пока на выбор Supertuxkart, SuperTux, XMoto, lbreakout2)
  3. Трансляция свободного видео (Elephant Dream, Big Buck Bunny, Sintel, Tears of Steel и др.)
  4. Трансляция визуальных эффектов с использованием вебкамеры и с вашим непосредственным участием (effectv, ascii art)
  5. Безвозмездная раздача свободного программного обеспечения, музыки, видео
  6. Консультации, как использовать свободное программное обеспечение, как правильно лицензировать свободные произведения
  7. Криптовечеринка (PGP)

Огранизаторы Омского городского пикника просят пожертвовать совсем немного денег тут: http://start.planeta.ru/campaigns/990 За пожертвования дают всяческие сувениры и подарки, некоторые очень необычны, смотрите список.

]]>
http://omsklug.com/2013/06/linux-at-omsk-local-picnic/feed/ 2
В автобусах Омска используется Linux-дистрибутив Fedora http://omsklug.com/2013/06/linux-fedora-in-the-bus/ http://omsklug.com/2013/06/linux-fedora-in-the-bus/#comments Thu, 20 Jun 2013 13:01:00 +0000 linuxmasterz http://omsklug.com/?p=1500 Омские линуксоиды сообщают, что в информационно-развлекательной системе, используемой в автобусах города Омска, установлен Linux-дистрибутив Fedora, разрабатываемый программистами Red Hat. Графическое окружение этой версии транспортного дистрибутива построено на базе XFCE.
Fedora in Omsk bus

]]>
http://omsklug.com/2013/06/linux-fedora-in-the-bus/feed/ 3
Потоковое вещание с минимальными затратами http://omsklug.com/2013/05/potokovoe-veshhanie-s-minimalnymi-zatratami/ http://omsklug.com/2013/05/potokovoe-veshhanie-s-minimalnymi-zatratami/#comments Thu, 23 May 2013 06:53:53 +0000 Plus http://omsklug.com/?p=1479 Добрый день. Сегодня разберемся как пустить потоковое аудио по сетям с минимальными затратами.

Я использовал: Ubuntu Server, пакет mpd, Sonata – приложение для управления плеером, ну и любой проигрыватель.

Итак имеем комп уже с установленной системой и настроеным ssh доступом. Это виртуальная машина, с диском всего в 5 Gb. Есть папка с музыкой в сети, вот с нее и будем крутить музыку, для этого монтируем каталог:

mount.cifs //10.10.0.1/public /mnt/music

Далее ставим пакет mpd:
sudo apt-get install mpd
и правим его конфиг /etc/mpd.conf
настройка сложные, они есть тут.
В рамках статьи привожу только наиболее важные:

Координаты до папки с музыкой # Files and directories ##################### music_directory "/home/имя_пользователя/Музыка" 

Имя пользователя от которого работает демон # General music daemon options ######################### user "имя_пользователя"
Настройка доступа к управлению плеером
# For network bind_to_address "any" port "6600"
Обновление плейлиста auto_update "yes"

Доступ к функциям демона по умолчанию:
# Permissions ############################# default_permissions "read,add,control,admin" # #####################################

настройка сервера вещания

audio_output {         type            "httpd"         name            "Radio Name"         encoder         "vorbis"                # optional, vorbis or lame        port            "8000"         quality         "5.0"                   # do not define if bitrate is defined #bitrate         "128"                   # do not define if quality is defined        format          "44100:16:1" }

Тип эмулятора громкости
# Volume control mixer ######################## mixer_type "software" ############################################# 

После этого можно будет посмотреть браузером http://ваш_Ip:8000 на плеер.
Для того чтобы начать трансляцию,нужно ее запустить, составив плейлист.
Можно воспользоваться консольным плеером mpc, установить Sonata или
воспользоваться аналогичным интерфейсом управления.
В настройках подключения указать параметры и добавить вашу медиатеку в плейлист.
Пакет устанавливается просто: sudo apt-get install sonata.  Добавление треков в плейлист:
Ну первым делом проверяем их доступность в нужной папке.
Далее на сервере выполняем: mpc update
 Далее открываем приложение Sonata

Во вкладке Library (фонотека) будет список всех дорожек, выделяем необходимые.
Правым кликом вызываем контекстное меню, выбераем добавить.
]]>
http://omsklug.com/2013/05/potokovoe-veshhanie-s-minimalnymi-zatratami/feed/ 0