The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

СОВЕТЫ (Краткие заметки, Tips) (базовая разбивка)

   Пользователю
Работа с электронной почтой:
CD, CD-R, DVD, AudioCD
Wine
X Window
Запись и обработка звука
Карманные ПК
Мгновенный обмен сообщениями (Jabber, ICQ)
Мобильные телефоны
Обработка изображений и видео
Особенности работы с CPU от AMD
Печать
Работа в консоли
Работа с Web и Ftp
Редактирование текстов
Русификация
Файлы, копирование, архивация

----* Формирование минималистичного окружения GNOME, очищенного от излишеств (доп. ссылка 1)   [комментарии]
 
Инструкция по чистке штатного окружения GNOME и вырезания всего лишнего.

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

   dconf write '/org/gnome/desktop/input-sources/xkb-options'  "['grp:caps_toggle']"
   dconf write '/org/gnome/desktop/interface/clock-show-date'  'true'
   dconf write '/org/gnome/desktop/interface/cursor-blink' 'false'
   dconf write '/org/gnome/desktop/interface/gtk-theme'  "'Adwaita- dark'"
   dconf write '/org/gnome/desktop/privacy/old-files-age' 'uint32 7'}
   dconf write '/org/gnome/desktop/privacy/remove-old-trash-files' 'true'
   dconf write '/org/gnome/desktop/privacy/report-technical-problems'     'false'
   dconf write '/org/gnome/desktop/search-providers/disable-external'  'true'
   dconf write '/org/gnome/desktop/wm/preferences/audible-bell' 'false'
   dconf write '/org/gnome/desktop/wm/preferences/focus-mode' "'sloppy'"
   dconf write '/org/gnome/settings-daemon/plugins/color/night-light-enabled'  'true'
   dconf write '/org/gnome/settings-daemon/plugins/xsettings/antialiasing' "'rgba'"
   dconf write '/org/gnome/shell/disable-user-extensions'  'true'
   dconf write '/org/gnome/software/allow-updates' 'false'
   dconf write '/org/gnome/software/download-updates' 'false'
   dconf write '/org/gnome/terminal/legacy/default-show-menubar'  'false'

Удаляем излишества, такие как демон поисковой индексации Tracker, почтовый
клиент Evolution, средства интеграции с online-службами, каталог приложений
GNOME Software и специфичные приложения GNOME, такие как Totem и GNONE Photos.

Например, в Fedora 28 можно удалить пакеты:

  dnf remove cheese
  dnf remove evolution
  dnf remove evolution-ews
  dnf remove evolution-help
  dnf remove gfbgraph
  dnf remove gnome-boxes
  dnf remove gnome-calendar
  dnf remove gnome-contacts
  dnf remove gnome-dictionary
  dnf remove gnome-documents
  dnf remove gnome-getting-started-docs
  dnf remove gnome-initial-setup
  dnf remove gnome-maps
  dnf remove gnome-online-miners
  dnf remove gnome-photos
  dnf remove gnome-software
  dnf remove gnome-user-docs
  dnf remove gnome-user-share
  dnf remove gnome-video-effects
  dnf remove gnome-weather
  dnf remove simple-scan
  dnf remove totem
  dnf remove tracker-miners
  dnf remove yelp

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

   dnf install eog evince evolution-data-server flatpak gdm gnome-keyring gnome-menus \
     gnome-screenshot gnome-shell gnome-terminal gnome-tweaks nautilus redhat-menus


Пакеты evolution-data-server и tracker связаны зависимостями с базовыми
компонентами GNOME и удалить их не получится. Поэтому ограничимся отключения
связанных с ними сервисов:

   systemctl --user mask evolution-addressbook-factory.service
   systemctl --user mask evolution-calendar-factory.service
   systemctl --user mask evolution-source-registry.service
   systemctl --user mask gvfs-goa-volume-monitor.service
   systemctl --user mask tracker-store.service

Удаляем БД tracker:

   rm -rf ~/.cache/tracker

В настройках Firefox отключаем плагин интеграции с GNOME Shell и меняем тему оформления, в user.js:

   user_pref("plugin.state.libgnome-shell-browser-plugin", 0);
   user_pref("widget.content.gtk-theme-override", "Adwaita:light");

При желании в Firefox можно использовать https://github.com/pyllyukko/user.js с
настройками для обеспечения максимальной безопасности и блокирования
отслеживания (отключены WebRTC, webGL, Web Audio, Service/Web Workers, User
Timing, mozTCPSocket, Pocket, telemetry  и т.п.).
 
----* Создание QR-кода в консоли, чтобы быстро перенести текст на смартфон (доп. ссылка 1)   Автор: igor_chubin  [комментарии]
 
Для того чтобы быстро перенести текст из консоли или браузера на смартфон,
можно воспользоваться QR-кодом: сконвертировать текст в консоли в QR-код,
а потом сконвертировать его обратно в текст на смартфоне.

Это делается так:

  $ curl qrenco.de/Текст_который_нужно_сконвертировать

В консоли будет показан QR-код. Его можно сфотографировать телефоном
или вставить в текстовый файл.



Сконвертировать фрагмент текста в QR-код можно прямо в Vim.
Для этого нужно выделить текст (shift V и стрелки)
и нажать:

  !curl -F-=\\<- qrenco.de

Аналогичным образом, если добавить в браузере к URL слева qrenco.de/ ,
URL сконвертируется в QR-код.

Для создания QR-кодов сервис qrenco.de использует библиотеку libqrencode.
Если библиотека в системе установлена, сгенерировать QR-код можно командой:

     echo Текст_который_нужно_сконвертировать | qrencode -t UTF8



Сравнение qrenco.de и libqrencode

Преимущество qrenco.de по сравнению с libqrencode:

1. Не требуется инсталляция
2. PNG-коды могут непосредственно использоваться в HTML-страницах (<img src='http://qrenco.de/text-to-be-encoded'/>

Преимущество libqrencode по сравнению с qrenco.de:

1. Не требуется соединение с Интернетом
2. Чувствительные данные не передаются наружу

Альтернативы QR-коду для передачи текста на смартфон 

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

Другой способ, это публикация текста на таких сервисах как ix.io, sprunge.us
или ptpb.pw с помощью curl
и последующее вбивание URL в браузер телефона:

     echo Текст_который_нужно_передать_на_телефон | curl -F 'sprunge=<-' http://sprunge.us

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

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

Третье - qrenco.de и libqrencode - программы с открытым исходным
кодом, они могут быть проинсталлированы и использованы локально (на локальном
хосте в случае libqrencode или в локальной сети в случае qrenco.de)
и не требуют для своего использования соединения с Интернетом.
 
----* Установка клиента Steam в chroot-окружении Debian GNU/Linux c драйвером NVIDIA  (доп. ссылка 1)   Автор: EuPhobos  [комментарии]
 
Создание и подготовка chroot-окружения с системным окружением Ubuntu:

   # mkdir ubuntu
   # debootstrap quantal ./ubuntu/ http://mirror.yandex.ru/ubuntu
   # mount --bind /proc ./ubuntu/proc/
   # mount --bind /sys ./ubuntu/sys
   # mount --bind /dev ./ubuntu/dev

Входим в созданное окружение:

   # chroot ./ubuntu/ /bin/bash

Далее, подключение/обновление репозиториев Ubuntu и установка нужных приложения:

   # echo "deb http://mirror.yandex.ru/ubuntu quantal main multiverse universe" > /etc/apt/sources.list
   # apt-get update
   # apt-get install mesa-utils wget binutils

Проверяем GL:

   # glxinfo | grep OpenGL

   libGL error: failed to load driver: swrast
   libGL error: Try again with LIBGL_DEBUG=verbose for more details.
   OpenGL vendor string: NVIDIA Corporation
   OpenGL renderer string: GeForce GT 240/PCIe/SSE2/3DNOW!
   OpenGL version string: 1.4 (2.1.2 NVIDIA 304.64)

Само собой, о чём и речь, в чруте GL не работает, пишет мой драйвер, но "OpenGL
version string: 1.4", что не есть хорошо, так же glxgears совсем не работает,
поэтому придётся параллельно поставить библиотеки NVIDIA, такого же драйвера
внутри chroot, без компиляции модулей.

   # wget http://ru.download.nvidia.com/XFree86/Linux-x86/304.64/NVIDI...
   # chmod +x ./NVIDIA-Linux-x86-304.64.run
   # ./NVIDIA-Linux-x86-304.64.run --no-kernel-module

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

   # glxinfo | grep OpenGL

   OpenGL vendor string: NVIDIA Corporation
   OpenGL renderer string: GeForce GT 240/PCIe/SSE2/3DNOW!
   OpenGL version string: 3.3.0 NVIDIA 304.64
   OpenGL shading language version string: 3.30 NVIDIA via Cg compiler

То что надо!

   # glxgears

и ФПС как в хост-системе, идём далее

Ставим steam:

   # wget http://media.steampowered.com/client/installer/steam.deb
   # dpkg -i ./steam.deb
   # steam

   Setting up Steam content in /root/.local/share/Steam
   tar (child): xz: Cannot exec: No such file or directory
   tar (child): Error is not recoverable: exiting now
   tar: Child returned status 2
   tar: Error is not recoverable: exiting now
   Failed to extract /usr/lib/steam/bootstraplinux_ubuntu12_32.tar.xz, aborting installation.

Угу, кучи зависимостей не хватает, и самое главное нет xzip, ну да ладно, ставим

   # apt-get install xzip

Упс.. апт-гет не даёт что либо менять в системе, пока есть ошибки в
зависимостях, я особо и не пользуюсь apt-get, поэтому здесь перехожу на aptitude

Значит пока сносим steam

   # dpkg -r steam
   # apt-get install xzip aptitude
   # dpkg -i ./steam.deb
   # steam

Отлично, запустился клиент стима и обновляется.. ждём-ждём-ждём..

   Setting up Steam content in /root/.local/share/Steam
   Steam needs to install these additional packages:
    jockey-common, zenity, xterm, libcurl3-gnutls:i386, libjpeg-turbo8:i386, 
    libogg0:i386, libpixman-1-0:i386, libtheora0:i386, libvorbis0a:i386, 
    libvorbisenc2:i386, libvorbisfile3:i386, libasound2:i386, libcairo2:i386, 
    libcups2:i386, libfontconfig1:i386, libfreetype6:i386, libgcrypt11:i386, 
    libgdk-pixbuf2.0-0:i386, libgtk2.0-0:i386, libnspr4:i386, libnss3:i386, 
    libopenal1:i386, libpango1.0-0:i386, libpulse0:i386, libxi6:i386, libxinerama1:i386, 
    libxrandr2:i386, libxrender1:i386, libsdl1.2debian:i386

Стим захотел данные пакеты и по умолчанию обратился к apt-get, само собой
apt-get послал его куда по дальше, в итоге ошибка и стоп.

Ставим значит руками через aptitude

   # aptitude -R install jockey-common zenity xterm libcurl3-gnutls libjpeg-turbo8 \\
      libogg0 libpixman-1-0 libtheora0 libvorbis0a libvorbisenc2 libvorbisfile3 \\
      libasound2 libcairo2 libcups2 libfontconfig1 libfreetype6 libgcrypt11 \\
      libgdk-pixbuf2.0-0 libgtk2.0-0 libnspr4 libnss3 libopenal1 libpango1.0-0 \\
      libpulse0 libxi6 libxinerama1 libxrandr2 libxrender1 libsdl1.2debian

   # steam

Вуаля! Рабочий клиент стим в Debian Wheezy, и c версией драйвера NVIDIA 304.64 
 
----* Подключение нескольких ПК к одной клавиатуре и мыши при помощи Synergy (доп. ссылка 1)   Автор: Роман Сукочев  [обсудить]
 
В рамках проекта Synergy (http://synergy-foss.org/) подготовлен программный
KVM-переключатель для использования одной клавиатуры и мыши с несколькими
компьютерами. В отличии от аппаратных переключателей Synergy поддерживает
единый буфер обмена для всех объединенных машин.

Ниже, будет приведен пример настройки synergy для двух компьютеров под
управлением Ubuntu. Главный компьютер, с которого управляются другие
компьютеры, будет называться ubuntu-server, второй компьютер - ubuntu-client.
Монитор ubuntu-client, физически, расположен слева от ubuntu-server. Не
забываем, чтобы все работало, нужно, чтобы компьютеры были подключены к одной сети.

Synergy есть в стандартном репозитории, но там довольно старая версия.
Пакеты с последней unstable-версией можно загрузить здесь. Устанавливаем
программу на главном и подключаемых компьютерах.

   sudo apt-get install synergy

Настройка главного компьютера

Настраивается все довольно просто.
1. На компьютере, который будет главным, создаете файл в домашнем каталоге файл .synergy.conf:

   section: screens
      Ubuntu-server:
      Ubuntu-client:
   end
   section: links
      ubuntu-server:
        left = ubuntu-client
      ubuntu-client:
        right = ubuntu-server
   end

В первой секции 'screens' указаны IP или имена хостов для компьютеров,
завязанных для работы в synergy.
Во второй секции 'links' указано отношение компьютера к соседним компьютерам
(какой находится слева, справа, снизу и сверху)

2. Добавляем запуск synergys в автозагрузку, добавив команду 'synergys' в
'Система'->'Параметры'->'Запускаемые приложения'. Или 'synergys -c <путь к
конфигу>', если вы хотите использовать другой файл конфигурации для запуска synergy.


Настройка подключаемого компьютера

1. На подключаемом компьютере, добавляем запуск synergyc в автозагрузку,
добавив команду 'synergyc ubuntu-server' в 'Система'->'Параметры'->'Запускаемые приложения'.

Все. Теперь перезагружаем компьютеры и видим, что поднеся курсор мыши к левой
границе экрана монитора главного компьютера, курсор перескакивает на экран
подключенного компьютера и мы можем, мышкой и клавиатурой главного компьютера,
управлять подключенным.


QuickSynergy

Для тех, кто не любит работать с файлами конфигурации вручную, в  репозитории
Ubuntu есть утилита quicksynergy, которая позволит Вам настроить Synergy в два
клика :)

1. Скачиваем quicksynergy:

   sudo apt-get install quicksynergy

2. Если ранее поставлена unstable-версия synergy с сайта проекта, то
устанавливаем, игнорируя зависимости:

   sudo apt-get install -d quicksynergy
   cd /var/cache/apt/archives/
   sudo dpkg --ignore-depends=synergy -i quicksynergy*.deb

Зависимости мы игнорировали для того, чтобы программа не подтянула с собой
старый пакет synergy из репозитория, который заменил бы собой, свежий synergy-plus.

3. Запускаем программу 'Приложения'-->'Стандартные'-->'QuickSynergy' и
настраиваем synergy в пару кликов.

Другие GUI-утилиты для Synergy: QSynergy, Sinerji и другие.
 
----* Русификация Linux-версии игры "Amnesia: The Dark Descent" (доп. ссылка 1)   Автор: Zenitur  [комментарии]
 
Как установить "Amnesia: The Dark Descent", ведь ни у одной игры в переводе 1С,
кроме, разве что StarCraft II, на установочном диске нет бинарников для систем,
отличных от Windows.

Существует две ситуации:

1. У вас есть оригинальная английская версия игры "Amnesia: The Dark Descent",
которую вы заказали в Интернете, получили серийный номер и скачали.

2. У вас официальный диск игры в переводе 1С (Snowball - это то же самое).


В первом случае вам необходимо сделать так:

1. Взять из Windows-версии шрифты меню: скопировать каталог rus в каталог fonts игры.

2. Субтитры, в свою очередь, в ./config и ./config/lang_main

3. Озвучки (каталог rus) - в ./lang

4. В меню запуска игры можно будет выбрать русский язык.


Во втором случае нужно:

1. Скопировать или перенести (или сделать символическую ссылку) игру в
Linux-раздел (или в раздел VFAT в крайнем случае) - для того, чтобы можно было
сделать файлы игры исполняемыми.

2. Загружаем себе бинарники и библиотеки Linux-версии игры и распаковываем их в
каталог с игрой. Ссылка здесь: http://rghost.net/2664032
 
----* Организация регулярно выскакивающих напоминаний в Debian   Автор: Сергей Пушкин  [комментарии]
 
Допустим, необходимо чтобы в рабочее время каждый час на экран выскакивало
окошко с напоминанием сделать разминку.

Как это сделать?

1. Убеждаемся что установлен пакет zenity, отображающий различные сообщения
через GTK+ (он входит в зависимости gnome-desktop-environment, но все же ...)

   sudo aptitude install zenity

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

    crontab -e

добавляем:

   0 10-16 * * * ps -A |grep gdialog || env DISPLAY=:0 
     LANG=ru_RU.UTF-8 gdialog --title "Напоминание" --infobox "Разминка\!\!\!\n`LANG=ru_RU.UTF-8 date`"


3. Получаем желаемый результат каждую 0 минуту с 10 до 16 часов.
 
----* Одновременное использование двух мышей на одном экране в X.Org (доп. ссылка 1)   [комментарии]
 
Несколько дней назад в Debian unstable был добавлен пакет с Xorg 7.5, в котором
появилась поддержка подсистемы XInput2, позволяющей одновременно задействовать
на одном экране несколько устройств ввода.
Ниже показано как обеспечить работу в  X.Org двух манипуляторов мышь, которыми
можно управлять взяв их в правую и левую руки.

Подключаем вторую мышь (Topro) к ПК и смотрим список доступных устройств ввода:

   $ xinput list
   
   Virtual core pointer                  id=2 [master pointer  (3)]
      Virtual core XTEST pointer         id=4 [slave  pointer  (2)]
      "Logitech USB-PS/2 Optical Mouse"  id=10 [slave  pointer  (2)]
      "Topro USB Mouse"                  id=12 [slave  pointer  (2)]
   Virtual core keyboard                 id=3 [master keyboard (2)]
   ...

"Topro USB Mouse" будем использовать левой рукой, а мышь Logitech - правой.

Создаем дополнительное первичное устройство ввода 

   $ xinput create-master Auxiliary

Вновь смотрим список устройств:
 
   $ xinput list
   ...  
   Auxiliary pointer           id=13   [master pointer  (14)]
      Auxiliary XTEST pointer  id=15   [slave  pointer  (13)]
      Auxiliary keyboard       id=14   [master keyboard (13)]
      Auxiliary XTEST keyboard id=16   [slave  keyboard (14)]

Переводим мышь Topro (id 12) в категорию Auxiliary:

   $ xinput reattach 12 "Auxiliary pointer"

Смотрим, что получилось:

   $ xinput list

Мышь Logitech осталась в блоке "Virtual core pointer", а Topro появилась в "Auxiliary pointer".

Теперь два указателя мыши перемещаются по экрану отдельно.

Но для удобства управления поменяем маппинг кнопок для мыши Topro (id 12),
которую будем держать в левой руке:

   $ xinput set-button-map 12 3 2 1

Чтобы видеть какой указатель соответствует каждой мыши поменяем оформление курсора:

   $ sudo aptitude install git-core
   $ git clone git://git.ao2.it/xicursorset.git
   $ cd xicursorset
   $ sudo aptitude install libxi-dev libxcursor-dev
   $ make

Меняем курсор для левой мыши (Auxiliary pointer, id 13):

   $ ./xicursorset 13 right_ptr redglass

и для правой (Virtual core pointer, id=2):

   $ ./xicursorset 2 left_ptr whiteglass

Для тестирования установим приложение vinput, поддерживающие multi-pointer (MPX) режим работы:

   $ git clone git://gitorious.org/vinput/vinput.git
   $ cd vinput/demo
   $ gcc -o demo-paint demo-paint.c `pkg-config --cflags --libs xi`
   $ ./demo-paint

В настоящее время MPX не поддерживается в Gtk+ и соответственно не получится
рисовать одновременно двумя мышами в GIMP или Inkscape, но можно одной мышью
выбирать инструменты или элементы меню, а другой рисовать. Ситуация изменится с
выходом Gtk+3. Также перетаскивание одновременно двух окон еще не работает в
оконном менеджере Metacity, но иконки перетаскивать одновременно в Nautilus с
перемещением окна в Metacity уже можно. Qt поддерживает мултитач начиная с
версии 4.6
 
----* Настройка синтеза речи в Ubuntu (доп. ссылка 1)   [комментарии]
 
Простой рецепт по установке и использованию синтезатора речи Festival в Ubuntu:

Устанавливаем festival и сопутствующие утилиты:

   sudo apt-get install festival speech-tools

Cтавим пакет с голосом, которые занимает 186 Мб. 
В репозитории universe Ubuntu 9.10 уже есть готовый пакет festvox-ru:

   sudo apt-get install festvox-ru

Если используется Ubuntu 9.04 в /etc/apt/sources.list добавляем:
   deb http://ppa.launchpad.net/sergey-udaltsov/ppa/ubuntu jaunty main 
   deb-src http://ppa.launchpad.net/sergey-udaltsov/ppa/ubuntu jaunty main 

Ставим:

   sudo apt-get install festvox-ru

В остальных дистрибутива можно установить/распаковать deb-пакет с голосом из Ubuntu 9.10:

   sudo wget http://ubuntu.mirrors.tds.net/ubuntu/pool/universe/f/festvox-ru/festvox-ru_0.5-1_all.deb
   sudo dpkg --install festvox-ru_0.5-1_all.deb

Проверяем (русский текст воспринимается только в кодировке UTF-8):

   festival

   >(SayText "Hello!")

Активируем русский голос

   >(voice_msu_ru_nsh_clunits)

Произносим русский текст:

   >(SayText "Привет!")
   >(exit)

Читаем содержимое файла:

   festival -b '(begin (voice_msu_ru_nsh_clunits) (tts_file "./file.txt"))'

Сохранить результат в файл:

   text2wave -eval '(voice_msu_ru_nsh_clunits)' ./file.txt -o ./file.wav

Чтобы заработало:

   cat file.txt | festival --tts --language russian
или
   festival --tts --language russian file.txt

Нужно в файл /usr/share/festival/languages.scm перед строкой "(define
(select_language language)" добавить (по аналогии с другими языками):

   (define (language_russian)
   "(language_russian)
   Set up language parameters for Russian"
      (set! male1 voice_msu_ru_nsh_clunits)
      (male1)
      (Parameter.set `Language `russian)
   )

В блок "(define (select_language language)" добавляем:

   ((equal? language `russian)
   (language_russian))
 
----* Выделение непрочитанных табов в Firefox (доп. ссылка 1)   [комментарии]
 
В  Firefox можно настроить выделение табов ни разу не прочитанных пользователем.
Для этого в директории ~/.mozilla/firefox/*.default/chrome/ нужно переименовать 
файл userChrome-example.css в userChrome.css, добавив в:

   #content tab:not([selected]) {font-style: italic !important; }

После этого текст в заголовке всех непрочитанных табов будет выделяться курсивом.
 
----* psi: контакт-лист и сообщения в одном окне (доп. ссылка 1)   Автор: Соколов Алексей  [комментарии]
 
Jabber-клиент psi может выглядеть как tkabber (список контактов и сообщения в одном окне).
Для пользователей FreeBSD шаги будут выглядеть следующим образом:

   cd /usr/ports/net-im/psi && make extract
   cd work/psi-0.12
   fetch http://psi-dev.googlecode.com/svn/trunk/patches/psi-all_in_one_window.patch
   cat psi-all_in_one_window.patch | patch -p1
   cd ../../ && make install clean
 
----* Управление десктоп приложениями из shell при помощи D-Bus (доп. ссылка 1)   [комментарии]
 
В качестве консольной утилиты для работы с D-Bus можно использовать "qdbus" из состава Qt4.

При выполнении без аргументов, утилита qdbus выведет список активных  шин:

   qdbus

   org.freedesktop.ScreenSaver
   org.freedesktop.Notifications
   org.freedesktop.PowerManagement
   org.freedesktop.DBus

Отобразим список объектов для шины ScreenSaver:

   qdbus org.freedesktop.ScreenSaver

   /
   /App
   /Interface
   /KBookmarkManager
   /KBookmarkManager/konqueror
   /KDebug
   /MainApplication
   /ManagerIface_contact
   /ScreenSaver

Просмотрим методы объекта "/ScreenSaver":

   qdbus org.freedesktop.ScreenSaver /ScreenSaver

   signal void org.freedesktop.ScreenSaver.ActiveChanged(bool)
   method bool org.freedesktop.ScreenSaver.GetActive()
   method uint org.freedesktop.ScreenSaver.GetActiveTime()
   method bool org.freedesktop.ScreenSaver.SetActive(bool e)
   method void org.freedesktop.ScreenSaver.Lock()
   method uint org.freedesktop.ScreenSaver.Inhibit(QString application_name, QString reason_for_inhibit)
   ...

Посмотрим значение текущего счетчика времени неактивности, после которого 
активируется хранитель экрана. Просмотрим текущее значение:

   qdbus org.freedesktop.ScreenSaver /ScreenSaver org.freedesktop.ScreenSaver.GetSessionIdleTime

   0

С момента последнего нажатия клавиши прошло 0 сек. Попробуем ничего не нажимать:

   sleep 5 ; qdbus org.freedesktop.ScreenSaver /ScreenSaver org.freedesktop.ScreenSaver.GetSessionIdleTime

   4

Попробуем активировать хранитель экрана через метод org.freedesktop.ScreenSaver.SetActive:
 
   qdbus org.freedesktop.ScreenSaver /ScreenSaver org.freedesktop.ScreenSaver.SetActive True

   true  

Блокируем экран:

   qdbus org.freedesktop.ScreenSaver /ScreenSaver org.freedesktop.ScreenSaver.Lock

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

   qdbus org.freedesktop.ScreenSaver /ScreenSaver \
      org.freedesktop.ScreenSaver.Inhibit "$$" "Testing D-Bus Interface"

   5822

где, "$$" - имя приложения запретившего активацию хранителя экрана, 
в нашем случае это PID текущего shell (5822).
второй аргумент - причина сдерживания хранителя экрана.

После того как хранитель экрана можно опять активировать, выполняем:

   qdbus org.freedesktop.ScreenSaver /ScreenSaver \
     org.freedesktop.ScreenSaver.UnInhibit 5822


Другие примеры.
Просмотрим список заметок из Tomboy.

   qdbus org.gnome.Tomboy /org/gnome/Tomboy/RemoteControl org.gnome.Tomboy.RemoteControl.ListAllNotes

   note://tomboy/5e900d91-bd77-4f41-89d8-e71baaafd364
   note://tomboy/f647c681-b1b9-4eca-bdab-fd4b04cb37f6

Отобразим содержимое одной из них:

   qdbus org.gnome.Tomboy /org/gnome/Tomboy/RemoteControl \
     org.gnome.Tomboy.RemoteControl.GetNoteContents note://tomboy/5e900d91-bd77-4f41-89d8-e71baaafd364
 
----* Зачем и как удалить beagle из OpenSUSE   Автор: unknown  [комментарии]
 
После установки OpenSuse 10.3 или 11 внимательный пользователь может заметить, 
что установленный по умолчанию beagle (приложение для организации поиска на десктопе, 
написанное на C# и использующее Mono:

1) Потребляет ресурсы CPU (beagled), (powertop: несет ответственность за ~10% cpu wakeups, 
что уменьшает время проводимое процессором в sleep режиме).

2) Создает несанкционированный пользователем дубль его личных данных (таковы
установки по умолчанию)

3) Постепенно забивает все больше и больше места на диске под свою базу.

Удалить beagle вместе со всеми плагинами к другим программам, можно  1-2 командами:

   rpm -ev  `rpm -qa | grep beagle | grep -v libbeagle` `rpm -qa | grep kerry`
   rm -rf /var/cache/beagle/
   killall beagled
 
----* Консольные аналоги GUI конфигураторам в Ubuntu (доп. ссылка 1)   [комментарии]
 

Управление пакетами и программами:

  • GUI: Synaptic Package Manager, Gdebi (Package Installer), Adept, Update Manager.
  • CLI: dpkg, apt, aptitude
  • GUI: software-properties-gtk (Software Sources)
  • CLI: apt-cdrom, apt-key, прямое редактирование /etc/apt/sources.list
  • GUI: gtkorphan
  • CLI: deborphan

Настройка Gnome:

  • GUI: Ubuntu-tweak, gtweakui, Nautilus Actions, gconf-editor
  • CLI: GConf; gconftool.

Менеджеры закачек:

  • GUI: d4x (Download for X), wxDownload Fast, MultiGet, FileZilla, Deluge, Transmission
  • CLI: wget, lftp, bittorrent CLI client

Настройка сети:

  • GUI: Network Manager, Network Tools, Network Manager Applet.
  • CLI: ifconfig, route, pppoeconf, ручная правка /etc/network

Настройка Dial-up:

  • GUI: Gnome-PPP, kppp.
  • CLI: pppconfig, wvdial

Настройка пакетного фильтра:

  • GUI: Firestarter, Firhol, Gnome-lokkit
  • CLI: iptables, ufw, lokkit CLI front-end.

Удаленное управление:

  • GUI: Vinage (Remote Desktop Viewer), VNCviewer, tsclient (Terminal Server Client)
  • CLI: протоколы VNC, RDP, SSH и Telnet; CLI клиенты: putty-tools, rdesktop, openSSH client

Текстовые редакторы:

  • GUI: Gedit (Text Editor), Mousepad
  • CLI: nano, vim

Архиваторы:

  • GUI: file-roller (Archive Manager)
  • CLI: tar, bzip2, zip, rar, p7zip

Управление дисковыми разделами:

  • GUI: Gparted (Partition Editor)
  • CLI: Parted

Визуальные эффекты на десктопе:

  • GUI: Compiz Settings Manager, Simple CCSM, fusion-icon (Compiz-Fusion Icon).
  • CLI: прямое редактирование файлов конфигурации compiz, xserver-xorg

Информация об оборудовании:

  • GUI: Hardinfo, Sysinfo
  • CLI: lshw, cpuid, facter

Мультимедиа:

  • GUI: Avidemux, kino, pitivi, LiVES
  • CLI: mjpegtools, mencoder, transcode, x264

Преобразование звуковых файлов:

  • GUI: SoundConverter, oggconvert, aacplusenc
  • CLI: lame, sox, faac, flac, vorbis-tools.

Антивирусные пакеты:

  • GUI: ClamTK
  • CLI: ClamAV

Настройка шрифтов:

  • GUI: fontmatrix, FontyPyhton
  • CLI: defoma, fontconfig

Системное администрирование:

  • GUI: Startup Manager
  • CLI: usplash
  • GUI: bum (Boot-Up Manager)
  • CLI: sysv-rc-conf
  • GUI: DisplayConfig-gtk, Gnome Control-Center
  • CLI: редактирование xorg.conf
  • GUI: System Monitor
  • CLI: HTop
  • GUI: QGRUBEditor
  • CLI: GRUB boot loader
  • GUI: gmountsio (mount CD/DVD iso images)
  • CLI: mount -o loop -t iso9660
  • GUI: gksu
  • CLI: su, sudo
 
----* Средства дружественной пользователю настройки различных систем в Linux   [комментарии]
 Ниже список графических и консольных утилит, для настройки системы неподготовленным пользователем через меню, без ручной правки файлов конфигурации.
  • xf86cfg, XFdrake (из drakxtools), Xconfigurator - настройка параметров X Window (видеокарта, монитор, устройства ввода);
  • alsaconf, sndconfig - настройка звуковой карты;
  • cupsdconf, printtool, printerdrake, scannerdrake - настройка системы печати;
  • ntsysv, tksysv, sysvconfig, sysv-rc-conf - настройка начальной загрузки сервисов;
  • cfdisk (консольная), diskdrake (консольная), qtparted - работа с разделами диска (fdisk);
  • lde - linux disk editor, низкоуровневый редактор диска;
  • nvidia-settings - GUI конфигуратор видеокарт NVidea;
  • winecfg - настройка параметров эмулятора windows wine;
  • gdmsetup, gdmphotosetup - настройка экрана входа в систему;
  • powertweak - тюнинг производительности системы (CPU, PCI);
  • sensors-detect - поиск подходящего модуля ядра для lm_sensors;
  • testdisk - проверка и восстановление разделов и ФС.
  • toshutils-x11, vaio-tools - GUI настройки для ноутбуков Toshiba и Sony (управление питанием, настройка монитора и клавиш);
  • aptitude (консольная apt), synaptic (apt), gnorpm, kpackage, rpmdrake - управление пакетами (APT);
  • keyboarddrake, kbdconfig, mousedrake, mouseconfig - настройка клавиатуры и мыши;
  • netcfg, netconfig, draknet, adsl-setup - настройка сети;
  • drakfont,fc-list, xlsfonts, xfontsel, kcharselect, gfontsel и chkfontpath - установка и проверка шрифтов;
  • guarddog - GUI для настройки фаервола;
  • userdrake - манипулирование аккаунтами пользователей;
  • kwuftpd - настройка прав пользователей для FTP сервера wuftpd;
  • menudrake, update-menus - обновление/перестроение меню;
  • kudzu, usbview, lsusb, lspci - просмотр информации об оборудовании;
  • Alterator (пока только в AltLinux Sisyphus), kcontrol, drakconf, drakxconf (drakxtools), base-config, linuxconf, gnome-linuxconf, webmin - общие системы конфигурирования;
  • swat - web интерфейс для конфигурирования samba.
  • wvdialconf, pppconfig, gnome-ppp, kppp - GUI для настройки диалап доступа;
  • gadmintools - набор GUI интерфейсов GTK+ для настройки сетевых сервисов (DNS, DHCP, FTP, Samba, Apache, Squid).
  • Средства для настройки Wifi:

    Продолжение и расширение списка приветствуется в комментариях.

  •  
    ----* Пример математических операций в shell используя bc (доп. ссылка 1)   [комментарии]
     
      echo "(321-123)/123" | bc -l
      echo "framing=20; minsize=64; (100*10^6)/((framing+minsize)*8)" | bc
    
    Рисование графика
      echo "framing=20; plot [64:1518] (100*10* *6)/((framing+x)*8)" | gnuplot -persist
    
    Преобразование из десятичного в шестнадцатеричный вид
      echo "obase=16;ibase=10;123" | bc
    
     
    ----* Как в bc выводить не округленный до целого числа результат.   [комментарии]
     
    scale=N   где, N - число цифр после запятой. 
    
     
    ----* Как найти нужное системное руководство (man)   [обсудить]
     
    "apropos ключевое_слово" или "man -k ключевое слово". Функцию perl можно найти
    по "perldoc -f имя", раздел faq - "perldoc -q слово".
    
     
    ----* Просмотр подсказок/шпаргалок по командам UNIX/Linux в командной строке (доп. ссылка 1)   Автор: igor_chubin  [комментарии]
     
    Просмотр подсказок/шпаргалок (cheat sheets) по командам UNIX/Linux в командной строке
    без использования специального программного обеспечения.
    
    Например, для того чтобы посмотреть наиболее важные ключи команды curl
    и наиболее интересные командные строки, построенные на её основе:
    
        $ curl cheat.sh/curl
    
    Вся (или большинство) этой информации есть и в curl(1) (man curl),
    но шпаргалка удобна тем, что содержит наиболее важные, наиболее популярные
    или наиболее интересные аспекты использования команды.
    
    Существует несколько известных программ-шпаргалок для командной строки.
    Самые известные из них это cheat и tldr.
    
    Сервис cheat.sh отличается от них тем, что он не требует инсталляции дополнительных программ,
    и не требует вообще никаких предварительных действий:
    не нужно ничего инсталлировать, ни искать ничего в поисковых системах, ни даже открывать браузер.
    Поиск осуществляется прямо там, где потом используется информация - в
    командной строке. Код сервиса открыт под лицензией MIT.
    
    Сервис предоставляет доступ к нескольким популярным репозиториям
    краткой справочной информации:
    
    
  • cheat.sheets (собственный репозиторий cheat.sh);
  • tldr;
  • cheat. Все эти репозитории очень популярны и постоянно развиваются, и множество команд, покрываемых ими, непрерывно растёт и пополняется (сейчас cheat.sh предоставляет доступ к 701 шпаргалке). Если название команды, по которой требуется информация, точно неизвестно, или если таких команд множество, то можно воспользоваться поиском. Поиск включается тильдой, за которой идёт поисковый запрос: curl cheat.sh/~snapshot В данном случае будут найдены и показаны все примеры работы со снапшотами в UNIX/Linux: LVM, ZFS, btrfs и так далее. Поиск можно осуществлять и в пределах одной страниц. Удобно, если информации на странице много, а вас интересует какая-то определённая: curl cheat.sh/azure~list Поиск может сопровождаться дополнительными опциями:
  • r рекурсия
  • b часть слова
  • i без учёта регистра которые указываются после закрывающего слэша: curl cheat.sh/curl~post/i Для поддержки tab-completion в bash: mkdir ~/.bash.d/ curl cheat.sh/:bash_completion > ~/.bash.d/cheat.sh . ~/.bash.d/cheat.sh # и добавить эту же строку в ~/.bashrc В репозитории есть не только подсказки по командам UNIX/Linux и их опциям, но и по различным языкам программирования. curl cheat.sh/rust/hello curl cheat.sh/rust/~function Добавление новых подсказок и редактирование существующих можно осуществлять одним из трёх способов:
  • если страница с подсказкой взята из внешнего репозитория, её нужно редактировать там. в HTML-версии странцы в браузере источник страницы указан с помощью кнопки на github'е;
  • если страница взята из собственного репозитория cheat.sh, её нужно редактировать в репозитории cheat.sheets; для этого на странице нужно нажать на кнопку edit;
  • новые страницы можно добавить прямо из командной строки с помощью curl (подробности в "curl cheat.sh/:post").
  •  

       Работа с электронной почтой:

       CD, CD-R, DVD, AudioCD

    ----* Работа в Linux с автоматом записи и печати на DVD/CD дисках Primera Bravo XRP   Автор: barmaley  [комментарии]
     
    Аппарат Primera Bravo XRP позволяет автоматизировать запись данных и печать
    маркировки на CD-диски, максимальная емкость 50 + 50 дисков.
    
    Подключается это устройство через USB.
    
    В системе появляются три устройства (через внутренний usn hub), два cdrw и lp:
    
       usb 2-2: new high-speed USB device number 62 using ehci_hcd
       usb 2-2: New USB device found, idVendor=04b4, idProduct=6560
       usb 2-2: New USB device strings: Mfr=0, Product=0, SerialNumber=0
       hub 2-2:1.0: USB hub found
       hub 2-2:1.0: 4 ports detected
       usb 2-2.1: new full-speed USB device number 63 using ehci_hcd
       usb 2-2.1: New USB device found, idVendor=0f25, idProduct=0012
       usb 2-2.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
       usb 2-2.1: Product: CD/DVD
       usb 2-2.1: Manufacturer: Primera
       usb 2-2.1: SerialNumber: 1000001
       usblp0: USB Bidirectional printer dev 63 if 0 alt 0 proto 2 vid 0x0F25 pid 0x0012
       usb 2-2.3: new high-speed USB device number 64 using ehci_hcd
       usb 2-2.3: New USB device found, idVendor=0dbf, idProduct=0700
       usb 2-2.3: New USB device strings: Mfr=2, Product=3, SerialNumber=1
       usb 2-2.3: Product: USB to SATA Bridge
       usb 2-2.3: Manufacturer: TSI
       usb 2-2.3: SerialNumber: TSI08102925ad
       scsi10 : usb-storage 2-2.3:1.0
       usb 2-2.4: new high-speed USB device number 65 using ehci_hcd
       usb 2-2.4: New USB device found, idVendor=0dbf, idProduct=0700
       usb 2-2.4: New USB device strings: Mfr=2, Product=3, SerialNumber=1
       usb 2-2.4: Product: USB to SATA Bridge
       usb 2-2.4: Manufacturer: TSI
       usb 2-2.4: SerialNumber: TSI081029002d
       scsi11 : usb-storage 2-2.4:1.0
       scsi 10:0:0:0: CD-ROM            PIONEER  DVD-RW  DVR-215D 9.13 PQ: 0 ANSI: 0
       sr0: scsi3-mmc drive: 40x/40x writer cd/rw xa/form2 cdda tray
       sr 10:0:0:0: Attached scsi CD-ROM sr0
       sr 10:0:0:0: Attached scsi generic sg1 type 5
       scsi 11:0:0:0: CD-ROM            PIONEER  DVD-RW  DVR-215D 9.13 PQ: 0 ANSI: 0
       sr1: scsi3-mmc drive: 40x/40x writer cd/rw xa/form2 cdda tray
       sr 11:0:0:0: Attached scsi CD-ROM sr1
       sr 11:0:0:0: Attached scsi generic sg2 type 5
    
    
    На сайте производителя есть драйверы для Linux, но они работают только с
    принтером (печать этикеток для CD).
    Модель встроенного принтера, очень похоже, Lexmark Z80.
    Работа с роботом-автоматом производится путем посылки бинарного пакета в порт
    принтера (/dev/usb/lp0)
    Пакет состоит из 8 байт:
    
       заголовок [0x1B, 0x04], команда [byte], резерв [0x00, 0x00, 0x00, 0x00], сумма 7 байт [byte]
    
    Так же, на сайте производителя, указано что, если вы хотите получить все
    hex-коды, необходимо подписать Non-disclosure Agreement (NDA).
    Но можно и не подписывать, основные необходимые дествия уже расписаны
    пользователем davidef для модели Primera Bravo II.
    
    Состояние устройства можно получить через чтение порта принтера.
    Вы получите две строки (последняя постоянно повторяется циклически с изменениями):
    
       binary data 1, 0x0D
       binary data 2, 0x0D
    
    Я же подведу итог:
    
    Манипуляции с cdrw производятся как обычно через eject и cdrecord ;)
    
    Описание команд робота, на которые я получил хоть какую то реакцию:
    
       05 - сброс устройства, пауза ~30 сек
       80 - взять с левого лотка, положить на верхний CD
       81 - взять с левого лотка, положить на принтер
       82 - взять с левого лотка, положить на правый лоток
       83 - взять с правого лотка, положить на верхний CD
       84 - взять с правого лотка, положить на принтер
       85 - взять с правого лотка, положить на левый лоток
       86 - взять с верхнего CD положить на принтер
       87 - взять с верхнего CD положить направо
       88 - взять с верхнего CD положить налево
       89 - взять с верхнего CD положить вниз (нижний CD либо наружу) !!    не забудьте закрыть верхний CD !!
       8A - взять с принтера положить направо
       8B - взять с принтера положить налево
       8С - взять с принтера положить на нижний CD (либо выбросит наружу)
       8D - ?
       8E - каретка в центр (пауза ~10 сек, возврат)
       8F - каретка в центр (пауза ~10 сек, возврат)
       90 - каретка влево (пауза ~10 сек, возврат)
       91 - каретка в центр (пауза ~10 сек, возврат)
       92 - взять диск (с последней позиции)/положить диск
       93 - открыть принтер
       94 - закрыть принтер
       95 - каретка налево, картриджы направо, индикаторы перемигиваются, ждет какой то команды, если неверная команда происходит reset (пауза ~30 сек)
       96 - каретка налево, картриджы направо, индикаторы постоянны
       97 - возврат из 96 в исходное
       98 - взять с принтера положить на верхний CD (либо выбросит наружу)
       99 - проверяет диски в обеих лотках (слева и справа)
       9A - взять слева ?
       9B - опускает каретку с диском на 1 см, таймаут 10сек, поднимает в  исходное
       9С - каретка направо, картрижды налево, каретка вниз до упора и устройство выключается
       9D - взять слева, положить на нижний CD
       9E - взять справа, положить на нижний CD
       9F - взять с нижнего CD положить на принтер
       A0 - взять с нижнего CD положить направо
       A1 - взять с нижнего CD положить налево
       A2 - взять с нижнего CD, каретка вверх, положить на нижний CD (либо выбросит наружу)
       A3 - каретка в центр (пауза ~10 сек, возврат)
       A4 - взять слева, положить на верхний CD, взять еще один диск слева
       A5 - взять справа, положить на верхний CD, взять еще один диск    слева
       A6 - взять слева, положить на нижний CD, взять еще один диск слева
       A7 - взять справа, положить на нижний CD, взять еще один диск слева
       A8 - взять с принтера положить на нижний CD (либо выбросит наружу), аналогично 8C
       A9 - каретка в центр (пауза ~10 сек, возврат)
    
    Этого вполне достаточно для автоматизации процесса, любым скриптовым языком.
    
    Состояние устройства:
    
       binary data 1:
    
    65 байт - состояние устройства, 0x43 (открыта крышка), 0x42 (робот в процессе
    манипуляций), 0x49 (в готовности, обычное состояние)
    
       binary data 2:
    
    62 байт - количество дисков в правом лотке, после команды 99
    63 байт - количество дисков в левом лотке, после команды 99
    
     
    ----* Создание виртуального CD/DVD накопителя в Ubuntu Linux (доп. ссылка 1)   [комментарии]
     
    Устанавливаем CDemu (http://cdemu.sourceforge.net/)
    
    Подключаем дополнительные репозитории, в /etc/apt/sources.list прописываем:
    для Ubuntu 8.04
       deb http://ppa.launchpad.net/cdemu/ubuntu hardy main
    для Ubuntu 8.10 
       deb http://ppa.launchpad.net/cdemu/ubuntu intrepid main
    
    Для других дистрибутивов готовые пакеты можно загрузить с сайта http://sourceforge.net/projects/cdemu/
    
    Устанавливаем:
    
       sudo apt-get update
       sudo apt-get install cdemu-daemon cdemu-client
    
    Запускаем сервис (подгружается модуль ядра cdemu и запускается демон cdemud):
    
       sudo /etc/init.d/cdemu-daemon start
    
    Добавляем виртульный CD-ROM с номером 0 на основе образа file.iso:
    
       cdemu load 0 file.iso
    
    После добавления виртуальный CD-ROM доступен как устройство /dev/cdemu/0 
    Примонтируем его (для примера работы с устройством, в простейших случаях проще монтировать файл 
    напрямую через "-o loop", создание виртуального CDROM полезно в ситуациях когда локально 
    смонтировать невозможно: хитрые форматы, защищенные DVD, звуковые дорожки и т.п.):
    
       mount -t iso9660 /dev/cdemu/0 /mnt/cdrom
    
    
    Смотрим какие виртуальные CD-ROM подключены:
    
       cdemu -s или cdemu status
    
       Drive Loaded Comment
       0:     1   file.iso
    
    Отключаем созданное устройство:
    
       cdemu unload 0
    
    
    Начинающие пользователи могут обойтись и без манипуляций в командной строке.
    
    Устанавливаем GNOME виджет gCDemu:
       sudo apt-get install gcdemu
    
    Перезагружаем пользовательский сеанс в GNOME или выполняем 
    
       cdemud-daemon.session
    
    Добавляем виджет gCDemu на панель и через GUI интерфейс привязываем iso образ к
    виртуальному устройству.
    
     
    ----* Преобразование файлов в формате Nero (nrg) в ISO-образ   Автор: Karbofos  [комментарии]
     
    Иногда требуется в Linux записать на диск или получить доступ к содержимому 
    дисковых образов в формате Nero (*.nrg), без установки проприетарного ПО.
    
    Существует утилита nrg2iso, но её искать не обязательно, т.к. можно обойтись системной утилитой dd
    
    Применяем утилиту dd (программа для конвертирования и копирования файлов). 
    Единственное отличие формата Nero от ISO заключается в наличии "шапки" в 300 килобайт, 
    которая приклеивается Nero к ISO файлу. 
    
    Преобразование формата сводится к вызову команды:
    
       dd bs=1k if=image.nrg of=image.iso skip=300
    
    описание параметров:
    bs=1k : block size = 1kbyte / размер блока
    if=image.nrg : input file / файл-источник
    of=image.iso : output file / файл-результат
    skip=300 : пропустить 300 блоков
    
    Также, возможно смонтировать образ диска в формате Nero:
       mount image.nrg /path -o offset=$((1024*300))
    
    
    Обратное преобразование:
    
       dd if=/dev/zero of=image.nrg bs=1k count=300
       cat image.iso >> image.nrg
    
    count=300 : отсчитать 300 блоков
    if=/dev/zero : содержит бесконечное количество символов 0x00
    
    Отсутствие важной технической информации в первых 300 КБ образа Nero NRG
    подтверждается следующей командой:
    
       dd if=win2003_eng_sp2.nrg bs=1k count=300|hexdump -C
    
       00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  |................|
       *
       300+0 records in
       300+0 records out
       307200 bytes (307 kB) copied, 0.0194742 seconds, 15.8 MB/s
    0004b000
    
    Вероятно, там может быть информация о защите оригинального диска, но если ее нет в ISO, 
    то незачем ее "придумывать" для образа Nero NRG.
    
    Записать диск без предварительного сохранения подрезанного образа возможно так:
       dd if=image.nrg of=image.iso bs=1k skip=300 | cdrecord speed=2 -
    
    Команда cdrecord может быть заменена на любую присутствующию и подходящую, 
    например, на wodim, growisofs.
    
    Дополнение: для монтирования нестандартных форматов дисковых образов удобно
    использовать пакет fuseiso.
    Монитируем:
    
       fuseiso -p файл.nrg mnt_dir
    
    Отмонтируем:
    
       fusermount -u mnt_dir
    
     
    ----* Запись CD во FreeBSD без создания промежуточных ISO-файлов (доп. ссылка 1) (доп. ссылка 2)   Автор: Litos  [комментарии]
     
    Ставим порт /usr/ports/sysutils/cdrtools
    
    Пишем CD или DVD:
       mkisofs -RJD -jcharset=koi8-r /path/to/files | burncd -f /dev/acd0 -s 8 -e data - fixate
    
    Предварительно RW диск, для перезаписи, можно почистить командой:
       burncd -f /dev/acd0 blank
    
    Ключи mkisofs
    
    - R - создать Rock Ridge - расширение файловой системы ISO 9660, разработанное 
    для хранения файловых атрибутов, используемых в операционных системах POSIX
    
    -J - создать файловую систему Joliet (имена файлов длиннее 8.3, национальные символы в них и т.п.)
    
    -D - убрать ограничение на глубину вложенных директорий
    
    -jcharset=koi8-r - указываем кодировку имен файлов на диске, чтобы корректно 
    перекодировались в UCS-2 используемый в Joliet
    
    Ключи burncd
    
    -s 8 - скорость записи на диск (по умолчанию 4)
    
    -e - извлечь диск после записи
    
    data - тип данных
    
    - - получение данных с stdin
    
    fixate - закрыть сессию после записи.
    
    
    Для записи DVD+RW/-RW дисков ставим порт /usr/ports/sysutils/dvd+rw-tools
    
    Пишем:
       growisofs -Z /dev/acd0 -r -J -speed=8 /path/to/files
    
    Добавляем дополнительные файлы:
       growisofs -M /dev/acd0 -r -J -speed=8 /path/to/more_files
    
    
    Перекодирование DVD в DivX:
    Ставим порты: 
       /usr/ports/sysutils/vobcopy 
       /usr/ports/multimedia/mplayer
    
    Грабим содержимое DVD:
    
       mount /cdrom
       vobcopy /cdrom
    
    Перекодируем *.vob в DivX 4/5:
    
       cat *.vob | mencoder -o mymovie.avi \ 
            -oac mp3lame -lameopts br=192:vbr=2 \
            -ovc lavc -lavcopts vcodec=mpeg4:vhq:keyint=250 -vop pp lb -
    
    
    Для кодирования в DivX 3 в поле vcodec можно указать msmpeg4.
    
     
    ----* Как в Fedora Linux создать загрузочный USB Flash на базе ISO образа (доп. ссылка 1)   [комментарии]
     
    Создание загрузочного USB Flash на базе ISO образа, без форматирования 
    и потери сохраненных на Flash данных (ставится прямо в VFAT, используя свободное место) 
    
    Устанавливаем пакет livecd-tools
       yum  install livecd-tools
    
    Создаем загрузочный USB Flash (устройство /dev/sdb1)
       livecd-iso-to-disk livecd.iso /dev/sdb1 
    
    
    Возможные проблемы и их решения:
    
    
    Если программа выдала сообщение "Partition isn't marked bootable!", запускаем:
       parted /dev/sdb
    Выполняем команду print и смотрим номер раздела (если раздел один, то будет 1)
       Выполняем команду: toggle 1 boot
       Выходим из parted: quit
       Или в fdisk используем команду "a".
    
    Если программа выдала сообщение "Need to have a filesystem label or UUID for your USB device":
       dosfslabel /dev/sdb1 usbdisk
    вместо usbdisk можно указать любое имя, на ваше усмотрение.
    
    Если программа выдала сообщение "MBR appears to be blank", копируем образ MBR:
       cat /usr/lib/syslinux/mbr.bin > /dev/sdb
    
    Если fdisk -l /dev/sdb выдает "Partition has different physical/logical
    endings!" - нужно переформатировать Flash:
      Создаем в fdisk один primary раздел типа 6 (FAT)
      Форматируем: mkdosfs -n usbdisk /dev/sdb1
    
    
    Тестируем подготовленный загрузочный Flash:
       qemu -hda /dev/sdb1 -m 256 -std-vga
    
    Если при загрузке пишет: "SYSLINUX 3.xx ... EBIOS Load error - Boot error",
    нужно обновить пакет syslinux до версии 3.50 или выше.
    
     
    ----* Копирование DVD диска и преобразование в AVI   Автор: geekkoo  [комментарии]
     
    Я не касаюсь качества кодирования, тем более что в архиве есть заметка про
    двухпроходное кодирование.
    Берем DVD, монтируем его как файловую систему, и переносим содержимое 
    как файлы на диск. Очень удобно, если DVD невысокого качества и у него 
    время от времени возникают ошибки чтения. Если по несколько раз 
    монтировать/размонтировать плохой диск, то по частям удается скопировать 
    его полностью.
    
    mount /dev/dv /mnt/dvd
    cp /mnt/dvd /home/DVDrip
    
    В итоге, в файле /home/DVDrip появятся директории VIDEO_TS и AUDIO_TS. 
    После этого DVD можно проигрывать с жесткого диска командой:
    
       mplayer dvd:// -dvd-device /home/DVDrip
    
    Предположим, у диска есть несколько звуковых дорожек (с дубляжом и без) 
    и несколько субтитров (русские-английские). Задача - разодрать DVD на 
    два avi (с разными звуковыми дорожками, поскольку контейнер avi не 
    позволяет иметь одновременно несколько дорожек) и отдельно иметь русские 
    и английские субтитры.
    
    В первую очередь выясним размер черной рамки на DVD. 
    Для этого запустим DVD с середины и запустим автоматическое определение полей:
    
       mplayer dvd://1 -dvd-device ./ -vf cropdetect -ss 50:00
    
    Кодирование самого видео можно сделать с помощью двухпроходного 
    кодирования два раза для каждого из языков. При этом первый проход можно 
    сделать всего один раз (в итоге получится трёхпроходное кодирование):
    
       mencoder dvd:// -dvd-device /home/DVDrip -vf crop=688:320:24:130 -oac lavc -ovc lavc \
          -lavcopts vcodec=mpeg4:vhq:vqmin=2:autoaspect:v4mv:mbd=2:trell:vpass=1 -o /dev/null
    
    (единственный результат сего действа файл divx.log , используемый при 
    вторых проходах)
    
       mencoder dvd:// -dvd-device /home/DVDrip -alang=ru \
          -vf crop=688:320:24:130  -oac lavc -ovc lavc \
          -lavcopts vcodec=mpeg4:vhq:vqmin=2:autoaspect:v4mv:mbd=2:trell:vpass=1    -o out[ru].avi
    
       mencoder dvd:// -dvd-device /home/DVDrip -alang=en \
          -vf crop=688:320:24:130 -oac lavc -ovc lavc \ 
          -lavcopts vcodec=mpeg4:vhq:vqmin=2:autoaspect:v4mv:mbd=2:trell:vpass=2 -o out[en].avi
    
    (качества звука и видео я не касаюсь, пусть они будут на вашей совести)
    
    Т.е. теперь есть две авишки (out[ru].avi/out[en].avi) - с дубляжом и 
    без. 
    Я люблю смотреть заграничные фильмы без дубляжа, но поскольку не 
    слишком хорошо знаю язык, 
    то предпочитаю иметь перед глазами субтитры.
    
    Субтитры в формате vobsub выдрать из DVD легко, но они будут храниться в 
    виде картинок, а не текста. Их размер примерно 4-2 МБ. Если для вас это 
    некритично, 
    то можно остановится на этом, иначе можно попробовать их OCR-ить, что не слишком 
    легко организовать под Линуксом.
    
    Итак:
    
       mencoder -alang en -slang en -dvd-device /home/DVDrip dvd:// -ovc copy \
          -oac copy -o /dev/null -vobsubout subtitles-en
       mencoder -alang en -slang ru -dvd-device /home/DVDrip dvd:// -ovc copy \
          -oac copy -o /dev/null -vobsubout subtitles-ru
    
    В итоге получится по паре файлов с расширениями .sub и .idx
    
    Вообщем-то, не каждый медиа-проигрыватель понимает это формат, но с mplayer-ом
    в этом смысле всё в порядке:
    
       mplayer out[en].avi -vobsub subtitles-ru -spuaa 4 
    
    Заметьте, что в параметре vobsub субтитры должны быть указаны без расширения, 
    а spuaa включает интенсивное сглаживание субтитров.
    
     
    ----* Пакетная запись UDF в linux (доп. ссылка 1)   Автор: Vermus  [комментарии]
     
    Как писать UDF в режиме пакетной записи, при помощи программы udftools.
    
    1) В файле /etc/default/udftools раскомментировать 
        DEVICES="/dev/hd?" (у меня /dev/hdb)
    
    2) Вставляем диск.
    
    3) Форматируем RW. 
        #dvd+rw-format -f /dev/hdb
    
    4) Создаем на диске UDF fs
        #mkudffs /dev/hdb
    
    5) Запускам пакетную запись: 
        #/etc/init.d/udftools start
    
    6) Создать папку для монтирования: 
        # md /mnt/udf
    
    7) Монтируем диск (через пакетное устройство) 
        #mount -t udf -o utf8,noatime /dev/pktcdvd/0 /mnt/udf
    
    8) Используем диск как дискету
    
    9) Отмонтируем диск 
        #umount /mnt/udf
    
    10) Останавливаем пакетную запись: 
        #/etc/init.d/udftools stop
    
    11) eject
    
    После попыток записать файл более 1 Гб - он не прочитался.
    Эта ошибка решается компиляция нового ядра - последнее на данный момент 2.6.23. 
    Для этого при конфигурировании включаем поддержку UDF и поддержку пакетной записи. 
    Обновив ядро мы смело копируем диск UDF с файлом более 4 Гб.
    
     
    ----* Уменьшение размера стандартного LiveCD Fedora 7 (доп. ссылка 1)   [комментарии]
     
    Задача ужать стандартный GNOME-LiveCD Fedora7 до 400 Мб. 
    Ниже журнал действий.
    
    1. Извлекаем из iso образа LiveCD squashfs.img.
    
       mount -o loop ./Fedora-7-Live-i686.iso /mnt/cdrom
       копируем все в отдельную директорию директорию /mnt/disk/LiveCD/newcd
       umount /mnt/cdrom
    
    
    2. Монтируем squashfs.img и извлекаем из него os.img
    
       mount -o loop -t squashfs /mnt/disk/LiveCD/newcd/squashfs.img /mnt/cdrom
       копируем содержимое в /mnt/disk/LiveCD/new_ext3
       umount /mnt/cdrom
    
    
    3. Монтируем ext3 образ /mnt/disk/LiveCD/new_ext3/os.img
    
       mount -o loop /mnt/disk/LiveCD/new_ext3/os.img /mnt/disk/LiveCD/new_ext3/sysroot
    
    
    4. Удаляем лишнее и устанавливаем недостающее.
    
       chroot /mnt/disk/LiveCD/new_ext3/sysroot /bin/sh
       su -
       mount /proc
       mount /sys
       rm -rf /usr/share/doc
       в /usr/share/locale/ - оставляем только русские и английские локали
       cd /usr/share/icons; rm -rf Bluecurve gnome
       В /usr/share/pixmaps заменяем недостающее, чистим pixmaps/backgrounds/
       копируем свою фоновую картинку   
         cp  background.jpg /usr/share/gdm/themes/FedoraFlyingHigh
         cp  background.jpg /usr/share/backgrounds/images/default.jpg
        Чистим /usr/share/backgrounds
       Удаляем пакеты с китайскими шрифтами:
       rpm -e fonts-chinese fonts-arabic fonts-korean fonts-japanese
       Если rpm ругается, делаем "rpm --rebuilddb"
       Если нужно создать какие-то директории или произвести действия в момент старта livecd 
          правим fedora-live в /etc/rc.d/init.d
       Ставим желаемые пакеты, например, конфигуратор PPTP:
        rpm -Uvh http://pptpclient.sourceforge.net/yum/stable/fc7/pptp-release-current.noarch.rpm
        yum --enablerepo=pptp-stable install pptpconfig
       ....
       umount /proc
       umount /sys
    
    
    5. После приведения os.img в нужный вид, создаем новый пустой os.img и 
    копируем содержимое старого (нужно забить образ нулями, чтобы он лучше сжался, 
    иначе изменения будут только в метаданных и итоговый образ squashfs после
    сжатия получиться больше чем начальный).
    
       cd mnt/disk/LiveCD/new_ext3
       dd if=/dev/zero of=new_os.img bs=1k count=4096k
       /sbin/mkfs.ext3 -F -L "LiveCD" -m 1 new_os.img
       /sbin/tune2fs -c0 -i0 -Odir_index -ouser_xattr,acl new_os.img
    
       Монтируем новый образ
       mkdir /mnt/disk/LiveCD/new_ext3/new_sysroot
       mount -o loop ./new_os.img /mnt/disk/LiveCD/new_ext3/new_sysroot
    
       Копируем содержимое старого через rsync, чтобы сохранить расширенные атрибуты файлов.
       rsync -a -v --acls --xattrs --hard-links /mnt/disk/LiveCD/new_ext3/sysroot /mnt/disk/LiveCD/new_ext3/new_sysroot
    
       незабываем размонтировать и переименовать новый образ
       umount /mnt/disk/LiveCD/new_ext3/sysroot
       umount /mnt/disk/LiveCD/new_ext3/new_sysroot
       rm  /mnt/disk/LiveCD/new_ext3/new_sysroot
       mv /mnt/disk/LiveCD/new_ext3/new_os.img /mnt/disk/LiveCD/new_ext3/os.img
    
    
    6. Сжимаем ext3 образ
    
       rm /mnt/disk/LiveCD/newcd/squashfs.img
       cd /mnt/disk/LiveCD/new_ext3/
       /sbin/mksquashfs os.img sysroot /mnt/disk/LiveCD/newcd/squashfs.img
    
    
    7. Создаем iso образ для записи на CD:
    
       mkisofs -o ./live.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 \
         -boot-info-table -J -r -hide-rr-moved -V "Fedora-7-Live-i386" /mnt/disk/LiveCD/newcd/
    
      Если появится желание изменить метку диска Fedora-7-Live-i386, не забудьте поменять ее в isolinux/isolinux.cfg
    
     
    ----* Запись фалов 4Gb и более на DVD   Автор: Kroz  [комментарии]
     
    ISO9660 не позволяет писать файлы 4Gb и более. Потому про mkisofs можно забыть. 
    Используется файловая система UDF. Замечательно читается в более-менее последних версиях Windows.
    
    Для этого нам нужны udftools: http://sourceforge.net/projects/linux-udf/
    
    Алгоритм таков: создаем образ на жестком диске, копируем туда файл, записываем образ на DVD.
    
    Берем размер образа (в секторах) по следующей таблице:
    	DVD-R/DL = 4,171,712
    	DVD+R/DL = 4,173,824
    	DVD-R/SL = 2,298,496
    	DVD+R/SL = 2,295,104
    Размер сектора 2048 байт
    Возмем DVD+R/single layer для примера.
    
    Делаем образ:
       $ dd if=/dev/zero of=/mnt/data/image.udf bs=2048 count=2295104
    	
    Создаем файловую систему:
       mkudffs --lvid=Volume\ name /mnt/data/image.udf
    	
    Монтируем образ:
       sudo mount -o loop /mnt/data/image.udf /mnt/dvdimage
    	
    Аналогичная запись в fstab:
       /mnt/data/image.udf  /mnt/dvdimage   udf   noauto,rw,users,loop=/dev/loop0 0 0
    	
    Копируем файлы. Размонтируем образ.
    
    Записываем образ на диск:
    	
       growisofs -dvd-compat -Z /dev/dvd=/mnt/data/image.udf 
    
    Примечания:
     - Если не ошибаюсь, опиция -dvd-compat нужна только на DVD-R и не нужна на DVD+R. 
    Но проблем замечено не было, даже когда писалось с -dvd-compat на DVD+R.
    
     - Образ замечательно пишется каким-нибудь k3b, вот только проверить его неудастся (поскольку это не ISO 9660)
    
     - UDF поддерживает пользователей, права, хардлинки, и по-моему симлинки. 
    Так что можно использовать для бекапа. Вот только в Windows XP такие вещи интересно читаются: 
    хардлинки - просто файл копируется, а симлинки - создается файл нулевой длины
    
     - в Линуксе работа с udf (например просмотр директорий) происходит чуть медленнее, 
    с ISO9660, особенно если там хардлинки и симлинки.
    
     - САМОЕ ВАЖНОЕ: В ядрах 2.6.17 и выше, вы не сможете записать на UDF файл более 1Gb. 
    Поддержку больших файлов из UDF убрали мотивируя тем, что драйвер как-то портит
    что-то в памяти в ядре.
    Лично я глюков не заметил. Хоть у меня стоит 2.6.20, я держу 2.6.16.19 именно для того, 
    чтобы записывать большие файлы. Поскольку каждый раз перегружаться неудобно, 
    смотрю в сторону lguest http://www.opennet.me/opennews/art.shtml?num=9698 http://lwn.net/Articles/218766/
    
     - используя UDF вы можете писать на DVD как на обычную дискету. См сюда: http://www.opennet.me/base/sys/udf_cdrom.txt.html . Сам пробовал - получалось :)
    
    Примечание: вообще IMHO замечательная файловая система. И почему разработку udftools прекратили? 
    Может найдется кто-то из глубокоуважаемого Linux- общества, который продолжит благородное дело?
    
     
    ----* Как проверить целостность записи на CD/DVD (доп. ссылка 1)   Автор: Gnot  [комментарии]
     
    Предположим, на CD/DVD был записан образ sep2006.iso.
    
    Вычисляем для него контрольную сумму:
       $ cat sep2006.iso | md5sum
       cc363de222ba6fe7455258e72b6c26ca  -
    
    Определяем число записанных в iso 2048 блоков:
       $ echo $(( $(ls -l sep2006.iso | awk '{ print $5 }') / 2048 ))
       169383
       или после выполнения mkisofs запоминаем цифру в строке "169383 extents written (330 MB)"
    
    Вычисляем контрольную сумму записанного диска:
       $ dd if=/dev/hdc bs=2048 count=169383 | md5sum
       cc363de222ba6fe7455258e72b6c26ca  -
    
     
    ----* Восстановление "битого" iso образа при помощи rsync   Автор: greyork  [комментарии]
     

    В данном примере показано восстановление образа снятого с "криво" записанного диска FreeBSD 6.0.

    1. Находим при помощи гугла rsync-зеркала с интересующими нас образами. Для задачи из примера их список можно увидеть здесь.

    Выбираем ближайшие зеркала с отметкой rsync напротив адреса: ftp2.ru.freebsd.org и ftp5.ru.freebsd.org.

    2. Узнаем какие "модули" доступны у выбранных rsync-серверов при помощи команды:

    
         rsync -n -vv ftp2.ru.freebsd.org::
    
    

    Ответ - два слова FreeBSD, откуда заключаем, что имя интересующего нас модуля - FreeBSD. Для сервера ftp5.ru.freebsd.org узнать имя модуля таким способом не удастся - этот сервер возвращает в ответ только информацию "рекламного" характера. Пояснения к команде: ключ -n не позволяет утилите rsync загружать ничего; ключ -vv позволяет увидеть на экране больше информации о происходящем; два двоеточия после имени сервера обязательны (можно использовать вместо них rsync:// перед именем сервера, но это длиннее).

    3. Изучаем расположение каталогов и файлов на сервере:

    
         rsync -n -vv ftp2.ru.freebsd.org::FreeBSD/
    
    

    К предыдущей команде добавлено имя модуля и следующий за ним слэш (/). Слэш нужен для указания того, что необходимо отобразить листинг директории, а не ее саму. В результате выполнения команды можно увидеть, что файловая структура (в данном случае) повторяет расположение файлов на FTP-сервере. После чего определяем где лежат искомые образы (листаем интересующие нас каталоги) и продолжаем. К сожалению, у меня не получилось заставить работать ключик --list-only из man rsync и пришлось находить вышеописанный способ методом научного тыка.

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

    
         readcd dev=ATA:1,0,0 speed=8 -noerror f=/path/to/6.0-RELEASE-i386-disc1.iso
    
    

    (Подробности в man readcd) И контрольная сумма образа не совпадает с суммой образа с официального веб-сайта.

    5. Восстанавливаем образ командой:

    
         rsync --stats --progress -z -vv \
          ftp5.ru.freebsd.org::FreeBSD/ISO-IMAGES-i386/6.0/6.0-RELEASE-i386-disc1.iso \
          /path/to/freebsd/6.0-RELEASE-i386-disc1.iso \
    
    

    Пояснения к команде: -z желателен для сжатия передаваемой информации (действенность не проверял); --stats выводит после окончания подробную информацию о сделанном; --progress отображает процент выполнения текущей задачи.

    6. Убеждаемся, что сумма восстановленного образа совпадает с суммой образа с официального сайта.

    Данным методом я восстановил образы дисков с FreeBSD 6.0, записанных при помощи программы Nero добрым человеком с толстым каналом. readcd ругался на эти диски в самом конце каждого из них. Входящий трафик, в моем случае, для обоих дисков составил меньше 1 Mb.

     
    ----* Скрипт для упрощения монтирования CD-ROMа   Автор: Антон  [комментарии]
     
    Вот такой простой скрипт:
    
    #!/bin/sh
    retval=`/sbin/mount | grep /mnt/cdrom`
    if [ -n "$retval" ];
    then 	/sbin/umount /mnt/cdrom 1> /dev/null 2> /dev/null
    	if [ "$?" -ne 0 ]; 
    	    then echo "Не могу размонтировать CDROM"
    	else echo "Размонтировал CDROM"
    	eject /dev/cdrom	
    	fi
    else	/sbin/mount /dev/cdrom 1> /dev/null 2> /dev/null
    	if [ "$?" -ne 0 ];
    	    then echo "Не могу смонтировать CDROM"
    	else echo "Примонтировал CDROM"
    	fi	
    fi
    
    
    П.С. копируем в каталог /sbin под именем cdm. Сам определяет состояние
    
     
    ----* Работа с DVD-RAM во FreeBSD как с жестким диском (доп. ссылка 1)   Автор: proff  [комментарии]
     
    Решение такое:
    
    1. сборка и инсталляция ядра с устройствами:
       device scbus
       device atapicam
       device cd
       device pass
    
    2. создание файлов устройств cd0, cd1 с помощью /dev/MAKEDEV
    
    3. disklabel -rw cd1c auto
    
    4. newfs cd1c
    4.1. Можно включить softupdates: tunefs -n enable cd1 
    
    5. mount /dev/cd1c /mnt/dvdram
    
    Все. Скорость записи ~ 1.2 Mb/s. 
    
     
    ----* Правильное обращение и хранение CD и DVD дисков. (доп. ссылка 1)   [комментарии]
     
    -наклейки на диски вредны
    -для длительного хранения CD-R и DVD╠R лучше чем CD-RW и DVD+-RW;
    -диски хранить в Jewel-Cases стоймя (как книги) а не лёжа или в "шпинделях";
    -в темном, прохладном(4 C-20 C) и сухом месте.
    
     
    ----* Как создать загрузочный "multiboot" CD, с несколькими загружаемыми ОС.   [комментарии]
     
    mkisofs -b bsd_boot.img -no-emul-boot -c boot.catalog.bsd \
            -eltorito-alt-boot -b lnx_boot.img -c boot.catalog.lnx \
            -r -J -D -o cd.iso src_cd_dir
    
     
    ----* Пример записи DVD дисков. (доп. ссылка 1)   [комментарии]
     
    На 4.7 DVD влазит 4.377 Гб или 4482 Мб.
    
    cdrecord-ProDVD или dvdrtools (DVD-R/-RW):
       mkisofs -split-output -V "volume_ID" -D -l -L -N -R -J -v -o DVD.iso директория
       dvdrecord -dev=0,0,0 -speed=2 -eject -v DVD.iso*
    
    dvd+rw-tools (DVD+R/+RW и не нужно отдельно создавать образ, можно писать в UDF):
       growisofs -speed=2 -Z /dev/scd0 -D -l -L -N -R -J /some/files
       growisofs -speed=2 -M /dev/scd0 -D -l -L -N -R -J /more/files
    Для записи готового ISO образа:
       growisofs -dvd-compat -Z /dev/scd0=image.iso
    
     
    ----* Как примонтировать iso образ диска в FreeBSD 5.x   Автор: Insane  [комментарии]
     
    Для начала:
       mdconfig -a -t vnode -u0 -f /share/iso/slackware-9.0-install.iso
    затем
       mount -t cd9660 /dev/md0 /mnt/iso
    
    Обратный процесс:
       umount /dev/md0
       mdconfig -d -u0
    
    p.s. Может не работать если в ядре нет "device md"
    
     
    ----* Как принудительно понизить скорость вращения CD-ROM.   [комментарии]
     
    Linux:
       hdparm -E 8 /dev/cdrom
       mount -o speed=8 /dev/cdrom /mnt/cdrom
    FreeBSD:
       cdcontrol -f /dev/acd0c speed 8
       http://cdspeed.narod.ru/
    
     
    ----* Как примонтировать iso-образ CD диска в FreeBSD   [комментарии]
     
    В /boot/loader.conf добавляем vn_load="YES" или подгружаем руками kldload vn.ko
    Монтируем:
        vnconfig /dev/vn0c /home/user/cdrom.iso
        mount -t cd9660 /dev/vn0c /mnt
    Размонтируем:
        umount /mnt
        vnconfig -u /dev/vn0c
    
     
    ----* Как разрешить в FreeBSD монтировать CD-ROM обычным пользователям (доп. ссылка 1)   [комментарии]
     
    /etc/sysctl.conf:
       vfs.usermount=1
       vfs.generic.usermount=1
    mount -t cd9660  /dev/acd0c /home/user/cdrom
    chmod 644 /dev/acd0c
    
     
    ----* Как эмулировать в FreeBSD ATAPI CDROM в качестве SCSI устройства, для записи CD через cdrecord (доп. ссылка 1)   [обсудить]
     
    man atapicam, если FreeBSD старая, то см. ссылку.
    Ядро нужно пересобрать с
      device ata
      device atapicd # or atapifd or atapist
      device atapicam
      device scbus
      device pass
      device cd  # or sa or da
    
     
    ----* Как примонтировать в FreeBSD CD-ROM с русифицированной FS, чтобы русские буквы не выглядели как вопросительные знаки.   Автор: lavr  [комментарии]
     
    cd /usr/ports/sysutils/cd9660_unicode
    make && make install
    грузить модуль через
       kldload /lib/cd9660_unicode/cd9660_[unicode|koi8-r|iso-8859-5|cp866].ko
    
     
    ----* Как подготовить WAV файлы из MP3 для записи аудио CD. (доп. ссылка 1)   [комментарии]
     
           mpg123 --cdr file.cdr file.mp3
           cdrecord -v speed=4 dev=0,0,0 -pad -audio *.cdr
    Для группы файлов:
           find . -name "*.mp3" -exec mpg123 --cdr {}.cdr {} \;
    Если полученный wav файл не в формате "16 bit, stereo, 44100 Hz"
    (проверить можно: "file file.wav", обычно mpg123 осуществляет преобразование автоматически):
           mpg123 -w file.wav file.mp3
           sox file.wav -r 44100 file_new.wav
    Для нормализации громкости удобно использовать:
           normalize -m *.wav
    
     
    ----* Как размонтировать занятый неизвестным процессом CDROM   [комментарии]
     
    fuser -k -m /mnt/cdrom - убить процессы использующие /mnt/cdrom
    umount /mnt/cdrom
    
     
    ----* Как создать мультисессионный CD-R или CD-RW   [обсудить]
     
    Перед записью первой сессии на CD-RW его нужно очистить:
    	cdrecord -dev 0,0,0 blank=fast или blank=full
    Запись первой сессии 
    	создаем iso первой сессии:
    	mkisofs -V "volume_ID" -D -l -L -N -R -J -v -o 1.iso dir1
    	cdrecord -v speed=4 -dev=0,0,0 -multi 1.iso
    Записываем последующие сессии:
    	Получаем информацию о предыдущей сессии (для -C в mkisofs):
    	cdrecord -msinfo -dev=0,0,0
    	Создаем вторую директорию dir2 как dir1/dir2.
    	Создаем образ второй сессии:
    	mkisofs -M /dev/scd1 -C start_rec,end_rec -D -l -L -N -R -J -v -o cdrom.iso dir1
            Записываем на CD вторую сессию:
    	cdrecord -v speed=4 dev=0,0,0 -multi 2.iso
    PS. для некоторых приводов нужно писать cdrecord -multi -data
    
     
    ----* Как записать мультимедийный CD-R содержащий и музыку и данные.   [комментарии]
     
    Грабим звуковые треки с аудио CD:
    	cdda2wav -B -v255
    Записываем нужные звуковые треки на новый CD:
    	cdrecord -dev 0,0,0 -multi -audio file1 ..
    Создаем образ данных (вместо 0,0 результат выполнения cdrecord -msinfo):
    	mkisofs -C 0,0 -o cdrom.iso директория_с_данными
    Дописываем данные:
    	cdrecord -dev 0,0,0 -multi cdrom.iso 
    	или cdrecord -dev 0,0,0 -data cdrom.iso
    
     
    ----* Как преобразовать аудио-CD/wav в набор .MP3 файлов   [комментарии]
     
    Получить информацию о треках:
        cdparanoia -vsQ
    Записать все треки как WAV файлы:
        cdparanoia -B -s -w -S 24 --
    Преобразовать WAV в MP3:
        bladeenc -br 192 -delete -prio=HIGHEST *.wav
    или
        lame --preset standard  *.wav # рекомендуется, лучшее качество, br~192
        lame --preset fast standard  *.wav
        lame --preset 192  *.wav
        oggenc -q 10 -b 192 *.wav
    
     
    ----* Команды cdrecord полезные при записи CDROM   [комментарии]
     
    Создание ISO образа:
    
       mkisofs -V "volume_ID" -D -l -L -N -J -R -v -o cdrom.iso директория
    
    Пример записи образа на CD-R/RW диск:
    
       cdrecord -dev=0,1,0 -speed=4 -v cdrom.iso
       cdrecord dev=ATAPI:0,0,0 -v cdrom.iso
       wodim -dev=/dev/cdrw -speed=16 -eject -v cdrom.iso 
    
    где, 
       -speed=4 - скорость записи, 
       -v - вывод информации о процессе записи
       -dev=0,1,0 - записывающее устройство, определяется через cdrecord -scanbus, можно сразу указывать устройство, например, /dev/cdrw
       wodim - название модифицированной команды cdrecord в Debian/Ubuntu
    
    Чистка CD-RW перед записью:
       cdrecord -dev=/dev/cdrw -v blank=fast
    
    
    Для подключения IDE накопителя в старых Linux ядрах нужно было добавить в linux lilo 
       append="hdc=ide-scsi" 
    и включить в ядре поддержку эмуляции SCSI.
    
    
    
    Некоторые полезные опции.
       -toc -atip -prcap - выдать полную информацию о накопителе.
       -scanbus - определить параметры для -dev (можно /proc/scsi/scsi)
       -dummy - запись в режие тестирования (без реального прожигания диска).
       -fix - исправить недописавшийся диск.
       -eject - после записи вытащить CD
       -blank=all очистить CR-RW перед записью.
       -checkdrive - найти подходящий драйвер устройства, затем можно прописать в -driver=?
       -audio - запись аудио диска (см. cdda2wav).
       mkisofs -print-size - расчитать скролько потребуется места для записи директории.
       
    Создание ISO образа с CD/DVD диска (readom - вариант readcd в Debian/Ubuntu): 
    
       readcd dev=0,0,0 f=cdimage.raw                                                 
       readom dev=/dev/cdrw f=cdimage.raw   
    
    Создание wav-файлов из звукового CD:
    
       cdda2wav -S 32 -D /dev/cdrom -v 255 -B                                         
      
    Создание звукового CD из mp3:
                                                       
       find . -name "*.mp3" -exec mpg123 --cdr {}.cdr {} \;                            
       cdrecord -v speed=4 dev=0,0,0 -pad -audio *.cdr
    
     
    ----* Как создать ISO образ и 1 в 1 скопировать CD-ROM   [обсудить]
     
    mkisofs -b файл_с_образом_загрузочной_дискеты  \
      -c файл_куда_будет_помещен_boot.catalog \
      -d -N -D -R -J -T -V "название" -P "копирайт" \
      -o файл_куда_записать_образ \
      директория_с_корнем_создаваемого_образа
    
    Посмотреть созданный образ можно примонтировав его как loop раздел:
       mount cd_image.iso -r -t iso9660 -o loop /mnt/cdrom
    
    Копирование 1 в 1:
       dd if=/dev/scd0 of=cdimage.iso
       cdrecord -v dev=0,0,0 speed=2 -isosize cdimage.iso
    
    Значение "dev=" определяется запуском cdrecord -scanbus
    
    PS. Вместо "dd" более правильно делать (не читает лишний "хвост" пустых
    секторов и корректирует ошибки):
       readcd dev=0,0 f=cdimage.iso
    
     
    ----* Как примонтировать cdrom с русскими файлами   [комментарии]
     
    В Joliet файлы хранятся в unicode, соответственно codepage=unicode.
    Если файлы записаны в 866 кодировке нужно добавить ",codepage=866"
    mount -t iso9660 -o iocharset=koi8-r,ro,noexec,mode=0444  /dev/cdrom  /mnt/cdrom
    или  в /etc/fstab:
    /dev/cdrom /mnt/cdrom iso9660 noauto,user,ro,noexec,mode=0444,iocharset=koi8-r
    а затем:  mount /mnt/cdrom
    
     
    ----* Как в Solaris примонтировать локально .iso образ.   [комментарии]
     
      lofiadm -a cdrom.iso
      mount -F hsfs /dev/lofi/1 /mnt
      umount /mnt
      lofiadm -d /dev/lofi/1
    
     

       Wine

    ----* Включение bash и инструментария Ubuntu в Windows 10 (доп. ссылка 1)   [комментарии]
     
    В выпущенном вчера обновлении 14316 к 64-разрядному Windows 10 добавлена
    прослойка WSL, транслирующая системные вызовы Linux в системные вызовы Windows и
    позволяющая развернуть в основном окружении Windows полноценный
    инструментарий Ubuntu Linux без эмуляции и виртуализации.
    
    Для установки окружения Ubuntu в Windows 10 следует выполнить следующие шаги:
    
    В системе необходимо установить свежее обновление Insider Preview Build 14316,
    для чего следует принять участие в программе Windows Insider,
    зарегистрировавшись на сайте http://insider.windows.com
    
    Активируем доступную для участников Windows Insider функцию установки
    расширенных обновлений (System Settings --> Advanced Windows Update).
    
    
    
    Переводим систему на максимальный уровень оперативности доставки новых
    обновлений ("the fast ring"), переместив ползунок в крайне правое положение;
    
    
    
    Включаем режим разработчика (developer mode").
    
    
    
    Инициируем проверку наличия обновлений, устанавливаем все доступные обновления
    и перезагружаем систему.
    
    
    
    После перезагрузки включаем опцию "Windows Subsystem for Linux (Beta)", которая
    пока доступна только для 64-разрядных сборок Windows.
    
    
    
    Второй раз перезагружаем систему.
    
    В меню Stаrt набираем bash, выполняем "bash.exe", соглашаемся с правилами
    использования сервиса, ждём окончания загрузки компонентов Ubuntu  и получаем
    традиционное приглашение командной строки Ubuntu с большинством основных утилит.
    
    
    
    
    
    
    Для использования традиционного для Ubuntu шрифта в консоли, загружаем шрифт с
    сайта http://font.ubuntu.com, извлекаем из zip-архива UbuntuMono-R.ttf и
    устанавливаем его через двойной клик в проводнике. Далее меняем настройки в
    реестре, установив параметр
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont
     в значение "Ubuntu Mono". В настройках консоли выбираем шрифт Ubuntu.
    
    
    
     
    ----* Установка Darling для экспериментов с запуском приложений Mac OS X в Linux (доп. ссылка 1)   [комментарии]
     
    В прошлом году был представлен достаточно перспективный проект  Darling,
    нацеленный на предоставление возможности запуска в Linux приложений, собранных
    для OS X. По своей сути проект напоминает Wine, и по аналогии с тем, как Wine
    запускает написанные для Windows программы, Darling  позволяет установить и
    запустить программы, созданные для OS X и поставляемые в форме пакетов ".dmg" и ".pkg".
    
    На текущей стадии развития Darling представляет в основном экспериментальный
    интерес, так как позволяет запускать лишь некоторые консольные программы,
    собранные для OS X, такие как Midnight Commander, Bash, VIM и GCC.
    
    Для установки Darling пользователи Gentoo Linux могут воспользоваться готовым оверлеем.
    
    Для установки Darling  в Ubuntu Linux 13.04 можно использовать следующую инструкцию:
    
    Устанавливаем clang и сборочные зависимости:
    
       sudo apt-get install git cmake clang nasm g++ checkinstall
       sudo apt-get install libxml2-dev libgnutls-dev libicu-dev libcairo-dev \\
                         libjpeg-dev libpng-dev libtiff-dev libbsd-dev libudev-dev \\
                         liblcms-dev libkqueue-dev libssl-dev libbz2-dev uuid-dev \\
                         libncurses-dev libxrandr-dev
    
    Собираем утилиту GNUstep Make:
    
       git clone https://github.com/gnustep/gnustep-make.git
       cd gnustep-make
       CC=clang CXX=clang++ ./configure
       sudo make install
    
    Примечание: для более корректной установки программы в систему, здесь и далее
    вместо "sudo make install" следует использовать "sudo checkinstall", которая
    установит программу в форме пакета.
    
    
    Собираем GNUstep Libobjc2
    
       git clone https://github.com/gnustep/gnustep-libobjc2.git
       cd gnustep-libobjc2
       OBJCFLAGS=-fblocks CC=clang CXX=clang++ cmake .
       rm GNUmakefile
       make
       sudo make install
    
    
    Собираем GNUstep Base
    
       git clone https://github.com/gnustep/gnustep-base.git
       cd gnustep-base
       OBJCFLAGS=-fblocks CC=clang CXX=clang++ ./configure
       make
       sudo make install
    
    
    Собираем GNUstep GUI:
    
       git clone https://github.com/gnustep/gnustep-gui.git
       cd gnustep-gui
       OBJCFLAGS=-fblocks CC=clang CXX=clang++ ./configure
       make
       sudo make install
    
    Собираем GNUstep Opal:
    
       git clone https://github.com/gnustep/gnustep-opal.git
       cd gnustep-opal
       OBJCFLAGS=-fblocks CC=clang CXX=clang++ make
       sudo make install
    
    Собираем GNUstep CoreBase:
    
       git clone https://github.com/gnustep/gnustep-corebase.git
       cd gnustep-corebase
       OBJCFLAGS=-fblocks CC=clang CXX=clang++ ./configure
       make
       sudo make install
    
    Собираем Darling:
    
       git clone -r https://github.com/LubosD/darling.git
       cd darling
       CC=clang CXX=clang++ cmake .
       make
    
    Запускаем приложение OS X
    
      ./dyld osx-программа аргументы
    
     
    ----* Предотвращение запуска Wine любым пользователем   Автор: Artem S. Tashkinov  [комментарии]
     
    Данная заметка не является способом запрещения запуска Windows-приложений
    из-под Wine, она служит лишь целью предотвращения запуска Wine любым
    пользователем, который не желает случайно это сделать.
    
    Простейший пример, связанный с безопасностью: известно, что крайне нежелательно
    запускать Windows приложения из-под  пользователя root, ибо Wine в этом случае
    имеет доступ ко всем ресурсам компьютера. Учитывая так же, что
    Windows-приложения в Wine могут выполнять любые команды Unix, то можно
    представить масштаб возможных проблем при запуске вредоносного ПО.
    
    Решение крайне простое. В домашней директории пользователя достаточно создать
    пустой файл ".wine" (без кавычек). В этом случае запуск Wine приведёт к ошибке:
    
       # wine stduviewer.exe
    
       wine: /root/.wine is not a directory
    
    Никакие другие действия выполнять больше не нужно.
    
     
    ----* Использование сервиса Netflix в Ubuntu Linux (доп. ссылка 1)   [комментарии]
     
    Метод использования в Linux сервиса потокового видеовещания Netflix сводится к
    использованию специально модифицированной версии Wine в сочетании с запуском
    Windows-сборки Firefox с официальным плагином Silverlight. Moonlight невозможно
    использовать из-за наличия DRM-механизмов защиты контента в Netflix. По этой же
    причине требуется пересобрать Wine с 5 патчами, реализующими дополнительные
    механизмы проверки безопасности.
    
    Устанавливаем зависимости, необходимые для переборки Wine:
    
       sudo apt-get build-dep wine 
    
    Загружаем свежий срез репозитрия Wine:
    
       sudo apt-get install git
       git clone git://source.winehq.org/git/wine.git ~/wine-git
       cd ~/wine-git
    
    Накладываем патчи:
    
       wget -O part1.patch http://source.winehq.org/patches/data/91645 && patch -p1 < part1.patch
       wget -O part2.patch http://source.winehq.org/patches/data/91646 && patch -p1 < part2.patch
       wget -O part3.patch http://source.winehq.org/patches/data/91647 && patch -p1 < part3.patch
       wget -O part4.patch http://source.winehq.org/patches/data/91648 && patch -p1 < part4.patch
       wget -O part5.patch http://source.winehq.org/patches/data/91649 && patch -p1 < part5.patch
    
    Компилируем Wine:
    
       ./configure && make
    
    При ошибке "configure: error: FreeType development files not found. Fonts will
    not be built" доустанавливаем
    
       sudo apt-get install libfreetype6-dev
    
    Устанавливаем  Firefox и Silverlight 4 (Silverlight 5 пока не работает в Wine):
    
       wget -O Firefox-14.0.1.exe http://download.mozilla.org/?product=firefox-14.0.1-funnelcake13&os=win&lang=en-US; wine Firefox-14.0.1.exe /S
    
       wget -O Silverlight-4.exe http://silverlight.dlservice.microsoft.com/download/6/A/1/6A13C54D-3F35-4082-977A-27F30ECE0F34/10329.00/runtime/Silverlight.exe; wine Silverlight-4.exe /q
    
    Запускаем Firefox и открываем в нём сайт Netflix:
    
       ./wine "C:\\\\Program Files\\\\Mozilla Firefox\\\\firefox.exe" http://netflix.com/
    
    <p>Дополнение: Создан готовый PPA-репозиторий с модифицированной версией Wine.
    Для установки следует выполнить:
    
       sudo apt-add-repository ppa:ehoover/compholio
       sudo apt-get update
       sudo apt-get install netflix-desktop
    
    После чего в dash можно найти и запустить приложение Netflix
    
     
    ----* Работа с игровым сервисом OnLive в Ubuntu Linux 11.04 при помощи Wine (доп. ссылка 1)   [комментарии]
     
    Устанавливаем Wine и инструменты для пересборки Wine:
    
       sudo add-apt-repository ppa:ubuntu-wine/ppa 
       sudo apt-get update
       sudo apt-get install wine1.3
       sudo apt-get install git autoconf checkinstall
       sudo apt-get build-dep wine1.3
    
    Загружаем самую свежую версию Wine (работа проверена с Wine 1.3.27) из Git-репозитория проекта:
    
       git clone git://source.winehq.org/git/wine.git ~/wine-git
    
    Переходим в директорию с кодом и загружаем патч с правками для запуска OnLive:
    
        cd ~/wine-git
        wget http://bugs.winehq.org/attachment.cgi?id=35873 -O wine_rawinput_8_8_2011.patch
    
    Накладываем патч:
    
        patch -p1 < wine_rawinput_8_8_2011.patch
    
    Собираем Wine:
    
        autoreconf
        ./configure
        make depend
        make
    
    Подготовим пакет для собранной версии без его установки (пока не будем заменять
    штатную версию Wine и поэкспериментируем с запатченной версией отдельно):
    
        checkinstall -D --install=no
    
    Загружаем установочный файл для OnLive:
    
        wget http://www.onlive.com/d/windows -O OnLive_Setup.exe
    
    Запускаем его 
    
        ./wine OnLive_Setup.exe
    
    После завершения установки запускаем итоговый OnLive.exe:
    
       ./wine ~/.wine/drive_c/Program\ Files/OnLive/OnLive.exe
    
     
    ----* Основы работы с Wine для начинающих   Автор: Владимир  [комментарии]
     
    Введение
    
    Статья посвящена Wine и всем аспектам его использования. В сети находится очень
    много информации, есть различные руководства по настройке и многое другое. Я
    постараюсь объединить все для того чтобы любой человек смог достичь
    максимального успеха, в пределах своих способностей и конечно возможности
    программы.  Итак - начнем.
    
    Wine - это отдельная реализация Windows API, а не эмулятор, как большинство
    думают. Не единожды повторялось, но и здесь будет уместно. Это и делает проект
    уникальным и интересным для пользователей различных систем, открывает различные
    пути для реализации своих идей. Уникальность заключается в том, что с помощью
    этой программы можно запускать Windows приложения в Ubuntu и других
    Linux-системах, а также во FreeBSD и в Mac OS X. Правда и тут есть свои
    "подводные камни". Некоторые думают то что будет легко перейти с одной системы
    на другую, в данном случае мы рассматриваем Windows и Linux.
    
    Заблуждение заключается в том что люди думают что у них получиться запустить из
    под Wine различный софт, к которому они привыкли и им удобно в нем работать.
    Как не крути просто так ничего не бывает. Чтобы заработал наш любимый софт под
    Wine нужно попотеть, перечитать кучу руководств и взвесить этот объём
    информация. Проект Wine развивается очень быстро, но до стабильной работы ему
    очень далеко. Но думаю что в скором будущем весь основной софт, а также игры
    будут работать на нем стабильно.
    
    Установка Wine
    
    Первый вопрос человека который только что перешёл на Linux (в нашем случае
    Ubuntu): "Как я буду запускать программы из Windows?". Он начинает поиск на эту
    тему и естественно натыкается на Wine.
    Второй вопрос: "Как его поставить?". Есть два способа:  Поставить из
    официальный репозиториев или скомпилировать самому из исходников. Мы рассмотрим
    оба варианта.
    
    Вариант 1: Установка из репозитория.
    
    Тут все очень просто. Идем в Приложения // Стандартные // Терминал:
    
       sudo add-apt-repository ppa:ubuntu-wine/ppa
       sudo apt-get update
       sudo apt-get install wine1.3.
    
    Ждем завершения установки....
    Всё! Wine установлен и можно пробовать устанавливать игры и программы.
    
    
    Вариант 2: Компилирование из исходников.
    
    1.Скачиваем исходники с официального сайта, там они присутствуют. В моё случае
    это Wine 1.3.11 (http://sourceforge.net/projects/wine/files/Source/wine-1.3.11.tar.bz2/download).
    
    2. Распаковываем исходники.
    Дальше вводим в терминале следующие команды:
    
    переходим в директорию, в которую был распакован архив с исходными текстами:
    
       cd wine-1.3.11/ 
    
    Перед компиляцией надо включить поддержку OpenGL. Если мы этого не сделаем
    приложения которым нужен OpenGL работать не будут. В терминале:
    
       gedit tools/wineinstall
    
    Находим строку, начинающуюся с CONFARGS=, и после вписываем в нее нужные
    параметры сборки. В нашем случае строка будет выглядеть так:
    
       CONFARGS="--enable-opengl --disable-debug --disable-trace"
    
    Получаем зависимости:
    
       sudo apt-get install auto-apt checkinstall
       sudo auto-apt -y run ./configure 
    
    Собираем:
    
       make
    
    Устанавливаем через создание пакета, вместо make install
    
      sudo checkinstall
    
    Всё. Ждем окончания установки.
    
    
    Рассмотрим плюсы и минусы каждого из вариантов.
    
    Вариант 1.
    Плюсы:
    1. За нас уже все собрано и пыжиться не надо, все уже готово к употреблению.
    
    Минусы:
    1. Мы не сможем применить патч, например для улучшения работы какой нибудь игрушки.
    2. Нестабильная работа на некоторых видеокартах.
    
    Вариант 2.
    Плюсы:
    1. Возможность применить патчи для улучшения работы
    2. Стабильная работа с нестабильными драйверами видеокарт.
    
    Минусы:
    1. Нет меню в Приложениях, что неудобно. Приходиться все делать из консоли,
    выходить в настройки Wine например.
    2. Процесс установки слишком долгий, зависит от мощности вашего компьютера.
    
    Я отдаю предпочтение второму вариант. Wine установленный таким образом работает
    лучше, чем установленный из репозиториев. Но это лишь мое маленькое ИМХО.
    
    
    Установка программ и игр
    
    Сперва мы идем на http://appdb.winehq.org/ Сверху, в поисковике вбиваем
    название игры или программы и смотрим что там написано. Обычно там описаны
    тесты на различных системах, рекомендации для стабильной работы и многое другое.
    
    Если программа работает без проблем, значит с чистой душой её устанавливаем
    простым кликом. Если это какая нибудь серьёзная игра или программа и без
    шаманства с бубном не обойтись - значит надо создавать отдельный префикс для
    наших танцев.
    Идем в наш домашний каталог и создаем новую директорию. Например .wine2.
    Дальше идем в терминал и вводим:
    
    
       WINEPREFIX="/home/username/.wine2/" winecfg
    
    Всё. Отдельный префикс создан. Там хранятся различные конфигурации реестра и сами программы.
    Установку программы также производим через консоль.
    
       WINEPREFIX="/home/username/.wine2/" wine /media/DVD/setup.exe
    
    Идет процесс установки и самое главное в отдельный префикс.
    Потом мы запускаем уже установленную программу, также из консоли и смотрим вывод.
    
    В выводе могут быть ошибки, о том что нет нужных компонентов и библиотек. В
    установке недостающих компонентов нам поможет winetricks (см. ниже)
    
    Что это дает? Это дает стабильную работу приложений в своем префиксе, если
    масса программ будет работать в одной префиксе, он рано или поздно засориться
    что приведет к сбою других программ. Поэтому нужно использовать отдельные
    префиксы, если не хотите все настраивать по много раз.
    
    
    Winetricks
    
    В правильной настройке префикса нам поможет winetricks.
    Winetricks - это скрипт, который устанавливает различные компоненты, которые
    требуются для работы приложения, например DirectX, Vcredist и многое другое.
    Как это скрипт работает? Он скачивает библиотеки и компоненты с
    Microsoft-овских ресурсов. Именно так, и никак по другому. Зачем этот скрипт
    нужен? Это очень упрощает работу с Wine-ом. Без скрипта мы бы сами лазили и
    искали нужные компоненты, а тут уже все сделано, надо только поставить галочку
    и нажать "Установить" Также этот скрипт помогает редактировать реестр,
    вписывать туда различные ключи. И помимо этого в winetricks есть много настроек
    и функций.
    
    Для ознакомления с ним просто введите в терминале winetricks
    
    
    Редактирование реестра
    
    В терминале вводим:
    
       regedit
    
    Мы в реестре. Редактировать нам ничего не надо, мы будет только добавлять.
    
    Идем в HKEY_CURRENT_USER/Software/Wine/Direct3D.
    
    Если каталога Direct3D нет, то не отчаиваемся. Я это пишу чтобы читатель понял
    где-то надо редактировать или добавлять.
    
    В терминале:
    
       winetricks ddr=opengl orm=fbo glsl=disabled videomemorysize=1024 
       (1024 меняете на свое)
    
    Все эти параметры появиться в реестре. Это можно посмотреть в папке указанной выше.
    
    Что это дает? Это улучшает производительность в играх, скорость и вообще игры
    работают от этого лучше, но это только для игр.
    
    
    PlayOnLinux
    
    Также существует PlayOnLinux. Это отдельная программа, которая использует Wine,
    но там более все автоматизированно и настроено. Программа сама скачает нужный
    Wine, установит компоненты и создаст отдельный префикс. Но это не значит что
    все будет идеально работать. Может вообще не работать. Так что я отдаю свое
    предпочтение обычному Wine, ручной настройке и работе собственного мозга, а не
    автоматизированной программе.
    
    Плюсы:
    Все автоматизированно и нам по сути делать ничего не надо.
    Можно держать несколько версий Wine и применять их для различных префиксов.
    Программа сама создает префиксы.
    
    Минусы:
    Все что делает программа, устанавливает и скачивает предугадать невозможно.
    Все что делает программа можно сделать самому, ручками, это + к знаниям человека.
    Программа "Робот" никогда не сравниться с человеческим мозгом.
    
    
    Монтирование образов CD/DVD-дисков
    
    В Windows есть для этого утилита под названием Daemon-Tools. Это очень удобная
    и не заменимая утилита. У человека возникает вопрос: Есть ли аналог этой
    чудо-утилиты? Ответ: Есть и намного лучше Windows утилиты. Называется она
    Cdemu. Для её установки нам требуется ввести всего лишь три команды:
    
     
       sudo add-apt-repository ppa:cdemu/ppa
       sudo apt-get update
       sudo apt-get install cdemu-daemon cdemu-client gcdemu
    
    Добавляем аплет на панель, указываем путь к образу и радуемся жизни. Не каких
    проблем не будет и Wine будет отлично определять образ.
    
    
    Запуск игр в отдельном Х-сервере
    
    Этому можно посветить целую книгу, но я остановился на одном способе, которым всегда пользуюсь:
    
    Переходим в виртуальный терминал:
       Ctrl + Alt + F1
       login: ******
       password: ******
    
    Запускаем вручную новую копию X-сервера:
    
       xinit -- :2
       wine путь/папке/c/игрой/game.exe
    
    Прирост от этого небольшой, но лично мне этого хватает. Ещё раз повторю:
    способов запуска в отдельном х-сервере много и каждый человек волен сам выбирать.
    
    Чтобы выйти нажимаем Ctrl + Alt + F1
    Ctrl + C
    Ctrl + Alt + F7 или F8 (у меня F8)
    Чтобы переключаться между системой и х-сервером
    Ctrl + Alt + F7 или F8 (переход к нашей системе или в х-сервер)
    
    
    
    Заключение
    Все эти советы, азы, которые должен знать каждый человек который хочет
    использовать Wine для достижения своих целей. Все остальное в ваших руках. Если
    вы хотите достичь цели не смотря не на что, а надежда уже уходит, не
    отчаивайтесь никогда, ибо решение может находиться у вас "перед носом". Усидеть
    на двух стульях возможно, но для этого нужно желание и стальные нервы. Желание
    - тысяча возможностей, не желание - тысяча причин.
    
    Данный материал написан для "Первого конкурса русскоязычных статей для ОС
    Ubuntu" (konkurs.ubuntu.ru)
    
     
    ----* Полная установка 1С 7.7 под управлением Wine в Ubuntu 10.04 (доп. ссылка 1)   Автор: acsbaks  [комментарии]
     
    Начинаем с добавления PPA-репозитория для установки свежего Wine: 
    
       sudo add-apt-repository ppa:ubuntu-wine/ppa
    
    Или через GUI: Система - Администрирование - Источники Приложений.
    Вкладка - Другое По. Добавляем - ppa:ubuntu-wine/ppa
    
    Устанавливаем свежий Wine:
    
       sudo aptitude update
       sudo aptitude install wine1.3 winetricks
    
    Устанавливаем библиотеку DCOM:
    
       winetricks dcom98 
    
    Копируем из Windows библиотеку MSVCRT40.DLL в директорию /home/usr/.wine/drive_c/windows/system/
    
    Устанавливаем MFC42.DLL
    
       winetricks MFC42.DLL
    
    Устанавливаем шрифты:
    
       winetricks corefonts
       winetricks tahoma
       winetricks lucida
    
    Если каких-то шрифтов не будет хватать - их можно взять из установленной где-нибудь Windows.
    
    Устанавливаем 1С 7.7, все должно пройти гладко.
    
    Запускаем в 1С конфигуратор баз и убираем галочку из меню "Окна - Панель Окон -
    Показать". Это нужно сделать раз для каждой базы и для каждого вида запуска -
    будь то конфигуратор, предприятие и т.п.
    
    Чтобы не было проблем с кодировкой - либо заходим в БД, меню "администрирование
    - кодовая страница таблиц ИБ" и меняем на "Текущая системная установка" и ждем.....
    
    Иногда это не совсем удобно, если БД используют машины с Windows, тогда создаем
    либо в директории с базой, либо в каталоге BIN 1C пустой файл OrdNoChk.prm
    
    Локальная версия должна заработать. Но это нам не интересно, нужно в базу заходить по сети.
    
    Качаем etercifts c сайта Etersoft (http://wiki.etersoft.ru/etercifs), он
    свободный и не требует оплаты. Устанавливаем (инструкции по нему - на
    етерсофте). После его установки потребуется перезагрузка.
    
    Открываем fstab и добавляем строки для монтирования нужных сетевых ресурсов
    
       //server1c/BaseBuh /home/usr/BaseBuh cifs 
          rw,user,username=WORKGROUP\имяпользователя,password=пароль,iocharset=utf8,noperm,forcemand,direct 0 0
    
    Монтируем:
    
       sudo mount /home/usr/BaseBuh
    
    Теперь каталог с базой у нас смонтирован, и мы можем добавить базу.
    
    Это же вновь не то, что хотелось, ведь база у нас на SQL-сервере.
    
       winetricks mdac25
       winetricks mdac28
       winecfg: sqlsrv32.dll - сторонняя.
    
    возможно мдак25 и не надо было сначала устанавливать, но так я делал.
    
    Проверяем:
    
       wine regedit
    
    "HKLM\Software\ODBC\ODBCINST.INI" - Должна быть папка с названием "SQL Server",
    если нет - копируем из Windows и проверяем путь: строковый параметр - Driver.
    
    Вуаля, заработала связка 1С+SQL.
    
    Но могут быть проблемы с нахождением сервера, в этом случае заходим в
    конфигуратор - "Администирование" - Параметры базы данных SQL и адрес сервера
    меняем с имени на его IP-адрес.
    
    1С мы запустили но мне, как разработчику плохо живется без OpenConf.
    Качаем последний OpenConf (http://openconf.1cpp.ru/).
    
    Перед установкой OpenConf, нужно поставить MS Visual Basic 6 runtime (нужен для
    регистрации c:/Program Files/1Cv77/BIN/config/system/svcsvc.dll)
    
       winetricks vb6run
    
    Поставить IE, нужен для регистрации wsc компонентов:
    
       winetricks ie6
    
    Зарегистрировать все WSC компоненты из каталога c:/Program Files/1Cv77/BIN/config/system
    
       wine regsvr32 /i:CommonServices.wsc C:/windows/system32/scrobj.dll 
       ... и т.д. для всех файлов
    
    Компонент OpenConf.RegistryIniFile.wsc надо регистрировать в последнюю очередь!
    
    Заметка про OpenConf была чуть модифицирована, ориганал.
    
    Осталась одна проблема с мертвым Enter-ом. В журнале документов либо в форме
    списка справочников он не работает!
    
    Предлагаю воспользоваться FormEx.dll (последняя версия  есть на
    http://www.dorex.ru/?download или можно найти на форуме
    http://1clinux.org/formex_t.zip )
    
    Далее извлекаем файл "FormEx.dll", складываем в каталог C:\Program files\BIN\
    
    Заходим в конфигуратор и:
    
    1. в процедуру "ПриНачалеРаботыСистемы()" добавляем:
    
       "
          Если ЗагрузитьВнешнююКомпоненту("FormEx.dll")=0 Тогда
                Предупреждение("Не удается загрузить внешнюю компоненту 1C++!",10);            
          КонецЕсли;      
       "
    
    2. создаём в глобальном модуле новую процедуру:
    
       "
       Процедура ПриНажатииКнопкиКлавиатуры(Конт, КодКл, Алт, Шифт, Контрл, Символ, ФСО)
          //Сообщить (КодКл);
          Если КодКл=13 Тогда
                Service = СоздатьОбъект("Сервис");
                Service.SendKeys("{TAB}");
           //КодКл=9;
          КонецЕсли;
       КонецПроцедуры
       "
    
    Заметка про FormEx основана на http://1clinux.org/index.php?topic=188.0
    
    Вот в принципе и все :) имеем полностью рабочую 1С, запущенную в свободном Wine.
    
    PS. Когда пытался запустить игрушки баловался с winetricks (d3dx9, directx9 и
    т.д.). И после этого панель окон стала нормально отображаться. 1С перестала
    вызывать ошибку и нормально работает (либо это связано с обновлением wine,
    которое было произведено незадолго до этого). В настройках Wine для 1С убрана
    лишь галочка - "разрешить менеджеру окон декорировать окна".
    
     
    ----* Вывод аудио с Linux/Unix PC на Windows PC   Автор: Artem Tashkinov  [комментарии]
     
    Иногда может возникнуть потребность вывести звук с Linux/FreeBSD/Unix
    компьютера на Windows компьютер. Сделать это безболезненно можно с помощью
    Pulse Audio.
    
    Как это осуществить:
    
    1. Скачайте Windows версию pulseaudio (http://www.cendio.com/pulseaudio/),
    pulseaudio-0.9.6-1.win32.zip (911 KiB).
    
    2. Распакуйте этот архив и создайте в папке с pulseaudio файл default.pa со следующим содержимым:
    
       load-module module-native-protocol-tcp listen=0.0.0.0 auth-anonymous=1
       load-module module-waveout
    
    3. Запустите файл pulseaudio.exe
    
    4. Добавьте pulseaudio.exe в список исключений брэндмауэра Windows или
    разрешите входящие соединения на порт 4713.
    
    5. На вашем Linux компьютере в файле /etc/pulse/client.conf добавьте следующую строку:
    
       default-server = 192.168.0.10
    
    заменив 192.168.0.10 на IP адрес Windows компьютера.
    
    Если у вас правильно настроен PulseAudio в Linux, то всё должно сразу заработать.
    
     
    ----* Установка Adobe Сreative Suite 4 в Wine (доп. ссылка 1)   [комментарии]
     
    Инструкция по установке Adobe CS 4 под управлением Wine 1.1.26 в Ubuntu 9.04
    
    Устанавливаем инструменты для сборки:
    
       sudo aptitude install build-essential checkinstall
    
    Создаем резервную копию конфигурации wine:
    
       mv ~/.wine ~/.wineBACKUP
    
    Удаляем ранее установленную старую версию wine:
    
       sudo aptitude remove wine
    
    Добавляем Launchpad PPA репозиторий с новейшими версиями Wine:
    
       sudo sh -c "echo 'deb http://ppa.launchpad.net/ubuntu-wine/ppa/ubuntu jaunty main' >> /etc/apt/sources.list"
       sudo sh -c "echo 'deb-src http://ppa.launchpad.net/ubuntu-wine/ppa/ubuntu jaunty main' >> /etc/apt/sources.list"
    
    Добавляем ключи, которыми подписаны пакеты:
    
       sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F9CB8DB0
    
    Обновляем информацию о содержимом репозиториев:
    
       sudo apt-get update
    
    Устанавливаем зависимости, необходимые для пересборки пакета с Wine:
    
       sudo apt-get build-dep wine
    
    Создаем директорию для сборки и переходим в нее:
    
       mkdir ~/source/
       cd ~/source/
    
    Загружаем исходные тексты wine и переходим в рабочую директорию:
    
       apt-get source wine
       cd wine*
    
    Загружаем и применяем дополнительные патчи, необходимые для установки Adobe CS4:
    
       wget http://bugs2.winehq.org/attachment.cgi?id=22139 -O pseudo_start_msi_MTA_thread.diff
       patch -p1 < pseudo_start_msi_MTA_thread.diff
    
    Собираем Wine из исходных текстов:
    
       ./configure
       make -j3 depend && make -j3
    
    Формируем пакет для Ubuntu:
    
       sudo checkinstall
    
    Загружаем winetricks и инициируем загрузку дополнительных модулей, необходимых
    для установки и работы Adobe CS4:
    
       wget http://www.kegel.com/wine/winetricks
       chmod a+x winetricks
       sudo mv winetricks /usr/local/bin/
       winetricks msxml6 gdiplus gecko vcrun2005 ie6 corefonts fontsmooth-rgb
    
    Загружаем из сети недостающую библиотеку atmlib.dll (находим от куда качать через поиск в Google):
    
       mv atmlib.dll ~/.wine/drive_c/windows/system32/
    
    Запускаем конфигуратор Wine и переходим в секцию накопителей (вкладка Drives),
    удаляем диск Z:, который указывает на корень ФС.
    Затем добавляем диск, указывающий на источник установки, например на корень
    инсталляционного CD/DVD/
    
    Переходим в каталог с установочным образом Adobe CS4 и запускаем процесс установки:
    
       cd /media/cdrom0/Adobe\ CS4/
       wine Setup.exe
    
    Следуем инструкциям на экране, выбрав параметры установки по умолчанию. Если
    кнопка "Next" не нажимается
    мышью, на нее следует переместить фокус через нажатие клавиши Tab и нажать Enter.
    В момент установки Illustrator может произойти крах, но после нажатия "Ok" установка продолжится.
    
     
    ----* Особенности запуска игры World of Warcraft в Ubuntu Linux (доп. ссылка 1)   Автор: vanoc  [комментарии]
     
    Первое, что необходимо сделать, это включить проприетарный видеодрайвер.
    Заходим в "Драйверы устройств", устанавливаем и перезагружаемся.
    
    Теперь проверка
    
       $ glxinfo | grep direct
       direct rendering: Yes
    
    Если получилось, то читаем дальше.
    
    Если wine не установлен - устанавливаем.
    
       sudo aptitude install wine
    
    Далее редактируем файл WoW/WTF/Config.wtf
    
    Добавляем строки:
    
       SET gxApi "opengl"
       SET ffxDeath "0"
       SET ffxGlow "0"
       SET M2UseShaders "0"
       SET Sound_SoundOutputSystem "1"
       SET Sound_SoundBufferSize "150"
       SET gxWindow "1"
    
    Теперь игра должна идти нормально, но есть ошибка с текстурами в помещениях. 
    Для исправления подредактируем wine реестр
    
       wine regedit
    
    Заходим в HKEY_CURRENT_USER\Software\Wine\ и создаем ключ Opengl
    В него добавляем строковое значение DisabledExtensions и вписываем GL_ARB_vertex_buffer_object
    
    Запускаем WoW командой
    
       wine WoW/wow.exe -opengl
    
    Ошибка с текстурами исчезла, правда миникарта в помещениях отображается белым.
    
     
    ----* Настройка сглаживания шрифтов в новых версиях Wine (доп. ссылка 1)   [комментарии]
     
    В версии Wine 1.1.12 добавлена поддержка субпиксельного рендеринга шрифтов. По
    умолчанию шрифты не сглаживаются, чтобы исправить ситуацию необходимо поменять
    несколько параметров.
    
    
    Сохраняем в файл test.txt:
    
       REGEDIT4
    
       HKEY_CURRENT_USER\Control Panel\Desktop]
       "FontSmoothing"="2"
       "FontSmoothingType"=dword:00000002
       "FontSmoothingGamma"=dword:00000578
       "FontSmoothingOrientation"=dword:00000001
    
    Меняем настройки:
    
       wine regedit test.txt
    
    где, "FontSmoothing"="2" - непосредственное включение сглаживания.
    
    FontSmoothingType"=dword:00000002 - режим сглаживания: 
       00000001 - Сглаживание градациями серого (старый метод)
       00000002 - Субпиксельное сглаживание (при сглаживании учитываются цвета)
    
    "FontSmoothingOrientation"=dword:00000001 - метод ориентации пикселов при
    сглаживании: 0 = BGR, 1 = RGB.
    
    
    
    
    
    Готовый скрипт для выполнения этой операции: http://files.polosatus.ru/winefontssmoothing.sh
    
    Непосредственно установку Windows шрифтов можно выполнить через winetricks:
    
       wget http://www.kegel.com/wine/winetricks
       sh ./winetricks allfonts
    
     
    ----* Установка Microsoft Office 2007 и IE7 в Ubuntu Linux 8.10 (доп. ссылка 1) (доп. ссылка 2)   [комментарии]
     
    Устанавливаем экспериментальную версию Wine 1.1.x:
    
    
       wget -q http://wine.budgetdedicated.com/apt/387EE263.gpg -O- | sudo apt-key add -
       sudo wget http://wine.budgetdedicated.com/apt/sources.list.d/intrepid.list -O /etc/apt/sources.list.d/winehq.list
       sudo apt-get update
       sudo apt-get install wine cabextract
    
    
    Устанавливаем вспомогательный shell-скрипт winetricks, для автоматизации установки недостающих DLL:
    
       wget http://www.kegel.com/wine/winetricks
       chmod +x ./winetricks
    
    Загружаем необходимые для  Microsoft Office 2007 библиотеки:
    
       ./winetricks gdiplus riched20 riched30 msxml3 msxml4 msxml6 corefonts tahoma vb6run vcrun6 msi2
    
    Вставляем в CD/DVD привод установочный диск с Office 2007 и запускаем  setup.exe
    
       wine путь_к_CD/setup.exe
    
    Установка Internet Explorer 6:
    
       ./winetricks ie6
    
    Установка Internet Explorer 7:
    
    Устанавливаем пакет cabextract:
    
       apt-get install cabextract
    
    Загружаем последнюю версию ies4linux:
    
       wget http://www.tatanka.com.br/ies4linux/downloads/ies4linux-latest.tar.gz
       tar xzf ies4linux-latest.tar.gz 
       cd ./ies4linux-2.99.0.1
       ./ies4linux --beta-install-ie7 --no-gui --no-flash
    
    Установка Windows сборки Firefox 3:
    
       ./winetricks firefox3
    
    
    Для установки игр и программ также можно использовать GUI интерфейс или shell
    скрипты с сайта http://www.playonlinux.com/
    
    Например скрипт для установки IE7 имеется готовый скрипт http://www.playonlinux.com/repository/?script=369
    Для Safari - http://www.playonlinux.com/repository/?script=118
    
     
    ----* Решение проблем с запуском Adobe PhotoShop в Ubuntu 8.04 (доп. ссылка 1)   Автор: silverghost  [комментарии]
     
    Если в момент запуска приложения в wine получаем ошибку:
    
       preloader: Warning: failed to reserve range 00000000-60000000
       err:dosmem:setup_dos_mem Cannot use first megabyte for DOS address space, please report
    
    Решить проблему можно убрав нижнюю границу маппинга адресов:
       sysctl -w vm.mmap_min_addr=0
    
    Для изменения системных установок правим содержимое файла /etc/sysctl.conf
    заменив "vm.mmap_min_addr = 65536" на "vm.mmap_min_addr = 0"
    
     
    ----* Установка IE6 под wine 0.9.60 без ie4linux (доп. ссылка 1)   [комментарии]
     
    Если Вы хотите установить Internet Explorer автоматически используйте  IEs4linux. 
    Это руководство для тех пользователей которые не хотят использовать IEs4linux. 
    
    1.Создаем новую конфигурацию wine в другой директории с помощью wineprefix. 
    
       wineprefixcreate --prefix ~/.wineIE6 
    
    2. Следующим шагом установим в переменной путь к каталогу  для IE6, выполняем 
    
       export WINEPREFIX="$HOME/.wineIE6"
    
    3.Необходимо удалит или переместить следующие файлы, иначе wine не даст при
    установке IE обновить эти файлы
    
       Program Files/Internet Explorer/iexplore.exe 
    
    в каталоге ~/.wineIE6/windows/system32 
    
       mshtml.dll
       shdoclc.dll
       shdocvw.dll
       shlwapi.dll 
       urlmon.dll
       wininet.dll 
    
    4.Запускаем winecfg, переходим на закладку Библиотеки(Libraries ) и добавляем
    следующее приложение и библиотеки:
    
       iexplore.exe 
       mshtml 
       shdoclc 
       shdocvw 
       shlwapi 
       urlmon 
       wininet 
       mlang 
    
    И устанавливаем их в Сторонняя, встроенная (native, builtin.) 
    
    5.Устанавливаем версию эмуляции 2000 в winecfg. 
    
    6.В реестре надо указать версию IE ниже чем 6.  
    
    7. HKEY_LOCAL_MACHINE->Software->Microsoft->Internet Explorer->Version Например 5.0. 
    
    8.Запускаем IE6SETUP.EXE. Он должен установиться без ошибок. 
    (можно использовать параметр  /q чтобы он не задавал вопросов при инсталляции) 
    
    9.Теперь нужно зарегистрировать все библиотеки (dll) в каталоге  ~/.wineIE6/windows/system32 .
    Открываем любую консоль переходим в каталог и выполняем команду  дважды: 
    
       for i in *.dll *.ocx; do regsvr32 /i $i; done
    
    10.С этого момента IE6 будет запускаться  но не будет ничего  отображать. 
    Чтобы исправить эту проблему надо скачать файл msls31.dll
    (используйте google) и поместить его в ~/.wineIE6/windows/system32.    
    Можно взять с машины с Windows.
    
    11.Теперь Вы можете запускать IE6.
    
       WINEPREFIX="$HOME/.wineIE6" wine iexplore.exe
    
    
    Первоисточник текста на английском: http://appdb.winehq.org/appview.php?versionId=469
    Автор: Artem Tashkinov, перевод: Spike.
    
     
    ----* Как запустить 1C под Wine без дополнительных патчей (доп. ссылка 1)   Автор: Jaded Phoenix  [комментарии]
     
    1. Качаем wine с http://www.winehq.org я использую wine 0.9.13 в сборке для 
    Debian.
    
    2. Запускаем wine, пусть создаст папку ~/.wine/
    
    3. Качаем Dcom98 с 
    http://download.microsoft.com/msdownload/d...6/en/dcom98.exe , или с 
    http://dalcom.kha.ru/dcom98.exe. Копируем Dcom98 в ~/.wine/drive_c/
    
    4. Запускаем winecfg и настраиваем wine по своему вкусу. Особо отмечаю: на 
    вкладке "Графика" 
    убираем галочку с "Разрешить менеджеру окон управлять  окнами".
    
    5. Стартуем wine DCOM98.EXE /C /T:c:\\temp /Q (из папочки ~/.wine/drive_c/).
    
    6. Копируем все из папки ~/.wine/drive_c/temp/ в  ~/.wine/drive_c/WINDOWS/system/
    
    7. Опять стартуем winecfg, добавляем приложение Dcom98.exe, 
    и для него в соседней вкладке прописываем библиотеку ole32=Родная (windows).
    
    8. Запускаем wine DCOM98.EXE /Q (у меня оно тут, правда, выругалось, что у 
    меня система 2000, но ничего - дальше все нормально).
    
    9. Копируем из установленной винды библиотеку msvcrt40.dll (входит в состав MS Office, например).
    
    10. Стартуем winefile (можно и ручками через wine, но привыкайте к 
    удобствам ;-)), ставим 1С (v77).
    
    11. Еще раз стартуем winecfg, добавляем приложение 1CV7.exe (у меня 1CV7s.exe), 
    для него прописываем исключительно нативные библиотеки rpcrt4, ole32, olepro32, oleaut32, msvcrt40.
    
    12. Совет, который я не делал (у меня и так все нормально): чтобы в программе был русский шрифт
     надо просто из компьютера где установлен Windows взять из папки fonts все шрифты и 
    скопировать их в папку ~/.wine/drive_c/windows/fonts. 
    Далее в файле настройки wine изменить в разделе [fonts]:
    
       "Default" = "arial"
       "DefaultFixed" = "fixed"
       "DefaultSerif" = "Serif"
       "DefaultSansSerif" = "SansSerif"
    
    13. Стартуем 1С, добавляем базы. Для каждой базы делаем следующее: открываем в конфигураторе, 
    выбираем в меню "Администрирование" пункт "Кодовая страница таблиц ИБ". 
    Устанавливаем кодовую страницу в "+Текущая системная установка".
    
    14. Обязательно надо снять галочку "Окна->Панель  окон->показать".
    
    15. Создаем ярлыки запуска, устало дышим, радуемся и благодарим г-на Нуралиева 
    (директор 1С) за классный продукт.
    
     
    ----* Как запустить игровой сервер Diablo II под wine без установки X Window (доп. ссылка 1)   Автор: lw  [комментарии]
     
    Ниже рассказ о том как запустить приложения в wine (например, D2GS) 
    без  необходимости запуска X Window сервера:
    
       - собираем wine с ключами   --without-x --without-opengl;
       - в ~/.wine/config меняем "GraphicsDriver" = "x11drv"  на  "GraphicsDriver" = "ttydrv".
    
     

       X Window

    ----* Использование в Linux дискретной видеокарты AMD Radeon вместе со встроенной Raven Ridge   Автор: nobody  [комментарии]
     
    Разговор пойдёт об AMD APU Ryzen 3 2200G, Ryzen 5 2400G и подобных им.
    
    В обсуждениях на англоязычных форумах упоминается, что iGPU Vega10 более
    технологически продвинут, и, в принципе, он может быть использован как
    ведущий адаптер для dGPU предыдущих версий GCN 1,2,3 в рамках модели
    памяти iGPU Vega10 (GCN 5).
    
    Однако, с одной стороны это потребует большое количество человеко-часов для
    написания таких драйверов под OS Linux. А, с другой стороны, новые адаптеры
    линии RDNA полностью соответствуют этой модели памяти. И, в принципе,
    состыковка iGPU Vega10 с dGPU RDNA, есть задача более простая и более перспективная.
    
    Поэтому, в ближайшее время нормальной состыковки видеокарт GCN 1,2,3 и iGPU
    Vega10 (GCN 5) в Linux, судя по всему, ожидать не приходится.
    
    Соответственно, всё, что описано далее, это воркэраунд для сложившейся ситуации.
    
    
    Пошаговая инструкция
    
    Вот работоспособная конфигурация:
    
    (01) Устанавливаем Fedora 31 (я использовал версию с MATE GUI).
    Не забываем сразу добавить пользователя в группу video .
    
    
    (02) Загружаем пакет kernel-5.3.16-300.fc31.src.rpm, и разворачиваем его для
    компиляции в ${HOME}/rpmbuild/SOURCES/
    
    
    (03) Идём на страничку
    https://github.com/RadeonOpenCompute/ROCK-Kernel-Driver/issues/66  и загружаем
    оттуда патч под нашу версию ядра
    0003-allows-to-choose-iGPU-or-dGPU-memory-management-mode.patch.txt
    по ссылке
    https://github.com/RadeonOpenCompute/ROCK-Kernel-Driver/files/3614247/0003-allows-to-choose-iGPU-or-dGPU-memory-management-mode.patch.txt
    
    Попутно читаем на английском про особенности работы встроенной карты, там много удивительного.
    
    Выжимка, кому интересно, иначе можно пропустить:
    
    
  • модель памяти у iGPU и dGPU различна;
  • драйвер amdkfd по умолчанию использует модель памяти адаптера, проинициализировавшегося первым;
  • не смотря на то, что dGPU может быть первым и будет использована его модель памяти, тем не менее iGPU Vega10 более технологически продвинут и именно он получит первый номер во внутреннем дереве топологии драйвера amdkfd, что в общем-то неправильно, так как карта адаптеров и фактическое их наличие не будут соответствовать друг другу. Как результат, оба GPU будут нерабочими в ROCm (и не только в нём);
  • двое разработчиков ROCm под никами fxkamd и Djip007 сформировали патч для драйвера amdkfd, позволяющий на этапе загрузки ядра сказать драйверу amdkfd, какую модель памяти использовать и какие адаптеры допустимы в дереве топологии amdkfd, скажем "Большое Спасибо!" им за это. (04) Копируем патч в каталог ${HOME}/rpmbuild/SOURCES/ $ cp 003-allows-to-choose-iGPU-or-dGPU-memory-management-mode.patch.txt ${HOME}/rpmbuild/SOURCES/003-allows-to-choose-iGPU-or-dGPU-memory-management-mode.patch Исправляем в kernel.spec %global baserelease 300 на произвольное большее %global baserelease 307 Добавляем в kernel.spec после описания всех патчей, после строки Patch536: ..... строку с описанием нового патча Patch537: 0003-allows-to-choose-iGPU-or-dGPU-memory-management-mode.patch как раз перед строкой # END OF PATCH DEFINITIONS Делаем линк kernel.spec: $ cd ${HOME}/rpmbuild/SPECS/ $ ln ../SOURCES/kernel.spec Запускаем сборку пакетов ядра с патчем: $ rpmbuild -ba --nodebuginfo --target x86_64-redhat-linux --define "%_without_debug 1" --define "%set_build_flags echo" --define "%make_build make" --define "%make_install make install DESTDIR=%{buildroot}" kernel.spec Внимание, потребуется много места на диске! В моём случае сборки для x86_64 конфигов это было около 27 GB временных файлов. По завершении сборки в директории ${HOME}/rpmbuild/RPMS/x86_64/ будут лежать новые пакеты: kernel-5.3.16-307.fc31.x86_64.rpm kernel-core-5.3.16-307.fc31.x86_64.rpm kernel-debuginfo-5.3.16-307.fc31.x86_64.rpm kernel-debuginfo-common-x86_64-5.3.16-307.fc31.x86_64.rpm kernel-devel-5.3.16-307.fc31.x86_64.rpm kernel-modules-5.3.16-307.fc31.x86_64.rpm kernel-modules-extra-5.3.16-307.fc31.x86_64.rpm Устанавливаем это новое ядро и его модули (естественно, с опцией --nogpgcheck). (05) Обновляем загружаемый микрокод для видеокарт: # dnf upgrade linux-firmware libclc (06) Добавляем в настройки dracut несколько опций # cat /etc/dracut.conf.d/my20200224.conf add_drivers+=" amd_iommu_v2 amdgpu nvme_core nvme " fw_dir+=" /lib/firmware/amdgpu " install_items+=" /lib/firmware/amdgpu/raven_* /lib/firmware/amdgpu/polaris* " (07) Аккуратно настраиваем X-сервер в /etc/X11/xorg.conf. Чтобы он видел dGPU как первичный адаптер, а iGPU , как вторичный адаптер без экрана. Однако к монитору iGPU должен быть подключен физически (или к его HW-эмулятору). Создаём шаблон xorg.conf командой: # X -configure Затем копируем его в /etc/X11/xorg.conf и редактируем, оставляя:
  • Layout0 с двумя картами Card0 и Card1
  • Card0 это первичный dGPU с монитором и экраном, с точным указанием BusID
  • Card1 это вторичный iGPU без монитора и без экрана, с точным указанием BusID Например: Section "Device" # dGPU Identifier "Card0" Driver "amdgpu" BusID "PCI:1:0:0" Option "TearFree" "True" Option "Accel" "True" EndSection Section "Device" # iGPU Identifier "Card1" Driver "amdgpu" BusID "PCI:9:0:0" EndSection Ваши GPU могут иметь другие номера на шине pci, смотрим командой: # lspci -v ..... Пропускаем секции "Monitor1" и "Screen1" для iGPU в нашем случае, как это регламентировано в мануале для xorg.conf. Просто комментируем соответствующие разделы: #Section "Monitor" # Identifier "Monitor1" ..... #Section "Screen" # Identifier "Screen1" ..... (08) Добавляем опцию для kfd из рекомендаций установки ROCm: # cat /etc/udev/rules.d/70-kfd.rules SUBSYSTEM=="kfd", KERNEL=="kfd", TAG+="uaccess", GROUP="video", MODE="0660" Это позволит работать с dGPU пользователю из группы video. (09) Перегенерим initramfs: # dracut --force --kver 5.3.16-307.fc31.x86_64 (10) Добавляем в настройки grub2 несколько опций ядра для загрузки: amd_iommu=fullflush iommu=pt video=efifb:off amdgpu.rocm_mode=2 (11) Дополнительно, устанавливаем воркэраунд от некогерентности кэша для GCN 1,2,3,5 видеокарт: # cat /etc/environment AMD_DEBUG=nongg,nodma RADV_DEBUG=nongg DRI_PRIME=0 К сожалению, воркэраунды снижают производительность от 1.5 до 15 раз (судя по тесту Glmark2), но зато дают стабильность GUI-десктопу. Для RDNA 1,2 видеокарт вроде бы это не нужно, но я не проверял, так как не на чем. Перезагружаемся. (12) Настраиваем в EFI dGPU как первичную видеокарту, а iGPU, соответственно, становится вторичной видеокартой, урезаем ей RAM до 64 MB. Загружаемся. Вот и всё. Проверка Теперь проверяем корректность результата. # dmesg | grep -i -e amdgpu -e kfd -e drm -e ttm -e atomic -e crat ..... [ 3.414606] kfd kfd: Ignoring ACPI CRAT on disabled iGPU (rocm_mode!=ROCM_MODE_IGPU) ..... [ 3.667325] kfd kfd: added device 1002:wxyz ..... [ 3.733956] kfd kfd: skipped DID 15dd, don't support dGPU memory management models ..... Выбрана модель памяти для dGPU, добавление iGPU в топологию kfd пропущено, а топология kfd для dGPU сформирована правильно. # lspci -nnk -d 1002: 01:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] ..... Subsystem: ..... Kernel driver in use: amdgpu Kernel modules: amdgpu 09:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Raven Ridge [Radeon Vega Series / Radeon Vega Mobile Series] [1002:15dd] (rev c8) Subsystem: ..... Kernel driver in use: amdgpu Kernel modules: amdgpu 09:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Raven/Raven2/Fenghuang HDMI/DP Audio Controller [1002:15de] Subsystem: ..... Kernel driver in use: snd_hda_intel Kernel modules: snd_hda_intel Всем видны оба видео-адаптера AMD на pci шине: и dGPU и iGPU. Важно, чтобы неиспользуемый iGPU контроллировался ядерным драйвером amdgpu. Если этого не будет (например, можно удалить устройства из дерева pci средствами udev на раннем этапе загрузки), то iGPU будет сильно греть APU (max 75*C вместо max 60*C). И это при том, что сам iGPU вообще не будет никак использоваться. Может возникнуть впечатление, что появились проблемы с кулером APU, но это не так. $ less /var/log/Xorg.0.log [ 15.962] (**) ServerLayout "Layout0" [ 15.962] (**) |-->Screen "Screen0" (0) [ 15.962] (**) | |-->Monitor "Monitor0" [ 15.962] (**) | |-->Device "Card0" [ 15.962] (**) | |-->GPUDevice "Card1" [ 15.962] (**) |-->Input Device "Mouse0" [ 15.962] (**) |-->Input Device "Keyboard0" ..... [ 15.964] (II) xfree86: Adding drm device (/dev/dri/card0) [ 15.970] (II) xfree86: Adding drm device (/dev/dri/card1) [ 15.973] (--) PCI:*(1@0:0:0) ..... [ 15.973] (--) PCI: (9@0:0:0) ..... ..... [ 15.979] (II) LoadModule: "amdgpu" [ 15.980] (II) Loading /usr/lib64/xorg/modules/drivers/amdgpu_drv.so ..... [ 15.983] (II) AMDGPU: Driver for AMD Radeon: All GPUs supported by the amdgpu kernel driver [ 15.983] (II) modesetting: Driver for Modesetting Kernel Drivers: kms [ 15.983] (II) AMDGPU(0): [KMS] Kernel modesetting enabled. ..... Т.е. видим, что X-сервер обнаружил обе видеокарты, но активно использует только одну и именно дискретную видеокарту. Далее можем, например, установить ROCm 3 _без_ dkms драйвера в соответствие с родной инструкцией: # dnf install rocm-dev rocm-libs Следующие программы дополнительно покажут корректность описанной выше пошаговой настройки. rocm-smi нормально отображает всю статистику по dGPU и управляет ею. rocminfo отрабатывает без ошибок и отображает 2 вычислительных агента CPU и gfx803. clinfo отрабатывает без ошибок и отображает 1 платформу AMD-APP и 1 устройство gfx803 (не считая Mesa Clover и Pocl). hashcat видит устройство и работает нормально. (Самосборный пакет из оригинальных исходников, т.к. из репозитория Fedora 31 сборка имеет урезанную функциональность и проблемы с запуском.) Компилятор AOMP в составе ROCm 3.1 проходит успешно 67 тестов из 69 из приложенного набора тестов smoke. vainfo , vdpauinfo отрабатывают нормально. Итоги В результате настройки получаем устойчивый GUI-десктоп с корректно работающим dGPU и с условно корректно отключенным, "не используемым" iGPU. Дополнительно PS: Пока удалось нарушить работу dGPU, только используя в Avidemux HW-кодер "Intel AVC HW (VA)". В то же время HW-кодер "Intel HEVC" в Avidemux работает довольно быстро. А "Intel H264" не работает совсем, и, судя по всему, встройка тут не при чём. Запуск командой: $ ( DRI_PRIME=1 avidemux3_qt5 ) позволяет использовать встроенные HW-кодеры "не используемого" iGPU, работают они примерно так же. PPS: В принципе, в ядро 5.6 были добавлены полезные патчи для Raven iGPU, и, с применением воркэраунда для Mesa 19.2.8 # cat /etc/environment AMD_DEBUG=nongg,nodma,nodcc RADV_DEBUG=nongg DRI_PRIME=0 стало возможным использовать Raven iGPU как первичную видеокарту в EFI, а dGPU использовать вторичной видеокартой. Соответственно, просто меняем местами BusID карт в xorg.conf , и включаем вторичную dGPU в MATE: меню System -> Control Center -> Displays -> второй дисплей , ON , Applay , Close (настройка сохраняется в ${HOME}/.config/dconf/). В этом случае производительность dGPU в графике снижается. Зато появляется возможность работать с tensorflow-rocm при 100% нагрузке dGPU без замираний первичного экрана, и наблюдать происходящее в процессе. И, однако, попутно выясняется, что ядро 5.6.8 (со своим таким же патчем с той же веб-странички) _не_ загружается с primary dGPU в EFI. Возможно, что для сочетаний конкретных APU и MainBoard это вылечится обновлением Grub2 до актуальной версии. Вероятно, старая версия Grub2 неправильно транслирует какие-то параметры ядру из EFI. Этот момент и более поздние версии ядер 5.6.n и 5.7.n , пардон, проверить не успел, т.к. заапгрейдил APU на обычный CPU Ryzen без iGPU. Перспективы Общие соображения, которые с одной стороны можно было бы и не добавлять в статью, а с другой, почему бы и не добавить. Судя по всему, RDNA 1 и 2 как архитектуры GPU есть шаги по направлению к когерентной архитектуре Gen-Z. Это означает, что:
  • основной свичованой шиной станет CCIX как приоритезированный PCIe Gen4 (и выше)
  • RAM будет выделена в отдельные модули на CCIX-шине
  • контроллер памяти будет в диспетчере и каждом модуле RAM
  • кэши CPU, GPU, RAM, плат расширения будут когерентны
  • IOMMUv2 (или выше) будет обязателено by design
  • GPU станут более самостоятельными относительно CPU (как вычислительные устройства)
  • iGPU / APU не вполне вписываются в эту концепцию Выводы, конечно же, каждый сделает сам.
  •  
    ----* Как установить AMD Catalyst в Fedora 21, не ломая GNOME и другие вещи   Автор: Stax  [комментарии]
     
    Преамбула
    Прошу не начинать обсуждения не по теме вроде "какая ваша Fedora гадость, в
    нормальных дистрибутивах проблем никаких" (в Fedora просто в силу прогресса
    сломали раньше, дойдет и до остальных, например, в свежем Debian уже
    случилось), "какой ваш GNOME гадость" (проблемы не специфичны для гномовского
    десктопа, всякие rhythmbox и другой софт, использующий clutter сломан точно
    также), "какие бинарные драйверы гадость" (с открытыми драйверами на многих
    карточках безумно шумит кулер, пока не исправлена вот эта ошибка, а еще
    проблемы с suspend и прочее) или так далее. А вот предложения, как сделать эти
    инструкции более надежными приветствуются.
    
    Задача
    
    Итак, есть свежая Fedora 21, 64-х битная система с карточкой AMD, нужно
    заставить работать Catalyst, чтобы не сломался gdm или программы, собранные с
    clutter, в том числе GNOME. В rpmfusion каталиста нет, советы в интернете
    предлагают идти на какие-то жертвы типа "снести GNOME", "выключить gdm" (лично
    у меня с lightdm не работает блокировка экрана), "ставить левые пакеты
    clutter/gnome-shell/etc после каждого обновления, пересобираемые каким-то
    сомнительным товарищем и выкладываемые на что-то типа mediafire без подписи" и
    так далее. Это не наш путь, нужно, чтобы работало все как есть и цивилизованно:
    пакеты в rpm'ках, не сломанная функциональность и прочее. Это достижимо (ну,
    почти). Инструкция проверена на последних версиях пакетов на данный момент
    (Catalyst 14.12, ядро 3.17.7 gnome-shell 3.14.3, gdm 3.14.1, clutter 1.20.0)
    
    Инструкция
    
    Загружаем AMD Catalyst - amd-catalyst-omega-14.12-linux-run-installers.zip.
    Распаковываем, переходим в fglrx-14.501.1003. Качаем патч, чтобы собрать с
    ядром 3.17:
    
       wget https://bluehatrecord.files.wordpress.com/2014/11/3-17_kernel-patch.doc
    
    Накладываем патч и собираем rpm пакет. Федоры в списке нет, зато есть RHEL7,
    который почти F19, которая почти F21 - в общем, то, что надо!
    
       sh amd-driver-installer-14.501.1003-x86.x86_64.run --extract
       cd fglrx-install.*
       patch -p0 < ../3-17_kernel-patch.doc
       ./ati-installer.sh '14.501' --buildpkg RedHat/RHEL7_64a
    
    Ставим пакет и создаем файл конфигурации Xorg.
    
       sudo rpm -i ../fglrx64_p_i_c-14.501.1003-1.x86_64.rpm
       aticonfig --initial
    
    Выключаем драйвер radeon и kernel modesetting. 
    Правим /etc/sysconfig/grub, в строку GRUB_CMDLINE_LINUX= добавляем 
    
       radeon.modeset=0 rd.driver.blacklist=radeon nomodeset
    
    к тому, что там уже есть; пересоздаем конфиг grub командой 
    
       grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg
    
    на современной системе с UEFI, или же 
    
       grub2-mkconfig -o /boot/grub2/grub.cfg
    
    на системой со старым BIOS или на UEFI-системе в legacy-режиме
    
    Чиним ошибку в clutter. Создаем файл /etc/X11/xinit/xinitrc.d/cogl-setup.sh по такой инструкции:
    
       sudo sh -c "cat > /etc/X11/xinit/xinitrc.d/cogl-setup.sh" << EOF
       export COGL_DRIVER=gl
       export COGL_OVERRIDE_GL_VERSION=1.4
       export COGL_RENDERER=GLX
       export LD_PRELOAD=/usr/lib64/fglrx/fglrx-libGL.so.1.2
       EOF
       sudo chmod +x  /etc/X11/xinit/xinitrc.d/cogl-setup.sh
    
    Чиним проверку версии X'ов в драйвере при использовании gdm. Аккуратнее - точно
    выполняйте эти команды, нельзя их менять, если что-то в них непонятно - а то не
    сработает, либо вообще повредите бинарник и придется переставлять fglrx:
    
       sudo -i
       Xorg -version > /amd_xversion 2>&1
       cd /usr/lib64/xorg/modules/drivers/
       offset=`strings -td fglrx_drv.so | grep '/proc/%i/fd/0' | sed 's/^ *//' | cut -d' ' -f1`
       echo -ne '/amd_xversion' | dd conv=notrunc of=fglrx_drv.so bs=1 count=13 seek=$offset
       cd ../extensions
       offsetext=`strings -td libglx.so | grep '/proc/%i/fd/0' | sed 's/^ *//' | cut -d' ' -f1`
       echo -ne '/amd_xversion' | dd conv=notrunc of=libglx.so bs=1 count=13 seek=$offsetext
       exit
    
    Здесь на диске меняются два бинарника, если переставить rpm'ку fglrx, это
    придется делать заново. В процессе будет создан файл /amd_xversion, не удаляйте
    его! Оттуда драйвер будет считывать версию иксов.
    
    Чиним запускаемый специальным образом gnome-shell, который выполняет gdm (да,
    он сейчас не сам по себе, фон и верхнюю панель рисует именно gnome-shell).
    Правим /usr/share/gdm/greeter/applications/gnome-shell.desktop и меняем строку
    
       Exec=gnome-shell --mode=gdm" на "Exec=env COGL_DRIVER=gl COGL_OVERRIDE_GL_VERSION=1.4 COGL_RENDERER=GLX LD_PRELOAD=/usr/lib64/fglrx/fglrx-libGL.so.1.2 gnome-shell --mode=gdm
    
    Это самое несовершенное изменение - если обновить gdm, это придется делать
    заново, так как rpm перетрет файл. Я не знаю, как это сделать более нормально -
    патчить при загрузке изврат, вроде теоретически можно создать свою копию
    gnome-shell.desktop и копию
    /usr/share/gnome-session/sessions/gdm-shell.session, в котором прописать вместо
    gnome-shell свою версию, а потом поправить dconf'ом файлик
    /usr/share/gdm/greeter-dconf-defaults, чтобы gdm использовал системную сессию,
    отличную от gdm-shell.session. Но, подозреваю, rpm это тоже переписывает.
    В общем, если кто-то знает, как сделать аналог этого изменения, чтобы
    нормально обновлялся gdm и ничего не ломалось - сообщите!
    
    
    PS. Я также опубликовал английский вариант на fedoraforum - это не совсем
    точный перевод русского текста, просто написав инструкцию на-английском, решил
    сделать и русский вариант, заодно упростил некоторые вещи, так как полагаю, что
    тут аудитория более подготовленная, чем на fedoraforum.
    
    PPS. Ошибка в Clutter, из-за которой приходится прописывать переменные
    окружения можно отслеживать на данной странице.
    
     
    ----* Диагональное размещение информации на экране (доп. ссылка 1)   [комментарии]
     
    На системах с X-сервером при помощи утилиты xrandr можно организовать
    размещение информации на экране монитора, установленного не только
    горизонтально или вертикально, но и  под произвольным углом.
    
    Например, можно повернуть монитор на 45 градусов:
    
       xrandr --output HDMI-3 --transform 0.707106781186548,-0.707106781186548,0,0.707106781186548,0.707106781186548,0,0,0,1
    
    
    
    
    или 22 градуса:
    
      xrandr --output HDMI-3 --transform 0.927183854566787,-0.374606593415912,0,0.374606593415912,0.927183854566787,0,0,0,1
    
    
    
    
    Указываемые в параметре "--transform" значения рассчитываются по формуле
    "cos(x),-sin(x),shift_left,sin(x),cos(x),shift_up,0,0,1", в которой "x" -
    необходимый угол поворота.
    
     
    ----* Уменьшение жёстко определённого размера окна приложения в формате AppImage   [комментарии]
     
    При запуске некоторых приложений, поставляемых в формате AppImage, окно не
    умещается на экран и штатные механизмы изменения размера окна не позволяют
    уменьшить его до нужных размеров. Например, окно оказывается слишком длинным и
    его нижняя часть на широкоформатном экране ноутбука всегда оказывается за
    пределом экрана.
    
    До выступающей за пределы экрана части можно добраться сместив окно в другую
    сторону,  перемещая его мышью за боковую грань при удержании клавиши Alt, но
    при постоянной работе с программой так поступать неудобно.
    
    Для постоянного уменьшения масштаба можно перед запуском программы  выставить
    переменную GDK_DPI_SCALE для программ на GTK, и
    QT_SCALE_FACTOR для Qt. Например:
    
       GDK_DPI_SCALE=0.8 ./prog.AppImage
       QT_SCALE_FACTOR=0.8 ./prog.AppImage
    
     
    ----* Удалённая работа с GTK-приложениями через браузер (доп. ссылка 1) (доп. ссылка 2)   [комментарии]
     
    В состав GTK+ входит бэкенд Broadway, позволяющий отрисовывать вывод  в окне
    web-браузера, передавая данные через WebSocket и формируя изображение с
    использованием технологий HTML5. Каждое окно сопоставляется с элементом canvas,
    а содержимое окон передается клиенту в виде копий слоев (для скроллинга) и
    блоков, описывающих изменения между изображениями. Изображения отправляются в
    формате PNG. Для обновления содержимого окна организуется передача потока
    команд через "multipart/x-mixed-replace"-запросы XMLHttpRequest.
    
    Начиная с Ubuntu 15.04 бэкенд Broadway поставляется по умолчанию. В более
    ранних выпусках необходимо установить пакет из PPA:
    
       sudo add-apt-repository ppa:malizor/gtk-broadway
       sudo apt-get update
       sudo apt-get upgrade
       sudo apt-get install broadwayd
    
    
    Для использования Broadway в любом приложении на базе GTK+3 достаточно перед
    запуском установить переменную окружения GDK_BACKEND=broadway, после чего
    интерфейс приложения станет доступен при открытии в браузере страницы
    http://127.0.0.1:8080. Для запуска нескольких приложений, с присвоением для них
    разных номеров портов, следует использовать вспомогательный дисплейный сервер broadwayd.
    
    Например:
    
       broadwayd
       GDK_BACKEND=broadway gedit
    
    Если после запуска произошёл крах, можно попробовать отключить в программе
    работу с глобальным меню и исчезающими полосами прокрутки:
    
       GDK_BACKEND=broadway UBUNTU_MENUPROXY= LIBOVERLAY_SCROLLBAR=0 gedit
    
    Для запуска ещё одного приложения, в broadwayd следует указать номер сеанса,
    после чего номер порта для него выбирается по формуле "8080  + номер". Например (127.0.0.1:8081):
    
       broadwayd :1
       GDK_BACKEND=broadway gtk3-demo
    
    Для доступа с другого ПК можно прикрепить обработчик на другой IP-адрес при
    помощи опции --address, например:
    
       broadwayd --address 192.168.1.34 :2
    
    Для предотвращения несанкционированного доступа для сеанса можно задать пароль,
    который нужно сохранить в файл ~/.config/broadway.passwd. Например:
    
       openssl passwd -1  > ~/.config/broadway.passwd
    
     
    ----* Установка проприетарного драйвера AMD Crimson Edition 15.12 в Ubuntu 16.04   Автор: Аноним  [комментарии]
     
    Многие слышали о прекращении поддержки проприетарного драйвера fglrx в
    Ubuntu 16.04. Меня это событие обошло стороной и я стал "счастливым"
    обладателем свежей версии убунты.
    
    Часть первая, где мы будем патчить
    
    Сразу отмечу, что amdgpu у меня R9 390x не "взлетел". И я решил пойти по пути
    наименьшего сопротивления. Установке драйверов препятствует отсутствие
    поддержки ядра версии 4.4, заботливо предоставленного сборщиками из Canonical.
    К счастью,некий imageguy, уверенной 10-ти пальцевой печатью, набил на клавиатуре
    патч
     для данного ядра. Спасибо imageguy!
    Если упустить процедуру скачивания распоследнего crimson с сайта amd установка
    сводится к следующим действиям:
    
       sh amd-driver-installer-15.302-x86.x86_64.run --extract
       cd fglrx-install.*/
       wget https://raw.githubusercontent.com/imageguy/fglrx-for-Fedora/master/fglrx_kernel_4.4.diff
       patch -p1 < fglrx_kernel_4.4.diff  
    
    
    Часть вторая, понижение версии xserver
    
    Вот и славно, модуль ядра теперь точно соберется, но остается еще одна преграда
    на пути к установке - это xserver-xorg версии 1.18. Но это совсем не беда,
    поставим его из репозитория willy. Но сначала удалим пакеты xserver версии 1.18:
    
       sudo apt-get purge xserver-xorg* 
    
    Заморачиваться со скачиванием пакетов xserver я не стал, просто закоментировал
    текущие репозитории в:
    
       sudo sed -i 's/deb/#deb/' /etc/apt/sources.list
    
    и прописал репозитории wily:
    
       deb http://cz.archive.ubuntu.com/ubuntu wily main
       deb http://cz.archive.ubuntu.com/ubuntu wily-updates main
    
    И поставил xserver из репозитория wily:
    
       sudo apt-get update
       sudo apt-get install xserver-xorg
    
    Холдим пакеты с пониженной версией xserver:
    
       packages=`aptitude search xserver|grep -E '^i'|grep -Eo '(xserver-.+) - '|awk '{print $1}'`; for pkg in $packages; do echo "$pkg hold" | sudo dpkg --set-selections;done
    
    Восстанавливаем содержимое /etc/apt/sources.list:
    
       sudo sed -i 's/#deb/deb/' /etc/apt/sources.list
    
    Не забудте закоментировать репозитории wily, можно их и оставить, но не кошерно. 
    
    Находясь в директории с распакованым драйвером делаем:
    
       sudo sh ./ati-installer.sh 15.302 --install
    
    далее установка проходит в обычном режиме.
    
    Источник: Инструкция по установке драйвера в Fedora.
    
     
    ----* Оценка работы Unity 8 в изолированном контейнере, запускаемом в обычном Ubuntu (доп. ссылка 1)   [комментарии]
     
    Пользователям настольной версии Ubuntu, которая в выпуске 16.04 продолжает по
    умолчанию поставляться с X-сервером и окружением рабочего стола Unity 7,
    предоставлена возможность оценить работу свежей версии Unity 8 с минимальным
    влиянием на текущее рабочее окружение.  Начиная с Ubuntu 15.04, из штатных
    репозиториев можно установить образ LXC-контейнера c Unity 8 и графическим
    стеком на базе дисплейного сервера Mir и Qt5.
    
    Для развёртывания контейнера достаточно установить пакет unity8-lxc и запустить
    скрипт формирования и настройки начинки контейнера:
    
       sudo apt install unity8-lxc
       sudo unity8-lxc-setup
    
    после чего возможность входа в сеанс Unity 8 появится в штатном интерфейсе
    менеджера входа в систему.
    
    Для обновления начинки контейнера следует выполнить команду 
    
       sudo unity8-lxc-setup --update-lxc
    
    Пользователи Ubuntu 14.04 могут воспользоваться пакетом unity8-lxc после
    подключения PPA-репозитория https://launchpad.net/~unity8-desktop-session-team/+archive/ubuntu/unity8-preview-lxc
    
       sudo apt-add-repository ppa:unity8-desktop-session-team/unity8-preview-lxc
    
    
    Свежая видеодемонстрация Unity 8: http://www.youtube.com/watch?v=ItFoz92zNm0
    
     
    ----* Запуск и использование сервера Xvnc   Автор: 赤熊  [комментарии]
     
    В своё время была задача реализации игровой станции с множеством клиентов. В
    качестве клиентов выступали телефоны на платформе Android.
    Как оказалось обычного канала wi-fi хватало на раздачу игровой анимации
    примерно на десять клиентов. В качестве приложения-клиента использовался simplevnc.
    
    Ниже приведён скрипт запуска vnc-сервера, где первым параметром идёт адрес
    дисплея, например 1, а вторым параметром - адрес порта, например 5555.
    Расположение каталогов со шрифтами зависит от настроек вашей ОС, так что будьте внимательны.
    
    Файл авторизации на моём ПК лежит /dev/shm/bin/.vnc/passwd
    
    vncconfig позволяет настроить параметры запущенного vnc сервера. В приведённом
    примере это параметры отключения клиентов и уровень компрессии.
    
    
       #!/bin/sh
       Xvnc :$1 -desktop worker:$1 -geometry 800x500 -depth 24 -rfbwait 30000 -rfbauth /dev/shm/bin/.vnc/passwd -rfbport $2 -pn -fp /usr/X11R6/lib/X11/fonts/Type1/,/usr/X11R6/lib/X11/fonts/Speedo/,/usr/X11R6/lib/X11/fonts/misc/,/usr/X11R6/lib/X11/fonts/75dpi/,/usr/X11R6/lib/X11/fonts/100dpi/,/usr/share/fonts/X11/misc/,/usr/share/fonts/X11/Type1/,/usr/share/fonts/X11/75dpi/,/usr/share/fonts/X11/100dpi/ -co /etc/X11/rgb >/dev/shm/log_$1.txt 2>&1 &
    
       export DISPLAY=:$1.0
       vncconfig -DisconnectClients=0 -ZlibLevel=9 -IdleTimeout=120 NeverShared=1
    
    Кроме создания игрового сервера, связка Android и vnc-сервера может оказаться
    полезной для работы с инженерными программами и САПР, когда программа
    выполняется на хосте, а вывод формируется на телефоне.
    
     
    ----* Способ обхода краха Firefox и OpenGL приложений из-за ошибки в видеодрайвере Intel (доп. ссылка 1)   [комментарии]
     
    В Ubuntu 14.04 и более новых выпусках при использовании KMS-драйвера i915 на
    системах со старыми видеочипами Intel 965GM,  обычно используемыми в связке с
    CPU Intel Core 2 Duo, периодически начинают падать OpenGL-приложения.
    
    После загрузки некоторое время всё нормально, но после выхода из сна или
    перехода в полноэкранный режим попытка обращения к OpenGL приводит к выводу
    такой ошибки:
    
       $ glxgears 
    
       intel_do_flush_locked failed: Input/output error
    
    
    Неприятность ситуации в том, что в таких условиях непредсказуемым образом
    начинает падать и Firefox, если на сайте используется WebGL или модные
    графические трансформации.
    
    Обходным способом решения проблемы является запуск OpenGL-программ с
    программной реализацией OpenGL (включается установкой переменной окружения
    LIBGL_ALWAYS_SOFTWARE=1), например, вместо прямого вызова в ярлык для запуска
    Firefox можно прописать:
    
       sh -c "LIBGL_ALWAYS_SOFTWARE=1 /usr/local/firefox/firefox"
    
    Проблема решается установкой Mesa из репозитория xorg-edgers:
    
       sudo apt-add-repository ppa:xorg-edgers/ppa
       sudo apt-get update
       sudo apt-get dist-upgrade 
    
     
    ----* Простой способ существенно увеличить производительность открытого драйвера RadeonSI (доп. ссылка 1)   Автор: Аноним  [комментарии]
     
    Как известно, открытый драйвер RadeonSI для GPU семейства Radeon на основе GCN
    от компании AMD все чаще показывает производительность, сравнимую с
    проприетарным драйвером и при этом не страдает некоторыми проблемами и
    особенностями проприетарного драйвера, на данный момент полностью поддерживая
    стандарт OpenGL 3.3, что зачастую делает этот драйвер интересным вариантом даже
    для любителей игр.
    
    Менее известен тот факт, что можно получить существенный дополнительный прирост
    производительности открытого драйвера в ряде 3D-программ очень простым методом.
    
    В RadeonSI по умолчанию отключен Hyper-Z, из-за проблем с стабильностью в
    некоторых программах с некоторыми GPU. Тем не менее, по состоянию на данный
    момент (MESA 10.3-devel, ядро Linux 3.17-rc1) большинство подобных сочетаний
    GPU и программ работает вполне стабильно.
    
    В результате можно получить достаточно существенный прирост производительности
    в 3D, выставив переменную окружения R600_DEBUG=hyperz для активации hyper-z. Как
    показали
     тесты ресурса Phoronix,  в зависимости от программы прирост составляет от 10
    до 50%.
    
    
    
    Дополнение: 
    
    MESA версий 10.4 и более новые активируют hyperz по умолчанию, поскольку все
    известные проблемы со стабильностью были устранены. В данном случае указанная
    настройка не требуется, а в случае проблем с hyperz его можно отключить
    "обратной" настройкой - R600_DEBUG=nohyperz
    
    Кроме этого, в свежих версиях MESA содержится и ряд иных оптимизаций,
    существенно увеличивающих производительность в ряде случаев, поэтому
    пользователям заинтересованным в высокой производительности 3D-графики с
    открытыми драйверами семейства Radeon рекомендуется использовать свежие версии
    компонентов графического стека.
    
     
    ----* Организация ввода спецсимволов в системах с X.Org   Автор: pavlinux  [комментарии]
     
    В системах, использующих X.org, в модуле xkb существует подсистема Compose
    Keys, которая нужна и может, или даже должна быть использована для ввода
    спецсимволов, точнее знаков отсутствующих на обычных PC клавиатурах. Например
    знаки копирайта ©, товарный знак, регистрационное имя, градус °, дроби и так далее.
    
    Для включения этой возможности, нужно всего лишь добавить конфигурационный файл
    Xorg, в секции "InputClass" или "InputDevice"
    для клавиатуры, добавить опцию:  
    
       Option "XkbOptions" "compose:ralt"
    
    Если таковая уже имеется, то, через запятую, можно дописать этот параметр в конец её аргументов:
    
    
       Option "XkbOptions" "grp:ctrl_shift_toggle,grp_led:scroll,compose:ralt"
    
    
    Как уже догадались, Compose-клавишей у нас является правый Alt.  
     
    &#167; Теперь осталось самое тяжёлое - запомнить комбинации и
    потренироваться, так как некоторые знаки требуют 5 дана по клавиатурному феншую.
    
    Например для набора знака +/- нужно 
    нажать и держать <Compose>, нажать и держать <Shift> , нажать  <=>,  
    отпустить <Shift> нажать  <->    
    
    Подсказку с комбинациями можно добавить в закладки браузера.
    http://www.hermit.org/Linux/ComposeKeys.html
    
    P.S. Кто не знает или забыл, где найти файл конфигурации Xorg:  
    Олдскульный - /etc/X11/xorg.conf. 
    В новых системах, в отдельном каталоге, что-то вроде /etc/X11/xorg.conf.d/
    должен быть отдельный файл для клавиатуры, на openSuSE это 90-keytable.conf
    Какой именно используется у вас, можно найти в логе Xorg: 
    
       grep "Using config" /var/log/Xorg.*
    
     
    ----* Кастомизация Unity и установка полноценного GNOME в Ubuntu 12.04 (доп. ссылка 1)   [комментарии]
     
    Установка дополнительных утилит для тонкой настройки Unity.
    
    В Ubuntu Software Center можно найти утилиту MyUnity, при помощи которой можно
    настроить базовые аспекты поведения оболочки:
    
       sudo apt-get install myunity
    
    Для настройки Compiz и десктоп-эффектов следует использовать CompizConfig Settings Manager:
    
       sudo apt-get install compizconfig-settings-manager
    
    
    Для изменения поведения ланчера, панели и опций запуска удобно использовать
    приложение Ubuntu Tweak:
    
       sudo add-apt-repository ppa:tualatrix/ppa
       sudo apt-get update
       sudo apt-get install ubuntu-tweak
    
    Подборка разнообразных настроек панели, шрифтов, визуальных тем и других
    параметров Unity также представлена в программе Unsettings:
    
       sudo add-apt-repository ppa:diesch/testing
       sudo apt-get update
       sudo apt-get install unsettings
    
    
    
    Помещение ярлыков приложений на рабочий стол. 
    
    Переместить иконки с приложениями на рабочий стол можно путем их перетаскивания
    мышью из панели или области поиска. После перемещения необходимо убедиться, что
    скопированные .desktop файлы имеют права на запуск и принадлежат текущему пользователю:
    
       sudo chmod +x  ~/Desktop/*.desktop
       sudo chown логин  ~/Desktop/*.desktop
    
    
    Добавление классического меню.
    
    Для возвращения классического иерархического меню в стиле GNOME 2 следует
    установить апплет classicmenu:
    
       sudo add-apt-repository ppa:diesch/testing
       sudo apt-get update
       sudo apt-get install classicmenu-indicator
    
    Для активации меню следует найти и запустить  через HUD программу
    classicmenu-indicator, после чего меню появится в верхней части панели.
    
    Отключение скрытых полос прокрутки.
    
    Для возвращения привычных полос прокрутки следует выполнить:
    
       sudo su
       echo "export LIBOVERLAY_SCROLLBAR=0" > /etc/X11/Xsession.d/80overlayscrollbars
    
    Отключение глобального меню.
    
    
    Глобальное меню можно отключить в конфигураторе Unsettings или удалив связанные с ним пакеты:
    
       sudo apt-get autoremove appmenu-gtk appmenu-gtk3 appmenu-qt
    
    Вернуть глобальное меню можно установив пакеты:
    
       sudo apt-get install appmenu-gtk appmenu-gtk3 appmenu-qt
    
    
    В Firefox глобальное меню можно удалить отключив дополнние "Global Menu Bar Integration".
    
    Добавление индикатора мониторинга параметров системы (CPU, сеть, память и т.п.) на панель.
    
    
       sudo add-apt-repository ppa:indicator-multiload/stable-daily
       sudo apt-get update
       sudo apt-get install indicator-multiload
    
    Для активации индикатора следует запустить программу indicator-multiload.
    
    
    Установка GNOME вместо Unity.
    
    Установка классического оформления GNOME:
    
       sudo apt-get install gnome-panel
    
    Установка десктопа GNOME 3:
    
       sudo apt-get install gnome-shell
    
    Установка Cinnamon, форка GNOME Shell с интерфейсом в стиле GNOME 2:
    
       sudo add-apt-repository ppa:gwendal-lebihan-dev/cinnamon-stable
       sudo apt-get update
       sudo apt-get install cinnamon
    
    После установки пакетов, окружение можно выбрать через выпадающее меню менеджера входа в систему.
    
    Для настройки параметров GNOME 3 можно установить конфигуратор GNOME Tweak:
    
       sudo apt-get install gnome-tweak-tool
    
     
    ----* Восстановление стандартного KDE меню после его удаления (например, wine)   Автор: kroz  [комментарии]
     
    Опишу ситуацию на примере подменю wine в меню KDE, так как проблема зачастую
    проявляется именно здесь. Например, мы хотим удалить все установленные
    Windows-программы. Для этого удаляется каталог ~/.wine, однако соответствующие
    пункты KDE меню приложений остаются. Логичным шагом является удаление всего
    подменю Wine. Однако после этого windows-программы больше не появятся в KDE
    меню. Даже если создать подменю с именем Wine, это не изменит ситуацию.
    
    Проблема состоит в том, что при редактировании стандартных пунктов KDE меню,
    появляется вот такой файл:
    
       .config/menus/applications-kmenuedit.menu
    
    Файл описывает кастомизированное меню приложений KDE. Если его удалить
    (переместить), то все модификации стандартных пунктов меню уйдут, в частности,
    появится удаленный пункт меню Wine, и в него будут добавляться
    свежеустановленные Windows-программы.
    
     
    ----* Инструкция по запуску Qt-приложений поверх дисплейного сервера Wayland (доп. ссылка 1)   [комментарии]
     
    Для экспериментов с запуском Qt-приложений поверх  дисплейного сервера Wayland
    следует использовать экспериментальную ветку Qt, в которой обеспечена поддержка
    последних дополнений протокола Wayland (в недавно выпущенном Qt 4.8 этих
    дополнений нет).
    
    Устанавливаем последний срез исходных текстов Qt из Git-репозитория проекта:
    first, you have to clone qtbase:
    
       mkdir qt; cd qt
       git clone git://gitorious.org/qt/qtbase.git
    
    Так как установка Qt будет производиться в отдельную директорию /opt/qt/qt5 в
    процессе экспериментов следует установить следующие переменные окружения
    (например, добавить в .bashrc):
    
       export QTVER=qt5
       export QTDIR=/opt/qt/$QTVER
       export PATH=$QTDIR/bin/:$PATH
       export LD_LIBRARY_PATH=$QTDIR/lib/:$LD_LIBRARY_PATH
       export PKG_CONFIG_PATH=$QTDIR/lib/pkgconfig/:$PKG_CONFIG_PATH
       export QT_PLUGIN_PATH=$QTDIR/lib/plugins/
    
    
    Устанавливаем пакеты, необходимые для сборки Qt и Wayland (пример для Ubuntu 11.10):
    
       apt-get install libxcb1 libxcb1-dev libx11-xcb1 libx11-xcb-dev libxcb-keysyms1 libxcb-keysyms1-dev \
          libxcb-image0 libxcb-image0-dev libxcb-shm0 libxcb-shm0-dev libxcb-icccm4 libxcb-icccm4-dev \
          libxcb-sync0 libxcb-sync0-dev libxcb-xfixes0-dev
    
    Устанавливаем опции сборки Qt:
    
       ./configure -confirm-license -opensource -no-qt3support \
          -no-multimedia -no-webkit -no-phonon -no-v8 -debug -qpa -xcb \
          -wayland -egl -opengl es2 -nomake examples -prefix /opt/qt/qt5
    
    Собираем и устанавливаем Qt в директорию /opt/qt/qt:
    
       make
       make install
    
    Загружаем код платформы qtwayland с дополнениями к Qt для работы поверх Wayland:
    
       cd ../
       git clone git://gitorious.org/qt/qtwayland.git
    
    Для сборки qtwayland требует наличие библиотек Wayland в системе, которые можно
    поставить из PPA-репозитория дистрибутива или собрать вручную.
    
    При необходимости запуска Wayland поверх X-сервера устанавливаем библиотеку libxcomposite:
    
       apt-get install libxcomposite-dev
    
    Собираем и устанавливаем qtwayland:
    
       cd qtwayland/
       qmake
       make
       make install
    
    Для запуска Qt-приложения вначале следует определить директорию XDG, которую
    будут использовать для взаимодействия между собой композитный сервер и клиент Wayland:
    
       export XDG_RUNTIME_DIR=$HOME/.xdg
       mkdir $HOME/.xdg
    
    Собираем Qt-приложение:
    
       cd ../qtbase/examples/opengl/hellowindow
       qmake
       make
    
    Запускаем wayland:
    
       wayland-compositor &
    
    Запускаем Qt-приложение поверх Wayland:
    
       ./hellowindow -platform wayland
    
     
    ----* Возвращение возможности принудительного завершения X-сессии нажатием Ctrl+Alt+Backspace   [комментарии]
     
    Во многих Linux-дистрибутивах блокирована возможность принудительного
    перезапуска X-сервера при нажатии Ctrl+Alt+Backspace, что в случае
    возникновения проблем с видеодрайверами вынуждает совершать перезагрузку всей
    системы. Вернуть возможность принудительного завершения X-сервера через
    Ctrl+Alt+Backspace можно двумя способами:
    
    1. Добавить в файл ~/.xprofile строку:
    
       setxkbmap -option terminate:ctrl_alt_bksp
    
    Чтобы изменение сразу подействовало нужно не забыть выполнить эту команду
    вручную, иначе настройки вступят в силу только после перезапуска X-сервера.
    
    2. Изменить настройки X-сервера, в секцию "InputClass" файла /etc/X11/xorg.conf добавляем:
    
       Option "XkbOptions" "terminate:ctrl_alt_bksp"
    
     
    ----* Дополнительное место в верхней панели в Ubuntu (доп. ссылка 1)   Автор: szh  [комментарии]
     
    В верхней панели в Ubuntu можно получить дополнительное место сократив размер
    записей "Application  Places  System" или их русского эквивалента. Это можно
    сделать с помощью файла перевода.
    
    1. Создаем файл:
    
       msgid ""
       msgstr ""
       "Project-Id-Version: gnome-panel trunk\n"
       "Report-Msgid-Bugs-To: \n"
       "POT-Creation-Date: 2008-05-26 00:59+0000\n"
       "PO-Revision-Date: 2008-05-26 00:59+0000\n"
       "Last-Translator: YOUR NAME\n"
       "Language-Team: None\n"
       "MIME-Version: 1.0\n"
       "Content-Type: text/plain; charset=UTF-8\n"
       "Content-Transfer-Encoding: 8bit\n"
       "Plural-Forms: nplurals=1; plural=0;\n"
       "X-Launchpad-Export-Date: 2008-04-16 01:47+0000\n"
       "X-Generator: Launchpad (build Unknown)\n"
    
       msgid "Applications"
       msgstr "Apps"
    
       msgid "Places"
       msgstr "P"
    
       msgid "System"
       msgstr "Sys"
    
    Новые названия в последних строчках.
    
    2. В терминале выполняем:
    
       msgfmt имя_файла
    
    в результате чего сгенерируется файл messages.mo
    
    3. Копируем созданный файл в директорию с файлами локализации
    
       sudo mv messages.mo /usr/share/locale-langpack/en_US/LC_MESSAGES/gnome-panel-2.0.mo
    
    Здесь в пути возможно вам надо заменить en_US на ru_RU.
    
    4. Перезапускаем панель:
    
       pkill gnome-panel
    
    И все заработает, вместо "Application Places System" в верхнем левом углу
    получим более короткую запись: "Apps P Sys"
    
     
    ----* Одновременная локальная работа двух пользователей на одном компьютере под управлением Ubuntu 11.04   Автор: Пётр Зуев  [комментарии]
     
    В данной статье рассматривается один из способов реализации возможности
    одновременной независимой работы двух пользователей за одним компьютером, при
    этом к одному системному блоку подключается два комплекта монитор/мышь/клавиатура.
    
    Способов реализации подобного решения сейчас существует достаточно много, но,
    их реализация является весьма сложным делом, особенно для неопытных
    пользователей операционных систем Linux. Однако, описанный в данной статье
    способ намного проще в реализации чем большинство аналогичных методов.
    
    Для реализации данного решения необходим компьютер с двухголовой видеокартой
    (желательно nvidia) с подключенными к нему двумя мониторами, мышами и
    клавиатурами, а также установленной операционной системой Ubuntu 11.04.
    
    Для начала необходимо настроить одновременную работу двух мониторов в режиме
    "Separate X screen", если вы это уже сделали то можете смело пропустить данную
    часть статьи и перейти к пункту "настройка устройств ввода"
    
    
    Настройка режима Separate X screen с помощью утилиты nvidia-settings
    
    У владельцев видеокарт nvidia после установки проприетарного драйвера
    видеокарты появляется очень удобная утилита для настройки X-сервера под
    названием nvidia-settings, открываем её и переходим к пункту "X Server Display Configuration"
    
    
    
    Далее кликаете мышкой на второй монитор в окне программы и нажимаете кнопку
    Confugure, после чего в появившемся окне выбираете режим Separate X screen.
    
    
    
    После этого, при необходимости, можно указать разрешение и частоту второго монитора.
    
    Далее, нажмите на кнопку "Save to X Configuration file" и сохраните созданный
    утилитой файл конфигурации X-сервера.
    
    После этого необходимо перезагрузить компьютер и, после выбора пользователя, до
    ввода пароля, отключить лишние визуальные эффекты, выбрав вариант "классическая
    Ubuntu (Без эффектов)"
    
    
    
    Если всё сделано правильно то, после входа в систему на обоих мониторах должен
    появится рабочий стол, при этом курсор мыши может свободно перемещаться с
    одного экрана на другой.
    
    
    Настройка устройств ввода
    
    Приступим к настройке устройств ввода.
    
    Открываем окно терминала и пишем команду:
    
       xinput list
    
    
    
    Ищем в списке вторую мышь и вторую клавиатуру, подключенную к USB интерфейсу и
    запоминаем их id, в моём случае мышь имеет id 10 и клавиатура имеет id 8, у вас
    устройства ввода будут иметь другие id.
    
    Пишем в терминале команду 
    
       xinput create-master seat
    
    После этого на экране появится второй курсор, теперь нам нужно переназначить
    устройства ввода, для этого в терминале пишем команду
    
       xinput reattach 10 "seat pointer"
    
    обратите внимание, что в данном случае вместо числа 10 должно быть число,
    взятое из id второй мыши в списке, полученном нами ранее по команде "xinput
    list", далее пишем команду
    
       xinput reattach 8 "seat keyboard"
    
    число берём из id второй клавиатуры из того же списка.
    
    Курсор второй мыши стоит увести на другой экран, после чего готовой
    конфигурацией можно пользоваться.
    
    Прописываем автозапуск.
    
    Обратите внимание, на то, что изменения сделанные нами с помощью команды xinput
    действуют только до перезапуска X-сервера или до перезагрузки компьютера,
    поэтому, рекомендуется добавить автоматическое выполнение в список автозапуска,
    для этого создаём файл с любым именем в удобном для вас месте, в моём случае
    это файл "seat.sh" в директории /home/petr. Вносим в данный файл строки:
    
       #!/bin/sh
       xinput create-master seat
       xinput reattach 10 "seat pointer"
       xinput reattach 8 "seat keyboard"[[/CODE]]
    
    Обратите внимание, вместо чисел 10 и 8 необходимо указать ваши id, после этого
    прописываем файлу права на запуск, для этого переходим в директорию с файлом и,
    даём файлу права на запуск, например
    
       cd /home/petr
       chmod 700 seat.sh
    
    далее прописываем файл в автозапуск, удобнее всего это сделать открыв окно
    настройки списка запускаемых приложений, (система/параметры/запускаемые приложения)
    
    
    
     
    ----* Установка AMD Catalyst 11.5 на Debian-подобную систему с Linux-ядром 2.6.39 (доп. ссылка 1)   Автор: Карбофос  [комментарии]
     
    Для начала должны быть установлены пакеты:
    
       sudo apt-get install build-essential cdbs fakeroot dh-make debhelper debconf \
          libstdc++6 dkms libqtgui4 execstack libelfg0 ia32-libs
    
    Затем, нужен драйвер Catalyst и патчи к новому ядру:
    
       mkdir atifix
       cd atifix
       wget http://www2.ati.com/drivers/linux/ati-driver-installer-11-5-x86.x86_64.run
       wget http://www.mindwerks.net/wp-content/uploads/2011/03/2.6.39_bkl.patch
       wget http://www.mindwerks.net/wp-content/uploads/2011/03/no_bkl.patch
    
    Распаковываем драйвер и применяем патчи:
    
       chmod +x ati-driver-installer-11-5-x86.x86_64.run
       ./ati-driver-installer-11-5-x86.x86_64.run --extract driver
       mv *.patch ./driver/
       cd ./driver/
       patch -p1 -i 2.6.39_bkl.patch && patch -p1 -i no_bkl.patch
    
    После патчей устанавливаем драйвер:
    
       ./ati-installer.sh 8.85 --install
    
    Более правильный способ установки, использованием штатного пакетного менеджера:
    
    1. узнаём список поддерживаемых дистрибутивов:
    
       ./ati-installer.sh 8.85 --listpkg
    
    2. генерируем установочный пакет для нужного дистрибутива из списка
       ./ati-installer.sh 8.85 --buildpkg YourDistrName
    
    3. устанавливаем. к примеру, пакет для Debian
    
       dpkg -i fglrx*.deb
    
    
    Если во время установки не всплыло никаких зависимостей, то выполняем
    
       aticonfig --initial -f
    
    Перегружаем компьютер или X-Server и проводим на всякий случай диагностику:
    
       cat /var/log/Xorg.0.log | grep EE
    
    После рестарта можно диагностировать с помощью
    
       fglrxinfo и fgl_glxgears
    
     
    ----* Использование двух видеокарт на ноутбуках с поддержкой NVIDIA Optimus в Linux   [комментарии]
     
    В настоящее время многие ноутбуки (например, некоторые модели Asus, Acer, Dell,
    Toshiba и Samsung) поставляются с видеоподсистемой NVIDIA Optimus, позволяющей
    на лету переходить на использование встроенного энергоэффективной видеокарты на
    базе GPU Intel или переключаться на  дискретную карту NVIDIA, потребляющую
    больше энергии, но позволяющую достичь более высокой производительности. Для
    задействования технологии NVIDIA Optimus в Linux можно использовать пакет
    Bumblebee (до переименования Prime-ng) и VirtualGL.
    
    Cвязка Bumblebee и VirtualGL не позволяет в прозрачном режиме переключать
    видеокарты на лету, как это реализовано в драйверах для Windows (проприетарные
    драйверы NVIDIA для Linux не поддерживают технологию Optimus, так как она
    требует внесения изменений в X-сервер и драйверы для карт Intel и NVIDIA).
    
    В штатном режиме при использовании Bumblebee десктоп-окружение работает с
    использованием видеокарты Intel (с поддержкой 3D), дискретная видеокарта NVIDIA
    при этом находится в неактивном состоянии. Для выполнения приложений, требующих
    интенсивных 3D-операций, можно задействовать видеокарту NVIDIA. Для этого
    следует запускать программы при помощи утилиты "optirun32 приложение" или
    "optirun64 приложение", для 64-разрядных систем.
    
    Подобный подход достаточно прост и эффективен, основан на использовании
    стандартных видеодрайверов и не требует при этом переработки X-сервера.
    Возможность запуска приложения с использованием для формирования вывода
    дискретной видеокарты достигается благодаря использованию системы VirtualGL,
    позволяющей перенаправить 3D-команды из OpenGL-приложения на внешний сервер,
    преобразовав сформированные изображения в видеопоток. Таким образом, Bumblebee
    не переключает видеокарты, а позволяет использовать их одновременно (для карт
    NVIDIA поддерживается только пропритетарный драйвер). При этом недостатком
    является то, что неактивная NVIDIA карта не обесточивается в момент простоя и
    продолжает потреблять энергию.
    
    Установка Bumblebee полностью автоматизирована. Готовые пакеты доступны для
    Ubuntu, openSUSE, Arch и Fedora Linux. Для организации переключения между
    видеокартами достаточно загрузить с сайта скрипт install.sh и пакеты,
    содержащиеся в директории install-files.
    
    После загрузки достаточно запустить скрипт install.sh, который сам определит
    тип дистрибутива Linux, загрузит при необходимости проприетарный драйвер
    NVIDIA, установит недостающие пакеты и внесёт изменения в конфигурацию X.Org.
    
     
    ----* Установка драйверов для ATI RadeonHD Series на Linux CentOS 5.x   Автор: Юрий Рогоза  [комментарии]
     
    Прочитав множество статей и тем на форумах, методом чужих и собственных проб и
    ошибок, мне все таки удалось заставить работать мой Radeon HD3870 с драйверами
    и поддержкой OpenGL аппаратного ускорения. По этому поводу, решил написать
    статью, которая,
    возможно окажется полезной другим людям.
    
    Конфигурация на которой выполнялась установка:
       HARDWARE:
           ASUS P5K
           Intel Core 2 Quad Q6600
           2 Gb RAM
           ATI Radeon HD3870 GDDR4
       OS:
           Linux CentOS 5.5 x86_64 [64-bit]
           Стандартное ядро: 2.6.18-194.el5
    
    Итак, откроем консоль и приступим к пошаговой настройке:
    
    Заходим под пользователем root
    
       su
       Пароль: *******
    
    Устанавливаем репозиторий ELRepo
     
       rpm --import http://elrepo.org/RPM-GPG-KEY-elrepo.org
       rpm -Uvh http://elrepo.org/elrepo-release-5-2.el5.elrepo.noarch.rpm
    
    Открываем в любимом текстовом редакторе файл /etc/yum.repos.d/elrepo.repo
      Файл должен содержать 3 репозитория: elrepo, elrepo-testing и elrepo-kernel. Во избежании лишних вопросов для всех 3-х меняем строчку enabled=0 на enabled=1.
    
    Устанавливаем fglrx драйвер x11 и модуль ядра (у меня это x86_64, для 32-битных систем не проверял)
    
       yum install fglrx-x11-drv.x86_64 kmod-fglrx.x86_64
    
    На заметку: модуль ядра fglrx.ko попадает по адресу
    /lib/modules/версия ядра (у меня это: 2.6.18-194.el5)/weak-updates/fglrx/fglrx.ko
    
    
    Другой вариант, установка ATI Catalyst с официального сайта.
    
    Заходим на сайт: http://support.amd.com/us/gpudownload/Pages/index.aspx 
       Step 1 выбираем "Desktop Graphics", 
       Step 2 - "Radeon HD Series",
       Step 3 - Radeon HD xxxx, 
       Step 4 - платформу "x86 или x86_64"
       Step 5 (Display results) и скачиваем отобразившийся проприетарный драйвер.
    
    Инсталлятор скачанного нами драйвера выполнен в формате .run Запускаем:
    
       sh ati-driver-installer*.run
    
    Начинает грузиться инсталлятор, в итоге мы получим окошко с двумя опциями, где
    выбираем: "Install Driver....", нажимаем далее, принимаем лицензионное
    соглашения, далее, выбираем Automatic.
    
    После того как драйвер установлен вручную или из репозитория, приступаем к
    настройке xorg.conf. Запускаем:
    
       aticonfig --initial --input=/etc/X11/xorg.conf
    
    Не пугайтесь! Ваш рабочий xorg.conf будет забэкаплен рядом с новым в /etc/X11/xorg.conf.fglrx-*
    
    Во избежание глюков, откройте в текстовом файле новоиспеченный файл
    конфигурации X-ов etc/X11/xorg.conf и в случае выявления загрузки модулей dri,
    glx, dbe, xv и прочих "полезностей" в секции Section "Module", закомментируйте
    или удалите их совсем. Функции этих модулей возложены на драйвер fglrx.  В
    идеале секция "Module" должна быть пуста и не содержать строк "Load dri" и тому подобных.
    
    Пример файла конфигурации /etc/X11/xorg.conf:
    
       # Xorg configuration created by pyxf86config
       Section "ServerLayout"
           Identifier     "Default Layout"
           Screen      0  "Screen0" 0 0
           InputDevice    "Keyboard0" "CoreKeyboard"
       EndSection
    
       Section "Files"
           ModulePath   "/usr/lib64/xorg/modules/extensions/fglrx"
           ModulePath   "/usr/lib64/xorg/modules"
       EndSection
    
       Section "Module"
       EndSection
    
       Section "InputDevice"
           Identifier  "Keyboard0"
           Driver      "kbd"
           Option      "XkbModel" "pc105"
           Option      "XkbLayout" "us,ru"
           Option      "XkbOptions" "grp:ctrl_shift_toggle"
           Option      "XkbVariant" ",winkeys"
       EndSection
    
       Section "Device"
           # X.org Original Driver r500
           Identifier  "Videocard0"
           Driver      "fglrx"
           BusID       "PCI:1:0:0"
       EndSection
    
       Section "Screen"
           Identifier "Screen0"
           Device     "Videocard0"
           DefaultDepth     24
           SubSection "Display"
                   Viewport   0 0
                   Depth     24
           EndSubSection
       EndSection
    
    Для правильной работы fglrx-модуля ядра выполним (по идее данный этап
    выполняется инсталлятором драйвера Catalyst)
    
       depmod
    
    Перезагрузка или ручная загрузка модуля через "modprobe fglrx" (может
    потребоваться предварительная выгрузка ранее установленного видеодрайвера)
    
    Проверим загрузился ли наш модуль ядра:
    
       lsmod | grep fglrx
       fglrx 2782056  133
    
    Тестирование
    Посмотрим glxinfo
    
       glxinfo | grep render
    
       direct rendering: Yes
       OpenGL renderer string: ATI Radeon HD 3870
       GL_NV_conditional_render, GL_NV_copy_depth_to_color,
    
    Оценим вращающиеся шестерни glxgears
    
       glxgears
    
     
    ----* Обособленная установка дисплейного сервера Wayland в Ubuntu (доп. ссылка 1)   [комментарии]
     
    Ниже представлен скрипт, который позволяет установить дисплейный сервер Wayland
    для проведения экспериментов. Wayland устанавливается в отдельную директорию
    $HOME/install и не влияет на работу основного графического окружения
    дистрибутива, что позволяет без боязни начать экспериментировать с дисплейным
    сервером. Скрипт сам загружает все необходимые зависимости и проверен в Ubuntu 10.10.
    
    Для работы необходима видеокарта NVIDIA и драйвер nouveau со включенным DRI
    (конфигурация также без проблем будет работать с видеокартами Intel), для
    установки которого можно использовать команды (указанные пакеты находятся в
    репозитории Universe):
    
       sudo aptitude install libgl1-mesa-dri-experimental 
       usermod -a -G video логин_пользователя
    
    После установки  nouveau отключаем проприетарный драйвер через System /
    Administration / Additional Drivers и перезагружаем систему.
    Проверить активность DRI можно так:
    
       glxinfo | grep direct
    
       direct rendering: Yes
    
    Далее запускаем установочный скрипт, который работает несколько минут, так как
    пересобирает из git-репозитория свежие версии drm, mesa, xproto, kbproto,
    macros, libX11, libxkbcommon, cairo и wayland.
    
    
     set -u # exit script if anything fails
    
     # You might want to put these in your ~/.bashrc
     PKG_CONFIG_PATH=$HOME/install/lib/pkgconfig/:$HOME/install/share/pkgconfig/
     export PKG_CONFIG_PATH
     ACLOCAL="aclocal -I $HOME/install/share/aclocal"
     export ACLOCAL
     C_INCLUDE_PATH=$HOME/install/include
     export C_INCLUDE_PATH
     LIBRARY_PATH=$HOME/install/lib
     export LIBRARY_PATH
    
     # Do *not* put this in your ~/.bashrc it will break things.
     LD_LIBRARY_PATH=$HOME/install/lib
     export LD_LIBRARY_PATH
    
     mkdir -p $HOME/install/share/aclocal
    
     # Paste these one at a time because they're interactive.
     sudo aptitude remove --purge libegl1-mesa-drivers
     sudo aptitude build-dep libglu1-mesa #   diffstat{a} libx11-xcb-dev quilt 
     sudo aptitude build-dep libcairo2 #   autopoint{a} dh-autoreconf 
     sudo aptitude install libtool libxi-dev libxmu-dev libxt-dev bison flex libgl1-mesa-dev xutils-dev libtalloc-dev 
     sudo aptitude install libdrm-dev autoconf x11proto-kb-dev libegl1-mesa-dev libgles2-mesa-dev 
     sudo aptitude install libgdk-pixbuf2.0-dev libudev-dev libxcb-dri2-0-dev libxcb-xfixes0-dev 
     sudo aptitude install shtool libffi-dev libpoppler-glib-dev libgtk2.0-dev git
    
     git clone git://anongit.freedesktop.org/git/mesa/drm
     cd drm
     ./autogen.sh --prefix=$HOME/install --enable-nouveau-experimental-api
     make
     make install
     cd ..
    
     git clone git://anongit.freedesktop.org/mesa/mesa
     cd mesa/
     ./autogen.sh --prefix=$HOME/install --enable-egl --enable-gles2 --with-dri-drivers= \
       --enable-gallium-nouveau --with-state-trackers=glx,dri,egl
     make
     make install
     cd ..
    
     git clone git://anongit.freedesktop.org/xorg/proto/xproto
     cd xproto
     ./autogen.sh --prefix=$HOME/install
     make install
     cd ..
    
     git clone git://anongit.freedesktop.org/xorg/proto/kbproto
     cd kbproto/
     ./autogen.sh --prefix=$HOME/install
     make install
     cd ..
    
     git clone git://anongit.freedesktop.org/xorg/util/macros
     cd macros
     ./autogen.sh --prefix=$HOME/install
     make install
     cd ..
    
     git clone git://anongit.freedesktop.org/xorg/lib/libX11
     cd libX11
     ./autogen.sh --prefix=$HOME/install
     make install
     cd ..
    
     git clone git://people.freedesktop.org/xorg/lib/libxkbcommon.git
     cd libxkbcommon/
     #./autogen.sh --prefix=$HOME/install --with-xkb-rootdir=/usr/share/X11/xkb
     ./autogen.sh --prefix=$HOME/install
     make
     make install
     cd ..
    
     git clone git://anongit.freedesktop.org/cairo
     cd cairo
     ./autogen.sh --prefix=$HOME/install --enable-gl --enable-xcb
     make
     make install
     cd ..
    
     git clone git://anongit.freedesktop.org/wayland
     cd wayland/
     ./autogen.sh --prefix=$HOME/install
     make
     make install
     cd ..
    
     sudo cp -a wayland/compositor/70-wayland.rules /etc/udev/rules.d/
     sudo udevadm trigger --subsystem-match=drm --subsystem-match=input
    
     mkdir -p $HOME/install/share/X11/
     ln -s /usr/share/X11/xkb $HOME/install/share/X11/
    
    Запуск wayland:
    
       wayland/compositor/compositor &
       sleep 1
       wayland/clients/flower &
       wayland/clients/gears &
       wayland/clients/smoke &
       wayland/clients/terminal &
    
    Особенности сборки для видеокарт Intel отмечены в данной заметке
    
     
    ----* Подключение нескольких ПК к одной клавиатуре и мыши при помощи Synergy (доп. ссылка 1)   Автор: Роман Сукочев  [обсудить]
     
    В рамках проекта Synergy (http://synergy-foss.org/) подготовлен программный
    KVM-переключатель для использования одной клавиатуры и мыши с несколькими
    компьютерами. В отличии от аппаратных переключателей Synergy поддерживает
    единый буфер обмена для всех объединенных машин.
    
    Ниже, будет приведен пример настройки synergy для двух компьютеров под
    управлением Ubuntu. Главный компьютер, с которого управляются другие
    компьютеры, будет называться ubuntu-server, второй компьютер - ubuntu-client.
    Монитор ubuntu-client, физически, расположен слева от ubuntu-server. Не
    забываем, чтобы все работало, нужно, чтобы компьютеры были подключены к одной сети.
    
    Synergy есть в стандартном репозитории, но там довольно старая версия.
    Пакеты с последней unstable-версией можно загрузить здесь. Устанавливаем
    программу на главном и подключаемых компьютерах.
    
       sudo apt-get install synergy
    
    Настройка главного компьютера
    
    Настраивается все довольно просто.
    1. На компьютере, который будет главным, создаете файл в домашнем каталоге файл .synergy.conf:
    
       section: screens
          Ubuntu-server:
          Ubuntu-client:
       end
       section: links
          ubuntu-server:
            left = ubuntu-client
          ubuntu-client:
            right = ubuntu-server
       end
    
    В первой секции 'screens' указаны IP или имена хостов для компьютеров,
    завязанных для работы в synergy.
    Во второй секции 'links' указано отношение компьютера к соседним компьютерам
    (какой находится слева, справа, снизу и сверху)
    
    2. Добавляем запуск synergys в автозагрузку, добавив команду 'synergys' в
    'Система'->'Параметры'->'Запускаемые приложения'. Или 'synergys -c <путь к
    конфигу>', если вы хотите использовать другой файл конфигурации для запуска synergy.
    
    
    Настройка подключаемого компьютера
    
    1. На подключаемом компьютере, добавляем запуск synergyc в автозагрузку,
    добавив команду 'synergyc ubuntu-server' в 'Система'->'Параметры'->'Запускаемые приложения'.
    
    Все. Теперь перезагружаем компьютеры и видим, что поднеся курсор мыши к левой
    границе экрана монитора главного компьютера, курсор перескакивает на экран
    подключенного компьютера и мы можем, мышкой и клавиатурой главного компьютера,
    управлять подключенным.
    
    
    QuickSynergy
    
    Для тех, кто не любит работать с файлами конфигурации вручную, в  репозитории
    Ubuntu есть утилита quicksynergy, которая позволит Вам настроить Synergy в два
    клика :)
    
    1. Скачиваем quicksynergy:
    
       sudo apt-get install quicksynergy
    
    2. Если ранее поставлена unstable-версия synergy с сайта проекта, то
    устанавливаем, игнорируя зависимости:
    
       sudo apt-get install -d quicksynergy
       cd /var/cache/apt/archives/
       sudo dpkg --ignore-depends=synergy -i quicksynergy*.deb
    
    Зависимости мы игнорировали для того, чтобы программа не подтянула с собой
    старый пакет synergy из репозитория, который заменил бы собой, свежий synergy-plus.
    
    3. Запускаем программу 'Приложения'-->'Стандартные'-->'QuickSynergy' и
    настраиваем synergy в пару кликов.
    
    Другие GUI-утилиты для Synergy: QSynergy, Sinerji и другие.
    
     
    ----* Добавление произвольных ссылок в апплет уведомлений Ubuntu (доп. ссылка 1)   [комментарии]
     
    В состав Ubuntu 10.04  добавлен новый апплет уведомлений, который агрегирует
    несколько сервисов по обмену сообщениями в рамках одного значка на панели
    задач. По умолчанию апплет поддерживает Evolution (Mail), Empathy, Pidgin и Gwibber.
    
    Для добавления ссылки на любое приложение в апплет уведомлений достаточно
    создать новый файл в директории /usr/share/indicators/messages/applications/,
    используя в качестве примера один из уже присутствующих файлов:
    
       ls /usr/share/indicators/messages/applications/
    
       empathy  evolution  gwibber  pidgin
    
    Для примера добавим в меню ссылку на программу licq:
    
    создаем файл licq и добавляем в него путь к соответствующему desktop-файлу:
    
       sudo vi /usr/share/indicators/messages/applications/licq
    
       /usr/share/applications/kde/licq.desktop
    
    desktop-файлы можно найти в директории /usr/share/applications
    
    Готовые индикаторы для отображения числа новых сообщений для Thunderbird и
    GMail можно загрузить на страницах https://launchpad.net/libnotify-mozilla и https://launchpad.net/gmailwatcher
    
     
    ----* Выборочное включение эффектов композитного режима в metacity (доп. ссылка 1)   Автор: Аноним  [комментарии]
     
    Иногда достаточно только отбрасываемых теней под окнами (например, для того,
    чтобы улучшить контраст между границами окон). Такие эффекты, как вязкие окна и
    магические кубы из рабочих столов, некоторым пользователям только мешают.
    Однако, многие продолжают устанавливать оконный менеджер Compiz, когда сам
    metacity уже с 2.22 версии GNOME поддерживает эффекты рабочего стола.
    
    Для того, чтобы включить отбрасываемые тени:
    
       gconftool-2 -s '/apps/metacity/general/compositing_manager' --type bool true
    
    Выключить:
    
       gconftool-2 -s '/apps/metacity/general/compositing_manager' --type bool false
    
     
    ----* Организация доступа к рабочему столу Ubuntu/Debian Linux при помощи VNC   Автор: males  [комментарии]
     
    Задача: получить доступ к рабочему столу домашнего компьютера с работы.
    
    Стандартный vino из GNOME не подошел, так как его надо было каждый раз
    запускать. Выбор остановился на x11vnc, настроить с первого захода который не
    получилось - GMOME вылетал через 5 минут после логина с такой ошибкой:
    
       gdm-session-worker[2473]: GLib-GObject-CRITICAL: g_value_get_boolean: assertion `G_VALUE_HOLDS_BOOLEAN (value)' failed
       gdm-session-worker[2473]: pam_succeed_if(gdm:auth): requirement "user ingroup no passwdlogin" not met by user "males"
       gdm-session-worker[2473]: pam_unix(gdm:session): session opened for user males by (uid=0)
       gdm-session-worker[2473]: pam_ck_connector(gdm:session): nox11 mode, ignoring PAM_TTY :0
    
    Ниже, пошаговая инструкция настройки рабочей конфигурации x11vnc:
    
    Удаляем vino и установим x11vnc
    
       sudo apt-get remove vino
       sudo apt-get install x11vnc
    
    после того как все прошло успешно создаем пароль для VNC:
    
       sudo x11vnc -storepasswd пароль /etc/vnc/passwd
    
    если запускать просто x11vnc -storepasswd то пароль создастся в ~/.vnc/passwd,
    что мне не очень-то хотелось.
    
    После того как пароль создан и записан  добавим в самый конец файла
    /etc/gdm/PreSession/Default такую строчку:
    
       /usr/bin/x11vnc -dontdisconnect -display :0 -shared -noxfixes -forever \
          -rfbport 5900 -bg -o /var/log/x11vnc.log -rfbauth /etc/vnc/passwd
    
    теперь по опциям:
    
    -dontdisconnect не отключать клиентов при новом соединении
    
    -display :0 какой дисплей использовать. Если не указать этот параметр у меня
    создавался новый дисплей.
    
    -shared Для подключения более одного пользователя
    
    -noxfixes Что-то связанное с отрисовкой курсора. 
    
    -forever не закрывать x11vnc после разрыва соединения
    
    -rfbport 5900 какой порт использовать
    
    -bg запускать в фоне
    
    последние два параметра это лог и файл паролей.
    
    Если канал маленький можно добавить параметр -notruecolor, чтобы выдавался 8-битный цвет.
    
    С запуском закончили. Теперь добавим в /etc/gdm/custom.conf строчку
    "KillInitClients=true" чтобы при запуске gdm убивал X-клиенты запущенные через init.
    
    Перезапускаем X-ы, заходим от любого пользователя, смотрим запустился ли VNC:
    
       ps -ax | grep x11vnc
    
       1726 ?        Ss     1:51 /usr/bin/x11vnc -dontdisconnect -display :0 
       -noxfixes -shared -forever -rfbport 5900 -bg -o /var/log/x11vnc.log -rfbauth /etc/vnc/passwd
    
       sudo netstat -antp | grep x11vnc
    
       tcp        0      0 0.0.0.0:5900            0.0.0.0:*               LISTEN      1726/x11vnc
       tcp6       0      0 :::5900                 :::*                    LISTEN      1726/x11vnc
    
    вот и всё. теперь можно смело подключаться с удаленного компьютера через VNC.
    
    Для статьи использовались Google, хендбуки и http://linux.die.net/man/1/x11vnc
    
     
    ----* Отключение индикатора раскладки в Gnome 2.30 (доп. ссылка 1)   [комментарии]
     
    В Gnome 2.30 появилась неприятная особенность, выражающаяся в появлении
    индикатора раскладке в трее после настройки клавиатуры. Для отключения
    индикатора нужно выполнить следующее:
    
       gconftool-2 -s /desktop/gnome/peripherals/keyboard/general/disable_indicator -t bool true
    
     
    ----* Включение субпиксельного хинтинга шрифтов в Fedora 13 и openSUSE 11.3 (доп. ссылка 1) (доп. ссылка 2) (доп. ссылка 3) (доп. ссылка 4)   [комментарии]
     
    Для библиотеки FreeType разработан патч (http://www.infinality.net/blog/?p=67),
    приводящий рендеринг Truetype-шрифтов в вид, похожий на результат использования
    метода сглаживания Microsoft Cleartype
    (http://ru.wikipedia.org/wiki/ClearType). Особенно заметно повышение качества
    отображения после использования патча на компьютерах с ЖК монитором.
    
    В отличие от ранее представленных cleartype-патчей для FreeType и режимов
    пиксельного хинтинга и субпиксельной фильтрации, обсуждаемый патч реализует не
    только субпиксельную фильтрацию, но и субпиксельный хинтинг, что подразумевает
    изменение контура букв с учетом субпиксельных границ, а не на основании
    очерчивающих символ пикселов. При растеризации шрифтов патч также повторяет
    особенности Truetype-интерпретатора из состава Windows XP (игнорирует некоторые
    Truetype-инструкции, заложенные в шрифте).
    
    Для настройки шрифтов авторы патча рекомендуют использовать специально
    подготовленный файл конфигурации /etc/fonts/local.conf:
     http://www.infinality.net/files/local.conf
    
    Для установки модифицированной версии FreeType в openSUSE 11.3 достаточно
    установить через сервис One Click мета-пакеты:
    http://opensuse-community.org/subpixel/subpixel.ymp
    http://software.opensuse.org/ymp/home:anshuljain:ubuntu_patch_11.3/openSUSE_11.3/cairo.ymp
    
    В Fedora 13 необходимо подключить репозиторий, подготовленный разработчиками
    infinality.net и установить нужные пакеты из него:
    
       sudo rpm -Uhv http://www.infinality.net/fedora/linux/infinality-repo-1.0-1.noarch.rpm
    
    Ставим патченный FreeType и модифицированные версии библиотек cairo и libXft:
    
       sudo yum install freetype-subpixel cairo-freeworld libXft-freeworld
    
    
    PS. В Ubuntu данные патчи включены по умолчанию.
    
     
    ----* Решение проблем при работе Adobe Flash в полноэкранном режиме   [комментарии]
     
    При возникновении проблем с притормаживанием и заморозкой отображения видео в
    полноэкранном режиме при перемещении мыши можно использовать следующее решение:
    
    Создаем директорию /etc/adobe:
        # mkdir /etc/adobe
    
    Редактируем файл конфигурации mms.cfg 
        # vi /etc/adobe/mms.cfg 
    
    Добавляем в него строку, которая позволяет задействовать GPU-акселерацию при
    выводе на экран для всех видеокарт:
        OverrideGPUValidation = true
    
    Перезапускаем браузер.
    
    
    Инструкцию по допустимым в mms.cfg опциям можно найти
    <a href="http://www.adobe.com/devnet/flashplayer/articles/flash_player_admin_guide.html">здесь</a>
    
    Некоторые полезные опции (формат: опция = число или true/false):
    
    AssetCacheSize  - ограничивает размер кеша;
    
    AutoUpdateDisable  - выключает автоматическое обновление;
    
    AutoUpdateInterval - задает интервал проверки обновлений;
    
    AVHardwareDisable  - запрещает доступ из SWF-файлов к web-камере и микрофону;
    
    DisableDeviceFontEnumeration  - запрещает передачу информации о шрифтах;
    
    DisableNetworkAndFilesystemIn - запрещает сетевые функции и операции с файловой системой;
    
    DisableSockets  - запрещает методы Socket.connect() и XMLSocket.connect();
    
    EnableSocketsTo - позволяет задать белый список серверов к которым разрешено сетевое соединение;
    
    FileDownloadDisable/FileUploadDisable - запрещает использование функций
    загрузки файлов в ActionScript FileReference API;
    
    FullScreenDisable  - запрещает переход в полноэкранный режим
    
    LocalFileReadDisable  - запрещает проигрывание SWF-файлов с локального жесткого диска;
    
    LocalStorageLimit   - ограничивает размер дискового пространства, которое
    допустимо использовать в Flash
    
     
    ----* Добавление редактора главного меню в GNOME 2.30   Автор: Аноним  [комментарии]
     
    Возникла необходимость Fedora 13 быстро отредактировать пункт  меню в GNOME
    2.30. Оказалось, что в этой версии GNOME убрана утилита
    редактирования меню.
    
    Для появления пункта меню "Система / Параметры / Главное меню"
    необходимо установить пакет alacarte-0.13.1-1.fc13.noarch.rpm
    из доступных репозиториев:
    
       yum install alacarte
    
    или скачать вручную из любого зеркала
    (/pub/mirrors/fedora//releases/13/Everything/i386/os/Packages/) и
    воспользоваться командой установки:
    
       rpm -ivh ./alacarte-0.13.1-1.fc13.noarch.rpm
    
     
    ----* Исправление ошибки в gnome-icon-theme, которая проявляется в новом Evolution   Автор: rstone  [комментарии]
     
    В свежеоткомпилированном Evolution 2.30.1 поехала вся разметка.  Выяснилось,
    что отсутствует иконка "Mark mail as not junk" в нужном размере.
    
    Чиним: 
    
       for dir in /usr/share/icons/gnome/{16x16,22x22,24x24,32x32};
       do [ -f $dir/actions/mail-mark-notjunk.png ] && { 
          sudo ln -s $dir/actions/mail-mark-notjunk.png $dir/actions/mail-mark-not-junk.png
       }
       done
    
       sudo gtk-update-icon-cache -f /usr/share/icons/gnome/
    
    В гноме есть открытое сообщение об ошибке по этому поводу: https://bugzilla.gnome.org/show_bug.cgi?id=616954
    
     
    ----* Использование Opera 10.54 и выше с заданным виджетами рабочего стола   Автор: Artem Tashkinov  [комментарии]
     
    Opera 10.54 подгружает поддержку среды рабочего стола (KDE, Gnome или без неё)
    автоматически, основываясь на переменных окружения. Иногда она делает это
    неправильно, а иногда может потребоваться и вовсе отказаться от этой функции и
    использовать заданные вручную диалоги открытия и сохранения файлов.
    
    Для того, что сделать это, наберите в строке адреса следующую строку:
    
       opera:config#FileSelector|Dialogtoolkit
    
    У вас появится выбор из следующих значений:
    
       0 = автоматическое определение (значение по умолчанию)
       2 = GTK
       3 = KDE4
       4 = x11
    
    После этого не забудьте нажать Save (Сохранить) и перезапустите Opera.
    
     
    ----* Удаленное выполнение GUI-приложений от имени другого пользователя (доп. ссылка 1)   Автор: xAnd  [комментарии]
     
    В работе системного администратора иногда возникает необходимость выполнения
    команды от имени другого пользователя. Если доступна консольная версия команды,
    то проблем обычно не возникает, помогает команда su, но если консольной версии
    программы нет, возникают некоторые проблемы с невозможностью вывести
    графическое содержимое на удалённом компьютере.  Можно использовать тот же VNC
    для подключения к удалённому рабочему столу, но если не хочется прерывать
    работы пользователя на помощь может придти X-forwarding.
    
    Данная технология позволяет перенаправить вывод X-сервера (или отдельной
    программы) через тоннель (например SSH) на удалённый компьютер.
    
    Итак, перед нами стоит задача запустить определённую программу от имени другого
    пользователя на удалённом компьютере. На самом деле проблема всего одна.
    X-сервер не может авторизоваться из-за неверного ключа другого пользователя.
    Соответственно наша задача сводится к добавлению этого ключа.
    
    Добавляем свой ключ к пользователю от которого хотим выполнить приложение:
    
        sudo sh -c "cat /home/user/.Xauthority >> /home/user2/.Xauthority"
    
    Теперь осталось просто выполнить команду от имени другого пользователя. В
    качестве примера, запустим утилиту настройки встроенного в среду GNOME
    VNC-клиента Vino:
    
        sudo -u user2 vino-preferences
    
    Осталось добавить только то, что user - это наш пользователь, а user2 -
    пользователь от которого необходимо выполнить программу.
    
    Если пароль пользователя известен, но все гораздо проще, для запуска достаточно выполнить:
    
       ssh -X user2@host2 vino-preferences
    
     
    ----* Удаленное управление рабочим столом в Ubuntu при помощи FreeNX   [комментарии]
     
    При необходимости организации запуска некоторых графических приложений с
    рабочей машины из дома, даже при наличии широкополосного соединения
    использование X11 или VNC достаточно не комфортно. Оптимальным в такой ситуации
    является использование протокола NoMachine NX, позволяющего работать с рабочим
    столом даже при наличии ощутимых задержек при передаче данных.
    
    Настройка сервера
    
    Устанавливаем пакет FreeNX из соответствующего PPA-репозитория:
    
       sudo add-apt-repository ppa:freenx-team
       sudo apt-get update
       sudo apt-get install freenx-server
    
    При необходимости настраиваем сервер через правку /etc/nxserver/node.conf
    
    Запускаем сервер:
    
       sudo /etc/init.d/freenx-server start
    
    Настраиваем сервер:
    
       sudo /usr/lib/nx/nxsetup --install
    
    Выбираем использование ключей аутентификации по умолчанию.
    если используем дополнительные ограничения в конфигурации SSH, например,
    пускаем только избранных пользователей, то добавляем исключения для
    пользователя "nx". В /etc/ssh/sshd_config в секцию AllowUsers или AllowGroups
    добавляем nx и перезапускаем sshd. Также проверяем возможность подключения к
    ssh серверу с хоста 127.0.0.1 (у меня было запрещено в /etc/hosts.allow).
    
    
    Настройка клиента
    
    Устанавливаем открытый клиент на базе библиотеки Qt:
    
       sudo apt-get install qtnx
    
    Или загружаем и устанавливаем deb-пакет с оригинальным проприетарным клиентом с
    сайта http://www.nomachine.com/select-package-client.php
    
       sudo dpkg -i nxclient_3.4.0-7_i386.deb
    
    Запускаем 
    
       qtnx
     
    в опциях по кнопке "Configure" прописываем имя сервера.
    
    или запускаем проприетарный клиент:
       /usr/NX/bin/nxclient 
    
    и следуем инструкции на экране.
    В случае успешного соединения попадаем в окружение удаленного рабочего стола.
    Субъективно проприетарный клиент nxclient и qtnx работают примерно одинаково.
    
    В qtnx не возникло проблем с переключением раскладки клавиатуры по клавише
    CapsLock. Nxclient переключать раскладку при стандартной настройке через GNOME
    отказался и заработал только при запуске на удаленной машине:
    
       setxkbmap -layout 'ru,us' -option "grp:ctrl_shift_toggle" -variant , winkeys
    
     
    ----* Выключение TouchPad в Linux (доп. ссылка 1)   Автор: Kirill A. Korinskiy  [комментарии]
     
    Временное выключение TouchPad:
    
       synclient TouchpadOff=1
    
    Временное включение:
    
       synclient TouchpadOff=0
    
    Вообще, у X.Org-драйвера synaptic много интересных опций, посмотреть которые
    можно через "man synaptics".
    
    Для постоянного выключения через HAL (в старых X11 можно было просто убрать из
    файла конфигурации), надо открыть файл, скажем /etc/hal/fdi/policy/touchpad.fdi
    и поместить в него:
    
       <match key="info.product" string="SynPS/2 Synaptics TouchPad">
        <merge key="input.x11_options.TouchpadOff" type="string">1</merge>
       </match>
    
    вместо "SynPS/2 Synaptics TouchPad" возможно надо будет указать другую строку,
    подробности стоит смотреть в "xinput list":
    
       xinput list| grep -i touch
    
    Еще есть syndaemon или в настройках gnome временное отключение TouchPad.
    
     
    ----* Возвращение кнопок сворачивания и закрытия в Ubuntu 10.04 в правую часть окна   [комментарии]
     
    Начиная с Ubuntu 10.04 кнопки сворачивания и закрытия перемещены в левую часть
    окна, что часто неудобно для бывалых пользователей Linux.
    
    Для придания кнопкам привычного вида, достаточно запустить gconf-editor и в
    иерархии apps/metacity/general установить переменной "button_layout" значение "menu:minimize,maximize,close".
    
    Или из консоли:
    
       gconftool-2 --type string --set /apps/metacity/general/button_layout "menu:minimize,maximize,close"
    
     
    ----* Увеличение скорости работы графического интерфейса Qt4 приложений   Автор: Artem Tashkinov  [комментарии]
     
    Как оказывается, во многих случаях (неправильно установленные драйверы, плохая
    поддержка драйверами требований к ускорению Xrender расширений) можно в
    несколько раз увеличить скорость прорисовки графического интерфейса программ,
    написанных с помощью библиотеки Qt4, запуская их с параметром -graphicssystem, например:
    
       arora -graphicssystem raster
    
    или
    
       arora -graphicssystem opengl
    
    На моём собственном компьютере с разрекламированными "качественными" Open
    Source драйверами от Intel, запуск приложений Qt4 с параметрами
    "-graphicssystem raster", сделал скорость прорисовки содержимого окна сравнимой
    с Windows, тогда как по-умолчанию при изменении размеров окна видно торможение
    прорисовки интерфейса.
    
     
    ----* Неотображение данных в Lotus Notes 8.5 при его запуске в Ubuntu 9.10 (доп. ссылка 1)   [комментарии]
     
    При установке стандартных deb-пакетов с Lotus Notes 8.5 в  Ubuntu 9.10 и других
    достаточно свежих Linux дистрибутивах наблюдаются проблемы с отображением
    данных в основном окне приложения. Lotus запустился, но вместо данных на
    основном экране видна только пустота. Т.е. диалоги показываются, видно что
    Lotus загружает данные и адресную книгу показывает, но на основном экране
    только пустота.
    
    Проблема решается, если в директорию /opt/ibm/lotus/notes скопировать более
    старую версию библиотеки Gtk+.
    Например, копирование libgdk-x11-2.0.so.0,  libgdk_pixbuf-2.0.so.0,
    libgtk-x11-2.0.so.0, libgdk_pixbuf_xlib-2.0.so.0 решает указанную проблему.
    
    Данные библиотеки можно загрузить например здесь
    (http://www.freetechie.com/upload/lotus_notes/) или скопировать из более старой
    версии дистрибутива.
    
     
    ----* Подключение нескольких мониторов к Linux через USB-адаптеры Displaylink (доп. ссылка 1)   [комментарии]
     
    Ниже описан процесс организации второго рабочего места в Debian/Ubuntu Linux,
    подключив к компьютеру USB-хаб к которому подключены дополнительные клавиатура,
    мышь и монитор (через USB2VGA переходник Displaylink).
    
    1. Устанавливаем framebuffer-драйвер для адаптера DisplayLink:
    
    Драйвер udlfb включен в состав staging-ветки ядра 2.6.32, но мы будем
    использовать последний срез исходных текстов из Git-репозитория:
    
       sudo apt-get install module-assistant
       sudo module-assistant prepare
       git clone http://git.plugable.com/webdav/udlfb/
       cd udlfb
       make
       sudo make install
       sudo depmod -a
    
    Если драйвер установлен и загружен корректно, то при подключении монитора через
    адаптер DisplayLinkNow, на мониторе будет отображен "зеленый экран".
    
    2. Устанавливаем X-драйвер для DisplayLink:
    
       sudo apt-get install pkg-config xorg-dev
       cd ~git
       git clone http://git.plugable.com/webdav/xf-video-udlfb/
       cd xf-video-udlfb
       ./configure
       make
       sudo make install
    
    Далее следует поправить несколько файлов конфигурации и скриптов, примеры можно
    загрузить из Git-репозитория проекта udlfb:
    
       git clone http://git.plugable.com/webdav/misc-udlfb/
    
    3. Правим скрипты udev
    
    Создаем с правами root файл /lib/udev/rules.d/50-usbseat.rules 
    
       # set all DisplayLink devices to configuration 1
       # see http://libdlo.freedesktop.org/wiki/DeviceQuirks for more info
       ATTR{idVendor}=="17e9", ATTR{bConfigurationValue}=="2", RUN="/bin/echo 1 > /sys%p/bConfigurationValue"
     
       # aliases for display, kbd, mouse attached to specific hubs
       KERNEL=="fb*",SUBSYSTEMS=="usb",PROGRAM="/bin/cat /sys/%p/../../../devnum",
           SYMLINK+="usbseat/%c/display",RUN+="usbseat.sh %c"
       KERNEL=="mouse*", SUBSYSTEMS=="usb", ATTRS{bInterfaceClass}=="03",
           ATTRS{bInterfaceProtocol}=="02", PROGRAM="/bin/cat /sys/%p/../../../../../../devnum",
           SYMLINK+="usbseat/%c/mouse",RUN+="usbseat.sh %c"
       KERNEL=="event*", SUBSYSTEM=="input", ATTRS{bInterfaceClass}=="03", 
          ATTRS{bInterfaceProtocol}=="01",PROGRAM="/bin/cat /sys/%p/../../../../../../devnum",
          SYMLINK+="usbseat/%c/keyboard",RUN+="usbseat.sh %c"
    
    
    Данный скрипт будет запущен автоматически в момент подключения USB-устройства;
    
    4. Создаем скрипт /lib/udev/usbseat.sh:
    
       #!/bin/bash
       # takes the "seat number" as parameter $1
       # the seat number is the kernel device id of the hub the seat's  devices are sitting off of
       # called once for every usb device that MIGHT be part of a seat, when they arrive or remove 
     
       if [[ !(-n `/bin/pidof gdm`) ]]; then
           exit 0
       fi
     
       seat_running=`/usr/bin/gdmdynamic -l | /bin/sed -n -e "/:$1,/p"`
     
       # $ACTION environment variable is set by udev subsystem
       case "$ACTION" in
    	'remove')
    		if [[ -n "{$seat_running}" ]]; then
    			/usr/bin/gdmdynamic -v -d $1
    		fi
    		;;
    	*)
                    # A device which might be part of a seat has been added
     
    		# if we already have a running seat for this #, exit
    		if [[ -n "${seat_running}" ]]; then
    			exit 0
    		fi
                    if [[ -e /dev/usbseat/$1/keyboard && -e /dev/usbseat/$1/mouse && \
                          -e /dev/usbseat/$1/display ]]; then
     
    			# We have a newly complete seat. Start it.
    			TMPFILE=`/bin/mktemp` || exit 1
    			/bin/sed "s/%ID_SEAT%/$1/g" < /lib/udev/usbseat-xf86.conf.sed > $TMPFILE
    			/usr/bin/gdmdynamic -v -t 2 -s 1 -a \
       "$1=/usr/X11R6/bin/X -br :$1 -audit 0 -nolisten tcp -novtswitch -sharevts -config $TMPFILE"
    			/usr/bin/gdmdynamic -v -r $1
    		fi
    		;;
       esac
     
       exit 0
    
    5. Создаем файл конфигурации для X-сервера:
    
    Создаем файл  /lib/udev/usbseat-xf86.conf.sed:
     
       Section "ServerFlags"
    	Option	"AutoEnableDevices"	"false"
    	Option	"AutoAddDevices"	"false"
    	Option  "DefaultLayout"		"seat"
    	Option	"DontZoom"		"true"
    	Option	"DontZap"		"true"
    	Option	"AllowMouseOpenFail"	"yes"
       EndSection
     
       Section "Module"
    	Load "ddc"
       EndSection
     
       Section "Files"
                                            
        ModulePath      "/usr/lib/xorg/modules"
        ModulePath      "/usr/local/lib/xorg/modules"
       EndSection
     
       Section "Device"
    	Identifier "dl"
    	driver	   "displaylink"
    	Option "fbdev"	"/dev/usbseat/%ID_SEAT%/display"
       EndSection
     
       Section "InputDevice"
    	Identifier "keyboard"
    	Driver	"evdev"
    	Option	"CoreKeyboard"
    	Option	"Device"	"/dev/usbseat/%ID_SEAT%/keyboard"
    	Option	"XkbModel"	"evdev"
    	Option	"XkbLayout"	"us"
       EndSection
     
       Section "InputDevice"
    	Identifier "mouse"
    	Driver	"mouse"
    	Option	"CorePointer"
    	Option	"Protocol" "auto"
    	Option	"Device"	"/dev/usbseat/%ID_SEAT%/mouse"
            Option  "Buttons" "5"
    	Option	"ZAxisMapping" "4 5"
       EndSection
     
       Section "Monitor"
    	Identifier "monitor"
       EndSection
     
       Section "Screen"
    	Identifier "screen"
    	Device "dl"
    	Monitor "monitor"
       EndSection
     
       Section "ServerLayout"
    	Identifier "seat"
    	Screen	0 "screen" 0 0 
    	InputDevice "keyboard" "CoreKeyboard"
    	InputDevice "mouse" "CorePointer"
       EndSection
    
    6. Запрещаем загрузку модуля ядра fbcon чтобы избежать конфликта при работе
    Devicelink через framebuffer.
    
    Создаем /etc/modprobe.d/fbcon.conf 
    
       blacklist font
       blacklist tileblit
       blacklist bitblit
       blacklist fbcon
    
    7. Обходной путь для решения проблемы с некорректным позиционированием экрана
    Добавляем в /etc/gdm/Init/Default после упоминания gdmwhich() вызов xrand для
    установки нормальной ориентации экрана
    
       XRANDR=`gdmwhich xrandr`
       if [ "x$XRANDR" != "x" ]; then
         $XRANDR -o 0
       fi
    
    8. В /etc/rc.local добавляем код для проверки подключения usb-терминала:
    
    
       oldIFS=$IFS
       IFS=/
       for seat in /dev/usbseat/*; do
    	set $seat
    	/lib/udev/usbseat.sh $4
       done
       IFS=$oldIFS
    
    9. Правка /etc/init.d/gdm для использования разных конфигурация для работы с
    несколькими X-серверами:
    
    Добавляем в /etc/init.d/gdm после секции "Allow cdd to override the config"
    (примерно в районе 35 строки):
    
       # При наличии конфигурации для usb монитора подключаем отдельную конфигурацию
       if [ -f /etc/gdm/gdm-usbseat.conf ]; then
          for usbseat in /dev/usbseat/*; do
    	seatid=${usbseat##*/}
    	if [ -e "/dev/usbseat/$seatid/keyboard" -a \
                 -e "/dev/usbseat/$seatid/mouse" -a -e "/dev/usbseat/$seatid/display" ]; then
    	   CONFIG_FILE="--config=/etc/gdm/gdm-usbseat.conf"
    	fi
    	done 
       fi
    
    10. Создаем файл конфигурации /etc/gdm/gdm-usbseat.conf, который будет
    использован вместо gdm.conf для монитора, подключенного через USB-переходник:
    
       [daemon]
       DynamicXServers=true
       FlexibleXServers=0
       Greeter=/usr/lib/gdm/gdmgreeter
     
       [security]
     
       [xdmcp]
      
       [gui]
     
       [greeter]
     
       [chooser]
     
       [debug]
     
       [servers]
       0=inactive
    
    После внесения вышеуказанных изменений при подключении монитора через USB на
    нем должно появиться приглашение для входа в систему
    
     
    ----* Одновременное использование двух мышей на одном экране в X.Org (доп. ссылка 1)   [комментарии]
     
    Несколько дней назад в Debian unstable был добавлен пакет с Xorg 7.5, в котором
    появилась поддержка подсистемы XInput2, позволяющей одновременно задействовать
    на одном экране несколько устройств ввода.
    Ниже показано как обеспечить работу в  X.Org двух манипуляторов мышь, которыми
    можно управлять взяв их в правую и левую руки.
    
    Подключаем вторую мышь (Topro) к ПК и смотрим список доступных устройств ввода:
    
       $ xinput list
       
       Virtual core pointer                  id=2 [master pointer  (3)]
          Virtual core XTEST pointer         id=4 [slave  pointer  (2)]
          "Logitech USB-PS/2 Optical Mouse"  id=10 [slave  pointer  (2)]
          "Topro USB Mouse"                  id=12 [slave  pointer  (2)]
       Virtual core keyboard                 id=3 [master keyboard (2)]
       ...
    
    "Topro USB Mouse" будем использовать левой рукой, а мышь Logitech - правой.
    
    Создаем дополнительное первичное устройство ввода 
    
       $ xinput create-master Auxiliary
    
    Вновь смотрим список устройств:
     
       $ xinput list
       ...  
       Auxiliary pointer           id=13   [master pointer  (14)]
          Auxiliary XTEST pointer  id=15   [slave  pointer  (13)]
          Auxiliary keyboard       id=14   [master keyboard (13)]
          Auxiliary XTEST keyboard id=16   [slave  keyboard (14)]
    
    Переводим мышь Topro (id 12) в категорию Auxiliary:
    
       $ xinput reattach 12 "Auxiliary pointer"
    
    Смотрим, что получилось:
    
       $ xinput list
    
    Мышь Logitech осталась в блоке "Virtual core pointer", а Topro появилась в "Auxiliary pointer".
    
    Теперь два указателя мыши перемещаются по экрану отдельно.
    
    Но для удобства управления поменяем маппинг кнопок для мыши Topro (id 12),
    которую будем держать в левой руке:
    
       $ xinput set-button-map 12 3 2 1
    
    Чтобы видеть какой указатель соответствует каждой мыши поменяем оформление курсора:
    
       $ sudo aptitude install git-core
       $ git clone git://git.ao2.it/xicursorset.git
       $ cd xicursorset
       $ sudo aptitude install libxi-dev libxcursor-dev
       $ make
    
    Меняем курсор для левой мыши (Auxiliary pointer, id 13):
    
       $ ./xicursorset 13 right_ptr redglass
    
    и для правой (Virtual core pointer, id=2):
    
       $ ./xicursorset 2 left_ptr whiteglass
    
    Для тестирования установим приложение vinput, поддерживающие multi-pointer (MPX) режим работы:
    
       $ git clone git://gitorious.org/vinput/vinput.git
       $ cd vinput/demo
       $ gcc -o demo-paint demo-paint.c `pkg-config --cflags --libs xi`
       $ ./demo-paint
    
    В настоящее время MPX не поддерживается в Gtk+ и соответственно не получится
    рисовать одновременно двумя мышами в GIMP или Inkscape, но можно одной мышью
    выбирать инструменты или элементы меню, а другой рисовать. Ситуация изменится с
    выходом Gtk+3. Также перетаскивание одновременно двух окон еще не работает в
    оконном менеджере Metacity, но иконки перетаскивать одновременно в Nautilus с
    перемещением окна в Metacity уже можно. Qt поддерживает мултитач начиная с
    версии 4.6
    
     
    ----* Изменение размера пиктограмм в панели Gtk-приложений (доп. ссылка 1) (доп. ссылка 2)   Автор: bosha  [комментарии]
     
    Чтобы уменьшить размер пиктограмм в панели инструментов Gtk-приложений можно
    создать в своей домашней директории файл .gtkrc-2.0.mine, добавив в него:
    
       gtk-icon-sizes = "panel-menu=16,16:panel=16,16:gtk-button=16,16:gtk-large-toolbar=16,16"
    
    Если размер иконок уже определен в текущей теме, тогда может понадобиться
    переопределить переменную gtk-icon-sizes через создание модифицированной темы.
    
    1. Определяем местонахождение конфигурации текущей темы через меню
    Система/Параметры/Внешний Вид. В нашем случае используется тема Clearlooks,
    настройки которой размещены в директории "/usr/share/themes/Clearlooks"
    
    2. Создаем в домашнем каталоге директорию ".themes".
    
       mkdir ~/.themes
    
    3. Создаем директорию с настройками, имя можно выбрать любое, например, "mycontrol".
    
       mkdir ~/.themes/mycontrol
    
    4. Копируем содержимое текущей активной темы в ~/.themes/mycontrol
    
       cp -R /usr/share/themes/Clearlooks/* ~/.themes/mycontrol
    
    5. Находим и правим в скопированных файлах gtkrc
    
       gedit ~/.themes/mycontrol/gtk-2.0/gtkrc
    
    6. Находим и меняем (или создаем) в фaйле gtkrc переменную gtk-icon-sizes:
    
       gtk-icon-sizes = "panel-menu=16,16:panel=16,16:gtk-menu=16,16:gtk-large-toolbar=22,22:gtk-button=16,16"
    
    7. В параметрах темы в меню Система/Параметры/Внешний Вид (Gnome
    Menu/Desktop/Preferences/Theme) жмем "Настроить" (Theme Details) и выбираем в
    списке "mycontrol".
    
    8. Выходим из десктоп-окружения и заходим вновь для того, чтобы изменения подействовали.
    
     
    ----* Установка драйвера ATI Catalyst в openSUSE 11.2   Автор: Wizard  [комментарии]
     
    Вот и вышла долгожданная openSUSE 11.2 и сразу появились сложности с
    видеоадаптерами производства ATI/AMD... Репозиторий
    http://www2.ati.com/suse/11.2/ не содержит пакетов с нужными драйверами.
    
    Остаётся "запасной" вариант - ati-driver-installer-9-10-x86.x86_64.run, скачанный с сайта AMD.
    
    Однако и здесь есть некоторые сложности - данный инсталлер не может собрать
    RPM-пакет, а установка вручную (у меня) приводит к неработоспособности
    графической подсистемы.
    
    При изучении механизма сборки пакетов, выяснилось, что проблема вызвана
    манипуляциями с RPM_BUILD_ROOT. После правки скриптов/спеков и сборки пакета,
    так же выяснилось, что пакет для x86_64 не содержит библиотек для поддержки
    ускорения видео через VA-API, хотя в ati-driver-installer они присутствуют.
    
    В итоге был создан патч для "лечения" механизма сборки RPM-пакетов для openSUSE
    11.2, последовательность применения которого следующая:
    
       chmod a+x ati-driver-installer-9-10-x86.x86_64.run
       ati-driver-installer-9-10-x86.x86_64.run --extract <куда-нибудь>
       cd <куда-нибудь>
       patch -p1 < путь/к/патчу
       /packages/SuSE/ati-packager.sh --buildpkg SUSE112-AMD64
    
    или, соответсвенно, 
       /packages/SuSE/ati-packager.sh --buildpkg SUSE112-IA32
       rpm -i ../fglrx*.rpm
    
    Собственно, патч:
    
    
    
    diff -Nuar ati.orig/packages/SuSE/ati-packager.sh ati/packages/SuSE/ati-packager.sh
    --- ati.orig/packages/SuSE/ati-packager.sh      2009-10-06 00:23:48.000000000 +0400
    +++ ati/packages/SuSE/ati-packager.sh   2009-11-17 12:12:31.274354947 +0300
    @@ -91,7 +91,7 @@
     END_SED_SCRIPT                                                                                     
                                                                                                        
         #Build the package                                                                             
    -    rpmbuild -bb --root ${TmpDrvFilesDir} --target ${ARCH} ${TmpPkgSpec} >
    ${TmpPkgBuildOut} 2>&1
    +    rpmbuild -bb --target ${ARCH} ${TmpPkgSpec} > ${TmpPkgBuildOut} 2>&1
                                                                                                        
         #Retrieve the absolute path to the built package                                               
         if [ $? -eq 0 ]; then                                                                          
    diff -Nuar ati.orig/packages/SuSE/x740_64a.SUSE112-AMD64.spec ati/packages/SuSE/x740_64a.SUSE112-AMD64.spec
    --- ati.orig/packages/SuSE/x740_64a.SUSE112-AMD64.spec  2009-10-06
    00:23:48.000000000 +0400
    +++ ati/packages/SuSE/x740_64a.SUSE112-AMD64.spec       2009-11-17
    12:12:31.274354947 +0300
    @@ -36,10 +36,9 @@
     %ATI_DRIVER_DESCRIPTION                                                                            
                                                                                                        
     %install                                                                                           
    -export RPM_BUILD_ROOT=%ATI_DRIVER_BUILD_ROOT
     tmpdir=$(mktemp -d /tmp/fglrx.XXXXXX)                                                              
     mkdir $tmpdir/fglrx                                                                                
    -mv $RPM_BUILD_ROOT/* $tmpdir/fglrx
    +mv %ATI_DRIVER_BUILD_ROOT/* $tmpdir/fglrx
     export RPM_SOURCE_DIR=$(mktemp -d /tmp/fglrx.XXXXXX)                                               
     mv $tmpdir/fglrx/suse/* $RPM_SOURCE_DIR                                                            
     #                                                                                                  
    @@ -190,9 +189,7 @@
       install -m 644 amdcccle.desktop        $RPM_BUILD_ROOT/usr/share/applications                    
       install -m 644 amdccclesu.desktop      $RPM_BUILD_ROOT/usr/share/applications                    
       install -m 755 libatiadlxx.so          $RPM_BUILD_ROOT/usr/%{_lib}                               
    -%ifarch %ix86
       install -m 755 libAMDXvBA.cap libAMDXvBA.so.1.0 libXvBAW.so.1.0 $RPM_BUILD_ROOT/usr/%{_lib}      
    -%endif
       install -m 755 libaticaldd.so libaticalrt.so libaticalcl.so $RPM_BUILD_ROOT/usr/%{_lib}          
       install -m 755 libdri.so              $RPM_BUILD_ROOT%{MODULES_DIR}/updates/extensions
       test -f libglx.so && \
    @@ -392,11 +389,9 @@
     /usr/X11R6/lib/libGL.so.1.2
     %endif
     /usr/%{_lib}/libatiadlxx.so
    -%ifarch %ix86
     /usr/%{_lib}/libAMDXvBA.cap
     /usr/%{_lib}/libAMDXvBA.so.1.0
     /usr/%{_lib}/libXvBAW.so.1.0
    -%endif
     /usr/%{_lib}/libaticaldd.so
     /usr/%{_lib}/libaticalrt.so
     /usr/%{_lib}/libaticalcl.so
    diff -Nuar ati.orig/packages/SuSE/x740.SUSE112-IA32.spec ati/packages/SuSE/x740.SUSE112-IA32.spec
    --- ati.orig/packages/SuSE/x740.SUSE112-IA32.spec       2009-10-06 00:23:48.000000000 +0400
    +++ ati/packages/SuSE/x740.SUSE112-IA32.spec    2009-11-17 12:13:54.819085923 +0300
    @@ -36,10 +36,9 @@
     %ATI_DRIVER_DESCRIPTION
    
     %install
    -export RPM_BUILD_ROOT=%ATI_DRIVER_BUILD_ROOT
     tmpdir=$(mktemp -d /tmp/fglrx.XXXXXX)
     mkdir $tmpdir/fglrx
    -mv $RPM_BUILD_ROOT/* $tmpdir/fglrx
    +mv %ATI_DRIVER_BUILD_ROOT/* $tmpdir/fglrx
     export RPM_SOURCE_DIR=$(mktemp -d /tmp/fglrx.XXXXXX)
     mv $tmpdir/fglrx/suse/* $RPM_SOURCE_DIR
     #
    
    
    
     
    ----* Решение проблем s2ram и s2disk на Thinkpad T61p с видеокартой nVidia FX570 (доп. ссылка 1)   [комментарии]
     
    Решение проблем с работой suspend и hibernate режимов из-за видеокарты nVidia в
    SLED или openSUSE. После попытки проснуться, ноубтук перестает реагировать и
    отображает только черный экран. Судя по всему проблема вызвана конфликтом из-за
    наличия в системе двух видеоадаптеров - встроенного и дополнительного.
    
    Решить проблему удалось изменив способ работы с AGP.
    
    Шаг 1. Проверьте, какой AGP драйвер загружается:
    
       lsmod | grep agp
    
    Я получил intel_agp, но у вас может быть sis_agp или via_agp, в зависимости от материнской платы. 
    
    Шаг 2. Запрещение загрузки модуля ядра intel_agp (или  agppart, sis_agp,
    via_agp). В /etc/modprobe.local добавляем:
    
       blacklist intel_agp
    
    Шаг 3. Определяем, какие возможности поддерживаются драйвером:
    
       cat /proc/driver/nvidia/registry
    
    Найдите NvAGP: 3. Число - это поддерживаемое AGP состояние.
    
    Шаг 4. Изменяем настройки X.Org, в /etc/X11/xorg.conf меняем содержимое секции [Device].
    
    Было:
    
       Section "Device"
         BoardName    "Quadro FX 570M"
         Driver       "nvidia"
         Identifier   "Device[0]"
         VendorName   "NVidia"
       EndSection
    
    Стало (добавлено Option "NvAGP" "3"):
    
       Section "Device"
         BoardName    "Quadro FX 570M"
         Driver       "nvidia"
         Identifier   "Device[0]"
         VendorName   "NVidia"
         Option        "NvAGP" "3"
       EndSection
    
     
    ----* Замена дисплейного менеджера на Qingy в Gentoo Linux (доп. ссылка 1)   Автор: TheMixa  [комментарии]
     
    В случае когда X Display Manager (XDM, KDM, GDM) используется только для выбора
    сессии и аутентификации,
    вместо него можно установить Qingy (http://qingy.sourceforge.net/), замену
    getty, использующую Framebuffer
    и DirectFB для вывода графики и поддерживающую как X-сессии так и текстовую
    консоль. Кроме того, Qingy позволяет
    запустить более одной X-сессии, использовать хранитель экрана и организовать
    автоматический вход в систему.
    
    Установка Qingy в Gentoo Linux:
    
    1. устанавливаем dev-libs/DirectFB (-X +fbdev) и sys-apps/qingy (+directfb)
    
    2. берем fbset и его вывод записываем в /etc/fb.modes, также в /etc/directfbrc указываем этот режим
    
    3. меняет в inittab на нужных нам консолях agetty на qingy
    
    4. в файле конфигурации qingy указываем нужную тему (мне понравились matrix и vendetta3)
    
    5. отключаем XDM и перезагружаемся для верности
    
    За счет избавления от лишнего звена скорость загрузки изменилась в лучшую сторону. 
    
     
    ----* Захват видео непосредственно с X-сервера (доп. ссылка 1)   Автор: xAnd  [комментарии]
     
    Задача: снять видео с рабочего стола Ubuntu.
    
    Устанавливаем ffmpeg и кодеки:
    
       sudo apt-get install ffmpeg
       sudo apt-get install libavcodec-unstripped-52 libavdevice-unstripped-52 libavformat-unstripped-52 \
       libavutil-unstripped-49 libpostproc-unstripped-51 libswscale-unstripped-0 ffmpeg faac
    
    Команда, которая пишет видео с рабочего стола:
    
       ffmpeg -f x11grab -s 1280x800 -r 25 -i :0.0 -vcodec qtrle screenvideo.mov
    
    Разберёмся с параметрами командной строки:
    
    -f x11grab - источник сигнала (в нашем случае X-сервер);
    
    -i :0.0 - экран X-сервера или просто номер монитора;
    
    -s 1280x800 - захватываемое разрешение экрана (тут очень рекомендую сохранять пропорции экрана, 
    а ещё лучше жать в натуральное разрешение экрана, ибо потеря качества очень серьезная);
    
    -r 25 - количество кадров в секунду;
    
    -vcodec qtrle - кодек для захвата (параметр необязательный, по идее ffmpeg определяет тип кодека 
    автоматически по расширению выходного файла);
    
    screencast.mov - собственно выходной файл. Можно указывать полный путь.
    
    
    После выполнения указанной команды сразу же начнётся процесс записи.
    Чтобы остановить запись необходимо нажать "q" в терминале, в котором идёт процесс захвата.
    
    Для удобства публикации, полученный файл можно конвертировать в формат .flv тем
    же ffmpeg'ом, например так:
    
       ffmpeg -i screencast.mov screencast.flv
    
     
    ----* Приемы использования GConf для тонкой настройки GNOME (доп. ссылка 1) (доп. ссылка 2)   [комментарии]
     
    Для изменения параметров GNOME будем использовать утилиту gconftool-2, вызываемую в формате:
       gconftool-2 --set путь_к_настройке --type "значение"
    
    Управление равертыванием окна за пределы экранной области (например, полезно
    для устройств с низким экранным разрешением):
    
       gconftool-2 --set /apps/compiz/plugins/move/allscreens/options/constrain_y --type bool 0
    
    Изменение громкости из командной строки (по умолчанию установлено 6):
    
       gconftool-2 --set --type int /apps/gnome_settings_daemon/volume_step 2
    
    Открывать в Nautilus директорию с содержимым после распаковки архива в File-roller:
    
       gconftool-2 --type boolean --set /apps/file-roller/dialogs/extract/view_destination_folder true
    
    Отображать на десктопе пиктограммы примонтированных дисковых разделов:
    
       gconftool-2 --type boolean --set /apps/nautilus/desktop/volumes_visible true
    
    Включить проверку наличия обновленной версии дистрибутива:
    
       gconftool-2 --type boolean --set /apps/update-manager/check_dist_upgrades true
    
    Включение возможности отсоединения тулбаров для GTK+ приложений:
    
       gconftool-2 --type boolean --set /desktop/gnome/interface/toolbar_detachable true
    
    Изменение программы для автоматического просмотра DVD с Totem на VLC или gxine:
    
       gconftool-2 --type string --set /desktop/gnome/volume_manager/autoplay_dvd_command "gxine dvd:/%m"
    
       gconftool-2 --type string --set /desktop/gnome/volume_manager/autoplay_dvd_command "vlc %m"
    
    Изменение гарнитуры и размера шрифтов для элементов десктопа:
    
       gconftool-2 --set /apps/nautilus/preferences/desktop_font --type string "Sans 8"
    
       gconftool-2 --set /desktop/gnome/interface/document_font_name --type string "Sans 8"
    
       gconftool-2 --set /desktop/gnome/interface/font_name --type string "Sans 8"
    
       gconftool-2 --set /apps/metacity/general/titlebar_font --type string "Sans Bold 8"
    
       gconftool-2 --set /desktop/gnome/interface/monospace_font_name --type string "Monospace 8"
    
    Изменение DPI для рендеринга шрифтов в GNOME, если 0 то значение берется от X сервера:
    
      gconftool-2 --type integer -s /desktop/gnome/font_rendering/dpi 96
    
    Выключение отображения пиктограмм на десктопе:
    
       gconftool-2 --set --type boolean /apps/nautilus/preferences/show_desktop false
    
    Удаление ссылок о спящем и ждущем режиме из диалога завершения работы:
    
       gconftool-2 --type boolean --set /apps/gnome-power-manager/can_suspend false
       gconftool-2 --type boolean --set /apps/gnome-power-manager/can_hibernate false
    
    Для применения настройки для всех пользователей, а не только для текущего пользователя:
    
       gconftool-2 --direct--config-source xml:readwrite:/etc/gconf/gconf.xml.defaults --type boolean \
         --set /apps/gnome-power-manager/can_hibernate false
       gconftool-2 --direct --config-source xml:readwrite:/etc/gconf/gconf.xml.defaults --type boolean \
         --set /apps/gnome-power-manager/can_suspend false
    
    Назначение горячих клавиш Ctrl+C и Ctrl+V для копирования и вставки текста в gnome-terminal:
    
       gconftool-2 -t str -s /apps/gnome-terminal/keybindings/copy "<Control>c"
       gconftool-2 -t str -s /apps/gnome-terminal/keybindings/paste "<Control>v"
    
    Установка пути к фоновому изображению:
       
       gconftool-2 --type string -s /desktop/gnome/background/picture_filename "/home/user/image.jpg"
    
    Отображать или нет фоновое изображение:
    
       gconftool-2 --type bool -s /desktop/gnome/background/draw_background false
    
    Управление отображением строки текущего пути в nautilus:
    
       gconftool-2 --type boolean --set /apps/nautilus/preferences/always_use_location_entry true
    
    Отображать на десктопе содержимое домашней директории, а не "$HOME/Desktop":
    
       gconftool-2 --type boolean --set /apps/nautilus/preferences/desktop_is_home_dir true
    
    Управление размещением различных служебных пиктограмм (computer|home|trash)на десктопе:
    
       gconftool-2 --type boolean --set /apps/nautilus/desktop/[computer|home|trash]_icon_visible true
    
    Отображать окно выхода при завершении работы:
    
       gconftool-2 --type boolean --set /apps/gnome-session/options/logout_prompt false
    
    Выбор оконного менеджера для запуска:
    
       gconftool-2 --type string --set /apps/gnome-session/rh/window_manager "/usr/bin/icewm"
    
    Установка параметров монтирования USB Flash с файловой системой VFAT:
    
      gconftool-2 --type list --set /system/storage/default_options/vfat/mount_options --list-type string '[shortname=winnt,uid=]'
    
    Включение удаленного доступа к десктопу через VNC:
    
      gconftool-2 --set /desktop/gnome/remote_access/authentication_methods --type list --list-type string '[vnc]'
      gconftool-2 --set /desktop/gnome/remote_access/vnc_passwd \
        --type string `echo -n 'my_vnc_password' | base64`
      gconftool-2 --set /desktop/gnome/remote_access/enabled --type bool true
    
    Просмотр содержимого базовых настроек GNOME:
    
       gconftool-2 -R /desktop/gnome
    
     
    ----* Решение проблем с перерисовкой окон в Compiz с новыми драйверами NVIDIA  (доп. ссылка 1) (доп. ссылка 2)   Автор: Waster  [комментарии]
     
    После очередного обновления драйверов NVIDIA обнаружил очень неприятную
    проблему с перерисовкой символов внутри gnome-terminal,
    например, если запустить mc. Эта проблема наблюдается, если запущен Compiz. 
    Некоторые также обнаруживают проблемы с перерисовкой не только окна терминала,
    но и вообще окон Gnome.
    Выяснилось, что в моем случае необходимо включить Indirect Rendering в Compiz,
    чтобы эта проблема исчезла.
    К сожалению, это немного сказывается на производительности, так что решите для
    себя сами, нужен ли Compiz, или нет.
    Также некоторым помогает добавление опции --loose-binding при старте Compiz.
    
    Для включения Indirect Rendering в Ubuntu нужно добавить в файл
    /etc/xdg/compiz/compiz-manager строчку
    
       INDIRECT="yes"
    
    Если вокруг окон отображаются лишние бордюры, можно попробовать выполнить:
    
       sudo nvidia-xconfig --add-argb-glx-visuals -d 24
    
    или указать в /etc/X11/xorg.conf
    
        DefaultDepth 24
        Option "AddARGBGLXVisuals" "true"
    
    При появлении проблем с обновлением окон (содержимое "замерзает") при
    использовании драйверов ati или intel,
     в /etc/X11/xorg.conf можно добавить:
    
       Option "XAANoOffscreenPixmaps" "true"
    
    
    Подборка рекомендаций о решении проблем с Nvidia драйверами от посетителя pavlinux:
    
    Настройки, которые можно попробовать в случае проблем:
    
       Option         "DamageEvents" "True"            # Не работает при SLI
       Option         "DisableGLXRootClipping" "True"  # для серии 100.xx.xx, но старее 100.14.19
       Option         "AllowGLXWithComposite" "True"   # для версии старее 9639
       Option         "UseEvents" "False"              # улучшение работы OpenGL рендеринга
       Option         "TripleBuffer" "True"            # улучшение качества, испольщовать с включенным Sync2VBlank в OpenGL
       Option         "BackingStore" "True"            
       Option         "RenderAccel" "True"
       Option         "AddARGBGLXVisuals" "True"
       Option         "MultisampleCompatibility" "True"  # использование раздельных фронтального и фонового multisample буферов
    
    # Оптимизиция процесса запуска
    
       Option         "NoLogo" "true"
       Option         "NvAGP" "1"  
       Option         "NoPowerConnectorCheck" "off"
       Option         "NoBandWidthTest" "on"
    
    Если на компьютере есть MSI, то грузить модуль с 
       modprobe nvidia NVreg_EnableMSI=1
    
    Подобрать правильный NVreg_RemapLimit:
    
    для 256Mb DDR3 NVreg_RemapLimit=0x0f800000
    для 512MB DDR3 NVreg_RemapLimit=0x1F000000
    для 768MB DDR3 NVreg_RemapLimit=0x2E800000
    для 1Gb   DDR3 NVreg_RemapLimit=0x3E000000
    
    
    До версии 177.67, добавить в xorg.conf
    
       Option "PixmapCacheSize" "1000000"
       Option "AllowSHMPixmaps" "0"
    
    в /etc/X11/xinit дописать
    
       nvidia-settings -a InitialPixmapPlacement=2 -a GlyphCache=1
    
    Испробовать варианты с
    
       # export __GL_YIELD="NOTHING"
       # export QT_NO_GLIB=1
    
    
    В ядре выключить CONFIG_PCI_MMCONFIG, и все framebuffer драйверы, кроме CONFIG_FB_VESA=y
    
    Распаковать драйвер -
       # NVIDIA-Linux-x86_64-180.44-pkg2.run --extract-only
    
    залезть редактором в NVIDIA-Linux-x86_64-180.44/usr/src/nv/Makefile.kbuild
    найти EXTRA_CFLAGS
    дописать -UDEBUG -U_DEBUG -DNDEBUG -UNVDEBUG -URMDEBUG -UDEBUGGING -UDBG
    
     
    ----* Включение круговой прокрутки на тачпадах Synaptics (доп. ссылка 1)   Автор: Alinaki  [комментарии]
     
    В заметке показано как включить в драйвере  Synaptics поддержку "круговой
    прокрутки", при включении которой,
    возможно совершение непрерывного скроллинга через описывание пальцем
    непрерывных круговых движений,
    начиная с заданного угла тачпада. При этом круги по часовой стрелке приводят к
    прокрутке вниз, против - к прокрутке вверх.
    Также показано как эмулировать нажатие правой кнопки мыши через прикосновение
    двумя пальцами, а левой кнопки - тремя.
    
    В xorg.conf изменяем секцию InputDevice, привязанную к тачпаду Synaptics:
    
       Section "InputDevice"
          Identifier "Synaptics Touchpad"
          Driver "synaptics"
          Option "SendCoreEvents" "true"
          Option "Device" "/dev/psaux"
          Option "Protocol" "auto-dev"
          Option "CircularScrolling" "on" # Включить круговую прокрутку
          Option "CircScrollTrigger" "2" # Привязка начала кругов на правый верхний угол
          Option "HorizEdgeScroll" "on" # Горизонталная прокрутка по нижнему краю
          Option "SHMConfig" "on" # Системная настройка, необходима для следующих строк
          Option "TapButton2" "3" # Два пальца - на правую кнопку
          Option "TapButton3" "2" # Три пальца - на среднюю (колесо)
       EndSection
    
    Привязки распределены следующим образом:
    0 Любой, 1 Верхняя кромка, 2 Правый верхний угол, 3 Правая кромка, 4 Правый
    нижний угол, 5 Нижняя кромка
    6 Левый нижний угол, 7 Левая кромка, 8 Левый верхний угол
    
    Если тачпадом поддерживается распознавание ладони, то можно включить опцию PalmDetect и 
    навсегда забыть о случайных нажатиях на панель во время печати. Подробнее в "man synaptics".
    
     
    ----* CentOS 5.2 и некорректная прорисовка экрана в vnc-server   Автор: User  [комментарии]
     
    При использовании в xorg.conf vnc модуля из стандартного пакета vnc-server-4.1.2-9.el5.i386.rpm 
    обнаружена проблема: неправильная прорисовка экрана.
    
    Метод лечения:
    
    1. Удаляем vnc-server-4.1.2-9
    
    2. Забираем vnc-4_1_3-x86_linux.rpm с сайта http://realvnc.com
    
    3. Ставим vnc-4_1_3-x86_linux.rpm
    
    4. Делаем ссылку
    
       ln -s /usr/X11R6/lib/modules/extensions/vnc.so /usr/lib/xorg/modules/extensions/vnc.so
    
    5. Выполняем ldconfig
    
    6. All ok!
    
     
    ----* Настройка клавиатуры в X.Org 7.4 / X-Server 1.5 (доп. ссылка 1) (доп. ссылка 2)   Автор: kaktyc  [комментарии]
     
    В xorg-server-1.5.x, если не отключить при компиляции X-сервера, конфигурация устройств ввода 
    осуществляется не в xorg.conf, а через HAL. Это позволяет подключать различные
    клавиатуры и мышки "на лету"
    и они будут работать без необходимости рестарта иксов. Но при этом, например
    для настройки раскладки,
    возникает необходимость правки xml-конфигов HAL вместо простого и удобного файла xorg.conf. 
    
    Например, чтобы реализовать настройку в xorg.conf:
    
       Option "XkbLayout" "us,ru(winkeys)"
       Option "XkbOptions" "grp:shift_caps_toggle,grp_led:scroll,caps:internal,compose:ralt"
    
    Необходимо создать файл /etc/hal/fdi/policy/10-keymap.fdi следующего содержания:
       <?xml version="1.0" encoding="ISO-8859-1"?> 
        <deviceinfo version="0.2">
          <device>
            <match key="info.capabilities" contains="input.keymap">
              <append key="info.callouts.add" type="strlist">hal-setup-keymap</append>
            </match>
    
            <match key="info.capabilities" contains="input.keyboard">
              <merge key="input.xkb.rules" type="string">base</merge>
              <merge key="input.xkb.layout" type="string">us,ru</merge>
              <merge key="input.xkb.options" type="string">grp:shift_caps_toggle,grp_led:scroll,caps:internal,compose:ralt</merge>
              <merge key="input.xkb.variant" type="string">,winkeys</merge> 
    
            </match>
          </device>
        </deviceinfo>
    
    Отключается такое поведение добавлением в xorg секции:
    
       Section "ServerFlags"
         Option "AutoAddDevices" "False"
       EndSection
    
    Другой вариант, задействовать setxkbmap, поместив в ~/.xsessionrc строчку:
    
       setxkbmap "us,ru" ",winkeys" "grp:caps_toggle"
    
     
    ----* Управление десктоп приложениями из shell при помощи D-Bus (доп. ссылка 1)   [комментарии]
     
    В качестве консольной утилиты для работы с D-Bus можно использовать "qdbus" из состава Qt4.
    
    При выполнении без аргументов, утилита qdbus выведет список активных  шин:
    
       qdbus
    
       org.freedesktop.ScreenSaver
       org.freedesktop.Notifications
       org.freedesktop.PowerManagement
       org.freedesktop.DBus
    
    Отобразим список объектов для шины ScreenSaver:
    
       qdbus org.freedesktop.ScreenSaver
    
       /
       /App
       /Interface
       /KBookmarkManager
       /KBookmarkManager/konqueror
       /KDebug
       /MainApplication
       /ManagerIface_contact
       /ScreenSaver
    
    Просмотрим методы объекта "/ScreenSaver":
    
       qdbus org.freedesktop.ScreenSaver /ScreenSaver
    
       signal void org.freedesktop.ScreenSaver.ActiveChanged(bool)
       method bool org.freedesktop.ScreenSaver.GetActive()
       method uint org.freedesktop.ScreenSaver.GetActiveTime()
       method bool org.freedesktop.ScreenSaver.SetActive(bool e)
       method void org.freedesktop.ScreenSaver.Lock()
       method uint org.freedesktop.ScreenSaver.Inhibit(QString application_name, QString reason_for_inhibit)
       ...
    
    Посмотрим значение текущего счетчика времени неактивности, после которого 
    активируется хранитель экрана. Просмотрим текущее значение:
    
       qdbus org.freedesktop.ScreenSaver /ScreenSaver org.freedesktop.ScreenSaver.GetSessionIdleTime
    
       0
    
    С момента последнего нажатия клавиши прошло 0 сек. Попробуем ничего не нажимать:
    
       sleep 5 ; qdbus org.freedesktop.ScreenSaver /ScreenSaver org.freedesktop.ScreenSaver.GetSessionIdleTime
    
       4
    
    Попробуем активировать хранитель экрана через метод org.freedesktop.ScreenSaver.SetActive:
     
       qdbus org.freedesktop.ScreenSaver /ScreenSaver org.freedesktop.ScreenSaver.SetActive True
    
       true  
    
    Блокируем экран:
    
       qdbus org.freedesktop.ScreenSaver /ScreenSaver org.freedesktop.ScreenSaver.Lock
    
    В случае когда нужно предотвратить запуск хранителя экрана, например, во время
    просмотра видео, можно использовать:
    
       qdbus org.freedesktop.ScreenSaver /ScreenSaver \
          org.freedesktop.ScreenSaver.Inhibit "$$" "Testing D-Bus Interface"
    
       5822
    
    где, "$$" - имя приложения запретившего активацию хранителя экрана, 
    в нашем случае это PID текущего shell (5822).
    второй аргумент - причина сдерживания хранителя экрана.
    
    После того как хранитель экрана можно опять активировать, выполняем:
    
       qdbus org.freedesktop.ScreenSaver /ScreenSaver \
         org.freedesktop.ScreenSaver.UnInhibit 5822
    
    
    Другие примеры.
    Просмотрим список заметок из Tomboy.
    
       qdbus org.gnome.Tomboy /org/gnome/Tomboy/RemoteControl org.gnome.Tomboy.RemoteControl.ListAllNotes
    
       note://tomboy/5e900d91-bd77-4f41-89d8-e71baaafd364
       note://tomboy/f647c681-b1b9-4eca-bdab-fd4b04cb37f6
    
    Отобразим содержимое одной из них:
    
       qdbus org.gnome.Tomboy /org/gnome/Tomboy/RemoteControl \
         org.gnome.Tomboy.RemoteControl.GetNoteContents note://tomboy/5e900d91-bd77-4f41-89d8-e71baaafd364
    
     
    ----* Изменение клавиш быстрого вызова пунктов меню в gtk приложениях (доп. ссылка 1)   Автор: GiNeR  [обсудить]
     
    Для изменения клавиш быстрого вызова в GTK2 приложениях на лету:
    
    Для Gnome:
    Проверяем не включено ли:
       gconftool -g /desktop/gnome/interface/can_change_accels
    
    Если false:
       gconftool -t boolean -s /desktop/gnome/interface/can_change_accels true
    
    Для других оконных менеджеров и приложений (не использующих gconf2):
       echo gtk-can-change-accels = 1 >> ~/.gtkrc-2.0
    
    Если не работает, например в SUSE, нужно создать пустой файл
    ~/.no-qtrc-to-gtkrc-mapping и перезайти в X-ы.
    
    
    После того как горячее назначение клавиш включено, достаточно подвести курсор мыши 
    к нужному пункту меню приложения и нажать удобное сочетание клавиш, оно запоминается.
    
     
    ----* Обмен данными между буфером обмена X-ов и консолью (доп. ссылка 1)   [комментарии]
     
    Для копирования данных в буфер обмена X Window из консоли следует использовать
    утилиты xclip и xsel.
    
    Устанавливаем в Debian/Ubuntu:
       sudo apt-get install xclip
    
    в Fedora/RHEL/CentOS:
       yum install xclip
    
    Копируем вывод команды в буфер обмена:
       sort file.txt | xclip
    
    Выводим содержимое буфера обмена в стандартный поток, который записываем в файл:
       xclip -o > file.txt
    
    Например, так можно отсортировать данные в буфере обмена:
       xclip -o | sort | xclip
    
    посчитать число строк:
       xclip -o | wc | xclip
    
    или перекодировать текст:
       xclip -o | iconv -f cp1251 -t utf-8 | xclip
    
    Компана xsel, выполняет аналогичные действия:
       pwd | xsel
       xsel -o |less
    
     
    ----* Улучшение отображения шрифтов в X Window   [комментарии]
     
    Первым делом нужно проверить собрана ли библиотека freetype2 с опцией
    TT_CONFIG_OPTION_BYTECODE_INTERPRETER, 
    как правило отключаемой в дистрибтуивах из-за лицензионных ограничений
    Для владельцев ноутбуков внимание также можно обратить на сборку с опцией WITH_LCD_FILTERING,
    но это может потребовать обновления и пересборки cairo и libXft.
    
    В основанный на RPM дистрибутивах Linux, загружаем src.rpm пакет и пересобираем.
    
    Разворачиваем исходные тексты:
       rpm -i ~/rpmbuild/SRPMS/freetype-2.3.5-3.fc8.src.rpm
    
    Пересобираем
       rpmbuild -bb --with bytecode_interpreter ~/rpmbuild/SPECS/freetype.spec
    или, если в spec файле определено %define without_bytecode_interpreter 1
       rpmbuild -bb --with withhout_bytecode_interpreter=0 ~/rpmbuild/SPECS/freetype.spec
    или перед сборкой редактируем spec файл и раскомментируем строчки связанные с bytecode
    например для OpenSUSE - "%%patch100 -p 1 -b .bytecode"
    
    Устанавливаем собранный пакет:
       rpm -Uvh --force ~/rpmbuild/RPMS/freetype-2.1.4-2.fc7.x86_64.rpm
    
    
    В последних версиях Debian/Ubuntu достаточно выбрать Bytecode interpreter и  Subpixel rendering
    настройки при выполнении
       sudo dpkg-reconfigure fontconfig
    
    
    Во FreeBSD при сборке порта по умолчанию включается TTF_BYTECODE_ENABLED:
       cd /usr/ports/print/freetype2/
       make WITH_LCD_FILTERING=yes
       make install
    
    
    Копируем Windows шрифты в ~/.fonts
    Если загрузка шрифтов из этой директории в дистрибутиве не настроена, то
    переходим в данную директорию и запускаем "mkfontdir" и "fc-cache ./"
    В Debian/Ubuntu/Fedora можно поставить пакет msttcorefonts или msttcore-fonts.
    Проводим тюнинг параметров fontconfig, создав ~/.fonts.conf
    
    <?xml version="1.0"?>
    <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
    <fontconfig>
     <match target="font" >
      <edit mode="assign" name="antialias" >
       <bool>true</bool>
      </edit>
     </match>
     <match target="font" >
      <edit mode="assign" name="autohint" >
       <bool>true</bool>
      </edit>
     </match>
     <match target="font" >
      <edit mode="assign" name="hinting" >
       <bool>true</bool>
      </edit>
     </match>
     <match target="font" >
      <edit mode="assign" name="hintstyle" >
       <const>hintfull</const>
      </edit>
     </match>
     <match target="font" >
      <edit mode="assign" name="rgba" >
       <const>none</const>
      </edit>
     </match>
    </fontconfig>
    
    
    Описание по параметрам можно посмотреть на странице
    http://fontconfig.org/fontconfig-user.html
    
    Кратко о параметрах:
    
    autohint - метод исправления дефектов растеризации, 
        следует поэкспериментировать включением/выключением в сочетании с установкой antialias.
    
    antialias - антиалиасинг, сглаживание начертаний.
    
    hinting - уточнение, шрифт с хинтингом получается тоньше;
    hintstyle - стиль уточнения, при hinting =true можно попробовать в hintstyle - hintfull и hintnone
    
    rgba - если none, то используется субпиксельное сглаживание.
    
     
    ----* Назначение gmail в качестве почтового клиента по умолчанию в GNOME (доп. ссылка 1)   [обсудить]
     
    В "System \ Preferences \ Preferred Applications" в качестве почтового клиента
    нужно прописать скрипт
    
       /home/имя/open_mailto.sh %s
    
    , содержащий:
    
       #!/bin/sh
       firefox https://mail.google.com/mail?view=cm&tf=0&to=`echo $1 | sed 's/mailto://'`
    
    Если нужно открывать gmail не в новом окне, а в новом табе:
    
       #!/bin/sh
       firefox -remote "openurl(https://mail.google.com/mail?view=cm&tf=0&to=`echo $1 | sed 's/mailto://'`,new-tab)"")
    
    Для уведомления о появлении почты в Gmail можно использовать программы:
    gmail-notify - http://gmail-notify.sourceforge.net/
    KGmailNotifier - http://www.kde-apps.org/content/show.php/KGmailNotifier?content=55375
    gnome-gmail-notifier - http://code.google.com/p/gnome-gmail-notifier/
    
     
    ----* Уведомление всплывающее на десктопе и управление оконным менеджером   [комментарии]
     
    Утилита notify-send, входящая в состав пакета libnotify-bin, позволяет
    отправить через D-BUS уведомление,
    которое будет отражено в GNOME в виде всплывающего окошка.
    
    Пример:
       notify-send -c info -t 1800000 "заголовок окна" "текст внутри окна"
    
    где, "-t 1800000" - таймаут висения окна в милисекундах.
    "-c info" - категория оповещения, список можно найти здесь:
       http://www.galago-project.org/specs/notification/0.9/x211.html
    
    В тексте можно использовать тэги: <b>жирный шрифт</b>, <i>наклонный</i>, <u>с подчеркиванием</u>,
    <a href="...">ссылки</a>, <img src="..." alt="...">картинки, размером до 200x100</img>.
    
    Интересные возможности по управлению оконным менеджером из командной строки
    предоставляет утилита wmctrl:
    Получить список открытых окон:
       wmctrl -l
    
    Получить список открытых окон с отображением PID-процесса и инфрмацией о размере окна:
       wmctrl -p -G -l
    
    Сделать активным окно в названии которого есть слово licq:
       wmctrl -a licq
    
    Свернуть окно в названии которого есть слово 'mozilla':
       wmctrl -r mozilla -b add,hidden
    
    Закрыть окно по его имени:
       wmctrl -F -c 'Debian bug tracking system - Mozilla'
    
    Изменить заголовок окна для окна выбранного курсором мыши:
       wmctrl -r :SELECT: -T "Selected Window"
    
    Развернуть окно со словом video в заголовке на полный экран:
       wmctrl -r "video" -b toggle,fullscreen
    
    Посмотреть какое окно является активным:
       xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)"
    
    Посмотреть подробную информацию об активном окне:
       xwininfo -id 0x4a00021
    где, 0x4a00021 идентификатор окна.
    
     
    ----* Контроль двух X дисплеев одной клавиатурой и мышью  (доп. ссылка 1)   [комментарии]
     
    Утилита x2x (http://x2x.dottedmag.net/) предназначена для контроля X дисплея одной машины, 
    клавиатурой и мышью с другой, т.е. позволяет одновременно работать с двумя X-серверами.
    
    Активный дисплей выбирается в зависимости от установки фокуса мышью.
    На обеих машинах создается единый буфер обмена. 
    Например, удобно принести ноутбук на работу, поставить рядом с рабочей машиной
    и работать одной клавиатурой и мышью.
    
    Подключаемся с локальной машины на удаленную:
       ssh -X хост x2x -east -to :0
    
    где, "-X" - включение перенаправление X-протокола,
    "-east" - относительная позиция управляющего окна (другой вариант "-west").
    
    При перемещении курсора мыши на окно вторичной системы, команды клавиатуры и
    мыши будут переданы удаленному X-серверу.
    
    Второй вариант запуска, при котором, в отличии от первого варианта,
    будет создан единый буфер обмена. 
    
    На удаленной системе разрешаем подключение к X-серверу с локальной машины:
    
      xhost +локальная_машина
    
    На локальной системе выполняем:
    
      x2x -to хост:0.0 -east
    
    Где хост:0.0 определяет удаленный X-сервер к которому следует подключиться.
    
    
    Для запуска x2x под Windows необходимо установить пакет Cygwin, 
    не забыв выбрать x2x в списке устанавливаемых программ.
    При этом Windows может быть использована только в роли первичной управляющей системы, 
    к которой непосредственно подключена клавиатура и мышь.
    
    Для подключения к удаленному Linux хосту выполняем в shell приглашении Cygwin:
       x2x -fromwin -to адрес_linux_машины:0.0 -east
    
     
    ----* Уменьшение времени загрузки X11 программ через кэширование символьных таблиц (доп. ссылка 1)   Автор: Robert Knight  [комментарии]
     
    В библиотеке libx11 имеется поддержка кэширования символьных таблиц (compose-table-cache), 
    получаемых в результате парсинга "/usr/share/X11/locale/имя_локали/Compose"
    файлов локали (парсинг более 5000 строк при каждом запуске),
    что позволяет сократить время запуска некоторых приложений (например,
    использующих Qt или Gtk) на 40-200 мс.
    и уменьшить потребление памяти каждым приложением примерно на 240Кб (данные для UTF8 локали).
    
    Для включения кэша достаточно в домашней директории создать каталог .compose-cache
       mkdir $HOME/.compose-cache
    
    В SUSE Linux данный механизм задействован по умолчанию, кэш находится в
    директории /var/cache/libx11/compose.
    
     
    ----* Как поменять коричневый цвет для процесса загрузки Ubuntu (доп. ссылка 1)   Автор: www.openkazan.info  [комментарии]
     
    Для того чтобы убрать надоевший коричневый цвет, возникающий на несколько секунд 
    в процессе загрузки Ubuntu:
    
       sudo gedit /etc/gdm/PreSession/Default
    
    находим строки
    
       # Default value
       if [ "x$BACKCOLOR" = "x" ]; then
       BACKCOLOR="#dab082"
       fi
    
    и меняем цвет на любой другой, например на чёрный:
    
       # Default value
       if [ "x$BACKCOLOR" = "x" ]; then
       BACKCOLOR="#000000"
       fi 
    
     
    ----* Как в GDM запретить кнопки перезагрузки и выключения работы (доп. ссылка 1)   [обсудить]
     
    Для запрещения кнопок перезагрузки и выключения в /etc/X11/gdm/gdm.conf нужно
    исправить "SystemMenu=true" на "SystemMenu=false".
    Затем перезапустить X-ы комбинацией клавиш Ctrl + Alt + Backspace.
    Команды вызываемые для перезагрузки, выключения и засыпания, можно поменять 
    через переменные RebootCommand, HaltCommand и SuspendCommand.
    
    Другие полезные настройки:
    AutomaticLogin - логин для автоматического входа в систему.
    AlwaysRestartServer - gdm будет при каждом входе перезапускать X сервер.
    PostLoginScriptDir, PreSessionScriptDir, PostSessionScriptDir - пути к директории 
       со скриптами запускаемыми на разных этапах входа пользователя в систему.
    SessionDesktopDir - директория с описанием вариантов сессий (/etc/X11/sessions/).
    DefaultSession - сессия всегда выбираемая по умолчанию;
    AllowRoot - запретить или разрешить входа под логином root;
    GtkTheme, GraphicalTheme, GraphicalThemeDir - определение визуальной темы;
    Browser - можно отключить показ пиктограмм для пользователей;
    GlobalFaceDir - где хранятся пиктограммы (/usr/share/faces/)
    Logo - путь к логотипу;
    BackgroundColor - цвет фона;
    BackgroundProgram - можно привязать хранитель экрана для формирования фона;
    ShowLastSession - 
    
    Для kdm похожие настройки можно найти в файле /etc/X11/kdm/kdmrc
    
    Также для настройки gdm можно использовать GUI интерфейс /usr/sbin/gdmsetup, для kdm - kdm_config
    
     
    ----* Улучшение качества отображения шрифтов в Debian GNU/Linux (доп. ссылка 1)   Автор: andrey i. mavlyanov  [комментарии]
     
    В дебиан по-умолчанию xserver запускается с параметром -dpi 100. 
    Это необходимо исправить в файле /etc/X11/xinit/xserverrc:
    
       #!/bin/sh
       # $Id: xserverrc 189 2005-06-11 00:04:27Z branden $
       exec /usr/bin/X11/X -dpi 96 -nolisten tcp
    
    Поставьте пакет с шрифтами от Microsoft (для этого не забудьте включить в
    /etc/apt/sources.list репозитарий с non-free пакетами).
    
       $ sudo aptitude install msttcorefonts
    
    Создайте файл /etc/fonts/local.conf:
    
       <?xml version="1.0"?>
       <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
       <fontconfig>
            <alias>
                    <family>serif</family>
                    <prefer>
                            <family>Times New Roman</family>
                    </prefer>
            </alias>
            <alias>
                    <family>sans-serif</family>
                    <prefer>
                            <family>Arial</family>
                    </prefer>
            </alias>
            <alias>
                    <family>monospace</family>
                    <prefer>
                            <family>Courier New</family>
                    </prefer>
            </alias>
       </fontconfig>
    
    Положите в домашнюю директорию файл .Xresources. 
    В нём, помимо прочего, должна содержаться строчка:
    
       Xft.dpi:                96
    
    Также в домашнюю директорию следует положить файл .fonts.conf:
    
       <?xml version="1.0"?>
       <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
       <fontconfig>
        <match target="font" >
         <edit mode="assign" name="rgba" >
          <const>rgb</const>
         </edit>
        </match>
        <match target="font" >
         <edit mode="assign" name="hinting" >
          <bool>true</bool>
         </edit>
        </match>
        <match target="font" >
         <edit mode="assign" name="hintstyle" >
          <const>hintfull</const>
         </edit>
        </match>
        <match target="font" >
         <edit mode="assign" name="antialias" >
          <bool>true</bool>
         </edit>
        </match>
       </fontconfig>
       
    Вот и всё. Осталось перезапустить подсистему X.
     
    
     
    ----* Создание 32-битного chroot окружения в 64-битной Debian установке (доп. ссылка 1)   Автор: Amadeu A. Barbosa Jr  [комментарии]
     
    Ниже пример организации 32-битного chroot окружения в 64-битной системе.
    
    Устанавливаем пакет schroot
       aptitude install schroot 
    
    Создаем файл конфигурации /etc/schroot/schroot.conf:
       [sid]
       description=Debian sid (unstable)
       location=/srv/chroot/sid
       priority=3
       users=YOUR_USER
       groups=SOME_GROUP_LIKE_users
       root-groups=YOUR_ADMIN_USER
    
    Формируем chroot окружение:
        debootstrap --arch i386 sid /srv/chroot/sid http://ftp.br.debian.org/debian 
    
    Установка программ в chroot:
        schroot -c sid -p aptitude install wengophone
    
    Монтируем /proc и /dev основной системы в chroot:
       mount /dev /srv/chroot/sid/dev -o bind
       mount /proc /srv/chroot/sid/proc -o bind
    
    Разрешаем запуск графических приложений из chroot на основном X сервере:
        xhost +
    
    Запускаем приложения wengophone и skype:
        schroot -c sid -p wengophone
        schroot -c sid -p skype
    
    Закрываем полный доступ к X серверу.
        xhost -
    
     
    ----* Использование буфера обмена X Window в скриптах и командной строке (доп. ссылка 1)   Автор: JoshTriplett  [комментарии]
     
    Для обращения к буферу обмена из командной строки нужно использовать утилиту
    xclip (http://sourceforge.net/projects/xclip),
    которая помещает в буфер обмена то что приходит через STDIN и выталкивает из
    буфера обмена в STDOUT.
    
    
    Скопировать в буфер обмена: echo "test" | xclip
    Вывести содержимое буфера обмена: xclip -o 
    Через опцию -sel можно выбрать буфер обмена:
       clipboard (Ctrl+C,Ctrl+X, Ctrl+V или меню Copy/Paste в приложениях),
       primary (средняя кнопка мыши), secondary.
    
    
    Для вывода содержимого буфера обмена по Ctrl-v в bash, можно использовать .bashrc:
    
    if [ -n "$DISPLAY" ] && [ -x /usr/bin/xclip ] ; then
        # Work around a bash bug: \C-@ does not work in a key binding
        bind '"\C-x\C-m": set-mark'
        # The '#' characters ensure that kill commands have text to work on; if
        # not, this binding would malfunction at the start or end of a line.
        bind 'Control-v: "#\C-b\C-k#\C-x\C-?\"$(xclip -o -selection c)\"\e\C-e\C-x\C-m\C-a\C-y\C-?\C-e\C-y\ey\C-x\C-x\C-d"'
    fi
    
     
    ----* Настройка GDM/KDM (доп. ссылка 1)   Автор: soko1  [комментарии]
     
    Почему-то нигде нет информации о том, как во FreeBSD настраивается GDM/KDM 
    на предмет выбора загрузки оконных менеджеров. 
    Поэтому я решил написать короткое руководство.
    
    1. Заходим в каталог '/usr/local/etc/dm/Sessions', создаем там текстовый файл с 
    расширением .desktop, например ion3.desktop:
    
       %cd /usr/local/etc/dm/Sessions; touch ion3.desktop
    
    2. Открываем файл в текстовом редакторе и пишем туда следующее:
    
       [Desktop Entry]
       Encoding=UTF-8
       Name=Ion3
       Exec=/usr/local/bin/ion3
       Icon=
       Type=Application
    
    3. Ставим права доступа 0555:
    
       %chmod 0555 ion3.desktop
    
    Аналогичные файлы создаем для запуска других WM.
    
    4. Перезапускаем наш DM.
    
     
    ----* Как запустить GUI приложение на сервере без монитора (доп. ссылка 1)   Автор: Alexey Kovyrin  [комментарии]
     
    Можно воспользоваться xvfb (X window virtual framebuffer, http://en.wikipedia.org/wiki/Xvfb),
    X-сервером эмулирующим работу frame-buffer в памяти.
    
    Установка в Debian Linux:
       # apt-get install xvfb
    
    Запуск X-сервера.
       # Xvfb -shmem -screen 0 1280x1024x24
    Запуск приложения, которому обязательно нужен X Сервер.
       # DISPLAY=:0 xdpyinfo
    
     
    ----* Как отключить клик через касание touchpad на ноутбуке (доп. ссылка 1)   [комментарии]
     
    Одна из неприятных особенностей тачпадов - срабатывание клика при случайном
    касании (tap-to-click).
    Для отключения данной функции в Synaptic Touchpad, в xorg.conf необходимо
    добавить в секции Input Device:
    
       Option "MaxTapTime" "0"
    
    или 
    
      Option "SHMConfig" "on"
      плюс запуск syndaemon -t -d (опция  -t запрещает tapping и scrolling)
      или настройка через gsynaptics
    
     
    ----* Установка видеодрайверов ATi и nVIDIA в Fedora Core 6 Linux (доп. ссылка 1)   Автор: Mihail Marinof  [комментарии]
     
    Проще всего установить готовые RPM пакеты из репозитория livna.org.
    
    Подключаемся к репозиторию Livna:
    
       rpm -Uhv http://rpm.livna.org/livna-release-6.rpm
       rpm --import http://rpm.livna.org/RPM-LIVNA-GPG-KEY
    
    Проверяем его доступность:
       yum info kmod-nvidia
    
    Для упрощения работы с пакетами устанавливаем дополнение Yum Extender:
    
       yum install yumex
    
    возможности которого доступны через утилиту yumex или меню Kmenu / System / Yum Extender.
    
    Обновление ядра собранного для архитектуры i586 до i686 сборки (не обязательно).
    Проверьте присутствие репозитория Livna в списке, зайдите в секцию Remove 
    и выберите текущее Linux ядро и пакет kernel-devel, нажмите "add to queue" и 
    перейдите в секцию Install. Найдя список ядер (Kernel), выберите ядро и пакет 
    kernel-devel для i686 архитектуры и нажмите добавить в очередь (add to queue). 
    Войдите в секцию Queue и нажмите "Process Queue". Перезапуситите компьютер.
    
    
    Установка nVIDIA драйверов:
    
       yum install kmod-nvidia
    
    Установка  ATi драйверов:
    
       yum install xorg-x11-drv-fglrx kmod-fglrx glx-utils
    
    Проверяем после рестарта X сервера:
    
       glxinfo | grep direct
       direct rendering: Yes
    
    Для AMD64 процессора нужно добавить опцию iommu=off при загрузке Linux ядра.
    В  /etc/grub.conf вносим подобную правку:
    
       kernel /vmlinuz-2.6.18-1.2798.fc6 ro root=LABEL=/ rhgb quiet iommu=off
    
    Для материнских плат на базе чипсета Intel имеет смысл добавить в
    /etc/X11/xorg.conf после секции Driver "fglrx":
    
       Option "UseInternalAGPGART" "no"
    
     
    ----* Лог инсталляции Beryl   Автор: Kroz  [комментарии]
     
    Ниже приводится лог действий инсталляции Beryl и сопутствующих
    программ/библиотек на моем компьютере.
    К сожалению этот лог не полный, но правильный на 99% . Формат записей, я
    надеюсь, будет понятен без объяснений.
    
    Моя ОС: Slackware 10.2
    
    Инсталляция производилась преимущественно сборкой из исходников (за некоторым исключением)
    
    Действия производились на основании материала по ссылке:
    http://wiki.beryl-project.org/wiki/Install_Beryl_on_Slackware
    
    Рекомендую пользоваться ссылкой, а мой лог использовать как помощь во избежание 
    следующих подводных камней: зависимости, версии (я ставил последние версии
    софта, но некоторые не собрались,
    поэтому приходилось брать не последние версии).
    
    Лог не описывает инсталляцию последнего Xorg и dbus.
    
    Ценность данного материала предоставляю определить модератору и публике. 
    Но лично я был бы рад найти что-то подобное перед тем как я начал инсталляцию.
    
    -----------------------------
    
    Beryl> Install DBus
    Beryl> Install DBus-glibc
    Beryl> Install beryl-core
    Beryl>beryl-core> tar -jxvf beryl-core-0.1.99.2.tar.bz2
    Beryl>beryl-core> cd beryl-core-0.1.99.2
    Beryl>beryl-core> ./configure --prefix=/usr --with-x
    Beryl>beryl-core> make all
    Beryl>beryl-core> sudo make install
    Beryl>beryl-core> cd ..
    
    Beryl> Install beryl-plugins
    Beryl>Beryl-plugins> Install librsvg
    Beryl>Beryl-plugins>librsvg> Install FreeType
    Beryl>Beryl-plugins>librsvg>FreeType> tar -jxvf freetype-2.1.10.tar.bz2
    Beryl>Beryl-plugins>librsvg>FreeType> cd freetype-2.1.10
    Beryl>Beryl-plugins>librsvg>FreeType> vi include/freetype/config/ftoption.h
    Beryl>Beryl-plugins>librsvg>FreeType> Uncomment '#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER'
    Beryl>Beryl-plugins>librsvg>FreeType> ./configure --prefix=/usr
    Beryl>Beryl-plugins>librsvg>FreeType> make all 
    Beryl>Beryl-plugins>librsvg>FreeType> sudo make install
    Beryl>Beryl-plugins>librsvg>FreeType> cd ..
    Beryl>Beryl-plugins>librsvg> tar-jxvf librsvg-2.14.4.tar.bz2
    Beryl>Beryl-plugins>librsvg> cd librsvg-2.14.4
    Beryl>Beryl-plugins>librsvg> ./configure --prefix=/usr --with-x
    Beryl>Beryl-plugins>librsvg> make all
    Beryl>Beryl-plugins>librsvg> sudo install
    Beryl>Beryl-plugins>librsvg> cd ..
    Beryl>Beryl-plugins> tar -zxvf beryl-plugins-0.1.99.2.tar.bz2
    Beryl>Beryl-plugins> cd beryl-plugins-0.1.99.2
    Beryl>Beryl-plugins> ./configure --prefix=/usr
    Beryl>Beryl-plugins> make all
    Beryl>Beryl-plugins> sudo make install
    Beryl>Beryl-plugins> cd ..
    
    Beryl> Install Beryl-manager
    Beryl>beryl-manager> tar -jxvf beryl-manager-0.1.99.2.tar.bz2
    Beryl>beryl-manager> cd beryl-manager-0.1.99.2
    Beryl>beryl-manager> ./configure --prefix=/usr
    Beryl>beryl-manager> make all
    Beryl>beryl-manager> sudo make install
    Beryl>beryl-manager> cd ..
    
    Beryl> Install beryl-settings-simple
    Beryl>beryl-settings-simple> tar -jxvf beryl-settings-simple-0.1.99.2.tar.bz2
    Beryl>beryl-settings-simple> cd beryl-settings-simple-0.1.99.2
    Beryl>beryl-settings-simple> ./configure --prefix=/usr
    Beryl>beryl-settings-simple> make all
    Beryl>beryl-settings-simple> sudo make install
    Beryl>beryl-settings-simple> cd ..
    
    Beryl>Install beryl-settings
    Beryl>beryl-settings> tar -jxvf beryl-settings-0.1.99.2.tar.bz2
    Beryl>beryl-settings> cd beryl-settings-0.1.991.2
    Beryl>beryl-settings> ./configure --prefix=/usr
    Beryl>beryl-settings> make all
    Beryl>beryl-settings> sudo make install
    Beryl>beryl-settings> cd ..
    
    Beryl> Install beryl-vidcap
    Beryl>beryl-vidcap> Install seom
    Beryl>beryl-vidcap>seom> Install yasm
    Beryl>beryl-vidcap>seom>yasm> tar -zxvf yasm-0.5.0.tar.gz
    Beryl>beryl-vidcap>seom>yasm> cd yasm-0.5.0 
    Beryl>beryl-vidcap>seom>yasm> ./configure --prefix=/usr
    Beryl>beryl-vidcap>seom>yasm> make all
    Beryl>beryl-vidcap>seom>yasm> sudo make install
    Beryl>beryl-vidcap>seom>yasm> cd ..
    Beryl>beryl-vidcap>seom> !!! Note: following way does not work. Seom was
    actually installed from TGZ package.
    Beryl>beryl-vidcap>seom> svn co svn://dbservice.com/big/svn/seom/trunk seom1
    Beryl>beryl-vidcap>seom> cd seom
    Beryl>beryl-vidcap>seom> ./configure --prefix=/usr
    Beryl>beryl-vidcap>seom> make all
    Beryl>beryl-vidcap>seom> sudo make install
    Beryl>beryl-vidcap>seom> cd ..
    Beryl>beryl-vidcap> tar -jxvg beryl-vidcap-0.1.99.2.tar.bz2
    Beryl>beryl-vidcap> cd beryl-vidcap-0.1.99.2
    Beryl>beryl-vidcap> In Makefile make PREFIX=/usr
    Beryl>beryl-vidcap> make all
    Beryl>beryl-vidcap> sudo make install
    Beryl>beryl-vidcap> cd ..
    
    Beryl> Install beryl-settings-bindings
    Beryl>beryl-settings-bindings> Install Pyrex
    Beryl>beryl-settings-bindings/Pyrex> tar -xvf Pyrex-0.9.5.tar.gz
    Beryl>beryl-settings-bindings/Pyrex> cd Pyrex-0.9.5
    Beryl>beryl-settings-bindings/Pyrex> sudo python setup.py install
    Beryl>beryl-settings-bindings/Pyrex> cd ..
    Beryl>beryl-settings-bindings> tar -jxvf beryl-settings-bindings-0.1.99.2.tar.bz2
    Beryl>beryl-settings-bindings> cd beryl-settings-bindings-0.1.99.2
    Beryl>beryl-settings-bindings> ./configure --prefix=/usr
    Beryl>beryl-settings-bindings> make all
    Beryl>beryl-settings-bindings> sudo make install
    Beryl>beryl-settings-bindings> cd ..
    
    Beryl> Install pygtk
    Beryl>pygtk> Install pygobject
    Beryl>pygtk>pygobject> tar -xvf pygobject-2.12.3.tar.bz2
    Beryl>pygtk>pygobject> cd pygobject-2.12.3
    Beryl>pygtk>pygobject> ./configure --prefix=/usr
    Beryl>pygtk>pygobject> make all
    Beryl>pygtk>pygobject> sudo make install
    Beryl>pygtk>pygobject> cd ..
    Beryl>pygtk> tar -jxvf pygtk-2.10.3.tar.bz2
    Beryl>pygtk> cd pygtk-2.10.3
    Beryl>pygtk> ./configure --prefix=/usr
    Beryl>pygtk> make all
    Beryl>pygtk> sudo make install
    Beryl>pygtk> cd ..
    
    Beryl> Install pycairo
    Beryl>pycairo> Install cairo
    Beryl>pycairo>cairo> Install cairo PNG backend (libpng)
    Beryl>pycairo>cairo>libpng> tar -xvf libpng-1.2.15.tar.bz2
    Beryl>pycairo>cairo>libpng> cd libpng-1.2.15
    Beryl>pycairo>cairo>libpng> ./configure --prefix=/usr
    Beryl>pycairo>cairo>libpng> make all
    Beryl>pycairo>cairo>libpng> sudo make install
    Beryl>pycairo>cairo>libpng> cd ..
    Beryl>pycairo>cairo>tar -xvf cairo-1.2.4.tar.gz
    Beryl>pycairo>cairo>cd cairo-1.2.4
    Beryl>pycairo>cairo>./configure --prefix=/usr --with-x
    Beryl>pycairo>cairo>make all
    Beryl>pycairo>cairo>sudo make install
    Beryl>pycairo>cairo>cd ..
    Beryl>pycairo>tar -xvf pycairo-1.2.2.tar.bz2
    Beryl>pycairo>cd pycairo-1.2.2
    Beryl>pycairo>./configure --prefix=/usr
    Beryl>pycairo>make all
    Beryl>pycairo>sudo make install
    
    Beryl> Install emerald
    Beryl>emerald> Install libwnck
    Beryl>emerald>libwnck> tar -jxvf libwnck-2.14.3.tar.bz2
    Beryl>emerald>libwnck> cd libwnck-2.14.3
    Beryl>emerald>libwnck> ./configure --prefix=/usr --with-x
    Beryl>emerald>libwnck> make all
    Beryl>emerald>libwnck> sudo make install
    Beryl>emerald>libwnck> cd ..
    Beryl>emerald> tar -jxvf emerald-0.1.99.2.tar.bz2
    Beryl>emerald> cd emerald-0.1.99.2
    Beryl>emerald> ./configure --prefix=/usr
    Beryl>emerald> make all
    Beryl>emerald> sudo make install
    Beryl>emerald> cd ..
    
    Beryl> Install emerald-plugins
    Beryl>emerald-plugins> tar -jxvf emerald-themes-0.1.99.2.tar.bz2
    Beryl>emerald-plugins> cd emerald-themes-0.1.99.2
    Beryl>emerald-plugins> ./configure --prefix=/usr
    Beryl>emerald-plugins> make all
    Beryl>emerald-plugins> sudo make install
    Beryl>emerald-plugins> cd ..
    
    Beryl> Install aquamarine
    Beryl>aquamarine> tar -jxvf aquamarine-0.1.99.2.tar.bz2
    Beryl>aquamarine> cd aquamarine-0.1.99.2
    Beryl>aquamarine> ./configure --prefix=/usr
    Beryl>aquamarine> make all
    Beryl>aquamarine> sudo make install
    Beryl>aquamarine> cd ..
    
     
    ----* Настройка автозапуска программ в KDE и GNOME (доп. ссылка 1)   Автор: cyberciti.biz  [комментарии]
     
    В любом оконном менеджере достаточно прописать запуск программы в ~/.xinitrc
    например, дописать в конец:
       /usr/bin/xawtv &
    
    В KDE:
    
    Для автозапуска достаточно создать символическую ссылку в директории ~/.kde/Autostart
    Например:
      $ cd ~/.kde/Autostart
      $ ln -s $(which xawtv) .
      $ ln -s $(which mozilla-thunderbird) .
    
    
    В GNOME:
    
    Меню "Open control center - Sessions - Startup Programs."
    Или добавить программу в файл  ~/.gnome2/session-manual
    
     
    ----* Как принудительно выключить LCD экран ноутбука (доп. ссылка 1)   [комментарии]
     
    При включенном в ядре ACPI:
       xset dpms force off
    (включится после нажатия любой клавиши)
    
    Для выключения по таймауту:
    /etc/X11/xorg.conf
    
       Section "Monitor"
           Option "DPMS"
           # Option "DPMS" "TRUE" # для закрытого nvidia драйвера
    
       Section "ServerLayout"
           Option "OffTime" "20" # таймаут 20 минут
    
     
    ----* Как в Linux решить проблему конфликта тачпада и мыши на ноутбуке (доп. ссылка 1)   Автор: rmcgowan  [комментарии]
     
    Некоторые проблемы совместной работы мыши и Touchpad можно решить,
    добавив параметр загрузки ядра:
       psmouse.proto=imps
    
    Ниже пример настройки  Touchpad и внешней мыши для X.Org:
    
    # Тачпад
    Section "InputDevice"
      Driver        "synaptics"
      Identifier    "Mouse2"
      Option        "Device"        "/dev/psaux"
      Option        "Edges"         "1900 5400 1800 3900"
      Option        "Finger"        "25 30"
      Option        "MaxTapTime" "20"
      Option        "MaxTapMove" "220"
      Option        "VertScrollDelta" "100"
      Option        "MinSpeed"      "0.02"
      Option        "MaxSpeed"      "0.18"
      Option        "AccelFactor" "0.0010"
    EndSection
    
    # USB мышь
    Section "InputDevice"
        Identifier          "Mouse1"
        Driver              "mouse"
        Option              "Protocol"    "IMPS/2"
        Option              "Device"      "/dev/input/mice"
        Option              "ZAxisMapping" "4 5"
        Option              "Buttons" "5"
    EndSection
    
    Section "ServerLayout"
       ....
        InputDevice "Mouse2" "CorePointer"
        InputDevice "Mouse1" "SendCoreEvents"
    EndSection
    
     
    ----* XDM с альтернативным рабочим столом.   Автор: Skif (Чижиков Владимир)  [комментарии]
     
    Часто вижу на разных форумах вопрос, а как сделать автоматическую загрузку blackbox/windowmaker/etc
    из менеджера дисплеев разряда xdm потипу kde из kdm:
    
       xdm -session /usr/X11R6/bin/blackbox
    
    И тогда каждому авторизированному пользователю будет запущен после входа blackbox
    ля старта xdm при загрузке машины:
       [/etc/ttys]
       root@fbsd1 /root :less /etc/ttys | grep xdm
       .....
       ttyv8   "/usr/X11R6/bin/xdm -nodaemon -session /usr/X11R6/bin/blackbox"  xterm   off secure
       .....
    
    или при помощи скрипта помещенного либо в 
    
       /usr/local/etc/rc.d/
    
    либо в
    
       /usr/X11R6/etc/rc.d/
    
    вида:
    
       [xdm.sh]
       #!/bin/sh
       X=Xorg
       case $1 in
       start)
    	echo "XDM starting now... "
    	/usr/X11R6/bin/xdm -session /usr/X11R6/bin/blackbox
    	echo "XDM started!"
    	;;
       stop)
    	echo -n "XDM stopping now... "
    	killall -9 xdm
    	killall -9 $X
    	echo -n "XDM stopped!"
    	;;
       *)
    	echo -n "Use start|stop parametrs! Error!"
    	exit 64
    	;;
       esac
    
     
    ----* Как изменить разрешение в X'ах без перезапуска X-сервера (доп. ссылка 1)   Автор: Steve  [комментарии]
     
    Смотрим список поддерживаемых разрешений:
       xrandr
    
    Выбираем одно из них:
       xrandr --size 800x600
    
    При необходимости указываем и частоту развертки:
       xrandr -s 1024x768 -r 85
    
    Автоматически задействовать все устройства вывода
      xrandr --auto
    
    Подключение второго монитора, без переконфигурации XOrg:
      xrandr -output VGA -auto -left-of LVDS
    
    После отключения второго монитора 
      xrandr -output VGA -off
    
    Другие примеры:
       xrandr --output DVI-0 --off
       xrandr --output VGA --auto --right-of LVDS
       xrandr --output DVI-0 --mode 0
       xrandr --addmode S-video 800x600
       xrandr --output S-video --mode 800x600
    
     
    ----* Как включить Windows раскладку клавиатуры в XWindow (точка и запятая, вместо ? и /) ?   [комментарии]
     
    Чтобы при наборе русских символов, при нажатии на клавишу с вопросом, рядом с правым Shift, 
    печатались точка и запятая, вместо вопроса и слэша, в Section "InputDevice"
    файла конфигурации XOrg или XFree86
    
    меняем:
        Option "XkbLayout" "us,ru"
    на
        Option "XkbLayout" "us,ru(winkeys)"
    
    или просто добавляем (запятую не пропустите):
        Option "XkbVariant" ",winkeys"
    
     
    ----* Как использовать графические диалоговые окна в shell скриптах (доп. ссылка 1)   [обсудить]
     
    Выбор Yes или No (результат в $?, 0 - yes, 1 - no, 255 - закрыто окно), "0 0" -
    размер окна по умолчанию:
        Xdialog --title "Title" --yesno "Test or not" 0 0
    
    Вывести окно с текстом (60 - это таймаут для отображения окна):
       Xdialog --msgbox "text splitting\ntest..." 0 0
       Xdialog --infobox "text splitting\ntest..." 0 0 60
    
    Запросить текст от пользователя, по умолачнию выдать test:
       user_text=`echo "test" | Xdialog --editbox "-" 0 0`
    
    Показать, что выполнено 15% работы (--progress принимает накопительные данные)
    (новые значения посылаются через stdin, как только будет больше 100 окно закроется):
       Xdialog --gauge "test" 0 0 15
       Xdialog --progress "test" 0 0 100
    
    Ввод строки от пользователя (введенная строка помещается в stdout):
       Xdialog --inputbox "test" 0 0 "string"
    
    Ввод логина и пароля (в stduot - login/password):
       Xdialog --password --2inputsbox "test" 0 0 "Login" "guest"  "Password" ""
    
    Выбор элемента из списка:
       Xdialog -combobox "test" 0 0 "Test1" "Test2" "Test3"
    
    Выбор диапазона (от 1 до 10):
       Xdialog -rangebox "test" 0 0 1 10
    
    Показывать в окне растущий хвост файла file.txt:
       Xdialog  --tailbox file.txt 0 0
       Xdialog  --logbox file.txt 0 0
    
    Выбор файла или директории
       Xdialog --fselect def_file.txt 0 0
       Xdialog --dselect def_dir 0 0
    
    Показать 5 июня на календаре
       Xdialog --calendar "test" 0 0 5 6 2005
    
     
    ----* Разные раскладки клавиатуры для каждого пользователя в X Window (доп. ссылка 1)   Автор: madskull  [обсудить]
     
    Создаем файл .Xkbmap и кладем его в свою домашнюю директорию (например: /home/mitya ). 
    
    Внутри файла пишем, например: 
       -option grp:ctrl_shift_toggle,grp:switch,grp_led:scroll us,ru
    
     
    ----* Как добавить Windows TrueType шрифты для xfs в X Window   [комментарии]
     
    - Копируем ttf шрифты ~/.font, переходим в директорию ~/.font
    - Запускаем: ttmkfdir > fonts.scale
    - Запускаем: mkfontdir
    - Запускаем: fc-cache ./
    - Прописываем ~/.font в /etc/X11/fs/config (список "catalogue") или запускаем:
       /usr/sbin/chkfontpath --add ~/.font
    - Запускаем: xset fp rehash
    - Запускаем: service xfs restart
    - Проверяем, новые шрифты должны быть показаны в выводе утилит fc-list,
    xlsfonts, xfontsel, kcharselect, gfontsel и chkfontpath;
    
    В KDE можно использовать: "Control Center/System/Font Installer".
    
    В OpenOffice для добавления шрифтов нужно использовать утилиту spadmin.
    
    Для AbiWord шрифты нужно скопировать в /usr/share/abisuite/AbiSuite/fonts и запустить 
       mkfontdir; ttmkfdir > fonts.scale
    
    При наличии проблем с антиалиасингом, необходимо пересобрать библиотеку FreeType, активировав 
    "#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER" в include/freetype/config/ftoption.h
    
    В AltLinux рекомендуется поставить пакеты  freefont-fonts-ttf, freetype и ms-fonts-ttf.
    
    
    Другой способ добавления шрифтов:
    Копируем шрифты например в директорию, ~/fonts
    В ~/.xinitrc добавляем
       xset fp+ $HOME/fonts/
    
     
    ----* Частота развертки в X.org (100hz не фантастика)   Автор: Казаков Александр aka classic  [комментарии]
     
    Пример как повысить частоту для режима 1152х864 с 75 до 100 Hz
    
    И так для начала запустим утилиту входящую в состав xorg:
    
       gtf 1152 864 100
    
    Она выдаст строчку, которую на скопировать в /etc/X11/xorg.conf в section monitor:
    
       Section "Monitor"
          Identifier   "iiyama"
          VendorName   "1152x864_100.00"
          ModelName    "[email protected] Hz"
          # 1152x864 @ 100.00 Hz (GTF) hsync: 91.50 kHz; pclk: 143.47 MHz
          Modeline "1152x864_100.00"  143.47  1152 1232 1360 1568  864 865 868 915  -HSync +Vsync
          Option      "DPMS"
       EndSection
    
    Теперь идем в section "Screen" и редактируем:
    
       Section "Screen"
          Identifier "Screen0"
          Device     "Card0"
          Monitor    "iiyama"    # Монитор, который определили выше
          DefaultDepth     24
          SubSection "Display"
             Viewport   0 0
             Depth     24
             Modes    "1152x864_100.00"  # Режим определенный выше строчкой Modeline      EndSubSection
       EndSection
    
    Рестартуем "иксы".
    
     
    ----* Как избавиться от линковки GNOME приложения с лишними библиотеками (доп. ссылка 1)   [комментарии]
     
    Собираем по умолчанию:
        readelf -d /usr/local/bin/gnome-terminal |grep NEEDED | wc -l
        52 - требуется 52 библиотеки.
    
    Устанавливаем флаг --as-needed:
        export CFLAGS = "-Os -s -Wl,--as-needed"
    
    После пересборки, требуется 21 реально необходимая для работы библиотека.
    
     
    ----* Настройка цветовой гаммы в rxvt   [комментарии]
     
    В ~/.Xdefaults:
    
      Rxvt*background: Black
      Rxvt*foreground: #D0D0D0
      Rxvt*font:-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-koi8-r
      !Rxvt*sсrollBar_right: True
      Rxvt*sсrollBar:False
      Rxvt*saveLines: 500
      Rxvt*color0:  #000000
      Rxvt*color1:  #aa0000
      Rxvt*color2:  #00aa00
      Rxvt*color3:  #aa5500
      Rxvt*color4:  #0000aa
      Rxvt*color5:  #aa00aa
      Rxvt*color6:  #00aaaa
      Rxvt*color7:  #aaaaaa
      Rxvt*color8:  #555555
      Rxvt*color9:  #ff5555
      Rxvt*color10: #55ff55
      Rxvt*color11: #ffff55
      Rxvt*color12: #5555ff
      Rxvt*color13: #ff55ff
      Rxvt*color14: #55ffff
      Rxvt*color15: #ffffff
    
    Другой вариант:
    
      Rxvt*color0:  #000000
      Rxvt*color1:  #fe0b12
      Rxvt*color2:  #00d900
      Rxvt*color3:  #ff7916
      Rxvt*color4:  #000095
      Rxvt*color5:  #aa00aa
      Rxvt*color6:  #00aaaa
      Rxvt*color7:  #e2e2e2
      Rxvt*color8:  #555555
      Rxvt*color9:  #aa3838
      Rxvt*color10: #55ff55
      Rxvt*color11: #ffff55
      Rxvt*color12: #5555ff
      Rxvt*color13: #ff55ff
      Rxvt*color14: #bebebe
      Rxvt*color15: #ffffff
    
    
    Для активации изменений: xrdb -merge ~/.Xdefaults
    
    Для rxvt-unicode (urxvt) нужно поменять "Rxvt*" на "URxvt*",
    для aterm (использую его) - "Rxvt*" на "Aterm*".
    
     
    ----* Увеличение скорости работы Firefox   Автор: Ilya Voronin  [комментарии]
     
    Пишем в адресной строке 'about:config', в полученном списке находим следующие параметры 
    (можно воспользоваться поиском):
    
       network.http.pipelining
       network.http.proxy.pipelining
    
    И выставляем их в 'true'. По умолчанию браузер делает запросы к серверу последовательно, 
    а при включении pipelining все запросы будут выполнены параллельно.
    
    Затем параметр:
    
       network.http.pipelining.maxrequests
    
    Выставляем его например в '32'. Это число - максимальное кол-во параллельно выполняемых запросов.
    
    И последний:
    
       nglayout.initialpaint.delay
    
    Выставляем в '0'. (Скорей всего такого параметра ещё не существует, - нажимаем
    правую кнопку мышки и
    выбираем в меню 'New'=>'Integer'. Вводим имя - 'nglayout.initialpaint.delay' и 
    присваиваем значение '0'). Это число определяет задержку перед отображением полученных данных.
    
     
    ----* Как посмотреть параметры видеокарты (доп. ссылка 1)   [комментарии]
     
    xdpyinfo
    glxinfo
    xvinfo 
    
     
    ----* Как использовать доп. клавиши на ноутбуке/клавиатуре   [комментарии]
     
    Вооружаемся man xev и man xmodmap и привязываем действия к cпецклавишам:
        * Fn+F2 - mute
        * Fn+F3 - Уменьшить звук
        * Fn+F4 - Прибавить звук
        * Кнопка слева от кнопки питания - запустить gnome-terminal
        * Кнопка справа от кнопки питания - запустить xfmail 
    
    Определяем коды символов, запустив xev:
        * Fn+F2 - 160
        * Fn+F3 - 174
        * Fn+F4 - 176
        * кн. слева - 178
        * кн. справа - 236 
    
    Прописываем имена комбинаций через xmodmap ("setxkbmap `cat file`" или "xmodmap file"):
    
       vi /.xmodmaprc (/.Xmodmap, /etc/X11/xinit/Xmodmap, /.Xkbmap,  /etc/X11/xinit/Xkbmap)
       keycode 160 = XF86AudioMute
       keycode 174 = XF86AudioLowerVolume
       keycode 176 = XF86AudioRaiseVolume
       keycode 178 = XF86HomePage
       keycode 236 = XF86Mail
    
    Настраиваем WM для запуска программ при нажатии на клавиши (на примере icewm):
    
       vi ~/.icewm/keys                   
       key "XF86AudioLowerVolume"      aumix -v -5
       key "XF86AudioRaiseVolume"      aumix -v +5 
       key "XF86AudioMute"             aumix -v 0   
       key "XF86HomePage"              gnome-terminal 
       key "XF86Mail"                  xfmail
    
     
    ----* Как изменить частоту обновления экрана через modeline для XFree86   Автор: vvk  [комментарии]
     
    From: Roman Blyshchyk (2:450/206.9)
    
    > Modeline "mode_name" D H1 H2 H3 H4 V1 V2 V3 V4 Flags
    
    Запускаешь утилитку xvidtune, котоpая должна быть в иксах. Далее, пишешь в
    XF86Config-4 в pазделе монитоp
    стpочку моделайн, где mode_name = 1280x1024, под D оставляешь пока место.
       H1 - 1280, H2 - HSyncStart, H3 - HSyncEnd, H4 - HTotal
       V1 - 1024, V2 - VSyncStart, V3 - VSyncEnd, V4 - VTotal
    , где всякие синки беpуться из xvidtune.
    А D считается так 100(тpебуемая частота)*H4*V4/100000(миллион), окpугляешь до сотых.
       Flags - +hsync +vsync
    
     
    ----* Работа видеокарты radeon 9200 в XFree-4.3.X (доп. ссылка 1)   Автор: dawnshade  [обсудить]
     
    Section "Device"
            Identifier  "Card0"
            Driver      "radeon"
            VendorName  "ATI Technologies Inc"
            BoardName   "ATI Radeon"
            ChipID      0x514D
            BusID       "PCI:1:0:0"
    EndSection
    
     
    ----* Как обойти проблему когда KDE приложения завершаются ошибкой   Автор: spanka  [обсудить]
     
    Можно попробовать запустить их с параметром  --nocrashhandler
    
     
    ----* Как запустить XWindow приложение с удаленной машины.   [комментарии]
     
    Локальная машина:
      xhost +remote.host.ru
    
    Удаленная машина:
      export DISPLAY=local.host.ru:0.0
    
    Если для ssh включен X11Forwarding, то DISPLAY=localhost:10.0 будет уже прописан: 
       ssh -X host
    
    Проверьте настройки сервера (/etc/openssh/sshd_config)
       X11Forwarding yes
    
    и клиента (ssh_config):
    
       ForwardAgent yes
       ForwardX11 yes
       ForwardX11Trusted yes
    
    Кроме единичных приложений, можно сразу удаленно запустить GNOME, выполнив команду:
       gnome-session
    
     
    ----* Как запустить второй X-сервер, когда один уже запущен   [обсудить]
     
      startx -- :1
    
     
    ----* Рекомендации по вызову xterm и установке шрифтов   [обсудить]
     
    xterm -geometry 60x40 +sb -bg black -fg white -fn -*-*-medium-r-*--14-*-*-*-*-*-koi8-r
    xterm -bg black -cr green -fg white -C -fn 9x15 -sl 500
    xterm rxvt -bg black -cr green -fg white -C -fn 9x15 -sl 500 -tn xterm -geometry 90x45
    xterm  -T "Запуск приложения в xterm" -e /usr/bin/prog
    Мне нравится использовать rxvt и gnome-terminal
    
     
    ----* Как создать Makefile из Imakefile   [обсудить]
     
        xmkmf
    
     
    ----* Как перечитать .Xdefaults без перезапуска X'ов ?   [обсудить]
     
       xrdb -merge ~/.Xdefaults
    
     
    ----* Как избавится от падения NVidia драйвера при переключении режимов.   [обсудить]
     
    В XF86Config-4, в Section "Device" добавить строку:
        Option "NvAgp" "1"
    
     
    ----* Как насторить работу Mouse Wheel.   [комментарии]
     
    gpm -t imps2 или в /etc/sysconfig/mouse:
    	MOUSETYPE=imps2
    	WHEEL=yes
    ln -s /dev/psmouse /dev/mouse или ln -s /dev/psaux/ /dev/mouse
    В XF86Config-4 в Section "InputDevice":
    	 Identifier  "Mouse"
    	 Driver "mouse"
    	 Option "Protocol"    "IMPS/2"
    	 Option "Device"      "/dev/mouse"
             Option "ZAxisMapping" "4 5"
             Option "Buttons" "5"
    
     
    ----* Как сделать скриншот всего экрана X Window   [обсудить]
     
    В консоли, используя пакет ImageMagic:
    import -display localhost:0.0 -window root screenshot.jpg
    
     
    ----* Как запустить Quake I X11 в полноэкранном режиме   [обсудить]
     
    X'ы должны быть запущены как: startx -- -bpp 8
    
     
    ----* Как посмотреть какие koi8-r шрифты установлены для X Window   [обсудить]
     
    xlsfonts -fn "*-koi8-r"
    
     
    ----* Создание глобальных горячих клавиш в GNOME (доп. ссылка 1)   Автор: Андрей Синицын  [комментарии]
     
    Назначение собственных "горячих клавиш" для выполнения каких-либо команд в GNOME.
    
    Есть небольшой апплет, доступный через меню GNOME 
    
       "Система" > "Параметры" > "Комбинации клавиш клавиатуры"
       "Desktop" > "Preferences" > "Keyboard Shortcuts"
    
    который позволяет назначить горячие клавиши для некоего набора предопределенных действий. 
    Используя этот апплет вы можете, например, назначить сочетание "Ctrl - Alt - t"
    для запуска эмулятора терминала.
    Но поскольку список фиксирован, вы не сможете добавить в него новое действие. 
    А вы хотите, к примеру, назначить сочетание "Ctrl - Alt - e" для запуска Emacs. 
    
    Назначить произвольные горячие клавиши, можно воспользовавшись gconf-editor
    
    Откройте терминал и наберите:
    
        user@desktop:~$ gconf-editor
    
    Откроется редактор настроек GNOME. С его помощью мы должны сделать две вещи:
    
        * Определить новую команду
        * Определить сочетание клавиш для выполнения этой команды
    
    Перейдите в раздел 
       "apps" > "metacity" > "keybinding_commands" 
    
    В правой панели выберите пункт "command_1" и измените его значение на /usr/bin/emacs
    Теперь нам необходимо задать клавиатурную комбинацию для этой команды. 
    Перейдите в раздел 
       "apps" > "metacity" > "global_keybindings". 
    
    Выберите пункт "run_command_1" и измените его значение на <control><alt>e.
    Вуаля! Нажимаем Ctrl - Alt -e и запускается Emacs
    
     
    ----* Установка ATI Catalyst 8.5 в Ubuntu 8.04 (доп. ссылка 1)   Автор: Pronix  [комментарии]
     
    1. Скачать ati-driver-installer-8-5-x86.x86_64.run
    
    2. В консоли выполнить для синхронизации списка пакетов, доступных в репозиториях:
    
       sudo apt-get update
    
    Затем, установить пакеты, необходимые для сборки модуля ядра из исходных
    текстов и создания deb пакета:
    
       sudo apt-get install build-essential fakeroot dh-make debhelper debconf libstdc++5 dkms linux-headers-$(uname -r)
    
    3. В консоли запускаем инсталлятор драйвера в режиме создания пакетов:
    
       sudo sh ati-driver-installer-8-5-x86.x86_64.run --buildpkg Ubuntu/8.04
    
    
    4. Теперь нужно занести в черный список драйвер fglrx из репозитория Ubuntu, выполняем
    
       sudo gedit /etc/default/linux-restricted-modules-common
    
    и в строке "DISABLED_MODULES" добавляем "fglrx"
    получаем строку:
    
       DISABLED_MODULES="fglrx"
    
    сохраняем файл
    
    5. далее в консоли устанавливаем подготовленные пакеты с драйвером:
    
       sudo dpkg -i xorg-driver-fglrx_8.493*.deb fglrx-kernel-source_8.493*.deb fglrx-amdcccle_8.493*.deb
    
    
    6. Перезагружаем X сервер. 
    
    7. проверяем:
    
       $ fglrxinfo
       display: :0.0 screen: 0
       OpenGL vendor string: ATI Technologies Inc.
       OpenGL renderer string: Radeon X1900 Series
       OpenGL version string: 2.1.7537 Release
    
    PS: все вышесказанное проверялось на i386 конфигурации с видеокартой X1900, 
    для amd64 возможны небольшие отличая в установке.
    
    Оригинал: http://pronix.isgreat.org/news.php?item.86.5
    
     
    ----* Что делать если X Server стартует но KDE не загружается   Автор: Владислав  [комментарии]
     
    Проблема:
      Если запускаем XDM то все работает нормально,
      но если запускаем startx то X-Server стартует но KDE не загружается (висит), 
      если убить X-Server (Ctrl+Alt+BackSpace) то остаются висеть процессы кkde*, 
      если теперь запустить чистый X-Server (X) то продолжается загрузка Kde
    
    Решение в моем случае:
      в файле /etc/X11/xinit/xinitrc.kde строку
        startkde
      заменить на 
        exec startkde >& ~/kde.error.log
      после этого работает нормально
    
    Объяснение:
      когда стартует X-Server то видимо блокируется стандартный поток ошибок и если какая-то 
      программа хочет в него чего-то вывести она просто подвисает (наверно это глюк)
    
     

       Запись и обработка звука

    ----* Как избавиться от щелчков при запуске приложений на системах с чипами Intel (доп. ссылка 1)   Автор: Аноним  [комментарии]
     
    При щелчках в колонках в процессе работы следует выключить режим
    энергосбережения у звукового драйвера:
    
       sudo tee /etc/modprobe.d/snd-hda-intel.conf <<< "options snd_hda_intel power_save=0" 
    
     
    ----* Решение проблемы с исчезновением устройств вывода звука в Ubuntu 20.04 (доп. ссылка 1) (доп. ссылка 2)   Автор: Аноним  [комментарии]
     
    Пропал звук. Pulseaudio показывает в качестве выходного устройства Dummy Output.
    
    Звуковая карта snd-hda-intel. Манипуляции 
    
       echo "options snd-hda-intel model=generic" | sudo tee -a /etc/modprobe.d/alsa-base.conf
       echo "options snd-hda-intel dmic_detect=0" | sudo tee -a /etc/modprobe.d/alsa-base.conf
       echo "blacklist snd_soc_skl" | sudo tee -a /etc/modprobe.d/blacklist.conf
    
    с перезагрузкой не дали ничего. Потом стал вспоминать, что делал до того, как
    исчез звук. Подключал Bluetooth колонки.
    
    Залез в настройки Bluetooth, потёр всё. Звук появился. Какой-то глюк в bluez5.
    
    В другой ситуации звук исчез (также остался только "dummy output") после
    обновления с Ubuntu 18.04 до 20.04. Помогло удаление пакета timidity:
    
        sudo apt purge timidity-daemon
    
     
    ----* Гитара в Debian и борьба с XRUN   Автор: Павел Отредиез  [комментарии]
     
    Опыт настройки Debian для повышения качества обработки звука с электрогитары.
    
    У меня достаточно средняя конфигурация: Athlon X3 3.4 GHz и дешевая USB
    звуковая карта Behringer UFO202 (лучше бы Behringer UCA222). Из софта использую
    qjackctl + jackd, guitarix, rakarrack. Надо сказать, что guitarix
    прожорливее на первый взгляд, чем rakarrack, хотя в обоих случаях
    потребление ресурсов зависит от навороченности эффектов.
    
    Итак чего я добился: ни одного XRUN (переполнение звукового буфера) при
    запуске jackd:
    
       /usr/bin/jackd -dalsa -dhw:CODEC -r48000 -p256 -n2
    
    Что позволяет играть без артефактов с почти незаметной задержкой.
    
    Для этого:
    
    1. И самое важное. Заметил что cpufreq гувернер ondemand всё равно через минуту
    две начинает снижать частоту ядер процессора и проскакивают единичные XRUN.
    Поэтому наш выбор гувернер performance (у меня 3 ядра):
    
       cpufreq-set -c 0 -g performance
       cpufreq-set -c 1 -g performance
       cpufreq-set -c 2 -g performance
    
    2. Также советую nice. В debian приведем файл /etc/security/limits.d/audio.conf
    к виду:
    
       @audio   -  rtprio     95
       @audio   -  memlock    unlimited
       @audio   -  nice      -19
    
    Обратите внимание последняя строчка была по умолчанию закоментирована.
    Добавим себя в группу audio если нет:
    
       gpasswd -a user audio
    
    Средствами qjackctl приоритет меньше 0 не выставляется. Мы сделаем -19. Для
    этого в свойствах ярлыков на панели запуска программ поменяем команды запуска типа:
    
       nice -n -19 qjackctl
       nice -n -19 guitarix
       nice -n -19 rakarrack
    
    Дочерние процессы наследуют приоритет.
    
     
    ----* Использование ALSA в Firefox и приложениях, поддерживающих только PulseAudio (доп. ссылка 1)   [комментарии]
     
    В рамках проекта apulse развивается эмулятор API PulseAudio на базе
    подсистемы ALSA, позволяющий запускать некоторые привязанные к PulseAudio
    приложения без установки данного звукового сервера.
    
    Например, для запуска Firefox поверх ALSA достаточно выполнить:
    
        apulse firefox
    
    предварительно настроив устройство вывода и изменив параметры sandbox-изоляции в Firefox.
    
    Если устройство вывода звука по умолчанию не заработало, то его можно указать
    через переменную окружения APULSE_PLAYBACK_DEVICE, например:
    
       export APULSE_PLAYBACK_DEVICE=plughw:0,0 
    или
       export APULSE_PLAYBACK_DEVICE=hw:0,0 
    
    Список доступных устройств можно посмотреть командой
    
       aplay -L
    
    
    При использовании микрофона можно настроить и устройство ввода:
    
       export APULSE_CAPTURE_DEVICE=plughw:2,0 
    
    где 2 - это канал, связанный с микрофоном в web-камере (0 - встроенная карта, 1
    звуковой ввод через HDMI).
    
    В Firefox следует в настройках about:config разрешить доступ к устройству /dev/snd
    
       security.sandbox.content.read_path_whitelist = /dev/snd/,/home/username/.asoundrc
       security.sandbox.content.write_path_whitelist = /dev/snd/ 
    
    если не заработало также можно попробовать
    
       security.sandbox.content.level=2
    
    Если не работает смешивание звуков и при воспроизведении в Firеfox приглушаются
    другие источники, в файл ~/.asoundrc можно добавить
    
       pcm.plugdmix {
           type plug
           slave.pcm "dmix"
       }
    
    И указать устройство выхода plugdmix:
    
       export APULSE_PLAYBACK_DEVICE=plugdmix
    
     
    ----* Разбираемся с "треском" в PulseAudio   Автор: leap42  [комментарии]
     
    Теория
    
    При воспроизведении звука часть потока буферизируется перед отправкой в
    устройство. Существует два подхода к наполнению буфера: условно "старый" -
    статический буфер, состоящий из нескольких фрагментов, вставка каждого
    следующего фрагмента по прерыванию (IRQ). Его плюс в предсказуемости - он
    работает всегда, и всегда одинаково. Но есть у него и минусы - 50 прерываний в
    секунду не дают процессору заснуть и энергосберегать. Не дают они ему и шанса
    считать что-то тяжёлое - прерывания всё время "отвлекают" ядро на очень
    простую, но "зудливую" задачу. Элементарная задача воспроизведения звука
    становится неоправданно затратной. Вишенка на торте - постоянная задержка при
    захвате звука: даже тогда, когда мы хотим минимальную задержку, она будет >=
    нашему статическому буферу (обычно ~100 ms).
    
    Второй подход (glitch free на языке маркетологов) подразумевает динамический
    буфер и вставку фрагмента по таймеру, без использования прерываний. Он лишён
    недостатков первого, но требует поддержки железом, приличных драйверов,
    "сознательности" приложения, которое должно запросить себе комфортный буфер
    (минимальный для программ захвата - 0-20ms, и большой для плееров - 200-2000ms).
    
    Dropout - ситуация, в которой фрагмента не оказалось в буфере в момент его
    воспроизведения. Одновременно является самой частой причиной звуковых
    артефактов. Чем больше буфер, тем меньше шансов на dropout (но и задержка выше).
    
    ALSA реализует и поддерживает только первый способ буферизации. PulseAudio
    реализует оба, по умолчанию использует второй.
    
    Что делать? Кто виноват?
    
    Если вы слышите артефакты при воспроизведении звука через PulseAudio, первым
    делом стоит перевести демон в "режим ALSA" и убедиться, что проблема в таймере:
    
    /etc/pulse/default.pa:
    
       --- load-module module-udev-detect
       +++ load-module module-udev-detect tsched=0
    
       pulseaudio -k; pulseaudio --start (от пользователя)
    
    Нагрузку на CPU можно уменьшить, увеличив размер фрагмента 
    
    /etc/pulse/daemon.conf:
    
       --- #default-fragments 4
       +++ default-fragments = 2
       --- #default-fragment-size-msec 25
       +++ default-fragment-size-msec 125
    
    но это увеличит задержку. Задержку можно уменьшить (но это увеличит нагрузку на CPU)
    
    /etc/pulse/daemon.conf:
    
       --- #default-fragments 4
       +++ default-fragments = 8
       --- #default-fragment-size-msec 25
       +++ default-fragment-size-msec 5
    
    Параметры default-fragments и default-fragment-size-msec имеют силу только если
    вы выключили таймер (прописали tsched=0), или если он не поддерживается аппаратно.
    
    Есть и менее радикальный вариант: принудительная буферизация на стороне таймера:
    
    /etc/pulse/default.pa:
    
       --- load-module module-udev-detect
       +++ load-module module-udev-detect tsched_buffer_size=60000
    
    На современных системах 60000 (это микросекунды) можно заменить на 30000 (или
    даже меньшее число, я использую 23000)
    
     
    ----* Подавление шумов средствами PulseAudio (доп. ссылка 1)   [комментарии]
     
    При появлении шумов и эффекта эха в голосовых и видеочатах, возникающих при
    использовании встроенных в ноутбук динамиков и микрофона, можно воспользоваться
    фильтрами подавления шумов, предоставляемыми звуковым сервером PulseAudio.
    
    Для активации фильтра, перед запуском программы следует включить фильтр через
    переменную окружения PULSE_PROP. Например, для запуска программы, можно ввести:
    
       PULSE_PROP="filter.want=echo-cancel" имя_программы
    
    Для постоянного применения фильтра, его нужно добавить в файл
    ~/.config/pulse/default.pa или /etc/pulse/default.pa:
    
       .nofail
       load-module module-echo-cancel
    
    Метод подавления шума можно определить явно, например, наибольшее качество
    избавления от эха отмечается для метода webrtc, а более высокая стабильность
    для speex:
    
       load-module module-echo-cancel aec_method=webrtc
       load-module module-echo-cancel aec_method=speex
    
     
    ----* Создание системы трансляции звука на базе Debian, Icecast2, Ices и XBMC   Автор: Artem B Solodchenko  [комментарии]
     
    Появилась задача реализовать звуковое оповещение на территории предприятия.
    Проблема заключается в том, что оператор с микрофоном и прочими звукодевайсами
    находится на расстоянии 2-х километров от места где должны висеть колонки.
    Таким образом построение аналоговой системы очень дорогое удовольствие. При
    этом по всей территории существует действующая компьютерная сеть. То есть нужно
    организовать трансляцию звука через эту сеть.
    
    Для этого нам нужно будет использовать один компьютер как
    "транслятор", а другие как "приемники". Для построения
    сервера трансляции я использовал OS Linux Debian7.2, Icecast2 - сервер
    трансляции и Ices2 - организатор потока. Для построение клиента
    подвернулось очень интересное решение. Наткнулся на вот такое устройство:
    http://raspberrypi.ru/ - Одноплатный компьютер на базе процессора ARM 11 c
    тактовой частотой 700 mhz и 512mb RAM. И операционную систему к нему: XBMC Raspbian.
    
    Установка сервера:
    
    После установки Debian доставляем следующие пакеты: icecast2 ices2 pulseaudio
    
       apt-get install icecast2
       apt-get install ices2
       apt-get install pulseaudio
    
    после чего ставим pulseaudio в автозапуск
    
       update-rc.d pulseaudio enable 
    
    iceast2 конфигурация:
    
    для начала включаем использование icecast2. Для этого в файле /etc/default/icecast2 меняем
    
       ENABLE=false 
    на 
       ENABLE=true
    
    после чего правим файл конфигурации /etc/icecast2/icecast.xml
    
       <icecast> 
           <limits> 
               <clients>100</clients> <!-- Максимальное кол-во клиентов -->
               <sources>8</sources> <!-- Количество передаваемых потоков -->
               <threadpool>5</threadpool> 
               <queue-size>524288</queue-size> 
               <client-timeout>30</client-timeout> 
               <header-timeout>15</header-timeout> 
               <source-timeout>10</source-timeout> 
               <burst-on-connect>1</burst-on-connect>
               <burst-size>65535</burst-size> 
           </limits> 
    
           <authentication> 
               <source-password>ПАРОЛЬ</source-password> 
               <relay-password>ПАРОЛЬ</relay-password> 
               <admin-user>admin</admin-user> 
               <admin-password>ПАРОЛЬ</admin-password> 
           </authentication> 
    
           <hostname>localhost</hostname> <!-- Название сервера трансляции -->
    
           <listen-socket> 
              <port>8000</port> <!-- Порт трансляции -->
           </listen-socket> 
           <fileserve>1</fileserve> 
    
           <paths> 
    
               <basedir>/usr/share/icecast2</basedir> 
               <logdir>/var/log/icecast2</logdir> 
               <webroot>/usr/share/icecast2/web</webroot> 
               <adminroot>/usr/share/icecast2/admin</adminroot> 
    
               <alias source="/" dest="/status.xsl"/> 
           </paths> 
    
           <logging> 
               <accesslog>access.log</accesslog> 
               <errorlog>error.log</errorlog> 
               <loglevel>3</loglevel> 
               <logsize>10000</logsize> 
           </logging> 
    
           <security> 
               <chroot>0</chroot> 
           </security> 
       </icecast> 
        
    проверяем работоспособность:
    
       /etc/init.d/icecast2 start
    
    запускаем браузер, в адресной строке пишем : http://127.0.0.1:8000, авторизуемся, радуемся :-)
    
    после чего ставим icecast2 в автозапуск
    
       update-rc.d icecast2 enable 
    
    
    Конфигурация Ices2
    
    примеры конфигурационных файлов находятся в /usr/share/doc/ices2/examples
    
    мне нужно чтобы все что звучит на компе транслировалось в сеть. Используем ices-alsa.xml
    копируем его в /etc:
    
       сp /usr/share/doc/ices2/examples/ices-alsa.xml /etc
    
    после чего правим конфиг:
    
    /etc/ices-alsa.xml
    
       <?xml version="1.0"?> 
       <ices> 
    
           <background>1</background>  <!-- 1- Запуск в фоновом режиме -->
           <logpath>/var/log/ices</logpath> 
           <logfile>ices.log</logfile> 
           <logsize>2048</logsize> 
           <loglevel>4</loglevel> 
           <consolelog>0</consolelog> 
    
           <stream> 
               <metadata> 
                   <name>Example stream name</name> 
                   <genre>Example genre</genre> 
                   <description>A short description of your stream</description> 
                   <url>http://mysite.org<;/url> 
               </metadata> 
    
               <input> 
                   <module>alsa</module> 
                   <param name="rate">44100</param> 
                   <param name="channels">2</param> 
                   <param name="device">pulse</param> <!-- Устройство с которого берется поток -->
                   <param name="metadata">1</param> 
                   <param name="metadatafilename">test</param> 
               </input> 
    
               <instance> 
                
                   <hostname>АДРЕС_СЕРВЕРА_ТРАНСЛЯЦИИ</hostname> <!-- Адрес icecast2 сервера -->
                   <port>8000</port> <!-- Порт icecast2 сервера -->
                   <password>ПАРОЛЬ</password> <!-- Пароль к icecast2 серверу -->
                   <mount>/example1.ogg</mount> <!-- Название потока -->
                   <yp>1</yp>   <!-- allow stream to be advertised on YP, default 0 --> 
    
                   <encode> 
                       <quality>1</quality> 
                       <samplerate>22050</samplerate> 
                       <channels>2</channels> 
                   </encode> 
    
                   <downmix>0</downmix> 
    
                   <resample> 
                       <in-rate>44100</in-rate> 
                       <out-rate>22050</out-rate> 
                   </resample> 
               </instance> 
            </stream> 
       </ices> 
    
    Автозапуск ices2
    
    С автозапуском ices2 появились определенные проблемы. Он должен запуститься
    самым  последним, желательно после старта GNOME. По этому  используем
    графическое приложение "Настройки запуска приложений" для настройки
    автозапуска  ices2. Добавляем "Приложения &#8594; Системные &#8594;
    Параметры &#8594; Запускаемые приложения"
    Говорим "добавить", имя: Название приложения (Ices2), команда:
    /usr/bin/ices2 /etc/ices-alsa.xml, описание: Описание приложения (Starting
    Streaming Ices2).
    
    На этом конфигурация сервера окончена. Все что воспроизводится на сервере будет
    ретранслироваться в сеть.
    
    Установка OpenElec XBMC на RaspbianPi
    
    Для этого микрокомпьютера есть несколько операционных систем. Подробнее здесь: http://www.raspberrypi.org/downloads
    
    Ссылка на скачивание OpenElec XBMC
    http://downloads.raspberrypi.org/openelec_latest . Качаем, распаковываем.
    
    Для установки cначала скачиваем и устанавливаем MiniTool Partition Wizard Home
    edition вот отсюда: http://www.partitionwizard.com/free-partition-manager.html
    Запускаем, создаём раздел Primary 150 Mb, FAT32, Active с меткой System. Еще
    раздел на всю свободную область флешки Primary, EXT4 с меткой Storage.
    После этого переходим в раздел с распакованным дистрибутивом и делаем:
    
       copy target\\KERNEL d:\\kernel.img
       copy target\\SYSTEM d:\\
       copy 3dparty\\bootloader\\*.* d:\\
       copy openelec.ico d:
       copy README.md d:\\
    
    создаем и редактируем файл d:\\cmdline.txt
    
    вписываем в него следующее:
       boot=/dev/mmcblk0p1 disk=/dev/mmcblk0p2 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 ssh
    
    d:\\ - ваш flashdrive
    
    После этого вставляем флешку в RaspbianPi и включаем этот компьютер.
    
    ВАЖНО: логин root пароль openelec
    
    Создание ссылки на вещание
    
    В директории /storage/music
    
    создаем файл с расширением .strm
    
    в нем указываем источник трансяции
    
       http://АДРЕС_ICECAST:PORT/FILENAME
    
    Удалённая перезагрузка OPEN Elec
    
    На клиентской машине создаем "чистый" файл ключа:
    
        ssh-keygen -t rsa
       (на все вопросы отвечаем ENTER)
    
    После этого вход на этот комп осуществляется как:
    
       ssh root@АДРЕС_ХОСТА
    
    И соответственно перезарузка:
    
       ssh root@АДРЕС_ХОСТА reboot
    
    и остановка
    
       ssh root@АДРЕС_ХОСТА poweroff
    
     
    ----* Настройка потокового аудиовещания при помощи Icecast2.3.3-kh5 в Chroot (доп. ссылка 1) (доп. ссылка 2)   Автор: Grand piano  [комментарии]
     
    Есть задачи:
    Установка icecast2.3.3-kh5 на Centos 6 x64.
    Настройка icecast на 80 порт.
    
    Почему такой выбор продукта и операционной системы - сборка KH явно превосходит
    по своей функциональности базовую. Дьявол кроется в деталях, погружаться в тему
    можно на профильных форумах. CentOS - это сейчас стандарт де факто для Unix
    серверов в нашей организации, поэтому опять же без обсуждения.
    
    В репозиториях именно этой модификации icecast нет. Или я так и не смог найти.
    В итоге, загрузил исходники с http://karlheyes.github.com/ , распаковал, собрал, поставил.
    
       yum install curl-devel libtheora-devel libvorbis-devel  libxslt-devel speex-devel 
       yum groupinstall 'Development Tools'
       tar xzf icecast2.3.3-kh5
       cd icecast-2.3.3-kh5
       ./configure
       make
       make install
    
    не стал использовать rpmbuild - почему то не захотел собираться нормально.
      
    Начал пытаться запускать. На 8000 порту всё взлетает, но как только меняешь на
    80 всё останавливается и говорит, что под root на 80 никого не пущу. Ладно
    будем chrootить, благо эта опция есть к конфигурационном файле. Вот на этом
    месте начинается самое интересное.
    
    1) Chroot сам по себе прост и банален, но приходиться давать массу прав на
    массу директорий и дополнительных перенаправлений.
    
    2) Конфигурацию выкладываю - она рабочая, не добавлены только точки
    монтирования и всякие мелкие нужности - пароли и т.д.
    
      <blockquote>
      <icecast>
        <location>UK</location>
        <admin>webmaster@localhost</admin>
    
        <limits>
            <clients>100</clients>
            <sources>2</sources>
            <queue-size>524288</queue-size>
            <client-timeout>30</client-timeout>
            <header-timeout>15</header-timeout>
            <source-timeout>10</source-timeout>
            <!-- same as burst-on-connect, but this allows for being more
                 specific on how much to burst. Most people won't need to
                 change from the default 64k. Applies to all mountpoints  -->
            <burst-size>65535</burst-size>
            <!--
            <max-bandwidth>100M</max-bandwidth>
            -->
        </limits>
    
        <authentication>
            <!-- Sources log in with username 'source' -->
            <source-password>hackme</source-password>
            <!-- Relays log in username 'relay' -->
            <relay-password>hackme</relay-password>
    
            <!-- Admin logs in with the username given below -->
            <admin-user>admin</admin-user>
            <admin-password>hackme</admin-password>
        </authentication>
    
        <!-- Uncomment this if you want directory listings -->
        
        <directory>
            <yp-url-timeout>15</yp-url-timeout>
            <yp-url>http://dir.xiph.org/cgi-bin/yp-cgi<;/yp-url>
        </directory>
        
    
        <!-- This is the hostname other people will use to connect to your server.
        It affects mainly the urls generated by Icecast for playlists and yp
        listings. -->
        <hostname>localhost</hostname>
    
        <!-- set the mountpoint for a shoutcast source to use, the default if not
             specified is /stream but you can change it here if an alternative is
             wanted or an extension is required
        <shoutcast-mount>/live.nsv</shoutcast-mount>
        -->
    
        <!-- port to use when talking to YP etc -->
        <port>80</port>
    
        <!-- You may have multiple <listener> elements -->
        <listen-socket>
            <port>80</port>
            <!-- <bind-address>127.0.0.1</bind-address> -->
            <!-- use <shoutcast-mount> in here to implicitly define port n+1 -->
        </listen-socket>
        <!--
        <listen-socket>
            <port>8001</port>
            <ssl>1</ssl>
        </listen-socket>
        -->
    
        <!--<master-server>127.0.0.1</master-server>-->
        <!--<master-server-port>8001</master-server-port>-->
        <!--<master-update-interval>120</master-update-interval>-->
    
        <!--<master-username>hackme</master-username>-->
        <!--<master-password>hackme</master-password>-->
    
        <!-- issue above authentication for relays in slave setup -->
        <!--<master-relay-auth>1</master-relay-auth>-->
    
        <!-- setting this makes all relays on-demand unless overridden, this is
             useful for master relays which do not have <relay> definitions here.
             The default is 0 -->
        <!--<relays-on-demand>1</relays-on-demand>-->
    
    
        <!-- Request the master server to redirect new listeners to this slave
             the details passed are based on <hostname> and <port> -->
        <!--<master-redirect>1</master-redirect>-->
    
        <!-- The maximum nuber of slaves that can register for new listener redirection. -->
        <!--<max-redirect-slaves>10</max-redirect-slaves>-->
    
        <!-- Relays. State connection information, and by default 
             request inline metadata for mp3 streams if available.
             An on-demand relay will only retrieve the stream if
             there are listeners connected -->
        <!--
        <relay>
            <server>127.0.0.1</server>
            <port>8001</port>
            <mount>/example.ogg</mount>
            <local-mount>/different.ogg</local-mount>
            <on-demand>1</on-demand>
            <retry-delay>30</retry-delay>
    
            <relay-shoutcast-metadata>0</relay-shoutcast-metadata>
        </relay>
        -->
        <!-- Allow multiple master servers to be specified, tries each one in turn.
        <relay>
            <local-mount>/stream.mp3</local-mount>
            <server>a.b.c.d</server>
            <timeout>6</timeout>
            <master>
                <port>8000</port>
                <mount>/a</mount>
            </master>
            <master>
                <port>80</port>
                <mount>/</mount>
            </master>
        </relay>
        -->
    
        <!-- Only define a <mount> section if you want to use advanced options,
             like alternative usernames or passwords
             With a master/slave setup you need to define a mount in the master
             or else the server will assume that the stream is not to be made
             available to the slave.
        <mount>
            <mount-name>/*.ogg</mount-name>
    
            <username>othersource</username>
            <password>hackmemore</password>
    
            <max-listeners>1</max-listeners>
            <max-bandwidth>1000k</max-bandwidth>
            <file-seekable>0</file-seekable>
            <dump-file>/backup/live-%d-%b.ogg</dump-file>
            <burst-size>65536</burst-size>
            <fallback-mount>/example2.ogg</fallback-mount>
            <fallback-override>1</fallback-override>
            <fallback-when-full>1</fallback-when-full>
            <intro>/path/to/stream-intro.ogg</intro>
            <max-listener-duration>3600</max-listener-duration>
            <hidden>1</hidden>
            <authentication type="htpasswd">
                    <option name="filename" value="myauth"/>
                    <option name="allow_duplicate_users" value="0"/>
            </authentication>
            <on-connect>/home/icecast/bin/stream-start</on-connect>
            <on-disconnect>/home/icecast/bin/stream-stop</on-disconnect>
            <file-seekable>0</file-seekable>
        </mount>
        -->
        <!-- other auth possibilities include running a command
             to do the auth, mount, user and pass are passed via
             stdin to the program
        <mount>
        ....
            <authentication type="command">
                 <option name="listener_add" value="auth_verify"/>
            </authentication>
            
            or 
    
            for url auth, the add url needs to return a "icecast-auth-user:" http
            header for a user to authenicate. URLs are sent params via POST.
    
            <authentication type="url">
                 <option name="username" value="admin"/>
                 <option name="password" value="hackme"/>
                 <option name="handlers"        value="3" />
                 <option name="stream_auth"    value="http://myauthserver.com/scripts/auth_mount.php"/>
                 <option name="mount_add"    value="http://myauthserver.com/scripts/add_mount.php"/>
                 <option name="mount_remove" value="http://myauthserver.com/scripts/del_mount.php"/>
                 <option name="listener_add"    value="http://myauthserver.com/scripts/add_listener.php"/>
                 <option name="listener_remove" value="http://myauthserver.com/scripts/del_listener.php"/>
            </authentication>
        </mount -->
    
    
        <fileserve>1</fileserve>
    
        <paths>
            <!-- basedir is only used if chroot is enabled -->
            <basedir>/usr/local/share/icecast</basedir>
    
            <!-- Note that if <chroot> is turned on below, these paths must both
                 be relative to the new root, not the original root -->
            <logdir>/log</logdir>
            <webroot>/web</webroot>
            <adminroot>/admin</adminroot>
            <pidfile>/icecast.pid</pidfile>
            <!-- <ssl-certificate>/usr/local/share/icecast/icecast.pem</ssl-certificate> -->
            <!-- <deny-ip>/path/to/file-with-IPs</deny-ip> -->
            <!-- <allow-ip>/path/to/file-with-IPs</allow-ip> -->
            <!-- <deny-agents>/path/to/file-with-useragents</deny-agents> -->
    
            <!-- location of mime types files used for file serving -->
            <mime-types>/etc/mime.types</mime-types>
    
            <!-- Aliases: treat requests for 'source' path as being for 'dest' path
                 May be made specific to a port or bound address using the "port"
                 and "bind-address" attributes.
              -->
            <!--
            <alias source="/foo" dest="/bar"/>
              -->
            <!-- Aliases: can also be used for simple redirections as well,
                 this example will redirect all requests for http://server:port/ to
                 the status page
              -->
            <alias source="/" dest="/index.html"/>
        </paths>
    
        <logging>
            <accesslog>access.log</accesslog>
            <errorlog>error.log</errorlog>
            <!-- <accesslog_ip>1<accesslog_ip> -->
            <playlistlog>playlist.log</playlistlog>
     <loglevel>3</loglevel> <!-- 4 Debug, 3 Info, 2 Warn, 1 Error -->
           <logsize>10000</logsize> <!-- Max size of a logfile -->
            <!-- If logarchive is enabled (1), then when logsize is reached
                 the logfile will be moved to [error|access|playlist].log.DATESTAMP,
                 otherwise it will be moved to [error|access|playlist].log.old.
                 Default is non-archive mode (i.e. overwrite)
            -->
            <!-- <logarchive>1</logarchive> -->
        </logging>
    
        <security>
            <chroot>1</chroot>
            
            <changeowner>
                <user>nobody</user>
                <group>nobody</group>
            </changeowner>
            
        </security>
      </icecast>
      </blockquote>
    
    
    После этого всё заработало, но остаётся несколько вопросов:
    
    1) Установка локального времени в логах icecast - при просто chroot он использует GMT.
    Решение: создание в /usr/local/share/icecast папки etc и копирование в неё
    файла /etc/mime.types и localtime
    
    
    2) Автостарт и управление службой как положено - без костылей типа killall и
    т.д. Т.е. нужен нормальный работающий скрипт в /etc/rc/d/init.d/.
    
    Решение: скрипт был взят здесь http://lists.xiph.org/pipermail/icecast/2008-November/011358.html
    
    
    3) Ротация логов средствами операционной системы.
    Решение третьей проблемы - пока тестирую настроечный файл в /etc/logrotate.d/,
    предварительно он вот такой
    
       /usr/local/shared/icecast/log/*.log {
           rotate 30
           daily
           compress
           postrotate
        /bin/kill -HUP `cat /usr/local/shared/icecast/icecast.pid 2> /dev/null` 2> /dev/null || true
           endscript
           }
    
    
    4) Нормальная работа механизма резолвинга DNS имён самим icecast.
    Решение: ldd `which icecast` и все что он выводит копируя раскладываем по
    папочкам в chroot директории. Также нужно скопировать в chroot директорию из
    /etc/ hosts, resolv.conf nsswitch.conf.
    
    Также следуя рекомендации  сделал следующее - создал симлинк на
    конфигурационный файл. Сам файл уложен в
    /usr/local/shared/icecast/usr/local/etc/icecast.xml, а в основную директорию
    где он по дефолту лежит (/usr/local/etc/) положен симлинк на него.
    
    Ну и конечно не забудьте про iptables, или открываем 80 порт, или блокируем
    его, это уже вам самим решать.
    
    Дополнение: В процессе тестирования всплыли первые проблемы с конфигурацией.
    Достигая 4 с небольшим тысяч подключения сервер впадал в коматозное состояние.
    Старых клиентов держит, новых не принимает, административный интерфейс не
    открывает, тормозит неимоверно и т.д. При этом нагрузка в целом на сервер
    небольшая, на команды из консоли сервер реагирует нормально. Вывод - ищем
    проблемы в самом icecast. Нашёл в логах запись - "too many open files".
    Начинаем гуглить проблему - найдено здесь и здесь.
    Решаем проблему.
    Вписываем в /etc/security/limits.conf
    
       nobody - nofile 10000
    
    Отправляем icecast в ребут (всю службу).
    Проверяем cat /proc/@pid@/limits
    Обращаем внимание на строку: Max open files
    
    После проведения "боевого" тестирования получены следующие результаты:
    Нагрузка до 4500 одновременных слушателей.
    Генерируемый поток в пике - около 600Mb/s
    Нагрузка на систему в целом - load average не превышает 0,4
    Т.е. Ещё есть запас по всем параметрам. 
    
     
    ----* Система распознавания речевых команд в Linux при помощи ПО julius (доп. ссылка 1) (доп. ссылка 2)   [комментарии]
     
    Для декодирования речевых команд можно использовать открытый проект Julius.
    
    
    Пользователи Ubuntu могут установить готовые пакеты:
    
       sudo apt-get install julius julius-voxforge
    
    Так как последний стабильный релиз Julius 4.2.1 некорректно работает с
    подсистемой ALSA, при использовании ALSA может потребоваться пересобрать код из cvs-репозитория:
    
       cvs -z3 -d:pserver:[email protected]:/cvsroot/julius co julius4
       cd julius4
       ./configure --with-mictype=alsa 
       make
    
    Микрофон можно выбрать через переменную окружения ALSADEV, например:
    
       export ALSADEV="plughw:1,0
    
    Копируем акустические модели voxforge (в случае, если был установлен пакет
    julius-voxforge модель уже установлена в /usr/share/julius-voxforge).
    
    Создаём файлы конфигурации по образу
    /usr/share/doc/julius-voxforge/examples/julian.jconf.gz. На базе sample.grammar
    и sample.voca создаём модели грамматики фраз и команды, после чего выполняем
    "mkdfa имя", например:
    
    Файл sample.voca с определением слов Shoulder, Elbow, Wrist, Grip, Light,
    on/off,   up/down, open/close:
    
    
       % NS_B
       <s>        sil
    
       % NS_E
       </s>        sil
    
       % JOINT_N
       WRIST        r ih s t
       ELBOW        eh l b ow
       SHOULDER        sh ow l d er
    
       % DEV
       LIGHT        l ay t
    
       % DEV_IN
       ON        aa n
       OFF        ao f
    
       % MANIP
       GRIP        g r ih p
    
       % M_ACT
       OPEN        ow p ax n
       CLOSE       k l ow s
    
       % DIRECTION
       UP        ah p
       DOWN      d aw n
    
       % ROTATION
       LEFT        l eh f t
       RIGHT       r ay t
    
    Файл sample.grammar с определением сочетания слов (Joint + up | down,
    Grip + open | close, Light + on | off, Left | Right):
    
       S : NS_B SENT NS_E
       SENT: JOINT_N DIRECTION
       SENT: MANIP M_ACT
       SENT: DEV DEV_IN
       SENT: ROTATION
     
    NS_E и NS_E определены как начальная и конечная пауза.
    
    Собираем модель:
    
       mkdfa sample
    
    в результате получаем набор dfa, dict и term файлы.
    
    Для распознания выполняем:
    
       julius -input mic -C julian.jconf
    
    говорим Left, Right, Shoulder Up и наблюдаем:
    
       sentence1: <s> RIGHT </s>
       sentence1: <s> LEFT </s>
       sentence1: <s> SHOULDER UP </s>
    
    Пример скрипта command.py для парсинга и запуска внешних программ при
    определении тех или иных фраз можно найти в директории /usr/share/doc/julius-voxforge/examples/controlapp
    
    
    Для распознавания фраз на русском языке можно попробовать использовать
    акустическую модель с сайта
    http://www.repository.voxforge1.org/downloads/Russian/Trunk/ , но судя по всему
    она пока мало пригодна к использованию.
    
     
    ----* Подключение нескольких звуковых плат через ALSA (доп. ссылка 1) (доп. ссылка 2)   Автор: Max Tyslenko  [комментарии]
     
    При наличии в системе 2 звуковых плат, встроенной и внешней, Kubuntu по
    умолчанию для работы выбрала встроенную. Переключить вывод на внешнюю карту
    можно через GUI-конфигуратор "Параметры системы" / "Мультимедиа", но интерес
    представляет способ изменения активной карты из консоли.
    
    В помощь нам придет утилита: asoundconf
    
        $ asoundconf
        Usage:
        asoundconf is-active
        asoundconf get|delete PARAMETER
        asoundconf set PARAMETER VALUE
        asoundconf list
    
        Convenience macro functions:
        asoundconf set-default-card PARAMETER
        asoundconf reset-default-card
        asoundconf set-pulseaudio
        asoundconf unset-pulseaudio
        asoundconf set-oss PARAMETER
        asoundconf unset-oss
    
    Для переключения активной карты воспользуемся командой:
    
        $ asoundconf set-default-card PARAMETER
    
    Вместо параметра PARAMETER нужно указать имя звуковой карты, узнать которое можно через команду:
    
        $ asoundconf list
        Names of available sound cards:
        NVidia
        Intel
    
    В итоге выполняем:
    
        asoundconf set-default-card NVidia
    
    Второй способ - внести изменения в файл конфигурации ~/.asoundrc (локальный для
    пользователя) или /etc/asound.conf, в котором прописать:
    
       pcm.!default {
           type hw
           card NVidia
       }
    
    
    идентификатор карты можно посмотреть выполнив:
    
       cat /proc/asound/cards
    
    Дополнительно можно указать параметр "device", в котором привести номер
    устройства вывода (колонки, наушники и т.п.). Список устройств можно посмотреть
    через команду:
    
       cat /proc/asound/devices
    
    Прослушать заданный файл через определенное устройство можно, например, так:
    
       aplay -D hw:0,2 file.wav
    так
       aplay -D plughw:0,0 file.wav
    или так
       mplayer file.wav -ao alsa:device=hw=0.0
    
     
    ----* Решение проблемы с излишней нагрузкой на CPU при использовании TeamSpeak 3 в Ubuntu 9.10 (доп. ссылка 1)   Автор: SolarWind  [комментарии]
     
    При установке клиента TeamSpeak 3, программы для коллективного голосового
    общения, в Ubuntu 9.10 обнаружилась весьма неприятная особенность. Буквально
    через несколько минут использования TeamSpeak начинал сильно нагружать
    процессор. Доходило до 100% загрузки нескольких ядер. При этом программа
    начинала глючить и звук со временем прерывался совсем.
    
    Как выяснилось, проблема заключается в PulseAudio. Причем в Ubuntu 10.04 она уже исправлена.
    
    Для решения проблемы в устанавливаем последнюю сборку PulseAudio из PPA-репозитория:
    
       sudo add-apt-repository ppa:ubuntu-audio-dev/ppa
       sudo apt-get update && sudo apt-get dist-upgrade
    
     
    ----* Вывод аудио с Linux/Unix PC на Windows PC   Автор: Artem Tashkinov  [комментарии]
     
    Иногда может возникнуть потребность вывести звук с Linux/FreeBSD/Unix
    компьютера на Windows компьютер. Сделать это безболезненно можно с помощью
    Pulse Audio.
    
    Как это осуществить:
    
    1. Скачайте Windows версию pulseaudio (http://www.cendio.com/pulseaudio/),
    pulseaudio-0.9.6-1.win32.zip (911 KiB).
    
    2. Распакуйте этот архив и создайте в папке с pulseaudio файл default.pa со следующим содержимым:
    
       load-module module-native-protocol-tcp listen=0.0.0.0 auth-anonymous=1
       load-module module-waveout
    
    3. Запустите файл pulseaudio.exe
    
    4. Добавьте pulseaudio.exe в список исключений брэндмауэра Windows или
    разрешите входящие соединения на порт 4713.
    
    5. На вашем Linux компьютере в файле /etc/pulse/client.conf добавьте следующую строку:
    
       default-server = 192.168.0.10
    
    заменив 192.168.0.10 на IP адрес Windows компьютера.
    
    Если у вас правильно настроен PulseAudio в Linux, то всё должно сразу заработать.
    
     
    ----* Как сохранить локально медиа-поток в формате RTMP   [комментарии]
     
    К сожалению в сети часто встречаются сайты отдающие аудио в RTMP формате, при
    этом через предлагаемый Flash-плеер прослушать такие потоки не всегда удается
    (в моем случае в произвольном месте трансляция прерывалась и начиналась с
    начала). Для решения данной проблемы можно попытаться сохранить RTMP поток локально.
    
    Рассмотрим процесс локального сохранения записей, на примере архива staroeradio.ru.
    
    
    Загружаем и собираем пакет rtmpdump (http://rtmpdump.mplayerhq.hu/):
    
       wget http://rtmpdump.mplayerhq.hu/download/rtmpdump-2.3.tgz
       tar xzf rtmpdump-2.3.tgz
       cd rtmpdump-2.3
       make
    
    Пользователи Ubuntu могут поставить rtmpdump из PPA
    https://edge.launchpad.net/rtmpdump Кроме того, вместо rtmpdump можно
    использовать урезанный форк flvstreamer
    (http://savannah.nongnu.org/projects/flvstreamer), который доступен из
    стандартных репозиториев.
    
    В итоге будут собраны три программы: rtmpdump для непосредственной загрузки
    потока и rtmpsuck и rtmpsrv для определения параметров потока.
    
    Сперва для получения параметров потока была предпринята попытка использовать
    Wireshark. Запускаем Wireshark. Выбираем активный сетевой интерфейс и в поле
    фильтра указываем "rtmpt". Начинаем проигрывание потока штатным flash-плеером
    через браузер.  В списке перехваченных пакетов в Wireshark находим "Handshake
    part 3". В нижних полях с детализацией раскрываем "Real Time Messagins
    Protocol",  далее "RTMP Body" и "AMF Objects". Переписываем себе пары
    параметров из полей "AMF string", такие как
    
       app = vod
       flashVer = LNX 10,1,103,19
       swfUrl  = http://www.staroeradio.ru/sr-player32.swf
       tcUrl = rtmp://server.audiopedia.su/vod
    
    при этом обращаем внимание на появляющийся в нижней части hex-дамп, так как
    некоторые строки могут отобразиться в обрезанном виде. Далее, ищем ниже по
    списку перехваченный пакет "Ping | Invoke" для  определения имени потока.
    Находим в hex-дампе упоминание команды play и указанного рядом потока: "mp3:disk2/32".
    
    Для выявления идентификатора конкретного потока можно посмотреть передаваемые
    flash-плееру параметры, там будет примерно такая строка "<param
    name="FlashVars" value="mp3ID=17139" />. 17139 также фигурирует в пути
    изначально проигрываемой страницы "http://www.staroeradio.ru/audio/disk2/32/17139"
    
    В итоге получаем путь: "rtmp://server.audiopedia.su/vod/mp3:disk2/32/17292"
    
    Пытаемся инициировать загрузку:
    
       ./rtmpdump -r "rtmp://server.audiopedia.su/vod/" --playpath "mp3:disk2/32/17292" \
       --swfUrl "http://www.staroeradio.ru/sr-player32.swf" --tcUrl "rtmp://server.audiopedia.su/vod" \
       --pageUrl "http://www.staroeradio.ru/audio/17139" \
       --app vod --swfVfy "http://www.staroeradio.ru/sr-player32.swf" -o test.flv
    
    Вываливается ошибка.... Забегая вперед скажу, что она связана с неправильным
    определением идентификатора потока, в котором вместо цифрового идентификатора
    (17139) нужно было указать имя файла, набранного русскими буквами, которые не
    отобразились как следует в Wireshark.
    
    Воспользуемся более правильным методом, основанном на поднятии собственного
    RTMP-сервера и перенаправления на него трафика.
    
    Настраиваем редирект RTMP-трафика на локальный обработчик:
    
       sudo iptables -t nat -A OUTPUT -p tcp --dport 1935 -j REDIRECT --to-ports 1935
    
    Смотрим параметры первичного запроса, запускаем:
    
       ./rtmpsuck
       RTMP Proxy Server v2.3
       Streaming on rtmp://0.0.0.0:1935
    
    Теперь инициируем проигрыванием потока в браузере и видим:
    
       Processing connect
       app vod
       flashVer: LNX 10,1,103,19
       swfUrl: http://www.staroeradio.ru/sr-player32.swf
       tcUrl: rtmp://server.audiopedia.su/vod
       pageUrl: http://www.staroeradio.ru/audio/17292
    
    Для получения более полных данных запускаем RTMP-сервер:
    
       ./rtmpsrv
       RTMP Server v2.3
       Streaming on rtmp://0.0.0.0:1935
    
    Еще раз инициируем проигрыванием потока в браузере и видим:
    
       rtmpdump -r "rtmp://server.audiopedia.su/vod" -a "vod" -f "LNX 10,1,103,19" 
       -W "http://www.staroeradio.ru/sr-player32.swf" -p "http://www.staroeradio.ru/audio/17292" 
       -y "mp3:disk2/32 [skip]/disk2/большая коллекция/12.08.10/Н.Иванов - Мой Маяковский" -o "Н.Иванов - Мой Маяковский.flv"
    
    Убираем редирект:
    
       sudo iptables -t nat -D OUTPUT -p tcp --dport 1935 -j REDIRECT --to-ports 1935
    
    Загружаем поток в локальный файл:
    
       rtmpdump -r "rtmp://server.audiopedia.su/vod" -a "vod" -f "LNX 10,1,103,19" \
         -W "http://www.staroeradio.ru/sr-player32.swf" -p "http://www.staroeradio.ru/audio/17292" \
         -y "mp3:disk2/32 [skip]/disk2/большая коллекция/12.08.10/Н.Иванов - Мой Маяковский" -o test.flv
    
    Все работает !
    
    При массовой загрузки файлов запускать каждый раз редирект на rtmpsrv неудобно.
    В процессе запуска flash-плеера со страницы ему передается только цифровой
    идентификатор, на основании которого вычисляется полный путь к песне. Недолгие
    эксперименты с tcpdump показали, что преобразование ID в имя композиции
    производится через обращение к сервису
    http://server.audiopedia.su:8888/getmp3parms.php?mp3id=N, где N - известный идентификатор.
    
    
    Получить полное имя композиции можно примерно так:
    
       curl http://server.audiopedia.su:8888/getmp3parms.php?mp3id=17292
    
       <?xml version="1.0" encoding="UTF-8"?>
       <mp3>
          <fname>Н.Иванов - Мой   Маяковский.mp3</fname>
          <fullname>Н.Иванов - Мой Маяковский</fullname>
          <dir>disk2/большая коллекция/12.08.10</dir>
          <length>396</length><lowqualitydir>disk2/32 [skip]/</lowqualitydir>
       </mp3>
    
    Поле <lowqualitydir> определяет дополнение к адресу для потока низкого
    качества. Если убрать из пути "disk2/32 [skip]" то поток будет грузиться не 32
    kbit, а 128 kbit.
    
    Преобразование загруженного в mp3:
    
       ffmpeg -i 17292.flv -ab 128k -acodec copy 17292.mp3
    
    PS. Если после загрузки в сохраненном потоке наблюдаются спонтанные сбои
    позиционирования (повторы и скачки позиционирования) то при запуске rtmpdump
    следует использовать флаг "--live".
    
     
    ----* Удаленное воспроизведение звука средствами PulseAudio (доп. ссылка 1)   Автор: Artem  [комментарии]
     
    Для организации вывода звука через звуковую карту на другом компьютере можно
    воспользоваться возможностями, встроенными в звуковой сервер PulseAudio.
    
    Небезопасный способ для доверительной сети.
    
    На стороне сервера, машины на которой будет выводиться звук, запускам paprefs и
    разрешаем подключение через сеть.
    
    Если paprefs не установлена, ставим из пакетов:
    
       sudo apt-get install paprefs
    
    На стороне клиента, который будет передавать звук выполняем:
    
       PULSE_SERVER=<ip сервера> <поддерживающий PulseAudio плеер>
    
    Например:
    
       PULSE_SERVER=192.168.2.3 mplayer misic.mp3
    
    Метод работает только для приложений, использующих PulseAudio для вывода звука.
    Для приложений ESound нужно установить пакет pulseaudio-esound-compat, а для
    приложений OSS программы нужно запускать через padsp, например вот так:
    
       PULSE_SERVER=192.168.2.3 padsp vlc
    
    
    Безопасный способ для тех, кто не хочет открывать PulseAudio для общего доступа по сети.
    
    Делаем перенаправление порта с локального ПК на удаленный через SSH:
    
       ssh -L4000:localhost:4000 192.168.2.3
    
    Делаем перенаправление сетевого сокета на юниксовый на сервере:
    
       socat TCP-LISTEN:4000,fork UNIX-CONNECT:/tmp/pulse-$USER/native
    
    Слушаем музыку:
    
       PULSE_SERVER=localhost:4000 paplay my_music.wav
    
     
    ----* Настройка синтеза речи в Ubuntu (доп. ссылка 1)   [комментарии]
     
    Простой рецепт по установке и использованию синтезатора речи Festival в Ubuntu:
    
    Устанавливаем festival и сопутствующие утилиты:
    
       sudo apt-get install festival speech-tools
    
    Cтавим пакет с голосом, которые занимает 186 Мб. 
    В репозитории universe Ubuntu 9.10 уже есть готовый пакет festvox-ru:
    
       sudo apt-get install festvox-ru
    
    Если используется Ubuntu 9.04 в /etc/apt/sources.list добавляем:
       deb http://ppa.launchpad.net/sergey-udaltsov/ppa/ubuntu jaunty main 
       deb-src http://ppa.launchpad.net/sergey-udaltsov/ppa/ubuntu jaunty main 
    
    Ставим:
    
       sudo apt-get install festvox-ru
    
    В остальных дистрибутива можно установить/распаковать deb-пакет с голосом из Ubuntu 9.10:
    
       sudo wget http://ubuntu.mirrors.tds.net/ubuntu/pool/universe/f/festvox-ru/festvox-ru_0.5-1_all.deb
       sudo dpkg --install festvox-ru_0.5-1_all.deb
    
    Проверяем (русский текст воспринимается только в кодировке UTF-8):
    
       festival
    
       >(SayText "Hello!")
    
    Активируем русский голос
    
       >(voice_msu_ru_nsh_clunits)
    
    Произносим русский текст:
    
       >(SayText "Привет!")
       >(exit)
    
    Читаем содержимое файла:
    
       festival -b '(begin (voice_msu_ru_nsh_clunits) (tts_file "./file.txt"))'
    
    Сохранить результат в файл:
    
       text2wave -eval '(voice_msu_ru_nsh_clunits)' ./file.txt -o ./file.wav
    
    Чтобы заработало:
    
       cat file.txt | festival --tts --language russian
    или
       festival --tts --language russian file.txt
    
    Нужно в файл /usr/share/festival/languages.scm перед строкой "(define
    (select_language language)" добавить (по аналогии с другими языками):
    
       (define (language_russian)
       "(language_russian)
       Set up language parameters for Russian"
          (set! male1 voice_msu_ru_nsh_clunits)
          (male1)
          (Parameter.set `Language `russian)
       )
    
    В блок "(define (select_language language)" добавляем:
    
       ((equal? language `russian)
       (language_russian))
    
     
    ----* Настройка вывода звука через WiFi с ноутбука на стационарный ПК с hi-fi аккустикой (доп. ссылка 1)   Автор: Mikko Talvi  [комментарии]
     
    Инструкция для Ubuntu.
    
    Установить необходимые пакеты:
       sudo apt-get install padevchooser paprefs pulseaudio-utils pulseaudio pulseaudio-esound-compat pulseaudio-module-udev
    
    Запускаем paprefs:
    
      sudo paprefs
    
    Расставить галочки на стороне сервера:
    
       [*] Make discoverable PulseAudio network sound devices available locally
       [*] Enable network access to local sound devices
       [*] Allow other machines on the LAN to discover local sound devices
       [*] Don't require authentication
    
    На стороне клиента (для вещания на localhost):
    
       [*] Enable network access to local sound devices
       [*] Allow other machines on the LAN to discover local sound devices
       [*] Don't require authentication
    
    Теперь запустив padevchooser можно выбрать текущий звуковой сервер PulseAudio.
    
    PS1: Поскольку PulseAudio запускается в пространстве пользователя, то требуется
    залогиненный в Gnome пользователь и там и там. Опять же можно сделать
    глобальный сервер при необходимости.
    
    PS2: Можно сделать рассылку звука и через multicast, но у меня  это страшно тормозило.
    
     
    ----* Передача звука с микрофона по сети (доп. ссылка 1)   Автор: ffsdmad  [комментарии]
     
    Потребовалось незаметно прослушать, что происходит в удалённом помещении в
    котором находился компьютер в Linux, с настроенным ssh и Web камерой.
    
    
    Для чтения с устройства hw:2,0, с временем прерывания 5 секунд, в формате wav
    нужно использовать команду:
    
       arecord -F 5 -D hw:2,0 -t wav -f dat -c 1
    
    имя устройства можно узнать так:
    
       cat /proc/asound/pcm
       01-00: SAA7134 PCM : SAA7134 PCM : capture 1
       00-01: AD198x Digital : AD198x Digital : playback 1
       00-00: AD198x Analog : AD198x Analog : playback 1 : capture 1
       02-00: USB Audio : USB Audio : capture 1
    
    Для преобразование в mp3 потока из stdin и выводе результата в stdout:
    
       lame -
    
    Для проигрывания mp3 потока с stdin
    
       mpg123 -
    
    В итоге команда для прослушивания выглядит так:
    
       ssh user@host "arecord -F 5 -D hw:2,0 -t wav -f dat -c 1 | lame -" | mpg123 -
    
    или
    
       ssh user@host "arecord -F 5 -D hw:2,0 -t wav -f dat -c 1 | lame -" > listening.mp3
    
    При подключение к host запускается команда записи с микрофона, конвертирования
    и записи потока "звука" в stdout который передаётся через ssh на локальный
    компьютер, на котором этот поток направляется в mp3 проигрыватель или файл
    
     
    ----* Как вырезать звуковую дорожку из видео в отдельный файл (доп. ссылка 1)   Автор: Kroz  [комментарии]
     
    Эта простая функция реализуется через ffmpeg :
    
       ffmpeg -i input.avi -vn output.mp3
    
    или для wmv:
    
       ffmpeg -i input.wmv -vn -acodec copy output.wma
    
    преобразуем wma в mp3
    
       mplayer -quiet -vo null -vc dummy -af volume=0,resample=44100:0:1 -ao pcm:waveheader:file=output.wav output.wma
       lame -V0 -h -b 192 --vbr-new output.wav output.mp3
    
     
    ----* Разделение однофайловой копии аудио CD на треки (доп. ссылка 1)   [комментарии]
     
    Разбиение на отдельные файлы "lossless" копии аудиодиска в формате ape, flac,
    wv или wav по индексному cue-файлу.
    
    
    В Debian/Ubuntu устанавливаем пакеты shntool (для получения утилиты shnsplit) и
    cuetools (для cuebreakpoints):
    
       sudo apt-get install cuetools shntool
    
    Устанавливаем поддержку lossless кодеков:
    
       sudo apt-get install flac wavpack
    
    Выделяем треки из sample.flac на основании индекса sample.cue, результат
    кодируем кодеком без потерь flac:
    
       cuebreakpoints sample.cue | shnsplit -a "sample" -o flac sample.flac
    
    При желании можно указать вместо "-o flac" - "-o wav", "-o mp3" или "-o ogg".
    Опция "-a sample" задает имя префикса для сохраняемой группы файлов, иначе
    будет использован префикс "split-track".
    
    Для переноса мета-тегов из исходного файла нужно использовать скрипт cuetag из пакета cuetools:
    
       cuetag sample.cue split-track*.flac
    
    Дополнение: при кодировании исходного файла в формате Monkey's Audio, кодек
    можно загрузить из репозитория http://morgoth.free.fr/ubports/
    
    В /etc/apt/sources.list добавим:
    
        deb http://morgoth.free.fr/ubuntu jaunty-backports main
    
    Устанавливаем пакет monkeys-audio:
        wget -O - http://morgoth.free.fr/files/morgoth-signkey.gpg.asc | sudo apt-key add - 
        sudo apt-get update
        sudo apt-get install monkeys-audio
    
    
    Для разбиение большого MP3 файла на треки можно использовать утилиту mp3splt:
    
       mp3splt -c big_file.cue big_file.mp3
    
     
    ----* Рекурсивное перекодирование FLAC-файлов в MP3 с сохранением ID3 тегов (доп. ссылка 1)   Автор: Александр Симаков  [комментарии]
     
    Для того чтобы с комфортом перекодировать музыку в формате
    FLAC в MP3 вам понадобятся:
    
    * MP3-кодер LAME: http://lame.sourceforge.net/
    * FLAC-кодер: http://flac.sourceforge.net/
    * Скрипт flac2mp3.sh 
    
    Отличительные особенности скрипта flac2mp3.sh:
    
    * Рекурсивная обработка нескольких альбомов сразу
    * Создание ID3 тегов на основе мета-информации во FLAC-файлах
    * Сохранение mp3-файлов в отдельной директории
    
    Использование:
    
       flac2mp3.sh <input_dir> <output_dir> [lame_opts]
    
    Пример:
    
       flac2mp3.sh /tmp/my/flac/albums /tmp/my/mp3 "-b 320 -h"
    
    Вот как могут выглядеть директории input_dir и output_dir после вызова скрипта:
    
    tree /tmp/my/flac/albums
    
       /tmp/my/flac/albums
       `-- album1
       |-- track1.flac
       `-- track2.flac
       
       1 directory, 2 files
    
    tree /tmp/my/mp3
    
       /tmp/my/mp3
       `-- albums
       `-- album1
       |-- track1.mp3
       `-- track2.mp3
    
    2 directories, 2 files
    
    Все необходимые директории при этом создаются скриптом автоматически.
    
    Текст скрипта:
    
       #!/bin/bash
       # flac2mp3.sh --- скрипт для конвертации FLAC файлов в MP3
       # Александр Симаков, <xdr (тчк) box на Google Mail>
       # http://alexander-simakov.blogspot.com/
       #
    
       # Какие программы где находятся
       LAME=lame
       FLAC=flac
       METAFLAC=metaflac
    
       # Настройки LAME по-умолчанию
       DEFAULT_LAME_OPTS="-b 256 -h"
    
       # Эта функция извлекает из FLAC-файла мета-информацию
       # и формирует соответствующую последовательность
       # опций для LAME.
       function get_id3_opts()
       {
        flac_file="$1"
    
        $METAFLAC --export-tags-to - "$flac_file" | while read -d $'\n' tag; do
            tag_name=$(echo "$tag" | awk -F= '{ print $1 }')
            tag_value=$(echo "$tag" | awk -F= '{ print $2 }' | sed 's/"/\\"/g')
    
            case "$tag_name" in
                TITLE)
                    echo -n "--tt \"$tag_value\" "
                    ;;
                ARTIST)
                    echo -n "--ta \"$tag_value\" "
                    ;;
                ALBUM)
                    echo -n "--tl \"$tag_value\" "
                    ;;
                GENRE)
                    echo -n "--tg \"$tag_value\" "
                    ;;
                DATE)
                    echo -n "--ty \"$tag_value\" "
                    ;;
                TRACKNUMBER)
                    echo -n "--tn \"$tag_value\" "
                    ;;
            esac
        done
       }
    
       # Эта функция формирует имя mp3-файла и создает
       # необходимые директории.
       function make_mp3_file_name()
       {
        input_dir=$1
        output_dir=$2
        flac_file=$3
    
        album_dir=$(basename "$input_dir")
        mp3_file=${flac_file/%flac/mp3}
        mp3_file=${mp3_file/#${input_dir}/${output_dir}/${album_dir}/}
        mp3_dir=$(dirname "$mp3_file")
        $(mkdir -p "$mp3_dir")
    
        echo "$mp3_file"
       }
    
       # Эта функция рекурсивно конвертирует FLAC-файлы из
       # директории input_dir в директорию output_dir.
       # Директория output_dir создается автоматически.
       function main()
       {
        input_dir=$1
        output_dir=$2
        lame_opts=$3
    
        if [[ -z "$input_dir" || -z "$output_dir" ]]; then
            echo "Usage: $0 <input_dir> <output_dir> [lame_opts]"
            echo "Example: $0 /tmp/my/flac/albums /tmp/my/mp3 \"-b 320 -h\""
            exit 1
        fi
    
        if [[ -z "$lame_opts" ]]; then
            lame_opts=$DEFAULT_LAME_OPTS
        fi
    
        OIFS=$IFS; IFS=$'\n'
    
        # Рекурсивно обрабатываем все FLAC-файлы
        for flac_file in $(find "$input_dir" -name "*.flac" | sort); do
            flac_base=`basename "$flac_file"`
            echo "Processing '$flac_base'..."
    
            id3_opts=$(get_id3_opts "$flac_file")
            mp3_file=$(make_mp3_file_name "$input_dir" "$output_dir" "$flac_file")
            cmd="$FLAC -sdc \"$flac_file\" | $LAME --quiet $lame_opts $id3_opts - \"$mp3_file\""
    
            eval $cmd
        done
       }
    
       main "$@"
    
     
    ----* Скрипт для перекодирования коллекции музыкальных файлов   Автор: redstorm  [комментарии]
     
    Понадобилось мне однажды перекодировать некоторое количество музыкальных
    композиций из формата FLAC/APE/WAV в MP3.
    
    encode_list.txt - содержит полные пути до директорий с исходными файлами (путь
    не должен оканчиватся на "\")
    
    В системе должны быть установлены утилиты flac, mac, lame. 
    
    Приветствуется улучшенная версия скрипта. Хотя лично мне он понадобился всего один раз... 
    но после небольших изменений он может стать еще полезнее, в некоторых случаях.
    
    
    #!/bin/bash
    
    # шаманское заклинание
    IFS="
    ";
    # конец шаманского заклинания
    
    # чего и куда класть 
    ENCODE_PATH=`pwd`;
    ENCODE_LIST="encode_list.txt"
    
    for i in `cat $ENCODE_LIST`; do
        FLAC_count=`find "$i" -name "*.flac" | wc -l`
        APE_count=`find "$i" -name "*.ape" | wc -l`
        WAV_count=`find "$i" -name "*.wav" | wc -l`
        echo "dir = '$i'";
        if [ $WAV_count -lt $FLAC_count ] && [ $APE_count -lt $FLAC_count ]
        then
    	echo "FLAC detected";
    	for j in "$i"/*.flac; do
    	    out_name=`basename ${j/.flac/.mp3}`;
    	    out_dir=`basename $i`
    	    out_full="$ENCODE_PATH/$out_dir/$out_name";
    	    mkdir "$ENCODE_PATH/$out_dir";
    	    echo `date +"%T %y/%m/%d"` encoding "'"$out_name"'" >> $ENCODE_PATH/$out_dir/encode.log;
         flac -d "$j" -o - | lame -ms -v -V0 -h - "$out_full"; #>>
    $ENCODE_PATH/$out_dir/encode.log 2>> $ENCODE_PATH/$out_dir/encode.log;
    	done;
        elif [ $FLAC_count -lt $APE_count ] && [ $WAV_count -lt $APE_count ]
        then
    	echo "APE detected";
    	for j in "$i"/*.ape; do
    	    out_name=`basename ${j/.ape/.mp3}`;
    	    out_dir=`basename $i`
    	    out_full="$ENCODE_PATH/$out_dir/$out_name";
    	    mkdir "$ENCODE_PATH/$out_dir";
    	    echo `date +"%T %y/%m/%d"` encoding "'"$out_name"'" >> $ENCODE_PATH/$out_dir/encode.log;
         mac "$j" - -d | lame -ms -v -V0 -h - "$out_full"; #>>
    $ENCODE_PATH/$out_dir/encode.log 2>> $ENCODE_PATH/$out_dir/encode.log;
    	done;
        else [ $FLAC_count -le $WAV_count ] && [ $APE_count -le $WAV_count ]
    	echo "WAV detected";
    	for j in "$i"/*.wav; do
    	    out_name=`basename ${j/.wav/.mp3}`;
    	    out_dir=`basename $i`
    	    out_full="$ENCODE_PATH/$out_dir/$out_name";
    	    mkdir "$ENCODE_PATH/$out_dir";
    	    echo `date +"%T %y/%m/%d"` encoding "'"$out_name"'" >> $ENCODE_PATH/$out_dir/encode.log;
         lame -ms -v -V0 -h "$j" "$out_full"; #>> $ENCODE_PATH/$out_dir/encode.log
    2>> $ENCODE_PATH/$out_dir/encode.log;
    	done;
        fi;
    done
    
    
    
    Другой вариант
    
    
    
    #!/bin/bash
    # Copyright (C) 2007-2008 Vladimir V. Kamarzin <[email protected]>
    #
    # Split one big audiofile (cdimage) to separate tracks
    #
    # This file is free software; you can redistribute it and/or modify
    # it under the terms of the GNU General Public License as published by
    # the Free Software Foundation; either version 2 of the License, or
    # (at your option) any later version.
    #
    # This program is distributed in the hope that it will be useful,
    # but WITHOUT ANY WARRANTY; without even the implied warranty of
    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    # GNU General Public License for more details.
    #
    # You should have received a copy of the GNU General Public License
    # along with this program; if not, write to the Free Software
    # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
    
    #. shell-error
    
    renice 19 -p $$ > /dev/null 2>&1 ||:
    
    while read cuefile
    do
           # get cuesheet filename
           cue="${cuefile##*/}"
    
           # object (filename without extension)
           obj=${cue%.cue}
    
           # relative path to object''s directory
           objdir="${cuefile%/*}"
    
           pushd "$objdir"
    
           # First, find all files that need decoding before process and decode it
           if [ -f "$obj".mp3 ]; then
                   lame --decode "$obj".mp3 "$obj".wav || fatal "cannot decode $obj.mp3, exiting"
    
           elif [ -f "$obj".ogg ]; then
                   oggdec "$obj".ogg || fatal "cannot decode $obj.ogg, exiting"
           fi
    
           # Next, split one-big-file. Use flac for loseless and ogg for lossy
           if [ -f "$obj".ape ]; then
                   cuebreakpoints "$cue" | shnsplit -o ''flac flac --best -o %f -'' -t %n "$obj".ape \\
                   || fatal "failed to split $obj.ape"
    
           elif [ -f "$obj".flac ]; then
                   cuebreakpoints "$cue" | shnsplit -o ''flac flac --best -o %f -'' -t %n "$obj".flac \\
                   || fatal "failed to split $obj.flac"
    
           elif [ -f "$obj".wav ]; then
                   cuebreakpoints "$cue" | shnsplit -o ''cust ext=ogg oggenc -q 7 -o %f -'' -t %n "$obj".wav \\
                   || fatal "failed to split $obj.wav"
    
           else
                   fatal "$obj file not found, exiting"
           fi
    
           # Recode tags. Assume that russian tags has windows-1251 encoding
           case "$LANG" in
                   ru_RU.KOI8-R) recode_to=koi8-r
                           ;;
                   ru_RU.CP1251) recode_not_needed=1
                           ;;
                   *) recode_to=utf8
           esac
    
           [ "$recode_not_needed" = 1 ] && ln -s "$cue" tmp.cue || recode -f 1251.."$recode_to" < "$cue" > tmp.cue \\
           || fatal "cannot recode cue: $cue"
    
           # Embed tags into tracks, rename tracks
           for (( i=1 ; i <= $(cueprint -d ''%N'' tmp.cue) ; ++i ))
           do
             NN=$(printf ''%02d'' $i)
    
             [ -s "$NN.flac" ] && {
               # Prepare track tags, filter out empty tags, embed the rest
               cueprint -n $i -t \\
               ''ARRANGER=%A\\nCOMPOSER=%C\\nGENRE=%G\\nMESSAGE=%M\\nTRACKNUMBER=%n\\nARTIST=%p\\nTITLE=%t\\nALBUM=%T\\n'' \\
                   tmp.cue | egrep -v ''=$'' | metaflac --import-tags-from=- $NN.flac
               # rename NN.flac to "NN - TrackTitle.flac"
               mv $NN.flac "$NN - $(cueprint -n $i -t %t tmp.cue | sed -e "s,/,,g").flac"
             }
    
             [ -s "$NN.ogg" ] && {
               cueprint -n $i -t \\
               ''ARRANGER=%A\\nCOMPOSER=%C\\nGENRE=%G\\nCOMMENT=%M\\nTRACKNUMBER=%n\\nARTIST=%p\\nTITLE=%t\\nALBUM=%T\\n'' \\
                   tmp.cue | egrep -v ''=$'' > tags.tmp
               vorbiscomment -a -c tags.tmp "$NN.ogg"
               mv $NN.ogg "$NN - $(cueprint -n $i -t %t tmp.cue | sed -e "s,/,,g").ogg"
             }
    
           done
    
          rm -f tmp.cue "$cue" "$obj".{flac,ape,mp3,ogg,wav} tags.tmp
           popd
    
    done < <(find . -type f -iname "*.cue")
    
     
    ----* Запись потокового радио в mp3 файл (доп. ссылка 1)   Автор: linux-ru.blogspot.com  [комментарии]
     
    mplayer http://showtcast.test.ru:8128 -dumpstream -dumpfile recorded_music.mp3 -vc dummy -vo null
    
     
    ----* Подключение Bluetooth гарнитуры в Fedora Core Linux 4 (доп. ссылка 1)   Автор: John G. Moylan  [комментарии]
     
    Устанавливаем поддержку bluetooth (проект Bluez):
        yum install bluez-libs bluez-pin bluez-utils bluez-hcidump bluez-utils-cup
    
    Устанавливаем утилиты звуковой подсистемы ALSA:
        yum install alsa-tools alsa-lib alsa-utils alsa-lib-devel
    
    Устанавливаем automake (понадобится для сборки BTSCO)
       yum install automake
    
    Проверяем на сайте http://bluetooth-alsa.sourceforge.net/ поддерживается ли
    наша гарнитура (Jabra BT200 поддерживается).
    
    Запускам hcitool и смотрим активна ли bluetooth подсистема.
    
    Подключаем гарнитуру и запускаем "hcitool scan", смотрим MAC адрес в результатах вывода.
    Далее, подключаем через:
       hcitool cc MAC
    
    Все должно работать, но на случай проблем, пример некоторый файлов из /etc/bluetooth:
    
    hcid.conf
            options {
               autoinit yes;
               security user;
               pairing multi;
               # PIN helper
               pin_helper /etc/bluetooth/feed-pin.sh;
               # D-Bus PIN helper
               #dbus_pin_helper;
            }
            device {
               name "%h-%d";
               # Local device class
               class 0x120104;
               # Inquiry and Page scan
               iscan enable; pscan enable;
               lm accept;
               lp rswitch,hold,sniff,park;
               # Authentication and Encryption (Security Mode 3)
               auth enable;
               encrypt enable;
            }
    
    rfcomm.conf
         rfcomm0 {
             # Automatically bind the device at startup
             bind no;
    
             # Bluetooth address of the device
             device 11:11:11:11:11:11;
    
             # RFCOMM channel for the connection
             channel 1;
    
             # Description of the connection
             comment "Bluetooth Device
         }
    
    /etc/bluetooth/feed-pin.sh
        #!/bin/sh
        echo "PIN:0000"
    
    
    Установка BTSCO из исходных текстов.
    
    Получаем исходные тексты из CVS:
       cvs -d:pserver:[email protected]:/cvsroot/bluetooth-alsa log
       cvs -d:pserver:[email protected]:/cvsroot/bluetooth-alsa co btsco
    
    Собираем утилиты:
       ./bootstrap
       ./configure
       make
       make install
       make maintainer-clean
    
    Собираем модуль ядра:
       cd kernel
       make
       make install
       depmod -e
       make clean
    
    Подгружаем модуль ядра:
       modprobe snd-bt-sco
    
    Подключаемся к гарнитуре:
       btsco -v MAC
    
    Небольшой скрипт для автоматизации запуска skype:
        #!/bin/sh
        modprobe modprobe snd-bt-sco
        btsco MACofHeadset
        skype
    
     
    ----* Решение проблем подергиванием звука в FreeBSD   Автор: Roman Y. Bogdanov  [комментарии]
     
    Решение проблем с "лаганием", "залипанием", "подергиванием" звука для FreeBSD
    5.x при сильных нагрузках на ata систему:
    
    в /boot/loader.conf добавить строку 
    
       hint.pcm.0.buffersize="16384".
    
    Работает не со всеми звуковыми картами. Карточка с MediaForte чипом стала
    играть звук в 4 раза быстрее,
    на SoundBlaster 5.1 live все играет замечательно.
    
     
    ----* Использование нескольких источников звука в FreeBSD (доп. ссылка 1)   Автор: lavr  [комментарии]
     
    Для одновременного воспроизведения звука от разных приложений 
    нужно создать несколько виртуальных звуковых каналов:
    
       sysctl hw.snd.pcm0.vchans=4
       sysctl hw.snd.maxautovchans=4
    
    Если devfs не используется, в приложении нужно обращаться к устройствам /dev/dsp0.N
    , где N -  номер свободного канала.
    
    Для установки громкости звука по умолчанию в FreeBSD 5.3 в /boot/device.hints добавляем:
       hint.pcm.0.vol="100"
    
     
    ----* Как изменить частоту дискретизации звукового файла   [комментарии]
     
    sox -r 22050 in.wav -r 44100 out.wav
    
     
    ----* Запись звука с входа line-in напрямую в mp3   Автор: redstorm  [комментарии]
     
    rec -c 2 -r 44100 -s w -t WAV - | lame -q 9 - linein-out-realtime.mp3
    
    подробнее - man rec и man lame, единственное что надо сказать `-s w` - это 16bit.
    
     
    ----* Как в RedHat 8 или 9 слушать MP3-файлы.   Автор: Antonio  [комментарии]
     
    Проблема: В свежеустановленном редхате (8 или 9 версии) не получается слушать mp3-файлы. 
    XMMS их не играет, хотя в старых дистрибутивах все работало.
    
    Причина: В связи с неуемной жадностью патентодержателей формата MP3 его поддержка 
    (плееры либо их соответствующие компоненты) исключена из дистрибутива.
    
    Решение: Пойти на сайт http://www.xmms.org и скачать нужные плагины для своей версии редхата.
    
     
    ----* Настройка PulseAudio и ALSA для достижения максимального качества звука (доп. ссылка 1)   [комментарии]
     
    Пример настроек PulseAudio и ALSA, обеспечивающих максимальное качество звука.
    
    PulseAudio
    
    ~/.config/pulse/daemon.conf
    
    
       default-sample-format = float32le # по умолчанию s16le
       default-sample-rate = 48000
       alternate-sample-rate = 44100
       default-sample-channels = 2
       default-channel-map = front-left,front-right
       # уменьшение числа и увеличение размера буферов воспроизведения
       default-fragments = 2 # по умолчанию 4
       default-fragment-size-msec = 125 # по умолчанию 25
       resample-method = soxr-vhq # по умолчанию speex-float-1, который меньше нагружает CPU
       enable-lfe-remixing = no
       high-priority = yes
       nice-level = -11
       realtime-scheduling = yes
       realtime-priority = 9 # по умолчанию 5
       rlimit-rtprio = 9
       daemonize = no
    
    В настройках ALSA направляем вывод в PulseAudio-плагин hw, напрямую
    взаимодействующий со звуковым драйвером ядра без промежуточных преобразований,
    что позволяет сократить задержки при выводе звука.
    
    /etc/asound.conf или /etc/alsa/conf.d/99-pulse.conf
    
    
       pcm.!default {
          type plug
          slave.pcm hw
    
          # по умолчанию:
          # type pulse 
          # fallback "sysdefault"
    
       }
    
     
    ----* Вывод звука на переднюю панель в Ubuntu 9.10 для HDA Intel (доп. ссылка 1)   Автор: Waster  [комментарии]
     
    После обновления до Ubuntu до 9.10 перестал работать вывод звука (HDA Intel,
    STAC92xx) на переднюю панель системного блока (Ext Front Jack). Звук у меня
    встроенный, HDA Intel, STAC92xx. Проблема решилась следующим образом:
    
    В файле /etc/modprobe.d/alsa-base.conf меняем
    
       options snd-hda-intel power_save=10 power_save_controller=N
    на
       options snd-hda-intel model=3stack
    
    Перезапускаем ALSA:
    
       sudo alsa force-reload
    
     

       Карманные ПК

    ----* Запуск Android-приложений в окружении Chrome OS или в браузере Chrome (доп. ссылка 1)   [комментарии]
     
    Компания Google начала тестирование функции запуска Android-приложений в
    Chrome OS. В настоящее время доступно лишь несколько Android-программ,
    предлагаемых для использования в Chrome OS. Данное ограничение является
    искусственным, поэтому энтузиасты
    нашли способ обойти ограничение и организовать выполнение разнообразных
    Android-приложений, включая Skype, Pandora, Opera Mini, Flipboard.
    
    Более того, так как Android-окружение формируется в web-браузере с
    использованием технологии Native Client, то имеется возможность организовать
    запуск Android-программ в обычном браузере Сhrome для Linux, Windows или OS X.
    
    
    Chrome OS
    
    Для обхода ограничения в Chrome OS подготовлена утилита, раскрывающая apk-пакет
    любой программы и маскирующая его под одно из официальных тестовых приложений.
    
    Инструкция по установке:
    
    Устанавливаем в Chrome OS любое официальное демонстрационное Android-приложение
    из Chrome Store. Данная операция требуется для установки runtime-компонентов Android.
    
    Протестируем работу Android-приложения для того чтобы убедиться, что Android
    runtime в данной системе работает корректно.
    
    На другом компьютере с Ubuntu установим Node.js и приложение chromeos-apk для
    распаковки apk-пакетов:
    
       sudo add-apt-repository ppa:chris-lea/node.js
       sudo apt-get update
       sudo apt-get install nodejs
       npm install chromeos-apk -g
    
    Загрузим на ПК с Ubuntu интересующий нас apk-пакет и распакуем его при помощи
    утилиты chromeos-apk. Например:
    
       chromeos-apk com.soundcloud.android.apk
    
    или для планшета
    
       chromeos-apk com.soundcloud.android.apk --tablet
    
    В итоге будет создана директория  com.soundcloud.android, которую следует
    перенести на устройство с Chrome OS.
    
    В браузере Chrome OS включаем режим разработчика ("Developer mode") в разделе
    chrome://extensions и загружаем содержимое скопированной директории через
    кнопку  "Load unpacked extension".
    
    После этого установленная программа станет доступна для запуска.
    
    При необходимости установки нескольких программ, для каждой новой программы
    следует изменить значение  "key" в файла manifest.json, в расположенной внутри
    распакованной из apk-пакета директории на одно из значений, применяемых в
    демонстрационных программах.
    
    Дополнение: обойти ограничение по числу установленных программ и избавиться от
    правки ключа можно установив модифицированный runtime - ARChon (инструкция ниже).
    
    Chrome
    
    Загружаем со страницы http://bitbucket.org/vladikoff/archon/downloads
    модифицированный Android Runtime - ARChon. Поддерживается Chrome 37 и более
    новые выпуски.
    
       wget https://bitbucket.org/vladikoff/archon/get/v1.0.zip
       unzip v1.0.zip
    
    Следуя предыдущему описанию устанавливаем утилиту chromeos-apk  и активируем
    режим разработчика в Chrome. Далее через интерфейс chrome://extensions
    загружаем содержимое разархивированной директории нажав кнопку "Load unpacked extension".
    
    Для установки Android-приложения загружаем apk-файл и распаковываем его
    утилитой chromeos-apk  с опцией "--archon":
    
       chromeos-apk com.imdb.mobile.apk --archon
    
    Загружаем программу через  "Load unpacked extension" в chrome://extensions.
    
    Для изменения активного разрешения экрана в файлах gen_main.min.js и
    gen_index.min.js из архива ARChon находим и правим на своё усмотрение строку
     
       tablet: {"long": 1280, "short": 800}
    
    Можно распаковать и поправить настройки пакета вручную, без установки утилиты
    chromeos-apk. Для этого извлекаем из apk-архива директорию _template, сохранив
    её под полным именем приложения, например "com.soundcloud.android". Помещаем
    apk-файл в директорию com.soundcloud.android/vendor/chromium/crx. Изменяем в
    manifest.json ссылку на apk-файл. Там же правим параметры formFactor (phone или
    tablet) и orientation (landscape или portrait). При использовании ARChon
    runtime удаляем из manifest.json параметр "key".
    
     
    ----* Монтирование устройств Android 4 в Ubuntu Linux при помощи go-mtpfs (доп. ссылка 1) (доп. ссылка 2) (доп. ссылка 3)   [комментарии]
     
    Начиная с третьей ветки в платформе Android изменился метод организации
    внешнего доступа к накопителю мобильного устройства. Если раньше устройство
    маскировалось под USB-накопитель, который воспринимался внешними системами как
    обычный USB Flash, то начиная с выпуска Android 3 для доступа к данным
    предлагается использовать разработанный компанией Microsoft протокол MTP
    (Media Transfer Protocol), поддержка которого в большинстве Linux-дистрибутивов
    недоступна из коробки. Причиной перехода на MTP является желание избавиться от
    основного недостатка старой реализации - необходимости размонтирования раздела
    перед его экспортом, из-за чего во время подключения раздела к ПК он становился
    недоступным для мобильного устройства.
    
    Наиболее простым способом обеспечения работы с Android 4 в Linux является
    установка из репозиториев или сборка из исходных текстов GTK-приложения gMTP
    (http://gmtp.sourceforge.net/), которое предоставляет графический интерфейс для
    работы с файлами на устройстве, в том числе даёт возможность перемещать файлы
    между gMTP и файловым менеджером в режиме Drag and Drop. При сборке
    рекомендуется использовать самую свежую версию библиотеки  libmtp
    (http://libmtp.sourceforge.net/), иначе в процессе работы время от времени
    приходится сталкиваться с проблемами. Готовые свежие сборки gMTP для Ubuntu
    можно загрузить из специального PPA-репозитория, а libmtp - здесь.
    
    
    Другим способом является монтирование MTP-устройств в виде дисковых разделов
    при помощи FUSE-модулей mtpfs или mtp-fuse. Следует отметить, что
    работают данные модули с некоторыми устройствами весьма нестабильно и оставляют
    желать лучшего в плане скорости копирования данных. Относительно недавно для
    решения проблем с ранее доступными FUSE-реализациями был создан FUSE-модуль [[https://github.com/hanwen/go-mtpfs
    Go-mtpfs]], из особенностей которого можно отметить необходимость установки для
    сборки компилятора языка программирования Go.
    
    
    Готовые сборки Go-mtpfs отныне доступны через PPA для Ubuntu 13.04, 12.10 и
    12.04. Unstable PPA используется для задействования самой свежей версии
    libmtp. Кроме того, подготовлен специальный апплет для оболочки Unity,
    позволяющий быстро монтировать и отмонтировать MTP-разделы.
    
    Установим Go-mtpfs из PPA:
    
       sudo add-apt-repository ppa:webupd8team/unstable
       sudo apt-get update
       sudo apt-get install go-mtpfs
    
    Установим дополнение для Unity:
    
       sudo apt-get install go-mtpfs-unity
    
    Для монитрования раздела вручную следует использовать команду:
    
       go-mtpfs /media/MyAndroid
    
    Для отмонтирования:
    
       fusermount -u /media/MyAndroid
    
    
    Для самостоятельной сборки go-mtpfs из Git-репозитория можно использовать
    следующую инструкцию, в результате которой будет подготовлен исполняемый файл /tmp/go/bin/go-mtpfs:
    
       sudo apt-get install golang fuse git-core libmtp-dev libfuse-dev
       sudo adduser $USER fuse
       mkdir /tmp/go 
       GOPATH=/tmp/go go get github.com/hanwen/go-mtpfs
      
    
    Кроме того, в состав libmtp входит несколько полезных утилит:
    
    Определение устройства:
    
       mtp-detect
    
    Подсоединение к устройству:
    
       mtp-connect
    
    Манипуляции с контентом на устройстве:
    
       mtp-albumart 
       mtp-getplaylist
       mtp-albums
       mtp-files
       mtp-sendfile
       mtp-folders  
       mtp-newfolder
       mtp-delfile
       mtp-newplaylist
       mtp-getfile
       mtp-playlists    
       mtp-tracks
    
    
       
    
     
    ----* Сборка операционной системы Mozilla Boot to Gecko (B2G) для экспериментов в QEMU (доп. ссылка 1)   [комментарии]
     
    Энтузиастам предлагается поэкспериментировать в эмуляторе QEMU с проектом B2G
    (Boot to Gecko), в рамках которого Mozilla развивает операционную систему,
    загружающуюся сразу в web-браузер. В качестве основы B2G используется ядро
    Linux и низкоуровневые компоненты из платформы Android. Для запуска приложений
    будет задействован web-стек Mozilla. На платформе будут выполняться
    web-приложения, написанные с использованием HTML5-технологий, CSS и JavaScript.
    Расширенные функции приложений, такие как доступ к аппаратному обеспечению и
    телефонии, можно задействовать с использованием Web API, который в
    дальнейшем планируется передать в организацию W3C для формирования единого стандарта.
    
    Инструкция приведена для 64-разрядной сборки Ubuntu 11.10. Для сборки
    желательно наличие 4 Гб ОЗУ и 80 Гб свободного дискового пространства.
    
    Устанавливаем пакеты, необходимые для сборки B2G:
    
       sudo apt-get build-dep firefox
       sudo apt-get install mercurial libasound2-dev libcurl4-openssl-dev libnotify-dev libxt-dev libiw-dev mesa-common-dev autoconf2.13
       sudo apt-get install ia32-libs gcc-multilib g++-multilib bison flex gperf lib32zl-dev lib32ncurses5-dev lib32ncursesw5-dev libidl-dev lib32gomp1 autoconf2.13 ccache libx11-dev lib32readline-gplv2-dev
    
    Клонируем репозиторий B2G:
    
       git clone https://github.com/andreasgal/B2G.git
    
    Для проведения автоматизированных тестов также можно загрузить фреймворк marionette:
    
       git clone https://github.com/jonallengriffin/marionette_client.git
    
    Выполняем сборку:
    
       cd B2G
       make sync
    
    Указывает какой бэкенд для виджетов использовать, в local.mk добавляем параметр WIDGET_BACKEN:
    
       vi local.mk
     
       WIDGET_BACKEND=gonk
    
    Формируем конфигурационные файлы для сборки варианта для QEMU:
    
       make config-qemu
    
    Собираем пользовательский бэкенд gonk и систему:
    
       make gonk
       make
    
    Запускаем B2G в эмуляторе:
    
       ./emu.sh
    
    
    Для сборки B2G для телефона Samsung Galaxy S2 можно использовать инструкцию
    http://developer.mozilla.org/en/Mozilla/Boot_to_Gecko/Building_B2G_for_Samsung_Galaxy_S2 .
     Набор компонентов для построения HTML5-интерфейса для телефонов можно
    загрузить со страницы проекта gaia в github (для сборки достаточно выполнить
    make install-gaia и скопировать на устройства результирующие файлы).
    
     
    ----* Настройка локального принтера для печати через Google Cloud Print (доп. ссылка 1)   [комментарии]
     
    При помощи облачного сервиса Google Cloud Print возможно организовать печать на
    удаленном принтере с мобильного устройства под управлением платформы Android
    или ChromeOS, при этом устройство может находиться где угодно, независимо от
    расположения принтера. Ниже показано как настроить локальный принтер в Linux,
    чтобы на него можно было печатать через Google Cloud Print.
    
    Для обеспечения печати будет использовать прокси-сервер cloudprint,
    позволяющий связать с сервисом Google Cloud Print любой принтер, работающий
    через CUPS. Прокси написан на Python и очень прост в использовании, достаточно
    запустить приложение cloudprint и ввести параметры своего аккаунта в gmail.com,
    после чего настроенный в локальной системе принтер сразу станет доступным для
    печати с телефона или планшета на базе платформы Android. На телефоне для
    отправки на печать удобно использовать приложения "PrinterShare" или "Cloud
    Print", которые можно найти в Android Market. Печать производится путем выбора
    соответствующего сервиса через кнопку "Share".
    
    1. Необходим настроенный для локальной печати принтер.
    
    2. Устанавливаем пакеты, необходимые для работы и загрузки cloudprint (пример для Debian и Ubuntu):
    
       sudo apt-get install git-core python python-cups
    
    3. Загружаем в текущую директорию свежую версию cloudprint из Git-репозитория проекта:
    
        git clone git://github.com/armooo/cloudprint.git
    
    4. Собираем и устанавливаем cloudprint:
    
       cd ~/cloudprint
       python setup.py build
       sudo python setup.py install
    
    Скрипт будет установлен по следующему пути:
       /usr/local/lib/python2.6/dist-packages/cloudprint/cloudprint.py
    
    5. Запускаем прокси для печати через Google Cloud Print:
    
       python /usr/local/lib/python2.6/dist-packages/cloudprint/cloudprint.py
    
    Вводим свой адрес и пароль в Gmail, после чего можно будет печатать на
    принтере, выбранном по умолчанию в CUPS.
    
    6. Управлять параметрами принтера и очередями печати в Google Cloud Print можно
    на странице http://www.google.com/cloudprint/manage.html
    
    7. Вместо реального принтера можно организовать печать в PDF, используя
    CUPS-драйвер cups-pdf, который по умолчанию сохраняет выводимые на печать файлы
    в каталоге PDF в домашней директории текущего пользователя.
    
    Для установки драйвера и подключения принтера можно использовать команды:
    
       sudo apt-get install cups-pdf
       sudo lpadmin -p cups-pdf -v cups-pdf:/ -E -P /usr/share/ppd/cups-pdf/CUPS-PDF.ppd
    
    В системе виртуальный PDF-принтер будет выглядеть как cups-pdf:/
    
     
    ----* Подключение Bluetooth-мыши к смартфону Nokia N900 (доп. ссылка 1) (доп. ссылка 2)   [комментарии]
     
    Загружаем на N900 и распаковываем в директорию
    /home/user/N900-BluetoothMouseSupport архив N900-BluetoothMouseSupport.tar.gz.
    Для выполнения нижеизложенных операций у пользователя должен быть root-доступ к
    устройству, для чего необходимо установить пакет rootsh из менеджера
    приложений. Инструкция тестировалась в прошивке PR 1.2.
    
    Для упрощения всех действий в вышеупомянутый архив
    N900-BluetoothMouseSupport.tar.gz включен скрипт install.sh, рассмотрим далее
    какие действия он выполняет.
    
    Копируем библиотеку evdev_drv.so:
    
       sudo gainroot
       cd /usr/lib/xorg/modules/input
       mv evdev_drv.so evdev_drv.so.orig
       cp /home/user/N900-BluetoothMouseSupport/evdev_drv.so .
    
    Добиваемся отображения курсора мыши, копируя недостающие в системе изображения курсоров:
     
       cd /usr/share/icons/default/cursors
       mv transp trans.orig
       cp /home/user/N900-BluetoothMouseSupport/arrow transp
    
    
    
    Внимательно проверяем, что evdev_drv.so успешно скопирован в
    /usr/lib/xorg/modules/input и перезагружаем устройство.
    
    Настраиваем отображение курсора мыши:
    
       apt-get install libxmuu1
       cd /home/user/N900-BluetoothMouseSupport
       ./xsetroot -cursor_name arrow
    
    Чтобы скрыть курсор выполняем:
    
       cd /home/user/N900-BluetoothMouseSupport
       ./xsetroot
    
    Для автоматизации показа/скрытия курсора в архиве можно найти готовые
    приложения 'showmouse'/'hidemouse'.
    
    Если наблюдаются проблемы с курсором при работе в браузере, приводим в файле
    /etc/X11/Xsession.d/04b_start_matchbox строку запуска matchbox-window-manager в вид:
    
       /usr/bin/matchbox-window-manager -theme $THEME -use_dialog_mode static -use_cursor yes &
    
    Теперь, можно подключить к N900 к монитору, привязать Bluetooth-мышь/клавиатуру
    и получить полноценный ПК, умещающийся в кармане.
    
     
    ----* Установка FTP и HTTP сервера на iPhone. Смена пароля на iPhone (доп. ссылка 1)   Автор: Da1VeR  [комментарии]
     
    Инструкция по установке FTP сервера на iPhone, для обмена файлами с внешними миром.
    
    1. В инсталлере (http://www.ru-iphone.com/installer) 
    ставятся такие программы - Pure-FTPd, BossPrefs, BossPrefs PureFTPD Control.
    
    2. Перегрузить полностью iPhone
    
    3. В меню программ появится значок BossPrefs с его помощью можно либо включать
    либо выключать сервис ftp
    (собственно там еще есть SSH, WiFi, EDGE, Bluetooth, что очень удобно в случае с SSH - ибо можно, 
    при не надобности, отключать, что повысит защищенность)
    
    4. Подключится из любого компьютера на телефон, для прошивки 1.1.4:
    login\password: mobile\alpine либо login\password: root\alpine
    (ftp://mobile:alpine@ip_adress)
    
    ------------------------
    
    Для поднятия Web сервера я использовал Lighttpd, ибо с Apache возникли проблемы с биндингом порта.
    
    Итак приступим:
    
    1) Из инсталера ставим Community Sources, BSD Subsystem
    
    2) Ставим PHP. Как сказано после установки нужно добавить в пути /opt/iphone/bin/ , 
    но для начале мы перенесем папку opt чтобы незахламлять первый раздел, который ограничен 300мб. 
    Для этого:
    
       mv /opt /private/var/opt
       ln -s /private/var/opt/ /opt
    
    Далее прописываем сам путь:
    
       PATH=/opt/iphone/bin/:$PATH
    
    3) Ставим Lighttpd и BossPrefs Lighttpd Control
    
    4) Конектемся по ssh на iphone и редактируем /usr/local/etc/lighttp.conf
    
    server.document-root = "/private/var/root/Sites/" - директория где будет находится сам сайт.
    
    В строку index-file.names добавляем "index.php"
    В строку static-file.exclude-extensions добавляем ".php"
    В строку cgi.assign добавляем ".php"  => "/opt/iphone/bin/php"
    В строку mimetype.assign добавляем ".php" => "application/x-httpd-php",
    
    4) Далее заходим в BossPrefs и активируем Lighttpd
    
    5) Заливаем тестовый test.php в /private/var/root/Sites/, например
    с таким содержанием:
    
       <?php
       phpinfo();
       ?>
    
    6) Все теперь можете наслаждаться результатом: http://ip_adress/test.php
    
    ------------------------
    
    Уж если кому понадобилась смена пароля на iPhome - значит как минимум ssh уже стоит...
    Всем кто попробует сменить пароль через команду passwd искренней сочувствую, 
    ибо после такой смены - у вас сразу же слетит SpringBoard.
    Итак приступим....
    
    1) Для начала не помешало бы сделать бекап файлов, что хранят наши пароли:
    
       mkdir /etc/backup
       cp /etc/passwd /etc/backup/
       cp /etc/master.passwd etc/backup/
    
    2) Генерируем новый пароль используя ssl:
    
       openssl passwd -crypt -salt /s NewPassword
    
    Пароль должен быть не больше 8 символов, ибо все остальные символы игнорируются.
    
    Например для пароля "NewPass" - команда будет 
    "openssl passwd -crypt -salt /s NewPass" и на выходе мы получим "/sJnipZ7EmJ.M"
    
    3) Правим файлы /etc/passwd и /etc/master.passwd
    Выглядят они примерно так:
    
       nobody:*:-2:-2::0:0:Unprivileged User:/var/empty:/usr/bin/false
       root:/smx7MYTQIi2M:0:0::0:0:System Administrator:/var/root:/bin/sh
       mobile:/smx7MYTQIi2M:501:501::0:0:Mobile User:/var/mobile:/bin/sh
       daemon:*:1:1::0:0:System Services:/var/root:/usr/bin/false
       unknown:*:99:99::0:0:Unknown User:/var/empty:/usr/bin/false
       _securityd:*:64:64::0:0:securityd:/var/empty:/usr/bin/false
    
    Пароль тут для root и mobile - alpine, в закодированном виде /smx7MYTQIi2M, его и меняем на наш:
    
       root:/sJnipZ7EmJ.M:0:0::0:0:System Administrator:/var/root:/bin/sh
       mobile:/sJnipZ7EmJ.M:501:501::0:0:Mobile User:/var/mobile:/bin/sh
    
    Перегружаем iphone и радуемся новым паролям..
    
     
    ----* Nokia в Ubuntu Linux. Подключение, настройка и работа. (доп. ссылка 1)   Автор: openkazan.info  [комментарии]
     
    Настройка линукса для работы с телефоном Nokia, подключеным к системе через USB кабель.
    
    В этой статье будем настраивать линукс для работы с вашим телефоном Nokia, 
    подключеным к системе через USB кабель. Система Ubuntu Feisty Linux 7.04, 
    хотя аналогичным образом можно настроить в любом другом дистрибутиве.
    
    1) Ставим необходимый софт: 
    
       apt-get install obexftp  openobex-apps
    
    2)  Далее в консоли:  
    
       lsusb
    
    на  выходе получаем:
    
       Bus 003 Device 003: ID 0421:043a Nokia Mobile Phones
    
    из этого узнаем VendorID и ProductID:
    
       VendorID = 0421
       ProductID = 043a
    
    3) Прописываем эти данные в /etc/udev/rules.d/040-permissions.rules:
    
       sudo vim /etc/udev/rules.d/040-permissions.rules
    
    в конец файла вписываем:
    
       BUS=="usb", SYSFS{idVendor}=="VendorID", SYSFS{idProduct}=="ProductID",  GROUP="plugdev", USER="yourUserNname"
    
    VendorID и ProductID заменяем нашими данными полученными выводом команды lsusb
    USER="имя пользователя под которым вы работаете в системе"
    
    4) Создаём кнопку запуска на рабочем столе. В её свойствах прописываем:
    
       java -jar /home/YOURUSERNAME/obexftp-frontend-0.6.1-bin/OBEXFTPFrontend.jar
    
    YOURUSERNAME меняем на вашу домашнюю папку
    
    5) Запускаем /usr/bin/obexftp
    В вкладке Transport выбираем USB, Value 1
    Далее OK.
    
    Всё, настройка закончена. Запускаем программу через созданную нами на рабочем
    столе кнопку запуска.
    В появившемся окошке видим drive c: - это наша memory card. Процесс закачки и
    выгрузки файлов понятен интуитивно.
    Удачной работы!:)
    
     
    ----* Как перекодировать фильм для просмотра на КПК   [обсудить]
     
    Преобразуем в 220x176 по формуле: 220x? = Y/(X/220)
      320x240, 640x480 => 220x165
      352 x 288 => 220x176
      344x272 => 220x173
      448x336 => 220x168
    Для более мощных, чем ARM133, СPU и быстрых flash, нужно увеличить vbitrate, по умолчанию он 800.
     
    mencoder INPUT.AVI -oac mp3lame -ovc lavc -lavcopts \
        vcodec=mpeg4:vhq:vqmin=2:vqmax=20:vmax_b_frames=2:vbitrate=100:vqcomp=0.6 \
        -vop scale=220:173,eq=15 -ofps 20 -zoom -sws 2 -lameopts \
        cbr:br=32:aq=0:mode=3 -o OUTPUT.AVI
    
     
    ----* Как запустить Perl на смартфоне под Windows Smartphone 2003 (доп. ссылка 1)   [обсудить]
     
    Perlce удалось запустить на Motorola MPx200, работающем на базе Windows Mobile
    2003 Smartphone edition.
    
    Процесс установки:
    - Качаем пакеты celib-3.13-dll-bin-all-platforms.tar.gz и perl-wince-arm-pocket-wce300.tar.gz
    (http://www.rainer-keuchel.de/wince/dirlist.html)
    
    - Содержимое директории lib из пакета perl-wince-arm-pocket-wce300.tar.gz
    копируем в \Mounted Volume\lib\perl5
    
    - Все остальное, плюс celib.dll из директории
    wince-arm-pocket-wce300-release,копируем в \Mounted Volume\bin
    
    - В реестре создаем раздел HKLM\Environment и заводим там ключи:
          PERL5LIB="\Mounted Volume\lib\perl5"
          UNIXROOTDIR= "/Mounted Volume"
    
    - Создаем ассоциацию для выполнения .pl файлов программой perl.exe, через
    файловый менеджер RESCO Explorer
    или через правку реестра. Обязательно не забываем заключить аргумент в кавычки, 
    т.е. в HKCR\perlfile\Shell\open\command должно быть \Mounted Volume\bin\perl.exe "%1", 
    RESCO создает без кавычек.
    
    - Закачиваем и выполняем test.pl с print "Hello World!\n"; 
    - Смотрим, и используем в дальнейшем, файлы: /perl-stdin.txt, /perl-stdout.txt и /perl-stderr.txt
    
     
    ----* Синхронизация Smartphone Motorola MPx200 под Linux (доп. ссылка 1)   [комментарии]
     
    Есть два способа как заставить MPX200 работать с Linux: IrDA  и wince-usb.
    
    1. Подключение через IrDA (SIR):
      
       Устанавливаем параметры для SiR порта
       /bin/setserial /dev/ttyS1 port 0x6f8 irq 3 uart 8250 baud_base 115200
    
       irattach /dev/ttyS1 -s
       
       Для RedHat-based Linux дистрибутивов делаем проще:
          В /etc/sysconfig/irda 
             IRDA=yes
             DEVICE=/dev/ttyS1
             DISCOVERY=yes
    
          # service irda start
    
       Запускем демон синхронизации (не из под root). Качаем с http://synce.sourceforge.net
          $ dccm
          Если используется пароль запускаем как "dccm -p пароль"
    
       Один раз указываем используемый  порт.
          # synce-serial-config ircomm0
       
       Стартуем pppd (про hotplug, ниже)
          # synce-serial-start
    
       Проверяем.
          $ pstatus
    
    Version
    =======
    Version:    4.20.0 (Microsoft Windows Mobile 2003 for Pocket PC Phone Edition (?))
    Platform:   3 (Windows CE)
    .....
    
       Завершаем сеанс
          # synce-serial-abort
    
    
    2. Подключение по USB.  Для 2.4.x ядра используем user space драйвер wince-usb
       http://cvs.sourceforge.net/viewcvs.py/synce/wince-usb/  + http://libusb.sourceforge.net 
      (последние 2.6.x ядра должны работать с модулями ipaq и usb-serial из коробки).
    
       Патчим. В самом начале ipaqd.c меняем значения IPAQ_ENDPOINT на
          #define IPAQ_ENDPOINT_IN        0x82                                            
          #define IPAQ_ENDPOINT_OUT       0x02  
    
       Далее в devlist[]  добавляем                                                                 
            { 0x045e, 0x00ce, "Motorola MPX200" },  
    
       Создаем /usr/local/bin/cebox.sh взяв пример из README к wince-usb, например:
          #!/bin/sh
          /usr/sbin/pppd nocrtscts local debug passive silent 192.168.1.1:192.168.1.2 ms-dns 192.168.1.1 noauth proxyarp
    
          $ dccm
    
       Подключаем телефон и сразу запускаем
          # rmmod ipaq (пока не поправили hotplug)
          # ipaqd 2>/var/log/ipaqd.log
    
       Далее запускаем synce-serial-* как в предыдущем шаге.
    
    3. Настройка HotPlug (чтобы все запускалось автоматически).
    
       В /etc/hotplug/usb.agent добавляем после блока с "LABEL="USB product $PRODUCT":
    
          if [ "$PRODUCT" = "45e/ce/0" ]; then
               /etc/hotplug/usb/ipaq
               exit 0
          fi
    
       Создаем /etc/hotplug/usb/ipaq
           #!/bin/bash
           killall -9 ipaqd
           killall dccm
           su -c /usr/bin/dccm /user/
           /usr/local/bin/ipaqd 2>/var/log/ipaq.log
    
    4. Стандартные команды synce:
          pcp - копирование файлов (аналог cp)
          pls - список файлов в директории (аналог ls)
          pmkdir - создание директории (аналог mkdir)
          pmv - перенос/переименование файлов (аналог mv)
          prm - удаление файлов (аналог rm)
          prmdir - удаление директорий
          prun - запуск программы на устройстве
          pstatus - статус устройства
          synce-install-cab - установка на устройство .cab файла
          orange - позволяет выдрать .cab из .exe инсталлера;
    
    
    В Modnight Commander удобно использовать VFS понимающую команды
    "cd #synce" и "cd #synceroot", 
    правда модуль раздаваемый на сайте synce у меня не заработал, пришлось его переписать: 
    ftp://ftp.opennet.ru/pub/sys/shell/synce-mcfs-patched/
    Для работы, копируем файлы synce и synceroot в /usr/lib/mc/extfs
    К extfs.ini добавляем:
       synce                                                                           
       synceroot
    
    Хорошая графическая оболочка для синхронизации календаря и адресной книги -
    MultiSync (http://multisync.sourceforge.net/)
    
     

       Мгновенный обмен сообщениями (Jabber, ICQ)

    ----* Возвращение к жизни Skype 4.3 для Linux (доп. ссылка 1)   Автор: онаним  [комментарии]
     
    Некоторое время назад компания Microsoft начала блокировать работу
    классического клиента Skype 4.3 для Linux, стимулируя переход на новую ветку
    Skype 8.x. При этом блокировка не обусловлена техническими причинами и работа
    Skype 4.3 для Linux может быть восстановлена простой заменой номера версии  в
    исполняемом файле.
    
    В частности, если в любом бинарном редакторе заменить строку "4.3.0.37" на
    "8.3.0.37" в /usr/bin/skype, то старый клиент Skype  продолжит свою нормальную работу.
    
    Для изменения можно запустить:
    
       sudo sed -i 's/4\.3\.0\.37/8\.3\.0\.37/' /usr/bin/skype
    
     
    ----* Установка сервера видеоконференций openmeetings 2.2 в Debian 7.4   Автор: Artem Solodchenko  [комментарии]
     
    Настройка openmeetings в Debian  7.4. 
    
    
    
    Добавляем репозитории в /etc/apt/sources.list
    
       # основное зеркало debian
       deb http://ftp.debian.org/debian/ squeeze main contrib non-free
       deb http://ftp.debian.org/debian/ squeeze-updates main contrib non-free
       deb http://ftp.debian.org/debian/ squeeze-proposed-updates main contrib non-free
       # зеркало от яндекс
       deb http://mirror.yandex.ru/debian/ squeeze main contrib non-free
       deb http://mirror.yandex.ru/debian/ squeeze-updates main contrib non-free
       deb http://mirror.yandex.ru/debian/ squeeze-proposed-updates main contrib non-free
       # дополнительные зеркала
       deb http://security.debian.org/ squeeze/updates main contrib  non-free
       deb http://www.debian-multimedia.org squeeze main non-free
       deb http://backports.debian.org/debian-backports squeeze-backports main
       # дополнительные зеркала от яндекс
       deb http://mirror.yandex.ru/debian-security/ squeeze/updates main contrib non-free
       deb http://mirror.yandex.ru/debian-multimedia squeeze main non-free
       deb http://mirror.yandex.ru/debian-backports squeeze-backports main
    
    далее обновляемся и устанавливаем ключи подписи для репозитория http://www.debian-multimedia.org/
    
       aptitude update && aptitude -y install debian-multimedia-keyring && aptitude update
    
    Оттуда будем устанавливать более менее свежие lame и ffmpeg, необходимые для
    конвертации в openmeetings
    Ставим всякую мелочевку:
    
       apt-get install mc screen bash-completion dnsutils ntpdate
    
    Устанавливаем mysql, веб-администратор apache
    
       aptitude -y install  mysql-server phpmyadmin
    
    Редактируем конфиг mysql, добавляем в /etc/mysql/my.conf
    
       [mysqld]
       skip-character-set-client-handshake
       collation-server = utf8_unicode_ci
       init-connect = 'SET NAMES utf8'
       character-set-server = utf8
       [client]
       default-character-set = utf8
       [mysql]
       default-character-set = utf8
    
    Перезапускаем mysql
    
       /etc/init.d/mysql restart
    
    А после, запустим вот этот скрипт /usr/bin/mysql_secure_installation. Он будет
    задавать вопросы. Отвечаем так:
    
       Enter current password for root (enter for none): 
       жмём энтер, т.к. пароль пароль суперпользователя на mysql у нас пока пустой
       Set root password? [Y/n] y
       New password: вводим пароль суперпользователя на mysql
       Remove anonymous users? [Y/n] y
       Disallow root login remotely? [Y/n] y
       Remove test database and access to it? [Y/n] y
       Reload privilege tables now? [Y/n] y
    
    С помощью этого скрипта мы выполнили следующие действия: задали пароль для
    суперпользователя root, так как по умолчанию для него не установлен пароль;
    удалили анонимного пользователя, который создаётся только для тестовых целей;
    запретили пользователю root входить удалённо - теперь он сможет заходить только
    с localhost; удалили тестовую БД test и доступ к ней.
    
    Далее создаем необходимые базы:
    
       mysql -p
       CREATE DATABASE `openmeetings`;
       GRANT ALL PRIVILEGES ON openmeetings.* TO 'openmeetings'@'localhost' IDENTIFIED BY 'my_password' WITH GRANT OPTION;
    
    этим мы создаем базу openmeetings, пользователя openmeetings с паролем my_password
    
    Устанавливаем "безголовый" openoffice, java6, imagemagic, ghostscript, ffmeg,
    lame, mscorefonts и тд
    
       aptitude install texi2html unzip sun-java6-bin imagemagick ghostscript openoffice.org-core openoffice.org-base openoffice.org-writer openoffice.org-calc openoffice.org-impress openoffice.org-draw openoffice.org-math openoffice.org-filter-mobiledev openoffice.org-filter-binfilter ttf-mscorefonts-installer pstoedit libpaper-utils ttf-dejavu sox ffmpeg lame libart-2.0-2 sun-java6-bin sun-java6-jdk sun-java6-jre
    
    Для нормальной работы openmeetengs  нужен swftools. Тот, который доступен в
    репозитории не полон. Придется собрать руками. Устанавливаем swftools:
    
       wget http://www.swftools.org/swftools-0.9.2.tar.gz
       apt-get install libfreetype6 libfreetype6-dev libjpeg62 libjpeg62-dev libt1-dev \\
           libungif4-dev libavifile-0.7-dev libavifile-0.7c2
       ./configure && make clean && make && make install
    
    Выкачиваем OpenMeetings 2.2
    
       mkdir /opt/red5
       cd /opt/red5
       wget http://www.apache.org/dyn/closer.cgi/openmeetings/2.2.0/bin/apache-openmeetings-2.2.0.zip
       unzip  apache-openmeetings-2.2.0.zip
    
    После чего, находим файл
    /opt/red5/webapps/openmeetings/WEB-INF/classes/META-INF/mysql_persistence.xml. В
     нём нас интересует вот этот блок:
    
      , MaxActive=100
      , MaxWait=10000
      , TestOnBorrow=true
      , poolPreparedStatements=true
      , Username=root
      , Password="/>
    
    правим
    
      , Username=openmeetings
      , Password=my_password"/>
    
    
    После окончания редактирования файла, нужно переименовать mysql_persistence.xml
    в persistence.xml (заменить существующий  persistence.xml)
    
    создаем скрипты запуска red5, openoffice
    
       cd /etc/init.d/
    
    В /etc/init.d/red5 копируем 
    
       #! /bin/sh
       # red5 initscript
       set -e
       PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
       DESC="Red5 flash streaming server"
       NAME=red5
       DAEMON_HOME=/opt/red5
       DAEMON=$DAEMON_HOME/$NAME.sh
       PIDFILE=/var/run/$NAME.pid
       SCRIPTNAME=/etc/init.d/$NAME
       # Gracefully exit if the package has been removed.
       test -x $DAEMON || exit 0
       # Read config file if it is present.
       if [ -r /etc/default/$NAME ]
       then
          . /etc/default/$NAME
       fi
       # Function that starts the daemon/service.
       d_start() {
          start-stop-daemon --start --pidfile $PIDFILE --chdir $DAEMON_HOME --background --make-pidfile --exec $DAEMON
       }
       # Function that stops the daemon/service.
       d_stop() {
          start-stop-daemon --stop --quiet --pidfile $PIDFILE --name java
          rm -f $PIDFILE
       }
       case "$1" in
       start)
          echo -n "Starting $DESC: $NAME"
          d_start
          echo "."
          ;;
       stop)
          echo -n "Stopping $DESC: $NAME"
          d_stop
          echo "."
          ;;
       restart|force-reload)
          echo -n "Restarting $DESC: $NAME"
          d_stop
          sleep 1
          d_start
          echo "."
          ;;
       *)
       echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
       exit 1
       ;;
       esac
       exit 0
    
    Сохраняемся, выходим и создадим скрипт запуска для soffice-headless
    В /etc/init.d/soffice-headless копируем:
    
       #!/bin/bash
       # openoffice.org headless server script
       set -e
       PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
       DESC="OpenOffice.org headless server"
       NAME=soffice-headless
       DAEMON_HOME=/usr/lib/libreoffice/program
       DAEMON=$DAEMON_HOME/$NAME.sh
       PIDFILE=/var/run/$NAME.pid
       SCRIPTNAME=/etc/init.d/$NAME
       # Gracefully exit if the package has been removed.
       test -x $DAEMON || exit 0
       # Read config file if it is present.
       if [ -r /etc/default/$NAME ]
       then
          . /etc/default/$NAME
       fi
       # Function that starts the daemon/service.
       d_start() {
          start-stop-daemon --start --pidfile "${PIDFILE}" --chdir "${DAEMON_HOME}" --background --make-pidfile --exec $DAEMON
       }
       # Function that stops the daemon/service.
       d_stop() {
          start-stop-daemon --stop --quiet --pidfile "${PIDFILE}" --name java
          rm -f "${PIDFILE}"
       }
       case "$1" in
       start)
          echo -n "Starting $DESC: $NAME"
          d_start
          echo "."
          ;;
       stop)
          echo -n "Stopping $DESC: $NAME"
          d_stop
          echo "."
          ;;
       restart|force-reload)
          echo -n "Restarting $DESC: $NAME"
          d_stop
          sleep 1
          d_start
          echo "."
          ;;
       *)
       echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
       exit 1
       ;;
       esac
       exit 0
    
    Сохраняемся, выходим, делаем скрипты исполняемыми и устанавливаем их в автозапуск
    
       chmod 755 /etc/init.d/red5 && update-rc.d red5 defaults && chmod 755 /etc/init.d/soffice-headless && update-rc.d soffice-headless defaults
    
    Для запуска openoffice создадим еще один скрипт:
    
    В /usr/lib/libreoffice/program/soffice-headless.sh копируем:
    
       #!/bin/bash
       # openoffice.org headless server script
       #
       unset DISPLAY
       /usr/lib/libreoffice/program/soffice "-accept=socket,host=localhost,port=8100;urp;StarOffice.ServiceManager" -nologo -headless -nofirststartwizard
    
    Сохраняемся, выходим и делаем его исполняемым
    
       chmod 755 /usr/lib/libreoffice/program/soffice-headless.sh
    
    Проверяем работоспособность скрипта "безголового"; офиса. Запускаем его:
    
       /etc/init.d/soffice-headless
    
    вбиваем:
    
       netstat -an | grep 8100
    
    Должны увидеть:
    
       tcp 0 0 127.0.0.1:8100 0.0.0.0:* LISTEN
    
    Далее, скачиваем jConnector со страницы http://www.mysql.com/downloads/connector/j/
    
    Он нужен openmeetings для подключения к базе mysql. Распаковываем содержимое
    скачанного архива mysql-connector-java-5.1.22.zip (на момент написания статьи).
    В нём нас интересует лишь файл mysql-connector-java-5.1.22-bin.jar. Его надо
    поместить в каталог /opt/red5/webapps/openmeetings/WEB-INF/lib.
    
    Дальше надо скачать JODConverter - http://code.google.com/p/jodconverter/downloads/list
    
    JODConverter нужен для конвертирования офисных файлов в pdf для отображения на
    доске. Содержимое архива jodconverter-core-3.0-beta-4-dist.zip (на момент
    написания статьи) копируем в каталог /opt/openmeetings/webapps/openmeetings/jodcoverter.
    
    Далее, есть ещё одна тонкость: в коде jodconverter жестко прописаны пути, и он
    будет искать опенофис в каталоге /opt/openoffice.org3.
    
    Поэтому, чтобы он таки его мог увидеть, делаем вот такую символическую ссылку:
    
       ln -s /usr/lib/libreoffice /opt/openoffice.org3
    
    Переходим в каталог /opt/red5 и выполняем команду:
    
       cd /opt/red5
       ./red5.sh
    
    Не нужно дожидаться её завершения. И вообще, лучше эту команду выполнить в
    отдельно открытой консоли. Эта команда запустит openmeeting. Его окончательную
    установку необходимо сделать уже через web-интерфейс. Открываем браузер,
    переходим по адресу:
    
    http://your_ip:5080/openmeetings/install
    
    На страничке инсталяции обратим внимание на поле "JOD Path". В нём надо указать
    путь к директории lib нашего джобконвертера:
    /opt/red5/webapps/openmeetings/jodcoverter/lib. В поля имя и пароль вбивается
    имя и пароль администратора системы. В поля imagemagick_path, sox_path,
    ffmpeg_path   пишем /usr/bin. Поле swftools_path - /usr/local/bin. Остальные
    поля на своё усмотрение можно заполнить, после чего жмём внизу кнопку
    "INSTALL". Система призадумается на некоторое время. Через некоторое время (у
    меня заняло около 5 минут) система сообщит что все ОК и можно начинать работу.
    
    Есть один нюанс: при изменении данных пользователя нужно каждый раз ОБЯЗАТЕЛЬНО
    вбивать пароль. Иначе пользователь окажется без пароля и вход в систему станет невозможен.
    
    
    На этом все, можно перезагрузить систему и начинать пользоваться. Удачи.
    
    Примечание: Сервер имеет статический IP. Сразу оговорюсь: ссылки на установку
    пакетов дергал из других статей (указаны ниже) по этому можно наблюдать
    некоторые несоответствия с версиями LibreOffice. В debian 7.4 уже был
    установлен LibreOffice (на него и настроены скрипты в статье). Если кому то
    захочется разобраться - разбирайтесь и не устанавливайте лишнего.  Система сама
    не стала ставить OpenOffice при наличии установленного LibreOffice.  Начнем:
    
    
    Статьи которыми я пользовался для написания:
    * http://www.openkazan.info/http:/%252Fmy-ubuntu-land.blogspot.com/2011/03/openmeetings-161-debian-6-squeeze.html
    * http://technotrance.su/index.php/moi-stati/linux-fedora/item/21-openmeetings2
    
     
    ----* Аватар в Gajim без сжатия   Автор: Мороз Сергей  [комментарии]
     
    В jabber-клиенте Gajim есть одна неприятная особенность. Когда вы хотите
    разместить свою фотографию или аватар в дополнительной информации (vcard), вы
    непременно столкнётесь с тем, что фотография, которую вы загрузили, вдруг
    окажется меньшего размера чем оригинал, более того, в 99% случаев на этой
    фотографии не будет видно даже вашего лица из-за слишком маленького разрешения.
    То есть Gajim в целях экономии вашего трафика и трафика того, кто будет
    просматривать vcard, уменьшает вашу фотографию, так же он это делает по причине
    того, что слишком большие фотографии jabber-серверы просто не принимают. И
    потом, я всегда предпочитал подготовить фотографию вручную самостоятельно, и
    крайне был не доволен тем, что Gajim делает сжатие даже без предупреждения. Но
    оказалось, что сжатие можно отключить или сделать его более щадящим.
    
    Заходим в директорию /usr/share/gajim/src как администратор (в терминале: sudo
    nautilus /usr/share/gajim/src) и находим там файл profile_window.py, открываем
    его в своем текстовом редакторе и ищем 112 и 127 строки кода (это если у вас
    Gajim версии 0.13.4) или 115 и 130 строчки кода (если у вас Gajim 0.14):
    
       if not invalid_file and filesize > 16384: # 16 kb
       if filesize > 16384:
    
    В обоих строках мы видим одно и то же число 16384, это и есть ни что иное, как
    размер фотографии/аватара в байтах. Чтобы Gajim не производил сжатие просто
    увеличите эту цифру в обоих строчках. Я добавил два нуля и получилось вот так:
    
    
       if not invalid_file and filesize > 1638400: # 16 kb
       if filesize > 1638400:
    
    И всё, сохраните значение и перезагрузите клиент, после этого можете загружать
    свои любимые аватары и фотографии в нужном размере.
    
    Таким образом, любая добавленная фотография, не будет обрезаться или сжиматься,
    потому что размер 1638400 гораздо больше, чем вам позволит jabber сервер
    загрузить, по крайней мере так на jabber.ru и наверняка на большинстве других
    jabber серверах. Рекомендую нужную фотографию, например сделанную
    фотоаппаратом, просто сжать, в любой удобной программе, например в Gimp. Обычно
    фотографии под 50 кб вполне нормально подходят для vcard, однако помните ещё и
    то, что если вы любите посещать Jabber-конференции, где множество абонентов
    сидят с мобильных телефонов, то велика вероятность, что крупные фотографии, они
    не смогут просмотреть, по причине ограничения, которое может быть установлено в
    мобильных клиентах.
    
     
    ----* psi: контакт-лист и сообщения в одном окне (доп. ссылка 1)   Автор: Соколов Алексей  [комментарии]
     
    Jabber-клиент psi может выглядеть как tkabber (список контактов и сообщения в одном окне).
    Для пользователей FreeBSD шаги будут выглядеть следующим образом:
    
       cd /usr/ports/net-im/psi && make extract
       cd work/psi-0.12
       fetch http://psi-dev.googlecode.com/svn/trunk/patches/psi-all_in_one_window.patch
       cat psi-all_in_one_window.patch | patch -p1
       cd ../../ && make install clean
    
     
    ----* Установка и настройка JUD для Jabberd2 под FreeBSD 6.1 (доп. ссылка 1)   Автор: protonix  [обсудить]
     
    0. Создание пользователя jabber из группы jabber
    
       #adduser
    
    1. Установка Jabber думую не вызывает проблем - в портах /usr/ports/net-im/jabberd 
    
       #make install clean
    
    2. Настройка
    
    Можно ниче не менять и оставить все поумолчанию,но желательно изменить в файлах 
       /usr/local/etc/jabberd/sm.xml 
       /usr/local/etc/jabberd/c2s.xml
    
    Если сервер будет не только для локальной сети, а со связью с глобальными, то также меняем в
       /usr/local/etc/jabberd/s2s.xml
       /usr/local/etc/jabberd/resolver.xml
    
    Если нет то можно закоментить в jabber.cfg эти части
    меняем имя сервера, и пароль (хотя можно и не менять)
    id имя сервера - это то что после @ =) может быть любое (по умолчанию localhost)
    user имя для router.xml (jabberd)
    pass пароль тоже для router.xml (secret)
    
    Еще проблемы были с паролем в файле router-users.xml - если везде поменяли, то и здесь не забудьте
    
    3. Настройка БД
    
    по умолчанию используется MySQL, ниче менять не будем.
    заходим под рутом в MySQL и запускаем скрипт (должны находиться в папке со
    скриптом /usr/local/share/jabberd)
    
       mysql -u root -p
       mysql>\. db-setup.mysql
    
    добавляем пользователя (jabberd2) БД и пароль (secret) к нему
    
       GRANT select,insert,delete,update ON jabberd2.* to jabberd2@localhost IDENTIFIED by 'secret';
    
    если изменили, не забудьте изменить и в sm.xml
    
    на всякий случай делаем ссылку
       ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock 
    
    
    Попробуйте запустить - заходим под jabber и набираем
       >jabberd
    
    В /var/logs/messages смотрим результат - должно быть реди 
    если не запустился,то гдето косяк,запускаем в отладочном режиме
       >jabberd -D
    
    смотрим на чем сервер умирает и исправляем
    
    4. Установка users-agent
    
       /usr/ports/net-im/jabber-users-agent 
       #make install clean
    
    5. Настройка users-agent
    
    в /usr/local/etc/ опять изменяем конфиг имя,пароль,имя БД(jud),пароль БД(jud)
    
    6. Настройка БД
    
    можно наверно запустить скрипт,но говорят он не работает,поэтому пишем сами
    
       CREATE DATABASE JUD;
       GRANT ALL PRIVILEGES ON JUD.* to jud@localhost IDENTIFIED BY 'jud';
       CREATE TABLE JUD.jud (jid VARCHAR(100) PRIMARY KEY, name VARCHAR(100),
                           first VARCHAR(50), last VARCHAR(50),nick VARCHAR(50),
                           email VARCHAR(50), INDEX ind_name (name), INDEX ind_first (first),
                           INDEX ind_last (last), INDEX ind_nick (nick),
                           INDEX ind_email (email));
    
    7. Все запускаем из под пользователя jabber - сначала сам джаббер-сервер
    
       >jabberd 
    
    можно в фоновом режиме с параметром -B
    Потом users-agent
    
    в папке /usr/local/lib/jabber/users-agent
    
       >./users-agent
    
    Все проверяйте в PSI - создавать аккаунты и пытаться найти себя=)
    
    Какие были у меня проблемы:
    
    Читал всякие вики и ртфм и запутался=) :
    
    а)Проблемы с правами доступа, так как запускать можно только от 
    пользователя Jabber,не забудьте для конфигов поставить права доступа
    
    б)Исправление файла router-users.xml - нигде вроде не встречал, поэтому и не исправлял
    
    в)Устанавливать надо jabber-users-agent, а не jabber-JUD =)
    
    г)Перловский скрипт запускается с ./ =)
    
    д)Если был до другой джаббер сервер все сносите деинсталом и подчищайте вручную
    
    Вообщето все лежит на 
    http://jabberd.jabberstudio.org/2/docs/jabberd_guide.html 
    
    но там много и на английском.И еще помогло 
    http://ru.gentoo-wiki.comНастройка_JUD_на_сервере_Jabberd_версии_2.x
    
     
    ----* Используем BitMessage через IMAP/SMTP (доп. ссылка 1) (доп. ссылка 2)   Автор: ukubuku  [комментарии]
     
    Инструкция по использованию BitMessage в любом почтовом клиенте
    (Thunderbird/Apple Mail/etc). BitMessage представляет собой децентрализованную
    P2P-сеть, использующую похожие на Bitcoin принципы построения распределённой
    шифрованной цепочки блоков, но вместо хранения информации о денежных
    транзакциях, ориентированную на пересылку сообщений.
    
    
    Устанавливаем Docker и создаём раздел для данных:
    
         $ docker volume create bm-data
    
    Создаём контейнер, в котором запускаем образ
    https://hub.docker.com/r/yshurik/bitmessage (https://github.com/yshurik/docker-bitmessage)
    
         $ docker run -v bm-data:/data -d --name bm -p 8444:8444 -p 127.0.0.1:25:2525 -p 127.0.0.1:143:143 --restart=unless-stopped yshurik/bitmessage:latest
    
    IMAP/SMTP открыт только для localhost
    
    
    Настраиваем Thunderbird.
    
    Для старта выбираем адрес bm@bitmessage
    
    Подключаемся по IMAP к localhost, выбрав сетевой порт 143. 
    Security: none, Authentication: plain password. Имя пользователя bm, пароль тоже bm
    
    SMTP тоже localhost, порт 25, security: none
    
    Подключаемся, видим welcome email, забираем собственный BM адрес, меняем адрес
    аккаунта на него в формате BM-address@bitmessage. Таким же форматом ведём
    адресную книгу. Если были старые адреса из PyBitmessage, импортируем, смотри ссылку.
    
     

       Мобильные телефоны

    ----* Linux окружение noroot в Android-смартфоне собственными руками. (доп. ссылка 1)   Автор: Павел Оредиез  [комментарии]
     
    В этой заметке я расскажу как собрать своё Linux-окружение на Android-смартфоне
    без прав root (рутовать телефон не надо). Можно конечно взять готовые решения в
    Google Play Store, но можно и пройти этот путь самостоятельно.
    
    Если вы решите повторить мой опыт, то вы получите Xfce4-окружение с псевдо
    пользователем root на своём мобильном телефоне с Android. Работает это почти
    без отличий от реального пользователя root, только конечно модифицировать сам
    телефон это возможности не даёт. Итак приступим.
    
    Termux
    
    Установим в Android приложение Termux (требуется Android версии 7 или выше).
    Это наше базовое Linux окружение и отправная точка. Запуская его мы попадаем в
    шелл с домашним каталогом, который будем называть TERMUX_HOME.
    
    Итак в TERMUX_HOME установим требуемые нам начальные пакеты:
    
       pkg install root-repo
       pkg install proot
       pkg install debootstrap
       pkg install nano
       pkg install wget
       pkg install man
    
    Debootstrap
    
    Теперь можно устанавливать Linux окружение.
    Проверим нашу архитектуру.
    
       uname -ar
       Linux localhost 4.9.193-perf-gc285628 #1 SMP PREEMT Fri Aug 6 02:12:50 CST 2021 aarch64 Android
    
    Моя архитектура 64-битная, значит --arch=arm64. Если у вас архитектура
    32-битная, то ваш вариант --arch=armhf
    
    В TERMUX_HOME:
    
       mkdir ./chroot
       debootstrap --arch=arm64 bullseye ./chroot http://mirror.yandex.ru/debian
       mkdir ./chroot/system
       mkdir ./chroot/apex
       mkdir ./chroot/home/user
    
    Вот мы получили базовое окружение. Правда dpkg configure отработает наверное с
    некоторыми ошибками, но войти в окружение уже можно. Ошибки мы разберём позже.
    
    Вход в Linux окружение
    
    Вход под псевдо рутом нам позволяет команда proot, которую мы установили ранее.
    В TEMUX_HOME создадим скрипт входа start.sh:
    
       #!/data/data/com.termux/files/usr/bin/sh
       unset LD_PRELOAD
       proot \
         -0 \
         --link2symlink \
         -w /root \
         -r ./chroot \
         -b /sys/ \
         -b /system \
         -b /apex \
         -b /proc/ \
         -b /dev/ \
         -b /dev/pts/ \
         /usr/bin/env \
           -i \
           HOME=/root \
           LD_LIBRARY_PATH=/system/lib64:/system/apex/com.android.runtime.release/lib64 \
           XDG_RUNTIME_DIR=/tmp \
           DISPLAY=127.0.0.1:0 \
           PULSE_SERVER=tcp:127.0.0.1:4713 \
           TERM="xterm-256color" \
           PATH=/bin:/usr/bin:/sbin:/usr/sbin \
           /bin/bash --login
    
    Для входа не под root (опционально) создайте скрипт входа ustart.sh:
    
       #!/data/data/com.termux/files/usr/bin/sh
       unset LD_PRELOAD
       proot \
         --link2symlink \
         -w /root \
         -r ./chroot \
         -b /sys/ \
         -b /system \
         -b /apex \
         -b /proc/ \
         -b /dev/ \
         -b /dev/pts/ \
         /usr/bin/env \
           -i \
           HOME=/home/user \
           LD_LIBRARY_PATH=/system/lib64:/system/apex/com.android.runtime.release/lib64 \
           XDG_RUNTIME_DIR=/tmp \
           DISPLAY=127.0.0.1:0 \
           PULSE_SERVER=tcp:127.0.0.1:4713 \
           TERM="xterm-256color" \
           PATH=/bin:/usr/bin:/sbin:/usr/sbin \
           /bin/bash --login
    
    Для 32-битного окружение поправьте LD_LIBRARY_PATH
    
    Сделаем скрипты исполняемыми:
    
       chmod a+x start.sh
       chmod a+x ustart.sh
    
    Теперь можно войти в окружение:
    
       ./start.sh
       root@localhost:~#
    
    Вот мы и псевдо root :).
    Назовём это ENV_HOME.
    
    Ошибки dpkg
    
    Ошибки dpkg в основном у меня были связаны с неправильной работой 
    утилиты adduser при добавлении системных пользователей. Поэтому чтобы избежать
    их сразу дополним файлы (в ENV_HOME)
    
    /etc/passwd:
    
       systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
       systemd-network:x:101:103:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
       systemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
       _apt:x:103:65534::/nonexistent:/usr/sbin/nologin
       messagebus:x:104:110::/nonexistent:/usr/sbin/nologin
       statd:x:106:65534::/var/lib/nfs:/usr/sbin/nologin
       avahi:x:108:113:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/usr/sbin/nologin
       systemd-coredump:x:996:996:systemd Core Dumper:/:/usr/sbin/nologin
       user:x:10264:10264:User:/home/user:/bin.bash
    
    /etc/group:
    
       systemd-journal:x:101:
       systemd-timesync:x:102:
       systemd-network:x:103:
       systemd-resolve:x:104:
       netdev:x:109:pi
       messagebus:x:110:
       avahi:x:113:
       systemd-coredump:x:996:
       user:x:10264:
    
    Здесь id 10264 это id моего пользователь в TERMUX_HOME. У вас может быть другое число.
    
    Второй хук для неисправных пакетов заключается в убирании скриптов конфигурирования (в ENV_HOME):
    
       mv /var/lib/dpkg/info/<package>* /tmp/
    
    Установка остальных пакетов
    
    В ENV_HOME выполним
    
       apt install xfce4 dbus-x11
    
    Мы готовы запустить графическую оболочку, для этого нам нужен X сервер.
    
    X сервер
    
    В Android установите приложение XServer XSDL. Этот сервер имеет также
    звуковую pulseaudio подсистему. Ранее в скриптах входа в окружение в команде
    proot мы передали переменные DISPLAY и PULSE_SERVER, так что у нас все готово
    для запуска (в ENV_HOME):
    
       xfce4-session
    
    Должна запуститься графическая оболочка, звук тоже должен работать (звуковой
    вход не поддерживается только воспроизведение).
    Xserver XSDL может показаться сначала не очень красивым, но он хорошо
    функционален и красоты можно добиться. Мои параметры:
    ориентация портретная, разрешение нативное, дурацкие кнопки alt-shift-чего-то
    скрыты (они у меня всё равно не работают или я не понял как), мышь в режиме
    телефон-тачпад. Можно еще попробовать поиграться с xrandr если поддерживается
    для использования виртуального пространства X сервера, я не пробовал.
    
    Библиотеки Android
    
    В аргументах команды proot мы пробросили в окружение Android каталоги /system и /apex.
    
    Так что нам доступны Android библитеки /system/lib /system/lib64.
    Например мне нужно было чтобы правильно отрабатывала команда
    
       ldd /system/lib64/libOpenSLES.so
    
    (не должно быть "not found").
    
    Если ldd отрабатывает неправильно, то обратите внимание, библиотеки в
    /system/lib* могут быть симлинками на другие места. Возможно надо подбиндить
    другие каталоги Android и(или) поправить LD_LIBRARY_PATH.
    
    Благодарности
    
    Выражаю свою благодарность Sergii Pylypenko (pelya) за его труд - автору проектов 
    XServer XSDL, pulseaudio-android, xserver-xsdl, Debian noroot. У
    него я подсмотрел многое.
    
     
    ----* Создание сборки Android 10 для Raspberry Pi 4 (доп. ссылка 1)   [комментарии]
     
    Инструкция по созданию своей сборки Android 10 для Raspberry Pi 4 в Ubuntu/Debian.
    
    Загружаем исходные тексты Android:
    
       repo init -u https://android.googlesource.com/platform/manifest -b android-10.0.0_r41
       git clone https://github.com/android-rpi/local_manifests .repo/local_manifests -b arpi-10
       repo sync
    
    
    Собираем ядро Linux
    
       sudo apt install gcc-arm-linux-gnueabihf libssl-dev
       cd kernel/arpi
       ARCH=arm scripts/kconfig/merge_config.sh arch/arm/configs/bcm2711_defconfig kernel/configs/android-base.config kernel/configs/android-recommended.config
       ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make zImage
       ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make dtbs
    
    Устанавливаем python-модуль mako:
    
      sudo apt install python-mako
    
    Вносим несколько исправлений в файлы:
    
    Настраиваем использование GuidedActionEditText для ввода пароля в TvSettings
    
       Settings/res/layout/setup_password_item.xml
       @@ line 35
       -   <EditText
       +   <androidx.leanback.widget.GuidedActionEditText
               android:id="@+id/guidedactions_item_title"
               style="@style/Setup.Action.TextInput"
               android:layout_width="match_parent"
               android:layout_height="match_parent"
               android:focusable="true"
               android:gravity="center_vertical"
               android:imeOptions="actionNext|flagNoExtractUi"
       +       android:inputType="text" />
       -       android:inputType="text">
       -   </EditText>
    
    Включаем программный декодировщик видео
    
       media/libstagefright/colorconversion/SoftwareRenderer.cpp
       @@ line 128 @@ void SoftwareRenderer::resetFormatIfChanged(
            case OMX_COLOR_FormatYUV420Planar:
       +        {
       +            halFormat = HAL_PIXEL_FORMAT_RGBA_8888;
       +            bufWidth = (mCropWidth + 1) & ~1;
       +            bufHeight = (mCropHeight + 1) & ~1;
       +            break;
       +        }
            case OMX_COLOR_FormatYUV420SemiPlanar:
       @@ line 182
                CHECK(mConverter->isValid());
       +    } else if (halFormat == HAL_PIXEL_FORMAT_RGBA_8888 &&
       +            mColorFormat == OMX_COLOR_FormatYUV420Planar) {
       +        mConverter = new ColorConverter(
       +                mColorFormat, OMX_COLOR_Format32BitRGBA8888);
       +        CHECK(mConverter->isValid());
            }
    
       media/codec2/vndk/C2Store.cpp
       @@ line 851 @@ C2PlatformComponentStore::C2PlatformComponentStore()
            //emplace("libcodec2_soft_av1dec_aom.so"); // deprecated for the gav1 implementation
       -    emplace("libcodec2_soft_av1dec_gav1.so");
       -    emplace("libcodec2_soft_avcdec.so");
            emplace("libcodec2_soft_avcenc.so");
       @@ line 873
            emplace("libcodec2_soft_vp8enc.so");
       -    emplace("libcodec2_soft_vp9dec.so");
            emplace("libcodec2_soft_vp9enc.so");
    
    Собираем код Android:
    
    
       source build/envsetup.sh
       lunch rpi4-eng
       make ramdisk systemimage vendorimage
    
    Подготавливаем SD-карту для записи собранного образа. Разбивка разделов должна
    выглядеть примерно так:
    
    p1 128MB для /boot: в fdisk выбираем раздел с типом W95 FAT32(LBA) и делаем его
    загрузочным, далее запускаем mkfs.vfat
    
    p2 768MB для /system: в fdisk создаём новый первичный раздел
    
    p3 128MB для /vendor: в fdisk создаём новый первичный раздел
    
    p4 оставшееся место выделяем для /data: в fdisk создаём новый первичный раздел
    и запускаем mkfs.ext4. Устанавливаем метку userdata на раздел /data, используя
    опцию "-L" при выполнении mkfs.ext4.
     
    Записываем подготовленные образы в разделы /system и /vendor (вместо <p2> и
    <p3> подставляем созданные имена устройств разделов):
    
        cd out/target/product/rpi4
        sudo dd if=system.img of=/dev/<p2> bs=1M
        sudo dd if=vendor.img of=/dev/<p3> bs=1M
    
    Копируем ядро и образ ram-диска на загрузочный раздел.
    Содержимое device/arpi/rpi4/boot/ копируем в корень раздела <p1>, туда же
    копируем файлы kernel/arpi/arch/arm/boot/zImage,
    out/target/product/rpi4/ramdisk.im и
    kernel/arpi/arch/arm/boot/dts/bcm2711-rpi-4-b.dtb. Файл
    kernel/arpi/arch/arm/boot/dts/overlays/vc4-kms-v3d-pi4.dtbo  копируем в каталог /overlays/
    
     
    ----* Установка Anbox для запуска Android-приложений в Fedora 30 (доп. ссылка 1)   [комментарии]
     
    Anbox представляет собой окружение, позволяющее запустить полноценную
    мобильную среду Android в обычном дистрибутиве Linux, тесно интегрированную с
    основным рабочим столом. Краткая инструкция по установке Anbox в Fedora 30:
    
    Устанавливливаем DKMS и средства для сборки модулей ядра:
    
       sudo dnf install dkms
       sudo dnf install kernel-devel
    
    Загружаем свежий срез кода Anbox и собираем модули ядра с ashmem и binder:
    
       cd ~
       git clone https://github.com/anbox/anbox-modules
       cd anbox-modules
       sudo cp anbox.conf /etc/modules-load.d/
       sudo cp 99-anbox.rules /lib/udev/rules.d/
       sudo cp -rT ashmem /usr/src/anbox-ashmem-1
       sudo cp -rT binder /usr/src/anbox-binder-1
       sudo dkms install anbox-ashmem/1
       sudo dkms install anbox-binder/1
       sudo modprobe ashmem_linux
       sudo modprobe binder_linux
    
    Устанавливаем snapd для установки поддерживаемого разработчиками
    самодостаточного пакета с окружением Anbox в формате snap:
    
       sudo dnf install snapd
       sudo ln -s /var/lib/snapd/snap /snap
    
    Устанавливаем окружение Anbox
    
       snap install --devmode --beta anbox
    
    В дальнейшем для обновления окружения выполняем:
    
      snap refresh --beta --devmode anbox
    
    Настраиваем SELinux, который мешает запуску Anbox. 
    
       sudo ausearch -c servicemanager --raw
       sudo semodule -X 300 -i my-servicemanager.pp
       sudo ausearch -c anboxd --raw
       sudo semodule -X 300 -i my-anboxd.pp
       sudo ausearch -c gatekeeperd --raw
       sudo semodule -X 300 -i my-gatekeeperd.pp
    
    Перезагружаем систему и пробуем запустить anbox.
    
    Для установки Android-программ в окружение Anbox ставим adb и выполняем:
    
       adb install filename.apk 
    
     
    ----* Запуск Android-приложений в окружении Chrome OS или в браузере Chrome (доп. ссылка 1)   [комментарии]
     
    Компания Google начала тестирование функции запуска Android-приложений в
    Chrome OS. В настоящее время доступно лишь несколько Android-программ,
    предлагаемых для использования в Chrome OS. Данное ограничение является
    искусственным, поэтому энтузиасты
    нашли способ обойти ограничение и организовать выполнение разнообразных
    Android-приложений, включая Skype, Pandora, Opera Mini, Flipboard.
    
    Более того, так как Android-окружение формируется в web-браузере с
    использованием технологии Native Client, то имеется возможность организовать
    запуск Android-программ в обычном браузере Сhrome для Linux, Windows или OS X.
    
    
    Chrome OS
    
    Для обхода ограничения в Chrome OS подготовлена утилита, раскрывающая apk-пакет
    любой программы и маскирующая его под одно из официальных тестовых приложений.
    
    Инструкция по установке:
    
    Устанавливаем в Chrome OS любое официальное демонстрационное Android-приложение
    из Chrome Store. Данная операция требуется для установки runtime-компонентов Android.
    
    Протестируем работу Android-приложения для того чтобы убедиться, что Android
    runtime в данной системе работает корректно.
    
    На другом компьютере с Ubuntu установим Node.js и приложение chromeos-apk для
    распаковки apk-пакетов:
    
       sudo add-apt-repository ppa:chris-lea/node.js
       sudo apt-get update
       sudo apt-get install nodejs
       npm install chromeos-apk -g
    
    Загрузим на ПК с Ubuntu интересующий нас apk-пакет и распакуем его при помощи
    утилиты chromeos-apk. Например:
    
       chromeos-apk com.soundcloud.android.apk
    
    или для планшета
    
       chromeos-apk com.soundcloud.android.apk --tablet
    
    В итоге будет создана директория  com.soundcloud.android, которую следует
    перенести на устройство с Chrome OS.
    
    В браузере Chrome OS включаем режим разработчика ("Developer mode") в разделе
    chrome://extensions и загружаем содержимое скопированной директории через
    кнопку  "Load unpacked extension".
    
    После этого установленная программа станет доступна для запуска.
    
    При необходимости установки нескольких программ, для каждой новой программы
    следует изменить значение  "key" в файла manifest.json, в расположенной внутри
    распакованной из apk-пакета директории на одно из значений, применяемых в
    демонстрационных программах.
    
    Дополнение: обойти ограничение по числу установленных программ и избавиться от
    правки ключа можно установив модифицированный runtime - ARChon (инструкция ниже).
    
    Chrome
    
    Загружаем со страницы http://bitbucket.org/vladikoff/archon/downloads
    модифицированный Android Runtime - ARChon. Поддерживается Chrome 37 и более
    новые выпуски.
    
       wget https://bitbucket.org/vladikoff/archon/get/v1.0.zip
       unzip v1.0.zip
    
    Следуя предыдущему описанию устанавливаем утилиту chromeos-apk  и активируем
    режим разработчика в Chrome. Далее через интерфейс chrome://extensions
    загружаем содержимое разархивированной директории нажав кнопку "Load unpacked extension".
    
    Для установки Android-приложения загружаем apk-файл и распаковываем его
    утилитой chromeos-apk  с опцией "--archon":
    
       chromeos-apk com.imdb.mobile.apk --archon
    
    Загружаем программу через  "Load unpacked extension" в chrome://extensions.
    
    Для изменения активного разрешения экрана в файлах gen_main.min.js и
    gen_index.min.js из архива ARChon находим и правим на своё усмотрение строку
     
       tablet: {"long": 1280, "short": 800}
    
    Можно распаковать и поправить настройки пакета вручную, без установки утилиты
    chromeos-apk. Для этого извлекаем из apk-архива директорию _template, сохранив
    её под полным именем приложения, например "com.soundcloud.android". Помещаем
    apk-файл в директорию com.soundcloud.android/vendor/chromium/crx. Изменяем в
    manifest.json ссылку на apk-файл. Там же правим параметры formFactor (phone или
    tablet) и orientation (landscape или portrait). При использовании ARChon
    runtime удаляем из manifest.json параметр "key".
    
     
    ----* Осуществление ОGSM/SMS/USSD вызовов с использованием утилиты mdbus   Автор: Дмитрий Попов  [комментарии]
     
    На сервере используем Gentoo Linux, к которому через USB-порт подключен телефон
    Neo Freerunner (Openmoko + SHR).
      
    1. Убедимся, что ядро Linux собрано с опцией "Ethernet over USB". При
    выполнении dmesg будет выведены примерно такие сообщения:
    
       [ 3167.874749] udev[1339]: renamed network interface eth2 to eth4
       [ 3187.500221] cdc_ether 4-2:1.0: eth4: unregister 'cdc_ether' usb-0000:00:1d.2-2, CDC Ethernet Device
       eth4      Link encap:Ethernet  HWaddr 00:1f:11:01:43:af
              inet addr:192.168.7.14  Bcast:192.168.7.255  Mask:255.255.255.0
       ...
    
    2. Ставим Apache и PHP, включая PHP-расширение SSH2, которое в дальнейшем пригодится.
    
    3. Выбираем телефон на который можно поставить дистрибутив SHR
    (http://www.shr-project.org), в состав которого входит полезная консольная
    утилита mdbus2. В качестве телефона задействован Neo Freerunner, но подойдут и
    другие аппараты, поддерживаемые в SHR (Nokia N900, Palm Pre, Pre Plus, Pre
    2, HTC Desire, HTC Dream, HTC HD2, iPhone3G, Nexus One и т.п.)
    
    4. Заливаем с Linux-машины на телефон прошивку:
    
       dfu-util -d 1d50:5119 -a u-boot -R -D qi-ubi-s3c2442.udfu
       dfu-util -d 1d50:5119 -a kernel -R -D uImage-2.6.39-r6-oe16-om-gta02-20111217193821.bin
       dfu-util -d 1d50:5119  -a rootfs -R -D shr-image-om-gta02.ubi
    
    5. Настраиваем соединение:
     
       # cat /etc/hosts | grep 192
       192.168.7.2     neo
    
       # ssh neo
    
       root@om-gta02:~# ifconfig  usb0
    
       usb0      Link encap:Ethernet  HWaddr 00:1F:11:01:43:AE
              inet addr:192.168.7.2  Bcast:192.168.7.255  Mask:255.255.255.0
       ...
    
    6. Далее открываем консольную утилиту mdbus для диагностики и обмена данными.
    Нам потребуются сервисы USSD, SMS и VOICE.
    
    USSD вызов:
    
       ssh neo  "mdbus2 -s org.freesmartphone.ogsmd /org/freesmartphone/GSM/Device org.freesmartphone.GSM.Network.SendUssdRequest '*102#'
    
    VOICE вызов:
    
       ssh root@neo  "mdbus2 -s org.freesmartphone.ogsmd /org/freesmartphone/GSM/Device org.freesmartphone.GSM.Call.Initiate '+790XXXXXXX' 'voice'"
    
    SMS вызов:
    
       ssh neo "mdbus2 -s org.freesmartphone.ogsmd /org/freesmartphone/GSM/Device org.freesmartphone.GSM.SMS.SendTextMessage  '+7903XXXXXXX' 'Hello world' '1'"
    
    Ссылки по которым можно разобраться в работе mdbus:
    
       http://wiki.openmoko.org/wiki/OpenmokoFramework/mdbus
       http://docs.freesmartphone.org/
    
    
    7. Создаём PHP-скрипт для выполнения звонка с использованием библиотеки SSH2:
    
       <?php
       $connection = ssh2_connect('neo', 22);
    
       if (ssh2_auth_password($connection, 'root', '')) {
          echo "Authentication Successful!\\n";
       } else {
          die('Authentication Failed...');
       }
       $shell = ssh2_shell($connection,"bash");
    
       $stream = ssh2_exec($connection, 'mdbus2 -s org.freesmartphone.ogsmd /org/freesmartphone/GSM/Device org.freesmartphone.GSM.Call.Initiate \\'+7903XXXXXXX\\' \\'voice\\'');
    
       echo " SetMicrophoneMuted = 1 \\n ";
    
       $stream1 = ssh2_exec($connection, 'mdbus2  -s org.freesmartphone.frameworkd /org/freesmartphone/GSM/Device org.freesmartphone.GSM.Device.SetMicrophoneMuted \\'1\\'');
    
      echo "$stream";
      echo "calling to +7903xxxxxxx (POPOV DMITRY)";
    
      echo " Sleep 10 sec  \\n ";
    
      sleep(20);
    
      echo " Release GSM call  \\n ";
    
      $stream2=ssh2_exec($connection, 'mdbus2 -s org.freesmartphone.ogsmd /org/freesmartphone/GSM/Device org.freesmartphone.GSM.Call.ReleaseAll');
    
      $output = stream_get_contents($stream);
    
       echo "$output";
       ?>
    
     
    ----* Синхронизация содержимого телефона и Evolution на Linux ПК при помощи SyncML   Автор: write2net  [комментарии]
     
    В статье описывается способ синхронизации по USB-кабелю (технология SyncML,
    протоколы TCP/IP и HTTP)  календаря, задач, заметок и контактов мобильного
    телефона с компьютером. На компьютере установлена операционная система Linux
    (Debian/Ubuntu) и клиент пакета совместной работы Evolution.
    
    Рассматриваемый в качестве примера гаджет от Sony Ericsson представляет
    собой аппарат начального уровня, не является смартфоном, использует собственную
    закрытую программную платформу, а среди прочих сетевых функций поддерживает
    SyncML и имеет функцию модема.
    
    
    Схема синхронизации и программное обеспечение
    
    Мысль использовать Интернет-технологии для синхронизации по USB-кабелю с
    компьютером возникла после нескольких бесперспективных попыток сделать это
    более гуманными средствами:
    
    
  • Фирменный софт Sony Ericsson под Wine с первого раза не запустился (если бы запустился - пришлось решать проблему интеграции продукта Microsoft к Evolution). Требуемых функций для Wammu/Gammu через IrSync телефон не поддерживал.
  • В MultiSync\OpenSync трудно быстро разобраться (документации мало, литература по теме не соответствует современному состоянию пакета).
  • В KDE есть некие утилиты для синхронизации, но у нас нет KDE. Основные предпосылки для реализации схемы:
  • Во-первых компьютер и телефон можно объединить в сеть по USB-кабелю. Linux при подключении телефона создает сетевой интерфейс, о чем свидетельствует запись в системном журнале: usb0: register 'cdc_ether' at usb-0000:00:1d.0-2, CDC Ethernet Device, 02:80:37:ec:02:00 Утилита tcpdump на этом интерфейсе показывает, что телефон во всю шлет DHCP-запросы на получение IP-адреса (встроенный модем).
  • Во-вторых, в телефоне есть клиент для работы с удаленным SyncML-сервером. Собственно схема локальной синхронизации: Органайзер (календарь, заметки, задачи, контакты) / Телефон -> USB (HTTP, TCP/IP) -> Компьютер (локальный SyncML-сервер) / Evolution. Этапы решения задачи:
  • 1.Настроить IP-сеть между компьютером и телефоном.
  • 2.Установить на компьютере локальный SyncML-сервер.
  • 3.Указать ПО синхронизации телефона обращаться к этому серверу.
  • 4.Синхронизировать SyncML-сервер и Evolution. Программное обеспечение:
  • Локальный SyncML-сервер. Здесь перечислены основные варианты, как самостоятельных продуктов, так и в составе систем совместной работы. Выбран Funambol Server. У него много недостатков: он тяжелый, медленный, пришлось повозиться с подключением Mysql; но главное его достоинство: собственно для синхронизации настраивать ничего не нужно. Альтернативами (для настойчивых) могут выступать: HTTP-сервер из пакета SyncEvolution, Synthesis SyncML DEMO или HTTP-сервер MultiSync\OpenSync.
  • Для клиента синхронизации Evolution и Funambol выбран SyncEvolution. 1. Настройка сети между телефоном и компьютером по USB-кабелю 1.1.На телефоне:
  • В "параметрах Интернет" установить "Разрешить местные подключения".
  • В "параметрах USB" можно выбирать различные варианты доступа к сети (Доступ к Интернету) - "Интернет через телефон" и "Интернет через компьютер". Здесь описан вариант "Интернет через компьютер", поэтому нужно его выбрать. Если на телефоне есть возможность прописать для USB-соединения статический IP-адрес и маску подсети, то нужно прописать 192.168.2.10 255.255.255.0 и не настраивать на компьютере DHCP-сервер, а только установить на интерфейсе usb0 статический IP-адрес. 1.2.Настройка DHCP-сервера и сети на компьютере: Чтобы выдавать IP-адрес телефону установим на компьютере DHCP-сервер: sudo apt-get install dhcp3-server Настроим его: В файле /etc/default/dhcp3-server пропишем: interfaces=usb0 В файле /etc/dhcp3/dhcpd.conf: subnet 192.168.2.0 netmask 255.255.255.224 { range 192.168.2.10 192.168.2.20; } полезно также закомментировать: #option domain-name "example.org"; #option domain-name-servers ns1.example.org, ns2.example.org; Устанавливаем статический IP-адрес на интерфейс usb0 (телефон должен быть подключен): sudo ifconfig usb0 192.168.2.2 netmask 255.255.255.0 Запускаем DHCP-сервер: sudo /etc/init.d/dhcp3-server start Проверяем сеть: ping 192.168.2.10 2. Настройка локального SyncML-сервера 2.1.Установка Funambol Качаем отсюда. Устанавливаем: sudo ./funambol-9.0.0.bin 2.2.Настройка Mysql Родная база данных в Debian\Ubuntu проработает недолго (по крайней мере у меня). Лучше прикрутить Mysql. Устанавливаем Mysql: sudo apt-get install mysql-server Создаем базу данных: mysql> create database funambol; mysql> GRANT ALL PRIVILEGES ON funambol.* TO 'funambol'@'localhost' IDENTIFIED BY 'funambol'; Качаем mysql-connector-java отсюда. Копируем файл mysql-connector-java-5.1.14-bin.jar в: /opt/Funambol/tools/jre-1.5.0/jre/lib/ext /opt/Funambol/pim-listener/lib /opt/Funambol/inbox-listener/lib Редактируем файл ds-server/install.properties: Исправляем: dbms=mysql Добавляем: jdbc.classpath=/opt/Funambol/tools/jre-1.6.0/lib/ext/mysql-connector-java-5.1.14-bin.jar jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost/funambol?characterEncoding=UTF-8 jdbc.user=funambol jdbc.password=funambol Комментируем: #jdbc.classpath=../tools/hypersonic/lib/hsqldb.jar #jdbc.driver=org.hsqldb.jdbcDriver #jdbc.url=jdbc:hsqldb:hsql://localhost/funambol #jdbc.user=sa #jdbc.password= Запускаем повторную инсталяцию: sudo /opt/Funambol/bin/install.cmd 2.3.Настройка Funambol Команды для запуска\остановка сервиса: sudo /opt/Funambol/bin/funambol-server start sudo /opt/Funambol/bin/funambol-server stop Меняем пароль администратора и гостя, используя утилиту администрирования: sudo /opt/Funambol/admin/bin/funamboladmin 3. Настройка синхронизации на телефоне Сохраняем в надежное, тихое место все ценное и нужное, что есть. В меню "Синхронизация" создаем новую учетную запись Адрес сервера: http://192.168.2.2:8080/funambol/ds Имя пользователя: guest Пароль: guest Выбираем приложения: Контакты, Календарь, Задания, Заметки Настраиваем имена базы: для контактов: card для календаря: event для заданий: task для заметок: note Вуаля. Синхронизируем телефон и SyncML-сервер. 4. Настройка SyncEvolution на компьютере Сохраняем в надежное, тихое место все ценное и нужное, что есть. Качаем пакет для Debian\Ubuntu. Устанавливаем: sudo dpkg -i syncevolution-evolution_1.1.1-2_i386.deb Запускаем гуишную утилиту "Синхронизация" (sync-ui). В ней настраиваем службу Funambol: Имя пользователя: guest Пароль: guest Адрес сервера: http://192.168.2.2:8080/funambol/ds Папки прописываем, как на телефоне (имена базы). Сохраняем. Синхронизируем Evolution и SynML-сервер. Возможно, что графическая утилита не сможет первый раз корректно определить направление синхронизации и т.д., поэтому сообщит об ошибке. В таких случаях можно использовать интерфейс командной строки: syncevolution --sync refresh-from-server funambol calendar (Обновить данные сервера в Evolution) и т.п. При синхронизации контактов был замечен глюк: при изменении существующей записи из evolution в телефон поле email передается, а поле домашний телефон - нет. 5. Дополнительная автоматизация Так как мне ничего кроме локальной синхронизации не нужно, все вспомогательные манипуляции на компьютере были связаны с настройкой сетевого интерфейса usb0 (сеть настраивается редактированием непосредственно файла /etc/network/interfaces без всяких вспомогательных средств). Отрывок файла /etc/network/interfaces: allow-hotplug usb0 iface usb0 inet static address 192.168.2.2 netmask 255.255.255.0 post-up /etc/init.d/dhcp3-server start post-up /opt/Funambol/bin/funambol-server start down /etc/init.d/dhcp3-server stop down /opt/Funambol/bin/funambol-server stop Остается только подключить телефон к компьютеру и нажимать кнопку "Синхронизировать" в sync-ui и выбирать соответствующий пункт меню в телефоне.
  •  
    ----* Прием и отправка SMS в Linux   [комментарии]
     
    Для организации автоматизации приема и отправки SMS в Linux можно использовать пакет
    gnokii и подключенный к системе телефон. В
    простейшем случае можно использовать возможность консольной утилиты gnokii из
    пакета gnokii-cli, но при необходимости более сложной автоматизации имеет смысл
    воспользоваться Perl-модулем GSM::SMS или GSMD::Gnokii.
    
    Устанавливаем gnokii, для Debian/Ubuntu:
    
       sudo apt-get install gnokii-cli gnokii-smsd xgnokii
    
    , где gnokii-cli - интерфейс командной строки, gnokii-smsd демон для работы с
    SMS, а xgnokii - GUI интерфейс. Последние два ставим на свое усмотрение.
    
    Подключаем телефон через USB-порт. Смотрим в /var/log/messages к какому
    устройству осуществилась привязка (например, /dev/ttyACM0)
    
    Создаем файл конфигурации /home/mc/.gnokiirc
    
       [global]
       model = AT
       connection = serial
       port = /dev/ttyACM0
    
    где, model - тип устройства: AT - для большинства телефонов, series40 - для
    телефонов Nokia с системой series40, gnapplet для старых телефонов Nokia Series60.
    
    connection - тип соединения serial - USB/RS-232, irda - инфракрасный порт, bluetooth - Bluetooth.
    
    port - порт, для USB - /dev/ttyACM0 или /dev/ttyUSB0, для Bluetooth указываем
    адрес устройства ("aa:bb:cc:dd:ee:ff").
    
    Для USB-устройств также можно попробовать сочетание connection=dku2libusb и
    port = N, где N - номер устройства.
    
    Проверяем поддерживается ли телефон:
    
       gnokii --identify
    
       GNOKII Version 0.6.28
       IMEI         : IMEI56565656565656
       Manufacturer : Motorola CE, Copyright 2000
       Model        : GSM900","GSM1800","GSM1900","MO
       Product name : GSM900","GSM1800","GSM1900","MO
       Revision     : R368_G_0B.A0.0FR
    
    Для мониторинга активности:
    
       gnokii --monitor
    
    Возможности gnokii позволяют достаточно полно контролировать телефон, но нас
    интересует работа с SMS.
    
    Чтение SMS:
    
       gnokii --getsms тип_памяти старт стоп
    
    где тип_памяти: SM - для SIM-карты, ME - для внутренней памяти и MT для
    комбинированных хранилищ, IN - inbox, OU - outbox. Посмотреть какое хранилище
    используется на телефоне можно командой "gnokii --showsmsfolderstatus"
    старт - начальная позиция сообщения
    cтоп - конечная позиция сообщения, если не указать будет прочитано одно
    сообщение, если указать "end" будут выведены все сообщения до конечной позиции
    
    Пример для вывода всех сохраненных SMS:
    
       gnokii --getsms MT 1 end
    
    
    Для отправки SMS можно использовать команду:
    
       echo "текст" | gnokii --sendsms номер
    
    Например:
    
       echo "тест" | gnokii --sendsms '+79094126426'
    
       Send succeeded with reference 131!
    
    Другой способ отправки: в комплекте с Perl-модулем SMS::Send поставляется
    утилита xpl-sender, которую можно использовать не только как пример для
    написания скриптов, но и отправлять через неё сообщения:
    
       xpl-sender -m xpl-cmnd -c sendmsg.basic to=+7909344355 body="test"
    
    
    
    Вывод содержимого адресной книги:
    
       gnokii --getphonebook MT 1 end
    
    Адресную книгу можно сохранить, а затем восстановить:
    
       gnokii --getphonebook MT 1 end --vcard > phonebook.txt
       gnokii --writephonebook --vcard < phonebook.txt
    
    
    Настройка SMS-шлюза
    
    В состав gnokii входит демон SMSD, который позволяет организовать работу
    полноценного SMS-шлюза, на лету обрабатывающего входящие SMS. Для хранения
    отправляемых и получаемых сообщений SMSD может использовать СУБД MySQL,
    PostgreSQL (плагины gnokii-smsd-mysql и gnokii-smsd-pgsql) или файловое
    хранилище (--module file).
    
    Ставим недостающие пакеты:
    
       sudo apt-get install gnokii-smsd-mysql mysql-server
    
    Создаем БД
    
      mysql -u smsgw
      > create database smsgw;
    
    Создаем структуру БД, используя поставляемый в комплекте с gnokii-smsd-mysql пример:
    
      mysql -u smsgw smsgw < /usr/share/doc/gnokii-smsd-mysql/sms.tables.mysql.sql
    
    в результате будут созданы три простые таблицы inbox, outbox и multipartinbox,
    структура которых имеет следующий вид:
    
       CREATE TABLE inbox (
         id int(10) unsigned NOT NULL auto_increment,
         number varchar(20) NOT NULL default '',
         smsdate datetime NOT NULL default '0000-00-00 00:00:00',
         insertdate timestamp DEFAULT CURRENT_TIMESTAMP,
         text text,
         phone tinyint(4),
         processed tinyint(4) NOT NULL default '0',
         PRIMARY KEY  (id)
       );
       CREATE TABLE outbox (
         id int(10) unsigned NOT NULL auto_increment,
         number varchar(20) NOT NULL default '',
         processed_date timestamp DEFAULT 0,
         insertdate timestamp DEFAULT CURRENT_TIMESTAMP,
         text varchar(160) default NULL,
         phone tinyint(4),
         processed tinyint(4) NOT NULL default '0',
         error tinyint(4) NOT NULL default '-1',
         dreport tinyint(4) NOT NULL default '0',
         not_before time NOT NULL default '00:00:00',
         not_after time  NOT NULL default '23:59:59',
         PRIMARY KEY  (id)
       );
       CREATE TABLE multipartinbox (
         id int(10) unsigned NOT NULL auto_increment,
         number varchar(20) NOT NULL default '',
         smsdate datetime NOT NULL default '0000-00-00 00:00:00',
         insertdate timestamp DEFAULT CURRENT_TIMESTAMP,
         text text,
         phone tinyint(4),
         processed tinyint(4) NOT NULL default '0',
         refnum int(8) default NULL,
         maxnum int(8) default NULL,
         curnum int(8) default NULL,
         PRIMARY KEY  (id)
       );
      
    Запускаем smsd:
    
      /usr/sbin/smsd -u smsgw -d smsgw -c localhost -m mysql -f /var/log/smsdaemon.log
    
    
    где "-u" - имя пользователя БД, "-d" - имя базы, "-с" - хост, а "-m" - модуль хранения.
    
    Отправив теперь SMS на подключенный к компьютеру телефон, smsd сразу перехватит
    его и запишет в базу.
    
    выполнив "select * from inbox;"  увидим примерно такое:
    
      | id | number | smsdate | insertdate |text | phone | processed |
      |  1 | +7909343156224 | 2011-01-20 10:12:05 | 20110120130123 | Test | NULL | 0 |
    
    Для отправки сообщения достаточно добавить новую запись в таблицу outbox, smsd
    сразу его подхватит его и отправит. Например:
    
       insert into outbox (number,text) values('+7909344355', 'Тест);
    
    
    В заключение можно отметить, что smsd  может работать без СУБД, используя
    файловое хранилище. Пример запуска:
    
       /usr/sbin/smsd -m file -c spool-директория
    
    Для отправки SMS в spool-директории нужно создать файл с любым именем в формате:
       номер
       текст
    
    после успешной отправки файл будет удален.
    
    Через опцию "-u" можно указать путь к скрипту, который будет выполняться при
    каждом получении SMS. Иначе входящие сообщения будут выводиться в стандартный
    выходной поток в формате "действие номер дата < текст".
    
    Дополнение: Вместо gnokii можно использовать интенсивно развивающийся форк [[http://wammu.eu/
    gammu]], содержащий поддержку некоторых дополнительных телефонов.
    
     
    ----* Проверка GSM/UMTS оператора в chat-скрипте (доп. ссылка 1)   Автор: Kirill Zabarniuk  [комментарии]
     
    В ситуации работы через нескольких операторов для проверки активного
    GSM/UMTS-оператора, к которому в данный момент подключился модем, в chatscript
    можно использовать следующую конструкцию:
    
       '' ATZ
       OK-AT-OK "AT+COPS=?" UTEL3G ''
       OK-AT-OK AT+CGDCONT=1,"IP","unlim.utel.ua"
       OK-AT-OK "ATDT*99***1#"
       CONNECT ''
       '' \d\c
    
    Список экзотичных GPRS/3G/UMTS/HSDPA  AT-команд можно посмотреть здесь.
    
     
    ----* Аутентификация при помощи Bluetooth телефона или USB Flash в Debian/Ubuntu Linux (доп. ссылка 1) (доп. ссылка 2) (доп. ссылка 3) (доп. ссылка 4)   [комментарии]
     
    В качестве ключа для авторизации можно использовать MAC адрес телефона с Bluetooth интерфейсом.
    Для избежания перехвата MAC-адреса, Bluetooth адаптер телефона должен работать
    только в пассивном режиме.
    Тем не менее метод можно использовать только в ситуациях не предъявляющих
    серьезных требований к безопасности
    (например, для входа на гостевую машину или только для выполнения sudo).
    
    Если bluetooth система не настроена, устанавливаем пакеты bluetooth, bluez-utils и libbluetooth2.
    Выполнив команду hcitool scan определяем адрес нужного телефона, переведя
    телефон в режим достижимости:
    
       hcitool scan
       Scanning...
       00:0E:08:BA:14:04 Moto
    
    Ставим пакет libpam-blue, если в вашем дистрибутиве его нет - 
    загружаем исходные тексты с http://pam.0xdef.net/ и компилируем.
    
    Создаем файл конфигурации /etc/security/bluesscan.conf
    
        general {
           timeout = 10;
        }
        mylogin = {
           name = Moto;
           bluemac = 00:0E:08:BA:14:04;
        } 
    
    где mylogin имя пользователя для которого будет осуществлен автоматический вход.
    
    В /etc/pam.d/common-auth добавляем строку
    
       auth sufficient pam_blue.so
    
    Добавив эту строку в /etc/pam.d/sudo можно добиться выполнения sudo без пароля
    при наличии телефона под рукой.
    
    Настройка аутентификации через USB Flash производится аналогично, 
    только вместо PAM модуля pam_blue.so используется pam_usb.so, доступный из пакета libpam_usb.
    
    В /etc/pam.d/common-auth добавляем:
    
       auth sufficient pam_usb.so
    
    Далее подключаем USB Flash и создаем ключи для пользователя mylogin:
    
       pamusb-conf --add-device myusbflash
       pamusb-conf --add-user mylogin
    
    Также можно вручную отредактировать файл конфигурации /etc/pamusb.conf.
    
    Проверяем:
    
       pamusb-check mylogin
       ...
       Access granted.
    
    Инструкцию по аутентификации с использованием датчика отпечатков пальцев можно найти на странице 
    http://www.opennet.me/tips/info/1586.shtml
    
     
    ----* Выбор и настройка VoIP usb-телефона под linux. (доп. ссылка 1)   Автор: Сергей Вольхин  [комментарии]
     
    Выбор.
    
    Меня интересовала не просто работа микрофона и динамика, но и как минимум клавиатуры.
    
    Выбор пал на Skypemate p1K (в девичестве Yealink), как не на очень дорогой апппарат,
    при этом имеющий как полноценную клавиатуру ("как у мобильника"), так и простенький ЖК-дисплей.
    Ко всему прочему поддержка именно этого девайса в linux наиболее развита.
    
    Настройка.
    
    Поддержка собственно звука не требует практически никакой настройки.
    Девайс определяется как новая звуковая карта:
    
        -bash-2.05b# cat /proc/asound/cards
        ....
        USB-Audio - VOIP USB Phone
        Yealink Network Technology Ltd. VOIP USB Phone at usb-0000:00:03.0-3
    
    В SIP-клиенте достаточно выбрать например "/dev/dsp2" в качеcтве динамика/микрофона.
    
    Что касается клавиатуры, то с этим ситуация несколько сложней.
    
    Есть несколько проектов разной степени работоспособности:
    
    1. SkypeMate (http://skypemate.ru/support/docs/) - официальный драйвер. 
    Бинарный, только для FedoraCore 3 (требует старый dbus-0.23).
    Плюс ко всему только для Skype. Отдельные джидаи запускали его на современных дистрибутивах
    с подменой либы dbus, с периодическими сегфолтами, я с этим заморачиваться не стал.
    
    2. USBB2K-API (http://savannah.nongnu.org/projects/usbb2k-api/) - неофициальный
    драйвер. По отзывам пользователей - работает,
    однако у меня он не завелся. Девайс определялся, команды на телефон шли,
    однако обратной связи не наблюдалось. При этом на форумах отписывали пользователи с аналогичной
    проблемой, разработчики пытались им даже помочь, но дело там так и не сдвинулось с мертвой точки.
    
    3. yealink-module (http://savannah.nongnu.org/forum/forum.php?forum_id=4319) -
    как видно из названия модуль для ядра.
    Последняя версия из CVS у меня собралась лишь после жесткой правки исходников и 
    после этого кончено нормально не работала, однако релиз за номером 0861 собрался сразу и 
    без проблем был установлен. Замечу, что поддержка клавиатуры в нем реализована
    просто и универсально:
    клавиши телефона дублируют клавиши клавиатуры (цифровые, backspace, enter и т.д.)
    
    Оригинал статьи (со ссылками) здесь: http://damnsmallblog.blogspot.com/2007/07/usb-linux.html 
    
     
    ----* Подготовка 3gp видео для сотового телефона (доп. ссылка 1)   Автор: Ivan A-R  [комментарии]
     
    Многие современные мобильные телефоны поддерживают проигрывание и запись1) файлов в формате 3GP. 
    Этот формат разработан специально для применения в портативных устройствах с
    небольшим разрешением экрана.
    
    К счастью у нас есть свободный кросплатформенный конвертер видеоформатов ffmpeg 
    
    В Debian GNU/Linux или Ubuntu поставить ffmpeg можно из репозитория. 
    Версию для windows можно скачать по адресу http://ffdshow.faireal.net/mirror/ffmpeg/ 
    
    Теперь перейдём собственно к конвертации: 
    
        ffmpeg -i input.avi -s qcif -r 12 -ac 1 -ar 8000 -b 30 -ab 12 output.3gp
    
    Здесь ключи определяют: 
       -i input.avi - имя входного файла;
       -s qcif -r 12 - кодировать видео с разрешением 176&#215;144 и 12 кадров в секунду;
       -ac 1 -ar 8000 - кодировать звук в один канал (моно) с частотой 
          дискретизации 8000 (это даст максимальную воспроизводимую частоту в 4000 Гц);
       -b 30 -ab 12 - установить видео битрейт 30 кбит/с и аудио битрейт 12 кбит/с;
       output.3gp - результирующий файл.
    
    Кодирование идёт достаточно быстро и по окончании результирующий файл готов к отправке на телефон. 
    Как перенести файл на телефон это уже личное дело Вас и телефона. На свой Siemens CX75 
    я переношу файлы с помощью кардридера и RS-MMC карты на 512Mb. 
    
    Хочу предостеречь от создания роликов большого размера. К примеру попытка проиграть 
    на моём телефоне ролик в 17Mb (~50мин.) привела к зависанию и выключению тела.
    
     
    ----* Запуск Linux на Android-телефоне с SD-карты без перепрошивки   Автор: Павел Отредиез  [комментарии]
     
    В данной заметке рассказано как запустить ванильный Debian Linux на телефоне не
    прошивая его и не портя установленный Android.
    Мой подопытный аппарат Xiaomi Redmi note 11. Телефон не нужно рутовать,
    достаточно разблокировать загрузчик. Запускать будем с помощью fastboot (да для
    каждого запуска потребуется подключать телефон к компьютеру), а рутовую
    файловую систему будем подцеплять с SD-карты.
    
    Настройка среды
    
    Создадим рабочий каталог:
    
       mkdir ~/redmi11
       cd ~/redmi11/
    
    
    Скачаем нужное ПО:
     
       sudo apt install qemu-user-static
       sudo apt build-dep linux-source
       git clone https://android.googlesource.com/platform/system/tools/mkbootimg
       git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9
       cd aarch64-linux-android-4.9
       git switch android-msm-barbet-4.19-android12-qpr1
       cd ~/redmi11/
    
    , так же https://developer.android.com/tools/releases/platform-tools в каталог ./platform-tools.
    
    Пропишем для удобства работы пути в ./path.sh:
    
       export PATH=$PATH:$(pwd)/mkbootimg:$(pwd)/platform-tools
    
    Подключим пути в текущий bash:
    
       . path.sh
    
    
    Ядро
    
    В ядре, которое идёт в составе Android, выключены некоторые важные подсистемы,
    поэтому загрузиться с ним по-простому не получится и надо компилировать свою версию.
    
    Надо найти исходники ядра для своего телефона, для Xiaomi с этим почти нет проблем.
    
       git clone https://github.com/MiCode/Xiaomi_Kernel_OpenSource.git
       cd Xiaomi_Kernel_OpenSource/
       git switch spes-r-oss
    
    Для моей версии отсутствовал каталог techpack, он должен был быть, и ядро не
    собиралось до конца. Я нашёл techpack в аналогичной версии исходников на
    GitHub. Надо сказать, что исходники ядра Xiaomi имеют много мелких ошибок,
    связанных с включением "" <> хидеров и прочего. Я их все муторно правил, пока
    не добился компиляции без ошибок.
    Получим конфиг ядра с телефона, для этого подключим его к компьютеру и выполним:
    
       adb shell zcat /proc/config.gz > .config
    
    Сделаем два скрипта - для конфигурации ядра и для компиляции.
    ./menuconfig.sh:
    
    
       PATH="$PATH:$HOME/redmi11/aarch64-linux-android-4.9/bin"
       ARCH=arm64 CROSS_COMPILE=aarch64-linux-android- make menuconfig
    
    ./build.sh:
    
       PATH="$PATH:$HOME/redmi11/aarch64-linux-android-4.9/bin"
       ARCH=arm64 CROSS_COMPILE=aarch64-linux-android- make -j 8 targz-pkg
    
    Теперь изменим кофигурацию ядра и скомпилируем его. Во-первых в нем отключена
    поддержка devtmpfs, включим её
    
       CONFIG_DEVTMPFS=y
    
    Включим виртуальные консоли:
    
       CONFIG_TTY=y
       CONFIG_VT=y
       CONFIG_CONSOLE_TRANSLATIONS=y
       CONFIG_VT_CONSOLE=y
    
    Фрэймбуфер:
    
       CONFIG_DRM_FBDEV_EMULATION=y
       CONFIG_FRAMEBUFFER_CONSOLE=y
    
    Чтобы консоль не заваливало сообщениями ядра:
    
      CONFIG_CONSOLE_LOGLEVEL_DEFAULT=4
      CONFIG_CONSOLE_LOGLEVEL_QUIET=3
      CONFIG_MESSAGE_LOGLEVEL_DEFAULT=3
    
    
    ROOT файловая система
    Используем debootstrap для получения файловой системы:
    
       cd ~/redmi11/
       mkdir rootfs
       sudo debootstrap --arch=arm64 stable ./rootfs http://mirror.yandex.ru/debian
       sudo chroot rootfs/ tasksel install gnome-desktop
    
    Скопируем полученное ядро в ./rootfs/boot и модули если есть в ./rootfs/lib/modules.
    
    Отредактируем ./rootfs/etc/fstab:
    
       LABEL=debian	/	ext4	rw,defaults,noatime,nodiratime	0 1
    tmpfs /tmp tmpfs rw,nosuid,nodev,noexec,mode=1777
    
    Создадим initrd:
    
       sudo chroot rootfs/ apt install initramfs-tools
       sudo mount --bind /dev rootfs/dev
       sudo chroot rootfs/ update-initramfs -k all -c
       sudo umount rootfs/dev
    
    Теперь для удобства сделаем образ нашей файловой системы, для этого используем скрипт install.sh:
    
       #!/bin/sh
    
       mkdir -p mnt
       dd if=/dev/zero of=debian-arm64.ext4 bs=4096 count=2097152 #8Gb
    /sbin/mkfs.ext4 -L debian -O^has_journal debian-arm64.ext4
       sudo mount -o loop debian-arm64.ext4 ./mnt
       sudo cp -ar ./rootfs/* ./mnt/ 
       sudo umount ./mnt
    
    На SD карточке у меня два раздела - первый FAT32, и второй под Linux. Запишем образ на SD карточку:
    
       sudo dd if=debian-arm64.ext4 of=/dev/YourSD2 bs=512 status=progress
       sudo partprobe
       sudo resize2fs /dev/YourSD2
    
    
    Запуск
    
    Для запуска нам нужно подготовить Android boot image, используем скрипт mkbootimg.sh:
    
       mkbootimg.py \
       --header_version 3 \
       --os_version 12.0.0 \
       --os_patch_level 2023-04 \
       --kernel ./rootfs/boot/vmlinuz-4.19.157-tiny \
       --ramdisk ./rootfs/boot/initrd.img-4.19.157-tiny \
       --cmdline 'console=tty0 quiet root=LABEL=debian rootwait' \
       --board '' \
       -o boot-debian.img
    
    
    Здесь мы запускаем ядро с rootfs с меткой "debian", как мы и делали образ файловой системы.
    
    Теперь собственно запуск. Подключим телефон к компьютеру и выполним (не бойтесь
    ничего не записывается на него):
    
       adb reboot bootloader
       fastboot boot boot-debian.img
    
    
    P.S. А с драйверами я не разобрался.
    
     
    ----* Бесшовная миграция (роуминг) Wi-Fi для клиентов Linux и Android (доп. ссылка 1) (доп. ссылка 2)   Автор: sfstudio  [комментарии]
     
    С wpa_supplicant из GIT теперь можно настроить в Linux прозрачную миграцию,
    позволяющую переключиться на другую точку доступа без разрыва соединений
    приложений, в том числе продолжается вещание мультикастовоего IPTV, а
    выполнение iperf в большинстве случаев не умирает, а лишь деградирует по
    скорости в момент миграции. При этом даже корректно отрабатывает вариант с
    несколькими AP в разных поддиапазонах 5ГГц.
    
    Для настройки роуминга потребуется (на примере Mageia Linux 5):
    
    1) wpa_supplicant из git. Можно взять подготовленный автором src.rpm
    
        wget http://wive-ng.sf.net/downloads/wpa_supplicant-2.6-1.mga5.src.rpm 
    
    и собрать командой
    
       rpmbuild --rebuild wpa_supplicant-2.6-1.mga5.src.rpm
    
    2) переключить его на использование nl80211 вместо wext, драйвер вашего
    wifi-модуля должен полностью поддерживать nl80211 (при использовании wext
    всегда будут долгие периоды реконнекта с потерей соединений пользовательских
    приложений) так как требуется, чтобы SME был на уровне wpa_supplicant.
    
    Большинство дистрибутивов по умолчанию использует WEXT, т.е. до сих пор далеко
    не все драйверы wifi, даже входящие в состав ядра, умеют nl80211 (iwlwifi точно
    умеют, ath*k тоже должны, в rt28xxx  по факту даже сканирование не работает).
    Проверить, что используется на данный момент, можно, посмотрев, с какими
    опциями запущен supplicant
    
       ps ax | grep wpa_supplicant 
    
    должен выдать что-то типа 
    
       25201 ? Ss 0:01 /usr/sbin/wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf -D nl80211 -f /var/log/wpa_supplicant.log
    
    Для этого редактируем /etc/sysconfig/network-scripts/ifcfg-имя_интерфейса
    
    Важно установить:
    
       WIRELESS_WPA_DRIVER=nl80211
       WIRELESS_WPA_REASSOCIATE=no
       MII_NOT_SUPPORTED=yes
       USERCTL=yes
    
     В /etc/wpa_supplicant.conf везде отключаем рандомизацию MAC. Включаем фоновое сканирование:
    
       bgscan="simple:30:-60:200"
    
    Т.е. при уровне ниже -60 будем начинать время от времени "щупать эфир" на
    предмет наличия кандидатов для миграции и по возможности мигрировать. Вместо
    фонового сканирования можно было бы использовать данные из RRM, но этой логики
    в wpa_supplicant пока нет.
    
    
    Также следует обратить внимание на используемый DHCP-клиент. Важно, чтобы он не
    сбрасывал адрес на интерфейсе (иначе сбросится состояние соединений приложений)
    по сигналу от ifplugd. Я использую штатный "
    "Internet Systems Consortium DHCP Client 4.3.3-P1". Ну и естественно, точки
    доступа и опорная сеть должны нормально отрабатывать ситуацию с перемещением клиентов.
    
    В прошивке Wive-NG для этого сделано абсолютно всё, что возможно. Больше ничего
    не требуется. Проверено на адаптерах Intel I3160/I7260. Выпинывать их
    принудительно не надо - оно само инициирует переход без всяких проблем. Под
    Windows эти карты ведут себя аналогично, т.е. без проблем мигрируют с
    сохранением пользовательских соединений, достаточно лишь в настройках драйвера
    увеличить агрессивность роуминга.
    
    
    
    
    Настройка миграции Android-устройств с беспроводными чипами от Atheros/Qualcomm.
    
    
    Достаточно давно atheros/qualcomm добавили в свои драйверы вполне внятную
    логику handover (миграции внутри плоской L2 сети, с точки зрения клиента,  с
    множественными AP, на которых установлен один SSID). Собственно, тот самый
    роуминг, да ещё и бесшовный (ну если используемые AP не совсем плохи и умеют
    моментально передавать в опорную сеть критичные данные, например, ARP-ы для
    обновления ARP-таблиц на устройствах в сети + ещё ряд условий на тему кривости).
    
    Теперь о проблеме. Handover есть, сеть с нормальными AP есть, но чтобы клиент
    мигрировал, по-прежнему требуется пинок, иначе висит до последнего... Что
    делать и кто виноват?
    
    Для продолжения нужно само устройство, обязательно рутованное, обязательно
    использующее радио на чипе qualcomm (например yota phone 2).
    
    Перемонтируем разделы в RW, идём в /system/etc/wifi, видим там файл
    WCNSS_qcom_cfg.ini - собственно, это основной конфигурационный файл, читаемый
    драйвером wifi.
    
    Драйверы QCA сами реализуют слои SME/MLME, не экспортируя эти функции на плечи
    wpa_supplicant. И вся логика управления подключениями и миграцией возложена на
    них. Wpa_supplicant в Android собран с NO_ROAMING, а значит можно ожидать, что
    это сделано так же у всех абсолютно чипмэйкеров для Android (файлы
    конфигурации, естественно, разные, или же, как у Broadcom, интересующие нас
    параметры к исправлению задаются при компиляции, и изменить их на лету невозможно).
    
    Первая настройка, которая нас будет интересовать в файле конфигурации, это:
    
       # default value of this parameter is zero to enable dynamic threshold allocation
       # to set static roming threshold uncomment below parameter and set vaule
    
       gNeighborLookupThreshold=78
    
    Эта настройка напрямую отвечает за то, когда клиент начнёт пытаться искать
    кандидата (форсирует сканирование, или запросит список ближайших AP по RRM и
    проведёт короткую процедуру скана для подтверждения).  И значение у нас
    выставлено -78дБ...
    
    И вроде бы всё хорошо, но... Мы как обычно забыли, что то, что слышит клиент и
    то, что слышит AP, может отличаться по уровню на десятки дБ. Обычно в
    android-клиентах передатчик в 20МГц полосе может выдать 16дБм, в 40МГц в лучшем
    случае 14дБм. Тогда как со стороны AP обычно имеем как минимум 20дБм дури даже
    в 40МГц полосе (обычно определяется законодательными ограничениями конкретной
    страны, для РФ 20дБм в 2.4ГГц и 23дБм в 5ГГц независимо от ширины, хоть в 80МГц
    эти 23дБм, хоть в 20МГц). Из опыта, при таком раскладе в среднем перекос по
    уровням в прямой видимости уже в 10 метрах будет составлять около 10-15 Дб, а
    если есть преграды, то запросто перевалит и за 30 Дб.
    
    Но возьмём 10дБ для простоты. Т.е. когда клиент видит AP с уровнем в -78дБ, AP
    видит клиента уже с уровнем около -88дБ. Стоит говорить, что нормальной работы
    при таком раскладе уже не будет (особенно в 2.4ГГц в зашумленном эфире офиса)?
    TCP, требующий подтверждения доставки, просто встанет колом, голос начнёт
    квакать и т.д.
    
    Что бы этого избежать (плюс приземлить побольше клиентов, ведь для этого надо
    заставить всех работать на самой ближней AP, желательно с максимальными рэйтами
    и без повторов передачи), админ в сети наверняка на AP настроил handoff с
    уровнем эдак в -75дБ. Т.е. при -75дБ RSSI handoff со стороны AP застрелит
    такого клиента (при этом на клиенте уровень от AP будет аж -65дБ, т.е. далеко
    до заветных -78дБ, когда он решит подумать мигрировать). Т.е. будет link beat,
    сброс стэйтов и обрыв соединений на пользовательской стороне.
    
    Ещё пример - когда AP видит клиента с уровнем в -75дБ, клиент видит AP с
    уровнем -65дБ!! Или, когда на клиенте видим -78дБ, то со стороны AP клиент
    будет слышен лишь с  уровнем -88дБ.
    
    Т.е. что бы обеспечить нормальный сервис, мы должны отстреливать клиента сильно
    раньше, чем он сам подумает мигрировать (имеется в виду, с вышеозначенными
    умолчаниями в драйвере).
    
    Или же нам придётся снижать мощность на AP что бы "уравнять" шансы, что в
    условиях грязного эфира может привести к катастрофическому падению SNR и как
    следствие бульканью, хрипам и прочему.
    
    А вот чтобы этого не происходило, достаточно выше обозначенную переменную
    поправить, выставив значение в диапазоне -65 ~ -70дБ.
    
    Побочный эффект - чуть упадёт скорость у клиента, так как чаще будет
    выполняться фоновые сканирования, плюс незначительно вырастет
    энергопотребление. Зато у него "будет повод" начать смотреть, кто есть вокруг,
    и попытаться мигрировать, не дожидаясь, пока его выпнет точка доступа.
    
    Следующий блок:
    
       # CCX Support and fast transition
     
       CcxEnabled=0
       FastTransitionEnabled=1
    
    
    CcxEnabled - это поддержка rrm ccx location-measurement, т.е. определения
    местоположения. Зачастую бесполезна и лишь будет расходовать аккумулятор.
    
    FastTransitionEnabled - поддержка 802.11R, однако в старых драйверах не полная,
    но хотя бы умеет учитывать MDIE при миграции (работает всегда, если переменная
    в значении 1). Заметим, что FT, а именно ускорение фазы аутентификации просто
    при взводе значения переменной в 1 работать не начнёт, так как требуется ещё
    пропатчить Supplicant  и обвязку андроидную (как это делает, например, Samsung
    в своих топовых моделях). Однако, учёт MDIE - уже польза. Включаем.
    
    Не забываем также отключить 802.11d,  иначе встретим много чудес в 5ГГц с DFS
    каналами. Пусть использование или не использование оных лежит на совести админа сети.
    
       # 802.11d support
    
       g11dSupportEnabled=0
    
    Далее блок:
    
       # Legacy (non-CCX, non-802.11r) Fast Roaming Support
       # To enable, set FastRoamEnabled=1
       # To disable, set FastRoamEnabled=0
    
       FastRoamEnabled=1
    
    Включает возможность миграции в любых сетях. Иначе, логика  handover будет
    активироваться, только если клиент видит, что AP вещает поддержку 802.11R в
    IECAP. И/или используется WPA*-Enterprise.
    
    
    В новых драйверах, поставляемых в SDK для Android 6.0.1, добавлена ещё одна прекрасная опция:
    
       # Handoff Enable(1) Disable(0)
    
       gEnableHandoff=0
    
    Эта опция (если выставить в 1) позволяет обрабатывать handoff с пинком со
    стороны AP как сигнал к миграции, т.е. банально не генерируется LinkBeat при
    kickout со стороны AP, а сразу выполняется попытка перескочить на следующую
    подходящую выбранную сканом AP, и только если не получилось сгенерировать Link
    Beat системе (т.е. о том, что его выпнули (kickout), знает только драйвер, и
    сразу пытается мигрировать, если не получается, то тогда уже сообщает системе,
    что всё, связи с этой сетью больше нет, надо выбрать другой SSID из тех,
    которые знает Android).
    
    Пользовательские соединения при этом останутся целыми (ну разве что iperf
    пострадает, но мессенджеры и голос останутся работать, правда в случае голоса
    будет квак).
    
    Это слегка нарушает "стандарт" 802.11, но в случае миграции очень полезная
    штука. После её включения, устройство прозрачно (с точки зрения запущенных
    приложений) сможет мигрировать даже в сетях, где весь роуминг построен
    исключительно на отстрелах клиента по уровню.
    
    А вот ещё одна крайне полезная настройка:
    
       #Check if the AP to which we are roaming is better than current AP in terms of RSSI.
       #Checking is disabled if set to Zero.Otherwise it will use this value as to how better
       #the RSSI of the new/roamable AP should be for roaming
    
       RoamRssiDiff=5
    
    Дельта уровней между AP для выбора кандидата при миграции. Больше значение -
    меньше вероятность прилететь назад на ту же AP, но более отложенный старт
    миграции. Установленных по умолчанию 5дБ  маловато. Нужно иметь дельту около
    8-10дБ. Для начала выставим 8.
    
       RoamRssiDiff=8
    
    Ещё интересная штука:
    
       #Beacon Early Termination (1 = enable the BET feature, 0 = disable)
    enableBeaconEarlyTermination=1
    
       beaconEarlyTerminationWakeInterval=11
    
    Эта опция откидывает все маяки, если в этих фрэймах  не взведён бит TIM, а
    клиент спит. Т.е. во сне клиент не может вести пассивный сбор данных о соседних
    AP. Хорошо для аккумулятора - вероятно, плохо для миграции (надо глубже копать драйвер).
    
       gActiveMaxChannelTime=60
       gActiveMinChannelTime=30
       gActiveMaxChannelTimeConc=60
       gActiveMinChannelTimeConc=30
    
    Настройки времени прослушивания эфира при активном сканировании поканально, в
    мс. Больше значения - больше времени уйдёт на сканирование всего диапазона.
    Меньше время - быстрее просканируем, но можем половину не услышать.
    
    RRM включается так:
    
       # 802.11K support
       gRrmEnable=1
       gRrmOperChanMax=8
       gRrmNonOperChanMax=8
       gRrmRandIntvl=100
    
    Правда, я на доступных мне железках (в смысле, на тех, в которых было выключено
    и включил, на SGS A5 2017 запросы есть, но там и так всё с миграцией
    более-менее) так и не дождался ни одного запроса с использованием RRM от Yota
    Phone. Видимо, отключена поддержка при сборке драйвера.
    
    Это основное, что касается миграции.
    
    Да и ещё:
    
       # 1: Enable standby, 2: Enable Deep sleep, 3: Enable Mcast/Bcast Filter
       gEnableSuspend=3
    
    По умолчанию обычно 0. В таком режиме клиент при переходе в режим сна (часто
    просто при выключении экрана) полностью тушит RF часть, временно просыпаясь
    только для того, чтобы AP его по таймауту не выпнула. При этом, реализация
    такова, что и роумингу зачастую становится плохо. Следует установить его в 3,
    т.е. фильтровать броадкасты и мультикасты во сне, и только.
    
    В файле конфигурации ещё много интересных параметов. Например, куча настроек
    для энергосбережения, если поотключать которые, миграция становиться более
    весёлой и точной, но батарея...
    
    Ну и на закуску:
    
       #Channel Bonding
       gChannelBondingMode24GHz=1
       gChannelBondingMode5GHz=1
       gShortGI20Mhz=1
       gShortGI40Mhz=1
    
    Поддержка широких каналов (>20МГц) + поддержка SGI. Зачастую для 2.4ГГц
    поддержка 40МГц отключена, т.е. gChannelBondingMode24GHz установлен в 0. Что,
    во-первых, не позволяет работать на максимальных рэйтах (150Мбит/с для 1T1R в
    2.4ГГц при 40МГц, будет только 72). Увы, проблема в том, что видимо для первого
    соединения значение перекрывается откуда-то ещё, и даже выставив
    gChannelBondingMode24GHz=1, сразу мы 150Мбит/с не видит. Но после первой же
    миграции драйвер плюёт на всех и взлетает в 40МГц полосе.
    
    Также установка gChannelBondingMode24GHz решает проблему совместимости с
    некоторыми 2.4ГГц AP на Xiaomi и One+ (как обычно, намутили с анонсами в
    зависимости от региона, в итоге AP и клиент не могут договориться, в какой
    полосе разговаривать).
    
    Не забываем после правки сохранить, перемонтировать назад системный раздел в RO и перезагрузиться.
    
     

       Обработка изображений и видео

    ----* Кодирование видео при помощи GPU из файла, запись с экрана и стриминг   Автор: Zenitur  [комментарии]
     
    Драйвер Intel использует API под названием VA-API, драйвер Amdgpu - OpenMAX,
    NVIDIA - Nvenc. А драйверы fglrx и nouveau не имеют поддержки аппаратного энкодера.
    
    1. Кодирование при помощи GPU (из файла или запись с экрана)
    
    Несколько лет назад существовал проект Gears on Gallium, который проводил
    бенчмарки драйверов и игр (преимущественно опенсорсных, но бывали и исключения
    - например эти ребята были первыми, кто опубликовал результаты тестов Doom 2016
    под Wine Staging + AMDGPU-PRO + Vulkan), формировал дистрибутив Linux в форме
    Docker-контейнера с последним графическим стеком (из GIT), и много чего ещё...
    К сожалению, проект закрыт. Сайт проекта - оффлайн, но остался YouTube-канал.
    
    Одним из их проектов было создание патча для GStreamer, оптимизирующего
    "узкие места" при кодировании видео, значительно снижая нагрузку на CPU. Патч доступен
    на GitHub.
    
    Также по ссылке доступен скрипт rec.sh, являющейся простой графической
    оболочкой на KDialog/zenity. При помощи неё можно начать скринкаст, задав
    следующие настройки: а). Через что кодировать (Software, VA-API (Intel),
    OpenMAX (AMD open source)) б). Полный экран или окно? в). Куда сохранять? В
    итоге формируется команда наподобие такой:
    
       gst-launch-1.0 -e ximagesrc use-damage=0 ! queue ! video/x-raw,format=BGRx ! videoconvert ! video/x-raw,format=I420,framerate=30/1 ! queue ! vaapiencode_h264 ! h264parse ! queue ! matroskamux ! progressreport ! filesink location=/home/username/Videos/screencast_current_date.mkv
    
    Хотя написано "1.0", на самом деле это приложение называется так же и в
    Gstreamer 1.2, и в 1.4, и т.д. Чтобы команда работала, в вашей системе должен
    быть установлен пакет gstreamer-plugins-vaapi.
    
    Также на AMD и Intel можно кодировать при помощи mpv - вот сравнение
    производительности gst и mpv.
    
    Кодировать на GPU от NVIDIA можно при помощи ffmpeg начиная с версии 2.6.
    Вот пример команды:
    
       ffmpeg -f x11grab -r 30 -s 1920x1080 -i :0.0 -f alsa -i pulse -ac 2 -ar 48000 -acodec libfdk-aac -vcodec nvenc -preset hq -tune film -threads 0 output.mkv
    
    Я использую параметры "-preset hq -tune film", узнать остальные можно, выполнив
    "ffmpeg -h encoder=nvenc"
    
    2. Стриминг в Twitch
    
    rec.sh не знает как это делать, поэтому вручную:
    
       gst-launch-1.0 ximagesrc use-damage=0 ! video/x-raw,format=BGRx ! videoconvert ! video/x-raw,format=I420,framerate=30/1 ! queue leaky=downstream ! x264enc  speed-preset=faster qp-min=30 tune=zerolatency ! queue ! flvmux name=muxer pulsesrc device=alsa_output.pci-0000_00_1b.0.analog-stereo.monitor ! queue ! voaacenc bitrate=128000 ! aacparse ! queue ! muxer. muxer. ! rtmpsink location="rtmp://live.justin.tv/app/live_ВАШ_ID"
    
    Если не работает кодирование аудио, убедитесь что установлен
    
       ffmpeg -f x11grab -s "1920x1080" -r "30" -i :0.0 -f alsa -i pulse -f flv -ac 2 -ar 44100 -vcodec nvenc -s 1280x720 -preset hq -tune film -acodec libmp3lame -threads 0 -strict normal "rtmp://live.justin.tv/app/live_ВАШ_ID"
    
    Также можно просто воспользоваться программным обеспечением  под названием OBS
    
    3. Как задействовать аппаратное кодирование в OpenShot, PiTiVi и других редакторах видео
    
    Первый использует ffmpeg, второй - Gstreamer. Важно чтобы ваш системный ffmpeg
    был скомпилирован с флагами "--enable-nonfree --enable-nvenc". И тогда в списке
    доступных энкодеров появится nvenc. Если и в этом случае он не появляется -
    попробуйте пересобрать libmlt - посредника между OpenShot и ffmpeg.
    
    4. Возможные проблемы
    
    У меня было так, что выбран не тот VA-API backend, и поэтому при запуске
    команды из консоли была ошибка "не удаётся кодировать при помощи
    fglrx_drv_video.so". Возможно что причина в том, что раньше у меня была
    видеокарточка от AMD. Решается так: export LIBVA_DRIVER_NAME=i965. Можно также
    добавить это в /etc/environment.
    
    А вообще, если что-то работает не так то для отладки полезен параметр "export GST_DEBUG=4".
    
    Если не работает стриминг при помощи GStreamer, убедитесь что установлен плагин
    gstreamer-plugins-bad. В openSUSE мне помогла установка пакета gstreamer-plugins-bad-orig-addon.
    
    Для ffmpeg существует патч nvresize, позволяющий кодировать один видеопоток
    сразу в несколько файлов: 240p, 360p, 480p, 720p и 1080p. Патч использует CUDA,
    тогда как основной функционал nvenc использует только аппаратный энкодер.
    Патч применим только к FFmpeg 3.0 и 3.1, а в версии 3.2 он был заменён
    на новую технологию CUVID, умеющую гораздо больше возможностей, и также
    задействующую CUDA.
    
     
    ----* Развёртывание нейросети, используя готовый образ Docker (доп. ссылка 1)   Автор: Abylay Ospan  [комментарии]
     
    Пример быстрого запуска нейросети для классификации объектов на изображениях.
    В системе должен быть установлен docker. Данный пример работает под Linux и
    macOS. Для работы нейросети достаточно CPU (GPU не нужен).
    
    Собственно команда для запуска:
    
       docker run --name segnet --rm -it -v `pwd`/out:/workspace/out aospan/docker-segnet
    
    результат работы будет находиться в каталоге ./out. Вот так выглядят исходные
    картинки и картинки после обработки нейросетью:
    
    
    
    
    
    нейросеть выделила разным цветом объекты относящиеся к разным классам ("стол", "стул" и т.д.)
    
    Для обработки  своих изображений, их необходимо положить в каталог ./in с
    именами  img_001.png,  img_002.png и т.д.
    
    Запуск при этом производить командой:
    
       docker run --name segnet --rm -it -v `pwd`/in:/workspace/in -v `pwd`/out:/workspace/out aospan/docker-segnet
    
    
    Нейросеть позволяет добиться качественного распознавания образов на
    изображении. Применять полученные результаты можно в проектах по безопасности,
    в беспилотных передвижных устройствах (авто, дроны и проч.), бытовой технике и т.д.
    
     
    ----* Настройка видеонаблюдения через веб-камеру ноутбука при помощи VLC   Автор: 赤熊  [комментарии]
     
    Буду краток 
    
       ls -la /dev/video*
       usermod username -aG video
    
    Используется Debian Jessie.
    Стартуем видеозахват с веб-камеры и стримим это всё в порт 8082:
    
       cvlc v4l2:// :v4l2-vdev="/dev/video0" --sout '#transcode{vcodec=x264{keyint=60,idrint=2},vcodec=h264,vb=400,width=800,height=600,acodec=mp4a,ab=32 ,channels=2,samplerate=22100}:duplicate{dst=std{access=http{mime=video/x-ms-wmv},mux=asf,dst=:8082/stream.wmv}}'
    
    
    Для удалённого доступа настроим предварительно ssh по ключам, и отключим
    аутентификацию по паролю. Далее извне (с работы допустим):
    
       ssh somehost -L:8082:localhost:8082
       vlc http://localhost:8082/stream.wmv
    
    Таким образом при включенном ноутбуке можно издалека присмотреться, что же
    делает кот/благоверная/дети/няня/бандиты.
    
     
    ----* Подготовка качественных GIF-файлов из видео при помощи FFmpeg (доп. ссылка 1)   [комментарии]
     
    Появившиеся в FFmpeg 2.6 фильтры для работы с палитрами дали возможность
    существенно увеличить качество преобразования видео в GIF-файлы, за счёт
    создания для них высококачественных палитр.
    
    
    Ранее при необходимости повышения качества GIF-файла можно было отключить
    использование прозрачности, что положительно сказывалось на видео с интенсивным
    движением или изменением цветов. Но отключение прозрачности в несколько раз
    повышало размер файла:
    
       $ ffmpeg -v warning -ss 45 -t 2 -i big_buck_bunny_1080p_h264.mov -vf scale=300:-1 -gifflags -transdiff -y bbb-notrans.gif
       $ ffmpeg -v warning -ss 45 -t 2 -i big_buck_bunny_1080p_h264.mov -vf scale=300:-1 -gifflags +transdiff -y bbb-trans.gif
    
       $ ls -l bbb-*.gif
       -rw-r--r-- 1 ux ux 1.1M Mar 15 22:50 bbb-notrans.gif
       -rw-r--r-- 1 ux ux 369K Mar 15 22:50 bbb-trans.gif
    
    Наиболее оптимальным методом повышения качества преобразования является подбор
    оптимальной палитры, которая для GIF-файлов ограничена 256 цветами. Так как
    создание отдельной палитры для каждого кадра приведёт к расходованию
    дополнительных 768 байт на кадр, имеет смысл подготовить качественную
    глобальную палитру.
    
    Перекодирование разделим на две стадии. На первой стадии сохраним статистику о
    палитрах для каждого кадра при помощи фильтра palettegen. На второй стадии
    создадим сводную палитру при помощи фильтра paletteuse, содержащую цвета,
    близкие к самым часто используемым цветам в кадрах.
    
    Создадим скрипт gifenc.sh:
    
       #!/bin/sh
    
       palette="/tmp/palette.png"
       filters="fps=15,scale=320:-1:flags=lanczos"
    
       ffmpeg -v warning -i $1 -vf "$filters,palettegen" -y $palette
       ffmpeg -v warning -i $1 -i $palette -lavfi "$filters [x]; [x][1:v] paletteuse" -y $2
    
    Для перекодирования следует выполнить:
    
       ./gifenc.sh video.mkv anim.gif
    
    Для перекодирования части изображения (например, начиная с позиции 12:23,
    продолжительностью 35 сек), можно предварительно обрезать ролик командой:
     
       ffmpeg -ss 12:23 -t 35 -i full.mkv -c:v copy -map 0:v -y video.mkv
    
    или воспользовать фильтром trim, поменяв в скрипте строку:
    
       filters="trim=start_frame=12:end_frame=431,fps=15,scale=320:-1:flags=lanczos"
    
    Для оптимизации сводной палитры в фильтре palettegen  можно воспользоваться
    опцией stats_mod. По умолчанию применяется метод  stats_mode=full, при котором
    приоритет отдаётся качеству цветов неизменных частей изображения, таких как
    фон. При указании опции
    stats_mode=diff можно поменять приоритет в сторону изменяющихся частей, таких
    как появляющийся поверх фона текст.
    
    В фильтре paletteuse можно использовать опцию dither для выбора метода
    сглаживания цветов. Предлагается основанный на вероятностном предсказании метод
    dither=bayer (следует подобрать оптимальный размер шаблона через опцию
    dither=bayer:bayer_scale=[1,2,3]) и диффузионные методы dither=floyd_steinberg
    (наиболее популярный), dither=sierra2 (используется по умолчанию) и
    dither=sierra2_4a (быстрый вариант sierra2, учитывающий блоки по 3 пикселя
    вместо 7). Отключить сглаживание можно опцией dither=none.
    
     
    ----* Как задействовать UVD для ускорения декодирования видео в Ubuntu Linux (доп. ссылка 1)   [комментарии]
     
    Для ускорения воспроизведения видео в приложениях поддерживающих API VDPAU с
    использованием аппаратного декодера UVD, присутствующего в GPU AMD, следует
    использовать свежую версию DRM-модуля radeon. Версия с поддержкой UVD войдёт в
    состав ядра Linux 3.10, поэтому для использования UVD до выхода данной ветки
    следует использовать экспериментальное ядро из репозитория drm-next.
    
    
    Устанавливаем заголовочные файлы для VDPAU:
    
       sudo apt-get install libvdpau-dev.
    
    Пересобираем Mesa из Git-репозитория http://cgit.freedesktop.org/mesa/mesa/ При
    выполнении configure следует указать опции "--with-gallium-drivers=r600 --enable-vdpau".
    
    Добавляем в файл /etc/ld.so.conf.d/z.conf строку /usr/local/lib/vdpau и запускаем команду ldconfig.
    
    Ставим пакеты с ядром drm-next (до того как выйдет ядро 3.10), доступные по
    ссылке http://kernel.ubuntu.com/~kernel-ppa/mainline/drm-next/
    
    Устанавливаем прошивку  UVD для используемой карты AMD. Загрузить файл с
    прошивкой можно на данной странице, после чего следует поместить её в
    директорию /lib/firmware.
    
    Перезагружаем систему.
    
    Запускаем любой проигрыватель с поддержкой  VDPAU.
    
     
    ----* Декодирование и создание штрих-кодов QR и Data Matrix в Linux   [комментарии]
     
    Для разбора и кодирования Data Matrix-кодов (оформленный в виде квадрата
    матричный код, состоящий из прямоугольных областей и способный содержать в себе
    несколько килобайт данных) в Linux удобно использовать пакет libdmtx-utils.
    
    Устанавливаем  в Debian/Ubuntu:
    
       sudo apt-get install libdmtx-utils
    
    в Fedora:
    
       sudo yum install libdmtx-utils
    
    
    Кодируем текст из файла test.txt и сохраняем его в изображение test.png:
    
       dmtxwrite  -o test.png test.txt
    
    для управления выводом можно использовать опции:
       "-d N" - задаёт размер модуля в пикселях;
       "-s NxM" - задает размер кодирующих прямоугольников, например, "-s 10x10"
       "-m N" - задаёт отступы от границ изображения в пикселях;
       "-e тип" - задаёт тип кодирования данных:
           b = оптимизация, ориентированная на качество;
           f = оптимизация, ориентированная на скорость;
           a = ASCII (по умолчанию)
           c = C40 (цифры и символы верхнего регистра)
           t = Text (цифры и символы нижнего регистра)
           x = X12  ANSI X12 EDI
           e = EDIFACT (ASCII символы с кодами 32-94)
           8 = Base 256 (все восьмибитные символы)
    
       "-f формат" - задаёт формат изображения для сохранения (список поддерживаемых форматов можно посмотреть через опцию "-l")
    
    Декодируем содержимое Data Matrix-кода, содержащегося в изображении test.png:
    
       dmtxread test.png
    
    
    
    Другие варианты.
    
    Система zbar (http://sourceforge.net/projects/zbar/) позволяет декодировать не
    только QR-коды, но и штрих коды других типов.
    
    Устанавливаем ZBar в Debian/Ubuntu:
    
       sudo apt-get install zbar-tools
    
    в Fedora:
    
       sudo yum install zbar-tools
    
    Декодируем содержимое штрих-кода, содержащегося в изображении test.jpg:
    
       zbarimg test.jpg
    
    
    Еще один вариант декодирования QR-кодов -  использование программы
    libdecodeqr-simpletest из пакета libdecodeqr-examples:
    
       libdecodeqr-simpletest test.jpg
    
    
    
    Для кодирования QR-кодов в Linux можно использовать утилиту qrencode (http://fukuchi.org/works/qrencode/index.en.html):
    
       sudo apt-get install qrencode
    или
       sudo yum install qrencode
    
    Кодируем текст из файла test.txt и сохраняем его в изображение test.png:
    
        qrencode -r test.txt -o test.png
    
    Другие системы кодирования и декодирования QR-кодов:
    * pyqrcode
    * libqr
    * qrcode
    * decodecamera
    * ZXing Decoder Online
    
     
    ----* Создание скринкастов при помощи FFmpeg (доп. ссылка 1)   [комментарии]
     
    Для создания высококачественных скринкастов, видеороликов отражающих
    совершаемые на экране действия, удобно использовать пакет FFmpeg. Для работы
    функции по созданию скринкастов пакет ffmpeg должен быть создан с опцией
    "--enable-x11grab" (уже используется по умолчанию в Ubuntu и многих дистрибутивах).
    
    На первом шаге создаем запись действий на экране, кодеком без потери качества
    (lossless h264), чтобы потом можно было подготовить несколько версий ролика в
    разных форматах (например, можно отдельно создать вариант для YouTube и версии
    с разным качеством кодирования):
    
       ffmpeg -f alsa -ac 2 -i pulse -f x11grab -r 30 -s 1024x768 -i :0.0 \
          -acodec pcm_s16le -vcodec libx264 -vpre lossless_ultrafast -threads 0 output_ll.mkv
    
    где, 
       "-f alsa -ac 2 -i pulse -acodec pcm_s16le" - записываем стереозвук кодеком  pcm_s16le (без потери качества) с использованием звукового сервера PulseAudio (для Linux-систем без PulseAudio можно попробовать "-f alsa -ac 2 -i /dev/dsp" или "-f oss -ac 2 -i /dev/dsp")
       "-f x11grab" - драйвер для записи с экрана;
       "-r 30" - число кадров в секунду (FPS);
       "-s 1024x768 -i :0.0" - размер видео и смещение позиции на экране, напирмер, указав "-s 800x600 -i :0.0+200,100" можно организовать запись блока 800x600 со смещением 200x100 относительно верхнего левого угла экрана;
       "-vcodec libx264 -vpre lossless_ultrafast" - выбираем кодек libx264 без потери качества.
    
    На втором шаге перекодируем созданный ролик в более компактное представление и
    отрезав лишние хвосты:
    
    MP4/h.264:
    
       ffmpeg -ss 00:00:15 -t 00:05:01 -i output_ll.mkv -acodec libfaac \
          -ab 128k -ac 2 -vcodec libx264 -vpre slow -crf 22 -threads 0 video.mp4
    
    Через опции "-ss 00:00:15 -t 00:05:01" организован пропуск первых 15 секунд
    записи и вырезано несколько секунд перед концом (записывается ровно 5 минут и 1 секунда).
    
    OGG/Theora:
    
       ffmpeg -ss 00:00:15 -t 00:05:01 -i output_ll.mkv -acodec libvorbis \
          -ab 128k -ac 2 -vcodec libtheora -b 1000k video.ogg
    
    Matroska/h.264:
    
       ffmpeg -ss 00:00:15 -t 00:05:01 -i output_ll.mkv -acodec libvorbis \
          -ab 128k -ac 2 -vcodec libx264 -vpre slow -crf 22 -threads 0 video.mkv
    
    AVI/xvid:
    
       ffmpeg -ss 00:00:15 -t 00:05:01  -i output_ll.mkv -acodec libmp3lame -ab 128k -ac 2 \
          -vcodec libxvid -qscale 8 -me_method full -mbd rd -flags +gmc+qpel+mv4 -trellis 1 \
          -threads 0 our-final-product.avi
    
    Если необходимо в процессе записи ролика отвлечься и прервать запись, разные
    куски можно записать в отдельные файлы, а затем объединить их командой mkvmerge:
    
       mkvmerge -o complete.mkv part1.mkv +part2.mkv +part3.mkv +part4.mkv
    
     
    ----* Автоматическая обработка фотографий   Автор: Карбофос  [комментарии]
     
    После покупки сканера для фотоплёнок и его применения у меня возникло несколько сложностей:
    
    1. переименование последовательности фотографий в случае сканирования в обратном порядке
    2. автоматическое переворачивание фотографий относительно какой-то оси. Если
    фотография вверх ногами, то это можно разобрать сразу,
    но если у изображений перепутаны стороны, то такое бросается в глаза далеко не
    сразу. Например, это заметно только по одной-двум фотографиям из всей плёнки.
    3. автоматическая обработка мелких дефектов в конвейере, с наиболее полным
    использованием ядер процессора
    
    Для реверсивной последовательности списка имён файлов и изменения в нормальную
    я написал этот скрипт
    
        #!/bin/bash
        #
        # reversenames.sh
        #
        # маска для моих файлов после сканирования
    
        DEFMASK="*.JPG"
    
        REVLIST=$(ls -r *.JPG)
        REVARRAY=($REVLIST)
    
        # только до половины списка обрабатывать
        len=`expr ${#REVARRAY[@]} / 2`
    
        echo "$len"
        j=0
        for i in $DEFMASK; do
          if [ ! -e $i ]; then
            echo "Error: current directory must contain files with the mask $MASK"
            echo
            exit 1
          fi
    
          echo "rename $i -> ${REVARRAY[j]}"
          mv $i $i.old
          mv ${REVARRAY[j]} $i
          mv $i.old ${REVARRAY[j]}
    
          j=`expr $j + 1`
          if [ $j -eq $len ]; then
            break
          fi
    
        done
    
        echo "ready"
    
    
    Для случая, когда нужно поменять стороны фотографий местами я дополнил скрипт,
    найденный в интернете для кручения фотографий на определённый угол. Вот
    расширенная версия этого скрипта:
    
        #!/bin/bash
        #
        # jpegsrotate.sh
        #
    
        if [ -z `which jpegtran` ]; then
          usage
          echo "Error: jpegtran is needed"
          echo
          exit 1
        fi
    
        shopt -s extglob
    
        DEFMASK="*.JPG"
        DEFEVENMASK="*[02468].JPG"
        DEFODDMASK="*[13579].JPG"
        FLIPMASK=""
        DEFDEG=270
    
        function usage() {
          echo
          echo "usage:"
          echo "$0"
          echo "    rotates files with the mask $DEFMASK by $DEFDEG degrees clockwise"
          echo "$0 --even"
          echo "    rotates even files with the mask $DEFEVENMASK by 180 degrees"
          echo "$0 --odd"
          echo "    rotates odd files with the mask $DEFODDMASK by 180 degrees"
          echo "$0 --params \"REGEXP\" (90|180|270)"
          echo "    rotates files with the mask REGEXP by the given aspect ratio clockwise"
          echo "$0 --flip [h|v]"
          echo "    flip pictures horizontal or vertical"
          echo
        }
    
        if [ "$1" == "--even" ]; then
          MASK=$DEFEVENMASK
          DEG=180
        elif [ "$1" == "--odd" ]; then
          MASK=$DEFODDMASK
          DEG=180
        elif [ "$1" == "--flip" ]; then
          MASK=$DEFMASK
          if [ "$2" == "v" ]; then
            FLIPMASK="vertical"
          else
            FLIPMASK="horizontal"
          fi
        elif [ "$1" == "--params" ]; then
          if [ -n "$2" -a -n "$3" ]; then
            MASK=$2
            DEG=$3
          else
            usage
            exit 1
          fi
        elif [ -n "$1" ]; then
          usage
          exit 1
        else
          MASK=$DEFMASK
          DEG=$DEFDEG
        fi
        echo $MASK
        for i in $MASK; do
          if [ ! -e $i ]; then
            usage
            echo "Error: current directory must contain files with the mask $MASK"
            echo
            exit 1
          fi
          echo "$i"
          if [ "$1" == "--flip" ]; then
            jpegtran -flip $FLIPMASK $i > $i.flipped
            mv $i.flipped $i
          else
            jpegtran -rotate $DEG $i > $i.rotated
            mv $i.rotated $i
          fi
        done
    
    Скрипт нужно вызвать следующим образом (флипнуть по горизонтали):
    
       ./jpegsrotate.sh --flip h
    
    Как видно, необходимо наличие программы jpegtran.
    
    Третий пункт с автоматической обработкой самый интересный. Для этих целей я
    выбрал программу ImageMagick не по каким-то причинам. Позже я испробую подобную
    обработку с GIMP, но в этот раз я использовал достаточно интересный ресурс со
    скриптами для обработки изображений http://www.fmwconcepts.com/imagemagick с
    кучей примеров и результатов обработки при вызове скриптов с определёнными параметрами.
    
    Затем я использовал готовый скрипт для циклической обработки графических файлов
    в директории. Скрипт взял здесь.
    
    Но несколько его видоизменил для использования нескольких ядер процессора.
    
        #!/bin/bash 
        # loop_for_fotos.sh
        #
        #проверяем, установлен ли convert
        convert > /dev/null
        if [ $? -ne 0 ] ; then 
          echo "Error: convert is needed, it's a part of ImageMagick" ;
        fi;
        DIR=$1;
        # велосипед, убирающий "/" в конце 
        if [ -z $1 ]; then $DIR=`pwd`; 
        else
          TEMP=`pwd`;
          cd $DIR; TEMP2=`pwd`; 
          cd $TEMP;
          DIR=$TEMP2;
          echo $TEMP2;
        fi; 
        #наши старые файлы копируем в DIR.orig
        echo $DIR
        mkdir $DIR/orig;
        for i in `ls $DIR/*.JPG`; 
        do
          cp $i orig/;
        done;
        ERR=0;
        CPUS=1;
    
        echo "Start in " $DIR
    
        files=$(ls $DIR/*.JPG)
        list=($files)
        len=${#list[@]}
    
        echo $len
        for(( i=0; i<$len ; i=i+$CPUS))
        do
          for(( j=0; j<$CPUS ; j++))
          do
            if [ ${list[i+j]} ]; then
              ./denoise -f 2 -s "20x20+203+152" ${list[i+j]} ${list[i+j]}.den.jpg && ./isonoise -r 5 ${list[i+j]}.den.jpg ${list[i+j]}.iso.jpg &
            fi
          done;
    
          for job in `jobs -p` 
          do 
            echo $job 
            wait $job || let "FAIL+=1" 
          done;
        
          if [ $? -eq 0 ]; then 
            echo "denoise, isonoise successfully ;) next step"; 
          else ERR=$[$ERR+1]; #считаем ошибки
          fi;
    
          for(( j=0; j<$CPUS ; j++))
          do
            if [ ${list[i+j]} ]; then
              rm  ${list[i+j]}.den.jpg
            fi
          done;
    
        done;
    
        CPUS=2;
    
        echo "Start in brightness calibration"
    
        for(( i=0; i<$len ; i=i+$CPUS))
        do
          for(( j=0; j<$CPUS ; j++))
          do
            if [ ${list[i+j]} ]; then
              ./omnistretch -m HSB -ab 1 -s 1.5 ${list[i+j]}.iso.jpg ${list[i+j]} &
            fi
          done;
    
          for job in `jobs -p` 
          do 
            echo $job 
            wait $job || let "FAIL+=1" 
          done;
        
          if [ $? -eq 0 ]; then 
            echo "omnistretch successfully ;) next step"; 
          else ERR=$[$ERR+1]; #считаем ошибки
          fi;
    
          for(( j=0; j<$CPUS ; j++))
          do
            if [ ${list[i+j]} ]; then
              rm  ${list[i+j]}.iso.jpg
            fi
          done;
    
        done;
    
        if [ $ERR -eq 0 ]; then 
          echo "Job done!";
        else echo "Job done with some errors.";
        fi;
        echo "You can find your old files in $DIR.orig"
        #end
    
    Вызываем скрипт с параметром "." для актуального директория, где находятся наши фотографии.
    
    В первом цикле я использовал вызов двух скриптов 
    
        ./denoise -f 2 -s "20x20+203+152" ${list[i+j]} ${list[i+j]}.den.jpg \
        && ./isonoise -r 5 ${list[i+j]}.den.jpg ${list[i+j]}.iso.jpg
    
    для последовательного отфильтровывания небольших дефектов. В этих скриптах
    задействованы оба ядра, поэтому для цикла обработки использовалась переменная
    CPUS=1, если в вашем процессоре четыре ядра, то можете увеличить значение в два
    раза и т.д.
    
    Для цикла обработки яркости 
    
       ./omnistretch -m HSB -ab 1 -s 1.5 ${list[i+j]}.iso.jpg ${list[i+j]} &
    
    уже использовалось вызов двух скриптов одновременно, т.к. при вызове одного
    используется только одно ядро. Поэтому значению переменной CPUS перед циклом
    было присвоено 2.
    
    Конечно, скрипт можно несколько улучшить, встроив автоматическое распознание
    количества ядер в системе. Но это уже - по желанию.
    
     
    ----* Скрипт для нарезки видео для Youtube (доп. ссылка 1)   Автор: bst  [комментарии]
     
    Простой скрипт для нарезки видео для Youtube. Использует mplayer и ffmpeg, так
    что эти пакеты должны быть установлены, желательно из debian-multimedia. По
    умолчанию режет видео на куски по 14 минут 50 секунд, это значение можно
    поменять. Например
    
       ./video_split.sh film.avi
    
    порежет видео на три части с именами part000-film.avi, part001-film.avi,
    part002-film.avi, длительностью 14:50 каждая (890 секунд), а
    
       ./video_split.sh 445 film.avi
    
    порежет видео на шесть частей длительностью 7:25 (445 секунд) каждая.
    
    Скрипт video_split.sh:
    
       #!/bin/sh
    
       usage()
       {
           echo "Usage:"
           echo "    $0 [time frame in seconds] <file name>"
       }
    
       set -e
    
       # part length in seconds by default
       part=890
    
       # check parameters
       if [ $# -eq 2 ]; then
           part="$1"
           file="$2"
       elif [ $# -eq 1 ]; then
           file="$1"
       else
           usage
           exit 1
       fi
       if [ -z "$file" ]; then
           usage
           exit 1
       fi
    
       # counters
       i=0
       secs=0
    
       # video length in seconds
       len=`mplayer -identify -frames 0 "$file" 2>/dev/null | grep '^ID_LENGTH=' | sed 's/ID_LENGTH=//;s/\..*//'`
    
       echo "Video length: $len"
    
       # split
       while [ $secs -lt $len ]; do
           suffix=`printf '%03d' $i`
           ffmpeg -vcodec copy -acodec copy -ss $secs -t $part -i "$file" "part${suffix}-${file}"
           i=`expr $i + 1`
           secs=`expr $secs + $part`
       done
    
     
    ----* Преобразование SWF-видео в AVI или OGG (доп. ссылка 1)   [комментарии]
     
    Для преобразования видеоролика, упакованного в SWF-файл (не в FLV), можно
    использовать скрипт edit.py из пакета pyvnc2swf:
    
       sudo apt-get install pyvnc2swf ffmpeg
    
    Файл edit.py находится в директории /usr/share/pyvnc2swf/
    
       apt-file search edit.py
       pyvnc2swf: /usr/share/pyvnc2swf/edit.py
    
    Преобразуем SWF в FLV:
    
       /usr/share/pyvnc2swf/edit.py -o test.flv test.swf
    
    Для перекодирования в AVI или OGG используем ffmpeg
    
       ffmpeg -i test.flv output.ogg
    или
       ffmpeg -i test.flv output.avi
    
     
    ----* Удаление из файла с фотографией всех EXIF-тегов, кроме GPS (доп. ссылка 1)   Автор: sanmai  [комментарии]
     
    Для загрузки картинки в Wikipedia иногда требуется почистить все EXIF-теги,
    оставив только территориальную привязку. Сделать этом можно при помощи утилиты exiftool:
    
       exiftool -overwrite_original -all= -tagsfromfile @ -gps:all file.jpg
    
     
    ----* Настройка DLNA-сервера для обращения к мультимедиа коллекции с телевизора (доп. ссылка 1)   Автор: Karapuz   [комментарии]
     
    В современной бытовой технике, например в телевизоре Samsung LE32B652T4W,
    поддерживается протокол DLNA (http://ru.wikipedia.org/wiki/DLNA), позволяющий
    организовать обращения к контенту других устройств. Было решено расшарить
    мультимедиа контент через DLNA-сервер под Linux.
    
    
    Исследуем варианты
    
    Судя по статье на elinux.org существует 3 реализации DLNA сервера под Linux:
    
    1. uShare
    2. Rygel
    3. minidlna
    
    Не буду писать много про преимущества и недостатки каждого. Скажу просто, Rygel
    у меня вылетел и высыпал в консоль кучу отладочной информации. uShare
    заработал, но остановился на сканировании первого же каталога. Не понимает он
    кириллицу. Проблема известная и вроде как не решена, впрочем я сильно не
    исследовал этот вопрос, потому могу ошибаться. Остался minidlna. И он у меня
    заработал на ура.
    
    Настраиваем и поднимаем
    
    Скачиваем последнюю версию сервера и распаковываем архив. Внутри не будет
    исходников, там лежит бинарник minidlna и файл конфигурации minidlna.conf. Файл
    конфигурации копируем в /etc, а бинарник в /usr/sbin.
    
    Приступим к конфигурированию сервера. Ни чего сложного в этом нет. Приведу
    часть моего конфига, ту, которую я изменил.
    
    
       media_dir=V,/media/hdd/Медиа/Видео
       media_dir=A,/home/user/Моя музыка
       media_dir=P,/home/user/Мои рисунки
    
       notify_interval=60
    
    
    То есть я указал путь для контента (media_dir=). При этом буквы V, A и P
    указывают на характер контента. V - видео, A - аудио и P - картинки. Можно без
    этих букв, просто после знака равно сразу указать путь. Обратите внимание,
    название некоторых каталогов - minidlna все кушает на ура, даже пробелы не
    нужно экранировать.
    
    Параметром notify_interval указан интервал в секундах для автоматического
    обнаружения новых файлов. Иногда, после копирования нового фильма, хочется
    сразу его посмотреть, и не ждать 900 секунд, которые установлены по умолчанию.
    
    Запускаем
    
    Все просто
    
       minidlna -d -f /etc/minidlna.conf
    
    и можно идти и смотреть фильмы. Но как быть с автозапуском? Можно конечно
    поместить команду в стандартный гномовский или кдешный автозапуск. Но на мой
    взгляд лучше воспользоваться init.d скриптом.
    
    
       #! /bin/sh
    
       # chkconfig: 345 99 10
       # description: Fedora Startup/shutdown script for MiniDLNA daemon
    
       # If you have chkconfig, simply:
       # chkconfig --add minildna
    
       # Original author: Perry Clark
    
       ## BEGIN INIT INFO
       # Provides: minidlna
       # Required-Start: $local_fs $remote_fs $syslog $network
       # Should-Start:
       # Required-Stop: $local_fs $remote_fs $syslog $network
       # Should-Stop:
       # Default-Start: 3 4 5
       # Default-Stop: 0 1 2 6
       # Short-Description: Minidlna
       # Description: DLNA Media Server
       ### END INIT INFO
    
       ## EDIT FROM HERE
    
       # Installation details
       MINIDLNA="/usr/sbin/minidlna"
       ARGS="/etc/minidlna.conf"
    
       # Where to keep a log file
       MINIDLNA_LOG="/var/log/minidlna.log"
    
       # Where the PID lives
       PID_FILE="/var/run/minidlna.pid"
    
       ## STOP EDITING HERE
    
       # The path that is to be used for the script
       PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
    
       set -e
    
       # Only start if we can find the minidlna.conf.
       test -x $MINIDLNA || exit 0
    
       # Parse command line parameters.
       case $1 in
         start)
           echo -n "Starting MiniDLNA: "
           $MINIDLNA -f $ARGS -P $PID_FILE >> $MINIDLNA_LOG 2>&1
           echo "ok"
           ;;
         stop) 
          echo -n "Stopping MiniDLNA: "
            for pidf in `/bin/ls $PID_FILE 2>/dev/null`; do
             if [ -s $pidf ]; then
               kill `cat $pidf` >/dev/null 2>&1
             fi
                 rm -rf $PIF_FILE
             done 
          echo "ok"
          ;;
         restart|reload|force-reload)
         echo "Restarting MiniDLNA: "
       
         $0 stop
           sleep 2
           $0 start
    
           ;;
         *)
             # Print help
             echo "Usage: /etc/init.d/minidlna {start|stop|restart|       reload|force-reload}"
             exit 1
             ;;
       esac
    
       exit 0
    
    Называем скрипт minidlna, копируем в /etc/init.d, присваиваем права 755 и добавляем в автозапуск.
    
       chmod 755 minidlna
       sudo chkconfig minidlna on
    
    Запускать и останавливать minidlna вручную можно командами:
    
       sudo /etc/init.d/minidlna start
       sudo /etc/init.d/minidlna stop
    
    После запуска minidlna будет сканировать каталоги с контентом. Это может занят
    несколько минут. За ходом сканирования можно следить в файле
    /tmp/minidlna/minidlna.log. Если после изменения путей в файле конфигурации
    телевизор не видит новых каталогов, попробуйте удалить /tmp/minidlna/files.db и
    перезапустить сервер.
    
    И напоследок, телевизор и сервер подключены через WiFi маршрутизатор D-Link DIR-300.
    
     
    ----* Организация вещания потокового Flash-видео средствами ffserver и ffmpeg (доп. ссылка 1)   Автор: wizard  [комментарии]
     
    ffserver идёт в комплекте с ffmpeg и выполняет роль медиа-сервера - получает
    видеопоток от ffmpeg, который может быть запущен на другой машине, и раздаёт
    его пользователям.
    
    Каждый получаемый поток называется Feed-ом (далее будет просто фид). Таких
    потоков может быть несколько, так же как и отдаваемых (выходных). FFmpeg у нас
    будет захватывать видео с веб-камеры или читать из файла.
    
    Сначала настроим ffserver, правим /etc/ffserver.conf:
    
       Port 8090
       BindAddress 0.0.0.0
       MaxClients 100
       MaxBandwidth 20000
       NoDaemon
      
       # Фид, надо запомнить feed.ffm, он нам потребуется при запуске ffmpeg
       <Feed feed.ffm>
          File /tmp/feed.ffm
          FileMaxSize 3M
       </Feed>
       <Stream test.flv>
          # Ранее объявленный фид
          Feed feed.ffm
          Format flv
          VideoCodec flv
          VideoFrameRate 30
          VideoBufferSize 80000
          VideoBitRate 200
          # Качество видео от 1 до 31, 1 == отлично 31 == фи!
          VideoQMin 1
          VideoQMax 5
          # Разрешение, везде должно быть одинаково!
          VideoSize 352x288
          PreRoll 1
          # Если у вас есть микрофон, или вы транслируете видео со звуком, закомментируйте эту строчку
          Noaudio
       </Stream>
       
       # Флешка test.swf для просмотра трансляции
       <Stream test.swf>
          Feed feed.ffm
          # Будет запускаться в Adobe Flash Player
          Format swf
          VideoCodec flv
          VideoFrameRate 30
          VideoBufferSize 50000
          VideoBitRate 100
          VideoQMin 1
          VideoQMax 5
          # Разрешение, везде должно быть одинаково!
          VideoSize 352x288
          PreRoll
          # Если у вас есть микрофон, или вы транслируете видео со звуком, закомментируйте эту строчку
          46. Noaudio
       </Stream>
    
    Запускаем ffserver:
    
       $ ffserver
    
    Запускаем ffmpeg:
    
       $ ffmpeg -s 352x288 -r 30 -f video4linux2 -i /dev/video0 http://localhost:8090/feed.ffm
    
    -s разрешение, указанное в конфурации ffserver, 
    -r количество кадров/секунду, 
    -f формат, 
    -i путь к камере (или к видео-файлу), 
    http://localhost:PORT/FEED - это адрес, где ffserver будет ждать наш поток
    
    PS: если выдаст ошибку, то можно попробовать формат v4l (-f video4linux)
    
    Открываем в браузере http://localhost:8090/test.swf 
    
    
    Для отправки видео поменяем параметр -i на путь к файлу, уберём -f (ffmpeg сам
    определит формат файла):
    
       $ ffmpeg -s 352x288 -r 30 -i ~/big_buck_bunny.ogg http://localhost:8090/feed.ffm
    
    Ну а что бы вставить нашу флешку в html-страницу используем следующий код:
    
       <embed src="http://localhost:8090/test.swf" width="550" height="400"></embed>
    
     
    ----* Преобразование MKV видеофайлов в формат AVI (доп. ссылка 1) (доп. ссылка 2)   [комментарии]
     
    Для перекодирования видео, упакованного в контейнер MKV (Matroska), можно
    использовать следующую конструкцию:
    
    Распаковываем:
     
       mkvextract tracks input.mkv 1:temp_video.avi 2:temp_audio.ac3 3:output.srt
    
    Утилита mkvextract входит в состав стандартного пакета mkvtoolnix, ее можно загрузить 
    со страницы http://www.bunkus.org/videotools/mkvtoolnix/)
    В процессе работы mkvextract покажет какой в данном mkv файле использован видео и аудио кодек,
    что даст возможность принять решение - прекодировать другим кодеком или нет. 
    
    Объединяем в AVI:
    
       ffmpeg -i temp_audio.ac3  -i temp_video.avi  -vcodec copy -acodec copy  output.avi
    
    Если ffmpeg в процессе кодирования выдает ошибку и прекращает работу, можно попробовать:
    
       mencoder temp_video.avi -audiofile temp_audio.ac3  -ovc copy -oac copy -o output.avi
    
    Еще способ:
       mencoder input.mkv -ovc copy -oac copy -of avi -o output.avi
    
    Другой вариант, с перекодированием:
    
       mencoder input.mkv -oac mp3lame -lameopts vbr=3 -ovc xvid -xvidencopts fixed_quant=4 -of avi -o output.avi
    
    Если возникает ошибка "Too many audio packets in the buffer", то можно
    попробовать двухэтапную схему:
    
    Выдергиваем несжатую аудиодорожку:
       mplayer input.mkv -ao pcm:fast:file=audio.wav -vc null -vo null
    
    Перекодируем видео, подставив звук через "-audiofile audio.wav":
       mencoder input.mkv -ffourcc divx -ovc lavc -lavcopts vcodec=mpeg4:vhq:vbitrate=6000 \
        -audiofile audio.wav -oac mp3lame -lameopts vbr=3 -o output.avi
    
    Для конвертации для просмотра на КПК нужно уменьшить vbitrate до 400 и добавить
    опции масштабирования "-sws 2 -vf scale=352:-3".
    
     
    ----* Акселерация декодирования видео в Ubuntu для карт NVIDIA средствами VDPAU (доп. ссылка 1)   Автор: Владимир Яковлев  [комментарии]
     
    VDPAU поддерживается видеокартами nvidia серии 9000 и некоторых 8xxx (напирмер, 8500GT). 
    Технология позволяет использовать аппаратную акселерацию декодирования HD видео с 
    кодеками H.264/X.264 и VC-1 (xvid, divx, wmv).
    
    Результат: декодирование x.264, FullHD 1920x1080 с 1-2% нагрузкой на процессор. 
    Без VDPAU процессор не справляется, и видео идет рывками, 5-6 кадров в секунду.
    
    Для использования VDPAU необходимо установить новую версию видеодрайвера (nvidia 180, 
    который ставит ubuntu подходит) и пропатченый плеер.
    
    
    Добавляем источник программ:
    
       sudo -i
       cat > /etc/apt/sources.list.d/vdpau.list <<"EOF"
       deb http://ppa.launchpad.net/nvidia-vdpau/ppa/ubuntu jaunty main
       deb-src http://ppa.launchpad.net/nvidia-vdpau/ppa/ubuntu jaunty main
       EOF
    
    получаем открытый ключ для него
    
       apt-key adv --keyserver keyserver.ubuntu.com --recv-keys CEC06767
    
    обновление программ
    
       apt-get update
       apt-get install mplayer smplayer
    
    
    Проверяем:
    
       mplayer -vo vdpau -vc ffmpeg12vdpau,ffh264vdpau, film.mkv
    
    
    Для графической оболочки smplayer нужно в настройках поставить видеовывод (vo) vdpau 
    и на закладке дополнительно-настройки mplayer вписать
    
       -vc ffh264vdpau,ffmpeg12vdpau, 
    
    Советую отключить "позволять выпадение кадров", иначе будет медленно
    перематывать (без vdapu эффект обратный).
    
    Если при проигрывании появляются надписи типа "ffh264vdpau not found in libavcodec", 
    то нужно поставить полную версию кодеков:
    
       sudo apt-get install libavcodec-unstripped-52 libavformat-unstripped-52
    
     
    ----* Удаление из фильмов английской звуковой дорожки (доп. ссылка 1)   Автор: ffsdmad   [комментарии]
     
    Многие фильмы содержат кроме звуковой дорожки на русском языке, еще и оригинальную на английском, 
    которая потребляет дополнительных 40-60 мегабайт места на диске.
    
    Чтобы узнать количество дорожек в целой группе фильмов нужно использовать команду
    
       $ for f in *.avi; do echo -n "$f / " ; mplayer -endpos 0 -vo null "$f" 2> /dev/null | grep "Audio stream found"|wc -l ; done
    
    А избавиться от ненужных дорожек можно так (с заменой старых файлов):
       for f in *.avi ;do mencoder -alang ru -ovc copy -oac copy "$f" -o "$f.t" && mv "$f.t" "$f" ; done 
    
    Важны опции:
    
     -ovc copy и -oac copy - просто копируют выбранные аудио и видео потоки без какой либо обработки
    
     -alang ru - выбирает русскоязычную дорожку
    
     
    ----* Захват видео с ip-камер с пробросом на программы видеонаблюдения   Автор: Андрей Никитин  [комментарии]
     
    Большинство современных ip-камер умеют отдавать потоковое видео двумя основными способами:
    
    1) по протоколу http: в виде потока jpeg-ов (Motion JPEG)
      - поддерживается почти любым софтом - Motion, Zoneminder, AVReg ...
    
    2) по протоколам rtsp:(управление), rtp:(транспорт) и сжатием - mpeg4 (обычно)
      - поддержка захвата по rtsp недавно заявлена только у Zoneminder,
        однако работает ли и как работает - я не проверял,
        если кто пользовал - напишите в комментах.
    
    Прим.: речь НЕ про фирменный платный или бесплатный софт, поставляемый
    в комплекте с ip-камерой, а про универсальный софт видеонаблюдения,
    не завязанный на конкретного производителя или даже модели сетевых видеокамер.
    
    Однако есть небольшое количество камер, которые:
    
    1) могут отдавать видео только по rtsp, например D-Link DCS-950;
     или
    
    2) по http могут отдавать только одиночные кадры JPEG (snapshot mode или still image),
      что создаёт лишнюю нагрузку на сеть (при http/1.0) и не позволяет получить
      высокую и стабильную скорость захвата (условно выше 10fps)
      Примеры: D-Link DCS-2000+, DCS-2100, DCS-3230, DCS-5300.
    
    Прим.: модельный ряд D-Link-а выбран исключительно из за распространённости,
    а также потому, что у других уважаемых производителей моделей с подобными
    функциональными ограничениями лично я не встречал.
    
    Ниже предлагаю вариант сопряжения подобных устройств с выше обозначенным софтом.
    Важное замечание: серьёзными недостатками этого метода являются последствия
    дополнительного лишнего декодирования (из mpeg4) и кодирования видео (в jpeg):
    
    1) существенная нагрузка на процессор (+20% на 2.4ГГц Intel-е, поток 640x480@25fps);
    
    2) потеря в качестве изображения.
    
    Итак, к делу - SYNOPSIS.
    
       % vlc --intf dummy rtsp://x.x.x.x:554/mpeg4/media.amp --no-sout-audio \
         --sout '#transcode{vcodec=MJPG}:standard{ \
            access=http{mime=multipart/x-mixed-replace;boundary=myboundary}, \
              mux=mpjpeg,dst=:8050/video.mjpg}'
    
       VLC media player 0.8.6h Janus
       [00000289] dummy interface: using the dummy interface module...
       [00000306] main private: creating httpd
    
    Где, vlc - это vlc, x.x.x.x:554 - адрес и rtsp порт сетевой камеры,
    8050 - порт http, с которого можно забирать живой поток с камеры в виде Motion JPEG.
    
    Ниже привожу детали для конкретно заинтересованных.
    
       % sudo netstat -atunp -l | grep vlc
       tcp        0      0 x.x.x.x:60868     x.x.x.x:554   ESTABLISHED 7719/vlc
       # это комп<->камера rtsp
       udp        0      0 0.0.0.0:50750     0.0.0.0:*                 7719/vlc
       udp        0      0 0.0.0.0:50751     0.0.0.0:*                 7719/vlc
       udp        0      0 0.0.0.0:48576     0.0.0.0:*                 7719/vlc
       udp        0      0 0.0.0.0:48577     0.0.0.0:*                 7719/vlc
       # это транспортные соединения rtp для аудио и видео потоков
    
       tcp        0      0 0.0.0.0:8050      0.0.0.0:*      LISTEN     7719/vlc
       # а вот он и желаемый результат - http-сервер, с которого мы будем забирать MJPEG
    
    Проверяем доступность httpd.
    
       % HEAD http://localhost:8050/video.mjpg
       200 OK
       Cache-Control: no-cache
       Content-Length: 0
       Content-Type: multipart/x-mixed-replace;boundary=myboundary
       Client-Date: Fri, 04 Sep 2009 11:43:37 GMT
       Client-Peer: 127.0.0.1:8050
       Client-Response-Num: 1
    
    Ну и наконец смотрим.
    
       % ffplay http://localhost:8050/video.mjpg
    
    Примечание: ffplay (из пакета ffmpeg) - единственный плеер в Debian 5.0 Lenny,
    который отобразил этот поток.
    
    Проверяли мы с камерой Axis,
      только видео - rtsp://192.168.53.90:554/mpeg4/media.amp/trackID=1
    
    Настройки Axis:
     Video Stream:
       * Maximum frame rate: Unlimited
     MPEG4(MP4V-ES):
       * Variable bit rate
       * GOV length: 12
       * Maximum bit rate: limited, 3000 kbit/s
       * Variable bit rate
    
    Поток получался 640x480@25fps.
    
     
    ----* Кодирования видео с miniDV видеокамеры в Linux (доп. ссылка 1)   Автор: itbg  [комментарии]
     
    Задача: Сбросить видео на ПК и пережать его для последующего хранения.
    
    Нам потребуется:
    
    1) Ядро с поддержкой FireWire 1394 или v4l (смотря кто как будет скидывать видео)
    
    2) Программа dvgrab (собственно с её помощью мы будем грабить видео с miniDV кассеты из консоли)
    
    3) Программа mencoder (Входит в поставку с видео плеером mplayer)
    
    4) Программа avimerge для склеивания нескольких avi файлов в один (входит в состав transcode)
    
    Грабим видео:
    
    Для начала нам потребуется подключить видеокамеру к ПК.
    В случае с FireWire 1394 никаких драйверов нам не нужно, просто подключаем и работаем.
    В случае подключения камеры по средствам USB нам нужно определиться с её поддержкой ядром Linux.
    Как мы уже знаем, сделать это можно с помощью команды lsusb и затем
    скомпилировать подходящий модуль ядра.
    Я решил упростить себе жизнь и просто купил внешнюю карту FireWire 1394.
    
    Для начала установим пакет dvgrab
    
    Затем нам нужно перемотать miniDV кассету на начало и подключить камеру к ПК.
    
    Теперь перейдём к процессу копирования видео:
    
    Утилита dvgrab имеет множество полезных параметров, давайте рассмотрим некоторые из них:
    
    -a, -autosplit - Этот параметр отвечает за нарезку видеофайлов, т.е dvgrab
    будет резать видео автоматические на куски,
    между нажатиями на кнопку запись/стоп. Это очень удобно если Вы хотите рассортировать сюжеты.
    
    -f, -format - Позволяет в ручную задать формат видео потока, если параметр не
    задан, то dvgrab автоматически
    попытается определить формат данных. Если у Вас hdv камера то нужно обязательно
    указать этот параметр.
    
    -F, -frames - Количество кадров
    
    -s, -size - Устанавливает лимит на видео файл. По умолчанию установлен размер 1024 мегабайта, 
    что удобно если Вы монтируете DVD диск.
    
    -V, -v4l2 - Если Вы планируете скинуть видео через драйвер v4l2
    
    Об остальных параметрах можно почитать man dvgrab
    
    В моём случае я воспользовался вот такой конструкцией:
    
        dvgrab -format raw -size 20000 cam.dv
    
    Поскольку размер одной кассеты около 13 Гб, то всё видео будет сохранено одним файлом,
    это для удобства кодирования.
    
    Кодируем видео:
    
    Первый проход:
    
       mencoder cam001.dv -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=1800:vhq:vpass=1:vqmin=1:vqmax=31 \
       -oac mp3lame -lameopts vbr=2:q=7 -o mpeg4.avi -vf field,scale=768:576 -aspect 4:3
    
    Второй проход:
    
       mencoder cam001.dv -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=1800:vhq:vpass=2:vqmin=1:vqmax=31 \
       -oac mp3lame -lameopts vbr=2:q=7 -o mpeg4.avi -vf field,scale=768:576 -aspect 4:3
    
    При таких параметрах 1 час видео занимает около 800 Мб
    При необходимости можно изменить битрейт видео и звука для достижения желаемого качества.
    
    
    Склеиваем видео:
    
    Для склеивания видео в один большой файл мы воспользуемся утилитой avimerge.
    Делается это очень просто:
    
       avimerge -o com.avi -i 1.avi 2.avi 3.avi
    
    Где com.avi - это итоговый видео файл, а 1.avi 2.avi 3.avi - это видео файлы,
    предназначенные для склеивания.
    
     
    ----* Как исправить дату в EXIF блоке фото (доп. ссылка 1)   Автор: jetxee  [обсудить]
     
    При необходимости изменения времени в EXIF блоке фотографий, например, при неправильной 
    установке даты на фотоаппарате, можно использовать утилиту exiftool.
    
    Например, вычтем из установленной даты один год и 13 часов:
    
       exiftool "-DateTimeOriginal-=1:0:0 13:00:00" *.jpg
    
    Варианты до изменения будут сохранены с окончанием "_original", чтобы их
    восстановить нужно выполнить:
    
       for f in *_original ; do mv $f ${f%_original} ; done
    
     
    ----* Захват видео непосредственно с X-сервера (доп. ссылка 1)   Автор: xAnd  [комментарии]
     
    Задача: снять видео с рабочего стола Ubuntu.
    
    Устанавливаем ffmpeg и кодеки:
    
       sudo apt-get install ffmpeg
       sudo apt-get install libavcodec-unstripped-52 libavdevice-unstripped-52 libavformat-unstripped-52 \
       libavutil-unstripped-49 libpostproc-unstripped-51 libswscale-unstripped-0 ffmpeg faac
    
    Команда, которая пишет видео с рабочего стола:
    
       ffmpeg -f x11grab -s 1280x800 -r 25 -i :0.0 -vcodec qtrle screenvideo.mov
    
    Разберёмся с параметрами командной строки:
    
    -f x11grab - источник сигнала (в нашем случае X-сервер);
    
    -i :0.0 - экран X-сервера или просто номер монитора;
    
    -s 1280x800 - захватываемое разрешение экрана (тут очень рекомендую сохранять пропорции экрана, 
    а ещё лучше жать в натуральное разрешение экрана, ибо потеря качества очень серьезная);
    
    -r 25 - количество кадров в секунду;
    
    -vcodec qtrle - кодек для захвата (параметр необязательный, по идее ffmpeg определяет тип кодека 
    автоматически по расширению выходного файла);
    
    screencast.mov - собственно выходной файл. Можно указывать полный путь.
    
    
    После выполнения указанной команды сразу же начнётся процесс записи.
    Чтобы остановить запись необходимо нажать "q" в терминале, в котором идёт процесс захвата.
    
    Для удобства публикации, полученный файл можно конвертировать в формат .flv тем
    же ffmpeg'ом, например так:
    
       ffmpeg -i screencast.mov screencast.flv
    
     
    ----* Создание видеоролика из набора фотографий (доп. ссылка 1)   Автор: ffsdmad  [комментарии]
     
    Для объединения нескольких изображений в видеоролик с наложением звуковой
    дорожки можно использовать:
    
       ffmpeg -i sound.mp3 -f image2 -i img/image%d.jpg video.avi
    
    Тоже самое средствами mencoder:
    
       mencoder mf://*jpg -mf w=640:h=480:fps=10:type=jpg -ovc lavc -lavcopts \
          vcodec=mpeg4:mbd=2:trell -oac copy -o output.avi
    
    Плюс добавляем звуковую дорожку:
    
       mencoder -oac copy -ovc copy -audiofile sound.mp3 output.avi -o video.avi
    
    Преобразуем в mpeg4:
    
       mencoder Alex.avi -oac mp3lame -lameopts abr:br=32 -ovc lavc \
          -lavcopts vcodec=mpeg4:mbd=2:trell:vbitrate=160  -vf scale=320:240  -o films.avi
    
     
    ----* Настройка видео в skype в сочетании с Compiz (доп. ссылка 1)   Автор: ПСВ  [комментарии]
     
    Для нормального вывода видео Skype при использовании Compiz, нужно заставить Skype 
    не использовать xv режим вывода. Для этого запускаем skype так:
    
       LD_PRELOAD=/usr/local/lib/libnoXv.so /path/to/skype 
    
    В загружаемой библиотеке XvQueryExtension всегда возвращает -1.
    
     
    ----* Запись видео с web-камеры со звуком в Linux с помощью Mencoder (доп. ссылка 1)   Автор: itbg  [комментарии]
     
    Записать видео можно через GUI интерфейс подобный cheese, но мы сделаем это
    через Mplayer и mencoder.
    
    Теперь убедимся что WEB камера у Нас показывает.
    Даём команду:
    
       mplayer tv:// -tv driver=v4l2:width=352:height=288:device=/dev/video0
    
    Если возникли проблемы, убедимся что в ядре включена поддержка WEB камеры и v4l2.
    
    Пробуем записать видео:
    
        mencoder tv:// -tv driver=v4l2:width=:height=:device=/dev/video0 -nosound -ovc lavc -o VideoFile.avi
    
    На выходе получим видео но без звука.
    
    Теперь осталось прикрутить звук к видео, который мы будем писать через встроенную звуковую карту.
    
    Готовая команда выглядит так:
    
      mencoder tv:// -tv driver=v4l2:width=320:height=240:device=/dev/video0:alsa:forceaudio:amode=0:adevice=hw.0,0 \
       -ovc lavc -lavcopts vcodec=mpeg4 -oac mp3lame -lameopts vbr=3:br=32:mode=3 -af volnorm -o VideoFile.avi
    
    Описание команд:
    
    tv:// - Источник видео
    driver=v4l2 - Драйвер видео, в нашем случае v4l2
    width и height - Размеры видеокартинки
    device=/dev/video0 - Видеоустроство
    -nosound - Без звука
    -ovc lavc - Видеокодек
    alsa:forceaudio:amode=0: - Параметры звука
    adevice=hw.0,0 - Звуковая карта, если нет звука или вы хотите писать его например через микрофон 
    в WEB камере то поиграйтесь со значениями 0,0 (0,1;1,0 и т.д)
    -lavcopts vcodec=mpeg4 - Параметры кодека
    -oac mp3lame - Звуковой кодек, в Нашем случае mp3 Lame
    lameopts vbr=3:br=128:mode=0 - параметры для кодека Lame
    vbr=3 - используем ABR. vbr=0 соответствует CBR
    br=32 - указываем битрейт, в данном случае 32 Kbps
    mode=0 - на выходе получаем стерео звук. mode=3 соответствует mono-звуку
    -af volnorm - Нормализация звука 
    
     
    ----* Решение проблемы с подключением web-камеры к Skype под Linux (доп. ссылка 1) (доп. ссылка 2)   [комментарии]
     
    Если в Linux дистрибутиве с ядром 2.6.27 или старше локальная web-камера (например, 
    камеры серии Logitech Quickcam Communicate работающие через gspca драйверы) в skype 
    (или любой другой программе использующей интерфейс v4l1) отображает лишь шум на экране, 
    для запуска skype нужно использовать скрипт:
    
       #!/bin/sh
       export LD_PRELOAD=/usr/lib/libv4l/v4l1compat.so
       skype 
    
    
    v4l1compat.so входит в состав пакета libv4l
    
    Проверить в v4l1 ли причина можно так:
    
       LD_PRELOAD=/usr/lib/libv4l/v4l1compat.so mplayer tv:// -tv driver=v4l2:device=/dev/video0
    
    Для настройки параметров отображения удобно использовать программу v4lucp (http://sourceforge.net/projects/v4l2ucp/)
    
    Создание скрипта для подмены skype:
    
      mv /usr/bin/skype /usr/bin/skype-bin; echo -e '#!/bin/sh\n\n
       export LD_PRELOAD=/usr/lib/libv4l/v4l1compat.so\n\nskype-bin' |
       tee -a /usr/bin/skype; sudo chmod +x /usr/bin/skype
    
     
    ----* Шифрование и просмотр видео (gpg, mplayer)   Автор: borey  [комментарии]
     
    Озадачился такой проблемой.
    Есть несколько видео клипов, которые я бы не хотел чтобы кто нибудь смог увидеть, 
    если украдут или взломают носитель. Частное видео. Но хотелось бы иметь удобный
    способ быстро его просмотреть.
    
    Для себя решил эту задачу просто. Шифровать gpg, а просматривать mplayer ом
    через специальный скрипт.
    
    1. Шифруем симметричным шифром
    
       gpg -c file.avi
    
    2. Для проигрывания используем такой простенький скрипт:
    
       #!/bin/sh
    
       echo  "Enter pass and press <Enter>:"
       stty -echo 
       read pass
       stty echo
    
       for i in $@ ;do
           echo "playing $i ..."
           echo $pass | gpg -d --passphrase-fd 0  "$i" | mplayer - >/dev/null 2>&1
    
       done
    
    Со скриптом конечно возможны варианты. Но меня вообщем устраивает.
    Единственный минус, при таком воспроизведении mplayer скроллить не может (raw режим).
    Если кому то это существенно , надо распаковывать во временный файл. Но так
    проигрываем в безопасности.
    Вообщем мои потребности такое решение удовлетворяет, надеюсь будет кому-то полезно.
    
     
    ----* Подготовка субтитров и их встраивание в видеоизображение (доп. ссылка 1)   Автор: jetxee  [комментарии]
     
    Как сделать субтитры? 
    Очень просто:  ставим gaupol, запускаем, выбираем File->New, сохраняем в пустой файл mysubs.srt, 
    подключаем видео (File->Select Video, этот пункт недоступен, пока мы не сохраним проект), 
    после этого аккуратно вписываем все субтитры, иногда нажимая кнопку Play, 
    чтобы посмотреть на результат и заметить время. 
    Спустя некоторое время у нас окажется готовый файл с субтитрами mysubs.srt.
    
    В идеале, так их и надо распространять. Отдельным файлом. Однако зрителю придётся озаботится 
    установкой правильных шрифтов, указать правильную кодировку субтитров в своём плеере, 
    и вообще, пользоваться плеером, который умеет показывать субтитры.
    
    Можно же встроить субтитры прямо в видео (пережать видео так, чтобы субтитры
    стали частью видеокартинки).
    Тогда они будут правильно видны у любого зрителя (в т.ч. на всяких ютубах). 
    Правда, увы, их нельзя будет отключить или как-то изменить.
    
    Чтобы встроить субтитры в видео, вначале подбираем нужные параметры их
    воспроизведения, например, так:
    
        mplayer -subwidth 75 -subcp utf8 -subfont-text-scale 3 -sub mysubs.srt myvideo.avi
    
    Опции показа - см. man mplayer. После этого перекодируем видеофайл:
    
        mencoder -oac mp3lame -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=2000 \
          myvideo.avi -subwidth 75 -subcp utf8 -subfont-text-scale 3 -sub mysubs.srt -o myvideo-with-hardsubs.avi
    
    Понятно, что выбор кодеков и параметров кодирования можно изменять по усмотрению. 
    
     
    ----* Настройка поддержки мультимедиа в Ubuntu 8.04 (доп. ссылка 1)   [комментарии]
     
    Подсказка про установку аудио и видео-кодеков, поддержки просмотра защищенных DVD.
    
       sudo apt-get install gstreamer0.10-plugins-ugly-multiverse \
         gstreamer0.10-plugins-bad-multiverse gstreamer0.10-plugins-bad \
         gstreamer0.10-plugins-ugly gstreamer0.10-ffmpeg libxine1-ffmpeg \   
         libdvdread3 liblame0
    
    В /etc/apt/sources.list добавляем репозиторий Medibuntu:
    
       deb http://packages.medibuntu.org/ hardy free non-free
    
    Импортируем PGP ключ и устанавливаем libdvdcss2 и w32-кодеки:
    
       wget -q http://packages.medibuntu.org/medibuntu-key.gpg -O- \
        | sudo apt-key add -
       sudo apt-get update
    
       sudo apt-get install libdvdcss2 w32codecs ffmpeg
    
    Дополнительные закрытые компоненты, включая flash плагин, java, шрифты.
    
       sudo apt-get install flashplugin-nonfree libflashsupport
       (или можно поставить открытый аналог flash - mozilla-plugin-gnash)
       sudo apt-get install sun-java6-fonts sun-java6-jre sun-java6-plugin
       sudo apt-get install msttcorefonts
    
    Поддержку мультимедиа можно поставить одной командой:
    
       sudo apt-get install ubuntu-restricted-extras
    
    Для Kubuntu - kubuntu-restricted-extras, для xubuntu - xubuntu-restricted-extras
    
    Недостающие кодеки для Ubuntu и Debian можно попытаться найти в репозитории http://debian-multimedia.org/
    
     
    ----* Создание gif-анимации на основе видеофрагментов, средствами gimp и mplayer (доп. ссылка 1)   Автор: bappoy  [комментарии]
     
    Использование mplayer и gimp для создания gif-анимации на основе видеофрагментов.
    
    1. Устанавливаем gimp и mplayer:
    
       sudo apt-get install gimp mplayer 
    или
       yum install gimp mplayer
    
    2. Методом тыка выбираем интервал для экспорта:
    
       mplayer -ao null -loop 0 -ss 0:11:22 -endpos 5 file.avi
    
    loop означает, что фрагмент будет проигрываться, пока пользователь не нажмёт Ctrl+C, 
    таким образом можно увидеть, на что будет похож конечный файл.
    
    3. Экспортируем фрагмент в jpg:
    
       mplayer -ao null -ss 0:11:22 -endpos 5 file.avi -vo jpeg:outdir=moviedirectory
    
    4. Сводим полученные jpeg'и в gimp, ("File / Open As Layers", "Файл / Открыть как слои"),
    сохраняем как анимированный gif. 
    
    Дополнение от pavlinux:
       mplayer video.avi -ss hh:mm:ss.lll -endpos hh:mm:ss.lll -vf \
           scale=160:120 -vo gif89a:fps=3:output=out.gif -nosound
    
    hh:mm:ss:lll - часы:минуты:секунды:миллисекунды
    
     
    ----* Как записать интернет-радиостанцию в файл (доп. ссылка 1)   Автор: jetxee   [комментарии]
     
    Сохранить потоковое аудио в файл можно при помощи пакета streamripper 
    (http://streamripper.sourceforge.net/):
    
       streamripper http://адрес-mp3-потока-радиостанции -a radio.mp3 -M 50 -t
    
    Команда сохранит всё в один файл radio.mp3 
    Без опции "-a radio.mp3" каждый трек будет записан в отдельный файл
    "-M 50" - ограничение размера в мегабайтах;
    "-t" - при разрыве соединения временные файлы не перезаписывать.
    
     
    ----* Скринкасты с помощью ffmpeg x11grab и lossless кодека qtrle   Автор: unnamed  [комментарии]
     
    С недавних времён в ffmpeg появилась поддержка кодирования в qtrle.
    Apple Quicktime Animation (RLE) это кодек без потерь, идеально подходящий
    для снятия и кодирования скринкастов на лету, а самое главное,
    что полученный mov файл ещё и сжимается в несколько раз 7zip'ом. В итоге
    qtrle выигрывает по размеру у таких платных кодеков, как
    TechSmith Screen Capture Codec.
    
    Если ffmpeg у вас уже имеется, то смотрим есть ли в нём поддержка
    x11grab и кодека qtrle
    
       #ffmpeg -formats 2> /dev/null | egrep '(x11grab|qtrle)'
       D  x11grab         X11grab
       DEV D  qtrle
    
    "DEV" значит есть поддержка декодирования и кодирования, если у вас только
    "D V", то нужно обновить ffmpeg.
    
    Cнимаем скринкаст с параметрами:
    60 кадров в секунду, ключевой кадр каждые 600 кадров(10 с.) и
    разрешение 1280x1024 в файл screencast.mov
    
       #ffmpeg -r 60 -g 600 -s 1280x1024 -f x11grab -i :0.0 -vcodec qtrle screencast.mov
    
     
    ----* Список клавиатурных комбинаций для быстрого вызова функций в GIMP (доп. ссылка 1)   Автор: tlanvar  [обсудить]
     
    Небольшой список клавиатурных сокращений, используемых в графическом редакторе GIMP, 
    начиная с версии 2.0:
    
    Файл:
    
       Ctr+N - Создать файл
       Ctrl+О - Открыть файл
       Ctrl+W - Закрыть файл
       Ctrl+S - Сохранить файл
       Shift+Ctrl+S - Сохранить файл как
       Ctrl+Q - Выход
    
    Редактирование изображения:
    
       Ctrl+Z - отменить последнее действие
       Ctrl+R - повторить последнее действие
       Ctrl+X - вырезать выделение
       Ctrl+C - копировать выделение
       Ctrl+V - вставить выделение
       Ctrl+K - очистить изображение/выделение до фона
       Ctrl+","(запятая) - залить изображение/выделение цветом фона
       Ctrl+"."(точка) - залить изображение/выделение цветом переднего плана
       Shift+Ctrl+C - копировать изображение/выделение в буфер с именем...
       Shift+Ctrl+V - вставить изображение/выделение из буфера с именем...
    
    Выделение изображениями:
    
       Ctrl+A - выделить все
       Ctrl+I - инвертировать выдление
       Shift+Ctrl+A - отменить выделение
       Shift+Ctrl+L - создать "плавающее" выделение
    
    Просмотр изображения:
    
       Shift+"+"(плюс) - увеличение размера
       Shift+"-"(минус) - уменьшение размера
       Shift+1 - просмотр 1:1
       Ctrl+E - подгонка окна под размер изображения
       Ctrl+Т - показать/скрыть выделение
       Shift+Ctrl+I - просмотр информации об изображении
       Shift+Ctrl+N - открытие окна навигации
       Shift+Ctrl+Т - показать направляющие
       Shift+Ctrl+R - включить/выключить линейки
    
    Обработка изображения или слоя:
    
       Ctrl+D - создание копии изображения
       Ctrl+M - объединить слои
       Ctrl+H - прикрепить &#8220;плавающее&#8221; выделение
       Shift+Ctrl+O - смещение слоя
    
    Инструменты:
    
       D - сбросить цвета
       Х - поменять цвет переднего плана и фона
    
    Выделение:
    
       R - выделение прямоугольных областей
       E - выделение эллиптических областей
       F - выделение произвольных областей
       Z - выделение связанных областей или "Волшебная палочка"
       Shift+О - выделение по цвету
    
    Контуры:
    
       В - создание и редактирование контуров.
    
    Вспомогательные инструменты:
    
       О - получение цвета из изображения или пипетка.
       М - перемещение слоев и выделенных областей.
    
    Модификация изображения:
    
       Shift+С - кадрирование или изменение размеров изображения - "скальпель"
       Shift+R - поворот слоев или выделенных областей.
       Shift+Т - масштабирование слоев или выделенных областей.
       Shift+S - искривление слоев или выделенных областей .
       Shift+P - изменение перспективы или выделенных областей.
       Shift+F - отражение слоев или выделенных областей.
    
    Инструменты для рисования:
    
       Т - текст.
       Shift+В - заливка цветом или шаблоном.
       L - заливка цветным градиентом .
       N - рисование резкими линиями или "карандаш".
       Р - рисование мягкими линиями или "кисть".
       Shift+Е - стирание до фона или прозрачности или "ластик"
       L - аэрограф.
       К - рисование пером.
       С - рисование с использованием шаблона или участка изображения -   "штамп".
       V - резкость или размытость.
       S - "размазывание" изображения.
       Shift+D - осветление или затемнение штрихов.
    
    Диалоги
    
       Ctrl+L - диалог слоев
       Ctrl+G - диалог градиентов
       Ctrl+Р - диалог палитр
       Shift+Ctrl+В - диалог кистей
       Shift+Ctrl+Р - диалог шаблонов
    
     
    ----* Подготовка 3gp видео для сотового телефона (доп. ссылка 1)   Автор: Ivan A-R  [комментарии]
     
    Многие современные мобильные телефоны поддерживают проигрывание и запись1) файлов в формате 3GP. 
    Этот формат разработан специально для применения в портативных устройствах с
    небольшим разрешением экрана.
    
    К счастью у нас есть свободный кросплатформенный конвертер видеоформатов ffmpeg 
    
    В Debian GNU/Linux или Ubuntu поставить ffmpeg можно из репозитория. 
    Версию для windows можно скачать по адресу http://ffdshow.faireal.net/mirror/ffmpeg/ 
    
    Теперь перейдём собственно к конвертации: 
    
        ffmpeg -i input.avi -s qcif -r 12 -ac 1 -ar 8000 -b 30 -ab 12 output.3gp
    
    Здесь ключи определяют: 
       -i input.avi - имя входного файла;
       -s qcif -r 12 - кодировать видео с разрешением 176&#215;144 и 12 кадров в секунду;
       -ac 1 -ar 8000 - кодировать звук в один канал (моно) с частотой 
          дискретизации 8000 (это даст максимальную воспроизводимую частоту в 4000 Гц);
       -b 30 -ab 12 - установить видео битрейт 30 кбит/с и аудио битрейт 12 кбит/с;
       output.3gp - результирующий файл.
    
    Кодирование идёт достаточно быстро и по окончании результирующий файл готов к отправке на телефон. 
    Как перенести файл на телефон это уже личное дело Вас и телефона. На свой Siemens CX75 
    я переношу файлы с помощью кардридера и RS-MMC карты на 512Mb. 
    
    Хочу предостеречь от создания роликов большого размера. К примеру попытка проиграть 
    на моём телефоне ролик в 17Mb (~50мин.) привела к зависанию и выключению тела.
    
     
    ----* Просмотр DVD в mplayer и другие полезные советы   [комментарии]
     
    В mplayer нет поддержки DVD меню, поэтому приходится использовать:
    
       mplayer dvd://номер_видеоматериала
    
    например, mplayer dvd://1
    
    Если содержимое DVD скопировано в определенную директорию на локальной ФС, то
    для полноценного просмотра диска нужно указать:
    
       mplayer -dvd-device директория dvd://1
    
    Для отображения субтитров нужно использовать опцию "-sub имя_файла_с_субтитрами".
    При просмотре DVD можно явно указать язык субтитров, через опцию "-slang язык1,язык2,..". 
    Например: mplayer dvd://1 -slang en
    
    При проигрывании битого файла, чтобы работала смена позиции нужно использовать:
       mplayer -idx test.avi
    или
       mplayer -forceidx test.avi
    
    При рассинхронизации звука и видео можно попробовать:
       mplayer -autosync 30 -mc 2.0 test.avi
    или
       mplayer -autosync 0 -mc 0 test.avi
    
    Для прослушивания потокового интернет-радио по плейлисту:
       mplayer -playlist файл или url
    
    При провалах можно увеличить размер кэша, например "-cache 8192" для задания кэша в 8Мб.
    
    Для преобразования mp3 в wav:
       mplayer -ao pcm:file=файл.wav файл.mp3
    
    Полезные комбинации клавиш:
        * Стрелки влево и вправо: переход на 10 секунд назад и вперед.
        * Стрелки вниз и вверх: переход на 1 минуту назад и вперед.
        * Клавиши Page down и Page up: переход на 10 минут назад и вперед.
        * f - переход в полноэкранный режим и обратно.
        * o  - отображение времени просмотра и общей продолжительности;
        * Пробел - пауза;
        * q  - выход
        * / и * (или "9" и "0") - уменьшение или увеличение громкости.
        * m - временное выключение звука.
        * T - режим отображения окна поверх других окон.
        * b и j - выбор субтитров
        * x и z  - управление синхронизацией субтитров;
        * I - отображение имени проигрываемого файла;
        * 1 и 2 - изменение контраста
        * 3 и 4 - изменение яркости;
        * 5 и 6 - изменение цветности;
        * 7 и 8 - изменение насыщенности;
    
     
    ----* Пример добавления лого в видео с помощью MPlayer'а   Автор: Mark Silinio  [комментарии]
     
    создаём FIFO-файл:
       mkfifo bmovl
    
    подготавливаем ваш логотип:
       convert logo.png logo.rgb
    
    запускаем mplayer:
       mplayer -vf bmovl=0:1:./bmovl videoclip.avi
    
    пока запущен mplayer делаем следующее:
    отсылаем в FIFO параметры логотипа (см. man) 
    первые две цифры,- его разрешение, необходимо указать точно!
       echo "RGB24 24 24 10 10 0 1" > bmovl
    
    и сразу кидаем в FIFO ваш логотип в формате RGB:
       cat logo.rgb > bmovl
    
     
    ----* Преобразование .flv видеоролика в AVI-формат. (доп. ссылка 1)   Автор: serhiy cherevko   [комментарии]
     Для скачивания преобразование Flash-формата .flv. используемого в YouTube можно использование KDE программу GenTube.

    Также можно перекодировать его используя mencoder или ffmpeg:

       mencoder input.flv -ofps 15 -vf scale=300:-2 -oac lavc -ovc lavc -lavcopts \
           vcode c=msmpeg4v2:acodec=mp3:abitrate=64 -o output.avi
    
       ffmpeg -i videotoconvert.flv -ab 56 -ar 22050 -b 500  -s 320x240 output.mpg
    
    

    Большое число примеров скриптов для перекодирования можно найти на сайте bashscripts.org.

     
    ----* Скрипт для кодирования видео с помощью Mencoder   [комментарии]
     
    Ниже скрипт, который делает двухпроходное видео.
    
    Как пользовать:
    
    Для начала скатываем фильм с DVD
    
       mencoder dvd:// -oac copy -ovc copy -o name.vob
    
    Заметьте, что имя файла имеет разширение vob (маленькими буквами), 
    скрипт сам переделает его потом в avi. 2. Считаем переменную CROP вот так:
    
       mplayer -vf cropdetect name.vob
    
    Должны появиться строки что-то вроде этого
    
       crop area: X: 10..711  Y: 73..497  (-vf crop=688:416:18:78).6% 0 0              
       crop area: X: 10..711  Y: 73..497  (-vf crop=688:416:18:78).6% 0 0              
       crop area: X: 10..711  Y: 73..497  (-vf crop=688:416:18:78).6% 0 0              
    
    В данном случае нас интересует "688:416:18:78", именно это и ставим в значение переменной 
    ТОЛЬКО ОБЯЗАТЕЛЬНО ПРОВЕРЬТЕ ПРАВИЛЬНО ЛИ ПОЛУЧЕНЫ ЗНАЧЕНИЯ. 
    Иногда mencoder ошибается. Поправте значение ABITRATE (битрейт аудио потока) если нужно. 
    
    Далее запускаем:
    
       ./coder -a
    
    Это заставит mencoder выдать битрейт для видео. 
    После того как поправили значение VBITRATE (битрейт видео потока), запускаем
    
       ./coder
    
    Текст скрипта:
    
    #!/bin/sh
    
    IN_FILE="`ls -1|grep *.vob`"
    OUT_FILE="`echo ${IN_FILE}|sed s/vob/avi/`"
    VBITRATE=""
    ABITRATE="128"
    CROP=""
    ASPECT=""
    EQ="eq=0:0"
    XY="640"
    PASS1="pass=1"
    PASS2="pass=2"
    PP="pp=hb/vb/dr/ci"
    #/al - авто яркость
    OVC="-ovc xvid -xvidencopts bitrate=${VBITRATE}:vhq=4"
    OAC="-oac mp3lame -lameopts br=${ABITRATE}:vbr=3 -alang ru"
    CODER="mencoder"
    VFILTER="${ASPECT} -vf ${EQ},${PP},crop=${CROP},scale -zoom -xy ${XY} -ofps 24"
    AFILTER="-af volnorm,volume=0:1"
    MAIL="[email protected]"
    WD="${PWD}"
    DATA="`date`"
    clean ()
    {
        rm -fr frameno.avi
    }
    
    audio_convert ()
    { 
        clean;
        ${CODER} ${IN_FILE} \
    	-ovc frameno \
    	${OAC} \
    	${AFILTER} \
    	${VFILTER} \
    	-o /dev/null
        clean;
    }
     
    video_convert ()
    {
        clean
        if [ -z "${VBITRATE}" ]
    	then
    	{
    	    echo "Битрейт видео потока не установлен!"
    	}
        fi
        
        if [ "${1}" != "d" ] 
    	then 
    	{
    	    OUT_FILE_1="/dev/null"
    	}
    	else 
    	{
    	    OUT_FILE_1="${OUT_FILE}" 
    	}
        fi
        
        nice -n 19 ${CODER} ${IN_FILE} \
    	${OVC}:${PASS1} \
    	-oac copy \
    	${VFILTER} \
    	-o ${OUT_FILE_1} && \
        nice -n 19 ${CODER} ${IN_FILE} \
    	${OVC}:${PASS2} \
    	${OAC} \
    	${AFILTER} \
    	${VFILTER} \
    	-o ${OUT_FILE}
    }
    
    #send_mail [a,v]
    #a - аудио обработка; v - видео обработка
    send_mail ()
    {
        MSG="/tmp/coder"
        A="аудио"
        V="видео"
        
        if [ $1 = "a" ]
    	then
    	{
    	    WORK=${A}
    	}
        fi
        if [ $1 = "v" ]
    	then
    	{
    	    WORK=${V}
    	}
        fi
        
    
        echo "" >> ${MSG}
        echo "Закончена ${WORK} обратотка файла"  >> ${MSG}
        echo "Директория ${WD}" >> ${MSG}
        echo "Входящий файл ${IN_FILE}" >> ${MSG}
        echo "Исходящий файл ${OUT_FILE}" >> ${MSG}
        echo "Обработка файла начата ${DATA}"
        echo "Обработка закончена `date`"
        cat $MSG | mail -s "coder in ${WD}" ${MAIL} \
            -a "Content-Type: text/plain; charset=\"koi8-r\"" -a "Content-Transfer-Encoding: 7bit"
        rm -f ${MSG}
    }
    
    if [ "${1}" = "-a" ]
        then
        {
    	audio_convert && \
    	send_mail a
        }
    fi
    if [ "${1}" = "-d" ]
        then
        {
            video_convert d && \
    	send_mail v
    
        }
    fi
    
    if [ "${1}" = "" ]
        then
        {
            video_convert && \
    	send_mail v
    
        }
        
    fi
    
     
    ----* Перекодирование dvd в avi при помощи mplayer во FreeBSD и Debian   Автор: serpent  [комментарии]
     
    Речь пойдет о перекодировке dvd в avi при помощи mplayer во FreeBSD и Debian.
    
    Кратко:
    Для перекодировки видео я использую два продукта lame (сжатие звука в mp3) и
    mplayer (сжатие видео).
     http://www.mp3dev.org
     http://www.mplayerhq.hu/homepage/dload.html
    
    FreeBSD: 
    
    lame:
       % cd /fooroot
       % ./configure 
       % make
       # make install
    
    mplayer:
       % cd /fooroot
       % ./configure
       // послу установки lame проверка на библиотеки lame должна прийти  
       // удачно (Checking for libmp3lame (for mencoder) ... yes) , обычно я так же 
       // использую параметр  --with-codecsdir=DIR для того чтобы указать 
       // расположение бинарных win кодеков.
       % ./make 
       # ./make install
    
    проверить можно просто
       mplayer ./foo.avi
    
    
    Debian:
    
    lame:
       # apt-get install fakeroot
       # apt-get install dh-make
       $ cd /fooroot
       $ fakeroot debian/rules
       $ fakeroot debian/rules build
       $ fakeroot debian/rules build install
       $ fakeroot debian/rules binary-indep binary-arch
    
    если появляется что то типа:
    
       cp: невозможно выполнить stat для `PRESETS.draft': No such file or directory
       dh_installdocs: command returned error code 256
       make: <li> [binary-arch] Ошибка 1
    
    рекомендую отредактировать вайл rules в подкаталоге debian в секции
    binary-arch: build install закоментируйте строчку dh_installdocs и у вас 
    соберутся 3 замечательных пакета.
    
       # cd ../
       # dpkg -i ./*lame*
    
    mplayer:
       Cобирается точно так же как в FreeBSD.
    
    Перекодирование фильмов:
       mencoder dvd://1 -o xxxxxx.avi -dvd-device /mnt/pink/serpent/video/5/\
          -vf scale=720:480 -oac mp3lame -lameopts vbr=0:q=0  -ovc lavc -lavcopts\
          vcodec=mpeg4:mbd=1:vbitrate=1200
    
    по порядку:
    
    mencoder | утилита специально написанная для перекодировки видео, 
       она будет установлена автоматически во время установки mplayer.
    
    dvd://1 | трек
    
    -o xxxxxx.avi | выходной файл
    
    -dvd-device /cdrom | путь до устройства dvd
    
    -vf scale=720:480 | изменяет размер на указанный
    
    -oac mp3lame | указывает какой аудио кодер использовать
    
    -lameopts vbr=0:q=0 | параметры передоверяемые аудио кодеру (в
     данном случаи переменный битрайт высшего качества)
    
    -ovc lavc | указывает какой видео кодер использовать
    
    -lavcopts vcodec=mpeg4:mbd=1:vbitrate=1200 | параметры 
     передоверяемые видео кодеру (думаю интуитивно понятно)
    
    хочу еще порекомендовать заглянуть в официальную документацию 
    "man mplayer", 
    а так же я обнаружил, что в последней версии есть русско-язычная html документация.
    
     
    ----* Вырезание видеофрагмента из фильма (доп. ссылка 1)   Автор: Вадим Катаев  [комментарии]
     
    Часто требуется вырезать небольшой фрагмент из фильма. 
    Для этого сначала необходимо определить с какой позиции начать вырезать 
    (при просмотре в mplayer обычно клавишей O включается табло времени ), и длину фрагмента.
    
       START_TIME="16:10"
       LENGTH_IN_FRAMES="1500"  # обычно число требуемых секунд помноженное на частоту кадров в секунду (обычно 24 или 25)
       mencoder FILM.AVI -ss $START_TIME -frames $LENGTH_IN_FRAMES -oac pcm -channels 2 \
           -ovc lavc -lavcopts vcodec=mpeg4:vhq:vbitrate=600 -o FRAGMENT.AVI -mc 0 -noskip
    
     
    ----* Манипулирование изображениями из командной строки (доп. ссылка 1)   Автор: Shashank Sharma  [комментарии]
     
    Масштабирование:
       convert -resize 320x200 in.jpg out.jpg
    
    Вырезание блока:
       convert -crop 660x528+320+200 in.jpg out.jpg
    
    Вращение на 90 градусов:
       convert -rotate 90 image_0001.tiff output.tiff
    
    Переворот верх-низ:
       convert -flip me.jpg me_flipped.jpg
       convert -flop me.jpg me_flopped.jpg
    
    Создание уменьшенного варианта:
       mogrify -sample 80x60 *.jpg
       mogrify -format png -sample 15%x15% *.jpg
    
    Создание одного PDF из группы картинок и наоборот:
       convert *jpg allinone.pdf
       convert allinone.pdf img.png
    
    Добавление текста:
       convert -font helvetica -fill yellow -pointsize 25 \
        -draw 'text 100,250 "Nandi Hills, Bangalore"' \
        image.png text.png
    
       convert -font helvetica -fill yellow -pointsize 36 \
        -draw 'text 100,250 "Nandi Hills, Bangalore"' \
        -fill green -draw 'text 150,300 Beautiful' \
        image.png text.png
    
    Обрамление рамкой:
       convert -bordercolor blue -border 5x5 pic001.png border001.png
    
    Мозаика:
       convert -page +15+30 1.png -page +49+60 2.png \
        -page +52+58 3.png \
        -background wheat -mosaic mosaic.png
    
    2D Logo:
       convert basic.png -fill blue -draw 'color 0,0 reset' \
        basic.png +matte -compose CopyOpacity -composite \
        -font Helvetica -pointsize 20 -fill white \
        -gravity center -annotate 0x0 "Blue Pill" 2D.png 
    
    3D эффекты:
    Расплывание:
       convert basic.png -blur 0x4 -blur 0x4 -blur 0x4 -blur 0x4 \
        +matte blurred.png
    
    Тень:
       convert blurred.png -shade 90x0 -normalize light.png
       convert blurred.png -shade 90x180 -normalize dark.png
    
    3D Logo:
    
       convert \( light.png \( +clone -fx 'rand()' -threshold -1 \) \
        +swap +matte -compose CopyOpacity -composite \) \
        \( dark.png \( +clone -threshold 100% \) \
        +swap +matte -compose CopyOpacity -composite \) \
        -compose Over -composite high_lighting.png
    
       convert 2D.png high_lighting.png -compose ATop -composite 3D.png
    
       convert 3D.png \( +clone -fx 'rand()' +matte -shade 120x45 \
        -fill gray -fill beige -tint 120 \) \
        -insert 0 -flatten bg_3D.png
    
     
    ----* Как перекодировать фильм для просмотра на КПК   [обсудить]
     
    Преобразуем в 220x176 по формуле: 220x? = Y/(X/220)
      320x240, 640x480 => 220x165
      352 x 288 => 220x176
      344x272 => 220x173
      448x336 => 220x168
    Для более мощных, чем ARM133, СPU и быстрых flash, нужно увеличить vbitrate, по умолчанию он 800.
     
    mencoder INPUT.AVI -oac mp3lame -ovc lavc -lavcopts \
        vcodec=mpeg4:vhq:vqmin=2:vqmax=20:vmax_b_frames=2:vbitrate=100:vqcomp=0.6 \
        -vop scale=220:173,eq=15 -ofps 20 -zoom -sws 2 -lameopts \
        cbr:br=32:aq=0:mode=3 -o OUTPUT.AVI
    
     
    ----* Настройка WebCam на чипе OV511/OV511+ под FreeBSD (доп. ссылка 1)   Автор: denz  [комментарии]
     
    #!/bin/sh
    # Scriptec greb webcam
    cur_date=`date \+\%d.\%m.\%Y`
    cur_time=`date \+\%H:\%M`
    cam_dir=/home/virtual/denz/htdocs/cam
    /usr/local/bin/vid -d /dev/ugen0 --small | pnmtojpeg --quality=72 --optimize --smooth 10 \
       --progressive --comment="TiraNET Office (67700, Ukraine, Belgorod-Dnestrovsky, P/O Box 4) "\
       > /tmp/webcam_shot.jpg
    rm -f ${cam_dir}/camout.jpg
    /usr/local/bin/convert -normalize -fill white -font helvetica -antialias  \
       -draw "text 45,230 'WebCam in kladovka [ $cur_time @ $cur_date ]'" \
       /tmp/webcam_shot.jpg ${cam_dir}/camout.jpg
    rm -f /tmp/webcam_shot.jpg
    chown -R denz:www ${cam_dir}/*
    
     
    ----* Как выбрать язык при проигрывании VOB файла с DVD диска в mplayer.   [комментарии]
     
    Запускаем mplayer -v file.vob, смотрим какие "audio stream" присутствуют.
    Далее:
        mplayer -aid 129 VTS_01_1.VOB
    
     
    ----* Как убрать эффект красных глаз и осветлить часть фотографии в Gimp   [обсудить]
     
    Осветление блока:
    - Выделить область используя "волшебную палочку" (Click+Ctrl - исключить, Click_shift - добавить);
    - Меню: Слой/ Цвета/ Уровни. 
       - На верхнем графике чуть сдвинуть влево белый и серый маркеры;
       - На нижнем уровне серого немного сдвинуть вправо черный маркер;
    - Меню: Слой/ Цвета/ Яркость-Контрастность.
       - Сбалансировать потерянный контраст сдвинув вправо полоску контраста.
    
    Эффект красных глаз:
    - Под увеличением выделить красную область на всех глазах на фотографии;
    - Меню: Слой/ Цвета/ Тонирование
       - Тон - на минимум (влево);
       - Насыщенность чуть уменьшить;
       - Осветление - прибавить и добиться почти черного цвета с коричневым отливом.
       
    
     
    ----* Русские субтитры в MPlayer (доп. ссылка 1)   Автор: Илья Воронин  [комментарии]
     
    Достаточно скопировать любой TTF шрифт в ~/.mplayer/subfont.ttf,например:
    
         $ cp /usr/local/lib/X11/fonts/msttcorefonts/verdana.ttf ~/. mplayer/subfont.ttf
    
    и добавить в файл ~/.mplayer/config:
    
         subcp=cp1251
    
    
    Вариант 2 от Константина Мартынова:
    ~/.mplayer/config
    
       font = /usr/X11R6/lib/X11/fonts/TTF/tahoma.ttf
       subcp = "cp1251"
       subfont-text-scale = "3"
       subfont-blur = "8"
       subfont-outline = "8"
    
    задержка субтитров регулируется клавишами z/x.
    кодировку субтитров можно задать при запуске ключем -subcp cp1251
    
     
    ----* Как вырезать кадр или отрывок в mplayer   [комментарии]
     
    Вырезать кадр идущий на 670 сек. фильма:
       mplayer -ss 670 -frames 1 -vo jpeg -nosound movie.avi                            
    Записать в mpeg отрывок в 500 кадров начиная с 670 секунды:
      mencoder -ss 670 -frames 500 -o output.avi -oac copy -ovc copy src.avi
      mencoder -ss 670 -frames 500 -o output.avi -oac copy -ovc divx4 -vop scale -zoom -xy 160 -ofps 15  src.avi
    
     
    ----* Манипуляции с картинками из командной строки. (доп. ссылка 1)   [обсудить]
     
    Изменение размера картинки с помощью утилиты pnmscale (y до 150, x - соразмерно):
      djpeg -pnm -dct float SRC_IMAGE.JPG | pnmscale -ysize 150 |
      cjpeg -quality 70 -optimize -progressive -dct float > tumb_IMAGE.JPG
    # Преобразуем tiff картинку в PostScript документ формата A4
       convert -page A4+0+0 image.tiff document.ps
    # надпись начиная от точки 100x100, синим цветом шрифтом helvetic
       convert -font helvetica -pen blue -draw "text 100,100 TEST" test.jpg test2.jpg
    # Создадим изображение размером 640x480 и заполним его повторяющимися картинками bumps.jpg
       convert -size 640x480 tile:bumps.jpg tiled.png
    # Создадим анимированный gif из группы файлов dna.* с задержкой 20/100 сек.
       convert -delay 20 dna.* dna.gif
    # Изменим размер картинки до 100x50 и запишем в tumb.jpg
       convert -geometry 100x50 test.jpg tumb.jpg
    # Уменьшим размер картинки на 50% и запишем в tumb.jpg
       convert -geometry 50% test.jpg tumb.jpg
    # Вырежем кусок размером 100x50 из файла test.jpg начиная с позиции 200x200
       convert -crop 100x50+200+200 test.jpg tumb.jpg
    
     
    ----* Просмотр iTunes-контента через AirPlay в Ubuntu Linux (доп. ссылка 1)   [комментарии]
     
    Для трансляции видеоконтента iTunes с iPhone, iPod или iPad на Linux-машину при
    помощи протокола AirPlay можно использовать скрипт play2wifi совместно с
    медиацентром XBMC. В будущем планируется создание полноценного плагина к XBMC.
    При запуске play2wifi скрипт создает слушающий сокет для приема соединений на
    22555 сетевом порту и передает контент в XBMC через утилиту xbmc-send.
    
    Ставим свежий XBMC:
    
       sudo add-apt-repository ppa:team-xbmc
       sudo apt-get update
       sudo apt-get install xbmc
    
    Для работы потребуется установить поддержку Bonjour (avahi), xbmc-send и Python-фреймворк Twisted:
    
       sudo apt-get install avahi-daemon
       sudo apt-get install xbmc-eventclients-xbmc-send
       sudo apt-get install python-twisted
    
    Загружаем и распаковываем play2wifi.
    
    Файл play2wifi.service с реализацией сервиса для avahi копируем в директорию
    /etc/avahi/services/, после чего перезапускаем сервис avahi-daemon:
    
       /etc/init.d/avahi-daemo restart
    
    Прописываем порт web-интерфейса XBMC (используется HTTP-API) в файл
    конфигурации play2wifi.cfg (порт также можно указать при запуске скрипта через
    опцию "-p").
    
    Запускаем XBMC и убеждаемся, что web-интерфейс активен (XBMC Web GUI включается
    в блоке сетевых настроек XBMC).
    
    Запускаем Python-скрипт play2wifi.py
    
    Инициируем трансляцию видео или подкаста с iPhone, iPod или iPad и начинаем смотреть его в XBMC.
    
     

       Особенности работы с CPU от AMD

    ----* Как уменьшить нагрев процессора AMD Athlon/Duron под Linux   [комментарии]
     
    Активируем ACPI в ядре (при включенном ACPI не будет работать APM):
      "general.setup" активируем  "acpi subsystem", "acpi bus" и "acpi Processor entry".
    Для Via kt133/133a и kx133:
       Включить "охлаждение": setpci -v -H1 -s 0:0.0 52=EB
       Выключить: setpci -v -H1 -s 0:0.0 52=6B
    Для Via kt266/266a:
       Включить: setpci -v -H1 -s 0:0.0 92=EB
       Выключить: setpci -v -H1 -s 0:0.0 92=6B
    
     
    ----* Как исправить падения Linux на AMD Athlon/Duron + AGP ?   [обсудить]
     
    В /etc/lilo.conf необходимо добавить append="mem=nopentium", например:
    image=/boot/vmlinuz
            label=linux
            root=/dev/hda1
            append="mem=nopentium console=tty12 hdc=ide-scsi"
    
     

       Печать

    ----* Прямая отправка заданий на принтер, без использования CUPS и других прослоек (доп. ссылка 1) (доп. ссылка 2)   [комментарии]
     
    Многие принтеры имеют встроенную поддержку растеризации документов в форматах
    PDF и PostScript. Для вывода на печать на такие принтеры можно напрямую
    отправить документ без установки системы печати CUPS. Недостатками такого
    подхода являются очень медленный процесс обработки документа и возможные
    проблемы с качеством растеризации.
    
    Например, для печати на сетевом принтере достаточно отправить документ на порт
    9100 при помощи утилиты netcat:
    
       nc 192.168.1.15 9100 < sample.pdf
    
    Для принтеров, подключённых по USB, можно направить документ в файл устройства:
    
       cat sample.pdf >> /dev/usb/lp0
    
     
    ----* Настройка локального принтера для печати через Google Cloud Print (доп. ссылка 1)   [комментарии]
     
    При помощи облачного сервиса Google Cloud Print возможно организовать печать на
    удаленном принтере с мобильного устройства под управлением платформы Android
    или ChromeOS, при этом устройство может находиться где угодно, независимо от
    расположения принтера. Ниже показано как настроить локальный принтер в Linux,
    чтобы на него можно было печатать через Google Cloud Print.
    
    Для обеспечения печати будет использовать прокси-сервер cloudprint,
    позволяющий связать с сервисом Google Cloud Print любой принтер, работающий
    через CUPS. Прокси написан на Python и очень прост в использовании, достаточно
    запустить приложение cloudprint и ввести параметры своего аккаунта в gmail.com,
    после чего настроенный в локальной системе принтер сразу станет доступным для
    печати с телефона или планшета на базе платформы Android. На телефоне для
    отправки на печать удобно использовать приложения "PrinterShare" или "Cloud
    Print", которые можно найти в Android Market. Печать производится путем выбора
    соответствующего сервиса через кнопку "Share".
    
    1. Необходим настроенный для локальной печати принтер.
    
    2. Устанавливаем пакеты, необходимые для работы и загрузки cloudprint (пример для Debian и Ubuntu):
    
       sudo apt-get install git-core python python-cups
    
    3. Загружаем в текущую директорию свежую версию cloudprint из Git-репозитория проекта:
    
        git clone git://github.com/armooo/cloudprint.git
    
    4. Собираем и устанавливаем cloudprint:
    
       cd ~/cloudprint
       python setup.py build
       sudo python setup.py install
    
    Скрипт будет установлен по следующему пути:
       /usr/local/lib/python2.6/dist-packages/cloudprint/cloudprint.py
    
    5. Запускаем прокси для печати через Google Cloud Print:
    
       python /usr/local/lib/python2.6/dist-packages/cloudprint/cloudprint.py
    
    Вводим свой адрес и пароль в Gmail, после чего можно будет печатать на
    принтере, выбранном по умолчанию в CUPS.
    
    6. Управлять параметрами принтера и очередями печати в Google Cloud Print можно
    на странице http://www.google.com/cloudprint/manage.html
    
    7. Вместо реального принтера можно организовать печать в PDF, используя
    CUPS-драйвер cups-pdf, который по умолчанию сохраняет выводимые на печать файлы
    в каталоге PDF в домашней директории текущего пользователя.
    
    Для установки драйвера и подключения принтера можно использовать команды:
    
       sudo apt-get install cups-pdf
       sudo lpadmin -p cups-pdf -v cups-pdf:/ -E -P /usr/share/ppd/cups-pdf/CUPS-PDF.ppd
    
    В системе виртуальный PDF-принтер будет выглядеть как cups-pdf:/
    
     
    ----* Печать на МФУ Samsung во FreeBSD с использованием драйверов Linux   Автор: Alexander Shikoff  [комментарии]
     
    Настройка печати через CUPS на МФУ Samsung SCX-4521F с использованием 
    драйверов Linux
    
    Окружение: 
            - FreeBSD 7.1-PRERELEASE i386
            - linux_base-f8 из портов
            - linux-png-1.2.8_2 из портов
            - linux-tiff из портов
            - linux-jpeg-6b.34 из портов
            - linux-xorg-libs-6.8.2_5 из портов
            - cups-base-1.3.9_2 из портов
            - cups-smb-backend-1.0_1 из портов
    
    Предполагается также, что линуксолятор вкомпилирован в ядро/подгружен и работает.
    Если он работает нормально, то в sysctl можно увидеть версию ядра:
    
       # sysctl -a|grep linux
    
       hw.snd.compat_linux_mmap: 0
       compat.linux.oss_version: 198144
       compat.linux.osrelease: 2.6.16
       compat.linux.osname: Linux
    
    1. Качаем с официального сайта Samsung драйвера для Linux 
    (Linux Unified Driver). В моем случае файл назывался UnifiedLinuxDriver.tar.gz.
    
    2. Распаковываем:
    
       # tar -zxf UnifiedLinuxDriver.tar.gz
    
    3. Копируем ppd-файл с драйвером и нужный фильтр в папки CUPSа. Посмотреть, 
    какой именно фильтр нужен, можно в соответствующем Вашему принтеру файлу ppd:
    
       # cat cdroot/Linux/noarch/at_opt/share/ppd/scx4x21.ppd |grep Filter
       *cupsFilter:  "application/vnd.cups-postscript 0 rastertosamsungspl"
    
       # mkdir /usr/local/share/cups/model/samsung
       # cp cdroot/Linux/noarch/at_opt/share/ppd/scx4x21.ppd /usr/local/share/cups/model/samsung/
       # cp cdroot/Linux/i386/at_root/usr/lib/cups/filter/rastertosamsungspl /usr/local/libexec/cups/filter/
    
    4. Теперь задача добавить в /compat/linux недостающие либы. Перед тем, как 
    запускать линуксячий бинарник, стОит выполнить команду
    
       # /compat/linux/sbin/ldconfig
    
    Далее нужно выяснить, каких библиотек не хватает. Самый простой способ - запускать 
    из командной строки /usr/local/libexec/cups/filter/rastertosamsungspl и смотреть,
    чего ему не хватает. Подкладывать их в /compat/linux/lib или /compat/linux/usr/lib
    по одной, и запускать /compat/linux/sbin/ldconfig. 
    
    В моем случае не хватало следующих:
    
            libcups.so.2
            libcupsimage.so.2
            libgnutls.so.13
            libgcrypt.so.11
            libgpg-error.so.0
    
    Найти и скачать RPM-пакеты для нужного релиза Fedroa, в которых есть эти библиотеки, 
    можно с помощью Web-сервиса RPM Search, например http://rpm.pbone.net/
    Итак, у нас появляется 4 файла rpm:
    
       # ls -1 *rpm
    
       cups-libs-1.3.4-2.fc8.i386.rpm
       gnutls-1.6.3-2.fc8.i386.rpm
       libgcrypt-1.2.4-6.i386.rpm
       libgpg-error-1.5-6.i386.rpm
    
    Достаем оттуда библиотеки:
    
       # rpm2cpio cups-libs-1.3.4-2.fc8.i386.rpm | tar -zxf -
       # rpm2cpio gnutls-1.6.3-2.fc8.i386.rpm | tar -zxf -
       # rpm2cpio libgcrypt-1.2.4-6.i386.rpm | tar -zxf -
       # rpm2cpio libgpg-error-1.5-6.i386.rpm | tar -zxf -
    
    Копируем их в /compat/linux:
    
       # cp -v lib/libgcrypt.so.11.2.3 lib/libgpg-error.so.0.3.1 /compat/linux/lib/
       lib/libgpg-error.so.0.3.1 -> /compat/linux/lib/libgpg-error.so.0.3.1
       lib/libgcrypt.so.11.2.3 -> /compat/linux/lib/libgcrypt.so.11.2.3
       # cp -v usr/lib/libcups* /compat/linux/usr/lib/
       usr/lib/libcupsimage.so.2 -> /compat/linux/usr/lib/libcupsimage.so.2
       usr/lib/libcups.so.2 -> /compat/linux/usr/lib/libcups.so.2
       # cp -v usr/lib/libgnutls.so.13.3.0 /compat/linux/usr/lib/tls/
       usr/lib/libgnutls.so.13.3.0 -> /compat/linux/usr/lib/tls/libgnutls.so.13.3.0
       # /compat/linux/sbin/ldconfig
    
    5. Если все было сделано правильно, то бинарник должен нормально запуститься:
    
       # /usr/local/libexec/cups/filter/rastertosamsungspl
    
       INFO: Usage: rastertosamsungspl job-id user title copies options [file]
       ERROR: Wrong number of arguments
    
    6. Далее идем броузером на http://localhost:631/ и подключаем принтер, как обычно.
    В разделе Make/Manufacturer должен появиться Samsung, и далее - в разделе
    
       Model/Driver - SCX-4x21 Series.
    
    Возможно, пропустил что-то, но в принципе суть изложена.
    Аналогичным образом, я думаю, можно завести любой принтер, если к нему есть
    нормальные Linux драйверы.
    
     
    ----* Подключение принтера Canon LBP 2900 в Slackware Linux   Автор: Sklifasovsky  [комментарии]
     
    Настройка печатати на принтере  Canon lbp 2900 в Slackware Linux.
    
    Устанавливаем драйверы cndrvcups версии 1.30 из rpm-пакетов, скаченных с
    http://software.canon-europe.com :
    
    в каталоге с ppd драйверами cups выполняем:
    
       rpm2tgz cndrvcups-capt-1.30-1.i386.rpm
       rpm2tgz cndrvcups-common-1.30-1.i386.rpm
    
    далее
    
       mkdir /var/captmon
       mkdir /var/ccpd
       mkfifo /var/ccpd/fifo0
       chmod 777 /var/ccpd/fifo0
       chown root /var/ccpd/fifo0
       chmod -R a+rx /usr/share/cups/model
       /etc/rc.d/rc.cups restart
    
       /usr/sbin/lpadmin -p LBP2900 -m CNCUPSLBP2900CAPTK.ppd -v ccp:/var/ccpd/fifo0 -E
      /usr/sbin/ccpdadmin -p LBP2900 -o /dev/usblp0
    
      cp /etc/init.d/ccpd /etc/rc.d/rc.ccpd
      chmod +x /etc/rc.d/rc.ccpd
    
    в /etc/rc.d/rc.local дописываем
    
       #start ccpd
       /etc/rc.ccpd start
    
    стартуем сервис:
    
       /etc/rc.ccpd start
    
    для проверки принтера выполняем
    
       captstatusui -P LBP2900
    
    если пишет Ready to Print значит принтер готов и печатаем пробную страницу из CUPS:
    
       http://localhost:631/printers/LBP2900
    
    использовалась информация:
    https://help.ubuntu.com/community/HardwareSupportComponentsPrinters/CanonPrinters/Canon_LBP_2900
    но с учётом особенностей Slackware
    
     
    ----* Установка принтера HP1020 в Debian Еtch   Автор: Андрей Никитин  [комментарии]
     
    Принтеры HP LaserJet 1000,1005,1018,1020 после включения должны загрузить
    бинарный firmware драйвер.
    
    Если прошивка по каким-то причинам не загружена 
    (загрузка обычно устанавливается в автомате через hotplug),
    то вывод usb_printerid будет примерно таким
    
       nik@linuxdvr:~$ usb_printerid /dev/usb/lp0
       GET_DEVICE_ID string:
       MFG:Hewlett-Packard;MDL:HP LaserJet 1020;CMD:ACL;CLS:PRINTER;DES:HP  LaserJet 1020;
    
    без упоминания версии прошивки в конце строки (FWVER:20041129;)
    
    Устанавливаем штатный deb-пакет foo2zjs
    он ставит все что нужно, за исключением самой прошивки
    и в логе tail -n 20 /var/log/messages вы увидите что-то подобное
    
       Mar 20 12:35:34 linuxdvr kernel: usbcore: registered new driver usblp
       Mar 20 12:35:34 linuxdvr kernel: drivers/usb/class/usblp.c: v0.13: USB Printer Device Class driver
       Mar 20 12:35:35 linuxdvr /usr/bin/hplj1020: Missing HP LaserJet 1020 firmware file /usr/share/foo2zjs/firmware/sihp1020.dl
       Mar 20 12:35:35 linuxdvr /usr/bin/hplj1020: ...read foo2zjs installation instructions and run ./getweb 1020
    
    Выполняю:
    
       nik@linuxdvr:~$ getweb 1020
    
    в итоге c инета сайта foo2zjs качается прошивка  и сохраняется как sihp1020.img
    
    конвертируем этот бинарник в нужный формат
    
       nik@linuxdvr:~$ arm2hpdl sihp1020.img > sihp1020.dl
    
    далее копируем куда нужно
    
       nik@linuxdvr:~$ sudo mv sihp1020.dl /usr/share/foo2zjs/firmware/
    
    и корректируем владельца группу
    
       nik@linuxdvr:~$ sudo chown root:root /usr/share/foo2zjs/firmware/sihp1020.dl
    
    Включаем и выключаем принтер и в логе tail -n 20 /var/log/messages видим
    
       Mar 20 12:57:18 linuxdvr /usr/bin/hplj1020: loading HP LaserJet 1020 
         firmware /usr/share/foo2zjs/firmware/sihp1020.dl to /dev/usb/lp0 ...
       Mar 20 12:57:19 linuxdvr /usr/bin/hplj1020: ... download successful.
    
    Проверяем:
    
       nik@linuxdvr:~$ usb_printerid /dev/usb/lp0
    
       GET_DEVICE_ID string:
       MFG:Hewlett-Packard;MDL:HP LaserJet 1020;CMD:ACL;CLS:PRINTER;DES:HP  LaserJet 1020;FWVER:20041129;
    
    FWVER:20041129; - это версия успешно загруженной прошивки
    
    Все, теперь идем в KDE, GNOME или ... и запускаем ОТ ROOT-а гуёвые мастера для добавления принтера.
    
    На всякий случай, привожу установленные в Debian Etch пакеты для печати на HP1020 через CUPS.
    
    nik@linuxdvr:~$ aptitude search "foo|cups|foo2" | grep "^i"
    i   cupsys                          - Common UNIX Printing System(tm) - server
    i   cupsys-bsd                      - Common UNIX Printing System(tm) - BSD comm
    i   cupsys-client                   - Common UNIX Printing System(tm) - client p
    i A cupsys-common                   - Common UNIX Printing System(tm) - common f
    i   cupsys-driver-gutenprint        - printer drivers for CUPS
    id  foo2zjs                         - Support for printing to ZjStream-based pri
    i A foomatic-db                     - linuxprinting.org printer support - databa
    i   foomatic-db-engine              - linuxprinting.org printer support - progra
    i   foomatic-db-gutenprint          - linuxprinting.org printer support - databa
    i   foomatic-db-hpijs               - linuxprinting.org printer support - databa
    i A foomatic-filters                - linuxprinting.org printer support - filter
    i   foomatic-filters-ppds           - linuxprinting.org printer support - prebui
    i   foomatic-gui                    - GNOME interface for configuring the Foomat
    i   gnome-cups-manager              - CUPS printer admin tool for GNOME
    i A libcupsimage2                   - Common UNIX Printing System(tm) - image li
    i A libcupsys2                      - Common UNIX Printing System(tm) - libs
    i A libgnomecups1.0-1               - GNOME library for CUPS interaction
    i A libgnomecupsui1.0-1c2a          - UI extensions to libgnomecups
    i A python-foomatic                 - Python interface to the Foomatic printer d
    
    
    (С) Андрей Никитин, 2007
    Перепечатка и цитирование допускаются только с разрешения автора.
    
     
    ----* Как объединить несколько PDF файлов в один (доп. ссылка 1)   Автор: debianadmin.com  [комментарии]
     
    gs -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=combinedpdf.pdf -dBATCH 1.pdf 2.pdf 3.pdf
    
     
    ----* Как распечатать русскоязычный текстовый файл или исходный текст под Unix (доп. ссылка 1)   [обсудить]
     
    Формирование PostScript:
      a2ps -2 --encoding=latin1 --pretty-print -s1 --no-header --borders=no -o file.ps file.txt
      -2 - печать в две колонки (-1 - одна колонка на весь лист)
      -s1 - односторонняя печать (-s2 - печать с обоих сторон)
      --pretty-prin - подсветка синтаксиса (--pretty-print=plain - отмена)
    
    Преобразование в RAW формат:
      gs -q -dNOPLATFONTS -dSAFER -sDEVICE=ljet4 -dNOPAUSE -dBATCH -sOutputFile=file.raw file.ps
    
    Отправка на печать:
       cat file.raw | smbclient //192.168.10.19/HPLaserJ -N -c "print -"
    
    Печатать HTML документы удобно преобразовав их в текстовый файл через
       lynx -dump -nolist -with_backspaces URL
    и затем поправив в любом текстовом редакторе.
    
     
    ----* Советы по распечатке брошюр в PostScript формате (доп. ссылка 1)   Автор: Артем Носов  [комментарии]
     
    Печать четных страниц, преобразовав в формат A4:
       psbook example.ps | psnup -l -pa4 -2 | pstops "2:0(1in,0in)" | lpr
    переворачиваем пачки и печатаем нечетные:
       psbook example.ps | psnup -l -pa4 -2 | pstops "2:-1(1in,0in)" | lpr
    Выборочная печать страниц:
       psselect -p1-12,103,23-28,3 example.ps output.ps
    
     
    ----* Решение проблемы с печатью с Linux на Windows через CUPS (доп. ссылка 1)   Автор: Михаил Конник  [комментарии]
     
    Если при печати из CUPS на принтер на Windows машине при использовании SMB протокола пишет:
    
       Connection failed with error NT_STATUS_ACCESS_DENIED
    
    Или при печати через IPP:
    
       Unable to connect to SAMBA host, will retry in 60 seconds...
       foomatic-rip version $Revision$ running...
    
    Добавляем в веб-форме CUPS принтер и выбираем способ подключения Windows printer via Samba. 
    Далее в строке адреса пишем:
    
       smb://[email protected]/HPLaserJ
    
    В приложениях KDE нужно выставить адрес службы печати на локальный: 127.0.0.1:631.
    
     

       Работа в консоли

    ----* Настройка шрифтов для консоли и терминала   Автор: Warlock  [комментарии]
     
    Одна из первых вещей, которые требуется поменять в свежеустановленной системе -
    шрифты и раскладки клавиатуры. С предлагаемыми по умолчанию шрифтами обычно
    имеется несколько проблем:
    
    
  • шрифт в терминале (здесь и далее под терминалом я подразумеваю "настоящий" терминал, т.е. tty) слишком мелкий.
  • эстетика некоторых букв неидеальна.
  • шрифт в консоли (а под этим словом я подразумеваю GUI-программу - эмулятор терминала) безобразно гладкий и отличается от шрифта в терминале.
  • возможности набирать русские буквы нет, либо же есть, но переключение между языками ужасное.
  • в Иксах нет возможности набирать типографские символы (в терминале тоже, но в терминале это не особо нужно, даже для цели написания таких вот текстов). Собственный шрифт в терминале Первое, что нужно сделать - обзавестись хорошим растровым шрифтом. И если для базовой латиницы таких шрифтов, возможно, несколько (но это не точно), то с учётом кириллицы и юникода выбора вообще не остаётся, и Terminus - это единственный вариант. Так что в этом месте нужно пойти в интернет и раздобыть две вещи: 1) сам Terminus в виде архива '.tar.gz' и 2) веб-страничку этого шрифта, которая содержит важную информацию относительно настраиваемых вариантов некоторых букв и которая, тем не менее, почему-то не входит в тарбол. Далее следуют привычные и очевидные вещи - распаковка тарбола и изучение readme файла. Ну а далее всё просто. Во-первых нужно определиться с альтернативными начертаниями и применить необходимые патчи (подробности в readme). Далее нужно решить, какой размер и начертание шрифта вам подходит. Я обычно использую 9x18, жирное начертание. Выбранный шрифт можно отредактировать с помощью 'gbdfed'. Так, в шрифт, которым я пользуюсь прямо сейчас, внесены следующие исправления:
  • изменено начертание русско-латинской большой буквы "A", так что она имеет вид, схожий с видом этой буквы в классическом ДОС шрифте,
  • изменено начертание кириллического "Ээ оборотного", так что его труднее спутать с "Зз",
  • изменено начертание строчной кириллической буквы "б", так как дефолтный вариант имеет не вполне органичный вид для русского языка,
  • изменено начертание заглавной буквы "Ф" - она стала более "скромной",
  • изменено очертание твёрдого знака - он стал поуже, а палочка, отличающая его от мягкого знака, заметнее,
  • изменено очертание буквы "Ыы" опять же по мотивам известного досовского шрифта,
  • изменено начертание цифры "3", чтобы не путать её с буквой "З". Соответствующие патчи можно найти на гитхабе. Выбрав и отредактировав шрифт, переходим к сборке: $ ./configure $ make Инсталляция сводится к размещению шрифта в правильном месте. В линуксах читаем 'man setfont', используем '.psf' файл: $ cp ter-u18b.psf xter-u18b.psf $ gzip -9 xter-u18b.psf # mv xter-u18b.psf.gz /usr/share/kbd/consolefonts # chown root:root /usr/share/kbd/consolefonts/xter-u18b.psf # chmod u=rw,g=r,o=r /usr/share/kbd/consolefonts/xter-u18b.psf Во FreeBSD читаем 'man vt' и раздел "Virtual Consoles and Terminals" в Hanbook, и превращаем ".bdf" в ".fnt" с помощью "vtfontcvt": $ vtfontcvt -o xter-u18b.fnt ter-u18b.bdf # mv xter-u18b.fnt /usr/share/vt/fonts # chown root:root /usr/share/vt/fonts/xter-u18b.fnt # chmod u=rw,g=r,o=r /usr/share/vt/fonts/xter-u18b.fnt Осталось указать системе использовать наш шрифт. Во FreeBSD это делается с помощью настройки "allscreens_flags" в "/etc/rc.conf": allscreens_flags="-f xter-u18b" В линуксах настройка дистроспецифична, точнее она зависит от системы инициализации. В случае systemd это настраивается установкой "FONT" в "/etc/vconsole.conf": FONT="xter-u18b" В случае использования системы инициализации OpenRC, нужная опция называется 'consolefont' и располагается в '/etc/conf.d/consolefont': consolefont="xter-u18b" В Artix с OpenRC надо прописывать шрифт в оба места: и в '/etc/conf.d/consolefont', и дополнительно в '/etc/vconsole.conf' для 'mkinitcpio' (а точнее для хука '/usr/lib/initcpio/install/consolefont'). В Slackware нужно просто вписать вызов 'setfont' с нужными параметрами в '/etc/rc.d/rc.font': /usr/bin/setfont xter-u18b Но если нужно загрузить шрифт так же и в initrd, я не представляю как это можно сделать в Slackware. Шрифт в загрузчике Если хочется использовать тот же шрифт и в меню загрузчика, вот как это делается для Arch-подобных Linux-дистрибутивов и загрузчика GRUB 2. 1. Шрифт в '.pf2' формате кладётся в '/boot/grub/fonts': $ grub-mkfont -o xter-u18b.ps2 ter-u18b.bdf # mv xter-u18b.ps2 /boot/grub/fonts 2. Затем шрифт прописывается в '/etc/default/grub': GRUB_FONT="/boot/grub/fonts/xter-u18b.pf2" 3. Регенерируется реальный конфиг груба: # grub-mkconfig -o /boot/grub/grub.cfg Всё, можно перезагружаться и проверять результат. Шрифт в консоли Следующая задача - запихнуть тот же самый шрифт в Иксы, чтобы иметь возможность использовать его в эмуляторе терминала. Современные иксовые приложения не особенно любят растровые шрифты, особенно в "традиционном" формате '.pcf', поэтому необходимо использовать более "модный" '.otb'. Конвертация проста: $ fonttosfnt -o xter-u18b.otb ter-u18b.bdf Однако, перед этим может быть небесполезным поменять название кастомного шрифта в '.bdf' файле, чтобы если что он не перепутался с оригинальным Terminus. Запихивать такой шрифт в систему не вполне правильно, да и не нужно: в '~/.local/share/fonts' ему будет вполне комфортно. (В прежние времена для этой цели использовалась '~/.fonts', но в рамках борьбы с загаживанием home dir, фонты переехали в указанное выше место.) Чтобы Иксы обновили список доступный шрифтов, необходимо позвать 'fc-cache -fv'. Однако очень вероятно, что так сразу шрифт не найдётся. Моё основанное на личном опыте заключение таково: в FreeBSD больше никаких телодвижений не требуется, а вот в Linux скорее всего придётся найти способ включить растровые шрифты. Правда, способ этот скорее всего весьма универсален: надо просто прочитать '/etc/fonts/conf.d/README', и, прочитав, обратить внимание на файлы с названиями '70-yes-bitmaps.conf' и '70-no-botmaps.conf' в '/etc/fonts/conf.d' и '/usr/share/fontconfig/conf.avail' (последняя директория может располагаться и в ином месте, но 'locate conf.avail' должен справиться с поиском). Дальнейшие действия очевидны: отключить отключение растровых шрифтов путём удаления линка на файл '70-no-botmaps.conf' и включить включение растровых шрифтов путём создания линка на '70-yes-bitmaps.conf'. Этого должно быть достаточно, чтобы 'fc-cache -fv' нашёл-таки наш шрифт, после чего (Иксы лучше перезапустить) наш кастомный шрифт будет можно выбрать в настройках программы - эмулятора терминала. Продолжение следует...
  •  
    ----* Использование less вместо tail для отслеживания хвоста файла (доп. ссылка 1)   [комментарии]
     
    Для отслеживания добавляемых в хвост файла изменений, например, для наблюдения
    за наполнением лог-файла, вместо традиционной команды "tail -f" удобно
    использовать утилиту less  с опцией "+F" (less +F имя_файла). Преимущество
    состоит в том, что утилита less предоставляет переключаться между режимом
    перемещения по файлу и отслеживанием изменений.
    
    Например, при появлении важной информации можно прервать отслеживание хвоста,
    нажав "Ctrl+C", после чего выполнить поиск или переместиться в верхнюю часть
    файла. Для возобновления отслеживания изменений достаточно нажать "F".
    Аналогичным образом, нажав "F", можно проверить появление новых данных в хвосте
    и для файла, открытого в less без предварительного указания опции "+F".
    
    Недостатком less является поддержка отслеживания только одного файла, в то
    время как "tail -f" позволяет одновременно следить за хвостами нескольких файлов.
    
     
    ----* Динамическое изменение заголовков окон в screen (доп. ссылка 1)   [комментарии]
     
    Как известно, screen умеет динамически менять заголовки окон, исследуя каждую
    выводимую строку приложения на наличие esc-k. Вот этого в .bashrc достаточно,
    чтобы научить screen менять заголовок в зависимости от запущенного приложения:
    
       if [[ "$TERM" == "screen" ]]; then
           SCREENTITLE='\[\ek\e\\\]'
           PS1="${SCREENTITLE}${PS1}"
       fi
    
    Однако, очень хотелось заставить screen менять заголовок окна в зависимости от
    того, на какой сервер/железку я зашел с помощью ssh или telnet. Сделал это
    парой скриптов (оберток) для ssh и telnet, сохранил их в каталоге ~/.scripts и
    добавил этот каталог в начало окружения PATH.
    
    .scripts/telnet
    
       #!/bin/bash
    
       echo -ne "\ek->`echo $@|awk 'BEGIN{opts="-l-n-e"}
       {for(i=1;i<=NF;i++){if(substr($(i),1,1)=="-")
       {if(index(opts,$(i))!=0)i++;continue;}break;}print $(i);}'`\e\\" /usr/bin/telnet $@ < `tty` > `tty`
    
    .scripts/ssh
    
       #!/bin/bash
    
       echo -ne "\ek->`echo $@ | awk 'BEGIN{opts="-b-c-D-e-F-I-i-L-l-m-O-o-p-R-S-W-w"}
       {for(i=1;i<=NF;i++){if(substr($(i),1,1)=="-")
       {if(index(opts,$(i))!=0)i++;continue;}break;}print $(i);}'`\e\\" /usr/bin/ssh $@ < `tty` > `tty`
    
     
    ----* Автодополнение ssh-хостов в командной строке (доп. ссылка 1)   Автор: bthemad  [комментарии]
     
    Простейшим способом упрощения набора параметров для частоиспользуемых хостов
    является задание псевдонимов в ~/.ssh/config:
    
       Host        myhost      # Имя хоста
       HostName    server.com  # Это удаленнй хост
       User        username    # Пользователь на удаленном хосте
       Port        22222       # Номер порта
    
    При этом вместо "ssh -p 22222 -l username server.com" теперь достаточно написать "ssh myhost".
    
    В случае когда этого недостаточно и хочется получить в bash поддержку
    автодополнения типовых имен хостов можно добавить в ~/.bashrc или ~/.profile
    следующие конструкции.
    
    При поиске имен среди параметров Host и HostName в ~/.ssh/config:
    
       complete -W "$(echo `cat ~/.ssh/config | grep -iE '^(Host|HostName) ' | awk '{print $2}'`)" ssh
    
    
    Обычно в дистрибутивах Linux уже присутствует настройка (/etc/bash_completion)
    для автодополнения по содержимому файла known_hosts, но в последних версиях
    OpenSSH имена хостов в данном файле перестали задаваться в открытом виде,
    поэтому автодополнение не работает. Тем не менее хэширование имен можно
    отключить указав в ssh_config "HashKnownHosts no".
    
    Для поиска по known_hosts может быть использована конструкция:
    
       complete -W "$(echo `cat ~/.ssh/known_hosts | cut -f 1 -d ' ' | sed -e s/,.*//g | uniq | grep -v "\["`;)" ssh
    
    
    Более развернутый пример запроса для организации автодополнения по содержимому
    первого столбца произвольного файла my_hosts.txt:
    
       _compssh ()
       {
       cur=${COMP_WORDS[COMP_CWORD]};
       COMPREPLY=($(compgen -W '$(cut -d " " -f1 ~/my_hosts.txt) --all --schema' -- $cur))
       }
       complete -F _compssh ssh
    
     
    ----* Раскраска man-страниц в Linux (доп. ссылка 1)   [комментарии]
     
    Для того чтобы насладиться системными руководствами в цвете, можно подключить к
    man программу для листания текста "most":
    
    в Debian-подобных дистрибутивах:
    
      apt-get install most
    
    в [Red Hat]-подобных дистрибутивах:
    
      yum install most
    
    Настраиваем вывод в man, в ~/.profile добавляем или выполняем в командной
    строке для текущей сессии:
    
      export MANPAGER="/usr/bin/most -s"
    
    Смотрим результат:
    
      $ man bash
    
     
    ----* Отображение числа непрочитанных писем Gmail в строке статуса Screen (доп. ссылка 1)   Автор: itbg  [комментарии]
     
    Итак, нам потребуется установленный GNU Screen и Wget
    
    Правим свой файл .screenrc
    
        caption always "%{= kw}%-w%{= BW}%n %t%{-}%+w %-= | %1` Unread |"
        backtick 1 60 60 /home/Ваша_home_директория/bin/get_gmail
    
    get_gmail - Это скрипт для получения почты, листинг смотрите ниже.
    
    Сейчас создадим необходимые директории
    
       mkdir ~/bin
       cd bin/
    
    В этом каталоге создаём скрипт get_mail
    
       #!/bin/bash
       gmail_login="username"
       gmail_password="password"
       fetch="$(wget -secure-protocol=TLSv1 -timeout=3 -t 1 -q -O - \
         https://${gmail_login}:${gmail_password}@mail.google.com/mail/feed/atom -no-check-certificate )"
       line="$(echo "$fetch" | grep 'fullcount')"
       unread="$(echo "$line" | sed "s/<fullcount>\(.*\)<\/fullcount>/\1/")"
       if [ -z "$unread" ]; then
          echo "!"
       else
          echo "$unread"
       fi
    
    Осталось дать права на запуск
    
       chmod 700 get_gmail
    
    В принципе, это написано в качестве примера использования.
    Остальное всё зависит от Вашей фантазии.
    
    Можно например зациклить выполнение проверки писем.
    
       #!/bin/bash
       gmail_login="username"
       gmail_password="password"
       while [ 1 ]; do
         fetch="$(wget -secure-protocol=TLSv1 -timeout=3 -t 1 -q -O - \
           https://${gmail_login}:${gmail_password}@mail.google.com/mail/feed/atom -no-check-certificate )"
         line="$(echo "$fetch" | grep 'fullcount')"
         unread="$(echo "$line" | sed "s/<fullcount>\(.*\)<\/fullcount>/\1/")"
         if [ -z "$unread" ]; then
            echo "!"
         else
            echo "$unread"
         fi
         sleep 10m
       done
    
    Затем если Вы как я используете оконный менеджер dwm, добавить это в файл ~/.xinitrc.
    В скрипте после done нужно поставить знак & (done &)
    И получать число непрочитанных писем в его статус баре, с интервалом 10 минут.
    
    Как вариант, можно поправить строчку  mail.google.com/mail/feed/atom
    накакой-нибудь другой feed и получать письма с определённого лэйбла.
    
    
    Оригинал на английском: http://tuxtraining.com/2009/04/29/show-unread-gmails-in-gnu-screen-status-bar
    
     
    ----* Выборка и копирование файлов по дате в Linux   Автор: Sclif13  [комментарии]
     
    Столкнулся с такой задачей: из каталога необходимо выбрать и скопировать кучу
    файлов за один месяц.
    Вооружившись командами cp, ls  и awk я приступил и вот что получилось:
    
       cp $(ls -l | grep 2009-01 | awk '{print $8}') /home/temp/
    
    ls -l выводит содержимое каталога с датой
    grep соответственно выбирает файлы за месяц
    awk '{print $8}' выводит имя файла для команды cp
    
    Дальше больше ...
    Есть каталог в котором куча подкаталогов и в которых соответственно файлы,
    которые надо скопировать.
    Тут на помощь приходит утилита du:
    
       cp $(du -a --time | grep 2009-01 | awk '{print $4}') /home/temp/
    
     
    ----* Обработка XML данных в командной строке при помощи xmlstarlet   [комментарии]
     
    В составе Debian, Ubuntu и других Linux дистрибутивах можно найти пакет
    xmlstarlet (http://xmlstar.sourceforge.net/),
    представляющий собой набор утилит командной строки для преобразования, выборки
    данных и проверки XML документов.
    Реализует для работы с XML функции похожие на утилиты grep, tr, sed, awk, diff, patch, join и т.п.,
    что очень удобно для разбора XML документов в скриптах.
    
    Например, для парсинга RSS и вывода заголовков можно использовать:
    
       curl url_rss | xmlstarlet sel -t -m /rss/channel/item -v title -n
    
    вывод из RSS ссылки и заголовка, разделенные символом "|"
    
       curl url_rss | xmlstarlet sel -t -m /rss/channel/item -v link -o "|" -v title -n
    
    Для ленты в формате Atom, с построчным разделением URL от заголовка:
       
       curl url_rss | sed 's/xmlns=/_xmlns=/'| xmlstarlet sel -t -m /feed/entry -v link/@href -n -v title -n
    
    
    Опция -t информирует о начале задания шаблона, определенного далее идущими директивами.
    -m указывает, параметры XPath выборки, в нашем случае, обработка всех <item>
    внутри <channe> внутри <rss>.
    -v - определяем содержимое какого поля выводить.
    -n - инициирует вывод символа перевода строки,
    -o - позволяет вывести произвольный текст.
    
    Быстрый просмотр текста в ODT файле
    
       unzip -p document.odt content.xml | xmlstarlet sel -N text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" \
       -T -t -m '//text:p' -v . -n
    
    Построить список изображений, используемых в заданной странице:
    
       cat test.html| xmlstarlet sel --html -t -m "//img" -v "@src" -n
    
    Примеры использования xmlstarlet для различных ситуаций можно найти в
    директории /usr/share/doc/xmlstarlet/examples
    
     
    ----* Настройка работы кнопок home и end при работе во FreeBSD через ssh-клиент Putty (доп. ссылка 1)   [комментарии]
     
    При работе во FreeBSD по ssh через putty не работают кнопки Home и End. 
    
    Для решения проблемы в настройках putty (Connection / Data / Terminal-type string) 
    нужно поставить putty вместо xterm.
    Это позволит использовать описание терминала putty, которое уже присутствует в
    termcap из состава FreeBSD.
    
    
    Другой вариант, в .cshrc можно прописать:
    
       bindkey "\e[3~" delete-char
       bindkey "\e[1~" beginning-of-line
       bindkey "\e[4~" end-of-line
    
     
    ----* Команды для поиска больших файлов в заданной директории   [комментарии]
     
    Для вывода отсортированного списка файлов размером больше 500Мб, находящихся 
    в дереве файловой системы начиная с текущей директории можно использовать команду:
    
       find . -type f -size +500M -exec ls -l {} \; | sort -k5 -n -r| less
    
    Для вывода отсортированного по размеру списка директорий можно использовать команду:
    
       find . -type d -maxdepth 1 -exec du -s {} \;|sort -k1 -r -n| less
    
    Для выявления конечной директории с большими файлами можно снять ограничение на
    рекурсивную проверку:
    
       find . -type d -exec du -s {} \;| sort -k1 -r -n| less
    
    Найти все avi, mpg, wmv файлы можно так:
    
       find . \( -iname "*.avi" -o -iname "*.mpg" -o  -iname "*.wmv" \) -type f -exec ls -l {} \;| less
    
    PS. Вместо ls можно было использовать встроенные опции -ls или -printf "%s %P\n", 
    но %P не всегда легко вспомнить, а вывод -ls не совсем привычен.
    
     
    ----* Удобный поиск по истории команд в консоли в Debian GNU Linux   Автор: Karbofos  [комментарии]
     
    C помощью кнопок PgUp, PgDwn (страница ввсерх/вниз) можно листать хистори введенных ранее команд,
    при этом в отличии от использования клавиш управления курсором, при наличии в строке ввода
    каких-то символов они будут использованы в качестве маски для фильтра.
    Т.е. введя "ssh" и нажав PgUp/PgDwn можно просмотреть введенные ранее команды с использованием ssh.
    
    Стандартно, данная комбинация кнопок на Debian деактивирована.
    
    Находим в директори /etc файл, с именем inputrc редактируем его, 
    добавив строки, в случае, если позиционирование по хистори не работает:
       # alternate mappings for "page up" and "page down" to search the history
       "\e[5~": history-search-backward
       "\e[6~": history-search-forward
    
    обычно эти установки в Debian просто закомментированы.
    
    Изменив этот файл, вы настраиваете данные кнопки для всех пользователей. 
    Если необходимо настроить для какого-то пользователя, то настройки эти есть в файле .inputrc 
    в домашней директории. Данный файл можно создать на основе общесистемного аналога из /etc
    
       cp /etc/inputrc ~/.inputrc
    
     
    ----* Использование Vim для просмотра файлов с подсветкой синтаксиса   [комментарии]
     
    В поставке vim присутствует сценарий /usr/share/vim/vim71/macros/less.sh:
    
    #!/bin/sh
    
    if test $# = 0; then
      vim --cmd 'let no_plugin_maps = 1' -c 'runtime! macros/less.vim' -
    else
      vim --cmd 'let no_plugin_maps = 1' -c 'runtime! macros/less.vim' "$@"
    fi
    
    Который можно использовать для замены less с подсветкой синтаксиса.
    
    В .bashrc добавляем:
    
       alias less=/usr/share/vim/vim71/macros/less.sh
    
     
    ----* Подборка полезных консольных команд и приемов работы в bash   [комментарии]
     
    Быстрый поиск PID идентификатора запущенного процесса по имени:
    
       pgrep ssh
    
    Выполнение последней выполненной команды в Bash:
    
       !!
    
    Выполнение последней выполненной команды в Bash, начинающейся с заданных символов
    Например, с символа "s":
    
       !s
       !ssh
    
    Для того, чтобы перед выполнением посмотреть, что за команда отвечает маске !ssh нужно добавить :p
    
       !ssh:p
    
    Периодический перезапуск команды с перерисовкой экрана:
    Например, для отображения изменений содержимого директории:
    
       watch -d ls -l
     
    Быстрое сохранение файла и выход, в VI/VIM
    
       Вне режима вставки нужно нажать ZZ (два раза нажать z с нажатым Shift).
    
    Быстрый выход из терминала:
    
       CTRL+D
    
    Возврат в прошлую директорию в shell:
    
       cd -
    
    Создание директории с недостающими промежуточными директориями:
    
       mkdir -p /tmp/dir1/dir2/dir3
    
    что эквивалентно 
    
       mkdir /tmp/dir1
       mkdir /tmp/dir1/dir2
       mkdir /tmp/dir1/dir2/dir3
    
    Удаление введенной строки в shell:
    
       CTRL+U
    
    Изменение времени модификации файла (2008-01-01 8:00 = 0801010800 (YYMMDDhhmm)):
    
       touch -c -t 0801010800 filename.c 
    
    Для обращения к аргументу прошлой команды можно использовать !$
       ls /usr/lib
       cd !$
    
    Исправление ошибки в последней команде при помощи оператора "^ключ^замена":
       $ cd /usr/loxal/bin            
        bash: cd: /usr/loxal/bin: No such file or directory
       $ ^loxal^local
        cd /usr/local/bin
    
     
    ----* Как хранить дату выполнения в истории команд bash (доп. ссылка 1)   Автор: kpblca  [комментарии]
     
    По умолчанию bash, а точнее утилита history, не сохраняет в .bash_history 
    время исполнения каждой команды.
    
    Почитал маны и оказалось, что в баше трейтье версии сделать это можно и весьма просто. 
    Если объявить глобальную переменную HISTTIMEFORMAT с форматом выводимых данных, 
    то утилита history будет сохранять и выводить эту дату.
    
    Итак, пишем в ~/.bashrc строчку
    
       export HISTTIMEFORMAT='%h %d %H:%M:%S '
    
    После этого в .bash_history перед каждой командой появится коментарий
     с цифрой - временем выполнения этой команды в формате timestamp:
    
       #1198068550
       history
       #1198139874
       ьс
       #1198139876
       mc
       #1198148168
       ssh teletrade.ru
       #1198148217
       ssh teletrade.ru
    
    А команда history будет выдавать историю данных с датой в формате,
     который мы переменной задали (в похожем формате выдают дату и время утилита ls):
    
       995  Дек 19 15:49:10 history
       996  Дек 20 11:37:54 ьс
       997  Дек 20 11:37:56 mc
       998  Дек 20 13:55:49 ssh teletrade.ru
    
    Но можно сделать и по ГОСТУ, в приятном русскому глазу виде "ДД.ММ.ГГГГ"
    
       export HISTTIMEFORMAT='%d.%m.%Y %H:%M:%S '
    
    А можно и на американский манер "YYYY-MM-DD"
    
       export HISTTIMEFORMAT='%Y-%m-%d %H:%M:%S '
    
     
    ----* Отдельный файл истории работы в bash для пользователя работающего через SU (доп. ссылка 1)   [комментарии]
     
    Чтобы поместить в отдельный лог команды выполненные в режиме su:
    
    .bash_profile
       export HISTSIZE=3000
       export HISTFILESIZE=99999
       export HISTFILE=/root/.bash_hist-$(who am i|awk '{print $1}';exit)
    
    Получим два файла истории: .bash_hist-user и .bash_hist-root
    
     
    ----* Как задать задержку выключения дисплея для консоли Linux и FreeBSD   Автор: Johny  [комментарии]
     
    Установка времени гашения консоли Linux:
    
       setterm -blank <минуты>
    
    Или чтоб экран не гас совсем:
    
       setterm -blank 0  
    
    Для FreeBSD в /etc/rc.conf: blanktime="NO", saver="NO"  или blanktime="секунды"
    
    Команда:
    
       vidcontrol  -t секунды < /dev/ttyv0
    
    или 
    
       vidcontrol  -t off < /dev/ttyv0
    
     
    ----* Как подключиться к уже открытой сесии screen (доп. ссылка 1)   [комментарии]
     
    Для дублирования двух screen сессий, например, для удаленной демонстрации
    каких-то консольных операций:
    
    Создать сессию
       screen -S имя_сессий
    или посмотреть уже открытую через
       screen -list
    
    Присоединиться к активной сессии:
       screen -x имя_сессий
    
    Два окна будут отображаться синхронно.
    
    Также можно позволить другому пользователю подключиться к чужой screen сессий.
    Но, для этого на бинарный файл screen необходимо установить suid бит, 
    чтобы он всегда запускался с привилегиями суперпользователя, что не
    рекомендуется делать из соображений безопасности.
       sudo chmod u+s /usr/bin/screen
    
    В активной сессии включаем многопользовательский режим:
       ctrl-a :multiuser on
    
    Добавляем в список доступа нужного пользователя:
       ctrl-a :acladd имя_пользователя
    
    Другой пользователь подключается командой:
       screen -x имя_пользователя_запустившего_screen/имя_сессии
    
    Пользователю можно открыть доступ в режиме только для просмотра (http://aperiodic.net/screen/multiuser):
       ctrl-a :writelock on
    
     
    ----* Изменение графической заставки, отображаемой в процессе загрузки Linux. (доп. ссылка 1)   Автор: Alexander Kuprin  [комментарии]
     
    Настройка bootsplash для AltLinux (темы берутся с http://bootsplash.de/)
    В качестве примера взята тема AquaMatrix для разрешения 1024x768).
    
    1. Установить пакеты:
    
       apt-get install bootsplash design-bootloader-AquaMatrix
    
    2. Перегенерировать inird-образ:
    
       mkinitrd -f /boot/initrd-`uname -r`.img `uname -r`
    
    3. Добавить в конец образа собственно splash:
    
       splash -s -f /etc/bootsplash/themes/AquaMatrix/config/bootsplash-1024x768.cfg >> 
          /boot/initrd-`uname -r`.img
    
    4. В /etc/lilo.conf (или /boot/grub/menu.lst) дописать к параметрам ядра и запустить lilo.
    
       vga=791 splash=silent
    
    5. В /etc/sysconfig/bootsplash укажите название темы и включите её.
    
       SPLASH="yes"
       THEME="AquaMatrix"
    
    Для изменения фонового изображения на первой консоли:
    
       splash -s -u 1 путь_к_splash.cfg
    
     
    ----* Как выделить цветом определенное слово, используя "tail -f" (доп. ссылка 1)   [комментарии]
     
    Пример, выделения слова Reject при просмотре хвоста почтового лога:
        tail -f /var/log/maillog |perl -p -e  's/Reject/\033\[46;1mReject\033[0m/gi;'
    
    Если нужно не только выделять цветом, но и подавать звуковой сигнал при появлении [email protected]:
        tail -f /var/log/maillog |perl -p -e  's/(test\@test.ru)/\033\[46;1m$1\033[0m\007/gi;'
    
     
    ----* Решение проблем со screen под FreeBSD (доп. ссылка 1)   Автор: Vladimir Kurtukov  [комментарии]
     
    Иногда приложения перестают запускаться из-под screen в FreeBSD.
    Например, midc ругается "subshell.c: read (subshell_pty...): Unknown error: 0".
    Для решения проблемы достаточно выполнить  "killall -CONT <your shell>", например:
       killall -CONT bash
    
     
    ----* Выполнение команды раз в N сек. с перерисовкой результата (доп. ссылка 1)   [комментарии]
     
      watch -n1 "cat /proc/interrupts" 
    
     
    ----* Как осуществить форматирование файла ограничив число символов в строке   [обсудить]
     
    Жестко разбить по 60 символов в строке: fold -w 60 test.txt
    Разбивать только по пробелам, не разбивая слова на части: fold -s -w 60 test.txt
    Для форматирования текста программы на Си можно воспользоваться утилитой indent.
    Разбить на параграфы поможет fmt из textutils.
    
     
    ----* Некоторые полезные клавишные комбинации в Midnight Commander'е   [обсудить]
     
    Ctrl-\ - возможность ведения списка часто используемых директорий, включая FTP.
    Сtrl-s или Meta-s - интерактивный поиск файла в панели.
    Meta-Tab  - дополнение имени файла в любом диалоге.
    Ctrl-q - вставить в редакторе непечатный символ по коду.
    F1...F10 эмулируются ESC-1...ESC-0
    F11..F12..F13.. эмулируются нажатием Shift-F1..Shift-F2..Shift-F3..
    Meta-! - запустить программу и посмотреть ее вывод во встроенном просмотрщике.
    Meta-c - быстрый переход в директорию
    Meta-t - изменить тип отображения файлов в панели.
    В редакторе: Shift-! - выход в командную строку на время, ctrl+T - перекодировка.
    Выделить только директории можно добавив / после * в блоке пометки.
    midc -s - для работы на медленных терминалах.
    
     
    ----* Как в screen скопировать многостраничный текст в буфер и обратно.   [обсудить]
     
    Ctrl+A,Esc
    Подвести курсор к нужной позиции (можно использовать для просмотра предыдущих страниц) 
    и нажать Enter.
    Отметить нужный фрагмент и нажать Enter.
    Для вставки сохраненного блока необходимо нажать Ctrl+A,].
    
     
    ----* Сброс терминала   [обсудить]
     
    # echo -ne "\033c" >/dev/tty1
    
    или
    
    $ stty sane
    
    или
    
    $ reset
    
     
    ----* Использование нескольких буферов обмена в консоли при помощи GNU Screen (доп. ссылка 1)   Автор: Владимир Кунщиков  [комментарии]
     
    Довольно часто возникает потребность в нескольких буферах обмена между
    открытыми консольными сессиями. Задача легко решаема при помощи регистров
    в GNU Screen. Для создания и быстрого доступа к дополнительным буферам
    необходимо задать в файле $HOME/.screenrc команды копирования в регистр
    readreg и чтения из регистра paste. Ниже пример добавления буферов,
    закрепленных за клавишами  1 и 2:
     
       bind -c pastdemo1 1 paste 1  
       bind -c pastdemo1 2 paste 2  
       bindkey "^V" command -c pastdemo1
       bind -c copydemo1 1 readreg 1  
       bind -c copydemo1 2 readreg 2  
       bindkey "^C" command -c copydemo1
    
    В результате по нажатию клавиш control v  1
    
       ctrl v 1
    
    в активную сессию будет вставлен первый буфер, по ctrl v 2 второй. Получилось
    некое подобие именованных буферов ViM.
    
    Чтобы заполнить второй буфер  надо обычным образом заполнить стандартный
    буфер обмена Gnu Screen, то есть выполнить
    
       ctrl A ctrl [
    
    далее выбрать на терминале текст, что необходимо скопировать. Потом скопировать
    текст из обычного буфера в регистр 2 нажатием клавиш
    
       ctrl c 2
    
    Было бы удобнее, если бы по ctrl c 2 открывался режим копирования, как в
    стандартный буфер. Ещё хорошо бы если этот биндинг задавался проще - через
    что-то вроде bind -c copydemo1 * readreg *, но и данный пример конфигурации не
    сильно сложен.
    
     

       Работа с Web и Ftp

    ----* Как отключить TLS-расширение ECH для решения проблем с Cloudflare в РФ   [комментарии]
     
    Роскомнадзор начал блокировать в РФ  соединения к сайтам, использующим
    TLS-расширение ECH (Encrypted Client Hello). Блокировка привела к массовым
    проблемам с сайтами, работающими через сеть доставки контента Cloudflare,
    которую используют примерно 19% всех сайтов в интернете (по другим данным
    16%  (31 млн) активных сайтов или 23.83% из миллиона самых популярных сайтов).
    
    О масштабе сбоев можно судить хотя бы по тому, что из-за блокировки ECH была
    нарушена работа сайта самого Роскомнадзора, на котором для загрузки шрифтов
    использовался сервис webfontfree.com, работающий через Cloudflare (первая
    попытка открытия rkn.gov.ru приводила к минутному зависанию до истечения таймаута).
    
    
    ECH продолжает развитие TLS-расширений SNI и ESNI (Encrypted Server Name
    Indication) и предназначен для шифрования информации о параметрах TLS-сеансов,
    таких как запрошенное доменное имя. Если без ECH на стороне интернет-провайдера
    можно выборочно фильтровать HTTPS-трафик и анализировать какие сайты открывает
    пользователь, то ECH позволяет добиться полной конфиденциальности при
    применении HTTPS при обращении к сайтам, использующим сети доставки контента с
    поддержкой ECH. После включения поддержки ECH в Cloudflare Роскомнадзор потерял
    возможность блокировать сайты, использующие данную сеть доставки контента, и
    поэтому просто начал блокировать HTTPS-запросы с ECH (судя по всему блокировка
    ECH  пока ограничивается отдельными подсетями Cloudflare).
    
    На стороне пользователя в Firefox доступ к сайтам, работающим через Cloudflare,
    можно решить двумя путями:
    
    * отключить настройки network.dns.echconfig.enabled и
    network.dns.http3_echconfig.enabled на странице about:config
    
    * отключить использование протокола TLS 1.3 выставив в about:config параметр
    security.tls.version.max  в значение "3". При этом может быть нарушена работа с
    серверами, поддерживающими только протокол TLS 1.3 и отключившими поддержку TLS 1.2.
    
    В Chrome раньше ECH можно было отключить через параметр 
    chrome://flags#encrypted-client-hello, но с февраля этого года он удалён и ECH
    всегда включён по умолчанию. Для отключения ECH в Chrome обходным путём можно
    создать файл /etc/opt/chrome/policies/managed/conf.json c содержимым:
    
       {
         "EncryptedClientHelloEnabled": false
       }
    
    
    
    Владельцы сайтов, использующих Cloudflare, могут отключить ECH в личном
    кабинете dash.cloudflare.com в секции "SSL > Edge Certificates > Encrypted
    ClientHello (ECH)".
    
    Если тарифный план не предусматривает возможность изменения данной настройки
    через web-интерфейс, для отключения ECH можно использовать API:
    
       curl -X PATCH "https://api.cloudflare.com/client/v4/zones/ID_ZONE/settings/ech" -H "X-Auth-Key: YOUR_GLOBAL_API_KEY" -H "X-Auth-Email: YOUR_EMAIL" -H "Content-Type: application/json" --data '{"id":"ech","value":"off"}'
    
     
    ----* Установка в Firefox официального расширения Google Translate, поставляемого для Chrome   Автор: Аноним  [комментарии]
     
    Думаю, многим, как и мне, в Firefox не хватает функции "встроенного" перевода
    страниц. Я перепробовал много расширений для перевода, но все они по
    функциональности уступают официальному расширению Google Translate для
    браузера Google Chrome. Есть похожее расширение Translate Web Pages, но оно
    имеет лишь "встроенный" перевод и не позволяет переводить выделенный или
    введённый вручную текст.
    
    В принципе, для этой цели можно использовать Foxified, но там как-то все сложно.
    
    Итак, для этого нужно:
    
    
  • Скачать расширение Google Translate из Chrome Web Store и распаковать его. Для этого есть куча разных сервисов (гугл в помощь), но так как у меня параллельно стоит браузер Google Chrome, я просто установил в нем это расширение, зашел в каталог с расширениями ~/.config/google-chrome/Default/Extensions/, нашел его там (надо найти подкаталог в версией расширения в названии; на данный момент это подкаталог с названием 2.0.9_0) и скопировать этот каталог в любое удобное для вас место.
  • Далее нужно немного отредактировать файл manifest.json. Итак, открывает этот файл в любом удобном вам редакторе и заменяем   "options_page": "options.html", на   "options_ui": {      "open_in_tab": true,      "page": "options.html"   },   "browser_specific_settings": {      "gecko": {         "id": "[email protected]"      }   }, Ну или можно просто применить этот патч.
  • После этого нам нужно упаковать в zip-архив содержимое этого каталога (именно содержимое, а не сам каталог). Для этого в терминале переходим в этот каталог (на уровень с файлом manifest.json) и выполняем   zip -r [email protected] .
  • Затем, чтобы иметь возможность установить наше расширение, нам нужно отключить проверку подписи расширений, так как наше расширение неподписанное. Для этого в браузере Firefox открываем страницу about:config, нажимаем кнопку Accept the Risk and Continue, ищем параметр xpinstall.signatures.required и устанавливаем его значение в false. Далее перезапускаем браузер.
  • Далее устанавливаем наше расширение. Открываем страницу about:addons, нажимаем на значок шестеренки, в выпадающем меню нажимаем Install Add-on From File и выбираем файл нашего расширения (напомню, это файл с названием [email protected]). Вуаля, расширение установлено! Чтобы стала доступной страница настроек нашего расширения, нужно рядом с расширением нажать на три точки и затем нажать Manage. К сожалению, в нашем расширении не работает перевод выделенного текста во всплывающем окне, но зато работает "встроенный" перевод, перевод текста, введенного вручную, и перевод выделенного текста через контекстное меню. Аналогично, можно попробовать портировать другие расширения из Chrome Web Store в браузер Firefox: для этого их нужно проверить на совместимость и если расширение совместимо, то немного отредактировать файл manifest.json. Также для пущего удобства наше расширение можно подписать, но "это уже совсем другая история". Дополнение: Чтобы заработал перевод выделенного текста во всплывающем окне, нужно в файле popup_compiled.js найти текст "Jh=function(){" (без кавычек) и добавить после него текст "if(!jf.loaded)setTimeout(Jh,5);else " (без кавычек, но с пробелом в конце).
  •  
    ----* Конвертация Chrome-дополнения для запуска в Firefox (доп. ссылка 1)   [комментарии]
     
    Для установки в Firefox браузерных дополнений на базе API WebExtension,
    подготовленных только для Chrome или Opera, можно использовать дополнение
    Foxified (https://github.com/Noitidart/Chrome-Store-Foxified). Проблема в том,
    что Foxified не может быть запущен, начиная с Firefox 57, в котором была
    прекращена поддержка XUL/XPCOM.
    
    В качестве обходного пути предлагается параллельно с основной актуальной
    версией Firefox установить Firefox 56 и запустить в нём Foxified.
    
    Перед началом работы следует зарегистрироваться в каталоге дополнений Mozilla
    AMO (https://addons.mozilla.org) или войти в существующую учётную запись для
    последующего формирования цифровой подписи.
    
    Далее нужно скопировать URL Chrome-дополнения из Chrome WebStore и добавить его
    через меню "add to firefox, available on chrome" в Foxified. После этого во
    вкладке "chrome store foxified" нужно принять соглашение  Mozilla AMO. После
    завершения преобразования в верхнем правом углу появится кнопка "add" с
    предложением установить дополнение.
    
    После этого переходим на страницу about:debugging  и активируем режим отладки
    дополнений ("enable add-on debugging"). Находим в списке дополнений
    преобразованное дополнение и определяем его идентификатор
    (Extension ID), заданный в форме "*@chrome-store-foxified-*".
    
    Закрываем Firefox 56 и находим в каталоге с дополнениями Firefox
    (/.mozilla/firefox/*/extensions) xpi-файл с найденным идентификатором.
    Запускаем актуальный Firefox и устанавливаем полученный xpi-файл через кнопку с
    шестерёнкой в менеджере дополнений (about:addons), выбрав в меню "Install
    Add-on from File".
    
     
    ----* Включение DNS-over-HTTPS в Chrome (доп. ссылка 1)   [комментарии]
     
    В феврале в кодовую базу Chromium без лишней огласки была добавлена
    недокументированная возможность использования DNS-over-HTTPS (DoH).  Если в
    обычной ситуации DNS-запросы напрямую отправляются на определённые в
    конфигурации системы DNS-серверы, то в случае DoH запрос на определение
    IP-адреса хоста инкапсулируется в трафик HTTPS и отправляется на HTTP-сервер,
    на котором резолвер обрабатывает запросы через Web API. Существующий стандарт
    DNSSEC использует шифрование лишь для аутентификации клиента и сервера, но не
    защищает трафик от перехвата и не гарантирует конфиденциальность запросов.
    
    Для использования DoH-сервера компании  Cloudflare следует запустить Chrome с опциями:
    
    
       chrome --enable-features="dns-over-https<DoHTrial" \
        --force-fieldtrials="DoHTrial/Group1" \
        --force-fieldtrial-params="DoHTrial.Group1:server/https%3A%2F%2Fcloudflare-dns%2Ecom%2Fdns-query/method/POST
    
    
    
    В Firefox начиная с конца сентября поддержка DNS-over-HTTPS будет поступательно
    включаться по умолчанию. Для включения DoH не дожидаясь активации по
    умолчанию, в about:config следует изменить значение переменной network.trr.mode:
    
    * 0 полностью отключает DoH; 
    * 1 - используется DNS или DoH, в зависимости от того, что быстрее; 
    * 2 - используется DoH по умолчанию, а DNS как запасной вариант; 
    * 3 - используется только DoH; 
    * 4 - режим зеркалирования при котором DoH и DNS задействованы параллельно. 
    
    По умолчанию используется DNS-сервер CloudFlare, но его можно изменить через
    параметр network.trr.uri, например, можно установить
     "https://dns.google.com/dns-query" ("https://9.9.9.9/dns-query") 
     "https://dns.quad9.net/dns-query"  
     "https://doh.opendns.com/dns-query" 
     "https://cloudflare-dns.com/dns-query" ("https://1.1.1.1/dns-query")
     "https://doh.cleanbrowsing.org/doh/family-filter/"
      "https://doh.dns.sb/dns-query"
    
     
    ----* Блокировка установки системных дополнений и отправки телеметрии в Firefox (доп. ссылка 1)   [комментарии]
     
    Для запрета установки и обновления системных дополнений в about:config меняем
    (если переменная отсутствует, её необходимо создать):
    
       extensions.systemAddon.update.url=""
       extensions.systemAddon.update.enabled=false
    
    Для отключения сбора телеметрии:
    
       toolkit.telemetry.enabled=false
       toolkit.identity.enabled=false
       toolkit.crashreporter.infoURL=""
       toolkit.telemetry.infoURL=""
       toolkit.telemetry.rejected=true
       toolkit.telemetry.unified=false
       toolkit.telemetry.server=""
       toolkit.telemetry.cachedClientID=""
       toolkit.telemetry.archive.enabled=false
    
    
    
    Для отключения участия в тестировании экспериментальных возможностей:
    
       network.allow-experiments=false
       experiments.supported=false
       experiments.enabled=false
       experiments.activeExperiment=false
       experiments.manifest.uri=""
    
    Для отключения отправки отчётов о крахах:
    
       browser.selfsupport.url=""
       browser.tabs.crashReporting.sendReport - false
       security.ssl.errorReporting.enabled - false
       datareporting.healthreport.uploadEnabled=false
       datareporting.healthreport.service.enabled=false
       datareporting.healthreport.logging.consoleEnabled=false
       datareporting.policy.dataSubmissionEnabled=false
       datareporting.policy.dataSubmissionEnabled.v2=false
       dom.ipc.plugins.flash.subprocess.crashreporter.enabled - false
       dom.ipc.plugins.reportCrashURL - false
     
    
     
    ----* Как автоматически отключить закреплённые шапки на сайтах в Firefox   [комментарии]
     
    Последнее время дизайнеры всё чаще используют CSS-свойство "position: fixed"
    для закрепления шапки и футера, что создаёт дискомфорт при просмотре страниц и
    съедает драгоценное экранное пространство на широкоформатных экранах.
    
    Для автоматического отключения "position: fixed"  можно использовать дополнение
    greasemonkey
    вместе с простым скриптом  unfix-all-the-toolbars.user.js:
    
    
       // ==UserScript==
       // @name        unfix-all-the-toolbars
       // @description Removes "position: fixed" style from elements, unfixing "toolbars" and the such.
       // @namespace   http://inf.ufrgs.br/~vbuaraujo/
       // @include     *
       // @version     1
       // @grant       none
       // ==/UserScript==
    
    
       /* 
       Based on https://stackoverflow.com/questions/13696100/greasemonkey-script-to-make-fixed-positioned-elements-static
       2015-02-17: Original version.
       2016-05-01: Added the styleWidth threshold heuristic.
       The big problem here is we want to avoid unfixing *all* "position: fixed"
       elements, because some of them are fake popup windows which become quite
       unusable if you change them to "position: static". So we need some heuristic
       to distinguish "legitimate" fixed elements from gratuitous ones like navbars.
       */
    
       function numPixels(str) {
         if (str.endsWith("px"))
           return Number(str.slice(0, -2));
         else {
           console.log("unfix-all-the-toolbars: Computed width is not in pixels! " + width);
           return null;
         }
       }
    
      function unfixAll() {
         var bodyStyle = window.getComputedStyle(document.body);
         var pageWidth = numPixels(bodyStyle.width);
         var pageHeight= numPixels(bodyStyle.height);
         var toolbarWidthThreshold = 0.8 * pageWidth;
      
         Array.forEach(
           /* Assorted selection of likely fixed elements, to avoid querying all elements */
           document.querySelectorAll("h1, h2, ul, ol, li, div, nav, header, footer"),
           function (el) {
             var style = window.getComputedStyle(el);
             if (style.position === "fixed") {
               /* Avoid unfixing JavaScript popus like Twitter's "confirm retweet" window */
               if (style.display === "none" || style.visibility === "hidden") return;
               if (numPixels(style.width) < toolbarWidthThreshold) return;
            
               // Try to select the best replacement for 'fixed'. Still breaks lots of things, though.
              if (numPixels(style.bottom) === 0 && numPixels(style.top) > 0)
                 el.style.position = "static";    // Use static for footers.
               else
                 el.style.position = "absolute";
             }
          });
       }
    
       window.addEventListener("load", unfixAll);
    
    
    
    Другими вариантами могут  стать Firefox-дополнения unstickall, [[https://addons.mozilla.org/en-US/firefox/addon/hide-fixed-elements/ Hide Fixed
    Elements]] и Bar Breaker, которые позволяют отключить закрепление любого
    блока через клик на нём.
    
     
    ----* Использование ALSA в Firefox и приложениях, поддерживающих только PulseAudio (доп. ссылка 1)   [комментарии]
     
    В рамках проекта apulse развивается эмулятор API PulseAudio на базе
    подсистемы ALSA, позволяющий запускать некоторые привязанные к PulseAudio
    приложения без установки данного звукового сервера.
    
    Например, для запуска Firefox поверх ALSA достаточно выполнить:
    
        apulse firefox
    
    предварительно настроив устройство вывода и изменив параметры sandbox-изоляции в Firefox.
    
    Если устройство вывода звука по умолчанию не заработало, то его можно указать
    через переменную окружения APULSE_PLAYBACK_DEVICE, например:
    
       export APULSE_PLAYBACK_DEVICE=plughw:0,0 
    или
       export APULSE_PLAYBACK_DEVICE=hw:0,0 
    
    Список доступных устройств можно посмотреть командой
    
       aplay -L
    
    
    При использовании микрофона можно настроить и устройство ввода:
    
       export APULSE_CAPTURE_DEVICE=plughw:2,0 
    
    где 2 - это канал, связанный с микрофоном в web-камере (0 - встроенная карта, 1
    звуковой ввод через HDMI).
    
    В Firefox следует в настройках about:config разрешить доступ к устройству /dev/snd
    
       security.sandbox.content.read_path_whitelist = /dev/snd/,/home/username/.asoundrc
       security.sandbox.content.write_path_whitelist = /dev/snd/ 
    
    если не заработало также можно попробовать
    
       security.sandbox.content.level=2
    
    Если не работает смешивание звуков и при воспроизведении в Firеfox приглушаются
    другие источники, в файл ~/.asoundrc можно добавить
    
       pcm.plugdmix {
           type plug
           slave.pcm "dmix"
       }
    
    И указать устройство выхода plugdmix:
    
       export APULSE_PLAYBACK_DEVICE=plugdmix
    
     
    ----* Обход ограничения доступа к материалам сайтов для платных подписчиков (доп. ссылка 1)   [комментарии]
     
    Некоторые крупные англоязычные издания практикуют частичное ограничение доступа
    к актуальным статьям, публикуя анонсы в социальных сетях и других новостных
    изданиях, но предоставляя полный текст только платным подписчикам. В итоге,
    пользователь переходит по ссылке, ожидая увидеть подробности, но попадает на
    страницу с первым абзацем и предложением подписаться на полный доступ к сайту
    (Paywall). Подобный метод практикуют такие крупные издания, как dailypress.com,
    economist.com, forbes.com, hbr.org, inc.com, independent.co.uk, newsweek.com,
    newyorker.com, nytimes.com, thenation.com и wsj.com.
    
    Особенностью подавляющего большинства Paywall-сайтов является то, что они
    открывают полный доступ поисковым системам и социальным сетям, так как
    заинтересованы в индексации текстов и привлечении посетителей, ищущих данный
    материал. Поэтому для обхода блокировки, как правило, достаточно просто сменить
    идентификатор браузера и притвориться поисковым ботом. Для некоторых сайтов
    также может потребоваться очистить Cookie, если ранее сайт уже открывался в
    браузере. Например, можно запросить страницу, сменив User Agent на:
    
       Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
    или
       Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible ; Googlebot/2.1 ; +http://www.google.com/bot.html)"
    
    Для смены можно воспользоваться любым браузерным дополнением, меняющим User
    Agent, или установить специализированное дополнение Anti-Paywall.
    
     
    ----* Подмена параметров браузера для входа в закрытые области новостных сайтов (доп. ссылка 1)   [комментарии]
     
    Для обеспечения индексации поисковыми системами большинство сайтов с платным
    новостным контентом предоставляют обходной путь для беспрепятственного входа
    поискового бота Google. Бот проверяется по содержимому заголовков Referer и
    User-Agent, что позволяет любому желающему просмотреть закрытые области заменив
    идентификатор браузера и указав в качестве адреса предыдущей страницы google.com.
    
    Более того, некоторые платные ресурсы на основе значения Referer открывают
    полный текст статьи для посетителей пришедших с поисковых систем, но при
    попытке прямого обращения, требуют регистрации для просмотра платного контента.
    Такое поведение выглядит как дискриминация различных категорий пользователей.
    
    Для автоматизации беспрепятственного доступа к таким ресурсам как Wall Street
    Journal предлагается  небольшое дополнение к браузеру Chrome.
    
    Создаём файл manifest.json, перечислив сайты для которых следует притвориться поисковым ботом:
    
       {
         "name": "Innocuous Chrome Extension",
         "version": "0.1",
         "description": "This is an innocuous chrome extension.",
         "permissions": ["webRequest", "webRequestBlocking",
                      "http://www.ft.com/*",
                      "http://www.wsj.com/*",
                      "https://www.wsj.com/*",
                      "http://www.economist.com/*",
                      "http://www.nytimes.com/*",
                      "https://hbr.org/*",
                      "http://www.newyorker.com/*",
                      "http://www.forbes.com/*",
                      "http://online.barrons.com/*",
                      "http://www.barrons.com/*",
                      "http://www.investingdaily.com/*",
                      "http://realmoney.thestreet.com/*",
                      "http://www.washingtonpost.com/*"
                      ],
         "background": {
           "scripts": ["background.js"]
         },
         "manifest_version": 2
       }
    
    Создаём скрипт background.js:
    
       var ALLOW_COOKIES = ["nytimes", "ft.com"]
    
       function changeRefer(details) {
         foundReferer = false;
         foundUA = false
    
         var reqHeaders = details.requestHeaders.filter(function(header) {
           // block cookies by default
           if (header.name !== "Cookie") {
             return header;
           } 
    
           allowHeader = ALLOW_COOKIES.map(function(url) {
             if (details.url.includes(url)) {
               return true;
             }
           });
           if (allowHeader.filter(Boolean)==true) return header; 
    
         }).map(function(header) {
        
           if (header.name === "Referer") {
             header.value = "https://www.google.com/";
             foundReferer = true;
           }
           if (header.name === "User-Agent") {
             header.value = "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)";
             foundUA = true;
           }
           return header;
         })
      
         // append referer
         if (!foundReferer) {
           reqHeaders.push({
             "name": "Referer",
             "value": "https://www.google.com/"
           })
         }
         if (!foundUA) {
           reqHeaders.push({
             "name": "User-Agent",
             "value": "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
           })
         }
         console.log(reqHeaders);
         return {requestHeaders: reqHeaders};
       }
    
       function blockCookies(details) {
         for (var i = 0; i < details.responseHeaders.length; ++i) {
           if (details.responseHeaders[i].name === "Set-Cookie") {
             details.responseHeaders.splice(i, 1);
           }
         }
         return {responseHeaders: details.responseHeaders};
       }
       
       chrome.webRequest.onBeforeSendHeaders.addListener(changeRefer, {
         urls: ["<all_urls>"],
         types: ["main_frame"],
       }, ["requestHeaders", "blocking"]);
    
       chrome.webRequest.onHeadersReceived.addListener(blockCookies, {
         urls: ["<all_urls>"],
         types: ["main_frame"],
       }, ["responseHeaders", "blocking"]);
    
    
    
    Размещаем manifest.json и background.js в отдельной директории, открываем в
    Chrome страницу chrome://extensions/, включаем режим разработчика (Developer
    Mode), выбираем пункт "Click Load unpacked extension..." и указываем в
    открывшемся диалоге путь к директории с файлами.
    
     
    ----* Увеличение числа вкладок, вмещающихся в строке Firefox (доп. ссылка 1)   [комментарии]
     
    В ~/.mozilla/firefox/директория с профилем/chrome/userChrome.css добавляем:
    
       /* Уменьшаем размер шрифта, при желании меняем шрифт */
       .tabbrowser-tab .tab-text
       {
          font-size: 20px !important;
          font-family: Verdana !important; 
       }
    
       /* Уменьшаем высоту вкладок и отступы */
       .tabbrowser-tab {
          height: 24px !important;
          padding-right: 4px !important;
       }
       .tabbrowser-strip {
          height: 24px !important;
       }
    
       /* Уменьшаем минимальную ширину вкладки, чтобы больше влезло без прокрутки */
        .tabbrowser-tab[fadein]:not([pinned]) {
           min-width: 40px !important;
           max-width: 180px !important;
        }
    
     
    ----* Установка сервера видеоконференций openmeetings 2.2 в Debian 7.4   Автор: Artem Solodchenko  [комментарии]
     
    Настройка openmeetings в Debian  7.4. 
    
    
    
    Добавляем репозитории в /etc/apt/sources.list
    
       # основное зеркало debian
       deb http://ftp.debian.org/debian/ squeeze main contrib non-free
       deb http://ftp.debian.org/debian/ squeeze-updates main contrib non-free
       deb http://ftp.debian.org/debian/ squeeze-proposed-updates main contrib non-free
       # зеркало от яндекс
       deb http://mirror.yandex.ru/debian/ squeeze main contrib non-free
       deb http://mirror.yandex.ru/debian/ squeeze-updates main contrib non-free
       deb http://mirror.yandex.ru/debian/ squeeze-proposed-updates main contrib non-free
       # дополнительные зеркала
       deb http://security.debian.org/ squeeze/updates main contrib  non-free
       deb http://www.debian-multimedia.org squeeze main non-free
       deb http://backports.debian.org/debian-backports squeeze-backports main
       # дополнительные зеркала от яндекс
       deb http://mirror.yandex.ru/debian-security/ squeeze/updates main contrib non-free
       deb http://mirror.yandex.ru/debian-multimedia squeeze main non-free
       deb http://mirror.yandex.ru/debian-backports squeeze-backports main
    
    далее обновляемся и устанавливаем ключи подписи для репозитория http://www.debian-multimedia.org/
    
       aptitude update && aptitude -y install debian-multimedia-keyring && aptitude update
    
    Оттуда будем устанавливать более менее свежие lame и ffmpeg, необходимые для
    конвертации в openmeetings
    Ставим всякую мелочевку:
    
       apt-get install mc screen bash-completion dnsutils ntpdate
    
    Устанавливаем mysql, веб-администратор apache
    
       aptitude -y install  mysql-server phpmyadmin
    
    Редактируем конфиг mysql, добавляем в /etc/mysql/my.conf
    
       [mysqld]
       skip-character-set-client-handshake
       collation-server = utf8_unicode_ci
       init-connect = 'SET NAMES utf8'
       character-set-server = utf8
       [client]
       default-character-set = utf8
       [mysql]
       default-character-set = utf8
    
    Перезапускаем mysql
    
       /etc/init.d/mysql restart
    
    А после, запустим вот этот скрипт /usr/bin/mysql_secure_installation. Он будет
    задавать вопросы. Отвечаем так:
    
       Enter current password for root (enter for none): 
       жмём энтер, т.к. пароль пароль суперпользователя на mysql у нас пока пустой
       Set root password? [Y/n] y
       New password: вводим пароль суперпользователя на mysql
       Remove anonymous users? [Y/n] y
       Disallow root login remotely? [Y/n] y
       Remove test database and access to it? [Y/n] y
       Reload privilege tables now? [Y/n] y
    
    С помощью этого скрипта мы выполнили следующие действия: задали пароль для
    суперпользователя root, так как по умолчанию для него не установлен пароль;
    удалили анонимного пользователя, который создаётся только для тестовых целей;
    запретили пользователю root входить удалённо - теперь он сможет заходить только
    с localhost; удалили тестовую БД test и доступ к ней.
    
    Далее создаем необходимые базы:
    
       mysql -p
       CREATE DATABASE `openmeetings`;
       GRANT ALL PRIVILEGES ON openmeetings.* TO 'openmeetings'@'localhost' IDENTIFIED BY 'my_password' WITH GRANT OPTION;
    
    этим мы создаем базу openmeetings, пользователя openmeetings с паролем my_password
    
    Устанавливаем "безголовый" openoffice, java6, imagemagic, ghostscript, ffmeg,
    lame, mscorefonts и тд
    
       aptitude install texi2html unzip sun-java6-bin imagemagick ghostscript openoffice.org-core openoffice.org-base openoffice.org-writer openoffice.org-calc openoffice.org-impress openoffice.org-draw openoffice.org-math openoffice.org-filter-mobiledev openoffice.org-filter-binfilter ttf-mscorefonts-installer pstoedit libpaper-utils ttf-dejavu sox ffmpeg lame libart-2.0-2 sun-java6-bin sun-java6-jdk sun-java6-jre
    
    Для нормальной работы openmeetengs  нужен swftools. Тот, который доступен в
    репозитории не полон. Придется собрать руками. Устанавливаем swftools:
    
       wget http://www.swftools.org/swftools-0.9.2.tar.gz
       apt-get install libfreetype6 libfreetype6-dev libjpeg62 libjpeg62-dev libt1-dev \\
           libungif4-dev libavifile-0.7-dev libavifile-0.7c2
       ./configure && make clean && make && make install
    
    Выкачиваем OpenMeetings 2.2
    
       mkdir /opt/red5
       cd /opt/red5
       wget http://www.apache.org/dyn/closer.cgi/openmeetings/2.2.0/bin/apache-openmeetings-2.2.0.zip
       unzip  apache-openmeetings-2.2.0.zip
    
    После чего, находим файл
    /opt/red5/webapps/openmeetings/WEB-INF/classes/META-INF/mysql_persistence.xml. В
     нём нас интересует вот этот блок:
    
      , MaxActive=100
      , MaxWait=10000
      , TestOnBorrow=true
      , poolPreparedStatements=true
      , Username=root
      , Password="/>
    
    правим
    
      , Username=openmeetings
      , Password=my_password"/>
    
    
    После окончания редактирования файла, нужно переименовать mysql_persistence.xml
    в persistence.xml (заменить существующий  persistence.xml)
    
    создаем скрипты запуска red5, openoffice
    
       cd /etc/init.d/
    
    В /etc/init.d/red5 копируем 
    
       #! /bin/sh
       # red5 initscript
       set -e
       PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
       DESC="Red5 flash streaming server"
       NAME=red5
       DAEMON_HOME=/opt/red5
       DAEMON=$DAEMON_HOME/$NAME.sh
       PIDFILE=/var/run/$NAME.pid
       SCRIPTNAME=/etc/init.d/$NAME
       # Gracefully exit if the package has been removed.
       test -x $DAEMON || exit 0
       # Read config file if it is present.
       if [ -r /etc/default/$NAME ]
       then
          . /etc/default/$NAME
       fi
       # Function that starts the daemon/service.
       d_start() {
          start-stop-daemon --start --pidfile $PIDFILE --chdir $DAEMON_HOME --background --make-pidfile --exec $DAEMON
       }
       # Function that stops the daemon/service.
       d_stop() {
          start-stop-daemon --stop --quiet --pidfile $PIDFILE --name java
          rm -f $PIDFILE
       }
       case "$1" in
       start)
          echo -n "Starting $DESC: $NAME"
          d_start
          echo "."
          ;;
       stop)
          echo -n "Stopping $DESC: $NAME"
          d_stop
          echo "."
          ;;
       restart|force-reload)
          echo -n "Restarting $DESC: $NAME"
          d_stop
          sleep 1
          d_start
          echo "."
          ;;
       *)
       echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
       exit 1
       ;;
       esac
       exit 0
    
    Сохраняемся, выходим и создадим скрипт запуска для soffice-headless
    В /etc/init.d/soffice-headless копируем:
    
       #!/bin/bash
       # openoffice.org headless server script
       set -e
       PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
       DESC="OpenOffice.org headless server"
       NAME=soffice-headless
       DAEMON_HOME=/usr/lib/libreoffice/program
       DAEMON=$DAEMON_HOME/$NAME.sh
       PIDFILE=/var/run/$NAME.pid
       SCRIPTNAME=/etc/init.d/$NAME
       # Gracefully exit if the package has been removed.
       test -x $DAEMON || exit 0
       # Read config file if it is present.
       if [ -r /etc/default/$NAME ]
       then
          . /etc/default/$NAME
       fi
       # Function that starts the daemon/service.
       d_start() {
          start-stop-daemon --start --pidfile "${PIDFILE}" --chdir "${DAEMON_HOME}" --background --make-pidfile --exec $DAEMON
       }
       # Function that stops the daemon/service.
       d_stop() {
          start-stop-daemon --stop --quiet --pidfile "${PIDFILE}" --name java
          rm -f "${PIDFILE}"
       }
       case "$1" in
       start)
          echo -n "Starting $DESC: $NAME"
          d_start
          echo "."
          ;;
       stop)
          echo -n "Stopping $DESC: $NAME"
          d_stop
          echo "."
          ;;
       restart|force-reload)
          echo -n "Restarting $DESC: $NAME"
          d_stop
          sleep 1
          d_start
          echo "."
          ;;
       *)
       echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
       exit 1
       ;;
       esac
       exit 0
    
    Сохраняемся, выходим, делаем скрипты исполняемыми и устанавливаем их в автозапуск
    
       chmod 755 /etc/init.d/red5 && update-rc.d red5 defaults && chmod 755 /etc/init.d/soffice-headless && update-rc.d soffice-headless defaults
    
    Для запуска openoffice создадим еще один скрипт:
    
    В /usr/lib/libreoffice/program/soffice-headless.sh копируем:
    
       #!/bin/bash
       # openoffice.org headless server script
       #
       unset DISPLAY
       /usr/lib/libreoffice/program/soffice "-accept=socket,host=localhost,port=8100;urp;StarOffice.ServiceManager" -nologo -headless -nofirststartwizard
    
    Сохраняемся, выходим и делаем его исполняемым
    
       chmod 755 /usr/lib/libreoffice/program/soffice-headless.sh
    
    Проверяем работоспособность скрипта "безголового"; офиса. Запускаем его:
    
       /etc/init.d/soffice-headless
    
    вбиваем:
    
       netstat -an | grep 8100
    
    Должны увидеть:
    
       tcp 0 0 127.0.0.1:8100 0.0.0.0:* LISTEN
    
    Далее, скачиваем jConnector со страницы http://www.mysql.com/downloads/connector/j/
    
    Он нужен openmeetings для подключения к базе mysql. Распаковываем содержимое
    скачанного архива mysql-connector-java-5.1.22.zip (на момент написания статьи).
    В нём нас интересует лишь файл mysql-connector-java-5.1.22-bin.jar. Его надо
    поместить в каталог /opt/red5/webapps/openmeetings/WEB-INF/lib.
    
    Дальше надо скачать JODConverter - http://code.google.com/p/jodconverter/downloads/list
    
    JODConverter нужен для конвертирования офисных файлов в pdf для отображения на
    доске. Содержимое архива jodconverter-core-3.0-beta-4-dist.zip (на момент
    написания статьи) копируем в каталог /opt/openmeetings/webapps/openmeetings/jodcoverter.
    
    Далее, есть ещё одна тонкость: в коде jodconverter жестко прописаны пути, и он
    будет искать опенофис в каталоге /opt/openoffice.org3.
    
    Поэтому, чтобы он таки его мог увидеть, делаем вот такую символическую ссылку:
    
       ln -s /usr/lib/libreoffice /opt/openoffice.org3
    
    Переходим в каталог /opt/red5 и выполняем команду:
    
       cd /opt/red5
       ./red5.sh
    
    Не нужно дожидаться её завершения. И вообще, лучше эту команду выполнить в
    отдельно открытой консоли. Эта команда запустит openmeeting. Его окончательную
    установку необходимо сделать уже через web-интерфейс. Открываем браузер,
    переходим по адресу:
    
    http://your_ip:5080/openmeetings/install
    
    На страничке инсталяции обратим внимание на поле "JOD Path". В нём надо указать
    путь к директории lib нашего джобконвертера:
    /opt/red5/webapps/openmeetings/jodcoverter/lib. В поля имя и пароль вбивается
    имя и пароль администратора системы. В поля imagemagick_path, sox_path,
    ffmpeg_path   пишем /usr/bin. Поле swftools_path - /usr/local/bin. Остальные
    поля на своё усмотрение можно заполнить, после чего жмём внизу кнопку
    "INSTALL". Система призадумается на некоторое время. Через некоторое время (у
    меня заняло около 5 минут) система сообщит что все ОК и можно начинать работу.
    
    Есть один нюанс: при изменении данных пользователя нужно каждый раз ОБЯЗАТЕЛЬНО
    вбивать пароль. Иначе пользователь окажется без пароля и вход в систему станет невозможен.
    
    
    На этом все, можно перезагрузить систему и начинать пользоваться. Удачи.
    
    Примечание: Сервер имеет статический IP. Сразу оговорюсь: ссылки на установку
    пакетов дергал из других статей (указаны ниже) по этому можно наблюдать
    некоторые несоответствия с версиями LibreOffice. В debian 7.4 уже был
    установлен LibreOffice (на него и настроены скрипты в статье). Если кому то
    захочется разобраться - разбирайтесь и не устанавливайте лишнего.  Система сама
    не стала ставить OpenOffice при наличии установленного LibreOffice.  Начнем:
    
    
    Статьи которыми я пользовался для написания:
    * http://www.openkazan.info/http:/%252Fmy-ubuntu-land.blogspot.com/2011/03/openmeetings-161-debian-6-squeeze.html
    * http://technotrance.su/index.php/moi-stati/linux-fedora/item/21-openmeetings2
    
     
    ----* Решение проблемы с работой Adobe Flash в Opera для дистрибутивов Linux с GTK+ 3 (доп. ссылка 1)   Автор: Kroz  [комментарии]
     
    В некоторых дистрибутивах Linux, перешедших на GTK+ 3, наблюдаются проблемы с
    работой Flash-плагина в браузере Opera. В качестве обходного пути для решения
    проблемы можно запустить браузер следующим образом:
    
       LD_PRELOAD=/usr/lib/libgtk-x11-2.0.so.0 opera
    
     
    ----* Скрытие строки с заголовком при развертывании окна с Firefox (доп. ссылка 1)   [комментарии]
     
    Для того чтобы скрыть занимающую место строку с заголовком и кнопками
    закрытия/сворачивания можно воспользоваться возможностью выборочного изменения
    оформления окна в Compiz.
    
    Устанавливаем CompizConfig:
    
       sudo apt-get install compizconfig-settings-manager
    
    Запускаем CompizConfig. В блоке "Window Decorations" прописываем в поле "Decoration windows":
    
       (any)&!(class=Firefox&state=maxvert&role=browser)
    
    После такой манипуляции при развертывании окна по Alt-F10 строка с заголовком будет скрываться.
    
    При использовании дополнения 
    Hide Caption Titlebar Plus можно не скрывать заголовок, а перенести в него
    список вкладок выбрав опцию "Place Tabs in the Titlebar".
    
     
    ----* Создание реконнект-скрипта для DSL-модема  (доп. ссылка 1)   Автор: Карбофос  [комментарии]
     
    Принудительный реконнект может потребоваться для получения нового IP-адреса при
    пользовании, к примеру, таких сервисов, как rapidshare.
    
    Для браузера Firefox существует дополнение "Tamper Data", с помощью которого
    можно отлавливать и разбирать по полочкам запросы GET/POST. Так вот, основа
    того, что можно реконнектить модем через веб-интерфейс настроек модема, как раз
    и лежит в этом способе. Всего (обычно) действий четыре: логин с паролем, разрыв
    соединения и через некоторое время (5-10 секунд) - восстановление соединения с
    внешним миром и выход из настроек.
    
    Рассмотрим два шага, для случая, если в локальной сети к установкам модема
    можно "дотянуться" без пароля.
    
    Если мы уже находимся в веб-интерфейсе настроек модема, то нужно найти кнопки
    "Disconnect" и "Connect". После этого включаем "Tamper Data" через панель
    расширений и созерцаем соединения GET/POST в нашем окне. Жмём "Disconnect" в
    веб-интерфейсе модема и смотрим, что происходит в нижнем левом окне:
    
       POSTDATA=controller=Internet&action=DisconnectInternet&id=0&ReturnPage=%2Fdiagnostic.htm
    
    В верхнем окне, в строке "POST" видим 
    
       http://192.168.1.1/cgi-bin/Hn_wan.cgi
    
    Таким же образом определяем восстановление соединения с внешним миром:
    
       POSTDATA=controller=Internet&action=ConnectInternet&id=0&ReturnPage=%2Fdiagnostic.htm
    
    для 
    
       http://192.168.1.1/cgi-bin/Hn_wan.cgi
    
    Затем пишем простой shell-скрипт:
    
        #!/bin/sh
        # by Karbofos
    
        echo "disconnect"
        wget -q -O /dev/null --post-data="controller=Internet&action=DisconnectInternet&id=0&ReturnPage=%2Fdiagnostic.htm" http://192.168.1.1/cgi-bin/Hn_wan.cgi >/dev/null 2>&1
        sleep 5
        echo "connect"
        wget -q -O /dev/null --post-data="controller=Internet&action=ConnectInternet&id=0&ReturnPage=%2Fdiagnostic.htm" http://192.168.1.1/cgi-bin/Hn_wan.cgi >/dev/null 2>&1
    
    Как видно, текст из буфера обмена нужно немного переработать, выкинув текст
    "POSTDATA=" и обращаться нужно не просто по IP адресу модема, а вызывать нужное
    cgi приложение, в нашем случае Hn_wan.cgi
    
    Пауза в 5 секунд необходима для получения нового IP адреса, величина зависит от
    провайдера, устанавливается экспериментальным путём. Если пауза будет меньше,
    то есть вероятность того, что вы получите предыдущий IP.
    
    Конечно, если у вас доступ к настройкам возможен через ввод пароля, то и скрипт
    нужно расширить, добавив к wget опции "--http-user=логин
    --http-password=пароль". Если машина не однопользовательская, параметры
    аутентификации можно поместив их в файл ~/.wgetrc, указав http_user=логин и http_password=пароль.
    
    Или же логин можно "отловить" через веб-интерфейс и расширить скрипт,
    основываясь на данных (для вышеприведенного примера):
    
       POSTDATA=controller=Overview&action=Login&id=0&idTextPassword=YourPassword
    
    для приложения http://192.168.1.1/cgi-bin/Hn_login.cgi
    
    
    Часть 2. Написание реконнект-скрипта для DSL модема с использованием telnet
    
    Собственно, была небольшая проблема реконнекта модема от Zyxel с целью
    получения нового IP-адреса. Этот скрипт я использовал еще до того, как нашёл
    возможность проделывать сию процедуру через веб-интерфейс.
    
    При входе на модем через telnet, необходимо пройдись по пунктим меню:
    
    
       telnet 192.168.1.1
       superadmin,yourpassword
       24
       8
       poe drop poe0
       dev dial 1
       99
    
    Зная эту последовательность команд, пишем скриптик для реконнекта:
    
       #!/bin/sh
       host=192.168.1.1
       port=23
       login="superadmin"
       passwd="yourpassword"
    
       (echo open ${host} ${port}
       sleep 1
       echo ${login}
       sleep 1
       echo ${passwd}
       sleep 1
       echo "24"
       sleep 1
       echo "8"
       sleep 1
       echo "poe drop poe0"
       sleep 1
       echo "dev dial 1"
       sleep 1
       echo exit) | telnet
    
    
    Или циклом:
    
       #!/bin/bash
       host=127.0.0.1
       port=23
       arr=( "superadmin" "yourpassword" "24" "8" "poe drop poe0" "dev dial 1" "99" )
    
       (echo open ${host} ${port}
        sleep 1
        for j in "${arr[@]}"
        do
          echo $j
          sleep 1
        done
       echo exit) | telnet
    
    
    Задержки в секунду (sleep 1) вводились сугубо из-за опасения за медленную реакцию модема.
    
     
    ----* Использование Flash-плагина из состава Google Chrome в Firefox и Opera (доп. ссылка 1)   [комментарии]
     
    Как известно, компания Google с недавних пор поставляет Flash-плагин в составе
    браузера  Chrome. Обновления с исправлением проблем безопасности для
    Flash-плагина из состава Chrome компания Google своими силами выпускает сразу
    после нахождения проблемы, в то время как выход официального обновления Adobe
    Flash обычно затягивается на несколько недель, в течение которых приходится
    либо отключать плагин, либо мириться с возможностью проникновения
    злоумышленника через незакрытую брешь в безопасности системы.
    
    Для использования сборки Flash-плагина от Google достаточно установить браузер
    Chrome с сайта http://www.google.com/chrome
    Запускать его не обязательно, так как обслуживанием загрузки обновлений
    занимается специальный скрипт, запускающийся через cron (/etc/cron.daily/google-chrome).
    
    Далее следует удалить из системы оригинальный Adobe Flash (или отключить через
    меню Add-ons / Plugins) и создать символическую ссылку
    
       sudo ln -s /opt/google/chrome/libgcflashplayer.so /usr/lib/firefox-addons/plugins/
    
    или для Opera:
    
       sudo ln -s /opt/google/chrome/libgcflashplayer.so /usr/lib/opera/plugins/
    
    или
    
       ln -s /opt/google/chrome/libgcflashplayer.so ~/.flash/
    
     
    ----* "Короткие" ссылки в браузерах Mozilla и Chromium (доп. ссылка 1) (доп. ссылка 2)   Автор: Andrey Mitrofanov  [комментарии]
     
    В браузерах Mozilla можно добиться того, чтобы, набрав в строке адреса "короткую" ссылку, например,
    
       op firehol
    
    и нажав Enter, перейти по соответствующему "команде" (первому слову короткой
    ссылки) URL, например,
    
       http://www.google.ru/search?hl=ru&q=firehol+site%3Aopennet.ru
    
    (В этом примере - поиск указанного слова по сайту OpenNET с помощью поисковика Google)
    
    Просто добавьте в закладки ссылку следующего вида:
    
       Имя: G: @ site:opennet.ru
       Адрес: http://www.google.ru/search?hl=ru&q=%S+site%3Aopennet.ru
       Краткое имя: op
    
    В Chromium создание подобных ссылок делается следующим образом:  Нажмите правой
    кнопкой мыши на поле URL, выберите "Edit search engine" ("Изменить поисковые
    системы") и добавьте примерное такие данные
       
      Name: op
      Keyword: op
      URL: http://www.google.ru/search?hl=ru&q=%s+site%3Aopennet.ru
    
    В свою очередь, если в поле поиска самого сайта OpenNET в шапке на любой
    странице opennet набрать "g поисковая фраза" или "google поисковая фраза", то
    поиск будет выполнен не внутренней поисковой системой, а перенаправлен в
    Google. Для выборки отдельных ключевых слов можно набрать в адресной строке
    "http://opennet.ru/ключ", например "http://opennet.ru/mozilla"
    
     
    ----* Ускорение запуска Firefox   Автор: Artem Tashkinov  [комментарии]
     
    Firefox хранит некоторые свои данные в формате БД SQLite3, например, история
    посещений и набранных адресов хранится в файле (БД) places.sqlite. Со временем
    старые записи из этого файла удаляются, добавляются новые записи что приводит к
    неизбежной внутренней и внешней фрагментации этого файла, что замедляет запуск веб-браузера.
    
    Ускорить запуск Firefox можно, оптимизировав внутренее хранилище Firefox.
    Сделать это можно несколькими способами.
    
    Во-первых, при *закрытом* Firefox, находясь в директории с профилем, можно выполнить следующий код:
    
       $ for i in *.sqlite; do sqlite3 "$i" vacuum; done
    
    Данная операция оптимизирует все SQLite файлы.
    
    Во-вторых, прямо внутри браузера можно в консоли ошибок (В меню "Инструменты")
    выполнить следующий код:
    
       Components.classes["@mozilla.org/browser/nav-history-service;1"].getService(Components.interfaces.nsPIPlacesDatabase).DBConnection.executeSimpleSQL("VACUUM");
    
    Однако эта операция оптимизирует только файл places.sqlite.
    
     
    ----* Скрипт для просмотра открытых табов в Firefox   [комментарии]
     
    Иногда требуется узнать какие вкладки оставлены открытыми в Firefox, запущенном на другой машине. 
    
    Ниже представленный Perl-скрипт выводит из файла sessionstore.js список
    открытых табов в формате "url заголовок":
      
    print_open_tabs.pl:
    
       #!/usr/bin/perl
    
       use strict;
       use JSON;
      
       # Читаем содержимое в файл
       my $json_text = <>;
       # Преобразуем JSON-блок в хэш, предварительно убирая лидирующие скобки
       my $perl_scalar = from_json(substr($json_text,1,-1), {utf8 => 1});
    
       # Последовательно перебираем открытые окна и табы
       foreach my $windows_block (@{$perl_scalar->{windows}}){
           foreach my $tabs_block (@{$windows_block->{tabs}}){
               # выводим активные табы по их индексу
               if ($tabs_block->{"index"} > 0){
                   my $idx = $tabs_block->{"index"}-1;
                   print "$tabs_block->{entries}[$idx]{url}\t$tabs_block->{entries}[$idx]{title}\n";
               }
           }
       }
    
    Пример использования:
    
       ./print_open_tabs.pl ~/.mozilla/firefox/*.default/sessionstore.js
    
     
    ----* Решение проблемы неполной загрузки сайтов в Opera через Squid   Автор: Kroz  [комментарии]
     
    Исходные данные:
    Opera 10.61
    Squid 3.1.6
    
    Формулировка проблемы:
    
    Грузим страничку http://rutracker.org/forum/index.php . Без squid грузится
    нормально. Со squid сайт загружается практически весь, но курсор "крутится",
    показывая, что сайт загрузился не полностью. Если присмотреться - не грузится
    элемент "Get Adobe Flash Player" (плагины отключены, отсюда и такое сообщение).
    Так может провисеть секунд 30, может минуту. Потом загружается.
    
    Смотрим access.log
    
    Когда "висит" видно такое:
    
        1281724497.227    561 127.0.0.1 TCP_MISS/301 647 GET http://adobe.com/images/shared/download_buttons
        /get_adobe_flash_player.png - DIRECT/192.150.18.117 text/html
    
    А когда наконец-то загружается, пишет такое:
    
        1281724617.761    209 127.0.0.1 TCP_MISS/200 3048 GET http://www.adobe.com/images/shared/download_buttons
        /get_adobe_flash_player.png - DIRECT/192.150.8.60 image/png
    
    То есть первый раз оно определяет get_adobe_flash_player.png как text/html,
    второй раз - как image/png .
    
    Решение:
    
    Решается конфигурированием Opera (делалось через opera:config) - добавлением двух "галочек"
    
       [X] Enable HTTP 1.1 for proxy
       [X] Enable start with HTTP 1.1 for proxy
    
     
    ----* Смена фона для новой (пустой) вкладки веб-браузера Mozilla Firefox   Автор: Artem Tashkinov  [комментарии]
     
    Многим, кто пробовал веб-браузер Opera, понравилась возможность смены фона
    пустой (новой) вкладки. Оказывается, тоже самое достаточно легко сделать в
    Mozilla Firefox.
    
    Для этого необходимо добавить в файл userContent.css (который находится в папке
    профиля chrome) следующее содержимое:
    
      @namespace url(<a href="http://www.w3.org/1999/xhtml">http://www.w3.org/1999/xhtml<;/a>);
      @-moz-document url("about:blank") {
       *   {
           background:
              url("file:///home/user/Pictures/firefox/Opera-Background-Blue-Swirls.jpg");
              margin:0px;
              background-position:center;
              background-attachment:fixed;
              background-repeat:no-repeat;
              -moz-background-size: 100% 100%;
           }
       }
     
    После этого Firefox будет выглядеть примерно так: http://img52.imageshack.us/img52/5201/newtab.png 
    
    Вместо того, чтобы хранить файл с картинкой отдельно на диске,  можно добавить
    изображение прямо в файл userContent.css:
    
       url("data:image/png;base64,ЗДЕСЬ_ДАННЫЕ_В_ФОРМАТЕ_BASE64");
    
    Чтобы преобразовать изображение в этот формат, можно воспользоваться, например,
    web-сервисом http://www.motobit.com/util/base64-decoder-encoder.asp или
    утилитой base64, например, так:
    
       $ base64 -w0 < изображение.png > 64.txt
    
     
    ----* Добавление собственных элементов меню в Firefox (доп. ссылка 1)   Автор: ffsdmad  [комментарии]
     
    Добавим в меню "Инструменты" Firefox кнопку для быстрого включения и выключения
    работы через прокси.
    
    Настройками прокси управляет переменная network.proxy.type. При значении 0 -
    прокси не используется, а при значении 5 - используется сервер заданный в
    настройках рабочего стола, это легко увидеть меняя настройки и глядя на
    закладку about:config. Задача - добавить меню с функцией которая изменяет
    значение этой переменной.
    
    Нужно отредактировать всего два файла
    
       sudo vim /usr/lib/firefox-3.6.3/chrome/browser.jar
    
    в полученном списке файлов выбираем файл content/browser/browser.xul находим
    раздел подменю id="tools-menu" и добавляем туда новый пункт меню "Switch proxy"
    (вставка должна соответствовать стандартам XML)
    
       <menuseparator id="imageprefs"/>
       <menuitem id="menu_switchproxy" label="Switch proxy" oncommand="switch_proxy()"/>
    
    сохраняем и переходим в конец файла content/browser/browser.js и добавляем туда функцию
    
       function switch_proxy(){
         if (gPrefService.getIntPref("network.proxy.type") == 5) {
             gPrefService.setIntPref("network.proxy.type", 0);
         }else{
             gPrefService.setIntPref("network.proxy.type", 5);
         }
       }
    
    Сохраняем файл (если редактировать через vim то jar архив будет автоматически
    обновлен) и перезапускаем Firefox.
    
    Таким же образом можно сделать переключатель, управляющий анимацией и
    автоматической закачкой картинок, для этого необходимо обрабатывать переменные:
    
       image.animation_mode - true-включение анимации, false-выключение
       permissions.default.image - 1-закачивать картинки, 2-не закачивать
    
     
    ----* Добавление сертификата в Chromium (доп. ссылка 1) (доп. ссылка 2)   Автор: silverghost  [комментарии]
     
    После установки Chromium потребовалось импортировать сертификат для работы с
    Webmoney Light. В документации к Chromium рекомендуют использовать команду:
    
       certutil -d sql:$HOME/.pki/nssdb -A -t "P,," -n "WebMoney" -i ./wm.p12
    
    Но такая команда выдает ошибку, по крайней мере в Ubuntu 10.04:
    
       certutil: could not obtain certificate from file: security library: invalid arguments.
    
    Решается эта проблема путем использования другой утилиты:
    
       pk12util -d sql:$HOME/.pki/nssdb -i ./wm.p12
    
    Вышеупомянутые утилиты входят в состав пакета libnss3-tools в Ubuntu/Debian,
    nss-tools в Fedora/RHEL и mozilla-nss-tools в openSUSE.
    
     
    ----* Установка оригинальных версий продуктов Mozilla для Ubuntu (доп. ссылка 1)   [комментарии]
     
    В рамках проекта Ubuntuzilla (http://ubuntuzilla.sourceforge.net)
    поддерживается репозиторий пакетов для Ubuntu Linux, в котором представлены
    последние версии оригинальных сборок Mozilla Firefox, Mozilla SeaMonkey и
    Mozilla Thunderbird. Например, после выхода Firefox 4.0, его можно будет
    установить в ранее выпущенных версиях Ubuntu.
    
    Для установки в /etc/apt/sources.list добавляем:
    
       deb http://downloads.sourceforge.net/project/ubuntuzilla/mozilla/apt all main
    
    Импортируем ключ:
    
       sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com C1289A29
       sudo apt-get update
    
    Устанавливаем оригинальную сборку на свое усмотрение:
       sudo apt-get install firefox-mozilla-build
       sudo apt-get install thunderbird-mozilla-build
       sudo apt-get install seamonkey-mozilla-build
    
    В пакетах поставляется нелокализированная версия продуктов, для русификации
    интерфейса необходимо вручную скачать и установить через менеджер дополнений
    XPI-файл с пакетом локализации, после чего установить активные языковой
    интерфейс через переменную general.useragent.locale  в about:config. Загрузить
    файлы с локализацией можно по следующим ссылкам:
    
    Firefox: http://releases.mozilla.org/pub/mozilla.org/firefox/releases/Версия/linux-i686/xpi/
    
    Thunderbird: http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/Версия/linux-i686/xpi/
    
    Seamonkey: http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/Версия/langpack/
    
     
    ----* Включение акселерации прокрутки и тюнинг табов в Firefox 3.6  (доп. ссылка 1) (доп. ссылка 2)   [комментарии]
     
    В Firefox 3.6 добавлена, но отключена по умолчанию, возможность ускорения
    прокрутки после определенного числа вращений колеса мыши.
    Например, установив в about:config:
    
       mousewheel.acceleration.start = 3
       mousewheel.acceleration.factor = 5
    
    после трех быстрых перемещений колеса мыши, четвертое и последующие перемещения
    приведут к сдвигу экрана сразу по 5 позиций.
    
    Другой полезной возможностью, отключенной в Firefox 3.6, является отображение
    эскизов при переключении межу табами через комбинацию клавиш "Ctrl + Tab". Для
    включения в about:config устанавливаем:
    
       browser.ctrlTab.previews = true
    
    чтобы добавить в правой части строки табов кнопку для одновременного
    отображения эскизов для всех табов (вызывается также через Shift + Ctrl + Tab),
    можно установить:
    
       browser.allTabs.previews = true
    
    В Firefox 3.6 также изменено поведение при открытии нового таба, который теперь
    по умолчанию открывается не в  конце списка, а рядом с активным табом, что
    нарушает привычки бывалых пользователей. Чтобы вернуть поведение открытия табов
    в  about:config необходимо установить:
    
       browser.tabs.insertRelatedAfterCurrent = false
    
     
    ----* Установка в одном окружении двух разных версий Firefox с разными дополнениями   [комментарии]
     
    Для того чтобы обеспечить работу в Linux с несколькими разными версиями
    Firefox, или разными наборами дополнений (например, вариант с Flash плагином и
    без него) можно использовать встроенную в браузер технологию пользовательских профилей.
    
    Список профилей можно найти в директории ~/.mozilla/firefox, в которой можно
    увидеть поддиректорию похожую на hf8ndgysh.default, это и есть базовый профиль,
    в котором хранятся все настройки и дополнения. Чтобы создать дополнительный
    профиль запустим Firefox в режиме управления профилями:
    
       firefox -ProfileManager
    
    Если в момент запуска не все окна firefox закрыты, браузер просто откроет новое
    окно. Чтобы этого не произошло нужно использовать опцию
    "-no-remote":
    
       firefox -ProfileManager -no-remote
    
    Выбираем  "Создать Профиль" (Create Profile) и следуя предлагаемой инструкции
    вводим имя нового профиля, например, ff36.
    После этого в директории ~/.mozilla/firefox появится приблизительно такой
    каталог 4nrlkr07.ff36 (4nrlkr07 - случайная последовательность).
    
    Далее можно либо запустить созданный профиль из ProfileManager, либо вернуться
    в командную строку и запустить профиль вручную.
    
    Запускаем основной браузер:
    
       firefox
    
    Запускаем профиль ff36 с другой версией браузера:
    
       /home/myname/firefox36/firefox -P ff36 -no-remote
    
    Для упрощения запуска создаем ярлык на рабочем столе.
    
    Устанавливаемые XUL-дополнения автоматически будут видны только для текущего профиля.
    
     
    ----* Компиляция Mozilla FireFox для получения 64-битной версии   Автор: Zenitur  [комментарии]
     
    Недавно я обнаружил то, что на сайте firefox.com нет 64-битной версии браузера
    Mozilla FireFox для Linux. Не обнаружил я и 64-битной версии браузера для
    других систем. Если посмотреть сайт лучше, можно обнаружить 64-битные сборки
    альфа-версий - а стабильных версий нет.
    
    Тогда я решил собрать 64-битную версию самостоятельно. Разумеется, и 32-битная
    версия будет работать с 64-битной системой, если установить 32-битные
    библиотеки. В Ubuntu они занимают около 100 (ста) мегабайт. Если вы пользуетесь
    DooM III или Wine, 32-битные библиотеки, скорее всего, уже установлены - и
    проблемы нет... А что если они не установлены и устанавливать их у вас нет
    никакого желания?
    
    Кстати, даже если у вас установлен 64-битный браузер, то для того чтобы
    воспользоваться 32-битным Flash-проигрывателем надо установить 32-битные
    библиотеки. Надоели... Но выход есть! Можно или воспользоваться альфа-версией
    64-битной библиотеки Adobe Flash, или Gnash - свободным эквивалентом
    Flash-плееру. Последний работает в том числе и с Konqueror.
    
    Я разобрался со сборкой FireFox из исходного кода и описал этот процесс вам -
    собственные бинарные сборки я размещаю на файлообменнике, найти ссылки можно
    найти в одной из тем на сайте linsovet.com. Архивы приведены к виду архивов на
    сайте firefox.com с тем отличием, что не удалён английский словарь, а также
    многие поисковые сайты из выпадающего списка. Кроме того, 64-битный
    Flash-проигрыватель уже вложен и сразу работает - размер архива увеличился лишь
    на 3 мегабайта, а распакованная директория на 9 мегабайт.
    
    Сразу предупреждаю: никаких проверок работоспособности я не проводил. Флаги
    сборки и оптимизации не трогал и не экспериментировал. В официальном 32-битном
    FireFox есть CrashReporter, а у меня нет, а может быть, его можно включить. В
    моей сборке есть xslt-qa.jar, а в официальной нет - может быть, это только для
    моей машины, в которой есть libxslt. Про то, что логотип FireFox защищён
    несвободной лицензией тоже знаю, и всё же целенаправленно поменял в своей
    сборке логотип Shiretoko на логотип FireFox - знайте, так делать нехорошо.
    Кроме получения недоступной лёгкими путями 64-битного FireFox, компиляция также
    даёт увеличение скорости работы благодаря оптимизации именно под ваше
    оборудование - но я уверен, что для такой программы, как интернет-браузер, этот
    прирост скорости не окажется существенным.
    
    Итак, для начала надо разобраться с зависимостями. Это легче всего сделать в
    таких дистрибутивах, как Debian и Gentoo. В Debian-подобных дистрибутивах надо
    лишь выполнить команду от имени суперпользователя:
    
       apt-get build-dep firefox xulrunner
    
    Чтобы сразу и без проблем установить зависимости в Ubuntu 9.04, я вместо
    firefox написал firefox-3.5 - в репозитории была и остаётся только четвёртая
    бета-версия. Кроме того, я находил сторонний репозиторий с FireFox 3.5,
    http://ppa.launchpad.net/ubuntu-mozilla-daily/, (который, к сожалению, на тот
    момент был неработоспособен и не устанавливал новейшего FireFox. Как там
    обстоят дела сейчас я не знаю, так как я уже достиг своей цели), и устанавливал
    зависимости также для пакетов оттуда.
    
    Если у вас другой дистрибутив, предлагаю устанавливать зависимости
    руководствуясь файлом README или просьбам компилятора.
    Чтобы скачать исходный код Mozilla FireFox, можно зайти на
    ftp://ftp.mozilla.org/pub/mozilla.org/firefox/releases/, перейти в директорию с
    самой последней версией, затем в src и загрузить архив tar.bz2. Затем архив
    надо распаковать и, убедившись в том, что на разделе есть свободные 900
    мегабайт, выполнить команду
    
       make -f client.mk build
    
    Так написано в руководстве по адресу
    https://developer.mozilla.org/en/Build_and_Install . Но команда не работает.
    Поискав ошибку в Google, я обнаружил решение. После того, как команда выдаст
    ошибку, надо выполнить ./configure --enable-application=browser и повторить
    первую команду.
    
    Компиляция занимает 40 минут на моём AMD Athlon 64 X2 7850+, 2 гигабайтами
    памяти DDR2 1066 на разделе ReiserFS.
    
    После завершения компиляции можно запустить браузер. Он находится в директории
    dist/bin/, запускать надо файл firefox. Однако остаётся несколько нерешённых
    задач. Вместо FireFox почему-то запускается Shiretoko (кодовое название версии
    3.5, как я понимаю...), хотя функциональность та же. Надо вернуть идентификатор
    браузера, логотип и название, а также удалить лишние 850 мегабайт отработанного
    исходного кода.
    
    Прежде всего, избавляемся от символических ссылок, так как каждый второй файл
    ведёт на несколько директорий назад. Как это сделать командой cp я так и не
    разобрался (профессионалы, подскажите работающий способ!), поэтому я запустил
    winefile, выбрал каталог bin, и скопировал его через Файл > Копировать... в
    другое место.
    
    Символические ссылки пропали, однако исполняемые файлы потеряли параметр
    исполняемости! Дело в том, что в файловых системах Windows-систем такого
    параметра файлов не существует. Заходим в каталог с FireFox, выделяем все
    бинарные файлы и скрипты запуска, нажимаем на них правой кнопкой мыши и
    выбираем "Свойства". Вкладка "Права". Ставим галочку "Позволять выполнение
    файла как программы" в случае если Gnome, или "Is executable" в KDE.
    
    Теперь можно удалить все директории, кроме нашего нового bin.
    Как добавить русский язык, идентификатор и название? Загружаем 32-битную версию
    FireFox. Открываем 2 каталога, с нашим FireFox, и 32-битным. Заменяем всё
    содержимое каталога chrome содержимым русского FireFox. То, чему замены нет, не
    удаляем. Ни в коем случае не трогаем каталог components.
    
    Заменяем все файлы в каталоге defaults. Копируем русский словарь в dictionaries
    - при желании можно стереть английский. Не трогаем extensions. Заменяем все три
    файла в каталоге greprefs. Заменяем icons и modules. Ничего не заменяем в
    plugins, ведь там 64-битные библиотеки. При желании туда можно скопировать
    64-битный Flash-проигрыватель. Не трогаем res. Заменяем всё в searchplugins,
    при желании можно всё оставить как было или наоборот, удалить всё, что было. Не
    трогаем updates. Меняем файлы application.ini, browserconfig.properties,
    firefox, old-homepage-default.properties, platform.ini, README.txt,
    run-mozilla.sh, updater.ini, update.locale, добавляем файл Throbber-small.gif
    (хотя я не знаю, нужен ли он...).
    
    Всё готово. Осталось переименовать каталог bin в firefox и заархивировать, дав
    ему имя, например, firefox-3.5.5-x86_64.tar.bz2.
    
     
    ----* Как убрать Yandex из Firefox 3.5 (доп. ссылка 1)   Автор: STALKER_BY  [комментарии]
     
    При выполнении поисковых запросов из строки ввода URL (не путать с блоком
    поисковых плагинов) в русскоязычной сборке Firefox 3.5 по умолчанию поиск
    осуществляется в Yandex.
    
    Чтобы заменить Yandex на Google нужно в "about:config" найти ключ "keyword.URL" и поменять
    
       http://yandex.ru/yandsearch?stype=first&clid=46511&text=
    на
       http://www.google.com/search?ie=UTF-8&oe=UTF-8&sourceid=navclient&gfns=1&q=
    
    по аналогии, можно добавить любую другую поисковую систему.
    
    Чтобы отключить поиск из адресной строки, необходимо установить переменную keyword.enabled в false.
    
     
    ----* Решение проблем с поддержкой HTML5 в Firefox 3.5 во FreeBSD (доп. ссылка 1)   Автор: Sokolov Alexey  [комментарии]
     
    Для отображения на FreeBSD в Firefox 3.5 некоторых специфических элементов
    HTML5 необходимо подгрузить модуль "sem.ko" (POSIX semaphores).
    Чтобы модуль загружался автоматически в /boot/loader.conf нужно прописать:
       sem_load="YES"
    
     
    ----* Установка web-браузера Uzbl в Ubuntu Linux (доп. ссылка 1)   [комментарии]
     
    Для установки web-браузера Uzbl (http://www.opennet.me/opennews/art.shtml?num=23317) в Ubuntu Linux
    необходимо предпринять следующие шаги:
    
    Для сборки Uzbl необходима последняя версия движка Webkit и связанных с ним
    компонентов. Ставим Webkit из PPA репозитория:
    в добавляем /etc/apt/sources.list:
    
       deb http://ppa.launchpad.net/webkit-team/ppa/ubuntu intrepid main
       deb-src http://ppa.launchpad.net/webkit-team/ppa/ubuntu intrepid main
    
    Импортируем ключ:
    
       sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0x991e6cf92d9a3c5b
    
    Устанавливаем libwebkit-dev, все сопутствующие зависимости и git:
    
       sudo apt-get update
       sudo apt-get install git-core checkinstall libwebkit-dev
    
    Загружаем и собираем Uzbl из Git репозитория проекта:
    
       git clone git://github.com/Dieterbe/uzbl.git
       cd uzbl
       make
    
    Формируем пакет для Ubuntu:
    
       sudo checkinstall
    
    Изучаем примеры скриптов в /usr/share/uzbl
    
     
    ----* Решение проблемы с зависанием nspluginviewer в Fedora 11/KDE   Автор: Artem Tashkinov  [комментарии]
     
    Вне зависимости от ваших настроек, при использовании браузера Konqueror и flash plugin'a от Adobe, 
    просмотрщик flash роликов по умолчанию в KDE - nspluginviewer - постоянно зависает и "забывает" 
    автоматически закрываться при закрытии вкладки или самого веб-браузера Konqueror'a.
    
    Для решения этой проблемы выполните следующие действия:
    
    1. Обновите систему (sudo yum update) и перезагрузитесь в случае обновления ядра.
    
    2. Установите KMPlayer (sudo yum install kmplayer).
    
    3. Откройте настройки ассоциаций mime типов (Konqueror -> Settings -> File
    Management -> File Associations)
    
    - введите для поиска swf;
    - раскройте появившейся тип application->x-shockwave-flash;
    - перейдите на вкладку Embedding;
    - удалите nspluginview в списке Services Preference Order;
    - нажмите кнопку Add...;
    - найдите и добавьте Embedded Mplayer for KDE.
    
    4. Выйдите из Konqueror. На всякий случай дважды выполните команду 'killall
    konqueror nspluginviewer'.
    
    Всё это будет работать, естественно, если у вас уже установлен flash plugin от Adobe.
    
     
    ----* Оптимизация хранилищ данных Firefox 3.x (доп. ссылка 1)   [комментарии]
     
    Начиная с Firefox 3.0, для хранения закладок, истории посещений и других  БД используется SQLite.
    При интенсивной и длительной работе с браузером, можно ощутимо уменьшить время
    загрузки и производительность выполнения некоторых операций,
    через проведение чистки и дефрагментации БД в SQLite.
    
    1. Устанавливаем пакет с sqlite3 или загружаем с сайта http://www.sqlite.org/download.html
    
    2. Не забываем завершить работу Firefox.
    
    3. Выполняем для файлов с расширением .sqlite в директории с профайлом пользователя Firefox:
    
        sqlite3 имя_файла VACUUM
    
    например,
    
       sqlite3 places.sqlite VACUUM
    
    4. Опционально:
    Создаем скрипт: /bin/firefox_sql
    
       #!/bin/bash
       find ~/.mozilla/ -name "*.sqlite" |xargs -n1 -I '{}' sqlite3 {} VACUUM
       /usr/bin/firefox $1 $2 $3 $4 $5 $6 $7 $8 $9
    
    Настраиваем права:
    
       chmod +x /bin/firefox_sql
       chown root:root /bin/firefox_sql
    
    И заменяем в значках запуска firefox на /bin/firefox_sql. Теперь при запуске
    firefox все базы сжимаются.
    
    Способ 2, не требующий рестарта.
    
    Открываем Tools/Error Console, в строке ввода "Code" набираем (одной строкой):
    
       Components.classes["@mozilla.org/browser/nav-history-service;1"]
       .getService(Components.interfaces.nsPIPlacesDatabase).DBConnection.executeSimpleSQL("VACUUM");
    
    Жмем "Evaluate" и ждем несколько секунд до завершения операции
    
    Способ 3, установить дополнение Vacuum Places (https://addons.mozilla.org/en-US/firefox/addon/13824)
    
     
    ----* Решение проблем с DNS сервером при работе Firefox через Socks прокси   [комментарии]
     
    По умолчанию при включении работы Firefox через Socks прокси, DNS запросы
    продолжают обрабатываться
    локальным резолвером, что приводит к неработе преобразования имен в Firefox при
    отсутствии на машине
    иного выхода в сеть, кроме socks сервера.
    
    Решение: в настройках about:config следует поменять значение переменной network.proxy.socks_remote_dns
    с false на true, тогда DNS запросы начнут транслироваться через socks сервер.
    
    При нахождении в недоверительной сети, самый простой способ поднять socks
    туннель через внешний сервер:
    
       ssh -D 1080 логин@ip_сервера
    
    а затем настроить на локальной машине доступ через socks5 127.0.0.1:1080
    
     
    ----* Создание локального сервера обновлений для Firefox (доп. ссылка 1) (доп. ссылка 2)   Автор: Unghost  [комментарии]
     
    Инструкция, как поднять локальный сервер обновлений для Firefox.
    В наличии имелся сервер с Debian Lenny. На него был поставлен apache2 и libapache2-mod-php5
    
       sudo apt-get install apache2
       sudo apt-get install libapache2-mod-php5
    
    В файле /etc/apache2/sites-available/default директива AllowOverride None была
    изменена на AllowOverride FileInfo
    В каталоге /var/www был создан каталог
    /var/www/update/Firefox/3.0.10/win32/ru/release и туда положены файлы:
    
       root@db-fw:/var/www/update/Firefox/3.0.10/win32/ru/release# ls -la
       -rw-r--r-- 1 root root  2188005 2009-05-28 11:22 firefox-3.0.10-3.0.11.ru.win32.partial.mar
       -rw-r--r-- 1 root root 10189913 2009-05-28 11:25 firefox-3.0.11.ru.win32.complete.mar
       -rw-r--r-- 1 root root       59 2009-05-28 10:12 .htaccess
       -rw-r--r-- 1 root root      658 2009-05-28 11:20 update
       -rw-r--r-- 1 root root      650 2009-05-28 12:12 update.xml
    
    Файлы firefox-3.0.10-3.0.11.ru.win32.partial.mar и firefox-3.0.11.ru.win32.complete.mar 
    были взяты с ftp://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/3.0.11-candidates/build1/
    
    Файлы .htaccess и update были взяты с
    https://developer.mozilla.org/en/Setting_up_an_update_server без изменений.
    
    .htaccess:
    
       <FILES update>
          ForceType application/x-httpd-php
       </FILES>
    
    PHP скрипт update:
    
       <?php
       header("Content-type: text/xml");
    
       $url_array=explode("/",$_SERVER["REQUEST_URI"]);
       $noidea=$url_array[2];
       $product=$url_array[3];
       $version=$url_array[4];
       $build_id=$url_array[5];
       $build_target=$url_array[6];
       $locale=$url_array[7];
       $channel=$url_array[8];
       // filename is totally ignored
       $filename=$url_array[9];
       
       $updatefile = "update.dir/$noidea/$product/$version/$build_id/$build_target/$locale/$channel/$filename";
    
       if (file_exists($updatefile)) {
         $handle = fopen($updatefile, "r");
         $contents = fread($handle, filesize($updatefile));
         echo "$contents";
         fclose($handle);
       } else {
          echo '<?xml version="1.0"?>';
       ?>
       <updates></updates>
       <?
       }
    
       ?>
    
    
    Потом был создан файл update.xml:
    
       <?xml version="1.0"?>
       <updates>
       <update type="minor" version="3.0.11" extensionVersion="3.0.11" buildID="2009042316" 
         detailsURL="http://192.168.0.1/ru/firefox/3.0.11/releasenotes/">
       <patch type="complete" URL="http://192.168.0.1/update/Firefox/3.0.10/win32/ru/release/firefox-3.0.11.ru.win32.complete.mar"
         hashFunction="SHA1" hashValue="1a08be9c203da5fb20f632e970e23331bb21b995" size="10189913" />
       <patch type="partial" URL="http://192.168.0.1/update/Firefox/3.0.10/win32/ru/release/firefox-3.0.10-3.0.11.ru.win32.partial.mar"
         hashFunction="SHA1" hashValue="67683707609194c20188459da2ecfe9853122de4" size="2188005" />
       </update>
       </updates>
    
    Хэш функции были вычислены с помощью sha1sum.
    
    Потом я открыл русский Firefox 3.0.10 для Windows и создал строковый параметр
    app.update.url.override со значением
    http://192.168.0.1/update/Firefox/3.0.10/win32/ru/release/update.xml и проверил
    наличие обновлений.
    Firefox успешно нашёл обновление для 3.0.11 и успешно его применил.
    
     
    ----* Выделение непрочитанных табов в Firefox (доп. ссылка 1)   [комментарии]
     
    В  Firefox можно настроить выделение табов ни разу не прочитанных пользователем.
    Для этого в директории ~/.mozilla/firefox/*.default/chrome/ нужно переименовать 
    файл userChrome-example.css в userChrome.css, добавив в:
    
       #content tab:not([selected]) {font-style: italic !important; }
    
    После этого текст в заголовке всех непрочитанных табов будет выделяться курсивом.
    
     
    ----* 3 способа оптимизации работы Firefox (доп. ссылка 1)   [комментарии]
     
    1. Уменьшение потребления памяти.
    
    По умолчанию Firefox полностью кеширует в памяти 5 последних страниц открытых в текущей вкладке,
    что приводит к ощутимым затратам памяти. Для определения числа страниц для полного кеширования 
    в настройках "about:config" следует изменить значение переменной:
    
       browser.sessionhistory.max_total_viewer
    
    Запретить полное кеэширование отрендеренного образа прошлых страниц можно
    установив эту переменную в 0.
    
    2. Увеличение скорости загрузки страниц.
    
    Стандартно браузер в пределах одного соединения отправляет запросы последовательно, 
    включив поддержку "pipelining" в рамках одного запроса можно организовать смешанную 
    одновременную загрузку нескольких файлов, отправляя следующий запрос не
    дожидаясь выполнения предыдущего.
    "pipelining" может привести к ощутимому повышению нагрузки на сервер, поэтому использовать 
    данную возможность нужно умеренно.
    Управление "pipelining" в about:config осуществляется через переменные:
    
       network.http.pipelining - поставить true
       network.http.proxy.pipelining - поставить true
       network.http.pipelining.maxrequests - размер очереди параллельных запросов, например 5
    
    Некоторые другие настройки, ускоряющие загрузку страниц 
    (если переменная отсутствует ее нужно создать через New - Integer/String/Boolean):
    
       nglayout.initialpaint.delay = 0 (http://kb.mozillazine.org/Nglayout.initialpaint.delay)
       network.dns.disableIPv6 = false  (http://kb.mozillazine.org/Network.dns.disableIPv6)
       content.notify.backoffcount = 5 (http://kb.mozillazine.org/Content.notify.backoffcount)
       plugin.expose_full_path = true
       ui.submenuDelay = 0 (http://kb.mozillazine.org/About:config_entries)
    
    3. Уменьшение потребления памяти при минимизации Firefox в системном трее.
    Для выгрузки лишних данных из памяти во время минимизации окна (процесс будет
    занимать около 10Мб) в about:config
    создаем через правый клик - New переменную типа  Boolean с именем config.trim_on_minimize
    Для того чтобы изменение вступило в силу необходима перезагрузка.
    
     
    ----* Установка Adobe Flash 9 во FreeBSD 7.x (доп. ссылка 1)   [комментарии]
     
    Включаем режим совместимости с Linux и linprocfs.
    
    Добавляем в /etc/rc.conf
       linux_enable="YES" 
    
    В /etc/sysctl.conf
       compat.linux.osrelease=2.6.16
    
    В /etc/fstab:
       linproc /usr/compat/linux/proc linprocfs rw 0 0
    
    Выполняем команды:
       mkdir -p /usr/compat/linux/proc
       mount /usr/compat/linux/proc
       /etc/rc.d/abi start
       /etc/rc.d/sysctl start
    
    Устанавливаем Linux библиотеки, Flash плагин и nspluginwrapper из портов:
       cd /usr/ports/emulators/linux_base-f8 && make install clean
       cd /usr/ports/www/linux-flashplugin9 && make install clean
       cd /usr/ports/www/nspluginwrapper && make install clean
    
    Активируем плагин в nspluginwrapper:
       nspluginwrapper -v -a -i
    
       Auto-install plugins from /usr/X11R6/lib/browser_plugins
       Looking for plugins in /usr/X11R6/lib/browser_plugins
       Auto-install plugins from /usr/local/lib/npapi/linux-flashplugin
       Looking for plugins in /usr/local/lib/npapi/linux-flashplugin
       Install plugin /usr/local/lib/npapi/linux-flashplugin   /libflashplayer.so
       into /usr/local/lib/browser_plugins/npwrapper.libflashplayer.so
       Auto-install plugins from /root/.mozilla/plugins
       Looking for plugins in /root/.mozilla/plugins
    
    Перезапускаем Firefox 3 и проверяем активность плагина, введя в адресном поле about:plugins.
    
    Если Flash плагин не обнаружен, можно создать симлинк:
       ln -s /usr/local/lib/browser_plugins/npwrapper.libflashplayer.so \
       /usr/local/lib/firefox3/plugins/npwrapper.libflashplayer.so
    
    Ставим плагин FlashBlock (http://addons.mozilla.org/en-US/firefox/addon/433)
    или NoScript (http://addons.mozilla.org/en-US/firefox/addon/722).
    
     
    ----* Как вручную применить файл обновлений для Firefox   [комментарии]
     
    Иногда требуется вручную последовательно установить несколько пропущенных обновлений к Firefox.
    Делается это следующим образом.
    Загружаем "mar" архив с обновлением из директории update нужного релиза Firefox 
    с сайта ftp://ftp.mozilla.org/pub/firefox/releases
    
    Создаем директорию, допустим /tmp/update, копируем туда "mar" файл и переименовываем в update.mar
    
       mkdir /tmp/update
       wget ftp://ftp.mozilla.org/pub/firefox/releases/2.0.0.17/update/linux-i686/ru/firefox-2.0.0.16-2.0.0.17.partial.mar
       mv firefox-2.0.0.16-2.0.0.17.partial.mar update.mar
    
    Далее копируем программу updater из директории в которую установлен firefox,
    например /usr/local/firefox
    
       cp /usr/local/firefox/updater /tmp/update/
    
    Переходим в установочную директорию Firefox и запускаем updater, передав 
    в качестве параметра директорию в которой лежит update.mar
    
       cd /usr/local/firefox/
       /tmp/update/updater /tmp/update 0
    
    где вместо 0, можно указать PID запущенного в данное время firefox (если не запущен ставим 0)
    
    После выполнения программы смотрим образовавшиеся в директории /tmp/update логи, 
    если в файле update.status написано "succeeded", значит все обновилось нормально.
    
     
    ----* Добавление словаря (создание поискового плагина) в Firefox   Автор: Александр  [комментарии]
     
    Как известно, английский словарь должен быть одноязычным. Самый лучший из одноязычных 
    словарей - Longman (Longman Dictionary Of Contemporary English, http://www.ldoceonline.com/). 
    Хотя имеющаяся электронная версия работает и под linux (GTK 1.2),
    лучше сделать возможность поиска слов прямо в Firefox (добавить новый Search Engine). 
    
    Создайте каталог:
       ~/.mozilla/firefox/profile/searchplugins
    
    И в нём файл longman.xml со следующим содержимым:
    
       <SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/" xmlns:os="http://a9.com/-/spec/opensearch/1.1/">
       <os:ShortName>Longman Dictionary</os:ShortName>
       <os:Description>Longman Dictionary of Contemporary English Online</os:Description>
       <os:InputEncoding>iso-8859-1</os:InputEncoding>
       <SearchForm>http://www.ldoceonline.com/search/<;/SearchForm>
       <os:Url type="text/html" method="GET" 
          template="http://www.ldoceonline.com/search/?q={searchTerms}"/>
       </SearchPlugin>
    
    Перезапустите firefox и выберете в меню поисковиков Longman Dictionary. 
    Теперь вы всегда можете получить необходимое толкование слова, кликнув 
    средней кнопкой по увеличительному стеклу (словарь откроется в новом табе).
    
     
    ----* Использование wget для загрузки через сервис Sun Download Center (доп. ссылка 1)   [комментарии]
     
    Зайдите на Sun Download Center (SDLC - http://cds.sun.com) под вашим именем.
    Для загрузки из командной строки можно использвать нижепредставленный скрипт:
    
       ./wget_from_cds  username  'URL'  filename.ext
    
    где, 
       username - имя пользователя, под которым вы недавно зашли в SDLC, после запуска скрипта, нужно ввести пароль.
       URL - адрес загружаемого файла
       filename.ext - файл в который необходимо сохранить результат
    
    
    Скрипт http://wikis.sun.com/download/attachments/28448383/wget-from-cds_v1
    
    #! /bin/sh
    
    # wget user download-url filename
    
    if [ $# -ne 3 ]; then 
        echo "Usage: $0 user_name download_url file_name"
        echo "  user_name     Use your Sun Online Account Username"
        echo "  download_url  The download link from the SDLC Download Page.  Must be enclosed in single quotes ('http://cds.sun.com/...')"
        echo "  file_name     Save the download using this file name"
        exit 1
    fi
    
    user=$1
    dlurl=`echo $2 | sed -e 's/\?/%3f/g' -e 's/&/%26/g'`
    filename=$3
    
    stty -echo
    
    echo "Password for ${user}: \c"; read password;
    
    stty echo
    
    #echo $dlurl
    
    touch /tmp/wget-url-$$.txt
    chmod 600 /tmp/wget-url-$$.txt
    
    echo
    "https://identity.sun.com/amserver/UI/Login?program=cds&org=self_registered_users&IDToken1=${user}&IDToken2=${password}&goto=${dlurl}" >>
     /tmp/wget-url-$$.txt
    
    wget  --no-check-certificate --keep-session-cookies  -O "${filename}" -i /tmp/wget-url-$$.txt
    
    rm /tmp/wget-url-$$.txt
    
     
    ----* Малоизвестные новые возможности Firefox 3 (доп. ссылка 1)   Автор: mozillalinks.org  [комментарии]
     
    1. Дублирование табов. Если нажать Ctrl в процессе перетаскивания таба, то его содержимое будет продублировано в новом табе;
    2. Перетаскивание табов между окнами.
    3. Изменение размера строки поиска, когда она размещена на одной линии со строкой ввода адреса. Достаточно подвести курсор мыши к разделителю между полями и можно будет изменить ширину;
    4. Поиск по ключевым словам. В меню поиска нажмите на "Управление поисковыми плагинами/Manage Search Engine" и выберите "Изменить/Edit Keyword" для заданной поисковой системы. Далее можно ввести краткое имя (Keyword), набрав которое после произвольного набора слов в строке адреса, будет осуществлен поиск через задуманную поисковую систему.
    5. Прерывистое выделение блоков текста. Отметив текст мышью, можно нажать Ctrl и продолжить выделение в другой части документа;
    6. В браузер интегрировано средство для поиска дополнений на странице addons.mozilla.org (меню Дополнения/Поиск дополнения);
    7. Возможность временного отключения плагинов (например, Flash) через менеджер дополнений;
    8. Набрав about:crashes можно просмотреть историю крахов браузера, по которым разработчикам были отправлены уведомления о проблемах.
     
    ----* Установка Firefox 3 в Debian Etch и дистрибутивах со старой версией GTK+ (доп. ссылка 1) (доп. ссылка 2) (доп. ссылка 3)   [обсудить]
     
    Официальная сборка Firefox 3 требует GTK+2.10, в то время как в Debian Etch только 2.8.
    Нужную версию gtk можно установить из бэкпортов:
    
    Разархивируем firefox 3 в директорию /opt/firefox3
    
    Загружаем http://apt.linex.org/linex/gtk-2.10/libgtk2.0-0_2.10.13-2%7Ebpo.1_i386.deb
    
    Ставим libgtk 2.10 в директорию gtk2-10:
       dpkg-deb -x libgtk2.0-0_2.10.13-2~bpo.1_i386.deb gtk2-10
    
    Перемещаем содержимое gtk2-10 в /opt/firefox3
    
    В начало скрипта /opt/firefox3/firefox дописываем:
    
       export LD_LIBRARY_PATH=" /opt/firefox3/gtk2-10/usr/lib"
    
    Для других дистрибутивов, при отсутствии бэкпорта, можно собрать gtk+ 2.10 из исходных текстов:
    
       cd /usr/local/src
       wget http://ftp.gnome.org/pub/GNOME/sources/gtk+/2.10/gtk+-2.10.14.tar.bz2
       tar xjf gtk+-2.10.14.tar.bz2
       mkdir gtk210
       cd gtk+-2.10.14
       ./configure --prefix=/opt/firefox3/gtk2-10
       make
       make install
    
     
    ----* Увеличение скорости работы со шрифтами в firefox/seamonkey   Автор: Sokolov Alexey  [комментарии]
     
    Чтобы браузер firefox/seamonkey работал со шрифтами на порядок быстрее,
    перед запуском браузера поменяйте значение переменной MOZ_DISABLE_PANGO на 1. 
    
    Выглядеть все должно приблизительно так: 
    
       %export MOZ_DISABLE_PANGO=1; firefox (для bash/zsh) 
       %setenv MOZ_DISABLE_PANGO 1; firefox (для csh-подобных) 
    
    Либо в /etc/profile, чтобы каждый раз не менять.
    
     
    ----* Ускоряем загрузку больших файлов из интернета. (доп. ссылка 1)   Автор: openkazan.info  [комментарии]
     
    Задача - скачать ISO образ линукса за короткое время. 
    Самое простое это:
       wget ftp://ftp.rediris.es/sites/releases.ubuntu.com/releases/feisty/ubuntu-7.04-desktop-i386.iso
    
    Но на зеркалах стоят лимиты на ширину канала для каждого подключения,
    а так как нам важно время, мы будем использовать несколько зеркал одноврменно.
    
    В первую очередь устанавливаем программу CURL:
    
       sudo  apt-get install curl
    
    Далее, ISO образ имеет объём 700Мб. Мысленно режем его на несколько частей по
    100Мб и выбираем 4 зеркала с этим образом.
    
    создаём файл ubuntu.sh:
    
       vim ubuntu.sh
    
    в него вписываем:
    
       #!/bin/sh
    
       url1=http://ubuntu.intergenia.de/releases/feisty/ubuntu-7.04-desktop-i386.iso
       url2=http://ubuntu.virginmedia.com/releases/7.04/ubuntu-7.04-desktop-i386.iso
       url3=http://es.releases.ubuntu.com/7.04/ubuntu-7.04-desktop-i386.iso
       url4=http://ftp-mirror.internap.com/pub/ubuntu-releases/7.04/ubuntu-7.04-desktop-i386.iso
    
       curl --range 0-199999999 -o ubuntu-iso.part1 $url1 &
       curl --range 200000000-399999999 -o ubuntu-iso.part2 $url2 &
       curl --range 400000000-599999999 -o ubuntu-iso.part3 $url3 &
       curl --range 600000000- -o ubuntu-iso.part4 $url4 &
    
    url1, url2, url3, url4 - переменные содержащие в себе ссылки на iso образ на разных зеркалах. 
    
    аргумен --range указывает с какого по какой байт надо скачать. --range
    600000000- указывает что надо скачать
    начиная с 600000000 и до конца.
    ubuntu-iso.part1 и т.д. - названия файлов под которыми будут сохранены скачанные части iso образа
    
    
    делаем скрипт исполняемым:
    
    $chmod u+x ubuntu.sh
    
    и запускаем его:
    
    $./ubuntu.sh
    
    в конечном итоге получаем 4 файла:
    
    ubuntu-iso.part1 ubuntu-iso.part2 ubuntu-iso.part3 ubuntu-iso.part4
    
    
    склеиваем их в один iso образ:
    
    cat ubuntu-iso.part? > ubuntu-7.04-desktop-i386.iso
    
    Получили готовый образ системы за относительно короткое время.
    
     
    ----* Использование 32-битных плагинов с 64-битной сборкой Firefox (доп. ссылка 1)   [комментарии]
     
    Устанавливаем nspluginwrapper http://gwenole.beauchesne.info/projects/nspluginwrapper/
    
    Подключаем 32-битную сборку Flash плагина:
       nspluginwrapper -i /usr/lib/mozilla/plugins/libflashplayer.so
    
    Отключаем Flash плагин:
       nspluginwrapper -r /usr/lib64/mozilla/plugins/npwrapper.libflashplayer.so
    
     
    ----* Установка Macromedia Flash 7 плагина под Firefox для FreeBSD. (доп. ссылка 1)   Автор: jail.se  [комментарии]
     
    Для использования Linux версии  Flash плагина с Firefox собранным под FreeBSD 
    (с linux-firefox под FreeBSD работает без проблем):
    
    cd /usr/src/libexec/rtld-elf
    fetch http://www.jail.se/freebsd/rtld_dlsym_hack.diff
    patch < rtld_dlsym_hack.diff
    make clean all install
    portinstall linux-flashplugin7 linuxthreads linuxpluginwrapper
    
    cd /usr/X11R6/lib/browser_plugins
    rm libflashplayer.so flashplayer.xpt
    ln -s ../linux-flashplugin7/flashplayer.xpt
    ln -s ../linux-flashplugin7/libflashplayer.so
    В /etc/libmap.conf добавляем (http://www.jail.se/freebsd/libmap.conf):
    
       [/usr/X11R6/lib/linux-flashplugin7/libflashplayer.so]
       libpthread.so.0                 pluginwrapper/flash7.so
       libdl.so.2                      pluginwrapper/flash7.so
       libz.so.1                       libz.so.3
       libstdc++-libc6.2-2.so.3        libstdc++.so.4
       libm.so.6                       libm.so.4
       libc.so.6                       pluginwrapper/flash7.so
    
     
    ----* Как заставить открывать ссылки из thunderbird в firefox   Автор: polkan  [комментарии]
     
    Создаем (редактируем) файл user.js в ~/.thunderbird/<li><li class=l>.default/
    добавляем строки
    
      user_pref("network.protocol-handler.app.http", "firefox");
      user_pref("network.protocol-handler.app.https", "firefox");
    
     
    ----* expect для автоматизации операций требующих ручного ввода   [комментарии]
     
    #!/usr/bin/expect -f # Забор файла по FTP
    spawn ftp ftp.test.ru
    expect  "Name*:" { send "ftp\n"}
    expect  "Password:" { send "ftp@\n"}
    expect "ftp>" {send "bin\n"}
    expect "ftp>" {send "prompt no\n"}
    expect "ftp>" {send "cd /pub/store\n"}
    expect "ftp>" {send "get arc.tar.gz\n"}
    expect "ftp>" {send "exit\n"}
    
    #!/usr/bin/expect -f # Выполнение операции используя telnet
    spawn telnet cisco.test.ru
    expect  "login:" { send "adm\n"}
    expect  "Password:" { send "пароль\n"}
    expect "#" {send "show users\n"}
    expect "#" {send "exit\n"}
    
     
    ----* Как из командной строки открыть новое окно Mozilla или Galeon   [обсудить]
     
    Mozilla:
      Открыть URL в окне: mozilla -remote "openurl(URL)"
      Открыть файл в окне: mozilla -remote "openFile(путь)"
      Можно указать: openURL (URL, new-window), openURL (URL, new-tab)
      Проверка запущен ли браузер: mozilla -remote "ping()"
    Galeon:
      Открыть в новом листе: galeon-bin --new-tab URL
      Открыть в новом окне: galeon-bin --new-window URL
    
     
    ----* Примеры использования wget и curl для копирования web-контента   [комментарии]
     
    Копирум ftp.test.ru, за исключением директории /pub/mp3 и помещаем результат в /tmp/test
        wget -m -P/tmp/test -nH ftp://ftp.test.ru/pub/ -X /pub/mp3
    
    Скачиваем файл test.gif со скоростью 10 Кб/с и сохраняем его на локальном диске:
       wget --quiet -O - --timeout=20 --limit-rate 10k http://test.ru/test.gif > /tmp/test.gif
       curl http://test.ru/test.gif --max-time 20 -s -o test.gif
    
    Рекурсивно скачиваем в директорию test_site:
        wget -r --no-parent -P ./test_site http://test.ru/arc/
    
    Доп. опции wget:
      "-O N" - куда выводить результат, "-" - стандартный вывод;
      "-l N" - уровень вложенности;
      "-r" - рекурсивный запрос.
      "--no-parent" - не выходить за пределы родительского каталога;
      "--quota N" - сограничить общий объем выкачиваемого в байтах (можно m и k);
      "--limit-rate N" - ограничить скорость в байт/сек. (10k - 10кб/сек);
      "--referer=URL" - подставить свой referer.
    
     
    ----* Советы по работе с curl - мощным инструментом для автоматизации web-запросов   [обсудить]
     
    Маски запроса:
       http://test.ru/file[1-100].html  # Скачать файлы 1.html, 2.html...100.html (можно [a-z])
       http://test.ru/file{one,two}.html  # Скачать one.html, two.html
           curl http://test.ru/file[1-10].html -o "site1_f_#1.html"
    Только проверка HTTP заголовков (HEAD запрос): curl -I http://test.ru
    Докачка оборванного трансфера: curl -C - http://test.ru/file.tgz
    Представляемся браузером:
       curl --user-agent "Mozilla 1.1" --cookie "session=123;user=guest" --referer "http://test2.ru/" \
       --header "Charset: koi8-r" --user user:password
    Таймауты, лимиты и proxy:
       curl --connect-timeout=60 --interface eth1 --limit-rate 5K --max-time 60 --silent --proxy proxy.t.ru:3128
    
     
    ----* Как оптимизировать производительность Mozilla и Galeon (доп. ссылка 1)   [обсудить]
     
    Mozilla:
      echo 'user_pref("nglayout.initialpaint.delay", 0);' >> ~/.mozilla/имя_пользователя/*.slt/prefs.js
      chmod -w ~/.mozilla/имя_пользователя/*.slt/prefs.js
    Для Galeon путь ~/.galeon/mozilla/galeon/prefs.js
      
    
     
    ----* Установка в мобильной версии Firefox любого расширения от десктоп-версии   Автор: Каримуллин Артур  [комментарии]
     
    Установка любого десктопного расширения Firefox в мобильную версию браузера для
    Android и его производные.
    
    
    1. Ставим браузер на Android, в моём случаие это Fennec.
    
    2. Идём в "Настройки -> О Fennec". Кликаем быстро несколько раз по логотипу.
    Тем самым включаем режим отладки.
    
    3. Идём на https://addons.mozilla.org/ru/firefox
    
      - Создаём/Входим в аккаунт.
    
      - Нажимаем на свой профиль и выбираем "Создать подборку".
    
      - Добавляем туда те расширения, которые хотим поставить.
    
      - Берём id коллекции.
    
    Если что-то не нашли, гляньте здесь.
    
    4. Возвращаемся в настройки:
    
      - Ищем пункт "Собственный сборник дополнений".
    
      - Вводим id и название коллекции.
    
    5. Переходим в раздел "Расширения":
    
     - Видим наши расширения из коллекции, устанавливаем.
     - Profit!
    
    
    Для примера поставим расширение LibRedirect, которое
    перенаправляет нас на альтернативные фронтенды мэйнстримовых
    сервисов. Они более функциональные и лёгкие. К примеру Invidius (альтернативный
     фронтенд ютуба) умеет скачивать видео, а LibReddit имеет внятный интерфейс
    пользователя. Можно использовать готовые коллекции дополнений от других
    пользователей, например, коллекцию от автора заметки.
    
    Проделал шаги с 1 по 3, получил id - 17671691
    
    Устанавливаем, тестируем: https://www.opennet.me/soft/with_lr.gif
    
    Для сравнения без: https://www.opennet.me/soft/without_lr.gif
    
    Конечно, не все расширения будут работать корректно, иначе они официально были
    бы включены в список поддерживаемых, но как в нашем случае есть штуки, которые
    работает как родные. В целом, экспериментируете.
    
    
    © CC-BY Каримуллин Артур, 2023
    
     
    ----* Обход ограничения по выполнению только подписанных дополнений в Firefox (доп. ссылка 1)   [комментарии]
     
    Начиная с Firefox 48 введена обязательная и неотключаемая через
    "xpinstall.signatures.required" в about:config проверка дополнений по цифровой
    подписи. При необходимости установки неподписанных дополнений пока остаётся
    несколько лазеек.
    
    Ниже представлен способ, основанный на чистке списка объектов к которым
    применяется проверка по цифровой подписи, т.е. в файле
    gre/modules/addons/XPIProvider.jsm удаляется содержимое структуры SIGNED_TYPES.
    
    Создаём файл config.js со следующим содержимым:
    
       //
       try {
       Components.utils.import("resource://gre/modules/addons/XPIProvider.jsm", {})
       .eval("SIGNED_TYPES.clear()");
       }
       catch(ex) {}
    
    Переносим данный  файл в директорию установки Firefox, например, в
    /usr/lib/firefox-* или /usr/lib64/firefox-*.
    
    Создаём файл config-prefs.js и копируем его в директорию с текущим активным
    профилем, например, ~/.mozilla/firefox/*.default:
    
       pref("general.config.obscure_value", 0);
       pref("general.config.filename", "config.js");
    
    Перезапускаем Firefox.
    
    
    В качестве альтернативного метода можно извлечь из zip-архива omni.ja (в
    корне установки firefox) файлы modules/AppConstants.jsm  и
    modules/addons/AddonConstants.jsm, заменить в них значение переменных
    MOZ_REQUIRE_SIGNING и REQUIRE_SIGNING с true на false, скопировать данные файлы
    как jsloader/resource/gre/modules/AppConstants.jsm и
    jsloader/resource/gre/modules/addons/AddonConstants.jsm, после чего воссоздать
    архив omni.ja с внесёнными изменениями.
    
     

       Редактирование текстов

    ----* Полезные мелочи при работе в vim (доп. ссылка 1)   [комментарии]
     
    - Редактирование файла на другой машине по сети: vim scp://[email protected]:/home/user/file
    - Поиск слова как под курсором: "*" - вперед, "#" - назад.
    - Поиск парных скобок - "%".
    - Автодополнение недописанных слов: Ctrl-N
    - Замена регистра букв в линии: "guu", "gUU"
    - Переход на строку (позицию) где было последнее изменение: "'." ("`.")
    - Трассировка пути курсора по файлу: Ctrl-O, Ctrl-I.
    - Выделение в визуальном режиме:
      v - начало блока (V линия, Ctrl-V - вертикальный блок), выделив блок нажать d или y (удалить, скопировать).
    
     
    ----* Как в vi заменить одно слово на другое по всему тексту   [комментарии]
     
    :0,$s/старое/новое/g
    или :%s/старое/новое/g
    
     
    ----* Восстановление позиции курсора при повторном открытии файла в Vim (доп. ссылка 1)   Автор: Конищев Дмитрий  [комментарии]
     
    Для того, чтобы vim при повторном открытии файла восстанавливал позицию курсора
    на которой файл был закрыт в прошлый раз в ~/.vimrc следует добавить:
    
        set viewoptions=cursor,folds
        au BufWinLeave * mkview
        au BufWinEnter * silent loadview
    
    Другой вариант, оставить по умолчанию установки курсора на первой строке, а при
    необходимости осуществлять руками переход на метку последней открытой позиции,
    введя команду '".
    
     
    ----* Отображение табуляций и выхода строки за границы 80 символов в vim (доп. ссылка 1) (доп. ссылка 2)   Автор: jetxee  [комментарии]
     
    Большинство программистов согласятся, что строчки кода должны быть короче 80
    символов. Часто это просто хороший тон:
    читаем Linux Kernel Coding Style (80) , Style Guide for Python code (79), Good Haskell Style (79), 
    Ruby Coding Conventions (80), Google C++ Style Guide (80)...
    
    Практический вопрос: а как в Vim увидеть, что строка стала длиннее 80 символов?
    Это может быть очень полезно,
    если ширина окна больше 80. Простой и дубовый способ: 80| и курсор перемещается на 80-ю колонку. 
    
    Проверять так каждую строку или включить автоматический перенос (set tw=80) не всегда удобно.
    
    Более элегантный выход - подсвечивать всё, что вылазит за 80-ю колонку. Ниже несколько рецептов.
    
    Включить подсветку вручную:
    
       :match ErrorMsg '\%>80v.\+'
    
    Чтобы включать подсветку автоматически, каждый раз при открытии буфера, в ~/.vimrc помещаем:
    
       :au BufWinEnter * let w:m1=matchadd('Search', '\%<81v.\%>77v', -1)
       :au BufWinEnter * let w:m2=matchadd('ErrorMsg', '\%>80v.\+', -1)
    
    Должно работать в Vim после 7.1.40. При этом последние 4 символа до 80-й
    колонки будут предупреждающе
    подсвечиваться "поиском", а все, что после 80-й - "ошибкой". 
    
    Подвечивать только 81-ый символ и кривые пробелы/табы:
    
       :match BadFormat /\s\+$\|\ \+\t\| \{8,}\|\%81v/
    
    
    Другая проблема для исходного кода - концевые пробелы (trailing whitespace) и
    смешанные с пробелами табуляции.
    Для их подсветки в ~/.vimrc можно добавить:
    
       " highlight trailing spaces
       au BufNewFile,BufRead * let b:mtrailingws=matchadd('ErrorMsg', '\s\+$', -1)
       " highlight tabs between spaces
       au BufNewFile,BufRead * let b:mtabbeforesp=matchadd('ErrorMsg', '\v(\t+)\ze( +)', -1)
       au BufNewFile,BufRead * let b:mtabaftersp=matchadd('ErrorMsg', '\v( +)\zs(\t+)', -1)
    
    Первое включает подсветку любых пробелов на конце строки. 
    Второе и третье подсвечивают табуляции, перед которыми или после которых есть пробелы. 
    Вместо "*" можно явно прописать типы файлов, для которых это должно работать.
    
     
    ----* Многооконный режим редактирования файлов в Vim (доп. ссылка 1)   Автор: cyberciti.biz  [комментарии]
     
    Открытие двух или трех файлов в разных окнах vim.
    
    С горизонтальной разбивкой окон на экране:
       vim -o /etc/passwd /etc/hosts
       vim -o /etc/passwd -o /etc/group /etc/hosts
    
    С вертикальной разбивкой окон на экране:
       vim -O /etc/passwd /etc/hosts
       vim -O /etc/passwd -O /etc/group /etc/hosts
    
    Наглядный просмотр отличий нескольких файлов
       vim -d файл1 файл2
       vim -d файл1 -d файл2 файл3
    
    Команды переключения между окнами:
    "CTRL-w w" - быстрое переключение на следующее окно
    "CTRL-w влево" - активация левого окна
    "CTRL-w вправо" - активация правого окна
    "CTRL-w вверх" - активация верхнего окна
    "CTRL-w вниз" - активация нижнего окна
    "CTRL-w n" - создать новое окно (":new файл" - открыть заданный файл)
    "CTRL-w q" - закрыть текущее окно 
       (":qall" - закрыть все окна разом, ":qall!" - без сохранения, ":write" - записать данные во всех  окнах)
    "CTRL-w s" - разбить текущее окно на 2 части для синхронного редактирования разных частей
       (в каждом окне будет содержимое одного и того же файла).
    "CTRL-w +", "CTRL-w -" - увеличение или уменьшение текущего размера окна
    "ESC 5 CTRL-w -", "ESC 5 CTRL-w +" - изменение размера сразу на 5 строк/столбцов
    "CTRL-w h" - переместить окно влево
    "CTRL-w j" - переместить окно ниже
    "CTRL-w k" - переместить окно выше
    "CTRL-w l" - переместить окно вправо
    "CTRL-w t" - переместить окно на самый верх
    "CTRL-w b" - переместить окно в самый низ
    
     
    ----* Как снизить в Open Office объем потребления памяти (доп. ссылка 1)   Автор: demimurych  [комментарии]
     
    Совет как уменьшить расход памяти при работе с open office 
    или как решается проблема right buttom click на слове с ошибкой.
      
    Как оказалось, в большинстве конфигураций open offica которые я увидел,
    грузятся абсолютно ВСЕ доступные офису словари.
    Как для проверки орфографии так и для других нужд (аля синонимы, переносы ect.) 
    А это дикий расход памяти, плюс критическое снижение производительности (в
    некоторых случаях) при проверке документа.
     
     Итак идем в 
          /usr/lib/ooo-1.1/share/dict/ooo 
     Ищем файл 
          dictionary.lst 
     И удаляем оттуда все ссылки на словари которые нам сейчас не нужны. 
     Фактически мы удаляем только указатели - какие словари использовать, 
    сами словари остаются на месте и при необходимости могут быть снова добавлены. 
     
    В моем случае расход памяти снижался с 300 метров до 50. 
    
     
    ----* Русские буквы в качестве управляющих клавиш в VIM (доп. ссылка 1)   Автор: Илья Воронин  [комментарии]
     
    Для ввода команд без переключения раскладки достаточно прописать в ~/.vimrc:
       set langmap=йq,цw,уe,кr,еt,нy,гu,шi,щo,зp,х[,ъ],фa,ыs,вd,аf,пg,рh,оj,\
       лk,дl,э',яz,чx,сc,мv,иb,тn,ьm,б\,,ю.,ё`
    
     
    ----* Удаление граничных пробелов и комментариев в sed (доп. ссылка 1)   [комментарии]
     
    Удаление комментариев и пустых строк
      sed '/^ *#/d; /^ *$/d'
    
    Объединение строк разделенных символом \
      sed ':a; /\\$/N; s/\\\n//; ta'
    
    Удаление граничных пробелов и табуляций
      sed 's/[ \t]*$//'
    
     
    ----* Запуск ispell для проверки орфографии из скрипта (доп. ссылка 1)   [обсудить]
     
    Вывести список слов с ошибками:
      cat file.txt | ispell -d russian -l
    Детальный разбор ошибок с вариантами замены:
      echo file.txt | ispell -d russian -a
    Для скриптов на perl рекомендую использовать модуль Lingua::Ispell.
    
     
    ----* Как осуществить форматирование файла ограничив число символов в строке   [обсудить]
     
    Жестко разбить по 60 символов в строке: fold -w 60 test.txt
    Разбивать только по пробелам, не разбивая слова на части: fold -s -w 60 test.txt
    Для форматирования текста программы на Си можно воспользоваться утилитой indent.
    Разбить на параграфы поможет fmt из textutils.
    
     
    ----* Полезные команды при работе в vi   [обсудить]
     
    :set ic|noic - установить|снять игнорирование различия больших и маленьких букв.
    /web *master - поиск по маске
    / - продолжение поиска вперед, ? - назад.
    V - выделение в vim с подсветкой (визуальный режим отметки блока)
    :.,$s/Windows/Linux/gс - заменить Windows на Linux с текущей позиции до конца, 
      при каждой замене спрашивать подтверждение.
    :set ai|noai - включить|выключить автоматическое выравнивание.
    :syntax on|off - включить|выключить подцветку синтаксиса.
    :set syntax=perl|c|java|html - выбрать язык для подцветки.
    
     
    ----* Как преобразовать man в текстовый вид ?   [комментарии]
     
        groff -mandoc -Tlatin1 | col -b
    Для русских манов latin1 меняем на koi8-r.
    
     
    ----* Как русифицировать gvim   [комментарии]
     
    В ~/.Xdefaults добавить:
       Vim*font:             -cronyx-fixed-medium-r-normal-*-20-200-75-75-c-100-koi8-*
    
     
    ----* Как удалить пустые строки в vi   [комментарии]
     
    :g/^$/d
    
     
    ----* Как удалить DOSовый возврат каретки   [комментарии]
     
    в vi:
         :%s/<CTRL-V><CTRL-M>//g
    через командную строку:
         col -bx < dosfile > newfile
    или  cat dosfile| tr -d "\r" > newfile
    
     
    ----* Что поместить в начало русского LaTeX текста   [комментарии]
     
     \usepackage[T2A]{fontenc}
     \usepackage[koi8-r]{inputenc}
     \usepackage[english,russian]{babel}
    
     

       Русификация

    ----* Включение проверки орфографии в собранном из исходных текстов OpenOffice 2 (доп. ссылка 1)   Автор: kaim  [комментарии]
     

    Собрал себе OpenOffice 2 версии и столкнулся с проблемой - не хочет проверять русский язык. Ниже описание как была решена проблема.

    Когда OO способен проверять орфографию, он выставляет синию галочку у названия языка в соответсвующей менюхе. В FreeBSD это по умолчанию не происходит, что грустно.

    Для того, чтоб OO начал проверять орфографию русских слов в FreeBSD нужно ему скормить русский модуль. Сам модуль доступен на сайте OO по адресу [1]. Скачав модуль и сохранив его в любом удобном месте, идём в меню Файл > Мастер > Установить новые словари. Там выбираем абсолютно любой словарь и жмём кнопку. В открывшемся мастере преключаем язык на английский (ниспадающая менюшка внизу) - выбираем пункт Current user setup, затем савим галку у Off-line language pack installation и прописываем путь к скачанному фалу (в моём случае это ru_RU-pack.zip).

    Далее отвечаем на вопросы мастера, выбирая все словари с помошью Control (о чём там и говориться). Закрываем OO, открываем OO :)

    Всё, словари стоят, идём в Сервис > Параметры - Натсройка языка > Лингвистика и выбираем там проверку орфографии и всё что нам нужно.

    Ссылки по теме

    1. http://lingucomponent.openoffice.org/spell_dic.html слованри
    2. http://lingucomponent.openoffice.org/download_dictionary.html тезариус
    3. http://ooodi.sourceforge.net/OOodi.html#usage о том как ставить поддержку словарей
    P.S. Не забываем при этом собирать aspell и linux-aspell с опциями ASPELL_RU=yes и другими по необходимости
     
    ----* Настройка шрифтов для консоли и терминала   Автор: Warlock  [комментарии]
     
    Одна из первых вещей, которые требуется поменять в свежеустановленной системе -
    шрифты и раскладки клавиатуры. С предлагаемыми по умолчанию шрифтами обычно
    имеется несколько проблем:
    
    
  • шрифт в терминале (здесь и далее под терминалом я подразумеваю "настоящий" терминал, т.е. tty) слишком мелкий.
  • эстетика некоторых букв неидеальна.
  • шрифт в консоли (а под этим словом я подразумеваю GUI-программу - эмулятор терминала) безобразно гладкий и отличается от шрифта в терминале.
  • возможности набирать русские буквы нет, либо же есть, но переключение между языками ужасное.
  • в Иксах нет возможности набирать типографские символы (в терминале тоже, но в терминале это не особо нужно, даже для цели написания таких вот текстов). Собственный шрифт в терминале Первое, что нужно сделать - обзавестись хорошим растровым шрифтом. И если для базовой латиницы таких шрифтов, возможно, несколько (но это не точно), то с учётом кириллицы и юникода выбора вообще не остаётся, и Terminus - это единственный вариант. Так что в этом месте нужно пойти в интернет и раздобыть две вещи: 1) сам Terminus в виде архива '.tar.gz' и 2) веб-страничку этого шрифта, которая содержит важную информацию относительно настраиваемых вариантов некоторых букв и которая, тем не менее, почему-то не входит в тарбол. Далее следуют привычные и очевидные вещи - распаковка тарбола и изучение readme файла. Ну а далее всё просто. Во-первых нужно определиться с альтернативными начертаниями и применить необходимые патчи (подробности в readme). Далее нужно решить, какой размер и начертание шрифта вам подходит. Я обычно использую 9x18, жирное начертание. Выбранный шрифт можно отредактировать с помощью 'gbdfed'. Так, в шрифт, которым я пользуюсь прямо сейчас, внесены следующие исправления:
  • изменено начертание русско-латинской большой буквы "A", так что она имеет вид, схожий с видом этой буквы в классическом ДОС шрифте,
  • изменено начертание кириллического "Ээ оборотного", так что его труднее спутать с "Зз",
  • изменено начертание строчной кириллической буквы "б", так как дефолтный вариант имеет не вполне органичный вид для русского языка,
  • изменено начертание заглавной буквы "Ф" - она стала более "скромной",
  • изменено очертание твёрдого знака - он стал поуже, а палочка, отличающая его от мягкого знака, заметнее,
  • изменено очертание буквы "Ыы" опять же по мотивам известного досовского шрифта,
  • изменено начертание цифры "3", чтобы не путать её с буквой "З". Соответствующие патчи можно найти на гитхабе. Выбрав и отредактировав шрифт, переходим к сборке: $ ./configure $ make Инсталляция сводится к размещению шрифта в правильном месте. В линуксах читаем 'man setfont', используем '.psf' файл: $ cp ter-u18b.psf xter-u18b.psf $ gzip -9 xter-u18b.psf # mv xter-u18b.psf.gz /usr/share/kbd/consolefonts # chown root:root /usr/share/kbd/consolefonts/xter-u18b.psf # chmod u=rw,g=r,o=r /usr/share/kbd/consolefonts/xter-u18b.psf Во FreeBSD читаем 'man vt' и раздел "Virtual Consoles and Terminals" в Hanbook, и превращаем ".bdf" в ".fnt" с помощью "vtfontcvt": $ vtfontcvt -o xter-u18b.fnt ter-u18b.bdf # mv xter-u18b.fnt /usr/share/vt/fonts # chown root:root /usr/share/vt/fonts/xter-u18b.fnt # chmod u=rw,g=r,o=r /usr/share/vt/fonts/xter-u18b.fnt Осталось указать системе использовать наш шрифт. Во FreeBSD это делается с помощью настройки "allscreens_flags" в "/etc/rc.conf": allscreens_flags="-f xter-u18b" В линуксах настройка дистроспецифична, точнее она зависит от системы инициализации. В случае systemd это настраивается установкой "FONT" в "/etc/vconsole.conf": FONT="xter-u18b" В случае использования системы инициализации OpenRC, нужная опция называется 'consolefont' и располагается в '/etc/conf.d/consolefont': consolefont="xter-u18b" В Artix с OpenRC надо прописывать шрифт в оба места: и в '/etc/conf.d/consolefont', и дополнительно в '/etc/vconsole.conf' для 'mkinitcpio' (а точнее для хука '/usr/lib/initcpio/install/consolefont'). В Slackware нужно просто вписать вызов 'setfont' с нужными параметрами в '/etc/rc.d/rc.font': /usr/bin/setfont xter-u18b Но если нужно загрузить шрифт так же и в initrd, я не представляю как это можно сделать в Slackware. Шрифт в загрузчике Если хочется использовать тот же шрифт и в меню загрузчика, вот как это делается для Arch-подобных Linux-дистрибутивов и загрузчика GRUB 2. 1. Шрифт в '.pf2' формате кладётся в '/boot/grub/fonts': $ grub-mkfont -o xter-u18b.ps2 ter-u18b.bdf # mv xter-u18b.ps2 /boot/grub/fonts 2. Затем шрифт прописывается в '/etc/default/grub': GRUB_FONT="/boot/grub/fonts/xter-u18b.pf2" 3. Регенерируется реальный конфиг груба: # grub-mkconfig -o /boot/grub/grub.cfg Всё, можно перезагружаться и проверять результат. Шрифт в консоли Следующая задача - запихнуть тот же самый шрифт в Иксы, чтобы иметь возможность использовать его в эмуляторе терминала. Современные иксовые приложения не особенно любят растровые шрифты, особенно в "традиционном" формате '.pcf', поэтому необходимо использовать более "модный" '.otb'. Конвертация проста: $ fonttosfnt -o xter-u18b.otb ter-u18b.bdf Однако, перед этим может быть небесполезным поменять название кастомного шрифта в '.bdf' файле, чтобы если что он не перепутался с оригинальным Terminus. Запихивать такой шрифт в систему не вполне правильно, да и не нужно: в '~/.local/share/fonts' ему будет вполне комфортно. (В прежние времена для этой цели использовалась '~/.fonts', но в рамках борьбы с загаживанием home dir, фонты переехали в указанное выше место.) Чтобы Иксы обновили список доступный шрифтов, необходимо позвать 'fc-cache -fv'. Однако очень вероятно, что так сразу шрифт не найдётся. Моё основанное на личном опыте заключение таково: в FreeBSD больше никаких телодвижений не требуется, а вот в Linux скорее всего придётся найти способ включить растровые шрифты. Правда, способ этот скорее всего весьма универсален: надо просто прочитать '/etc/fonts/conf.d/README', и, прочитав, обратить внимание на файлы с названиями '70-yes-bitmaps.conf' и '70-no-botmaps.conf' в '/etc/fonts/conf.d' и '/usr/share/fontconfig/conf.avail' (последняя директория может располагаться и в ином месте, но 'locate conf.avail' должен справиться с поиском). Дальнейшие действия очевидны: отключить отключение растровых шрифтов путём удаления линка на файл '70-no-botmaps.conf' и включить включение растровых шрифтов путём создания линка на '70-yes-bitmaps.conf'. Этого должно быть достаточно, чтобы 'fc-cache -fv' нашёл-таки наш шрифт, после чего (Иксы лучше перезапустить) наш кастомный шрифт будет можно выбрать в настройках программы - эмулятора терминала. Продолжение следует...
  •  
    ----* Как русифицировать GNU Emacs/XEmacs   [комментарии]
     
    в ~/.emacs
    (XEmacs
      (set-language-environment "Cyrillic-KOI8")
      (select-input-method "cyrillic-jcuken")
    )
    (GNUEmacs
      (set-language-environment "Cyrillic-KOI8")
      (set-terminal-coding-system 'koi8-r)
      (set-keyboard-coding-system 'koi8-r)
    )
    
     
    ----* Раскладка клавиатуры для ввода символов APL   Автор: Аноним  [комментарии]
     
    Большинство руководств в сети показывают как добавить APL в качестве второй
    раскладки, например в дополнение к US. Мне это не подходит, потому что у меня
    уже две раскладки (US, RU), а добавление третьей сделает переключения неудобными.
    
    Для организации ввода символов APL без добавления ещё одной раскладки
    следует добавить опцию "misc:apl", каковы бы ни были текущие настройки
    клавиатуры X11.
    
    Результат:
    
        # setxkbmap -print
        xkb_keymap {
          xkb_keycodes  { include "evdev+aliases(qwerty)"	};
          xkb_types     { include "complete"	};
          xkb_compat    { include "complete+ledscroll(group_lock)"	};
          xkb_symbols   { include "pc+us+ru:2+inet(evdev)+group(rctrl_toggle)+ctrl(nocaps)+compose(lwin)+apl(level3):1+apl(level3):2"	};
          xkb_geometry  { include "pc(pc104)"	};
        };
    
    Можно добавить опцию "lv3:caps_switch" для переключения в режим APL с помощью
    нажатия и удержания CapsLock, а также нажатия и удержания CapsLock+Shift  для
    ввода других символов APL. В этом случае нажатие и удержание CapsLock или
    CapsLock+Shift позволяет вводить символы APL независимо от текущей раскладки.
    
    В Xfce изменение можно выполнить в редакторе настроек (типа реестра).
    
     
    ----* Как сделать пометку ошибок правописания в Firefox более заметной   [комментарии]
     
    По умолчанию Firefox помечает слова с ошибками правописания тонкой красной
    волнистой чертой, которая малозаметна на некоторых мониторах.
    
    Для изменения стиля пометки в about:config можно изменить значение переменной
    ui.SpellCheckerUnderlineStyle (по умолчанию отсутствует, нужно создать).
    Значение 0 означает отключение пометки, 1 - подчёркивание из точек, 2 -
    прерывистой линией, 3 - одинарной линией, 4 - двойной линией, 5 (по умолчанию)
    - волнистой линией.
    
    
    Для изменения цвета можно использовать переменную ui.SpellCheckerUnderline (по
    умолчанию выбран красный цвет - #FF0000)
    
    Толщина задаётся при помощи переменной ui.SpellCheckerUnderlineRelativeSize (по умолчанию 100).
    
     
    ----* Правильное отображение русских букв для zip-архивов в KDE ARK   Автор: Аноним  [комментарии]
     
    Ubuntu 16.04 умеет корректно читать через unzip архивы с русскими буквами, а
    через p7zip нет. При этом, архиватор KDE ARK если установлен p7zip предпочитает
    его, а не unzip. Для того чтобы это исправить нужно увеличить значение
    приоритета в файле
    
       /usr/share/kservices5/kerfuffle_clizip.desktop
    
    изменить строчку
    
       X-KDE-Priority=160
    
    на
    
       X-KDE-Priority=190
    
     
    ----* Настройка клавиатуры для X.org/X11 в Fedora 18, 19 и выше   Автор: Artem S. Tashkinov  [комментарии]
     
    В новых версиях Fedora Linux настройка клавиатуры для X11/X.org изменилась и
    теперь её можно осуществлять с помощью команды localectl:
    
       localectl set-x11-keymap layout [model] [variant] [options]
    
    localectl также можно использовать в других дистрибутивах с systemd-localed, таких как Arch Linux.
    
    
    Работающий пример для изменения раскладки с помощью Alt+Shift, отображением
    языка в виде LED индикатора Scroll Lock и рестарта X-сервера с помощью Ctrl+Alt+Backspace:
    
       localectl set-x11-keymap "us,ru" pc105 "" grp:alt_shift_toggle,grp_led:scroll,terminate:ctrl_alt_bksp
    
    Просмотреть список доступных сочетаний клавиш для смены раскладки можно с помощью команды:
    
       man xkeyboard-config
    
     
    ----* Перекодирование русских символов вида =D0=9B в транслит   Автор: Kroz  [комментарии]
     
    Данная задача появилась когда потребовалось перенести адресную книгу с одного
    телефона в другой. Использовался wammu. Принцип был таков: подключив первый
    телефон экспортировать адерсную книгу в .vcf файл, потом подключить второй
    телефон и импортировать в него .vcf файл. Проблема в том, что русские имена
    контактов не хотели импортироваться. Было принято решение перекодировать их в транслит.
    
    В .vcf файле имя на русском было записано вот в такой форме:
    
       N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=92=D0=B0=D1=81=D1=8F
    
    Очевидно, что это юникод, оформленный в формате Quoted-Printable.
    Для перевода нужно составить таблицу соответствия таких вот комбинаций
    транслитерированым символам - в этом, пожалуй, основная сложность задачи.
    
    Внизу скрипт, который выведет команду, которой можно перекодировать файлы.
    Мягкий и твердый знаки игнорируются.
    
       #!/bin/sh
    
       src=(\\
       =D0=90 =D0=91 =D0=92 =D0=93 =D0=94 =D0=95 =D0=96 =D0=97 =D0=98 =D0=99 =D0=9A =D0=9B =D0=9C =D0=9D =D0=9E =D0=9F =D0=A0 =D0=A1 =D0=A2 =D0=A3 =D0=A4 =D0=A5 =D0=A6 =D0=A7 =D0=A8 =D0=A9 =D0=AA =D0=AB =D0=AC =D0=AD =D0=AE =D0=AF =D0=B0 =D0=B1 =D0=B2 =D0=B3 =D0=B4 =D0=B5 =D0=B6 =D0=B7 =D0=B8 =D0=B9 =D0=BA =D0=BB =D0=BC =D0=BD =D0=BE =D0=BF =D1=80 =D1=81 =D1=82 =D1=83 =D1=84 =D1=85 =D1=86 =D1=87 =D1=88 =D1=89 =D1=8A =D1=8B =D1=8C =D1=8D =D1=8E =D1=8F)
       res=(\\
          A       B     V     G        D     Ye    Zh      Z      I      Y      K      L      M      N      O      P        R       S     T     U        F      H    Ts      Ch     Sh    Sch     Ь      Y      Ь      E      Yu     Ya       a       b     v     g        d     ye    zh      z      i      y      k      l      m      n      o      p    r       s     t     u        f      h    ts      ch     sh    sch     Ь      y      Ь      e      yu     ya)
    
       CMD=""
       for ((A=0;A<64;A++)) ; do
       	CMD=`echo "$CMD | sed -e s/${src[$A]}/${res[$A]}/g"`
       done
    
       CMD=`echo "cat file.vcf $CMD | sed -e s/Ь//g | sed -e s/N\\;CHARSET=UTF-8\\;ENCODING=QUOTED-PRINTABLE/N/g | less"`
       echo "$CMD" 
    
    
    Для раскодирования quoted-printable блоков можно использовать простой perl-скрипт:
    
       echo "=D0=92=D0=B0=D1=81=D1=8F" | perl -e 'use MIME::Decoder; $decoder = new MIME::Decoder "quoted-printable"; $decoder->decode(\\*STDIN, \\*STDOUT);'
    
     
    ----* Правильная кодировка html-сообщений в mutt при использовании w3m (доп. ссылка 1)   Автор: Kirill Zabarniuk  [комментарии]
     
    При просмотре html-сообщений в mutt при помощи w3m часть сообщений может
    оказаться нечитаемой из-за неправильного определения кодировки сообщения.
    Исправить это можно, добавив следующую строку в свой ~/.mailcap:
    
       text/html; /usr/bin/w3m -dump -I %{charset} -T text/html '%s'; copiousoutput; description=HTML Text; nametemplate=%s.html
    
    Ключевой является опция -I %{charset}.
    
     
    ----* Работа с русскими именами файлов в ZIP и UNZIP под *nix   Автор: Natrio  [комментарии]
     
    Одна из неожиданных проблем, возникающих при обмене файлами с пользователями
    Windows - странное поведение ZIP-архивов. Казалось бы, достаточно правильно
    настроить кодировки... Не тут-то было!
    
    Для текстовых файлов достаточно найти редактор с выбором кодировки, для дисков
    можно указать кодировку при монтировании, более "продвинутые" форматы архивов
    (RAR, 7zip) тоже как-то решают эту проблему; и только ZIP, самый
    распространённый и "самый совместимый" архиватор, почему-то неожиданно
    оказывается несовместимым в принципе, стоит именам файлов выйти за пределы ASCII.
    
    Есть мнение, что в архивы ZIP имена файлов пишутся в кодировке файловой
    системы, и дескать, отсюда и проблемы - в Windows одна кодировка, а в Linux
    другая. И виноват в том устаревший архивный формат и сделать с этим ничего
    нельзя, а если очень хочется - переименовывать распакованные файлы скриптами и
    прочими костылями. Что ж, попробуем.
    
    Однако попытка увидеть имена файлов путём перекодировки вида
    
       ls -N | iconv -f cp866
    
    заканчивается провалом. Ладно, не подошла 866, перебираем все известные русские
    кодировки и все виды юникода - имена файлов остаются нечитаемыми. Что же это за
    кодировка такая в зипе?!
    
    Поиски в сети дают результат - оказывается, надо так:
    
       ls -N | iconv -f cp1252 -t cp850 | iconv -f cp866
    
    Перекодировать распакованные файлы в utf-8 можно следующей командой:
    
       find . -type f -exec sh -c 'np=`echo {}|iconv -f cp1252 -t cp850| iconv -f cp866`; mv "{}" "$np"' \;
    
    Битые имена файлов уходят, остаётся вопрос - неужели в зипе правда такая
    странная кодировка? Что-то сомнительно.
    
    Ищем дальше и натыкаемся на разгадку. http://www.linuxfromscratch.org/blfs/view/cvs/general/unzip.html
    
    "The UnZip package assumes that filenames stored in the ZIP archives
    created on non-Unix systems are encoded in CP850, and that they should be
    converted to ISO-8859-1 when writing files onto the filesystem. Such
    assumptions are not always valid. In fact, inside the ZIP archive, filenames
    are encoded in the DOS codepage that is in use in the relevant country, and the
    filenames on disk should be in the locale encoding. In MS Windows, the
    OemToChar() C function (from User32.DLL) does the correct conversion (which is
    indeed the conversion from CP850 to a superset of ISO-8859-1 if MS Windows is
    set up to use the US English language), but there is no equivalent in Linux.
    
    When using unzip to unpack a ZIP archive containing non-ASCII filenames, the
    filenames are damaged because unzip uses improper conversion when any of its
    encoding assumptions are incorrect. For example, in the ru_RU.KOI8-R locale,
    conversion of filenames from CP866 to KOI8-R is required, but conversion from
    CP850 to ISO-8859-1 is done, which produces filenames consisting of
    undecipherable characters instead of words (the closest equivalent
    understandable example for English-only users is rot13)."
    
    Другими словами, имена файлов в ZIP-архиве хранятся в кодировке DOS,
    соответствующей языку локали. В Windows эта кодировка может быть получена
    соответствующей функцией, а для прочих систем авторы Info-ZIP решили не
    возиться и схалтурили - сделали безальтернативное преобразование cp850=>cp1252.
    Вот, где зарыта собака! Нет никакой "уникальной кодировки ZIP", там обычная 866
    (для русской локали). Во всём прочем виноват не устаревший формат, а версия
    unzip от Info-ZIP для *nix, которая неправильно работает со всеми локалями,
    отличными от западноевропейских. Что делать?
    
    Патчить. Можно, конечно, обойтись разовым переименованием, но только в разовых
    случаях. Если такие архивы встречаются часто, или их надо создавать, выбора не
    остаётся, нужен нормальный инструмент, а не костыли. В сети есть разные патчи
    для zip и unzip от разных авторов и для различных версий, однако многие из них
    устарели, а некоторые небеспроблемны. Я остановился на патчах от АльтЛинукса.
    
    Проблему определения кодировки DOS они решили путём использования своей библиотеки 
    libnatspec, которую перед этим придётся установить, брать можно тут: http://sourceforge.net/projects/natspec/
    После её установки актуальные кодировки локали можно проверить командой
    
       natspec -i
    
    Патч для unzip-6.0 подошел почти гладко, осталось исправить только две мелких
    детали. Патчи для zip оказались для предыдущей версии, поэтому пришлось
    повозиться немного больше, однако оно того стоило - теперь я могу спокойно
    распаковывать созданные в Windows zip-архивы просто командой unzip, и точно так
    же упаковывать командой zip, не опасаясь битой кодировки на том конце.
    
    Итак, качаем исходник последней стабильной версии unzip
    unzip60.tgz и
    исправленную версию патча unzip60-natspec-mod.diff.gz, распаковываем
    исходник, переходим в его директорию, патчим, собираем и устанавливаем:
    
       zcat ../unzip60-natspec-mod.diff.gz | patch -p1
       make -f unix/Makefile generic_gcc
    
    и от рута
    
       make -f unix/Makefile install
    
    После этого unzip должен правильно распаковывать zip-архивы с русскими именами
    файлов, и правильно же выводить их в консоли.
    
    Теперь то же самое с zip - берём последнюю версию
    zip30.tgz, и к нему мой патч
    natspec-asdos-mod.diff.gz.
    Распаковываем исходник, и в его директории:
    
       zcat ../zip30-natspec-asdos-mod.diff.gz | patch -p1
       make -f unix/Makefile generic_gcc
    
    и от рута
    
       make -f unix/Makefile install
    
    Теперь мы можем упаковывать zip-архивы в виде, полностью совместимом с
    проводником Windows и даже с TotalCommander. С последним оказалось, как ни
    странно, даже больше проблем - он требовал архив не просто в кодировке DOS, а
    непременно с именами в формате DOS, часть патча "asdos" именно для этого. Что
    особенно забавно, в TotalCommander использован код всё того же проекта Info-ZIP.
    
    Возможно, некоторые спросят - зачем столько возни с этим морально устаревшим
    зипом, когда полно приличных архиваторов на любой вкус? Ответ - для
    совместимости, больше ни для чего ZIP и не нужен. А раз так, то пускай он
    делает своё дело как надо, а не как всегда :)
    
     
    ----* Включение поддержки терминала cons25r в ALTLinux   Автор: kde  [комментарии]
     
    Иногда возникает необходимость используя консоль FreeBSD зайти на сервер с
    ALTLinux. Для Linux TERM=cons25 возможность не штатная, соответственно
    возникает масса проблем.
    Решается эта проблема установкой пакета terminfo-extra:
    
       sudo apt-get install terminfo-extra
    
    после этого ALTLinux нормально воспринимает cons25.
    
     
    ----* Русификация языка построения экспертных систем CLIPS   Автор: NuINu  [комментарии]
     
    Прочитал в википедии, что распространению CLIPS в России мешает то, что он не
    поддерживает русский язык. Итак спешу опровергнуть это утверждение, по крайней
    мере для систем UNIX/LINUX
    
    Для русификации CLIPS при генерации из исходных текстов для платформ UNIX/LINUX
    достаточно в коде функции main файла main.c внести изменения:
    
       setlocale(LC_ALL, "ru_RU.KOI8-R");
       setlocale(LC_NUMERIC, "C");
    
    и CLIPS будет понимать русскую кодировку koi8r не только в значениях
    переменных, фактах и комментариях, но и в названиях функций и именах
    переменных. После чего можно писать простые приложения, выполняемые как обычные
    приложения UNIX. Вот простой пример:
    
       #!/u01/bin/clips -f2
       ;;путь где у меня расположен интерпретатор clips
       ;;пример написания и вызова функции на языке CLIPS в обычном процедурном стиле
    
       (deffunction гипотенуза (?a ?b)
           (sqrt (+ (* ?a ?a) (* ?b ?b)))
       )
    
       (defrule main
           =>
           (bind ?результат (гипотенуза 3.0 4.0))
           (printout t "гипотенуза = " ?результат crlf)
       )
    
       (reset)
       (run)
       (exit)
    
     
    ----* Настройка одновременной проверки двух языков в Aspell (доп. ссылка 1) (доп. ссылка 2)   Автор: bosha  [комментарии]
     
    По умолчанию aspell может проверять только один язык, для одновременной
    проверки ошибок в английских и русских словах можно пойти обходным путем и
    создать комбинированный словарь:
    
        su
        cd /usr/lib/aspell*
        grep '^special' en.dat >>ru.dat
        aspell dump master en >w.en
        aspell dump master ru-yo >w.ru
        cat w.ru w.en >w.all
        aspell --lang=ru --encoding=UTF-8 create master ruen.rws < w.all
        rm -f w.ru w.en w.all
        echo "add ruen.rws" > ru.multi
    
    Если в системе используется русский словарь без поддержки буквы "Ё", вместо
    "ru-yo" следует использовать имя "ru".
    
    После выполнения данных операций, в стандартный русский словарь будет добавлена
    поддержка английского языка.
    
     
    ----* Настройка синтеза речи в Ubuntu (доп. ссылка 1)   [комментарии]
     
    Простой рецепт по установке и использованию синтезатора речи Festival в Ubuntu:
    
    Устанавливаем festival и сопутствующие утилиты:
    
       sudo apt-get install festival speech-tools
    
    Cтавим пакет с голосом, которые занимает 186 Мб. 
    В репозитории universe Ubuntu 9.10 уже есть готовый пакет festvox-ru:
    
       sudo apt-get install festvox-ru
    
    Если используется Ubuntu 9.04 в /etc/apt/sources.list добавляем:
       deb http://ppa.launchpad.net/sergey-udaltsov/ppa/ubuntu jaunty main 
       deb-src http://ppa.launchpad.net/sergey-udaltsov/ppa/ubuntu jaunty main 
    
    Ставим:
    
       sudo apt-get install festvox-ru
    
    В остальных дистрибутива можно установить/распаковать deb-пакет с голосом из Ubuntu 9.10:
    
       sudo wget http://ubuntu.mirrors.tds.net/ubuntu/pool/universe/f/festvox-ru/festvox-ru_0.5-1_all.deb
       sudo dpkg --install festvox-ru_0.5-1_all.deb
    
    Проверяем (русский текст воспринимается только в кодировке UTF-8):
    
       festival
    
       >(SayText "Hello!")
    
    Активируем русский голос
    
       >(voice_msu_ru_nsh_clunits)
    
    Произносим русский текст:
    
       >(SayText "Привет!")
       >(exit)
    
    Читаем содержимое файла:
    
       festival -b '(begin (voice_msu_ru_nsh_clunits) (tts_file "./file.txt"))'
    
    Сохранить результат в файл:
    
       text2wave -eval '(voice_msu_ru_nsh_clunits)' ./file.txt -o ./file.wav
    
    Чтобы заработало:
    
       cat file.txt | festival --tts --language russian
    или
       festival --tts --language russian file.txt
    
    Нужно в файл /usr/share/festival/languages.scm перед строкой "(define
    (select_language language)" добавить (по аналогии с другими языками):
    
       (define (language_russian)
       "(language_russian)
       Set up language parameters for Russian"
          (set! male1 voice_msu_ru_nsh_clunits)
          (male1)
          (Parameter.set `Language `russian)
       )
    
    В блок "(define (select_language language)" добавляем:
    
       ((equal? language `russian)
       (language_russian))
    
     
    ----* Монтирование VFAT в Linux как в Windows   Автор: Bill Routers  [комментарии]
     
    Возможно, повторюсь, но, на мой взгляд, кому-нибудь будет полезно.
    
    Локаль - ru_RU.UTF-8
    Проверено Ubuntu 8.04, Debian 5.0.3.
    
    Путем "долгих исследований" получил следующие опции монтирование раздела FAT.
    
       /dev/sdf1  /media/usb  vfat rw,async,flush,users,noatime,noauto,utf8,codepage=866,check=r,\
       quiet,showexec,shortname=winnt 0	0
    
    Главное это опции: utf8,codepage=866,check=r.
    По умолчанию они не задействованы.
    Без них "vfat" ведет себя не так как Windows XP Rus,
    позволяя создавать файлы по русски в разном регистре.
    Саша <> САша <> саша <> СашА.
    Конечно, можно создавать файлы "only English",
    но не всегда это удобно и возможно, особенно при копировании.
    
     
    ----* Сглаживание шрифтов с хинтингом на системном уровне в Ubuntu (доп. ссылка 1)   Автор: Sb0y  [комментарии]
     
    В Linux сейчас много способов добиться гладких, не размытых шрифтов, не
    прибегая к запатентованным технологиям.
    
    К счастью, уже не нужно пересобирать freetype. Но мы так же знаем, что
    графических окружений очень много и уже не редки те случаи, когда на одном PC,
    используется несколько сред. При этом, так же, не стоит забывать, что каждая
    среда со шрифтами работает по-разному.
    
    Поэтому, я предлагаю настроить сглаживание шрифтов в Ubuntu на системного уровне. 
    
    В /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>
    
    И перезапускаем все приложения, что работали до изменений.
    В настройках среды можно выставить антиалиасинг по вкусу (обычно включается по умолчанию).
    
    С Tcl\Tk может помочь такая магия:
    
       sudo apt-get install tk8.5 libsnack2 tktray msttcorefonts
       sudo update-alternatives --config wish
    
    В меню нужно выбрать цифру соответствующую пункту "/usr/bin/wish8.5".
    
     
    ----* Решение проблемы со шрифтами в Google Earth на Ubuntu и Debian   Автор: Дмитрий Иванов  [комментарии]
     
    Известно, что Google Earth при работе на Debian и Ubuntu отличается совершенно негодными шрифтами. 
    Дело не только в их виде, но и в том, что русские буквы в ряде случаев не отображаются вовсе.
    Причина этого кроется где-то в библиотеке Qt4, идущей в комплекте с GE.
    Очевидное решение - избавиться от нее,
    и использовать системную библиотеку Qt4. Для этого устанавливаем Qt4 и заменяем шесть файлов GE 
    на соответствующие симлинки:
    
       sudo apt-get install libqt4-webkit qt4-qtconfig
    
       cd .google-earth... # Или куда вы поставили GE
    
       mv libQtCore.so.4 libQtCore.so.4.orig
       mv libQtGui.so.4 libQtGui.so.4.orig
       mv libQtNetwork.so.4 libQtNetwork.so.4.orig
       mv libQtWebKit.so.4 libQtWebKit.so.4.orig
    
       ln -s /usr/lib/libQtCore.so.4 .
       ln -s /usr/lib/libQtGui.so.4 .
       ln -s /usr/lib/libQtNetwork.so.4 .
       ln -s /usr/lib/libQtWebkit.so.4 .
    
       cd plugins/imageformats
    
       mv libqgif.so libqgif.so.orig
       mv libqjpeg.so libqjpeg.so.orig
    
       ln -s /usr/lib/qt4/plugins/imageformats/libqjpeg.so .
       ln -s /usr/lib/qt4/plugins/imageformats/libqgif.so .
    
    С этого момента шрифты отображаются отлично во всех частях Google Earth.
    
    Проверено с последней свежескачанной версией GE на Ubuntu 9.04 и свежем Debian Squeeze.
    
     
    ----* Массовая конвертация имен файлов и каталогов в другую кодировку (доп. ссылка 1)   Автор: Марецкий Александр  [комментарии]
     
    Если имена большой группы файлов и каталогов не в 7-битной ASCII-кодировке (латиница), 
    то при их переносе между операционными системами с разными локальными кодировками могут возникнуть 
    сложности - нечитаемые знаки вместо привычных имен файлов. Одним из возможных
    решений будет использование
    нижеописанного shell-скрипта, которым можно рекурсивно переконвертировать имена сколь 
    угодно большой группы каталогов и файлов из одной кодировки в другую (не боится пробелов в именах):
    
    #!/bin/sh
    # Script for bulk recode files and directories names
    # to another encodings.
    #
    # Usage:
    #    $ brecode.sh <source_dir> <new_dir>
    #
    
    # source encoding. If commented out, then current locale is used
    #RECODE_FROM="UTF8"
    
    # target encoding (mandatory)
    RECODE_TO="CP1251"
    
    #### error function
    err()
    {
        echo >&2
        echo "$(basename ${0}): error: ${1}" >&2
        echo "exit" >&2
        echo >&2
        exit 1
    }
    
    #### check arguments
    if test "x${1}" = "x"
    then err "no arguments specified"
    elif ! test -d "${1}"
    then err "directory '${1}' not found"
    elif test "x${2}" = "x"
    then err "source directory not specified"
    elif test -e "${2}"
    then err "object '${2}' already exists"
    fi
    
    #### check utilities
    for U in find iconv
    do which ${U} >/dev/null || err "${U} utility not found"
    done
    
    #### recode  & copy
    find "${1}" | while read S
    do
        if test ${RECODE_FROM}
        then N="${2}/$(echo ${S} | iconv -f ${RECODE_FROM} -t ${RECODE_TO})"
        else N="${2}/$(echo ${S} | iconv -t ${RECODE_TO})"
        fi
    
        if test -d "${S}"
        then mkdir -p "${N}" || err "mkdir failed"
        else cp "${S}" "${N}" || err "cp failed"
        fi
    done
    
     
    ----* Убираем ограничение на ширину панели закладок в Thunar   Автор: Vee Nee  [комментарии]
     
    С давних лет, при использовании локали ru_RU.UTF-8, в боковой панели закладок
    Thunar минимальная ширина этой панели
    была в два раза больше, чем этого требовалось. Это связано с методом
    определения ее минимальной ширины -
    для ее получения использовалась функция strlen() применительно к строке, возвращаемой gettext(). 
    Так как при использовании кириллицы каждый символ будет кодирован двумя байтами
    получалась двойная ширина панели.
    Здесь я предлагаю простой способ убрать ограничение на минимальную ширину этой панели.
    
    За основу будет взят исходный код Thunar текущей стабильной версии - 1.0.1,
    однако метод решения должен
    подходить и ко всем предыдущим версиям. В файле thunar/thunar-shortcuts-view.c
    найдите следующую строку
    (в версии 1.0.1 это строка 307):
    
       "width-chars", strlen (_("File System")),
    
    Для того чтобы снять ограничение достаточно просто удалить эту строку. Это все. 
    Скомпилируйте Thunar (make clean по необходимости) и задавайте панели закладок
    такую ширину, которая вам необходима!
    
     
    ----* Русификация FreeBSD консоли (KOI8-R и UTF-8) (доп. ссылка 1)   Автор: Litos  [комментарии]
     
    Настройка KOI8-R:
    
    vi /etc/rc.conf
       keymap="ru.koi8-r"
       font8x8="cp866-8x8"
       font8x14="cp866-8x14"
       font8x16="cp866b-8x16"
       scrnmap="koi8-r2cp866"
       cursor="destructive"
    
    Заменить все cons25 на cons25r в /etc/ttys:
    
    vi /etc/ttys
    :%s/cons25/cons25r/g
    
       kill -HUP 1
    
    (чтобы перечитался /etc/ttys)
    
       /etc/rc.d/syscons restart
    
       pw usermod root -L russian
    (выполнить для всех имен пользователей кому нужен русский, если вы ходите 
    на сервер только удаленно по ssh/telnet, то можно выполнить только этот шаг для настройки 
    поддержки русского языка KOI8-R в системе)
    
    
    Настройка UTF-8 (для работы с удаленного терминала):
    
    В /etc/login.conf добавляем:
    
       russian-utf8|Russian Users Accounts:\
            :charset=UTF-8:\
            :lang=ru_RU.UTF-8:\
            :lc_all=ru_RU.UTF-8:\
            :tc=default:
    
    Перестраиваем БД:
    
        cap_mkdb /etc/login.conf
    
    Прикрепляем пользователя:
    
        pw usermod логин -L russian-utf8
    
    Добавляем в /etc/profile
    
       MM_CHARSET=UTF-8; export MM_CHARSET
    
    
    Алексей Гуськов представил (http://kvasdopil.livejournal.com/31964.html) инструкцию 
    по установке UTF-8 в физической консоли, при помощи утилиты jfbterm:
    
    Jfbterm работает через framebuffer, поддерживает VESA-разрешения и 256 цветов, 
    позволяет поставить в фон терминала картинку, работает с мышью и т.д.
    
    В общем, качаем, ставим и компилим. (Если не скомпилялось, ставим последний autoconf и automake)
    
       fetch http://www.ac.auone-net.jp/~baba/jfbterm/jfbterm-FreeBSD-0.5.1.tar.gz
       tar xvzf jfbterm-FreeBSD-0.5.1.tar.gz
       cd jfbterm-FreeBSD-0.5.1
       ./configure CPPFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib --prefix=/usr/local --mandir=/usr/local/man
       /usr/local/bin/gmake
       sudo /usr/local/bin/gmake install
    
    Выставляем параметры терминала
    
       cat /usr/local/share/jfbterm/termcap.jfbterm >> /usr/share/misc/termcap
       cap_mkdb /usr/share/misc/termcap
    
    Создаём конфиг
    
       cp /usr/local/etc/jfbterm.conf.sample /etc/jfbterm.conf
    
    Качаем и ставим уникодный шрифт
    
       fetch http://www.ac.auone-net.jp/~baba/gnu-unifont/unifont.pcf.gz
       mkdir -p /usr/local/lib/X11/fonts/local/
       cp unifont.pcf.gz /usr/local/lib/X11/fonts/local/
    
    Запускам (в терминале)
    
       jfbterm
    
    Если UTF не отображается, то меняем в конфиге /etc/jfbterm.conf строчку
    
       encoding: locale
    
    на
    
       encoding: UTF-8
    
    Прикрутить ввод русских букв можно через uim-m17nlib.
    
     
    ----* Запуск KOI8-R терминала в UTF-8 окружении   Автор: uldus  [комментарии]
     
    В системе с UTF-8 не совсем удобно по ssh ходить по серверам на которых
    установлена локаль ru_RU.KOI8-R.
    gnome-terminal позволяет выбрать кодировку только через меню.
    
    Решить проблему, можно создав ярлык запускающий gnome-terminal, как:
       sh -c "export LANG=ru_RU.KOI8-R; gnome-terminal --disable-factory"
    
    При этом в терминале будет локаль ru_RU.KOI8-R, 
    будет работать копирование русского текста через буфер обмена из UTF-8 системы.
    
    Midnight Commander в пакетах пропатчен на предмет utf-8 и не позволяет работать
    с текстом в других кодировках,
    решить проблему можно пересобрав его из пакета с исходными текстами, отключив
    наложении unicode патча.
    
    PS. В комментарии подсказали, что можно использовать: luit -encoding "KOI8-R" ssh ip
    
     
    ----* Автоматическая смена кодировки в konsole (доп. ссылка 1)   Автор: bappoy  [комментарии]
     
    Скрипт, использующий dcop для упрощения процесса смены кодировки в konsole при подключении к ssh.
    
    Как и всякая программа KDE, konsole использует DCOP для внутрисистемных коммуникаций. 
    Это означает, что запущенной программой можно управлять из командной строки 
    командами типа "dcop konsole-2115 konsole setFullScreen true". 
    Здесь konsole-2115 - название программы + её pid, все остальные 
    аргументы - это, говоря языком ООП, объект, методы и параметры. 
    Список программ, которыми можно рулить подобным образом, и их 
    объектов с методами можно получить, выполняя последовательно 
    команды dcop, dcop konsole-2115, dcop konsole-2115 konsole и т.д.
    
    Konsole при запуске устанавливает две переменные окружения:
    KONSOLE_DCOP, в которой хранится ссылка на текущий экземпляр программы, и 
    KONSOLE_DCOP_SESSION - ссылка на текущий сеанс. 
    Для установки кодировки текущего сеанса нужно использовать такую команду:
    
        dcop $KONSOLE_DCOP_SESSION setEncoding KOI8-R
    
    Собственно, на этом задачу можно считать решённой, осталось правильно оформить ответ :)
    
    В качестве быстрого решения подойдёт прописывание в .bashrc alias'ов для всех интересующих хостов:
    
        alias 01='dcop $KONSOLE_DCOP_SESSION setEncoding KOI8-R;\
            ssh [email protected] $*;dcop $KONSOLE_DCOP_SESSION setEncoding UTF8;'
        alias 02='dcop $KONSOLE_DCOP_SESSION setEncoding KOI8-R;\
            ssh [email protected] $*;dcop $KONSOLE_DCOP_SESSION setEncoding UTF8;'
        alias 03='dcop $KONSOLE_DCOP_SESSION setEncoding KOI8-R;\
           ssh [email protected] $*;dcop $KONSOLE_DCOP_SESSION setEncoding UTF8;'
    
    Более правильное решение - оформить это в виде небольшого скрипта ~/bin/ssh-launcher.sh, 
    который умеет переименовывать сеанс и проверять, выполняется ли команда в konsole, 
    а не, например, в xterme, который dcop не поддерживает. Кроме того,
    скрипт можно расширять, добавляя установку различных параметров konsole в
    зависимости от хоста назначения.
    
    
        #!/bin/bash
        if !([[ "$1" ]] && [[ "$2" ]]) ; then
    
            echo Usage: $0 username hostname \[ ssh parameters \]
            exit 1
    
        fi
    
        ssh_params=( $* )
        ssh_user=${ssh_params[0]}
        ssh_host=${ssh_params[1]}
        unset ssh_params[0]
        unset ssh_params[1]
        ssh_parameters=${ssh_params[*]}
    
        if [[ x"$KONSOLE_DCOP" != "x" ]] ; then # если мы в konsole
    
            dcop $KONSOLE_DCOP_SESSION setEncoding KOI8-R
            dcop $KONSOLE_DCOP_SESSION renameSession $ssh_user@$ssh_host
            ssh $ssh_user@$ssh_host $ssh_parameters
            dcop $KONSOLE_DCOP_SESSION renameSession `whoami`@`hostname`
            dcop $KONSOLE_DCOP_SESSION setEncoding UTF8
    
        else
    
            kdialog -text "run this from konsole"
    
        fi
    
    Теперь в ~/.bashrc можно прописать alias'ы длы вызова этого скрипта:
    
    
        alias 01='ssh-launcher [email protected] $*'
        alias 02='ssh-launcher [email protected] $*'
        alias 03='ssh-launcher [email protected] $*'
        ...
        alias bpp='ssh-launcher [email protected] $*'
    
    P.S. Обратите внимание на $* в конце alias'а - благодаря этой переменной 
    можно очень быстро выполнять команды на указанном сервере:
    
        01 ps -ax\|grep httpd\|wc -l
    
    Ссылки про DCOP:
    
    KDE DIY - Building Your Own Tools
       http://docs.kde.org/userguide/kde-diy.html
    Using DCOP from the command line (Linux Gazette #97)
       http://linuxgazette.mirrors.org.ua/issue97/oregan2.html
    DCOP @Wikipedia
       http://en.wikipedia.org/wiki/Dcop
    
     
    ----* 3 шага для перехода на UTF-8 во FreeBSD (доп. ссылка 1)   Автор: Sokolov Alexey  [комментарии]
     
    1. в ~/.xinitrc пишем (именно сюда а не в /etc/profiles потому как
    системная консоль FreeBSD не поддерживает юникод, посему локаль сия
    будет использоваться только в иксах):
    
      export LANG='ru_RU.UTF-8'
      export LC_ALL='ru_RU.UTF-8'
    
    2. выполняем конвертацию содержимого файловой системы из koi8-r в
    UTF-8 (необходим порт converters/convmv):
    
       %convmv -f koi8-r -t UTF-8 путь_к_разделу/* --notest -r
    
    3. далее все зависит от терминала, если у вас что-то вроде
    gnome-terminal, то достаточно будет сменить кодировку в опциях на
    UTF-8, если же у вас что-то вроде xterm'а, тогда в ~/.Xresources
    необходимо будет поменять шрифт, например так (для этого шрифта
    необходим пакет x11-fonts/terminus-font):
    
       XTerm*font: -*-terminus-medium-*-*-*-*-*-*-*-*-iso10646-1
    
    для syscons(4) на i386:
    
    1. ставим sysutils/jfbterm и textproc/uim-m17nlib
    2. меняем стандартную переключалку языка с Shift+Space на Ctrl+\
       добавлением в ~/.uim
    
    	(define-key generic-on-key? "<Control>\\")
    	(define-key generic-off-key? "<Control>\\")
    
    3. ставим локаль и добавляем запуск uim-fep и jfbterm в ~/.profile
    	export LANG=ru_RU.UTF-8
    	exec jfbterm -e uim-fep
       или в ~/.login (для tcsh)
    	setenv LANG ru_RU.UTF-8
    	exec jfbterm -e uim-fep
    
    Для syscons(4), универсальный способ, неполный юникод:
    
    1. ставим шрифт и раскладку koi8-r в /etc/rc.conf
    
       # шрифт
       font8x8=koi8-r-8x8
       font8x14=koi8-r-8x14
       font8x16=koi8-r-8x16
       # раскладка
       keymap=ru.koi8-r
    
    2. ставим sysutils/screen, рекомендую более новый
       ftp://ftp.lissyara.su/users/Guest/screen.diff
    
    3. ставим локаль и добавляем запуск screen в ~/.profile (для sh)
    
       # экспортируем локаль и тип терминала
       export LANG=ru_RU.UTF-8 TERM=xterm
       # запускаем сессию 'desktop', если уже не запущена
       if ! screen -S desktop -ls | fgrep -q desktop; then
          screen -S desktop -dm
       fi
       # подсоединяемся к сессии 'desktop'
       if vidcontrol -i adapter >&- 2>&-
       then
          # в syscons используем локаль koi8-r
          LC_CTYPE=ru_RU.KOI8-R TERM=cons25r \
          exec screen -x desktop
       else
          # в X'ах используем дефолтную локаль
          exec screen -x desktop
       fi
    
    Примечание:
    
    Символы за пределами koi8-r будут отображаться как ??? (вопросики).
    Если хотите полный (многоязычный) юникод, то используйте способ с jfbterm.
    
     
    ----* Русские символы в rrdtool   Автор: Vladimir  [комментарии]
     
    При отображении строк в RRD используется кодировка UTF-16, в которой есть
    таблица русских символов,
    соответствующая таблице CP1251, только со смещением.
    Чтобы rrdgraph смог отображать русские символы на графиках 
    необходимо внести изменения в файл src/rrd_afm.h. Находим в нем строчку
    
       #define afm_fix_osx_charset(x) (x)
    
    и заменяем на
    
       #define afm_fix_osx_charset(x) \
         ( (x) >= 128 && (x) <= 255 ? (x) + 0x0350 : (x))
    
    Таким образом, если в строке встречается символ с кодом между 127 и 256, то к
    нему применяется смещение 0x0350.
    Строки необходимо записывать в CP1251 (я использую vim с libiconv).
    
    Для работы с KOI8 необходима еще таблица перестановок из KOI8 в CP1251
    
    Для этого в файл src/rrd_afm.c добавляем описание таблицы
    const unsigned char afm_koi2win[128] = {128,129,130,131,132,133,134,135,136,
    137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,
    156,157,158,159,160,161,162,184,164,165,166,167,168,169,170,171,172,173,174,
    175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,254,224,
    225,246,228,229,244,227,245,232,233,234,235,236,237,238,239,255,240,241,242,
    243,230,226,252,251,231,248,253,249,247,250,222,192,193,214,196,197,212,195,
    213,200,201,202,203,204,205,206,207,223,208,209,210,211,198,194,220,219,199,
    216,221,217,215,218};
    
    а в src/rrd_afm.h такие строки
    
       extern const unsigned char afm_koi2win[128];
       #define afm_fix_osx_charset(c) \
         ( (c) >= 128 && (c) <= 255 ? afm_koi2win[(c) - 128] + 0x0350 : (c))
    
     
    ----* KOI8-R локаль в Ubuntu и Kubuntu (доп. ссылка 1)   Автор: mahoro  [комментарии]
     
    Для того, чтобы вернуться к родной для многих KOI8-R локали вместо дефолтной
    UTF8 нужно сделать следующее:
    
    а) Для начала необходимо сгенерировать локаль ru_RU-KOI8-R, делается это командой locale-gen. 
    В качестве парамета ей целесообразно указать язык (ru), иначе она будет генерировать 
    локали всех языков (/usr/share/i18n/locales/*), но только для кодировки UTF-8. 
    Для языка ru будут сгенерированы следующие локали (в ubuntu 9.04 -
    ".../supported.d/local" вместо ".../supported.d/ru" ):
    
       #cat /var/lib/locales/supported.d/ru
       ru_RU.UTF-8 UTF-8
       ru_UA.UTF-8 UTF-8
    
    Следующими командами можно заставить сгенерировать ее локаль для кодировки
    KOI8-R (в ubuntu 9.04 - ".../supported.d/local"):
    
       #sudo echo "ru_RU.KOI8-R KOI8-R" >> /var/lib/locales/supported.d/ru
       #echo "locale-gen local" on ubuntu9.04
       #sudo locale-gen ru
       Generating locales...
       ru_RU.KOI8-R... done
       ru_RU.UTF-8... done
       ru_UA.UTF-8... done
       Generation complete.
    
    
    б) Далее, обновляем переменные окружения:
    
       sudo vim /etc/environment
    
    Пишем: 
    
       LANG="ru_RU.KOI8-R"
       LANGUAGE="ru_RU:ru:en_GB:en"
    
    С русификацией иксов покончено
    
    в) Приступаем к консоли. Пишем:
    
       apt-get install console-cyrillic
    
    В файл .profile добавляем:
    
       loadkeys /usr/share/console-cyrillic/ru-koi8-r.kmap
       consolechars -f /usr/share/console-cyrillic/UniCyr_8x14.psf -m \
          /usr/share/ console-cyrillic/koi8-r.acm.gz
    
    Готово.
    
    У меня заработало все, кроме mcedit, который пришлось пересобрать.
    
     
    ----* Как заставить Opera всегда использовать сглаживание шрифтов   [комментарии]
     
    Для исправления ситуации, когда для некоторых сайтов 
    (например всех англоязычных) Opera отображает шрифты  без сглаживания (anti-aliasing), 
    нужно в секцию "[User Prefs]" файла ~/.opera/opera6.ini поместить строку:
       Enable Core X Fonts=0
    
    Если не помогло, можно попробовать запустить Opera установив переменную окружения "QT_XFT=true".
    
     
    ----* Как пересоздать и русифицировать меню в KDE под Linux.   [комментарии]
     
    В /etc/menu-methods/lang.h или /etc/menu-methods/menu.h
    для lang() и languages() прописать кодировку, например:
       function lang()=ru_RU.KOI8-R""
       function languages()="ru_RU.KOI8-R"  
    
    Из-под root запустить:
       update-menus                                                                
    
     
    ----* Русификация консоли OpenBSD 3.7 (доп. ссылка 1)   Автор: Игорь Грабин  [обсудить]
     
    Подключение русской раскладки:
    
       echo ru > /etc/kbdtype
    
    После чего добавляем в /etc/rc.local такое:
    
       wsfontload /usr/share/misc/pcvtfonts/koi8-r-8x16
       for cons in `jot 6 1 6`; do wsconscfg -dF $cons; wsconscfg -t 80x25bf $cons; done
       unset cons
       wsconsctl -w keyboard.map+="keycode 157=Mode_Lock"
    
    Вместо koi8-r-8x16 можно указать koi8-u-8x16. 
    В качестве переключателя раскладки используется правый CTRL
    
    Замечание: Экран ttyC0 создаётся всегда и не может быть удалён, поэтому не
    может отображать кириллицу.
    
     
    ----* Как включить Windows раскладку клавиатуры в XWindow (точка и запятая, вместо ? и /) ?   [комментарии]
     
    Чтобы при наборе русских символов, при нажатии на клавишу с вопросом, рядом с правым Shift, 
    печатались точка и запятая, вместо вопроса и слэша, в Section "InputDevice"
    файла конфигурации XOrg или XFree86
    
    меняем:
        Option "XkbLayout" "us,ru"
    на
        Option "XkbLayout" "us,ru(winkeys)"
    
    или просто добавляем (запятую не пропустите):
        Option "XkbVariant" ",winkeys"
    
     
    ----* Как добавить Windows TrueType шрифты для xfs в X Window   [комментарии]
     
    - Копируем ttf шрифты ~/.font, переходим в директорию ~/.font
    - Запускаем: ttmkfdir > fonts.scale
    - Запускаем: mkfontdir
    - Запускаем: fc-cache ./
    - Прописываем ~/.font в /etc/X11/fs/config (список "catalogue") или запускаем:
       /usr/sbin/chkfontpath --add ~/.font
    - Запускаем: xset fp rehash
    - Запускаем: service xfs restart
    - Проверяем, новые шрифты должны быть показаны в выводе утилит fc-list,
    xlsfonts, xfontsel, kcharselect, gfontsel и chkfontpath;
    
    В KDE можно использовать: "Control Center/System/Font Installer".
    
    В OpenOffice для добавления шрифтов нужно использовать утилиту spadmin.
    
    Для AbiWord шрифты нужно скопировать в /usr/share/abisuite/AbiSuite/fonts и запустить 
       mkfontdir; ttmkfdir > fonts.scale
    
    При наличии проблем с антиалиасингом, необходимо пересобрать библиотеку FreeType, активировав 
    "#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER" в include/freetype/config/ftoption.h
    
    В AltLinux рекомендуется поставить пакеты  freefont-fonts-ttf, freetype и ms-fonts-ttf.
    
    
    Другой способ добавления шрифтов:
    Копируем шрифты например в директорию, ~/fonts
    В ~/.xinitrc добавляем
       xset fp+ $HOME/fonts/
    
     
    ----* Как выбрать язык при проигрывании VOB файла с DVD диска в mplayer.   [комментарии]
     
    Запускаем mplayer -v file.vob, смотрим какие "audio stream" присутствуют.
    Далее:
        mplayer -aid 129 VTS_01_1.VOB
    
     
    ----* Заставляем XMMS говорить по-русски (SuSE 9.1, UTF-8)   Автор: Kroz  [комментарии]
     
    Я работаю в юникоде. Чтобы xmms мне корректно отображал русские имена файлов я
    его запускаю вот так:
        env LC_MESSAGES=en_US.UTF-8 LANG=ru_RU.UTF-8 xmms
    
    Русские теги xmms отображает криво потому, что они в кодировке cp1251. 
    Чтобы решить этот вопрос я ставлю шрифты для плейлиста и главного окна с кодировкой cp1251. 
    У меня такой шрифт:
        -adobe_windows_1251-helvetica-medium-r-normal-*-*-100-*-*-p-*-microsoft-cp1251
    А взял я эти шрифты адресу http://www.inp.nsk.su/~bolkhov/files/fonts/cyr-rfx/ 
    В принципе, можно взять любые, в которых есть поддержка кодировки cp1251.
    
     
    ----* Файлы с русскими именами в GTK приложениях   [комментарии]
     
    Чтобы GTK приложения могли корректно отображать имена файлов, в которых
    встречаются русские символы
    нужно определить переменную окружения G_BROKEN_FILENAMES=1
    
    для csh, можно поместить её в ~/.cshrc:
         setenv G_BROKEN_FILENAMES 1
    
    для bash, sh:
         export G_BROKEN_FILENAMES=1
    
     
    ----* Как преобразовать в текстовый формат русскоязычный PDF или PostScript файл (доп. ссылка 1)   [комментарии]
     
    Единственное нормальное средство для конвертации в текст из PDF или PS с кириллицей внутри, 
    утилита pdftotex из комплекта xpdf:
       pdftotext -enc KOI8-R test.pdf
       pdftotext -raw -enc KOI8-R test.pdf
    
     
    ----* Подключение TrueType шрифтов к Mozilla (для нормальной печати) (доп. ссылка 1)   [комментарии]
     
    Mozilla должна быть собрана с поддержкой FreeType2 (http://www.freetype.org/),
    проверка:
       ldd /usr/lib/mozilla/mozilla-bin| grep libfreetype
    
    Редактируем файл unix.js:
        $ locate unix.js
        /usr/lib/mozilla/defaults/pref/unix.js
    
    Активируем TrueType шрифты, заменяем
        pref("font.FreeType2.enable", false);
    на
        pref("font.FreeType2.enable", true);
    
    Прописываем версию установленной библиотеки FreeType2:
        pref("font.freetype2.shared-library", "libfreetype.so.6");
    
    Определяем шрифты, добавляем в unix.js:
        pref("font.directory.truetype.1", "/usr/X11R6/lib/X11/fonts/TrueType");
    
    Устанавливаем TrueType шрифты как активные:
        Edit->Preferences...->Appearance->Fonts
    
     
    ----* Русификация SUSE 9.0   Автор: admin  [комментарии]
     
    как обычно /etc/x11/XF86Config, секция Section "InputDevice" добавляем:
      Option       "XkbLayout" "us,ru"
      Option       "XkbModel" "pc104"
      Option       "XkbRules" "xfree86"
      Option       "XkbVariant" ",winkeys"
      Option       "XkbOptions" "grp:ctrl_shift_toggle,grp_led:scroll"
    и переключение раскладки роботает, теперь в /etc/SUSEconfig/profile ремим
    #    LANG="en_US"
    #    export LANG
    и добавляем
        export LANG=ru_RU
        export LC_ALL=ru_RU
    Потом добавляем через controlcenter шрифты от Windows.
    
     
    ----* Русские man в utf-8 локали для ASP Linux (доп. ссылка 1)   Автор: Александр Алябушев  [обсудить]
     
    /etc/man.config
      # NROFF /usr/bin/nroff -c -mandoc
      NROFF ( LANG=ru_RU.KOI8-R ; LESSCHARSET=UTF-8 ; /usr/bin/nroff -c -mandoc )
      #PAGER /usr/bin/less -isr
      PAGER recode KOI8-R..UTF-8 | /usr/bin/less -isr
    
     
    ----* Русификация XMMS (GTK-приложений) под KDE (доп. ссылка 1)   Автор: awk  [комментарии]
     
    Из каталога /usr/X11R6/share/themes/Default/gtk 
    нужно полностью скопировать содержимое файла gtkrc.ru в конец файла .gtkrc-kde. 
    Это позволит "говорить" русскими буквами GTK-приложениям под KDE.
    
     
    ----* Русификация liece под Xemacs   Автор: Mikhail Pachkov  [обсудить]
     
    Столкнулся с проблемой русификации liece(1.4.10) под Xemacs(21.4.12). 
    Кириллица корректно отображалась в VM, Gnus но liece показывал абракадабру.
    Установка process-coding-system-alist network-coding-system-alist на koi8-r не помогла.
    Проблема была решена с помощью:
       (setq liece-mime-charset-for-write 'koi8-r)
       (setq liece-mime-charset-for-read 'koi8-r)
    
     
    ----* Как примонтировать в FreeBSD CD-ROM с русифицированной FS, чтобы русские буквы не выглядели как вопросительные знаки.   Автор: lavr  [комментарии]
     
    cd /usr/ports/sysutils/cd9660_unicode
    make && make install
    грузить модуль через
       kldload /lib/cd9660_unicode/cd9660_[unicode|koi8-r|iso-8859-5|cp866].ko
    
     
    ----* Как перекодировать текст из одной кодировки в другую   [комментарии]
     
    iconv -f WINDOWS-1251 -t KOI8R test.txt > new_test.txt
    iconv --list - список кодировок.
    Например: WINDOWS-1251, UTF-8, UTF-16, UNICODE, KOI8-R, ISO-8859-5, CP866
    
     
    ----* Как русифицировать шелл в FreeBSD ?   Автор: lavr  [обсудить]
     
    Bash: $HOME/.inputrc
          set convert-meta off
          set input-meta on
          set output-meta on
    $HOME/.bash_profile
          export CHARSET=KOI8-R
          export MM_CHARSET=KOI8-R
          export LANG=ru_RU.KOI8-R
    Tcsh[Csh] $HOME/.login
          setenv CHARSET KOI8-R
          setenv MM_CHARSET KOI8-R
          setenv LANG ru_RU.KOI8-R
    
     
    ----* Как посмотреть какие koi8-r шрифты установлены для X Window   [обсудить]
     
    xlsfonts -fn "*-koi8-r"
    
     
    ----* Как примонтировать cdrom с русскими файлами   [комментарии]
     
    В Joliet файлы хранятся в unicode, соответственно codepage=unicode.
    Если файлы записаны в 866 кодировке нужно добавить ",codepage=866"
    mount -t iso9660 -o iocharset=koi8-r,ro,noexec,mode=0444  /dev/cdrom  /mnt/cdrom
    или  в /etc/fstab:
    /dev/cdrom /mnt/cdrom iso9660 noauto,user,ro,noexec,mode=0444,iocharset=koi8-r
    а затем:  mount /mnt/cdrom
    
     
    ----* Проверка правописания в Telegram Desktop для Linux   Автор: Аноним  [комментарии]
     
    Начиная с версии 1.9.3, в Telegram Desktop появилась поддержка проверки
    правописания. Чтобы она работала в Linux, помимо установленных средств проверки
    правописания и словарей, необходимо дополнительно установить пакет enchant
    (обёртка для движков проверки правописания ispell, aspell и myspell).
    
    После этого в настройках приложения появится пункт для включения/отключения
    проверки правописания, а также в контекстном меню поля ввода сообщения будут
    отображаться варианты исправлений для слов с ошибками, а сами слова с ошибками
    будут помечаться.
    
     
    ----* Изменение скорости движения указателя мыши через xinput   [комментарии]
     
    Если при настройке отзывчивости курсора мыши не помогают конфигураторы GNOME и
    других графических окружений, можно настроить поведение мыши из командной строки.
    
    Например, для замедления движения курсора в ~/.xprofile можно указать:
    
       xinput --set-prop "Logitech USB Optical Mouse" "Device Accel Constant Deceleration" 1.5
    
    
    Название мыши определяется в списке устройств ввода, отображаемом при запуске
    утилиты xinput без аргументов (вместо названия можно использовать цифровой идентификатор).
    
    Вместо свойства "Device Accel Constant Deceleration" можно указать его цифровой
    код. Список доступных свойств, их кодов и выставленных по умолчанию значений
    можно посмотреть запустив команду 'xinput list-props "идентификатор мыши"'.
    
     
    ----* Как правильно прописать сменные накопители в /etc/fstab для FreeBSD.   Автор: Insane  [комментарии]
     
    /dev/acd0c /mnt/cdrom cd9660 ro,noauto,-W=koi2dos,
    -L=ru_RU.KOI8-R 0 0
    /dev/fd0 /mnt/flop msdos rw,noauto,-W=koi2dos,
    -L=ru_RU.KOI8-R 0 0
    /dev/ad0s2 /mnt/store msdos rw,-W=koi2dos,
    -L=ru_RU.KOI8-R,noexec,nosuid,nosymfollow,
    -u0,-g0,-m 660  0 0
    Еще для удобства можно создать симлинки типа:
    ln -sf /dev/acd0c /dev/cdrom
    ln -sf /dev/acd1c /dev/cdrom1 (если есть второй cdrom)
    ln -sf /dev/fd0 /dev/flop
    прописать изменения в fstab,
    и монтировать диски командой mount /dev/cdrom а не
    mount /dev/acd0c =).
    
     

       Файлы, копирование, архивация

    ----* Как получать ответы на вопросы по программированию прямо из командной строки или редактора (доп. ссылка 1)   Автор: igor_chubin  [комментарии]
     
    В прошлой заметке было показано как, пользуясь сервисом cheat.sh, можно
    получить краткую справку практически по любой популярной команде UNIX/Linux.
    Сервис использует для этого популярные репозитории шпаргалок (cheat sheets),
    такие как tldr, cheat и прочие.
    
    Возможности сервиса cheat.sh были расширены, и теперь с его помощью можно
    получать не только подсказки по командам UNIX/Linux, но и получать ответы на
    любые вопросы по программированию.
    
    В простейшем случае использование сервиса выглядит следующим образом:
    
        curl cheat.sh/python/append+file
    
    Этот запрос возвращает ответ на вопрос, как дописать файл (append file) в python.
    
    Вместо python в запросе можно указать другой язык программирования (из 55 поддерживаемых
    сервисом в настоящий момент):
    
        curl cheat.sh/js/append+file
        curl cheat.sh/go/append+file
    
    Возвращаемые запросы отформатированы по умолчанию как код на соотвествующем 
    языке программирования: текстовые пояснения оформлены как комментарии языка.
    Их можно убрать полностью (опция Q) или оставить как незакомментированный текст:
    
    (с комментариями)
    
        $ curl cht.sh/lua/merge+tables
        -- Lua - merge tables?
    
        for k,v in pairs(second_table) do first_table[k] = v end
    
        -- [Doug Currie] [so/q/1283388] [cc by-sa 3.0]
    
    (без комментариев)
    
        $ curl cht.sh/lua/merge+tables?Q
        for k,v in pairs(second_table) do first_table[k] = v end
    
    Сервис поддерживает множество других опций, описание которых можно получить по запросу /:help
    
        curl cht.sh/:help
    
    Обратите внимание, что к сервису можно обращаться как по полному имени (cheat.sh),
    так и по краткому имени cht.sh. Для запросов можно использовать оба протокола HTTP и HTTPS.
    
    
    Примеры запросов:
    
        curl cht.sh/go/reverse+a+list
        curl cht.sh/python/random+list+elements
        curl cht.sh/js/parse+json
        curl cht.sh/lua/merge+tables
        curl cht.sh/clojure/variadic+function
    
    Демонстрация: https://www.opennet.me/opennews/pics_base/0_1530858949.gif
    
    
    cht.sh: Клиент для комадной строки
    
    
    Сервис не требует инсталляции никакого дополнительного программного обеспечения
    за исключением curl (или его альтернатив, таких как wget, httpie или fetch),
    однако у него существует одноимённый клиент, cht.sh, который упрощает использование
    сервиса и делает его использование более удобным:
    
        $ cht.sh python append file
    
    Клиент поддерживаем режим оболочки (шелла), в котором можно задавать вопросы напрямую,
    не вводя каждый раз при этом название языка и не вызывая клиент:
    
        $ cht.sh --shell python
        python> append file
        ...
        python> generate random string
        ...
        python> parse json
        ...
    
    В зкспериментальном режиме сервис поддерживает запросы и на других языках кроме английского:
    
        python> дописать файл
        python> скопировать файл
        python> переименовать файл
        python> рекурсивный обход каталога
        python> cd /lua
        lua> использовать внешнюю функцию
        lua> отсортировать таблицу
        js> cd /js
        js> асинхронное чтение файла
    
    Все запросы, приведённые выше, произвольны (и все возвращают корректные ответы).
    
    Сервис работает следующим образом: после получения запроса он пытается обработать его пользуясь
    данными из доступных репозиториев шпаргалок, таких как tldr, cheat, learnxiny и
    так далее (а точнее,
    их локальных копий, проиндексированных и находящихся в памяти, благодаря чему, в том числе,
    достигается такая высокая скорость реакции). В простейших случаях, когда запросы односложны,
    и являются, например, названием команд UNIX/Linux, этого оказывается достаточно.
    
    Если же запрос обработать таким образом не удаётся, осуществляется поиск на внешних ресурсах
    (в первую очередь stackoverflow.com и других сайтах stackexchange), и если подходящий ответ
    найти удалось, он обрабатывается и возвращается пользователю. Код ответа форматируется,
    как уже было сказано выше, таким образом, что текст в нём оформляется как комментарии,
    код остаётся кодом, а внизу добавляется источник ответа, имя его автора и лицензия, по которой
    он распространяется.
    
    Если найденный для ответа вопрос не подходит, следующий можно посмотреть,
    добавив /номер после него:
    
        python> generate random string
        python> generate random string /1
        python> generate random string /2
    
    
    Клиент cht.sh имеет предоставляет ряд других приятных возможностей, таких как:
    
    * автопродолжение;
    * история поиска;
    * копирование в буфер обмена (C);
    
    и ряда других (для просмотра нужно вызвать help в cht.sh).
    
    Кроме этого к cheat.sh можно обращаться напрямую из текстового редактора.
    
    Демонстрация: https://www.opennet.me/opennews/pics_base/0_1530859122.gif
    
    
    Доступ из редактора
    
    Запросы к cheat.sh, а значит к StackOverflow и к прочим источникам информации,
    использующимся в cheat.sh,
    можно отправлять напрямую из текстового редактора Vim или Emacs.
    
    Для этого нужно установить дополнительные плагины (подробнее в cht.sh/:vim и в cht.sh/:emacs).
    
    После этого запросы можно писать напрямую в коде программы
    и получать ответы на них в самом редакторе (в текущем или в отдельном буфере)
    или в пейджере.
    
    Предположим, что вы пишете программу на python и вы забыли, как лучше всего можно сгенерировать
    случайную строку в нём.
    
    Традиционным решением было бы:
    
    * открыть браузер,
    * в нём - google,
    * ввести "generate random string",
    * получить ссылку на stackoverflow,
    * перейти по ней,
    * скопировать найденный ответ в буфер обмена,
    * вставить его в редактор,
    * подправить его под конкретную программу.
    
    Вместо этого, используя плагин cheat.sh-vim:
    
    * ввести запрос прямо в буфере редактора;
    * нажать <leader>KP (или <leader>KB, или <leader>KK).
    
    Ответ будет вставлен в код, показан в отдельном буфере редактора (<leader>KB)
    или во внешнем пейджере (<leader>KK).
    
    Демонстрация возможностей плагина: https://www.opennet.me/opennews/pics_base/0_1530859160.gif
    
    Альтернативные решения
    
    Существуют альтернативные решения, которые позволяют достичь похожих результатов:
    
    * tldr  - подсказки по командам UNIX/Linux;
    * cheat - подсказкт по командам UNIX/Linux;
    * how2  - поиск ответов на stackoverflow из командной строки;
    * howdoi - поиск ответов на stackexchange из командной строки.
    
    Все вышеназванные утилиты хорошо справляются с названными задачами.
    При этом cheat.sh обладает рядом преимуществом в сравнении с каждой из них:
    
    * Не требует инсталляции, может использоваться везде, где есть curl/wget/httpie
    или любой HTTP-клиент;
    * Предоставляет доступ как к шпаргалкам, так и к ответам на вопросы;
    * Намного быстрее чем how2 и howdoi;
    * Комментирует пояснительный текст в ответах;
    * Может использоваться для автоматических запросов;
    * Не требует актуализации репозиториев шпаргалок (как в случае с tldr и cheat);
    * Поддерживает запросы на разных языках, в том числе на русском;
    * Интеграция с текстовыми редакторами Vim и Emacs;
    * Поддерживает Tab-completion (для bash, zsh и fish).
    
    Недостатки (на данный момент):
    
    * Не может работать в оффлайн-режиме (tldr и cheat могут; howdoi и how2 тоже нет).
    
    
    
    
    Ссылки
    
    * https://github.com/chubin/cheat.sh            - главный репозиторий проекта
    * https://github.com/dbeniamine/cheat.sh-vim    - плагин для Vim
    * https://github.com/davep/cheat-sh.el          - плагин для Emacs
    
    * https://twitter.com/igor_chubin               - твиттер главного
    разработчика проекта (используется для анонса существенных обновлений проектов
    и новых проектов)
    
    Другие подобные проекты (подмножество функций cheat.sh):
    
    * https://github.com/tldr-pages/tldr            - подсказки для командной строки
    * https://github.com/chrisallenlane/cheat       - подсказки для командной строки
    * https://github.com/adambard/learnxinyminutes-docs - краткие учебники по
    языкам программирования
    * https://github.com/gleitz/howdoi              - поиск ответов на
    вопросы по языкам программирования из командной строки
    * https://github.com/santinic/how2              - поиск ответов на
    вопросы по языкам программирования из командной строки
    
    Сервисы для терминала:
    
    * curl wttr.in  - погода из терминала
    * curl rate.sx ; curl rate.sx/btc - курс валют и криптовалют из терминала
    * curl qrenco.de - сервис для генерация QR-кода в терминале
    * ix.io, sprunge.us, ptpb.pw, 0x0.st, clbin.com - Pastebin для терминала
    * curl ifcfg.me, curl ip-addr.es и множество других - определение
    внешнего IP-адреса в терминале
    * https://github.com/chubin/awesome-console-services/ - полный список сервисов для терминала
    
     
    ----* Обходной способ запуска программ, скрытых в блочном устройстве   Автор: 赤熊  [комментарии]
     
    Предположим у нас нет программы super_mega_ls, а на компьютере нет доступа на
    установку ПО и запись файлов, но программой воспользоваться нужно. Wget не
    работает, curl огорожен, Flash-накопители монтировать прав нет.
    
    Допустим, у нас есть неформатированная флешка. На своём компьютере запишем
    нужную программу в "raw-режиме", не создавая файловую систему и разделы:
    
       dd if=/bin/ls of=/dev/sdb
    
    Приходим на целевую машину, на которой нужно запустить программу. Помним про
    версию ведра/ядра/libc/статическую сборку.
    Вставляем флешку. И далее в зависимости от версии системы творим зло. В Debian
    Jessie это будет выглядеть так:
    
       /lib64/ld-2.13.so /dev/sdb
    
    Далее происходит магия (см. исходники exec). Много думаем...
    
     
    ----* Использование zsync для минимизации трафика при синхронизации больших файлов, например, ежедневных сборок Ubuntu (доп. ссылка 1)   [комментарии]
     
    Для пользователей, желающих минимизировать сетевой трафик и ускорить загрузку
    ежедневных тестовых снапшотов Ubuntu, предоставлена возможность загрузки только
    изменившихся с момента прошлой загрузки частей iso-образа. Для загрузки только
    изменений вместо полной копии следует использовать утилиту zsync.
    
    По сути zsync является вариантом rsync, нацеленным на эффективную синхронизацию
    единичных больших файлов и реализующим логику синхронизации на стороне клиента.
    Для работы zsync не требуется установка особого сервернего ПО, достаточно
    создать небольшой индексный файл в котором будут сохранены контрольные суммы
    блоков данных и использовать обычный http-сервер, допускающий загрузку
    отдельных частей файла.
    
    Устанавливаем zsync:
    
       sudo apt-get -y install zsync
    
    Загружаем iso-образ:
    
       zsync http://cdimage.ubuntu.com/daily-live/current/raring-desktop-amd64.iso.zsync
    
    Если загрузка осуществляется первый раз, то zsync автоматически загрузит весь
    файл. Если файл загружается повторно, zsync загрузит индекс (для iso-образа
    ubuntu примерно полтора мегабайта), оценит изменений между локальным и
    удалённым файлом и загрузит только изменившиеся блоки данных.
    
    Для создания zsync-индекса, при желании организовать распространение своих
    файлов через zsync, следует использовать утилиту zsyncmake:
    
       zsyncmake file.iso
    
    после чего будет создан файл file.iso.zsync.
    
    Для корректной отдачи .zsync-индексов в конфигурацию Apache в файл mime.types следует добавить:
    
       application/x-zsync             zsync
    
     
    ----* Монтирование устройств Android 4 в Ubuntu Linux при помощи go-mtpfs (доп. ссылка 1) (доп. ссылка 2) (доп. ссылка 3)   [комментарии]
     
    Начиная с третьей ветки в платформе Android изменился метод организации
    внешнего доступа к накопителю мобильного устройства. Если раньше устройство
    маскировалось под USB-накопитель, который воспринимался внешними системами как
    обычный USB Flash, то начиная с выпуска Android 3 для доступа к данным
    предлагается использовать разработанный компанией Microsoft протокол MTP
    (Media Transfer Protocol), поддержка которого в большинстве Linux-дистрибутивов
    недоступна из коробки. Причиной перехода на MTP является желание избавиться от
    основного недостатка старой реализации - необходимости размонтирования раздела
    перед его экспортом, из-за чего во время подключения раздела к ПК он становился
    недоступным для мобильного устройства.
    
    Наиболее простым способом обеспечения работы с Android 4 в Linux является
    установка из репозиториев или сборка из исходных текстов GTK-приложения gMTP
    (http://gmtp.sourceforge.net/), которое предоставляет графический интерфейс для
    работы с файлами на устройстве, в том числе даёт возможность перемещать файлы
    между gMTP и файловым менеджером в режиме Drag and Drop. При сборке
    рекомендуется использовать самую свежую версию библиотеки  libmtp
    (http://libmtp.sourceforge.net/), иначе в процессе работы время от времени
    приходится сталкиваться с проблемами. Готовые свежие сборки gMTP для Ubuntu
    можно загрузить из специального PPA-репозитория, а libmtp - здесь.
    
    
    Другим способом является монтирование MTP-устройств в виде дисковых разделов
    при помощи FUSE-модулей mtpfs или mtp-fuse. Следует отметить, что
    работают данные модули с некоторыми устройствами весьма нестабильно и оставляют
    желать лучшего в плане скорости копирования данных. Относительно недавно для
    решения проблем с ранее доступными FUSE-реализациями был создан FUSE-модуль [[https://github.com/hanwen/go-mtpfs
    Go-mtpfs]], из особенностей которого можно отметить необходимость установки для
    сборки компилятора языка программирования Go.
    
    
    Готовые сборки Go-mtpfs отныне доступны через PPA для Ubuntu 13.04, 12.10 и
    12.04. Unstable PPA используется для задействования самой свежей версии
    libmtp. Кроме того, подготовлен специальный апплет для оболочки Unity,
    позволяющий быстро монтировать и отмонтировать MTP-разделы.
    
    Установим Go-mtpfs из PPA:
    
       sudo add-apt-repository ppa:webupd8team/unstable
       sudo apt-get update
       sudo apt-get install go-mtpfs
    
    Установим дополнение для Unity:
    
       sudo apt-get install go-mtpfs-unity
    
    Для монитрования раздела вручную следует использовать команду:
    
       go-mtpfs /media/MyAndroid
    
    Для отмонтирования:
    
       fusermount -u /media/MyAndroid
    
    
    Для самостоятельной сборки go-mtpfs из Git-репозитория можно использовать
    следующую инструкцию, в результате которой будет подготовлен исполняемый файл /tmp/go/bin/go-mtpfs:
    
       sudo apt-get install golang fuse git-core libmtp-dev libfuse-dev
       sudo adduser $USER fuse
       mkdir /tmp/go 
       GOPATH=/tmp/go go get github.com/hanwen/go-mtpfs
      
    
    Кроме того, в состав libmtp входит несколько полезных утилит:
    
    Определение устройства:
    
       mtp-detect
    
    Подсоединение к устройству:
    
       mtp-connect
    
    Манипуляции с контентом на устройстве:
    
       mtp-albumart 
       mtp-getplaylist
       mtp-albums
       mtp-files
       mtp-sendfile
       mtp-folders  
       mtp-newfolder
       mtp-delfile
       mtp-newplaylist
       mtp-getfile
       mtp-playlists    
       mtp-tracks
    
    
       
    
     
    ----* Организация файлового хранилища на базе Git-репозитория при помощи Sparkleshare (доп. ссылка 1)   [комментарии]
     
    В рамках проекта Sparkleshare развивается свободный движок для организации
    похожих на Dropbox online-хранилищ, непосредственное хранение данных в которых
    осуществляется в любом Git-репозитории. Использование Git позволяет
    задействовать элементы версионного контроля для отслеживания изменений в
    файлах, давая возможность отследить все изменения и при необходимости вернуться
    к состоянию определенного файла в прошлом.
    
    С технической стороны SparkleShare является Git-клиентом, оптимизированным для
    хранения и обмена файлами. Программа может использоваться не только для
    хранения своих файлов, но и для организации обмена файлами с другими людьми или
    для обеспечения синхронизации данных между домашним и рабочим ПК. SparkleShare
    поддерживает шифрование хранимых данных, что позволяет использовать публичные
    Git-репозитории не опасаясь возможной утечки информации. Например, можно
    использовать Git-репозитории в публичных сервисах Gitorious и GitHub.
    
    Рассмотрим процесс развертывания Sparkleshare-хранилища под управлением Fedora
    Linux с целью организации доступного дома и на работе хранилища. Для
    организации рабочего процесса создадим в домашней директории каталог
    Sparkleshare, в котором будем создавать подкаталоги, соответствующие текущим
    проектам. В качестве первичного хранилища будет использовать Git-репозиторий на
    собственном сервере, доступ к которому организован через SSH. Одновременно
    настроим на сервере доступность сохраняемых файлов через web, разместив клон
    репозитория в директории ~/public_html.
    
    
    Установка Sparkleshare на локальной клиентской машине.
    
    Добавляем соответствующий YUM-репозиторий, в котором содержатся готовые пакеты с Sparkleshare:
    
        cd /etc/yum.repos.d
        sudo curl -O http://repos.fedorapeople.org/repos/alexh/sparkleshare/fedora-sparkleshare.repo
    
    Устанавливаем Sparkleshare 
    
        sudo yum install -y sparkleshare ssh-askpass
    
    Удаляем пакет nautilus-python, так как иначе при работе Sparkleshare наблюдается крах Nautilus.
    
        sudo yum remove -y nautilus-python
    
    PS. Пользователи Ubuntu могут загрузить  Sparkleshare из PPA-репозитория:
    
       sudo add-apt-repository ppa:pdffs/sparkleshare
       sudo apt-get update
       sudp apt-get install sparkleshare
    
    Настройка Git-репозитория
    
    Создаем Git-репозиторий на внешнем сервере, который будет использован в
    качестве первичного хранилища:
    
       git init --bare repo.git
    
    Для работы на сервере должны быть установлены пакеты с git и openssh-server.
    
    Проводим первичное клонирование репозитория в директорию ~/public_html, чтобы
    файлы были доступны через web:
    
       cd ~/public_html
       git clone repo.git
       cd repo
    
    Создаем тестовый файл:
    
       echo 'Fedora 15 rocks!' >> test.txt
    
    Добавляем файл в Git и принимаем изменения.
    
       git add test.txt
       git commit test.txt -m 'initial commit2'
    
    Создаем начальную ветку:
     
       git push origin master
    
    
    
    Подключаем свои локальные машины к репозиторию
    
    На локальной рабочей машине останавливаем рабочий процесс Sparkleshare и
    клонируем созданный на прошлом шаге репозиторий
    
       sparkleshare stop
    
       cd ~/SparkleShare
       git clone логин@хост:/home/логин/repo.git
    
    Проверяем содержимое:
    
       cd ~/SparkleShare/repo
       ls
    
    Меняем содержимое тестового файла
    
       echo 'Pandas rule.' >> test.txt; 
    
    Применяем изменения:
    
       git commit -a -m 'panda PSA'
       git push
    
    
    На удаленном сервере, где создан базовый Git-репозиторий принимаем изменения:
    
       cd ~/public_html/repo
       git pull
    
    Проверяем, изменилось ли содержимое test.txt:
    
       cat test.txt
    
    Если все работает нормально, то запускаем на локальной машине Sparkleshare
    которые возьмет в свои руки выполнение рутинных операций по отслеживанию
    изменений и синхронизации данных на внешний сервер.
    
       sparkleshare start
    
    Настраиваем автозапуск Sparkleshare в GNOME:
    
       cp /usr/share/applications/sparkleshare.desktop ~/.config/autostart
    
    Заходим в директорию с репозиторием SparkleShare
    
       cd ~/SparkleShare/repo
    
    и создаем там новый тестовый файл:
    
       echo '42' >> theanswer.txt
    
    На удаленном сервере клонируем репозиторий и убеждаемся, что новый файл
    автоматически был помещен в Git:
    
        cd ~/public_html/repo
        git pull
        ls
    
    Все работает.
    
    
    Создаем автоматически обновляемое зеркало для просмотра репозитория из web.
    
    Настроим автоматическое клонирование репозитория удаленном сервере, с которого
    будет осуществлена раздача файлов через Web. Для работы нам понадобиться
    настроить удаленный вход со второй машины на первую по SSH по ключам, без ввода
    пароля. Инструкцию по настройке можно найти здесь.
    
    На удаленном сервере переходим в базовую директорию с Git-репозиторием (не клоном)
    
        cd ~/git.repo/hooks
    
    Добавляем скрипт, который будет срабатывать при добавлении файлов в
    репозиторий. В этом скрипте автоматически будет выполнять локальное
    клонирование репозитория для его видимости в web.
    
    Создадим скрипт post-receive в директории ~/git.repo/hooks (не забудьте
    подставить реальное значение вместо "логин"):
    
       #!/bin/sh
    
       while read oldrev newrev refname
       do
          true
       done
       cd /home/user/public_html/repo
       GIT_DIR=/home/логин/public_html/repo/.git git pull
    
    Проверим, создав на локальной системе третий тестовый файл:
    
       cd ~/SparkleShare/repo
       echo 'Fedora 15' >> latestfedora.txt
    
    
    Переходим на удаленном сервере в директорию с клоном репозитория для web и
    проверяем появился ли новый файл:
    
       cd ~/public_html/repo
       ls
    
    Подсказки по настройке работы Sparkleshare c Github и Gitorious можно найти на
    странице http://sparkleshare.org/help/
    
     
    ----* Преобразование CHM в PDF (доп. ссылка 1)   Автор: pavlinux  [комментарии]
     
    Для преобразования формата CHM в PDF существует утилита chm2pdf, написанная на языке Python.
    Если Python нет, можно пойти в обход:
    
    1. Нам нужна библиотека chmlib, в популярных дистрибутивах она есть.
    
    2. Так же, нужна утилита extract_chmLib, находиться в пакете, где-то в
    chmlib-examples, где-то в chmlib-bin.
    
    3. Утилита htmldoc,так же везде есть.
    
    4. И объект испытаний, например RHCE.chm
    
    Кстати, для chm2pdf так же нужна chmlib, Python и дополнительная библиотека на питоне.
    
    И так, делаем два каталога:
    
       mkdir /tmp/CHM/PDF /tmp/CHM/HTML;
    
    и переходим в первый
    
       сd /tmp/CHM
    
    Извлекаем html страницы в каталог HTML
    
       extract_chmLib RHCE.chm ./HTML
    
    В каталоге HTML обнаруживаем следующие файлы:
    
       18196.hhc
       $FIftiMain
       final
       #IDXHDR
       #ITBITS
       $OBJINST
       #STRINGS
       #SYSTEM
       #TOPICS
       #URLSTR
       #URLTBL
       #WINDOWS
       $WWAssociativeLinks
       $WWKeywordLinks
    
    Кто что значит, рассказывать не буду, смотрите Википедию и MSDN.
    Нас интересует каталог ./final/, именно в нем находятся все страницы с текстом
    и картинки, если они были в книге.
    
    Этот каталог и станет исходным для формирования PDF, который мы передадим в
    качестве параметра в утилиту htmldoc.
    Авторы рекомендуют делать два прохода при конвертации.
    
    Первый - индексация, сортировка, удаление лишних элементов и объединение в один каталог.
    
       htmldoc -d PDF/ HTML/final/*.html
    
    И второй - сама конвертация, но уже из каталога PDF:
    
       htmldoc --compression=9 --book --size a4 --jpeg=100 -t pdf14 -f RHCE.pdf PDF/*.html
    
    html --help для краткой справки
    man htmldoc - для более подробного описания параметров.
    
    В итоге получился правильный формат книги и на 2 мегабайта меньше размер.
    
     
    ----* Использование unison для двусторонней синхронизации файлов   [комментарии]
     
    Для решения задачи по синхронизации данных между двумя машинами, в ситуации
    когда изменения могут появиться на каждом из компьютеров, прекрасно подходит
    утилита unison (http://www.cis.upenn.edu/~bcpierce/unison/). При синхронизации
    между удаленными машинами в качестве транспорта может использоваться ssh. При
    обнаружении конфликтов, например, когда на обоих машинах отредактирован один и
    тот же файл, unison пытается разрешить конфликт автоматически, а если это не
    удается предоставляет пользователю интерфейс для принятия решения.
    
    Устанавливаем unison.
    
    Fedora/RHEL/CentOS:
    
       sudo yum install unison
    
    Debian/Ubuntu:
       sudo apt-get install unison
    
    FreeBSD:
       # cd /usr/ports/net/unison/ && make install
    
    Синхронизируем две локальные директории:
    
       unison /test1 /test2
    
    В процессе будет выводиться статистика и задаваться вопросы, касающаяся
    синхронизации и разрешения конфликтов, направление копирования будет указано стрелкой.
    
    Для синхронизации с удаленной директорией необходимо указать:
    
       unison /test1 ssh://testserver.test.ru//test1
    
    Чтобы выполнить синхронизацию автоматически, без интерактивного взаимодействия
    с пользователем необходимо использовать опцию "-batch". В случае конфликта,
    выполнение будет прервано с выводом соответствующего уведомления.
    
    Для определения сложной политики синхронизации можно создать файл конфигурации
    с определением параметров.
    
    Например, создаем файл ~/.unison/test.prf:
    
       # Определяем список директорий, которые будут синхронизированы
       root = /home/project
       root = /mnt/NFS/home/project
    
       # Указываем сохранять права доступа и владельца
       owner = true
       times = true
    
       # Определяем список поддиректорий, которые нужно синхронизировать, остальное игнорируем:
       path = cgi-bin
       path = htdocs
       path = conf
    
       # Определяем маски для файлов, которые не нужно синхронизировать
       ignore = Name .htaccess
       ignore = Name *~
       ignore = Name .*~
       ignore = Path conf/project.conf
       ignore = Path htdocs/rrd
       ignore = Path htdocs/mon
       ignore = Name *.o
       ignore = Name *.tmp
       ignore = Name *.log
       ignore = Name *.gz
       ignore = Name *.iso
       ignore = Name {,.}*{.old}
    
       # Копируем в резервные копии изменяемых файлов в отдельную  директорию
       backup = Name *
       backups = true
       backupdir = /home/project/backup
    
       # Определяем свою команду для отображения отличий между копиями файлов при конфликте
       #diff = diff -y -W 79 --suppress-common-lines
    
       # Сохраняем лог с результатами работы в отдельном файле
       log = true
       logfile = ./sync.log
    
    
    При необходимости синхронизировать описанные в файле конфигурации директории, выполняем:
    
       unison test
    
     
    ----* Монтирование Flash-накопителей с FAT в XFCE, работающем во FreeBSD (доп. ссылка 1)   Автор: bu7cher  [комментарии]
     
    Инструкция для тех, кому лень набирать "sudo mount_msdosfs /dev/da0s1 ..." и
    хочется, чтобы при подключении USB Flash на рабочем столе XFCE для монтирования
    автоматически появлялась иконка, корректно работающая с русскими именами файлов
    и не требующая для своей работы повышенных прав доступа.
    
    1. Через PolicyKit настраиваем разрешение на монтирование для пользователя
    homeuser, под котором будет осуществлен вход в систему. В
    /usr/local/etc/PolicyKit/PolicyKit.conf добавляем новую секцию:
    
       <match user="homeuser">
           <match action="org.freedesktop.hal.storage.mount-removable">
               <return result="yes"/>
    
           </match>
           <match action="org.freedesktop.hal.storage.mount-fixed">
               <return result="yes"/>
           </match>
           <match action="org.freedesktop.hal.storage.eject">
               <return result="yes"/>
    
           </match>
           <match action="org.freedesktop.hal.storage.unmount-others">
               <return result="yes"/>
           </match>
       </match>
    
    2. Настраиваем опции монтирования по-умолчанию в файле /usr/local/etc/xdg/xfce4/mount.rc:
    
       [vfat]
       # FreeBSD specific option
       longnames=true
       -L=ru_RU.UTF-8
       -D=CP866
       -m=0664
       -M=0775
       -u=homeuser
    
    Список возможных опций можно посмотреть в выводе lshal после подключения
    флэшки. Искать нужно строку volume.mount.valid_options. В ней содержатся
    разрешённые HAL'ом опции, которые можно передать ему для монтирования. Их же
    можно найти в файле
    /usr/local/share/hal/fdi/policy/10osvendor/20-storage-methods.fdi. По-умолчанию
    для FreeBSD эти опции разрешены и соответствуют перечисленным в мануале mount_msdosfs(8).
    
    В результате при подключении флэшки на рабочем столе появляется иконка диска,
    на которой можно  вызвать команду "Подключить том", либо просто два раза
    кликнуть,  чтобы открыть  Thunar с уже смонтированным носителем. Причём файлы с
    кириллицей в именах будут корректно отображаться,  и пользователь сможет
    записывать и удалять их.
    
     
    ----* Перемещение всех пользовательских файлов конфигурации в отдельную директорию (доп. ссылка 1) (доп. ссылка 2)   Автор: Мищенков Михаил  [комментарии]
     
    Чтобы принудительно переместить все пользовательские файлы конфигурации из
    корня домашней директории в отдельный каталог (допустим ~/.config) можно
    воспользоваться библиотекой libetc (http://ordiluc.net/fs/libetc/). libetc
    подгружается к приложениям через механизм LD_PRELOAD, подменяя собой некоторые
    библиотечные вызовы и самостоятельно обрабатывая ситуацию открытия файлов и
    директорий, начинающихся с точки. Базовый путь берется из переменной окружения
    $XDG_CONFIG_HOME, определенной для этих целей в стандарте http://standards.freedesktop.org/basedir-spec/
    
    Пример использования, в ~/.bashrc, ~/.zshrc или ~/.xsession добавляем:
    
       # загружаем библиотеку
       export LD_PRELOAD=libetc.so.0 
       # список игнорирования
       export LIBETC_BLACKLIST=/bin/ls:/bin/mv:/bin/cp:/bin/ln:/usr/bin/find:/bin/rm 
       # Перемещаем файлы конфигурации в директорию /home/luc/config
       export XDG_CONFIG_HOME=/home/luc/config
    
    Если явно не определена переменная окружения XDG_CONFIG_HOME, в качестве
    базового пути будет использована директория ~/.config/
    
    Работа libetc проверена в таких программах, как OpenOffice.org, KDE, Gnome,
    Firefox, Mutt, vim, Thunderbird, Sylpheed, Gimp.
    
     
    ----* Монтирование ftp и ssh в локальную директорию   [комментарии]
     
    Дл монтирования будем использовать FUSE модули curlftpfs (http://curlftpfs.sourceforge.net/) 
    и sshfs (http://fuse.sourceforge.net/sshfs.html).
    curlftpfs хорош тем, что поддерживает шифрование (SSLv3/TLSv1), может работать поверх HTTP-прокси 
    и автоматически обрабатывает ситуации разрыва соединения. Sshfs интересен
    возможностью кэширования содержимого директорий.
    
    Для работы с FUSE от имени локального пользователя нужно добавить его в группу fuse:
    
       sudo addgroup логин fuse
    
    Настраиваем права доступа к директории в которую будем производить монтирование:
    
       chgrp fuse /home/user/mnt
       chmod g+w /home/user/mnt
    
    Ставим curlftpfs и sshfs:
    
       aptitude install fuse-utils curlftpfs sshfs
    или для RedHat подобных дистрибутивов:
       yum install fuse-utils curlftpfs sshfs
    
    монтирование FTP директории производится командой:
    
       curlftpfs ftp://ftp.test.ru /home/user/mnt
    или если используется пароль:
       curlftpfs ftp://логин:пароль@ftp.test.ru /home/user/mnt
    
    Кодировку можно задать через 
    
       curlftpfs -o codepage=koi8-r,iocharset=utf8 ftp://ftp.test.ru /home/user/mnt
    
    где koi8-r кодировка на ftp-сервере, utf8 - кодировка локальной системы.
    Выход через http-прокси можно организовать через опцию "-o proxy=host:port"
    
    Автоматизировать ввод пароля можно через стандартный ~/.netrc файл (man netrc):
    
        machine ftp.test.ru
        login логин  
        password пароль
    
    
    Для монтирования SSH 
    
       sshfs [email protected]:/home/test /home/user/mnt
    
    Отмонтирование:
    
       fusermount -u /home/user/mnt
    
     
    ----* Выборка и копирование файлов по дате в Linux   Автор: Sclif13  [комментарии]
     
    Столкнулся с такой задачей: из каталога необходимо выбрать и скопировать кучу
    файлов за один месяц.
    Вооружившись командами cp, ls  и awk я приступил и вот что получилось:
    
       cp $(ls -l | grep 2009-01 | awk '{print $8}') /home/temp/
    
    ls -l выводит содержимое каталога с датой
    grep соответственно выбирает файлы за месяц
    awk '{print $8}' выводит имя файла для команды cp
    
    Дальше больше ...
    Есть каталог в котором куча подкаталогов и в которых соответственно файлы,
    которые надо скопировать.
    Тут на помощь приходит утилита du:
    
       cp $(du -a --time | grep 2009-01 | awk '{print $4}') /home/temp/
    
     
    ----* Быстрый обмен файлами в Linux без задействования Samba, ftp и т.п. (доп. ссылка 1) (доп. ссылка 2)   Автор: airat  [комментарии]
     
    Для быстрого обмена файлами между рабочими станциями под Linux удобно использовать десктоп 
    приложение Giver (http://code.google.com/p/giver/), которое не требует каких-либо настроек и 
    автоматически определяет запустившие Giver машины в локальной сети.
    Достаточно выбрать файл/директорию и машину пользователя в списке.
    
    В Ubuntu 8.10 программа присутствует в стандартном репозитории пакетов:
    
       sudo apt-get install giver
    
    Другой вариант настройки быстрой передачи файлов - привязка дополнительных скриптов к Nautilus.
    Например скрипт nautilus-share (http://gentoo.ovibes.net/nautilus-share/) позволяет 
    динамически открывать доступ к определенным каталогам через samba.
    В Ubuntu устанавливается через 
    
       sudo apt-get install nautilus-share
    
     
    ----* Составление списка мертвых символических ссылок (доп. ссылка 1)   Автор: pavlinux  [комментарии]
     
    Находим файлы символических ссылок, которые никуда не указывают.
    
       find / -noleaf -type l -print | perl -nle '-e || print'
    
    Эта команда выведет все мертвые ссылки на стандартные вывод.
    Можно перевести вывод в файл, для изучения и исправления. 
    Или просто удалить, добавив конвейер: "| xargs rm", то есть так:
    
       find / -noleaf -type l -print |perl -nle '-e || print' | xargs rm
    
    PS. В BSD системах нужно отбросить опцию -noleaf, которая реализована только в GNU find.
    
     
    ----* Добавление информации для восстановления к архивам.   Автор: mahoro  [комментарии]
     
    Утилита par2 позволяет добавлять к файлам информацию для восстановления по
    алгоритму Рида-Соломона.
    Это позволяет восстанавливать исходный файл в случае небольших (или даже серьезных) повреждений. 
    Делается это следующим образом:
    
       $ sudo aptitude install par2 #(cd /usr/ports/archivers/parchive; make instal)
       $ ls
         dump.sql.gz
       $ par2 create -v -r10 -n1 -m500 dump.sql.gz
       $ ls
         dump.sql.gz dump.sql.gz.par2 dump.sql.gz.vol000+100.par2
    
    Эта команда добавит 10% (-r10) избыточной информации к данным, запишет все это в один файл (-n1), 
    при этом программе par2 разрешено использовать 500 мегабайт оперативной памяти (-m500). 
    Файлы *.par2 следует записать на диск вместе с дампом.
    
    Восстановить поврежденный файл можно командой
    
       $ par2 repair dump.sql.gz.par2
    
    Подробнее о par2 и чтении данных с битых CD: 
       http://alexey.sveshnikov.ru/blog/2008/04/10/broken-cd-parchive/
    
    Подробнее про о коде Рида-Соломона:
       http://www.insidepro.com/kk/027/027r.shtml
    
     
    ----* Переименований группы файлов с перекодированием имени   [обсудить]
     
    Для переименования группы директорий первого уровня вложенности с
    перекодированием из cp1251 в koi8-r:
    
    find . -type d -maxdepth 1 -exec sh -c 'np=`echo {}|iconv -t koi8-r -f cp1251`; mv "{}" "$np"' \;
    
    Для переименования иерархии файлов:
    
    find . -type f -exec sh -c 'dn=`dirname "{}"`;bn=`basename "{}"`; np=`echo
    $bn|iconv -t koi8-r -f cp1251`; mv "{}" "$dn/$np"' \;
    
     
    ----* Быстрая передача файла через псевдо-HTTP   Автор: mahoro  [комментарии]
     
    Когда есть необходимость передать файл с одной машины на другую, 
    а под рукой нет общедоступных ресурсов, можно сделать так:
    
        nc -l -p 8080 < file
    или
        netcat -l 8080 < file
    
    на клиенте достаточно в браузере набрать http://192.168.0.123:8080
    
    Собственно, все. Впрочем, если получатель - блондинка, которая не знает команды
    File-Save, можно написать так:
    
       (echo -e "HTTP/1.1 200\nContent-Disposition: attachment; 
       filename=gena_na.png\nContent-Type: application/octet-
       stream\nConnection: close\n"; cat vim_mrxvt.png ) | nc -vv -l -p 8080
    
    Но это еще не все. Можно дать доступ к целой директории, написав простой HTTP сервер в одной строке:
    
       while true; do nc -vv -l -p 8080 -c '( read a b c; file=`echo $b | sed 's/[^a-z0-9.]//g'`; 
       if [ a$file = "a" ]; then ( ls | (while read f; do echo "<a href=$f>$f</a><br>"; done) ); 
       else cat $PWD/$file; fi )'; sleep 1; done
    
    Этот скрипт отдает все файлы, которые есть в текущем каталоге и не позволяет его сменить. 
    В случае, если запрашивается корневая директория, то управление передается 
    своеобразному mod_index - т.е. выводится список файлов-ссылок. В конце добавлена задержка в 1 сек 
    для того, чтобы была возможность убить его нажатием Ctrl-C.
    
    См. подробнее http://alexey.sveshnikov.ru/blog/2006/12/23/http-сервер-размером-в-222-байта/
    
     
    ----* Контроль целостности системы штатными средствами   Автор: Avatar  [комментарии]
     
    Что делать если под рукой нет tripwire или osec, а кривой aide вы пользоваться не хотите. 
    Часть функций , таких как проверка прав доступа и изменение файлов, можно
    реализовать штатными стедствами.
    
    Вот маленький скрипт который помещается в crontab и позволяет это реализовать. 
    При желании его функции можно легко расширить.
    
    
    #!/bin/bash
    
    ulimit -t 20
    checkdir="/bin /sbin"
    filedb="/var/tmp/permsecdb"
    email="[email protected]"
    
    out=$(
    exec 2>&1
    umask 266
    find $checkdir -type f -printf "%m\t" -exec md5sum {} \; >$filedb.tmp
    diff $filedb $filedb.tmp
    mv -f $filedb.tmp $filedb
    )
    if [ "$out" ];then 
        (date; echo; echo "$out") |mail -s "Change permsec `hostname`" $email
    fi
    
    - ulimit лучше выставить не случай не предвиденных ситуаций.
    - checkdir соответственно проверяемые директории
    - filedb текстовой файл базы
    - email куда посылать мыло
    
    Если изменений в системе не было, то сообщения посылаться не будут.
    Сообщение бывает 4 видов 
    
    1 - ошибки
    2 - добавлен файл "> 644	d41d8cd98f00b204e9800998ecf8427e  /bin/12"
    3 - удален файл "< 755	c1a0ff878c603dd91f603059e9c1a0a1  /bin/12"
    4 - изменен файл "
    < 755	ce367ef1e2cca19e6216874cb8c09d96  /bin/12
    ---
    > 755	c1a0ff878c603dd91f603059e9c1a0a1  /bin/12"
    
    Успешного контроля.
    
     
    ----* Как найти все файлы определенного размера   [обсудить]
     
    Найти все файлы размером более 10 Мб.
       find / -size +10240k
    
    Более 500 Кб, но менее 600 Кб
       find . -size +500k -a -size -600k
    
    Файлы менее 128 байт, модифицированные последние 10 мин.
       find . -type f -a -size -128c -a -mmin -10
    
     
    ----* Как переименовать имена файлов из одной кодировки в другую (доп. ссылка 1)   [комментарии]
     
    Если не переименовывать каталоги:
    
    Вариант 1:
       find | sort -r | while read f; do
         fn=$(basename "$f"|iconv -f koi8-r -t windows-1251);
         [ "$fn" = "$(basename "$f")" ] || mv "$f" "$(dirname "$f")/$fn";
       done 
    
    Вариант 2:
    
       #!/bin/sh
       # аргумент 1 - путь
       # аргумент 2 - из какой кодировки
       # аргумент 3 - в какую кодировку 
       find $1 -regex "$1/.*" | sort -r | while read f; do
          fb=$(basename "$f");
          fd=$(dirname "$f");
          nfb=$(echo "$fb"|iconv -f $2 -t $3);
          [ "$fb" = "$nfb" ] || (mv "$fd/$fb" "$fd/$nfb"; echo "$fd $fb -> $nfb";)
       done
    
    Вариант 3:
    
       Использовать готовую программу для переименования с изменением кодировки http://j3e.de/linux/convmv/
    
     
    ----* Скрипт для удаленного редактирования файлов   Автор: spanka  [комментарии]
     
    #!/bin/sh
    tmp_file=`mktemp /tmp/scp_vi.XXXXXXXXXX`
    cp /dev/null $tmp_file
    scp $1 $tmp_file
    vi $tmp_file
    scp $tmp_file $1
    rm -f $tmp_file
    
    запускать так: rvi login@host:/patch/to/file 
    В vim можно писать "vim scp://[email protected]:/home/user/file"
    
     
    ----* Полный бэкап на дополнительный диск при помощи rsync (доп. ссылка 1)   [комментарии]
     
    Резервный диск монтируем как /backup в read-only режиме.
    По крону еженощно запускаем скрипт следующего содержания:
       /sbin/mount -u -w /backup # пепреводим раздел в rw режим, mount "-o remount,rw /backup" для Linux
       /usr/bin/rsync -a --delete --delete-excluded --max-delete=200 \
          --exclude-from=/etc/ex_files_list.txt / /backup
       RETCODE=$?
       if [ $RETCODE -ne 0 ]; then
          echo "Err code=$RETCODE"| mail -s "RSYNC BACKUP ERROR" [email protected]
       fi
       /sbin/mount -u -r /backup # раздел обратно в ro, mount "-o remount,ro /backup" для Linux
    
    Если backup-диск большой, лучше вести две полные копии, на случай краха во
    время бэкапа (или см. опцию --backup);
    
    При бэкапе на другой сервер:
       rsync [...опции как выше] --compress --bwlimit=100 --timeout=120 \
          -e ssh source/ login@backuphost:/backup/node1
    
    Список файлов для исключения из бэкапа (ex_files_list.txt):
       /backup
       /mnt
       /proc
       /tmp
       /var/log
       /usr/obj
       /usr/src
       /usr/tmp
       /usr/ports
       /usr/local/apache/logs
    
     
    ----* Почему на разных машинах скрипт генерирует файлы с разными правами доступа   [обсудить]
     
    > На одной машине создается файл с правами -rw-rw-r--, а на другой -rw-r--r--.
    
    man 2 umask
    В первом случае используется umask 002, а во втором umask 022.
    
     
    ----* Есть ли простой способ в уме высчитать права доступа ? 764 как высчитывается ?   [комментарии]
     
    764 является комбинацией из цифр UserGroupOther.
    В 90% случаев нужно всего три цифры запомнить 7 - rwx, 6 - rw,   4 - r, (1 - x, 5 - rx и т.д. ). 
    Можно писать сразу: chmod u=rw file; chmod g=rx,o=rx file, chmod o-w file и т.д.
    
     
    ----* Как отсортировать строки файла по числовому значению во втором столбце с разделителем ":"   [обсудить]
     
    sort -t':' -n -k3 filename
    
     
    ----* Как вывести сколько раз встречаются 15 самых частовстречающихся IP в логе   [обсудить]
     
    Предположим, IP во втором столбце лога.
    cat log_file | awk '{print $2}'| sort| uniq -c| sort -r -n| head -n 15
    
     
    ----* Как определить сумму столбца цифр в файле.   [обсудить]
     
    Суммируем 3-й столбец из лог файла.
    cat logfile| awk '{s += $3} END {print s}'
    
     
    ----* Как разбить файл на части.   [комментарии]
     
    split -b 5m file  - разбить на файлы по 5 Мб, (5k - по 5 Кб, 5 - по 5 байт).
    split -l 1000 file  - разбить файл на файлы по 1000 строк.
    
     
    ----* Как автоматически удалять все файлы в каталоге, созданные позднее N дней   [комментарии]
     
    удаляем старше 1 часа:
            find /var/tmp_log/ -type f -mmin +60 -exec rm -f {} \;
    удаляем старше 10 дней:
            find /var/tmp_log/ -type f -mtime +10 -exec rm -f {} \;
    
     
    ----* Как удалить символ возврата каретки ^M из файла   [обсудить]
     
    col -bx < dosfile > newfile
    
     
    ----* Как посмотреть список расшаренных ресурсов на Windows машине   [обсудить]
     
    IP машины - 1.2.3.4
    smbclient -I 1.2.3.4 -L NAME_SERVER
    или: nmblookup -r -A 1.2.3.4
    или: smbclient -N -L hostname -I 1.2.3.4
    или скрипт: smbfind или findsmb
    
     
    ----* Как найти все SUID программы на машине   [обсудить]
     
    Все SUID и SGID программы:
    find / \( -perm -04000 -o -perm -02000 \) -exec ls -ald {} \;
    Только SUID ROOT:
    find /sbin \( -perm -04000 -a -user 0 \) -exec ls -ald {} \;
    
     
    ----* Как скопировать группу файлов на удаленную машину.   [комментарии]
     
    С локальной на удаленную:
    tar czvf - список_файлов_и_директорий | ssh remote.test.ru tar xzf - -C /home/user/куда_копировать 
    Скопировать группу файлов с удаленной машины на локальную.
    ssh remote.test.ru tar czf - -C стартовая_директория какие_файлы_копировать
    |tar xzf - -C директория_куда_копировать.
    
     
    ----* Скрипт для конвертации архива gz в lzma   Автор: john_erohin  [комментарии]
     
    Скрипт для преобразования архива .gz в .lzma с сохранением времени
    изменения/создания файла и прав доступа, а также с минимальным влиянием на производительность.
    Для переименования группы файлов можно использовать конструкцию вида:
    
       find . -name "*.gz" -print0 | xargs -0 -n 1 echo ~/bin/gz2lzma.sh | batch
    
    gz2lzma.sh:
    
    #!/bin/sh
    #
    # CopyLeft (L) john_erohin, 2022
    #
    # gz2lzma.sh: convert .gz to .lzma with same mtime, ctime and access rights
    # 
    # in: $1 = file name with or without ".gz" suffix
    # out: file "$1.lzma" and removed "$1.gz" if conversion is ok
    #
    # warining: if $1.lzma exist, it will be silently overwritten
    #
    # use someth like
    # find . -name "*.gz" -print0 | xargs -0 -n 1 echo ~/bin/gz2lzma.sh | batch
    # for mass background conversion
    # 
    F=$1
    F=`echo $F | sed -e s:\.gz\$::g`
    
    if [ -f $F.gz ] ; then
     /usr/bin/eatmydata -- \
      /usr/bin/nice -19 \
       /usr/bin/chrt --idle 0 \
        /usr/bin/ionice -c 3 \
          gzip -t $F.gz > /dev/null 2>&1
      RC=$?
      if [ $RC -ge 1 ]; then
        echo error $RC in $F.gz : integrity test failed
        exit $RC
      fi
      CTIME=`stat -c %w $F.gz`
      MTIME=`stat -c %y $F.gz`
      CHMOD=`stat -c %a $F.gz`
      TF=`mktemp`
      T=`basename $TF`
      rm $TF
      L=$F.$T.lzma
      touch $L
      chmod $CHMOD $L
      gzip -cdk $F.gz | \
        /usr/bin/eatmydata -- \
         /usr/bin/nice -19 \
          /usr/bin/chrt --idle 0 \
           /usr/bin/ionice -c 3 \
             /usr/bin/lzma -z9c > $L
      RC=$?
      if [ $RC -eq 0 ]; then 
        touch --date="$CTIME" $L
        touch -m --date="$MTIME" $L
        mv $L $F.lzma
        rm $F.gz 
      else
        echo lzma run-time error $RC processing $L
        exit $RC
      fi
    else
      echo error: no input file $F or $F.gz
      exit 1
    fi
    
     
    ----* Контроль прогресса выполнения pipe-операции при помощи PV (доп. ссылка 1) (доп. ссылка 2)   Автор: Mac3k  [комментарии]
     
    Для наглядного просмотра динамики выполнения пересылок через неименованный
    канал удобно использовать утилиту pv (Pipe Viewer,
    http://www.ivarch.com/programs/pv.shtml), которая позволяет примерно оценить
    время выполнения таких операций как "cat file| filter"
    
    Установка в Fedora/RHEL/CentOS:
    
       sudo yum install pv
    
    Установка в Debian/Ubuntu:
    
       sudo aptitude install pv
    
    Простейшее её использование, вычисляем хеш-сумму:
    
       pv kino.avi | md5sum
       158MB 0:00:03 [ 45MB/s]  [=========================================>] 100%
    
    Сжимаем файл:
    
       tar -czf - kino.avi | pv > kino.tgz
       37,7MB 0:00:15 [2,37MB/s] [  <=>        ]
    
    Показывает, только сколько времени осталось не понять. Поправим это.
    
       tar -cf - kino.avi | pv -s $(du -sb kino.avi | awk '{print $1}') | gzip > kino.tgz
       58MB 0:00:15 [10,5MB/s] [============================> ] 57% ETA 0:00:14
    
    Через опию -s передается полный размер копируемых данных, который вычисляется
    через команду "du -sb file | awk '{print $1}'"
    
    
    Сжимаем всю папку с файлами:
    
       tar -cf - .| pv -s $(du -sb . | awk '{print $1}') | gzip > mydir.tgz
    
    Распаковка (pv можно использовать вместо cat):
    
       pv mydir.tgz | tar xzf -
    
     
    ----* Замена одного слова на другое во всех файлах   [обсудить]
     
    perl -i.bak -p -e 's/Vasya/Petya/gi;' *
    
     

     Версия для печати





    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру