Ubuntu: детальная настройка пакетов используя утилиты дебиана

Все настройки, при установки пакетов в Debian (а следственно и в Ubuntu) делаются через утилиту debconf, у которой тоже есть настройки. О ней и будет данная заметка.

Чтобы добраться до настроек debconf - выполните в вашем терминале команду:

sudo dpkg-reconfigure debconf

screenshot_0032

Очень важно выбрать метод вывода диалоговых окон на экран пользователя. Рекомендуемый - “Диалоговый”. В этом режиме программа будет использовать интерфейс, показанный на скриншоте выше. Рекомендуемый он, потому что не зависит ни от одной графической среды и поэтому является самым надёжным режимом из всех перечисленных.

screenshot_0041

Дальше нужно выбрать “уровень важности” задаваемых вопросов. Нас интересует “низкий”. В этом режиме будут задаваться все возможные вопросы.

После этих манипуляций, можете выполнить:

sudo dpkg-reconfigure -a

Это перенастроит ВСЕ пакеты в вашей системе, но на этот раз, у вас будет больше вариантов и возможностей ;)

P.S.
В принципе, всё описанное, должно работать в Debian и любой ОС, на её базе.

PHP: Построение древовидных данных в PHP

Недавно, возникла потребность сделать древовидный, порядковый список категорий, в одном из проектов.

2 главных условий, которые преследовал: 1) в html должны наглядно показываться родительские элементы и их “дети”; 2) для всей операции 1 SQL запрос.

SQL-структура была такая:

+------------+--------------+------+-----+---------+----------------+
| FIELD          | Type             | NULL   | KEY | DEFAULT   | Extra 
+------------+--------------+------+-----+---------+----------------+
| categoryID | int(3)            | NO    | PRI   | NULL     | AUTO_INCREMENT  |
| parent       | int(3)            | NO    |        | 0          |                        |
| name        | varchar(255)   | NO    |        | NULL     |                        |
| slug          | varchar(255)   | NO    |        | NULL     |                        |
| pic           | varchar(255)   | YES   |        | NULL     |                        |
+------------+--------------+------+-----+---------+----------------+
5 rows IN SET (0.03 sec)

После запроса в БД массив получился такой.

Array
(
    [0] => Array
        (
            [categoryID] => 1
            [parent] => 0
            [name] => Фильмы
            [slug] => films
            [pic] => 
        )
 
    [1] => Array
        (
            [categoryID] => 2
            [parent] => 0
            [name] => Музыка
            [slug] => music
            [pic] => 
        )
[...]
)

Для удобной работы я сгруппировал массив по categoryID, заменив его ключи на этот идентификатор.

foreach ($data as $v)
$array[$v['categoryID']] = $v;

А вот и сама функция, которая пишет в глобальный массив $g_data результат своей рекурсивной работы.

function tree(&$data, $node_id, $lvl = 0)
{
   switch ($lvl)
   {
      // для каждой категории может быть действие (напр. присвоить id)
	case 0:
	$html = '<option style="font-weight:bolder;" disabled>- КОРЕНЬ -</strong>'."\n";
	break;
	default:
        // str_repeat делает отступ слева, в зависимости от уровня кат-ии. Это наглядно показывает юзеру родителя категории и его дочерний элемент. А если кат-я самая "верхняя", она выделяется стилем font-weight:bold
	$html = '<option '.($data[$node_id]['parent']==0?'style="font-weight:bold;':'').' value="'.$data[$node_id]['categoryID'].'">'.str_repeat('&nbsp;&nbsp;&nbsp;', $lvl) . $data[$node_id]['name'].'</option>'."\n";
    }
  $this->g_data['tree'] .= $html;
 
   // рекурсия
   foreach ($data as $row)
      if ($row['parent'] == $node_id)
         $this->tree($data, $row['categoryID'], $lvl + 1);
}

Остаётся только запустить процесс.

tree($array, 0);

1С: PHP<->XML

Предположим, есть задание выгружать данные из 1С и использовать их в своих WEB-проектах (интернет-магазин с реальным ассортиментом и балансом).

Очень удобно, в этом случае получить от 1С данные в XML, файле, а потом распарсить их и разнести по SQL таблицам.

У нас получилась вот такая вот выгрузка:

<Vitrina Элементов="10">
<Элемент ID="8362217666" ParentID="83014" Товар="100 человек, которые изменили ход истории" Номер="95/2009" Фото="" Витрина="1"/>
<Элемент ID="8362211581" ParentID="6636" Товар="Mens Health mini" Номер="12/2009" Фото="Y:\Company\Общие файлы 1с\Фото\8362211581.jpg" Витрина="2"/>
<Элемент ID="8362201090" ParentID="938" Товар="Newsweek" Номер="47/2009" Фото="" Витрина="3"/>
<Элемент ID="92000054" ParentID="920" Товар="Rolling Stone" Номер="11/2009" Фото="Y:\Company\Общие файлы 1с\Фото\92000054.jpg" Витрина="4"/>
<Элемент ID="8285200104" ParentID="82852" Товар="StarHit" Номер="46/2009" Фото="Y:\Company\Общие файлы 1с\Фото\8285200104.bmp" Витрина="5"/>
<Элемент ID="648900054" ParentID="6489" Товар="Total DVD" Номер="11/2009" Фото="Y:\Company\Общие файлы 1с\Фото\648900054.bmp" Витрина="6"/>
<Элемент ID="687800218" ParentID="6878" Товар="Антенна-Телесемь" Номер="48/2009" Фото="" Витрина="7"/>
<Элемент ID="8362219837" ParentID="83587" Товар="Веселый художник" Номер="23/2009 - 2360" Фото="" Витрина="8"/>
<Элемент ID="8362203118" ParentID="82838" Товар="Empire" Номер="11/2009" Фото="Y:\Company\Общие файлы 1с\Фото\8362203118.jpg" Витрина="9"/>
<Элемент ID="682300047" ParentID="6823" Товар="In Style" Номер="12/2009" Фото="Y:\Company\Общие файлы 1с\Фото\682300047.jpg" Витрина="10"/>
</Vitrina>

Если вы думаете, что работа с  XML в PHP нудна и не целесообразна, спешу разочаровать ;) Весь парсинг сводится к элементарной конструкции:

#загрузим XML файл
$xml = simplexml_load_file('XML/Выгрузка/'.$files[3]);
#данные получаются в виде объектов, представляющие собой массивы
$val = $xml->Элемент[0]['Номер'];
#на экран!
echo $val;

Просто, не правда ли? ;)

Кстати, print_r($xml) выглядит примерно так:

SimpleXMLElement Object ( [@attributes] => Array ( [Элементов] => 10 ) [Элемент] => Array ( [0] => SimpleXMLElement Object ( [@attributes] => Array ( [ID] => 8362217666 [ParentID] => 83014 [Товар] => 100 человек, которые изменили ход истории [Номер] => 95/2009 [Фото] => [Витрина] => 1 ) ) [1] => SimpleXMLElement Object ( [@attributes] => Array ( [ID] => 8362211581 [ParentID] => 6636 [Товар] => Mens Health mini [Номер] => 12/2009 [Фото] => Y:\Company\Общие файлы 1с\Фото\8362211581.jpg [Витрина] => 2 ) ) [2] => SimpleXMLElement Object ( [@attributes] => Array ( [ID] => 8362201090 [ParentID] => 938 [Товар] => Newsweek [Номер] => 47/2009 [Фото] => [Витрина] => 3 ) ) [3] => SimpleXMLElement Object ( [@attributes] => Array ( [ID] => 92000054 [ParentID] => 920 [Товар] => Rolling Stone [Номер] => 11/2009 [Фото] => Y:\Company\Общие файлы 1с\Фото\92000054.jpg [Витрина] => 4 ) ) [4] => SimpleXMLElement Object ( [@attributes] => Array ( [ID] => 8285200104 [ParentID] => 82852 [Товар] => StarHit [Номер] => 46/2009 [Фото] => Y:\Company\Общие файлы 1с\Фото\8285200104.bmp [Витрина] => 5 ) ) [5] => SimpleXMLElement Object ( [@attributes] => Array ( [ID] => 648900054 [ParentID] => 6489 [Товар] => Total DVD [Номер] => 11/2009 [Фото] => Y:\Company\Общие файлы 1с\Фото\648900054.bmp [Витрина] => 6 ) ) [6] => SimpleXMLElement Object ( [@attributes] => Array ( [ID] => 687800218 [ParentID] => 6878 [Товар] => Антенна-Телесемь [Номер] => 48/2009 [Фото] => [Витрина] => 7 ) ) [7] => SimpleXMLElement Object ( [@attributes] => Array ( [ID] => 8362219837 [ParentID] => 83587 [Товар] => Веселый художник [Номер] => 23/2009 - 2360 [Фото] => [Витрина] => 8 ) ) [8] => SimpleXMLElement Object ( [@attributes] => Array ( [ID] => 8362203118 [ParentID] => 82838 [Товар] => Empire [Номер] => 11/2009 [Фото] => Y:\Company\Общие файлы 1с\Фото\8362203118.jpg [Витрина] => 9 ) ) [9] => SimpleXMLElement Object ( [@attributes] => Array ( [ID] => 682300047 [ParentID] => 6823 [Товар] => In Style [Номер] => 12/2009 [Фото] => Y:\Company\Общие файлы 1с\Фото\682300047.jpg [Витрина] => 10 ) ) ) )

Что на само по себе, на деле довольно удобно.

Чтобы примонтировать сетевую шару с 1С-выгрузками, лучше всего использовать autofs.

site sb0y # emerge -av autofs
 
These are the packages that would be merged, in order:
 
Calculating dependencies... done!
[ebuild   R   ] net-fs/autofs-5.0.3-r6  USE="-ldap -sasl" 0 kB
 
Total: 1 package (1 reinstall), Size of downloads: 0 kB
 
Would you like to merge these packages? [Yes/No]

Она корректно примонтирует шару, отключится, если она (шара) вдруг исчезнет из сети или долго не будет использоваться, подключиться назад, если шара появится или понадобится какому-то процессу (например нашему парсеру).

Создадим новую область работы autofs:

echo '/mnt/net /etc/auto.auto  --ghost' >> /etc/auto.master

Настроим эту область

cat /etc/auto.auto 
 
smb -fstype=smbfs,credentials=/etc/smb.auth,iocharset=utf8	 ://server/share

Где credentials указывает на файл, в котором содержатся данные для авторизации:

cat /etc/smb.auth
 
username=login
password=secretPassword

Ну и в завершение - симлинк, в WWW-ROOT сервера, указывающий на папку с выгрузкой.

cd /var/www/magazine/htdocs/
 
ln -s /mnt/net/smb/Общие\ файлы\ 1с/Интернет_магазин/ XML

Теперь XML-файлы доступны по адресу http://ваш-сайт/XML/file.xml. Лучше конечно ограничить к ним доступ, используя .htaccess.

Музыкальный будильник

Решил сделать так, чтобы каждое утро меня будила моя Ubuntu Linux.

В биусе была включена функция Alarm, и был написан такой скриптик:

#!/bin/sh
 
#получаем время, конкретнее часы без минут и секунд
time=`date \+\%H`
 
#выставляем громкость и включаем каналы на звуковых картах
amixer sset Master 90%
amixer -c 1 sset PCM 100% unmute
amixer -c 1 sset Mic 100%
 
# Если полученное время ровняется числу 8, говорим mpd начать играть.
# Делается, чтобы музыка начинала играть в 8 часов, а не каждый запуск.
if [ "$time" -eq "8" ] ; then mpc play ; fi
 
exit

Скрипт можно вызвать из /etc/rc.local, но он выполняется от имени root’а, поэтому, делать это лучше вот так:

su -c '/usr/bin/wakeup' sb0y

где sb0y - имя пользователя, от имени, которого будет запускаться скрипт.

Pidgin: Смайлы из QIP

screenshot_0031

Смайлы для Pidgin из QIP. Ранее лежало на ЛиРу, а файл хостился на nm.ru.

По неизвестным причинам файл был удалён да ещё и ошибку 404 выдаёт поиск search.qip.ru :) Ильхам негодует :)

Поэтому, я вынужден захостить файл на своём сервере.

Инструкция по применению.

Всё очень просто. Нажимайте: Инструменты -> Настройки -> Темы Смайликов. Потом, “Добавить” и выбирайте файл, который скачаете ниже.

Если по каким-то причинам установить смайлы не получилось, существует альтернативный способ. В Linux распакуйте содержимое архива в папку ~/.purple/smileys/QIP-pidgin. В Windows <папка с программой Pidgin>\pixmaps\pidgin\emotes.

Change log:

1 - first release
2 - a small bug fixing
//change for 10.7.2009
3 - update regular.png on real QIP smile
4 - add protect symbols
5 - add new smiles symbols - “:[”, “:O”, “=O”, “:!”
6 - add smile “*WALL*”
7 - added a lot of new smile from Puzan pack

Pidgin Smiles from QIP

Jabber: полезное

Существуют два очень полезных XMPP бота от гугла. Они занимаются переводом. Достаточно добавить их к себе в ростер и написать слово и тут же получите ответ с его переводом.

Русско-английский словарь:

ru2en@bot.talk.google.com

Англо-русский словарь:

en2ru@bot.talk.google.com

Ubuntu Server: USB ключ 1С для сервера предприятия

Исходя из информации:

Драйвер ключей защиты HASP для GNU/Linux состоит из нескольких взаимодействующих компонент:

aksparlnx (версия 1.6) — модуль ядра, обеспечивающий низкоуровневый доступ к LPT-ключу;
askusbd (версия 1.8.1) — универсальный драйвер для USB- и LPT-ключей (системная служба);
winehasp (версия 1.00) — часть драйвера, предоставляющая доступ к ключу HASP win-приложениям, исполняющимся в среде WINE (системная служба);
hasplm (версия 8.30) — сетевой менеджер лицензий (системная служба).

Качаем архив: ftp://ftp.aladdin.com/pub/hasp/srm/Linux/HASP_SRM_LINUX_3.50_Run-time_Installer_script.tar.gz
Потом:

mkdir /usr/share/hasp
mv HASP_SRM_LINUX_3.50_Run-time_Installer_script.tar.gz /usr/share/hasp
cd /usr/share/hasp
tar xvpf HASP_SRM_LINUX_3.50_Run-time_Installer_script.tar.gz
cd HASP_SRM_LINUX_3.50_Run-time_Installer_script
./dinst

После нужно добавить в /etc/fstab строчку:

none /proc/bus/usb usbfs defaults 0 0

Не забываем сделать mount -a, чтобы всё подхватилось.

Чтобы проверить готовность демона, можно зайти через браузер links на порт 1947:

links http://localhost:1947

Если нужно управлять демоном с другой машины, удалённо - в каталоге /etc/hasplm создайте файл hasplm.ini и в нём напишете:

[SERVER]
ACCremote = 1

Ну и потом:
/etc/init.d/aksusbd restart

Ubuntu: Сглаживание шрифтов с хинтингом на системном уровне

В Linux сейчас много способов добиться гладких, не размытых шрифтов, не прибегая к запатентованным технологиям.

К счастью, уже не нужно пересобирать freetype. Но мы так же знаем, что графических сред очень много и уже не редки те случаи, когда на одном PC, используется несколько сред. При этом, так же, не стоит забывать что каждая среда со шрифтами работает по-разному.

Поэтому, я предлагаю настроить сглаживание шрифтов в Ubuntu на системного уровне. Вот так выглядит шрифт Liberations у меня:

screenshot_002 screenshot_0011

Чтобы добиться того же у себя, в файле /etc/fonts/local.conf пишем:

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
  <match target="font">
    <edit name="autohint" mode="assign">
      <bool>true</bool>
    </edit>
  </match>
</fontconfig>

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

Apache2: кодировка сайтов по-умолчанию

Если нужно быстро задать кодировку статики для Apache2, например в Gentoo, cделать это можно в файле /etc/apache2/httpd.conf,  добавив 2 строчки:

IndexOptions Charset=UTF-8
AddDefaultCharset UTF-8

Вырезать звуковую дорожку из flash ролика или видео файла

Если нужно вырезать звук в Linux из видео ролика или вообще из flash ролика, это можно сделать при помощи ffmpeg.

ffmpeg -i video.flv -acodec copy 123.mp3

Или при помощи gstreamer (спасибо Sveolon):

gst-launch filesrc location=test.flv ! flvdemux name=demux demux.audio ! filesink location=test.mp3